From ebaaf77942f6bc7a03445265407b56d292514745 Mon Sep 17 00:00:00 2001 From: ValueOn AG Date: Tue, 17 Mar 2026 19:19:39 +0100 Subject: [PATCH] fix --- ...coach-Voice-Recording-Streaming-Konzept.md | 327 ++++++++++++++++++ deployment/poweron_sec.kdbx | Bin 18878 -> 19486 bytes 2 files changed, 327 insertions(+) diff --git a/concepts/Commcoach-Voice-Recording-Streaming-Konzept.md b/concepts/Commcoach-Voice-Recording-Streaming-Konzept.md index df939f7..f1424c8 100644 --- a/concepts/Commcoach-Voice-Recording-Streaming-Konzept.md +++ b/concepts/Commcoach-Voice-Recording-Streaming-Konzept.md @@ -332,3 +332,330 @@ Ersetzt wird: Der Umbau ist vollständig in der eigenen Plattform machbar und löst das Mobile-5-Sekunden-Problem an der Wurzel. Für Wartbarkeit und konsistentes Verhalten ist ein **genereller Umbau (Variante B)** sinnvoll. Ein stufenweiser Rollout mit Feature-Flag minimiert Risiko. + +--- + +## Implementierungsfreigabe (Ready for Build) + +Dieser Abschnitt ist die verbindliche Umsetzungsvorlage. + +### Verbindliche Entscheidungen + +1. **Scope** + - Umsetzung als **Variante B** (ein Stack fuer Mobile + Desktop). + +2. **Transport** + - STT-Eingang erfolgt ueber **WebSocket**. + - Text-/Assistant-Antworten bleiben vorerst auf bestehendem **SSE**-Pfad. + +3. **STT-Engine** + - Self-hosted Whisper-Pfad (`faster-whisper`) wird als neue Connector-Linie eingefuehrt. + - Bestehender Google-One-Shot-Pfad bleibt nur als Legacy fuer `audio/stream`. + +4. **Fehlerbehandlung** + - Keine stillen Fallbacks. + - Bei aktivem `streamedStt` wird ein STT-Fehler sichtbar ins UI gemeldet. + +5. **Feature Flag** + - `commcoachVoiceProvider = browserSpeech | streamedStt`. + - Default initial: `browserSpeech`, Pilot: `streamedStt`. + +### Verbindliche API Spezifikation + +#### WS Endpoint + +- `GET ws /api/commcoach/{instanceId}/sessions/{sessionId}/stt/stream` + +#### Client -> Server Nachrichten + +1. `open` +```json +{ + "type": "open", + "sessionId": "string", + "language": "de-DE", + "codec": "pcm16", + "sampleRate": 16000, + "channels": 1 +} +``` + +2. `audio` +```json +{ + "type": "audio", + "seq": 1, + "chunk": "base64-encoded-audio-bytes", + "durationMs": 200 +} +``` + +3. `commit` +```json +{ + "type": "commit", + "reason": "silence" +} +``` + +4. `close` +```json +{ + "type": "close" +} +``` + +#### Server -> Client Nachrichten + +1. `status` +```json +{ + "type": "status", + "label": "Sprache wird erkannt..." +} +``` + +2. `ack` +```json +{ + "type": "ack", + "seq": 1 +} +``` + +3. `interim` +```json +{ + "type": "interim", + "segmentId": "seg-uuid", + "text": "teiltranskript" +} +``` + +4. `final` +```json +{ + "type": "final", + "segmentId": "seg-uuid", + "text": "finales segment", + "confidence": 0.91 +} +``` + +5. `error` +```json +{ + "type": "error", + "code": "stt_failed", + "message": "Transkription fehlgeschlagen" +} +``` + +6. `closed` +```json +{ + "type": "closed", + "reason": "server" +} +``` + +### Orchestrierungsregeln (verbindlich) + +1. `useVoiceController` bleibt Owner der Zustandsmaschine. +2. `streamedStt` liefert nur Transkript-Ereignisse, steuert keine State-Transitions direkt. +3. Nur `final` Texte duerfen `onMessage(...)` triggern. +4. `interim` aktualisiert nur `liveTranscript`. +5. Bei `ttsPlaying` wird STT-Stream pausiert/geschlossen. +6. Bei `ttsEnded` wird STT-Stream wieder geoeffnet. +7. `muted=true` blockiert Senden von `audio` Chunks. + +### Konkrete Datei- und Funktionsaenderungen + +#### Frontend `frontend_nyla` + +1. `src/api/commcoachApi.ts` + - Neue Funktion `openSttStreamApi(instanceId, sessionId, handlers, options)`. + - Rueckgabeobjekt mit `sendAudioChunk`, `sendCommit`, `close`. + +2. `src/hooks/useAudioStreamTranscription.ts` (neu) + - Intern: + - `_startMicCapture()` + - `_stopMicCapture()` + - `_encodePcm16Chunk()` + - `_pushChunkToWs()` + - Extern: + - `startStream()` + - `stopStream()` + - `commitSegment(reason)` + +3. `src/pages/views/commcoach/useVoiceController.ts` + - Provider-Layer einfuegen: + - `browserSpeechProvider` + - `streamedSttProvider` + - `streamedSttProvider` auf neues Hook mappen. + - Bestehende State-Transitionen unveraendert lassen. + +4. `src/pages/views/commcoach/CommcoachDossierView.tsx` + - Debugpanel um STT-WS Events erweitern (`STT-OPEN`, `STT-INTERIM`, `STT-FINAL`, `STT-ERR`, `STT-CLOSE`). + +#### Gateway `gateway` + +1. `modules/features/commcoach/routeFeatureCommcoach.py` + - Neue WS-Route `.../stt/stream`. + - Auth/Ownership-Pruefung identisch zu bestehenden Session-Endpunkten. + +2. `modules/features/commcoach/serviceCommcoachSttStream.py` (neu) + - Session-Stream-Manager: + - `_openSessionStream()` + - `_handleAudioChunk()` + - `_flushSegment()` + - `_closeSessionStream()` + - Final-Segmente an `CommcoachService.processMessage(...)` uebergeben. + +3. `modules/interfaces/interfaceVoiceObjects.py` + - Streaming API erweitern: + - `startSttStream(...)` + - `pushSttAudioChunk(...)` + - `finalizeSttSegment(...)` + - `stopSttStream(...)` + +4. `modules/connectors/connectorVoiceWhisper.py` (neu) + - Whisper-basierte Implementierung fuer Streaming-Segmente. + - Config fuer Modellgroesse, Sprache, VAD. + +### Reihenfolge fuer die Umsetzung + +1. Gateway WS Route + Dummy-Events (ohne echte STT). +2. Frontend WS Client + Mikrofondaten senden. +3. Connector/Whisper Integration im Gateway. +4. Segmentierung und `final -> processMessage`. +5. Feature-Flag Integration und Pilot-Rollout. +6. Legacy-Bereinigung. + +### Abnahmekriterien (Definition of Done) + +1. **Mobile Stabilitaet** + - 60 Sekunden durchgehendes Sprechen ohne erzwungenen 5-Sekunden-Reset. + +2. **Textintegritaet** + - Keine abgeschnittenen Saetze zwischen Segmenten. + - Keine Duplikate bei finalen Segmenten. + +3. **State Machine Integritaet** + - Keine User-Transkripte waehrend `botSpeaking`. + - `muted` blockiert Audio-Chunks sofort. + +4. **Fehlertransparenz** + - STT- oder WS-Fehler werden im UI sichtbar angezeigt. + - Kein stiller Fallback auf Browser-STT im `streamedStt` Modus. + +5. **Performance** + - Time to first interim <= 1200 ms (WLAN Referenz). + - Time to first final <= 2500 ms fuer kurze Saetze. + +### Testplan (verbindlich) + +1. Unit Tests + - Segment-Assembler und Seq-Handling. + - State Transition Tests fuer `ttsPlaying`, `ttsEnded`, `muted`. + +2. Integration Tests + - WS Open -> Audio -> Interim -> Final -> Close. + - Reconnect nach Netzunterbruch. + +3. Manuelle Geraetetests + - iOS Safari (aktuell + 1 Vorversion). + - Android Chrome (aktuell + 1 Vorversion). + - Desktop Chrome/Edge. + +4. Regression + - Bestehende Text-SSE Flows unveraendert funktionsfaehig. + - TTS Wiedergabe und Stop/Resume weiterhin stabil. + +### Rollout und Backout + +1. Rollout + - Feature-Flag pilotweise pro Instanz aktivieren. + - Metriken mindestens 3 Tage beobachten. + +2. Backout + - Bei kritischen Fehlern Flag auf `browserSpeech` zuruecksetzen. + - Keine DB-Migrationen erforderlich. + +### Aufwandsschaetzung + +- Gateway WS + Stream Service: 2-3 Tage +- Whisper Connector + Tuning: 2-4 Tage +- Frontend Hook + Provider Refactor: 2-3 Tage +- Tests + Pilot-Hardening: 2-3 Tage + +Gesamt: **8-13 Arbeitstage** fuer produktionsreife Erstversion. + +## Reuse Snippet (AI Workspace und weitere Views) + +Der Hook `useSpeechAudioCapture` ist generisch und kann ausserhalb von CommCoach wiederverwendet werden. +Er kapselt Mikrofonzugriff, VAD, Segmentierung und Chunk-Emission. + +Beispielintegration in einer anderen View: + +```tsx +import React, { useState } from 'react'; +import { useSpeechAudioCapture } from '../../hooks/useSpeechAudioCapture'; + +export default function WorkspaceVoiceInput() { + const [isMicActive, setIsMicActive] = useState(false); + const [isMuted, setIsMuted] = useState(false); + + const speech = useSpeechAudioCapture( + { + // Controller-Bedingung: nur aufnehmen wenn aktiv und nicht stumm + isCaptureAllowed: () => isMicActive && !isMuted, + + // Laufende Audio-Chunks an den eigenen Stream senden + onChunk: async (audioChunk) => { + await wsSendChunk(audioChunk); // eigene WS/API Implementierung + }, + + // Segmentabschluss bei Stille oder manuellem Stop + onSegment: async ({ reason }) => { + wsSendCommit(reason); // z. B. 'silence' oder 'manual' + }, + + // Optionales Debugging + onDebug: (tag, info) => console.log(tag, info), + onError: (error) => console.error('Speech capture error', error), + }, + { + silenceTimeoutMs: 1200, + vadRmsThreshold: 0.03, + vadIntervalMs: 120, + minSegmentDurationMs: 450, + recordingChunkMs: 250, + }, + ); + + const startMic = async () => { + setIsMicActive(true); + await speech.startCapture(); + }; + + const stopMic = () => { + setIsMicActive(false); + speech.stopCapture('manual', true); + }; + + return ( +
+ + + +
{speech.liveTranscript || 'Mikrofon bereit'}
+
+ ); +} +``` + +Minimalanforderungen fuer Reuse: +- `isCaptureAllowed` muss den lokalen UI-State korrekt abbilden. +- `onChunk` und `onSegment` muessen auf den Ziel-Transport (WS/SSE/API) gemappt werden. +- `stopCapture(..., true)` soll bei View-Wechsel oder Unmount aufgerufen werden, um Mic sauber freizugeben. diff --git a/deployment/poweron_sec.kdbx b/deployment/poweron_sec.kdbx index ea65af58a4fb0ab2e6f439ade9519f9b8fa18df4..9e0f6afcdc918db157d8a7553d179a48bed63a14 100644 GIT binary patch literal 19486 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

$_VgaYn12{K?#kH_T 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 By(9nt literal 18878 zcmV(iK=;1`*`k_f`%AR}00RI55CAd3^5(yBLr}h01tDtuTK@wC0096100bZaWPm-w z(ZYGCcj&qq+E$Yt<>l>H`7(M-XKVd#jU_6O1t0*@*(Q6t73sGqM4@#`(2Eb)kB#UD zR0=bO;2mrt*2><{9000LN06AeyBk3mF7y(+fQpc9(VF(}qfNwdSmQ4?N zu@2_OJ(v4P^!L4)fi^}bF2Hjk+C-__@Xq0V@g zubovtHHC}{1ONg60000401XNa3O=-Z5q#yYO8<+#*QsQYy`h6R98S@% zt79%4t%L{r1yqU3)A7Tchs-HsliS!A#8p5F=(c=g;)p9Imj_wZwt_pu7=bW<4UpB1 zU=y(1ZT`b16sXKv_Krn#JFM;1bIpuJcE8~%5IyTQ#HmAyADVw9!i-}?bhm^zd5$ec z4NWt)M49l$G2my%S!IIs&>V|xE>ddXPC!qu(Bp%fm;y2@Yrh?e**ayoqH+s}bR0R@ z6h?!Yus*3%Uui*yZxua82yv34jKA70j9*eqUv+XHw*&ZylC=T2I6oejq+Am_u+6M!zN1`i+)qJ>`Lr+DDk%*^ZVvz2iKyx-_x`>JvCKj@r*ks}`Cr zpKmtp6x?*{_>e7eZd0@dZ}TR%^!TJ7x%3#cwG#rtW_Z`d;k`^lCH^EIaox{y#YL$u|F)ZYgJ zm-(&sNne)z^#$`O)@bU%+(N!X(&or0;(9ayK0d>lkGe!kkWu=9Pvmne3>asBsvwq~ zCeQcuIfv%l?c(F2`u5Wq$EFECBH-$3syS!GJD^PkD1%uPK0%k-Hp0?)h59Ggze{d} zv{?$dt^p7ZOj7)VuT2DYyrV`R(b)hFKD z%V!OIXqBQ(b?yxaaj82QCUcD83?Egm*yRsuni(~}`qt)2mjA!rZ7s;o{VhkaJgeq~ zs4fPpEe%wq2%4J_$cJLD4PStUq~EZhDNk`M!2=*BVjkF=i{Dv4a3iuo(@pxL*@C{c zq+|&|ADfcKBdHxLLukGY)*nMAIGVIs!gU9UJkv@(Y#9n*fwzlqtv}%Vf=UHA7PUS} zymmR3Y#kK@sbtEeh?Y$}vWdXwf0&0H%o(bI030bURXqs%|)4A$Dd#v+UptJnWHt8FpOq=ZhU|Yw*^-P zC(eH|YdBe|YCJtEGSBo#A#gQaKyHuscoGtl{0~B40to1gb>W18=_fe^7_gi@O*%D< z|0!4$tunJRW~l#8nxz;Pk2x1xPlK~pVLPk?q0mpw@PFYZ)@1Rfp+EVh^1$?wokDn+ z)tEz08K7uhE1V~kJ3dY6Ch!#s!M{ApcWFUDn8a~!xSKV2>E?RS?o+y6Ml=u)TD##X zewK1AUfM`=%Za2A;Q1mQ(WjYD=u2Y3giD9jZaUF$5iDM`KBLH@uz^ibmhav>K8oq+ zqFg&fIZdqTUojHhx@zEdxn`fx*^acXi&W6BSOfI%aGn-BHIVSfQPRZ&4jAC`7;suj zv`cT)LHt}59?9r6b;2)k$9j~Q8O|{@AZ#@3v?x)ja<##tQZZ7vSBgDsz-2`TejSOG z^x#{pWTKiv{o&wHK^5*3Yz%^!q5}KqW|b>?dtX62$P-*(^b()t1`GA$g;{i2b>(HO zxqJM8ZyJ&y7lY@JR((iCQpLW-M){f`nyJ4pHW0@5;AkHZ4iFj+_rU}-!P$98(8fL% zCfPFVdrrC z=kJLbrbiBtNE~g04?Q1gK6vc8@^_xKVTdW!w*RIwK~&wIhMgx6!c=qm7bt?UO|pF| zne>Ur&(wBvBl%(+U+B7)?zX5Bz3T|iqsZZ78g<}8{|RQ_0q|*YJuF?U}1P*tH~HU<6IZ$r?|a<+jwpIxU|OJ?M51Z)m*H^ z+9VwzN-7ezbIxp|0kzTaLJ#&md(lq9S&3?bQ!E@TSxqvP>mE)AbE68&2Vo;Rx4-F^ z4U#bc!jZh;ZJ1<*fTJS9Ut!CVp0-L6Std3WJ5_%=<((w?Ze`o9KOWL{6RjD4k{*6o zdTDEt@(kGVVIMR;VPXCzMk;okg-ih=$qiCl2|8x!JNg&`OM--&=+v5zE4)ov&##Vs zVqVl{mP%rZ42KO+P$5Ws#G`7=Ru&Rj^Pb@|@_fObRyIoeycoe*4>IBzft22AN!bLw z+v&Lk_9y{5>Evklz zMLy(69+q*he+S1g{EgeE)H;_nwI$fT-u>L7m~?He zv6uFgd32v&=g$_fi`4V6>_wjrv6I)C8jQ)Bs?JB$f=N%@gnCUhmZm8Gh!aX9P%T$yGz@T+6vBnnr8X7xmbpL_n+5j>X0H zH${b?i*s%_!_tRZ5s-9B5SB%$G=v(KcFzNY@Sd4+WUOC|gC9KbJ0k+gyQ~+=0khtX zJ*u_PuhA6aVA+N?uP}5Pa3x zm{ij`nF5Hcl`FrH3h>BPm++vvC^NU-yZ4%Mi}ji3 z7c3*o$_57>CfKG5eY+P^nlF0m^c*zSrqD|vdXt)cB(j+TTDc=QDu25D;jx$HDT4kW^)g~a;$3*^ z+rTdTot%OIsGYI_jtgvGvhkpXD8#aBXQp%*rq>V)Ewk@JwJQPFxtO2MUDhfchBp;8 zZq=s(KTkUZ4ud4OPas{GE6ASnw>CR;F23{Nu4uY!(ZsEP6@y=PS*(tgun4$^jyIZ0 zYZgs?Cw<~dFC)0Tc#VC)zM4C%)kLAc^s_g95Ip-RH_(KZ3NgPH86YTSQZ=5_2lx#O z>SGRmZ#6mhrm+Y$_lTBL@D~vx@^QZ-zSI(zDb0SiFkSpMoj>vO^|qTsaob2F%S`JC zNdeR?I}MCa1d*T5hRH!e37Mf6PPqa>-ZBw|2 zAH||&e@20&1Y=4ud2qc|PaNqYX}I0`rhhWGRku+?T|zJy;E7Z7O(_2&wzAE)B?RT< z+hkpd^+E9o)AFfMpR>8e0Yy;ug(R&3nfTMD-%dA`PEBjeJ_6a&k)gVJ&a|$G8kYOH z75tTMlkD-uSR-K@i_GUdEjk(lP^n7uAgDL%Lf~M0D3@Jv zL{Y6$#)NONT&?g!c}F?LYvCh=s?I1j(qR4lF-z@_O>xP0vO+C4vlSv0WlEscy9*JUz*}9rHw*yb9-&?P8*$u!B$=q zKo<2yt(GjeHq<}+F4waiSm!u8Sl%+f2!gvM?N3KEGhwb=o*%IIZfBc8-l0O($X#2H z&}U;XHHk4SuMvg1@6RG3+hABMSdNzXHvhZe_O3Ahh!mWnfkKm1a^^hk#kR0)~eioce?P)v!G&yT|dgvzQ#?AKl;I&w4S|lD0{BFbo4i zs4IIgy@gOzg4|yoEfDQfy?m}Pfb31>fePqN+i-=j(d;Y*!~wxPN&a2A+%C-GIsZ$Y z21oX8>66UC5;F7y`dNO(^fd;Xj$5)4;rK>dKt&3V)a}tBb=OM6IZk5NGNm=YOPR%A zHvl9nPeEL%eACih9_CGPy3vW+?^E2CCVlayYvHo2Db=R5Rt)W>ouPloG>3cU%nd2t zb$$cv>Nz}D4oYRYZHqSyaN5p^85NsYBk--xkgXc=bv$sH3`!sxETdO|y9!8%q~_}+ z*Q)eIR=enH6|{Guw>aT!dq-n!yJQPy|9K^mBR$FT;n4l)mhvl(#5k8XRV59Bg2ay+3#`Nu*fT#IN&OcVf*2S*td~5)$i>3uuZe5{kG1Gr6AXclqK`=2W~F zL;q1o|1G5Cn$y;b0Ak~t4^6hmCgv@#M<%OmH@UM0(8^Tv0L~5LE{DYc6Iy<wvXg zWl0vcP>412&B*?0Vr{bkMa;d4IG`w8{!>wUMli_s^Mig{j;FqoHUY|(gD$jQob}rB zAK>CrP^GSgd)-=+orHM%R_rZu|?LPayf)UA3H&3S^9aYWCc z=>*mTv5t#6rxqxP362kgqbLwr426v(d&W0RXbMSA( zq))~{aw#YN?+QblpkhW)kz~&13v%MvX`^)ej5?jflza$J4(t03J9Q;U+fNeX)<_Ke zLX;!V+aF3NS=o(wtui7#k*n}|aDSzi#$Fd# zTPMnV-SElkV3Qb0)rkp}Y+tr_WOnOyiae}l4RTP$HfLW>T0mp_kbMceX}0w?1mRr~ zEfw?Axwp47n63yz>h?f~*sNR;x|+0$84@cOUSLI9IlW6v3Mz1l2Gks|3^?F3`F5?m zA^sR{uW8CRj_ls5THF%HZ%tV% zWy&6=(o(Nd&u>7iv!!Ct_T>y982*A%G${%RyT06C8rPi7Y`08 z6PQ6&=;qGKWq#s-lIlw{vC~z`_sWTSa zbj4%GVLQ%$W}xWxX)oAAxA4G{AeE6Q5!PO)`V&9tqy$^9sydeU?Mgdt?olWuyLHrE zx4Ujk%~*%#IIF!eF^Eu!_C4b4Bc`w9WmvC%C8rz|LSO`d*8*L=)?AzZ?S=Z6jBaz> z-qXSsiqxVYGd;;x{;@$mnI22I>WWA4Njb_wR=Jd>2lgHPAjPb=Ky8ZN9iHDsz z^W#bX)La6Xld%h?UR!@@G#tuo38>zq9R)Q;Z+8;xT5#6w)jh5sSZ3J`KDW|LHEY$d zOi=Nc#+cL``3G&+MFyU~fPH;vXw?{Ud~bEJQv%7d;#l-2weSB|p)JgREf*^e=#HTj zJLIRQu!OZ1D}Qr6L!PUJ@-sYCPq-o)c67q}mUg8pvxfFab6$~uGpW^RRYpCdOunEy z-wYDSPi)6u0+YTH?>+QQ=nM4^BQL2*k1t#}vAS-W!`4RWQEzB7e9Iy%nWXNUSiq}B z86_8uGWwocwet~alM(i@*YQk>O?WSXgf*?9O|pCv)1KN^r?LHLgJ!m@ayJo02CIdH zT2Zg=6&rRy;NJTC6Z|s(QTS*-k>C$jg*Q4^N9jBNbg#)7$P^D|#t2wuRb%;PY8wxV zV8R0EPE-Ezv@baE^iS`+mzwiO2kUpJhBr=1HuHJY|z(YqCH&mEZVZxoco?QVe*Guz=)|WHM6xt8vMwo z(95N!m)*+o7qBW=Lu!#7!p9=esQ%-S#q;}P0@;6|ymKr2q`T6D`M73qH9BSh9ny*9 z)Xu8OQ~|pHUS(57`8qROpDZ_a2{9UEg+<>4v0Bgte^YP%fbv3nP=b*@xf~ivK#03c zSLf9(lSqBpt_|FLP5c~?c*V8qZ+G_Vjt?b)Bv;3H@AO6hTF;k^_@cI_)v7&(}d3IQ_kP zIwl6U4q&jD#+|Hc#MW-hyXi5Hr2)NsR1(!5Wkj660^K*KA z^X=yu-MQwi@7v_Av{L#gub`o%@!UK32jDkkHI?A;?FmT@3SX8B$o{)!!U(GRm z=b>RGJjE7-8`%36Q8?|iEjVRi#kC+tXcq=x|gR2;)LB>gzOeKTBZ#~ zSGFtj_547^^0P+>Zly3<#s}GF8#+V>|Bk2k@QI|+qNb4sq?U7ZLKo3GB6!L)?2}bW z6LRKk{oloVN1yU>1-uLg#0a%Xc6oU5;#`}1XA}P>YG}g4wBoEjXDUCY+NOnsNP=9W zrvPZdQ%$kZ>Tf*~8ot(^ANmt{$g9okr%bMhZUcdeIltSe_$YX_Oad!<%SjYM_E@wW zSv>stMBr~(4}xVb7+^?LYCDMd1qJ2PAdTT%sgnJYBKhq|49Cswo_2r_!G@Ol!PP|H z2URHVv*62K&8DODI-6(-18SgK>xdGVL}7g+Cr6LNqfw8TKW^H6&t{I9lv&}@7`acp z$(`6e^`nB70I*cNipe_ES##jV`HzmagBTaI%LSP#)1%C!cjtH}Cla$-60n0{P&T>! zni)oc(>J1~!RbUq5{tM)_`*acuWsj0?R3Ax9D0_&DjX~Y74-MAK`2DIH4IHZD-|*% zg8av(k!c1+$AhHN&hqD%N57^gaDRVRUayr1@y?-+8t z1&W*K9r|`|C4CQ>*${rETyilxj~Gq~@lleG2FlS!v9r3bey%*^(uh^SRDDKsjq5bB zut!voI_(P8xcjRD^gUPvhjvjQO9GW-u2n0R8G=uF;@(Sqdz*Ws*qTo@(oSB(76gf< zj4T9r63r0CTrD8NtlHKkAghvDA-1Y2G_*$(QryQ8EC&AC%X2klp~|ezY@ocmka;2V zG`z2vOzTwe_+ykf^zS%Q7Oa%IJVZveP~_Rm z|CEp7R)$zWd?plEr(e_90RA*Lu9sJ43kh%QyQ*>a&6e_P2pXce8UHe_M`$h-nlWVF z-QUjw+8ajP_;`LWpnS%@6-f8pk~rzrQj&rsyhbFI)%T@o7W5It#0!pS>UP@>!6B6lyH|-|b!PU(Jz&JR2e!xS2>gP7})KcS{zMJz=a88Ymq`es!hBo&!b)||C}KW1C!hY$YN zs8P=H)#b1wbg1*$VpN!5e*7i_X9(#V@S;ChxM6#qnDGK3k z24WW{?ICe5JFt_)??xcjd6L^NQZ@7f5J=HT{%Eooxq|PrV(oxvb&|g@_1J6HB&)eC zZtv`$Y=}p#KH4xH4CwolAUB(p*qrX{W(bDoCJm5l_J4f6}(c*spWs_t^N0#@DEN&szC6o+3-w5-X~n zsgc$>i6fujDKTgZ@5TXaLQluC7f4eTreaP)g|>48;*S_+ zM%z3EXEf}e+%2?LOR8<|n4BwR-w#YMN{Y_OA5658dI}!%R zbxp&f&h^o_j$?sg#HOX6SQx0rp|K{?zQ;AP3N9qn3N2v z<}rqvvNTsoA-6mrJ^liV8GT}jvDxHU^QqYV`c1g|I^v!Jxa>E-+m1J-B%~Ue)Sp8> zR25u}wL1TnB=OGc^S>yH-cb!@VEan}y|@O`g`JbJs*PvlP_kRa$>(I>oWb!;qdtEW zp|w03;WVd+wG)^s-E=1Au#>#}rug<1lBHeW0!O&~{3jXA#G=e(>2dt;RurUuD|{y+ zw{gIcO<0!;Z5hnGUo)g1 z1qG1m{(HJjH8qb`v+!ewZ~vYr4^^Pd|6wPB99zJhmlCK8U{wJL$+U#<^bx1QS% zaxyy%2gAPZhbjKp&;i4+d|%*;nZy}zcrrQ(pokc>Fq00F#F=tPX0E>q(=_#AJx?iShA{(PZ9vYA-OGS)bKmU{hU`-rp z>0nprG^6&CgmS45_f{tT53wU~|B>T+7o3k*EAfV?ISY6qUeIEaS5(cInT)=YMU#!`8g#-#juMqia zmqrax#4}sMav5CqrdoKcOAQc1wl|>IFNnxjD}u8*CWR<|+W&d~WeOio_3mu|23fle zw91ohtAT{K{LgCO_PRjHmc%8>LB8~Hg$^e|W?p$EE~oYL+&{(WLRF4sa4o0aCGez2 z5udL8M*qNqVm-J9Oz&e2v(83BWb!S;M|dd3TFEm*n$yO78*iOX+Sb04CVe(kPi*>; zyryf5JoBepA&&E0I!=Cez);4MDM**1mDTNvNnCd&9@Za&kpDPeSVUP>8j1=-fcYjc z%Gsfu=Itt^WQk&1UBh*yRHqEz#uCMNZ~>30rD&P>9`ub1AXwp^-EonsvPkuuScH2o zd!g*bVM70a((<1g&1-mH3X$ESrzDal*e-E(_i%NomOELDHRU!-Ike(=3b;>lrdlDc zg6X*U+!T)lzJth&!{Z4?>fc{n8W+e`F>M9v==e=9+Xw!i5rwlIWPi}0k}Q{`JsYHwY)NI&hn=QdJ3ZGUG1%9^Mj)U#X)c%K@`?q^+zr&w=2d2uVeZ@| z1eH1-x3{g+Jiax>m@eVD0FA-r5I8T|YO4a)c-~6_iJ?8p7&6_Oc!Ae*pfdq8&;-Nj za5Yh=V?nFQJy^O4V*H;q`{kcb4-A6Y^HnX2N~J*9UL79tw6Reefv++0yGEo^8K)JfJ;=|q@$F|t^2TP znb{6}4~E9K^AeO$)mTVyp>>jtSPnw`B(^-RsR#VVj64izBXAlk*ad8p)JO9^8p;{L z7%0_$kV%D^>}~fm-D@ezc@C2&$!+Utgkk&AW)LP)kaU>=wL1yDh`zbMzxL?^%t5-) zfiw7Cy``#rriUgba^zaSjzWHYI&Ob!%wnxoBt`X}vwHLw%NT3DtWjj(iTBZ6FwXP* zL*{tJzdy=#)t!|8UBs+Fhj^o|LO=4m!UTP*hLn5PVkaZ0EruYAL)Z8yK zq4U#eymonJML01|?GHEDv>|OX1x%LGzBBh5(>c*0X*>_~UVbi5+eOX-c#Xdu;jX%< zvO};6;Qc~74SA;*V|wlHx(_M%tW%_9iUIgFh2FIbnHh`SA?Q%2*cP}fjhGmD)v7P} zI`c@JA?L~vBz(U&M=MomVU(!8+4iCKoF~7e?^kN0IQq6`rnHFjbx!+9-l^>C46d_^ zp#*ngGS<=LXXJ+jXMTV@>|mma+gDXh3qeYwOER<|&|N_NXJVb7>{`;zGzJ;9!frdW zT*pxxpG^3nC8!GgjELjVMl-gr7KB8h+G9H<`zinPAbjVpMgSkcZgZZj@0k}bA;qoS+u>ggHK z1EqZbLPQikZM*kAMApR~wB`j!K>&Kh`$Sf*BQRhj$LTl9KHTDZhZpb7MGM9ZImqQL z#U|wDPtKj{1lA4VtxPoyiZ>i>fuR3q_M`Xso{GDB$?DxE2SuDAX>kJwAPQkjPkYv) zI|@zR^8S~aCaJU|sK%mKPWFz1dUdl_m#MTf?y4k|j2JS#@`jZy*+WR|N1qZN=PZT` zv#B9EC@N`&Ps3kk_!4%ikz^w0c)^hesOP?0VOxQ*Apg^}bt@7^)%tOf45=##C1k(u z8eQvh2zTqD-=-jy>s**H#sX8S&sSOkECSa;L*i+dM)8az9>sD-D1HHRH z-L+;u?=&_;x~R15`7cxn66I!tX`;cKa0m4kn8IPApL0;&^2+su9>aK*~WIMnBK>{L8zaX~2sq_01V#>T@ z9C3C0&RpM1-xL3;ME5u1K^reM)sEO@P+x0A721g{w1bu8j<5)Us=( zt*i@Kd(Q%{)a|2|t@d=`y|p;jQ4(UVM+KrPdyXkte11B$yQ>Hv4~llE{?fp*mUA ze8z3$&y1Gd$xUS)LMor_h7Aghy`cENm}$oH=nVTA;i5U>x^p0P-{o?!rnYkz8MS_Z5tj~IVC9(^Vidsn@J0J(bbUM!O z+oNB9*^gz)XDWPfAa31&OTh$R_FqzpDG+!Z8n4w852PA#2rZ%HD+T_!gd|UU<~8uQ zRS>9uvrHA8fn#!IWy;Spu+S?;(}5Xn8a!d@hL#Vmf%RanVJC)J3yJm>%Y!SX(*3#U z!(7*(+hf|XgFv~+c8gm3-(cT}5pp-G%#W!@gmsKj^;vP566H^iyrtYy2us`l)~Qb? z!+2Yqx^*8yeTs5$e_pT$GB5undEbq}F~1aSkYf=1wprG;-f8@AS79|FP?NIylfVyH=neK6d@-bgc}Kn z|9UXFgLZnd`IG5>@3oG-bKaahJuHqUmlz43TK|51B(>;=F+A3szU!A#jACYsi=3yN za^>R^2oDnz<`!yu9zB-)edV(=>^tpWulK;jryj!0^RPFHi0?+EFCUXf%$82ic?+h; z_Wi6~=%G8NW=+DC!nIv(HNNyVBw;Cua=Rai_5Vip;Huka>eLci9O z>fWf1^RpFL?us2g6ZD=nNr1(UsL*Ma20A4#Ld`Zj|NYq>WokUlblI&rR4>T%6iU6$ z`$owIvmMX_w3MSK(~cDNvAmlq-$L+n2G$MC+B_H{M6yD=n^p6(?%@aBweO^Z^3n1^V(%glq0e^)85H6XQYyPe@*5p=+Vi6-_+ z-E1A%LNUUyWzKUaF~!Kc#XG;t{GYlnqe8zR~t_y&Dtosq=XQ8koP@ISsaTAaIPI;M2_ zCf&dLR`$i29Z0=OI*!yF^mg4S5s>@204^l~hON6K3iFYqqbt+Sab{WX@~;J->itO1 z%>B!wbtbPL_PNerp}lYd2QyKGeU{q--zcI(#@M9!I3RDN)QfLC$5I_N1@Od*Z&K(|!@>0RW_1SH~1^TBgo)VV;s{`=e9^Ww1CpKVG_V11_M8`|)wyS<5A2 za+RfG-wzNOtKE6$X}}{qCL77VV$=4ILc9J{!z*@f4kZu4b_8(NmPzOoA<8vPbWFJc z{Rp5HD$JSrWSm`%hKQ0Zqk%GZyC6BZJ+~}G;oC8GIw5v`RLd>K$WNOSXr0Q=ccl)v zNQ@D=ag#S6(5BiMmh@X#6xWf**d;<|;8th^j51mt0L&M|M{uuY1RJ?ZF@tRxA#464 zTGoaA;Y=9lcVz8LJsiese7Y2Qz@z}Ly*Wu20^oO|;|#5{P(HJdq%uFl?lc*Z6p0mAa9){MD}=8(I5T14en4Ll2-H4U!?RD|`? z?s1PxG}|sH38MN8yEg6w$B+tuQ#M343P^v9v|so9XV)!hX*L}K>e>dGP46lzZuUaa zcHK<&_M7tGnG=R6X~{@-G92!7&PA(D^@lXGWt=ty0hk>`kmTE=*<0JSrQ+$)yC2{#XZi0c!Pb#AvMzGq zcBx6OwFtg>y`V%kNei^i9881eRbq^rvN##~YoczWb=6l^p~V}?@tS?4YVys~oL&1v-!mPVMHNz}Q) zLWViQDTY4QMeTQwi#;(vO8AW6DK$eL0O@lNh;hp@OXQF)n8rz~LytX4B>LUJgB?7^ zKj-Dc5X%!)=;KrcXofPBA>o_;W_sO@N`simR4gF8<^ytWWogmT+8(+Pq9K(emqi0! z$q-rQhk|pz6(Q1mn3@ZcW(GBN^If;KTd5C3Sn0hsbJR%6(EAyZAKs?6uk8gf;#zvj z8>l=&j|}OS0+Ko3OmnObRdWDKc5{C9gA>*2M{2H^nl)(XD3vjN9;Lb1S`P&RcW~~o zrK54Hi$QE5(toEfx-$wuVuW>RqDKy`q0{ zi(|>JB?c1CqG_-dp;5kbA|obzV);>tEUO^;#7K+Mn#M2OOfo?Ss=Ta32FPMv?%b#X zkE%?6`(|79*Z=pIDBpiVe`~Wu9`tDJ?Tr{h9U`0|q$)N>uN)PB@noWkE0tPh@^QWs zLCKY$Whg;Ls}Ti-8b0;ghuEFUOv6s@Yxw19t?Kt(>2M6BpS zJ@^+O#V+%9BWO)ywk`myY&6L11t?_Bc%>~F4(#g*_Moz$Vd_+MF0+#m=0)RXd9?E^ z^kNAt6br1`NRrjSUmWi|$SoBxtGk({`&o=ek52Ezp}O?(xY4AR%E`5t1oXT*FKv=- zG#-*@%6xQDGeDge0J|Z?o~M7|M^s+UahXf6Pn6+l86)7-$^aKcbhWFNZQjRWgKXHs zaSNX*AX1JQ@847?d5@r1&Qz@)ofwKx+2`8@W*>_+9JMPfkcIBBV6DO{*k~58G?cFe zPQ%d!lwd1It``F@^}p}=^BMfYJrl%=EgU&|*jN*BB9lmoYP$gS;qXVUiu$3W!-YoEd26e<#Z)#Q z{mCw=U;Qi@fNbqASn0)iW$i(0)AXj&_y=rC8Gf8>UjZK|^x;$=+N{Bd^otVg0bIT# z^}_&La(tgonn{=L+ zlxyq?JJZl@+162bOp}}n0GWmj5EN3?)ViL1fs9!c8~eAOaO(Gc3;b!J&I@VdX!^1q zj@80MnB?;|t*TQ;;4}2nChNG?kcnnOe}dnXv2=K@7o>nlfiJJsn#+@;{O&j}ZVTzb zs0fQHuMCkShX;U>v35xG*c66`(lu))?-F9pdt(^EB6C@^q>6mwZF=zeM{nlVZLzjZjXTgt*VRO^P2|4&rNn7cOHJBNTCJkSo=fiKD- z>7HGE11k<+8V~l)&$ADWGKXLGX2mZNH#aY86UlMdx$T^l4F$KT5AYOE&MzF7jS;BI zE}5QhdPb#=Qly*QKf6o-I4ueq3VC(-oOM}x1%z*z>G!pDdY8*$ZKQfd=``aO{BYc) zd_|I!e+PZ+0cWmwkp$1PEynbhp!n+zg}VCash`TA56c=VC1sZcI{e48yKGU0TS(R~D+G?~gS4$Hdq+_o*aXlH$Bj?CZHFMsfUe>v13y3l#NlYV zI*nToXM+;H9N9wZ+6xUFdTIIiB00`Zj1JekU1#rJQYYtXZ8t@0`y&pLA-6b zS_(#h&=rwUY$KNC2=6k4Yi^~VO04I`2uSTsPyMC@&XzN}jsWU_zl5|uz3sTCQ@J7F z6lmg`icuz$o-Dp%Nx0Epov&xC zYdOs)_7@I+1rv=5!hqcLo2LrfAacTv7$8nNrRGMP6En5&tt;gUw_`3i-v!%npd4O< zZjvL*2GQ%W_f=j1k@VzjdWUzN0U0S=z{SCC+~fP@fe5&@@)3j7;mwKdY7k_jj)9OA zByZ&M$wzl8;sxBghng~NeLpeD16l4$e3>S$9JT!TZ+zPV8I3CyG>%^PNZOS<4t#2Q ztriw|(1|O~Lwj{#i}--0P+NUe%h*fwIFZX8mm0Lh>@Ibd*q66i&m~}3My%PpEUh%1 z+NMC_h@n9~zg+5Xy3gUbrf&SznYpPk^KValRzSHc8~#>-;2x}wyiMc#4~5cy$1KI; zN6ZPyBXU?A!dUyJfxL_5NBm`|gX7ROt<9)b!hMhsk$P5f3x(&})udx>cLfI3?T${! z``A7tV$w4EieIM+ESMax#UUAkdY@3nt>&~3ao;5-MsIf;&69!2g-yT{_T~<+l0#Tt z(D*VPi&cZe9+Lu5nMAM#Lh{(!EjI14R3?Z=W}WyT>EhP>C#w@S5u1Z>enZ3-hRlJ} zIQ)EfCt2(r?>ELx>+w2Tc}SX^E{Efx^A4-MqinYStp-pzfhQAv(eN3T!(d$f$|h0@>wfSlyyo{B?k70UaytA`!ALa9TJxF_cd*_NO64eln(( zCayk;3H!1Z2@ft)?$-3aVZU>mSN4O7M`{FpjnvZRrw$x&6ng**y-g!@45NFVrj1AR;JN`>dC*@4s%>{%T0Fw)o@;c7O!j!7PFP5=iIbbWwBdySZ_(GjS z89*r9h)2atH09bQ$4SP~5HV3F7r?8b_}w-=rI6pj&4trh4{e$ZH65^fA~i-^{o(IG z4y$*8hZE%rG@?Es%Q}nkD1;<24exzemy*7eANjJ^w4E=k@9_E&^SJOSn^)?#0UE2q zwH+Xx2l0gyqxTTl-|2bDy)m=MYZ*smnS3qSa^032Xpv*iW?<0}y5BXmd!vObC z#MJ$zrot1Kru`9W?em}_y|-Wqw2YQt^=J7RU{Jnd2P#5=IsHwo57yN_1R(dT#54)U zc{z3qYFI{0;cMeCkf(waFtOg)NamMEbMPcc+aiMI2L94-wisr!CrtSqgVlhLfiAC0Wz|JYfDKyqpswn%bg3Afltt)I}S zU@G627FnYpWi)jS>r^1I-*tIHMBYcs!IkFFX4QQJt9t7>cS51T8B@-sVdG^3_q z!mx0zQn6t{=FwiLh&`UmurD2H4}Mm)u{1WyO-mDiT~nF_ z*wqxnfvmJ~&V)uA@^mJ+AnBhhRf{3<(z0Te{-0jCWcuevoMW{%KmTZAk6IaT zSXtdpt$w2aS+)&-a$k>u1r0WTgNpCgr z8ZLR0tqQ6T#ihkHcnV@Hp&;_0N#KbPfLdW?;RX30$mh245$H+xTlQQs^{f$f^xNDi zwc|4&zdYm-k?&Y2G>@cBVuVlVs6SxyH}0i(_4)~pin))6OOlJMiIGnP`rAg>Ym**w zYvW`J$s+lx#9)kXEDV%syvogHbMkK-hzMB_$KOi5~n}Yyp zs_zQpfexh}O>8sMV^FH>`LUdbg3{I>4Wv!lpX-mblWez|gylqc@17V-Y?E$p;7fQn+YYERxy}yGnvMpyqpV8v9_$@x29nTQo_b z%TknhOhE{-g^Y+jw>^GN3?RF&&R!Bkg!32QgFG78LtXV0_c+|b{EJnol`j{c^w^DTWDvqKbqgkeGf|9?(^|+8K5tXhB^i#!JSG01cNk0CF$tprw<#M5gZB=iX{FwKBKQRmKQ@T9|4LzM0m5Bh0^SC2us_637y0STD08bR=w_4D<(ju4_23C3l%*%KpiAyD&SG^!h-HbSUzpI$2`pDe-(pjm;$fg1bQLqWkUl8W=!?@*;wM!W$iC|aRaR6Orc}}*Z8`~uL zZ6u4DyLS8Y*JYq0JTKOU{^_b=78E87axxdG0iP|C#7RA+eRQU=7|AAVCi-LO?%z!- z?{TX=i31XnCJcrf9-ZF|Ei{y+mjxEWix`hweih+$Jbr z;THZS#K>+`MUH?Rab>ieD|pJJZ(ETQdFf16x*_5)ZcLt5Ly7?3sN%vzSpWu~qOil= z;l!A-c}Y?kr-8XOxd&E_u1@9>u{Iy2fpW)`!pM3`+nQz}kR!DO+&{DKgqpr!xJ8Eswy;+8qPI6>^ZygEu2q8Iv_xv_{DzTKppBvtfmzjrvpB)&S!= z{@F&nyeq?R^F~u`d(@R(vPTW%Bb+)n5Y7t84abOMuL-QdA90^|1{XAUmjl zbU)mm<5vz`H!DAA+1^W?tYoio2G%o^>3kAn-R>`0M^gT)Q;Mtix-gu_i_ee>;VW>U zB5l^4zYRus8ka2^fv+Z6U91F8!Hdw;SGF2-!lH!-yj0>vUS{eM21m>-bHJJ{?N}_t z8=*Bx7$}B;kTF?TZ5>CPGIMBf8?J7fie)lgC&eA3TITRSV;C*U|4(S0cg)s}_KYr*;7} zxsTE;&^>(TUb76rr)AdJhyKY?X1wQWCX39-F)wxf;j6~!s_ECG)2f+6hM_bUd(xk> zQiZb3V$`>PIV$@mGRYQq)@aH`}IN>@0m6X8R7-2yRqFFrhF)v z9;u?EEPqW>WS*aX$le{%ItY zK{asOUh1@*-|d9;s7OAZwV!f7W-!6Bh(;m7=NPW1B<`tcB~E#(f7Q35h$XITZJ({`JPJL_)b=YzLYIB=3|3J^C>Ghorm z?qdwXhoOvO78Se%yXI1&`-v>@LG5!0BY=)ojUS$tnr&q$^Q2606`^Z)Irk{)8 zEpgB5@_T5^S~KR3*LDeeW5r#Cm~(^Xp}6DX!h4~juuHdahJ^N$eFI=F_}$3_&K6u! z^oGsvCW+Bh2d5PWkEy|eTvM94pWO5uen>KlKg{|vufl|dhR#6Teg@8?9E?AA*TJ4cN} zzujma_>>c#vdJt`M~fh)n;os=M{Jr3NefIXfZ8YeOs;b{?zYvJWckeqv5+0eU~jc( z?%2bUsyy?i%fMjW69K&k+~q5)UzF16T7N_lAgQfk@0`-9G+vh~o7`npV< zbm|&+_RTn4!MrGWkJ)hP)1YVD$((L<-1;YP0~1;v=Vb@{Y()OmHgW(3sR3Vl8>bKO z%rpbHA;yJQ83k_yYWs{xsA-*~-0g=|9fn+}C%t8$yo8k_q)QH3p9JcBNXi$EF!b&mk1e zFuq9SsxTU36RR>2B8Pw^s+*xrimcoZLj0)A@TG`mlD;LH(`gY>R6)p)%^vK^1tvy> z>O{Bml|h19t;0e0lAGuY#Gmc;fn*zz3T)S^Bbh%G;^dR{CM)%u4Pi-{5TD(H2AR92 z%FvKrjisb&EBMgr9xCmoOCl@YD?DB40=RhIDWgUnxS_RDn=zZ}UCa+?$^MdV=yPgt zi&L~JdHtOrkZHb+;mtU5!)d@H(wdhNqa|S!c?;NhLR)QIY3cJr1)VOte6I@G&i%ZY zx`pcuG5v3;KC#G79&V;CM3NwF⪻?YyDu@XWgQpgucJ4B<`3`%sdU@N_x~YoF;yz z{Nb>#eDfk^{s+S5Yj)8nyN=CC=gI9M(S;C;Ln40z?$q|4q+gx9&9L# z1K5x=!hc{+!FWTkU)(ZgbXK&(-GKIavo0vam8&|KAu)CFORb3LOy($4!9xG`vLZ}> znkO*?1qD}4y<}4*aFnoROW_eQ*`6}I;j6WF$U4MT{PDrvrw70ry~wFo?+5BafpSV~ z$RF%2e+VmNL^0%WRj~$AV7PLInX}G^Zm{`XK^rMoqZ>=l5D;YlwhM7uLE}4_Eed~g z0d9r@q%)bU9-EHVx5(#+lJ48FWgn~ZJElq3-Y%(Px%b<7