bardd commited on
Commit
7153d5c
·
verified ·
1 Parent(s): 1063a0b

Upload 39 files

Browse files
Files changed (39) hide show
  1. Dockerfile +24 -0
  2. README.md +19 -5
  3. server.py +453 -0
  4. static/404.html +1 -0
  5. static/404/index.html +1 -0
  6. static/_next/static/0mBJPWUKUunnYLUByCsLJ/_buildManifest.js +1 -0
  7. static/_next/static/0mBJPWUKUunnYLUByCsLJ/_ssgManifest.js +1 -0
  8. static/_next/static/chunks/117-107dc2e65c4ace24.js +0 -0
  9. static/_next/static/chunks/972-3f7c4aa698825992.js +1 -0
  10. static/_next/static/chunks/app/_not-found/page-4b00f8e0855b1655.js +1 -0
  11. static/_next/static/chunks/app/layout-a1410775e19d1e76.js +1 -0
  12. static/_next/static/chunks/app/page-6d2f349a055fbf64.js +1 -0
  13. static/_next/static/chunks/app/terms/page-c0b6f8da64e42b92.js +1 -0
  14. static/_next/static/chunks/fd9d1056-a1131c60010a8a5e.js +0 -0
  15. static/_next/static/chunks/framework-f66176bb897dc684.js +0 -0
  16. static/_next/static/chunks/main-app-c835e4ccc4173445.js +1 -0
  17. static/_next/static/chunks/main-cbde494fa0b17687.js +0 -0
  18. static/_next/static/chunks/pages/_app-72b849fbd24ac258.js +1 -0
  19. static/_next/static/chunks/pages/_error-7ba65e1336b92748.js +1 -0
  20. static/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -0
  21. static/_next/static/chunks/webpack-b4e161512712a12a.js +1 -0
  22. static/_next/static/css/29c131a9787649b2.css +3 -0
  23. static/_next/static/media/0da54fcd0470ea43-s.woff2 +0 -0
  24. static/_next/static/media/558ca1a6aa3cb55e-s.p.woff2 +0 -0
  25. static/_next/static/media/636a5ac981f94f8b-s.p.woff2 +0 -0
  26. static/_next/static/media/64d784ea54a4acde-s.woff2 +0 -0
  27. static/_next/static/media/680a7121f7a85e3f-s.woff2 +0 -0
  28. static/_next/static/media/6d831b18ae5b01dc-s.woff2 +0 -0
  29. static/_next/static/media/6fe53d21e6e7ebd8-s.woff2 +0 -0
  30. static/_next/static/media/8a1d8947e5852e30-s.p.woff2 +0 -0
  31. static/_next/static/media/8ebc6e9dde468c4a-s.woff2 +0 -0
  32. static/_next/static/media/9e7b0a821b9dfcb4-s.woff2 +0 -0
  33. static/_next/static/media/ac0e76ddaeeb7981-s.woff2 +0 -0
  34. static/_next/static/media/edc640959b0c7826-s.woff2 +0 -0
  35. static/_next/static/media/ff71da380fbe67dd-s.woff2 +0 -0
  36. static/index.html +1 -0
  37. static/index.txt +7 -0
  38. static/terms/index.html +1 -0
  39. static/terms/index.txt +6 -0
