From c50267120a4c1ba12c4a067ce1247ce883c9bbd2 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Tue, 17 Mar 2026 15:42:03 +0100 Subject: [PATCH] initialization and cleanup --- private/lib/linux/x86_64/librktwebview_qt.so | Bin 239032 -> 239424 bytes private/racket-webview-qt.rkt | 18 ++- rktwebview_qt/main.cpp | 114 +++++++------- rktwebview_qt/rktwebview.cpp | 48 +++++- rktwebview_qt/rktwebview.h | 1 + rktwebview_qt/rktwebview_qt.cpp | 80 +++++----- rktwebview_qt/rktwebview_qt.h | 12 +- rktwebview_qt/webviewwindow.cpp | 1 + scrbl/rktwebview-api.scrbl | 151 +++++-------------- 9 files changed, 209 insertions(+), 216 deletions(-) diff --git a/private/lib/linux/x86_64/librktwebview_qt.so b/private/lib/linux/x86_64/librktwebview_qt.so index 9ada80f266993e1b0bd4688a0e876744e6c01c00..d388aa28d812dedb911d81289dc5008318457adc 100755 GIT binary patch delta 71062 zcma%k30zcF`~N)y=!nCj0>hvvC@QW%Zn%T%U|N(LxneGnD=M0$1?G}OBzDqc<=SGJ zOPZETF1RmgYO5`#S#MrK4aMmnp65KzbDr%i_ug^GXMu&E z2NuNIa#k*C+}eNbSwkLc&n_C<+<)}5OkRzCcG26-tN0F8INwFz#rdBLR~LqhS7-C1 zQzzQwb;a}D%8KkR-^mt+lngk*JAZX|^sDb}+LJto?fte}m#_H{ThmGf!A7i46o1uL zH`4b&P8WxfVFVjXjDoc}hS4P+-yOZ}elMo}&QIA|gw0J#HC|0(EY>&NW<=S-=O(R= zs`MBS^Jx)kXYo;g`6lNEHjb~}&DB3@$LsdqtNAdWx3hbrCw)|Jj7RkOah&_%GZ3Fa z_zb~k7(U+PNqm0_pQkl!tUiy&c>+EY_4Op2Gxhh$IA`ha({X-Aea|*#;LCIP%);k+ ze6sPOBS)WS<2)CidHBr7=Ouhz#^)7$^6_~Up8|a7ScEgz-(SahF+NN5^-`SQ(BI#} zc{x5SS+;6Of8Pb*eSFs8^8r5V@!5dShxmMi&sKas#%DV|JMf`nr#^p*^KSi};Ct|W zKRyRE>>$pE@i~gmF?^2Wa{?cOGd6{DsdAjl7BTZG8UL*LQIK z2cLWRc=&a{8f_UO+lG%1KEC)=#-|ECbX3*n0GxyHsfJGt4GZP7E4@`~R@2193A+wA zxw`CFtEpShOf*&)A06uWa$w8q4c77a$}N4Dbl6bLM^!%OdpROCjd!p&^=;m zkK$+S@A4T{(tTOx^7Z^;6?d&GiH#$UPmO!-N8|Zno`=KN&+WhLr$?WPXcPDTsXzEx zR*NO_{Z*Z81E1{QlO^!$PA5CU&-y!A9-kfLWL5d<04F=fqeGpn4^IH)V!kNQ$(HdE zRh@p1v^9+C;8KHKMtdiV=GAIA*(k};B_4D5IN3~o9gTKz7U^Wq^Js^YmsSsFH^u(D zHYdBz6ToXQpY3q6rIJIOh^~ZI9x3W?*|rg{R?ErmQ(N{OPp<1^fl|#heiran65f}y zYEJf!RQ4Or(1}6(EEES8ioeSl#5~V`#`mpKK*D|LLW#d3?2Swo+RB zTRsBaZ^|F5?ewb^=%wGs_k+HL!+X7lUk6nNpB?JtQE#P`bZPp zrM7H5Iuyqm@SoAGJtEl`p4lk{Ug7&Aoa}4m#paT4AHE1Jdh*qEoa_=`jW|eIk zNTzpX<7@n9cyXnSm~7cNRr)($HhV+HM<3O=ngrDokKMC5d1hER;vgY}3_~G&L3Sfl zs^}+GxhLZ(T7FOE35c!6Qr2;4mY4aK7$=)2+ZIXZeJ`V6l$cy<3zt4!L}9|C!o&TZ zZRfS}Q?jp9`D9pYuFRKM3TM7KJe<{(A?hdnaEAVhV^w^@*=rQh{1^yUN`hx)RDU7A z|3NJLhDB)h{ERD{UF6BgkGG|kSLF9jQiMAqoZXh86jsZt&T(nC@5IkOaB;Hi{7l(l z7X>hzD1G?6bp1PtD_*7lZ(CuRP2 zk=f^#Rvaw_d?!OFN4mSc6mw5zcMmZ+02-Z?oR2imxF!Fh3xzUK+Dpsrpmbr&RSf$`x9?K{k|PCWN*?H3?Kl)RsvS!x5_nRb za5h#-M1_F+zLimURcbO&2L4&u4@gJaKy}oQ+ETX(JR!=-;CeuID7n8&_hj%zKun>m z=V@TSMTXoA8TTJaH6A58zw^z#4*P&V7ENJCd3H#)4iT&WK|F7c4u_u9v&yP7k3ux! z5F+!X33ihU{5(!Cr{R*guPm2t8Ni|(I^a7WO z(oe=mkz~7(EbW)>9eVsCt9Ya92H%3p`z-yWbHN{SvyB3p;^EM6 zL-&NO{8vaXb1;0qsTpV7l*145Y;%TOZodzR@ANqpK)o0x+{g4rhloif=4AQz$5a6DRA3F zB{{dNtcT^27zNaXYeUyZPe%cKElo_gO!H*!F zNpML8zr;6F^r-_BpV#3(I$SUh(WgE^eBcjnk2luTf;XxLUVHu=rx+#aRbemPgFk5u zB*E>JLYX=up4IuZ%C6wrJw`X3=9xMJ)=nr$XT3F$zt_2^}g)lQr0kSmxRqe_ot!R{n|E@cn8Em8e8%C~1JQt&Se5Q>O@V)j~ z2!f*;N=xPmCBPdiTQGAb3#Hal@Y$Nr3iy;da7G6yQdAy$TN0lLBcrVJEBQt+Dk?GB z+(`-cF5gZg%A_T9R%;g)bo1Em2az5;fs#;$IM@6rH7mx=Xe;(W-Y8 zqi*VC_wD(Q94ogI443edRbx(F-s4E#z@&Q z{!Fvz>=|&2lqpnaTWcdc)j}yB{EPxz*6{1eiazN}1)vQGI-2P4DbNh`wv(|;CqOE# z@o|)D`kz&)&o<7e!J%wy7^oH6tOp_%rCRdvz2s1aMgUsCdoW0Bf)x>|aDNgFTJvsB$Pr&j2lB-Me7 z2NVNuOpMS)F-jLju$4y=Evivc3J=@(KXC!sb?a%1X~lbLx<~Z9V)F*YH%9B%S!Z;7 zyz)pD4d2*U@yYC>0FNlNu?nMzjPZpE?oHf()bt_SNa~>|YidSsG|`NDD}WvZjKg|V zNY?mDz}chYnfZO!2*8wYu{ggOxy z+bT7m*VLzUj;6QZy%HK^zl;JyjiYEY42L(4ZfmlOx(;~@X__t*B`!rjTeBUk3v3Q; zM&j_gbCK@lnGi+4K+~tFvXyP*3{;4RRXgK}MoOU^+T+7Po0D`zY5^DZPNvr^))F9KT1Y~K%&AK|0b!zFc(J+CR zir!R&-Xi$17Eq$sRbD<%Km(#*rOUfF6|1^c2MmXvPDoRLXB$1%TufJ%&@pDbgtZj) z*yyhm%~mJlQ$1KFB`Cm2)y!z96$-A<<7UZ4?Wn{z2-jE#IRP}gO zg$YDF7)pEV(C)4o?b6j^^CL>4cO~wLQG#=5;Kq@l71~)v!3*yz26j48=lb!#Ti3}x z(^MI5Fye;}f3P93IXXkoS{_jkE4Wc%aGR&AZ*YZ4+AEqqvqHvxr5#_Wrm5M69t@26 z+Hi&1a9+VFjg;Vuv&=tYRlkB?RUI9q72TyHrQ}@&FVXPt;W=_lD&4)oaYdfsh(6GW z5N9-_bcr^MWj!?9S6OJjIvH1BJhD)fR@Cdr@OFwmM~9p=G?opYxqfo94T6;$N%3IKO?iPR#fl4cr9^2#k!HIL%q7D&(>4Q z!fYlNkLZm$5;1;A0lz3p?*iOU_c)j)ojANpj~#khTQWq^_tXM9>zK&Y)zWLBY8@2+ zOub4RrR5uobPjB;kOMa~qxeWA7-aJBYoi$Dyrv|+so|})sZ+mEaPQ>$NzjwaDo&zT zw1xkv$MLVL242(srA=C*;a(SP=%-!tgi^@6MoK}}5FdGm70N_ugR%!u5wMmoSQk?a0WDG?5klmiSZ^6El74@jg#9tkUwa{!_+xOXxmbjPL7Hi+?_- zGvAihp7$RVEOJKqROSl@H5Bun_i>5g!+c!4|L~f8aC!tEI4Dr`e%Z&#n-8ikeoycT z=KVT{@VQSk=1=tt5?AAWYKp?aKEC|o6S3m8kv@I44j%j;U+&BZ65lTIac+Gh{l(y@ z(KAMmOwP>gKHV5T=#hkn9>e$XPmdgt_4K5PEeXd{$AtQ}7?GJtU;NvS8a;k=)@TsP z%QjC>d^$_E=0~S|$~#RA;_fMrv*~=rlxEN}f-jrOdFRP@#I+Qk16#k(ni|O8oYP0l z@8VNK?0wuPQQVy7Q;i4DZ5}jo{OA!Ar)3%$BPNa-KY9wkKDVPUG3UMJZrj>?-s%8; z=CwDsj_1#@t-rn=XyfsV9oZ`e7`C!XRBhEFirqQ2g83)TJQ~CrkRJ`_`-r; zjA7l|Ug0ZS@HS(EZjZ^9@%o}Ah`p-Dw;DDr;^}Mzb0yfgr{~3P1Z_3i(rRYD9n4E$e(_z zVfJRd;!dkTRjA=>E5HwpSKN+OfM3+~;Xgbm?Q>0^Q2}nK1$u6)j` zSQ2Oo-w5m!OWR|Xwo~}|l}^5Ug@bM8TUI!E_$mj#vceG%Z{cu{cUhshYwvn zoc+P~faVViO`(P6BEP!YiH!GqJI=MpLQ`Vt?;_skZD)XY1Br-A`Q)`uzTj<#>!hWP zalG6IC;7&=p|=HVw_xY<^KUzO@0E^#U<-5s4|u0%z-CLED86Wolh1g^;hJQD##-7; z;>+K0x-fAnJK`|cE7yFFd+Td-*s?E8EV z+U8lX=@x7rzY6RX3pT@oy}~2kbFysS>b*GER4dKVa{JBV&%f8xrJr+@G)pZU&hqo% z@FKqn4xd;!EVXcWns;0ihx_#t);L`sT4>H#_pWLoH-;-}U*T~ArCGc4H8`8{CIS+EN%*gtr)51cN&fRo&pTCgYi&=2C6 z56}O=$+Gx+AH=y1S@~G3`YOK)KIhByGmNzs>`WfHJ`NA4^uga{{Q31x*J%r7yv4#t z`9{#};OE!VgKRg~4|kogQtI31q{MVSVT04v-=a^F1$%@q-w?-&_$mB-m*3malRd+` zZ;WFv^J(~diNCjTxJz%tO8z@OSMiS-nlY9~ZgRRdTR0!HU;}xdO-?q6kKWW1kG*Z& zzwcDg>Ww3%VSZs0?K zU1G7w0t@yXp1+wMdVFtloa=83%~}i1Z~W@!ICg_aZi&M~l6|%~*>OI4OFdV-o_SF- zy-gu?SjAUw!2=O`!bDj8$brP>Sm53#ObJn9fnT&}lCEbO1R8IF7g*qWWi9y^DmZ`i zBfo_2B}Dx>XQ9`-EfSHaCoIJJS3cpRI9AM;e}vJ|A}joia$9B4RO6>W^C7?YQBO9I zci;LxdxKxy+LKM@t+w^FwP*Z=ZDD-YHb=k?OQRZm<2EPXu+0&8%mUrO_)j4I5ya;# zU?&gw*vTCqI|5A$)MfBaABRP}Vo|Hqf{rlw#E-*V`fh;inf+|J*0uO@@LUF-;TC8= z#y|f!jGqKJ)&hQ?@%sSZ1vt?Hu50k-pM*u|o0C$6+k%cU_^?mHT;3ZIgio`e-{bk8 zI3v8g{GFB*IARuFoI1$~WQMdR6)zAvy~cQRgkdl;{^-4U?V0&c?lY{zV2 zyCZO|1=`HuFKiEUdG}sP(hdu{Ip2sz8_?*O1sZSgpSFiZEU+kW&Vo)bc;JpO*M1Ay zw4giljys&L=PlS$3$_KHu)`VAk`&R0{flzPwKn*Q9bpkUmd4>0^po)54tQ{fBOulS zPUQD?pilssXo0rl&2~C@)18h0w*}gn4+V4xplKH99-hC`$x8WqJL4jPEJbUEg{BGP z*LH>l=o@oV`33xEFpJ&gi0I<&4bDp~jkYrW$gZ$}?iTb~p1cdw!d;GlRhDk<;FAH} z0amRn&|?->$B;i@^`-@Vj-N%N@J}59*qbUlOwK-aa`&eWSDJ;k)WRx;Px#d7Qro|( znf=RhCk)}sKXpdjva}7iUkUgarzp0lH(4!}XPg(=iLDrTjc7e%#{- zJZFI(U_5YdSimR?EBI_Le74sSF~$NdwKV#P@rirGTu)ih_OHsFHjXdf>x`IS(Ieb~ zT?D5=;#f;#I1Li*`y3JDEzm?uqwg4Rz7K_QFEYpi&g4V)IU^=p8l_pVUoigazOV@I zrYTWnSkNCaz8C1}mew;Y=vd?!MDE__V92d~$gM($>sbr&QVVex-lxzRaM#l1wY*v( z+*IfY@ZQ*_rf?IWI|?0q12D%d9Om%zg-+L83;%N#Y&#yX-x=|?g}-UR<}%)Ce^^AW zrE#eRJrC{z`eh5+{&l&#E-=0V=vOT0a0_}A{Ix%fFWZkoX8{-Rd;6UMuUQ%;^6UGN zWCt7pODs?~k3Qh!8GtUeK-2hRfG$1Yi12RK6EefXzbU+PAdJ6qz!5mZ0&W4X0K6OE z1r~5R2BL#u{K^3bUKFTy5RXV7bOd;J#fdet2G9iu9j=cpM%-ax@iyOh&>8U#5$ofa z1$ze-?_gNO8ZQp#a~5S+MqR%H6UZ zZaEa@+G0V6ThMX*6xg3U1g}`2SNOd{&VX+%T}poM@}Y;F5!)>M z(=1pY8-Mk1Sb)dEDuX|E7#lc;9T7V$jb>OH&4PE(=u-;7yp&0o?nD11p=!N02o~90B_+JdW|zfSQ0Fv_LTq0UCbP5m97O-Lx=1 zjQQNrFxLwfbg2b>lutP7j5uatY5%s|E1lq#qhSHo^;I}ubkxbu9d)=eEi7X#jZX1< zN1d+EEi4l)*vq`xF-&}pI|AJn=v#~rI~Epk#?mOwg6@ji2DHD@OcG^S&|hFkIu_rV|d=e=N{aOCys{IDu)d z1#3T7?zdvh=1zn~EVoDux1g^Y{Bxl7V;7P~tOb3|;P-*PVQHOcLD$FV^jVnePm64~ z1$~nb{mdC~+k!>;`wZppGl%PM3pB&h<~hFSGiQYNmMam>uwehel;X3nh!GZj7Ff^) zsD>xQTz(eoFSVfW@;)b>F1;Zx<*&712k_@lV)A|x>nIEKVZIS<^d7WqbIgLxm$W6x{-?#+!ZabWOFiaa*uM`A}fTSg>gp>4kc!-5t3>gU*-{@f9;zyke%N1k@_D}XMwKwsm10IhWzyXO{Y zD1RQ%-hl3~K*RaQ(@xhGi_~KlYy>}#HXG39oCO-m1I{>IM=Whj3$_mLcm}KEGmieH z7HG7E+R*zFv|3NF!0i@zT?;(e0QPyM>sm7{YzeSTb@f7fUK9~9nuen?)s^E)oWgEH=X zznAIMwzP3ps5{SZ6B@ba6=qfOTnws{LykSD&uB10HfS}7ufI`?b?3)!)Na%aAY)pS z{_Z&)d!eb}&izl8!=2ahw_llIrl1?8?Nz%9o-}di!Vrg|1|O7vi(dT) zy3ln|Q@+1+q^-1=H~9PE?Db@%+zaL}S3I7eI)=O4d}n`?%G)6Ae=6VS0p&fn{!RJg zzk56hKe%(x>E0Y1GiFS4uRD0j-vKcA{l5odCu+c*I{ue$NPPwut>D>r!de`~rH+)o z1|HLP~0@{@P7u@Dw zP%354k;LA)x6RA=4hFjKMQ&;4@=z>iGG8*uuH|Ji$HL?p#l*azwDL0BY=U>5-|8>m zA+JFZ$wg^^Tdv)Cl|1R;-h9jRORhj~#b+Y|{GzP{MP!Qdo)@6&?m1V&d*`(pdzKl= zd9~;LkmWC(8;(#th$OuPxcRYE`C!n%!k|XJG47+?V&vUGckWSh&}FFYDNMM9ir@}< z6b`+-3ps9>tBXCn`Muh$qlh5)K(Q_13wK^tOfU%Cx!;*7zYzH7-o`{b1pMB$)X7v}x zvc}EtNXK0;|Afsc#pYaza#NNNU0?~xYKeAmSbO-R)#4o1ti9)&c32CDzl2(EF2AJ3 zUy*~xt!djWatjG2`Q7?cq%UI5#UAF*x(a{Bnni|c@c|^h%yhD<`Hc|$7@N#`iX)7* z?^pF#D}^PdA3vpy8#IsBLWt%CC!y0!aFkJa#C`MtMjnru0;}Xjp2paM?({%+&WQdt zme{rq+*THVQ-C)2T-5!Ug)0ic4VC~*B^UxQ{JJ>1fQ1T&54!V|_|3-RtF)FvFPP0m z9Us;(W=`S#Ii(>%FXh%SFkrx{0W(m2-6MTxyV)_%#RQM(dsS=+VUe|O!lv%LnZXIS z%nwL-x0uY7yaBQ9d0zz0ZCOLy3uGC#6V*jrAd45BeOX;LT|DW_nlZO1@MY1C&!~2) z<~d@IFN+CzOG2gwyXPEvl5?6(c3DvN%(fg*n@n zQ=}6`EK=S4^>;DIkFAHqN|jhY+e6=r%t$sWd;Cux4;9T(I3MYn#N2svB|Qp7(A+wB zS+&Gt51JQ-FYY|WX)jG>cTs6EAN`rso-0+L2J<`)Oltf>Kn#_G-TD1uGBKu_PO2O} za|&nA!_W-V%cg#0M8syPcWRTKmw*!Q9-Uaicc9G_E#PzIVK zc2#B#qL)dC)j+*agH!Szfzgi#&0ShuFguLiyt)`?XN_x*hYQ`FBktMva|~o=~ADfLV{Q}kOkQKK4bX0Iki&c7^0hGof_gmh`6AK=o%xnvoEpR%YG-9_T8!b>o8 zmkIAwO$q-hSR4*!@wGFm|8L>*gT>V95DtT)zYTtq@l?+##~CU7&5qq;(Ril;DTcB$%mkDyONDktaM zp{~D-=HmKz)~M?0qQUqM6>k12`ycR&oQy~nmYx%zR%Z31w@8q++ryF7W!>HwD7#&& zYoJ#rv$A`iMW=2MmSbn3wP(WA|H~V<0>oB3YZ`bAF$Z;)pfvW*A1QuzvKk^OfZ4<5 zQj)4zX!|YZhq*^7-9+;M77^M{vFG2hqV@W1KHEglUQH$$$vrlYe$)FL|tE2ulAQg|6Ahp%3`E1Yie^>7K?mYRKRDb z+1`@zmAK~5>P9Z3GQJ_kpxHaL&^GAt71`*J*jJfF+lE~dsa08c+q-x$Dyx-yo+oJT z+?sgfE^m^f`@E|`b35V!1M7L9^O77?1G-B{pS0w*hlA!lR#U95%4$`a0w8>I?t%)H zBeD+2P?`Cq3YFI-$QmkLE?7dPpo+?n235p64)##(0)))}3W#s)G9YYg?Xu@J#-YIK zo=1Iw9?y+gAQGyw$dL9DVU<~QUe?TdRm(BuHS?46mI(M&WQVg%l;wm##96E_i?js? ziOQ8&Uz_ceER_#;IIBu!OPsx>l8Ub^l~v(aSt@P#LZy;0mQq;8Pn;JC!W)zH0(a@LGw#}+4UJ7N8R<4A4^k7ch__2)Dy3Z@*#37B- z@h}Z|ofE-}%TbgQJ;YOCY=te=UsT2~{MgnUmmQC|cuIBr9M077qMv+ZKkVNr_uu-y zO!)ef%Ke8V$m)tI=Pd5OXpsBIL}xvxYS#mG!n#V#q+jx%*vH1B1r)3_Qs@1A|g4MBsGha?Y89+o_O=s`Wsy&lsIa2o2q|Joyx8`%;> zK^^@1(TbX^g>8~uyi|`hjZB5QMPpGh${JCOP@@KxMuCy<9tYhwcu=>Djs|d|JMmRH zb9;O9Dr!th?h)@Kz@48JlZi$15tzrFzfDFU4eh^C+yWPm3;8^x`L380$wtThbX0Zp z8=SpN%yow#eZxJ1ScmWfUuw~r&Csu;XjZ*%C5$V?Kj?_ZBl*t74B$E{I{|wEi0ipC zF&Uuiv52~$PfGUx<~!$eThV7!{}un&wVt=khF%dcoxQu+3mGGO2Q|!7NOajhno|T5 z!-rud$--Q85E^eqNIsx3N}lV}VS&hV+P+{U#0P z!!;>+zA@nKNsTJ1bGyt*GeM{S>?emB3Nk1{VzN2M0k^yBS0YS7_X`wgAN2wQE=GNSuUzv@efXyD;^N- z&i&rJNq+5s-5IS`Iqkz1+Q7y|B-k3?MMFw0jTY!6yYzXv06+0VG^=C#;E=c*%_4>` zS&#W=e(0he%t$z%yaVg zSd4GPYG$tndC>(}5UWe`5c)=m(tDRWZ``lpo&RFaB%@KRi}QEkjqA5lcT57h3K1@qT4DpTn}B z&Cl%9);GtXgrW6!7=>jlV;V71GA#4=SB1*ovt^smU)p<>lK!drfSmsnN;#~B2x`RY zwld1ZEYV?(7}D<9rUXA+#!kBDg?(1F-HM%U$wB3wkyt>f@cCN?Uj_HfJ+9ny;(&CI za}UU+l}RWS0CLX)HBIoJqTMuhmvA&@4Q(U#h*mh)O58&-6le3ZZR$dL<=SC!HkUQb zz6p=gvbhi(<>WCP^Eo+r9EdNJgoLq79uJ{GQG4Lb6Wgi!9>x@X={w#j`n*qnrB)s1 z17fZNfjdu4*XMpnh}_feIhXI|>2(2i1x4*9%o)@Z)N)H3J5_LE^Z+f`rNOJD%L+Q*oY}KqlD@iZPJ*<# zh0|(apxuTbr9pa#1Z7=C$&=G8omA$#Xi`+=G7Jb`%Hscp48~ULTI%>U_eK7sybNHrpnrLFO76pskvgu?+n$mVI}s z@#KTul3mqj%Gd>nsCX7qYpJY}|5pEh`c&3`=UFl$b<|rsDXy38m2(sS`CG{_x6K!} zijsK5^|VhYY9q60R8-qOy|qp>u$UJ%miO7Tk%_E3NT+_*k$nhXD6+}MmdIvcMRV*2 zc9AxMwrDFtDkZOnoEgC=o&YRW`(j#3s{OcA97teeLPo)N#XfHAoWe&^n?E;*4iB*v zHOaaYH-QbkV5AAwQj|ThN!)yh)o=LF7U+Z98e=~KQ3DVaMJq~*iBOH~^N~ny!CHnm z;pj3sRM5@$){ER0*eh7IRa|Sq8o8#yXv(Km$>ZLTX}(*;w`5Pad^9@Md;>+D(6S)x z{!|tO+rf{Nso(ra+-M1tPyR?mwqng~$sdV6tyqJ)E+|RLR@?0H6y)^`_Y~ENrC zOYjuAc5PqWiiNOhf1%4XWrUI3xj&gLH;P@YSz;Z3*r^Y#_5GncsR@Gn-fh)AJ4LlN zte(rg9zyc6V$z8KW%hLy_1CwEK5bZ?=n_I}#Z_!yvxKI3{X>!8hP8>>@gZq&)Sfcu zQ0cU5?mV#COM{P!oDV*vI_wn9rZWHjFM%|#Z!OP(+`hFi>G`vX%B$3bLbKLd3ecIg z+($9akzBtEzLDzZL#qaui;4wUca+c9?YP?R#LB`0#RnI&EnCv(Ecqc7pp_6oVCfe2=Xu) zwQ$d3m$An8jL&g63H7vG%M*i!>EnaP3j)+72-m&$ch? zWP;aJX2VV5srIZ{R4Ft?RF*Y_fh;Y*UoXc`wna?p$m#~YYKb#5;e8R%fiGBOmC$@&I6~080s(UAOeG$-|9({U16v5#9$5H}xX_8! zZ1@q1NpT7FCKX%|M3dje#*p06u$%qSapK+QJrUiRwU`i&Yq&59zQ3r_I&p6lM5(ln zfcfS9$QhQck>Z;02=UkrzQxr@kGgoSx!AYZR;)@g-J{wEqzpT=l`e9p-V^&fv#3^| zkq@B{%>wS5dl0Q)hTu&20yjOAhZl`|TXhodPXZH?G~+!Hmc;5d*aq)X$LzHFhFd%^ zdM5c5b_)j~#dpDbVptN3?2}AsKxF3Scf9tCglMu~?r)@ZkQxn?^$x72`)oP0Vv>w$ zRWObC6VYB=LJXqJHSdUHNvvu13^1Z}g2A-0>=t7^M=?9+P=@RUc94{jVyF$WayPs} z5#5jMqP*cY8*1cAjch{}l{Q3+mo>01fMW{!Cl3@;lUbemgAfDCxd^-{6?kEkCRF03 z4KA6jMN$`5+i{u7m+V3Q+v4YB*2EUSMg(?Y(bca~nv^xTV{Uv$BzIwvEryk~@P!vt z(6s||9dvFoTVtY;&r~4j&aV`Uy0BU{&j#@!7&|B?NMwfj+G_D*7Z#hH0mD9Mv{Z}H z#uEMPLzLVUVruVASuO|-iy=`)uG?Hi5vO*Ep zhdE=nuK?R7+HOgvTj^k41e>xPjxx8b5EJ{b1|jRnh3IaQ>7fb-Cy15ec6Ze8lWWAK zuB@@GWVJF~3fb6Vh^JR7(?w7_GMHJ29$HP8u0z*r>?qZu?^!abZ1D_Qs7Txh?pD(+ zCmOHmQs1gzx@>T^n66}{GF>zB9Zcu9T$(QS+_L}6bl<}w%5=(b&w|=wIDe&q`8IU4 z7;fq^Ww>!@tqixHsuT?O#B$Nf&Ejke-W6lqtfkM}E3u|&XA6lU7pJAra)^rBJql#l zF++!7OTm`dT- zUs7C9MbQ36`C}FcL&{1OhH>Cue05(GuFZPyi@X%pw8vpe6Qx6FBh| zz4JOYoXZT->@-+<3VV;dNK=yoU_)~@S^8-WIAWE!m%{2b91r`sv0s{qWpkDbOXg`I zG{sD`tSC}If?qsgb^IIP8+q{l8zQq8YZ-M6A|4F>G)wTGSSAkjVr|uUrk8Gs)2qPf;hAv!(6 zB4gK3L4hkCSwfxu6+zSulZJu^s4tnD6?MZAn!1Xl*16RC0pdI6ctxBLsfiE6WXiJt zfKpo)jyY-;lUKa;Wd#>!9$^tR42ED&{U0El}%urHH14?_RQ0Vd5GJ>9(-~t$1%p9-5#}{jg0C~dkxj*a(5JMhi zbw<4AwXIvp!jn}G*mg@9K|@Wjj|hyiiA1mluLaoq+}SQ##qGomF8u2|;_hRtPJ^?Q zM9AV`S_5FRO>2OBqzIWj3dN5q+(s^vAE%j>9tu)TUkF#0X@}TJ!HyYH!A|kknDT<+ z|31yE7K%lWGgnO;iixsJEXCVYxGeWDeOtFk9DW?}He*pm(*#@M?YY-QNMBYrB@9%Q zjdpVbOifwajf|jXSJ-tgL+5LBeW1%MVmGI2aG=QU%W8EQu@E~JyYN_pw#Z}h8c%lU z>tuP2oB#ScL0$)!T}Lkz=limn4Q{{$6tvbE{bs~Dnb13t?qyT!$h0qh~$& z2$AR`!toYtiEnv&Z~fah#pQu4u2BPs3ySrP32M|0TS6FkgWY)620KKduVA|kU6BK? z=~*bE=QEc`OJhzJATrZf-RwKC8bvI&nr@rt!3Umds>*^HD5I#AKX?F()mZP`zs(|Q zfUd62qiCn{;f6XULc#0=?_r1NKS5Udotl2~1N0?CAGpLbh#KsEph2!~kcNTu#*!oAeMFy-N?E$JWg}PjtR@d)5N$ZSlv!5i5nj7roDny zpf-O}Y@O5om2C+uP{y`iy!h-1*1Tp53lDn3(3}DuWUoOBMaUrbWO!IUV&E&9;>7Qz zmAzVS8~M_Gw)3xuErak-&zrg8t3fQm_R=e&@?aL{JKz;efvPpJ)v>jBMGPLy8nmto z2=P6*fNXrh{3n;ra)Ps2gG_+D!wQlo-mLtZl;XdQ`h_+da>b>=tYI+TYmvkCUdm## z{wreQQ05BWQ3j^UXZ|C^P*&eJ->;)Xj2psS_H%QUxkRV7wn(3Y=Fj5ZP}ZR8u9tPL zqzxAF!&n2K+?PG#(Jr?7{v&`Pu}>@zt%kBj!BxFtaX;2D&%8`xBg&yvGR!qEi={(Z zNBc{2EW&&bngzMyKGb1Pi^;>;Lq4r@m5eHZ(hL{OO5&wq=oxlLRnMe|oLsSY7(|po zrHBE!!W_oh+1tJNpop#uqzGHB1)}~imf%zLlJ3X;msCG?&J$k`XU$@MCs!aZFsY$w z3UY5PX;C)%UNVo(lcTTyvy>%Bi0HYZPdbYWDwLe$WIn_EB~Rp~V}*WkzHaQ!y+j_4 zSB(e#jCiBQxiEza?0pbp9bZ3`6c^Nt{>j<82&Suv{A-9z%Q));DJopr&XKd1I(G1V zumoBMT7NNT1dHvxnv8^CiZa_MVdiNxD~>KJYpco#!Zg7qA}AkVJ+dfbAvtIJ?Gdac zvptqyR`mQ_S-7o)3^mLoX&SXxbjz%sFJ_Ho?R@6Xm5Zh@ae5@H?7QT7y)X#lkbx4G z=tr4)nSO5AFyrQmpi!*1ZOc3{bQEh+!$lJik>fqRzdHjqB<&b&qNDc=Rk;b`x64USh1LcpjMJ@yxmBla)2+o-Jq|y~YSt ze(+JM;4wrz$N!?p9nFRYT4B9j6gNh*tU$cPMk-6XW3xs3NvxK5Z47H4whwHvrT_qgpb92iyqGl_gL1{|J<{x>;%sgFN|d|{=d&s z*O#6X8^&Uc_~{u0QC?@{KtHgT!P)9kCNx9LU>0-7>`2j#N8jlEAgc6m~W8X<{WZcw@ASQ zL3`PJo^XSE6VE;4ag2+i-FSAt!8Ryc zalVvEidp7M1vBJ)X;88>pxgnS?kyIPNEY&k-T@^F?|kV%)`Rnm>s={{q#JmOR*TZ6_UNGaL04a}1_J_ehOvQo#I zW2B0gpgQ7w=M*&)3x7sT&twfEQz>oHskKv~cRzRj)L7ZBUrda7IJ>;k33~L(_FJYX z&16v_H)OmXHJ3d{jpZF2CYnxW{oAgGaB{KT&2YEeV?K;{#~?!+=;_oY)GKVAd@&6V z^@Kh;gu?tnH)u8Y+49?Rwk^}d`N`O`n?Ft1r?3un+?1qq%J1GhaNDQJG%<1tYshRO zZwh;;-f74$yUUVpu9^&)GOSypf7H)SQ^dt7s00g0QC#Ot5rI=7tbdkhJC#MpJS5?l z%{QkheBCK@mO1j01_f<@VJd6KeCAF?bx*Ll9Jq_!FUCRlJ6Fu4dsa!dTAA{RlYkUz zJ?Bs=UdYQmD7JLB)$xy%3@@0Wnc~@LEIOz`rthi>}a*h9w29_X2bCwxuaD|j)*{% z%YGcicuSQHfq;jgoMQJg%-?Zj67nvJO7@R4#23%7=GjFxWrCNzQG@&r##?-4*Xmum z>|i{hl~u`|R~gR(x{r3H8HzC&H-?Smf$F8PD7?Y9PflD0q2sc`PEB{`_szgMa;MF| zl3^ZzS$pSB4K|OXr?!f}$+)Ug_iR~wD&1BCokC-@%4G7&qagFqjcQXut$oN}k_i5t0 zS!|na;b^h&dDcI4DMd3#!rkn9Y^PCC=s$@_QmPMuYw3-F@@S%L2@Ru}k6Lr=M3~b8 zkVYAi`2ur3v4kKngLyAQen~WM(3iZf@w7QRHP1fhZ%@{E+M|7{cizbOKJ$Lf8kUkb z1Ob89w|e%@A6E+6Qlfpxz5k-GJHKgRaUi{^Coa6eLTe?C0kfmsnv{?!i_g=Y>-qqp zZ{{fxoXti>?ilUy^s-W5HwhpLn?7U2qHH#De4-+$SH{F+*4HGbaCSo-jIk&~hpt@xRDrH z59j#}Rv-u7-s^_1rW0_FKkbQeFc;OXl%%Sd^FQ&sLSV6{8CAOP$Mu9p% z^t4GDsaw(%EO((RY>SwlBE=};0gCw5q6djjOV`Ue+HYnT8Kru#>rNNq$JwlQY+cGI zDYBFlq;E7SZbE*gTi37whAJ03R?)9D9+)WXDTx)UQe;1en^ALf^)|{-gp{u>yb8z#FoK99y2&Y<~ubZlO}~ zoPC9!^qJ#fSq<>$%)Gkv(DJ-nL33U71$UxnAF|WGA+B!Y7G)6AJmvQv(R1bZ!@tp^ zopLWD_lV37RYJy&AXid{QmI{j==)`a@N9W2%S1D!ObJVlEMpg%UxQd!ku2s%6=9JoI)u6=4JY;0 zgS3P?1C%*W&Vpp*Y?Hc}2dPNIlXyHxJ|P@#n8^|pTJ>kL%4PMyZ=ccP=3G|KwqQI> zVb2N@9fFp<8B5Iall#nW2;%`JvY@D2_0b!gd|HVMAEv~G!f&$wX7Nxdu8}D_q8}G&BCCN;g==KeTs`kg9wO&`RaOx>l~GYG zAMc(9<}&|r=STrWZv0TfX-~pcwWxMF-FeCzmRnpsC6jWWP9VYzYI+R)BQJMz=Pi>D zk)pCiyC>DiscUz zt@Buu?DPlG3EHc%=27te|FT+baPUUGnM?@}gHgZ!&z_p(l-vv5&5I;acTzQ)wxoEo zhG;g^b`^hBw)$8&NVYWJM??Kf03zxY%Z!M1T)nqhyllXm*AU zq7)BIle1>qwjshlpEdBmLPHtivfC3f)NLb%h@tr`u39{rl{wdLt{xkwMDgA;5XNK;(C2e^FpMrE}cZUM*84};X9Ur=}sbgAYj%1w;8}{ z5B*z}M$xUoBKB3(mC1uepI2FjfM1kIvOt)Jj@)xn1;UN+d`cPSWS@|}liNZxJq2QxzhEyJz>8 zfoJ{=V!G=D&_oUTt)Dpe8r~JIN#RDbo+*8WgR_hdX^(q64gU)twif4SqtBk1^pzuaM0FY{FE%bVS+ z)24t3{`;3ZcJ?B${^gF7Fil?M%Xqy>|8hrO4?gE!ySBp-$YsBr&=_d*UT@mH!BdAV zaaHlBJM09*G$d^(zjd#1m1W>swEI5t4bM%5%imG(pRD|3KK-cZzZ5?+(BfgSekp5S zgS#o1D$D6FmVtkofA$hrma?WvzB)mNz+-YduA~@?qVjp^4HbHF@p#D`AlYLX^^GiR zW{*B1?F|-Lry*KXpmvtV(38K9ce8`*j)OiWq9 zift<&-9CIJ3um_aJ;bxC@Qg@wideo1<6dBQQMih^Y=3pz{=+IZn%NwWh%RrlCv6M5 zi8XJt7oA@{jGfJW@yNIC3Ac*7?90J@7jxgkqVqe<74a^Rv|x{N=WWdaNy@ly5~-}# zN)c1uVe@TYC5t=nuo6A6THF3k5q|GM_peh#qxV>?@a^a?RSvK0uko~o$4uxchQ7z1v6Xff@%v!n zlJ{80_8;~jMGsO@Y7GZcCBI7@%d0e}6!KR=cdAuE^XO+e$p?GkJUWLZiHtSaI2z{` zO+I1$ZT)(Q-`B7R{~4VXeshutd>_C6Fu&*a8Smp=W7~!v;>EQ9RPQ0KtYr;r7op3^ zdsD$Sc{f?HIIs@}#o&~2_Y=)i-9^GWyt3D=tLU|kW!ro@h|kusNudY89NN+vv<(89 zB5qPg@#qI^z3uJx;_e3+nwEDG(d+T@_^a(i(t7xBYCAD_J&U&`bQ1aN*$7+h)}mxR z{QE-(QDXx;XG`uPu5MtWcX(T}Z}~H$*ky}?R%-EGvjZV%Z$!U%e9&|QWOl`$viZi6 zZc3wTZN-_5Y?W@;I7#gVhDWpGQ7Vci?=rZu72vX$ty1wNeB zM!dL%^|1ZgLA?A0+lLphUj7K(*_SLPeaTM5KBTOASDwwHK#x~2#-d{D`}M_}bLt+@pf+VvpVgt{>?8($gYEn{vFjTa z&k{xPH*7##sjOFIr#Qv-H=OZ+Zk6MRxr_$G+wzGW*}o9z+j*kGHh6$SaBeBhYBBp;V_2q)Or=D27mBoZ_m)EimSVATtMx5UYTeplB?Y6P!Y-S_z$u>4Id`A;% z?R8)^Piv?QD=O!i0wZ7CUER#OFKl z>c{37acw6Hv&GgGm3FaLZRaAyl3lE)ZC`D1VHcZbbJyEG;8XSr>%9xTsu)3Q2=?z0 zln2!Rh#;emXugNNX?xcxPV8Z=Y|Cp3wwHCWJrO0k??r8I6(yeD%W6l2!k+&YM){Fq z^lCKqXht0!NA?gEM_<-}?D9Cu3Q=*?G*ZRUs3;XjbE~U3I$cx6(d*Te4Lek) z^MA$B$6?f?3+B)oDvkz*({;r-O0KEm2*1Z8<7k0P#Zg*KqV~qo_d!b3i@_?6OlVvd zM}vbEl0%<=jiWcECJ)5XHIKL`T{7XMSd% zGM{!;JmThMHYB_%aX75i{<^zFK3I?5VfB3i4ct5W9ZzGuSSn`y&LWzGdG6Dwj++DWb%tK~9j@aC>dX&qFs`R- zaPco#e3lYqxlQc=*8e3%|2O+q65vRm?uIHM=d&7PFJK;kU%fD{Q6h z^BW@RDvS1Mf|~=QuCjM+{XD||8hf+1{U4He5HDgK`R_Nl{<$O7u}(5#L2uT>pR!5D z^czZr&r1dV3GP+4AveTpf3Q;9f!pHh9oE2k=PvMhGwn%puV&Ry`u}FmyDg5Fu*R+` ze^O)lCd4DR@fDqdy z1gQ<9JaLQ8ayR!84e9~V7*YH?UY`5-mNM1y5@o8>e<)LRx+YC!%ex`|`iqUW-S|rk zx`8L>w*4h7He>;D{a+RvN5*(?TDBA*ljD!~Q7ULSimVO|JD~gJYr`=GOa5R5wv$)4 z*S*C$Fk9_wBKOeI<^^|X!BR?&)5uAv%_K8oi4ziaP(GF*MX_dlOc z?mFkY)?RzzPbi9n}mJl}XtyzMk) zdbV&VjoYrhYvI{qApk zT&&{{O413hlVgmA2R^3&6>L^ni1cR7Y91kif@Ly1)8&f}`mTQRK#hs5IBy z_zXUxSd4b(uLoJL$YRh!;$2yyi;k}^i97Cm5?_B_jIP2XdF1(mg;n@IQ~QaRU?uL> zVntBC1uzYu3Oy>3V+k%D3kg#dwgiQt3Ttyw%=X|r`6uTJ5}x9{O?>1}BFmFEtKT^#^gg8VvFNNm#u20A8n9yz0d#gk88Gvkozy zX*#O?jLfUxN9=eLcgNNdA9=4hC!)OhD&F{qg3r8p7Zd;OjLLh?Ihl93`?<2b=bu-3 z@B9%>BnKbkxFiDoc;g4&tVh_E`R~K{ zu3C00T1dV|)%fhMu!1(k%z>E0?UI-i$fN85Ifw7zp0%SZT!oECj$W|U@f8Z*{XX_K z72&f79g>ec^iMW@mfZT>>!($`98M<{cVVLR)Gih(AXu%4niTgwIv3(~+yJ z(_@a)XUKpE5+0z0C!Fq{-CoOIKO@<)Ca>d^@{UBFIrK0K%cRugth?RqXfD}xw;Uo@ zwTq%gRG-?5r_MXEJ5Vga@$ns{RX()7UIVUF*4&XbhF;;Aqbu_0nMLCGC;c$I5VpL^*<)^ZcXe~3BA#q5hnQ)TAA&Ij7Ovge$yUuz6 zyi##5gL>jfRh0ENV%fXg3i$WF<27wXJF)_Cs%wXO^Xq*O!OEKc<<@LP8_@w8tF1Xo z)`ac`KP#11%HRmMgHiS8{P7nKYRn4AH;EGC!Yf=YiK~wbF)Bq z4ov5rfWoUD-Co{1ly?sM_mKlC7!>+{8MFWutqkJj2KBFC(0S@o;R|KZixmw@x8sVu zu?dzvImX0EL*y7EYhsDgRH=8Ee!|FpHu@JG0zZ9I76L0WYhGd$@3?%o~e4 zLA*Mu;_01uLazrknW6tbWeAg1dELr099W*=FX$o5sy?k^h8eh^{I)_v#okD6f5@`a zs2b;Dz!IgbQi&HKWR(H45rsyH(I@C0Xh=l^E&(quF)n0*|H%Nm4E~)3E*|&?13o@( z7~ocJz`$|?enH1r?tzL1WM~7n!V|6@u&dS==VHJTrL3|CkX(BJt-Y79oi^d97}(?DfqyXI_E%*dC^ukW zxdFeRTP*iLMFTRl0bAjTiXO1L49ZQ)t&k()LZ$H^N5mZ{jH-`G=-RY9PQpjJN%Yay z$Pw`j@Up?^8ZO8kwN7$1C;wg4`N_G>oG-4#9 zEq%>s4Kqv|kt_rw!9r}7_SqRF?Z=y3Vn-1CZG@PbnNl>Sp9xP44oE#e(q$zTO zcn7@{#iFeJ3^K%+k-d!zD*Rz+KrB`a$MJw~l6C@P=OO9*iZ1Cfe4)hMzuJMN z5}w>GY_YN@c6JrMaQzqox9(Zr*t=)_*gflB*5Aq5;U6Qfl>d|J?zq>X##zkKkG*aO|&pw#^xFNdgxgA9?QpL`J!7mf2r-aN9AQq zK5foOh6k%9yB~)GaAyFo<-U=OgxLG|3KC&U?f}GpEVgOml^w_P-wH=K@80Yt`W0j? z-xg92;6veDG|6?_>B%HE{9|vl2gMGewdHnUi{RDy^C!jR2wu-rU95@VwS%)M&~U?u z9$v>dzW$QZx461poQ>dh_^E%1zaw~CzrYGY(T?Z86v?%C_?Y@AF*ThINJRIRD8d&W zko(zg$#Od#OTnUtdRE7LI)j`3EuDJJ;fd?=J5S`c8Ml_fQi`L6K~+-7CwPu`NNzY; zcwC&S#Usu8zbzHxpEg5HJnb+=oo0RM2p8$Kd410bs}q#uH;T`LuM{m~~2eBocJ!0v_Gg`Dh=E%ahHKZSc9#_^l z=kq5uetJS_yn0A!jJ|xt(75kV1sArXX+gOQ@vYhMaE|AnYDjSOJfwU$0I4hZu)!he z!-z;y3U`IV$TA-;kQWynZenvi9?q{G5y$KCsF0#hDW@RcPKGz|QEBEFbVPX&9ioiE z=SCEg80}ocYaTyJH>gjn(@r+}Pf>3i)B=vb_Ng-jtp2EC0reUSgR(jrdB{DUN3f6G zHN^fpru`CvDE_qQb(a`F@8el+2Fahw&v; z-i%NGQdzcff2r_pXsXwGwR9Xc$&CFN<+7(och8<4ygs}rsdlYtm03NB z^{TFBKSzY<-H12yYD(1sef40QSi8_v+r-4SMm#$3N4Sy7@8ReP7KwbZPh4-rtsU>K zC0~WecSdObQAfKT&A8O@pFI%9y9;(JT zyD(!vx?Duuei<+)z7X+EcmsZMw;0-l*9+~CM;-rdL{_V|7;cRZM`wN^RyW}d{raJP zp#pnp=!;129TaDq;BM-!ed19QK8|?-TSJIQ{jtPfvbv2&^qp6c40P_IB;{(4>JRYbF=s?AFas95v!72=oy*3D^O zcJ(4lR<|}RkuS;yp(vtbEMA!Jct{!(UaO)pGiB#fX3S;PWZLQuEqAB*E|xcK`hoPr zMaRlr$OwKl#*W?O9*iA;Y3%s2+ho)AN!vxMIG)6>6pATvyh+~=Nf#C50<5IU$##Ez zB~^}F`Lsg4#r+7Tmc4Qnfd>MW-$Je17s;pz4G?L~d5y-c$SBM>s6kDY&T(J$&x#io z;9IA>ZBP-}t5XCb1?~d8xKb=`&I3%x#g2Gh-DD95oAa(gJt_z;+93tSawX_51%0yN z#4=ld5tmx<8e()jj|e&nUl@6KsHCAQWYUn6%Uz3YrD}8+$K#P_`w9tXqGn;-mSr+w z=$HST(7s3XZo#_*?WMx&Vm;n2Q+_Q}%4AH1DtlUH`PXjoJyQC_RY*B;yNGVdV?t(c zgSLf1U0NU|ob7i=elg(o4jNG+%{BI^(WBu53O?}VP?SUEm`E*lVNh~&BcbeBGI!8$ z7bYIGXNNjkpMCf-Tl^@8tz4A>trd(*otaEEVGX?yGklOlL0GR6l6 zscGY38df0J92Wsm|AwuT7>2QBklrkPdhJpwUC`Tc_^J!NV6MNY|LZ={t~HMg?hSoe z4lLcOqC!GmpidxPbez~AGFqc^{bLKhe#*o6t{tMV84s(5DxdLc(&o;AtU8A8e7m8F;tKGlOz$MLmM7y$s!CjVBH@~?*C%Dc%==GvW(GiqI$PK zXS-P4hBxH*Hi#3T0jHW!s)JFPNTcTZ^+eUSyiw4}W{QzV3>wiLj*m;lkP)T^flD>3 zkXRnX`siaZyDe`RI8<|riPMTWV?Gw2ffF!Lb7&Q|U-m>zg%kM%*3%3tF?=aW$u`lx z9h5z2sw_w(4hBEw*ttziBhDJlv6U&yz~_I7b3k)4i6dvIEw_mW#MzN2n3XpC2yHcMYJ%L$ zhp!r|&Ru=cbjbVEcBW!)?0+0Hw~LbYURKjt6-cQ5OUW^jTrA7^KgoOoL&xj z3vNOmkbrSw-FyTD7U&h;&Bds|94jDF*7^R8;Ho@O1g*yfwaD#MT`og0<$c~APpg46L`9&j{UPvWclMTa$Xf2}C!#OwMLp^t>whvWm-I^sqr z-qAO+B6j*i(Y7~c>byz`dN|Il7lGY)9B;W< zBzNPrnzTSnl2R;^=q+C;LvUSn++I=Ylrt`x%q|Q{i9&Ro$fFS__$hh~_&<(E8}%r2 zmTX1GM`IP)k>L0NuB?#wN*yE~mM0!}<8}GUjWkjvh!>Kv+v3xe_>?4%Y_NZIxeCWZ z6sl+T1T0P7igEaDmH|PxXKpy&*dS_j=PjcSP$VO`10Z?*m%rf^nC;dsU6(f7p-B&@ao&F5wcynM5s=+nYfyW>!5Pug}z9Lh|e&-naiu&#(0$06g-xZ8OhhX&n_j?gYJf_Fiut9v01W8oP37Y@=YUe(9^gd z&<)N0P&|Bw*XjQbJdou`&aO5uDM^-}UdY|Aoq_v?8BzM(k}A|zu-rL9)|q#6#ZRfcr)Sq( zGU%dX`ce_o2gB88?~B2G_(a%ox)1MRuayIjW#b>bb~hn6s#Mx1zj+b)5$*D-W07tJ zatUmbrRy9uidr{n03T1Le>OD;?xVY=ze*VBFpNAy3{&~U-l1i2Jibe|@m(g^Y zN`t){b9}s9R6MF%eK_~T9#Gp0o|@HOQ(H)vnH{P>1L{93{@uC=U4}~(3zjZp)n7~ zbe(tu66;s5vK}NKqkk_%{{dKp_v0t{p9{qGe*CSPU1gl%lN>j{Ew?!tj`njjDwz2k zuVM-u0X_1$3_j)hu8LdqFVFMV{AD42e4f9?&n^^Q`}3u~9l^%dv76u1r1Q@<;(CAH z?WwKQZQx&7PZX^OVB=Y^l);U7pMs$S_>n5%?;?bT!1x=W_wZMYKPuov{FN4j+xUGi z`#Tsc4kJu`QM5dCntM=z!_XVPgYm(Met01Um&M5EpZ><7b&tcCR133_!-xy|`xL!@ zf9M#ozts6W{$9jiJN&(hzdk)jzVSxd%Og9Eo7|9GHmFyu=p1LRFFt#X$AwzZ?MC1) z3V$*9OT=F){<;b8vAnnaF}z%gL`CCEogtXn`pqqMCK7$S)Hwju3OWWf5i}Dt2Xr@R zF=#Pp{=8DBAAL+JtJE0{Y6Wcvnhu&y*YiuAg;+q@5HxwX&IH{JS_JBNirHD}f>LK7 zW-#fXF`${Cok8{d59)`n|73zjf#!fFfaZaw zfaZhRKnp=TW8spDK+LFyJqb3P%mX7GbQNeOXg+8T=uyx-(6gZVptnE^K^aO^1e!sL z5RmIZ6VV?80#5~vrV@j;1I+|Y13rA})N7y_CKYCTixTnd{01F8lz|13OF6B(T=b&dkH z{!;2Z2x=>aehe&`zm_`f{cw_Z1&Xi`$p_tp>%^<2&Ujp>f+mC7KnH`SgQkOKg3bob z0lf!#=76gspyxJXrxr5&qtv+-H1Q7fS|Rsu7zUbu4~Bu-{)YZYRAp(Y-FXFyikzj+ zGXN4zPUiz$r-Fvm#x=HKj{%MGa5_(d7J@eRgCb9-a};PH=rqtG&>YYbP&Z6sim*R? zD_w&g2eo=RomW6(Ku3XJ0=fw_-D1aou)(`^IoR{w7*i)3_T1lVgp$<6OMQ(YfY(4a zp-S>WqfrG#ps8?udM&539j*&O=Yd-B;>2F6B2WitG3YWBBpvT$EQR5=I!>n-49Ed} zK!)HQk!0kDBv1&a|it*yq z6);NL!m>cLf4sZ(0JyEa(>VawIUUe-U{W2^83u!vba6V*fF^cB3BgZ)2I)x-?`6gZ zf!`Zdh`E1GKe!w;^?6hYXdYffP6xjTuW}a#q5YQ(fyLD!U_(_vpkxFxiiXQyLKT3r zQFwy_{FpKD0LhJWI&XpIr=v=+?)Q7$>9m0sy@9%heEI~)(e*?a2%0k)hBQF>DKG>y z9h*7*u!yp~1y3|U`_DuS3h+o)??vn;36ikM*8 zPG=FWGZ!EOikTc#6{z15r!x;U^F0`j81h>V9P+6voX)d!y$b1@paAc~19mWqR-*&} za`IpiXd!4JXfbGDQwXlb#2M7O4j!Rv(4(Mrk^b8dU^f9R4b`$`3{&uI`84?e{d}Ivj2RZ=M3R<%j zO1Kk(poM!7jC8#Z%`^ceIplOs1}#2i0bi0!{q^8G@e!8r2ef z&;-z8&~~^HUh*UA9Mtb8R4J(KXLuC+9ME|r2bvFRwf}+-CYB2W*MlwCr` zxVC|w1T6$DrUbttV<;>J?TmCqmr)W*e-$MI%?FKchbp-a4}oUhK&t@F1HAy64_X3R z3>xw@WA5xG>Pj@2$m_f3zk=>tJU5Zo2|fN6PGN;{_~B$Q{_@4*i9DeC*6F3rV9i7P zu-W+AJ6+tK#GAVB#rYZW`$XQz^gx78;>|*r*-M=rNxHL7%v(MljFdGt!FG{0i3jit zc1qY#!HGd2L2kqu$d!1}q!wF8#wB9{s*#YJueuw-EFDhuh3$-vIcmidk?%Xk66B7hY$ z&I5K*36{z226o&9I}Yq9uxb@Dxd5!t1;ZONRAx6fR3KOtZ3+Pvg;`!jUo-|rGeX}A zY7>Fg1cm`$9^{{Xz@mYnqc6io0gDF~Rsov^3^PlACwhf4!5n~t#f~XF!t|*qn!*D; z2Ou1uMhLh~6}PAGDb+F%9&giiwHQ%t37%QyOywTcs6wU_dbgSQU@EU0w;m`3H=QfKt zN9VV2o?{W7Z}B*L6m(DizOs`OfVurx8A~A>TreB3$C&?Bte^~Fw3DnNHV@dn3Rp5! ztpb*4af$^TsFgC}<>RF0Bdkrzc+ZycPJ(9zFN%06)V#s# z@;TXBgE_#A2h%V%88VN7<@k%ScHYsGu9H!-S1MdD#dSge@w?V2#`yxgBr01Ff`<&a z2W+ylRD5gaK~?-bQNjRKm5DfCrO(rGelkGx$V9c~;rwxc*#8#q+VmFA6EVMp4e}rl zF=%fG%xHJffC7Pe1dH35yk3<=oO{(2VKewkPi@6{UL?AGac35f5F2OkplS|a_v&HF zh$rw)!K1{@89X*T8HWi0a^zGV+}D{iKplCn&P>cJh;j-l8Y0)X7L_X95|od zQmm%)1aGw9*5dXo-m(gAJaA?oEOoXb&RxlA;d>Hb<{_-NF(SC#jH2>& z@wLKe&q=okSGZR-jl&gm#+{@?R?GvB@Bcb#(QfD`k zJ6%WAU&vqdp`}ebEPs0tXctu$@h0N%Lf+bEHW(qNv~(R}yyW`;*gasOWcIPzV(KFP zv@fk~j-M`devD@5cA&PZ+MgGpEX%-&x_~u3>8@HwG@Fg~)Zrcenok0Tv3oz4I$t4< z5c}VO$bw^HX^3WEA#XAZ9yZNvE};8(7dI=>^_8Oc~jAHR-1AxS>g z&OV8=+!mSN;hjY9#R#ZAn|MTxPE8rD6&U7t>?D#FVr{;Ml5UR_Ls#*zdLw+Ikro=H z9ytzD$a`Tvmw3I@If=^ib|lqtUEbA=qCL#NF$8Fhm11_Pad)clT*7Pn%mFJ>-f1;rps2*dnr%yy$5hvINp9ITMDdV%~IHsfJsRp*77L?zGD^N z&PE^UT*^azr-4%xt#!PtbN`1>3p3SHHgv1cN#ET zn$sCTwQw_>+ErbVvK%#61Wx0TPUp)ceIQ&+UC!(Jx?vtU>LsUhIEjA{F19b{Nu&G0 zx&dH}Ks2|emb)Fbh(TF~u{Fsjx|>fvpXI*D?H%)6O!3Pj95cNxV415`sSG9ogidOW z`Ow>Vw9`3P#*Y}gf;aSW01GTBb$&^f<%$g}FqpKn!qKmZDJyw<5wnuJ`OF6380&Pt zM?ynI$CW(J=P0mI8j)<2> z6n@VF+bw=t$?MozJ;p9%Vr@!HBpZ!nF*uzZiKIw&66bF3AZW@u1=S<)H_O|%6*39< z+ln+c+$0%CX~wBENwOoEWnKiQp-X{3(IHsJ80W!Ve2|*D5(g45MdB<<+(`_fo@9Il zmm*;o%&4VobZs8k6K@G%A;3j4(<8 zJIIP6StGD1>F{%>TP|#~~j$5jO~=H$uglRlG*s^d}rgj_^R7j4(uZDN*~A zqGUxfM0Z0}S}_aF=Kt_9$xnv7+axVN{C~@Df_y)cx0BhO{&#}2NU+|>pw9o6_ds*F zXULoXySyC{Xr&S)AVFu`^;1!Wmi0eMJPPtl4f)UixBN25UoqrAD3hm7N3}lJusx0h z@o(x7n-%hZ$D;?D{A>uz*3&mcMZuHJCxxmOqGuqwoIGDAg!=0`rl~Y!2a42n++B9+ z%ODhmd!JJ1TJV!XvUx)&146P9YzhAF7N#Pr==$(4?xL=tY^O?%QKn91*?K)y6Sa^7 zfo|ds?iPv3>$smi8Q5-MZb(E&ApQme%LnEz5%oizVg~T!9A~9<_dH;off=$Sw+dJy zFheI{`M}x%!%|fqgdJ_n8nFa`UKK#P6&nu>qlr9@d!J0sqo{Zxc9I{QUuM z7Iq7#*7wTuMgTL0Nmfdp=(?WQ4vWV5h`e%D#BT@8mM3O{-*g1dmwn`P_NR0>$fn7_ zu555R;dpsangzhvM)4ie*mvVR8aHU;i93MSw*ArftF%SnEr7lkh=+spT>*C11*7d` z>v0d)$b;m(nqgJ|41J9}*5fy`Ay%mf=;|C5+6pz3iw$zveKv4r0+J%zBG}O?%(ztU*|PacC27>gxqp+i)L0$qkq} zKrJgQn|U)I8#pylk-N#FI-=KROo=uDTMFz~!v63VVl!{zLp8VzxAtFG#rbYCkE=s> z$*ESWL6DAA{3W0U?;-ICk{jn=wwP?@y8xU_NZX0iUvn^{_7Q77;^Dp*z|O}l`e(@Q zV9mbt5pUG=B%&-IH|?#I2M!99Vqgb>84ZpC^d7Li+eDi!ymr-^Ef53S@PDu-<6cMt zE{<*!)3@+9?fAD0Kcc>WG}pN_l4ZHo*)@`Fb<4)^R}fKW$4GWA;uuzYYh!|b9M0Co zHZ8WX?_>Ml9?o{e1)WV}rE%^D(%7u#!SAK970vzb+t^3VKSFWNv3JLbs+0H0;p~S_)sGElw>tTLH;k?BT>Zo_cD!@^{o!nL7yrUx z?0~&X^}WN`Z(ZX59L~P%>YqQ1o$XqE(=ax(Tm0SO>~goDykYD?x3KJCY+bVV&uMIX z@-vJ*O!of4#@_B;{Tmy5zq{{I8~e6<^@BF{SNHhuhqH4%0=C=O?>&4!vavPKR9^>6 zo{2v_oPCtyzrw~2rc_^IV^>q+PYq|sdIs6&+t`JkVRLM3ZZGdl8_Vrgf*7CG-={E* zE$)xS*{1&0^5DMyrEu1cf!^6e*`a}!Swq>k11*n+u;PJ@zOu2sgZ%FfVJ8MzZVqAR z2Q@0Nv0X0&T^_=YzYun52>bU7-WP{3=L5uo-^>V+^QKY`89%>b7d1#)J&7_MGwRyj$Q0K5UM=|08dlHX!B8CD%K16!(6T>xLnV1xn5f78qH{R zB>)RneeI(i^@+a5%?EkZ>@QZF0+>y-4kP)uy*}Lo3D9O zQ?hvFYhEkTwo8c{Ger-YA>*J~799h`W{C0QLY(-TM_5+nD)=w8f@ZCEjW7DcRN(lQ zhj`X)c~3FBYWlpUAv$VI(3&p1&*8CTzDPQUUB9X4xrazT$4B9T=8kiG4QGFgXV3HY z;4ePU`-c^kDviaOmT1bHx#NqPazCetyMWi!@@Qg$BVW@ZO-sc13%r>rQLMdy7|x^+ z>&@}MoWp+R8^qb4xt}QdnR~<*X**S3=&*6ZvAM};0|wp-CngrglEqWMKy9jM{R^LD zS|xVSRld0N3l9!GzNKad8G^h*R?ZWP^*$>2G zV#mvSN2Ey|<1{-%9FeJA*zaog6>$gbqS=Eb@8De1+3JCpxOjIJU6B z9hJ+_K%`wl0NE~a56c15;8ysgF)T<~5RPj$i52yYBUqg)snI>Brg{B5!JGHPsvW*>E7Z_{|O3tp&k zw@)gU8~~it_Qu{TadgBTs1dC>OTsn=EXyxC61Ic`j_D_h06MU(o6{x!^a1 z=^AyJ*SLrMxC_r163)8d#*pA}!CM+*feUVo5gz+0J7Tbw4^g z>~5E2W3{?s7ks8Jjh`@GM`;rGSN4c8w9j_IGog-pc3U?kPxn&jxUKR0XB1vf!Hib^ zRLb2hdW`5etMKxsHo;qEP^=Yo)`~na!=#L3Qd9=iIOs5{jvc66fSI~V8@u4EwVrgX zhwkJs_9||6`l<{{=$SnZqXb61rno5jK+9WuEBQJy6=Ozy7rMwBGmHyj#tk_9o(sDk z-Oqueybe|_M{D3F+=+dl*ECWLk}qrdOc!}$#9ZovPto%I6kZ-a3q|Bj9vt_%%*Tfr zE1!nCICnI@U$2O;be2bbix_>AMP*}xzn|}EZ|hW^al!{{dRPGr{#~k$Oi=}d9_eMBQqQ* z42CWNF6CjVP6qj~Yh#o_cmgSp=YUhj#!?2cFAv(iARYc#T^st7a1V>{LXAsLQzPFF zh6$U-j7679hP#*&_hCQjjE(i=U9BizFRhF!OA8@Ap)BF&%AR}81(#8eOfrFEj_kwm zVv)?#VC<6#LRj&6g&VH+3{{32_X`ZX7jPTgz^($4%Y~ z@MWoENe=~qK7zp@MaJ^kP_#W@bfTP>yN8y##$#<{>rQO>)S`+=LeYik9kRkbo!8{86guauRj+*uFc{=oD4sZ>VW z7_ag4VCBCIEk8%&jCM`oXrjza>s&87UjLKxWHf7C2p)cW(QQp;^itYn=WHt;A9)Suf#j*RIlfz`2=_WSf^sosod!i7#-=2 zR4Q9@1sLsj1#rs6Z;?`Oc;i6sDeqv@HTq5SYOG{RN|g+4Q=%gkI9U=CpmfeqFdMGr z@lOFHLK}+cH~^f=o8nSl_uL&(!QGqV_PF%9OA~+5z#A(y^bD1bb--m@qQ9c!vixQ2 z9BDIE%{}EA9NM<2E_Jv{yGG0OC9Y`_{l@OnG9|i68C}Rxjc3vZJ{-oV_?t`{o;xEb zIFvqmLN*s`n`tj69kYpRIw60Z^qZC(LuC(S$$A!oF-0CP04EK$PRc@h=1RwOjWgZe zyD6CEX&nF8T_T2_A9Isx2iyPB+(gYqvy?~eSmi6`rE-bTxr_r&xwF0s(0AmR(0GnT z$s0b|tZ~0dO8%PG^8;`TW4WhI7Ly}4(ks~XRIbH4IJ_ZdvQodEL&BxlC8)VMGh%)N|6$g1WETu3`sJ> z*fuyLldO73poivk3?m5)e2w+o!Wgf{i?x*1capUJOQ&}2hU>LZ1t`3%4DF)}Fc7!} zAwNp=d5qUfsEpQyiub&o2)GBQlF6p3sfOK5e@`<{){!YP+wN$NZ zfJ^J@2^=?1*{I_jJt7VdUE(w_DB~Qf0%#Kh9dmL`;lZZW@^=UQhW?->t-A9t28f4J zrdDnrRCo*eb)Vl#`#JP8oKbNTzgEQ^sy*VCyTdow-aJ8Zi?1q}Hf_=|9XQ#PZdL$o zJf~xefp=86UO%$$G+yY^1zpv+^`T0ip$Mzhnw%j6)jba9{uG4n!^_TQmYwZ3&g{47 z3^tXtQGTMW5_E*M(fG64Rt2;68ZWM?h%`A*F(oa;L^joE;r~}zYCng zB>78ag%KsZol&FB=nN96$CX5gQpnoprdfhbL*?%r`b}E}NveBxQDthhhHrpV-i3PT z+N3q`rmz%B}fwbDqJCzyL7}e6+2I}^XW|#93fiCVae`( z-e9*^Y~3NTKop8vjpL}2H(GZK;N+{EJxboF**C-~*cAG{X8ZlEit@ISVrLcmsjez@ zj2>8x7E>#C2m0dH^0z`Fp>65JR65XnYsEk?N+{IQ}6yP^>6l6#>zJ(>ZC$)9& z5jX9G){s}Kk{X&Dqf36+4sSgOWLw4pO}jxPZx3sWB{;3bW}l{+Ic*nJPUvcCwu zq|?XfzR^v~vD~DZ!S>EQs3ybk4zse=uqFk#tV!KH8F)T$va&=+is827TE6hQvip`c zztJPbbCMg9vE?HaPWKX&tR7Yt2Z)^Ef zJuc1A`tx#4=)X_O-%|P8KKBlK#YysaA^nDa(o>hkWu5&mamT|P9B%5R*f}m;ab4h6 zInV2md&d$SI~CVtT9FQkP;EjkaB3tuE{$X#r81qDzg2U0_*2;6H*{ccrKebTw=1-s zsZwSm{l=cvGI`&q^3%&NbTmW1F5R<8;e!;+`s5ygg;T(lq2*F(?`S-6s!Bz#2hp)X zruqupNK76RL#2vUghl73!NI-gH#D=4vM2E)#kA_Qt0ngn&CPqP zU?aFfa$~XLd`|wZqhDe5GFJ&ewDnWbY0O`*iAXPVGyJpMK3?Wv_hEf?tedhWU^*y? z$oDdb#NGpwJX7e>+=lm4J}LH5s_SSA-^d+bE7-J1{+^)U&|kG=j-Ku5yD!XJjQ2)I z((yT!fmJWPjcR*Yu~!)EUzI0}N#PaA#^-uZK?(L4Nisx|&`HlLmH0o6(yBq)!$*}A zc1=*45V6V$R`Q0Sqk*e{ohy@s3N4tUSAkV^+4o4c>5?LUD*b^2 zV2lj+W@3gfG8_y*t#g)1!1T2w;kSWP_Bk0Ud%e72UIT&4De2S3S$GD{sBIK}p}e22 zEtqFW*ngrkX!EO~B$jK5KY&wxrv9aJd0qRaIYORrt5XS1*La4;Q%e+JbWCS~lm5JM z3csXd|DnX0=;mj(ghsrelqMchLPm3&EKC;Ez#2)?4r-~ArAlhPHuVy4%A!b*M)NfO zZ!Mp>M9Htvc)(yKpYKxS24XSgma51CMfQj^0*|Y!pCt)*dr{eoEo)Mzu3y#zxQqbz zfjCo@F~98WQ{yc3XPl7}i+)$>jTu-QF~i>+96J!B9kGiKDz>rw5x`|#=^^GRU7$~7 zGSeT5gosN}V(O>JdPP2w#Pau0?WzH)wy`}gz+B&wcv@vduhG%*syGz@6|)t=hY)cU zy3eMpV&5yN6fOL>l4>Jj1CgeeB2y#@U7M!TX5^Hl2I(|L~&kwGZV63tFrsc?PI zi~XtC;Ukny#d_Ll^qpFL>vi*-;ODQe+Noe57bqt*b#!OBt=F`5}Ngj zy06jC<-W#wF@uC}Dd8Hz5^4??)kDqxv9F9)S(oTL^v1+%s>aiG*z4spZQu%pAB!|Q zbE5L&Ty3$tI0d$;jwG=iURBET^u4GVTB;v#@>HRYWO}EWjtMeZ=o-x~dZ=)E36zfe zN_j)EI1G8%71<`za20xLjLNFWXz3~m!=MAUd$re4qjI$AD(+BfnHa?0GT4Tz z9O*@GI)2u;pT1WgqF{Chxa_e$RPywKF&$0Cj2ck>oFr*8$115Dmw?y=oN_DCwi=ON zsO6bnR9mG^yh;q5Mzt7yyTP#Hip<8nl-N|Z&^RpGrC%SaltzcyLnPINj|OXY@it|( zG3@MA>@#4??pEI{GtBy3SdiLORh%NyNs`#-F|<-vc|R*%MxXsIaH+(l$~Vho;a_St z{uhok(a7Tha8*AZA}t)*L`f3ba=gkWX0yu1OA$6su{VQFx#j5*$yh|6P)cqo;wSEq z%BG6+kfi&V*HzNOeoCb=4P6SH3RdJYiM*rn;?I=4F?O^TeIlS7H!VS0h&Qxb^!mTk)HS4q&Q={bb?e}eY#BCM!nE%UV^Ao^UB4?BSTC zvQE@}YE`YZo=8J7(+iS>PSa93^_8pWMKn4-mu&YtV5_hU5|NQe)=HAtL6f!e?kc+& zU7gbm+-2pHt5ScZ$X!LE#12yVq9n14-c-f3o~Z1?Z-GLy?pO6$ z;KrodW)8nR7iEqLYTk-<>(puJ$jQS;re_SzNEWpk;u8U86WrK*%8=3v>2{BKkN{D?DihB}j`6TpY$r2KtkZN5~R}JNW*3F+3 zix-0%<6Enuu{rSR_$S!0F;C_n8}nptv9U42L3-*mF}Fh%q%<+Nt^Z^JW8mObL~&gv7Fb>~`-F&b zoy{Hvou`|-S^{2wHDl-g&CfL#n{)TH^Yv;yV&s^S86%bHFA4M4RYbySvkgsB!ndfn#S|#2WS+d65 z(o*(1iC&ft5I;f8V!U-?&}0#sXSU--jpcdfW>4AfDJ3>>D$m@?lBX{Xx<`brMOMbv zG`#ro>{@eIQ*W^xutjZx!SiW-H|DYUNx~CVzmTeFiU?f?=~Y`4Y|v2!1J}V2G`^oc zfF;Hzst{pWZ*KLJu@@>q^r6dSJt<8Vi`Sbw;EkG7AVGN=jp?FFK|{pXqV9+0MxI5r YRkxZuRSf#j+|qOSYIR-1L{5$PfAcAHg#Z8m delta 70469 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 diff --git a/private/racket-webview-qt.rkt b/private/racket-webview-qt.rkt index 4c4ed9d..fb3be7a 100644 --- a/private/racket-webview-qt.rkt +++ b/private/racket-webview-qt.rkt @@ -11,6 +11,7 @@ json racket/string racket/path + "utils.rkt" ) (provide rkt-wv @@ -268,6 +269,10 @@ (define-rktwebview rkt_webview_init (_fun -> _void)) +;RKTWEBVIEW_QT_EXPORT void rkt_webview_cleanup(); +(define-rktwebview rkt_webview_cleanup + (_fun -> _void)) + ;RKTWEBVIEW_QT_EXPORT rkt_wv_context_t rkt_webview_new_context(const char *boilerplate_js, ; const char *optional_server_cert_pem); (define-rktwebview rkt_webview_new_context @@ -392,20 +397,23 @@ ;; Initialize and start library ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define process-events #t) +(define process-events 'process) (define (stop-event-processing) - (set! process-events #f)) + (set! process-events 'stop) + (while (eq? process-events 'stop) + (sleep 0.001))) (define (start-event-processing) (thread (λ () (letrec ((f (λ () (rkt_webview_process_events 1) (sleep 0.001) - (if process-events + (if (eq? process-events 'process) (f) (begin (displayln "Stopping event processing") + (set! process-events 'stopped) 'done))))) (f))))) @@ -594,7 +602,9 @@ (handle (cdr kv))) (rkt-webview-close handle))) open-windows)) - (stop-event-processing)) + (stop-event-processing) + (rkt_webview_cleanup) + ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Cleanup on exit diff --git a/rktwebview_qt/main.cpp b/rktwebview_qt/main.cpp index 6555cad..5b6763d 100644 --- a/rktwebview_qt/main.cpp +++ b/rktwebview_qt/main.cpp @@ -20,67 +20,71 @@ int main(int argc, char *argv[]) _argc = argc; _argv = argv; - rkt_webview_init(); + int k = 0; + while(k < 2) { + rkt_webview_init(); - int context = rkt_webview_new_context("console.log('boilerplate!');", nullptr); + int context = rkt_webview_new_context("console.log('boilerplate!');", nullptr); - wv1 = rkt_webview_create(context, 0, eventCb); + wv1 = rkt_webview_create(context, 0, eventCb); - rkt_webview_move(wv1, 200, 300); - rkt_webview_resize(wv1, 800, 600); - rkt_webview_set_url(wv1, "https://wikipedia.org"); //"http://127.0.0.1:8083"); + rkt_webview_move(wv1, 200, 300); + rkt_webview_resize(wv1, 800, 600); + rkt_webview_set_url(wv1, "https://wikipedia.org"); //"http://127.0.0.1:8083"); - int i = 0; - while(i < 35) { - printf("Waiting...%d\n", i); - rkt_webview_process_events(1000); + k += 1; + int i = 0; + while(i < 10) { + printf("Waiting...%d\n", i); + rkt_webview_process_events(1000); - if (i == 6) { - rkt_webview_open_devtools(wv1); + if (i == 6) { + rkt_webview_open_devtools(wv1); + } + + if (i == 3) { + rkt_data_t *r = rkt_webview_call_js(wv1, "{ let a = 7 * 6; console.log('a = ' + a); return a; }"); + printf("rkt_js_result: %d: %s\n", r->data.js_result.result, r->data.js_result.value); + rkt_webview_free_data(r); + } + + if (i == 4) { + rkt_data_t *r = rkt_webview_call_js(wv1, "let el = document.getElementById('hi');el.value = '10';"); + printf("rkt_js_result: %d: %s\n", r->data.js_result.result, r->data.js_result.value); + rkt_webview_free_data(r); + } + + if (i == 6) { + //rkt_data_t *r = rkt_webview_call_js(wv1, "document.body.innerHTML = '

