From 17fac05ddce0c6f3c7ccd0b44342804ba1ba478c Mon Sep 17 00:00:00 2001 From: Erol Haagenrud Date: Mon, 10 Aug 2026 18:34:31 +0200 Subject: [PATCH] Alt kompilerer rent. Oppsummering av denne runden: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. WHS Rule 3.1b — ferdig, testet (117/117), rullet ut... nei, venter fortsatt (se under). 2. round.tee_name_snapshot-synk — ferdig, scratch-verifisert. 3. Optimistisk versjonssjekk for samtidig hull-redigering — ferdig bygget, og jeg fant og rettet en reell UX-bug underveis (en fullskjerm-feilvisning i stedet for en liten banner) som ellers ville gjort funksjonen verre enn ingenting. Alt er dokumentert i ADR-056/057 og CHANGELOG punkt 65–66. Deploy — rekkefølgen har betydning (migrasjonen må kjøre først, siden ny kode leser version-kolonnen): # 1. Migrasjon mot ekte teecup_db docker exec teeoff_db psql -U teeoff_admin -d teecup_db -f /opt/teecup/062_round_hole_version.sql # 2. Backend docker compose build teecup_api docker compose up -d teecup_api # 3. Frontend docker compose build teecup_frontend docker compose up -d teecup_frontend Og fortsatt uavklart fra tidligere: datakorreksjonen for din spesifikke runde UPDATE round SET tee_name_snapshot = '55' WHERE id = '520f9681-6e7f-49bf-8504-9ab223874285'; --- .claude/settings.local.json | 3 +- 062_round_hole_version.sql | 16 + ARCHITECTURE_DECISIONS.md | 314 +++++++++++++ CHANGELOG.md | 209 +++++++++ app/routers/notifications.py | 16 +- app/routers/rounds.py | 85 +++- frontend/app/manifest.ts | 15 +- frontend/components/account-settings.tsx | 2 +- frontend/components/round-detail.tsx | 96 +++- frontend/components/shot/map-point-picker.tsx | 40 +- .../shot/shot-measurement-sheet.tsx | 25 +- frontend/lib/geo.ts | 17 + frontend/lib/offline-queue.ts | 28 +- frontend/public/apple-icon.png | Bin 8905 -> 5020 bytes frontend/public/icon-dark-32x32.png | Bin 909 -> 650 bytes frontend/public/icon-light-32x32.png | Bin 909 -> 650 bytes frontend/public/icon.svg | 416 +----------------- frontend/public/icons/icon-192.png | Bin 9786 -> 5567 bytes frontend/public/icons/icon-512.png | Bin 45739 -> 19624 bytes frontend/public/icons/icon-maskable-512.png | Bin 31457 -> 19624 bytes handicap_engine.py | 21 +- test_handicap_engine.py | 58 +++ 22 files changed, 921 insertions(+), 440 deletions(-) create mode 100644 062_round_hole_version.sql diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 201c22b..742a162 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -465,7 +465,8 @@ "Bash(curl -s -o /dev/null -w \"%{http_code}\\\\n\" https://teecup.golf/)", "Bash(echo \"EXIT CODE: $?\")", "Bash(python3 -m json.tool /tmp/adapted.json)", - "Bash(curl -s -o /dev/null -w \"teecup.golf: %{http_code}\\\\n\" https://teecup.golf/)" + "Bash(curl -s -o /dev/null -w \"teecup.golf: %{http_code}\\\\n\" https://teecup.golf/)", + "Bash(docker rm -f teecup_api_dr5 teecup-scratch-dr5-minio 2>&1 *)" ], "additionalDirectories": [ "/opt/teeoff/deploy", diff --git a/062_round_hole_version.sql b/062_round_hole_version.sql new file mode 100644 index 0000000..9300986 --- /dev/null +++ b/062_round_hole_version.sql @@ -0,0 +1,16 @@ +-- ADR-057: enkel optimistisk versjonssjekk for samtidig hull-redigering. +-- Bruker ba eksplisitt om dette etter en ekstern kodegjennomgang som +-- påpekte at update_hole/update_side_hole tidligere var rent last-write- +-- wins (ADR-028, bevisst valgt den gangen, men bruker ønsket det endret): +-- to enheter som redigerer samme hull samtidig fikk INGEN varsel om at +-- den andres endring ble overskrevet. +-- +-- Én delt `round_hole`-tabell dekker begge eierskapstyper (deltaker- og +-- side-eid, se round_hole_owner_xor) -- én kolonne holder for begge +-- endepunktene (update_hole og update_side_hole). +-- +-- DEFAULT 1 (ikke 0): matcher at en fersk rad regnes som "versjon 1" fra +-- opprettelse -- en klient som nettopp har hentet et upåbegynt hull skal +-- kunne sende expected_version=1 og treffe riktig, ikke måtte vite at +-- "ubrukt" betyr 0. +ALTER TABLE round_hole ADD COLUMN version integer NOT NULL DEFAULT 1; diff --git a/ARCHITECTURE_DECISIONS.md b/ARCHITECTURE_DECISIONS.md index fcc5a31..e6ca875 100644 --- a/ARCHITECTURE_DECISIONS.md +++ b/ARCHITECTURE_DECISIONS.md @@ -5219,6 +5219,320 @@ ryddet opp fullstendig, `teecup_db`s ACL bekreftet uendret. **Bevisst utenfor omfang:** samme som ADR-052 -- ren fargeovertagelse, ingen layout-/strukturendring i veiviserens 11 filer. +--- + +## ADR-054: Kartretning ved slagmåling — bearing fra eget forrige slag, ikke green-koordinater — 2026-08-10 + +Brukeren spurte: ved lengdemåling av slag, kan kartet vises slik at "man +går oppover" (opp på skjermen = fremover på hullet) UTEN å registrere +green-koordinater (som verken TeeCup eller teeoff har noe sted, bekreftet +tidligere denne sesjonen)? Svaret var ja, og brukeren ba om at det bygges. + +**Beslutning A — bearing regnet fra spillerens EGET forrige slag på +hullet, ikke fra en lagret hull-linje.** `round_shot` (ADR-048) lagrer +allerede start-/sluttkoordinater per slag, sortert på `shot_number`. +Ny `bearingDegrees(a, b)` i `frontend/lib/geo.ts` (standard forward- +azimuth-formel, ren funksjon, ingen Mapbox-avhengighet -- samme mønster +som `haversineMeters`) regner ut retningsvinkelen til FORRIGE slag på +hullet (siste element i den allerede hentede `shots`-listen i +`round-detail.tsx` sin `ShotMeasurementEntry`, som GET-endepunktet +allerede returnerer `ORDER BY shot_number`). Denne vinkelen sendes ned +som `initialBearing`-prop gjennom `ShotMeasurementSheet` til BEGGE +`MapPointPicker`-instansene (start-steget OG ball-steget), og settes som +`bearing` i selve Mapbox-konstruktøren. + +**Beslutning B — statisk, ikke sanntids-rotasjon.** Bearingen settes ÉN +gang ved kart-initialisering, aldri oppdatert løpende mens brukeren går. +En kontinuerlig rotasjon etter live GPS-heading (`coords.heading` fra +`watchPosition`, som allerede kjører på ball-steget for sanntids-avstand) +ble vurdert og avvist -- GPS-heading er notorisk ustøyende ved lav +gangfart, og en urolig/hakkete kartrotasjon mens brukeren går ville vært +verre enn ingen rotasjon. Samme begrunnelse som ADR-048s eksisterende +"ett kart-instans, aldri re-initialisert"-prinsipp. + +**Beslutning C -- fallback-rekkefølge for det FØRSTE slaget på et hull** +(ingen forrige slag å regne bearing fra ennå): (1) ett engangs-forsøk på +`coords.heading` fra det samme posisjonsoppslaget kartet uansett gjør for +sentrering (kun populert når enheten beveger seg, ofte `null` for et +enkeltstående oppslag -- akseptert, ikke en feiltilstand), (2) nord (0) +som endelig fallback. Ingen ny geolocation-spørring lagt til utover det +som allerede fantes. + +Ingen migrasjon, ingen backend-endring -- rent klientside, tre filer +(`lib/geo.ts`, `components/shot/map-point-picker.tsx`, +`components/shot/shot-measurement-sheet.tsx`) pluss beregningen i +`components/round-detail.tsx` sin `ShotMeasurementEntry` (som allerede +har `shots`-listen fra sin eksisterende `useEffect`-henting). + +**Verifisert i to lag:** (1) `bearingDegrees()` unit-verifisert +frittstående (Node, fire kjente himmelretninger fra ett origo-punkt -- +nord/øst/sør/vest ga 0.0/90.0/180.0/270.0 eksakt). (2) Ende-til-ende i +ekte nettleser (eget scratch-miljø, samme fulle DB/rolle/MinIO/API/ +frontend-oppsett som tidligere runder denne økten): seedet ett slag rett +ØST (bearing 90°) på hull 1 via de ekte API-endepunktene, midlertidig +konsollogg i `initMap()` bekreftet kartet fikk `bearing≈89.996` +(avrundingsdifferanse fra at 0.01°-lengdegrad-delta ikke er eksakt øst +på en kule -- korrekt) da måle-arket ble åpnet på hull 1. Hull 2 (ingen +tidligere slag) ga `bearing=0` (nord-fallback), som forventet. Debug- +loggen fjernet igjen etter verifisering, `tsc --noEmit` rent. Scratch- +ressurser ryddet opp fullstendig, `teecup_db`s ACL bekreftet uendret. + +**Bevisst utenfor omfang:** sanntids-rotasjon under gange (se Beslutning +B), og en egen "nullstill til nord"-knapp i kart-UI-et (ikke bedt om, +lav verdi når bearingen uansett er statisk og sjelden feil). + +--- + +## ADR-055: Nytt app-ikon (ball/pokal/tee), full-bleed, korrigert etter reell tegnefeil — 2026-08-10 + +Brukeren: dagens app-ikon var "fremdeles et gammelt utkast" til tross for +at et tidligere punkt (CHANGELOG, 2026-08-06) hevdet ikonene var "beskåret +fra den ekte TeeCup-logoen". Visuell inspeksjon av `icons/icon-512.png`, +`icon-maskable-512.png` og `apple-icon.png` (åpnet direkte i nettleser) +bekreftet brukerens vurdering: riktig motiv (golfball/pokal/tee), men en +grov beskjæring med enorm hvit padding rundt en liten sentrert grafikk -- +nesten ulesbart ved favikon-størrelse (32×32), og for lite innhold i +sentrum til å tåle Androids sirkel-/dråpe-maskering. + +**Beslutning A -- ny komposisjon via V0, samme motiv.** Claude skrev en +V0-prompt som IKKE ba om et nytt motiv, kun en ny KOMPOSISJON av det +eksisterende (bruker la ved den ekte kilde-SVG-en, `TeeCup-logo.svg`, +i samme V0-melding): full-bleed bakgrunn kant til kant (ingen +gjennomsiktig/hvit "luft"), motivet skalert til å fylle et sentrert +"safe zone"-område (~70-75%) som tåler både iOS- og Android-maskering, +ingen egen avrunding tegnet inn (plattformen masker selv), lesbart ned +til 32×32. V0 leverte ett master-SVG (1024×1024) med en mørkegrønn +full-bleed bakgrunn (`#14351c`) og motivet nestet i et sentrert +undervindu. + +**Reelt funn under verifisering, IKKE en V0-feiltolkning.** Første +V0-svar hadde to synlige "hakk" skåret inn i pokal-kroppen ved +skulder-/hank-overgangen. Claude sammenlignet først mot feil kildefil +(en annen, rasterbasert `TeeCup-logo.svg` funnet i `Temp-uploads/` fra +tidligere i sesjonen) og konkluderte feilaktig at V0 måtte ha "tegnet på +nytt etter øyemål". Bruker delte deretter den FAKTISKE kilde-SVG-en +(`TeeCup-logo-kun.svg`, rene Inkscape-vektorbaner) direkte i chatten. +Rendret stort på hvit bakgrunn viste denne at hakkene faktisk stammer fra +en ekte, pre-eksisterende unøyaktighet i selve kildekunsten: to +overlappende oransje former (`path20`, fyll `#fd5524`, og `path21`, fyll +`#fe5d2c`) dekker ikke hverandre helt i to punkter. Usynlig på hvit +bakgrunn (de to oransjetonene ligner hverandre), men synlig som et hakk +på en sterkt kontrasterende mørk bakgrunn, siden bakgrunnsfargen lyser +gjennom gapet. V0s opprinnelige "tatt verbatim, ikke tegnet på nytt" +-påstand var altså korrekt -- Claudes første mistanke var feil. + +**Beslutning B -- fikset ved å utvide, ikke omtegne.** Claude ga V0 en +presis, kildehenvisende rettemelding (identifiserte de to konkrete +path-fyllfargene og hvorfor gapet oppstår). V0s fiks: la til en synlig +`stroke` i samme farge som fyllet (`stroke="#fd5524" stroke-width="0.6"`) +på `path20`, som tetter gapet ved å utvide den underliggende formens +synlige kant, i stedet for å redigere selve bezier-kurvene. To små +håndtak-innvendige "glans"-former (opprinnelig nær-hvite, ville vist som +lyse flekker i håndtak-hullene mot mørk bakgrunn) fikk samtidig fyll +byttet til bakgrunnsfargen (`#14351c`) -- korrekt, siden de fungerer som +utsparinger, ikke skyggelegging, i denne fargekonteksten. + +**Claude verifiserte fiksen visuelt** (stor rendring, samme +sammenligningsteknikk som avdekket problemet) før integrering -- +hakkene bekreftet borte, ingen nye artefakter. + +**Integrering:** ett 1024×1024 master-SVG er eneste kilde. Claude +rasterte selv alle nødvendige størrelser via ekte nettleser-rendring +(Chrome DevTools MCP, `devicePixelRatio=1` for eksakte piksler, bekreftet +med `file`-kommandoen etterpå) -- IKKE V0-genererte PNG-er, for å unngå +enhver eksport-unøyaktighet: `icons/icon-192.png`, `icons/icon-512.png`, +`icons/icon-maskable-512.png` (samme kilde som icon-512 -- V0s +komposisjon var allerede safe-zone-riktig, ingen egen beskjæring +trengtes), `apple-icon.png` (180×180), `icon-light-32x32.png` og +`icon-dark-32x32.png` (samme bilde for begge -- det nye ikonet har sin +egen faste mørkegrønne bakgrunn og trenger ikke lenger to +tema-varianter, ulikt en eventuell fremtidig gjennomsiktig/hvit +favikon-variant). `public/icon.svg` (SVG-favikon-fallback) erstattet med +master-SVG-et selv. + +`app/manifest.ts` sin `theme_color`/`background_color` sto fortsatt på +de gamle Forest Green-fargene (`#8BC24A`/`#ffffff`) -- oppdatert til +clubhouse (ADR-052): `theme_color: "#2f6b1e"` (primær merkevarefarge, +Android UI-tinting), `background_color: "#f3f6ec"` (lys bakgrunn, +PWA-splashskjerm). + +**Scratch-verifisert:** `tsc --noEmit` rent. Egen frontend-only +scratch-container (ingen DB/API-endring i denne runden) -- ekte +produksjonsbuild, `GET /manifest.webmanifest` bekreftet nye farger, +`icon.svg`/`icons/icon-192.png`/`icon-light-32x32.png` bekreftet 200 OG +visuelt korrekte i ekte nettleser. Scratch-ressurser ryddet opp +fullstendig. + +**Bevisst utenfor omfang:** `teecup-wordmark.svg` (det fulle +ikon+tekst-ordmerket, brukt andre steder) er IKKE endret -- kun de rene +app-ikon-filene. + +--- + +## ADR-056: Reell WHS-svakhet + reell rundevisnings-bug — funnet via ekstern kodegjennomgang, 2026-08-10 + +Brukeren delte en ekstern vurdering av appen (parafrasert): to "harde +kjerner" -- WHS-beregningen og live-scoring/samtidighet -- er der en +vibe-kodet app typisk svikter, og fortjener ekte enhetstester mot kjente +fasitcaser, ikke selvbekreftende tester. To parallelle Explore-agenter +gransket hver sin kjerne. WHS-agentens funn ga direkte opphav til +Beslutning A under. Samtidighets-agentens funn (last-write-wins er et +BEVISST, allerede dokumentert valg i ADR-028 -- ikke en overraskelse) +ga IKKE grunnlag for umiddelbar koding, kun en åpen designbeslutning +brukeren må ta først (se "Åpent, ikke besluttet" nederst). + +**Beslutning A -- WHS Rule 3.1b sitt >54/4+-slag-unntak implementert og +fasit-testet.** Agentens revisjon fant at `handicap_engine.py` sin NDB- +cap (`max_hole_score_for_handicap`) manglet et reelt, publisert WHS- +unntak: ved banehandicap over 54 OG 4 eller flere mottatte slag på ett +hull, er maks hullscore par+5 (IKKE den vanlige par+2+mottatte slag). +Claude verifiserte dette FØR koding direkte mot kildePDF-en (`WHS_Rules_ +of_Handicapping_2024.pdf`, side 37, `pdftotext`-søk, ikke agentens +gjenfortelling): "Where a Course Handicap is calculated at more than 54 +and a player receives 4 or more strokes on a hole, the maximum hole +score is par + 5 for handicap purposes." + +Lagt til som et nytt, valgfritt `course_handicap`-parameter (standard +`None`) på `max_hole_score_for_handicap` og `adjusted_gross_score` -- +bakoverkompatibelt (uendret oppførsel for ethvert kall som ikke sender +det). To produksjonskallsteder i `rounds.py` (`update_hole` sin +"plukket opp"-gren, og rundefullførings-differensial-beregningen) +oppdatert til å sende med den allerede tilgjengelige +`course_handicap_snapshot`. + +Fire nye, presist begrunnede tester lagt til i `test_handicap_engine.py` +(grensetilfellene eksplisitt: eksakt 54 -- IKKE "mer enn 54", eksakt 3 +slag -- IKKE "4 eller flere", samt end-til-ende via +`adjusted_gross_score`). 117/117 tester grønne (opp fra 115). Scratch- +verifisert også via ekte API-kall (deltaker med banehandicap 63, hull +med 4 mottatte slag, "plukket opp"-endepunktet returnerte 9 som +forventet, ikke det gamle 10). + +**Beslutning B -- `round.tee_name_snapshot` synkes nå med eierens eget +utslagsbytte.** Egen, urelatert bug rapportert av bruker samme økt (se +skjermdump): rundens toppheader (delt på tvers av Score/Scorekort/ +Leaderboard) viste et gammelt utslag ("50") selv etter at brukeren +hadde endret utslaget til "55" -- bekreftet i `round_participant` (begge +rader riktig "55") vs. `round.tee_name_snapshot` (fortsatt "50"). Root +cause: `PATCH /rounds/{round_id}/participants/{participant_id}` +(`update_participant`, brukt ved enkelt-deltaker-utslagsbytte) skrev +KUN til `round_participant`, aldri til `round` -- ulikt den separate +hele-bane-bytte-grenen i `update_round`, som alltid har oppdatert begge +sammen. De to skrive-stiene var ikke holdt i synk. + +Fiks: når denne PATCH-en endrer `tee_name` for EIERENS EGEN +deltaker-rad (`current["user_id"] == current["round_owner_user_id"]`, +ikke en medspillers/gjests -- ulike deltakere kan bevisst spille ulike +utslag, se `ParticipantCreate.tee_name`), oppdateres +`round.tee_name_snapshot` til samme verdi i samme kall -- speiler +nøyaktig hvordan `create_round`/`_create_participant` allerede holder +disse to i synk ved selve opprettelsen. + +Scratch-verifisert: eierens eget utslagsbytte oppdaterte +`round.tee_name_snapshot` korrekt; et påfølgende utslagsbytte for en +GJEST lot `round.tee_name_snapshot` stå urørt (bekrefter at kun +eierens egen rad trigger synken, som tiltenkt). + +**Ikke rettet i denne runden (venter på egen brukerbekreftelse, se +CHANGELOG):** den konkrete, allerede-live runden brukeren viste +skjermdump av (`round.tee_name_snapshot` fortsatt "50" i ekte +`teecup_db` for akkurat den runden) -- kodefiksen over hindrer nye +tilfeller, men retter ikke historisk feil data. Krever en engangs +`UPDATE`-setning mot ekte `teecup_db`, vist og bekreftet separat per +CLAUDE.md. + +**Besluttet samme økt:** samtidighets-/konflikt-halvparten av den +eksterne vurderingen krevde en designbeslutning før noe kunne bygges -- +bruker fikk valget mellom "enkel versjonssjekk + tydelig feilmelding", +"feltvis i stedet for radvis overskriving", og "ikke nå" via +`AskUserQuestion`, valgte det anbefalte første alternativet. Bygget +samme økt, se ADR-057. + +--- + +## ADR-057: Optimistisk versjonssjekk for samtidig hull-redigering — 2026-08-10 + +Direkte oppfølging av ADR-056: bruker valgte "enkel versjonssjekk + +tydelig feilmelding" for `update_hole`/`update_side_hole` sin +last-write-wins-oppførsel (ADR-028, bevisst den gangen, men brukeren +ønsket det endret nå). + +**Beslutning A -- én ny `version`-kolonne på `round_hole` (migrasjon +062), dekker begge eierskapstyper.** `round_hole` er allerede delt +mellom deltaker- og side-eide hull (XOR-constraint) -- én kolonne holder +for begge `update_hole`/`update_side_hole`. `DEFAULT 1`, økes med 1 for +hver skrivning. Klienten sender `expected_version` tilbake (valgfritt -- +`None`/utelatt hopper over sjekken, samme bakoverkompatible mønster som +resten av appens valgfrie felt). + +**Beslutning B -- atomisk sjekk i selve UPDATE-en, ikke en separat +"les så skriv".** `WHERE ... AND ($N::int IS NULL OR version = $N::int)` +i samme setning som selve skrivningen -- ingen TOCTOU-vindu mellom sjekk +og skrivning. Et `None`-resultat skilles fra "hullet finnes ikke" via +enten en allerede-utført eksistenssjekk lenger opp i funksjonen +(`update_hole`, som uansett må slå opp par/stroke-index før en +"plukket opp"-beregning) eller en egen fallback-eksistenssjekk +(`update_side_hole`, som ikke hadde noen forhåndssjekk fra før) -- aldri +tvetydig hvilken feil som returneres. + +**Beslutning C -- offline-køen kjeder versjonen fremover innad i én +flush-runde.** Reelt funn under design (før noe ble bygget, ikke en bug +funnet i ettertid): uten dette ville en spillers EGNE påfølgende +offline-redigeringer av samme hull avvist HVERANDRE som falske +konflikter, siden lokal state (og dermed enqueue-tidspunktets +`expected_version`) aldri oppdateres mellom to sekvensielle +avspillinger i samme batch. `flushQueue` (`offline-queue.ts`) holder nå +et lite `Map` gjennom hele flush-runden og +overstyrer `expected_version` på påfølgende oppføringer til samme URL +med den nyeste kjente verdien. + +**Reelt UX-hull funnet UNDER scratch-verifisering, rettet før +utrulling.** Første implementasjon gjenbrukte komponentens +eksisterende `error`-tilstand for konfliktmeldingen. Viste seg (kun ved +ekte to-enhets-test i nettleser, ikke synlig fra kode-lesing alene) at +`error` er en FATAL, hele-siden-erstattende tilstand (brukt for f.eks. +"runden finnes ikke") -- en forbigående hull-konflikt tok dermed over +HELE skjermen og tvang brukeren til å navigere bort, i stedet for en +liten varsel. Rettet med en egen, dismissbar `conflictNotice`-tilstand +(banner øverst i siden, "Skjul"-knapp, resten av UI-et forblir fullt +brukbart) -- gjenbrukt også for den eksisterende (fra før denne runden) +kø-synk-feilmeldingen, som hadde nøyaktig samme fullskjerm-problem. + +**Scratch-verifisert i tre lag, alle i ekte nettleser/API, ingen +enhetstester på TS-siden (ingen testinfrastruktur for det i +prosjektet ennå):** +1. Backend, `update_hole` OG `update_side_hole` hver for seg (ekte + API-kall): enhet A skriver først (lykkes, versjon 1→2), enhet B med + samme (nå utdaterte) `expected_version` avvist med 409 og eksakt + forventet feiltekst, A sin verdi bekreftet fortsatt lagret (ikke B + sin avviste), B henter ny versjon og lykkes på nytt forsøk. Bekreftet + at PATCH uten `expected_version` fortsatt fungerer (bakoverkompatibelt). + `update_side_hole` i tillegg bekreftet at et ikke-eksisterende hull + fortsatt gir 404, ikke feilaktig 409. +2. To ISOLERTE nettleser-kontekster (`isolatedContext`, egne + informasjonskapsel-rom -- ekte to-enheter-simulering, ikke bare to + faner som deler økt) som samme flight-medlem: enhet B med en allerede + åpen, utdatert veiviser fikk 409 ved innsending, veiviseren viste + automatisk den ferske (A sin) verdien i stedet for B sitt avviste + forsøk, banneret vist og dismissbart, RESTEN AV SIDEN forble + fullt brukbar (dette avdekket UX-hullet over). +3. Offline-kø-kjeding: ekte nettverks-emulering (DevTools "Offline"), + to påfølgende redigeringer av SAMME hull mens frakoblet, tilbake på + nett -- begge synkroniserte korrekt (endte på siste verdi), INGEN + falsk konflikt seg imellom, "venter på synk"-indikatoren forsvant helt. + +`tsc --noEmit` og `py_compile` rene gjennom hele runden. Scratch- +ressurser ryddet opp fullstendig hver gang, `teecup_db`s ACL bekreftet +uendret. + +**Bevisst utenfor omfang:** ORG-TURNERINGENES match-scoring +(`session-scorecard.tsx`, `/orgs/{id}/matches/{id}/hole-scores`) er et +HELT separat system (annen tabell, annen router) med trolig samme +last-write-wins-egenskap -- IKKE undersøkt eller endret denne runden, +siden verken den opprinnelige eksterne vurderingen eller brukerens +oppfølging nevnte det spesifikt. Egen, fremtidig vurdering om det +trengs der også. + Disse må avklares før eller under de relevante fasene: 1. **Sesjons-secret:** TeeOff lar `PUBLIC_SESSION_SECRET` falle tilbake på diff --git a/CHANGELOG.md b/CHANGELOG.md index cf80c80..27714d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10030,3 +10030,212 @@ Neste steg: dette var en engangsopprydding av kontoer fra FØR den regelen gikk live. Et automatisert varsel/rutine for dette kan vurderes som egen, fremtidig sak om det blir aktuelt. + +62. **Fjernet e-postvarsel for "venn startet en runde du kan følge" — + 2026-08-10.** Bruker ba eksplisitt om å fjerne kun e-posten for denne + hendelsen (`type="round"`-notifikasjonen sendt fra `create_round` i + `rounds.py` til venner som kan følge runden) — in-app-varselet + (klokke-ikonet) og push-varselet skal fortsatt fungere som før. + + **Kompleksitet:** samme `type="round"` deles av EN ANNEN, fortsatt + ønsket e-post ("du ble lagt til som medspiller", sendt fra + `add_participant`) — å slå av e-post for hele `"round"`-typen ville + fjernet begge. Løst med et nytt `allow_email: bool = True`-parameter + på `create_notification()` (`app/routers/notifications.py`), satt + til `False` KUN på kallstedet i `create_round`. In-app-innsettingen + og `_push_for_notification` kjører uendret uansett — kun selve + e-post-blokken hopper over. Ingen migrasjon, ingen endring i + `user_notification_email_pref`-skjemaet. + + `frontend/components/account-settings.tsx`: "Runder"-varselvalgets + beskrivelsestekst rettet ("Du blir lagt til som medspiller, eller en + venn starter en runde du kan følge." → "Du blir lagt til som + medspiller på en runde.") — teksten lovet tidligere en e-post som nå + aldri sendes. + + **Scratch-verifisert** (egen scratch-DB/rolle/MinIO/API-container, + `TEECUP_DEV_LOG_MAGIC_LINKS=true` + tomme SMTP-variabler for å + observere e-post-forsøk som en tydelig loggmelding i stedet for en + ekte utsending): to testbrukere, akseptert vennskap, `watcher` opt-et + inn på `round`-e-post. (1) `owner` opprettet en offentlig synlig + runde — in-app-varsel opprettet for `watcher`, INGEN "[DEV] + Varsel-e-post"-linje i loggen. (2) `owner` la `watcher` til som + medspiller på samme runde — in-app-varsel opprettet OG nøyaktig én + "[DEV] Varsel-e-post"-linje, bekreftet riktig melding. Begge + in-app-radene bekreftet i `notification`-tabellen etterpå. `tsc + --noEmit` og `python3 -m py_compile` begge rene. Scratch-ressurser + ryddet opp fullstendig, `teecup_db`s ACL bekreftet uendret. + + **Rullet ut 2026-08-10**, bruker bekreftet eksplisitt ("Ja, kjør") — + begge containere bygget/restartet rent, bekreftet live på + `teecup.golf` uten konsollfeil utover den harmløse PWA-infomeldingen. + +63. **Kartretning ved slagmåling: "opp = fremover på hullet", uten + green-koordinater — 2026-08-10, se ADR-054.** Bruker spurte om + kartet kunne roteres slik at man "går oppover" under slagmåling, + uten å registrere green-koordinater (bekreftet tidligere at ingen + slike finnes noe sted) — og ba deretter eksplisitt om at det bygges. + + Løsning: bearingen (kompassretningen) kartet roteres til regnes ut + fra spillerens EGET forrige slag på samme hull (`round_shot` sine + allerede lagrede start-/sluttkoordinater), ikke fra en lagret + hull-linje. Ny `bearingDegrees()` i `frontend/lib/geo.ts` (ren + funksjon, standard forward-azimuth). Satt ÉN gang ved + kart-initialisering (`bearing` i Mapbox-konstruktøren), aldri + løpende oppdatert under gange — vurdert og bevisst avvist, se + ADR-054 Beslutning B (GPS-heading er for støyete ved lav fart til + kontinuerlig rotasjon). Første slag på et hull (ingen forrige å + regne fra) faller tilbake til ett engangs-forsøk på enhetens + `coords.heading`, deretter nord. + + Rent klientside: `lib/geo.ts`, `components/shot/map-point-picker.tsx`, + `components/shot/shot-measurement-sheet.tsx`, + `components/round-detail.tsx` (`ShotMeasurementEntry`, som allerede + har slag-listen for hullet fra sin eksisterende henting). Ingen + migrasjon, ingen backend-endring. + + **Verifisert i to lag:** `bearingDegrees()` unit-testet frittstående + (fire kjente himmelretninger — nord/øst/sør/vest ga 0/90/180/270 + eksakt). Ende-til-ende i ekte nettleser (eget scratch-miljø): seedet + ett slag rett øst på hull 1 via ekte API-kall, midlertidig + konsollogg (fjernet igjen etter verifisering) bekreftet kartet fikk + `bearing≈90` på hull 1 og `bearing=0` (nord-fallback) på hull 2 (uten + tidligere slag). `tsc --noEmit` rent. Scratch-ressurser ryddet opp + fullstendig, `teecup_db`s ACL bekreftet uendret. + + **Rullet ut 2026-08-10**, bruker bekreftet eksplisitt ("Kjør den.") — + ren omstart av `teecup_frontend`, bekreftet live på `teecup.golf` + uten konsollfeil utover den harmløse PWA-infomeldingen. + +64. **Nytt app-ikon (ball/pokal/tee), full-bleed, hakk-feil rettet — + 2026-08-10, se ADR-055.** Bruker: dagens ikon var "fremdeles et + gammelt utkast" — bekreftet ved å åpne `icon-512.png`/ + `icon-maskable-512.png`/`apple-icon.png` direkte: riktig motiv, men + grov beskjæring med enorm hvit padding rundt en liten grafikk, + nesten ulesbart ved 32×32. + + V0-prompt (samme motiv, ny komposisjon: full-bleed bakgrunn, + sentrert i safe-zone, ingen egen avrunding) ga et første svar med to + synlige hakk i pokal-formen. Claude sammenlignet FØRST mot feil + kildefil og konkluderte feilaktig at V0 hadde "tegnet på nytt etter + øyemål" — bruker rettet dette ved å dele den faktiske kilde-SVG-en + (`TeeCup-logo-kun.svg`) direkte. Rendret stort viste at hakkene var + en ekte, pre-eksisterende unøyaktighet i selve kildekunsten (to + overlappende oransje former som ikke dekker hverandre helt i to + punkter) — usynlig på hvit bakgrunn, synlig mot mørk. V0s "tatt + verbatim"-påstand var korrekt; Claudes første mistanke var feil. + + Presis rettemelding til V0 (identifiserte de to path-fyllfargene) + ga en fiks (tettet gapet med en `stroke` i samme farge som fyllet, + ikke en omtegning) — verifisert visuelt før integrering, hakkene + bekreftet borte, ingen nye artefakter. + + Integrert: ett 1024×1024 master-SVG er eneste kilde. Alle + pikselstørrelser (`icons/icon-192.png`, `icons/icon-512.png`, + `icons/icon-maskable-512.png`, `apple-icon.png` 180×180, + `icon-light/dark-32x32.png`) rastret av Claude selv via ekte + nettleser-rendring (`devicePixelRatio=1`, bekreftet eksakte + pikseldimensjoner etterpå) — ikke V0-genererte PNG-er, for å unngå + eksport-unøyaktighet. `public/icon.svg` (SVG-favikon) erstattet med + master-SVG-et. `app/manifest.ts` sin `theme_color`/`background_color` + (fortsatt gamle Forest Green-farger, `#8BC24A`/`#ffffff`) oppdatert + til clubhouse (`#2f6b1e`/`#f3f6ec`). + + **Scratch-verifisert**: `tsc --noEmit` rent, egen frontend-only + scratch-container (ekte produksjonsbuild), `GET + /manifest.webmanifest` bekreftet nye farger, ikonfilene bekreftet + 200 og visuelt korrekte i ekte nettleser. Scratch-ressurser ryddet + opp fullstendig. + + **Rullet ut 2026-08-10**, bruker bekreftet eksplisitt ("Kjør") — ren + omstart av `teecup_frontend`, bekreftet live på `teecup.golf`: + `icon.svg` og `manifest.webmanifest` (nye farger) begge korrekte, + ingen konsollfeil utover den harmløse PWA-infomeldingen. + +65. **WHS Rule 3.1b-unntak (>54 banehandicap + 4 mottatte slag → par+5) + implementert og fasit-testet + `round.tee_name_snapshot` synk-bug + rettet — 2026-08-10, se ADR-056.** Bruker delte en ekstern vurdering + av appens to "harde kjerner" (WHS-beregning, live-scoring/ + samtidighet) og ba om en ærlig sjekk. To Explore-agenter gransket + hver sin kjerne parallelt. + + **WHS-funn:** `handicap_engine.py` manglet et reelt, publisert + unntak (verifisert direkte mot kilde-PDF-en, side 37, ikke bare + agentens gjenfortelling): banehandicap over 54 OG 4+ mottatte slag + på ett hull → maks hullscore par+5, ikke den vanlige + par+2+mottatte-slag. Lagt til som et nytt, bakoverkompatibelt + `course_handicap`-parameter på `max_hole_score_for_handicap`/ + `adjusted_gross_score`, wired inn i de to produksjonskallstedene i + `rounds.py`. Fire nye tester i `test_handicap_engine.py` (eksplisitte + grensetilfeller: eksakt 54, eksakt 3 slag, samt end-til-ende) — 117/117 + grønne. Scratch-verifisert også via ekte API-kall (deltaker med + banehandicap 63, "plukket opp" på et hull med 4 slag ga korrekt 9, + ikke det gamle 10). + + **Egen, urelatert bug funnet samtidig** (bruker viste skjermdump av + en live runde der toppheaderens utslag ikke fulgte et utslagsbytte): + `PATCH .../participants/{id}` skrev kun til `round_participant`, + aldri til `round.tee_name_snapshot` (som selve header-visningen + leser). Fikset: skriver nå begge når det er EIERENS EGEN + deltaker-rad som endres (ikke en gjests — ulike deltakere kan + bevisst ha ulikt utslag). Scratch-verifisert: eierens bytte + oppdaterer runden, en gjests bytte gjør det ikke. + + `tsc`/`py_compile` rene der aktuelt. Scratch-ressurser ryddet opp + fullstendig, `teecup_db`s ACL bekreftet uendret gjennom hele + verifiseringen. + + **Ikke rettet ennå:** den konkrete live runden brukeren viste (feil + historisk data i ekte `teecup_db`) — venter på egen bekreftelse for + en engangs datakorreksjon. Samtidighets-/konflikt-halvparten av + vurderingen er bevisst IKKE besluttet i denne runden — krever en + designbeslutning fra bruker først, se ADR-056. + + **Ikke rullet ut ennå** — venter på eksplisitt brukerbekreftelse før + `teecup_api` bygges/restartes mot ekte miljø. + +66. **Optimistisk versjonssjekk for samtidig hull-redigering — 2026-08-10, + se ADR-057.** Direkte oppfølging av punkt 65: bruker fikk valget + mellom tre tilnærminger til samtidighets-halvparten av den eksterne + vurderingen (versjonssjekk / feltvis skrivning / la det ligge), valgte + "enkel versjonssjekk + tydelig feilmelding". + + Migrasjon 062: ny `version`-kolonne på `round_hole` (dekker begge + eierskapstyper, deltaker og side, én tabell). `update_hole`/ + `update_side_hole` sjekker nå `expected_version` ATOMISK i selve + UPDATE-en (`WHERE ... AND (expected_version IS NULL OR version = + expected_version)`, ingen separat les-så-skriv-race), 409 med tydelig + norsk feiltekst ved konflikt, skiller korrekt fra 404 (hull finnes + ikke). `expected_version` valgfri — bakoverkompatibelt. + + Offline-køen (`offline-queue.ts`) kjeder nå versjonen fremover + innad i én flush-runde — uten dette ville en spillers EGNE + påfølgende offline-redigeringer av samme hull avvist hverandre som + falske konflikter (funnet under design, før noe ble bygget). + + **Reelt UX-hull funnet under scratch-verifisering, rettet før + utrulling:** første versjon gjenbrukte komponentens eksisterende + `error`-tilstand for konfliktmeldingen — viste seg (kun synlig ved + ekte to-enhets-test i nettleser) å være en FATAL, hele-siden- + erstattende tilstand. En forbigående hull-konflikt tok dermed over + hele skjermen. Rettet med en egen, dismissbar `conflictNotice`- + banner (gjenbrukt også for den eksisterende kø-synk-feilmeldingen, + som hadde samme problem fra før). + + **Scratch-verifisert i tre lag, alt i ekte nettleser/API:** (1) + begge backend-endepunktene hver for seg — riktig 409/404-skille, + vinnerens data bekreftet bevart, bakoverkompatibilitet uten + `expected_version` bekreftet. (2) To ISOLERTE nettleser-kontekster + (ekte to-enheter-simulering) — konflikt ga 409, veiviseren viste + automatisk riktig (den andres) verdi, banner dismissbart, RESTEN AV + SIDEN forble fullt brukbar (dette avdekket UX-hullet over). (3) + Ekte offline-emulering — to redigeringer av samme hull frakoblet, + begge synkroniserte korrekt ved reconnect, ingen falsk konflikt. + `tsc`/`py_compile` rene. Scratch-ressurser ryddet opp fullstendig, + `teecup_db`s ACL bekreftet uendret. + + **Bevisst utenfor omfang:** org-turneringenes match-scoring (helt + separat system/tabell) ikke undersøkt eller endret denne runden. + + **Ikke rullet ut ennå** — venter på eksplisitt brukerbekreftelse før + `teecup_api`/`teecup_frontend` bygges/restartes mot ekte miljø. diff --git a/app/routers/notifications.py b/app/routers/notifications.py index aa93ae9..050ac41 100644 --- a/app/routers/notifications.py +++ b/app/routers/notifications.py @@ -49,12 +49,21 @@ _PUSH_TITLES: dict[str, str] = { } -async def create_notification(conn, *, user_id: str, type: NotificationType, message: str, link_path: str) -> None: +async def create_notification( + conn, *, user_id: str, type: NotificationType, message: str, link_path: str, allow_email: bool = True +) -> None: """Kalles fra andre routere sin egen `plain_connection()`/transaksjon -- tar en allerede-åpen `conn`, åpner ikke en egen. Sender i tillegg en e-post-fallback hvis (og kun hvis) mottakeren selv har valgt inn for akkurat DENNE typen, OG et push-varsel til enhver enhet mottakeren har - abonnert (uavhengig av e-post-valget -- se _push_for_notification).""" + abonnert (uavhengig av e-post-valget -- se _push_for_notification). + + `allow_email=False` (2026-08-10) lar en enkelt kallsted permanent + utelukke e-post for akkurat DEN hendelsen, selv om brukeren har krysset + av for typen generelt -- brukt av "venn startet en runde du kan følge" + i rounds.py, som deler `type="round"` med "lagt til som medspiller" + (som fortsatt skal kunne e-postes). In-app-varselet og push forblir + uendret uansett -- kun selve e-postutsendingen droppes.""" await conn.execute( "INSERT INTO notification (user_id, type, message, link_path) VALUES ($1, $2, $3, $4)", user_id, @@ -65,6 +74,9 @@ async def create_notification(conn, *, user_id: str, type: NotificationType, mes await _push_for_notification(conn, user_id=user_id, type=type, message=message, link_path=link_path) + if not allow_email: + return + wants_email = await conn.fetchval( "SELECT EXISTS(SELECT 1 FROM user_notification_email_pref WHERE user_id = $1 AND type = $2)", user_id, diff --git a/app/routers/rounds.py b/app/routers/rounds.py index d6ac2a5..dae3a7e 100644 --- a/app/routers/rounds.py +++ b/app/routers/rounds.py @@ -1629,6 +1629,10 @@ async def create_round( type="round", message=f"{owner_name} startet en runde du kan følge ({round_label}).", link_path=f"/watch/{round_id}", + # 2026-08-10: bruker ba eksplisitt om å fjerne e-post + # for akkurat denne hendelsen -- in-app-varselet og + # push beholdes uendret, se create_notification. + allow_email=False, ) return await _load_round_out(conn, round_id, user.user_id) @@ -3055,6 +3059,24 @@ async def update_participant( *values, ) + # Reelt funn 2026-08-10 (bruker rapporterte at rundens eget utslag, + # vist i toppheaderen på tvers av Score/Scorekort/Leaderboard, ikke + # fulgte med etter et utslagsbytte): `round.tee_name_snapshot` settes + # KUN her (deltaker-PATCH) OG i update_round sin egen bane-bytte-gren + # -- de to var ikke holdt i synk. Speiler create_round/_create_participant + # sin oppførsel ved opprettelse, der eierens deltaker-rad og selve + # runden alltid får samme tee_name samtidig: når DENNE PATCH-en endrer + # utslaget for eierens EGEN deltaker-rad (ikke en medspillers/gjests), + # oppdateres round.tee_name_snapshot til samme verdi. Rører ikke + # runde-raden ved endring av en annen deltakers utslag -- ulike + # deltakere kan bevisst spille ulike utslag (se ParticipantCreate.tee_name), + # så kun eierens egen rad er en meningsfull "rundens utslag"-kilde. + if "tee_name" in updates and current["user_id"] == current["round_owner_user_id"]: + await conn.execute( + "UPDATE round SET tee_name_snapshot = $2 WHERE id = $1", + round_id, new_tee_name, + ) + # Side-tildeling ELLER rating (HCP/utslag/kjønn) endret (ADR-039) -- # regn playing_handicap for begge sider på nytt FØR raden under # leses, slik at responsen reflekterer den ferske verdien (billig @@ -3161,6 +3183,10 @@ class RoundHoleOut(BaseModel): # deltakeren ikke har en beregnet course handicap (f.eks. gjest uten # HCP). strokes_received: int | None + # Optimistisk versjonssjekk (ADR-057, migrasjon 062) -- klienten sender + # denne tilbake som expected_version ved neste PATCH. Økes med 1 for + # hver skrivning, aldri direkte redigerbar. + version: int async def _build_participant_holes(conn, round_id: str, participant_id: str) -> list[RoundHoleOut]: @@ -3177,7 +3203,7 @@ async def _build_participant_holes(conn, round_id: str, participant_id: str) -> """ SELECT hole_number, par, stroke_index, played, score, picked_up, putts, club_off_tee, tee_shot_result, approach_result, chip_count, bunker_shot_count, - penalty_strokes, first_putt_distance_bucket, anyway_strokes + penalty_strokes, first_putt_distance_bucket, anyway_strokes, version FROM round_hole WHERE round_participant_id = $1 ORDER BY hole_number """, participant_id, @@ -3237,6 +3263,8 @@ class RoundSideHoleOut(BaseModel): # ball-hull) -- individuell ball spiller alltid egen ball, spørsmålet # gir ikke mening for RoundHoleOut. selected_participant_id: str | None = None + # Optimistisk versjonssjekk (ADR-057, migrasjon 062) -- se RoundHoleOut. + version: int async def _build_side_holes(conn, round_id: str, side_id: str) -> list[RoundSideHoleOut]: @@ -3246,7 +3274,8 @@ async def _build_side_holes(conn, round_id: str, side_id: str) -> list[RoundSide if not side_exists: raise app_error(404, "NOT_FOUND", "Siden finnes ikke.") rows = await conn.fetch( - "SELECT hole_number, par, stroke_index, played, score, selected_participant_id::text AS selected_participant_id " + "SELECT hole_number, par, stroke_index, played, score, " + "selected_participant_id::text AS selected_participant_id, version " "FROM round_hole WHERE round_side_id = $1 ORDER BY hole_number", side_id, ) @@ -3287,6 +3316,10 @@ class SideHoleUpdate(BaseModel): # sender alltid gjeldende verdi, null = ikke registrert -- IKKE en # delvis PATCH). Validert til å tilhøre nøyaktig DENNE siden under. selected_participant_id: str | None = None + # Optimistisk versjonssjekk (ADR-057). None = hopp over sjekken (samme + # bakoverkompatible mønster som resten av appens valgfrie felt) -- + # klienten sender den alltid i praksis. + expected_version: int | None = None @router.patch("/rounds/{round_id}/sides/{side_id}/holes/{hole_number}", response_model=RoundSideHoleOut) @@ -3315,15 +3348,29 @@ async def update_side_hole( ) row = await conn.fetchrow( """ - UPDATE round_hole SET played = $3, score = $4, selected_participant_id = $5 + UPDATE round_hole SET played = $3, score = $4, selected_participant_id = $5, + version = version + 1 WHERE round_side_id = $1 AND hole_number = $2 + AND ($6::int IS NULL OR version = $6::int) RETURNING hole_number, par, stroke_index, played, score, - selected_participant_id::text AS selected_participant_id + selected_participant_id::text AS selected_participant_id, version """, side_id, hole_number, body.played, body.score, body.selected_participant_id, + body.expected_version, ) if row is None: - raise app_error(404, "NOT_FOUND", "Hullet finnes ikke på denne siden.") + # Skiller "hullet finnes ikke" fra "noen andre skrev først" -- + # UPDATE-en over kan returnere None av begge grunner. + exists = await conn.fetchval( + "SELECT 1 FROM round_hole WHERE round_side_id = $1 AND hole_number = $2", + side_id, hole_number, + ) + if not exists: + raise app_error(404, "NOT_FOUND", "Hullet finnes ikke på denne siden.") + raise app_error( + 409, "STALE_VERSION", + "Noen andre har endret dette hullet i mellomtiden. Laster inn siste versjon.", + ) await broadcast_round_update(round_id) return RoundSideHoleOut(**dict(row)) @@ -4990,6 +5037,10 @@ class HoleUpdate(BaseModel): penalty_strokes: int | None = Field(default=None, ge=0) first_putt_distance_bucket: Literal["<1m", "<2m", "<3m", "<5m", "<8m", "8m+"] | None = None anyway_strokes: int | None = Field(default=None, ge=0) + # Optimistisk versjonssjekk (ADR-057). None = hopp over sjekken (samme + # bakoverkompatible mønster som resten av appens valgfrie felt) -- + # klienten sender den alltid i praksis. + expected_version: int | None = None @router.patch( @@ -5045,7 +5096,9 @@ async def update_hole( "Kan ikke registrere «plukket opp» før handicap er beregnet for denne deltakeren.", ) played = True - score = max_hole_score_for_handicap(this_hole_par, strokes_received) + score = max_hole_score_for_handicap( + this_hole_par, strokes_received, course_handicap=participant_row["course_handicap_snapshot"] + ) async with translate_db_errors(): row = await conn.fetchrow( @@ -5054,20 +5107,28 @@ async def update_hole( played = $3, score = $4, picked_up = $5, putts = $6, club_off_tee = $7, tee_shot_result = $8, approach_result = $9, chip_count = $10, bunker_shot_count = $11, penalty_strokes = $12, first_putt_distance_bucket = $13, - anyway_strokes = $14 + anyway_strokes = $14, version = version + 1 WHERE round_participant_id = $1 AND hole_number = $2 + AND ($15::int IS NULL OR version = $15::int) RETURNING hole_number, par, stroke_index, played, score, picked_up, putts, club_off_tee, tee_shot_result, approach_result, chip_count, bunker_shot_count, - penalty_strokes, first_putt_distance_bucket, anyway_strokes + penalty_strokes, first_putt_distance_bucket, anyway_strokes, version """, participant_id, hole_number, played, score, body.picked_up, body.putts, body.club_off_tee, body.tee_shot_result, body.approach_result, body.chip_count, body.bunker_shot_count, body.penalty_strokes, body.first_putt_distance_bucket, - body.anyway_strokes, + body.anyway_strokes, body.expected_version, ) if row is None: - raise app_error(404, "NOT_FOUND", "Hullet finnes ikke på denne deltakeren.") + # this_hole_row over har allerede bekreftet at hullet FINNES -- + # et None-resultat her betyr dermed alltid versjonskonflikt, ikke + # "ikke funnet" (ingen tvetydighet å skille, ulikt update_side_hole + # som ikke har en tilsvarende forhåndssjekk). + raise app_error( + 409, "STALE_VERSION", + "Noen andre har endret dette hullet i mellomtiden. Laster inn siste versjon.", + ) await broadcast_round_update(round_id) return RoundHoleOut(**dict(row), strokes_received=strokes_received) @@ -5462,7 +5523,9 @@ async def complete_round(round_id: str, user: CurrentUser = Depends(get_current_ [h["stroke_index"] for h in holes], ) scores = [h["score"] if h["played"] else None for h in holes] - ags = adjusted_gross_score(scores, pars, strokes_received) + ags = adjusted_gross_score( + scores, pars, strokes_received, course_handicap=_course_handicap_from_row(p) + ) differential = score_differential(ags, p["course_rating_snapshot"], p["slope_rating_snapshot"]) await conn.execute( diff --git a/frontend/app/manifest.ts b/frontend/app/manifest.ts index 384a700..ce3b6bf 100644 --- a/frontend/app/manifest.ts +++ b/frontend/app/manifest.ts @@ -1,9 +1,12 @@ import type { MetadataRoute } from "next" -// PWA-manifest (ADR-028). Ikonene under er beskåret fra den ekte TeeCup- -// logoen (2026-08-06, se public/teecup-wordmark.svg for hele ordmerket -// ikon+tekst) -- erstatter den tidligere midlertidige grønne -// golfflagg-placeholderen. +// PWA-manifest (ADR-028). Ikonene under er et ordentlig, polert app-ikon +// (ADR-055, 2026-08-10) -- ekte logo-vektor (ball+pokal+tee), full-bleed +// mørkegrønn bakgrunn, motiv sentrert innenfor maskerings-safe-zone -- +// erstatter den forrige, dårlig beskårne versjonen (enorm hvit padding +// rundt en liten sentrert grafikk, se ADR-055 for detaljer). +// theme_color/background_color oppdatert til clubhouse-paletten (ADR-052) +// -- sto fortsatt på de gamle Forest Green-fargene. export default function manifest(): MetadataRoute.Manifest { return { name: "TeeCup", @@ -12,8 +15,8 @@ export default function manifest(): MetadataRoute.Manifest { start_url: "/", scope: "/", display: "standalone", - background_color: "#ffffff", - theme_color: "#8BC24A", + background_color: "#f3f6ec", + theme_color: "#2f6b1e", icons: [ { src: "/icons/icon-192.png", sizes: "192x192", type: "image/png", purpose: "any" }, { src: "/icons/icon-512.png", sizes: "512x512", type: "image/png", purpose: "any" }, diff --git a/frontend/components/account-settings.tsx b/frontend/components/account-settings.tsx index c58f90b..38e9940 100644 --- a/frontend/components/account-settings.tsx +++ b/frontend/components/account-settings.tsx @@ -1378,7 +1378,7 @@ function PasswordSection({ hasPassword, onChanged }: { hasPassword: boolean; onC // venne-kategoriseringen), ikke en delvis PATCH. const NOTIFICATION_TYPE_OPTIONS: { value: string; label: string; description: string }[] = [ { value: "friend", label: "Venneforespørsler", description: "Noen sender deg en venneforespørsel, eller godtar din." }, - { value: "round", label: "Runder", description: "Du blir lagt til som medspiller, eller en venn starter en runde du kan følge." }, + { value: "round", label: "Runder", description: "Du blir lagt til som medspiller på en runde." }, { value: "result", label: "Resultater", description: "En runde du er koblet til blir fullført." }, { value: "tournament", label: "Turneringer", description: "Reservert for fremtidige turnering-varsler." }, ] diff --git a/frontend/components/round-detail.tsx b/frontend/components/round-detail.tsx index cca0ea7..65a91e5 100644 --- a/frontend/components/round-detail.tsx +++ b/frontend/components/round-detail.tsx @@ -48,6 +48,7 @@ import { Label } from "@/components/ui/label" import { cn } from "@/lib/utils" import { ClubPicker } from "@/components/teecup/club-picker" import { ShotMeasurementSheet } from "@/components/shot/shot-measurement-sheet" +import { bearingDegrees } from "@/lib/geo" import { enqueueWrite, flushQueue, queueCount } from "@/lib/offline-queue" // --- Types ----------------------------------------------------------------- @@ -345,6 +346,9 @@ type ApiHole = { first_putt_distance_bucket: PuttBucket | null anyway_strokes: number | null strokes_received: number | null + // Optimistisk versjonssjekk (ADR-057) -- sendes tilbake som + // expected_version ved neste PATCH, se updateWizardStat. + version: number } // ADR-039 Beslutning C -- delt-ball-formater (foursome/greensome/scramble) @@ -363,6 +367,8 @@ type ApiSideHole = { // fantes allerede i API-svaret (RoundSideHoleOut), bare aldri lest her // før nå (2026-07-29, "vis slag mottatt før hullet er fylt ut"). strokes_received: number | null + // Optimistisk versjonssjekk (ADR-057) -- se ApiHole. + version: number } function apiHoleToStat(h: ApiHole): HoleStat { @@ -433,6 +439,13 @@ export function RoundDetail({ roundId }: { roundId: string }) { const initialTab = searchParams.get("tab") === "manage" ? "manage" : "score" const [round, setRound] = useState(null) const [error, setError] = useState(null) + // ADR-057 (2026-08-10): `error` over er en FATAL, hele-siden-erstattende + // tilstand (se early return under -- "runden finnes ikke" e.l.). En + // versjonskonflikt på ETT hull (eller en avvist kø-synk) er forbigående + // og skal IKKE ta over hele skjermen -- brukeren skal bare varsles og + // fortsette å bruke resten av runden. Egen, dismissbar banner-tilstand + // i stedet for å gjenbruke `error` her. + const [conflictNotice, setConflictNotice] = useState(null) const [activePlayerId, setActivePlayerId] = useState(null) const [holesByParticipant, setHolesByParticipant] = useState>({}) // Eierens egen kølle-bag (personlig profil) -- brukt til å tilby et @@ -691,7 +704,12 @@ export function RoundDetail({ roundId }: { roundId: string }) { body: ReturnType, ) { const url = `/rounds/${roundId}/participants/${participantId}/holes/${holeNumber}` - await enqueueWrite({ url, method: "PATCH", body, matchId: roundId }) + // expected_version = versjonen vi SIST kjenner til lokalt (ADR-057) -- + // flushQueue kjeder den videre selv for flere køede skrivinger til + // samme hull i én batch, se offline-queue.ts. + const currentVersion = holesByParticipant[participantId]?.find((h) => h.hole_number === holeNumber)?.version + const bodyWithVersion = { ...body, expected_version: currentVersion ?? null } + await enqueueWrite({ url, method: "PATCH", body: bodyWithVersion, matchId: roundId }) setPendingParticipantHoles((prev) => new Set(prev).add(`${participantId}:${holeNumber}`)) setPendingCount((c) => c + 1) setHolesByParticipant((prev) => ({ @@ -706,7 +724,9 @@ export function RoundDetail({ roundId }: { roundId: string }) { body: { played: boolean; score: number | null; selected_participant_id: string | null }, ) { const url = `/rounds/${roundId}/sides/${sideId}/holes/${holeNumber}` - await enqueueWrite({ url, method: "PATCH", body, matchId: roundId }) + const currentVersion = holesBySide[sideId]?.find((h) => h.hole_number === holeNumber)?.version + const bodyWithVersion = { ...body, expected_version: currentVersion ?? null } + await enqueueWrite({ url, method: "PATCH", body: bodyWithVersion, matchId: roundId }) setPendingSideHoles((prev) => new Set(prev).add(`${sideId}:${holeNumber}`)) setPendingCount((c) => c + 1) setHolesBySide((prev) => ({ @@ -751,7 +771,10 @@ export function RoundDetail({ roundId }: { roundId: string }) { } const failed = outcomes.filter((o) => !o.ok) if (failed.length > 0) { - setError( + // ADR-057: en avvist kø-synk (f.eks. en versjonskonflikt, se under) + // er forbigående -- IKKE `setError`, som ville tatt over hele + // siden. Hullene det gjaldt er allerede hentet på nytt over. + setConflictNotice( `${failed.length} lagret ${failed.length === 1 ? "endring" : "endringer"} kunne ikke synkroniseres: ${failed[0].message}`, ) } @@ -914,13 +937,16 @@ export function RoundDetail({ roundId }: { roundId: string }) { await queueParticipantHoleWrite(wizardPlayerId, activeHole, body) return } + // Optimistisk versjonssjekk (ADR-057) -- sendes med selv på den + // direkte (online) skrive-veien, ikke bare via offline-køen. + const bodyWithVersion = { ...body, expected_version: wizardApiHole?.version ?? null } let res: Response try { res = await fetch(`/rounds/${roundId}/participants/${wizardPlayerId}/holes/${activeHole}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, credentials: "include", - body: JSON.stringify(body), + body: JSON.stringify(bodyWithVersion), }) } catch { // Ekte nettverksfeil (ikke bare et avvist svar) -- køordne i stedet @@ -928,7 +954,16 @@ export function RoundDetail({ roundId }: { roundId: string }) { await queueParticipantHoleWrite(wizardPlayerId, activeHole, body) return } - if (!res.ok) return + if (!res.ok) { + // 409 = en annen enhet skrev til akkurat dette hullet først (ADR-057). + // Vis det tydelig og hent inn den andres versjon i stedet for å la + // brukeren tro sin egen, nå avviste, endring gjaldt. + if (res.status === 409) { + setConflictNotice("Noen andre har endret dette hullet i mellomtiden. Viser siste versjon.") + void loadHoles(wizardPlayerId) + } + return + } const updated: ApiHole = await res.json() setHolesByParticipant((prev) => ({ ...prev, @@ -1042,19 +1077,27 @@ export function RoundDetail({ roundId }: { roundId: string }) { await queueSideHoleWrite(wizardSideId, activeHole, body) return } + // Optimistisk versjonssjekk (ADR-057) -- se updateWizardStat. + const bodyWithVersion = { ...body, expected_version: wizardSideHole?.version ?? null } let res: Response try { res = await fetch(`/rounds/${roundId}/sides/${wizardSideId}/holes/${activeHole}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, credentials: "include", - body: JSON.stringify(body), + body: JSON.stringify(bodyWithVersion), }) } catch { await queueSideHoleWrite(wizardSideId, activeHole, body) return } - if (!res.ok) return + if (!res.ok) { + if (res.status === 409) { + setConflictNotice("Noen andre har endret dette hullet i mellomtiden. Viser siste versjon.") + void loadSideHoles(wizardSideId) + } + return + } const updated: ApiSideHole = await res.json() setHolesBySide((prev) => ({ ...prev, @@ -1257,10 +1300,20 @@ export function RoundDetail({ roundId }: { roundId: string }) { return (
- {error && ( -

- {error} -

+ {conflictNotice && ( +
+

{conflictNotice}

+ +
)} {/* To faner: "Score" (default, KUN hull-navigasjon + registrering -- @@ -2099,6 +2152,26 @@ function ShotMeasurementEntry({ }, [urlBase]) const count = shots.length + // Kartretning ved slagmåling (brukerønske 2026-08-10): "opp på skjermen" + // følger spillerens EGEN gangretning på hullet, uten lagrede green- + // koordinater. Regnet ut fra det SISTE tidligere målte slaget på dette + // hullet (start→slutt-retningen) -- `shots` er allerede sortert + // stigende på shot_number av GET-endepunktet (se _list_shots_for_hole i + // rounds.py), så siste element ER forrige slag. `undefined` (ingen + // rotasjon regnet ut ennå) for det aller første slaget på hullet -- + // MapPointPicker faller da selv tilbake til enhetens GPS-heading/nord, + // se den komponentens dokumentasjon. Bevisst en STATISK retning, satt + // idet arket åpnes -- ikke løpende oppdatert (ville vært urolig ved lav + // gangfart), se map-point-picker.tsx. + const initialBearing = useMemo(() => { + const previous = shots[shots.length - 1] + if (!previous) return undefined + return bearingDegrees( + { lat: previous.start_lat, lng: previous.start_lng }, + { lat: previous.end_lat, lng: previous.end_lng }, + ) + }, [shots]) + async function deleteShot(shotId: string) { const res = await fetch(`/rounds/${roundId}/shots/${shotId}`, { method: "DELETE", credentials: "include" }) if (res.ok) { @@ -2286,6 +2359,7 @@ function ShotMeasurementEntry({ holeNumber={holeNumber} existingShotCount={count} ownBagClubs={ownBagClubs} + initialBearing={initialBearing} submitError={submitError} submitting={submitting} onSubmit={submitShot} diff --git a/frontend/components/shot/map-point-picker.tsx b/frontend/components/shot/map-point-picker.tsx index 051a2e3..39924e4 100644 --- a/frontend/components/shot/map-point-picker.tsx +++ b/frontend/components/shot/map-point-picker.tsx @@ -33,6 +33,7 @@ export function MapPointPicker({ onConfirm, referencePoint, referenceLabel = "Utslag", + initialBearing, }: { /** method er "map_tap" ved trykk-bekreftelse (kun start-steget), "gps" * ved "Jeg er ved ballen nå"-bekreftelse (kun ball-steget). */ @@ -47,6 +48,21 @@ export function MapPointPicker({ */ referencePoint?: LngLat referenceLabel?: string + /** + * Kompassgrader (0-360) kartet roteres til ved oppstart, så "opp på + * skjermen" følger spillerens egen gangretning på hullet i stedet for + * alltid å peke nord -- brukerønske 2026-08-10, løst UTEN lagrede + * green-koordinater (se bearingForShotMap() i shot-measurement-sheet.tsx, + * som regner denne ut fra spillerens EGET forrige slag på hullet). + * Satt ÉN gang ved kart-initialisering, aldri oppdatert løpende -- en + * kontinuerlig rotasjon etter live GPS-heading ville vært urolig/svimlende + * i lav fart, så dette er bevisst en statisk, ikke en sanntids-rotasjon. + * Udefinert/`undefined` betyr "ingen kjent retning ennå" -- kartet + * forsøker da ett engangs-fall-tilbake til enhetens `coords.heading` fra + * det første posisjons-oppslaget (se initMap under), og lander til slutt + * på nord (0) hvis heller ikke det finnes. + */ + initialBearing?: number }) { const containerRef = useRef(null) const mapRef = useRef(null) @@ -87,7 +103,7 @@ export function MapPointPicker({ // kartet zoomer/panorerer da til å vise begge (padding rundt), i stedet // for bare å sentrere på ett av dem, slik at referansepunktet garantert // er synlig med det samme. - function initMap(center: [number, number], fitTo?: [[number, number], [number, number]]) { + function initMap(center: [number, number], fitTo?: [[number, number], [number, number]], bearing = 0) { if (cancelled || !container) return mapboxgl.accessToken = token as string const map = new mapboxgl.Map({ @@ -95,6 +111,7 @@ export function MapPointPicker({ style: "mapbox://styles/mapbox/satellite-v9", center, zoom: referencePoint ? 17 : 16, + bearing, attributionControl: false, }) mapRef.current = map @@ -149,21 +166,34 @@ export function MapPointPicker({ const fallbackCenter: [number, number] = referencePoint ? [referencePoint.lng, referencePoint.lat] : OSLO_FALLBACK + // Retning kartet roteres til: kjent spillretning (initialBearing, regnet + // ut av kalleren fra spillerens eget forrige slag på hullet) vinner + // alltid. Uten den: ett engangs-forsøk på enhetens `coords.heading` fra + // AKKURAT dette posisjonsoppslaget (kun populert når enheten beveger + // seg -- ofte null/NaN for et enkeltstående oppslag, og det er en + // akseptert, bevisst fallback til nord (0) i så fall, ikke en feil). + function resolveBearing(headingFromFix: number | null | undefined): number { + if (typeof initialBearing === "number" && Number.isFinite(initialBearing)) return initialBearing + if (typeof headingFromFix === "number" && Number.isFinite(headingFromFix)) return headingFromFix + return 0 + } + if (typeof navigator !== "undefined" && navigator.geolocation) { navigator.geolocation.getCurrentPosition( (pos) => { const here: [number, number] = [pos.coords.longitude, pos.coords.latitude] + const bearing = resolveBearing(pos.coords.heading) if (referencePoint) { - initMap(here, [here, [referencePoint.lng, referencePoint.lat]]) + initMap(here, [here, [referencePoint.lng, referencePoint.lat]], bearing) } else { - initMap(here) + initMap(here, undefined, bearing) } }, - () => initMap(fallbackCenter), + () => initMap(fallbackCenter, undefined, resolveBearing(null)), { enableHighAccuracy: true, timeout: 8000 }, ) } else { - initMap(fallbackCenter) + initMap(fallbackCenter, undefined, resolveBearing(null)) } // Løpende posisjonssporing -- KUN på ballposisjon-steget (referencePoint diff --git a/frontend/components/shot/shot-measurement-sheet.tsx b/frontend/components/shot/shot-measurement-sheet.tsx index 0df420c..39c9b9e 100644 --- a/frontend/components/shot/shot-measurement-sheet.tsx +++ b/frontend/components/shot/shot-measurement-sheet.tsx @@ -34,6 +34,16 @@ export type ShotMeasurementSheetProps = { holeNumber: number existingShotCount: number ownBagClubs: string[] + /** + * Kompassgrader (0-360) kartet roteres til, regnet ut av kalleren fra + * spillerens EGET forrige slag på dette hullet (start→slutt-retningen) -- + * gir "opp på skjermen = fremover på hullet" uten lagrede green- + * koordinater (brukerønske 2026-08-10). `undefined` når dette er det + * første slaget som måles på hullet (ingen forrige slag å regne fra) -- + * MapPointPicker faller da selv tilbake til enhetens GPS-heading eller + * nord, se den komponentens egen dokumentasjon. + */ + initialBearing?: number /** * Computed by the caller (Haversine) once both points are known. Optional * here so the sheet stays previewable; when absent a rough preview-only @@ -71,6 +81,7 @@ export function ShotMeasurementSheet({ holeNumber, existingShotCount, ownBagClubs, + initialBearing, distanceMeters, submitError, submitting, @@ -279,10 +290,15 @@ export function ShotMeasurementSheet({ {/* method-argumentet i onConfirm ignoreres bevisst her -- alltid "map_tap" på start-steget siden ingen referencePoint er satt. */} - {step === "map" ? { - setStartPoint(p) - setStep("end") - }} /> : null} + {step === "map" ? ( + { + setStartPoint(p) + setStep("end") + }} + /> + ) : null} {/* Ball-steget viser NÅ alltid kartet (ADR-048-tillegg 2026-08-08, brukerønske: "jeg skal se start og slutt på et satelittfoto... @@ -295,6 +311,7 @@ export function ShotMeasurementSheet({ { setEndPoint(p) setEndMethod(method) diff --git a/frontend/lib/geo.ts b/frontend/lib/geo.ts index 5e9137b..4deb2b3 100644 --- a/frontend/lib/geo.ts +++ b/frontend/lib/geo.ts @@ -14,3 +14,20 @@ export function haversineMeters(a: LatLng, b: LatLng): number { Math.cos(toRad(a.lat)) * Math.cos(toRad(b.lat)) * Math.sin(dLng / 2) ** 2 return 2 * R * Math.asin(Math.sqrt(h)) } + +/** + * Retningsvinkel (kompassgrader, 0-360, 0 = nord) fra a til b. Brukes til å + * rotere slagmålings-kartet slik at "opp på skjermen" følger spillerens + * egen gangretning på hullet, uten å trenge lagrede green-koordinater -- + * se bearingForShotMap() i shot-measurement-sheet.tsx. + */ +export function bearingDegrees(a: LatLng, b: LatLng): number { + const toRad = (d: number) => (d * Math.PI) / 180 + const toDeg = (r: number) => (r * 180) / Math.PI + const lat1 = toRad(a.lat) + const lat2 = toRad(b.lat) + const dLng = toRad(b.lng - a.lng) + const y = Math.sin(dLng) * Math.cos(lat2) + const x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLng) + return (toDeg(Math.atan2(y, x)) + 360) % 360 +} diff --git a/frontend/lib/offline-queue.ts b/frontend/lib/offline-queue.ts index 96cd6ac..ee03fb3 100644 --- a/frontend/lib/offline-queue.ts +++ b/frontend/lib/offline-queue.ts @@ -83,25 +83,47 @@ export type FlushOutcome = { entry: QueueEntry; ok: boolean; message?: string } export async function flushQueue(matchId: string): Promise { const entries = await listQueue(matchId) const outcomes: FlushOutcome[] = [] + // Kjeder expected_version fremover for flere køede skrivinger til SAMME + // URL i én flush-runde (2026-08-10, ADR-057 versjonssjekk). Uten dette + // ville en spillers EGNE påfølgende offline-redigeringer av samme hull + // avvist hverandre som falske konflikter: kun den FØRSTE køede + // oppføringen har en expected_version som fortsatt stemmer med serveren + // -- lokal state (og dermed enqueue-tidspunktets versjon) oppdateres + // aldri mellom to sekvensielle avspillinger i samme batch, så oppføring + // 2 ville ellers sendt den samme (nå utdaterte) versjonen som 1. + const latestVersionByUrl = new Map() for (const entry of entries) { + let body: unknown = entry.body + if ( + body !== null && + typeof body === "object" && + "expected_version" in body && + latestVersionByUrl.has(entry.url) + ) { + body = { ...body, expected_version: latestVersionByUrl.get(entry.url) } + } let res: Response try { res = await fetch(entry.url, { method: entry.method, headers: { "Content-Type": "application/json" }, credentials: "include", - body: JSON.stringify(entry.body), + body: JSON.stringify(body), }) } catch { break // fortsatt offline -- stopp, resten prøves igjen senere } if (res.ok) { + const updated: { version?: number } | null = await res.json().catch(() => null) + if (updated && typeof updated.version === "number") { + latestVersionByUrl.set(entry.url, updated.version) + } await removeFromQueue(entry.id) outcomes.push({ entry, ok: true }) } else { - const body: { detail?: { message?: string } } | null = await res.json().catch(() => null) + const respBody: { detail?: { message?: string } } | null = await res.json().catch(() => null) await removeFromQueue(entry.id) - outcomes.push({ entry, ok: false, message: body?.detail?.message ?? `Feil ${res.status}` }) + outcomes.push({ entry, ok: false, message: respBody?.detail?.message ?? `Feil ${res.status}` }) } } return outcomes diff --git a/frontend/public/apple-icon.png b/frontend/public/apple-icon.png index 8a8cdc45a6dc9e1cffb359bdc5429dac8647908e..947d6057fdcfe3968e57127bdae918a367f81cd6 100644 GIT binary patch literal 5020 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 literal 8905 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 M07*qoM6N<$f~m$PjsO4v delta 887 zcmV--1Bm>J1&s%gBYy)zNklv?!>MP~?2joSS+)(Xms1_Tl z+;x?psg_q>G3u`=ktF%jAvrf$e>oME<%4i}fugbkw!A=BQ9zaFG zzE|vtM5#Y;i|9wYGd4*`I7%=E9|9AkY!M>x0Ry>h>wl(Fb3~in^0r2?)uuXt&@7}9 z_oNw*-Y~hhtZuOqOi}8GV z49PLPM?n_h##6_cJdD8tN00IXn2)n3CUs=q{C^w7%QP*q`tC4?c&Ev<+&uqu@l_K5 zQv3==PY$Qlp1SbxL{`)On8mLJ{1>DZU=9uwxUOOL-5-53!Qw)^*Ns*{v?JC^#Yn`3 zC>&wljj@-jUjSrs?Aca~)C9 z9Je$bKshX{qbMJ0f)L-lA;4EHIp7}v00960ub#M~00006NklFRxRjdetl8YdS2lXT# z6pA3F7q#B}puK285LDD!tOv246+IOz6a}#-Q7=lO5qpTOkZOXOl0=hiHqE#@JL|N8 zGX2=hZrVT(9UjBmo%jB~eQ)0Kt$Wpm8V?%0)&R@~uf7&-YkzCGe6jsRM_3d&=I4_D zZxw{LNY5TT>OOvF;QW)0&M?Vmnm54yeLF(_-O$kU`qbeAhXAlw7%-X4Oy;6l?Z;Gc zA{LJT!0wW_3S!apmBHST4}4+>k6~hK}%AyZ|k!ie3 zZd$CO;hB5B5nSS^8q5ZaoA@^ZqY$JFRL!CH7n=D}H$Fj&eo6amz#C{ElempMcvV^g zF#ZpB2Ye6n1}#eaY(NQvvsv^wC<>M_Q8DRc;-73;mw!ffWH}WOm9Gf&{6Xt&ZmVzJ zW#$lmT}Ib46%ylQ>r~GfM_5K`=`ww zfrm2_L{4g%2LO?=knL}8E1%vep9>4lvri)D%p1Tk@aXeoYq0ryq8K0hJEu~^@dhA5 zKT{=a*=vb!1>(Cg&j8D^b=@pF5B>tGX8_4B6kxgR_-By-+Ufy(`I!5a(rJ|%em#KC z(Tr)jn9x~lJ%HInx7!+k*{O!N=sy4e0RR8S`5im}000I_L_t&o0Q(`<;ojwDXaE2J M07*qoM6N<$f~m$PjsO4v delta 887 zcmV--1Bm>J1&s%gBYy)zNklv?!>MP~?2joSS+)(Xms1_Tl z+;x?psg_q>G3u`=ktF%jAvrf$e>oME<%4i}fugbkw!A=BQ9zaFG zzE|vtM5#Y;i|9wYGd4*`I7%=E9|9AkY!M>x0Ry>h>wl(Fb3~in^0r2?)uuXt&@7}9 z_oNw*-Y~hhtZuOqOi}8GV z49PLPM?n_h##6_cJdD8tN00IXn2)n3CUs=q{C^w7%QP*q`tC4?c&Ev<+&uqu@l_K5 zQv3==PY$Qlp1SbxL{`)On8mLJ{1>DZU=9uwxUOOL-5-53!Qw)^*Ns*{v?JC^#Yn`3 zC>&wljj@-jUjSrs?Aca~)C9 z9Je$bKshX{qbMJ0f)L-lA;4EHIp7}v00960ub#M~00006Nkl - - - - AABCHWp1bWIAAAAeanVtZGMycGEAEQAQgAAAqgA4m3EDYzJwYQAAAEH3anVtYgAAAEdqdW1kYzJtYQARABCAAACqADibcQN1cm46YzJwYTo1ZTI5N2RiMi02NmU2LTQ1ZjAtYTNjMy1jMzE1MTZjZWE5NzMAAAAB5Gp1bWIAAAApanVtZGMyYXMAEQAQgAAAqgA4m3EDYzJwYS5hc3NlcnRpb25zAAAAAO5qdW1iAAAAQWp1bWRjYm9yABEAEIAAAKoAOJtxE2MycGEuYWN0aW9ucy52MgAAAAAYYzJzaKXkx8y3IMAJsMr8Ye/qsVoAAAClY2JvcqFnYWN0aW9uc4GjZmFjdGlvbmxjMnBhLmNyZWF0ZWRtc29mdHdhcmVBZ2VudGhDYW52YSBBSXFkaWdpdGFsU291cmNlVHlwZXhTaHR0cDovL2N2LmlwdGMub3JnL25ld3Njb2Rlcy9kaWdpdGFsc291cmNldHlwZS9jb21wb3NpdGVXaXRoVHJhaW5lZEFsZ29yaXRobWljTWVkaWEAAADFanVtYgAAAEBqdW1kY2JvcgARABCAAACqADibcRNjMnBhLmhhc2guZGF0YQAAAAAYYzJzaC58ECUaO7UOTEYs77pAvg4AAAB9Y2JvcqVqZXhjbHVzaW9uc4GiZXN0YXJ0GQESZmxlbmd0aBlYKGRuYW1lbmp1bWJmIG1hbmlmZXN0Y2FsZ2ZzaGEyNTZkaGFzaFggBCzizGdIaYuVMnolayoF9+WgI7Bw64+ppItmbumwGUpjcGFkSQAAAAAAAAAAAAAAAgtqdW1iAAAAJ2p1bWRjMmNsABEAEIAAAKoAOJtxA2MycGEuY2xhaW0udjIAAAAB3GNib3Knamluc3RhbmNlSUR4LHhtcDppaWQ6NDliYTViNWQtNmVhNS00ZmJlLTgyYWMtMzg1YTcxZmUyZjY1dGNsYWltX2dlbmVyYXRvcl9pbmZvo2RuYW1lZ2MycGEtcnNndmVyc2lvbmUwLjAuMHdvcmcuY29udGVudGF1dGguYzJwYV9yc2UwLjAuMGlzaWduYXR1cmV4TXNlbGYjanVtYmY9L2MycGEvdXJuOmMycGE6NWUyOTdkYjItNjZlNi00NWYwLWEzYzMtYzMxNTE2Y2VhOTczL2MycGEuc2lnbmF0dXJlcmNyZWF0ZWRfYXNzZXJ0aW9u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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2WQIAlL7V4NQY7Jwjk2Y0dnoUfBHcfvIx0jMriJD8CXXcY12XQcsJCC/wCLWLZFzLKtCXH18SLeSFH9S+vwL5CCSrs+PeUE2woT/jQ1LgYIy8GiJw7P/YZiNcOFT5E6yc/aEZWd6nFW4YrYQ+MKuCainGazZQfOe0NZC26Ae4KuLVDo+eFf41uXcI64I+yPWVPxWoWiLoeUljQ26PvgJlIGqippcTiVKwFPlOcxub6pctmPR8Y4UfHSj5dCVpMvu6OeBmOVtzdQ8Nw+bOtPup4HOA5ohStm5z09/1BIb8Z3oiDNFtmeyMAXdB29BkndOUaLjy7RSZGZYSRDqz/m1dn/UmkiH6FJlqcmEl+0A4ndRiLP/xzNgdmGBTiC+90GuRNkasFENd+lpW49U1rM6WX06CV1JSjy4MrYxzbkpCYx/jMsmBNE0M9LA8Mu19Q8fhTT/wW7aMy7pPDWhZdvmmA123WYJNK/qJLIC+vDzAAP2QDHIv5ozxe/KaLOGSac1pLcSV+n4BHRxzmZhfaQwqPMesizsukxtta6r/1bnFVXs9RMOqTLx0m2hGd3Mq2grmUMcv/i/EQd98ZWUUmKF1c3fbiFjohYHgydHAe+cmHWfZxHhWsUJu90qSkrSgjEzjS0siPBtsrgM+xBtvUyTYQWqUgcqHvt/s3hQ6p6Vpv+99VVM= - Yes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/public/icons/icon-192.png b/frontend/public/icons/icon-192.png index b25090cbd24e14a879ba7c5bb86b3000f2192456..a0653617b6db50412d180eb0da8fd105f1e9c070 100644 GIT binary patch literal 5567 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 JQpMLn{|BA;Y$pH! literal 9786 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 Z5SwY3MR@2WH&3Bt}H8v z11ju13*;_>jpofosD9A${(cS3rEt>4!^3*uN1}E9OK$}qFhW7=+vOtyv{%nC4G*4R zK5ieAXf+HOorxCVO!%F)d|QFdGvr}3Ul^#aEb2b|mPlQU;B0cwB1)TF^BYqNseWa> zNexXZRT6r@ZJKoKTUG>I8_0E*OA_zTo?u+AU}s%QI;3}eo)xHKKG&+X&$AY%Ofre?$J*K+87Ux2ZgpU?y}U|#-o zfVOV9$}fKv->j+sJKNkWRYRz$*b)DRP}783I%>55t3B3CyO7Lxw^D0^r?1sL;P=dL zy1Ns17)Ty$WCHBy5xH)wQz1fCimeCHqtbsx_L4N8EJJ1qwXscT8n6( zWKZ^xkq7JXkh~i+m2*h(wHu7V`K@4#3WWkkO$@{*Rx5_Zlc4Ks;p?)mPS`&N8va@g5rB4V^y`|E`s^L62}M5 zt#$iCET5KSV=|S(pm574exf4;n_FR`ul9F^$taG*(EM;FUH8vXmvtpzMj_w**s*uN z`RqmRAqy?1=Z#8e!I#z7k(=1v2~FTm9nS;h^xz*Z)twceM!5VCc)-4%=1Yw198~D9 zaYn}@N5A}Z?`J==b1oas1sZuiihA?C2l-v77PF~VthR;ZwqiwMQOTk` ztXCrK_OEu@;-ht&{bqc`L@q6|YvHnwMkGAR2S6Ao46#5MJZsBJ48s_k?5tNTXukRQ zgk1$U-JCs)*@Az)G|@S0T$e=b zuCjE2L=6;YH#+=75i-K`fdh z&1bi|N?FV846{>Lo6ojl`st0*`>5~}#J+#g2a{w^?~5kAsG!6@mL>`9xpdm1+5{VY z465&Q16t*P$c}wws_?R=p033KWu1}=J6ml-&tJ2d&}c+8>;QwMug43mSw-biXZth=&Sl;(B)4ouR>?86hxs0 z6OuXB)yiIkX+8IJqd&Qkd?Bh@eeS-yA%0ymX1&|`r23JTS^75zv+M{hmR{O^oyHGZ(sB?) z0#NmniUbuK-c(ab?;7?Wx8?I`F*~<3{H-Zusi<#WU}C7u_T5WmK?l$NYg(I(poE-_ zwDT#f`eB_F_Gp$u>;m-z-}}!Q5zo`f^l=7H`Y{cthzH6|cFM_ve}yInz#D*hv4t<` zQ-hCzR$r>4EvwzKviY2iOp6$W3?k3`>B6cw;MA zyKw*OJmc@2L&I2+NkVGvWv~&PcZ@(kB#9hnefn#sEaSUc8+W6dLFE1Xbbd|inicTsBn|$pdE5r z#}hg6zARs)8BtQh%T>pm{z@yIBEk;xHgUQeq^s6u~OTPt2YS`+zrR3GkJ?s%<{%|@-q zYcz34dxvTEQAx+CKbPy|*L2~9FQD_^J-(&!P4}{r`k84tvcv0rad#AyX!=nro6d6_ zbZU2CJB++rMW?3pu)Z^I$qTd)4f#&@^LD-D?1+jR%kB>abOZp5d=mVZKhjjd z;q`g3QV_(6ZqZN?@Ktlap}NQuwpk%tUIk%Hd) zXG>Mq?Cw4r~yPt~JC5B+(tW8$iMOxzo zdGS$7mMooanIxn{OdN9e>sX^(vfFO&JGPu!r+(;NwvuGV3jx+~DHX$)uFzz%)Ist7 zg)-(}CwsC6*a?3ZDwmF4*AB@`y76(>CLYuFQu!K~8|azxm7gUz0u3z6W|8akLcZb{H?ckG`S7g5MgO=k{K{T#7O;qL}x!3k^ zK-wP4K{lQSrh?ypF>Y=pSyUDpxXF$a)#3&EXwAiF!WWM&n*r_|lfjhrf2= zv?f4I-^K<+o{{Pa<$G}c@9UWFv=Aq%!>JZr!L*9WPai{C*RVy7y8Pm0PVZk}`=6%- zfh@#34plJx;u$6-kyEk>I)SF~!pe$qD{VIyyaElYwisug}&hdAT^&Gb85*zPp`lNO>Bg99|&5jo3@E{e>+$px@tI8a2=jnO~SKeEfnxd`HfIjgI@? z&za-i+HgdkSJ!kjhx5wgOhF;sfaqONqH(Jvcq?_W@bXkc{oQy%wAl5cpXdJl>Aa^H zt-RaObh3bcsV8!;V{(EzZ~y+tmpb!wVXkH+)_336+xxCrR5VHqRrEvt8pc|WKurx6 zSViZLVc9dx)9E`pOi%HH`5*OnD>!VzVq2N}&HEPAdCy1mNl+moz_OtXM*f3!g8>f; zVGHTThk}Yx!T*1x`vJXvpvVz%zJWgAxZA*_Q_=Wo$o3C;2DT+IQiTT!a4ltZMh?lG z=xVclK$p8>0EtI**kr#$NrHP^zFRt^D!2Uy*nGb%hF5kGneXN6JqoWTc%o@wlz&aT zuiiK&G!2ipPUc*_G>`k1p-gs|91&gjN-6R*VK%q#&F!8-Z`IoRjN_AQkQOvY}S<{N>eOf4x?0a$a+2 z9FMpmH9x9yOVF}N`1b$+2lrzbOH4B8%s@>e^csq1m=qosVNRH-jMu90Tno>-R7y?K z=cx>J!AI;k>uj65^p6yh>d0r}SRA9N3_g0hzCsiXCYmTFhFSrBd?Z>qetaXdU5T$E zihOPPtKJjz4)%X*|LpN-Blj6YGt3}*x^M96QPIGCw;UfiX^#9z=yq;T(eQn@@%vID zehxc}XFMeDQyA%ph^}0f*b$d4wM_A!KV*@t;{>8dXDM2hvOV3i3t0)l!!jD0c<8f?Cy9M6 z8&4?IM8Q10IG3Cc-&_O)g-Xy2Y>>O)z-*Pe32NRN$zj;o)MMMhKvU>XWep1%jZvpM zs25K(5bii6EXQ2qQHg<~Wg9!b)tr~kdwWjP&G zmOVA9LLY?w`tW;w>>y65ob`9*x8Xm>0_TZWCC$INjp%V8l2fBhpT2DaP@jtHEw70; zY42+RE=AT|s}iH{ft07uD>)P48DnRoe?}O#uW|15S}^s*{krY_LAl^g7B;T`VF4=7 zwP--vp{6c(nzn16+hxS0`xIskAF8(m%sRy5lkWLDPFpocC0F{CBLu|bw)-tOG!E@P z&hT}s2?zRO_1_oY_QxI1CmMQJj2!!#u!c5eRiVTiU4^b4EZ1i4DEF~6v4JI0^f6c8 zi2`QWmP|B5|IW;1onhf#^ZB3%$vNRT$~5Ynmv8qqv5bjJPuKd|F?MTKVkHT+BTl`E zbnjB+-o}=Y;r{MJs9wl^oJA6#4QYq9ap}7bLpfbMoe>7kp00r!l8%(A&Cl+v>Q;um zk-JZMgnNxOE%;am1-=akq`xy1D(Lbus<^7eKY5$OIvM$6R`-3q_bYw3?6qD+)`F+W z?-PT^iS&5lzrsNVH1tw0Dfx$(`ggv@H}ZKa^Zp`84{Ei?M#ix84vB{cqTL1m zST&SSd7Z9mI?vf;I@mXIZXzR{fBhoo@gV!0Xo=HJ#7N|*;(Xe>W9_%yif`MIX=6nT1Y1oA4N(Esc@@EO8+JM+1J zlY5mut>*8R)c%q@Dt*v5zK|e%d^jF{c3TjJ-wDfP2e@b8$3#6IkMUfIQ6 zW4@rbAB;$DjX(5rT+-6}9m#A5-8`qb-8G1H@2J4;t>oPwtmLl!wEYooXa*kGc0`Eg z1D9q%DMtqlr;q(@Mixzy;Eb7EwmQ!CxfV)*r;ll7Neqig`U{niw+-AVkjxVMa3_9o z+0Mmp-Ap6K?qON)EHNYaK6feV&|4`+1A72b{p-Ft0{20mcP-@R+*6p;I~Ny=DaKqYmt zd;(<1;+H@8fkMm+GCuD;0n1I-t9SNSW_Sebr22L4`n8;1`z{d3ao<%;B3)CEPdpbb zWf#rN7hh`}(z@E`2uqDV7I=(XRU7V%CPAJCmS^yjnYNE#%1dXvL);(m&!LX<;{>;=u8Zpft*$~4jUP80Rwo8i>p5Hg zM0SsL$3MiCy|^{7wU^^Yeetru_6!e%x@!&m1ATeK;3TyVS$_Tc1@@naxaIxV)W3Hf zMkDO-k!uV?48sS0uemE^gcR@$*@3%wy6Gz5(q8tP9~xPXFDuKf%MU62SRwmaH(GDH zo>-Y{2G`Xw+DNq#^YNFFHegE?kDq z&J^iEjiMu`3i5sJ`J8?eU1sTr4O3T6RYUA+nZ#{`idqeh5;^pG;f3;Fp^s&PFa(>! zmG>p%%PAo-_}tuwP%D&Jg7Ys4 zms46qme5SgLe+V++k|NNhf^j4wEjL~2GDoBN!H;PvS=OIOeo-1C0GdDc@-Px?6Ob7 z^Sryn$CGaRt6Ivp8wwkI=T59Z%vLJweP)w{01y-H0kkv0I;Dk4q^r@qJQ_{0;|=k<`pi{p@}I3UpnX z@_{QV)_6mRb$C;%MK!UV(OxQS#-@`jss7!|mgBl^`pEe|u4qMDcrnYu$x5DGCHfHI zrT|HCrwES4PMXPe#d255Ku}jpr<^0sVzoruinw4&oOnJ&CuZ?EOF8|xSwI^XR4h^q zW$|;=;gC#JoD`_xkO}^ZBv&8DF_n&ET_i`Y5ahLbthfi=CXfe?0{E$q!}*{|QCa(L zht@DL3^mYtwFu_57VrEBn~R^{gpa8Ev@c9;L{dEQn&cB(P&xSW=`rB0x`Txj6`HH;DlusGnoI6f&g#Ot!!6)at zRo`vei~%zjF($!vQ@SCRe^Krn79=y*qOdLAH5=XZnK_CB+W|GhwYEck4qOjELbbC7 zH&nz=l(Z#&qf#wvMSN%XGD$hT-tk@%^o0P+S@Sqbm>c%{k-Nr>7HS7G13$rn7sUpa z3|W6J!l0Cd@4>c*U2a-H-1!!6nEf z86Z+5>qkO{%F?$3^&txu&{`ROiF`|AW_WeMedYEjIgdYEZRddSku~Bi~?yqZjK@py;i%GqMrA7D<3cuY?Dpmyssq z7d6K9pv`GumW5nPFE1O9I#!eg&)~b`#IkG_wsnabFH|_F`5hUz;riBG2h<^DD;iOt zFnluBT-i+8KO)5S)L+8#$O+Zvr?#P z{rYs%(DV{q8%EC>jpK-qcVYHr^x0S`6$Ez*Wwvz@Hw}`j1_HL~iAfCS4ftFM5PM3^ zzjw=p98&}@{1gkeg*(??KVe;N@*7%d;?+-7Lg`A81};8We@*DB2cz^oAC9)b33+KO z?v7*V%h|(AO9dro1L|&{ zW4s;U4!tB>?|aAl4GuX2uMeNvqAxc_n-QH8=ZrSfT2!G6K;(a5St}y37o!PL*YbHi zB0PoX_*HXWeSQ%druIaRHnphumrEM{rKB<<>I^MypFF@UXLljY zdj9<@)J5vEbL}FAL`IDjs_jkXMUpE-PvCjty z|CO3Ed0NJj+bs*^SZW>0ajy(EH=xEyinN&}1`6uExItw-v934EUc~xE(fhrVoIXy4 z@TaAx5CjNNs+2bt`?yK1L}CtC2Gkx}A*~W!@hAX}&wxJ0H<_DY^!?!QBg&oFLVbZt ztkBc=B2I3OcbYO-^Ed{rm4KDLTdQIu$25A1+*g8`75pit#qC{9+MABC zY-#tcxngo`hsoNZO?>iNJvtTu$%6a6RIQK~_L`j&4WM-L9c1rHx=-C8B3meYzX0*Lv-8Pw~N{pg* zYdDpuo(smV`eWth>hGNYVwz@kfKHh+P(n8bE%a8`a0t=1z2dXY$<^vW%}9tabML4v zAkxTNxbfY`ylp@U5NDYwfPq-B5?T80Y|S(I9Z6$y=5-eh@gx(X7|D`qS=boY>1TNw zC0+q{nJOVCH!sS9Pp(K>GBBY@aKt-OT{e=6Mr&tuuh5*MQq}mgx6&q~?y~~363VdC z8Z>h^(vO5sSplp7^G>Z&QP$&EAOQq7qJ*c5+%lujpdZe(* z4SKtCadhXy*_B~AWQ9a$#`Hek@@qRP{PKE-_IGD&T-B5N`m%;vzroq3%2KP(_l5yFQMa@g*9 zVVe|qXOX>@{CTSB3%kk4uxO|2omU>V+55uLg0;d>eC9}PI?~K6njVT8)r{}~yxLKM zh@(5j_H~@mF!Ox(D&O4C$g`{aC=DMO`$8L<^O8LN8>6yp%-dliFD7nXNl{1b4mF?n zZu3OogbmEPo*cAK{O*Fd3soPn*Nh5Nly&XgXw7&&CE#z2wZ%s&HHdJpZdivewZuKT z7p*9Vv!+I;-tVO7N%9q&W5x#ou-q>S&V=w*N3V=Gul017(1YWU;m3BQ#{zH_2JeDa) zAkYIpS_g{jU>96Nb*QYKk_AX_V&}hiQI)ql)M!DwHw0>Zg)8}?Mqyg(gC5XEqq82>0L!Yk~&^9Y>LC<^|)^ z;`GCI73a$_BN56HgYhM#sr_lv!C;YjzB+hmU7fVKb|YR3hg!LO_Knpn*?r#2Vn$VZ zue%3CsGA~1I$l+BWm9~G^O0<*){va5`3!!CZ>UY;4vUQ2r$}8b&iT|W zjeC;l<~q$F{bQ6jbC(rPMxkuE(kU41 z9z=)+L8QS1pz~*+lx&ap!fz4S94L1v!rA><>W}oLr|z?mZjzGOA0`~yTq&CgqNW67 zzR&NF1TyFagDkkeZQBc^SWcr<~qFetUXk;W6>j_t%jh^3*kXJz2V>8nGHwfJg-1RNVp{E0i(rgS2(>wl#9}V>%nUmT?4F$G%<$Nv4E#-(?i zHdG@0DeOW`Yr&vRwq>%@3lv;ebqzz0w3{DF3yu4&jV{q>X-{`YqP6uVYwK`j^s89v zVBFgeTae(Flli?$QQp6vH2h?<*D5(k(oeg0>Q?@%i@Snjt12u=6!)*@GN81W?(oFr zVu--B_!J&7Of7he+-|!OZqFRGA;m!0N|u>*HcIyC?Ol^$I0n_FXzOY}X7P&i16ZIH z7OH`v_a-McF58P z_M+haHUlx5ui7s9R4M{kUVw*d9|BvIXGCtAP@+RE+Y4yK@2A$TTJy9Hf^PqO{$I&_ z7!91*zh!#U2^!qOCBe0BX51C5gcMB^@?NGv6|g3HxRHz?a4brKmu56(53f;sq*N!T zkybZ#Q)jnjwDEcQBS?VFFV~ogj5CzK9!0z1^*rS=`v?2eWkS2+nJ0wrIiYYPu-^-O zyby!-a2I5T(A-gN5!+eA`wj5VJy{!7^~@#!n?plo=$2lrO`9jS-lpQ+5Zp)B2pPC8 z{wmWI4*k9z2-;+swU4jQYCp@hG9Z*~62~zW9abd%@k9YH27y3Bg+o{hB^sfEL3chS zHy4z}UV@9)?=UaGgJ^MGZ2|@!X9*``asPm?sUv<7cAX-TeAbo8eN!YSIxpWWS_(4>lI4z() zap}J?cCmL1t&yT?W_l>@rSU_M*3%r;^|usHoX0;4e&SExj7ZNmgbg~^ocO{3m-(NCaNA&7+m7j&0qy^-zvXw;NJ^~SmpmwCvINwBAM z12-HCu9vn}F6`g7ZakwWpD36<9(f5T z0wO@GJX@_F?=rgI^<~paqGXe}m2=bk3wcMSp+&4_!xR0P)l`@Ai_bEXJZ^OYD|4uX zAwUHXUMEi8sdT3BACcLe#^Pz|4d{mtdy@jfmgVAfrYl%3fe@3Ae8lD)>}_B*wVh0tLt?>*VD6Cy}vT}&%1kYMTntI6Jd@>H)s_jwIs4G}-H|B7wcbI=cz{K(MT$V?TtxwtLqtQ{wiDkwX= z-0l&)u)uwn0RtB@X97}E!rtG$Rk=qe)5D;3S?gR``OzZ`VysYUsTX?ot?%kcCM z;=-rSbgfuH2nF_=^_`avCJF;HriEd`XMFVS5k|jdk zrt_Y68u<2R+vyAV?)!5M$3K0Vobyl}p9Ew$(*Zob!Wj7KQ^UHw6QZd4a3+{_4Q{w_)N4?f3 zKRH{CcziY3Xwfl7N-t5&C+|A=Ic7aZ_5?6vGAQ}O%dIhVP2k=51F+UWZ)5oKK*EJ_Yxa1DoE#;1J-BJ1ByO1?Kc+*7(zyN)}b zD2q6&t^LUsjHFjGCVkoPwGLtp2HtYPK)>w`rQbrix%j8?RE|9q6-r0VBemTn)?N_5 zy1C{%`QErTrQ=(F2o_{rCl(qn=X15*da4Gz>(Jr=wh^Q=W{s##+rZm=}}E1WtY7bYrs)sYuZ0@>6Z-l0_z#531Wc=>t5JcJx{I<+ z6CIXEWm&0;vKM4iodE9Y3FI6k4&16FNI=OHY>MFZv+u z4U6#yb^xd_>j@seTBOFt8MG3vdk!Bc=)36H^G>Zm$Z#87JMc(|iJzDAl@^rF_wDZ` zl%}3zyopWVx)tur72KJPA$WZ|r>E9jglwH>R}I=M#!LPBz)QcmP)`xM9d#gGm$g29C?H9R-(dgmUcL75~1B-an@>6T${?bX~)*5|~au+_`JN6=4D|6{W`> z9{MAoc&dRu7*0RrIiX{Zz;ZR6hMq2fu$8|_OD#UZWrLxT@VPYnR2d5>(`*+|Rt8r( z%5kW9VlM<~Gh~u1X>9ySI)PY*!GLFl2s#qg&|K&jy`<6DVH^?BIVz=VV#Vj=q~Fw8 z0IC`-O5+!WR-?g9Rm47f1d@rb`nn3Zt!YX8z0!vv$Ss1>ii+sF%&GnaeaZyF_XsYA z!#yD0=Mg~&do-B0oJx)+Fas)9Rg}u0+&|F_2d$y z-!tNoq4hQfA*X?&xGr|P>UrCOks>PMJB|4WZ;$`~{W%5rBZ$7T%piCX8-{9N zJ@5=rkjN;f=qYrpVmhUb6fsDAdc{40>&)r@l?6y?D)O0z`NkM-P0OB#*at8*Y!s60 zCxBFuP<&g{NW>)VJsE<47*t8b$V-Pn_(S1{nl1>W9st-w#8D3GxElhPE(U%>Y=C+{ zi|6TwGCmNW7B{fHx&1k;#oPj@l7)d9uwGCM#K0LKiw>dGVm(9FX2ikH|2I4IA%55c zAQ4+^aFM_-SWcvu8a986^+)N#M*zuhj63P2itM!S-FpYDVj13 z$SMTi`V9$q82y;ESw_N$#4u_bNJnp|B?M!az-lWT6zNU3vC>F~b{nLq&Y8@d%p zL&Pc)z})VUpNL-mDxd(i2djc03;jr_)B?tr|JTQrMm2Fo;mIVJVRgV00a1)>4MBt| zf{Mk7HEdM`0VA<0wt!)&OF@dZzyu^9g&J+Kil}h~Q4p1-qB$(FE)&)JhN-7L-Ez8gIUJyo)w{sy`|4U&BF247Ez9@hLzXZ>O-V0QIM^mw%En)90SDj zS4rE|haC+!dS@T56q{&x=+bR4HqVKNzb9dS2k-6+Dlug(Pei)}TeQvmo?G|CSCrQb zEY3en=EajwHlu{?HB*3&q4}xJi_ocMEWzvpqjfOebayqWw>VFH4;GvaIODgYP-ZTs zsIkK}8`ltbQ@Yj;v@U<}`a_x!Oc&&W0Q*feuhI!3#GJA83wvISiw3;wXW}I>m_$vpQrerz-uvhae_~v>clj4SDB({H087Pj<@anemWw+=aLW~ zF#dChj+Hk$XD0Gef@ft*OPpsB?+?vk%{^wdzU3d9rESb^=-Szm{X2{@ftOoNuq!9& zRn0@Dfm5#;=p_*WC9$Y zFW;RYk(B4J34N9Q>$)i?&c^x^z34K@)o#9jba=9^?#QZwNbblmaZNFwuZ%}OrPx8K zrB24aI~}<3-f;RwZd7E%Z^~IDW@$2^I&MGRZhyDV`Df$J-8)vEU2i*y!xC}M3b33f zA~!PJUhe7e{i~t6{IBn?d?-vcecX@O75ok~!b{AhH1JEB{!ERX3h!x0}z zFlHTXC~HW;5kAZ!a-?=7*E~2=7VL{zhk{y8% z)Ra3l_T_>cw)uM!g-+thgU*OlS$E!oeE})y^Vmr*u;G408}ik(e9d#~jAwnC%*=pt zO;cZP!XHx64L+YIpH9$G#}7M_;qzDx9uJq=3n27@afEp{r5fO*VEIow`XUkYgf4$WmAm0#_ z0+d^N`6h5J=JTh5VZTXbD7<^*0)|0}p#;*WcjoK(d}mfv zl@+XTn=hFzXUJy|6U#1VaUN<;^{ymj)$&#;xFkn|Jt~|Qd)pvLMyj()$%LxrYGVkY$Vh2C&qy(HdqyH#%_Q__Xl07-o5OMhj|KEV1#oB&kE@J@6{3!Hpzz(fihBU&`S-CBtc04v4M zgh~5y?;#Ev6S5qdU}?AMHo^yx|I&#RVd7e3j;f4S2PBC^>>_r&nT#>&(e;nFbc?>Tn*EPT6c$s9c9^HHTm6~N3x=B$Y3a)hh?HNZn|sDodzFqHOy^lInvO(HlarL;k086EJ*!VC37ESRF1 za0!N57z-leF@y8XzAf7kA5bH*nRt)h1!+-)h^MY`+!;aU_$Cfzo23c)A3;_um%eX7 zz?x@@2K3Tc_$7`SGrTJZ8}zIPn;8nBnnbTShpKr)M3MI;{1Zlw2Ofc|Jeu^dTtT&e zT_8v?_U$M-tgd^YpN*<{!z~4RAG#wF=G*>pS$pmS9|@^-1*KnaeX2i{f;iGQ!G=Aolsa=R0YY$Ys(vm;GJU70Dj(q!8pj>bn!+@F#E)Hz0=6IRs T;LZJFc!Gt9!xmL9jLrEQAZe_K literal 45739 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 Z5SwY3MR@2WH&3Bt}H8v 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 T;LZJFc!Gt9!xmL9jLrEQAZe_K literal 31457 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 k`1&u@-g8)G!f2uyo*1934{x57~kuk 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 INEiqGKOREH#Q*>R diff --git a/handicap_engine.py b/handicap_engine.py index b6236df..e11139c 100644 --- a/handicap_engine.py +++ b/handicap_engine.py @@ -128,6 +128,7 @@ def max_hole_score_for_handicap( strokes_received: int, *, index_established: bool = True, + course_handicap: int | None = None, ) -> int: """Maks hull-score for HCP-formål (Rule 3.1). @@ -135,9 +136,21 @@ def max_hole_score_for_handicap( (Rule 3.1b). Før en indeks er etablert i det hele tatt (spillerens aller første score(r)): par + 5 (Rule 3.1a) — enklere cap fordi ingen handicapslag ennå er kjent å fordele. + + Unntak (Rule 3.1b, verifisert direkte mot WHS Rules of Handicapping + 2024, side 37 -- ikke bare koden sin egen gjenfortelling av regelen): + "Where a Course Handicap is calculated at more than 54 and a player + receives 4 or more strokes on a hole, the maximum hole score is par + 5 + for handicap purposes." Overstyrer den vanlige par+2+slag-cappen for + akkurat denne kombinasjonen (høyt banehandicap + mange slag på ett + hull) -- uten `course_handicap` sendt inn anvendes IKKE unntaket + (bakoverkompatibelt, samme oppførsel som før for alle kall som ikke + oppgir det). """ if not index_established: return par + 5 + if course_handicap is not None and course_handicap > 54 and strokes_received >= 4: + return par + 5 return par + 2 + strokes_received @@ -147,12 +160,14 @@ def adjusted_gross_score( strokes_received: Sequence[int], *, index_established: bool = True, + course_handicap: int | None = None, ) -> int: """18-hulls Adjusted Gross Score (Rule 3), grunnlaget for Score Differential. - `hole_scores[i]` = spilt bruttoscore på hull i, eller `None` for et uspilt hull (fylles med Net Par, se moduldoc). - - Spilte hull capped til `max_hole_score_for_handicap`. + - Spilte hull capped til `max_hole_score_for_handicap` -- `course_handicap` + videreført dit uendret, for Rule 3.1b sitt >54/4+-slag-unntak (se der). - Forventer nøyaktig 18 hull i alle tre lister (bruk `None` for uspilte, ikke kortere lister) — en 9-hulls-runde sendes inn som 18 elementer der 9 av dem er `None`. @@ -168,7 +183,9 @@ def adjusted_gross_score( if score is None: total += net_par(par, strokes) else: - cap = max_hole_score_for_handicap(par, strokes, index_established=index_established) + cap = max_hole_score_for_handicap( + par, strokes, index_established=index_established, course_handicap=course_handicap + ) total += min(score, cap) return total diff --git a/test_handicap_engine.py b/test_handicap_engine.py index dff7ec5..8d1e625 100644 --- a/test_handicap_engine.py +++ b/test_handicap_engine.py @@ -405,6 +405,64 @@ def test_max_hole_score_for_handicap(): assert max_hole_score_for_handicap(5, strokes_received=0, index_established=False) == 10 +def test_max_hole_score_for_handicap_high_course_handicap_exception_rule_3_1b(): + # Rule 3.1b, ordrett sitert fra WHS Rules of Handicapping 2024, side 37 + # (verifisert direkte mot PDF-en, ikke bare kodens egen gjenfortelling): + # "Where a Course Handicap is calculated at more than 54 and a player + # receives 4 or more strokes on a hole, the maximum hole score is + # par + 5 for handicap purposes." Dette OVERSTYRER den vanlige + # par+2+slag-cappen -- funnet som et reelt hull i motoren (var verken + # implementert, testet, eller nevnt i noen ADR før denne testen). + + # Unntaket slår inn: banehandicap 55 (> 54) OG 4 mottatte slag -> + # par + 5, IKKE par + 2 + 4 (som ville gitt 10). + assert max_hole_score_for_handicap(4, strokes_received=4, course_handicap=55) == 9 + + # Grense A -- eksakt 54 er IKKE "mer enn 54": vanlig cap gjelder fortsatt. + assert max_hole_score_for_handicap(4, strokes_received=4, course_handicap=54) == 4 + 2 + 4 + + # Grense B -- 3 mottatte slag er IKKE "4 eller flere", selv med høyt + # banehandicap: vanlig cap gjelder fortsatt. + assert max_hole_score_for_handicap(4, strokes_received=3, course_handicap=60) == 4 + 2 + 3 + + # Flere mottatte slag enn 4 (f.eks. et par-3-hull med 5+ slag ved svært + # høyt banehandicap) rammes også -- fortsatt par + 5, ikke par+2+5. + assert max_hole_score_for_handicap(3, strokes_received=6, course_handicap=70) == 8 + + # course_handicap ikke oppgitt (standard None) -- uendret oppførsel fra + # FØR denne fiksen, selv med 4+ slag. Bakoverkompatibilitet for alle + # eksisterende kallsteder som ikke (ennå) sender parameteren. + assert max_hole_score_for_handicap(4, strokes_received=4) == 4 + 2 + 4 + + +def test_adjusted_gross_score_applies_high_course_handicap_exception(): + # Samme unntak (Rule 3.1b) verifisert på hele adjusted_gross_score-veien + # (course_handicap videreført til max_hole_score_for_handicap per hull), + # ikke bare på selve cap-funksjonen isolert. + pars = [4] * 18 + stroke_index = list(range(1, 19)) + strokes_received = allocate_strokes_by_index(55, stroke_index) # banehandicap 55 + # 55 = 3*18 + 1 (base=3, extra=1) -- KUN hull med SI 1 mottar 4 slag, + # alle 17 andre hull mottar 3 slag hver (se allocate_strokes_by_index). + assert strokes_received[0] == 4 # SI 1 -- det ENESTE hullet med 4+ slag + assert strokes_received[9] == 3 # SI 10 -- representativt for resten + assert strokes_received.count(4) == 1 and strokes_received.count(3) == 17 + scores = [12] * 18 # høyt nok til å treffe enhver rimelig cap på hvert hull + + ags_with_hcp = adjusted_gross_score(scores, pars, strokes_received, course_handicap=55) + ags_without_hcp = adjusted_gross_score(scores, pars, strokes_received) + # Med course_handicap=55: hullet med 4 slag (SI 1) capped til par+5=9 + # via unntaket. De 17 andre hullene (3 slag) capped til par+2+3=9 -- + # samme tall, men via den VANLIGE regelen, uendret av unntaket. + assert ags_with_hcp == 1 * 9 + 17 * 9 # = 162 + # Uten course_handicap (gammel oppførsel, unntaket slår aldri inn): + # SI 1-hullet capped til par+2+4=10 i stedet for 9 -- de 17 andre + # hullene er uendret (unntaket gjaldt dem uansett aldri, siden de har + # under 4 mottatte slag). + assert ags_without_hcp == 1 * 10 + 17 * 9 # = 163 + assert ags_with_hcp == ags_without_hcp - 1 + + def test_adjusted_gross_score_diagram_3_1b_worked_example(): # John Smith, HCP 16, Diagram 3.1b. Front-9 (par/SI/score) er lest # tydelig og eksakt fra diagrammet (Out = 35 par / 43 gross, begge