Dockerfile ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.12-slim
2
+
3
+ ENV PYTHONDONTWRITEBYTECODE=1
4
+ ENV PYTHONUNBUFFERED=1
5
+
6
+ WORKDIR /app
7
+
8
+ # Install system dependencies and gemini-cli
9
+ RUN apt-get update \
10
+ && apt-get install -y --no-install-recommends nodejs npm ca-certificates \
11
+ && npm install -g @google/gemini-cli \
12
+ && apt-get clean \
13
+ && rm -rf /var/lib/apt/lists/*
14
+
15
+ # Copy server and pre-built static files
16
+ COPY server.py /app/server.py
17
+ COPY static /app/static
18
+
19
+ EXPOSE 8080
20
+ ENV HOST=0.0.0.0
21
+ ENV PORT=8080
22
+ ENV GEMINI_CLI_BINARY=gemini
23
+
24
+ CMD ["python3", "server.py"]
README.md CHANGED
@@ -1,10 +1,24 @@
1
  ---
2
- title: Techreg
3
- emoji: 📊
4
- colorFrom: indigo
5
- colorTo: yellow
6
  sdk: docker
 
7
  pinned: false
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: RegTechDemo
3
+ emoji: "🛡️"
4
+ colorFrom: blue
5
+ colorTo: green
6
  sdk: docker
7
+ app_port: 8080
8
  pinned: false
9
  ---
10
 
11
+ # TechReg Compliance Intelligence (HitSafe.ai)
12
+
13
+ This space hosts the **HitSafe.ai** compliance screening engine, designed for UK fintech teams to screen marketing assets against FCA COBS 4 and Consumer Duty requirements.
14
+
15
+ ## 🚀 Deployment
16
+
17
+ This Space uses a **Docker** SDK on port **8080**.
18
+
19
+ ### Environment Variables
20
+ Set the following secret in your Space settings:
21
+ - `GEMINI_API_KEY`: Your Google Gemini API key.
22
+
23
+ ## 🛡️ Guidance
24
+ This tool provides guidance only and is not legal advice.
server.py ADDED
@@ -0,0 +1,453 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ from __future__ import annotations
3
+
4
+ import base64
5
+ import binascii
6
+ import json
7
+ import os
8
+ import re
9
+ import subprocess
10
+ import uuid
11
+ from concurrent.futures import ThreadPoolExecutor, as_completed
12
+ from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer
13
+ from pathlib import Path
14
+ from time import monotonic
15
+ from typing import Any
16
+
17
+ APP_DIR = Path(__file__).resolve().parent
18
+ STATIC_DIR = APP_DIR / "static"
19
+ UPLOADS_DIR = APP_DIR / "uploads"
20
+ HOST = os.environ.get("HOST", "127.0.0.1")
21
+ PORT = int(os.environ.get("PORT", "8080"))
22
+ GEMINI_TIMEOUT_SEC = int(os.environ.get("GEMINI_TIMEOUT_SEC", "90"))
23
+ GEMINI_CLI_BINARY = os.environ.get("GEMINI_CLI_BINARY", "gemini")
24
+ LOCKED_GEMINI_MODEL = "gemini-3-flash-preview"
25
+ MAX_IMAGE_BYTES = int(os.environ.get("MAX_IMAGE_BYTES", str(8 * 1024 * 1024)))
26
+ MAX_BATCH_IMAGES = int(os.environ.get("MAX_BATCH_IMAGES", "20"))
27
+ MAX_PARALLEL_WORKERS = max(1, int(os.environ.get("MAX_PARALLEL_WORKERS", "4")))
28
+
29
+ ALLOWED_IMAGE_MIME_TO_EXT = {
30
+ "image/png": "png",
31
+ "image/jpeg": "jpg",
32
+ "image/jpg": "jpg",
33
+ "image/webp": "webp",
34
+ "image/gif": "gif",
35
+ }
36
+ DATA_URL_RE = re.compile(r"^data:(?P<mime>[-\w.+/]+);base64,(?P<data>[A-Za-z0-9+/=\s]+)$")
37
+
38
+ DEFAULT_SYSTEM_PROMPT = (
39
+ "You are a UK fintech ad compliance screening assistant. "
40
+ "Return only valid JSON and nothing else."
41
+ )
42
+
43
+ JSON_SCHEMA_HINT = {
44
+ "risk_level": "low | medium | high",
45
+ "summary": "short sentence",
46
+ "violations": [
47
+ {
48
+ "issue": "what is risky",
49
+ "rule_refs": ["FCA handbook or principle area"],
50
+ "why": "why this is a risk",
51
+ "fix": "specific rewrite guidance",
52
+ }
53
+ ],
54
+ "safe_rewrite": "optional ad rewrite",
55
+ }
56
+
57
+
58
+ def build_prompt(ad_text: str, extra_context: str, system_prompt: str, image_at_path: str | None) -> str:
59
+ ad_text_clean = ad_text.strip()
60
+ parts = [
61
+ system_prompt.strip(),
62
+ "",
63
+ "Task: Screen this ad copy for UK fintech/FCA-style risk.",
64
+ "Output format: Return only JSON in this shape:",
65
+ json.dumps(JSON_SCHEMA_HINT, ensure_ascii=True, indent=2),
66
+ "",
67
+ ]
68
+ if image_at_path:
69
+ parts += [
70
+ "Creative image reference:",
71
+ f"@{image_at_path}",
72
+ "Use this image as part of your compliance risk review.",
73
+ "",
74
+ ]
75
+ parts += [
76
+ "Ad copy:",
77
+ ad_text_clean if ad_text_clean else "[Not provided]",
78
+ ]
79
+ if extra_context.strip():
80
+ parts += ["", "Extra context:", extra_context.strip()]
81
+ return "\n".join(parts)
82
+
83
+
84
+ def gemini_cmd_candidates(prompt: str) -> list[list[str]]:
85
+ # Model is intentionally locked and never exposed to users.
86
+ return [
87
+ [GEMINI_CLI_BINARY, "--model", LOCKED_GEMINI_MODEL, "-p", prompt],
88
+ [GEMINI_CLI_BINARY, "-m", LOCKED_GEMINI_MODEL, "-p", prompt],
89
+ [GEMINI_CLI_BINARY, "--model", LOCKED_GEMINI_MODEL, "--prompt", prompt],
90
+ [GEMINI_CLI_BINARY, "-m", LOCKED_GEMINI_MODEL, "--prompt", prompt],
91
+ ]
92
+
93
+
94
+ def is_flag_parse_error(stderr: str, stdout: str) -> bool:
95
+ combined = f"{stderr}\n{stdout}".lower()
96
+ return any(
97
+ token in combined
98
+ for token in (
99
+ "unknown option",
100
+ "unknown argument",
101
+ "invalid option",
102
+ "unrecognized option",
103
+ "unrecognized argument",
104
+ "unexpected argument",
105
+ "did you mean",
106
+ )
107
+ )
108
+
109
+
110
+ def run_gemini(prompt: str) -> str:
111
+ attempts = gemini_cmd_candidates(prompt)
112
+ last_error = "Gemini CLI invocation failed."
113
+ child_env = os.environ.copy()
114
+
115
+ # Keep only GEMINI_API_KEY to avoid CLI warnings when both vars are set.
116
+ if not child_env.get("GEMINI_API_KEY") and child_env.get("GOOGLE_API_KEY"):
117
+ child_env["GEMINI_API_KEY"] = child_env["GOOGLE_API_KEY"]
118
+ child_env.pop("GOOGLE_API_KEY", None)
119
+
120
+ for idx, cmd in enumerate(attempts):
121
+ proc = subprocess.run(
122
+ cmd,
123
+ capture_output=True,
124
+ text=True,
125
+ cwd=str(APP_DIR),
126
+ env=child_env,
127
+ timeout=GEMINI_TIMEOUT_SEC,
128
+ check=False,
129
+ )
130
+ if proc.returncode == 0:
131
+ return (proc.stdout or "").strip()
132
+
133
+ stderr = (proc.stderr or "").strip()
134
+ stdout = (proc.stdout or "").strip()
135
+ details = stderr if stderr else stdout
136
+ last_error = details or f"Gemini CLI exited with code {proc.returncode}."
137
+
138
+ # Only retry different flag shapes if this appears to be flag parsing trouble.
139
+ if idx < len(attempts) - 1 and is_flag_parse_error(stderr, stdout):
140
+ continue
141
+ break
142
+
143
+ raise RuntimeError(last_error)
144
+
145
+
146
+ def try_parse_json(text: str) -> Any | None:
147
+ trimmed = text.strip()
148
+ if not trimmed:
149
+ return None
150
+ # Handle markdown fences if the model returns them.
151
+ if trimmed.startswith("```"):
152
+ lines = trimmed.splitlines()
153
+ if len(lines) >= 3 and lines[-1].strip().startswith("```"):
154
+ trimmed = "\n".join(lines[1:-1]).strip()
155
+ if trimmed.lower().startswith("json"):
156
+ trimmed = trimmed[4:].strip()
157
+ try:
158
+ return json.loads(trimmed)
159
+ except json.JSONDecodeError:
160
+ return None
161
+
162
+
163
+ def safe_filename_stem(raw_name: str) -> str:
164
+ stem = Path(raw_name).stem if raw_name else "ad-image"
165
+ cleaned = re.sub(r"[^A-Za-z0-9_-]+", "-", stem).strip("-")
166
+ if not cleaned:
167
+ return "ad-image"
168
+ return cleaned[:40]
169
+
170
+
171
+ def save_image_from_data_url(image_data_url: str, image_filename: str) -> str:
172
+ match = DATA_URL_RE.match(image_data_url.strip())
173
+ if not match:
174
+ raise ValueError("Image must be a valid base64 data URL (data:image/...;base64,...).")
175
+
176
+ mime_type = match.group("mime").lower()
177
+ extension = ALLOWED_IMAGE_MIME_TO_EXT.get(mime_type)
178
+ if not extension:
179
+ allowed = ", ".join(sorted(ALLOWED_IMAGE_MIME_TO_EXT))
180
+ raise ValueError(f"Unsupported image type '{mime_type}'. Allowed: {allowed}.")
181
+
182
+ base64_payload = re.sub(r"\s+", "", match.group("data"))
183
+ try:
184
+ image_bytes = base64.b64decode(base64_payload, validate=True)
185
+ except (ValueError, binascii.Error):
186
+ raise ValueError("Image base64 payload is invalid.") from None
187
+
188
+ if not image_bytes:
189
+ raise ValueError("Image payload is empty.")
190
+
191
+ if len(image_bytes) > MAX_IMAGE_BYTES:
192
+ raise ValueError(f"Image is too large. Max size is {MAX_IMAGE_BYTES} bytes.")
193
+
194
+ UPLOADS_DIR.mkdir(parents=True, exist_ok=True)
195
+ final_name = f"{safe_filename_stem(image_filename)}-{uuid.uuid4().hex[:10]}.{extension}"
196
+ image_path = UPLOADS_DIR / final_name
197
+ image_path.write_bytes(image_bytes)
198
+ return f"uploads/{final_name}"
199
+
200
+
201
+ def normalize_image_inputs(payload: dict[str, Any]) -> list[dict[str, str]]:
202
+ images_field = payload.get("images")
203
+ single_data_url = str(payload.get("image_data_url", "")).strip()
204
+ single_filename = str(payload.get("image_filename", "")).strip()
205
+
206
+ normalized: list[dict[str, str]] = []
207
+ if isinstance(images_field, list) and images_field:
208
+ if len(images_field) > MAX_BATCH_IMAGES:
209
+ raise ValueError(f"Too many images. Max is {MAX_BATCH_IMAGES}.")
210
+ for idx, item in enumerate(images_field):
211
+ if not isinstance(item, dict):
212
+ raise ValueError(f"images[{idx}] must be an object.")
213
+ data_url = str(item.get("data_url", "")).strip()
214
+ filename = str(item.get("filename", "")).strip() or f"image-{idx + 1}.png"
215
+ if not data_url:
216
+ raise ValueError(f"images[{idx}].data_url is required.")
217
+ normalized.append({"data_url": data_url, "filename": filename})
218
+ elif single_data_url:
219
+ normalized.append(
220
+ {
221
+ "data_url": single_data_url,
222
+ "filename": single_filename or "image.png",
223
+ }
224
+ )
225
+ return normalized
226
+
227
+
228
+ def run_single_check(prompt: str) -> tuple[bool, int, dict[str, Any]]:
229
+ try:
230
+ raw_output = run_gemini(prompt)
231
+ return True, 200, {"parsed_output": try_parse_json(raw_output), "raw_output": raw_output}
232
+ except FileNotFoundError:
233
+ return (
234
+ False,
235
+ 500,
236
+ {"error": f"Gemini CLI not found. Install it and ensure '{GEMINI_CLI_BINARY}' is on PATH."},
237
+ )
238
+ except subprocess.TimeoutExpired:
239
+ return False, 504, {"error": f"Gemini CLI timed out after {GEMINI_TIMEOUT_SEC}s."}
240
+ except RuntimeError as err:
241
+ return False, 500, {"error": str(err)}
242
+
243
+
244
+ def run_single_image_check(
245
+ index: int,
246
+ total: int,
247
+ image_ref: str,
248
+ ad_text: str,
249
+ extra_context: str,
250
+ system_prompt: str,
251
+ ) -> dict[str, Any]:
252
+ print(f"[batch {index}/{total}] starting check for {image_ref}", flush=True)
253
+ started = monotonic()
254
+ prompt = build_prompt(
255
+ ad_text=ad_text,
256
+ extra_context=extra_context,
257
+ system_prompt=system_prompt,
258
+ image_at_path=image_ref,
259
+ )
260
+ ok, _status, result = run_single_check(prompt)
261
+ elapsed = monotonic() - started
262
+ status_text = "ok" if ok else "failed"
263
+ print(f"[batch {index}/{total}] {status_text} in {elapsed:.1f}s", flush=True)
264
+ return {
265
+ "index": index,
266
+ "ok": ok,
267
+ "image_reference": image_ref,
268
+ "parsed_output": result.get("parsed_output"),
269
+ "raw_output": result.get("raw_output"),
270
+ "error": result.get("error"),
271
+ }
272
+
273
+
274
+ class AppHandler(SimpleHTTPRequestHandler):
275
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
276
+ super().__init__(*args, directory=str(STATIC_DIR), **kwargs)
277
+
278
+ def _send_json(self, status: int, payload: dict[str, Any]) -> None:
279
+ data = json.dumps(payload, ensure_ascii=True).encode("utf-8")
280
+ self.send_response(status)
281
+ self.send_header("Content-Type", "application/json; charset=utf-8")
282
+ self.send_header("Content-Length", str(len(data)))
283
+ self.end_headers()
284
+ self.wfile.write(data)
285
+
286
+ def do_POST(self) -> None:
287
+ if self.path != "/api/check":
288
+ self._send_json(404, {"ok": False, "error": "Not found"})
289
+ return
290
+
291
+ content_length = int(self.headers.get("Content-Length", "0"))
292
+ if content_length <= 0:
293
+ self._send_json(400, {"ok": False, "error": "Request body is required."})
294
+ return
295
+
296
+ content_type = self.headers.get("Content-Type", "")
297
+ if "application/json" not in content_type.lower():
298
+ self._send_json(400, {"ok": False, "error": "Content-Type must be application/json."})
299
+ return
300
+
301
+ raw_body = self.rfile.read(content_length)
302
+ try:
303
+ body_str = raw_body.decode("utf-8")
304
+ except UnicodeDecodeError:
305
+ self._send_json(400, {"ok": False, "error": "Body contains invalid UTF-8 data."})
306
+ return
307
+
308
+ try:
309
+ payload = json.loads(body_str)
310
+ except json.JSONDecodeError:
311
+ self._send_json(400, {"ok": False, "error": "Body must be valid JSON."})
312
+ return
313
+
314
+ ad_text = str(payload.get("ad_text", "")).strip()
315
+ extra_context = str(payload.get("extra_context", "")).strip()
316
+ system_prompt = str(payload.get("system_prompt", DEFAULT_SYSTEM_PROMPT)).strip()
317
+
318
+ try:
319
+ image_inputs = normalize_image_inputs(payload)
320
+ except ValueError as err:
321
+ self._send_json(400, {"ok": False, "error": str(err)})
322
+ return
323
+
324
+ if not ad_text and not image_inputs:
325
+ self._send_json(400, {"ok": False, "error": "Provide 'ad_text' or an image."})
326
+ return
327
+
328
+ if not system_prompt:
329
+ system_prompt = DEFAULT_SYSTEM_PROMPT
330
+
331
+ if not image_inputs:
332
+ prompt = build_prompt(
333
+ ad_text=ad_text,
334
+ extra_context=extra_context,
335
+ system_prompt=system_prompt,
336
+ image_at_path=None,
337
+ )
338
+ ok, status, result = run_single_check(prompt)
339
+ if not ok:
340
+ self._send_json(status, {"ok": False, "error": result["error"]})
341
+ return
342
+ self._send_json(
343
+ 200,
344
+ {
345
+ "ok": True,
346
+ "mode": "single",
347
+ "parallel_workers": 1,
348
+ "all_success": True,
349
+ "total": 1,
350
+ "success_count": 1,
351
+ "failure_count": 0,
352
+ "results": [
353
+ {
354
+ "index": 1,
355
+ "ok": True,
356
+ "image_reference": None,
357
+ "parsed_output": result["parsed_output"],
358
+ "raw_output": result["raw_output"],
359
+ "error": None,
360
+ }
361
+ ],
362
+ "parsed_output": result["parsed_output"],
363
+ "raw_output": result["raw_output"],
364
+ "image_reference": None,
365
+ },
366
+ )
367
+ return
368
+
369
+ image_refs: list[str] = []
370
+ for image in image_inputs:
371
+ try:
372
+ image_ref = save_image_from_data_url(
373
+ image_data_url=image["data_url"], image_filename=image["filename"]
374
+ )
375
+ except ValueError as err:
376
+ self._send_json(400, {"ok": False, "error": str(err)})
377
+ return
378
+ image_refs.append(image_ref)
379
+
380
+ total = len(image_refs)
381
+ worker_count = max(1, min(MAX_PARALLEL_WORKERS, total))
382
+ print(
383
+ f"Starting bulk Gemini checks: total_images={total}, parallel_workers={worker_count}",
384
+ flush=True,
385
+ )
386
+
387
+ results: list[dict[str, Any] | None] = [None] * total
388
+ completed = 0
389
+ with ThreadPoolExecutor(max_workers=worker_count) as executor:
390
+ future_to_slot = {
391
+ executor.submit(
392
+ run_single_image_check,
393
+ idx,
394
+ total,
395
+ image_ref,
396
+ ad_text,
397
+ extra_context,
398
+ system_prompt,
399
+ ): (idx - 1, image_ref)
400
+ for idx, image_ref in enumerate(image_refs, start=1)
401
+ }
402
+ for future in as_completed(future_to_slot):
403
+ slot, image_ref = future_to_slot[future]
404
+ try:
405
+ results[slot] = future.result()
406
+ except Exception as err:
407
+ # Defensive fallback: this should be rare because worker handles model errors.
408
+ results[slot] = {
409
+ "index": slot + 1,
410
+ "ok": False,
411
+ "image_reference": image_ref,
412
+ "parsed_output": None,
413
+ "raw_output": None,
414
+ "error": f"Unexpected worker error: {err}",
415
+ }
416
+ completed += 1
417
+ print(f"Bulk progress: {completed}/{total} completed", flush=True)
418
+
419
+ finalized_results = [item for item in results if item is not None]
420
+ finalized_results.sort(key=lambda item: int(item["index"]))
421
+
422
+ success_count = sum(1 for item in finalized_results if item["ok"])
423
+ failure_count = len(finalized_results) - success_count
424
+ first = finalized_results[0]
425
+ self._send_json(
426
+ 200,
427
+ {
428
+ "ok": True,
429
+ "mode": "bulk" if len(finalized_results) > 1 else "single",
430
+ "parallel_workers": worker_count,
431
+ "all_success": failure_count == 0,
432
+ "total": len(finalized_results),
433
+ "success_count": success_count,
434
+ "failure_count": failure_count,
435
+ "results": finalized_results,
436
+ # Keep compatibility with single-result UI consumers.
437
+ "parsed_output": first.get("parsed_output"),
438
+ "raw_output": first.get("raw_output"),
439
+ "image_reference": first.get("image_reference"),
440
+ },
441
+ )
442
+
443
+
444
+ def main() -> None:
445
+ STATIC_DIR.mkdir(parents=True, exist_ok=True)
446
+ UPLOADS_DIR.mkdir(parents=True, exist_ok=True)
447
+ server = ThreadingHTTPServer((HOST, PORT), AppHandler)
448
+ print(f"Server running at http://{HOST}:{PORT}")
449
+ server.serve_forever()
450
+
451
+
452
+ if __name__ == "__main__":
453
+ main()
static/404.html ADDED
@@ -0,0 +1 @@
 
 
1
+ <!DOCTYPE html><html lang="en" class="__variable_fada24 __variable_7da9e8 __variable_6d24ac" style="--display:var(--font-syne);--body:var(--font-body);--mono:var(--font-mono)"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/558ca1a6aa3cb55e-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/636a5ac981f94f8b-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/8a1d8947e5852e30-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/29c131a9787649b2.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-b4e161512712a12a.js"/><script src="/_next/static/chunks/fd9d1056-a1131c60010a8a5e.js" async=""></script><script src="/_next/static/chunks/117-107dc2e65c4ace24.js" async=""></script><script src="/_next/static/chunks/main-app-c835e4ccc4173445.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>HitSafe.ai — FCA Compliance Intelligence</title><meta name="description" content="Screens ad copy, customer emails, onboarding documents, and campaign creatives against COBS 4 and Consumer Duty — flagging violations in seconds."/><meta name="next-size-adjust"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/_next/static/chunks/webpack-b4e161512712a12a.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/media/558ca1a6aa3cb55e-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n2:HL[\"/_next/static/media/636a5ac981f94f8b-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n3:HL[\"/_next/static/media/8a1d8947e5852e30-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n4:HL[\"/_next/static/css/29c131a9787649b2.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"5:I[2846,[],\"\"]\n7:I[4707,[],\"\"]\n8:I[6423,[],\"\"]\ne:I[1060,[],\"\"]\n9:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\na:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\nb:{\"display\":\"inline-block\"}\nc:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nf:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L5\",null,{\"buildId\":\"0mBJPWUKUunnYLUByCsLJ\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\",\"\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L6\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L7\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L8\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/29c131a9787649b2.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"__variable_fada24 __variable_7da9e8 __variable_6d24ac\",\"style\":{\"--display\":\"var(--font-syne)\",\"--body\":\"var(--font-body)\",\"--mono\":\"var(--font-mono)\"},\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L7\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L8\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$9\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$a\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$b\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$c\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$Ld\"],\"globalErrorComponent\":\"$e\",\"missingSlots\":\"$Wf\"}]\n"])</script><script>self.__next_f.push([1,"d:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"HitSafe.ai — FCA Compliance Intelligence\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Screens ad copy, customer emails, onboarding documents, and campaign creatives against COBS 4 and Consumer Duty — flagging violations in seconds.\"}],[\"$\",\"meta\",\"4\",{\"name\":\"next-size-adjust\"}]]\n6:null\n"])</script></body></html>
static/404/index.html ADDED
@@ -0,0 +1 @@
 
 
1
+ <!DOCTYPE html><html lang="en" class="__variable_fada24 __variable_7da9e8 __variable_6d24ac" style="--display:var(--font-syne);--body:var(--font-body);--mono:var(--font-mono)"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/558ca1a6aa3cb55e-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/636a5ac981f94f8b-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/8a1d8947e5852e30-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/29c131a9787649b2.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-b4e161512712a12a.js"/><script src="/_next/static/chunks/fd9d1056-a1131c60010a8a5e.js" async=""></script><script src="/_next/static/chunks/117-107dc2e65c4ace24.js" async=""></script><script src="/_next/static/chunks/main-app-c835e4ccc4173445.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>HitSafe.ai — FCA Compliance Intelligence</title><meta name="description" content="Screens ad copy, customer emails, onboarding documents, and campaign creatives against COBS 4 and Consumer Duty — flagging violations in seconds."/><meta name="next-size-adjust"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/_next/static/chunks/webpack-b4e161512712a12a.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/media/558ca1a6aa3cb55e-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n2:HL[\"/_next/static/media/636a5ac981f94f8b-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n3:HL[\"/_next/static/media/8a1d8947e5852e30-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n4:HL[\"/_next/static/css/29c131a9787649b2.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"5:I[2846,[],\"\"]\n7:I[4707,[],\"\"]\n8:I[6423,[],\"\"]\ne:I[1060,[],\"\"]\n9:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\na:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\nb:{\"display\":\"inline-block\"}\nc:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nf:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L5\",null,{\"buildId\":\"0mBJPWUKUunnYLUByCsLJ\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\",\"\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L6\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L7\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L8\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/29c131a9787649b2.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"__variable_fada24 __variable_7da9e8 __variable_6d24ac\",\"style\":{\"--display\":\"var(--font-syne)\",\"--body\":\"var(--font-body)\",\"--mono\":\"var(--font-mono)\"},\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L7\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L8\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$9\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$a\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$b\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$c\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$Ld\"],\"globalErrorComponent\":\"$e\",\"missingSlots\":\"$Wf\"}]\n"])</script><script>self.__next_f.push([1,"d:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"HitSafe.ai — FCA Compliance Intelligence\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Screens ad copy, customer emails, onboarding documents, and campaign creatives against COBS 4 and Consumer Duty — flagging violations in seconds.\"}],[\"$\",\"meta\",\"4\",{\"name\":\"next-size-adjust\"}]]\n6:null\n"])</script></body></html>
static/_next/static/0mBJPWUKUunnYLUByCsLJ/_buildManifest.js ADDED
@@ -0,0 +1 @@
 
 
1
+ self.__BUILD_MANIFEST=function(e){return{__rewrites:{afterFiles:[{has:e,source:"/api/:path*",destination:e}],beforeFiles:[],fallback:[]},"/_error":["static/chunks/pages/_error-7ba65e1336b92748.js"],sortedPages:["/_app","/_error"]}}(void 0),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
static/_next/static/0mBJPWUKUunnYLUByCsLJ/_ssgManifest.js ADDED
@@ -0,0 +1 @@
 
 
1
+ self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
static/_next/static/chunks/117-107dc2e65c4ace24.js ADDED
The diff for this file is too large to render. See raw diff
 
static/_next/static/chunks/972-3f7c4aa698825992.js ADDED
@@ -0,0 +1 @@
 
 
1
+ "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[972],{5449:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"addLocale",{enumerable:!0,get:function(){return r}}),n(8521);let r=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return e};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},6958:function(e,t,n){function r(e,t,n,r){return!1}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"getDomainLocale",{enumerable:!0,get:function(){return r}}),n(8521),("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},2972:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return y}});let r=n(7043),o=n(7437),a=r._(n(2265)),i=n(5246),u=n(3552),s=n(7497),l=n(3987),c=n(5449),f=n(5523),d=n(1956),p=n(6081),h=n(6958),_=n(1634),g=n(4673),m=new Set;function E(e,t,n,r,o,a){if("undefined"!=typeof window&&(a||(0,u.isLocalURL)(t))){if(!r.bypassPrefetchedCheck){let o=t+"%"+n+"%"+(void 0!==r.locale?r.locale:"locale"in e?e.locale:void 0);if(m.has(o))return;m.add(o)}(async()=>a?e.prefetch(t,o):e.prefetch(t,n,r))().catch(e=>{})}}function R(e){return"string"==typeof e?e:(0,s.formatUrl)(e)}let y=a.default.forwardRef(function(e,t){let n,r;let{href:s,as:m,children:y,prefetch:P=null,passHref:S,replace:b,shallow:O,scroll:A,locale:v,onClick:T,onMouseEnter:N,onTouchStart:I,legacyBehavior:C=!1,...x}=e;n=y,C&&("string"==typeof n||"number"==typeof n)&&(n=(0,o.jsx)("a",{children:n}));let j=a.default.useContext(f.RouterContext),M=a.default.useContext(d.AppRouterContext),w=null!=j?j:M,L=!j,D=!1!==P,U=null===P?g.PrefetchKind.AUTO:g.PrefetchKind.FULL,{href:k,as:F}=a.default.useMemo(()=>{if(!j){let e=R(s);return{href:e,as:m?R(m):e}}let[e,t]=(0,i.resolveHref)(j,s,!0);return{href:e,as:m?(0,i.resolveHref)(j,m):t||e}},[j,s,m]),X=a.default.useRef(k),W=a.default.useRef(F);C&&(r=a.default.Children.only(n));let G=C?r&&"object"==typeof r&&r.ref:t,[H,Y,B]=(0,p.useIntersection)({rootMargin:"200px"}),K=a.default.useCallback(e=>{(W.current!==F||X.current!==k)&&(B(),W.current=F,X.current=k),H(e),G&&("function"==typeof G?G(e):"object"==typeof G&&(G.current=e))},[F,G,k,B,H]);a.default.useEffect(()=>{w&&Y&&D&&E(w,k,F,{locale:v},{kind:U},L)},[F,k,Y,v,D,null==j?void 0:j.locale,w,L,U]);let V={ref:K,onClick(e){C||"function"!=typeof T||T(e),C&&r.props&&"function"==typeof r.props.onClick&&r.props.onClick(e),w&&!e.defaultPrevented&&function(e,t,n,r,o,i,s,l,c){let{nodeName:f}=e.currentTarget;if("A"===f.toUpperCase()&&(function(e){let t=e.currentTarget.getAttribute("target");return t&&"_self"!==t||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||e.nativeEvent&&2===e.nativeEvent.which}(e)||!c&&!(0,u.isLocalURL)(n)))return;e.preventDefault();let d=()=>{let e=null==s||s;"beforePopState"in t?t[o?"replace":"push"](n,r,{shallow:i,locale:l,scroll:e}):t[o?"replace":"push"](r||n,{scroll:e})};c?a.default.startTransition(d):d()}(e,w,k,F,b,O,A,v,L)},onMouseEnter(e){C||"function"!=typeof N||N(e),C&&r.props&&"function"==typeof r.props.onMouseEnter&&r.props.onMouseEnter(e),w&&(D||!L)&&E(w,k,F,{locale:v,priority:!0,bypassPrefetchedCheck:!0},{kind:U},L)},onTouchStart:function(e){C||"function"!=typeof I||I(e),C&&r.props&&"function"==typeof r.props.onTouchStart&&r.props.onTouchStart(e),w&&(D||!L)&&E(w,k,F,{locale:v,priority:!0,bypassPrefetchedCheck:!0},{kind:U},L)}};if((0,l.isAbsoluteUrl)(F))V.href=F;else if(!C||S||"a"===r.type&&!("href"in r.props)){let e=void 0!==v?v:null==j?void 0:j.locale,t=(null==j?void 0:j.isLocaleDomain)&&(0,h.getDomainLocale)(F,e,null==j?void 0:j.locales,null==j?void 0:j.domainLocales);V.href=t||(0,_.addBasePath)((0,c.addLocale)(F,e,null==j?void 0:j.defaultLocale))}return C?a.default.cloneElement(r,V):(0,o.jsx)("a",{...x,...V,children:n})});("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},3515:function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{cancelIdleCallback:function(){return r},requestIdleCallback:function(){return n}});let n="undefined"!=typeof self&&self.requestIdleCallback&&self.requestIdleCallback.bind(window)||function(e){let t=Date.now();return self.setTimeout(function(){e({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-t))}})},1)},r="undefined"!=typeof self&&self.cancelIdleCallback&&self.cancelIdleCallback.bind(window)||function(e){return clearTimeout(e)};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},5246:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"resolveHref",{enumerable:!0,get:function(){return f}});let r=n(8637),o=n(7497),a=n(7053),i=n(3987),u=n(8521),s=n(3552),l=n(6279),c=n(7205);function f(e,t,n){let f;let d="string"==typeof t?t:(0,o.formatWithValidation)(t),p=d.match(/^[a-zA-Z]{1,}:\/\//),h=p?d.slice(p[0].length):d;if((h.split("?",1)[0]||"").match(/(\/\/|\\)/)){console.error("Invalid href '"+d+"' passed to next/router in page: '"+e.pathname+"'. Repeated forward-slashes (//) or backslashes \\ are not valid in the href.");let t=(0,i.normalizeRepeatedSlashes)(h);d=(p?p[0]:"")+t}if(!(0,s.isLocalURL)(d))return n?[d]:d;try{f=new URL(d.startsWith("#")?e.asPath:e.pathname,"http://n")}catch(e){f=new URL("/","http://n")}try{let e=new URL(d,f);e.pathname=(0,u.normalizePathTrailingSlash)(e.pathname);let t="";if((0,l.isDynamicRoute)(e.pathname)&&e.searchParams&&n){let n=(0,r.searchParamsToUrlQuery)(e.searchParams),{result:i,params:u}=(0,c.interpolateAs)(e.pathname,e.pathname,n);i&&(t=(0,o.formatWithValidation)({pathname:i,hash:e.hash,query:(0,a.omit)(n,u)}))}let i=e.origin===f.origin?e.href.slice(e.origin.length):e.href;return n?[i,t||i]:i}catch(e){return n?[d]:d}}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},6081:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"useIntersection",{enumerable:!0,get:function(){return s}});let r=n(2265),o=n(3515),a="function"==typeof IntersectionObserver,i=new Map,u=[];function s(e){let{rootRef:t,rootMargin:n,disabled:s}=e,l=s||!a,[c,f]=(0,r.useState)(!1),d=(0,r.useRef)(null),p=(0,r.useCallback)(e=>{d.current=e},[]);return(0,r.useEffect)(()=>{if(a){if(l||c)return;let e=d.current;if(e&&e.tagName)return function(e,t,n){let{id:r,observer:o,elements:a}=function(e){let t;let n={root:e.root||null,margin:e.rootMargin||""},r=u.find(e=>e.root===n.root&&e.margin===n.margin);if(r&&(t=i.get(r)))return t;let o=new Map;return t={id:n,observer:new IntersectionObserver(e=>{e.forEach(e=>{let t=o.get(e.target),n=e.isIntersecting||e.intersectionRatio>0;t&&n&&t(n)})},e),elements:o},u.push(n),i.set(n,t),t}(n);return a.set(e,t),o.observe(e),function(){if(a.delete(e),o.unobserve(e),0===a.size){o.disconnect(),i.delete(r);let e=u.findIndex(e=>e.root===r.root&&e.margin===r.margin);e>-1&&u.splice(e,1)}}}(e,e=>e&&f(e),{root:null==t?void 0:t.current,rootMargin:n})}else if(!c){let e=(0,o.requestIdleCallback)(()=>f(!0));return()=>(0,o.cancelIdleCallback)(e)}},[l,n,t,c,d.current]),[p,c,(0,r.useCallback)(()=>{f(!1)},[])]}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},9259:function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{ACTION_SUFFIX:function(){return s},APP_DIR_ALIAS:function(){return T},CACHE_ONE_YEAR:function(){return y},DOT_NEXT_ALIAS:function(){return A},ESLINT_DEFAULT_DIRS:function(){return B},GSP_NO_RETURNED_VALUE:function(){return F},GSSP_COMPONENT_MEMBER_ERROR:function(){return G},GSSP_NO_RETURNED_VALUE:function(){return X},INSTRUMENTATION_HOOK_FILENAME:function(){return b},MIDDLEWARE_FILENAME:function(){return P},MIDDLEWARE_LOCATION_REGEXP:function(){return S},NEXT_BODY_SUFFIX:function(){return f},NEXT_CACHE_IMPLICIT_TAG_ID:function(){return R},NEXT_CACHE_REVALIDATED_TAGS_HEADER:function(){return h},NEXT_CACHE_REVALIDATE_TAG_TOKEN_HEADER:function(){return _},NEXT_CACHE_SOFT_TAGS_HEADER:function(){return p},NEXT_CACHE_SOFT_TAG_MAX_LENGTH:function(){return E},NEXT_CACHE_TAGS_HEADER:function(){return d},NEXT_CACHE_TAG_MAX_ITEMS:function(){return g},NEXT_CACHE_TAG_MAX_LENGTH:function(){return m},NEXT_DATA_SUFFIX:function(){return l},NEXT_INTERCEPTION_MARKER_PREFIX:function(){return r},NEXT_META_SUFFIX:function(){return c},NEXT_QUERY_PARAM_PREFIX:function(){return n},NON_STANDARD_NODE_ENV:function(){return H},PAGES_DIR_ALIAS:function(){return O},PRERENDER_REVALIDATE_HEADER:function(){return o},PRERENDER_REVALIDATE_ONLY_GENERATED_HEADER:function(){return a},PUBLIC_DIR_MIDDLEWARE_CONFLICT:function(){return M},ROOT_DIR_ALIAS:function(){return v},RSC_ACTION_CLIENT_WRAPPER_ALIAS:function(){return j},RSC_ACTION_ENCRYPTION_ALIAS:function(){return x},RSC_ACTION_PROXY_ALIAS:function(){return C},RSC_ACTION_VALIDATE_ALIAS:function(){return I},RSC_MOD_REF_PROXY_ALIAS:function(){return N},RSC_PREFETCH_SUFFIX:function(){return i},RSC_SUFFIX:function(){return u},SERVER_PROPS_EXPORT_ERROR:function(){return k},SERVER_PROPS_GET_INIT_PROPS_CONFLICT:function(){return L},SERVER_PROPS_SSG_CONFLICT:function(){return D},SERVER_RUNTIME:function(){return K},SSG_FALLBACK_EXPORT_ERROR:function(){return Y},SSG_GET_INITIAL_PROPS_CONFLICT:function(){return w},STATIC_STATUS_PAGE_GET_INITIAL_PROPS_ERROR:function(){return U},UNSTABLE_REVALIDATE_RENAME_ERROR:function(){return W},WEBPACK_LAYERS:function(){return z},WEBPACK_RESOURCE_QUERIES:function(){return q}});let n="nxtP",r="nxtI",o="x-prerender-revalidate",a="x-prerender-revalidate-if-generated",i=".prefetch.rsc",u=".rsc",s=".action",l=".json",c=".meta",f=".body",d="x-next-cache-tags",p="x-next-cache-soft-tags",h="x-next-revalidated-tags",_="x-next-revalidate-tag-token",g=128,m=256,E=1024,R="_N_T_",y=31536e3,P="middleware",S=`(?:src/)?${P}`,b="instrumentation",O="private-next-pages",A="private-dot-next",v="private-next-root-dir",T="private-next-app-dir",N="private-next-rsc-mod-ref-proxy",I="private-next-rsc-action-validate",C="private-next-rsc-server-reference",x="private-next-rsc-action-encryption",j="private-next-rsc-action-client-wrapper",M="You can not have a '_next' folder inside of your public folder. This conflicts with the internal '/_next' route. https://nextjs.org/docs/messages/public-next-folder-conflict",w="You can not use getInitialProps with getStaticProps. To use SSG, please remove your getInitialProps",L="You can not use getInitialProps with getServerSideProps. Please remove getInitialProps.",D="You can not use getStaticProps or getStaticPaths with getServerSideProps. To use SSG, please remove getServerSideProps",U="can not have getInitialProps/getServerSideProps, https://nextjs.org/docs/messages/404-get-initial-props",k="pages with `getServerSideProps` can not be exported. See more info here: https://nextjs.org/docs/messages/gssp-export",F="Your `getStaticProps` function did not return an object. Did you forget to add a `return`?",X="Your `getServerSideProps` function did not return an object. Did you forget to add a `return`?",W="The `unstable_revalidate` property is available for general use.\nPlease use `revalidate` instead.",G="can not be attached to a page's component and must be exported from the page. See more info here: https://nextjs.org/docs/messages/gssp-component-member",H='You are using a non-standard "NODE_ENV" value in your environment. This creates inconsistencies in the project and is strongly advised against. Read more: https://nextjs.org/docs/messages/non-standard-node-env',Y="Pages with `fallback` enabled in `getStaticPaths` can not be exported. See more info here: https://nextjs.org/docs/messages/ssg-fallback-true-export",B=["app","pages","components","lib","src"],K={edge:"edge",experimentalEdge:"experimental-edge",nodejs:"nodejs"},V={shared:"shared",reactServerComponents:"rsc",serverSideRendering:"ssr",actionBrowser:"action-browser",api:"api",middleware:"middleware",instrument:"instrument",edgeAsset:"edge-asset",appPagesBrowser:"app-pages-browser",appMetadataRoute:"app-metadata-route",appRouteHandler:"app-route-handler"},z={...V,GROUP:{serverOnly:[V.reactServerComponents,V.actionBrowser,V.appMetadataRoute,V.appRouteHandler,V.instrument],clientOnly:[V.serverSideRendering,V.appPagesBrowser],nonClientServerTarget:[V.middleware,V.api],app:[V.reactServerComponents,V.actionBrowser,V.appMetadataRoute,V.appRouteHandler,V.serverSideRendering,V.appPagesBrowser,V.shared,V.instrument]}},q={edgeSSREntry:"__next_edge_ssr_entry__",metadata:"__next_metadata__",metadataRoute:"__next_metadata_route__",metadataImageMeta:"__next_metadata_image_meta__"}},42:function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"escapeStringRegexp",{enumerable:!0,get:function(){return o}});let n=/[|\\{}()[\]^$+*?.-]/,r=/[|\\{}()[\]^$+*?.-]/g;function o(e){return n.test(e)?e.replace(r,"\\$&"):e}},5523:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"RouterContext",{enumerable:!0,get:function(){return r}});let r=n(7043)._(n(2265)).default.createContext(null)},7497:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{formatUrl:function(){return a},formatWithValidation:function(){return u},urlObjectKeys:function(){return i}});let r=n(3099)._(n(8637)),o=/https?|ftp|gopher|file/;function a(e){let{auth:t,hostname:n}=e,a=e.protocol||"",i=e.pathname||"",u=e.hash||"",s=e.query||"",l=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?l=t+e.host:n&&(l=t+(~n.indexOf(":")?"["+n+"]":n),e.port&&(l+=":"+e.port)),s&&"object"==typeof s&&(s=String(r.urlQueryToSearchParams(s)));let c=e.search||s&&"?"+s||"";return a&&!a.endsWith(":")&&(a+=":"),e.slashes||(!a||o.test(a))&&!1!==l?(l="//"+(l||""),i&&"/"!==i[0]&&(i="/"+i)):l||(l=""),u&&"#"!==u[0]&&(u="#"+u),c&&"?"!==c[0]&&(c="?"+c),""+a+l+(i=i.replace(/[?#]/g,encodeURIComponent))+(c=c.replace("#","%23"))+u}let i=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function u(e){return a(e)}},6279:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{getSortedRoutes:function(){return r.getSortedRoutes},isDynamicRoute:function(){return o.isDynamicRoute}});let r=n(4777),o=n(8104)},7205:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"interpolateAs",{enumerable:!0,get:function(){return a}});let r=n(4199),o=n(9964);function a(e,t,n){let a="",i=(0,o.getRouteRegex)(e),u=i.groups,s=(t!==e?(0,r.getRouteMatcher)(i)(t):"")||n;a=e;let l=Object.keys(u);return l.every(e=>{let t=s[e]||"",{repeat:n,optional:r}=u[e],o="["+(n?"...":"")+e+"]";return r&&(o=(t?"":"/")+"["+o+"]"),n&&!Array.isArray(t)&&(t=[t]),(r||e in s)&&(a=a.replace(o,n?t.map(e=>encodeURIComponent(e)).join("/"):encodeURIComponent(t))||"/")})||(a=""),{params:l,result:a}}},8104:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"isDynamicRoute",{enumerable:!0,get:function(){return a}});let r=n(1182),o=/\/\[[^/]+?\](?=\/|$)/;function a(e){return(0,r.isInterceptionRouteAppPath)(e)&&(e=(0,r.extractInterceptionRouteInformation)(e).interceptedRoute),o.test(e)}},3552:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"isLocalURL",{enumerable:!0,get:function(){return a}});let r=n(3987),o=n(1283);function a(e){if(!(0,r.isAbsoluteUrl)(e))return!0;try{let t=(0,r.getLocationOrigin)(),n=new URL(e,t);return n.origin===t&&(0,o.hasBasePath)(n.pathname)}catch(e){return!1}}},7053:function(e,t){function n(e,t){let n={};return Object.keys(e).forEach(r=>{t.includes(r)||(n[r]=e[r])}),n}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"omit",{enumerable:!0,get:function(){return n}})},8637:function(e,t){function n(e){let t={};return e.forEach((e,n)=>{void 0===t[n]?t[n]=e:Array.isArray(t[n])?t[n].push(e):t[n]=[t[n],e]}),t}function r(e){return"string"!=typeof e&&("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function o(e){let t=new URLSearchParams;return Object.entries(e).forEach(e=>{let[n,o]=e;Array.isArray(o)?o.forEach(e=>t.append(n,r(e))):t.set(n,r(o))}),t}function a(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return n.forEach(t=>{Array.from(t.keys()).forEach(t=>e.delete(t)),t.forEach((t,n)=>e.append(n,t))}),e}Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{assign:function(){return a},searchParamsToUrlQuery:function(){return n},urlQueryToSearchParams:function(){return o}})},4199:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"getRouteMatcher",{enumerable:!0,get:function(){return o}});let r=n(3987);function o(e){let{re:t,groups:n}=e;return e=>{let o=t.exec(e);if(!o)return!1;let a=e=>{try{return decodeURIComponent(e)}catch(e){throw new r.DecodeError("failed to decode param")}},i={};return Object.keys(n).forEach(e=>{let t=n[e],r=o[t.pos];void 0!==r&&(i[e]=~r.indexOf("/")?r.split("/").map(e=>a(e)):t.repeat?[a(r)]:a(r))}),i}}},9964:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{getNamedMiddlewareRegex:function(){return p},getNamedRouteRegex:function(){return d},getRouteRegex:function(){return l},parseParameter:function(){return u}});let r=n(9259),o=n(1182),a=n(42),i=n(6674);function u(e){let t=e.startsWith("[")&&e.endsWith("]");t&&(e=e.slice(1,-1));let n=e.startsWith("...");return n&&(e=e.slice(3)),{key:e,repeat:n,optional:t}}function s(e){let t=(0,i.removeTrailingSlash)(e).slice(1).split("/"),n={},r=1;return{parameterizedRoute:t.map(e=>{let t=o.INTERCEPTION_ROUTE_MARKERS.find(t=>e.startsWith(t)),i=e.match(/\[((?:\[.*\])|.+)\]/);if(t&&i){let{key:e,optional:o,repeat:s}=u(i[1]);return n[e]={pos:r++,repeat:s,optional:o},"/"+(0,a.escapeStringRegexp)(t)+"([^/]+?)"}if(!i)return"/"+(0,a.escapeStringRegexp)(e);{let{key:e,repeat:t,optional:o}=u(i[1]);return n[e]={pos:r++,repeat:t,optional:o},t?o?"(?:/(.+?))?":"/(.+?)":"/([^/]+?)"}}).join(""),groups:n}}function l(e){let{parameterizedRoute:t,groups:n}=s(e);return{re:RegExp("^"+t+"(?:/)?$"),groups:n}}function c(e){let{interceptionMarker:t,getSafeRouteKey:n,segment:r,routeKeys:o,keyPrefix:i}=e,{key:s,optional:l,repeat:c}=u(r),f=s.replace(/\W/g,"");i&&(f=""+i+f);let d=!1;(0===f.length||f.length>30)&&(d=!0),isNaN(parseInt(f.slice(0,1)))||(d=!0),d&&(f=n()),i?o[f]=""+i+s:o[f]=s;let p=t?(0,a.escapeStringRegexp)(t):"";return c?l?"(?:/"+p+"(?<"+f+">.+?))?":"/"+p+"(?<"+f+">.+?)":"/"+p+"(?<"+f+">[^/]+?)"}function f(e,t){let n;let u=(0,i.removeTrailingSlash)(e).slice(1).split("/"),s=(n=0,()=>{let e="",t=++n;for(;t>0;)e+=String.fromCharCode(97+(t-1)%26),t=Math.floor((t-1)/26);return e}),l={};return{namedParameterizedRoute:u.map(e=>{let n=o.INTERCEPTION_ROUTE_MARKERS.some(t=>e.startsWith(t)),i=e.match(/\[((?:\[.*\])|.+)\]/);if(n&&i){let[n]=e.split(i[0]);return c({getSafeRouteKey:s,interceptionMarker:n,segment:i[1],routeKeys:l,keyPrefix:t?r.NEXT_INTERCEPTION_MARKER_PREFIX:void 0})}return i?c({getSafeRouteKey:s,segment:i[1],routeKeys:l,keyPrefix:t?r.NEXT_QUERY_PARAM_PREFIX:void 0}):"/"+(0,a.escapeStringRegexp)(e)}).join(""),routeKeys:l}}function d(e,t){let n=f(e,t);return{...l(e),namedRegex:"^"+n.namedParameterizedRoute+"(?:/)?$",routeKeys:n.routeKeys}}function p(e,t){let{parameterizedRoute:n}=s(e),{catchAll:r=!0}=t;if("/"===n)return{namedRegex:"^/"+(r?".*":"")+"$"};let{namedParameterizedRoute:o}=f(e,!1);return{namedRegex:"^"+o+(r?"(?:(/.*)?)":"")+"$"}}},4777:function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"getSortedRoutes",{enumerable:!0,get:function(){return r}});class n{insert(e){this._insert(e.split("/").filter(Boolean),[],!1)}smoosh(){return this._smoosh()}_smoosh(e){void 0===e&&(e="/");let t=[...this.children.keys()].sort();null!==this.slugName&&t.splice(t.indexOf("[]"),1),null!==this.restSlugName&&t.splice(t.indexOf("[...]"),1),null!==this.optionalRestSlugName&&t.splice(t.indexOf("[[...]]"),1);let n=t.map(t=>this.children.get(t)._smoosh(""+e+t+"/")).reduce((e,t)=>[...e,...t],[]);if(null!==this.slugName&&n.push(...this.children.get("[]")._smoosh(e+"["+this.slugName+"]/")),!this.placeholder){let t="/"===e?"/":e.slice(0,-1);if(null!=this.optionalRestSlugName)throw Error('You cannot define a route with the same specificity as a optional catch-all route ("'+t+'" and "'+t+"[[..."+this.optionalRestSlugName+']]").');n.unshift(t)}return null!==this.restSlugName&&n.push(...this.children.get("[...]")._smoosh(e+"[..."+this.restSlugName+"]/")),null!==this.optionalRestSlugName&&n.push(...this.children.get("[[...]]")._smoosh(e+"[[..."+this.optionalRestSlugName+"]]/")),n}_insert(e,t,r){if(0===e.length){this.placeholder=!1;return}if(r)throw Error("Catch-all must be the last part of the URL.");let o=e[0];if(o.startsWith("[")&&o.endsWith("]")){let n=o.slice(1,-1),i=!1;if(n.startsWith("[")&&n.endsWith("]")&&(n=n.slice(1,-1),i=!0),n.startsWith("...")&&(n=n.substring(3),r=!0),n.startsWith("[")||n.endsWith("]"))throw Error("Segment names may not start or end with extra brackets ('"+n+"').");if(n.startsWith("."))throw Error("Segment names may not start with erroneous periods ('"+n+"').");function a(e,n){if(null!==e&&e!==n)throw Error("You cannot use different slug names for the same dynamic path ('"+e+"' !== '"+n+"').");t.forEach(e=>{if(e===n)throw Error('You cannot have the same slug name "'+n+'" repeat within a single dynamic path');if(e.replace(/\W/g,"")===o.replace(/\W/g,""))throw Error('You cannot have the slug names "'+e+'" and "'+n+'" differ only by non-word symbols within a single dynamic path')}),t.push(n)}if(r){if(i){if(null!=this.restSlugName)throw Error('You cannot use both an required and optional catch-all route at the same level ("[...'+this.restSlugName+']" and "'+e[0]+'" ).');a(this.optionalRestSlugName,n),this.optionalRestSlugName=n,o="[[...]]"}else{if(null!=this.optionalRestSlugName)throw Error('You cannot use both an optional and required catch-all route at the same level ("[[...'+this.optionalRestSlugName+']]" and "'+e[0]+'").');a(this.restSlugName,n),this.restSlugName=n,o="[...]"}}else{if(i)throw Error('Optional route parameters are not yet supported ("'+e[0]+'").');a(this.slugName,n),this.slugName=n,o="[]"}}this.children.has(o)||this.children.set(o,new n),this.children.get(o)._insert(e.slice(1),t,r)}constructor(){this.placeholder=!0,this.children=new Map,this.slugName=null,this.restSlugName=null,this.optionalRestSlugName=null}}function r(e){let t=new n;return e.forEach(e=>t.insert(e)),t.smoosh()}},3987:function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{DecodeError:function(){return h},MiddlewareNotFoundError:function(){return E},MissingStaticPage:function(){return m},NormalizeError:function(){return _},PageNotFoundError:function(){return g},SP:function(){return d},ST:function(){return p},WEB_VITALS:function(){return n},execOnce:function(){return r},getDisplayName:function(){return s},getLocationOrigin:function(){return i},getURL:function(){return u},isAbsoluteUrl:function(){return a},isResSent:function(){return l},loadGetInitialProps:function(){return f},normalizeRepeatedSlashes:function(){return c},stringifyError:function(){return R}});let n=["CLS","FCP","FID","INP","LCP","TTFB"];function r(e){let t,n=!1;return function(){for(var r=arguments.length,o=Array(r),a=0;a<r;a++)o[a]=arguments[a];return n||(n=!0,t=e(...o)),t}}let o=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,a=e=>o.test(e);function i(){let{protocol:e,hostname:t,port:n}=window.location;return e+"//"+t+(n?":"+n:"")}function u(){let{href:e}=window.location,t=i();return e.substring(t.length)}function s(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function l(e){return e.finished||e.headersSent}function c(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?"?"+t.slice(1).join("?"):"")}async function f(e,t){let n=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await f(t.Component,t.ctx)}:{};let r=await e.getInitialProps(t);if(n&&l(n))return r;if(!r)throw Error('"'+s(e)+'.getInitialProps()" should resolve to an object. But found "'+r+'" instead.');return r}let d="undefined"!=typeof performance,p=d&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class h extends Error{}class _ extends Error{}class g extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message="Cannot find module for page: "+e}}class m extends Error{constructor(e,t){super(),this.message="Failed to load static file for page: "+e+" "+t}}class E extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function R(e){return JSON.stringify({message:e.message,stack:e.stack})}}}]);
static/_next/static/chunks/app/_not-found/page-4b00f8e0855b1655.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[409],{7589:function(e,t,n){(window.__NEXT_P=window.__NEXT_P||[]).push(["/_not-found/page",function(){return n(3634)}])},3634:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return s}}),n(7043);let i=n(7437);n(2265);let o={fontFamily:'system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"',height:"100vh",textAlign:"center",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center"},l={display:"inline-block"},r={display:"inline-block",margin:"0 20px 0 0",padding:"0 23px 0 0",fontSize:24,fontWeight:500,verticalAlign:"top",lineHeight:"49px"},d={fontSize:14,fontWeight:400,lineHeight:"49px",margin:0};function s(){return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("title",{children:"404: This page could not be found."}),(0,i.jsx)("div",{style:o,children:(0,i.jsxs)("div",{children:[(0,i.jsx)("style",{dangerouslySetInnerHTML:{__html:"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}),(0,i.jsx)("h1",{className:"next-error-h1",style:r,children:"404"}),(0,i.jsx)("div",{style:l,children:(0,i.jsx)("h2",{style:d,children:"This page could not be found."})})]})})]})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)}},function(e){e.O(0,[971,117,744],function(){return e(e.s=7589)}),_N_E=e.O()}]);
static/_next/static/chunks/app/layout-a1410775e19d1e76.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[185],{3308:function(a,_,e){Promise.resolve().then(e.t.bind(e,7583,23)),Promise.resolve().then(e.t.bind(e,3398,23)),Promise.resolve().then(e.t.bind(e,9500,23)),Promise.resolve().then(e.t.bind(e,7960,23))},7960:function(){},9500:function(a){a.exports={style:{fontFamily:"'__JetBrains_Mono_6d24ac', '__JetBrains_Mono_Fallback_6d24ac'",fontStyle:"normal"},className:"__className_6d24ac",variable:"__variable_6d24ac"}},3398:function(a){a.exports={style:{fontFamily:"'__Plus_Jakarta_Sans_7da9e8', '__Plus_Jakarta_Sans_Fallback_7da9e8'",fontStyle:"normal"},className:"__className_7da9e8",variable:"__variable_7da9e8"}},7583:function(a){a.exports={style:{fontFamily:"'__Syne_fada24', '__Syne_Fallback_fada24'",fontStyle:"normal"},className:"__className_fada24",variable:"__variable_fada24"}}},function(a){a.O(0,[209,971,117,744],function(){return a(a.s=3308)}),_N_E=a.O()}]);
static/_next/static/chunks/app/page-6d2f349a055fbf64.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{3740:function(e,s,a){Promise.resolve().then(a.bind(a,7340))},7340:function(e,s,a){"use strict";a.r(s),a.d(s,{default:function(){return r}});var l=a(7437),i=a(2265);function r(){var e,s;let[a,r]=(0,i.useState)(""),[c,t]=(0,i.useState)([]),[d,o]=(0,i.useState)(!1),[h,m]=(0,i.useState)(null),[x,j]=(0,i.useState)(!1),[u,v]=(0,i.useState)(0),p=(0,i.useRef)(null),N=(0,i.useRef)(null),f=e=>{t(s=>s.filter((s,a)=>a!==e))},b=e=>new Promise((s,a)=>{let l=new FileReader;l.readAsDataURL(e),l.onload=()=>s(l.result),l.onerror=e=>a(e)}),g=async()=>{if(a||0!==c.length){o(!0),j(!1),m(null);try{let e=await Promise.all(c.map(async e=>({data_url:await b(e),filename:e.name}))),s=await fetch("/api/check",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({ad_text:a,images:e})});if(!s.ok)throw Error("Analysis failed");let l=await s.json();m(l),o(!1),j(!0),setTimeout(()=>{var e;null===(e=N.current)||void 0===e||e.scrollIntoView({behavior:"smooth",block:"nearest"})},300)}catch(e){console.error(e),o(!1)}}},k=[{label:"ALERT",content:"\xa347M in FCA fines issued for marketing violations — 2024",hi:!0},{label:"COBS 4.2.1R",content:"risk warning mandatory in financial promotions, onboarding docs and emails",hi:!1},{label:"PS23/6",content:"cryptoasset financial promotion rules now in force",hi:!0},{label:"DUTY",content:"Consumer Duty covers all customer communications — not just ads",hi:!1},{label:"PRIN 2A.3",content:"implied guaranteed returns now a category-1 breach across all channels",hi:!1}];return(0,l.jsxs)("div",{className:"min-h-screen",children:[(0,l.jsxs)("nav",{children:[(0,l.jsxs)("a",{href:"#",className:"nav-logo",children:[(0,l.jsx)("div",{className:"logo-mark",children:"HS"}),"HitSafe.ai"]}),(0,l.jsxs)("ul",{className:"nav-links",children:[(0,l.jsx)("li",{children:(0,l.jsx)("a",{href:"#coverage",children:"Coverage"})}),(0,l.jsx)("li",{children:(0,l.jsx)("a",{href:"#pricing",children:"Pricing"})})]}),(0,l.jsxs)("div",{className:"nav-ctas",children:[(0,l.jsx)("button",{className:"btn-ghost",children:"Sign in"}),(0,l.jsx)("button",{className:"btn-red",children:"Start free →"})]})]}),(0,l.jsx)("div",{className:"ticker",children:(0,l.jsx)("div",{className:"ticker-inner",children:[...k,...k].map((e,s)=>(0,l.jsxs)("span",{className:"ticker-item",children:[(0,l.jsx)("span",{children:e.label}),(0,l.jsx)("span",{className:e.hi?"hi":"",children:e.content})]},s))})}),(0,l.jsxs)("div",{className:"hero-shell",children:[(0,l.jsxs)("div",{className:"flank flank-left",children:[(0,l.jsx)("div",{className:"flank-stat",children:(0,l.jsx)("span",{className:"red",children:"\xa347M"})}),(0,l.jsx)("div",{className:"flank-label",children:"FCA fines \xb7 2024"}),(0,l.jsx)("div",{className:"flank-rule",children:"COBS 4.2.1R"}),(0,l.jsx)("br",{}),(0,l.jsx)("div",{className:"flank-rule",children:"COBS 4.5.2"}),(0,l.jsx)("br",{}),(0,l.jsx)("div",{className:"flank-rule",children:"PRIN 2A.3"}),(0,l.jsx)("br",{}),(0,l.jsx)("div",{className:"flank-rule",children:"PS23/6"})]}),(0,l.jsxs)("div",{className:"flank flank-right",children:[(0,l.jsxs)("div",{className:"flank-stat",children:["15",(0,l.jsx)("span",{style:{fontSize:"20px",color:"var(--ink-4)"},children:"s"})]}),(0,l.jsx)("div",{className:"flank-label",children:"Per check"}),(0,l.jsx)("div",{className:"flank-rule",children:"Consumer Duty"}),(0,l.jsx)("br",{}),(0,l.jsx)("div",{className:"flank-rule",children:"Image Analysis"}),(0,l.jsx)("br",{}),(0,l.jsx)("div",{className:"flank-rule",children:"Safe Rewrites"}),(0,l.jsx)("br",{}),(0,l.jsx)("div",{className:"flank-rule",children:"Bulk Mode"})]}),(0,l.jsxs)("div",{className:"center-block",children:[(0,l.jsxs)("div",{className:"center-header",children:[(0,l.jsx)("div",{className:"center-eyebrow",children:"FCA Compliance Intelligence"}),(0,l.jsxs)("h1",{className:"center-h",children:["Paste your content. Find the",(0,l.jsx)("br",{}),(0,l.jsx)("em",{children:"breach"})," before the FCA does."]}),(0,l.jsx)("p",{className:"center-sub",children:"Screens ad copy, customer emails, onboarding documents, and campaign creatives against COBS 4 and Consumer Duty — flagging violations in seconds, with compliant rewrites ready to use."})]}),(0,l.jsxs)("div",{className:"analysis-box",children:[(0,l.jsx)("div",{className:"box-label",children:"Ad copy \xb7 Email \xb7 Onboarding \xb7 Risk disclosure \xb7 Social post"}),(0,l.jsx)("textarea",{className:"box-textarea",rows:4,placeholder:'Paste any customer-facing content — ad copy, email, onboarding document, risk disclosure, social post, or product page... e.g. "Your crypto should work harder. Limited-time APY boost now live..."',value:a,onChange:e=>r(e.target.value),onKeyDown:e=>{"Enter"===e.key&&(e.metaKey||e.ctrlKey)&&g()}}),(0,l.jsx)("div",{className:"loading-bar ".concat(d?"active":""),children:(0,l.jsx)("div",{className:"loading-bar-fill"})}),(0,l.jsxs)("div",{className:"box-footer",children:[(0,l.jsxs)("div",{className:"box-files",children:[(0,l.jsxs)("button",{className:"attach-btn",onClick:()=>{var e;return null===(e=p.current)||void 0===e?void 0:e.click()},children:[(0,l.jsx)("svg",{width:"11",height:"11",viewBox:"0 0 11 11",fill:"none",children:(0,l.jsx)("path",{d:"M1 5.5h9M5.5 1v9",stroke:"currentColor",strokeWidth:"1.5","stroke-linecap":"round"})}),"Attach screenshots"]}),(0,l.jsx)("input",{type:"file",ref:p,multiple:!0,accept:"image/*",style:{display:"none"},onChange:e=>{e.target.files&&t(Array.from(e.target.files).slice(0,2))}}),c.map((e,s)=>(0,l.jsxs)("div",{className:"file-chip",onClick:()=>f(s),children:[(0,l.jsx)("span",{children:e.name.length>18?e.name.slice(0,16)+"…":e.name}),(0,l.jsx)("span",{className:"x",children:"✕"})]},s))]}),(0,l.jsxs)("button",{className:"run-btn ".concat(d?"loading":""),onClick:g,disabled:d,children:[!d&&(0,l.jsx)("svg",{className:"arrow",width:"12",height:"12",viewBox:"0 0 12 12",fill:"none",children:(0,l.jsx)("path",{d:"M2 6h8M6 2l4 4-4 4",stroke:"currentColor",strokeWidth:"1.5","stroke-linecap":"round","stroke-linejoin":"round"})}),d&&(0,l.jsxs)("svg",{className:"spinner",width:"12",height:"12",viewBox:"0 0 12 12",fill:"none",children:[(0,l.jsx)("circle",{cx:"6",cy:"6",r:"5",stroke:"currentColor","stroke-width":"1.5","stroke-dasharray":"20","stroke-dashoffset":"5",opacity:"0.4"}),(0,l.jsx)("path",{d:"M6 1a5 5 0 0 1 5 5",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round"})]}),d?"Analysing...":"Run analysis"]})]}),(0,l.jsx)("div",{ref:N,className:"results-panel ".concat(x?"open":""),children:h&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)("div",{className:"results-meta-bar",children:[(0,l.jsxs)("div",{className:"results-meta-left",children:[(0,l.jsxs)("span",{className:"r-chip",children:["Mode: ",h.mode||"Standard"]}),(0,l.jsxs)("span",{className:"r-chip",children:["Assets: ",h.total]}),(0,l.jsxs)("span",{className:"r-chip pass",children:["✓ Passed: ",h.success_count]}),(0,l.jsxs)("span",{className:"r-chip fail",children:["✗ Failed: ",h.failure_count]})]}),h.failure_count&&h.failure_count>0?(0,l.jsx)("div",{className:"results-stamp",children:"BREACH FOUND"}):(0,l.jsx)("div",{className:"results-stamp",style:{borderColor:"var(--green)",color:"var(--green)"},children:"CLEARED"})]}),(0,l.jsx)("div",{className:"results-tabs",children:null===(e=h.results)||void 0===e?void 0:e.map((e,s)=>(0,l.jsxs)("button",{className:"r-tab ".concat(u===s?"active":""),onClick:()=>v(s),children:["Asset ",s+1," \xb7 ",e.image_reference||"Text Input"]},s))}),(0,l.jsx)("div",{className:"results-body",children:(null===(s=h.results)||void 0===s?void 0:s[u])&&(0,l.jsx)(n,{result:h.results[u]})}),(0,l.jsxs)("div",{className:"results-foot",children:[(0,l.jsx)("span",{children:"Guidance only. Not legal advice."}),(0,l.jsx)("span",{children:"HitSafe.ai \xb7 Analysis complete"})]})]})})]}),(0,l.jsxs)("div",{className:"proof-strip",children:[(0,l.jsxs)("div",{className:"proof-item",children:[(0,l.jsx)("div",{className:"proof-dot"}),"Sub-15s per check"]}),(0,l.jsx)("div",{className:"proof-sep"}),(0,l.jsxs)("div",{className:"proof-item",children:[(0,l.jsx)("div",{className:"proof-dot"}),"COBS 4 + Consumer Duty"]}),(0,l.jsx)("div",{className:"proof-sep"}),(0,l.jsxs)("div",{className:"proof-item",children:[(0,l.jsx)("div",{className:"proof-dot"}),"No card required"]})]})]})]}),(0,l.jsx)("div",{className:"page-rest",children:(0,l.jsxs)("div",{className:"page-rest-inner",children:[(0,l.jsxs)("div",{className:"stats-row",id:"coverage",children:[(0,l.jsxs)("div",{className:"s-cell",children:[(0,l.jsxs)("div",{className:"s-num",children:[(0,l.jsx)("span",{className:"red",children:"\xa347"}),"M"]}),(0,l.jsx)("div",{className:"s-lbl",children:"FCA fines \xb7 2024"})]}),(0,l.jsxs)("div",{className:"s-cell",children:[(0,l.jsxs)("div",{className:"s-num",children:["<15",(0,l.jsx)("span",{style:{fontSize:"20px",color:"rgba(255,255,255,0.4)"},children:"s"})]}),(0,l.jsx)("div",{className:"s-lbl",children:"Per compliance check"})]}),(0,l.jsxs)("div",{className:"s-cell",children:[(0,l.jsx)("div",{className:"s-num",children:"20"}),(0,l.jsx)("div",{className:"s-lbl",children:"Max assets per run"})]})]}),(0,l.jsx)("hr",{className:"divider-line"}),(0,l.jsx)("div",{className:"sec-kicker",children:"What we check"}),(0,l.jsx)("h2",{className:"sec-title",children:"Every rule. Every channel."}),(0,l.jsx)("p",{className:"sec-sub",children:"Ads, emails, onboarding flows, risk disclosures — wherever your team writes something a customer reads, HitSafe.ai checks it against COBS 4 and Consumer Duty before it goes live."}),(0,l.jsxs)("div",{className:"coverage-strip",children:[(0,l.jsxs)("div",{className:"cov-cell",children:[(0,l.jsx)("div",{className:"cov-icon-box",children:"\uD83D\uDEE1"}),(0,l.jsx)("h3",{children:"COBS 4 \xb7 Financial Promotions"}),(0,l.jsx)("p",{children:"Catches implied guarantees, missing risk warnings, and imbalanced return/risk framing — across ads, emails, and any customer-facing copy."}),(0,l.jsx)("span",{className:"cov-ref",children:"FCA Coverage"})]}),(0,l.jsxs)("div",{className:"cov-cell",style:{borderTop:"2px solid var(--red)"},children:[(0,l.jsx)("div",{className:"cov-icon-box",style:{background:"var(--red-light)",borderColor:"var(--red-mid)"},children:"\uD83D\uDCCB"}),(0,l.jsx)("h3",{children:"Consumer Duty \xb7 PRIN 2A"}),(0,l.jsx)("p",{children:"Flags foreseeable harm across onboarding flows, product pages, risk disclosures, and fee communications — not just ads."}),(0,l.jsx)("span",{className:"cov-ref",style:{color:"var(--red)",borderColor:"var(--red-mid)",background:"var(--red-light)"},children:"Consumer Duty"})]}),(0,l.jsxs)("div",{className:"cov-cell",children:[(0,l.jsx)("div",{className:"cov-icon-box",children:"\uD83D\uDDBC"}),(0,l.jsx)("h3",{children:"Image + Text + Documents"}),(0,l.jsx)("p",{children:"Upload screenshots, paste email copy, or drop in onboarding text. The engine reads all of it — visual layout and written content together."}),(0,l.jsx)("span",{className:"cov-ref",children:"All Formats"})]})]}),(0,l.jsx)("hr",{className:"divider-line",id:"pricing"}),(0,l.jsxs)("div",{className:"price-block",children:[(0,l.jsxs)("div",{className:"price-card-sm",children:[(0,l.jsx)("div",{className:"price-label-sm",children:"Monthly \xb7 Cancel anytime"}),(0,l.jsxs)("div",{className:"price-num-sm",children:[(0,l.jsx)("sup",{children:"\xa3"}),"99"]}),(0,l.jsx)("div",{className:"price-period-sm",children:"per month after free trial"}),(0,l.jsxs)("ul",{className:"price-items",children:[(0,l.jsxs)("li",{children:[(0,l.jsx)("span",{className:"chk",children:"✓"})," Unlimited compliance checks"]}),(0,l.jsxs)("li",{children:[(0,l.jsx)("span",{className:"chk",children:"✓"})," Full COBS 4 + Consumer Duty"]}),(0,l.jsxs)("li",{children:[(0,l.jsx)("span",{className:"chk",children:"✓"})," Up to 20 assets per submission"]}),(0,l.jsxs)("li",{children:[(0,l.jsx)("span",{className:"chk",children:"✓"})," Image + text creative analysis"]}),(0,l.jsxs)("li",{children:[(0,l.jsx)("span",{className:"chk",children:"✓"})," Compliant rewrite drafts per issue"]}),(0,l.jsxs)("li",{children:[(0,l.jsx)("span",{className:"chk",children:"✓"})," No yearly charges. Cancel anytime."]})]}),(0,l.jsx)("button",{className:"btn-price-sm",children:"Start free — no card required"}),(0,l.jsx)("p",{className:"price-note-sm",children:"\xa399/month after trial \xb7 Cancel anytime"})]}),(0,l.jsxs)("div",{className:"price-right-sm",children:[(0,l.jsxs)("h3",{children:["One flat rate.",(0,l.jsx)("br",{}),"Your whole team."]}),(0,l.jsx)("p",{children:"No seat pricing. No per-check billing. No compliance consultant invoices. One clear price that covers every asset your team produces."}),(0,l.jsxs)("div",{className:"guarantee-sm",children:[(0,l.jsx)("strong",{children:"Our commitment"}),(0,l.jsx)("p",{children:"If HitSafe.ai fails to flag a clear COBS 4 breach that leads to an FCA inquiry during your subscription, we'll refund your last 3 months. No questions asked."})]})]})]})]})}),(0,l.jsx)("footer",{children:(0,l.jsxs)("div",{className:"footer-inner",children:[(0,l.jsxs)("div",{className:"footer-brand",children:[(0,l.jsx)("div",{className:"logo-mark",style:{width:"20px",height:"20px",fontSize:"9px"},children:"HS"}),(0,l.jsx)("span",{className:"footer-brand-name",children:"HitSafe.ai"}),(0,l.jsx)("span",{className:"footer-tag",children:"FCA compliance intelligence for fintech teams."})]}),(0,l.jsxs)("div",{className:"footer-links",children:[(0,l.jsx)("a",{href:"#",children:"App"}),(0,l.jsx)("a",{href:"/terms",children:"Terms & Conditions"}),(0,l.jsx)("a",{href:"#",children:"How it works"})]}),(0,l.jsx)("div",{className:"footer-legal",children:"Guidance only. Not legal advice. \xa9 2026 HitSafe.ai"})]})})]})}function n(e){var s;let{result:a}=e,i=a.parsed_output;if(!i)return(0,l.jsxs)("div",{className:"pass-block",children:[(0,l.jsx)("div",{className:"pass-icon",children:"✗"}),(0,l.jsxs)("div",{children:[(0,l.jsx)("div",{className:"pass-text text-red-600",children:"Failed to parse analysis results."}),(0,l.jsx)("div",{className:"pass-sub",children:a.error||"Unknown error occurred."})]})]});let r=i.violations||[];return null===(s=i.risk_level)||void 0===s||s.toLowerCase(),(0,l.jsxs)("div",{className:"space-y-4",children:[(0,l.jsx)("div",{className:"asset-header",children:(0,l.jsxs)("div",{children:[(0,l.jsx)("div",{className:"asset-name",children:a.image_reference||"Text Input"}),(0,l.jsxs)("div",{className:"asset-sub",children:[r.length," violations \xb7 ",i.risk_level," severity \xb7 ",i.safe_rewrite?"Compliant rewrite ready":"No rewrite generated"]})]})}),0===r.length?(0,l.jsxs)("div",{className:"pass-block",children:[(0,l.jsx)("div",{className:"pass-icon",children:"✓"}),(0,l.jsxs)("div",{children:[(0,l.jsx)("div",{className:"pass-text",children:"This asset passed all checks."}),(0,l.jsx)("div",{className:"pass-sub",children:"COBS 4, Consumer Duty, and related requirements met."})]})]}):r.map((e,s)=>{var a;return(0,l.jsxs)("div",{className:"breach ".concat("Medium"===i.risk_level?"warn":""),children:[(0,l.jsxs)("div",{className:"breach-top",children:[(0,l.jsx)("div",{className:"breach-ref",children:(null===(a=e.rule_refs)||void 0===a?void 0:a.join(" + "))||"FCA Regulation"}),(0,l.jsx)("div",{className:"breach-sev",children:i.risk_level||"HIGH"})]}),(0,l.jsx)("div",{className:"breach-title",children:e.issue}),(0,l.jsx)("div",{className:"breach-why",children:e.why}),(0,l.jsxs)("div",{className:"breach-fix",children:[(0,l.jsx)("b",{children:"Fix:"})," ",e.fix]})]},s)}),i.safe_rewrite&&(0,l.jsxs)("div",{className:"rewrite-block",children:[(0,l.jsx)("div",{className:"rewrite-label",children:"→ Compliant rewrite"}),(0,l.jsx)("div",{className:"rewrite-text",children:i.safe_rewrite}),(0,l.jsx)("button",{className:"copy-btn",onClick:e=>{e.target.textContent="Copied ✓",navigator.clipboard.writeText(i.safe_rewrite||"")},children:"Copy rewrite"})]})]})}}},function(e){e.O(0,[971,117,744],function(){return e(e.s=3740)}),_N_E=e.O()}]);
static/_next/static/chunks/app/terms/page-c0b6f8da64e42b92.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[571],{329:function(n,e,u){Promise.resolve().then(u.t.bind(u,2972,23))}},function(n){n.O(0,[972,971,117,744],function(){return n(n.s=329)}),_N_E=n.O()}]);
static/_next/static/chunks/fd9d1056-a1131c60010a8a5e.js ADDED
The diff for this file is too large to render. See raw diff
 
static/_next/static/chunks/framework-f66176bb897dc684.js ADDED
The diff for this file is too large to render. See raw diff
 
static/_next/static/chunks/main-app-c835e4ccc4173445.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[744],{6050:function(e,n,t){Promise.resolve().then(t.t.bind(t,2846,23)),Promise.resolve().then(t.t.bind(t,9107,23)),Promise.resolve().then(t.t.bind(t,1060,23)),Promise.resolve().then(t.t.bind(t,4707,23)),Promise.resolve().then(t.t.bind(t,80,23)),Promise.resolve().then(t.t.bind(t,6423,23))}},function(e){var n=function(n){return e(e.s=n)};e.O(0,[971,117],function(){return n(4278),n(6050)}),_N_E=e.O()}]);
static/_next/static/chunks/main-cbde494fa0b17687.js ADDED
The diff for this file is too large to render. See raw diff
 
static/_next/static/chunks/pages/_app-72b849fbd24ac258.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[888],{1597:function(n,_,u){(window.__NEXT_P=window.__NEXT_P||[]).push(["/_app",function(){return u(8141)}])}},function(n){var _=function(_){return n(n.s=_)};n.O(0,[774,179],function(){return _(1597),_(7253)}),_N_E=n.O()}]);
static/_next/static/chunks/pages/_error-7ba65e1336b92748.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[820],{1981:function(n,_,u){(window.__NEXT_P=window.__NEXT_P||[]).push(["/_error",function(){return u(8529)}])}},function(n){n.O(0,[888,774,179],function(){return n(n.s=1981)}),_N_E=n.O()}]);
static/_next/static/chunks/polyfills-42372ed130431b0a.js ADDED
The diff for this file is too large to render. See raw diff
 
static/_next/static/chunks/webpack-b4e161512712a12a.js ADDED
@@ -0,0 +1 @@
 
 
1
+ !function(){"use strict";var e,t,r,n,o,u,i,c,f,a={},l={};function d(e){var t=l[e];if(void 0!==t)return t.exports;var r=l[e]={exports:{}},n=!0;try{a[e](r,r.exports,d),n=!1}finally{n&&delete l[e]}return r.exports}d.m=a,e=[],d.O=function(t,r,n,o){if(r){o=o||0;for(var u=e.length;u>0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[r,n,o];return}for(var i=1/0,u=0;u<e.length;u++){for(var r=e[u][0],n=e[u][1],o=e[u][2],c=!0,f=0;f<r.length;f++)i>=o&&Object.keys(d.O).every(function(e){return d.O[e](r[f])})?r.splice(f--,1):(c=!1,o<i&&(i=o));if(c){e.splice(u--,1);var a=n();void 0!==a&&(t=a)}}return t},r=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},d.t=function(e,n){if(1&n&&(e=this(e)),8&n||"object"==typeof e&&e&&(4&n&&e.__esModule||16&n&&"function"==typeof e.then))return e;var o=Object.create(null);d.r(o);var u={};t=t||[null,r({}),r([]),r(r)];for(var i=2&n&&e;"object"==typeof i&&!~t.indexOf(i);i=r(i))Object.getOwnPropertyNames(i).forEach(function(t){u[t]=function(){return e[t]}});return u.default=function(){return e},d.d(o,u),o},d.d=function(e,t){for(var r in t)d.o(t,r)&&!d.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},d.f={},d.e=function(e){return Promise.all(Object.keys(d.f).reduce(function(t,r){return d.f[r](e,t),t},[]))},d.u=function(e){},d.miniCssF=function(e){},d.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n={},o="_N_E:",d.l=function(e,t,r,u){if(n[e]){n[e].push(t);return}if(void 0!==r)for(var i,c,f=document.getElementsByTagName("script"),a=0;a<f.length;a++){var l=f[a];if(l.getAttribute("src")==e||l.getAttribute("data-webpack")==o+r){i=l;break}}i||(c=!0,(i=document.createElement("script")).charset="utf-8",i.timeout=120,d.nc&&i.setAttribute("nonce",d.nc),i.setAttribute("data-webpack",o+r),i.src=d.tu(e)),n[e]=[t];var s=function(t,r){i.onerror=i.onload=null,clearTimeout(p);var o=n[e];if(delete n[e],i.parentNode&&i.parentNode.removeChild(i),o&&o.forEach(function(e){return e(r)}),t)return t(r)},p=setTimeout(s.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=s.bind(null,i.onerror),i.onload=s.bind(null,i.onload),c&&document.head.appendChild(i)},d.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},d.tt=function(){return void 0===u&&(u={createScriptURL:function(e){return e}},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(u=trustedTypes.createPolicy("nextjs#bundler",u))),u},d.tu=function(e){return d.tt().createScriptURL(e)},d.p="/_next/",i={272:0,209:0},d.f.j=function(e,t){var r=d.o(i,e)?i[e]:void 0;if(0!==r){if(r)t.push(r[2]);else if(/^2(09|72)$/.test(e))i[e]=0;else{var n=new Promise(function(t,n){r=i[e]=[t,n]});t.push(r[2]=n);var o=d.p+d.u(e),u=Error();d.l(o,function(t){if(d.o(i,e)&&(0!==(r=i[e])&&(i[e]=void 0),r)){var n=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;u.message="Loading chunk "+e+" failed.\n("+n+": "+o+")",u.name="ChunkLoadError",u.type=n,u.request=o,r[1](u)}},"chunk-"+e,e)}}},d.O.j=function(e){return 0===i[e]},c=function(e,t){var r,n,o=t[0],u=t[1],c=t[2],f=0;if(o.some(function(e){return 0!==i[e]})){for(r in u)d.o(u,r)&&(d.m[r]=u[r]);if(c)var a=c(d)}for(e&&e(t);f<o.length;f++)n=o[f],d.o(i,n)&&i[n]&&i[n][0](),i[n]=0;return d.O(a)},(f=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(c.bind(null,0)),f.push=c.bind(null,f.push.bind(f))}();
static/_next/static/css/29c131a9787649b2.css ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ @font-face{font-family:__Syne_fada24;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/0da54fcd0470ea43-s.woff2) format("woff2");unicode-range:u+0370-0377,u+037a-037f,u+0384-038a,u+038c,u+038e-03a1,u+03a3-03ff}@font-face{font-family:__Syne_fada24;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/680a7121f7a85e3f-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:__Syne_fada24;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/8a1d8947e5852e30-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:__Syne_fada24;font-style:normal;font-weight:600;font-display:swap;src:url(/_next/static/media/0da54fcd0470ea43-s.woff2) format("woff2");unicode-range:u+0370-0377,u+037a-037f,u+0384-038a,u+038c,u+038e-03a1,u+03a3-03ff}@font-face{font-family:__Syne_fada24;font-style:normal;font-weight:600;font-display:swap;src:url(/_next/static/media/680a7121f7a85e3f-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:__Syne_fada24;font-style:normal;font-weight:600;font-display:swap;src:url(/_next/static/media/8a1d8947e5852e30-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:__Syne_fada24;font-style:normal;font-weight:700;font-display:swap;src:url(/_next/static/media/0da54fcd0470ea43-s.woff2) format("woff2");unicode-range:u+0370-0377,u+037a-037f,u+0384-038a,u+038c,u+038e-03a1,u+03a3-03ff}@font-face{font-family:__Syne_fada24;font-style:normal;font-weight:700;font-display:swap;src:url(/_next/static/media/680a7121f7a85e3f-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:__Syne_fada24;font-style:normal;font-weight:700;font-display:swap;src:url(/_next/static/media/8a1d8947e5852e30-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:__Syne_fada24;font-style:normal;font-weight:800;font-display:swap;src:url(/_next/static/media/0da54fcd0470ea43-s.woff2) format("woff2");unicode-range:u+0370-0377,u+037a-037f,u+0384-038a,u+038c,u+038e-03a1,u+03a3-03ff}@font-face{font-family:__Syne_fada24;font-style:normal;font-weight:800;font-display:swap;src:url(/_next/static/media/680a7121f7a85e3f-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:__Syne_fada24;font-style:normal;font-weight:800;font-display:swap;src:url(/_next/static/media/8a1d8947e5852e30-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:__Syne_Fallback_fada24;src:local("Arial");ascent-override:93.93%;descent-override:27.93%;line-gap-override:0.00%;size-adjust:98.47%}.__className_fada24{font-family:__Syne_fada24,__Syne_Fallback_fada24;font-style:normal}.__variable_fada24{--font-syne:"__Syne_fada24","__Syne_Fallback_fada24"}@font-face{font-family:__Plus_Jakarta_Sans_7da9e8;font-style:normal;font-weight:300;font-display:swap;src:url(/_next/static/media/6fe53d21e6e7ebd8-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:__Plus_Jakarta_Sans_7da9e8;font-style:normal;font-weight:300;font-display:swap;src:url(/_next/static/media/8ebc6e9dde468c4a-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:__Plus_Jakarta_Sans_7da9e8;font-style:normal;font-weight:300;font-display:swap;src:url(/_next/static/media/9e7b0a821b9dfcb4-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:__Plus_Jakarta_Sans_7da9e8;font-style:normal;font-weight:300;font-display:swap;src:url(/_next/static/media/636a5ac981f94f8b-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:__Plus_Jakarta_Sans_7da9e8;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/6fe53d21e6e7ebd8-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:__Plus_Jakarta_Sans_7da9e8;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/8ebc6e9dde468c4a-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:__Plus_Jakarta_Sans_7da9e8;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/9e7b0a821b9dfcb4-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:__Plus_Jakarta_Sans_7da9e8;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/636a5ac981f94f8b-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:__Plus_Jakarta_Sans_7da9e8;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/6fe53d21e6e7ebd8-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:__Plus_Jakarta_Sans_7da9e8;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/8ebc6e9dde468c4a-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:__Plus_Jakarta_Sans_7da9e8;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/9e7b0a821b9dfcb4-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:__Plus_Jakarta_Sans_7da9e8;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/636a5ac981f94f8b-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:__Plus_Jakarta_Sans_Fallback_7da9e8;src:local("Arial");ascent-override:98.88%;descent-override:21.15%;line-gap-override:0.00%;size-adjust:104.98%}.__className_7da9e8{font-family:__Plus_Jakarta_Sans_7da9e8,__Plus_Jakarta_Sans_Fallback_7da9e8;font-style:normal}.__variable_7da9e8{--font-body:"__Plus_Jakarta_Sans_7da9e8","__Plus_Jakarta_Sans_Fallback_7da9e8"}@font-face{font-family:__JetBrains_Mono_6d24ac;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/edc640959b0c7826-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:__JetBrains_Mono_6d24ac;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/ac0e76ddaeeb7981-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:__JetBrains_Mono_6d24ac;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/64d784ea54a4acde-s.woff2) format("woff2");unicode-range:u+0370-0377,u+037a-037f,u+0384-038a,u+038c,u+038e-03a1,u+03a3-03ff}@font-face{font-family:__JetBrains_Mono_6d24ac;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/ff71da380fbe67dd-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:__JetBrains_Mono_6d24ac;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/6d831b18ae5b01dc-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:__JetBrains_Mono_6d24ac;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/558ca1a6aa3cb55e-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:__JetBrains_Mono_6d24ac;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/edc640959b0c7826-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:__JetBrains_Mono_6d24ac;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/ac0e76ddaeeb7981-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:__JetBrains_Mono_6d24ac;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/64d784ea54a4acde-s.woff2) format("woff2");unicode-range:u+0370-0377,u+037a-037f,u+0384-038a,u+038c,u+038e-03a1,u+03a3-03ff}@font-face{font-family:__JetBrains_Mono_6d24ac;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/ff71da380fbe67dd-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:__JetBrains_Mono_6d24ac;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/6d831b18ae5b01dc-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:__JetBrains_Mono_6d24ac;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/558ca1a6aa3cb55e-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:__JetBrains_Mono_Fallback_6d24ac;src:local("Arial");ascent-override:75.79%;descent-override:22.29%;line-gap-override:0.00%;size-adjust:134.59%}.__className_6d24ac{font-family:__JetBrains_Mono_6d24ac,__JetBrains_Mono_Fallback_6d24ac;font-style:normal}.__variable_6d24ac{--font-mono:"__JetBrains_Mono_6d24ac","__JetBrains_Mono_Fallback_6d24ac"}
2
+
3
+ /*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */@layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:host,:root{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-900:oklch(41.4% .112 45.904);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-600:oklch(68.1% .162 75.834);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-900:oklch(37.8% .077 168.94);--color-zinc-50:oklch(98.5% 0 0);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-zinc-950:oklch(14.1% .005 285.823);--color-white:#fff;--spacing:.25rem;--container-lg:32rem;--container-xl:36rem;--container-4xl:56rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-black:900;--tracking-tighter:-.05em;--tracking-tight:-.025em;--tracking-widest:.1em;--leading-normal:1.5;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--shadow-sm:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--ease-in:cubic-bezier(.4,0,1,1);--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0,0,.2,1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1) infinite;--blur-sm:8px;--blur-md:12px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,::backdrop,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}:host,html{-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::-moz-placeholder{color:currentColor}::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::-moz-placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.-top-1\.5{top:calc(var(--spacing) * -1.5)}.top-0{top:calc(var(--spacing) * 0)}.top-1\/2{top:50%}.-right-1\.5{right:calc(var(--spacing) * -1.5)}.right-0{right:calc(var(--spacing) * 0)}.right-5{right:calc(var(--spacing) * 5)}.right-6{right:calc(var(--spacing) * 6)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-6{bottom:calc(var(--spacing) * 6)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.left-3{left:calc(var(--spacing) * 3)}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[101\]{z-index:101}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-20{margin-top:calc(var(--spacing) * 20)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-1{height:calc(var(--spacing) * 1)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-24{height:calc(var(--spacing) * 24)}.h-48{height:calc(var(--spacing) * 48)}.h-full{height:100%}.min-h-screen{min-height:100vh}.w-1{width:calc(var(--spacing) * 1)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-\[15\%\]{width:15%}.w-full{width:100%}.w-px{width:1px}.max-w-4xl{max-width:var(--container-4xl)}.max-w-lg{max-width:var(--container-lg)}.max-w-none{max-width:none}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.resize{resize:both}.resize-none{resize:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-12>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 12) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 12) * calc(1 - var(--tw-space-y-reverse)))}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e+38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-amber-100{border-color:var(--color-amber-100)}.border-amber-200{border-color:var(--color-amber-200)}.border-emerald-50{border-color:var(--color-emerald-50)}.border-emerald-100{border-color:var(--color-emerald-100)}.border-emerald-200{border-color:var(--color-emerald-200)}.border-emerald-500\/20{border-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/20{border-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.border-red-100{border-color:var(--color-red-100)}.border-red-200{border-color:var(--color-red-200)}.border-yellow-200{border-color:var(--color-yellow-200)}.border-zinc-100{border-color:var(--color-zinc-100)}.border-zinc-200{border-color:var(--color-zinc-200)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-50\/50{background-color:#fffbeb80}@supports (color:color-mix(in lab,red,red)){.bg-amber-50\/50{background-color:color-mix(in oklab,var(--color-amber-50) 50%,transparent)}}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-emerald-50\/20{background-color:#ecfdf533}@supports (color:color-mix(in lab,red,red)){.bg-emerald-50\/20{background-color:color-mix(in oklab,var(--color-emerald-50) 20%,transparent)}}.bg-emerald-50\/30{background-color:#ecfdf54d}@supports (color:color-mix(in lab,red,red)){.bg-emerald-50\/30{background-color:color-mix(in oklab,var(--color-emerald-50) 30%,transparent)}}.bg-emerald-50\/50{background-color:#ecfdf580}@supports (color:color-mix(in lab,red,red)){.bg-emerald-50\/50{background-color:color-mix(in oklab,var(--color-emerald-50) 50%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/5{background-color:#00bb7f0d}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/5{background-color:color-mix(in oklab,var(--color-emerald-500) 5%,transparent)}}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/10{background-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.bg-emerald-500\/20{background-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/20{background-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.bg-red-50{background-color:var(--color-red-50)}.bg-red-50\/50{background-color:#fef2f280}@supports (color:color-mix(in lab,red,red)){.bg-red-50\/50{background-color:color-mix(in oklab,var(--color-red-50) 50%,transparent)}}.bg-red-100{background-color:var(--color-red-100)}.bg-red-400{background-color:var(--color-red-400)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-white\/50{background-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.bg-white\/50{background-color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.bg-white\/70{background-color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.bg-white\/70{background-color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.bg-white\/80{background-color:#fffc}@supports (color:color-mix(in lab,red,red)){.bg-white\/80{background-color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.bg-white\/90{background-color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.bg-white\/90{background-color:color-mix(in oklab,var(--color-white) 90%,transparent)}}.bg-yellow-50\/50{background-color:#fefce880}@supports (color:color-mix(in lab,red,red)){.bg-yellow-50\/50{background-color:color-mix(in oklab,var(--color-yellow-50) 50%,transparent)}}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-50\/30{background-color:#fafafa4d}@supports (color:color-mix(in lab,red,red)){.bg-zinc-50\/30{background-color:color-mix(in oklab,var(--color-zinc-50) 30%,transparent)}}.bg-zinc-50\/50{background-color:#fafafa80}@supports (color:color-mix(in lab,red,red)){.bg-zinc-50\/50{background-color:color-mix(in oklab,var(--color-zinc-50) 50%,transparent)}}.bg-zinc-50\/80{background-color:#fafafacc}@supports (color:color-mix(in lab,red,red)){.bg-zinc-50\/80{background-color:color-mix(in oklab,var(--color-zinc-50) 80%,transparent)}}.bg-zinc-100{background-color:var(--color-zinc-100)}.bg-zinc-100\/80{background-color:#f4f4f5cc}@supports (color:color-mix(in lab,red,red)){.bg-zinc-100\/80{background-color:color-mix(in oklab,var(--color-zinc-100) 80%,transparent)}}.bg-zinc-200{background-color:var(--color-zinc-200)}.bg-zinc-900{background-color:var(--color-zinc-900)}.bg-zinc-950\/20{background-color:#09090b33}@supports (color:color-mix(in lab,red,red)){.bg-zinc-950\/20{background-color:color-mix(in oklab,var(--color-zinc-950) 20%,transparent)}}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-emerald-500\/0{--tw-gradient-from:#0000}@supports (color:color-mix(in lab,red,red)){.from-emerald-500\/0{--tw-gradient-from:color-mix(in oklab,var(--color-emerald-500) 0%,transparent)}}.from-emerald-500\/0{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from) var(--tw-gradient-from-position),var(--tw-gradient-to) var(--tw-gradient-to-position))}.via-emerald-500\/10{--tw-gradient-via:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.via-emerald-500\/10{--tw-gradient-via:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.via-emerald-500\/10{--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from) var(--tw-gradient-from-position),var(--tw-gradient-via) var(--tw-gradient-via-position),var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-emerald-500\/0{--tw-gradient-to:#0000}@supports (color:color-mix(in lab,red,red)){.to-emerald-500\/0{--tw-gradient-to:color-mix(in oklab,var(--color-emerald-500) 0%,transparent)}}.to-emerald-500\/0{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from) var(--tw-gradient-from-position),var(--tw-gradient-to) var(--tw-gradient-to-position))}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-10{padding-inline:calc(var(--spacing) * 10)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-16{padding-block:calc(var(--spacing) * 16)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-10{padding-top:calc(var(--spacing) * 10)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-10{padding-left:calc(var(--spacing) * 10)}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-tighter{--tw-tracking:var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-500{color:var(--color-amber-500)}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-amber-900{color:var(--color-amber-900)}.text-emerald-500{color:var(--color-emerald-500)}.text-emerald-600{color:var(--color-emerald-600)}.text-emerald-900{color:var(--color-emerald-900)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-white{color:var(--color-white)}.text-yellow-600{color:var(--color-yellow-600)}.text-zinc-300{color:var(--color-zinc-300)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-800{color:var(--color-zinc-800)}.text-zinc-900{color:var(--color-zinc-900)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.opacity-0{opacity:0}.opacity-\[0\.03\]{opacity:.03}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040)}.shadow-2xl,.shadow-lg{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a)}.shadow-md,.shadow-sm{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a)}.ring,.shadow-xl{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)}.shadow-zinc-200{--tw-shadow-color:oklch(92% .004 286.32)}@supports (color:color-mix(in lab,red,red)){.shadow-zinc-200{--tw-shadow-color:color-mix(in oklab,var(--color-zinc-200) var(--tw-shadow-alpha),transparent)}}.blur{--tw-blur:blur(8px)}.blur,.blur-\[1px\]{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.blur-\[1px\]{--tw-blur:blur(1px)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}@media (hover:hover){.group-hover\:translate-x-1:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:rotate-12:is(:where(.group):hover *){rotate:12deg}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-zinc-400::-moz-placeholder{color:var(--color-zinc-400)}.placeholder\:text-zinc-400::placeholder{color:var(--color-zinc-400)}@media (hover:hover){.hover\:bg-emerald-100\/50:hover{background-color:#d0fae580}@supports (color:color-mix(in lab,red,red)){.hover\:bg-emerald-100\/50:hover{background-color:color-mix(in oklab,var(--color-emerald-100) 50%,transparent)}}.hover\:bg-red-500:hover{background-color:var(--color-red-500)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:bg-zinc-100\/30:hover{background-color:#f4f4f54d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-100\/30:hover{background-color:color-mix(in oklab,var(--color-zinc-100) 30%,transparent)}}.hover\:bg-zinc-200:hover{background-color:var(--color-zinc-200)}.hover\:bg-zinc-800:hover{background-color:var(--color-zinc-800)}.hover\:text-emerald-600:hover{color:var(--color-emerald-600)}.hover\:text-white:hover{color:var(--color-white)}.hover\:shadow-zinc-300:hover{--tw-shadow-color:oklch(87.1% .006 286.286)}@supports (color:color-mix(in lab,red,red)){.hover\:shadow-zinc-300:hover{--tw-shadow-color:color-mix(in oklab,var(--color-zinc-300) var(--tw-shadow-alpha),transparent)}}}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-emerald-500\/20:focus{--tw-ring-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.focus\:ring-emerald-500\/20:focus{--tw-ring-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:40rem){.sm\:w-auto{width:auto}.sm\:flex-row{flex-direction:row}}@media (min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:py-24{padding-block:calc(var(--spacing) * 24)}}@media (min-width:64rem){.lg\:flex{display:flex}}}:root{--cream:#faf8f3;--cream-2:#f4f0e8;--cream-3:#ece7dc;--ink:#1a1612;--ink-2:#3d3730;--ink-3:#7a7068;--ink-4:#a89e94;--red:#c0392b;--red-light:#fdf1ef;--red-mid:#f5c6c2;--green:#1f6b47;--green-light:#edf6f1;--amber:#9a6f2a;--amber-light:#fdf6e8;--border:#ddd8ce;--border-2:#ccc6ba;--mono:"JetBrains Mono",monospace;--display:"Syne",sans-serif;--body:"Plus Jakarta Sans",sans-serif}*,:after,:before{box-sizing:border-box;margin:0;padding:0}html{scroll-behavior:smooth}body{font-family:var(--body);background:var(--cream);color:var(--ink);-webkit-font-smoothing:antialiased;min-height:100vh}nav{z-index:200;backdrop-filter:blur(12px);border-bottom:1px solid var(--border);background:#faf8f3f2;justify-content:space-between;align-items:center;height:50px;padding:0 32px;display:flex;position:fixed;top:0;left:0;right:0}.nav-logo{color:var(--ink);letter-spacing:-.02em;gap:8px;font-size:14px;text-decoration:none}.logo-mark,.nav-logo{font-family:var(--display);align-items:center;font-weight:800;display:flex}.logo-mark{background:var(--red);color:#fff;width:24px;height:24px;font-size:10px;flex-shrink:0;justify-content:center}.nav-links{gap:0;list-style:none;display:flex}.nav-links a{color:var(--ink-3);padding:5px 12px;font-size:12.5px;text-decoration:none;transition:color .15s}.nav-links a:hover{color:var(--ink)}.nav-ctas{align-items:center;gap:8px;display:flex}.btn-ghost{font-family:var(--body);color:var(--ink-2);border:1px solid var(--border);cursor:pointer;background:0 0;padding:5px 12px;font-size:12.5px;transition:all .15s}.btn-ghost:hover{border-color:var(--border-2);color:var(--ink)}.btn-red{font-family:var(--body);color:#fff;background:var(--red);cursor:pointer;border:none;padding:6px 14px;font-size:12.5px;font-weight:500;transition:background .15s}.btn-red:hover{background:#a93225}.ticker{background:var(--ink);white-space:nowrap;margin-top:50px;padding:7px 0;overflow:hidden}.ticker-inner{animation:ticker 35s linear infinite;display:inline-block}.ticker-item{font-family:var(--mono);color:#fff6;align-items:center;gap:7px;margin-right:56px;font-size:10.5px;display:inline-flex}.ticker-item .hi{color:#e8876e}@keyframes ticker{0%{transform:translate(0)}to{transform:translate(-50%)}}.hero-shell{flex-direction:column;justify-content:center;align-items:center;min-height:calc(100vh - 82px);padding:40px 24px 60px;display:flex;position:relative}.flank{width:200px;position:absolute;top:50%;transform:translateY(-50%)}.flank-left{left:32px}.flank-right{right:32px}.flank-stat{font-family:var(--display);letter-spacing:-.04em;color:var(--ink);margin-bottom:6px;font-size:52px;font-weight:800;line-height:1}.flank-stat .red{color:var(--red)}.flank-label{letter-spacing:.08em;text-transform:uppercase;margin-bottom:20px}.flank-label,.flank-rule{font-family:var(--mono);color:var(--ink-4);font-size:10px}.flank-rule{border:1px solid var(--border);background:var(--cream-2);cursor:default;margin-bottom:6px;padding:3px 7px;display:inline-block}.flank-rule:hover{border-color:var(--red);color:var(--red)}.center-block{z-index:10;width:100%;max-width:680px;position:relative}.center-header{text-align:center;margin-bottom:28px}.center-eyebrow{font-family:var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--red);justify-content:center;align-items:center;gap:8px;margin-bottom:14px;font-size:10.5px;font-weight:500;display:flex}.center-eyebrow:after,.center-eyebrow:before{content:"";background:var(--red);width:20px;height:1.5px}.center-h{font-family:var(--display);letter-spacing:-.03em;color:var(--ink);margin-bottom:20px;font-size:52px;font-weight:800;line-height:1.12}.center-h em{color:var(--red);font-style:normal}.center-sub{color:var(--ink-3);font-size:14px;font-weight:300;line-height:1.6}.analysis-box{border:1.5px solid var(--border);background:#fff;transition:border-color .2s,box-shadow .2s;position:relative;box-shadow:0 4px 24px #1a161212,0 1px 3px #1a16120d}.analysis-box:focus-within{border-color:var(--ink);box-shadow:0 4px 32px #1a16121f,0 1px 3px #1a16120f}.box-label{font-family:var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--ink-4);padding:12px 16px 0;font-size:10px;font-weight:500}.box-textarea{width:100%;font-family:var(--body);color:var(--ink);resize:none;background:0 0;border:none;outline:none;min-height:100px;padding:12px 16px 10px;font-size:14px;font-weight:300;line-height:1.65}.box-textarea::-moz-placeholder{color:var(--ink-4)}.box-textarea::placeholder{color:var(--ink-4)}.box-footer{border-top:1px solid var(--cream-3);justify-content:space-between;gap:10px;padding:10px 12px}.box-files,.box-footer{align-items:center;display:flex}.box-files{flex-wrap:wrap;flex:1;gap:6px}.attach-btn{font-family:var(--mono);color:var(--ink-3);background:var(--cream-2);border:1px solid var(--border);cursor:pointer;white-space:nowrap;align-items:center;gap:5px;padding:4px 10px;font-size:10.5px;transition:all .15s;display:flex}.attach-btn:hover{border-color:var(--border-2);color:var(--ink)}.file-chip{font-family:var(--mono);color:var(--ink-3);border:1px solid var(--border);background:var(--cream);cursor:pointer;align-items:center;gap:4px;padding:3px 8px;font-size:10px;display:flex}.file-chip:hover{border-color:var(--red);color:var(--red)}.file-chip .x{color:var(--ink-4);font-size:9px}.run-btn{font-family:var(--body);color:#fff;background:var(--red);cursor:pointer;white-space:nowrap;border:none;flex-shrink:0;align-items:center;gap:6px;padding:8px 18px;font-size:13px;font-weight:500;transition:all .15s;display:flex}.run-btn:hover{background:#a93225}.run-btn .spinner,.run-btn.loading .arrow{display:none}.run-btn.loading .spinner{animation:spin .8s linear infinite;display:inline}@keyframes spin{to{transform:rotate(1turn)}}.results-panel{opacity:0;background:#fff;border:1.5px solid var(--border);border-top:none;max-height:0;transition:max-height .4s cubic-bezier(.16,1,.3,1),opacity .3s;overflow:hidden;box-shadow:0 8px 32px #1a161214}.results-panel.open{opacity:1;max-height:1000px}.results-meta-bar{background:var(--cream-2);border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;padding:10px 16px;display:flex}.results-meta-left{align-items:center;gap:8px;display:flex}.r-chip{font-family:var(--mono);letter-spacing:.05em;text-transform:uppercase;border:1px solid var(--border);color:var(--ink-4);background:#fff;padding:2px 7px;font-size:10px;font-weight:500}.r-chip.fail{border-color:var(--red-mid);color:var(--red);background:var(--red-light)}.r-chip.pass{color:var(--green);background:var(--green-light);border-color:#a7e3c5}.results-stamp{font-family:var(--mono);letter-spacing:.08em;text-transform:uppercase;border:1.5px solid var(--red);color:var(--red);padding:2px 8px;font-size:9.5px;font-weight:500;display:inline-block;transform:rotate(-1deg)}.results-tabs{border-bottom:1px solid var(--border);background:var(--cream-2);display:flex}.r-tab{font-family:var(--mono);letter-spacing:.05em;text-transform:uppercase;color:var(--ink-4);cursor:pointer;border-right:1px solid var(--border);background:0 0;border-top:none;border-bottom:2px solid #0000;border-left:none;padding:8px 16px;font-size:10.5px;font-weight:500;transition:all .15s}.r-tab:hover{color:var(--ink-2);background:var(--cream)}.r-tab.active{color:var(--ink);border-bottom-color:var(--ink);background:#fff}.results-body{flex-direction:column;gap:10px;max-height:500px;padding:18px 16px;display:flex;overflow-y:auto}.results-body::-webkit-scrollbar{width:4px}.results-body::-webkit-scrollbar-track{background:0 0}.results-body::-webkit-scrollbar-thumb{background:var(--border-2)}.asset-header{border-bottom:1px solid var(--cream-3);justify-content:space-between;align-items:center;margin-bottom:2px;padding-bottom:10px;display:flex}.asset-name{font-family:var(--display);color:var(--ink);letter-spacing:-.02em;font-size:14px;font-weight:700}.asset-sub{color:var(--ink-3);margin-top:2px;font-size:11.5px;font-weight:300}.breach{border-left:3px solid var(--red);background:var(--red-light);padding:12px 14px;animation:slideIn .3s both}.breach.warn{border-left-color:var(--amber);background:var(--amber-light)}@keyframes slideIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.breach-top{justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:6px;display:flex}.breach-ref{font-family:var(--mono);color:var(--red);letter-spacing:.06em;font-size:10px;font-weight:500}.breach.warn .breach-ref{color:var(--amber)}.breach-sev{font-family:var(--mono);letter-spacing:.08em;text-transform:uppercase;border:1px solid var(--red-mid);color:var(--red);flex-shrink:0;padding:1px 6px;font-size:9px;font-weight:500}.breach.warn .breach-sev{color:var(--amber);border-color:#e6c87a}.breach-title{color:var(--ink);margin-bottom:4px;font-size:12.5px;font-weight:500}.breach-why{margin-bottom:6px}.breach-fix,.breach-why{color:var(--ink-2);font-size:12px;font-weight:300;line-height:1.55}.breach-fix{border-top:1px solid #c0392b26;padding-top:6px}.breach.warn .breach-fix{border-top-color:#9a6f2a26}.breach-fix b{color:var(--ink);font-weight:500}.rewrite-block{border-left:3px solid var(--green);background:var(--green-light);padding:12px 14px;animation:slideIn .3s .15s both}.rewrite-label{font-family:var(--mono);color:var(--green);letter-spacing:.08em;text-transform:uppercase;margin-bottom:5px;font-size:10px;font-weight:500}.rewrite-text{color:var(--ink-2);font-size:12.5px;font-weight:300;line-height:1.6}.copy-btn{font-family:var(--mono);color:var(--green);cursor:pointer;background:0 0;border:1px solid #a7e3c5;margin-top:8px;padding:2px 8px;font-size:10px;transition:all .15s}.copy-btn:hover{background:#fff}.pass-block{background:var(--green-light);border:1px solid #a7e3c5;align-items:center;gap:12px;padding:14px;display:flex}.pass-icon{font-size:18px}.pass-text{color:var(--green);font-size:12.5px;font-weight:400}.pass-sub{color:var(--ink-3);font-size:11.5px;font-weight:300}.results-foot{border-top:1px solid var(--border);background:var(--cream-2);justify-content:space-between;padding:10px 16px;font-size:10px}.proof-strip,.results-foot{font-family:var(--mono);color:var(--ink-4);align-items:center;display:flex}.proof-strip{justify-content:center;gap:24px;margin-top:18px;font-size:10.5px}.proof-item{align-items:center;gap:5px;display:flex}.proof-dot{background:var(--green);border-radius:50%;width:4px;height:4px}.proof-sep{background:var(--border-2);width:1px;height:12px}.page-rest{padding:0 32px 80px}.page-rest-inner{max-width:900px;margin:0 auto}.divider-line{border:none;border-top:1px solid var(--border);margin:64px 0}.coverage-strip{border:1px solid var(--border);grid-template-columns:repeat(3,1fr);gap:0;display:grid}.cov-cell{border-right:1px solid var(--border);padding:28px 24px;transition:background .15s}.cov-cell:last-child{border-right:none}.cov-cell:hover,.cov-icon-box{background:var(--cream-2)}.cov-icon-box{border:1px solid var(--border);justify-content:center;align-items:center;width:28px;height:28px;margin-bottom:14px;font-size:13px;display:flex}.cov-cell h3{font-family:var(--display);color:var(--ink);letter-spacing:-.02em;margin-bottom:6px;font-size:13.5px;font-weight:700}.cov-cell p{color:var(--ink-3);margin-bottom:10px;font-size:12.5px;font-weight:300;line-height:1.6}.cov-ref{font-family:var(--mono);color:var(--ink-4);border:1px solid var(--border);padding:2px 6px;font-size:9.5px;display:inline-block}.stats-row{background:var(--ink);border:1px solid #ffffff0f;grid-template-columns:repeat(3,1fr);margin:0 -32px;padding:40px 48px;display:grid}.s-cell{border-right:1px solid #ffffff14;padding:0 32px}.s-cell:last-child{border-right:none}.s-num{font-family:var(--display);color:#fff;letter-spacing:-.04em;margin-bottom:6px;font-size:40px;font-weight:800;line-height:1}.s-num .red{color:#e8876e}.s-lbl{font-family:var(--mono);color:#ffffff4d;letter-spacing:.08em;text-transform:uppercase;font-size:10px}.price-block{grid-template-columns:1fr 1fr;align-items:center;gap:48px;padding:0;display:grid}.price-card-sm{border:1px solid var(--border);background:var(--cream-2);padding:36px;position:relative}.price-label-sm{font-family:var(--mono);color:var(--ink-4);letter-spacing:.08em;text-transform:uppercase;margin-bottom:14px;font-size:10px}.price-num-sm{font-family:var(--display);color:var(--ink);letter-spacing:-.04em;margin-bottom:4px;font-size:64px;font-weight:800;line-height:1}.price-num-sm sup{font-size:28px}.price-period-sm{color:var(--ink-4);margin-bottom:24px;font-size:12.5px;font-weight:300}.price-items{flex-direction:column;gap:8px;margin-bottom:28px;list-style:none;display:flex}.price-items li{color:var(--ink-2);align-items:center;gap:8px;font-size:13px;font-weight:300;display:flex}.chk{font-family:var(--mono);color:var(--green);font-size:11px}.btn-price-sm{width:100%;font-family:var(--body);color:#fff;background:var(--ink);cursor:pointer;border:none;padding:12px;font-size:13.5px;font-weight:500;transition:background .15s}.btn-price-sm:hover{background:#333}.price-note-sm{font-family:var(--mono);color:var(--ink-4);text-align:center;margin-top:8px;font-size:10px}.price-right-sm h3{font-family:var(--display);letter-spacing:-.03em;color:var(--ink);margin-bottom:12px;font-size:28px;font-weight:800;line-height:1.1}.price-right-sm p{color:var(--ink-3);margin-bottom:18px;font-size:13.5px;font-weight:300;line-height:1.7}.guarantee-sm{border-left:3px solid var(--amber);background:var(--amber-light);padding:12px 14px}.guarantee-sm strong{font-family:var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--amber);margin-bottom:4px;font-size:9.5px;font-weight:500;display:block}.guarantee-sm p{color:var(--ink-2);font-size:12.5px;font-weight:300;line-height:1.6}footer{border-top:1px solid var(--border);background:var(--cream-2);padding:24px 32px}.footer-inner{justify-content:space-between;max-width:900px;margin:0 auto}.footer-brand,.footer-inner{align-items:center;display:flex}.footer-brand{gap:8px}.footer-brand-name{font-family:var(--display);color:var(--ink);letter-spacing:-.02em;font-size:13px;font-weight:800}.footer-tag{color:var(--ink-4);font-size:12px;font-weight:300}.footer-links{gap:20px;display:flex}.footer-links a{color:var(--ink-4);font-size:12px;text-decoration:none;transition:color .15s}.footer-links a:hover{color:var(--ink-2)}.footer-legal{font-family:var(--mono);color:var(--ink-4);font-size:10.5px}.loading-bar{background:var(--cream-3);height:2px;display:none;overflow:hidden}.loading-bar.active{display:block}.loading-bar-fill{background:var(--red);height:100%;animation:loadfill 1.8s ease-in-out infinite}@keyframes loadfill{0%{width:0;margin-left:0}50%{width:60%;margin-left:20%}to{width:0;margin-left:100%}}.sec-kicker{font-family:var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--ink-4);align-items:center;gap:10px;margin-bottom:20px;font-size:10.5px;font-weight:500;display:flex}.sec-kicker:before{content:"";background:var(--ink-4);width:14px;height:1px}.sec-title{font-family:var(--display);letter-spacing:-.03em;color:var(--ink);margin-bottom:8px;font-size:32px;font-weight:800}.sec-sub{color:var(--ink-3);margin-bottom:40px;font-size:14px;font-weight:300;line-height:1.65}@media (max-width:900px){.flank{display:none}.center-h{font-size:28px}.coverage-strip{grid-template-columns:1fr 1fr}.cov-cell:nth-child(2n){border-right:none}.stats-row{grid-template-columns:1fr;margin:0 -24px;padding:32px 24px}.s-cell{border-bottom:1px solid #ffffff14;border-right:none;padding:16px 0}.price-block{grid-template-columns:1fr}.footer-inner{text-align:center;flex-direction:column;gap:14px}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}
static/_next/static/media/0da54fcd0470ea43-s.woff2 ADDED
Binary file (11.3 kB). View file
 
static/_next/static/media/558ca1a6aa3cb55e-s.p.woff2 ADDED
Binary file (31.3 kB). View file
 
static/_next/static/media/636a5ac981f94f8b-s.p.woff2 ADDED
Binary file (27.3 kB). View file
 
static/_next/static/media/64d784ea54a4acde-s.woff2 ADDED
Binary file (6.8 kB). View file
 
static/_next/static/media/680a7121f7a85e3f-s.woff2 ADDED
Binary file (14.7 kB). View file
 
static/_next/static/media/6d831b18ae5b01dc-s.woff2 ADDED
Binary file (11.6 kB). View file
 
static/_next/static/media/6fe53d21e6e7ebd8-s.woff2 ADDED
Binary file (1.72 kB). View file
 
static/_next/static/media/8a1d8947e5852e30-s.p.woff2 ADDED
Binary file (34.6 kB). View file
 
static/_next/static/media/8ebc6e9dde468c4a-s.woff2 ADDED
Binary file (8.29 kB). View file
 
static/_next/static/media/9e7b0a821b9dfcb4-s.woff2 ADDED
Binary file (21.7 kB). View file
 
static/_next/static/media/ac0e76ddaeeb7981-s.woff2 ADDED
Binary file (8.89 kB). View file
 
static/_next/static/media/edc640959b0c7826-s.woff2 ADDED
Binary file (1.66 kB). View file
 
static/_next/static/media/ff71da380fbe67dd-s.woff2 ADDED
Binary file (5.87 kB). View file
 
static/index.html ADDED
@@ -0,0 +1 @@
 
 
1
+ <!DOCTYPE html><html lang="en" class="__variable_fada24 __variable_7da9e8 __variable_6d24ac" style="--display:var(--font-syne);--body:var(--font-body);--mono:var(--font-mono)"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/558ca1a6aa3cb55e-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/636a5ac981f94f8b-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/8a1d8947e5852e30-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/29c131a9787649b2.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-b4e161512712a12a.js"/><script src="/_next/static/chunks/fd9d1056-a1131c60010a8a5e.js" async=""></script><script src="/_next/static/chunks/117-107dc2e65c4ace24.js" async=""></script><script src="/_next/static/chunks/main-app-c835e4ccc4173445.js" async=""></script><script src="/_next/static/chunks/app/page-6d2f349a055fbf64.js" async=""></script><title>HitSafe.ai — FCA Compliance Intelligence</title><meta name="description" content="Screens ad copy, customer emails, onboarding documents, and campaign creatives against COBS 4 and Consumer Duty — flagging violations in seconds."/><meta name="next-size-adjust"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div class="min-h-screen"><nav><a href="#" class="nav-logo"><div class="logo-mark">HS</div>HitSafe.ai</a><ul class="nav-links"><li><a href="#coverage">Coverage</a></li><li><a href="#pricing">Pricing</a></li></ul><div class="nav-ctas"><button class="btn-ghost">Sign in</button><button class="btn-red">Start free →</button></div></nav><div class="ticker"><div class="ticker-inner"><span class="ticker-item"><span>ALERT</span><span class="hi">£47M in FCA fines issued for marketing violations — 2024</span></span><span class="ticker-item"><span>COBS 4.2.1R</span><span class="">risk warning mandatory in financial promotions, onboarding docs and emails</span></span><span class="ticker-item"><span>PS23/6</span><span class="hi">cryptoasset financial promotion rules now in force</span></span><span class="ticker-item"><span>DUTY</span><span class="">Consumer Duty covers all customer communications — not just ads</span></span><span class="ticker-item"><span>PRIN 2A.3</span><span class="">implied guaranteed returns now a category-1 breach across all channels</span></span><span class="ticker-item"><span>ALERT</span><span class="hi">£47M in FCA fines issued for marketing violations — 2024</span></span><span class="ticker-item"><span>COBS 4.2.1R</span><span class="">risk warning mandatory in financial promotions, onboarding docs and emails</span></span><span class="ticker-item"><span>PS23/6</span><span class="hi">cryptoasset financial promotion rules now in force</span></span><span class="ticker-item"><span>DUTY</span><span class="">Consumer Duty covers all customer communications — not just ads</span></span><span class="ticker-item"><span>PRIN 2A.3</span><span class="">implied guaranteed returns now a category-1 breach across all channels</span></span></div></div><div class="hero-shell"><div class="flank flank-left"><div class="flank-stat"><span class="red">£47M</span></div><div class="flank-label">FCA fines · 2024</div><div class="flank-rule">COBS 4.2.1R</div><br/><div class="flank-rule">COBS 4.5.2</div><br/><div class="flank-rule">PRIN 2A.3</div><br/><div class="flank-rule">PS23/6</div></div><div class="flank flank-right"><div class="flank-stat">15<span style="font-size:20px;color:var(--ink-4)">s</span></div><div class="flank-label">Per check</div><div class="flank-rule">Consumer Duty</div><br/><div class="flank-rule">Image Analysis</div><br/><div class="flank-rule">Safe Rewrites</div><br/><div class="flank-rule">Bulk Mode</div></div><div class="center-block"><div class="center-header"><div class="center-eyebrow">FCA Compliance Intelligence</div><h1 class="center-h">Paste your content. Find the<br/><em>breach</em> before the FCA does.</h1><p class="center-sub">Screens ad copy, customer emails, onboarding documents, and campaign creatives against COBS 4 and Consumer Duty — flagging violations in seconds, with compliant rewrites ready to use.</p></div><div class="analysis-box"><div class="box-label">Ad copy · Email · Onboarding · Risk disclosure · Social post</div><textarea class="box-textarea" rows="4" placeholder="Paste any customer-facing content — ad copy, email, onboarding document, risk disclosure, social post, or product page... e.g. &quot;Your crypto should work harder. Limited-time APY boost now live...&quot;"></textarea><div class="loading-bar "><div class="loading-bar-fill"></div></div><div class="box-footer"><div class="box-files"><button class="attach-btn"><svg width="11" height="11" viewBox="0 0 11 11" fill="none"><path d="M1 5.5h9M5.5 1v9" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"></path></svg>Attach screenshots</button><input type="file" multiple="" accept="image/*" style="display:none"/></div><button class="run-btn "><svg class="arrow" width="12" height="12" viewBox="0 0 12 12" fill="none"><path d="M2 6h8M6 2l4 4-4 4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg>Run analysis</button></div><div class="results-panel "></div></div><div class="proof-strip"><div class="proof-item"><div class="proof-dot"></div>Sub-15s per check</div><div class="proof-sep"></div><div class="proof-item"><div class="proof-dot"></div>COBS 4 + Consumer Duty</div><div class="proof-sep"></div><div class="proof-item"><div class="proof-dot"></div>No card required</div></div></div></div><div class="page-rest"><div class="page-rest-inner"><div class="stats-row" id="coverage"><div class="s-cell"><div class="s-num"><span class="red">£47</span>M</div><div class="s-lbl">FCA fines · 2024</div></div><div class="s-cell"><div class="s-num">&lt;15<span style="font-size:20px;color:rgba(255,255,255,0.4)">s</span></div><div class="s-lbl">Per compliance check</div></div><div class="s-cell"><div class="s-num">20</div><div class="s-lbl">Max assets per run</div></div></div><hr class="divider-line"/><div class="sec-kicker">What we check</div><h2 class="sec-title">Every rule. Every channel.</h2><p class="sec-sub">Ads, emails, onboarding flows, risk disclosures — wherever your team writes something a customer reads, HitSafe.ai checks it against COBS 4 and Consumer Duty before it goes live.</p><div class="coverage-strip"><div class="cov-cell"><div class="cov-icon-box">🛡</div><h3>COBS 4 · Financial Promotions</h3><p>Catches implied guarantees, missing risk warnings, and imbalanced return/risk framing — across ads, emails, and any customer-facing copy.</p><span class="cov-ref">FCA Coverage</span></div><div class="cov-cell" style="border-top:2px solid var(--red)"><div class="cov-icon-box" style="background:var(--red-light);border-color:var(--red-mid)">📋</div><h3>Consumer Duty · PRIN 2A</h3><p>Flags foreseeable harm across onboarding flows, product pages, risk disclosures, and fee communications — not just ads.</p><span class="cov-ref" style="color:var(--red);border-color:var(--red-mid);background:var(--red-light)">Consumer Duty</span></div><div class="cov-cell"><div class="cov-icon-box">🖼</div><h3>Image + Text + Documents</h3><p>Upload screenshots, paste email copy, or drop in onboarding text. The engine reads all of it — visual layout and written content together.</p><span class="cov-ref">All Formats</span></div></div><hr class="divider-line" id="pricing"/><div class="price-block"><div class="price-card-sm"><div class="price-label-sm">Monthly · Cancel anytime</div><div class="price-num-sm"><sup>£</sup>99</div><div class="price-period-sm">per month after free trial</div><ul class="price-items"><li><span class="chk">✓</span> Unlimited compliance checks</li><li><span class="chk">✓</span> Full COBS 4 + Consumer Duty</li><li><span class="chk">✓</span> Up to 20 assets per submission</li><li><span class="chk">✓</span> Image + text creative analysis</li><li><span class="chk">✓</span> Compliant rewrite drafts per issue</li><li><span class="chk">✓</span> No yearly charges. Cancel anytime.</li></ul><button class="btn-price-sm">Start free — no card required</button><p class="price-note-sm">£99/month after trial · Cancel anytime</p></div><div class="price-right-sm"><h3>One flat rate.<br/>Your whole team.</h3><p>No seat pricing. No per-check billing. No compliance consultant invoices. One clear price that covers every asset your team produces.</p><div class="guarantee-sm"><strong>Our commitment</strong><p>If HitSafe.ai fails to flag a clear COBS 4 breach that leads to an FCA inquiry during your subscription, we&#x27;ll refund your last 3 months. No questions asked.</p></div></div></div></div></div><footer><div class="footer-inner"><div class="footer-brand"><div class="logo-mark" style="width:20px;height:20px;font-size:9px">HS</div><span class="footer-brand-name">HitSafe.ai</span><span class="footer-tag">FCA compliance intelligence for fintech teams.</span></div><div class="footer-links"><a href="#">App</a><a href="/terms">Terms &amp; Conditions</a><a href="#">How it works</a></div><div class="footer-legal">Guidance only. Not legal advice. © 2026 HitSafe.ai</div></div></footer></div><script src="/_next/static/chunks/webpack-b4e161512712a12a.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/media/558ca1a6aa3cb55e-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n2:HL[\"/_next/static/media/636a5ac981f94f8b-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n3:HL[\"/_next/static/media/8a1d8947e5852e30-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n4:HL[\"/_next/static/css/29c131a9787649b2.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"5:I[2846,[],\"\"]\n7:I[9107,[],\"ClientPageRoot\"]\n8:I[7340,[\"931\",\"static/chunks/app/page-6d2f349a055fbf64.js\"],\"default\",1]\n9:I[4707,[],\"\"]\na:I[6423,[],\"\"]\nc:I[1060,[],\"\"]\nd:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L5\",null,{\"buildId\":\"0mBJPWUKUunnYLUByCsLJ\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"\"],\"initialTree\":[\"\",{\"children\":[\"__PAGE__\",{}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"__PAGE__\",{},[[\"$L6\",[\"$\",\"$L7\",null,{\"props\":{\"params\":{},\"searchParams\":{}},\"Component\":\"$8\"}],null],null],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/29c131a9787649b2.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"__variable_fada24 __variable_7da9e8 __variable_6d24ac\",\"style\":{\"--display\":\"var(--font-syne)\",\"--body\":\"var(--font-body)\",\"--mono\":\"var(--font-mono)\"},\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L9\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$La\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[null,\"$Lb\"],\"globalErrorComponent\":\"$c\",\"missingSlots\":\"$Wd\"}]\n"])</script><script>self.__next_f.push([1,"b:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"HitSafe.ai — FCA Compliance Intelligence\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Screens ad copy, customer emails, onboarding documents, and campaign creatives against COBS 4 and Consumer Duty — flagging violations in seconds.\"}],[\"$\",\"meta\",\"4\",{\"name\":\"next-size-adjust\"}]]\n6:null\n"])</script></body></html>
static/index.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ 2:I[9107,[],"ClientPageRoot"]
2
+ 3:I[7340,["931","static/chunks/app/page-6d2f349a055fbf64.js"],"default",1]
3
+ 4:I[4707,[],""]
4
+ 5:I[6423,[],""]
5
+ 0:["0mBJPWUKUunnYLUByCsLJ",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},[["$L1",["$","$L2",null,{"props":{"params":{},"searchParams":{}},"Component":"$3"}],null],null],null]},[[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/29c131a9787649b2.css","precedence":"next","crossOrigin":"$undefined"}]],["$","html",null,{"lang":"en","className":"__variable_fada24 __variable_7da9e8 __variable_6d24ac","style":{"--display":"var(--font-syne)","--body":"var(--font-body)","--mono":"var(--font-mono)"},"children":["$","body",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[]}]}]}]],null],null],["$L6",null]]]]
6
+ 6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"HitSafe.ai — FCA Compliance Intelligence"}],["$","meta","3",{"name":"description","content":"Screens ad copy, customer emails, onboarding documents, and campaign creatives against COBS 4 and Consumer Duty — flagging violations in seconds."}],["$","meta","4",{"name":"next-size-adjust"}]]
7
+ 1:null
static/terms/index.html ADDED
@@ -0,0 +1 @@
 
 
1
+ <!DOCTYPE html><html lang="en" class="__variable_fada24 __variable_7da9e8 __variable_6d24ac" style="--display:var(--font-syne);--body:var(--font-body);--mono:var(--font-mono)"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/558ca1a6aa3cb55e-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/636a5ac981f94f8b-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/8a1d8947e5852e30-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/29c131a9787649b2.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-b4e161512712a12a.js"/><script src="/_next/static/chunks/fd9d1056-a1131c60010a8a5e.js" async=""></script><script src="/_next/static/chunks/117-107dc2e65c4ace24.js" async=""></script><script src="/_next/static/chunks/main-app-c835e4ccc4173445.js" async=""></script><script src="/_next/static/chunks/972-3f7c4aa698825992.js" async=""></script><script src="/_next/static/chunks/app/terms/page-c0b6f8da64e42b92.js" async=""></script><title>HitSafe.ai — FCA Compliance Intelligence</title><meta name="description" content="Screens ad copy, customer emails, onboarding documents, and campaign creatives against COBS 4 and Consumer Duty — flagging violations in seconds."/><meta name="next-size-adjust"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div class="min-h-screen bg-white relative overflow-hidden text-zinc-900"><div class="fixed inset-0 scan-lines opacity-[0.03] pointer-events-none"></div><div class="fixed inset-0 noise-overlay pointer-events-none"></div><header class="flex items-center justify-between px-6 py-4 border-b border-zinc-100 bg-white/80 backdrop-blur-md sticky top-0 z-50"><a class="flex items-center gap-2.5 group" href="/"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-shield w-6 h-6 text-emerald-600 group-hover:rotate-12 transition-transform" aria-hidden="true"><path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"></path></svg><div class="flex flex-col"><span class="terminal-text text-sm font-black tracking-tighter text-zinc-900 leading-none">REGTECH<span class="text-emerald-600">DEMO</span></span><span class="text-[9px] text-zinc-400 terminal-text font-bold mt-0.5">COMPLIANCE FRAMEWORK</span></div></a><a class="flex items-center gap-2 px-3 py-1.5 text-[10px] font-bold terminal-text text-zinc-500 hover:text-emerald-600 border border-zinc-100 rounded-lg transition-all" href="/"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-left w-3.5 h-3.5" aria-hidden="true"><path d="m15 18-6-6 6-6"></path></svg><span>BACK TO TERMINAL</span></a></header><main class="relative z-10 max-w-4xl mx-auto px-6 py-16 md:py-24"><div class="flex items-center gap-3 mb-8"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-text w-8 h-8 text-zinc-300" aria-hidden="true"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"></path><path d="M14 2v5a1 1 0 0 0 1 1h5"></path><path d="M10 9H8"></path><path d="M16 13H8"></path><path d="M16 17H8"></path></svg><h1 class="text-4xl font-black text-zinc-900 tracking-tight">Terms &amp; Conditions</h1></div><div class="prose prose-zinc max-w-none space-y-12"><section class="terminal-border p-8 rounded-2xl bg-zinc-50/50"><h2 class="text-xl font-bold terminal-text text-zinc-800 mb-4">1. SCOPE OF SERVICE</h2><p class="text-zinc-600 leading-relaxed">RegTechDemo provides an automated regulatory analysis tool (&quot;The Terminal&quot;) for financial promotions. Our AI engine identifies potential breaches of <strong>FCA COBS 4</strong>, <strong>PRIN 2A</strong>, and <strong>PS23/6</strong>. The service is provided for guidance and rapid screening only.</p></section><section class="space-y-4"><h2 class="text-xl font-bold terminal-text text-zinc-800">2. NO LEGAL ADVICE</h2><div class="p-6 bg-amber-50 border border-amber-100 rounded-2xl flex gap-4"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-triangle-alert w-6 h-6 text-amber-500 shrink-0" aria-hidden="true"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg><p class="text-sm text-amber-900 leading-relaxed font-medium">The results provided by The Terminal do not constitute legal advice or formal compliance sign-off. Final determination of regulatory compliance remains the sole responsibility of the firm and its compliance officers.</p></div></section><section class="grid md:grid-cols-2 gap-8"><div class="terminal-border p-6 rounded-xl"><h3 class="text-sm font-bold terminal-text text-zinc-800 mb-3">DATA PRIVACY</h3><p class="text-sm text-zinc-500 leading-relaxed">Assets submitted for scan are processed in real-time. We do not use your proprietary ad copy or media to train general-purpose models. All processing is GDPR compliant.</p></div><div class="terminal-border p-6 rounded-xl"><h3 class="text-sm font-bold terminal-text text-zinc-800 mb-3">LIABILITY</h3><p class="text-sm text-zinc-500 leading-relaxed">RegTechDemo is not liable for any regulatory fines or enforcement actions resulting from campaigns screened through our platform.</p></div></section></div><div class="mt-20 pt-10 border-t border-zinc-100 flex flex-col md:flex-row items-center justify-between gap-6"><div class="flex items-center gap-2 text-[10px] text-zinc-400 terminal-text font-bold"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-globe w-3 h-3 text-zinc-300" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"></path><path d="M2 12h20"></path></svg><span>GLOBAL REGULATORY CLEARANCE LEVEL: GUIDANCE</span></div><a class="px-8 py-3 bg-zinc-900 text-white font-bold rounded-xl hover:bg-zinc-800 transition-all text-sm" href="/">AGREE &amp; RETURN TO SCANNER</a></div></main></div><script src="/_next/static/chunks/webpack-b4e161512712a12a.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/media/558ca1a6aa3cb55e-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n2:HL[\"/_next/static/media/636a5ac981f94f8b-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n3:HL[\"/_next/static/media/8a1d8947e5852e30-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n4:HL[\"/_next/static/css/29c131a9787649b2.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"5:I[2846,[],\"\"]\n7:I[2972,[\"972\",\"static/chunks/972-3f7c4aa698825992.js\",\"571\",\"static/chunks/app/terms/page-c0b6f8da64e42b92.js\"],\"\"]\n8:I[4707,[],\"\"]\n9:I[6423,[],\"\"]\nb:I[1060,[],\"\"]\nc:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L5\",null,{\"buildId\":\"0mBJPWUKUunnYLUByCsLJ\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"terms\",\"\"],\"initialTree\":[\"\",{\"children\":[\"terms\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"terms\",{\"children\":[\"__PAGE__\",{},[[\"$L6\",[\"$\",\"div\",null,{\"className\":\"min-h-screen bg-white relative overflow-hidden text-zinc-900\",\"children\":[[\"$\",\"div\",null,{\"className\":\"fixed inset-0 scan-lines opacity-[0.03] pointer-events-none\"}],[\"$\",\"div\",null,{\"className\":\"fixed inset-0 noise-overlay pointer-events-none\"}],[\"$\",\"header\",null,{\"className\":\"flex items-center justify-between px-6 py-4 border-b border-zinc-100 bg-white/80 backdrop-blur-md sticky top-0 z-50\",\"children\":[[\"$\",\"$L7\",null,{\"href\":\"/\",\"className\":\"flex items-center gap-2.5 group\",\"children\":[[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-shield w-6 h-6 text-emerald-600 group-hover:rotate-12 transition-transform\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"oel41y\",{\"d\":\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"}],\"$undefined\"]}],[\"$\",\"div\",null,{\"className\":\"flex flex-col\",\"children\":[[\"$\",\"span\",null,{\"className\":\"terminal-text text-sm font-black tracking-tighter text-zinc-900 leading-none\",\"children\":[\"REGTECH\",[\"$\",\"span\",null,{\"className\":\"text-emerald-600\",\"children\":\"DEMO\"}]]}],[\"$\",\"span\",null,{\"className\":\"text-[9px] text-zinc-400 terminal-text font-bold mt-0.5\",\"children\":\"COMPLIANCE FRAMEWORK\"}]]}]]}],[\"$\",\"$L7\",null,{\"href\":\"/\",\"className\":\"flex items-center gap-2 px-3 py-1.5 text-[10px] font-bold terminal-text text-zinc-500 hover:text-emerald-600 border border-zinc-100 rounded-lg transition-all\",\"children\":[[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-chevron-left w-3.5 h-3.5\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"1wnfg3\",{\"d\":\"m15 18-6-6 6-6\"}],\"$undefined\"]}],[\"$\",\"span\",null,{\"children\":\"BACK TO TERMINAL\"}]]}]]}],[\"$\",\"main\",null,{\"className\":\"relative z-10 max-w-4xl mx-auto px-6 py-16 md:py-24\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-3 mb-8\",\"children\":[[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-file-text w-8 h-8 text-zinc-300\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"1oefj6\",{\"d\":\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"}],[\"$\",\"path\",\"wfsgrz\",{\"d\":\"M14 2v5a1 1 0 0 0 1 1h5\"}],[\"$\",\"path\",\"b1mrlr\",{\"d\":\"M10 9H8\"}],[\"$\",\"path\",\"t4e002\",{\"d\":\"M16 13H8\"}],[\"$\",\"path\",\"z1uh3a\",{\"d\":\"M16 17H8\"}],\"$undefined\"]}],[\"$\",\"h1\",null,{\"className\":\"text-4xl font-black text-zinc-900 tracking-tight\",\"children\":\"Terms \u0026 Conditions\"}]]}],[\"$\",\"div\",null,{\"className\":\"prose prose-zinc max-w-none space-y-12\",\"children\":[[\"$\",\"section\",null,{\"className\":\"terminal-border p-8 rounded-2xl bg-zinc-50/50\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"text-xl font-bold terminal-text text-zinc-800 mb-4\",\"children\":\"1. SCOPE OF SERVICE\"}],[\"$\",\"p\",null,{\"className\":\"text-zinc-600 leading-relaxed\",\"children\":[\"RegTechDemo provides an automated regulatory analysis tool (\\\"The Terminal\\\") for financial promotions. Our AI engine identifies potential breaches of \",[\"$\",\"strong\",null,{\"children\":\"FCA COBS 4\"}],\", \",[\"$\",\"strong\",null,{\"children\":\"PRIN 2A\"}],\", and \",[\"$\",\"strong\",null,{\"children\":\"PS23/6\"}],\". The service is provided for guidance and rapid screening only.\"]}]]}],[\"$\",\"section\",null,{\"className\":\"space-y-4\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"text-xl font-bold terminal-text text-zinc-800\",\"children\":\"2. NO LEGAL ADVICE\"}],[\"$\",\"div\",null,{\"className\":\"p-6 bg-amber-50 border border-amber-100 rounded-2xl flex gap-4\",\"children\":[[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-triangle-alert w-6 h-6 text-amber-500 shrink-0\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"wmoenq\",{\"d\":\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\"}],[\"$\",\"path\",\"juzpu7\",{\"d\":\"M12 9v4\"}],[\"$\",\"path\",\"p32p05\",{\"d\":\"M12 17h.01\"}],\"$undefined\"]}],[\"$\",\"p\",null,{\"className\":\"text-sm text-amber-900 leading-relaxed font-medium\",\"children\":\"The results provided by The Terminal do not constitute legal advice or formal compliance sign-off. Final determination of regulatory compliance remains the sole responsibility of the firm and its compliance officers.\"}]]}]]}],[\"$\",\"section\",null,{\"className\":\"grid md:grid-cols-2 gap-8\",\"children\":[[\"$\",\"div\",null,{\"className\":\"terminal-border p-6 rounded-xl\",\"children\":[[\"$\",\"h3\",null,{\"className\":\"text-sm font-bold terminal-text text-zinc-800 mb-3\",\"children\":\"DATA PRIVACY\"}],[\"$\",\"p\",null,{\"className\":\"text-sm text-zinc-500 leading-relaxed\",\"children\":\"Assets submitted for scan are processed in real-time. We do not use your proprietary ad copy or media to train general-purpose models. All processing is GDPR compliant.\"}]]}],[\"$\",\"div\",null,{\"className\":\"terminal-border p-6 rounded-xl\",\"children\":[[\"$\",\"h3\",null,{\"className\":\"text-sm font-bold terminal-text text-zinc-800 mb-3\",\"children\":\"LIABILITY\"}],[\"$\",\"p\",null,{\"className\":\"text-sm text-zinc-500 leading-relaxed\",\"children\":\"RegTechDemo is not liable for any regulatory fines or enforcement actions resulting from campaigns screened through our platform.\"}]]}]]}]]}],[\"$\",\"div\",null,{\"className\":\"mt-20 pt-10 border-t border-zinc-100 flex flex-col md:flex-row items-center justify-between gap-6\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2 text-[10px] text-zinc-400 terminal-text font-bold\",\"children\":[[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-globe w-3 h-3 text-zinc-300\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"circle\",\"1mglay\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],[\"$\",\"path\",\"13o1zl\",{\"d\":\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\"}],[\"$\",\"path\",\"9i4pu4\",{\"d\":\"M2 12h20\"}],\"$undefined\"]}],[\"$\",\"span\",null,{\"children\":\"GLOBAL REGULATORY CLEARANCE LEVEL: GUIDANCE\"}]]}],[\"$\",\"$L7\",null,{\"href\":\"/\",\"className\":\"px-8 py-3 bg-zinc-900 text-white font-bold rounded-xl hover:bg-zinc-800 transition-all text-sm\",\"children\":\"AGREE \u0026 RETURN TO SCANNER\"}]]}]]}]]}],null],null],null]},[null,[\"$\",\"$L8\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"terms\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L9\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/29c131a9787649b2.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"__variable_fada24 __variable_7da9e8 __variable_6d24ac\",\"style\":{\"--display\":\"var(--font-syne)\",\"--body\":\"var(--font-body)\",\"--mono\":\"var(--font-mono)\"},\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L8\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L9\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[null,\"$La\"],\"globalErrorComponent\":\"$b\",\"missingSlots\":\"$Wc\"}]\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"HitSafe.ai — FCA Compliance Intelligence\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Screens ad copy, customer emails, onboarding documents, and campaign creatives against COBS 4 and Consumer Duty — flagging violations in seconds.\"}],[\"$\",\"meta\",\"4\",{\"name\":\"next-size-adjust\"}]]\n6:null\n"])</script></body></html>
static/terms/index.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ 2:I[2972,["972","static/chunks/972-3f7c4aa698825992.js","571","static/chunks/app/terms/page-c0b6f8da64e42b92.js"],""]
2
+ 3:I[4707,[],""]
3
+ 4:I[6423,[],""]
4
+ 0:["0mBJPWUKUunnYLUByCsLJ",[[["",{"children":["terms",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["terms",{"children":["__PAGE__",{},[["$L1",["$","div",null,{"className":"min-h-screen bg-white relative overflow-hidden text-zinc-900","children":[["$","div",null,{"className":"fixed inset-0 scan-lines opacity-[0.03] pointer-events-none"}],["$","div",null,{"className":"fixed inset-0 noise-overlay pointer-events-none"}],["$","header",null,{"className":"flex items-center justify-between px-6 py-4 border-b border-zinc-100 bg-white/80 backdrop-blur-md sticky top-0 z-50","children":[["$","$L2",null,{"href":"/","className":"flex items-center gap-2.5 group","children":[["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-shield w-6 h-6 text-emerald-600 group-hover:rotate-12 transition-transform","aria-hidden":"true","children":[["$","path","oel41y",{"d":"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"}],"$undefined"]}],["$","div",null,{"className":"flex flex-col","children":[["$","span",null,{"className":"terminal-text text-sm font-black tracking-tighter text-zinc-900 leading-none","children":["REGTECH",["$","span",null,{"className":"text-emerald-600","children":"DEMO"}]]}],["$","span",null,{"className":"text-[9px] text-zinc-400 terminal-text font-bold mt-0.5","children":"COMPLIANCE FRAMEWORK"}]]}]]}],["$","$L2",null,{"href":"/","className":"flex items-center gap-2 px-3 py-1.5 text-[10px] font-bold terminal-text text-zinc-500 hover:text-emerald-600 border border-zinc-100 rounded-lg transition-all","children":[["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-chevron-left w-3.5 h-3.5","aria-hidden":"true","children":[["$","path","1wnfg3",{"d":"m15 18-6-6 6-6"}],"$undefined"]}],["$","span",null,{"children":"BACK TO TERMINAL"}]]}]]}],["$","main",null,{"className":"relative z-10 max-w-4xl mx-auto px-6 py-16 md:py-24","children":[["$","div",null,{"className":"flex items-center gap-3 mb-8","children":[["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-file-text w-8 h-8 text-zinc-300","aria-hidden":"true","children":[["$","path","1oefj6",{"d":"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"}],["$","path","wfsgrz",{"d":"M14 2v5a1 1 0 0 0 1 1h5"}],["$","path","b1mrlr",{"d":"M10 9H8"}],["$","path","t4e002",{"d":"M16 13H8"}],["$","path","z1uh3a",{"d":"M16 17H8"}],"$undefined"]}],["$","h1",null,{"className":"text-4xl font-black text-zinc-900 tracking-tight","children":"Terms & Conditions"}]]}],["$","div",null,{"className":"prose prose-zinc max-w-none space-y-12","children":[["$","section",null,{"className":"terminal-border p-8 rounded-2xl bg-zinc-50/50","children":[["$","h2",null,{"className":"text-xl font-bold terminal-text text-zinc-800 mb-4","children":"1. SCOPE OF SERVICE"}],["$","p",null,{"className":"text-zinc-600 leading-relaxed","children":["RegTechDemo provides an automated regulatory analysis tool (\"The Terminal\") for financial promotions. Our AI engine identifies potential breaches of ",["$","strong",null,{"children":"FCA COBS 4"}],", ",["$","strong",null,{"children":"PRIN 2A"}],", and ",["$","strong",null,{"children":"PS23/6"}],". The service is provided for guidance and rapid screening only."]}]]}],["$","section",null,{"className":"space-y-4","children":[["$","h2",null,{"className":"text-xl font-bold terminal-text text-zinc-800","children":"2. NO LEGAL ADVICE"}],["$","div",null,{"className":"p-6 bg-amber-50 border border-amber-100 rounded-2xl flex gap-4","children":[["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-triangle-alert w-6 h-6 text-amber-500 shrink-0","aria-hidden":"true","children":[["$","path","wmoenq",{"d":"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"}],["$","path","juzpu7",{"d":"M12 9v4"}],["$","path","p32p05",{"d":"M12 17h.01"}],"$undefined"]}],["$","p",null,{"className":"text-sm text-amber-900 leading-relaxed font-medium","children":"The results provided by The Terminal do not constitute legal advice or formal compliance sign-off. Final determination of regulatory compliance remains the sole responsibility of the firm and its compliance officers."}]]}]]}],["$","section",null,{"className":"grid md:grid-cols-2 gap-8","children":[["$","div",null,{"className":"terminal-border p-6 rounded-xl","children":[["$","h3",null,{"className":"text-sm font-bold terminal-text text-zinc-800 mb-3","children":"DATA PRIVACY"}],["$","p",null,{"className":"text-sm text-zinc-500 leading-relaxed","children":"Assets submitted for scan are processed in real-time. We do not use your proprietary ad copy or media to train general-purpose models. All processing is GDPR compliant."}]]}],["$","div",null,{"className":"terminal-border p-6 rounded-xl","children":[["$","h3",null,{"className":"text-sm font-bold terminal-text text-zinc-800 mb-3","children":"LIABILITY"}],["$","p",null,{"className":"text-sm text-zinc-500 leading-relaxed","children":"RegTechDemo is not liable for any regulatory fines or enforcement actions resulting from campaigns screened through our platform."}]]}]]}]]}],["$","div",null,{"className":"mt-20 pt-10 border-t border-zinc-100 flex flex-col md:flex-row items-center justify-between gap-6","children":[["$","div",null,{"className":"flex items-center gap-2 text-[10px] text-zinc-400 terminal-text font-bold","children":[["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-globe w-3 h-3 text-zinc-300","aria-hidden":"true","children":[["$","circle","1mglay",{"cx":"12","cy":"12","r":"10"}],["$","path","13o1zl",{"d":"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"}],["$","path","9i4pu4",{"d":"M2 12h20"}],"$undefined"]}],["$","span",null,{"children":"GLOBAL REGULATORY CLEARANCE LEVEL: GUIDANCE"}]]}],["$","$L2",null,{"href":"/","className":"px-8 py-3 bg-zinc-900 text-white font-bold rounded-xl hover:bg-zinc-800 transition-all text-sm","children":"AGREE & RETURN TO SCANNER"}]]}]]}]]}],null],null],null]},[null,["$","$L3",null,{"parallelRouterKey":"children","segmentPath":["children","terms","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined"}]],null]},[[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/29c131a9787649b2.css","precedence":"next","crossOrigin":"$undefined"}]],["$","html",null,{"lang":"en","className":"__variable_fada24 __variable_7da9e8 __variable_6d24ac","style":{"--display":"var(--font-syne)","--body":"var(--font-body)","--mono":"var(--font-mono)"},"children":["$","body",null,{"children":["$","$L3",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[]}]}]}]],null],null],["$L5",null]]]]
5
+ 5:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"HitSafe.ai — FCA Compliance Intelligence"}],["$","meta","3",{"name":"description","content":"Screens ad copy, customer emails, onboarding documents, and campaign creatives against COBS 4 and Consumer Duty — flagging violations in seconds."}],["$","meta","4",{"name":"next-size-adjust"}]]
6
+ 1:null