Hi!

'; return document.body.innerHTML;"); + //printf("rkt_js_result: %d: %s\n", r->data.js_result.result, r->data.js_result.value); + //rkt_webview_free_data(r); + } + + if (i == 7) { + result_t r = rkt_webview_message_box(wv1, "This is a title", "This is my message", "This is my submessage", rkt_messagetype_t::yes_no); + } + + + if (i == 10) { + wv2 = rkt_webview_create(context, wv1, eventCb); + rkt_webview_move(wv2, 400, 200); + rkt_webview_resize(wv2, 800, 600); + rkt_webview_set_url(wv2, "https://127.0.0.1"); + } + + if (i > 10) { + char buf[1000]; + sprintf(buf, "{ let obj = { e: 'test', i: %d }; window.rkt_send_event(obj); }", i); + rkt_webview_run_js(wv1, buf); + } + + if (i == 15) { + rkt_webview_close(wv2); + } + i += 1; } - if (i == 3) { - rkt_data_t *r = rkt_webview_call_js(wv1, "{ let a = 7 * 6; console.log('a = ' + a); return a; }"); - printf("rkt_js_result: %d: %s\n", r->data.js_result.result, r->data.js_result.value); - rkt_webview_free_data(r); - } - - if (i == 4) { - rkt_data_t *r = rkt_webview_call_js(wv1, "let el = document.getElementById('hi');el.value = '10';"); - printf("rkt_js_result: %d: %s\n", r->data.js_result.result, r->data.js_result.value); - rkt_webview_free_data(r); - } - - if (i == 6) { - //rkt_data_t *r = rkt_webview_call_js(wv1, "document.body.innerHTML = '

