From 1f91eb9cf1dee33facbcb610e5697759ed0b6f9e Mon Sep 17 00:00:00 2001 From: mikeb Date: Sat, 3 Jul 2021 17:31:05 +0000 Subject: [PATCH] font_creator project for font loading; init font_main + "stbtt_InitFont"; Lexend-Regular.ttf as normal font; git-svn-id: svn://ammerhai.com/home/mike/pokemon_repo@17 24008968-59e6-ed4c-a10b-0b2c954b24ab --- assets/fonts/Lexend-Regular.ttf | Bin 0 -> 98700 bytes assets/shader/font_pixel_shader.hlsl | 24 + assets/shader/font_vertex_shader.hlsl | 56 + bin/font_creator.exe | Bin 0 -> 107520 bytes bin/font_creator.pdb | Bin 0 -> 495616 bytes bin/pokemon.exe | Bin 58368 -> 59392 bytes bin/pokemon.pdb | Bin 1859584 -> 1859584 bytes font_creator.vcxproj | 158 + font_creator.vcxproj.filters | 33 + font_creator.vcxproj.user | 14 + pokemon.sln | 16 + pokemon.vcxproj | 9 +- pokemon.vcxproj.user | 6 +- src/font_main.cpp | 22 + src/main.cpp | 43 +- src/stb_truetype.h | 5082 +++++++++++++++++++++++++ 16 files changed, 5457 insertions(+), 6 deletions(-) create mode 100644 assets/fonts/Lexend-Regular.ttf create mode 100644 assets/shader/font_pixel_shader.hlsl create mode 100644 assets/shader/font_vertex_shader.hlsl create mode 100644 bin/font_creator.exe create mode 100644 bin/font_creator.pdb create mode 100644 font_creator.vcxproj create mode 100644 font_creator.vcxproj.filters create mode 100644 font_creator.vcxproj.user create mode 100644 src/font_main.cpp create mode 100644 src/stb_truetype.h diff --git a/assets/fonts/Lexend-Regular.ttf b/assets/fonts/Lexend-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3df85315e265b3fd10c7ad1a92d1ac9aed9a4966 GIT binary patch literal 98700 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�=~Kt2qVHJz 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¨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 b`~F{NX1dCA`Q0S= tex1 : register(t0); + +SamplerState texture_sampler : register(s0); + +PixelShaderOutput main(PixelShaderInput input) { + PixelShaderOutput output; + +#if 1 + output.color = tex1.Sample(texture_sampler, float3(input.uvst.xy, input.tile_type)); +#else + output.color = float4(1, 0, 1, 1); +#endif + return output; +} \ No newline at end of file diff --git a/assets/shader/font_vertex_shader.hlsl b/assets/shader/font_vertex_shader.hlsl new file mode 100644 index 0000000..ef54c1a --- /dev/null +++ b/assets/shader/font_vertex_shader.hlsl @@ -0,0 +1,56 @@ +struct VertexShaderInput { + // Per Vertex + float4 pos : VERTEX_POSITION; + float2 uv : UV_VERTEX; + uint vid : SV_VertexID; + + // Per Instance + float4 pos_size : INSTANCE_POSITION_SIZE; + uint tile_type : TILE_TYPE; + float4 uv0uv1 : UV_INSTANCE; +}; + +struct VertexShaderOutput { + float4 pos : SV_POSITION; + float4 uv0uv1 : COORDINATES; + uint tile_type : TILE_TYPE; +}; + + +VertexShaderOutput main(VertexShaderInput input) { + VertexShaderOutput output; + + float2 rect_pos = input.pos_size.xy; + float2 rect_size = input.pos_size.zw; + + float3x3 coord_sys = { + 2, 0, -1, + 0, -2, 1, + 0, 0, 1 + }; + + input.pos_size.xy = mul(coord_sys, float3(input.pos_size.xy, 1)).xy; + + float3x3 pos = { + 1, 0, input.pos_size.x, + 0, 1, input.pos_size.y, + 0, 0, 1 + }; + + float3x3 size = { + rect_size.x, 0, 0, + 0, rect_size.y, 0, + 0, 0, 1 + }; + + output.pos.xy = mul(pos, mul(size, input.pos.xyz)).xy; + //output.pos.xy = mul(pos, input.pos.xyz).xy; + output.pos.zw = float2(0, 1); + + output.uv0uv1.zw = float2(0, 0); + + output.uv0uv1.xy = lerp(input.uv0uv1.xy, input.uv0uv1.zw, input.uv.xy); + output.tile_type = input.tile_type; + + return output; +} \ No newline at end of file diff --git a/bin/font_creator.exe b/bin/font_creator.exe new file mode 100644 index 0000000000000000000000000000000000000000..eec11864e045d329f041485d34b04b871a5ac216 GIT binary patch literal 107520 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 literal 0 HcmV?d00001 diff --git a/bin/font_creator.pdb b/bin/font_creator.pdb new file mode 100644 index 0000000000000000000000000000000000000000..6897016b61342298e459ab3999aad81471df5505 GIT binary patch literal 495616 zcmeFa3wTsVb|-%I00aY`mJJ^4fTzJ?20Y*q7(76*xh-`|YN1D?2L=zGR!eH39_!Ia zEsQ3R2oFr`37&`vOz;FIa)Psv-~{KxiJjnGvB4Xd-~{hN7H{w_&f5P!&f584VsGsI z;6MN0sXFK0y8V#s`8L@vS;;UD43+C*DlZ+~w`%3uD~@~?cwU)xyW z|Jwbfr8B189c;Al=d-MQ1cQJh^aFndI+*x(LIV>Tn9#t41|~Exp@9hvOlV+20}~pU z(7=QSCNwaifqx+y`02#oga#%wFrk474NPcYLIV>Tn9#t41|~Exp@9hvOlV+21OMtZ zkhV?n|NW~MctXGl4NPcYLIV>Tn9#t41|~Exp@9hvOlV+20}~pU(7^wN8rYt;0WcAr z(7=QSCNwaife8&vXkbDE6B?M%z=Q@SG%%ro2@OnW;9s8xXv^d7sb9Tu@D9tmJk7FR z{3XlEgP8Bdbhzr9I(+Q=I(+>Xb$H-e9lqDD!}a|-oYkYl?%g^(*P_Fv`*fK18#)}^ zufxMn>+tQb>o9y+hm(G!!&~3b;U12^$N8^)SErw@(_ws@4%fGFxJid^?9^f2fDVuC z(&5fd9WG&hiakz^4Pq4n8XL;Xd`j?t@x%fdH zF74Iff(<%+m-(OZ109bY(qVUp4qx4)!_!>f+;8jn)F*V9$MheH==h6$I_&;c9WEWx z;oF;a_`(4lzSyM0#A7;~$MNo@j?ZAcJl4yrEayY(b^cwfmptb0+^_5O)7-wRenrQh zVZHC_((&h6?wu^}CT`DpEcg0^#(TP3hx@qPq*fh&j_okPcK8yv_Y&6E0=CypTQz?7 zGdeuYdjEv!A7i~ISTFmS@3&dL0P}r}<=*wArjuYfW6b{~*7qAJoxhXy_8!~+U2IS9 zvAzzlUCrb6ImdE+@*BGRrQg)yYiv(*IsXWz6QD6Cho^uxgWmGbUtFci?hAG#QBF~n(kD#|7LEFTijl+ zNqcS7c&{+uan{#!J9YY9^*YSs`sOje`-1aAI-JY)vVz-`eT`4Zd9683|| z+}_=62RoVW+uXjlxP5lA-wktrIIvaIU&VgvEw-OaT>mpH=Lc*DD_Fk^n9j58ua0s1 z&S3jp#rE|)`-cTlUC$)e<8#bcEtj9yuJf0$e#4Bvg!y@s+vn*G8t+}^e?`BJPv!7U z_LDDi_&W1(jQz$g4sVIyc~qBwhV}C_>vw?r*+bmV-ev!p;QAlp_RC{?pUU(;_^zh+ z7VAI6e&Tg5x1dqyzxjO~zVZt?JjdZK=Jy5G%Tn$?cdkEglc%woUt7VGzE*87b*U9NdRhkH1_iS_jixAzV1w_CYf9_#OEw!62vKNWvV z)7ixB9A^1nWc#_rb_2 zYwwBQ;ClA4zGtz%?qa>(U^{w=+k0SG^YJ$8WiHcyo%`im+%I3}{#(m>pT%}_iTMh% z-k#=gDckc3E&AW(C{rOI%Mg^ShPPpW}9^<$ko3 z<$8(z=6kHC0Nd>cEZ+jw!y?Y_W;@Jd`@Qr7&DRoc|53_m@aG3dgn)wJc>2hz0U*h^_aeq6__0NiE zya3zPF7D6gSnrp(-@eKEJhwyR&;6bb53|0Ovb`Q-`99!wIL!RM$NE3O`rpL*-^%v4 zmD}->*eUztJZ^_2Ebl{{zK_#iV>-3W&)Y2jKIZcPk9%)&xSs7{1^3TaxLxP69Y4o( z2U%}>SiTo_Yk5E7a(8k1i>#NWKh*hy%-^%j?=iO1B~R%5Rou?c{F070vmL$0dI_is!1nUdH#OcYF1Ly8=NY!|Ztm9yc>J2d?efZcU2X>J?r*2LpT?M~2!OK>~X?$h z%Q2So^+URzot*v<(|z`!PQS(Net^gCyytZK2i#ugxcwjF{`?lxjd8uF*^bt;9xgHe z-E4O&*shN;zX9&2d93%>IeicFagNisvVYyj?e|fe=4*icb%5L9Ew;xuIDU!S?KPI? zUDjJM^D&qE#lDT2UNN^zG1Fhla(}|(z$e^(r`f&+*d8BZeN19`7O~%ayFt@E&GJ0W z?On^`K{2=Io1DKjs`2k)dwPrg!Y$V40`3p%na`KlZr))0=UC6DIed)ee3t#-pxBSt z^?F_3T*hC(c->#u>0y>*5#ulAdh@tl7qS1?7hyTsuAXCm^g8#`7}Gt?cJ>O#Z-^Z= z>GGFYFEhB^o)!BQJ77QZ5&N50n0~W_><`zsXnJ?CeQaWSTiL!2AJ+MU{W_e%{Vl|N zUt&9Xm;2GXtly`(e?G_ZCw@hjPq5$G)2HLFvAyoxr{iyM{!-3=KaYyfJRCJxuTUW=(I&P95G#>hMiz*I(4} zx$I9DaDCmZmw9YIZ?N6H%Jw{i`@u_G?>y%B#`iV7IP33Owx@1R-^F(KVxz`uW;$`E zpT~Ti<8}&h{Z`&>*0dq(w=Cb}5noZM?VtK&VZJYTd&?v{&)RJj4%ySJAx9>@7 zWOsg%RW!ZTUxI|8-F{^3nzlaQDz%C&YiMej-?FU2ygsYYcV;Rs_q^Tmm09`r?buiF zS@TQ2W0e-sou7yeS%qaqR(_RL=$~cVrB+^%m6zxD=Udh;tEFhs{ExxXP*tA28!7ac z%(pgL^X=f1g;w6AsZ)yl#n!??--;p1EAoTiJbTxWwT~pvw}RjA%fITIW-Sib`T2#G z6)dp|r`uM3zCW_S4_>WORA*Vc3%_F*S|#mPp=Dc>=2_PC{CSpt`cRp*_`5^-R*{|W z^Owxp^;FD?Sdo06RR$Cr{14^rvZ@YXy9PMc$aKFolZ5h@m6V`%tLTox;sUFvxFByT zF_$;gUO2okk8+SVJutaw$R4%|C&hdqRur^4QPj$x>9eQ7%qRQSBRXVR3w_qY+rY8U znvHu>i~RWo6^k}Pw0z`E_aUunQd!=vT~AK4EI-Q6g9!L5MB`9tq|6*GFDhATS@%K3 zL%y0JYJelwE>sG%`L@5*2Vu%?gFH4R(cg3cC|f0fDnJVWCIb_&tYN?*z)`?Sz$oB6 z;4+L z;?=24grn=P69>&=K+@i?*Og?ZUSZ&LPo%1z)C<65CLokqyR&JBY+ctQ-HI8i-4dlmJQrYXDV%CO`|I3$Puq8!!ww1UL#f2^a-j2D}5f4!8-JNu39<7_br$1VjLv z0iA#pUgGhhy2Az(Sc2GjsH0@?vP08at-14aNZ z1I_?00ImS80X_s!N1P6r4JZMW0@eVk08M}vz;?iHz%bwt;3(iEU=(m3a2fCp;5y(Y zplAl<1^5Ar0V@F!z-B-vAO#o#>;)VI908mFoCRD2Tm`%j_!v-l8)OB{0W1V82iSlb zz(znjAPLw3cnYu|FakIZco}d8Z~<@ya1HPwVEX4FC!h+@1ZV+t0k#8n1BL;I07n6% zfb)QN0M`LG0Yz|ZGXZ|UV!%p35D)=u26O^afFZzMz(K$fz*)dWz*WHefR6!%7|MKr zIe>+L?2P6SI08at-14aNZ1I_?00ImS80X_s^6tt!TN&ssBRe&Zy3!n?I z9k3fP3^)Wh3OETE1)K+52D}5f4!8*@x&yKT{D8%Pm4F~%GoTZY0t^B60_g1R2;c08Ri-0WJdG2Yd`D`~u_!%mFL}EC<+t8o)+CJ0JrSP2LMB7n_+PCyDU1lS8W2si>b0XPLX3%Cfl3V0vzF`)2n$O@PPSO{1S zumLrIjevGQ60igC6ktDK1aKViGT;p08sI~~^q+%_fD%9{U=5%O&;)1!bOE*lb_0e1 zhX6+bCjp~?^MK2McL3J`MRU-m06$X#+s!&bU2UkXW2S_3^Ed4@mDy%T!)8Q zp4T|O2>K$t0PLE=*O^WX^D2rDhIKdUb@O3C=&qax9&v^Ea{HUS)mmWd0MZw*!lqKKdK+v-Lq8hB*C=`8r-)rNc!`FCNtK zNu@eG&E-Gfb{XVwNr}#X0rNGY|Jcv#u$l4S<#yVMxjyATw?v1}GM_JUJ#WG9Q~t96 z3U9IA*H`QKV=VVTK*tlzcXyqR$C=Mf-2Ugd+zQt7YitiwIsMiGU2g6db-0u3dx+aP zkM(_v+jk$g+e<9pv&{Fiod406G@WNx=s&6*_Lj$d&SLp%zozlt!<>`wpXGM?g!%o% zuhU;xsl&H9oV7~Fm#}@$W4nBY@nDg1xSm%ExjeW3 zEVi@P*xrj-A0ZA0IlRUA12ww*66W(=w#!9qZ_nSZ^W!YvE$$aP*-rLxJKW-W=LR(X zCe};Luj8+>AAF0$t!s7qsxRws3HP&o><4PuuiRp}Ut&EVTj^^b+hHx&_snXphr^H9 zes4_H>4V%}30ueCn4-heY!{bU{z2~lub1fj8(iNc2v&Y#Qn`#Q^ej`5#n zdya8GdYjvMF3WqE^}mGef0pSlVExYHdIQYwTU_rXmg@%VE$}%l?*X>kO>8&oSs%w(&cn>d0Nc-D*2@C6 zk7v1mKF{U5S+B*6mtcE2!0mg9?dCA^vz7TAWc?izeKX!A*3+vj_d{$~pD^FA=V>|K z=JXfYe%@mLm&bCiYkc8AX2 z$@H2FbbJr@i`aA>zl+C_54fFP;(iz7FwFjbki%mfe!%`<0k>zEbvnZ*1& z!+M-2ewz8&#Ci!V*5zK~a=SQx>kOU#Cf7TQ>s`;`PHvBVZ1=B!UgN*W?S7i=e-hip zGh83kqWs-^VI2-I|Fvuf2e@Bb zhkf%ky;*EG57|1tp80&8+qYTlhw)xxzOj|B_}|0!^cuJ8^BlgydRf5nHzsNP*IB*= z%x{?GT*dw4CAOzq9N)wJ|4rs&56c^7dG_!)u%cGef2c@@Z*zNxigo-0wxF)ZEG48$+rsar&PuGJ#}O#Z>VUpU6_P2NCX=aAoL+Jgfc#yAK7%$ zfx*;T=*K^H9?^Re)%h?1vkS|>P5v|=WuYe9^8fY_5O!HZ$VAFe(RT|=t8KJ3 z_=7H}Aau_uca-^CXeV9&O-Derl>kZs=+0IXparlUup2N8I0QHfI0+a9oCjP6yaTun zxCzL0MiYTVbWYO=NCAcbbY621Fy5JsFCTkMfQ0}#uc^WB&w6Ha4P`#fxy@%ev!U~v zqC%Jyzz@iFX48puIk(x1-v&&vJePyn=1UKvzrz` z7eLN$hVfg@a8Ba)DBwJR&T)R0^P3Y>ARmCvZ!Q9^0^SFFnsc0NXE@o;Z>*`ILo1PoDu+?<*WgGn)95Kz`G3i-*KLE0xtR#Altdl&vK@7 zycq2ZI0MLat}`1hpU!ql0iWi4XRNcGZ09-=%(-)&?Q9Rh2UNnpRm0bY;R7nrFV?}f z@H>LE#efm~t^tl8&|U@m1zf}LnOHl%gZY((G8X0?*MN5j={J#o5pWRcU4S#dIfHr@ zBmV@_uY>-10^|)NoKpiog)oTtN`!udO-M@tI#G5Qa2dasBP;@(#P1Km*GkYD#_zNE zeFSh8^tYq_cTkrPd47aDkbVeZ5YQfko-x0ozY+kQVRQjLM0yuw@t4Eimf&0lYln+V zAqU_nU^ien);V;xaS^Z?H0Ug1KVUn`?nb$*0q}}&2j+DvvF3Sd8R%h6u@dvRlc0AB z;Z4k4I{_;Ji!sOA2snh_=K&E6$Y(*rkM&L!APG1KI0ZP0x!e`N^)l$#MjBu<=%v8x zLDY2xbdCeg&x4;t`b?y~kMJO%20ZLV-rm(H2iOf>u3&C`6YxH0kAmMTfHk1m325=d zcYhK5A>2#90i~eZ4%iPULY+y_KLMO!z!2!409*xBt%5!PM*)`sGf`gz;9Cj(1GWQ> z1FiyQBL98lm4Kg_HfRAX@Z<+n0Zsxs0XFPvKf)&Pco5Kn_-?W_0G-*;c@3TA90kk) zKi9$I%=y4w1HRBUX91Uyeg^S1XdeslnSh0WHGl}OKTG0XPG=40s=K6?IRC zZLWd+H35#4qAYkg1h@hygzcUBD)>SAZUClzRtca6ylqB)5P7E%wj(V_d5G@^TmiJB z>={Z!*oAly;Z5KsXTatQp|dYQ4+YTWbjSxdI~zVKAGpY)c}`Ux_(ML8k8}p#atCI#j%-2<`HD=n?dePle6Q0&SF`vwvC;EJPYTFR~rK z={b~^DX?AOzYn~lC|f!c=}6lRob%wJ1Uy9mM*wF){~+Kde(wOxK|Vc)qvo3kM-ZoH zfKtFYjyT+d^)ksCfIYzuY{2_y-$Lkb4q!Q8H{cN9B;Y(?@4fg9xB@6Ff&737UX@DbumM^2u#b_(QM#L`yJ_O7}`bxllz$oAf;A4P) zA$SI)0Q&)>fGYssBIp>90_+Ez1iS+%xex6G=mHD_P5>?fJ_Pu_0$u22@OnWU_t|;f%(>L#rcRt zD(LCgwQEZoQ+q=w{^#o8Mq~dCf!iDqPn8IGGI4us9d{3kcI9~Jaj8+BULrw zbrHL>GoHx#FM_^>%kG(IaFXerYej#jUEUt*r@GhwaDXeVMqEO@`{Q~et+ztyDnTGstr`t+o@DrM+Og{^Uz&a9}HL4R91rD?U_3JD-Ye8 zva(QZeOa}g8cZ(DpnK7aTN8o>lvmsJO-=OYNnzucJ?gkIt`p~+n zV0raAyS{Pl(q)1yJp7}FZhc*CU3s{+-0tj7Z5LF>7V~K#awRS~C zZx8-{kEi|JbjAACE>FRQSgV<@ zpEGq)Yop~V*44osd6W@qXsB;k`+(@=elGi8K}Y)E(g(`xs{?i6P&tYQ0;TkiD87O5 z7f&+q%K~<&uBNV{B2cSJ47$aX16f-VtW`u*Oy#Ox!bCSP&Av366@fr)b!1&g(Nt!l zO9@TYdqBI+rLC}-tR-}xOs5-)ROA2ZTy!R2{QeyV3rA;V<@UN@ZFNOuRi&b< zoVQlp82qY!vQqJ{E&H2H`wxx&va~F0!-I#)YU&OB>K25N!_d(_s*)}Av(t@x6|cOQ z&Q+E5a9xjj^b@x0sw3gb+8W*ZS@fP$KP;%pk=f2t-}lq&t1X994wmI=kDTp1PJN=w zAExOtQdUt{Q-;xn6s0XD3nit?C&tvJ&Q-dUy6!W^(xqkV>>5Z`jWJTy^({qhmHM|N zsKioUH9;wT^pA4LZS*Te|EP>!`lUue`hgDri`;IjJ#y9CWx?t|ZJ@S7)ukF+l~)of z!d*lFE|I!3`A4om`AAA+EpUhObO6%{JjwO1@w8*TU0oTe4Fus(iL$D2tw&Z>v+Dg$ zO<7DSOF@;S3xYDaJVyuL^60zXCg&M|`^v?GK}w{}VqU7QD2bt(LA8KVC?$F7pK1Dl z@&M`&lvRczy6>QKmN{BhEvQCuMb4`l)#NHu{i8=5r7zWl%5bz|n1Sze8_>RlFM{nFM5X(RhbxSHr;qB z7_6&qrdrGFwU#CN88XKFrQoZkd|h?Ty2^UR*EV8KnVvEe6;-s9e^A;}Gwp7|OVU4X zb;2!=ww?~Wl28e3hYvbCb!{hP*RKnQtLy6niVrnT{PXbfGWxU2N2Og}Qx&cYVKz(b zDv6css*kKyCaV%v*Hpu-+fx2}N zqBc|+2%n&MWi|yzzQ7vs~+s}f!Q2^r=RC^1YR;) zgPsoPC8I`P-DJ8XH~7D0zJFl0cQ9a=M*^YxNJ#ro8CS&qRQsg0zjC6=RJ|jO(rNmj zqL9~?R59Bes#Gs+!!oo@iIt1J{yy`6s=%<##!Ba}zbSQf|xbo2o-9Rj3A6 zxvJF_!@9dMo91F7C$b_{POUtK^;(wjOYg}#{R{loRaI0~25Rb*o#fHmJ^Ze-E9=66Kv=DOnIk23+VG(is-#gJP&qHvtJE}9rFqQM)U@)T zih!~ns8TiN{4L8x&lEX*0yR7e0=7N3U&f3T#vdH?&_&WrjUv271OS zCHtyA=GUbg?d$DLMSFVN2t$;fU^EjWvn>R2A3( zj>zoOIQ_wR>%f*R@xDl3ydR=Fb)8Ukh5K0-y?qt&SPFJ5cz3g1l{Sz}b)veac&p3r zsG_lcAl^3^iT8E%_I1a4+T!KC13jsDA9xWO*S|qD8o*#(Z$%s^4=#7~>WfNVq!&&q z-p42??#N=RdKyw)<*_93SdM0nZ+B&hNPbOk@8bi>ih-Usa)_axRNtUUr$z8KB%uCS zS98x3FeZIQOLj1%@*Cr+=AKT~cI~0; z&rL|^*h)9ihNkkU+n|Q*!*0G)8ObDeX{&aQM$4o9$#`3$BhePsyrTiWgf=8xx+5pw z0#2+yRXGsrYv0h3inVsd`$HtXi#L=DPuZ*69@jgl&7#rDMs4DK<(=`i$6dR)9?zCv zPHv)y>J!;VnD>|(E_z#|9cVe^%h+JGXgY1+dkgU$ZKH~!bP7l=x1DUe75xx(OBw$- zWja8M$`c>=iSJZ47>(wtr>8gR(2tBmzqgC0 zqB^+fk_PVfjxF5sCNi}l)s4q3({QuXroKY>{tSHO7NXfoiHvmD6#0@wcQTqeqPn`c zJQf~?O`&%+E1o;L3f?s@UfKxjKDTq-i{}|>$#zKYkJE6njkZ#+HQklhba(*L`kiwt=5(q!k|g25#nP>C#;2#mhQs3e8e4ZraG{%C*wK8*2m= zy0(Gu3~bIQ>e8(;@N$o)u523({OqHmYb(PZT<<6(eA08#V(;+a86HX6wR3Dd$1Bm; zM>crSgP)8>X|;gCPx42ySY|2~dZODp^m+RtgPBC`zR(=wX{ zHjB7^Cr6nymL2<}dzBo%s18hjyTP~U$Db`f8h7ejXy*6Dx4?Wb&~t4x&!ZVS=snCj zD$Ro=rJ`yj>-No!>G?hJC!)02HE6V$I8V@HWqqoDiOqBx`LVX%e&S#9==}|; zzb&rkvNAW>Zswtwlo>M8wWYiCo-*<}x_Z@|M#>GFd62>6n~YO?O1Tj;kCw_t z-cfHJsl_RG!p!TB#~(NHUN-YmakQ*kZq&%@#+0iUzEpVGZuGzIcz0V8t3t^e^5(%w zT9)YYtU)u``-D^Gf|1_8)!S~D&Ae1!7b!*T=BklL-ASz+A%o=m@tfwKiT+qLwhfCE zTBIRO=Fa|BJ$LrxD~I9AQ)1AF_Yi@0gGegZa%evs_UDYFLxBw@=%`b&BF-j=0)5*XY`}7kIF@AHO;(<()Cyo8P{I{vOoTkX}WO9cg&&t&jw1LZ{Q4&y2cs1aBlA zZ`sO@6>XV#Luq)cmM!gwb+oN)EiL_;sXvm{k$-t6ou{(pGny%%?ZwlSkS6j6z4?wF zC4ajof9Xfi6l|5`@=N>Bc(uPtBp zK!+(m{dV|k&9t+F-uw*uN6mbrJw-pmo_tq+@jbqE+@IpfUd)=d^t)Zj^)J;PoW5Ak zmblunF>s}S+F=iFMhBI3{?#$@Le#8|zovU{m5x$v(L^lfq@OU;zx6FA{beIPW#H4j zxk4ueeBtGS+6(1v?pPb9jhJQj>%Cl>qtI9-bL!Da+Lx=N5Lq^0r!cY2ErOyc^6%33 zY~EK;WjvcB(T=Xz76)%O%FsB$cpb5Uu2j^R*E@SU&05DAud7RK=*K!}T4c-`+nl|v zp=|iAacu0;>5c3*M`?>r&GX35`ti~M?FD-3p#40ay2VndSR0&=@Dv#bzdi27_hsYB z*%0Dc9{6zDC>y@#Sjm;w%EpTq7lQ`vv}iv=@?QVCA+NiQ=Eyh1kgXSieEU9gC-_r<$F%5^e^Un2Xx zVCs!#V*_&5;cl}^uM!(A-D0$1e`)|5_1Hkw`z4NB0PTNjeA(k~$<0ri*Kzm6|GCN} z$K_2toXgukbs1?FJ2!8p*K^wOp9)`mPvq0_6K!+6uzt5n&F}x2%Zd(%AIsJk(wv{s z7d|aMofVN>Ls{j5b7_mpk`WsxwAGgEievWhvzBw_9H`UrNv@;oPxo~rrrcxr4DsWm zrcW}h3$00WZNc;L{7xo-e7wsr-N7eaC$+A5cUa4<`U9uSo|TOM!4T2Bkb<0oM61n-C%dGVbsK7 zW`vguIxp)k@a;0s5*+OQ%KnlMa-;8cbkW8;}7X`t=-+@MSeZPb0~6 z(CKTXnRv8s0^8RUN3m5q6Hh(V!_!M={ujx_b9OpKmX=H$b5l1iOiJBX_45vyN2vPv z*^y;L`$>(Lc3?@U(nm}6*}lfpho)*t+K;ECFpFs;y-VFm6SuEJyCMToXpWk7(~;~L z^4L+-11h~(Tgbd-Gy^x$vkgzswd2UY4=;z)!c89T5dB(@D_>^N z&vpvn%IM3$H)rB*zw^6zH14RqPwJ1Q-gNBvyFS`h?>l29jAzjFgK;z^ZddkBWqn#c zXQfL0fYMvmD;YE+h)a9ex~`n32hKbq4bL<%%xbfo8o2AZ7G2gj4WJVPH$Rz?Pp1X0 zUl@{n9Y5!Z9~L^JijF>okhBXrO&wZD+EtaNOH0~ym8MS| zB+cp~Sx8;<*&}Tq7nBSg>V!ekuIe;(vLI>KB@GQEX_oS(9qJ@O(tJ8ioghfs^}nEJ z3~4Fmw!KfuOljo}P5dMQRO{&0ujt5WgPT62_>hwZH+@*r)hUC^qfg09Ck!s`NG0ik z4^ojXeEJoxK6Q}sC;1BTt{;Ici#;Bv3lqu`DO@e$`j!?YpT;T2bo6S!l$|cMjqrB?_oZd4 z8;|HZy0G?L(b5($U3|`gI;|H zTmee-u^BsZ*biplZV>fJy*?bM7;;d(f>YnP%(cg>%^p0}ZN$!m){vbGN86a#iy!x` z8Fd=8fajWvBeSm|7ru)u{pz~6T{LajmGGGSawaX)rUY;3E17tvJxP5dPiNwp{oL}} zlH!N#NNjC53%}{UV04kE4q^l5)1*#P#V)MeI5qK}EvZh}kjQpo)I+aspu08RSKmQx zulkkncKtgZya=8wbexdXJF>@v(}<1bc)Mvus8@8=V%TmN%Tq!_wxbIl?n@NA2=^;h zg}Rd|^}Mt2K7^H*;MBq?I*x&jQEV(39TU$n9B01u^-qP5N6Ga=7$)ETP2RGGK|3}) zx*;cy!^?y0gZ+<|@?+R*LML*@J$!Q5!#D66A5SD}6aD=_bF57D57GB%xm%_I&tS*< z@Wc}ICAt`0?dGeF0Uuq9&3q6HbvN}!Xc#4e!mFJHUm;b+6I(j<8k^=FrFy=^Phz<9 zD_f<@mRj7I)0L{Z^fqVWHQ!pG_Dz<9mb6v+TpJ_&5c#{4NX*+PNzHF zDV>v@blT%r_%-!)l}a{U7d@{mb(!P2>+3Y$^eG-Z?Js#uy@&a}oCSwQnEA{b?Gs5| z^gyp7LNBH?Epu=VP0PUP&;u#?BhAb1&$&1z&$=#+b9}mslj*axt`6ZDnGAlE;7!md zwZF#OJ2NL9MqtGF9C9WR@&kv_E9nBPkrBQ(98$>`t>v#%eAczEph9MZlPVeZCl7jrToVG z-F(QW`>~q$Xt_3j)sycySehG&Op8lBIL5H*ohOP;JJCx-2U4e=7Eq6+HIA<47Z z|^gMe2Vh1aYd8Ik$6FZu{k!kcL)vg=dP~R3j5PCQ3W{xp; zrSdc<6nPG&#DxNVH}KhYR#?j*YP8}n@{lWU$Redc3hP8{u|ClSnfxb{hBj5&XF zn-@pM*kNP+5bc$jARaB~Omw8s|HMbkX?1n)%k?G&e~CIcjHzMjvgbh4|5-nF~MJS^VOjzy^qk=*Q=)F{ZVr1&V0`L zwt?H<+l5Ec+6Gz^Z5l_*xOtC@1OA=vOzU;&5B^_van!hoJn0W-j6Bw-XOBi?pZ;B! zM*7~R$aef!a^awxVhZ1b2eg*ST;f+<+^p^B7IAo8GwdmovBsCV*XS5{23gS6eQe`C zm#)~H7ff(l7l#aOsY>=ewGD_Wk;&D`VDoJNw6?gH%@U zp^GmXQE7VbHrh9UCl@+neR!pa){}y>@~~THw5_89w6VubGbMM7Z~u{j(>l;Wxhr9? z;v=r4=l5epYS?`8H;wXb{cWl3(Y|i@v}mf=;bZwoCJq+93P;-X<19FBc)n9pqW-Vj z{?u=ov~Yw6exqAx13lV5(29rS@h7~eju^OvM;OSLIyXOWu_n!JZa!ml2eEJ@a$t)AL%%>uK%$YPYpKZU3f{!ZR@Ll zV&KHuaYRk0DQ;aS|J2A&;kJ!9Chs)Ppr;VuBHxFv=D_3eNc3I!X9iwBJ%S!@--1T zl@mGuKIjY8{vZki!HX0<1^a4p|YZv@HNvDCw zz%P_^o`v0M6%|kMS$v{PYDi!+h}xm3c&d}Gy(^{pK}(OY1L%V*!Cz4^wttPZ2bLkK z(y@JHq%VDt(uoGOgQfuzK&Lc_=%xXc=+1QNcU-SZzspIFD$h=I?*@K}lm56qiouh3 zbSn$d3Oac>f7Zv_ z+t+U0243zZ{j2-4EEWGNl$S$J;&lcZh-X&H1BlK)pO%g}*FewXnuj~wJnemybJ0A2 zyxZOwt7Pr59O?O1`qffy{>nVn7u2L~^=jeJ%|DqVU*?TOAJ4(z$}Qqi&xx-)Y5E#2 zL{-}*CtG+5vULD&_u^^%Z83Qg({C2=4fQq6wUGX9l$(b-3am))6Y;)gyq-}T z+n(qiz}oyC2@R?s^_Df_E66qt0i_NVGgqQ&ScwUl)xugzFo^O`D>1^$oQFY^$M-HC{n>yl|aTk!wRm+3UtL z-&2aesCW;C8zVJ=O=$LtaAmZyJWyAIo4TX*4Z%=DxUMo9u4@W4)C9^yL6U>~4EYoq zC2-GBlzjd@NF&~(*;q%u_@O>_L=^u=;76JtX>4jBJryZ?9LpM|&8hx7K$FJsXoO0; zJT)7Mgy+@~Ehjwk+w=|92=Q4H3e+`6qLmHx%@O2D-;b161&Aoc=OKK8MgvGG@kgK+ zB&+yOiB`E5f@C0DG-OD(E)hZLi)<>|+!$(z2Fjbl8>o#V4WY(RU3o~+z8!uj!V?v$ z+mAZSHZ`gKNbzl|ZmmCxgPhU{0!9B# zLp<3P!>xAZy?s^feb~al0c%?j8-G1|K1B7*N4X#?f!h5qM4w`^;X3L?kV5OInB?F? zOKKA;5A}0racw7u=_q?!OR}h!$gqrNy2QWY1NXpDyZ$Bf(HO3c)WC@`J4#kRaLelJ zsl}CUM$>s_-2hGDlik#?agxjhB*TXKFf}~Ii3ePN($mX!u@&)047;JbFeBVp(l%9S z+~%4lRbK2DtSkA*j%vh^Kx;ngcm!#7xOf7o}X$rt|a0ZuJ&t_w~%rs24BP%wzbHsmjy zLSu+YBcksy1hX<1$mPdr4tD@FHZ}$}grXHROrS?=8%h#?P4$szO=tr&9NJhOiZsy> zRS~X%Pgk}lw#cqV>6YgG)c!<=+WA4E0}`-^V4x`w4Tc)a8^WO6pzXJu@@d)-+NjD< ze{4aTTOpim69yH~bNH>TjVhJ{4WR(m3X&d86NKt-B>K&DkA&-j(W-DG>fMA%gPxpF z{z~LWbMQyJ(D$$<-(X$&je4Tp&|KFPu7&!V>)?#*>sap1$a7_&o`oZI&R6|}Y*L&M z%22=Ehcek%#dNBv0p~kptK_@XSf%c;)McV$6r#ROZCNu`V}d5p{vPn6wM&<+47hQQ zDtTkbkGMiP4MXyft*Yst(T=MXzHWO{cck}62|pX(;AI-}QwYh7h%Y~WHyb{Z##VX8 zh2(pjXsxTOufxPE&=e*Yt_=zv2Q)CZ(&IPv7ngl+9BZ zEmO=$$way^dbLBt@!`~|xnonEqyq!rQ3CO|h4^7ZA>40J+~v=~l{Lm}tTCp*!{)jh zMb2if3SQPbAM|=9g>{sorE%06IP=a2jeEt5D@z>bb_iK#Z7%T8OvBT6KFI!IRUzTF z>5E~VSGwJ`yWs7fWa8mSbX%f#0B==ludde$Yv54v9t92DNXNk#-WnvY&?r)zT>wH_}>8jXSqv)#;qvI zEL5~0Cte(NUk>VnpVRrJI={C+6-{pG^`I!6Zj8Y`mjK2neGxTDn8}X;H5j2b<5EdUJB{( zVSKBxsCbTBZrr-F&Lx-!>TmxY{Uy*4#oX7OqmvG!k#NNZ@Jasiq^eKd2!Oexdc98H z?2UY)q1F>>Iic4po}Ej?zqrn6WIaZ(vWr= zfWAe9+T(W>j%tsry3C;mQ7iUDi;90|92#lu=#;HM*+RGMxNVY)4(a;0Tv?w;wCk(Y zMP-!#pGjXiCa=qoeeXuodgw!|?MvuV`XvKoh@`v!_F2lLQ|W(L%^wC`zKy#F zg>$<5y{Opw3_2RGy@>AxpMhSszVt9?{K%#8S?osjVY1(spu4X2#5P*s(fE@jdUVll z8{e_3-j3G&=m)AU)sJwchr0U0=||MI-*@wSdevK}PPU@`OK!d=m+IZ==6MJckL1sy zkqxRp(|YC?T-?kTCfz1eefv+yHo8PYJ+JtCN>jrDT>^ubN!ze3+#c;2=<1TK6*VuW zaYLbD#9%cjTY1Kt6mMcH{w8G8Z_tW~D z({|*0*!3tsM|~?t*HZJT4OEZbNlSHx=mQCI-8!#(*r$=sL}g+lQC6YwA5HYC6Jqj} z-*#nHeLkDFlyfaV<|Req4e1SLT!^5bI-s`E=kG%~aImr3Njj6~MXq5^Qe?HTYc+@w z;+I#iZdreV=*cRnjY&oFB}>^AX@Uaav|8>qW7Wj=U)Onm)nt(;YC z#(KO+J%i$XXY)&#OVOSN{f&J`x5lG2yNj3o-fh}*Aeuf8ZraP>>PB~xUE^ZgKaFm7 ze46_aZGQ&7zP~72sRvPJ6#eM4-ZwuVOL|y7EhE^Oo?$4t2O)2m$z;_i`SW39g6qkeH?ti@9|0Uq$ff#*j ztia--Rc+PE{leOw?q|H~+3<{8qotQDXoldHq50JpP)6tJ?LaYDkW^(a zqAc5M1}|CpM7jB(`!{a6dbLp*sNsrLS5Wh)BGip9$vS5Y#4Fhp^J9vq<|0H>=Vg+l zvY#jUy*Cfiq+XRJIa!VjL1~S3o5@Qws`w+j;q`25FD~YwdCLDJxuA)raGBB%@hfyq zhDo>Yx_OOo1GHPK8xwSCUGjIi^3&H7c$2OTGc@YwcaR+BUQQ)8QE}Ew#ARbg_+&Pf zENcBKS9_p-!Xdv`!-pYaCoGG{P)L@)1+Q$A8M2W6w63TlDpe`^KcOsm_S?|WwbC$*E(++LH&v`c{&l9tiA(f@wQYSnWp?xyy zF!1H(IKfY4!*})#bt% zUR|o^2<3T`4>g{1$Bo$Yju})w{mvEL235D|Jh^k_vz&2#nzN_-$hXu48n9PQ+w_$< zR#Lv>i&2z)qSO8G8I&g*ziPn542`dZ1D-wuq`9;+ACL=6o!f^ZWfY&JwO(!@IX?39m1M_6$ouY0NhPD|&KQmWg+p z7mpS?#@$<*SEBcMFP>T<2|ej+gy-|(8TSZjTBm?h?8Py!Msn`nqIvUQqWygEC!|m3 zbB*q271bEOa2E8?AH~PYFdD)wt4D%^act%!lK7;O8n0~Nlth~_47(X6*v!P^++~A! z4mi4Oxx#B57f(OO7^gbDR;t zZWyorrK?muHRIteTdMFL92c)t&DrJvFPg^B{ov;t>FMcn0{XsRyl>-!%O6&B-a&ie z3AEL#TWO+>Ehw}#joULpN2N#Uy4z@9DwT-#D!u6WU9VZr87s7|DkLv0eYd1jUHk+w z&H0}7r1#O&zhr~>=7GLLgZj=*6Nd~dLH8&W6)RiHX-Qg^D$+^1y#=TqT2B`hFGGGw zc7$}3Q}dGsq8F(RLRHE){XTeeY#nK|whI|`D*LX&Gt9BRw$4GF#SuehB!rMZML z=6YqVsKOb&A2ZzsHuqRcE$naun11efUF z2|4vrPCuX7Z+@~C`E));XZZA-4}4w5^O>u8%!oh_L@QlqGR&BD$i3J!E>&Qkc{b>e zH7=R@`+`$P?)#&O?l&>FE@l5LSBg_pI(zJ>lWc|d-g(~MRMY4_nIm>lr~d-5H7&=;{-Y-nnZgzGBm9|7yCAFFj_ZGEsA+uzg= z={&y1IPi83(}6E^=ycB{MC&24ff|0;i{dHZM`|nR5fY`#@1g!sRY<-*D3AUqfB%DQ zd8=3B8_{xAW525VH?==$>cj_u>52xTO+4*FdQHU36wR{;-$a)2p2qUKpEYWu8r$7?@u&BQf)2Hov0bDA2gp&WV!j(b6`QfpkOZwt8j&_Y^z# z1ncz7dxCX(<~_kWeWTDx>HCh!Z~VY#S>xaPs_{O}9j&qkBcC`okzc;BVfJRL!Q9lM+>we;C8^x3h?$aiUV9i`ag7#rV| z+&u@Jj(v%oeVc2GP)aA%6U(dOY8TLmHji(7dL^$d~WJkCKQST%(VXq)M)`An8? z6G%TK|NTYK(sT99@3qJ~SIN7{E;8S_BLD4|ew=o&N?lpXZ%->P{hQt~nt!JN}8Z_;W2vs&Vj?ClKm#(XW^Zm>4`)j zZ9R5(MD%c77%#&)&#cqD{u3@we3FidCwcZ+F~#W@i3etu79506y!|=hXW@-xMk%zDSNM6wku%zeRe49(fNml~>^{C3$w4 z)=Ff9#(9$G!FZDO4AIP5R`*+)f6hl=t8A=NFN^n;>$!pS#bNY?%zW(7;UOL3n|v?% z92?-Qk+bw|8ULxid!=uW@$Dg*i@srl;;tnMF&E2G#@sb= z?&RA0>F}|>lP`|BXCQMhFUzb8XJ$FR2?Lc){7qTn9#t41|~Exp@9hvOlV+2 z0}~pU(7=QS{>5nEb3b01x01NUxz7~rQ(gU^^z8Xhe~RM={EI~~{^rcqVDoQETWw9k zF2)d6+~%LYDa*M{?f$iaW^a;hTR*um&C2speR=A4z7H`xJC=w2m%Q7FU_Rose}VlN zABD7|Sb(%;W7Mf`YIEzOsH&?kui*9>vkENzJ_0_K*QcJ`xIt-jHeF=7ajMH_5%=l^ zTZ?cgZKl;T(5)_L?03>;7)c1l`#d zF2LmS6pvW+rlP(iw%DQ~yENMYu^zCs92VA5uD^3puquC~es4Xvh7NbPwAN zvW=N&w8==9zY#n!)tXA-tJZwep4(QEq}uC2OSc!bjg{6mMHVjm!`+b<^G14~u5NF$ zZjf!jTJwvHI(=McF57?|-i~c4Wd~$y^QcPL;WW^oIJQ1L@c|?L;25^ZxAwUb>I5a< zG+6g-pilNrzdz5vZwD{b+r;*L%mc|tyLiQj|03%~^R->IJN?eL2A$u9R@-*b59Lj^ z+6K)ybhv#fw>RZaL%ziQh)-8fYiYZo_zWwFn@8y;;h)?fnd#W)4)7v>x3P}LlKCFU zM$IX*(KFR1xcz*xH4C)I(kqqOXl|En5FS1iwA$X0^U8O9)jkF>> zH;-{riIsLel{EfPnS0yXG9cXOmCjF`dr^pzYDG zVdJKLzYIKAzCw%QG#(~FQ^v#lkY?(Jd?ERsuW(uIhYGC4h~JGi#gV^mQ=?AmUv9mV ztov12cYL)`hVm&yX{$6XpKQ}DpKmSWxc19>JSP7|5+6nzfBMuqLAh$uCAwB0hB58*!&ZYZz#lv!DPHI zf(`fK@&>VcY8#)WzJ{s%9?66Lo?i}n@;6)j#u)O9sRwmWn9)=4QW35?gcfLCm+uRq zF4Du@%)hNFc710dd?(S*2Va#2UnC374>Y;l^r;PrzKkiRe#4+g`J&GXMSrqYjnHft zN>{c3-iSXF#%h-ulpAvns&33REQI3F4C$o~Wr^<%UcHn`+Yt}YjVE4YVW{T04&_g` zFjO0JA0NG+j=_V{h%fko{0QoiznP-b9DK=qo9sq(rpJMNs{wS(erSWJ2}(~WXZ9(w zVeKELSxqQ!_CqN zu5xC*M8gJu1YUZ#S(`y`tTmE*ld@|sPMWfrJl{7!L&k(Cev|!-HU4^TVRp%y$)K$J zX^iPf8?_)#G6;xVt(@-a7&AzuZDTvubLQ=i-BKL$QBS<3?!!rg7hc^cI7EKlf9!p$rksWYvCS*?{M^ZPy0OWXA>);DKyvKI|SkwZ4hC zKdrx!J&13h-*m&*;&s-{niS-7DO-l(>;#js|W}8V9>WF)FtaOe)%k1 zLxL~CN_-~P(CWjIhL5B1ipDsUjJDFtO*|(jUgj8U6QKcJ(nlV;^>;G0P0@S_>u=-p zN^bf>Yg7djYM~ODcu+pNpLi$x7#OsUs-9{VQ+=iy2jW#rsmHu;%vBs_F+{ZJ^u5t4quiGIWW4=I9!I%=zuJT6(0f zWIcg2S>uq+yLoxmAmTFDr#!M90vD&i`UO=+&!q{6>T&b)t({1F82snjA5+GlZ?aG8 zp(@eQ%`brt_0O?%t8Tt`bxTpF{4OppdLdqE-aP~$o}WZWeA91wg7w>okH2fWNydtK^+;0|~vO__a+ACmjC_y$U!m*yKtH#GMAGHA-*LbKnG z)25Gl`m5U)X-+Ku3wI8+i{GSnnQpmrf1fe;pJ_dTn>NUju${s4Kd34HX@fU4*GK=$ zWg|aeerQZapL51HivLrN;Uue#I%cYIA2*wDe6||*mnj>hR}+54kY$dc=kaV%>^*%f z^Y-IO)-#|_dnA7FLVF|_muYWW?Fo|Zsc+Z_X%;pNT+=U5-w_-=XD+b5Z{Uy*%7(Ka z>9pSWE2?@fM(tnJt0(_E{{DI74e+$1!R+)GHHsVqrg+iy5 z(_MN+))AzouSuk=pUMKv^$7i@@?;0Z$?u@NxhIBoy0a%nWeJF$?0wL0T9qA3D@S%h zbbb%%WH$&h=-5anSzP@US}y=m^p}s{vIZ3yC?tH^E1_BPA0VXhp4I`Rv-@D1=oe0V z+xShgndRyCi@W_PJG5ax}vyziQ$Lu7qxxDb{~O8Hx+<1&9leq8Cj+&-z=&rLjzS zqOv-!Wk6X)OMLGCgEFSh|6jyOHjz))TVP$&^(tAU?B8)&8B6{L;-r6*-}jLw{+#&r zGi|BE3|+a4tiK1YsZYUkaSE*Kz!9HGemNU$7k{$#6W|E1Bo~3n>xU{{FpKm>a*!_< zKOt>Sd<>u;xO5AxfAr81TXEZrY{SKO^NE(&mW*8_hsZisNc431Y1S>25k4!pyba0( zZoP%pPmw3}C_Km^c-catZ`PBCLqXXq{WRr;rqI!LI^8M&9chPp=GWyj-^o?hQ>-b9x7_QhsQyBiyEf4YHtl(hwP&Ky_zPa?rFF8RK|W*}c%Z%{Ywyn? zZW(9)dapyDDXI?>8haUfZPKT1p~Z53-NrL_z1i;p4O?d;Dr zFSuj}XYeF%9%$WW&~ou z)Hf)f@ZG*N$@)2@i614pIrO~p1A>h)TVto;1L>}S6^%eQnJmgcK z_&xMr(u4SE!8OBs6)o{+ldTd}R?i!$ZlX&e`N}ULPkfypyppe`P<#x9G%sHWJgGAs zPyC3>?_}$~G`fV7jqYOLQUA`ze8>Ae$)DVyH19Vlbz0i@C>37XHz#jAY)w(;aa8a9 zsKdP`J+|dxGQLNaJ4tao0FlnbWQE4ZBFZs=CmXu&GW3hJZmZFW}lDp zP0-X=^-rgNK7cY}$3%yIi#-v20{WwRv@b5O9z+@9=RU&6TvqI4CDH{~w^P2g3Tb9O z%`x3}$+v!KHt0L=sI_pjCs>^20VSPOe+N>`heJ6|NHDX&2Ax`|-054C4Rsd(huQ~?g~(z^cLpy?E7sViPQsX zs@c@dBmI`q|tV8%A-po2$xon$LHqSR-QKkNo=c9$T z^e57#^e0-6OdBHp@_aPTNjmi{?T0YN7=4!Hc-*N2&nFna)!GI&Ci)}aO8gRC)yEZ` z0;`vKO>$Wi|9^m=bo@TX?|16T^KCVF9pH5FiQ5nt8Wh4btS690yl-b*`c2=ZGj&UG zD*G(}@k?>?Fu%ZMcNk?=o!pv~HFMtWy4P)PP!uA$a;PaankL6 z7tiNMj+Flar%PLX7jY`9>;oZ5eh_Iy<5|Wf+w`j(E&Fe{>57NFh*Nn4_{*~n;|G=h zk&CCs5aD5j(}jocA&&n&Jp2|Ch{kU-F7crE@ih<6yXlIDVZ@0CwV?$b{tcHu>f)*X zC_MZwrwb3e5vQ`I9*#4O7t&}*+x>x?u6X!9;#8j6i}dg!m;XZ-PxW!(;UuRE58pwY z%9=d<5!3kNG#bLgD^5D*QYbrpvVIQtPt()$bvoVeLVd0}``DA?GahQ_$)3mK+rMMF z_vfUmz9cDxDB_G+r@3s7xdYYf`Fg7m@uV^zf5x;#r{n_(Or5?49I~zdz_{7hh5AFS z`qpf@4MEkcKH%y}=eo}_y&UrvQ-98l=8i1s-&19pKTeb9FAz_c=RDF#p4S<7nlu>nnyRt37fNYF0HNrI0j622{P`6~ul91#A1lF>&Dxik6a-kYRfY4iLp_uLviXj9D z0b(E_w15MI5Fo)22tC0-fFuOo-*3vjv%7a?+2sFz|L1#s{m6S~&Y77rXU;iuX6}^1 z^t}eZh;T%H_38QDf&4g@Nxg|CxKFvfVn(^>@sHaK0o>fTY{x^9IF&d}P>qAuaTjxc zIK|btdXl^>!q|!H64*b#ggU0&O=Zc_W2i_FSh)6YDLkCZw!-Xz_GNj0YcB4v#*y^u zn=|i0&XeNyL_=p^_l%ydzHS}=8^n)Fi7#%z-D~Z|<{Bp3?v%NFscmRXl;Ac5UB;70 zJ4OmIX#rtC(L9`nlQnF|X8{{0Wo?~U?Q@)l+8h-%R>W;A(FBwhp)}oRtubkoEmFRX9dG%0Zw7hmaqudHL!0HvTL_cpw}U+N zygu<*j}X_FcMR^k2G{y`#AQ8MzYsqr?<35-Kfo{RWNjz$({0U12KR3fxa3KguP+}P z+_eT5eYol;>DLiY`*)svYVbY_@sxj=WBB%Y7_ZWQfiTnam;LOQ_$B@SG?Eo2TJgKikcBOM^=X%9R1;W$Cr~ z4mY@48C)x0%$I(5Dj#C9wZR`5C0 z>9?+zR;inU^}JR;c)U@hq!72Imd0@f?Hn9hZ|rtIY33GIR+Pl`z3#B#hr@=m@1tz( z02=#AsnftB%$u|>ESL-CjeUN)KjXnlm4%0y+k)zFeRd_TR*vI7+fttNg~OccYD$YM z$|_1rAj7(kTUQz!d^MvMhkjMeEj4NUb=@Scj{C2zEG$MbpilF6UFE2od{vtG9GoOp z3nD8^$|`E>R3FGZV(U?E96fMU9#uSN=*2eYnYMcEggk zj=l~nr$Ky0r@H$@;M0XZMLz1K&v#SqDo)bFX=kN%rMP?DcolQ%aLiW*koDLrX6K5F zt7n@_fhr4em{|qXrSdREmyg?xQ(zM(6jjvMmL56>w*!@E8gtTdDk^b=TTyKxF2*LG za?{~ByAC%PSK%1Cx{4W9fjq-+NiC}i-ZySPSI5e!gPTox%V<&3aB=ZX@vM^4qB%2o zr;jQ(2YAu+gGFVfwXA@aZ`>LkpNor?cyrF|!kG+B&}A`w8cd}blp0?F$1H5QJN6^?t1>I*BX z;)OLeCDpU>W_dwb31}!*Jm5)xw3TzMT;@CVC@rj?8Luy&Q#C8Dn56VKNAb6^5T_!t zrEK1!;%gvJysBG4*49Gjwl%h7G<2>u(cKOwxwp8hr@W~LXE7&w+8Rp|xXcI(t(E=n z4@2Aj2cr79s!|+Lh|7l6$$Yidm5_eb(FL~H=~psvS)U^Gck?PrAaSf?j@w&h;Fr`D z*Tm}!XXths(l4&tDe69vd$iam?wZ;sW|R`$DMq8wE?NIE)hC4yj&kUa?SWtIyTrEU zoECiy{H?X$)JPM36Z^||KA~@iZ)zs5y`8)`@5H?3BQJh8wPCw%&W4XuaP60qMwY|8 z;UnO|oS9ZxeZCdI7{ot+6g z{$*T_R3;W7hWui9kW_a!V%;}w2IH9bV5x8DJx243JkOO`iKUCXdbn@fuE9Pqk~ab6 zDQpR1Red~FAN$?lAX7KivkmgC^#L-724L@Kb)~@IWtp!_neZ}!K#q!nGW58o7~xRP zJt;w$<(C?~=)EEF`E`Zp#NnCEF09w}b7N52UeROg+2bcnEz}9rtD=i~S&s6^-+ZG> zHoPn?yxfzur{|>T!1(g6j-btS8`VrmkIR#qiRp2pq-IijT)xyyPLCTSHB;QU(V%mj zm>Cm2{T1loB$>UWxVI#bGj@UD8ieh+3JlLjc!C38fbc{o+=}oNC)|zj{!Vxa=927s z80NQ3Y8&0~nNl09mm&NDsa@#8FPGZhZYRIxfV<%pfVVmDmB`Nx-!HXOt&TGPRZ@F^ z8-7A+$Gi1kjj&t)ml1aBzXoBq{_i3@$tnM1geN=UFQvB4(mMlkD_&W9vJO{z8=MLi zr!R1_bj?IuzE_!OX$a52po}l~=67_A)Aohol?;y$!>bsE-%5K#_-ckHhT$~~PYS~y zGdwvAi;wV>Fr3Hm{$V(u;i+MG9K#2M;R1%iOEiyZWW#w;4f3* zNkRAm6`riZvw$zLxmY>X)l-{j;be7io(kJ_d5(rr(|Rx&N*WlyBBvy=u&>2NE8Z}E zWlkkdfG@(%m&VrmuCR>=yWfG8^>lR*YV%vAV8J=vI;o>iPo%CvG)dz2@O!~us1*N^N0uAghnvH)z+kl<> z;A&@KQxitA=KLPU=SXR1lZ`d?WPGm7>BLHfckcM@kuUO;M9cv8w zqg0#y{xAv(vaK62r(T!iUN_vf4EGkN^6UJfAjpS2sWm*Yb6k{zUC@`-A)b9+wW1wg z1n^7zIR?Krx}Bm*(&O0dlxR5UVIMaS`IClK=+mxGX{TbG52NSa^8trn($(0|UXHU2 zl#DWNkj!ZBT4*9on=yVc`U7>Gyc0J>s__{>>oCj9MShEIgBm=>=SexXxLSbrdFF%0 zQIL;h&r;PE@RR++5NDs4gA>RH-WI2uF%fQ8vUe*{ciTGq5~WKLjeTn2Bv_touxcTUA*1nGAQUuKvTe6i3sLm0kT=$j!7Uo7;^5QZ-n`eq2j7Ylte zgyD;Yz8S*s#X{c0&?mf z4gLg=7w=c#2dWcU))<7EovLJ+@z5;lK|5&EI-$p2yvL5Zqe=Fp6EDQ;O2g|mc>Lu! z@K}S_6X2P=v8HN@=~rk^9D7@vXw+j?_UF`J%+KjBz6QcN`ru!mO2@R+BgYC3ppN$2 z7ws3<$+2#nM?to-82PepOYrOR0Bz>rd2*b=J3hek)w)+VO%gEX9aDLGa*|1NvPnZb z!?iWED|yP!gt#{UQ-l02Uu1*iI1B2cHMmm@;|CWG` zTT}Y{pyMj$l!NuN;G5Y#GG$!H_RI}oDeXyq=Y=rap$B8qQG&V5h4`QmUR9`IXCcr0 zFdf}K9@NN%2&#`mw*J|`vCrkMJebSqv-NSKO^Ij)=ja{Zp>k^)T9xp+CoRE=VosTl;hD*Hry5C&9MP zN8K1+fVMu`ob|~uKYC0(f|(cUAmg!iKiQD%>s8T?|CWO}rxph{AGm{pIk|A2Zm_6J z1I?tBI}fPio11Y>li@qd8>;c^)X|t-;T(lK-)H48Pw44a>nsdy%wvR#53*2l#Q2c` zeYzi`zKn9_LKxmbhvTz3qh|6{<6_;{+aX|ZPU1!2?{fBiAw-pTG2=Zuw>e3j;RQYS zFLBye{B_S!**WO~2s-r|>W#;fOOcO-6{f*12aLGduIc?D0WMOzupcR0J*Qj%82>`J zFIPM8LcsXv!ml-DF`jg}`7zG!Dc5jct~dAvM2B>x=TDlMzs0{PC4XOZd7570*t%Q% z6$(GL^d4;SLE&OHO?!b$M*>#k5E#^uM%VU`O zpJi^by{TZ~E=YwJQXe1H@8xoJq&-QUd z`^>T|@d9&NcKgPtx~uRSp1nU?;QYX=!90{3DI` z8ybIsU)!&7y*OopZATo2IaB@+a2VF#SoFFTH_UZ7whXS|*_gBEpvJPv;oQe|NntVfBLO${y2fm#z{|(;h7ZjN`9?jyFeF|-4jtXmEduKog ztFX3F=Yy7973LlFdOqVxh>-Dz8@Wk9>9 zIW;2`XZm--M0%B+#$?psR}sdHhPz1jzbmKE6P9WD`6u&Eeqz;1+FIuU)A2vTPujCS zaK}d>8}aJk;#! zdMq5mVzKHfJwKMq_}OzRG1rVJJ*Sq(xTr3p-{u>j>-k5!Zv3yPYc%Cl)OnMlVc;6{in8*K!#BQ@ZybYIU#mXNH{+UwEZ-m0 zPEOv$98Yxe^LJCcv#-6qJK1BMseTYZ5cr1n(s_&j5ooaw@6qM`_1`9M*7d`nu6l2) z-GlS7iSG>LMHSc3)3ONX{KfH$B|Nx5fjrZ5%OSiETmHLoqa|vafrtBjNw&%-0t@>l z!nLEHfQAsegF|`MeyMS`-Sk|+r$`g}0iJwj!i?v`{k?W?K7EQw@VDrT9fH5qy}^Uz z3#8c&^`}qEc>qvT!$nN3UF}Wynx=eZ4?6izlQ%Ko+qQM#QVP{2IQy^dTr~G0pM<|d zGs?@6eh{pIX3FgUMp~%{-+;fi zU!xrG{j6`r@5MZvFrL)>-Eck^#pi*eYc(w!%Fq8UE#y}WgCFw9t|6l?x$E3B^=YsS zMjCrIg^SPkXdN6PxkzKnI2pRYwLAQa)}g_&De$d+Tl{F;K{6D$cAOE76O%1~V|ADL zMdRfN2hgYgH|1r0HIjEaQ&M1$H68yYS@{-pP)>$}FO(CPhqnDv?QM>14P4vSRwnFk zlss+Yv<=%OTia|4yz9SJ+eDhW{JqwnH~m>ne7EMfWJBBS{|=38)9p>0T0JA*ZJTEH zYlCDb;9Fd_C;K$cQDnC1Ajx;y)SlasnP-lS2Hv;RH=5^fZJarE@-6l4zefk#W>?cT zt{zd($oFWT50*Wg_IV8bAlq^({xbPKNcIG-Yr}2c+4CPFdn1jd$L62CjKQ)m@U2~r zrXwc%0ms@D<{6EbBjeNXY`N*SXQD%+t&9E5l+(d7*~yn>XDfey;JI}nUTWF63k5jb zcdW;y%B$+@Jf^d2ac8`t8~afm|C-KPS9>CiH~w@>Uz?7b;P}r6B46z*cX!9tp(c*| zY@#T?*5{lKeEOU*$O?VVgG^Y@simHc%Qzo!{)PTF&igfC#`B@SO}S*4{Qz-`9T>lj z;>)_PvF-oycrSh0js_f^*4@?KhIM_MV#$mK`Jb${XJ(d~d~Lb>?Kl7CHn1`?eDKcoeI~qIyg-6KTme zJ(uapEEBfv#Ib>G!w$$-*dEv&1Kg_qc-)Eew!0SV0a+$1GNB-i{AT;tAaC{HV+7lo z&xGi*686KZZpR>~_)GbyMP8H-TaP+ZM=N{v2orBk8s1!kXL&Ktgf*`;T}MUJq`7Wt znCM*8*3;F=F>QoIWJOZ+TYemlveo181NBku#(8z#Z>41gN1J!HCEK_M92*F<%mgvK zgiYzZk9%K2ES@J6j*X8*Sw@~Z@mYCMLJ#};y7`L}2(+f#DrO>pa5dNQIND9~-Or07 zPpzZ+JJkY&`4`HQFAWH@9VllmZX@FPM_k<&zBDOZEyHY&5Qe#Rz^q;5*m^YJ{0(tp z(yG#9y*_^R*;;{Onx_Dep(i=2E@(Jk+p8bhvi}oNLu&; zm5=5L^WtBauP;f3ui>nRU3;Qs*Ox_r(@qTAdNVl`?=a%cZ7qF0Fyoj`5p_-!=Mk0w zW*^S)C>xlmfvzdcgrZ^j-HT-%f&4-V!VFX(;p?2~lMa(B|{JGS;!&tOP!9V^W__Y}@MrOiF0jhUj76gXqqk%7&O$CIrI%x|^#v2VQw zw$Q^j2kPSKpwCQPMP)ZVodV~BgF1fE$yrgCemtWKF9_zyqKXPAU%NZ#=J%U3KwI$r zCbKlfPY>U_&P;2&|0#a<>kD9>upL`1vZ!Dt6cS>6ud^KbtuJ70-r0bq+W^u*nLWoz z7sza8Nv^nNLO}=Rlzozw)3Pjbs%>hQquy@Toh~5IP4;K!J9OImSsQeLsh?|uY@D@0 zq{l~nFLd$=>YGw*|Mc`*FKjT#(srp3r`;}g=&|*(?RJT&mutIOKHKewPP(8Tsin9T zNrj;NgUvVZ8Sq`X9yw!=k3{V8!Jfj5Jw9B+v_XHHmewR_xLdE?(t#R-Q&Zs zyT^xne%w7i47+=L78G{M@vOdF^@RU7%O_JA$R!f*Dm!_nVd;mG}R z&vG-3?`c7$2tg;nhA9|lQ?ecU{mu~8&1CzQGqAq3-#N&K*P~y}Hsk12KeNYE1CxLm z8Sr)Xul-RE-_rKGSD~G$JHF9$4r3^LQ$_3LapqfwGSr-|E(=!07-gTnKxSC$JG_uNcFl7&g8a!}(Zqo5TQ)bDI-TSFYFjiBs1x5)UQ@weuJR zVcGP)*eLllKK(jI;8?YiIiaEQwd3#GEiI1CwBzqP0LwQ1=K35Db-B}~cWq~6vAT9< zf+s6o{rdWP5zeBBsfJXD(2vC5`-HmzOYak`um4k?|tPUSn38*MDASo!=d!JWnkADN^4&uU`+l98r=}*9;es z%JD6xU<`#$U;6;sqQAbDyrbRyh0|vJ`+^ZQ8j!KoyyIL2=eq4&1-}t+j)7}cIj{V% zq9Z($=9dU_&U+!~jIe*Tb(7860F~8+B^+3kRm{LTR_r3~tyR9=Vp7v&_+1syHRP&f$tlP6?KoV|wQgw=+zu-@esj_H?fy$n6zaitX3l~~Rj zUXk}zs9Sde>peS@m0b-@DSInPSB;c5wIwStGpu>fxcN9+0as~&fa0#MW7<;A7+N58 zrR7*Z+MejqEHGs;U26!_2Rk^hZkf^7(9=|0R@|CsJjU)*tm(p84_L0L>&QHoSiF+9 z-tLBEV{1C9ljkyvYjHG1iYLtL%yhV>Dv+ZKG(3eTk3qjK!M??&gxYJa4t2I|xLo6# zeWvvd$0Rx{8j@T-V+j#D4jca@YZh1b{C zIF}RgwFwAf23=1`ad}PY>_oDGH<)Ddf3+^Bwydn7tsS4iYN1d#2QWA@=H+O(Z2_BM zz~ePpXfiu21NnU`3!c$%RX*kUua2)_+vQzL6Xd_Gc`1w%v{Xx0R=PfxavWz$0aGk8 zQ>>8wF#)b3C|iOc?{Qu+R?(~aRQHx7pwJx+=`bT>oAmxPf)(tJaf!yHiQ^M)a|#!SoG8U-v0z> z)8F00a~?;CtnEzMi=DudotCynQ-AWv7u@&0u)W*%g^bH#9M(0F7Yq+(xTn3*#mQAT z4Lz+*;a=)Z5rY$#!x3)m#mT`=Up4}9IKC>N zZKT2p!=n&xZ*Cy90nT=a>sr*=W%C(}d4AkUh;N{wZ0t&$L zQ{eF!oo<57i=RiPBMxPDCKl_n1Ayi~?Z`@jJsT=)wRN|pxg#ha`EzXrzmZ4ymRd%t z>WzrhS!Xgc-pI*wMo#+8uZ*YYWD1=VjokG8Sy^eSR>uJqR+@ZL3CjSg{AQ+%L+jdF zuyO|7kK+CBKz9!AWoS>Nes_8v@uP5dC7mst5QS?z;YvVWSiczB;RUB1ay{dRuP?t$ zTd*wZ81?NX^PXi6!04_z>(n~>DQ%ttLG3x_co})Jk68x2t-@K>R{sQkCAF4e%7d?c z?8>&zV-kU$7YT2ywC`mobg7oCm2W7(+wnG-U^h@hBVY@0> z2mzK?V>EB7yAwU=PCHxbmg1nS4(k+$y1kd?(K_+=(fKLjY%aE}u{w`P7{>w_2i5g0 z>`kG-rk$YEM#5RYNiwgkbK(S3q;lp|`xAz9HC6kmf*s!CJWUm^wLsf8;uqljS2)~t zJcHeqUm`)#Dqq^WGQk}w#aMQYbKK!Y^0otHI_R;bzT9?J|A1VoMDb!Rm}hv(Du;=D0^UR1MQQw4SzE4j~aVM-cpAf zTj@oIGUx|&Fmj%9PGRQwn*8A1IBL99-&MD?V_{dj<1Z3EG|W?hEl)@T?t@o+PP3MQ zObq8a!6}We?I`c;ecj>P2+KF8LvT6fL@QqPYa@B;JCCW)>~2ya$ca3E!|?WK%rS<0 z#Eo4~P2tR8abA4i*=@az>YJ7G$vucKh|B_o!miry@H{gCqiHp#&b32-0WHD2l~V-e znlQ|Tpvcf>4YlKcdrFb9*=#r4Hnk0lQ*7>tu)QrP&<&j7Yh^(V^wjvlk)a(zIQjz4 zA7Nx2=tSk)Kw- z-ZAe}Qv8LQ)}_6i53x!)+-{%f*BnY|Qpqu0mkb+1R8 zHQ-zuC%K+{2s-Rp8PDRKdmuQ^_$J;lRV{y0@Z7vN5YLC}fcA>^2jSV&SC}iD^t<8Z zTI50gWmzW~p4(PiIs*rd;>3O`WwwK^GEh*8wuzsba_%*4^BL<9p0lMUnW!I}UxmNH zVR~?W72}`>jH_(JjGgUU7(a^rmF~>z+ZJk_VthXQ07!L;&g7?^flfT!_tmqoE!or1 zvsB%0VkVuGE`0(T$HCWVZ`ON;@%hF7hoYObv%igJ;j5Q76L_494c8m%wbN|(M!>Ah zs`c1LmerbWyibd6!!B&kZcE0KoL#ir&{N|~n|@{Tx3cpegt-=!wAi)HUn6Ywg!BNT zxvd8?ea7}M4tt{8F?d&fHN!aj1+#_x&Z2#29DEf#qa>b6i`L@QI7Oe9bxRL_$tfRs zkvFA~WmhLidq}q@gMi0xkno26pm6n4ZtozB$5q)**zjct(vt6X{dz9Kqmh zO$;rY65q6qN{jcAMt+m3%)ZXPUTg#a&q$L8`Pdw3?2{u74OwVXWq>BT&&s7~OXNlR zQrD#qmOR9By$tn5>roXC164B1Ge>cjoSub+{86vLD1W#^7uxZ^qSstUX>}G}VurrK zz6N*raornj>j=;Rxzc*$T2pheqSFVfWp9D80*}X<^2n3Gc3ZRV^qG1b!~27D-A6ig zN7?H=1{)hGZ*jUaJf2!hx(yX*e`FNO)H<%^eOrVnV=+a$C)*)RdEY+3^Ye(qG*&Nl zJ)0Keq(IoQ1RcM?*Uyor#XPAv04V84*hR_*#JbI^6G7{g**`9;5QtcR4EaB!~7jG-(>h7tHw$ z-V-?B?SS~QT?#MD)a4NMW%Y_@w*DONh%_g$wxFRMAG=5gWk|;*d-@uaShKC~5Zy!5$qj5VSb#Q;+^7jDqd!YH9j$d16)`NK+jJSYy_+^&%jB=dy8O(#cAm50` zJ-p1L5Py8^n(ZuOAnXQf3K!MHn=oe8>Kg%2a-?WMKjzZO{e^t)hWxWnn~1+HA-xCT zH)v|;?J&sNA&BczlOtU{2dTKNqyTYzP70BMyOk6n9#xgatqsOsz)e{yF0TA7wLAH>WS7OS*3eE)Xm1-{m4q=qp&184K)W9ikqh#PR zn*)5xKHFi2^G-T#e1&Qj}W(dtPx!lXOwOMIz8*vc&HmMNE^4rRhZc@AXO@Qr0@UTIxUE!UHI zrd;YH@i*!z6HU%_e>~aLs7G<|f3mY8qSGFl7Ce=P2Nji<6#`kj+ z{hH=D!nV$Y9fd#Ip9TEoEBMWL%kPDF-^WSch;UT;CX+rB7V0+a_3#*+!Uo{-H^E<& z*&LN;n(ZJ>q=Wgl;XR-o_Q%p51+#PwH)S8qGEw$1woJ5zo0qi_m%>KK2*^C}1hT#* z)DQs7EVTjj?_>)or!1tvc@u@Z>rf>&h2Rc-_v>B;(fHJZP>_Df1J9Z$I0`^}i zF`FD`ZSp&-Bu<~!h29Z z$fT_w^GJtT+O15U%ra5`eSoX3yd;Um>%Mw=#PU-d&kJ7vZS%=b7}G zuuv|ojXWE;l!^2Ci!v{W$}>$KNt2bwi}4=N4tcb+v+Q)3rOV3WB`gzV|In5Rd35u# z@_4h6N6MDF0@NcM;%PHq#MkV|}?4@N_w4nt{maWx(T;E~k_q+RV!h zJY7!HDG5wn8o-qw)_Eu-z?EYRDljIG8e4GEJKo0c^O$dAB!Y_P(`J4n=c!HwJ5iCdV!g$Y>G!!m!2bZV!8 z(ghvvX;>T&T&M_z@>eC$oxKxUzWxESQhhGh4&zT z#95l6V76>!OOfv*Cf`T#+X)%uILeHx=3u2MZd}1kR+Ii#M%cZ;V>_onATRVke+if# zT?N9SwL-ytc?@t@eyLYOAPc`jynXEWEG-9!1y3cyAUhSH^vaG~C<|5|k}5-A9!Ff3 zby-eUom3uOMwmY%RsQ7n6Uc`$WXqx)J&8Zcp5~V?Pa!-uW$q|mSBZ}>&NoqQ8+ln+#iM07@Y|gH*k>3occQ)YmBdeK* z8LRRA9OP$p?|Fo+3={S{{Lv42fxmo3-@$mRyT8XfW!9#D3E`;pe=zAYVVUFNu-s60 ztnd6H@}ZybGJf$Re`FZHui%$?GcEtrvq|XBWt8jm1(XG*VLgcVXOoAjJNy`1_b8aH zm-S;_M_SUi2EVFI_%T6!keBsi?v3!PUqu?*UV3h3GkFbh*r~>IW;y>DZ^j*w(3u`A zpTT({SPFtIVf4TM1U%*AsFv4$%^Qewb(3>K#2biT^Cs~4q}zJR9p{ApV&G|hO;)*c zZ8Of|R<@aZp)6;%O(+xV7$;J7urAO_x(>Rs{w~Wfvd(u`*560imQC1u_@k_Uz+b*X z)){YQ{Uf})vi>)OqtgG~q|bzf^~!{0%KC@MhqClBekto~8OHA?_+@(1#y|B$$a+wx zG+Af7mG#d}9;)t;Pg{59pANJ2va+~$!CZg zh^+qucuLkyV*2p^L|nS86K^20{x9J1Ntbmy|M_nNPm}e2WzUuO&5XR0H?F*gyb9%F zW_G(C$D!1n@t$O|E#9^8Xso_dVxJLfq#yk=?V4bKV9VsY`eS7sd9irsK+3Egj{(=l zyFNbC^UE*wgrg2V)Dy;AJsE;`%9qV67hx;!Zu(73`b=2J4?8yHiXzI|rud~UY!;Pg znw+yN(!u<yl~u zSwj_GdIRgZmCXS=DWjc5ja`QUmMZsKdBYLMCtaQ?TO5;aW#EoHXXZ|mnh_hyRz{m) zK6$Fq6Uq&JAIhDTfsrUPn0rS2HV6}s@x(h?NtL}XM$?ZPxSo~!rJ8HQv|lxU$|QZ* zLF#I+5Ll3s3EVU6b8x=AbcK?!;lb?SO+-m}-qP zNK!r{PPQJrJ>ucxx%HshX84SjPuBmWou{Pli1fA5-@bd}@!EQ@2I%{T|>yq$-6j}F1 z8hTY-%G==C^fb0EO($R-NGgBUZC6t_%Ghp(zLQM5k46})P*dvyy4a4R0m0t0zU4E+^t>T3-4^_(=8uW z4SG}d0+4?>(v@;QpXO;}le?#kZ7?)T8<2k^BKXJl*&8tMRxJo)-C>ITeGq4#ke|^N z8))6NJ+f;rg4``*1EnkEeBG}2OpN7gMN1(B@d;3VsNb#wLN$E$^YRrx^xWQlc&8m2 z1;4?rO&F)@sAiX|n}gCr?ciEs(u{7(AMfyE2N@V4>q~RA-0d1qRjO3Rj5CGwivy0( zcj`v{$pdsFSaYK7^#_>egWk?9bJkV!yJoInE2`1SNvM0CIa`A?!jAfr9e(Tze)L=Z zdeE2y;z%RNQoPU9!-4RA{FDLne*6?AFXWGv5teObWBAVb$jaB!qogvC6kQfN0`$AI^Q3B@Umk_h22}b4snUb@UlB4)OvS zFH`09ZwJX|+QAtPZCFd5?hg%!&l@7M;|E|v#;3_FNL??PorwhLc5aqa-`&Wmt5lu(Z*S7b_O5p7KXgDgZT)DRV00@9fy9d7CY*qv z{6L0tq&p>?D~nW^J~8{CLsMvrXZXY$AZOzbSht*wKOjxcu$FSY5z zEE_*PhkI)qO|80l$l(z+_d%C=Wk)v4cp{kOq@ zX)MC*#vSmX?K2iHha3{$KMBcJD;Ek1rW6%0s?>>^Q(B1IGYjWe6dbO`JUeb(=HxNg zeuenPxZjgf~QorDrzEEuB;CQ%_#pZr>^x* z`TVeyS!Ni!KIM?7UpeLAet0E!tOW(Fttqo4H-3G}Iu2!x06)78Pn%6yS*BK}6lrDk(O`{I3_26CoK0w{8}2+JMx(VyOTMd=B2&0^>b<}s>-V8X{+kSz@{?4 zWkG&=J;^Buhvj;5D#E9x+#BAw(9YfQ9>!d0xBK9ObI2Hsq@O<1mA!uEhqI@kP?O(3}I%G{MB@qpsx+Uu-dCy`KdgC~)uWNCIS?b6SA3+3IN}t`!y9jyMxsr=ben+S9TAjXBrS{<)nJ3S3 zr8}sCo<-MtJTE~Wd6>TrN_J#?l#NH03C^4#KgtY!`yV2meeyH;vq3ULeHaIu%ZGcK zXamnSb>w@o(Sg7Qn(w59RS^cB6Gq+V!#o%U2#+Tx;ic2?s!zpb&LPpZV+`EU+&QNc z7ghvzlkwnTSy#_u9xsUR5ehcof4EwTv>H&#<|pgW)j@n>#uf9>=h`ql4k844XST7%pJg+|j{sIm70T z4u)$OHg|L|JYR+N*~1JkP+@&X2g9u@JW<&)hPzdGQV?FE!jmCygSQ@ry~@|4J(fv) zR#kP?-0Di4e1Oxha7t@^>HPY5O*J>e*47Q6LHbRP7Fp|?_8?8D#s8B$KOH)k2OD*x zqjT%Y`-rAU+X_6c|F&dXSlwt-ZK2NjO!QdQFm`qq*k*hgZ&+ej{s$j=QINbOYHA2NNp)E?l5Yor#M5#~Q1;qgv* z0m9agV)|BuCpz$MgeN)SB?wPO*y_g3|Ce=xH2%NJbE_LG{y)|Ye*3fE)HqLmCHiH3 zFD4d)6vvCpXVuluf{f^UF?HPBTAUP6T~~**1Inrm40qou{Oa1;IW<^~QeRj+i?Yjf zF%6qjRZ&&Jl*KqHa86yRx@!}Cqm!<*Bwkoa1O*$UVHK5?r85dExyNsa`aaKo{wLs@ zN~v6b<7VMI`MgQ#vATa`J$Wt(=VMt-ECle-ve<&vF6_$tFlb~g=u5*Gn4PVPQEc_3vLlc`uY%Jx}k<%mdmjE zMvMN%v{SsIt}tFWx3HqJun4``{HasI_DX}*)s>=eXF9Z3CT!9K#dow<8mw^ce3K{I zD-Bj!RfaQ!W*9iyEDesdrp&=nu*oo4Mo!S8>1k_cSJf+;cm{lGJ*!HqtFqOFuy|qZ zY%H8Y-jth7;ro$)zW{HYd@3ry0s#q`UKL%ddrv`gd)~EdrSNk>W z_&mL>To;9(Q2L_Io$JGGZ<);r**qNWlLy*wb`2TZ7^kxgej2#2acMkC zr+od|m^w=uEFXUxybl^qS@nFLy{PADo>Sv)d*r^RceRR}W0gh8#B-`n1FB1U?fx6>!aCEIu+CZLS>{yDtEei`PJ~)u>O>S+Tla#)t9(=`rflG# z;d~zy)89||Zoj3fcYI4t+hb+2=H(ca_xiXKp~_-^`$v>TTjry`<=Sh?&hHg3!!xfK z_mYYW&l_i%o;hz5H#+dpan(kQ$2sI(eVs{t2(FR8KOlWflmX?!U>sVj&jxxqj5lJb z_5T&b=a~5gHE{>KK%Vlf&Q}#JCQ!*LI9(4$^GWb2x??5a`z@rVQ4@>Ic^-y5UwYwcg9p;2iVZYv!mv zQoOb@tLNItA76?R*cVumSlHLnf+G%SdZ#|dd&w=OYn>e6UK(|=SRW$ic%U(v&Gt`w;->*}MNubpx*zaQ2uqOPtT zpx(RsQ-kodX#QayLtV0kQEx@n44rRk9QbJMGB$7HN#&!5xV#`v^U+7#0zDSPEj6ub zGd*>K@!jwtIy!LtCy!=EUq;))Zy7O_x0V3RtM+3$24-8V{nmX!r9Ozp=^uC(fx7d` zfJmSIzFpMU+^p|nAkWy|gB;q>4ypXf!ZRz&8-F))U?T@Ma$q9|HgaGi2R3rx|8E?4 z;{jiuye=jaE{n-SGh#C9teEr_i~RQ7m=t4dbIJ8F>A5u~cP{efwC$lOwM`( zXVE|E%OmBUl;rzz@-kn(oQZMQM_7lmIc_;A!ia9RCl_ArOC|7L!TOy)UEs^RXL+*k zPBGd49baC!1p5$<^X07DMRsiUWwT+v9R5K}o_yPvwl89G&G)f(t_5_K_;U43oC$us zC;z<9lgs`na&I5*0+<|=-kXunxyWOZ$j?rQ$vc1b<)+_wGBzhByN`=W=dBpSp|w z<%ifOp6AQRZ+z(njekU2?+h8({Xt)bpdGJ*9DMgs+?D!A>)7iS}a$Is&L!=HO{;x-aU9$z0@dHDqqsYo6TjF?e^8FSkO5 zuinv@gP-%|;_)##pd%)y?HZHcE%T&vK4wPGhiv~TCU?#B<@U+Gbi~2ODLAv@Mo${g zL-{o^xqVMx@^_5Mw$ptneHka1*ZJ}r(D22!IHL*le-{%R$K=PP=|W#FdeD={!RIx= z`Edj4^Smz)o#xB#c_KIBcNet#o=uR8A44X=`y<;y3uNs5uYCFG(Vm>x2>BW1OWF0F zlwF81*(JVwdY&&wL-x-?yM6!om~^c~{4@AU37J^ajPE(8f>*xSt zw!hVrG0*sN!(N_@ALPm9M~l1&nK=Igk$-kzE@Tg1etRWk`4*hv_A6h$f*l%O9FxcI z_hk_D^oy4~`6=Z0y$O)l3Qt}>6kl6rdU9iROy=$DVO3;IzPcTCfP7zkP)y!N*}Kg0 zr1v?<)nB1Izw_l#@bh4d@28*U$&jl=u6teN4%Fc!@NrMH#lK(189|3ZPKNmMa0lA_ zu9z%4JSL|+De~seAy2Dtwh-j&wJWf8{C6T3ec{Oh$l@aC%lT+im=LKv$&+ttMP9v8 zP;>$~8^2Ar3 zd^s{En?8keOurwKw_b?JUnfGRk})|LakWJ;srhA0p4(Pr=T5Z2W1c);3tRmf`kHIN zH%v_J_DfIRtb>f*6O$$P!k(;x9#nzWCp=knzsQAXw`Y*obqD$K*H)2p_kkW%{e|dv1)4`u}z`O1C^yJTfLHj`GFI^gwzmN3g z?>EGx?Jl$t{lmkDdeZWqC!1}9zHpQ;y&rf|b*RW?c>lGJeBXqgzYpDhG$!8z4V!|mt1d!5 z*P-5jfNbms{u~T`U*XICPxvwhw*RniaQ^D$@FU96x1H?E*fqX*J3=2niph>=_%iNw z*lzeYm;W35_c?r@1KKz;D2A_ZOF~PHwhpx4IRky-10vr$Q)KU_ zJ?Q{`F~T=IhVNwf*gqArybJW}&;NDE9~D*+ll<)8l3mIEAFR2`@MJ*e2JHQIS%}<`c6!SFG63q z)R+7B_oQJ=OuUIP$pOE|qrb|74i?-AT5w3z78gTb7kF~!`|zRAj#puA(Ol$J^2S%1HCHk@zb?EOuhWu*K>s%vw)KA0;q~Q^ z%ip6<`n4~k{tmglz?1i2@3%h}KF0&TTyiz$21lWfYVhQV37#B?`t7(nCZB$a`usqo z2Xy4U=gUFpW0!yJ%lLC)7tj{}s6pQX8++koPiBMnSKb(tZ>D=P>{ieW-*ND7aZeKD zZpfZk$MZR4Cl23ahnPHoe(Y!0!>&Q^_W=F(?d;1W^kw&9!{|2nICA`W^e3>}@4|Mx z@Cwf6OQO9nNBQ1h^fi})M)bE8sOR3O*RfqOxpp74d8IE89D@G%_rBaR82D4sSIkZYvnA@#f={4Zg+F zeFc3J>U3sIz5^d*Ch~d&a(7M(_}1-9{dds^$DmL9W4+90@Oz7)OYg8Kn0$h!`W$p^cj-$2{NAR{AT`&z)?0~SJ$ z(RbYfn{h1s>o)Lj8Ti-v56pGHi@xz$U$!6V$wO$bJFsZ$R{UKL+jT8;Vvwe@X-yxfvlZ96=$;bcvAl? z&YFX4ckkj$!}s88wqdQLi6B7f!|)=jI~#tDj?RHV$|AwZPv5k18QAMgIZrFxZh*zH9^kWW^lN z0=a0YgI$DO>V61z{zTZ7S44hv7sei|u-*yv{KK*6JGaH%kumgJXJPD(@>XvT{|RmQ z)z9HC&xX9ho+hAE|3Y0apM*AmU3#*>lT)B;U%m>tf<3B`#i1FtpG1)H{1dkO@KX3!=ofcG|F}sBY&v}MPUJsz ztS5Kxfptl5VEhPM{ULPYIM}LN)}TLo4r?P|S0)z3w^uLGkU2r0NspaS= z9)kZd$(LoP#^lvCzPx-M<|{6ToxBg{T34g5UkkgNk8#GHkQ>t_(ZS&3%dM!PtJk{ISyhA;iet{>C zE<)b}Kk^XL^eM)IzeAsZ`JT1UKqh-Y2W<7AVZO{ne^Lusy*dHCfDS)80b|scFxLQ@ zU%3zS1+aTRf*nZS3_ty;nB2A{bfp+$#e30bpl>MI#goZbf^W;whi{5;!$`FKH@?h( z-F+B%*TavR{(Vnw0!`11N5B0IY$?V_yBz_a9Xi&Ee*G}yc{l35$4RKipRi}`SmgO8 z&K!m|sKN-Ey}et6CgwH=E44)4qtr`{88A$e;oq&ZTl!xgjPpZ*N(0l)I+gL9+W;AS;%>+_?8`N~z;7CYaRAz<{(AHsmqMrD)0~uquedYHz74+Q->}A{ z4|fp6F!!*VCx3z8)sB3x$GBs^9@ya7@F8Iz-diQoHw`ilTks*u-191tdnUpT!8TWb zwjX|jaqo|P84e%qKj8NZL(v|;gua5ed;AJ>Tn~u61D(C^N|BFH=bu0ZNB#@*Keu6i z?g@-dyU~w-gmEEsce5ifHfz8b`*Qebu(iW)zCFp(QD99mX-fKs` z;MIGOsd=x%c7dJ()aeSy%$HloWWi4{=7zmL{Ai5^ff;EiNn#p$6{=|1$?)c5C@y^#G z;8w5`Cu433zh7R9wuQ`o{7d+p_`U6Qop$5@8#%C%0~?njw1LwrxVT|QI z1;p#=?P)~h3WC-cJkser1qv^L%Y{WIG5%wNcYOw4k&|rW>qZW20EhZxW%@9VY*%B~xPJ2R<&;ljI}XRmUxXuGvD-I) z{J63BmoL*K4_^fEUB}E5tQx|Qesat=1LW76T$oJ8%Wz=kjP|A7t@>D;on(04h zw}3QkAqNk`&5q)Uy51e(qG4wu9?Llpck7Vt0LP~^y!UmsHR6Z?b&+^?S6gRN;a=e2 zGOv8jLx`ShU|!1{_;A4c2u4{rvM1ir(5><~Aq{6|g@b#?J8-@y9_DkLgEJCeNH|Y$ z0xH0?3H;f*s06Z*w`Zwz3~Trag0D@yPg$kKXMe%xe)+qTR@2tp*3+x&)*Zl~Ltd8l zMxN=R^2TR5lm5Asyf2C2E@Av(S%{*G_11OjO| zy)_aqf#aN(;_fnB-ih;%iPs#7*TbCZTHBffUN$*+VVfj6ail7%rt(@4iPM`PZ2&18 zeByHGk8zp5;B%H>d5_?eUC<`F?#SPyJ3N3N6Yz~`FF=~%;2A!#r}3>z-vMXR&&RLE z8Sb-P3~!SSJ-S`yM#6Eyafhb6-hoplT)9{S9XlDc{Bux9gO-cVmY%M@ZhVGTb+5s% z#yQy|4T`zajf~6^6J`p>_Hfwm+Rm-uLb1Arl@Pa zqDk8f!hfyu*j|-w%llPCc|%d&8e5(&ZiC8uJEFWvpoz~R`bYi0Im*LgdsDy4Y8(`> zLFElnc}!FFJJ|FAxuAhhq5e_-4@Y?gx;)(n%t$188jP~ib*&BEFeKz}xs%3uRs5x_ zrS}8lfK;pU-4A!w_TLXsmMkviEe|wd#ebqF+13bCtmLJ@!J&-Ue(gn5ry~Kk59@S6 zTAft4_ATl&2AN;4@|=Z!z}81eG_DBYA#$3|Ne*6Em+qi4R`zXPZe1o}oerNXDYWJp ziMo6oRhObJ7OC2%)gq_%`hKi;OlAQHYbfM4#wX=7eSTaN?XTY^7FEBdu=Yx~)vXre4>*p{BPDF+*S za=CGt*niuH{JjA2h|=;OhXN>J;VDP;6NpFoUu6^E7tLXxLS_{u{|gYmTIG9rzdWWN zVDX}O+#LxIc}yXQNFVU<<4AbO<1ZaJ?c}!L2YgAz%VlXW&1dZ|u>ZE@Y8loxd)a0H z;Ca{KG5yT$p_x2xHYY}rzm%1TC#wvX1NlUi=d1nlx5mL!{8fdt1pHy2X!CL4s@gn22M_-pYX&hO~TGs`@KU?K{BF=}kwucUN=u1L=O+!>r8g_;gSp`|78v?b;GqY1rAKhg_i#_ zN2m;CXAXkQ!~W=Fx4wamQ5{l!J@BXl%N?B=WfP;j&Sqog1F#G7_HepZe|=JugO{yO zYIShd#h1Bhxb&?sQtE7~N%p4mu-w6=Tx#5Kj7Oojbs%k9qCQx;pVIeZnQMS!>xmWF zeI4;syh#pTdV7s?VC+k-f?U>PZQSnAGIZxTIAOg)_)rHPmZQfL#3KK49h|W4OB5_861G&qAk+ch!?JO#zM<_a z{MvSL;4~j9{g;vO-XQ&F(eNPs$I);_0PFQ(7C18?{9OmGR&Ur=Z-pH3R`)pKx$PnbZ3AD+fkfqV0{!hsGqx zV+k1G(xdT`tfr#pekULDVY@s;NJo;5M0%Gw=}AKY!5AGAb`Rcc-XTou?n(zn{;dT6 zz6<_gxw`B)TDJ?+7(1!*TY)qhmgf_u`!ua%H%G#>j@{_MC z#qbfkhGDnAy9ctyrv~-45Bt0P-4(5AKDF-eCIFHB9c3xv$=cr)0J%ctyGOr1U!{Xb z-P7aA)G=618jkUMIf)f-L@TnLE_ZM!D;lRu-6f`w04Lr82amk^g`!dOPV>sl!5W|7 zREJkPfLGmnIJ~mMkMh}xWKUZo1(Lif$8W?_z^o{L>ErJ)h(AN+drZH)nv{+=n6xxB zEo#7(vGdxRaFwj8<5UMv>7T-DPc$d%+L{tYnA^jNpNbakGuyIv0&P1ZUiH`2&6Qo9 zE#+N3Vcp0-uq&XI{33kp zCMxf{6i>Bn3w@P*WM<)RyWT%amx8Sn!800kuIh(QB5p{#jzhW^RKCmA++jY-!43eN zuCM!b*4e_XuVmoyc6~CVYR>`(FSO%fT`4~{AKH{8!knFDd%+Y0u(02^xodgJcW~S` zy>VLr@SLK5)c-tBW!c`TZK?(YY}i6AibN#8Hl$52Qh9f&Hf239*Aa|s$j=BkO_ZuD z^~1u$x-JQ*viz_(tZSK>Z&;%RUv9*_g?(7pynURy24jI4HPvOJ9_1u6E#|Z0i1uhhb&7`{xzZ(7{9J7i!`yH^)3+awRI&ZAzP1x2b zTbUKh9bNXV$V1~EH7IPG(EcoU;FLejm+r1!9BIx^a-{zn2PZ7A5kr$6-0hKC-c=5+ zwP*DEG_L+m$viJl!HW&6MBTU#suX_HTc&QIth6gSE%xP^5^tG4*|h9J$^&Ayh_ExnboGrnBNiyFO*~E zHqk!hAg~{_{wqVHlP<5 zuA0x@CjC(X-pgvfEv+n7Mva5RGA1Ga7x9O#Sw1&qu(j`B&aA?t~QF zG6$FCYaLSG62@aiLa()11=;Z?xOmgk@U%=QjPX_=NaM8ZcoSSa`U@d{V#C&;jh;cK z3laZE@W%32x3MlqD~w(PfTlEf3spNfcoSSa`b#>$g-T|k+MRx`#bJ9#{aN3keHS3( zxr79ohrYwAiHhd5aTOh(7Vcbsgx^Y?ig>cN1?$(N@~2;;^$MpLw!$PR`$Ij6g0m5*9|aDa zb+Kcrsk;GyXO8|+|8oqwCR<(7#-ZygQ*7%mRNez0Xv2~U zFM14GBYUF0dD!2NsNkEwTi@!s z397#9+t#eh7?tmP%2w+3NiOZ~Dzw#6b!L5{@o=lXVUCsIXgpqM5Z0Y?Vezc4V0lOb zZ9Ma#J+N@{W||qF-NpvOGu`3MzTizh2n=`=Z^q~SxOQ-X%Q4xy_>!;MIn~}xP}ntK@uV3Nrsm2Ojnn~)!#eB@Iyi2(b1JN(g@^qtr#=;F>}FLyw3`+$w54=*5I#K2Ou!3tD4A(4BMl<2zcTiL@ z0v>(`Er^7N-$A<_xNCQp?F9gyll71Ke>`|l07oW}wYtWJcDnyHZA%jE-q4zoqZ-DT|o+6FjaMPXOv(wEcv^{BBuUkm6-*=?HHhxq$6-;^Asq&4}o9W>5yfjygI*Ck>;fzOZhkNSUqw8a8A zWr2*uTN24Q>IdjRWPLKyyX&Y~ew)hgA|)g2Gtj50deKH(80)nRb*cePFne;Nra{$9 zr|C*r|4KWpaSjOTW!KWp-w!}MkLVxu|1{7g2RZe!-zOkvL}1w7BG1I!_9myj(loq()^pCkyil_L+|Q*~?< z*7Yq^W>vTEnKohSZ`yY{`ZJohl!s+1|9_^~5w89v@0%Pr+ou3wtVLw!7hi&R;Iy|BBy%=>4ZGx4V(;T?d)+sVWIkkDD($Zl zpsm?fwhTAD9ha|(h6io^t^+5pXBxlb5{!}g;7HEkp`I>)AwpCzP7CZ#7F}Hxq~<+} z!IPEmD}eHlDkI;S^GRJ>cuyKm0mA9}dVfDSmiG@v-E9=r@%2GHsAAS?FIBpw^ zL;lpKyl8mPhFl*NmEN{tel$F2L$2qt>Dh*MZY39EUq0#jvZiQVZMfk&Gp3k%U#$9j z>N)0!Qr3l1Z(N)Lg_CM)sW;hhEYGPo7AK15)SC!+z;o(N1U#^jYog%+yJ$Y{Z z^_2$zfM;i?e=CCCtWtb2dQ;oLyOQzoL-U!kY9FB5NA+jQZXnW=o*V4qWTkkW zpN11t{c&G!!klZwa;SqgAJRcuVJ6uhs65zbT6j2)Sd0M@2BO%9X!qgW=HS^mMVyLi z@bsF7Uf{6I8v-v}Xm zkQC8U2(i2EZtd1q+wN8yVG$N#5klC$k`R_ci0>kVun4&?q9QCp2><8noH;Y+^V!+H z-{0@|KaZV#&V1hQbLL#$=Q3x`%=ATo>$j<;{-22d#^Y3;ft~Vc@bdD4amP+9oun%r zjjfxx{~y|FoL$ur_No09?iX#MJWjPMwfjy-=}vOYoAO7DE-T5+E68?+ZPKJX@^uFi zZ?!XKt#q)e#N|<~r)%=vl%38U=m+_fNuphtiep?E_es;S`JK9ka%TGZIJRqpQ}vd3 zdObpWX_DUTvI!G&OZjH8%5sM1C;fW2I#y=a@Tu;*w7EK>B6iOhs=aM0FEKaEbY8XD zPOj^_g|u<~u%EYE@qT5ly2uuDO_+p?6HQzz*|V~@TPdzdju|5wnd*X*$tJZ%?L-q! z8?Gp2x94_xH#iIO6(y)P*&B_LxYwLEHs!+UD z)=B)Qx3AU6o;G3b(MoxyvgVDyWbvWkjzqT$1b|+i* z!$}&Q)c&wxBRZ})xDg!}j@o4xjTeT0)e^l2~ z+f$8)e4V(urgqussNN=t7xt5FbB6FZQha3FPEU3=m~zrn(vnrC$z)s9MI)09`u?oU z&N)}a%Iq3=={5Cd*P)ff%Iv+oVow&e|C3nMQkFZmBwB}2n4;IRQ!({yH8y`a)^ZNp_QA>eC1_0iXa? zo;~5;Cd^Kz-p1KYrl+Ggy0P$3#$R&FT3YJ=X~ePPsa_o2T#}7vIO(7^#AJNn)oVl2 z<{YB;4$MRMLKF76ElnH4ar!uE;YM^^eOwf;lTxo2Z$!t1qyEjsC#u(GU4+S7^=&C~ z+n$*Px61pZCy&~@aBAL!F~HL?=P+SZ(0JJL%Zimx3FX7m<)n+5#c3Wxzw@F98X7m-IAfQ zjW&r4ewWR<`Omt3{DAw+!u&sjb2gmTtj(IbRqg3_iS|{5q@(FQDz$feo~|%&w*4W; z>9#s;BRbB;syrQ6KEZkolYeTf-FYJWm>k-e^4H0mv#}MPP83FDV-2zL$i`NCa^Jlh|PJ3M5xzXd!@eJg_W-3 zY(RZ`j7~~>rM|s69T!f9rxT?+YOi|6$o;lrnU`+o-)}2aPyIN=)#bW0ow&Lzn|9&o zJn3!5JWnorbMyN11|Yz_YhnJMjlE@@>DBEtdy|svtkP)Pe{G}vBv}$$zYF>O924$L zQ@`Wvti;oC`DN|I+L_u27e=bw+L^{vPQEcatM&BKZAj;k%`e)BjqHtGF07ZrVz7A3q}?dGXsa`^maSL1-Oy&tV3s+ zIoE(@+ilsO(~0aeYPai~mD~EX+>>vtJ}D2~d77(F%E#t(oK0wa7^9P7TN)!ar{ls& zdOBXbnNG9UIl2+1IzHe(=@FpxG-h5#M#)q zX64q#)aJNzcxBaOY#`fkdd=CGY@<0H-!@`&Qfy3i(VUJ8M>gSfqIj3MS{>eNm2GTH z&xI!&ae8q!Ci{q&TN^7$liT(*>WeBox$Mi`V{65=tXvP|&S}h9lAUH>&9r0kqxMU- z662b+txA+%HRo8`?0BHc(}}aK>SpEEwq|(psEnG9JL^2X=4?xCsUP1Y$L{*Xm0^9n zPKs@<*ock`ry)%zu5VoJ>8L#2n685BeYy1OwVE8SJe!U!Oc^Rao$KOuHqt&+ptB}N z;conztvMZ+UX`=26PI3%ah;B_g|xAN^4`f!8*AjLa|6nIrxS${jRhKF<Er0iTrbaK#sc#5za2|IW5V9}Sla2t)g6^xygV99JNd@yPOTSCb9HCY zMs%DF)TQaf*?{Vxi<9!-%~AB``dF^i>m&0!GHx5;S;uUo&RH zDfaYKeo14`6+AR(&r=gCXIXh5pXbRnCq2TXWr7L2){~k0dmM9}Rl=jt#VqYEE-syD zCWGB|kc+P?U)C@ln4dkOC^tCQP%k_aSB|;PHJM_@PtC}c7m{lz?araND&O@ql4MCw zX6m&>3EmvZ0(9B1beNtF{io|V`|9KA$adVl@~u^%xb**=1 z64I_`QO5<}>Y zcoN69ZLs(1x}1qe9MhGdt3an=q$}Uj67r|0oM#3~M-`Z;scq;IYNzakWvq0X`@M*j zMrr+F!aST~cMm@*zqax6u>9Jm%T4%E`Z)~4kIGDQx{*%O)A4P5Mvw5+$0Fr=)Ahn4*%Cipt7JRyc~L=``t+ml)S<`lQ?5oTH;>XJwqh+M(>o$rWEW zx4e$)I61vX*|}+)JR?26df>#oEV=CX-15SLQXc5k4QJJfMb2X?!@1>jo2W!D*MvW_ zrRqfboK%%3mrYj^AMSzc{mRN7Q?IH$ov6Q*-KXl!^7M4BOKeys@+$8JPp&@3wn6q@ ztL6<|JR_OC*IE%Pv-esRhV!TOPd3c4wxqMowO2NcDk~>!T1q^9-6PGwh8igsK8c#R z%9evE(;Kehc8i(k*HOG_7p55lw5Y=%F zDL1;6rT$+_*(b=fupVX?W`|eih&D3z3)c{3nDJI>A3XrS2b*wvoAo3rZ`M+nv<{7x z*|GF6PxhbsW{NI6hwR<9Ut@Tdxu7`P-lhuk*2P76d!5pp7%_3=NHe8qbaK3~qWmw* z9a+GQ8=UGzKTjv!_LH7WcC{XxT1X z_e-cfck=YIoStix6Q8A(WhE6SD$7a#-^%iF6YhPnW!Y2~m8FyYH)ZK`|5I5yy^WQn zuVeGvlx5gXs4SgMTv#3{>GN2l?^cKkK)SG$z55x_X>C68cB}j zOQE|S8!aJ_s4SyiIlD~LB(`q04Sl5SB=KjTp@m$pcs;tcWoeh2@CTZ9!u8ej7?;V_ zY-Xwd>ig>axM++Y^?j%E=FWoBfvo29`oE5fK;XPMHrxNzqr1r@#r53H;`+Z8o?PV~ z*Z(zmIveZ%)_Qtz{hu<=#U-*0TW6Pfej}Of|CYweZ2z~!lexI@K0m+zGi^*=tX^qB z`NYz3+2-{fw)_^y>WweXr~OuGBR1hJYF5vV-<;mU6up+6x?+=au!R{E-e^-U3eTjm{iTCyGaOU!kU1 zxt;T!<;hj2d*)-~q;C~{*9Ka6nXAfEVT6tybs4ofLi5KYT-K9=PVc0gRxJ*rf@D3D?ObTDSt;^!I~{VV z^0ZCjD$-!>*RCC1AC$2_KXN-dIWz_&-`2;0%n_+R5~l3;Kh?j3@b5pnoPobG6W$J{ z{@L=4%GT7sKpxp|>T}Ab{slUUznf#J8AIT>?iS|%9h|?~k3aL@ivD2pBq6)OF{-QK}_0!QkitLf&OI_$zzs}QF9jQW}x@5kFrMRmO zxxDgiDs#N_c+UkDz`5D@tugr;)Cp{Ah@LLWmt{q729iy6@%%ae(3Dwo?VHNv6BB-C z?-}XHuCmhPNshS(Yo1|q<>36AvSJ*>JCoe&b4*z&y-jse-z}6R?oD-4-z}sy0=|yQ zoOUtWolWu4yWrz=+}Whlwiz9FHtA?w<-$=JCe69bQwSza{W$jJ>1}k5C->{)& z#9Xg$yN5Dvyj=Mfm9eU%yK$znRUSHL%*h@o+f04Cn;#>aw04+8mU)GK9~sUyanB)~ zhZqzuFXU&FMwPwuAJx~U_svunou0`nV*}BBv+7uRbl+^ICs&^}!lcFCH>>ev(Y1eW zanY!8+2!M@*yRPIbd{nqo9F39Wft8N>)VW636}ppo?P)zp1ONtnVw8z_}OL>+13=SYKiCL+k8(xou;karshD9`&E8 z_q3LII0|{xPtsq1^#ttlDNBbshpEW&&&m8=krz;`v8zFrvaX>;%(op6s;%E z^5iC7#vW7GB@FX)qA;R$2|2OyXk9{~CpYaL@um8vya!;Rm-ciWcaOBz(=qWd;Y80q zG{(!rXCKza%fn|MR>#Z3XCGF2@@Twh=U3;)%IuunJWr;0XOPGKdv>PlDa z`j_o_UTC_pV{h)uj$vlu$I5=$K8lOI?w%Pdv)2)NH)T_QcFbGt$z*>?6HjKQ^{Iu4 zVB1{r}RYY!tHg~3Qz8A-QG`Sk|elRo95{#&6!k~kD2e9&F}98X;#=toz#1; zMrA0UZTes%5>@QPS@bPZk}D_5Z@GbyUP$(|>7Aydz94))JxEWcrz0Eciv4U&K2&v1B>LQto)1wO z?t?!ouj(A7F)G8Jv2x|n0j3Og_2fG5uH?=#a^Q4qcjS#t&f7~dSJ`FY&&p5tZ8wy6 zjg?1b)5VkPyt6p(QqHU2@0yW*-srnITZi&4UVYCG%dBIpyd*61_VM!2e_Kzkb~LF3 z2k-1^<;i5P&SsTo9Vx4KwoD|xyeU2I6=8i&;NQyM+0rYkP`-gPHI+y8eSNGvs_*MO zc~mDxjIYR!?4_|;oyca^HmeiGWp%SUQG8ZFwGI9?u>;fh#!)NU=0mxuoAW94JR^Dm2+hyItQ$>%Y4)O=7G|CPRV z*g@0uMK-!5&3}?(X7IxB>o{`$(`|IICyVl~$Yin3y(m_m%f*0wci}=$t}@}6yZ&S|mWIEUUsod+}T&jaV&$8z- z;|>LvpzX*jEuw|bb?+#f!>?AaZ43GDg5PSk`}qB&J0kl^a!me@A5ShQ4{A8F^83Q; z2UnMs-nQ82X2hY(o$2YdYy5~>Als}(lovKlGh=1ZyC`g!n}y#sb?u0w)`kt8uJhVw zTXj4kI8G9_^o|MMVYuNEe!v~MxuyQ!kF90RHSxCdfUJHqgSG6u((z_VPnlVVsB0ee zp)t-}^SE@i2;NPx7R4J)xPP{bWOjVn=*ispjyWMaxI<=a-qVp?YK&;V4{XPX>pi)` zHwK%qV^p;@?%eYG0DcpR@ufxFmr&U1gPY1rb5&s^SKsR7QM))Ldt_;Dc)v((m9JyZ zAG~)W2&ci*k-hc9PHHNtnbeJE?zOg}_*uVEoBJ{Tth~hZl~x|Lw<}`hQCqt_Rvxvp z^`2buTFQNgS(S;z-TZzTl|jWErMtph_?PmV@@846b9Y!5T-w%SU+Wq3552$nw5hGL z^7U<^v`1-ETh>$_rL8Vj9;Iz@tUT&d7sbk_gnjD5Sb5Z!)W*xhwswB3d_*W$8|Kod ze4A65NUS5@UT(?Q@xdtHtj$iyMBU`O#${IivRQW$$iwkdM!Y;sm&QrH|M{j)6!MB( z8@>wN$rZ1UFHR(CiI;3*!NVK33AL+M$J&JR--!PwkX=ot5xlV}Ys#z)OjMb zDc8Qabx^~YHS6>_}v-5O?o=kNp$uX_U zf%>mHnh(>{L4RmuIi5`Al(>{}^t43cS$?1Qs4XX#cD*%M;SCRE&xU!HNK7=cVX-nh zHW=#3RG#j9Ln+IfD1ZwWq@T}*nT0ZJ2{%W%m6q17c7q@!zfNIa2%XB+t4+z`sJ?s2aS%{#oKIov)@F_ot56#onp|EBN9 zdBcRc@%Q669mUbvSzG3RZ;6CQbxnm24@b(Bju%LFVD)Qp*rPeANk9!upkdE7IV+X3rm^!Yu&xIA~6^z3w ziC?6rcCe{lG56vo@{O-ZPj$fQMK(T;6h}IXJe~CMUA`wXHpH>k-MaVt<#6P}ck$Kj z9_6OJKWx*bcFpN29F;e-6zV!my0f5@E1pa*;!^Kft37f$3d8D*Gk1bj4r-H}T zdOEIL{d;H)@p75EDX-O@+?6}`+h=)b&ugc=c#7P$BwbbndwSXRwab(To_;~WLtQL9ljg?iMrx&G5?$7VC?m+e=2I#Jm6 zT2=MJKd-&FZNH(l>B&{@11R&}#9NPK9aLw_Jxa43-|ia9&JM4k+_+So| zL%q?B)?%c@A;)A`j_ReL(>3sQ87qI)@&o}S_uq`i!etQqPj;bO! z%+D=l9*}NRDUe=yGkRqOs?%0cdg`y;c~vih^O}GpA4+&mt~SZ#Usvp}1%5Yq#pa*d z4(r#AueGRne5uM+;bcLp+aeqnx_Z8vu;li&F#n&WEUI7iY`H({%}&ZK&nsjwtcs4- ze`?Q^*KunMGw^%23EQsu+?#VTkIOjT##L>HFW0%S=i=N^)}DHMa)12P^=1UPpvf@% zb%b5Fv2>)>%>l+&lYdFF`aibMndrP@&UK;bUrWq&pwg8+v3z77Qx0m2oK7^piPDzz z)Jk^Om?uAa_d5x&*ArvY#KR-n-`93O!;Z$=Y(y%dj_ceEeLT3S(yLNlV>@v zd1ZerQ~SK>`m~|_`;?F8f3Jgi%fTof1uDu_-y}QOSiUJvwv5Yq=>)Pz#c8rR$IfA# zTO_#7L_>0wu`dt&hx3xkM_+DjB)aF{&y&kWP7V6;Rx=UcPPQ=rmyq6?|2Dn<1A9@r ztqr86`w4TdLz+#uFAw~uq}!LrrQ6As?!AKdWz7oG{i2udmq>S`P50PbUgDr~TadzAu%xnZU$9Oizh5cyy99kBYxY30BOqb}|!K{@dF` z6GxQt@=rYy5?lmJSL;ihZdAX^O60@jzbB8{3_I_swI$APB(v>_=G2@l3U`Ex%7m-+ zBu*ZsqcFEDTk*7Qai*u^@{~E1;sRdWViFRBrS&5&EXCs;^3=^|S2C~VWC~-sm4$gB zO{KHJ3q$d>{e2XddQYx%_~VJXG+9!CChYZ6Pfw_5k$V*9aQyIoM6E~Gt&<~YY zprrB`0CzLt-p#R_LyfL`vf|}o{ZM&1|9%?Q)gZuCTbTb!Lw#Ht^gzb{F%7FsxSAJ> zPeY76B@IsQr(w~*Y~*vj`rAMna@NF@LtdV~qGM8_a;WmsjTh&dEr${`W}9#`ynAy| zKQT349=5}k@$#@AnHDb(+v&P^d4+4Im&VJdIC*`HoVF$G=ZfRyVf+i@-+VvSj^pfTz}6?FJH|CTK2-f{@vXvc zzlj^m1naXgb3#YmExT!p~J$CYF zY-h)P17gD-Iacw|x%+u?msZ9@K^n$~_dJrGUUUxIC-wDYDmT|I54#5euANu+)OU9L zPI>FvK>7kRjM7wPZU2fVO{9uaWu|wGCxi=^K9t%c_&$; zy!tUcPWG8rnWp~l!m;5DZ{+s;w=NS~ImrPhY7+cNYxJAOwSgZX$ z-jlm_*{z{fK0CjW%-(lYTjpf0&tYz(f}c$pRmRK1@m5v5JRB=j$IHX9!c0%D{B+k_ z!yZ6@d&R>1|B?J`_}RCCa#qrg$<~5jP1Yz+QHgV*P5XH&#UD+0i#(gQ_i9xin#ydR zwfAJc4HV8-h?+%++|NX)cAXdJvVw9yzFi{Kgw7ebFuuWhWm6WC)tj*T8@tWm*tdZW zo;)gNn;zwh^Bc)*dbajtaW)|Paeh5{XaiZE+|Q3041|Gg~Ca z6sRB-w@gp&<_uV;GqF7QQlfNvdpb(r#5M{8ogj=pp4{0Py{HL)S5Fp=lX;&qT~dCT zjYHDY@$+ZK!w7IhKXkv7Kb61v`J?$4jU(;st?a3p{7K3r)AL8RGsA=zKQ2^X)>IzN zmn1#8%Rjr$E1GlB7}9Tp5jYH^9Lw5H)Ql-br|K-V}Ymz>(^6@47Y-~dIzjk zV8FIal-?K@Yj2q-{%*p2JnVn?MxDu*eLR_KbGa8TFGjAq?EEUvT-=90Dvbp9c_O!g zxYz#S=UFsQ={|z0x}q>+Tx{GkP<+~i+0Epg>$f{Dv>|NkU8Dca`5RKt?_K@ae9N)k z%>ORYzB#w*QuN$TQJx-XQ(L6^y8E9>SG{SI)dtyj!l;Lh^oDwRu3qv!Qtn$s_e6)q z>KHo@zdt?P({W|OxUqttO?+zNxs@mjb}#%c*}^iHHIQ*P=fGfe-G7kD&_KulVcXB)6Jth+gd3y1eIjm=eYo3J#Vc44XQ+8P_|`8a(YzYn%)Fz>^(VVHTL zW6dJpz`p{rdS83>(7uPYBvxjxUy5U8_8EdgPv&ez?Ph7NeNRKaCwDf7I^je_bA~ z#x8cDKRWDhV+URynrq0EJRC|mR&N(m7j2x3UP_z>czV(Jz~;63R~JSkvw5A2mD#*j zALRT+b5|y>hnS8ExzgIl(~I)l=pCn<8q(<D=A^v3ad`T-ow6ZBSaxvvJ)$)bDNDU{`*kYmYx>Ew7y3ui~8Q zc8xtxaQ}h2eZ0))*kXN1Tz!G+XN*g)*V6A-Ffyvwvik>3*vH1!Yt<(w_v&>JPHMd# z>FFw;8_A<#Px1{5eqR&hlgiu6CzA>px5`p=%<4Vt*>2PNKf=>fzT0xk3*yx4^xWc! z1YmlzrG@gsJFn5TMq}qu zRBxPaR5zk}(^MAKo2Ig;-Z%PDU|*9ku@Oqm4s&fDg*OU82%Wo*4msF<>2Y+dQq_q%z1K>Cb4 zY&^uan<&g9!#;zthq1f%X|g28ZZ3wPQv6w2bRF)(lwG+oUE?!&!sU4DTQ(t0S?2t1 z{=B@Pj2jNR8Z~#X&{sWPVSG0Ex6!m!qW-=K`vZI5gZ{;it5Wlz%F|OHm*kjqW&)EB zGoTA6l1~ZcGh^ju>d5#fusHv{T=-g#&@_B=o5}d^7%PvS(baki=f6i7|M4S6oA<0_ zvk0$z9GRM3Hen*G-RyIZ8J-_k4_&!y-G~d%rI!`j6)wJ0W73N}?60NR)PHpUwme=Q z`Y-Y1zWpRvQ!6*dj1%mBE9|GXwO=QE`-z@=9Y&gBTv9(bS2t8Hhqh7JU$i#uN;CGO z@^N}DzkK^q`81VB_M`POP34jORL089)T6PFs#tksKh?4F$bM$V%FS(76Mjvs+}vh0 z@_C;8zqP+w&riDjE%Ib8KUqOyDx~@wttjj<4Wk#5b2Z^jxQ}YO44cY zbkr{=Ic8Qjy*V)9eT>9~r#@{RZS{udd1o5qtrw{XWGQ+sjEYQ`S1b74%6~EAq$J1s zriha-=cuW?qSpcZt~l1m%BO_#WwG*#0}c%QFO8K?3FS*-I~AjcV0I&pwW5^eR0)<@Yu=UF8LYq;M)c zxoH<)WW4c`eGkaFTiSRik8L^F_d_TWRu;YgV;%lh<8L*xp&jD=sgSK~wW;Usd=;b{ zvrf!qprJY%wZmoMJHPVz-OAfDZ^1JZoU0svx{UZd@TYhtIc5Z9(w4)Xl|3ESZN_m% zHr$iBcE`o1mT=YnzR@W@9a*95!0_5e?_t{9lv|rb61l>3>!GTGo1^FjF)qA!EY(m9Q|t))&rVdG-* z>6DH-n|+3C7<*Q>)_blrFYN#N#mmF~E$PXlx@y{AS+t-Y8;&K^h;8cEf+cr~vMdP>_F~zsB zIhtn6?_(40Xm2fXRDS6)ch64c&{SsgB^T#W_xwf+JW-l$y{9&-8f)QkpKQTpbPn* z#f1k+2pb7A}MJ)Va@E4S|xQ9YI4zT|b+Ex6ynMY&8i&hH$4xALxAMDl2U zqb61!T{Fyzmz&{>(mm6YN9nFeN%ss-CyGN^cnvH&Y#PV1aJ|y>Sb6jw*eXx1yctHG zE_>6yUv|yTHgBT1xi_0w+nI)6tJ5WHqses4HteV`wEm{z z&&uX{{cJQxQV}oLWu`f=sq-f6xh-8Cmo2%sIy$|Qv~ZFV&=$DyU@=F2JdzwE=aT^T zJcS%Jl{4*@YvuW#TxqW-PZOk_EKPLr(w^jJH^#_e&&qZVpK*5i)(3n2r!`|5ChTRe z>G`HM%gX*?4vX)9ajxF@c?&-;27V&@iRPr#CR+Jhts{Aq-$Uc&VSZ=D%Qb8?}VNa8nDgCCN{2Mp1#I&c1TZ~J( z_9DIC?1S?6Cd>h5t}*ty&(l#EZcaRSmcZmyrYBPw_M`lI6ZhTtebc?7a<_i$Sg2y` z<%{gl=_u`eNp~jk-;dw(ytK)1?wB}3VMChg8&75-);s|ozcuFE+lr0`u?>VvJ^ zj>FQ+!O3J#x~BQrgw@78g{|M*HBH02Cg8+(tt|CFgFLR@JH@tGFjmZsj^d({l3)e| zJ>~VrY|ON~DgCjnQ!4XkO!#%)wT*2*d#A~Cz3Td5*{Ad8>bgIFt-97!9<>!}Gn>kz zwxS|d9?f4@dUECAe!(;C#qS}&ooiwK_aNStnI;blxSgTq*yL9iPsiIebyD>yY4XdC z&)cF%5k7=zkUWSo9qTswD zeIG{UInQ}YrHP-(a}&SloxGLkb?c>c-f!DqBahz6TNNvxpr*pqf$Dg9FDIWFFAv+# z`ZW12#$KX#l&Q=L++R}0Uj9j9Z; zn`3u9CL?Jov*leFE3@sc`fBIT)eHLiOnx?boD(k(^H_ba@87mHdRLdd7e36BtBoqb z-U~lSB#x&esXD;6>(P15`@79~hvLu5k2iBYD=3V7{I$T}D^2{B=9P@IcAtemD{o=O zWl4_lX~I;0>}0ZgZ7xpr*!~FSV~6qJy!yDPED1Y1dN;)YWL9T{dBmPi_RD0 zqP7pAyKkSt{)Z;4^Gq4L^DYg}`=bgta8GsQUOf+r^HXr%qB5;OmssaT9Ouk=RW2E( z&9Xj}ZYdX<@Ya}dtZV1{d~Aa`$_ve$`%rW4^7280Pd*-*&e_(}@pi+s+H=}*faC=x zjKfmWTJeeXd8v1gVNYULW6u|)m4$hEh32M-&Rgi6%-c;*Yo26E>j3zK39s1H1+B$T ze^;dHvD1n2D|%m$+6P~*jQ8IcloKOo?Ok~PuV0$nJ`WJRi!&K3FT_ftdgjhAJ9V~_ z-yn@d;(}I|`oA~%m&r>xB3m)}SCU&)YRauDQuX(m%|GS$a1-7s;kU@SUo%#omA}dh zUvA4i%Daj*xy`#MZz?^x+A}L>%Ev6bw{2o=tj@TC3Kr%olN66do=$Y_W#?g~V+yc$Dkqw``sh7x$j5=ot>#kCi{_ zT{D}go4614sr`vCPPo}adY+%h7`LPcB_|U{jVYqdR zd8)D|%y!Vq*D=@9vQx$9%%|h8j11f37;9HLmu-*iSWDS!Wo71CvAY6GDZd0?HkbMmbeqX`ZeOrz{fO@XrLwG3s7@h$?fd%kW zcn$mv-U}PxTkvy8QW9UnAK*&JbbjJ1coh5^7Qt2UA-Ebo3%`NO;J5H=xEB5jzlW`e z+Yhi8Y=q~+AK@kNC-^Y@1wI3Rg)hVPa0UDwu7-cXJt>pF;i0ev{cbI5%^o#Ab8D|kQL1~$TNVS+ep2S>r} zq4KmVR9tt0+V94;4_kLOtr6(KHkfS}wu{(yWqXuuH?|kpc4w<++k@?Mww`Q1vhBsT z8|Az=JP<0(li_~wTqylKsPh!UUa$fx4i`Y>|0Pi6a|KknPKUjb&xHrUN8rIw_LadV zyQ1jKJ}~=RYX{d7|4y%ABYLeoJv}U`@Z8u(`!2lJfu8DUGSEAkeL0Ffp}H@3DDmqI zm6tkylC3(>KZkuef(pMs-(fSW-w}4__fGH#xD^}X0N;n}uC06SnZcDbQW{>MS;>oRr#0gOOH3$v} zcp5y3mO}*i$&@8Xv77Pe z?agl`fqoAA9XnY4U}`i$(u_@jgx;C2_)mtiy$U!QPJv3}dGLyWGvN6gKMJQp<1r* zXTqmo1$-J_2^Yip@EQ05d=`EU{|&!|&%r<8^ROrFto$DdUxEYS%dikGg}1<0-~;eg zSPx%=yU^|~gFWFJurGWQj)!V9FNbf#tKmCv5mdNu!1v(?a0OfsKY)8s1|P!1;YTnB zehe4DPv9c>8C(V%pzb|<4%PO5$+jcgO16P)3Ri8zYBtr`HEhbuZ`c&~Z`uA}Tg$cw z?d5myH24E7f{k!8R9oM>E#nT!;V&=`u7?xg@9-k1u=L*I4e&?!7u*j6{u>?$TM$+r z+yu^mE#W<|HM}2g3Kzk)@Fmy|?n-;IIouz%hiAeq;Aprd91lCfOJOH?J?sp7Zccj& z4~ARAesCK&7;X!P!Y*(G+#c4$9pT=zA6?;{ui`F1+Y;P_A29jZe1fSus3 zQ1>p?CmsQJhXbJUb|~x#N5H+{ShzR54DJITh5Nxz;r@^h2PS&Ko#6rS0H{7T5B7$) z!-HTAJOnO-ec%Ro7;HiPJ_7CtkAnNdB&>i(!)xF%@CJA+oD2KGui2M&t8J+;&gC|1Wa~UK#l-}7;;pV_Bcqcpsehh~~b!4)&E#Vn(UpNe&2G4?( z@ND=M91c(1iZK+N3^lg+1ZKk{=&a>`2pj>YK#e)7U_QJh;5=Bs@e=`;!jT-WfQ9hu zfZJ_jZT~Ddn%|28o(IQpd=)H)x5Kfp7M8&0q00AVSPGZHiSR8b`*;tkF0FwY1N{c4 zz@Ny9O16yMZM&aEyC;Vku)@i@pQ%fGvil3vc;Z)B0)Kpz+bpwZ z+c3;7(Hs4JVISBR9tsD-!=U1PIGhOk!Wr-gI2#@XpN2{J3OpLV1&@WR;Bhd6^Y(`t z-y9EbfRg_Uo&fKMCql(n^9z-G+xTA0zFb?jL1vHoqqdO!;cy3dF5DAl!+|gdDvVrM z7948~m&dWfUrOKDaUUE09BftYbT-Wm$bCdSc7|WT%z#O_lH)x1HPpC7l%1}E4+VS{ zuHpD&_znC6ehXQenfMNJ>m~6$JOlm!C&3@#)$k`c2mTBf!FBLW_#4#x>3X<5ar_fpLQ5TSJAvJ=_!S4EKSDLVefvRH(jo49tYn zU@tfi9spm1y`iqX4}!Y(Js9pq-*^brSomJRF_|2f)+eD0l``+dK^32+xEy@NB3yWH@{go&%S| zbKw^-8~zA$U?3%kJ)aDS+=5mRo7e0UNZ38w_VUkDY>rLYjH9uz^PE2%IKvgtaX zeL0FHyxtr|`jxIisCrrib-k%ER4E(-6^>*LK{%(eFNe7%b~Ss35%OIs4DnqXezm-FUC7uE&LiK0jRd5p2b%gi=oD3B&wMiWhvEl0;n_PRg zVzb9}4|)p!e0V6F3j4tepw4q4)Op0q;YIL zy4N^{i{@HU2VKbQ&QNuV>`UwbldvmPd$|*o-Kegq{JTM2&t^cD$QeDB4J5jAd?4%r zbza$A4hiC?#7As$R1?$ZX#X79=r-FJe65*{%#EX&49}Pn>>FVsX&T<4|&4*{%%E2B+7h zfbHOXsQfBq%js+5e>?kfh{Ey5>68;yFfk0u{?3F-|5;G>cQ#ZQ!(jzH2VMZP;gv8K zUJFM+cRp22<=1m;a{l=q=Abjb)xr$80PYVLLZX>?9Lf%!fM>%+Q1$6aSPK`!Metdu z^Yvt_56*Wq`*NGGsVwB4Lr>>>KG0vve#VhDe!AY4+m>yy*`sejFNghQP<7^Y_!@i@ zei(2ytmpW*fUQaFTO6yL#UAi&sQzEnyzV=&AAAoE33w5FpW|x-YMyrm$FB$c9e%)Z zTjD8d9PlC3J6}J7O26tuWzweSBlhKd`}`EW0sQtEd=oZ!{&J4C{xn{d^Zk8^-Z}iX z5>7z=mFKVFnC8#78auYzcn6b&!=lbxr5mj^SfME^hUs);5evj)G06n zYP{PW-Vb+$ufW}4BitRTp6R#^l)NkK33VN?Cp; zRzaonPM8fBz+AWlj)0ou(VW04m=85KQvfyBG7_ph`;Zq|C)x76fq2O6%BE{Sx!Y(= zb$xU@RQoU+*1>sjDZCGU4)2G*2gjS?cRt5G;e(K61%~P$AL3Z`wHB%zAAto>a~vwi z1@LCL5IzVWgBrg-4mE$e2(}}ipM)LY({Nw77+wpXftuHQ7V2804z7pKL6yt%@B;V( zd=V~zny=G&zJ@QsZ=vG#CwvvQCtqHNli{1N3f4o{PBb!*AZm$jY;t%D$3>IKXZ{kC z`L{i+2=cux9y*?C{VkIRoUWHPm_5cT=#69lBKRD<7^=RC-@{9w^7&G@E1U*Ze=mdm z;T3Qgyb9LCYv5P#TKEUN4z?j*u7}$M+#TM)@j(Im!y7q1E#OEvgX4(-FNZgC{4aP5 zd>+n(Z^2vPDtJ3QpY+`UE8(5+dUzMqbx;jdKK5j5U|>nqbgSDqyodeG-RKSEcut_N zKBVq+tADB#asIe#9(o!BJ^-JA4?*S6!|*s*3)Npd0(0S`a6DWHHGX~!?nbyzz=3cP zbmg6KrakYwIw_81gysD-dUTtK#Zdj*Gl4&)FL9RjC%c#P(^rRH4!=DY=&S$9qNA4T zl0e@-&x`0yMfMU@JNI(nFNfbU=wRgK#2{ZZ4jIZOH>4wF4~N2wQOeda%z^4BN5Ew; z5B>=Y;8uh)5*`jmL6;9D+4el@m*xEUy-IvYZsIk#J#x)Kx^k|`vHs%9`Azgx&h>$Q zCi|7SRzEJkm!qfreitgg-wXWBWItzw^;a6?15r0)J&@Rs_sFV~iBklEvU1-;Jf-we6TOxyy8!-TMgU}&JO%Fu%8k5`#>IW>OVAR zAh&-<#vZU2RDC%R(hVhg!_iRRbG#ZJ3{~ETz|KUX50pJ03f1pw4*wI_7s`H*fIDEP zN5a$LQSfYdG}L{u{%{}Sb37ai2fzwA5LUty;AQYcsQE6Prv{z`?}3WnV^GgmDt}}{ zYN&?|9+@;4;AoY{Rkgzb&kXdUx_B6bsxA3$7jRsVL99Z&J5)9;7%Ot z{;%?JDeT6v$|K2EGSQaDN$ksUSrE?O^*|5x#4eDoFR?3BJF^#5`RE&l3P*iRT@X%< z8bn-Qwzd2&HwL|9U@=siI37|h6D6<`mO`~BWl;T0IaI$g5gtz%li?Ux0X3eO0yQo< z532s055I>~p{}Jx1x$sITd%p_4 z0k4KX!RfGqjH!kfkYTsM>)`FMJ=Z~Z!JVPjr`-pzhT@4*!CS zpw_xbz6F&3&hTlt3snB;-qJJhNT_nroOB)3-0*X-0=@uM{+Vn!7g;;%&AuGj6pmY8 zMsF*QmqOL|R|0>F*slrvy+ZlPZOt~{?9n!1uktq(?g>wW>fcX?x$q1)0iFr(glECK z;o0yxI2<;>bKsxwT(}eG$%ZGu9H@DcTsR5pJeR`}P~&v*R+tAD2FDsN=X0!d*Rz#e zY}4I{UCF7RU1IjIHPWem{S9~&dcJQAZ}=tDyvK- zf&>wcdk}|XjC=}3ur(YfDcjtFGU;ixhxTH;-9q4DVUl-`VD`gz!9gf$2Bp&@a z{uvH|>!8L(zrZ5+E1U#>gO|YdQ1MXS)?8-eJy?;)Vea90OYf1^cs|j|j;~t47dYGm zeg#_-_q$z1s#V{5rPA%We2`l|bA!YzxgE?LB%)_S?ZcsAmYLLcPmJ z8MqMj=Pyn_wwYvL{IJWN>~lozy|^@hTn3$ z8|VKXYMk=}JQw~5C&HiLboeuz4c9@n*T2Ho;BT-2{th*c7iBPiK=r#~2K*E5A210w za6C9*4*ZAXi(u={cAlUO)I7naP~)G?UQ%MMU$RJy`EsBpFBV<)IJ z9E#s`*bP1eGhjXJ0oTA?;6HFzxDAH98_a~e!xLdoI0fznXTrUq)>!NZbuVy#SP3)X zUGM<-5;nL$z&L@CSGb)H9Z+!U{M9J_NN!XBj*l zu7zj7UTnkIZeTl;?FF{8*uG>to2@Nv&T!Zto(r{}CkIZ0x$q`90^S4j;k&Q^cBCU3 z2~UKh;OVdko()IC99Rq=hht#|4Z%35^*iI?#c%?A3YNm}VHq5Yp)@I3f3JRk1Ug*F9V3on4*!V6&sF5oVL`@u?hAiNkB!%JWdycD+P zLU~9$pDM!K>i5Q02QLyc%Xe+17>{L$e{5skexpHjfSU3ru3T0F0!1LgEcs{%sUI-t67r`fCC0qe7hC0tBup?pW zSnc+ua1VGnH1ncxEXP%_4qgd2BW_p0gJ^fIhS$L9a2~t{z5}m?E8unT6Icz^K3xyb zfH%O|@J9FzoBPM^{ z==xQTY7>sfUO?|m9Yc*DUWDrRUV<;dm*J;yDf}D00#)9x!o%QeFb}E?(m3&Tcnf?3 z&Vz5lmtZ}7555C+|6n=16TS;I&Uz323g3r26VDa!MEC*Je8;EoQrG~MuAXek$85T$ z5Uw2F!|~W1ooSCaz7tA6ldbM?tKW@%If4tvD6nuWxiz+Vmf4S~Olbpjkw zF!$E9{~3CF!OvkI_yz0_)z%imm9Q+}H25{g_rX=L0j`F>!Zolh>G%eI1lK~{2mB6d zp5q6o`vTI}IHnO!fIq^Y@UQ$Rp@J$aRPO!8u&i^2Cj$SLOrLj7H$u}hkalp)coyFa6J4OR>O5r^Oe8A z-{G%tb0Yd1+#RlmN5S9WS?~|2dE7st>}3PgJi=daFa`KGEP?;P8BmKRo`Egk*KiZq zh4i(AdTyr`906NH-Ct@0bsuh1crR=V=R?I`W53NfeigQZ%C`!(oPXPVQ~M@Iw{FIU z+TV>ak;e79r8Hq*TVhbA21VcN_f4X%H}|L5bO;#e|8Xb25 z&o4WbBRj%!&Zc~6h7vhJIp?rnUuX4YXL6DcHG7m5;p+G>NcUmZy6*{( zY=FnYuV6p;9Xt*yUb4~p=j?g3?p*G8Ha!y{Hxj*l;b?d`)S5QQi{WHA4pzhQ@IhDt zUxgFkDp(3zkq>3CJ1mDs!in%~I2mdlu>#h>Dez%{5PzE z&%u}Bi*P+$3jcz7Hex^Q;Z1lTl>cL4JvjM4j*_Ug_Hr(uS?m+)I$S}){fn}G+bFB7TJPr zHD-44%X!Vl?;w7c!(77pI1WAax8ptinn3?#DdT+o6`igA2Ti|lt{^V35S zCAzbz4j;fq*UvWwY@2in+=A^~HZCE|x)AkU)7c2#v_}lV6SLX2Wz+feoJrj>o1X7< zGTcXOdX7cz2g+1^X(LpgYK$}rYA)^y_&Zz)|A6b^pHSEJ8{oE3Hlgd}zu{SM6Utii zIxXR4uoYB4(Hd$Vx((EIa(k%zep|p5up`vgJgu2#kK|65()O@$N1618Q z9O~JiK~UkG0yXD(Iy@BS2h@D{VH~Ud=?kw2cnds&<5}=XxFDeB$u;&>+mVE-`^P}l zRq+F;I{hj((hq(F6;1=}55Ix~;m-kEQuZfs+%}+|>Cv_Os^C~QGKgc@#$Yy;wWz$$ zV%sg?(eM;DJ(H;4yFs-n2M6pAhj4rz911UjXTWO$-T{Yk{I7t|!ZSJ6ns)u(mWp;3 z>=tl;cs9oxcMpdecjv%%R6217m0_ih=7zLk%h44iv z{g2>i*Z{}E@8LMul1e=uCSeIY5lWr~%i*~J$H9pl-vB4Unt)mhG@0YIumWmLisnqT zMnu$_4b7211Ql(Zz6IcnLfJUIveXmqXnS)OJ_*(4>t5Xr@Dq3=`~l8@Eoi)Mf?L6x;coC2sC%q4q3$Kz3N^=f8{7rn0eb~J z8s5qA5O^0XfHiP3oDFqN`Y)(!!@Hrb#pb|&!+YRca4!53-V1+$^Wdg5qW8h=;R8_D z{PW>I@Ily$Hoq2j4%h=e!f|i-DAfGR0yqpVgzCdIcA5$whu6X>gU`U*;InW6{5M<%>)`2x_Z-xD8rbT;vFFh`WI0_=EjN4ED|)@ye+TN^%b~_Q z@4+eXeRvIA0cXMw;eGHU_ze6QJ`X>EvV%|Im+&+AJ8Xa*h|lM67x)D{6n+U$gDc@V z@GCe1s&CXfDET`NYA#&&>lOYq_zk=+;G^(cj+M?zwvOM~bhhJnIoU(G*`xlW*OUDh zp~j6b!T#`NsB~*CEEm24$HQ0QVp4pDf2>{0?#x~4(d?d4GRs79QMd!tnCQTO3V$KT${%qCd<@nGq&g%X z=lJJHw!J2?C!jm{&4>c#D`ToIB?Uy(JX2D{33e-9RJ;SK;%RYkdo||@=!xa1YxRveS zK83P7t%aHd8{jp;vD%H#IaYW%Y{7TJ!|#Wyo+|BfccZs8ya)DxbKx=YUU(AJ8X#R4 z-v_US_rts41F#N02z8#BY?UOKq=et`?#TXhHo4c)>k8k1vd1^!AgE_QhrzetIQTZK z2#zm+?{Iu2Tn=x8@4|ZmE{5-M{Axg&Jrl0lkrn)|cKidV_$AqDez);Ej(s_@JRC<% zK(8&wrBLxKgS*3W*cVQO3a64S_!f48=}qI*j+6)cW-gTdXVBjPJ`0b6|Ar^PI;i^m z9F+Y$4=dpdum&!HN}uHS!ZTBc&IJ~-?cXF5QmADY`ba)w-P^#) z`L6?iCF}>^qfTtQ2?sd8zG}{^Kfhf9Pl1=h;cy!K6kY~3pLjVu7V24#li`(c0lXTv zCfw;z&qG`T72jdVf^RB^-&*d;PlNP3t{9`-3XX+6;5axKmcUW444x0m;pK25oB=1n zIZ$hg7QiX+ZK!M6PvH6RJ2(~o1uuZ=UoM0@!b-R|)bE;4R=Ao^z7*=d&E-(*Ft31l z@G3YNUJWmS)1l^Ju7!8O>!8;ARKu6y_3(3e1JwM>jZpJ1GoaQh+yuM9Ti_vZCL9vT zH4mfk&w;l?t;5m1_^I%2cm0qLa2Ov0;*kG1b2tJx2ODC4An0`1Jxh>8)m~gSPq|q zSHS1tZ1@7y{M8cp9DEVJ3ANVXGq@D~9sI8QJPKFO$GrwK;4-)ytcRM%S`Lqg??UB^ z+SB0sr{=j<4pZ9GcgU13{I(qK5>R&eF2}0(??Kgr_o2e8W(&SO8h(?s1HVmUllut0 zE8r(^A=JB3K8FpkCF%GaYF_UPsBz7gQ1xgf)VS&^sC6q}!_{yV{0^>xdY=CqxG&V4 zL?8GaRJ=0q8+_9;{MKc6e&3qkku68;2LUw(#azt+JI;Vy;XhFKCtGZZy%9fNw3z4(Tf!l*6)c6Vp`N#C18d=? zQ1f@2!S7)^xCL$2=5Qa_9-audgu3SI05vx41dpd7?+jbh)@%ja!EK=Kb8ibzfL);S zsSjK5tvl0?bC@8QaD06o@#im5&A%Pt^>9z9xgnF!q%HU+oq2Z}qQuc`TI(zKK7)nR z;0ibeegH3nA41vAXK*&uT-6)!3#fK=CDeV*uc5}htKeX`29AQ?!mHp~SOdR<55gbd z2e1+T1J}VViOVl=NBApLyYd@Uy;u(~fWO15;2-cVsCNU+fq%hApu%|^ZbG_0gqlm! zeVtaYFKi75z&0=+ZVD^mW>E9Bo5Pu~J=FZ{mheN^0j`32_t09{8E!%W=sf?Ay(0Cq+(>YDv%5)FHoMF2CIq||uVO)sH(IOFs#RKT zYOUgdMzIu+YHYoantD~Otto%1sM!9$Z{E!2Wyvm}8|*OylW*Vq&H25Vd2eQZGjlNT zDBw}Rqk)Tny?`#@F~GIJK0x*{jsx=BzybUU*caFV<)9z1o5Wtg{t;9wxu02#emI1uSv4qOU66Bq@$fIkDefsX?{z&`-F z7a8BvUf{<-j^Q(X>+r1PSyRa~s6x1Z4(`*OhNujkb6k>K>M>2 zI0G03mH}fxeyhiU+;eahkn`8oz((L2;9& z2D})^4ioR&fjWSS4q@LKXfZW65e&DOXUjyF)J^<{9viKnIG~i|+=aD#f z^dj(K;48pKfd2wM3S=4B0=o|OF<7Skaae{`54#)o3D{FnF`opojo1og+xircYs7y8 zAIkY%>;S6vNS+0hJR`{39({vn!v5Vqf&GEh6&?;`=ab=5Cy(KE z0J?#Eb~ghL0zL*j82AjZ6Yw?QA;6D-oKxg?YiFPh_5W~SS6~+)=O^qyrjKo!JVz&a zzD_^fXWLEF0Xz)_b_7nB$b24z>+^sI1KA#R0*Z71U%>Stz`sar0v?L%Ll9l^d-^C~1@LI#1;8FaevkD8Qm?BQ@DQ{o zy@B(9yuTPo_r*Yl;{o;ot_L0md;;hIeg*6g0{jPXB9Py~rvj-j=LAj!a*mVj z{bb;3U;%I|a0>8wiTs|Kit7)6(}AA=X8=C~&IYnyGY9Ad&IR&2xDYr8csfwL7l7rs zUI5$-TnPLaxERRql_kLGz@@+{;2A)U!4(5J=Di&FH1JH|n?N@(7wxm;;SN>Ocm&u3_$ZKV#$!PCV>rjl za1yZcd=D|6flKk766X(?!w@Ljl`g>3Br=??xaN2Qu^wm#a{PtJx|su9A+Z|BZ+L!R z5LrKt0Dc7Q4rDqUux?BQ;g%>@0P(v!f503h-SK9vbax@19}T~!c8XulD~4}4!D$B)M2x*zgEN zq^Z!LBO8Cd|)r&sla1^Q-HmJGl9ne=K>wT`9S8| z3+#()&LLALVF&VCk37k99FpfdjK+O_d(zwke=JY;0*?d!5;zEWA8;!0SHMNU`++`* zD}lep^+t(z03X2hCg6j>hk=`c&q{m^_zg}(>(0h0gzz?Xo7fiDADANg)V@-Wu5{=?@hR1coW9U!v!5xIDa`14mpPB4Z}YNbd>BE@j#!Lo?ti^qRa?Lnx=@chhW&_ zbNNH@K-BLl4Fvt-ygrV1v|^kLg69ej#=sfQHh= zLZ8SyACLPDDGusn-g_}9X}Awh5flR;njen_LS^~+CPKcqGgp~Ej_cWsczGaZrisBW z72)NGG^n^E?4-ePY(kl55qBg*+&z@Tmgr4&N5TFHmg5i{qah!=Vfp;}f&`B54+nA{ zbUcvb6oo(skm)AMXDj^BKg1$@fJmouC!d3OKB?}Q57pPc5WnrVFXH3#9{p*-^Jm?1 zLu}YFzgc3ArQ2<@5BscoLzFWB|84>uaATL zw<4^C*0F(bw89f-l&bHq+^D`MG(nbIw+-7#JC+nIKkKN<~3 z;h%kWbjMmV`;>?2BFxNrP;S!YLCMt^#69Tf4wHGQmg4{$EGeW8P_3Dl2!%6IX=-cZBC0DYdP61 z(}v-pq@jLP!c3d1s?2iX!2-V+5Au5$rs8Fz2+u4dtv!PxxV5^W z&KAO%9rk)S3?{;18MV4;EuU_S8|HJeEJHpv1TdXU5Pzxv)g<$Y3W1nhvA8b~cF8P< zBdo76QLZfB_V~$oI3~hpC))pyzX0xdkGffO?|_xhLp-NE zTwBMUmf(6PEO|Z{0=unb{q0{JeExmEe710H#j2kie-(86#QmQi^TI=2=KW<_^n^L@ zRy?s9N;h0TW4G1ps;~D=>;0$v&(3(b>(Ltm2uK^vfM!55pc&8%Xa+O`nt}f+2Kaqj zYS{RRZ20nvJ!P1%FLtd8M^_Y&8Ce`Fo*9b!qZNK%z!UcuS9#;%a4=R}5v%e>{{WEhWx>iBMg7FKW$iME>&))_^XDGDlQ3ximOMCkXfq; zju|zKK_Ke1!KeUQCW(nHi=|TJiJ3jjqm09H9LTX9AO7u(+-lCE$5vNhUoBJTqBr^i zG<{7F$n`k(ndZ2K3yfDr1M$@^Z@J&Q!sQKzR|L>OJj&>pGthK{etSF|_0RKGBaB|S zKSbS+gro6ko|+f@cbIq*kn`&3mn1l!jy_VN z4{!vqKX4>)0B{tLeWi&&_NOKT*>7>fzAO46*9<i;0|4y* zvy;~Vt!%U3udrqRzYz0^6@fKSoOcw2D7`C=vJ2*v%% zLq>L8yv6s{k7{d|)@?0;0{fwu?6lkZT<_bucIW9AeKTSDrhD$}{3UeD#r@x({fDRj z^^Yrdu3mrK(ZAZTOw6St)7oeTGy|Fe&46Y=GoTsJ3}^;41DXNNfM(!ZGQj?SNgK`o zmj>gNF~3jr{@M4pxxa1SKQ{-8$6^fNI5`IJEwih=X$CX{ngPv#WV@jKa=|dFARma$<=V9fqbQ6e^4R5&YmaB=aDBJZw|@)z=rr8No;vT) zZ8y$mI_6N{zLU!p^#o%6q}F|@(w^s9b?UgcVw}Tqv!9WZ!?5BAtI+0GnQ=vuDdFmf zlXI4dc%Z)kcf2l@*AaOgl-KVe&6KZ^*Q+7ty6b$oZb0o7_#)zDKAwZU7;fx1P{hoK zcv7yiSTYM@UH3S+YsH8>^gHv|-6bi}eOMIS$-ki#Q5xY88T+Cbj1LHRy2A z90AL6$hFaz!hO@MmT8J&6H32W&d@S#nfPVi)idOoBQ!sP?F4%r>;;I&Db_U1z%w-S zu9i-ySoZb|nSVaRez1i$=?f|^KCGUwuC3=;3N&3%mhhOw88|;c{EZ@hmZ4VTpUU+a zOvAoBgVxf}2kD!EFics*6ZKU1QOc3R%1|8lnf@Xm&zUK-CFQ6ETrbi-hiBzDk#;Ap ze=ME}pON`o%`gKZpC;GT&cQ+s=&#UR3CnV}0d^{%sVHZL*At0jb%_gWRH9gEgrtZX zYUY#qZN-SP#=ImTEI?RDYf8;#dd<9;WpQQ&7BWrt#QY+UPWUSn{-()2My7`1(bYoc zhK&1w7TRWbLOy63O%dBxg7=)9C6JlnO-11@2?k>2{^&HaXvRlwO*xYj4F`+7q7K?{ za4(yUX^4|`a-h6kB(JOFbt$f`+`T0AeC~r^a(53bxvMeVEAApue^nq{N#!b&JeHB~ z%3X6_TXM%drsJ+0vUJ?JA9n+fuK6_ADZY9RM&s0FfK-wI?n8)40M(%eJT&1+beZJO8N zj^Vrk0?^WHq&fN-MDTKn+r=bxSf$;6Epqu^IQww$N-N-MH=!`*TFV_gX3z8*Eek-#f~rvk46 z@?0XE<&szqydGEv+z4C=yb+iH-UM6+yajj#@K)drK%D)OxC3|xa0~FKz&C++1HT4t z0)7L;8AORgP{DrzB#$i1vV9Zno*UQr#4x77(qJzWQ9f`j$_L6oVleJc2NnQl0#5_N zCRnDhH;D*0g5R?48~5S28@4m750(aXR)p&YvfPyb87`V9@jQ@s@f-rcQruqw{3#I6 zH*q&`74T=k)j+m2Yk)g}<;dIq>MdT4ie zz83~MAl9~8|BvcO9A7A7Z71+U$nT9-l|Is1(G}dqb_uIh(%*}|0;oksc_(j-!-ex%W3?D-d z{I+5o#668u#L*4w`|mf?m^*v!@NsmGy!U$Z zy|KJ!eHL>q&w^>5C&zB=ED$h9!t$pb_H^VcG1pr5LLO{axypsDFRL($6byJ*=jWq` zSQ;o}hnu(IEn}JdCFG3vOc^iF+@@h!=TB4@V;SPDZ7p7Zs45T*hbq{sSJ5|DOq>If z6z@|SM#$&&sZ7H}nFbQcdSN%qW*}4*USYN}X5MB%-iq0yzVUmKhFmfVepie7X67xj zN5g@=PQs|v>FczSj6<~6B#v#*-cc$pFGOZXEdH{Dr)VYt@@!)N*6 zULbCn2R4q@hD~N+pYkwGmVtzf1CL$A!Ll$77j-SlfM^rcQ;+%ME)U|3ua1~!zOe1s z(=@k%Dy~muT*tyO^V0)%2I6XJ5tlgE#Tu7rbUEfm?nDE(M`U}(wd7#ak+n`Su7=EU zl~#z+y-ekxIWBch%l$GgYdsQW_;gW!NnXLc1@p}3oB8Kop{~tqfqJN3|^8I4Icj$ir>;&AW`P4A|{}o7{{sv_Ky9t;J z{6FAO;6H#I2lxW$1nvS(27U=V4T!#TVj&QH=R^?rPoQXwkd8}n-41v)us!fv;6cC} zf#_o=ZU=S&-V5vsd#&1`5qDP z7xD>l@@yD}uiVMDThv+b*}~mz7I(6(6>V^;y9cGaJouOGA@|e~XTV#>f98O1mV>!K zwx1Xy5$PC*-$iD57wsU^OLwaL{0{DT{d*wW{+EDkCtn6K9}TdwEfeDt^v`jKr(kLD zOcV5f4Uqn?1F{ZW4@6ZnZUE*2@vIZWfIk6_1l|thcn-!Y5^T@!0?q?&0xkyD0o}m+ zfGkfB09OJZ1hQOh0bT%n9C$gf9?0_bByb}T=}X)S+y>{SkO1@Ess|alp#1c4%N^d;eLIGnQ|>wGlNbNG z8)K7b)9kiRp^8U-chjHlUjFFQ>$jIisxdYt?muzs*H2A6cWToovpzWa?H9i8iEjpR z|M8-+;|rD_`c1phZ%^#_)NQM99(0J^jS zvKyCoJgnm<`3pDqUG;kumUQDx>BhIxjaMBEg6+0*Z+?A?eNz00%bzYeeEC-^Vi@Za z_n$fUpt6H*-T2AU8|p6FRQLRn{U2}J-*Ka}yY9L{#QWvqhc|ukW%Ps14I2h7y#LxuQTVj^w_t$nL0jqn^8i3^X<1VL-*EGt zq1OB>+_$y=dENBd|9^`DqZ6SS&Gy|Fe&46Y=GoTsJ3}^;41OJf>v}OOlG9CzG zC;DXn-{$_d{eN@)Kj-#2#@T>*we|+)lAGrjeJ;#m`+`BtUmTWW>y9yS;Rdrcl|jEe zy9_57R0rZNYV!JV_MGXisWo@5m6ZYLvRj;E4|_B27h7}R?9iGd%%slFITPa+W8{3@ zT^MJj!ML*+pM3)O83)1_i+P~ZK*;Bch_wXGbB*I5ZpAn`SF7~zpGO#lwg7dWT_sd{ zhUtd+^%=kb26+o@(JGI0kFj6lcf!3d9CMZXJw7N+NLdfyheB2wh(d7!`tTwljAvj{ z7W7y|V*VOKsm9B~ALf2#keuIl;J%r*Ws$$>~WE{%81 zJjMB&bJDcaB#*aqP#flluozx6E{6Rp+(#A(9#JqN;W*}@p%W5Z?W%%ih|gtZC)50z z;+5s>EWw@Cr^z`)t#Zh@{B&H9+qXoX%v1AlmR^#4a>eJ8jw|L}om;8SBRrIefMNcd z5N;lnWI^ZLc!8-|zrbH2<`IRXJ^nP$QL42Vo7oV+l)&=ma@eH^x4{foszrFbs2P}6 zmd9(bVy!UeD_PcBF=9?!l^>JOcsU+WX`sX`chvDC0dQI#9xZjHc}(ZR0fA5J!W|~&;00sIT#w2N#<`bEaP*SyzXhRs3SZEuyw<~35(!eQx2 zKi_YNa;Mf49ELE_K88?gLtaG2`z)`1vu*TyV$|#~?-v2hGKXf$AFYC_k|>LqqA@y) zaLBJLOSs3n>js)(HK&oQfLu~u4oqF=6$q7vDW|Sdv6){HzV*59mi%yTl+XP{Sn78) zw8~E)bH$lX2EJzc7 zIMn=>kC|nU&$ShkZ1WNjww4aIc}>Xl?MMTrK#gaej{ z5@~b;L!$0LWu?q7pNpx__ZN|N^M3MW5BKUF(Au{O`S>|9@*48R#@J9W@XY+eSeyKFSQj?r5lHUw3b%tY@Q()Pgj^PCj6h18FEi-4i`=|dm#tfU>jbK#d z^N{9yOnwVK=h|B4Zye<0Q{7L;=iHQUKb9BuUSDt+V-aUFiF!5&zsp!wTGX?sKZsVa zwfFi!;d_ri$@Z0*NY(9R{HmTe$@ou&JO0dvtwj9wE#gmUPf()vR?pe)wul>Vgo*%9 zBny=x3c)M+Gt*WY4OfWIc~LIZxzp8$(F~rY{Sms{*Y{or zKTBOGT|E;Bmb?_YU;Y3=Fft${<4w7e<0W)tZ56K{t^-OVEC-X8AewY`&yO_oP+Dffz+9L0*L1_8RjuS`&-|>mlfvBfq?H1f5_)UHikm-cm#Q8upD2WS! zqk$I#(VmHPF)Y~^5brgteQTiuR6O5Ez=^RO$n>2FB%kH5@>^f@0o=IeYo-{M2Jf0g z2jB)EtIZWa<_nw&oxp2=;7;gxEd*}F^->^pyOsfO0xk#s7|8hCu=4v{e7EzO=~)0v zQw`lV#C_|67)1417!fnsf(4+OWyT3}z`MZf{T9{^ci*8v%i6IOng3mq#rt~*xgTf;J^*Ao9|Agn zj{xzkjYola#>V5o!N7W;N~iqB7T;iQ$gJty3U>_uH$d{V4aoBSTOi}x4piaD?`QE{ z?S{-64)h(xT0s}^1jx#O^MGdo>2?K>;S|Bj?@UpLDLWW;3M|cfxMO-Y0Qr2N7ny*X zmvIGuH5I;O1WT$_tFKjQO4nRe=u z#(~r&JsWr`@Lb?j;3YuluZlIPGk`mBO^fmjAD)}%tET%>ay?#b^!)>*+1%gH&g zG$_ZS{Ge_M9n3R;Xq))mCE6iBa1^dr0LgC<$aGc!Av40j01#{=c2d_q8Ls@+;5%TCa9@PG!*Kr_osk28+*3V>9e9bSjFL$nji^OJmV7cIAqoYhsQ!Ir(ExlN`ev2-#4CfxYZj$8ZE8 z`#YQ~;y3dkaX;dZmU`n+dEWu-4{P1uj`KM|GYv*>_~G?A^183Qz9!}Rm-2c5GL=4QAfA9n*8|1W?8fptLk{ScPu!#)n2it8tU3xLl6-N0vo z&Mcqa|0dPXa+O`ngPv# zWtcU{y+8US6~c4>6&2fOPEgh+Y$C)*oBxB zv@bQs0A&24KP(*X`6t=;XBhM0x6tNtL0`85>Wrc<&i*L-|1wN5=g(lQb7q)_OE7-S zGbfk^^hrg(lK!q0{k2`cdgIkwy1#$aP0!w$|968;$V#Jt$nhR$iUWO&~4Cvn4_lItEg7>=0 zF#rTA`u;s|kL&d8Ht(EM7H@g?sGy|Fe z&46Y=GoTsJ3>;tv+Oq#2@~>*1{71gB)&GyR(*IAL|1WB#|F6Gy|Fe&A@?Wfc^io3>&(!I72PJ7)Qv5;>E62;pmFuF(Zp(#WO=ZSkvzdc;f!z zDsMa-4#tWrVpTW=c^FUItnx>q;j>(0^2UxDH8yW#UU9hOEMKvw!Z&7Au{?zuhlG2A z+1>-75*==JW_7OI10Zz_z}?CiK#Meq(TV*V3y@*9Iu?NLeu6w=uY55UaJXeGz=oT4 z+eJs0JbG4qz%TxB@YJVod@iz(uC>t&Xa+O`ngPv#Wnfkl=0%Wh!^_*BHo%7@m7Wcp+J1k znD-vHb^k$`7oIO*)WBNzAK&J#+3sWe455@sp)D)Lpcx?)fF@&;Q~|+w_&Uo;dj2i*C*R6&->`pQES?FIA{DU!&oKU zcPQ?^^_JWF7u_&^(A|rE^2JKSm@CFkHqPo%9WDCe^M<0(iYLBVeWhWfJLmfqEX1(e zo@`oqv;B&X=FWMb%a)Hn+;%U{9~9}_>{+$)x*r^M?&jQYzG%1o*su2g?7wv9XQw+; zFWoul2MZp~z4`Sm_DS(0E`Pe@@a12vi0%Jbepd>9t_v6Td-=lR_#sU%#$R!-z+v;R ziTj&M9=dVe-+sFEw4s+Sm{&1wl3`pe_}TjErhBhg@0zmmom-~Aw7bur4dd5>pPU7+ z+_G#yQP0qETMH+R`d|eLg*KW2&46Y=GoTsJ3}^;41DXNNz<&h;>^rvA{{Q|^Rh#Jl zZ?Vk%J6f6hUkWAsI@u48m4_>XKI;GgQWc1XLlsbTK;HLf9e@n8)wzG`IRL5q06L%u zV7L8w_>_saZ|`Gy|Fe&46Y=GoTsJ4E%>M z!2W+#8|nWCLRFY^_qigTsHeh@bp)<*PskVaN3*OC@HoZ;=1P5laVg^gd<@hFsF&jb zmihR!$)lfr9T%YffDAi1F2Mdjrn!Yt`vW2g$$bIJ#dyGB<6N(9d-KZ1htG*V@w4*I zA4(4zGy|Fe&46Y=GoTsJ3}^;41DXNNfM!55&;|^!{~v0j{=d&33P&qEL6=pIr0xMgs@U&u*t6fCnymfm>&x(3?dvNY0P5sZmmWIy#uK8i-|-0J z*he=%d&R|`w{p&Zz2IS{P8-dDWqhf7WW0hu5ctC2!~=~C?H$s0c^F51I(85|D7a-2LlT*4v=?-&9E6xSBu2N zyq-|0N>Zjde}~u)ppS7_PJe{wz+r>!4OgL=mHF{-6x$}^KG*Col6nZ+WjdzfJ~?*6 zay+6@jz{dVFF^*f;8l!KjN^|zjYykyzW_6@hCvQyz+zdqkt_ZAFgC%Tr9g612HXK; z*fMPf(|i{!(>(;1raRp68hZ&O`T?;QLBa_<8pyGZflzwzAwawBiCe#ZYT~(5n?9NK z!O3sG@HI9Vs1^4gFB&_(VELinv>W~Q#EwthwkrL80v`zXZ@f@*_8UdBzV7V%M}F?$ zH=rNUSKRLus(9pgH~s1E<&QqSetT)8+Az|suTQt$KL-OfcH4VzUDWlbiGhwcqobGg zDcE=-^f*A6-FD{q%WhoW@vx4cqoV7F|~e`y$Pz28E*eE`0|Gq&4q zx_H(3vtoDD|8nEp=QfQT+-MkM#l8WJuikOt>7lDejP2U*-O#m5{)MqOvA@BWiyz+f z#h1|!HaBb-xbXgKFGXR|Ml+xp&Gy|Fe&46Y=GoTsxUKn7XuC3<(D?IUXe>Cdy zLHFOwZoftE-*BUUfYb7N8;`AYCvi@|8x6<8rE$l=c_%v9!LA6b353cV1>uTF04oR3 z!=9b94gGz!51(59e?0QRyf|Q^=%hMDf8TJ)es;`N8N>Pmm7+-0A8TI!&w2V*%pUz} z8K%LwXsrEe_Jbts{-1Ak$Q2L9#O8Ze-T&{>_kY^b_wU`xTz?FG z|456zf0;k-vZlm^(+Gnl9`A~M*8AsP`Z7#0r_Q-?Yu_K+4JL3)%#mY?TFjAiPP`M+ zx4(0y>E^7{&B^ZXTyVNQ_8%5w6hA)v_y-2``lS1FO9ni#rs+PcQ`q0R>2!1D zUysLS?f+9Zo==dv@$COo7l8eL>L#>x|395he742~+G7JlyKUyK8#i9m?jPN2YA=7m zZNK@SdR&0dTN}-QW*1K8!=4E*QhoB-Y8T6{3VrTWjuo*9LAaEd)wdtC?h8a z%fXFlShHVf<8py$mEUKs@gF1OE#e>m%$0~AN39#{fO8OU(=zTg&`GX6DD}kRrJg|0 zjI#-Ax?3?~twA@$i3JWunTXRH_W2E?AMQOpJ>t*tKp}f9ZUi;oLf#{yZ8?nKy(?p9cy`)Ra{BZehE zA=C$-%M)R-5pj&;k3CJ2R|jOj6ZOp(j=9SH9v>DS!LTfogO`OY;#VS;iG$2|jY}lo z>O7LyWI8b>DAI{)VD3xWBAqelC{>2c(&}?H*R;|=5ETtx_R2rg@TN=y%O$x|Yow;2 zF3_Ytj~cVw%62LiuPkwuVtmwcM2h+F_vN|FlI81D8P|=7k7esx*dK$F+7@x`J+GOb z5ubw-;l`2ALR)id#J0$R`&S@7YkQ?y6>_oza@HI3-C!7eXSiX>O)e}=0{>a2E(Wrm zTmq!O23WIgH`{zSuCdI6n9R*9n@oYXzu5Dw!dH|U({7&%Qax75sD%%m! zzPKT?@;VRh$m@I{!&_kSC))<$KGokOxPx;8+$GqSOp*R-c~h48JMq&E%ldTi3-A=+t-y&u#Y=-sC%6>pY!A$ZrSZWX)9D8?ouw9kvW~XO%PhEqa|3A> zyv&jQmf)VOZ^n)I?S}0H%e>JnhCA{PcL}Bkc}*ZrV;L|8ECyZo|8U#@vpnHw@1%xR7|_=)(h7Tp4RvAoW|+xoqvD% zH#6~`LPoxiJ$h~w>6umk#?43kZ1Ud<2iw*z=r3yctE8X9DE4|kbDuyj%BK3l>yZ$W`;X0kU!HxqNFcZVb7 zx{EO>XD0lgF5C_l-`Ea{_B5hzz;Enw;TGTW2!r2~DjiRyNk@$(9Si)?ia^K{$9ulj zblkch>DZi-4t{6wTg=S2$wv*Y@tQU!z|suB`P9MR+I6@c13X@DNsl;qg0&-wlo6DBT`->Aokj^E8G0)@@|#J(_M^MY_EY)9pdHzw0^DeNUwOZop&K zMl+xp&Gy|Fe&46Y=GoTsxH)VkR|F&BH-#n2NH8=c6T-n<5|5Jmz2XPyBCMrF6111DXNN zfM!55pc&8%Xa+O`ngPwgza;~0+5a!A^hABGSY;###oWJIe^4jW!LXSQx~n@9`dLuEgox=VGF9efav)EyPu-jr z%)=Xxrlf^B2TIp=0`%}`pnoaiW&9_AAHyx;bz!H2SloOF-g3Wpg^SA&Dx-dL2|-EJ z?=km4qz=HI#!QFOGj9(?0<425k1Z;t%DulR9u*v@v}~7Y>5qWO0iOxe;@DeSnwLlH zm6N@tMd>@Mbs5xsfI6J8OiPpbJks+L3P<2vq=UGpY38I8gnQ%U)AnWvQvl@TR9L2? zXm6ZQ>)aFa1+n0S0Ov>Npv^XJYEiKenxzvoyxF6+_WoM$%6(!0rUSh?E!BQBJ zwo>4Ia6^S*l-U*>;p`1h+$D<8cX~$D&t@5A87Z_?nFVQ{CsgL2kCg`IdK2<$%27On zvap$MxW+-ONwKGOGd1LcjQLdh_q8klFyx-~61uv^X4Xy59{G#~vHAizEjP1jttES} zubIjw*U|79n)&jQ&Zu8zt+2Ed%Kzrt0%y`qg{OLE$mg#%^P=ilISVw*R9NQ43Cp|` z?L9BaTDG@#r!DiL>gNz{k^;l$2=yCbnUC7N=R?%c^y?9t>qNTx$!F1Ae$qdS=5pHd zS*UW=i4nlC-tbv?V3~)yz30JFyUlXNvazRW&WjVm*6KI&G6S-`m8+tpo94W*ZRlJg z>Oit>m?hf=I~yyQ04(#yI`sgb&z|j;rOsGeiSMtzkdwW&AuQv2l!3|Sf;qE|G<6F% zNFJ>3k&DrOH=5rUF6*l`z+Hu1<_lzR<&)nT&1qcViDHXlP%PRlwRUW$jGOv%Y^q1V za-CM5Y@f}z%~(at9K)JEtlshN!#jg{RPhv3fe)s=2}pw(PozaW(NeQbv_t}Td&?)| z*#UPf-}0LbeoVtWVSR-#jy~pkgj^tsnQ=Uj-*N+h^q&VSzooeLL>Q(wSN^`tVfw!U z$nshPRPoAhA@Pk=51BPy8x%xIGuF~1j;0LA@H+#QfBF3)>R3J9z^ZiHrT-l1{|F%S z*Gu{zh~M&?156l3JuLa{4NLR6VI=r^!m^2EeDd3XYg~kTYkbGa_#8mi`F=pY*G`o2 zu`Q7AZ}DEQ$2H?s`k!3y!~A{Tzx5Zz0_A z{eh)r$@I$hSG3D?Z;cPlok*__$aiQNknJ|sMhX8;{FZH;X#47M&F3RJ55SY8f2=na z>z{@LnctB>AKd}T8`CY@h*qEb0`SXlmjLOW z;XmT}u6=(S8XMK;77YQyybcwG?~Dt9JonFmN-p{@ftbhTsX~XBy;ZTMRlKi?;It(_D1tuSS&7< zAb`Sygk>A#gk#B_;M9$K$HQ_BKFvI|9pss97S;=hwSv=uTqB5kh6~7ey+E!>Ee8$) zqJNpdd%-{w69qt!keCZZ{uB2CR{^&G&j!8tOaYT%E6*8yJuvJHI?$TswI;4MHlp0&WPz@Gs71MdJ1 z1>Omq0NeyD2i^mW0`CQ`1^ybyviAURC-Ps8G(XmXZBykTBfBo%;(O~ywY5v@wwBCC z`9h;_xAnQ+w{`8#(=YmF!t_n|+}Zid^lSFg>9u(54Cn3kM{FGsYbrQq#C5)|haBIO ze$7IGz0s=0JuT?$O;da`^-1DD?XnH^z?>4j{r5{Xm9&x9F$E zR=3+WG`^(d$A`Z??@#^eM?#>DW4lo04+5b0n z)TjaAiF?bN`~U1eHzf1f1^Q5rt#li60^Vpi7A}oD2F^RtF~@@|$D~-yUxE4isBrx^ z}GiI942sdW);P@o+d8D@L~;zvZUr#U+)2ps%>P z!dF}otKx{j3V$@@4~`sR_^bVC!!kosAx`mE4Ifop5(pJnj~r3#sql>%Ra_AqGin%v zK-6i2Q313}5))eyhL)7xT~-yvL9yN?X@MyP5Rctapy>;KDQ^89sq0ARNE z{y!RP0MxmA8{`~#KJr1Gd(2lGf5aMqrc${EVEX(SVk@<10k^;tdjN3GyA>n!{<+3K z55hAs8D40cs?NNhCy%oi>-Wb&-X5K7$eYifpC*o<7whevkQWI51?IW-(l^7N0oh|n zU!iS^)Qj*(r7JNfug*|^OZMq^!9B8T{2%O-%$Hi*&@x{I;fe~e!2tKV>5`Gtkc;G#^ zN5Cz?n*&H41njpU{Hndtm?l26{ubGiaMaw05%;*C5}%n>j?1Ku1D}^H57<9K>=9tF z+z)}JnT7F;9>94(hQmD#Mgz|T?f@oWCGQ5GM-A-Zu-wCeCV~HaMwbKo0=d_~VBqyY zjG2gY!2Q76aa|4kIq)hV_Yk-V_zNI@8@~j;1bi6yF_8PW@VP$`u}3t zeJoyCB2WLzR{#Gvbhgyow?p>-(cKV+-R7l`=gGNmm)HYf+3+fT<0+-GV@l}SbZ0Q>g+Q)Rb zyiq)0Y{-l__QvxVdCC>P%zZIfmN34OV0ps6&PjjrdA91WH{8+RvC<#*RZjYo zytkT8jJqV@jbl3^okM{fJK^}wpTt;& zGy|Fe&46Y=Gw{E`0Kc)1lKTIrO`SJ)>g24Wk zdnQ)Hs2PzrtVPjhJID+2C2lQ?JGZEb;K*bp0L9Ql*V%Kr^5j z&Gy|Fe&46Y=GoTsRI|Jz8<9e&2rf{nfmQn*Xm=eKeQUw+}=49y9Vx zjdh;p+s3EnGe45qt80!AecwQs3fEW-@2V<|L<6CCX}03+C;PlyhfPzTjCYj>2NgtB z|N6V~srtP4%Xk`8Jf-1?Ka?E~RUAEJzq&CQ2iGfPH;!{;98H!uI1!qSvY_(ODC02B zlJlUYF~1+{&9fQD6gh8iPsS1VQ&T3Jaoi>2aHu%2IwBbMW+e_)e(kLEFnKBtmn-5z zU5%DyH=b%4k8_WBsQNbABpII<1Db*4SmJk$N7WyPoX$=($0MT2M%h+l!`H|-YMSE+he`uw z<{BxKa!-(tD=TF~#o0;D<=3Xf37s@o$P%_^QG71x#3uxuz+_xF0moYz_q)O&#^;KAa9&S#o}nt6kIFb3 zEpf62WP`(e*@jFw#LQPyGLABTa;2auDgIDZAQ}!;2+geQ#INQNHp}>p74rRMS*6%o z^x4R}`i{yw)XclRwYXb8)~s-@+O~}{UPp^~xpFQ$+^YJ~p|hF4yglM^Wv#tYT%IH2 zawg-7`pYo&;*Y8d!Y^Si3(QU)C(H8N;V?6gMSI38m!OLF6^)M{Es?0HXl{cg9_)#g zjk2WLzPL<>JDHA{zuZ+SR8(D3uQ;3Wy)Wa7v=$!^=Yq*be5x!JapNbLge5+-?U9I> za?4I!s(x&ian-bltF$7FubOP;DYuK6r`i_rg#4>qBC4#!rP}g!GOjumm&Y51I&W6v z_*BMGuj26f1NcnOY8*vfP0kvUafobWHIDmb9E~at`9jaevscffhuzFalZvA>7!Knj zHk)yrBjYfFs&9sJmF4HrDC4lJI3nRy%vm<`!M*Nj94e03%B=VK?~-xkCF6)kgXr{U zBOj_=v3E1`;Z$+(mCMEI^1IEH>c5%+&46Y=GoTsJ3}^;41DXNNfM!55@ZZD$r_Q=b z{r^F7Nxx&zzOVh?)c%wl!@J676yz5##4K10=i0CEmlPLZkg7Nqu8ey9#ZiAGY~JUr zJg*Fn%)tkiJ(pqMd9H~eG- zTTy{6=i;l27ZnsQ2#15Q;@QEfisF($s5lt(4Gm&Xf?*6i;w#y|B#9tOp{S4DC}CfTS2@5> zZ$w_4G-uM>nbW4uU*PDM{JC&aL4MF*wPjFNQCV9C4|CAF-J;9j& zgno{bDmR@?)<{pQxVP5xs&G1ESNlLJ}%}iDJYy%G-&}io>Me?=68;i4`u(JcvZ|5k9uO| z#i9sRcmg3Fdhu-o35Ky}Bxaccn5D$nx&OO`RVL5h=w*z_u^AXJ$5`1kjQuza!#zwc zOgYLJo3m?%d5`Uz%`hdsaQ{MVzDKvlOpf1)`?(dEzvu(m7`UaZM(l;CWVv~HxKF>B z$`SGgi=1nOn3i@-OTuPsz`2%A{2vze@fZo=uNrfHya%U7J3~ph*T~o$P6tBZOyGx- ze+VUf*D33FfzS<5ikm7HNRVMuvna`r$ zZOQ_Cg1IBiygSLELU8XD=_vX%=l#+)!i|mY)yl-xnElBlOZ;>f~Phs92>2z*4Wz}ZsWm?AM zv}f6_wHe$ifq5Awg{)^&WF7!Ud&89Qes{P{z%AvtU&4J(7*+>{RcA9gVZPLf|9CSc z>xsGtFGdGLNlbqo>95{q41`Sh%gghYmYH0sd-T`Q7$zmG(_?ZDqQ3^jr~H-q%ejP& zZdvEmeO@1A43pB_)x2hU52pV{n{k&-#v6@Asr<+1w*=@E{|)T>IgFCryy2z{&5w|| z;U*~?VTRd>VPdfxiVxjP9v1aeElL~BfM!55pc&8%Xa>Fo1OI|qb;xiVUcGpicfOpe zgnYk8PQ>eWmSJqh?{kjEA8B|lyj%SCT_SH8^h@*p6!ssA-2DCJ*&n@3G>pzhk9W;q zc_sX2YiY94%i7P5e(PN|B#Zf=Z9+bl;s^7>>!V+M9Y?Uy9A?C22AmLNDKD*c_P%YF zS`CZoWIk%A*^J#l=8N~<{LKgW(xy4wD3`xB!(n^#X7ca1d`7{r+4202-p%wd{p^3@ zQ&FU!X?!Al>x;Z?7+nm9d>9S5l35WF{_*7(d&Yw0yB);_E-5M(ePQWF?nN0jT)ObGOrlDd0(-o!Z&6V|Hk~@GV@dm z+q_G?K zn?FRGCVwU&+vTD($b|sD1I`51>d8Y9Yy<=(jG}tpYc@H?Yx2fjAWEv0CB@n10cC=N zyr@a2G;GNZUcRi z7>5SbX)kh;lj&Q&`hl74BX}06FuU-#t=kH|oG<`!z)J;+f~X&C9A@Bm0&OPmHJk3n z{ZeO?V_e;v1>#q>%S2^75X2P50q23wm+#Sr#Wrzvt;1gA=Dpty{y@G`jx_8nFf>4^ z%5GlcZ?<_rI}xjld_N5Z^Ttf~fK~4f-t(6|%1>UHqYQ`m=rH%SR~kSkj~(zb zfl)P4CLH+S7h?&v^8?O=d8RY7ng=de zHpm54@Gm>=;m^$6_Bfzia0Me)R8a~4fV08okX$$|<%0K4I-@aca?$gEa=}@!?}rKV zdx=~WS;_^!p_v8va#zWqq-xI2gd=G^K(_o@()LF^~?=34H z_(wC(#~Qf@uxwzt=J(ZP@LWE@MZJX!-WxV~@Kq)keT)f`3-;UOPg8`y*)A7>P!&$R z^tmD)=-c2d!l>Gd^Lr>K{Jv&>8!X)LUNbkxCEJh#!Hv%!5~om#eLADixH<6MR^v#? zNh3I!ir@V9;Jr7OZL9{sIE?3HA-N0fh-FAtNV8pDeEw2TWiakCSB;w6s)Qq4w|d}* zz1U_l>&`Q5#_?nV-0C%pHE zqMnlgF#VGK7tX7E6V`A0%_dti}$B~bOg^wP%ZswzZk`Ff=vX5gmS+75m z4<9uNzlZh&=d6nF5+}Y(*uPC+Y?Sw!O|H?z4j&B14BNUrkz*d*j(9~peBi%MIL^mD zJavQAxM0h%zvGSVEI=^)PHXEiAfB3xNrdlXh}1X+c_bIqNmE?#Ub7is$O$juknbU@ z$#z|7K0!Kq;9oAt7|t3NZE53~&0`?Ew{+GEXPfyx!4LywxY&%!)YffB8PyoSzo9Xn zxonPq0NI8*F<#1h&rLmx!yzyOjSeh8Fg&ZPt>+WGkxG{@5IgXV2J#2hS5Y?V{mtJV zyq9>c4BCSQ`sJIuPm z(&34F%MbjU)`85W^1*w}X0Xvo)|CUtM|EkLs4?FUCw-B5#mO%G=C>*Dxqf%`mnJVm zj7G_c11P6nOcDNOy^O@nBNM-m53zp8566d`u&fK5qvpNld4{3JHFN+I0cqsTYO>9R zXg^}{%98KlP1_$CQ**IP@Y{+1yjR@$tNQ^k|N57St^eIWMH1}%i8VG@Kg34C!SQ2< zSlNR$Dy7kIg##MIF>yP#pUO7-5wKz8T5?5QE9R_aE?Zuu=Dfw3tZAmw7Y9PV@T!>O zG<;GP56=^-Bg6BCmS z53KoS^4H7?&fVp=SrP{zCdJOT;cn0KY|;?8ze~>2D(gUf2q$Rbn8&2P&I!l^Ij*sA z%zMq|B;%=e%~z?vB*))-Rt6$r-{o1f-0L^ZbJ%-9#@CN1$_y^a@rg(qIp%&gsvPrP zv&l2Mb09j6ksP;K5(gpP%-jt(>e&%%#V}vib(upS9`<+MqiIdwlCpIAik~`v z#ie*&3CJoevbC>k$>O*C=!Z(y1lg4q*%wC#8|zAr_X}} zvXOAev|z}?DF4^zq94mJ-H@GYk=5mgll7qyvePWGE;+}3jZ2Z1ym>aEFQvlV5`3^& z$()d_xA=Sbg;mM?H9%HkkyUjKJeu@3-)5X-k$v%0&s&r%0@+N9Y-88IUZG_5kezCg zeKz{C5lUv@!14}~Pv(8rjxm=inSG(n@LT*XyW*6wN|u03JwN*Ee)ln-Dp@ULLoNQ^ z**tNak~Kg!%p&vq5Bar{8H<|BAj5p@WnVI#4#@H>{w5FjN(|5O85O1YE1o#+MipiR zGFC?Q96G-eUZ!LQ^qjU?WX~GD$CWId4wQ&*iOqOS`eOr_7&_oL%AXzcGpb$cjGNor z^p&2jz@oL`sK-Vdh!px>)$sd^u%Ki$B&wrDGw|V)19yIiSpKk=awij6lXY z67s@|?tAU0Os*)qHIS*cfU?z(4IZFmb(Sz$5!Bo*OAl-}#OAPgk-c$W(ox>^H9;FZzW{XDwu`%PK8%B4u|ee|3 zqUQDW{}lokkx09HDr)AW{@>yka4f>w9hYtjC*6J z^T$1{)5)x3chx$;(@IKFiN^gE9wf2Uw>)&j~R8cFu&`iInBST4jqq z&3{J82ByeP8Cv>)k_}0bRsH&d%an}oc59f&-up+<-(-BFQe-ug-l|gm*g>}Xd+lcv z`S~Q$IUz-ML}gTbD>6)HitO4hcU*#7!rzn>*_*Gs<|tVae(pzi}Ip{vxnee-}O1^F>J-^xZ_m?| z?3@(YL5o-XQ^^weVNJ`EtHWhVwk}0x<+=tkYdVK-x!?}v@0t`@_3ZI~P_m6FvPEN- zyOpdKKdfoF?&T9jUxvKg1#6A3?n&Q|a7%Dj2ekV8Q}yHg^cS+tzyYvMyTb`EKC3%# zHj!ce5!MXTl-;^(aFdd~iy!1$`HQrFwzHC9IK=2EWOgU-Rp+mHo5(PWA?#k9Nu zSs#n+#gZAvDSx|C!t8ym^GqfC1~PtoJMCte>mTqX%Y1hP><}`C6JXRnzw>w^;~RxP z1A!_J&)@dydrDRe8T%_rc2%?|ADi%Z9b|bHS-+pe`YG8q$gF(MTXowTO7;n4-7Nl| zDjh2Nx43QW#-Dx`S@)%{%~SsRpmXH2$SOydY*VreAhV|PxodA-pk$9iHp=4fjES$; zDp^yCY)8$7?<-kuhnD5#f-^2!sbqs7>xB!&OXVxwMSqNWm;#xV&(9xtgF_gCvmj*F z^74P4huBRPvNe#I&)wnVy`OCTfX$zfZG>zFeyjMtdT?{{xi>c#;_uEseVGh%0%X>-6hC=zGM#5Y*2ChjV(GSvRhZF~FuM$%QJ`cO zq{v2oy(QU}UzHN(-$ryxD1VzE8-@#&_ddRNl5O&9kd;_uH_x2M;cUTK{y{DCaD{C} z@)>dOvB?&HpP%uUzbJn z;$M~QuPL$~=lDk`*^U(1oVr1NCHo>p=5W|wQnKACvNez7%vCbm!7Vwvvhea}mF%Dt z*?_H_P2$`ryhSSNgl@Vb<*4p}V$`YN_`!C__tvmrKs>{%LAEP{j1!9Kc;P;e>16f{vK|>^jtsJa8Du;! zFkM>4Wso^D$Yx}a6=jeu$sluQkdYBI<+W{}lpklmF*R+mAx zIfJY|gKT>SSwjZdYZ+vX8Dt-2kTqqH?aCnIBB^xcx>E+3J%jB3+xrsuD2nX=ni&vL zQA9+*E8vA77$AgWVa*M*gd`;4G}ugLCdrV=%s4YSP+V~r*JDxf2G{$<{du74Evu~S zfr^T|-q-4?tLu%|dae8azUr#(>dtg$lCVF2|Ia6*MW^ap_3G8DSFg^l9`1tWxL{*k zuv`~xnhRFog3WQks$8(eF4%GxtjPsSxL_SF*lHK-bQf%$3%1?`yV3>Q=z?u>!R~Rv zwzyzhU9jyg*h?y<+xyDT(DdhY?=#J;DXI@ z!Kz%a#V*)#7p%zzOSoViF4$@p>~t4woeQ?!1-sG(+vtLAa>4F#!M39t-3zp-8jd8(pU9f2`Sb+;R#|5i$!4|t5j3-%^3r+WV!7{r#5CN1PSVS578*ZDfH%^U>4NuHB{Iq6wBFsJe@bitMbbCPwN zOMdHI(p?YCsqA+EbE@}kz?^LPbHGMB$ogv+Z1~>JI+zCxU3JF#D*)zHh6)#&D}YUK zpt&BHlP>+<1=|b^Ma;N{~DN6J^bi`?SjJbHF2;y7W~Se7k}&l z%!wwwH{^sJ;DR0Mf*s|8<+)%pU9b`ttQ?qQ`vc}AmpT`kAs3o4U{3W%-|a#7m{DI& z1BU-IVjBQB>5|i(9#psVy&t{)3JSW-v z^ya{i{_rb27-0w4u&X*cU&rImMa+T%c#86x?puKSjYv7+OUZypFUOclD1)L9j&rqDxYgyu(dAO1;BEU zIh~iHvR6NP99CrXdbq=u?)%4^@0HkQ8>aH|unV?L!Laqg)Vh7nhOHg;BAEtWx3AeS zHQhVFauAQoKs592xVat=o~|EGAxOO@OfAD6HcXZEP#b2^YZvTL8@5Ed{9DP(QNXwz z6nqx-|2MJ5`J84;w~uGYArdRFVXCa>xL{Q-*kTuqUW8F)rsmh=f+cL2+QvF;*#28e ze~{%{tzgtIsqNu(8}>!$iqB=bbqa>A-qLQ@yI@x;7`8L|F?5QP($#h@3 zU^HNt^-go4kLKQLly6rXrq=CX8>W_hxD8X&<+xyDT(Ddlrj~u04ZHixhRU_ zsn{GBtjdNhy8W2NlICJyye~$ZJ`jOtCkm4iYf{qDJW$o81TfjB(m^-1Pwh~!92>Su zp*afJeuu7m91pI8YiwBg5otaypgvpvFhNn6t0)u`h5<7z#k_(BJt)69aHOBB2N!IyV^s*x z^eqocw*_NQO1s+j9RtFg?ja^D2Lm>lAK5|qBWw(?es~suygEN3ELWt?0fY z=nYSwC$VpA*msGAITGs!10r>a%JAsRf615FU>o*q;m36nJHUoj^q*z4+c7rmZ@28e zUZ%^lVXD3q*s#;uQ}r@kxeW^?e)vdYi*1;ypCKEj)_cN+sp(ePupt}1e@Ny>XD(Hl zZK`;Dv&1e?FdCPyxMJiOiCt;KE_`^^pCv};F(pkJm)|t)x%(t`j}24#d|1J#F`u#R zq<~DfUBPHvJ}G+9Z4!G;!KhzZ{KeW05_{iBzCBRVW`H|J#tU8#ByD*nF@9Q5{x)xVnn8+^PiGW!Y&_s+^rI; zwPB&9yPhMlf&&8M6tv8WAG^}54`-5LJ2U8Y-O!}i{9UXT#Rrf9*38qqCuE z8PvA9(T1ryafc0?dE**V4Q@lWC>V_yKD=STOA_0rU}SVuU83`!oEP+|G*&!mz+pu) z-8%}FgTT`U#vhd!o$-`q7=^(9>~;2068pi1-B~$^hPnLQJUyX?oz6UCNXNsSFd9QU zVKfGD!g3ribkY1rHeId-{d(XzH&7s96fQ9ohaLFx#W{E|m}CB1jDHL8{~>tF`}+u6 z4mSsbr~-i%Jmy)3AkH5>bKnZ_T7o*pB;F~Ugj8U|2BKjO0zG<5Ufuy$hW7{u@-VLv zwiXR+cOK?5!sz`6JzhT}Y*!dIJ*>YGHU`x7uw9HW;zx9LdIlqE3@6^j?U+8`AHNFpu%yF!9%Zcv5cr z@f`L*Y}^He|MtYw{`(ZY|Ah$r5tV%!NEhPyy%+OM$gsr6*eR&oMd-~BM!e?{&p!yd z0Cytd#1Y2>1-%VI8wRDxMZ327>j=8vHH4mt?J)HFXwT02dOe=6v&Mc$>z zy98-)wF#rRl4eK<-pl;>}*phae~7i{waUljWo` z6HO`y$x7yPBK#r9kmN`*+824!UgF`1Bjr!|P#q92QVtJ;*WSqCYm`UwmZ=W*gq$Uh z#J4>z@gmDk^-FD3jc>0vh$ADv51`B>E16c(B)uV-WYQfc*-rzl?#N!sobtExD`mSg z^_%KWw%6OBL$b^yU->uXNBlg9Hb!M3Ov;30K{V`jaR%Z%g0`yKie-qa`pGs(IM@6ju3Db>d=7y4*DtYUa$e zM`E!w^6$P-#HU?Sb;kFRvgTt!EYc7Ohl;CfIS;{jGEDc8>z{`S#$yeU#vZXG>q&k^ zgnu<7*qgG+?{svlqfY7K>!>N@10l8El5$O?2QgfAiwcVIqsut-a?;Bw6BO zGQXRYB|jO=Un-r%_skk&JELuM(~Ma}m4UVTKq{P0g?gk;Es<2P&iefiXBlOoOxDjM zx~Y?;RJMlORlQr%W{^m8D$o+j&zpcw)X{J_7lzA(6A+RyzV_f|h@9yeEzS6jrkh-x z>2%`D^3?@5-YoL6$yzF7OSmPNSgECYq((*&&Clsl8M}9ZK8;nP@y1?_QW{$$Au!XU zLZIU@za$^*5%YnN7RG(-$*@NE|GSpNxt?`C>@!bl57NXba7XJaFyF2x@iKgs8& z!4_@H&^lWJ!R|Isb(CU`io+ejF#klLOLcd}Ot>wUM$g;^65ZFU&NCuT`Jevz$q5S z_90X^v*Jw8m@zaOAKuBHP-fGDuG*z&Zu04}9lIrN2}JP$RF|BsLdeWJHJnJSA)YlE zRZYT8b>=6XvzMYu!l+*J8|u9zn7%&4KNW;|dm>biwRQbRG|AEWzW&=y`CCNld-O@*|04;=wla1I zG2QDSSN926S3|p>J{r$3$nQQGWr*JW#B!E|lsjjYuGfU*ERxUM>AU7VU70oda*TEG zz1qgqgsdmF83uvbECg7(iA*%I7aSdOw=(&R9N!7{Ps4 zE7O(&WFXP?LYIYtO$5Cfm`VN4VwJ?gLxxgxXC2r=%T^xAQr9y_3zZBUK{9e}(`k~^ z6$xb;?L;D*p{pEQWj!!c$DOwIo9^==b2mqJPBbjyu+>YKV|YvA4As%z<;>MW!Ir&L zi!L@j+(>k5`PCu&F4yke7?5S?b#EfoBdZM@tAfg;GLKZtwPh4Kmg>^j`4O`<*?5 zr=2#H@8uqd!BF-aP0kh9!?ljgEwS6HE}6+>v!?A_B11e`9ks}UPR~|evLGA^@06uK zqrl>iZf{mNvnp3_yR)m^HMK0)g0m;ow01wLb+t{?NF&&Jad?{BeI zbR3-w#>v1OoY?y{{OvfQ_Zm)vPQ{5#`uz#v@^>M^)!)@ftN!l8DNFf_VY$_Z(}46V z$MY@ZF$1(KaB`4-_u^!t{g;bVh7TZ4A_L~f>A^x;w$1Rn5~mgSM&1Juhkg|8666^| z_}{?exgyW8VhMP=h<77SKUU#n;+J^R?;BBO-DmyxcBFk5^yt?PKF?Hm*#f`(c|=~) z9{}ycP@a^a-2{1_k36H`_g`{J8j+un36$q_v|AY}9+R($Cok@4BsGY%)%@U^0b&^{K~djOxkdAdH^$`vvRI-@Wes zX1VQ<<`9kfBiG^lIS0q5XIE9$_;G$uMs|x!M7xNq)`gV^$*VE;msu~Xg`SaTXPQ#p7Mh*o^EOk0e95k@N1Ksy zDKdDe4y5p=Y2<`3k2^=iy#T9CQa9!ram%8CbUGX>ZcVm@QwBcIz_p}740S-ZYrdd2 z8Y@|nUX2l->QgTp)tQv(0t1)zqQ@}=iny|l7CFRK=`Ath%nLM!6~P+>O?t;V#f4tT zIJm!l!U1p)_kf16V#-<)>g6)`;F3 z9#OCB29%TZY!A_gHwpg%@XNXn8L~j#7NI&q^IHQU#&sno;$MUKQct5s{Hj2(xhUKi ziE%wminvp-`bc`#Cj38xU*^@Jr%fjC+CU@?la_=DK-nej6D+h#Vp!Wx9> zHiODfhPOHpYYeAm;~m;?vN{}0o9*yyBd*q@B}{#i@=)+L6_;)4Tr+)KmNtyTH<5<4 zVV|7%sSaZ#mh{Kcah)g0|M><@EC1xvW14-?g?e1nR|2Spcgs;YrLAvpphaTbckcT)q}E2+jqASH)CCy zNfiCKS4~sV+EO1*RyGhTXn#^4?{kb}l9c7%Y{Zqi)H%)rMjV=x%nPK0O=$U)shQ^% z$2cZEX}{^-7QMX}qss9@!-CqfY3VrrotUrHM;g)0B7qn)`j&^Yif`s4=RS`j9o<1e zZKtfqb2;VIH0Y3xdj@nH;b{IS<@gtaM-7K8v>@Ko&<}s2zGa*j%s9b@2Jnk{9gW!3 zw*873r@pm;&}l|L@tPG&!3rDszhPoQT&U2YC0k(Mv~*m_zjGWIdRv?~JJAUSX(U9H zq-}Uhi4zI&F=r!9RJBxVeG+;o+nZ8el!K!NjkgsVoZnzHo+3j`lTO9fy<^4`@-XSY zYht=Qp^q|eyR5?DW~0yirF5yRm~=liFy8d4 zjj6lj=?eqLBvxS3PJU%z`WT)|Qfc?!n0P1>O!G*Xq+9xqZ_PL)50W|8F|};pnQFNCNw-wFtPL6^@52L8S zXe5ykl4Zu)*l5HHAKw~?f>$ZK!_2hFz)HRU!22I*tv-B01d|lmZjUhIVbl>$#^Y%N zGy7UCl4_tX(Oi!sES=^{Z-!ku(xin$Ucn|Pic!{aHY^c{BuN%>jy2xI-8xQv*o(0f z>Cn+gLpn7D^WyxT^nobPNRf^Xz)}&-i=7Db4eQS?M-KF(QKkHubvOw;*k56yat&eL zVUHoj<8WfAWrRJcgpF46x6|QAbwJC?$F&wdg&^DK_H<0S`u3{wUEXiOax^Rz|6Uk87;^2u<-8!r>^mxf6H{tCLcA)k}0 zb({9Q@Si07FAD!s;eT29Tj7`XQ$v^rO9InMeHz|Y#;ThZ3Zw&4)y=t49mNecwc+KG zP_U^PHDY2H0ILoMLWM!t$7GoIZL*C^tRh|(#%ier+kkY7l96<{It&Aq0%+1SFe9Of zU2e^9V!o12Vj`IZyT+CuK*N3*n3>Sf#f{edaNnk`<1$<%F>Ke(wtT2vNO>5TOr&79 zTl2}!Q_3YVk<5bKZOad!k)MH?35{~ex~UGd^LmlxGGxyIbALq27QtMuGQJ@@9WdIv zln;UpnHlA$K$Kn5kmW-#FPjWE_}2lWk9ikmu1(O~Dgu=}AzY09s~%&+(pXz08IKv` zruTU~tii|#wM|K=Y9bzw8h!YO_Bh3Qe>poDN2h7_YkHmvt@1dgYppT#)yUC|_lcce zbs!jC6iGLgM59z@Io8@?k5`q9#L*sBf|iWaDbFe_B}K66iXKt+w|bnCFeXOvm9m^t z5Q={N9r@9~uQi!O^0ElJT%%ro02T#-U`t|=S}%i!FxDDq*V-{EZ^HVbte25ycr=VT zr40WPbc!)aTY#}ba*=8KcSC&8ND>jUUkAcZ_UqyCxHnR?CxwT|B1QK-A}_%o$7C9b zfp!GE<4#8Y=b#Z8&-BjiJMl)(O*jJpbP z5tfcOn{k7b9v6ktD-JN?hMgE7XpoE{Ag%*aze;(U7`OdcUQ1#H2W!n*47-^PG!K^f z4F(O#gRGxnMwrI?W-8Yq2&1|Wl<9rfVZwhcbV15V)@vr6Bt0R8u3qpwWRPeSXyhwK43UHd6KbD?nEyQBbG95Ff9qUP0XvKODH-fPZHNI7MD*bU0h1~ zxSL1ca~~hf8Sl?T5D5dxNLXChm<*@u7Luij#~k9*ptYL?%90Xf(2f!`Wf{E@hPAaG z@AXCLUePQPF)0gVRHvjyiLyvdi3Eqm@mR3BHj6Y-tc2i_NaByK*z86M?32dO+_FeP zd>QW&W+{nal6@_7)|Ob;pRBW$$Nsac0G(AOO*eB>-?oZOo|c~lo8_nh+=eS_fEn$< zA#LZ@fbEH7pbFOmW5f}U@tbv}`a75UCn5ty=tj9r9dIciNY(|?(Ut}$%BnqZ76`?% zOs6Wao3gmBEpNhiJWlhxs9dIsJ=Ze;aB^AzvMcs;r!fl~QTX$s8 zc>v;)iA8#yQ`WH`g&n|*9o6OmM%ezOUsz!*mM3E5_7Ca&WhuU0cHSF0|@u6m-bh*oZCpDX1+jkD1b#%@eH zY;>Y}?>`|Hpp`#dEU`k%&z+i=H#K*1Ze6^7MW{<7nP{z#MuK(mKy#hnu_NrPs9?t0 z?v4J@99uv}+@>s@nlnBY$5Ib!bx|JN;+*l7A-I*}bH9>1!y%@rNy%*>ft3-TJhq=+@~!hB8&VLlPA%?6}7W+J94MwQbf=!cR(mjNokqC zqEsuaDfaud;@Txur6@*mb!83o;yckUh)Q93dF3K)UQMyKu(Vp6=dYPpSX(^DM5-55 z)cWU@YUTc->cZ+J8DjWrOREcOE31)Z(Sq4pdFjH^ay6RHeR*kNg;rPrdEyU{uc)jk ztzPIaF2&!7Q8Iaw{zpD)fXi4buPiJnE}IR>*Ay0&mukhOT>M-jI@kURWL;5M&MSe! z{qw43QF0X2_8c{p`QmVA+xq=2_Q1yX|zoG{9iNA|0 zD@y!a4dy^X<^GD|)66mdvyrjfWRaOJ-nWg)X{WQw9 za9&A%o@V}4 zJb{rU7{ejdaG z!IE63kzm^==1s~c5#pJLhC)v&Iz6Y6i13_FBAb{unHmy3r;*4e=1s{Xkxk6YpQt~l z=jwE(=OR9T`*=pMfuzCz4mY7kLx$*+8e{QP8i#9V1aX7_L1eKP(;Tv^^$|H9wvO*< z7^Yv$5sb&1Be+SKXsr--HPckI7u}(jQMY*NN+|Gz#HBYUruS^GaTE5lr-`;#$!E>=qu zAlLaA+wqA}&xo1-e{N>BQ>Ro^$3>Xu;q?hN7&8Gm&)XY+4}qgIfi%|}3b!xZFu48T z=xp5xI6AMlKiuVz*#UU+sn$<6MGH+V!dF6a#$(SNS3;$*fQZQ^pR@IBPm+2o<2ts6 zXc}MNz?3SHp#5SxmnP>@bc&GXQU}6yJwLQ``56|Wm5XQj{`oZQ+tNA2g{ULiH=Zf{ zEy6!f>>HngTa5^xFZ>myx__zg4@V^zxy(1IwAQ(+y2FH9{1WuBM14=c4m1x3PxQht z<=HIqXcF(?vMdGa~BNB8~ zo(DM@v@{&8j?kg*FsR|UNJAhJ1#RQJ@u_+oylzYgjzd$wwUFj>N&Q+_OId@%Zsur3@z`%%8#y?DSo~c(N=Upz6YM zeu_@onCG{~QQpPLbV+?xDcP`BAoc%2YMjuY5~Hk)6sG)d$cCxIiXUFBymPV zo^vQboYGhjFNasr%i%bYW1jB}>**Ip@J-S{bU~~gr@l$<@(gbW@LFo|*fRjDoOKnq zp7)Uv%=Dyl;ICL$&0?XEx}IMMjLJjbaPRH95B5Z$iTb*a)qWJBC7Ek6-8vs>-OQtJ zRO%lAfqbYw?ganEpgsb30FeJa;XfGuuFBJuoieZ5)$@7+w96Em@S>0%owcOAUlV?L zHuG=7PiHrK%L{Zud>TpTckzZpbUBjeD$xj(i9D)u4ZXu;r8y z`Trqwrl0VCBmDaa|0>*EN98|2_+Q4|3SIRtZv649u~BNGc^GIe1`l&^uDmOmy3v$n zw##%T=r0BRqqC5yRUg#z8pfBBjhDl~K5uuw0R1}9zfZ{YIN^T+{-5`}52kOva{AQ2 z(z)e>K~MGv&mhd7Dy6p&W-suU7~$Iy&flZKnXOr~^zlyV_Fc53NJ3VxC#Jro} z2P#WjL%VUv9eOGI1sj%9&+6H*1YuGZ64P^x8fVz7;Y7~NYY@t$wWVSvBPO=H4WpEj zN0Ck@3#vTYFn;b;rrVonB14&wc#-@M17;wdd6Y>k^04K_R>xNEQ!ik*1 z-&n!Bs*94pJPT&(8ihk`^dw6Dll1roDOnzohX}Wp$BOCYk?AH_^4GZRB$lgVK_fGz zOg7A-7c;4iVog}2AhUVt)F-*FQ1IUD5~3)@JxtrY$;I2>-)a6yVjXMU;9DelQ4E{+yM=e@&b!#_vF zZD_%8l-H*#TIfN`mKygAI@Tr$SJ6plHJ7DVqL&gbJ$3y#PmZ#g#Raj?&* zB^u-QXfh6+JLYu2yN!~Cj;5usHzvO3z*)i62>pc|CsSUX~XAr~p7RXKV|25fndb37U8}C{)E?i?S@(|+S$TdH& zEc18}VK`IF!=z5~GuSvhqtQ;X{>p=K{(ltZk4!?5xDzw|9-*l4vLQW`B$$d*Fy zmhwe4gKnq3L1hVJ3mT26ZIE6ymUVeIC1T!*cFt2t9j8S#$F7*7s$O&)F~egpO5T`1iaP~Acej53i9 zQ1?k?lDe4D28uQ)+ZAu~sit^qG-QsKtSyV%qxImG*7lwj>*kjT|91GLtca%ugU?-t zU5YrW&A(ju$>z&(7VrD@_M+FI{zkDuvl3}^6_+@i^H~ zStnxb#%)Pg>#EtT(~*ef`06I`I1qB!PZ=*5Hcd{#P{&l}O^8c%@gV9#>V}K0&`4iZ zTS`re=-eUb{9dV3Dt9o9hM?#Z@9*^P&ak(aQ=K)K<7c9G7wFO6-BMv&?-BkwrA+Mz zqnVoMp{VmQ>e|-#ifM>-98pB+X@n$3a+xM8vc9M+=r<hqS*6Wp27Eu%_ zPcbH^d5JP+o`?GqVV$8!7n<(?Y z5oLs(Xi#mbD5Ka>)J3!Q*<{jW{!|w< z?osuM=23j~4qcOdo;rpwXKpR&fKrG0xL==vb+uk@o!`i{6#Kdg&F(Ypb<@t@p3vy* z_PU+(;@@nd>sEpdxSE7yK<(ublz%*Oh=}&`82r>n_b;Kf9Cgo~Vi6zu`DIGGO~ie7 zmOdYQPWbo6z=rTwh5zqA*Zpq_|5D+9SNJaz@jnp$D}?`R;eTwLp58N5-$OV9ymrg> zW!Uq_6qmL&!woQg#Ot1*Jslskle%cRcp-^_8* z9Y!$8BpJK#Pqt8u(s8SAAjroi*~P~f)I@w~({>?QDrHk=6vT(LFH|46#S*JSe1>B5 z6}r6myYqr4GY>hQ`G(SJJdP?G8x210=tM(~+wA=n1ZecR{~`LuoJy2{MlW2;^ftZ^ z%1Lc{3)+z^yK3VwPomO+ETlnmCe)iH9uz%jtP4SVX|*pA#bpfUTBj}xef(r77wAYi zD6%po4qUb;1y|(+v734!lipCf-&e@yDagi}My*#<*C@??BF&|+ zW3qgTj;IaSD8B>GMxI<3F%SvTjj0wzwD(JqR6q-~VV)pHk5~ePuJ*hSGCnhyjzn>& zhj&3VXHaebGD{ysGB_AAAbYtN#%<&uBV;lO`^V%TEBxc(@5)v?_gVH2>+1SE9<=L` z_f*AJPe7Q)2W7CwNvvZ)w`6@D25f$7IJpvc*ueZ@Q7RZNrYj7wIw9lik2te&Gww>P zO|;ZTTEc}XoDK@pUq&70=yAk7HsV~1KjeVd@(X_e+hj?coBe3d>&-YPCuT{R#tthi z_15$KA0sas2=lof&kcHK)syJX&QFDRC2$&c zqM{{;3!6vb%MjLL3n#i1-UO%8Js$oOC`{x}=_%}2a4KC&PvIv~T)`K`Jq`YgGsLCv z^OU%hemndxQ<#z$h5a4Qo)?9`PH`0(ybu2l3RBWk*mrRD^c4OT#Z}TX$bNS?nVxu} zut5~2l!?NIz^OFl*h3lfTE-scto-vGC-kVTI=* z7<#B=jyxoHB#i@jUku)9y=1e{x$(mPjPOqq{zrsAU-+p_$??o^g!zquTunLF?C0SA zI^HIJrlgns=aak+`2Hc?@I~trSQbI&DR?SS@*o~dh5vEnDQVoEfksn6-{++?bCi6^ zUv8sWWy7n5|3p#Fg-U!mwyr~-@~l=4nh_0ZB|nd4;D@A+*OQGn^Nl#>G>o=UsN8fG z!qm^UaIi!)Q-PUnr!!`@!Ooc3?mJ^<+wY8-dfgc_+o2UBIWLCX$Yw2r%_9GC!XFU+ zdPS~;hZVnUHwPh%uTk^UAi92p^qT{tS&Q8H=>N7+Z#$>e9Fui{DV3 zX>36!cg_B{dwq?%#$)uqIJ0LCoveL5t(Kd4)%VDL(0Y=Qm*W#jdYfG1NSXYpd-OD?w(Lvye5@~dl-vJAI@1~Yt=-{|de{FFe?&SHe@|NY>q;J$ zy^;*;g$eyN2Yn2k!lim*JbNnYgU($nK_Aoeb1vZ~y8T%0!<-G8bhh~4Vs3qr@cX>b z2-w%9zzDxY*?YOvsu$Re#oeh`;KYM(%}M=M)_qdxR%~>kUd#mqFJ6K$+PctBU72fU4*X_X!=v*PwrV7MqVLK48uV#x zLqB8a$IxsM-fh$G<;-*s3iTw;YckS4h$n1VsyQ7`a1(2{Veg`bOdH$t_K{5EJvM4` ze0+No%JUv5`ihioI!2J}Ak(t z_jE9ydtD-p`1lij!3Co;9RGygQXY>Xk6n;6 z$({V$gdbJG{m%+NrhMH08vHcYISpeSX%pW-n5NCH(Yxkkv9vi-mmbQ17xPPa%(JE3 zZqjZnf0J3*PI2&{tNn_u#)=qsp*xR7Wqen6Dz15u`v#rWw9GUT?S)JXy3_` zwou>4$`Dsw4Z}KQz8HIC72n+DGiIPNU_v@2Dp9C^U;IU0UwkKYm9ts!8$6W#c^08;J&wTG_4?7rP#}#;4 zd$WiA@fIIjRpeubBCHaVg=N=x*xie~?Ci%qEWh5zmh9qTt8YeM1ibw=AM?J7b^i_z z8+4Y3opT$`nTGLhTDy>+&jtqy;G{4Z>pkq{ zmwjyQ8D5q`-jm8aZ1PwSdj%U{o7Z{RJjAE;n|}1N1$b_q?`2EyTn2aAD_*wf*C^jz zJ{Eb_%g#sGxo{W5Z5iWbS0BdMtt-83+Dsq&s19X+in0HRdfA655BvRQFS`yrA280x ze*UPBZNYi35sN)+Ch{F|Eye%^9@hV_KDG#Fv&YTyu!qj`vTt^HS=HBGR(OPmEkcJp zyxq$hS26bIyBPc9^B%VCNZe71kKDh2{Kq}zV>L86KM8qV;$u~=JXG>4_u?tV} zuxI|^W&M!m_&<5sJ1_c}Z#M42dDX)T|KMX|mwMRKPk9)Q^fJ!?FRS)=*wuG?+2crm z(oDww;`6cgy}a!CkdGa`+RGjQt!ppvvX48w><*8YjYoYQeY%$oKM-?lxRG!rA$-jY z^;dEl_KOC3*k>r)R|7ok>>(aD`W!DC@kgvD4Dhjk9_wX4K&Hn+U*34n%kB$%S?nPX zr&ECreEYs0=H2LFzc>Z*ht3VW68f_VIychCuKFkLVcp-$zCRc8+SA8QT@C)h%Y(mS z?3a07_Dg(^HM|s$*knh$PyzDA3^!pOjRiTF!%=56i z<+$_pSr2=|5Bwk>OQXKOzLBvrpx+Nd1{+rRSoC=4+Pz-(66*Ma0w4PpI#~D|^!REI zD>~H2#z2?9M!jxZ>tW}C_sbt+>@3vvZm7?~h>yKI!^8Hz%gesl;A8Lo%F7Nq+siIP z`5$`E$DSU9^atVG#eF_@a)pN-_l%e2Uxs=>olU>k$4dMA*x|tQ|A=wP8(6i(-$(w# z$KszuF72pq=^6*IY~ur7 z_7}+Xnq7Tt=o4Oc@JQ4j>VA0|e4XxL*TJ8d!PuqD$9{=J;ahKoe2+t&LH-}7QMah8 z_n?R0U;}8xF0cX5fTu68uXw+g-82aIJIwL0(6ji){35s~JnVxFUN$NpviZQr_Im{T zhsS!@v4}I_4~&&V2i9OgZjXeA?Kq0DL%{bDaEsyU-~w&0>-X}-mN;u$Ng6!ERK%?K8xoYaPPtW18%`>9`*#D zPs5cQ!r1e8UcVmph5Tp(Z{fN7!O&s2k#I-A9SnI5#`D)t>i&y{_}F~-!*B&l^|CdO z@Ufe#yex#UiUl54k7vJge6003*rU}xHmDTxyMnQoP}kSp<7IomM!t(Wz3w-td(b@^ z`tbBPFZ&4IL!fW<(35}8#r`hJyfwN5kN1-dwtA4L|*|!J#*fB-umyp*5aR2f^H_;vfsN+M>&huYJ_;Efq5^eW> z$RIZ#di5Im9K`+he$;2PmwBPT55azIg}xrY#>)!Ou4`dqu07Jn9v$RiLx1OEwa}w? zTfA%vY>OB2nOXxI@>>u4`*sg|EXT{9Tg_ppu=&>ww@@}S>)Z@G`1H^IxU0e%(Sr03D5@w^W1o=P9P=x`4k z`xodmbYzIv$G*GX%PzVM{R!l{X1SN`1^bu#3DRyv-Olx}2UeqPeD7oT9s@fE8il+0 z*g1Hf1=oLfFT3zbADf6ab3Xj%!o7}p(ZlEij=l-H_PUo{jIa=R_#K{){?W^h#ia8J z{Cyep^JUnrwZDWNfuHzo8|-62=*1Ox_}K9n8w6n=HlQMwyyj)MKL{Jr&%4O+n_sWy9)}?uHJyHy_2zT-uAK;u>I@f&>zri!I+n8N1^Y z*h$#h``3bQHQF2SgD^fi2+zVww517X2k-jWNvAXR@mw$a688RZVEe%B4M+XZa6E53 z&%+kCde{{h-z-1T%dTGsTk?>P4gB7NJ_NKerg(FfmrXp|$C}Xh?uR~dPuQTxkmkM< zeQY*^zTzNZ9qM!*=q-X<2zL(LwQwVDf&B2?4);9VGjQ+09gKQ7g4|n>TZ*wYame%z z#?}^l*rrRotPFL(^>*~vSEDb1jt#{)W0xO2><-woqan{_81vPmu3vZq`o0D_xto{$ z`5yFlg739*tV~+Uxa?>4|h;M<6%L>4a522h~5cfJ**bb&(VL~kG6Tr z5{w_v7yV}%+8f4@Uv0ztyf1p$org2F8uD%*>0{GsG44UxK7igI_bA36SHgad!I??c=x}QU?u-ofEmmLmS;&~Yy^;zHTk2Z|9@;Ww?E<>H%0Go6@uy40uyb0F~eP0Xz znQ)Z;Y`6>HHuOiCAMmofr+eADLws!CfQPLtLVrIJ<4=lv5@?{!(HWfm&t&XV^m)IF z!N#5MWq(@^8-TX-r>PzmgRQ+D^1l^wdH-|tw~IV%R3Z2;@Uh*_VeGE?UiK;M`l?A7 zw_v<-185J$7-=x<&tcDd+2!|Qj61`}oVlOLSg}!RAmxWQk ze?{1{a1`eqIEwQRxV^ylAh@;>TBTdKp{_T@Mp9KCp61ZT(M9-_wthxd%kBe7=M=440H5wsM#7YwxEC;{dH{0G~K%@O?vTgHE{&7VwB`hI;9=#xO7 z1o|Ytxj{&wCPi)DvRfG#amLVCoTUclhtP3LyOQ!6Az3{}}L}xwx*TVI~8pEz|1p}~7 z3IA}c6+XNx*6*=CdL`1fgP(oi;HB5Ja5h}OhY4&kEKlMb7uHeXu(iMrghMg;UF11< zj)EHvhb4U$f(yenz+u^)HNi#TR={D)ipAjKa0$5M;gWDzI%jFPRyeTDXgP$INx&)t zi)b{bbhsICKZBbIHw*6Pa9DC>1#pFMMR3J%C2*y1 zWpK0M=D_*kegQWZt{iS2Tm@VuTov4WxN5i>xLUXca0}rU!7YYc0=E?ISU7CAFw(o@ z;Ap9LIa~m)9xe*k0@nuD_v@2Dp9K0O&?kXD3G_*zPXc`s=#xO71o|YtMjd*Mu;&98aFX_yu=JyV_0)D-)48d_f+@5IGf$?dA{E}&vSU+ zbL!Nos#Dd~)ukoPT}oQIRFn+b^i*q}p#9o~K|&9ymmq9_VYOn`3U zR4zUSad481Wi=41cdX4oOdn(tB&!WWRLD zaE?9ZH&A?v9q?16CFj^Jzc_IRi;xS%r`cn&QIaxPoqV_W7uGJ16pyjN{)5C9*i`=! z(z0`GqyIoD=Nx<1Ke_MEZwrD_dRq)E3r80eo7tG)*57cn`5zIbz!{Dg0)COC2b&zv z_t+{)JMVEs^wM>a9!+EM!DpmncRRih4j09DSzsTNlsknz&}XfbdV;;#$1Y{3vdoaJ z(#IxtF=UMRKI^WZ8206Rf)E(n5*T~wyTITyqrr7#0$Q}|-eGzAfp@)*QrP7`aj)hM zFU6W>G`Uu(u8*<(`pBM7lFQr+@Ye5O=k+lGA!_NcU46rr&Qjy(?)Sv$Y>-05x-N{T zhJxfLP$@mFoC=IeBX&bk>~b_2ttS&Nq&9>^5v9&l8?1kLYCjs8fB-ZwkUuL2$d3!DeHT za`NY(e5)>*-HghT{9j>;VS|{@{%q(gKEOUO>=W;0n+Dz`8XbEF{wPW>jbP6Vo+2$A z!9D{-j9>$eQ>2fEv!%xA()v2~igB@&@RXx(^ghw@-EbNr4Pe{p1`K!Jg88ZQPgN+} zZYX%P6P=iCr()A*z5%zyD~h$!Xo6j7Dl>W>eb5A$=%?8AAK}qftmVd7^0J;+Y?Yjv zZDlIjb+5p~Y}fB2u(G6>!Qm9iY|S*9tYtq)W_b!UVswsOrOSV4p!vd%PM1+HHRSG#@_V4Brwh8vZ+3U9dGXUdG@z{R$E zWQr`?j}z$L|(Dwnjj(m+pRC-*Uv0qJOD^*exN%UV6d5Nq@fW@x+bODci8K7m7 z3SBK|q$87uy1>UKe}9ZXm;O2dpO6+Uj!l=)X>8_3uSAlUmPjX2HId|YFEZ(-sGdwx zxjUnn58VKcp-)gdcmm)W@7=2~^r|D%Z!BOvVhk3`e7+hVBES+fG~rQ@O@0C}0pVz+ zZb5rgmSnb9@*H~de+1>Oo6~Tyrl1(DV;=m~#;zfZYx`Gs zqyQDrV|td^q#Un7Q4D;|NsqIM9^AysSZQWg zdaNK|mo#ISq87$4p1IkonAfGg%2>pE<(^g$+zAC}y0 z89I!bw;gQtu>R6t9n3Z?!gAw5-dGyB7hm;iY@|OdAN=5U9}ok#V-FVEv~eC&YmB8D zQ@v{lsDYheN+toea-Q_Y)P^clb{$Wr#^o6f0^JiF@Kp3t-$3f}c*McR48KPTaImez zBYWM>qB!~sXwFr3h1CupI4b!CHRap2t{hce>d7VjidW~|Xqyf&0khdZhi6EUhgrsm zvAymhzrUd_^1b{ps~oY$*zFb`0jvDzD`YG;He*iE=3c~gJ)t_*)U%j`HO38pL#Um#yuRnx}>MM7L07`F)N@E46*)Esz z!ZIV3xGNg)*D5cAjc>_xqEEBQbIHf9+s)@o?>`3(8$b6-;^%O~d^+!Ek)sB6D>qSd za>OAvZPbLJO$P-b^~aN*rJ+T91y)47HH$!BIvWwUe#YuY^^;yY$le+?T`G)Z`q6WT z{GvAb2_Us0A1m0c|Hreavv~VOYO}C86yVk;KF6LKohLQ5u%AY6>@`WP)DPe~{0ZAK z=CJ-*wV^OTYQqK|XZ$nl=9n;+Gj@pns9M@MlS()8(rdffvtx^;!@F6?xH_r2hBb~G z5k0R)%S$p^MPBZOj!{%Uz(-Mo>aNg_&|U-^l@!|R0qpf{aHM4DYS@EG!=v9kaA$y5 zp(8*qHNYqe@aQF0mo!Ft-NmjZ{UpWhXXnD=L(=+C6z}uyqEI#o90O^Z;$ds(%o85P$#>|^PPZ>3wCk+#RF8Mv`8C&XLE`}AR`+K0c) zpb+{Rfa~`A-hH^2g7ZGKCUx`yuOjNep)=G0v$0sQXOe}!J>t+bz1Cb*k3JX%?xFx` za6&n&nAi_rpa&+7kcRDJA5F}d`0yzzE;Bm0zr0dY=^4T^Sg5IZyh&ZeRXK1U)zR(P z$MPr5lCCzg*C)jVeKndJOI{?<|NJ8RVbVCMA&m{693S(jS~ir*@M3DAXg1vzO}(V5 z-|S`ECQp{?_OiywaZ<@%c60J5%e>zBLdP5LHhdP$KQ#v*1@)44PPkyU$)~F5wbyFK z8|DD)_z#p z?bgDGf(5IfOHUrROpA+JM0J67HvpdWnx!8Khz1AR-v(em){VGZ-IvFys2`$Uki8g*eUn zK)`o_aeH{R?*iw4%tM(_0&6AjEvzlDRvOdpY=CV|4ew2!)2zW>?Xud`{+1+|Y26aK z!h@h7amDCa8a7_)VcLp4Ja}-r`0=#GjY^@Dx`;gHRslr5L6g5LH&D&PH>qlnA{gmG zibdqWxo@Fk>c<*#rhcl?U4uovlGugp|9XRGmBP2w2KC>(Kni(|RIzzB^TCf5Njh_Y4BFItFqEW#e z(Wa@ zw#)BodWEWfsHwYE^|Gc`aTVX69Q9XWc5TAc@qH1tqcU1F+wmDo4rt9l*$v=_0=18K z3~fy+9zA5Lmf~DJcjwq<1i*Oc0!@?r_+&MlKw)iiiKgC0^dIGEdjtXZXuaXj-(mQ= zXv9?lR$ep8ak5Ocp2TKPUBPy-#Hzg>CPFPeZZWpN-aBx6SEy&?e?ABBRCVh!;Ox;b zngMWi>wCc1w%g5nyM%(`hh2dvwhIdY^O4tCKor}>y#QsgTB3B3527VySbzzYc}~i& z5$h~}LM?~UrrQK=J*yUuZZWeETAZNJxpORcCy#M&N4 z5iUY7o{Mz4vg!CC%N9g$9J*-HE*DffYEEpwJ)AGKY{l`zZ77$i5M)o(Tl1bh{Z<@ zwp)n1XBN|k4mM0(0Iw8GO`^?8{u;;C18y9ip)jf;)xC>)N=N>p3Gl;$J^7^Fqn#=WhsV)E74g2_%fol0CzD>ssqUQ>yg)8Sfp+e0;e9%J%#RS` zA>Cc!4~41(cL`0P2hE6;iTMH#GhaNbK|K_rLmY) zENo=m$-|savwob~Kua>sy2p4N$iH-X8D9NB*W{tpE!nl3s$yyJh;o~z7N}}1sp@A$ z6;-xaPa>%lFSP+4NHM;jsQ}}nsQi+L^6sQUS|^I_h_MQa`*#)ii&GxjoXw-^H*^LE zLtX5&$wUy04DJg0OP6)LRunV~a-Rp(`a~hMoDp?rWU0qUwZgYglcV0$=}#%u{E518 zmwW;JIl~?K{bY&ik;+$;*{)-}2)jM(?u?8H-2Z8hKbKc zSlQ`Xv}^hxOOd;x3eJfa$UTGHv8wp=L8n`@W5%pfG1R*?HA_{0`5lfQwvmbz zr&_c1ygCoscIaUuw{IbG=-{N?uM2l>$*cYKAAw^(DUBsVC`LPZCws zC#z_Q&~bv3rh+=?4UU{3fpb6M+~hH)fp~g`67|lJlL@K|4p%BEGmZw~r!9`!^(1;n z!KioClG;0^2fC+j(VthcFmwO0mw)PbwPO*{8-b4R6zu>_CcpWb;Cda02h8gPdHzf&XsO%W6F%R(xz?f_>7^_ z!CkCvMy}yziN_z#v958a+-}#R)A;iZ{V9Hv<=?kWI=GXy-Ip#6Kki7l|3gu-Kk4Z9 zKzC8v_5{<MgjrKI7R+ zGbW*xkNDLJakUSHq}$|10;@awCx5>{DSmmB@r^nI+9t2a9 ze7(-oi&ii-6JKl0yE9i{Q=0rlB-*Q!(Kg)`T)kqy@H2S4MZD79^cd08ZEM+IGKWj4 z#Y~|Nw=-xnG<^SU9 z2WPi_D-6ddVT!HUt#@s3Y@O32iW}L~tYpc2h;7U26EO}$64p;|l81uOSa59pzKB5g zmm>B`R%nPr)hYq5dj?PfzB$M~%UUYMH968Aj1{HgI<`9dZfR5G}b7 zJ2zkI)yVSZmq>mG99QPMMZE)uly!YDp|v2&Pc4|o-4^y^-q_#*GGJ;As`UX2o47Es z_n{T46%PiAki-?NWMN-vK0!z~#m@6UY{62qRI`j7T)Ie#SjK|$Q*^=0C}Vit zxb=OPv8?b+Imr4*vRim=JXUlK(kzN+>N*6VJL^fB7|LFB~G> zwZPF(I9eQBu&2{Mhq$l*f>&AKig0PgddJWe<3(xuI##f8w&K*5H=T3d5kKWx!kMq%Q`NZ?p!|(LBL|^f# z@U@R#>!bUY`|2Zo{NsG|L3ijDceJlV_d6Wi(Z9{UGb6Wr^us=St&cv_N1yJkTafZ> zZv*uISOMjOeEhrn=wJKjSA6u3y>tuB`2{Zn>1TcPMj!py|DpTFTkexlFCFcp!9_j} z**^MAAAP!yKE+2*@zH(PMDLCPQ2XeBZwjRj2etfv9=vl6`0BTO%D?u}ulVR6dvxAD zO@YTi?a>tY=#4%){Yx5m)%*|p=(Rrji$40Zny$8w26y>5{MJW*)JNasqp$VRm;308 zeqE2y2H}qO^hhJ~jM(CL`}q@4r%Sk`(Og0un;lDfsK zoOWJMWkM2s)pZ1n(`;1VQ~tbHxuAdP}Bb5`1{-$YNm z^?c5{wJhmGR!?D>+Sm46!NeXq9?~-*Uo!wgx z<7KOZtq8W;Ubfd@D}gQG6Hhcjc#Gn}7V2etAGRvkvQ%4l?)@c{so`T9R%rOFhV>er)v#5=n;QCGRom&MqD4s13^O%ct>GpOcW79x;ROw^Y51dt z{+M|Bg=olc&!8u0dXk1yG@Q=yZme|8kgee&4VP=UPQ$Gl?$D68hClyZXGp?-*V%tw zXQTcf>&#(2{e^#=^HJ=MU*et6OA@+|^v@V1voH}EH(d8DK=te%d!6lidtLt_g4k6O zx{6N=VL^V|gSrHW!v!&ef*fZ9&kbI5&8r$6-+zHl7g_Wpz(0eyTNJJeRY0;80rT*r zP+4S}TIQdw>N!(YAK@PLkIfEC^wJFlKNAFa;6|ZUU}^B!CwI z58>sQ1YQsP29gHe4vY`Sy$E;$@b8dJa9XlkAUWVA!1p0bz*~Xa1|TkY#Q^+!R#F7M zW}ujWLL@4I6J|on!1I7-Am!jKz?>*Ss3be^9mpQ=R$z`n5UR-z{1j40c3|8<{Fip{ z1mL_um?!c9UW1(e(t;6y6c5HJ36LDB}Nc3z@5Ozp?G(K8-R@oXcW8!n39Mk0d4}mXBmmqQUP#dGCBZW0-SZXAnX9A zb+HudqXL}P$xcW$IIW%2kUDT$Pv1k1fD6;mC?x(X)CC@cj0SfCL#N|42W|i+L(;%4 zCXfdqW~u;u1d<6}0(6;?R`7OU-u;+A@&QWt^eX}n0?vVKAv^FlkTUQR;2B6ccnh!{ zQVCAjEf-S;9t34ne{ZssQXYA9F?(fJ-2!!Ha;KA?LtLfVUwR z!G#4_ppZ|&O~9ui*TAcQe}vosuLphr`5wG=fdyaLd3a2r1OdlF{9LFE%!l*@F9QA! z5&~WYj9e%P1HcWyTnPPZR37kINIZBw@H`|5ycM{45z-D`0(@dI(hgn$+y^mRr~=5g zB}h9J00%Bb+QAcmS0GEk+kw&fcx=cHyaK5vJ5X4L%z+bzLymwOfMX!*z)isWAX~sQ zfQunz;6*^ocKj)aQUN>&sRXYF-h}J{ZwEe6h$$c+;6BJT@&TTJ+yHk1zk_@aE-c47 zfcyep0(=|d*M>|0S70CN30?%e02$qe`ELaYT!|E+APD#%Bn>m zJy4G;raW*1a3Z7t+yq<&DFQD7{vJ{cUIly=QUdM-wnKJ+6Uu8a{}oVz)?of1yQu;& zzX%9k1iS`0Kox+89zqAmA9pZ!K^njlfawq?cnR=LNHcgVP<|K-8r%fj3AqGb1)RDL zal!K}AgduapcDZggM1HO0UU^H)?dI)z>gsTUn3}R5H4YZz!QLLAp^iGfQKNl;Pt>} zNCJ2Zuxl|EBe(%*gP6dpfNwx73KS>ERY(SSJ8<+P*hIihz#2#%cs=l2NCEi($817} z!83rbL5jhhz&Try1@JuJc1Q(y1#ky4T}>Q#7E%XpDiMYXQ%aC_ssPM~RDl-}LO#VJ zBK!;z-{wed$rgQ-|wC0dEfP} zcfISf*Is)=QKL^$y-!(D*R^fV=L+i8B6JnnNgV`XAq-C{M(vCjHqDS+=U7{@yQpP} zVsv1^SwTn6iyL@{u5y+gJeUNu#d#B z4zBK?Ef5LP#IA`w#51ge)I+?$lJR?qHmi$eR4y={$POAG>57rX2OgEejLx3|!$k2B7SPEkeK?do)@h+s`yuO>|nXNF5O>8DeUqq+^hbsm)T}A z7+s&HaMu}Zt1hbjd~zAz1aDnFJEiO4U#OI7UJMS+>!-xg^lgoEuR#hG>q>(2?EtO( zV}a6Om{LIw2AYeHm=6a;n~2>qn;o)DMq6!SQ(ARUG*L>XC7V4H92V7|TBQLquc{5A z!QvbQ7NO8ZEhe}g7|7~64;6C;5^LS#>A zQzAPUnI!IG|A>5AOkwk)@};^2_C-{z^hN>`qdSR4ri(rt9RGe29Il4;B;IS^eL|UTk@n?xL^rtuDWak{r)o?KWJh?Zqwv zp6-;RI%f?#n4`NSvPa>X8se4i?*3gV9!E z*bD9|8i}zYZ??Ec*FauBpyY9snC%pfosWyoA*?i)Ar348&dz$gtH| z?4`WSHS3n!eYC_-2S4$;4!Z{C%5jiDbCLrOvtA8j*Svp_jqf#3T6d6@^@?IEV>{`T zszu`6o;q~ba@pBldUhl>VdT9Im<%gjH_U4Gf>3-1i(@I`BDa)Wo?9@$wf_cYtN5TY zGyx?U_3SPL}!hiCK&h%N!aPR)vX2lqUQ^_Y=(*R*w>lt$z+5pD&(3 zhX%U%xIB;c#Ot*W(16HeP}A%vHJGVgw4aYc*UoO3%_h{oh-wx)bMzgWx)u}*XcGl` z?^};R!w@L3Ce4PS(43+B+Fs71S?p~r4&C|v%r_yXL#$GJ3e_I}EgP87P4dfP*$Js_ zenrBl8M~itObD04_p=WYBCX5tNJC?10Itew9*rgW!Q%Iu+g&LJtdY^h>uNtAR%#rj z8cRHD2&jRLcj0(~QiGNc`k}Py3RHGkc;oWZ`*;o?alqo}P-2M1I4BF`oqa4X@nI=t zAKRH2)nUyfp4n7tXYW;ZKCw%`>u)JTzD7;uA;rZ=E{m^vB=1Jsv{R>Ku|7$e(j)J& zqNL;w`{3?cg}NB;2c}^+7a`xOXqR0mn{?;|8Y^u~KpDLylRBHhN#MYnmxK-F=*;<#r5 z9Dk1D5l=QT?ST31zWdSb#u~B7oAw294YOAI7PzGvo z$WC5Z!b{v`Sb2g?eg!tZ8Q{hdOm_KM@^NTl_uJ^_<*5!Qm8e?*t}B<= z_LM!kIK}i1w&k?yu{_Sr*I86*C@W3vsmoAGNAuFhd1?9UtRZ!&H1&068nj(Hvz`4o zsBesYyE-m7)X=!BfR0}DAIp1@is~-&1+*8*rac(aVHNgqdf?Jv4B5_X5B7=q`Q7^i zT!oGR8^`bfhY`oM=PP#M!2#0Eo2=8|U!{rL*on~ipfepQisys<$Ii?$Bue`I9X5AJ zpP(!MR9@DZ?Hm#zz4i|3_wLlmyLwV*oC^#rVQ928sv}Dr8YO)f$QBF@mCjeP(xG~( z;8V79s8gC&$)*kKXAQ1Y(~ed8?FSucYaiojAHk02I{gLKD0aVG>hSen@I(1#xxz72 z7Hqy*bkh`(*>=dawgJxAq-hD79p$RsWH7t_z%G`acr4vkk3rkNm7eFBRLUXtz8wBW!Fdh^DR*??G+b|`)bWn6!7vyElRfCBVjSmTQp_UXp7}%nJG`#a(zLA@?$1rsU;|}KG0nD-LB#b6 zk5GG7TqB}!%KUndztl|)MKqgA5wYvH|5Wa3E3FMz32vvm2Ldg+cXw&Pbz&Q|1%npt z(1oto;uP(A^p3L1$c{HwEHIpUsPrfefJ65lISo4HvCa@oqXx@DvvgVEzk?hlH5wJ% z7j2mmEuWmeYrH>NjXytUAvyoM$)WFjKx)&fY4>p*>r2_l(@>vgg%>*HR8_SuC1;16 zqv}P9I#X5GDe3}ME#qpb;SMF~&@F=5)fQ7n`yvH?Uq*`-M~UKq*0eOb{w>NtQI7X@ z?M)MIJ;WJAaXNYR?b-t{UizG-N!~vkH4(0b+O^A7s_KIJi@fYj97h96-i1GZf??M< zgcl~PylRx=T$yI8#b&REg6$%xRNb0~KrKFKHPpb~F<=d93rFQXh=q)ls&1VC=T;5P zw}-1+_kkS^t#|X87)wEMVY?uT?ZOJcd}Q7$Ad2ncZvgW&rNrzbU)%__x4#jU`IwY` zL+oDpM@l)2cFi_$TZ1{ZF~ISW>P4*~O2tOD(;RG7wN<>1AFng(UY%uB$1dMQUGub3 zo|@T5VyS~-q#-&YS;AUprt2{00(|xEKzB>;f}!mk zS_EmK0kQFImuT7n`p#m)?B9Ym%GL-*PhD5Pc;5V6I^o%MF99re5uGJBdQde3vG}OL zW-D>`=%w_UgAG%Y!Yc*R`b1mh26{Hy4q@Bx%fl#!H1~`CaG))4wK{kZy5$x0?(F?#xW?cv^8xAWs|}?|PQ<2L{E=cV`-v zb}R1%&1Hi}b+zWY%PJ5zv5Dr=NFz&g$x)d~i(R(_l`NP_Du!xRRkNa|K+UixQR`V2 z+bL!6`CwDiS;S(M5$4&pxtBqv+1Aq|TP?MUDw%h)z4YqcAuuz)N4i?gO15;n3>nN1 zS|tWE#s%k&5`zUKV0;bd##W;V#DYo70@CEU2(hM=dqREMKwrnp@jl8CFQY(OK@^DU zQ7dNl=A*LJf_GX<;KGCa-qh49sB2U(ax+Jq08>x}$>1mm5-|QN&J$XV{Xtq2LrFRR zn7~QA;(|kuLP`t<5Pk{*#?e_Z7KE~+Xp|i_#fRLr>xb5@bMbms^=Npy8D|dlq=R{; zotlo-6m30?H~%6v*tG`_bqxJroX;y@&hhvjZI?fMg@tBL44$=y4)DcCVo`|a89r6x zo%$7K%X~uWu!gxZ7fP>{uw^Ul?3#)pZezml|m=a(2*X)Z!Z4 z8uE+u2?CEj0-Kz@2hU}BIDXss3N>}|U@&wRwue;4_Z{<`8U)b{h0Q(|U(#(sBGhM} zLR-sy5Qw^Xf-Y7xE-q~$+*}v=n3)VIXk`L5h8$AV9InFwISf~FpwAa|@~ik&a$vjJ z&2h;c7s24!_?+FW-}r$cNifsfXl91px5jMqZMfNhR0@}{)#D$v{tbn$aULxvQA-{z zAA$o~4kxosF2%-1_m2_03?+5)3|N#ba>105n5{C;WTsNhI$se3?U7`RU9 z>;#LHww!%FA+}32dD!`%eGH&(-A0^W4p6FQd%audzuXx$u}&1fW!EO9N+))+F4>(T z_oGX~;*oXoyCBpT94dnf2{b=1Vvl8q1f5>QwY>n>!x1z9^LDeRv-6~e2In`~v7&Tm z7weESLUQh6V{%fZvR&-Ia{5Y>cd?Ii21;AjvpYGPrL3K7O$!Y|71#dGg0QBh@PVY7>)5*}H{A}_ zX39|M!|g0%$^dEOc2+bcSemh&t)DVO+WEpC2I>RD;Tg9H8VF_J^?-t5($BIWcLyCv|Swut4%I0+*5OTMO zN*!{>eclc^%~Pj=s*{tpvXq%UrA2euw3+FWVJ_P?^R)El9A?eO9~S4Zuk)j%fH};a zZ;_78W}{|Jm4?h_yJrp3B+jM*v*4S%E_pV)GwbK*z6;1QB$nX8uNQ^UzGL?>V}SkK zx=jaJ`#Fix|0v)-E`opZ8GVpt&siaT@&WsD&X}NrY4DM$Z!}{5=*^62%s989+w8Ys zLevNhehzUOP+FfxKI(4WsspU|yq?lSQ=M7!`itFMbo^EQFA(?kcUQArPlieDmN}0< z`JgD>c#8QKT4un7w$>k^>*@RB~f#NQ^zEMcE62+{dKrx!H4Eb1tXmX=#pOO z(#hK7VbCge{*N*$6)t#`)9%_@nULhRM>*a@xsBqqmjCHd-daECUb!=1X%iQ+kyc4!Q1l=Ozy{{^BT;~??pARh_B=rN`-WnFaJ7UNGQ ztol$^``l?t7c(acMiy8b)V^%0YCr)D@z!-;qP}_s;Ukmwf*^#PZ?yI!@IVs#vOGg^CAMJgMR>6@_LcO6zZgs`pXRsNz@^r>nS7#nlR0 zg>uzUsiL4>2fg%@Uivp)y6 zvD&)M*03u|%>)%ks+gSbQmndiz)~beb z6*sF`rDC;;hg57(u}Q`ADqd0XhKfI__?L?Qv^qU5WtsI7g#WBFJ}UoNXUgLE|6XU2 z(!+U$Bb-sk8vNq)R_vHp@igcl32l@7GP}wwR7A5Cu(e)3AeC2H$Hv0&a6x=P5*`p= z5kj@TYqUQ8Vjn@wq#%RYTaDeOPQTV#NjaRagq~0Fa1r1y5bla}t_lS}vKfI1My2d~ zAYEtE6g_@~;?oF}V83Q!-A`qTW1UZ(8YKp6(JnD>7;0eJ0ft&#s!UbU^b2${fcMnUig zr?oL49S?1AS}Ri^25?$G<&b!AT2n_L{lOc7u@7Mv1y2Az2iXf=26RCVg0}$MJd8Tv zRxLQSJUs#PZ=ecLx=%!Jr~(j&BcVT406qyBOcj7fASUoe;8zd}cr!3- z5~d717q}jh4PF8K6*3*1{$aWuWG=WCm<%ZdH)do0XFypAr2zOcqy)SINdH+@3f>6( z1yT+!JRu0rKsJCE0Y8Ln2Co6q`_^`FZ4N%cL#n}zz^@<&!JC2KPev!eTYx^f724@C-_$Y zcS8OEuL2&1_`;_VXuXP`_E1`Yn(3G)a4ql=NCbE$@cTSW0r>!ZW?)Fk2N(sJ3$6!_ zffR!00xv>Vf;R(u&BTa;8-d3mrQnUgq+nByaMEJb1kdu(PP#S^PAcf#9z*P$|jNlc(L5pyZ2R8y&L(0I*fK8AMf1vvF^~di;2p5fT5iYwXToy8oa1lbYMhF+zWXl%22%#l&kqIG$a1lZ#TwH_@ zLI@X^HQL;5u{*o7i_q7%?&JCS>wM1d^Lo8sKh8O?KA+D8&rV$M?8Jks?;X4JxxT)C z?cCQl{_QG#{e69X<^xt*hKcR_mtp_k1oweI{uI!<-^$DUvCqJrMwr)G2M3F*fagcx7tWL3 zb_6o<9CX8mK<_oZ0mS|qoeHQ?esD0I#Sng)?`hk?0H-}1;Tt6*pT zJRBxBKtHh|FmHn2Iam0DU3*>seYPx&;%gWzo*)MrK}QA_HbrjfS2!5{2XYJdV9>oW z0ouMq&i{Y#&F8>xZ44eY0G+l~`eMCr9`6332Wx8reYa!4{RjqUXP^%si=o;^@N+o= zX}p45X%pz3$B~Oh&>J`geBx#Jqy6Ch@2wPDc06_?1oN%HwiSc^?J2AaE|Uw;+-_;J{cSR4wegt4#6TCbLT>1cdDj@zFII<0i zUPrEVkpg~I0p5iDk>kLNYl3(FvMd+ts~m}9VRhg{3pw))&YJ=x4K`z}uZt#dMzqkK0k0Q8qHVzuULm_<(f^!F=SW^J;w`Ev? z4z7(}d>!=W_X77hfTc6gAKDharGtL)@|D>C-Z~7M987AzPU{5Ao{Ax_j^^Ob$X6N| zvOEJnxD&YdMDUu9=<#nDNPQauvAm9c-l+XQ{-q3Ei-1{2abq(KrJsdgz6jhZLyl9x z^EbnvJqK9a1P2R!;Gr0HjoPjyE#ATR#faOA>Zsg(D{sYV%i@m0HS7!`78@m@p$D=^!DL6>|0L9T85e!WLTSo$G&%rnEh`g}| zto<37%wTWmIpinI1U7aj^i&BLYj4aSroY0V{ZA-3w5W#X70_wWBfka@+=jvV1bXQP z{Do(LKFwH22UYl==*_PITx2F=eFh&2b5UUJd#+RevjpbVnkb!(V)i|t;bEXppKA7I z^b3N`zriY`}aV@@yNC2a5VG+_~1M6 zi$3tGPE^Y&vfGFJ)E3~)FOX05c2RHt=dw7oe-3nRgh0S0sFNl-7Y>(NsEh@&%OrCQd`XxE=D@ zPZ)sv24GSrYGxN48xqJTt_B8lyT+ytz)|!V47nyTFgFY=zKwyV5{nUig2j2{XLK12 zL@_+Cv%T;!`rZ)q{1WoMSA@U03}b!e-@=F-Ng#$lgHI@x>inJn`V~-IDb>gx$T_X( zHNV1PE2OEu8@#D&-JtryrnOdowkOx!f3scCTZAT!)bM|NF79u1Dk3C>Soq(bSnJ=GFs` z-%nsm@1Qr8fNnSgx%x`b-J2knehmKT{*uojH+<46?Ei`1z;JyCqjEn13>U$NGy|dY zkz2H5c;a&8=AHnikC)>k!Aq*Fj9U_by$Bp%Q7IX8l-eg1;hsSM?{J*E0E6D`z_b0} z;eO;27lUU%gFmiPtYibPJg-l99k8&U{2Yy5Ii|9B-de1u%>WEonQ z5vI9?A(f@)}Np!)oAd)h#{}e z_OKF{@mDZBq@y+bJ^E>V+WKG7YXq^M`5Sm@#=!nJ>Do1D(JX$Bz~r|WwmpQwcA9|7 z*MNsLLmu6dtugrN=ix{GjlNMcXw+I*cpd)OT#P?Bv<7Me7+5%l0DPay(E>1~O2?vf z-K*YD;40(;$`1l6w`cwb-MA6@qvv8j8vu^P3`|L05t^rDNC!($-_)({RYC_xO9#$C z9>bY~F<5vK{fe&H+3lgvpM{+3LEw~%*4XfB2(+F;vGD)`X65VV)d(=C2E^E5$PFnV z-`|0Ad0p( zkn{fo!@(_}XGOPv2=38Lq)$e!_!Ka6p5%4;1b*7J*W3R_Iapkggev0TEkqh4xB=*&0pgO@>HPDQNe9p3U!f1_wsb1c`TL<)j}_cS^?yW>h6nkEsbS#s^9Ux4z=^AY z{VFQ^)sQS{^#|2lu3X2A3}_8G)H?|l@B1W=!*n2^KWq1pOKsYAGkq_+IKf{*4>t2tZzj7HnK8|N;f6#?en7W)+snz z@EUR{aOyW_`BF~FE8Hi{u|cnt?1yeDZ6#3=`^8I zY*=;t!ea_(KcK4{ZZF`dicyyu6yE(A`Os1D$9DtI>)TsXu(eiX{H1YlWGph`5ds+{V7#DQ%`V8)D{`dR4N9tUREMBk;-%>T9Sf46Eg|Ema^ zRHF@O+hs}w=)MC7r7gfymm?qk4#UM)acolgJ+4n#I~Tp^-N;WUU9ZLh5UMi>n3b6< zs+rtg?oxFZ*ZuH4YACjzL@%TqFz+A$=Q+qZehEJ~PoPc}ER}b``*pX(Lh4e_ybNPW z4Tjt!7|g4|=&#A3^7~{+Gq5is4u+ARC?L0J1vlySEU$!QX&vMvsb#rX->ePWmIcBomfC?`lSG!#UIvD-oG3Y}l z0IQFv{vUY{MZ@vHr4oNFe2W-rsJX3QvG9 zTpr^O@!#?7mo%cJQmxvLppSim!Kw=fKIL+wx|F=i^&-zB-%ww1Vsj1b0_f99%~DF) z7Ge((K*$t0|p?UsB1H`?&(qQ>%Li?-zduUe!H6e*kz&c-2ini+^TBc0Eqn>FxBHZpEQ%4fNvL zExu=wZ?D-MfA7E;Q_@(`wVUZi)}t>ygJ4ZFWY$q!RHZba#>KP@X0A|kemSq)X}W$10EV>1h>u`%u6MFnC!97g$50_)!y=<-32sG||S3c9@mtf@bc`8P9TUr`I*j9x{poc1OJ z5+F&9_0{($(%Cx@EF6u%;2?15CE-_Nct}0p3B8sTl>v=Cg1+NDmpd1`m~#Sfro_2%nO zgO5Lg{r(TTa=rcExfjDzTAjnH+3Y$n+_#}%*ZuBNs@BmNUVa~ktv!*OnZ}Vj18%;L znXzq;+~m6O)7Pl~msRHC+#dnUDkxZYM$q5_w;uwWdkOlY8R)s30VH(<7nGbDsqy+I zl$<8?NhYGmkL;uVU&n-D!iMUHhaSXu=b(lgzH8WZNd2&|)eU_kxDv0pZry_cfpu764{K-_=n#n$0w*?g@ex-2E{}Dh_zwcRi z5q;Z3*c;V5fms<=w7*O5?f-dIEVVWU`i+d(zY&V*H;6p*Q}}-E0q1QA*cwUVT5i`uzR6JZk$9U|HAf z#19F;z2eB#;_KISJ2ZoQGYg#ZX#ZC?#9>Awng1_%Rkxc_#c1w%Mlkduj%-?N=EE=; z*a&*$Qf9^+#*Xh9!IiPoSn*@CF$09A7r{pNX|y*p5fvV_JyA@ZqA6T)+i7M( zn?RplnE=Ymi>t5C{S@@j#~P5Q#8^|L#qs8IZ!7)-{B*Q95QrBW&@jt-w zZ8&bvfrnp3-mx!u)B{}d0!LJel{-DT?*7ZVG2q@?2Cieuofi;L;zs!S&)_FNhwoE% z>{EIkUJd?m0Dk5J@aQMNfE(!cVmIGgL%sd)Rr{=@9`M|aj38pckV8lE{Exuf%5H5d zMy%`D?nBQxO2C#9uzeD6NDq=>9l?X$18RByJ5-y^e@SGa15vQ5Rtx1YJm80KRyCYi z1G?{20<(Pp-dNG!dkgxEO1j2T;4Zc6;x6_7TxVf;b zQNYLzz_c=_%7mu=TO7u9l-Kk^(pFMCeZ2Dj;28)ms2WZTgO^^y@QeUUXIuO#3RZJJo+WXh<={87}Fm*-!XLye*}7zRu8IPUwRvd{Yo_I zr+|-Z8^%}0q4jp?!JB|SCAVHRojeNE@c@2eCEf28EhhIcBd|p=FrX=pJ_TMp0)9bh z^oUBgS!KcX93vjP8o8$Gh|2EJ2d^YhJG&y*H{3wbvo#S#HD%__G<8n{BQ4}we+SPT zh@rA(Dts*T4v9ry^c4bby$Q5x099T0<>jV#cmE~6QTTTF zCXFbo$EcDrpo$WclpM?!kY7^nSbdH_YJOm-cW(6de`aqSwJt^>KSBW2%@}cGbNID` zP>kG$T=in`p-W^?CuMwV@PZnTHl36MO5aOA#(v{9-Tw})`i_2~VAb}SITuGkElNut ziY8S^mTPcSc@w#|4y=JQ2|Tbm(5+8g{Rn*WVDaD7{+}~qDESc%=E4Xh?*NWp!weL) zU9C~%rk;ZCSQR|FF?O7qsn!zuR+U`CyMdcj%$nYbK^WW(1HL^lFmf=4{hG3QGjxvy z`M48URGZ$}WCon~qi4|%6I%M6!01olhxSCT{Sf|!V~a3m^s^ZAuENj8P(^vaQ3c1K zDxC=*2BuF0y7j;?VkOYX*En(o;18-|%9^p8S{r&SsC#-=1wo-71O4kDIHqKAVteRm z1N7oS7)Txm-roX-KV<+5p8+H4qURKNT!EB%py>Yo{~Q!O%35cY3FY?0z>*Wkllpe{ zSsV}Rsb>68^o;|IxcNTNvj=hp9qqX@u{WZ}E9df~R(JnR?g%4$FADSOUc2;-%YTPI z|63W>eqYjlUedju*NL~Jd%yiUdczM9p!)&rH*W!sOm*$`_J95+42LB+c|0SI-il!U zcNp@CJ{3fMCM`qS9i{uAFDNl_9gN=49B@?4tEo0}*6t4*m+$}1aX1Wg3BB8DI)y^v zPUzYDz}*R8QEMQ+Hvt&8MlXFBu(2j`S=}ApKWiZWz_IfH__L?${lBQQdsb)qu=@1v zlL?@yj^@%QD3+eZkmn_!`*j@WZpKltAG)RYSFE}N8c&{idQOc`y5sK&l#3`> zm3~jC0Xb17fR-+ki93AH79=x~UHS#$u1d2;POF zOH-TpD+1XMfzw)SReb_$N;9(;{J|FbV@EPWize{2`iVL1jxlZP{5$B!Ce?{_?Si2J zH5$j1R$J}RTS^$>XQ0@*8AtP9!cUwJz0zCN-5Iq!16sQ1M33kwU%0kBk$66ZN3)V*eg(a z`#<_D5gIh|!6op5vS72IK~3md2!39*VRn)cTh-+nP~hd?AvdX7a{65Y%kNGAm2cJm z3p8LW?j+p@eFfsK9+to#dD){#A|hGb1CT5~&QsHuKI@}C48 zdMk!v?m!}nsATdx5op~29N2|`CJ#W)Fo@pB(+YIOqm*XEej)T><(3oE=uO9=r__XU z##VsG9(__)BipR(YC=`@D7F9SbT!O*{{Yw-Tx5i^BY>%*-v5mEG9}hGfG%AQ(=`-k|0u)TqG);>XqRK_1@K$y4Gl^!Z%`m=$$E7F zjpVR9^_A}bj8=K_KPZ@2#X)r?;IvvWvunclKZnDlN~?rU%)yP2H*4GZb&I<0Vqk;1 zq&h0q9F7(Jf9>n4e$N}v<6v$C7}yyDHgz^8^ul3QKxvg^qdy?PSzY7K2}T+!V8`=A z0<5frymoc<(JAwh_f{v3hw3vWCq9fL!kwuhp#s7od{Ej$u=s~lv zHhBJA?8ItH2IqA~PwV!Y{XYyOJp^Le9y~aXfvB2Rg=^qXz5u;~H<1DTa>1ed+Ip#GAOdtEaPU4c%l zhTP)n3?On`7w_$V`#VIKx(PU-a(ZlgrnVlzuxBq6eKXKoJ793S27O7}${&QERt;$X zJ$%O~^rnt>=ici7c@9UweG87}-$l@}9{9+HI2!l}x$5KKnGL|rO2sNV86$5okZGlK z3y)yW{V?`2>V6OJsQTZ$4~F`6^7XHegU093gHfO-i{X~q=*eGWxTVWyRO!6yYz1%w z4g;qkH+vfN@~@$fofhK{9#y$5?Nj?afFj)&aGo^QNueijKyV(`7ay!a1E>?tQ?=d^l{BFtns!#e`SEp*IdaZAU(=?ARoF z{y_9yx{l*2N=t$<+jAJQJ;R8NY9x#!Ruw-cye z?|@@7$k%p9F7%N0f3S?gR2qfm&%pc3D5TW4U(&5LmxUiWh)*@A09?wNN6vun+yZ_r z4IKRzdhSL1crMa@oVXLhh!$OPMbGyz0;sCo&fhCVB@n}EPBknz=r|dfSNbNsC-!TG z4S$Efs5@jN=0Gu_qO!g^4g(7~^6D=bM06mT^w)1fT7+i(TMU=EZd3oMb&ckzJP%ej6T=X;G=J2aP&J2P3oxj=wKOdV6c54@~N$mkMD|n zoK|tj8VO2yRSiDq6jRW1q`U|HlfSNs(hiQ$LYxk z0a>HKX&tpgD$fU;(DTZc9skq*x4gxOBg+4+zX3OBi~DHCz97JbRk80|UcBA?=lKN!tzW`${070`5#ZS^;8%_$z~&J~*)7mau1=K=;a)4fx=33E396$<_bVI*r9aO=d1ni%=?KQXZ6!BKl- z=+53qx^_xI=;;%|XY`aavle(!Yb3ANaKp>`{eS&-49%WM0C~Z|%L$~h9)`z%hM{RS z9_G%4KT(Gt(Z7H)^$Kz$YBrgacm(G0Goo5?@n{tc<^wP^{xShXR4OG^8I@PUU`W;L z#77t^jo`Sf2E*iW;K2>B(^2(n(zTpQ$Vb)Nxl6Pl`Ljf++O--a~t5W zU*|{s<$_$hjR?WSVy{h+u1^9dYz)Ic!Zi9=JrM)0U2 zR)#dKdfqI9bE@~7x_*bRM1E0iy|xj@L%NoySH}KaTl?P}B7l%yKIX4Sps2KZ;yw(9 z^sNW9y61O+J~)7ULnYkO5O}|4%)2pDZ&iEFQP&Knl>d9D2w-L$#nF2(JhUzJ`VVAa z5AZSF0VX9B){~%T&c?9$SmbB529j67pSu*kT?gLa)iDT}?o#NTU{lKHi`SwstSRhQ zMdRI&01a{UCRA7$baa<4$8lgzGo~M>riFVpg+BgM`HTGsgEOxIM_z=H)>=qOa6)pW zt#NGAZCFqPa`s;I8t(wB>tfHXPZ`iB@#&L|I*^OSw??oo2NPm=MfbmlU|E4QA0U7s z@$=%hE7&(w|m0(@M5vBHBERZ;^FNUB&6xXA?|&1^M`3sMtF1PmlQ8sK0x{}$0a2ZV!$)Fx zKqp;uWdcv01l_lUo>etrDgr*N0ONX^i9DqH->Fp`RUU8Fkr~ucIiU(>^f4R_2Qg?m zTn^s_kEnZA-VnTBfwYwi*6h&hN1&HJTKm7DN8&+^ctHoow0_aJxD}3P&jSwVpfc#X z4xNSJL=nSTKe$<)j{4f@S=HDGJisRzjH$vYMG)v{wR%^Ac~e>wv0+uMgX&KC??N!}EQYhk;>d9$Fmfg^^mh!G zwF}I8oU$B9;LRtolYSGqj!w?@G2rfNm+i#*yt>~_=b~WM302qwL5s?7hfXlZ^#oS3 zYKBy%XTL<=ehdK?brLTA9=Xs_Kx-Pgz;YSi-G9>|2up5Y#SCojibCdEVEz{9@%?dN zy%c(BBLa_H2Yup)1X$4ZJ+vMCQC-91ze3LSU{|iU{}Vq(z^~Wopemr5EfI8ngu%G# zgyN6D7q26rnF|OcaFPaaF#N>Np(p#mow`M9|3=Qz{Y1<8|B#Z)gbEAq#wbKKBe2en zzy(#u6AHBDCBT5P-|?+6Jaq{4q84XT>2^AYomLIGrMiCqpSTi*)QWBKG6LhO35~}w zl7jYe^?KxU>ho1KrRfu(n{GjV{6QQhirDk3C6hfFxyV12|Hs=17OsI|P)oI~skdu2 zTU26M)nd)9gM2)RL&u#sGCqO5$Zp^TeS*|V$R~!8560B93GWIcc^VAQ7zS)A$x6y_ zOt&C6pklSQH=nBZ642U@-o!yTcAo-0`W|*CblHvl1U$B=10$`2!l-oGp~qvR1&3AD z0sWt%*j7R2 z=amgdeubmF9vM}|Hf(ZTU zUO8{YVB{GTie~}SYY;&C9s-*?8G8N$=(aTlRRt&XX@-G)p5;FS2a3z3W7ho1RS%|rrx@*wy_4sb_0hCpN`MsC$f z=13zDzYYc0NAL~0&BiU@dBO1q8EIGnwDd#7;f;|qtH(U1mTp>2t$geg90b&4np_oy zs1<{)pAlfP4DNY~!0cuj)?HxJr}1d5G*tJGsqD6_j($oBiAM)o%=SYZI29lefSz}>oZMy}9+*IlN^`s{83$ST*f9e|E+dLf~=qiM~UVPoWmKfr$Ciyq$He;)Pa9O_t% zY8zP!ILzwAYy3z7Y2SPGd!EJT2_(J)(4kb$H3B|$Cw6Anz_D+0V6&Hb_4a>Lg~Ny% z31d2PomxDj`mvdH6AaE5frGjY8`C(*s1lmHjhU!)^ZVX*b^aK6t8TxNu4%)J>VJzy zKBAm%MmgGo`u2?jWbi0O{xpWYO4oyW4@_$HPpQp5_cnUD?UA2Rm)$lEJ@H5F|KQa` z===!|JU>LBu{Mf<2f=5z16KA#F8@Q|yn02Ir@>QyLNEOlaC{JYO?D>=;O+YAK@@@1$b4-YFl#NPvFmJh8$`>`IVp)m4LW^fS-ht+WMx;c&yL8CkC3j zts18?HA9->g6{8@R)2)Tp>OCk0sk4wTt2s5L49K80F;*hL^hM~0Z$N%}!!EtI z|0lG+`|ro_lJ4uJDtJ*RpX*!#oq8ODzB;h{9x!zVFnR-et_yKA@mKKRlLX*f3p@G0 z>)-!reTblU9s{P!Q79aSU~zw7YelW6quF#edYPv&Jp2uEV+QE`S3!@afXxYD`~>VT z7}WpE9fHE7E|=1$2pG0Op{^t{sl_^=#WZVIVE-WShUn7|VK1;AeBXcJ+tj9;61{bo zveA;x^vsqh1l9*ypCS!X5_}q=*^xAJ|}$cCj^l6W5>4va^=`P zjBrVh&ylZCto;d?SLx(^1Kg*?!k0xaw;eF?2Mk7k40LpRyS=mDtu)q8=(Tz(es>x*xXp!GTEvNKC6)WiSw^=a1;ksc99SLw|7r ze)g1Q{aD|S(&~_s!?D{@tg7}aH&C$X1=RU1Bk`-@xTwTq>`deqeusYLQyjY22k$=z z+%pOu*t`e3`){!edQ)Zi9}Mg3IEd<*%>O+6&@+s9TsdIk6yyj01bs=3jG0YvWY9pS zC%|Xb>Y4l*c&k?{_V&N=WliNI4BHh1;Jp{efnn(B>!2t826RZ?x;25!X}`DCtWL?U zDTAG&Iw751u{Y7ZEn~fr7oSl?*CJT@I|l2I;%NLF@W~^A?wbg>u1{yt?*Yxq1L8Yj zr}BI3){Y1I6tM4a*jac@_kX^Ez`zSAx-LW@pq5GXNCF9tBj?cT*!)ohVp0od>|ylU z>igOCR6D;ZcIVYEaI2qSSzq^mMK&$>QvNEwe! zCt~OYpm(&}sYdIh9{s&~bOcs?i+Kfss=uqqgo`v6h73k5C9G8AY=R{-6F2A?`eai7H%4A&1<-8hc`+W=rPhzB2?PG^J z9pl=zk;jm$-a{ZmDF#r}3+VjS1YFe`3vQ?Uzo^ygy$i+6l^XHQ7#!0jlu#aEQZi~$ zk{LXYz!G}{rw#*_L%{F`3QW1;@afP)FRtkSy{Cx3!m(YoVCY|rVCiKHWVDD19&o!_ zwe8K(o6rFhx&!`#DycyQGNkM`_%r+s$GhiW?*vTUK}5dYG35R&Fr?K#^D=?h9t9>< znAFb4(WC=7egV)^LvBc=*uqZOYq; zhjb8yjs=gNgk%4T8u32xCA}><)I&C}j=k8@%9{G;Wk7E>AsYhimEb!<@CU;fZ2kg% zNcu??tEQKbvwPs%-vxJnjGc)WfwPqHvA*iIOilf87&(3GhElRYb*qd@p<3z>%s7!R zjiMjj4Ts_9fFt{A*C;xEN9Wc&;V z!`kn8wQBmcc&oze9puM!1e*@Vu7AyLAie!x6(M*C45J)P{{lQ)$3Q^k_plC-rgFIj zWzCDa@9l@8=h32E6y6?Zfp%jfq-LOMrKm#Rhl4x#IejoN4Q(~OdGyS zrIlH=qIVzYM#;4$S7>3!98vxs*%Zg)JL+4?f#VwtSPlV3o?v9n^<>zAd`<_-QVl$D zI&uXaNNznm4Re?XXh~^vN2OOujf6R^5l3 z3VUXyY(*8h^Li8Vorzo}b~%nbyF)0ZfYV!HU?HoK>WB_*fWy!wz>2EofET@q9nhN< z9$5#vOKZvWXK>TK=*N;9@(1S#jKI%t$aQ#c=(wxI9S zFQPq{Lmzn;y7%YHu>1di-2q{GO9ZNFy_UDZLC!9|9lW?6&~P9#H>3i@uEM0f5%P^B z{5d5ojenzO+yQ=Q^B%vu|HjTnu%VjFq>RS;EK@nQAu#uAU{koicYk-cZ)hB7UKcpN zGtjmwj%N3kL!E^4BMdZpR@ZND|3}nvUHB5g@fEFAy;wSrhi*_&IncmC<3!auha<~d%uqyKGVd$!=Tswxr@@!r z#BkzG?8NT?uV09r)QXyMC-C%-bpOw6ieUKw6#G*cEKJ~d=5FBP_3#JOrcbH+?dnZs zcP1;B!Joeo2Q6JjGiu|NtN5Az2>Vl?EC0`b525`%0-Xmi*nc91lKTCxP4~9tO89eX zMrBq3x5be6eTSXej@Wf*0LIq{(5A~Q6jQHfY!*fL85lBY`x*7ks&B&&s>|j45JOXv zo6!t3Z$p1T_Co6OFX^0ERO#kj!d|SYe!NxJZBEx`@d-vS^A3(mx=tN$qG(fPWBCBN zS-t=F|B?VEcSCQe2=2NE=+u#%0Pp_$pFf4MurY?x_iCgvG^!$UNKY;OIzR?gQYCb5 zIP|SEYD7kKZY-XSz3>2^qW+;i_3k~`-GAe%?Tq?Cfk)eD>W2gt)xnWdY32R}BXg*o zmU{#T^B(~NNgSB$=m*YWV5W7@Yw5Z-T-}xL?f>-SFbX=G=QTwEZM)Pf7?_;G!Q}VA zMO8p~RX!PAIt^t|DFvR%Aa7JJ$o+EyOLX&xZvNYCK%9X<@H=2z4+hcm!5vzJaV@5_ zfq=(#9)y$~2S%VfUj?Ry(a#+XjH~*soDY9C-yQ#Q0Qzl5R{J`rpUJjWUKf9lf$E7U z+H^jQt301lTW(IJR%6BGvoj-I+!|<9#+1AWJHZuySG%gde*6i(-Qs3I`#ns(RRLvm z?>jevZrhB&Oz&cF`akHkXK)za5Bj{4SZ5r)p_7qo#FU-ZF2PXvdKj)>An25#ggPN{ z_3?+*{mTCf`LTm=7|>b@od`YkGwjSC4?pXLZg~!REU_nlnA9~~)Ok?TeVx&5S5;5A zql0Bafg4qr3@G2Po{hco03&bc;nJ+!aQrOjx%HOiVtt`g8M#H5(4ca`@^=VYr-6~z z8G%JpKdSAPtDwKAU%MF8#CC3g{P;@1+DV#O6{ogadjWL!Us=VY{c}x?M(C?yxcUb4 zrgq2BJp|;~LNG2^L_Vd&r2h&{`8M!3UrF7=v*g zFr`88pdA>#O?-_ws78cYyC(lN{J=Q`;+(@zZ8`Jlw*9(y$nySAeT`$gem*y8M9_68 zisb}wL5?CSrRwUGhJTNI;Z?z>ahwTaw`D~?s3uif1&sM{_5UW61<(DNsY*If=yWiU zP;zQ{55uzo_{jozC&Xy6$1<2g(XJfCZPny01{>X_8AoE+~a_?&YPi-iL zI*h@!!Hue1Qa7TQxRb~or($rS+rjL8^MPNXH|0YwX9W-M0lzbiUUDDoOg;*I_G9h; z8Rh+jrx7S9$!sf$G;RewtfI916%I<<0Y|UFK~wqtLJWGQ1vKAAVCe*QqS^)N*aa|# z72(Wp5SZ~0;h?hCg^j?6b?Y^sl)*gm&gbE~lHd{b{W`kVohK7uNi*hq8$4#zt(MpT zgXTYCC~QW+vp=wXwMP6`<3Ff&qlzL%ytlLQmmv@L>W7egNLs9XVgGH{9F* zCS5WHC5r=EgbVjzxN#!^rt};){8J1R)wB-p171)DHKOa=F^5C*^|JE}a87qe{_oxM zueW`gZxP|p7Z|c13+_J<1C^ga&wYV`^kcvU9YncaC$o2uX}{Npz|&VC7uMU6OS{az z5qA6cRQ^A65Q3)dU}Sy*UQ}Do{Wbwi>kcsN1iy4C^r9-7*^8iuP7u_hi~OE|2L1uv zyB~1i4AuXs4{@AUl{>9Bo|)eun7$u=@h2D>xeVN~J$OO;yYd3^3tth~fIda%f8gGf z22uhp#QFs7Nrp6^5%SL`Kwj%w#bN2yVbh+IYAd|UWq$AG8gAfZ<7sAe{$ZJ4?h zxvI8n`2MbbZ~sSh^oCEsphI1)vF@f?-kw)#ao*2NWbT4)KT4l!H4NL&0-ui}-!@7< z4S!N)w?*%T!zb$B|1#)cX{)|3ABJK`X>vm&F|CH-+BgQM1btfVOR685N=C>3h1aA1Ae>q`VS?_=fLa+5!6|T~6b%-$C#NF_g9lehSR|0XUGP)XpdxPLd&gLx&QFl)hcze;Am)2FKAO(DRz1SAGNR*WVd2 zA0T_z0dub|`|bAs(*zK{07Ka=!CU_VpVHb0svyZJ6Y5tjXU!mI)bgQ$`4uMY!pS}-#O6~bU8+z8Y zu^SMysueTa!+ZPR+QOk<4MM}?C@iSRtZs|pj`;c8ksn(Zx$?>2(Z2wV`cxV5+p3Vf zCghFV6Ijup{XeJ^&+`WavT8ET=_eCOP3@FM;5`}xlj?YQm-zNcJuF!Mjh&2U%%+a$ zknRMVI---;>fitCs6t7qf@!ED;!0uI^J7M4k24bqRWL~_j)qjQwDdPAyn1NJ-i>_f z8{`(wBJkWzz_~ZH|3i~Fn(h81x_9JG4*?U(hO^oo!6<=b55~Y$RdTzbKcu{2_G07~ zv>4sT5y+@s$sFpor(^5Eu+Cy=@icwia(ipDv{tGx}F2N$47L1caBA`{bL2-1&&@0y|pj;QB}*~KzIDT)ty&`<3Ark zy`gZjx0?Is(T)p_)TQcT91Vh7K47(fz z5Y-}_QQNGh)Ml^vJbzmIC;V-v5Sl zB-R5chW`y*()I~xHw>HveepFM+4SU^Ry`1Y1BdP)4kpaVg_M98mRqjfgQ$v~*(CpiaMXI5nW}FI9Jw86(u@^1LN2S9Pw%D#Ho2+t z|Ada#h7yGNzYu_R0>!x$3gw%j4`>Qqd%>Ul5QjkpQdLKE=}GvO{Ry}b#m>B5&+M^H zU^q6zK=gGSIJbrF`w+aSgCnjic=Si`6Sn}27_lGJfwr_9aCiSr zdJ(kh4jBBN5zZ?OchAA^-wl{M8AGEVBUkHQqrE$1_zw!;SMc3G1t0o`8Ll1%eNZWw zu{V(3{-53(fvGG87fwL2@{t^z1mAB0)*~45s~wk8sn&WNd9x}h`<>W{D1#bPoiU*S zm~K@4KcL)gQQzFElPsj4QbvD{;rV_>YCMVnrgSSN?a&K4vaM%>FZ~O+@Cfql+Zn)u zw)gBk+W(PF5Xj#^#L4r3W<9_8cEnIp=fv=q7;46m%g&-d@(gt2z64x)8~W@P$c=9V zJ>kQiv7-CmqsC!$O&AeU|{6m7#`Fu=-(T`kV>(jempw=odVFUH>}P^=QJEn%W>rd$>|`=slHfT z8@sWwi-~CJ76Pbmh=Isn(4E?Di+Wh}=yDoRwwyW)2l+cOXj8MQ|G(hF!`Su8UgtsV zCb`aIedUL7II7?GEU1CFsMTwjhF?;aYyBPgxLPn?opc_xVEWYsYwI9NC^egWihxQg z^OMV$Po9=(Je)&+DL(%_71g-ml$CXmmb(FfFWdvT;bhAzHgnGpb`n%za zDm+G1^W`-I6M9<~R^F4>4NtcdOu&zAbkVCL|DTX{@0vXdP_gn_Ocn0(-H5$yS0T=XJ z(eTxL%Czzb^CioA-S@xMVa(}hH7QMQj^VhYjA!xz0`2??=nkOQP}c0#ly{Wl*)_Ay zPqCAJO;Gyv<%+Aj|H^A&a84ys{96ReTJ0m(F~TLSmAqas`nBj>Tf#4mqUSjldyNMP zaMlEWK`^6NvY8(2?SIpTD8{z{`qyA8r~AN1Zv=O#KQL3kV0jb=QFS&P%AQAb+b!sN zHm{6+K962dNoe(2?f)rdqd_$Wsya#=I$}#YIy27@Q2u`yT)Yc|-fe-7tDu+F0V%46 ztpA8WP5RWsHOU>J{=ZTE|GXLx%{Q3B`acnD=@S{R!cbf_p-H#q=nn`Wuz-ABx0_F$ zP^U7Y_SVSxyCd(VZ1!XfM}ykWv#;R5z8WJPmZQdhp|^WIo33I(X?jEZeO&JY{mYk1 zUtePeyJ3~(Ej?J6cfgKM0WZa_$6!f646bPvJDwwe;3*gyUIS=Qn?A1+%Rd0Ud>kW+ zF5zJEOzb9g3mWtyGAKRwAbPP8352glF{G)tKTiNw7lwwWP;l&oqb2QU%bVafm1M=W zk*og){RQ2M!yfE-8bH%em-S+OsRRo78wkLyldq-g*RPg}b5-QV^|)kISFH6n^c;V{ zuW2X|B|48)A-@~sq;78x;1=!txvnr9IDlTifH1!hn zs-AK(O3mhVfqUhDPHL4KFoGJ$@sjNFAXZaFX zzkq-m12|~apeK$8_k_`RJPbYF2R&9g9L2?N5wNK9kv2m&=_ghbH-jg&&pSsTKc=I# zwJ!#3e}$gk9N16`*K>#b90)zd;_klxt03^Th^+q#;G8m=_AcPfmr%4lgrlgHDO|`v z_uYwu=|8~l*TI&38h-AV@Y|>FEZkRV=y@K zOZc7R32^8T?AT6*?)Vh?>~Y9v)G_H-%{kw_6T0ia`vRhTeCFpUmRG`1KioRuY-vR+<#*7t_uyz@clZNApiTRI_{Z@5s*sAhMWc7RRJY-j3X@plT?{nTGIeAT96J}f zSq41XMoVkLkKZQv9db3bR05xXw{&?GyNj&%32a(hsdd3;7nf(Q`~I&*7F?eZj~f_C zTi2&Gj6&{V49{tsb`Aiy+>QLCO1OZM(2kPM$VbR6YSH#<`{s`8+3oJXITZ$rG7waK z-@21;JFH(Y6}77E%H_g(`7DhiSJYxn`f<3RPG>=PM?ja5bB2Jcy;QBY|7V|IgqEFv z^S27z0tkHxj68*%h;GkXOb1N-c^DZz z7=#DG3+nNhH^kA@w>YjV88uymRrH@R|zQQ{Zb=a6~kHW z=l;hr-24;#`8s%@gPb`JZoC^fwLLJYl+3DwX-vs%|NZENA46`K7H_O?_7oVM2^@uT z;FCJhTzW9HC5XJH2E?dZs5LbpY-ci}p;fTsQkk7T9ePb2)bu6TnK$<2y8ADuZ32oBg&K}wJ00oe-v0M& zi9v%Np{fUgJN4KUP=8?lN+KUupjEB%@-sLvUJo3QzR@qc%au;|{|7z?-1{j5vEQTn z-=)@SzgG34E{oiODAdp3llU&cL3RjeEyJHU5rgq_!NX@0=#UzdrWy46WzV7Rc>GG; z|3S4<`ql5tt2<@U<>b0r4sXHG(o;Be{{VXHQRsnD@Upg{{{sRkC|l0`lmG*o5!=7C zpA#yhXDb+Ro((iB;|b|o*7evls-kpB50vH0kS`X1LoX9hUiCq82|T18v-^GVV}pz& zp`X<(DNz_W8AJZh5i}l3HW9t4alV=^cMijFWK)9Uai$e3b%R`qrZ z-Ph>e_8JcnQ2GIlu!_QvZo$E$n6X)9I@LcQ=l)Uy(KjBq$lfbJ*VY7J|2_6bN z{TJ2=7LQEEn6?C4)Glz0g^t6#k(Rq0rCJ~-~f(W317wU|re1laU2fc9ry zytn^L*K35jmlyjn;8Q+O-5>tk42r?Ez(sE6nQsE{LAp zSik>SRI4PV6l?e<0;s8_;(rduMHvn%PZ%13Zj^(F72LEpBdvW8T-qOdW>v=?oeR@$ z?ft84Rs^u5D%h+0eP~zYY+E7MJ_W;_EuatV3?A4BeoNPHQkRoOx8}^=*pJQ9 zhwBTj2VqqEzU9H7X&U+`CYJO3mGo7#SZ>i1Wb%?^A|AZ`^NW4B|_uUjp!5BzzhbSb4^IsH`2vkmsA zdY4^q|66{60pnhbY(XbfVGhBiAaMRMV0~jo8u0*|H$m^e5XY_raQ15Ky0u#h?;&SZ zU6JVKfZhDJ8^GfTPN_J|Ng$`Rys4?oNY1TawNGlKUgZZ?O|k1b9JN=Z-9Z8^sef3Q zhF>~S`@gAtet1V1&fN$odKA#32T6yE8LIsadgyix=f6j9WFzp@LqMlGp0>N-XY_l3 z33XH=K~*$W7Xs}Ma9}b4XDm31uee^{#;`?IZvI;ESzX(SNv1yeBcM^u=E%3$59r>v z-H2U#Y{f(2+X_I9hXE@Fil^bA^aXs6`hU}JL7#LG=!90e>yOA~4#9y#1ITD`j|`(1 zc?EuKK?y`!8H`Dn&(s45nza24+Kw*uay-Z5*r1flq^h=+#_)u;=lG2pNDTSxBiQYy z<9Hi1K4#O1|0bm zzInOP(cOQEfFk@AkyrLbvG#ND@^5iC^z`fS zLpmqQy*6EM|1YS~=t^VQ>OpW?S@Epu`q1&vb9Vp(+Y)GNeQ<}m=6>B7P2uA=!Oz=} zx9Ik>7PSAzwF{EX?6czE|2qzcr6mNbp98)B#Zc}w6w12Y>L()Ka=`ar3-0?Txakz&i0XvN3i=Jz z0THc{sdr*18s7vaw?=S8je^8R-~m;;*(8Pw+CIrCW^8a0xb!%7Mz#Ug{t9fWW;Ezz zbm;&ajb#xCKMf4+$H+bR1LH>$!1VY01w;4g1W;5OT|NZI!@ohlrQ2`pGxP%oqCY+a z^r{{I|8(5}T$R=R`0@MP5H5-e3W^E}iHZsahJ}R&iG>>){zmJ%VL`)&g$0ET8+viW z?b@*6hMnt%1r4`rVPWCKhJ}R<3kwSCQdroqu7wQ>3mVq{^YA_T+yDQ1{a>%%e9t-0 zdCob{Ip=xq)#z!RN7|WmKtC8FAC(5i{6sxyHQJ3E)rzZ(Ta543qgNS=jce4gtBjwH z`RMD9zW??}xR3D*tI@0m3XNHgjPVvr9_rDDzzG&h7!r^SJ4)b0HQF%<%S4MM3Q0&q zHu6!7GPuzU4|>s$5!eDPmSDsnG0-y8l0hO1rEsAMt>{FbG9F@#B|#QTCF;MzsNuq@=%I$)S@0u=)n+tf|-wCzGFm_NI){|C_yD! z(2al)I!7@oPz5)d(FPCtVVh#HL?98V$Uq*-;X)Hy(FvcabdL0?H(4wNBud~!CF;AZN}&ELt(TR&f+2($w-GCC8$OtTF{Q}BPad&Z!N|+=W|T$ z8fVON6fanjYpdH=tVh~Yr>?LF) zAH{H^0nPBBA0r5kr)y*&3wbC-Ib5hmQ@rKKHvz^)zjdv5va`?!pSxHLB*2aWIMIl1 z48oGl3?K?|$V4`ZQ2{p^;87_dTx3KJgFyzeP>x!(VhDkEGvP=^E=o{|Iy9mkgRuOJ zZV`$kWTF^VaH9bp^kM|Txh#0DWr8JHe-BBY4fLxng%~rYm5{7N9U9?< z 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

HFAYV3uRTX+zUGX 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 z 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 + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {47fdfb7b-4bd1-4255-9740-81e9e21495d1} + fontcreator + 10.0 + + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + Application + true + ClangCL + Unicode + + + Application + false + ClangCL + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + false + + + true + $(SolutionDir)bin\ + $(SolutionDir)vs_trash\ + + + false + $(SolutionDir)bin\ + $(SolutionDir)vs_trash\ + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + stdcpp17 + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + stdcpp17 + + + Console + true + true + true + + + + + + + + + + + + + + \ No newline at end of file diff --git a/font_creator.vcxproj.filters b/font_creator.vcxproj.filters new file mode 100644 index 0000000..da24ee2 --- /dev/null +++ b/font_creator.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + \ No newline at end of file diff --git a/font_creator.vcxproj.user b/font_creator.vcxproj.user new file mode 100644 index 0000000..6ccc733 --- /dev/null +++ b/font_creator.vcxproj.user @@ -0,0 +1,14 @@ + + + + true + + + $(ProjectDir)bin\ + WindowsLocalDebugger + + + $(ProjectDir)bin\ + WindowsLocalDebugger + + \ No newline at end of file diff --git a/pokemon.sln b/pokemon.sln index ed941b2..237fa85 100644 --- a/pokemon.sln +++ b/pokemon.sln @@ -5,16 +5,32 @@ VisualStudioVersion = 16.0.31019.35 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pokemon", "pokemon.vcxproj", "{07F7D6C3-29D6-4D4C-BA7D-0D867747FB24}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "font_creator", "font_creator.vcxproj", "{47FDFB7B-4BD1-4255-9740-81E9E21495D1}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {07F7D6C3-29D6-4D4C-BA7D-0D867747FB24}.Debug|x64.ActiveCfg = Debug|x64 {07F7D6C3-29D6-4D4C-BA7D-0D867747FB24}.Debug|x64.Build.0 = Debug|x64 + {07F7D6C3-29D6-4D4C-BA7D-0D867747FB24}.Debug|x86.ActiveCfg = Debug|Win32 + {07F7D6C3-29D6-4D4C-BA7D-0D867747FB24}.Debug|x86.Build.0 = Debug|Win32 {07F7D6C3-29D6-4D4C-BA7D-0D867747FB24}.Release|x64.ActiveCfg = Release|x64 {07F7D6C3-29D6-4D4C-BA7D-0D867747FB24}.Release|x64.Build.0 = Release|x64 + {07F7D6C3-29D6-4D4C-BA7D-0D867747FB24}.Release|x86.ActiveCfg = Release|Win32 + {07F7D6C3-29D6-4D4C-BA7D-0D867747FB24}.Release|x86.Build.0 = Release|Win32 + {47FDFB7B-4BD1-4255-9740-81E9E21495D1}.Debug|x64.ActiveCfg = Debug|x64 + {47FDFB7B-4BD1-4255-9740-81E9E21495D1}.Debug|x64.Build.0 = Debug|x64 + {47FDFB7B-4BD1-4255-9740-81E9E21495D1}.Debug|x86.ActiveCfg = Debug|Win32 + {47FDFB7B-4BD1-4255-9740-81E9E21495D1}.Debug|x86.Build.0 = Debug|Win32 + {47FDFB7B-4BD1-4255-9740-81E9E21495D1}.Release|x64.ActiveCfg = Release|x64 + {47FDFB7B-4BD1-4255-9740-81E9E21495D1}.Release|x64.Build.0 = Release|x64 + {47FDFB7B-4BD1-4255-9740-81E9E21495D1}.Release|x86.ActiveCfg = Release|Win32 + {47FDFB7B-4BD1-4255-9740-81E9E21495D1}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/pokemon.vcxproj b/pokemon.vcxproj index 02cc5e1..a91e89d 100644 --- a/pokemon.vcxproj +++ b/pokemon.vcxproj @@ -74,8 +74,8 @@ $(SolutionDir)vs_trash\ - $(SolutionDir)bin - $(SolutionDir)vs_trash + $(SolutionDir)bin\ + $(SolutionDir)vs_trash\ @@ -112,6 +112,11 @@ stdcpp17 + + + stdcpp17 + + diff --git a/pokemon.vcxproj.user b/pokemon.vcxproj.user index 7ea7983..6ccc733 100644 --- a/pokemon.vcxproj.user +++ b/pokemon.vcxproj.user @@ -4,7 +4,11 @@ true - $(ProjectDir)bin + $(ProjectDir)bin\ + WindowsLocalDebugger + + + $(ProjectDir)bin\ WindowsLocalDebugger \ No newline at end of file diff --git a/src/font_main.cpp b/src/font_main.cpp new file mode 100644 index 0000000..9d3d325 --- /dev/null +++ b/src/font_main.cpp @@ -0,0 +1,22 @@ +#define STB_TRUETYPE_IMPLEMENTATION +#include "stb_truetype.h" +#include "load_entire_file.h" +#include "log.h" + +int main() { + stbtt_fontinfo font_info; + + String font_file = load_entire_file("../assets/fonts/Lexend-Regular.ttf"); + + if (!font_file.length) { + log_error("Loading font file has failed."); + return 1; + } + + if (!stbtt_InitFont(&font_info, (unsigned char*)font_file.data, 0)) { + log_error("Init Font has failed."); + return 1; + } + + return 0; +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index cf35eb4..97bc87b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -52,6 +52,12 @@ ID3D11VertexShader* vertex_shader; ID3DBlob* pixel_shader_code; ID3D11PixelShader* pixel_shader; +ID3DBlob* font_vertex_shader_code; +ID3D11VertexShader* font_vertex_shader; + +ID3DBlob* font_pixel_shader_code; +ID3D11PixelShader* font_pixel_shader; + ID3D11Buffer* quad_instance_buffer; int16 window_width; @@ -383,6 +389,8 @@ bool LoadShaders() { ID3DBlob* error_msgs = 0; HRESULT error_code = 0; + //Basic Shader + if (error_code = D3DCompileFromFile(L"../Assets/Shader/basic_vertex_shader.hlsl", 0, 0, "main", "vs_5_0", D3DCOMPILE_DEBUG | D3DCOMPILE_WARNINGS_ARE_ERRORS | D3DCOMPILE_OPTIMIZATION_LEVEL0 | D3DCOMPILE_SKIP_OPTIMIZATION, 0, &vertex_shader_code, &error_msgs)) { log("CompileFromFile has failed"); if (error_msgs) @@ -406,6 +414,32 @@ bool LoadShaders() { log_error("CreatePixelShader has failed"); return 1; } + + //Font Shader + + if (error_code = D3DCompileFromFile(L"../Assets/Shader/font_vertex_shader.hlsl", 0, 0, "main", "vs_5_0", D3DCOMPILE_DEBUG | D3DCOMPILE_WARNINGS_ARE_ERRORS | D3DCOMPILE_OPTIMIZATION_LEVEL0 | D3DCOMPILE_SKIP_OPTIMIZATION, 0, &font_vertex_shader_code, &error_msgs)) { + log("CompileFromFile has failed"); + if (error_msgs) + log_error("%.*s", error_msgs->GetBufferSize(), error_msgs->GetBufferPointer()); + return 1; + } + + if (device->CreateVertexShader(font_vertex_shader_code->GetBufferPointer(), font_vertex_shader_code->GetBufferSize(), 0, &font_vertex_shader)) { + log_error("CreateVertexShader has failed"); + return 1; + } + + if (error_code = D3DCompileFromFile(L"../Assets/Shader/font_pixel_shader.hlsl", 0, 0, "main", "ps_5_0", D3DCOMPILE_DEBUG | D3DCOMPILE_WARNINGS_ARE_ERRORS | D3DCOMPILE_OPTIMIZATION_LEVEL0, 0, &font_pixel_shader_code, &error_msgs)) { + log("CompileFromFile has failed"); + if (error_msgs) + log_error("%.*s", error_msgs->GetBufferSize(), error_msgs->GetBufferPointer()); + return 1; + } + + if (device->CreatePixelShader(font_pixel_shader_code->GetBufferPointer(), font_pixel_shader_code->GetBufferSize(), 0, &font_pixel_shader)) { + log_error("CreatePixelShader has failed"); + return 1; + } return 0; } @@ -830,7 +864,7 @@ int main() { vertex_buffer, player_instance_buffer, }; - + devicecontext->IASetVertexBuffers(0, sizeof(player_input_buffers) / sizeof(*player_input_buffers), player_input_buffers, input_strides, input_offsets); devicecontext->PSSetShaderResources(0, 1, &player_texture); @@ -839,8 +873,11 @@ int main() { //Moving Quad //quad_pos += {0.001f, 0.001f}; - render_quad(quad_pos, quad_size, quad_texture, { 0, 0 }, { 1, 1 }); - render_quad({ 0.1, 0.2 }, { 0.01, 0.01 }, quad_texture, { 0, 0 }, { 1, 1 }); + devicecontext->VSSetShader(font_vertex_shader, 0, 0); + devicecontext->PSSetShader(font_pixel_shader, 0, 0); + + render_quad(quad_pos, quad_size, quad_texture, { 0, 0 }, { 0.5, 1 }); + render_quad({ 0.1, 0.2 }, { 0.01, 0.01 }, quad_texture, { 0, 0 }, { 1, 1}); // swap_chain->Present(1, 0); diff --git a/src/stb_truetype.h b/src/stb_truetype.h new file mode 100644 index 0000000..bc04e95 --- /dev/null +++ b/src/stb_truetype.h @@ -0,0 +1,5082 @@ +#pragma once +// stb_truetype.h - v1.24 - public domain +// authored from 2009-2020 by Sean Barrett / RAD Game Tools +// +// ======================================================================= +// +// NO SECURITY GUARANTEE -- DO NOT USE THIS ON UNTRUSTED FONT FILES +// +// This library does no range checking of the offsets found in the file, +// meaning an attacker can use it to read arbitrary memory. +// +// ======================================================================= +// +// This library processes TrueType files: +// parse files +// extract glyph metrics +// extract glyph shapes +// render glyphs to one-channel bitmaps with antialiasing (box filter) +// render glyphs to one-channel SDF bitmaps (signed-distance field/function) +// +// Todo: +// non-MS cmaps +// crashproof on bad data +// hinting? (no longer patented) +// cleartype-style AA? +// optimize: use simple memory allocator for intermediates +// optimize: build edge-list directly from curves +// optimize: rasterize directly from curves? +// +// ADDITIONAL CONTRIBUTORS +// +// Mikko Mononen: compound shape support, more cmap formats +// Tor Andersson: kerning, subpixel rendering +// Dougall Johnson: OpenType / Type 2 font handling +// Daniel Ribeiro Maciel: basic GPOS-based kerning +// +// Misc other: +// Ryan Gordon +// Simon Glass +// github:IntellectualKitty +// Imanol Celaya +// Daniel Ribeiro Maciel +// +// Bug/warning reports/fixes: +// "Zer" on mollyrocket Fabian "ryg" Giesen github:NiLuJe +// Cass Everitt Martins Mozeiko github:aloucks +// stoiko (Haemimont Games) Cap Petschulat github:oyvindjam +// Brian Hook Omar Cornut github:vassvik +// Walter van Niftrik Ryan Griege +// David Gow Peter LaValle +// David Given Sergey Popov +// Ivan-Assen Ivanov Giumo X. Clanjor +// Anthony Pesch Higor Euripedes +// Johan Duparc Thomas Fields +// Hou Qiming Derek Vinyard +// Rob Loach Cort Stratton +// Kenney Phillis Jr. Brian Costabile +// Ken Voskuil (kaesve) +// +// VERSION HISTORY +// +// 1.24 (2020-02-05) fix warning +// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) +// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined +// 1.21 (2019-02-25) fix warning +// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() +// 1.19 (2018-02-11) GPOS kerning, STBTT_fmod +// 1.18 (2018-01-29) add missing function +// 1.17 (2017-07-23) make more arguments const; doc fix +// 1.16 (2017-07-12) SDF support +// 1.15 (2017-03-03) make more arguments const +// 1.14 (2017-01-16) num-fonts-in-TTC function +// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts +// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual +// 1.11 (2016-04-02) fix unused-variable warning +// 1.10 (2016-04-02) user-defined fabs(); rare memory leak; remove duplicate typedef +// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly +// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges +// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; +// variant PackFontRanges to pack and render in separate phases; +// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); +// fixed an assert() bug in the new rasterizer +// replace assert() with STBTT_assert() in new rasterizer +// +// Full history can be found at the end of this file. +// +// LICENSE +// +// See end of file for license information. +// +// USAGE +// +// Include this file in whatever places need to refer to it. In ONE C/C++ +// file, write: +// #define STB_TRUETYPE_IMPLEMENTATION +// before the #include of this file. This expands out the actual +// implementation into that C/C++ file. +// +// To make the implementation private to the file that generates the implementation, +// #define STBTT_STATIC +// +// Simple 3D API (don't ship this, but it's fine for tools and quick start) +// stbtt_BakeFontBitmap() -- bake a font to a bitmap for use as texture +// stbtt_GetBakedQuad() -- compute quad to draw for a given char +// +// Improved 3D API (more shippable): +// #include "stb_rect_pack.h" -- optional, but you really want it +// stbtt_PackBegin() +// stbtt_PackSetOversampling() -- for improved quality on small fonts +// stbtt_PackFontRanges() -- pack and renders +// stbtt_PackEnd() +// stbtt_GetPackedQuad() +// +// "Load" a font file from a memory buffer (you have to keep the buffer loaded) +// stbtt_InitFont() +// stbtt_GetFontOffsetForIndex() -- indexing for TTC font collections +// stbtt_GetNumberOfFonts() -- number of fonts for TTC font collections +// +// Render a unicode codepoint to a bitmap +// stbtt_GetCodepointBitmap() -- allocates and returns a bitmap +// stbtt_MakeCodepointBitmap() -- renders into bitmap you provide +// stbtt_GetCodepointBitmapBox() -- how big the bitmap must be +// +// Character advance/positioning +// stbtt_GetCodepointHMetrics() +// stbtt_GetFontVMetrics() +// stbtt_GetFontVMetricsOS2() +// stbtt_GetCodepointKernAdvance() +// +// Starting with version 1.06, the rasterizer was replaced with a new, +// faster and generally-more-precise rasterizer. The new rasterizer more +// accurately measures pixel coverage for anti-aliasing, except in the case +// where multiple shapes overlap, in which case it overestimates the AA pixel +// coverage. Thus, anti-aliasing of intersecting shapes may look wrong. If +// this turns out to be a problem, you can re-enable the old rasterizer with +// #define STBTT_RASTERIZER_VERSION 1 +// which will incur about a 15% speed hit. +// +// ADDITIONAL DOCUMENTATION +// +// Immediately after this block comment are a series of sample programs. +// +// After the sample programs is the "header file" section. This section +// includes documentation for each API function. +// +// Some important concepts to understand to use this library: +// +// Codepoint +// Characters are defined by unicode codepoints, e.g. 65 is +// uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is +// the hiragana for "ma". +// +// Glyph +// A visual character shape (every codepoint is rendered as +// some glyph) +// +// Glyph index +// A font-specific integer ID representing a glyph +// +// Baseline +// Glyph shapes are defined relative to a baseline, which is the +// bottom of uppercase characters. Characters extend both above +// and below the baseline. +// +// Current Point +// As you draw text to the screen, you keep track of a "current point" +// which is the origin of each character. The current point's vertical +// position is the baseline. Even "baked fonts" use this model. +// +// Vertical Font Metrics +// The vertical qualities of the font, used to vertically position +// and space the characters. See docs for stbtt_GetFontVMetrics. +// +// Font Size in Pixels or Points +// The preferred interface for specifying font sizes in stb_truetype +// is to specify how tall the font's vertical extent should be in pixels. +// If that sounds good enough, skip the next paragraph. +// +// Most font APIs instead use "points", which are a common typographic +// measurement for describing font size, defined as 72 points per inch. +// stb_truetype provides a point API for compatibility. However, true +// "per inch" conventions don't make much sense on computer displays +// since different monitors have different number of pixels per +// inch. For example, Windows traditionally uses a convention that +// there are 96 pixels per inch, thus making 'inch' measurements have +// nothing to do with inches, and thus effectively defining a point to +// be 1.333 pixels. Additionally, the TrueType font data provides +// an explicit scale factor to scale a given font's glyphs to points, +// but the author has observed that this scale factor is often wrong +// for non-commercial fonts, thus making fonts scaled in points +// according to the TrueType spec incoherently sized in practice. +// +// DETAILED USAGE: +// +// Scale: +// Select how high you want the font to be, in points or pixels. +// Call ScaleForPixelHeight or ScaleForMappingEmToPixels to compute +// a scale factor SF that will be used by all other functions. +// +// Baseline: +// You need to select a y-coordinate that is the baseline of where +// your text will appear. Call GetFontBoundingBox to get the baseline-relative +// bounding box for all characters. SF*-y0 will be the distance in pixels +// that the worst-case character could extend above the baseline, so if +// you want the top edge of characters to appear at the top of the +// screen where y=0, then you would set the baseline to SF*-y0. +// +// Current point: +// Set the current point where the first character will appear. The +// first character could extend left of the current point; this is font +// dependent. You can either choose a current point that is the leftmost +// point and hope, or add some padding, or check the bounding box or +// left-side-bearing of the first character to be displayed and set +// the current point based on that. +// +// Displaying a character: +// Compute the bounding box of the character. It will contain signed values +// relative to . I.e. if it returns x0,y0,x1,y1, +// then the character should be displayed in the rectangle from +// to = 32 && *text < 128) { + stbtt_aligned_quad q; + stbtt_GetBakedQuad(cdata, 512, 512, *text - 32, &x, &y, &q, 1);//1=opengl & d3d10+,0=d3d9 + glTexCoord2f(q.s0, q.t1); glVertex2f(q.x0, q.y0); + glTexCoord2f(q.s1, q.t1); glVertex2f(q.x1, q.y0); + glTexCoord2f(q.s1, q.t0); glVertex2f(q.x1, q.y1); + glTexCoord2f(q.s0, q.t0); glVertex2f(q.x0, q.y1); + } + ++text; + } + glEnd(); +} +#endif +// +// +////////////////////////////////////////////////////////////////////////////// +// +// Complete program (this compiles): get a single bitmap, print as ASCII art +// +#if 0 +#include +#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation +#include "stb_truetype.h" + +char ttf_buffer[1 << 25]; + +int main(int argc, char** argv) +{ + stbtt_fontinfo font; + unsigned char* bitmap; + int w, h, i, j, c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20); + + fread(ttf_buffer, 1, 1 << 25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb")); + + stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer, 0)); + bitmap = stbtt_GetCodepointBitmap(&font, 0, stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0, 0); + + for (j = 0; j < h; ++j) { + for (i = 0; i < w; ++i) + putchar(" .:ioVM@"[bitmap[j * w + i] >> 5]); + putchar('\n'); + } + return 0; +} +#endif +// +// Output: +// +// .ii. +// @@@@@@. +// V@Mio@@o +// :i. V@V +// :oM@@M +// :@@@MM@M +// @@o o@M +// :@@. M@M +// @@@o@@@@ +// :M@@V:@@. +// +////////////////////////////////////////////////////////////////////////////// +// +// Complete program: print "Hello World!" banner, with bugs +// +#if 0 +char buffer[24 << 20]; +unsigned char screen[20][79]; + +int main(int arg, char** argv) +{ + stbtt_fontinfo font; + int i, j, ascent, baseline, ch = 0; + float scale, xpos = 2; // leave a little padding in case the character extends left + char* text = "Heljo World!"; // intentionally misspelled to show 'lj' brokenness + + fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb")); + stbtt_InitFont(&font, buffer, 0); + + scale = stbtt_ScaleForPixelHeight(&font, 15); + stbtt_GetFontVMetrics(&font, &ascent, 0, 0); + baseline = (int)(ascent * scale); + + while (text[ch]) { + int advance, lsb, x0, y0, x1, y1; + float x_shift = xpos - (float)floor(xpos); + stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb); + stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale, scale, x_shift, 0, &x0, &y0, &x1, &y1); + stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int)xpos + x0], x1 - x0, y1 - y0, 79, scale, scale, x_shift, 0, text[ch]); + // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong + // because this API is really for baking character bitmaps into textures. if you want to render + // a sequence of characters, you really need to render each bitmap to a temp buffer, then + // "alpha blend" that into the working buffer + xpos += (advance * scale); + if (text[ch + 1]) + xpos += scale * stbtt_GetCodepointKernAdvance(&font, text[ch], text[ch + 1]); + ++ch; + } + + for (j = 0; j < 20; ++j) { + for (i = 0; i < 78; ++i) + putchar(" .:ioVM@"[screen[j][i] >> 5]); + putchar('\n'); + } + + return 0; +} +#endif + + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +//// +//// INTEGRATION WITH YOUR CODEBASE +//// +//// The following sections allow you to supply alternate definitions +//// of C library functions used by stb_truetype, e.g. if you don't +//// link with the C runtime library. + +#ifdef STB_TRUETYPE_IMPLEMENTATION + // #define your own (u)stbtt_int8/16/32 before including to override this +#ifndef stbtt_uint8 +typedef unsigned char stbtt_uint8; +typedef signed char stbtt_int8; +typedef unsigned short stbtt_uint16; +typedef signed short stbtt_int16; +typedef unsigned int stbtt_uint32; +typedef signed int stbtt_int32; +#endif + +typedef char stbtt__check_size32[sizeof(stbtt_int32) == 4 ? 1 : -1]; +typedef char stbtt__check_size16[sizeof(stbtt_int16) == 2 ? 1 : -1]; + +// e.g. #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h +#ifndef STBTT_ifloor +#include +#define STBTT_ifloor(x) ((int) floor(x)) +#define STBTT_iceil(x) ((int) ceil(x)) +#endif + +#ifndef STBTT_sqrt +#include +#define STBTT_sqrt(x) sqrt(x) +#define STBTT_pow(x,y) pow(x,y) +#endif + +#ifndef STBTT_fmod +#include +#define STBTT_fmod(x,y) fmod(x,y) +#endif + +#ifndef STBTT_cos +#include +#define STBTT_cos(x) cos(x) +#define STBTT_acos(x) acos(x) +#endif + +#ifndef STBTT_fabs +#include +#define STBTT_fabs(x) fabs(x) +#endif + +// #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h +#ifndef STBTT_malloc +#include +#define STBTT_malloc(x,u) ((void)(u),malloc(x)) +#define STBTT_free(x,u) ((void)(u),free(x)) +#endif + +#ifndef STBTT_assert +#include +#define STBTT_assert(x) assert(x) +#endif + +#ifndef STBTT_strlen +#include +#define STBTT_strlen(x) strlen(x) +#endif + +#ifndef STBTT_memcpy +#include +#define STBTT_memcpy memcpy +#define STBTT_memset memset +#endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +//// +//// INTERFACE +//// +//// + +#ifndef __STB_INCLUDE_STB_TRUETYPE_H__ +#define __STB_INCLUDE_STB_TRUETYPE_H__ + +#ifdef STBTT_STATIC +#define STBTT_DEF static +#else +#define STBTT_DEF extern +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + // private structure + typedef struct + { + unsigned char* data; + int cursor; + int size; + } stbtt__buf; + + ////////////////////////////////////////////////////////////////////////////// + // + // TEXTURE BAKING API + // + // If you use this API, you only have to call two functions ever. + // + + typedef struct + { + unsigned short x0, y0, x1, y1; // coordinates of bbox in bitmap + float xoff, yoff, xadvance; + } stbtt_bakedchar; + + STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char* data, int offset, // font location (use offset=0 for plain .ttf) + float pixel_height, // height of font in pixels + unsigned char* pixels, int pw, int ph, // bitmap to be filled in + int first_char, int num_chars, // characters to bake + stbtt_bakedchar* chardata); // you allocate this, it's num_chars long +// if return is positive, the first unused row of the bitmap +// if return is negative, returns the negative of the number of characters that fit +// if return is 0, no characters fit and no rows were used +// This uses a very crappy packing. + + typedef struct + { + float x0, y0, s0, t0; // top-left + float x1, y1, s1, t1; // bottom-right + } stbtt_aligned_quad; + + STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar* chardata, int pw, int ph, // same data as above + int char_index, // character to display + float* xpos, float* ypos, // pointers to current position in screen pixel space + stbtt_aligned_quad* q, // output: quad to draw + int opengl_fillrule); // true if opengl fill rule; false if DX9 or earlier +// Call GetBakedQuad with char_index = 'character - first_char', and it +// creates the quad you need to draw and advances the current position. +// +// The coordinate system used assumes y increases downwards. +// +// Characters will extend both above and below the current position; +// see discussion of "BASELINE" above. +// +// It's inefficient; you might want to c&p it and optimize it. + + STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char* fontdata, int index, float size, float* ascent, float* descent, float* lineGap); + // Query the font vertical metrics without having to create a font first. + + + ////////////////////////////////////////////////////////////////////////////// + // + // NEW TEXTURE BAKING API + // + // This provides options for packing multiple fonts into one atlas, not + // perfectly but better than nothing. + + typedef struct + { + unsigned short x0, y0, x1, y1; // coordinates of bbox in bitmap + float xoff, yoff, xadvance; + float xoff2, yoff2; + } stbtt_packedchar; + + typedef struct stbtt_pack_context stbtt_pack_context; + typedef struct stbtt_fontinfo stbtt_fontinfo; +#ifndef STB_RECT_PACK_VERSION + typedef struct stbrp_rect stbrp_rect; +#endif + + STBTT_DEF int stbtt_PackBegin(stbtt_pack_context* spc, unsigned char* pixels, int width, int height, int stride_in_bytes, int padding, void* alloc_context); + // Initializes a packing context stored in the passed-in stbtt_pack_context. + // Future calls using this context will pack characters into the bitmap passed + // in here: a 1-channel bitmap that is width * height. stride_in_bytes is + // the distance from one row to the next (or 0 to mean they are packed tightly + // together). "padding" is the amount of padding to leave between each + // character (normally you want '1' for bitmaps you'll use as textures with + // bilinear filtering). + // + // Returns 0 on failure, 1 on success. + + STBTT_DEF void stbtt_PackEnd(stbtt_pack_context* spc); + // Cleans up the packing context and frees all memory. + +#define STBTT_POINT_SIZE(x) (-(x)) + + STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context* spc, const unsigned char* fontdata, int font_index, float font_size, + int first_unicode_char_in_range, int num_chars_in_range, stbtt_packedchar* chardata_for_range); + // Creates character bitmaps from the font_index'th font found in fontdata (use + // font_index=0 if you don't know what that is). It creates num_chars_in_range + // bitmaps for characters with unicode values starting at first_unicode_char_in_range + // and increasing. Data for how to render them is stored in chardata_for_range; + // pass these to stbtt_GetPackedQuad to get back renderable quads. + // + // font_size is the full height of the character from ascender to descender, + // as computed by stbtt_ScaleForPixelHeight. To use a point size as computed + // by stbtt_ScaleForMappingEmToPixels, wrap the point size in STBTT_POINT_SIZE() + // and pass that result as 'font_size': + // ..., 20 , ... // font max minus min y is 20 pixels tall + // ..., STBTT_POINT_SIZE(20), ... // 'M' is 20 pixels tall + + typedef struct + { + float font_size; + int first_unicode_codepoint_in_range; // if non-zero, then the chars are continuous, and this is the first codepoint + int* array_of_unicode_codepoints; // if non-zero, then this is an array of unicode codepoints + int num_chars; + stbtt_packedchar* chardata_for_range; // output + unsigned char h_oversample, v_oversample; // don't set these, they're used internally + } stbtt_pack_range; + + STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context* spc, const unsigned char* fontdata, int font_index, stbtt_pack_range* ranges, int num_ranges); + // Creates character bitmaps from multiple ranges of characters stored in + // ranges. This will usually create a better-packed bitmap than multiple + // calls to stbtt_PackFontRange. Note that you can call this multiple + // times within a single PackBegin/PackEnd. + + STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context* spc, unsigned int h_oversample, unsigned int v_oversample); + // Oversampling a font increases the quality by allowing higher-quality subpixel + // positioning, and is especially valuable at smaller text sizes. + // + // This function sets the amount of oversampling for all following calls to + // stbtt_PackFontRange(s) or stbtt_PackFontRangesGatherRects for a given + // pack context. The default (no oversampling) is achieved by h_oversample=1 + // and v_oversample=1. The total number of pixels required is + // h_oversample*v_oversample larger than the default; for example, 2x2 + // oversampling requires 4x the storage of 1x1. For best results, render + // oversampled textures with bilinear filtering. Look at the readme in + // stb/tests/oversample for information about oversampled fonts + // + // To use with PackFontRangesGather etc., you must set it before calls + // call to PackFontRangesGatherRects. + + STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context* spc, int skip); + // If skip != 0, this tells stb_truetype to skip any codepoints for which + // there is no corresponding glyph. If skip=0, which is the default, then + // codepoints without a glyph recived the font's "missing character" glyph, + // typically an empty box by convention. + + STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar* chardata, int pw, int ph, // same data as above + int char_index, // character to display + float* xpos, float* ypos, // pointers to current position in screen pixel space + stbtt_aligned_quad* q, // output: quad to draw + int align_to_integer); + + STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context* spc, const stbtt_fontinfo* info, stbtt_pack_range* ranges, int num_ranges, stbrp_rect* rects); + STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context* spc, stbrp_rect* rects, int num_rects); + STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context* spc, const stbtt_fontinfo* info, stbtt_pack_range* ranges, int num_ranges, stbrp_rect* rects); + // Calling these functions in sequence is roughly equivalent to calling + // stbtt_PackFontRanges(). If you more control over the packing of multiple + // fonts, or if you want to pack custom data into a font texture, take a look + // at the source to of stbtt_PackFontRanges() and create a custom version + // using these functions, e.g. call GatherRects multiple times, + // building up a single array of rects, then call PackRects once, + // then call RenderIntoRects repeatedly. This may result in a + // better packing than calling PackFontRanges multiple times + // (or it may not). + + // this is an opaque structure that you shouldn't mess with which holds + // all the context needed from PackBegin to PackEnd. + struct stbtt_pack_context { + void* user_allocator_context; + void* pack_info; + int width; + int height; + int stride_in_bytes; + int padding; + int skip_missing; + unsigned int h_oversample, v_oversample; + unsigned char* pixels; + void* nodes; + }; + + ////////////////////////////////////////////////////////////////////////////// + // + // FONT LOADING + // + // + + STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char* data); + // This function will determine the number of fonts in a font file. TrueType + // collection (.ttc) files may contain multiple fonts, while TrueType font + // (.ttf) files only contain one font. The number of fonts can be used for + // indexing with the previous function where the index is between zero and one + // less than the total fonts. If an error occurs, -1 is returned. + + STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char* data, int index); + // Each .ttf/.ttc file may have more than one font. Each font has a sequential + // index number starting from 0. Call this function to get the font offset for + // a given index; it returns -1 if the index is out of range. A regular .ttf + // file will only define one font and it always be at offset 0, so it will + // return '0' for index 0, and -1 for all other indices. + + // The following structure is defined publicly so you can declare one on + // the stack or as a global or etc, but you should treat it as opaque. + struct stbtt_fontinfo + { + void* userdata; + unsigned char* data; // pointer to .ttf file + int fontstart; // offset of start of font + + int numGlyphs; // number of glyphs, needed for range checking + + int loca, head, glyf, hhea, hmtx, kern, gpos, svg; // table locations as offset from start of .ttf + int index_map; // a cmap mapping for our chosen character encoding + int indexToLocFormat; // format needed to map from glyph index to glyph + + stbtt__buf cff; // cff font data + stbtt__buf charstrings; // the charstring index + stbtt__buf gsubrs; // global charstring subroutines index + stbtt__buf subrs; // private charstring subroutines index + stbtt__buf fontdicts; // array of font dicts + stbtt__buf fdselect; // map from glyph to fontdict + }; + + STBTT_DEF int stbtt_InitFont(stbtt_fontinfo* info, const unsigned char* data, int offset); + // Given an offset into the file that defines a font, this function builds + // the necessary cached info for the rest of the system. You must allocate + // the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't + // need to do anything special to free it, because the contents are pure + // value data with no additional data structures. Returns 0 on failure. + + + ////////////////////////////////////////////////////////////////////////////// + // + // CHARACTER TO GLYPH-INDEX CONVERSIOn + + STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo* info, int unicode_codepoint); + // If you're going to perform multiple operations on the same character + // and you want a speed-up, call this function with the character you're + // going to process, then use glyph-based functions instead of the + // codepoint-based functions. + // Returns 0 if the character codepoint is not defined in the font. + + + ////////////////////////////////////////////////////////////////////////////// + // + // CHARACTER PROPERTIES + // + + STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo* info, float pixels); + // computes a scale factor to produce a font whose "height" is 'pixels' tall. + // Height is measured as the distance from the highest ascender to the lowest + // descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics + // and computing: + // scale = pixels / (ascent - descent) + // so if you prefer to measure height by the ascent only, use a similar calculation. + + STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo* info, float pixels); + // computes a scale factor to produce a font whose EM size is mapped to + // 'pixels' tall. This is probably what traditional APIs compute, but + // I'm not positive. + + STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo* info, int* ascent, int* descent, int* lineGap); + // ascent is the coordinate above the baseline the font extends; descent + // is the coordinate below the baseline the font extends (i.e. it is typically negative) + // lineGap is the spacing between one row's descent and the next row's ascent... + // so you should advance the vertical position by "*ascent - *descent + *lineGap" + // these are expressed in unscaled coordinates, so you must multiply by + // the scale factor for a given size + + STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo* info, int* typoAscent, int* typoDescent, int* typoLineGap); + // analogous to GetFontVMetrics, but returns the "typographic" values from the OS/2 + // table (specific to MS/Windows TTF files). + // + // Returns 1 on success (table present), 0 on failure. + + STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo* info, int* x0, int* y0, int* x1, int* y1); + // the bounding box around all possible characters + + STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo* info, int codepoint, int* advanceWidth, int* leftSideBearing); + // leftSideBearing is the offset from the current horizontal position to the left edge of the character + // advanceWidth is the offset from the current horizontal position to the next horizontal position + // these are expressed in unscaled coordinates + + STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo* info, int ch1, int ch2); + // an additional amount to add to the 'advance' value between ch1 and ch2 + + STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo* info, int codepoint, int* x0, int* y0, int* x1, int* y1); + // Gets the bounding box of the visible part of the glyph, in unscaled coordinates + + STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo* info, int glyph_index, int* advanceWidth, int* leftSideBearing); + STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo* info, int glyph1, int glyph2); + STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo* info, int glyph_index, int* x0, int* y0, int* x1, int* y1); + // as above, but takes one or more glyph indices for greater efficiency + + typedef struct stbtt_kerningentry + { + int glyph1; // use stbtt_FindGlyphIndex + int glyph2; + int advance; + } stbtt_kerningentry; + + STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo* info); + STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo* info, stbtt_kerningentry* table, int table_length); + // Retrieves a complete list of all of the kerning pairs provided by the font + // stbtt_GetKerningTable never writes more than table_length entries and returns how many entries it did write. + // The table will be sorted by (a.glyph1 == b.glyph1)?(a.glyph2 < b.glyph2):(a.glyph1 < b.glyph1) + + ////////////////////////////////////////////////////////////////////////////// + // + // GLYPH SHAPES (you probably don't need these, but they have to go before + // the bitmaps for C declaration-order reasons) + // + +#ifndef STBTT_vmove // you can predefine these to use different values (but why?) + enum { + STBTT_vmove = 1, + STBTT_vline, + STBTT_vcurve, + STBTT_vcubic + }; +#endif + +#ifndef stbtt_vertex // you can predefine this to use different values + // (we share this with other code at RAD) +#define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file + typedef struct + { + stbtt_vertex_type x, y, cx, cy, cx1, cy1; + unsigned char type, padding; + } stbtt_vertex; +#endif + + STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo* info, int glyph_index); + // returns non-zero if nothing is drawn for this glyph + + STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo* info, int unicode_codepoint, stbtt_vertex** vertices); + STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo* info, int glyph_index, stbtt_vertex** vertices); + // returns # of vertices and fills *vertices with the pointer to them + // these are expressed in "unscaled" coordinates + // + // The shape is a series of contours. Each one starts with + // a STBTT_moveto, then consists of a series of mixed + // STBTT_lineto and STBTT_curveto segments. A lineto + // draws a line from previous endpoint to its x,y; a curveto + // draws a quadratic bezier from previous endpoint to + // its x,y, using cx,cy as the bezier control point. + + STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo* info, stbtt_vertex* vertices); + // frees the data allocated above + + STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo* info, int unicode_codepoint, const char** svg); + STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo* info, int gl, const char** svg); + // fills svg with the character's SVG data. + // returns data size or 0 if SVG not found. + + ////////////////////////////////////////////////////////////////////////////// + // + // BITMAP RENDERING + // + + STBTT_DEF void stbtt_FreeBitmap(unsigned char* bitmap, void* userdata); + // frees the bitmap allocated below + + STBTT_DEF unsigned char* stbtt_GetCodepointBitmap(const stbtt_fontinfo* info, float scale_x, float scale_y, int codepoint, int* width, int* height, int* xoff, int* yoff); + // allocates a large-enough single-channel 8bpp bitmap and renders the + // specified character/glyph at the specified scale into it, with + // antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque). + // *width & *height are filled out with the width & height of the bitmap, + // which is stored left-to-right, top-to-bottom. + // + // xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap + + STBTT_DEF unsigned char* stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo* info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int* width, int* height, int* xoff, int* yoff); + // the same as stbtt_GetCodepoitnBitmap, but you can specify a subpixel + // shift for the character + + STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo* info, unsigned char* output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint); + // the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap + // in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap + // is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the + // width and height and positioning info for it first. + + STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo* info, unsigned char* output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint); + // same as stbtt_MakeCodepointBitmap, but you can specify a subpixel + // shift for the character + + STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo* info, unsigned char* output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float* sub_x, float* sub_y, int codepoint); + // same as stbtt_MakeCodepointBitmapSubpixel, but prefiltering + // is performed (see stbtt_PackSetOversampling) + + STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo* font, int codepoint, float scale_x, float scale_y, int* ix0, int* iy0, int* ix1, int* iy1); + // get the bbox of the bitmap centered around the glyph origin; so the + // bitmap width is ix1-ix0, height is iy1-iy0, and location to place + // the bitmap top left is (leftSideBearing*scale,iy0). + // (Note that the bitmap uses y-increases-down, but the shape uses + // y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.) + + STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo* font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int* ix0, int* iy0, int* ix1, int* iy1); + // same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel + // shift for the character + + // the following functions are equivalent to the above functions, but operate + // on glyph indices instead of Unicode codepoints (for efficiency) + STBTT_DEF unsigned char* stbtt_GetGlyphBitmap(const stbtt_fontinfo* info, float scale_x, float scale_y, int glyph, int* width, int* height, int* xoff, int* yoff); + STBTT_DEF unsigned char* stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo* info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int* width, int* height, int* xoff, int* yoff); + STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo* info, unsigned char* output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph); + STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo* info, unsigned char* output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph); + STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo* info, unsigned char* output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float* sub_x, float* sub_y, int glyph); + STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo* font, int glyph, float scale_x, float scale_y, int* ix0, int* iy0, int* ix1, int* iy1); + STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo* font, int glyph, float scale_x, float scale_y, float shift_x, float shift_y, int* ix0, int* iy0, int* ix1, int* iy1); + + + // @TODO: don't expose this structure + typedef struct + { + int w, h, stride; + unsigned char* pixels; + } stbtt__bitmap; + + // rasterize a shape with quadratic beziers into a bitmap + STBTT_DEF void stbtt_Rasterize(stbtt__bitmap* result, // 1-channel bitmap to draw into + float flatness_in_pixels, // allowable error of curve in pixels + stbtt_vertex* vertices, // array of vertices defining shape + int num_verts, // number of vertices in above array + float scale_x, float scale_y, // scale applied to input vertices + float shift_x, float shift_y, // translation applied to input vertices + int x_off, int y_off, // another translation applied to input + int invert, // if non-zero, vertically flip shape + void* userdata); // context for to STBTT_MALLOC + +////////////////////////////////////////////////////////////////////////////// +// +// Signed Distance Function (or Field) rendering + + STBTT_DEF void stbtt_FreeSDF(unsigned char* bitmap, void* userdata); + // frees the SDF bitmap allocated below + + STBTT_DEF unsigned char* stbtt_GetGlyphSDF(const stbtt_fontinfo* info, float scale, int glyph, int padding, unsigned char onedge_value, float pixel_dist_scale, int* width, int* height, int* xoff, int* yoff); + STBTT_DEF unsigned char* stbtt_GetCodepointSDF(const stbtt_fontinfo* info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int* width, int* height, int* xoff, int* yoff); + // These functions compute a discretized SDF field for a single character, suitable for storing + // in a single-channel texture, sampling with bilinear filtering, and testing against + // larger than some threshold to produce scalable fonts. + // info -- the font + // scale -- controls the size of the resulting SDF bitmap, same as it would be creating a regular bitmap + // glyph/codepoint -- the character to generate the SDF for + // padding -- extra "pixels" around the character which are filled with the distance to the character (not 0), + // which allows effects like bit outlines + // onedge_value -- value 0-255 to test the SDF against to reconstruct the character (i.e. the isocontour of the character) + // pixel_dist_scale -- what value the SDF should increase by when moving one SDF "pixel" away from the edge (on the 0..255 scale) + // if positive, > onedge_value is inside; if negative, < onedge_value is inside + // width,height -- output height & width of the SDF bitmap (including padding) + // xoff,yoff -- output origin of the character + // return value -- a 2D array of bytes 0..255, width*height in size + // + // pixel_dist_scale & onedge_value are a scale & bias that allows you to make + // optimal use of the limited 0..255 for your application, trading off precision + // and special effects. SDF values outside the range 0..255 are clamped to 0..255. + // + // Example: + // scale = stbtt_ScaleForPixelHeight(22) + // padding = 5 + // onedge_value = 180 + // pixel_dist_scale = 180/5.0 = 36.0 + // + // This will create an SDF bitmap in which the character is about 22 pixels + // high but the whole bitmap is about 22+5+5=32 pixels high. To produce a filled + // shape, sample the SDF at each pixel and fill the pixel if the SDF value + // is greater than or equal to 180/255. (You'll actually want to antialias, + // which is beyond the scope of this example.) Additionally, you can compute + // offset outlines (e.g. to stroke the character border inside & outside, + // or only outside). For example, to fill outside the character up to 3 SDF + // pixels, you would compare against (180-36.0*3)/255 = 72/255. The above + // choice of variables maps a range from 5 pixels outside the shape to + // 2 pixels inside the shape to 0..255; this is intended primarily for apply + // outside effects only (the interior range is needed to allow proper + // antialiasing of the font at *smaller* sizes) + // + // The function computes the SDF analytically at each SDF pixel, not by e.g. + // building a higher-res bitmap and approximating it. In theory the quality + // should be as high as possible for an SDF of this size & representation, but + // unclear if this is true in practice (perhaps building a higher-res bitmap + // and computing from that can allow drop-out prevention). + // + // The algorithm has not been optimized at all, so expect it to be slow + // if computing lots of characters or very large sizes. + + + + ////////////////////////////////////////////////////////////////////////////// + // + // Finding the right font... + // + // You should really just solve this offline, keep your own tables + // of what font is what, and don't try to get it out of the .ttf file. + // That's because getting it out of the .ttf file is really hard, because + // the names in the file can appear in many possible encodings, in many + // possible languages, and e.g. if you need a case-insensitive comparison, + // the details of that depend on the encoding & language in a complex way + // (actually underspecified in truetype, but also gigantic). + // + // But you can use the provided functions in two possible ways: + // stbtt_FindMatchingFont() will use *case-sensitive* comparisons on + // unicode-encoded names to try to find the font you want; + // you can run this before calling stbtt_InitFont() + // + // stbtt_GetFontNameString() lets you get any of the various strings + // from the file yourself and do your own comparisons on them. + // You have to have called stbtt_InitFont() first. + + + STBTT_DEF int stbtt_FindMatchingFont(const unsigned char* fontdata, const char* name, int flags); + // returns the offset (not index) of the font that matches, or -1 if none + // if you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". + // if you use any other flag, use a font name like "Arial"; this checks + // the 'macStyle' header field; i don't know if fonts set this consistently +#define STBTT_MACSTYLE_DONTCARE 0 +#define STBTT_MACSTYLE_BOLD 1 +#define STBTT_MACSTYLE_ITALIC 2 +#define STBTT_MACSTYLE_UNDERSCORE 4 +#define STBTT_MACSTYLE_NONE 8 // <= not same as 0, this makes us check the bitfield is 0 + + STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char* s1, int len1, const char* s2, int len2); + // returns 1/0 whether the first string interpreted as utf8 is identical to + // the second string interpreted as big-endian utf16... useful for strings from next func + + STBTT_DEF const char* stbtt_GetFontNameString(const stbtt_fontinfo* font, int* length, int platformID, int encodingID, int languageID, int nameID); + // returns the string (which may be big-endian double byte, e.g. for unicode) + // and puts the length in bytes in *length. + // + // some of the values for the IDs are below; for more see the truetype spec: + // http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html + // http://www.microsoft.com/typography/otspec/name.htm + + enum { // platformID + STBTT_PLATFORM_ID_UNICODE = 0, + STBTT_PLATFORM_ID_MAC = 1, + STBTT_PLATFORM_ID_ISO = 2, + STBTT_PLATFORM_ID_MICROSOFT = 3 + }; + + enum { // encodingID for STBTT_PLATFORM_ID_UNICODE + STBTT_UNICODE_EID_UNICODE_1_0 = 0, + STBTT_UNICODE_EID_UNICODE_1_1 = 1, + STBTT_UNICODE_EID_ISO_10646 = 2, + STBTT_UNICODE_EID_UNICODE_2_0_BMP = 3, + STBTT_UNICODE_EID_UNICODE_2_0_FULL = 4 + }; + + enum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT + STBTT_MS_EID_SYMBOL = 0, + STBTT_MS_EID_UNICODE_BMP = 1, + STBTT_MS_EID_SHIFTJIS = 2, + STBTT_MS_EID_UNICODE_FULL = 10 + }; + + enum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes + STBTT_MAC_EID_ROMAN = 0, STBTT_MAC_EID_ARABIC = 4, + STBTT_MAC_EID_JAPANESE = 1, STBTT_MAC_EID_HEBREW = 5, + STBTT_MAC_EID_CHINESE_TRAD = 2, STBTT_MAC_EID_GREEK = 6, + STBTT_MAC_EID_KOREAN = 3, STBTT_MAC_EID_RUSSIAN = 7 + }; + + enum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID... + // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs + STBTT_MS_LANG_ENGLISH = 0x0409, STBTT_MS_LANG_ITALIAN = 0x0410, + STBTT_MS_LANG_CHINESE = 0x0804, STBTT_MS_LANG_JAPANESE = 0x0411, + STBTT_MS_LANG_DUTCH = 0x0413, STBTT_MS_LANG_KOREAN = 0x0412, + STBTT_MS_LANG_FRENCH = 0x040c, STBTT_MS_LANG_RUSSIAN = 0x0419, + STBTT_MS_LANG_GERMAN = 0x0407, STBTT_MS_LANG_SPANISH = 0x0409, + STBTT_MS_LANG_HEBREW = 0x040d, STBTT_MS_LANG_SWEDISH = 0x041D + }; + + enum { // languageID for STBTT_PLATFORM_ID_MAC + STBTT_MAC_LANG_ENGLISH = 0, STBTT_MAC_LANG_JAPANESE = 11, + STBTT_MAC_LANG_ARABIC = 12, STBTT_MAC_LANG_KOREAN = 23, + STBTT_MAC_LANG_DUTCH = 4, STBTT_MAC_LANG_RUSSIAN = 32, + STBTT_MAC_LANG_FRENCH = 1, STBTT_MAC_LANG_SPANISH = 6, + STBTT_MAC_LANG_GERMAN = 2, STBTT_MAC_LANG_SWEDISH = 5, + STBTT_MAC_LANG_HEBREW = 10, STBTT_MAC_LANG_CHINESE_SIMPLIFIED = 33, + STBTT_MAC_LANG_ITALIAN = 3, STBTT_MAC_LANG_CHINESE_TRAD = 19 + }; + +#ifdef __cplusplus +} +#endif + +#endif // __STB_INCLUDE_STB_TRUETYPE_H__ + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +//// +//// IMPLEMENTATION +//// +//// + +#ifdef STB_TRUETYPE_IMPLEMENTATION + +#ifndef STBTT_MAX_OVERSAMPLE +#define STBTT_MAX_OVERSAMPLE 8 +#endif + +#if STBTT_MAX_OVERSAMPLE > 255 +#error "STBTT_MAX_OVERSAMPLE cannot be > 255" +#endif + +typedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERSAMPLE - 1)) == 0 ? 1 : -1]; + +#ifndef STBTT_RASTERIZER_VERSION +#define STBTT_RASTERIZER_VERSION 2 +#endif + +#ifdef _MSC_VER +#define STBTT__NOTUSED(v) (void)(v) +#else +#define STBTT__NOTUSED(v) (void)sizeof(v) +#endif + +////////////////////////////////////////////////////////////////////////// +// +// stbtt__buf helpers to parse data from file +// + +static stbtt_uint8 stbtt__buf_get8(stbtt__buf* b) +{ + if (b->cursor >= b->size) + return 0; + return b->data[b->cursor++]; +} + +static stbtt_uint8 stbtt__buf_peek8(stbtt__buf* b) +{ + if (b->cursor >= b->size) + return 0; + return b->data[b->cursor]; +} + +static void stbtt__buf_seek(stbtt__buf* b, int o) +{ + STBTT_assert(!(o > b->size || o < 0)); + b->cursor = (o > b->size || o < 0) ? b->size : o; +} + +static void stbtt__buf_skip(stbtt__buf* b, int o) +{ + stbtt__buf_seek(b, b->cursor + o); +} + +static stbtt_uint32 stbtt__buf_get(stbtt__buf* b, int n) +{ + stbtt_uint32 v = 0; + int i; + STBTT_assert(n >= 1 && n <= 4); + for (i = 0; i < n; i++) + v = (v << 8) | stbtt__buf_get8(b); + return v; +} + +static stbtt__buf stbtt__new_buf(const void* p, size_t size) +{ + stbtt__buf r; + STBTT_assert(size < 0x40000000); + r.data = (stbtt_uint8*)p; + r.size = (int)size; + r.cursor = 0; + return r; +} + +#define stbtt__buf_get16(b) stbtt__buf_get((b), 2) +#define stbtt__buf_get32(b) stbtt__buf_get((b), 4) + +static stbtt__buf stbtt__buf_range(const stbtt__buf* b, int o, int s) +{ + stbtt__buf r = stbtt__new_buf(NULL, 0); + if (o < 0 || s < 0 || o > b->size || s > b->size - o) return r; + r.data = b->data + o; + r.size = s; + return r; +} + +static stbtt__buf stbtt__cff_get_index(stbtt__buf* b) +{ + int count, start, offsize; + start = b->cursor; + count = stbtt__buf_get16(b); + if (count) { + offsize = stbtt__buf_get8(b); + STBTT_assert(offsize >= 1 && offsize <= 4); + stbtt__buf_skip(b, offsize * count); + stbtt__buf_skip(b, stbtt__buf_get(b, offsize) - 1); + } + return stbtt__buf_range(b, start, b->cursor - start); +} + +static stbtt_uint32 stbtt__cff_int(stbtt__buf* b) +{ + int b0 = stbtt__buf_get8(b); + if (b0 >= 32 && b0 <= 246) return b0 - 139; + else if (b0 >= 247 && b0 <= 250) return (b0 - 247) * 256 + stbtt__buf_get8(b) + 108; + else if (b0 >= 251 && b0 <= 254) return -(b0 - 251) * 256 - stbtt__buf_get8(b) - 108; + else if (b0 == 28) return stbtt__buf_get16(b); + else if (b0 == 29) return stbtt__buf_get32(b); + STBTT_assert(0); + return 0; +} + +static void stbtt__cff_skip_operand(stbtt__buf* b) { + int v, b0 = stbtt__buf_peek8(b); + STBTT_assert(b0 >= 28); + if (b0 == 30) { + stbtt__buf_skip(b, 1); + while (b->cursor < b->size) { + v = stbtt__buf_get8(b); + if ((v & 0xF) == 0xF || (v >> 4) == 0xF) + break; + } + } + else { + stbtt__cff_int(b); + } +} + +static stbtt__buf stbtt__dict_get(stbtt__buf* b, int key) +{ + stbtt__buf_seek(b, 0); + while (b->cursor < b->size) { + int start = b->cursor, end, op; + while (stbtt__buf_peek8(b) >= 28) + stbtt__cff_skip_operand(b); + end = b->cursor; + op = stbtt__buf_get8(b); + if (op == 12) op = stbtt__buf_get8(b) | 0x100; + if (op == key) return stbtt__buf_range(b, start, end - start); + } + return stbtt__buf_range(b, 0, 0); +} + +static void stbtt__dict_get_ints(stbtt__buf* b, int key, int outcount, stbtt_uint32* out) +{ + int i; + stbtt__buf operands = stbtt__dict_get(b, key); + for (i = 0; i < outcount && operands.cursor < operands.size; i++) + out[i] = stbtt__cff_int(&operands); +} + +static int stbtt__cff_index_count(stbtt__buf* b) +{ + stbtt__buf_seek(b, 0); + return stbtt__buf_get16(b); +} + +static stbtt__buf stbtt__cff_index_get(stbtt__buf b, int i) +{ + int count, offsize, start, end; + stbtt__buf_seek(&b, 0); + count = stbtt__buf_get16(&b); + offsize = stbtt__buf_get8(&b); + STBTT_assert(i >= 0 && i < count); + STBTT_assert(offsize >= 1 && offsize <= 4); + stbtt__buf_skip(&b, i * offsize); + start = stbtt__buf_get(&b, offsize); + end = stbtt__buf_get(&b, offsize); + return stbtt__buf_range(&b, 2 + (count + 1) * offsize + start, end - start); +} + +////////////////////////////////////////////////////////////////////////// +// +// accessors to parse data from file +// + +// on platforms that don't allow misaligned reads, if we want to allow +// truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE + +#define ttBYTE(p) (* (stbtt_uint8 *) (p)) +#define ttCHAR(p) (* (stbtt_int8 *) (p)) +#define ttFixed(p) ttLONG(p) + +static stbtt_uint16 ttUSHORT(stbtt_uint8* p) { return p[0] * 256 + p[1]; } +static stbtt_int16 ttSHORT(stbtt_uint8* p) { return p[0] * 256 + p[1]; } +static stbtt_uint32 ttULONG(stbtt_uint8* p) { return (p[0] << 24) + (p[1] << 16) + (p[2] << 8) + p[3]; } +static stbtt_int32 ttLONG(stbtt_uint8* p) { return (p[0] << 24) + (p[1] << 16) + (p[2] << 8) + p[3]; } + +#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3)) +#define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3]) + +static int stbtt__isfont(stbtt_uint8* font) +{ + // check the version number + if (stbtt_tag4(font, '1', 0, 0, 0)) return 1; // TrueType 1 + if (stbtt_tag(font, "typ1")) return 1; // TrueType with type 1 font -- we don't support this! + if (stbtt_tag(font, "OTTO")) return 1; // OpenType with CFF + if (stbtt_tag4(font, 0, 1, 0, 0)) return 1; // OpenType 1.0 + if (stbtt_tag(font, "true")) return 1; // Apple specification for TrueType fonts + return 0; +} + +// @OPTIMIZE: binary search +static stbtt_uint32 stbtt__find_table(stbtt_uint8* data, stbtt_uint32 fontstart, const char* tag) +{ + stbtt_int32 num_tables = ttUSHORT(data + fontstart + 4); + stbtt_uint32 tabledir = fontstart + 12; + stbtt_int32 i; + for (i = 0; i < num_tables; ++i) { + stbtt_uint32 loc = tabledir + 16 * i; + if (stbtt_tag(data + loc + 0, tag)) + return ttULONG(data + loc + 8); + } + return 0; +} + +static int stbtt_GetFontOffsetForIndex_internal(unsigned char* font_collection, int index) +{ + // if it's just a font, there's only one valid index + if (stbtt__isfont(font_collection)) + return index == 0 ? 0 : -1; + + // check if it's a TTC + if (stbtt_tag(font_collection, "ttcf")) { + // version 1? + if (ttULONG(font_collection + 4) == 0x00010000 || ttULONG(font_collection + 4) == 0x00020000) { + stbtt_int32 n = ttLONG(font_collection + 8); + if (index >= n) + return -1; + return ttULONG(font_collection + 12 + index * 4); + } + } + return -1; +} + +static int stbtt_GetNumberOfFonts_internal(unsigned char* font_collection) +{ + // if it's just a font, there's only one valid font + if (stbtt__isfont(font_collection)) + return 1; + + // check if it's a TTC + if (stbtt_tag(font_collection, "ttcf")) { + // version 1? + if (ttULONG(font_collection + 4) == 0x00010000 || ttULONG(font_collection + 4) == 0x00020000) { + return ttLONG(font_collection + 8); + } + } + return 0; +} + +static stbtt__buf stbtt__get_subrs(stbtt__buf cff, stbtt__buf fontdict) +{ + stbtt_uint32 subrsoff = 0, private_loc[2] = { 0, 0 }; + stbtt__buf pdict; + stbtt__dict_get_ints(&fontdict, 18, 2, private_loc); + if (!private_loc[1] || !private_loc[0]) return stbtt__new_buf(NULL, 0); + pdict = stbtt__buf_range(&cff, private_loc[1], private_loc[0]); + stbtt__dict_get_ints(&pdict, 19, 1, &subrsoff); + if (!subrsoff) return stbtt__new_buf(NULL, 0); + stbtt__buf_seek(&cff, private_loc[1] + subrsoff); + return stbtt__cff_get_index(&cff); +} + +// since most people won't use this, find this table the first time it's needed +static int stbtt__get_svg(stbtt_fontinfo* info) +{ + stbtt_uint32 t; + if (info->svg < 0) { + t = stbtt__find_table(info->data, info->fontstart, "SVG "); + if (t) { + stbtt_uint32 offset = ttULONG(info->data + t + 2); + info->svg = t + offset; + } + else { + info->svg = 0; + } + } + return info->svg; +} + +static int stbtt_InitFont_internal(stbtt_fontinfo* info, unsigned char* data, int fontstart) +{ + stbtt_uint32 cmap, t; + stbtt_int32 i, numTables; + + info->data = data; + info->fontstart = fontstart; + info->cff = stbtt__new_buf(NULL, 0); + + cmap = stbtt__find_table(data, fontstart, "cmap"); // required + info->loca = stbtt__find_table(data, fontstart, "loca"); // required + info->head = stbtt__find_table(data, fontstart, "head"); // required + info->glyf = stbtt__find_table(data, fontstart, "glyf"); // required + info->hhea = stbtt__find_table(data, fontstart, "hhea"); // required + info->hmtx = stbtt__find_table(data, fontstart, "hmtx"); // required + info->kern = stbtt__find_table(data, fontstart, "kern"); // not required + info->gpos = stbtt__find_table(data, fontstart, "GPOS"); // not required + + if (!cmap || !info->head || !info->hhea || !info->hmtx) + return 0; + if (info->glyf) { + // required for truetype + if (!info->loca) return 0; + } + else { + // initialization for CFF / Type2 fonts (OTF) + stbtt__buf b, topdict, topdictidx; + stbtt_uint32 cstype = 2, charstrings = 0, fdarrayoff = 0, fdselectoff = 0; + stbtt_uint32 cff; + + cff = stbtt__find_table(data, fontstart, "CFF "); + if (!cff) return 0; + + info->fontdicts = stbtt__new_buf(NULL, 0); + info->fdselect = stbtt__new_buf(NULL, 0); + + // @TODO this should use size from table (not 512MB) + info->cff = stbtt__new_buf(data + cff, 512 * 1024 * 1024); + b = info->cff; + + // read the header + stbtt__buf_skip(&b, 2); + stbtt__buf_seek(&b, stbtt__buf_get8(&b)); // hdrsize + + // @TODO the name INDEX could list multiple fonts, + // but we just use the first one. + stbtt__cff_get_index(&b); // name INDEX + topdictidx = stbtt__cff_get_index(&b); + topdict = stbtt__cff_index_get(topdictidx, 0); + stbtt__cff_get_index(&b); // string INDEX + info->gsubrs = stbtt__cff_get_index(&b); + + stbtt__dict_get_ints(&topdict, 17, 1, &charstrings); + stbtt__dict_get_ints(&topdict, 0x100 | 6, 1, &cstype); + stbtt__dict_get_ints(&topdict, 0x100 | 36, 1, &fdarrayoff); + stbtt__dict_get_ints(&topdict, 0x100 | 37, 1, &fdselectoff); + info->subrs = stbtt__get_subrs(b, topdict); + + // we only support Type 2 charstrings + if (cstype != 2) return 0; + if (charstrings == 0) return 0; + + if (fdarrayoff) { + // looks like a CID font + if (!fdselectoff) return 0; + stbtt__buf_seek(&b, fdarrayoff); + info->fontdicts = stbtt__cff_get_index(&b); + info->fdselect = stbtt__buf_range(&b, fdselectoff, b.size - fdselectoff); + } + + stbtt__buf_seek(&b, charstrings); + info->charstrings = stbtt__cff_get_index(&b); + } + + t = stbtt__find_table(data, fontstart, "maxp"); + if (t) + info->numGlyphs = ttUSHORT(data + t + 4); + else + info->numGlyphs = 0xffff; + + info->svg = -1; + + // find a cmap encoding table we understand *now* to avoid searching + // later. (todo: could make this installable) + // the same regardless of glyph. + numTables = ttUSHORT(data + cmap + 2); + info->index_map = 0; + for (i = 0; i < numTables; ++i) { + stbtt_uint32 encoding_record = cmap + 4 + 8 * i; + // find an encoding we understand: + switch (ttUSHORT(data + encoding_record)) { + case STBTT_PLATFORM_ID_MICROSOFT: + switch (ttUSHORT(data + encoding_record + 2)) { + case STBTT_MS_EID_UNICODE_BMP: + case STBTT_MS_EID_UNICODE_FULL: + // MS/Unicode + info->index_map = cmap + ttULONG(data + encoding_record + 4); + break; + } + break; + case STBTT_PLATFORM_ID_UNICODE: + // Mac/iOS has these + // all the encodingIDs are unicode, so we don't bother to check it + info->index_map = cmap + ttULONG(data + encoding_record + 4); + break; + } + } + if (info->index_map == 0) + return 0; + + info->indexToLocFormat = ttUSHORT(data + info->head + 50); + return 1; +} + +STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo* info, int unicode_codepoint) +{ + stbtt_uint8* data = info->data; + stbtt_uint32 index_map = info->index_map; + + stbtt_uint16 format = ttUSHORT(data + index_map + 0); + if (format == 0) { // apple byte encoding + stbtt_int32 bytes = ttUSHORT(data + index_map + 2); + if (unicode_codepoint < bytes - 6) + return ttBYTE(data + index_map + 6 + unicode_codepoint); + return 0; + } + else if (format == 6) { + stbtt_uint32 first = ttUSHORT(data + index_map + 6); + stbtt_uint32 count = ttUSHORT(data + index_map + 8); + if ((stbtt_uint32)unicode_codepoint >= first && (stbtt_uint32)unicode_codepoint < first + count) + return ttUSHORT(data + index_map + 10 + (unicode_codepoint - first) * 2); + return 0; + } + else if (format == 2) { + STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean + return 0; + } + else if (format == 4) { // standard mapping for windows fonts: binary search collection of ranges + stbtt_uint16 segcount = ttUSHORT(data + index_map + 6) >> 1; + stbtt_uint16 searchRange = ttUSHORT(data + index_map + 8) >> 1; + stbtt_uint16 entrySelector = ttUSHORT(data + index_map + 10); + stbtt_uint16 rangeShift = ttUSHORT(data + index_map + 12) >> 1; + + // do a binary search of the segments + stbtt_uint32 endCount = index_map + 14; + stbtt_uint32 search = endCount; + + if (unicode_codepoint > 0xffff) + return 0; + + // they lie from endCount .. endCount + segCount + // but searchRange is the nearest power of two, so... + if (unicode_codepoint >= ttUSHORT(data + search + rangeShift * 2)) + search += rangeShift * 2; + + // now decrement to bias correctly to find smallest + search -= 2; + while (entrySelector) { + stbtt_uint16 end; + searchRange >>= 1; + end = ttUSHORT(data + search + searchRange * 2); + if (unicode_codepoint > end) + search += searchRange * 2; + --entrySelector; + } + search += 2; + + { + stbtt_uint16 offset, start; + stbtt_uint16 item = (stbtt_uint16)((search - endCount) >> 1); + + STBTT_assert(unicode_codepoint <= ttUSHORT(data + endCount + 2 * item)); + start = ttUSHORT(data + index_map + 14 + segcount * 2 + 2 + 2 * item); + if (unicode_codepoint < start) + return 0; + + offset = ttUSHORT(data + index_map + 14 + segcount * 6 + 2 + 2 * item); + if (offset == 0) + return (stbtt_uint16)(unicode_codepoint + ttSHORT(data + index_map + 14 + segcount * 4 + 2 + 2 * item)); + + return ttUSHORT(data + offset + (unicode_codepoint - start) * 2 + index_map + 14 + segcount * 6 + 2 + 2 * item); + } + } + else if (format == 12 || format == 13) { + stbtt_uint32 ngroups = ttULONG(data + index_map + 12); + stbtt_int32 low, high; + low = 0; high = (stbtt_int32)ngroups; + // Binary search the right group. + while (low < high) { + stbtt_int32 mid = low + ((high - low) >> 1); // rounds down, so low <= mid < high + stbtt_uint32 start_char = ttULONG(data + index_map + 16 + mid * 12); + stbtt_uint32 end_char = ttULONG(data + index_map + 16 + mid * 12 + 4); + if ((stbtt_uint32)unicode_codepoint < start_char) + high = mid; + else if ((stbtt_uint32)unicode_codepoint > end_char) + low = mid + 1; + else { + stbtt_uint32 start_glyph = ttULONG(data + index_map + 16 + mid * 12 + 8); + if (format == 12) + return start_glyph + unicode_codepoint - start_char; + else // format == 13 + return start_glyph; + } + } + return 0; // not found + } + // @TODO + STBTT_assert(0); + return 0; +} + +STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo* info, int unicode_codepoint, stbtt_vertex** vertices) +{ + return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices); +} + +static void stbtt_setvertex(stbtt_vertex* v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy) +{ + v->type = type; + v->x = (stbtt_int16)x; + v->y = (stbtt_int16)y; + v->cx = (stbtt_int16)cx; + v->cy = (stbtt_int16)cy; +} + +static int stbtt__GetGlyfOffset(const stbtt_fontinfo* info, int glyph_index) +{ + int g1, g2; + + STBTT_assert(!info->cff.size); + + if (glyph_index >= info->numGlyphs) return -1; // glyph index out of range + if (info->indexToLocFormat >= 2) return -1; // unknown index->glyph map format + + if (info->indexToLocFormat == 0) { + g1 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2) * 2; + g2 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2 + 2) * 2; + } + else { + g1 = info->glyf + ttULONG(info->data + info->loca + glyph_index * 4); + g2 = info->glyf + ttULONG(info->data + info->loca + glyph_index * 4 + 4); + } + + return g1 == g2 ? -1 : g1; // if length is 0, return -1 +} + +static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo* info, int glyph_index, int* x0, int* y0, int* x1, int* y1); + +STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo* info, int glyph_index, int* x0, int* y0, int* x1, int* y1) +{ + if (info->cff.size) { + stbtt__GetGlyphInfoT2(info, glyph_index, x0, y0, x1, y1); + } + else { + int g = stbtt__GetGlyfOffset(info, glyph_index); + if (g < 0) return 0; + + if (x0) *x0 = ttSHORT(info->data + g + 2); + if (y0) *y0 = ttSHORT(info->data + g + 4); + if (x1) *x1 = ttSHORT(info->data + g + 6); + if (y1) *y1 = ttSHORT(info->data + g + 8); + } + return 1; +} + +STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo* info, int codepoint, int* x0, int* y0, int* x1, int* y1) +{ + return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info, codepoint), x0, y0, x1, y1); +} + +STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo* info, int glyph_index) +{ + stbtt_int16 numberOfContours; + int g; + if (info->cff.size) + return stbtt__GetGlyphInfoT2(info, glyph_index, NULL, NULL, NULL, NULL) == 0; + g = stbtt__GetGlyfOffset(info, glyph_index); + if (g < 0) return 1; + numberOfContours = ttSHORT(info->data + g); + return numberOfContours == 0; +} + +static int stbtt__close_shape(stbtt_vertex* vertices, int num_vertices, int was_off, int start_off, + stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy) +{ + if (start_off) { + if (was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx + scx) >> 1, (cy + scy) >> 1, cx, cy); + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx, sy, scx, scy); + } + else { + if (was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx, sy, cx, cy); + else + stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, sx, sy, 0, 0); + } + return num_vertices; +} + +static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo* info, int glyph_index, stbtt_vertex** pvertices) +{ + stbtt_int16 numberOfContours; + stbtt_uint8* endPtsOfContours; + stbtt_uint8* data = info->data; + stbtt_vertex* vertices = 0; + int num_vertices = 0; + int g = stbtt__GetGlyfOffset(info, glyph_index); + + *pvertices = NULL; + + if (g < 0) return 0; + + numberOfContours = ttSHORT(data + g); + + if (numberOfContours > 0) { + stbtt_uint8 flags = 0, flagcount; + stbtt_int32 ins, i, j = 0, m, n, next_move, was_off = 0, off, start_off = 0; + stbtt_int32 x, y, cx, cy, sx, sy, scx, scy; + stbtt_uint8* points; + endPtsOfContours = (data + g + 10); + ins = ttUSHORT(data + g + 10 + numberOfContours * 2); + points = data + g + 10 + numberOfContours * 2 + 2 + ins; + + n = 1 + ttUSHORT(endPtsOfContours + numberOfContours * 2 - 2); + + m = n + 2 * numberOfContours; // a loose bound on how many vertices we might need + vertices = (stbtt_vertex*)STBTT_malloc(m * sizeof(vertices[0]), info->userdata); + if (vertices == 0) + return 0; + + next_move = 0; + flagcount = 0; + + // in first pass, we load uninterpreted data into the allocated array + // above, shifted to the end of the array so we won't overwrite it when + // we create our final data starting from the front + + off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated + + // first load flags + + for (i = 0; i < n; ++i) { + if (flagcount == 0) { + flags = *points++; + if (flags & 8) + flagcount = *points++; + } + else + --flagcount; + vertices[off + i].type = flags; + } + + // now load x coordinates + x = 0; + for (i = 0; i < n; ++i) { + flags = vertices[off + i].type; + if (flags & 2) { + stbtt_int16 dx = *points++; + x += (flags & 16) ? dx : -dx; // ??? + } + else { + if (!(flags & 16)) { + x = x + (stbtt_int16)(points[0] * 256 + points[1]); + points += 2; + } + } + vertices[off + i].x = (stbtt_int16)x; + } + + // now load y coordinates + y = 0; + for (i = 0; i < n; ++i) { + flags = vertices[off + i].type; + if (flags & 4) { + stbtt_int16 dy = *points++; + y += (flags & 32) ? dy : -dy; // ??? + } + else { + if (!(flags & 32)) { + y = y + (stbtt_int16)(points[0] * 256 + points[1]); + points += 2; + } + } + vertices[off + i].y = (stbtt_int16)y; + } + + // now convert them to our format + num_vertices = 0; + sx = sy = cx = cy = scx = scy = 0; + for (i = 0; i < n; ++i) { + flags = vertices[off + i].type; + x = (stbtt_int16)vertices[off + i].x; + y = (stbtt_int16)vertices[off + i].y; + + if (next_move == i) { + if (i != 0) + num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx, sy, scx, scy, cx, cy); + + // now start the new one + start_off = !(flags & 1); + if (start_off) { + // if we start off with an off-curve point, then when we need to find a point on the curve + // where we can start, and we need to save some state for when we wraparound. + scx = x; + scy = y; + if (!(vertices[off + i + 1].type & 1)) { + // next point is also a curve point, so interpolate an on-point curve + sx = (x + (stbtt_int32)vertices[off + i + 1].x) >> 1; + sy = (y + (stbtt_int32)vertices[off + i + 1].y) >> 1; + } + else { + // otherwise just use the next point as our start point + sx = (stbtt_int32)vertices[off + i + 1].x; + sy = (stbtt_int32)vertices[off + i + 1].y; + ++i; // we're using point i+1 as the starting point, so skip it + } + } + else { + sx = x; + sy = y; + } + stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove, sx, sy, 0, 0); + was_off = 0; + next_move = 1 + ttUSHORT(endPtsOfContours + j * 2); + ++j; + } + else { + if (!(flags & 1)) { // if it's a curve + if (was_off) // two off-curve control points in a row means interpolate an on-curve midpoint + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx + x) >> 1, (cy + y) >> 1, cx, cy); + cx = x; + cy = y; + was_off = 1; + } + else { + if (was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x, y, cx, cy); + else + stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x, y, 0, 0); + was_off = 0; + } + } + } + num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx, sy, scx, scy, cx, cy); + } + else if (numberOfContours < 0) { + // Compound shapes. + int more = 1; + stbtt_uint8* comp = data + g + 10; + num_vertices = 0; + vertices = 0; + while (more) { + stbtt_uint16 flags, gidx; + int comp_num_verts = 0, i; + stbtt_vertex* comp_verts = 0, * tmp = 0; + float mtx[6] = { 1,0,0,1,0,0 }, m, n; + + flags = ttSHORT(comp); comp += 2; + gidx = ttSHORT(comp); comp += 2; + + if (flags & 2) { // XY values + if (flags & 1) { // shorts + mtx[4] = ttSHORT(comp); comp += 2; + mtx[5] = ttSHORT(comp); comp += 2; + } + else { + mtx[4] = ttCHAR(comp); comp += 1; + mtx[5] = ttCHAR(comp); comp += 1; + } + } + else { + // @TODO handle matching point + STBTT_assert(0); + } + if (flags & (1 << 3)) { // WE_HAVE_A_SCALE + mtx[0] = mtx[3] = ttSHORT(comp) / 16384.0f; comp += 2; + mtx[1] = mtx[2] = 0; + } + else if (flags & (1 << 6)) { // WE_HAVE_AN_X_AND_YSCALE + mtx[0] = ttSHORT(comp) / 16384.0f; comp += 2; + mtx[1] = mtx[2] = 0; + mtx[3] = ttSHORT(comp) / 16384.0f; comp += 2; + } + else if (flags & (1 << 7)) { // WE_HAVE_A_TWO_BY_TWO + mtx[0] = ttSHORT(comp) / 16384.0f; comp += 2; + mtx[1] = ttSHORT(comp) / 16384.0f; comp += 2; + mtx[2] = ttSHORT(comp) / 16384.0f; comp += 2; + mtx[3] = ttSHORT(comp) / 16384.0f; comp += 2; + } + + // Find transformation scales. + m = (float)STBTT_sqrt(mtx[0] * mtx[0] + mtx[1] * mtx[1]); + n = (float)STBTT_sqrt(mtx[2] * mtx[2] + mtx[3] * mtx[3]); + + // Get indexed glyph. + comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts); + if (comp_num_verts > 0) { + // Transform vertices. + for (i = 0; i < comp_num_verts; ++i) { + stbtt_vertex* v = &comp_verts[i]; + stbtt_vertex_type x, y; + x = v->x; y = v->y; + v->x = (stbtt_vertex_type)(m * (mtx[0] * x + mtx[2] * y + mtx[4])); + v->y = (stbtt_vertex_type)(n * (mtx[1] * x + mtx[3] * y + mtx[5])); + x = v->cx; y = v->cy; + v->cx = (stbtt_vertex_type)(m * (mtx[0] * x + mtx[2] * y + mtx[4])); + v->cy = (stbtt_vertex_type)(n * (mtx[1] * x + mtx[3] * y + mtx[5])); + } + // Append vertices. + tmp = (stbtt_vertex*)STBTT_malloc((num_vertices + comp_num_verts) * sizeof(stbtt_vertex), info->userdata); + if (!tmp) { + if (vertices) STBTT_free(vertices, info->userdata); + if (comp_verts) STBTT_free(comp_verts, info->userdata); + return 0; + } + if (num_vertices > 0) STBTT_memcpy(tmp, vertices, num_vertices * sizeof(stbtt_vertex)); + STBTT_memcpy(tmp + num_vertices, comp_verts, comp_num_verts * sizeof(stbtt_vertex)); + if (vertices) STBTT_free(vertices, info->userdata); + vertices = tmp; + STBTT_free(comp_verts, info->userdata); + num_vertices += comp_num_verts; + } + // More components ? + more = flags & (1 << 5); + } + } + else { + // numberOfCounters == 0, do nothing + } + + *pvertices = vertices; + return num_vertices; +} + +typedef struct +{ + int bounds; + int started; + float first_x, first_y; + float x, y; + stbtt_int32 min_x, max_x, min_y, max_y; + + stbtt_vertex* pvertices; + int num_vertices; +} stbtt__csctx; + +#define STBTT__CSCTX_INIT(bounds) {bounds,0, 0,0, 0,0, 0,0,0,0, NULL, 0} + +static void stbtt__track_vertex(stbtt__csctx* c, stbtt_int32 x, stbtt_int32 y) +{ + if (x > c->max_x || !c->started) c->max_x = x; + if (y > c->max_y || !c->started) c->max_y = y; + if (x < c->min_x || !c->started) c->min_x = x; + if (y < c->min_y || !c->started) c->min_y = y; + c->started = 1; +} + +static void stbtt__csctx_v(stbtt__csctx* c, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy, stbtt_int32 cx1, stbtt_int32 cy1) +{ + if (c->bounds) { + stbtt__track_vertex(c, x, y); + if (type == STBTT_vcubic) { + stbtt__track_vertex(c, cx, cy); + stbtt__track_vertex(c, cx1, cy1); + } + } + else { + stbtt_setvertex(&c->pvertices[c->num_vertices], type, x, y, cx, cy); + c->pvertices[c->num_vertices].cx1 = (stbtt_int16)cx1; + c->pvertices[c->num_vertices].cy1 = (stbtt_int16)cy1; + } + c->num_vertices++; +} + +static void stbtt__csctx_close_shape(stbtt__csctx* ctx) +{ + if (ctx->first_x != ctx->x || ctx->first_y != ctx->y) + stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->first_x, (int)ctx->first_y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rmove_to(stbtt__csctx* ctx, float dx, float dy) +{ + stbtt__csctx_close_shape(ctx); + ctx->first_x = ctx->x = ctx->x + dx; + ctx->first_y = ctx->y = ctx->y + dy; + stbtt__csctx_v(ctx, STBTT_vmove, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rline_to(stbtt__csctx* ctx, float dx, float dy) +{ + ctx->x += dx; + ctx->y += dy; + stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rccurve_to(stbtt__csctx* ctx, float dx1, float dy1, float dx2, float dy2, float dx3, float dy3) +{ + float cx1 = ctx->x + dx1; + float cy1 = ctx->y + dy1; + float cx2 = cx1 + dx2; + float cy2 = cy1 + dy2; + ctx->x = cx2 + dx3; + ctx->y = cy2 + dy3; + stbtt__csctx_v(ctx, STBTT_vcubic, (int)ctx->x, (int)ctx->y, (int)cx1, (int)cy1, (int)cx2, (int)cy2); +} + +static stbtt__buf stbtt__get_subr(stbtt__buf idx, int n) +{ + int count = stbtt__cff_index_count(&idx); + int bias = 107; + if (count >= 33900) + bias = 32768; + else if (count >= 1240) + bias = 1131; + n += bias; + if (n < 0 || n >= count) + return stbtt__new_buf(NULL, 0); + return stbtt__cff_index_get(idx, n); +} + +static stbtt__buf stbtt__cid_get_glyph_subrs(const stbtt_fontinfo* info, int glyph_index) +{ + stbtt__buf fdselect = info->fdselect; + int nranges, start, end, v, fmt, fdselector = -1, i; + + stbtt__buf_seek(&fdselect, 0); + fmt = stbtt__buf_get8(&fdselect); + if (fmt == 0) { + // untested + stbtt__buf_skip(&fdselect, glyph_index); + fdselector = stbtt__buf_get8(&fdselect); + } + else if (fmt == 3) { + nranges = stbtt__buf_get16(&fdselect); + start = stbtt__buf_get16(&fdselect); + for (i = 0; i < nranges; i++) { + v = stbtt__buf_get8(&fdselect); + end = stbtt__buf_get16(&fdselect); + if (glyph_index >= start && glyph_index < end) { + fdselector = v; + break; + } + start = end; + } + } + if (fdselector == -1) stbtt__new_buf(NULL, 0); + return stbtt__get_subrs(info->cff, stbtt__cff_index_get(info->fontdicts, fdselector)); +} + +static int stbtt__run_charstring(const stbtt_fontinfo* info, int glyph_index, stbtt__csctx* c) +{ + int in_header = 1, maskbits = 0, subr_stack_height = 0, sp = 0, v, i, b0; + int has_subrs = 0, clear_stack; + float s[48]; + stbtt__buf subr_stack[10], subrs = info->subrs, b; + float f; + +#define STBTT__CSERR(s) (0) + + // this currently ignores the initial width value, which isn't needed if we have hmtx + b = stbtt__cff_index_get(info->charstrings, glyph_index); + while (b.cursor < b.size) { + i = 0; + clear_stack = 1; + b0 = stbtt__buf_get8(&b); + switch (b0) { + // @TODO implement hinting + case 0x13: // hintmask + case 0x14: // cntrmask + if (in_header) + maskbits += (sp / 2); // implicit "vstem" + in_header = 0; + stbtt__buf_skip(&b, (maskbits + 7) / 8); + break; + + case 0x01: // hstem + case 0x03: // vstem + case 0x12: // hstemhm + case 0x17: // vstemhm + maskbits += (sp / 2); + break; + + case 0x15: // rmoveto + in_header = 0; + if (sp < 2) return STBTT__CSERR("rmoveto stack"); + stbtt__csctx_rmove_to(c, s[sp - 2], s[sp - 1]); + break; + case 0x04: // vmoveto + in_header = 0; + if (sp < 1) return STBTT__CSERR("vmoveto stack"); + stbtt__csctx_rmove_to(c, 0, s[sp - 1]); + break; + case 0x16: // hmoveto + in_header = 0; + if (sp < 1) return STBTT__CSERR("hmoveto stack"); + stbtt__csctx_rmove_to(c, s[sp - 1], 0); + break; + + case 0x05: // rlineto + if (sp < 2) return STBTT__CSERR("rlineto stack"); + for (; i + 1 < sp; i += 2) + stbtt__csctx_rline_to(c, s[i], s[i + 1]); + break; + + // hlineto/vlineto and vhcurveto/hvcurveto alternate horizontal and vertical + // starting from a different place. + + case 0x07: // vlineto + if (sp < 1) return STBTT__CSERR("vlineto stack"); + goto vlineto; + case 0x06: // hlineto + if (sp < 1) return STBTT__CSERR("hlineto stack"); + for (;;) { + if (i >= sp) break; + stbtt__csctx_rline_to(c, s[i], 0); + i++; + vlineto: + if (i >= sp) break; + stbtt__csctx_rline_to(c, 0, s[i]); + i++; + } + break; + + case 0x1F: // hvcurveto + if (sp < 4) return STBTT__CSERR("hvcurveto stack"); + goto hvcurveto; + case 0x1E: // vhcurveto + if (sp < 4) return STBTT__CSERR("vhcurveto stack"); + for (;;) { + if (i + 3 >= sp) break; + stbtt__csctx_rccurve_to(c, 0, s[i], s[i + 1], s[i + 2], s[i + 3], (sp - i == 5) ? s[i + 4] : 0.0f); + i += 4; + hvcurveto: + if (i + 3 >= sp) break; + stbtt__csctx_rccurve_to(c, s[i], 0, s[i + 1], s[i + 2], (sp - i == 5) ? s[i + 4] : 0.0f, s[i + 3]); + i += 4; + } + break; + + case 0x08: // rrcurveto + if (sp < 6) return STBTT__CSERR("rcurveline stack"); + for (; i + 5 < sp; i += 6) + stbtt__csctx_rccurve_to(c, s[i], s[i + 1], s[i + 2], s[i + 3], s[i + 4], s[i + 5]); + break; + + case 0x18: // rcurveline + if (sp < 8) return STBTT__CSERR("rcurveline stack"); + for (; i + 5 < sp - 2; i += 6) + stbtt__csctx_rccurve_to(c, s[i], s[i + 1], s[i + 2], s[i + 3], s[i + 4], s[i + 5]); + if (i + 1 >= sp) return STBTT__CSERR("rcurveline stack"); + stbtt__csctx_rline_to(c, s[i], s[i + 1]); + break; + + case 0x19: // rlinecurve + if (sp < 8) return STBTT__CSERR("rlinecurve stack"); + for (; i + 1 < sp - 6; i += 2) + stbtt__csctx_rline_to(c, s[i], s[i + 1]); + if (i + 5 >= sp) return STBTT__CSERR("rlinecurve stack"); + stbtt__csctx_rccurve_to(c, s[i], s[i + 1], s[i + 2], s[i + 3], s[i + 4], s[i + 5]); + break; + + case 0x1A: // vvcurveto + case 0x1B: // hhcurveto + if (sp < 4) return STBTT__CSERR("(vv|hh)curveto stack"); + f = 0.0; + if (sp & 1) { f = s[i]; i++; } + for (; i + 3 < sp; i += 4) { + if (b0 == 0x1B) + stbtt__csctx_rccurve_to(c, s[i], f, s[i + 1], s[i + 2], s[i + 3], 0.0); + else + stbtt__csctx_rccurve_to(c, f, s[i], s[i + 1], s[i + 2], 0.0, s[i + 3]); + f = 0.0; + } + break; + + case 0x0A: // callsubr + if (!has_subrs) { + if (info->fdselect.size) + subrs = stbtt__cid_get_glyph_subrs(info, glyph_index); + has_subrs = 1; + } + // fallthrough + case 0x1D: // callgsubr + if (sp < 1) return STBTT__CSERR("call(g|)subr stack"); + v = (int)s[--sp]; + if (subr_stack_height >= 10) return STBTT__CSERR("recursion limit"); + subr_stack[subr_stack_height++] = b; + b = stbtt__get_subr(b0 == 0x0A ? subrs : info->gsubrs, v); + if (b.size == 0) return STBTT__CSERR("subr not found"); + b.cursor = 0; + clear_stack = 0; + break; + + case 0x0B: // return + if (subr_stack_height <= 0) return STBTT__CSERR("return outside subr"); + b = subr_stack[--subr_stack_height]; + clear_stack = 0; + break; + + case 0x0E: // endchar + stbtt__csctx_close_shape(c); + return 1; + + case 0x0C: { // two-byte escape + float dx1, dx2, dx3, dx4, dx5, dx6, dy1, dy2, dy3, dy4, dy5, dy6; + float dx, dy; + int b1 = stbtt__buf_get8(&b); + switch (b1) { + // @TODO These "flex" implementations ignore the flex-depth and resolution, + // and always draw beziers. + case 0x22: // hflex + if (sp < 7) return STBTT__CSERR("hflex stack"); + dx1 = s[0]; + dx2 = s[1]; + dy2 = s[2]; + dx3 = s[3]; + dx4 = s[4]; + dx5 = s[5]; + dx6 = s[6]; + stbtt__csctx_rccurve_to(c, dx1, 0, dx2, dy2, dx3, 0); + stbtt__csctx_rccurve_to(c, dx4, 0, dx5, -dy2, dx6, 0); + break; + + case 0x23: // flex + if (sp < 13) return STBTT__CSERR("flex stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dy3 = s[5]; + dx4 = s[6]; + dy4 = s[7]; + dx5 = s[8]; + dy5 = s[9]; + dx6 = s[10]; + dy6 = s[11]; + //fd is s[12] + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); + stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); + break; + + case 0x24: // hflex1 + if (sp < 9) return STBTT__CSERR("hflex1 stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dx4 = s[5]; + dx5 = s[6]; + dy5 = s[7]; + dx6 = s[8]; + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, 0); + stbtt__csctx_rccurve_to(c, dx4, 0, dx5, dy5, dx6, -(dy1 + dy2 + dy5)); + break; + + case 0x25: // flex1 + if (sp < 11) return STBTT__CSERR("flex1 stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dy3 = s[5]; + dx4 = s[6]; + dy4 = s[7]; + dx5 = s[8]; + dy5 = s[9]; + dx6 = dy6 = s[10]; + dx = dx1 + dx2 + dx3 + dx4 + dx5; + dy = dy1 + dy2 + dy3 + dy4 + dy5; + if (STBTT_fabs(dx) > STBTT_fabs(dy)) + dy6 = -dy; + else + dx6 = -dx; + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); + stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); + break; + + default: + return STBTT__CSERR("unimplemented"); + } + } break; + + default: + if (b0 != 255 && b0 != 28 && (b0 < 32 || b0 > 254)) + return STBTT__CSERR("reserved operator"); + + // push immediate + if (b0 == 255) { + f = (float)(stbtt_int32)stbtt__buf_get32(&b) / 0x10000; + } + else { + stbtt__buf_skip(&b, -1); + f = (float)(stbtt_int16)stbtt__cff_int(&b); + } + if (sp >= 48) return STBTT__CSERR("push stack overflow"); + s[sp++] = f; + clear_stack = 0; + break; + } + if (clear_stack) sp = 0; + } + return STBTT__CSERR("no endchar"); + +#undef STBTT__CSERR +} + +static int stbtt__GetGlyphShapeT2(const stbtt_fontinfo* info, int glyph_index, stbtt_vertex** pvertices) +{ + // runs the charstring twice, once to count and once to output (to avoid realloc) + stbtt__csctx count_ctx = STBTT__CSCTX_INIT(1); + stbtt__csctx output_ctx = STBTT__CSCTX_INIT(0); + if (stbtt__run_charstring(info, glyph_index, &count_ctx)) { + *pvertices = (stbtt_vertex*)STBTT_malloc(count_ctx.num_vertices * sizeof(stbtt_vertex), info->userdata); + output_ctx.pvertices = *pvertices; + if (stbtt__run_charstring(info, glyph_index, &output_ctx)) { + STBTT_assert(output_ctx.num_vertices == count_ctx.num_vertices); + return output_ctx.num_vertices; + } + } + *pvertices = NULL; + return 0; +} + +static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo* info, int glyph_index, int* x0, int* y0, int* x1, int* y1) +{ + stbtt__csctx c = STBTT__CSCTX_INIT(1); + int r = stbtt__run_charstring(info, glyph_index, &c); + if (x0) *x0 = r ? c.min_x : 0; + if (y0) *y0 = r ? c.min_y : 0; + if (x1) *x1 = r ? c.max_x : 0; + if (y1) *y1 = r ? c.max_y : 0; + return r ? c.num_vertices : 0; +} + +STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo* info, int glyph_index, stbtt_vertex** pvertices) +{ + if (!info->cff.size) + return stbtt__GetGlyphShapeTT(info, glyph_index, pvertices); + else + return stbtt__GetGlyphShapeT2(info, glyph_index, pvertices); +} + +STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo* info, int glyph_index, int* advanceWidth, int* leftSideBearing) +{ + stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data + info->hhea + 34); + if (glyph_index < numOfLongHorMetrics) { + if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4 * glyph_index); + if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4 * glyph_index + 2); + } + else { + if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4 * (numOfLongHorMetrics - 1)); + if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4 * numOfLongHorMetrics + 2 * (glyph_index - numOfLongHorMetrics)); + } +} + +STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo* info) +{ + stbtt_uint8* data = info->data + info->kern; + + // we only look at the first table. it must be 'horizontal' and format 0. + if (!info->kern) + return 0; + if (ttUSHORT(data + 2) < 1) // number of tables, need at least 1 + return 0; + if (ttUSHORT(data + 8) != 1) // horizontal flag must be set in format + return 0; + + return ttUSHORT(data + 10); +} + +STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo* info, stbtt_kerningentry* table, int table_length) +{ + stbtt_uint8* data = info->data + info->kern; + int k, length; + + // we only look at the first table. it must be 'horizontal' and format 0. + if (!info->kern) + return 0; + if (ttUSHORT(data + 2) < 1) // number of tables, need at least 1 + return 0; + if (ttUSHORT(data + 8) != 1) // horizontal flag must be set in format + return 0; + + length = ttUSHORT(data + 10); + if (table_length < length) + length = table_length; + + for (k = 0; k < length; k++) + { + table[k].glyph1 = ttUSHORT(data + 18 + (k * 6)); + table[k].glyph2 = ttUSHORT(data + 20 + (k * 6)); + table[k].advance = ttSHORT(data + 22 + (k * 6)); + } + + return length; +} + +static int stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo* info, int glyph1, int glyph2) +{ + stbtt_uint8* data = info->data + info->kern; + stbtt_uint32 needle, straw; + int l, r, m; + + // we only look at the first table. it must be 'horizontal' and format 0. + if (!info->kern) + return 0; + if (ttUSHORT(data + 2) < 1) // number of tables, need at least 1 + return 0; + if (ttUSHORT(data + 8) != 1) // horizontal flag must be set in format + return 0; + + l = 0; + r = ttUSHORT(data + 10) - 1; + needle = glyph1 << 16 | glyph2; + while (l <= r) { + m = (l + r) >> 1; + straw = ttULONG(data + 18 + (m * 6)); // note: unaligned read + if (needle < straw) + r = m - 1; + else if (needle > straw) + l = m + 1; + else + return ttSHORT(data + 22 + (m * 6)); + } + return 0; +} + +static stbtt_int32 stbtt__GetCoverageIndex(stbtt_uint8* coverageTable, int glyph) +{ + stbtt_uint16 coverageFormat = ttUSHORT(coverageTable); + switch (coverageFormat) { + case 1: { + stbtt_uint16 glyphCount = ttUSHORT(coverageTable + 2); + + // Binary search. + stbtt_int32 l = 0, r = glyphCount - 1, m; + int straw, needle = glyph; + while (l <= r) { + stbtt_uint8* glyphArray = coverageTable + 4; + stbtt_uint16 glyphID; + m = (l + r) >> 1; + glyphID = ttUSHORT(glyphArray + 2 * m); + straw = glyphID; + if (needle < straw) + r = m - 1; + else if (needle > straw) + l = m + 1; + else { + return m; + } + } + } break; + + case 2: { + stbtt_uint16 rangeCount = ttUSHORT(coverageTable + 2); + stbtt_uint8* rangeArray = coverageTable + 4; + + // Binary search. + stbtt_int32 l = 0, r = rangeCount - 1, m; + int strawStart, strawEnd, needle = glyph; + while (l <= r) { + stbtt_uint8* rangeRecord; + m = (l + r) >> 1; + rangeRecord = rangeArray + 6 * m; + strawStart = ttUSHORT(rangeRecord); + strawEnd = ttUSHORT(rangeRecord + 2); + if (needle < strawStart) + r = m - 1; + else if (needle > strawEnd) + l = m + 1; + else { + stbtt_uint16 startCoverageIndex = ttUSHORT(rangeRecord + 4); + return startCoverageIndex + glyph - strawStart; + } + } + } break; + + default: { + // There are no other cases. + STBTT_assert(0); + } break; + } + + return -1; +} + +static stbtt_int32 stbtt__GetGlyphClass(stbtt_uint8* classDefTable, int glyph) +{ + stbtt_uint16 classDefFormat = ttUSHORT(classDefTable); + switch (classDefFormat) + { + case 1: { + stbtt_uint16 startGlyphID = ttUSHORT(classDefTable + 2); + stbtt_uint16 glyphCount = ttUSHORT(classDefTable + 4); + stbtt_uint8* classDef1ValueArray = classDefTable + 6; + + if (glyph >= startGlyphID && glyph < startGlyphID + glyphCount) + return (stbtt_int32)ttUSHORT(classDef1ValueArray + 2 * (glyph - startGlyphID)); + + classDefTable = classDef1ValueArray + 2 * glyphCount; + } break; + + case 2: { + stbtt_uint16 classRangeCount = ttUSHORT(classDefTable + 2); + stbtt_uint8* classRangeRecords = classDefTable + 4; + + // Binary search. + stbtt_int32 l = 0, r = classRangeCount - 1, m; + int strawStart, strawEnd, needle = glyph; + while (l <= r) { + stbtt_uint8* classRangeRecord; + m = (l + r) >> 1; + classRangeRecord = classRangeRecords + 6 * m; + strawStart = ttUSHORT(classRangeRecord); + strawEnd = ttUSHORT(classRangeRecord + 2); + if (needle < strawStart) + r = m - 1; + else if (needle > strawEnd) + l = m + 1; + else + return (stbtt_int32)ttUSHORT(classRangeRecord + 4); + } + + classDefTable = classRangeRecords + 6 * classRangeCount; + } break; + + default: { + // There are no other cases. + STBTT_assert(0); + } break; + } + + return -1; +} + +// Define to STBTT_assert(x) if you want to break on unimplemented formats. +#define STBTT_GPOS_TODO_assert(x) + +static stbtt_int32 stbtt__GetGlyphGPOSInfoAdvance(const stbtt_fontinfo* info, int glyph1, int glyph2) +{ + stbtt_uint16 lookupListOffset; + stbtt_uint8* lookupList; + stbtt_uint16 lookupCount; + stbtt_uint8* data; + stbtt_int32 i; + + if (!info->gpos) return 0; + + data = info->data + info->gpos; + + if (ttUSHORT(data + 0) != 1) return 0; // Major version 1 + if (ttUSHORT(data + 2) != 0) return 0; // Minor version 0 + + lookupListOffset = ttUSHORT(data + 8); + lookupList = data + lookupListOffset; + lookupCount = ttUSHORT(lookupList); + + for (i = 0; i < lookupCount; ++i) { + stbtt_uint16 lookupOffset = ttUSHORT(lookupList + 2 + 2 * i); + stbtt_uint8* lookupTable = lookupList + lookupOffset; + + stbtt_uint16 lookupType = ttUSHORT(lookupTable); + stbtt_uint16 subTableCount = ttUSHORT(lookupTable + 4); + stbtt_uint8* subTableOffsets = lookupTable + 6; + switch (lookupType) { + case 2: { // Pair Adjustment Positioning Subtable + stbtt_int32 sti; + for (sti = 0; sti < subTableCount; sti++) { + stbtt_uint16 subtableOffset = ttUSHORT(subTableOffsets + 2 * sti); + stbtt_uint8* table = lookupTable + subtableOffset; + stbtt_uint16 posFormat = ttUSHORT(table); + stbtt_uint16 coverageOffset = ttUSHORT(table + 2); + stbtt_int32 coverageIndex = stbtt__GetCoverageIndex(table + coverageOffset, glyph1); + if (coverageIndex == -1) continue; + + switch (posFormat) { + case 1: { + stbtt_int32 l, r, m; + int straw, needle; + stbtt_uint16 valueFormat1 = ttUSHORT(table + 4); + stbtt_uint16 valueFormat2 = ttUSHORT(table + 6); + stbtt_int32 valueRecordPairSizeInBytes = 2; + stbtt_uint16 pairSetCount = ttUSHORT(table + 8); + stbtt_uint16 pairPosOffset = ttUSHORT(table + 10 + 2 * coverageIndex); + stbtt_uint8* pairValueTable = table + pairPosOffset; + stbtt_uint16 pairValueCount = ttUSHORT(pairValueTable); + stbtt_uint8* pairValueArray = pairValueTable + 2; + // TODO: Support more formats. + STBTT_GPOS_TODO_assert(valueFormat1 == 4); + if (valueFormat1 != 4) return 0; + STBTT_GPOS_TODO_assert(valueFormat2 == 0); + if (valueFormat2 != 0) return 0; + + STBTT_assert(coverageIndex < pairSetCount); + STBTT__NOTUSED(pairSetCount); + + needle = glyph2; + r = pairValueCount - 1; + l = 0; + + // Binary search. + while (l <= r) { + stbtt_uint16 secondGlyph; + stbtt_uint8* pairValue; + m = (l + r) >> 1; + pairValue = pairValueArray + (2 + valueRecordPairSizeInBytes) * m; + secondGlyph = ttUSHORT(pairValue); + straw = secondGlyph; + if (needle < straw) + r = m - 1; + else if (needle > straw) + l = m + 1; + else { + stbtt_int16 xAdvance = ttSHORT(pairValue + 2); + return xAdvance; + } + } + } break; + + case 2: { + stbtt_uint16 valueFormat1 = ttUSHORT(table + 4); + stbtt_uint16 valueFormat2 = ttUSHORT(table + 6); + + stbtt_uint16 classDef1Offset = ttUSHORT(table + 8); + stbtt_uint16 classDef2Offset = ttUSHORT(table + 10); + int glyph1class = stbtt__GetGlyphClass(table + classDef1Offset, glyph1); + int glyph2class = stbtt__GetGlyphClass(table + classDef2Offset, glyph2); + + stbtt_uint16 class1Count = ttUSHORT(table + 12); + stbtt_uint16 class2Count = ttUSHORT(table + 14); + STBTT_assert(glyph1class < class1Count); + STBTT_assert(glyph2class < class2Count); + + // TODO: Support more formats. + STBTT_GPOS_TODO_assert(valueFormat1 == 4); + if (valueFormat1 != 4) return 0; + STBTT_GPOS_TODO_assert(valueFormat2 == 0); + if (valueFormat2 != 0) return 0; + + if (glyph1class >= 0 && glyph1class < class1Count && glyph2class >= 0 && glyph2class < class2Count) { + stbtt_uint8* class1Records = table + 16; + stbtt_uint8* class2Records = class1Records + 2 * (glyph1class * class2Count); + stbtt_int16 xAdvance = ttSHORT(class2Records + 2 * glyph2class); + return xAdvance; + } + } break; + + default: { + // There are no other cases. + STBTT_assert(0); + break; + }; + } + } + break; + }; + + default: + // TODO: Implement other stuff. + break; + } + } + + return 0; +} + +STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo* info, int g1, int g2) +{ + int xAdvance = 0; + + if (info->gpos) + xAdvance += stbtt__GetGlyphGPOSInfoAdvance(info, g1, g2); + else if (info->kern) + xAdvance += stbtt__GetGlyphKernInfoAdvance(info, g1, g2); + + return xAdvance; +} + +STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo* info, int ch1, int ch2) +{ + if (!info->kern && !info->gpos) // if no kerning table, don't waste time looking up both codepoint->glyphs + return 0; + return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info, ch1), stbtt_FindGlyphIndex(info, ch2)); +} + +STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo* info, int codepoint, int* advanceWidth, int* leftSideBearing) +{ + stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info, codepoint), advanceWidth, leftSideBearing); +} + +STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo* info, int* ascent, int* descent, int* lineGap) +{ + if (ascent) *ascent = ttSHORT(info->data + info->hhea + 4); + if (descent) *descent = ttSHORT(info->data + info->hhea + 6); + if (lineGap) *lineGap = ttSHORT(info->data + info->hhea + 8); +} + +STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo* info, int* typoAscent, int* typoDescent, int* typoLineGap) +{ + int tab = stbtt__find_table(info->data, info->fontstart, "OS/2"); + if (!tab) + return 0; + if (typoAscent) *typoAscent = ttSHORT(info->data + tab + 68); + if (typoDescent) *typoDescent = ttSHORT(info->data + tab + 70); + if (typoLineGap) *typoLineGap = ttSHORT(info->data + tab + 72); + return 1; +} + +STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo* info, int* x0, int* y0, int* x1, int* y1) +{ + *x0 = ttSHORT(info->data + info->head + 36); + *y0 = ttSHORT(info->data + info->head + 38); + *x1 = ttSHORT(info->data + info->head + 40); + *y1 = ttSHORT(info->data + info->head + 42); +} + +STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo* info, float height) +{ + int fheight = ttSHORT(info->data + info->hhea + 4) - ttSHORT(info->data + info->hhea + 6); + return (float)height / fheight; +} + +STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo* info, float pixels) +{ + int unitsPerEm = ttUSHORT(info->data + info->head + 18); + return pixels / unitsPerEm; +} + +STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo* info, stbtt_vertex* v) +{ + STBTT_free(v, info->userdata); +} + +STBTT_DEF stbtt_uint8* stbtt_FindSVGDoc(const stbtt_fontinfo* info, int gl) +{ + int i; + stbtt_uint8* data = info->data; + stbtt_uint8* svg_doc_list = data + stbtt__get_svg((stbtt_fontinfo*)info); + + int numEntries = ttUSHORT(svg_doc_list); + stbtt_uint8* svg_docs = svg_doc_list + 2; + + for (i = 0; i < numEntries; i++) { + stbtt_uint8* svg_doc = svg_docs + (12 * i); + if ((gl >= ttUSHORT(svg_doc)) && (gl <= ttUSHORT(svg_doc + 2))) + return svg_doc; + } + return 0; +} + +STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo* info, int gl, const char** svg) +{ + stbtt_uint8* data = info->data; + stbtt_uint8* svg_doc; + + if (info->svg == 0) + return 0; + + svg_doc = stbtt_FindSVGDoc(info, gl); + if (svg_doc != NULL) { + *svg = (char*)data + info->svg + ttULONG(svg_doc + 4); + return ttULONG(svg_doc + 8); + } + else { + return 0; + } +} + +STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo* info, int unicode_codepoint, const char** svg) +{ + return stbtt_GetGlyphSVG(info, stbtt_FindGlyphIndex(info, unicode_codepoint), svg); +} + +////////////////////////////////////////////////////////////////////////////// +// +// antialiasing software rasterizer +// + +STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo* font, int glyph, float scale_x, float scale_y, float shift_x, float shift_y, int* ix0, int* iy0, int* ix1, int* iy1) +{ + int x0 = 0, y0 = 0, x1, y1; // =0 suppresses compiler warning + if (!stbtt_GetGlyphBox(font, glyph, &x0, &y0, &x1, &y1)) { + // e.g. space character + if (ix0) *ix0 = 0; + if (iy0) *iy0 = 0; + if (ix1) *ix1 = 0; + if (iy1) *iy1 = 0; + } + else { + // move to integral bboxes (treating pixels as little squares, what pixels get touched)? + if (ix0) *ix0 = STBTT_ifloor(x0 * scale_x + shift_x); + if (iy0) *iy0 = STBTT_ifloor(-y1 * scale_y + shift_y); + if (ix1) *ix1 = STBTT_iceil(x1 * scale_x + shift_x); + if (iy1) *iy1 = STBTT_iceil(-y0 * scale_y + shift_y); + } +} + +STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo* font, int glyph, float scale_x, float scale_y, int* ix0, int* iy0, int* ix1, int* iy1) +{ + stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y, 0.0f, 0.0f, ix0, iy0, ix1, iy1); +} + +STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo* font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int* ix0, int* iy0, int* ix1, int* iy1) +{ + stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font, codepoint), scale_x, scale_y, shift_x, shift_y, ix0, iy0, ix1, iy1); +} + +STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo* font, int codepoint, float scale_x, float scale_y, int* ix0, int* iy0, int* ix1, int* iy1) +{ + stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y, 0.0f, 0.0f, ix0, iy0, ix1, iy1); +} + +////////////////////////////////////////////////////////////////////////////// +// +// Rasterizer + +typedef struct stbtt__hheap_chunk +{ + struct stbtt__hheap_chunk* next; +} stbtt__hheap_chunk; + +typedef struct stbtt__hheap +{ + struct stbtt__hheap_chunk* head; + void* first_free; + int num_remaining_in_head_chunk; +} stbtt__hheap; + +static void* stbtt__hheap_alloc(stbtt__hheap* hh, size_t size, void* userdata) +{ + if (hh->first_free) { + void* p = hh->first_free; + hh->first_free = *(void**)p; + return p; + } + else { + if (hh->num_remaining_in_head_chunk == 0) { + int count = (size < 32 ? 2000 : size < 128 ? 800 : 100); + stbtt__hheap_chunk* c = (stbtt__hheap_chunk*)STBTT_malloc(sizeof(stbtt__hheap_chunk) + size * count, userdata); + if (c == NULL) + return NULL; + c->next = hh->head; + hh->head = c; + hh->num_remaining_in_head_chunk = count; + } + --hh->num_remaining_in_head_chunk; + return (char*)(hh->head) + sizeof(stbtt__hheap_chunk) + size * hh->num_remaining_in_head_chunk; + } +} + +static void stbtt__hheap_free(stbtt__hheap* hh, void* p) +{ + *(void**)p = hh->first_free; + hh->first_free = p; +} + +static void stbtt__hheap_cleanup(stbtt__hheap* hh, void* userdata) +{ + stbtt__hheap_chunk* c = hh->head; + while (c) { + stbtt__hheap_chunk* n = c->next; + STBTT_free(c, userdata); + c = n; + } +} + +typedef struct stbtt__edge { + float x0, y0, x1, y1; + int invert; +} stbtt__edge; + + +typedef struct stbtt__active_edge +{ + struct stbtt__active_edge* next; +#if STBTT_RASTERIZER_VERSION==1 + int x, dx; + float ey; + int direction; +#elif STBTT_RASTERIZER_VERSION==2 + float fx, fdx, fdy; + float direction; + float sy; + float ey; +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif +} stbtt__active_edge; + +#if STBTT_RASTERIZER_VERSION == 1 +#define STBTT_FIXSHIFT 10 +#define STBTT_FIX (1 << STBTT_FIXSHIFT) +#define STBTT_FIXMASK (STBTT_FIX-1) + +static stbtt__active_edge* stbtt__new_active(stbtt__hheap* hh, stbtt__edge* e, int off_x, float start_point, void* userdata) +{ + stbtt__active_edge* z = (stbtt__active_edge*)stbtt__hheap_alloc(hh, sizeof(*z), userdata); + float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); + STBTT_assert(z != NULL); + if (!z) return z; + + // round dx down to avoid overshooting + if (dxdy < 0) + z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy); + else + z->dx = STBTT_ifloor(STBTT_FIX * dxdy); + + z->x = STBTT_ifloor(STBTT_FIX * e->x0 + z->dx * (start_point - e->y0)); // use z->dx so when we offset later it's by the same amount + z->x -= off_x * STBTT_FIX; + + z->ey = e->y1; + z->next = 0; + z->direction = e->invert ? 1 : -1; + return z; +} +#elif STBTT_RASTERIZER_VERSION == 2 +static stbtt__active_edge* stbtt__new_active(stbtt__hheap* hh, stbtt__edge* e, int off_x, float start_point, void* userdata) +{ + stbtt__active_edge* z = (stbtt__active_edge*)stbtt__hheap_alloc(hh, sizeof(*z), userdata); + float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); + STBTT_assert(z != NULL); + //STBTT_assert(e->y0 <= start_point); + if (!z) return z; + z->fdx = dxdy; + z->fdy = dxdy != 0.0f ? (1.0f / dxdy) : 0.0f; + z->fx = e->x0 + dxdy * (start_point - e->y0); + z->fx -= off_x; + z->direction = e->invert ? 1.0f : -1.0f; + z->sy = e->y0; + z->ey = e->y1; + z->next = 0; + return z; +} +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + +#if STBTT_RASTERIZER_VERSION == 1 +// note: this routine clips fills that extend off the edges... ideally this +// wouldn't happen, but it could happen if the truetype glyph bounding boxes +// are wrong, or if the user supplies a too-small bitmap +static void stbtt__fill_active_edges(unsigned char* scanline, int len, stbtt__active_edge* e, int max_weight) +{ + // non-zero winding fill + int x0 = 0, w = 0; + + while (e) { + if (w == 0) { + // if we're currently at zero, we need to record the edge start point + x0 = e->x; w += e->direction; + } + else { + int x1 = e->x; w += e->direction; + // if we went to zero, we need to draw + if (w == 0) { + int i = x0 >> STBTT_FIXSHIFT; + int j = x1 >> STBTT_FIXSHIFT; + + if (i < len && j >= 0) { + if (i == j) { + // x0,x1 are the same pixel, so compute combined coverage + scanline[i] = scanline[i] + (stbtt_uint8)((x1 - x0) * max_weight >> STBTT_FIXSHIFT); + } + else { + if (i >= 0) // add antialiasing for x0 + scanline[i] = scanline[i] + (stbtt_uint8)(((STBTT_FIX - (x0 & STBTT_FIXMASK)) * max_weight) >> STBTT_FIXSHIFT); + else + i = -1; // clip + + if (j < len) // add antialiasing for x1 + scanline[j] = scanline[j] + (stbtt_uint8)(((x1 & STBTT_FIXMASK) * max_weight) >> STBTT_FIXSHIFT); + else + j = len; // clip + + for (++i; i < j; ++i) // fill pixels between x0 and x1 + scanline[i] = scanline[i] + (stbtt_uint8)max_weight; + } + } + } + } + + e = e->next; + } +} + +static void stbtt__rasterize_sorted_edges(stbtt__bitmap* result, stbtt__edge* e, int n, int vsubsample, int off_x, int off_y, void* userdata) +{ + stbtt__hheap hh = { 0, 0, 0 }; + stbtt__active_edge* active = NULL; + int y, j = 0; + int max_weight = (255 / vsubsample); // weight per vertical scanline + int s; // vertical subsample index + unsigned char scanline_data[512], * scanline; + + if (result->w > 512) + scanline = (unsigned char*)STBTT_malloc(result->w, userdata); + else + scanline = scanline_data; + + y = off_y * vsubsample; + e[n].y0 = (off_y + result->h) * (float)vsubsample + 1; + + while (j < result->h) { + STBTT_memset(scanline, 0, result->w); + for (s = 0; s < vsubsample; ++s) { + // find center of pixel for this scanline + float scan_y = y + 0.5f; + stbtt__active_edge** step = &active; + + // update all active edges; + // remove all active edges that terminate before the center of this scanline + while (*step) { + stbtt__active_edge* z = *step; + if (z->ey <= scan_y) { + *step = z->next; // delete from list + STBTT_assert(z->direction); + z->direction = 0; + stbtt__hheap_free(&hh, z); + } + else { + z->x += z->dx; // advance to position for current scanline + step = &((*step)->next); // advance through list + } + } + + // resort the list if needed + for (;;) { + int changed = 0; + step = &active; + while (*step && (*step)->next) { + if ((*step)->x > (*step)->next->x) { + stbtt__active_edge* t = *step; + stbtt__active_edge* q = t->next; + + t->next = q->next; + q->next = t; + *step = q; + changed = 1; + } + step = &(*step)->next; + } + if (!changed) break; + } + + // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline + while (e->y0 <= scan_y) { + if (e->y1 > scan_y) { + stbtt__active_edge* z = stbtt__new_active(&hh, e, off_x, scan_y, userdata); + if (z != NULL) { + // find insertion point + if (active == NULL) + active = z; + else if (z->x < active->x) { + // insert at front + z->next = active; + active = z; + } + else { + // find thing to insert AFTER + stbtt__active_edge* p = active; + while (p->next && p->next->x < z->x) + p = p->next; + // at this point, p->next->x is NOT < z->x + z->next = p->next; + p->next = z; + } + } + } + ++e; + } + + // now process all active edges in XOR fashion + if (active) + stbtt__fill_active_edges(scanline, result->w, active, max_weight); + + ++y; + } + STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w); + ++j; + } + + stbtt__hheap_cleanup(&hh, userdata); + + if (scanline != scanline_data) + STBTT_free(scanline, userdata); +} + +#elif STBTT_RASTERIZER_VERSION == 2 + +// the edge passed in here does not cross the vertical line at x or the vertical line at x+1 +// (i.e. it has already been clipped to those) +static void stbtt__handle_clipped_edge(float* scanline, int x, stbtt__active_edge* e, float x0, float y0, float x1, float y1) +{ + if (y0 == y1) return; + STBTT_assert(y0 < y1); + STBTT_assert(e->sy <= e->ey); + if (y0 > e->ey) return; + if (y1 < e->sy) return; + if (y0 < e->sy) { + x0 += (x1 - x0) * (e->sy - y0) / (y1 - y0); + y0 = e->sy; + } + if (y1 > e->ey) { + x1 += (x1 - x0) * (e->ey - y1) / (y1 - y0); + y1 = e->ey; + } + + if (x0 == x) + STBTT_assert(x1 <= x + 1); + else if (x0 == x + 1) + STBTT_assert(x1 >= x); + else if (x0 <= x) + STBTT_assert(x1 <= x); + else if (x0 >= x + 1) + STBTT_assert(x1 >= x + 1); + else + STBTT_assert(x1 >= x && x1 <= x + 1); + + if (x0 <= x && x1 <= x) + scanline[x] += e->direction * (y1 - y0); + else if (x0 >= x + 1 && x1 >= x + 1) + ; + else { + STBTT_assert(x0 >= x && x0 <= x + 1 && x1 >= x && x1 <= x + 1); + scanline[x] += e->direction * (y1 - y0) * (1 - ((x0 - x) + (x1 - x)) / 2); // coverage = 1 - average x position + } +} + +static void stbtt__fill_active_edges_new(float* scanline, float* scanline_fill, int len, stbtt__active_edge* e, float y_top) +{ + float y_bottom = y_top + 1; + + while (e) { + // brute force every pixel + + // compute intersection points with top & bottom + STBTT_assert(e->ey >= y_top); + + if (e->fdx == 0) { + float x0 = e->fx; + if (x0 < len) { + if (x0 >= 0) { + stbtt__handle_clipped_edge(scanline, (int)x0, e, x0, y_top, x0, y_bottom); + stbtt__handle_clipped_edge(scanline_fill - 1, (int)x0 + 1, e, x0, y_top, x0, y_bottom); + } + else { + stbtt__handle_clipped_edge(scanline_fill - 1, 0, e, x0, y_top, x0, y_bottom); + } + } + } + else { + float x0 = e->fx; + float dx = e->fdx; + float xb = x0 + dx; + float x_top, x_bottom; + float sy0, sy1; + float dy = e->fdy; + STBTT_assert(e->sy <= y_bottom && e->ey >= y_top); + + // compute endpoints of line segment clipped to this scanline (if the + // line segment starts on this scanline. x0 is the intersection of the + // line with y_top, but that may be off the line segment. + if (e->sy > y_top) { + x_top = x0 + dx * (e->sy - y_top); + sy0 = e->sy; + } + else { + x_top = x0; + sy0 = y_top; + } + if (e->ey < y_bottom) { + x_bottom = x0 + dx * (e->ey - y_top); + sy1 = e->ey; + } + else { + x_bottom = xb; + sy1 = y_bottom; + } + + if (x_top >= 0 && x_bottom >= 0 && x_top < len && x_bottom < len) { + // from here on, we don't have to range check x values + + if ((int)x_top == (int)x_bottom) { + float height; + // simple case, only spans one pixel + int x = (int)x_top; + height = sy1 - sy0; + STBTT_assert(x >= 0 && x < len); + scanline[x] += e->direction * (1 - ((x_top - x) + (x_bottom - x)) / 2) * height; + scanline_fill[x] += e->direction * height; // everything right of this pixel is filled + } + else { + int x, x1, x2; + float y_crossing, step, sign, area; + // covers 2+ pixels + if (x_top > x_bottom) { + // flip scanline vertically; signed area is the same + float t; + sy0 = y_bottom - (sy0 - y_top); + sy1 = y_bottom - (sy1 - y_top); + t = sy0, sy0 = sy1, sy1 = t; + t = x_bottom, x_bottom = x_top, x_top = t; + dx = -dx; + dy = -dy; + t = x0, x0 = xb, xb = t; + } + + x1 = (int)x_top; + x2 = (int)x_bottom; + // compute intersection with y axis at x1+1 + y_crossing = (x1 + 1 - x0) * dy + y_top; + + sign = e->direction; + // area of the rectangle covered from y0..y_crossing + area = sign * (y_crossing - sy0); + // area of the triangle (x_top,y0), (x+1,y0), (x+1,y_crossing) + scanline[x1] += area * (1 - ((x_top - x1) + (x1 + 1 - x1)) / 2); + + step = sign * dy; + for (x = x1 + 1; x < x2; ++x) { + scanline[x] += area + step / 2; + area += step; + } + y_crossing += dy * (x2 - (x1 + 1)); + + STBTT_assert(STBTT_fabs(area) <= 1.01f); + + scanline[x2] += area + sign * (1 - ((x2 - x2) + (x_bottom - x2)) / 2) * (sy1 - y_crossing); + + scanline_fill[x2] += sign * (sy1 - sy0); + } + } + else { + // if edge goes outside of box we're drawing, we require + // clipping logic. since this does not match the intended use + // of this library, we use a different, very slow brute + // force implementation + int x; + for (x = 0; x < len; ++x) { + // cases: + // + // there can be up to two intersections with the pixel. any intersection + // with left or right edges can be handled by splitting into two (or three) + // regions. intersections with top & bottom do not necessitate case-wise logic. + // + // the old way of doing this found the intersections with the left & right edges, + // then used some simple logic to produce up to three segments in sorted order + // from top-to-bottom. however, this had a problem: if an x edge was epsilon + // across the x border, then the corresponding y position might not be distinct + // from the other y segment, and it might ignored as an empty segment. to avoid + // that, we need to explicitly produce segments based on x positions. + + // rename variables to clearly-defined pairs + float y0 = y_top; + float x1 = (float)(x); + float x2 = (float)(x + 1); + float x3 = xb; + float y3 = y_bottom; + + // x = e->x + e->dx * (y-y_top) + // (y-y_top) = (x - e->x) / e->dx + // y = (x - e->x) / e->dx + y_top + float y1 = (x - x0) / dx + y_top; + float y2 = (x + 1 - x0) / dx + y_top; + + if (x0 < x1 && x3 > x2) { // three segments descending down-right + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x1, y1); + stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x2, y2); + stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x3, y3); + } + else if (x3 < x1 && x0 > x2) { // three segments descending down-left + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x2, y2); + stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x1, y1); + stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x3, y3); + } + else if (x0 < x1 && x3 > x1) { // two segments across x, down-right + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x1, y1); + stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x3, y3); + } + else if (x3 < x1 && x0 > x1) { // two segments across x, down-left + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x1, y1); + stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x3, y3); + } + else if (x0 < x2 && x3 > x2) { // two segments across x+1, down-right + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x2, y2); + stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x3, y3); + } + else if (x3 < x2 && x0 > x2) { // two segments across x+1, down-left + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x2, y2); + stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x3, y3); + } + else { // one segment + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x3, y3); + } + } + } + } + e = e->next; + } +} + +// directly AA rasterize edges w/o supersampling +static void stbtt__rasterize_sorted_edges(stbtt__bitmap* result, stbtt__edge* e, int n, int vsubsample, int off_x, int off_y, void* userdata) +{ + stbtt__hheap hh = { 0, 0, 0 }; + stbtt__active_edge* active = NULL; + int y, j = 0, i; + float scanline_data[129], * scanline, * scanline2; + + STBTT__NOTUSED(vsubsample); + + if (result->w > 64) + scanline = (float*)STBTT_malloc((result->w * 2 + 1) * sizeof(float), userdata); + else + scanline = scanline_data; + + scanline2 = scanline + result->w; + + y = off_y; + e[n].y0 = (float)(off_y + result->h) + 1; + + while (j < result->h) { + // find center of pixel for this scanline + float scan_y_top = y + 0.0f; + float scan_y_bottom = y + 1.0f; + stbtt__active_edge** step = &active; + + STBTT_memset(scanline, 0, result->w * sizeof(scanline[0])); + STBTT_memset(scanline2, 0, (result->w + 1) * sizeof(scanline[0])); + + // update all active edges; + // remove all active edges that terminate before the top of this scanline + while (*step) { + stbtt__active_edge* z = *step; + if (z->ey <= scan_y_top) { + *step = z->next; // delete from list + STBTT_assert(z->direction); + z->direction = 0; + stbtt__hheap_free(&hh, z); + } + else { + step = &((*step)->next); // advance through list + } + } + + // insert all edges that start before the bottom of this scanline + while (e->y0 <= scan_y_bottom) { + if (e->y0 != e->y1) { + stbtt__active_edge* z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata); + if (z != NULL) { + if (j == 0 && off_y != 0) { + if (z->ey < scan_y_top) { + // this can happen due to subpixel positioning and some kind of fp rounding error i think + z->ey = scan_y_top; + } + } + STBTT_assert(z->ey >= scan_y_top); // if we get really unlucky a tiny bit of an edge can be out of bounds + // insert at front + z->next = active; + active = z; + } + } + ++e; + } + + // now process all active edges + if (active) + stbtt__fill_active_edges_new(scanline, scanline2 + 1, result->w, active, scan_y_top); + + { + float sum = 0; + for (i = 0; i < result->w; ++i) { + float k; + int m; + sum += scanline2[i]; + k = scanline[i] + sum; + k = (float)STBTT_fabs(k) * 255 + 0.5f; + m = (int)k; + if (m > 255) m = 255; + result->pixels[j * result->stride + i] = (unsigned char)m; + } + } + // advance all the edges + step = &active; + while (*step) { + stbtt__active_edge* z = *step; + z->fx += z->fdx; // advance to position for current scanline + step = &((*step)->next); // advance through list + } + + ++y; + ++j; + } + + stbtt__hheap_cleanup(&hh, userdata); + + if (scanline != scanline_data) + STBTT_free(scanline, userdata); +} +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + +#define STBTT__COMPARE(a,b) ((a)->y0 < (b)->y0) + +static void stbtt__sort_edges_ins_sort(stbtt__edge* p, int n) +{ + int i, j; + for (i = 1; i < n; ++i) { + stbtt__edge t = p[i], * a = &t; + j = i; + while (j > 0) { + stbtt__edge* b = &p[j - 1]; + int c = STBTT__COMPARE(a, b); + if (!c) break; + p[j] = p[j - 1]; + --j; + } + if (i != j) + p[j] = t; + } +} + +static void stbtt__sort_edges_quicksort(stbtt__edge* p, int n) +{ + /* threshold for transitioning to insertion sort */ + while (n > 12) { + stbtt__edge t; + int c01, c12, c, m, i, j; + + /* compute median of three */ + m = n >> 1; + c01 = STBTT__COMPARE(&p[0], &p[m]); + c12 = STBTT__COMPARE(&p[m], &p[n - 1]); + /* if 0 >= mid >= end, or 0 < mid < end, then use mid */ + if (c01 != c12) { + /* otherwise, we'll need to swap something else to middle */ + int z; + c = STBTT__COMPARE(&p[0], &p[n - 1]); + /* 0>mid && midn => n; 0 0 */ + /* 0n: 0>n => 0; 0 n */ + z = (c == c12) ? 0 : n - 1; + t = p[z]; + p[z] = p[m]; + p[m] = t; + } + /* now p[m] is the median-of-three */ + /* swap it to the beginning so it won't move around */ + t = p[0]; + p[0] = p[m]; + p[m] = t; + + /* partition loop */ + i = 1; + j = n - 1; + for (;;) { + /* handling of equality is crucial here */ + /* for sentinels & efficiency with duplicates */ + for (;; ++i) { + if (!STBTT__COMPARE(&p[i], &p[0])) break; + } + for (;; --j) { + if (!STBTT__COMPARE(&p[0], &p[j])) break; + } + /* make sure we haven't crossed */ + if (i >= j) break; + t = p[i]; + p[i] = p[j]; + p[j] = t; + + ++i; + --j; + } + /* recurse on smaller side, iterate on larger */ + if (j < (n - i)) { + stbtt__sort_edges_quicksort(p, j); + p = p + i; + n = n - i; + } + else { + stbtt__sort_edges_quicksort(p + i, n - i); + n = j; + } + } +} + +static void stbtt__sort_edges(stbtt__edge* p, int n) +{ + stbtt__sort_edges_quicksort(p, n); + stbtt__sort_edges_ins_sort(p, n); +} + +typedef struct +{ + float x, y; +} stbtt__point; + +static void stbtt__rasterize(stbtt__bitmap* result, stbtt__point* pts, int* wcount, int windings, float scale_x, float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void* userdata) +{ + float y_scale_inv = invert ? -scale_y : scale_y; + stbtt__edge* e; + int n, i, j, k, m; +#if STBTT_RASTERIZER_VERSION == 1 + int vsubsample = result->h < 8 ? 15 : 5; +#elif STBTT_RASTERIZER_VERSION == 2 + int vsubsample = 1; +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + // vsubsample should divide 255 evenly; otherwise we won't reach full opacity + + // now we have to blow out the windings into explicit edge lists + n = 0; + for (i = 0; i < windings; ++i) + n += wcount[i]; + + e = (stbtt__edge*)STBTT_malloc(sizeof(*e) * (n + 1), userdata); // add an extra one as a sentinel + if (e == 0) return; + n = 0; + + m = 0; + for (i = 0; i < windings; ++i) { + stbtt__point* p = pts + m; + m += wcount[i]; + j = wcount[i] - 1; + for (k = 0; k < wcount[i]; j = k++) { + int a = k, b = j; + // skip the edge if horizontal + if (p[j].y == p[k].y) + continue; + // add edge from j to k to the list + e[n].invert = 0; + if (invert ? p[j].y > p[k].y : p[j].y < p[k].y) { + e[n].invert = 1; + a = j, b = k; + } + e[n].x0 = p[a].x * scale_x + shift_x; + e[n].y0 = (p[a].y * y_scale_inv + shift_y) * vsubsample; + e[n].x1 = p[b].x * scale_x + shift_x; + e[n].y1 = (p[b].y * y_scale_inv + shift_y) * vsubsample; + ++n; + } + } + + // now sort the edges by their highest point (should snap to integer, and then by x) + //STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare); + stbtt__sort_edges(e, n); + + // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule + stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata); + + STBTT_free(e, userdata); +} + +static void stbtt__add_point(stbtt__point* points, int n, float x, float y) +{ + if (!points) return; // during first pass, it's unallocated + points[n].x = x; + points[n].y = y; +} + +// tessellate until threshold p is happy... @TODO warped to compensate for non-linear stretching +static int stbtt__tesselate_curve(stbtt__point* points, int* num_points, float x0, float y0, float x1, float y1, float x2, float y2, float objspace_flatness_squared, int n) +{ + // midpoint + float mx = (x0 + 2 * x1 + x2) / 4; + float my = (y0 + 2 * y1 + y2) / 4; + // versus directly drawn line + float dx = (x0 + x2) / 2 - mx; + float dy = (y0 + y2) / 2 - my; + if (n > 16) // 65536 segments on one curve better be enough! + return 1; + if (dx * dx + dy * dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA + stbtt__tesselate_curve(points, num_points, x0, y0, (x0 + x1) / 2.0f, (y0 + y1) / 2.0f, mx, my, objspace_flatness_squared, n + 1); + stbtt__tesselate_curve(points, num_points, mx, my, (x1 + x2) / 2.0f, (y1 + y2) / 2.0f, x2, y2, objspace_flatness_squared, n + 1); + } + else { + stbtt__add_point(points, *num_points, x2, y2); + *num_points = *num_points + 1; + } + return 1; +} + +static void stbtt__tesselate_cubic(stbtt__point* points, int* num_points, float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float objspace_flatness_squared, int n) +{ + // @TODO this "flatness" calculation is just made-up nonsense that seems to work well enough + float dx0 = x1 - x0; + float dy0 = y1 - y0; + float dx1 = x2 - x1; + float dy1 = y2 - y1; + float dx2 = x3 - x2; + float dy2 = y3 - y2; + float dx = x3 - x0; + float dy = y3 - y0; + float longlen = (float)(STBTT_sqrt(dx0 * dx0 + dy0 * dy0) + STBTT_sqrt(dx1 * dx1 + dy1 * dy1) + STBTT_sqrt(dx2 * dx2 + dy2 * dy2)); + float shortlen = (float)STBTT_sqrt(dx * dx + dy * dy); + float flatness_squared = longlen * longlen - shortlen * shortlen; + + if (n > 16) // 65536 segments on one curve better be enough! + return; + + if (flatness_squared > objspace_flatness_squared) { + float x01 = (x0 + x1) / 2; + float y01 = (y0 + y1) / 2; + float x12 = (x1 + x2) / 2; + float y12 = (y1 + y2) / 2; + float x23 = (x2 + x3) / 2; + float y23 = (y2 + y3) / 2; + + float xa = (x01 + x12) / 2; + float ya = (y01 + y12) / 2; + float xb = (x12 + x23) / 2; + float yb = (y12 + y23) / 2; + + float mx = (xa + xb) / 2; + float my = (ya + yb) / 2; + + stbtt__tesselate_cubic(points, num_points, x0, y0, x01, y01, xa, ya, mx, my, objspace_flatness_squared, n + 1); + stbtt__tesselate_cubic(points, num_points, mx, my, xb, yb, x23, y23, x3, y3, objspace_flatness_squared, n + 1); + } + else { + stbtt__add_point(points, *num_points, x3, y3); + *num_points = *num_points + 1; + } +} + +// returns number of contours +static stbtt__point* stbtt_FlattenCurves(stbtt_vertex* vertices, int num_verts, float objspace_flatness, int** contour_lengths, int* num_contours, void* userdata) +{ + stbtt__point* points = 0; + int num_points = 0; + + float objspace_flatness_squared = objspace_flatness * objspace_flatness; + int i, n = 0, start = 0, pass; + + // count how many "moves" there are to get the contour count + for (i = 0; i < num_verts; ++i) + if (vertices[i].type == STBTT_vmove) + ++n; + + *num_contours = n; + if (n == 0) return 0; + + *contour_lengths = (int*)STBTT_malloc(sizeof(**contour_lengths) * n, userdata); + + if (*contour_lengths == 0) { + *num_contours = 0; + return 0; + } + + // make two passes through the points so we don't need to realloc + for (pass = 0; pass < 2; ++pass) { + float x = 0, y = 0; + if (pass == 1) { + points = (stbtt__point*)STBTT_malloc(num_points * sizeof(points[0]), userdata); + if (points == NULL) goto error; + } + num_points = 0; + n = -1; + for (i = 0; i < num_verts; ++i) { + switch (vertices[i].type) { + case STBTT_vmove: + // start the next contour + if (n >= 0) + (*contour_lengths)[n] = num_points - start; + ++n; + start = num_points; + + x = vertices[i].x, y = vertices[i].y; + stbtt__add_point(points, num_points++, x, y); + break; + case STBTT_vline: + x = vertices[i].x, y = vertices[i].y; + stbtt__add_point(points, num_points++, x, y); + break; + case STBTT_vcurve: + stbtt__tesselate_curve(points, &num_points, x, y, + vertices[i].cx, vertices[i].cy, + vertices[i].x, vertices[i].y, + objspace_flatness_squared, 0); + x = vertices[i].x, y = vertices[i].y; + break; + case STBTT_vcubic: + stbtt__tesselate_cubic(points, &num_points, x, y, + vertices[i].cx, vertices[i].cy, + vertices[i].cx1, vertices[i].cy1, + vertices[i].x, vertices[i].y, + objspace_flatness_squared, 0); + x = vertices[i].x, y = vertices[i].y; + break; + } + } + (*contour_lengths)[n] = num_points - start; + } + + return points; +error: + STBTT_free(points, userdata); + STBTT_free(*contour_lengths, userdata); + *contour_lengths = 0; + *num_contours = 0; + return NULL; +} + +STBTT_DEF void stbtt_Rasterize(stbtt__bitmap* result, float flatness_in_pixels, stbtt_vertex* vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void* userdata) +{ + float scale = scale_x > scale_y ? scale_y : scale_x; + int winding_count = 0; + int* winding_lengths = NULL; + stbtt__point* windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, &winding_count, userdata); + if (windings) { + stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, invert, userdata); + STBTT_free(winding_lengths, userdata); + STBTT_free(windings, userdata); + } +} + +STBTT_DEF void stbtt_FreeBitmap(unsigned char* bitmap, void* userdata) +{ + STBTT_free(bitmap, userdata); +} + +STBTT_DEF unsigned char* stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo* info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int* width, int* height, int* xoff, int* yoff) +{ + int ix0, iy0, ix1, iy1; + stbtt__bitmap gbm; + stbtt_vertex* vertices; + int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); + + if (scale_x == 0) scale_x = scale_y; + if (scale_y == 0) { + if (scale_x == 0) { + STBTT_free(vertices, info->userdata); + return NULL; + } + scale_y = scale_x; + } + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0, &iy0, &ix1, &iy1); + + // now we get the size + gbm.w = (ix1 - ix0); + gbm.h = (iy1 - iy0); + gbm.pixels = NULL; // in case we error + + if (width) *width = gbm.w; + if (height) *height = gbm.h; + if (xoff) *xoff = ix0; + if (yoff) *yoff = iy0; + + if (gbm.w && gbm.h) { + gbm.pixels = (unsigned char*)STBTT_malloc(gbm.w * gbm.h, info->userdata); + if (gbm.pixels) { + gbm.stride = gbm.w; + + stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); + } + } + STBTT_free(vertices, info->userdata); + return gbm.pixels; +} + +STBTT_DEF unsigned char* stbtt_GetGlyphBitmap(const stbtt_fontinfo* info, float scale_x, float scale_y, int glyph, int* width, int* height, int* xoff, int* yoff) +{ + return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo* info, unsigned char* output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph) +{ + int ix0, iy0; + stbtt_vertex* vertices; + int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); + stbtt__bitmap gbm; + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0, &iy0, 0, 0); + gbm.pixels = output; + gbm.w = out_w; + gbm.h = out_h; + gbm.stride = out_stride; + + if (gbm.w && gbm.h) + stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); + + STBTT_free(vertices, info->userdata); +} + +STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo* info, unsigned char* output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph) +{ + stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f, 0.0f, glyph); +} + +STBTT_DEF unsigned char* stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo* info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int* width, int* height, int* xoff, int* yoff) +{ + return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info, codepoint), width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo* info, unsigned char* output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float* sub_x, float* sub_y, int codepoint) +{ + stbtt_MakeGlyphBitmapSubpixelPrefilter(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, oversample_x, oversample_y, sub_x, sub_y, stbtt_FindGlyphIndex(info, codepoint)); +} + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo* info, unsigned char* output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint) +{ + stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info, codepoint)); +} + +STBTT_DEF unsigned char* stbtt_GetCodepointBitmap(const stbtt_fontinfo* info, float scale_x, float scale_y, int codepoint, int* width, int* height, int* xoff, int* yoff) +{ + return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, codepoint, width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo* info, unsigned char* output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint) +{ + stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f, 0.0f, codepoint); +} + +////////////////////////////////////////////////////////////////////////////// +// +// bitmap baking +// +// This is SUPER-CRAPPY packing to keep source code small + +static int stbtt_BakeFontBitmap_internal(unsigned char* data, int offset, // font location (use offset=0 for plain .ttf) + float pixel_height, // height of font in pixels + unsigned char* pixels, int pw, int ph, // bitmap to be filled in + int first_char, int num_chars, // characters to bake + stbtt_bakedchar* chardata) +{ + float scale; + int x, y, bottom_y, i; + stbtt_fontinfo f; + f.userdata = NULL; + if (!stbtt_InitFont(&f, data, offset)) + return -1; + STBTT_memset(pixels, 0, pw * ph); // background of 0 around pixels + x = y = 1; + bottom_y = 1; + + scale = stbtt_ScaleForPixelHeight(&f, pixel_height); + + for (i = 0; i < num_chars; ++i) { + int advance, lsb, x0, y0, x1, y1, gw, gh; + int g = stbtt_FindGlyphIndex(&f, first_char + i); + stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb); + stbtt_GetGlyphBitmapBox(&f, g, scale, scale, &x0, &y0, &x1, &y1); + gw = x1 - x0; + gh = y1 - y0; + if (x + gw + 1 >= pw) + y = bottom_y, x = 1; // advance to next row + if (y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row + return -i; + STBTT_assert(x + gw < pw); + STBTT_assert(y + gh < ph); + stbtt_MakeGlyphBitmap(&f, pixels + x + y * pw, gw, gh, pw, scale, scale, g); + chardata[i].x0 = (stbtt_int16)x; + chardata[i].y0 = (stbtt_int16)y; + chardata[i].x1 = (stbtt_int16)(x + gw); + chardata[i].y1 = (stbtt_int16)(y + gh); + chardata[i].xadvance = scale * advance; + chardata[i].xoff = (float)x0; + chardata[i].yoff = (float)y0; + x = x + gw + 1; + if (y + gh + 1 > bottom_y) + bottom_y = y + gh + 1; + } + return bottom_y; +} + +STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar* chardata, int pw, int ph, int char_index, float* xpos, float* ypos, stbtt_aligned_quad* q, int opengl_fillrule) +{ + float d3d_bias = opengl_fillrule ? 0 : -0.5f; + float ipw = 1.0f / pw, iph = 1.0f / ph; + const stbtt_bakedchar* b = chardata + char_index; + int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5f); + int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5f); + + q->x0 = round_x + d3d_bias; + q->y0 = round_y + d3d_bias; + q->x1 = round_x + b->x1 - b->x0 + d3d_bias; + q->y1 = round_y + b->y1 - b->y0 + d3d_bias; + + q->s0 = b->x0 * ipw; + q->t0 = b->y0 * iph; + q->s1 = b->x1 * ipw; + q->t1 = b->y1 * iph; + + *xpos += b->xadvance; +} + +////////////////////////////////////////////////////////////////////////////// +// +// rectangle packing replacement routines if you don't have stb_rect_pack.h +// + +#ifndef STB_RECT_PACK_VERSION + +typedef int stbrp_coord; + +//////////////////////////////////////////////////////////////////////////////////// +// // +// // +// COMPILER WARNING ?!?!? // +// // +// // +// if you get a compile warning due to these symbols being defined more than // +// once, move #include "stb_rect_pack.h" before #include "stb_truetype.h" // +// // +//////////////////////////////////////////////////////////////////////////////////// + +typedef struct +{ + int width, height; + int x, y, bottom_y; +} stbrp_context; + +typedef struct +{ + unsigned char x; +} stbrp_node; + +struct stbrp_rect +{ + stbrp_coord x, y; + int id, w, h, was_packed; +}; + +static void stbrp_init_target(stbrp_context* con, int pw, int ph, stbrp_node* nodes, int num_nodes) +{ + con->width = pw; + con->height = ph; + con->x = 0; + con->y = 0; + con->bottom_y = 0; + STBTT__NOTUSED(nodes); + STBTT__NOTUSED(num_nodes); +} + +static void stbrp_pack_rects(stbrp_context* con, stbrp_rect* rects, int num_rects) +{ + int i; + for (i = 0; i < num_rects; ++i) { + if (con->x + rects[i].w > con->width) { + con->x = 0; + con->y = con->bottom_y; + } + if (con->y + rects[i].h > con->height) + break; + rects[i].x = con->x; + rects[i].y = con->y; + rects[i].was_packed = 1; + con->x += rects[i].w; + if (con->y + rects[i].h > con->bottom_y) + con->bottom_y = con->y + rects[i].h; + } + for (; i < num_rects; ++i) + rects[i].was_packed = 0; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// bitmap baking +// +// This is SUPER-AWESOME (tm Ryan Gordon) packing using stb_rect_pack.h. If +// stb_rect_pack.h isn't available, it uses the BakeFontBitmap strategy. + +STBTT_DEF int stbtt_PackBegin(stbtt_pack_context* spc, unsigned char* pixels, int pw, int ph, int stride_in_bytes, int padding, void* alloc_context) +{ + stbrp_context* context = (stbrp_context*)STBTT_malloc(sizeof(*context), alloc_context); + int num_nodes = pw - padding; + stbrp_node* nodes = (stbrp_node*)STBTT_malloc(sizeof(*nodes) * num_nodes, alloc_context); + + if (context == NULL || nodes == NULL) { + if (context != NULL) STBTT_free(context, alloc_context); + if (nodes != NULL) STBTT_free(nodes, alloc_context); + return 0; + } + + spc->user_allocator_context = alloc_context; + spc->width = pw; + spc->height = ph; + spc->pixels = pixels; + spc->pack_info = context; + spc->nodes = nodes; + spc->padding = padding; + spc->stride_in_bytes = stride_in_bytes != 0 ? stride_in_bytes : pw; + spc->h_oversample = 1; + spc->v_oversample = 1; + spc->skip_missing = 0; + + stbrp_init_target(context, pw - padding, ph - padding, nodes, num_nodes); + + if (pixels) + STBTT_memset(pixels, 0, pw * ph); // background of 0 around pixels + + return 1; +} + +STBTT_DEF void stbtt_PackEnd(stbtt_pack_context* spc) +{ + STBTT_free(spc->nodes, spc->user_allocator_context); + STBTT_free(spc->pack_info, spc->user_allocator_context); +} + +STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context* spc, unsigned int h_oversample, unsigned int v_oversample) +{ + STBTT_assert(h_oversample <= STBTT_MAX_OVERSAMPLE); + STBTT_assert(v_oversample <= STBTT_MAX_OVERSAMPLE); + if (h_oversample <= STBTT_MAX_OVERSAMPLE) + spc->h_oversample = h_oversample; + if (v_oversample <= STBTT_MAX_OVERSAMPLE) + spc->v_oversample = v_oversample; +} + +STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context* spc, int skip) +{ + spc->skip_missing = skip; +} + +#define STBTT__OVER_MASK (STBTT_MAX_OVERSAMPLE-1) + +static void stbtt__h_prefilter(unsigned char* pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) +{ + unsigned char buffer[STBTT_MAX_OVERSAMPLE]; + int safe_w = w - kernel_width; + int j; + STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze + for (j = 0; j < h; ++j) { + int i; + unsigned int total; + STBTT_memset(buffer, 0, kernel_width); + + total = 0; + + // make kernel_width a constant in common cases so compiler can optimize out the divide + switch (kernel_width) { + case 2: + for (i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / 2); + } + break; + case 3: + for (i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / 3); + } + break; + case 4: + for (i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / 4); + } + break; + case 5: + for (i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / 5); + } + break; + default: + for (i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / kernel_width); + } + break; + } + + for (; i < w; ++i) { + STBTT_assert(pixels[i] == 0); + total -= buffer[i & STBTT__OVER_MASK]; + pixels[i] = (unsigned char)(total / kernel_width); + } + + pixels += stride_in_bytes; + } +} + +static void stbtt__v_prefilter(unsigned char* pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) +{ + unsigned char buffer[STBTT_MAX_OVERSAMPLE]; + int safe_h = h - kernel_width; + int j; + STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze + for (j = 0; j < w; ++j) { + int i; + unsigned int total; + STBTT_memset(buffer, 0, kernel_width); + + total = 0; + + // make kernel_width a constant in common cases so compiler can optimize out the divide + switch (kernel_width) { + case 2: + for (i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / 2); + } + break; + case 3: + for (i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / 3); + } + break; + case 4: + for (i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / 4); + } + break; + case 5: + for (i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / 5); + } + break; + default: + for (i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / kernel_width); + } + break; + } + + for (; i < h; ++i) { + STBTT_assert(pixels[i * stride_in_bytes] == 0); + total -= buffer[i & STBTT__OVER_MASK]; + pixels[i * stride_in_bytes] = (unsigned char)(total / kernel_width); + } + + pixels += 1; + } +} + +static float stbtt__oversample_shift(int oversample) +{ + if (!oversample) + return 0.0f; + + // The prefilter is a box filter of width "oversample", + // which shifts phase by (oversample - 1)/2 pixels in + // oversampled space. We want to shift in the opposite + // direction to counter this. + return (float)-(oversample - 1) / (2.0f * (float)oversample); +} + +// rects array must be big enough to accommodate all characters in the given ranges +STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context* spc, const stbtt_fontinfo* info, stbtt_pack_range* ranges, int num_ranges, stbrp_rect* rects) +{ + int i, j, k; + int missing_glyph_added = 0; + + k = 0; + for (i = 0; i < num_ranges; ++i) { + float fh = ranges[i].font_size; + float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); + ranges[i].h_oversample = (unsigned char)spc->h_oversample; + ranges[i].v_oversample = (unsigned char)spc->v_oversample; + for (j = 0; j < ranges[i].num_chars; ++j) { + int x0, y0, x1, y1; + int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; + int glyph = stbtt_FindGlyphIndex(info, codepoint); + if (glyph == 0 && (spc->skip_missing || missing_glyph_added)) { + rects[k].w = rects[k].h = 0; + } + else { + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, + scale * spc->h_oversample, + scale * spc->v_oversample, + 0, 0, + &x0, &y0, &x1, &y1); + rects[k].w = (stbrp_coord)(x1 - x0 + spc->padding + spc->h_oversample - 1); + rects[k].h = (stbrp_coord)(y1 - y0 + spc->padding + spc->v_oversample - 1); + if (glyph == 0) + missing_glyph_added = 1; + } + ++k; + } + } + + return k; +} + +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo* info, unsigned char* output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int prefilter_x, int prefilter_y, float* sub_x, float* sub_y, int glyph) +{ + stbtt_MakeGlyphBitmapSubpixel(info, + output, + out_w - (prefilter_x - 1), + out_h - (prefilter_y - 1), + out_stride, + scale_x, + scale_y, + shift_x, + shift_y, + glyph); + + if (prefilter_x > 1) + stbtt__h_prefilter(output, out_w, out_h, out_stride, prefilter_x); + + if (prefilter_y > 1) + stbtt__v_prefilter(output, out_w, out_h, out_stride, prefilter_y); + + *sub_x = stbtt__oversample_shift(prefilter_x); + *sub_y = stbtt__oversample_shift(prefilter_y); +} + +// rects array must be big enough to accommodate all characters in the given ranges +STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context* spc, const stbtt_fontinfo* info, stbtt_pack_range* ranges, int num_ranges, stbrp_rect* rects) +{ + int i, j, k, missing_glyph = -1, return_value = 1; + + // save current values + int old_h_over = spc->h_oversample; + int old_v_over = spc->v_oversample; + + k = 0; + for (i = 0; i < num_ranges; ++i) { + float fh = ranges[i].font_size; + float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); + float recip_h, recip_v, sub_x, sub_y; + spc->h_oversample = ranges[i].h_oversample; + spc->v_oversample = ranges[i].v_oversample; + recip_h = 1.0f / spc->h_oversample; + recip_v = 1.0f / spc->v_oversample; + sub_x = stbtt__oversample_shift(spc->h_oversample); + sub_y = stbtt__oversample_shift(spc->v_oversample); + for (j = 0; j < ranges[i].num_chars; ++j) { + stbrp_rect* r = &rects[k]; + if (r->was_packed && r->w != 0 && r->h != 0) { + stbtt_packedchar* bc = &ranges[i].chardata_for_range[j]; + int advance, lsb, x0, y0, x1, y1; + int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; + int glyph = stbtt_FindGlyphIndex(info, codepoint); + stbrp_coord pad = (stbrp_coord)spc->padding; + + // pad on left and top + r->x += pad; + r->y += pad; + r->w -= pad; + r->h -= pad; + stbtt_GetGlyphHMetrics(info, glyph, &advance, &lsb); + stbtt_GetGlyphBitmapBox(info, glyph, + scale * spc->h_oversample, + scale * spc->v_oversample, + &x0, &y0, &x1, &y1); + stbtt_MakeGlyphBitmapSubpixel(info, + spc->pixels + r->x + r->y * spc->stride_in_bytes, + r->w - spc->h_oversample + 1, + r->h - spc->v_oversample + 1, + spc->stride_in_bytes, + scale * spc->h_oversample, + scale * spc->v_oversample, + 0, 0, + glyph); + + if (spc->h_oversample > 1) + stbtt__h_prefilter(spc->pixels + r->x + r->y * spc->stride_in_bytes, + r->w, r->h, spc->stride_in_bytes, + spc->h_oversample); + + if (spc->v_oversample > 1) + stbtt__v_prefilter(spc->pixels + r->x + r->y * spc->stride_in_bytes, + r->w, r->h, spc->stride_in_bytes, + spc->v_oversample); + + bc->x0 = (stbtt_int16)r->x; + bc->y0 = (stbtt_int16)r->y; + bc->x1 = (stbtt_int16)(r->x + r->w); + bc->y1 = (stbtt_int16)(r->y + r->h); + bc->xadvance = scale * advance; + bc->xoff = (float)x0 * recip_h + sub_x; + bc->yoff = (float)y0 * recip_v + sub_y; + bc->xoff2 = (x0 + r->w) * recip_h + sub_x; + bc->yoff2 = (y0 + r->h) * recip_v + sub_y; + + if (glyph == 0) + missing_glyph = j; + } + else if (spc->skip_missing) { + return_value = 0; + } + else if (r->was_packed && r->w == 0 && r->h == 0 && missing_glyph >= 0) { + ranges[i].chardata_for_range[j] = ranges[i].chardata_for_range[missing_glyph]; + } + else { + return_value = 0; // if any fail, report failure + } + + ++k; + } + } + + // restore original values + spc->h_oversample = old_h_over; + spc->v_oversample = old_v_over; + + return return_value; +} + +STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context* spc, stbrp_rect* rects, int num_rects) +{ + stbrp_pack_rects((stbrp_context*)spc->pack_info, rects, num_rects); +} + +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context* spc, const unsigned char* fontdata, int font_index, stbtt_pack_range* ranges, int num_ranges) +{ + stbtt_fontinfo info; + int i, j, n, return_value = 1; + //stbrp_context *context = (stbrp_context *) spc->pack_info; + stbrp_rect* rects; + + // flag all characters as NOT packed + for (i = 0; i < num_ranges; ++i) + for (j = 0; j < ranges[i].num_chars; ++j) + ranges[i].chardata_for_range[j].x0 = + ranges[i].chardata_for_range[j].y0 = + ranges[i].chardata_for_range[j].x1 = + ranges[i].chardata_for_range[j].y1 = 0; + + n = 0; + for (i = 0; i < num_ranges; ++i) + n += ranges[i].num_chars; + + rects = (stbrp_rect*)STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context); + if (rects == NULL) + return 0; + + info.userdata = spc->user_allocator_context; + stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, font_index)); + + n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects); + + stbtt_PackFontRangesPackRects(spc, rects, n); + + return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects); + + STBTT_free(rects, spc->user_allocator_context); + return return_value; +} + +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context* spc, const unsigned char* fontdata, int font_index, float font_size, + int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar* chardata_for_range) +{ + stbtt_pack_range range; + range.first_unicode_codepoint_in_range = first_unicode_codepoint_in_range; + range.array_of_unicode_codepoints = NULL; + range.num_chars = num_chars_in_range; + range.chardata_for_range = chardata_for_range; + range.font_size = font_size; + return stbtt_PackFontRanges(spc, fontdata, font_index, &range, 1); +} + +STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char* fontdata, int index, float size, float* ascent, float* descent, float* lineGap) +{ + int i_ascent, i_descent, i_lineGap; + float scale; + stbtt_fontinfo info; + stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, index)); + scale = size > 0 ? stbtt_ScaleForPixelHeight(&info, size) : stbtt_ScaleForMappingEmToPixels(&info, -size); + stbtt_GetFontVMetrics(&info, &i_ascent, &i_descent, &i_lineGap); + *ascent = (float)i_ascent * scale; + *descent = (float)i_descent * scale; + *lineGap = (float)i_lineGap * scale; +} + +STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar* chardata, int pw, int ph, int char_index, float* xpos, float* ypos, stbtt_aligned_quad* q, int align_to_integer) +{ + float ipw = 1.0f / pw, iph = 1.0f / ph; + const stbtt_packedchar* b = chardata + char_index; + + if (align_to_integer) { + float x = (float)STBTT_ifloor((*xpos + b->xoff) + 0.5f); + float y = (float)STBTT_ifloor((*ypos + b->yoff) + 0.5f); + q->x0 = x; + q->y0 = y; + q->x1 = x + b->xoff2 - b->xoff; + q->y1 = y + b->yoff2 - b->yoff; + } + else { + q->x0 = *xpos + b->xoff; + q->y0 = *ypos + b->yoff; + q->x1 = *xpos + b->xoff2; + q->y1 = *ypos + b->yoff2; + } + + q->s0 = b->x0 * ipw; + q->t0 = b->y0 * iph; + q->s1 = b->x1 * ipw; + q->t1 = b->y1 * iph; + + *xpos += b->xadvance; +} + +////////////////////////////////////////////////////////////////////////////// +// +// sdf computation +// + +#define STBTT_min(a,b) ((a) < (b) ? (a) : (b)) +#define STBTT_max(a,b) ((a) < (b) ? (b) : (a)) + +static int stbtt__ray_intersect_bezier(float orig[2], float ray[2], float q0[2], float q1[2], float q2[2], float hits[2][2]) +{ + float q0perp = q0[1] * ray[0] - q0[0] * ray[1]; + float q1perp = q1[1] * ray[0] - q1[0] * ray[1]; + float q2perp = q2[1] * ray[0] - q2[0] * ray[1]; + float roperp = orig[1] * ray[0] - orig[0] * ray[1]; + + float a = q0perp - 2 * q1perp + q2perp; + float b = q1perp - q0perp; + float c = q0perp - roperp; + + float s0 = 0., s1 = 0.; + int num_s = 0; + + if (a != 0.0) { + float discr = b * b - a * c; + if (discr > 0.0) { + float rcpna = -1 / a; + float d = (float)STBTT_sqrt(discr); + s0 = (b + d) * rcpna; + s1 = (b - d) * rcpna; + if (s0 >= 0.0 && s0 <= 1.0) + num_s = 1; + if (d > 0.0 && s1 >= 0.0 && s1 <= 1.0) { + if (num_s == 0) s0 = s1; + ++num_s; + } + } + } + else { + // 2*b*s + c = 0 + // s = -c / (2*b) + s0 = c / (-2 * b); + if (s0 >= 0.0 && s0 <= 1.0) + num_s = 1; + } + + if (num_s == 0) + return 0; + else { + float rcp_len2 = 1 / (ray[0] * ray[0] + ray[1] * ray[1]); + float rayn_x = ray[0] * rcp_len2, rayn_y = ray[1] * rcp_len2; + + float q0d = q0[0] * rayn_x + q0[1] * rayn_y; + float q1d = q1[0] * rayn_x + q1[1] * rayn_y; + float q2d = q2[0] * rayn_x + q2[1] * rayn_y; + float rod = orig[0] * rayn_x + orig[1] * rayn_y; + + float q10d = q1d - q0d; + float q20d = q2d - q0d; + float q0rd = q0d - rod; + + hits[0][0] = q0rd + s0 * (2.0f - 2.0f * s0) * q10d + s0 * s0 * q20d; + hits[0][1] = a * s0 + b; + + if (num_s > 1) { + hits[1][0] = q0rd + s1 * (2.0f - 2.0f * s1) * q10d + s1 * s1 * q20d; + hits[1][1] = a * s1 + b; + return 2; + } + else { + return 1; + } + } +} + +static int equal(float* a, float* b) +{ + return (a[0] == b[0] && a[1] == b[1]); +} + +static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex* verts) +{ + int i; + float orig[2], ray[2] = { 1, 0 }; + float y_frac; + int winding = 0; + + orig[0] = x; + orig[1] = y; + + // make sure y never passes through a vertex of the shape + y_frac = (float)STBTT_fmod(y, 1.0f); + if (y_frac < 0.01f) + y += 0.01f; + else if (y_frac > 0.99f) + y -= 0.01f; + orig[1] = y; + + // test a ray from (-infinity,y) to (x,y) + for (i = 0; i < nverts; ++i) { + if (verts[i].type == STBTT_vline) { + int x0 = (int)verts[i - 1].x, y0 = (int)verts[i - 1].y; + int x1 = (int)verts[i].x, y1 = (int)verts[i].y; + if (y > STBTT_min(y0, y1) && y < STBTT_max(y0, y1) && x > STBTT_min(x0, x1)) { + float x_inter = (y - y0) / (y1 - y0) * (x1 - x0) + x0; + if (x_inter < x) + winding += (y0 < y1) ? 1 : -1; + } + } + if (verts[i].type == STBTT_vcurve) { + int x0 = (int)verts[i - 1].x, y0 = (int)verts[i - 1].y; + int x1 = (int)verts[i].cx, y1 = (int)verts[i].cy; + int x2 = (int)verts[i].x, y2 = (int)verts[i].y; + int ax = STBTT_min(x0, STBTT_min(x1, x2)), ay = STBTT_min(y0, STBTT_min(y1, y2)); + int by = STBTT_max(y0, STBTT_max(y1, y2)); + if (y > ay && y < by && x > ax) { + float q0[2], q1[2], q2[2]; + float hits[2][2]; + q0[0] = (float)x0; + q0[1] = (float)y0; + q1[0] = (float)x1; + q1[1] = (float)y1; + q2[0] = (float)x2; + q2[1] = (float)y2; + if (equal(q0, q1) || equal(q1, q2)) { + x0 = (int)verts[i - 1].x; + y0 = (int)verts[i - 1].y; + x1 = (int)verts[i].x; + y1 = (int)verts[i].y; + if (y > STBTT_min(y0, y1) && y < STBTT_max(y0, y1) && x > STBTT_min(x0, x1)) { + float x_inter = (y - y0) / (y1 - y0) * (x1 - x0) + x0; + if (x_inter < x) + winding += (y0 < y1) ? 1 : -1; + } + } + else { + int num_hits = stbtt__ray_intersect_bezier(orig, ray, q0, q1, q2, hits); + if (num_hits >= 1) + if (hits[0][0] < 0) + winding += (hits[0][1] < 0 ? -1 : 1); + if (num_hits >= 2) + if (hits[1][0] < 0) + winding += (hits[1][1] < 0 ? -1 : 1); + } + } + } + } + return winding; +} + +static float stbtt__cuberoot(float x) +{ + if (x < 0) + return -(float)STBTT_pow(-x, 1.0f / 3.0f); + else + return (float)STBTT_pow(x, 1.0f / 3.0f); +} + +// x^3 + c*x^2 + b*x + a = 0 +static int stbtt__solve_cubic(float a, float b, float c, float* r) +{ + float s = -a / 3; + float p = b - a * a / 3; + float q = a * (2 * a * a - 9 * b) / 27 + c; + float p3 = p * p * p; + float d = q * q + 4 * p3 / 27; + if (d >= 0) { + float z = (float)STBTT_sqrt(d); + float u = (-q + z) / 2; + float v = (-q - z) / 2; + u = stbtt__cuberoot(u); + v = stbtt__cuberoot(v); + r[0] = s + u + v; + return 1; + } + else { + float u = (float)STBTT_sqrt(-p / 3); + float v = (float)STBTT_acos(-STBTT_sqrt(-27 / p3) * q / 2) / 3; // p3 must be negative, since d is negative + float m = (float)STBTT_cos(v); + float n = (float)STBTT_cos(v - 3.141592 / 2) * 1.732050808f; + r[0] = s + u * 2 * m; + r[1] = s - u * (m + n); + r[2] = s - u * (m - n); + + //STBTT_assert( STBTT_fabs(((r[0]+a)*r[0]+b)*r[0]+c) < 0.05f); // these asserts may not be safe at all scales, though they're in bezier t parameter units so maybe? + //STBTT_assert( STBTT_fabs(((r[1]+a)*r[1]+b)*r[1]+c) < 0.05f); + //STBTT_assert( STBTT_fabs(((r[2]+a)*r[2]+b)*r[2]+c) < 0.05f); + return 3; + } +} + +STBTT_DEF unsigned char* stbtt_GetGlyphSDF(const stbtt_fontinfo* info, float scale, int glyph, int padding, unsigned char onedge_value, float pixel_dist_scale, int* width, int* height, int* xoff, int* yoff) +{ + float scale_x = scale, scale_y = scale; + int ix0, iy0, ix1, iy1; + int w, h; + unsigned char* data; + + if (scale == 0) return NULL; + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale, scale, 0.0f, 0.0f, &ix0, &iy0, &ix1, &iy1); + + // if empty, return NULL + if (ix0 == ix1 || iy0 == iy1) + return NULL; + + ix0 -= padding; + iy0 -= padding; + ix1 += padding; + iy1 += padding; + + w = (ix1 - ix0); + h = (iy1 - iy0); + + if (width) *width = w; + if (height) *height = h; + if (xoff) *xoff = ix0; + if (yoff) *yoff = iy0; + + // invert for y-downwards bitmaps + scale_y = -scale_y; + + { + int x, y, i, j; + float* precompute; + stbtt_vertex* verts; + int num_verts = stbtt_GetGlyphShape(info, glyph, &verts); + data = (unsigned char*)STBTT_malloc(w * h, info->userdata); + precompute = (float*)STBTT_malloc(num_verts * sizeof(float), info->userdata); + + for (i = 0, j = num_verts - 1; i < num_verts; j = i++) { + if (verts[i].type == STBTT_vline) { + float x0 = verts[i].x * scale_x, y0 = verts[i].y * scale_y; + float x1 = verts[j].x * scale_x, y1 = verts[j].y * scale_y; + float dist = (float)STBTT_sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)); + precompute[i] = (dist == 0) ? 0.0f : 1.0f / dist; + } + else if (verts[i].type == STBTT_vcurve) { + float x2 = verts[j].x * scale_x, y2 = verts[j].y * scale_y; + float x1 = verts[i].cx * scale_x, y1 = verts[i].cy * scale_y; + float x0 = verts[i].x * scale_x, y0 = verts[i].y * scale_y; + float bx = x0 - 2 * x1 + x2, by = y0 - 2 * y1 + y2; + float len2 = bx * bx + by * by; + if (len2 != 0.0f) + precompute[i] = 1.0f / (bx * bx + by * by); + else + precompute[i] = 0.0f; + } + else + precompute[i] = 0.0f; + } + + for (y = iy0; y < iy1; ++y) { + for (x = ix0; x < ix1; ++x) { + float val; + float min_dist = 999999.0f; + float sx = (float)x + 0.5f; + float sy = (float)y + 0.5f; + float x_gspace = (sx / scale_x); + float y_gspace = (sy / scale_y); + + int winding = stbtt__compute_crossings_x(x_gspace, y_gspace, num_verts, verts); // @OPTIMIZE: this could just be a rasterization, but needs to be line vs. non-tesselated curves so a new path + + for (i = 0; i < num_verts; ++i) { + float x0 = verts[i].x * scale_x, y0 = verts[i].y * scale_y; + + // check against every point here rather than inside line/curve primitives -- @TODO: wrong if multiple 'moves' in a row produce a garbage point, and given culling, probably more efficient to do within line/curve + float dist2 = (x0 - sx) * (x0 - sx) + (y0 - sy) * (y0 - sy); + if (dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + + if (verts[i].type == STBTT_vline) { + float x1 = verts[i - 1].x * scale_x, y1 = verts[i - 1].y * scale_y; + + // coarse culling against bbox + //if (sx > STBTT_min(x0,x1)-min_dist && sx < STBTT_max(x0,x1)+min_dist && + // sy > STBTT_min(y0,y1)-min_dist && sy < STBTT_max(y0,y1)+min_dist) + float dist = (float)STBTT_fabs((x1 - x0) * (y0 - sy) - (y1 - y0) * (x0 - sx)) * precompute[i]; + STBTT_assert(i != 0); + if (dist < min_dist) { + // check position along line + // x' = x0 + t*(x1-x0), y' = y0 + t*(y1-y0) + // minimize (x'-sx)*(x'-sx)+(y'-sy)*(y'-sy) + float dx = x1 - x0, dy = y1 - y0; + float px = x0 - sx, py = y0 - sy; + // minimize (px+t*dx)^2 + (py+t*dy)^2 = px*px + 2*px*dx*t + t^2*dx*dx + py*py + 2*py*dy*t + t^2*dy*dy + // derivative: 2*px*dx + 2*py*dy + (2*dx*dx+2*dy*dy)*t, set to 0 and solve + float t = -(px * dx + py * dy) / (dx * dx + dy * dy); + if (t >= 0.0f && t <= 1.0f) + min_dist = dist; + } + } + else if (verts[i].type == STBTT_vcurve) { + float x2 = verts[i - 1].x * scale_x, y2 = verts[i - 1].y * scale_y; + float x1 = verts[i].cx * scale_x, y1 = verts[i].cy * scale_y; + float box_x0 = STBTT_min(STBTT_min(x0, x1), x2); + float box_y0 = STBTT_min(STBTT_min(y0, y1), y2); + float box_x1 = STBTT_max(STBTT_max(x0, x1), x2); + float box_y1 = STBTT_max(STBTT_max(y0, y1), y2); + // coarse culling against bbox to avoid computing cubic unnecessarily + if (sx > box_x0 - min_dist && sx < box_x1 + min_dist && sy > box_y0 - min_dist && sy < box_y1 + min_dist) { + int num = 0; + float ax = x1 - x0, ay = y1 - y0; + float bx = x0 - 2 * x1 + x2, by = y0 - 2 * y1 + y2; + float mx = x0 - sx, my = y0 - sy; + float res[3], px, py, t, it; + float a_inv = precompute[i]; + if (a_inv == 0.0) { // if a_inv is 0, it's 2nd degree so use quadratic formula + float a = 3 * (ax * bx + ay * by); + float b = 2 * (ax * ax + ay * ay) + (mx * bx + my * by); + float c = mx * ax + my * ay; + if (a == 0.0) { // if a is 0, it's linear + if (b != 0.0) { + res[num++] = -c / b; + } + } + else { + float discriminant = b * b - 4 * a * c; + if (discriminant < 0) + num = 0; + else { + float root = (float)STBTT_sqrt(discriminant); + res[0] = (-b - root) / (2 * a); + res[1] = (-b + root) / (2 * a); + num = 2; // don't bother distinguishing 1-solution case, as code below will still work + } + } + } + else { + float b = 3 * (ax * bx + ay * by) * a_inv; // could precompute this as it doesn't depend on sample point + float c = (2 * (ax * ax + ay * ay) + (mx * bx + my * by)) * a_inv; + float d = (mx * ax + my * ay) * a_inv; + num = stbtt__solve_cubic(b, c, d, res); + } + if (num >= 1 && res[0] >= 0.0f && res[0] <= 1.0f) { + t = res[0], it = 1.0f - t; + px = it * it * x0 + 2 * t * it * x1 + t * t * x2; + py = it * it * y0 + 2 * t * it * y1 + t * t * y2; + dist2 = (px - sx) * (px - sx) + (py - sy) * (py - sy); + if (dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + } + if (num >= 2 && res[1] >= 0.0f && res[1] <= 1.0f) { + t = res[1], it = 1.0f - t; + px = it * it * x0 + 2 * t * it * x1 + t * t * x2; + py = it * it * y0 + 2 * t * it * y1 + t * t * y2; + dist2 = (px - sx) * (px - sx) + (py - sy) * (py - sy); + if (dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + } + if (num >= 3 && res[2] >= 0.0f && res[2] <= 1.0f) { + t = res[2], it = 1.0f - t; + px = it * it * x0 + 2 * t * it * x1 + t * t * x2; + py = it * it * y0 + 2 * t * it * y1 + t * t * y2; + dist2 = (px - sx) * (px - sx) + (py - sy) * (py - sy); + if (dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + } + } + } + } + if (winding == 0) + min_dist = -min_dist; // if outside the shape, value is negative + val = onedge_value + pixel_dist_scale * min_dist; + if (val < 0) + val = 0; + else if (val > 255) + val = 255; + data[(y - iy0) * w + (x - ix0)] = (unsigned char)val; + } + } + STBTT_free(precompute, info->userdata); + STBTT_free(verts, info->userdata); + } + return data; +} + +STBTT_DEF unsigned char* stbtt_GetCodepointSDF(const stbtt_fontinfo* info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int* width, int* height, int* xoff, int* yoff) +{ + return stbtt_GetGlyphSDF(info, scale, stbtt_FindGlyphIndex(info, codepoint), padding, onedge_value, pixel_dist_scale, width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_FreeSDF(unsigned char* bitmap, void* userdata) +{ + STBTT_free(bitmap, userdata); +} + +////////////////////////////////////////////////////////////////////////////// +// +// font name matching -- recommended not to use this +// + +// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string +static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8* s1, stbtt_int32 len1, stbtt_uint8* s2, stbtt_int32 len2) +{ + stbtt_int32 i = 0; + + // convert utf16 to utf8 and compare the results while converting + while (len2) { + stbtt_uint16 ch = s2[0] * 256 + s2[1]; + if (ch < 0x80) { + if (i >= len1) return -1; + if (s1[i++] != ch) return -1; + } + else if (ch < 0x800) { + if (i + 1 >= len1) return -1; + if (s1[i++] != 0xc0 + (ch >> 6)) return -1; + if (s1[i++] != 0x80 + (ch & 0x3f)) return -1; + } + else if (ch >= 0xd800 && ch < 0xdc00) { + stbtt_uint32 c; + stbtt_uint16 ch2 = s2[2] * 256 + s2[3]; + if (i + 3 >= len1) return -1; + c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000; + if (s1[i++] != 0xf0 + (c >> 18)) return -1; + if (s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1; + if (s1[i++] != 0x80 + ((c >> 6) & 0x3f)) return -1; + if (s1[i++] != 0x80 + ((c) & 0x3f)) return -1; + s2 += 2; // plus another 2 below + len2 -= 2; + } + else if (ch >= 0xdc00 && ch < 0xe000) { + return -1; + } + else { + if (i + 2 >= len1) return -1; + if (s1[i++] != 0xe0 + (ch >> 12)) return -1; + if (s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1; + if (s1[i++] != 0x80 + ((ch) & 0x3f)) return -1; + } + s2 += 2; + len2 -= 2; + } + return i; +} + +static int stbtt_CompareUTF8toUTF16_bigendian_internal(char* s1, int len1, char* s2, int len2) +{ + return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8*)s1, len1, (stbtt_uint8*)s2, len2); +} + +// returns results in whatever encoding you request... but note that 2-byte encodings +// will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare +STBTT_DEF const char* stbtt_GetFontNameString(const stbtt_fontinfo* font, int* length, int platformID, int encodingID, int languageID, int nameID) +{ + stbtt_int32 i, count, stringOffset; + stbtt_uint8* fc = font->data; + stbtt_uint32 offset = font->fontstart; + stbtt_uint32 nm = stbtt__find_table(fc, offset, "name"); + if (!nm) return NULL; + + count = ttUSHORT(fc + nm + 2); + stringOffset = nm + ttUSHORT(fc + nm + 4); + for (i = 0; i < count; ++i) { + stbtt_uint32 loc = nm + 6 + 12 * i; + if (platformID == ttUSHORT(fc + loc + 0) && encodingID == ttUSHORT(fc + loc + 2) + && languageID == ttUSHORT(fc + loc + 4) && nameID == ttUSHORT(fc + loc + 6)) { + *length = ttUSHORT(fc + loc + 8); + return (const char*)(fc + stringOffset + ttUSHORT(fc + loc + 10)); + } + } + return NULL; +} + +static int stbtt__matchpair(stbtt_uint8* fc, stbtt_uint32 nm, stbtt_uint8* name, stbtt_int32 nlen, stbtt_int32 target_id, stbtt_int32 next_id) +{ + stbtt_int32 i; + stbtt_int32 count = ttUSHORT(fc + nm + 2); + stbtt_int32 stringOffset = nm + ttUSHORT(fc + nm + 4); + + for (i = 0; i < count; ++i) { + stbtt_uint32 loc = nm + 6 + 12 * i; + stbtt_int32 id = ttUSHORT(fc + loc + 6); + if (id == target_id) { + // find the encoding + stbtt_int32 platform = ttUSHORT(fc + loc + 0), encoding = ttUSHORT(fc + loc + 2), language = ttUSHORT(fc + loc + 4); + + // is this a Unicode encoding? + if (platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) { + stbtt_int32 slen = ttUSHORT(fc + loc + 8); + stbtt_int32 off = ttUSHORT(fc + loc + 10); + + // check if there's a prefix match + stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc + stringOffset + off, slen); + if (matchlen >= 0) { + // check for target_id+1 immediately following, with same encoding & language + if (i + 1 < count && ttUSHORT(fc + loc + 12 + 6) == next_id && ttUSHORT(fc + loc + 12) == platform && ttUSHORT(fc + loc + 12 + 2) == encoding && ttUSHORT(fc + loc + 12 + 4) == language) { + slen = ttUSHORT(fc + loc + 12 + 8); + off = ttUSHORT(fc + loc + 12 + 10); + if (slen == 0) { + if (matchlen == nlen) + return 1; + } + else if (matchlen < nlen && name[matchlen] == ' ') { + ++matchlen; + if (stbtt_CompareUTF8toUTF16_bigendian_internal((char*)(name + matchlen), nlen - matchlen, (char*)(fc + stringOffset + off), slen)) + return 1; + } + } + else { + // if nothing immediately following + if (matchlen == nlen) + return 1; + } + } + } + + // @TODO handle other encodings + } + } + return 0; +} + +static int stbtt__matches(stbtt_uint8* fc, stbtt_uint32 offset, stbtt_uint8* name, stbtt_int32 flags) +{ + stbtt_int32 nlen = (stbtt_int32)STBTT_strlen((char*)name); + stbtt_uint32 nm, hd; + if (!stbtt__isfont(fc + offset)) return 0; + + // check italics/bold/underline flags in macStyle... + if (flags) { + hd = stbtt__find_table(fc, offset, "head"); + if ((ttUSHORT(fc + hd + 44) & 7) != (flags & 7)) return 0; + } + + nm = stbtt__find_table(fc, offset, "name"); + if (!nm) return 0; + + if (flags) { + // if we checked the macStyle flags, then just check the family and ignore the subfamily + if (stbtt__matchpair(fc, nm, name, nlen, 16, -1)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 1, -1)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; + } + else { + if (stbtt__matchpair(fc, nm, name, nlen, 16, 17)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 1, 2)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; + } + + return 0; +} + +static int stbtt_FindMatchingFont_internal(unsigned char* font_collection, char* name_utf8, stbtt_int32 flags) +{ + stbtt_int32 i; + for (i = 0;; ++i) { + stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i); + if (off < 0) return off; + if (stbtt__matches((stbtt_uint8*)font_collection, off, (stbtt_uint8*)name_utf8, flags)) + return off; + } +} + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif + +STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char* data, int offset, + float pixel_height, unsigned char* pixels, int pw, int ph, + int first_char, int num_chars, stbtt_bakedchar* chardata) +{ + return stbtt_BakeFontBitmap_internal((unsigned char*)data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, chardata); +} + +STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char* data, int index) +{ + return stbtt_GetFontOffsetForIndex_internal((unsigned char*)data, index); +} + +STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char* data) +{ + return stbtt_GetNumberOfFonts_internal((unsigned char*)data); +} + +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo* info, const unsigned char* data, int offset) +{ + return stbtt_InitFont_internal(info, (unsigned char*)data, offset); +} + +STBTT_DEF int stbtt_FindMatchingFont(const unsigned char* fontdata, const char* name, int flags) +{ + return stbtt_FindMatchingFont_internal((unsigned char*)fontdata, (char*)name, flags); +} + +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char* s1, int len1, const char* s2, int len2) +{ + return stbtt_CompareUTF8toUTF16_bigendian_internal((char*)s1, len1, (char*)s2, len2); +} + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic pop +#endif + +#endif // STB_TRUETYPE_IMPLEMENTATION + + +// FULL VERSION HISTORY +// +// 1.19 (2018-02-11) OpenType GPOS kerning (horizontal only), STBTT_fmod +// 1.18 (2018-01-29) add missing function +// 1.17 (2017-07-23) make more arguments const; doc fix +// 1.16 (2017-07-12) SDF support +// 1.15 (2017-03-03) make more arguments const +// 1.14 (2017-01-16) num-fonts-in-TTC function +// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts +// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual +// 1.11 (2016-04-02) fix unused-variable warning +// 1.10 (2016-04-02) allow user-defined fabs() replacement +// fix memory leak if fontsize=0.0 +// fix warning from duplicate typedef +// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use alloc userdata for PackFontRanges +// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges +// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; +// allow PackFontRanges to pack and render in separate phases; +// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); +// fixed an assert() bug in the new rasterizer +// replace assert() with STBTT_assert() in new rasterizer +// 1.06 (2015-07-14) performance improvements (~35% faster on x86 and x64 on test machine) +// also more precise AA rasterizer, except if shapes overlap +// remove need for STBTT_sort +// 1.05 (2015-04-15) fix misplaced definitions for STBTT_STATIC +// 1.04 (2015-04-15) typo in example +// 1.03 (2015-04-12) STBTT_STATIC, fix memory leak in new packing, various fixes +// 1.02 (2014-12-10) fix various warnings & compile issues w/ stb_rect_pack, C++ +// 1.01 (2014-12-08) fix subpixel position when oversampling to exactly match +// non-oversampled; STBTT_POINT_SIZE for packed case only +// 1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling +// 0.99 (2014-09-18) fix multiple bugs with subpixel rendering (ryg) +// 0.9 (2014-08-07) support certain mac/iOS fonts without an MS platformID +// 0.8b (2014-07-07) fix a warning +// 0.8 (2014-05-25) fix a few more warnings +// 0.7 (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back +// 0.6c (2012-07-24) improve documentation +// 0.6b (2012-07-20) fix a few more warnings +// 0.6 (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels, +// stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty +// 0.5 (2011-12-09) bugfixes: +// subpixel glyph renderer computed wrong bounding box +// first vertex of shape can be off-curve (FreeSans) +// 0.4b (2011-12-03) fixed an error in the font baking example +// 0.4 (2011-12-01) kerning, subpixel rendering (tor) +// bugfixes for: +// codepoint-to-glyph conversion using table fmt=12 +// codepoint-to-glyph conversion using table fmt=4 +// stbtt_GetBakedQuad with non-square texture (Zer) +// updated Hello World! sample to use kerning and subpixel +// fixed some warnings +// 0.3 (2009-06-24) cmap fmt=12, compound shapes (MM) +// userdata, malloc-from-userdata, non-zero fill (stb) +// 0.2 (2009-03-11) Fix unsigned/signed char warnings +// 0.1 (2009-03-09) First public release +// + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/

DLUpc`IT{>T6kiYTO^3>9$0gArs@ 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%0AdkTnD%19X!UgDjQ; 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