djSi0p3kfC!2mJa=NN~`VYlNTP z#5rmXfHj_Yo=g^b?aKE*T)Y;BUi|T=;D``HRAPL1KtOo#jrd5yuY|z!{+^(1z#h@_ zu>V0y2@4E3_u~~p+>P)^A~7K%DkdT}F^Wuuz*2Zv5+meIH;lDlC8l0JR2n^j6dw^9 z9>-;gctkplLQjroiZZw?aw3VZpnv4z1Fk9@0J?52uZrX2Nklr6mc-9aVG6`TH~<86 znNT1VNwacUXK`Nk;fUQzZ>J-PAxR=JU%=)`1fck_|1zmOEi((IU^lld~*A)?%4{hk{>Ur{`uZbwzkjG~6 zlvVXzBX^!Ye=^le+3oD+W2aI6R$9nfS1&gl&Tsp!{fA%KzVlEpDJ+g%Rdns-0T(x4 z_l;Vy;2W>AaX~#cxx3>$yqr#U)I`Nld2!q9-F `s>%lMiQ}x@~u&aYf!|LnyKI<{nnv9^J`j@)w>f`Ze9$&V?0%|W+zm*+%Abq^y zxH%5&X;A%o#(PHVTB31QI0$Zl>R;*K&=`Ht)ZP~Seh#wCK^(Nhc$3XW9Uih&*VRvV z1MB|1kfTtu?l^cX4uXu(vZ^Z=m~^!q;A7>4I~ywYIXb z#o;{s{r$WgEH?b5@GabMc9t%CKK~_*n &;)r<>sY` zsh8e)FLK{@Uw0=5UtbRoW3878-_*+aP_VE_k^J@X!-tN%;~&;@;Mnf1+kI`!?QmWW zFBQIlsoPf>+3`QVd+6Bl6Yril{`T7kcOTe=_wn}I>~3u0;^}4(ju?Y^Z2L{V;3R(Q zvC}`EeCO@A-#m8Y)o(t b*r7cEHw(>(Duu;4fr>Xd~^BY>D~MG?AZx{vaNpJyIwu= z`l~x!t*mV9R&I26!xX*&&L_uv`z!B7g%E!J`juU~w%~Wc?|moUKYZYoZQBkWwlK0W zTV?O{Qp~iREeV(G_Z|wncIouTo45J8Zr#6c@2dyj*pG9vH8b6`(F$T+HtS8ituzXM ztp|>a-@f_y2iHIN<~46u=M!g7oIQ2u$X+LBXKQmSQ*)zDW+v7fH+eW?3g6D*Sg_-^ zEnB|d^T8V)_O7Sj-u=oar(QqiX=iV1YH4O-YPiYJ$i{RX4!0DP;4)A1_kVKS=Cf~) z%YH9M+{e3Jx9{|E!@F5p+gqDifoHnO$kbx9&l;TjO9j5pchj%Oe6D+Xd3ZYGoZj8% z>hJAhYh`X~ZsTBMZ)9w0vdP5Kdzaf xILwB(ckuk#)yvh=(ZSjlVvDYBHsH!z+TncnxNh3G$=<`k#bwJjA7?jr zH%#5zIXeI3>EY;TYiVhR&2DXCVrF4v?6KK;gW) wmR8mlmc~XF=Ib^%d3*c%ZrkGJ2V86&gqYhnIezVfv$L_VFt@R@ zG&eOex3F?>b+ 7e_nUC;XIxyZ%#1C~j6ei8S(rO{?B2a&$FA+$_wVr8 za`5os{jVL^=HYIyQTMAoT|aYiGBLBav9@u=Ia*oT?>@F~`>XGrI{3=oH{bo_ cL4iV9Qr z&Teksz4_*;v*)f~`xd1|UkZ XPUqE*>sRH0pkXx0BcLGXW9tR61LbmQ_^R-qSfScV~X# z?){0VJ)2!TT|nL2f!zlpa^aAu&-m5~HIN#3eNYHy=aPX?~RCVT1Fs{X^ZaarSg| zbA`RcZ?RgvdZnZ9zAwW{OTRp@)85U;Z3C$LCE9DPoNzeQeFM(Z)7>fIN9VVHP6+je zIb2NsuI^W^Gd8oa!&yXdce`IK$a&Yr%XZ!0)xC{*+z&Qi4yg&Yp6mWn_j+!wS%)v& zdVX1>+qIa8fu+R{nc+7(kDFkzXH40fyOm`PB)VB(8DLQMtF0A9F^7$8Y(Uwwk>%Rv zKYhE?biI{E+v{1|=|S%KrMA}wZI7AvD&$K|@OSxNQ6S{^rlb3huo--+qYK>m?@ded zX#LjHAuLrn*rzhWTh3VM9*ed8-=+;8>-b$Ox%Kxr;PW2VTl#;C ALgGzxH&o%MEMRkY&{~Z968%NJWQNc5a-~GM4fSBTwpZ*c61{gYs?z!7)==}Gt zf4qMFT%Ef9AK^n?#J)oP;-B&9KYGJo2vv94{B3|Pa%dil6#n=2RNV%9`8%>Y$QfAo zfA5Svd8)pF#agkZgPg$X82 *iX{lCP6|JGX# zUFe9eW;F-?huNX>LfwG52Cy8-e+yUtWBx_;ZHz)7wsZd;ef~#p*aP(wJD6Mt+5bN+ z2l_w9L4RH3!vC}!tiPM4Kly*54z`}(Y&GkV{IC6Qf!7WrGXJ;r06nooLkCIu-{yY? z(RkP|U4-$!^?$BDgYm=vPj=%U8?dOpZv~5oA*cVR^*>iDu L7@&=~{=ekwsk#mekN(~?^82rf z=Or1SWU0
i=q6%_mx`T@QYCiIg$?#|AE{=jr?50Q_A~{ekbxzkeJf zI!N^I`|)D&>1(hOy*~-_j{)F=XlrXjc53~^%l(Fxf1zh#W^A-^t-*huQNNGW(p|C) zx%hJTUM#-&W`%``shJrhVhrI_`j4i+$;#b-^A_*jvzp~US3msFzygdvXpq}6{EtN~ zvvTp UEVyHeh~;WeALj&$OsbGF9-bdBwY!K+?_|?e*5SLp^si}MEM8%kM8xh za{xPD)Be$4+uqgD @B9?l2FSj6&=&OGr(b;X@kgiMJF?9dTayW ;wYnOj~@3oU39zS~Q z_`cn*IDj>8VhCj?e{V~yA)sVy<> `o&NOGPtTnB_@fiAZoyd?n{8UN@*k_m z2I_3Gb#QdFx3Ms@u(EZ+d3pOlApzL3MkZ#MiS#c`$6(F64I9m@Y;0_-t*tDvW?^n- zYGm*)ec_|u_fJc2`EsoG$qe?%)Wmqxs{fe$tMgd$>x>sR31%6okqpR8p{9sa3|`B0 z Wb2WoGj59FYgdM z;sgoTm8KE+wSK }6dV57qD z%Y3}{|Cl%Y==mZ+y0uWrtajY9CW zqp7i>Tz27oUs%9O6@tJ7dfvOQH$Qv^! hdnXzs)ZQ=%fU)hXC1qPH<*01-JP8$&*Kqf_@`B4t`|*U>>SR z7w7NZoxgKuW^{N28$UGE(^Owu!T5GRMmHITLJ(fp$9wZn4FvTn82<3#qsPBJdGgz1 zAY9Nx!h+tzhYuE>KYtK-d-?2WALJ4te=vj&E^Du?Da%0L*n%x%C6t<)2H{uv?1>(@ z4JOXBrw{MlfA|>vP5Uv>Vj=V)`atjg-Me#hH*cb|hBG6By*=Gsot<61gF}M@-7rxW z@ADlRd_+KzK)jBRSIi?+z2fQpTX*k2TzCwdO?afWun+cuBF zr*Gc8efR#t!h;7e7xEZ>V7}n{y7z$Gx6!%PH>W4Y$3|erf!?l`rj|CeeN|f<
1@I~>aKKP_X^^5uOk?EPayO0=#64r%>3y+>Ye7K;QRp%Z|O1PzW z_x}B{F^v362fEuD>g(#8(3VxLt<4Q}&27y^89Wi=4Q$$#OwF{0-q&Z }aa5uS09K8XM6j z0|@h%H?%b7rE&$7BN)FiG!w7%PExDy4D=2TPTskT3Chyj!0h*bdjh+I-qXkCotv4S zgnaQdI<;hUV4%ORgV3el3E9oMy4u>Bn(8{VVO4c$QDISCQ+ 6=}FA&H<(@byV z`@wHdn_Kz^hi2{o>)x8XedpobJNF(ux)(IBd*}A88JJaTVgiLf&Z7f;o$X!S-Cf;% z{eA6iO`6%Ot7;%ET2xq&UsPRFCTGUS27dtaLkXJ`0dKH%LfzZgH!uRz-oAy-Exo;P z_ujqx3$STRfT=*_11ELHN2jI gk5QfzeyHZr=h%ox8Pg=l=Y|2e*M`(HU(>+z=*o z$47@o0Ri0PXkY&zh$Z|7Ug-iDtqnCb03kO!E2{v5k)KssRZ%FU!~}ka0dazmBrxJi zpDXGI4NxcuqA)vm3%#xXl55Wnoe+_PE$FnbdyeRs#h z-yYt-`xM0Z&coS>@rj9X>}MF(JOWdV!fYVR1A{{&qqjlZj`sC*G*^}u=I7;AHg}D+ zrlNTUY0~t9^0Le >T}fQ36Z=cezYlgN1B znDz*$-u|Vd<6~pvW5a{!fb;O!_{97e$a+slOJj9uaZzDzR%UuyYTaCEPPSMeP059f zyoeruZ7W8sB-oKayz$O^k6XG&rf*J7PC(Y|@!h*OXBTeYo*KV5j*jXLkAQ0I=|%gN z4vdTr55f;R;09pECT0c)`+GXzfT}Ai!FD`Pu2MmDwnVASlw@b+7UULXvnkOhfMkgp zk}da^sE68n#;2zz(Fuc_P+KuI^KgE4eC+NdI=ppgczB?vy$uxK!05yjP;Yc_aCm$a z)H0keeO-_*YXpQeoR!O$3&kl)g&cme06nx&SI9{G4kO#j1Pzn<_`Uvcp}BK(auOCg zK70T6+|4_WZcmPm-JQlb2}& @8bAn3(ZZDl zxmhV}S*lW*BIhVXXy!6SN_jznf=0fAiDSG5DHA`Ly1#XB9J0n^W0OzkCq_r^&x3s5 znjarS2h4lA+dJAifO5C)-Jid8b7p21N-lsGFv_(w5^C0ih{*HvRH~dbz6OwtEoGsZ z%O#4E;w&YVOxTX?6MzEQ{MhgK!{4gAM<*wShhW1eM#qL9-T`bz=R4aw+S{92Y8&gC z1_ovy-kzHUH82Y&^8kizZ+lBaO;vSGb#+x`mLyG;mzO1$rUFtju8<*8W~A{|`6a3} zIx%>6AU;lm)hAoT>cPt4(TU-KkumIO9=v}Cn0erCdvj-7b6sOaRaImEz`fZSIA&(1 z@2YQ(YLt0LV|^VcfU2s>ipnC9ATu*vCF21knN&)bQN(hkRGOYun4@GR1-%Ar0kA+; zU3|}Us%sku$HxYSN3cU-;MT4Ffxf=^&c^PJrkeV)s`8eeiQ9uy01BNpoVhuHb?RxV zsj4h5D=Du8*({LCm1w4kLL>uNVhNwe;_yWhfl>u&{d7+BwPToSSQ!fv<+PbN`?$1g z04^N>Y5E8HXYcg)b$8Bnwe)p1RM(eQ)V6fb%=QgUPNOsK(_r9Cj1Bd))&VGhRa#b2 zQIub(lx1aRX2=Dp081dFNy!p6o5xhC(6l9mjF79xF<_>U$%pe*-|tk`Z*z4$0HYry z)v<5-ULTz8t#|r{nj5QXORJl^J8q75b@hx*PEW&ufEiP*uuW*WOKEX&Njcnys8lIZ zvNAH#`7(uEDwJ^re42<(Ve#Zx-G7lJ`0A-Y-~o&1`@|J2_O$o*b@lc46Z(utfX_Qx zTEK*?E3K}qZ|!KlIRX;a(K{A2 rr@+?rR<#}?EN|lzD%1KQHSW>2p&SlUcohTNGQbZZ)841B> zeg_5&Y3m=)p1s}D(caPXcyX{7%(3pSj<%-8rl$JV)|$G8rjGgcj=*-^u8!8$MznNA zQ31fp$;wp8Qqf%d(y}6Xnm8SRad~M_S|Vo)B?$}~B|e@C#VUM7nk<77a`rE1ru)b# z&%0XMTRVG(#(RLC-9X9a768`R-ikJ9H;;}GTJ=FMf+f>f1DF+{xgObB8B%d}Zca{i zL2 AFPd7L&_ q1*swKUY#RhH!E0XkVKNgA57Ixi mq8? @Hum~HPT3TA0>+9+&iebxgvNGg~tel*@{QTSuC6`4Lu|T2)G$N0W@(iJPCyCAF zka%&)WHFl~;&MewYQiUf!dt#AfpM>=tgXGN8ExO#ICFovt^vSQmz5S57M7Nm*VNY4 zqYZYAjScm+ %mZ+a0Y41hd-43I zEj>d6Esf1h0IZ^-q^!IQ6Rw=1($cb$lB$|ov~E>>eMKIK8z?D-GF<~OQ^unyRl*bw zo6qJ^D0Ci|12?VM@o<@o$Rs5aX^bQRpF(Fa6KTBHF=6-v;F&nalg|F(p|-}Rx>DG* zvZA8mELCPkR&Gg2DW-xeYY4SVDss|NQWR*4t}-<>BOO)Z %g@8a0;3C$pdyC5FP@_6Im8ztd4Mk9vnkhC3Rd01+6Zs4zc8k(#E;EGj82 zF9B5H5BP9$GzFFWD->|UM#!TG_(C3AF5$5FL^hwF%!_3)m~2)en;per-=NVbL^6#M z#b;5-2`qXvg^clw(@Xr8_#OZ0`s03d#Im!ox)62_thKZhr7{)rZLpCb767p%H%%@N zlr2k1QNpD;K9P&^-KboVfWl!V^Z6VqGoA_X66vhuWCkgYMg?}ECC2ke%-AG;QZyyR z8{?Ok@Yegi{lmq_{a_(>H dzW+_yfH+ ze)xHz4;@+7Q&(10Rsn}h5CBUrD8?vTn3Iv7E)SAz1qyQ+d;vd^FBEg((jO;T$WP{T znIuLOgU( lmouF6^cBm?^sI)9UD?Lr6Qpy6QTjePV9uY1~kr+^!NF{RxbOw*i=5dG&auO3X zG?7h LIqJ+wo!VyhGc|J*WE+49Og?tKwo6O|0iA+Wui^&A0r$v%TG0DkfVr&v6Ih2~n zAji-ck=J8B#?%Q|dIbC`|8IVI*fap%V@*+!DosU@8OUV OujZN@ekQWDXnZk?2Gwk<4VWZ&0bp5tJxG@|wgXA|)|0DIQpZMk53y zyoy=N1iXpg*((p~`uYck>IzgD8Q_|TMFKWUAW@{IqnSuLLHUY8!DUF~auze52D=ZJ zIN2Nuk4t58$ut%lfJZV}jHGxfH6kfKKAB1d5hGKg5@YGKa2ho+Anclkf-hm62$-ww z?CTq7$plMH2}itu!(xf~;#3uyv0sTfD+(5$CzCKKF>ENjr3gi07L&v0!kI>bGn>p| z5;=5gG=)MAOOB+#O;~CYF_{{f9L=JF1Ox@deW0P>OVj-5ZnVF-sSP3rnP7otq-cO~ zgk+XHEh9rASEMUa*ihUn ~kxE4= zt4Tx}B_ckKnV3vZyb=@*$_kttINNmnFLl>e6I%A>rDuTG00aaRgUVqEW$7TgX{mA! zk13LHh|C18K**p;q#_oREflasLNb@fA+cDndP)q9N)9B&(op(ZFd8VdxacSn6QnNW z+Krdz+V8M@KkhCoAhf(&mX@JX(3xPJkwWR9+o&`qg9U}d$+U#z_%NUllSQF1`Ft{) z2)aWe uRSP7wVF 3#FQmHCULFF*{ zAc(*lq-3^;$&typ dljy*tptOwG(s=gGuExmd&ioM01(e6aNdX(~ag z3U0+`NJI>YlrKfO&UAqgj3hp+U70RX$ !!G!s3#2rbsGM zisW*hge#HC z0s(``K$)2b{!t3=MtH~`O+=l61mR7$ejhj!O5*_Yvjq}Zh>RzYi9~D>7j7b;QhlKu zmMaF=8a#Pax(4VXf?bfXF(OK(A{jxsN} &M z5~&gn7pX$2$jmP&DguWCe1V$Ay0X%my7JQE%v1>_B0T6Y%!;h!Xee#wx8=QSSykt+ z6Zx`K;68AClyYeb=7=a2X#~}}jLfXejDorb@Ch608d}=A21n4L4a37zGqW?35c%sZ z%ag`ky>R}sZJJqm8YcJgKXN9#_DXPM0tNJnTm{Di#5d)l)YP=htc>iO+`Rmpyc+QR zz?JRl?e8C*g-|v+uM1)9If!R28z~hLFP{7K089yKDuHHBGe7@5Uloy~f}@itOg?O$ zSSDAdV5owrkVVL|%Z5NL%-G)1)eSLUxbp>Ri2HCm>=uN^272Vg>t~MmV{3F0BcXVG zU;G*3Pd^4kF$F>)DnP)y!?EGi62T>u)U;GZdIn}2S5-qKp}A*#_7;|XfU09~3aZPb zahKlQjO7GPrLeLv{03hi{Pw-4E=0r;$;8Bj_}J*ENc0kV(e~F10Z|l=NTGo0=A44U zg7S(c2%ilNjr3H=K;aR8KDya247NfJTO0+sKS(%k*?08#`(ONo1~^>)?z`{LefQ1R zUws>)6f0AO@nB~OILgAR=BB!0VerLEmwrC87mtlMRbol7IJ}FWAFO2S&fWWuo&4yt zZ+<#|iNel=?W4yNN#syAUzDB3kBj{3<9A=*<`<3;R)vit<1JyFuixfZ!= A zP09ET-op8T=MSn%mEepkWCCS6ok)$1z*4N`2x=OS-{{%+;?9eyiXymuBu$aXGQ>DqN~v9>fv41vbfhM}8tQ%&c6u-wuR7=(I0=+o!< zg_$USnY^X%=FOSe0PNZ7A `j0~u$TTYY&e+yK9}#R z+cOHpDFsb~Gqck}pSuToX?d=Irw~tEbD%=KkWrW+%WoW JN6J c% SYf0p4_~}fsB-hi*LEQxCXgsIWC_>Hknyl1m`^&RT9q~wy}U> z0Ql$NXrViatXW}hdbDw&>g?goR))sLrsmeDjh6N5DP*J8`i+J)eKbeIO&d0DGBku* z0c)#uI@5^Wl8qbvf)81RZqV7daiz{IqH6%pH=;&bhKA@SosH`ZbZ;Tr%MA2UgQY9i zZ8S34V4ypXAbLT|wU;i@eE@av%k-A$XeuLL)&TtbZ^>U30{W;SVjJV3We8gf-}hih z_0YC8G=vHPeM4I=_F5k*1PpDZ9$L1BP$6I#?Xk|?-POh2=attEZiTx99v}+b9ofHy6J*zX%hm^1$&d&I}B!D9z1=C=b}OQm}h&yyM~;;(^#g zm4LosgvVNUoZHs7QC4w%dw1{D?Z?lbV^sprA@~0P?wF4EmC;|ty6Z!gfWB?G#|n2> z&$oU_Ya5w-v>2o|gN*;Phxcwl=zVe+?sgUzWx&xYV#Y+|Ms9Tr_CO4wOhDf@%ww6G z%l6OsHIt8?6V$6;JcFF{{pm@_ZT9tcHP)f^>mc4&SpsfYnnEHK)8aV4Y{vxw-uh4` zpl=)MfycQX3eFt8eGh7h7N0NNo}QSRo`uxl%~?=s1AU|ObImP~80hcnsDu1yahgOd zqKBS+3kNIEhdKe6LC >r1!rJg=WhCpf< zqQ=!#RmG`7AwTKkqu%a8KrAQ~Fbwfn W!5`=K26*`s@q_?grsW+7KP9XN?h5g?PMGd?~tMCe944LfQfQlLqSLM*?$ ztN?=dG3XmU8U&$sz&6lB$IT^j0cr;p#yWZiMyGE=0yc0KnL#JfDFl+D=(x@3a32Jr zAu`<21d%?N4U3az=M}*bpTdIgKs)QNnGVVa^aDLioL@`qSHGBp3{y+jIGoy8J_r&S zptoQ~tx0Ukv2`Ou*pv`MZ>@(k3gm8c^3WV48_imt55_&66c+NsR@g{es39;Uc&u}K zM+W6k584}>n>z-_AyYm9d12kT$*JjS!lc#&q&-(bQg8^%aYA(rRvUws8y4rMr)6Yi zLsl5_7pk0sOh!^r;E%gJfsBS=<=CPg=5C&Gi|S`%wPp299gxNx86BILotm6|Fb%f= z#{u=AvDJ{pg2YpA@7UA~gpDg gSzc5!JOqY;PFyWaCg$Gj|^@7oy`jSpEzhaUbdfszREst!;d4@_AXlCPki` zrT}@8${<7r=9x^uQ>3RRh5mZ^$DJ5cLOlUYzsfaEtsXDQDK2j4g)}v!k@P3WhbHFl zK?%j!I842K7_y0w4ryy|N86UR)`4+Ro?C$Co8{$YDlk(RtYbMCGh#NK#*n3^#9sUA ziw|GNC<7KTwtn2Zzx}3?=NFf>4nj_>r>C!PdUR-f`WD z0Uqkc@}5{V!YojKYHpwh?bgGR5UnjOXtP#hZBVO8V-?&WgfKJY+ThEQU^`P_^$<{j z@8u#;4JgShp)fh%+-D!2-s(<(9RRNc02tu1)xDzJ{F>h0{+>>>Ygx~&q4B|)>Ao&P zr#?`oxe2PM8tba+2(7qgi1Sv~KsK}z%N*usLu5k z^$fI6!?zp&kos*6HRWXxpRR{|ZaqjCK&feHY#M7Wg+zZ&x>Ce}m zfBx?5K0pX!5 +y*Rk)b>qCG`7mJ`99Cf*=*9TX9Tv zc}i(rb3Hf;ZI8#AYin*!fFur0K=DzzWkF$1PDVBW8W^7(f%I}$R~wYBfm2agoRbch z-w9$1dT25!I))T;EgGB#xb+%(At5m#IGoLhkNE!U)0%w(P=M76_q}%>a&l^$8mg+$ zdK{D?)!ZJfs;I1=%*%qLTxz;hDOHvich3#>boF&~bVH?91C$cgRpdiZgdnztFQrQ) zL`Q?*1cqopT_aowj7qo>5JO=`NB{WMX?&mu1QY?OonBGu8YX;)S2e60&f%)^+0jbK z^GxNa^0NU9c;d>^vZ*eto}r^{LfzNa0=?==vXwH>0hl*s#XtiRlj7q-u4*8K{u25_ zaCmfZNL(TdGo>>LGhoHZ%e|UNVuFT9TJ4QE-G@ zRZ+`Gc}oY{=HK4lInV_KSTz-SSQ3Q8!oGxzmmCxl2~JleAruH05)yFj@}=v6!PleW z;u454mrlRC3zI2*s4MVT?s;zD0VTJrrnnTXM9Yl&MoUWya)%2tDhiaM6c%5ap4Zb` z47wq(&9AksrLnG}AQNmMEN=wLh6?G1U;q>!ejT_kI56zz&~w38;EHl=Y|M>l+J#dm z_G+XTvIF`U6CQ|O7#0 >&m`|aW5Df3`j^+NeF~GqKn?a#(=5D#)W2# z=^X?}@2MbqFE-5v >) z=V&w0-P_&OTGxR(Yt~oj3(1D+qPj+1OMmmWiLTUDkyNt>tpKKl)C~Xh@Y(a{E)Wkh z5Pp030z%Noj~&E5%-G(eM~ 7XA-C7XD=dJcL7n`?b}8mxzXR(+t=K?W9Q_K zmKI%4Pj45YX{TC sLilXb9<`C>M#=mY@Ir3|yQ`fBxGg z;^G|2**T7ok@4Px=k^~xbmW;A&YV3 3< zo;bGf&{4o1J#zf{XHOC*EKi;V+OflXw~fKJL28#ltLYyk2Dl?*-Oal0{uWhbZmCkI zYiz7)t}CgmDXJ-~ZEkDV_jELO6{larBPGV-$o%c!@7R6v*!c?=$n$21sh>WM8112b z$6({(!^i)RIB9YA@_CA1a`51;F$}kZm~!<*w|c;-zq?i6O|+>=qAXWYr>Lziu2OEQ zuc<1kD6VblQg?J{Tic5=Vy0~)C0?S{`6s`CDCV& GY;DJ)hiXoafULRCXaZE=O7 ztxMJ3rfTje%!x7d0T2r$8^sxgFTOc; X^VB_*%@MJk9pFBE#>h#fLXb*?q{Pej4NO=FAiSg~D*r>tY2t|Cu9@-&n|BX_G z*waIHpcS^awRd%ETH9K6?YdSqSzTU8D3vNrg;rUtR+rT&$}5S^hNh-ELaQk#NT8-Q zI^y6MDjj`uYp)*Odkzw*Cr=-TYzwxYcTOUb0JYQ6iScpl1tL&K91OsI=14!vue+zG zsj;zjU M6j625pH#t*lg**Hmd+$wpmmm9DnDcBR3>X+&ml zj^gT(6AxcJeE7tPy%;biG2rglwsi>6USeYQcI@o#(;S#RIn>|VO?1&a0XQ(Y6=yrU zs&(B1U406Yl0wKQR7_G^rX`D2WQj^yQlr!oEv+g|xwgEvKI&&ULc$S;XV-iS1%OA7 zA3hGP9^gTDWdiNJZ*X*c0&+O;U)B3PCx`mFsUf$et+NMBW^ibrO{*9fZtGRn5ej8# zSv9IpqiE2SD(dU2RaKP=wN}yAQctL6mDUgeRP&_FBP5RE$n3Ij&Vh4v^6-%Z6XQE5 zMVoE?T|GVhTgJyB6T593fW-belLMWt%`HT;M{8?)cUN0mdwX+BZQoG8URMgpN@ann zp-!zX*N}yE^<~P2s(PimUW2AosaKWOD81DZjAOv#h@-PNetq$=r=L81_~5SXh);}- zj107(IrI&Wk5d7VZR0zLT{E_KkxfLiXG?1vv^dLEq`p omnmRYOe! zsVZ&O)F~>}s)E`Ys`5C~#@UN~Ba^ Vdkm5ECQ|R) z*a&qCZL=CmB?O_ZE+$n~73yj=p(?4*Ew8C1R1iZgQ4uBR6BTu&ri9Sdk_C#U()`+W zhR#O;V!`VZ5&iE=Pd@eZg?$sF FH|H>l^VeN>ZsHG_qn{ zV+&DQS5sG}R#i2s6s0wpHP!WGg}PButg5VTXi!w3VHT40L~Q}7-@I8txytYzC@}Ac z$S==hW%BU8@zL!&z#nOCCEJ#?bZs3SM-;cKqqD0`-`Gg# grmejL<1d>MBYbRBBa?jwonoC~l~)udG!<8AMa5Ev_Xs*_+Cx>T6(2JR>5$IEw|! zBYU=wZW|fwBik0VwzcRxu*@3hB0Fbvz_aqx>04UWm9<(OQQE9k*VZ@b3H0TnMs0ls zu~|u~HC3dtrbt ~BmP?5z7RfD=fP1a@PZKR5kgJ{1* +I`n zX~vQ87M;Gc8 5%=h1|3;}@k6cFs36Ev zpr|bc7+fMkm9MH+*Ow9Mg7pQlRGTz-dnTdFzl5Lq_~Uy +_VPvXZE(Rjakd5Q-^iK*v@=iw5IM z5t@E+9YJKSEB2)vW>S(R4vPO`AH_S}Ka8=XSp#_%b$y*$*V@t5gB40gCw!dN`s&8k zHbreAdQh2K-$; *Hh1 j;~Nj9mfN~@7j717z-)UL%e+T22_nsv46 zMiR?3Wqm_KAsQqMBXw$}PFto>G}n`jwd*$)yQw8u-@xx$9{2d6N$@|9ZSBJ7t|#jo z2 r>R28XQSMR zCNuac+D1iX1=&=tZ_3XoT|t>eE!)t+Hi&~C-`NMp=ja5$S}N=6>uV}A6?v7FaIov@ zo0`?tRfSbWSryqe8XZA4wzt>oYFgU#gTr0=jt;$Eqbfvwky;J9SX*ZYDw@#f$@01i zQd8AT SLikoL~(h3 zULATZ(blGJP^#OS8hZ!YdpkR{?fATwtZVIVt?zE`=|acv(2>|Ot8E|^>elKqm7%qB zKrWE16DK|NP$#0cqxyP;od{)hW?}JK1xeIsDx2Ed8`_k$WVMRSSL<}D)|Q^u2EC%G ziD<`-2t$L&M~k|(y`i~h0IO;+X!^Q)TeKRzrd-hlE`+*Vp};ngkuetXSZk~k`&ED5 zII(+TsHK)vG{SW+FUu{iQB|qQlIHHlu5N8xi>jH>clILcG~9`F8oOHBdb&ydmZ45` zawW_d8yi&jc5U6#)79Of(=|7#$nI?;9o>p5Ej0=nwkEI;m5Engp45Y!)z_*ao3vGm zhN_J 1l5tY#QFRqpPEL z7~}=WDCzXgZ5>0CdnX2)YZ}r-ltmyHU<+imm+GSu2sw@SYx;ZiWRt#vXsE7L>FT;V z+XlA|40pDTKofY^_;7zufA7dhTVFeN0}v1=6wom0?H`{&9J_ZIa)LeG_(oI90Oait z>>uxIYFI;+8)tgoC`}yr>_f%f!#hD|+cJoySI0nGE%cn!-P&GADefMa*tuorfqf%` zEkoP3jP-VdS28l()j!nR(X?~__`b=5$Ik8_9-SN?>w<82_aMj{ hB)_8>x2-e3$;w-u~{!F`OwmdGy@beLY*YU>g8>hdU?WqV9mi6L#OX^&A6%7pjWm z)JuEz?%p-N mS+*vJDuV+dBp( zjv|6`?m*YbuAPT=?A^O eP&QhW z$^gSoJ++alM))Q+ ^2K928|xKv!)`mM1(HRwm8;**BbvLh z92^=WCm16j#Y_xMfReNuyzku<-*)ezL*PSz@3@p&mw-XB3*w8rC>5;zM~)IlOio^Y z;!$i;ogGy*6dFPd9PD7D=p|zJl{L?2lr;ABkM08x^e_l2`}e|61*u>HDel=%kt+6s z2D2Y4@jZKw5c_6BQS0z=;;hB_vzIQNJbL)-6VG7t1d-V$g(^*~lVH;wMJ^P3MAu#} zK$9hgv}#oPgOl!mw*UxFKLc96k(MD>$_W4`N>(G}NQE4`B*_@-ggqJ@?#8uOi0s z(yPxs^W=py2e;s|l?WtjWDITrirQW58nkBoO!CGilEh=U&nw*V)Cz_11n;PmM; z58+J1#V22V{S6$;eD$w5O7!XHpOK#%{fqbt|NV2}htEE8NT0iIb&9(oRd5S9T8XP~ zVBY!lC3V`iuHG%XkDNG6@x%7-!nOm*kQXn3u=~hkFN5g!7S2C?@WF?l;}jzKEpgQZ z2k>wd@7aU>*@;o!NDqN65DU<27Kx=EX(!0avIc!y|2VOO3n|J&2Vn7;bLY>V2gUf2 zOOL+zCP<2Jzw;gfLtlLJ?bYwEes`7l-sl_Ri}{~^cxI?J%3n(5kOO7`>Pft&Giz<3 za%d8J$5;=7tc6AoX2Ahu^~BNBXCM31v(LVWK;N5xd;gzbUBOY=Mc;h$=|8Zwb$XyA zNJ>Q!=^z#$U}r26O5EiMrP^lfY!R9{q_SR-mrktVq@`_a=-j#;)S#V*K<)U`OMm(M z$J9x^&p&+Wq2osm3~vsSi1nxk5DVz7s0X1)BJ&H5T%NpkV@}T6aHwJ7{C8kPPES*J zZ*yhKmf_Kn<4?Yf13OReDlaN3%!&6DQ{Sh9SYXWQlJFsih7>$J-F*UrLL;K0;|eOf zy1Kh-OB)EHsBdKZ#WQ V$afIf`qS@o8KKYY1wa=5L%V|3@}_~~7s?q!Ku@CmRA==4E}g<$yI zN3MRhcXwZF+txjkqlZs#?cLhe3@|!a1@vx-rOPuvyz`&G?wf2>H;?Ze-wPtv;7~9M z6QNzO3XDm_d7C5_ycd5ucIx6pn?}_+w)f1l=Rm?tMT8Q`fK@=JV}3K||MjP1Cw8~P ziP(AsI=>%2eJV$&ral2y0p*>0d^`mzTN|nGKk)h|Uw!@M8x=wfkj7vYNS2CnuY5nW zV_4rcIQiy>Uw!qjuawk#i@++tH_cr4O?}cm3BttbzkTo}Zh5H{km8vl!2<9G5aKZt zWqvSqX<(vz=jGQw`q#g|{3zR5&7a{yy^CEiQ{Ty{FZ;mzdid3kzWCQaUx}sO $4M@t )W43diSf0!pwZ|ITf%OJt;vT*7El$q z_+&ksX0g=V+`_^V@7S1vQ!sDN(xrkjA8Rws(m7^k=H|vTKQ@}TaH)lbxrL=AVL_PB zG+j9BGmr?>3+EY|np;{dT{sJzf;pP`Gw05p1x~?iPz&yoQ$RCfb% hfS07oEt6MX?BIZKB0OzLTTGcSXwD!SnBY{q+x^ z5PbE;r| 9Fg`wOpb)THMf3Swe(>fkZ+`!iddlWMSHAk>@nd^HjvQ1j z6S_FEZ5a%@rMaoKQsKkbii~I!fq>O4nkV2ndX_)?IRg0HD<8i4%+ouv;zQhI0+Gm> z#pb!ViUbgkV6!<65NV* (_@wuSiNwOHW@V zCuEBx`4@HxUE^Y6mPds75xxs#jyATobb3&<5bzXxfTb7B;d6cS&LJ{B|GNuS(ZOMf ztJe{0iFD)DX(>K3*UYb`rjjDa6*Hnj2tQ+Ax!m0mLJ?MuJ_4k`0(F3<6IlxRQHgDj zK~vz$Q$uZOk;&`UuUoek1M1?mwAHKA(ozFOXQrmEX2g;!W{3I8eW{%I_(<)oZ5TFu z9#wi2cYvi4&F1qYxtGW(lPk}U1bIiT$;iyuke;?mlRP6Sg-D&7k`k+W<3qK2`MhvH zgNU#XAz$F*#X~xDHkZl}MH`@LL^Qr!|K_JSiT?bd47poG+J=nGwX4%srD&3gBqDKf z!pfDgF<}uAkr5CN^z|m)m$=E?Jbiq;z1{4rp$W*MDu)Hu0E gMU~?ZstS(JZZ9 zs00nX0g;7sME4t0R}ZE53j`j^Qdh4^S+_1Vg-o59lAKH;ck__D__){@q&OQX2Ky5} zGd$hYvL&vrQmL!Emxl}5kfjw*s6mpT4bVuDH9rBgfgfK^bL0!Xq7qY6l9F@Rrlczp zlT%WX)QPha5?00&amKMLmPNtj;J^TXU(#o`r<+tPAzcZnu|y(s7hBWJ&FM~5sx ;n z13(IlcXcP-z&{hI1r``6L?R)d%i%ck#R8g{$)Y7}p&F$D{}yTU1j*n1Gl|J| C# 74F2hqzwk+?kh#=&%ELw3$y*_v{JEdgVSkSUq{{S*jP8GbTmwx~d zLPJABf`fu0Bg40>bqCwiRV?Ij9XV_VDDPNX #cwawiB=(jG1X5R-S3poiY;;saNN{LW(u%N@_1@l|ZtzZp z0v?w`vgfd9)^rAwur^^@GtmN=5E+6&RH;$q0N4{F{rpV_2YEoCUqFCg=E>I5Z0&`% zWV!Fw93M!k`g+SG5}})ix1Ud7=yGZ{3Xh6ST^ kKhGu7P&$QyQ*;XbdOd*PnW*`TM{P?P=Vr!Xipr72|Kj|NXvGU-Plg+i8blXx> zeZ76$+$2(=1dX?XBy(cp 1&jGE1P}K%@to~w)@aT4bVyVIie_cOu(h+cv|(|qtxZkL z`D&4Y8z3?k`2VD#d&>RfUcUZ>A6xEudc;re6L#7|6eXANL{1p*JVQ=w3=9j2SRUCn zRkS*lh?<)m8{vUAO*$EKoj5caRsBqwEn&Ts$ymx<3S}=VD=5a=GtCz*MHd1RO)c_q zDF4aN$;)5v>Er9~>*M9#yT!}LEBL6tAR$D=6LEQ5v1|U0z#z2jh^VOK(v8U&kCw+T zix4>x=sZqbM|&%Vje~=|4cMiS(PDr{O0&WbYg;=zdmD>|rd+C3fEOTg7MdM>k1oUI zU!Fd4AGBNDu$z~MbRt5Q86$KSLReNL)^xb~1QEezA>omcF)>lm%VOeUqkXtsM@NEd z0p( j4sl>zG0On4}%%l gewP<&fZ=g zLarkh$wU7OwZXJQ3v`0I8&res=vFr9SLT*hjHOl#yvcPC1$hMr@fVmFzz~l?AueW` zRDa_umC4-mJG?NU5we-C5(z0Z76{#WB7v}=5_S>bWXlMtk$`ZV!C{dORQIuAIB)<4 zxiS={t+hFYWx=#$Vku!~$6`4N VGx{p*h_JW+-o z9&WA@LToIOik X%9}E{SAPQo^h( z0)<=b>KEuL5#xd&3`Z=g>De)?9Dv3`D{ `KVyqJPPxu2MogTO{BM#iVG7AdlR N0wa9_Z zbzr% Df51Tma< COWZ~ zhjcL+3Hf{;1pOc-jZ2Wk61)hH1Ym@N8w${x0)tz{b!2fkE;26>!^&c*6~+uJdoIsW zDB`o6?CjhFeZ3t8LZOYxqMzaH1t!LCR5?nqsUdZB ?- zo1!@as?Af4gKlF_*qJ(TxXv6NUo4e-NSIbwdy=R|Xb7@JVkeHHJx3nsBXV>R2pEga zMTV&bp= x7eb&FE_UWjcQ1SB{Mm5% zgpe;_3uS&0UQ+n_7UrPjTX6(J370DtLBP*J aaj5b)WQV gZD8XGrTxJPV90UD=E@UqZA4&4e *c;+tbt4(-p2R{BmjtAw_JPg^NB9^O8dz z9sVf}NMJN)+fw4-aDn0NUE4u%w$oaB+Cb#o4r9Bui_|Y5IFQY-GPgoYv^1w#I*L%N z0)ZXZ#noNriT>>CF7j~oaN`Tvg6mNBObQAUnX6EMgBaAr!M4FT3dMJ9(>QUtxbcO@ z 8Neo`~~@JH+g`+x0g)pCi8GdpFsh#rp=no zn7i=vFhV}dRp7!UoR>IqICeI+KVxBToP`p#)4?cPj2qO54$(;mJ0`=HWzDdnThL4` zE!jdBF=iz nLDmNKVMmz- zbI@rWISzINleG4>V{sig_O=Ww8>X$51?FQb+||IeT1vz2jul@dbn}!zrP2*(@_+zu z46bfc54oFECjAwf_1t-%1`)pV-T6*P--*l7+AVTGUj~vR8>6kYhPl|@5$fxXPR=YS zp*vVv6LieYY!_?VQj5iwmX1=fo2N|T?n;%Pn_pm{hpVf*yQ{a{6~lyD1YZC~nb`rx zPwwmMfdvMWf_d~c+zFshhi%G){NHcA$?Fo(% zTWvqX&W2$6G8i@-HasM*vl9j&Ay4cfwx#1LQOx077miTk>LzuUQ8rO!hl>OPz0gm6 z+~9+Y4Xb X8s` zmQr_DcZ>s`0RcgN*t+n>YS>4D-IXr5HVYQbdk<5-r?-GZ*c;i9%y|sBTNDhzvT$&q zcDrn`b;5Ck4~7nHFAxzzA+CdGIdYlyl7OH<4<1Z$MWNw`Odb&u6cZ5`=p7Um=Hu>z zeJX6$qC-(gCiGc<4sivP*sw$*nQ>M?qSj@w$Vuet>TCl~&lXM@E{o@IoJI2R&;Xf; z#}=cDddk632@Uc0kYG8FItq#k4UCLi9uO859kx8&+t(lWS;3DtGN$}%QZ%1CYu^SG zyhNn7Pq1Y$t?0M`!JGyaSC$KAO{o|IskI{u%P1!yk0%brQYb9K$H(8#+c#M5;q4n1 z6T3Vzz{4F|Jt2|d!J%>S;menWg-6ClM@RX2c*-;)tWAKkK`?hLi$etv*zo(YP@>zS zd2!e@hBZqd;Uiqavw|2b3+=-N>v&l-vh3|25fL4;3_FC8o^rWYaCm57NU*oaJ1k~p z{L0k$<*~8hp^-7Mk;`KIJmnbp3@a`;Y7EoS90nGHLMK4knA>1o4v*Q+(wvS#PsYd1 zRTgwRCj3h$Z~wrMWh<89q7UDo=(G(fF}NfoOzwmF4-5&7h>uTPi;Er8*Ael?5n;=4 z0Yg;WijXKz?BGyQebGwC=r?INO(%4*v$wUhM~~vzVX9>~@Nq=}Hhr9&Y0f-cvdeb& z3x*NPgM0&FLwGWF |R=5=TTYShhSiCN3o VHOI+dbiUOlTB9=vjhWG{ehsGwa&Dos0GBPSAkw|k{lNuhKmA`S# zs??R~>vBP;%_u0YD$U-Ixpr0B>a^qxg}$+&G$S#=gK{OP-2`KeXpPyH4VD~dFHe~Z z97>)uyjA$Mu5L1)*wj_Y32`XrwHdja@;4XcCC4YM%goH$keQK@zI^%Gy!;L8H|MP{ z(rNQcs})r_*l}IAcI}$%>ejx&zK({BmEP1I7!}ZmJ*%C)Ut7qK_yq>|#)e~~NG@>2 zeI~9Re(@{Q(sS~&S0v@+ZY-*;&d*9oSznN!nX!Judi B!NDoo zn4OiCnVC}!%FyWWmd=JX&J+rZ+T_uQRx$UqEp+vZN=;mqm9uGM&W80d7!T!1iBvh& z)n*qI 3XuXx~a1b7iB>iVaHJ2#ta-+G@?=Q zd?4^l_v$@jQ<7FDC8uU& g%%3Qe$Hv2k#N^D} zO?jJ9u7QnOA}>eVKMXB~mfRA3XCDYsNV^?yl(I@!YfEcW_x|oiT*W-JeSF*4@RqGx zw;erw;?Ut8s{9-;YOXP+b~`nqxi<8Ro4vy0i6mA^?xvFBVnVA0@kiIFEYpl_A84p= z9qjM#15>GIaA<@W=0H-VuerIU8DuX_W6uzz4}vGCFzk;>Gi)k5ATZ&Z6>8?bB*R zd;!Dq6>q=LxWwf2lG5txnmVEpcW`MMb$Wg8)}FpCTPfiTgidi{iyUE(jg9p5_Vsik zF51~QvTgegD*U_eJdVj+zIb*^X+iq*97zT9HKJHPJ?N6mXIbLf+7@K4w;N>*ZcKY; zFLX!17KQ=~4r<{a$SmQS%E@t@+1j}uXWXD|b@t-feK-jI=rd0}`Pk!^k1F$v ;`keERQ1J4)4 zn{AL!0tMs9u~SedeE4YyD?{w`Z*RW){wH5u`5J=4-;h_0z9YU__}O!hA5p~kyZXrt zi6W5C(&C;LQ@=g#E3-Bgm6VpZZh>^l_A!*{_Q}16j-8~a0gpWT#A|QA^X_{ee1!9q z|NQ#|)GLXV#BDUWJtM+?Niw2RkyH8maiwPD65TLZ_ge>rzs43W~rE13P69T4LKF z6aj_F(@;Zr`0}GKz5S1OA)fjP^r){)-$O$FX!HZ|&AcmLUEGpm!x1*3>h~DwMe~HK zT37h5%xPBl&&8RA{=u!o#3+4i9EuwUPzet|{p<^`y!JN`3_iQ^-S q1CGY~IlCW&hTQwSO$Jj+& zefq{*@BIrx$zOl-@3)@5eDTysqQHfU0U~@)YZaMNi&c>;HgT}K7w9jUGnbfWKX=X? zGmcD(-4?gim9_P{{ZG6B9n2TUS0$$=MYuT$@O2s$y=V1cdkb+6v5;+JWns2x{=E4n zrgS>|G3TJjh~RvM`t;dd^+i_J_Ky5!sxYb0J!`ATn%Y$5EHX3SKaS`}z_RG54K-E6 zyBZst%D947B#y{EZA4^Aw+O%Ts xTbtkgE zcv9@|6&9VTCKRIwI@-Fm6ci1Cd&E91o&WUBk?*vA0Ww)grLwO3;Lf3*Zhuq-;-`kd zJ%XuCh(^8eACV}`&qFF$S)|+fr!)KaY>h`G4ap#IPop7lVD9|Fj}lp+hfEx_vFG{s zKl|c^bD3~>@CgL&;fXBeKL3-O+|NT2klFILe?n#aoeGS!RN!7MGIMzUYd3$nTSAuV z@1I@0`tA2h>Mbg6k1v`DlBZr31^Q%c-u~97-(LOhyBeNaI31V=>{8n&ru6OsVGYOL z{OsHBzWXE#3vdL(dGif%dy%P2_|&_eLE(ibUj6**Z@+mxhO6Nj8NZG8flUwE(^D<} zY2=AlJ_Q}%h}c=po8e5oM~8Fk6fyPr^4i@{$9ntSH?;WH4CjRi%-f jE z<=5VL^Y!zwj(E!nG5Z;F*aXLfnK$)O+sS8Me)Y8%+htC8i-VB85sl!OI!NCCp|AI$ z=U;m6@G1um)-42YhQlnpIhWupVhR5;by9oa?8Rd>&McBM+mXw&rb6~igma}wrY>|J zKD<-!=b+;lEutd!@K0T`f4b1Qd$MN@hppwzU>PFz)=W &Osf9R 1OVcF&)W{q8UWX8Z18&Hu`b z&*XQM0jF1f^__eA>xT|^kb&U;ez5(+%>HG;A7&u)znf_O5PJFp deg+ixr{(>U9c)ei&Xa$?;io<^{~h?`U-Eh1e#^c+z8mzj?)!7;w)hKQzwh7x z_~y3$(C~wRpPDMTO#%4+p<91%@^|po__&hu!8{+|dS#OJV9 %|9$|LiUBqaPgn)cdzs4(xb<_}|^UD4qN91H_*a-c$i`4-$SV{3iUd z2Z|qiBmRuPJW%}AH{x5}axdw=Xr#-+=yR(%a7f+7jLrv$bEylWx_Yr z|2 js1V#m-iL!ro?48*l%%v*E~1ke}Cf=!0x`UI)0Od zk8Yg*+<)`-egEU78;aj3=)Ob#2H^0G_#wY}`@a8CawER~eTV!FfcK5~qTjrIzyJ8* zrUjVI18x6*y3u^2rFR=x_@9ah^qU)=x%Y9$>E^6P-GGiiALRJ|@!Xs7AK>C+>d?*b zMmYNWz@AmNz;AtE=u;mpz6E~5gTu!u%$py{gTwc_8Qtgs4ggQzIQLFx=Y nE7Bfzuvs<_J836DS+FVZ)CLawFi&^C|=z5NxJ{| z|M9;qx{=Y$L-#!cU|j#sWB0{<&cHi2`CY%wP5S-CzxsQnZ^+4>` 9G+zfZ~D=GI0eX4KP&0x2BrR2V3;K%wqgf}u$-iM{gztV4I z>TO;tyXR|>S46jgy7kL(_jVlmq4RFZaQ3I~VIz3O_tsYa-mA0H?$to>JpMemY v4O7fBTNv?Wd=YeW7c>U@(96P=7EijqhO&s&8xl z$NmQEfoRRN#xtD_{DgkbJ*x+cf8P%OeIF}BsZ;pY);4&ib705`{Wk0F- j>;hY~5HGT`fR>6YeynIjN#9jK!{hWbZE{0wfW0Yes; zR(IM5mN>b%Q09A4=+JnAd>K^(A(6{A-EtECD9IJNgAxG;0wlInr-Pc%wf0Bl!;l+m zh$-Az3!K5=O~VU=LqbC#Wk>1G1qOu1uS!pU>sIDJ8ygk^sT?;~u?sR_XJf-b=AEJW zbN#WNu7W$nX9ArvU*Hb-@R+2uHEY(aUX`9(SXMQ03-~KTY3Xa$tb#COLTq%fn8Sh+ z38i);a6(R|pXmayX53Nvn^D#qieDZQy=p@i&Om449QNiCa&Y+OzW3F!&1=`;S&J;D zrX(lE#RWm~g3{YT2B;GFRa2nfN&B1Scpcv*I4vtDb4}6;O15xyQF+tWqc@oU(?|PC zaF{zMCp$B9!@6`z#dFoF1nR_kkiU;i=)wm0G(Os+we=tDeoXht#RlsQ_OHs#PK^qq z^pewYy9S}|{cVuq%h!+eRc+iz!DnS`*svaYqHEW!Pv2BozByxcQo^zTnbUN=Q&~Vp zn5KW&>+yl<+NUZ&xHdOBl!6bBYU=D88W}$L$ `N*pQvQaZ^6-iY_TB zDJsm*&CXbzS6y9IQJj~V6zb2vj&B%)8Fz%wzGgo%keUa4z=ucFcJ^)^8Gmtl;{EZ< zcV2n?(uH%U4onUYsFccv`Z`4o?ye{+F38K-kd~O3kbpM3I>N_K@H0NuDH%7Do^CFX zncSc8d69WJ@rDensO;#5O!cw1zy8;!|M%BFKl{v6Pdsw|$d0kmQ3}7luC}_Oq;PZ2 zhV-O_)Rh4~p6*hQ=!95*U*5I3hx)-}THT3fHj^{m{HR<=5+M(;62gY@xefZx!C~Ak zbKvmtGq`W;+?i7+cjC1Aa9eF{O;trjX>q}(oUDv>=!j{_D`S^I4>Kk%(g*F20;cAF z{Gi{O^>{-W*ztbOfU{HNrh 9o-Px$8+@fsfpGmvNA4gT~1QO zvY3^t((s`DuU<{zM}&t2$1Rgk@Yg*NhzQ+D_cJmF{&Wr?g5)So*jQLtkeij0voR+( zH#<9bQ-Qi~d~)aH_QsmZlA_Ge(72rJ^cA7hBx#tV;}QbBpfD-*T^{ResC~@G1{aJ$ zzq5t#9Gsw?exQ8;X(ac!^_vTkhy2Z(Hy0EYl$7P? 2O|l}RyP?lO;n$Q99E(~ZyIhC=L$ZhA-NBNF5cQ6{KPL8l4$Tt|UlSlpV8fGjMc zvQbh~-%zi>6=*f(S&+bm2yXo9Olk;Nza}khO {bVtRI7enDXY^%NBsmlPM|=H?m(AB;Yk+0+9mi?wUgQW91~ z1h_j-!$bOzf~V6K-MRBK!;ZSc8`e|iQzC~PN1j;bDfbT!k4ap$HghAC91PE Eg$o-osz0>@*(M+T4uD1bqm%~>pS^YHS8 z41M&9gcPdDW58dPnhFKsq{PJd=s+pteIPMJjrMq;H)CcpANt+bQ@+EWGt4Lr$zRZ+ zYy}B27Rv$u;Er<_q0}7;n2 i6?-BJEaFmiN8TT(eO~BuGc!A)!o$kjYTuh+@6xvG88`GDO{v~ z9sl}I1LUv&fXE_M@M!i{R+e`(;N1xP%ir_N7|>MW-~s%!b=RS8^%I{kpd02I;G5lf zlm7+trr&1Fnmu>kym`hn2)5bZTmZkyh=cufyQ4-tsNUT+(03EWoxLz)-eOCpLCfu0 zQBaw|e};c44M>B(X()RpgMJtN{m$U0KQ&|K%$c)h&zZm2+zMHle&BOckHOV6z+0Iw ixZ56gH+i`B*;(_T002n=`t^qzX=pTaQ{%f>>Ha^kqWY8o literal 0 HcmV?d00001 diff --git a/YACReader/YACReader.pri b/YACReader/YACReader.pri new file mode 100644 index 00000000..f4c3788d --- /dev/null +++ b/YACReader/YACReader.pri @@ -0,0 +1,143 @@ +INCLUDEPATH += $$PWD +DEPENDPATH += $$PWD +INCLUDEPATH += . +INCLUDEPATH += $$PWD/../common \ + $$PWD/../custom_widgets + +win32 { +LIBS += -L$$PWD/../dependencies/poppler/lib -loleaut32 -lole32 + +isEqual(QT_MAJOR_VERSION, 5) { +LIBS += -lpoppler-qt5 +INCLUDEPATH += ../dependencies/poppler/include/qt5 +} +else { +LIBS += -lpoppler-qt4 +INCLUDEPATH += ../dependencies/poppler/include/qt4 +} + +QMAKE_CXXFLAGS_RELEASE += /MP /Ob2 /Oi /Ot /GT /GL +QMAKE_LFLAGS_RELEASE += /LTCG +CONFIG -= embed_manifest_exe +} + +unix:!macx{ + +isEqual(QT_MAJOR_VERSION, 5) { +INCLUDEPATH += /usr/include/poppler/qt5 +LIBS += -L/usr/lib -lpoppler-qt5 +} +else { +INCLUDEPATH += /usr/include/poppler/qt4 +LIBS += -L/usr/lib -lpoppler-qt4 + +} +LIBS += -lGLU +} + +macx{ +#INCLUDEPATH += "/Volumes/Mac OS X Lion/usr/X11/include" +#isEqual(QT_MAJOR_VERSION, 5) { +#INCLUDEPATH += /usr/local/include/poppler/qt5 +#LIBS += -L/usr/local/lib -lpoppler-qt5 +#} +#else { +#INCLUDEPATH += /usr/local/include/poppler/qt4 +#LIBS += -L/usr/local/lib -lpoppler-qt4 +#} + +LIBS += -framework Foundation -framework ApplicationServices + +OBJECTIVE_SOURCES += $$PWD/../common/pdf_comic.mm +HEADERS += $$PWD/../common/pdf_comic.h +CONFIG += objective_c +} + +QT += network opengl +#CONFIG += release +CONFIG -= flat + +isEqual(QT_MAJOR_VERSION, 5) { + QT += multimedia +} else { + QT += phonon +} + +# Input +HEADERS += $$PWD/../common/comic.h \ + $$PWD/configuration.h \ + $$PWD/goto_dialog.h \ + $$PWD/magnifying_glass.h \ + $$PWD/main_window_viewer.h \ + $$PWD/viewer.h \ + $$PWD/goto_flow.h \ + $$PWD/options_dialog.h \ + $$PWD/../common/bookmarks.h \ + $$PWD/bookmarks_dialog.h \ + $$PWD/render.h \ + $$PWD/shortcuts_dialog.h \ + $$PWD/translator.h \ + $$PWD/goto_flow_gl.h \ + $$PWD/goto_flow_widget.h \ + $$PWD/page_label_widget.h \ + $$PWD/goto_flow_toolbar.h \ + $$PWD/goto_flow_decorationbar.h \ + $$PWD/width_slider.h \ + $$PWD/notifications_label_widget.h \ + $$PWD/../common/pictureflow.h \ + $$PWD/../common/custom_widgets.h \ + $$PWD/../common/check_new_version.h \ + $$PWD/../common/qnaturalsorting.h \ + $$PWD/../common/yacreader_flow_gl.h \ + $$PWD/../common/yacreader_global.h \ + $$PWD/../common/onstart_flow_selection_dialog.h \ + $$PWD/../common/comic_db.h \ + $$PWD/../common/folder.h \ + $$PWD/../common/library_item.h \ + $$PWD/yacreader_local_client.h \ + $$PWD/../common/http_worker.h \ + $$PWD/../common/exit_check.h \ + +SOURCES += $$PWD/../common/comic.cpp \ + $$PWD/configuration.cpp \ + $$PWD/goto_dialog.cpp \ + $$PWD/magnifying_glass.cpp \ + $$PWD/main_window_viewer.cpp \ + $$PWD/viewer.cpp \ + $$PWD/goto_flow.cpp \ + $$PWD/options_dialog.cpp \ + $$PWD/../common/bookmarks.cpp \ + $$PWD/bookmarks_dialog.cpp \ + $$PWD/render.cpp \ + $$PWD/shortcuts_dialog.cpp \ + $$PWD/translator.cpp \ + $$PWD/goto_flow_gl.cpp \ + $$PWD/goto_flow_widget.cpp \ + $$PWD/page_label_widget.cpp \ + $$PWD/goto_flow_toolbar.cpp \ + $$PWD/goto_flow_decorationbar.cpp \ + $$PWD/width_slider.cpp \ + $$PWD/notifications_label_widget.cpp \ + $$PWD/../common/pictureflow.cpp \ + $$PWD/../common/custom_widgets.cpp \ + $$PWD/../common/check_new_version.cpp \ + $$PWD/../common/qnaturalsorting.cpp \ + $$PWD/../common/yacreader_flow_gl.cpp \ + $$PWD/../common/onstart_flow_selection_dialog.cpp \ + $$PWD/../common/comic_db.cpp \ + $$PWD/../common/folder.cpp \ + $$PWD/../common/library_item.cpp \ + $$PWD/yacreader_local_client.cpp \ + $$PWD/../common/http_worker.cpp \ + $$PWD/../common/yacreader_global.cpp \ + $$PWD/../common/exit_check.cpp \ + +include($$PWD/../custom_widgets/custom_widgets_yacreader.pri) +include($$PWD/../compressed_archive/wrapper.pri) + +RESOURCES += $$PWD/yacreader_images.qrc \ + $$PWD/yacreader_files.qrc + +win32:RESOURCES += $$PWD/yacreader_images_win.qrc +unix:!macx:RESOURCES += $$PWD/yacreader_images_win.qrc +macx:RESOURCES += $$PWD/yacreader_images_osx.qrc diff --git a/YACReader/YACReader.pro b/YACReader/YACReader.pro new file mode 100644 index 00000000..4ceb6f89 --- /dev/null +++ b/YACReader/YACReader.pro @@ -0,0 +1,106 @@ +# ##################################################################### +# Automatically generated by qmake (2.01a) mi 8. oct 20:54:05 2008 +# ##################################################################### +TEMPLATE = app +TARGET = YACReader +DEPENDPATH += . \ + release + +DEFINES += NOMINMAX + + unix:!macx{ +QMAKE_CXXFLAGS += -std=c++11 +} + +isEqual(QT_MAJOR_VERSION, 5) { + Release:DESTDIR = ../release5 + Debug:DESTDIR = ../debug5 + +} else { + Release:DESTDIR = ../release + Debug:DESTDIR = ../debug +} + +SOURCES += main.cpp +include(YACReader.pri) +include(../QsLog/QsLog.pri) + +RC_FILE = icon.rc + +macx { + ICON = YACReader.icns +} + +TRANSLATIONS = yacreader_es.ts \ + yacreader_fr.ts \ + yacreader_ru.ts \ + yacreader_pt.ts \ + yacreader_nl.ts \ + yacreader_tr.ts \ + yacreader_source.ts + + +win32 { +!exists (../compressed_archive/lib7zip) { + error(You\'ll need 7zip source code to compile YACReader. \ + Please check the compressed_archive folder for further instructions.) +} +} + +unix { +exists (../compressed_archive/libp7zip) { + message(Found p7zip source code...) + system(patch -d ../compressed_archive -N -p0 -i libp7zip.patch) +} else { + error(You\'ll need 7zip source code to compile YACReader. \ + Please check the compressed_archive folder for further instructions.) +} +} + +unix:!macx { +#set install prefix if it's empty +isEmpty(PREFIX) { + PREFIX = /usr +} + +BINDIR = $$PREFIX/bin +LIBDIR = $$PREFIX/lib +DATADIR = $$PREFIX/share + +DEFINES += "LIBDIR=\\\"$$LIBDIR\\\"" "DATADIR=\\\"$$DATADIR\\\"" + +#MAKE INSTALL + +INSTALLS += bin docs icon desktop translation manpage + +bin.path = $$BINDIR +isEmpty(DESTDIR) { + bin.files = YACReader +} else { + bin.files = $$DESTDIR/YACReader +} + +docs.path = $$DATADIR/doc/YACReader + +#rename docs for better packageability +docs.extra = cp ../CHANGELOG.txt ../changelog; cp ../README.txt ../README +docs.files = ../README ../changelog + +icon.path = $$DATADIR/YACReader +icon.files = ../images/icon.png + +desktop.path = $$DATADIR/applications +desktop.extra = desktop-file-edit --set-icon=$$DATADIR/YACReader/icon.png $$PWD/../YACReader.desktop +desktop.files = ../YACReader.desktop + +#TODO: icons should be located at /usr/share/icons and have the same basename as their application + +translation.path = $$DATADIR/YACReader/languages +translation.files = ../release/languages/yacreader_* + +manpage.path = $$DATADIR/man/man1 +manpage.files = ../YACReader.1 + +#remove leftover doc files when 'make clean' is invoked +QMAKE_CLEAN += "../changelog" "../README" +} diff --git a/YACReader/bookmarks_dialog.cpp b/YACReader/bookmarks_dialog.cpp new file mode 100644 index 00000000..07df7222 --- /dev/null +++ b/YACReader/bookmarks_dialog.cpp @@ -0,0 +1,197 @@ +#include "bookmarks_dialog.h" + +#include +#include +#include +#include +#include +#include + +#include "bookmarks.h" + +BookmarksDialog::BookmarksDialog(QWidget * parent) + :QDialog(parent) +{ + setModal(true); + + //animation = new QPropertyAnimation(this,"windowOpacity"); + //animation->setDuration(150); + + QHBoxLayout * layout = new QHBoxLayout(); + + //bookmarks + QGridLayout * bookmarksL = new QGridLayout(); + + pages.push_back(new QLabel(tr("Lastest Page"))); + for(int i=0;i<3;i++) + pages.push_back(new QLabel("-")); + + QString labelsStyle = "QLabel {color:white;}"; + + foreach(QLabel * label,pages) + { + label->setStyleSheet(labelsStyle); + } + + int heightDesktopResolution = QApplication::desktop()->screenGeometry().height(); + int height,width; + height = heightDesktopResolution*0.50; + width = height*0.65; + + coverSize = QSize(width,height); + + for(int i=0;i<4;i++) + { + QLabel * l = new QLabel(); + l->setFixedSize(coverSize); + l->setScaledContents(false); + //l->setPixmap(QPixmap(":/images/notCover.png")); + l->installEventFilter(this); + images.push_back(l); + } + + for(int i=0;i<3;i++) + bookmarksL->addWidget(pages.at(i+1),0,i,Qt::AlignCenter); + + for(int i=0;i<3;i++) + bookmarksL->addWidget(images.at(i+1),1,i,Qt::AlignCenter); + + + //last page + QGridLayout * lp = new QGridLayout(); + lp->addWidget(pages.at(0),0,0,Qt::AlignCenter); + lp->addWidget(images.at(0),1,0,Qt::AlignCenter); + + layout->addLayout(bookmarksL); + QFrame *f = new QFrame( this ); + f->setFrameStyle( QFrame::VLine | QFrame::Sunken ); + layout->addWidget(f); + layout->addLayout(lp); + + QHBoxLayout * buttons = new QHBoxLayout(); + + cancel = new QPushButton(tr("Close")); + cancel->setFlat(true); + connect(cancel,SIGNAL(clicked()),this,SLOT(hide())); + buttons->addStretch(); + buttons->addWidget(cancel); + + cancel->setStyleSheet("QPushButton {border: 1px solid #242424; background: #2e2e2e; color:white; padding: 5px 26px 5px 26px; font-size:12px;font-family:Arial; font-weight:bold;}"); + + QVBoxLayout * l = new QVBoxLayout(); + + l->addWidget(new QLabel(""+tr("Click on any image to go to the bookmark")+""),0,Qt::AlignCenter); + l->addLayout(layout); +#ifdef Q_OS_MAC + l->addLayout(buttons); +#endif + + QPalette Pal(palette()); + // set black background + Pal.setColor(QPalette::Background, QColor("#454545")); + this->setAutoFillBackground(true); + this->setPalette(Pal); + + setLayout(l); +} + +void BookmarksDialog::setBookmarks(const Bookmarks & bm) +{ + lastPage = bm.getLastPage(); + if (lastPage > 0) + { + QPixmap p = QPixmap::fromImage(bm.getLastPagePixmap()); + if(p.isNull()) + { + images.at(0)->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter); + images.at(0)->setText(tr("Loading...")); + } + else + { + images.at(0)->setAlignment(Qt::AlignHCenter|Qt::AlignBottom); + images.at(0)->setPixmap(p.scaled(coverSize,Qt::KeepAspectRatio,Qt::SmoothTransformation)); + } + } + else + { + images.at(0)->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter); + images.at(0)->setPixmap(QPixmap(":/images/notCover.png").scaled(coverSize,Qt::KeepAspectRatio,Qt::SmoothTransformation)); + + } + + QList l = bm.getBookmarkPages(); + int s = l.count(); + for(int i=0;i setText(QString::number(l.at(i)+1)); + QPixmap p = QPixmap::fromImage(bm.getBookmarkPixmap(l.at(i))); + if(p.isNull()) + { + images.at(i+1)->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter); + images.at(i+1)->setText(tr("Loading...")); + } + else + { + images.at(i+1)->setAlignment(Qt::AlignHCenter|Qt::AlignBottom); + images.at(i+1)->setPixmap(p.scaled(coverSize,Qt::KeepAspectRatio,Qt::SmoothTransformation)); + } + } + for(int i=s;i<3;i++) + { + pages.at(i+1)->setText("-"); + images.at(i+1)->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter); + images.at(i+1)->setPixmap(QPixmap(":/images/notCover.png").scaled(coverSize,Qt::KeepAspectRatio,Qt::SmoothTransformation)); + } +} + +bool BookmarksDialog::eventFilter(QObject *obj, QEvent *event) +{ + if(event->type() == QEvent::MouseButtonPress) + { + if (obj == images.at(0)) + { + emit(goToPage(lastPage)); + close(); + event->accept(); + } + for(int i=1;i<=3;i++) + { + if(obj == images.at(i)) + { + bool b; + int page = pages.at(i)->text().toInt(&b)-1; + if(b) + { + emit(goToPage(page)); + close(); + } + event->accept(); + } + } + } + // pass the event on to the parent class + return QDialog::eventFilter(obj, event); +} + +void BookmarksDialog::keyPressEvent(QKeyEvent * event) +{ + if(event->key() == Qt::Key_M) + hide(); +} +/* +void BookmarksDialog::show() +{ + QDialog::show(); + disconnect(animation,SIGNAL(finished()),this,SLOT(close())); + animation->setStartValue(0); + animation->setEndValue(1); + animation->start(); +} + +void BookmarksDialog::hide() +{ + connect(animation,SIGNAL(finished()),this,SLOT(close())); + animation->setStartValue(1); + animation->setEndValue(0); + animation->start(); +}*/ diff --git a/YACReader/bookmarks_dialog.h b/YACReader/bookmarks_dialog.h new file mode 100644 index 00000000..c83a2c7e --- /dev/null +++ b/YACReader/bookmarks_dialog.h @@ -0,0 +1,45 @@ +#ifndef __BOOKMARKS_DIALOG_H +#define __BOOKMARKS_DIALOG_H + +#include+#include +#include +#include +#include +#include +#include + +#include "bookmarks.h" + + class BookmarksDialog : public QDialog + { + Q_OBJECT + + protected: + QList pages; + QList images; + + int lastPage; + + QPushButton * accept; + QPushButton * cancel; + + QSize coverSize; + + bool eventFilter(QObject *obj, QEvent *event); + void keyPressEvent(QKeyEvent * event); + //QPropertyAnimation * animation; + + public: + BookmarksDialog(QWidget * parent = 0); + + public slots: + void setBookmarks(const Bookmarks & bookmarks); + //void show(); + //void hide(); + + signals: + void goToPage(unsigned int page); + }; + +#endif // BOOKMARKS_DIALOG_H diff --git a/YACReader/configuration.cpp b/YACReader/configuration.cpp new file mode 100644 index 00000000..a89aab3d --- /dev/null +++ b/YACReader/configuration.cpp @@ -0,0 +1,162 @@ +#include "configuration.h" + +#include +#include +#include +#include +#include +#include + +#include "yacreader_global.h" + +Configuration::Configuration() +{ + //read configuration + //load("/YACReader.conf"); +} + +/*Configuration::Configuration(const Configuration & conf) +{ + //nothing +}*/ + +void Configuration::load(QSettings * settings) +{ + this->settings = settings; + + //TODO set defaults + if(!settings->contains(PATH)) + settings->setValue(PATH,"."); + if(!settings->contains(GO_TO_FLOW_SIZE)) + settings->setValue(GO_TO_FLOW_SIZE,QSize(126,200)); + if(!settings->contains(MAG_GLASS_SIZE)) + settings->setValue(MAG_GLASS_SIZE,QSize(350,175)); + if(!settings->contains(ZOOM_LEVEL)) + settings->setValue(MAG_GLASS_SIZE,QSize(350,175)); + if(!settings->contains(FIT)) + settings->setValue(FIT,false); + if(!settings->contains(FLOW_TYPE)) + settings->setValue(FLOW_TYPE,0); + if(!settings->contains(FULLSCREEN)) + settings->setValue(FULLSCREEN,false); + if(!settings->contains(FIT_TO_WIDTH_RATIO)) + settings->setValue(FIT_TO_WIDTH_RATIO,1); + if(!settings->contains(Y_WINDOW_SIZE)) + settings->setValue(Y_WINDOW_SIZE,QSize(0,0)); + if(!settings->contains(MAXIMIZED)) + settings->setValue(MAXIMIZED,false); + if(!settings->contains(DOUBLE_PAGE)) + settings->setValue(DOUBLE_PAGE,false); + if(!settings->contains(ADJUST_TO_FULL_SIZE)) + settings->setValue(ADJUST_TO_FULL_SIZE,false); + if(!settings->contains(BACKGROUND_COLOR)) + settings->setValue(BACKGROUND_COLOR,QColor(40,40,40)); + if(!settings->contains(ALWAYS_ON_TOP)) + settings->setValue(ALWAYS_ON_TOP,false); + if(!settings->contains(SHOW_TOOLBARS)) + settings->setValue(SHOW_TOOLBARS, true); +} + +void Configuration::load(const QString & path) +{ + //load default configuration + defaultPath = "."; + magnifyingGlassSize = QSize(350,175); + gotoSlideSize = QSize(126,200); //normal + //gotoSlideSize = QSize(79,125); //small + //gotoSlideSize = QSize(173,275); //big + //gotoSlideSize = QSize(220,350); //huge + zoomLevel = 0.5; + adjustToWidth = true; + flowType = Strip; + fullScreen = false; + fitToWidthRatio = 1; + windowSize = QSize(0,0); + maximized = false; + doublePage = false; + adjustToFullSize = false; + backgroundColor = QColor(40,40,40); + alwaysOnTop = false; + + //load from file + QFile f(YACReader::getSettingsPath()+path); + f.open(QIODevice::ReadOnly); + QTextStream txtS(&f); + QString content = txtS.readAll(); + QStringList lines = content.split('\n'); + QString line,name; + int i=0; + foreach(line,lines) + { + if((i%2)==0) + { + name = line.trimmed(); + } + else + { + if(name==PATH) + defaultPath = line.trimmed(); + else + if(name==MAG_GLASS_SIZE) + { + QStringList values = line.split(','); + magnifyingGlassSize = QSize(values[0].toInt(),values[1].toInt()); + } + else + if(name==ZOOM_LEVEL) + zoomLevel = line.toFloat(); + else + if(name==SLIDE_SIZE) + { + int height = line.toInt(); + gotoSlideSize = QSize(static_cast (height/SLIDE_ASPECT_RATIO),height); + } + else + if(name==FIT) + adjustToWidth = line.toInt(); + else + if(name==FLOW_TYPE) + flowType = (FlowType)line.toInt(); + else + if(name==FULLSCREEN) + fullScreen = line.toInt(); + else + if(name==FIT_TO_WIDTH_RATIO) + fitToWidthRatio = line.toFloat(); + else + if(name==Y_WINDOW_POS) + { + QStringList l = line.split(','); + windowPos = QPoint(l[0].toInt(),l[1].toInt()); + } + else + if(name==Y_WINDOW_SIZE) + { + QStringList l = line.split(','); + windowSize = QSize(l[0].toInt(),l[1].toInt()); + } + else + if(name==MAXIMIZED) + maximized = line.toInt(); + else + if(name==DOUBLE_PAGE) + doublePage = line.toInt(); + else + if(name==ADJUST_TO_FULL_SIZE) + adjustToFullSize = line.toInt(); + else + if(name==BACKGROUND_COLOR) + { + QStringList l = line.split(','); + backgroundColor = QColor(l[0].toInt(),l[1].toInt(),l[2].toInt()); + } + else + if(name==ALWAYS_ON_TOP) + alwaysOnTop = line.toInt(); + + + + } + i++; + } +} diff --git a/YACReader/configuration.h b/YACReader/configuration.h new file mode 100644 index 00000000..7ef6b7ff --- /dev/null +++ b/YACReader/configuration.h @@ -0,0 +1,94 @@ +#ifndef __CONFIGURATION_H +#define __CONFIGURATION_H +#include +#include +#include +#include +#include +#include +#include + +#include "yacreader_global.h" + +#define CONF_FILE_PATH "." +#define SLIDE_ASPECT_RATIO 1.585 + +using namespace YACReader; + + class Configuration : public QObject + { + Q_OBJECT + + private: + QSettings * settings; + + QString defaultPath; + //configuration properties + QSize magnifyingGlassSize; + QSize gotoSlideSize; + float zoomLevel; + bool adjustToWidth; + bool fullScreen; + FlowType flowType; + float fitToWidthRatio; + QPoint windowPos; + QSize windowSize; + bool maximized; + bool doublePage; + bool alwaysOnTop; + bool adjustToFullSize; + QColor backgroundColor; + + Configuration(); + //Configuration(const Configuration & conf); + void load(const QString & path = CONF_FILE_PATH); + + + public: + static Configuration & getConfiguration() + { + static Configuration configuration; + return configuration; + }; + void load(QSettings * settings); + QString getDefaultPath() { return settings->value(PATH).toString(); } + void setDefaultPath(QString defaultPath){settings->setValue(PATH,defaultPath);} + QSize getMagnifyingGlassSize() { return settings->value(MAG_GLASS_SIZE).toSize();} + void setMagnifyingGlassSize(const QSize & mgs) { settings->setValue(MAG_GLASS_SIZE,mgs);} + QSize getGotoSlideSize() { return settings->value(GO_TO_FLOW_SIZE).toSize();} + void setGotoSlideSize(const QSize & gss) { settings->setValue(GO_TO_FLOW_SIZE,gss);} + float getZoomLevel() { return settings->value(ZOOM_LEVEL).toFloat();} + void setZoomLevel(float zl) { settings->setValue(ZOOM_LEVEL,zl);} + bool getAdjustToWidth() {return settings->value(FIT).toBool();} + void setAdjustToWidth(bool atw=true) {settings->setValue(FIT,atw);} + FlowType getFlowType(){return (FlowType)settings->value(FLOW_TYPE_SW).toInt();} + void setFlowType(FlowType type){settings->setValue(FLOW_TYPE_SW,type);} + bool getFullScreen(){return settings->value(FULLSCREEN).toBool();} + void setFullScreen(bool f){settings->setValue(FULLSCREEN,f);} + float getFitToWidthRatio(){return settings->value(FIT_TO_WIDTH_RATIO).toFloat();} + void setFitToWidthRatio(float r){settings->setValue(FIT_TO_WIDTH_RATIO,r);} + QPoint getPos(){return settings->value(Y_WINDOW_POS).toPoint();} + void setPos(QPoint p){settings->setValue(Y_WINDOW_POS,p);} + QSize getSize(){return settings->value(Y_WINDOW_SIZE).toSize();} + void setSize(QSize s){settings->setValue(Y_WINDOW_SIZE,s);} + bool getMaximized(){return settings->value(MAXIMIZED).toBool();} + void setMaximized(bool b){settings->setValue(MAXIMIZED,b);} + bool getDoublePage(){return settings->value(DOUBLE_PAGE).toBool();} + void setDoublePage(bool b){settings->setValue(DOUBLE_PAGE,b);} + bool getAdjustToFullSize(){return settings->value(ADJUST_TO_FULL_SIZE).toBool();} + void setAdjustToFullSize(bool b){settings->setValue(ADJUST_TO_FULL_SIZE,b);} + QColor getBackgroundColor(){return settings->value(BACKGROUND_COLOR).value ();} + void setBackgroundColor(const QColor& color){settings->value(BACKGROUND_COLOR,color);} + bool getAlwaysOnTop(){return settings->value(ALWAYS_ON_TOP).toBool();} + void setAlwaysOnTop(bool b){ settings->setValue(ALWAYS_ON_TOP,b);} + bool getShowToolbars(){return settings->value(SHOW_TOOLBARS).toBool();} + void setShowToolbars(bool b){settings->setValue(SHOW_TOOLBARS,b);} + bool getShowInformation(){return settings->value(SHOW_INFO,false).toBool();} + void setShowInformation(bool b){settings->setValue(SHOW_INFO,b);} + QDate getLastVersionCheck(){return settings->value(LAST_VERSION_CHECK).toDate();} + void setLastVersionCheck(const QDate & date){ settings->setValue(LAST_VERSION_CHECK,date);} + int getNumDaysBetweenVersionChecks() {return settings->value(NUM_DAYS_BETWEEN_VERSION_CHECKS,1).toInt();} + void setNumDaysBetweenVersionChecks(int days) {return settings->setValue(NUM_DAYS_BETWEEN_VERSION_CHECKS,days);} + }; + +#endif diff --git a/YACReader/goto_dialog.cpp b/YACReader/goto_dialog.cpp new file mode 100644 index 00000000..b54805ca --- /dev/null +++ b/YACReader/goto_dialog.cpp @@ -0,0 +1,84 @@ +#include "goto_dialog.h" + +#include +#include +#include + + + +GoToDialog::GoToDialog(QWidget * parent) +:QDialog(parent) +{ + setupUI(); +} + +void GoToDialog::setupUI() +{ + textLabel = new QLabel(tr("Page : ")); + pageNumber = new QLineEdit; + v = new QIntValidator(this); + v->setBottom(1); + pageNumber->setValidator(v); + textLabel->setBuddy(pageNumber); + textLabel->setAlignment(Qt::AlignRight|Qt::AlignVCenter); + + accept = new QPushButton(tr("Go To")); + connect(accept,SIGNAL(clicked()),this,SLOT(goTo())); + cancel = new QPushButton(tr("Cancel")); + connect(cancel,SIGNAL(clicked()),this,SLOT(close())); + + QHBoxLayout *topLayout = new QHBoxLayout; + + topLayout->addWidget(textLabel); + topLayout->addWidget(pageNumber); + + QHBoxLayout *bottomLayout = new QHBoxLayout; + bottomLayout->addStretch(); + bottomLayout->addWidget(accept); + bottomLayout->addWidget(cancel); + + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addWidget(numPagesLabel = new QLabel(tr("Total pages : "))); + mainLayout->addLayout(topLayout); + mainLayout->addStretch(); + mainLayout->addLayout(bottomLayout); + + QHBoxLayout *imgMainLayout = new QHBoxLayout; + QLabel * imgLabel = new QLabel(); + QPixmap p(":/images/goto.png"); + imgLabel->setPixmap(p); + imgMainLayout->addWidget(imgLabel); + imgMainLayout->addLayout(mainLayout); + + setLayout(imgMainLayout); + + setWindowTitle(tr("Go to...")); + setModal (true); + + pageNumber->setFocusPolicy(Qt::StrongFocus); + pageNumber->setFocus(); +} + +void GoToDialog::goTo() +{ + unsigned int page = pageNumber->text().toInt(); + pageNumber->clear(); + + if(page >= 1) + emit(goToPage(page-1)); + + close(); + +} + +void GoToDialog::setNumPages(unsigned int numPages) +{ + numPagesLabel->setText(tr("Total pages : ")+QString::number(numPages)); + v->setTop(numPages); +} + +void GoToDialog::show() +{ + pageNumber->setFocus(); + QDialog::show(); +} \ No newline at end of file diff --git a/YACReader/goto_dialog.h b/YACReader/goto_dialog.h new file mode 100644 index 00000000..ef8a36b7 --- /dev/null +++ b/YACReader/goto_dialog.h @@ -0,0 +1,32 @@ +#ifndef __GOTODIALOG_H +#define __GOTODIALOG_H + +#include +#include +#include +#include +#include + + class GoToDialog : public QDialog + { + Q_OBJECT + public: + GoToDialog(QWidget * parent = 0); + private: + QLabel * numPagesLabel; + QLabel * textLabel; + QLineEdit * pageNumber; + QIntValidator * v; + QPushButton * accept; + QPushButton * cancel; + void setupUI(); + public slots: + void goTo(); + void setNumPages(unsigned int numPages); + void show(); + signals: + void goToPage(unsigned int page); + }; + +#endif + diff --git a/YACReader/goto_flow.cpp b/YACReader/goto_flow.cpp new file mode 100644 index 00000000..f6325b0f --- /dev/null +++ b/YACReader/goto_flow.cpp @@ -0,0 +1,320 @@ +#include "goto_flow.h" +#include "configuration.h" +#include "comic.h" + +#include +#include +#include +#include +#include +#include