Hi!

'; return document.body.innerHTML;"); - //printf("rkt_js_result: %d: %s\n", r->data.js_result.result, r->data.js_result.value); - //rkt_webview_free_data(r); - } - - if (i == 7) { - result_t r = rkt_webview_message_box(wv1, "This is a title", "This is my message", "This is my submessage", rkt_messagetype_t::yes_no); - } - - - if (i == 10) { - wv2 = rkt_webview_create(context, wv1, eventCb); - rkt_webview_move(wv2, 400, 200); - rkt_webview_resize(wv2, 800, 600); - rkt_webview_set_url(wv2, "https://127.0.0.1"); - } - - if (i > 10) { - char buf[1000]; - sprintf(buf, "{ let obj = { e: 'test', i: %d }; window.rkt_send_event(obj); }", i); - rkt_webview_run_js(wv1, buf); - } - - if (i == 15) { - rkt_webview_close(wv2); - } - i += 1; + rkt_webview_close(wv1); + rkt_webview_cleanup(); } - - rkt_webview_close(wv2); - } diff --git a/rktwebview_qt/rktwebview.cpp b/rktwebview_qt/rktwebview.cpp index 3fe9146..c01240d 100644 --- a/rktwebview_qt/rktwebview.cpp +++ b/rktwebview_qt/rktwebview.cpp @@ -24,11 +24,55 @@ uint64_t current_ms() { Rktwebview_qt *handler = nullptr; +void rkt_webview_cleanup() +{ + if (handler != nullptr) { + + rkt_webview_process_events(100); + + //QTimer app_quit; + //QObject::connect(&app_quit, &QTimer::timeout, handler->app(), &QApplication::quit, Qt::ConnectionType::QueuedConnection); + + //app_quit.setSingleShot(true); + //app_quit.start(250); + + //handler->app()->exec(); + + //fprintf(stderr, "cleanup: handler = %p\n", handler); + + // TODO + // Do not delete the QApplication, although it will result in QThreadStorage warnings. + // If the app is deleted, QtWebEngineProfileBuilder->createProfile will memory corrupt. + //handler->deleteApp(); + + //delete handler; + //handler = nullptr; + + //fprintf(stderr, "cleanup: handler = %p\n", handler); + } +} + void rkt_webview_init() { if (handler == nullptr) { - handler = new Rktwebview_qt(&handler); - handler->doEvents(); + //fprintf(stderr, "init: handler = %p\n", handler); + handler = new Rktwebview_qt(); + //fprintf(stderr, "init: handler = %p\n", handler); + } + + if (handler->app() == nullptr) { + handler->initApp(); + + //QTimer app_exit; + //QObject::connect(&app_exit, &QTimer::timeout, handler->app(), []() { + // handler->app()->exit(0); + //}, Qt::ConnectionType::QueuedConnection); + + //app_exit.setSingleShot(true); + //app_exit.start(250); + + //QApplication *a = handler->app(); + //a->exec(); } } diff --git a/rktwebview_qt/rktwebview.h b/rktwebview_qt/rktwebview.h index 50c3cbc..c661221 100644 --- a/rktwebview_qt/rktwebview.h +++ b/rktwebview_qt/rktwebview.h @@ -89,6 +89,7 @@ typedef struct { typedef void (*event_cb_t)(rkt_data_t *); RKTWEBVIEW_QT_EXPORT void rkt_webview_init(); +RKTWEBVIEW_QT_EXPORT void rkt_webview_cleanup(); RKTWEBVIEW_QT_EXPORT void rkt_webview_process_events(int for_ms); RKTWEBVIEW_QT_EXPORT void rkt_webview_free_data(rkt_data_t *d); RKTWEBVIEW_QT_EXPORT rkt_data_t *rkt_webview_version(); diff --git a/rktwebview_qt/rktwebview_qt.cpp b/rktwebview_qt/rktwebview_qt.cpp index f383536..a9d07dd 100644 --- a/rktwebview_qt/rktwebview_qt.cpp +++ b/rktwebview_qt/rktwebview_qt.cpp @@ -29,11 +29,6 @@ static inline char *copyString(const char *s) void Rktwebview_qt::processCommand(Command *cmd) { switch(cmd->cmd) { - case COMMAND_QUIT: { - _app->quit(); - cmd->done = true; - } - break; case COMMAND_CREATE: { rkt_wv_context_t context = cmd->args[0].toInt(); rktwebview_t parent = cmd->args[1].toInt(); @@ -80,6 +75,11 @@ void Rktwebview_qt::processCommand(Command *cmd) _views.remove(wv); w->closeView(); cmd->result = true; + while(w->isVisible()) { + doEvents(); + } + _view_js_callbacks.remove(wv); + delete w; } else { cmd->result = false; } @@ -630,7 +630,7 @@ result_t Rktwebview_qt::fileDlg(rktwebview_t w, const char *title, const char *b QStringList l = dlg->selectedFiles(); QString file; if (l.size() > 0) { - file = dlg->selectedFiles().first(); + file = l[0]; } EventContainer e(evt_ok); @@ -817,19 +817,41 @@ void Rktwebview_qt::triggerEvent(rktwebview_t wv, const QString &msg) } } -void Rktwebview_qt::rktQuit() +void Rktwebview_qt::execApp() { - QList keys = _views.keys(); - int i; - for(i = 0; i < keys.size(); i++) { - int view_handle = keys[i]; - rktWebViewClose(view_handle); - } + _app->exec(); +} + +QApplication *Rktwebview_qt::app() +{ + return _app; +} + +void Rktwebview_qt::deleteApp() +{ + delete _app; + _app = nullptr; +} + +void Rktwebview_qt::initApp() +{ + _app = new QApplication(_argc, _argv); + + // See Qt 6.10 remark at doEvents. + //connect(&_evt_loop_timer, &QTimer::timeout, this, &Rktwebview_qt::stopEventloop); + + // Because we are using processEvents only (Qt 6.10), we need this dispatcher to + // handle deferred Deletes. + + const auto *eventDispatcher = QThread::currentThread()->eventDispatcher(); + QObject::connect(eventDispatcher, &QAbstractEventDispatcher::aboutToBlock, + QThread::currentThread(), []{ + if (QThread::currentThread()->loopLevel() == 0) + QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete); + } + ); - Command c(COMMAND_QUIT); - postCommand(&c); - while(!c.done) { doEvents(); } } void Rktwebview_qt::runJs(rktwebview_t wv, const char *js) @@ -889,35 +911,17 @@ void Rktwebview_qt::stopEventloop() } -Rktwebview_qt::Rktwebview_qt(Rktwebview_qt **handler) : - QObject() + +Rktwebview_qt::Rktwebview_qt() : QObject() { _argc = 1; _argv[0] = const_cast("Rktwebview_qt"); _context_counter = 0; - - _current_handle = 0; - _handler = handler; - _evt_loop_depth = 0; - _app = new QApplication(_argc, _argv); - // See Qt 6.10 remark at doEvents. - //connect(&_evt_loop_timer, &QTimer::timeout, this, &Rktwebview_qt::stopEventloop); - - // Because we are using processEvents only (Qt 6.10), we need this dispatcher to - // handle deferred Deletes. - const auto *eventDispatcher = QThread::currentThread()->eventDispatcher(); - QObject::connect(eventDispatcher, &QAbstractEventDispatcher::aboutToBlock, - QThread::currentThread(), []{ - if (QThread::currentThread()->loopLevel() == 0) - QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete); - } - ); - - *_handler = nullptr; + _app = nullptr; } Rktwebview_qt::~Rktwebview_qt() @@ -934,4 +938,6 @@ Rktwebview_qt::~Rktwebview_qt() QWebEngineProfile *p = _contexts[c_keys[i]]; delete p; } + + delete _app; } diff --git a/rktwebview_qt/rktwebview_qt.h b/rktwebview_qt/rktwebview_qt.h index d9a9f6d..2901364 100644 --- a/rktwebview_qt/rktwebview_qt.h +++ b/rktwebview_qt/rktwebview_qt.h @@ -38,8 +38,6 @@ private: int _evt_loop_depth; QTimer _evt_loop_timer; - Rktwebview_qt **_handler; - int _argc; char *_argv[1]; @@ -57,6 +55,12 @@ private: result_t fileDlg(rktwebview_t w, const char *title, const char *base, const char *filters, QFileDialog::FileMode mode, QFileDialog::AcceptMode am, QString evt_ok, QString evt_cancel); +public: + void execApp(); + QApplication *app(); + void deleteApp(); + void initApp(); + protected: void customEvent(QEvent *event); @@ -65,12 +69,12 @@ public: public: int nextHandle(); + public: rkt_wv_context_t newContext(const char *boilerplate_js, const char *optional_server_cert_pem); int rktWebViewCreate(rkt_wv_context_t context, rktwebview_t parent, event_cb_t js_evt_cb); void rktWebViewClose(int wv); void rktSetOUToken(rktwebview_t wv, const char *ou_token); - void rktQuit(); result_t rktOpenDevtools(rktwebview_t wv); result_t rktSetUrl(rktwebview_t wv, const char *url); @@ -113,7 +117,7 @@ public: void runCommandThread(); public: - Rktwebview_qt(Rktwebview_qt **handler); + Rktwebview_qt(); ~Rktwebview_qt(); }; diff --git a/rktwebview_qt/webviewwindow.cpp b/rktwebview_qt/webviewwindow.cpp index e146621..4c3ab37 100644 --- a/rktwebview_qt/webviewwindow.cpp +++ b/rktwebview_qt/webviewwindow.cpp @@ -179,6 +179,7 @@ void WebviewWindow::closeEvent(QCloseEvent *evt) _view->deleteLater(); this->deleteLater(); if (_devtools != nullptr) { + _devtools->close(); _devtools->deleteLater(); } } else { diff --git a/scrbl/rktwebview-api.scrbl b/scrbl/rktwebview-api.scrbl index 1b348fe..d8dd45f 100644 --- a/scrbl/rktwebview-api.scrbl +++ b/scrbl/rktwebview-api.scrbl @@ -12,36 +12,24 @@ Qt-based webviews from Racket through the FFI. The public interface is declared in @tt{rktwebview.h}. Its implementation in @tt{rktwebview.cpp} mainly forwards requests to the internal Qt runtime. -The API consists of: - -@itemlist[#:style 'compact - @item{initialization and event processing} - @item{version and memory-management helpers} - @item{browser-context management} - @item{window creation and lifecycle control} - @item{navigation and content loading} - @item{JavaScript execution} - @item{window-state manipulation} - @item{native dialogs} -] +The API consists of initialization and event processing, version and memory-management utility +functions, http(s)-context management, window management, navigation and content loading, +JavaScript execution and native dialogs. @section{Basic Types} @subsection{Window and Context Handles} -The API uses integer handles for windows and browser contexts. +The API uses integer handles for windows and contexts.A value of type @tt{rktwebview_t} identifies +a single webview window and of type @tt{rkt_wv_context_t} identifies a http(s) context. Both +are typedefs of @tt{int}. -@verbatim|{ -typedef int rktwebview_t; -typedef int rkt_wv_context_t; -}| +@subsection{Returned data, data for events and resultcodes} -A value of type @tt{rktwebview_t} identifies a single webview window. -A value of type @tt{rkt_wv_context_t} identifies a browser context. - -@subsection{Returned Data Objects} - -Some API calls return a pointer to a heap-allocated @tt{rkt_data_t} value. +The following type is used for communication of data, version information and events. +All possible data that is communicated is assembled in this one type that will be +allocated by the API and must be released by the API user, using a call to +@tt{rkt_webview_free_data()}. @verbatim|{ typedef enum { @@ -60,9 +48,8 @@ typedef struct { } rkt_data_t; }| -The @tt{kind} field determines which member of the union is valid. - -@subsubsection{Version Data} +The @tt{kind} field determines which member of the union is valid. A version field +is a struct of integer numbers: @verbatim|{ typedef struct { @@ -75,9 +62,9 @@ typedef struct { } rkt_version_t; }| -Version data is returned by @tt{rkt_webview_version}. - -@subsubsection{Event Data} +Events are always for webview windows and consist of the webview handle along with +an event. This event is always a Utf-8 JSON string. In this JSON string, the @tt{"event"}} +item holds the name of the event that is triggered. @verbatim|{ typedef struct { @@ -86,12 +73,8 @@ typedef struct { } rkt_event_t; }| -Event data is delivered to the registered callback when the backend emits an -event for a window. - -The @tt{event} field is a UTF-8 JSON string allocated by the native side. - -@subsubsection{JavaScript Result Data} +Returned data (mostly as a result of Javascript calls) consists of a result code and +a JSON encoded value. See following struct. @verbatim|{ typedef struct { @@ -100,84 +83,27 @@ typedef struct { } rkt_js_result_t; }| -JavaScript result data is returned by @tt{rkt_webview_call_js}. +Many functions return a value of type @tt{result_t}. The possible enumeration values +can be found in @tt{rktwebview.h}. Most important are the values @tt{no_result_yet}, which +is for internal use and equals @tt{-1}; @tt{oke = 0}, which tells that everything went alright, +and all values @tt{>0} indicate some kind of failure. -The @tt{value} field contains a UTF-8 JSON string describing the result of the -JavaScript evaluation. +@subsection{Window state} -@subsection{Result Codes} +Window state is represented by @tt{window_state_t}. The following values are used: +@tt{invalid = -1}, represents an invalid window state, @tt{normal = 0x00} and @tt{normal_active = 0x10}, +window shown in normal state (0x00). All windows that are active, i.e. have focus for user input, will +have bit 5 set to 1. Other states: @tt{minimized = 0x01}, @tt{maximized = 0x02} or @tt{0x12}, +@tt{hidden = 0x03}. -Many functions return a value of type @tt{result_t}. +@subsection{Messagebox types} -@verbatim|{ -typedef enum { - no_result_yet = -1, - oke = 0, - set_html_failed = 1, - set_navigate_failed = 2, - eval_js_failed = 3, - no_devtools_on_platform = 4, - no_delegate_for_context = 5, - webview_missing_dependency = 6, - webview_canceled = 7, - webview_invalid_state = 8, - webview_invalid_argument = 9, - webview_unspecified = 10, - webview_dispatch_failed = 11, - move_failed = 12, - resize_failed = 13, - choose_dir_failed = 14, - open_file_failed = 15, - save_file_failed = 16, - failed = 17 -} result_t; -}| +Message boxes use the type @tt{rkt_messagetype_t} to indicate the type of message to present: +@tt{info = 1} for information, @tt{error = 2} for error messages, @tt{warning = 3} for warnings, +@tt{yes_no = 4} for questions that can be answered by 'yes' or 'no' and @tt{oke_cancel} for messages +that can be answered by 'oke' or 'cancel'. -In the current implementation, the most commonly returned values are: - -@itemlist[#:style 'compact - @item{@tt{oke} for success} - @item{@tt{set_html_failed} for @tt{rkt_webview_set_html}} - @item{@tt{set_navigate_failed} for @tt{rkt_webview_set_url}} - @item{@tt{eval_js_failed} for JavaScript execution failure} - @item{@tt{move_failed} for failed move requests} - @item{@tt{resize_failed} for failed resize requests} - @item{@tt{failed} for general window-operation failure} -] - -@subsection{Window States} - -Window state is represented by @tt{window_state_t}. - -@verbatim|{ -typedef enum { - invalid = -1, - normal = 0, - minimized = 1, - maximized = 2, - hidden = 3, - normal_active = 16, - maximized_active = 18 -} window_state_t; -}| - -This type is returned by @tt{rkt_webview_window_state}. - -@subsection{Message Box Types} - -Message boxes use the type @tt{rkt_messagetype_t}. - -@verbatim|{ -typedef enum { - info = 1, - error = 2, - warning = 3, - yes_no = 4, - oke_cancel = 5 -} rkt_messagetype_t; -}| - -@subsection{Event Callback Type} +@subsection{Callback functions for events} A window is created with an event callback of the following type: @@ -185,13 +111,10 @@ A window is created with an event callback of the following type: typedef void (*event_cb_t)(rkt_data_t *); }| -The callback receives a pointer to a @tt{rkt_data_t} whose @tt{kind} is -@tt{event}. +The callback receives a pointer to a @tt{rkt_data_t} whose @tt{kind} is @tt{event}. The callback +argument must eventually be released by calling @tt{rkt_webview_free_data}. -The callback argument must eventually be released by calling -@tt{rkt_webview_free_data}. - -@subsection{Memory Ownership} +@subsection{Memory management} The following functions return heap-allocated @tt{rkt_data_t *} values: