From 984fe2c93933b2fd7705ffff18cc0af3dfdd97ee Mon Sep 17 00:00:00 2001 From: jjangddu Date: Mon, 3 Aug 2026 13:29:18 +0900 Subject: [PATCH] =?UTF-8?q?feat(demo-final):=20cherry-pick=20=E2=80=94=20F?= =?UTF-8?q?irmware=20DFU=20+=20Battery=20dismiss=20+=20AppState=20fix=20(c?= =?UTF-8?q?loud-mvp=20=EC=9D=B4=EC=8B=9D)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feature/cloud-mvp 에서 최근 만들어진 3가지 사용자용 기능을 demo-final 에도 적용. demo-final 옛 폴더 구조 유지 (folder reorg 안 됨) · 각 파일 위치 수동 매핑. 이식 대상: 1. Firmware DFU (cloud-mvp 672e679): - firmware/ 폴더 신규 · MEDiDFU 6 파일 이식 (DfuManager 459 line 등) - assets/dfu_application_2+35.zip (243 KB · signed MCUboot) - libs.versions.toml: mcumgr = "2.5.0" (Kotlin 2.0 호환) - build.gradle.kts: mcumgr-ble + lifecycle-runtime-compose 추가 - AppScreen.FIRMWARE_UPDATE enum 추가 - MainActivity: 라우팅 + 뒤로가기 (→ HOME) - HomeView: "펌웨어 업데이트 (프로브 firmware)" TextButton 추가 (Dev clinical 버튼 밑) 2. BatteryWarningBanner tap-to-dismiss (cloud-mvp aa6cc1f): - clickable { dismissed = true } + 우측 X 아이콘 - WARNING → CRITICAL 악화 시 자동 재표시 - 재연결 시 dismissed 초기화 3. AppState.isDeviceConnected getter (cloud-mvp 9c82a50): - mutableStateOf → getter 로 변경 (BleManager.isConnected.value 실시간) - Compose 자동 재구성 · setter 는 no-op 로 호환 유지 - 홈화면 "연결됨" · Start 후 "연결해제" 불일치 해결 주요 파일 매핑 (feature/cloud-mvp → demo-final): - core/AppState.kt → AppState.kt (root) - core/MainActivity.kt → MainActivity.kt (root) - common/ui/components/BatteryWarningBanner.kt → ui/components/BatteryWarningBanner.kt - firmware/** → firmware/** (신규 · 동일) - shell/ui/SettingsTabView.kt (진입점 원본) → HomeView 로 대체 (demo 는 SettingsTab 없음) 검증: BUILD SUCCESSFUL (demoDebug 1m 56s) · APK install PASS Co-Authored-By: Claude Opus 4.7 --- app/build.gradle.kts | 2 + app/src/main/assets/dfu_application_2+35.zip | Bin 0 -> 248536 bytes .../java/com/medithings/vesiscan/AppState.kt | 17 +- .../com/medithings/vesiscan/MainActivity.kt | 4 + .../vesiscan/firmware/DfuBleScanner.kt | 163 +++++++ .../vesiscan/firmware/DfuManager.kt | 458 ++++++++++++++++++ .../medithings/vesiscan/firmware/DfuNus.kt | 77 +++ .../vesiscan/firmware/DfuNusConnection.kt | 193 ++++++++ .../vesiscan/firmware/FirmwarePackage.kt | 111 +++++ .../firmware/ui/FirmwareUpdateView.kt | 349 +++++++++++++ .../ui/components/BatteryWarningBanner.kt | 27 +- .../vesiscan/ui/views/home/HomeView.kt | 16 +- gradle/libs.versions.toml | 5 + 13 files changed, 1416 insertions(+), 6 deletions(-) create mode 100644 app/src/main/assets/dfu_application_2+35.zip create mode 100644 app/src/main/java/com/medithings/vesiscan/firmware/DfuBleScanner.kt create mode 100644 app/src/main/java/com/medithings/vesiscan/firmware/DfuManager.kt create mode 100644 app/src/main/java/com/medithings/vesiscan/firmware/DfuNus.kt create mode 100644 app/src/main/java/com/medithings/vesiscan/firmware/DfuNusConnection.kt create mode 100644 app/src/main/java/com/medithings/vesiscan/firmware/FirmwarePackage.kt create mode 100644 app/src/main/java/com/medithings/vesiscan/firmware/ui/FirmwareUpdateView.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8c9c190..1c7cec3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -66,6 +66,7 @@ android { dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.androidx.lifecycle.viewmodel.compose) implementation(libs.androidx.activity.compose) implementation(platform(libs.androidx.compose.bom)) @@ -88,6 +89,7 @@ dependencies { implementation("androidx.camera:camera-lifecycle:1.3.4") implementation("androidx.camera:camera-view:1.3.4") implementation("com.squareup.okhttp3:okhttp:4.12.0") // HF API + implementation(libs.mcumgr.ble) // Firmware DFU (SMP-over-BLE) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) diff --git a/app/src/main/assets/dfu_application_2+35.zip b/app/src/main/assets/dfu_application_2+35.zip new file mode 100644 index 0000000000000000000000000000000000000000..0165e2e8ae74568aedc0cb616662c38b3e8e713d GIT binary patch literal 248536 zcmeFZdstIf)<3?_B^NGgxTq1lBm@+Rwn4O|+Diy{P-2VsR_#oK^b*w8ptgh7*2qQi z)~aAfrOs%vGq#=15Rgu(rPyk3)0y{86lbv3DIIGAp_dZ`*$^PV&ki{4ytm)`eE<0V z@q2ze&&fIazV_N{t-bbIYqQWQh_QtIz33c#IN`vHLhZ)_Vb6HvEq`od!IH-wTl>i4 z1sk6HMc#(TZrfP!#8ZzwdfV!Pr|xnYnCV_vx#-$IHvy6s2hrTc0#giXe1;XC{)uZ_8CuRRbz5lB1|BXDS zPZKN3a;(!QYHa51zNk=YyHAYDGZ*`!L#bk)7`@tD;)@BTN_=8Wz8UQj#jb5xXr~Lc z3#HIbA8Hp$pA9EIuFO?MEsNWu=6*I}l23 z_my(_W=A$@`k%`Gr+)uWVf{bF4TE)hyFa&5%Jo%5?6!YqSKH^?gFW+u5q{;!v{qme zc#D}^?2E~k-g(J4Gs|Ws@~APTKIKeZ=siZW^qoo{r`%xX z7nnJu%6#H1edrw<_3%4Sn4dKZNbU5AcN#+P*qC?QWMV_@4JadW>r5hRW?>wY*|(IK zeIF9%5WW)`zHR8UbtZ=z=sPvTx0K89eaLMeT7yKk26=#`btaD*fN6%sx0JW|KIDsi z2iYnm7W+#1)qtRNrhpoNBrVgoRLJywD3tgrLN!W!r2s*22W%^Bu$UwZZ)-yE~bN5aZ{VTux;DoipfePPN%bD57L3XIIs zsp!{)=MG8fGf6v;JJYQ8aq1mDPLX2X;k&~um{$Vc)XYidt)O>76^5S5ePQaQ7=u?U zec?*Z7r_A%el*~jZP8$SHnL#;x!GbKYu;?W-~532>&%;(JAB&ApJ8+b<07Plj1phE zrPLRd39iU|#Fv)&o}U|e-_6e7Pi+3_s_EVh_LL4L+X`&2+d6EGZSsrL+gmeoJ7pfU znHmMCIMY0HhPqgNPMs^0k-1(XN0~S|DwUU`W(aarn%S3uwJyeUj{L`Vjcu*lr?<gx_9IuFORSdp-(2;xp--zDP3h-!sfP<|XEb%@aS;5ozvN zcdlIsyHKjk?wiSb;PZiwfsJh*T<<`p3t%qz@KVKsK5Kc_Dpk5T})K$67FE%VL9GuHAP zB+0A{C;0KF^fknT|NeW%b)WYCl8@{UL) z`^wFDs3TI%zE*T_VJkZ#!=0$@%-~F*bCo0eU)slQ8g9QYYhHjMG96E$vW?<9vMBvW_rCoR1G*-Vv@WI{Ra-XEXl$TK@{$ zzw{l?T5THc`|07npZO1cp9%H-U)OSG`~+@pu_ad))%)8_K%Aj^8KtX{UyFPm`O)Ib z_*#Omd^IbpLz#e_7~~j69r_s+tB$l0ybG@xAI=VBK1A|H*(_^L3zLAyT$$fv14!C-g`!`Z};C4{6ue zfu}gd!QTedGmx|T>%h8NMz;sn0h3PwlTXc6y>u!N_6$mt?SVC8P%_yU zSa%0Xq;CUHfkq1c*d8bV_SOJ-}dbD>I!&TWd7huQL;TadU2Z zSgU`L8~-c0vn!*{A57ci56*nrADs1!pD2IfC#oVpQE&D`viO6u7x@XdO1mHf(hH>z zqVyq@uITV=UfIEgNW#h%bwqNDJ0kh~3|8yy4i#oXFcT8~Y=;l7P0o=`67Sf^Uou@0k0k`)*U zvYTJ!C&E%c5tsRiVtL0G&pg->8Is}tT*g0t7+_otuH6rwJRa=%Ww5c0j0*Nt1ce&N zfIW<>7(cOd0IR=b@L%h18?OKCf2gmts&ZBp@wVKqxDCb5bA{>zVkj;YHZb}~k0QE{ zYd8|BvxU{!KU^pHFLkcG!4X=2ega8OlvScaifz(KL`UTAKGj72^YwBBp^ZroxXK;n zH#XO97E%S%u3Bepg#1}QN&ex=#-h}syR(Fua)esQI6 zi&om~64JXrkpjay1wfCYW2hU*FPD*=-H&Xo}^ zqHFN#w12#G+DoQWPn~yYj+5#)yfw~x)&5;W(~aC0wez*sKiT=N*3~hYpV?RrX&Uev zq}ssE&WFd7lwObc`!8yj_m$ibXyml;gqaQ8sZ-fsd3lK#!Y6;{&7XLyye80jlMjp` zCKGB#nxyvO@yK_iRU~~1ReiYi^YS+-(b=V=<*V=|>fWS0^yxnhYF+*MmvzA&*U)+e z*jl95DwAg8uqn68xzXT^H{?63 zo#sx#aLt+9Rl3ozeUc%6`wurXr5oNNa%aETu=*{cyW(9hk0vd{u#LDth^C$-n>~gF zhOL6}F82x-Nx9q2-=&y(N6VLOoGe67nUyjxZwi?H^#7!N0ImUh-bBweeEI;bJ>P0^rKKI6y=WqWT zeuG9;i($hBFPj~MYZ~BU&|UJf`On5f>qkgRNmngF{rLqeCSbhl=sljAP zsDXSa5tDm8X+E6DLySPFBy_Y0^?5>37QAzpzW{JoNsP~@xZU4QaKJv^%dL`2Dd+I@3 z3jw3b3S6XS+zf6w*G{4p^GU+{?IdB6{#-jB&E|MkB)Uq}yDvGig-egHp1om-Ch{b* zgeI5_eMBZQ2RsLpm2Pu7D-*1&^an4)!L7EOq_PrNKjI|e19R8jgg9GrG zt2Wf<%jiQ>AMANC7$F-51gw%M39iH0I!V*W%H;aU@^f4H@>grm-xw*1eyx&E+p#Jx zD=q7nwK09gH@G>L^149JjhKKcv#R!}Ma-#aO7JO!6mtyH5l$I;6mbTFITMvB>Uu#^ zOJYlIm#1(v*5|}PSk3_pf7#qw9d*+i)gZXW+0>0jSG=7hoNMRwaTDTfqN&^47YuIG z)JIuKM}`m zlxn00sW@jJjW|BX#hp5weT;^i)JE=do4(z9j7DfO&L~`|w%oZ&zo=~Ykm>8)UsBBh zlCTT%@g<3$@(`VJoV)KGKN+>meUyr}qm(}zyv^pm3vzef_;k<9S?~ITqwc#L?m~-J zbLW((M)Vtg)+X`E=}o-OI$?b zQvC_<)2^d&oNk8gfFsuFb{wOTL{rEe)@;x9X%@Ufm1o5OH}f^`LsUA+dIf5JUjk`X9y;KviW9k%|mpuEMpj)QF_Ls8!wzK~2Gd4)@L1-iP$!04z?Ytf$vJv8QT zZ){69N66RTW)zXX>)efzLX7i+B9h|wMvNLh7)C|=6# z`XW?gbw3B05FwwW!DJ5Wu9F(u9O(6(w~rUq2jm+h5VM3q6Fx!guqfZ^<^D&xVb>BLFDczay{x00lrGhPJEvlAczO_R8x^{K$SBrNdi_Xi@n)f; zSP+3%b%O%9DlYnJ^8rim1?%{0g}|2Zvt4z);U;3daphHKgq%fnkkK8(?H%=^q>%+O zQWD$`=(WJ2I}q$i7*t4!E@57(B-(;K@sP$2!2K@9WBS^c)KPPcCLcdWr|q98U4aZ% zNh75FQhb9g)WaVFi={BV8M61u!5pcyHcW5A_Y;G$eNI1WlW_U%V7g7)kZj{Z^dx3Y zv!&aYNEuRCLbyC;FxhU!SE>{$%?+1Fyf-wqqkbg#GF)B;=va@721RR%RxfGoY!$=h z+NPm;Y_Czf!sX3Pj%)_=q!fx-#z-Su4iaHTf-DGi;GXFhwDj`iy+A|lv1R`%c6>x1Bz>|SI-0u)sAP?V#kB3+0O|nyoaBToj2_tT23GJwBV2A z#EueyBqY)(-75Pljx<}X(*#bCx0C5#c{qdBF~PboFMiiw@;LuQe!jg*t&>Fm_m{^a%GoF1D%^m&fs+Hm=m-jUY$U3J~TZKE!%R9D4S)v7xL?mX%k zN>A8Um!8L2yt-7M_m9#yy>;E+ugCt%cVI8rknbDDRg9HGZ%hX{YCA_s^f{^)@E(1R zib*Wz$5io{%*aoApE?QCew%Kre-Ymt%fk*T6EpdWv=VajzHn)rfv3V8 zao#!m`&2Lq1xsw11r?z^;m^P&Z(X^U&s0TfTjXP4tf=)%FToq!E=b(O-vdoBd;`-Bp>u)nSY07mgA;-%DLgCJUnt^JI1iI|hu4S8gE;l{dW2~= zp=I9N=Y&pjw$|@uZ9u)5^A=QM-kg!`#pTkMwQMAD5gTcD@8q?4>-kgRvL^Tv-D)~U z)%)kTh<*p%su58>IkN+jJGQfFwN5 zP5CSRR=4_bV8szGD}un~ej{``K_Um!r5s?So<8Xc?QogF9#zvzwAd8ifYC8d=b$j< zqW5j=<=?xntxuM)e#!07Bxhp8>z+#LG#Ol#bUO+5JQq|*wsjG}Vlyo@)is=^<)%8E zy;g;--g`i$xwLwHOpyQyBp5&STrA>^9|1?V#tg%`1adj$T@RNW3*APLIl-9uy$7ei z5Pru;GrcWr0qfb&VD7w`!Ei(=#?a~42{W{iiF&GglTdRt(_bc6B@=p!^^+w zXF6VFVjzV3aBD=4qh1Nw9cK&nv<0=UuF(4aJ5?^=^rC+^iIC3@KK|(SM;(o71<`5S z2x0y5;L#GgPj`z(<@(JF%4+!E?*P4HB{ku{=H#Fvsv+DZxTXNkk|+k}N%|7XMgO$O zy?B?>eG5zJOgt~(nT6*?Jo^_uR+?0nwD#H)t5^RvUm?f!E98UpP_Kh10Q*yG+6ol% z@qR|V7eVVUBe%NWu(pE!IyJ(jko|#3`Hy|z4;}Gu<~UGx+`tm-1q%6t0b@b+6N_@z z7M!P*CPlZiP~n#aoQonXc=q62gfoQxJX)@_&$q6$u|9WzZtS*K{7D=)Rk&P1cWRQR zKH{mM_s%f7xZ7}EGDbFWlljRCze$yf9Xdi@7EHzOv;A+p$au8GlH4R9zmy)v8N~!{ zE6{*H9rZNJCQem13Hk{6vHnpFqRCmi19g=WXJ?1-&mx(-71uB%2cB&FQBtIWk_LNT55}*(NNYG&u8t{WWT=Xvh6OSBT&#@YaPI9z@pz$K*HGNhrrn|%%7<_Py++h@<<(ky<$e}u1> zz*$_{4*Z6Avg8o@6O6hR?v=&VAlLnakO|iaxpVj-(>mP2o;wCvk0c>O8sg({`IC3Z zw7LN-@$$+(U|lha`N_LbX-j%9q%Bpb%=6&u;$Eq7lWHgi&b+Yuz!P}Ou?St^oNDC ztCO_cL3GMi_HG7DcR@-#*k{;xjK=BC(^8VzMK&7BUZN$T9*$b_-AQW?LG}^jJ#O9@ z<2k-wd@Wq|_NIfA=Va7+L;c-;$=%|;)Sf0N|&+HYGE9nuF5~sPyrb!9$2^HYW80m~<^+hIg(;(yb0WX`} zIzTQ52zHu1rYhH8X{+faY6qW^q`%Uyhxl}1IP57i=95E$6i7%0m+lx~6!)+ve{Usy zL8Dcvf3g?wp}pV%H#c=b%eD2Kj_ohm!~097XOc_t8sqTi29wqj10dGzqa#d1x`187 zbpN1{=>Y}M19*23a&LAoTS37{I>&DRvMom5LS7~PWCX`{EMP*`2#~!dmHc@B%iai= zD9;=OOu##&G4M{N03*QsJJJi@Y-w+3uV6f{kUtNQ+wW(7?=Zu@l}cr^8BnbYV5MZU zfclu<2={5K(w(LXQ%vSt)TxWfoY-`lhN171_#L9*OHNkKaug<}2fbh_n8(Y1rs81} zwDv8%`n4p1-@wUL{feqI7fZ!$h)hr%=44wx!{N5B{l7Qti&x&){lf2^fWR1nzzGP- zzEQj;Ag68Mciu|K-8bn-(~^0w(uYh${$e26#X&+mXTm;X8sB<+{RsaEeuRG{7cMWM zwkOJ6hv>(qjSa_uTVsRZEOFS@bCA*Z1@hN7(viBA4$knE*KEyyqM2^0IYdizRXEFB zfQF~$iF`wd$pkg(4k9h`F`0XCDk3;n1$#CHP|sul&NF=^hUFgu)!5b(qt%^RM2z#? zOkdmF$1uV4wN~hBdFwBMj#{CwiSlXiP=SW+W}^aJl5IWPDI;VNP?bXCjW2>8xsYiT zrF1*E;J&UIe^9)}be6{lrg`fz^W*Co7H-WoOuiblJwcKWd(54F{b$!B<`Fq}fF$on zI-oyy-P{?LdiJ_PPVE!rOa1SAv6`WkQkkZCnT~1(9W2Mg{hg2%kb`-6KY5kFkgJOP zZTIVzSnE>kFoJKtVbbL((9A72Ur%txF}oj07^5E}O-kJ9Qz};b6bf#Z#(h@wb)LL`t{0>$^{Go9;H>oF^Q!aIYmdO@O3(rmqopn=`04N4n-@I^rAnHcE!= zjZ|r>!*`mLk9_rTezh}bFgUIaTY%M<&7I%p-33`Zw?F>&fAg>%G=I2^znt6k_dMBa z*j3$qa${9(U3cqxX4mS>`^H;c{$t+P$m`1c0{f>Oc+=E#dV>DigQDbU;Pit%r|_kN zOgxav#)<03DWF%WiIllsrmL|w>Uwr!CUW*5k$(t8$OV0zTpi@(CK_f1Z`jn>c&Xy*{q++G0@TZcp_ReZZ231D<&jd+@@g9 zze9g#WgF`g?|;KCehJsyr$QY z^RTXzrfVMG8Skp>b!c?uhqK2#pp%#$G>&qHHRT0G*UH`~=MIda(c{ShAx)T3ReP{j z^v80dUqc3a{uVS8FkSY;5S9-H@(W^+`Y5jlE6>+B8W~(9>>i@Q9DalE9-QPyNRjfZ zu+%;Y`%R?$d~dp|o^mE`&Nd@|Ia(($EeH9}^r{;obv<789f{i1!@ja9=9JutZ$a)w z?l*3wfa=X4+ zbkWP{Wv{|oWsi3$y7v`^P8Yf=uSIucm}YobXa$!xI}#cKb@ zoOi|-l|av6dL3J{JL^k|;*7vhi)a)t$L1vT2{*2&6wT3zajjF0oO_P3*OOdc150lA zg#z&DF9*vpN(I&Gd7M_(G`wC^LdWTYIA>_}c2LuwD4T_;kx%UNMkZ3Pj--oR`3Zl# zz&tgPEtc|ELR^^DIS-n**aBO-ZiVxx(~%t=f{D>TgR=^dW;%!9WO?cJd{I^r58Y|0 zPvCeNTB9clHnevd%8JPJUN<{Yl0?!v0jm}!_rZJg1AH`LayPzwZUshpdDGQRhl{U! ziSb)ENlcP_UN--jdQ#5jWrSyp#|rQ@nnv#ELHb4NmD+>!l#Zm_@WjZ0QL>vmyq~7v z{4zVS!@HkefEE@MiLuACpMGkpQXyK*;6ypY!94o8m!JP9oF?|uOTc}_s~qX6R~7wm zy8`x~Q7!v>vA4q_8h)j?XunE@{xxKR=ZF%!1J7TIb44dwT7{H=d!nkhdFp0g(f6Az zJ}#kv{aRkzoZ(aIZ`*?3jNO*@mPsk2TE6kd$hJ|}Jc6v^6)6fgq87Ok34bzsRF^Ns zsjgmHvxS?jOu5+d`W7L@-4Y{<94t*t`nUMDa48?RL^Zs=RY*D4lJeX<7njoHNqL@2 zdAG&X5H(DZd`dUYwpUcq&1;KNo)cuPpf*N%_>}KGoIV{C`QU(3Dsn~0(+A&nMJ8e| zkP~}Ja+~MxUOweJw{aUW`k;jl)m5Obxo&hwc1FnggC^kX@gR83(YA?wzc$$MyeJXl z`)-ol>=ICePpZa8wpa%-IY-l-VL{5Q#RI-?!z{XZOKgZ}F8O{XWmjllXn` z2{ht)lZNTy%HdOh1~-yKhm-JqG?Hm^=6!S&*+(_zm1rBKTe*23jn*CAe37b<8>6d3 ziz<}FnYI}e`}fg!Q-K66EQUYzmv+_6H>nnVB${Ch7>odqMC$_Hu2_-qMS`@!Whq+i zvXsZAgk3Jiukx~(L+lz`Re42-3mA7WdS$-5qqZOUS179Xhx1V>$C~&YQ1hl+_24hm z5zwC?KNaMxe9lpLZy0`d!8V|-=jA)$his?pyvISOi+gVq$~5&6Ih-L@DyBT*E^ix* zgr6;3zQ14W6ryxkg)>3e&Sf&t*rqWPd1=#78|4D!e6gE{tws)r-GW1$&&tE)_A{(p z3%R4i!|Wkp!}Y!h)lVCIlGJT35_akLZ=v4a1mm`wlRV z4047bXT6h@o9-caL*s{FRSee^npjUYutl1~SSjmgVMBOMjKt{#%0;N{A5f0$hR@%T z%_S>5f;AlcvAevb@aT31*XdCG2&=ZJ+;x$1;82Ar+_uNb`r?w69?{yeS?4-x54TnA zf*%06Lv1t-BHD!NGy!j$SqbZ_r=A#gLoz4{i>grDBXagJ&HGqv5hwB8r#7_ImRh(L zwNBl-n5wrexBuRvZhFxoAa=^{VY~Y$=)(kCEhjx(1nW>I7vmmop=gbv+#~xeyr1K{ zJSMC&t4r&rFUT+A=3J>w(3V&ZQhrgs!{mWec)v!un2OJ4;Hib>>?>`8_5kJcz}BjM$%p8_(pr}A;ZEc z+Pd;H&I5FIYB3(B1-%heCu=>1(CEi321m5pm?n0d6PUeR;WzSP#|L~dzI8>xoi>~ek5{fFq`j9oPelA`lSlwDHGuMX%T(Zl7;K2dtRj&zv0Piy&813itw z{E3I?iM%VdTq4>;DOxv-uMPNRE}%*HYpv3+<41JxL_>Acm?u%_$mDdX1zE}tiBHLj zqS~#+^p(OWI(BOm9W%a|Ru>jicr~eR0XOIMaaU@C#$tLTstW=}20X@sOa z;GUXuke*0&YxmP5QR5nd`ebmUevpk3mBpnUpsy^t?l?fJ7ac&Kd4)uuROm#_gMhMb z2*R{tv_D8cNHsK!ozHh)1;6g^e{3@>{ffD=S@Brm2>43a?7!*1R)ihIWWc^L(j>kv z8ki1;ePy9qz9VpqPBIzb6`p9y$L|DFwL=ZfTF~3H13lA&fAunYIMhYJ`zwozEjyax zwG}jn8=_fO_S1aJPx6(J6->&+IZNm{eF;6UucjYGmCz6Lj%?NrHm>YqShU7Uhq3A} z465PZgy#Y_v)A!$^UMGRs*FExQBNQ3nOwASyy`ZCL%6&ygr|K2N>IXOoUpU#3<8P} z8o(DvF_QB5V?}GnPv!C**6}L8hBss(B5(wFcGNqd#_g$Uzedn!f##=kl)L>fC|48m zMQ-d(%F@6-W#Q66C+m94K(CJ%m9d!`qUM!>HdB#r=mob+s+JM(eTK{9p>N>qI_o=F zWe+bRNy)J0o>&y@c@G{@_{(;(omQno^iGJU!m*D=<6(C9hl;p#b1g|GpKBV=*Xl5T zY0x&YJA`Y_3VdM?U^rs?%B}CriB+{Zoqvq3uwd7<0++C1vsDbPz2jB4hkp}hGLkDO-)r?uWLU4uR5L>_dO2r|9ZT|JJg zr~s`WX&?tbcMS3Z#F!h={OaHViKnGhUTgY(Qw%1IPF1d(Wf*h6ZiluF_1=(z{9vyhU#n& z(fMp{Xb(6%y!SACQTUlvk`kw)(VziDfk+NlBxwDiBBArH7*B1vg>T`Y!_r1j-6PzL zZkzxaP3fsR`Gy;jCRrtP_M-1X@R;gJ;&Ey=*U&68&X`Xx$UGhB>^hFr(usEbol){ye~be zjz(^(0s6&pdOFof-$*SkFyDL|Fr79V_ARX&fktMD$>#BdY zSB6GWV3bhIY9JQ2C^iyo6QMp3m6Z_ZSji|Wlolj&QH|?L(S62iYK`ik3+0D%MWOWZIrTT)0vT zU9LrCjetaZ>u$d{IFFqbNcS!}H*uyxv$b-zL#Qka()?){3 z)*NgpOkUktFcp-lmdge>SV6knW2~#n->@WIWO?rlzJ!{hlfbV9&ea!7rPy!I(hMm@ z3ik^{E#K%JYJFlr+wi>J2ngQkV|#8t<*KUbD;XHc{3+}$p8zIyrVy=%pF4ZQOqjoy zgf!ft{1QWi1F?Zcp8<2fL%r$kG}lcJD*w_#a*!$}NlH@r%fHAj(RR#DD43Oery;A}$F z-@K?pa-_Rp!N6HC`8upXjcxQr;|A8h8Dk<&wX34=oVURr7{zRPvk;S&Y-hPug>QRV zOSSCiWwlEOTD@7ISBCd5>B8-7pHoaBlP^<^X^AU-OMHVf1pU-LJMx64CG*{Xe`(TfVEEvSIDS2;&;WunO|y%JDPv z3+^ev-$VKK7{K$l!hZ**7qOY>&|C3_w+vep#>=%2dnRu{Pqte07~9I~nmhj()c|jc z4s`|T+zpk1GeXCN2mU@_rWM?d`X-Wm!mS&w-xPHMeZvQ#^LX>^5e@bFBi@LF-8jFF zE7umhP6Z8OG!l1HUbmYn@F>k{xxb&mFAmdL3$TA{M4OAj!|VLs+^#_3Ca<}(H>wcd zgN09dlQytbAjWN7`G0s4(STSbeLl41Uwh{Px9RmU3s`K4Zh~5VnsP}=n_?40zgi&h zO>4>db}mgV7f_sD7K;Ay!ufV(8ap>#TW!c^-i`C{f}N*#;Y@UoDaMu#{fyBXTQg0) zdV!%R7&;>zFJv^fyjLZ+4I-=yC(K~aIoLz5;(Vs57Z&J>RC4zqvk7Y&Ssr|s$mxG? z=$p@pvpKREtdI2*f_;C!h@HNBFu4H{GojOGu;=^tG#L9l#;(DmsgIHPEeS4j=aCS7 zjOz^t4QkAs#LWwnpKoGy#CiJxe|&>5f0`*wJ`jopVX!~)D~j1a?X`zmVS_Tu9(kb@@^hCj}s*MbRAuav(G$p9lY9K zzF0>s3oBt$k44O99bJHu<(e;c?nX{H(vqf{T6702=}l46Z}2-=`mLoJ?W$2S$@4n% z5+u~ooP~9CA^KbF_!asyYhFd`B(#3Od~D~t_`X~EJzAN~yyt|4cv4*Qy8`B~Lfcla z9J)i&1UyCTd4)!ptoR*a+JoOwrqA#jM)>)!&?u7zGP3QxQNQL$Sk8rZB4py;X-(92 zU#33ScO!F&O<|3)J(QX2lWnBKiJgTseGB}b*?i}({|x(| z$jisW(vKpIXXR?`tro*I<4|iQo?Eq9tx)ZJHkSpU*GnfjqIiWPg?Ro}%@N~Cj!ac> zBm?g!RU8?ia4(H#q%-pM5`ia=)}7+vqz7% zCMN#;=bJW-{_*eG9WMk^h`b$l1+Hc+()IT|6O1cbW#N8F<=nNr_h0Q;d zdnA;bsJr1+htdZ^=_EvPu0rgi##}+~Ot?tXqr>F>cS+NuDi)J2v?#4hsE$$ZupR-O zBfSgK_11d)ztv%D)l)y$ep`Vk!K(5L#8hx2U_~$??w)t3<+ppe*VtZox!3IC4y)y3 zeR+uD<~QJcG|=W1=PUfjNk}_4hsmj+?|jgY4E?pNW`q=+Ola9U4c&3~4VN}|PEovT zo_-Qm^1xuEK7B%e&sV{F9mF8gvb$3xRVZq&8UEuB5w+J0j$UGG1{YU^B3igpk^26g zPlG4BV>Sv$5htkU-Vi>^qAx^d(cR-kx?>%*(WWl&m8M<+xo>QU#E#P6QxhDL>O*C` zw4Z*IdZuAN{WujCcn&%#@Dv7VkH|ImILBrC2ULs_(}d4Hpzm=X&<~<;rwA>Wy@&Ok zUT?7!2CrwM2k`I)j>2sfAE-0>m(0`}a618=O)gkR;2Cv*~e#aZ@6Lac6ndSljFZe~_~m>d->S^Ki(=0%n(%x5-)bnwP&uupT4o$0XU zR$|5+{ARqndi`P5-OZKo0v%P2ZVumEN-yeM(6>&~X1rB+|5ewb%7n+Nlzyrkb!qf` z(f=nBCKm@-o6D-G=IZrF5oNMWZw3`y@2`Xxi5NRPKX}nbsD6TZv7SdR8xJuy0<)f` zHJx=9Z6=$rd}(a{Z+H zjYT9e)=}l+<~(V?Qadr8yKU4LijMQjWpt+F8T$*cVD7X`aldUT>`*GBFT^^~s&V4D zUuYB^ACFu{?>zf=DmqH%esm*S`C`U2_~~a#Uw9QA=fq_+ZQ-N#y=Y%%QMyl|y(lIl zzB$Hm)jM8_b-<$RjU5Yqhu;eKPu%(XdBDJ<{aTk`9k<~jTb$z)oG9VDL>&Gw^9=v$o%Q0;C1)z(a} z+QVi%*yBS4?-!}0`;)btkbhE zEtsvF+Y!G4(f7+Um2!VyGi?PfTDfy^E2QHE6SI_ZXCJVV%Iaojt%|RT1Geh> zAUw_)&eN~CQhGD>xYs19D%5gAP*o*led0Y{utHMG&8%%6!>^R}O#HdHpJ!f&j}o#= zel_Tnj;~oEnK8oqeJdn3=J5ihe5Nn#HP&bNDM7xgH>`?OG`E*?SKGr43i+44{C>7? zh=rX$85EK^?_c>F#+l?z{N8S)|*5{}gb-1Pa<%6SyH)?=z)Nj}tmF z5c5?)W`lb_fq!e-jE=YjQ(gCgZRcqlx8j1ivp>TG-uP=@HF|I6fD^#B@h7l7*~cJb z5F`wQ>MWX&#c)H6W_h=h*#e2Y1NZ3)h#*f1!PHE(GmzFj8K=8vLKfEk-3LJD3A$H1 zA`}cdzSBFSHgKbJbk=wA4C)gm2Jdv>xJ8dOVxB4jJja~aXG-H>D`&8;8Dv;*1J=I) z#j@4#&Z&y~GM@RaXezKZW2fcS4y7WwNhPfs$D%pUw-?ViPiqQAzX>vNJ#_El5DlKD z$5T(zDAL3PJS;b)mlUMJzUCgbxY zW2A@i^J^V~5HBj5`J#TtR%+jkhS7TkVFOF`f-=61cF z$H69BpqYl%(VJKqB2hW{ z#I0vjDt~ykG@qQrY5vW;&%a^RFy0NW<+OFD>7Sx1>7Vr{@x~kz_FFhVrx3rA8Zu^R*l9cgI+8;&v@4@r!W>79CPp8eai+q+Y%I-lHefq5a z8tfZkavoy!X#=}ugpHl|N~-

zePJ(9kN~7kpcAVjWrIbdcGOeJL%BGDSk;2pxq!d&lJC(2n z5&y50Y%QFFZ`CqO=3Q>JtnDY=f63cbn+zEoO_Q;cbpZoY`%T&m{4WPa3!JW$y2(j8 z*$HVDynfI0IP7~1ao1?pdYNPlt)T^8p7ZVLq19x#03H^>Zogq@?tdRlMYp|yyh!m4-oqQmMD6>TQ>%bkiAju=s&$-_m z$KX2WW$|Ea=U(SMG7>r~cwUAtxD0XOkPZfTgiUs-zbB&K;hOLOXGkj~Q~uJ<|AIf& z-^2AQq)(t>rWLZdL~=L`k?w7XAp#f4s(}zU$@f4b=wWhmktjC?n5Dlb74b7w#CR1q z0DAPgl*?{yIZk&Q4_hv~r(&d+1I#vh1uJ|f<{9YuB*@Nellrv;L|ZSsAmHijoq%`uPyA?$}te`^AgI z4cWuw(~xXhdI9@9B<@1UIHtKQ@Px^K?uDc}z8z=Hq<}J{@nHWCD6@t%f$IULVPN0c z&`fIh4eM8#5eo7!2*0-Q7Y}6R&gCvEhi*`5HWZO9Qyq8o!yH zP4eN#It?!_XJDSbseyFZ-X<0@>`e_apA7UDd3L`je*@jXsXIwK^~7)z`c^6JP93t$ z3pky8kxIQ`^3#x8JGdKI#{x1rH%wmMTaPpE*Qu`-97=}fr910?iF}|vWGQd@F7DaQ zdz+@mk)-$r!`fr8jZFYYnXq5f!UweXUwhKy~WN-Vl7*;222G?+Po2FWm($ z!#S@f^=y0juCsL7YD6ga@^W5k(}R6!SN)N%*(^97(c<|`X1JyvesHX5;MF_N}P^ut|;^ImyxhDssnn?F!R zTwpkk_b(FK!Vbb(rIwwjch#-KtyTCu@c&5uh7no|a5fE%#ABpc z8J~I$n-kUuerM+50&Wf>)H&RfF&)lUNbh?Yqz*v3sfnFo7_4l~+yz2I7$Q*%nqoFb zhgwD#2y<8~Z8oce{UcMD%5DOV#eajyEI+I=G!yt*hwkH8%J)-;$)mbb+jWT`k_rA~ z^_R4H{}CE(`^W_!QLj2V-7&_^zYgCXH`ud=;?~N|<~)XxM+b6cUhTyldllhdQ_F`D z-8`pAZB%;@WuS?oLd4k{PEgNYn8VZ2Q~eTnq3Wk z^{9CFJZYfk;UFZQ&{8|QNSzYv9^bHT+beNPElV@jlrK>oZ6?XT^gPq>?bfWhh%23j z8)S(j@kP*(*Nawsg1NcY=bb6-2+;vM^Oe=8nV*tZ=tabHsNg?+3h?Q0a>6aRkiNMo z_bz)M;!}hOl|ObE(pRVxGW=W59J_vvRysgm&}pc!iuWyxMx-mh9qEhU8r*@^6_=j? z-%OAa){Lf;;@`jFj5^@BNGB0~KmS_tW_963#3j1(9(r!Vb3`=z6uPThlQS2tuA}2f zG2Hp$j)1rQIIckHy zJGhl~m7s4fWs0YgF4yt$S>BwY$9Zv)?mX`NorWaY?L1mkO1J6M$%0={i2l7Cuw@ec zPJW8}JZ@sWQNG71`nPcdJ+p&m(ASw%Mqe}gNdoKPOK8>GOw7iDKG13diJY&Nf8Q5r z)vaOwS8zZ;^HP|h#rP$!HyX18*anaDfbI?Y<`vWJ=2v21E6m*sgp(j`+Txn^q&Q!*O^9r zGpCS2`emS!o*jnptZ5wVMsET4KkGBvl?meHm5zxHwu?P5kPK^-S@+diwVcKUu*nPCbg0T)q+&jy zFQn1*Mx`Osp+jvp$1nQx%MGwwR@IJ%T&tw%y1ca}yITI7n(Vy%2Pzo!o1t-Gq$4;h zs2XG&Zhxr6OAHDHvz06y8j<~{Awf=`b^GnJZl5*ucY7qp5hT4{pkeWgUD!deQ-y)P z@)5;lDkGIm$3vcNiA?c+E=r?mZc&p949D$Ym z_lz4}77xc{ChWfD8Y8F#{~a*h%;|$Y3z{PCe`Bk`#WCAFqj8#y`D9aDxkg4@ut&d{ zm)qda<>dp2ay1sFH?n?kuUFqv02~ePE$~$?7}`O8M>+Z5dRq(B@*{%|7u%aO9wzx) z3oh81^ylWVU1>;)-`b&y-etR22lk1dhxp@U9~(ncubL+?ok>h<&?e|5(FFY;wIXfe+Y;lM%aVIr)VwQN7+ZlB&l{10*a>4QWiXCNv~DJ8lGdUo_{ z&hYoJQy+Ibbgn7f6zB*Gr~KmaUx4Qa6u3JwFfbMx@$~@yyFq(22hBhi1w9J?yA@U~ zbLW=O9&GGWPv)nGc|`vrj=;<8?QIKl`VI~Z@znSM z$Ya9E-wcTUnVfE|Qhpb0?&eey`@V`>FJ4zAr1)p9)4jJX{4VpmQHE_X;NexOuuIMD z(a|_dWgdlX*5wc0H`4QJgUK$K5Qo`cvng~+!T-Rmq)GTcFJF3aJ5ydUfHu(lk7Tr8 zWVcHg4h?~YF17{?&+`W&thcay8UF?CZ=k1}QO}2D%0N6vPK@Tr{bM-t*Y|e4ux!~f zb_69%Vg`F`K|~JV{n0@6@crlf@+&IcC1TJ#khF%Ku7ZXeo9t4c=Vt?_8pzA9TBv)? z7TXpDyk(+4oKwj`Xu;pRtBY=IYNi5l1_Nmvs;|Lz1Q{eOsi_qe96tbh32asdJc5DgbK7qLLB2GEwOZ9~9_1gq9MW3_!I zNIMPcv_Y+6FC&T<&~`?PcD%IDw59FX+KWNyh)SW_d#8O8&>7TT?ASI{I_*J$90(-u zcb!1B^E}V{`}{udAMc0H;hdba?|bdF_g;Ig?|M|9iZhGHEM&*A*Frn3=U`R564sY5 z;sk0F`i^Ls`2DYOy@Wd5i~ELToVko;nTJuof8pH<(6$>_B`!9PgO(J3_LN~V=s=PZ zGou}fj`&PXhc;8?^t9gfO*9O5S z7>FZ<0|`x4X4a>`xP;D)z)vJ9{mhV!(!C-j!Zusi5?}g-N^xd>=|`1H*q+B^j`mLU z#Fu|msmL6IUpIL7D+^oHrbM^YyhGZm)n)$VV+ga*2S zezW-hq4sn6?WoMJe6Z0;Z@n~aCcS?``w#hjd}h0kG4%SW>_ih*S2a$rEF)s=c3)I& z3at8<1FPi4^~$zOm1Lnq>s7Tl;pnTdlju47W6fLm*455DZ9!i-!#c;l+NV@;XHv`0 zSB^AC`u|oM63>P~3!sZKoWO0-kIDK8yX#c!Vmp2GCIwI5$uXcuC+ZO= zTe8G(J%3&~2pjn?an^DHW1h-+Gs?+AZ+VGC^Yt4nwV_Hf;@pAVqY$rz*k^g{;8bGw zpt+K4O3iL|j{&RBuLjt?iXtOcNOwttfq4?-T)juxul#f_wHoP8aJU!L&+D*6gP#N2tu{A_)H;DK* zfc46J<7k`OXLBW)pF$29UhD~Q7A7@wuw$e%Itf$}_qHL6^-jtn%R%&Zh)xXfCXO)>$3l5xr58KBt(Kuq63_$rz&&?+a~` zwmL~RtvBa-bIrGd$Jba?X0C-Znb(k}>A~9bs#{MVto@CO={i`oS7q&Ls5Mi|t>S^IS6#V=jnWqFMrjJS^8%Hk z9vb}0EXCPLkck^Wy<05r_$NX4ly>z~b4b!0X_dG9XC(EGGt$Vay@*9;^D!NJu&U=^ z0TE?>yu*4WH-~H#J5+1WSdnvb5MSN;rd#aOi&SD-X!ZqmGJAH^WQ%XFv;}JgCS>*C z3H24c2D8dH$yAG9RAw8>oONN;NeDpZJp;J=k~D=#^OlG@-KA%<(5UGzf99_MGyBoPV_Ws4oWXvDI?KuW^XD ze#8iQcYcCjJ>j5Vt#6h2B#puQ4`H4GO}vi#r$(0Pd6Q)l@mzst(i4AcZk)ZT_Jr$6 z#jjx7e^igtz#O5gGP=rcZ+THV3U2adHtza)kSj5R7Eg>_=y`gj0dl!eph7xc%Xhby znLRkG1D3)pFC=`RmTmguwXhZP=@f-6B=z2=C#(RgxV!3Z<-N$|Lj#-hRD;d_BA$3L znv2eg^-U`$l%XgejW>(^_=a%cnULCKDR{r(_y!AR{@tNw*KW|Br66Q}zhQ>&%j3I2 zmCEU?`KGhGC0+JGSo|kvza*V-ZidvEHIi)1{58pWwrR;O?Jt83Scl^mWIw(B-O|<_ zuXJgnfO6N@)TJ2#X;{_4ht8?EGdVyz``W(;G+kGfW7i-RwO9zN{g1H6V)@OuACV4Z z?~-1dPnZV>vY8thad1O0uys%i=`FoM{k3c+FaS43#*I}}Y(&diI5RXN@pNn+JN5Mj z$PO*$!WVIZwM%*(GYTUnZe&d)QB1_!7qgGoHoKN6f78;4^SMUpWy5~m{)Qr))xLz^ zR9_SDG9vX?b~H*SEEFcO5cLNl!AWg4tf=4q`Q6)=-F@%Fg6bWl_Ab3;Q*|%lX}9!> zrK~B^H}`Lx{(F>A9KCTj+E0mdr%^zsH~_80$*`w*1*^UbgVYu)cYfkQ+vBv0tfLiIZZnR@ z*DVfphLOqf?`K0f#Wr00l*zENhKQDBbBz^HsB*eKm;c?r2RO25KA zA)7HK8I<4?U;39QN1b7e;|<~OBJ%`|fqzKqL;HtDZJfNj8xtEFYnq6Ev9Sw}LbGJ6 z#b}=E%{CXyrD4o>qpVvk+UXkeJ)o|)K--JFtTDlG`a8xLV_1ZCm=^5+ZV}4z5%3mn z@9uenF$#t&{{50AhlLc1F)HLxHv}2ecD(!MJNm*wr+0n#S8wc>KAe~CQR0ghCBN+F z4NBu-aHh9_F419u?d^yxyQU@95N`m|fKh3{KEfDpco*xS@i;r@kosstv;2!SzYN>r zbkI+?_j!L5WpO6tG|KRT2OUF%pMYt-Po16Cd^&c#n6)JKQd{j~`7CxlJO&ON*r{hE55 zcyPKo3jG;{{!I1~Cmrt3BJ}5epkdS^JZl^&=l5)X6MF9z)V&G4_X>J%;diX*64Ipg zi32>D>N5-X;Ta(xGs5ji*TujZ&&y>D+e7vToWZ?>r;!O;$jojZm$4UEM=@SD3y51d z3AQywPZ!LIXIY?C6xqka()bGO81_mx7)JdZhROQDdzZW#vIdC~Nq;%+jos1|oW0)O z9rXrl3>(gV%VqifCGwpAgLgJKaR`W$eo#caKN#2)RC_S)=LZ8%Lb7^$clh;P;F&Ct zFgY`E&y5(h#24sU{B{?p3HS=gX@oh+N8EsT!#w-HQutfdkde3`T{wg@g4gssPQ{-E zcHtO1d*kha?_Ouqzxmc|@A0!YuJ65!JhoaAJuxWlH+YVe`zt)v$Tc|kI+wY=`yX;i zs77tC>&uTwlXfUX9i&XRcYlm8v>I67{odw8=AbiiPGVxO(0``GJ*_s8D) zdP8HduP1UEksMT9Wo{)aMcPa6Z`dTgI{)QwS#vCCu2#;~|2hMH847gu|L`r1yBf?p z|KSmpQ%+~ArkrlT{jh2Zb`x{4o6!4j@qkBZ8zH^gYh&AurVqYlvJ_u{L+R<=K3h*4 z_!^#%;W@f(H)fGWwA7u5bxgm{_ECr0^v1Wu2^r|U|KwMgThHERdg{qt$NB7rG43&IX!mw7o2eOqJ%S$p-^5AI3)vUZE7T@B zA5LX4pHN#WrysUyp|g^VIq<|hJx)G|vvF9pP3xoj6E=&cpU3JYjtv2o;)wKeJhkG* zC)rzS8$7|QSBaY+$fiEVtg4K`ucH>yvs~P#M^C?IiGk$lHA|!qo`K%eizo?`9_0bG z%%?u4T*!Kx%^K4|a|Uz-jQdlPg~_LdE4M*+{tq~FZKM_3JX-Ic!uOXA2H03AVK=hp zu(h{6o>t9&>q|F}Lg{80DUJOpDZ+@;a-6_fpjlX&pm)zk_Ds-OIF4WQ&tV0!1=8I? zKHYp8F^6+b6+S&3S&4-M#}Svwc+dB>KgJO=o2lbJ!o4^c_(B?9BMBXmRD*#}j?#`Q z!jt1CK!yYQID`Ffte$0HQpK(gk&IC&3{m@xmNcE(!lm^aFao^LYmP4wMBI$;bW-CG)_z31DM~Il} z=HWPT#p=ey%4$!nV{SK2l_hmjIPgl?>KV}!VD)1m4c>uvG4u&QOR`>87U<^aiY8SQh*hgvC1L6)N2{cM zm@Ljzus9pr;+1q$T~}3nEACoHd@*X8J`y+@Y|98d?@1q+c1n6C9c#IX%iKS>RUHaP zmYdp+iN}?YLO!B4Q2ta`vO{A;)SKZrri-z<8~tqoCP1DzA|B|lpaQ`l0F#_q z8R`4$(@~=riaqMt>f(3MB0wrfTfBpoNO3d9#qJ0#M#4wxn+z>HcOxP1Y%|Qz_XW;` zM*&w-fCe;&lL#R<(J}IlG36=cgleG>wThHd`ueCRy(zXhv796iiKP@$ovW7ndOEDv{O3S8KS1$ z45(ZUDvyjUYA*%7wVlG6cNpsxwiJ+8Q`*D}!hzFab|Pl{i5l-+o+k{qqHYg_V;me> zk4cXPjf_m!HUk%5{;iaMUq7PI&hj{}1C78^-=&28?;%JsaZ;xzSs2lb8rbPw;XIH0 zJx`01zg;bmL_<3ny5vLOzy8H{I=8>}o$RJj8uYM+dKp(_WXn86%UI>HQne477VcTk z=}5jm687%5>Iq35r|`WE@wcH?1EJ+jY}RYQ>YJg3bVS?|(ifVSx2EJZtHgW5(BFlO zYWO>c@2=2~ewDZ+4DD$BWk01$*sg3wwKSelJ7|rhhHUkRQcC-?5VemMEiV}R<**FO zrEVMvYvp3-7VFRKgCs1Tde3Ns?1N~#U7Dw0#9oGzC5P(fC92pn(GF_y*V5~Ij^?&Y z)@-s#+Ezh1JR4%=b8{*OrA>XSmh*5oX&o8aXPr7|BSEhz1Z1a-QD?2azhf!hh7g;f z@u?k|atIYd9F;>T5MnL+FTb_-QTDPQu6hJWa3Jd>jLQ9$tT_rT@QNHV4j}~trL`o) zVdu_>_40ez`}Ia+J+5x1GDV@}sZSp68THV#mipejL?Gg=s_z+9#)#{glahMsN$D;H z_1AFuZ-$=-qP~TYs)qv?!l}jV!KeDt^(4_|#Qwo&B?ZHXt3z~}u~2S-w9vDC0^aQ! zj4y^IW8z6^%2ex>C1oe2ys6>9r=cC5xnk9VHmN4PUDD@r6OG*=o2KQ|Rb?42lkGBZ z;)_p8HB(8#cdZ;+=&M5>8z#y3v*8i2hdU{yWw$}!uAsYS)k)m{dtQGES#cu&BCOWh zB-hk}?pDNcO~p)z{*W5;OJbp$4DWXtvwW0d>2?WZZG z<$1+`d#5dMql&R`{Kbw*2u&FZhR>ph~R?CUSUqWjwQKt1pgRJ@ZP?-e&2zG>5@B6z{GWDRX z@f_K^h69Zuk30s}K<`kVFRB=;bpz%L`i(XcWV&@4PZ-BlhnT`IC z5p{*|71G`B{84TjN-I2MyZx;k`?Y}t2b)r)>qe7l=>uk*~_Z%#u8;y{$K!y4M#JbRSyqE}qjJ?@E<7Gr+0LlgDbiWXWBe zrfYduD!F;Cs5PaPq&zrg&VsbDEvKa?rY^lYx&UYVQ%RHAGIcZQLEuS?F;8#i-Na2u zM0(6p-D8YcIS}ti0F4Xj&>Px%uxv9%3@2{wS2;4uw4j-)Qq0k&u}<@Ytd>1Z##912-2w^9Fods^8@loUf={%(;(^q3= z361r0DkWBV!f9*o+br?jKL^Lp0p7BacmT~F@8Nk9!s(B*CK|2vZW?vJ8mtGWAw8py z*^7Q%ar=E{=V;70B?~RGCxpvDe*Ra=k4=f-6Qh5@Cl)13%`9-jxa(3|h14JiL27O6 z383wLdEbN1fA|$$nauY;&uC|W*xBz$)^xV#DD$J`wb>>7X- znCTttEP-_z9O=>G8MbLO6QJ#h4ygU9K6#C)bC~h(Nkuc?lL~QJah1%39~R(AjtC|> zl4hr@NW0G_7B01QGdZ+&Jas9yFm0{YL2)?a^|A0KAHQ)~ah2p>Kf>^AARBASQ_h># z)$)1|^fE+a+QtzdvL&0~*;Lys$m=9p>k10uTgCcCC z7-MAI$vY;aQH;E!`M{Y@{G9TRE@tg*QX0GQkPE!22)uDUzr+@UU0h^NPs?WO*!{9r zkUWMVPju|CrMPkO07=$a8JU9mf^>I5$>{=k=Dexr8-NCGN+c`pp*mU`1xNd(ku&%I zuJsZ#GsX!jlII}o(Pr(Q^K=PN>F+xum86@NV=wJ~p_5mWF3G#nqN;Z% z+4Y{8*k{CF;4<@kkD{cS`ABCxBWq#&j`67$wagR+MegC5K%@x=?(M&^X*+&|r2d7fvIqCfD!Y&* z#*FxfuNhhw$NlQ`Hh+>BKOzpgEfXr6y4YwP{1LLztoZ>TB|PFad**h}EG@qf4sfB* z{ZAX_flFlrodSLc`q@dVeTXq)WJ|i~X49U+nwbxrCAz#pDsqf1J)l~C2K=+{0;pQ- z`>?41HJ&%+EISf7iVAO{D30K~iQVppG`<+Y5Y-XEu*LVfi@4WZaRoep2{Fk$3 zE0$Cqht@B(!h2V%WK@m%2MK$Wg+B@6ZV5iq`f3kn&L}SM)h{j6dw^8QHz%j#FUpNp5)|bDds{^0;d$7-+jF6#$=gYU_L}`Ls zrX<5ZE2-|w2bl>w(P9}R6r!G0cs>0ax-LFAJIZ2z%ipPNJY#xj4t62LbKji*ncuYR z`Q_Vfjqn7ur1S&-FZcv#{Q&4R;-g8og6N;-p2+Wx>wdR3V9!L{L>?asaQ=7;mnW}6 zulQl1a^p#N^OT=c6 z;*tL5gp#d?RKR4RH8dw)37XJ{8|?AEvdV+DINz>54j9DIzKcLzQu*p@4#1*xSD%tm zK^H;%jS zp~5Z|&r7a*Chg$i_o?OAo|jzry#KoA^VdD^haVM+YdIp6JS(Z^jdyXozj3{2x14Ye zrAbJ5Ov^;3I0x(pCUT zH5b@kj`Iz@{yfBm3<~;8y?qK`S>FOproACnd=yy8&kscQ+%r-r3@g3^&B4jggo=^p z70BXXE6<5zkFsL)F>NDIRN!Y27DWBzXAu0mg%!2O;J@W4CvI%w#9g@liR(LDFCSGm z-eBPMu-6MB4fs`qY^Q?c8imNq-MI14SXnDO-g^#MKQX@NT%?c8!1jeP)jLfUq^n7? zO__H$4}V=X@RDo!2*Y8|UC(ne(O~x24 zdo4)S**aP7ulK&M{=Mr0 zY@SWdrOsvL=JKVbtkG2Z0`LJ;EbVqj3{3JwYKAe5T5=A-pmV9j&C*r5Y;LS4Bk8^< zr`kG_iXQv1YvRpJV%etnszemxKEbWqghm2Xjtyb)A@rs~(5oAR({s;wZ(N$a;> ziH)bH(a1ZmF&X(TJ$^0U2BfqE;VG>cq%S}#g>p$kF1O$tWA4Hk#8m=Q+UvAMt*!r;I*OC_6K7>$gy)s!Y(Pw>bS)Kv?QRzi!`+h@~ zOUev;uHA^*{5kj>*=+NWL@G4xOzK0}ft7YD*=pOvuq$KQ-Lel!cQbhnBYodEd!&@C z*nrf=Q(7vEeY%|1Iyo&BrKODfIV}~^T7$H>c4{|CPOlHvwgErMjW@f1uV|W`yd)p? z^|D^fXy6L6Vzrb-X~QqwOS%Gh>xI9_AX$g2+0J%W%mPRFzW=c6=7&v%!0VJH!Q}5* zDnRLKR=%~#Ri;BJ_$B$dNLBV!;9L3@w128cgL_l@*hdeg{~Dzq#fT|#>7&^1kbeIl zWKnYZW;y*Y{MG0!)(d_BX=gHcjaNo~1>Y@)PMtXM=ry{WFhq;c3vwa!d?yg?1NkdM>>XesaUFk&ct5Sr#O z*Ej_1s~D~tZNVvKz$;C>9kH^NXxoThG$T5WQ}1^8Ir04g$a=)9;iEQ#YpE-*CC~n} zoS!urx$-s0mC{hdpV~XnA2}n_%UhDvm|nsdjZTzg!^*eHT*Mn*a7G~qlWX~5CVk&J zKC2$6O&Q*CuC<4c0ZaKWT{?b~o%(%*Z^QO|+wV+C5cZW9wrJpQQfIe$p0U4x5c}2( z&|cb)F_7eY+LMcUD%W|+wRtUP*fYyS`cyutIoY)Uo^7A4FgRJmj#*dzH#p(d*6?SH ztYy+XjDNxxn?`bTHCCfl?ULpK*-!q5_l+){=4<;?u=dbFA9bepbBVDolyoaT2O`%( zY2;%s+tzk+{7YTBxOwfHY%4oiKBnz+U}dGs7RGyQX?CFiq&mcB2P)HC)c z&jN+-v5m!d6~5E%_j7m{h|VqQVqy@xGlu(5N}G#mdqx^*Ns@$#`)pC(xc080vNZX= zv%5+2?2iX)PDp9`{VAz%#}I|~_!u)e$_q4+$oFnLS~ac&dadEi#3y*jjT#3%ZPOOL3%)|~KjgMIJMqfR~&P??Bdi|@MKl!h?n5?h7 z39c*7&;5b}Ukh}Vym&wS!%~^fU@bsvB9}ve<(8(3tb8_BZ-ZW@Jle!#Rm_9~T{`ZF z9hgivJ@oi9HaED6N@P{<*t6OLK;0SHn)&z>Gm|@Zx<1koHO6;Et1%Me3TL`I%7fP8DD_C%r`tZXGtf5MT$N~F zYUeJ{uU~uLaLK7eG3NWd&=cMW#O8`oUD2A^XsHuusYUH6kMBlVcFjy~-{)$R?Kl%q z67Zf#NmTROCYRqXm*nVBNoJuWe2#(nGxcVoJnw znxe?;2I3p56t@kK##H@UR!_2ydk}9M>FhKn-LcB0urmmA+_TEXj5jqUUPy7J**AI; z?R$X=tMR;AZgj46?X(FksjgMd!>+xyXfI@IYu(MtBBl5rzp zOJT1Do-gE4A@-H7Y~jKd)(-sZ$h~=@y~2K^E1Jpg3Io?O(kIpHIiQ2nyu{(Z zU><|sDR>+j+I*sqH^dchSbLX?UqkI!u%>#=sWta_>RidrD929BmRhT>k`vcMGo^a1 zwt2o2J}!ahM}7a-!AQNRZ{3aYa}ZxCKzCLlx4@y`9*=-NTL#KDttnemzvki^o9Ccw ztW)K9!>Owz=_MyFXn7E4qc|s!Q~bjqm6y^ZexWR{KEzCN`!IhdRl8J=V~)W}{VVD7 z*3W^S&t%=>P3($}I{|<5p8`da=0@GLLoyGE?~IF{*{P1&H*;O5Qd88v9jgk3CZoL# zl$QpsfUq&AXFl2)6*Gl)`Wnm;8p2CR^b)T*F>`|Vm+w`S6IRO!rzJENkmrQq{7NNKHKNWzZSI-@jyyV^SAw4c_Xkh&zv zx^aKBUKuBI@i@8uZun2%2-=H`i8r=~1N#Ped*{%o&=x%j{Z;S?jEhh|W_?iei}n+c zu1&O$c=s9LXXn^A;eQ5J&pf0ww!z4X*?Of|&g1g|8b6#vfz_~5{Od8`_TaaW>26H$ zYR)P$C;5`^czB&c98|D3#$!d<5`PGN{muY)3!AC$Ku=>eybU&@ecllybF1j_3-&|n z;1|(%*tKWY-+?7@xIDVJu_7mrD6o}QPAn^SNlJ$aXpnBKH9wM5+%rJ=em$3Ed<%d_ z;OHpVdQM@DubZW9v|f4AK)G&_!_Zo76nr==^MWJSR-sQ>%&xWeD*LRt#5=6^+4c`E zscTtrTX6c5M}Z2&ciqRA1C@p`)?;{5S)zUS*z&)6PD&n2ImR!lKi@h{RXj$BZ< zRDEpSqw7)*?;FczrJQYo(@3n}dcLkWR#E7ELXPw8c~*1}<9cFAcN&*eRthPcd7T$hwO6gO$^@pY-5 zN7r%CP}QGhkOnJe!*=&P_N=BL=6~ z&zwH&M=P+;-T+@ZKynNGZqR7wA(JPa+Z)5ww?qeD4$*;{Re}oOUm>hO&;NumK0;3S znc(&1;%=dpy^wh$bS+ttkII~=VMY}%SjS8!d0|~eWSx(52=N)TMxjIq&EbG$Fm_Ir z{d?G~?L-;!z;g=hkQu^q4$aUj0d?x&M&!Cf;(>9ZyTj z9gW~HRWhnXCBW1a%OCuWQ3UT~v>ug-iF{g1iT zl-vf{iT(Xc>Ks!sBmO=-&we*3%PxBvsKE(%$cw_oVJ6C%H*k$|w4o04&r5Ru{Gp%9UVbOhXCCO&;7tWbn(ouj zVa4Z=R!M02P%n-3GUBb_gXJm3In(dQNZ09R(jHW74n<0r*G$wq7Sx;9917&1oS5gu z1o?bC42_6`>wts-8GdRw>&b)V`%~Tn-_q$+#l)=`abJkI)p?X_xm+%rT&`hW)dil# zXJWSRfHWHx1f%6JmVO~q!oDpO2!_;6SP8)!73}pvhcy3RKi(!@$6@KzHCK+W?H?|& z8znvq-AgKQliYeQBbCVL^2?*^aJgk!#WFR)}I-J z-=Y+wW&Ztg-*A5p?|EY!nqrbV*4bjc(ZzLGjnRMTc!@{BS(d_P@l}ZtZwn2};wb(w z&mwxp`m$J2!Z{g}-dTn*uzWDb@*GxJ6o$f*UYe>n*%gH~ALq-l>?s8X$(5CIX?`=* zCKPtKJg^(ZJg9&luSkxOG?b3>g`>r*k0#aSVRNtMGe;&%wK zR}OLGP#*A?<2Y9y?de!b`Ttq|HtyfP>B{KaOY*n)p>KjCbvgO`qB-!O{6&!S6ddQ5 z4Zruu?esTrz@o(gCoFgZD5hRt#INzms0(fkM-)UO3 zPs*|inQtgaCQK>l6$ULzvBoeHX`GavL!4{h1o@j={sv?%d?PNNb%(iF37qCrDd)97 z^17-3S3BRJ>?{x#ypEvz;d9xMNO@;o14IOEVm5VEQJEOgSsxg`T*v<_a)%jirb-6AM|SFldc2lx7bPR zh+=^E!^Y_katX_%Kg##tNOQY;E2ut;SCcN6slrPCpxI zkIRS#9xGX4*5RDY=wV>_q)sQx%1E12x^Ce9#6#PLyTIn^&B);2M{a(4jpNO*so_ z`#Ti=mb`;rJ4-=C;Fjy@Gnuh^$=qs8(Clt;SzF5yNSuV&F2Gu)XOWn z<&QioCF$9nr>ms9Cs`>36 z?erxLj5+Z<-{pj-n9_neiOF3OWo{~mrc@~K-hc`_s>t)R@-w`S@hOFgk1vV(!5<3T zFkmhh>RSB_^a&&FdQS(=FYQ|oO@W4rm3s>Gl?bj&sW={q1>SiTyFp~xjZ#z+V?>Q` zakvCy7CfcdeHnmMkJRV?tu|w?t4-Qk5?)EC3`q`r(TUf`lOTt1X*%)jLt(**yKm@}R| zaV<^K@1-;nhT_%@#ZCIRxVcR+jv>lGd4D{iy6)G**QH0Y0ZNa`qlNFhEryqAP* zvaVG;rJv4p>E#_KQ^)Nv5d{Ff>eEZSk=+>z>>k8QDMz1+ofZ?p=o503kU9g44x^D3 z>mWm*Q~IK*+QwCot%m|D2K7_0QsN6B>(T29FtdjO89`7j;?M|Y#dU~7?WAs;+kH%a z;|{^!SV^=Un3YL)dw6@YT@U=$iv#K=nt?-skwKIk{B~VD#lL$fzP52pNtxWbTMjKa z9HG%@d&a-DQfE_q`CX6bZ((-MFQ-xQ?p3R>z?DGt)YC2}wwT>{AEVDL1W;Nz>doa~ zG=LxU4^Tbf^$P!~Z_)})pyz)KwPl2k6&>S;`NPy0P%t608)iG?GBIW#gv;Y*^1qdc zF<~{6Jkuoy7P|8-= zyUC@b@+B9>pnPPfI!uGq-&9U$3P?ri2_7BV^xz571doK_;CYJPT?F_=s4Sq5W1&Ene32f{)&bB4_#q>{dIGwUpx6733r~TITF%%9LFQ z1Fty5SV>+7Is9tl+9*d<5o@>`GnW;5URHRBWsJ$C(56pk#mgc6Qf;#whjc(N=iNLz z&mkU}v+QQXX7$C+Mb15lsV>00hl})+t+)zt6&aWt7kVd^Oupk?>A?MyieZbg@LlPi zTaZ39aD=G}Xs1}GYMpJ+_eJTvxg@$OW^qPFdROTMu zDP>r7MWbe?+>tuxB15<$e2sRfKeLqdki-)yPWLR}IU7-O(-ptY`CmV`567tFIiB=4Ne7|G1HERn8v|XXSVvs3 z3Z(N1Ain5KB!!5AVvrEd*@3g|3bXS#)>ydI!LNk!`B2nWc zlRNt7x?QhxCFhN@Q$G&Zi^@SZ0#*4b%UEcIVKzitFf9~Ddt_wE$k|EIg+$LyW%cN} zsgM>zoP8v?nNK(mWeZm+DOQ zmuZRG0OfHvPAaK))f{5X^L?>hF+5Wz9DKpazsibM=~;MX7-3eP{Q@J9mCvWZM{|@1 z2;)_`e?p~d59}aw@imENh_{-M-M-rRI8bX0qchQ?WK1L71gnQHi*xafx@dbN6}Jz-0aSk^101_eg#0-WW`^%$ZD zB~T2DJxXc^(u^}Y)$0}kAcQFw7eqYdxve3cgbNI-+OE~ zbd+0Z)j5-t*VKm^lpe_lM(_ zxG;ZU^q06|n=VDT)I@v?1zVnT^gAuji)0Z>}jOp8;5+{UpKH=g~#r1xe_s)#sc}y zbgl8J{uiz^^l!Wpm9_Nq_h2b8r5HGLRhPgus@&iYtk#)RT<*N&d|x_{zDHv8?}JNn z2NoY@>x2ue32DEy+}Y_22Ywp(;u2RtGGUY;3$bs0UlLxr7*x#;2fn6nIqcql236U! zXR2H3ZD0GGX^<>KGI4*1v&Yy!gl@J#r$AfTr+%64sb8imR;|63ZsT?7)*{_!kZzk_ zHPlY;_g&vkGM$4*QhQ;&_l#ba<5s1VcJl0@E@m#UV_EWXhnX*%#*hd5*Z=!5ArAh3 z856$2|GO~(97)-S4b@F-w3L*U*Me6qB(F>u$q|mlzbYJrz5wht{x^P=FreIjL#66J z6SwO?H6$zfa(nklzvNlupJz1>*+2*=3p#zpc*jw*|q+)LO(hBP76B4x_+H&b|e%i*{aaOod zZp&MV)0pn$mzqf`(Zb8WZX-j21++6j)*a$1X^EoGf+CUd&CW)|^YtE>@A znk-9QrpFlbr@o!Gvu9IesesjR+K;!;oB7+g1YcJ7@;K;-win!tv_; z;Nk`*>(5@&cq}qR-tO^J{I9*o{gir}_gVDA$8tYRy{;e72hiYPT6EBH7BaMr@g3D3 zAp`Q2@fqWvhh4I=TmkA#W@NjBoJ6KC=gQYnZ-ZmIm zUq;GM106q-3DxzbS@ziYbK$^eVfbtKmCmkiru-t`byC_qbS#n>{`AIg~O*%rXL5w;iqxeieZ#bjT1~D$r*|NGc0@~!vo$XLnCt8 z3Y~_Th)1@Ab@crZ+1{&)L5Sh>2Q;VlT>0$nD^ zs4s`rO=_TzP>Qr_oHCL23{+OK=aU*o+`-;(^IdetB#4Ov&Za4H-hXvJjIs)=pr6#e ztKxSkX-=5AF#ya@z5T$f)$lU}Pkr%M{6%tEl68!6o15>fVpHxame*wTUJD;%&uw7D znFAL#kbIclfqu3T{Y0Mk)DAxn%PJv9D%|%No72{?Z}tAi(Ca=yJQ0k@EhA|P;`c#8 zd^?Ex6sl)iQNzt))?_LbOfe5LCdb3rh2n|qPK4ZExqQQEL%$Vi6V~qo2CC6VA>;(h z1Ij4|+RMN*2G`OyQ$Empe0<36a~Azx1zUs8$IF^r%NWejg7|dM;sH;Er@O4jQ#|D3 zPS$xeW<5;L)YfXWwHkA;e%0%e($Xv`tuHo|!3!$=VkY)df53O?`;sPKfHvo5DHF1} z9bq-*Pa(HMF1H)`60USnN&Vx5h_Vf;&hTyr{7{)T=Jzy#i)B$!MO zhXc*Ep~?M|CBzj?NONT62Lh_xq}`0u1;bb+9*JU*aC#6H%|> zcg32L7+UG%GWgGAqt9?@vg=o0Tz#;{v=J@culC&F{>$pWOPcYxrnK?=nXgnVH07g1 zbGzTf>c|~3SH4nt@nOcebg5y@(uW1}92tv6!A~nHW>{0%QbB~~X2u+^ATH`JTSguq z_t@;dgE-Z>6)o|Hu<7^9J?6?KO#+Zcp&^2El!rvjszBh`3+n~aJ0v>MjK?MCe_qc2 z<3T$-)-!tj!}SkiHJ6>}l$r(cw*H~eBPqsbeBT+bDsYA~9rxerXu|bZjQ2_NiEbtV zYdFG51XD9vv4O9hlkJ-Y!_sA^Bwcz=aiXifD~@F|g|pG<^Kjt6V37wQ7vRdrjF$tw z|J-+^8B^tOz;YN4w`)*O;gI4f*knYW_CZ&b_PVdGW3o2;Xx`kZ;!azye4YPSe{%7t z^7!(6QOm}c;!Czt)GA}p9?8TVX8i+is=*)nLKB+eezxqUR3l>~GG3PW1u@+Jy&o-R zx!+IgXQCyXCSvi&L%A^`r_?samH=H6Bmckpi<*Y1@#rAwj;MhA-+oMmRwYWMH_*k) z7NAufp*NySN;ePox*B`(x@6CjhKJCSwcxh*u8Z~1`5oqlig4gDc={$A+bM(Hexk%H z{?&+^*BCR$yiR~$q8H_OzZ;m>w0s@O(ej|DU>(%kS0L^agS~Q`ZaEJ29EU};WjI$` zoMyieWT))1@n^r447d8aD$^S5ODA+ApFSAzGqHR{& zG1s=-4%|tG8Q;x1NMoL9p)x^3{krE=XvPn}Plaau@H1)5N1mYBs94ZmTbT$1*p%S!T=% zmf3!oWp?8F6Rtd*fs8@Br^BwfPfqbrFch%%)0yYafed*5iqxZ^H|ow-$gb%;$QsS} zRITEG8_jes(7SQE)Oz&}Bfbhu99mV6unVH%_@L0u2e~VAFI&et*ta_w?EJlDLQmCd zuJbNqStl#Zy}T)H?&Uuu9)@R>lFR?OVnwH*nS1$fnv%;49y`yZ>he1^YzO}luhr#W zUXV``L~S#jPgU79Ko=j261w`mo?9Ky*dFSbG5gk{xtAB+X}kQc@%bQE@Zr_DBlpJ$ zom?RkOe}mpD2#kDrtmUfIK{ySN7f`?$VIG09g}BIrdTTxiyMkH<$sEmDaR_ha`RGz z&ZRa;)liF!p9Aj@8`z+t=XbFR)K$@0kk0k2UZBqPbS{`|=-_&)RzBZ(r{SXp<^E)M zIH2ucDeKs*u^o%?Kec0@D{l6E)3(`0b#%aE+#cJ+7K{t@ zIa%>jxF|WCvg4dfki)SZd*GW9^AzZR#uk<#Kv&Ws*8`Q~^NM9CdsY7qY2rNc_!6!n zT@m4}d+&YnPtPCNA!S*3XwGnFtyfOPU-Bz}*pp>p@c%{&U%CG<*{$E|3kBNX^DM(z z<|%aSk&u?k3U%-eUV>{?+!k;Uz|3Tj6v<Mmqv6+h#~Pj)de?w((G_#9 z3vnax*^sB4_S|kw#qC4iRNfs@rXJp7<+Nifa$#ei0X@9uVMTwVrOrc`d09Xqx>0Xh zrXDKU?cFQiq!QoW{otE(yR{X`h?A*b3c075p&7w|_DaS~zP|fE-h@{QLzIlXmt|2I zOv@rQzP)??PzrO9LSlvV9Z)h2J>Rhzre&HI!N41C_G3Q_StQLPq}7CT0C=BJ=G?z* zo-ApMc!pB+e04u~)o&Yvy*-gP)wXT? zG-K_zz^69R6fhdX+ypvpjjQA*E$d+G7f2Jtacfy79~X2~ncv_la($4&b}$nz`vpTN z&_Js!U%87YXj_`eiDeu;HO}sBMtzINZ-Zf`}0jH7v@17bOKVicY^CF47uS7ZX=1@API|+%3=-|& zTvK5B6+lJ7E)?s699r>{)TPRHz1*F+0F?>SZkg8phwyj)kKtP*;UkDn1Cwb5H!xW# zpHp1Jvl&WVI~2BYEjQB}kC~!5r);R?pU0(`^1KV*`gn@g0EzG*P93}21} zdC@;G5Xc+QHN91ey^45vhrN9O)_cSvnU*m@nKmP{l>fwKkR?o zky|ol&Xl?E%xGsP?8VIZ8+h~y151#x&|Zu6)=I1eds5h_Fs9!EuZhXV9+%v zD^*+|oTJ<(bNP9t;q+;IXUsjoX%}$+r)>3*2$VtAa=rm6Rq=YzMn2Akc%-lascrZG z=R?S?iZQqNBD*exD8SonG6kvSH1jKb=jrLfnz=+xjmME&}RPp|(C zKb+bxCAI!bNn>GLKic1bjxlUya0y!2wdkRRZFx|B`K?L5l$wtI9A5R)mDzX)cY(BxsLfa#Abp_l!kf$Vk`t22W^;GV~hl zDXH(s%D0Nfn!$~8^*08fTL`*fXq=(VVrD~k(8PA0;*y}p92Rbblq}F@HI#!k?+xWk zxeRN#t72D0d__kCtyAAcdkZqM`Ybt&BgEtEx|JslNs-&>43)u;*=xmj}Ig#rWM)hE~z}4ll2Ke2doYTerie@Gf2l z`AWq?DciDV7D8Ak1#t7O@RST_+mA%aH{1cETkN#o2))qaXZOMP8CdJP?Mh0Vtc;fJ0kosY#&E0r=8%{~C zPWPPZ(hK^2p?j~@P_W0k&zhw11bYS)!L+e+FUQ@%Yc@5+b!x5S`ZtC&!MNTnHs#ry zQl7T$YGEgE6JCSvKHtd}U=<1*?;cSR)aDAEJXYp$p_gaQy{svTI{QYa5cl-VU8Kby z2R}b?&vgPk=dy-zH?J~0jsCuWFkRi|lsC`!GoV;m!Ie!LPy;M$j@z_%P3Rndwf|?K)6n@mfdhVqlmvJm5u2Zf0ZKp~( z8mD6~%O%wgVm2G`Q3G#Rd5<0DB{nq?zd2|r1bool&0;&*@j|CiIQHzQagAzzk^+7e z4QJ#HKFEc!H^NOo36*T&M!>sXlJJlr_31H?Z-*r1)TcfRL?z&%Fr9I!w!Av z@o|kT`~ondQeqFV;+&A;(7lonjHx+wHHNRQa@3rvVoU`q9hIl9vWYCl^uDnRYzy+2 zFhVxJk_CUzHg2zhha6briF|>3Tg}OnV88LYpH~-xJu7CPkN;6S~x_*}da%wCSMxVr8ehzQ$ZpUy~ZWyrO>H!HSFPIxFg32c6q% z>Z(q|6Z?C(%C;@vSXREg)U@4PUAFz;nzHSw(Vc7Rx0~12<7xTYi`x(4!n?J*;IVl# zu5l9{baOY+>Yx2za^aydbS)>Ox=K!U6;fR-r@9)c;zFvcDOK~si4#uyZ$m8wlfymI zR3|@c@GO{~l%J#V%$v5#&#`z`m^NUSYr^*j{Ays{TM(BwmCD~^@Lgr9ke`)!)|i(2 z6Y+g}<$i|Eo$LQKo;j1_=kE!oCGv9=!X}y)%FhZs>rHcies3_%#yMn+o6>&4R3JZ7 zn0nK#@-vmG%5<|o+8t|L>dwWT1A3skQQJgvIyGcZ&tQ*3Qf3M31dYAOlke#c^g|w{ zcWYW`CqNRa$T^t0u?JZ3vhJ3+?rr+@nEZjt*bb<65~mH?rqw|apD@_2rBF;I8W!qwV^|v z`gLWX_j*__^umVayD@nlE%Xs+y_7eY?#51|*@9RPqx@IA*h{2$qXt?dbYfxWa05K$ zXn6`xYhwK%Cq5FQbfVz9h#_6Tp^(Z}nVO11m2#9E)nwLXjO;(729y!Vh{B)H0N2an)8d)5OFH6x7z_U>~Aepro*Zd|PcDhzyX__=Jhu(+UMINzKd4XGB=Q$erJ zozlWI5O;Uavex|fw^a@9S(NK`8{Za?a~n0d`LX*wr@+nQcwO$v#oKJE_IK{wFs3_j zOPDcLua@Pg=|Mkl7aRYx=8Kvm4KLYXWy!pMHBLFo`uD)iS`ij>DOK8PmlL@ZBP}Lv;;TyB{lF z*3Nm=+1-H)Z@Xtz*RXL~b~n6cqdd@(T!J^h_Wj!G#o2{> zZE@#`_Hg1iuRCxu1lnUDx`qBw1l=R(XZ3x4H{vU6H^DbDrNG_5Tk2ktM_n&+$9eHOJ?$zyIT)h$KzYl-qXW-eVy5=NWW1mgwwbdG% zB7ICUQ<7htdW_5cP=~cSXa$%eLm{KQ1+~+g-mAT}iQ4?;(0gcYtp0JntwU|7T>M68 zj@Kks4bu!?7~`zMNih%H2UAn)B{qj2!(-mR8#Xr4g*|>1?EHAU0Q99FDw5EjUj!Lf ztEbSF;(EfSv}?Uum$QlOQY&7w#kSw&nm149x`BHx?Td+p zjA?qc>0!)Y%?fDu=h&St9rn2o^iSVDw(z!USm3%@z33-K$rG7J5lA+ zWb37PJ!UPOz*oD0VU+y|a@x?P!B>S(ldG2!^&C#+$wKmpiYU}9=Ko>r&jX{X&OUJb z-np}7vP~8sWSxb;Bw?8V*2tp6Ot=gQ%3`%{Z3Ac>ioQ;Q+JUMJL}bEJBSBvvEGL0EG@gb9xWy{Lp#^pbxxa8&TM9(li zDcn>k3;rZogB9)m2ICO)0Y<=j=y1oGFWPrKswf@P_35LEiO~Eut@9U*O_|OZEDxEb zY-R`YQa%LxSWL=Pn~UtcYHJcXapNw?IdOmv8)P=S=Q;3{(rMdFW4T`b>c!XN^4FvC zS8g*bjBOr~6QDJz9$)Zp*uxloQJ^*>`Oz7+4S8^-1JIgEEm;WbnrvFF(HtkB!IoQ8qy!XNm)*dhM;^CJZdw#Ni ztj3snZjKs|zbQ;>9LbaPiwf9jQSuf30dYcj+(m{Nu?0kbHPG0>h`r*co93z(XO+rx z%nnuvV!glI#mSU<5$szr+iU~AEN*{9d^nt--z%{Cvce5jAhd|!siq5?8k;$Ou$0xi)9}MJ8!nfkc zB(fMb(~CdFZ@>#$Md!lHdmpq7IJsxxMLM5<%p3K-<(;*T_RIwLCt%5g-OuGbl11Rb4jzBJM|o%nX)^(F8T6i zHV4j?-PT>wu)BZns^&mtuTx)dU(~&F_)m5B0pE-ApL+Y;Zq!H9Zg+IQX`j=rcph_H z`-GIYj>>30!tE#8?KkmX`#LawJD`d5jjsuH&*EQ}4CNi5`49No@qQg&k1L0-`S_~0 zS{jbvedh4jP4<_i!tyNM(wU4Hrt&AGT&xHvrQE=)NxEX)jBx{@+;L(kb6kHYV_Y9- zJ9tBg)%g2G9U#F9W$+Mdz}+183M{;#V%}ri&};Ckp5#(GHwbJJI1Nc>aK=xT4QF=!(KDuf0Dg!y zyx?gCO?5)Lp`HGe1e37ZtEi^+jHSPe{5=$xrye1{ZdAs3cyXA(!gs^E$EESLhdhvV zvG(DrvQArFx0>DWxTt_fb6FZkD3|>t6qo-4wb$^cLo%0|=U+8$`72bfgyL9JN?8 z2m|R&3iq7e$GBte+f6N?vDbUCXaZ5Wia`^%AZuC0!^Lk*r{vh=N#fXb*Vis6|qZl{KF$mHk)?O8lHUU#S zA9*n!dz*H4C)@L+W*z*HRJimt6|42N7N5cUlytmCjg^X-+!N#=BTM{Vg;in5sx`Zp zyZd3A@_0uP=%vcuMpKi04B-MrVty-ppc@P}T-D4$Nyq5C?7oArzH|^=YLc=^U|z8C zLS(a@;Cnl)pyjl)J4#UNUqDiXdJW?bP*lQ#veT$F<-2cl?{t6S&ab_#c4zG;wFxLd zQe()2k@>~yACJue@n2z@?KXM74~VHa^}8gGrjgwim0B3-Mt{~zzh;^w7yMCU1u7l! zQq(7=#$R+dNh|Ojeu`lK@C&@*^t<%yAnni+H3a32d8Y3^>WPa7q2HE)erUn-?=h03 zE?^xa%`;fj?Z`Crptbd$cRUKrGFG|xqEf{P3a+4Q$wf|;+r>J(5^%9{=!Z(d+7uK ztE4=RUkX>WKZmgZo3*ft-XxV7e+{aR_*hNSr^XY3CTX8OqdgPeJcOVEHIAF=5$8L3 zJoSsqVss`!V-50tb5#61596U(R2ilf=NHf%zia5!U8_fFl;J4r_Guq=J<&-}K8N=5hyWz`_#_$DJg}yl&ey*oc;=GCW zof@R}%|iQBsIg%s)tAx6MQ4P$q*ebRP&C=vt(-Kui<^`pm&6Rgjy6u{R3^2_xRToR zU08dLPQUVLObAbeyV}`F7rNGXD~+P ztOADb7Z(qfd6fKeNJFOfuqyT37?jsj?{iPX3wM}nP@l8wTO=LT^3UY4gTHo3dRa49i&rAD-MH^ z7?%uwI`d(StPqE8B&`Su?h4I|@q?Cjn!7YN-WcYuTnjEhvKKZV1Iv9`Sj}iwQCvMv z;HBU_KDOE3tFPN1cy`5N$0u8tIr6tCBMQ?~_6sL>t$23Dc6%g9@_DZsmKEwM_egIn zf_z%{i0I_Pfwl^-2ffA@|ienf^xUKsm|Bfg%x}k-{Mb z_Su;RaGcP)3@mr)x@dMiE#2l{?s?HebN~3`6#ET8OBAn*N$4YyR@>nf6=s8FUCYG! zuvuE_d8f~&fX8WA{rL!et?y8SN4x5+Oj=D*hO%AXVTLu4yIq4J>?Yf3H<`=d3E7KH z_HfWWZxhbY7ULUA!1~oAT^6$j`^DFXE{jbO1EkH28BK;harKZE@E5VpNn#K^1HB0O z`~5@I6D(4mg00rL_#Ldq6bwOf^71RSlra21WjeR$iN_fBVGu;x#onknc<2s{0|9AAo3Epz~m| znRdV*+R@xb_>3UVm!d=&oMq9R_Uh9s;G5Z^IDJ%~Rsnl87#9_?)zN;j4zrViWp57N z)9$veyz+dHbtU|J{mKei&=PpS=E+}03U+M`a!Xc4YyLnF? z(zC^?FgGyXp5Mtr+xvsS3O_qd3oSj8#aF?)-cBPAh)#)okoy68n!9ui6o9)U+2w9K z3Ysw)Yi|+fsAbGb{&<~==L<$jY&z@|hh4Sj*Rl6W+t!dEbR6${S5b=5bt`xU8t^F+jH^FWP zJGIyxi1d-XtNBbodFiC$ar_HDiW1bUDPYU6E4r|AuznW8nQX5LXS3`y>?zT_VY%g-K*n>$Gif}bRfie8d$SnskTiCNx~cFP}{#7w7UskaMqYO243DZ zSJ!h%lf9_BRZ5cUnR}vDO8zhP+*P!V>N#hVJ*iu*VtXT{>(LODR4p!=Nb#%Bk7?e z_L0{dR+t9FC5Jg&7amsPx7CAf8g@2RXLTMZ#O8D`X_fwDr>7`!#Rn@dK_;_ zc(daz*^09g!YRQt>ruuF4|a+YMKIm!WhC(9CfBM_C&!?*ZKG_ZvR`~E)_7=d{|gVU z;K%t$ZtyhLo`tZ5IT7)u4AKe8LGTzly)6*Q>B&;p;S`i}Z~*bTM9uyXzJdcw5tZFX!? z^3U0sH5T{_jf>v+@`hJHJ(ux2>=lq)@IoercsnG^>TMVc8}`|Vb$@&gc5uX7`Byx_ zGkOm8CtEi`elgy+DZxuQ7-%UN1s-ZeWlkm0!5ZM46;`IHQE~yJK4Y|^7$zqh8WM{;#D+$0^HFPPgOI^@0)`v$gH2qp9CAJJP~@@Td{l3T}^KLj3dw^8jj zE>hE}8x|Tff<6D=o2-$6P{;LliJO8&2UYu;5+P= z>+%L>I%tA9)eh+0PBpJSe#xPS79K}dlOS#T06JwwrC+jf!L`l{h&>NZ{eEP(e zyYl4}v?CyTbtLZ$2+G#n(*KMbauvR6 zFJTNC0qLbI_$2kxAJEEU2v5i}rvjtkl?UL7TS@HREoS;fPU+PDAgp>R0 zBhd6CqseWoMvX?r(uZrL2c4d3f6=Z!nY`tLt*U9&j?BC!yW%8ConH?;&Z2kWA>3`1 z{xXZ!G{>6iT1Uf&-ui~*bp-E9*LLXxEBrH_B5%BT{s)aVYX z^P$AQL2=WOh?ossfyd1W%Lc3kb`3b%_sm-QhY~Dpy zX7J|qZ%Dny)RL*#1?t$>ys;+1Hs%> z<&E(E%ua0zGzaM4cBvn2ejEAhEvLMi>`K`?bZ$`!^hU(Rkp!$_;=^w?B9;;ouU$q9&Z50| zyA=9|(G>c`XaLV9@ufwwOwHw)rm;4_4cyUve2J^0eVfq2-u5Jng<(slRiuIg>le!h)!<$@&8RL zjjgLkRBBI}8tKX}!AC&$DLiE`&tRu&Y6uWN>wKKGBw<7dbmnEq1XY$O=_`zV+G)bJ zDroiJz(v(>ro#ho4!D=7$E}R;s)T=2zp~z$ zw+tRI@^Y8K?gmq;{lvhF;tkqLcaT|FVwIYMIRIlkBH>>DI2`dQ}XUT_6hoqxO+R5W(iykWTu<%Z*im3TwE z&N%UXm8M=12Ph`P$_(^aTbwj=UwV+N4_j@JtZI*&wJVd|QSre}aQlYO;%VetAd^}@ zxYTDciQ-=d@5f5fbwR;`j&L27Mp-vwXED~wnvXy1o`>DRLZWvxeEQ#>YE>Uhe=q%S z>F+%Qo8zfHdhG_>ZNMvEvY(9z2vWz9B0(|XWiDo4LRGzbsf z%~&%`hShT~GQ~BkZN0TdJk7n)5s38kRyhvXb*Im*eo6joSd;kkH0Jau-t-vkQx@J~ zzhlnsM=Dk-o?^E};pwYlWmG&K=bG7Fik$}~c!7Uwq|uZZQH!kXvg*1nX)$O)9d^36SU&`fK)dbzN4%0-k9?$YdM~_oLdL?w@tMe5 z(RJGMfkyvvqek)ZX-|Vj_i?5G`ypN3GT(vDwYYxBOg3GF;T9FJ7yhyic zx|HBngAN8m~4`mj}q_R>~Is$W*vgQ&F*I1UJvar{}I>YTv8uV z_Qp!N&+d}bZybaciTSwOQOkiho50Td;>%Yr^CWaFme;1kgW7Hn=QtDCX+Q7QcA8fM z%P6#1{g%}#JHK$7p^HIOMk{O+vAh>&WG_O-|9#JmczQ0bTb=A_&drLb`l?oEMU;Kb zxlCjfI8qhFd6i>tj#qnho~($XFDt?biX-iPrrW5_1BMAma1?z1FH`b;p9U&Wv=K*FOA?E1FF3OH9PTU0Z#cS&MOi# z>EB(;u;c2sngs*59`~<9L|dCnzX&qLpsW{ByaUp5P^06@A?+>ik}ivb_(F8)IOE^I zvlv}l4%lCiXvIq_k3l<-{IAltvl3yyv<$D5UY^_@$5(kSQ$A7!0N3Y;YHK!Y; zMU2ItUpB%Gqj9Q$?a-vvjkJR*%kE0u z3jJS^HCWQS!s3JQfGA>hI1o$RCk}yX7_ekeix*(`sE~W7SG2rE`+4Hrmt$=qzWnL- zK5^|~#?*rT_DY)!L=R;76~OCT4s*sxh^&@t;WN}aHOrp@8H|b!lHwSJlSHw5yY$nk z3EH72_>_OU^rv!2NDb^YQmNpWnz3Rjl>KLFheY_M#=38v`Y&+GNRnC-KMYIaqmn3o z7^8ZK;?14fw)c&oU*ZajCdgiwfwfZ%UNX)!^kB_%6cQg1Hk)8q;-u69?j_-l#M@rO zNok*Taei}v3&Khs_Ri1+sj2r;k5FqVmbLAq)VS!RwB2@6+Mz!wJ!?=wrY_l*Wn-rm zb*gGAYu42qt4Wb{x~+04l){S?k0XT-DYpFoO`%7N_Tv0DENWs2%VLQgf|i#=CQd#U zK|u(H+#kO7#}u<*@?je7D#)|rIsDVM4T%rI%7oSy5u1;Aa~W_uD%xy;RQ~orHXjk! zVYRooSGo$eq5+L6#Q8c{O-eI7Py#E5-f4seldIpq(yT zy%d@kGJd}z2)PLV`O;SPe?h_5yljAs8etV>nqdTw9FmhSFZ#Hc~HRu0+PKao=h!(nkYWC_kfQd$f85dMzC%s3T4 zoc`5LO9k#+IrJR-}{?84G#n9F- zwX)YTWkMH0Q0kcIC!P)@$80!Ri7U^(bmnN&r7Y~g<-znR2tZ> z0h|%q`+D(rkalE@h^vXY4B22RzeheLcLHaW)~v!w)ckH{Qe~F~z5fO%zZ;-e9f97q z`Tv7nbwVSZG@-*{SJ(y%wO`1PsSGP77X|^_|Hvb!Q#pQo-TyD0>VL|0bq{MbP>mB( zO7QOns~LIzJmYidv(aIGHCsC#HFVS(S0}YEt(7_^xW?BS_`_IHRs3am=b>klbXkr6f>b!;^4XQaB)`su5eT}`((az;gWY?2ACUh;^8n|Nh-t{diVME_ zdhpdDKLM*@ZUs2$B*mG~z>xpKW)lO6C$iH-BYsGH;mD8}Lip+k$yHJB%5wz&G{X{7 zBky$HNLo;Asikw5UF_e1$Gs8EGlgdzSnh3FhRo6*46`k91nKy!QD~{Da^K zGi5g6n0JGnY%I<_UFAR4W8j#uVrVi>ww|^*E~cbxw=KLl>ZW~xw<0mgoRSvF`A8dK z2Jy$SbFSs|r5tGHU8_8?bFSj_z8;09ta8t#ByMluP$V{#7RjHMf_0qid9>KGPfr}1 z(i5MiJkf%k;Hy0fZer!QT*pO?tM?=(N zLzwG%+SX{JR&$O-nf^oz^kY+~Ola!O@y%7jYpUt=is5p7!{wG#?uPHf=D=`@48#{5 z7g@&(_OwJD%atcyNR-Q#Ri4SCytajEU?X)YJT2Dnd(hrLhU&rH9o-H~sr+w4f4ab& z8w}xOS$wj+-p-z^o2%`9`;tOgbBW_v!?S!L;<>vzGHGY zrNX<<$Op~#?A6n;FG6v?qBr)VQ-VYJ<`Ypx=!>9w6cPkjhD;+^`C zF$0b|t^rUVl#pT?;>YG(f2feJPEdGxu-s45K)y z4&FFdd7}N2BF%M4$*~p8nIWVV}W0Hlr^4FV#nq8eY2H|m)WrC7Quj=t| z+;Q+0guZYhE{nKRKWQF}x%_h`Y-AlJu}u zD||ehR)Mq`l=g_`g|JK2<5l0BKWA!=>vq?4o_kk2t;s%~7lRcj?XB?B(j(R^oR_8s zpRIa!KGXD9Xa(Tx#8f2I#U2ncl?I-yPio+C%`VsfD_N4N5B1+x{X_i|b$?ne-`-2* z2jzHYgPIp&u0P;hdspC1f3N3&|0U?N_d(Jsxr>8^eQxTy>b3KkMwH4aOdMY%TpR24 zJnGEg&BD1D)o>-%u%^g7S}>?zf>iF`HT_!3%SDoX6OKCd4C zacWO4tKOF^%$ECM?d8?4|4{Z^c&DMVH+hwE*{5)xmt*Ci7nN&ucunv!WbYk^a&DB% zS$p};*D2S#)cWB%l;YnF!~br4oqG6A^suR1EA$TjP)erU!k=|%~GK!Ilmx zwpU@sIj7mDSvmMKyWEP|C%Z34JKD>hWnS5`*&WHBqmROZNQ1#?z@!CsZ1p! z;rTs0Tap+<^3So4lv`Uyt+k%kDERzS*TVW9v$#lb$o01ku(o9Q_@Ulkd-=83Sj?`4 z^0#MTRmbU{Sj}w5h;o?utaIac2QM(}=ON7wtuS{`bD*4GIG{l4b(H#$xte(fF_%w+ z6@7&%2jfp1DiTU%sIR@e?zL25iY%+X_VRCEy9666H(dVBYg*$NXOZytA)Ro0{DH5j z=KvMVz;`eMvr*@FtaoZYMK2ps65)XbgOFUSZbJu*OE<@6kdHAw2-3+)_1*ig~H(B@B1PK?A z#y#6xKb((lIG=Y8lMFw6a2G3?pT58t7UFK(#u#qFv!{YF*uasvAK&OC_-HF~^VueB z9In|YSPQ9c_YLQm+i#PG(1Vwx#1~c*7E+eEYVTWo6IjtYb zhk+fCGVl7~d_D_NJ)XL%9+1UtKH^vIfN^8oU>rG+uH^xLd#1$Yzi!$Ny=<>(}3Qc_ZKDr~*vB3+U! z`K=p%Q$#42k0D!UDDH(P(_Hup`F9s%;tUk`2rS`Ip4v8}@JQ6vZWNx5f(zHK0!+2G zLSYPG3dsx9Ec39!c{%hq)ZyO<+2fT=7JQW}SJb=M{dYq4&CqUku{&SX8GngU@9PP~;uK^S^4q%&hCd(+;j@Qf)ej3(Ot71C1q-{F4FAlvnv6BmCK zpHf|j*8Rdil5(PRFY?F{rXd}TwvvVai#C&lYhjSJOt?|iH32?^-0_$2^~+G1kDb;W zc)zU7`>$Yyo4&=xo8lbm|Ifif=NRE)R0%(C`PKREzlF|9ZZE8LTg%#6%b&YgGprF= zkB2gEWGyAWtRP$75cqRRiTBOZN}+~EF*gD$B@bh4TQ7OZ2^J|jmV>c z&9MGL6nYwDoNYq#x|xvBOM#A1YX+=FWo&Vtm8Ne)co9$tZ^7KmckhR9)z|-IQ`Rno2 z6iwV`MH2Ul;rsN6&b$sWnC%NMGfTz@@gZn|#nw7C!WXf}a6KC{3cIlG8-?bG-js?{ z4Mn2?yw7<oHhD}ZELjaHr3tZEajCh zyOea@Tq$WmrHfgkuUqQ;Y0c6qrOWHfu4$@m^!~D{WWZwU8CkAmNfIhBe#&4YWN0oNUQF2|kb zQ_|ZkL+h9K&xtkcZs3*M5S&O)c*bZ^GPfc;g0kCizaRH^aQ_hD=Xkygf#&C8gcJDo zEkap|lDWNuWoG04GlW{i*@gRh{Cf;{I!)6;W+|6fK3~AM%u^PsKS^>Dy;vZmLa)T# z@hUvrnRu0xz9>O0jZ*f7m~rH*@gt_Qbu;h}-h{fY1NFCK-dDhd=e&vob0AApDEutk;#cf^ zsy$^Qd|9I8cS5PAsh~V&MXXg+vKeipk{?6K?;~aFm6S8W9;93$r<{P4dy#THQWiyu zhf{uz_*<^TH-+7PMf37@HA*T({4Jrvsx0`Q;H-&q{({)|U5T9xdzgym>UI{fM8dWWYgZuT0@C0|I@N+-A_`W-ceRsz zNmKbFW&a!b9Y z|GFQ=v0oMEgdC?4|67LRsO5aDSH(Fh$2o@oClRvXhhwXx!3my*rCQ}(74sFuq?LLA z@zN*CW0iM;_CUQ|d8@ZV5)r=Z8Wjf^^UlClJ9}DLrVpwoWp&$}B{csdH#lWIN60*0 zk2XFI8Y^zS_uS`qDPZG>o%UtuwZd}nwekf^eEC=faftHw{2crW^A3A**Hok}5Plsg zm-Dy`FSKX7rZ~@p44x?q^Mxhxt&*Op@#G6P;wgh^!IKkDnanvnIpPzlw@O(|o(m_2 zDw&WCQec^ zGXSr}2)82Khwv=IZUi^*(R~P)@SK5of5g2D;bVl+c*mOVvFDT3d#3Zt-JogPQWkI? zv)kcW?ymRjaUb`bcQ36?)?tPl&9(W$rdUfYqdQlt1;3Eayg0$$p1c>lxwf<`>BbjO z%27O}wSqz~A1o;#xZf9BUf{lk(cN~-e!SBeIwzQ6`|`sV$>!kL1!Jq&eM#mNW4^F4 zR){`CG$+c%G3p{gfX^zXd ztY(=7^~wh);Bm>qFgn<;WJ>XcWJ{>7-yYtLvIy_foTRy^Z%e;Y?~(QklxeW3rouRiR=G?-Ig_Gge`P?i?acP~TImcR0ggCTiZCl}j zy5eH@vf`KA_qb;if8|!`ife0XwSbe7arzo?*XlEH)#(@ew&70NmuZkh2?;ywOZX5wHdnQb-B7}Iz#R5+C6n?#xl&l-@8q9U)Pye-LooRcz>v673Sb7 zy*v^nn?mq*eug%XUqYHUwW#$y!?UKQmeZ*bkLK=itR7lfic=xni@n&V@_bK|)BFl) zYKPNsI&*Du+Me3vl$zS}wM*-0_Unx1x_se9W!Nw0qp2*WOc{k@Aw;SU00ML-&=trdFj}TK8g|fzQ>Y z8jEYc06g=B3gnY6pTjDIPv71x*F%3O^9m$gBQ*h5aQODr=IWN!I$V3|a?`%3%}p_( zr#hQ6aouABYP!)4>Uv*jAr7T+U}^u#!?sVzoNpRZM1 zaxm-dG;ULZ`2}AF?q-a<7C0aj*`2S(-oFApz4`5_k|OW(+Em?3wcp_EXB1P>@tlmu zQm)i^1Y=S^)&O^Zj&mNZaSukoF|4q<;oAM`?ItdWv%>=G+Lzj0;#rMRZ{ueOs5y=z~cvZ0(OmuSYGcZ>=uZtaD83A-UPp!+Kwfd zA3sBQ5Me9ANSZ@e((I69KON5(X38m;&ZiM?7s4MA^lhV@q;uK~op$Jl^O?whEu>b! z`;d1IChS}2OfX3}fEZ5y-LNaPH=skT`{I>;^k3wgkfvJeB(6=quq;ls{AIj1^jGA4 z0^xfEqS>=1E17Zx_^c9+fY0ah$Hm1GopWcPg?FL0@B7n{c8*+jTy%hsufv~(_(PIn zBemHIYhL$*yTe#6b}5}-hm=S&A^v4(5%RtTp$?%5p{Pw)MQbCwFJF+t?0$_i1*gW9 zGE@kLsVFC*dCqjw`t~l;e1Jgmvy0_e3d9P>2*zLIdouiRoEbak(_6lh#@-;-w<|XSshyA6{LqNyv z5SBa`nbX{Qqy#b2W3X_gQ0`akj+VFo{6*2eiDqMmdy$O&hL z$oFbEMq~SAba#Np&R5|y?2Yn;4`IPWuDeyXU9#~pw9kw7Z9{ks;a!CD2vG!+Rmn_2 zn2tbn4EP0Mw)mQbULN)<$RdbswmT;NDOQehUI0hpI-K3-_^04)N3 zyV0tbaCTIRKbsM6vs}LeWarB;Uapl_uGLI;g7PsT-fz(UJ@N^_zk+9_M_?nR91wUS zd>h)ZBDx5<|4(ckuJdB-Pq>CEelc&u_;*IslP?C-W$bca_sucbqL2?(m znq=WJU--MEd_^(*`~m)Ca@_FSF-i4`a`^cziQ5M(AuVc$MH?&IM7C`hT+_gT(p&!$ z;`TAZU!pbs|Mr(~!;uiAXQMxEfj^Xwdar`qHuiiB_I_4Ya1W|br`NFeyWh`@FOzx2 zDd?F4L$pJKt#4o>(ocB~u^rIrKQ>4h@&Yg<`X5%9+3{Zjt~TUrM1buhZU?8R0<=WjrE1huXtKDE}ON#cmn>KZIukzU!&19VkmF^Tt;pFW3k(r#acCeBtgP zvV_WEp3ttDR){;Xw&x2sOJ<(k1$#ttUcjw8i8FC0U{BihuOp8Rgwu(7jmvU!@P3?R z%NJ%1rS|9)sXa+7w+~dT4gRRZ`NBl01Co=^Nl9`YAq^_8_~VD@E4K^ZRt#76Q6}1Hm`K3o6ZL=1XNAG3~vm#^Ys1j+^X=W>6hX9a8bBn(B)?u9ef(7ZmQ=K5pGAG z@EGdJSUS7*g<2|$V5dEZF|!P?YeA?4FR&ALewvcGfO`h+gok0RLOLsXuEN5P4>7`n zpcRDnv4Gd@kvw4oxKM;U@A?t$To57Lxp;_hXX((@xU+09fjeizN?!R|m3W^0wC zmGP4m(qnWEz(USZka6Y+jwJl(LA|tXgl+R-|NeglZQ%Xq3!@_`G9I!>w4T%0OvT^9 z!6ZCsVM9cP{BtE5>ult^&^F}Jg779nC&I@FUn3;)6~frV59fO^O!>ydAy5;Ed_TwE z&*gkS4O71G-7eEaABVpS4IvNRbR{zmp#(?6bgS`4;@ILK+k zYm46sFC2#=<*+Qx39CsjmQkBYD}ak+;v9j)`7*Rg{m|kbG$7{l5hLG?k*Ux>hg~J? zK@D<3-Jk`3o{FGE{a-@&qW%K3aN&s${m4hC?kU#exTaaThJ(O@)FxoX3H7*VL)UgR z)~UPV+$%HCGPT^6v1kin-b7n6V}yAV&nfsrm^bmJiV@~bJjbJ{J)=3*@S7ARdQr7Wr&dGB-Md6>)NRfMGINOOw?iuWR8k(?oe^0LmCa7l8IKPFzVtF z{dve@0hecAh0)%uC#wG+Mjl% z{T{SmhZd(?X}@l`wJFwd!>v6WW`upf&Jt=*>r;vzY0%n0q8+9aXoqvSb!k6pT?1OD zyV5%Jo#2*R_as`Eiq<`f(U)dOajHk`6PS=YptdbQ>4?&~buiI>)sNbLAI1*pCy^}( z7Iuo*U9eInuM*c|^yLXZiLyK4BMfskaUS{naD0q>mTX9o=C&Fu*X37i#|7@-7^_`f)-S0bDx4ie7l8vFrg z#l&EYaF#+ikCWJ#r~qV=02vrKl5y5QAmROEob?szLUbLC1NIuiEehdL$#C&pZ9_nT zlqaKvQJBs={3~ix>~~?kBD-U^VNVgS)gZ>Ps9Mf@AK*i49mR=>i(_KQfHcJjSeuIh zp+yQ|Dt26phIe<3QU>_HF|iQ%fmUEh8x0IFM#uoA8Mx?KDD!@b*pJ!K5?)riS>FP>Yq=h8XY8@$_i2)ZI{By(zGq^E~NeafY; zLl2|O-y*z-z+zvP)ICbxlf+=RB@1zikY`1Q%6H$Jdjpz@Nv9VM#A;KJdr34^E;C*F zcj#O|0gbhqBG!_Sd{+p+kW$+f!e>$1tHs2u=%=A0$p0w9$5f8fC`)V z(^)&~%oD!p?8AQrb}Ed?C}bc`{r_?d#UncX)@n7K{Ck@uMdK&Fq6VhDaJ8P(hg3Jevp%5;_7_931BiHd2P6en`j^8{i)4}dC_@`s# z$`cym|AfsCRp}=|+khQw%(e(Ts9pXR`b{QbR1EY*GL=#k-rV=RJ*B&(dV=#?`1(;! zV@yv4p0rQzhUD?Y=HOm*AGG&&O6Xje<;HRP5cj+R^t2wrxD+U7UAxX4D_&5&EV*CVhmP-ub}@4 zXncf^{uld3+z;bi=kN~3;KMTm{~8o0(KnbFZ!(>m(KqxB^9}GWh%AD{N|uWQr`%DK z)xfQzUd4L;CUJ^r{!v_&$7%v}Fdk?{$^W%k6mHJ|AsLwBWH_~#H| zgvByOXpa&`ppy*Y$wa@u1380%n2NU@B8=d~xcYsRFaj)0oAVDPX7TI5#oyN1F~d#5 z)FIIOeT+%bq}bU6eXNS^+10bIn#F$m(vvic-wFOD1piQwa|Bn0Z-Sq08VL&E7T+M? zRnIn!%<4JVS>y@*;R;;W43>kJzzQG6uAbG3U5w=qUBz+>Zi~JyV+Rg7E&s1Mb;&v1 zf}C=Y)5|}~iQ84tu17yQ&+QES4(BoK)aH;L`JM=|uIpv|08b~t58n^thrwa|uk;gfp8DBMBa*3PZ>3#g7)X!U{s>>jadA(a?5BPj-{LA7hA$hhamM6^i4?SN3!g7Z1gO zMWpMiudm9fxxPBThB0TkXIBxOk_DdJtMM7WnSiuB_7>&|55ARRTmzQi!lSAr&y&d{lbeGlar;ab18Ucr|k@E zviEgEvWHfV$}eGI)$D|oLl+m(^DCO#7qV>7+jFQdNqNOSU*mt=O| zea)m?&>IViFMjoq5fZu~*{%U&elL>34vLvkqu>euJd}oB${D&HeE&S~2OSs3#^*wEFRQ&0*PFq^ z9vgR{jISdP2JSz>6)LLUZB;a`1p3uM>+iCFM7|VBf1Fxo`8hA|2-_Wf^ zKfV=9DZbI6yhasade2Jlx2m>j_*|hUuG)1*V)WA*NJ@~cTMunHHnR+6wMOvWTH@U4 z$`cMmlF+9!WB7uzkM*v6VIkm`3ywp}C7te7zY~~kVywuy1ehXEXo?(!oz|nVeB`n< z!i;-4l!qrD>OM-@68Zt+zlSeu8U@+aQycQV+10rS`86W})?Xlr%nD2_11Il!f-6Gu zLj+rb5b$0aD@L6s6TDTjU(P4v;?H7aO&C00*t-Q?-%9X-j#rDCzjdzmBs(G3 ziPpH6@YkWX8Ikj$1DDiE?U47iKtj&DI=hOXR}DT$p6~=#5Tdlo`E-;L2^aGpg;J^^ z`A`-wJ%iP2_gpEc?)N@?f=-fDZ(r5!f1?f5<{Pd9ZTb?uC z_J@{Tj>40;XC>MsMzc}cyJ576QJ%}h^V@i)lPZ06zK5CkT`*migH5Y0MSnon1tA|Y zFNqKr{|UObq#;k(124bC=cB$@i}LSApgy7g_-}CEkN?DH#Oex8V=8#}8f#pf0T{Sp z7gl2(?T3{_#Z>pr@N2jlZmxW1o>NDg^ zbLXsN^>2nW3S>W{KeXEuZASl?!4JyWy$eq_`?LL+O*lP?i*->ua=9VQj4wDB7gqvy zv!iP4!!XYP!>YoEO1_VlB&_(!;n0HRGuMMm=YUb1&+U0 zUjxa!s`oKUSi|TVlC^}y9+LxI{j^B7znfZvx@SkVn2Qe$C1mi_W=PbM)&+RZ>@=on z^!zc^V?bvy%SH+N2a}rFrTYAaG3uJcfzzdKle)p(-$kv;=FA_VHcJ8*Bpop2ZR zCCweeSu}r+h8RQeE0*zL&ry$f1p9{8QLqD$2G|FNet`X(L!}r|r6iLI41Z+kF24nJ zItr=ZQ8*<}aBgXSJ$6OQ06s2<#`ul2Qq~x%X(yBBe*)LS>LQ=YKgGM?NC70C3rNbj z(TUP-8A=(aj3ixFPFF^lh%%xHpPaj;^A+d`F=iF7L63QdG|idLzg|!t`s)Qn6*%&@ z&*bg$?1McwXuuGq^MJ5QeJVs_m&P)+>pZ~$Z6z2``>EXoi`1F4_Qu5)i|E6Ep+xrek3b`bLU=n`q9FJfrlnd>4uH)$f6@DX5g%r zLg#NC*j2ff@LWXOlPAoHe$&2$2c#Qc2Bir57BlnSTvfwfbAx$W-TjQ2SN8jV#Tchb z8MeFMG~>#aZwdU~KG6N`v_tmN%AO$cMhSso`g6Yu`B0^K5&v(;$o*(&Fqxho?Uc(OHQWPwx!T`LB^T2yelb zOc`uDA`j$E`8!@ams7{!ffG@x7cx^(4DZs#_Y2C*r)d3 zEWyl|R-Or{!I6)O&!B{s_Tox*=fOaJb)N4P`#0U}wdyHdMC%Mw7qjA{tFl1tWO;p% z)*a`@*|LxwgLRIioma&wiKkU5t04*AN~i9tLeBx#1m~T&KabFg=Ql7vcHsFf+zIwo z7`r^eqTzlZnsYZe_lKWC*sTU6Y{Gu;eG7l6%Rp>}Jd46HW};1K_T~z2fG3tK?1n{X zo3PFML(I=(Gd)_!7XG3t3l<>A;%S!qt}2arraRG=JHQzsznR5DM4N)n_1~P2HNZ=< z&*;U)KdojXT1nfZWw=XPl^OW=ogBt=Urp|!cP_9dtPzG?e&TNB3LA#zSG&MXQW_4d zgHiJgnZID)@M6H3@tuxVrneMo_HZ}>Pb6X@=xGuti;vCg|_w;eO<1T*rAaM9x zqBj{M>Ab@ZeniDe;_0|SxFPz>kWp9@{aeW7%oRS3-4?>xwD3ukRyngjSEz*DBdi?Y zAwWMGd_q?E#Z`Fr`dFcVRCTUP(Oy`ST*ZPGkBhTn1Tj6%k^p_2Atz|@Y=J-GL|^Vg z|5D$N^m`?~(KvWvcnnaVuLFLhKHrNw%|pyVM+447v0i~{S{ALrI-IiZhrW!El)7y? zsFGNeFo%qf>to{W@fi!bhM8XCM<`Fn#qaTV6!U%P8t7?U34qw`k!x_hH8TAsx-W@L z13ag>r&Z^BuL?DI#<#?|eU5twK5)^uVNelRM~}(tXi&-(9*C4xm(3^rX4XV2R!McK zQ`nLnDHsw2K_{u$Zn{x#vsM?L8X26c%MlhtgG%~jcb~K-8E)nc$E)l#5wgi7#i>W_? zfU|hBlKBkxj(@WZBY;O_VhnSkr(r{1`tbZM{-GZrSH8tdC)3b>xe5!;pdP3xkSV^n zI5T=vyUIV=n*y7zW^aPF0d8N1Q3wn=3T<2i`vME0xs&D00v1{o{-G~NMfF&lQ~fjH zog(eV6hB!zPpwLDqG@!cM$3FNd^&k_ZHS(b+fHp6!Pg`Bg4#*#E1RWcl+`NdST9%d zMCXUtV={o7tK%l{$nL^F7NdSCaR091=R5J-foFGHk+bNg6s!*~hYPV@>&(-MvQ@p zurT4aWdj1iBYS&hb7ul+^HZzXvfp*$M8T|shb$dt(brh>(9edh`x%1^_ZQK=-3WE4 za|`Zk(XP)?$A2R1!FvezM#LqnHcGT-5Np3mmgdSAK0m^AX3U11xSzwHZ{JejdI4+X zRD8Pw!QGbROoNs{K5F;bP|9R&aCZ9}{cF}Lu^K~m7cC$ErW-I>gSb>DvXn3y=Vm_0 zQI!pGmekWa&{=!ntt(eZ8`R>t+D~%)lsab~U8zQ`Z&4o9o{tb-rM%i8XAGI8gtdE$ z^ZZ-H$E5o0ME%Yn4tqVxLgYXPVMFUB{}}Kp;JvDw?DZ@ZQZg0_YwAFaWt!a?PNs=5 zk)@9mW3I4fNU`67U1hnPdouE?9a7=UfKrFMwV)l{!0d#TthQ|7QNV}lMKI1oc{K=$ zb~5Iq1!H+#F+2y9S!etskThA-&6cZ6R1wY$TM9LRMF-)NNa*M24^113)A29k5Pc|nu z##K)*_b8k8c(|tX9z~ORHQTg&HPf_bwXUiVUM0s0Yln2$(P-y~LfZLXA)F6st8}m* zHdd$`I)^gfMw#aj-b45Z;U5UDTAIgwa|%IaXfThn4i((=%phZ}w-q4v!U}crorr3U2j8z2DKu|-1Eef@SsAR#k1jHbCXjR%>5gR~jEY*R;>I8zB9QXa) zvk79~Z-3wSx_*Y(2nWOinrdCrIXxeuRvPy@SZc&zcg=VkZiLKh{MG&n!m*TREyQ)gncl0kI=#^#;;$79OZN!RIfJJXVJY4vYqht4y?d> z`97R<3Lp);9_27X@6rtE*=+pg24_P)u>)sX3*KJm`c}FQPoX_%XQ3;m*~ZqLP$C=# z`Fe$IT-;WOcU=S1Tt@jtoQ-eC7X_|QB+@Di^&K3!#>F=!%V!3@ktQR?Uc{g@^IY#p zJl;P%BDUqa`G#CqvL{)7Zy*PjV!wfgRXyTNa2=4S&)yiwu9)DC5w~vG@gTn^$l-b&O^*5hStC| zw4VdvR)i%8K7>Yudd#UlT>pZw0l(9V!}F{H*Pr5kJFcq`#%!_<;kOUZX)nvY0cU96 zv})|pm6H}e)nd+Y2+SmFdphjAFZMewvT-EY)~N`Wnr6Pvs8ZpZl>{dGg#MN2w@G`_ z0jnu1=F1A=W1=OJP{-@Q(=gMSa6OCNT9Y|j;F|P%&$BmP#Y zf8A{c#5>gw9-t~SgvGAB23{nXb{g-LAC>75eEU3tr8NfD&C~oAd~>*ewfu8%6)i`g zVTC<1S>E4o#u~WD9|z6p29;C#EqKwC{_py`z}wq{94wAd-^_MOb05(&M=FmZ$8`n=b{ypy>~{*6GxN05ZnL{os*K}`-hp7W!+l#9u+;-xkYU4mLM7T`V zMB^V*?A6Uq^GWcIpchNJKgsezMeCv+!RttpZ+?ULZtSlV`3mH*9pMOq#>JJ_z<;R~_3}mY%uLK5OKT+N!i|HrHX3{2K9k*Jlm9xx z+ckBSz1*7U1*F4+U342?7wHUymqzrtln)>(~b^(3;p^e@7E~*?@-Qq ztTRN5--q%y;oghu9$a;>HFx-RpzhLhHQtrU9{gB-qVk4WpHOtR7=!szn{f%4KNP zmTNJhl2v~}d^r!^LAreJn@d70L-VI~m}PdN4an1HWv?8|fs;sU{N-#VLghOWUtV_&ol9Umffo`D8%`}6y;cVi!Y8+%bB z+Jdko2zP?X>Q!|E)`2hC2ya%uhR$`tPk2cO;fDAWiY%mCBX)r($lM693XQ> zdhJLH{XAdQ&C9tpKvJj0;5z;c`Tz@qx$fNZNfncBND;Tdvs0zKQ_urngUQz5Z&7x3 z1uJY5e2}9v*Hps4WoG4ZW%@hE73=zU74w(J6-(_&@b8JIIWE9XeP;g==evsGOLLFL ze4zu}$?h_3eD#gh#lS0n>yn!#jg1%JXIP`T6tr}*^E!hpa^WAmV;R!VG`sL^Hqw4D zNiIe$)-V_)qufiX$CdVgT1_*??#{xBYNAKwj2s@4t`2)^?UK*`o zN%C!nH2EA(bhOWQv=e`s;w!DWm2;}~`4fXVI9ma|EuhI8A7JukfJ^uR@L=rTmq~{M z-|TL;seCfpU*fzv=ns$uL>pv;{?OOJm9%>?6TRo9aq3)_rNkQ&7Zz66fg|&KtTTmP zvVG-m_J~Z*C&7Ex<^xGUlczy0^`SXl!pFa}BroZXwag?XU|maSsyR#4@tz|GNM40A zyR9Ap9_eij2zRROV8D0`_3QC>2z1ICpcHG%b(lqahqUUfH5?ghlkJ>_p?0Knj5&15 z$nJ=9#ovJadnnX*YbX}$7?tv4zdqj_v|uHo5b7&O{fa}>241v5W_!fKa7n3*?ki>d z7T%Vac1oYhMtM*Mi%>o)73<_hlx@f5cM_^Myp|9>v-)jIj?J zUB-j3PW4M_vl(H-^?U4|MgDB0^Bc-*I@$4hkK|@#fackbcLsmDO9owZ6RZOa{_(CZ zDLNw^?>4FLlCgUx$yxno)Fc8=?^I=>glLo`KTPG~Kat3KXX&9rAL&~zJ+uZ_SYRJI zfU61DJY3DVuEI46S5|2DQTj_mZPIU1)(;RAgbDL`rV;^bQ%R)oM9Vnn0Rvqsz~uf4 z5|u{+#ta+2a-dWW{~Y9gE!C#T5tgpkgzGa^E%QvA(URmYh3Yfibz!tVcJ^#Zvh2Np0%ax~S(K(#SAXl?uFA=7?ouXhd!rWT3N}D^UJV zj(kbfM?si3PPP1Uw3fRq_t?X={Jw_MeP2*%^&d!Y90Q&h$|fOru}{^ga`+{|DcE&W zV1JY(-#&O#C#&Xh+eig`Hd5c-M88UCTrM2Z~>&aD<*s!mn%8XT+tMp-jYE)|Mm#OQ9r5)+y1rr<$dX@FiCHV8|*D zh4_-F0P$0jp#RTiP^ytgi((l^vcYMCZv{K=D)jDB>t%L9PanaBK)Re!!Z@H76B6Ca zK4ual@ABOV`jE~GFM-cP-Ys76K`Ys31s)SG>^ZE#Ou8Ov{}I%qRo;r+^Pqjl`wm`S zzi!HDt6T>}-SySrGeYAh|3#z|v8Ox2NY)u`JyFrnPLQLFm0iYIQ+Gs+MwT`6kk*#r z)3D8WaySX^51BH;U-L%)45uD>=vObcM zt9_G_1#^&t?NF@3e)}eJ;DZ~T3jD=c3QtMN0@tI9+N$Vx#;h&wGG+Lo@tYXbOna`Z zH~23pNzC5 zfwwBt(qjc^_z zs+?#(J?3nlpZMci&=6MnS8sx^28#G{fOs;LM;5+^A92K+4XVqk_6kvoR{1`}Ek)c* zKZsk@8jrYI!S2^i)}JOmHrE;ID?q&O0!2rn7DTz?m23;&{cGMT3nR;L0=LS}kr%5? zxXvB_(f@QEp+urhlk2xLwWz3J}-76H(G6k^-L}!m#l|&<`ds*>dtY` zS(q%&aeuD#`clNnVu!+)IlDOBH6>YHI=%>U@tq4`kI?xc==jW%KjE#tB)jB8Q12Mo z|5yL#bC`=iUjO-diyXsz$n-Mf* zvG4mvo-R9m((A^Fr3~Sg{}lKCmFLtB7)2%1M68I}PmJn-)5-pGWyjI~vsVAlZ9dlG zXHS*^TWZ1o&-BJp`}Aa*L}LRQmj4GS{`aLDOY8HK%2%H&zW*_u|1OoWG`=|b3DTJJ zKcw-$rx5=B!LoB5fB1^(gFT>fOUq+=@W$cGOjCF4(lL(o&p%T{AED(%3EDb`d}uvC zzQC`~HFiK#jtP4@Vc|D+dg;481|8FgHQ2Z$ty1PqptK7~&S9yo6h06Z3z2@NA=9I+ z2i0@wyszHHG(76$PCoB?)Ol3y^l=TlyR}hU^_5+}VVE9nee@LOqTk0%hOdqF`W}Y{ zSbk=lGq4jxlhb?Dqz+M#SVIth! zOvFz+7ZhESQ?6ozdR^cDbC3O8;&Qu}ELq}p|HS2WVV`li9$kl*Zr3^nsHv*m3U4av zoK$plKl$HfWJ_06ba~JsFTZn2(9)%eC<%B3cFxVEuMZCNng;n^X7aMYu5PV)cj@b8 z^S)cPkI50?Eq;FRcJPJl9_X{#Cv~z7>@0RGrJmIZ1a)3 zrp3ZZ$^rPDkvu@AMcn{B+&c%J0tn*YnUMX3S?K zipd7pnXq`N*UW^)OOUCD2FBEZzCS6S;i@bBhg6kv;IeP^^B-N`_HvJb@3i{A>WqXO zYAtxp4LP1hL!S2qoSKgLyS=|wG^#$eHedjH(L2yAf8H4t#FdNev5_W-iLHz5DTuhO zEH>y#+5FWi@0Svg?`J3J45!T9eAFMx$TRW0@7BG>6Bhoo&n42%<^uKo*fS=LJF96t z=}%T7Y;!7dTFwt4*T?y}Pw5Dm`Y9;dNXGRQ(+(Qdqtb@pW%+<2Lg$Ej;9IT;!TKEMOlZQ^@xQG40Vp)S6sLbyVF<2XlWgGi&ClC6ZzI<|j_}v>r7C*hosL9wAE^B3gO1f9F zub_CvvX0eFJ_$X_jGDhpO>>FTo2Dz^!LnxETAvF$6!Q_Yk6d3?d+i?5K@Tu{)w z=}~Fyy%z7acyGY_Pe$KsO%F-om^#x>q&(;mQBJ`idTqn^y=LEJho>xiP4=cP-8HAO z;VaZ$Lw$4aii}OnHSOPd_c8W~B3h#`Typm6T49A=*X!8FOxf{oBrt+mEFUzSAD2Td=;}~GcZQ}AtqT19dV`BWG36=5rJHyvEa^2(9Ul?I$C4h`)=f7mys5Bz#yG5j~!H_8UWVwGnMRr_^K)Lu)6XdTjRH`puCeuUd# zl_#LT&IH&QC#A(@5y9}gCsQbP(vY<+{N21Ex`z75mdxs>{I-u&OS;A?Pi0q}tFp`B zdRsC0KEA-lZFfeWG}!ff>HBVARxmkIP~S{e5nIY;1lbve$x5(FOfjeMl%lTA3RJIi zqHa5t$0~OYYSaFDwn}8=Cw;nZ&Vcdoi*q7L`cc-4jVTSzDUf$A!<;V-7|ljrw*_f5 zq5pyKNZ%`zBPfc;eXmG*wZ?fv%SB7u)|BO*ec<8Q79CO2ES)QZfCZIM{}A0>)= zSdF``_rZNtVr0b^Vw@ua9xnv0$`glCNiqI1)PgbpIM&>o;~0BC6=NkLf=*FGX(yza+eq@#+B~!pna!qa{jAhnRrfQy9G^ya|2mY`d$**E(6!# zTpyr(9v&@8K1#yj`7X~n@udw^mIkLTKz(-@o~d^Il*xYnD~i8rNDDjA7`bJbnS3#@ z8GF#^{HYu-Jlj(9OWhW5owlxNySL)rtNc({<$J*MH0uh41eJqy4CB*+)K(1U3ffxw zb)9@Ag%R#yZnpYS+({tesZ**+Js!cBt*DYp6px zmy5>62Itr4mzlv2C6n3%WzZ(R7&xL#0)I5WpzOd4&Ya-6m7gh=mK3qFE4gARq@<<_ z4(nK;RA09jX{Xi(fo>8M+=6+uPhSMKR7J2tFav=l4K~z8ZHKyzrazT_08VYa#N<5} zV5VFjJSgxz@kHOMnhcB3I!#0NjlXf01YQ)Eiw5}0q>-p=d{u!zbVvwh7Vr(PD$^`^ z7&osf)3HK5jCRlqohvb>2X=`ZdhfP2^B${wbil0E<+rFye7jzlB2elVhvo`Pq_;kW z6_TWFOb6HQ3FQdJRj61a< zGT95uZbS>l?=+sS5*L@Hp>M1Ohn>loB`ou~q}!`i>j9()wcqHSE*M@d9vm?E*%`0y zUoL9Vhi8H}3Z0mHsnCP(3^bMfy#t8bjM01my~P&iv=<6&sZ*VAC;OS4{m3Vk*@yZi zFt1>~d|x*Oc$@{UXtaZNNC&H_oTNAGG#eiu*cWHb{uhb+wJMg>S z*9RW!H4X5WCa{KXK7Mr<7m?k?Y3+|x`EQ3*BV|Qhn^4MUu0cvkqOmK&Xq7(&pZts9 zM1N)PZfN9>m)#=^;fE)jdQVW2EZ{wTjrl)>z`7SJHpV+YU*#cjz@N_Z^FT~yWZwWZ zfk(9*AzuP5Xs(EKF?M*P_nHyITme~VaUA$w=Rzh(|E4s6Zgp`R3m);}ka2VOG}^8xfh>j(%I`u&NH!)BL?Xi$;8I;^g_qUv>-(^ z-JnGa@A15ja)xuUBbQtu1vybZ7m*Lub1WaeLhEi!_IIC*p5A_wG8N}E@BClJf}e?Y zqjM~fi}(HQLR8cBt4NQt4m2{!m(v38ffhRf3eJ+TcGY5FN`(3zQ(7)FtD*gM(s41g zhO0}uvR98&eT#t39W-Bi1bR&JGdIG^fu4tFpoo7mrCpoiOS_7*O1rc-kDC!$nhomf z)oyJh|0?CA4^S?Yhqi|ho^Di1;4yajMEk5lfX2286FYt0{@z8A^Lyc?>Xjuo%Z8Rx&`f;a;`ko_f7<#v|66U_#?rJ=4?eOTgYtGUtv? zz3{g52>9Ae&WC}uZpg0Jrih@2E?4$0t7;vTdzitPTTFx6%a!sRvp=kl6ocm@{=p%5 zEKa+{3=AE5&uqcd%PY%ITwuSXv~LgXmgq!0K5(!5KDE^JbRkMaWz+`l8ZBdKNLxy) z#NNP<%4wg4&ODy%qEo2x3+XOFlFEb~pvT$h*hXED$-7sr$u9#;wz-qZQvx@+e$;uB zE4J~b@=Sp|NKidj2EdyEH*3z8_}?aMw@k4KIqjB-uq6p0)rh;w=6@R3SS}=2Q*Jz- zu@NbjR7yhBX^fwf0|;%;Y3MKE{+hk#o-=HbXRb8IqA#Uu);AWU;&QYB*Zl~ z-1$CKiZBOjnfy~A7323G5v*8u;t?A0dlB9p#`P_P4=}!Ij1SMzFn_`Q zy9fb$bx0!Kb_$MB#0WX(pr{k*mUK{;|~ zTfP^weLB5e4DH8WcrhfsQk-k&6kpr`v`K$Rmhzy1%Ff|~`CfYax8N62_}#7$>8?|K zC{NbSd1(EsMR~o@S4b5jh1dPj?j(`1Z*pqR(vIvsk}1S0mQ{~CH37CTUbrZALKnXg zx&rz5_FL?yX6Oo#j?x9`o(RS^J%w~uHnfz8nz|bCs7R+66Ve0M#cmeZy?nX04wkQj z`g%i~w$bh(O^3WD4t4>hVg&3C2#qT0G?Qh(YHA~->Qa3=-?aLVZE)N6$ zKa1}=TeA2TcE&EG*6i%-=oHtBk)!F|?vHeHwPPne<7jHr`~N1LTS23K8g?c+!F(Lx z5wA;1aEI%09j=uKL~lLb^4W!`JyAelNr!dD9{-E}2LC3}AkayZ75_NcbBP^{TeHS* zzq0FOj^@KasuszF(L4`@k&9l6^`}&5wsuRjYVm=CgFTno!GvE&`p3CHmvGj9{_P9e zJzsgUm;KJeiT34|#&gR`e(@O2B$jf1FX4srKTDAd2ege5ZRUzI(#IFH8K%-Yr}iV$ zmGfo0l!G;xX|EcsO9QU2A>1-S!yLu+Qv}qj7&?YxnEUigKPEJ0zD+o(SbWoj+0ZmS zinBE%uR%{^*IbYB$M+-6>6jyoo%8VSJH*(w;};n0coxs?n2k((5#EjQwkTc!@XTnm zX$pb%SPRKizY#f>wvpEVXQZtxmm+luh%* z4dR86-G&jiRS}-_g}^qgWhN{vi$0m=9xwj-z%7dPDOUBkVZGiegA;k+leYN7*9d8y zry%bieIsvC7Wos~Zf?6q&~;A5TIv9`@B|QkE(fhMIwYW5czUF<=a1m|XTeuj1k~rJ zB_O}6oED~?Xvf`1)YGC|%w2^nnf_LiDsjqSr~X_sk%jhen_UY@%ixl{acZoo zS5Ti8d*)M{eH^CE=6|ldQj4$?8i6u1pP7)m;Cf*}S>(wxuoh(UodN3{8sFK$%oTSW z-o4_oGzAEQ^n}BciZ<)?^O6m1Q;Z$9A9B&&;AN>wJnYndw$Et{yx`o^K3@1*>JHY< zXRa}{>x8eQ@jx;d`=S$Hd=xx6`o)neU%W5<`N|h>o%28I-!~8&nT?@OOBGj~Yn7_R4=6TRt@PUuU zLPt14L(d-@rj`Nf^QTOX<~{4@od7G)_nzehl=Yf3a05&Ohr_Tdc^*qRskN5V8%^Y;a zz~B`0HWpU+??4mw_QRUJK*qL>lQ*gMDWtET5#$<)50?26)38O{n3H5ak=LipYLVcIP!6VHxCgV%&PBy*| z`MWUR&f_cqUN$@#-OwMlPa7wf!=J@mjI%WeoEzTM{H`?UvD>Wh2)zN{SXxsB4wi5+ zLWDmPYd2X#&~uG@smS>$7Sm4m1%BSGfp=Y}c!%dvu|eHi>A4qr%7kj_Ea zXUU(qwJq8m?IOQ%%S8WWah@fBztNF_h=ol~Qy`{STxJvXs(nVPJO#GDcF&JJMbKv- zFN+~sTRS6x%Y%C7-+gD(wl&l?wgV;LLLw#T$8sW_yXYjwy;W*>u)g#?2=zN>_Z_lenn(;gyy7xbff7=LqO(f(F+8WDjt}gP* zZm27tCRnk0%!j^Pfj|_B*I|)wZCix)`Ved6I$U2vID*iPP|zOg8-_Lr(G3x>?J5B8 z)}a3|MT;HAh%>@?`R~I!lbo1WhB@Pb1$6&?df4yNZbH09h9S8X*;Z-YcdTd>8=UFw zd<8J};KP2gN;~XWkMaC3rjsyGnXD3&liI_sVwSL(4&*RSHjm76H?BO(|M=8g_w3Pn z+61CV$H^nZ<80UB?Rc%})U|3Yt<<80Q?b*HlfNCd+6opnuiT+cKgEE(dv%-VmXCvn zw&qoPS6cY!Q(WC7^vMs~Ffg3%Z(eB!nq~9yBwHGCS%O?LuFA!#=JLjHvMsTqZe<)! z;|YP}tKM7G_pc16*rM>hq<39O9qf||y;@MTiME%dtt+?kJ*T27bXRfl#>v};Q*C6g zJc9P8KB4xBzX4dD2t^1tBHW9x9$`BIaJ;jq?le}Y^=7E8_Tcbzl(>QY(WyfB)PHNW zs^K)-WNK5^bZYWd<(;UO_vYbrTQ=UNa;8%gu6moUzAYQh2)6~^+OB#VZi|`2nYKjA z7jMJdm~elDTVmp{-4;#x;%(ej-x7U3PPPtb*|6HI1TU^+bypnPim1NvDt6wVP|vZp z=)~_!2$7ZW{f4jzVI=~_XbFv?g-AI(ihS6Y6NL(-PUGl2P$L>wey($za*cYcrBPI( z=6z-;CaV~4$Lmd}iq(?QD4K(JG+RCxip`pZaa6C*!Z@1co{8BT&LN!g;i1*5npY<2 zmYkaIo>I;|PcxU+>l`gT>nhDazXcCECn;xmZibAQ&F+$ZB>{P zXou+Ak(G(EMyCzj>K=Qq>l|Fkd+!0jpz`yXaA z3$X%@lRq1LWW`G>N-%dHS=N53@)`2x`^XA-i^+$+<5kZVey3T}fSva6%Cq~Kyuv_a zPdWtCM0Xz_nbV1#t!^gGGu5~8SlasrGsPE_^nwrC46pG$HoZ+;CKd|Zal`aCoN4d} z9^J@Ho*OuR33BMR)m@A2tGi0<(RGF<3sUVIvZz$~VXQ0bDz%g!OI+QR!`jZnD~UF% zI|zzudX;rn;3in+f(tM+_R1&=x8>b~4@&ml z&>A~%{4Qb>X$%MBiCb4Jcn9EcIK z!3Zn?ewo8cqxaiO@jgw4p=9h!2H3T}nXGLa@;I6WpAF?fr52~sWAIgF1yUt*);s?# zrM}=TWhcWHg3E$6@|~B{sor6a(osO&VeYM1vC%WvvuL$>fz4C9nz7g2NA1G5 zS}?DpKrizSO-}(+i!Yx-8==J+N}ESrTR_XC$$YfAeY6LB>sLT4DOHmj3Q%8+lkXg$ zzHq?1nEotZQEX)Gq~ToSa4H$#T~l4?o%w8u5jzsz*b3RqM;*oRxH?v2qO&QU*6lP> zjKxZ(jkR;6SLGOc=h%M|TEm*DOa_zlN;}izap)^5yNcuR`|>ge12mbl`(JO5yV<8O zh4f84$__k{3V6@q>eTT-a}aNifp}2+5I8d-eZ@!0h5~!9mpg_l&P9WvzG*;ize9-z zg+TG32{VUjbSkNHOyw-D);Svdjh~Ytvuvg8TjNytIZnlp%GhnQG(WDnkMe#iLBkj; zIH6Yb`r~>Mqa6=u13RIy*5K53)Hu11)&sqX_;VDfoeiz9(ycJNYdy}@$sVA8VI1cR zkE17`E#anf32F^240eHS{)|^ShSI0+sBc)eB{O++j=-ML?#MW1WeW@P9#xpQ{vh(8 zvD8X5o36q#Tho1=WsjQqM$)b~&BnN=l%oa!lD#unE)~Rtsfk0okHbyF0KJyn;1DZjBP2 zY$0A5lili!J>wCJ4z&AA(yY$tKzO&Od}7PFXTz({O3F!N0oI#*Bt7R}r=d~d?7|sA zTQ?3K+;@rECaxr~pRnRy3R%!MQoxzY&M;38Am4jO^TfD;1>v?Ij!%@S{nFjfsC*v0 zqkg7x!e99U)}9GOxV<5p*K*`I&hduUhziCYi)TC4JoEtrP5@)ARF5^qaD-X`^|i1C z7bW_J(jr>pHrMUt0kmhNNGOo7k#0=w?gIMaXjl}d(3QdaM6NAmDygxWH-V> zJ}gauL_GU7XL`_HEtCT*2Whbu@>E^nCDR2$Ej_96m5SaMliMh zQM5ig?S#bCGu_&l$}Vl{2jXnUfy+#EX~5KhYx*@fcln~H)8BLpG(g^y4)ple%?%vr zVb=8p7r{PjgIFPsgRPUJ*Jm?!e*fed#UXE4pIr6iPRhl5LV}HCq22qM^!>X1b4YAL z1s{x#t+z3*)i!735Ka>@45QJIp9$j8$78Np=qwL>k>eo^Wc8YYNrKkR){!@Ra7-Ug zkaGvZz82oXTm(ip5O*KwA3@sn7(ciNM**^7oT86nj&N=s2)K3CWD8j5_0FefBKYZK zADSpD%J;MmZ?_7X&tFi}pz|f^X}#6M+@!he%S@DSRVYQK{n~2Q_BPV+wid5=d~L)+ zURdHUS$kHm`#7KcmM&hpGDRdwEMu=)mT!Y)=^(R+&SNQZ)R7MGqcrY(V5~E=GPl$H zqic2U{0w$bQ`oRFWnD_4FWD}09ND&e=hOQl*fc!4HXpc)n!=?kPhMcN%$@|1+VslGltQY-P05-;t~9}&P|=;-Xjxpc>!G}L=N|e%8jEX(ts0er{L{fVO^^W= zvx972r31vA;%C5D$`@MxqOGtReYz>e@rQwi5NJ!gO12n_l{21aRg(<<=0}D zOA#R*xpaF8@1~hdoU7Nt{~?)|V;uaN~&q$t}*oK#D&}w8AF( zvXmsK^}^UBq^T5tGB_}Vcb$yqOP*X09i3!mC3q6{g2=L(`r!~SmJakr01WWyyq8%&Ad(dJ@EHCO9^8EsmDza@9BU@cV2a{QU!vO|iDWp$|_%ruH7j%LxQ(H_(8vVm23I zKjBDjqpO>~v9v8$q|?h(C0As?xt**$)2YvQT)ch#MbRSOD4LtO<42Tf(9WD*tE*pn zsA2#1f$jZ<4DD9vG8I6NsWwr*ccgHm78+TwBkVgWU%&nZXgu+Cak7?o$g|f|`ib(t zLO#qlMxL==6oIh5s&FIrgHqruZM`V+@EhS)_K3xZ*Em97p90$Q@k?)UY~K6I0ta)^ zyq-ANZP+_XgNCfv!5;@tcVhU9M@J~OsfRaeGRRB8SCB<8@?U*5XeYV{1_AEh^8wo) zcRLjgs7Z(XmXGc_P-`mP{!p&y!1cAz6Mobb^(rcOLAe&5%w`oBo0+-?UD4Z2&4$dV zrcmFT!1arx6V)?_(Xs?z#iCpX0w_0jUkw*4>or_JGbuX2Wi?5>xJT62G5Na!upb3p z*Yk?LQ4j8>KC4kG6=i9&Qd$t%Gl66344DzlmL`lT=&w3zH!IGTP~Qfsae&Qf79)0) zK&x$n#X9~ac--q4X%?eVk7)tx_!RkPsNpApL&^=1oLnE^p{rqyzAku3S-_BOD~EP} z09t?bB#+Bk*X!Arhq^Yd4BtNx{Op3(k_Z_B)zgq^YL04};X?gUf>|xm+d_T9NcUHi zi&NPRxgc!Pg+0id>T;cev75iH_u75W1L^v z-%AqzM0p41n(pkY7Je@SS}i8%m=2Geko{sjLm${Gn950d!eak^c{swBKqI9FcBd(A zz~N&Hzm#A{h`AX+d7c8TOY-$Z`Nd&AZN^!BQ|JB>;EOUj(PylqCu~lYwl=xM zreK#8m32l^M$3?TQ&^r$CAkwN3ELA)QOh&j*8vR~ACN@DGVpMD;zr9eW3)V|<9dC4 z3G^YRqJ<)WJVxcv^)vb328?cwIM9o65_~ofoU9zgNE(iSkGrU>&MRe@jWT#!%~&DR z;1$*gOrc4TaV5&6?`Lf{+q_4#ZqAidohW~bC*K52w#!l{)>ZSvu-C(RVH33cn4AZL z*SVqVTRq(OE3}Q*e{HxG7SFsY@3TYHh7mX`=upN8^1YO^IG}61OJuK~QL2ZmEeW1{ zbV9X1_bTpQwtCt~1R`-<7JXN*d@8}}L~CdqUs@vmE1CS>CCWf_5JZ2f$~odl9#mB* zggI@A@^6PCv%Y{nbiJ4aT&!O^&vxhi+@i32~taxe~)qS z=K!SgD*ql_mqm8?PK(WIm*TU2BT>D7gf^ow^cb$sBfN(otN0C@TC9+Mkl)Fr18ch8+_ANq)&2Oe9E_9yb(_~`rg5e?GtZw&jL@~AwTBZzrr?&x%jAWIXnn) zB3oz(aF5^&8+>p@B=k|{040r3si+;SZHaOjBt+3?fMPDcK4gQgU?RLMVs@MXFlp10!BPUrTa{Fo&H^aWh6ok_EjYNxJ&|Vhu{dolcOYP+HdCC3v<7 z6|QS+%YTGq)5E|73i!u(oZ+#UJ(|L|gQl#6P6Jkr@*(SCeNQ|~zlWeh+j%x6t4*RA z!$2;nuTPNMLQH9R$9Vrw3s*FIAe;Ruc`!)K+ASqyy(Epx+9_Gl&dFIjfcqII zZV|gZj6K)0%CkniNvw084^CSVSGwKV`B8e-CiKXYnA6uEy!0IP%h@6fa*p$ffn1?X;4v zW(eaXVlm{SMZWz>ISph_bSsO~?ZbG6GYU=%OokO>=XydDo`&5z-*Ci&dXdjzJ9q~M zc%z4mZoB~$3~(Oh*kMDP-Uj&@v;dcg$+89>JH87rn4z!{L7LPibY9rhVg_ym$7)p# z1n4aTSA+KA%|4r5vzH{kZ{W*C!50+H2YcHsuOHUbyUHBFXuqy;wny6t#0y7iDQ}0Q zT0>q{p=&tofcH7xCVXdzYjE=Igd_4#>(w#phHr;AK8m47jO-v{c=_oQOV@+C=i%!z z?evqN;wroT%*1yZpie*;lW!@MFAtjp?gN`=ndeQMB!TD*Ole11eET>XXA4`o^N@sJ zo!4C`J&@9o8iG1Mf>3+n*$z?OjQ4dt0LM)7mrYo&gF@E%vp{nNPd3 z>v;Qwy3Ov1b#Z%V)+IFOY`wN_W5p)-q^;NCn!i-VN@_Tc&M&qI^Te z?7DHyT=pEYW{f*=VM@Y@3)8bVE4v+=m4gT$B6K43I`W>?!DE79x~)mqOw`>Is?TAE ze8y*LDnKn)3>!f;YK2Ze`F>>TG6j8ehVURp`G@^p_k&pRv4UTbzkr7A-@Bg$jR_n6 zft|uzK(qRJ=L^uOA?*u&@E}geKgH~}33F-Be`5I!kvJ)s8V`748j-$<$(xH2^;1tK z_O&}*pb>UL-?cySg@ok10}vD@kF zyAgI6OwQq8e8VRf*tqxGHaWe}WoL}#YI=H5s0L7|Kk28kTmzhUCVH-_foo{jXYGd_ zim~ns$yEB0iaHjz-P{m^9xp|j-otA|b3Q-SAX*#F<_cn$Y`p@en3ev5c=>$5G<0@f#Z zFisFw!A68@DiT=uC3+5?L}>MT+Q(0i#>p*NZW^%QESCVvqNJQxSH@pM@8fbn556(I zzaMws1gGTgNW-nryZ^Zyy{UJGQF8`ZC`#oh1m z&ZoY+4|h8QspUHLT`umn2ehN*UV^)=fyB}8QgF8k-yK!IbK~wYoNXxYsRKSKDN~D* zZdUSvLmNHNfRpIM60H>%5e5+c`~c+8H$(pgAqF7@Arpag=N=cQm-93Af-bWFsY(4s zpfF05M4UYIqZWi3>~n;f%40UqRG54@z+@5b73HXRB+54damj{vlN9ndqsas1inVo8 z&Tc|GB|#pK*ew^#2SB^LQY(JVGtUF5JBl zVAMD3@%s;f1kyRPwMvw#*6=Zq**@yfSA2ZyUvc6uN6KH~)V3=?xdf$r)U6O6Krx0B*-6x)|VNu6J{5%c@u-FpbJ#r z&^50)SK_2ePq9AdiOBojKn_y!g-j}q#SZv{gML%iSJG?F+eTw@fhxZy@6$k+w8wcG z9Ip=8F#RL=inBlPn)4E#^+;<{mN-rIvxFtZNvf_|&Vh8djm|NUm~vXIf;GU>y`a6X z1oS&FS4P-;Q+;%R&o>6Rd=BjqGstGW3R*34a2(FO2|z&}pY=OjwS(rY7bO#@7-sM_ z=Z+vVr2+CsI_LsA&jnwRXzr=!Bg|8|_4$?= z<>oDXM&y?1CzSB1=j)HjXhc_1h zH>uf-{V+j(96eJUOpvW1u92U<3SNo0f+~N493M)MEm&zeOQ&lIp? zHn8x=Y(uXk$Ri{92cY27scGc*ay>TlIB>?6h=~ICuA#81Y#QXSOhysneT!T=&KNQ~ zab6DfZKXW{d3+AO!8oi93G$hdv)D!ZBz@LpiRJ^XWAiXRX#FBzp$|eA$O;Vb9sdufj=;YvP|rj}X1t z#?LU7&jMYMEYDGFDh538&lLt-2xzCFOk5W6@itdul|&hySV}%v4GU;apBvD-;iCj6 zNDlaz%4SsPJ&+7N zI*Y7@{T8M7!~l8lc)TB}>M8FcAxdt6w`p%1-HEts0xsPiXnUvl%_`=3iOR#@wQ4Hq z{k0JVnIN~0bV|A4JtN2dvr-YREBgPAwxGN@c+Ys$X>PYdf1mi4EqG=DCO=N8ax?na zbap|T7Lou{i1+XhQn^VkaQRJYn>i}Y8!Fa=)*X*gaGK7eZE5bbuvP~EwK>cs8i}iA z3&Rt|u-=NV*NsdCT`>tLc?t6R5z?U43I7T}mU<=zPfm?kpj*s&xCbL~cNF%#u}r6` z7ppsC#FKYM^qy_XiURJzG?Z*A%K6+#j__C1=K+kb9dWR|K)Fb-nml$qLs)3=*&ga! z5V{%mZ;bsheCtr|pG_R`0!NfQt4;3)mHz`eC_#R6L`!~t)jE!)n+}XBpe%VUu1rW% zlHsp9+7<1tSsv{^j=)t#yGsyis>pU_kw5AxTEGlD87oR!H$qxEZ$mDY3T`)*v+Y(5 zv+DrItVXCp_!UC!Xg!FZxdr2b&bjQK6j>UWjWj<7^1(TrFRycJ>xlY^2x=z~7e7Is zgV~oL?-?!-!e}M>CYQjWCbWltjdgYoc8l{tiZdVf%Z4^~!au;Dg3cOH@QAlsiNapM z>}Qc1G-(&< z8h6aTG)jIIlr$Uho}`(uP1=EZcM|Op(`Ll!l=FM%8_F%7i0VgCPQsdI^Wdk{9^uvW z+|NYGe>g~Em)bVU?Z^d&ZM!2Qa)DqSFSNi@s)pl1*J+iQ0=>(7L{lAWeCbXOdMm)Y z$kWKt8oFciFG%O;`&-EG16NIc*vKKh?W{^#K57^_!&BOt&3-9Lg{JbM9Yt)>fhRipK^{&9@v zL?P$Y?QJumQKj1KbI^B1U%o!P8l3giPHhwRr2c|(4dzx3xQ^%hIidbArIM+paqQAj zZLB`xRBpwD@b?-G=H|2TaH-l}tl!=9u|bd1VUf@>UzcO)u#sLR&5FfrW}do^tQ#&> zKE88tABTx__) zqe_r(AAU>XOCM8qEINYr=ru653266t%-@sn6EPpZS0PNrI$et^<^uHlcl?6%`|tWi z+Alt@hBw%wbqd>=QcY)*r~oW>if}&sOB{A_&3)iGlo=}G;Cnu-uaAA>9QOHN(p&ac zu7cSX2S4_*bPQ>Kg^=Dl-1jUvTkvgs)x6cJT#E#p_QO^cOuPQpa2ZL~@f2h<3BpVM zT)#=s?BO%wp-ZM|Vz%VL0x~OuXx`l+O9OD-_YA?8r5UGBPT(u(O`QA%Xi8a?5nq(@ zk!E_U*==^6`NgsBW01`-nRK!^5nALYyCSTHXg#KoIGnVK9ELxUyA*!VhBl+Nnl@Ud z0+eYpeAsQhszeL_twc*h+@5&(L?{xYlM}R~rD;HEE{>K4ddf%-SkZMP(_#e{d{Q{t1n2VGaX|6$yRuEY&q71xirbpOM+cV3Bm=Kk-~ZA4tUM_i0>W((({ z))215C3@nA?~1Oxqwzwr>nPcyN|s%qF(zLK6=yA^nUJT>ggBXvo+7{k6j}nm!>Eq~ zb~Pja37*vSp1-uQuofc@C$Ou3prMu^hX!dB&@M(XCm`l?h{@z!P&LfMY2Tq|KW5+$ zgL1p=JTng(vCHS5hn`DrSPwl#%bo(hcZeud8uJU$)=NhF?}u&kmyxkHuUYeb+eD&m z=)M59%MtD;puw3VaL}*hOW}`YgoAt|2Xu@HbjbA2G&Ns z7bPbiq-XRyNzQqbesk6EG}9UfdV6Bvk+vka3H%KU56j%8&<0w%%h?}<7guk|2KSm2 z)21~A@U;0KVu(rSe#m62pRY(nkCjTl--MtD!U6P&8cdd1tZMllQ<)dlRJk_;pEd9 zR6x5ZsE4=pU9qql{^K1rz`UjWr-v>9cX3ghsUl{>RA^H2i&l487Fm3HU`}I&TEk{& zWEUtZ(yq|R9O(2#!2iGJIMIcM1uRak+mzJ|Cwm8q+UOS#{eJi<$mHbv4q1-Sn$!#W zB^@~95oo!YupA+jX3+LIrZc9iRx`usYWDPCcr|0%?>B(EXyw~gg>Ts(l53V*#*{hI6-uKxPkAAJ4OBV*sLYdtQGuio5-?>*5tM{8ssP9?Xu zncNZO9O=1Up@tKY0uZJV<5_iA3Ab}4$}wZK90je=XXALFJR5`trv^4PKVlL)V}N;P zSo%BXxFEOj#%kcpoW_1O-Ke%mSZ`d9Hc61b0O5yDhZ8iB;3-h@j`$2ie4~BQX zvGQm^p@+-!uv(rLr1jgY`b}S+g7Gm{2c|F_*E29SwrDH`5r19lJ7O#Ph*kUOHS$r> zW^u>-TOXAUP#=+P+bNu$k1E?Ct=HrF0z76jQ*GlDwD0Gl_w847NNeoF(MYV#UQt<>9;7H*b0tl*D#oOPr-8L0Cp^h{vp+^*6`l}}>C)B+bNpst}~_{evhXDTbsGY1GCjMlq} z!u@S!?y_)=uW)`7y?ZQ&fB~AU5KJuG~{2pQ^h4W+bJ_@9Rs#H_29Paz*$WGuD+aSwHA3ms9 zY#oZ(!uOb&czFZn!*E~buz3P$ca@0Esy0e2PAtQHqns<}b z5>$a2Pv9+`n!NZ9u8z)YWAUz4XXiLI)}mqX^kh5M?yz2#t9ouuM34gpAy+rW{ZHuw z>=|sp1SCan0^bQ9nxYeA{oGS%Ctz>I!)qp+p$AR=Iy493VGE*xj3Zu79ftl1Qc4V- z6H|~vK2n$z&}64nq?V_;iZ7PM#mPnR<1=Q3z^R&fl>W=gTY9a~bt=9B$b5_rGZOx2 zhWF|tPgSkhjXdH8p6HW22lTs65r;lz__q?54eM02Y4^}2>DndXcH4qBdllgX0*hzK z2#h-C%UzGRKz66L_vYR#ZMtM>ODQd+4NIYbfr6Gz zOA4WFL{Ma=ic1i2QW=H{E~PkHs7qNK3q@sdVSsT8=-5y@Lj-I`&~aR55}-~2myS4I zS=1Z0+$>H0_uQKzIP?F1pXWB)UB2~v=R4;;@8QOdzj6h|GLeqF0IPIw@a5=$o^;Hs zcfbWz_jEa{A(5t7Gr%$aD;yiN_7oM;)|Kx1_b7;-YiuDCMOM>|I;c8|o`lmQ)>y`Jvzs{Q*D zy0g!4>Bz>%&Tf;q8fue%$YskEow{aphfizglB~D`vVxsd@f|a^k28nC%FW)S5>HAU zdp{BKTtn_VBQQh1k}_KNIy|&bM4e^5;7*>Igrg=Q&!1^kB>MZ%xvIPs&WdX!I(jBf zy;M}2Q^W*#O@IF(%#Zv0vo6+8C9iTx+|H*TJ0`6Iri#3DxhY=OgE~yPWr6xnWq{Zt7!}d#OZcUl6(w=mj+c2VX*p;Xr zRRLyd{B2;M+b)HlOg_pr|HOqbP-fuC5Ow%{gJpXlncKRz^zx%q*V>bh50HD1+d%!7 zkvQ)ntt_`v$z!p8z;Dlceu2ERImw^zDyp><{pjC_*bb)XEKr+I;oYo@ma*V)50o;g z;xw#WD&&V)FZ8WhFNl*7?!+_8acskpBOQm)dkdy{!gGK0_PFau60Jjs((4sK1nheuI zwlhN=VB3WJ57Vb-z!ldU%%%5pe}ng=&o)B0ru*FhJwKJaA~twA-nhIur8|b1eG|8a-L$Oh*-I+_dQ$7UiX7vD}I7+ zGY~mR7PxQyYUlum;_7_mitD3EusbR-P&P18PQ;nIm>T0hQ*;2|_>(^P3Hn5Y9uF

SIQTUr1e~=eXnkd-QXYOq|wCAQD&|R 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%0D?K|L-d1FQ0JCG8~WL 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

4=vf3BCxvWvuWlWF^TO^arQ|?AagYEIL_6a#v)G ztZ7PeRgvJ{7AI*qLYk850B)VWRyZCqu2KtR12e_TkH(wLg3}pU!?aD;942j0qF=p< zai#MNkFy%R3lZ*?&qGGWd6!K;EXMFWZPsP(J6pi>&nb9STv7GTI#37h^jCXoIQHZLa0npK;PvcZ9knOxR28I_f=2$m%bV=_to%-veU)I zRle$>Fp%7Xp75w74xw`IhWBe?zKK33^|gFE_=f38^!3?Df3K_zk51;G z8BL+jgpC~vbprT?^wx{mQF-4b&?ikxrm!mH6b)Mx&Pb;Iq}>Jcwk5A=v0EiloDE^f zbO65SxdwSeZ709ik_V|^m8kPzUufPga*{?Fon6{=Wx8fUV&NIBvJ;9b;4-K7joxAK zv_NV1M)N8SZ?x-)`rT5j3%D6dVfsZQkAe$fFe%*}WJ3rx*3P1J7c#V)~&*ea6n7u8Z8wl5d>zM}PJN70&1si*Zqtn)VY8{nwk zrs0pVQBiK@9Ji&0c1!XU2)Wr4w5KW18{9;0;*i4K_D(NO;W5z|`w`<5#js^?XBrco zgF*@eys9AdpK`j?LZmD?&u#_+c zG}O&9L^z6Qo*Q?;F6;7Nya45w8~1W){@_!)^W+s^j{7!n*bCexVy>I$8fs~KZ&o?+ zU#RpRKjxpjVm3vT!xK-)dBJnTz}l9Ji(al?nY9u)>f)7lC1!-ix4h4KHoQGx_jWcb zvSJ|bTD_t_9G)-wp#F^rWW2KyajI8J%7lajWwMen=rB}^Qy~?=?td4adMtuJXzf1k zAMSX_aoOLW2RyPWz1O`xqx|gJ+W|i>*x)}$0UN1`Oh|8LD!p8$3Q|Kf`pK{x3cvEE zbq?xbySU5|jmP6G%aj_#R(R)w=EAiniSr%CX8L88%iiwbs;d|MkZa!ciKrA^Rk1PZ z9#vst_p-p#VurX`aPD=`zFLqf?5`RoF0?=2Ksp;ka5jeZRmd3;y+>N{uKg|G)>~oT zG-?w8>p0*=@>L7P(-ppqWLM!iKWG!y-FD8$Wp_c2

B9_)D%_gM+=09MjO5P^N6z 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 appState.currentScreen = AppScreen.PIEZO_MONITORING AppScreen.REMINDER_SETTINGS -> appState.currentScreen = AppScreen.PIEZO_MONITORING AppScreen.URINE_CAMERA -> appState.currentScreen = AppScreen.PIEZO_MONITORING + AppScreen.FIRMWARE_UPDATE -> appState.currentScreen = AppScreen.HOME // 기타 AppScreen.SENSOR_SELECT -> appState.currentScreen = AppScreen.HOME AppScreen.VIVAMYO_MONITORING -> appState.currentScreen = AppScreen.HOME @@ -178,6 +179,9 @@ fun MedilightApp(modifier: Modifier = Modifier) { ) AppScreen.CLINICAL_HOME -> ClinicalHomeView(appState) AppScreen.CLINICAL_LIVE -> ClinicalLiveView(appState) + AppScreen.FIRMWARE_UPDATE -> com.medithings.vesiscan.firmware.ui.FirmwareUpdateScreen( + onBack = { appState.currentScreen = AppScreen.HOME } + ) } } } \ No newline at end of file diff --git a/app/src/main/java/com/medithings/vesiscan/firmware/DfuBleScanner.kt b/app/src/main/java/com/medithings/vesiscan/firmware/DfuBleScanner.kt new file mode 100644 index 0000000..a9f017c --- /dev/null +++ b/app/src/main/java/com/medithings/vesiscan/firmware/DfuBleScanner.kt @@ -0,0 +1,163 @@ +/* + * MEDiDFU — VesiSeek firmware updater + * + * BLE discovery. Also detects the SMP service that marks a device already in DFU mode, + * and reports the conditions that make Android drop scan results silently. + * + * Author: Charles KWON OhJun + * MEDiThings Inc. + */ +package com.medithings.vesiscan.firmware +import android.annotation.SuppressLint +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.bluetooth.BluetoothManager +import android.bluetooth.le.ScanCallback +import android.bluetooth.le.ScanResult +import android.bluetooth.le.ScanSettings +import android.content.Context +import android.location.LocationManager +import android.os.Build +import android.os.Handler +import android.os.Looper +import android.os.ParcelUuid +import androidx.core.location.LocationManagerCompat + +data class ScannedDevice( + val device: BluetoothDevice, + val name: String, + val rssi: Int, + /** True when the advertisement carries the SMP service, i.e. the device is waiting for DFU. */ + val inDfuMode: Boolean, +) { + val address: String get() = device.address +} + +/** + * Thin BLE scanner. + * + * No hardware scan filter is used: the SMP UUID is advertised in the *scan response*, and some + * controllers will not match an offloaded filter against it. Filtering in software costs a few + * extra callbacks and is reliable everywhere. + */ +@SuppressLint("MissingPermission") +class BleScanner(context: Context) { + + private val appContext = context.applicationContext + private val handler = Handler(Looper.getMainLooper()) + private val adapter: BluetoothAdapter? = + (appContext.getSystemService(Context.BLUETOOTH_SERVICE) as? BluetoothManager)?.adapter + + private var callback: ScanCallback? = null + private var timeoutTask: Runnable? = null + + val isBluetoothEnabled: Boolean get() = adapter?.isEnabled == true + + var isScanning: Boolean = false + private set + + /** + * Raw advertisements delivered during the last scan, counted before the "has a name" filter. + * Zero while devices are clearly nearby points at a permission problem rather than at the + * filter, so it is worth logging. + */ + var advertisementsSeen: Int = 0 + private set + + /** + * Android 11 and below refuse to report scan results while location services are off, and do + * so silently. Returns a message describing the problem, or null when scanning can proceed. + */ + fun blockingCondition(): String? { + if (adapter == null) return "This device has no Bluetooth adapter" + if (!adapter.isEnabled) return "Bluetooth is off" + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) return null + val lm = appContext.getSystemService(Context.LOCATION_SERVICE) as? LocationManager + ?: return null + return if (LocationManagerCompat.isLocationEnabled(lm)) { + null + } else { + "Location services are off — Android 11 and below need them for BLE scanning" + } + } + + /** + * Starts a scan. [onResult] fires for every named advertisement (repeatedly for the same + * device as the RSSI updates); [onFinished] fires exactly once when the scan ends. + */ + fun start( + timeoutMs: Long, + onResult: (ScannedDevice) -> Unit, + onFinished: (error: String?) -> Unit, + ) { + stop() + advertisementsSeen = 0 + blockingCondition()?.let { + onFinished(it) + return + } + val scanner = adapter?.bluetoothLeScanner + if (scanner == null) { + onFinished("Bluetooth LE scanner unavailable") + return + } + + val smpUuid = ParcelUuid(VesiSeekUuids.SMP_SERVICE) + val cb = object : ScanCallback() { + override fun onScanResult(callbackType: Int, result: ScanResult) { + advertisementsSeen++ + val name = try { + result.scanRecord?.deviceName ?: result.device.name + } catch (_: SecurityException) { + null + } ?: return + if (name.isEmpty()) return + val inDfu = result.scanRecord?.serviceUuids?.contains(smpUuid) == true + handler.post { onResult(ScannedDevice(result.device, name, result.rssi, inDfu)) } + } + + override fun onScanFailed(errorCode: Int) { + handler.post { + isScanning = false + callback = null + onFinished("Scan failed (error $errorCode)") + } + } + } + + callback = cb + isScanning = true + try { + val settings = ScanSettings.Builder() + .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) + .build() + scanner.startScan(null, settings, cb) + } catch (e: Exception) { + isScanning = false + callback = null + onFinished("Scan could not be started: ${e.message}") + return + } + + val task = Runnable { + stop() + onFinished(null) + } + timeoutTask = task + handler.postDelayed(task, timeoutMs) + } + + fun stop() { + timeoutTask?.let { handler.removeCallbacks(it) } + timeoutTask = null + callback?.let { cb -> + try { + adapter?.bluetoothLeScanner?.stopScan(cb) + } catch (_: Exception) { + // Adapter may have been turned off while scanning. + } + } + callback = null + isScanning = false + } +} diff --git a/app/src/main/java/com/medithings/vesiscan/firmware/DfuManager.kt b/app/src/main/java/com/medithings/vesiscan/firmware/DfuManager.kt new file mode 100644 index 0000000..cae7a0e --- /dev/null +++ b/app/src/main/java/com/medithings/vesiscan/firmware/DfuManager.kt @@ -0,0 +1,458 @@ +/* + * MEDiDFU — VesiSeek firmware updater + * + * The update state machine: NUS connect -> mdf? -> re-scan for SMP -> MCUmgr upload. + * Ported from the Go host tool at D:\mt_project\vesiseek_ble_dfu. + * + * Author: Charles KWON OhJun + * MEDiThings Inc. + */ +package com.medithings.vesiscan.firmware +import android.annotation.SuppressLint +import android.bluetooth.BluetoothDevice +import android.content.Context +import android.os.Handler +import android.os.Looper +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.mutableStateOf +import com.medithings.vesiscan.firmware.BleScanner +import com.medithings.vesiscan.firmware.NusConnection +import com.medithings.vesiscan.firmware.NusPacket +import com.medithings.vesiscan.firmware.ScannedDevice +import io.runtime.mcumgr.ble.McuMgrBleTransport +import io.runtime.mcumgr.dfu.FirmwareUpgradeCallback +import io.runtime.mcumgr.dfu.FirmwareUpgradeController +import io.runtime.mcumgr.dfu.mcuboot.FirmwareUpgradeManager +import io.runtime.mcumgr.dfu.mcuboot.model.ImageSet +import io.runtime.mcumgr.exception.McuMgrException +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale + +enum class DfuPhase { + IDLE, + SCANNING, + CONNECTING, + CONNECTED, + ENTERING_DFU, + SEARCHING_DFU, + UPLOADING, + COMPLETED, + FAILED, +} + +/** + * Drives the full VesiSeek firmware update, ported from the Go host tool (`vesiseek_ble_dfu`): + * + * 1. scan and connect over NUS, + * 2. send `mdf?` — the device answers `rdf:`, drops the link and re-advertises with the SMP + * service, + * 3. re-scan and hand the device to Nordic's [FirmwareUpgradeManager], which uploads the signed + * image, marks it for test and resets. + * + * All state is Compose-observable and is only mutated on the main thread. + */ +@SuppressLint("MissingPermission") +class DfuManager(context: Context) { + + private companion object { + const val SCAN_TIMEOUT_MS = 15_000L + const val DFU_SCAN_TIMEOUT_MS = 30_000L + /** The firmware sends `rdf:` then disconnects ~100 ms later; don't wait much longer. */ + const val RDF_TIMEOUT_MS = 5_000L + /** Let the device finish re-advertising and the local stack settle before re-scanning. */ + const val RESCAN_DELAY_MS = 1_500L + const val MAX_LOG_LINES = 300 + /** nRF52 flash writes are word aligned. */ + const val MEMORY_ALIGNMENT = 4 + } + + private val appContext = context.applicationContext + private val handler = Handler(Looper.getMainLooper()) + private val scanner = BleScanner(appContext) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.US) + + private var nus: NusConnection? = null + private var transport: McuMgrBleTransport? = null + private var upgradeManager: FirmwareUpgradeManager? = null + + private var dfuEntryHandled = false + private var rdfTimeout: Runnable? = null + private val dfuCandidates = LinkedHashMap() + + // ── Observable state ──────────────────────────────────────────────────────────────────── + + val phase = mutableStateOf(DfuPhase.IDLE) + val status = mutableStateOf("Ready") + val devices = mutableStateListOf() + val logLines = mutableStateListOf() + val firmware = mutableStateOf(null) + val firmwareError = mutableStateOf(null) + val target = mutableStateOf(null) + /** Upload progress in 0f..1f. */ + val progress = mutableStateOf(0f) + val bytesSent = mutableStateOf(0) + + val isBluetoothEnabled: Boolean get() = scanner.isBluetoothEnabled + + val canStartDfu: Boolean + get() = phase.value == DfuPhase.CONNECTED && firmware.value != null + + val isBusy: Boolean + get() = phase.value in setOf( + DfuPhase.CONNECTING, DfuPhase.ENTERING_DFU, DfuPhase.SEARCHING_DFU, DfuPhase.UPLOADING, + ) + + // ── Firmware ──────────────────────────────────────────────────────────────────────────── + + fun loadFirmware() { + if (firmware.value != null) return + try { + val pkg = FirmwareLoader.loadFromAssets(appContext) + firmware.value = pkg + firmwareError.value = null + log("firmware ${pkg.imageFileName} v${pkg.version} (${pkg.sizeBytes} bytes)") + } catch (e: Exception) { + firmwareError.value = e.message ?: e.toString() + log("firmware load FAILED: ${e.message}") + } + } + + // ── Scan / connect ────────────────────────────────────────────────────────────────────── + + fun startScan() { + if (isBusy) return + devices.clear() + phase.value = DfuPhase.SCANNING + status.value = "Scanning…" + log("scanning ${SCAN_TIMEOUT_MS / 1000}s…") + scanner.start( + timeoutMs = SCAN_TIMEOUT_MS, + onResult = { found -> + val index = devices.indexOfFirst { it.address == found.address } + if (index >= 0) devices[index] = found else devices.add(found) + }, + onFinished = { error -> + if (phase.value != DfuPhase.SCANNING) return@start + phase.value = DfuPhase.IDLE + if (error != null) { + status.value = error + log("scan error: $error") + } else { + status.value = "Scan finished — ${devices.size} device(s)" + log("scan finished: ${devices.size} named device(s), " + + "${scanner.advertisementsSeen} advertisement(s) seen") + if (scanner.advertisementsSeen == 0) { + log("no advertisements at all — check the Nearby devices permission") + } + } + }, + ) + } + + /** Non-null when something outside the app prevents scanning (adapter off, location off). */ + fun bleBlockingCondition(): String? = scanner.blockingCondition() + + fun stopScan() { + scanner.stop() + if (phase.value == DfuPhase.SCANNING) { + phase.value = DfuPhase.IDLE + status.value = "Scan stopped" + } + } + + fun connect(device: ScannedDevice) { + if (isBusy) return + scanner.stop() + closeNus() + + target.value = device + phase.value = DfuPhase.CONNECTING + status.value = "Connecting to ${device.name}…" + log("connecting to ${device.name} (${device.address})") + + nus = NusConnection( + context = appContext, + onReady = { + if (phase.value != DfuPhase.CONNECTING) return@NusConnection + phase.value = DfuPhase.CONNECTED + status.value = "Connected to ${device.name}" + // Drop the scan results: the connected device is shown in the status card, and + // leaving the stale entries would offer a Connect button for other devices while + // a link is already up. + devices.clear() + log("NUS ready") + }, + onNotify = ::onNusNotification, + onDisconnected = ::onNusDisconnected, + onError = { message -> + if (phase.value == DfuPhase.CONNECTING || phase.value == DfuPhase.CONNECTED) { + fail(message) + } else { + log("BLE: $message") + } + }, + ).also { it.connect(device.device) } + } + + fun disconnect() { + closeNus() + if (phase.value == DfuPhase.CONNECTED || phase.value == DfuPhase.CONNECTING) { + phase.value = DfuPhase.IDLE + status.value = "Disconnected" + log("disconnected") + } + } + + // ── DFU ───────────────────────────────────────────────────────────────────────────────── + + fun startDfu() { + val pkg = firmware.value + if (phase.value != DfuPhase.CONNECTED || pkg == null) return + val connection = nus ?: return + + progress.value = 0f + bytesSent.value = 0 + dfuEntryHandled = false + dfuCandidates.clear() + phase.value = DfuPhase.ENTERING_DFU + status.value = "Entering DFU mode…" + log("sending mdf? (enter DFU / SMP advertising)") + + if (!connection.send(NusPacket.enterDfu())) { + fail("mdf? write failed") + return + } + + // The device answers rdf: and then drops the link on its own. Either event moves us on; + // the timeout covers the case where the disconnect beats the notification. + val timeout = Runnable { + if (dfuEntryHandled) return@Runnable + log("no rdf: response within ${RDF_TIMEOUT_MS / 1000}s — continuing anyway") + proceedToDfuScan() + } + rdfTimeout = timeout + handler.postDelayed(timeout, RDF_TIMEOUT_MS) + } + + private fun onNusNotification(packet: ByteArray) { + val tag = NusPacket.tagOf(packet) + if (tag == null) { + log("rx: bad CRC (${packet.size} bytes)") + return + } + if (phase.value == DfuPhase.ENTERING_DFU && tag == "rdf:") { + // Payload is a u16 status: 0x0000 accepted, 0xFFFF already in DFU advertising. + val already = packet.size >= 6 && + packet[4] == 0xFF.toByte() && packet[5] == 0xFF.toByte() + log(if (already) "rdf: device was already in DFU mode" else "rdf: DFU mode accepted") + handler.postDelayed({ proceedToDfuScan() }, 500) + } else { + log("rx: $tag") + } + } + + private fun onNusDisconnected() { + when (phase.value) { + DfuPhase.ENTERING_DFU -> { + log("device disconnected (switching to SMP advertising)") + proceedToDfuScan() + } + + DfuPhase.CONNECTING, DfuPhase.CONNECTED -> fail("device disconnected") + else -> Unit + } + } + + /** Tears down the NUS link and starts looking for the device in DFU mode. Runs once. */ + private fun proceedToDfuScan() { + if (dfuEntryHandled) return + dfuEntryHandled = true + rdfTimeout?.let { handler.removeCallbacks(it) } + rdfTimeout = null + closeNus() + + phase.value = DfuPhase.SEARCHING_DFU + status.value = "Looking for the device in DFU mode…" + handler.postDelayed({ scanForDfuDevice() }, RESCAN_DELAY_MS) + } + + private fun scanForDfuDevice() { + if (phase.value != DfuPhase.SEARCHING_DFU) return + val wanted = target.value + log("scanning for SMP advertising (up to ${DFU_SCAN_TIMEOUT_MS / 1000}s)…") + + scanner.start( + timeoutMs = DFU_SCAN_TIMEOUT_MS, + onResult = { found -> + if (!found.inDfuMode || phase.value != DfuPhase.SEARCHING_DFU) return@start + dfuCandidates[found.address] = found + if (wanted == null || found.name == wanted.name || found.address == wanted.address) { + scanner.stop() + log("found ${found.name} (${found.address}) in DFU mode") + startUpload(found.device) + } + }, + onFinished = { error -> + if (phase.value != DfuPhase.SEARCHING_DFU) return@start + // The device may advertise under a different address after the reset. If exactly + // one SMP device showed up, it is unambiguous — use it. + val onlyCandidate = dfuCandidates.values.singleOrNull() + when { + error != null -> fail(error) + onlyCandidate != null -> { + log("no name match; using the only SMP device found: ${onlyCandidate.name}") + startUpload(onlyCandidate.device) + } + + else -> fail("device not found in DFU mode — is it still advertising?") + } + }, + ) + } + + private fun startUpload(device: BluetoothDevice) { + val pkg = firmware.value ?: run { + fail("firmware not loaded") + return + } + + phase.value = DfuPhase.UPLOADING + status.value = "Uploading…" + log("uploading ${pkg.sizeBytes} bytes over SMP") + + val bleTransport = McuMgrBleTransport(appContext, device).apply { + setLoggingEnabled(true) + } + transport = bleTransport + + val manager = FirmwareUpgradeManager(bleTransport, upgradeCallback).apply { + // TEST_ONLY matches the Go tool: mark the image for test, then reset. TEST_AND_CONFIRM + // is not usable here because the device advertises NUS again after rebooting, so the + // library could never reconnect over SMP to send the confirm. + setMode(FirmwareUpgradeManager.Mode.TEST_ONLY) + } + upgradeManager = manager + + val settings = FirmwareUpgradeManager.Settings.Builder() + .setMemoryAlignment(MEMORY_ALIGNMENT) + .setWindowCapacity(1) + .build() + + try { + manager.start(ImageSet().add(pkg.image), settings) + } catch (e: McuMgrException) { + fail("image rejected: ${e.message}") + } + } + + fun cancelDfu() { + upgradeManager?.takeIf { it.isInProgress }?.cancel() + } + + private val upgradeCallback = object : FirmwareUpgradeCallback { + + override fun onUpgradeStarted(controller: FirmwareUpgradeController?) { + log("SMP upgrade started") + } + + override fun onStateChanged( + prevState: FirmwareUpgradeManager.State?, + newState: FirmwareUpgradeManager.State?, + ) { + log("state: ${newState?.name ?: "?"}") + status.value = when (newState) { + FirmwareUpgradeManager.State.VALIDATE -> "Validating image…" + FirmwareUpgradeManager.State.UPLOAD -> "Uploading…" + FirmwareUpgradeManager.State.TEST -> "Marking image for test…" + FirmwareUpgradeManager.State.RESET -> "Resetting device…" + FirmwareUpgradeManager.State.CONFIRM -> "Confirming image…" + else -> status.value + } + } + + override fun onUploadProgressChanged(sent: Int, imageSize: Int, timestamp: Long) { + bytesSent.value = sent + progress.value = if (imageSize > 0) sent.toFloat() / imageSize else 0f + } + + override fun onUpgradeCompleted() { + progress.value = 1f + phase.value = DfuPhase.COMPLETED + status.value = "Done — device is rebooting into the new image" + log("DFU complete; MCUboot will swap on boot") + releaseTransport() + } + + override fun onUpgradeFailed( + state: FirmwareUpgradeManager.State?, + error: McuMgrException?, + ) { + fail("DFU failed in ${state?.name ?: "?"}: ${error?.message ?: error.toString()}") + } + + override fun onUpgradeCanceled(state: FirmwareUpgradeManager.State?) { + phase.value = DfuPhase.FAILED + status.value = "DFU canceled" + log("DFU canceled in ${state?.name ?: "?"}") + releaseTransport() + } + } + + // ── Lifecycle / helpers ───────────────────────────────────────────────────────────────── + + fun reset() { + scanner.stop() + closeNus() + releaseTransport() + rdfTimeout?.let { handler.removeCallbacks(it) } + rdfTimeout = null + dfuEntryHandled = false + dfuCandidates.clear() + devices.clear() + target.value = null + progress.value = 0f + bytesSent.value = 0 + phase.value = DfuPhase.IDLE + status.value = "Ready" + } + + fun shutdown() { + scanner.stop() + closeNus() + releaseTransport() + rdfTimeout?.let { handler.removeCallbacks(it) } + rdfTimeout = null + } + + private fun closeNus() { + nus?.close() + nus = null + } + + private fun releaseTransport() { + upgradeManager = null + transport?.let { + try { + it.release() + } catch (_: Exception) { + // Already released or never connected. + } + } + transport = null + } + + private fun fail(message: String) { + phase.value = DfuPhase.FAILED + status.value = message + log("FAILED: $message") + scanner.stop() + closeNus() + releaseTransport() + } + + private fun log(message: String) { + logLines.add("${timeFormat.format(Date())} $message") + while (logLines.size > MAX_LOG_LINES) logLines.removeAt(0) + } +} diff --git a/app/src/main/java/com/medithings/vesiscan/firmware/DfuNus.kt b/app/src/main/java/com/medithings/vesiscan/firmware/DfuNus.kt new file mode 100644 index 0000000..f02807d --- /dev/null +++ b/app/src/main/java/com/medithings/vesiscan/firmware/DfuNus.kt @@ -0,0 +1,77 @@ +/* + * MEDiDFU — VesiSeek firmware updater + * + * VesiSeek BLE identifiers and the NUS command framing shared with the firmware. + * + * Author: Charles KWON OhJun + * MEDiThings Inc. + */ +package com.medithings.vesiscan.firmware +import java.util.UUID + +/** + * VesiSeek BLE identifiers. + * + * During normal operation the device advertises the Nordic UART Service. After the `mdf?` command + * it disconnects and re-advertises with the Zephyr SMP service instead, keeping the same + * advertised name (its serial number). + */ +object VesiSeekUuids { + val NUS_SERVICE: UUID = UUID.fromString("6E400001-B5A3-F393-E0A9-E50E24DCCA9E") + /** host -> device (write) */ + val NUS_WRITE: UUID = UUID.fromString("6E400002-B5A3-F393-E0A9-E50E24DCCA9E") + /** device -> host (notify) */ + val NUS_NOTIFY: UUID = UUID.fromString("6E400003-B5A3-F393-E0A9-E50E24DCCA9E") + val CCCD: UUID = UUID.fromString("00002902-0000-1000-8000-00805F9B34FB") + /** Zephyr SMP-over-BLE service, advertised only in DFU mode. */ + val SMP_SERVICE: UUID = UUID.fromString("8D53DC1D-1DB7-4CD3-868B-8A527460AA84") +} + +/** + * CRC-16/CCITT (poly 0x1021, init 0xFFFF) — byte-for-byte identical to the firmware's + * `cmd_crc16_compute` (Nordic SDK `crc16_compute`). + */ +object Crc16 { + fun compute(data: ByteArray): Int { + var crc = 0xFFFF + for (byte in data) { + crc = crc xor ((byte.toInt() and 0xFF) shl 8) + repeat(8) { + crc = if ((crc and 0x8000) != 0) (crc shl 1) xor 0x1021 else crc shl 1 + crc = crc and 0xFFFF + } + } + return crc + } + + /** Appends the CRC little-endian, matching the firmware's packet layout. */ + fun appendTo(data: ByteArray): ByteArray { + val crc = compute(data) + return data + byteArrayOf((crc and 0xFF).toByte(), ((crc shr 8) and 0xFF).toByte()) + } +} + +/** NUS packet framing: `[TAG 4B][DATA N][CRC16 2B little-endian]`. */ +object NusPacket { + + fun build(tag: String, data: ByteArray = ByteArray(0)): ByteArray { + require(tag.length == 4) { "tag must be 4 characters, got '$tag'" } + return Crc16.appendTo(tag.toByteArray(Charsets.US_ASCII) + data) + } + + /** + * Enter-DFU command. The firmware ignores the payload but the command dispatcher needs at + * least one data byte, so a single 0x00 is sent — the same packet the Go host tool uses. + */ + fun enterDfu(): ByteArray = build("mdf?", byteArrayOf(0x00)) + + /** Returns the 4-character response tag, or null if the frame is too short or the CRC fails. */ + fun tagOf(packet: ByteArray): String? { + if (packet.size < 6) return null + val body = packet.copyOfRange(0, packet.size - 2) + val received = (packet[packet.size - 2].toInt() and 0xFF) or + ((packet[packet.size - 1].toInt() and 0xFF) shl 8) + if (Crc16.compute(body) != received) return null + return String(packet, 0, 4, Charsets.US_ASCII) + } +} diff --git a/app/src/main/java/com/medithings/vesiscan/firmware/DfuNusConnection.kt b/app/src/main/java/com/medithings/vesiscan/firmware/DfuNusConnection.kt new file mode 100644 index 0000000..9a5f4dc --- /dev/null +++ b/app/src/main/java/com/medithings/vesiscan/firmware/DfuNusConnection.kt @@ -0,0 +1,193 @@ +/* + * MEDiDFU — VesiSeek firmware updater + * + * GATT client for the Nordic UART Service command channel, used only to hand the device + * into DFU mode. The firmware image itself travels over SMP, not over this link. + * + * Author: Charles KWON OhJun + * MEDiThings Inc. + */ +package com.medithings.vesiscan.firmware +import android.annotation.SuppressLint +import android.bluetooth.BluetoothDevice +import android.bluetooth.BluetoothGatt +import android.bluetooth.BluetoothGattCallback +import android.bluetooth.BluetoothGattCharacteristic +import android.bluetooth.BluetoothGattDescriptor +import android.bluetooth.BluetoothProfile +import android.bluetooth.BluetoothStatusCodes +import android.content.Context +import android.os.Build +import android.os.Handler +import android.os.Looper + +/** + * GATT client for the VesiSeek NUS command channel. + * + * Mirrors the connection sequence of the VesiScan Basic app: connect, negotiate MTU 247, discover + * services, then enable notifications on the TX characteristic. [onReady] fires once the CCCD + * write completes, at which point [send] may be used. + * + * All callbacks are delivered on the main thread. + */ +@SuppressLint("MissingPermission") +class NusConnection( + context: Context, + private val onReady: () -> Unit, + private val onNotify: (ByteArray) -> Unit, + private val onDisconnected: () -> Unit, + private val onError: (String) -> Unit, +) { + private val appContext = context.applicationContext + private val handler = Handler(Looper.getMainLooper()) + + @Volatile private var gatt: BluetoothGatt? = null + @Volatile private var writeChar: BluetoothGattCharacteristic? = null + @Volatile private var released = false + + val isReady: Boolean get() = writeChar != null + + fun connect(device: BluetoothDevice) { + released = false + gatt = device.connectGatt(appContext, false, gattCallback, BluetoothDevice.TRANSPORT_LE) + if (gatt == null) onError("connectGatt() returned null") + } + + fun send(data: ByteArray): Boolean { + val g = gatt ?: return false + val ch = writeChar ?: return false + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + g.writeCharacteristic(ch, data, BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE) == + BluetoothStatusCodes.SUCCESS + } else { + @Suppress("DEPRECATION") + run { + ch.value = data + ch.writeType = BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE + g.writeCharacteristic(ch) + } + } + } + + /** + * Tears the connection down. Further GATT callbacks are ignored, so [onDisconnected] will not + * fire for a close initiated here. Safe to call more than once. + */ + fun close() { + released = true + writeChar = null + gatt?.let { g -> + try { + g.disconnect() + g.close() + } catch (_: Exception) { + // Nothing useful to do if the stack already dropped the client. + } + } + gatt = null + } + + private val gattCallback = object : BluetoothGattCallback() { + + override fun onConnectionStateChange(g: BluetoothGatt, status: Int, newState: Int) { + if (released) return + handler.post { + if (released) return@post + when { + newState == BluetoothProfile.STATE_CONNECTED && + status == BluetoothGatt.GATT_SUCCESS -> { + // Service discovery continues from onMtuChanged. + if (!g.requestMtu(247)) g.discoverServices() + } + + newState == BluetoothProfile.STATE_DISCONNECTED -> { + writeChar = null + onDisconnected() + } + + else -> onError("GATT error (status $status)") + } + } + } + + override fun onMtuChanged(g: BluetoothGatt, mtu: Int, status: Int) { + if (released) return + handler.post { if (!released) g.discoverServices() } + } + + override fun onServicesDiscovered(g: BluetoothGatt, status: Int) { + if (released) return + handler.post { + if (released) return@post + if (status != BluetoothGatt.GATT_SUCCESS) { + onError("Service discovery failed (status $status)") + return@post + } + val service = g.getService(VesiSeekUuids.NUS_SERVICE) + if (service == null) { + onError("NUS service not found on this device") + return@post + } + writeChar = service.getCharacteristic(VesiSeekUuids.NUS_WRITE) + val notifyChar = service.getCharacteristic(VesiSeekUuids.NUS_NOTIFY) + if (writeChar == null || notifyChar == null) { + onError("NUS characteristics not found") + return@post + } + g.setCharacteristicNotification(notifyChar, true) + val cccd = notifyChar.getDescriptor(VesiSeekUuids.CCCD) + if (cccd == null) { + // No CCCD to write — notifications are already enabled locally. + onReady() + return@post + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + g.writeDescriptor(cccd, BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE) + } else { + @Suppress("DEPRECATION") + run { + cccd.value = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE + g.writeDescriptor(cccd) + } + } + } + } + + override fun onDescriptorWrite( + g: BluetoothGatt, + descriptor: BluetoothGattDescriptor, + status: Int, + ) { + if (released || descriptor.uuid != VesiSeekUuids.CCCD) return + handler.post { + if (released) return@post + if (status == BluetoothGatt.GATT_SUCCESS) { + onReady() + } else { + onError("Enabling notifications failed (status $status)") + } + } + } + + override fun onCharacteristicChanged( + g: BluetoothGatt, + characteristic: BluetoothGattCharacteristic, + value: ByteArray, + ) { + if (released || characteristic.uuid != VesiSeekUuids.NUS_NOTIFY) return + handler.post { if (!released) onNotify(value) } + } + + @Deprecated("Superseded by the API 33 overload") + override fun onCharacteristicChanged( + g: BluetoothGatt, + characteristic: BluetoothGattCharacteristic, + ) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) return + if (released || characteristic.uuid != VesiSeekUuids.NUS_NOTIFY) return + @Suppress("DEPRECATION") + val value = characteristic.value ?: return + handler.post { if (!released) onNotify(value) } + } + } +} diff --git a/app/src/main/java/com/medithings/vesiscan/firmware/FirmwarePackage.kt b/app/src/main/java/com/medithings/vesiscan/firmware/FirmwarePackage.kt new file mode 100644 index 0000000..f73e31f --- /dev/null +++ b/app/src/main/java/com/medithings/vesiscan/firmware/FirmwarePackage.kt @@ -0,0 +1,111 @@ +/* + * MEDiDFU — VesiSeek firmware updater + * + * Unpacks the DFU archive bundled in assets/ and extracts the signed MCUboot image. + * + * Author: Charles KWON OhJun + * MEDiThings Inc. + */ +package com.medithings.vesiscan.firmware +import android.content.Context +import org.json.JSONObject +import java.io.ByteArrayOutputStream +import java.util.zip.ZipInputStream + +/** A signed MCUboot application image unpacked from a `dfu_application_*.zip`. */ +data class FirmwarePackage( + val assetName: String, + val imageFileName: String, + /** `version_MCUBOOT` from the manifest, e.g. "0.0.2+35". Empty when the manifest omits it. */ + val version: String, + val image: ByteArray, +) { + val sizeBytes: Int get() = image.size + + // Generated equals/hashCode would compare the ByteArray by reference; identify the package by + // its source instead. + override fun equals(other: Any?): Boolean = + this === other || (other is FirmwarePackage && + assetName == other.assetName && + imageFileName == other.imageFileName && + version == other.version && + image.size == other.image.size) + + override fun hashCode(): Int = + (((assetName.hashCode() * 31 + imageFileName.hashCode()) * 31) + version.hashCode()) * 31 + + image.size +} + +/** + * Reads a DFU zip bundled in `assets/`. + * + * The zip is the nRF Connect SDK / Zephyr layout: a `manifest.json` listing the images plus the + * signed binaries themselves. The application image (`image_index` 0, or `type` "application") is + * the one uploaded over SMP. + */ +object FirmwareLoader { + + const val DEFAULT_ASSET = "dfu_application_2+35.zip" + + private const val MANIFEST = "manifest.json" + + @Throws(IllegalStateException::class) + fun loadFromAssets(context: Context, assetName: String = DEFAULT_ASSET): FirmwarePackage { + val entries = readZipEntries(context, assetName) + + val manifestBytes = entries.entries + .firstOrNull { it.key.equals(MANIFEST, ignoreCase = true) } + ?.value + ?: error("$MANIFEST not found in $assetName") + + val files = JSONObject(String(manifestBytes, Charsets.UTF_8)).optJSONArray("files") + ?: error("$MANIFEST has no \"files\" array") + check(files.length() > 0) { "$MANIFEST lists no images" } + + var chosen = files.getJSONObject(0) + for (i in 0 until files.length()) { + val entry = files.getJSONObject(i) + if (entry.optString("image_index") == "0" || + entry.optString("type").equals("application", ignoreCase = true) + ) { + chosen = entry + break + } + } + + val fileName = chosen.optString("file") + check(fileName.isNotEmpty()) { "$MANIFEST entry has no \"file\" field" } + val image = entries[fileName] ?: error("$fileName listed in $MANIFEST but missing from the zip") + check(image.isNotEmpty()) { "$fileName is empty" } + + return FirmwarePackage( + assetName = assetName, + imageFileName = fileName, + version = chosen.optString("version_MCUBOOT"), + image = image, + ) + } + + private fun readZipEntries(context: Context, assetName: String): Map { + val entries = LinkedHashMap() + ZipInputStream(context.assets.open(assetName)).use { zip -> + val buffer = ByteArray(16 * 1024) + while (true) { + val entry = zip.nextEntry ?: break + if (entry.isDirectory) { + zip.closeEntry() + continue + } + val out = ByteArrayOutputStream() + while (true) { + val read = zip.read(buffer) + if (read < 0) break + out.write(buffer, 0, read) + } + entries[entry.name] = out.toByteArray() + zip.closeEntry() + } + } + return entries + } +} diff --git a/app/src/main/java/com/medithings/vesiscan/firmware/ui/FirmwareUpdateView.kt b/app/src/main/java/com/medithings/vesiscan/firmware/ui/FirmwareUpdateView.kt new file mode 100644 index 0000000..51a7a5a --- /dev/null +++ b/app/src/main/java/com/medithings/vesiscan/firmware/ui/FirmwareUpdateView.kt @@ -0,0 +1,349 @@ +/* + * VesiScan firmware updater — MEDiDFU 이식 (2026-08-03). + * Author: Charles KWON OhJun · adapt: dw.jang + * + * VesiScan 앱 통합: 설정 > 앱정보 > "펌웨어 업데이트" 진입점. + * FirmwareUpdateScreen() = 권한 · manager 라이프사이클 처리하는 host composable. + * DfuScreen() = 원본 UI (scan · connect · upload · log). + */ +package com.medithings.vesiscan.firmware.ui +import android.Manifest +import android.content.pm.PackageManager +import android.os.Build +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material3.Button +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.core.content.ContextCompat +import com.medithings.vesiscan.firmware.ScannedDevice +import com.medithings.vesiscan.firmware.DfuManager +import com.medithings.vesiscan.firmware.DfuPhase +import kotlin.math.roundToInt + +/** + * VesiScan 통합용 host — 권한 · manager 생성/해제 · 뒤로가기 처리. + * MEDiDFU 의 MainActivity.DfuApp() 상당. + */ +@Composable +fun FirmwareUpdateScreen(onBack: () -> Unit, modifier: Modifier = Modifier) { + val context = LocalContext.current + val manager = remember { DfuManager(context) } + + val perms: Array = remember { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + arrayOf(Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT) + } else { + arrayOf(Manifest.permission.ACCESS_FINE_LOCATION) + } + } + + var granted by remember { + mutableStateOf(perms.all { + ContextCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED + }) + } + val launcher = rememberLauncherForActivityResult( + ActivityResultContracts.RequestMultiplePermissions() + ) { result -> granted = result.values.all { it } } + + LaunchedEffect(Unit) { + manager.loadFirmware() + if (!granted) launcher.launch(perms) + } + DisposableEffect(Unit) { onDispose { manager.shutdown() } } + + Column(modifier = modifier.fillMaxSize()) { + Row( + modifier = Modifier.fillMaxWidth().padding(horizontal = 4.dp, vertical = 4.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + IconButton(onClick = onBack) { + Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "뒤로") + } + Text("펌웨어 업데이트", style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold) + } + if (granted) { + DfuScreen(manager = manager, modifier = Modifier.fillMaxSize()) + } else { + Column( + modifier = Modifier.fillMaxSize().padding(24.dp), + verticalArrangement = Arrangement.spacedBy(12.dp, Alignment.CenterVertically), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Text( + "펌웨어 업데이트에는 Bluetooth 권한이 필요합니다.", + style = MaterialTheme.typography.bodyMedium, + ) + Button(onClick = { launcher.launch(perms) }) { Text("권한 허용") } + } + } + } +} + +@Composable +fun DfuScreen(manager: DfuManager, modifier: Modifier = Modifier) { + val phase by manager.phase + val status by manager.status + val firmware by manager.firmware + val firmwareError by manager.firmwareError + val progress by manager.progress + val bytesSent by manager.bytesSent + val target by manager.target + + Column( + modifier = modifier + .fillMaxSize() + .padding(16.dp), + verticalArrangement = Arrangement.spacedBy(12.dp), + ) { + Text("MEDiDFU", style = MaterialTheme.typography.headlineSmall) + + // ── Anything outside the app that would silently break scanning ─────────────────── + val blocker = manager.bleBlockingCondition() + if (blocker != null) { + Card( + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors( + containerColor = MaterialTheme.colorScheme.errorContainer, + ), + ) { + Text( + blocker, + modifier = Modifier.padding(12.dp), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onErrorContainer, + ) + } + } + + // ── Firmware bundled in the APK ──────────────────────────────────────────────────── + Card(modifier = Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp)) { + Text("Firmware (bundled)", style = MaterialTheme.typography.labelLarge) + Spacer(Modifier.height(4.dp)) + val fw = firmware + when { + fw != null -> { + Text(fw.assetName, style = MaterialTheme.typography.bodyMedium) + Text( + "${fw.imageFileName} · v${fw.version.ifEmpty { "?" }} · ${fw.sizeBytes} bytes", + style = MaterialTheme.typography.bodySmall, + ) + } + + firmwareError != null -> Text( + firmwareError ?: "", + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.error, + ) + + else -> Text("Loading…", style = MaterialTheme.typography.bodySmall) + } + } + } + + // ── Status + progress ───────────────────────────────────────────────────────────── + Card(modifier = Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp)) { + Text(phase.name, style = MaterialTheme.typography.labelLarge) + Spacer(Modifier.height(4.dp)) + Text(status, style = MaterialTheme.typography.bodyMedium) + target?.let { + Text( + "${it.name} · ${it.address}", + style = MaterialTheme.typography.bodySmall, + ) + } + if (phase == DfuPhase.UPLOADING || phase == DfuPhase.COMPLETED) { + Spacer(Modifier.height(8.dp)) + LinearProgressIndicator( + progress = { progress }, + modifier = Modifier.fillMaxWidth(), + ) + Spacer(Modifier.height(4.dp)) + val total = firmware?.sizeBytes ?: 0 + Text( + "${(progress * 100).roundToInt()}% ($bytesSent / $total bytes)", + style = MaterialTheme.typography.bodySmall, + ) + } + } + } + + // ── Actions ─────────────────────────────────────────────────────────────────────── + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + // Keyed off the phase, not the scanner: the DFU re-scan also runs the scanner, and + // stopping that one from here would abort the update. + if (phase == DfuPhase.SCANNING) { + OutlinedButton(onClick = { manager.stopScan() }) { Text("Stop") } + } else { + OutlinedButton( + onClick = { manager.startScan() }, + enabled = !manager.isBusy, + ) { Text("Scan") } + } + + Button( + onClick = { manager.startDfu() }, + enabled = manager.canStartDfu, + ) { Text("Start DFU") } + + if (phase == DfuPhase.CONNECTED) { + OutlinedButton(onClick = { manager.disconnect() }) { Text("Disconnect") } + } + if (phase == DfuPhase.UPLOADING) { + OutlinedButton(onClick = { manager.cancelDfu() }) { Text("Cancel") } + } + if (phase == DfuPhase.COMPLETED || phase == DfuPhase.FAILED) { + OutlinedButton(onClick = { manager.reset() }) { Text("Reset") } + } + } + + // ── Discovered devices ──────────────────────────────────────────────────────────── + Text( + "Devices (${manager.devices.size})", + style = MaterialTheme.typography.labelLarge, + ) + Card(modifier = Modifier.fillMaxWidth().heightIn(min = 80.dp, max = 220.dp)) { + if (manager.devices.isEmpty()) { + Text( + when (phase) { + DfuPhase.CONNECTED -> "Connected — disconnect to scan again." + DfuPhase.SCANNING -> "Scanning…" + else -> "No devices yet — tap Scan." + }, + modifier = Modifier.padding(12.dp), + style = MaterialTheme.typography.bodySmall, + ) + } else { + LazyColumn { + items(manager.devices, key = { it.address }) { device -> + DeviceRow( + device = device, + enabled = !manager.isBusy, + onClick = { manager.connect(device) }, + ) + HorizontalDivider() + } + } + } + } + + // ── Log ─────────────────────────────────────────────────────────────────────────── + Text("Log", style = MaterialTheme.typography.labelLarge) + LogView( + lines = manager.logLines, + modifier = Modifier.fillMaxWidth().weight(1f), + ) + } +} + +@Composable +private fun DeviceRow(device: ScannedDevice, enabled: Boolean, onClick: () -> Unit) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 12.dp, vertical = 8.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Column(Modifier.weight(1f)) { + Row(verticalAlignment = Alignment.CenterVertically) { + Text(device.name, style = MaterialTheme.typography.bodyMedium) + if (device.inDfuMode) { + Spacer(Modifier.width(6.dp)) + Surface( + color = MaterialTheme.colorScheme.tertiaryContainer, + shape = RoundedCornerShape(4.dp), + ) { + Text( + "DFU", + modifier = Modifier.padding(horizontal = 4.dp), + style = MaterialTheme.typography.labelSmall, + color = MaterialTheme.colorScheme.onTertiaryContainer, + ) + } + } + } + Text( + "${device.address} · ${device.rssi} dBm", + style = MaterialTheme.typography.bodySmall, + ) + } + Button(onClick = onClick, enabled = enabled) { Text("Connect") } + } +} + +@Composable +private fun LogView(lines: List, modifier: Modifier = Modifier) { + val listState = rememberLazyListState() + LaunchedEffect(lines.size) { + if (lines.isNotEmpty()) listState.animateScrollToItem(lines.size - 1) + } + Card( + modifier = modifier, + colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceVariant), + ) { + LazyColumn( + state = listState, + modifier = Modifier + .fillMaxSize() + .background(Color.Transparent) + .padding(8.dp), + ) { + itemsIndexed(lines) { _, line -> + Text( + line, + fontFamily = FontFamily.Monospace, + fontSize = 11.sp, + fontWeight = FontWeight.Normal, + style = MaterialTheme.typography.bodySmall, + ) + } + } + } +} diff --git a/app/src/main/java/com/medithings/vesiscan/ui/components/BatteryWarningBanner.kt b/app/src/main/java/com/medithings/vesiscan/ui/components/BatteryWarningBanner.kt index f4bb9f1..37cc70a 100644 --- a/app/src/main/java/com/medithings/vesiscan/ui/components/BatteryWarningBanner.kt +++ b/app/src/main/java/com/medithings/vesiscan/ui/components/BatteryWarningBanner.kt @@ -1,19 +1,26 @@ package com.medithings.vesiscan.ui.components import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.BatteryAlert +import androidx.compose.material.icons.filled.Close import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -32,16 +39,27 @@ import com.medithings.vesiscan.ble.BleManager * - 15% 이하 → 주황 경고 ("기기 배터리 부족 — 곧 충전하세요") * - 5% 이하 → 빨강 위급 ("기기 배터리 위급 — 측정이 갑자기 중단될 수 있음") * - 그 외 / 미연결 / 0% (아직 미수신) → 숨김 + * + * 상호작용 (2026-08-03 요청 · cloud-mvp aa6cc1f 이식): + * - 배너 탭 또는 X 아이콘 → 사용자가 dismiss 가능 (숨김) + * - WARNING → CRITICAL 악화 시 자동 재표시 (놓치면 위험) + * - 재연결 시 dismiss 초기화 (새 세션에는 다시 표시) */ @Composable fun BatteryWarningBanner(bleManager: BleManager, modifier: Modifier = Modifier) { val isConnected by bleManager.isConnected val batt by bleManager.batteryLevel + + var dismissed by rememberSaveable { mutableStateOf(false) } + val critical = batt in 1..CRITICAL_BATTERY_THRESHOLD + LaunchedEffect(critical) { if (critical) dismissed = false } + LaunchedEffect(isConnected) { if (!isConnected) dismissed = false } + if (!isConnected) return if (batt <= 0) return // 응답 받기 전엔 0 → false positive 방지 if (batt > LOW_BATTERY_THRESHOLD) return + if (dismissed) return - val critical = batt <= CRITICAL_BATTERY_THRESHOLD val bgColor = if (critical) Color(0xFFD32F2F) else Color(0xFFFF9500) val title = if (critical) stringResource(R.string.battery_critical_title) else stringResource(R.string.battery_low_title) val subtitle = if (critical) @@ -55,6 +73,7 @@ fun BatteryWarningBanner(bleManager: BleManager, modifier: Modifier = Modifier) .padding(horizontal = 16.dp, vertical = 6.dp) .clip(RoundedCornerShape(10.dp)) .background(bgColor) + .clickable { dismissed = true } .padding(horizontal = 12.dp, vertical = 8.dp), verticalAlignment = Alignment.CenterVertically ) { @@ -64,6 +83,12 @@ fun BatteryWarningBanner(bleManager: BleManager, modifier: Modifier = Modifier) Text(title, fontSize = 13.sp, fontWeight = FontWeight.Bold, color = Color.White) Text(subtitle, fontSize = 11.sp, color = Color.White.copy(alpha = 0.9f)) } + Spacer(modifier = Modifier.width(8.dp)) + Icon( + Icons.Default.Close, contentDescription = "닫기", + tint = Color.White.copy(alpha = 0.9f), + modifier = Modifier.size(20.dp), + ) } } diff --git a/app/src/main/java/com/medithings/vesiscan/ui/views/home/HomeView.kt b/app/src/main/java/com/medithings/vesiscan/ui/views/home/HomeView.kt index fc4fbbc..c39fadf 100644 --- a/app/src/main/java/com/medithings/vesiscan/ui/views/home/HomeView.kt +++ b/app/src/main/java/com/medithings/vesiscan/ui/views/home/HomeView.kt @@ -151,15 +151,25 @@ fun HomeView(appState: AppState) { modifier = Modifier .fillMaxWidth() .padding(horizontal = 32.dp) - .padding(bottom = 48.dp) + .padding(bottom = 8.dp) .height(48.dp), shape = RoundedCornerShape(14.dp), colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF7C3AED)) ) { Text(stringResource(R.string.home_clinical_mode_dev), color = Color.White, fontWeight = FontWeight.SemiBold) } - } else { - Spacer(modifier = Modifier.height(48.dp)) + } + // 2026-08-03 (cloud-mvp 672e679 이식): 프로브 firmware 업데이트 진입점. + TextButton( + onClick = { appState.currentScreen = com.medithings.vesiscan.AppScreen.FIRMWARE_UPDATE }, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 32.dp) + .padding(bottom = 48.dp), + ) { + Text("펌웨어 업데이트 (프로브 firmware)", + color = com.medithings.vesiscan.ui.theme.MlPrimary, + fontWeight = FontWeight.SemiBold, fontSize = 13.sp) } } } // Box (top-bar gear overlay) close diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2b9497f..03c9638 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,6 +13,8 @@ securityCrypto = "1.1.0-alpha06" rive = "9.4.2" startupRuntime = "1.2.0" lifecycleViewmodelCompose = "2.10.0" +# 2026-08-03 (cherry-pick from cloud-mvp): Firmware DFU +mcumgr = "2.5.0" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -20,6 +22,9 @@ junit = { group = "junit", name = "junit", version.ref = "junit" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } +# 2026-08-03: LocalLifecycleOwner (Compose) 및 mcumgr-ble +androidx-lifecycle-runtime-compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "lifecycleRuntimeKtx" } +mcumgr-ble = { group = "no.nordicsemi.android", name = "mcumgr-ble", version.ref = "mcumgr" } androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycleViewmodelCompose" } androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" }