From c0d891b3725a032f1bb51e0d0a85c58f363a8e09 Mon Sep 17 00:00:00 2001 From: matze19999 Date: Tue, 6 Oct 2026 22:26:27 +0200 Subject: [PATCH] Release 0.13.0 --- .gitignore | 5 + HyperDRM.manifest.json | 8 +- ..._0.12.0_arm.ipk => HyperDRM_0.13.0_arm.ipk | Bin 1204332 -> 1207634 bytes README.md | 26 +- VERSION | 2 +- app/app.js | 50 +++- app/appinfo.json | 2 +- app/index.html | 3 +- app/version.js | 2 + app/wizard.js | 4 + docs/architecture.md | 25 ++ docs/publishing-review.md | 33 +++ docs/release-0.13.0.md | 12 + native/atomic_file.h | 91 ++++++ native/calibration.h | 30 +- native/capture_loop.h | 154 +++++----- native/diagnostics.h | 6 +- native/handover.h | 14 +- native/layout_refresh.h | 20 +- native/playback.h | 39 ++- native/probe.c | 77 +++-- native/receiver_output.h | 263 ++++++++++++++++++ native/receiver_stream.h | 6 +- native/runtime_context.h | 26 ++ native/service.c | 170 ++--------- native/service_api.h | 76 +++-- native/service_calibration.h | 49 ++-- native/service_context.h | 17 ++ native/service_status.h | 106 +++---- native/source_bridge.h | 12 +- native/target.h | 42 +-- native/test_atomic_file.c | 101 +++++++ native/test_diagnostics.c | 2 +- native/test_handover.c | 2 +- native/test_json_protocol.c | 60 ++++ native/test_layout_refresh.c | 30 +- native/test_receiver_output.c | 181 ++++++++++++ native/test_receiver_stream.c | 2 +- native/test_service_lifecycle.c | 162 +++++++++++ native/test_source_bridge.c | 33 +-- native/test_target.c | 13 +- native/version.h | 2 +- package/packageinfo.json | 2 +- release.py | 8 + service/histogram-service | Bin 81868 -> 148384 bytes sync_version.py | 4 + tests/receiver-ui.test.js | 2 +- tests/test_version.py | 6 + tests/version-compatibility.test.js | 21 ++ 49 files changed, 1523 insertions(+), 478 deletions(-) rename HyperDRM_0.12.0_arm.ipk => HyperDRM_0.13.0_arm.ipk (88%) create mode 100644 app/version.js create mode 100644 docs/release-0.13.0.md create mode 100644 native/atomic_file.h create mode 100644 native/receiver_output.h create mode 100644 native/runtime_context.h create mode 100644 native/service_context.h create mode 100644 native/test_atomic_file.c create mode 100644 native/test_json_protocol.c create mode 100644 native/test_receiver_output.c create mode 100644 native/test_service_lifecycle.c create mode 100644 tests/version-compatibility.test.js diff --git a/.gitignore b/.gitignore index 0b96f60..04675b4 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,8 @@ test-spatial_image test-continuity test-receiver_stream test-source_bridge + +test-atomic_file +test-json_protocol +test-receiver_output +test-service_lifecycle diff --git a/HyperDRM.manifest.json b/HyperDRM.manifest.json index c4480df..c7e58bb 100644 --- a/HyperDRM.manifest.json +++ b/HyperDRM.manifest.json @@ -1,15 +1,15 @@ { "id": "org.webosbrew.histogramhyperion", - "version": "0.12.0", + "version": "0.13.0", "type": "web", "title": "HyperDRM", "appDescription": "Ambient lighting for webOS, Hyperion and HyperHDR", "iconUri": "https://gitea.adnau.de/matze19999/HyperDRM/raw/branch/main/app/icon.png", "sourceUrl": "https://gitea.adnau.de/matze19999/HyperDRM", "rootRequired": true, - "ipkUrl": "https://gitea.adnau.de/matze19999/HyperDRM/raw/branch/main/HyperDRM_0.12.0_arm.ipk", + "ipkUrl": "https://gitea.adnau.de/matze19999/HyperDRM/raw/branch/main/HyperDRM_0.13.0_arm.ipk", "ipkHash": { - "sha256": "b4fcc609d763b8e1a72d84484a5d454627416dde0ef51ef65ab705173e3c0810" + "sha256": "a7ab184db8c948ceb4657f093c2cf10c13df3565ff9ed4d8482dcf2d59896a0a" }, - "ipkSize": 1204332 + "ipkSize": 1207634 } diff --git a/HyperDRM_0.12.0_arm.ipk b/HyperDRM_0.13.0_arm.ipk similarity index 88% rename from HyperDRM_0.12.0_arm.ipk rename to HyperDRM_0.13.0_arm.ipk index 4c7cbc0ee0ad75c9e8dbd2e7e0e021454b71d9a0..8c21f839ab1e1abb30e4216972a326f7cb1b1892 100644 GIT binary patch delta 109359 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�)Zu=qzCrsHIoZ@sWtN(J_MH;Jxt382eF5riNU!SosXfRM;4=MssD|AC4Ut` zr^yk7?QS!~BY7|2!?EpHf3%%j`UGL=uF0#1lBKmb5gG;?s_ge5uC4%vTXJ9EVTrgK+yB>c7_Thyk|RfOoH+Q9;X9!?CO2Xv{3tMdH#doip@zq!DaSH- zP&Y!iM-^w)S7&)zN&6Acr&niJr+MB&pPw3w1Yu82-(m3_-GkxH+l38>9xHPXKCWC} zM1EBb64sO>Aih&o8UExHPRFZ%%&b8&EG;B9DG@|Uf14Tpsx4lLiE~Hgy&!7T+T=$_jr&V;qF3vB zoG~T7e)a*HjDwkStX~&)H8Lcrtw7^}~>*+>2$R(G1~W+90s_pw#t2 z6ou(U)?X8`*BXfA3xjUi$$mbQ%=rqD{mnqL^1)1cvWcv2YKtFP!;h?bM1t zjI8p34_LTmB_lMDGTr1t(|QI*RtF&0xj6`HeG5=5ePXGcf8njhwq12pm&=w`uN-SR0U=Fs-Mw#PJ}WCXM4V~c!|9Xo{3UVW+he?-n=+|r zB#bG+Wk@ZpE#{BEJVcYP`<8!VKsGMt4*W6}YDe^2v2Dn2em4HQ7{Zw%5oE6xYrjR) z=-KZ`@A|J28)8=Y0KiQ`VIy+lE_`EXND>)dj0l;41gXRh(_af2!gC5jut8z*L7VL( z5|@Jo{2-QS+~p=qQ;k%cBAfFhN-Bi~Saropk7J2z6N`Z^F(MoFq(Fa)o-x-ZcvvyMx8wE2W$K5VM*c$d{jB7M8Aqn*E5q&rywf+f%QlL|K@ti!###hxy4gtuL*M`Uz{s{4VV4}4@ z_-QE<`T7UPL5@DS)fbHAeC13|7j(ld$FDSpetS>C!Mk&s3 zQ7@lze%btsLb>nw<=_j8|FAq;;fJ5oxLh0NkEk<}Z(@J*m2)y00O{9OW1@3qb29xe z*7`~gXUrdsJnNVx`;~u)HGk0aiE5}p(S+ZJaDR1}CC>+Gzb%3#y*rlW5nXZ-5r@>n zBr~^{Ss;qkn?P($S*3LzVj#(sDe$d{f9gE;~fvw#@JcKieFm=NfKcH95#nj3%75?(YJ=`0& zr16EuI;Xd+?}|3Rue9Vakj%L?tC}_F)BcpGTGSVY{UlpTI<5=ik5G8LUrGID;5-(J z`|*F8b27Fq>~UrFU|Lhm^$hjqygZZPgXGsHHIwmf@^C~f>hMM8eGi-|&J%0#hS@wo zaZSNEA)`Mjil|E?>cMW0opj~moc(>Wa8#$f9*?|+v~;fet1O{djCc^w59;y_u=YTg z&(kGyEhVu%M2*4J<|3P;&6NOl@twMQaQJ@*Q6ye$CxPIN}~PBXCemqXuAtczzr_Il!haIEO;a3M~L5)R;qz<3G5cu8U4Vl#5p2hHSr%$ito zK``2Kms3238t@}eywMS1b`N(T+JiiuWmFtp)2<&RxRc;cun=5>2PasN;O_1&)3{53 z;O_3O6Wrb1-QD3p*7@GQ*Q#Ar`>xqDJ*&H`G<-SMXAAkI;Vr&@iE`Nu9QV=?D7mA> z>vn-G1l*Ks4vS+7OUQy{+*?ixhrCnteio6m{Ge)ZqPo)-6F=2Vm}^T1r{S5ss!`AG z1P{6CCohkxGw(_uxph1dJoJMG*q|4Bp zXO0%T?)dcY?a$lA6Wp)GY4%xrNsx)0a(Zwychv%3{?%u}49iw%!KD9X!q-Rb1yB>9 zKLE{hhHNFtbwU)Djm(P+-^btjd#ic1ZWjN_rE3a9vZ=qAbML&F+(TDf9<&GPvOPWlSpDBcc<`Q4RCY)3uYgfR5@Rb(+Ivi_iN<7EDaYO5;q$X z@4?PR51O#1)S2zonFWq7}Zw88jh!$C`uJrPhAUZ6qLIN$ifVvG6kry z1!mgh_a2zk(aBv?(Cwlj?alrSw-tZnvRii|`Ge+brz>E_9sQenEq|l^My7*ft6is6 z&7sY0V~pp3Jm0gNUx*w+CPqmRDpC{*Ba>x{$IAq(tNqiT_D^T++8vnSE-KImeC-eT zEFsgp!Bd%Vvzbq`q0`;m_NUMFfv-S!tK&hAnuuMoM^q!d$AU8%S_ey_X4}+HWm&b! z+PP?3Zl+P*#D#C1*_C|Iu(kz_BvW~r93)HdZBxX2&xk`eF+(@j`D92s_0s9oI^l|9gI$Gwq7k%l(ZbsE44m+ z0Hs=;Q$>leJsjJ=V`^loAe)h;8I|FhO$yfuh~kV)81}W`FRR?QU@r~Sl+8^bQnzCC z$$EnZwg0HzvLn7`Ls0)M>icq@X?g$=2A?s3ZUaZEW0T!V8`7h#>|(Fl$n;4N*|fhn zO2mi)@oQ)-o~p@;AZaIbCdCEN8Jg#B9O;-CiD0WoX8&7{gZ$j{KMhHJ|}2@2(1bVHv1x3b&5 z02|!bif0stVboXa@OFQ&FD)o=fKwQ$>AMXG(xUa;vNbBBl_|5;HX{{S&q#$ByM7xh zC9vnFvgane_wW<0bSzy=l!k{k&!es+i0R_lfTosw38{pUrjj=Uw1fU12CYVrs4l{t z1Ub_RW!O-BxNR>-aA6d3UD>C%zfD|JHS*(3kY>KP?k*dGGkwzGlJ z8pFz)I+s6qWe$nrBdq{nDYuSKmSA43#);LyC?1Dc*#R9jpD8H$`SX%VsW)euH)n_V z)1$aYmpJ>0%78a#tGGvwFiXfBFu{2$aa3TSB%EcxR9UFSside!WmD25FY)y}haFn) zoPA775j3V1&uJFVY8G$vS5xcr{MV0B8$mwzzY`VCFqQRY-AKX!t%g2(REa>jETYRG z$Ou|IDJ8!kchvqSxvZIB8YF9_3dmo&6g@*^gTXYE3|7AdUDm%AMkBCN7<|_U4TTX( zkbfaGSi_vZs^n!?F;ErQW>+!O<`7zpB+?b?9?@{Pf?v(X>RLl;nGqyY`wVxB%hi0Q zW}YBOJ*3s36>B3$G1r0nAEob);t7G6p}*wEf3st!@Fs{bLWo0Rw1p{HMM|JWj;!N9 z!$FV$EYVo$uDcV9DVlO@mlkRTlk_AA+uPzAh3hpL)aZy(!SW1$sWlO#;<2IzTr&*| zg+(*TT;+rV{lrYxY}zFri*CpVBd#%lOyl?_kVxgBZp_i(%LslAQd;47ZSGxxH|3csx2s^30cuUrTkoH zXdn^bLBPNW+1u$G+Q!`U265v5ux6Ud4Qx`+%p^c7Trly1G7`u8%JheY?+**LA|v%5 zmM@BoNMD4%ipf)m8ORuilo(8?m(^4<36&RoZ_-B!;f3D69iJm8l^PId_F(hIO;hyX zDOAie!1#7AUL`l{XUF1Q-Gnbj(pjkZAhbBYu0j?iG;@NMwP-0#84ryBAtxK7~B z8zIya;S|Oz{5S}iw7$Nu3Vp(#gaXuqgwB>*6mLHUY@RGC{=j(Z3vG!1`vDadDOP~y zDnF>}_gZ`%&=oz-_osLe%D=1A-|w~H2v4WcF0u|HJD0oSlo4fD9Z|N_z*t?u@i!Kl zL=|l9h|JP|fARDouPA-oo>s2bSoKJRZP)`4A~BottyO;u=R{>dZ%PRMx72~4(z?xU zc(yin`YX#=wDbo#9BK+${CEHya~#_GN{w&vlt@$oI&j}ZyV5V$nq@6PB5oSHgIH*A zBBbu!jurfsGQ7ACOlU-+xKObPIw?0nw zAN{CX*=?YWUQ|P_%?AWY<5&`na#l5ywdxU${{~DH=c0!q-Is5SzLNhEnf>jR!+>U1 z;hc|EL;-Z)68|(}cqo@lWid_kFk11xw?B+ZNs*%?q5>CY$lbZqXxoKCe`ZOsfxwe- z(dioria%?#IZj`v6M*7dz(uE&B1NFY^~c0z)!_XQ(NIs$sX^XaV3$rd`Nx4qoxPNU z0>Oyq$qggL=Ih_h2lbBn|7aT2jh7MrJ57}U%(b5}Lv(d; z(zVDvxH1K`>HDJAyhQC%mc$x2_kT5UI`BpeH`v^$UM<3YC?@y#g zcmS;r-&7R!Gm(!KpB6q>A=UYL-J!zv#B#^MjN(jXcjr0LQBTE^&61=T#{E7FsPlCy zZH*FXHt2)hueb#f4-RvhIY8d>6C2b|l?8SGtbpViOlZ$B9RxdOo>!xOoxMsn6F@Ev^S4OPxLdPAZ(1?W714*@{ zXh>8#a^V>gDt1SKBo1az_HD!T9t^jnI)X=rOG?kJtAO#A%Uz_3DzGZ1yZhn4JuY|C zfe1KeZ(+=K`xi7x%D^hQrWjVJ43EI{Vj9=7N#iYBhV+s|j|9u78*V`=vCy zC1X{Gy*DASbAcY7Pd5)zVvIlKJ4gP0 z=5?_U>w{F{Rw}q67LuJ2fLYX1QI>Lm{7YyTB-rfH5sam6=sYS}6K2NWm)1^LFj>S@PAm~#QvO8s&c z7Fdo1Tt{21rh!dgk;JweaQy3+*Ok*H2AX|?qmfHEm$35xPB0*S{M9933?d?x$r?_y zn)=gOK3=z)eF}E)?$o8Duu}V80>NrIjduTI+WD=grn2uzKuv-$7Z~OFHSsDrO0;$M zPSMv2T8F7Q$a>yq)*|BrH*G6idNP-^aJhNiQx;!sVjFPATc6@5@@b%@{lz!T&&Q>< zK=fotu(eOiY~?lU$h=)*YJ?))-L~l|>>i=)kRaBA|TNxJ7n4DXZ zL5yYh6^3!1ONEn>YeC)X84P&|tQi=;@^1rofVdMDmW&Mj%)k6WmG!+r)eUaP(hzA?I0|Te2?i{h@#SIAP7q?l-+mlC#GbltwRJ<#XFf888 z&w2qRlCR2#k6F*@hr&HYD=}k>-^EC_7qeke&qo{h zrSjTN+lodPO^Wo?Y?F-kMjqs!VbZcs-yXs@#Zbz$y0e!CmB&q}cXuH>xo&fcrhm`~ zC_n0&>F3CspFO#qbs%320@|@wtBN)F0ltp63s zTaGg|tP?w2{C84M1<%syUI?q+HEg1%gF7OX8uzi-i{XTqmBVbvgY1}exNZZpHHJxI zsO$R7?jAhEduYFya9VQR>RHf_rF=qBeHWMg^)~9bV4lT-d;c!1!VtmET>8x)0?RM{ zL|WkarUQl*IzdMm7K+vt%RCPog1<0xJH2W_9NqM}V01}O%^qY%Yp)t!`$A_e8D7Q1 z!n&XAwrr}aN!qt;5Z&J_vsJ_(T7B_@QA;8X%cXiOksJxdL_d&OfE-H~UqJkcKd&zd z7qGCHO3Mg)=NtKMLWx#minZ!2zx2mi{+hO4__~_sUsniXugWxy`)?Am6MG1s&t<0tgCqS46{31#czCs;0083AR5?u+ZsS_+V0ERU*Q+- z<#890@t4WJul67Wa*mc+#I%qF%852F=n+rMlRW{N6k z4O%nq^`$%4JSH~E6t-fAc^Fy3eKERf`_oMxXot?#4^xfuqf|bTxDwwzXVB01f(3&5 zo@k*~k{YP0gh+oXw7S(S)jmaqmFmYeEY-|>Y-_u;xt#qRIj+BIJ-EuZu{WTGEFs|H zOvDM*j8&M)lcX7k#nsSrp;gwR zp<@CN#lx2?b__ZEY5&2<)SW&@Xyzb7)0iI0mVzM7^%S#sB>q!!e~yk>5nJMtCb3K+ z9&6i~IU~A-Q1vs$*IkAdnLO*6mb+H`?C!KAi(iP5V`EC8JJO)eyfs21jgJoortycc zhP!cr?NtJfzw1`=H78hfOf=*$Umt#3Ek$+%{=YJTtN0LW-c_1qILcsDR=;=y9^cI9 z*2|Cy^8_>Vw_k}v!O#RNbvMuNHCGTezA6TPrLy5u9&EXAviO4wf3_qYl6wt!fMAFs z2dBpEi-UdCueJFPILr1FX;nH3@^hi*KPKN?2j0hK_HG(%8uO3WH`)rYT_KaENDxv1 zJsoZoWKf+;{+`w}Y_Iq_ZXFk?A1n{e%pv@ebZZ~=*vsfBx$c8z+YG~Y9WZ-lTkWZy z)nXmVrVqDNg;AVntdON)fs~`~b+`15kUrEY7uR02nn^I5PUp%q%0gpizqEYX#PB$^ zn6s6{+*4mbmnuKZry;len$OW#e zy33u`1Oe~Ubn&oYO;Y9A)1B+Nb++%A>SY@I1m@}ICq1~YKRo-t^I)lcs?v!%Mgg~2 zxyWig72<68Yky_X8&qf|+>EkK8n@Y&8s@KE^^v=9o4?>ShgiO9E&fR2u5#52w1Iuk z@DafWyI&k?ium$lvt>A|@(+W*|5OXu5T$xuzh%clhjvMJhj%+h7oUI zJ|NDPjRS>rRfp*E(lg;%_ZwIb)A@ToTk|k8tB+;4(>$!Oy#Vz|0=n};JFtTMsibUd z=xfSoyZ(c!$9ZdGZ@1XY$gY4OKnlq(BxUh&Woe?f#UIvDx%_49Hq|<6?)H2?1=F`* z?CEouPd>QKZBTld0N{+MD6Q?=)3@(i)EGlB&$1ivE}|A&j;Az@=|LV0T%T+*x@brW z(})6zt!!>d&9pi{F64M{?(Ve#$yRm_qKj1zS#1(EFq zvEl9ZD5F+$p?Yh@DmZ6lY!-^ZMzQZt+Mb=xF_4&JM|Qa`^g;qkQ3~WT>XaW`gW5o+nqvrTBJ#&q&Pz?V2_3`+M7{ap>?H1CLWQ=S)b{dgT#MjLN#nrgirqsEZZF4kxV&wl_wb?sd(3vs4}0) zHY)k)wD5pjiId*E|{Vv@p z+fOes$`QBq`L-hvz~9g9AKmqSdO&7D|2?YbQE_iJnR0hRkT%ZW7@o3=IE8|K@VN6( z3X4c`ILJRMd;ynt6`P;BGeqo8&6=KB5Kmmz`Z_NCGbk{p{fBw`cK3t zw9AxQu9YN?t62DUoiED)HI?1JLL8YEud8Q@+RF=a{j!7yfxjnuj!pA~2|ew~%ke%Y zzBT^CfnO@wvtcH6>-VA=yVnFQb}t?4JRl??R|^iYr_&sYKNKpD#_i;*tu#Cd#k(O? z>tlq8{KO)+eLDRauGM#~g;iK9IM$B7dg`qgk(`&#-CQ>?{9m94mj<+U#{&+Ftd`9U zxYBa8BQ@L131H@=xFofwGhc2+IOZ4KwPRonO`$S9-D3xdRh%JwZ%eTG$o{QI<0ATF z(^`_>3%T+LHS}J-G^{8-FU_Q_MH-S9d*`f7`TcJ&^G^}kuSfP0k65n?q>|ljPa4PhfkuB# z%Vph0$$@4c%N47uV|)ATlWwLZqCe|X2V6me1vvRE2kl?r<8(_1&MX%%KP!&}d`eT@ zdT{NnWCnrFtyHIGwL^1d*aNC3a0{7`CGP>Of_cT z#yN2{I=Qcnj~CRuXP$V%piKXo4K4Nl(j_ zZl{DtZ-`#%O9&yZ_&)rHE^q>_&(MIthNy4Rgm`!(umX4B`nr^NGLZ^#_D0|ZZoqHN z#oo!vGQ`FI*^CiDzL6tB$ak9$Z(Zi=mo(nVohIbT8+n(%ekbLfK&C;y$AS^K2iM;$ zy%UTT$kR6hDew%ghaiM{BZNdyhi?Q~-~wC^rwN4%QBSD_^}gy~K6t6`HtcCo@3GJX zPQmq*%kM;R1?v8dzzN)f>$wS`--t31^!Xe47hPQQofv3AzxzQII0M(Kq(Z-Wc1nZ3 zc_Rb@o8Wqj<#(H)73dHA|9=8TUHr=@Uh~7-s#>iN?|%NNQJDH})1CI= zU5$S>^~>*Ma^=IjXKaBzaD6`^%-gD6BABN~+phk1P?|MrEu@=n-RVcz$JA#eh;QB5i_&2gf41e%{WI*ek>}dZZPy$cj`mwZka+D5#^k(z# zvoW{wPOetr-&I8txCGa45WW2utRq3Vd;|ZAbE$>!W`e4N@SY&1z!A6}HvOHDXCOSi z5jueha6R$rJK?ZKKvCh>UN9R$vNTpZ@lU1VnwS4kE@I`6tF` zI^x@^!wkfC!TuF+ef6C@uOYq{@Sn`5#7J)hkre4&=70IX=)4m$U8MgBhL?f#=9x1S z>GsX$lfVJEo?-2sNUtNkXNV)P3$B+SL4I3hNQw;c79B<499(at^G6MSlh8He zoy2A$ze|W9a1E{p*4|0-I`X?3|0IkcL3txZq$uwa{yRExI`5=P7v=rv{1Y`ZsoOyP-&r~*L3=YnCPRDw9Q<4jm(qF^M#-M6Cf@IOHuA8Kn`1VrM zin$KU#&*i>ZQAQ2XvH`ETGgEY@TSC=_pq^)jglfw%GGiaMx@~k%_dZpaW*01Lps7Ck7m%@HN{n=t^ za40{P$sYCvR-<@WEwVSOC+o_#^<#GE?>(GMdd@3Jo1S>V#3(Ix+3jOPgz2x&7r3qBf>`sCl7V+B>!};_=F_Q@^;Kjqlpf-U%xJN=b;9gT3|sy( z=*O4TSI{G6JAdST#iX(I5x3fN!|mWB9tX9F>v?E3di_l}j)R9{emEcm8L9m7xd3Of zN)kN!W%jPz!hz0X0TV*4?O-;S!d^^^)qywNmGUs=eD&nv@!;az*f-DdFx!3JQ}XoB zVRLIbk{Wnu{OKUfNC@vbaF9Wn;P->Kib}Z+3Ej5d?Es#N}sa4!fk48uz?Z z(X&it4n#CH-4`OSmI5GM-*r2v<$%z@n9Ej$6^j}xsdBK4%c!efK)KCQzQGfIpeIT> z$Y`Idn|7de^yTK{tMBlokmwh&i%dR=OWh)*&5ODECYra5yQz1L$@u_fd z|2D;4By!7~o9`Is#?xR5b&wh9yQRL?i&?MVpVf^aU-eQG$Ghpd`c-&q)yjsclm;-h z{V8_1=QCfqirw?TTtrM=ipNdkc70@#-E3T-%wrcGqwClmDqU{cYVG4*PoVB|^04Z- z>rL^!Z&+ZfF+gC!t;lO1B!sij`1lg(hT5C}G6wDWC`fiFwZ7f>8zM#y74(V6fw{de zt6nco&c%GGkx6OZy51*ODsdyFIXyp6$LD`?dWP+e7v#b0uu8G!Ec#;75hB!NZS^&w zvFw!j)cbq5JkJse2()#Ul>wd{{igL$dyK$uJ*eQk3TSgJRM?zcZ|JV%7GuZzfu_zx z&nKQ3_^lplS_=nihVAu!_WLljrJC*6JbgNJ9|c`a#v`^yYMMsV{o!aJieqznonff< zj5B_*{laiqIq))C$S+RLxfYPv+#X-AW zY)y}m_Ft)fyC+AS%b>%Hfgvh#B8X3b5Xt%Vqc{u?W!N;!|kZiWLzDWsS=NF!Kj75bLYyq@{S57-a}+nVz3|sI zzFIWpd7C$Tb9>dQB&}BBe(7qqN%Qnw(jTXdZiUF4%aQlO~KFc|h!mw&zVsCE!@y9HZ& zy4D{#rN&8Qs~=WX2qzZCkB+>`E_}repQ6@8+bo7+zhKdZZBi6m3g) zv{}KB%`x&~FF&H*srB^M@bhw-)RK?4R{u;ZvbIvXt{92%>%tRCtBmG>%BP#9ywcFL zqL%SG>a{KJ3*`8+bPKM@a#oXrWBXD*PpaFLdK!+K<+q-+vT4thIfI2=EgUz1*yjKT zSKgy#4u;q4Ud&l6SEBm@$;{SqWkLe$M0qY}ja5C9*9Pt3TW$h-vS)g=!nC-?NubHZ7U zR6ASu!$rD9wx@618|r*O_Gu>YG-60q|3to?5IB9T#{axcY9G)B=u0o8KzFv6wu1J4 zpBKqy^Xj{AmkuqpT_04&HCo5zy2M2sybJ`&N?A8GTHDI&cJ*8q#*G-qgwX{ob1AgA z9|RH&i?ua;dE6GtXUOMyQ61&D%$}j2YvcTOTqbrWnJ-(Q{j9$!nfU;G8hx(LklwB1 z<;j;tc#sBj?k?AGV8ccrn4VPb^@M4~p(cH)CRg%kxjoAG=G#fN=izK3(=&{BJ>GXY zDCy3DJF$1mjt|AXqEXkPQER+9*c;xz)F0Gpn+$E~R5o>F=m5I-ia_VMmDXcPi0m-ER}_r8kUk{EK&T4BQ<- z7h@M;Vg1S&t+0kQn%m1Z4ijUslaYyOq)3?>U!6C+_A zM4^&{5z-*hz1Pj!fMZXtFchoG^~o_;Zs&*RIVeO365h%@>TS;U2DGiCPX#&mQSMD|Pn@N4cI5Ym<+hFz0=M~>xv;BkwtHti8o&Cr zR{~{tRv#~od#{RA6yAmg*n1g0Z@Y&6V78wjngZW+EPDf;GY!~UxQ}cA-+ula)V4@2 zRl4ILZ&jG~-S)gt?+%ft^9+hujPG~tHhhx^&j}}+tA(vKQS}z`r2UBPWe@(+$DQ4y zOMc{$$hqZl3lk?Ez~--!dGi#7b6a^DOW$D(%KU0i4a)vh+2&K?Q}>1MBuXvLgzMpY z?zosFYzpA&n|!NPU5OkA9rn0Um8^dj%+~*_ss8?$yozC&N3F)i>DR<`HYvO{5~t4P zbDhLWgYe;lYB<2dR{vVzl}95%Bo@%f#^*Hk+D{>i+~E4T*fYsl>TwKy`k@Gr(Y%Rd zBiv!#|8{ts34VUr?`}zN%sK9iGnb0<^7|s@7!PDhs0W~`u3Swm0@^sW2LcOcq#r`2 zVuU#Gdy}zY+w6-bxamhO?N0S2Z=E@a_Zl+9g4EO5i<8|_A61fpqTA8X@|2^d>~Y%R zG#V4GvVK@X#U!6p+|@ScF8e3H4(Dd}$kI0R)|&eaH_yV?fnFH^tBQs8pqzNN?LO(z z0C-Gpuf0F&nj3E21rc69>_A9j4XJPz9Ns5m+VO@|sXx~ZXnCFtSEfA++1)xm z>b{m3zrD*`l~TWbw0u{zX|vkXtORpqf;K`pNymRa*=*eVG(?<+eaN=nYbs_W?P8YD z+o$q!U4FOh54&n-{j1g5-pIEcZ`7oa9~fh8Xs7MvJ78L!X*wJ2;*-w5ZLvH}*t*^5 z)~)nTq_eWRZ+pFGSWeb*y^c)2SL$?NF$@wpr}D=VRi2qi4wp;F!i&f0{KA z%iV^8v%joAkrRpK`0cXGy{Wu>i@Pb{YNq$A7F+)Ox%0*lDSxYDwQPF3v?Mrr%5tt_ zOg|fWw--E`N+a+5?QR&WT)Mac*f|ZmlfvHNaBz!J?bcp0S=c|CsGLCd4Kc9)~6l-(D>m$+DbejwJfV&jT1OZ1vk4X*JE? zbYWM=qdaVTjI?x0b2C`mcI!XU&U`)`ojlTwy)TDB!MjsCI+{&CdVRh%Z$7beSh3WSNSI<@*93oclJ)ss7>e+EaVeT7#wfS=RiEwN1OTzcl#=@wE9a=9?7=nbu{W zuLMWEWdmC;YK(+tF-uEfI(wTXNA6#l_j|$(t3PhOzO~m#$3m_LM%?c^yp;Cqu&de# z9^@T7f^EmP!cXH%P*A6l>8wCHmUa)sgM8KQ7OP2iHu~vj3^y%_SKCpG`9H+Uacf-e z0#6C&R*tHSYz_S{0?##-Sb3eEWR7yw)kC#w7qpTR6R!ntjI%AhFZt%yS1TRoPajA- z-!9(xbk|d?h&jFiZMn`@#pO;d*XzpK#QpNDpqa;c!qyGrHoR-e8P4N?(H~+&s*O5= z9 z!zol7m5O6-fh}*ICG+&zgK~Rk@sbLBe_N^v0t!w=ubzRk;Q;S=L(OL{HgJ0*A>(AgU(H{^-tpKoQ>b_)i>8-qC#aqrtB|VhE}9IHrFNI zF7r6w?p7&tD<5;--LLR3Vy)a6S_~AuNUm^xn`1th`Mu0<6i;yf^f#r*FzR5yKbJP% z51BK)&88dJMqN?{Sw4Yw?kxe0A1$EEQfs!;++o!XW34F{_d`k`Hum(6yD$G(-xD6QyRS7Ggzldv`pS~u92fySzHNhmJYi<8~}Wn=>#pF+l+%n^ydENk|8VU{P~ml z)wK+(IMNTFh~#A@DN7I6$H#;GoZo26MLgP*&N*w0U zIt1+B2DWmeY7^X#_wNvI5lvaW@KxLf1PvN5fu$2)4NF>wO_G&&@wu)2{81G~Uiu$5 za@NLTX0?l7g-c1FLF-+caS>(=Yxeq)fzif7^yVE-;Oy^zVNKNN{WO|L8%!UDM+O7+dfo*J< zq5F;DqS*`ec#k}Zu)CFwnXOCvaZP4Ss!vWgpzVV_=`?P?ndUatPgPCMGgQh}qrA1H z=dq;PvZHeagHNqh{c8p2;j%~4s;`3CUgTm~;e$hw-7S?lIwp^&?iQ&Nn;ZPQ!)nUU zkBtZXTEmI3yWU?^$hngVhY`JpD9~FB@`#W&H zre=3imRap7CKDq_veSul0fl*fHB+jhrSQmP6PQMOc_Ega+N}HzC~PlHq9VcHUNkNX z=;bt14dGV`?ehy{2+DU}pa5JWNgw!0`&a9iT!S2{alVTk#ZD<{!6qeQAUf@L9`dFF zk_7I~&zEgcKAsm!XnZ3RX%>ft#CBbe3W?;L>Gk9R33xZnEQu}uHHmc^m`N|coGG;3 z3ew4%YBQKjumMtXo^-vR?6expUajI0zqvSb?I!nGI~h!S=DN|~*H(5ORb%!8Or!Hw z*P@f%#9f=otFU z?C~77z~LT)Y9JgyXM!@^@%a!XEfF5)xy{wVAi6>UAJ0T<>p8X%w6# zbt4ipM0NNWeIsv%+-i)aq@#wQY2?mW=ZCzShr!-jX0wc@Tx*JYYKc|1E zL8CJxFaBcrk=j~5sK@r1LU?}@6w}8<7-Pn$8qNF_HL=twk8ALwsn1kje%x_w9MYzM zFO8)@)rcNrqL4%X4x^ei4!=UY7Ry=~G^VxGSmICu3SGw}Mp$jm1jVds9=uS}#5P)# z?nF3l91&~P;lmhj31GGOF;ywuBfU=e#9NV=KyA^qj@CV-VWqhcy3CihRI&@{Fl)f( zJe$uU1-T1#-W8MEFS!Q3pM3J#L6I&GskB7P;`Qf@4H1ngYs#aaa4UP_=)lI}R4U1z zsCr}GsaSo|v_3cdX(CkRgXua6aTy{;C{|*W;e6@YBta4zW?*lM=fB6mF zJ})HZA*p!T++23l3?(|#uDJEz27h`@6)>2u;+kkn$$NA3hULV^a}S3K9Zya zi_>i(KFQ}NY2Z`EXJorvGv*HCLR~J|kJLLpp)93A zkslPPtnRt}LRpv!W8r`mg4O->}K(IlS{EGAz_n-^_UP z248cg@|VRi40*McZ)W?R5(}Ghrqbw(M*8_KtfGy8J!58EBb3=Z6`w;ne7$XzY?aup zDaO?1>F2P3>RG1fQ@Qk`a_$L}<*BL1QK6wtW`$d>bUCvjzhIZz!HX`sW@l5VuGA71 zVFP3A>6N@V)}P^)T~P;>+TE(3Kl!_MJqzXIsu|sedY*dEBuN&aG}bRfGhXA`jR+eA z@?_%z_{36lho*3e^bZy75`_ynrojPHw!ctunLvN2|+2rzpaVFxnL}V_Cm2QMKIN_~POSd|^dm9snme?40WwUv* zwK*Y1GUE8+l{PV<8Tc^2$z|F1{WG&)bf$980zd&AGjq| zMNtJ=QZA3~?A98{a4%L>a`y=+{k$uC87cds^&#Ic$h$FKC7)33F!ub4nPXGg`Mbkk=< zk#UI_B#;b?j>FO(dd#CKYfLXP4zCf=*Ju29qy6BlZ)E*oE$ubl=51E#%WdjwVpIIu z^YiH4YbsY^cGJ?~tMmQo{p;)g6F;q086{i0R2qqbi@wfDFRH82@5>bg_O?r_gL#mU z%J2|$YKvZ%7f8P+BCcqn27U)Aro>JIye_oyP#M93an-a1?YcS_MJ|dIY&;D}1k|vm zij>6B+rUW&!+Ptw1!#@xusHOq`5Hj-Uwttps6|F8btn9c%=HrqKfq-D+l(l^h=N9u zGt)-&)dKV+S`|!11ez23*CtjMceWW3O^w8Ei1;Ty8R68pjiQcl__-oH7D=B*t(cic zWD38;L-N|ZLL(D%dOiyGqMmD@5FeqSTu8iP{*PksW=zsPGJHSjZO_DMJ=DI0nrF$A zQrV1pvHlaE17@vb^MGZ=YGJY468p}MdUCfw6WV;zce1pD*51$Zi zD@#6I81NBWLUh(FEa25yo;>m+JjW1sZBlIY-oV)MKZ$wN}z zb-kOF>W*`@oJfca~|=$zlG8yGqiwK1hkC^3Qg_(pnL5hHTK zt_UlKonj#mqWdU5y+69ti?+_VjB8Pns?Fu} zRB%LGWyjGHpHR!u*RQ|E^wGn6y#_2N++g)p!QcG|L?aKCq zLOI5v%^UN(5Uz1kbp-#FEti}P2>1qXDpm10*DQDN-u-d9PSO_)6gWGYrA{3lw@kp7 zfxoAW7&ML&=H49$m^ns{dH`u9_P|FxKA~v5r!gk-ba;+XSvd!qYQdC`2$-LQa8~!D zs9e@6;fdCBJQ!Cqjqp3dVKke%hscPpHoRsjWv6{U_a^&F34TZu=r+|^)x;w*;oT{*1B7q=zPTD0$ zNrT>s7sA5MMaOT=GkvsMdtZ9@{!;7Z+nPP6gv+U!h6Z~x-T z%;b4Bp29Coed?xfna>Vz?mV$1xATl#;Kc$Tno=EmqAD8!Hm$!)F<~ULVqoDxsJaIW z3hPpiQ<$_(>3$g7g(BuT&)e?jaz}h##8EmD$g<=3NO@>*Nf923)WqIGr0S6?Uc7%C z$*Z`M`G%dN;lJ2=gm?zG>;37-mgo}#ou_tk`^&3Z2u7(@hO@FRI35eePEd6@yVTQX z()(PreLctmI?NLWJtBGA6NR~vuR|LK9xI4iE13dk&$zo!h--q4aMQEQ z31hbuJ=AQhFUX5>-Pu?CX~@X#NEIeY8Sl1``h}*GI`0(SqM(<>7~=PgCUQhlXNIT} zkpxIRzoZL9lhX;ICPtg|WvCCTuG4d9Mo$#U1~;Yv2z!T27>HbtOM&RA(`-k3RUbyY zyGnB)ZIv2SYuI{B@{LV&@j|&bYmibHRhvNywd6x&^(#=&%}#RMw=sSt)L|k5{4q4T zN)01lcgSdiqBS-wcjFaSFx{dwPe%>dOs?Bt-BmXi^rz#U<>pD$HDh_b7i18SIgGqI z4YHg87g04Iq{T5Ym)(0EPpZz~LO#7XVNb}9ekEu4k97vd& z65jRwl;h}VKUfOpYJ~PWt^LwJfoRLsT!sIsv6#|dNgvrXK^AsUvnjJk4sL@@E7@I* zcY=H|a1L?;o{D#b3MU-h$c-aJbA&MjfmbdW5X}Es$L)A^?mH}rZ4_Nvzf-uwd$Q+A zWE;Tb{DV)?2c9DjP=+=A>=)EvEvW+I5{a^Qw0kI_s(!aArm+M+?U}H50O3jx#bQsRV)f(OwlXTn=gAcTQ;*k0VjwR8$&|EAR$RD$0m@D= zZ;R*(#c$bIHbHUMsNtsjO2}gvh@ZqogkoxK%l_7%<1dl^M+cgI!3LCoB_AmPtL0Hq zFniOb`13cGmi)<+B#aQA^8te%ro^1ziWqYX5Z8 zzA>uHBY1xejLR;2hjY`SSiv$mu4)x}*vN{ZNC_}2)4iRGVni1tb-&HwYjLju{1JXcN5W$in8GB`2 z1J;7^w{D6l;^CgsO*-DcREAMkX^x;vQdfA&L80{U=|c}6Kri>wJ>6OVx)(u0ed#sV zB~|XVbo0SvWfa^JH8iSg4A-I$7%}Mf;4n)`4E>qdi}v!UP_#^B@_}x>k~3$WJzQ@- z(kO-TVWU~?Stv$s6MG)7NxLP~P~^_i9cC=f-{*Y^p=H+0)+DNWE)Kj}mn(Mr>i<9- zI`!lRV=uw5bYj1^?Y?Ir#W0YYb$K^?@A3EkwSI1wp91wD7Lh)TWQ7g19OP|;B=ZDi_>qizQkTa}GY|{5Oftb3X^dOV1$yOzDxUZXk-YKt*Cx*pXiRqGfFqyS5hXeeH8rb^{OSz;pc($R z=mbCO7THQlh=tp!Bo&hZpimwXl}aMtgF)5rIoA{vUi?XTqMQM))Wx?lTPqpT{WsYh zmPg`VBRzkt3T2oqtIF2^Rv1aYb0sJY?%|G&HS@DdJ%VrHGJNoX>rfjm+3h8m>0hUq ze}~DX)^m<%~Znc5yqZK^$QE^`HBc0W}cbC_m;rP<^Y3=(8t`%1*wqN{jV*2-aDTdK6nv~ zRC{w6cz~0J4|6F31G9ekF{>JA}=J?PU!F!M1@)o2A~5BBDpqoA8n}-oOh@&h z5{~5LrYncD<9uzurIt|j%iU4#xaImj@>07n!+6}rL85rQwz&ULj+Vl&S9VLezItU8 zm=mfu(9b|-Tk|t_XF)u*K-&NmN%=jU-3UvCt+cH|-O{pw7046KaVF$-<4-d}asrbE zO?P%7uE7!!opXH4u9csC3^@#>r@R`ELU=xP2ftFSyjGf=3a!5QR|lX6qrtE5Oo@5C z&X!8XKeoOef1IZqxPI229npM!d^zPmpRJP?&Z6h-NI95{BbHJp;BXU0Jva7(|NSv9 zf>ErdKl*LXHE>aJ?kFmWQ$Cw33&m+0$3lQ}!eaDy&sIneRw@FYxye~LiCr}wEec6N z$og->Rl^j)xpj4ttOt197pChL1u0q@LvFH#+#G9<#bv8cx0O7jfILHx+)OmW>zgjT zY{XvCiOVPfALd;|qKD3JRuK~Z;4K~<8jt1q6wW}f3BaDCz*1GmtQ%I~x#vixiQtgZ ze#kO`>4n1gFm^z`R|>OQDBIlkkgWbW_1vq6^!NTkjv^HC(Go%0NNNq~*zhEa&Wu1t z_WY1yRo~06w2H8pJN)XW|NC}pJakrR`DL} z&{R4k6YBp1R6wi0num=^8?VEn;S8l`BI>Y<$jC~gPs|G%WaRp+wfS6UniaMS~NMW`!`3` zProu)6tDW^j?larnc-$bcxS2oP}aWzjipk>SGsBR?ESVCrNR7L** zC$GHd9eZj=*~+YwuayV*_E_8Si=Uo-a?7x?(oTs#Up+m2e899<*JsU$?^W>JZ)<1O zx2DQ}#!kMF#C5d7jeYxbBV`-)7*b1@?--ZwaW3CCxVqnaUF!R})JMwd1CiFc)CVeM zJcIO+OZ_)4X*3G?{cYcy54()F(dGL^m+zS_{aCM#>@6MZjsX}=ubS59(Vn1aUhr&UUN zQNqWUv(}lv1xIQ$28c#^OZ9zR>eso9&zUWzB;zb@^5i74`zOQ9CU2>06lc=X|B#qq z;motr$oE2%6pE*Ijhf6_q?oi?CsYo9Pu62BvzCTV&M#2dokjxnkdc9OeMy`m3OEH+H5lF91=g1X=!9;EZM}8azO4gYGPMQH+ z^mQ?G`i&2))LlSMCMa$15e9b+eJO(w#GFih5C$($)chc(Q9FsB<$ zaBWfmrG*foG7~1J=+YDPx|g(oiWfH`8PPRKnjytJD?LdZF3m`pnHFKpup}|6ax+rc zsC4CN)FpFf-BgUoB^lDwwMiB(Aqi%%St3J*UK~l>q?Dv|i@t{bGfg^+NH>~BqAT`m z@?@ZtZkS9@!pRxqbm>~lWTORtrG!L-$-)_RM%p)QHPP2#v`D*?PNM**%>X_`AyWBW zxyeJ~M@$BJv{NYpY>FQdtB2Kfv;TLo7eR^3yE0vAmq+S6E)j@+y|!VYzz~DfeQzisgPR4`4aZ z@(`AXu{?_9(JYT)d7QI9=+oSXbQp49*z1(H!Z?%%!^fl?2BR~S~RGvw}MXCsH> z;7>VrG=TC3B=3=Xk=>6R@;Zcaj2}jMLySjxBl2I6!v>C~yb0NVh{(YZF_gooilZDd ze=y~6Vun)=<6c8~bJB^(ABP^G{0Xx8ko$Ao6w09jk|~EGPNf{WMNfGEY$3{@g1(`= zHTZ&ZDB+kh`9hY_4hITZgw%HhN;rTl4*%cr~@#}!Z>O#Tb<5RNOPJQRFHd3*2? zX@Aoic~L1Y6VAB_E{dfvho>O`Gl-|NLJn_EANz*x5>&|WaSOAa-pnT zAS*AGm2+j~ELqtiE9+(DWLbHltQ;>Z50{nWWaVD6a+ItbCMyTY$^o*npRDXFE4#CD zILddbYs)u(WaTTea=EO0Mpix{D<6`T_sPmTW#w(M@)lWngRERAD;LPhOJ(I;SvgBq zw#dqQSvgr&o+vBF%gV!LjQ3G(9`Q;U2Tx=6)2p%4%=IS<5DWR99c7vJ&O-D1YY8UFH@R3trjF zZIF;hB5 zqwy5#97z5#Wt_%phi~3;!xP0q1I}t!sFvGuJ-Ey3rWOn90P~!(+(xj8Uh~EJ*{I6} zoM7vJ+$C5hU={|eWbMp=B{Nt7+PMRk4p=;cah?)P2bhSn+G_6wocXTvMZAZKcx%f1 zxcLHnO`jmvZxP@Dtn80EKW>eX3z#p11u)pFfZcgqg7FOY5@1&tEQrA}06W8AAq-{& z>=1*6G1xS~b~2cn!BPO*!eCJhmH=2GgGDoc*hIjVGFUGLdls-P28&^^(SYe0ERMlO z0Oqe=BhX$A25c5+5x~A@pv<$fnP|kyMwCNXISu77R)&x4qh{r)C`Yk!GRjpM*ncB% zR<9LdlL70+$`etJVddvgj?1UA20Zm#GetglD&N{{4B*>6iiN-y5`TVoxB7C7HP69+ zP0=`F6x@zid25*u_egUtcVpTTI~2$ltyS53P-vE59- zs+u|HkYFajDj3WUFb}}e06WcK;2S%^QUN>QgvCg(B*3;ebDndl?+YXoK?66?npfuu z0f4&!-ko@X2QNdGk?iS&?`-scEyP|@{~thKUzJ4TyMI?-PIUvXW3Ol*c~zdHC-I4z z_El2`bI4~n`tn?n;9FWG`0x^a7jk(Oy%<0BCLTn+N?jz5R4R~fQgD~IDJ2^BnF+^Bk4ScU25W`w+ee2#!2&&8|~rUG`lX|a=rB0ru0jP&LS8Xx2*C;m*&cW~Kng3jEfV@-g6zif{}6ve_K;84=_ zM{$ofVvkOuuP3Lmd#R4uey^_XVa2?3X0KvBd>iO-9_wQ;J78+ap@vSG#cLeEq1hS0 z7sAiVy{hC2uXAFuBCSJ8z9YdlA#Fk0hE#&2KaIN6Qf@)YM9M}AL!J7%^vz$FQV>#z z6aJ@?3poj!|9AL*N4J$+DpKi1xa6=B$}cIo@+u`4bPaPL=aEzLM^YhqvE+`#A>FC0 zE$3cTa@+AuiJt@bEhVRdkF}vf$!)l)06!5)%11>1%UxELFH02Mp`-z-%@Pf@+ z=B_F#Z$$ge!w=y)3ISF+OUoT@*2OkDyYA|af-gtsVf}@F@;lX+3$Py=Y#_xi{nW*R zA1|E+CBI7K+o!4{6j6UyUy4SX5C!?N#X^``I#1LN`v@5$^`W-@=&w{$-!Wp}X4ohF zb zkBdCR+Bc(f#}V|`8Af#AVl)mO_^2S~ z*WQtAN|G7PAq$%VzeXsZV{q6OEgh^6j@^y`jxO>b!^JS>LDvG(HNJ+ zwnaiy@b*%^Sd@ug(051NtCKnKwtO~Srs0cK>dpe@V1zgZ_QgCxkwjoA|dW>2H2-SwFtNqXp!Ix-{0&Q58#af4w(15i);N zj-u3>!IoRac5S;3{ZGeB#IUSCm~?18k78AO4bX$GP+2 zWNiX~qX)C+K4tj*fHv5NOLwa|?#$PJ92bW~eq^DkSQzpP=mK8#1%1eNcL(lt{**Y2 z-k^`tmw18e0lJAiKjati4%6eA`LLDwY|;NDTXj3;ivW*NIf(W!TjPM}_o03SZ%y=$ z$#!s{6|L_g@Crvhl6VQQa7hMX{Ze^^$YbNn#)U7ScR_U;QP` zbE>*}hoTqwo6i&Rd5Nt(MwBC5OR|}o^l)=1y~mXG#kUvPjMT=earDG@0rcq`U*4b*0z?#p{)|@+Yfvuo>Ovu`#Dj+Z{H`$iyP1f!M{lHk47rV zew+JOt^8H7z4q}LQ`Q>$KzkkpIJG0+EBY@SxIi6$tM`L@V z-LvQ~$xvHO{}2`FEomM)!6R(^#Wlu9aX^t&iagA*p!PY@CN6E#PwLsr|)aR=t`@^4q)q4Qmgz-;P($C@? z(s-%Zi&Re1&(w#`UU)5kx74U={mUzCJ>;Lz`lx>tC(X4TbxwUoaO(33V6^59dm*=w zu43W?$TdjrNELfvJ7WE_Seysd-wS0rQ2}R9uBbv& zS}e@z1b#wWg?fyC?afBn&=sXNPGPmTZIW$wizN6en-}yP$G>GOw3pg;!#;~?kzkwK z#%j+|(0KW_x5MY!cej4aMsnG`vZy@gmnUO6ZWQ^4%_?I%UWANw3nHB~#o7#l-$#=V zI>C-7KY{kn9k#qO8)GqlREkxgOy?}-HNkn-$anBXTRN|Q&UVD3K_sJdc2z{fcCPH# z@nUiU=xl_}gs-TAA4q-&&Z5|UxYHNHT%l}_g2*3hTB}RiGI$s4ogecf!_a1gcxE&X z$heliXy1bQ%kBzkUz6`j{U8&4Zisdnvjbrt#v_&E>=Dll*X$KYrjgF4byN-5Yp)!* z*ItE0^0=~p->!-e!3)m08)3X~h7*{vrB$}yvl!fYcKsPnpk>)g1>lsQRfwd7fQYD<0MNET5n zL=7Jr^Pe~m9|vp9X6vLmLx5|TMzXhQ9cbrIz7nq@ov`|X$dBAA*vnS?)!UM9ehzuX zDaqG=n~1S02T8I|3Ep=DZ=WTa*yaHT?vkSP6+sab1G{}9_+w%-cP9U7u3MtsvX)gY zfSggEyg+OE6R=I$Qmi~GYMr4%;-+~Fv@+Qa0Rs2mFY5aQ!&{JG^en{ri+JzasZ zV;FC#-3x>P;+zFSEb?gN{g6*Y-WU1Y2<#hh2ydM0c>T6yhugqQBsWih_B)YO%w~6g zV4q26h47O6@W7rAY&^$N-f52LXOd0e4w|XJKiL>_&h6?;Q)rA*x~LyrM!pg8gMNw> zZ!GV$Mzn(zB79fHHxy^VJkjppRqXQ#X+E0Av zA0Ya&1vXB#(J>h9hWknUxDDg-z$3YTRH7T#>HtJ@Wb@<$mBJ<$t$9F=2tqcYOR>ce7eSjk)6e0Xa!^nw3m zZCb(~wv#+mK^Fu-59n`8b_w+G4pB~Gyk=~j&=EV79kR>ZRgxXvh{0iJ?(hVEk2&oi zGlP@e9e7*P*=A-}Q+@VP$=0B9qBx(e4D#dBx|8sQON&LG@hx3$%jV7qq$5c;&9R*U z`~}h8naj$)%%&inmdza!pyT|EszSlS6@rIX*y+2MisAt)!OL$uDuWLZtUOGn17IiF zv-!Q$*PYHI(YLa}UOUCnsO>g?hvc7Ykc(#>Hun&^iOgfeB3&P14;^#TMLEB#JzCau=yY_BC zoGYgG+a314>WIOScs=M2hQC>;~L@g0`MaDY#GJpm1H}D7DuqhheSOg#+26|jXWjN zjC{maPtA8M<>otDRWUn%AF!QfXx+T^l2(Z5CA!hTl!fld-`)W$!?+RQx$ZDRL{ZKyA`qdHIK7Za?2^*P&~ zBfn0x`P{G<-uc#MKA0zkbU$dPB)w)_;PB#}wNw8Fuv3q7^X<;{He+Lx-XfdC3uAwQ zF%?#fX(E4av5jDVp9ALe)_j|S`e)C#D+1w{qW=#Vi{tY|dhcjoOE0o56-H~#8a`<+ z?o*j~-@)*u{ib_?-@|Ix=Y(yGl-BnS^`#Z-x7j`dQvRJ=$GP-!Fe}bI<7B)_i zKyuGZeH`U)1*dIH{roUi9P2v+``e3^=VP1;sB`C*h;j0NcoxUtn@V?eqTNdJxT@BE zJQ4YWpvIZ?2H(SISYI`zE*}qv?5toh-b2}>bH|r;ptGDm*g>`oY^OgOfqxLa9 zNB#PsZoA7^-2p>e2W*+Lt|*_B&5bj+eyL0Qj%afVZ3eM3X>_T78udS*K8n@HyVSQL zo6acN#Fbos<%I)~$eBnXKa0Oa=u5A6$iuQ#|AySwSG@!FE8PX0MH}RPNaa6p+&-iY zKS(hp@-YUx7YiF8TNG;PevINHz0`R^40ua>OY#>;W(TqRzm0$eIPV9uCA-rKn6K>4 zkYKL^cE{!3Zw+8qT<-l=0CuLC^G-ca;H(mS3E<9uJ3=+P51fBXxtuluDeK-c^vnAowpBeR%=s*mEJ!*FX}})Z_$vs$<{m}6^Z1>Vf63L?wDa_h%uM0 z>~8F(Thd*u26P#Tb4{>}TT-ldgOe|TYcen0M^oRP?0%4J&Sb7gaE@Jp^Ir8B+H%sp zU@Fgl?juoWN841^)&t*X(U!hN9jDef;xRw=-$&s+rtDO8^qLQqTkQMZ;f? za^43THIBxhN6%W?w9HoLIpSi91iF)@@j{S)yQ>Py{rDpB9#9XOc4uqyWbr#EErUTf z4dz%5yvaw@qfBEfnH}W(cEfii+3~!UWqF~&xJ zv5ddK?`Ys*`zqG%GqgMEeb|0F z6m6(o&|&*hR#!rGXiMYw59KZ&W%gJYWaDYH8y}PBs6yRo^y`885>_8X^=%}5OS1Or z-|!uxv(-ufzAbg712E1tLId_%Hn^{z1oRA>V-ZUo@kvT#87{f zMOzZzPTr@sAE9j*>}UCQjyr*L28qfQNR>!cER9EsLdrg*C=T@{uvbbxk zPxspk9R9=$kUj1;^7T)^WR{n;Yn+<-3y`W2fTidI>a$slXI9?x`L?5w z8)r~YV^ckiNn?9cEcK>zkCnytH3)44ieo~i3{F`s&Z+9O3b>3R+uNsqaAmQ;mq;?3 z>{pWg{-AS!F;CRlF`>0~$;uG!vXR+NPk=vDM*|1+6=Mo9)-sQhy0%NCtZxqb_F{d# z$R5(<+UAW~Vj~;8a*B9GEuv!;86eUX>&qHtg2pI5llzOeH zsEm|os7lNcDqvIeV{s>c=pe^*@R7sUTK3i-62E+obND=XWnUYL2|&i8Ecwh>JJvva z^1 z#i`c|0gwUJoSTF05ya4*K^`s&0f%Qui)fIiZ{ynbJIa3=Uc*Y z!~el?ceZkz0>q*pN*&n7aodmvpQ0ZmK(=I$i>dg9%E>XA@SQh(0{QbXtfgP1_{c=& zuTAV!P!rQ|#-^R|y+5m~cjU7&#iYVmY~%MEwXwZx;1jxkvnJfzs>SyrWmRqWiE-@V zU%@{HjuhX`b(v4RTVQLeoU^MU6>>Z)us~S&Sb?xzd|#$<+{D;*VvQy$KP%db)R$!3 zjvLbXr7;f4@S?s{&;3F7Q?SuZxk90Y@1-;Ql-wB)2`}*;g54+Pz^-<%_!6B*H}v(x zIiVPn^NxUj-m#5F8((#H`3B5a1)7W>l`Bk4$Q6#``|(%kj#X2Z<(4bZ-OlpAqlg<*Ed<>b zu>DfI=L#g_;~1@MN{Lpf;(a%8WOSnU7Ui9Cg~9Q;!tmr=F;;f*&+5x@SQEweXdP5f zcn|!4F4y5+y0i{WobhRY#>Y3%_cqpXWl!xo24fAq*g7g%{5Q&PwLrSsO}yvL7o_(9 z&bwf1nH#$+ig8~p#08wW%^qwG#ot2oN0wFG{KzyrEj`K%+ z{RXV77iiK;E#3=?u`Hs^!0&P#<$*aOeVnvu0NT)a4L~2~Izm8?lHE#9{~@HuZs~p| zq+hWR(ni9|k777vs}K#K6Ud)b5&lN;uFCGODG+Gi$$ss^-W`g119~Mud^=cB^R|_L z-l&{V(c9Jn>76Doz4LIsHEc)zcD7^_v}Jw0YVMK5yT6uUGMGE)Q7yfPT~Dzl=U5iL znCX7$KE#XUX}?_+{ccxZlJ}<=xFSH(b#zbBxKXa-uj>^1t{qFw#<~pp(><{Vdk5%z zLt6%T^bz=~pkFFd?gt!K_#Vfd-pp}-{C5&P=bi)oa7M(p44|8_s^&ewH)32YMtUbe z=eQ}>q=HWJCHe!8H}>oi{Vgxh<-6ak_Wl>sZ4386egy(nI?=YN<6Q9F9vkViu!y;K z-`xZ+v?nv-?wcf@7@K^l(2Of)hh)Hzmnc=*@;(w3mJSJ zizCdXmKb|u9+lmU_)eIN9r7?3Bsvnj_~=bi)oA)hpC>#1@W=M!p?6rEDY%l71uP zd@OrkW0d01MAMx#ChS#r=;ft<{Xsj}0lqQuwk@sZz+c&IQ#7Ub0!2bl>p6Bl0qg2V z^#wKsXt-w2ZkuXUu|Txk6Cv5?{X!FM8$j3GeiWZ9uxVkd?GxQ=J~&U5rYT?xJy(3))0n&|#F2RyODbH8nw5_`>QY#$z8YIiF=WFvmy zk1Vy*opEC>-{y-o(H$|Z$BH!!Y>{BgX7|LqTfZ&7HQyn|?N>w2XzZlB3! z!H?bL(q6cKA;rXRd@J35>2aW)ip6p1PEX|ddhYcou6CO7g7a=qMRx%)ut%zD@Am$X z-R=D@`U}#1E6F|Q-VOjA=$!!3g81i5_k8i4lpEUla77n^|6->+ptGt+ncf$#!nxYp z7qsu5WSaxpEeoVGGFqgYg3&Dybfa_Cm|to0RlRAO13r1{sX2Ckx?6VxjNT~k?fa(f z0&H@BHivjm1bQ5T3`pGx*@~QKweCGBCY1zP-~~UP?h(oESpiy{h%FXkGbH1RC5m&+m_C!B!iRAN&bUc)}F?DMRT}0 z>DF+HaYfdD{wBn!%YLQvA;U-If)B;m2nQ95R}nqP9`L|k@1^$;SX&78mH0sPnKg@R z=J$cDqx+0q*T{xhFP`Hqbfzix!i}ao9Ul(96_wusoaCrN6$9QFWzSaRt$wSzdOf{C zp?BxLn12iG^#e?Y5dL&mxs&+;G@mcdk{2hPr+-|3qj#*ebRj(NUSoJt{9lt@vnImR z4`*qWi04|+evExT!_xz{nHR&8%5K@#rt?tOONMJMaLs18z5-l#!iUTHr;>}`2R(HF z{v7NAKjf8PE4hMA92bwg>Rpbb_mBnqC3_+DA#$|ljSS|PLU3RMMsN zZfSSKTl9Mh*b{GwepKMH`40b1^M!yw`mGLs=d&(qjnF{$TNJwIO_kr-!e+>BlOtpy zQQR}PX^yZEWqPX@$K>%>?DrAU+6RmFocuk>mvr|5-&Io#e*nq-O-Ww6e+Jq8fr88W z6npmu$AxW_p6@yN(s6-LG*;`{D@YqfS2@yb%*y&~j*jcik2*dSYEwkZ$Wl-A)3 zJ45MWgA8`DK~nEjU%nW>PdLl`PTG&b|4?!hH{gskD;5emOZ+dsUFTyQWb?VJRtV)s zB|95FR2jB%v64T2L3xed?pW=~>^^u3bZrpizcm$pJZq5Tdliyz3LRU2-lahL zeFDY9z-L4IdPUh=Tbl`PpM4+#ti5z`AaW=7rfwa5$)VdC4KBgzxjjA zp}4aOdYS4f6N|;SQFPX>blE2~11(iJUnFPfJkhywJyZUmwd=WBv-CUhY#lmcwLf!E zZ!3g;qjQ$S_~a1In1Y?L$}YKo0ja_|{kAeB5cUjwnjn*O28Z@p=&-Ul%iEwI zjmf2~1O3*CZ>s2?@ko;~;mO6D81gw1CR`_lM-ME7!I-F`&(0rk*bL-!d^7l<+SZRo$P<~K#P^L0Z%E5@_R z=A?0`O$_=kHA?uuhH~K^B{yXk#|7Y=jz_sik4Vl!XZCH5^TPMhK9Xz|V=udvoFCvp z$koWzZ*g2{sgespz7F{z3ol*>Y6L~waXPMJ@?t8n@ciqJhwuaSh_-hTow6xyn2qu zM1GD(T+JOvE$;MYiEKFTY0zb!#3L%YPYEg()N0A6p!4kx85$M?{zIa>RDa}jFW_z^ zUxE{VlSseWQNT|3;GVNjWWUd*-}%)1b`pG>H_n2^ zk8IC10{P<7?|5r<{~vV!&3^OzyJ!oqtNDE)?G@d9L|clYCsDif_0z^W4O@9KW$Q-T8~$$X^LUU+3KP zJ86>R@L|M%-z1ENe-pyqXF1nOv}o$`JMTtx_VMk-e$OOdEBPPl7+Pz*_?s1HKTq}> z8^siB*%^|_&^zwdB2i{g%*wgX{_LHA(rRs%NpIB9j`Xu=vk=c(bA_2$Q#9ILfxb{f z4z5z{wh{l5Pu$Nt$woZ4D)9sIcN$;B2dkE<_RPgoUxj91Rz}@x{ zSPT88mt()jBOb5vkYXK9{`D5$IE^YJKh_uf$%8Hd`9;{@BJ6LGFp2mXHW<(LQ(aQ) zUyUQ%{4wdb^sYSB5dO?F=u7wS4Izt%p-eGRo?nahc>?|BntnS*epVdDp*l6&2kP5b zAXvD_KT!BV`$EJdpN~!r%S&{ApVr^b1>b($aplH+5E}BlHWr8 zHFS6H7Dm4t7k}?4*aNoJO51{DpobZ|`%StmmUP+w z!hVwt;oNhI+s3O3#2ES%b*@J;pX)*QO-g)!=TuiO-YNP@a~!na@v0nwe55T#(H1Hr z8q~^$+Oy)gTP?nwuWujey!>>xx<)osq3tR0_s6hRFc$Xdl0VMK1mwmqlw8mkl0CU@ z7xWQ~#5m-qkw+ovccKhiKOg>DDpKVR=piJpB97a+hT{%>uH?oS(%rw3JAf4QI=feY znlj3vVz%cn(it+}TE%>8k^%J2sD$m~?^oHIVZf|SWxq?gD*1C{lePF&dV|}Uz3FMk zVx!N}`zpHM%`U#cWseu%22!j7?R+KzPWHL;cb&$V9KnK=iIjzujg*Ttlg8E*T@>GS zfFIvzyVpkX<=Bhqw%kC87u@;Lwhg_1bFlY&#kU55eRITkm^;7H=2p7JwiK|pV8730 zF*2HuVm%aRZVdn28RMhhn4ibG=zSNh=Uec7DXRl-T-q*+*USCUvDa(;(P0eVZ1w*f zzFzEpfbfN~x*WyuAlVwm%Frv9s^AM2tN>piWp0K)|Cz)?Ctl+?8`7qHj=Qse4*c<& z^g94G*&58wC)@*oJN*__->q1TGpyLV*XF0G^`W!-TkZ2Y(eL}>ZC2p#!SD|P{uGPm zVhU_gQ|S(Iqm68td84fM4KK{Id$l_yPz+ju`rVT^+9-BHezSkqHL#iE?E#dlPuf;O zCsn0L@BOZHseLzF*+pu1ql?sk&Qrm)Kf&4!S4-`-g7@}ymFz;zlvR)`-?m21xcIkn- z=M=(uT-lE(m&)3a&k00)t~`BQa8pTd{|U!w;W>^CkLQTLrKsZi+s~5>@H{T4iN_c0 zswhR@eO>=Q_TD`(s^aW_AD=zD2_eL=fruEQ*@TGEa@mAH1E#uMjflEH#8goe$U;&> zk|qm{73zjfLZk_eBwVUsR>hXLFRyR3wB>7Qzbh9-8x<8TRkUZ%W+Vc&w6zv*?DzA` z%w7_}+V9)n@2@X#9oK(4gLL4 z=-Lw0S8`RDNAJ@2j`Q-v_`ZmD^PW*}a?*J^j5Ip`W45P^rLTGo!o&N<4Lk=7pY?`A zW`B&+Iq%EL7A4%a`5hQv^t%k>N@Gp3%#&o#4IVALuSe$vHo#fZDDZ#rlAlY8c~5wK zi48p6)E9Wt)E4f4w72kLJSE6OXHMaLlQZL92%Mesf~gqgThXTm3;BjB)>CN?#GE+; zG=`e(b^Tr%3tK05f_@MUSz_&!e1>h4$OBjio{2v|c3Yx6yCr(Qbg9C-H=(bM3dZNg zoGr{Ed(@V<#Tlf7^b_rJja1p?8o4eMnjYK#_`((=$&PV<_O$a}+81cq!bz_)p|)L& z2koivn;ezLgdZi^#}_(IUHWM94`qMKNJmKHmJt6!r0mab=rSto@_iLTqVo+XyFu-L zoXLJz$i_nd8uLK<3SSBh8gp} zb6g8QJ>>=7Kcz+N?cGQFm1?gNwEg6^rQLj6oy1Gj-rKHhG3F(&H!@XUFfM6*S8e6_ z0`DyhjK=S(nEec?%gEApiS=9@*ezh{ExitSq$uovQwD4Da4v_UcP&=H?nqVTnPWXk2WR{AKM}M*q*6xinVg=9KrHdzS|Ur<*gA|)@*O; zBN&@r44#JUpnvl*8kdM;1K(p#t`J&J9Vpo!+jJ24uOlN?`+vB;FQiv z;vs{7w5omGo>6ZI{%aWVm!mdu;=O2}p4J8Nv9F+A09pG@hqUkuDwRPRonj zKX*MpxOhGP+1b#k(^G!W!!jtrM$hsW`Of9*`I#Xv28Lo>$rldU=UT({Pkn84A`FT-Z=Wgmm4ZnG-7Zw3AuwNBv5oe0T)E(&=C-?|UKA3_`bX#2r&)c%J9uaR99 zi{fzViyX(d^_PGTeuexy36G+E?Z`{|9_{MPc;_#`&*5?48ILCwk7tj@-i>3d5Me5w z_28gXA0^gq@7pLGa4|77Ee6#hNGOzQ&OsLOOd!W6sTtwLYPL zv7J2{Yrx~glaI%Or|G{De;jdy`qLV7f2&*g%p(}-eD4wH>l!k#XDgUfPQYl;XD&WxR}UQ?HOX zqIc@+(#{CwjJcxG7pU3ApLvJI8l(hqbG}!`LtO$Yw&WXfu3)7Vu~B;LU#W zr;ULmwU?Ro=Z%6liw7T8o8HZn!JkokNmt>CSK9)f$**(b(-_`6F&_R&yLCE$izz1E zZuBJ?eIYye^V+{(w*Svew*OCTVEYpaX)K!rF7D5lx(#CAK5r)fgy{EOQV*#Ax^CWo zO5%pMF}{T33GcP~ALFERPBu=%SyO+~ce_rE6t+o^3EQLuVVm^6C^t^nCT%p@*hb@% zlgbv(?=#a`SI2!4pIz}-i`XN7TyRR-C(XflYv_|3^}8P(SU=TE`UF((l5c>|$?ZCE z#YYbrZN7($ur3DK-e_rZ&o9Z>&J*-@&OnRip!{C@k9lk9Lq^z7BI)OhMm?kd6VI<@ zU5UOQ>BD+x|D#FQ(p;oR5iIIx=jEVpny?L!>BCTu)AqK|&pp=k0-c+G1|-r$0sdMPV9sX!&yfGhJv(^Mbkd`db8zJ9PJZ-6C-41cCr<_s#B92m z%GY!sd1p^_`bm#>iC&B_S?|>wzTeHAKDnQ>_l2!|-}0@z7_wgyyE72q@ve^bH1_c7 ztvspJM=t)aP4q9(hn2p6pwE7U_Ey`)_*t>W3a;(uYhQgx?A0gu<=Bx9brQzvGt5;w z-amVT+!Jf5!I+`_)GliGUuiD!{zo@FB;LoqJB4>^@_sDg3h6Y)$EJ1jWB-BYe+?Yt zxUVtBwc#;tiH`9bC!=G$Chx*yTsti~#!HZg%A>O#ERw{MX|f%E#n(u@@>`TQU#0mT z?&Lc&JNd3$@RbBp_8$jWhi;B5_2}C4<;GB_&s1(FeR|9d+Ay?ZkzP!?*3JWZk}6|f zo?KTyB0q5rlE*k(Am81j-jTjQze?MlFY$I9+IDPjH>a@~jd2j`InTjq{hHZ20k_2C zUP9;pNuV#_#S#U7%|^cb^YguVPUd^zTxj|c&<9V6T-!s4k5cux3&_s9$Oy~Jqo3&H z>FYXqIdJLI7?%=DDqyplmmW+NdnQY=Q~xb{CM3%wfUlng82$L0avaWFjrmAhE?~-v zF(w|8=Go$G=ke%c66vA?P8OnFht)UC*`oWEZ&ZI~2R|5p=-@>^>=0||_~jjRE^0P? zxAVk=D?CR2)DC`xJs+U8MK*?EIJ?j~t6d@28R4i}{}!>v+@)Ivth2#u%<yv5PnwpJ6{RV9(u*N zZhqGHia0OL!5rCuQ__KZPkb2lbtv$}beBQvYC8IVTo9J4@!PKAhjZon_=5I*l`NjF z-c5vTX=&_~`Vteo#%`=t`%gOgG22XGS3`CmAOAwa^%=;KXQm946W+)Ba>(XkIid1H zDJLAGJuBrebq&%S=JtNFzuD_T8JVvL9}Sx^-gfl!wuvo5x4#r{Ig!Q!FlqyxA-jUwPRT6Ir9YnNc zwvw@#uNiBmNslKV3u)gmB>x8-fjIdwNX&do;K`u~$yOxc`M0D`Ow2)E z^}+SxdvP{OaE-PlIz18m9*fh--oxVmm9T52w%r@kHi8f0QR3`PI>ATmEz~65Ba{(Xt$@+ic8@4e(03bp+dVu0=3i#H3wODq!A< zb)Mvrc-oQB-haA3bZUup2QNV$I$yo&qtL0&_o6<^&Z_ftlBLgN$$42$XSdJFxk^D? zU#k4wlJA!NvY!XZ7FYR3C7gIz`6lf_+@BX6ot(!u@>`^T>Rw0Z zMt>sTEKzu=4~5=o)1rF>z5Q|yR{|CrRNJa(|6JAebMjAP$npIN;-xD6n7C93}2 zz^P7^{!^-d>NYV)!^uBFUKH>7X|G<5#S34APUfg`JIF7FD(lC{Gg`G{1j*Df-}m6R zMdkYu;w0ag$!-#|&6_BX;wH3z%ipcBl1+?x5H|dm+`m1%TVsWfY3wK#Oe(@0{66-d z8td8tc@E*84#xVujD3u->0!o>{Y+!q@s#7SA#Dww270%Su?{dhlvezx#?H1f)`#CY zi1$4L?gYONBRslGV@q1;vM|O@uV-vNewQM2Z)9xzR*hBt81mvzAur;8*|!b#qg^E} z$cHBt?Xci?!A~@nfOo0wj8!xfp zHP(x=itzo%o6#PGyVv0N2F7|I+j@|e?v?e`;`eFv&57^`!hD2#5T+t*Kv}Jb_e1ur zK-i0LKEfV^9`vaT;TnX0&MuVEh_ON&8W6hiRNz^HXE*va8({&S@p#hlSjndwd)`Y zmgY*E4x)$Uh?6al+5WaZYNN*}5!aO65o8@5e4RM6x+C~B!iLFz$Tx18VMs)c{$K8T7=GFV8kOIp=k@L)F zb3=ch^g`vSWxwmK&u9{8#&5U=S)nwd&q`o**d5zR&C7q=4=Qesx|Lh#F)A<_2~N4$yoSMJ z>XyHF&t?U#2~V@Gl6(mVQr)B5`?pMMiEn)Z1?B>WU*yWnE#8*t%{lLLSv`p?6n z^*Yn}7QgY;Dol7V$L^63q)HRfaLhQvyJOMJ`Ptu??XeL>l3num-G1T+hh+V2B%K%D+;1jAe?B%U(6gmP*_I;2nx|UR;)~ z$8WU?|#1)(ybkx&<8sH2v*-DF05O;I#7}#wW{u# ztr&wAzaE`}RP#yRF=YcKjvj88hajgF3E$%f7!&@e0ksv3-_UNSIMV^DB+xfw9-x{6 zk^JbX(4LK8{WJeUR%L>1Z`lID;H7e9^FEEA@&?dDsxgv8S>b67-SpxZVtMByza#Nwnfd29B~SfthqPnRm_v0+q{z&Z2mDRDO=5t%!eLH8rum)_<_7G~>P>@*7+p~s0+K4um3N}td9LwpDR1s% zn2O3m;4zsB-#jm*N+1XKR7nbK;2T06{DWIoG|j>>79OCqL$!N$=MeNU&Fe?s7ESDB}WuYs*pSw=r8b(~DR0BFlf zjR!j`_`!j4XTd)S^xbbdQbM?>&3KQC=W_dZcF?sp^j%qq#r0#Vs6W9L-^4C`hrIZN zR4yZPgZf4G0~z+ocAF3{Jr@3}f*gSz?j=~WXf(t0`#*9`?2z2Xj2c^0jCb`BZC4l z+Ks$ldwWnkUzuoou#O^ox~>drBV}X(a}?iW^XnvpMQih^r^(Cj)glaRU7F*WK@)V} z&TUB>qV`}9Ud`j=3T%>JoMv@fD2n)26>OgVo{*ric|1Atc4GJ|PX8SFiC~W_97dO0 znWA{)0ysarLDCVI2nj{1GX2EmyJmo*QVE?#w2Gf+X#>K(j8t{*%EyU3BOZmnt+RWn zt9m=>v$ii?MB?8R3ua4w;)9hiF zEbz_3LDvUyz4*B&*U4w!0OYU}xz^24y}}Fcnv%sI!`7Vnip^{rYO!22tvN!%$eUl` zG?;%RmY!@IP{(Sg)-^T-E%Pu@Mdg71NWjmgqSTxZ+2T%BnoDKQp*uSFcPBzwHxk)+ zfIiyqq3(b%eo*Kmr+N01-~A0^i7L(T0+J8Hsyi2yZpTsG&T5J>A^wbQ z+L-JWOOE-3Kbc00vfCOfpw>{f&N_2pAf0e`RqpR>Om!D8t@zpS{p-muFuLZ!H4`VR z*wKQ289Ffamwhz5HrtA6iYa?sX}@31WGuApu;9FO-(t@=Uu0Q|%^Cd%=6-Ei9hHCh z?XT2rIaruiu2GArU(#LrLdml4J6C7?*hH1u$?42YhI*TqF++i~6IYPd7**-@Q-A|c zbbl6;fv=C!Q9Ug9cH%FLwXM(=HV8;8kh{b+8Lljo%~T`Ep-u_LofC;$ih+dbJ0-)< z^C`W=8xcapYQ=B^uc(V2QkJLDsF8Fwc0(nY?J=kAtH~g)+-e0VFD=tQuc8U7~tkK<-`qqdu#$^?7`&Wz*)o6+h$# z=@D60+g~&%k2x|w;>fuwL$IaRl6%}NB)=))&{n*xCyBTXxU;}INkZ*^I;rz3DEW)! z{%_G@#%OzVXaOd<7c}kSMNfo3#a!?AILx;qw-k8Oo@LI!^B;2q zR8QL^?MQfVwJZMpQSa<-sBmL*`ip4`pXE{4;WxbJ3$A95U}jGMwr6LO3j(brr4e-b z6t}Z?MEC93pU<3^7UV^qCuq+#@YrKpd0ZK_B+GIf#?Fz9sV9d9xxBMxm;+wz+kbyz}_ z`i^&Jg^2p5c4Al4l+*vyoQ05-u~0F*W!viXuAa`!;kDLI4Xck+y&+7{1m!KF+qbuK ztx1VHmhuZ?^lU{2y8YhkC@=2GaZs~I7seU zm5J~a5H8;N9d|$B-^#V<(!`-?JqgBzUh|RV!usAu%vS`c@3ioQE5eGb(`J+@9FQcV zr+;xYy783)e|g9Neji1k;_VYPlff=;%)B}pay0X7g^LBTeJDpQD`UP+(5m$1PulR( z;C!6CTDn^6y}Gagq;%_SX4FXmJ&f=8DS|Wa&J=%rqCpeg>4q`jx%yH3AnW&VXAvK; z{nX8BZb(y3lI#QTHMh=umVA|>q~>`7VRMGs5nC3~t!H#INI-W}xvL!+jLe5llC51C z1xZTKdUMkY##~ju3QRa2Y%Z9hOFK@p%2NNA9-bLwf^oJ<&`yC*&?Rs(ACANwu!L^| z-sh}${bfP*iVb+}%6KMDeKPa->k+k{BqRN3w>#sbhINo+H})<*kVn1>%vOaUDXl^Bom}@p z6&c_@x+N1zDaRqW?wrsgy+b1R3zD+@uHCg+8r;~!-IBL++cYDH{eh_Pw!MveJ1o4A6WmAf9XAn;-+24*ecK7E7w4z&_?1$&PLLK zWb`86jv?50d-Y9GvCk)B*Jpr2DqnIN@oY=V{^gkh(>ZaijV4BI#Z6l*12W)v<*qh| zzCC?-8=1+o3`#q5j(~hQ6tdbFfl{>6kIt4_Qf4z?zXaR%YFx^7y6Mu$PKxT^$i~kT z$FGiLdhU&8V0jNZ7%2|>6~g=kmO5PLxkoni)+VP9#3rQ=;;T$bw&j@OL;Vl9S&i|&pc~-CQL-8A~v(5t6ZM&GzwXjS4rqG&ihv^ z@Vu{4KYyV>MTf1xXBAu=>IYqJ8%GgRX1-Vh`(s_dJFzPkd7WRKgh-1+9#UTG5>Ogn zD%_5(VbyFro-a4frvivI@;uO6<`1?%#nM-nyz}S`nZat=+fOEC12>O+27J}F$%P)H z1ZgiT6{d3znYiSsrU|z!cUjncKkx)mx{_Evo4+&@GA7Ngr9MuI#ra*}OY`FJrK2}~ zIqFLB$X(Y-c{5^I$9Tv;Z~iWc17jOCkUVo09*X6ftzC_o(m={}_8(g%r!q=>DBQ0p z3-EliLz$UY(VAm4->rB(VKN`v;mcmDX|T!9n@e<-=~?J``@M0pT>4zjc-lpxh+86E z>2BL(`-h?jKa3l8__-B1x$c*y&toM`U-5Csk743~mvZ&=FA+GZn*zh~$siT3<~a0a zVl9(2@Uw({ARuCSDQu~Vvfi=us1Zs$kg*Pa-B`;^6$^A z6GqLSM;urXUs=eKU!yJ!2CSbu%$uZoNp?~#u(pz|C;hhHmw0t6n&xdrOSqx1&tm=T zE^(qj-=e?4E~gXbQZTZ`_zZy}%Fvu1Tat|cSnN2QfYCmJbR*sAKGXD&(Wj3iAs12A zEZ3w<08`)e{8@HaGf&KUeMBd>(%!KEpV~zT7mF9>RKvrJu(6gnj-&L}MCbhZnaDUC^{92AXQ;Xb| z8^M;NYzn&(<)1UK`H)k;;u#|e|3?~QZDGp*E=Hk+$ISI6@fYQ23y^wz+TxYh9qO(T zv~dzE*ABXafs?Zdu9jrR=-x3)|DKYZ(iu>R(76deyzd~H@>`(OVKl<>W?iP~x1*lf z*rs#$tX(b3U+x{Ny&TTJqgFp*ftnVrFay3B=7EC;SDWlJj~iL4k?#MlW4Pui(W*p1 z*xz`IuNi{r!n>Mt9iCZ4EUrp)5m7<(F`V_QU8@b6WT1XpRyR>XQxyAG91X~YkLa$Dp!;CqTUkFdXi)Et>=ijmN@DQ1H3vN(ZV^zE zDdlkF$%y(he-2M~Z3WkK({!iA`>z8}Ia+UL#7?>3UOQ^71xs9ioG(KiT-rj6fwzj_ z%6CFNS>vW(Yv2k5{xzCH?OCUX%v&hl*X71yEiCfmA}q(!*B({b6&fwwB4#39b;`qO z3a6+$q3N0Zk<2joevju(hnphe5H{NNP=w0$S_;ObWuW-T;eJdg48rg#OAokkz>S}B zeSGX(n&MJXCNXpvR*O}Bhh2KGOsU%ZPs zf+gEaP&^n^aJnkZW4Dnf0^ix1e+8bGvJ=a2u&y~tlKM*s9iq8W1cnG3{QoO6HG}Tq z^}@(&wc`NZT;rCGY*&ZujL%mDM8A`3 z@m3qY_GvoUE#cw@pg$I??$W-&OQz zOy|}6F!Gu5V7n+KKbPT+j>yUyC4%HYe&X-GZR+ycPj6WNv-yNe2~~vQLD+nO zKe4XP%8))?&7-~d0;Bi?@u*K@7A6^ri*C|;$K=gIVYY3*nSNrEQ{d<$Y`>BYBi7d2 zD@sYPY*E#m@z!L@eY|aP#nP~|&f0I=yuoZ`leK+_!cVhu_?1SwuWQle#BjR}NB@~^ z{u05f(0fpz`{&j0C!u-r3wbtlbb}<5{pIcjzu2};I$>{b2yx&Xg;8|#>frajiq`>4 z*h!1W4Fhefoqq-OK{rmT1L1;&sAoRBw+#`6POAk8SFko7#AQDhzo*zrSNCEZE7H3y z8@Sxlw=_leGaa>9|J3!mRo-zEE980PuH^R&4}AhaeYZ>h(?lwL%&##vkVEL7OE10v z195C?fex(O*?tp^2=Uitm*YEoVo!;!y64w})>dsMNFC10k7KzGNnwj2@U$<8m;?L* z#R+%<>IdzqfLoBoAG#lBJSs)!=?k0lUNL(qC)*r$28=bGdxCuiUf#=I{gOrrH326G zmSW&?9pn)xxkv%;%T=V^0Fhb|c($8F;Pe(;7J-%hJpL--%h$2j`Kr_29f27By*@)H znxR)z(V&+>6R5sD9pZ}@0esPg5kZU6!h*{uw~sEBwi*sBhCi%TefI}4;~8*Za;Q@y7m`Bvtz|c}5^cqPW4^b4|hWYk3ZTt3@SLZ%oZUf<`6n0is?53ijJ*ixhqE6-l zXE|@LzR;k1$ok@U91hhe(IssZ2?!c_bsj2~J&MSyHkE2KJ%|0)CpI6TlhGok^fQo3 zF~QgS31tk=)`LffIpjsjdjTm~Ug}0}lZ6>S*5TT-Xuy{Pj9|oB zRCS+&8mtxfIGVe2=GNx*FP?ve)7@Z?DZd0-(g+!!vhm8jnA6#ml@X~FWkvH3Np zEPj2X>0|zmX6f4VFYXugBT(Ez#45$VAbrB@%S0_b%aSOxO*#x!28bDC>B#V%3N;yeY z(Mr6L46RH;dRDVP+4hV<4D{th4wiP2j{f-Dw5fv}yWe?1%(=|drX3H`oZ?q)pD_I# zhkW4kZs>S-j8jmGaP$1VWQbzy0XEyItjZs^PQxbgnfm>owzmfKZrur?ApVhz z%`ezb*Jta9J9#wS$t-Q*C?PN!ED3<~nR%K`GJ0@tj*P-H?z6Q~C)%J07?lq*+V~EC zJij+guTlMZ2&w{{;Xxg9Z#gINNBLtNM*Yt~n4f;1FCTd}0D&nQk_%alX8Y!*5eZ@? zayX+S(Yk@6lq1tWHI^ZRrS<_h=2YV^QK=*u{EPf2Z(sE5a|q29W8`Of<_%Y*XvqNa z72PQnajB%sS$VYuue9%dSeZvS2Kk2PGXV!5wsORv{uUEnwfW#Jh*>e%Rd^)W0;>fIek!hTyqF0J>XR&)94jxc{DInc7j|h90K-`n`J0`jyya^bAve2Wsz$$=UmUyL8_s zw`JP!3w*~TWcKxR&9Rd)rzB-j#Wdke?x$NZnsrKHk#q~nvFvS5d*O!NnWuKUYk1j8 zG6)m_oxhiYOBMAIOFohO4~iW5tVYVp_jdOK~!q&aOHh7Fn)3@6NwXTW{3{sC*% zCX0-wx6}ubiHKW`UOfFnfNY_P)8L{!uT62~HX6ul!QWOmjq|fs>Iv?#)-~+MZ}$Ws zed2P%i>(sw3Lthkw|iSI4=si!;=HXEM2+Ff|!IFNC*Fe0Qj*_+SuuDDg|r{iZ5 zp+9rUT4;m?d&jx{YK_LkJm6jHFnFheNmvgE9pM*R4J- z5=aHzmwo9#6(Xd{lQqBz)OhXC;uU8A46iuP9V7RQf)8Wpq)PlRGICTU{HFJ`m85D-x^sO6vLMX3fuJZOt$j?!a?VNgQe@ z(7Bhzuxl1vrK%JUC_4(NIOZwJj1$YdZcT&3wM}i~-}GR{ql(PgE%@z+M67HiBA0BU-KimJ?JWfr^FwU6YFnuUS6bP1`LK~K1%Eo=jL70cR)@{Cio0G$;C5Ts zDf3^XWh;hG6@rj|HKOwAN4_uAx_{_lW43KL(JzFgl-kzkOfzgWad(7!624u_y=+!^ zf~PgJP7L7Rwp^(LoW3{C&kG_ja3VX;@gbhBXdGfx0Z z65_h9Y9|MlAm#tf-Wz?yzL%}a42P2nwJ%3#@n#&0l*SxEqEWFg)Q(7(%GjPoh)Jz`VwB^Gc z7l^4hUk2xhZ!=LCO(=Bq=hBQ`j1r5_`{qo69<=~bd%uFa>QfT5!!SXr*iYtJK9f@Y za1b>ve^6rmyyp>>inr|?8|SUZ-y!HFmxmTV6?#0wHUmaI+oc53UFo+9zP(^rnOc^> zgGE+xz|FQ3euTS43msYCs8~Lj-MJoB;~^a_68!l^{!>N#L1O-u6Oee;eNAseaHV67 zvj^N@ZQlovYq*z%a6!hKi4(N%Op(kcNB+-62-eeC`yQS|uI<8G?e!&JdL24RZn@h{@6G0i`=mG~EWHZX{7t<|p9mcF>%V8tYJ7RPMjBjU`;M9Z*%i4U>6pdH ziABO{oN~gAeK44CGH@bBK%LDM$FPttuzT26X4F3rr*UX!30cGFwMzUOyv}f4alKzM ztXWjPdW?=Uo^54ro8vp5=0IRDHYRLKK*z#%A|HR@go8l;LsiK0h^yeJv)Tv$W`K*8 z8M)M`wfh$R)S)0kX3HS{7iwj_0gO^+0}pYz&Qar*$!r@vGbw^<5Q@su(e&L=Bn<^m zz?_3P`o&9UO^Ub!qx}p1)OXoJ(^p1c8$Rt#u8R6y7&C-|%*ZU)rKH5k+KMU{PxX3# zg2xn3d@fa1?jSed%>VhY442yeB%u7eufz2HQxikSW3}I=>?2>mu&5#|kM}pUoP~1j zh2T;5MKU z@H9va?ylTSbwwA~e}>_PlT{D6UESafG*Q`n@qMLX>yGYr;EY1Dg706c0}~kXDigK4 zeYKdU(qyYLCipsoW;q>9djj}StgYL+^F#Lmi%|u?sip1y#TN(nAHuc%K*NM)zMa(W z-r?$!zokZG?TJPf&Q;mNB_F|gKET4N1S*Tr<3?iLNcnB<3FOtSmelKI95l6j#l=-< zu9C!6ZdIB&*Ao?m3g;UFZuD$R?YI|pHx9@2puIjDsNX#7E)s@^+*Tj4FiGObX98xZ zLYm(?^@_j4W@#W_Yq^Hk*vRZ^#j}|I^tdg(NH)@r{Oay3!4G}6bdcP>sx{iNkWn!j ztXprnC6X*)kQ|gFvZ~pqhW#%EmGged4s7!pTRz!_w?>uYV*ZE)@Sgt9#30y3U3#AQ zgZ@>1BiVQFH$EYB-Pb+g9MDrh(8H&9yO#(qSw$JP6<0EC&3WEHqDT#y>DSC2jcwMe zExsY#K*o3$w(LXIm4I)M$UWUY2=^t)%5S|LvHmpLKqHjl(&J_jG7|oT*7oQey-U8M zg!6d>^7|=Nu^a@5AaSmD?H)8QxB#6a&mt!u+LqpWdPH-p_W z!;15Ex3o$Z>c^|f$59_Yl&WAaDILCEPe_F9)At5C!Z`PBYK>;FxjDD~VYQ3w?`Mqy z^F?YRZDXb&F+pCi41YW?fo7QoJt5tWfO(gOTi!0F}+Co%$zD z$s`})t*9v<4_|0Z^b^D3JdOq*6A~@7#z75U4jaC1zbz`{`t%7`KSZDyAsO}qD7jgd z4u6*nFVBT_M$;^A|Thov_q6c5G$nFfY-PG2~ zPDIt?d1w6CQ)7yKL%T3aqio}r^Vj}l1{)(+&U-jC?Fhl1!aPTe#97cO4D!0DLKt%6 zW-7in9JvP3`D?JANUxNZes>EkOLqj^XYgsu7>5LLFo#-M;7>i@TUj+UK}dKz(}FHIxbAg=ru_F41U0v{ zW%75;;!{>uHuLlX#8dl6zBx}zXOAv7Nl{iSmae;a?HIhFayl^bXM6GaS?%ZBR(b6d z1l7gWAD`E<5<(u*k&QwoNG2QXOTGNgJuiFWL!BcLeOZ`^+LXYh zNOI*1dLBwUmQsMqWw2pnI__*o)6kZ*X+J@%8&@|5w+p-oEQHzYkS8RIn&KW3Bh;s#JLfmI`pB~O2p&$A(Qa5CWluWv6lkVdO_*+^A%^g_RU8L zMwoK)BS#A`OxECeyhHR8KC$o*V;MYijM+4IpQY+@F=_)Xn3uKw(*jOW(tq)aJp{uH4NILZDMy){w6Y} zAqhTU6fj*H6+U#f;|y=l&iL=-$bz6iZoKpWsQ{M$k4|aF)xQTgRJO=^IN|^1 z-+_!Y(p%)-rIyP3wY8>*l6tQoK6r!787Y+Ryf+jnui*gTBX zuY0jb+RWFc?!1Ch{Z7%p2(EsQaMh}T(7q~bv^+3MpO7h>NMnaJ>v>0A{1rS9@K3_G1);%-TBu7 zAG^)FCoY7R7cXzm!kGO3AmhN-noJa!HdQClg;)n0fNMt|(1EIv(|9|M_hIi5D4>$} zod_!aNz|lRp&7P)USd02Qr&lZ69z;wiNE)C0FPw$GkChUax5L}os6HC?mRHFY;HRa zJMq``SQaMi_%Iq#j(oz6WRHf-+5sX#O=h3 zCTZcK)ix9HFLI(Jw!CV}&8D~D1X=C{JcEHHr2buy^!pjCYKZ>dFUR=%$~FH;FR+Gx z_zzg0pI?1NZO>8m?AmZe`wGMQADU&Yp=OaDAGtU?>Bbp+tB+sdSdw|p8b&P+qe*{|F)ZjxKN-2JN(@JjA4_OI3`+j7kJ%r6|t z+jyD0h589EiWJ>{Yhr62!$*@kwd0S(QjQSq%yJP1Z|2PBHigmDOXUIqny4Z^5P%QK z4k0XU7+n!QzQcqr=gB9WGxd%l&fk(xa-vCM}s32RRQkly9lzHb|ic1XO;+!v2f~N>D|4S?H?Yx4T{Yyg_xvcfuRJ zM_J&(F(ku3b1iIx42*i!X4@a2-#rxxG97ix=>cWJ4ur8p%(cZE+m9TU*5pL+RzITI zN5(YMzkyo3n^#9xL}J8{2vWH&mWAb~@`&fcj9_NXIpNC<<)^m!D+X%O>bL#G=Y2>1 zi4ij;NAC7NdK0)t$sYF%Y%*0vkRRiYndNbjq{o247tZk!^;$Wm zN-!mg)9=hf$CZxl6N**~Pkw!R;Pg3|gA~4x4YFURdcO%PkxZd74HZj%t;s>vUssI& z?fo7UPUjVd{d|uy7Moa6>!YETZnC#%mx7`lGI=zYOx{%Hi^yQZgGn*UYo3Xhh$*Aw zf*b5tFY_w=@aQZ;x&U4hzoav69zcik$k!VbGDcn9K+49~B}{V7H8GvE)TH!Ta$}uk zCCtCK>&c@0kP`BG{xTfKi>Xn&g8jKsYZC}0J1-Mh(QVyR=oe~p|Jlabbck__J!lu{ z25yShs*s{p6ya7T2wtq570+#V`ta3()cRsS(faU}es{$+pt)r`a~sd0f<)U;UnsUU zFA0@Z?6&2N)yZt>=qD9W%n~I>#x)g~A&Xz{kd3^BaBPu(MotibZ?Z7VpXGaw_Us5o z^BmomHQkfliI3g~Y(3tNOL383V_RZLrEDVd{L#`ir5WLF^Ak&PW)F{)IDTLH_xk24 zWlS6Oz+bQyP)BFKbWn5R@}E#T&aTPZl%;i}mJZ~eU`n;xUy%BTQ&{pYTa>C+b6%dO zt^d%hP_aINKUTRS*W6UD1|=GkF2?RXwA=jXnmD3^-Wy)gl}d8)=6?eU{EC^>xP(Xm ziR%>-gCY*UDn9zw2}LET3T9AOTgto@T55*(PGYxVg7=!sUZ5_7AzA z3`Su>#AP>dYOd5Fo|~a8BZZQD-;T0M3H<5u*DuN;+gfXo;8xa3LRWoLi&vH(5mKhT ziy9Fia>=@~|5fw1smK`IK_^%0lbG-=Ml|T?#zZ#1rjHxWQxkoAl=;ady{T(k6@}n{RbUdFW+)ZyV(EW*02~?X}lv&L$ycDoaAEQ;eEEF7V>JS zL(`pn&7AgDAyt~-xN*%;%Ic?!yyI<~P(|FJ7)sKH7VhVU)OP}|nswe@WG;B1fRXY(C-}S?AUqD^Sc7>-lfefCx zSjMKezflY5-~hj%{3_o@_q_`~rZ};6ZzT!{%KS6Ar(c|VsQt*V9EVI-vDl}wxY8mV zE;LK_W$zA@D2!2W1v&_^9h#Bk2V~+OJEgVX|Qq8Q13=w&~7RMBt29Fej6RIr)#R zj)<_UXbK0!-n70HALKaW8)^ZGD9M_TJWDayVZGD|ReT7kdl87ryYqKf+*p}gvtJ$@ zzv17Qd-qt{Mvl3W)D2p=(>>JuF}-t)XE>gX+&=~X?) z;{KpzY@e^x4VBMTL!mcmK#M}gNeFUmROL=rdD7YJ*L+7ZZdhWINKcO!;cm1DtNR-+ zaq3*_W1>Qb%9;G*tm(38zLyhOJ8bsQW7Bn0skOMD-D0@+mi34J>X&99H`e z3~p7h8eloU-p!|ZEtbHo|CVjk)E_p$0-EK$WPVLk-4Z=cbf;T8f0nu>rro0XlcJyo zvv*iXrBV|_wpMW}g83JqxWYC8v){kt4dU66SMfe%536$bcdepu}&>v{jLh5Yk&-dr66Cm=K{mvtlGNDU9c+iF1-G`Vb6!Z#=%!j&#|&S@jv4rYgS=L zOWr-{y5puVpi=H;pI!T=XB^k|Rp;MR&%L(C>wFgOnju!t5a1EAlL&{IX8zZMQE{1xWS z`ykPQ3c~Z+vek?BbJ;zFCdYx=oXFoK4+)!D8bhhMHxZRK%qx>3f=v^!Rm<=w#8aQg z7v&6}EZqlEKuT>SIIpcIaXljQvG;Od4-wi95bwj(%3bzZRzKP=$_I1vV4G=0Q@6DO z+avA5@=k!&LdRVk!z3n+)8dpx(*;4%tzJ+S-zO`vmJ1|eU0=gKXn%=1s&FD``=!v; zA|7`#O^{>aunh}IK)!3x2cE?sf#=&1@bRw>*kH>sNKj2KgLjWIm>Rw5{N#q`<^>b@ zUkxmx=x~swvG>9X7NP%$<-=vJQ0ABo{=$!N1ppsCRtv2~-kD(2F6QaVACJ`yYxtpd z%l3QP^>nDv#?KSLI@~k1R(pxCmG<2ffE2Tzr2a)@E!1X@E9ao{x%zEXPmR$Us(0uB z-yOf{>lCdV?}Zll;Gt4lm}u1jsw?1I8cr+WDPAMD1fSZLH`P?g1qD*UgVXyz2Ycc} zU{(lQA{eREXYYB^Nv`<*d|`GG029U;ANu>PPHS=^`v_dKFd}}@W(=XDS?AF1*EWJq zBEJ^7B)56$uD-5~F8VXbJJ@Q3D>Xa^3Y7j_c2+U0K*K9XOK*eZy>}Q=_r*1RI3b?u zIVAw?D?YV_0C&Bmk_dRaZylSjl!qw*nWpu$3|Y^Z+8KU$spx&9C3zMf|6Gtmp(ckz zEIcP@hvH=1~dPzN7mSW0bhFVDajGKclX9rW7aJlAoUBo z1#(hlHS6-sV5ZeiNzJr>l_p+q4IUpg^|N+8@?v$zV;-lc-OwDZD!!r!GWL}Ks!p$^ z2Ke^}mkLSpWtr6{zh)H3zyhh+C=0~S@n&uF6R1%?)|f1}ZrqpuSO}=n9Wd$cI48S* zLVTv0olDF%e=s*+e6n+MG;R1PWC9OzSy77!M2ozSlFWyuh#zWNlI6S)_p>^SSeBu= zu5VdG-gfhu#|CmsF!~PCLWFFAYsx||l`}5d4yA@8t2=j{Fa4?Ha8CXDw1e2aLCk~M zSU={U4JQAIMK9h(!4LeIZxYbo(f#}EHh+z0g%5LJS(RnRJN)*9EDu!8*8F54R`N!YtISM9J-GOnx@>zXY zh~901+Pq4wPWst|p?BzMY83wLpV`~dB@nw?6N&er5$A5bV33>$M&{l zRWLk@det=5MEhcs&}8X+|Fom(R)UDB`$2)h6J-`_Qk+_7&UN!Tu%Z7NqFFsn)9&^6 z{k~g=B^>}0sA%3sHa}dqWMMdlaC2ijIZ$aOyK_EEGO*$}Es|@G8SP0ahZ3It{dC8S zw(`(&Hy8G@Y*suQ@pgVRXrTSc=*?$(CR)w2r-k1G%;%0n>bFVoi~g|S9k1x|7QK#B znS5Ju^kt#Y4K;`k8jYe$QhWtij}^ExGkh76tmQlb-KaEk?9Igm z7_g7v$P}O(=n0>Y;t58AVNZDbWHhv01)~p4@LJkWfs(MwJ8=Na+Mvab>QS4C#SV5haD0$o5N{ zA>g&!%n@ZR)lcOgTjKRmO-QZ6pU^8_?l4U9h^vcbQi41AOp=t{H>t!J46pm|KMC?symirZ zp)1MHcHCWE0r$)kc8ks*pV-x(F`Q@lIp3v5cBU?+<=q9)exEgU*u{hUKl0Zg)*F!# zO;}`VOm=x;2Kl&`qb)nkgN}$RWWjUaE_y7B$o0&ZOtifJPv?-miPUgkgMTh?o#c-QOrtDgrDUIT#>ZCnBBQW0|Ins6dpx?$)a(BA&DTA_i0^ z_$1#Y1c;|U%B_*(bF?2QU_7xYf?8Kdwfa^V_bC9lq%`Ur27N4>Ql1ngXh!#in`*0w zSs@RH#UH(|QkFj_gjAZpWj%D)eY35tW#UP*64&+iLb#x`krdsdo(BEu{Y2_1Qu=Kn z)yw}YGu$TqzcRJA7Y_@7|JC`Wu_pYlj=p$eHSzZfcQ=#3i^b6YU2=T4ZU4W~H1rCc z|L;!jG&j}%4QBfy=js1{j1=p6BH$AX$eoIi{vTgi3m{TMFF+W+1zX4W2L!+|KqFP>LGIQ`Q#mC6r>Ssf9H zY1UEm^Wg6?3^59ePxj^dzt|dho90$3mZ{)q$g~A{SSHm~RMF{vw(!;DsZBS~@1r2v zq-N#4EhdYjsgv1cAJqsuV4#nd|ABDbd$uN*h>ra&AWZ$cB?UKq_cm3}DLN;zZbFj;qhbtkleK=X4EmkLbj8+N7gV7&N75}@j7)}-^plP0%| zzczpFEnw5+t?%|MXZCR!Pu3z(NMRBTH$0zY%etGHb@PlDtDkkLjA8pSL&yOYf1eaVww-#sO%6b(#Y^y_ML>( z3^1AB4N(py=SHxrwpVc4Bt5r|lB-MAwob2pmpmeRs;|yqE)ZX* zBha}p#;4{uk@d#)TknrR>V$ajYXJ+s9A_Qh3(=HJ9x=>tE~o{uvgkKy0*(TqFYGZy zDfA6vbo3wtFMu6VVvrpdamwF&c$nAnWx^5CuS7-T6?3L=NH%e;l^QRuLe}a0$?|z^ z#~#9B`YOhZ--3GgS)z+={2cwv{#Nr=K&HOp_UVQ)o+>F5E;xmk8*{7S`I%&Sh%L`T z9JRa6D&*-u)9ONhMRJWF=9pJx3^biYug=krOvJfeM(Hx%~q5gP#sakQH<<%fGsv)&&Y zg^t@j6sEi7YX$L_F@$^Yv8QvT1C%E;dx%QjqmagVH%-`*zgF>Au>DNI2<<6Pv^Ut1 z@?L|c8t@7h`fo(kI-BN%v_Q@0#gHaf_UyQ(6OiJRk|ZgaeU_xVtNueO+x`Rlewzx4 z@<0u&%l16(;^U(;XL#<)wk;}z>QVF|eM5ilL;0?pX{!nntX0eZtL-dmxS;~N?OHTVx_yKn;$8HgfxPHwCvK|OLqv;h)b0ZchkGm#bZss15TlzMAzCXpz%$-}SVOHeh3`ef`>$>7~ zyMQ%FE_wSs!7#FzRzbz2RN#s-H?&2|628MI&ov;7j}!=z@zQ+4M5L%0a->raSO(`E z+LQ)7FHJFNo6QJh!|+1g`dlPSlA30V7P|Dm9=r}viyyXinW-H6sevyvqfU^qq8 zq;rQN&i++<{hy)iU5ck)0Vl7RH~S!?int1dFE)129C6w0P+ zNocIice)jC<@&4$Ekl{h;Lod&s87;fq6+Q^ap>ap8nxRi!!L^f#cbepElHb&R6dfEIGTjH; zy^B?x(-nA#`}!{~)e-`(^ROufmJj&g6JS%Ltvj{WvNi-50M5jgk84Nx4E!zYZ%2w# zI=76C_2KmsXB`@8vuTGh$dr;L?)UHK+MK{MX%*$4>&>S%4g75upVm)+KoNZ!HVqAD zDd5?89jGA8Sf=bRsHrtM;EjHhrDf4j%oe@GTbu9o^(6x@YdY804=_N+^6QQ61wx~S zw9)jmS%x%F#(cTYtc{NEe1%5^eXs&<<+v6aaCsaiVBo#@E-v9JltMe@k*aadXa}@1 zz};w;FGG_f4+(|A%J_XGo9jyK#vOk4XSR*F>{_w38YB5&6Yp$p>rjlA*3OQZ&h}+4 ze+!mfb3{hL;H}!(7NE0@Oy5{&^a`F$D|0_7hJ*@nFKNT6e$uGL8EjNhQTrDh{|OA9 zZySX|RZ?zOMBe59b6EG??dQU5xnzUtpwJKXuukWO(UL4?p+N={MI2okMN$nt9Y{a1|_!B1k>PRhx_@)f8-C;DhS` zRqoOs#*zc@LSg<<;rFKg<9q_KVLJ`5KjpOn{_*y3Si9+jQvGBa|0uZm{^=zYv{5%= zFq_tbFLcakTK-c-UW;>Nk=#uwX}2L14MEuD1KX&0P66*O027>k{? z;Wv5ziitB!1LnB9+xsjnqh%Bw@GIy|dYB78P8M)ULFmA>);%|AaN<7F|2zi9jOw<= zI%>8{{G})1$hqb3d9&A};=Yg3 zKLA?fO*0;3Dw8A+4UI~2gF5bp?f>$`pQzkDuBu6Jg_@dxK}N2SPjD^d*ZfacAdu^_ zra|yao$IBlI(GWld%6UwCKPAL}qZwr$k%{ zHE<9YWxp6st%?zkby%P$P^7Zz^D&n!raVv_8wLEbjKkpTp9zFuA)C!I1=2{@0pj0!L#P?L6-{|ntAuPMu|j=JyS zi|dP?wo`2*SAk)dANY42?{=dvk_5HEHJ3aPWaY!0n7PZz<0#UdD2ozG?0Am|N1=j3 zB90gGsbrp3CEAERyKSKHK`IbLlv(f*MC<43mo^tk3Xy^9pnxEE zj0p&GcY88ftBsnHbpPlIQPmj_rgf>~`!IS)>-OY(Vi1L4Re9PTCXimp`loWcTI6WA z_p)QUAOr-7Nz+5TGiqEC^Cgmu=aq^I&>USbi6O0-E%zAgVkSw5%mZSQ2MM+(x<Rheih3709CT6`ZKthUS5;?np9{m&td`Mj1ZoWyEK(Fk#)*?e! ziEF_F=XFxky>0UeiE+nV(j1Zk`y@)}!XpQX+63q~eEt1qGD zp=Md|wBQ>Ae8?=}?)ZE$>X&Nj#1OQgK5qM|_or%0>yetVu4Mz*SS7U9ScE01CV9{B zp9#MmvJnKhR;LkW32mS2Og)@9ZKM zUMtHPVpgv@p3qOdlly-h*}(0<@o3+fSKAYwPH6%>O>1 z*hNU!kWUyFKxb3VYYh_S3VUVoHXx4)Yvl~EMbrxuJb@9fjMb#srmyR}CTqeaKRwO$3Ia-+kCfMBgf1(fv9NK6>`$ z^7*H5L3y*1|B^->x|}7w&F8}s{+o-^X5u%90!E*=RE5k=Z-0R@Cl}L=!Jg&4Krh>C z^}|lA=?c2SEfSJEEw3PEQv3;iFedmRg~4-Y}N^ zRc;nc^(yqVRdbWhq!Ag}=2)jU#Nn0#X1ZW2a%;FX~ zS#KH!I0de&ywYZ?xbB;siy0SxAA~4r_G48wuVn+PBau&f15-S`Z=YhnIqKKW`jx+K zaw0k)vE*@)X`wCA{U+u=BDqocLnFdOUn}Ab*d}|eefas&_<TP3lUj6an4N1^srzn@)X{-pF> zybKJC2)s_K7x)x8PDz*>pJ3Nz&71z;58>BnuNkXseWbAdyRswdt_)GZr|9}3k*M`V!uI8$Bt~T#qEw08eOy;au?;$ch?*FR&{jcMr1)_ z4rgiiP*tV*RfUh;5yFkXR7Llr+i93QYuBrxeA=ghFBP;Xfk)dKl`Fch zb!=>t#Gb1tCPO4F6P-ZxtEp1|W;176z_>i0%KNVq)@3ga*;_eQb|}C8B2}>oB6*D8 zv?P}k^?)EJ1kWPxzoY~ep|0Nji9d%JTf6jci@(_vrF@2KSVut~uSN)fls>8VQB3Ra z78mmQiVC>;23`oIkoi2|dC_N1r~WoZrIDAVuzh}|?)UGe1&$mgi0AI_cSBwIpT!Y#Jzg0ISAOtW*jijRJw+1f96frlx{rsG9LNBWhC zR$Usj+&(V&PAjXu?CopgqQe&FFtp8jyYKr|TWnbA;3#9uqOW6TU1{-?lUyDDy!5`4 zCg)~tds^X>)iCGhE_`0!=URel<@%(CX!F6@PvHz>w&VU`M4rEeLK58Bm|l>YMJzq{ zIfx|UiZia{CUpxF1wa(9D)*LToxfX5l0n2zvrVM0Ecl77K(r}3!X(V?m&pG~YlavDrWeTSD}yN>Yu9 zxzW*AIx6W9(?Pqau`9fRul>jwwk1mb*f$7CkMFaanVPvP0M?(+G(|*SeD#1mLZoP| zjk^XK9ps&{Tm){iZ4uT|c;dg;uJj#YWuM_J3u_2qKhN4p{%iqhDq1!yDgQf*7Wzo} zGKYhufbyAZ>GyXsjde?u?PlmkNt<~y+Svdhk?Bj3OW7#JvEMS*wncWJL<__9u8k3z z$bJdm6j6C60Bf1&#ng0n6ucV9r+>HdRdm09V90*B8A;Yl`Crpx1fyw-Wtx}7YpKoC zdvzz(ZgEU5W^fTHtbupT> zGfVBdI;Y0*SFVat3K05p)(ppjVAj8y`F9Bc{gNB;Zb_S}Gs*mkIMwT6%y9E1~;XD2VBkWW6Z&${+zYG8I zMFi`)?WcygqleCihllN?8J+_F!V*KU8ytYc#;f5(DnSlbR{7Q%gJa>9)Af@{Mchq% za5DS^I6}d%c43N33n@i_73EhJR62HZs@7$hZ9`^Q*f3}vbF@J|F!?n|aIohnWY}Fv zA{60|?7J`^-}E)eyxlurncoX8{hL=0dr~I-VcryYlF0wsL_>B0j*`0=FRfY(AS|yy zJ3TN|T%-)Cq*meDHV(NudiCrQwrp-wU7T1vN68e^e2hTa?P=JcL3?JAP0Xl=Xh8_w;QEQcl^ zZ#HMj@FLuLI>@I1y>7O>AcDiT{A!Ng4h;E%_3Hah`Vgy!CcDK}*m42HSN>l=t|al} zBJ^i+&0H@@huTO;)zpOf(^nBg4jOLRPA~FVFxE}?xDove`X9%8j5l1H?=<=TtCS0& z-4Z1T%Z1+~Si^<8`$@S*IMGyQuhp(WyJx%5PH{T>4?XsP#~%XjK8}Wd?4?;)gB3udsu8f9(fkK>bS*6nK~zuhQ5wa1u8*aSP`aN$*7 zc?k6fl1jHDp^!mwvhKFao4$g`i~0$gduEx7a*UZnpY8aI ztrSwRB-M^bUU(D$YoNeajC%F0X}7(!wQEvWX7ihge8*NUn~4H?qiveUO2rD?>2`ab z@77R2>W4IxtRg=GhDM|X<#EAL*z%i;&a5Tc6GUMVT>V(i(;?(sZt?g&9lM4rKT=ZS z(r^ux5mZxv(|y7Z*IT=O1_IxJ>#cK35e1kW8_nkO1CoJ!*z9D*pEEe*T@XP8?A>j_W)t7l2FU2r zC<<4)302IQ*<9RB#i<;Vs)hu4gF{}eU4CD61av-pPlFq+ZEfAF;=SUS-^_cDY5l$m zq4)RE0C#Gw&2Qa9R3&ie+_FdMA@8By?E>iOa_kKmV5W<{roYLcv_sDGV`%}IZf?4p zy8d#kX_R6*ZIG`zAAqw5-+u1FJ?6&XtA^~?mbaIp-H`Y4K%0u*s#&*WMS7GySnR#S z>x`Jo_Zo`1wC(wKep%(lc8w_9Q*Mls>aC5=ZDx<$Nw^;0dFv^kOXnNRNc*Z@*=@zJ zuZ#BOK>KP(>}|qPIo2`?1x%24DkmWtdHLP=gJgyMl#>+eW%zOBJzK}&lYGZ4jgA{S zYaGMmov)G*!QSA`e01PRc-5P$HivIf*Kjgpu0u3uLjaz5_8ucC-PyP z{JRZ!&lYQ*=m4bC(p{@;d$c=$5NW3y{@qUGsaq(N&8XJg%n$&4XAJt!|F%4!>0cEY ziif1LUF&EbB6)4hs|e%tt58f+{AY)Rue`pj4PUK!hpT*P4De&cgTobzXK>$S#?9RH z{L45o7OJ@Yl`I@D_9}dpIQ6LRnlKCC4{GJagm~X#zBaP!W7vqgsrauruo30h$5B8z zCq|*TgOFni_-7D>fKanuS3H9&^203vpPSQ7r3yuqj=z}_T27kh_BbP}GrI0dDA@S! z>T2^_FGMRFJ~2`(DkFc!)8NUXXdL_#mjIC-1&1 z9>>?q$w)zvgHo8wDCsRh5o%8xiDSXwuU?ad=e+`M$n_J>+8Pwg5MpzP$IV0V2fGBf z`REjXRu*139zkx;7ixQ+Ahvs!t9#E7WZ0yTniQ3gCurqZYz4L7`!$7o?0bxIN}Ij} zisk6wuDo}cj;_2NMmg?He2D{lz%tKf|Myo@*}AR)n=8ATPP-E1jpRMsu=(R~fCvN6 z$pLl&O3YMU{{+n?fT!s1lZ68~(XBlIS(r54-w4QRzeDi-FgHkYi5W?drG{hP!&SNT zBBUEZCuB`73<2GQKWeT(JFH5oA|8Cy)4*|}KNXLW;NB@G!+&AMNOGqk&nA7O~z{ZMT%yQ0FV6U&G~SG ztAu0#J!aKB3n#g{oa!Y{u$aHSaq?ELvO#e_@{|Uh=MgAixy2RTKUoT7u6B(06Nca) zH|ln0oSZ&$_O|m;97CqvU=8g?JUtWxR2K8het$cj!)0pr@q^dn&M-FN-EQyp#A_CoRdi?upc<+=~jVU7hm(mZ3ls zRv$aDYFpTosBS<5IKw$*pLR?Z@2JbwePH+3X!mhcn#W>^OI$mBV0!3P68AK`TT#Mq~? zgwAdTBc8`Wdb1bmCJr}K9PD@@+crnzbjOpv#Wzt{5j0@enSD42CzA(n<`ITaIUhG^ z+>)WM^KtA+d-)qCJD1?xvznBwPU%pNdzZ@ZI$0igt@od{o0FnTJF_bFkEP;%3s}Ah1|&nL`op4$!D^O!U$y zPTq+|AlJ)AA#FX1MmoyyKraKm84$9Q`=R zH@_HH(Nm*`s~3KWkotkkg=C&@;VDcuU=?TleBILXN{_xshNKNt&0`3=xbslPzd z^z4zfeioKJ9`zezClQ?Ydm5*^F=>xQNZw`*Twm4xdGn%E=h4)(v{O*V09*WBO)oR9 zXd1B3i>^QAmbjf{28xCEsJI(WEJIJH7VO4{oVDgM|AG#te>55PNl8`&)5s#Y1+>QSRnB&O(H4QI3nwR)1`eWRe8UEjf zlVqpShO@!5IQ3Y3h(!&(l(-ITKdT00Lw)edtN&QuGto*XTVG+|5};<3S&M_X$I|;i ze#egwRb1V@Uc$D({|xD(6F}1ZrqnWHM^@YtE_MS);rAnV!w#y|m{QqzsUa4#G2@R$ zJzZ@3l~yV;^M9kuV|z!GsIwb5Go?yR5TD*z(H5$-Z$NA&Ym8RTW!{lFW(*Q)LhB~(S<*Sr;YrqK>P zpeYfUcVgt|@0#&j)UFQ8i=oPS@m)NdVmY>sD3s{m2-s%H+0bG$bD|tH45paQ7ol~= zJ4mzUd$9X2u&|4`10;k-bMCm%**J1hATBDTAwOxSarK%@2Gf4wI_*CB@>}>p9K=kHv(3PkAV6DrSV_1YF64tG@8 zz^&he9~$~R@s$*>-KCg}G5no(9`W**TO}3Yo06ky)Yt$}vd#WhoRwL~I>ruDzE)FD z+CQbe{7Xc>&Dp5<-+$7LV~;HtA2hQ|a6>JA;(LbO`JjKiB~;gDRmGTmA^M$=_tir@ zORJ~RYB6`Osn)3HGx&~KfVcdVo0;}tLuUH2ndV{Y2xOq=4_9$7?^7ye-S%g6d9KVI*zld#@bE8zhd8)_Sh zJ+t!Gh^(KP;lmT0e5vWJG%K0%NTZ(D;)UAdx}q1u#rlj7ycOx`DQy~L)90!FHGx%F z>t_rbBa+`d+jpHTGftDa4H7NX+?KKgvxzG=O$5OXRe%@uy)R<3_4Uy+y_7!P`6kti z?-%2r*vh@wP{UMzxvZNc-pedu%LEDYKyn=hm6*PPJsH$kDT(Z)SfkqwX>6|*ZC%z4YjclPO}WL9+vM`UA9>7T_Cjz#^XQ7d$WXo^$l(HGHk?G>q) zfK(Zi%JLzT*hyAScB7e#Y48pBci*$u&z<;tDt{oSy%?v%Vl*2H__G#fc;?NOb>_uf zAwMQu92uOYm>EhM7kmzQNdjxAf66}Uo+=3p{L%sxI;>Pz7QYvwV@~<>QE3r>Vdw4F zG13ZFb0^M%Ely5Z0{&SsKHJTXB+=KBx_eLdR)=Lz&Q%It#=3l8rel9TaI9KVf$9wT zeZJTDv?aTfyb6arRc{m9T}=yA(fw7M#>?TRb;*TEPSa+xjmpy^i?e4M{he^wdsj7 zavOf>uRZc@Gp71QOPmYcY8^hXmAwdEasT(N4~Q1A=T%QC|4OQ-JPH<*3ifN&hSbo2 ze0RP5RCq)&eFi-83FadSgk}|?;(LyoeDN)Dc=Egg&l^dye%R7vek%MS#wKC8!n#1c zt!97Uu*+5IpQK6*o*<=P2@T;jja%ozvateP;>u3kcz0*MW7^An7MPENTJFYA?TG>_=A1J8k)Z@rzFe+%* z6>U6_=o+fBd^T=-PtW+!PDgkdZ}O;tVYWxxrdvA%5B8S~NVi+EZL?@ZSsbOg)0i=2 z?KJ&5+lcuQ3-#YBoU|UP=c6~o+3`&s`vadMzOK>8$Y~;KQKjJ`%c%Uho^QOSg}k$j z=BPqrcAwO&>jn0{vi>oZTY1R>MX|z%>aXV1Ud$jYfAj_rrmutkh-_Dc+hP{OYy*Sj zU}Q!%3s9R~{cmsW!R%hIe18sG`j_@qb4kcHj(m*PMP3-w99z^t%CE*PTXq7@MSy)s ztPnem1XE&EnqNHqfeeSl=Rnq2I>V0Rid;?Y*Ac-_M`G|Mu2ehw1O`Md>bQWvjJ=_g zuljZ5niwqxYVC}s%3`8Y%cn}l=P5SIqRlA`FO1PMyd``5`Fx~>vZm%tXk%mVCIU%v z%cQ>8)#&oi%WfZnjy)=v&c%_>g@9~5M!&JS;mPrS=~KUop>{VKp4dr~7S<3*9`?SX zl1FPNc3`_J=+tY->3a+u|7!+fePi~8GPWZ$Jhj`Z$R&9TDShSF@iouv zkn)J-nW<1nTjKmys>jK3D^aC%F>A>0M8-}#8RcEg&6o1?DgI~(&|W?62*{xu%=JfH z(zho3))2y7r^T^dncmcUC(<_MThHk!=#`v z-YxLAn`jeC(>j;U&Jjd4K$h3-yFU2$yP1$FV$;nrinTLP@rc1gc-V(-Q<|Jx$<;sG zBTs}$!xO?#@|f|wc*HpS?8D+M`@)(~$BIfzfBbn2ivhuCC+JW;GsSG4C2=D@W9 zWbW}|@;ULpJvsf9!0i!v04N*10SX^QIWeajm_4Ba7f31@3Ld(TD7~l5dD+h_&l{Ro3A~NoUNU|b<`MrD+ zx8+vavlk)s=ZZgjqLBv=<`2eX(`@6MMB>~)R))L^M|T9vorK39kT)K?ieB@AzBlJ* zfD?A~Y;lqe7xQCJk4O>N&ijiolPihGO^wb?VQ{l?cWgiQ-WMG*=G*Ut_%BE^^WU=? zK?EAsgXKs>0|?GxxsMTV)*VeW4dVxP81I<-aU!}vTp>pA9l7Fpr|2ohi)Ju>`&iNm z>bh^JI(lAVJLNMsQ-SfZ+hhxstZ4aBwN=^4uJ-?Yr*I{V+34JI1RgaL9@+l@?~~pq delta 105981 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 diff --git a/README.md b/README.md index 53e5fe1..527b125 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Only the own service is modified. Optional Auto PicCap can configure its receive ## Installation -The current package is [HyperDRM_0.12.0_arm.ipk](HyperDRM_0.12.0_arm.ipk). Install it using the TV's webOS/Homebrew package installation workflow. +The current package is [HyperDRM_0.13.0_arm.ipk](HyperDRM_0.13.0_arm.ipk). Install it using the TV's webOS/Homebrew package installation workflow. Elevate the installed own service through Homebrew Channel: @@ -209,3 +209,27 @@ An existing tag or a branch other than main is rejected. Attach the exact verifi IPK to the matching Gitea release using an authorized session, then compare the downloaded attachment's size and SHA-256. Git access does not authorize web uploads. See [runtime architecture](docs/architecture.md) for module boundaries. + +### Receiver resilience and updates + +The main receiver socket stays nonblocking during connect, authentication, layout +loading, color output and acknowledgements. Only one command is in flight and the +newest unsent frame replaces older unsent frames. Timed-out or invalid replies +close the connection and use the existing retry policy. Start returns a Connecting +state; Stop cancels startup and sends a bounded asynchronous clear when needed. +LG capture initialization itself remains dependent on the vendor library. + +Receiver, profile and PicCap preferences share an atomic writer with private +permissions, interrupted/partial-write handling, file sync, rename and directory +sync. Failures before rename preserve the previous preference. A directory-sync +failure after rename is reported as committed with uncertain crash durability; +it is not represented as a rollback. + +The UI compares its generated version against the running service. Mismatches +block settings and startup actions while keeping Stop and status available. After +installing the matching package, Reload service explicitly restarts only HyperDRM +and briefly interrupts ambient lighting; it never runs automatically. + +`python release.py --sanitizers` additionally checks protocol, atomic-file, +receiver-output and simulated service-lifecycle tests with ASan/UBSan. These host +tests do not replace real LG capture and remote-control validation on a TV. diff --git a/VERSION b/VERSION index ac454c6..54d1a4f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.12.0 +0.13.0 diff --git a/app/app.js b/app/app.js index 16353ea..4d6ee40 100644 --- a/app/app.js +++ b/app/app.js @@ -1,6 +1,26 @@ 'use strict'; var pending = []; var actionError = ''; +var versionCompatible = typeof HYPERDRM_APP_VERSION === 'undefined'; + +function checkServiceVersion(result) { + if (typeof HYPERDRM_APP_VERSION === 'undefined' || result.returnValue === false) return; + versionCompatible = result.version === HYPERDRM_APP_VERSION; + var warning = document.getElementById('versionWarning'); + warning.style.display = versionCompatible ? 'none' : 'block'; + document.getElementById('reloadService').style.display = versionCompatible ? 'none' : 'inline-block'; + warning.textContent = versionCompatible ? '' : 'App ' + HYPERDRM_APP_VERSION + ' / service ' + (result.version || 'unknown') + '. The installed service does not match this app. Finish the update, then select Reload service before changing settings. Reloading briefly stops ambient lighting.'; + ['start', 'autostart', 'handover', 'saveTarget', 'testConnection', 'calibrate', 'validateCalibration', 'saveProfile'].forEach(function(id) { + var button = document.getElementById(id); + if (!versionCompatible) { + button.versionBlocked = true; + button.disabled = true; + } else if (button.versionBlocked) { + button.versionBlocked = false; + button.disabled = id === 'handover' ? !result.piccapInstalled : id === 'testConnection' && result.connectionTest && ['Connecting', 'Sending request', 'Checking authentication', 'Reading LED layout'].indexOf(result.connectionTest.state) >= 0; + } + }); +} function showActionError(message) { actionError = message || ''; @@ -32,6 +52,13 @@ function showProfile() { } function call(method, done, data) { + if (!versionCompatible && ['start', 'autostart', 'handover', 'settings', 'testConnection', 'calibration', 'calibrationSession', 'calibrationDraft'].indexOf(method) >= 0 && !(method === 'calibrationSession' && data && data.enabled === false)) { + done({ + returnValue: false, + errorText: 'App and service versions do not match. Finish the update first.' + }); + return; + } if (['start', 'stop', 'autostart', 'handover', 'settings', 'testConnection', 'calibration'].indexOf(method) >= 0) clearActionError(); callUri('luna://org.webosbrew.histogramhyperion.service/' + method, function(result) { if (method !== 'status' && result.returnValue === false) showActionError(result.errorText || 'The action failed.'); @@ -117,10 +144,11 @@ function display(result) { toggle.textContent = 'Autostart: ' + (result.autostart ? 'On' : 'Off'); } document.getElementById('error').textContent = actionError || result.errorText || result.error || ''; - document.getElementById('status').textContent = result.returnValue === false ? 'Service unavailable' : (result.running ? 'Running' : 'Stopped') + ' · ' + (result.frames || 0) + ' acknowledged color updates'; + document.getElementById('status').textContent = result.returnValue === false ? 'Service unavailable' : (result.receiverConnecting ? 'Connecting to receiver' : result.running ? 'Running' : 'Stopped') + ' · ' + (result.frames || 0) + ' acknowledged color updates'; if (result.activeSource === 'PicCap') { document.getElementById('status').textContent = 'PicCap · ' + (result.running ? 'Running' : 'Switching capture source') + ' · ' + (result.piccapConnected ? 'Receiver connected' : 'Waiting for receiver'); document.getElementById('regions').textContent = ''; + checkServiceVersion(result); return; } if (result.piccapHandover) document.getElementById('status').textContent += ' · HyperDRM · ' + result.playbackProtection; @@ -143,7 +171,25 @@ function display(result) { e.title = 'Histogram ' + index; box.appendChild(e); }); + checkServiceVersion(result); } +document.getElementById('reloadService').onclick = function() { + var button = this; + button.disabled = true; + clearActionError(); + call('restartService', function(result) { + if (result.returnValue === false) { + button.disabled = false; + showActionError(result.errorText || 'Reinstall the current package, then restart its service.'); + return; + } + setTimeout(function() { + button.disabled = false; + call('status', display); + }, 1500); + }); +}; + document.getElementById('start').onclick = function() { call('start', function(r) { if (r.returnValue === false) display(r); @@ -347,6 +393,6 @@ document.getElementById('editProfile').onclick = function() { showProfile(); if (advancedProfile) document.getElementById('customProfileField').focus(); }; -setupRemoteNavigation(['overviewTab', 'receiverTab', 'calibrationTab', 'grantRoot', 'start', 'stop', 'refresh', 'autostart', 'handover', 'calibrationShortcut', 'receiver', 'hostField', 'portField', 'piccapPortField', 'tokenField', 'clearToken', 'saveTarget', 'testConnection', 'calibrate', 'validateCalibration', 'profile', 'saveProfile', 'editProfile', 'customProfileField', 'cancelCalibration'].map(function(id) { +setupRemoteNavigation(['overviewTab', 'receiverTab', 'calibrationTab', 'reloadService', 'grantRoot', 'start', 'stop', 'refresh', 'autostart', 'handover', 'calibrationShortcut', 'receiver', 'hostField', 'portField', 'piccapPortField', 'tokenField', 'clearToken', 'saveTarget', 'testConnection', 'calibrate', 'validateCalibration', 'profile', 'saveProfile', 'editProfile', 'customProfileField', 'cancelCalibration'].map(function(id) { return document.getElementById(id); }), document, window); diff --git a/app/appinfo.json b/app/appinfo.json index da045a5..6cae3d6 100644 --- a/app/appinfo.json +++ b/app/appinfo.json @@ -1,6 +1,6 @@ { "id": "org.webosbrew.histogramhyperion", - "version": "0.12.0", + "version": "0.13.0", "vendor": "Local development", "type": "web", "main": "index.html", diff --git a/app/index.html b/app/index.html index 904a1fc..049d5b8 100644 --- a/app/index.html +++ b/app/index.html @@ -21,6 +21,7 @@ nav{border-bottom:1px solid #456185;padding-bottom:10px;margin-bottom:18px}nav b

HyperDRM

Checking service …

+
@@ -55,4 +56,4 @@ nav{border-bottom:1px solid #456185;padding-bottom:10px;margin-bottom:18px}nav b
- + diff --git a/app/version.js b/app/version.js new file mode 100644 index 0000000..c99d394 --- /dev/null +++ b/app/version.js @@ -0,0 +1,2 @@ +'use strict'; +var HYPERDRM_APP_VERSION = '0.13.0'; diff --git a/app/wizard.js b/app/wizard.js index 01f029c..93da345 100644 --- a/app/wizard.js +++ b/app/wizard.js @@ -89,6 +89,10 @@ function wizardSample() { } function wizardStart(validation) { + if (typeof versionCompatible !== 'undefined' && !versionCompatible) { + document.getElementById('wizardStatus').textContent = 'Finish the app/service update before calibration.'; + return; + } if (wizard) return; if (typeof showPanel === 'function') showPanel('calibration', false); if (targetDirty || profileDirty) { diff --git a/docs/architecture.md b/docs/architecture.md index 985fd1c..7c9bdf2 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -12,6 +12,9 @@ Formatting must preserve include order (`SortIncludes: Never`). | service_calibration.h | Bounded calibration lease, proposals, profiles, model discovery | | service_status.h | Read-only status serialization | | capture_loop.h | Scheduler, histogram acquisition, missing-data recovery and output | +| receiver_output.h | Main asynchronous connection, transaction matching and frame coalescing | +| atomic_file.h | Durable preference replacement and explicit commit outcomes | +| service_context.h / runtime_context.h | Capture, receiver/layout and calibration session ownership | | receiver_stream.h | Independent, nonblocking receiver LED subscription | | source_bridge.h | Bounded color continuity during source transitions | | handover.h | Exclusive PicCap/histogram capture ownership | @@ -44,3 +47,25 @@ VERSION generates app/package metadata and native/version.h. release.py tests portable logic locally, builds the ARM service and verifies the exact package. Hardware capture and Magic Remote behavior still require a later TV check; a host test is not evidence of LG hardware behavior. + +The main receiver owns a ReceiverOutput context passed explicitly to begin, tick, +frame, stop and close. Its lifecycle is Idle -> Connecting -> Login (optional) -> +Layout -> Ready, with Failed on transport/protocol errors. Requests use a positive +32-bit `tan`, echoed by the receiver, to avoid acknowledging the wrong command. +Each tick has a 64 KiB send budget and a 64 KiB read budget; buffered input has an +eight-message budget and 2 MiB limit. An ACK can send the newest queued frame in +the same tick without resetting that byte budget. There is one pending command +and one replaceable frame, not an unbounded queue. Transaction deadlines are three +seconds. Shutdown and cancellation release all owned buffers and sockets. + +The source bridge receives CaptureContext explicitly; layout refresh receives +ReceiverLayoutContext explicitly. Capture data, continuity, recovery counters and +LG handles are grouped separately from receiver transport and calibration session +lease/model-query/proposal fields. LG/Luna symbols, persisted calibration and +handover ownership still have shared service scope; this refactor reduces globals +rather than claiming complete isolation. + +Transaction echo behavior is defined by the official implementations: +[Hyperion 2.0.16 JsonAPI](https://github.com/hyperion-project/hyperion.ng/blob/2.0.16/libsrc/api/JsonAPI.cpp) +and [HyperHDR HyperAPI](https://github.com/awawa-dev/HyperHDR/blob/master/sources/api/HyperAPI.cpp). +This code check does not replace a deployment test against the user's receiver. diff --git a/docs/publishing-review.md b/docs/publishing-review.md index 3c98eec..e878d17 100644 --- a/docs/publishing-review.md +++ b/docs/publishing-review.md @@ -157,3 +157,36 @@ checks the IPK's embedded metadata, executable architecture, size and SHA-256. Package timestamps are deterministic. No TV installation, application launch or service restart was performed for this version while the user was watching a film. Live LG capture and physical remote validation remain pending for this release. + +## Version 0.13.0 + +The main receiver connection uses nonblocking sockets for connect, login, layout, +color commands, matching transaction acknowledgements and clear. The synchronous +connector and send/receive loops were removed from production. Unsent frames +coalesce and per-tick byte/message budgets and transaction deadlines bound work. +Stop cancels an in-progress connection and clears pending output asynchronously. +LG capture initialization itself still depends on synchronous vendor APIs. + +Receiver, calibration and PicCap preferences share a private atomic writer with +unique temporary files, partial/EINTR write handling, file and directory sync, +rename, symlink rejection and explicit post-commit durability outcomes. Failure +before rename preserves the previous file; failure syncing the directory after +commit is logged as uncertain durability rather than incorrectly claiming rollback. + +Protocol tests cover fragmented, truncated, malformed, oversized and embedded-NUL +responses, invalid types, stale transaction IDs, send backpressure, deadlines and +disconnects. A deterministic 5000-input parser mutation test supplements the fixed +cases. ASan/UBSan checks include protocol, file replacement, output and a simulated +full service lifecycle. The latter verifies Start/Stop during connect and responsive +Status/Stop while an ACK is delayed, with a fake LG capture implementation. + +Capture, receiver/layout and calibration session state have explicit contexts; +bridge and layout-refresh functions receive their contexts directly. Shared LG/Luna +and persisted calibration/handover state remain scoped to the service. Generated +UI and native versions must match; settings/startup actions are blocked otherwise, +while Stop and status remain available. Reload service is an explicit user action, +never an automatic restart. + +All host checks and the ARM package verification pass. No TV connection, install, +launch or service restart was performed. Real LG capture, flash-filesystem behavior, +receiver interoperability and physical remote validation remain pending on the TV. diff --git a/docs/release-0.13.0.md b/docs/release-0.13.0.md new file mode 100644 index 0000000..fbb597a --- /dev/null +++ b/docs/release-0.13.0.md @@ -0,0 +1,12 @@ +# HyperDRM 0.13.0 + +- Keep receiver connect/auth/layout/color/clear operations nonblocking and coalesce unsent frames. +- Match transaction acknowledgements and bound work, buffers and deadlines. +- Share atomic preference persistence with interrupted-write handling and explicit commit outcomes. +- Add malformed-input, backpressure, disconnect, parser-mutation and simulated lifecycle tests. +- Group runtime state in capture, receiver/layout and calibration contexts. +- Detect app/service version mismatches and provide an explicit Reload service action. + +Validation: host JavaScript, native and Python tests pass, including ASan/UBSan +checks. The ARM IPK's embedded versions, architecture, size and SHA-256 match its +manifest. This version has not been installed or validated on the TV. diff --git a/native/atomic_file.h b/native/atomic_file.h new file mode 100644 index 0000000..099b825 --- /dev/null +++ b/native/atomic_file.h @@ -0,0 +1,91 @@ +#ifndef HYPERDRM_ATOMIC_FILE_H +#define HYPERDRM_ATOMIC_FILE_H +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef ATOMIC_WRITE +#define ATOMIC_WRITE write +#endif +#ifndef ATOMIC_SYNC +#define ATOMIC_SYNC fsync +#endif +#ifndef ATOMIC_RENAME +#define ATOMIC_RENAME renameat +#endif +typedef enum { SAVE_UNCHANGED, SAVE_DURABLE, SAVE_COMMITTED } SaveResult; +/* Failure before rename preserves the previous file. After rename, a directory + * sync failure cannot truthfully be called a rollback: report committed with + * uncertain durability, so memory and disk never deliberately diverge. */ +static inline SaveResult atomic_replace(const char *path, const void *data, size_t length) { + char parent[512], temporary[544]; + if (!path || !data || strlen(path) >= sizeof(parent)) + return SAVE_UNCHANGED; + strcpy(parent, path); + char *slash = strrchr(parent, '/'); + const char *name = slash ? strrchr(path, '/') + 1 : path; + if (!*name || !strcmp(name, ".") || !strcmp(name, "..")) + return SAVE_UNCHANGED; + if (slash) { + if (slash == parent) + slash[1] = 0; + else + *slash = 0; + } else + strcpy(parent, "."); + int dir = open(parent, O_RDONLY | O_DIRECTORY | O_NOFOLLOW | O_CLOEXEC); + if (dir < 0) + return SAVE_UNCHANGED; + struct stat existing; + int found = fstatat(dir, name, &existing, AT_SYMLINK_NOFOLLOW); + if ((found < 0 && errno != ENOENT) || (found == 0 && !S_ISREG(existing.st_mode)) || + ATOMIC_SYNC(dir) != 0) { + close(dir); + return SAVE_UNCHANGED; + } + if (snprintf(temporary, sizeof(temporary), "%s/.%s.tmp.XXXXXX", parent, name) >= + (int)sizeof(temporary)) { + close(dir); + return SAVE_UNCHANGED; + } + int fd = mkstemp(temporary); + if (fd < 0) { + close(dir); + return SAVE_UNCHANGED; + } + fcntl(fd, F_SETFD, FD_CLOEXEC); + const unsigned char *bytes = data; + size_t written = 0; + bool ok = true; + while (written < length) { + ssize_t n = ATOMIC_WRITE(fd, bytes + written, length - written); + if (n < 0 && errno == EINTR) + continue; + if (n <= 0) { + ok = false; + break; + } + written += (size_t)n; + } + if (ok) + ok = ATOMIC_SYNC(fd) == 0; + if (close(fd) != 0) + ok = false; + const char *tempname = strrchr(temporary, '/') + 1; + if (ok) + ok = ATOMIC_RENAME(dir, tempname, dir, name) == 0; + SaveResult result = SAVE_UNCHANGED; + if (ok) { + result = ATOMIC_SYNC(dir) == 0 ? SAVE_DURABLE : SAVE_COMMITTED; + if (result == SAVE_COMMITTED) + fprintf(stderr, "Preference committed; directory sync failed\n"); + } else + unlinkat(dir, tempname, 0); + close(dir); + return result; +} +#endif diff --git a/native/calibration.h b/native/calibration.h index 823c59f..63fe7b6 100644 --- a/native/calibration.h +++ b/native/calibration.h @@ -2,6 +2,7 @@ #define HYPERDRM_CALIBRATION_H #include #include "playback.h" +#include "atomic_file.h" #define CALIBRATION_PREF \ "/media/developer/apps/usr/palm/services/org.webosbrew.histogramhyperion.service/" \ "calibration.json" @@ -52,7 +53,7 @@ static inline CalibrationKind calibration_effective(void) { return calibration_is_g4(tv_model) ? CAL_G4 : CAL_AVERAGE; } static inline bool calibration_parse(PlaybackJson *j, const char *text, Calibration *result) { - void *root = j->parse(text); + void *root = playback_parse_exact(j, text); if (!root) return false; Calibration next = *result; @@ -102,7 +103,17 @@ static inline bool calibration_parse(PlaybackJson *j, const char *text, Calibrat return valid; } static inline bool calibration_save(const char *path, const Calibration *value) { - char temp[512], data[2048]; + if (!value || value->kind < CAL_AUTO || value->kind > CAL_CUSTOM || value->count > 16 || + (value->count && (value->count < 2 || !calibration_model_valid(value->model)))) + return false; + for (unsigned i = 0; i < value->count; i++) { + double x = value->points[i].position; + if (!isfinite(x) || x < 0 || x >= 4 || value->points[i].region >= 16 || + (i && x <= value->points[i - 1].position)) + return false; + } + + char data[2048]; int used = snprintf(data, sizeof(data), "{\"profile\":\"%s\"", calibration_key(value->kind)); if (value->count) { used += snprintf(data + used, sizeof(data) - used, ",\"model\":\"%s\",\"points\":[", @@ -114,19 +125,8 @@ static inline bool calibration_save(const char *path, const Calibration *value) used += snprintf(data + used, sizeof(data) - used, "]"); } used += snprintf(data + used, sizeof(data) - used, "}\n"); - if (snprintf(temp, sizeof(temp), "%s.tmp", path) >= (int)sizeof(temp)) - return false; - int fd = open(temp, O_WRONLY | O_CREAT | O_EXCL | O_NOFOLLOW | O_CLOEXEC, 0600); - if (fd < 0) - return false; - bool ok = write(fd, data, used) == used && fsync(fd) == 0; - if (close(fd) != 0) - ok = false; - if (ok) - ok = rename(temp, path) == 0; - if (!ok) - unlink(temp); - return ok; + return used > 0 && (size_t)used < sizeof(data) && + atomic_replace(path, data, (size_t)used) != SAVE_UNCHANGED; } static inline void calibration_load(PlaybackJson *j, const char *path) { int fd = open(path, O_RDONLY | O_NOFOLLOW | O_CLOEXEC); diff --git a/native/capture_loop.h b/native/capture_loop.h index c8e65dc..5aeedb4 100644 --- a/native/capture_loop.h +++ b/native/capture_loop.h @@ -2,80 +2,115 @@ static int tick(void *unused) { (void)unused; uint64_t now = milliseconds(); + unsigned long acknowledged = receiver_runtime.output.acknowledgements; + output_tick(&receiver_runtime.output, &playback_json, now); + if (receiver_runtime.output.stage == OUTPUT_FAILED && + (capture_ctx.handle || receiver_runtime.starting)) { + char error[128]; + snprintf(error, sizeof(error), "%s", receiver_runtime.output.error); + release_capture(false); + set_error(error); + retry_update(&retries, boot_enabled() && geteuid() == 0, false, now); + retry_failure(&retries, now); + } + if (receiver_runtime.output.stage == OUTPUT_FAILED && receiver_runtime.clear_pending) { + receiver_runtime.clear_pending = false; + output_close(&receiver_runtime.output); + } + if (receiver_runtime.starting && (piccap_owned || capture_source != SOURCE_HISTOGRAM)) { + receiver_runtime.starting = false; + output_close(&receiver_runtime.output); + } + if (receiver_runtime.output.acknowledgements > acknowledged && capture_ctx.handle) { + capture_ctx.frames += receiver_runtime.output.acknowledgements - acknowledged; + capture_ctx.last_output_at = now; + last_error[0] = 0; + } + if (receiver_runtime.clear_pending && receiver_runtime.output.stage == OUTPUT_READY) { + receiver_runtime.clear_pending = false; + output_stop(&receiver_runtime.output, now, true); + } else if (receiver_runtime.starting && receiver_runtime.output.stage == OUTPUT_READY) { + free(receiver_layout.blends); + receiver_layout.blends = receiver_runtime.output.mapping; + receiver_runtime.output.mapping = NULL; + receiver_layout.count = receiver_runtime.output.count; + receiver_runtime.starting = false; + initialize_capture(NULL, NULL); + if (!capture_ctx.handle) + retry_failure(&retries, now); + } model_tick(now); test_tick(&playback_json, now); - layout_refresh_tick(&playback_json, now, capture || capture_source == SOURCE_PICCAP); + layout_refresh_tick(&playback_json, now, capture_ctx.handle || capture_source == SOURCE_PICCAP, + &receiver_layout); stream_tick(&playback_json, now, handover_enabled && !retries.paused && !retries.blocked); bool owned = handover_tick(); - bridge_tick(now); + bridge_tick(now, &capture_ctx); if (owned) return 1; - if (!capture) { + if (!capture_ctx.handle) { + if (receiver_runtime.starting || receiver_runtime.clear_pending || + receiver_runtime.output.closing) + return 1; retry_update(&retries, boot_enabled() && geteuid() == 0, false, milliseconds()); if (retry_take(&retries, milliseconds())) { start(NULL, NULL, NULL); - if (!capture) + if (!capture_ctx.handle && !receiver_runtime.starting) retry_failure(&retries, milliseconds()); } return 1; } - if (revoked) { + if (capture_ctx.revoked) { set_error("LG revoked capture; recovering after source transition"); - capture_recoveries++; - recovery_started = milliseconds(); + capture_ctx.recoveries++; + capture_ctx.recovery_started = milliseconds(); release_capture(false); retry_source_transition(&retries, milliseconds()); return 1; } - if (settling) { - settling--; + if (capture_ctx.settling) { + capture_ctx.settling--; return 1; } - if (!CALIBRATION_ACTIVE && letterbox_mode && capture_preset == 1 && - milliseconds() >= next_border_probe) { - if (vt_preset(capture, 0) != 0) { + if (!CALIBRATION_ACTIVE && capture_ctx.letterbox_mode && capture_ctx.preset == 1 && + milliseconds() >= capture_ctx.next_border_probe) { + if (vt_preset(capture_ctx.handle, 0) != 0) { set_error("Border probe preset failed"); stop_capture(); return 1; } - capture_preset = 0; - settling = 2; + capture_ctx.preset = 0; + capture_ctx.settling = 2; return 1; } Histogram hist[16] = {0}; - int rc = vt_get(capture, hist); + int rc = vt_get(capture_ctx.handle, hist); bool populated = !rc && histogram_populated(hist); if (!populated) { unsigned char held[16][3]; - color_valid = false; - if (!continuity_frame(&continuity, false, rgb, now, held)) { + capture_ctx.color_valid = false; + if (!continuity_frame(&capture_ctx.continuity, false, capture_ctx.rgb, now, held)) { set_error("Histogram data unavailable beyond hold window; recovering capture"); release_capture(false); retry_source_transition(&retries, now); return 1; } - char *line = region_command(held, led_blends, led_count, - (unsigned)(1500 - (now - continuity.missing_at))); - if (!line || send_line(line)) { + char *line = region_command(held, receiver_layout.blends, receiver_layout.count, + (unsigned)(1500 - (now - capture_ctx.continuity.missing_at))); + if (!line || (!output_frame(&receiver_runtime.output, line))) { free(line); set_error("Receiver connection lost while holding colors"); stop_capture(); return 1; } free(line); - if (!receiver_ack()) { - set_error("Receiver did not acknowledge held colors"); - stop_capture(); - return 1; - } - last_output_at = now; return 1; } - sample_at = now; - sample_sequence++; + capture_ctx.sample_at = now; + capture_ctx.sample_sequence++; unsigned aggregate[3] = {0}; for (int i = 0; i < 16; i++) { - black_percent[i] = 100; + capture_ctx.black_percent[i] = 100; for (int c = 0; c < 3; c++) { uint64_t total = 0, black = 0; for (int b = 0; b < 256; b++) { @@ -84,67 +119,60 @@ static int tick(void *unused) { black += hist[i].bins[c][b]; } unsigned fraction = total ? (unsigned)(100 * black / total) : 0; - if (fraction < black_percent[i]) - black_percent[i] = fraction; + if (fraction < capture_ctx.black_percent[i]) + capture_ctx.black_percent[i] = fraction; } } for (int i = 0; i < 16; i++) for (int c = 0; c < 3; c++) { - rgb[i][c] = histogram_mean(hist[i].bins[c]); - aggregate[c] += rgb[i][c]; + capture_ctx.rgb[i][c] = histogram_mean(hist[i].bins[c]); + aggregate[c] += capture_ctx.rgb[i][c]; } - if (!CALIBRATION_ACTIVE && capture_preset == 0) { - int candidate = letterbox_candidate(black_percent, rgb); + if (!CALIBRATION_ACTIVE && capture_ctx.preset == 0) { + int candidate = letterbox_candidate(capture_ctx.black_percent, capture_ctx.rgb); uint64_t now = milliseconds(); if (candidate < 0) - pending_letterbox = -1; - else if (candidate != pending_letterbox) { - pending_letterbox = candidate; - candidate_since = now; - } else if ((unsigned)candidate != letterbox_mode && now - candidate_since >= 2000) - letterbox_mode = (unsigned)candidate; - if (letterbox_mode) { - if (vt_preset(capture, 1) != 0) { + capture_ctx.pending_letterbox = -1; + else if (candidate != capture_ctx.pending_letterbox) { + capture_ctx.pending_letterbox = candidate; + capture_ctx.candidate_since = now; + } else if ((unsigned)candidate != capture_ctx.letterbox_mode && + now - capture_ctx.candidate_since >= 2000) + capture_ctx.letterbox_mode = (unsigned)candidate; + if (capture_ctx.letterbox_mode) { + if (vt_preset(capture_ctx.handle, 1) != 0) { set_error("Letterbox preset failed"); stop_capture(); return 1; } - capture_preset = 1; - settling = 2; - next_border_probe = now + 2000; + capture_ctx.preset = 1; + capture_ctx.settling = 2; + capture_ctx.next_border_probe = now + 2000; return 1; } } for (int c = 0; c < 3; c++) - sent_rgb[c] = (unsigned char)(aggregate[c] / 16); + capture_ctx.sent_rgb[c] = (unsigned char)(aggregate[c] / 16); unsigned char boosted_mean[3]; - boost_color(sent_rgb, boosted_mean); - memcpy(sent_rgb, boosted_mean, 3); + boost_color(capture_ctx.sent_rgb, boosted_mean); + memcpy(capture_ctx.sent_rgb, boosted_mean, 3); unsigned char mapped_rgb[16][3], stable_rgb[16][3]; - calibration_colors(rgb, mapped_rgb); - continuity_frame(&continuity, true, mapped_rgb, now, stable_rgb); - interpolation_enabled = led_count && calibration_effective() != CAL_AVERAGE; - char *line = region_command(stable_rgb, led_blends, led_count, 1500); + calibration_colors(capture_ctx.rgb, mapped_rgb); + continuity_frame(&capture_ctx.continuity, true, mapped_rgb, now, stable_rgb); + receiver_layout.interpolation = receiver_layout.count && calibration_effective() != CAL_AVERAGE; + char *line = region_command(stable_rgb, receiver_layout.blends, receiver_layout.count, 1500); if (!line) { set_error("Color buffer allocation failed"); stop_capture(); return 1; } - int failed = send_line(line); + int failed = (!output_frame(&receiver_runtime.output, line)); free(line); if (failed) { set_error("Receiver connection lost"); stop_capture(); return 1; } - if (!receiver_ack()) { - set_error("Receiver did not acknowledge color data"); - stop_capture(); - return 1; - } - last_error[0] = 0; - color_valid = true; - last_output_at = milliseconds(); - frames++; + capture_ctx.color_valid = true; return 1; } diff --git a/native/diagnostics.h b/native/diagnostics.h index fcd5f47..a2263d0 100644 --- a/native/diagnostics.h +++ b/native/diagnostics.h @@ -135,13 +135,17 @@ static void probe_tick(ReceiverProbe *probe, PlaybackJson *json, uint64_t now) { probe_finish(probe, "Receiver closed the test connection", now); return; } + if (memchr(probe->response + probe->used, 0, (size_t)n)) { + probe_finish(probe, "Receiver sent an embedded NUL", now); + return; + } probe->used += (size_t)n; probe->response[probe->used] = 0; char *end = strchr(probe->response, '\n'); if (!end) return; *end = 0; - void *root = json->parse(probe->response); + void *root = playback_parse_exact(json, probe->response); bool success = playback_true(json, root, "success"); if (root) json->put(root); diff --git a/native/handover.h b/native/handover.h index 99a06fb..79c9ab6 100644 --- a/native/handover.h +++ b/native/handover.h @@ -1,6 +1,7 @@ #ifndef HYPERDRM_HANDOVER_H #define HYPERDRM_HANDOVER_H #include "playback.h" +#include "atomic_file.h" #ifndef CALIBRATION_ACTIVE #define CALIBRATION_ACTIVE false #endif @@ -43,18 +44,7 @@ static inline bool piccap_installed(void) { } static bool handover_save(bool enabled) { const char *data = enabled ? "{\"piccapHandover\":true}\n" : "{\"piccapHandover\":false}\n"; - int fd = open(HANDOVER_PREF ".tmp", O_WRONLY | O_CREAT | O_EXCL | O_NOFOLLOW | O_CLOEXEC, 0600); - if (fd < 0) - return false; - ssize_t n = write(fd, data, strlen(data)); - bool ok = n == (ssize_t)strlen(data) && fsync(fd) == 0; - if (close(fd) != 0) - ok = false; - if (ok) - ok = rename(HANDOVER_PREF ".tmp", HANDOVER_PREF) == 0; - if (!ok) - unlink(HANDOVER_PREF ".tmp"); - return ok; + return atomic_replace(HANDOVER_PREF, data, strlen(data)) != SAVE_UNCHANGED; } static void handover_load(void) { int fd = open(HANDOVER_PREF, O_RDONLY | O_NOFOLLOW | O_CLOEXEC); diff --git a/native/layout_refresh.h b/native/layout_refresh.h index 19a65ff..8cc2941 100644 --- a/native/layout_refresh.h +++ b/native/layout_refresh.h @@ -10,16 +10,18 @@ static void layout_refresh_reset(uint64_t due) { layout_probe.stage = TEST_IDLE; next_layout_check = due; } -static bool layout_mapping_changed(const LedBlend *next, unsigned count) { - if (count != led_count || !led_blends) +static bool layout_mapping_changed(const ReceiverLayoutContext *layout, const LedBlend *next, + unsigned count) { + if (count != layout->count || !layout->blends) return true; for (unsigned i = 0; i < count; i++) - if (next[i].a != led_blends[i].a || next[i].b != led_blends[i].b || - next[i].weight != led_blends[i].weight) + if (next[i].a != layout->blends[i].a || next[i].b != layout->blends[i].b || + next[i].weight != layout->blends[i].weight) return true; return false; } -static void layout_refresh_tick(PlaybackJson *json, uint64_t now, bool running) { +static void layout_refresh_tick(PlaybackJson *json, uint64_t now, bool running, + ReceiverLayoutContext *layout) { if (!running) { layout_refresh_reset(now + LAYOUT_REFRESH_MS); return; @@ -27,11 +29,11 @@ static void layout_refresh_tick(PlaybackJson *json, uint64_t now, bool running) probe_tick(&layout_probe, json, now); if (layout_probe.stage == TEST_DONE) { if (layout_probe_generation == calibration_generation) { - if (layout_mapping_changed(layout_probe.mapping, layout_probe.leds)) { - free(led_blends); - led_blends = layout_probe.mapping; + if (layout_mapping_changed(layout, layout_probe.mapping, layout_probe.leds)) { + free(layout->blends); + layout->blends = layout_probe.mapping; layout_probe.mapping = NULL; - led_count = layout_probe.leds; + layout->count = layout_probe.leds; layout_updates++; } last_layout_check = now; diff --git a/native/playback.h b/native/playback.h index 5218b9a..04ecd49 100644 --- a/native/playback.h +++ b/native/playback.h @@ -14,6 +14,11 @@ typedef struct { const char *(*string)(const void *); int (*boolean)(const void *); int (*put)(void *); + void *(*tokener_new)(void); + void *(*tokener_parse)(void *, const char *, int); + int (*tokener_error)(void *); + size_t (*tokener_end)(void *); + void (*tokener_free)(void *); } PlaybackJson; static inline bool playback_json_init(PlaybackJson *j) { j->lib = dlopen("libjson-c.so.5", RTLD_NOW); @@ -27,14 +32,46 @@ static inline bool playback_json_init(PlaybackJson *j) { j->string = dlsym(j->lib, "json_object_get_string"); j->boolean = dlsym(j->lib, "json_object_get_boolean"); j->put = dlsym(j->lib, "json_object_put"); + j->tokener_new = dlsym(j->lib, "json_tokener_new"); + j->tokener_parse = dlsym(j->lib, "json_tokener_parse_ex"); + j->tokener_error = dlsym(j->lib, "json_tokener_get_error"); + j->tokener_end = dlsym(j->lib, "json_tokener_get_parse_end"); + j->tokener_free = dlsym(j->lib, "json_tokener_free"); if (!j->parse || !j->get || !j->type || !j->length || !j->at || !j->string || !j->boolean || - !j->put) { + !j->put || !j->tokener_new || !j->tokener_parse || !j->tokener_error || !j->tokener_end || + !j->tokener_free) { dlclose(j->lib); j->lib = NULL; return false; } return true; } +/* Require exactly one complete JSON value. json_tokener_parse alone can accept + * an otherwise valid prefix followed by unrelated or truncated content. */ +static inline void *playback_parse_exact(PlaybackJson *j, const char *text) { + if (!j || !text || !j->tokener_new || !j->tokener_parse || !j->tokener_error || + !j->tokener_end || !j->tokener_free || !j->put) + return NULL; + size_t length = strlen(text); + if (length > 2 * 1024 * 1024) + return NULL; + void *tokener = j->tokener_new(); + if (!tokener) + return NULL; + void *root = j->tokener_parse(tokener, text, (int)length + 1); + size_t end = j->tokener_end(tokener); + bool valid = j->tokener_error(tokener) == 0; + while (end < length && + (text[end] == ' ' || text[end] == '\t' || text[end] == '\r' || text[end] == '\n')) + end++; + valid = valid && end == length; + j->tokener_free(tokener); + if (!valid && root) { + j->put(root); + root = NULL; + } + return root; +} static inline void *playback_field(PlaybackJson *j, void *o, const char *key) { void *v = NULL; return o && j->type(o) == 4 && j->get(o, key, &v) ? v : NULL; diff --git a/native/probe.c b/native/probe.c index 9f35625..9bcc3eb 100644 --- a/native/probe.c +++ b/native/probe.c @@ -7,28 +7,61 @@ #include #include "histogram.h" /* Process-local diagnostic sink. It changes logging only, not capture policy. */ -void printLog(const char *context,int level,const char *message_id, - const char *file,const char *function,int line,const char *format,...) { - (void)context;(void)level;(void)message_id;(void)file; - fprintf(stderr,"LG %s:%d: ",function?function:"?",line); - if(format){va_list args;va_start(args,format);vfprintf(stderr,format,args);va_end(args);}fputc('\n',stderr); +void printLog(const char *context, int level, const char *message_id, const char *file, + const char *function, int line, const char *format, ...) { + (void)context; + (void)level; + (void)message_id; + (void)file; + fprintf(stderr, "LG %s:%d: ", function ? function : "?", line); + if (format) { + va_list args; + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + } + fputc('\n', stderr); +} +static bool policy(void) { + fprintf(stderr, "Capture revoked by LG policy\n"); + return true; } -static bool policy(void) { fprintf(stderr,"Capture revoked by LG policy\n"); return true; } int main(void) { - void *lib=dlopen("libvtcapture.so.1",RTLD_NOW); - if(!lib){fprintf(stderr,"dlopen: %s\n",dlerror());return 1;} - void *(*init)(bool(*)(void))=dlsym(lib,"vtCapture_initHistogram"); - int (*preset)(void*,int)=dlsym(lib,"vtCapture_setPresetHistogram"); - int (*get)(void*,Histogram*)=dlsym(lib,"vtCapture_getHistogram"); - int (*finish)(void*)=dlsym(lib,"vtCapture_finalizeHistogram"); - if(!init||!preset||!get||!finish)return 2; - void *handle=init(policy); fprintf(stderr,"handle=%p\n",handle); - if(!handle)return 3; - int rc=preset(handle,0);fprintf(stderr,"preset=%d\n",rc); - Histogram hist[16]; - for(int frame=0;rc==0 && frame<3;frame++) { - usleep(100000); rc=get(handle,hist); printf("frame=%d rc=%d\n",frame,rc); - if(rc==0)for(int i=0;i<16;i++) {printf("region=%u",hist[i].id);for(int c=0;c<3;c++){uint64_t sum=0;for(int b=0;b<256;b++)sum+=hist[i].bins[c][b];printf(" ch%d_count=%llu mean=%u",c,(unsigned long long)sum,histogram_mean(hist[i].bins[c]));} puts("");} - } - fprintf(stderr,"finalize=%d\n",finish(handle)); return rc?4:0; + void *lib = dlopen("libvtcapture.so.1", RTLD_NOW); + if (!lib) { + fprintf(stderr, "dlopen: %s\n", dlerror()); + return 1; + } + void *(*init)(bool (*)(void)) = dlsym(lib, "vtCapture_initHistogram"); + int (*preset)(void *, int) = dlsym(lib, "vtCapture_setPresetHistogram"); + int (*get)(void *, Histogram *) = dlsym(lib, "vtCapture_getHistogram"); + int (*finish)(void *) = dlsym(lib, "vtCapture_finalizeHistogram"); + if (!init || !preset || !get || !finish) + return 2; + void *handle = init(policy); + fprintf(stderr, "handle=%p\n", handle); + if (!handle) + return 3; + int rc = preset(handle, 0); + fprintf(stderr, "preset=%d\n", rc); + Histogram hist[16]; + for (int frame = 0; rc == 0 && frame < 3; frame++) { + usleep(100000); + rc = get(handle, hist); + printf("frame=%d rc=%d\n", frame, rc); + if (rc == 0) + for (int i = 0; i < 16; i++) { + printf("region=%u", hist[i].id); + for (int c = 0; c < 3; c++) { + uint64_t sum = 0; + for (int b = 0; b < 256; b++) + sum += hist[i].bins[c][b]; + printf(" ch%d_count=%llu mean=%u", c, (unsigned long long)sum, + histogram_mean(hist[i].bins[c])); + } + puts(""); + } + } + fprintf(stderr, "finalize=%d\n", finish(handle)); + return rc ? 4 : 0; } diff --git a/native/receiver_output.h b/native/receiver_output.h new file mode 100644 index 0000000..26f8b17 --- /dev/null +++ b/native/receiver_output.h @@ -0,0 +1,263 @@ +#ifndef HYPERDRM_RECEIVER_OUTPUT_H +#define HYPERDRM_RECEIVER_OUTPUT_H +/* Main output connection. Every socket operation is nonblocking, with bounded + * work per tick. One acknowledged command is in flight; only the newest unsent + * color frame is retained. No Luna message or LG capture handle is owned here. */ +typedef enum { + OUTPUT_IDLE, + OUTPUT_CONNECTING, + OUTPUT_LOGIN, + OUTPUT_LAYOUT, + OUTPUT_READY, + OUTPUT_FAILED +} OutputStage; +typedef struct { + int fd; + OutputStage stage; + TargetConfig target; + char *incoming, *request, *latest; + size_t used, sent, length; + uint64_t deadline; + unsigned transaction, awaiting, count; + LedBlend *mapping; + unsigned long acknowledgements; + char error[128]; + bool closing; +} ReceiverOutput; +static void output_close(ReceiverOutput *o) { + if (o->fd >= 0) + close(o->fd); + free(o->incoming); + free(o->request); + free(o->latest); + free(o->mapping); + *o = (ReceiverOutput){.fd = -1}; +} +static void output_fail(ReceiverOutput *o, const char *error) { + output_close(o); + o->stage = OUTPUT_FAILED; + snprintf(o->error, sizeof(o->error), "%s", error); +} +static bool output_request(ReceiverOutput *o, const char *line, uint64_t now) { + size_t n = strlen(line); + while (n && (line[n - 1] == '\n' || line[n - 1] == ' ')) + n--; + if (!n || line[n - 1] != '}' || o->request || o->awaiting) + return false; + o->request = malloc(n + 48); + if (!o->request) + return false; + if (o->transaction >= 2147483647u) + o->transaction = 0; + o->transaction++; + memcpy(o->request, line, n - 1); + snprintf(o->request + n - 1, 48, ",\"tan\":%u}\n", o->transaction); + o->length = strlen(o->request); + o->sent = 0; + o->awaiting = o->transaction; + o->deadline = now + 3000; + return true; +} +static bool output_begin(ReceiverOutput *o, const TargetConfig *target, uint64_t now) { + output_close(o); + o->target = *target; + o->incoming = malloc(2 * 1024 * 1024 + 1); + if (!o->incoming) { + output_fail(o, "Cannot allocate receiver buffer"); + return false; + } + o->fd = target_open(target); + if (o->fd < 0) { + output_fail(o, "Cannot open receiver connection"); + return false; + } + o->stage = OUTPUT_CONNECTING; + o->deadline = now + 3000; + return true; +} +static bool output_frame(ReceiverOutput *o, const char *line) { + if (o->stage != OUTPUT_READY || o->closing) + return false; + if (strlen(line) > 2 * 1024 * 1024) + return false; + char *next = strdup(line); + if (!next) + return false; + free(o->latest); + o->latest = next; + return true; +} +static void output_stop(ReceiverOutput *o, uint64_t now, bool clear) { + if (!clear || o->stage != OUTPUT_READY) { + output_close(o); + return; + } + free(o->latest); + o->latest = strdup("{\"command\":\"clear\",\"priority\":149}\n"); + if (!o->latest) { + output_close(o); + return; + } + o->closing = true; + /* Allow the current transaction and the clear to finish asynchronously. */ + if (!o->awaiting) + o->deadline = now + 3000; +} +static bool output_flush(ReceiverOutput *o, size_t *budget) { + if (!o->request || !*budget) + return true; + size_t amount = o->length - o->sent; + if (amount > *budget) + amount = *budget; + ssize_t n = send(o->fd, o->request + o->sent, amount, MSG_NOSIGNAL); + if (n == 0 || (n < 0 && errno != EAGAIN && errno != EWOULDBLOCK && errno != EINTR)) { + output_fail(o, "Receiver closed during send"); + return false; + } + if (n > 0) { + o->sent += (size_t)n; + *budget -= (size_t)n; + } + if (o->sent == o->length) { + free(o->request); + o->request = NULL; + } + return true; +} +static void output_tick(ReceiverOutput *o, PlaybackJson *json, uint64_t now) { + if (o->stage == OUTPUT_IDLE || o->stage == OUTPUT_FAILED) + return; + if ((o->stage != OUTPUT_READY || o->awaiting || o->closing) && now >= o->deadline) { + if (o->closing) + output_close(o); + else + output_fail(o, "Receiver transaction timed out"); + return; + } + if (o->stage == OUTPUT_CONNECTING) { + struct pollfd p = {o->fd, POLLOUT, 0}; + int error = 0; + socklen_t size = sizeof(error); + if (poll(&p, 1, 0) <= 0) + return; + if (getsockopt(o->fd, SOL_SOCKET, SO_ERROR, &error, &size) || error) { + output_fail(o, "Receiver connection refused or unreachable"); + return; + } + char line[384]; + if (o->target.token[0]) { + snprintf(line, sizeof(line), + "{\"command\":\"authorize\",\"subcommand\":\"login\",\"token\":\"%s\"}\n", + o->target.token); + o->stage = OUTPUT_LOGIN; + } else { + snprintf(line, sizeof(line), "{\"command\":\"serverinfo\"}\n"); + o->stage = OUTPUT_LAYOUT; + } + if (!output_request(o, line, now)) { + output_fail(o, "Cannot allocate receiver request"); + return; + } + } + if (o->stage == OUTPUT_READY && !o->awaiting && o->latest) { + if (!output_request(o, o->latest, now)) { + output_fail(o, "Cannot allocate color request"); + return; + } + free(o->latest); + o->latest = NULL; + } + size_t send_budget = 65536; + if (!output_flush(o, &send_budget)) + return; + size_t space = 2 * 1024 * 1024 - o->used; + if (space > 65536) + space = 65536; + if (!space && !memchr(o->incoming, '\n', o->used)) { + output_fail(o, "Receiver response exceeds 2 MiB"); + return; + } + ssize_t n = space ? recv(o->fd, o->incoming + o->used, space, 0) : -1; + if (!space) + errno = EAGAIN; + if (n == 0 || (n < 0 && errno != EAGAIN && errno != EWOULDBLOCK && errno != EINTR)) { + output_fail(o, "Receiver closed during receive"); + return; + } + if (n > 0) { + if (memchr(o->incoming + o->used, 0, (size_t)n)) { + output_fail(o, "Receiver sent an embedded NUL"); + return; + } + o->used += (size_t)n; + } + o->incoming[o->used] = 0; + for (unsigned budget = 0; budget < 8; budget++) { + char *end = memchr(o->incoming, '\n', o->used); + if (!end) + break; + *end = 0; + void *root = playback_parse_exact(json, o->incoming); + if (!root || json->type(root) != 4) { + if (root) + json->put(root); + output_fail(o, "Receiver returned malformed JSON"); + return; + } + void *tan = playback_field(json, root, "tan"); + char *tail = NULL; + unsigned long id = tan && json->type(tan) == 3 ? strtoul(json->string(tan), &tail, 10) : 0; + bool matches = o->awaiting && tail && !*tail && id == o->awaiting; + if (matches) { + if (o->request || !playback_true(json, root, "success")) { + json->put(root); + output_fail(o, o->request ? "Receiver acknowledged an incomplete request" + : o->stage == OUTPUT_LOGIN + ? "Receiver authentication failed; check API token" + : o->stage == OUTPUT_LAYOUT ? "Receiver rejected LED layout request" + : "Receiver rejected color request"); + return; + } + o->awaiting = 0; + if (o->stage == OUTPUT_LOGIN) { + o->stage = OUTPUT_LAYOUT; + if (!output_request(o, "{\"command\":\"serverinfo\"}\n", now)) { + json->put(root); + output_fail(o, "Cannot allocate layout request"); + return; + } + } else if (o->stage == OUTPUT_LAYOUT) { + if (!layout_from_json(o->incoming, &o->mapping, &o->count)) { + json->put(root); + output_fail(o, "Receiver returned an invalid LED layout"); + return; + } + o->stage = OUTPUT_READY; + } else { + o->acknowledgements++; + if (o->closing && !o->latest) { + json->put(root); + output_close(o); + return; + } + } + } + json->put(root); + size_t consumed = (size_t)(end - o->incoming) + 1; + memmove(o->incoming, o->incoming + consumed, o->used - consumed); + o->used -= consumed; + o->incoming[o->used] = 0; + } + /* An ACK can free the slot after the first send pass. Use the remaining + * byte budget to send the newest queued frame in this same tick. */ + if (o->stage == OUTPUT_READY && !o->awaiting && o->latest) { + if (!output_request(o, o->latest, now)) { + output_fail(o, "Cannot allocate color request"); + return; + } + free(o->latest); + o->latest = NULL; + } + output_flush(o, &send_budget); +} +#endif diff --git a/native/receiver_stream.h b/native/receiver_stream.h index 312495c..a2cdc5c 100644 --- a/native/receiver_stream.h +++ b/native/receiver_stream.h @@ -181,6 +181,10 @@ static void stream_tick(PlaybackJson *j, uint64_t now, bool enabled) { stream_close(now); return; } + if (n > 0 && memchr(stream.data + stream.used, 0, (size_t)n)) { + stream_close(now); + return; + } if (n > 0) stream.used += (size_t)n; stream.data[stream.used] = 0; @@ -189,7 +193,7 @@ static void stream_tick(PlaybackJson *j, uint64_t now, bool enabled) { if (!end) break; *end = 0; - void *root = j->parse(stream.data); + void *root = playback_parse_exact(j, stream.data); if (stream.stage == STREAM_AUTHENTICATING) { if (!playback_true(j, root, "success")) { if (root) diff --git a/native/runtime_context.h b/native/runtime_context.h new file mode 100644 index 0000000..d427699 --- /dev/null +++ b/native/runtime_context.h @@ -0,0 +1,26 @@ +#ifndef HYPERDRM_RUNTIME_CONTEXT_H +#define HYPERDRM_RUNTIME_CONTEXT_H +#include +#include "histogram.h" +#include "continuity.h" +typedef struct { + void *handle; + char diagnostic[256]; + unsigned long frames; + unsigned char rgb[16][3], sent_rgb[3]; + unsigned black_percent[16], preset, letterbox_mode, settling; + int pending_letterbox; + uint64_t candidate_since, next_border_probe, sample_at; + unsigned sample_sequence, recoveries; + uint64_t recovery_started, last_recovery_ms, last_output_at; + bool color_valid; + Continuity continuity; + volatile sig_atomic_t revoked; +} CaptureContext; +/* LedBlend is supplied by the layout module (or a portable test fixture). */ +typedef struct { + LedBlend *blends; + unsigned count; + bool interpolation; +} ReceiverLayoutContext; +#endif diff --git a/native/service.c b/native/service.c index b0f86d7..0a66df9 100644 --- a/native/service.c +++ b/native/service.c @@ -29,6 +29,7 @@ #include "spatial_image.h" #include "diagnostics.h" #include "continuity.h" +#include "service_context.h" #define SERVICE "org.webosbrew.histogramhyperion.service" #define PRIORITY 149 typedef struct { @@ -52,20 +53,21 @@ static bool (*error_init)(LSError *); static void (*error_free)(LSError *); static void *(*vt_init)(bool (*)(void)); static int (*vt_preset)(void *, int), (*vt_get)(void *, Histogram *), (*vt_finish)(void *); -static void *capture; -static char lg_diagnostic[256]; +static CaptureContext capture_ctx = {.pending_letterbox = -1}; +static ReceiverLayoutContext receiver_layout; +static CalibrationSessionContext calibration_ctx; /* Process-local LG diagnostics; no changes to the loaded LG library. */ void printLog(const char *context, int level, const char *message_id, const char *file, const char *function, int line, const char *format, ...) { (void)context; (void)message_id; (void)file; - if (capture && level > 3) + if (capture_ctx.handle && level > 3) return; if (format) { va_list args; va_start(args, format); - vsnprintf(lg_diagnostic, sizeof(lg_diagnostic), format, args); + vsnprintf(capture_ctx.diagnostic, sizeof(capture_ctx.diagnostic), format, args); va_end(args); } fprintf(stderr, "LG %s:%d: ", function ? function : "?", line); @@ -77,36 +79,20 @@ void printLog(const char *context, int level, const char *message_id, const char } fputc('\n', stderr); } -static int output = -1; -static unsigned long frames; -static unsigned char rgb[16][3]; -static unsigned char sent_rgb[3]; -static unsigned black_percent[16]; -static unsigned capture_preset; -static unsigned letterbox_mode, settling; -static int pending_letterbox = -1; -static uint64_t candidate_since, next_border_probe; -static bool color_valid; -static Continuity continuity; -static uint64_t sample_at, calibration_until; -static unsigned sample_sequence; -#define CALIBRATION_ACTIVE (calibration_until > milliseconds()) -static unsigned led_count; -static LedBlend *led_blends; -static bool interpolation_enabled; +#define CALIBRATION_ACTIVE (calibration_ctx.until > milliseconds()) static RetryState retries; -static unsigned capture_recoveries; -static uint64_t recovery_started, last_recovery_ms, last_output_at; static uint64_t milliseconds(void) { struct timespec t; clock_gettime(CLOCK_MONOTONIC, &t); return (uint64_t)t.tv_sec * 1000 + t.tv_nsec / 1000000; } static char last_error[256]; -static volatile sig_atomic_t revoked, quitting; +static volatile sig_atomic_t quitting; static int guard_pipe = -1; static pid_t guard_pid = -1; +#ifndef DEV_MODE #define DEV_MODE "/var/luna/preferences/vt_devmode" +#endif /* LG's developer gate is enabled only during initialization. A separate * guardian removes our own marker even if this process aborts or is killed. * An existing marker is preserved, as are files replaced by another owner. */ @@ -169,135 +155,30 @@ static void quit_signal(int s) { quitting = 1; } static bool policy(void) { - revoked = 1; + capture_ctx.revoked = 1; return true; } static void set_error(const char *s) { snprintf(last_error, sizeof(last_error), "%s", s); fprintf(stderr, "%s\n", s); } -static int send_line(const char *line) { - size_t left = strlen(line); - const char *p = line; - while (left) { - ssize_t n = send(output, p, left, MSG_NOSIGNAL); - if (n <= 0) - return -1; - p += n; - left -= n; - } - return 0; -} -static bool receiver_ack(void) { - char answer[4096]; - size_t used = 0; - bool complete = false; - while (used + 1 < sizeof(answer)) { - ssize_t n = recv(output, answer + used, sizeof(answer) - used - 1, 0); - if (n <= 0) - break; - used += (size_t)n; - answer[used] = 0; - if (strchr(answer, '\n')) { - complete = true; - break; - } - } - PlaybackJson json = {0}; - if (!complete || !playback_json_init(&json)) - return false; - void *root = json.parse(answer); - bool ok = playback_true(&json, root, "success"); - if (root) - json.put(root); - dlclose(json.lib); - return ok; -} -static bool read_layout(void) { - const size_t capacity = 2 * 1024 * 1024; - char *data = malloc(capacity + 1); - if (!data) - return false; - bool complete = false; - size_t used = 0; - if (send_line("{\"command\":\"serverinfo\"}\n") == 0) { - while (used < capacity) { - ssize_t n = recv(output, data + used, capacity - used, 0); - if (n <= 0) - break; - used += (size_t)n; - data[used] = 0; - char *end = strchr(data, '\n'); - if (end) { - *end = 0; - complete = true; - break; - } - } - } - LedBlend *mapping = NULL; - unsigned count = 0; - bool ok = complete && layout_from_json(data, &mapping, &count); - if (ok) { - free(led_blends); - led_blends = mapping; - led_count = count; - } - free(data); - interpolation_enabled = ok && calibration_effective() != CAL_AVERAGE; - return ok; -} -static bool target_login(void) { - if (!target.token[0]) - return true; - char request[384], answer[4096]; - size_t used = 0; - snprintf(request, sizeof(request), - "{\"command\":\"authorize\",\"subcommand\":\"login\",\"token\":\"%s\"}\n", - target.token); - if (send_line(request) != 0) - return false; - while (used + 1 < sizeof(answer)) { - ssize_t n = recv(output, answer + used, sizeof(answer) - used - 1, 0); - if (n <= 0) - return false; - used += (size_t)n; - answer[used] = 0; - if (strchr(answer, '\n')) - break; - } - PlaybackJson json = {0}; - if (!playback_json_init(&json)) - return false; - void *root = json.parse(answer); - bool ok = playback_true(&json, root, "success"); - if (root) - json.put(root); - dlclose(json.lib); - return ok; -} +static ReceiverRuntime receiver_runtime = {.output = {.fd = -1}}; static void layout_refresh_reset(uint64_t due); static void release_capture(bool clear_output) { layout_refresh_reset(milliseconds() + 5000); - free(led_blends); - led_blends = NULL; - led_count = 0; - interpolation_enabled = false; - color_valid = false; - memset(rgb, 0, sizeof(rgb)); - memset(sent_rgb, 0, sizeof(sent_rgb)); - if (output >= 0) { - if (clear_output && frames) { - char line[80]; - snprintf(line, sizeof(line), "{\"command\":\"clear\",\"priority\":%d}\n", PRIORITY); - send_line(line); - } - close(output); - output = -1; - } - if (capture) { - vt_finish(capture); - capture = NULL; + free(receiver_layout.blends); + receiver_layout.blends = NULL; + receiver_layout.count = 0; + receiver_layout.interpolation = false; + capture_ctx.color_valid = false; + memset(capture_ctx.rgb, 0, sizeof(capture_ctx.rgb)); + memset(capture_ctx.sent_rgb, 0, sizeof(capture_ctx.sent_rgb)); + receiver_runtime.starting = false; + receiver_runtime.clear_pending = false; + output_stop(&receiver_runtime.output, milliseconds(), clear_output); + if (capture_ctx.handle) { + vt_finish(capture_ctx.handle); + capture_ctx.handle = NULL; } } static void stop_capture(void) { @@ -396,6 +277,7 @@ int main(void) { stream_close(milliseconds()); test_close(); stop_capture(); + output_close(&receiver_runtime.output); if (piccap_owned) { handover_enabled = false; retry_pause(&retries); diff --git a/native/service_api.h b/native/service_api.h index 2f8cd1d..0a5544d 100644 --- a/native/service_api.h +++ b/native/service_api.h @@ -20,28 +20,27 @@ static bool start(void *h, void *m, void *ctx) { retry_reset(&retries); if (piccap_owned) return respond(h, m, "{\"returnValue\":true,\"running\":true,\"activeSource\":\"PicCap\"}"); - if (capture) + if (capture_ctx.handle) return respond(h, m, "{\"returnValue\":true,\"running\":true}"); - frames = 0; - revoked = 0; + if (!playback_json.lib) { + set_error("JSON-C is unavailable; cannot start receiver output"); + return start_failure(h, m, "JSON-C is unavailable"); + } + capture_ctx.frames = 0; + capture_ctx.revoked = 0; last_error[0] = 0; - lg_diagnostic[0] = 0; - output = target_connect(&target); - if (output < 0) { - stop_capture(); - set_error("Cannot connect to configured receiver IP and JSON port"); - return start_failure(h, m, "Configured receiver is unavailable"); - } - if (!target_login()) { - stop_capture(); - set_error("Receiver token login failed; check the saved API token"); - return start_failure(h, m, "Receiver authentication failed"); - } - if (!read_layout()) { - stop_capture(); - set_error("Cannot read receiver LED layout; check JSON port and API authorization"); - return start_failure(h, m, "Receiver layout unavailable; check API authorization"); + capture_ctx.diagnostic[0] = 0; + if (receiver_runtime.starting) + return respond(h, m, "{\"returnValue\":true,\"connecting\":true}"); + receiver_runtime.clear_pending = false; + if (!output_begin(&receiver_runtime.output, &target, milliseconds())) { + set_error(receiver_runtime.output.error); + return start_failure(h, m, receiver_runtime.output.error); } + receiver_runtime.starting = true; + return respond(h, m, "{\"returnValue\":true,\"connecting\":true}"); +} +static bool initialize_capture(void *h, void *m) { if (!enter_developer_mode()) { stop_capture(); set_error("Developer initialization needs root. Elevate this own service through Homebrew " @@ -49,54 +48,49 @@ static bool start(void *h, void *m, void *ctx) { return start_failure(h, m, "Root access is required for temporary LG developer initialization"); } - capture = vt_init(policy); + capture_ctx.handle = vt_init(policy); if (!leave_developer_mode()) { stop_capture(); retries.blocked = true; set_error("Developer marker cleanup failed; manual intervention required"); return start_failure(h, m, "Developer marker cleanup failed"); } - if (!capture) { + if (!capture_ctx.handle) { stop_capture(); set_error("LG refused histogram initialization"); return start_failure( h, m, "LG refused histogram initialization. Another capture source may hold VT_CAPTURE."); } - if (vt_preset(capture, 0) != 0) { + if (vt_preset(capture_ctx.handle, 0) != 0) { stop_capture(); set_error("LG histogram preset initialization failed"); return start_failure(h, m, "Histogram preset failed"); } - capture_preset = letterbox_mode = settling = 0; - pending_letterbox = -1; - next_border_probe = 0; + capture_ctx.preset = capture_ctx.letterbox_mode = capture_ctx.settling = 0; + capture_ctx.pending_letterbox = -1; + capture_ctx.next_border_probe = 0; retries.due = 0; retries.attempts = 0; retries.quick_retries = 0; - if (recovery_started) { - last_recovery_ms = milliseconds() - recovery_started; - recovery_started = 0; + if (capture_ctx.recovery_started) { + capture_ctx.last_recovery_ms = milliseconds() - capture_ctx.recovery_started; + capture_ctx.recovery_started = 0; } return respond(h, m, "{\"returnValue\":true,\"running\":true}"); } static bool stop(void *h, void *m, void *ctx) { (void)ctx; - calibration_until = 0; + calibration_ctx.until = 0; retry_pause(&retries); bool bridging = bridge_phase != BRIDGE_IDLE; stream_close(milliseconds()); bridge_phase = BRIDGE_IDLE; - memset(&continuity, 0, sizeof(continuity)); + memset(&capture_ctx.continuity, 0, sizeof(capture_ctx.continuity)); stop_capture(); - if (bridging) { - output = target_connect(&target); - if (output >= 0) { - if (target_login()) - send_line("{\"command\":\"clear\",\"priority\":149}\n"); - close(output); - output = -1; - } + if (bridging && receiver_runtime.output.stage != OUTPUT_READY) { + output_begin(&receiver_runtime.output, &target, milliseconds()); + receiver_runtime.clear_pending = true; } return respond(h, m, "{\"returnValue\":true,\"running\":false}"); } @@ -122,7 +116,7 @@ static bool autostart(void *h, void *m, void *ctx) { "the installed boot script and whether another file occupies the hook path.\"}"); if (enabled) retry_reset(&retries); - retry_update(&retries, enabled, capture != NULL, milliseconds()); + retry_update(&retries, enabled, capture_ctx.handle != NULL, milliseconds()); return respond(h, m, enabled ? "{\"returnValue\":true,\"autostart\":true}" : "{\"returnValue\":true,\"autostart\":false}"); @@ -172,11 +166,11 @@ static bool settings(void *h, void *m, void *ctx) { if (!target_save(TARGET_PREF, &next)) return respond( h, m, "{\"returnValue\":false,\"errorText\":\"Could not save receiver settings\"}"); - bool active = capture || piccap_owned || retries.due; + bool active = capture_ctx.handle || receiver_runtime.starting || piccap_owned || retries.due; stop_capture(); stream_close(milliseconds()); bridge_phase = BRIDGE_IDLE; - memset(&continuity, 0, sizeof(continuity)); + memset(&capture_ctx.continuity, 0, sizeof(capture_ctx.continuity)); test_close(); connection_test.stage = TEST_IDLE; target = next; diff --git a/native/service_calibration.h b/native/service_calibration.h index 989c17f..d925529 100644 --- a/native/service_calibration.h +++ b/native/service_calibration.h @@ -3,24 +3,22 @@ static bool calibration_session(void *h, void *m, void *ctx) { (void)ctx; const char *p = payload(m); if (!strcmp(p, "{\"enabled\":true}")) { - calibration_until = milliseconds() + 110000; - if (capture && vt_preset(capture, 0) != 0) { - calibration_until = 0; + calibration_ctx.until = milliseconds() + 110000; + if (capture_ctx.handle && vt_preset(capture_ctx.handle, 0) != 0) { + calibration_ctx.until = 0; return respond(h, m, "{\"returnValue\":false,\"errorText\":\"Cannot select full-screen " "calibration capture\"}"); } - capture_preset = letterbox_mode = 0; - settling = 2; - pending_letterbox = -1; + capture_ctx.preset = capture_ctx.letterbox_mode = 0; + capture_ctx.settling = 2; + capture_ctx.pending_letterbox = -1; } else if (!strcmp(p, "{\"enabled\":false}")) - calibration_until = 0; + calibration_ctx.until = 0; else return respond(h, m, "{\"returnValue\":false,\"errorText\":\"Expected enabled boolean\"}"); return respond(h, m, "{\"returnValue\":true}"); } -static Calibration calibration_draft; -static char calibration_message[256]; static bool report_calibration(void *h, void *m, void *ctx) { if (!playback_json.lib) return respond(h, m, "{\"returnValue\":false,\"errorText\":\"JSON-C is unavailable\"}"); @@ -28,9 +26,9 @@ static bool report_calibration(void *h, void *m, void *ctx) { void *root = playback_json.parse(payload(m)), *message = playback_field(&playback_json, root, "message"); bool valid = message && playback_json.type(message) == 6 && - strlen(playback_json.string(message)) < sizeof(calibration_message); + strlen(playback_json.string(message)) < sizeof(calibration_ctx.message); if (valid) - snprintf(calibration_message, sizeof(calibration_message), "%s", + snprintf(calibration_ctx.message, sizeof(calibration_ctx.message), "%s", playback_json.string(message)); if (root) playback_json.put(root); @@ -46,17 +44,14 @@ static bool draft_calibration(void *h, void *m, void *ctx) { next.kind != CAL_CUSTOM || next.count < 4 || strcmp(next.model, tv_model)) return respond(h, m, "{\"returnValue\":false,\"errorText\":\"Invalid measured model profile\"}"); - calibration_draft = next; + calibration_ctx.draft = next; return respond(h, m, "{\"returnValue\":true}"); } -static bool model_busy; -static unsigned long model_token; -static uint64_t model_deadline, next_model_probe; static bool model_reply(void *h, void *m, void *ctx) { (void)h; (void)ctx; - model_busy = false; - model_token = 0; + calibration_ctx.model_busy = false; + calibration_ctx.model_token = 0; void *root = playback_json.parse(payload(m)), *model = playback_field(&playback_json, root, "modelName"); if (playback_true(&playback_json, root, "returnValue") && model && @@ -70,23 +65,23 @@ static bool model_reply(void *h, void *m, void *ctx) { return true; } static void model_tick(uint64_t now) { - if (model_busy && now >= model_deadline) { + if (calibration_ctx.model_busy && now >= calibration_ctx.model_deadline) { LSError e; error_init(&e); - cancel_call(service_handle, model_token, &e); + cancel_call(service_handle, calibration_ctx.model_token, &e); error_free(&e); - model_busy = false; - model_token = 0; + calibration_ctx.model_busy = false; + calibration_ctx.model_token = 0; } - if (!tv_model[0] && !model_busy && now >= next_model_probe) { + if (!tv_model[0] && !calibration_ctx.model_busy && now >= calibration_ctx.next_model_probe) { LSError e; error_init(&e); - model_busy = - call_once(service_handle, "luna://com.webos.service.tv.systemproperty/getSystemInfo", - "{\"keys\":[\"modelName\"]}", model_reply, NULL, &model_token, &e); + calibration_ctx.model_busy = call_once( + service_handle, "luna://com.webos.service.tv.systemproperty/getSystemInfo", + "{\"keys\":[\"modelName\"]}", model_reply, NULL, &calibration_ctx.model_token, &e); error_free(&e); - model_deadline = now + 3000; - next_model_probe = now + 60000; + calibration_ctx.model_deadline = now + 3000; + calibration_ctx.next_model_probe = now + 60000; } } static bool set_calibration(void *h, void *m, void *ctx) { diff --git a/native/service_context.h b/native/service_context.h new file mode 100644 index 0000000..92a86bf --- /dev/null +++ b/native/service_context.h @@ -0,0 +1,17 @@ +#ifndef HYPERDRM_SERVICE_CONTEXT_H +#define HYPERDRM_SERVICE_CONTEXT_H +#include "runtime_context.h" +#include "receiver_output.h" +/* Runtime ownership is separate from the saved calibration configuration. */ +typedef struct { + uint64_t until, model_deadline, next_model_probe; + unsigned long model_token; + bool model_busy; + Calibration draft; + char message[256]; +} CalibrationSessionContext; +typedef struct { + ReceiverOutput output; + bool starting, clear_pending; +} ReceiverRuntime; +#endif diff --git a/native/service_status.h b/native/service_status.h index b462a3b..cca9ad2 100644 --- a/native/service_status.h +++ b/native/service_status.h @@ -16,19 +16,20 @@ static bool status(void *h, void *m, void *ctx) { uint64_t now = milliseconds(); char report[512]; size_t k = 0; - for (size_t i = 0; calibration_message[i] && k + 2 < sizeof(report); i++) { - char c = calibration_message[i]; + for (size_t i = 0; calibration_ctx.message[i] && k + 2 < sizeof(report); i++) { + char c = calibration_ctx.message[i]; if (c == '"' || c == '\\') report[k++] = '\\'; if ((unsigned char)c >= 32) report[k++] = c; } report[k] = 0; - int used = snprintf(json, sizeof(json), - "{\"calibrationProfile\":\"%s\",\"effectiveCalibration\":\"%s\"," - "\"tvModel\":\"%s\",\"customModel\":\"%s\",\"customPoints\":[", - calibration_key(calibration.kind), calibration_key(calibration_effective()), - tv_model, calibration.model); + int used = snprintf( + json, sizeof(json), + "{\"receiverConnecting\":%s,\"calibrationProfile\":\"%s\",\"effectiveCalibration\":\"%s\"," + "\"tvModel\":\"%s\",\"customModel\":\"%s\",\"customPoints\":[", + receiver_runtime.starting ? "true" : "false", calibration_key(calibration.kind), + calibration_key(calibration_effective()), tv_model, calibration.model); for (unsigned i = 0; i < calibration.count; i++) used += snprintf(json + used, sizeof(json) - used, "%s{\"position\":%.12g,\"region\":%u}", @@ -40,64 +41,69 @@ static bool status(void *h, void *m, void *ctx) { layout_error, piccap_fallbacks, (unsigned long long)(handover_cooldown > now ? handover_cooldown - now : 0)); used += snprintf(json + used, sizeof(json) - used, "\"calibrationMessage\":\"%s\",", report); - used += - snprintf(json + used, sizeof(json) - used, - "\"calibrationDraft\":{\"model\":\"%s\",\"points\":[", calibration_draft.model); - for (unsigned i = 0; i < calibration_draft.count; i++) + used += snprintf(json + used, sizeof(json) - used, + "\"calibrationDraft\":{\"model\":\"%s\",\"points\":[", + calibration_ctx.draft.model); + for (unsigned i = 0; i < calibration_ctx.draft.count; i++) used += snprintf(json + used, sizeof(json) - used, "%s{\"position\":%.12g,\"region\":%u}", - i ? "," : "", calibration_draft.points[i].position, - calibration_draft.points[i].region); + i ? "," : "", calibration_ctx.draft.points[i].position, + calibration_ctx.draft.points[i].region); used += snprintf(json + used, sizeof(json) - used, "]},\"receiverStreamConnected\":%s,", stream.stage == STREAM_SUBSCRIBED ? "true" : "false"); used += snprintf(json + used, sizeof(json) - used, "\"sampleSequence\":%u,\"sampleAgeMs\":%lld,\"holdingColors\":%s," "\"sourceFade\":%s,\"calibrating\":%s,", - sample_sequence, sample_at ? (long long)(now - sample_at) : -1, - continuity.holding ? "true" : "false", - (continuity.fading || bridge_phase == BRIDGE_FADING) ? "true" : "false", + capture_ctx.sample_sequence, + capture_ctx.sample_at ? (long long)(now - capture_ctx.sample_at) : -1, + capture_ctx.continuity.holding ? "true" : "false", + (capture_ctx.continuity.fading || bridge_phase == BRIDGE_FADING) ? "true" + : "false", CALIBRATION_ACTIVE ? "true" : "false"); - used += snprintf(json + used, sizeof(json) - used, - "\"returnValue\":true,\"piccapPort\":%u,\"connectionTest\":{\"state\":\"%s\"," - "\"ledCount\":%u,\"elapsedMs\":%llu,\"error\":\"%s\"},\"lastOutputAgeMs\":%" - "lld,\"retryInMs\":%llu,\"captureState\":\"%s\",\"piccapError\":\"%s\",", - target.piccap_port, test_stage_name(), connection_test.leds, - (unsigned long long)connection_test.elapsed, connection_test.error, - last_output_at ? (long long)(now - last_output_at) : -1, - (unsigned long long)(retries.due > now ? retries.due - now : 0), - capture_source == SOURCE_PICCAP_STARTING ? "Starting PicCap" - : capture_source == SOURCE_PICCAP_STOPPING ? "Stopping PicCap" - : piccap_owned ? "PicCap" - : capture ? "Histogram" - : "Stopped", - piccap_error); - used += snprintf(json + used, sizeof(json) - used, - "\"version\":\"" HYPERDRM_VERSION - "\",\"running\":%s,\"colorValid\":%s,\"frames\":%lu,\"captureRecoveries\":%u," - "\"lastRecoveryMs\":%llu,\"endpoint\":\"%s\",\"host\":\"%s\",\"port\":%u," - "\"receiver\":\"%s\",\"tokenSet\":%s,\"piccapTargetCompatible\":%s," - "\"priority\":%d,\"uid\":%u,\"drmVerified\":false,\"mappingVerified\":false," - "\"outputColor\":[%u,%u,%u],\"error\":\"%s\",\"regions\":[", - (capture || capture_source == SOURCE_PICCAP) ? "true" : "false", - color_valid ? "true" : "false", frames, capture_recoveries, - (unsigned long long)last_recovery_ms, endpoint, target.host, target.port, - target.receiver, target.token[0] ? "true" : "false", - target_piccap_compatible(&target) ? "true" : "false", PRIORITY, - (unsigned)geteuid(), sent_rgb[0], sent_rgb[1], sent_rgb[2], safe); + used += + snprintf(json + used, sizeof(json) - used, + "\"returnValue\":true,\"piccapPort\":%u,\"connectionTest\":{\"state\":\"%s\"," + "\"ledCount\":%u,\"elapsedMs\":%llu,\"error\":\"%s\"},\"lastOutputAgeMs\":%" + "lld,\"retryInMs\":%llu,\"captureState\":\"%s\",\"piccapError\":\"%s\",", + target.piccap_port, test_stage_name(), connection_test.leds, + (unsigned long long)connection_test.elapsed, connection_test.error, + capture_ctx.last_output_at ? (long long)(now - capture_ctx.last_output_at) : -1, + (unsigned long long)(retries.due > now ? retries.due - now : 0), + capture_source == SOURCE_PICCAP_STARTING ? "Starting PicCap" + : capture_source == SOURCE_PICCAP_STOPPING ? "Stopping PicCap" + : piccap_owned ? "PicCap" + : capture_ctx.handle ? "Histogram" + : "Stopped", + piccap_error); + used += snprintf( + json + used, sizeof(json) - used, + "\"version\":\"" HYPERDRM_VERSION + "\",\"running\":%s,\"colorValid\":%s,\"frames\":%lu,\"captureRecoveries\":%u," + "\"lastRecoveryMs\":%llu,\"endpoint\":\"%s\",\"host\":\"%s\",\"port\":%u," + "\"receiver\":\"%s\",\"tokenSet\":%s,\"piccapTargetCompatible\":%s," + "\"priority\":%d,\"uid\":%u,\"drmVerified\":false,\"mappingVerified\":false," + "\"outputColor\":[%u,%u,%u],\"error\":\"%s\",\"regions\":[", + (capture_ctx.handle || capture_source == SOURCE_PICCAP) ? "true" : "false", + capture_ctx.color_valid ? "true" : "false", capture_ctx.frames, capture_ctx.recoveries, + (unsigned long long)capture_ctx.last_recovery_ms, endpoint, target.host, target.port, + target.receiver, target.token[0] ? "true" : "false", + target_piccap_compatible(&target) ? "true" : "false", PRIORITY, (unsigned)geteuid(), + capture_ctx.sent_rgb[0], capture_ctx.sent_rgb[1], capture_ctx.sent_rgb[2], safe); for (int i = 0; i < 16; i++) - used += snprintf(json + used, sizeof(json) - used, "%s[%u,%u,%u]", i ? "," : "", rgb[i][0], - rgb[i][1], rgb[i][2]); + used += snprintf(json + used, sizeof(json) - used, "%s[%u,%u,%u]", i ? "," : "", + capture_ctx.rgb[i][0], capture_ctx.rgb[i][1], capture_ctx.rgb[i][2]); used += snprintf(json + used, sizeof(json) - used, - "],\"ledCount\":%u,\"spatialOutput\":%s,\"blackPercent\":[", led_count, - led_count ? "true" : "false"); + "],\"ledCount\":%u,\"spatialOutput\":%s,\"blackPercent\":[", + receiver_layout.count, receiver_layout.count ? "true" : "false"); for (int i = 0; i < 16; i++) - used += snprintf(json + used, sizeof(json) - used, "%s%u", i ? "," : "", black_percent[i]); + used += snprintf(json + used, sizeof(json) - used, "%s%u", i ? "," : "", + capture_ctx.black_percent[i]); snprintf(json + used, sizeof(json) - used, "],\"preset\":%u,\"saturationGain\":1.0,\"brightnessGain\":1.0," "\"spatialInterpolation\":%s,\"blackBarDetection\":true,\"autostart\":%s," "\"retryScheduled\":%s,\"retryPaused\":%s,\"retryBlocked\":%s,\"retryAttempts\":%u," "\"piccapInstalled\":%s,\"piccapHandover\":%s,\"piccapConnected\":%s,\"activeSource\":" "\"%s\",\"playbackProtection\":\"%s\",\"letterboxDetected\":%s}", - capture_preset, interpolation_enabled ? "true" : "false", + capture_ctx.preset, receiver_layout.interpolation ? "true" : "false", boot_enabled() ? "true" : "false", retries.due ? "true" : "false", retries.paused ? "true" : "false", retries.blocked ? "true" : "false", retries.attempts, piccap_installed() ? "true" : "false", @@ -106,6 +112,6 @@ static bool status(void *h, void *m, void *ctx) { protection == PLAYBACK_PROTECTED ? "protected" : protection == PLAYBACK_CLEAR ? "non-secure decoder" : "unknown", - capture && letterbox_mode ? "true" : "false"); + capture_ctx.handle && capture_ctx.letterbox_mode ? "true" : "false"); return respond(h, m, json); } diff --git a/native/source_bridge.h b/native/source_bridge.h index 0ef778a..d1f7f26 100644 --- a/native/source_bridge.h +++ b/native/source_bridge.h @@ -44,7 +44,7 @@ static bool bridge_send(const unsigned char colors[16][3]) { free(line); return ok; } -static void bridge_tick(uint64_t now) { +static void bridge_tick(uint64_t now, CaptureContext *capture) { if (retries.paused || retries.blocked) { if (bridge_phase) bridge_clear(); @@ -54,15 +54,17 @@ static void bridge_tick(uint64_t now) { } if (capture_source != bridge_source) { if (capture_source == SOURCE_PICCAP_STARTING) { - bridge_phase = continuity.available && now - continuity.valid_at < 2000 ? BRIDGE_HOLDING - : BRIDGE_IDLE; + bridge_phase = + capture->continuity.available && now - capture->continuity.valid_at < 2000 + ? BRIDGE_HOLDING + : BRIDGE_IDLE; bridge_started = now; - memcpy(bridge_from, continuity.last, sizeof(bridge_from)); + memcpy(bridge_from, capture->continuity.last, sizeof(bridge_from)); } else if (capture_source == SOURCE_PICCAP_STOPPING || (bridge_source == SOURCE_PICCAP && capture_source == SOURCE_HISTOGRAM)) { bridge_phase = BRIDGE_IDLE; if (stream.valid && now - stream.updated < 1000) { - continuity_seed(&continuity, stream.colors, now); + continuity_seed(&capture->continuity, stream.colors, now); bridge_send(stream.colors); } } diff --git a/native/target.h b/native/target.h index dffc20d..81783c2 100644 --- a/native/target.h +++ b/native/target.h @@ -10,6 +10,7 @@ #include #include #include "playback.h" +#include "atomic_file.h" #define TARGET_PREF \ "/media/developer/apps/usr/palm/services/org.webosbrew.histogramhyperion.service/target.json" typedef struct { @@ -44,7 +45,7 @@ static bool target_valid(const TargetConfig *t) { return true; } static bool target_parse(PlaybackJson *j, const char *text, TargetConfig *out) { - void *root = j->parse(text); + void *root = playback_parse_exact(j, text); if (!root) return false; TargetConfig next = *out; @@ -112,24 +113,13 @@ static bool target_parse(PlaybackJson *j, const char *text, TargetConfig *out) { static bool target_save(const char *path, const TargetConfig *t) { if (!target_valid(t)) return false; - char tmp[512], data[512]; - if (snprintf(tmp, sizeof(tmp), "%s.tmp", path) >= (int)sizeof(tmp)) - return false; + char data[512]; int n = snprintf( data, sizeof(data), "{\"host\":\"%s\",\"port\":%u,\"piccapPort\":%u,\"receiver\":\"%s\",\"token\":\"%s\"}\n", t->host, t->port, t->piccap_port, t->receiver, t->token); - int fd = open(tmp, O_WRONLY | O_CREAT | O_EXCL | O_NOFOLLOW | O_CLOEXEC, 0600); - if (fd < 0) - return false; - bool ok = write(fd, data, n) == n && fsync(fd) == 0; - if (close(fd) != 0) - ok = false; - if (ok) - ok = rename(tmp, path) == 0; - if (!ok) - unlink(tmp); - return ok; + return n > 0 && (size_t)n < sizeof(data) && + atomic_replace(path, data, (size_t)n) != SAVE_UNCHANGED; } static bool target_load(PlaybackJson *j, const char *path, TargetConfig *t) { int fd = open(path, O_RDONLY | O_NOFOLLOW | O_CLOEXEC); @@ -178,26 +168,4 @@ static int target_open(const TargetConfig *t) { } return fd; } -static int target_connect(const TargetConfig *t) { - int fd = target_open(t); - if (fd < 0) - return -1; - struct pollfd p = {.fd = fd, .events = POLLOUT}; - int error = 0; - socklen_t size = sizeof(error); - if (poll(&p, 1, 1000) <= 0 || getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &size) != 0 || - error) { - close(fd); - return -1; - } - int flags = fcntl(fd, F_GETFL, 0); - if (flags < 0 || fcntl(fd, F_SETFL, flags & ~O_NONBLOCK) < 0) { - close(fd); - return -1; - } - struct timeval timeout = {1, 0}; - setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)); - setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); - return fd; -} #endif diff --git a/native/test_atomic_file.c b/native/test_atomic_file.c new file mode 100644 index 0000000..d9dd275 --- /dev/null +++ b/native/test_atomic_file.c @@ -0,0 +1,101 @@ +#define _DEFAULT_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +static bool interrupt_write, short_write, fail_write, fail_sync, fail_rename, fail_commit_sync; +static unsigned directory_syncs; +static ssize_t fixture_write(int fd, const void *data, size_t n) { + if (interrupt_write) { + interrupt_write = false; + errno = EINTR; + return -1; + } + if (fail_write) { + errno = ENOSPC; + return -1; + } + return write(fd, data, short_write && n > 2 ? 2 : n); +} +static int fixture_sync(int fd) { + struct stat info; + assert(!fstat(fd, &info)); + if (S_ISDIR(info.st_mode)) { + directory_syncs++; + if (fail_commit_sync && directory_syncs == 2) { + errno = EIO; + return -1; + } + } else if (fail_sync) { + errno = EIO; + return -1; + } + return fsync(fd); +} +static int fixture_rename(int from, const char *a, int to, const char *b) { + if (fail_rename) { + errno = EACCES; + return -1; + } + return renameat(from, a, to, b); +} +#define ATOMIC_WRITE fixture_write +#define ATOMIC_SYNC fixture_sync +#define ATOMIC_RENAME fixture_rename +#include "atomic_file.h" +static void contents(const char *path, const char *expected) { + char data[64] = {0}; + int fd = open(path, O_RDONLY); + assert(fd >= 0); + assert(read(fd, data, sizeof(data) - 1) == (ssize_t)strlen(expected)); + close(fd); + assert(!strcmp(data, expected)); +} +int main(void) { + char directory[] = "/tmp/hyperdrm-save-XXXXXX"; + assert(mkdtemp(directory)); + char path[128], stale[128], link[128]; + snprintf(path, sizeof(path), "%s/settings.json", directory); + snprintf(stale, sizeof(stale), "%s/settings.json.tmp", directory); + snprintf(link, sizeof(link), "%s/link", directory); + int fd = open(stale, O_CREAT | O_WRONLY, 0600); + assert(fd >= 0); + close(fd); + assert(atomic_replace(path, "old", 3) == SAVE_DURABLE); + interrupt_write = short_write = true; + assert(atomic_replace(path, "partial writes handled", 22) == SAVE_DURABLE); + contents(path, "partial writes handled"); + short_write = false; + fail_write = true; + assert(atomic_replace(path, "new", 3) == SAVE_UNCHANGED); + fail_write = false; + contents(path, "partial writes handled"); + fail_sync = true; + assert(atomic_replace(path, "new", 3) == SAVE_UNCHANGED); + fail_sync = false; + fail_rename = true; + assert(atomic_replace(path, "new", 3) == SAVE_UNCHANGED); + fail_rename = false; + contents(path, "partial writes handled"); + directory_syncs = 0; + fail_commit_sync = true; + assert(atomic_replace(path, "committed", 9) == SAVE_COMMITTED); + contents(path, "committed"); + fail_commit_sync = false; + assert(!symlink(path, link)); + assert(atomic_replace(link, "bad", 3) == SAVE_UNCHANGED); + contents(path, "committed"); + struct stat info; + assert(!stat(path, &info) && (info.st_mode & 0777) == 0600); + assert(!access(stale, F_OK)); + unlink(link); + unlink(path); + unlink(stale); + assert(!rmdir(directory)); + puts("PASS: interrupted/partial writes, write/sync/rename failures, atomic replacement, commit " + "durability, private permissions, symlinks and stale files"); +} diff --git a/native/test_diagnostics.c b/native/test_diagnostics.c index be7790d..58560cb 100644 --- a/native/test_diagnostics.c +++ b/native/test_diagnostics.c @@ -32,7 +32,7 @@ static void fixture(PlaybackJson *json,int kind){ close(server);assert(test_begin(&config,10000));test_tick(json,10010);assert(connection_test.stage==TEST_FAILED); } int main(void){ - (void)target_save;(void)target_load;(void)target_connect;(void)test_stage_name; + (void)target_save;(void)target_load;(void)target_open;(void)test_stage_name; PlaybackJson json={0};assert(playback_json_init(&json)); fixture(&json,0);fixture(&json,1);fixture(&json,2); int peers[2];assert(socketpair(AF_UNIX,SOCK_STREAM,0,peers)==0); diff --git a/native/test_handover.c b/native/test_handover.c index 46e34dd..6fe0119 100644 --- a/native/test_handover.c +++ b/native/test_handover.c @@ -44,7 +44,7 @@ static void connected_start(void){ media(PLAYBACK_CLEAR);handover_tick();answer(0,true,true);assert(capture_source==SOURCE_PICCAP); } int main(void){ - (void)target_save;(void)target_load;(void)target_connect;(void)handover_save;(void)handover_load; + (void)target_save;(void)target_load;(void)target_open;(void)handover_save;(void)handover_load; (void)retry_failure;(void)retry_take;(void)retry_update; assert(playback_json_init(&playback_json));call_once=mock_call;cancel_call=mock_cancel; handover_enabled=true;next_media_probe=UINT64_MAX; diff --git a/native/test_json_protocol.c b/native/test_json_protocol.c new file mode 100644 index 0000000..b07b78e --- /dev/null +++ b/native/test_json_protocol.c @@ -0,0 +1,60 @@ +#define _DEFAULT_SOURCE +#include +#include +#include "target.h" +#include "layout.h" +int main(void) { + (void)target_open; + (void)target_save; + (void)target_load; + (void)layout_from_json; + PlaybackJson json = {0}; + assert(!playback_parse_exact(&json, "{}")); + assert(playback_json_init(&json)); + const char *invalid[] = {"{", + "{\"success\":true", + "{}garbage", + "{} {}", + "[1,", + "{\"success\":tru}", + "{\"a\":\"unterminated}"}; + for (unsigned i = 0; i < sizeof(invalid) / sizeof(*invalid); i++) + assert(!playback_parse_exact(&json, invalid[i])); + void *root = playback_parse_exact(&json, " {\"success\":true} \t\r"); + assert(root && playback_true(&json, root, "success")); + json.put(root); + const char *wrong[] = { + "[]", "true", "1", "\"success\"", "{\"success\":1}", "{\"success\":\"true\"}"}; + for (unsigned i = 0; i < sizeof(wrong) / sizeof(*wrong); i++) { + root = playback_parse_exact(&json, wrong[i]); + assert(!playback_true(&json, root, "success")); + if (root) + json.put(root); + } + TargetConfig original = target, next = original; + assert(!target_parse( + &json, "{\"host\":\"127.0.0.1\",\"receiver\":\"Hyperion\",\"port\":19444}garbage", &next)); + assert(!memcmp(&next, &original, sizeof(next))); + Calibration profile = calibration; + assert(!calibration_parse(&json, "{\"profile\":\"average\"}{}", &profile)); + assert(!memcmp(&profile, &calibration, sizeof(profile))); + /* Deterministic malformed-input mutations; every successful parse is freed. + * This is regression coverage, not a claim of exhaustive fuzzing. */ + const char seed[] = "{\"success\":true,\"tan\":1,\"data\":{\"leds\":[0,255,128]}}"; + uint32_t random = 0x12345678; + for (unsigned i = 0; i < 5000; i++) { + char text[sizeof(seed) + 4]; + memcpy(text, seed, sizeof(seed)); + random = random * 1664525u + 1013904223u; + unsigned position = random % (sizeof(seed) - 1); + text[position] = (char)(1 + (random >> 16) % 126); + if (i % 3 == 0) + text[position] = 0; + root = playback_parse_exact(&json, text); + if (root) + json.put(root); + } + dlclose(json.lib); + puts("PASS: exact JSON framing, truncated/trailing data, unexpected types, unchanged settings " + "on rejection and 5000 deterministic parser mutations"); +} diff --git a/native/test_layout_refresh.c b/native/test_layout_refresh.c index c256324..3989c29 100644 --- a/native/test_layout_refresh.c +++ b/native/test_layout_refresh.c @@ -5,8 +5,8 @@ #include "target.h" #include "layout.h" #include "diagnostics.h" -static unsigned led_count; -static LedBlend *led_blends; +#include "runtime_context.h" +static ReceiverLayoutContext receiver_layout; #include "layout_refresh.h" static void completed(unsigned count,unsigned generation){ layout_probe.mapping=calloc(count,sizeof(LedBlend));assert(layout_probe.mapping); @@ -14,22 +14,22 @@ static void completed(unsigned count,unsigned generation){ layout_probe.leds=count;layout_probe.stage=TEST_DONE;layout_probe_generation=generation; } int main(void){ - (void)target_connect;(void)target_load;(void)target_save; + (void)target_open;(void)target_load;(void)target_save; PlaybackJson json={0};assert(playback_json_init(&json)); calibration.kind=CAL_G4;next_layout_check=UINT64_MAX; - completed(50,calibration_generation);layout_refresh_tick(&json,1000,true); - assert(led_count==50 && layout_updates==1 && last_layout_check==1000); - completed(500,calibration_generation);layout_refresh_tick(&json,2000,true); - assert(led_count==500 && layout_updates==2 && last_layout_check==2000); - completed(500,calibration_generation);layout_refresh_tick(&json,3000,true);assert(layout_updates==2); + completed(50,calibration_generation);layout_refresh_tick(&json,1000,true,&receiver_layout); + assert(receiver_layout.count==50 && layout_updates==1 && last_layout_check==1000); + completed(500,calibration_generation);layout_refresh_tick(&json,2000,true,&receiver_layout); + assert(receiver_layout.count==500 && layout_updates==2 && last_layout_check==2000); + completed(500,calibration_generation);layout_refresh_tick(&json,3000,true,&receiver_layout);assert(layout_updates==2); completed(500,calibration_generation);layout_probe.mapping[42].weight^=512; - layout_refresh_tick(&json,4000,true);assert(layout_updates==3); - LedBlend *previous=led_blends;layout_probe.stage=TEST_FAILED;strcpy(layout_probe.error,"Invalid layout"); - layout_refresh_tick(&json,5000,true);assert(led_blends==previous && led_count==500 && layout_updates==3 && layout_error[0]); + layout_refresh_tick(&json,4000,true,&receiver_layout);assert(layout_updates==3); + LedBlend *previous=receiver_layout.blends;layout_probe.stage=TEST_FAILED;strcpy(layout_probe.error,"Invalid layout"); + layout_refresh_tick(&json,5000,true,&receiver_layout);assert(receiver_layout.blends==previous && receiver_layout.count==500 && layout_updates==3 && layout_error[0]); completed(50,calibration_generation);calibration_generation++; - layout_refresh_tick(&json,6000,true);assert(led_count==500 && led_blends==previous);assert(probe_busy(&layout_probe)); - layout_refresh_tick(&json,6100,false);assert(!probe_busy(&layout_probe) && layout_probe.fd==-1); - assert(led_count==500 && led_blends==previous); - layout_refresh_reset(7000);free(led_blends);test_close(); + layout_refresh_tick(&json,6000,true,&receiver_layout);assert(receiver_layout.count==500 && receiver_layout.blends==previous);assert(probe_busy(&layout_probe)); + layout_refresh_tick(&json,6100,false,&receiver_layout);assert(!probe_busy(&layout_probe) && layout_probe.fd==-1); + assert(receiver_layout.count==500 && receiver_layout.blends==previous); + layout_refresh_reset(7000);free(receiver_layout.blends);test_close(); puts("PASS: automatic 50/500 LED replacement, same-count position changes, unchanged layout, invalid reply retention, obsolete profile result and cancellation");return 0; } diff --git a/native/test_receiver_output.c b/native/test_receiver_output.c new file mode 100644 index 0000000..8d37da4 --- /dev/null +++ b/native/test_receiver_output.c @@ -0,0 +1,181 @@ +#define _DEFAULT_SOURCE +#include +#include +#include +#include +#include +#include "target.h" +#include "layout.h" +#include "receiver_output.h" +static unsigned request_tan(const char *request) { + const char *p = strstr(request, "\"tan\":"); + assert(p); + return (unsigned)strtoul(p + 6, NULL, 10); +} +static void ack(int fd, unsigned id, bool layout) { + char data[256]; + int n = snprintf(data, sizeof(data), + layout ? "{\"success\":true,\"tan\":%u,\"info\":{\"leds\":[{\"hmin\":0," + "\"hmax\":1,\"vmin\":0,\"vmax\":0.1}]}}\n" + : "{\"success\":true,\"tan\":%u}\n", + id); + assert(send(fd, data, 7, MSG_NOSIGNAL) == 7); + usleep(1000); + assert(send(fd, data + 7, n - 7, MSG_NOSIGNAL) == n - 7); +} +static void fixture(PlaybackJson *json, int mode) { + int server = socket(AF_INET, SOCK_STREAM, 0); + assert(server >= 0); + struct sockaddr_in address = {.sin_family = AF_INET, .sin_addr = {htonl(INADDR_LOOPBACK)}}; + assert(!bind(server, (void *)&address, sizeof(address)) && !listen(server, 1)); + socklen_t size = sizeof(address); + assert(!getsockname(server, (void *)&address, &size)); + TargetConfig config = target; + config.port = ntohs(address.sin_port); + strcpy(config.token, "fixture"); + pid_t child = fork(); + assert(child >= 0); + if (!child) { + signal(SIGPIPE, SIG_IGN); + int fd = accept(server, NULL, NULL); + assert(fd >= 0); + FILE *input = fdopen(dup(fd), "r"); + char line[1024]; + assert(fgets(line, sizeof(line), input)); + assert(strstr(line, "authorize")); + ack(fd, request_tan(line), false); + assert(fgets(line, sizeof(line), input) && strstr(line, "serverinfo")); + unsigned id = request_tan(line); + if (mode == 1) { + send(fd, "{\"success\":true", 15, MSG_NOSIGNAL); + goto done; + } + if (mode == 2) { + send(fd, "{} garbage\n", 11, MSG_NOSIGNAL); + goto done; + } + if (mode == 3) { + send(fd, "[]\n", 3, MSG_NOSIGNAL); + goto done; + } + if (mode == 4) { + char *huge = malloc(2 * 1024 * 1024 + 64); + assert(huge); + memset(huge, 'x', 2 * 1024 * 1024 + 64); + size_t sent = 0; + while (sent < 2 * 1024 * 1024 + 64) { + ssize_t n = send(fd, huge + sent, 2 * 1024 * 1024 + 64 - sent, MSG_NOSIGNAL); + if (n <= 0) + break; + sent += (size_t)n; + } + free(huge); + goto done; + } + if (mode == 6) { + const char bytes[] = "{}\0ignored\n"; + send(fd, bytes, sizeof(bytes) - 1, MSG_NOSIGNAL); + goto done; + } + if (mode == 5) { + char bad[128]; + int n = snprintf(bad, sizeof(bad), "{\"success\":\"true\",\"tan\":%u}\n", id); + send(fd, bad, n, MSG_NOSIGNAL); + goto done; + } + ack(fd, id, true); + assert(fgets(line, sizeof(line), input) && strstr(line, "[1,2,3]")); + id = request_tan(line); + /* Unrelated/stale acknowledgements must not release the in-flight frame. */ + ack(fd, id + 99, false); + usleep(50000); + ack(fd, id, false); + assert(fgets(line, sizeof(line), input) && strstr(line, "[7,8,9]")); + ack(fd, request_tan(line), false); + assert(fgets(line, sizeof(line), input) && strstr(line, "clear")); + ack(fd, request_tan(line), false); + done: + usleep(20000); + fclose(input); + close(fd); + close(server); + _exit(0); + } + ReceiverOutput output = {.fd = -1}; + assert(output_begin(&output, &config, 1000)); + bool first = false, queued = false, stopping = false; + unsigned iterations = 0; + for (; iterations < 5000; iterations++) { + output_tick(&output, json, 1000 + iterations); + if (output.acknowledgements == 1 && queued && !stopping) + assert(output.awaiting && !output.latest); + if (output.stage == OUTPUT_FAILED || (stopping && output.stage == OUTPUT_IDLE)) + break; + if (output.stage == OUTPUT_READY && !first) { + first = true; + assert(output_frame(&output, "{\"command\":\"color\",\"color\":[1,2,3]}\n")); + } else if (first && output.awaiting && !queued) { + queued = true; + assert(output_frame(&output, "{\"command\":\"color\",\"color\":[4,5,6]}\n")); + assert(output_frame(&output, "{\"command\":\"color\",\"color\":[7,8,9]}\n")); + } + if (output.acknowledgements == 2 && !stopping) { + stopping = true; + output_stop(&output, 1000 + iterations, true); + } + usleep(1000); + } + assert(iterations < 5000); + if (mode) + assert(output.stage == OUTPUT_FAILED); + else + assert(first && queued && stopping && output.stage == OUTPUT_IDLE); + output_close(&output); + int status; + waitpid(child, &status, 0); + assert(WIFEXITED(status) && !WEXITSTATUS(status)); + close(server); +} +int main(void) { + (void)target_open; + (void)target_parse; + (void)target_load; + (void)target_save; + PlaybackJson json = {0}; + assert(playback_json_init(&json)); + for (int mode = 0; mode <= 6; mode++) + fixture(&json, mode); + ReceiverOutput output = {.fd = -1}; + int sockets[2]; + assert(!socketpair(AF_UNIX, SOCK_STREAM, 0, sockets)); + output.fd = sockets[0]; + output.stage = OUTPUT_READY; + output.incoming = malloc(2 * 1024 * 1024 + 1); + assert(output.incoming); + assert(!fcntl(sockets[0], F_SETFL, O_NONBLOCK)); + char block[4096] = {0}; + while (send(sockets[0], block, sizeof(block), MSG_NOSIGNAL) > 0) { + } + assert(errno == EAGAIN || errno == EWOULDBLOCK); + assert(output_frame(&output, "{\"command\":\"color\",\"color\":[0,0,0]}\n")); + output_tick(&output, &json, 1000); + assert(output.stage == OUTPUT_READY && output.request && output.sent == 0); + output_tick(&output, &json, 4000); + assert(output.stage == OUTPUT_FAILED); + close(sockets[1]); + output_close(&output); + assert(!socketpair(AF_UNIX, SOCK_STREAM, 0, sockets)); + output.fd = sockets[0]; + output.stage = OUTPUT_READY; + output.incoming = malloc(2 * 1024 * 1024 + 1); + assert(output.incoming); + close(sockets[1]); + assert(output_frame(&output, "{\"command\":\"clear\"}\n")); + output_tick(&output, &json, 5000); + assert(output.stage == OUTPUT_FAILED); + output_close(&output); + dlclose(json.lib); + puts("PASS: asynchronous login/layout, fragmented and unrelated replies, latest-frame " + "coalescing, clear/stop, truncation, invalid JSON/types, oversized responses, send " + "backpressure, timeout and disconnect"); +} diff --git a/native/test_receiver_stream.c b/native/test_receiver_stream.c index 99ba967..aee1188 100644 --- a/native/test_receiver_stream.c +++ b/native/test_receiver_stream.c @@ -104,7 +104,7 @@ int main(void) { assert(!target_parse(&json, "{}", ©)); assert(!target_save("/no/such/profile", ©)); assert(!target_load(&json, "/no/such/profile", ©)); - int fd = target_connect(©); + int fd = target_open(©); if (fd >= 0) close(fd); dlclose(json.lib); diff --git a/native/test_service_lifecycle.c b/native/test_service_lifecycle.c new file mode 100644 index 0000000..39df8c8 --- /dev/null +++ b/native/test_service_lifecycle.c @@ -0,0 +1,162 @@ +#define DEV_MODE "/tmp/hyperdrm-lifecycle-marker" +#define main service_entry_point +#include "service.c" +#undef main +#include +static unsigned initializes, finalizes; +static int fake_handle; +static char answer[8192]; +static bool fake_reply(void *h, void *m, const char *s, LSError *e) { + (void)h; + (void)m; + (void)e; + snprintf(answer, sizeof(answer), "%s", s); + return true; +} +static const char *fake_payload(void *m) { + return m; +} +static bool fake_error_init(LSError *e) { + memset(e, 0, sizeof(*e)); + return true; +} +static void fake_error_free(LSError *e) { + (void)e; +} +static bool fake_call(void *h, const char *u, const char *p, Callback cb, void *ctx, + unsigned long *t, LSError *e) { + (void)h; + (void)u; + (void)p; + (void)cb; + (void)ctx; + (void)t; + (void)e; + return false; +} +static bool fake_cancel(void *h, unsigned long t, LSError *e) { + (void)h; + (void)t; + (void)e; + return true; +} +static void *fake_init(bool (*p)(void)) { + (void)p; + initializes++; + return &fake_handle; +} +static int fake_preset(void *h, int p) { + assert(h == &fake_handle); + (void)p; + return 0; +} +static int fake_get(void *h, Histogram *hist) { + assert(h == &fake_handle); + for (unsigned r = 0; r < 16; r++) + for (unsigned c = 0; c < 3; c++) + hist[r].bins[c][80 + c * 20] = 100; + return 0; +} +static int fake_finish(void *h) { + assert(h == &fake_handle); + finalizes++; + return 0; +} +static unsigned request_id(const char *line) { + const char *p = strstr(line, "\"tan\":"); + assert(p); + return strtoul(p + 6, NULL, 10); +} +static void success(int fd, unsigned id, bool layout) { + char data[256]; + int n = snprintf(data, sizeof(data), + layout ? "{\"success\":true,\"tan\":%u,\"info\":{\"leds\":[{\"hmin\":0," + "\"hmax\":1,\"vmin\":0,\"vmax\":0.1}]}}\n" + : "{\"success\":true,\"tan\":%u}\n", + id); + assert(send(fd, data, n, MSG_NOSIGNAL) == n); +} +int main(void) { + assert(access(DEV_MODE, F_OK) != 0); + reply = fake_reply; + payload = fake_payload; + error_init = fake_error_init; + error_free = fake_error_free; + call_once = fake_call; + cancel_call = fake_cancel; + vt_init = fake_init; + vt_preset = fake_preset; + vt_get = fake_get; + vt_finish = fake_finish; + assert(playback_json_init(&playback_json)); + next_layout_check = UINT64_MAX; + calibration.kind = CAL_G4; + int server = socket(AF_INET, SOCK_STREAM, 0); + assert(server >= 0); + struct sockaddr_in address = {.sin_family = AF_INET, .sin_addr = {htonl(INADDR_LOOPBACK)}}; + assert(!bind(server, (void *)&address, sizeof(address)) && !listen(server, 2)); + socklen_t size = sizeof(address); + assert(!getsockname(server, (void *)&address, &size)); + target.port = ntohs(address.sin_port); + assert(start((void *)1, "{}", NULL) && strstr(answer, "connecting")); + assert(receiver_runtime.starting && !capture_ctx.handle && !initializes); + assert(stop((void *)1, "{}", NULL)); + assert(!receiver_runtime.starting && receiver_runtime.output.fd < 0 && !initializes); + int cancelled = accept(server, NULL, NULL); + assert(cancelled >= 0); + close(cancelled); + tick(NULL); + assert(!initializes && retries.paused); + pid_t child = fork(); + assert(child >= 0); + if (!child) { + int fd = accept(server, NULL, NULL); + assert(fd >= 0); + FILE *input = fdopen(dup(fd), "r"); + char line[2048]; + assert(fgets(line, sizeof(line), input) && strstr(line, "serverinfo")); + success(fd, request_id(line), true); + assert(fgets(line, sizeof(line), input) && strstr(line, "color")); + unsigned id = request_id(line); + usleep(200000); + success(fd, id, false); + assert(fgets(line, sizeof(line), input) && strstr(line, "clear")); + success(fd, request_id(line), false); + usleep(20000); + fclose(input); + close(fd); + close(server); + _exit(0); + } + assert(start((void *)1, "{}", NULL)); + for (unsigned i = 0; i < 1000 && !receiver_runtime.output.awaiting; i++) { + tick(NULL); + usleep(1000); + } + for (unsigned i = 0; i < 1000 && (!capture_ctx.handle || !receiver_runtime.output.awaiting); + i++) { + tick(NULL); + usleep(1000); + } + assert(capture_ctx.handle && initializes == 1 && receiver_runtime.output.awaiting); + uint64_t before = milliseconds(); + assert(status((void *)1, "{}", NULL)); + assert(milliseconds() - before < 100 && strstr(answer, "\"running\":true")); + before = milliseconds(); + assert(stop((void *)1, "{}", NULL)); + assert(milliseconds() - before < 100); + assert(!capture_ctx.handle && finalizes == 1 && retries.paused); + for (unsigned i = 0; i < 1000 && receiver_runtime.output.stage != OUTPUT_IDLE; i++) { + tick(NULL); + usleep(1000); + } + assert(receiver_runtime.output.stage == OUTPUT_IDLE && initializes == 1 && finalizes == 1); + int result; + waitpid(child, &result, 0); + assert(WIFEXITED(result) && !WEXITSTATUS(result)); + assert(access(DEV_MODE, F_OK) != 0); + close(server); + dlclose(playback_json.lib); + puts("PASS: service Start/Stop during connect, delayed receiver ACK leaves Status/Stop " + "responsive, fake capture lifecycle, asynchronous clear and no restart after Stop"); +} diff --git a/native/test_source_bridge.c b/native/test_source_bridge.c index a506aac..d80eb66 100644 --- a/native/test_source_bridge.c +++ b/native/test_source_bridge.c @@ -14,7 +14,8 @@ static CaptureSource capture_source; static struct {bool paused,blocked;} retries; static struct {char receiver[16];} target={"Hyperion"}; static struct {int stage;bool valid;uint64_t updated;unsigned sequence,count;LedBlend *mapping;unsigned char colors[16][3];} stream; -static Continuity continuity; +#include "runtime_context.h" +static CaptureContext capture_ctx; static bool piccap_connected; static char *queued; static bool stream_queue(const char *line){if(queued)return false;queued=strdup(line);return queued!=NULL;} @@ -23,21 +24,21 @@ static char *spatial_image_command_duration(const unsigned char colors[16][3],un static void consume(void){free(queued);queued=NULL;} int main(void){ LedBlend mapping={0,0,0};stream.mapping=&mapping;stream.count=1;stream.stage=4; - for(unsigned r=0;r<16;r++){continuity.last[r][0]=200;stream.colors[r][2]=200;}continuity.available=true;continuity.valid_at=1000; - capture_source=SOURCE_PICCAP_STARTING;bridge_tick(1000);assert(bridge_phase==1 && strstr(queued,"200,0,0"));consume(); - capture_source=SOURCE_PICCAP;piccap_connected=true;bridge_tick(1200);assert(bridge_phase==2 && strstr(queued,"clear"));consume(); - stream.valid=true;stream.sequence=1;stream.updated=1300;bridge_tick(1300);assert(bridge_phase==2); - stream.sequence=2;stream.updated=1400;bridge_tick(1400);assert(bridge_phase==3 && strstr(queued,"200,0,0"));consume(); - bridge_tick(1650);assert(strstr(queued,"100,0,100"));consume(); - bridge_tick(1900);assert(!bridge_phase && strstr(queued,"clear"));consume(); - capture_source=SOURCE_PICCAP_STOPPING;stream.updated=2000;bridge_tick(2000);assert(continuity.fading && continuity.last[0][2]==200 && strstr(queued,"0,0,200"));consume(); - capture_source=SOURCE_HISTOGRAM;bridge_tick(2100);assert(!queued); - capture_source=SOURCE_PICCAP_STARTING;continuity.valid_at=3000;bridge_tick(3000);consume();bridge_tick(6000);assert(!bridge_phase && strstr(queued,"clear"));consume(); - capture_source=SOURCE_PICCAP_STARTING;bridge_source=SOURCE_HISTOGRAM;continuity.valid_at=7000;bridge_tick(7000);consume();retries.paused=true;bridge_tick(7100);assert(!bridge_phase && strstr(queued,"clear"));consume(); - retries.paused=false;bridge_source=SOURCE_HISTOGRAM;continuity.valid_at=8000;capture_source=SOURCE_PICCAP_STARTING;bridge_tick(8000);consume(); - capture_source=SOURCE_PICCAP;bridge_tick(8100);consume();stream.sequence++;stream.updated=8300;memset(stream.colors,0,sizeof(stream.colors));bridge_tick(8300);assert(!bridge_phase && !queued); - bridge_source=SOURCE_HISTOGRAM;capture_source=SOURCE_PICCAP_STARTING;continuity.valid_at=1000;bridge_tick(9000);assert(!bridge_phase && !queued); - stream.stage=1;bridge_phase=1;bridge_started=9000;bridge_tick(12000);assert(!queued);retries.paused=true;bridge_tick(12100);assert(!bridge_phase && !queued); + for(unsigned r=0;r<16;r++){capture_ctx.continuity.last[r][0]=200;stream.colors[r][2]=200;}capture_ctx.continuity.available=true;capture_ctx.continuity.valid_at=1000; + capture_source=SOURCE_PICCAP_STARTING;bridge_tick(1000,&capture_ctx);assert(bridge_phase==1 && strstr(queued,"200,0,0"));consume(); + capture_source=SOURCE_PICCAP;piccap_connected=true;bridge_tick(1200,&capture_ctx);assert(bridge_phase==2 && strstr(queued,"clear"));consume(); + stream.valid=true;stream.sequence=1;stream.updated=1300;bridge_tick(1300,&capture_ctx);assert(bridge_phase==2); + stream.sequence=2;stream.updated=1400;bridge_tick(1400,&capture_ctx);assert(bridge_phase==3 && strstr(queued,"200,0,0"));consume(); + bridge_tick(1650,&capture_ctx);assert(strstr(queued,"100,0,100"));consume(); + bridge_tick(1900,&capture_ctx);assert(!bridge_phase && strstr(queued,"clear"));consume(); + capture_source=SOURCE_PICCAP_STOPPING;stream.updated=2000;bridge_tick(2000,&capture_ctx);assert(capture_ctx.continuity.fading && capture_ctx.continuity.last[0][2]==200 && strstr(queued,"0,0,200"));consume(); + capture_source=SOURCE_HISTOGRAM;bridge_tick(2100,&capture_ctx);assert(!queued); + capture_source=SOURCE_PICCAP_STARTING;capture_ctx.continuity.valid_at=3000;bridge_tick(3000,&capture_ctx);consume();bridge_tick(6000,&capture_ctx);assert(!bridge_phase && strstr(queued,"clear"));consume(); + capture_source=SOURCE_PICCAP_STARTING;bridge_source=SOURCE_HISTOGRAM;capture_ctx.continuity.valid_at=7000;bridge_tick(7000,&capture_ctx);consume();retries.paused=true;bridge_tick(7100,&capture_ctx);assert(!bridge_phase && strstr(queued,"clear"));consume(); + retries.paused=false;bridge_source=SOURCE_HISTOGRAM;capture_ctx.continuity.valid_at=8000;capture_source=SOURCE_PICCAP_STARTING;bridge_tick(8000,&capture_ctx);consume(); + capture_source=SOURCE_PICCAP;bridge_tick(8100,&capture_ctx);consume();stream.sequence++;stream.updated=8300;memset(stream.colors,0,sizeof(stream.colors));bridge_tick(8300,&capture_ctx);assert(!bridge_phase && !queued); + bridge_source=SOURCE_HISTOGRAM;capture_source=SOURCE_PICCAP_STARTING;capture_ctx.continuity.valid_at=1000;bridge_tick(9000,&capture_ctx);assert(!bridge_phase && !queued); + stream.stage=1;bridge_phase=1;bridge_started=9000;bridge_tick(12000,&capture_ctx);assert(!queued);retries.paused=true;bridge_tick(12100,&capture_ctx);assert(!bridge_phase && !queued); strcpy(target.receiver,"HyperHDR");char *line=region_command(stream.colors,&mapping,1,500);assert(!strcmp(line,"image"));free(line);assert(!region_command(stream.colors,NULL,0,500)); puts("PASS: both source transitions, fresh sample gate, fade midpoint/end, bounded timeout, manual-stop cleanup");return 0; } diff --git a/native/test_target.c b/native/test_target.c index adf6502..59de5e6 100644 --- a/native/test_target.c +++ b/native/test_target.c @@ -3,6 +3,13 @@ #include #include #include "target.h" +static int fixture_connect(const TargetConfig *target){ + int fd=target_open(target);if(fd<0)return -1; + assert(fcntl(fd,F_GETFL,0)&O_NONBLOCK); + struct pollfd event={fd,POLLOUT,0};int error=0;socklen_t size=sizeof(error); + if(poll(&event,1,1000)<=0 || getsockopt(fd,SOL_SOCKET,SO_ERROR,&error,&size) || error){close(fd);return -1;} + return fd; +} int main(void){ PlaybackJson j={0};assert(playback_json_init(&j));TargetConfig t=target; assert(target_valid(&t));assert(t.piccap_port==19400);assert(target_piccap_local(&t)); @@ -22,7 +29,7 @@ int main(void){ assert(target_parse(&j,"{\"host\":\"127.0.0.1\",\"port\":19444,\"receiver\":\"HyperHDR\",\"clearToken\":true}",&t));assert(!t.token[0]);assert(target_piccap_local(&t));unlink(file); int server=socket(AF_INET,SOCK_STREAM,0);assert(server>=0);struct sockaddr_in a={.sin_family=AF_INET,.sin_addr={htonl(INADDR_LOOPBACK)}}; assert(bind(server,(void*)&a,sizeof(a))==0 && listen(server,1)==0);socklen_t length=sizeof(a);assert(getsockname(server,(void*)&a,&length)==0);t.port=ntohs(a.sin_port); - int client=target_connect(&t);assert(client>=0);int accepted=accept(server,NULL,NULL);assert(accepted>=0);close(accepted);close(client);close(server); - assert(target_connect(&t)<0); - puts("PASS: target validation, token retention/removal, private persistence, IPv6 parsing, bounded TCP connect and refusal");return 0; + int client=fixture_connect(&t);assert(client>=0);int accepted=accept(server,NULL,NULL);assert(accepted>=0);close(accepted);close(client);close(server); + assert(fixture_connect(&t)<0); + puts("PASS: target validation, token retention/removal, private persistence, IPv6 parsing, nonblocking socket and refused connection");return 0; } diff --git a/native/version.h b/native/version.h index 1ccdd7c..880184d 100644 --- a/native/version.h +++ b/native/version.h @@ -1,4 +1,4 @@ #ifndef HYPERDRM_VERSION_H #define HYPERDRM_VERSION_H -#define HYPERDRM_VERSION "0.12.0" +#define HYPERDRM_VERSION "0.13.0" #endif diff --git a/package/packageinfo.json b/package/packageinfo.json index 3c7fd06..74ef435 100644 --- a/package/packageinfo.json +++ b/package/packageinfo.json @@ -1,6 +1,6 @@ { "id": "org.webosbrew.histogramhyperion", - "version": "0.12.0", + "version": "0.13.0", "vendor": "Local development", "app": "org.webosbrew.histogramhyperion", "services": [ diff --git a/release.py b/release.py index 3b5a1b0..4b0e8d7 100644 --- a/release.py +++ b/release.py @@ -53,6 +53,7 @@ def verify_package(version): for directory, filename in [('applications', 'appinfo.json'), ('packages', 'packageinfo.json')]: entry = archive.extractfile(f'usr/palm/{directory}/org.webosbrew.histogramhyperion/{filename}') assert json.load(entry)['version'] == version + assert archive.extractfile('usr/palm/applications/org.webosbrew.histogramhyperion/version.js').read() == (ROOT / 'app/version.js').read_bytes() binary = archive.extractfile('usr/palm/services/org.webosbrew.histogramhyperion.service/histogram-service').read() assert binary[:4] == b'\x7fELF' and binary[4] == 1 and binary[18:20] == b'\x28\x00' assert version.encode() in binary @@ -62,6 +63,7 @@ def verify_package(version): def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('--push', action='store_true') + parser.add_argument('--sanitizers', action='store_true', help='Run parser, atomic-save, output and service lifecycle tests with ASan/UBSan') options = parser.parse_args() version = synchronize() run(sys.executable, '-m', 'unittest', 'discover', '-s', 'tests', '-p', 'test_*.py') @@ -75,6 +77,12 @@ def main(): name = '/tmp/hyperdrm-' + test.stem linux('gcc', '-Wall', '-Wextra', '-Werror', '-O2', str(test.relative_to(ROOT)).replace('\\', '/'), '-ldl', '-lm', '-o', name) linux(name) + if options.sanitizers: + for name in ('json_protocol', 'atomic_file', 'receiver_output', 'service_lifecycle'): + destination = '/tmp/hyperdrm-sanitized-' + name + linux('gcc', '-Wall', '-Wextra', '-Werror', '-O1', '-g', '-fsanitize=address,undefined', + 'native/test_' + name + '.c', '-ldl', '-lm', '-o', destination) + linux(destination) linux('arm-linux-gnueabi-gcc', '-Wall', '-Wextra', '-Werror', '-O2', '-rdynamic', 'native/service.c', '-ldl', '-o', 'service/histogram-service') run(sys.executable, 'build_package.py') diff --git a/service/histogram-service b/service/histogram-service index d956250884f8b49523f1c9dfad3ea1339f248328..4f5ad3d380185aa76c62be70043c684c7e454093 100644 GIT binary patch literal 148384 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 RrYGK& zwM;ZlnsPkcjp?Nm-|qA1>`g_xmMUQd_xI5$d~jEMM}J=?+Le(o6gIo&!jvSg%M#=h z-QF7wC;E2Ctl9#OJ~SCqozqygjsn?R+JYMU809WSQMCcOm>IM5iZ0xVtb@=U8;7{GKmPGjw78S9b_a%4O|_>} z^k~{i(W{6-bQ=JqXeQ|~zETX@j1Z^ga5xQtqfAsqG_8Td&4#LX(|9f@dZ-M{ET(d% zJ{hMzP6R`n*vCpSI-_Zirm#XqYW>Ist2b|43xyAIuD;Yu-ve z%bKmO%+5Z46sR8W=yVvOIp*z0MpB{{C7)&r*1031zGzOf`vSnsCKEo7@WySMxo^bd zE>KpyWt+KJFdXj4WZW#nFy%1DDIv)qz2IaTb-@R~?Gn;KUHwdXjp zNNMtAtx6(0y-oE+L8sL~>+0;wGW~Ma-xnV$^)knd>yuGktzT{{L&)x4#41O~i9~89l9-TdY;xK^H>Aoaa7IYe^-iO=o9VdL@M!M^N(AU--;d*P2g9G0iCyJ`reX^b8T%2iw4&?eVb8=IM8{uq>i^XGfmJpe&9qC z#vD*engT=+zWkI${Mud$Z$?w$=1?CjJ=h1jQlHPq;`W%{Y@~xXeZstZJQvrT#2UN% z`Wrj?qDk~vjnSQbq~N@>X(z-zCp``b6NZ*7e8-W3DU%*TWuvaV zuo|Vh5R^1rrE&F^&5dxN=nktf*5k-IR--A=>NOh|%hKXNDRg%!RVFD%{Be@<+)B>m zoJQ~=_ed}DY-2Y@lSU^e7^j5}+}kTz(d5hR0_k{1KT4`=fqLhcmLjzzs}%w5^VcI= zzW0-zQNKnWf()MaM0)3S6{erU^jpsJTh8Yyy@&AB(~jFqM{hkXJTk2dPuo-U*z7&f zb_7|Ug(K6I)~y5!PiKzxXzj}TdHJ^C!7&Y!ug(|fxgS5Jqo1Paxspfcisjb113e+! z%2#Q5_zB!vD-fQ}Bj{0`y>PuTIa>WZ!dt_mGtGLAxOgYw=i&VYZl%xm0ka;WH4&d_ zx0Ehh-%5DiIprG198ZXop3>aK>58W*JN0;B1eM(X9k0t@WoNW-E*5?nu4PKsb(M5RL z$M70>b8veSm>v#1>Nf)>Jm43n#onGhh(sQUCFl%{uo1a%cs#n6(dJrGf zv_{m?+@IHmK@yW&`N}Sys|{E!|EL_CpNBUIFZrsk>nFU@wtHZO>Crg=(n{epzoX!N z&;xi2M?byQSG?b%;{sOheU`<4>vjTFk9r;zS!MHnb*BcbrxoD-y!5nIK{{`QJ(hL9q diff --git a/sync_version.py b/sync_version.py index bc39eca..91d7221 100644 --- a/sync_version.py +++ b/sync_version.py @@ -21,6 +21,10 @@ def synchronize(check=False): path = ROOT / 'native/version.h' if not path.exists() or path.read_text(encoding='utf-8') != header: updates[path] = header + path = ROOT / 'app/version.js' + script = "'use strict';\nvar HYPERDRM_APP_VERSION = '" + version + "';\n" + if not path.exists() or path.read_text(encoding='utf-8') != script: + updates[path] = script if check and updates: raise ValueError('Version metadata is stale; run sync_version.py') for path, content in updates.items(): diff --git a/tests/receiver-ui.test.js b/tests/receiver-ui.test.js index 71936d7..68e8677 100644 --- a/tests/receiver-ui.test.js +++ b/tests/receiver-ui.test.js @@ -1,6 +1,6 @@ 'use strict'; const assert=require('assert'),fs=require('fs'),vm=require('vm'); -const ids=['host','port','piccapPort','receiver','token','clearToken','endpoint','handover','autostart','error','status','regions','start','stop','refresh','saveTarget','testConnection','testResult','diagnostics','profile','customEditor','customProfile','saveProfile','profileStatus','calibrate','validateCalibration','cancelCalibration','editProfile','customProfileField','overviewTab','receiverTab','calibrationTab','calibrationShortcut','hostField','portField','piccapPortField','tokenField','grantRoot','rootHint']; +const ids=['reloadService','versionWarning','host','port','piccapPort','receiver','token','clearToken','endpoint','handover','autostart','error','status','regions','start','stop','refresh','saveTarget','testConnection','testResult','diagnostics','profile','customEditor','customProfile','saveProfile','profileStatus','calibrate','validateCalibration','cancelCalibration','editProfile','customProfileField','overviewTab','receiverTab','calibrationTab','calibrationShortcut','hostField','portField','piccapPortField','tokenField','grantRoot','rootHint']; const elements={}; ids.forEach(id=>elements[id]={value:'',textContent:'',disabled:false,checked:false,attributes:{},style:{},addEventListener(){},focus(){},appendChild(){},setAttribute(k,v){this.attributes[k]=v;},getAttribute(k){return this.attributes[k];}}); const requests=[]; diff --git a/tests/test_version.py b/tests/test_version.py index 8657a32..0b90206 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -34,6 +34,12 @@ class VersionTests(unittest.TestCase): self.assertEqual(app, {'version': '1.2.3', 'id': 'unchanged'}) self.assertIn('"1.2.3"', (sync_version.ROOT / 'native/version.h').read_text()) + def test_ui_drift_is_rejected(self): + sync_version.synchronize() + (sync_version.ROOT / 'app/version.js').write_text("var HYPERDRM_APP_VERSION = 'old';") + with self.assertRaises(ValueError): + sync_version.synchronize(check=True) + def test_invalid_version_is_rejected(self): (sync_version.ROOT / 'VERSION').write_text('1.2\n') with self.assertRaises(ValueError): diff --git a/tests/version-compatibility.test.js b/tests/version-compatibility.test.js new file mode 100644 index 0000000..5e3a836 --- /dev/null +++ b/tests/version-compatibility.test.js @@ -0,0 +1,21 @@ +'use strict'; +const assert=require('assert'),fs=require('fs'),vm=require('vm'); +const elements={},requests=[];let serviceVersion='0.12.0'; +for(const match of fs.readFileSync('app/index.html','utf8').matchAll(/id="([^"]+)"/g))elements[match[1]]={style:{},value:'',textContent:'',disabled:false,attributes:{},addEventListener(){},focus(){},appendChild(){},getAttribute(k){return this.attributes[k];},setAttribute(k,v){this.attributes[k]=v;}}; +class Bridge { + call(uri){requests.push(uri);this.onservicecallback(JSON.stringify(uri.endsWith('/status')?{returnValue:true,version:serviceVersion,piccapInstalled:false,receiverConnecting:true,connectionTest:{state:'Not tested'}}:{returnValue:true}));} + cancel(){} +} +const c={document:{getElementById(id){assert(elements[id],id);return elements[id];},createElement(){return {style:{}};}},window:{},PalmServiceBridge:Bridge,setupRemoteNavigation(){},setInterval(){},setTimeout(){return 1;},clearTimeout(){}}; +vm.createContext(c);vm.runInContext(fs.readFileSync('app/version.js','utf8'),c);vm.runInContext(fs.readFileSync('app/app.js','utf8'),c); +assert(!c.versionCompatible && elements.start.disabled && elements.saveTarget.disabled); +assert(elements.versionWarning.textContent.includes('0.12.0'));assert.equal(elements.reloadService.style.display,'inline-block'); +elements.reloadService.onclick();assert(requests.some(uri=>uri.endsWith('/restartService'))); +const count=requests.length;c.call('start',r=>assert.equal(r.returnValue,false));assert.equal(requests.length,count); +elements.stop.onclick();assert(requests.some(uri=>uri.endsWith('/stop'))); +serviceVersion=c.HYPERDRM_APP_VERSION;c.call('status',c.display); +assert(c.versionCompatible && !elements.start.disabled && elements.versionWarning.style.display==='none'); +assert.equal(elements.reloadService.style.display,'none');assert(elements.handover.disabled);assert(elements.status.textContent.includes('Connecting')); +serviceVersion=undefined;c.call('status',c.display);assert(!c.versionCompatible && elements.versionWarning.textContent.includes('unknown')); +c.display({returnValue:false,errorText:'Disconnected'});assert(!c.versionCompatible); +console.log('PASS: old/missing service versions block mutations, Stop remains available, matching service restores controls and unavailable PicCap remains disabled');