Compare commits

...

188 Commits

Author SHA1 Message Date
Adminator 3dba841830 Lizenz-Feinschliff: CSV-Mailanhang, Lehrer-Listenspalten, Klassenliste-Haken
- Mailanhang bei grossen Chargen: zusaetzlich zur .txt jetzt auch .csv
  (gleiche reine Codeliste), Dateiname <ExtBestellnr|Datum>_geograsim_<intNr>.
- Lehrer-Lizenzlisten (zugewiesen + frei): vorne laufende Nr., Eingeloest am,
  Gueltig bis (Backend liefert redeemed_at + valid_until).
- Klassenliste Lizenz-Spalte: nur Haken (gruen) bzw. "fehlt" (rot); Tooltip
  zeigt Lizenznummer + gueltig bis. "Gueltig" via unlicensed-Liste (nicht
  storniert/abgelaufen). Bulk-Auswahl/Zaehler nutzen jetzt dieselbe Wahrheit.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-27 11:33:44 +02:00
Adminator ff889865e1 Lizenz-Gate: Schueler ohne Lizenz gesperrt + Lehrer-Cockpit-Warnung
Teil 1 — Schueler-Lizenz-Gate (gilt fuer alle Klassen-Schueler ohne gueltige
Lizenz = zugewiesen, nicht storniert, nicht abgelaufen):
- Server-Gate zentral im Front-Controller (index.php + php/lib/license_gate.php):
  eingeloggte Klassen-Schueler ohne Lizenz sehen bei JEDER Sim-Route statt der
  Simulation eine Hinweis-Seite "Deine Lehrperson muss dir noch eine gueltige
  Lizenz zuweisen". Schnell-Ausstieg fuer Nicht-Schueler/Nicht-Sim (kein Cookie
  -> keine DB-Abfrage). Autodidakt ohne Klasse: nicht lizenzpflichtig.
- modules.php?student=1 liefert 'licensed'; Schueler-Cockpit (schueler.html)
  zeigt oben die Meldung und sperrt die Start-Buttons.

Teil 2 — Lehrer-Cockpit:
- Rote Warnleiste ganz oben, wenn Schueler:innen ohne gueltige Lizenz in der
  Klasse sind (+ Link "Jetzt zuweisen"). licenses?class_id=X liefert dazu die
  Liste 'unlicensed'.
- Lizenzen-Lasche: neue Sektion "Ohne gueltige Lizenz" mit Einzel- und
  Sammel-Zuweisung (auto_assign) — sonst fuehrt die Warnung ins Leere.

Kunden-Vereinfachung (Feedback): keine Auto-Erkennung/Dedup mehr (Ansprech-
partner koennen wechseln). Kunde = Freitext "Name/Verlag/Schule" + Mailadresse,
je Bestellung gespeichert. Editierbares Kundennummer-Feld + Autocomplete entfernt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-26 16:15:16 +02:00
Adminator eea5688c76 Lizenz-Vertrieb: CSV-Download ohne Kopfzeile (nur Codes)
Auf Wunsch: txt und csv liefern beide reine Code-Zeilen (eine pro Zeile,
keine Metadaten-Kopfzeile) -> direkt per Copy-Paste einloesbar. Nur die
Datei-Endung/MIME unterscheidet sich. Dateiname unveraendert
<ExtBestellnr|Datum>_geograsim_<interneNr>.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-26 15:36:52 +02:00
Adminator 50c72fa8d8 Lizenz-Vertrieb Feinschliff: Zugabe +10%, sichere Datei-Einloesung, Mail-Config
Umsetzung des Thomas-Feedbacks:
- Reihenfolge: freie Lizenzen beim Lehrer jetzt ORDER BY id (= Reihenfolge der
  reinkopierten Liste); stornierte ausgeblendet.
- Gratis-Zugabe: Checkbox (Default an) "+10 % aufgerundet" -> geliefert =
  ceil(bestellt*1.1) (14 -> 16). Batch speichert qty_ordered (verrechnet) und
  qty (geliefert); Live-Vorschau im Formular.
- Einloeselink/QR ENTFERNT (Sicherheitsrisiko: falscher eingeloggter Account).
  einloesen.html + pages/einloesen.php geloescht, Sammellink aus UI/Mail raus.
- CSV: Gueltig-bis + Metadaten nur in der KOPFZEILE, danach reine Code-Zeilen
  (per Copy-Paste einloesbar). Dateiname: <ExtBestellnr|Datum>_geograsim_<intNr>.
- Interne Bestellnummer = batch.id (laufend, nicht editierbar, storno-stabil).
- Lehrer-Einloesen: sichere .txt/.csv-Ablage (mehrstufig: Endung+MIME, Groessen-
  limit, nur Text lesen, Whitelist-Regex extrahiert nur Code-Tokens, Server
  validiert) — kein Upload, keine Ausfuehrung/Rendering.
- Mailsystem: zentrale Config in neuer app_settings (Provider server|aws,
  Absender-Name/-Adresse, oeffentliche URL), pflegbar in Admin + Test-Versand.
  Mailer liest Absender aus Config (SMTP-Zugang bleibt in .env). Mailtext nutzt
  kanonische geograsim.at (nicht v3/localhost).

Migrationen: -2 (qty_ordered), -3 (app_settings). Beide additiv, auf v3 angewandt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-26 11:15:53 +02:00
Adminator 96a73e22b2 Lizenz-Vertrieb: Chargen-Vergabe, Storno, Verlaengerung, Mail, Einloeselink
Erweitert das Lizenzmodul um eine Vertriebs-/Vergabe-Schicht ueber dem
bestehenden Einloese-Flow (non-breaking, alle Alt-Codes + generate/redeem
/assign unveraendert).

Schema (Migration 2026-08-26-lizenz-vertrieb.sql, additiv):
- license_customers (Besteller: Kundennummer/Email/Name)
- license_batches (Bestellung/Charge: externe Bestellnummer, Typ, Menge,
  Gueltigkeit, Sammel-Einloesetoken, Storno)
- licenses += batch_id, issued_at, valid_from/until (pro Code -> Verlaengerung),
  canceled_at/reason; code auf VARCHAR(32) (laengere Codes)
- license_mails (Mail-Archiv, unabh. vom IMAP), license_redeem_attempts
  (Brute-Force-Schutz), license_events (Audit-Log)

Backend (php/api/licenses.php):
- issue_batch: N frische 100-Bit-Codes in Transaktion, sofort vergeben,
  an Kunde/Bestellung/Gueltigkeit gebunden; sticky Default Gueltig-bis
- Uebersicht (view=batches mit Aggregat ausgegeben/storniert/netto/eingeloest
  /abgelaufen), batch_detail, Kunden-Autocomplete, sales_default
- cancel_batch/cancel_license, extend_batch/extend_license
- send_batch_mail (Server-Treiber via Mailer, archiviert, Anhang bei >40)
- redeem_charge (Sammel-Einloeselink)
- Brute-Force-Bremse + Audit + Storno-Ablehnung im redeem/redeem_batch

UI (admin-licenses.html): Ausgabe-Formular (Bestaetigung bei Grossmengen),
Ergebnis mit Copy/Download(txt+csv)/Mail-Composer/Sammellink, Bestellungs-
Uebersicht mit Filtern + Detail-Modal (Storno/Verlaengern/Verlauf/Mails).

Einloese-Landingpage (einloesen.html + pages/einloesen.php): ?charge=Token
(alle auf einmal) und ?code=CODE, mit Lehrer-Login-Gate.

Lib: Database Transaktionen; Mailer sendWithAttachments + renderPlainBody.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-26 01:39:14 +02:00
Adminator 7691649f37 Farmer Anbaugebiete: SO-Afrika-Polygon + Blickwinkel-Hinweis (Klima vs. Ertrag)
- koeppen-zones.json: eigenes subtropisch_feucht-Polygon ueber SO-Afrika
  (KwaZulu-Natal/Lowveld, lon 25-33 / lat -34..-22). Vorher fiel die Region
  durch bis zum groben Breitengrad-Fallback (+ fehlerhafter Wueste-Streifen im
  Sueden). Jetzt intentional per Polygon klassifiziert.
- game.html: Ernte-Bericht zeigt bei knapper Eignung (S3) einen schuelerlichten
  "Blickwinkel"-Hinweis: die Sim bewertet die NATUERLICHE Klima-Eignung; mit
  Bewaesserung/Schutz ernten Profis auch dort viel (Banane z.B. in Suedafrika,
  Ertrags-Weltmeister Syrien). Klima-Eignung != Anbau-Effizienz.
- Eignungswerte unveraendert: subtropische Banane bleibt bewusst S3.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-26 00:29:12 +02:00
Adminator bb4d3b4cb6 heli-uebersicht: Cockpit-Link -> Haus-Icon (unser Stil) auf /schueler; Zur-Simulation-Button entfernt
Cockpit-Pille (fuehrte auf /sim ins Leere) ersetzt durch schwebendes
Haus-Icon -> /schueler (Schueler-Module). Zur-Simulation-Button raus,
da die Seite via target=_blank oeffnet (sonst mehrere Fenster).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 23:51:34 +02:00
Adminator b109ebb099 Heli: vorhandene Phasen-Links auf App-Icon-Stil (Option 2, kein Umbau)
Home/Hilfe/Uebersichtskarte als schwebende Icon-Buttons (Home/?/Karten-Pin)
statt Text/Emoji; Positionen als Icon-Cluster angepasst. Kein Header-Umbau,
keine JS-Aenderung (IDs/Handler unveraendert).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 22:57:18 +02:00
Adminator 93c742b381 Sonnensystem: Onboarding-Button auf ?-Icon (wie andere Sims), i weggelassen
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 22:48:41 +02:00
Adminator ff91c489f7 Sonnensystem: Aufgaben + Onboarding-Info in den Header (eigene Icons)
- obs-open-btn (Aufgaben, Klemmbrett-Icon) + obs-help-btn (Onboarding,
  Info-i-Icon) in den Header vor die Musik verschoben; obs-launcher weg.
- Redundantes help-toggle (moonTilt-?) aus dem Header entfernt, Handler
  null-sicher (moonTilt weiter ueber Inline-? in der Mondbahn-Sektion).
- obs-Pill-CSS neutralisiert (Header-Stil greift).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 22:39:37 +02:00
Adminator 085b0b6aa8 Sonnensystem-Header-Fixes: Pille-Breite, obs-launcher, eigene Icons
- Komponente: .ggs-header--float bekommt display:flex (war auf design-
  system.css angewiesen) -> behebt volle-Breite-Pille bei Sims ohne
  design-system (Sonnensystem).
- obs-launcher (Aufgaben/Info) unter den Header (top 64, links 268).
- Eigene SVG-Icons: Leichte-Sprache (Textseite), Lights (Gluehbirne),
  Theme (Sonne/Mond-Umschaltung) statt Emoji.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 21:43:30 +02:00
Adminator 637c058507 Sonnensystem: einheitliche Kopfzeile oben, #ui + Top-Elemente nach unten
- ggs-header (Overlay) oben: Titel-Pille + Toolbar-Buttons (Home/Reset/BGM/
  Hilfe iconisiert, Easy/Light/Theme als Sim-Buttons) rechts oben.
- Toolbar + Titel aus #ui entfernt; #ui nach unten (top 62).
- Datums-Banner (top 64) und Lupe (top 104, inkl. renderInspect-Offset)
  unter den Header geschoben.
- Komponente: cockpit-link/home, reset-defaults-toggle/reset, help-toggle/
  help, bgm-toggle/music erkannt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 21:10:47 +02:00
Adminator 5b6c25bcd9 Sonnensystem: linke Sidebar schmaler (280->244), Datum-Feld + lange Labels gekuerzt
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 20:48:04 +02:00
Adminator 77a3e2f16c Sonnensystem: Lupen-Beschriftung skaliert mit den Stufen (kleiner bei 50/25 %)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 20:43:27 +02:00
Adminator 3f29ad0533 Sonnensystem: Umbenennung + Lupe mit 3 Stufen (iPad)
- Titel Himmelsmechanik -> Sonnensystem.
- Lupe (#inspect-frame) in 3 Stufen 100/50/25 % ueber Eck-Griff unten
  rechts: Frame-Groesse (CSS) + Render-Groesse (lupeScale in renderInspect)
  synchron -> Inhalt schrumpft mit. Behebt die riesige Lupe am iPad.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 20:17:41 +02:00
Adminator 248a46f829 Tourismus-Icons: Reduzierte-Animation als Funkeln (durchgestrichen wenn
aktiv), Tal-Log-Glocke, Tal-Meldungsmodus Sprechblase/ABC

- Komponente: generisches Zwei-Zustands-Icon (.ic-state-on/.ic-state-off
  via .active) -> reduzierte Animation zeigt durchgestrichenes Funkeln.
- Region: Schildkroete -> Funkeln (mit Aus-Zustand).
- Tal: btnLog -> Glocken-SVG; _syncInfoModeBtn -> Sprechblase (Audio) /
  ABC (Lese-Modus) statt Emoji (Buch war fuers Glossar vergeben).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 19:50:57 +02:00
Adminator 2e9ad6a83f Tourismusregion: eigene SVG-Icons (Log/Anim/Kamera) + Tempo ganz links
- Komponente: Tempo-Steuerung an erste Aktions-Position (ganz links),
  Rest ans Ende.
- Region: 🔔/🐢/🎯 durch eigene SVG-Icons ersetzt (logBadge erhalten).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 19:34:02 +02:00
Adminator 6009eabca1 ggs-header: Tourismustal + Tourismusregion (Batch 2)
- Komponente: btnHome/⌂-Erkennung (ganzer Header durchsucht), sim-eigener
  Musik-Toggle (btnMusic) -> Musik-Icon, Panel-Optik (blur/shadow/radius)
  gestrippt fuer Sims mit .panel-Leiste.
- Beide Tourismus-Sims: topbar -> ggs-header (Klassen additiv, alle IDs +
  ui.js-Bindings erhalten), Tempo-Popover ueber .ggs-speed, Musik bleibt
  eigenes Panel (btnMusic oeffnet es). ggs-header.css vor style.css fuer
  position:fixed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 17:46:46 +02:00
Adminator 41731254b1 ggs-quick-intro: alwaysShow-Option; Busfahrt zeigt Onboarding bei jedem Besuch
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 17:19:14 +02:00
Adminator 1dffef8200 Busfahrt: nur EIN Onboarding (Welcome-Overlay abgeloest)
Ursache 2x: Busfahrt zeigte sein eigenes #welcome-overlay UND das
GgsQuickIntro-Onboarding. Jetzt ist GgsQuickIntro das einzige Start-Gate:
- ggs-quick-intro: onStart-Callback (feuert einmal beim Schliessen bzw.
  sofort wenn schon gesehen), isSeen exportiert.
- Busfahrt: welcome-overlay wird nicht mehr gezeigt; onStart -> startGame;
  startGame wartet per Retry auf boot() (kein Timing-Problem).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 17:09:28 +02:00
Adminator 496fc59c7b Busfahrt: Neustart-Button + Onboarding-Doppelung abgesichert
- ggs-quick-intro: open() entfernt vorab alle vorhandenen Overlays (nie 2x).
- Busfahrt: Neustart-Button (btn-reset, location.reload mit Rueckfrage).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 16:54:34 +02:00
Adminator 8f89613eee Busfahrt: Auftrags-Card tiefer, EN-Button -> Onboarding Seite 2, Texte
- ggs-quick-intro.js: optionale zweite Seite (config.page2 {title, html})
  mit Weiter/Zurueck-Navigation. Rueckwaertskompatibel (ohne page2 = 1 Seite).
- Busfahrt: EN-Button entfernt; die "Warum Englisch?"-Erklaerung liegt jetzt
  auf Onboarding-Seite 2 + Satz zur mehrsprachigen Hintergrundmusik.
- Onboarding-Schritte ohne lange "-" ausformuliert.
- Auftrags-Card (.bf-order) 20px tiefer (top 84).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 16:32:32 +02:00
Adminator 6135dd2648 Busfahrt: Vollbreite-Header (Logo/Haus links, Rest rechts), Karten nach
unten, eigenes Kartennamen-Icon

- Header wieder Vollbreite: Pille+Home links, Steuerung rechts.
- Auftrags-Card (.bf-order) + Info-Card (.bf-info) top 8 -> 64 (unter den
  rechten Buttons, keine Ueberlappung).
- Beschriftung-ein/aus (black-map-toggle): eigenes Tag-SVG statt Emoji
  (an = Tag, aus = Tag durchgestrichen), auch in applyTileVariant.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 16:23:12 +02:00
Adminator aab9b35781 Busfahrt v2: Header kompakt-links, Budget/Auftrag nach links, Zoom unten
- Header kompakt links (nicht mehr Vollbreite) -> keine Ueberlappung mit
  der Auftrags-Karte oben rechts.
- Budget aus Header raus (widersprach dem Graph); Graph-Budget-Wert wird
  jetzt live in updateTopbar aktualisiert. updateTopbar null-sicher.
- Auftrag-Nr ins Stats-Panel (links bei den Graphen).
- Leaflet-Zoom nach unten links.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 16:14:09 +02:00
Adminator 014eb418a6 Busfahrt: ggs-header eingebaut (Batch 2)
ggs-topbar -> ggs-header (Vollbreite, klick-durchlaessig), Titel ohne
Emoji, Logo-Fallback, KPIs (Budget/Auftrag/Nacht) bleiben als Pillen,
eigener Musik-Player in #ggs-music gewrappt (Popup), Sim-Buttons
(Beschriftung/EN-Info) + Ton/Hilfe/Home + Plattform-Glossar. Keine
Elemente entfernt (alle IDs/onclicks erhalten).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 15:54:57 +02:00
Adminator e901f5addb Farmer: Markt + Erntejahr wieder untereinander (gestapelt), gleich breit/hoch
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 15:47:37 +02:00
Adminator abc8bf5149 Farmer: Markt + Erntejahr gleich breit/hoch nebeneinander (nicht mehr Vollbreite)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 15:39:49 +02:00
Adminator 54772180a2 Farmer-Feinschliff: Markt+Erntejahr gleich breit, Buch -> Plattform-Glossar
- farmer-side-status: Markt-Feld und Erntejahr-Button beide volle Box-Breite.
- Kaputte interne Fachinfo (openInfoModal) raus; Komponente ergaenzt den
  Glossar-Button (/glossar?module=farmer, neuer Tab).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 15:36:01 +02:00
Adminator 4cbdb6bbb1 Farmer: Klick-Blocker gefixt (updateMoneyDisplay-Crash) + Konsolidierung
ROOT CAUSE: #money-display aus Header entfernt, aber updateMoneyDisplay()
las es beim Boot ungeschuetzt -> null.textContent wirft -> Boot bricht ab
-> map.on('click') wird nie gebunden -> Sim unbedienbar. Jetzt null-safe.

Konsolidierung (Thomas-Wunsch): Jahr/Markt/Erntejahr-starten in die
Anbau-Versuch-Box (farmer-side-status) statt separater Jahr-Leiste;
Jahr-Badge aus der Pille raus. Anbau-Box wieder hoeher (top 64).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 15:31:33 +02:00
Adminator b835475ef7 Fix: schwebende Kopfzeile blockierte Karten-Klicks (Farmer unbedienbar)
Ursache: die transparente ggs-header ueber der Vollbild-Leaflet-Karte
fing alle Klicks ab -> Pflanzen unmoeglich. Fix zentral: Container
pointer-events:none, nur Bedienelemente pointer-events:auto (Karte
darunter bleibt bedienbar). Gilt fuer alle Karten/Canvas-Sims.

Farmer: Pille nach links (Vollbreite-Header, Steuerung rechts),
Leaflet-Zoom nach unten links verschoben.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 15:20:33 +02:00
Adminator ec746f250f Header-Komponente: Bespoke-Fixes (Logo-Verzerrung, Icon-Groesse, Glossar-Icon)
- Logo-Kreis resettet Padding/Border/min-height (Sim-eigenes a-Styling
  vererbte sich -> verzerrter Logo-Kreis).
- .ic-Groesse (20px) auch fuer Buttons/Links ohne .ggs-btn-ghost-Klasse
  (Lautsprecher/Hilfe rendeten riesig).
- Sim-interne Glossar-Buttons (glossar-btn u.a.) bekommen das Buch-Icon
  statt Emoji.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 15:07:09 +02:00
Adminator 6c2990aa5e Farmer-Header v2 nach Thomas-Feedback + Default-Musikplayer
- Header nach oben RECHTS (raus aus dem Leaflet-Zoom oben links),
  Geld-Anzeige entfernt (steht in linker Sidebar), Emoji aus Titel,
  Jahr als Badge in die Pille (Konsistenz mit Batch 1), Inter-Font.
- Jahr-Leiste + Anbau-Versuch-Spalte nach unten geschoben (unter Header).
- Komponente: wiederverwendbarer Default-Musikplayer (data-ggs-music,
  Klima-Tracks als Plattform-Standard) + Musik-Widget-Styling fuer Sims
  ohne design-system.css.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 15:02:18 +02:00
Adminator 7b1bdb8d1b ggs-header Batch 2 Start: Farmer + Komponenten-Vorruestung
- Komponente: Logo-Fallback (Kreis-Logo wenn Sim keins hat), Overlay-Modus
  (data-ggs-overlay fuer Vollbild-Canvas), generische Icon-Button-Optik fuer
  Aktionen ohne .ggs-btn-ghost-Klasse, Ton-IDs erweitert (audio-toggle/btnSound).
- Farmer als erstes Bespoke-Muster: ggs-topbar -> ggs-header, schwebende Pille
  (Fallback-Logo + Titel) + Geld-KPI + Icon-Buttons; interne Fachinfo bleibt
  (data-ggs-no-glossar).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 14:33:53 +02:00
Adminator c913522a77 Kofferdetektiv: Kopfzeile schwebt ueber Vollbild-3D (schwarzer Balken weg)
#stage jetzt inset:0 (Canvas bis ganz oben), Header position:absolute
transparent darueber. Obere HUD-Pillen + Minimap + Karten-Button unter
die Kopfzeile geschoben (top 14->64, btn-map 166->216).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 14:20:36 +02:00
Adminator 502f271f36 Einheitliche Sim-Kopfzeile (Entwurf B) als Komponente + Lizenz-Datenmodell
- ggs-header.css/.js: schwebende Pillen-Kopfzeile aus vorhandenem
  .ggs-header-Markup (Kreis-Logo/Titel/Level als eine Pille, eigene
  SVG-Icons, Tempo-Panel links + Zustandsbutton, Musik-Panel unten,
  30% transparente Untermenues, Glossar target=_blank, Lehrplan raus).
  Enhance-Ansatz: Spiel-Logik (IDs/Klassen, data-speed) bleibt unberuehrt.
- Eingebaut in Klima 2D/3D, Fluss, Logistik (Auto-Tempo), Energiemanager,
  Kofferdetektiv 3D.
- admin-licenses.html: Datenmodell-Sektion (licenses-Tabelle, Lebenszyklus
  Generiert->Eingeloest->Zugewiesen, Beziehungen, Jahr->Schuljahr->Code).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 14:06:41 +02:00
Adminator 362aaba883 Feinschliff-Spalten + Kopfzeilen-Panels (Placement/Transparenz)
- teacher.html Aktuell-Spalten: Weltkueche '🏆 Punkte' (score), Fluss
  '👥 Einw.' + '🌾 Ernte' (population/food), Busfahrt '📍 Ø km' (avgTapKm).
  (Kofferdetektiv Items-% vertagt: Sim liefert live noch keine Item-Zahl.)
- admin-styleguide.html Kopfzeile: Untermenues 30% transparent (Blur);
  Tempo oeffnet links + bleibt offen, Musik klappt nach unten + schliesst
  nach Song-Auswahl; Toggle per Klick.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 13:04:32 +02:00
Adminator 88e3c09e5c Per-Sim leistung_pct: alle 14 Sims senden das eine Leistungs-% (0-100)
Jede Sim liefert jetzt selbst leistung_pct in GGS_LIVE_STATE UND im Submit
(Fundament fuer das einheitliche %-System) — kein Rueckrechnen aus Sternen
mehr, keine 0-3-Sonderfaelle. Formeln je Sim wie vereinbart:
- klima/fluss/kofferdetektiv/heli: = vorhandener 0-100-score
- weltkueche: richtige/(richtige+falsche)*100 (Fehler in %)
- busfahrt/fluggesellschaft: topoPunkte/(Auftraege*3)*100
- farmer: gewichteter totalScore; energiemanager: ausgegl./gesamt -15/Blackout
- eu-werkstatt: firstTry/Schritte -5/Muelleimer; sonnensystem: Erstversuch-Quote
- tourismustal: Ziele+Zufriedenheit+Natur gewichtet; tourismusregion: gewichteter score
- logistik: Kontostand->% (sendet erstmals eine Kennzahl, auch an /api/assessment)
Teacher _leistungPct + live.php extractScore bevorzugen bereits diesen Wert.
Additive Aenderungen, bestehende Logik/Sterne unveraendert; alle 15 Dateien
syntaktisch geprueft.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 12:35:56 +02:00
Adminator 539f6b012e leistung_pct-Fundament (Teacher+Backend bevorzugen) + Tempo-Button-Zustaende
- teacher.html _leistungPct: von der Sim geliefertes s.leistung_pct hat
  Vorrang, sonst zentrale Ableitung (Fallback).
- live.php extractScore: leistung_pct (0-100) hat Vorrang vor score/Sterne.
- admin-styleguide.html: Tempo-Button zeigt IMMER den Stand (1x/2x/8x Auto/
  Pause); Toggle-Verhalten (Panel bleibt offen bis erneutem Klick) beschrieben.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 12:31:23 +02:00
Adminator 7e1a7c5228 Kopfzeile: nur Entwurf B, eigene SVG-Icons, aufgeklappte Controls
- A und C entfernt, nur schwebende Variante B.
- Emojis raus -> eigene SVG-Icons im App-Stil (Home/Tempo/Musik/Ton/
  Neustart/Hilfe/Glossar) via <symbol>/<use>.
- Logo (bildLogo.png) + Titel + Level in EINER Pille, alle Elemente 38px
  hoch, gleiche Hoehe (Hoehen-Mismatch behoben).
- Tempo (Segmente Pause/1x/2x/4x) und Musikplayer (Song-Dropdown + Play +
  Lautstaerke) zusaetzlich in aufgeklappter Version dargestellt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 11:40:50 +02:00
Adminator ce7bff3184 Drilldown-Metriken: schwarze Balken -> farbig + Sterne raus (sim-metrics.js)
bar() faerbte ueber ivm-CSS-Klassen, die im Schueler-Drilldown fehlen ->
Balken erschienen schwarz. Jetzt INLINE gefaerbt (ivmColor = _pctColor-Skala).
starsBlock (Heli Start/Landung) zeigt jetzt %+Balken statt Sterne.
pct/pctInv/ratio/money/temp/bool ebenfalls inline gefaerbt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 11:34:25 +02:00
Adminator 89d4d8587e Teacher-Fixes (Heli-Flugplan, Modul-Label) + Kopfzeilen-Entwuerfe
- teacher.html: Modul-Detail-Spalte 'Sterne' -> 'Leistung' (zeigt %-Balken).
  Heli 'Aktuell': neue Spalte 'Flugplan' (kumuliert Wegpunkt/Treffer/Fehlkl.),
  die drei Detailspalten bleiben, 'Gesamt' entfaellt (Leistung deckt es ab).
- admin-styleguide.html: neue Sektion 'Kopfzeile' mit 3 Entwuerfen
  (A durchgehend / B schwebend / C schwebend+halbtransparent), je als
  iPad- und Full-HD-Mockup ueber simuliertem Sim-Inhalt. Glossar target=_blank,
  Neustart drin, Lehrplan raus.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 11:28:03 +02:00
Adminator a4e57d7aa6 Cockpit-Triage + Sterne->%+Balken durchgaengig (teacher.html)
Cockpit (Uebersicht):
- Farben auf kanonische Palette (--ivg..--ivr = _pctColor-Hex); ivAmp-
  Schwellen auf 50/60/80/90.
- ivTriage neu: >=90 Fordern (kann alles) / 50-89 Laeuft gut /
  <50 & fleissig -> Begleiten / <50 sonst -> Foerdern. Bestaetigen entfaellt.
- Fleiss im Klassenvergleich (_fleissig = 0.5*Zeit + 0.5*Durchgaenge >= Schnitt),
  fuer HEUTE- und insgesamt-Triage. IV_META-Texte angepasst.

Sterne raus -> %+Balken (colorblind-freundlich):
- _pctBadge (Run-Karten) neu. Alle 7 Run-Karten + generische Sonnensystem-
  Karte auf %+Balken (Busfahrt/Flug rechnen /3). Heli Start/Landung/Gesamt-
  Spalten in Aktuell auf _pctBar. Spectator, Drilldown (ivStars,
  Top-Performers), fmtMetric, Heli-Detail: Balken bzw. %.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 10:17:05 +02:00
Adminator 3bc0f418be Bewertungs-Vorschau: EINE Skala-Darstellung + 4-stufige Triage
- Doppeldarstellung (Beispiel-Balken + Legende) zu EINER Tabelle
  zusammengefuehrt: Farbe + Bereich + Label + Beispiel-Balken je Zeile.
  Beispielwert = Bereichsschwelle (90/80/60/50), nicht willkuerlich.
- Triage jetzt 4 Felder an denselben Farbgrenzen:
  <50 Foerdern (Hilfe) / 50-79 Begleiten / 80-89 Laeuft gut /
  >=90 Fordern (herausfordern). Styleguide + Preview angeglichen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 02:51:50 +02:00
Adminator 0a6fa2172f Einheitliche Leistungs-Skala (%) + Farbcodes ueberall vereinheitlicht
- Schwellen NEU (Thomas): >=90 Dunkelgruen / >=80 Hellgruen / >=60 Gelb /
  >=50 Orange / <50 Rot. Sterne entfallen.
- teacher.html: _pctColor (kanonisch) — _tagTraffic + _liveBar + _liveBarColor
  delegieren jetzt alle daran (EINE Skala; 'niedrig-ist-gut' invertiert).
  Neu: _leistungPct(simId,state) = das eine 0-100-% je Sim (eigener Score
  oder abgeleitet), _pctBar (kompakt, schmal). Neue Spalte 'Leistung' in
  'Aktuell'. _liveMood aus _leistungPct (>=80 gut / >=50 mittel / <50) —
  deckungsgleich mit Triage Foerdern/Begleiten/Laeuft gut (50/80).
- admin-styleguide.html: neue Sektion 'Leistungs-Skala' (5 Stufen, %+Balken,
  Triage, CSS-Variablen).
- admin-lehrer-view.html: Schwellen/Triage/Preview auf neue Werte, Balken
  kompakt, Sterne-Hinweis raus.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 02:37:33 +02:00
Adminator c79ef691ad Lehrer-View-Uebersicht: Vorschau einheitliches Leistungs-% (Sterne raus)
- Vorschau-Karte: %+Balken-Standardanzeige, 5-stufige Farbskala,
  Triage-Felder (Foerdern/Begleiten/Laeuft gut) aus %xFleiss mit
  Grenzen = Farbgrenzen (50/65), damit Farbe<->Feld immer stimmen.
- Neue Spalte 'Leistung' je Sim: Vorschlags-Formel auf die Testdaten
  gerechnet (PERF), als pctBar + Triage-Chip. Busfahrt/Flug/Sonnensystem
  Naeherung (Rohwerte fehlen in Testdaten).
- Bewertungs-Block je Sim um 'Vorschlag %' (PROPOSED_PCT) erweitert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 02:25:35 +02:00
Adminator bf579310ed Lehrer-View-Uebersicht: Sterne- + Prozent-Formeln je Sim dokumentiert
- Globale Erklaer-Box: wie der Zeilen-% entsteht (live.php extractScore:
  Score sonst Sterne/5x100) + Uneinheitlichkeiten (0-3 vs 0-5 Sterne,
  rohe score-Werte, Weltkueche pro Gericht, Logistik sendet nichts) +
  Vorschlag 'ein System' (% = Wahrheit, Sterne abgeleitet, gleiche Schwellen).
- Pro Sim ein Bewertungs-Block mit exakter Sterne-Formel + Prozent-Herkunft
  (aus dem Sterne-Audit der Game-Files) inkl. Warnhinweisen.
- Tourismustal: Gaeste-Spalte auf gruen (Gesamtgaeste = Spielfaktor).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 01:24:05 +02:00
Adminator 691387c4d8 Admin: Lehrer-View Parameter-Ueberblick Schuelerleistung
Neue Referenzseite /admin-lehrer-view.html: pro Sim (14, der Reihe nach)
die 'Ergebnisse/Aktuell'-Tabelle mit Testdaten, gerendert mit der ECHTEN
Logik (LIVE_PRIMARY_FIELDS + Formatter aus teacher.html gespiegelt).
- Unter jedem Spaltentitel der State-Key (Spiel->Backend-Verkabelung).
- Spalten GRUEN, die nach Abschluss relevant bleiben (Ergebnis/Fortschritt/
  Identitaet), GRAU = nur live; je Sim Begruendungs-Liste der Grau-Spalten.
Verlinkt aus admin-sitemap.html.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-24 19:37:26 +02:00
Adminator 62e903a5ec Kofferdetektiv iPad-Performance: sicheres Buendel (Aufloesung + AA + GPU)
Nur auf Touch-Geraeten (Desktop unveraendert):
- Render-Aufloesung auf dpr 1.3 gedeckelt (dprCap-Helper) statt bis 2 —
  dpr 2 = 4x Pixel war der teuerste Posten.
- antialias aus (MSAA teuer auf Mobile), Retina-Dichte kaschiert Kanten.
- powerPreference:'high-performance' fuer die staerkere GPU-Pipeline.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-24 14:13:35 +02:00
Adminator 11c48817de Kofferdetektiv iPad: zwei feste Joysticks (immer 50% sichtbar)
Statt schwebendem Links-Joystick + Rechts-Wisch jetzt zwei feste,
halbtransparente Joysticks:
- links = Umsehen (Auge 👁), ratenbasiertes Drehen/Neigen in update()
- rechts = Bewegen (Fuß 🦶)
Touch wird dem naeheren Joystick im Fangradius zugewiesen (assign/stickVec).
Interaktions-Button (🧳) nach unten-mittig verschoben (kollidierte sonst
mit dem rechten Bewegungs-Joystick). Joysticks nur auf Touch sichtbar
(body.kd-touch).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-24 13:57:20 +02:00
Adminator 8ec005f889 EU-Werkstatt: Probierzuege (Karten rausziehen) erfassen + Sterne ehrlicher
Bisher konnte man Karten in Slots einsetzen und wieder herausziehen, bis
alle voll waren — erst dann wurde ausgewertet. Dieses Herumprobieren war
unsichtbar und senkte die Sterne nicht (5 Sterne trotz Trial-and-Error).

- game.html: reshufflesByStep/totalReshuffles; manuelles Herausziehen einer
  platzierten Karte zaehlt als Probierzug. Ein Schritt gilt nur ohne
  Probierzuege als 'sauber auf Anhieb' -> Sterne (firstTryHits/steps) und
  Treffsicher-Achievement spiegeln Trial-and-Error jetzt. Endbild zeigt
  '🔄 N Probierzuege'; Live-State + Submit tragen die Zahlen.
- teacher.html: needsHelp eu-werkstatt auch bei vielen Probierzuegen;
  '🔄 Probier'-Spalte in Aktuell; Run-Karte: Gesamt-Probierzuege +
  pro Schritt ('🔄 nach Probieren' statt 'auf Anhieb').

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-24 13:33:44 +02:00
Adminator 7de71b0e83 Energiemanager: Blackouts fuer Lehrer sichtbar machen
- game.html: bei Blackout sofort action:'blackout' an /progress feuern
  (setId/Tag/Block/Frequenz/Ursache, score:0) — Fehlversuch bleibt auch
  bei Set-Abbruch sichtbar, kein player_progress/Sterne.
- progress.php: neuer action:'blackout' -> eigene assessments-Zeile,
  KEIN XP/plays/best_stars.
- live.php: Blackout-Flag (event:'blackout') durch die Tag-Summary reichen
  (blackout/blackoutCount pro Session).
- teacher.html: needsHelp energiemanager (>=2 Blackouts oder Tag <4/8);
  Blackout-Spalte + '🔌 neu planen'-Status in Aktuell; Tag-Balken als
  🔌 Blackout kennzeichnen; Run-Karte: eigenes Blackout-Kaertchen +
  '🔌 N Blackouts'-Badge im fertigen Set.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-24 13:19:21 +02:00
Adminator b77f4ed912 Tag-Ansicht: student_results einbeziehen + Datum/Zoom-Verhalten
- live.php summary: fertige Laeufe aus student_results ergaenzt (dedupliziert gegen assessment/
  live) -> JEDER heutige Durchgang erscheint als Balken, egal ueber welchen Submit-Pfad.
- teacher.html: Ergebnisse-Tab/Menuewechsel setzt Datum auf HEUTE + Regler auf Auto zurueck;
  Datumswahl/Heute setzt Regler auf Auto; Auto-Zoom jetzt +/-1 h um die Aktivitaet.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-24 09:33:32 +02:00
Adminator 868cdda276 Fluss-Endscreen: zwei Felder (Rueckmeldung -> Aktionen) + Badges nebeneinander
Feld 1 = Rueckmeldung (Sterne/Stats/Badges/Reflexion) mit "Weiter"-Button (erst nach
Reflexions-Antwort aktiv); Feld 2 = "Wie geht's weiter?" (Stufen/Erneut versuchen +
Zurueck zur Startseite). end-badges jetzt display:flex (nebeneinander statt gestapelt).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-24 09:19:10 +02:00
Adminator 9a1ee0fae1 Tag-Zeitachse: gestauchte Skala - Nacht 00-06 und Abend 21-24 je 1 Block, Tag 06-21 stuendlich
Regler UND Zeitachse/Balken nutzen dieselbe Stunde-Einheit-Abbildung (_hourToUnit/_unitToHour,
17 gleich breite Bloecke). Nacht-/Abend-Bloecke dunkel ohne interne Linien; Tag stuendlich
beschriftet + Trennlinien. Auto-Default rundet auf Block-Grenzen. Marker an den Block-Grenzen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 22:23:34 +02:00
Adminator 1e1c1238bd Stadt & Raumplanung auf 'geplant' (In Vorbereitung, nicht spielbar) in v3 + Prod-SQL notiert
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 21:51:58 +02:00
Adminator de104e915a Tag-Zeitstrahl: keine Trennlinien in den Nacht-Baendern (zusammengefasst)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 21:50:13 +02:00
Adminator 193c6dcc8f Tag-Zeitstrahl: 23 Stunden-Trennlinien + stuendliche Beschriftung + dunklere Nachtzeiten (00-01/20-24)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 21:48:33 +02:00
Adminator 74736a33aa Tag-Ansicht: Zeitfenster-Doppelschieberegler (00-24 Uhr, stuendlich) ueber der Tabelle
Default = Auto (erste bis letzte Aktivitaet, auf volle Stunden). Zwei Fader zum
Zusammenschieben (z.B. aktuelle Stunde). Balken werden aufs Fenster gekappt (overflow).
"Ganzer Zeitraum"-Reset zurueck auf Auto.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 21:42:27 +02:00
Adminator f7bf0f0901 Fix: alle heutigen Leistungen zaehlen (Ben) + Live-Session started_at bei Modulwechsel (Clara)
- live.php: ON DUPLICATE KEY UPDATE-Reihenfolge korrigiert (started_at VOR module_id), sonst
  wird der Modulwechsel nie erkannt -> Balken behielt alten Startzeitpunkt (Clara EU-Werkstatt seit 14:30).
- results.php view=today: liefert todayScores (Pro-Schueler-Aggregat aus student_results, zuverlaessig).
- teacher.html HEUTE-Triage: fertige Laeufe aus student_results + laufende aus Summary zusammengefuehrt;
  Totalversagen heute (<40) -> Foerdern. Ben (klima 36) erscheint jetzt korrekt in Foerdern.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 15:21:04 +02:00
Adminator cc83493055 Lehrer-Live: idle-pausierte gelten in Aktuell als pausiert (nicht aktiv) + Tag-App-Symbol immer sichtbar
- Aktuell: paused beruecksichtigt jetzt __idlePaused/__paused (heartbeatet trotz Pause weiter)
  -> kein Widerspruch mehr "navigiert UND pausiert" (Klara).
- Tag: App-Symbol als immer sichtbares Overlay am Balkenstart, auch bei winzigem Balken (darf ueberstehen).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 15:11:20 +02:00
Adminator abbc0580c5 Heli M17: A10-Tauern-Zielpunkt auf Tauerntunnel-Nordportal (lag 7km noerdlich im Gebirge)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 15:07:51 +02:00
Adminator be7d9fce1a Empfehlung: 6. Karte 'Laeuft gut' in gleicher Form (volle Liste mit Balken) statt Kompakt-Streifen
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 15:05:08 +02:00
Adminator da1e6e6e87 Weltkueche: correct_for im Spiel scharfgeschaltet (V3)
ING-Build kopiert jetzt v.correct_for -> der bestehende Heimat-Branch (ing.correct_for[heimat])
liefert die kuratierten Zweit-Laender: mehl->Ungarn, majoran->DE, safran->Iran, feta/lamm->
Bulgarien (statt Gravitations-Schaetzung). Datenkonsistenz geprueft (Moussaka feta/lamm).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 14:50:13 +02:00
Adminator bc468272ba Heli M10: A2-Baden-Zielpunkt zurueck auf die A2-Linie (DB-Wert lag daneben); Prod-SQL ergaenzt
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 14:36:26 +02:00
Adminator 4976582400 Heli Routenplanung: Timing-basierte Wertung (3 Stufen) + Bonus vor rotem Hint
Pro Wegpunkt: 2=Treffer VOR der roten Einblendung (Bonus) · 1=waehrend der 10 s · 0=danach.
computePlanStars() aus Ø-Timing (5/4/3/2/1); Fehlklick-Abbruch bleibt 0. wpRevealAt merkt
Reveal-Zeitpunkt, onPlanClick klassifiziert. Bonus im Endbildschirm + Assessment (planBeforeRed).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 14:32:02 +02:00
Adminator bf5b026b46 Heli-Wegpunkt-Fix: Prod-SQL persistent im Repo (Live-DB hat gleiche Luecke)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 14:04:32 +02:00
Adminator 77023ff7a3 Heli: fehlende Wegpunkte-Datenluecke behoben + Routing-Score = Klick-Genauigkeit
- 5 Wegpunkte fehlten in geo_waypoints (bodensee_bregenz/kaiser_kufstein/felswand_raetikon/
  schlucht_mellau/maria_saal) -> Missionen M5/M7 u.a. hingen nach dem vorletzten WP. In v3-DB
  eingespielt; Prod-SQL in .dontDeploy (Live-DB gleiche Luecke). waypoints.js: maria_saal ergaenzt.
- GGS_LIVE_STATE score: Routing zaehlt jetzt Klick-Genauigkeit (richtige/alle) statt Fortschritt
  -> kein roter Tag-Balken mehr am Planungs-Anfang (0 Klicks = grau, nicht rot).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 14:03:53 +02:00
Adminator aaa40e9f1a Heli Aktuell: letzten Einsatz in der Auftragswahl behalten
game.html: bei Mission-Ende Snapshot game.lastResult (Start/Landung/Gesamt); GGS_LIVE_STATE
zeigt in mission/briefing den letzten Einsatz statt leerer Spalten. teacher.html Status:
"✓/⚠ letzter Einsatz" wenn Werte aus dem letzten Lauf stammen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 13:57:57 +02:00
Adminator 0d9481cae2 Tag-Ansicht: pausierte Zeiten bleiben als Verlauf stehen (verschwinden nicht mehr)
live-client loggt Pausen-Spannen (__pauseSpans: {s,e}), live.php reicht sie durch,
renderLiveSummary zeichnet jede als bleibendes halbhohes Segment im Tag-Balken
(offene/laufende Pause blinkt). Fallback fuer Sim-Pause via phase bleibt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 12:53:07 +02:00
Adminator 0d765961af Idle-Pause fuer Heli funktionsfaehig + iframe-aware Interaktionserfassung
- Interaktionen aus gleich-origin iFrames (Heli-Start/-Flug/-Landung) zaehlen jetzt
  (periodisches _hookFrame), plus postMessage {type:'ggs-activity'} + __GGS_LIVE__.ping().
  Aktives Steuern gilt nicht mehr faelschlich als idle.
- EVENTS erweitert (keyup/touchmove/pointermove). Heli in IDLE_PAUSE_SIMS aufgenommen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 12:50:30 +02:00
Adminator 7986bb2eb6 Heli: Treibstoff kann leer werden (1★-Takeover) + Live-Score fuer Tag-Farbe + Aktuell-Status/Phase
- start.html: Sprit-Floor 0.05->0; Treibstoff-leer loest Chefpilotin-Takeover aus (stars:1)
- game.html: GGS_LIVE_STATE liefert progressiven score (Routing/Start/Landung/Gesamt) -> farbige Tag-Balken
- teacher.html: Phasen-Map + Status-Spalte fuer mission/briefing/unterwegs (kein leeres "...")

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 12:48:26 +02:00
Adminator 6dfcf4d57f Idle-Pause vorerst NUR in Klima (per-App-Freischaltung)
Die plattformweite Idle-Pause stoerte passive/iframe-Phasen (Heli-Flug: aktiv gesteuert,
aber Steuerung im iframe/Halte-Taste zaehlte nicht als Interaktion -> Fehlpause).
Jetzt Allowlist (klima/klima-3d) bzw. window.GGS_IDLE_PAUSE=true. Andere Apps: keine
Auto-Pause, bis sie dort einzeln getestet + die Interaktionserfassung angepasst ist.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 12:27:01 +02:00
Adminator 0532327e6a Heli: Onboarding-Zurueck-Button + Routen-Card-Sicherheitsnetz (ohne Ton)
- Onboarding: "Zurueck"-Button (ab Schritt 2, prevHeliOnboarding)
- Routenplanung: planInstruction-Card erscheint garantiert auch ohne Ton / bei
  Audio-Ladefehler (Fallback + Timeout-Netz); bleibt bis zum Wegpunkt-Fund stehen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 12:25:08 +02:00
Adminator 5d79fa3c3a Klima: Flut-Bewertung ans 40%-Spielziel angeglichen
Flut-Score (End- + Live-Score in game-2d/3d) = max(0, 25*(1-Flut/50)): 0% volle 25 Pkt,
40% noch ~5 Pkt, erst ~50% gegen 0 (statt 0 schon ab 31%). Lehrer-Geflutet-Ampel gruen
<25 / gelb <=40 / rot >40. Klima-Stimmung nutzt jetzt den (fairen) Score.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 12:19:41 +02:00
Adminator c9eb0e7764 Cockpit: "Empfohlene Aktivitaet fuer dich" zweigeteilt - HEUTE (oben) + insgesamt (darunter)
HEUTE triagiert exakt gleich (support/more/work/good/idle), aber nur auf die heutigen
Laeufe (Erfolg = Ø der heutigen Scores aus summary-Endpoint). Karten-Renderer in
_ivTriageCards ausgelagert + wiederverwendet. Neuer summary-Fetch im Promise.all.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 12:16:10 +02:00
Adminator 3c28794012 Tag-Ansicht: pausierte Laeufe als halbhoher weiterlaufender Balken
live.php meldet paused (Idle-Pause/Sim-Pause/phase=paused) + activeUntilMs (letzte
Interaktion). renderLiveSummary: Hauptbalken volle Hoehe bis Pausenbeginn, danach
halbhoher gedaempfter "Pausen-Schwanz" der mit der Zeit weiterwaechst. Legende + tz.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 12:02:27 +02:00
Adminator 5633d3f9f9 Lehrer-Live-Zeiten fest auf Europe/Vienna (Server laeuft UTC) -> immer oesterreichische Zeit
_hhmm/_vdt/_fmtHM formatieren mit timeZone Europe/Vienna; _asMs normalisiert Epoch UND
MySQL-UTC-Strings. Betrifft Tag-Achse+Balken, Session-Detail, "Heute erledigt", Cockpit
"zuletzt aktiv", Reflexionen, letztes Lebenszeichen. Vorher zeigte new Date().getHours()
je nach Geraet evtl. UTC.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 11:55:44 +02:00
Adminator e4b877de4b Tag-Ansicht: Zeitachse hugt die Aktivitaet (Start am ersten Spiel statt gerundeter halber Stunde)
Vorher rundete winStart auf 30-min + 15-min-Polster -> bis zu 45 min leerer Platz vor
dem ersten Balken (z.B. Spiel 09:44, Achse begann 09:00). Jetzt winStart = erstes Spiel
minus 4 min, Marker adaptiv auf sauberen Uhrzeiten (15/30/60-min je nach Spanne).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 11:48:45 +02:00
Adminator 550a35eae8 Klima Aktuell: Bevoelkerungs-Balken relativ zur Startbevoelkerung (klemmte vorher bei 100%)
Skala war fix 1500-4500 -> alle Populationen (5000-8800) klammerten bei 100%. Jetzt
relativ zum Level-Start (6000/7000), 30%-160% -> unter Start rot, gewachsen gruen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 11:45:21 +02:00
Adminator 47adf0497d Klima: Geflutet an Meeresspiegel koppeln (kein Deckel-Plateau) -> Zahl passt zur Karte
floodedPct = sea*0.45 + max(0,sea-prot)*1.1. Vorher deckelte der Strand-Anteil bei
12%, sobald Schutz das Inland trocken hielt -> alle Spieler zeigten 12% egal wie das
Klima stand. Die Karte zeichnet die Flut aber aus seaLevelCm -> Zahl und Bild liefen
auseinander. Jetzt steigt die Zahl stetig mit dem Meeresspiegel (Klimafolge), Schutz
daempft nur den Zusatzschaden. Node-validiert: gutes Klima=niedrige Flut, hohe Temp=
hohe Flut, gleiche-Tick-Spreizung statt Plateau.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 11:43:58 +02:00
Adminator 48971b4588 Plattformweit: Idle-Pause-Overlay nach 3 min Untaetigkeit mit "Weiter"-Button
live-client.js (laedt in JEDER Sim): nach 3 min ohne Interaktion sichtbare Pause
(friert Aktivzeit ein -> Idle zaehlt nicht als Arbeitszeit), Weiterarbeiten per
Klick. Heartbeat meldet __paused/__idlePaused. Kein Sim-Code noetig.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 23:32:50 +02:00
Adminator 2386756a20 Klima: Geflutet-Kurve stetig + Schutz wirksam (Rebalance) · Lehrer-Cockpit "Nicht aktiv" responsiv
- engine.js: floodedPct steigt jetzt stetig mit dem schutzbereinigten Meeresspiegel statt bei 15% zu plateauen. Guter Schutz haelt das Inland lange trocken (effRise = sea - prot*0.85), Strand-Verlust gedeckelt bei 12%. Downstream mitrebalanciert: Pop-Verlust-Multiplikator 5->3, Wachstums-Schwellen 15/35, Flut-Events 8-20/40, Ende bei >60. Node-validiert: guter Spieler gewinnt + Bevoelkerung waechst (statt Kollaps), Flut diskriminiert gut/mittel/schlecht.
- teacher.html: iv-prow/iv-cols Grid flexibel (Name minmax(0,1fr) + Ellipsis, Datenspalten auto) -> "Nicht aktiv"-Liste laeuft nicht mehr aus der Karte.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 23:29:39 +02:00
Adminator 0c4fb84606 Lehrer-Live: Avatar-Slug (avatar:xxx) wird als Bild gerendert statt als Rohtext (Reflexionen + Session-Detail)
Gemeinsamer _avatarHtml-Helper: erkennt Slug in avatar_slug ODER als "avatar:<slug>" im emoji-Feld.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 23:21:32 +02:00
Adminator 2160a99896 Lehrer-Live: laufende Klima-Balken farbig (Ampel) + "Heute bereits erledigt" zeigt alle heutigen Durchgaenge
- klima game-2d/3d: GGS_LIVE_STATE liefert laufenden Punktestand (score, gleiche Formel wie Endbewertung)
- live.php summary: laufende Sessions jeder Sim bekommen Ampel-Score (nicht mehr nur Farmer) -> Tag-Ansicht faerbt laufende Balken statt grau
- teacher.html _renderInactiveToday: zeigt jetzt ALLE heute abgeschlossenen Laeufe (auch von gerade aktiven Schueler:innen); nur das laufende Spiel bleibt oben. Titel -> "Heute bereits erledigt"

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 23:19:23 +02:00
Adminator 8cc48b1bc6 Klima: Aktuell-Linien gruen->rot (CO2/Temp/Geflutet/Budget/Bev.) + "Nochmal spielen" setzt wirklich zurueck
- teacher.html: LIVE_PRIMARY_FIELDS.klima Kennzahlen mit _liveBar-Ampel (absolute Skalen), _liveBar +Nachkomma-Param; tick-Spalte entfernt (redundant zu Jahr)
- game-2d/3d: beendete Laeufe (phase=end) werden beim Resume verworfen -> "Nochmal spielen"/erneutes Oeffnen startet frisch statt im Endbildschirm

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 17:17:33 +02:00
Adminator eb67cbc79f Aktuell/Fortschritt: "Heute bereits aktiv" mit allen Aktivitaeten pro Name
Umbenannt von "Heute nicht mehr aktiv"; zeigt jetzt ALLE heutigen Aktivitaeten
pro Schueler:in (group by name, eine Zeile je Aktivitaet, Trennlinie zwischen
Personen) mit Uhrzeit + Leistung.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 16:47:52 +02:00
Adminator 3c856ff5ce Aktuell + Fortschritt: zweite Tabelle "Heute nicht mehr aktiv" darunter
Unter den aktiven Schueler:innen eine eigene Tabelle (gleiche Form): wer HEUTE
schon gespielt hat, gerade aber offline ist -> Zuletzt aktiv (Uhrzeit),
Aktivitaet (Sim), Leistung (Score-Prozent, Ampelfarbe). Reusable
_renderInactiveToday(activeSet), gespeist aus dem summary-Endpoint (heute),
laufende/online ausgenommen. In renderLive und renderLiveCompare eingehaengt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 15:21:51 +02:00
Adminator 64a9a62157 Gesamt/Fleiss: laufende Sessions als blinkende Saeule im aktuellen Bucket
Statt separatem Top-Streifen (rueckgebaut): results.php view=fleiss spielt
laufende live_sessions in den aktuellen Bucket (Stunde/Wochentag/Tag/Monat) ein,
markiert ihn `live`. renderFleiss laesst diese Saeule blinken (roter Rahmen).
So sieht man Bens laufendes Spiel direkt bei "Fleiss pro Schueler*in".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 15:02:19 +02:00
Adminator ad8c6b7d7e Gesamt: "Jetzt live"-Streifen oben (laufende Spiele, blinkend)
In Ergebnisse/Gesamt fehlten laufende Sessions (Fleiss baut nur auf fertigen
Laeufen). Neuer blinkender Live-Streifen ganz oben aus live_sessions: Name +
Sim-Symbol + Laufzeit, Klick = zuschauen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 14:55:32 +02:00
Adminator 71226581fa Tag-Ansicht: laufende Spiele als langsam blinkende Bloecke
Running-Balken (isLive/running) blinken jetzt sanft (_tagblink 1.8s), damit
laufende Spiele klar von fertigen zu unterscheiden sind. Breite = Spieldauer
(waechst mit der Zeit) war bereits so.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 14:47:51 +02:00
Adminator 540b27a2bd Cockpit: "Heute in der Klasse"-Zeile ganz oben in der Klassenuebersicht
Immer sichtbare Live-Zeile ueber den Empfehlungen: wie viele gerade aktiv +
welche Sims, und wer JETZT Hilfe braucht (needsHelp) als klickbare Chips mit
Klartext-Grund (z.B. "Ben - Trefferquote 10 %"). Quelle: cockpit.students.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 14:30:07 +02:00
Adminator 5635fa26b4 Lehreransicht: Ampel Farmer=Trefferquote, Vergleich->Fortschritt+Qualitaet, Mini-Balken ueberall
- _liveMood: farmer-Fall (hit_rate >=60 gruen / >=30 gelb / sonst rot) -> Ampel
  spiegelt Qualitaet, nicht mehr nur Fortschritt.
- qualityScore: farmer hit_rate -> "Qualitaet"-Spalte im Fortschritt-View gefuellt.
- "Vergleich"-Button/Titel -> "Fortschritt (& Qualitaet)".
- "Aktuell"-Tabelle: Mini-Balken jetzt fuer ALLE Zahlenspalten aller Sims
  (relativ zum Spalten-Max, neutral), Spalten mit eigenem Balken ausgenommen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 14:26:47 +02:00
Adminator 4e38b27c64 Tag-Ansicht: echte Spieldauer + Ampelfarbe nach Erfolg + Sim-Symbol
Bug: fertig gespielte Laeufe (Farmer-Endbericht = 1 Assessment) erschienen als
kurzer "Abbruch"-Balken (Dauer 0). Fix:
- live.php summary: nutzt duration_ms -> Balken decken die echte Spielzeit ab und
  fluchten am Start; kein Falsch-Abbruch mehr. Neues Feld `score` (0-100) je
  Session (Score/Sterne); laufende Farmer-Sessions bekommen hit_rate als Live-Score.
- teacher.html Tag-Balken: einheitliche Hoehe (Hoehe raus), Farbe = Ampel nach
  Erfolg (gruen->rot), App-Farbe ersetzt durch Sim-Symbol; Klick = Details.
  Legende angepasst.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 12:56:47 +02:00
Adminator 85ee58c56d Farmer: "Braucht Hilfe" auch bei schlechter Trefferquote (nicht nur cash<0)
Ben spielt bewusst schlecht (hit_rate ~10%), Konto aber wieder im Plus -> blinkte
nicht. needsHelp (teacher.html client + live.php server) jetzt: cash<0 ODER
(attempts>=6 UND hit_rate<30). Faengt dauerhaft falsche Boden/Klima-Wahl; Clara
(hit 75, 3 Krankheiten) bleibt bewusst ruhig.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 12:41:39 +02:00
Adminator fecd8bb9c9 Textsystem: Bis-Strich mit Leerzeichen (Zahl – Zahl) per Agent-Sweep
562 Ersetzungen in 50 Dateien: Halbgeviertstrich zwischen zwei Ziffern (=
"bis"-Bereich) bekommt Leerzeichen davor/danach (3–4 -> 3 – 4). Regex
/([0-9])\s*–\s*(?=[0-9])/ auf Rohtext (format-erhaltend, CRLF/Einrueckung
unveraendert), Bindestriche in Woertern und Minuszeichen unangetastet, alle
JSON weiter gueltig. Energiemanager-Zeitbloecke sind Display-Labels (kein
Logik-Key) -> safe.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 12:38:19 +02:00
Adminator 9c99359d9c Farmer-Fix: Klima-Fallback laengengrad-bewusst + "Vernalisation" ersetzt
- defaultZoneByLatitude: bei 32-38 Grad nicht mehr pauschal "mittelmeer" (das
  gab kontinentalem Innerasien wie Westchina faelschlich Mittelmeerklima ->
  "Mediterraner Reisanbau" in Xinjiang). Jetzt nur in echten Mittelmeer-
  Laengenfenstern (Mittelmeerbecken/Kalifornien/Chile/Kap/SW-Australien),
  sonst "wueste". lon wird jetzt an die Funktion uebergeben.
- crops.json: Weizen-Fachbegriff "Vernalisation" durch "kuehle Winter, die der
  Winterweizen fuer die spaetere Kornbildung braucht" ersetzt (Thomas: gehoert
  nicht ins Lehrwerk).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 12:25:57 +02:00
Adminator b32097b617 Farmer-Fix: Begruendungstext passt jetzt zur echten Klimazone (nicht mehr zufaellig)
Bug: Kamel in tropischem Brasilien zeigte "Polargebiet/Permafrost", weil der
generische N2-Pool tropisch+polar mischt und pickFromPool zufaellig zog. Ebenso
"Kamele in Nordeuropa" auf einem Feld in Suedamerika (fester Regionsname).
- engine.js: pickZoneAware() waehlt per Klima-Stichwoertern (ZONE_KEYWORDS) den
  zur Zone passenden Grund-Text statt zufaellig; Fallback = alt.
- crops.json: Kamel-N1-Text regions-neutral ("viel zu feucht" statt "Nordeuropa").
S1-Erfolgstexte mit Regions-Beispielen (Reis/Kaffee/Datteln) bewusst belassen
(Vergleich auf passendem Feld, didaktisch ok).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 12:19:32 +02:00
Adminator 257b5e5099 Lehreransicht "Aktuell": Mini-Balken unter den Zahlen (Farmer-Spalten)
Kleine Balkengrafik unter jedem Zahlenwert: bounded Metriken (Jahr/Trefferquote/
Sorten absolut zur Skala) + offene Werte (Konto/Laender/Felder/Versuche/CO2)
relativ zum groessten Wert der Spalte ueber alle Schueler:innen -> auf einen
Blick "wer liegt vorn". Konto signiert (rot bei minus), CO2/Krankheiten
invers (rot = mehr). Helfer _liveMiniBar/_liveBarColor, colMax pro Spalte.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 12:03:29 +02:00
Adminator 532b5471ec Lehreransicht: Farmer-Spalten in "Aktuell" uebersetzt statt roher Keys
LIVE_PRIMARY_FIELDS um farmer-Eintrag ergaenzt: Jahr /10, Markt, Konto (rot bei
minus), Trefferquote (Balken), Sorten /10, Laender, Felder, Versuche, CO2 kg,
Krankheiten (rot bei >0). Redundante/interne Keys (phase, market-id, progressPct,
simId, timestamp) fallen weg. Vorher fiel die Tabelle auf rohe englische Keys.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 11:58:45 +02:00
Adminator ff751f3a05 Farmer: Onboarding-Schritt korrigiert - keine Geraete, Sorten werden freigeschaltet
"Ertraege verkaufen, in Geraete und Sorten investieren" -> "Ernten und
verkaufen - mit den Jahren werden neue Sorten freigeschaltet". Es gibt keine
Geraete-Mechanik, und Sorten werden automatisch (nach 3 Jahren) freigeschaltet,
nicht gekauft.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 11:53:56 +02:00
Adminator 714abc026a Farmer: Intro-Satz korrigiert - "Hoefe auf der ganzen Welt"
"Du bewirtschaftest einen Hof" -> "In dieser Simulation bewirtschaftest du
Hoefe auf der ganzen Welt" (die Sim spielt weltweit, nicht auf einem Hof).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 11:52:38 +02:00
Adminator 8c316f22e8 Weltkueche: Marillenknoedel auf reinen Topfenteig (Erdaepfel raus) + Panel final
- wachauer-marillenknoedel Rezept-Schritt 1: Erdaepfel entfernt, klassischer
  Topfenteig (Topfen/Ei/Butter/Mehl/Griess). Passt jetzt zu den ings.
- Admin-Maengelliste: komplett abgearbeitet markiert; mediterrane Kraeuter
  bleiben (Thomas-Entscheidung).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 11:49:33 +02:00
Adminator 8ffc43d7b2 Weltkueche: Maengelliste abgearbeitet (14 Zutaten-Fixes) + Guanciale neu
Zutaten, die im Rezept nicht vorkamen/falsch waren, korrigiert:
- raus: Apfelstrudel(zitrone,essig), Sauerbraten(mehl), Pierogi(milch),
  Gulasch(tomaten), Guacamole(olivenoel), Groestl(kuemmel)
- ersetzt: Kirschtorte/Zuercher/Quiche milch->sahne, Pizza hartweizen->mehl
  (Weichweizen; hartweizen bleibt bei Carbonara=korrekt Durum), Gulasch
  butter->oel, Curry+PadThai olivenoel->oel, Carbonara speck->GUANCIALE (neu).
- guanciale (NEU, production-matrix): feste Herkunft Italien + Distraktoren.
Admin-Maengelliste als erledigt markiert; offen bleiben mediterrane Kraeuter
+ Marillenknoedel-Teig (Thomas-Entscheidung).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 01:17:01 +02:00
Adminator 9bc3ca7b26 Weltkueche-Admin: Maengelliste Zutaten vs. Rezept (manuelle Pruefung aller 30 Gerichte)
Panel oben im QA-Tool: Zutaten, die im Rezepttext nicht vorkommen oder falsch
sind (z.B. Sauerbraten/mehl, Kirschtorte/milch, Pizza/hartweizen, Carbonara/speck
statt Guanciale, Gulasch/tomaten+butter, Curry+PadThai+Guacamole/olivenoel).
Plus mediterrane-Kraeuter-Kandidaten und kleinere Rezept-Themen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 00:41:26 +02:00
Adminator 13f14c26a8 Weltkueche: 6 Zutaten mit fest verdrahteter Herkunft (Thomas-Vorgaben)
Kein Automatismus mehr - Zutat hat feste Laenderliste (correct) + feste
Distraktoren, die das Spiel 1:1 ausliest. Vorrang vor Consumer/Heimat.
- greyerzer (NEU, "Greyerzer & Vacherin"): Schweiz+Frankreich -> ersetzt den
  mozzarella-Hack im Fondue (Signatur entfernt, Rezept nannte Gruyere+Vacherin
  schon korrekt).
- hefe: Oesterreich+Frankreich | lamm: Neuseeland+UK (Import, nicht Griechenland)
  tomaten: Niederlande+Spanien | schmand: Oesterreich+Deutschland
  fischsauce: Thailand+Vietnam (nicht Italien).
game.html: schlanker Auslese-Zweig fuer `correct`/`distractors` (isWorldIngredient
+ ING-Build + Aufloesungstext). admin spiegelt als "Feste Herkunft".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 00:35:24 +02:00
Adminator d7dd3f9de5 Weltkueche: Cache-Busting (no-store) fuer die Daten-Fetches im Spiel
Damit das Spiel nach einem Deploy nie eine gecachte dishes/production-matrix
zeigt (gleiche Klasse Fix wie im Admin-Tool).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 23:55:33 +02:00
Adminator 8977901e89 Weltkueche: Consumer-Regel fuer ALLE DACH-Grundzutaten + Alkohol raus + Fixes
HEIMAT-REGEL-FIX (Thomas): Grundzutaten haengen nicht mehr am Gericht-Land,
sondern am User-Land, wenn dort nennenswerte Produktion. Quiche-Milch in AT =
oesterreichische Milch, nicht franzoesische.
- heimisch+market (AT/DE/CH, market DE) an: milch, butter, topfen, fleisch,
  rind-ungarn, apfel, zucker, zwiebel, champignons, wurzelgemuese, mais,
  kirschen, mehl (+ eier/kartoffel schon). = 16 Grundzutaten consumer-anchored.
- huhn-spanien (Paella): heimisch AT/DE/CH, market DE, Distraktoren
  spanien/frankreich/marokko/aegypten/tuerkei (Spanien = Gericht-Land als Lockvogel).
- BEWUSST NICHT heimisch: tomaten + lamm (Import >2/3) -> bleiben international.
  Signaturzutaten (speck/feta/mozzarella/bergkaese) bleiben am Gericht.
- Zurueckgehalten fuer Thomas-Review: kuemmel/majoran (Kraeuter-Graubereich).

ALKOHOL RAUS (Thomas: "ist fuer Kinder", alle Gerichte):
- Apfelstrudel: Rum-Ing raus. Sauerbraten: Wein-Ing raus, Marinade Rotwein->
  roter Traubensaft. Kirschtorte: Kirschwasser->Kirschsaft. Fondue: Wein-Ing raus,
  Weisswein->Apfelsaft+Zitrone, Kirschwasser->Wasser, Schnaps-Gag->Lied singen.
  Zuercher Geschnetzeltes: Wein-Ing raus, ablöschen mit Gemuesebruehe. Moussaka:
  Wein-Ing raus, einkochen mit Gemuesebruehe.
- Bayerische Brezel: Mozzarella raus (Obatzda = Camembert+Frischkaese).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 23:54:43 +02:00
Adminator f934a7f9e4 Weltkueche: mediterrane Kraeuter raus aus Maultaschen + Sauerbraten
Kommen im Rezept nicht vor und passen historisch nicht in die regionale
DACH-Kueche (Thomas). Mediterrane Gerichte (Pizza/Ratatouille/Moussaka/Paella)
behalten Kraeuter.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 23:41:34 +02:00
Adminator 0c2225594b Weltkueche: Semmelbroesel zurueck in Speisekammer + Brezel-Rezept bereinigt
- semmelbroesel: heimisch/market/distractors wieder entfernt -> nicht mehr
  abgefragt, kommt aus der Speisekammer (Thomas: verarbeitete Staples = Pantry).
- bayerische-brezel: Wein + mediterrane Kraeuter aus ings raus (kommen im
  Rezept nicht vor). Bier im Obatzda-Schritt durch einen Schuss Milch ersetzt
  (fuer Kinder ungeeignet).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 23:38:38 +02:00
Adminator 7f997bff84 Weltkueche-Admin: Cache-Busting der Daten-Fetches (?v=ts + no-store)
Verhindert, dass die QA-Uebersicht eine gecachte production-matrix.json/dishes.json
zeigt. Loest "Admin zeigt noch alten Stand nach Deploy".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 18:35:52 +02:00
Adminator 423490260d Weltkueche Teil B: Consumer-Anker (Herkunft folgt dem User-Land) — Pilot Ei/Kartoffel/Semmelbroesel
Grundzutaten, die im Land des Users heimisch sind, kommen jetzt aus dem Land
des USERS statt aus dem Gericht-Land (Carbonara-Ei in AT = AT-Ei). Opt-in pro
Zutat ueber neues Feld `heimisch`; Signaturzutaten bleiben am Gericht.

game.html:
- buildTaskFor: neuer Consumer-Zweig (vor Heimat-Regel). correct = [User-Land,
  ...market], Distraktoren explizit (`distractors`) oder berechnet. Immer 5 Karten.
- _wkUser(): WK_COUNTRY (AT/DE/CH/LI) -> Laender-Slug, Fallback AT.
- isWorldIngredient: Zutat mit `heimisch` wird immer abgefragt (z.B. Semmelbroesel).
- ING-Build: heimisch/market/distractors werden aus der Matrix mitkopiert
  (wurden vorher weggelassen -> Felder kamen nie im Spiel an).
- Aufloesungstext: Consumer-Fall ("kaufst du, wo du einkaufst - im eigenen Land").

Daten (production-matrix.json), Thomas-Vorgaben:
- eier:  heimisch AT/DE/CH, market DE+NL  -> AT-User: AT+DE+NL, DE-User: DE+NL
- kartoffel: heimisch AT/DE/CH, market DE -> AT+DE (alle Gerichte)
- semmelbroesel: heimisch AT/DE, market DE, distractors GR/TR/EG/TN/IE; jetzt abgefragt

admin-weltkueche.html: Consumer-Zweig gespiegelt + AT/DE/CH-Umschalter.

Nebenbefund (NICHT angefasst): correct_for wird im Spiel nie gelesen (nur Admin
las es) -> mehl/majoran/safran/feta-lamm-Kuratierung wirkte bisher nur im Admin.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 18:21:39 +02:00
Adminator b6b6c6ccce Weltkueche: Ei-Zweitherkunft AT = Deutschland+Niederlande (statt Slowakei)
- eier.correct_for.oesterreich: ["deutschland","niederlande"] (war ["slowakei"])
  -> AT-Ei-Gerichte zeigen jetzt AT + DE + NL (Thomas-Vorgabe: NL/DE sind die
  echten Import-Herkuenfte, SK spielt kaum Rolle). Gilt fuer alle 7 AT-Gerichte
  mit Ei; DE-Gerichte zeigen via Heuristik ohnehin schon DE + NL.
- buildTaskFor Heimat-Zweig: Distraktoren auf 5-correct.length gedeckelt, damit
  bei 3 richtigen Laendern trotzdem 5 Karten bleiben (Punkte-Norm).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 18:08:36 +02:00
Adminator a68c58ac9e Weltkueche Teil A: Land pro Lehrer persistent (teachers.country) + Sim-Verdrahtung
- profil.html: Länderauswahl (AT/DE/CH/LI) im Lehrer-Profil, lädt/zeigt aktuelles Land.
- profile.php: speichert country in teachers.country; gibt country zurück.
- weltkueche.php: injiziert window.WK_COUNTRY = Country::current() (Kaskade Schüler→Klasse→Lehrer→AT) — Fundament für die konsumentenland-basierte Herkunft (Teil B).
Spalte teachers.country existierte bereits, keine Migration nötig.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 12:13:27 +02:00
Adminator c3e61f4da7 Weltkueche: Auflösungs-Aussage korrigiert + Admin-QA kennt correct_for
- Auflösung: „Das ist ein Gericht aus <Land> → Zutaten aus <Land>" nur noch bei
  ECHTEN Signatur-Zutaten (Tiroler Speck etc.). Grundzutaten (Butter, Mehl) bekommen
  die neutrale „aus der Nähe"-Begründung statt der falschen Gericht-Herkunft-Logik.
- admin-weltkueche.html: classify() respektiert jetzt correct_for (zeigt sonst falsche
  Herkünfte, z.B. Mehl AT+DE statt AT+Ungarn).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 11:50:07 +02:00
Adminator b353f25b07 Weltkueche Punktesystem: neue Formel (25 x verbleibende Falsche) + immer 5 Karten
- Auswahl auf IMMER 2 richtig + 3 Distraktoren (5 Karten) genormt (Welt-Zweig
  wuerfelte 2-4). Damit ist die Bewertung fair & vergleichbar.
- Punkte pro richtigem Klick = 25 x (noch verbleibende falsche Optionen).
  Frueh gefunden = mehr; jeder Fehlklick vorher senkt den Wert. Max 2x75 = 150,
  0 moeglich (alle falsch zuerst). 50er-Bonus entfaellt (150 = 75+75).
- Live-Feedback: schwebendes +75/+50/+25/+0 (gruen) bzw. "Fehlversuch -
  erreichbare Punkte sinken" (rot) bei jedem Klick.
- Banner/Interim/Onboarding-Text angepasst; trade-Abzeichen 3000 -> 2000
  (da Max jetzt 150 statt ~250 pro Zutat).
- BUGFIX: dasselbe richtige Land liess sich doppelt anklicken/zaehlen -> Guard.
Playwright-verifiziert: 5 Karten, 75+0(Guard)+75=150, 0 JS-Fehler.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 11:25:49 +02:00
Adminator 5fbbf506b5 Schulbuch: 26 Fotos aus Prod-Kollegen-Uploads + lokalen Zuordnungen eingebaut
Prod (Kollegen, echte VBG-Orte, je Slot bestes gewaehlt): kofferdetektiv komplett
(Gepaeckband Stuttgart, Koffer-Indizien, Anzeigetafel, Nachtzug, Kondensstreifen,
Hafen-Bregenz), busfahrt (Reisebus, Flixbus, Grenzschild, Pfaender-Dreilaenderblick),
energiemanager (Luenersee-Stausee, Pumpspeicher, Smartmeter, Strommast), klima
(Gletscher, Gewaechshaus), sonnensystem (Sonnenaufgang), eu-werkstatt (EU-Flagge),
farmer (Alp-Kuehe), tourismusregion (Wegweiser, Parkplatz Golm), weltkueche
(Fairtrade, Fruehstueckstisch). Colleague-Fotos ersetzen meine Trip-Platzhalter bei
fairtrade-siegel + opener-parkplatz-voll. Lokal: souvenirs, marktstand, radweg.
Alle: auto-orient, EXIF/GPS gestrippt, 1600px, WebP.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 23:22:31 +02:00
Adminator d4c7fd5009 Schulbuch: 9 neue Fotos (EXIF/GPS gestrippt, WebP) in leere Buch-Slots
- weltkueche: sennerei-kaese, fairtrade-siegel, supermarkt-herkunftsschilder
- tourismustal: sommerloch-leere-terrasse (Skiort im Sommer)
- tourismusregion: opener-parkplatz-voll, standort-jausenstation (NEU Ordner)
- logistik: alpen-transit (Container-LKW)
- energiemanager: strommix-wasserkraft (Wasserkraft-Turbine)
- farmer: opener-feld-berg (Maisfeld)
Aus .humanInput/fotosNeu2; auto-orientiert, 1600px, q82.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 22:55:04 +02:00
Adminator bf2a4cd0d1 Weltkueche Herkunft: kuratierte AT-Zweitlieferanten + Distraktor-Fixes (Thomas-Review)
Neu: additives `correct_for[heimat]` in buildTaskFor — uebersteuert die Gravitations-
Schaetzung NUR bei kuratierten Zutaten (echte Handelsdaten), alles andere unveraendert.
- mehl→AT+Ungarn (Weizenimport 2023: HU 604k >> DE 41k), kartoffel→AT+Schweiz,
  eier→AT+Slowakei (Variation weg vom Dauer-AT+DE), majoran→AT+Deutschland (statt FR),
  safran→Spanien+Iran (statt IT mit 1 t), feta/lamm→Griechenland+Bulgarien (Balkan statt FR).
- Datenfixes gegen „echter Lieferant faelschlich als Distraktor": AT raus aus Mozzarella-
  climate_possible + als Produzent ergaenzt; CH raus aus Kartoffel-climate_possible +
  Produzent; SK als Eier-Produzent; Aegypten-Zwiebel local→global (echter kleiner Lieferant).
- Verifiziert: 7 kuratierte korrekt; keine Regression (DE-Gerichte nutzen weiter Algorithmus).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 21:36:48 +02:00
Adminator 4c0183f2e0 Weltkueche Zutaten-Review R2: Apfelstrudel/Sachertorte/Marillenknoedel/Schnitzel exakt nach Rezept
- Apfelstrudel: exakte Liste (Apfel, Zitrone, Butter, Mehl, Oel, Essig, Semmelbroesel,
  Zucker, Zimt, Rosinen, Rum, Staubzucker). Eier + Mandeln + Olivenoel raus.
- Sachertorte: Schokoladenkuvertuere statt Kakao, Kristall- + Staubzucker, Schlagobers
  (mit Hinweis: kommt DANEBEN, nicht in den Teig) statt Milch.
- Marillenknoedel: Topfenteig, Kartoffel raus.
- Wiener Schnitzel: Kalbfleisch, Mehl, Ei, Semmelbroesel, Butterschmalz (+ Zitrone,
  Erdaepfelsalat-Beilage). Pfeffer + Butter raus.
- 8 neue Zutaten: 3 Welt (Schokolade=Kakao-Herkunft, Kristallzucker=EU-Ruebe, Rum=Karibik),
  5 lokal (Semmelbroesel, Oel, Staubzucker, Butterschmalz, Schlagobers).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 21:23:56 +02:00
Adminator 0c4064bb58 Weltkueche Zutaten-Review (Thomas): echte kulinarische Fehler bei AT-Gerichten behoben
- Mediterrane Kraeuter RAUS bei Groestl, Kasnudeln, Wurzelfleisch, Kaesespaetzle, Schnitzel (unpassend).
- Olivenoel RAUS bei Wurzelfleisch + Apfelstrudel (untypisch).
- Mozzarella RAUS bei Kaesespaetzle -> echter neuer `bergkaese` (Vorarlberger Bergkaese; Herkunft AT + Schweiz statt faelschlich Italien).
- Hartweizen/Durum RAUS bei Marillenknoedel.
- Wiener Schnitzel Fleisch -> neuer `kalbfleisch` (ausschliesslich Kalb; Herkunft AT + Niederlande = EU-Nr.1 Kalbfleisch).
- Kasnudeln: neuer `minze` (Nudelminze, charakteristisch; Herkunft AT + Deutschland).
- 3 neue Zutaten in production-matrix mit realistischen Produzenten/Markt; Gravitation liefert plausible 2. Lieferanten (verifiziert).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 21:08:15 +02:00
Adminator 5d3cd1bdcf Fix: BASE_URL folgt dem echten Host (Glossar-Fetch auf v3) + Weltkueche „Nachbarland"-Wortlaut
- app.php: BASE_URL fuer *.geograsim.at war hart 'https://geograsim.at' -> auf
  v3.geograsim.at lud die Glossar-API cross-origin -> CORS/NetworkError
  ("Glossar konnte nicht geladen werden"). Jetzt BASE_URL='https://'.$host
  (same-origin auf jeder Umgebung; prod-neutral, geograsim.at bleibt gleich).
- weltkueche/game.html: Zweit-Lieferant hiess pauschal „Nachbarland" — Frankreich
  ist aber kein Nachbar Oesterreichs. Jetzt „europaeisches Land in unserer Naehe".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 16:30:59 +02:00
Adminator 5b0505b140 Sonnensystem-Review: Finsternis-Geometrie-Fix + Vergleichsansichten + Anleitung + Photon-Skala
Aufgaben (observations.json):
- Finsternis-Bug behoben: Mond wurde siderisch statt synodisch positioniert -> Konstellation schief. Jetzt exakt Neumond (solar)/Vollmond (lunar) via moonPhaseTimeDays(). Sim-Detektor bestaetigt (Badge) SONNEN-/MONDFINSTERNIS.
- Pol-Aufgaben (Polartag/Polarnacht): Kamera -> neue erdzentrierte Draufsicht earth-top (Sonne geht am Pol nie unter/auf sichtbar).
- Mondphasen: Start bei Neumond (moonPhaseStart) passend zur Reihenfolge Neumond->zunehmend->Vollmond->abnehmend.
- Vergleichsansichten (Strahlen-Steilheit, Tag-Nacht-Gleiche, ohne Achsneigung): neue nahe Seitenansicht earth-side + Sommer/Winter- bzw. Maerz/Sept-Phasen + klare watchHints.
- "Was bewegt sich worum": Antwort praezisiert (Mond um die Erde).
- Apfel-Vergleich: 109 x (Leerzeichen), Erde = Mohnkorn (~1 mm), lange Striche raus, Distraktor Murmel angepasst.
- Photon: schwankende 8:20 erwaehnt, watchHint "mind. 30 s zaehlen + hochrechnen", Speed watchbarer.

game.html:
- Graue/unsichtbare Fact-/Onboarding-Texte: dunkle Lesefarbe gesetzt.
- Kameras earth-top + earth-side; obsApplyState-Fallback fuer button-lose Kameras.
- moonPhaseTimeDays(new|full) (synodisch, Anker Vollmond 3.1.).
- Anleitung-Button (Intro+Aufloesung) + Overlay: erklaert das Bedienfeld Schritt fuer Schritt.
- Photon-Skala unten: 8 Segmente (1/min), fuellt mit Fortschritt; Photon pulsiert die ganze Strecke.

Getestet mit Playwright: 0 JS-Fehler, Finsternis-Badges korrekt, Photon-Skala fuellt, alle DOM-Elemente da.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 12:04:53 +02:00
Adminator c950f954d1 Admin-ToDo/Review-Seite + Staging-Self-Service-Admin-Login
- admin-todo.html: mobile-freundliche ToDo/Review-Liste (Prioritaeten, Haekchen +
  Notizfelder je Punkt, localStorage, Notizen-Export), admin-gated, noindex. In
  admin-licenses.html Nav + Backend-Werkzeuge verlinkt.
- admin.php: devPin auch bei STAGING=1 (v3, Mail bewusst tot) -> Self-Service-
  Admin-Login ohne Mailversand. Prod unveraendert (STAGING dort nie definiert,
  2FA-Mail-Pflicht bleibt).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 11:31:02 +02:00
Adminator a568f81b0a vendor-Fix: PHPMailer (v7.0.2, hand-vendored) im Autoloader wiederhergestellt
Beim Hinzufuegen von firebase/php-jwt + predis war PHPMailer aus composer.json
und dem Autoloader gefallen (Dateien fehlten ganz). Folge: `new PHPMailer` fatalt
-> 500 bei register/reset/2FA/Schueler-Zugang. Auf v3 aufgedeckt und behoben:
composer.json require + installed.json + Autoloader (App/vendor) mit PHPMailer,
firebase, predis. Verifiziert: alle 3 Namespaces laden. KRITISCH fuer Prod-Deploy
(Manifest spiegelt vendor/), sonst waere dort der Mailversand gebrochen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 00:29:03 +02:00
Adminator 182a87978e Auth-Umschalter: Session.php verzweigt auf AUTH_BACKEND (jwt = JWT-Access-Cookie + widerrufbare Redis-Session)
- teacher/admin Login/Read/Logout branchen auf AUTH_BACKEND; session-Pfad unveraendert (Live-Default, prod-sicher).
- jwt: loginTeacher/loginAdmin legen Redis-Session (SessionStore) an + setzen kurzlebiges JWT-Cookie (ggs_t/ggs_a) + langes Sid-Cookie (ggs_ts/ggs_as).
- Read: Fast-Path via signiertem JWT (zustandslos), Refresh-Path via Sid->Redis + frisches JWT; Widerruf = Redis DEL bei Logout.
- Teacher/Admin getrennte Cookies (koexistieren), typ-Check gegen Rollenverwechslung. Lazy-require von Jwt/SessionStore (jeder Einstiegspfad).
- Schueler unveraendert (UUID-Cookie + DB, schon pod-unabhaengig).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 00:15:22 +02:00
Adminator 5b91a5bf84 Admin-Login lokal: 2FA-PIN ohne Mailversand (Dev) + Mailer-Fehler abfangen
Problem: lokal konnte man sich nicht als Admin anmelden — der 2FA-PIN kam nie
an (kein SMTP), und Mailer::sendAdminPin() warf sogar eine Exception, die den
Login komplett abbrach (leere Antwort → „MFA fehlt").

- admin.php: Mailversand nur auf Prod + in try/catch (Mail-Fehler darf den
  Login NIE blocken). Lokal (!IS_PRODUCTION) wird der PIN als `devPin` in der
  Login-Antwort zurückgegeben — auf Prod NIEMALS (2FA bleibt Pflicht).
- admin.html: devPin wird lokal automatisch ins PIN-Feld vorausgefüllt + als
  Hinweis angezeigt.

Verifiziert (temp Test-Admin): login → devPin → verify → authenticated:true,
admin-weltkueche.html erreichbar. Prod unberührt (IS_PRODUCTION-Gate).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 19:13:22 +02:00
Adminator 0555a2d245 Lehrer-Aktivitätsstreifen: Farbe je Sim, Höhe=Erfolg, Rahmen=Zustand
Tages-Balken neu kodiert (nach Thomas' Spec):
- Eine Farbe pro Simulation (simColor, stabil per Hash).
- Balkenhöhe = Maß für den Erfolg (mehr Sterne → höher) → Leistungen auf einen
  Blick vergleichbar.
- Rahmen kodiert den Zustand: fertig gespielt = geschlossener dünner Rahmen ·
  noch dran = rechts offener Rahmen · Abbruch = gestrichelt + ✖ am Ende.
- Beschriftung: 3-Buchstaben-Kürzel (eng) → Wort → Wort+Lektion (Platz).
- Legende entsprechend erneuert.

Datenbasis vorhanden: live.php summary liefert success (inkl. 'aborted'),
stars, completed pro Session. Offen für v2: „läuft noch"-Balken aus aktiven
live_sessions einblenden (Tag-View ist bisher assessments-basiert = Abschlüsse).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 18:14:56 +02:00
Adminator 5f603cb193 Tourismusregion: Umwelt beißt jetzt + Schüler-Erklärung (Balance-Pass 1)
Diagnose per headless-Sim-Harness (.dontDeploy/tools/tr-balance-harness.mjs):
„alles zubauen" senkte die Umwelt nur 75→50 (über der 45-Schwelle) und der
Exit-Umwelt-Malus war TOTER Flag-Code → man konnte der Umwelt kaum schaden.

- model.js: (1) Exit-Umwelt-Malus wirklich angewandt — env<60 zieht bei
  umweltbewussten Gästen Zufriedenheit ab (je tiefer, desto mehr). (2) Über-
  tourismus-Drift im 10-s-Takt: dichte Bebauung (>6 Bauwerke) + Verkehr zehren
  die Umwelt aus. (3) Einmalige Lern-Warnkarte, wenn Umwelt < 50 kippt.
- data.js: Naturschutzgebiet-Beschreibung klar (rettet die Umwelt +20, Natur-
  Attraktionen +15 %, sperrt Bauplätze — Naturschutz vs. Ausbau abwägen).
- main.js: Willkommenskarte erklärt die Umwelt-Mechanik für Schüler.

Messung nachher: „alles zubauen" → Umwelt 75→37 (unter 45), Umweltziel
verfehlt, Ø-Sterne fallen. Feintuning Sterne-Kurve/Ansprüche-Eskalation
bleibt für Thomas' Playtest (Game-Feeling headless nicht bewertbar).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 18:10:42 +02:00
Adminator 913f161502 Admin: Weltküche-Herkunftsübersicht (QA-Seite)
Neue admin-geschützte Seite admin-weltkueche.html: spiegelt die Spiel-Logik
(Heimat + Handels-Gravitation Menge÷Entfernung + Markt-Tags) und zeigt pro
Gericht × Zutat die vom Spiel akzeptierten Herkunftsländer (🟢 richtig) und
die Distraktoren (🔴). Filter nach Kategorie + Suche + „nur Auffällige".
Auffällig-Heuristik: Heimat-Zweig-Zutat mit „richtigem" Land > 1500 km
(surft echte Ausreißer, ohne Welt-Zutaten wie Pfeffer falsch zu flaggen) —
aktuell 5 Kandidaten. In Admin-Nav + Backend-Werkzeuge verlinkt.
Verifiziert: 30 Gerichte, Kartoffel/Eier → [AT, DE] (nicht Frankreich).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 18:01:50 +02:00
Adminator 665b43e069 Doku: Relevante Infos für Lehrpersonen (Zusammenfassung Lehrer-Cockpit)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 15:16:08 +02:00
Adminator d9f9f901a1 Logistik-Pause friert die Aktivzeit ein (Lehrer-Cockpit)
Problem: bei Pause lief die „Seit"-Zeit im Lehrer-Cockpit weiter, obwohl das
Spiel steht — live-client.js akkumulierte activeMs unabhängig vom Pause-Zustand.

- live-client.js: opt-in Pause-Unterstützung. window.__GGS_LIVE__.setPaused(bool)
  friert die activeMs-Buchhaltung ein (lastTickAt wird weiter aktualisiert, damit
  beim Fortsetzen nichts nachspringt). __paused zusätzlich im Heartbeat. Default
  aus → alle anderen Sims unberührt.
- logistik game.html: Pause-/Auto-Button ruft setPaused(mode==='pause').

Verifiziert (Playwright): activeMs 0→2000 (läuft) → 2000 (Pause eingefroren)
→ 3999 (Fortsetzen).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 15:12:50 +02:00
Adminator e23ebd960e Weltküche: Herkunft per Handels-Gravitation + Punktefix „alle falsch = 0"
- Zweit-Lieferant im Heimat-Zweig jetzt via Handels-Gravitation (Menge ÷
  Entfernung zur Heimat, Haversine über Länder-Koordinaten) statt roher
  Weltproduktion. AT-Eier → Deutschland (468 km) statt Frankreich (916 km),
  obwohl FR mehr Eier erzeugt. Distraktoren bleiben nie echte AT-Lieferanten.
  Verifiziert: Eier/Kartoffel/Milch → [Österreich, Deutschland]; alle 70
  Zutaten bauen fehlerfrei.
- Punktefix: Strafe pro Fehlklick = 100 ÷ Anzahl Distraktoren → „alle Falschen
  zuerst" ergibt IMMER 0 (bei 4 Distraktoren −25, bei 2 −50). Task-Banner
  zeigt die tatsächliche Strafe + „alle falsch zuerst = 0".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 15:09:16 +02:00
Adminator c1f90e255d Lehreransicht aufräumen: Sim-Labels + Logistik-Spalten + assessment-Skip-Fix
- SIM_LABELS: EIN Wort + eindeutiges 3-Buchstaben-Kürzel je App (zentrale
  Quelle simWord()/simCode()). Tages-Balken nutzt jetzt Kürzel (eng) → Wort
  (mittel) → Wort+Lektion (breit) statt kryptischem "Log L1".
- LIVE_PRIMARY_FIELDS['logistik'] ergänzt (Stufe · Budget · Geliefert/Gesamt ·
  Unterwegs · Offen · Verspätet · Fortschritt) — vorher Roh-Dump aller Keys.
- Aktuell-Fallback (uncurated Sims): interne __-Heartbeat-Keys + simId/
  timestamp/screen ausgeblendet, nicht mehr als Spalten.
- assessment.php: Skip-Bug gefixt — las phase aus $body['processLog']['phase'],
  gesendet wird $body['phase']. Dadurch landeten alle 'started'/'running'-Pings
  als LEERE Zeilen in assessments und verschmutzten Ergebnisse/Tag. Jetzt
  greift der Skip; nur echte 'completed'-Abschlüsse werden gespeichert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 15:05:42 +02:00
Adminator 37f6238d05 Auth Phase 2: Session-Zugriffe kanalisieren (verhaltensneutral)
Vorbereitung für den JWT+Redis-Umschalter: alle verstreuten
$_SESSION['teacher_id'|admin_id']-Zugriffe laufen jetzt durch Session::-Helper,
damit der Backend-Tausch später EINE Datei (Session.php) ist statt 18 Stellen.

- Session.php: neue Admin-Helper adminId()/loginAdmin()/logoutAdmin()/
  requireAdmin() (mirror der Teacher-Helper). teacherId()/adminId() starten
  die Session jetzt lazy (Aufrufer müssen Session::start() nicht mehr).
- 18 Fundstellen kanalisiert (admin.php, admin-accounts, admin-modules,
  licenses, levels, waypoints, foto-upload, admin_gate, save_map).
- Country.php + app.php cockpit_href: über Session:: mit class_exists-Fallback
  (Bootstrap/Lib-Kontext, Session evtl. nicht geladen).

Verhaltensneutral: 14/14 Lint OK, Helper-Round-Trip 6/6 PASS, Live-Smoke
(admin status/modules/accounts/licenses) weist unauth. Requests wie bisher
mit 401/403 ab. AUTH_BACKEND bleibt 'session' — Live unverändert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 16:33:14 +02:00
Adminator 5d94572569 Auth-Fundament: JWT + Redis (Phase 1, non-breaking)
Vorbereitung für pod-unabhängige Sessions (k8s-Ziel). Ändert am Live-System
NICHTS: AUTH_BACKEND='session' bleibt Default, die neuen Libs sind noch
nirgends verdrahtet.

- composer eingeführt: firebase/php-jwt ^6.11 + predis/predis ^2.4 (pure PHP,
  keine Redis-Extension nötig → läuft auf XAMPP wie im Prod-Image). vendor/
  committed (kein Composer auf dem Server).
- Jwt.php: HS256-Access-Token (issue/verify), decode() IMMER mit explizitem
  Algorithmus (mitigiert Algorithmus-Confusion). 8/8 Tests grün.
- SessionStore.php: predis-gestützter Session/Refresh-Store (sess:<sid>,
  Sliding-TTL, revoke=DEL) — die widerrufbare Session hinter dem kurzen JWT.
- app.php: vendor/autoload (guarded), Konstanten AUTH_BACKEND (Default session),
  REDIS_URL, JWT_TTL, JWT_REFRESH_TTL. JWT_SECRET bewusst ohne Default.
- docker-compose.dev.yml: Redis (+ redis-commander UI) für lokale Dev-Parität.
- .env.example um Auth-Block ergänzt.

Nächste Phasen: $_SESSION-Zugriffe (293) durch Session:: kanalisieren →
Backend-Umschalter in Session.php → doppelgleisiger Cutover → Reporting auf
student_id-FK ziehen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 16:21:27 +02:00
Adminator db4b75c5e6 Tourismusregion Quick-Fixes: Startflow, Auto-Save, Lift-Talstation, iPad-Responsive
- Startbildschirm: Name/Klasscode-Felder entfernt (Kinder sind über die
  Plattform-Session identifiziert). Klick auf eine Wegkarte startet die
  Partie sofort — separater „Partie starten"-Button entfernt.
- Abschluss: „Ergebnis speichern"-Button entfernt; Speichern passiert schon
  automatisch am Partie-Ende (submitAssessment). Hinweis „automatisch
  gespeichert" ergänzt. btnSave-Listener null-sicher gemacht.
- Seilbahn: Talstation (Baukörper + Satteldach + Umlenkrad) ergänzt — der
  Lift-Anfang wirkte vorher „transparent".
- Responsive/iPad: Panels bekommen Höhen-Deckel + internes Scrollen (decken
  nie den ganzen Schirm zu). Neue Media-Query für iPad-Landscape (901–1200px
  / niedrige Höhe): kompaktere Panels, Graphen nach rechts-unten aus dem
  Info-Panel-Bereich. Sehr flache Screens blenden die Graphen aus.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 14:15:41 +02:00
Adminator 9937fbf62a Fix: Länder-Filter im Lehrplan-Bezug (modul_detail.php) wirkungslos
Der Filter-JS liest a.dataset.anchorType, aber die Anker-<div>s setzten
kein data-anchor-type (nur data-country). Dadurch war `type === 'fach'`
nie wahr → für ein gewähltes Land wurde nie ein Anker ausgeblendet.
Fix: data-anchor-type am Anker-div ergänzt. Gilt für alle Modul-Seiten.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 13:46:42 +02:00
Adminator 5655af81bf Lehrer-Observability + Weltküche-Inhalt + Wrapper-Fix + Passstraße
teacher.html: Menü „Live" → „Ergebnisse" mit Unteransichten
Tag·Aktuell·Vergleich·Gesamt (alte Ergebnisse-Ansicht ist jetzt „Gesamt").
Neue Kennzahl Qualität (grafischer richtig/falsch-Balken) in Aktuell +
Vergleich + Weltküche-Zeile, Gerichte-Zähler (Fleiß), Labels entschärft
(„Kritisch" → Stark/Solide/Viele Fehler).

Weltküche: korrekte Artikel (der/die/das) für alle 70 Zutaten in
production-matrix.json; verdrehten Herkunfts-Satz + Heimat-Banner neu und
marktbewusst (Ukraine-Distraktor ehrlich erklärt), „man"-Konstruktionen
für Singular/Plural.

_scripts.php: renderPage() injizierte Favicon per strrpos ins letzte
</head> — das lag in teacher.htmls printBatchTickets-JS-String → SyntaxError
zerschoss das ganze Inline-Script auf /teacher. Fix: strpos (erstes </head>).

tourismusregion: neue Karte passstrasse in maps-custom.json (Route bergauf
136 Punkte, 41 Bauslots) aus Editor-Export.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 13:32:24 +02:00
Adminator 4bfb6539cb Weltkueche Fundament: geschaffte Gerichte persistent (localStorage, Schueler-Reload) + Backend-Submit pro Gericht (Lehrer-Historie: score/correctClicks/wrongClicks/completed) + Fehler-Zaehler
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 12:38:03 +02:00
Adminator f6df2eb79f Teacher: Triage 'Nachfassen'->'Nicht aktiv'; Weltkueche live-state phase-Bug gefixt (zeigte immer 'forschen', jetzt 'Gericht X · Zutat Y/Z')
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 12:21:24 +02:00
Adminator ec102b7c36 Weltkueche Punkte-Regel: richtig +100, jeder Fehlklick -25 (progressiv, statt Flat 100/60); Regel im Task-Banner sichtbar; Heimat-Zweig 2 Korrekte (Heimat + 1 realistische)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 12:08:45 +02:00
Adminator 9ec7ad67f1 Weltkueche Heimat-Regel ehrlich: regionale Gerichte haben Heimat + realistische EU-Nachbar-Produzenten als korrekt (immer >=2 Optionen), ferne/klimafremde bleiben Distraktoren
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 12:02:22 +02:00
Adminator b9bcbf9198 Backend-Editoren admin-geschuetzt (admin_gate) + Admin-Hub auf Admin-Seite; save_map admin-oder-lehrer; foto-upload admin-bypass (PIN bleibt)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 11:54:08 +02:00
Adminator 2bdaa0f6cc Admin-Accounts-Editor (CRUD inkl. 2FA-Mail) + Regel: Lehrer-Username = E-Mail (Maske + register), Schueler frei
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 11:43:04 +02:00
Adminator b0fe3fdf86 Tourismusregion: neues Passstrassen-Hintergrundbild (Photoshop, 1536x1024)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 19:40:26 +02:00
Adminator ad627331f0 Fix: save_map.php ruft Session::start() vor requireTeacher (Editor-Speichern schrieb nie in Datei, fiel immer auf Copy-Fallback zurueck)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 19:16:09 +02:00
Adminator 75511630c8 Tourismusregion: Talschleife-Startpunkt korrigiert (Route beginnt weiter links)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 19:14:09 +02:00
Adminator 81ba268ea8 Tourismusregion: Custom-Karte kreuzung ergaenzt (Routen + Bauslots aus Editor)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 16:33:45 +02:00
Adminator 1950542ae5 Tourismusregion: Custom-Karten talschleife + seerunde (Routen + Bauslots aus Editor)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 15:57:41 +02:00
Adminator eba9e54c70 Review-ToDo aktualisiert: Batch 2 deployed; Heli-Navi gestrichen; neue Liste
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 12:02:09 +02:00
Adminator 8b1088a070 Balancing: sonnensystem (Erst-Treffer-Bewertung, Loesung nicht aufdecken, Level-Badge) + energiemanager (echter Blackout an Netzfrequenz, Schwierigkeitsrampe)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-15 21:59:32 +02:00
Adminator fb44ec7afe student_id-FK-Migration Stufe 1+2: Name-Joins -> student_sessions.student_id
- student_sessions: neue Spalte student_id (+Index), backfilled aus (class_id,display_name)
- Session::createStudent setzt student_id (per Lookup, falls nicht uebergeben)
- alle Joins students<->student_sessions von display_name auf student_id umgestellt:
  Benchmark.php, live.php (5x), results.php (4x + runs), modules.php, profile.php, progress.php (answers+runs)
- verlustfrei verifiziert (alt-Join == neu-Join, class 99/102)

Robuster gegen Umbenennung/Doppelnamen, indexierbare Joins.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-15 19:16:41 +02:00
Adminator 2984d93e7e Review-Batch P0: Sicherheit + Schueler-Ergebnisse + Assessments-Aufblaehung
Sicherheit:
- progress.php: IDOR geschlossen (student_id-Zweig verlangt Lehrer-Login + Klassenbesitz)
- licenses.php: ?admin=1 und generate nur noch fuer echten Admin; Collision-Retry mit Cap
- .htaccess: .env/.sh/.sql/.bak Deny (Defense-in-Depth)

Schueler-Ergebnisse (kritisch):
- sim-metrics.js + .ivm-CSS in schueler.html; renderOwnRunCard-Fallback zeigt jetzt
  Sterne + grafische Kennzahlen fuer die 9 bisher leeren Sims
- sim-metrics.js: klima final_budget als "Mio EUR" statt "EUR" (Faktor 10^6)

Skalierung:
- assessment.php: Zwischen-Pings (phase running/started) nicht mehr persistiert
- heli: 30-s-assessmentPing entfernt (Live-Zustand laeuft ueber Heartbeat)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-15 16:21:25 +02:00
Adminator a3c5753cd7 Aufgabe beenden: class_modules zuruecksetzen (Bug: Schueler sah Aufgabe weiter)
stop setzt class_modules teacher_started -> free (paused=0, started_at=NULL),
sonst liest die Schueler-Ansicht (class_modules) die beendete Aufgabe weiter.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 02:45:35 +02:00
Adminator 031ca87daf Aufgabe: Freigabe/Tempo entfernt (sofort startbar); Beenden als Dialog
- keine Vorbereiten/paused/Start-freigeben/Pause mehr — Aufgabe ist ab Vergabe
  sofort startbar (paused:false), Card zeigt nur "Laeuft" + Beenden
- Schueler-Card immer "Jetzt starten" (kein Warte-Zustand)
- "Aufgabe beenden" jetzt ordentlicher Dialog (#modal-stopassign) statt confirm()

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 02:41:43 +02:00
Adminator 405fcc2b69 Aufgabe: Ab-wann + Bis-wann mit gutem Picker; neue Klasse nur Weltkueche frei
- Modal: "Ab wann" (Sofort/Zeitpunkt) + "Bis wann" (Presets + date/time statt
  datetime-local), Live-Zusammenfassung; zukuenftiger Start => vorbereitet
- assignments.php: startsAt-Param (Default NOW()), T->Space
- modules.php: neue Klasse ohne Eintrag -> nur Weltkueche frei (_defaultMode),
  Rest gesperrt; Freigabe-Matrix bleibt (getrennt von der Aufgabe)
- schueler.html: Hinweis "Deine Lehrperson kann weitere Simulationen freischalten"

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 17:39:28 +02:00
Adminator 7f774c7b2a Aufgaben-Dropdown: geplante Module nicht vergebbar (nur laufende)
stadt (Stadt & Raumplanung) auf 'geplant' gesetzt (Prod war 'aktiv').

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 13:53:37 +02:00
Adminator bbef4856d0 Klassenaufgabe: Modal mit Frist-Schnellwahl + Live-Bestaetigung; Start/Tempo auf aktiver Card
- Modal "Aufgabe erteilen": Frist-Buttons (Heute/Morgen/+1 Woche/Kein Limit),
  Default +1 Woche, Tempo-Checkbox "Vorbereiten", Live-Zusammenfassung als
  Bestaetigung, Button "Auftrag erteilen"
- Aktive Klassen-Aufgabe-Card: Sim-Bild + Status (Vorbereitet/Laeuft) +
  Steuerung "Start freigeben" / "Pause" / "Beenden" direkt auf der Card
  (Tempo-Start nicht mehr in der individuellen Freigabe)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 11:58:04 +02:00
Adminator 3a2e65ebd9 Schueler: Auftrags-Card im Marken-Stil (Sim-Bild + Orange + 📋 Auftrag-Badge)
- renderAuftragCard nutzt card_image + .mod-card-Muster statt Verlauf+Emoji
- Warte-Zustand bei pausierter (Tempo-)Freigabe: " Wartet auf Freigabe"

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 11:49:34 +02:00
Adminator 97144495a1 Live/Vergleich an Klassenaufgabe gekoppelt
- aktive Klassenaufgabe wird automatisch als Vergleichs-Modul vorgewaehlt
  (Chip mit 📋 markiert, immer vorne)
- Aufgaben-Banner: begonnen X/N (aus matrix) · gerade aktiv A · Oe Fortschritt
- zeigt Aufgabe auch wenn noch niemand aktiv ist (mit Hinweis)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 01:27:36 +02:00
Adminator 5f6abeeb42 Live/Aktuell: allgemeine Erfolgs-Spalten Fortschritt + Lage
- _liveProgressPct/_liveMood: aus dem Live-State jeder Sim ableitbarer
  Fortschritt (%) und Lage-Ampel (health/heuristik) -> modueluebergreifend
  vergleichbar
- weltkueche: redundante "Gerichte" ersetzt durch Fortschritt-Balken + Lage-Ampel

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 01:05:19 +02:00
Adminator ebdd1ce438 Live: weltkueche-Spalten kuratiert; pausierte Sessions bleiben sichtbar
- LIVE_PRIMARY_FIELDS.weltkueche: Gericht/Herkunft/Zutaten/Gerichte/Fehlklicks
  (statt Rohdaten-Dump aller State-Keys) — 5 Spalten, kein Quer-Scroll
- Idle/Pause: live.php Fenster 30s->2h (LIVE_IDLE_WINDOW_SEC); Aktuell zeigt
  laenger inaktive Sessions als "pausiert" (⏸, grau) statt sie zu verlieren;
  braucht-Hilfe + aktiv-Zaehler nur fuer wirklich aktive Sessions

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 00:43:40 +02:00
Adminator 07010f2302 Live: Cockpit entfernt; braucht-Hilfe + Reflexionen in Aktuell
- Live-Modi jetzt nur Tag / Aktuell / Vergleich (Cockpit-Toggle raus)
- Aktuell: Live-"braucht Hilfe"-Banner + rote Zeilen-Hervorhebung (Heuristik
  gespiegelt aus live.php), Spectator per Zeilenklick bleibt
- Reflexionen als Block am Ende von Aktuell, gecacht gegen 4s-Refresh-Flackern

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 00:32:59 +02:00
Adminator 05ace93318 Live-Tag: Sterne nach Abschluss immer am Balkenende (gold, gefuellt+leer)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 20:31:21 +02:00
Adminator 25faca0819 Lehrer-Menue: Live an 2. Stelle; Live-Default-Ansicht = Tag
- Live-Tab direkt nach Uebersicht (tabs-Array + DOM synchron)
- Live-Modus-Default 'uebersicht' (Tag), Toggle-Reihenfolge Tag zuerst

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 20:16:53 +02:00
Adminator 532956fd7d Modul-Datumsfilter: Picker auch im Detail-Modal + global persistent
- Datums-Picker (von/bis) jetzt auch im Modul-Detail-Modal; Aendern laedt die
  Ansicht mit neuem Zeitraum und haelt Uebersichts-Cards synchron
- _modFilter global in localStorage persistiert (bleibt bis Aenderung)
- resetModDateModal ↺ setzt auf Schuljahresbeginn

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 19:07:38 +02:00
Adminator 52e9fafd92 Uebersicht: Wochengrafik mit Navigation, Triage-Cards immer, Modul-Datumsfilter
Wochen-Saeulengrafik:
- Pfeile Woche vor/zurueck (Kalenderwoche, view=activity&week_offset)
- Datum unter jedem Wochentag, halbierte + condensed Schrift
- Y-Skala links mit Anzahl, skaliert auf Max-Saeulenhoehe
- rendert auch bei leerer Woche (mit Hinweis) fuer die Navigation

Triage: alle 5 Cards immer sichtbar, leere mit "Aktuell niemand betroffen".

Module — Stand der Klasse:
- von/bis-Datumsfilter (Default bis=heute, von=Schuljahresbeginn 1. August)
- neuer view=mod_stats speist die Cards datumsgefiltert
- view=module auf student_results umgestellt (Datum+Score+JSON), from/to-Filter
  wirkt auf Tabelle, Highlights, Champions, classStats; Zeitraum im Modal-Header

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 11:43:12 +02:00
Adminator e750402799 Uebersicht: Top Performers heute + neue Abzeichen heute; Wochengrafik-Labels; Spielzeit sortierbar
- results.php view=today: heutige finale Laeufe (topToday) + vorher/nachher-Progress
  je Schueler:in x Sim (aus student_results rekonstruiert) fuer Badge-Erkennung
- teacher.html: Sektion "Top Performers heute" (heutige Wertung, Sterne + Erfolg)
  ersetzt Allzeit-Top; darunter "Neue Abzeichen heute" (badges.js, jetzt erfuellt
  aber vor heute nicht)
- Wochen-Saeulengrafik: Sim-Titel klein in die Balkenabschnitte, hoehere Grafik
- Modul-Tabelle: Spielzeit-Spalte sortierbar (Quoten-Spalten schon sortierbar)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 22:43:41 +02:00
Adminator 56d8a3217b Uebersicht: Abstand vor Top-Performer-Karte
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 22:32:48 +02:00
Adminator bfc90b78de Modul-Uebersicht: relevante Kennzahlen pro App korrigiert + Quoten
Alle $MODULE_HIGHLIGHTS gegen echte Daten (Klasse 102) verifiziert und auf die
tatsaechlichen Feldnamen umgestellt (viele waren veraltet/leer, z.B. farmer,
sonnensystem, energiemanager, busfahrt, logistik, heli, tourismus*).

- kofferdetektiv NEU: Geloest-Quote, Erstversuch, Fehlversuche, Oe Hinweise
- weltkueche/fluss NEU
- fluggesellschaft NEU (aus Submit-Schema)
- Berechnete Quoten via num/den -> Prozent (Erfolgsquote statt Rohzahl):
  kofferdetektiv, weltkueche, busfahrt, logistik, energiemanager, eu-werkstatt,
  sonnensystem, tourismustal, fluggesellschaft
- heli: Planung/Start/Landung/Level; sim-metrics: Level + Oe Hinweise ergaenzt

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 21:22:50 +02:00
Adminator ff285e9af3 Verlauf-Grafik aus Sim-Schema (mehrere Linien) + Ampelbalken in allen Spalten
- renderRunsLineChart nutzt wieder SIM_METRICS statt highlights -> deckt auch
  Module ohne Highlight-Def ab (weltkueche/fluss zeigten sonst nur Sterne);
  Snapshot bei einem Durchgang via renderSimMetrics-Kacheln
- Modul-Tabelle: Ampelbalken auch fuer Durchgaenge, Spielzeit, Zuletzt
  (mehr/aktueller = gruen) -> alle Spalten konsistent grafisch

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 16:14:16 +02:00
Adminator d1a01915af Modul-Klassenuebersicht: Ampelbalken pro Zelle + Verlauf als Liniengrafik
- renderModDetail: kleiner Ampelbalken je Kennzahl-Zelle, Werte spaltenweise
  normiert, Richtung aus h.agg (gruen=positiv, weniger-ist-besser invertiert)
- Sterne-Zelle mit Ampelbalken (n/5)
- Verlauf-Button zeigt statt JSON eine Liniengrafik ueber die wichtigsten
  Kennzahlen (eine Linie je Highlight-Spalte + Sterne, oben=besser, Legende
  mit letztem Wert + Trendpfeil); Snapshot-Kacheln bei nur einem Durchgang
- sim-metrics.js: dir:'lo' fuer Kennzahlen wo weniger besser ist

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 16:00:44 +02:00
Adminator 5bf8f0fe03 Drilldown: volle Modalbreite + durchgaengige Ampelfarben (gruen->rot)
- Modal max-width 640->1120px, Kachel-Grid dichter -> Kennzahlen einzeilig
- Werte UND Balken ampelgefaerbt (pct/pctInv/ratio), Sterne mit Ampelbalken
  je n/5 -> Vergleich auf einen Blick

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 15:51:33 +02:00
Adminator c83da66325 Lehrer-Drilldown: grafische Kennzahlen, Avatar-Bild, Sterne & Abzeichen
- sim-metrics.js: kuratiertes Feld-Schema pro Sim (Sterne/Prozentbalken/
  Verhältnis/Geld/Temperatur), technische Felder ausgeblendet, sauber benannt
- Drilldown zeigt Avatar als Bild (avatar:<slug>), Erfolg als Sterne,
  Parameter als grafische Kacheln, Abzeichen-Sammlung pro gespielter Sim
- live.php student_runs liefert player_progress fuer die Abzeichen

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 15:35:29 +02:00
Adminator 2db99c37ee Übersicht: Schüler-Drilldown (Klick → aktuelle Simulationsparameter, cockpit-artig)
live.php: student_runs=<id> liefert letzte Läufe (detail_json = Parameter) + Live-State
+ Recency. teacher.html: Klick auf Triage-Zeile öffnet Modal mit Erfolg/Zuletzt, Live-
Tätigkeit und den letzten Durchläufen samt geparsten Sim-Parametern (CO₂, Fehlklicks …).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 15:20:40 +02:00
Adminator 4cd6302f0a Übersicht: Erfolg-Balken-Fix (Farbe auf Füllung statt Track)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 15:16:58 +02:00
Adminator 1f00d83232 Übersicht: Empfehlung nur aus AKTUELLER Leistung (Recency)
Denkfehler behoben — eine Empfehlung reagiert auf das Zuletzt-Gesehene, nicht auf
einen Allzeit-Rückblick. live.php cockpit liefert jetzt recentErfolg (Ø letzte 3
Läufe), earlyErfolg (frühere Läufe), daysSince, recentPlays. Triage rechnet darauf:
>14 Tage weg → Nachfassen; recent schwach → Fördern; recent+viel → Begleiten; recent
stark, kaum gefordert → Fordern; recent > früher → Bestätigen. Neue Spalte „Zuletzt",
Legende erklärt: Erfolg = letzte Läufe, Verlauf = nur Historie. 4b-Daten mit
kontrollierter Recency neu (jede Gruppe besetzt).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 15:11:35 +02:00
Adminator 84386e93d0 Lehrer: Default-Klasse = zuletzt gewählte (persistent), Fallback älteste
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 14:51:48 +02:00
Adminator 504b0098a6 Abzeichen: thematische Sim-Abzeichen + saubere Icons + Lehreransicht
- badges.js: 5 Basis-Abzeichen + je Sim 1 thematisches (Vier-Jahreszeiten,
  Sterne-Koch, Alpen-Pilot …), 19 sauber generierte Flat-Emblem-Icons (keine Emojis)
- Erfolge-Tab: Sammlung mit Bild-Icons, gesperrte grau = Ziele; alte Emoji-Badges raus
- Lehrer-Matrix: neue Spalte „Abzeichen" (freigeschaltet von gesamt) pro Schüler:in

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 14:35:43 +02:00
Adminator 65ca8692cb Abzeichen: gemeinsame Bibliothek + Sammlung im Erfolge-Tab
Neue badges.js: 5 einheitliche Abzeichen pro Sim (Einstieg/Fortgeschritten/
Könner/Meister/Ausdauer), Bedingungen aus allgemeinen Leistungsdaten (plays/
best_stars/level) → gelten sofort für ALLE Sims. Gesperrte Abzeichen sichtbar
als Ziele. ggsErfolgToStars() für Sterne aus normiertem Erfolg. Erfolge-Tab in
schueler.html zeigt die Sammlung pro Simulation (auch ungespielte = Ziele).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 14:24:55 +02:00
Adminator 3d1b8e49a3 Übersicht-Feinschliff + Idle-Fairness
- Überschrift „Klassenübersicht", Sektion „Empfohlene Aktivität für dich."
- Volle Legende (Gradient-Balken, Ampelpunkte, Beispiel-Sparkline)
- 4b-Testdaten: jede Triage-Karte besetzt (Beteiligen/Begleiten/Fördern/Fordern/
  Bestätigen), Verlauf in den letzten 10 Wochen inkl. steigender Fälle
- live-client.js: Idle-Fenster 90s→5min (Lesen/Denken nicht bestrafen) +
  Tab-Sichtbarkeit blendet echtes Weg-Sein aus

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 13:36:03 +02:00
Adminator 1c2fa2e1b4 Übersicht: Cap grafisch (rote Kappe über gedeckelten Verlauf-Balken)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 13:20:19 +02:00
Adminator 15ac35a7ad Lehrer-Übersicht: Interventions-Block (Erfolg/Aktiv/Verlauf + Triage) live
Neuer Block oben im Übersicht-Tab: 5 Stat-Karten (Erfolg-Klassenschnitt, Aktuell
aktiv als Streifen, Verlauf-Klassenschnitt mit Skala, Schüler, Simulationen) +
Interventions-Triage (Fördern/Fordern/Begleiten/Bestätigen/Beteiligen) mit
Erfolg-Ampelbalken, blinkender Live-Aktiv-Ampel und Verlaufs-Sparkline pro Person.
Ampelfarben nur für Leistung, Triage-Karten neutral. Alte 5 Stat-Cards raus,
Top-Performer bleibt. Wochen-Cap gegen Zwischenspeicher-Log-Ausreißer.

- results.php: neue fleiss-range 'weeks' (letzte 10 ISO-Wochen)
- 2. Testklasse „3b Klasse" (3 Schüler); Klasse 99 → „4b Klasse"

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 13:17:22 +02:00
Adminator 69888445c7 Handbuch: Fachtext formative Leistungsbeurteilung + Literaturverzeichnis
Neuer Abschnitt in „6. Bewertung" (Anker #leistungsbeurteilung): formativ vs.
summativ, drei Bezugsnormen (kriterial/ipsativ/prozess statt normativ), Wirkungs-
belege mit ehrlicher Effektstärken-Einordnung, Leitplanken (Butler, Kluger&DeNisi,
keine Bestenliste), Fleiß als produktives Engagement, Diagnose→Intervention. Volles
Literaturverzeichnis (27 Quellen). Lehrer-Cockpit verlinkt an der Benchmark-Box
darauf. Normative Reflexionsaufgabe entschärft.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 00:36:05 +02:00
Adminator cb16c3742e Testklasse: realistische Leistungsdaten (12 neue Schüler + Ben/Clara)
Damit die Lehrer-Leistungsübersicht sinnvolle Werte hat. 14 Schüler:innen mit
Skill-Spread um Anna (Referenz): David 95 … Hannes 34. Pro Schüler:in ~16
Sim-Durchläufe über ~10 Module (Hochrechnung: ~70 GW-Std/Jahr, 1/3 Sims → ~20/Jahr).
Konsistent über player_progress (Matrix), assessments+student_sessions (Benchmark)
und student_results. Benchmark-Scores auf ±10 zum Ziel verifiziert. id-sicher
(username-Referenz) + idempotent (Cleanup-Block), Login gesperrt, Anna unberührt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 23:38:29 +02:00
Adminator 7915512195 Weltküche: DACH/EU-Priorität wiederhergestellt + Beschreibungen
Die Umstellung auf echte Menge hatte die EU-Priorität eingeebnet. Jetzt Stufen-
folge: EU-Nachbar (Hauptweg zu UNSEREM Markt, kurzer Weg) VOR fernem Welt-
Lieferant (nur wo es hier nicht wächst, z.B. Pfeffer→Vietnam+Brasilien) VOR
"Big Player, kommt kaum an" (world-far). Innerhalb einer Stufe zählt die Menge.

- MARKET_TIER {eu:0, global:1, world-far:2}
- explainChoice: EU-Antwort erklärt "aus EU-Binnenmarkt, kurzer Weg, kein Zoll";
  world-far-Fehlklick erklärt "weltweit groß, aber kaum im EU-Handel"
- "in dieser Runde"-Texte entfernt (Auswahl ist jetzt deterministisch)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 16:54:39 +02:00
Adminator e7453d9072 Weltküche: echte Hauptlieferanten statt Zufall + Einheiten-Fix
- Welt-Zutaten: die 2 tatsächlichen Hauptlieferanten nach Menge (Pfeffer →
  Vietnam+Brasilien, Kakao → Elfenbeinküste+Ghana) statt log-gewichtetem Zufall,
  der kleine Produzenten (Sri Lanka, Kambodscha) fast gleich oft zog
- Reihenfolge: „beliefert unseren Markt" (eu/global) vor „selten hier" (world-far)
- fmtTonnes: „220.000 t/Jahr" statt „220 Tsd t" (kindgerecht, kein SI-Kürzel kt),
  Mio mit deutschem Dezimalkomma („1,5 Mio t")

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 16:47:35 +02:00
Adminator 1c5356422c Weltküche: Heimat-Regel – Zutaten folgen dem Gericht statt Zufall
Löst "warum kommt Deutschland nicht vor?": In regionalen Gerichten kommt jede
Zutat, die das Herkunftsland selbst erzeugt, von dort (Tiroler Gröstl → Tiroler
Speck/Kartoffeln aus Österreich). Nur was hier nicht wächst (Pfeffer, Olivenöl)
reist von weit her – die eigentliche Lektion. Datengetrieben: Test "erzeugt das
Heimatland die Zutat?" filtert automatisch, kein Länder-Bias (hängt am Gericht).

- dishes.json: heimat (25 Gerichte) + signature-Labels (5); exotische ohne heimat
- buildTaskFor: Heimat-Regel sticht Zufall aus, wenn Heimatland Produzent ist
- Klick-Feedback beantwortet "warum nicht Deutschland?" direkt (showWrong/explainChoice)
- Auflösung erklärt Heimat-Logik + zeigt Antwort auch wenn kein Top-5-Produzent

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 15:56:55 +02:00
930 changed files with 70552 additions and 1508 deletions
@@ -0,0 +1,42 @@
# Relevante Infos für Lehrpersonen — Zusammenfassung
Stand 2026-08-19. Konsolidiert, was wir zum Lehrer-Cockpit festgehalten und gebaut haben.
## Die Kernfrage der Lehrperson
> „Wer ist gerade **engagiert und macht es gut** — und wer **blödelt herum oder hängt fest**?"
Alles im Cockpit dient dieser Frage. Kein Zahlen-Dump, sondern wenige aussagekräftige Signale.
## Die 6 relevanten Signale
| Signal | Was es beantwortet | Woher |
|---|---|---|
| **Fortschritt** | Wie weit durch die Sim? (%) | `progressPct` / abgeleitet je Sim |
| **Qualität** | Blödeln vs. gut — Verhältnis **richtige ↔ falsche** Klicks (grafischer Balken) | `correctClicks`/`wrongClicks` (bisher Weltküche; andere ziehen nach) |
| **Fleiß** | Wie viel im **gewählten Zeitraum** geschafft? (z. B. Gerichte, gelieferte Aufträge) | assessments im Intervall |
| **Lage** | Klartext: **Stark / Solide / Viele Fehler** (kein „Kritisch"-Jargon) | `_liveMood` je Sim |
| **Aktivität** | aktiv / idle / **pausiert** — war das Kind die ganze Stunde dabei? | Heartbeat `__activeMs`/`__idleMs`/`__paused` |
| **Hilfe-Bedarf** | „🆘 braucht evtl. Hilfe" | `_liveNeedsHelp` je Sim (z. B. Budget < 0, viele Fehlversuche) |
## Die Ansichten (Menü „Ergebnisse")
- **📅 Tag** — Zeitstrahl aller Sessions des Tages je Kind, eingefärbt nach Erfolg. Balken tragen **Sim-Kürzel/Wort** (LOG, Logistik …), Klick öffnet Detail.
- **🔴 Aktuell** — Live-Tabelle je Sim mit **kuratierten** Spalten (LIVE_PRIMARY_FIELDS), Qualitäts-Balken, Fortschritt, Lage. Aktualisiert alle 4 s.
- **📊 Vergleich** — aktive Kinder EINER Sim nebeneinander (Fortschritt + Qualität) → direkter „wer gut / wer nicht".
- **📚 Gesamt** — Aggregat (Fleiß-Zeit, Modul-Karten, Matrix) über den gewählten Zeitraum.
## Design-Prinzipien (verbindlich)
1. **Kuratierte Spalten je Sim** — nie Roh-State dumpen, nie interne `__`-Heartbeat-Keys zeigen. Fehlt ein Schema → gefilterter Fallback (ohne Rausch-Felder).
2. **Klartext statt Jargon** — „Stark/Solide/Viele Fehler" statt „Kritisch/OK"; „Gerade dabei" statt „Phase".
3. **Ehrliche Zeit** — Aktivzeit zählt **nicht** bei Spiel-Pause und **nicht** bei Tab-weg/idle (>5 min). Sonst wirkt ein pausiertes Kind fälschlich „fleißig".
4. **Ein Wort + 3-Buchstaben-Kürzel je Sim** (SIM_LABELS) — enge Balken nutzen das Kürzel, breite das Wort.
5. **Datenschutz** — nur was die Lehrperson pädagogisch braucht; verdeckte Antworten (z. B. Kofferdetektiv-Ziel) bleiben verdeckt, solange das Kind sucht.
## Was jede Sim liefern sollte (GGS_LIVE_STATE)
- `progressPct` (0100), ein Fortschritts-Zähler (z. B. `completed`/`total`),
- **`correctClicks`/`wrongClicks`** (für die Qualitäts-Kennzahl — Ziel: alle Sims),
- optional `health` (good/ok/struggling) für die Lage,
- Heartbeat-Felder (`__activeMs` etc.) kommen automatisch aus live-client.js; bei Pause `window.__GGS_LIVE__.setPaused(true)` rufen.
## Offen (siehe project_backlog_2026-08-18 / project_lehrer_observability_overhaul)
- **Aktivitäts-/Qualitätsstreifen** pro Kind über die Stunde (grün→rot, aktiv→inaktiv & bullshit→ernsthaft) — braucht Zeitreihen-Aktivitätsdaten.
- Weltküche-**Gesamt-Kachel** (Gerichte · Ø Punkte · Fehlquote).
- **Andere Sims** mit `correctClicks`/`wrongClicks` nachrüsten (bisher nur Weltküche).
+34
View File
@@ -0,0 +1,34 @@
const { chromium } = require('@playwright/test');
(async () => {
const b = await chromium.launch(); const p = await b.newPage();
const errs=[]; p.on('pageerror',e=>errs.push(e.message)); p.on('console',m=>{if(m.type()==='error')errs.push(m.text());});
await p.route('**/api/admin', r => r.fulfill({ contentType:'application/json', body: JSON.stringify({authenticated:true}) }));
await p.goto('http://localhost/geograsim/App/admin-weltkueche.html');
await p.waitForTimeout(2000);
const r = await p.evaluate(() => {
const dishes = [...document.querySelectorAll('.dish')];
const names = dishes.map(d => d.querySelector('.nm')?.textContent);
function dishInfo(namePart){
const d = dishes.find(x => (x.querySelector('.nm')?.textContent||'').toLowerCase().includes(namePart));
if(!d) return null;
const rows = [...d.querySelectorAll('tbody tr')].map(tr => ({
ing: tr.querySelector('.ing-nm')?.textContent.replace(/\s+/g,' ').trim(),
ok: [...tr.querySelectorAll('.cty.ok')].map(c=>c.textContent.replace(/\s+/g,' ').trim()),
dist: [...tr.querySelectorAll('.cty.dist')].map(c=>c.title.split(' · ')[0]),
}));
return rows;
}
const groestl = dishInfo('tiroler gröstl');
const kart = groestl && groestl.find(r => /Kartoffel/i.test(r.ing));
const eierRow = groestl && groestl.find(r => /Eier/i.test(r.ing));
return {
dishCount: dishes.length,
sampleNames: names.slice(0,6),
kartoffelOk: kart ? kart.ok : null,
eierOk: eierRow ? eierRow.ok : null,
warnCount: document.querySelectorAll('.warn').length,
};
});
console.log(JSON.stringify({result:r, pageErrors:errs}, null, 2));
await b.close();
})();
+19
View File
@@ -0,0 +1,19 @@
const { chromium } = require('@playwright/test');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
const r = await page.request.get('https://geograsim.at/teacher.html');
const html = await r.text();
console.log('STATUS', r.status(), 'LEN', html.length);
console.log('has renderLiveGesamt:', html.includes('renderLiveGesamt'));
console.log('has _liveQualityBar:', html.includes('_liveQualityBar'));
console.log('has tab-bar:', html.includes('tab-bar'));
console.log('has Ergebnisse:', html.includes('Ergebnisse'));
console.log('has external script src (module?):', /<script[^>]+src=/i.test(html));
// show script tags
const scripts = [...html.matchAll(/<script[^>]*>/gi)].map(m=>m[0]);
console.log('SCRIPT TAGS:', JSON.stringify(scripts, null, 2));
// show first 600 chars to see redirect logic
console.log('HEAD:', html.slice(0, 1200));
await browser.close();
})();
+22
View File
@@ -0,0 +1,22 @@
const { chromium } = require('@playwright/test');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
const r = await page.request.get('https://geograsim.at/teacher.html');
const html = await r.text();
const idxLogin = html.indexOf('login.html');
console.log('--- context around first login.html reference ---');
console.log(html.slice(idxLogin - 400, idxLogin + 120));
for (const name of ['renderLiveGesamt', '_liveQualityBar']) {
const idx = html.indexOf('function ' + name);
console.log('\n--- "function ' + name + '" @' + idx + ' ---');
if (idx >= 0) console.log(html.slice(idx - 60, idx + 120));
}
const idxErg = html.indexOf('Ergebnisse');
console.log('\n--- context around Ergebnisse ---');
console.log(html.slice(idxErg - 220, idxErg + 80));
await browser.close();
})();
+29
View File
@@ -0,0 +1,29 @@
const { chromium } = require('@playwright/test');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
const r = await page.request.get('https://geograsim.at/teacher.html');
const html = await r.text();
// 1) Static tab-bar markup
const tb = html.indexOf('id="tab-bar"');
console.log('--- #tab-bar markup ---');
console.log(tb >= 0 ? html.slice(tb - 40, tb + 700) : 'tab-bar id NOT found');
// 2) Extract _liveQualityBar function body and run it in isolation
const start = html.indexOf('function _liveQualityBar');
// find matching braces
let i = html.indexOf('{', start), depth = 0, end = -1;
for (; i < html.length; i++) {
if (html[i] === '{') depth++;
else if (html[i] === '}') { depth--; if (depth === 0) { end = i + 1; break; } }
}
const fnSrc = html.slice(start, end);
const fn = new Function(fnSrc + '\nreturn _liveQualityBar;')();
const sample = fn(8, 2);
console.log('\n--- _liveQualityBar(8,2) OUTPUT ---');
console.log(sample);
console.log('\ncontains "80":', String(sample).includes('80'));
await browser.close();
})();
@@ -0,0 +1,294 @@
/**
* gen-display-preview.js
* ----------------------
* Lokales Admin-Werkzeug: erstellt Bildschirmfotos aller Simulationen
* (Onboarding/Start + Spielverlauf) in zwei Auflösungen (iPad + Full HD)
* und generiert daraus eine statische Galerie-Seite.
*
* Ausgabe: App/.LocalDeveloperTools/display-preview/
* shots/<id>__<vp>__<screen>.png
* display_preview.html
*
* Start: node gen-display-preview.js
*/
const { chromium } = require('@playwright/test');
const fs = require('fs');
const path = require('path');
// --- Pfade ---------------------------------------------------------------
const APP_DIR = 'C:/xampp/htdocs/geograsim/App';
const SIMS_DIR = path.join(APP_DIR, 'sims');
const OUT_DIR = path.join(APP_DIR, '.LocalDeveloperTools', 'display-preview');
const SHOTS_DIR = path.join(OUT_DIR, 'shots');
const BASE_URL = 'http://localhost/geograsim/App/sims';
// --- Viewports -----------------------------------------------------------
const VIEWPORTS = [
{ key: 'ipad', label: 'iPad', w: 1180, h: 820 },
{ key: 'fullhd', label: 'Full HD', w: 1920, h: 1080 },
];
// --- Freundliche Namen ---------------------------------------------------
const NAMES = {
weltkueche: '🍲 Welt-Küche',
fluss: '🌊 Flussmanagement',
heli: '🚁 Helikopter-Navigation',
energiemanager: '⚡ Energiemanager',
'eu-werkstatt': '🇪🇺 EU-Werkstatt',
farmer: '🌾 Farmer',
busfahrt: '🚌 Busfahrt',
sonnensystem: '🪐 Sonnensystem',
tourismustal: '🏔️ Tourismustal',
tourismusregion: '🗺️ Tourismusregion',
logistik: '🚚 Logistik',
fluggesellschaft:'✈️ Fluggesellschaft',
staustufen: '💧 Staustufen',
entscheidungstag:'📅 Entscheidungstag',
vulkan: '🌋 Vulkan',
wal: '🐋 Wal',
kofferdetektiv: '🧳 Kofferdetektiv',
stadt: '🏙️ Stadt',
};
// --- Sims finden ---------------------------------------------------------
function findSims() {
return fs.readdirSync(SIMS_DIR, { withFileTypes: true })
.filter(d => d.isDirectory() && fs.existsSync(path.join(SIMS_DIR, d.name, 'game.html')))
.map(d => d.name)
.sort();
}
// --- In-Page: sichtbaren Start-/Weiter-Button klicken --------------------
async function clickStartLike(page) {
return await page.evaluate(() => {
const isVisible = (el) => {
if (!el) return false;
const r = el.getBoundingClientRect();
if (r.width < 4 || r.height < 4) return false;
if (r.bottom < 0 || r.right < 0) return false;
const st = getComputedStyle(el);
return st.visibility !== 'hidden' && st.display !== 'none' && st.opacity !== '0'
&& !el.disabled && !el.classList.contains('hidden');
};
// 1) Prioritäts-Selektoren (bekannte Start-/Primary-Buttons der Plattform)
const prio = [
'.ggs-qi-btn-primary', '[data-action="start"]',
'#btnStart', '#obs-start', '#phase-start',
'.sn-btn-primary', '.ggs-btn-primary',
'.era-card-cta', '.scene-btn',
'.map-btn', '.btn.primary', '.primary', '.next',
];
for (const sel of prio) {
const el = [...document.querySelectorAll(sel)].find(isVisible);
if (el) { el.click(); return sel + ' :: ' + (el.textContent || '').trim().slice(0, 24); }
}
// 2) Text-basiert — führende Emojis/Pfeile/Ziffern strippen, dann Anfang prüfen
const clean = (s) => (s || '').replace(/^[^\p{L}]+/u, '').trim();
const rx = /^(los geht|los!|los →|los\b|start|starten|jetzt starten|neue partie|partie starten|spielen|spiel starten|beginnen|anfangen|einsteigen|erntejahr starten|routenplanung starten|in dieser welt starten|szene|weiter|verstanden|fertig|karte wählen|auswählen)/i;
const cands = [...document.querySelectorAll('button, a.btn, a[role=button], .btn, [role=button], [onclick]')];
const el = cands.find(e => {
if (!isVisible(e)) return false;
const t = clean(e.textContent);
return t.length > 0 && t.length < 44 && rx.test(t);
});
if (el) { el.click(); return 'text :: ' + (el.textContent || '').trim().slice(0, 24); }
return null;
}).catch(() => null);
}
// --- Ein Screenshot ------------------------------------------------------
async function shoot(page, file) {
try {
await page.screenshot({ path: file }); // Viewport-Ausschnitt (exakte Auflösung)
return true;
} catch (e) {
console.log(' ! Screenshot-Fehler:', e.message.slice(0, 80));
return false;
}
}
(async () => {
const sims = findSims();
// Optional: nur bestimmte Sims neu schießen (HTML wird immer komplett neu erzeugt).
const onlyArg = (process.argv.find(a => a.startsWith('--only=')) || '').slice(7);
const shootList = onlyArg ? onlyArg.split(',').map(s => s.trim()).filter(Boolean) : sims;
console.log('Gefundene Sims (' + sims.length + '):', sims.join(', '));
if (onlyArg) console.log('Neu geschossen werden nur:', shootList.join(', '));
fs.mkdirSync(SHOTS_DIR, { recursive: true });
const browser = await chromium.launch();
// results[id][vp] = { start:bool, play:bool, play2:bool, errs:[] }
const results = {};
for (const vp of VIEWPORTS) {
console.log('\n===== Viewport ' + vp.label + ' (' + vp.w + '×' + vp.h + ') =====');
for (const id of shootList) {
results[id] = results[id] || {};
const r = { start: false, play: false, play2: false, errs: [] };
results[id][vp.key] = r;
const ctx = await browser.newContext({
viewport: { width: vp.w, height: vp.h },
deviceScaleFactor: 1,
});
const page = await ctx.newPage();
page.on('pageerror', e => { if (r.errs.length < 4) r.errs.push('PE:' + e.message.slice(0, 60)); });
page.on('console', m => { if (m.type() === 'error' && r.errs.length < 4) r.errs.push('CON:' + m.text().slice(0, 60)); });
const url = BASE_URL + '/' + id + '/game.html';
try {
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
} catch (e) {
r.errs.push('GOTO:' + e.message.slice(0, 50));
}
// 1) Onboarding/Start
await page.waitForTimeout(2500);
r.start = await shoot(page, path.join(SHOTS_DIR, id + '__' + vp.key + '__start.png'));
// 2) Spielverlauf: mehrere Runden klicken (Onboarding schließen -> Menü -> Spiel -> Tutorial weg)
let clicks = 0, last = null;
for (let round = 0; round < 4; round++) {
const clicked = await clickStartLike(page);
if (!clicked) break;
clicks++;
if (clicked === last) break; // gleiches Element erneut -> Abbruch
last = clicked;
await page.waitForTimeout(800);
}
if (clicks > 0) {
await page.waitForTimeout(2500);
r.play = await shoot(page, path.join(SHOTS_DIR, id + '__' + vp.key + '__play.png'));
// 3) optionaler zweiter Play-Screen: noch ein Weiter/Start, falls vorhanden
const more = await clickStartLike(page);
if (more && more !== last) {
await page.waitForTimeout(2000);
r.play2 = await shoot(page, path.join(SHOTS_DIR, id + '__' + vp.key + '__play2.png'));
}
}
const flags = [r.start ? 'S' : '-', r.play ? 'P' : '-', r.play2 ? 'P2' : '--'].join(' ');
console.log(' ' + id.padEnd(18) + '[' + flags + ']'
+ (clicks ? ' clicks=' + clicks : ' (kein Start-Button)')
+ (r.errs.length ? ' ' + r.errs.slice(0, 2).join(' | ') : ''));
await ctx.close();
}
}
await browser.close();
// --- HTML generieren ---------------------------------------------------
const genDate = new Date().toLocaleString('de-AT', {
year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit',
});
const screens = [
{ key: 'start', label: 'Onboarding / Start' },
{ key: 'play', label: 'Spielverlauf' },
{ key: 'play2', label: 'Spielverlauf (2)' },
];
function cell(id, vp, screenKey) {
const rel = 'shots/' + id + '__' + vp.key + '__' + screenKey + '.png';
const abs = path.join(SHOTS_DIR, id + '__' + vp.key + '__' + screenKey + '.png');
if (fs.existsSync(abs)) {
return '<a href="' + rel + '" target="_blank" class="shot">'
+ '<img loading="lazy" src="' + rel + '" alt="' + id + ' ' + vp.label + ' ' + screenKey + '">'
+ '<span class="cap">' + vp.label + ' · ' + vp.w + '×' + vp.h + '</span></a>';
}
return '<div class="missing">— kein Screenshot —<span class="cap">' + vp.label + '</span></div>';
}
let blocks = '';
for (const id of sims) {
const name = NAMES[id] || (id.charAt(0).toUpperCase() + id.slice(1));
// nur Screen-Zeilen zeigen, die mindestens ein Bild haben
const activeScreens = screens.filter(sc =>
VIEWPORTS.some(vp => fs.existsSync(path.join(SHOTS_DIR, id + '__' + vp.key + '__' + sc.key + '.png')))
);
const rows = (activeScreens.length ? activeScreens : [screens[0]]).map(sc =>
'<tr><th class="screen">' + sc.label + '</th>'
+ VIEWPORTS.map(vp => '<td>' + cell(id, vp, sc.key) + '</td>').join('')
+ '</tr>'
).join('\n');
blocks += '\n<section class="sim" id="sim-' + id + '">'
+ '<h2>' + name + ' <span class="simid">' + id + '</span></h2>'
+ '<table><thead><tr><th class="screen"></th>'
+ VIEWPORTS.map(vp => '<th>' + vp.label + ' <span class="res">' + vp.w + '×' + vp.h + '</span></th>').join('')
+ '</tr></thead><tbody>' + rows + '</tbody></table></section>';
}
const nav = sims.map(id =>
'<a href="#sim-' + id + '">' + (NAMES[id] || id) + '</a>'
).join('');
const html = `<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Display-Vorschau (lokal)</title>
<style>
:root { --bg:#f4f2ec; --card:#fff; --ink:#1f2b26; --accent:#1f4b37; --muted:#6b7a72; --line:rgba(0,0,0,.08); }
* { box-sizing:border-box; }
body { margin:0; font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif; background:var(--bg); color:var(--ink); }
header { background:var(--accent); color:#fff; padding:20px 28px; position:sticky; top:0; z-index:10; box-shadow:0 2px 10px rgba(0,0,0,.15); }
header h1 { margin:0; font-size:1.4rem; }
header .meta { font-size:.82rem; opacity:.85; margin-top:4px; }
nav.toc { display:flex; flex-wrap:wrap; gap:6px; padding:14px 28px; background:#e9e6dd; border-bottom:1px solid var(--line); }
nav.toc a { font-size:.82rem; text-decoration:none; color:var(--accent); background:#fff; border:1px solid var(--line); border-radius:999px; padding:4px 11px; }
nav.toc a:hover { background:var(--accent); color:#fff; }
main { padding:24px 28px 60px; max-width:1500px; margin:0 auto; }
section.sim { background:var(--card); border-radius:14px; padding:18px 20px 22px; margin-bottom:26px; box-shadow:0 4px 14px rgba(0,0,0,.06); scroll-margin-top:90px; }
section.sim h2 { margin:0 0 14px; font-size:1.25rem; color:var(--accent); display:flex; align-items:baseline; gap:10px; }
.simid { font-size:.72rem; font-weight:600; color:var(--muted); background:#eef0ec; padding:2px 8px; border-radius:6px; letter-spacing:.03em; }
table { width:100%; border-collapse:collapse; table-layout:fixed; }
thead th { text-align:left; font-size:.82rem; color:var(--muted); padding:0 0 8px; font-weight:700; }
thead th .res { font-weight:500; opacity:.7; }
th.screen { width:150px; vertical-align:top; font-size:.9rem; color:var(--ink); padding-top:8px; }
td { padding:6px 6px 14px; vertical-align:top; width:calc((100% - 150px)/2); }
a.shot { display:block; border:1px solid var(--line); border-radius:8px; overflow:hidden; background:#0d1512; text-decoration:none; }
a.shot img { display:block; width:100%; max-width:100%; height:auto; }
.cap { display:block; font-size:.72rem; color:var(--muted); padding:5px 8px; background:#fafafa; border-top:1px solid var(--line); }
a.shot .cap { color:#c8d4ce; background:#141f1a; border-top:none; }
.missing { display:flex; flex-direction:column; align-items:center; justify-content:center; gap:6px; min-height:120px; border:1px dashed var(--line); border-radius:8px; color:var(--muted); font-size:.85rem; background:#faf9f5; }
.missing .cap { background:none; border:none; }
@media (max-width:820px){ th.screen{width:90px;} td{width:calc((100% - 90px)/2);} }
</style>
</head>
<body>
<header>
<h1>Display-Vorschau (lokal)</h1>
<div class="meta">${sims.length} Simulationen · je Onboarding/Start + Spielverlauf · iPad 1180×820 &amp; Full HD 1920×1080 · generiert am ${genDate}</div>
</header>
<nav class="toc">${nav}</nav>
<main>${blocks}
</main>
</body>
</html>`;
const outFile = path.join(OUT_DIR, 'display_preview.html');
fs.writeFileSync(outFile, html, 'utf8');
console.log('\nHTML geschrieben: ' + outFile);
// --- Zusammenfassung ---------------------------------------------------
console.log('\n===== ZUSAMMENFASSUNG =====');
let totalShots = 0, missingPlay = [];
for (const id of sims) {
const parts = [];
for (const vp of VIEWPORTS) {
const r = (results[id] && results[id][vp.key]) || {};
const n = (r.start ? 1 : 0) + (r.play ? 1 : 0) + (r.play2 ? 1 : 0);
totalShots += n;
parts.push(vp.label + ':' + n + '/3(' + (r.start ? 'S' : '-') + (r.play ? 'P' : '-') + (r.play2 ? '2' : '-') + ')');
if (!r.play) missingPlay.push(id + '/' + vp.key);
}
console.log(' ' + id.padEnd(18) + parts.join(' '));
}
console.log('\nScreenshots gesamt: ' + totalShots);
console.log('Fehlende Play-Screens: ' + (missingPlay.length ? missingPlay.join(', ') : 'keine'));
console.log('Seite: http://localhost/geograsim/App/.LocalDeveloperTools/display-preview/display_preview.html');
})();
@@ -0,0 +1,17 @@
const { chromium } = require('@playwright/test');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
const res = await page.goto('http://localhost/geograsim/App/modul-weltkueche');
await page.waitForTimeout(700);
const r = await page.evaluate(() => {
const sec = document.getElementById('lehrplan-bezug');
const komps = [...document.querySelectorAll('.md-kompetenz .md-kompetenz-title')].map(e=>e.textContent.trim());
const anchors = document.querySelectorAll('.md-anchor').length;
const countryChips = [...document.querySelectorAll('.md-lehrplan-filters .md-chip')].map(c=>c.textContent.trim());
const empty = document.body.textContent.includes('Noch keine Kompetenzen zugeordnet');
return { hasSection: !!sec, kompetenzTitles: komps, anchorCount: anchors, countryChips, showsEmpty: empty };
});
console.log(JSON.stringify({ httpStatus: res.status(), result: r }, null, 2));
await browser.close();
})();
@@ -0,0 +1,17 @@
const { chromium } = require('@playwright/test');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
const res = await page.goto('https://geograsim.at/modul-weltkueche', { waitUntil: 'networkidle' });
await page.waitForTimeout(700);
const r = await page.evaluate(() => {
const sec = document.getElementById('lehrplan-bezug');
const komps = [...document.querySelectorAll('.md-kompetenz .md-kompetenz-title')].map(e=>e.textContent.trim());
const anchors = document.querySelectorAll('.md-anchor').length;
const countryChips = [...document.querySelectorAll('.md-lehrplan-filters .md-chip')].map(c=>c.textContent.trim());
const empty = document.body.textContent.includes('Noch keine Kompetenzen zugeordnet');
return { hasSection: !!sec, kompetenzTitles: komps, anchorCount: anchors, countryChips, showsEmpty: empty };
});
console.log(JSON.stringify({ httpStatus: res.status(), result: r }, null, 2));
await browser.close();
})();
@@ -0,0 +1,37 @@
const { chromium } = require('@playwright/test');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
const errs=[]; page.on('pageerror',e=>errs.push(e.message));
await page.goto('http://localhost/geograsim/App/modul-weltkueche', { waitUntil:'domcontentloaded' });
await page.waitForTimeout(700);
async function snapshot() {
return await page.evaluate(() => {
const all = [...document.querySelectorAll('.md-anchor')];
const visible = all.filter(a => !a.classList.contains('hidden'));
const byType = t => visible.filter(a => a.dataset.anchorType===t).length;
const fachCountries = {};
visible.filter(a=>a.dataset.anchorType==='fach').forEach(a=>{ fachCountries[a.dataset.country]=(fachCountries[a.dataset.country]||0)+1; });
return { total: all.length, visible: visible.length, fachVisible: byType('fach'), fachCountries };
});
}
async function clickChip(country) {
await page.evaluate((c) => {
const btn = [...document.querySelectorAll('.md-chip')].find(b => (b.dataset.country||'')===c);
if (btn) btn.click();
}, country);
await page.waitForTimeout(200);
}
const start = await snapshot();
await clickChip(''); // Alle Länder
const alle = await snapshot();
await clickChip('DE'); // Deutschland
const de = await snapshot();
await clickChip('AT'); // Österreich
const at = await snapshot();
console.log(JSON.stringify({ start, alle, de, at, pageErrors: errs }, null, 2));
await browser.close();
})();
+15
View File
@@ -0,0 +1,15 @@
const { chromium } = require('@playwright/test');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
const errs=[]; page.on('pageerror',e=>errs.push(e.message));
await page.goto('https://geograsim.at/modul-weltkueche', { waitUntil:'domcontentloaded' });
await page.waitForTimeout(900);
async function snap(){ return await page.evaluate(()=>{ const all=[...document.querySelectorAll('.md-anchor')]; const vis=all.filter(a=>!a.classList.contains('hidden')); const fc={}; vis.filter(a=>a.dataset.anchorType==='fach').forEach(a=>fc[a.dataset.country]=(fc[a.dataset.country]||0)+1); return {total:all.length, visible:vis.length, fach:vis.filter(a=>a.dataset.anchorType==='fach').length, fachCountries:fc}; }); }
async function chip(c){ await page.evaluate(c=>{const b=[...document.querySelectorAll('.md-chip')].find(x=>(x.dataset.country||'')===c); if(b)b.click();},c); await page.waitForTimeout(200); }
await chip(''); const alle=await snap();
await chip('DE'); const de=await snap();
await chip('AT'); const at=await snap();
console.log(JSON.stringify({alle,de,at,pageErrors:errs},null,2));
await browser.close();
})();
+25
View File
@@ -0,0 +1,25 @@
const { chromium } = require('@playwright/test');
(async () => {
const b = await chromium.launch(); const p = await b.newPage();
await p.addInitScript(() => {
window.__GGS__ = { simId: 'test', baseUrl: '' };
window.fetch = () => Promise.resolve({ ok:true, json:()=>Promise.resolve({}) }); // Heartbeat stummschalten
});
await p.goto('about:blank');
await p.addScriptTag({ path: 'C:/xampp/htdocs/geograsim/App/assets/js/live-client.js' });
const read = () => p.evaluate(() => window.__GGS_LIVE__ ? window.__GGS_LIVE__.activeMs : null);
const set = (v) => p.evaluate((v) => window.__GGS_LIVE__.setPaused(v), v);
await p.waitForTimeout(300);
const a1 = await read();
await p.waitForTimeout(2500); const a2 = await read(); // sollte gestiegen sein
await set(true);
await p.waitForTimeout(2500); const a3 = await read(); // sollte eingefroren sein
await set(false);
await p.waitForTimeout(2500); const a4 = await read(); // sollte wieder steigen
const grewNormal = (a2 - a1) > 1500;
const frozen = (a3 - a2) < 300;
const resumed = (a4 - a3) > 1500;
console.log(JSON.stringify({ a1,a2,a3,a4, grewNormal, frozen, resumed,
verdict: (grewNormal && frozen && resumed) ? 'PASS' : 'FAIL' }, null, 2));
await b.close();
})();
+74
View File
@@ -0,0 +1,74 @@
const { chromium } = require('@playwright/test');
(async () => {
const browser = await chromium.launch();
const out = {};
// 1) modul-weltkueche: Lehrplan-Bezug jetzt vorhanden?
{
const page = await browser.newPage();
await page.goto('https://geograsim.at/modul-weltkueche', { waitUntil: 'domcontentloaded' });
await page.waitForTimeout(1000);
out.modulWeltkueche = await page.evaluate(() => ({
kompetenzTitles: [...document.querySelectorAll('.md-kompetenz-title')].map(e=>e.textContent.trim()),
anchorCount: document.querySelectorAll('.md-anchor').length,
showsEmpty: document.body.textContent.includes('Noch keine Kompetenzen zugeordnet'),
}));
await page.close();
}
// 2) Weltküche-Sim: Artikel + Ukraine-Feedback
{
const page = await browser.newPage();
const errs=[]; page.on('pageerror',e=>errs.push(e.message));
await page.goto('https://geograsim.at/sims/weltkueche/game.html', { waitUntil:'domcontentloaded' });
await page.waitForTimeout(2000);
out.weltkueche = await page.evaluate(async () => {
try {
if (!DISHES.length) await loadWeltkuecheData();
const dish = DISHES.find(d=>d.id==='tiroler-groestl'); current={dish};
buildTaskFor('kartoffel');
return {
kartoffelArt: ING.kartoffel.art,
badArticles: Object.entries(ING).filter(([k,v])=>!['der','die','das'].includes(v&&v.art)).map(([k])=>k),
wrongUA: explainChoice('kartoffel','ukraine',false).text,
};
} catch(e){ return { error:String(e) }; }
});
out.weltkueche.pageErrors = errs;
await page.close();
}
// 3) teacher.html: lädt + neue Funktionen da (direkter Link, den das Produkt nutzt)
{
const page = await browser.newPage();
const errs=[]; page.on('pageerror',e=>errs.push(e.message));
// teacher.html leitet ohne Login auf login.html um — Navigation abfangen, sofort auswerten
await page.route('**/login.html', r=>r.abort());
await page.goto('https://geograsim.at/teacher.html', { waitUntil:'domcontentloaded' }).catch(()=>{});
await page.waitForTimeout(1500);
out.teacher = await page.evaluate(() => ({
hasRenderGesamt: typeof renderLiveGesamt === 'function',
hasQualityBar: typeof _liveQualityBar === 'function',
qualitySample: (typeof _liveQualityBar==='function') ? _liveQualityBar(8,2) : null,
tabLabels: [...document.querySelectorAll('#tab-bar .tab')].map(t=>t.textContent.trim()),
})).catch(e=>({evalError:String(e)}));
out.teacher.pageErrors = errs;
await page.close();
}
// 4) Tourismusregion passstrasse Karte
{
const page = await browser.newPage();
const mc = await page.request.get('https://geograsim.at/sims/tourismusregion/js/maps-custom.json');
const j = await mc.json();
out.tourismus = {
keys: Object.keys(j),
passBergaufPoints: j.passstrasse?.routes?.bergauf?.length ?? null,
passSlots: (j.passstrasse?.slots||[]).length,
};
await page.close();
}
console.log(JSON.stringify(out, null, 2));
await browser.close();
})();
@@ -0,0 +1,21 @@
const { chromium } = require('@playwright/test');
(async () => {
const b = await chromium.launch(); const p = await b.newPage();
const errs=[]; p.on('pageerror',e=>errs.push(e.message)); p.on('console',m=>{if(m.type()==='error')errs.push(m.text());});
await p.route('**/login.html', r=>r.abort());
await p.goto('http://localhost/geograsim/App/teacher.html',{waitUntil:'domcontentloaded'}).catch(()=>{});
await p.waitForTimeout(1200);
const r = await p.evaluate(() => ({
hasSimWord: typeof simWord==='function',
hasSimCode: typeof simCode==='function',
logistikWord: typeof simWord==='function' ? simWord('logistik') : null,
logistikCode: typeof simCode==='function' ? simCode('logistik') : null,
unknownCode: typeof simCode==='function' ? simCode('irgendwas') : null,
logistikFields: (typeof LIVE_PRIMARY_FIELDS==='object' && LIVE_PRIMARY_FIELDS.logistik) ? LIVE_PRIMARY_FIELDS.logistik.map(f=>f.label) : null,
liveShortLogistik: typeof LIVE_SIM_SHORT==='object' ? LIVE_SIM_SHORT.logistik : null,
// Kürzel-Eindeutigkeit
codesUnique: (function(){ if(typeof SIM_LABELS!=='object') return null; var seen={},dup=[]; Object.keys(SIM_LABELS).forEach(k=>{var c=SIM_LABELS[k].c; if(seen[c])dup.push(c); seen[c]=1;}); return dup; })(),
}));
console.log(JSON.stringify({result:r, pageErrors:errs}, null, 2));
await b.close();
})();
@@ -0,0 +1,26 @@
const { chromium } = require('@playwright/test');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
const errors = [];
page.on('pageerror', e => errors.push('PAGEERROR: '+e.message));
page.on('console', m => { if (m.type()==='error') errors.push(m.text()); });
const res = await page.goto('http://localhost/geograsim/App/teacher');
await page.waitForTimeout(1000);
const r = await page.evaluate(() => {
const tabs = [...document.querySelectorAll('#tab-bar .tab')].map(t => t.textContent.trim());
let toggle = null;
try { toggle = (typeof _liveToggleHtml === 'function') ? _liveToggleHtml() : null; } catch(e){ toggle = 'ERR:'+e.message; }
return {
tabLabels: tabs,
hasSetLiveMode: typeof setLiveMode === 'function',
hasRenderGesamt: typeof renderLiveGesamt === 'function',
hasQualityBar: typeof _liveQualityBar === 'function',
qualitySample: (typeof _liveQualityBar === 'function') ? _liveQualityBar(8,2) : null,
toggleHasGesamt: (typeof toggle === 'string') ? toggle.includes('Gesamt') : toggle,
toggleHasTag: (typeof toggle === 'string') ? toggle.includes('Tag') : toggle,
};
});
console.log(JSON.stringify({ httpStatus: res.status(), result: r, pageErrors: errors }, null, 2));
await browser.close();
})();
@@ -0,0 +1,21 @@
const { chromium } = require('@playwright/test');
(async () => {
const b = await chromium.launch(); const p = await b.newPage({ viewport:{width:1180,height:820} });
const errs=[]; p.on('pageerror',e=>errs.push(e.message)); p.on('console',m=>{if(m.type()==='error')errs.push(m.text());});
await p.goto('http://localhost/geograsim/App/sims/tourismusregion/game.html');
await p.waitForTimeout(1500);
await p.click('.map-btn'); // Route klicken → Spiel startet → Willkommenskarte
await p.waitForTimeout(2000);
const r = await p.evaluate(() => {
const card = document.getElementById('cardText');
const txt = card ? card.textContent : '';
return {
started: !!window.__ttState,
cardHasEnvText: /Umwelt ist deine Landschaft/.test(txt),
cardHasNaturschutz: /Naturschutzgebiet/.test(txt),
envKpi: document.getElementById('kEnv')?.textContent,
};
});
console.log(JSON.stringify({ result:r, pageErrors: errs.filter(e=>!/404|Failed to load resource/.test(e)) }, null, 2));
await b.close();
})();
@@ -0,0 +1,38 @@
const { chromium } = require('@playwright/test');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
const errors = [];
page.on('pageerror', e => errors.push('PAGEERROR: '+e.message));
page.on('console', m => { if (m.type()==='error') errors.push(m.text()); });
// 1) maps-custom.json direkt prüfen
const mc = await page.request.get('http://localhost/geograsim/App/sims/tourismusregion/js/maps-custom.json');
const mcJson = await mc.json();
const ps = mcJson.passstrasse || null;
// 2) Hintergrundbild erreichbar?
const img = await page.request.get('http://localhost/geograsim/App/sims/tourismusregion/assets/maps/passstrasse.png');
// 3) Sim-Startscreen laden, Kartenliste prüfen
const res = await page.goto('http://localhost/geograsim/App/sims/tourismusregion/game.html');
await page.waitForTimeout(2500);
const startInfo = await page.evaluate(() => {
const list = document.getElementById('mapList');
const labels = list ? [...list.querySelectorAll('*')].map(e=>e.textContent).filter(t=>t && t.length<40) : [];
const hasPass = !!(list && /Passstra/i.test(list.textContent||''));
return { mapListText: (list?list.textContent:'').replace(/\s+/g,' ').trim().slice(0,300), hasPass };
});
console.log(JSON.stringify({
httpStatus: res.status(),
passInMapsCustom: !!ps,
routeKeys: ps ? Object.keys(ps.routes||{}) : null,
bergaufPoints: ps && ps.routes && ps.routes.bergauf ? ps.routes.bergauf.length : null,
slotCount: ps ? (ps.slots||[]).length : null,
bgImageStatus: img.status(),
startInfo,
pageErrors: errors
}, null, 2));
await browser.close();
})();
@@ -0,0 +1,30 @@
const { chromium } = require('@playwright/test');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage({ viewport: { width: 1180, height: 820 } }); // iPad Landscape
const errs=[]; page.on('pageerror',e=>errs.push(e.message)); page.on('console',m=>{if(m.type()==='error')errs.push(m.text());});
await page.goto('http://localhost/geograsim/App/sims/tourismusregion/game.html');
await page.waitForTimeout(1500);
const before = await page.evaluate(() => ({
hasPlayerName: !!document.getElementById('playerName'),
hasClassCode: !!document.getElementById('classCode'),
hasBtnStart: !!document.getElementById('btnStart'),
hasBtnSave: !!document.getElementById('btnSave'),
mapBtnCount: document.querySelectorAll('.map-btn').length,
startOverlayHidden: document.getElementById('startOverlay').classList.contains('hidden'),
}));
// ② Klick auf erste Route sollte SOFORT starten
await page.click('.map-btn');
await page.waitForTimeout(2500);
const after = await page.evaluate(() => ({
startOverlayHidden: document.getElementById('startOverlay').classList.contains('hidden'),
gameStarted: !!window.__ttState,
mapId: window.__ttState && window.__ttState.map && window.__ttState.map.id,
}));
await page.screenshot({ path: 'C:/Users/herr_/AppData/Local/Temp/claude/c--xampp-htdocs-geograsim/c02572ea-7616-4524-a974-dff0e5670d2c/scratchpad/tr-ipad.png' });
console.log(JSON.stringify({ before, after, pageErrors: errs }, null, 2));
await browser.close();
})();
@@ -0,0 +1,27 @@
const { chromium } = require('@playwright/test');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
const errors = [];
page.on('console', m => { if (m.type()==='error') errors.push(m.text()); });
page.on('pageerror', e => errors.push('PAGEERROR: '+e.message));
await page.goto('http://localhost/geograsim/App/sims/weltkueche/game.html');
await page.waitForTimeout(1500);
const r = await page.evaluate(async () => {
try {
if (!DISHES.length) await loadWeltkuecheData();
const dish = DISHES.find(d => d.id === 'tiroler-groestl');
if (!dish) return { error: 'no tiroler-groestl dish' };
current = { dish };
const task = buildTaskFor('kartoffel');
const art = ING.kartoffel.art;
const correctAT = explainChoice('kartoffel', 'oesterreich', true).text;
const correctDE = explainChoice('kartoffel', 'deutschland', true).text;
const wrongUA = explainChoice('kartoffel', 'ukraine', false).text;
const bad = Object.entries(ING).filter(([k,v]) => !['der','die','das'].includes(v && v.art)).map(([k])=>k);
return { art, taskCorrect: task.correct, correctAT, correctDE, wrongUA, badArticles: bad, ingCount: Object.keys(ING).length };
} catch (e) { return { error: String(e), stack: e.stack }; }
});
console.log(JSON.stringify({ result: r, consoleErrors: errors }, null, 2));
await browser.close();
})();
+38
View File
@@ -0,0 +1,38 @@
const { chromium } = require('@playwright/test');
(async () => {
const b = await chromium.launch(); const p = await b.newPage();
const errs=[]; p.on('pageerror',e=>errs.push(e.message)); p.on('console',m=>{if(m.type()==='error')errs.push(m.text());});
await p.goto('http://localhost/geograsim/App/sims/weltkueche/game.html');
await p.waitForTimeout(1500);
const r = await p.evaluate(async () => {
try {
if (!DISHES.length) await loadWeltkuecheData();
function taskFor(ingKey, heimat){
current = { dish: { id:'test-'+ingKey, heimat: heimat, ings:[ingKey], signature:{} } };
try { delete _taskCache[ingKey]; } catch(_){}
return buildTaskFor(ingKey);
}
const dEggsDE = _wkDist('oesterreich','deutschland');
const dEggsFR = _wkDist('oesterreich','frankreich');
const eier = taskFor('eier','oesterreich');
const kart = taskFor('kartoffel','oesterreich');
const milch = taskFor('milch','oesterreich');
// alle Zutaten müssen fehlerfrei bauen
let buildErr = null;
for (const k of Object.keys(ING)) {
current = { dish:{id:'x',heimat:'oesterreich',ings:[k],signature:{}} };
try { delete _taskCache[k]; buildTaskFor(k); } catch(e){ buildErr = k+': '+e.message; break; }
}
return {
distDE: Math.round(dEggsDE), distFR: Math.round(dEggsFR),
eierCorrect: eier.correct, eierChoices: eier.choices,
eierDistractors: eier.choices.length - eier.correct.length,
kartoffelCorrect: kart.correct,
milchCorrect: milch.correct,
buildErr, ingCount: Object.keys(ING).length,
};
} catch(e){ return { error:String(e), stack:e.stack }; }
});
console.log(JSON.stringify({result:r, pageErrors:errs}, null, 2));
await b.close();
})();
+73
View File
@@ -0,0 +1,73 @@
// Headless-Balance-Messung (temporär). node sim-harness.mjs
import { createState, place, upgrade, callNextWave, tick, GOALS } from '../../App/sims/tourismusregion/js/model.js';
import { BUILDINGS, GAME_LEN } from '../../App/sims/tourismusregion/js/data.js';
const ALL_TYPES = Object.keys(BUILDINGS);
function upgradeAllMax(s) {
for (const b of s.buildings) {
const def = BUILDINGS[b.type];
let guard = 0;
while (b.level < def.cost.length && s.budget >= def.cost[b.level] && guard++ < 6) {
const r = upgrade(s, b);
if (!r || !r.ok) break;
}
}
}
function run(strategy, mapId = 'talschleife') {
const s = createState({ mapId, seed: 12345 });
const dt = 0.5;
let t = 0;
function tryBuildAll() {
for (let i = 0; i < s.slots.length; i++) {
const slot = s.slots[i];
if (slot.building || slot.blocked) continue;
for (const type of ALL_TYPES) {
const def = BUILDINGS[type];
if (!def || s.budget < def.cost[0]) continue;
const r = place(s, type, i);
if (r && r.ok) break;
}
}
}
function buildOneCafe() {
// Minimal-Strategie: genau EIN Café (Thomas' „5-Sterne-Café macht alles grün")
if (s.buildings.length) return;
for (let i = 0; i < s.slots.length; i++) {
if (s.slots[i].building || s.slots[i].blocked) continue;
const r = place(s, 'cafe', i);
if (r && r.ok) return;
}
}
let guard = 0;
while (t < GAME_LEN && s.phase < 8 && guard++ < 2000) {
if (strategy === 'buildAll' || strategy === 'maxedAll') tryBuildAll();
if (strategy === 'maxedAll') upgradeAllMax(s);
if (strategy === 'oneCafe') buildOneCafe();
try { callNextWave(s); } catch (_) {}
for (let k = 0; k < 40 && t < GAME_LEN; k++) { tick(s, dt); t += dt; }
}
if (strategy === 'maxedAll') upgradeAllMax(s);
// Restzeit auslaufen lassen
while (t < GAME_LEN && guard++ < 6000) { tick(s, dt); t += dt; }
const stars = s.stats.all.count ? s.stats.all.stars / s.stats.all.count : 0;
return {
strategy,
env: Math.round(s.env),
avgStars: +stars.toFixed(2),
visitorsExited: s.stats.all.count,
budget: Math.round(s.budget),
buildings: s.buildings.length,
traffic: Math.round(s.traffic || 0),
goalsMet: GOALS.filter(g => g.check(s)).length + '/' + GOALS.length,
};
}
console.log('=== Tourismusregion Balance-Messung (talschleife) ===');
for (const strat of ['maxedAll', 'buildAll', 'oneCafe']) {
const r = run(strat);
console.log(`${strat.padEnd(9)} → env ${String(r.env).padStart(3)} · Ø${r.avgStars}★ · ${r.buildings} Geb. · Verkehr ${r.traffic} · Ziele ${r.goalsMet} · Budget ${r.budget}`);
}
@@ -0,0 +1,78 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Display-Vorschau (lokal)</title>
<style>
:root { --bg:#f4f2ec; --card:#fff; --ink:#1f2b26; --accent:#1f4b37; --muted:#6b7a72; --line:rgba(0,0,0,.08); }
* { box-sizing:border-box; }
body { margin:0; font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif; background:var(--bg); color:var(--ink); }
header { background:var(--accent); color:#fff; padding:20px 28px; position:sticky; top:0; z-index:10; box-shadow:0 2px 10px rgba(0,0,0,.15); }
header h1 { margin:0; font-size:1.4rem; }
header .meta { font-size:.82rem; opacity:.85; margin-top:4px; }
nav.toc { display:flex; flex-wrap:wrap; gap:6px; padding:14px 28px; background:#e9e6dd; border-bottom:1px solid var(--line); }
nav.toc a { font-size:.82rem; text-decoration:none; color:var(--accent); background:#fff; border:1px solid var(--line); border-radius:999px; padding:4px 11px; }
nav.toc a:hover { background:var(--accent); color:#fff; }
main { padding:24px 28px 60px; max-width:1500px; margin:0 auto; }
section.sim { background:var(--card); border-radius:14px; padding:18px 20px 22px; margin-bottom:26px; box-shadow:0 4px 14px rgba(0,0,0,.06); scroll-margin-top:90px; }
section.sim h2 { margin:0 0 14px; font-size:1.25rem; color:var(--accent); display:flex; align-items:baseline; gap:10px; }
.simid { font-size:.72rem; font-weight:600; color:var(--muted); background:#eef0ec; padding:2px 8px; border-radius:6px; letter-spacing:.03em; }
table { width:100%; border-collapse:collapse; table-layout:fixed; }
thead th { text-align:left; font-size:.82rem; color:var(--muted); padding:0 0 8px; font-weight:700; }
thead th .res { font-weight:500; opacity:.7; }
th.screen { width:150px; vertical-align:top; font-size:.9rem; color:var(--ink); padding-top:8px; }
td { padding:6px 6px 14px; vertical-align:top; width:calc((100% - 150px)/2); }
a.shot { display:block; border:1px solid var(--line); border-radius:8px; overflow:hidden; background:#0d1512; text-decoration:none; }
a.shot img { display:block; width:100%; max-width:100%; height:auto; }
.cap { display:block; font-size:.72rem; color:var(--muted); padding:5px 8px; background:#fafafa; border-top:1px solid var(--line); }
a.shot .cap { color:#c8d4ce; background:#141f1a; border-top:none; }
.missing { display:flex; flex-direction:column; align-items:center; justify-content:center; gap:6px; min-height:120px; border:1px dashed var(--line); border-radius:8px; color:var(--muted); font-size:.85rem; background:#faf9f5; }
.missing .cap { background:none; border:none; }
@media (max-width:820px){ th.screen{width:90px;} td{width:calc((100% - 90px)/2);} }
</style>
</head>
<body>
<header>
<h1>Display-Vorschau (lokal)</h1>
<div class="meta">16 Simulationen · je Onboarding/Start + Spielverlauf · iPad 1180×820 &amp; Full HD 1920×1080 · generiert am 19.08.2026, 15:06</div>
</header>
<nav class="toc"><a href="#sim-busfahrt">🚌 Busfahrt</a><a href="#sim-energiemanager">⚡ Energiemanager</a><a href="#sim-entscheidungstag">📅 Entscheidungstag</a><a href="#sim-eu-werkstatt">🇪🇺 EU-Werkstatt</a><a href="#sim-farmer">🌾 Farmer</a><a href="#sim-fluggesellschaft">✈️ Fluggesellschaft</a><a href="#sim-fluss">🌊 Flussmanagement</a><a href="#sim-heli">🚁 Helikopter-Navigation</a><a href="#sim-logistik">🚚 Logistik</a><a href="#sim-sonnensystem">🪐 Sonnensystem</a><a href="#sim-staustufen">💧 Staustufen</a><a href="#sim-tourismusregion">🗺️ Tourismusregion</a><a href="#sim-tourismustal">🏔️ Tourismustal</a><a href="#sim-vulkan">🌋 Vulkan</a><a href="#sim-wal">🐋 Wal</a><a href="#sim-weltkueche">🍲 Welt-Küche</a></nav>
<main>
<section class="sim" id="sim-busfahrt"><h2>🚌 Busfahrt <span class="simid">busfahrt</span></h2><table><thead><tr><th class="screen"></th><th>iPad <span class="res">1180×820</span></th><th>Full HD <span class="res">1920×1080</span></th></tr></thead><tbody><tr><th class="screen">Onboarding / Start</th><td><a href="shots/busfahrt__ipad__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/busfahrt__ipad__start.png" alt="busfahrt iPad start"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/busfahrt__fullhd__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/busfahrt__fullhd__start.png" alt="busfahrt Full HD start"><span class="cap">Full HD · 1920×1080</span></a></td></tr>
<tr><th class="screen">Spielverlauf</th><td><a href="shots/busfahrt__ipad__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/busfahrt__ipad__play.png" alt="busfahrt iPad play"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/busfahrt__fullhd__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/busfahrt__fullhd__play.png" alt="busfahrt Full HD play"><span class="cap">Full HD · 1920×1080</span></a></td></tr></tbody></table></section>
<section class="sim" id="sim-energiemanager"><h2>⚡ Energiemanager <span class="simid">energiemanager</span></h2><table><thead><tr><th class="screen"></th><th>iPad <span class="res">1180×820</span></th><th>Full HD <span class="res">1920×1080</span></th></tr></thead><tbody><tr><th class="screen">Onboarding / Start</th><td><a href="shots/energiemanager__ipad__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/energiemanager__ipad__start.png" alt="energiemanager iPad start"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/energiemanager__fullhd__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/energiemanager__fullhd__start.png" alt="energiemanager Full HD start"><span class="cap">Full HD · 1920×1080</span></a></td></tr>
<tr><th class="screen">Spielverlauf</th><td><a href="shots/energiemanager__ipad__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/energiemanager__ipad__play.png" alt="energiemanager iPad play"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/energiemanager__fullhd__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/energiemanager__fullhd__play.png" alt="energiemanager Full HD play"><span class="cap">Full HD · 1920×1080</span></a></td></tr>
<tr><th class="screen">Spielverlauf (2)</th><td><a href="shots/energiemanager__ipad__play2.png" target="_blank" class="shot"><img loading="lazy" src="shots/energiemanager__ipad__play2.png" alt="energiemanager iPad play2"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/energiemanager__fullhd__play2.png" target="_blank" class="shot"><img loading="lazy" src="shots/energiemanager__fullhd__play2.png" alt="energiemanager Full HD play2"><span class="cap">Full HD · 1920×1080</span></a></td></tr></tbody></table></section>
<section class="sim" id="sim-entscheidungstag"><h2>📅 Entscheidungstag <span class="simid">entscheidungstag</span></h2><table><thead><tr><th class="screen"></th><th>iPad <span class="res">1180×820</span></th><th>Full HD <span class="res">1920×1080</span></th></tr></thead><tbody><tr><th class="screen">Onboarding / Start</th><td><a href="shots/entscheidungstag__ipad__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/entscheidungstag__ipad__start.png" alt="entscheidungstag iPad start"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/entscheidungstag__fullhd__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/entscheidungstag__fullhd__start.png" alt="entscheidungstag Full HD start"><span class="cap">Full HD · 1920×1080</span></a></td></tr>
<tr><th class="screen">Spielverlauf</th><td><a href="shots/entscheidungstag__ipad__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/entscheidungstag__ipad__play.png" alt="entscheidungstag iPad play"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/entscheidungstag__fullhd__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/entscheidungstag__fullhd__play.png" alt="entscheidungstag Full HD play"><span class="cap">Full HD · 1920×1080</span></a></td></tr></tbody></table></section>
<section class="sim" id="sim-eu-werkstatt"><h2>🇪🇺 EU-Werkstatt <span class="simid">eu-werkstatt</span></h2><table><thead><tr><th class="screen"></th><th>iPad <span class="res">1180×820</span></th><th>Full HD <span class="res">1920×1080</span></th></tr></thead><tbody><tr><th class="screen">Onboarding / Start</th><td><a href="shots/eu-werkstatt__ipad__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/eu-werkstatt__ipad__start.png" alt="eu-werkstatt iPad start"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/eu-werkstatt__fullhd__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/eu-werkstatt__fullhd__start.png" alt="eu-werkstatt Full HD start"><span class="cap">Full HD · 1920×1080</span></a></td></tr>
<tr><th class="screen">Spielverlauf</th><td><a href="shots/eu-werkstatt__ipad__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/eu-werkstatt__ipad__play.png" alt="eu-werkstatt iPad play"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/eu-werkstatt__fullhd__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/eu-werkstatt__fullhd__play.png" alt="eu-werkstatt Full HD play"><span class="cap">Full HD · 1920×1080</span></a></td></tr></tbody></table></section>
<section class="sim" id="sim-farmer"><h2>🌾 Farmer <span class="simid">farmer</span></h2><table><thead><tr><th class="screen"></th><th>iPad <span class="res">1180×820</span></th><th>Full HD <span class="res">1920×1080</span></th></tr></thead><tbody><tr><th class="screen">Onboarding / Start</th><td><a href="shots/farmer__ipad__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/farmer__ipad__start.png" alt="farmer iPad start"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/farmer__fullhd__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/farmer__fullhd__start.png" alt="farmer Full HD start"><span class="cap">Full HD · 1920×1080</span></a></td></tr>
<tr><th class="screen">Spielverlauf</th><td><a href="shots/farmer__ipad__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/farmer__ipad__play.png" alt="farmer iPad play"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/farmer__fullhd__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/farmer__fullhd__play.png" alt="farmer Full HD play"><span class="cap">Full HD · 1920×1080</span></a></td></tr></tbody></table></section>
<section class="sim" id="sim-fluggesellschaft"><h2>✈️ Fluggesellschaft <span class="simid">fluggesellschaft</span></h2><table><thead><tr><th class="screen"></th><th>iPad <span class="res">1180×820</span></th><th>Full HD <span class="res">1920×1080</span></th></tr></thead><tbody><tr><th class="screen">Onboarding / Start</th><td><a href="shots/fluggesellschaft__ipad__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/fluggesellschaft__ipad__start.png" alt="fluggesellschaft iPad start"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/fluggesellschaft__fullhd__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/fluggesellschaft__fullhd__start.png" alt="fluggesellschaft Full HD start"><span class="cap">Full HD · 1920×1080</span></a></td></tr>
<tr><th class="screen">Spielverlauf</th><td><a href="shots/fluggesellschaft__ipad__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/fluggesellschaft__ipad__play.png" alt="fluggesellschaft iPad play"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/fluggesellschaft__fullhd__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/fluggesellschaft__fullhd__play.png" alt="fluggesellschaft Full HD play"><span class="cap">Full HD · 1920×1080</span></a></td></tr></tbody></table></section>
<section class="sim" id="sim-fluss"><h2>🌊 Flussmanagement <span class="simid">fluss</span></h2><table><thead><tr><th class="screen"></th><th>iPad <span class="res">1180×820</span></th><th>Full HD <span class="res">1920×1080</span></th></tr></thead><tbody><tr><th class="screen">Onboarding / Start</th><td><a href="shots/fluss__ipad__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/fluss__ipad__start.png" alt="fluss iPad start"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/fluss__fullhd__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/fluss__fullhd__start.png" alt="fluss Full HD start"><span class="cap">Full HD · 1920×1080</span></a></td></tr></tbody></table></section>
<section class="sim" id="sim-heli"><h2>🚁 Helikopter-Navigation <span class="simid">heli</span></h2><table><thead><tr><th class="screen"></th><th>iPad <span class="res">1180×820</span></th><th>Full HD <span class="res">1920×1080</span></th></tr></thead><tbody><tr><th class="screen">Onboarding / Start</th><td><a href="shots/heli__ipad__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/heli__ipad__start.png" alt="heli iPad start"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/heli__fullhd__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/heli__fullhd__start.png" alt="heli Full HD start"><span class="cap">Full HD · 1920×1080</span></a></td></tr>
<tr><th class="screen">Spielverlauf</th><td><a href="shots/heli__ipad__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/heli__ipad__play.png" alt="heli iPad play"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/heli__fullhd__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/heli__fullhd__play.png" alt="heli Full HD play"><span class="cap">Full HD · 1920×1080</span></a></td></tr></tbody></table></section>
<section class="sim" id="sim-logistik"><h2>🚚 Logistik <span class="simid">logistik</span></h2><table><thead><tr><th class="screen"></th><th>iPad <span class="res">1180×820</span></th><th>Full HD <span class="res">1920×1080</span></th></tr></thead><tbody><tr><th class="screen">Onboarding / Start</th><td><a href="shots/logistik__ipad__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/logistik__ipad__start.png" alt="logistik iPad start"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/logistik__fullhd__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/logistik__fullhd__start.png" alt="logistik Full HD start"><span class="cap">Full HD · 1920×1080</span></a></td></tr>
<tr><th class="screen">Spielverlauf</th><td><a href="shots/logistik__ipad__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/logistik__ipad__play.png" alt="logistik iPad play"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/logistik__fullhd__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/logistik__fullhd__play.png" alt="logistik Full HD play"><span class="cap">Full HD · 1920×1080</span></a></td></tr></tbody></table></section>
<section class="sim" id="sim-sonnensystem"><h2>🪐 Sonnensystem <span class="simid">sonnensystem</span></h2><table><thead><tr><th class="screen"></th><th>iPad <span class="res">1180×820</span></th><th>Full HD <span class="res">1920×1080</span></th></tr></thead><tbody><tr><th class="screen">Onboarding / Start</th><td><a href="shots/sonnensystem__ipad__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/sonnensystem__ipad__start.png" alt="sonnensystem iPad start"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/sonnensystem__fullhd__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/sonnensystem__fullhd__start.png" alt="sonnensystem Full HD start"><span class="cap">Full HD · 1920×1080</span></a></td></tr>
<tr><th class="screen">Spielverlauf</th><td><a href="shots/sonnensystem__ipad__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/sonnensystem__ipad__play.png" alt="sonnensystem iPad play"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/sonnensystem__fullhd__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/sonnensystem__fullhd__play.png" alt="sonnensystem Full HD play"><span class="cap">Full HD · 1920×1080</span></a></td></tr>
<tr><th class="screen">Spielverlauf (2)</th><td><a href="shots/sonnensystem__ipad__play2.png" target="_blank" class="shot"><img loading="lazy" src="shots/sonnensystem__ipad__play2.png" alt="sonnensystem iPad play2"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/sonnensystem__fullhd__play2.png" target="_blank" class="shot"><img loading="lazy" src="shots/sonnensystem__fullhd__play2.png" alt="sonnensystem Full HD play2"><span class="cap">Full HD · 1920×1080</span></a></td></tr></tbody></table></section>
<section class="sim" id="sim-staustufen"><h2>💧 Staustufen <span class="simid">staustufen</span></h2><table><thead><tr><th class="screen"></th><th>iPad <span class="res">1180×820</span></th><th>Full HD <span class="res">1920×1080</span></th></tr></thead><tbody><tr><th class="screen">Onboarding / Start</th><td><a href="shots/staustufen__ipad__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/staustufen__ipad__start.png" alt="staustufen iPad start"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/staustufen__fullhd__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/staustufen__fullhd__start.png" alt="staustufen Full HD start"><span class="cap">Full HD · 1920×1080</span></a></td></tr>
<tr><th class="screen">Spielverlauf</th><td><a href="shots/staustufen__ipad__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/staustufen__ipad__play.png" alt="staustufen iPad play"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/staustufen__fullhd__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/staustufen__fullhd__play.png" alt="staustufen Full HD play"><span class="cap">Full HD · 1920×1080</span></a></td></tr></tbody></table></section>
<section class="sim" id="sim-tourismusregion"><h2>🗺️ Tourismusregion <span class="simid">tourismusregion</span></h2><table><thead><tr><th class="screen"></th><th>iPad <span class="res">1180×820</span></th><th>Full HD <span class="res">1920×1080</span></th></tr></thead><tbody><tr><th class="screen">Onboarding / Start</th><td><a href="shots/tourismusregion__ipad__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/tourismusregion__ipad__start.png" alt="tourismusregion iPad start"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/tourismusregion__fullhd__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/tourismusregion__fullhd__start.png" alt="tourismusregion Full HD start"><span class="cap">Full HD · 1920×1080</span></a></td></tr>
<tr><th class="screen">Spielverlauf</th><td><a href="shots/tourismusregion__ipad__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/tourismusregion__ipad__play.png" alt="tourismusregion iPad play"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/tourismusregion__fullhd__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/tourismusregion__fullhd__play.png" alt="tourismusregion Full HD play"><span class="cap">Full HD · 1920×1080</span></a></td></tr></tbody></table></section>
<section class="sim" id="sim-tourismustal"><h2>🏔️ Tourismustal <span class="simid">tourismustal</span></h2><table><thead><tr><th class="screen"></th><th>iPad <span class="res">1180×820</span></th><th>Full HD <span class="res">1920×1080</span></th></tr></thead><tbody><tr><th class="screen">Onboarding / Start</th><td><a href="shots/tourismustal__ipad__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/tourismustal__ipad__start.png" alt="tourismustal iPad start"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/tourismustal__fullhd__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/tourismustal__fullhd__start.png" alt="tourismustal Full HD start"><span class="cap">Full HD · 1920×1080</span></a></td></tr>
<tr><th class="screen">Spielverlauf</th><td><a href="shots/tourismustal__ipad__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/tourismustal__ipad__play.png" alt="tourismustal iPad play"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/tourismustal__fullhd__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/tourismustal__fullhd__play.png" alt="tourismustal Full HD play"><span class="cap">Full HD · 1920×1080</span></a></td></tr></tbody></table></section>
<section class="sim" id="sim-vulkan"><h2>🌋 Vulkan <span class="simid">vulkan</span></h2><table><thead><tr><th class="screen"></th><th>iPad <span class="res">1180×820</span></th><th>Full HD <span class="res">1920×1080</span></th></tr></thead><tbody><tr><th class="screen">Onboarding / Start</th><td><a href="shots/vulkan__ipad__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/vulkan__ipad__start.png" alt="vulkan iPad start"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/vulkan__fullhd__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/vulkan__fullhd__start.png" alt="vulkan Full HD start"><span class="cap">Full HD · 1920×1080</span></a></td></tr>
<tr><th class="screen">Spielverlauf</th><td><a href="shots/vulkan__ipad__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/vulkan__ipad__play.png" alt="vulkan iPad play"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/vulkan__fullhd__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/vulkan__fullhd__play.png" alt="vulkan Full HD play"><span class="cap">Full HD · 1920×1080</span></a></td></tr>
<tr><th class="screen">Spielverlauf (2)</th><td><a href="shots/vulkan__ipad__play2.png" target="_blank" class="shot"><img loading="lazy" src="shots/vulkan__ipad__play2.png" alt="vulkan iPad play2"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/vulkan__fullhd__play2.png" target="_blank" class="shot"><img loading="lazy" src="shots/vulkan__fullhd__play2.png" alt="vulkan Full HD play2"><span class="cap">Full HD · 1920×1080</span></a></td></tr></tbody></table></section>
<section class="sim" id="sim-wal"><h2>🐋 Wal <span class="simid">wal</span></h2><table><thead><tr><th class="screen"></th><th>iPad <span class="res">1180×820</span></th><th>Full HD <span class="res">1920×1080</span></th></tr></thead><tbody><tr><th class="screen">Onboarding / Start</th><td><a href="shots/wal__ipad__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/wal__ipad__start.png" alt="wal iPad start"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/wal__fullhd__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/wal__fullhd__start.png" alt="wal Full HD start"><span class="cap">Full HD · 1920×1080</span></a></td></tr>
<tr><th class="screen">Spielverlauf</th><td><a href="shots/wal__ipad__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/wal__ipad__play.png" alt="wal iPad play"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/wal__fullhd__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/wal__fullhd__play.png" alt="wal Full HD play"><span class="cap">Full HD · 1920×1080</span></a></td></tr></tbody></table></section>
<section class="sim" id="sim-weltkueche"><h2>🍲 Welt-Küche <span class="simid">weltkueche</span></h2><table><thead><tr><th class="screen"></th><th>iPad <span class="res">1180×820</span></th><th>Full HD <span class="res">1920×1080</span></th></tr></thead><tbody><tr><th class="screen">Onboarding / Start</th><td><a href="shots/weltkueche__ipad__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/weltkueche__ipad__start.png" alt="weltkueche iPad start"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/weltkueche__fullhd__start.png" target="_blank" class="shot"><img loading="lazy" src="shots/weltkueche__fullhd__start.png" alt="weltkueche Full HD start"><span class="cap">Full HD · 1920×1080</span></a></td></tr>
<tr><th class="screen">Spielverlauf</th><td><a href="shots/weltkueche__ipad__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/weltkueche__ipad__play.png" alt="weltkueche iPad play"><span class="cap">iPad · 1180×820</span></a></td><td><a href="shots/weltkueche__fullhd__play.png" target="_blank" class="shot"><img loading="lazy" src="shots/weltkueche__fullhd__play.png" alt="weltkueche Full HD play"><span class="cap">Full HD · 1920×1080</span></a></td></tr></tbody></table></section>
</main>
</body>
</html>
@@ -0,0 +1,282 @@
/**
* regen-gameplay-shots.cjs
* ------------------------
* Ersetzt die "Spielverlauf"-Screenshots (play / play2) der Display-Vorschau
* durch ECHTE Spielszenen: Auswahl-Screens (Welt/Karte/Szenario) werden
* betreten und das Onboarding wird zuverlässig weggeklickt (Skip-Buttons +
* mehrseitige "Weiter"-Tutorials, auch wenn der Button unter dem Fold liegt),
* bevor der Screenshot fällt.
*
* Ersetzt NUR die play/play2-Bilder in-place; die start-Bilder (Onboarding)
* und display_preview.html bleiben unangetastet, damit die Galerie
* unverändert funktioniert.
*
* Start (aus dem playwright-Ordner wegen node_modules):
* cd /c/xampp/htdocs/geograsim/.dontDeploy/playwright && \
* NODE_PATH="C:\\xampp\\htdocs\\geograsim\\.dontDeploy\\playwright\\node_modules" \
* node ../../App/.LocalDeveloperTools/display-preview/regen-gameplay-shots.cjs
*
* Optional: --only=sonnensystem,wal --vp=ipad
*/
const { chromium } = require('@playwright/test');
const path = require('path');
const SHOTS_DIR = 'C:/xampp/htdocs/geograsim/App/.LocalDeveloperTools/display-preview/shots';
const BASE_URL = 'http://localhost/geograsim/App/sims';
const VIEWPORTS = [
{ key: 'ipad', w: 1180, h: 820 },
{ key: 'fullhd', w: 1920, h: 1080 },
];
// Sims mit "play"-Screenshot in der Galerie (fluss hat keinen play -> weggelassen).
const SIMS = [
{ id: 'busfahrt' },
{ id: 'energiemanager', play2: true },
{ id: 'entscheidungstag' },
{ id: 'eu-werkstatt' },
{ id: 'farmer' },
{ id: 'fluggesellschaft' },
{ id: 'heli' },
{ id: 'logistik' },
{ id: 'sonnensystem', play2: true },
{ id: 'staustufen' },
{ id: 'tourismusregion' },
{ id: 'tourismustal' },
{ id: 'vulkan', play2: true },
{ id: 'wal' },
{ id: 'weltkueche' },
];
// ---- In-Page: EIN Onboarding-Schritt wegklicken -------------------------
async function skipStep(page) {
return await page.evaluate(() => {
// "loose": gerendert, aber darf auch unter dem Fold liegen (.click() geht trotzdem)
const rendered = (el) => {
if (!el) return false;
const r = el.getBoundingClientRect();
if (r.width < 6 || r.height < 6) return false;
const s = getComputedStyle(el);
return s.visibility !== 'hidden' && s.display !== 'none' && +s.opacity > 0.05
&& !el.disabled && el.getAttribute('aria-hidden') !== 'true'
&& !el.classList.contains('hidden');
};
const clean = (s) => (s || '').replace(/\s+/g, ' ').trim();
const norm = (s) => clean(s).replace(/[^\p{L}\p{N} ]+/gu, '').trim().toLowerCase();
// Namensfelder füllen
document.querySelectorAll('input[type=text],input[type=search],input:not([type])').forEach((i) => {
if (rendered(i) && !i.value) {
i.value = 'Demo';
i.dispatchEvent(new Event('input', { bubbles: true }));
i.dispatchEvent(new Event('change', { bubbles: true }));
}
});
// 1) Explizite Skip-Buttons (schließen das GANZE Tutorial auf einmal)
const skipSel = [
'#emOnbSkip', '#tutorial-skip', '#heliOnbSkip', '#snOnbSkip',
'[onclick*="skipTutorial"]', '[onclick*="closeTutorial"]',
'[onclick*="skipOnboarding"]', '[onclick*="skipHeliOnboarding"]',
];
for (const sel of skipSel) {
const el = [...document.querySelectorAll(sel)].find(rendered);
if (el) { el.click(); return 'skip:' + sel; }
}
// Skip per Text
{
const el = [...document.querySelectorAll('button,a,[role=button]')].find(
(e) => rendered(e) && /^(uberspringen|tutorial uberspringen|einfuhrung uberspringen|nicht mehr anzeigen)$/.test(norm(e.textContent))
);
if (el) { el.click(); return 'skiptext'; }
}
// 2) "Weiter"/"Los geht's" NUR innerhalb eines sichtbaren Overlays
// (verhindert das Anklicken von Gameplay-Buttons wie Vulkan "Weiter →")
const overSel = '.ggs-modal-overlay,.ggs-overlay,.ggs-overlay-card,.sn-overlay,'
+ '.overlay,.overlay-card,.splash-overlay,.lg-splash-overlay,.modal,'
+ '.st-hint-overlay,.st-hint-modal,#vulk-overlay,#vulk-modal,.ggs-qi-back,'
+ '[id*="Onb"],[id*="onboard"],[id*="overlay" i],[id*="modal" i],'
+ '[class*="onb"],[class*="welcome"],[class*="tutorial"],[class*="intro"],'
+ '[class*="willkommen"],[class*="overlay" i],[class*="ggs-qi"]';
const overlays = [...document.querySelectorAll(overSel)].filter((o) => {
if (!rendered(o)) return false;
const r = o.getBoundingClientRect();
return r.width > 240 && r.height > 150;
});
const proceedRx = /^(weiter|weiter gehts|los gehts|los geht s|auf gehts|verstanden|alles klar|habe verstanden|fertig|los arbeiten|jetzt starten|jetzt loslegen|jetzt spielen|spiel starten|neue partie|partie starten|los|okay|ok|schliessen|start|starten|beginnen)$/;
for (const ov of overlays) {
const btns = [...ov.querySelectorAll('button,a,[role=button],.btn')].filter(rendered);
let el = btns.find((b) => proceedRx.test(norm(b.textContent)));
if (!el) el = btns.find((b) => /^(x|close)$/.test(norm(b.textContent)) || /(^|\s)(close|ggs-modal-close)(\s|$)/i.test(b.className));
if (el) { el.click(); return 'proceed:' + norm(el.textContent).slice(0, 24); }
}
return null;
}).catch(() => null);
}
// Noch ein Onboarding-Overlay sichtbar? (Heuristik für den Report)
async function onboardingStillVisible(page) {
return await page.evaluate(() => {
const rx = /(willkommen|wusstest du|anleitung|was lerne ich|so funktioniert|einf(ü|u)hrung|beobachtungs-?aufgaben|dein kreislauf|uberspringen|überspringen|vulkanologie|observatorium|du erkundest die planeten|was tust du)/i;
const els = [...document.querySelectorAll('.overlay,.ggs-overlay,.ggs-modal-overlay,.sn-overlay,.st-hint-overlay,#vulk-overlay,[class*="onb"],[class*="tutorial"],[class*="intro"],[class*="welcome"],[class*="overlay" i]')];
return els.some((el) => {
const r = el.getBoundingClientRect();
if (r.width < 240 || r.height < 150) return false;
const s = getComputedStyle(el);
if (s.visibility === 'hidden' || s.display === 'none' || +s.opacity < 0.05 || el.classList.contains('hidden')) return false;
return rx.test((el.textContent || '').slice(0, 500));
});
}).catch(() => false);
}
async function clickSel(page, sel) {
return await page.evaluate((sel) => {
const el = [...document.querySelectorAll(sel)].find((e) => {
const r = e.getBoundingClientRect();
const s = getComputedStyle(e);
return r.width > 4 && r.height > 4 && s.visibility !== 'hidden' && s.display !== 'none' && !e.classList.contains('hidden');
});
if (el) { el.click(); return true; }
return false;
}, sel).catch(() => false);
}
async function clickByText(page, source) {
return await page.evaluate((src) => {
const rx = new RegExp(src, 'i');
const norm = (s) => (s || '').replace(/\s+/g, ' ').trim().replace(/[^\p{L}\p{N} ]+/gu, '').trim();
const el = [...document.querySelectorAll('button,a,[role=button],.btn')].find((e) => {
const r = e.getBoundingClientRect();
const s = getComputedStyle(e);
if (r.width < 6 || r.height < 6 || s.visibility === 'hidden' || s.display === 'none' || e.classList.contains('hidden')) return false;
return rx.test(norm(e.textContent));
});
if (el) { el.click(); return true; }
return false;
}, source).catch(() => false);
}
async function skipLoop(page, rounds = 12) {
const seq = [];
for (let i = 0; i < rounds; i++) {
const r = await skipStep(page);
if (!r) break;
seq.push(r);
await page.waitForTimeout(420);
}
return seq;
}
// ---- pro-Sim: Auswahl-Screen betreten, dann Tutorial wegklicken ---------
const ENTRY = {
// heli: Flugkarte braucht PHP-injizierte Waypoints (WP), die beim direkten
// Aufruf von game.html fehlen (-> "WP is not defined"). Daher bleibt der
// stabile Gameplay-Screen die Einsatzzentrale (Missionsauswahl nach Onboarding).
'wal': async (page) => {
await clickSel(page, '.era-card-cta'); // "In dieser Welt starten →"
await page.waitForTimeout(1800);
await skipLoop(page);
},
'tourismusregion': async (page) => {
await clickSel(page, '#mapList .map-btn, .map-btn'); // Wegkarte wählen
await page.waitForTimeout(3000); // 3D-Szene
await skipLoop(page); // "Willkommen …" weg
},
'tourismustal': async (page) => {
await clickSel(page, '[data-scene]'); // Szene wählen
await page.waitForTimeout(3000);
await skipLoop(page); // "Die Gäste …" weg
},
'eu-werkstatt': async (page) => {
await clickSel(page, '.scenario-card'); // Szenario betreten
await page.waitForTimeout(1600);
await skipLoop(page, 8); // Konzept-Intro weg
await page.waitForTimeout(900);
await clickByText(page, 'los gehts|los geht|^weiter|verstanden|alles klar');
await page.waitForTimeout(700);
await skipLoop(page, 4);
},
};
// Nach dem Wegklicken des Onboardings noch aufräumen, um die echte Szene zu zeigen.
const POST = {
'vulkan': async (page) => {
// "Los geht's" öffnet direkt das erste Aufgaben-Modal (#vulk-overlay).
// Schließen -> darunter liegt die 3D-Vulkanszene + Steuerpanel (Slider).
await page.evaluate(() => { const o = document.getElementById('vulk-overlay'); if (o) o.classList.remove('show'); });
await page.waitForTimeout(500);
},
};
const PLAY2 = {
'vulkan': async (page) => { await clickSel(page, '#erupt-btn'); await page.waitForTimeout(3200); },
'sonnensystem': async (page) => { await clickSel(page, '#obs-open-btn'); await page.waitForTimeout(1800); await skipLoop(page, 4); await page.waitForTimeout(1200); },
'energiemanager': async (page) => { await clickSel(page, '#btnRunDay'); await page.waitForTimeout(3200); },
};
(async () => {
const onlyArg = (process.argv.find((a) => a.startsWith('--only=')) || '').slice(7);
const vpArg = (process.argv.find((a) => a.startsWith('--vp=')) || '').slice(5);
const list = onlyArg ? SIMS.filter((s) => onlyArg.split(',').includes(s.id)) : SIMS;
const vps = vpArg ? VIEWPORTS.filter((v) => v.key === vpArg) : VIEWPORTS;
const browser = await chromium.launch({
args: ['--use-gl=swiftshader', '--ignore-gpu-blocklist', '--enable-unsafe-swiftshader'],
});
for (const vp of vps) {
console.log(`\n===== ${vp.key} (${vp.w}x${vp.h}) =====`);
for (const sim of list) {
const ctx = await browser.newContext({ viewport: { width: vp.w, height: vp.h }, deviceScaleFactor: 1 });
const page = await ctx.newPage();
const errs = [];
page.on('pageerror', (e) => { if (errs.length < 3) errs.push('PE:' + e.message.slice(0, 50)); });
const url = `${BASE_URL}/${sim.id}/game.html`;
try {
await page.goto(url, { waitUntil: 'load', timeout: 40000 });
} catch (e) { errs.push('GOTO:' + e.message.slice(0, 40)); }
await page.waitForTimeout(3200); // 3D / CDN
let seq = await skipLoop(page, 14); // sofortiges Onboarding
if (ENTRY[sim.id]) await ENTRY[sim.id](page); // Auswahl-Screen + Tutorial
await page.waitForTimeout(2000);
// Zweiter Durchlauf: 3D-Sims (vulkan/sonnensystem) laden ihr Onboarding
// asynchron erst NACH dem ersten Skip -> hier erneut wegklicken.
seq = seq.concat(await skipLoop(page, 10));
if (POST[sim.id]) await POST[sim.id](page);
await page.waitForTimeout(1000);
const stuck = await onboardingStillVisible(page);
let ok = false;
try {
await page.screenshot({ path: path.join(SHOTS_DIR, `${sim.id}__${vp.key}__play.png`) });
ok = true;
} catch (e) { errs.push('SHOT:' + e.message.slice(0, 40)); }
let ok2 = null;
if (sim.play2 && PLAY2[sim.id]) {
try {
await PLAY2[sim.id](page);
await page.waitForTimeout(1000);
await page.screenshot({ path: path.join(SHOTS_DIR, `${sim.id}__${vp.key}__play2.png`) });
ok2 = true;
} catch (e) { ok2 = false; errs.push('SHOT2:' + e.message.slice(0, 40)); }
}
console.log(
' ' + sim.id.padEnd(18)
+ (ok ? 'play OK' : 'play FAIL')
+ (ok2 === null ? '' : ok2 ? ' · play2 OK' : ' · play2 FAIL')
+ (stuck ? ' [!! ONBOARDING NOCH SICHTBAR]' : '')
+ ' clicks=' + seq.length + (seq.length ? ' (' + seq.slice(0, 6).join(',') + ')' : '')
+ (errs.length ? ' ' + errs.slice(0, 2).join(' | ') : '')
);
await ctx.close();
}
}
await browser.close();
console.log('\nFertig. Galerie: http://localhost/geograsim/App/.LocalDeveloperTools/display-preview/display_preview.html');
})();
Binary file not shown.

After

Width:  |  Height:  |  Size: 369 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 301 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 721 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 505 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 714 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 485 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 595 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 298 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 391 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 601 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

@@ -0,0 +1,272 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GeoGraSim — Test-Checkliste (19.08.2026)</title>
<style>
:root{
--bg:#f4f2ec; --card:#fff; --ink:#242018; --muted:#7a7266; --line:rgba(0,0,0,.08);
--accent:#4a7c8a; --accent-d:#356070; --ok:#4a8a5a; --warn:#c58a2a; --sim:#7a5ca8;
}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',system-ui,-apple-system,sans-serif;background:var(--bg);color:var(--ink);line-height:1.5;padding-bottom:4rem}
header{position:sticky;top:0;z-index:10;background:#fff;border-bottom:1px solid var(--line);
padding:.9rem 1.2rem;display:flex;align-items:center;gap:1rem;flex-wrap:wrap;box-shadow:0 1px 6px rgba(0,0,0,.04)}
header h1{font-size:1.15rem;font-weight:900;color:var(--accent-d);letter-spacing:-.02em}
header .sub{font-size:.72rem;color:var(--muted)}
.progress{margin-left:auto;display:flex;align-items:center;gap:.6rem;font-size:.8rem;font-weight:700;color:var(--accent-d)}
.bar{width:160px;height:9px;border-radius:99px;background:#e4e0d6;overflow:hidden}
.bar > div{height:100%;background:var(--ok);width:0;transition:width .3s}
.reset{font-size:.66rem;color:var(--muted);border:1px solid var(--line);background:#fff;border-radius:6px;padding:.25rem .5rem;cursor:pointer}
.wrap{max-width:920px;margin:1.4rem auto;padding:0 1.1rem}
.intro{font-size:.86rem;color:var(--muted);margin-bottom:1.4rem;background:#fff;border:1px solid var(--line);border-radius:10px;padding:.8rem 1rem}
.intro code{background:#eee9df;padding:.05rem .35rem;border-radius:4px;font-size:.85em}
section{margin-bottom:1.8rem}
.sec-h{font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.1em;color:var(--accent);
margin:0 0 .6rem .2rem;display:flex;align-items:center;gap:.5rem}
.sec-h .cnt{font-size:.62rem;color:var(--muted);font-weight:600;letter-spacing:.02em}
.item{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:.85rem 1rem;margin-bottom:.7rem;
box-shadow:0 1px 3px rgba(0,0,0,.03);transition:opacity .2s}
.item.done{opacity:.55}
.item-top{display:flex;gap:.7rem;align-items:flex-start}
.item-top input[type=checkbox]{width:22px;height:22px;margin-top:.1rem;accent-color:var(--ok);cursor:pointer;flex-shrink:0}
.item-title{font-weight:800;font-size:.98rem}
.item.done .item-title{text-decoration:line-through;text-decoration-color:rgba(0,0,0,.3)}
.tag{display:inline-block;font-size:.58rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em;
padding:.12rem .5rem;border-radius:99px;vertical-align:middle;margin-left:.5rem}
.tag.live{background:#dceadd;color:#2f6b3a}
.tag.pending{background:#fdeecd;color:#8a6510}
.body{padding-left:calc(22px + .7rem);margin-top:.4rem;font-size:.86rem;color:#4a463d}
.body .row{margin:.28rem 0}
.body b{color:var(--ink)}
.k{display:inline-block;min-width:74px;font-weight:700;color:var(--muted);font-size:.72rem;text-transform:uppercase;letter-spacing:.03em}
a.url{color:var(--accent-d);font-family:ui-monospace,monospace;font-size:.82em;text-decoration:none;border-bottom:1px dotted var(--accent)}
a.url:hover{background:#eaf2f4}
.exp{background:#f0f6f1;border-left:3px solid var(--ok);border-radius:0 6px 6px 0;padding:.35rem .6rem;margin-top:.35rem;font-size:.82rem;color:#33613f}
.note{width:100%;margin-top:.5rem;border:1px solid var(--line);border-radius:7px;padding:.4rem .55rem;font-family:inherit;
font-size:.82rem;resize:vertical;min-height:0;height:2rem;background:#fcfbf8;color:var(--ink)}
.note::placeholder{color:#b3ac9e}
footer{text-align:center;color:var(--muted);font-size:.72rem;margin:2rem 0}
</style>
</head>
<body>
<header>
<div>
<h1>🧪 GeoGraSim — Test-Checkliste</h1>
<div class="sub">Alle Erledigungen seit den Weltküche-Lebensmitteln · Stand 19.08.2026 · lokal testen</div>
</div>
<div class="progress">
<span id="pcount">0 / 0</span>
<div class="bar"><div id="pbar"></div></div>
<button class="reset" onclick="if(confirm('Alle Haken + Notizen zurücksetzen?')){localStorage.clear();location.reload();}">reset</button>
</div>
</header>
<div class="wrap">
<div class="intro">
Basis-URL lokal: <code>http://localhost/geograsim/App/</code> · <b>Haken &amp; Notizen</b> werden im Browser gespeichert.
<span class="tag live">live</span> = auf Prod, <span class="tag pending">bereit</span> = committed, kommt mit dem nächsten Deploy.
Für Admin-Seiten zuerst über <a class="url" href="http://localhost/geograsim/App/admin.html" target="_blank">admin.html</a> anmelden (Username <b>Thomas</b> → PIN ist lokal vorausgefüllt).
</div>
<!-- ================= WELTKÜCHE (SIM) ================= -->
<section data-sec="Weltküche Simulation"></section>
<!-- ================= WELTKÜCHE (LEHRPLAN/ADMIN) ================= -->
<section data-sec="Weltküche Lehrplan &amp; Admin"></section>
<!-- ================= LEHRER-COCKPIT ================= -->
<section data-sec="Lehrer-Cockpit (teacher.html)"></section>
<!-- ================= TOURISMUSREGION ================= -->
<section data-sec="Tourismusregion"></section>
<!-- ================= LOGISTIK & PLATTFORM ================= -->
<section data-sec="Logistik &amp; Plattform"></section>
<!-- ================= ADMIN & AUTH ================= -->
<section data-sec="Admin &amp; Auth-Fundament"></section>
</div>
<footer>GeoGraSim · Test-Checkliste · lokal generiert 19.08.2026</footer>
<script>
// Alle Test-Items als Daten — daraus wird die Liste gebaut.
const BASE = 'http://localhost/geograsim/App/';
function u(path){ return BASE + path; }
const ITEMS = {
'Weltküche Simulation': [
{ id:'wk-artikel', t:'Korrekte Artikel für alle 70 Zutaten', tag:'live',
w:'der/die/das je Zutat („die Kartoffel", „der Pfeffer", „das Olivenöl") statt Platzhalter.',
url:'sims/weltkueche/game.html', steps:'Ein Gericht spielen, Zutat lösen/falsch klicken im Feedback-Satz steht der richtige Artikel.',
exp:'Nie mehr „der/die/das Kartoffel" immer „die Kartoffel" usw.' },
{ id:'wk-ukraine', t:'Verdrehter Herkunfts-Satz korrigiert (Ukraine-Fall)', tag:'live',
w:'Bei fernem Großproduzenten (z. B. Ukraine-Kartoffel im AT-Gericht) sachlich korrektes Feedback.',
url:'sims/weltkueche/game.html', steps:'Tiroler Gröstl → Kartoffel → ein fernes Land wie Ukraine anklicken.',
exp:'„…in unseren Handel kommt davon kaum etwas… nimmt man die Kartoffel aus Österreich oder einem Nachbarland." (nicht mehr „…stammt die Kartoffel von dort").' },
{ id:'wk-heimat', t:'Heimat-Banner neu formuliert', tag:'live',
w:'Erklärt „bevorzugt aus AT, aber AT deckt den Bedarf nicht allein".',
url:'sims/weltkueche/game.html', steps:'AT-Gericht, eine Heimat-Zutat lösen → grünes Banner lesen.',
exp:'„Zutaten werden zwar bevorzugt aus Österreich verwendet, aber Österreich allein deckt den Bedarf nicht ab darum zählt auch ein Nachbarland."' },
{ id:'wk-gravitation', t:'Herkunft per Handels-Gravitation (Nähe × Menge)', tag:'pending',
w:'Zweit-Lieferant = nächster großer Nachbar, nicht ferner Großproduzent.',
url:'sims/weltkueche/game.html', steps:'Ein AT-Gericht mit Eiern/Kartoffel spielen richtige Länder prüfen.',
exp:'AT-Eier → Österreich + Deutschland (NICHT Frankreich), obwohl FR mehr Eier erzeugt.' },
{ id:'wk-punkte', t:'Punktefix: „alle Falschen zuerst = 0"', tag:'pending',
w:'Strafe pro Fehlklick = 100 ÷ Anzahl Distraktoren.',
url:'sims/weltkueche/game.html', steps:'Bei einer Zutat ALLE falschen Länder zuerst anklicken, dann die richtigen.',
exp:'Ergebnis 0 Punkte. Banner zeigt die tatsächliche Strafe pro Fehlklick.' },
{ id:'wk-phase', t:'Live-State zeigt echten Fortschritt statt „forschen"', tag:'live',
w:'GGS_LIVE_STATE-Phase = „Gericht X · Zutat Y/Z".',
url:'teacher.html', steps:'Als Lehrer im Cockpit „Aktuell" ein Weltküche-Kind ansehen (oder Live-State im Sim prüfen).',
exp:'Phase/Info zeigt „Gericht 2 · Zutat 3/5" nicht dauerhaft „forschen".' },
{ id:'wk-submit', t:'Backend-Submit + Persistenz geschaffter Gerichte', tag:'live',
w:'Pro fertigem Gericht ein assessments-Eintrag; geschaffte Gerichte bleiben nach Reload.',
url:'sims/weltkueche/game.html', steps:'Ein Gericht abschließen, Seite neu laden.',
exp:'Bereits geschaffte Gerichte bleiben erkennbar; im Lehrer-Cockpit taucht das Ergebnis auf.' },
],
'Weltküche Lehrplan &amp; Admin': [
{ id:'wk-lehrplan', t:'Lehrplan-Bezug auf der Weltküche-Modulseite', tag:'live',
w:'Kompetenz „Welternährung, Konsum und globale Disparitäten" + Anker.',
url:'modul-weltkueche', steps:'Seite öffnen, zu „Lehrplan-Bezug" scrollen.',
exp:'Kompetenzen + Anker sichtbar (nicht mehr „Noch keine Kompetenzen zugeordnet").' },
{ id:'wk-filter', t:'Länder-Filter im Lehrplan-Bezug wirkt', tag:'live',
w:'Filter-Chips (Alle/AT/DE/CH/FL) blenden Fach-Anker wirklich um.',
url:'modul-weltkueche', steps:'Bei „Lehrplan-Bezug" auf Deutschland, dann Österreich klicken.',
exp:'Sichtbare Fach-Anker ändern sich je Land (vorher passierte nichts).' },
{ id:'wk-admin', t:'Admin-QA: Weltküche-Herkunftsübersicht (NEU)', tag:'pending',
w:'Pro Gericht × Zutat richtige Länder + Distraktoren; „nur Auffällige"-Filter.',
url:'admin-weltkueche.html', steps:'Als Admin einloggen, Seite öffnen. Suche/Kategorie testen, „nur Auffällige" aktivieren.',
exp:'30 Gerichte; Kartoffel/Eier → 🟢 AT+DE. „Nur Auffällige" zeigt ~5 Kandidaten zum Prüfen.' },
],
'Lehrer-Cockpit (teacher.html)': [
{ id:'tc-menu', t:'Menü „Live" → „Ergebnisse" mit Tag · Aktuell · Vergleich · Gesamt', tag:'pending',
w:'Umbenannt + 4. Unteransicht „Gesamt" (alte Ergebnis-Ansicht).',
url:'teacher.html', steps:'Als Lehrer einloggen, Klasse wählen, Tab „Ergebnisse".',
exp:'Vier Unteransichten; „Gesamt" zeigt die frühere Ergebnis-/Auswertungsansicht.' },
{ id:'tc-quali', t:'Qualitäts-Kennzahl (richtig ↔ falsch als Balken)', tag:'pending',
w:'Grafischer Balken (grün/rot) je Kind in Aktuell + Vergleich.',
url:'teacher.html', steps:'Ergebnisse → Aktuell/Vergleich bei aktivem Weltküche-Kind.',
exp:'Zweifarbiger Balken + %-Wert („blödeln vs. gut" sichtbar).' },
{ id:'tc-labels', t:'Klartext-Labels statt Jargon', tag:'pending',
w:'„Stark/Solide/Viele Fehler" statt „Kritisch/OK"; „Gerade dabei" statt „Phase".',
url:'teacher.html', steps:'Aktuell/Vergleich ansehen.',
exp:'Keine „Kritisch"-Bezeichnung mehr.' },
{ id:'tc-simlabels', t:'Sim-Bezeichner: Wort + 3-Buchstaben-Kürzel', tag:'pending',
w:'Kein „Log L1" mehr — enger Balken zeigt Kürzel (LOG), breiter das Wort.',
url:'teacher.html', steps:'Ergebnisse → Tag, Session-Balken ansehen.',
exp:'Balken tragen LOG/Logistik statt „Log L1".' },
{ id:'tc-logistik', t:'Logistik hat kuratierte Spalten (statt Roh-Dump)', tag:'pending',
w:'Stufe · Budget · Geliefert · Unterwegs · Offen · Verspätet · Fortschritt.',
url:'teacher.html', steps:'Ergebnisse → Aktuell mit aktivem Logistik-Kind.',
exp:'Sinnvolle Spalten keine simId/__activeMs/timestamp-Spalten mehr.' },
{ id:'tc-streifen', t:'Aktivitätsstreifen: Farbe je Sim, Höhe=Erfolg, Rahmen=Zustand', tag:'pending',
w:'Fertig = geschlossener Rahmen · läuft = rechts offen · Abbruch = gestrichelt + ✖.',
url:'teacher.html', steps:'Ergebnisse → Tag, mit Sessions eines Tages.',
exp:'Balken je Sim gefärbt, höher = besser; Rahmen/✖ zeigen den Zustand; Legende erklärt es.' },
{ id:'tc-assess', t:'assessment-Skip-Fix (keine leeren Ping-Zeilen mehr)', tag:'pending',
w:'„started/running"-Pings landen nicht mehr als leere Zeilen in Ergebnisse/Tag.',
url:'teacher.html', steps:'Nach etwas Spielzeit Ergebnisse/Tag ansehen.',
exp:'Nur echte Abschlüsse als Balken kein leeres Rauschen.' },
],
'Tourismusregion': [
{ id:'tr-start', t:'Startseite: keine Name/Klasscode-Felder, Klick auf Route startet', tag:'live',
w:'Felder entfernt; Klick auf eine Wegkarte startet sofort (kein „Partie starten").',
url:'sims/tourismusregion/game.html', steps:'Sim öffnen, eine Wegkarte anklicken.',
exp:'Keine Eingabefelder; Partie startet direkt bei Kartenklick.' },
{ id:'tr-ipad', t:'iPad-Responsive (Panels decken die Karte nicht mehr zu)', tag:'live',
w:'Panels mit Höhen-Deckel + eigene iPad-Landscape-Regeln. AM IPAD TESTEN!',
url:'sims/tourismusregion/game.html', steps:'Am echten iPad (Landscape) öffnen und ein Gebäude antippen.',
exp:'KPIs/Baumenü/Info-Panel überdecken die Karte nicht; Info-Panel scrollt statt zu überziehen.' },
{ id:'tr-lift', t:'Seilbahn hat eine Talstation (nicht mehr „transparent")', tag:'live',
w:'Talstation mit Dach + Umlenkrad unten am Lift.',
url:'sims/tourismusregion/game.html', steps:'Seilbahn bauen (Berg erschließen), auf die Talstation schauen.',
exp:'Solider Baukörper unten kein durchsichtiger Lift-Anfang.' },
{ id:'tr-save', t:'Abschluss: kein „Ergebnis speichern"-Button (Auto-Save)', tag:'live',
w:'Automatisches Speichern am Partie-Ende; Button entfernt.',
url:'sims/tourismusregion/game.html', steps:'Eine Partie zu Ende bringen.',
exp:'Hinweis „automatisch gespeichert", kein Speichern-Button.' },
{ id:'tr-pass', t:'Neue Karte „Passstraße"', tag:'live',
w:'Route bergauf (136 Punkte) + 41 Bauslots + Hintergrundbild.',
url:'sims/tourismusregion/game.html', steps:'Im Startbildschirm „Passstraße" wählen.',
exp:'Karte lädt, Route + Bauslots passen aufs Bild (optisch prüfen).' },
{ id:'tr-balance', t:'Balance: Umwelt beißt jetzt (Übertourismus)', tag:'pending',
w:'Zu viel Bauen + Verkehr senken die Umwelt spürbar; Umwelt-Malus wirkt.',
url:'sims/tourismusregion/game.html', steps:'Viel/dicht bauen und laufen lassen; Umwelt-KPI beobachten.',
exp:'Umwelt fällt deutlich (Richtung <45), umweltbewusste Gäste werden unzufriedener.' },
{ id:'tr-erklaer', t:'Schüler-Erklärung: Umwelt & Naturschutzgebiet', tag:'pending',
w:'Willkommenskarte + Warnkarte bei Umwelt<50 + klarere Naturschutz-Beschreibung.',
url:'sims/tourismusregion/game.html', steps:'Neu starten → Willkommenskarte lesen; Umwelt absacken lassen → Warnkarte.',
exp:'Karte erklärt Umwelt-Mechanik + Naturschutzgebiet; Warnkarte erscheint bei <50.' },
],
'Logistik &amp; Plattform': [
{ id:'lg-pause', t:'Logistik-Pause friert die Aktivzeit ein', tag:'pending',
w:'Bei Pause zählt die „Seit"-Zeit im Cockpit nicht weiter.',
url:'sims/logistik/game.html', steps:'Logistik spielen, ⏸ drücken, im Lehrer-Cockpit die Aktivzeit beobachten.',
exp:'Aktivzeit steht still, solange pausiert; läuft nach dem Fortsetzen weiter.' },
{ id:'pf-scripts', t:'Wrapper-Bug behoben (/teacher lud kein Script mehr)', tag:'live',
w:'Favicon wurde ins letzte </head> injiziert zerschoss ein JS-Popup-Script.',
url:'teacher', steps:'Die /teacher-Route (Wrapper) öffnen.',
exp:'Seite lädt sauber, keine „Invalid token"-Konsolenfehler. (teacher.html direkt lief immer.)' },
],
'Admin &amp; Auth-Fundament': [
{ id:'ad-login', t:'Lokaler Admin-Login ohne Mailversand (Dev-PIN)', tag:'pending',
w:'PIN wird lokal vorausgefüllt; Mailer-Fehler sperrt nicht mehr aus. Auf Prod bleibt 2FA-Mail Pflicht.',
url:'admin.html', steps:'Username Thomas + Passwort → „Anmelden".',
exp:'PIN-Feld ist vorausgefüllt („Dev: … vorausgefüllt"), „Bestätigen" → eingeloggt.' },
{ id:'auth-found', t:'Auth-Fundament JWT + Redis (schlafend, non-breaking)', tag:'pending',
w:'firebase/php-jwt + predis + Jwt/SessionStore + Session-Kanalisierung. AUTH_BACKEND=session.',
url:'', steps:'Kein direkter Test nötig — nur sicherstellen, dass Login/Admin normal funktionieren.',
exp:'Alles läuft wie bisher (das Fundament ist inaktiv, bis der JWT-Cutover kommt).' },
],
};
const listWrap = document.querySelector('.wrap');
document.querySelectorAll('section[data-sec]').forEach(sec => {
const name = sec.getAttribute('data-sec');
const items = ITEMS[name] || [];
let html = '<div class="sec-h">' + name + ' <span class="cnt">' + items.length + ' Punkte</span></div>';
items.forEach(it => {
const urlHtml = it.url ? '<a class="url" href="' + u(it.url) + '" target="_blank" rel="noopener">' + u(it.url) + '</a>' : '<span style="color:#b3ac9e">—</span>';
html += ''
+ '<div class="item" data-id="' + it.id + '">'
+ '<div class="item-top">'
+ '<input type="checkbox" data-check="' + it.id + '">'
+ '<div style="flex:1"><span class="item-title">' + it.t + '</span>'
+ '<span class="tag ' + it.tag + '">' + (it.tag==='live'?'live':'bereit') + '</span></div>'
+ '</div>'
+ '<div class="body">'
+ '<div class="row"><span class="k">Was</span> ' + it.w + '</div>'
+ '<div class="row"><span class="k">Öffnen</span> ' + urlHtml + '</div>'
+ '<div class="row"><span class="k">Testen</span> ' + it.steps + '</div>'
+ '<div class="exp">✓ Erwartet: ' + it.exp + '</div>'
+ '<textarea class="note" data-note="' + it.id + '" placeholder="Notiz / gefundene Abweichung…"></textarea>'
+ '</div>'
+ '</div>';
});
sec.innerHTML = html;
});
// Persistenz + Fortschritt
const checks = document.querySelectorAll('input[data-check]');
function refresh(){
let done = 0;
checks.forEach(c => { if(c.checked){ done++; c.closest('.item').classList.add('done'); } else c.closest('.item').classList.remove('done'); });
document.getElementById('pcount').textContent = done + ' / ' + checks.length;
document.getElementById('pbar').style.width = (checks.length? (done/checks.length*100):0) + '%';
}
checks.forEach(c => {
const key = 'chk_' + c.getAttribute('data-check');
c.checked = localStorage.getItem(key) === '1';
c.addEventListener('change', () => { localStorage.setItem(key, c.checked?'1':'0'); refresh(); });
});
document.querySelectorAll('textarea[data-note]').forEach(t => {
const key = 'note_' + t.getAttribute('data-note');
t.value = localStorage.getItem(key) || '';
t.addEventListener('input', () => localStorage.setItem(key, t.value));
});
refresh();
</script>
</body>
</html>
+15
View File
@@ -14,3 +14,18 @@ DB_PORT=3306
# ElevenLabs Sound Effects API — nur für generate-sounds.py (Dev-Zeit)
# ELEVENLABS_API_KEY=...
# ── Auth-Backend (JWT + Redis) ──────────────────────────────────────────
# 'session' = Legacy PHP-Datei-Sessions (Default, ändert nichts).
# 'jwt' = JWT-Access-Token (HttpOnly-Cookie) + Redis-Session/Refresh.
AUTH_BACKEND=session
# Signaturschlüssel für JWT (HS256). PFLICHT sobald AUTH_BACKEND=jwt.
# Erzeugen mit: openssl rand -hex 32
# Pro Umgebung UNTERSCHIEDLICH (dev ≠ prod). NIEMALS committen.
# JWT_SECRET=
# Redis (Session-/Refresh-Store). Lokal: docker-compose.dev.yml → 127.0.0.1:6379
REDIS_URL=tcp://127.0.0.1:6379
# JWT_TTL=900 # Access-Token-Lebensdauer in Sekunden (Default 15 min)
# JWT_REFRESH_TTL=2592000 # Session/Refresh in Sekunden (Default 30 Tage)
+14
View File
@@ -1,3 +1,17 @@
# Sensible Dateien niemals ausliefern (Defense-in-Depth), auch wenn sie im
# Docroot liegen und die -f-Regel unten sie sonst direkt serviert.
<FilesMatch "^\.env">
Require all denied
</FilesMatch>
<FilesMatch "\.(sh|sql|bak)$">
Require all denied
</FilesMatch>
# Backend-Editor-UI (statisch) nicht direkt ausliefern — nur über die
# admin-geschützte Route /stadt-editor (pages/stadt-editor.php) erreichbar.
<Files "stadt-editor.html">
Require all denied
</Files>
RewriteEngine On
# Kein RewriteBase — Apache nutzt den Request-Pfad automatisch.
# Funktioniert fuer alle Deploy-Ziele:
@@ -0,0 +1,625 @@
SET FOREIGN_KEY_CHECKS=0;
-- Generierte Leistungsdaten der Testklasse zurücksetzen (idempotent)
DELETE FROM player_progress WHERE student_id IN (SELECT id FROM students WHERE class_id=99 AND username IN ('ben','clara','david','emma','felix','greta','hannes','ida','jakob_s','katharina','leon','marlene','noah','olivia'));
DELETE FROM student_results WHERE class_id=99 AND student_id IN (SELECT id FROM students WHERE class_id=99 AND username IN ('ben','clara','david','emma','felix','greta','hannes','ida','jakob_s','katharina','leon','marlene','noah','olivia'));
DELETE FROM assessments WHERE class_id=99 AND session_id IN (SELECT id FROM student_sessions WHERE class_id=99 AND created_at='2025-10-01 08:00:00' AND display_name IN ('Ben','Clara','David','Emma','Felix','Greta','Hannes','Ida','Jakob','Katharina','Leon','Marlene','Noah','Olivia'));
DELETE FROM student_sessions WHERE class_id=99 AND created_at='2025-10-01 08:00:00' AND display_name IN ('Ben','Clara','David','Emma','Felix','Greta','Hannes','Ida','Jakob','Katharina','Leon','Marlene','Noah','Olivia');
DELETE FROM students WHERE class_id=99 AND username IN ('david','emma','felix','greta','hannes','ida','jakob_s','katharina','leon','marlene','noah','olivia');
INSERT INTO students (class_id, username, password, display_name, emoji_avatar, avatar_slug, is_anonymous, created_at) VALUES (99, 'david', '!nologin-generated', 'David', '🦊', 'fuchs-explorer', 0, '2025-09-20 08:00:00');
INSERT INTO students (class_id, username, password, display_name, emoji_avatar, avatar_slug, is_anonymous, created_at) VALUES (99, 'emma', '!nologin-generated', 'Emma', '🦉', 'eule-prof', 0, '2025-09-20 08:00:00');
INSERT INTO students (class_id, username, password, display_name, emoji_avatar, avatar_slug, is_anonymous, created_at) VALUES (99, 'felix', '!nologin-generated', 'Felix', '🐧', 'pinguin-polar', 0, '2025-09-20 08:00:00');
INSERT INTO students (class_id, username, password, display_name, emoji_avatar, avatar_slug, is_anonymous, created_at) VALUES (99, 'greta', '!nologin-generated', 'Greta', '🐻', 'baer-foerster', 0, '2025-09-20 08:00:00');
INSERT INTO students (class_id, username, password, display_name, emoji_avatar, avatar_slug, is_anonymous, created_at) VALUES (99, 'hannes', '!nologin-generated', 'Hannes', '🐨', 'fuchs-explorer', 0, '2025-09-20 08:00:00');
INSERT INTO students (class_id, username, password, display_name, emoji_avatar, avatar_slug, is_anonymous, created_at) VALUES (99, 'ida', '!nologin-generated', 'Ida', '🦄', 'astronaut', 0, '2025-09-20 08:00:00');
INSERT INTO students (class_id, username, password, display_name, emoji_avatar, avatar_slug, is_anonymous, created_at) VALUES (99, 'jakob_s', '!nologin-generated', 'Jakob', '🐺', 'adler-pilot', 0, '2025-09-20 08:00:00');
INSERT INTO students (class_id, username, password, display_name, emoji_avatar, avatar_slug, is_anonymous, created_at) VALUES (99, 'katharina', '!nologin-generated', 'Katharina', '🐬', 'delfin-meer', 0, '2025-09-20 08:00:00');
INSERT INTO students (class_id, username, password, display_name, emoji_avatar, avatar_slug, is_anonymous, created_at) VALUES (99, 'leon', '!nologin-generated', 'Leon', '🦅', 'adler-pilot', 0, '2025-09-20 08:00:00');
INSERT INTO students (class_id, username, password, display_name, emoji_avatar, avatar_slug, is_anonymous, created_at) VALUES (99, 'marlene', '!nologin-generated', 'Marlene', '🦋', 'nerd-girl', 0, '2025-09-20 08:00:00');
INSERT INTO students (class_id, username, password, display_name, emoji_avatar, avatar_slug, is_anonymous, created_at) VALUES (99, 'noah', '!nologin-generated', 'Noah', '🐢', 'baer-foerster', 0, '2025-09-20 08:00:00');
INSERT INTO students (class_id, username, password, display_name, emoji_avatar, avatar_slug, is_anonymous, created_at) VALUES (99, 'olivia', '!nologin-generated', 'Olivia', '🌟', 'astronaut', 0, '2025-09-20 08:00:00');
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('9c2c1089-8d72-1671-4c3c-c34df4a8dba4', 99, 'Ben', '2025-10-01 08:00:00', '2026-06-15 12:00:00', 'AT');
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('448cf546-26ba-c318-65f9-bd103adc1458', 99, 'Clara', '2025-10-01 08:00:00', '2026-06-15 12:00:00', 'AT');
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 99, 'David', '2025-10-01 08:00:00', '2026-06-15 12:00:00', 'AT');
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('38b52026-4830-7f60-181f-0b456afa97a7', 99, 'Emma', '2025-10-01 08:00:00', '2026-06-15 12:00:00', 'AT');
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('ae34b1cf-7363-72a9-7e77-63e53369e194', 99, 'Felix', '2025-10-01 08:00:00', '2026-06-15 12:00:00', 'AT');
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('d2e98b8a-d9aa-97e1-6154-3500f8ac1e3f', 99, 'Greta', '2025-10-01 08:00:00', '2026-06-15 12:00:00', 'AT');
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('563c34ea-a920-6d2f-753d-2fb472cda1f9', 99, 'Hannes', '2025-10-01 08:00:00', '2026-06-15 12:00:00', 'AT');
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('38a1a9f3-a467-b160-3c94-dc20b6a8f274', 99, 'Ida', '2025-10-01 08:00:00', '2026-06-15 12:00:00', 'AT');
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 99, 'Jakob', '2025-10-01 08:00:00', '2026-06-15 12:00:00', 'AT');
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('66f79a67-0255-e4fb-9847-9985092ba96c', 99, 'Katharina', '2025-10-01 08:00:00', '2026-06-15 12:00:00', 'AT');
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('db225fef-afde-88a4-b94f-6fc2f84ad151', 99, 'Leon', '2025-10-01 08:00:00', '2026-06-15 12:00:00', 'AT');
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('0707c56d-bce7-a86f-088d-266366d259c5', 99, 'Marlene', '2025-10-01 08:00:00', '2026-06-15 12:00:00', 'AT');
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('43120340-23ec-a239-ac67-2c5f42989333', 99, 'Noah', '2025-10-01 08:00:00', '2026-06-15 12:00:00', 'AT');
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 99, 'Olivia', '2025-10-01 08:00:00', '2026-06-15 12:00:00', 'AT');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 'tourismustal', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 'energiemanager', 2, 80, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 'eu-werkstatt', 2, 110, 3, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 'busfahrt', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 'tourismusregion', 2, 80, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 'weltkueche', 1, 30, 1, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 'fluss', 2, 55, 1, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 'heli', 1, 30, 1, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 'sonnensystem', 2, 70, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 'logistik', 2, 55, 1, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 'kofferdetektiv', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 'heli', 1, 30, 1, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 'farmer', 1, 20, 1, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 'energiemanager', 2, 70, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 'busfahrt', 2, 90, 3, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 'fluss', 2, 50, 2, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 'weltkueche', 1, 30, 1, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 'tourismusregion', 2, 90, 3, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 'logistik', 1, 20, 1, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 'eu-werkstatt', 2, 70, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 'kofferdetektiv', 3, 165, 3, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 'tourismusregion', 2, 95, 2, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 'tourismustal', 2, 110, 2, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 'sonnensystem', 2, 55, 1, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 'farmer', 3, 150, 3, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 'weltkueche', 2, 55, 1, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 'heli', 2, 55, 1, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 'energiemanager', 2, 95, 2, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 'eu-werkstatt', 2, 95, 2, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 'klima', 2, 55, 1, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 'fluss', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 'logistik', 2, 110, 2, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 'farmer', 2, 120, 3, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 'tourismusregion', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 'fluss', 2, 80, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 'logistik', 2, 95, 2, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 'eu-werkstatt', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 'kofferdetektiv', 2, 95, 2, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 'sonnensystem', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 'heli', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 'tourismustal', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 'busfahrt', 2, 95, 2, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1), 'kofferdetektiv', 1, 40, 2, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1), 'fluss', 1, 20, 1, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1), 'energiemanager', 1, 20, 1, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1), 'tourismusregion', 1, 30, 1, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1), 'busfahrt', 1, 40, 3, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1), 'tourismustal', 1, 30, 1, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1), 'logistik', 1, 30, 1, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 'fluss', 2, 95, 2, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 'tourismustal', 2, 70, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 'logistik', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 'sonnensystem', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 'weltkueche', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 'eu-werkstatt', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 'tourismusregion', 1, 30, 1, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 'energiemanager', 2, 70, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 'klima', 2, 70, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 'kofferdetektiv', 2, 70, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 'busfahrt', 2, 70, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1), 'busfahrt', 1, 10, 1, 1);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1), 'sonnensystem', 1, 20, 1, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1), 'heli', 1, 40, 2, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1), 'logistik', 1, 10, 1, 1);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1), 'fluss', 1, 10, 1, 1);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1), 'weltkueche', 1, 40, 2, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1), 'kofferdetektiv', 1, 30, 1, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 'weltkueche', 1, 30, 1, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 'busfahrt', 2, 60, 2, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 'eu-werkstatt', 2, 110, 3, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 'logistik', 2, 55, 1, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 'fluss', 2, 70, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 'energiemanager', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 'kofferdetektiv', 2, 80, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 'klima', 2, 90, 3, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 'tourismustal', 2, 60, 2, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 'tourismusregion', 2, 70, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 'heli', 2, 130, 3, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 'busfahrt', 2, 80, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 'eu-werkstatt', 2, 70, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 'logistik', 2, 80, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 'tourismusregion', 1, 30, 1, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 'weltkueche', 2, 70, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 'kofferdetektiv', 2, 95, 2, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 'tourismustal', 2, 95, 2, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 'energiemanager', 2, 95, 2, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 'sonnensystem', 2, 95, 2, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 'fluss', 2, 70, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 'farmer', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 'energiemanager', 1, 20, 1, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 'tourismustal', 2, 50, 2, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 'heli', 2, 60, 2, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 'eu-werkstatt', 2, 80, 3, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 'fluss', 1, 30, 1, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 'weltkueche', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 'kofferdetektiv', 1, 20, 1, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 'busfahrt', 1, 20, 1, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 'sonnensystem', 2, 100, 3, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 'klima', 2, 90, 3, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 'tourismustal', 1, 20, 1, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 'tourismusregion', 1, 20, 1, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 'kofferdetektiv', 2, 50, 2, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 'eu-werkstatt', 2, 70, 3, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 'heli', 2, 50, 2, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 'energiemanager', 2, 60, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 'logistik', 1, 30, 1, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 'weltkueche', 1, 10, 1, 1);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 'kofferdetektiv', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 'sonnensystem', 2, 60, 2, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 'logistik', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 'eu-werkstatt', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 'farmer', 2, 70, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 'weltkueche', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 'busfahrt', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 'heli', 2, 120, 3, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 'energiemanager', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 'tourismustal', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 'tourismusregion', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 'klima', 1, 30, 1, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 'heli', 1, 30, 2, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 'logistik', 1, 20, 1, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 'tourismustal', 1, 20, 1, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 'fluss', 1, 20, 1, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 'kofferdetektiv', 1, 40, 2, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 'eu-werkstatt', 2, 50, 2, 3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 'tourismusregion', 1, 30, 2, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 'energiemanager', 1, 30, 2, 2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 'kofferdetektiv', 2, 120, 3, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 'klima', 2, 80, 2, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 'tourismusregion', 2, 55, 1, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 'heli', 2, 95, 2, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 'sonnensystem', 1, 40, 1, 4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 'energiemanager', 2, 140, 3, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 'tourismustal', 2, 95, 2, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 'weltkueche', 2, 110, 2, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 'logistik', 2, 95, 2, 5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 'busfahrt', 2, 80, 2, 4);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9c2c1089-8d72-1671-4c3c-c34df4a8dba4', 'tourismustal', 99, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA1LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA3NiwgIm5hdHVyZSI6IDc2LCAibW9uZXkiOiAxMDB9') USING utf8mb4), 112000, '2026-01-12 15:11:42');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9c2c1089-8d72-1671-4c3c-c34df4a8dba4', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDExLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA1LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4), 445000, '2025-11-12 13:56:50');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9c2c1089-8d72-1671-4c3c-c34df4a8dba4', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDEwLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA1LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4), 364000, '2026-06-02 10:27:53');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9c2c1089-8d72-1671-4c3c-c34df4a8dba4', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogOCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), 238000, '2026-06-15 08:28:18');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9c2c1089-8d72-1671-4c3c-c34df4a8dba4', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNiwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), 376000, '2025-11-01 09:35:08');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9c2c1089-8d72-1671-4c3c-c34df4a8dba4', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), 210000, '2026-03-26 09:23:18');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9c2c1089-8d72-1671-4c3c-c34df4a8dba4', 'busfahrt', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA2LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNiwgImF2Z1RhcEttIjogNzF9') USING utf8mb4), 301000, '2025-10-28 15:47:16');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9c2c1089-8d72-1671-4c3c-c34df4a8dba4', 'tourismusregion', 99, CONVERT(FROM_BASE64('eyJzY29yZSI6IDkwfQ==') USING utf8mb4), 502000, '2025-12-07 11:15:43');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9c2c1089-8d72-1671-4c3c-c34df4a8dba4', 'tourismusregion', 99, CONVERT(FROM_BASE64('eyJzY29yZSI6IDgyfQ==') USING utf8mb4), 504000, '2026-01-31 13:07:48');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9c2c1089-8d72-1671-4c3c-c34df4a8dba4', 'weltkueche', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJjb21wbGV0ZWREaXNoZXMiOiA2LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogNn0=') USING utf8mb4), 183000, '2026-06-08 10:58:57');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9c2c1089-8d72-1671-4c3c-c34df4a8dba4', 'fluss', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJiaW9kaXYiOiA5NSwgImVjb25vbXkiOiA5NSwgImZsb29kIjogNSwgImZvb2QiOiA5NX0=') USING utf8mb4), 470000, '2026-04-04 12:19:11');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9c2c1089-8d72-1671-4c3c-c34df4a8dba4', 'heli', 99, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAzLCAicGxhblBjdCI6IDY0LCAic3RhcnRTY29yZSI6IDMsICJsYW5kaW5nU2NvcmUiOiAzfQ==') USING utf8mb4), 385000, '2026-02-22 12:27:26');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9c2c1089-8d72-1671-4c3c-c34df4a8dba4', 'sonnensystem', 99, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxNiwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4), 319000, '2026-05-20 11:30:36');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9c2c1089-8d72-1671-4c3c-c34df4a8dba4', 'sonnensystem', 99, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxMiwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4), 514000, '2026-04-15 08:17:01');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9c2c1089-8d72-1671-4c3c-c34df4a8dba4', 'logistik', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJvcmRlcnNEZWxpdmVyZWQiOiA5LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogMTA0MH0=') USING utf8mb4), 481000, '2026-03-28 12:46:14');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9c2c1089-8d72-1671-4c3c-c34df4a8dba4', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuOX0=') USING utf8mb4), 105000, '2026-04-25 11:40:43');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('448cf546-26ba-c318-65f9-bd103adc1458', 'heli', 99, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAzLCAicGxhblBjdCI6IDYwLCAic3RhcnRTY29yZSI6IDMsICJsYW5kaW5nU2NvcmUiOiAzfQ==') USING utf8mb4), 297000, '2025-12-31 13:21:13');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('448cf546-26ba-c318-65f9-bd103adc1458', 'farmer', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJoaXRfcmF0ZSI6IDQ3LCAieWVhciI6IDcsICJjcm9wc191c2VkIjogM30=') USING utf8mb4), 424000, '2025-10-04 15:26:14');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('448cf546-26ba-c318-65f9-bd103adc1458', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJibG9ja3NCYWxhbmNlZCI6IDcsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDMsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), 185000, '2026-02-11 10:16:03');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('448cf546-26ba-c318-65f9-bd103adc1458', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDksICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDQsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), 113000, '2026-01-24 12:00:13');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('448cf546-26ba-c318-65f9-bd103adc1458', 'busfahrt', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJ3b25PcmRlcnMiOiA1LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNSwgImF2Z1RhcEttIjogODh9') USING utf8mb4), 251000, '2026-01-20 09:02:15');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('448cf546-26ba-c318-65f9-bd103adc1458', 'busfahrt', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJ3b25PcmRlcnMiOiA1LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNSwgImF2Z1RhcEttIjogOTV9') USING utf8mb4), 113000, '2026-05-28 13:38:18');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('448cf546-26ba-c318-65f9-bd103adc1458', 'busfahrt', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJ3b25PcmRlcnMiOiA1LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNSwgImF2Z1RhcEttIjogOTF9') USING utf8mb4), 100000, '2026-01-17 09:19:37');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('448cf546-26ba-c318-65f9-bd103adc1458', 'fluss', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJiaW9kaXYiOiA1MCwgImVjb25vbXkiOiA1MCwgImZsb29kIjogNTAsICJmb29kIjogNTB9') USING utf8mb4), 173000, '2025-11-08 13:24:07');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('448cf546-26ba-c318-65f9-bd103adc1458', 'fluss', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJiaW9kaXYiOiA1NCwgImVjb25vbXkiOiA1NCwgImZsb29kIjogNDYsICJmb29kIjogNTR9') USING utf8mb4), 311000, '2026-01-08 11:45:46');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('448cf546-26ba-c318-65f9-bd103adc1458', 'weltkueche', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJjb21wbGV0ZWREaXNoZXMiOiA2LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogNn0=') USING utf8mb4), 453000, '2025-10-02 15:23:09');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('448cf546-26ba-c318-65f9-bd103adc1458', 'tourismusregion', 99, CONVERT(FROM_BASE64('eyJzY29yZSI6IDU2fQ==') USING utf8mb4), 173000, '2026-02-23 09:56:57');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('448cf546-26ba-c318-65f9-bd103adc1458', 'tourismusregion', 99, CONVERT(FROM_BASE64('eyJzY29yZSI6IDQ3fQ==') USING utf8mb4), 365000, '2025-11-07 09:28:37');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('448cf546-26ba-c318-65f9-bd103adc1458', 'tourismusregion', 99, CONVERT(FROM_BASE64('eyJzY29yZSI6IDc0fQ==') USING utf8mb4), 353000, '2026-01-01 09:37:19');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('448cf546-26ba-c318-65f9-bd103adc1458', 'logistik', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJvcmRlcnNEZWxpdmVyZWQiOiA1LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogMTQwfQ==') USING utf8mb4), 491000, '2025-10-09 13:55:28');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('448cf546-26ba-c318-65f9-bd103adc1458', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), 465000, '2025-12-07 10:33:05');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('448cf546-26ba-c318-65f9-bd103adc1458', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), 502000, '2026-04-22 09:06:23');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA2LCAiY29ycmVjdF9maXJzdF90cnkiOiA2LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDEuMH0=') USING utf8mb4), 140000, '2026-06-09 08:24:46');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA2LCAiY29ycmVjdF9maXJzdF90cnkiOiA2LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDEuN30=') USING utf8mb4), 438000, '2025-10-16 12:33:42');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA2LCAiY29ycmVjdF9maXJzdF90cnkiOiA2LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDEuMH0=') USING utf8mb4), 495000, '2025-10-20 08:43:37');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'tourismusregion', 99, CONVERT(FROM_BASE64('eyJzY29yZSI6IDg5fQ==') USING utf8mb4), 425000, '2025-10-24 11:36:36');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'tourismusregion', 99, CONVERT(FROM_BASE64('eyJzY29yZSI6IDkzfQ==') USING utf8mb4), 275000, '2026-04-24 13:39:14');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'tourismustal', 99, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA2LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiAxMDAsICJuYXR1cmUiOiAxMDAsICJtb25leSI6IDEwMH0=') USING utf8mb4), 282000, '2025-10-26 15:35:38');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'tourismustal', 99, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA2LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiAxMDAsICJuYXR1cmUiOiAxMDAsICJtb25leSI6IDEwMH0=') USING utf8mb4), 231000, '2025-10-15 15:43:00');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'sonnensystem', 99, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAyMCwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IHRydWV9') USING utf8mb4), 322000, '2026-01-26 13:12:55');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'farmer', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJoaXRfcmF0ZSI6IDEwMCwgInllYXIiOiAxNSwgImNyb3BzX3VzZWQiOiA2fQ==') USING utf8mb4), 355000, '2026-04-18 14:15:43');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'farmer', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDg5LCAieWVhciI6IDEzLCAiY3JvcHNfdXNlZCI6IDV9') USING utf8mb4), 479000, '2025-11-11 11:42:17');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'farmer', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJoaXRfcmF0ZSI6IDEwMCwgInllYXIiOiAxNSwgImNyb3BzX3VzZWQiOiA2fQ==') USING utf8mb4), 146000, '2025-12-28 13:06:54');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'weltkueche', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJjb21wbGV0ZWREaXNoZXMiOiA5LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogMX0=') USING utf8mb4), 397000, '2026-04-06 11:03:48');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'heli', 99, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA1LCAicGxhblBjdCI6IDk2LCAic3RhcnRTY29yZSI6IDUsICJsYW5kaW5nU2NvcmUiOiA1fQ==') USING utf8mb4), 434000, '2026-02-22 08:57:12');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDEwLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA1LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4), 265000, '2025-10-26 11:34:22');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJibG9ja3NCYWxhbmNlZCI6IDEyLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA2LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4), 489000, '2026-01-10 11:13:42');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogMTAsICJ0b3RhbEF0dGVtcHRzIjogMTIsICJtdWVsbGVpbWVyQ291bnQiOiAwfQ==') USING utf8mb4), 434000, '2025-11-14 15:51:03');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogOCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), 197000, '2026-03-07 13:17:31');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'klima', 99, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE1LjUsICJmaW5hbF9mbG9vZGVkX3BjdCI6IDAsICJmaW5hbF9idWRnZXQiOiA2MDAsICJmaW5hbF9jbzIiOiAzODAsICJmaW5hbF9wb3B1bGF0aW9uIjogMjUwfQ==') USING utf8mb4), 160000, '2026-02-07 14:12:10');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'fluss', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA4NCwgImVjb25vbXkiOiA4NCwgImZsb29kIjogMTYsICJmb29kIjogODR9') USING utf8mb4), 351000, '2025-12-13 09:08:33');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'logistik', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJvcmRlcnNEZWxpdmVyZWQiOiAxMCwgInRvdGFsT3JkZXJzIjogMTAsICJvcmRlcnNMYXRlIjogMCwgImZpbmFsQmFsYW5jZSI6IDExMDB9') USING utf8mb4), 139000, '2025-11-23 12:07:11');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9e061130-8ba7-7ce2-be34-a408d9ed803f', 'logistik', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJvcmRlcnNEZWxpdmVyZWQiOiAxMCwgInRvdGFsT3JkZXJzIjogMTAsICJvcmRlcnNMYXRlIjogMCwgImZpbmFsQmFsYW5jZSI6IDExODB9') USING utf8mb4), 143000, '2026-03-08 15:41:22');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38b52026-4830-7f60-181f-0b456afa97a7', 'farmer', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDg5LCAieWVhciI6IDEzLCAiY3JvcHNfdXNlZCI6IDV9') USING utf8mb4), 271000, '2026-03-22 12:42:08');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38b52026-4830-7f60-181f-0b456afa97a7', 'farmer', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDkwLCAieWVhciI6IDE0LCAiY3JvcHNfdXNlZCI6IDV9') USING utf8mb4), 391000, '2026-06-11 13:44:38');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38b52026-4830-7f60-181f-0b456afa97a7', 'farmer', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDgyLCAieWVhciI6IDEyLCAiY3JvcHNfdXNlZCI6IDV9') USING utf8mb4), 207000, '2026-01-11 09:00:05');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38b52026-4830-7f60-181f-0b456afa97a7', 'tourismusregion', 99, CONVERT(FROM_BASE64('eyJzY29yZSI6IDg5fQ==') USING utf8mb4), 185000, '2025-10-04 09:29:17');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38b52026-4830-7f60-181f-0b456afa97a7', 'fluss', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA4NywgImVjb25vbXkiOiA4NywgImZsb29kIjogMTMsICJmb29kIjogODd9') USING utf8mb4), 446000, '2026-05-25 15:16:42');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38b52026-4830-7f60-181f-0b456afa97a7', 'fluss', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA3NSwgImVjb25vbXkiOiA3NSwgImZsb29kIjogMjUsICJmb29kIjogNzV9') USING utf8mb4), 344000, '2025-12-30 11:17:25');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38b52026-4830-7f60-181f-0b456afa97a7', 'logistik', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJvcmRlcnNEZWxpdmVyZWQiOiA5LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogMTA0MH0=') USING utf8mb4), 516000, '2026-02-06 12:47:48');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38b52026-4830-7f60-181f-0b456afa97a7', 'logistik', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA5LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogOTYwfQ==') USING utf8mb4), 468000, '2026-01-07 10:07:53');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38b52026-4830-7f60-181f-0b456afa97a7', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogOSwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), 376000, '2026-04-09 15:11:45');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38b52026-4830-7f60-181f-0b456afa97a7', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuNX0=') USING utf8mb4), 463000, '2026-05-24 10:56:40');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38b52026-4830-7f60-181f-0b456afa97a7', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDEuOH0=') USING utf8mb4), 454000, '2026-02-17 15:19:11');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38b52026-4830-7f60-181f-0b456afa97a7', 'sonnensystem', 99, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxNywgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IHRydWV9') USING utf8mb4), 244000, '2025-12-04 15:23:14');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38b52026-4830-7f60-181f-0b456afa97a7', 'heli', 99, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDg2LCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4), 148000, '2026-01-14 10:27:50');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38b52026-4830-7f60-181f-0b456afa97a7', 'tourismustal', 99, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA3MywgIm5hdHVyZSI6IDczLCAibW9uZXkiOiAxMDB9') USING utf8mb4), 447000, '2025-10-04 10:30:38');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38b52026-4830-7f60-181f-0b456afa97a7', 'busfahrt', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJ3b25PcmRlcnMiOiA4LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogOCwgImF2Z1RhcEttIjogMzh9') USING utf8mb4), 398000, '2026-04-26 09:47:15');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38b52026-4830-7f60-181f-0b456afa97a7', 'busfahrt', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA2LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNiwgImF2Z1RhcEttIjogNzJ9') USING utf8mb4), 364000, '2026-05-16 14:01:11');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ae34b1cf-7363-72a9-7e77-63e53369e194', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAzLCAiY29ycmVjdF9maXJzdF90cnkiOiAzLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDYuMH0=') USING utf8mb4), 510000, '2025-10-20 15:00:36');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ae34b1cf-7363-72a9-7e77-63e53369e194', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAyLCAiY29ycmVjdF9maXJzdF90cnkiOiAyLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDYuM30=') USING utf8mb4), 414000, '2025-12-03 08:09:04');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ae34b1cf-7363-72a9-7e77-63e53369e194', 'fluss', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJiaW9kaXYiOiA0MiwgImVjb25vbXkiOiA0MiwgImZsb29kIjogNTgsICJmb29kIjogNDJ9') USING utf8mb4), 140000, '2026-04-05 14:10:01');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ae34b1cf-7363-72a9-7e77-63e53369e194', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJibG9ja3NCYWxhbmNlZCI6IDUsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDIsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), 430000, '2026-01-01 12:59:31');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ae34b1cf-7363-72a9-7e77-63e53369e194', 'tourismusregion', 99, CONVERT(FROM_BASE64('eyJzY29yZSI6IDU1fQ==') USING utf8mb4), 430000, '2025-10-01 14:50:55');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ae34b1cf-7363-72a9-7e77-63e53369e194', 'busfahrt', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJ3b25PcmRlcnMiOiAyLCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogMiwgImF2Z1RhcEttIjogMTU4fQ==') USING utf8mb4), 439000, '2026-05-17 09:31:53');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ae34b1cf-7363-72a9-7e77-63e53369e194', 'busfahrt', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJ3b25PcmRlcnMiOiAyLCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogMiwgImF2Z1RhcEttIjogMTU4fQ==') USING utf8mb4), 222000, '2026-01-23 15:06:07');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ae34b1cf-7363-72a9-7e77-63e53369e194', 'busfahrt', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJ3b25PcmRlcnMiOiAzLCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogMywgImF2Z1RhcEttIjogMTQ0fQ==') USING utf8mb4), 202000, '2026-04-30 09:15:09');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ae34b1cf-7363-72a9-7e77-63e53369e194', 'tourismustal', 99, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA2MSwgIm5hdHVyZSI6IDYxLCAibW9uZXkiOiAxMDB9') USING utf8mb4), 92000, '2026-06-14 14:55:58');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ae34b1cf-7363-72a9-7e77-63e53369e194', 'logistik', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJvcmRlcnNEZWxpdmVyZWQiOiA1LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogMjQwfQ==') USING utf8mb4), 103000, '2026-01-15 12:14:13');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d2e98b8a-d9aa-97e1-6154-3500f8ac1e3f', 'fluss', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJiaW9kaXYiOiA5MywgImVjb25vbXkiOiA5MywgImZsb29kIjogNywgImZvb2QiOiA5M30=') USING utf8mb4), 126000, '2026-01-03 10:24:07');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d2e98b8a-d9aa-97e1-6154-3500f8ac1e3f', 'fluss', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA4NCwgImVjb25vbXkiOiA4NCwgImZsb29kIjogMTYsICJmb29kIjogODR9') USING utf8mb4), 103000, '2026-02-08 12:14:23');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d2e98b8a-d9aa-97e1-6154-3500f8ac1e3f', 'tourismustal', 99, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA3NCwgIm5hdHVyZSI6IDc0LCAibW9uZXkiOiAxMDB9') USING utf8mb4), 112000, '2025-12-14 10:26:26');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d2e98b8a-d9aa-97e1-6154-3500f8ac1e3f', 'tourismustal', 99, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA1OSwgIm5hdHVyZSI6IDU5LCAibW9uZXkiOiAxMDB9') USING utf8mb4), 101000, '2025-11-16 11:33:26');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d2e98b8a-d9aa-97e1-6154-3500f8ac1e3f', 'logistik', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA3LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNjAwfQ==') USING utf8mb4), 414000, '2026-01-16 08:54:07');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d2e98b8a-d9aa-97e1-6154-3500f8ac1e3f', 'sonnensystem', 99, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxNiwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4), 152000, '2026-05-18 11:24:56');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d2e98b8a-d9aa-97e1-6154-3500f8ac1e3f', 'weltkueche', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJjb21wbGV0ZWREaXNoZXMiOiA3LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogNH0=') USING utf8mb4), 457000, '2025-12-22 15:28:23');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d2e98b8a-d9aa-97e1-6154-3500f8ac1e3f', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogOCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), 367000, '2025-10-24 15:28:00');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d2e98b8a-d9aa-97e1-6154-3500f8ac1e3f', 'tourismusregion', 99, CONVERT(FROM_BASE64('eyJzY29yZSI6IDY5fQ==') USING utf8mb4), 231000, '2026-01-25 14:55:05');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d2e98b8a-d9aa-97e1-6154-3500f8ac1e3f', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJibG9ja3NCYWxhbmNlZCI6IDgsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDQsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), 418000, '2026-04-13 13:34:05');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d2e98b8a-d9aa-97e1-6154-3500f8ac1e3f', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDksICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDQsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), 98000, '2025-11-24 09:59:51');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d2e98b8a-d9aa-97e1-6154-3500f8ac1e3f', 'klima', 99, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjQ5LCAiZmluYWxfZmxvb2RlZF9wY3QiOiAzMywgImZpbmFsX2J1ZGdldCI6IDI3MCwgImZpbmFsX2NvMiI6IDQzMCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4), 128000, '2026-03-29 10:32:49');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d2e98b8a-d9aa-97e1-6154-3500f8ac1e3f', 'klima', 99, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE1Ljk4LCAiZmluYWxfZmxvb2RlZF9wY3QiOiAxNiwgImZpbmFsX2J1ZGdldCI6IDQ0MCwgImZpbmFsX2NvMiI6IDQwNCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4), 128000, '2025-11-26 10:51:02');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d2e98b8a-d9aa-97e1-6154-3500f8ac1e3f', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAzLCAiY29ycmVjdF9maXJzdF90cnkiOiAzLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDQuOH0=') USING utf8mb4), 130000, '2026-01-21 08:56:53');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d2e98b8a-d9aa-97e1-6154-3500f8ac1e3f', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDMuMX0=') USING utf8mb4), 285000, '2025-12-21 15:26:41');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d2e98b8a-d9aa-97e1-6154-3500f8ac1e3f', 'busfahrt', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJ3b25PcmRlcnMiOiA1LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNSwgImF2Z1RhcEttIjogODR9') USING utf8mb4), 221000, '2026-03-05 15:48:41');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d2e98b8a-d9aa-97e1-6154-3500f8ac1e3f', 'busfahrt', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA3LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNywgImF2Z1RhcEttIjogNTR9') USING utf8mb4), 118000, '2026-04-16 15:19:36');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('563c34ea-a920-6d2f-753d-2fb472cda1f9', 'busfahrt', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJ3b25PcmRlcnMiOiAyLCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogMiwgImF2Z1RhcEttIjogMTU0fQ==') USING utf8mb4), 113000, '2026-02-11 12:25:15');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('563c34ea-a920-6d2f-753d-2fb472cda1f9', 'sonnensystem', 99, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiA2LCAidG90YWwiOiAyMCwgImZpcnN0VHJ5IjogZmFsc2V9') USING utf8mb4), 229000, '2026-02-14 13:18:51');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('563c34ea-a920-6d2f-753d-2fb472cda1f9', 'heli', 99, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAyLCAicGxhblBjdCI6IDM1LCAic3RhcnRTY29yZSI6IDIsICJsYW5kaW5nU2NvcmUiOiAyfQ==') USING utf8mb4), 261000, '2025-12-25 15:59:46');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('563c34ea-a920-6d2f-753d-2fb472cda1f9', 'heli', 99, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAyLCAicGxhblBjdCI6IDM3LCAic3RhcnRTY29yZSI6IDIsICJsYW5kaW5nU2NvcmUiOiAyfQ==') USING utf8mb4), 362000, '2026-05-18 15:46:31');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('563c34ea-a920-6d2f-753d-2fb472cda1f9', 'logistik', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJvcmRlcnNEZWxpdmVyZWQiOiAyLCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogLTUwMH0=') USING utf8mb4), 181000, '2025-12-09 09:02:25');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('563c34ea-a920-6d2f-753d-2fb472cda1f9', 'fluss', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJiaW9kaXYiOiAyNCwgImVjb25vbXkiOiAyNCwgImZsb29kIjogNzYsICJmb29kIjogMjR9') USING utf8mb4), 166000, '2026-04-21 12:51:08');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('563c34ea-a920-6d2f-753d-2fb472cda1f9', 'weltkueche', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJjb21wbGV0ZWREaXNoZXMiOiA0LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogOX0=') USING utf8mb4), 108000, '2026-05-11 09:17:36');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('563c34ea-a920-6d2f-753d-2fb472cda1f9', 'weltkueche', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJjb21wbGV0ZWREaXNoZXMiOiA0LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogOX0=') USING utf8mb4), 263000, '2025-11-24 09:36:17');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('563c34ea-a920-6d2f-753d-2fb472cda1f9', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAzLCAiY29ycmVjdF9maXJzdF90cnkiOiAzLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDUuMX0=') USING utf8mb4), 227000, '2025-10-23 08:42:48');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38a1a9f3-a467-b160-3c94-dc20b6a8f274', 'weltkueche', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJjb21wbGV0ZWREaXNoZXMiOiA2LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogNn0=') USING utf8mb4), 162000, '2025-12-10 11:31:59');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38a1a9f3-a467-b160-3c94-dc20b6a8f274', 'busfahrt', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJ3b25PcmRlcnMiOiA1LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNSwgImF2Z1RhcEttIjogOTF9') USING utf8mb4), 486000, '2026-01-30 13:53:37');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38a1a9f3-a467-b160-3c94-dc20b6a8f274', 'busfahrt', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJ3b25PcmRlcnMiOiA1LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNSwgImF2Z1RhcEttIjogODZ9') USING utf8mb4), 100000, '2026-03-31 13:40:11');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38a1a9f3-a467-b160-3c94-dc20b6a8f274', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), 303000, '2025-12-22 10:01:48');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38a1a9f3-a467-b160-3c94-dc20b6a8f274', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNiwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), 117000, '2025-12-21 08:08:24');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38a1a9f3-a467-b160-3c94-dc20b6a8f274', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogOCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), 399000, '2025-12-18 10:08:21');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38a1a9f3-a467-b160-3c94-dc20b6a8f274', 'logistik', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJvcmRlcnNEZWxpdmVyZWQiOiA5LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogMTAyMH0=') USING utf8mb4), 360000, '2026-06-03 11:35:08');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38a1a9f3-a467-b160-3c94-dc20b6a8f274', 'fluss', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA3MywgImVjb25vbXkiOiA3MywgImZsb29kIjogMjcsICJmb29kIjogNzN9') USING utf8mb4), 214000, '2026-02-06 11:53:21');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38a1a9f3-a467-b160-3c94-dc20b6a8f274', 'fluss', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJiaW9kaXYiOiA2MSwgImVjb25vbXkiOiA2MSwgImZsb29kIjogMzksICJmb29kIjogNjF9') USING utf8mb4), 243000, '2025-11-03 14:10:04');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38a1a9f3-a467-b160-3c94-dc20b6a8f274', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDEwLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA1LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4), 481000, '2026-03-03 09:26:00');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38a1a9f3-a467-b160-3c94-dc20b6a8f274', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuOX0=') USING utf8mb4), 443000, '2025-10-29 12:22:25');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38a1a9f3-a467-b160-3c94-dc20b6a8f274', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuN30=') USING utf8mb4), 369000, '2026-04-27 12:56:30');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38a1a9f3-a467-b160-3c94-dc20b6a8f274', 'klima', 99, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2Ljk3LCAiZmluYWxfZmxvb2RlZF9wY3QiOiA0OSwgImZpbmFsX2J1ZGdldCI6IDExMCwgImZpbmFsX2NvMiI6IDQ1NCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4), 182000, '2026-03-21 10:39:59');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38a1a9f3-a467-b160-3c94-dc20b6a8f274', 'klima', 99, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE3LjAzLCAiZmluYWxfZmxvb2RlZF9wY3QiOiA1MSwgImZpbmFsX2J1ZGdldCI6IDkwLCAiZmluYWxfY28yIjogNDU2LCAiZmluYWxfcG9wdWxhdGlvbiI6IDI1MH0=') USING utf8mb4), 234000, '2026-05-10 08:50:50');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38a1a9f3-a467-b160-3c94-dc20b6a8f274', 'klima', 99, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE1Ljk4LCAiZmluYWxfZmxvb2RlZF9wY3QiOiAxNiwgImZpbmFsX2J1ZGdldCI6IDQ0MCwgImZpbmFsX2NvMiI6IDQwNCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4), 464000, '2026-02-18 09:54:18');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38a1a9f3-a467-b160-3c94-dc20b6a8f274', 'tourismustal', 99, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiAzLCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA1NywgIm5hdHVyZSI6IDU3LCAibW9uZXkiOiAxMDB9') USING utf8mb4), 133000, '2026-03-08 11:07:14');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38a1a9f3-a467-b160-3c94-dc20b6a8f274', 'tourismustal', 99, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA2MywgIm5hdHVyZSI6IDYzLCAibW9uZXkiOiAxMDB9') USING utf8mb4), 305000, '2025-12-07 09:52:36');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38a1a9f3-a467-b160-3c94-dc20b6a8f274', 'tourismusregion', 99, CONVERT(FROM_BASE64('eyJzY29yZSI6IDYxfQ==') USING utf8mb4), 143000, '2025-11-27 13:58:07');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('38a1a9f3-a467-b160-3c94-dc20b6a8f274', 'tourismusregion', 99, CONVERT(FROM_BASE64('eyJzY29yZSI6IDc5fQ==') USING utf8mb4), 336000, '2026-03-22 14:19:56');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'heli', 99, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA1LCAicGxhblBjdCI6IDk2LCAic3RhcnRTY29yZSI6IDUsICJsYW5kaW5nU2NvcmUiOiA1fQ==') USING utf8mb4), 212000, '2025-10-17 12:01:13');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'heli', 99, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAyLCAicGxhblBjdCI6IDQ2LCAic3RhcnRTY29yZSI6IDIsICJsYW5kaW5nU2NvcmUiOiAyfQ==') USING utf8mb4), 253000, '2026-06-11 09:24:36');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'heli', 99, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA1LCAicGxhblBjdCI6IDkzLCAic3RhcnRTY29yZSI6IDUsICJsYW5kaW5nU2NvcmUiOiA1fQ==') USING utf8mb4), 201000, '2026-02-18 09:25:01');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'busfahrt', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA2LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNiwgImF2Z1RhcEttIjogNzl9') USING utf8mb4), 443000, '2026-06-05 10:58:01');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'busfahrt', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA2LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNiwgImF2Z1RhcEttIjogNzR9') USING utf8mb4), 319000, '2026-06-13 14:58:21');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), 99000, '2025-11-12 15:47:13');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogOSwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), 480000, '2025-12-01 09:29:10');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'logistik', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA3LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNjgwfQ==') USING utf8mb4), 210000, '2026-05-17 14:14:57');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'logistik', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA4LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogODQwfQ==') USING utf8mb4), 329000, '2026-02-02 11:41:54');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'tourismusregion', 99, CONVERT(FROM_BASE64('eyJzY29yZSI6IDY1fQ==') USING utf8mb4), 293000, '2026-02-09 12:19:51');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'weltkueche', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJjb21wbGV0ZWREaXNoZXMiOiA3LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogNX0=') USING utf8mb4), 94000, '2026-06-06 13:34:39');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'weltkueche', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJjb21wbGV0ZWREaXNoZXMiOiA4LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogM30=') USING utf8mb4), 107000, '2026-01-17 08:27:15');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA2LCAiY29ycmVjdF9maXJzdF90cnkiOiA2LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDEuMH0=') USING utf8mb4), 243000, '2025-12-28 11:59:26');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA0LCAiY29ycmVjdF9maXJzdF90cnkiOiA0LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDMuNH0=') USING utf8mb4), 441000, '2026-04-27 12:50:31');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'tourismustal', 99, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA2LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA5MywgIm5hdHVyZSI6IDkzLCAibW9uZXkiOiAxMDB9') USING utf8mb4), 177000, '2025-12-24 09:52:51');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'tourismustal', 99, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA1LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA5MCwgIm5hdHVyZSI6IDkwLCAibW9uZXkiOiAxMDB9') USING utf8mb4), 482000, '2025-12-08 13:37:29');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDEwLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA1LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4), 108000, '2026-05-11 12:23:03');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJibG9ja3NCYWxhbmNlZCI6IDEyLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA2LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4), 167000, '2026-02-20 11:20:23');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'sonnensystem', 99, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxOCwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IHRydWV9') USING utf8mb4), 177000, '2026-05-10 15:02:01');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'sonnensystem', 99, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAyMCwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IHRydWV9') USING utf8mb4), 243000, '2026-04-17 11:44:02');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'fluss', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA4NiwgImVjb25vbXkiOiA4NiwgImZsb29kIjogMTQsICJmb29kIjogODZ9') USING utf8mb4), 419000, '2026-05-05 13:29:31');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'fluss', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJiaW9kaXYiOiA1NiwgImVjb25vbXkiOiA1NiwgImZsb29kIjogNDQsICJmb29kIjogNTZ9') USING utf8mb4), 357000, '2025-12-19 15:50:17');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('bb4ca790-3022-c4ad-37ae-12e09eda567b', 'farmer', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDg1LCAieWVhciI6IDEzLCAiY3JvcHNfdXNlZCI6IDV9') USING utf8mb4), 283000, '2026-01-06 09:03:10');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('66f79a67-0255-e4fb-9847-9985092ba96c', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJibG9ja3NCYWxhbmNlZCI6IDUsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDIsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), 460000, '2026-06-04 13:55:05');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('66f79a67-0255-e4fb-9847-9985092ba96c', 'tourismustal', 99, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiAzLCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA1NywgIm5hdHVyZSI6IDU3LCAibW9uZXkiOiAxMDB9') USING utf8mb4), 437000, '2026-02-26 12:29:58');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('66f79a67-0255-e4fb-9847-9985092ba96c', 'tourismustal', 99, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiAzLCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA0NCwgIm5hdHVyZSI6IDQ0LCAibW9uZXkiOiAxMDB9') USING utf8mb4), 359000, '2026-02-08 11:27:23');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('66f79a67-0255-e4fb-9847-9985092ba96c', 'heli', 99, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAzLCAicGxhblBjdCI6IDU4LCAic3RhcnRTY29yZSI6IDMsICJsYW5kaW5nU2NvcmUiOiAzfQ==') USING utf8mb4), 319000, '2025-10-15 13:03:50');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('66f79a67-0255-e4fb-9847-9985092ba96c', 'heli', 99, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAzLCAicGxhblBjdCI6IDU4LCAic3RhcnRTY29yZSI6IDMsICJsYW5kaW5nU2NvcmUiOiAzfQ==') USING utf8mb4), 412000, '2025-10-25 09:52:23');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('66f79a67-0255-e4fb-9847-9985092ba96c', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNSwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4), 354000, '2026-01-17 10:06:48');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('66f79a67-0255-e4fb-9847-9985092ba96c', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNiwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4), 336000, '2026-01-28 11:54:00');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('66f79a67-0255-e4fb-9847-9985092ba96c', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNiwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4), 215000, '2026-03-16 14:25:42');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('66f79a67-0255-e4fb-9847-9985092ba96c', 'fluss', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJiaW9kaXYiOiA1NSwgImVjb25vbXkiOiA1NSwgImZsb29kIjogNDUsICJmb29kIjogNTV9') USING utf8mb4), 498000, '2025-11-12 11:31:58');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('66f79a67-0255-e4fb-9847-9985092ba96c', 'weltkueche', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJjb21wbGV0ZWREaXNoZXMiOiA4LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogM30=') USING utf8mb4), 236000, '2026-05-05 15:19:19');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('66f79a67-0255-e4fb-9847-9985092ba96c', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAyLCAiY29ycmVjdF9maXJzdF90cnkiOiAyLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDYuNn0=') USING utf8mb4), 90000, '2025-10-22 08:23:29');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('66f79a67-0255-e4fb-9847-9985092ba96c', 'busfahrt', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJ3b25PcmRlcnMiOiA0LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNCwgImF2Z1RhcEttIjogMTE1fQ==') USING utf8mb4), 107000, '2026-03-25 08:43:46');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('66f79a67-0255-e4fb-9847-9985092ba96c', 'sonnensystem', 99, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxNSwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4), 269000, '2026-04-17 11:32:27');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('66f79a67-0255-e4fb-9847-9985092ba96c', 'sonnensystem', 99, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiA5LCAidG90YWwiOiAyMCwgImZpcnN0VHJ5IjogZmFsc2V9') USING utf8mb4), 431000, '2026-05-15 09:20:17');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('66f79a67-0255-e4fb-9847-9985092ba96c', 'sonnensystem', 99, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxNSwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4), 339000, '2026-01-27 12:39:06');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('66f79a67-0255-e4fb-9847-9985092ba96c', 'klima', 99, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjYxLCAiZmluYWxfZmxvb2RlZF9wY3QiOiAzNywgImZpbmFsX2J1ZGdldCI6IDIzMCwgImZpbmFsX2NvMiI6IDQzNiwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4), 234000, '2026-02-09 15:10:04');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('66f79a67-0255-e4fb-9847-9985092ba96c', 'klima', 99, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2Ljc2LCAiZmluYWxfZmxvb2RlZF9wY3QiOiA0MiwgImZpbmFsX2J1ZGdldCI6IDE4MCwgImZpbmFsX2NvMiI6IDQ0MywgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4), 209000, '2026-05-08 08:05:56');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('66f79a67-0255-e4fb-9847-9985092ba96c', 'klima', 99, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjUyLCAiZmluYWxfZmxvb2RlZF9wY3QiOiAzNCwgImZpbmFsX2J1ZGdldCI6IDI2MCwgImZpbmFsX2NvMiI6IDQzMSwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4), 333000, '2026-02-03 12:16:25');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('db225fef-afde-88a4-b94f-6fc2f84ad151', 'tourismustal', 99, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiAyLCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA0MCwgIm5hdHVyZSI6IDQwLCAibW9uZXkiOiAxMDB9') USING utf8mb4), 208000, '2025-10-06 13:02:41');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('db225fef-afde-88a4-b94f-6fc2f84ad151', 'tourismusregion', 99, CONVERT(FROM_BASE64('eyJzY29yZSI6IDQzfQ==') USING utf8mb4), 290000, '2026-06-14 08:58:56');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('db225fef-afde-88a4-b94f-6fc2f84ad151', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA0LCAiY29ycmVjdF9maXJzdF90cnkiOiA0LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDQuM30=') USING utf8mb4), 141000, '2026-02-22 10:30:04');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('db225fef-afde-88a4-b94f-6fc2f84ad151', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAyLCAiY29ycmVjdF9maXJzdF90cnkiOiAyLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDYuN30=') USING utf8mb4), 122000, '2026-05-01 13:23:48');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('db225fef-afde-88a4-b94f-6fc2f84ad151', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNiwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4), 457000, '2026-03-24 15:04:37');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('db225fef-afde-88a4-b94f-6fc2f84ad151', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4), 187000, '2026-02-06 12:50:49');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('db225fef-afde-88a4-b94f-6fc2f84ad151', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNSwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4), 368000, '2026-05-17 12:42:32');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('db225fef-afde-88a4-b94f-6fc2f84ad151', 'heli', 99, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAyLCAicGxhblBjdCI6IDQ5LCAic3RhcnRTY29yZSI6IDIsICJsYW5kaW5nU2NvcmUiOiAyfQ==') USING utf8mb4), 159000, '2025-12-07 11:00:23');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('db225fef-afde-88a4-b94f-6fc2f84ad151', 'heli', 99, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAzLCAicGxhblBjdCI6IDYyLCAic3RhcnRTY29yZSI6IDMsICJsYW5kaW5nU2NvcmUiOiAzfQ==') USING utf8mb4), 207000, '2025-11-24 10:44:36');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('db225fef-afde-88a4-b94f-6fc2f84ad151', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDEwLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA1LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4), 465000, '2025-12-01 10:46:13');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('db225fef-afde-88a4-b94f-6fc2f84ad151', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJibG9ja3NCYWxhbmNlZCI6IDYsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDMsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), 286000, '2026-04-09 14:47:00');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('db225fef-afde-88a4-b94f-6fc2f84ad151', 'logistik', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJvcmRlcnNEZWxpdmVyZWQiOiA3LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNTIwfQ==') USING utf8mb4), 128000, '2025-10-05 14:30:06');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('db225fef-afde-88a4-b94f-6fc2f84ad151', 'weltkueche', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJjb21wbGV0ZWREaXNoZXMiOiAzLCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogMTF9') USING utf8mb4), 481000, '2025-10-23 13:29:42');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('0707c56d-bce7-a86f-088d-266366d259c5', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuNX0=') USING utf8mb4), 244000, '2026-04-20 14:56:27');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('0707c56d-bce7-a86f-088d-266366d259c5', 'sonnensystem', 99, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxMSwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4), 451000, '2025-10-01 12:27:59');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('0707c56d-bce7-a86f-088d-266366d259c5', 'sonnensystem', 99, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxMywgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4), 296000, '2026-01-28 15:42:30');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('0707c56d-bce7-a86f-088d-266366d259c5', 'logistik', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA4LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNzYwfQ==') USING utf8mb4), 518000, '2025-10-28 13:20:41');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('0707c56d-bce7-a86f-088d-266366d259c5', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogOCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), 373000, '2026-05-25 13:35:56');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('0707c56d-bce7-a86f-088d-266366d259c5', 'farmer', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJoaXRfcmF0ZSI6IDY1LCAieWVhciI6IDEwLCAiY3JvcHNfdXNlZCI6IDR9') USING utf8mb4), 368000, '2026-01-22 12:38:05');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('0707c56d-bce7-a86f-088d-266366d259c5', 'farmer', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDczLCAieWVhciI6IDExLCAiY3JvcHNfdXNlZCI6IDR9') USING utf8mb4), 254000, '2026-05-12 10:09:26');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('0707c56d-bce7-a86f-088d-266366d259c5', 'weltkueche', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJjb21wbGV0ZWREaXNoZXMiOiA4LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogM30=') USING utf8mb4), 399000, '2026-04-02 13:20:46');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('0707c56d-bce7-a86f-088d-266366d259c5', 'busfahrt', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA3LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNywgImF2Z1RhcEttIjogNTd9') USING utf8mb4), 491000, '2026-05-24 08:40:55');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('0707c56d-bce7-a86f-088d-266366d259c5', 'heli', 99, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDg2LCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4), 511000, '2026-02-19 09:07:35');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('0707c56d-bce7-a86f-088d-266366d259c5', 'heli', 99, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDgxLCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4), 311000, '2026-03-30 12:56:40');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('0707c56d-bce7-a86f-088d-266366d259c5', 'heli', 99, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDgwLCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4), 244000, '2026-03-15 11:06:47');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('0707c56d-bce7-a86f-088d-266366d259c5', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDksICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDQsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), 328000, '2025-12-02 13:03:56');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('0707c56d-bce7-a86f-088d-266366d259c5', 'tourismustal', 99, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA1LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA3OCwgIm5hdHVyZSI6IDc4LCAibW9uZXkiOiAxMDB9') USING utf8mb4), 351000, '2025-11-26 08:33:14');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('0707c56d-bce7-a86f-088d-266366d259c5', 'tourismusregion', 99, CONVERT(FROM_BASE64('eyJzY29yZSI6IDcxfQ==') USING utf8mb4), 165000, '2026-05-26 15:50:26');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('0707c56d-bce7-a86f-088d-266366d259c5', 'klima', 99, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjcsICJmaW5hbF9mbG9vZGVkX3BjdCI6IDQwLCAiZmluYWxfYnVkZ2V0IjogMjAwLCAiZmluYWxfY28yIjogNDQwLCAiZmluYWxfcG9wdWxhdGlvbiI6IDI1MH0=') USING utf8mb4), 452000, '2026-04-10 09:27:04');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('43120340-23ec-a239-ac67-2c5f42989333', 'heli', 99, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAxLCAicGxhblBjdCI6IDI2LCAic3RhcnRTY29yZSI6IDEsICJsYW5kaW5nU2NvcmUiOiAxfQ==') USING utf8mb4), 459000, '2025-12-05 08:33:11');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('43120340-23ec-a239-ac67-2c5f42989333', 'heli', 99, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAyLCAicGxhblBjdCI6IDM4LCAic3RhcnRTY29yZSI6IDIsICJsYW5kaW5nU2NvcmUiOiAyfQ==') USING utf8mb4), 342000, '2026-04-14 12:39:23');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('43120340-23ec-a239-ac67-2c5f42989333', 'logistik', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJvcmRlcnNEZWxpdmVyZWQiOiA1LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogMTYwfQ==') USING utf8mb4), 113000, '2026-05-24 10:28:58');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('43120340-23ec-a239-ac67-2c5f42989333', 'tourismustal', 99, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiAyLCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA0MSwgIm5hdHVyZSI6IDQxLCAibW9uZXkiOiAxMDB9') USING utf8mb4), 400000, '2025-10-14 15:55:31');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('43120340-23ec-a239-ac67-2c5f42989333', 'fluss', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJiaW9kaXYiOiA0NywgImVjb25vbXkiOiA0NywgImZsb29kIjogNTMsICJmb29kIjogNDd9') USING utf8mb4), 438000, '2026-04-09 08:06:55');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('43120340-23ec-a239-ac67-2c5f42989333', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAyLCAiY29ycmVjdF9maXJzdF90cnkiOiAyLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDYuNX0=') USING utf8mb4), 475000, '2026-04-23 11:20:30');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('43120340-23ec-a239-ac67-2c5f42989333', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAyLCAiY29ycmVjdF9maXJzdF90cnkiOiAyLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDYuN30=') USING utf8mb4), 455000, '2025-12-30 08:47:11');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('43120340-23ec-a239-ac67-2c5f42989333', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogMywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4), 457000, '2025-12-14 13:31:36');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('43120340-23ec-a239-ac67-2c5f42989333', 'eu-werkstatt', 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNiwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4), 189000, '2026-05-15 09:59:35');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('43120340-23ec-a239-ac67-2c5f42989333', 'tourismusregion', 99, CONVERT(FROM_BASE64('eyJzY29yZSI6IDE3fQ==') USING utf8mb4), 354000, '2026-04-06 10:50:50');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('43120340-23ec-a239-ac67-2c5f42989333', 'tourismusregion', 99, CONVERT(FROM_BASE64('eyJzY29yZSI6IDQxfQ==') USING utf8mb4), 296000, '2025-10-28 09:14:48');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('43120340-23ec-a239-ac67-2c5f42989333', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJibG9ja3NCYWxhbmNlZCI6IDMsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDIsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), 101000, '2026-05-26 10:28:46');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('43120340-23ec-a239-ac67-2c5f42989333', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJibG9ja3NCYWxhbmNlZCI6IDQsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDIsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), 185000, '2025-10-04 09:47:11');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuM30=') USING utf8mb4), 279000, '2025-10-06 14:32:17');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuMn0=') USING utf8mb4), 158000, '2025-12-02 09:40:19');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 'kofferdetektiv', 99, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDMuMH0=') USING utf8mb4), 112000, '2025-10-01 10:05:57');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 'klima', 99, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE1LjkyLCAiZmluYWxfZmxvb2RlZF9wY3QiOiAxNCwgImZpbmFsX2J1ZGdldCI6IDQ2MCwgImZpbmFsX2NvMiI6IDQwMSwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4), 211000, '2026-03-11 10:12:43');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 'klima', 99, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjI1LCAiZmluYWxfZmxvb2RlZF9wY3QiOiAyNSwgImZpbmFsX2J1ZGdldCI6IDM1MCwgImZpbmFsX2NvMiI6IDQxOCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4), 345000, '2025-12-01 11:49:46');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 'tourismusregion', 99, CONVERT(FROM_BASE64('eyJzY29yZSI6IDk3fQ==') USING utf8mb4), 495000, '2026-05-09 12:49:43');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 'heli', 99, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA1LCAicGxhblBjdCI6IDkyLCAic3RhcnRTY29yZSI6IDUsICJsYW5kaW5nU2NvcmUiOiA1fQ==') USING utf8mb4), 328000, '2025-11-02 15:53:39');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 'heli', 99, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDg4LCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4), 176000, '2025-11-14 10:38:01');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 'sonnensystem', 99, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxNSwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4), 97000, '2026-04-29 09:21:25');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJibG9ja3NCYWxhbmNlZCI6IDExLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA2LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4), 151000, '2025-11-16 08:49:42');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJibG9ja3NCYWxhbmNlZCI6IDExLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA2LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4), 236000, '2026-05-18 15:27:57');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 'energiemanager', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJibG9ja3NCYWxhbmNlZCI6IDgsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDQsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), 170000, '2026-03-09 14:45:49');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 'tourismustal', 99, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA2LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiAxMDAsICJuYXR1cmUiOiAxMDAsICJtb25leSI6IDEwMH0=') USING utf8mb4), 343000, '2026-03-23 09:50:20');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 'tourismustal', 99, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA3MSwgIm5hdHVyZSI6IDcxLCAibW9uZXkiOiAxMDB9') USING utf8mb4), 455000, '2025-10-25 14:07:28');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 'weltkueche', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJjb21wbGV0ZWREaXNoZXMiOiAxMCwgInRvdGFsRGlzaGVzIjogMTAsICJtaXN0YWtlc0luRGlzaCI6IDB9') USING utf8mb4), 327000, '2026-01-15 13:22:05');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 'weltkueche', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJjb21wbGV0ZWREaXNoZXMiOiAxMCwgInRvdGFsRGlzaGVzIjogMTAsICJtaXN0YWtlc0luRGlzaCI6IDB9') USING utf8mb4), 433000, '2026-02-07 11:01:50');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 'logistik', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJvcmRlcnNEZWxpdmVyZWQiOiAxMCwgInRvdGFsT3JkZXJzIjogMTAsICJvcmRlcnNMYXRlIjogMCwgImZpbmFsQmFsYW5jZSI6IDEyMDB9') USING utf8mb4), 374000, '2026-04-30 08:50:08');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 'logistik', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA4LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogODgwfQ==') USING utf8mb4), 481000, '2026-05-22 11:01:20');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 'busfahrt', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA3LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNywgImF2Z1RhcEttIjogNTd9') USING utf8mb4), 145000, '2026-06-08 12:37:03');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('ed4f3fad-c701-4d7f-891f-648c143b80d8', 'busfahrt', 99, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA3LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNywgImF2Z1RhcEttIjogNTJ9') USING utf8mb4), 272000, '2026-04-23 14:57:34');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 99, 'tourismustal', 76, 112, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA1LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA3NiwgIm5hdHVyZSI6IDc2LCAibW9uZXkiOiAxMDB9') USING utf8mb4), '2026-01-12 15:11:42');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 99, 'energiemanager', 89, 445, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDExLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA1LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4), '2025-11-12 13:56:50');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 99, 'energiemanager', 81, 364, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDEwLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA1LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4), '2026-06-02 10:27:53');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 75, 238, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogOCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), '2026-06-15 08:28:18');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 62, 376, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNiwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), '2025-11-01 09:35:08');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 74, 210, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), '2026-03-26 09:23:18');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 99, 'busfahrt', 76, 301, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA2LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNiwgImF2Z1RhcEttIjogNzF9') USING utf8mb4), '2025-10-28 15:47:16');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 99, 'tourismusregion', 90, 502, CONVERT(FROM_BASE64('eyJzY29yZSI6IDkwfQ==') USING utf8mb4), '2025-12-07 11:15:43');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 99, 'tourismusregion', 82, 504, CONVERT(FROM_BASE64('eyJzY29yZSI6IDgyfQ==') USING utf8mb4), '2026-01-31 13:07:48');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 99, 'weltkueche', 62, 183, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJjb21wbGV0ZWREaXNoZXMiOiA2LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogNn0=') USING utf8mb4), '2026-06-08 10:58:57');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 99, 'fluss', 95, 470, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJiaW9kaXYiOiA5NSwgImVjb25vbXkiOiA5NSwgImZsb29kIjogNSwgImZvb2QiOiA5NX0=') USING utf8mb4), '2026-04-04 12:19:11');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 99, 'heli', 64, 385, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAzLCAicGxhblBjdCI6IDY0LCAic3RhcnRTY29yZSI6IDMsICJsYW5kaW5nU2NvcmUiOiAzfQ==') USING utf8mb4), '2026-02-22 12:27:26');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 99, 'sonnensystem', 82, 319, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxNiwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4), '2026-05-20 11:30:36');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 99, 'sonnensystem', 58, 514, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxMiwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4), '2026-04-15 08:17:01');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 99, 'logistik', 92, 481, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJvcmRlcnNEZWxpdmVyZWQiOiA5LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogMTA0MH0=') USING utf8mb4), '2026-03-28 12:46:14');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 79, 105, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuOX0=') USING utf8mb4), '2026-04-25 11:40:43');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 99, 'heli', 60, 297, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAzLCAicGxhblBjdCI6IDYwLCAic3RhcnRTY29yZSI6IDMsICJsYW5kaW5nU2NvcmUiOiAzfQ==') USING utf8mb4), '2025-12-31 13:21:13');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 99, 'farmer', 47, 424, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJoaXRfcmF0ZSI6IDQ3LCAieWVhciI6IDcsICJjcm9wc191c2VkIjogM30=') USING utf8mb4), '2025-10-04 15:26:14');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 99, 'energiemanager', 56, 185, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJibG9ja3NCYWxhbmNlZCI6IDcsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDMsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), '2026-02-11 10:16:03');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 99, 'energiemanager', 71, 113, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDksICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDQsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), '2026-01-24 12:00:13');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 99, 'busfahrt', 66, 251, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJ3b25PcmRlcnMiOiA1LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNSwgImF2Z1RhcEttIjogODh9') USING utf8mb4), '2026-01-20 09:02:15');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 99, 'busfahrt', 62, 113, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJ3b25PcmRlcnMiOiA1LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNSwgImF2Z1RhcEttIjogOTV9') USING utf8mb4), '2026-05-28 13:38:18');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 99, 'busfahrt', 64, 100, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJ3b25PcmRlcnMiOiA1LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNSwgImF2Z1RhcEttIjogOTF9') USING utf8mb4), '2026-01-17 09:19:37');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 99, 'fluss', 50, 173, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJiaW9kaXYiOiA1MCwgImVjb25vbXkiOiA1MCwgImZsb29kIjogNTAsICJmb29kIjogNTB9') USING utf8mb4), '2025-11-08 13:24:07');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 99, 'fluss', 54, 311, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJiaW9kaXYiOiA1NCwgImVjb25vbXkiOiA1NCwgImZsb29kIjogNDYsICJmb29kIjogNTR9') USING utf8mb4), '2026-01-08 11:45:46');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 99, 'weltkueche', 63, 453, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJjb21wbGV0ZWREaXNoZXMiOiA2LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogNn0=') USING utf8mb4), '2025-10-02 15:23:09');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 99, 'tourismusregion', 56, 173, CONVERT(FROM_BASE64('eyJzY29yZSI6IDU2fQ==') USING utf8mb4), '2026-02-23 09:56:57');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 99, 'tourismusregion', 47, 365, CONVERT(FROM_BASE64('eyJzY29yZSI6IDQ3fQ==') USING utf8mb4), '2025-11-07 09:28:37');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 99, 'tourismusregion', 74, 353, CONVERT(FROM_BASE64('eyJzY29yZSI6IDc0fQ==') USING utf8mb4), '2026-01-01 09:37:19');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 99, 'logistik', 47, 491, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJvcmRlcnNEZWxpdmVyZWQiOiA1LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogMTQwfQ==') USING utf8mb4), '2025-10-09 13:55:28');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 67, 465, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), '2025-12-07 10:33:05');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 73, 502, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), '2026-04-22 09:06:23');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 100, 140, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA2LCAiY29ycmVjdF9maXJzdF90cnkiOiA2LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDEuMH0=') USING utf8mb4), '2026-06-09 08:24:46');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 92, 438, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA2LCAiY29ycmVjdF9maXJzdF90cnkiOiA2LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDEuN30=') USING utf8mb4), '2025-10-16 12:33:42');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 100, 495, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA2LCAiY29ycmVjdF9maXJzdF90cnkiOiA2LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDEuMH0=') USING utf8mb4), '2025-10-20 08:43:37');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'tourismusregion', 89, 425, CONVERT(FROM_BASE64('eyJzY29yZSI6IDg5fQ==') USING utf8mb4), '2025-10-24 11:36:36');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'tourismusregion', 93, 275, CONVERT(FROM_BASE64('eyJzY29yZSI6IDkzfQ==') USING utf8mb4), '2026-04-24 13:39:14');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'tourismustal', 100, 282, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA2LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiAxMDAsICJuYXR1cmUiOiAxMDAsICJtb25leSI6IDEwMH0=') USING utf8mb4), '2025-10-26 15:35:38');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'tourismustal', 100, 231, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA2LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiAxMDAsICJuYXR1cmUiOiAxMDAsICJtb25leSI6IDEwMH0=') USING utf8mb4), '2025-10-15 15:43:00');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'sonnensystem', 100, 322, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAyMCwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IHRydWV9') USING utf8mb4), '2026-01-26 13:12:55');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'farmer', 100, 355, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJoaXRfcmF0ZSI6IDEwMCwgInllYXIiOiAxNSwgImNyb3BzX3VzZWQiOiA2fQ==') USING utf8mb4), '2026-04-18 14:15:43');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'farmer', 89, 479, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDg5LCAieWVhciI6IDEzLCAiY3JvcHNfdXNlZCI6IDV9') USING utf8mb4), '2025-11-11 11:42:17');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'farmer', 100, 146, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJoaXRfcmF0ZSI6IDEwMCwgInllYXIiOiAxNSwgImNyb3BzX3VzZWQiOiA2fQ==') USING utf8mb4), '2025-12-28 13:06:54');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'weltkueche', 93, 397, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJjb21wbGV0ZWREaXNoZXMiOiA5LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogMX0=') USING utf8mb4), '2026-04-06 11:03:48');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'heli', 96, 434, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA1LCAicGxhblBjdCI6IDk2LCAic3RhcnRTY29yZSI6IDUsICJsYW5kaW5nU2NvcmUiOiA1fQ==') USING utf8mb4), '2026-02-22 08:57:12');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'energiemanager', 83, 265, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDEwLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA1LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4), '2025-10-26 11:34:22');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'energiemanager', 96, 489, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJibG9ja3NCYWxhbmNlZCI6IDEyLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA2LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4), '2026-01-10 11:13:42');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 97, 434, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogMTAsICJ0b3RhbEF0dGVtcHRzIjogMTIsICJtdWVsbGVpbWVyQ291bnQiOiAwfQ==') USING utf8mb4), '2025-11-14 15:51:03');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 83, 197, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogOCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), '2026-03-07 13:17:31');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'klima', 100, 160, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE1LjUsICJmaW5hbF9mbG9vZGVkX3BjdCI6IDAsICJmaW5hbF9idWRnZXQiOiA2MDAsICJmaW5hbF9jbzIiOiAzODAsICJmaW5hbF9wb3B1bGF0aW9uIjogMjUwfQ==') USING utf8mb4), '2026-02-07 14:12:10');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'fluss', 84, 351, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA4NCwgImVjb25vbXkiOiA4NCwgImZsb29kIjogMTYsICJmb29kIjogODR9') USING utf8mb4), '2025-12-13 09:08:33');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'logistik', 95, 139, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJvcmRlcnNEZWxpdmVyZWQiOiAxMCwgInRvdGFsT3JkZXJzIjogMTAsICJvcmRlcnNMYXRlIjogMCwgImZpbmFsQmFsYW5jZSI6IDExMDB9') USING utf8mb4), '2025-11-23 12:07:11');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1), 99, 'logistik', 99, 143, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJvcmRlcnNEZWxpdmVyZWQiOiAxMCwgInRvdGFsT3JkZXJzIjogMTAsICJvcmRlcnNMYXRlIjogMCwgImZpbmFsQmFsYW5jZSI6IDExODB9') USING utf8mb4), '2026-03-08 15:41:22');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 99, 'farmer', 89, 271, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDg5LCAieWVhciI6IDEzLCAiY3JvcHNfdXNlZCI6IDV9') USING utf8mb4), '2026-03-22 12:42:08');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 99, 'farmer', 90, 391, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDkwLCAieWVhciI6IDE0LCAiY3JvcHNfdXNlZCI6IDV9') USING utf8mb4), '2026-06-11 13:44:38');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 99, 'farmer', 82, 207, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDgyLCAieWVhciI6IDEyLCAiY3JvcHNfdXNlZCI6IDV9') USING utf8mb4), '2026-01-11 09:00:05');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 99, 'tourismusregion', 89, 185, CONVERT(FROM_BASE64('eyJzY29yZSI6IDg5fQ==') USING utf8mb4), '2025-10-04 09:29:17');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 99, 'fluss', 87, 446, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA4NywgImVjb25vbXkiOiA4NywgImZsb29kIjogMTMsICJmb29kIjogODd9') USING utf8mb4), '2026-05-25 15:16:42');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 99, 'fluss', 75, 344, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA3NSwgImVjb25vbXkiOiA3NSwgImZsb29kIjogMjUsICJmb29kIjogNzV9') USING utf8mb4), '2025-12-30 11:17:25');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 99, 'logistik', 92, 516, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJvcmRlcnNEZWxpdmVyZWQiOiA5LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogMTA0MH0=') USING utf8mb4), '2026-02-06 12:47:48');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 99, 'logistik', 88, 468, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA5LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogOTYwfQ==') USING utf8mb4), '2026-01-07 10:07:53');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 86, 376, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogOSwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), '2026-04-09 15:11:45');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 83, 463, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuNX0=') USING utf8mb4), '2026-05-24 10:56:40');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 91, 454, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDEuOH0=') USING utf8mb4), '2026-02-17 15:19:11');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 99, 'sonnensystem', 87, 244, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxNywgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IHRydWV9') USING utf8mb4), '2025-12-04 15:23:14');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 99, 'heli', 86, 148, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDg2LCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4), '2026-01-14 10:27:50');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 99, 'tourismustal', 73, 447, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA3MywgIm5hdHVyZSI6IDczLCAibW9uZXkiOiAxMDB9') USING utf8mb4), '2025-10-04 10:30:38');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 99, 'busfahrt', 95, 398, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJ3b25PcmRlcnMiOiA4LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogOCwgImF2Z1RhcEttIjogMzh9') USING utf8mb4), '2026-04-26 09:47:15');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1), 99, 'busfahrt', 75, 364, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA2LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNiwgImF2Z1RhcEttIjogNzJ9') USING utf8mb4), '2026-05-16 14:01:11');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 44, 510, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAzLCAiY29ycmVjdF9maXJzdF90cnkiOiAzLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDYuMH0=') USING utf8mb4), '2025-10-20 15:00:36');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 41, 414, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAyLCAiY29ycmVjdF9maXJzdF90cnkiOiAyLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDYuM30=') USING utf8mb4), '2025-12-03 08:09:04');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1), 99, 'fluss', 42, 140, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJiaW9kaXYiOiA0MiwgImVjb25vbXkiOiA0MiwgImZsb29kIjogNTgsICJmb29kIjogNDJ9') USING utf8mb4), '2026-04-05 14:10:01');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1), 99, 'energiemanager', 38, 430, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJibG9ja3NCYWxhbmNlZCI6IDUsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDIsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), '2026-01-01 12:59:31');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1), 99, 'tourismusregion', 55, 430, CONVERT(FROM_BASE64('eyJzY29yZSI6IDU1fQ==') USING utf8mb4), '2025-10-01 14:50:55');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1), 99, 'busfahrt', 25, 439, CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJ3b25PcmRlcnMiOiAyLCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogMiwgImF2Z1RhcEttIjogMTU4fQ==') USING utf8mb4), '2026-05-17 09:31:53');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1), 99, 'busfahrt', 25, 222, CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJ3b25PcmRlcnMiOiAyLCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogMiwgImF2Z1RhcEttIjogMTU4fQ==') USING utf8mb4), '2026-01-23 15:06:07');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1), 99, 'busfahrt', 33, 202, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJ3b25PcmRlcnMiOiAzLCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogMywgImF2Z1RhcEttIjogMTQ0fQ==') USING utf8mb4), '2026-04-30 09:15:09');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1), 99, 'tourismustal', 61, 92, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA2MSwgIm5hdHVyZSI6IDYxLCAibW9uZXkiOiAxMDB9') USING utf8mb4), '2026-06-14 14:55:58');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1), 99, 'logistik', 52, 103, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJvcmRlcnNEZWxpdmVyZWQiOiA1LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogMjQwfQ==') USING utf8mb4), '2026-01-15 12:14:13');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 99, 'fluss', 93, 126, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJiaW9kaXYiOiA5MywgImVjb25vbXkiOiA5MywgImZsb29kIjogNywgImZvb2QiOiA5M30=') USING utf8mb4), '2026-01-03 10:24:07');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 99, 'fluss', 84, 103, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA4NCwgImVjb25vbXkiOiA4NCwgImZsb29kIjogMTYsICJmb29kIjogODR9') USING utf8mb4), '2026-02-08 12:14:23');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 99, 'tourismustal', 74, 112, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA3NCwgIm5hdHVyZSI6IDc0LCAibW9uZXkiOiAxMDB9') USING utf8mb4), '2025-12-14 10:26:26');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 99, 'tourismustal', 59, 101, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA1OSwgIm5hdHVyZSI6IDU5LCAibW9uZXkiOiAxMDB9') USING utf8mb4), '2025-11-16 11:33:26');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 99, 'logistik', 70, 414, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA3LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNjAwfQ==') USING utf8mb4), '2026-01-16 08:54:07');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 99, 'sonnensystem', 81, 152, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxNiwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4), '2026-05-18 11:24:56');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 99, 'weltkueche', 73, 457, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJjb21wbGV0ZWREaXNoZXMiOiA3LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogNH0=') USING utf8mb4), '2025-12-22 15:28:23');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 79, 367, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogOCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), '2025-10-24 15:28:00');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 99, 'tourismusregion', 69, 231, CONVERT(FROM_BASE64('eyJzY29yZSI6IDY5fQ==') USING utf8mb4), '2026-01-25 14:55:05');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 99, 'energiemanager', 67, 418, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJibG9ja3NCYWxhbmNlZCI6IDgsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDQsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), '2026-04-13 13:34:05');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 99, 'energiemanager', 73, 98, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDksICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDQsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), '2025-11-24 09:59:51');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 99, 'klima', 67, 128, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjQ5LCAiZmluYWxfZmxvb2RlZF9wY3QiOiAzMywgImZpbmFsX2J1ZGdldCI6IDI3MCwgImZpbmFsX2NvMiI6IDQzMCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4), '2026-03-29 10:32:49');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 99, 'klima', 84, 128, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE1Ljk4LCAiZmluYWxfZmxvb2RlZF9wY3QiOiAxNiwgImZpbmFsX2J1ZGdldCI6IDQ0MCwgImZpbmFsX2NvMiI6IDQwNCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4), '2025-11-26 10:51:02');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 58, 130, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAzLCAiY29ycmVjdF9maXJzdF90cnkiOiAzLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDQuOH0=') USING utf8mb4), '2026-01-21 08:56:53');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 77, 285, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDMuMX0=') USING utf8mb4), '2025-12-21 15:26:41');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 99, 'busfahrt', 68, 221, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJ3b25PcmRlcnMiOiA1LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNSwgImF2Z1RhcEttIjogODR9') USING utf8mb4), '2026-03-05 15:48:41');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1), 99, 'busfahrt', 86, 118, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA3LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNywgImF2Z1RhcEttIjogNTR9') USING utf8mb4), '2026-04-16 15:19:36');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1), 99, 'busfahrt', 27, 113, CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJ3b25PcmRlcnMiOiAyLCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogMiwgImF2Z1RhcEttIjogMTU0fQ==') USING utf8mb4), '2026-02-11 12:25:15');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1), 99, 'sonnensystem', 31, 229, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiA2LCAidG90YWwiOiAyMCwgImZpcnN0VHJ5IjogZmFsc2V9') USING utf8mb4), '2026-02-14 13:18:51');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1), 99, 'heli', 35, 261, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAyLCAicGxhblBjdCI6IDM1LCAic3RhcnRTY29yZSI6IDIsICJsYW5kaW5nU2NvcmUiOiAyfQ==') USING utf8mb4), '2025-12-25 15:59:46');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1), 99, 'heli', 37, 362, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAyLCAicGxhblBjdCI6IDM3LCAic3RhcnRTY29yZSI6IDIsICJsYW5kaW5nU2NvcmUiOiAyfQ==') USING utf8mb4), '2026-05-18 15:46:31');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1), 99, 'logistik', 20, 181, CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJvcmRlcnNEZWxpdmVyZWQiOiAyLCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogLTUwMH0=') USING utf8mb4), '2025-12-09 09:02:25');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1), 99, 'fluss', 24, 166, CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJiaW9kaXYiOiAyNCwgImVjb25vbXkiOiAyNCwgImZsb29kIjogNzYsICJmb29kIjogMjR9') USING utf8mb4), '2026-04-21 12:51:08');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1), 99, 'weltkueche', 37, 108, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJjb21wbGV0ZWREaXNoZXMiOiA0LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogOX0=') USING utf8mb4), '2026-05-11 09:17:36');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1), 99, 'weltkueche', 40, 263, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJjb21wbGV0ZWREaXNoZXMiOiA0LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogOX0=') USING utf8mb4), '2025-11-24 09:36:17');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 54, 227, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAzLCAiY29ycmVjdF9maXJzdF90cnkiOiAzLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDUuMX0=') USING utf8mb4), '2025-10-23 08:42:48');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 99, 'weltkueche', 58, 162, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJjb21wbGV0ZWREaXNoZXMiOiA2LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogNn0=') USING utf8mb4), '2025-12-10 11:31:59');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 99, 'busfahrt', 64, 486, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJ3b25PcmRlcnMiOiA1LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNSwgImF2Z1RhcEttIjogOTF9') USING utf8mb4), '2026-01-30 13:53:37');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 99, 'busfahrt', 67, 100, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJ3b25PcmRlcnMiOiA1LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNSwgImF2Z1RhcEttIjogODZ9') USING utf8mb4), '2026-03-31 13:40:11');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 72, 303, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), '2025-12-22 10:01:48');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 63, 117, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNiwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), '2025-12-21 08:08:24');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 77, 399, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogOCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), '2025-12-18 10:08:21');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 99, 'logistik', 91, 360, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJvcmRlcnNEZWxpdmVyZWQiOiA5LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogMTAyMH0=') USING utf8mb4), '2026-06-03 11:35:08');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 99, 'fluss', 73, 214, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA3MywgImVjb25vbXkiOiA3MywgImZsb29kIjogMjcsICJmb29kIjogNzN9') USING utf8mb4), '2026-02-06 11:53:21');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 99, 'fluss', 61, 243, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJiaW9kaXYiOiA2MSwgImVjb25vbXkiOiA2MSwgImZsb29kIjogMzksICJmb29kIjogNjF9') USING utf8mb4), '2025-11-03 14:10:04');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 99, 'energiemanager', 83, 481, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDEwLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA1LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4), '2026-03-03 09:26:00');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 79, 443, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuOX0=') USING utf8mb4), '2025-10-29 12:22:25');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 81, 369, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuN30=') USING utf8mb4), '2026-04-27 12:56:30');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 99, 'klima', 51, 182, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2Ljk3LCAiZmluYWxfZmxvb2RlZF9wY3QiOiA0OSwgImZpbmFsX2J1ZGdldCI6IDExMCwgImZpbmFsX2NvMiI6IDQ1NCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4), '2026-03-21 10:39:59');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 99, 'klima', 49, 234, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE3LjAzLCAiZmluYWxfZmxvb2RlZF9wY3QiOiA1MSwgImZpbmFsX2J1ZGdldCI6IDkwLCAiZmluYWxfY28yIjogNDU2LCAiZmluYWxfcG9wdWxhdGlvbiI6IDI1MH0=') USING utf8mb4), '2026-05-10 08:50:50');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 99, 'klima', 84, 464, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE1Ljk4LCAiZmluYWxfZmxvb2RlZF9wY3QiOiAxNiwgImZpbmFsX2J1ZGdldCI6IDQ0MCwgImZpbmFsX2NvMiI6IDQwNCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4), '2026-02-18 09:54:18');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 99, 'tourismustal', 57, 133, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiAzLCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA1NywgIm5hdHVyZSI6IDU3LCAibW9uZXkiOiAxMDB9') USING utf8mb4), '2026-03-08 11:07:14');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 99, 'tourismustal', 63, 305, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA2MywgIm5hdHVyZSI6IDYzLCAibW9uZXkiOiAxMDB9') USING utf8mb4), '2025-12-07 09:52:36');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 99, 'tourismusregion', 61, 143, CONVERT(FROM_BASE64('eyJzY29yZSI6IDYxfQ==') USING utf8mb4), '2025-11-27 13:58:07');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1), 99, 'tourismusregion', 79, 336, CONVERT(FROM_BASE64('eyJzY29yZSI6IDc5fQ==') USING utf8mb4), '2026-03-22 14:19:56');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'heli', 96, 212, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA1LCAicGxhblBjdCI6IDk2LCAic3RhcnRTY29yZSI6IDUsICJsYW5kaW5nU2NvcmUiOiA1fQ==') USING utf8mb4), '2025-10-17 12:01:13');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'heli', 46, 253, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAyLCAicGxhblBjdCI6IDQ2LCAic3RhcnRTY29yZSI6IDIsICJsYW5kaW5nU2NvcmUiOiAyfQ==') USING utf8mb4), '2026-06-11 09:24:36');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'heli', 93, 201, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA1LCAicGxhblBjdCI6IDkzLCAic3RhcnRTY29yZSI6IDUsICJsYW5kaW5nU2NvcmUiOiA1fQ==') USING utf8mb4), '2026-02-18 09:25:01');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'busfahrt', 71, 443, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA2LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNiwgImF2Z1RhcEttIjogNzl9') USING utf8mb4), '2026-06-05 10:58:01');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'busfahrt', 74, 319, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA2LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNiwgImF2Z1RhcEttIjogNzR9') USING utf8mb4), '2026-06-13 14:58:21');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 69, 99, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), '2025-11-12 15:47:13');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 86, 480, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogOSwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), '2025-12-01 09:29:10');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'logistik', 74, 210, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA3LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNjgwfQ==') USING utf8mb4), '2026-05-17 14:14:57');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'logistik', 82, 329, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA4LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogODQwfQ==') USING utf8mb4), '2026-02-02 11:41:54');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'tourismusregion', 65, 293, CONVERT(FROM_BASE64('eyJzY29yZSI6IDY1fQ==') USING utf8mb4), '2026-02-09 12:19:51');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'weltkueche', 68, 94, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJjb21wbGV0ZWREaXNoZXMiOiA3LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogNX0=') USING utf8mb4), '2026-06-06 13:34:39');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'weltkueche', 79, 107, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJjb21wbGV0ZWREaXNoZXMiOiA4LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogM30=') USING utf8mb4), '2026-01-17 08:27:15');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 100, 243, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA2LCAiY29ycmVjdF9maXJzdF90cnkiOiA2LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDEuMH0=') USING utf8mb4), '2025-12-28 11:59:26');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 73, 441, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA0LCAiY29ycmVjdF9maXJzdF90cnkiOiA0LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDMuNH0=') USING utf8mb4), '2026-04-27 12:50:31');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'tourismustal', 93, 177, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA2LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA5MywgIm5hdHVyZSI6IDkzLCAibW9uZXkiOiAxMDB9') USING utf8mb4), '2025-12-24 09:52:51');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'tourismustal', 90, 482, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA1LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA5MCwgIm5hdHVyZSI6IDkwLCAibW9uZXkiOiAxMDB9') USING utf8mb4), '2025-12-08 13:37:29');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'energiemanager', 85, 108, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDEwLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA1LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4), '2026-05-11 12:23:03');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'energiemanager', 100, 167, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJibG9ja3NCYWxhbmNlZCI6IDEyLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA2LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4), '2026-02-20 11:20:23');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'sonnensystem', 89, 177, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxOCwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IHRydWV9') USING utf8mb4), '2026-05-10 15:02:01');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'sonnensystem', 100, 243, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAyMCwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IHRydWV9') USING utf8mb4), '2026-04-17 11:44:02');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'fluss', 86, 419, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA4NiwgImVjb25vbXkiOiA4NiwgImZsb29kIjogMTQsICJmb29kIjogODZ9') USING utf8mb4), '2026-05-05 13:29:31');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'fluss', 56, 357, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJiaW9kaXYiOiA1NiwgImVjb25vbXkiOiA1NiwgImZsb29kIjogNDQsICJmb29kIjogNTZ9') USING utf8mb4), '2025-12-19 15:50:17');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1), 99, 'farmer', 85, 283, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDg1LCAieWVhciI6IDEzLCAiY3JvcHNfdXNlZCI6IDV9') USING utf8mb4), '2026-01-06 09:03:10');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 99, 'energiemanager', 41, 460, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJibG9ja3NCYWxhbmNlZCI6IDUsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDIsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), '2026-06-04 13:55:05');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 99, 'tourismustal', 57, 437, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiAzLCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA1NywgIm5hdHVyZSI6IDU3LCAibW9uZXkiOiAxMDB9') USING utf8mb4), '2026-02-26 12:29:58');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 99, 'tourismustal', 44, 359, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiAzLCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA0NCwgIm5hdHVyZSI6IDQ0LCAibW9uZXkiOiAxMDB9') USING utf8mb4), '2026-02-08 11:27:23');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 99, 'heli', 58, 319, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAzLCAicGxhblBjdCI6IDU4LCAic3RhcnRTY29yZSI6IDMsICJsYW5kaW5nU2NvcmUiOiAzfQ==') USING utf8mb4), '2025-10-15 13:03:50');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 99, 'heli', 58, 412, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAzLCAicGxhblBjdCI6IDU4LCAic3RhcnRTY29yZSI6IDMsICJsYW5kaW5nU2NvcmUiOiAzfQ==') USING utf8mb4), '2025-10-25 09:52:23');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 48, 354, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNSwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4), '2026-01-17 10:06:48');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 58, 336, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNiwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4), '2026-01-28 11:54:00');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 56, 215, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNiwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4), '2026-03-16 14:25:42');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 99, 'fluss', 55, 498, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJiaW9kaXYiOiA1NSwgImVjb25vbXkiOiA1NSwgImZsb29kIjogNDUsICJmb29kIjogNTV9') USING utf8mb4), '2025-11-12 11:31:58');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 99, 'weltkueche', 77, 236, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJjb21wbGV0ZWREaXNoZXMiOiA4LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogM30=') USING utf8mb4), '2026-05-05 15:19:19');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 38, 90, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAyLCAiY29ycmVjdF9maXJzdF90cnkiOiAyLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDYuNn0=') USING utf8mb4), '2025-10-22 08:23:29');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 99, 'busfahrt', 50, 107, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJ3b25PcmRlcnMiOiA0LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNCwgImF2Z1RhcEttIjogMTE1fQ==') USING utf8mb4), '2026-03-25 08:43:46');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 99, 'sonnensystem', 73, 269, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxNSwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4), '2026-04-17 11:32:27');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 99, 'sonnensystem', 47, 431, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiA5LCAidG90YWwiOiAyMCwgImZpcnN0VHJ5IjogZmFsc2V9') USING utf8mb4), '2026-05-15 09:20:17');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 99, 'sonnensystem', 76, 339, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxNSwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4), '2026-01-27 12:39:06');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 99, 'klima', 63, 234, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjYxLCAiZmluYWxfZmxvb2RlZF9wY3QiOiAzNywgImZpbmFsX2J1ZGdldCI6IDIzMCwgImZpbmFsX2NvMiI6IDQzNiwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4), '2026-02-09 15:10:04');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 99, 'klima', 58, 209, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2Ljc2LCAiZmluYWxfZmxvb2RlZF9wY3QiOiA0MiwgImZpbmFsX2J1ZGdldCI6IDE4MCwgImZpbmFsX2NvMiI6IDQ0MywgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4), '2026-05-08 08:05:56');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1), 99, 'klima', 66, 333, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjUyLCAiZmluYWxfZmxvb2RlZF9wY3QiOiAzNCwgImZpbmFsX2J1ZGdldCI6IDI2MCwgImZpbmFsX2NvMiI6IDQzMSwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4), '2026-02-03 12:16:25');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 99, 'tourismustal', 40, 208, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiAyLCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA0MCwgIm5hdHVyZSI6IDQwLCAibW9uZXkiOiAxMDB9') USING utf8mb4), '2025-10-06 13:02:41');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 99, 'tourismusregion', 43, 290, CONVERT(FROM_BASE64('eyJzY29yZSI6IDQzfQ==') USING utf8mb4), '2026-06-14 08:58:56');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 63, 141, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA0LCAiY29ycmVjdF9maXJzdF90cnkiOiA0LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDQuM30=') USING utf8mb4), '2026-02-22 10:30:04');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 37, 122, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAyLCAiY29ycmVjdF9maXJzdF90cnkiOiAyLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDYuN30=') USING utf8mb4), '2026-05-01 13:23:48');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 56, 457, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNiwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4), '2026-03-24 15:04:37');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 42, 187, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4), '2026-02-06 12:50:49');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 48, 368, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNSwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4), '2026-05-17 12:42:32');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 99, 'heli', 49, 159, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAyLCAicGxhblBjdCI6IDQ5LCAic3RhcnRTY29yZSI6IDIsICJsYW5kaW5nU2NvcmUiOiAyfQ==') USING utf8mb4), '2025-12-07 11:00:23');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 99, 'heli', 62, 207, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAzLCAicGxhblBjdCI6IDYyLCAic3RhcnRTY29yZSI6IDMsICJsYW5kaW5nU2NvcmUiOiAzfQ==') USING utf8mb4), '2025-11-24 10:44:36');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 99, 'energiemanager', 80, 465, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDEwLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA1LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4), '2025-12-01 10:46:13');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 99, 'energiemanager', 46, 286, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJibG9ja3NCYWxhbmNlZCI6IDYsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDMsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), '2026-04-09 14:47:00');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 99, 'logistik', 66, 128, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJvcmRlcnNEZWxpdmVyZWQiOiA3LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNTIwfQ==') USING utf8mb4), '2025-10-05 14:30:06');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1), 99, 'weltkueche', 29, 481, CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJjb21wbGV0ZWREaXNoZXMiOiAzLCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogMTF9') USING utf8mb4), '2025-10-23 13:29:42');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 83, 244, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuNX0=') USING utf8mb4), '2026-04-20 14:56:27');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 99, 'sonnensystem', 57, 451, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxMSwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4), '2025-10-01 12:27:59');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 99, 'sonnensystem', 65, 296, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxMywgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4), '2026-01-28 15:42:30');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 99, 'logistik', 78, 518, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA4LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNzYwfQ==') USING utf8mb4), '2025-10-28 13:20:41');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 79, 373, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogOCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4), '2026-05-25 13:35:56');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 99, 'farmer', 65, 368, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJoaXRfcmF0ZSI6IDY1LCAieWVhciI6IDEwLCAiY3JvcHNfdXNlZCI6IDR9') USING utf8mb4), '2026-01-22 12:38:05');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 99, 'farmer', 73, 254, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDczLCAieWVhciI6IDExLCAiY3JvcHNfdXNlZCI6IDR9') USING utf8mb4), '2026-05-12 10:09:26');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 99, 'weltkueche', 78, 399, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJjb21wbGV0ZWREaXNoZXMiOiA4LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogM30=') USING utf8mb4), '2026-04-02 13:20:46');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 99, 'busfahrt', 84, 491, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA3LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNywgImF2Z1RhcEttIjogNTd9') USING utf8mb4), '2026-05-24 08:40:55');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 99, 'heli', 86, 511, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDg2LCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4), '2026-02-19 09:07:35');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 99, 'heli', 81, 311, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDgxLCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4), '2026-03-30 12:56:40');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 99, 'heli', 80, 244, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDgwLCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4), '2026-03-15 11:06:47');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 99, 'energiemanager', 73, 328, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDksICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDQsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), '2025-12-02 13:03:56');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 99, 'tourismustal', 78, 351, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA1LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA3OCwgIm5hdHVyZSI6IDc4LCAibW9uZXkiOiAxMDB9') USING utf8mb4), '2025-11-26 08:33:14');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 99, 'tourismusregion', 71, 165, CONVERT(FROM_BASE64('eyJzY29yZSI6IDcxfQ==') USING utf8mb4), '2026-05-26 15:50:26');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1), 99, 'klima', 60, 452, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjcsICJmaW5hbF9mbG9vZGVkX3BjdCI6IDQwLCAiZmluYWxfYnVkZ2V0IjogMjAwLCAiZmluYWxfY28yIjogNDQwLCAiZmluYWxfcG9wdWxhdGlvbiI6IDI1MH0=') USING utf8mb4), '2026-04-10 09:27:04');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 99, 'heli', 26, 459, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAxLCAicGxhblBjdCI6IDI2LCAic3RhcnRTY29yZSI6IDEsICJsYW5kaW5nU2NvcmUiOiAxfQ==') USING utf8mb4), '2025-12-05 08:33:11');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 99, 'heli', 38, 342, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAyLCAicGxhblBjdCI6IDM4LCAic3RhcnRTY29yZSI6IDIsICJsYW5kaW5nU2NvcmUiOiAyfQ==') USING utf8mb4), '2026-04-14 12:39:23');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 99, 'logistik', 48, 113, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJvcmRlcnNEZWxpdmVyZWQiOiA1LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogMTYwfQ==') USING utf8mb4), '2026-05-24 10:28:58');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 99, 'tourismustal', 41, 400, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiAyLCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA0MSwgIm5hdHVyZSI6IDQxLCAibW9uZXkiOiAxMDB9') USING utf8mb4), '2025-10-14 15:55:31');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 99, 'fluss', 47, 438, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJiaW9kaXYiOiA0NywgImVjb25vbXkiOiA0NywgImZsb29kIjogNTMsICJmb29kIjogNDd9') USING utf8mb4), '2026-04-09 08:06:55');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 39, 475, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAyLCAiY29ycmVjdF9maXJzdF90cnkiOiAyLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDYuNX0=') USING utf8mb4), '2026-04-23 11:20:30');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 37, 455, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAyLCAiY29ycmVjdF9maXJzdF90cnkiOiAyLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDYuN30=') USING utf8mb4), '2025-12-30 08:47:11');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 32, 457, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogMywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4), '2025-12-14 13:31:36');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 99, 'eu-werkstatt', 56, 189, CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNiwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4), '2026-05-15 09:59:35');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 99, 'tourismusregion', 17, 354, CONVERT(FROM_BASE64('eyJzY29yZSI6IDE3fQ==') USING utf8mb4), '2026-04-06 10:50:50');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 99, 'tourismusregion', 41, 296, CONVERT(FROM_BASE64('eyJzY29yZSI6IDQxfQ==') USING utf8mb4), '2025-10-28 09:14:48');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 99, 'energiemanager', 26, 101, CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJibG9ja3NCYWxhbmNlZCI6IDMsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDIsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), '2026-05-26 10:28:46');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1), 99, 'energiemanager', 36, 185, CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJibG9ja3NCYWxhbmNlZCI6IDQsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDIsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), '2025-10-04 09:47:11');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 86, 279, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuM30=') USING utf8mb4), '2025-10-06 14:32:17');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 87, 158, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuMn0=') USING utf8mb4), '2025-12-02 09:40:19');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 99, 'kofferdetektiv', 78, 112, CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDMuMH0=') USING utf8mb4), '2025-10-01 10:05:57');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 99, 'klima', 86, 211, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE1LjkyLCAiZmluYWxfZmxvb2RlZF9wY3QiOiAxNCwgImZpbmFsX2J1ZGdldCI6IDQ2MCwgImZpbmFsX2NvMiI6IDQwMSwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4), '2026-03-11 10:12:43');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 99, 'klima', 75, 345, CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjI1LCAiZmluYWxfZmxvb2RlZF9wY3QiOiAyNSwgImZpbmFsX2J1ZGdldCI6IDM1MCwgImZpbmFsX2NvMiI6IDQxOCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4), '2025-12-01 11:49:46');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 99, 'tourismusregion', 97, 495, CONVERT(FROM_BASE64('eyJzY29yZSI6IDk3fQ==') USING utf8mb4), '2026-05-09 12:49:43');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 99, 'heli', 92, 328, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA1LCAicGxhblBjdCI6IDkyLCAic3RhcnRTY29yZSI6IDUsICJsYW5kaW5nU2NvcmUiOiA1fQ==') USING utf8mb4), '2025-11-02 15:53:39');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 99, 'heli', 88, 176, CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDg4LCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4), '2025-11-14 10:38:01');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 99, 'sonnensystem', 75, 97, CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxNSwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4), '2026-04-29 09:21:25');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 99, 'energiemanager', 93, 151, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJibG9ja3NCYWxhbmNlZCI6IDExLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA2LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4), '2025-11-16 08:49:42');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 99, 'energiemanager', 92, 236, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJibG9ja3NCYWxhbmNlZCI6IDExLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA2LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4), '2026-05-18 15:27:57');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 99, 'energiemanager', 67, 170, CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJibG9ja3NCYWxhbmNlZCI6IDgsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDQsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4), '2026-03-09 14:45:49');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 99, 'tourismustal', 100, 343, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA2LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiAxMDAsICJuYXR1cmUiOiAxMDAsICJtb25leSI6IDEwMH0=') USING utf8mb4), '2026-03-23 09:50:20');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 99, 'tourismustal', 71, 455, CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA3MSwgIm5hdHVyZSI6IDcxLCAibW9uZXkiOiAxMDB9') USING utf8mb4), '2025-10-25 14:07:28');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 99, 'weltkueche', 99, 327, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJjb21wbGV0ZWREaXNoZXMiOiAxMCwgInRvdGFsRGlzaGVzIjogMTAsICJtaXN0YWtlc0luRGlzaCI6IDB9') USING utf8mb4), '2026-01-15 13:22:05');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 99, 'weltkueche', 100, 433, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJjb21wbGV0ZWREaXNoZXMiOiAxMCwgInRvdGFsRGlzaGVzIjogMTAsICJtaXN0YWtlc0luRGlzaCI6IDB9') USING utf8mb4), '2026-02-07 11:01:50');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 99, 'logistik', 100, 374, CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJvcmRlcnNEZWxpdmVyZWQiOiAxMCwgInRvdGFsT3JkZXJzIjogMTAsICJvcmRlcnNMYXRlIjogMCwgImZpbmFsQmFsYW5jZSI6IDEyMDB9') USING utf8mb4), '2026-04-30 08:50:08');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 99, 'logistik', 84, 481, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA4LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogODgwfQ==') USING utf8mb4), '2026-05-22 11:01:20');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 99, 'busfahrt', 84, 145, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA3LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNywgImF2Z1RhcEttIjogNTd9') USING utf8mb4), '2026-06-08 12:37:03');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1), 99, 'busfahrt', 87, 272, CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA3LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNywgImF2Z1RhcEttIjogNTJ9') USING utf8mb4), '2026-04-23 14:57:34');
SET FOREIGN_KEY_CHECKS=1;
+267
View File
@@ -0,0 +1,267 @@
SET FOREIGN_KEY_CHECKS=0;
DELETE FROM player_progress WHERE student_id IN (SELECT id FROM students WHERE class_id=99 AND username IN ('noah','felix','leon','hannes','david','emma','katharina','ida','ben','clara','greta','jakob_s','marlene','olivia'));
DELETE FROM student_results WHERE class_id=99 AND student_id IN (SELECT id FROM students WHERE class_id=99 AND username IN ('noah','felix','leon','hannes','david','emma','katharina','ida','ben','clara','greta','jakob_s','marlene','olivia'));
DELETE FROM assessments WHERE class_id=99 AND session_id IN (SELECT id FROM student_sessions WHERE class_id=99 AND created_at='2025-10-01 08:00:00' AND display_name IN ('Noah','Felix','Leon','Hannes','David','Emma','Katharina','Ida','Ben','Clara','Greta','Jakob','Marlene','Olivia'));
DELETE FROM student_sessions WHERE class_id=99 AND created_at='2025-10-01 08:00:00' AND display_name IN ('Noah','Felix','Leon','Hannes','David','Emma','Katharina','Ida','Ben','Clara','Greta','Jakob','Marlene','Olivia');
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('528680bb-54db-6443-5152-bdeb18ce218f',99,'Noah','2025-10-01 08:00:00','2026-07-19 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('528680bb-54db-6443-5152-bdeb18ce218f','energiemanager',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJibG9ja3NCYWxhbmNlZCI6IDQsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDIsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),528000,'2026-06-23 08:20:12');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1),99,'energiemanager',36,528,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJibG9ja3NCYWxhbmNlZCI6IDQsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDIsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),'2026-06-23 08:20:12');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('528680bb-54db-6443-5152-bdeb18ce218f','weltkueche',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJjb21wbGV0ZWREaXNoZXMiOiA1LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogOH0=') USING utf8mb4),222000,'2026-06-24 10:03:28');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1),99,'weltkueche',48,222,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJjb21wbGV0ZWREaXNoZXMiOiA1LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogOH0=') USING utf8mb4),'2026-06-24 10:03:28');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('528680bb-54db-6443-5152-bdeb18ce218f','kofferdetektiv',99,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAyLCAiY29ycmVjdF9maXJzdF90cnkiOiAyLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDYuNH0=') USING utf8mb4),552000,'2026-06-23 09:17:25');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1),99,'kofferdetektiv',40,552,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAyLCAiY29ycmVjdF9maXJzdF90cnkiOiAyLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDYuNH0=') USING utf8mb4),'2026-06-23 09:17:25');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('528680bb-54db-6443-5152-bdeb18ce218f','energiemanager',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJibG9ja3NCYWxhbmNlZCI6IDQsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDIsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),499000,'2026-06-24 08:35:45');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1),99,'energiemanager',31,499,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJibG9ja3NCYWxhbmNlZCI6IDQsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDIsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),'2026-06-24 08:35:45');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('528680bb-54db-6443-5152-bdeb18ce218f','kofferdetektiv',99,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAyLCAiY29ycmVjdF9maXJzdF90cnkiOiAyLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDYuN30=') USING utf8mb4),261000,'2026-06-24 11:31:23');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1),99,'kofferdetektiv',37,261,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAyLCAiY29ycmVjdF9maXJzdF90cnkiOiAyLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDYuN30=') USING utf8mb4),'2026-06-24 11:31:23');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1),'energiemanager',1,40,2,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1),'weltkueche',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1),'kofferdetektiv',1,40,2,2);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('c4f8ed3b-c8ae-f936-3486-09debfcf4132',99,'Felix','2025-10-01 08:00:00','2026-07-19 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('c4f8ed3b-c8ae-f936-3486-09debfcf4132','kofferdetektiv',99,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAzLCAiY29ycmVjdF9maXJzdF90cnkiOiAzLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDUuMX0=') USING utf8mb4),419000,'2026-05-19 13:50:44');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1),99,'kofferdetektiv',54,419,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAzLCAiY29ycmVjdF9maXJzdF90cnkiOiAzLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDUuMX0=') USING utf8mb4),'2026-05-19 13:50:44');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('c4f8ed3b-c8ae-f936-3486-09debfcf4132','heli',99,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAyLCAicGxhblBjdCI6IDQxLCAic3RhcnRTY29yZSI6IDIsICJsYW5kaW5nU2NvcmUiOiAyfQ==') USING utf8mb4),296000,'2026-06-06 10:56:12');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1),99,'heli',41,296,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAyLCAicGxhblBjdCI6IDQxLCAic3RhcnRTY29yZSI6IDIsICJsYW5kaW5nU2NvcmUiOiAyfQ==') USING utf8mb4),'2026-06-06 10:56:12');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('c4f8ed3b-c8ae-f936-3486-09debfcf4132','busfahrt',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJ3b25PcmRlcnMiOiAzLCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogMywgImF2Z1RhcEttIjogMTMyfQ==') USING utf8mb4),126000,'2026-07-10 15:15:59');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1),99,'busfahrt',40,126,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJ3b25PcmRlcnMiOiAzLCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogMywgImF2Z1RhcEttIjogMTMyfQ==') USING utf8mb4),'2026-07-10 15:15:59');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('c4f8ed3b-c8ae-f936-3486-09debfcf4132','heli',99,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAyLCAicGxhblBjdCI6IDM3LCAic3RhcnRTY29yZSI6IDIsICJsYW5kaW5nU2NvcmUiOiAyfQ==') USING utf8mb4),317000,'2026-07-14 12:41:31');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1),99,'heli',37,317,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAyLCAicGxhblBjdCI6IDM3LCAic3RhcnRTY29yZSI6IDIsICJsYW5kaW5nU2NvcmUiOiAyfQ==') USING utf8mb4),'2026-07-14 12:41:31');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('c4f8ed3b-c8ae-f936-3486-09debfcf4132','klima',99,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE3LjQ1LCAiZmluYWxfZmxvb2RlZF9wY3QiOiA2NSwgImZpbmFsX2J1ZGdldCI6IC0yNSwgImZpbmFsX2NvMiI6IDQ3OCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),390000,'2026-07-11 12:51:44');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1),99,'klima',35,390,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE3LjQ1LCAiZmluYWxfZmxvb2RlZF9wY3QiOiA2NSwgImZpbmFsX2J1ZGdldCI6IC0yNSwgImZpbmFsX2NvMiI6IDQ3OCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),'2026-07-11 12:51:44');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('c4f8ed3b-c8ae-f936-3486-09debfcf4132','heli',99,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAyLCAicGxhblBjdCI6IDQ0LCAic3RhcnRTY29yZSI6IDIsICJsYW5kaW5nU2NvcmUiOiAyfQ==') USING utf8mb4),355000,'2026-07-18 11:05:43');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1),99,'heli',44,355,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAyLCAicGxhblBjdCI6IDQ0LCAic3RhcnRTY29yZSI6IDIsICJsYW5kaW5nU2NvcmUiOiAyfQ==') USING utf8mb4),'2026-07-18 11:05:43');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1),'kofferdetektiv',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1),'heli',2,60,3,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1),'busfahrt',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1),'klima',1,20,1,2);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('5085a253-98c2-2d8b-9024-c51036051cb8',99,'Leon','2025-10-01 08:00:00','2026-07-19 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5085a253-98c2-2d8b-9024-c51036051cb8','energiemanager',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJibG9ja3NCYWxhbmNlZCI6IDcsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDMsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),270000,'2026-05-17 09:33:57');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1),99,'energiemanager',56,270,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJibG9ja3NCYWxhbmNlZCI6IDcsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDMsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),'2026-05-17 09:33:57');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5085a253-98c2-2d8b-9024-c51036051cb8','logistik',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJvcmRlcnNEZWxpdmVyZWQiOiA1LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogMjQwfQ==') USING utf8mb4),280000,'2026-05-27 15:49:15');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1),99,'logistik',52,280,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJvcmRlcnNEZWxpdmVyZWQiOiA1LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogMjQwfQ==') USING utf8mb4),'2026-05-27 15:49:15');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5085a253-98c2-2d8b-9024-c51036051cb8','tourismusregion',99,CONVERT(FROM_BASE64('eyJzY29yZSI6IDUzfQ==') USING utf8mb4),269000,'2026-07-15 10:32:07');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1),99,'tourismusregion',53,269,CONVERT(FROM_BASE64('eyJzY29yZSI6IDUzfQ==') USING utf8mb4),'2026-07-15 10:32:07');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5085a253-98c2-2d8b-9024-c51036051cb8','heli',99,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAyLCAicGxhblBjdCI6IDQ2LCAic3RhcnRTY29yZSI6IDIsICJsYW5kaW5nU2NvcmUiOiAyfQ==') USING utf8mb4),387000,'2026-07-14 13:48:01');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1),99,'heli',46,387,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAyLCAicGxhblBjdCI6IDQ2LCAic3RhcnRTY29yZSI6IDIsICJsYW5kaW5nU2NvcmUiOiAyfQ==') USING utf8mb4),'2026-07-14 13:48:01');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5085a253-98c2-2d8b-9024-c51036051cb8','energiemanager',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJibG9ja3NCYWxhbmNlZCI6IDQsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDIsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),594000,'2026-07-15 09:22:45');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1),99,'energiemanager',36,594,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJibG9ja3NCYWxhbmNlZCI6IDQsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDIsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),'2026-07-15 09:22:45');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1),'energiemanager',2,50,2,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1),'logistik',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1),'tourismusregion',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1),'heli',1,20,1,2);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('058044fd-e54e-037e-7d90-aca97303aecb',99,'Hannes','2025-10-01 08:00:00','2026-07-19 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('058044fd-e54e-037e-7d90-aca97303aecb','logistik',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJvcmRlcnNEZWxpdmVyZWQiOiAzLCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogLTMwMH0=') USING utf8mb4),475000,'2026-06-13 12:35:30');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'logistik',28,475,CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJvcmRlcnNEZWxpdmVyZWQiOiAzLCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogLTMwMH0=') USING utf8mb4),'2026-06-13 12:35:30');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('058044fd-e54e-037e-7d90-aca97303aecb','klima',99,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE3LjMzLCAiZmluYWxfZmxvb2RlZF9wY3QiOiA2MSwgImZpbmFsX2J1ZGdldCI6IC01LCAiZmluYWxfY28yIjogNDcyLCAiZmluYWxfcG9wdWxhdGlvbiI6IDI1MH0=') USING utf8mb4),142000,'2026-06-16 13:41:07');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'klima',39,142,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE3LjMzLCAiZmluYWxfZmxvb2RlZF9wY3QiOiA2MSwgImZpbmFsX2J1ZGdldCI6IC01LCAiZmluYWxfY28yIjogNDcyLCAiZmluYWxfcG9wdWxhdGlvbiI6IDI1MH0=') USING utf8mb4),'2026-06-16 13:41:07');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('058044fd-e54e-037e-7d90-aca97303aecb','busfahrt',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJ3b25PcmRlcnMiOiAyLCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogMiwgImF2Z1RhcEttIjogMTQ5fQ==') USING utf8mb4),551000,'2026-06-24 15:20:55');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'busfahrt',30,551,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJ3b25PcmRlcnMiOiAyLCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogMiwgImF2Z1RhcEttIjogMTQ5fQ==') USING utf8mb4),'2026-06-24 15:20:55');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('058044fd-e54e-037e-7d90-aca97303aecb','farmer',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJoaXRfcmF0ZSI6IDMzLCAieWVhciI6IDUsICJjcm9wc191c2VkIjogMn0=') USING utf8mb4),186000,'2026-06-14 09:19:26');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'farmer',33,186,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJoaXRfcmF0ZSI6IDMzLCAieWVhciI6IDUsICJjcm9wc191c2VkIjogMn0=') USING utf8mb4),'2026-06-14 09:19:26');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('058044fd-e54e-037e-7d90-aca97303aecb','farmer',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJoaXRfcmF0ZSI6IDI2LCAieWVhciI6IDQsICJjcm9wc191c2VkIjogMn0=') USING utf8mb4),184000,'2026-07-12 13:30:45');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'farmer',26,184,CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJoaXRfcmF0ZSI6IDI2LCAieWVhciI6IDQsICJjcm9wc191c2VkIjogMn0=') USING utf8mb4),'2026-07-12 13:30:45');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('058044fd-e54e-037e-7d90-aca97303aecb','busfahrt',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJ3b25PcmRlcnMiOiAzLCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogMywgImF2Z1RhcEttIjogMTQwfQ==') USING utf8mb4),281000,'2026-07-19 12:23:05');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'busfahrt',35,281,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJ3b25PcmRlcnMiOiAzLCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogMywgImF2Z1RhcEttIjogMTQwfQ==') USING utf8mb4),'2026-07-19 12:23:05');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('058044fd-e54e-037e-7d90-aca97303aecb','eu-werkstatt',99,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogMywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),279000,'2026-07-10 15:13:05');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'eu-werkstatt',33,279,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogMywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),'2026-07-10 15:13:05');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('058044fd-e54e-037e-7d90-aca97303aecb','fluss',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJiaW9kaXYiOiA0MCwgImVjb25vbXkiOiA0MCwgImZsb29kIjogNjAsICJmb29kIjogNDB9') USING utf8mb4),580000,'2026-07-15 10:13:31');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'fluss',40,580,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJiaW9kaXYiOiA0MCwgImVjb25vbXkiOiA0MCwgImZsb29kIjogNjAsICJmb29kIjogNDB9') USING utf8mb4),'2026-07-15 10:13:31');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('058044fd-e54e-037e-7d90-aca97303aecb','busfahrt',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJ3b25PcmRlcnMiOiAzLCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogMywgImF2Z1RhcEttIjogMTQwfQ==') USING utf8mb4),421000,'2026-07-12 10:28:23');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'busfahrt',35,421,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJ3b25PcmRlcnMiOiAzLCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogMywgImF2Z1RhcEttIjogMTQwfQ==') USING utf8mb4),'2026-07-12 10:28:23');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('058044fd-e54e-037e-7d90-aca97303aecb','weltkueche',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJjb21wbGV0ZWREaXNoZXMiOiAzLCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogMTB9') USING utf8mb4),364000,'2026-07-10 10:03:57');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'weltkueche',34,364,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJjb21wbGV0ZWREaXNoZXMiOiAzLCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogMTB9') USING utf8mb4),'2026-07-10 10:03:57');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('058044fd-e54e-037e-7d90-aca97303aecb','busfahrt',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJ3b25PcmRlcnMiOiAzLCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogMywgImF2Z1RhcEttIjogMTQ2fQ==') USING utf8mb4),226000,'2026-07-19 10:41:39');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'busfahrt',32,226,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJ3b25PcmRlcnMiOiAzLCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogMywgImF2Z1RhcEttIjogMTQ2fQ==') USING utf8mb4),'2026-07-19 10:41:39');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),'logistik',1,10,1,1);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),'klima',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),'busfahrt',2,80,4,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),'farmer',1,30,2,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),'eu-werkstatt',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),'fluss',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),'weltkueche',1,20,1,2);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('c34bbbcb-1f22-a337-87b8-4636d0fb9ca1',99,'David','2025-10-01 08:00:00','2026-07-19 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('c34bbbcb-1f22-a337-87b8-4636d0fb9ca1','klima',99,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE1LjgzLCAiZmluYWxfZmxvb2RlZF9wY3QiOiAxMSwgImZpbmFsX2J1ZGdldCI6IDQ5MCwgImZpbmFsX2NvMiI6IDM5NiwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),150000,'2026-06-18 13:50:08');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1),99,'klima',89,150,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE1LjgzLCAiZmluYWxfZmxvb2RlZF9wY3QiOiAxMSwgImZpbmFsX2J1ZGdldCI6IDQ5MCwgImZpbmFsX2NvMiI6IDM5NiwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),'2026-06-18 13:50:08');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('c34bbbcb-1f22-a337-87b8-4636d0fb9ca1','tourismusregion',99,CONVERT(FROM_BASE64('eyJzY29yZSI6IDc4fQ==') USING utf8mb4),203000,'2026-05-25 14:54:06');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1),99,'tourismusregion',78,203,CONVERT(FROM_BASE64('eyJzY29yZSI6IDc4fQ==') USING utf8mb4),'2026-05-25 14:54:06');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('c34bbbcb-1f22-a337-87b8-4636d0fb9ca1','fluss',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA4MSwgImVjb25vbXkiOiA4MSwgImZsb29kIjogMTksICJmb29kIjogODF9') USING utf8mb4),546000,'2026-05-30 10:41:11');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1),99,'fluss',81,546,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA4MSwgImVjb25vbXkiOiA4MSwgImZsb29kIjogMTksICJmb29kIjogODF9') USING utf8mb4),'2026-05-30 10:41:11');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('c34bbbcb-1f22-a337-87b8-4636d0fb9ca1','busfahrt',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA3LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNywgImF2Z1RhcEttIjogNDd9') USING utf8mb4),200000,'2026-07-10 13:53:52');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1),99,'busfahrt',90,200,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA3LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNywgImF2Z1RhcEttIjogNDd9') USING utf8mb4),'2026-07-10 13:53:52');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('c34bbbcb-1f22-a337-87b8-4636d0fb9ca1','logistik',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA4LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogOTAwfQ==') USING utf8mb4),245000,'2026-07-12 08:08:50');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1),99,'logistik',85,245,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA4LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogOTAwfQ==') USING utf8mb4),'2026-07-12 08:08:50');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1),'klima',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1),'tourismusregion',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1),'fluss',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1),'busfahrt',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1),'logistik',1,40,1,4);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('cbf2baff-97f1-4637-8bc2-c5a17de952ab',99,'Emma','2025-10-01 08:00:00','2026-07-19 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('cbf2baff-97f1-4637-8bc2-c5a17de952ab','logistik',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA3LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNjgwfQ==') USING utf8mb4),543000,'2026-05-18 12:43:47');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1),99,'logistik',74,543,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA3LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNjgwfQ==') USING utf8mb4),'2026-05-18 12:43:47');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('cbf2baff-97f1-4637-8bc2-c5a17de952ab','heli',99,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDgyLCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4),375000,'2026-06-23 11:08:06');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1),99,'heli',82,375,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDgyLCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4),'2026-06-23 11:08:06');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('cbf2baff-97f1-4637-8bc2-c5a17de952ab','weltkueche',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJjb21wbGV0ZWREaXNoZXMiOiA5LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogMn0=') USING utf8mb4),232000,'2026-05-28 11:20:52');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1),99,'weltkueche',87,232,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJjb21wbGV0ZWREaXNoZXMiOiA5LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogMn0=') USING utf8mb4),'2026-05-28 11:20:52');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('cbf2baff-97f1-4637-8bc2-c5a17de952ab','fluss',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA4NywgImVjb25vbXkiOiA4NywgImZsb29kIjogMTMsICJmb29kIjogODd9') USING utf8mb4),443000,'2026-07-13 14:22:47');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1),99,'fluss',87,443,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA4NywgImVjb25vbXkiOiA4NywgImZsb29kIjogMTMsICJmb29kIjogODd9') USING utf8mb4),'2026-07-13 14:22:47');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('cbf2baff-97f1-4637-8bc2-c5a17de952ab','energiemanager',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDksICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDUsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),269000,'2026-07-09 09:58:38');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1),99,'energiemanager',79,269,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDksICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDUsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),'2026-07-09 09:58:38');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1),'logistik',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1),'heli',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1),'weltkueche',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1),'fluss',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1),'energiemanager',1,40,1,4);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('b6582d11-b238-5ca2-e08d-491894ba15ba',99,'Katharina','2025-10-01 08:00:00','2026-07-19 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('b6582d11-b238-5ca2-e08d-491894ba15ba','sonnensystem',99,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiA4LCAidG90YWwiOiAyMCwgImZpcnN0VHJ5IjogZmFsc2V9') USING utf8mb4),573000,'2026-06-09 08:20:40');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),99,'sonnensystem',40,573,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiA4LCAidG90YWwiOiAyMCwgImZpcnN0VHJ5IjogZmFsc2V9') USING utf8mb4),'2026-06-09 08:20:40');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('b6582d11-b238-5ca2-e08d-491894ba15ba','weltkueche',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJjb21wbGV0ZWREaXNoZXMiOiA0LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogMTB9') USING utf8mb4),572000,'2026-06-21 15:58:01');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),99,'weltkueche',36,572,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJjb21wbGV0ZWREaXNoZXMiOiA0LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogMTB9') USING utf8mb4),'2026-06-21 15:58:01');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('b6582d11-b238-5ca2-e08d-491894ba15ba','klima',99,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE3LjEyLCAiZmluYWxfZmxvb2RlZF9wY3QiOiA1NCwgImZpbmFsX2J1ZGdldCI6IDYwLCAiZmluYWxfY28yIjogNDYxLCAiZmluYWxfcG9wdWxhdGlvbiI6IDI1MH0=') USING utf8mb4),342000,'2026-06-18 11:32:40');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),99,'klima',46,342,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE3LjEyLCAiZmluYWxfZmxvb2RlZF9wY3QiOiA1NCwgImZpbmFsX2J1ZGdldCI6IDYwLCAiZmluYWxfY28yIjogNDYxLCAiZmluYWxfcG9wdWxhdGlvbiI6IDI1MH0=') USING utf8mb4),'2026-06-18 11:32:40');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('b6582d11-b238-5ca2-e08d-491894ba15ba','energiemanager',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJibG9ja3NCYWxhbmNlZCI6IDYsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDMsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),338000,'2026-05-22 11:13:33');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),99,'energiemanager',46,338,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJibG9ja3NCYWxhbmNlZCI6IDYsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDMsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),'2026-05-22 11:13:33');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('b6582d11-b238-5ca2-e08d-491894ba15ba','fluss',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJiaW9kaXYiOiA0NSwgImVjb25vbXkiOiA0NSwgImZsb29kIjogNTUsICJmb29kIjogNDV9') USING utf8mb4),195000,'2026-05-19 15:03:23');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),99,'fluss',45,195,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJiaW9kaXYiOiA0NSwgImVjb25vbXkiOiA0NSwgImZsb29kIjogNTUsICJmb29kIjogNDV9') USING utf8mb4),'2026-05-19 15:03:23');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('b6582d11-b238-5ca2-e08d-491894ba15ba','kofferdetektiv',99,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA0LCAiY29ycmVjdF9maXJzdF90cnkiOiA0LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDQuNn0=') USING utf8mb4),487000,'2026-07-16 09:19:46');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),99,'kofferdetektiv',60,487,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA0LCAiY29ycmVjdF9maXJzdF90cnkiOiA0LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDQuNn0=') USING utf8mb4),'2026-07-16 09:19:46');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('b6582d11-b238-5ca2-e08d-491894ba15ba','tourismustal',99,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA2MSwgIm5hdHVyZSI6IDYxLCAibW9uZXkiOiAxMDB9') USING utf8mb4),465000,'2026-07-17 10:24:16');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),99,'tourismustal',61,465,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA2MSwgIm5hdHVyZSI6IDYxLCAibW9uZXkiOiAxMDB9') USING utf8mb4),'2026-07-17 10:24:16');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('b6582d11-b238-5ca2-e08d-491894ba15ba','busfahrt',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJ3b25PcmRlcnMiOiA1LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNSwgImF2Z1RhcEttIjogODh9') USING utf8mb4),241000,'2026-07-11 09:51:44');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),99,'busfahrt',66,241,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJ3b25PcmRlcnMiOiA1LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNSwgImF2Z1RhcEttIjogODh9') USING utf8mb4),'2026-07-11 09:51:44');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),'sonnensystem',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),'weltkueche',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),'klima',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),'energiemanager',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),'fluss',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),'kofferdetektiv',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),'tourismustal',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),'busfahrt',1,30,1,3);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('2c66a48b-8cdc-ad1f-0d68-d90bf3648205',99,'Ida','2025-10-01 08:00:00','2026-07-19 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('2c66a48b-8cdc-ad1f-0d68-d90bf3648205','sonnensystem',99,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiA4LCAidG90YWwiOiAyMCwgImZpcnN0VHJ5IjogZmFsc2V9') USING utf8mb4),507000,'2026-06-11 12:13:19');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),99,'sonnensystem',42,507,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiA4LCAidG90YWwiOiAyMCwgImZpcnN0VHJ5IjogZmFsc2V9') USING utf8mb4),'2026-06-11 12:13:19');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('2c66a48b-8cdc-ad1f-0d68-d90bf3648205','logistik',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJvcmRlcnNEZWxpdmVyZWQiOiA0LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNjB9') USING utf8mb4),317000,'2026-06-09 11:23:18');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),99,'logistik',43,317,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJvcmRlcnNEZWxpdmVyZWQiOiA0LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNjB9') USING utf8mb4),'2026-06-09 11:23:18');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('2c66a48b-8cdc-ad1f-0d68-d90bf3648205','eu-werkstatt',99,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),448000,'2026-06-13 08:51:55');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),99,'eu-werkstatt',40,448,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),'2026-06-13 08:51:55');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('2c66a48b-8cdc-ad1f-0d68-d90bf3648205','tourismustal',99,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiAyLCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiAzMywgIm5hdHVyZSI6IDMzLCAibW9uZXkiOiAxMDB9') USING utf8mb4),576000,'2026-06-13 12:26:43');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),99,'tourismustal',33,576,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiAyLCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiAzMywgIm5hdHVyZSI6IDMzLCAibW9uZXkiOiAxMDB9') USING utf8mb4),'2026-06-13 12:26:43');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('2c66a48b-8cdc-ad1f-0d68-d90bf3648205','kofferdetektiv',99,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA0LCAiY29ycmVjdF9maXJzdF90cnkiOiA0LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDQuM30=') USING utf8mb4),483000,'2026-07-14 12:59:04');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),99,'kofferdetektiv',63,483,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA0LCAiY29ycmVjdF9maXJzdF90cnkiOiA0LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDQuM30=') USING utf8mb4),'2026-07-14 12:59:04');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('2c66a48b-8cdc-ad1f-0d68-d90bf3648205','heli',99,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDcxLCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4),460000,'2026-07-10 13:42:09');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),99,'heli',71,460,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDcxLCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4),'2026-07-10 13:42:09');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('2c66a48b-8cdc-ad1f-0d68-d90bf3648205','sonnensystem',99,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxMywgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4),386000,'2026-07-14 15:08:11');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),99,'sonnensystem',63,386,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxMywgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4),'2026-07-14 15:08:11');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),'sonnensystem',2,50,2,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),'logistik',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),'eu-werkstatt',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),'tourismustal',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),'kofferdetektiv',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),'heli',1,40,1,4);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('86dfc304-d381-749b-ab7f-f91286fcee48',99,'Ben','2025-10-01 08:00:00','2026-07-19 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('86dfc304-d381-749b-ab7f-f91286fcee48','farmer',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDcyLCAieWVhciI6IDExLCAiY3JvcHNfdXNlZCI6IDR9') USING utf8mb4),359000,'2026-06-20 10:04:42');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),99,'farmer',72,359,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDcyLCAieWVhciI6IDExLCAiY3JvcHNfdXNlZCI6IDR9') USING utf8mb4),'2026-06-20 10:04:42');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('86dfc304-d381-749b-ab7f-f91286fcee48','klima',99,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjUyLCAiZmluYWxfZmxvb2RlZF9wY3QiOiAzNCwgImZpbmFsX2J1ZGdldCI6IDI2MCwgImZpbmFsX2NvMiI6IDQzMSwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),265000,'2026-06-08 13:26:54');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),99,'klima',66,265,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjUyLCAiZmluYWxfZmxvb2RlZF9wY3QiOiAzNCwgImZpbmFsX2J1ZGdldCI6IDI2MCwgImZpbmFsX2NvMiI6IDQzMSwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),'2026-06-08 13:26:54');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('86dfc304-d381-749b-ab7f-f91286fcee48','energiemanager',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJibG9ja3NCYWxhbmNlZCI6IDgsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDQsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),347000,'2026-06-06 12:54:04');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),99,'energiemanager',68,347,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJibG9ja3NCYWxhbmNlZCI6IDgsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDQsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),'2026-06-06 12:54:04');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('86dfc304-d381-749b-ab7f-f91286fcee48','fluss',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA3NCwgImVjb25vbXkiOiA3NCwgImZsb29kIjogMjYsICJmb29kIjogNzR9') USING utf8mb4),328000,'2026-07-13 08:01:47');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),99,'fluss',74,328,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA3NCwgImVjb25vbXkiOiA3NCwgImZsb29kIjogMjYsICJmb29kIjogNzR9') USING utf8mb4),'2026-07-13 08:01:47');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('86dfc304-d381-749b-ab7f-f91286fcee48','tourismustal',99,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA1LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA4MSwgIm5hdHVyZSI6IDgxLCAibW9uZXkiOiAxMDB9') USING utf8mb4),152000,'2026-07-13 12:44:45');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),99,'tourismustal',81,152,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA1LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA4MSwgIm5hdHVyZSI6IDgxLCAibW9uZXkiOiAxMDB9') USING utf8mb4),'2026-07-13 12:44:45');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('86dfc304-d381-749b-ab7f-f91286fcee48','heli',99,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDcyLCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4),375000,'2026-07-08 15:39:20');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),99,'heli',72,375,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDcyLCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4),'2026-07-08 15:39:20');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),'farmer',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),'klima',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),'energiemanager',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),'fluss',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),'tourismustal',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),'heli',1,40,1,4);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('100a9ed2-8004-6bf3-dd5e-41a392632bd3',99,'Clara','2025-10-01 08:00:00','2026-07-19 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('100a9ed2-8004-6bf3-dd5e-41a392632bd3','sonnensystem',99,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxMiwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4),516000,'2026-06-02 10:24:25');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),99,'sonnensystem',62,516,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxMiwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4),'2026-06-02 10:24:25');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('100a9ed2-8004-6bf3-dd5e-41a392632bd3','eu-werkstatt',99,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNiwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),188000,'2026-06-23 14:28:54');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),99,'eu-werkstatt',56,188,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNiwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),'2026-06-23 14:28:54');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('100a9ed2-8004-6bf3-dd5e-41a392632bd3','farmer',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDc0LCAieWVhciI6IDExLCAiY3JvcHNfdXNlZCI6IDR9') USING utf8mb4),352000,'2026-05-15 08:29:29');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),99,'farmer',74,352,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDc0LCAieWVhciI6IDExLCAiY3JvcHNfdXNlZCI6IDR9') USING utf8mb4),'2026-05-15 08:29:29');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('100a9ed2-8004-6bf3-dd5e-41a392632bd3','fluss',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJiaW9kaXYiOiA1OCwgImVjb25vbXkiOiA1OCwgImZsb29kIjogNDIsICJmb29kIjogNTh9') USING utf8mb4),204000,'2026-07-08 13:11:14');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),99,'fluss',58,204,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJiaW9kaXYiOiA1OCwgImVjb25vbXkiOiA1OCwgImZsb29kIjogNDIsICJmb29kIjogNTh9') USING utf8mb4),'2026-07-08 13:11:14');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('100a9ed2-8004-6bf3-dd5e-41a392632bd3','fluss',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJiaW9kaXYiOiA2MSwgImVjb25vbXkiOiA2MSwgImZsb29kIjogMzksICJmb29kIjogNjF9') USING utf8mb4),150000,'2026-07-19 08:11:22');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),99,'fluss',61,150,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJiaW9kaXYiOiA2MSwgImVjb25vbXkiOiA2MSwgImZsb29kIjogMzksICJmb29kIjogNjF9') USING utf8mb4),'2026-07-19 08:11:22');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('100a9ed2-8004-6bf3-dd5e-41a392632bd3','heli',99,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAzLCAicGxhblBjdCI6IDY0LCAic3RhcnRTY29yZSI6IDMsICJsYW5kaW5nU2NvcmUiOiAzfQ==') USING utf8mb4),526000,'2026-07-15 12:58:23');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),99,'heli',64,526,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAzLCAicGxhblBjdCI6IDY0LCAic3RhcnRTY29yZSI6IDMsICJsYW5kaW5nU2NvcmUiOiAzfQ==') USING utf8mb4),'2026-07-15 12:58:23');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),'sonnensystem',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),'eu-werkstatt',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),'farmer',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),'fluss',2,60,2,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),'heli',1,30,1,3);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('d9c65815-39ce-6c05-6280-1c5f87e844e0',99,'Greta','2025-10-01 08:00:00','2026-07-19 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d9c65815-39ce-6c05-6280-1c5f87e844e0','tourismustal',99,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA2OSwgIm5hdHVyZSI6IDY5LCAibW9uZXkiOiAxMDB9') USING utf8mb4),513000,'2026-06-07 09:50:24');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),99,'tourismustal',69,513,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA2OSwgIm5hdHVyZSI6IDY5LCAibW9uZXkiOiAxMDB9') USING utf8mb4),'2026-06-07 09:50:24');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d9c65815-39ce-6c05-6280-1c5f87e844e0','farmer',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDcxLCAieWVhciI6IDExLCAiY3JvcHNfdXNlZCI6IDR9') USING utf8mb4),190000,'2026-06-24 08:16:11');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),99,'farmer',71,190,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDcxLCAieWVhciI6IDExLCAiY3JvcHNfdXNlZCI6IDR9') USING utf8mb4),'2026-06-24 08:16:11');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d9c65815-39ce-6c05-6280-1c5f87e844e0','kofferdetektiv',99,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA0LCAiY29ycmVjdF9maXJzdF90cnkiOiA0LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDQuMn0=') USING utf8mb4),523000,'2026-05-16 08:58:02');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),99,'kofferdetektiv',64,523,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA0LCAiY29ycmVjdF9maXJzdF90cnkiOiA0LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDQuMn0=') USING utf8mb4),'2026-05-16 08:58:02');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d9c65815-39ce-6c05-6280-1c5f87e844e0','logistik',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA3LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNjAwfQ==') USING utf8mb4),561000,'2026-07-19 10:30:17');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),99,'logistik',70,561,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA3LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNjAwfQ==') USING utf8mb4),'2026-07-19 10:30:17');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d9c65815-39ce-6c05-6280-1c5f87e844e0','weltkueche',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJjb21wbGV0ZWREaXNoZXMiOiA4LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogM30=') USING utf8mb4),452000,'2026-07-08 09:08:00');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),99,'weltkueche',77,452,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJjb21wbGV0ZWREaXNoZXMiOiA4LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogM30=') USING utf8mb4),'2026-07-08 09:08:00');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d9c65815-39ce-6c05-6280-1c5f87e844e0','kofferdetektiv',99,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA0LCAiY29ycmVjdF9maXJzdF90cnkiOiA0LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDMuOX0=') USING utf8mb4),494000,'2026-07-19 09:22:33');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),99,'kofferdetektiv',68,494,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA0LCAiY29ycmVjdF9maXJzdF90cnkiOiA0LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDMuOX0=') USING utf8mb4),'2026-07-19 09:22:33');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),'tourismustal',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),'farmer',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),'kofferdetektiv',2,60,2,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),'logistik',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),'weltkueche',1,40,1,4);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('5d0e8345-23d5-601a-9dc9-7e78d8651909',99,'Jakob','2025-10-01 08:00:00','2026-07-19 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5d0e8345-23d5-601a-9dc9-7e78d8651909','busfahrt',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA3LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNywgImF2Z1RhcEttIjogNTR9') USING utf8mb4),136000,'2026-06-04 15:50:28');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),99,'busfahrt',86,136,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA3LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNywgImF2Z1RhcEttIjogNTR9') USING utf8mb4),'2026-06-04 15:50:28');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5d0e8345-23d5-601a-9dc9-7e78d8651909','kofferdetektiv',99,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuNH0=') USING utf8mb4),405000,'2026-06-10 14:38:31');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),99,'kofferdetektiv',84,405,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuNH0=') USING utf8mb4),'2026-06-10 14:38:31');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5d0e8345-23d5-601a-9dc9-7e78d8651909','tourismustal',99,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA1LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA3NywgIm5hdHVyZSI6IDc3LCAibW9uZXkiOiAxMDB9') USING utf8mb4),597000,'2026-06-24 08:47:36');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),99,'tourismustal',77,597,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA1LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA3NywgIm5hdHVyZSI6IDc3LCAibW9uZXkiOiAxMDB9') USING utf8mb4),'2026-06-24 08:47:36');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5d0e8345-23d5-601a-9dc9-7e78d8651909','weltkueche',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJjb21wbGV0ZWREaXNoZXMiOiA3LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogNH0=') USING utf8mb4),376000,'2026-07-13 14:30:03');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),99,'weltkueche',74,376,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJjb21wbGV0ZWREaXNoZXMiOiA3LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogNH0=') USING utf8mb4),'2026-07-13 14:30:03');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5d0e8345-23d5-601a-9dc9-7e78d8651909','logistik',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA3LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNjAwfQ==') USING utf8mb4),245000,'2026-07-16 15:08:49');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),99,'logistik',70,245,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA3LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNjAwfQ==') USING utf8mb4),'2026-07-16 15:08:49');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5d0e8345-23d5-601a-9dc9-7e78d8651909','tourismustal',99,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA1LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA4NCwgIm5hdHVyZSI6IDg0LCAibW9uZXkiOiAxMDB9') USING utf8mb4),234000,'2026-07-18 14:56:13');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),99,'tourismustal',84,234,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA1LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA4NCwgIm5hdHVyZSI6IDg0LCAibW9uZXkiOiAxMDB9') USING utf8mb4),'2026-07-18 14:56:13');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),'busfahrt',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),'kofferdetektiv',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),'tourismustal',2,80,2,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),'weltkueche',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),'logistik',1,40,1,4);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('5fa5c0e3-214d-e523-b81f-d2866dd6ad07',99,'Marlene','2025-10-01 08:00:00','2026-07-19 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5fa5c0e3-214d-e523-b81f-d2866dd6ad07','weltkueche',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJjb21wbGV0ZWREaXNoZXMiOiA2LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogNX0=') USING utf8mb4),437000,'2026-05-28 12:20:08');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),99,'weltkueche',64,437,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJjb21wbGV0ZWREaXNoZXMiOiA2LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogNX0=') USING utf8mb4),'2026-05-28 12:20:08');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5fa5c0e3-214d-e523-b81f-d2866dd6ad07','klima',99,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjU1LCAiZmluYWxfZmxvb2RlZF9wY3QiOiAzNSwgImZpbmFsX2J1ZGdldCI6IDI1MCwgImZpbmFsX2NvMiI6IDQzMiwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),171000,'2026-06-14 15:32:07');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),99,'klima',65,171,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjU1LCAiZmluYWxfZmxvb2RlZF9wY3QiOiAzNSwgImZpbmFsX2J1ZGdldCI6IDI1MCwgImZpbmFsX2NvMiI6IDQzMiwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),'2026-06-14 15:32:07');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5fa5c0e3-214d-e523-b81f-d2866dd6ad07','klima',99,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjQzLCAiZmluYWxfZmxvb2RlZF9wY3QiOiAzMSwgImZpbmFsX2J1ZGdldCI6IDI5MCwgImZpbmFsX2NvMiI6IDQyNiwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),466000,'2026-05-16 13:16:38');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),99,'klima',69,466,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjQzLCAiZmluYWxfZmxvb2RlZF9wY3QiOiAzMSwgImZpbmFsX2J1ZGdldCI6IDI5MCwgImZpbmFsX2NvMiI6IDQyNiwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),'2026-05-16 13:16:38');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5fa5c0e3-214d-e523-b81f-d2866dd6ad07','farmer',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJoaXRfcmF0ZSI6IDY4LCAieWVhciI6IDEwLCAiY3JvcHNfdXNlZCI6IDR9') USING utf8mb4),186000,'2026-07-14 09:30:21');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),99,'farmer',68,186,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJoaXRfcmF0ZSI6IDY4LCAieWVhciI6IDEwLCAiY3JvcHNfdXNlZCI6IDR9') USING utf8mb4),'2026-07-14 09:30:21');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5fa5c0e3-214d-e523-b81f-d2866dd6ad07','eu-werkstatt',99,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4),214000,'2026-07-12 08:55:12');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),99,'eu-werkstatt',68,214,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4),'2026-07-12 08:55:12');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5fa5c0e3-214d-e523-b81f-d2866dd6ad07','sonnensystem',99,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxMywgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4),198000,'2026-07-17 10:35:17');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),99,'sonnensystem',63,198,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxMywgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4),'2026-07-17 10:35:17');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),'weltkueche',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),'klima',2,60,2,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),'farmer',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),'eu-werkstatt',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),'sonnensystem',1,30,1,3);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('decc2aab-27fe-cd71-2778-cced389c7b35',99,'Olivia','2025-10-01 08:00:00','2026-07-19 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('decc2aab-27fe-cd71-2778-cced389c7b35','tourismusregion',99,CONVERT(FROM_BASE64('eyJzY29yZSI6IDg3fQ==') USING utf8mb4),373000,'2026-06-09 08:50:52');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),99,'tourismusregion',87,373,CONVERT(FROM_BASE64('eyJzY29yZSI6IDg3fQ==') USING utf8mb4),'2026-06-09 08:50:52');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('decc2aab-27fe-cd71-2778-cced389c7b35','fluss',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA4OSwgImVjb25vbXkiOiA4OSwgImZsb29kIjogMTEsICJmb29kIjogODl9') USING utf8mb4),351000,'2026-06-25 13:31:16');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),99,'fluss',89,351,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA4OSwgImVjb25vbXkiOiA4OSwgImZsb29kIjogMTEsICJmb29kIjogODl9') USING utf8mb4),'2026-06-25 13:31:16');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('decc2aab-27fe-cd71-2778-cced389c7b35','kofferdetektiv',99,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA2LCAiY29ycmVjdF9maXJzdF90cnkiOiA2LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDEuNn0=') USING utf8mb4),179000,'2026-05-28 12:00:17');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),99,'kofferdetektiv',93,179,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA2LCAiY29ycmVjdF9maXJzdF90cnkiOiA2LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDEuNn0=') USING utf8mb4),'2026-05-28 12:00:17');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('decc2aab-27fe-cd71-2778-cced389c7b35','tourismusregion',99,CONVERT(FROM_BASE64('eyJzY29yZSI6IDgxfQ==') USING utf8mb4),580000,'2026-07-14 11:30:30');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),99,'tourismusregion',81,580,CONVERT(FROM_BASE64('eyJzY29yZSI6IDgxfQ==') USING utf8mb4),'2026-07-14 11:30:30');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('decc2aab-27fe-cd71-2778-cced389c7b35','kofferdetektiv',99,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuN30=') USING utf8mb4),381000,'2026-07-14 09:05:10');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),99,'kofferdetektiv',81,381,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuN30=') USING utf8mb4),'2026-07-14 09:05:10');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('decc2aab-27fe-cd71-2778-cced389c7b35','kofferdetektiv',99,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuM30=') USING utf8mb4),520000,'2026-07-16 11:35:02');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),99,'kofferdetektiv',86,520,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuM30=') USING utf8mb4),'2026-07-16 11:35:02');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),'tourismusregion',2,80,2,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),'fluss',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),'kofferdetektiv',2,135,3,5);
SET FOREIGN_KEY_CHECKS=1;
@@ -0,0 +1,286 @@
SET FOREIGN_KEY_CHECKS=0;
-- 4b-Leistungen der generierten Schüler:innen neu (Anna bleibt)
DELETE FROM player_progress WHERE student_id IN (SELECT id FROM students WHERE class_id=99 AND username IN ('noah','hannes','felix','leon','david','emma','ida','katharina','ben','clara','greta','jakob_s','marlene','olivia'));
DELETE FROM student_results WHERE class_id=99 AND student_id IN (SELECT id FROM students WHERE class_id=99 AND username IN ('noah','hannes','felix','leon','david','emma','ida','katharina','ben','clara','greta','jakob_s','marlene','olivia'));
DELETE FROM assessments WHERE class_id=99 AND session_id IN (SELECT id FROM student_sessions WHERE class_id=99 AND created_at='2025-10-01 08:00:00' AND display_name IN ('Noah','Hannes','Felix','Leon','David','Emma','Ida','Katharina','Ben','Clara','Greta','Jakob','Marlene','Olivia'));
DELETE FROM student_sessions WHERE class_id=99 AND created_at='2025-10-01 08:00:00' AND display_name IN ('Noah','Hannes','Felix','Leon','David','Emma','Ida','Katharina','Ben','Clara','Greta','Jakob','Marlene','Olivia');
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('fdd37654-8753-d68b-e301-2231183dee86',99,'Noah','2025-10-01 08:00:00','2026-07-18 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('fdd37654-8753-d68b-e301-2231183dee86','tourismustal',99,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiAyLCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiAzOSwgIm5hdHVyZSI6IDM5LCAibW9uZXkiOiAxMDB9') USING utf8mb4),220000,'2026-07-18 09:56:51');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1),99,'tourismustal',39,220,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiAyLCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiAzOSwgIm5hdHVyZSI6IDM5LCAibW9uZXkiOiAxMDB9') USING utf8mb4),'2026-07-18 09:56:51');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='noah' AND class_id=99 LIMIT 1),'tourismustal',1,20,1,2);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('7337326a-336a-1d08-629b-7d4679f8e382',99,'Hannes','2025-10-01 08:00:00','2026-07-18 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('7337326a-336a-1d08-629b-7d4679f8e382','busfahrt',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJ3b25PcmRlcnMiOiA0LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNCwgImF2Z1RhcEttIjogMTI0fQ==') USING utf8mb4),139000,'2026-06-26 10:32:33');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'busfahrt',45,139,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJ3b25PcmRlcnMiOiA0LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNCwgImF2Z1RhcEttIjogMTI0fQ==') USING utf8mb4),'2026-06-26 10:32:33');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('7337326a-336a-1d08-629b-7d4679f8e382','heli',99,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAxLCAicGxhblBjdCI6IDI1LCAic3RhcnRTY29yZSI6IDEsICJsYW5kaW5nU2NvcmUiOiAxfQ==') USING utf8mb4),371000,'2026-05-12 09:40:58');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'heli',25,371,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAxLCAicGxhblBjdCI6IDI1LCAic3RhcnRTY29yZSI6IDEsICJsYW5kaW5nU2NvcmUiOiAxfQ==') USING utf8mb4),'2026-05-12 09:40:58');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('7337326a-336a-1d08-629b-7d4679f8e382','energiemanager',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJibG9ja3NCYWxhbmNlZCI6IDQsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDIsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),546000,'2026-07-03 14:17:01');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'energiemanager',31,546,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJibG9ja3NCYWxhbmNlZCI6IDQsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDIsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),'2026-07-03 14:17:01');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('7337326a-336a-1d08-629b-7d4679f8e382','sonnensystem',99,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiA1LCAidG90YWwiOiAyMCwgImZpcnN0VHJ5IjogZmFsc2V9') USING utf8mb4),171000,'2026-07-08 12:36:38');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'sonnensystem',26,171,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiA1LCAidG90YWwiOiAyMCwgImZpcnN0VHJ5IjogZmFsc2V9') USING utf8mb4),'2026-07-08 12:36:38');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('7337326a-336a-1d08-629b-7d4679f8e382','klima',99,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE3LjU3LCAiZmluYWxfZmxvb2RlZF9wY3QiOiA2OSwgImZpbmFsX2J1ZGdldCI6IC00NSwgImZpbmFsX2NvMiI6IDQ4NCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),358000,'2026-05-28 10:53:59');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'klima',31,358,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE3LjU3LCAiZmluYWxfZmxvb2RlZF9wY3QiOiA2OSwgImZpbmFsX2J1ZGdldCI6IC00NSwgImZpbmFsX2NvMiI6IDQ4NCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),'2026-05-28 10:53:59');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('7337326a-336a-1d08-629b-7d4679f8e382','eu-werkstatt',99,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogMiwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),229000,'2026-05-22 08:33:43');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'eu-werkstatt',22,229,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogMiwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),'2026-05-22 08:33:43');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('7337326a-336a-1d08-629b-7d4679f8e382','logistik',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJvcmRlcnNEZWxpdmVyZWQiOiA0LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogLTEwMH0=') USING utf8mb4),395000,'2026-05-14 13:10:38');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'logistik',36,395,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJvcmRlcnNEZWxpdmVyZWQiOiA0LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogLTEwMH0=') USING utf8mb4),'2026-05-14 13:10:38');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('7337326a-336a-1d08-629b-7d4679f8e382','tourismusregion',99,CONVERT(FROM_BASE64('eyJzY29yZSI6IDI5fQ==') USING utf8mb4),295000,'2026-06-01 15:49:23');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'tourismusregion',29,295,CONVERT(FROM_BASE64('eyJzY29yZSI6IDI5fQ==') USING utf8mb4),'2026-06-01 15:49:23');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('7337326a-336a-1d08-629b-7d4679f8e382','weltkueche',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJjb21wbGV0ZWREaXNoZXMiOiAzLCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogMTF9') USING utf8mb4),600000,'2026-06-13 15:59:21');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'weltkueche',26,600,CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJjb21wbGV0ZWREaXNoZXMiOiAzLCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogMTF9') USING utf8mb4),'2026-06-13 15:59:21');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('7337326a-336a-1d08-629b-7d4679f8e382','farmer',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJoaXRfcmF0ZSI6IDM1LCAieWVhciI6IDUsICJjcm9wc191c2VkIjogMn0=') USING utf8mb4),263000,'2026-06-18 11:21:20');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'farmer',35,263,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJoaXRfcmF0ZSI6IDM1LCAieWVhciI6IDUsICJjcm9wc191c2VkIjogMn0=') USING utf8mb4),'2026-06-18 11:21:20');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('7337326a-336a-1d08-629b-7d4679f8e382','eu-werkstatt',99,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogMywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),339000,'2026-05-27 12:13:09');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),99,'eu-werkstatt',34,339,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogMywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),'2026-05-27 12:13:09');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),'busfahrt',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),'heli',1,10,1,1);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),'energiemanager',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),'sonnensystem',1,10,1,1);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),'klima',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),'eu-werkstatt',1,30,2,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),'logistik',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),'tourismusregion',1,10,1,1);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),'weltkueche',1,10,1,1);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='hannes' AND class_id=99 LIMIT 1),'farmer',1,20,1,2);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('9fc2345a-18d4-741c-c36d-31fcb2cfc4de',99,'Felix','2025-10-01 08:00:00','2026-07-18 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9fc2345a-18d4-741c-c36d-31fcb2cfc4de','sonnensystem',99,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiA4LCAidG90YWwiOiAyMCwgImZpcnN0VHJ5IjogZmFsc2V9') USING utf8mb4),551000,'2026-06-07 11:03:18');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1),99,'sonnensystem',41,551,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiA4LCAidG90YWwiOiAyMCwgImZpcnN0VHJ5IjogZmFsc2V9') USING utf8mb4),'2026-06-07 11:03:18');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9fc2345a-18d4-741c-c36d-31fcb2cfc4de','kofferdetektiv',99,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAzLCAiY29ycmVjdF9maXJzdF90cnkiOiAzLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDUuOH0=') USING utf8mb4),564000,'2026-06-20 14:23:31');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1),99,'kofferdetektiv',47,564,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAzLCAiY29ycmVjdF9maXJzdF90cnkiOiAzLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDUuOH0=') USING utf8mb4),'2026-06-20 14:23:31');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9fc2345a-18d4-741c-c36d-31fcb2cfc4de','tourismusregion',99,CONVERT(FROM_BASE64('eyJzY29yZSI6IDUxfQ==') USING utf8mb4),456000,'2026-06-22 14:31:24');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1),99,'tourismusregion',51,456,CONVERT(FROM_BASE64('eyJzY29yZSI6IDUxfQ==') USING utf8mb4),'2026-06-22 14:31:24');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9fc2345a-18d4-741c-c36d-31fcb2cfc4de','eu-werkstatt',99,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),254000,'2026-06-10 11:20:06');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1),99,'eu-werkstatt',42,254,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),'2026-06-10 11:20:06');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('9fc2345a-18d4-741c-c36d-31fcb2cfc4de','tourismustal',99,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiAzLCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA1MiwgIm5hdHVyZSI6IDUyLCAibW9uZXkiOiAxMDB9') USING utf8mb4),184000,'2026-07-16 08:23:29');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1),99,'tourismustal',52,184,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiAzLCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA1MiwgIm5hdHVyZSI6IDUyLCAibW9uZXkiOiAxMDB9') USING utf8mb4),'2026-07-16 08:23:29');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1),'sonnensystem',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1),'kofferdetektiv',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1),'tourismusregion',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1),'eu-werkstatt',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='felix' AND class_id=99 LIMIT 1),'tourismustal',1,30,1,3);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('968adea5-e6d1-58f3-725f-2a4d47384c86',99,'Leon','2025-10-01 08:00:00','2026-07-18 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('968adea5-e6d1-58f3-725f-2a4d47384c86','klima',99,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjkxLCAiZmluYWxfZmxvb2RlZF9wY3QiOiA0NywgImZpbmFsX2J1ZGdldCI6IDEzMCwgImZpbmFsX2NvMiI6IDQ1MCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),290000,'2026-06-22 12:15:37');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1),99,'klima',53,290,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjkxLCAiZmluYWxfZmxvb2RlZF9wY3QiOiA0NywgImZpbmFsX2J1ZGdldCI6IDEzMCwgImZpbmFsX2NvMiI6IDQ1MCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),'2026-06-22 12:15:37');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('968adea5-e6d1-58f3-725f-2a4d47384c86','farmer',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJoaXRfcmF0ZSI6IDM4LCAieWVhciI6IDYsICJjcm9wc191c2VkIjogMn0=') USING utf8mb4),403000,'2026-05-14 14:42:41');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1),99,'farmer',38,403,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJoaXRfcmF0ZSI6IDM4LCAieWVhciI6IDYsICJjcm9wc191c2VkIjogMn0=') USING utf8mb4),'2026-05-14 14:42:41');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('968adea5-e6d1-58f3-725f-2a4d47384c86','sonnensystem',99,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiA5LCAidG90YWwiOiAyMCwgImZpcnN0VHJ5IjogZmFsc2V9') USING utf8mb4),489000,'2026-07-12 09:31:39');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1),99,'sonnensystem',43,489,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiA5LCAidG90YWwiOiAyMCwgImZpcnN0VHJ5IjogZmFsc2V9') USING utf8mb4),'2026-07-12 09:31:39');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('968adea5-e6d1-58f3-725f-2a4d47384c86','fluss',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJiaW9kaXYiOiA0MCwgImVjb25vbXkiOiA0MCwgImZsb29kIjogNjAsICJmb29kIjogNDB9') USING utf8mb4),593000,'2026-06-16 12:26:09');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1),99,'fluss',40,593,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJiaW9kaXYiOiA0MCwgImVjb25vbXkiOiA0MCwgImZsb29kIjogNjAsICJmb29kIjogNDB9') USING utf8mb4),'2026-06-16 12:26:09');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('968adea5-e6d1-58f3-725f-2a4d47384c86','kofferdetektiv',99,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAzLCAiY29ycmVjdF9maXJzdF90cnkiOiAzLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDUuOX0=') USING utf8mb4),217000,'2026-07-06 13:20:20');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1),99,'kofferdetektiv',46,217,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAzLCAiY29ycmVjdF9maXJzdF90cnkiOiAzLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDUuOX0=') USING utf8mb4),'2026-07-06 13:20:20');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('968adea5-e6d1-58f3-725f-2a4d47384c86','klima',99,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE3LjQ1LCAiZmluYWxfZmxvb2RlZF9wY3QiOiA2NSwgImZpbmFsX2J1ZGdldCI6IC0yNSwgImZpbmFsX2NvMiI6IDQ3OCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),517000,'2026-05-22 12:06:02');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1),99,'klima',35,517,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE3LjQ1LCAiZmluYWxfZmxvb2RlZF9wY3QiOiA2NSwgImZpbmFsX2J1ZGdldCI6IC0yNSwgImZpbmFsX2NvMiI6IDQ3OCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),'2026-05-22 12:06:02');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1),'klima',2,50,2,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1),'farmer',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1),'sonnensystem',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1),'fluss',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='leon' AND class_id=99 LIMIT 1),'kofferdetektiv',1,20,1,2);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('1a262758-cef2-8ca9-fd98-62dbfacdba01',99,'David','2025-10-01 08:00:00','2026-07-18 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('1a262758-cef2-8ca9-fd98-62dbfacdba01','heli',99,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDgwLCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4),479000,'2026-07-03 09:26:20');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1),99,'heli',80,479,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDgwLCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4),'2026-07-03 09:26:20');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('1a262758-cef2-8ca9-fd98-62dbfacdba01','logistik',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA4LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogODYwfQ==') USING utf8mb4),522000,'2026-05-16 11:39:00');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1),99,'logistik',83,522,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA4LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogODYwfQ==') USING utf8mb4),'2026-05-16 11:39:00');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('1a262758-cef2-8ca9-fd98-62dbfacdba01','tourismustal',99,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA2LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA5MiwgIm5hdHVyZSI6IDkyLCAibW9uZXkiOiAxMDB9') USING utf8mb4),422000,'2026-05-14 12:16:06');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1),99,'tourismustal',92,422,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA2LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA5MiwgIm5hdHVyZSI6IDkyLCAibW9uZXkiOiAxMDB9') USING utf8mb4),'2026-05-14 12:16:06');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('1a262758-cef2-8ca9-fd98-62dbfacdba01','busfahrt',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJ3b25PcmRlcnMiOiA4LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogOCwgImF2Z1RhcEttIjogMzN9') USING utf8mb4),304000,'2026-07-02 13:55:21');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1),99,'busfahrt',98,304,CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJ3b25PcmRlcnMiOiA4LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogOCwgImF2Z1RhcEttIjogMzN9') USING utf8mb4),'2026-07-02 13:55:21');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1),'heli',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1),'logistik',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1),'tourismustal',2,55,1,5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='david' AND class_id=99 LIMIT 1),'busfahrt',2,55,1,5);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('954ae1b7-f6c8-4c89-df5f-2e912e13757f',99,'Emma','2025-10-01 08:00:00','2026-07-18 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('954ae1b7-f6c8-4c89-df5f-2e912e13757f','klima',99,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjQ5LCAiZmluYWxfZmxvb2RlZF9wY3QiOiAzMywgImZpbmFsX2J1ZGdldCI6IDI3MCwgImZpbmFsX2NvMiI6IDQzMCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),155000,'2026-06-02 09:28:57');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1),99,'klima',67,155,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjQ5LCAiZmluYWxfZmxvb2RlZF9wY3QiOiAzMywgImZpbmFsX2J1ZGdldCI6IDI3MCwgImZpbmFsX2NvMiI6IDQzMCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),'2026-06-02 09:28:57');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('954ae1b7-f6c8-4c89-df5f-2e912e13757f','busfahrt',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJ3b25PcmRlcnMiOiA4LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogOCwgImF2Z1RhcEttIjogNDB9') USING utf8mb4),440000,'2026-06-19 09:53:00');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1),99,'busfahrt',94,440,CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJ3b25PcmRlcnMiOiA4LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogOCwgImF2Z1RhcEttIjogNDB9') USING utf8mb4),'2026-06-19 09:53:00');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('954ae1b7-f6c8-4c89-df5f-2e912e13757f','logistik',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA4LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNzgwfQ==') USING utf8mb4),523000,'2026-07-04 09:28:11');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1),99,'logistik',79,523,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA4LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNzgwfQ==') USING utf8mb4),'2026-07-04 09:28:11');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('954ae1b7-f6c8-4c89-df5f-2e912e13757f','fluss',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA4OSwgImVjb25vbXkiOiA4OSwgImZsb29kIjogMTEsICJmb29kIjogODl9') USING utf8mb4),554000,'2026-06-07 08:42:14');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1),99,'fluss',89,554,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA4OSwgImVjb25vbXkiOiA4OSwgImZsb29kIjogMTEsICJmb29kIjogODl9') USING utf8mb4),'2026-06-07 08:42:14');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('954ae1b7-f6c8-4c89-df5f-2e912e13757f','weltkueche',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJjb21wbGV0ZWREaXNoZXMiOiA4LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogMn0=') USING utf8mb4),215000,'2026-06-27 15:45:04');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1),99,'weltkueche',85,215,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJjb21wbGV0ZWREaXNoZXMiOiA4LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogMn0=') USING utf8mb4),'2026-06-27 15:45:04');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1),'klima',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1),'busfahrt',2,55,1,5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1),'logistik',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1),'fluss',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='emma' AND class_id=99 LIMIT 1),'weltkueche',1,40,1,4);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('6896fcd5-98a8-f679-8e30-35802a21e979',99,'Ida','2025-10-01 08:00:00','2026-07-18 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('6896fcd5-98a8-f679-8e30-35802a21e979','tourismustal',99,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA2MSwgIm5hdHVyZSI6IDYxLCAibW9uZXkiOiAxMDB9') USING utf8mb4),213000,'2026-06-29 08:20:19');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),99,'tourismustal',61,213,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA2MSwgIm5hdHVyZSI6IDYxLCAibW9uZXkiOiAxMDB9') USING utf8mb4),'2026-06-29 08:20:19');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('6896fcd5-98a8-f679-8e30-35802a21e979','klima',99,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjcsICJmaW5hbF9mbG9vZGVkX3BjdCI6IDQwLCAiZmluYWxfYnVkZ2V0IjogMjAwLCAiZmluYWxfY28yIjogNDQwLCAiZmluYWxfcG9wdWxhdGlvbiI6IDI1MH0=') USING utf8mb4),326000,'2026-05-21 14:49:22');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),99,'klima',60,326,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjcsICJmaW5hbF9mbG9vZGVkX3BjdCI6IDQwLCAiZmluYWxfYnVkZ2V0IjogMjAwLCAiZmluYWxfY28yIjogNDQwLCAiZmluYWxfcG9wdWxhdGlvbiI6IDI1MH0=') USING utf8mb4),'2026-05-21 14:49:22');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('6896fcd5-98a8-f679-8e30-35802a21e979','klima',99,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2Ljk0LCAiZmluYWxfZmxvb2RlZF9wY3QiOiA0OCwgImZpbmFsX2J1ZGdldCI6IDEyMCwgImZpbmFsX2NvMiI6IDQ1MiwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),257000,'2026-07-17 09:31:57');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),99,'klima',52,257,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2Ljk0LCAiZmluYWxfZmxvb2RlZF9wY3QiOiA0OCwgImZpbmFsX2J1ZGdldCI6IDEyMCwgImZpbmFsX2NvMiI6IDQ1MiwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),'2026-07-17 09:31:57');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('6896fcd5-98a8-f679-8e30-35802a21e979','logistik',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJvcmRlcnNEZWxpdmVyZWQiOiA2LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNDQwfQ==') USING utf8mb4),242000,'2026-06-24 13:43:22');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),99,'logistik',62,242,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJvcmRlcnNEZWxpdmVyZWQiOiA2LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNDQwfQ==') USING utf8mb4),'2026-06-24 13:43:22');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('6896fcd5-98a8-f679-8e30-35802a21e979','farmer',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJoaXRfcmF0ZSI6IDUwLCAieWVhciI6IDgsICJjcm9wc191c2VkIjogM30=') USING utf8mb4),386000,'2026-05-21 14:25:19');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),99,'farmer',50,386,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJoaXRfcmF0ZSI6IDUwLCAieWVhciI6IDgsICJjcm9wc191c2VkIjogM30=') USING utf8mb4),'2026-05-21 14:25:19');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('6896fcd5-98a8-f679-8e30-35802a21e979','busfahrt',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJ3b25PcmRlcnMiOiA1LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNSwgImF2Z1RhcEttIjogMTAwfQ==') USING utf8mb4),370000,'2026-07-02 12:24:05');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),99,'busfahrt',59,370,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJ3b25PcmRlcnMiOiA1LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNSwgImF2Z1RhcEttIjogMTAwfQ==') USING utf8mb4),'2026-07-02 12:24:05');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('6896fcd5-98a8-f679-8e30-35802a21e979','eu-werkstatt',99,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNSwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),546000,'2026-07-01 13:55:41');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),99,'eu-werkstatt',46,546,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNSwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),'2026-07-01 13:55:41');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('6896fcd5-98a8-f679-8e30-35802a21e979','eu-werkstatt',99,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNSwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),342000,'2026-05-24 09:28:29');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),99,'eu-werkstatt',48,342,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNSwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),'2026-05-24 09:28:29');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),'tourismustal',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),'klima',2,60,2,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),'logistik',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),'farmer',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),'busfahrt',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ida' AND class_id=99 LIMIT 1),'eu-werkstatt',1,40,2,2);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('81db2a71-8af3-6b9d-84e0-6384cf101f2f',99,'Katharina','2025-10-01 08:00:00','2026-07-18 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('81db2a71-8af3-6b9d-84e0-6384cf101f2f','fluss',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJiaW9kaXYiOiA2NCwgImVjb25vbXkiOiA2NCwgImZsb29kIjogMzYsICJmb29kIjogNjR9') USING utf8mb4),181000,'2026-07-15 15:46:23');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),99,'fluss',64,181,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJiaW9kaXYiOiA2NCwgImVjb25vbXkiOiA2NCwgImZsb29kIjogMzYsICJmb29kIjogNjR9') USING utf8mb4),'2026-07-15 15:46:23');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('81db2a71-8af3-6b9d-84e0-6384cf101f2f','sonnensystem',99,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxMCwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4),403000,'2026-05-12 15:00:28');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),99,'sonnensystem',50,403,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxMCwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4),'2026-05-12 15:00:28');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('81db2a71-8af3-6b9d-84e0-6384cf101f2f','tourismustal',99,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA2NCwgIm5hdHVyZSI6IDY0LCAibW9uZXkiOiAxMDB9') USING utf8mb4),489000,'2026-06-23 15:19:10');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),99,'tourismustal',64,489,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA2NCwgIm5hdHVyZSI6IDY0LCAibW9uZXkiOiAxMDB9') USING utf8mb4),'2026-06-23 15:19:10');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('81db2a71-8af3-6b9d-84e0-6384cf101f2f','tourismustal',99,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA2MCwgIm5hdHVyZSI6IDYwLCAibW9uZXkiOiAxMDB9') USING utf8mb4),310000,'2026-07-11 09:19:38');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),99,'tourismustal',60,310,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA2MCwgIm5hdHVyZSI6IDYwLCAibW9uZXkiOiAxMDB9') USING utf8mb4),'2026-07-11 09:19:38');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('81db2a71-8af3-6b9d-84e0-6384cf101f2f','logistik',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJvcmRlcnNEZWxpdmVyZWQiOiA1LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogMjYwfQ==') USING utf8mb4),371000,'2026-06-30 14:43:56');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),99,'logistik',53,371,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJvcmRlcnNEZWxpdmVyZWQiOiA1LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogMjYwfQ==') USING utf8mb4),'2026-06-30 14:43:56');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('81db2a71-8af3-6b9d-84e0-6384cf101f2f','klima',99,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjkxLCAiZmluYWxfZmxvb2RlZF9wY3QiOiA0NywgImZpbmFsX2J1ZGdldCI6IDEzMCwgImZpbmFsX2NvMiI6IDQ1MCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),387000,'2026-06-26 14:43:15');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),99,'klima',53,387,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjkxLCAiZmluYWxfZmxvb2RlZF9wY3QiOiA0NywgImZpbmFsX2J1ZGdldCI6IDEzMCwgImZpbmFsX2NvMiI6IDQ1MCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),'2026-06-26 14:43:15');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('81db2a71-8af3-6b9d-84e0-6384cf101f2f','farmer',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJoaXRfcmF0ZSI6IDYzLCAieWVhciI6IDksICJjcm9wc191c2VkIjogNH0=') USING utf8mb4),589000,'2026-07-05 09:23:08');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),99,'farmer',63,589,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJoaXRfcmF0ZSI6IDYzLCAieWVhciI6IDksICJjcm9wc191c2VkIjogNH0=') USING utf8mb4),'2026-07-05 09:23:08');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),'fluss',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),'sonnensystem',1,20,1,2);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),'tourismustal',2,60,2,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),'logistik',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),'klima',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='katharina' AND class_id=99 LIMIT 1),'farmer',1,30,1,3);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('4d8a7c25-49ff-ee06-7bec-42b5ac7f6070',99,'Ben','2025-10-01 08:00:00','2026-07-18 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('4d8a7c25-49ff-ee06-7bec-42b5ac7f6070','tourismusregion',99,CONVERT(FROM_BASE64('eyJzY29yZSI6IDYxfQ==') USING utf8mb4),244000,'2026-07-08 13:48:41');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),99,'tourismusregion',61,244,CONVERT(FROM_BASE64('eyJzY29yZSI6IDYxfQ==') USING utf8mb4),'2026-07-08 13:48:41');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('4d8a7c25-49ff-ee06-7bec-42b5ac7f6070','logistik',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJvcmRlcnNEZWxpdmVyZWQiOiA3LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNTYwfQ==') USING utf8mb4),414000,'2026-05-31 08:59:14');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),99,'logistik',68,414,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJvcmRlcnNEZWxpdmVyZWQiOiA3LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNTYwfQ==') USING utf8mb4),'2026-05-31 08:59:14');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('4d8a7c25-49ff-ee06-7bec-42b5ac7f6070','eu-werkstatt',99,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNiwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4),165000,'2026-07-10 14:25:52');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),99,'eu-werkstatt',63,165,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNiwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4),'2026-07-10 14:25:52');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('4d8a7c25-49ff-ee06-7bec-42b5ac7f6070','eu-werkstatt',99,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogOCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4),262000,'2026-06-29 09:58:37');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),99,'eu-werkstatt',81,262,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogOCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4),'2026-06-29 09:58:37');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('4d8a7c25-49ff-ee06-7bec-42b5ac7f6070','sonnensystem',99,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxNiwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4),140000,'2026-06-04 09:10:05');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),99,'sonnensystem',79,140,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxNiwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4),'2026-06-04 09:10:05');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('4d8a7c25-49ff-ee06-7bec-42b5ac7f6070','klima',99,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjQ2LCAiZmluYWxfZmxvb2RlZF9wY3QiOiAzMiwgImZpbmFsX2J1ZGdldCI6IDI4MCwgImZpbmFsX2NvMiI6IDQyOCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),389000,'2026-07-10 09:04:09');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),99,'klima',68,389,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjQ2LCAiZmluYWxfZmxvb2RlZF9wY3QiOiAzMiwgImZpbmFsX2J1ZGdldCI6IDI4MCwgImZpbmFsX2NvMiI6IDQyOCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),'2026-07-10 09:04:09');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('4d8a7c25-49ff-ee06-7bec-42b5ac7f6070','farmer',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDgxLCAieWVhciI6IDEyLCAiY3JvcHNfdXNlZCI6IDV9') USING utf8mb4),470000,'2026-06-13 08:27:24');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),99,'farmer',81,470,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDgxLCAieWVhciI6IDEyLCAiY3JvcHNfdXNlZCI6IDV9') USING utf8mb4),'2026-06-13 08:27:24');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),'tourismusregion',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),'logistik',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),'eu-werkstatt',2,70,2,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),'sonnensystem',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),'klima',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='ben' AND class_id=99 LIMIT 1),'farmer',1,40,1,4);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('8d3dff3d-941a-b1c4-6595-4ff570609460',99,'Clara','2025-10-01 08:00:00','2026-07-18 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8d3dff3d-941a-b1c4-6595-4ff570609460','tourismustal',99,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA1LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA3NiwgIm5hdHVyZSI6IDc2LCAibW9uZXkiOiAxMDB9') USING utf8mb4),406000,'2026-06-20 08:56:00');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),99,'tourismustal',76,406,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA1LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA3NiwgIm5hdHVyZSI6IDc2LCAibW9uZXkiOiAxMDB9') USING utf8mb4),'2026-06-20 08:56:00');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8d3dff3d-941a-b1c4-6595-4ff570609460','kofferdetektiv',99,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA0LCAiY29ycmVjdF9maXJzdF90cnkiOiA0LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDMuM30=') USING utf8mb4),529000,'2026-06-15 13:10:30');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),99,'kofferdetektiv',74,529,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA0LCAiY29ycmVjdF9maXJzdF90cnkiOiA0LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDMuM30=') USING utf8mb4),'2026-06-15 13:10:30');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8d3dff3d-941a-b1c4-6595-4ff570609460','busfahrt',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJ3b25PcmRlcnMiOiA1LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNSwgImF2Z1RhcEttIjogODh9') USING utf8mb4),175000,'2026-06-25 10:36:29');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),99,'busfahrt',66,175,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJ3b25PcmRlcnMiOiA1LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNSwgImF2Z1RhcEttIjogODh9') USING utf8mb4),'2026-06-25 10:36:29');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8d3dff3d-941a-b1c4-6595-4ff570609460','busfahrt',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJ3b25PcmRlcnMiOiA1LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNSwgImF2Z1RhcEttIjogODh9') USING utf8mb4),560000,'2026-07-06 09:04:36');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),99,'busfahrt',66,560,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJ3b25PcmRlcnMiOiA1LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNSwgImF2Z1RhcEttIjogODh9') USING utf8mb4),'2026-07-06 09:04:36');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8d3dff3d-941a-b1c4-6595-4ff570609460','eu-werkstatt',99,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4),133000,'2026-07-04 12:29:00');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),99,'eu-werkstatt',66,133,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4),'2026-07-04 12:29:00');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8d3dff3d-941a-b1c4-6595-4ff570609460','tourismusregion',99,CONVERT(FROM_BASE64('eyJzY29yZSI6IDY1fQ==') USING utf8mb4),287000,'2026-07-12 15:04:07');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),99,'tourismusregion',65,287,CONVERT(FROM_BASE64('eyJzY29yZSI6IDY1fQ==') USING utf8mb4),'2026-07-12 15:04:07');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),'tourismustal',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),'kofferdetektiv',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),'busfahrt',2,60,2,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),'eu-werkstatt',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='clara' AND class_id=99 LIMIT 1),'tourismusregion',1,30,1,3);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('73b668d2-ba2e-4ce9-1531-51f2c21ca8a7',99,'Greta','2025-10-01 08:00:00','2026-07-18 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('73b668d2-ba2e-4ce9-1531-51f2c21ca8a7','farmer',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDcyLCAieWVhciI6IDExLCAiY3JvcHNfdXNlZCI6IDR9') USING utf8mb4),215000,'2026-07-14 09:01:20');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),99,'farmer',72,215,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDcyLCAieWVhciI6IDExLCAiY3JvcHNfdXNlZCI6IDR9') USING utf8mb4),'2026-07-14 09:01:20');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('73b668d2-ba2e-4ce9-1531-51f2c21ca8a7','klima',99,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE1Ljk1LCAiZmluYWxfZmxvb2RlZF9wY3QiOiAxNSwgImZpbmFsX2J1ZGdldCI6IDQ1MCwgImZpbmFsX2NvMiI6IDQwMiwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),309000,'2026-06-24 08:40:26');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),99,'klima',85,309,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE1Ljk1LCAiZmluYWxfZmxvb2RlZF9wY3QiOiAxNSwgImZpbmFsX2J1ZGdldCI6IDQ1MCwgImZpbmFsX2NvMiI6IDQwMiwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),'2026-06-24 08:40:26');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('73b668d2-ba2e-4ce9-1531-51f2c21ca8a7','kofferdetektiv',99,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAzLCAiY29ycmVjdF9maXJzdF90cnkiOiAzLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDUuMn0=') USING utf8mb4),272000,'2026-06-10 13:29:11');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),99,'kofferdetektiv',53,272,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAzLCAiY29ycmVjdF9maXJzdF90cnkiOiAzLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDUuMn0=') USING utf8mb4),'2026-06-10 13:29:11');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('73b668d2-ba2e-4ce9-1531-51f2c21ca8a7','heli',99,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAzLCAicGxhblBjdCI6IDY4LCAic3RhcnRTY29yZSI6IDMsICJsYW5kaW5nU2NvcmUiOiAzfQ==') USING utf8mb4),246000,'2026-07-04 10:38:11');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),99,'heli',68,246,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAzLCAicGxhblBjdCI6IDY4LCAic3RhcnRTY29yZSI6IDMsICJsYW5kaW5nU2NvcmUiOiAzfQ==') USING utf8mb4),'2026-07-04 10:38:11');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('73b668d2-ba2e-4ce9-1531-51f2c21ca8a7','energiemanager',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJibG9ja3NCYWxhbmNlZCI6IDcsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDQsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),419000,'2026-07-01 10:45:58');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),99,'energiemanager',62,419,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJibG9ja3NCYWxhbmNlZCI6IDcsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDQsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),'2026-07-01 10:45:58');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('73b668d2-ba2e-4ce9-1531-51f2c21ca8a7','farmer',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJoaXRfcmF0ZSI6IDY4LCAieWVhciI6IDEwLCAiY3JvcHNfdXNlZCI6IDR9') USING utf8mb4),472000,'2026-06-25 09:27:36');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),99,'farmer',68,472,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJoaXRfcmF0ZSI6IDY4LCAieWVhciI6IDEwLCAiY3JvcHNfdXNlZCI6IDR9') USING utf8mb4),'2026-06-25 09:27:36');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('73b668d2-ba2e-4ce9-1531-51f2c21ca8a7','energiemanager',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDksICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDQsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),590000,'2026-07-15 10:18:15');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),99,'energiemanager',74,590,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDksICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDQsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),'2026-07-15 10:18:15');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('73b668d2-ba2e-4ce9-1531-51f2c21ca8a7','fluss',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA3MywgImVjb25vbXkiOiA3MywgImZsb29kIjogMjcsICJmb29kIjogNzN9') USING utf8mb4),189000,'2026-06-19 14:40:41');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),99,'fluss',73,189,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA3MywgImVjb25vbXkiOiA3MywgImZsb29kIjogMjcsICJmb29kIjogNzN9') USING utf8mb4),'2026-06-19 14:40:41');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),'farmer',2,70,2,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),'klima',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),'kofferdetektiv',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),'heli',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),'energiemanager',2,70,2,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='greta' AND class_id=99 LIMIT 1),'fluss',1,40,1,4);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('5289279c-6510-8069-5242-0cb8db0dca84',99,'Jakob','2025-10-01 08:00:00','2026-07-18 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5289279c-6510-8069-5242-0cb8db0dca84','logistik',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA4LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogODgwfQ==') USING utf8mb4),380000,'2026-06-02 15:47:31');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),99,'logistik',84,380,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA4LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogODgwfQ==') USING utf8mb4),'2026-06-02 15:47:31');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5289279c-6510-8069-5242-0cb8db0dca84','heli',99,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAzLCAicGxhblBjdCI6IDY2LCAic3RhcnRTY29yZSI6IDMsICJsYW5kaW5nU2NvcmUiOiAzfQ==') USING utf8mb4),326000,'2026-06-07 13:36:26');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),99,'heli',66,326,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAzLCAicGxhblBjdCI6IDY2LCAic3RhcnRTY29yZSI6IDMsICJsYW5kaW5nU2NvcmUiOiAzfQ==') USING utf8mb4),'2026-06-07 13:36:26');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5289279c-6510-8069-5242-0cb8db0dca84','klima',99,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjM0LCAiZmluYWxfZmxvb2RlZF9wY3QiOiAyOCwgImZpbmFsX2J1ZGdldCI6IDMyMCwgImZpbmFsX2NvMiI6IDQyMiwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),289000,'2026-05-20 10:45:40');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),99,'klima',72,289,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjM0LCAiZmluYWxfZmxvb2RlZF9wY3QiOiAyOCwgImZpbmFsX2J1ZGdldCI6IDMyMCwgImZpbmFsX2NvMiI6IDQyMiwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),'2026-05-20 10:45:40');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5289279c-6510-8069-5242-0cb8db0dca84','klima',99,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjQsICJmaW5hbF9mbG9vZGVkX3BjdCI6IDMwLCAiZmluYWxfYnVkZ2V0IjogMzAwLCAiZmluYWxfY28yIjogNDI1LCAiZmluYWxfcG9wdWxhdGlvbiI6IDI1MH0=') USING utf8mb4),141000,'2026-05-15 15:46:54');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),99,'klima',70,141,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjQsICJmaW5hbF9mbG9vZGVkX3BjdCI6IDMwLCAiZmluYWxfYnVkZ2V0IjogMzAwLCAiZmluYWxfY28yIjogNDI1LCAiZmluYWxfcG9wdWxhdGlvbiI6IDI1MH0=') USING utf8mb4),'2026-05-15 15:46:54');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5289279c-6510-8069-5242-0cb8db0dca84','tourismustal',99,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA1LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA4MSwgIm5hdHVyZSI6IDgxLCAibW9uZXkiOiAxMDB9') USING utf8mb4),359000,'2026-07-07 08:40:33');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),99,'tourismustal',81,359,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA1LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA4MSwgIm5hdHVyZSI6IDgxLCAibW9uZXkiOiAxMDB9') USING utf8mb4),'2026-07-07 08:40:33');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5289279c-6510-8069-5242-0cb8db0dca84','klima',99,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjMxLCAiZmluYWxfZmxvb2RlZF9wY3QiOiAyNywgImZpbmFsX2J1ZGdldCI6IDMzMCwgImZpbmFsX2NvMiI6IDQyMCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),355000,'2026-05-23 08:14:13');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),99,'klima',73,355,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjMxLCAiZmluYWxfZmxvb2RlZF9wY3QiOiAyNywgImZpbmFsX2J1ZGdldCI6IDMzMCwgImZpbmFsX2NvMiI6IDQyMCwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),'2026-05-23 08:14:13');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5289279c-6510-8069-5242-0cb8db0dca84','busfahrt',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA2LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNiwgImF2Z1RhcEttIjogNjZ9') USING utf8mb4),435000,'2026-07-11 14:10:40');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),99,'busfahrt',79,435,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJ3b25PcmRlcnMiOiA2LCAidG90YWxPcmRlcnMiOiA4LCAicXVpekZpcnN0VHJ5IjogNiwgImF2Z1RhcEttIjogNjZ9') USING utf8mb4),'2026-07-11 14:10:40');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5289279c-6510-8069-5242-0cb8db0dca84','farmer',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDgwLCAieWVhciI6IDEyLCAiY3JvcHNfdXNlZCI6IDV9') USING utf8mb4),446000,'2026-05-30 13:08:33');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),99,'farmer',80,446,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDgwLCAieWVhciI6IDEyLCAiY3JvcHNfdXNlZCI6IDV9') USING utf8mb4),'2026-05-30 13:08:33');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('5289279c-6510-8069-5242-0cb8db0dca84','sonnensystem',99,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxOCwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IHRydWV9') USING utf8mb4),189000,'2026-06-26 15:08:04');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),99,'sonnensystem',89,189,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxOCwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IHRydWV9') USING utf8mb4),'2026-06-26 15:08:04');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),'logistik',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),'heli',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),'klima',2,120,3,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),'tourismustal',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),'busfahrt',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),'farmer',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='jakob_s' AND class_id=99 LIMIT 1),'sonnensystem',1,40,1,4);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('92473eb0-640e-450c-a2b4-dd051c1ceba0',99,'Marlene','2025-10-01 08:00:00','2026-07-18 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('92473eb0-640e-450c-a2b4-dd051c1ceba0','farmer',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDgzLCAieWVhciI6IDEyLCAiY3JvcHNfdXNlZCI6IDV9') USING utf8mb4),448000,'2026-06-21 12:44:55');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),99,'farmer',83,448,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDgzLCAieWVhciI6IDEyLCAiY3JvcHNfdXNlZCI6IDV9') USING utf8mb4),'2026-06-21 12:44:55');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('92473eb0-640e-450c-a2b4-dd051c1ceba0','energiemanager',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDgsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDQsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),240000,'2026-06-29 13:31:04');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),99,'energiemanager',70,240,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDgsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDQsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),'2026-06-29 13:31:04');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('92473eb0-640e-450c-a2b4-dd051c1ceba0','eu-werkstatt',99,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4),421000,'2026-06-13 09:02:32');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),99,'eu-werkstatt',68,421,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNywgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4),'2026-06-13 09:02:32');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('92473eb0-640e-450c-a2b4-dd051c1ceba0','logistik',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJvcmRlcnNEZWxpdmVyZWQiOiA2LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNDAwfQ==') USING utf8mb4),187000,'2026-07-17 11:53:54');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),99,'logistik',60,187,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJvcmRlcnNEZWxpdmVyZWQiOiA2LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNDAwfQ==') USING utf8mb4),'2026-07-17 11:53:54');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('92473eb0-640e-450c-a2b4-dd051c1ceba0','logistik',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJvcmRlcnNEZWxpdmVyZWQiOiA2LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNDIwfQ==') USING utf8mb4),397000,'2026-05-23 14:52:52');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),99,'logistik',61,397,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJvcmRlcnNEZWxpdmVyZWQiOiA2LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogNDIwfQ==') USING utf8mb4),'2026-05-23 14:52:52');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('92473eb0-640e-450c-a2b4-dd051c1ceba0','fluss',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA3NywgImVjb25vbXkiOiA3NywgImZsb29kIjogMjMsICJmb29kIjogNzd9') USING utf8mb4),505000,'2026-06-15 09:50:16');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),99,'fluss',77,505,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA3NywgImVjb25vbXkiOiA3NywgImZsb29kIjogMjMsICJmb29kIjogNzd9') USING utf8mb4),'2026-06-15 09:50:16');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('92473eb0-640e-450c-a2b4-dd051c1ceba0','energiemanager',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDksICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDQsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),377000,'2026-05-16 14:50:34');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),99,'energiemanager',74,377,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDksICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDQsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),'2026-05-16 14:50:34');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),'farmer',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),'energiemanager',2,80,2,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),'eu-werkstatt',1,30,1,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),'logistik',2,60,2,3);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='marlene' AND class_id=99 LIMIT 1),'fluss',1,40,1,4);
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('8314889e-1a3c-55d9-d0e2-36bab9c12ea0',99,'Olivia','2025-10-01 08:00:00','2026-07-18 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8314889e-1a3c-55d9-d0e2-36bab9c12ea0','logistik',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA4LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogODgwfQ==') USING utf8mb4),261000,'2026-05-19 09:04:15');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),99,'logistik',84,261,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA4LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogODgwfQ==') USING utf8mb4),'2026-05-19 09:04:15');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8314889e-1a3c-55d9-d0e2-36bab9c12ea0','kofferdetektiv',99,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuNn0=') USING utf8mb4),333000,'2026-07-08 08:03:07');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),99,'kofferdetektiv',82,333,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA1LCAiY29ycmVjdF9maXJzdF90cnkiOiA1LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDIuNn0=') USING utf8mb4),'2026-07-08 08:03:07');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8314889e-1a3c-55d9-d0e2-36bab9c12ea0','tourismustal',99,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA2LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiAxMDAsICJuYXR1cmUiOiAxMDAsICJtb25leSI6IDEwMH0=') USING utf8mb4),210000,'2026-07-18 09:37:24');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),99,'tourismustal',100,210,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA2LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiAxMDAsICJuYXR1cmUiOiAxMDAsICJtb25leSI6IDEwMH0=') USING utf8mb4),'2026-07-18 09:37:24');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8314889e-1a3c-55d9-d0e2-36bab9c12ea0','farmer',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDc3LCAieWVhciI6IDEyLCAiY3JvcHNfdXNlZCI6IDV9') USING utf8mb4),225000,'2026-05-21 10:20:28');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),99,'farmer',77,225,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDc3LCAieWVhciI6IDEyLCAiY3JvcHNfdXNlZCI6IDV9') USING utf8mb4),'2026-05-21 10:20:28');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8314889e-1a3c-55d9-d0e2-36bab9c12ea0','kofferdetektiv',99,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA2LCAiY29ycmVjdF9maXJzdF90cnkiOiA2LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDEuN30=') USING utf8mb4),202000,'2026-06-12 14:42:26');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),99,'kofferdetektiv',92,202,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA2LCAiY29ycmVjdF9maXJzdF90cnkiOiA2LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDEuN30=') USING utf8mb4),'2026-06-12 14:42:26');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8314889e-1a3c-55d9-d0e2-36bab9c12ea0','tourismustal',99,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA1LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA5MSwgIm5hdHVyZSI6IDkxLCAibW9uZXkiOiAxMDB9') USING utf8mb4),122000,'2026-05-21 08:20:38');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),99,'tourismustal',91,122,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA1LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA5MSwgIm5hdHVyZSI6IDkxLCAibW9uZXkiOiAxMDB9') USING utf8mb4),'2026-05-21 08:20:38');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8314889e-1a3c-55d9-d0e2-36bab9c12ea0','eu-werkstatt',99,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogOCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4),382000,'2026-05-26 12:20:53');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),99,'eu-werkstatt',76,382,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogInN1Y2Nlc3MiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogOCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDB9') USING utf8mb4),'2026-05-26 12:20:53');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8314889e-1a3c-55d9-d0e2-36bab9c12ea0','energiemanager',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDEwLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA1LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4),522000,'2026-06-17 08:39:00');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),99,'energiemanager',84,522,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJibG9ja3NCYWxhbmNlZCI6IDEwLCAiYmxvY2tzVG90YWwiOiAxMiwgImRheXNQbGF5ZWQiOiA1LCAiZGF5c1RvdGFsIjogNn0=') USING utf8mb4),'2026-06-17 08:39:00');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8314889e-1a3c-55d9-d0e2-36bab9c12ea0','logistik',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA5LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogOTIwfQ==') USING utf8mb4),297000,'2026-06-20 09:00:17');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),99,'logistik',86,297,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJvcmRlcnNEZWxpdmVyZWQiOiA5LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogOTIwfQ==') USING utf8mb4),'2026-06-20 09:00:17');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8314889e-1a3c-55d9-d0e2-36bab9c12ea0','farmer',99,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDg4LCAieWVhciI6IDEzLCAiY3JvcHNfdXNlZCI6IDV9') USING utf8mb4),341000,'2026-07-14 14:32:56');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),99,'farmer',88,341,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJoaXRfcmF0ZSI6IDg4LCAieWVhciI6IDEzLCAiY3JvcHNfdXNlZCI6IDV9') USING utf8mb4),'2026-07-14 14:32:56');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),'logistik',2,80,2,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),'kofferdetektiv',2,95,2,5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),'tourismustal',2,110,2,5);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),'farmer',2,80,2,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),'eu-werkstatt',1,40,1,4);
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='olivia' AND class_id=99 LIMIT 1),'energiemanager',1,40,1,4);
SET FOREIGN_KEY_CHECKS=1;
@@ -0,0 +1,113 @@
SET FOREIGN_KEY_CHECKS=0;
-- Klasse 99 umbenennen
UPDATE classes SET name='4b Klasse' WHERE id=99;
-- Cleanup 3b (idempotent)
DELETE FROM player_progress WHERE student_id IN (SELECT id FROM students WHERE username IN ('pia_3b','rosa_3b','sami_3b'));
DELETE FROM student_results WHERE student_id IN (SELECT id FROM students WHERE username IN ('pia_3b','rosa_3b','sami_3b'));
DELETE FROM assessments WHERE session_id IN (SELECT id FROM student_sessions WHERE created_at='2025-10-01 08:00:00' AND display_name IN ('Pia','Rosa','Sami'));
DELETE FROM student_sessions WHERE created_at='2025-10-01 08:00:00' AND display_name IN ('Pia','Rosa','Sami');
DELETE FROM students WHERE username IN ('pia_3b','rosa_3b','sami_3b');
DELETE FROM classes WHERE join_code='TEST3B';
-- Klasse 3b anlegen
INSERT INTO classes (teacher_id, name, school_year, join_code, country) VALUES (99,'3b Klasse','2025/26','TEST3B','AT');
INSERT INTO students (class_id, username, password, display_name, emoji_avatar, avatar_slug, is_anonymous, created_at) VALUES ((SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'pia_3b','!nologin-generated','Pia','🦉','eule-prof',0,'2025-09-20 08:00:00');
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('d112ac1b-8fec-f2da-28ae-e97cd5acbec5',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'Pia','2025-10-01 08:00:00','2026-06-15 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d112ac1b-8fec-f2da-28ae-e97cd5acbec5','fluss',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJiaW9kaXYiOiAxMDAsICJlY29ub215IjogMTAwLCAiZmxvb2QiOiAwLCAiZm9vZCI6IDEwMH0=') USING utf8mb4),353000,'2026-03-13 09:41:03');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='pia_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'fluss',100,353,CONVERT(FROM_BASE64('eyJzdGFycyI6IDUsICJiaW9kaXYiOiAxMDAsICJlY29ub215IjogMTAwLCAiZmxvb2QiOiAwLCAiZm9vZCI6IDEwMH0=') USING utf8mb4),'2026-03-13 09:41:03');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d112ac1b-8fec-f2da-28ae-e97cd5acbec5','fluss',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA3MSwgImVjb25vbXkiOiA3MSwgImZsb29kIjogMjksICJmb29kIjogNzF9') USING utf8mb4),400000,'2026-02-07 13:02:46');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='pia_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'fluss',71,400,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA3MSwgImVjb25vbXkiOiA3MSwgImZsb29kIjogMjksICJmb29kIjogNzF9') USING utf8mb4),'2026-02-07 13:02:46');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='pia_3b' LIMIT 1),'fluss',2,95,2,5);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d112ac1b-8fec-f2da-28ae-e97cd5acbec5','tourismustal',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA3MywgIm5hdHVyZSI6IDczLCAibW9uZXkiOiAxMDB9') USING utf8mb4),467000,'2025-11-15 14:14:17');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='pia_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'tourismustal',73,467,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiA0LCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA3MywgIm5hdHVyZSI6IDczLCAibW9uZXkiOiAxMDB9') USING utf8mb4),'2025-11-15 14:14:17');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='pia_3b' LIMIT 1),'tourismustal',1,40,1,4);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d112ac1b-8fec-f2da-28ae-e97cd5acbec5','kofferdetektiv',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAzLCAiY29ycmVjdF9maXJzdF90cnkiOiAzLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDUuMH0=') USING utf8mb4),192000,'2025-11-22 15:19:52');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='pia_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'kofferdetektiv',56,192,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAzLCAiY29ycmVjdF9maXJzdF90cnkiOiAzLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDUuMH0=') USING utf8mb4),'2025-11-22 15:19:52');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='pia_3b' LIMIT 1),'kofferdetektiv',1,30,1,3);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d112ac1b-8fec-f2da-28ae-e97cd5acbec5','farmer',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJoaXRfcmF0ZSI6IDY4LCAieWVhciI6IDEwLCAiY3JvcHNfdXNlZCI6IDR9') USING utf8mb4),240000,'2025-12-20 10:26:16');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='pia_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'farmer',68,240,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJoaXRfcmF0ZSI6IDY4LCAieWVhciI6IDEwLCAiY3JvcHNfdXNlZCI6IDR9') USING utf8mb4),'2025-12-20 10:26:16');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='pia_3b' LIMIT 1),'farmer',1,30,1,3);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d112ac1b-8fec-f2da-28ae-e97cd5acbec5','weltkueche',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJjb21wbGV0ZWREaXNoZXMiOiA1LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogN30=') USING utf8mb4),377000,'2025-12-07 14:02:09');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='pia_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'weltkueche',53,377,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJjb21wbGV0ZWREaXNoZXMiOiA1LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogN30=') USING utf8mb4),'2025-12-07 14:02:09');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='pia_3b' LIMIT 1),'weltkueche',1,30,1,3);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d112ac1b-8fec-f2da-28ae-e97cd5acbec5','sonnensystem',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxMSwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4),290000,'2025-12-07 13:09:48');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='pia_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'sonnensystem',55,290,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxMSwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4),'2025-12-07 13:09:48');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d112ac1b-8fec-f2da-28ae-e97cd5acbec5','sonnensystem',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxNiwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4),509000,'2026-03-03 11:22:40');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='pia_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'sonnensystem',82,509,CONVERT(FROM_BASE64('eyJjb21wbGV0ZWQiOiAxNiwgInRvdGFsIjogMjAsICJmaXJzdFRyeSI6IGZhbHNlfQ==') USING utf8mb4),'2026-03-03 11:22:40');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='pia_3b' LIMIT 1),'sonnensystem',2,70,2,4);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('d112ac1b-8fec-f2da-28ae-e97cd5acbec5','heli',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDkwLCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4),286000,'2026-02-02 08:38:06');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='pia_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'heli',90,286,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDkwLCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4),'2026-02-02 08:38:06');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='pia_3b' LIMIT 1),'heli',1,40,1,4);
INSERT INTO students (class_id, username, password, display_name, emoji_avatar, avatar_slug, is_anonymous, created_at) VALUES ((SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'rosa_3b','!nologin-generated','Rosa','🦊','fuchs-explorer',0,'2025-09-20 08:00:00');
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('8b7a490f-e331-c6c5-3840-785bcd851ffe',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'Rosa','2025-10-01 08:00:00','2026-06-15 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8b7a490f-e331-c6c5-3840-785bcd851ffe','farmer',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJoaXRfcmF0ZSI6IDU4LCAieWVhciI6IDksICJjcm9wc191c2VkIjogM30=') USING utf8mb4),472000,'2026-05-13 08:45:16');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'farmer',58,472,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJoaXRfcmF0ZSI6IDU4LCAieWVhciI6IDksICJjcm9wc191c2VkIjogM30=') USING utf8mb4),'2026-05-13 08:45:16');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),'farmer',1,30,1,3);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8b7a490f-e331-c6c5-3840-785bcd851ffe','kofferdetektiv',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA0LCAiY29ycmVjdF9maXJzdF90cnkiOiA0LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDMuOX0=') USING utf8mb4),210000,'2026-01-03 11:47:17');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'kofferdetektiv',68,210,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiA0LCAiY29ycmVjdF9maXJzdF90cnkiOiA0LCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDMuOX0=') USING utf8mb4),'2026-01-03 11:47:17');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8b7a490f-e331-c6c5-3840-785bcd851ffe','kofferdetektiv',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAyLCAiY29ycmVjdF9maXJzdF90cnkiOiAyLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDcuM30=') USING utf8mb4),216000,'2026-05-25 15:04:54');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'kofferdetektiv',30,216,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAyLCAiY29ycmVjdF9maXJzdF90cnkiOiAyLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDcuM30=') USING utf8mb4),'2026-05-25 15:04:54');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),'kofferdetektiv',2,50,2,3);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8b7a490f-e331-c6c5-3840-785bcd851ffe','eu-werkstatt',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNSwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),192000,'2026-03-28 10:06:01');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'eu-werkstatt',51,192,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNSwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),'2026-03-28 10:06:01');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8b7a490f-e331-c6c5-3840-785bcd851ffe','eu-werkstatt',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNSwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),124000,'2025-12-13 11:22:35');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'eu-werkstatt',54,124,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNSwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),'2025-12-13 11:22:35');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8b7a490f-e331-c6c5-3840-785bcd851ffe','eu-werkstatt',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),354000,'2025-12-28 08:11:15');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'eu-werkstatt',36,354,CONVERT(FROM_BASE64('eyJlbmRUeXBlIjogImFib3J0ZWQiLCAic3RlcHNUb3RhbCI6IDEwLCAiZmlyc3RUcnlIaXRzIjogNCwgInRvdGFsQXR0ZW1wdHMiOiAxMiwgIm11ZWxsZWltZXJDb3VudCI6IDF9') USING utf8mb4),'2025-12-28 08:11:15');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),'eu-werkstatt',2,80,3,3);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8b7a490f-e331-c6c5-3840-785bcd851ffe','energiemanager',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJibG9ja3NCYWxhbmNlZCI6IDYsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDMsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),119000,'2026-05-24 08:08:07');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'energiemanager',51,119,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJibG9ja3NCYWxhbmNlZCI6IDYsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDMsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),'2026-05-24 08:08:07');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),'energiemanager',1,30,1,3);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8b7a490f-e331-c6c5-3840-785bcd851ffe','klima',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjYxLCAiZmluYWxfZmxvb2RlZF9wY3QiOiAzNywgImZpbmFsX2J1ZGdldCI6IDIzMCwgImZpbmFsX2NvMiI6IDQzNiwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),355000,'2026-04-19 12:54:37');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'klima',63,355,CONVERT(FROM_BASE64('eyJmaW5hbF90ZW1wZXJhdHVyZSI6IDE2LjYxLCAiZmluYWxfZmxvb2RlZF9wY3QiOiAzNywgImZpbmFsX2J1ZGdldCI6IDIzMCwgImZpbmFsX2NvMiI6IDQzNiwgImZpbmFsX3BvcHVsYXRpb24iOiAyNTB9') USING utf8mb4),'2026-04-19 12:54:37');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),'klima',1,30,1,3);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8b7a490f-e331-c6c5-3840-785bcd851ffe','logistik',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJvcmRlcnNEZWxpdmVyZWQiOiA1LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogMjgwfQ==') USING utf8mb4),403000,'2026-05-12 11:30:33');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'logistik',54,403,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJvcmRlcnNEZWxpdmVyZWQiOiA1LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogMjgwfQ==') USING utf8mb4),'2026-05-12 11:30:33');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8b7a490f-e331-c6c5-3840-785bcd851ffe','logistik',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJvcmRlcnNEZWxpdmVyZWQiOiA0LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogMTAwfQ==') USING utf8mb4),483000,'2026-02-15 13:37:26');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'logistik',45,483,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJvcmRlcnNEZWxpdmVyZWQiOiA0LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogMTAwfQ==') USING utf8mb4),'2026-02-15 13:37:26');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),'logistik',2,50,2,3);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8b7a490f-e331-c6c5-3840-785bcd851ffe','weltkueche',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJjb21wbGV0ZWREaXNoZXMiOiA2LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogNn0=') USING utf8mb4),319000,'2026-06-04 14:53:49');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'weltkueche',59,319,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJjb21wbGV0ZWREaXNoZXMiOiA2LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogNn0=') USING utf8mb4),'2026-06-04 14:53:49');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),'weltkueche',1,30,1,3);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8b7a490f-e331-c6c5-3840-785bcd851ffe','heli',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDcxLCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4),430000,'2025-10-23 08:34:16');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'heli',71,430,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiA0LCAicGxhblBjdCI6IDcxLCAic3RhcnRTY29yZSI6IDQsICJsYW5kaW5nU2NvcmUiOiA0fQ==') USING utf8mb4),'2025-10-23 08:34:16');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8b7a490f-e331-c6c5-3840-785bcd851ffe','heli',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAzLCAicGxhblBjdCI6IDU0LCAic3RhcnRTY29yZSI6IDMsICJsYW5kaW5nU2NvcmUiOiAzfQ==') USING utf8mb4),179000,'2025-11-16 14:34:52');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'heli',54,179,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAzLCAicGxhblBjdCI6IDU0LCAic3RhcnRTY29yZSI6IDMsICJsYW5kaW5nU2NvcmUiOiAzfQ==') USING utf8mb4),'2025-11-16 14:34:52');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),'heli',2,70,2,4);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8b7a490f-e331-c6c5-3840-785bcd851ffe','fluss',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA3MCwgImVjb25vbXkiOiA3MCwgImZsb29kIjogMzAsICJmb29kIjogNzB9') USING utf8mb4),302000,'2026-05-13 12:16:30');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'fluss',70,302,CONVERT(FROM_BASE64('eyJzdGFycyI6IDQsICJiaW9kaXYiOiA3MCwgImVjb25vbXkiOiA3MCwgImZsb29kIjogMzAsICJmb29kIjogNzB9') USING utf8mb4),'2026-05-13 12:16:30');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('8b7a490f-e331-c6c5-3840-785bcd851ffe','fluss',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJiaW9kaXYiOiAyNywgImVjb25vbXkiOiAyNywgImZsb29kIjogNzMsICJmb29kIjogMjd9') USING utf8mb4),499000,'2026-01-06 13:41:04');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'fluss',27,499,CONVERT(FROM_BASE64('eyJzdGFycyI6IDEsICJiaW9kaXYiOiAyNywgImVjb25vbXkiOiAyNywgImZsb29kIjogNzMsICJmb29kIjogMjd9') USING utf8mb4),'2026-01-06 13:41:04');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='rosa_3b' LIMIT 1),'fluss',2,50,2,4);
INSERT INTO students (class_id, username, password, display_name, emoji_avatar, avatar_slug, is_anonymous, created_at) VALUES ((SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'sami_3b','!nologin-generated','Sami','🐢','baer-foerster',0,'2025-09-20 08:00:00');
INSERT INTO student_sessions (id, class_id, display_name, created_at, last_seen, country) VALUES ('facaddee-c2df-1213-5ee0-5624dcfb1482',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'Sami','2025-10-01 08:00:00','2026-06-15 12:00:00','AT');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('facaddee-c2df-1213-5ee0-5624dcfb1482','energiemanager',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJibG9ja3NCYWxhbmNlZCI6IDYsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDMsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),131000,'2026-01-04 08:48:05');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='sami_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'energiemanager',52,131,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJibG9ja3NCYWxhbmNlZCI6IDYsICJibG9ja3NUb3RhbCI6IDEyLCAiZGF5c1BsYXllZCI6IDMsICJkYXlzVG90YWwiOiA2fQ==') USING utf8mb4),'2026-01-04 08:48:05');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='sami_3b' LIMIT 1),'energiemanager',1,30,1,3);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('facaddee-c2df-1213-5ee0-5624dcfb1482','heli',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAyLCAicGxhblBjdCI6IDQyLCAic3RhcnRTY29yZSI6IDIsICJsYW5kaW5nU2NvcmUiOiAyfQ==') USING utf8mb4),342000,'2026-03-24 14:45:15');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='sami_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'heli',42,342,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAyLCAicGxhblBjdCI6IDQyLCAic3RhcnRTY29yZSI6IDIsICJsYW5kaW5nU2NvcmUiOiAyfQ==') USING utf8mb4),'2026-03-24 14:45:15');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('facaddee-c2df-1213-5ee0-5624dcfb1482','heli',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAxLCAicGxhblBjdCI6IDE3LCAic3RhcnRTY29yZSI6IDEsICJsYW5kaW5nU2NvcmUiOiAxfQ==') USING utf8mb4),409000,'2026-01-12 08:25:46');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='sami_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'heli',17,409,CONVERT(FROM_BASE64('eyJzdGVybmVHZXNhbXQiOiAxLCAicGxhblBjdCI6IDE3LCAic3RhcnRTY29yZSI6IDEsICJsYW5kaW5nU2NvcmUiOiAxfQ==') USING utf8mb4),'2026-01-12 08:25:46');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='sami_3b' LIMIT 1),'heli',1,30,2,2);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('facaddee-c2df-1213-5ee0-5624dcfb1482','weltkueche',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJjb21wbGV0ZWREaXNoZXMiOiA3LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogNX0=') USING utf8mb4),395000,'2025-11-14 14:46:57');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='sami_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'weltkueche',67,395,CONVERT(FROM_BASE64('eyJzdGFycyI6IDMsICJjb21wbGV0ZWREaXNoZXMiOiA3LCAidG90YWxEaXNoZXMiOiAxMCwgIm1pc3Rha2VzSW5EaXNoIjogNX0=') USING utf8mb4),'2025-11-14 14:46:57');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='sami_3b' LIMIT 1),'weltkueche',1,30,1,3);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('facaddee-c2df-1213-5ee0-5624dcfb1482','tourismusregion',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzY29yZSI6IDM3fQ==') USING utf8mb4),361000,'2026-05-28 14:22:21');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='sami_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'tourismusregion',37,361,CONVERT(FROM_BASE64('eyJzY29yZSI6IDM3fQ==') USING utf8mb4),'2026-05-28 14:22:21');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='sami_3b' LIMIT 1),'tourismusregion',1,20,1,2);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('facaddee-c2df-1213-5ee0-5624dcfb1482','kofferdetektiv',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAzLCAiY29ycmVjdF9maXJzdF90cnkiOiAzLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDUuOX0=') USING utf8mb4),413000,'2025-11-11 08:03:50');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='sami_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'kofferdetektiv',46,413,CONVERT(FROM_BASE64('eyJjYXNlc190b3RhbCI6IDYsICJjYXNlc19zb2x2ZWQiOiAzLCAiY29ycmVjdF9maXJzdF90cnkiOiAzLCAid3JvbmdfZ3Vlc3NlcyI6IDAsICJoaW50c191c2VkX2F2ZyI6IDUuOX0=') USING utf8mb4),'2025-11-11 08:03:50');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='sami_3b' LIMIT 1),'kofferdetektiv',1,20,1,2);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('facaddee-c2df-1213-5ee0-5624dcfb1482','tourismustal',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiAzLCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA0NiwgIm5hdHVyZSI6IDQ2LCAibW9uZXkiOiAxMDB9') USING utf8mb4),194000,'2026-01-31 08:06:10');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='sami_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'tourismustal',46,194,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiAzLCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiA0NiwgIm5hdHVyZSI6IDQ2LCAibW9uZXkiOiAxMDB9') USING utf8mb4),'2026-01-31 08:06:10');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('facaddee-c2df-1213-5ee0-5624dcfb1482','tourismustal',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiAyLCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiAzNSwgIm5hdHVyZSI6IDM1LCAibW9uZXkiOiAxMDB9') USING utf8mb4),406000,'2025-12-21 14:05:28');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='sami_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'tourismustal',35,406,CONVERT(FROM_BASE64('eyJnb2Fsc0RvbmUiOiAyLCAiZ29hbHNUb3RhbCI6IDYsICJzYXRpc2ZhY3Rpb24iOiAzNSwgIm5hdHVyZSI6IDM1LCAibW9uZXkiOiAxMDB9') USING utf8mb4),'2025-12-21 14:05:28');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='sami_3b' LIMIT 1),'tourismustal',1,40,2,2);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('facaddee-c2df-1213-5ee0-5624dcfb1482','logistik',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJvcmRlcnNEZWxpdmVyZWQiOiA0LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogLTI1fQ==') USING utf8mb4),167000,'2025-12-13 14:57:42');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='sami_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'logistik',39,167,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJvcmRlcnNEZWxpdmVyZWQiOiA0LCAidG90YWxPcmRlcnMiOiAxMCwgIm9yZGVyc0xhdGUiOiAwLCAiZmluYWxCYWxhbmNlIjogLTI1fQ==') USING utf8mb4),'2025-12-13 14:57:42');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='sami_3b' LIMIT 1),'logistik',1,20,1,2);
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('facaddee-c2df-1213-5ee0-5624dcfb1482','farmer',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJoaXRfcmF0ZSI6IDM5LCAieWVhciI6IDYsICJjcm9wc191c2VkIjogMn0=') USING utf8mb4),349000,'2026-04-24 14:11:37');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='sami_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'farmer',39,349,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJoaXRfcmF0ZSI6IDM5LCAieWVhciI6IDYsICJjcm9wc191c2VkIjogMn0=') USING utf8mb4),'2026-04-24 14:11:37');
INSERT INTO assessments (session_id, sim_id, class_id, results, duration_ms, submitted_at) VALUES ('facaddee-c2df-1213-5ee0-5624dcfb1482','farmer',(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJoaXRfcmF0ZSI6IDMzLCAieWVhciI6IDUsICJjcm9wc191c2VkIjogMn0=') USING utf8mb4),159000,'2025-11-03 10:02:43');
INSERT INTO student_results (student_id, class_id, module_id, score, duration_sec, detail_json, completed_at) VALUES ((SELECT id FROM students WHERE username='sami_3b' LIMIT 1),(SELECT id FROM classes WHERE join_code='TEST3B' LIMIT 1),'farmer',33,159,CONVERT(FROM_BASE64('eyJzdGFycyI6IDIsICJoaXRfcmF0ZSI6IDMzLCAieWVhciI6IDUsICJjcm9wc191c2VkIjogMn0=') USING utf8mb4),'2025-11-03 10:02:43');
INSERT INTO player_progress (student_id, sim_id, level, xp, plays, best_stars) VALUES ((SELECT id FROM students WHERE username='sami_3b' LIMIT 1),'farmer',1,40,2,2);
SET FOREIGN_KEY_CHECKS=1;
@@ -0,0 +1,46 @@
-- ============================================================
-- Weltküche: Lehrplan-Bezug erscheint nicht — Reparatur
-- Stand: 2026-08-18 · Atlas
-- ------------------------------------------------------------
-- Ursache: Die phase3-Migration (2026-06-08) hat die Modul-
-- Zuordnung über die Session-Variable @welternaehrung_id gesetzt:
-- INSERT IGNORE INTO kompetenz_modules VALUES (@welternaehrung_id,'weltkueche',100,'primaer');
-- War @welternaehrung_id beim Prod-Import NULL (anderer Connection-
-- Kontext), wurde KEINE weltkueche-Zeile angelegt. Der INNER JOIN in
-- modul_detail.php liefert dann nichts → „Noch keine Kompetenzen".
--
-- Die Kompetenz 'welternaehrung-konsum-disparitaeten' und ihre ~118
-- Anker existieren bereits — es fehlt nur die Verknüpfung.
--
-- Diese Reparatur ist idempotent und referenziert die Kompetenz per
-- key_slug (NICHT per Session-Variable / harter ID). Sekundär-Bezüge
-- ebenfalls per key_slug, damit sie environment-unabhängig greifen.
-- ============================================================
-- Primär: Welternährung, Konsum und globale Disparitäten
INSERT INTO kompetenz_modules (kompetenz_id, module_id, level, strength)
SELECT id, 'weltkueche', 100, 'primaer'
FROM kompetenzen WHERE key_slug = 'welternaehrung-konsum-disparitaeten'
ON DUPLICATE KEY UPDATE strength = VALUES(strength), level = VALUES(level);
-- Sekundär: Klimawandel (Klimazonen/Anbaugrenzen, Ökobilanz von Lebensmitteln)
INSERT INTO kompetenz_modules (kompetenz_id, module_id, level, strength)
SELECT id, 'weltkueche', 50, 'sekundaer'
FROM kompetenzen WHERE key_slug = 'klimawandel'
ON DUPLICATE KEY UPDATE strength = VALUES(strength);
-- Sekundär: Systemisches Denken (Welthandel, Lieferketten, Konsumfolgen)
INSERT INTO kompetenz_modules (kompetenz_id, module_id, level, strength)
SELECT id, 'weltkueche', 50, 'sekundaer'
FROM kompetenzen WHERE key_slug = 'systemisches-denken'
ON DUPLICATE KEY UPDATE strength = VALUES(strength);
-- Kontrolle:
-- SELECT k.key_slug, km.strength, km.level
-- FROM kompetenz_modules km JOIN kompetenzen k ON k.id = km.kompetenz_id
-- WHERE km.module_id = 'weltkueche' ORDER BY km.strength;
-- -> erwartet: primaer welternaehrung-konsum-disparitaeten (+ 2 sekundaer)
--
-- SELECT COUNT(*) FROM lehrplan_anchors
-- WHERE kompetenz_id = (SELECT id FROM kompetenzen WHERE key_slug='welternaehrung-konsum-disparitaeten');
-- -> erwartet: > 0 (Anker existieren bereits aus phase3)
@@ -0,0 +1,8 @@
-- =====================================================================
-- Lizenz-Vertrieb — Nachtrag 2 (2026-08-26)
-- * bestellte vs. gelieferte Menge (Zugabe +10 %)
-- Additiv & non-breaking. (Mail-Config: siehe Nachtrag 3, app_settings.)
-- =====================================================================
ALTER TABLE license_batches
ADD COLUMN qty_ordered INT UNSIGNED NULL AFTER qty; -- bestellt (verrechnet); qty = geliefert inkl. Zugabe
@@ -0,0 +1,19 @@
-- =====================================================================
-- Lizenz-Vertrieb — Nachtrag 3 (2026-08-26): portable App-Settings
-- Eigene Key/Value-Tabelle fuer die Mail-Konfiguration (Provider/Absender/URL).
-- Ersetzt die Nutzung der lokalen Orphan-Tabelle platform_config_v2 (existiert
-- auf v3/Prod nicht). Additiv & non-breaking. MariaDB + MySQL 8 kompatibel.
-- =====================================================================
CREATE TABLE IF NOT EXISTS app_settings (
skey VARCHAR(64) NOT NULL PRIMARY KEY,
sval TEXT NULL,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
updated_by INT UNSIGNED NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT IGNORE INTO app_settings (skey, sval) VALUES
('mail_provider', 'server'),
('mail_from_email', 'support@geograsim.at'),
('mail_from_name', 'GeoGraSim'),
('mail_public_url', 'https://geograsim.at');

Some files were not shown because too many files have changed in this diff Show More