planarity-1.0+svn6432.orig/0000775000000000000000000000000011712410575014140 5ustar rootrootplanarity-1.0+svn6432.orig/MANIFEST.in0000664000000000000000000000010711521340677015677 0ustar rootrootrecursive-include planarity/data * recursive-include planarity/media * planarity-1.0+svn6432.orig/setup.py0000664000000000000000000000075611525552251015662 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- from distutils.core import setup setup( name='Planarity', version='1.0', author='Martin Heistermann, Thomas Schott, Ka-Ping Yee', author_email=', , ', url='https://www.libavg.de/', license='GPL3', packages=['planarity'], scripts=['scripts/planarity'], package_data={ 'planarity': ['media/*.png', 'data/levels.pickle.gz'], } ) planarity-1.0+svn6432.orig/planarity/0000775000000000000000000000000011712410575016143 5ustar rootrootplanarity-1.0+svn6432.orig/planarity/data/0000775000000000000000000000000011712410574017053 5ustar rootrootplanarity-1.0+svn6432.orig/planarity/data/levels.pickle.gz0000664000000000000000000032667311204561655022201 0ustar rootrootJlevels.pickle[&Ǒ{_i3reFi Cc31ԶlIKTo7dί_FD"Ŗ d媯*Oqzo)_w/߾W?T'}_?ŧo_>-틟W{j^W]zkӯ׾r cu^xcGu~ׯ߾}Wo޽Cmw_YŊլ=c^v VGZmR*P(x@>`7_] ,u>j.>޽=/>~G{ϊmi ~C5}c; Pݹ~iqGVmx gԂ?xǯl`z㧧~_G<~ǚuaja.^(nkBC7]|V8xiѲ/jV=E~Onjic7- F}W_>}w^FNw]nuYvsճV[2;j/_~k{mFQ?7=g1=,{r$qtA/m¿ÿ3LSss%El+9s}n]C*>>:Uo [@p>cQ`\'1LdO)Rw[ٔ.m\c*}NXj˺Ql˞xu0+VB^M,׈?|~zOOXS?1ʵWƋ7?Q⏕sX]շT4ģe{pNvZ>[I#I$+S(Q{R=YKWݛg.м:YCf6_=CY{ uؚ"G&!/esXXB񙯣ϣh,FCw;sqZ{ kU.-Q֘˓hruX.G_1B[nKfRnrӲ+ؕRo.mcAsanQ+F ˯,{Y*$d Ѳ'u[lt¥*{~ȏ ٲenuBkf 0وZ!arV/Bn3֔|;\M _dӧ֘^VWR7b$[1Ė4.:O CXOνU{d/vbmYڭkV-T܃/>VC{.j[,i/`g\x2> {9 75J pt+rV!pJ5lTGGdFK!pd \ owiK}}xm+xhc5~{ջ>}nbv+\ JnQH,kzVУw yk^Ǽc0ɅGكɊ@Vـ%'YeŎ)/_}.ZغV;h̴jaxpiu~ ERcݷuP!B.[ F2]-V 6йlXm( X*{wu szi%!)#(/XeRc5e*mmݦzBJJ*nvcY *e\e-+fT'W]h}=)ƫ O!qO5fdyu0 Lx HwW>ڮadO%C)&ũ ^Z:*X=YG{v8XR{NPlZ3KI!_1SyP4imlr)[ԩE?/<DIat[&!ؠTؠDUiKcA.5 :ĩ,]/ : At:tilh QEalh( cC(5QƆQƆCOO;pX[;…TOI7|/.rnZ1~bfm)ng1^[9}^7lkqCƣӐg0|X#jZqKݾV O:-x7H.+M€m͗؂Z:  ]{&aY{ֱ o{͡أ P,qA4: IMǟYFFu[̰*[!fܪ5H]|3ƾ|M.d[5oM9V3ϩAL3J {-v5`b9Kņ3k>s}JnoE_LYnNb(zl2:^nd^:98Tz ȽB~,?}dlc~qH6 Y A58gx+ZOaiuk*3a߶ro~7}OU7Lù{hi` !B=!|eFɏ֦6WEא}%iovDU{S5i#(0eY6=;N9]};󳻣>ǟ[DfHh9cLke~0k[1ae )u!rcO'A`q>~_/77JFȹ?2as=5= n9Wm T5mb͒q،k0[KZ%py7 43`PEr T4hm74p\{p#fh(X{)Xr aS>@ղq񣹆ko(\G/hz.7o܀lRG/M[ )\Goaz127b7Hs[Ea1ڟY{w{4W XGxEe;n{ IG7?5w_ݘN# %/15n.1W׶#g1~sK9K4r_t*96Q23%+b*Q2 QIo}w.=iK0iۉ y1XL!l5!4<B΍ 9 M>bhk`ײַz_j~"t NL?XBݭި>ifvw #g-'DRلL4ųvﮱfH\[߄T 6v=Xp{xqd!i):˿&ŒL jNdj=IDФXrsԐtpҵ_#I4yhlJiMcy :@BIc5Cf ߝfn,BU{6̳^" 0XL`1{xЧ= nws\g8NV/*?%~.#Lߜ מC]E ztI90c=ar 3{o3whes;WĢUnw1Qf#=fR :VWjAA- aTPLnD`#:ͤςٻEB,H~ښ.Rn~#W(J>StE5\ԂIV%{4o1-zcȢ{e6_޼W~巿fmqyn[\vf~eX%l8VGآk!N7WЪr8KV3rU7~!/N!tU[G$a x`-ܢ+[8k ]AˬN"ZBv]9H6ZŻz!g;ziB]/#Tm!=iԢ>Q۬:3`AV bZTFɲNJw!`X̬3kht{oݧ%O=o5sG1=Ȫ -*vku (:4>z\6! x:3Vx6!֚-"w;GAT7R|}<\u]㴠f~\% bCur2%Z(( (0LŃ1qϟ3?6ߍpM%)M&>/fZ%+K=XQ=MG"1=!ak3u=景]nW3L~5# =/q4ewiqoEGtlpf;MRQn. g+FHb YVX{8%x=fO0 ɂ_~B {<#IgoqCG{d}N@Y}@YOpzAYwq ~w9w{ɸ =; ٯLa=W¸{xAE> RqLZm1h 50Pu8xk5jè,/um͈(ȼcf~̃W(2X+l@}2r#!IpB~C$WPbl5nFR jZɅ, NmK7[a V*E_Eʸid-(2D))8hn($9T7l䊾=q=ⴤ `/*;%!œ+&0e&nbn0 ջ]IFlætkwFv;FO$1ib+Hs*m)>VTO8{[:0!mbNQ{Ƚa6/vQC ,vײ^=sdb vͦv)9RkمhhOC@Aܻz-VrДc|PKݍo__n Vݒ\5}NrmO۞mCOBElXX 3)+9ΘBLŕS߇*r&4[sZjK/g+]+zGeү+wr?+"F2Rē\O",ȘNQk1$H)T$QI{?0~R&PH DD׍%T40%" IKݝ vWFI V>bh = :O gE$5DD$q;D¢2H Z )ٺa?iT W𖎙2A0 >/(ˢ.ym0ec1(+TLFA*Z `9Zl@vb#ѝh$ΐjɺ1Zns.K`.b? $*$^'[>c!""L `Bw{pg_y@߾u0"N{["0\#H_{9` L+d` @*(a["pfwq"؝#FM6$FԔ=mH@&% yf $*XHˀZ n8V$?(RΩ@QtY[n۝;?yT/ax KuE?k0gm`Ԟ]D,V=A.yK ٫ _G߯DF_Ty߯zQllwOx~iqq+ Aqx߅t53'[cԮok4| Oc&%Ԩ|TpP!T\&UiP`(g5jZ#5z+54*_[Df!`#K;B)Q)nBІ—\ }5ӲBS a(Ko[aHSa'uC1T3r$dt%gMup"a冄4$l6D9q.fCBiPPom&mc!(a|N /]6Υ /B v Dnh)Lm|KPH!u*n+a%! ްFw\جO=Eo1/|gp`Rokn#{ {C ˡV氪8Ru `Su+&ġ1:oSHo?cSkmzИ+w%7GWݴ*=jzz¬8ʂu 2mDBG=2ptQ=jސᣬTy,u O$磆GIWﴏQO,r}XX弝Am5qRuw9L#<^,UoB6ƎxqR .p^:*~fqĄCLH D jUBD/̚>wxDdA,׬gջ!-CH'F-q"9!A9- 0D)W&wH % n|BfHrl$"!MlHNrC<D*vsk@r !LCsN|7E| "<.O7 \!E$B S!IOzHBOg=n)Y*<NJF\hIX}\Tj$CCIU+A#83e۞#67ķ=-r-Md GN,1`KH7 "" >|.a"K#,N\V<1b)烐R"h|[;Ѽ4rI`Nz,dGE67`棷"6EDIF*h!pDmJLfUODl6#69f 9Ym)-|/~|XyO%&cFC1@Bk()/$ryXOK1wgHͷ6% ?%bKq$FH(đcy$HB"C$ +DH[BImSB.Ɋ$B'N0IdAA:$%6/3P'0IM: %!%Zk!UZ釞 ).1HyJ}œjk-i`&Q}7S VOş=][[K2pD:AzD[K8OF9*N0߈F\qɌ=2^ƴH=Ghq 28;3(= D"a&w>Y4318a<2eo^ff<{%Ap1 Ek5FWd@\I9N(ODe .,b Ʋ8̮yOl߷X4sW2⊤'{QMlʳ_ 9(Ȗḅ[!$ޅ/Y=7@Df1kF{b/AkUHfm=]39BxKsyP8Kc<氒n+(gE ^!tޑAhz5&xinNJ@)NZZ>i3Ɯx!Zjq $TQW;h+i'5nRU眬12- J~z&Uzѯ6i,X--ɫ^dJx+1&~t5!&njAdFH*k|ߑS&VSvؘ9;uMhOh8ѮZE\<o2̦@~tF%ᤘc} Je`U/`v{wq%0=UOl[-Y qvHUrE36`x(!qׁr6(͆ڞ.$e DpnNsE$!+(Ο;C" /BExQT+1)@!ۺ-?d^!Ki'Kb&1C&mS>xmj;A"&@C:xoG%fhQU3il6uaPt!}v!O7XGQ_B9J0%?ӿ~O}~XPѤǐJJJJpV2T9;VS+)ZIN jI70wϺ'0Ei*TUg*qH4/m BBJ WQ !Jpp|VQEJ(J*(qFmu WiJJ89%0|}/#\7Ȃ(Ȃ|)3??po'eJH>cTSQuz%*'Z0Z2XX>4)iu߇+5oAX/KrO=䞘‚zߙ|"szݩەq} D(c+') XG||FZI>t_I>Q,>u`#*'N|"3_dlX/|ǪhxCہJ^I>ͮa tq0jp:$͟#,G~Qwv"C(\홾ZX+ xZ!HGW/UO9 ~b$VOUFO!= Y;%.%\Nԩ O BK@, =t}nsj]-aQ) c()d4^~>_{?n*i%Dܢ$R@]cI&*xh^%*:@"y=à#(X.Kc/d> ^l~+[R3%*Y)VOU/A;"yzIJ72iq}&I)Ӗ>Wklp͔;#q-.8y7*I)JK%(ErDwz})1XE#X@U~rKڮхZc+tƾ' +vMdy1%+},ii u,Z:|CP$p*&CHfRyC 6o>6p\˯:!9U2G~VKꌞ@? <-)5a[+JXɌ?|e쒉( 2$MTVI'i_ B$%[ssM2fJؚC$$ /ID~>?;bV8;RDZ#Ėܘ:(kTޟ vu%8߬@Rx @%$#V"H,v(;NA絇paSIc'K(T5V3Jm, =KY"}jg=1,?DTBJ2M[9A31%ls1)le@bZxYj }߾}_y7ooMgx6AXF$byAz>ѣK3Z ‘  ˵ʕ;e`f ҩȇQ3H։oBH:1MoYWTI9؄8An"$+&l&[ە{DEAD9`2^ 2w 䖈".QkK>3K:q]nbKuIyD@^ Dn$8N 2P8$Q8o$@ښ}nE%˿#eT"@V册rP[Dd7ĒLѳ`zG[Nb%$")V ")CbW|DXK $7 _F``"|dc*#Y)􋱷SୌQ,_:%Y#J Q#in30>_a(gO/;UUqa)m!+p^ WcB}@`kY_F#FL^bFBQ{l,ЎGVFS0:h%ldZPiJDRqGъ#+3V<>-͊jH;#k9W,KWH{eE=0 !ڃZ "6L(b|Hfk+†"`n%"uzcGۄ+}ARJ,JR8Vb:6| XGc%#tij482}ۢs麜Q[`bFOćbb&bbRïWáveEI&m"JUNTͪWZ4bؙm _h!t8uzE[4%^yaŽ]aLca'NF[[Ĺ0آO^I.Qgs=B4V@JjUJԩ3ܵϸ'UBJ"iQR"^%@paF)_|t~yW.2|DHi>$E*"?kEXJx:( Y-`>EgTE"ۺ,_#;a``'GxnbUwȌK&d:Y$!$htr9H&r#ӆgp~NՈtPaY%]$mK5T[i'_rU=& "kaD"#1RZ|NMofTGmq|(Vgt "˧e 'g~/3*"Dtx"۽o@pԮ#Ҕȑ\s D@ΐ#! N5c4)|f^RD`I +%"D'+~1&EaVdZOW"H] GjEd <(H.:2K,iG8X42K"`G .# }J 8&Iu1{-r`Wsö(`-=Pse8#,ldԈ]nt/y$4[> EhKgBMqh&|a cG"uš"qY#zWZ=# aei# _ČXޢl/+@JH8>\ћ -,Dqh`-y:ĉH w$))"! ZB&BRPl9#˶BԈ Ϛj=qYW *Y2,>s6b\oyԋ oW^XzOF c {&dt`I9_Qē)#P!)Vyͨ9۽Mx#ؽ5 H>ߪU(2zo>{Շ7_yw~}f=Ϳzh7%Ȇ0:|-XH/ !!$rK7,_)+R/@Hc۫~#49r74cCZ _t)/5Lkv~cDŽH$C7rC̡g46XN ) 2ď;a/}n-4XR'#$"@!#De*v24lv̺Hɒh0;ThzHwT;Y,$x$Z!(d'9Vr;I;<4)I @ڼ|P~LVG} 9"NoIq,/ 2q'g c(**"v6|]hSm߁ǓU"ߌIq/[˖Zeq|]j^I!p8.@+WRGF#>ml$t;u4NKnyEzB2EDb'VQhP o6}p+;D: %LAGK"&3+ArĠ9bh**Ah1M)1/'9%͉3a:>q3>"KT!dgn[lHW߮^# mcLBe2igiiAXN -qϒX7Ek?FסaoQSSB̾a k\/A86|AR!1MfH&QBjHƅؐ'!a"8D|HAREXڭC<6JBtHWUB3ߎYCq"{ ? k !Bx!L&C)5CRcqtHغ fcY}>WBE?+ri`O#珦xO#$~!c)#F94BGO#珆F94BG?=riDܪXFH 94"̚lb!ӐEri#94$~RIN? $dOC6!Pri(94~rJN? I%O㴒8$4~K? %ԒOCp!]ri.94~KN? &OC!fri g#~/y{ĮN9kKHӍ.X-ђב%?Z-T6dz!$N̓5lI͊נWA5&&uO\ш/Ht $bj@2r[ &%d; &\!ı>Bz%`ʼ;4$nC*JiZyGcFZI~S)i9x*JZ An' $Ecʵ0 Aގ8 a$!4BЯZB Ii1{/$6bM=*y؇<"auHN# q ?tD?G*ĦRA9< {F\:"S>#2 ;v/"33 ?ǎ ?cیڋۦmFn&[F-I#ɖKTn,a884ng! \3N(M:H_>ýy=!BNp4bNHI9!urqq돟{kljD (% %mBJ`6ߴ8y!BJ(#_n!%7 8MA0R &RPJIAjYdžr"<pDJu8BsP*WwbP"sPAQwv7G 1(C#Hu& )(cA ?bG J bMeo| sgRPģEXv0)1+x\uM 6Sw1{%DM YKAprKeg(;7eΆ?1 f"wnDo].}ϵ3ޛ8GKq򦐕kR|GLTETVER"Z D%^*ou W I)EƁ!a݂wT*D^p S?WHJ!8EbR[ς`u`x#;))qUaA:y1-"\"&%ȶBLJbR'F.sR4d ?aZwDې#"2ov`%dž0x=؟H"1c0#cfOMl4k!hRjL*9͇>8m~{GT&YWG(\f`02F*70s(-N9 k>!'5ʓyGgp15#55N"lzbM+dD&fǵÐ _V0 GLpIn-=yCA)pRy%53N+q̖UIJ\1 *?SxA@ēD$!&Q?K%H˘~IR=`3 a$^HRg2I@^$ =i؛ķg4"J 1GB (v  i&:=$Wl|3 sWc_g86plrI&^` G>aR:Z Ol{ S:*zXX62s 8]Tb %UrcVbPZ8Wb]9yC;4/b88pl/qn{EG86ñcbbeoHwhvȀfh> s8ir堹3oҟg'k8M69&^8M4Yڱլ*TIN ~ .{~0g5Y-/ Ѓޢ7"bē~А'WW߾ ˘ƞ˃aǙJ NɊ|Y40Ns A( %hĹb|C<7̻""N̒8Ț/JbBw̡;P*iBJ sPfԪo+n 9(MĠHvn~t)ĠHvGbQސq>bt\KyMFI(~~bR(߀[N\[V9(YĠ"9iDhЪ#u %Wjlʂ0b5RP"@:OaFǴ*=+q'+ q'?-RU8E;?vZ;)Jx"*'%j'jIj2<OsPOE%PAoPՔ?jAwZڑA?柼<4Bg =nGB ANQ 1\@OC,Ccٙ9T嬈9+Бs̸i#$(Gg(\/ͼeF؎"X &ֲx04kGعVԢH8G BLR2Q^DkGQfGQΉ".(ʾ9fVԳM&A6wiP2QPLa[e":En@Lxֈx"WZzB&PAQZ'DA."3QJ(5'S2Q5<+G#QDd2q/1 D)f\%jqޓRIUxQ<2C)J4zܾ>PhF!FΨTQF͂<>o3 J8J[Ya[}%g^IGa(@[=Q(,r\iWQ"#(qN=Qj(oDX:*Z#h8F1{AcA|問,?kO$ 8F!Ow-pU966LZH+1nbQx%x̚RZ 9J@J))=+%/_T Hd(}LIP؝(I3[y)| G+fxf2 (#qӵΣ-$8a<ߗo<+j9.HF]o~ȩJMm},$TJSM,|A`dtHbe'(1!δuv< J8Э-3e!朸'7ʎoڬU*KSXT"> G)' `fQNl"7"zU峲SO6z^QUM+%~&)w:ƺF=9i1X!EXRX2cVLd>YsYCw@b[L;4S4fk=0Sr f̖fΜ ̴ӧi|**ꆩa*~ʖbJ b"QaL]E5yhb,^:6KTTp΂ywj0:9;9\8fuq{sqXl㰠:I Ra_ZFPZ9z JpjTȂ7\h#S9MVd_^+;bWlFzŶ HJ ߊXU2R,?ɘ 0@{mD~%rFd8J D|sGJཔ,p8*~N@q+'Fߕ45TF\KjVVfOƂcd:1{0:p-gHaJƉ+IZ0ꑮ:'?#p#/T09(Q$l-uu}*UuɌ!ayǸkݫuΖY#"렶ł@/];X%!^,S` L%$2vEC{K6VR+MVhv JtK8, -O&'$#*ٛǑ8,h"tdĕ0Wyĕp\r A\Iĕ8Y{ B je+\`1XI: ꏛ:6naӰðAipa 4lgr6H49 <Z9&a{ \669 ě NN'aӰAi 4l80lvr6;9 $ 2ONÆSOFgNa> ðѩ[LðAi]_6;9  ON'aēӰAi 4lxr6H<9 $ ONFw O'aðAa 0lY_6:9 D NÆNҰᜓ4lsr6H99  2NN'aӰAi 4lqr689 d 2NNÆ1NP`0il s:a@C\N_6*# G6@r)oM|BIkqmNI!8DI6QɑБ$f=GXmFxP9$j@o~ <H+# ǐ r ''<8ő=gc. 蒞}Jt2]KGfa{pGx]yGXh;}<08$ (D0T^bNz]GPKFP uv;oJ <4bHY /wޠ. c?<]nrxI;^R'za"qC V1"f(PDv:spOvIeKj$7_b!|h%9bOz yC3O13Ćψ`aA$e3;8g9DzcAޮӒ^b^W$lWOT0qB:28ZHk䊚>tN ԙAXÈ/ш&ORKH435!$ M}!,JI 0D~I%( Co%FL$35m|<ԕ(%pLDZ G|FLzFx^&K8FI/Q%$tt桦^bTBv%K8;F\Wr*䕜%GbɩYr*d%̒CsfɡYr*d%GfɩYr*#S#T,9?2KN̒S#T,9K̒S#T,91&Yr*dT2%7ͧɸ^*dT,9?gʟ3Kϙ%̒TYr(d%GfɡYr($%G^ɡWr(<X^(d\7=;kߡͥ/KhS#T'9?JN又S#T*9?JNp%87$t3IfK%ͤ44` :RO"$}J2҅og"QǙDJq&%W?ZZy&5/W΁cArIīh8-D(8O+q&j\aAQDCwL >2Mԁ1JIsNITiM,tH\358=&ydX2:ïH?T8=q;7ܵwgJI SNy%ב*QBIzH5 mTjQ^y?!A^EL}%$JF.)&=XgL*I|Kri)%/ CJI)&&>&slM$Y.kt]3#6.WDT+ D"ܒ *%řJhIıX"[)q%WJzl*1wFLIpD-8ķmǛ~f6mCKoVraY%`FΕm$ i]9S2 ^D~ñW0x ˮ7@䝼s؆Q T䪂!ɨˠJ/VpG;N&d2IF0⋢Vi:YKS[bMF9L:A^[Ҫ^:^E`~$"`JTKձ-6m>bo}@pg3U UU :ʍ>ʧ)9,҉E8ߢaQiy;Cˢ'4!/yZ&޺D]ntmLJF)9W=7)S1Ggm9&h#12.bT#15' be6Hoj#.*oV|WxDO&xLk)VsRRWN\Z+ǓۻXZʤ/$vhY(y}-5I$wW$׍ nY^᝔jNM"C;*w'OO*9;< kIw=2uv'MICvh'N;I wKy=`'-zĩCf}PI']=qq6pA~Fp wH''Czl+$N;9["QHp Z/;6vN]-%@.T:ēvOz4 K^MUoU˚>jzEj:';zs׸Źr@9͛;݁-<w18{ڡ {I@:1SuC5)<Wۻ##+ex:R3;SKZ>z0Zڌ f Ӄms5d73ß=maЌdfT~+WDe}I ww&5v&3 `ܨLyɥ48`K[5O-N+?ȒO{( o2*WRTˑRU)X‘(a$J?0O~ l#J)I^$[f-mJg ]A i8dYzGv#-PH O:#r$ҩux#խl$<>ՊhDYH%ZyMmEhv2՗9BU#cGM72Kup# ܭ.$:'fԄ*uPB,%8SiZŽ\ lDl1cŸXRsp<&fۊRì8;Cj'vg|Y8;ד6S}PGv=*'vgD~8;'P \, oHyg7ĉqJ qbw!-mg8;)/vH$G}UځU}z^On\"tg9;l}ȉ /tWɾg{M8{PGN쎣o;Nf N2W/ :e|'v™bƉ͉HpUOt5ܠpT~ 9=Wˉݡyp!,ߗ +T yjMMOIxz&`RF_䉕w݈j bv҂ҁPԘrXFn,vyeTH'^̫o@'gt0't@@NF8t('&v0'm  p ueWZPNӁ8aXŃq2>)0T'%0!_)x\#2̰BD5)Cdi/p.PN*s䤆LrRk yv '*8`*G0Njla,΍LK^HKsbXTs`N9)a9y"qjsRɝߎ6kL<-uqVĹZ_@%Uv`w$x8N3V si+w/^3qt '5 'NaNdzcӎkLxw N''->aAݷ`:!T8WPue5u f޸aџ:蒳=DԔDdIj 8!.ͦfn6ۙm 5O;`t:f,$F;`,Tź $;8{Aw`$uH  ڒN[7ҟ2ʰ)MH@pM-QmF@G{+jy8RR7nḤ5bM@ԿIؑ_MӗCX!K $R,IdS $kR X:X"\*;VH-]'٣3$|Cs:000e>~}HCM*1}ƠpO%h4C'-%Ath$'Yus(C#[:UmugtZH+W[]~!E^""oa.![!9?sXP̎3_ \PWw& I0)ڧGkJ!D|1ĵp(3'\YrePK걓Vx*Y-f~|DtN!뀓}eJes XsZZ8)/ {֪wMZd ٙ+~,TA7بġm=&0):p}-MZoE+,'( 3Yw^B`]I[&7Y+:lp~V<8@PbܤXmnR4 ܄2[]&'ӭRw&MFvMʅ4U69%W;h6y69U6e;]dMJirHk?N倛x~W"tqADs{9xav[銌]C$ǯIQп M ̧٤Fޯ8N箾h ٤ZI$MZ~v&:aD*ڤd@6 xMla$9NQ8KkR>s߉L:X'-`Mx֤PM#PMFuX_!<# Fʔ l}?7|$bo;L;L~1̽2G3ni;>h?ڜV1&s9PIIe|p>>._ϴ{[E9X/ɥ^;yCN.bTdF~ pQOU>{OJu<#hac<eR_(jQ}5D=EEh"Z)ڶD#_5B$Ё!,nl边uߙu(;Cs߹j{ ^R=?ϭ VQ8BrqTjՋeSaƖG.UT ^ťr{=c_UFN_T x.d!<"*.At1ET*y?s ͎/m\#O˯6r|F;e1`TOxTod8Jog8  Jxqx+as6Gep( ܂;K޲~-|q/Y08:oT6L<>rm*gӄҭ4V0W/_9":쓞H =?|j1?N=qgۤ~7) da|bC ! .x  I W+&VAl̐MEdoA5AB6V ȰaWdn6h_AZ}f 9zMz87)V87;lYMz(Me!yM;ߛ/bkү.&'5?&=g_:hs:lcB;p ΣvS4uA79ї* ~pFCW tdɰI)w"'p +=)5ܤ#iwدNs8:W>FM3wڨE.2v]K IK]vH;|I0x<>p2g<~nfo&H7an2G_:}:O<4c%Y &=B;laIޤD(koRi ęm;}'Dv'+fҕ6ĥ߶s>\PRv'+sh ĻqV!o\'VSlUޤɰ#7)7.7u\N^i|?@49:xMhIeU}<+4㠈#P':GZ\k\"F\k18y'TU Xi6nBpFv}NhiyZ_xՙY&fFP'PVsYڏ<,1\9IW-񙔵DP'j5#7FP'e<淨y ,} T0sTYY!~E@x I7v0VDP[ɦuA ;t/5:7|,Ӌ=RNպ@x;3qK24sKpN:az;r6 8BY'C4 k`UٺEt-w X\nyhrd6gb@2¨2D09[=xVz-TB. #:ft;(w՛\ӝM'g2 XgNjP &'ҳ_FAU~ t-aK6b-bxP[p#t@`KXx&ˇ%mY^'A" y0W>׍\ٯJvRrvvʢA,sI=HZ9;q5хڍa|ɗvZzIU|Jd}(LA))9Ԓ\;Vɥ'ǻI\VP^*x<b<-QuO<Kq*9v䱂#ʾN&h&AaCc T2Y?4\UŒ=$EܵD;izzP:O]]&WձO?{^e‰5Lh9C!֠_CXq Db pm y G x(v0j(wF  . 3ߎ, J np %]=2[׮ &ʘnkɵK:nJ͙[͚ QcXs< #e@P3~en8V8(LIuoP =\ILmPQ%#F.*1MNPQQڦ{;~xO d)@@QJdWPQJ GI² XYa~zU(bY@-xbR/_W0tT1'RaSز^X@ԓR}E5gEw2?XB;-o湪j; E}M; ,P_+7l5G:"!UCHX&>A28=KTJhwd4@!wnIؘqȒ(.U| gyď?CG6(y{(9.VFxjSC n<֢b"I p$miA \6(.Q!r&G]ׯyq趹Yk|YYGY 4bpraܶ:mNn[ =lPO.[ ؓ>lA>I[ $mO.[ @lV[`y[Y?m Te rrܶ@0'-m lL[ "5Uy ĺ~ߑ+KA\l􉷎pOt<\a^n3|Hk9ţeOe)=Uhqn\<4p2znnb πmi@61[waW(m0a e:#t53֛鰑{~u3=8 æf: #d vIn@!I%#:}ܸg\1:a* -hX1nUP%,I*ɻ%k艝x93;4>N\w|mgXj&TRj!D3TC#uAȔp M1#wĶAQv xNŹ>U';4HL/Ā;ܑwGd=M|}юCTjaۃxcxd<2|vy]5^V{z:jyŜ7}RPL rp H#gSu2C[Tje?r6|X(Y d?2mJϬnZ"4g{:6&f $s!b+&n L-Glx#fxq$=x$ax$Fh2biZn#ۈ6b@"Hn#,ۈ0ˈ0ˈ0ˈ0ˈ6b#Hn#0ۈ1.U +0ۈ6b Ģӈ6bZޕ?Hn#0ۈ6b##ZiFr1F `$mFr1F `$mFr1F `$mFr1F `$#`$#`$#`$#`$cӈ6b#H.#(ˈ2b"pH.#ˈ2b!0H.#ˈ2b G.#ˈ2b˸]q2b~1Z/I+m9r1F #m=r1F'Ɩ3e|6 &Ϙ f\JưF\ҀQRj2F.ZQb=nG۷7Wh@JIHiɒ'PF@JC Jn(q&8 X, %;%0J8yQR"}F ڲmZIȘ8`"0OW} {èz2]vjUmցUrtKuh%Ǯ\g@+y33q%6 KJ J+I/Oq+>ři:W8o9{fn8WXx6F[o7~+>WҷcQ!3b|2D>z_b(h,vYB fIYe8K:<Ȓ %-4 YR#SĻp;A4+, 'bI%&p,9*r/PX"vt,vXm&0.93mY $R x%&p%sļMb+?ǀWb5JWqp%V i/)ƻ ehd|JE̙lVn=aC* K*tW%XU H][˙-FwU"%Dg:*wh*}|C|)kL/oGȈs|'?5* x2Sp'U9=1x=Ktn==W}3ێ<;;gLk`<ǥTUsySO$>U1sX:NUx˪b0-%˧V#''<1Me<Rb]oݺ:޻;ԮoRbK$ZcOrrmR<4CSs`'a:!t{U'O@|e- G[g&W8\73vOjfGRd6xIq~+Kǿ\)j^[~k!0`MŌTa[<[r=p%'Z+ُ+) dr8pKSpK| dn9jLxj5`E_4ܒ/,%O2(ܒ' ;F֬lclI{ !^,u-Sj<֣= *C cg~8U/0[r\gΔ9͍S G iz]R\(_)qcG"2e&&+>OafiG HF,_i3]3J51i1GC1ġ XPLYz#ٔ|*Ti0&^pLvdSiǫ^BDX[csK8&q1n>6%XBb2CarTgnSάm |/L|WGUj؊{ xGpLjDN@&-&$%FMnYw֮{~5|&1_ ƎNncZ+/qH{tP/,B+&ejdMz 5a(T :ҒN RSh'̓w K[p/hapIù "@J7Wwz"d3*!ud_RqVCeA69=dj(~;}d䨪A69VuduD=dYs (ˆIn) ɱl,I&ޘMs]. ɸYf֋O86F$]͞@;}OS)>wzٲ=d F PHԜd+Fr85VM6A6Qy*/ o(&/dGMZMm&slrfElb}NMg&&2s=Ӡ ܤۇp79Ĝy& ȩdݫГ3BT, :z']TB- #AWt2.A|Iuu;pUK>`wP͖mx8y.d.<>!V t%O {4䦆xw#^)~l3a$wo?#_ xIh{^l/ ^r!OӶ~O%3RL&5N'&1R-L:Y2 ۄa2j 7%e$v&LK|%7LNs}%0Lq0ҟ0Lfp#`[vetm=&"vyc09S{4ęp$Y2)G¤|g0YO@Xh2%u3%ƥ0y<8?`RgbB0yGA/`R,^nLL&~I:fK9K&2F 蠏,N0gE* u pg/yRmo_2Ûw\4_ߺUe$ |I~I/yEuE<ַr'Lz8sh]--4]&e`IM !<^!'m2 mlw9٢׌IJXɧZ[Fת xsE"ȶm-&N26KewUTkh LG6I8PMLv Q> &@-MPL PL(&߁bnjt\5ELJ9_ɯ^ 9_IX#^ɗ5evrY#i&y/))N}K~"K߄zrR<PZYIaS Zʔ'D2D(2E(.E.z(Bt(B8*@?%șܼzS~+czU {$a|۬3mUYhRp^sLc,fAg<\|(qs3^,f Qێ%t ݚ9O9pW@Q9SPTry2[gP3K&`+e8Yݟ~ϗbsK_fJN+o\i\[:H6ad e9l}m< !_N*8]9dA VR"!ݬ ^6kègd>KmuzήG-.bO]_t pSM*PS&NγˉD2>t,'wp9pQJCN('PPKCeXkيfԣd{=Re}JY 5^|VʣPw4pwXɄ{҇;yȊKmZFJȣj:\*5'L7t;W8Ih3aH3[B\\6V'P= =Cte料\a 7ѤZo[֣ R;l3{̘'vAz w4)B6!4ێ!51Sg8IhФIK7gc3!5, dZ1oiqfrjtwB4Igۉ-iMe49v 4_;g$ٴ`{ϖ e0M"MirSD14vxi0 dpj4鶇59.4aP[e I !硚Xsϯϗrr4+fȗwS|iN2Hb:9O`'n;^<᝜Pխ)W dC/Z@C5ԧ?Cݞ$M$fM0P\ AH#DBeiVA:jzWK(G X)E"l=r\U%wٯjr:Ɩ];ta~}QHg22TYF< 2zEREP]irP^3՞Soǹ[4wYz"vkc;'6kfO@oscL6J J&%Rj3 _,tfUJ\_ V%#ǹWRlYR?Gȏ+}" @eA1vO)ǕO;RG2Pb {A/ {5J9:Rj\-*ǦwR"GQlQluGf(`fǰW}z vD,(" !Rd8s) #ǩ$n&괳fG{T/pwǵgnJJꀒMYT)L>q3>(;`|ˠEJtX68ST0*AAIn3 XL;p! Im8e2 D ̼];kieҼ$29U2& ,؁ ˤ[fH ̤۽I:;h&44g+ 0Z@mxHa25I ,@ c ,Ht:AIA8g7Ǥz~cr괣< FN8&'+=̈=@L8T;162>y6>299LfXnϣlLf29ES Y3H&Z6A֞))ݾoR@o4A[=AQ6@; tRjO@&3ML@&%N@&N>!@;g+W=(p¯p^I](xZaMay&VeLtIhYgwHu -R᜼f"S-W;x XB>d`M'BpοɡXq Yn';96Rꥥb$NX(34 I\ÓKս~h&4 ZEx דsp=jfJخ!QwYEPnx(^E mUrhnrz5$}4Uz7nDiÆr^V%p(MæC3Za5'Pp=;)?r&L0(狠]/5_?"Nʎ,맡 㥰$^ +Գ/+C}P@䄂RsFB2>u-$i":S.#4UԠH ʩEUA wE3Eĕ^mR{z]B?/~^͋E$C9^SD eڑ J[s2߸j+6< ښAu>W*v =yF lʩP4,U^v,~ovieZg:.v]RBy Z]RvczK+%e}yF@/i1Y[(bs̥2DQFs2@<2br\8QI(9@L^M/V50i0LrC L&.@TGI09EӦ/9&^A {o{hWUJNsWj"^Hs|^0vv7wМľA/I/]I/+I؟ 0H <7Dl E^M70=|xC-ˠL2O%~@KnyE-Z2v W G: 7'6'В]В-Q&pf*FV7ir8V>`KWKa݇crow@Pa_ɷn&h~>`N1K7;KukVN| U+حA=wG'U?d$%z~g@\j :)"X-'GC]@[U1x4/(^W-N.a R |&朗؟h!s{eY'wv!kߪNr\ׇW0Ȕb0-)e}r\SDl}?9+) QTU땅|0S-n} RVsYΩ`zZr :肩rz|$".Dw}Z_(vǛ(vA!wg/F1U##{}!:Ϸ޿ |9(,*۩d|*@Fs<}[A4 jk*n(JLDh j[GaYTh/JVTkP@R9 H*iyZ&T I% [ YOb+ ǜ3j^J륬h[2C.nvUPhRJGC^@s3sAS32Qe9mΪj$(ZErgIib\Hb*uL2NM'tWK9Hu{.q\^- ?)!eEr$ClOfi?(yADMz"CJ ]|v`|7hfΒUb&M<ǓO޲Ã+p)(CZ:l08d!0'23|sݮU Ɂ4lf86tQdւGn%3VhoҞeP^(*_Q( Y+ I$ XMN,&3Cx9ݐqY|%}]Mf&dpZ^1"VNޏ%p, IyC,'#R.'g?V$_<ԙ$RF. 'ᇶJ^M% _@N'vDо ɻKW9qRx /DD~n e[%OĶakqwIU8InR3JԱHԈZ8yF0h8)Q=9891ܱbcUcILM_e658Y^ cEZ8 |Ij>M"h7û;!0۽E.>\V oo;h:(mK© P*{!hWE I ĉ^Bt걜+V+Bd&{8prwm px[NWqz;_xɕ؋\;A'+-'fH'gkPZ Vee4&fb7($S_1=vZUvv Q;ѪOw.%Вh dI.x%+`%Sh*ywڠ*y"s)ycX~%'soԵ<& Q);jNIcGE IS"Ppˈ~P3<-n4yGjլDh wֽ^ ZndT,0Hҕe vIL` d0/&O%==kj>^)dԵYCFu 2_+ s|etD@wa_tGdUl.%@rů:}X"#:P%8dUY Ffg]n}h8$z|v4b\@j#Hd̝`Zhrk \Ia'/JA}XmOc u!A:uRLJ5Q^ij#" ar| eSBbɩ#<9ijY ~ԧd,zHwBmsA99!\`75ºI I+ 'V"r FPls2j]9y\m؂0DK7ɇ+}*wmW'+9%ȦLJcsr-T}%.P2C#}. E-+a u!Cȯء^BED.W-2.W-2.Wry]."!ry].0"$ry].P"&ry].x"(r{].^pEnK"判u9"W\2.! #%ۼg6o@.5r7^Fn[z]B.^GnK#u.^HnINa9u8r2^ InK$/.^Inˀ\^#@u Rr{] Ru9"-Vry]+.!^0KnK%epKrru ^ry]/.\^L.K&% ru cry]2.e^L.Kx&%Hu lr{]H0w "/K&%u ur{];.ox]_]LEeCex(+VQl;sĂɀ@a@ zȔfD jDridS &Jl (J (Jo^> Q/H` v3Sje2hDyeRfT5A-@{Ùn)(rX7]-w$( 𣉠{DCl(g]3\iY\=,\n\'p 0JRdJႌD"2c99O7ԯ\ .ʨ-CEYAEy v;e@EiTn7^AE9U,{BEy2n~ I_Lp:U,5PQz~/((PQܴࢌ57e鷢 ~Er9muc(oMXKOt?y 4b> ?'v)Ip;2veD'OPLWIFں|M3b3?bsі I@8)oB 3`PM1m49΃j+%*$`C.0&Ǘ#AW[;JV .Y.XvKѲd%V/gf^/$_r^r||K$|<d1.% Dّdϣ|<Z(}sGKDZN3  N83jC0Y'iCP4A0yaL^/qɂ`u| C0QS *9jL Ur6@0爈qY9U5\Vt Qu"giSGu`r\C`E ɒ yD&u!z$DqؐKԜˢlQy8MZx,I~Bj\e)x[*@~՜C"requ.kNc [9 qhw G\6/oQ˾P'wO!’Qr2yh5g7ʙΨLK=̴_-.+G_ehw32O՘MHY9vHLvO_., Iz1#jy5FξDst(y9 _=(z씤'HryF_j˿zOz`Blu:e tA@k?vxۤ NP2)z8D>8ex8%++9SA/2o8)\S-:E:̎,SN!U|R1:q}yS2tJ tq V5Ļr.>UK(V@{x*w TΜ36þXvۦh鰟_*+Ҝ. *yDDضAqh a?[2*6I pt]|aT(k]9~ ״#hv8TWf.VY|@EPvPy˾h[`/FN'W/^Fb Tfn(=4,C6؝BX]*tޙeTpJjy&6xdEOL- YQQjvֹ>~9} 犊RO犊RUa1'?d:OT;'y(Tgqe g0a~ZNVa9gˉdlfzd1=GELS- FS;p(V7<~zHӽCDNA40Q_~.הה1 dJ)_ޯ;)cA Jo)- 7dJ bFrUY[BKTװosu<lѴUc5`>ԯÿ 1G 1eG0a,ʟ̔н7Ȕ-VqzTRc 1چ"(aCLY?A'80SfOUXuѮlƢƾ .4ZP?_i7ԔwR u1EcIE z 4eL2zL9y ;+k-E#ν 4OqYT~ǨT2]\Wi* 51ۮOӫk-+Psڅ`qvVRNYrfŴ!fT2MPJviV1I0qux( 8bC-4 ʊ 8dCBq  R#rv&GROBG=ҧ9QA8|RE~=9`s6 OcÐeCo>|I:ʉ3n'68ɱ)li5iqknG8$Ѥ\^U [gd@eẅ́qښ4l<2unp"pKJvܥG;:U9[;įX^z  bベ&gefrYjdi?ޘB2Nw>Y"ޡ5ɱl==_ØmV X3sZ;,Q^԰醆. do<q䣺GbQbmkVᡘ`SGPwDLu;9 \PLp|W3}z'PLN~C1D 㐇Eɱu}tLֱӅd:кQ_KmH8e[TU9|=80 -O$L|-W?U5>he|-DOZjZz&F ѰÏE_ٗgx,3{BKd; >?:n&}vi7y=E{$X9&;#'}_ԝ(Faxr^M@;ĸoΦo(ȗ#H "㯶Eo ʕoB❩-&C9nn LQѓ $J;倢\E;͘Qa08[ݳ/pc pQz (n{ @JO7eDe;4ݟ~wp2S SA`@uNylR| :ҵ!'eNWna]fS"qNI];D)Е)U|O"_R+E[W$xʌ-f)Z>"-Sih1 :evS]-̩SJl) :qEbݙ>/S o۠SV(SVyjzSJCNi6ANi$@NՊ$sއ8%T*~HRjK7cim@[V畎 @yP>94iH=1ČD۳ 99 PN23A9f9@(1B9JQ ۳/@34EDI3\bFBD%m(2Jڠ22_tӠBSly)UZg j'nޤ2OPoTJPuZR%Ծ TRoP)m۹e&gx*% 1RJ@)Sn8)'~Opr2vuKs,D=2iN=qRB gf0lr\$.ҥfw|ff6HJ!Uɞ"75 ..AɺJy!M= R"vCH9jEx\8H9s9ռbZ@-|`WR7H9b#)"HÁHY;L\1;rMBJ"E)$NaE4Tf )g>RBRV 2<J8tA{}7t 'eDHᆓ2Z^a)O ;dd&zcw vBpvm(N PwX e=~H4%0 ]F8(-f| '%+UtE쩾Ϸ٪_ cdejSJNFd|\c՗x7C7eHV &ZqP)Y7HOT"Ӳi>Xߎ/LŤ ɉCRЃ.Ep.pIqWv[~ƙׯWmzZD. d %$+N$ ^8`IΡ~;܌79rD W<6T01.F!3c!o2G{L+Y_ 7s$2XQoU#+畬=0m{ivz/5҃r -PF|bPT"#p.ö\ #Wo"+>3HǗB(2Ѹ<< ?N1)äCm74!  9fڏHCv rHs x"rvF2uh}tZOeT>LmFD*L+* dD0- }09T>GS\iaQk*ӅO5@ױoE/&VlWri{XrsgpG,9Ö$)l>z&)]r>8#>%|ʕ+n"ʟ6OOZʆ2y%ŋ%X?w32l g<\s{} 7q >nǼ]glt]tOyu>@w_hu?LGVC?˒(5gleq?5߇BhDy-߯Msk0o??_p.6ЦrD}%fTKSMR<}^1̯HWdYgx%WϒD;[|$3fQnw*K%`Jw׹?=!1D}[!aCz%-$++78GHJ.M-4ɐdD֑~`%O,1L2maz[d)fe!0<1d_NMV wu"O~/ˮKۙ I4'G2{1$ۘn6(v ѹcǦ=^_qNEfC{%l) XTGT$*/ R2}&;uߞ-$ Q3 [^IЁ(*gC91`p}%x=5brV$ mSΠ pJv^S[anV2A3^/5+ll;2zXk`잯 m6o0J4£c[.Rf:ފtc9UٙU57#8uK(d=anqJJJ&qa1d1s>4{ef%|2]z=bxsgwyFGC9˹ʑP$YQr3y*JFHK'b'?--5'L,rOfvMswaϢ DEv*QrC3V(e9OKn`O%qÇ>rvcDؿĄ&x+YMJZoxۅ'uY;jM7L2֕kI9ͦ^dTv}V~7 v ޟW`s@Q gW=*`CWe\A"2:"}x&m*lPR4D3< #`]2KY -x9O^G58B,Cʦʖc'/c +,h`T8WV2PsR-[dM˒o\v!_*؊Bֶ;k|PVюdFVX+}O㤱3YC]OWWF&OX3_΀:Wrg_Y5oT~0=էqA@]MIA\WfR4_:{.I>2揩#sCD *R8OJ-B뵜$WP)">@6j3Uw^oHe,q fVo%6]Pۧ@+Rv!MПQk!1E*e U;5qw+VWwĮ2@?< \l.6֗iVsC+#2f̰C>_T mT_qޡi 6iۧs`"e%YF\R-%$+zpYfȍXm2V =[{%^>04[T$K@)h -#D^IjUt=ָ0OhJlmKk,I?t^5AMO;:+8a41$l̒&=Y讚o+7>GjW^\CvF.Tl$ߋSJOwkrx%δ"nsp~4ic SLU@f^ SC ap0ts+OvEqL)$Y=rkPe^%z>Astui |%v̒39+T4hWjF˰E?9uDR 2-.bK2w@2-vgѰv5a_ha|M3Y=(Iu"s3+1=DdI2"?%$F␌ qjU;83 s^WbJR@2Eiw^=5osP+k9q?otL[,a__JiL"ʄ L L@eFL $ڸ"1pm)p%/#"Lޡ[sV1-KN o,{=̰C lbHcJlzΰ-DrT{s28%LLw r&BZ3cz :b);n9,pg2OвsII`33{<3 zf -@ 8һ]6w 3-YSfm\[$NP*bd|n^H"Jq*~@4=*hRuohvTۈ%]o]Fh |h/Pif.QK: qiJ56hlqN5|@8ay~7L˦ f#[JBķaTJ!ˌҢ=fyfS.njM+K៲W9hc}['ٜI6uijsZ'ڜI6u+`X'ۜImdWJN¸]Ij$:)iNpo.$: N0p.$: NBùq.$P: NvY;dxȹ@r.dʹr.dyZ';:K:K:K: ,N˹s.$Ȝ:)hi6N sZ'A\I9uxesY'\I9uehI:uesY'\I0:uesY'`uesY'\Ih:uesY'\I:uesY'\I:uesY'\I:uesY'uesY'\I;uesY'a\I ;uesY'9IvP;uR: jN9vNdWLq~sZ'Z?CTNnl.rx."x>(W:W~x 2@MByy  ;-nx`wrBF7ޅoo:'\|E;;dIT"q3}%ED%~lp,!qn]8rnT$v" `g筑$ŎIelE ζ"uO?- v¯~8 ,VOTYlψ$PQ@̘@w籾@I5ڂXjPC_|Y Z x)rA3֘j_ OO.?ϙf$ ,Yx^ү^UѯiaCɳBg%;ɱnź,Df+tNfc=ؠa= DsKwH Be++yMB2c-#^\O B?jbϊ{#Ȟ^AjUW3\k[aWSGc 5:D{d=ͽLHL/*SVH$b4<Ƞ=ǧX>泉5z1NCZa03, քY`FsP}$p{ZV ψ >B=DӁ :x5^B g-@kČ_5?џ%RI2B Ƈ*}Y4Yaϟ:CX7x=zиyKe4Yo?tÐu5 iؚAy{jSwYTsH0S $ * f8B e4l:4Uj5:D@=Lc0faWT Xv@LhK d)vC8Bs@NJ|2zP(/#_5[=#SJF\14|e1M'"I)qdIAZ:~r̟+V)DyX^pA=2 ] ƒĹ3fлs? jP~l와ϯO'/Lf* Y2nUҽ0T`NU6`S ZTe:UNU6S bTe:U`NU@C*[S-Щʆ8t]lC*Хʆ>t]/l8D*{)Pe/lD*(ѥʆKta]lE*HѥʆStA]lhE*{U/U/E^pOU6KDF?T.U6K Re+T.U6ĢK Re,T@.U6ԢK Re[t.:U"KQe.TKU6K Re/T.U6K Re0T@.U6Kd=TK^*ѥʆdtA]lXF*{zTQ ˡ^ d9T.U6DK;T0.U6TK ReC6Tٰ.U6tK ReC8TK$s~]lHG*ѩN$ѡNNUvvtC@PeG@@C$QC`G$okt7N4vJfGN,9.M䳧ŭwb@m _9;zh_ U[-AD{e! M]j|UBڲ#e_>I UzZ԰ [CU{,'8FN !1MKosnvfTA`âuCZNΗxX1)Ie")_lL@a QaM7ʘVwwiicY&0`_A?-SN,A0JJCj2[/D0}$A0ֺO­wH Ւx]iocJ 8-ӈ6ZANK*=M1 f Q=iB咊'32)e|e􎿩yk^֒%̣|@tMVeǵdiJI ~p+L[_+3*V$RrE%ipF){N3ę#3rN,;#Խk+8KRJ6!<9YC֓Ķh%ɔjyKZ}F%Jj h_06(APj(+I+bMfVI[C;w"R_|IRtJW ӗT6)$qblxeGTNrZWU9RV'F"D3GO4G,*)f\$px4煡Ƒ~ӣ|DW4;''m=33YRⷐPy{$WzG+<Ijb_1ӞE[أk 8|=j%A*Ytha}M*` ͍+ 3gx{ tE|ܐ-v.r ޱҴ Mւ&oךWZeXS4'mQ]EEC bN] Ж1=5IZۤ)l5uY9<)|۷mBP3%A;7ŴPعa! 32|:09H^|Yr9z3e +nlu21YO ,U@$C.-Zh b4+Uԣ W(̣xhrxT 5M0"N`(c#SEvHjJķIn'ߤ(W$'b3$xFeUKsxFf$xFVA3jcfOz0.c/8u(#{$PF[kwM'=s֕> 0}BTk$#&8FFj$8FX9^dzd9:f Q K(n%$;]1͗3 $'he$~Y&$8F3tpְ>֡LRTPQ{nNd"úpve P2eLhj4hwP9 0_ٛIbdHͨV %cZ.9P`'31O|gW`-2(F-n٢-AE1YPPF?$cJ~COhŐEIn;~e͞:Kkc2uUnցXZ̙oƺ'FL[VkX,˗]"YG `fLF&F Qhw!W1YN4{Oɓa xxd7$0%FZ0U}v1F%R6h/Ғh!ѻM53 ' FɺA FSq9 ю竊sN$5S3xoq¢(*[H-GLIXX IDyhgE>Uص02(`-TU<]W_"0Za-aI6g dhkD9vyR 8'g0Fə4gHN逌"S \H5S'ٶ_I,*c#ޭMw}OY3zJ"F97HAu`dC5^#tV@9,#'B%>u* *㭏Ѷ ~Ќv,5 _Tgje'/?RÿLVÿ[ ~Ll-:ƒ$($p" #nsD[>fg |8YAp8B´mbP+1o#n%m\ Ufӎ6%uUۣ0xϥ]@u4P"cy m1{=CHsF)1{ߞQ?}O~y&@L.)k8}Oqj 9:0{{<|KY5_rk6y7Nk;K>mb lҩ=>hu۶ig2{oGmNS>B m)ߡ3Zfmwb;~7?YE?B?2Qont $VqRJP lŷ/M픘C/KV(659$4k2/Aj\`yM>hjɝ>Sχ:vЭ.S!=b;JxL=Иf0b&&HLwL0L%a0€`C⤎8K%K".m7)IK8JR|Z 1Bޗ%԰aIDRDa)zRDi lѲ٣l,%%ɔN` !p%SvQJ:) J%GhPm dfe!"1I%{Do+]qLKВ!fH2ĮƤ˃ɋ:|[Hub 3" 8ғAET_&İo!rNIu_ttͥ2{` 8 ג]o(BO0(5 >h:@{ay"8A=rhŜXAsǕ[!;͂vTi`GM1 V=Ez= Dls;"7%A4nOF% ,ؒI803Z͛V$xF34וd;WFN E$٘g^ޮTd"NJ,QQRX Ψ58MbspF9buN&PF(-'hF%e9jP+pFx`PQ8K~P#HF3hI('GI0'V`F-:ʘo_hƉȲ8Eʮe6xB41ziJ@v9݁FgUKVɴ.p1?F.c髦Or;`V4Q$&M0q3 юV}BN' oƄic\h,KW'Fۗ\څS3si҈WDD#3} 3Z6xgVJpF~J?^,zw3J&'pFI8aYEġpFx@5Iz8h Źk |h+]_p8j/?/EUژ2nc̣Әok V}UchlS;B>oϔ6|4`mOjt6ޕCM}`8ݾjנbI4w.Ь }n#j "PeXH":c3݊Gu9A|Gf"} H#3xG+64֒){#e> G(󎊬w,/J 0%Ͻw3EeӐ&]\[;¸ԪѴpƩwHVg3t4]D|x'j{l;Rq3[Egƌv0fSv3,;ØaҰiXv4,;@ Xx:aٴ_ &g@9v~.r.;16أZ5;?8'%78)2#'IФυM\@04Srͮl":P*=Ui ǴndL?4WLƹU,GdK *I $RxH9jǦ}TQV nrpZ>$K~KN+އ$[ґS 󇻞$ hG?Cwo ]Ov,Laɑ _%} |fb!I|W`iTCPQ򎓟w]2`^ 5UK3QW $ (56C5JdFs$"F2AHYL#h2L( (YgaM3LfmAjԝP55-F1.QWYi ݳ.ˁ$.FJUd@UQ3<j~pMAMm8ނä2]?J'pxNn`6- xpl~6A~b]o}lU!C6Φ!glyujИDɻTt8KΔWzT;WDo#ЅցӠ=*52*C59Qa16O,3>RY  oV ٨zmAmgvIlҌwʇ:7NHƧte2p (ɆaD&3hnumԒ7%FeF jAE,/ю6[F"5ǭfF[AEnM=l)h˱"oR|)~mn tˋ=&7K pK^[&&ģ$\t}2̣Q@&wHT˲ hlzD=<~md`EV,ЉJe{'I8H"F0`33-y(Jy ~{(|P;q߁wǘ[Ed,I 2 -c HRnOuڠEšTZTEwTN vTmrOڀ AIΩG4 ^oMw$qІd:nU[zZ,PnZ1(IF{]`CsIbqgd(iOܮ1N(oP3r~ /btfO r|^XFj?)|(|C ~w·@ y)|1Psx_PҫKTB݈y(^@Iy}mʿ6bg)|G>OVU2 P'c)CZNZr:-f)|Sv;k})C8oZ%վ(iY =JO˝͠$gp`KM"V5 oFg:@ҡΛ_dp~IJIrV_LK:~W#?3ׯ"M*U[4H榶?|2p͌R%DrK(RxJfH9e}rJZbD֊f-z9"m HyEoA*ADZ{I첥&l68Es1e(Q*Tc IQ݊YMц:Z HG&SGZE`Gmwi$2V@c(nV LGcwTbwT7KȿrZSgjr #$m6^Q.Gr'7@ {Rf" ;%54}l3ģG}LJtJE?EpSeGU (Q7E'CO{NQ3̣_MojURPE¹"ٗ38>Z|LR7/it+*w<ߓ%gpV(5gM{U~ؼmߎdP$9W"'0{GtmRhhNh[t}+(ģidzx!mM ű)⑗G]4 暴 KROT3C\2#C2x QF MG~%ԣd65s0TZkt?oG%>6~Rvt&G%L䐏7#C=N=QQģTѷ+hJ-IX`hu{ԣvOG Jcu6$v]J hVIn["D*b=C>uFha!ͰmQ؁G$vsA'/fΖm KM1HZpZ57eQ3q,W6JSKO`eT'6j|B{Y(e,zWړf3#IƐЎoW84 Mc!K!c?d,>-+,5>8OVU2w!G[V}2nʉ n0=mFc_uZVrG{46LGr1\1[kS٣6=9&[8%CGYزr2ܩsѶQLj[nWeO"tˊʵ%H~^|G}oDg6 Gid6mrb+ZPᗴg-J:VReꍆJ9z9Yytg'.Sy+QHm/!:E@Eh9|IAu#fJfO&ҊPܕ(U1i:*kS]r)8%R֩%HCT@ZrVK" MJ46/7a4n# Rjfsj"\҂B%aܬH ]' dIp u q$qȮ'M_|{7̒, I %*9I}[,q%ӬIM|8$F!11ڒꯐnl#,jyKw@#*^lz%h<$ۻkڈ>$7(Iղ:\p#[Kav+a$}DV=ِ$?y3@OE+o0I=,F k9zN$iw (hy!?0 %n 9!~`%m؅HgI8HjIweIXH/x! ʠTR $ӼVNMXGUx8L@)i#Y1`m(#d,%)H!%mkS1e+^,#BD-1Mψ=`%刘!$T'AaD`. 0m iIڣS53$ &o ]Vfk9 U}l$YQg\!i(A$gE0IktC+{syxDԔ `sdX2"a,Y~E RyAj@ZHx b@c|[V@s]e$7 UY WsZ@,&uWdQ.bAJ 7  ̱LE3i*G;l׮`xaS"^G?Z71>a}T͠Jl+^Is*ًF%T8z_$w c[xWYIS\$#B+Q3;(:dfMAүoԙG'ϑsъ&/^p02JG{rdxHi]-Ж?n zyFRl zqFAWYl 'f[zD3ڔr1W%s;hx-{֠)Ĝ"Qڤ&KVO p͐q8f4= _#le4pѻɶ h(ă8,?1O~ aDb q҅`Կ쵈oQHӞ6HД%>% |dʐ^|9"$g^x8Vca+~jKC$ҭ\K7Lee[4ѥi)ˢE{z6}֑`H6yl;E˲!pцQl \\u .ڤʼn۹%=/C@6O1ݿpojb\u6oE{e#.ڣz0w.g^_v/.*Ȗ9\wAa('9US]>ֆ퀌\,Pd.ɠ::^zWŮBDX+ƺKRYiǺpd/-8(g 쌤hյr(97wE-gc^5hӣJ[zGĥG_o?mϻK ӌȗ-(FT h';sJ_m~+eFCihF2d>OA6Dh{RAܚڨfWrKzN+K{; 0]E/:V%gnF_&%Gl{I\aZ fi(v C4]9pR~"%<'KkA# h'3wl4}l436l3!B*Ty9Lϲ.?LrZp6ny}\@%{FvDTjQCb́`OR@5lʁ6z-<=uD{(kpLFj"v%w[k(9@yur$Rzi* = D^ٴUQoUG;ҨgxU~Rs*YWzwxy-\_ć~|5ռr So þ:a&Jڤ3z9E89WGWn7NĨo&/ngQf^YX+ў2ofSXw[Z:#hE6f-N\KGR H[VޔJGV椀Bw ;NѱD][V,k`澻2-@ۇ?QЀ\$cX$m;ԣy=2Vq.I}O]k,(X3vH}`X݀"ez 6`:$) /ːyބnnw|{ni{.y!;ڹ >8G}; .p8g1^tLǸ"ڎe6f\>mtG+is<-._=]yIKm<5=`W纁iFCwz?Z.)kʿ${K/l9+.pzSgEn_׏w}k~`ICIcÆ& f.R8dmm{ fY(fú';G5>Ԡ>H{YD#nrQiUp?GxDFYԽY4Y ߸~R/0H{P@MK@z U! 흂7g ;KIݝu1,ND|'9ԑovᝏm[(:ciәgD%HlHcy{~{$MWL??B%$YY^8VAF/#KTEdzPZ";\bJ8?.ϊ~ZmUJ c͉,6T]weS%@^nqi)QCՑj`!U.c U$S4PL#Q{ӲJ*GS. pH;–6͉ޮuJӺ9|ߣFTT^roCl4LB/vn>I\.\$~ "qm)H3t(P^>s!S YI<)vELU?Ѯӹ2 m()S|e4!.22OK ܕs-yYϺ9Q>af_FTd[=P '!Iwv苓u& dXn{{T]G;Q)A=ʡzM-99dz4΢@=zP6D^ߴoN{}ܣGS%'%rхAUМ($_e(6_eVQ_p|JԃmmK~*6TH'(GVS윉̀E#sG՚Ңyfm5FC@Jv-%`jH&R ԛ$aKԻl)E5΢E!~H[ 0рA -=ࠕrKAw" s*hnJ#~ Uݔdti&1Kls#8HPZ %#]08Aږ/#"]iy@Buuٴgs,D|< /8HA=ؙ?@dK1uV9X Z{5&,<٠^EʀC:<N-Rrb i;"lzϔ-eR|׵Cz/|L ,Z;OR60EnwXUhK.P6[Ʋ|\`NIQsgdH H%E7JOW04& #iFRw@͆*0H 4lﺦ+^Kh2=)Fa6 q|XU>Ld>qG6}I~tBTgȰ xFy#)bl6UjG>b%&Y]IƸouj 4, thJA%׋4|@">jg1UmxW f>%ij(Iٗc(Io_%i_|:*;1N;:ulv*j88Tbj)V@'Mi=7լTmv*А>'-|m^fR; pE/@ M JGEJ:K" _m]d= G) RwT 3(Ў)֑&Pɶ~3M \^6#dl \jҤhQ8<#hD~rQ/RJ|j93:Ђ3j9ЌtXFէVϱѾpi3*/9BZTuG t ~EAfїI(v*.[W0nٝu5'>'ywpoh_Dwoxݐ]^\yEvfxE?] .gNgE3CXpfYt93-] `.gE3آ˙lrf[t93-Ù{83-r `.gaNgaNgaNgE3آ˙l lrfh`:] `.gE3E3Cy:34̟3Cy}/ә>rfPt93(] MÙPrfUt93@+] .gE3C/ 0.g03CWBÙnЕpf~.gE3˙rfat931] ]*ÙK{832] Ќ.gpF3@˙rfjt935] pNgF3\әtflt:36:@ NgF3tәtfpt:3@8:3әtfpfpftt:3::` .gPÙrfzt93= W?] _@ ] @.g0H3 ˙ rf8ؙ77v.Nҡa(`픾 %)CR< MW"ڡ:n*t}:m,P.I2dU&$ |WyT-qv>hѺ5LIxU(TjhNH$hت@0Bq$SE`g|mdՄXiGR#CH|i$ D e~9, |CvVnKje$2Uɑ #h#FKTti(aa`BHJWv yha$Բ8YAϖC.y剑įXca$;$yQ ]g ™5] /)JB&5IO 銗5,hDh'ztLD8*!|BRuDho|/ %rNQiA &Ir[2\XF@Ռ?*n-"eJPTzL TPUZNW*wZf*U l"R$(ɝۧJiFpS'^;n&r8EE:H߻^L5_MXCq5dM-ҬW,m巬E>!6`K[MY+fЖvXFRJU珑́&΃|T$=siƧ\~$bH/R4'6^Rs}i7#mL )e]=駢S;,f a!61a0}ۘJ-(S LtJ8BajX)G4׸ľ i 0%p&cfϬn045(<-#R}BV~j+nVj={Q6J3u"R4 ?)%f)fTB^)dPi\p@Ra4NG)G0JQ«Y. J#:v4]͍1.6sf=i{Ԍn9I"lyh&t2WTzZR(iLR`$u,Fy#ĊkU8ihLmp]G֮R9n QtFR#2FI;8$'<-Z!Aj6@.;ruc|x'>눉|/Г3RyqG0*>?Mc/ɦ4@UK4ġ?T.42?Lc.42?Lc.ӘGi450?Lc.42?Lc_Lc.4M2-Ըili e{t]1GiL42@Lc0.42ABLc.440ADLc0.X42GLc.4&Dit$]uğz{%]1Iilili petƖؚ4B2QLc`. 4J2- 84Q2TLc`.`4Z2AWLck_LcNXt*4V, f0U0Ki>B4VEZ Xj)FaXtƪxKaXt*Х4V. w0UKiB^:Lc81??LcaX}raP(G?4V1*aNXt*@4Va2vRJiNXt*|4VA4 4U8Mij:McXiG|֗d Y}yNE-U*99MTԝsz/ߋ簍gi3*<';9VpNauӫ(4vsn_[S9צR9EQje}")#MP G'G2&'1)2JIEJSÊ*s"Z4plLqdz:2L5> 9(4+\ሀ iiܽS:MIG~eVNqծ`2x* 'ZWV`UВ ٍibJ;BZYrzcɡR$ժSTJIuxd"4Q o'B6xJ;phV`6j"U-)&+(Q4z)q,O<(4FwB9 ;6I]o5h}*ԤzYwT~82[=Ѻ}E9m)$+/A=:zmВ$c*/km![,x4%:dc@$eg;<ҶapYHY+FMWo/€Tl>8<;^TXݷ71NR# Q*YvG"Ji׌T*mq~gsS9"Ҋ_T0HYi MJ~T1?;%#|S9)1j>Ր ^S@efey L)q"w;y %. ƁxάwYOԙK?-8aΨPv4Q<:ųOp&C4 =߸TʼۃVvʾq9(}j>,cOLN}n7k>e1CV-ed]#Y?g]g]H&7κ|u!x9e7u\u~Յȫ.Du[κ,R"SF^|Dqx+?nqe8그cܯ{6)ӂq[^dߦu( aM0XOa3>Zw3}\I*oZ!4(0^(Mbrk36UAj; YRo\m?`7`MuZ܀U*ЦTW4egdRpi*ŝ̵ 8ojP*j@o:KeS~O(x_S(x_<Ô[LZNO\t*qmǏ $Wa:Mk'rFnv18j ,jS1`!R-ǵY#EY>9Ls n͏n}z[ͧD6W4^@$} *|TN-ԚjH(VAtzOꢡ~ :ͨl}54ZgCɮBGlja?`W: @Fa:P hm: 9TNثb:Y SA:e%R +SLgD4=yZ"A[U#$XN)hNu88I|cH;WQepN ͩ:AST &WkWp:> ء';+uf9 \%|E; Lvn'^WqecIsQkk\V(8ucD+jN#Ǘ'JJ SM*|Dp }z &&^D`H!C*42+97Z#@5ȇija&ٰi=gN )laLJ4s,x3jz٘:m3=X5~i2U-r ad8VV@:P9)*EOcL+Dg9ȃα{Βxz@tVNX.IN$^Oؤti$=c| @w=latjVN+Hދғ̇Z9tΆX:mHɂQ\(Q ff 8 /%2 84 BqL<sDcU8N%n`o(NOga]uXnTbwi)-Fv{cUlpvxIHɎ*S8UV N˱ӎd$٥/># l;@4g7MmdB696]#5}vHn:X9k]eA 4 P[@$Fss?o1r;$LflorɔW2{0V.ʈ5aF;>zϢ)|6hVO$M=/6$K5%NT?xQ_d{yLɽ &uGQs*j-l xZ7 T4{C~i3/ n ;{_ETlKtEk[zߪފ]cwtw֖Ӡ/Og9}W}eC_j .y[3smhsEW>}{#6Ҷ齧)ˇ){%OyG>O_>p-+x3ո_a<_|G-* nՅwQ?lvF QnN]ĈԀ4,7zk0qX08/a㞐 鳵qĴQWƳQyXLs3hLF٫00 4+8vtkO 㩧0q>ﳗC+!z hx]RTG;EY0wUw3ѿ8 g4^W}7c~{v$4 Yli^5+:_a<|ƣu Q;E\c}&gZ y=a<;;:|D5~$t[)c[1cW7zڧ7S}i#}M{q8gKGLQW./ (Np7 P$oF ibl=a` rm% q` ᩗP~Q9h]ؗA<|T`8kE2Njdh OeRC $ Dfixod^K}Ȱ#U&TɆ=y/T՛&qⴣh,Apq‚t@oJa†4rSs i:eTԌ0jh 6ӒFlК*7HM5̐4šJS5PDSl+l3}(9f:nī52`AfjE=?ULXK T0iv^lt3Ԩzs$T'IO*!C5P[Ld9u_6oR ;??R ߶F^2mtҁe:vKXPeOd)T >ݿDjL@ʼnwxLeVGpLc\ pLcc};g˒~IV'#8G> h!S,%L(i qV#^[in CWߙln 8ƀcnG~pcl{).KY#@ηܷpGmKȒl~EZU`>R SIєl k H?2zU\[q(RbA|-8E$Ye VQƚ٥2vm*UyEEC2wI5)ڠ>%gnPZ>$* jj}><ԧ"ES[RnЧQd5^9EfCX^`=m 6mcsTk[ɂ i4h`kCL1 = 4HOIH@z`i><;j mM3:- u$) Sa32JݖNL%eJyZjI֝4M1SΫAy~e*ds OcuedWHCհqa AEE$;Qrۻiq@=mԌdH&aV{ m_{f76zA p)>,6˴Q96Yjvz0܏:4Nys$XU}YxaLw*3,.-g*5sQr*b 6@NvkP -Gu=q |6:hvHwg̽\ Id5T*ª#ZWPUhXPKN[rfu DS7L4磁gjHhigp2Un zi" FȜӴ!N*)M}W")`d9 #?̍Mȥ|dzT)#`5іToyD(XPKح$#cT xnpY?bzp.Ω^^{=ɉmm6Ui;ue3Я5o__UfXU. R떗8QZ&Ԡ(e{}5JoAOr"] 'eSܤ~LB9+e)J gm\jZ8MKq2,!$m4yZن?n jFjjlf$Y~ L,?(uӀ%+ D#,?| @IW6@Iێ%Z%^wLl {>9NA7~p:9@!vIJBh q :ҙ0G:4Ig€#L`$0@$,h9R$}.HЄJ0Kdz/-c^5Ĥ/ORo;Q#8ȻԊnwAO:.r@o$s=.5J]~l[E Fi Hi? v M {\PipJg{n)h,{j:]miBu_ jμK `,y3`Yj{rJaek gtÈVr2T7HR=G*];6;B-z\lǩ/^K әwc:.5pLgޥ̻`2wI Uo,.+dЙL |O:铱Nhdz/-{n٣7#]G%~;wl:.5Mgޥ̻Dn:.5M]?p,Vb\iǟKN{j_T{D78N{kT7뜪ș*ԜlhiOJ3,o1řМ>޸~}9vNg~_>P_kHO[YݴzEReS}(Y((O>eGeQ0O!=)"$Gzr93R2POo$vU0I!̓cg,Z"S1xx*>O-OO+?4蠬tç% ˊ3)0ZPMJhD-'}*1qgIXFV60McH$.(k}4 ݄ӘQWg;7J(hRIG6byX@(N Kh) ̒/nIɐƂjp4[T;*ܒ/LKs9a.}X.yA-Ҁ>ߌgoO} zcK#KB_TZ0 `HL>t& C~iB[:b܊}+Շ}c ɜĶ vxl~xl9A9I7&tg:7dumpC MV &oW^)&&ؘݑ-863 ԹG1cWc nK8)& 2Y`@Vy2rUv78XuaQg6Y I]j6p/BK זw4ud>טTUd*쪫eD]#3^f$g6v???J;/XW u@nʾKJ]uGG[eq2yz&࠾"Vځ8Mڮ67$ urn?d;SeV{q*^xߕ܋*k!!Br&(.Gx*7&SQ`5@أV81 J]YR(r\[9bl)2 b]SsO16PpbEi=4u.'XSwZʺ2.IN/ !y#*9%=)W!dHL)!YgliVY:MH2aMY()#)xufkzU(SNAl=^yH1b1NAI"S@miGeCgC$}q~GУ)\@GEXܨf`ZNF_Ak0F0 ILYzjG/ -qw۶;TTDyO;rmv,oyjt/Ny~ʁB}5= <8o?BpUNU(xBq7V:"  [FC6ƥ2ʳ#LA SN-n꧂Iw'4#tzjtzr1y{xJI2WI;:ד(Yfܬp8»'!Rosw>ҷO {xUbpYP{ڂԝ T7 ;Uߪf*az`O]_jlXlSqU˩2X8\[ݍ~ أ(UƵU]*2 ٝwQ嵞Ӧ-=Ҕ ('qvmsRؒpM=/LM@{'-8LQXD1}cR2pgh@얯fY-L_u*xe;:rB)uoV}gb-w6W# LvGaj?~N{$;&Jݷn~nd=n6ՌM#Cڀ%R1#ZRN͗bY89/E{JY6x&W_$5I2?I7 8e^PŘxby\9p e_ 1uZke"i]#֡1w7_fk`=E)F;^坭{u?v S#,Gc PPb2jUe1e3)#o s 5.CN&c sZPuSU{\iu.5ZfF;CƓG&QXMJ?տ >aXaN8Q;T NU5=m5yq* ~ ZIljv?U\(_do=b=٥UbA,Q[mAڻH"os}p_EďdTБj:ٹdFA:U%qG}R7Lm膻W?)($ʺ=jk |;Xhe)dkoSZ@-E*-4qVI42ODVNHvk6()9zMwHIY*I`I]$ f$WzsNndrmEdIIF3aXHvDrH?Hq_JO@HA!x;lli-%^G搤$d6%pTJ 9ʂ G9{GP.$'x}Bߜ+( B6j%lJ%ШhԊV䫋$gu%^=~ze`:O+eJ5bo:JScr$Ѿ/d9zb8^l*&1N"C" z6뗪UHjf['cB#¥cUZdD&5Z[O` F*@fյ&,bͻfsu"M^5)c'P1*`ħ7A tjr=]ОV'a=:H"?·\sGM%a+rD~#8 h{AujqtjuAtz)w"b8/r)&xD{n?s-NN+$2i;}9;""ymr-lIեdӱzdձj:6r~@qUPw$^3؅gtKhHu3ELyɔO "(E‚C;c/PLɃ &'.Izͨ#eԞϻ"Hyҧz&1 qo`zOKБA?*u2 kidAZAXpe ȲJX` ,U/5z bSЈ@-ԧ#4Qb ]E\5+QFk2<5">dkj7dDPF bia!1PiA@MJOLU79A-I'rY#֧rSg@U Za tXZs1-P ZA,Y`%^z" =Kޅ).h) K;kkdMp< ܦ\$[@ܻ-]:=KƩ6= %j*K=ԥGT-k󸊉KňDk1=hWgWIG?+6-Lwd ks,߼ 'cj r#eoEi,r2iXZFL#Lzk*md7mt͒nv=Σu}'XA{\>5y^+#{O BTS-M5omTRVMvS-dxdjo#mLJ1k\tth8SNHqZ% Aj+yz|GhtP=Kx{E7-TgNsox0iH6Uں=nz@Hj_*m]+}Ǵuk*m.cHiVkJ[WǤ֍2vn1w׹ *sisuhԾU%xx~?>^zk kMe:`֦)EY@Irk"((T %O.e $q*wBu?K)h(R1`a8= '1..5&[ʗU'dlK2ҿ!%c#[#ox)y0LN12?A2k)AA +/b!=7/wfS&G0`j(0!)PN>ʔyԚmd;H+IY>)+MJdh^utD u @N4:M[NԩKF}cd8(N-Cֱ< ;5nK!ub+ewk^c.I転Wg(P|> Kx!b"%ߤUDδj굞_Y#>L各r>7G?b^Fu gҞ1,$`…yVQ$ P;50TB B0T"@CuY창ңٺ#B-e! :`PT#N-TDU$AH\=AH{N3 Iԫ'4=!63So׉` SS)i<$B AdE- xjԎ(yj ַOؠNHN%-n9KtwjX7k E҂7E$OڒKt '!҇ÅigcF+5wvt~~`lUF}2}09kvF-Y*$vSRYeH4Ur 0xqU"f6QFHee=nԐŬF[MBS'ȁ{i &E O-hQ-`E2}trN+ t7ϞVZi"ƈ! PnQUV0PPaT*Z \Ӄ䍰s.n^1$-.I<52wd5Pbאli=pљB?>ͧH--2Qj K`O=.j dU:H*]0wJ L 7١7ETtgB{[q7z ;NiP('# 7(8eδCtb,c7_MbeBgu:D/ZWeU&6.M#ϘW-{  "BH2k A  B4®A xjb$]E=l~rA1^ Y訨\De-\eImUf/KҠic@Auik %IH$L.,Kwvbc4Bs3kҫu2wB9Yg~Df-j􄫊vXQޤv޽ %W)ZzP-Jo**pJ* lKSl=}"J y('UxR*JI@Jh( ^JVLJ_!ГZX\ͧ2'B'lRA-a >k ؤS4EP>Z9L*g&fwN*$2Bp-T!WEG',0I4\$k %i%I䌼pd%LʻfqdirFҝ MTwrtV8;Y\Ɂ% V"mC8tCDa@K/hI3`%!__Ԏ^IbpI'䫅$V7*: >Rxg}fF'vrNr]i./N?lK sS!D]z&O9Lr=#t+mֳ=y lr |^0g_ C7$nJ Օc47񬴚8~W;ݢfq"d~aи{y\-wӭ}rk@ 0p} b=TD&DaI=apAfZ| :K:dPh?մ=bߩ PӸ8k^U~732^ ^p#{cܦQzjҹW^ߘ =u|3N S9 ~y3$)K Du9C)k.]8 ʍVVbTGrm3H6pbh+vރ_l0jF`DF`jdߐ?' bϴ"γ3]8}/o9I]>"=Kcs4O7s Č1mS;X;'qZd`|Ї…W돆:b T1hP/AU Tq6xPBGlUQؑ,7C֣"5UZ72N=Ķ*uzMA= i cv#l=Ȍ`p'N*\ɇr'd|I [Z D"kqxb"yZ@D=gr5S_eE&|컌@K7嘜@{߰]q Rf>? ӔQޙaXPfc3]LƟ4 yd޽ޕxW#KOBHh(:),QhV wuRDړ"e_ɝQPNIX7Rjv S+$Y3(N.R ?PdMC: ?MtKo+>|!:{\tNMzxMW'UƉd! (8McgH3k?²kp8T'B4sՠ\ekpfV8L#ۇ0LA1at))h=5 SMs7>KC6QT*4`6NQ<)CW,&x~Kw}OĴVYx^EZf`Ճ%Ò٬6ќؼ46rSY;$ ӛi۬)¦̧gyʌmAbZ.i,k:=FZYnv1a;jfc-HL⭩6Ԉd1l2E͐x<St=+Qɠ1Yt$ k*tP7ퟝӣI'ܮ7`4yD߸14LBK޸iyxMBLAUfM-uB^V|˸iiÀ4Ҵ#ýi:h0<6Of!7MaF {F_t֓ɢ{PǸhgY^=J',`Zx&hA3v$N`)X i 5Y^5汞CRi:ikM0#a*`y@6Mqn|^ J.+@4%2]ٮ4qwD Mx56=q{[uK[{fTd  Y4_fX<m_2Gۧn qdSK ©j8U-5T` .8\uehTp!ȩB SXUvg…, 1hNb*.ĺJuTq!שB SŅl 1Nb*.@U\Tp!&S䧊 1Ob*.@U\Uq!&T0P`*.@AU\Uq!BlhND %I\ Uq!B 2TŅnHr2N\Uq!#B JTŅ 1HQb*.ĠEU\Uq!3B jTŅܨ 1Qb*.ĀGU\ sƅؘbc߸VMq*Uq!&Bl(@+}NYpł !UŷIbТ*.EU\Uq!1BlHi\1Qp!2D\Uq!2B dTŅȨ 1Qb *.@FU\Uq!2B dTŅȨ 1Qb *.@FU\Uq!2Bl([P|vkJ\MI\M?@FU\Up!1B `T 1pQbSyb .`E\*U"EU8Q-LTupJ_#/>Tڠ?!iTG}(zTZvԎ`#R;KPthYFTÌځ0QSI(9ꠢ) |D9CK]\XAD9ʅz|5:NLy#hܹgOhNКo ː-w| X34{kN ʕTBATWkBs.*9ᙀO?JQH}B wRFL!40>z-4{*ȧVlaӒ e}1,-3{zbVM'*V`n 8<:3 8 bC֫f^,P@SG-CP*z&T43*OjN P'SR(3ΪF;A] F`tm+1Pfħz ڊ x Zx7ѽ}2V9uO+y%F)zBo d9L7\w'PUO*iAUy&%HMH2J"ˁ,XOI3,*wdKO`4YTzp @u? ;ꋉꑷTjvq %*3Yi Z.ZlQlBr?B$٪Q[zYv|E INHԨ@ZT3K-=kPK¨PC 5U3>*GUCJ_{D=NWlT[|dU%tR7rQZOJÓZNꝇ$ڄN:|dHi0ÊŇ͠j>̀fذ4gl3US+ * S]rӕ€ zͰSz3+)W2-G`NY U _GޝN掠4g5 tdgʭ(뫇V]7t .11LTo*3x7 Vʳ#rvth'Z IȱBQODc$5OfڱmPP+ ʗbdm@$a@j/ OCSbxr=yn9 ?@7'cj7^L%+r. =e'$mo]?Lo$vٚ7'HY?r}zoO;M7'WZ4e$m2O <$o4Ӷ;|kq4j3H4-Q^oC&ϤwG7 _M8>Ey /[pz'swIVh%$1q7>yכ65[TlNE{M)`Csjqo߰,S7$H'+"oHN/qaNЅКVr;exd%loI.ª2omJ2Th0څ~[kEZp;zC&_4o0oە!}g iQD:M;@:q ~hqhd=wVN m["AInu2+'7N΃jBvOzlNϙ\ 3%ɉ[qFwd^IjttғGJ5ى3${ԅ3v7 [͍0%:eODѱu(:={JcvōwISao05PKR83(.p d;څh eW%)W!Mx kǕi`S>CqK2Syi7ـƵ`Jb^|/!S>ͷD3Vh!1M6*_8!*_Ԡ_nyq ?ۚ?NUXǨUZ#ϯVTts`çjMM I Sj[fMT%IR| 꺏 I}˱P8'aK[D"4wVDT(Q9NjA}zTI$նx:i""UIJz+[e%(+TmVYxF Y&M=T'?\*c'هR`?)*|HVh_TqR"ڙh74mTЩZCs>MehaSMe|D Q&uG#PW> B%Ap:MZ̰0hI="+>v&I"F a9Q[UE#(]j *!a86* U -{:jodr]4}fDG5ډ?x!U}>(=!1à192 n@UodXCMDSd 2u+EkUE]=='UMaI v6Hm:cw$2t}VwaD4΀qIv&=c'HY󼅡 zTde$yXIs\PCNpX9O]Ћ(7+^uYFx>z A~#7)+^H"7RūK^w=f/45-Re݆35"~ T aj=M۞0r?ւ0%Io25+-@v3Qɩ6<,ۏ:vדe'! S"s Tr&|giC&=ezABrY 5BsC 7$~'͵ޛpMzi$4huYxIƲWΈ2AWB>,>> 6aЖ.'y@yJ-[6P 6HD Rɒ3a Ԏ%4(,&~nϭ7zC~5%'dᏅm<$3YH 8\!?trBϸ}xOٟ'_Q(]/ Ԯ2WEpb;'cy ީYnʤԻgPd_c7<;̣sJI!+2yt]ZzXc3_ʖ̩(l`94_rKAr[<TQl#]Al*4`7"5φtC%|,ۥ%*bw鼥L8dI wʝǫ ;ނ4HӍW sU(M?hCi~DHp<爋 U fӦTYДh gБfO qK |&?{Јk 7t&g0q3`W"-@[~}si_oI`=?b5N41~: t*Sub)õa:] ':NV5:9%c`N tp.!X\q"c[q2ƾi]8Uӗvߨ<.\I}`b ɳB>ӯo,xTѻSEnA zw}4 uN=R>wz%П.] \/d \ѿU[)!ާy' @]BA \!K{=87!R[_Wnoه~bPAP^`݌cw= w7hСn=<wX[JvP`@n(QA!4 定2(UNVe'ѻTrxUy{pU2aOG9+]NX۞HGEHKoAnHRaIU^2Zkc=j]crdu]zq؞Tʣĉ" g3VvJ4op#}"cUq2ZB㾵8Mj-r:5T54\Ppo OU>UѻTEnT2˖eσAկd;\cQ쵐MC2r^R-ţ;n>gTc*d A`R]*`S?=O3NnT3nTӱ%< @3o^+ܠÊw MU`SHp?:UzqH#xBh{hL GW҄;M6a-#6'15xo0U5Җ-W̍,(,S ,N2RHͲaR9x#;R D(eZqjl<#q[ޯ; SS3r2 LS)Щ1 V==!= V)$QH]T xnR# K H%=saBc#i܎OZgXV]{ Im 6mDi+-Q%D-2dUJֽ%b:d4'PDu *vU*ذ(uxO,hO)p qb$ Ćt²*XN+BNAtځFz>s}kj@ fWx?qLx6Q`]̦^b qbS 6&Ds.Кa=rivekr7 1gOxMCRO6}2++Tdu#=fS7ȦoҢMC$-AH ,;Ȧw`wD4=%LA8ir P=^D)wW@M9UJk6utX `S5.{wcՏrwUc#o7w'{ۓV WZ7^ֳ?]~~`_^?KbxdL&5n>MvJ w4Z7/M1" ޷~g=OeRdN4 Rˁ/ueS.S{*7 @cto &ߋٶ'Ʒv%f~:ueoGT/=mv`O8g?̶ez̶E[a)Cf[w_R[(C;F)wWf|F,*3K#'/(D窚 'xP|u^=$L:<.UIM$"X'TbUE>Y$ʌWL~~"^k-ܫwhULSa23l.D"KދhgmCQWuD*eH+JqT]$BǡE?ݏ_xަ[F7M?sY' }B~Q=oiAQEuJ%&N@ji=9zȎ0TXڐsQQ P?7ԁzJ0߇$u.zHӪƝUE4*~ofcmw_[mF`S7pPcIs}^kwP#|U+I1Vl IHa5y~%k@8!,jQ;ܬHVw9yF7uECuS˜4lV´+A@_7eS ҵ/GYBv@ѩ܂Gn;/AhF}$GC&+i2Q%E =9_C~G&::^%@>^')ETd4h sD~-nPQKVR$ :\CI!#$CSM<sӫ ICYށBY9HB5Y-- _)ZE4 ~6[uGf#Sd4?,BN湊€ p`u|#ӛe$\qA=]o ڌ2!IjَaK1Mula x Xp ' 5D|{@752@XJ9eW^$8$Srx7dw7u!MG\qZ#jStjADQ1I"% M#<&$PmN.J7*9ZZ8M=u "IEv2՞TO*J o|) ٓ8"^njM+NOg'(`VPM|Ԧo7/A#΀Pז uw01Dv7-hqiI)yGwW8DZǜ11 {:A|טU[漶'{@ EB:B̷<޲*quO-^pG'k)${+&gd~i2mRw6_Cvl&$d+9exS[Y?R ?|ZQ㪴&8RsuM_d/=ι.#v6lxROj:U9L}ߖ}~9Jͫ?VMmJvwrfLN7/Gaڹq5=>Ve=8klƌ8B?6ΨoCy@Ni+)WiSpSmO]S KIC}O0;E 5lα֘$udprCWLe&YCUAU,wT+- v{=vp2)WrL$-!z1:j hF̩C Fm꾈&BlE:\S$723n($&}eH5EKp bI'T(Jeb#T ;FPRGEԗHB Fj"H_=k#Za:S,bXMsV(f7$DHF_"?DJcO^QHRϷ{Z5KGo701@B^#okʝtycTr+&C~ϸ A0P=@<%*'P17n1"S(>iW4GVlˁ ivʶE(`,gZAcQmw\!S$`bRvÞV%urZClSTRVq]c"ʃiT"ٞA&YM*^scc8JNcYs,;,+P*̦tؔ`ڭXIQ;9`D:qbWI<ӓI'u< -JfrG Eob`j ȁ/1't`ҁ <&y88&w$#hpLh ZRLSzLpq(@e? XL3]?2&P#oz][j߲FRn3Ef:-5`^L;}]@3< =˜3y$:n)&/pT2 Mv8XcR%S&5ۙTVipqcӴ iG$䙤i,u4}xB7`& 46xQz~\zҎ\ҴG~L5#2^.Ś~cZ:Y:4ȣ}4]h!\L/nPP׀gt wW™F74"3JHLj%JdMݮ#Sh4I'W NJ#!f i_"&Li`r90O3~>)lpGx2qZCp\/a89 '{4z:S@q2Yԃ't''x7L0%v]E SzOos+c\2aV.`P&\.l%zO>@w~`)5&=6mFalA@Xkia%JMNwrT.TN~< , ACw@xj61~rkxÕPQrk- WmTD:i]mB)jS=O#ŗAm}K4x1rOc p2&{GI x[9 _mRٷA\2W T81{HS}ܴF4hjVOt,Hױ$bZw7ʚl@VXhSݍHgGIggʦ]%m-iȻݿGةӺmyR`Ou72?O^FS_>kAPu6BٻPuW~;(: /g`Td8ШK8@CuH5 "ոUn gnA^ Rᙣ@*L '&ׇw{ ܙfA|i8X IՂ-x`R}]RRMt+`>c`f ?'<ÄYα,.fsnw؞3ĖdFQf,9U5vȩvZ3)ԔC % =/{~Gဘ( u Iq@(R#&dRlyJ-kD-@IɃdR|IV4Dq^>|">I[o' $wOºl3DS71Q lGL}D >I‡dHlQ:޳"z) |`.<3DX#S%2 (ԃ!F $A@z 9)!2\tDOY:(wիW:M9$=sV 2gBTAP9'?|9D7=4Lڷ,Rj)Wi22M ' ¬P5^Zjᨌexz+#)5JP D/#xr0'J@ =;Zg>Y:F Da"IZa\au{|Vݺ;5߳-6hxu4Yy"{sq?"?A'|/n( 1OU9Z}2Sj!r}1y3*/zrϾoij_z.-v'"CL@A?]ˣy\O Ee$dP$YC`+G'ڙ9Er2J<^9&;#=JM5 MF~pJ o0$%sd* - 8`Ԫ5z; )7#Ѧ`X ԨbS}|a?]^>3^9ia10Vd|1jdEw%#*O#Q[P L',ikYR$<*$/,EljDd+юTHCڲO᭚;8HP,&POr"jWE>I8i4udd:nfB{@]}^=AzVO.; Q閑W'!ѻghhD H_+8OnE`RjC(a|EG;PL`NH_tU£0,,o@v>Y>$#TQ%(V3s}n`?IAɝ ҃=2hbLӣISWӪN=X|xw'3/"ybF='ZO#8rMhM+H)7\3b1>ʕ{rUD=R3Bqt5)?*nF6ΎhHT}7djEr2AρPk*CTT|R"NMIz@r Nl$vM-q0ZO@'op\ShL帛yrVD rp>~޲p!. ʗ [#~Me^-;)9lQAu'N8bцsKS!+v53m0 ٮ'9q)CgcQ IԈ0eA>QްB D2planarity-1.0+svn6432.orig/planarity/buttons.py0000664000000000000000000001464511521340677020230 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright (C) 2009 # Martin Heistermann, # # This library is free software: you can redistribute it and/or # modify it under the terms of the GNU General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this library. If not, see . # # Original author of this file: Thomas Schott, from libavg import avg g_player = avg.Player.get() class Button(object): def __init__(self, node): self._cursorID = None self._node = node self._node.setEventHandler(avg.CURSORDOWN, avg.MOUSE | avg.TOUCH, self.__onDown) def __onDown(self, event): assert self._cursorID is None self._node.setEventHandler(avg.CURSORDOWN, avg.MOUSE | avg.TOUCH, None) self._cursorID = event.cursorid self._node.setEventCapture(self._cursorID) self._node.setEventHandler(avg.CURSORUP, avg.MOUSE | avg.TOUCH, self.__onUp) self._onDown(event) return True # stop event propagation def __onUp(self, event): if not self._cursorID == event.cursorid: return self._node.setEventHandler(avg.CURSORUP, avg.MOUSE | avg.TOUCH, None) self._node.releaseEventCapture(self._cursorID) self._cursorID = None self._node.setEventHandler(avg.CURSORDOWN, avg.MOUSE | avg.TOUCH, self.__onDown) self._onUp(event) def delete(self): if not self._cursorID is None: self._node.releaseEventCapture(self._cursorID) self._node.setEventHandler(avg.CURSORUP, avg.MOUSE | avg.TOUCH, None) self._node.setEventHandler(avg.CURSORDOWN, avg.MOUSE | avg.TOUCH, None) class LabelButton(Button): def __init__(self, parentNode, text, size, callback, pos=(0, 0)): node = g_player.createNode('words', { 'pos':pos, 'fontsize':size, 'text':text}) parentNode.appendChild(node) self.__callback = callback self.__isActive = True self.__isOver = False super(LabelButton, self).__init__(node) @property def size(self): return self._node.getMediaSize() def setPos(self, pos): self._node.pos = pos def _onDown(self, event): self._node.setEventHandler(avg.CURSOROUT, avg.MOUSE | avg.TOUCH, self.__onOut) if self.__isActive: self._node.color = 'ff6000' # red self.__isOver = True def _onUp(self, event): self._node.setEventHandler(avg.CURSOROUT, avg.MOUSE | avg.TOUCH, None) self._node.setEventHandler(avg.CURSOROVER, avg.MOUSE | avg.TOUCH, None) if self.__isActive: self._node.color = 'ffffff' # white if self.__isOver: self.__callback() self.__isOver = False def __onOut(self, event): if not self._cursorID == event.cursorid: return self._node.setEventHandler(avg.CURSOROUT, avg.MOUSE | avg.TOUCH, None) self._node.setEventHandler(avg.CURSOROVER, avg.MOUSE | avg.TOUCH, self.__onOver) if self.__isActive: self._node.color = 'ffffff' # white self.__isOver = False def __onOver(self, event): if not self._cursorID == event.cursorid: return self._node.setEventHandler(avg.CURSOROVER, avg.MOUSE | avg.TOUCH, None) self._node.setEventHandler(avg.CURSOROUT, avg.MOUSE | avg.TOUCH, self.__onOut) if self.__isActive: self._node.color = 'ff6000' # red self.__isOver = True def setActive(self, active): self.__isActive = active if self.__isActive: if self.__isOver: self._node.color = 'ff6000' # red else: self._node.color = 'ffffff' # white else: self._node.color = '7f7f7f' # gray class MoveButton(Button): def __init__(self, node, onDown=None, onUp=None, onMotion=None): self.__onDownCallback = onDown or (lambda event: False) self.__onUpCallback = onUp or (lambda event: False) self.__onMotionCallback = onMotion or (lambda event: False) self.__slowdownID = None super(MoveButton, self).__init__(node) def delete(self): super(MoveButton, self).delete() self.__stopSlowdown() self._node.setEventHandler(avg.CURSORMOTION, avg.MOUSE | avg.TOUCH, None) def _onDown(self, event): self.__stopSlowdown() self._node.setEventHandler(avg.CURSORMOTION, avg.MOUSE | avg.TOUCH, self.__onMotion) self.__lastPos = event.pos self.__onDownCallback(event) def _onUp(self, event): self._node.setEventHandler(avg.CURSORMOTION, avg.MOUSE | avg.TOUCH, None) self.__onUpCallback(event) if event.speed.x or event.speed.y: self.__startSlowdown(event) def __onMotion(self, event): if not self._cursorID == event.cursorid: return event.motion = event.pos - self.__lastPos if event.motion.x or event.motion.y: # avoid (0,0) motion events when using the mouse self.__lastPos = event.pos self.__onMotionCallback(event) def __onSlowdownMotion(self): self.__speed *= 0.95 if self.__speed.getNorm() < 1: self.__stopSlowdown() else: self.__motionDiff += self.__speed motion = avg.Point2D(round(self.__motionDiff.x), round(self.__motionDiff.y)) if motion.x or motion.y: fakeEvent = avg.Event fakeEvent.motion = motion self.__motionDiff -= motion self.__onMotionCallback(fakeEvent) def __startSlowdown(self, event): self.__speed = event.speed * 10.0 self.__motionDiff = avg.Point2D(0, 0) if self.__slowdownID is None: self.__slowdownID = g_player.setInterval(10, self.__onSlowdownMotion) def __stopSlowdown(self): if not self.__slowdownID is None: g_player.clearInterval(self.__slowdownID) self.__slowdownID = None planarity-1.0+svn6432.orig/planarity/__init__.py0000664000000000000000000000223711621332016020250 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- # # Init script for Planarity package # # Copyright (C) 2011 # Thomas Schott, # # This file is free software: you can redistribute it and/or # modify it under the terms of the GNU General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This file is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this file. If not, see . import os from libavg.utils import getMediaDir, createImagePreviewNode from planarity import Planarity __all__ = [ 'apps', 'Planarity'] def createPreviewNode(maxSize): filename = os.path.join(getMediaDir(__file__), 'preview.png') return createImagePreviewNode(maxSize, absHref = filename) apps = ( {'class': Planarity, 'createPreviewNode': createPreviewNode}, ) planarity-1.0+svn6432.orig/planarity/planarity.py0000664000000000000000000006461511621332016020524 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright (C) 2009 # Martin Heistermann, # # planarity (aka untangle) is free software: you can redistribute it and/or # modify it under the terms of the GNU General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # planarity is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with planarity. If not, see . from libavg import avg, gameapp, Point2D from libavg.utils import getMediaDir import math import gzip import cPickle from hashlib import md5 from buttons import * BASE_SIZE = (1280, 720) DS_STATUS_TAG = 'planarity'[::-1] g_player = avg.Player.get() g_scale = 1.0 def getDelta(motion, topLeft, bottomRight, boundingSize): xDelta = min(max(motion.x, -topLeft.x), boundingSize.x - bottomRight.x) yDelta = min(max(motion.y, -topLeft.y), boundingSize.y - bottomRight.y) return Point2D(xDelta, yDelta) class VertexGroup(object): def __init__(self, gameController, polygon, vertices): self._polygon = g_player.createNode("polygon", { 'color': 'ffff00', 'strokewidth': 3*g_scale, 'opacity': 0.3, 'pos': polygon }) self._vertices = vertices self._gameController = gameController self._gameController.level.addVertexGroup(self) self._gameController.vertexDiv.appendChild(self._polygon) self._button = g_player.createNode('image', {'href': 'close-button.png'}) self._gameController.vertexDiv.appendChild(self._button) self._button.size *= g_scale self._button.pos = polygon[0] - self._button.size/2 self._button.setEventHandler(avg.CURSORDOWN, avg.TOUCH | avg.MOUSE, lambda event: self.delete()) xCoords = [vertex.pos.x for vertex in vertices] yCoords = [vertex.pos.y for vertex in vertices] self.topLeft = Point2D(min(xCoords), min(yCoords)) - vertices[0].size/2 self.bottomRight = Point2D(max(xCoords), max(yCoords)) + vertices[0].size/2 def onMotion(event): delta = getDelta(event.motion, self.topLeft, self.bottomRight, self._gameController.vertexDiv.size) for i, vertex in enumerate(self._vertices): vertex.pos += delta self._polygon.pos = [pos + delta for pos in self._polygon.pos] self._button.pos += delta self.topLeft += delta self.bottomRight += delta self._mover = MoveButton(self._polygon, onMotion=onMotion) def delete(self): self._mover.delete() self._gameController.ungroupVertices(self._vertices) self._polygon.unlink() self._button.unlink() class GroupDetector(object): """use this as an event handler""" def __init__(self, gameController, event): self._gameController = gameController self._polyline = g_player.createNode("polyline", { 'color': 'ffff00', 'strokewidth': 1 }) gameController.groupDiv.appendChild(self._polyline) self._cursorid = event.cursorid self._polyline.setEventCapture(self._cursorid) self._polyline.setEventHandler(avg.CURSORMOTION, avg.TOUCH | avg.MOUSE, self._onMotion) self._polyline.setEventHandler(avg.CURSORUP, avg.TOUCH | avg.MOUSE, lambda event: self.delete()) self._onMotion(event) pass def getClosedPolygon(self): """If the last edge intersects any edge, return a cleaned-up polygon representing the enclosed region.""" points = self._polyline.pos # in-Python object copy if len(points) < 4: return False last_edge = points[-2:] for i in range(len(points) - 2): edge = [points[i], points[i + 1]] intersection = line_intersect(edge, last_edge) if intersection: # include the intersection point itself, plus all the edges # after the intersecting edge, omitting the last edge return [intersection] + points[i + 1:-1] return False def _onMotion(self, event): self._polyline.pos += [event.pos] polygon = self.getClosedPolygon() if polygon: vertices = self._gameController.groupVertices(polygon) if vertices: self.delete() VertexGroup(self._gameController, polygon, vertices) def delete(self): self._polyline.releaseEventCapture(self._cursorid) self._polyline.setEventHandler(avg.CURSORMOTION, avg.TOUCH | avg.MOUSE, None) self._polyline.unlink() def in_between(val,b1,b2): """return True if val is between b1 and b2""" return((b1>=val and val>=b2) or (b1<=val and val<=b2)) def line_collide(line1,line2): a=line1[0].x b=line1[0].y c=line1[1].x-line1[0].x d=line1[1].y-line1[0].y e=line2[0].x f=line2[0].y g=line2[1].x-line2[0].x h=line2[1].y-line2[0].y dem=g*d-c*h if dem==0: # parallel return False s=(a*d+f*c-b*c-e*d)/dem x=e+s*g y=f+s*h return Point2D(x,y) def line_intersect(line1, line2): ka, kb = line1 la, lb = line2 if (ka == la or ka == lb or kb == la or kb == lb): return False p = line_collide(line1, line2) if(p and in_between(p.x,ka.x,kb.x) # do line segments match? and in_between(p.x,la.x,lb.x) and in_between(p.y,ka.y,kb.y) and in_between(p.y,la.y,lb.y)): return p return False class Clash(object): def __init__(self, gameController, pos, edge1, edge2): self.__edges = edge1, edge2 self.__gameController = gameController gameController.level.addClash() #XXX edge1.addClash(edge2, self) edge2.addClash(edge1, self) #self.__node = g_player.createNode('image',{ # 'href':'clash.png', # 'opacity': 0.7}) """ self.__node = g_player.createNode('circle',{ 'r': 10, 'strokewidth': 5, 'color': 'aa0000'}) """ self.__node = g_player.createNode('rect', { 'size':Point2D(20,20)*g_scale, 'strokewidth':3*g_scale, 'color':'aa0000'}) gameController.clashDiv.appendChild(self.__node) self.goto(pos) def goto(self, pos): self.__node.pos = pos - self.__node.size/2 def delete(self): edge1, edge2 = self.__edges edge1.removeClash(edge2) edge2.removeClash(edge1) self.__node.unlink() self.__node = None self.__gameController.level.removeClash() #XXX class Edge(object): def __init__(self, gameController, vertex1, vertex2): self.__vertices = vertex1, vertex2 for vertex in self.__vertices: vertex.addEdge(self) self.__clashes = {} self.__gameController = gameController self.__line = g_player.createNode('line', {'strokewidth':3*g_scale}) gameController.edgeDiv.appendChild(self.__line) self.__draw() self.__clashState = False def getLine(self): return [v.pos for v in self.__vertices] def checkCollisions(self): for other in self.__gameController.getEdges(): pos = line_intersect(self.getLine(), other.getLine()) if other in self.__clashes.keys(): if pos: self.__clashes[other].goto(pos) else: self.__clashes[other].delete() return True elif pos: # new clash Clash(self.__gameController, pos, self, other) return False def onVertexMotion(self): clashRemoved = self.checkCollisions() self.__draw() return clashRemoved def addClash(self, other, clash): assert other not in self.__clashes.keys() self.__clashes[other] = clash self.updateClashState() def removeClash(self, other): del self.__clashes[other] self.updateClashState() def __draw(self): self.__line.pos1 = self.__vertices[0].pos self.__line.pos2 = self.__vertices[1].pos if self.isClashed(): self.__line.color = 'ff6000' # red else: self.__line.color = 'ffffff' # white def updateClashState(self): clashState = self.isClashed() if clashState != self.__clashState: self.__clashState = clashState self.__draw() for vertex in self.__vertices: vertex.updateClashState() def isClashed(self): return len(self.__clashes) > 0 def delete(self): for clash in self.__clashes.values(): clash.delete() self.__line.unlink() self.__line = None self.__clashes = {} class Vertex(object): def __init__(self, gameController, pos): self._gameController = gameController self.__edges = [] self.__node = g_player.createNode('image', {'href':'vertex.png'}) parent = gameController.vertexDiv parent.appendChild(self.__node) self.__node.size *= g_scale self.__nodeOffset = self.__node.size / 2 self.__node.pos = pos - self.__nodeOffset self.__clashState = False self._highlight = False self.draggable = True def onMotion(event): if not self.draggable: return delta = getDelta(event.motion, self.__node.pos, self.__node.pos + self.__node.size, parent.size) self.pos += delta self.__button = MoveButton(self.__node, onMotion=onMotion) def addEdge(self, edge): self.__edges.append(edge) def updateClashState(self): clashState = False for edge in self.__edges: if edge.isClashed(): clashState = True break if clashState != self.__clashState: self.__clashState = clashState self.__setNodeImage() def highlight(self, addHighlighter): self._highlight = addHighlighter self.__setNodeImage() def __setNodeImage(self): if self._highlight: href = 'vertex_hl' else: href = 'vertex' if self.__clashState: self.__node.href = href + '_clash.png' else: self.__node.href = href + '.png' def getPos(self): return self.__node.pos + self.__nodeOffset def setPos(self, value): self.__node.pos = value - self.__nodeOffset clashRemoved = False for edge in self.__edges: clashRemoved |= edge.onVertexMotion() if clashRemoved: self._gameController.level.checkWin() pos = property(getPos, setPos) @property def size(self): return self.__node.size def delete(self): self.__button.delete() self.__button = None self.__node.unlink() self.__node = None self.__edges = None class Level(object): def __init__(self, gameController): self.__gameController = gameController self.__isRunning = False self.__numClashes = 0 self._vertexGroups = [] def addClash(self): self.__numClashes +=1 self.__gameController.updateStatus() def removeClash(self): assert self.__numClashes > 0 self.__numClashes -=1 self.__gameController.updateStatus() def getStatus(self): type_, number = self.__scoring[2:4] if type_ == '*': type_ = '<=' return "clashes left: %u
goal: %s %u" %(self.__numClashes, type_, number) def getName(self): return self.__levelData['name'] def checkWin(self): if self.__isRunning: type_, number = self.__scoring[2:4] # possible types: '=' (==) and '*' (<=) if ((type_=='=' and self.__numClashes == number) or (self.__numClashes <= number)): self.__gameController.levelWon() def start(self, levelData): self.__levelData = levelData self.__scoring = levelData["scoring"] self.vertices = [] for vertexCoord in levelData["vertices"]: self.vertices.append(Vertex(self.__gameController, vertexCoord)) self.edges = [] for v1, v2 in levelData["edges"]: self.edges.append(Edge(self.__gameController, self.vertices[v1], self.vertices[v2])) for edge in self.edges: edge.checkCollisions() self.__isRunning = True def pause(self): self.__isRunning = False def stop(self): self.__isRunning = False for edge in self.edges: edge.delete() self.edges = [] for group in self._vertexGroups: group.delete() self._vertexGroups = [] for vertex in self.vertices: vertex.delete() self.vertices = [] def getEnclosedVertices(self, polygon): return [vertex for vertex in self.vertices if avg.pointInPolygon(vertex.pos, polygon)] def addVertexGroup(self, group): self._vertexGroups.append(group) def loadLevels(size): fp = gzip.open(getMediaDir(__file__, 'data/levels.pickle.gz')) levels = cPickle.load(fp) fp.close() currentLevel = None app = Planarity.get() savedHash = app.getDatastore(DS_STATUS_TAG).data levelHash = md5(app.getUserdataPath('')) for levelIdx, level in enumerate(levels): vertices = level['vertices'] minPos = Point2D(size) maxPos = Point2D(0, 0) for i in xrange(len(vertices)): levelHash.update(str(vertices[i])) vertices[i] = Point2D(vertices[i][0]*g_scale, vertices[i][1]*g_scale) if vertices[i].x < minPos.x: minPos.x = vertices[i].x if vertices[i].y < minPos.y: minPos.y = vertices[i].y if vertices[i].x > maxPos.x: maxPos.x = vertices[i].x if vertices[i].y > maxPos.y: maxPos.y = vertices[i].y level['hash'] = levelHash.hexdigest() if currentLevel is None and level['hash'] == savedHash: currentLevel = levelIdx # center level on screen levelSize = maxPos - minPos levelOffset = (size - levelSize) / 2 - minPos for i in xrange(len(vertices)): vertices[i] += levelOffset return levels, 0 if currentLevel is None else currentLevel class GameController(object): def __init__(self, parentNode, onExit): self.__ds = Planarity.get().initDatastore(DS_STATUS_TAG, '', lambda s: type(s) == str) self.node = parentNode self.__levels, self.__curLevel = loadLevels(parentNode.size) background = g_player.createNode('image', {'href':'black.png'}) background.size = parentNode.size parentNode.appendChild(background) self.gameDiv = g_player.createNode('div', {}) parentNode.appendChild(self.gameDiv) self.edgeDiv = g_player.createNode('div', {'sensitive':False}) self.groupDiv = g_player.createNode('div', {'sensitive':False}) self.vertexDiv = g_player.createNode('div', {}) self.vertexDiv.setEventHandler(avg.CURSORDOWN, avg.TOUCH | avg.MOUSE, self._onDraw) self.clashDiv = g_player.createNode('div', {'sensitive':False}) self._groupedVertices = set() for div in (self.edgeDiv, self.vertexDiv, self.clashDiv, self.groupDiv): self.gameDiv.appendChild(div) div.size = parentNode.size self.winnerDiv = g_player.createNode('words', { 'text':"YOU WON!", 'fontsize':100*g_scale, 'opacity':0, 'sensitive':False}) parentNode.appendChild(self.winnerDiv) self.winnerDiv.pos = (parentNode.size - self.winnerDiv.getMediaSize()) / 2 LabelButton(parentNode, 'exit', 30*g_scale, onExit, Point2D(50, 50)*g_scale) LabelButton(parentNode, 'about', 30*g_scale, lambda:self.aboutBox.open(), Point2D(50, 100)*g_scale) LabelButton(parentNode, 'levels', 30*g_scale, lambda:self.levelMenu.open(self.__curLevel-1), Point2D(50, 150)*g_scale) statusNode = g_player.createNode('words', { 'pos':(parentNode.width-50*g_scale, 50*g_scale), 'fontsize':30*g_scale, 'alignment':'right', 'sensitive':False}) parentNode.appendChild(statusNode) def setStatus(text): statusNode.text = text self.__statusHandler = setStatus levelNameDiv = g_player.createNode('div', {'sensitive':False}) self.gameDiv.appendChild(levelNameDiv) bgImage = g_player.createNode('image', {'href':'menubg.png'}) levelNameDiv.appendChild(bgImage) levelNameNode = g_player.createNode('words', { 'fontsize':30*g_scale, 'pos':Point2D(20, 20)*g_scale, 'sensitive':False}) levelNameDiv.appendChild(levelNameNode) def setLevelName(text): levelNameNode.text = text levelNameSize = levelNameNode.getMediaSize() bgImage.size = levelNameSize + Point2D(40, 40) * g_scale levelNameDiv.pos = parentNode.size / 2 - bgImage.size / 2 levelNameDiv.opacity = 1 avg.fadeOut(levelNameDiv, 6000) self.__levelNameHandler = setLevelName self.levelMenu = LevelMenu(parentNode, self.__levels, self.__curLevel, self.switchLevel) self.aboutBox = AboutBox(self.levelMenu.menuSize, self.levelMenu.listHeight, parent=parentNode) self.level = Level(self) self.__startNextLevel() def getEdges(self): return self.level.edges def updateStatus(self): self.__statusHandler(self.level.getStatus()) def switchLevel(self, levelIndex): self.__curLevel = levelIndex self.levelWon(False) def __startNextLevel(self): self.__curLevel %= len(self.__levels) level = self.__levels[self.__curLevel] self.level.start(level) self.__levelNameHandler(self.level.getName()) self.__curLevel += 1 def levelWon(self, showWinnerDiv=True): def nextLevel(): self.level.stop() self.__startNextLevel() if showWinnerDiv: avg.fadeOut(self.winnerDiv, 400) avg.fadeIn(self.gameDiv, 400) self.level.pause() level = self.__levels[self.__curLevel] if level['menuItem'].color == '7f7f7f': # unlock level level['menuItem'].color = 'ffffff' self.__ds.data = level['hash'] if showWinnerDiv: avg.fadeIn(self.winnerDiv, 600) avg.fadeOut(self.gameDiv, 600, lambda: g_player.setTimeout(1000, nextLevel)) else: avg.fadeOut(self.gameDiv, 600, nextLevel) def groupVertices(self, polygon): vertices = set(self.level.getEnclosedVertices(polygon)) newGroup = vertices - self._groupedVertices self._groupedVertices = self._groupedVertices.union(newGroup) for vertex in newGroup: vertex.highlight(True) vertex.draggable = False return list(newGroup) def ungroupVertices(self, vertices): for vertex in vertices: vertex.highlight(False) vertex.draggable = True self._groupedVertices -= set(vertices) def _onDraw(self, event): GroupDetector(self, event) return False class LevelMenu(object): VISIBLE_LEVELS = 11 def __init__(self, parentNode, levels, curLevel, callback): # main div catches all clicks and disables game underneath mainDiv = g_player.createNode('div', { 'size':parentNode.size, 'active':False, 'opacity':0}) parentNode.appendChild(mainDiv) fontSize = round(16 * g_scale) itemHeight = fontSize * 3 self.listHeight = itemHeight * self.VISIBLE_LEVELS self.menuSize = Point2D(round(mainDiv.width*0.75), self.listHeight+itemHeight) menuDiv = g_player.createNode('div', { 'pos':(mainDiv.size-self.menuSize)/2, 'size':self.menuSize}) mainDiv.appendChild(menuDiv) bgImage = g_player.createNode('image', { 'href':'menubg.png', 'size':menuDiv.size}) menuDiv.appendChild(bgImage) listFrameDiv = g_player.createNode('div', { 'size':(menuDiv.width, self.listHeight), 'crop':True}) menuDiv.appendChild(listFrameDiv) selectionBg = g_player.createNode('rect', { 'pos':(-1, (listFrameDiv.height-itemHeight)/2), 'size':(listFrameDiv.width+2, itemHeight), 'fillcolor':'ff6000'}) # red listFrameDiv.appendChild(selectionBg) listDiv = g_player.createNode('div', { 'sensitive':False}) listFrameDiv.appendChild(listDiv) pos = Point2D(listFrameDiv.width/2, 0) for levelIdx, level in enumerate(levels): menuItem = g_player.createNode('words', { 'text':level['name'], 'fontsize':fontSize, 'color':'7f7f7f' if levelIdx > curLevel else 'ffffff', 'alignment':'center'}) menuItem.pos = pos + Point2D(0, (itemHeight-menuItem.getMediaSize().y)/2) level['menuItem'] = menuItem listDiv.appendChild(menuItem) pos.y += itemHeight separatorLine = g_player.createNode('line', { 'pos1':(0, self.listHeight), 'pos2':(menuDiv.width, self.listHeight)}) menuDiv.appendChild(separatorLine) listDivMaxPos = selectionBg.pos.y listDivMinPos = -pos.y + listDivMaxPos + itemHeight def onOpen(levelIndex): mainDiv.active = True self.__selectedLevelIndex = levelIndex listDiv.pos = (0, listDivMaxPos - levelIndex * itemHeight) selectionBg.fillopacity = 0.5 self.__motionDiff = 0 self.__lastTargetPos = listDiv.pos.y avg.fadeIn(mainDiv, 400) self.__onOpenHandler = onOpen def onClose(): def setInactive(): mainDiv.active = False avg.fadeOut(mainDiv, 400, setInactive) def onStart(): callback(self.__selectedLevelIndex) onClose() def onUpDown(event): self.__motionDiff = 0 def onMotion(event): self.__motionDiff += event.motion.y motion = round(self.__motionDiff / itemHeight) * itemHeight if motion: pos = (0, min(max(self.__lastTargetPos+motion, listDivMinPos), listDivMaxPos)) avg.LinearAnim(listDiv, 'pos', 200, listDiv.pos, pos).start() self.__motionDiff -= motion self.__lastTargetPos = pos[1] self.__selectedLevelIndex = int((listDivMaxPos-self.__lastTargetPos) / itemHeight) if levels[self.__selectedLevelIndex]['menuItem'].color == 'ffffff': startBtn.setActive(True) avg.LinearAnim(selectionBg, 'fillopacity', 200, selectionBg.fillopacity, 0.5).start() else: startBtn.setActive(False) avg.LinearAnim(selectionBg, 'fillopacity', 200, selectionBg.fillopacity, 0).start() MoveButton(listFrameDiv, onUpDown, onUpDown, onMotion) startBtn = LabelButton(menuDiv, 'start level', 20*g_scale, onStart) startBtn.setPos((itemHeight*2, self.listHeight+(itemHeight-startBtn.size.y)/2)) closeBtn = LabelButton(menuDiv, 'close menu', 20*g_scale, onClose) closeBtn.setPos((menuDiv.width-itemHeight*2-closeBtn.size.x, self.listHeight+(itemHeight-closeBtn.size.y)/2)) def open(self, levelIndex): self.__onOpenHandler(levelIndex) class AboutBox(avg.DivNode): ABOUT_TEXT = [ (32, 'Planarity'), (24, 'A multitouch adaption of the popular
' \ 'game Planarity, aka Untangle'), (20, 'Authors:
' \ 'Martin Heistermann <mh@sponc.de>
' \ 'Thomas Schott <scotty@c-base.org>
' \ 'Ka-Ping Yee <ping@zesty.ca>'), (20, 'levels borrowed from gPlanarity by Monty <monty@xiph.org>
' \ 'based on libavg <www.libavg.de>') ] def __init__(self, boxSize, aboutHeight, **kwargs): kwargs['size'] = kwargs['parent'].size kwargs['active'] = False kwargs['opacity'] = 0 super(AboutBox, self).__init__(**kwargs) boxDiv = avg.DivNode(pos=(self.size-boxSize)/2, size=boxSize, parent=self) avg.ImageNode(href='menubg.png', size=boxSize, parent=boxDiv) avg.LineNode(pos1=(0, aboutHeight), pos2=(boxSize.x, aboutHeight), parent=boxDiv) def onClose(): def setInactive(): self.active = False avg.fadeOut(self, 400, setInactive) closeBtn = LabelButton(boxDiv, 'close about', 20*g_scale, onClose) closeBtn.setPos(((boxDiv.width-closeBtn.size.x) / 2, aboutHeight + (boxSize.y-aboutHeight-closeBtn.size.y) / 2)) aboutDiv = avg.DivNode(size=(boxSize.x, aboutHeight), sensitive=False, parent=boxDiv) pos = Point2D(aboutDiv.width / 2, 0) for size, txt in self.ABOUT_TEXT: node = avg.WordsNode(text=txt, pos=pos, fontsize=size*g_scale, alignment='center', parent=aboutDiv) pos.y += node.height + node.getLineExtents(0).y aboutDiv.pos = (0, (aboutHeight - pos.y) / 2) def open(self): self.active = True avg.fadeIn(self, 400) class Planarity(gameapp.GameApp): def init(self): self._parentNode.mediadir = getMediaDir(__file__) global g_scale size = self._parentNode.size g_scale = min(size.x / BASE_SIZE[0], size.y / BASE_SIZE[1]) self.__controller = GameController(self._parentNode, onExit = self.quit) if __name__ == '__main__': Planarity.start() planarity-1.0+svn6432.orig/planarity/media/0000775000000000000000000000000011712410571017216 5ustar rootrootplanarity-1.0+svn6432.orig/planarity/media/vertex.svg0000664000000000000000000000623511203623141021254 0ustar rootroot image/svg+xml planarity-1.0+svn6432.orig/planarity/media/vertex_hl.png0000664000000000000000000000457511316103374021737 0ustar rootrootPNG  IHDR22?sRGBbKGD %IDAThZ]lT\X[O\%GCk!DuuR$/}h*E.K/q +1R2TrSCwk9}3s޻^`WUGݟ;3ߜ3gjTD̻6fQy -UYs|ͪ{s Wu-RJ}*dq?$jUmj%@D`= 6y3Hsd|\. ވX1bMiCcP":o !> nHJyy"z 0 ~ @JFlT "舠yZ|L1^ j%r[fׯ/_XR Of%U]A*Ն}صkwB%bH#"ϪBƖ1д!pvE($c!)%.f;3zu]]`eyԪDLHH$&2j_ҥK_sX 2@X@޵AҀ#?6H&wc N'h|:U-R]lWY:;C'e "33#wνUxj%*^R1 &&~drfhڀ3?,ut3S^k7ULMxX,k#j7UDD./yDJ@MsjD~id6Oafŝ l 6GC.03y+L:|=y_^jþUgpf>lJzWp\!? "rcfA,6)-m=忝+TF&Kܹ j9OD%"8V}c]֗ֆtj)K]JR;12rĴ$p/+v]Z}i{C§?~tttz}um?5vmiiwjsvϹ VP߇08 "Z0 }Y&*b-a(lm",Tx;>[2j'$3;|֟4h*&"OD-UOM<,1<%*v-F霏+]-Rw=ށx BXZmOb ]>U݁8}@f̒l-㵐 Ml-ʝPgҋ%*(mCPG#{v$˕ADQ6 y^? 7ۿ|Pa;}OdY  tt3'fF2w$swOqbM'Bq HS%OW -fsPac0Rcc7u2v3ôKgrS(V==m mҋ;1}n &H/2"r0D==OI0s-nD#urf'沱nBcc33P,! hT?,eĹLR/yutD Y:& !t`\X7W^d*uqZHP@os&?X fRmƇy&`PW]XG*Նx`* djm'hfyr&Y0+eOLLn*ѳf ^=Wfr#A`l$Sz E JD B!vP3=oVJO 3jHՂw *=+=:IDJ8f2 d18]Q&u`๢N5=03#JG8TG8,َpxb&bˎp4IDUx0Vf :$0juO19I){sRA8Go\36y"*A PORP#Pڃ!9Ua\9H냣P!7Y`ϼ?f{CС 9,"#y^DIl ;"b̉c#\Ⱦ飩꡵Z!"=ZXV$!"*)6P,Q*=G-_E>##9 7A6cy_)uiGD/ PBA* alsso`ddª1LDfRa[\bez$;u!Sڴ*6.]mR/G&yELϕJB>VWđeB=R(LN^;fI_R?ZC)u|DMGv05rF .J`N#f4rOI$ҵF\MbgĒ!8qH<|`DkM Z]ڢQt;_11isݮ.i#Zjo+I53ߔA{*~.~FA3"TDbqcc$8!xuD`eI335##939B-Hp$*SS+ dk {"&351*M3nvm{(8Rϴa,N& f(>Z:rڊ2nskkOi1|fz:0 >xeArzfS;i# $51?\K9bq,;|}24'„}"BTXY@23k_:b$p2$vOG_]hۥ>CyϺ`wnw}bܰm}}J"21i/[2nv}ko飰#IKKN<F.R C,5H.sV^b9gD31I"JO$:P q˘lTzކF:1Dk:EҞ=ATô+zp l& ? q *'0.9wPo.s=!B'-Q͉'a3UצgI66ȆRD6\v=IENDB`planarity-1.0+svn6432.orig/planarity/media/preview.png0000664000000000000000000012043711525525627021427 0ustar rootrootPNG  IHDR@JIDATx{|f-ᖀ bĊbAQ)5jO=wjiEK[V  roD@%L$c6fgw2;fw=|G>pW*$Kex ED)z۴W#Nv*0 er R&J>$ݲlqo?@$n(=eƩ7*TYZ+?qz+#fjS73˶ k*[X$2lL{F8"keN`8 HKP2V.+wסM_wJ8kbE"@hfyѫu9=iA\ 9+x]z9.=.Zsƞ")%nNԅJ >}#vjO}s9gYخ fyd_xkEksHHH0_=̱ہN9B)&K9>+6fGv_91&ą푼D%h83:.ZQtlm"2HdgN/9 0偯J "xk_iLXs谞ˏ`(sQEé+0aZ:'J#&iZo[KAW_͆#rAlWu0 )r]ܵg|j<:_vɗ]Ac$?ODo\X3 CyI#@s\4hK"^@)yN7*sPDdӾ>Ni=obŽMS7+"r[+b( BY?H쌻ƸLQ:*e Gk'j}f::`+jxDDilsSI\ɷQ->"9:`+jRdk!]&aD7'+~%[G5nvP a&*&u S]Okm7z@A`ɥ l9XqoYv-cV19?3- ظD$ɥNd 0;suqHYDqR\^lW;J wj{ظhoNHX$$""H|b( ~"6ج= qM{]D *=bƒ$I, V׆ĐRL- *^vP0z5'(TZ  *c(I'_@v0]}cNI~'FOPz'bM{]Doi ɢ$' U`k܋ HEEE8÷~m\ *ʼnHBNwƒ}qM{]q;qDtMNec={ZZZ?^Vc,3\s+/SAy="$QD+]5$& qM{]@2yyyO?I?A9S:ѣG6lݻwonn޳gϦMV\cݻ7 ;ut~_?N<ݻ۶m[v?\[[zl[n_`^u77/bFm!4'ĕL*$$shwÆ ᰈ_jٳo`~~~iiiii79s|{[dIsn[o(z/??~rz,"駟|"@-!2[CE{74;@'1)%:RiTBX\(5 EdW 2vL8Qseo@$裏6m'466vK_ҙg٥K'| .XreKկj7 ׿gϞ}kZ풒o~ZWXDdϞ=wyӭg4rV?)7nBDLlP J;qe ڋkvKW 2v 8PD"͛s:o}륗^29wq?7ͼqXD>? ,سg` ?}_~a֩eLeۣw^DܚWZW$ԩS' ÑH$7K͑#G.],?.;x 6O>?;wa?Ʀ_D"_RUW]%J;p=~Y>knn>x`mm/>3ԦP{a|!C۷/1DOżCO)8x#6Wlv@n~ZjΝGmjjڲe˒%Kdor饗>֭khh8zhCC?{OL`0xW>3۷o?tѣGG M~СC?}zW`0hb."-Js9Z cŃ>x9x￯޽{6mdR׿USQQFf%Г&Mz衇;8QF5ok/^=+̛7g?٠A?]~m5?_ie~\5TDdnsdX865uzj^9x͇ŕ@hnej~lotzu&lW@M4kH]~~!C r7pݻ;w>~'w}wKzbŊN;-#F̜9sݫVJN裏vE]Ǐ?~^8uKj1d޼4 )W]uw]Y|k޶cǎC /b*g>Sl_X{/EH$jժ~Νݺu;g̘ѵkW}͚5os9OKj̙3fYd_r)h>)OS+K GQSŞRF7<=wq5`=ӦM{'Q 6,]> BWo|#X|Ν;޽^X~~zȑ޽{3fڴi]t;wܹpؗ<Zܰa… ?ÇwN0a„ c^xpGy뭷=zꩧVUUui?㎸2i^Rj?_^^."=رcC '_Z eeecǎ{Ϯeҥ}׫W/=zkO:$Ζ-[j 0@X޻wgqsf{^_"|Z5\+tڵfK.D?tСCϞ={1+Lvegyr)?4Yg- zu9(" GdzW@:]Ia1k="ҧOQF(DaK/[n;9s\q{~կ~{KޒW}OD?j8//O;>Zti<#ځs=7{'N;nDWիY*{|xܢ@ђ|"GJ@ZW#RVPlwTINJs]I /GzU ۂ3DX0l^{Ms655iwFo_|Q3l0A&ͳ.sigSO]`_l%[x6b?wIm9'xb޽Edɞk׮|q?3 D{7PD]+w*"2m/m4$뱔2oicske'N/<:v_*U`/˓ED~>$aÆSD֮]o>[sW_}g}'3TJJJ6mڹsn=zk_szaHU۱j T8]%H$b`aaacceqÇ?Om޼>裏>d/׿u%{ҤIwqڵkp[QQjժSf޶LAaZQ~2ݺu[rvŋ_y)pXxOS_W޿yjWgoG`Er 3=o-"-Skʝjs#WIb~5nWd`xɶm۴;wn3rHYt L:t;`;N;Ыv%J woTyh6ɽezx)9]XpE]wu]t[#zƟwqiEMFᒦrмlM ݻw׮+"jW 3<3c kئd޽p8ϙ3'{Mo/#<7ݺu裏p(2^QQo}%[8xUYT%\έj/e)~corjR6xjۛo9//sΉ}$a7//?ÇҦ}p ?:'LhC ٳgO8cĉ馛.Ѹq'̚5+4A3,,VD^ ӣrUW|{wpzԨQo8}Qbڭ[_]3oF^^ިQwq/6mZܫJJJ?y睫W~7=z=.t]wRF"Yh[,2m{/6?qv8wޕzsSSӕW^ϫÇo޼?y__J,@:Əe˖pr(͛;O?O߿N⋺6<ϡDHRjY SN=묳9N;Oݻm۶K,y.oz~@OcO/~k]m%'{$j2sc(I&J ? RRQ$&!)]77. Gf\0 p78%os%9TX㊁loW̌C 4CP !B%|}gK)UscvE94x%@ĝ7(#Ze`=R W66R oWCK1 O2BR ~I) 7pV0sp8~Nſ3ob{D.y9as]13 W_} /777ٳ祗^;tt,XU }ynj?RTTtgy7p\}v0~A͒١xQN}Jٹsguu֭[KJJ!C1Wr[ @Z"Uћ+Օ¢ErzP={7|gϞ/fsX|WXs_%"---_~}555͜9QDbk Q{̌8[s=ܼsŋ7ND!ʋ.( Gq}mڴѣ˖-1cF^^ԭ[K/Xn]CCѣGs='xӫ~~QQ,_>]x ܹ%\tcH]V JUVg?mrh :vO Bs|m۷%MMM$_bR}UW'?qzE&?Ak^ SLў%ae1 fbvh ?L6MD|7x#={/~UV%{ܹsH8~'W^}СkO>cǎ}8/"U;w޽{ /~O?ȑ#{3f̴iӺtrwܹs…_VV6vXy^5JS[[ ov_Ӎ5CkH0^$ døq㮻:O:?P{o۟_~yĉ _xi? .ॗ^tw?sÇ۵3`u\pʕ+p/~~Сod{ٯ>}G7!Chw>O?zhǎg.%U]n.d (%btYxV{}MO+_2D+u>tojy>nRO6l)Caᥗ^Z~N:i/ܿ<`|O>ӊ^{Ms[|ܹs:::uÇ<СCڝ.]8xW}d` K%W^y%s^~eÆ ^XSS,ڽ ڝʸ 0? /cǎF}pu޽JJJr#FK]nr6q0 r"U}_[!jnW̌dÀ;NO:ュa>@3pǯw浾ݻwwz#9rSN;w6y>+ȃ#'NtMNčHnP0`/=655%{N遭1 ɟcz/|8Çx'x#A׍mH^^v5`@ &}a8FSZZz5׈+$yH.ЀUPP9 T vUo6cǎ5]|qrof6e?* x*))رë[nED~_ÑsլVUV(]Q eΝ 𔗗ܱcvOLBG3rHYti¹ſS θqD2᥀O=T\Ty`$ÉHܵB(2i&m,w„ ɞsYg|w7.٭wvWm۶/9^%[fv'l3D5pvYCBd` C--->O43C^Vt7|;{lG>+2N:[Nk;nk[nٲe+?9)YJlnnя~d|Il ]xqNn%o+u`^BV7=^c` ;v\xq-r5ho_{'k׮ׯ_;t=y晞={z2H>}$\4OY;w{^xa~#Gz=f̘iӦu;ܹs… vҤIsNSS<oD"|+v:uhW!5wܟg"YzC***>};_<3w-//?S,Y"" aGueϙsvE4=ztڴiӦMFݵk={^~oY{n|Ep _矯['XhQ8{~ss)S#Gvڵ߮^hQ<>7nܕW^yWr)={9#@:u.]x?'}&x"d4Y=I,4hP^K/K_t30?}vب7kס/|嗓$3JaÆiSh#F/vGx#q2#V?~K,8ys=wƌw}կ~UDjjj}Q > 5\μR?\[lIG jw>dƍEdN0 Z֣v8]t/bV^=}'WW^x6xccc=+lݺ"ҩS 6H0L򦦦dﬗ҆tf}g .oq.h#fLXg=bĈ677ܹz'y%(o69tرcׯ_;~)СCq?2ӲI6J@A&@u4z#XG*} cٻw;(Ms3rHYt1СC vܩٱcvOL*GEȑ#ڝ;&|UA[_!nvh`Lܷo_ζm>7}k}" jkkG}]mxܸq.]}yiw~mA}.ι7 Bpx}ZoylS'@ z?=nw8p෾-\p6g9rdŊ"ңG믿!CL>]{ʕ+}]ιk|ըQ9眄ӫjpLoǂ%[. ޑ矇Cr)?*..ѯ`؟N8Qg}6lذ؟x;w~MO;P(~Իwuic pKKYg??3y؟^z ״HE2R2z~Iiԝ+w}sԩӫyyyFwsq-^xڴi& /wyo_HOki~իW>կ~K.=ŋ׬YsСÇkQD6m4gΜWB{7M^^ުUϟnݺ:=zO>3kjjzǍwg~<\/x5f/Сp"UV]z^xÇ}{gر/޵kW(ڿ5k.ҩS7~)#GBЮ]/_~O0a׮]ƗBiӦ}~WҲcǎSN9'0i/7"B\(p |JrPśg.mwt)},ʡ@C 46 BqCP BPW4R W[,ʡ%_Z|hDKŕCaX};.*UD_WSv=ʡ # `f,~C _xBwƦMLw}rrh~0@]/ f`BRfK^Z_*̯9tqKUn9'Ƚ 'f@`)(Fʍ'K`Ƿ,^Kuz7uoQCDJ /)8P}Ϥvk}ܻY歗G^*r9kR%('ʘ35Wh)۳;/I΍v+-ُTک=Uo^~6_xd f@qyN7e챞V~oGcH!";'a9N2~cl qZ$f@q`)5XUo7˚Z:vM]Z\8A-ˬN/:;w 2>xGP"o倉eneMD{$AӞM`Dg~nLCltl(_#KG{}e)TYgN$8~C-"^;v H8)*p-OvP_%7;"^-60Kf^qסSq} wH޿9vkj|њ]Hq'5U~{,eH-!sF46w\Pn<9zֺy ׺azOf3"";f;z"dolotz] Y\GLg&\`R:ED63LCzNݴtm.Q)_LGp0vY=g~='uk:t0/l}p$8vgKYӫõH}B3cH=z\s5'O(**:|~roΝ2?ǎ}JJJBWL9r;#"K.ַjW0˧M6jԨ;. 3ftu{Yf\q+W4a^^e]&" >l&|{'p„ &Lzw}}2L$`ڿ1?Ixh?A۲O^+ŝm<шJhG߮`<`~8 ߿.zW=Cʕ+ zN8YD֭[{tISL),,4uY"hѢGfӧϔ)SD矟裥K&|#< ƞ{ϏD"uu;w:ulٲ_w%Ԥ1bk z@M\'`z?7g>MkY)ʥkHIvv:+>{-"ׯ׊ڵkO>dm۶]vsN~vڥ /ԆyQWB6mڹsn=z/`&n+!c@ ۷o >͛;O?O߿N⋺6lpzHn9Ȕ7g[{΍Hпi3e`O9!…u%L}Dni8"`˩h=_y3?Or 7ڭkgm%<,[w*)ɿHGo[ǎmKFɦ־UGכw^MIS$U锲M'D۳< og8I[|[^ 4rd{ccW3=/rIoUj(оByb*bت`۞M]Y^qunA誡oV_("CrҤ5su߸Kvq*E6JG`(nWjͮw4Mg [:_Zw[߻٬gwv/Z =FT:FXRQ>*ŝDDj 򆦖.mkDqb޿i)?U#r{4pL؍QgJn\|ە]_G-0&ϖ#.}H6ca[lm-|P@شE$Olg:n{#%npY\^L# @j'26z F?H0QgK[s-6 F/z6"26M:zK飝be~=N,13¥~0<>A.+_uķhjо^wt_T =i[DD6;v79 O)8rghw̤0TU߮TE}D8"ke o@杆K\{$8_Qk SoU3m:T7iJ5,a HHJo*agh8"Uk @2RQfO6o9kŎoD`I}&nmOK2o4\}DKc UhLrHWKEKOؿz2A`BRfNI8"dNloq` #-J+o߫ ]dNa# `)+ɔ2W]B-˶S5f`c丵ʮ(ү(NjnW|ڸ楺8>PyѠo" ;R^$%RR g>o6;H7qEqc¨T&90W < ە_/٤q))olx_{8n Kc)yhtփS8m9P#CO~Dg"K ETKIS$ke)@Nu?WBr#eq'=9z#Ɩ# 00 @iI*?rFskOQ'ck\"{b30d @u؍T:q2 8եm`nA8YJŽO4l3яzj8ܛqH*hsо> #/vK xl%"9 ^pB'[(ME7v+\D_@@,N^8.Uа7o..8"p1maN6N"UmW^ԫ9 @(>~+NƼ_7+6<{IVViךtG{]~x%ʇ';&=R1*1ޛ*G UlA~;8mf˞m0&\WҜcqoezie24bYm華+xQ!oG_@G-]QTAwa&>Gg. EVKrtûMov;Ovud{j߮0 = 9|WN7HIk! _ @<3_i@Z{P0ܛmFAAn6MU01Iި"v]Vseo|.L ;(6g%=arzF*7TS `B(5r/(ܛK*_xoބɛX9OخvfGWv!6GX39۵6\wpī\{ (D\4K0Du< <3֗^. Ȉ<{W퍥#0L:H$##1hP =`BT/tU'a8ܫ&dQսVRJ $K~nu6,"`燒Wمm9 ~$aJ}] Gݑu~8:ERm[`ZXC 4.8L2r寧 N̂,IX^A0G#]ؤ6aT:+ OOO{"Tx9B14 -S#/w6Ƅsy#R %` pB2r- t ⊊U TGo E,]VWaS|y1 =#NNX)XI*xx5R :0Rvp5aU6-"怲\ljTnpxOֳpdHk 6)+\L+ lKKrs^-~>PTA ה\(L =YMu_, "Edq2e龐{UU~@4`8Ƒ{ɾfPI yc*hVBhM]Aӻkhr@ġad~j}-x!4ʘ-O{էTq6 $Cx1xfqԑ1ar/W UE( -lu4snbO)>a^8.ohve;ү0 !F읶g|[vL= Sđ9n-TA0Gl,Nfb/կ7k%dMO`^5WaA|x/XGx Lg?MMB9Ƴg0Gxڎ¥7$]&QZ:~@T~ZŐ [w5=3g͞d5G"R:U# $ @@V ŘGIgqԗjy\l?`#K wZ[<aq6LJ< `8TAH f2*=Q2'gBJ`256?++9{y},[7du.h:0UzFcidONV\MFB?'C4 ۭ <*/"Y69:RGK eLOqƐi>mk!I]:4!`%2: e69$p$ş8.cW1lZu&B =`Hde^e{Mɰ0[ i#@ ({0+WM$a.!%ν;ݡ! @&g2^g4,ɓ&^vc0>Z;ڍM3d`0cjNP_J#3}W'*h3~)V\39{IvH.bLAv !:u%#9$.N](8m)}a mXD|`q$O: ecfrkh@ k_3$m_dʽdMŴYlUyv!W  3S Zz*}kL 9XQ @|,Er/Ed5NOOv:-nǤVf% Gi[lrbFK.~UtnɽTA[)I64UЀoHnol[r/FNcY |!g30C:B%E/ d92UN7r/U" ' ٟÿȽI8~QUЀxן^XDNƇ 9CM_>?^I? !0Q$6&n3&ES UЀxj7I9$"L=="c/Y~;^sI!nA47`^g^$,l*h\u^(3f1 GbG߸_e30]TAI8jv_!p+ӯQJusɽp5%ajU@4O`7UGr/T;*h?:ʦEuzF %\6W|aN&>0wpe~DD1a@*#ժCFBTA>A:W_cibn:zKܫs)&3Czb?ƿfJIJqr}Qגs!P+o&l*Ȅɰ-"kǜ@"WTA{I+0:fܫJ^\mNWAs0`60?7U#?M;·b!tʬ8|,G&\[Bӯk~ZK,3+PiLm%%R. Bmq^W ڟ`€0 UUЀ)(1$=E2|@A`jqE56lJ| =OX{| I|'@u| :qK̚`ᣭ$s|̐l 3<\"pW; oWI4m/RE 42v =[\w'dPUЙ\˛Y9OYE4` ex~/ pv?Ɏq0d%὾f>_`0\Kt8E̺i/oPk¤" E|jx%e/ޛH q_Mod-_^@}S&rIa U@ Y\"τ|*hdů:Q x#祮^/-25Q #S3~S*rNiҤ4Uv^2_\]<-&Q [YM;guݸ>RQ x#]ix]s`wa{ TGE`<:XLNpU\G^_Gs`c-N0LcEFPM"k&t(c308B~cf|-I]@@D"zE4 Hb76;X#gWɰ0IE7KpS϶ RZGV~-'2ƛeLj^ϝ_,Y)<`)H5:ۼ8t0p20 ?ֳk6p4˄~0/hLү?G0uH 0#ga>c(HvBqGdT<`#E>kܮUUЀP ='[^&McTG UЀI5N7}/8zL5YvNrß_5$a^B"^5| +?)uI?v$D< ӯWMB+yogs|< ܛ6U|$$ ;R^$%BFo6;=ف߄'5MV R󠒳U&כߙEs{r v`@9er R&J0Fwo("5evyjloL>jqq_N#(V FsL]u l{wڧ僚 2l  )+*ef2F0 g]:S$K 20` ү-yE%n,8tWIWWPKFnRd1e/m0k[+el0H@$xֺoW;y}F\*p vtl ;_[)1/4k` :Jܒ{|{ֽl~۽ljduV'GDvn{*{^ԮChkj,j 8<`ƿZzIr^@ K>0SLԬ :5WƜ_{Ot`|1nj|њ] dyJ<̽]Fո9>ܮLvF)͘~2p0;e%9("RUGkO5l@ۋ fh^5DpHNZ*x-#~.۹}$|.خti/#@Vng~)m ɏ7wHr9 ƘeCrPf^]pv@rm0.C}m"7Gk'j}f {%#o|\$Rn 7 ȑEx IߌVb mXї/>? ȶiv3^Xztع+W.ۦEw*/$#@L)Y°%9Ҝo8Ҝl dےѩ6"mx0! _Iw*Nl#PI_0֤*^|ce m"`{c)[x@u w|*NF @.L.`@Dd{MYݚ\e.Vur֤k^)P# *_dr+0 ËwVR.6`ywkH.VbIqMQ ߢˀo\()ީ;+fG rNxs$j>G_Yc }V]Dhob  7k,jwY1U:T_| B̎GOqn#GBh ψ~-0 %o]~ٸvvy>J|` PJ C{W_=f/v7x//^Cr1z`#E"ͭw"OLo$@G'aÈ2[` ꛢwZsv|ZZoFaI&!t)9R#!ˀo\H;$o-Ժmn2<ݢ`_\.?t9Ftn-a~-0 ^IG 'j{Paf}GJwkʻ75 uy#e@.l3{H#v{fþdwI㚄|>.Ň7|3ⷋ2[` PDDdh-';lךr?\Qkh7P<28:*?sa3~9;^)?\h8"5 hyJ5lnw;eVE7@G&T/얆#N@,3uTv֏4:8!I8BzKjX/m\ȑBDD.^s#D `뿱[ 3wڸocJήpD&ۦ61Ev9$};vcc[]Y~y;r` G7B`N8d#-_}@hnJϯ>v3bL8.Euȝ9r8$"2g3kbvmn-"C26a$Erl)_=N7rfqȼѫ:~GcH@$|*(ITg0\pup+wafii-%,c6-@Zbmd+9s=]aecȩy}CZ\`>PN\MP H1j<_`#3Uǎ7W{V^9afW }ɿ Ur(e1thpnu.MԈ*hdW_`"[Ĭ2RZ?];q3im[R#26GV wquCmYv]2IqOץeM(㤸ӱGide ߸۽=v]Sn:xè;4]#Y .B6T5Zv}ci!J((Fʍ'K`ǷbIuz7n"RR@I J7'%Crf>WV01xqksnE,aŦe_no쓋p~@2`@!er[,?VpDɜZޘ[ Z#/iήD:Ubc]Yuebe#]0I3Ęp(FJ(R=>NlW R @ΐI)^ٳK (Ԙg^h^ -jՉOI8U 8D ?9H+txSQ0|9Q oLapە2K @,FN&Žw7D!4υe3",m.Hq x%ςjrvp`~ޞ$&9 7RoWXe GWEJ';"P_" r~s܋hNRXAonxcy :gї |5&L!t<zu# F@!>wƐ&,"GV/k }*6ڐar$\4W/Ex#:GWP6(9> u@Pz}© VP h }#0+lWR0sc84 '\w {/{n&]5׬}up/0]o?poc`HK@(/0.B{)ۜ@z@9\ 6Z";d~#M4+vB,pRdK]̯ ܕBhqiVGre 0/S09H$URZHU}ʗ|v  c2w8:}tlI~R'uv =)8&s\)3o\خ`EW:5DŽI.Υ\MA*Ǩ)nн(~N06Cv @p:Bh xٖkg @gfo=Xϝ~?r ؈hU&Yk`:-g"R$.BJ*glWlG 43g,Nb6MtG֋s/ʞm c`uo2Q&FvrvhE`d%`^CRIxza/3^(q`w<h@vRM'8!uQ8cF9bט RR7 @V1 S9Bzc\I)?{/ǟ5+FM\< '|>8^],=;guhGwVGS FW[\m6]~M)v Γ7Av 7(AtCn} :VfYwa:+Gi1V+dx_ @xCȜIf)lWrh^C}؟A4\$9cv ]v #vp;0/ VldKl'#(.{7ܟc  SEv ,J7O+d)]p#wR\Wv)p=/e|U^x{X?j~ǖe]1Fx)}r]K፵aƁl| lW0@u,Gk$ @}yN7g" kdn`\X<~-. J8'K{܄:½ۏyX ] nw?}x|Mٰ~pp#"!HSZMw%.2^:@ 4נr/8858[:^0\qU4JgR M\*ϗ= 0"./NF[\O:D_<@pzZBP\j6p 0pNpN8^Rc+!g~('/ )]~?8`.@ ₘ5ƄkqP xg y:vE3՟Iuu( \h: E8~[^0y/\xm@1'ix@ NjnB<]ao2''-fa6& 94TɓI@ȺLžFXmY].65W\Wm1d5H:eI`rc_^ ZJFe~MX_vWqp?w:,ם ҇%Rɩªv\+ bKܧ0G&<d`EĎk`4Ueoh[X;m\J!JO h:zQp+6&DŽ]w϶Vk @ڄTPQ3 +rLE 4Su:zz7R%c+3mۮ #Ty@(uU$Sb1a滊ve~0V)xbtϘ%$4S>? '&7+c):l(gBl'aeowq({6q ( 5NeouEy5ƥHv. o#2ǣ#)%6%Ql&&C Zur]=ZK =Hdc #'g^ *V"0ir$0Rld%] O(gWVC - dk>&CYݮZ\/.RdP1V.)U @FI)i8ߕ0"Ppl|.`9NYݮbi8t[xm A2L`]~Z0 ZtӁρTkdTak˩fb6-_h>"ݲlL$O$iWE"S6ͭ|nxϴg#2Vmpz t' lHLDMUJ>R%(+GPY&ί;[Q IDAT% mo"moap^ 4vUԞN}M^Z u,`oz }loZ#sKPVO1E[gEkS$gw_띛p$-ug?Rk\V.C9}.ho({}9.z6VLXE"[h,[Gh?8XlD]M(P%{vc@ f8Vۍg|`m[CH˥/_u?xUD.+ {9 ^`<7H~ȁDlhw2E/>`22z֊=` G;$E,'3ˏeۇ_Dr WT~=ۦ&\@;E,Zavqb5 \QUE"_uO]О鞢f򫲴 f,qչDlVu~װc7H\`f;>&0X~7_p F'"Ӹe9N8&>+\*Ȗb5گ۸D$ɥN=Lq$憂խN`fE񥘹:-vq,7wV8)I2>WEJXT =ق}!0SRSwWL&0=̟A;+IlI)jf`EΨ~}b,fD}Swi۹ c;1K;D$D&q7k SJZxٖK"!+9}aM$$ Gɏ'{sse)*UAɼG !\ LIaNk"dv_6c OtE!47"_ӡ>/b6qWy6 0SSRjtE[DLI:r0B Cަjgu7E-u_$yFbXÒqM"U En(^autn$D7j4 cnXR/I rRwW_a={D$I/$[lB1M(ѓޭͯ+$@)YM)D7\ӯB`f6ޙT~۞MQdݚ؞Mcʼn{ȤqMTMr ]嘋.:`fPDDdh';lߘ?_Qkh7mxAJD$ENB}s-,J603 Gfw-wkB7wq *mV {I) *P?zp@m`X=zgtko3upsw H0㔒_QE+_}H&PS$/ ?RiIz6P담[ & lomUSD)ln5½9m7."/4D*UJ#bQ } yWuzhZ%-`2Ap+wsҞPK^zve#oW# #,)(NN""{LXyCSK1Gc{6کGuNA z}EሜDM&JH"E NxYY5}"j@yl ,:җ)o3ֶیc]4/o@杆K\{$8_Qk SoUS#RMHU]XkmY^jnW}"HQG5Rn)R̯,}a9Uwzɮ: ^wq˸i6U9u < IX}Jq?MYڮnxS:z3TEoPT 6?=lq\] H®ޔlf`w4G@`+(R,=eq<@5 1Its-ÿZ;B{gms- Dž䊔HecbbhpRRxWSv"BH9xLv ߊ'߮(Q=gTRdy9Lv>Gw Kb{R<+](w::KT[cYQmW #V Maߜ-o(]t`p=pJM)9HY nWX`pL)9Y>Zjp0xI8SJoV9^L 7avUɩkl߶{]L0 ~aMCQYu⟃,mWs`&a" 7% bP crIa)RU'NcB `# Sfzx{c7}")ŸbZd͓KF 4hqyQ'*TI&7 Nklt  =@,q]uEn-JX"/-W$aSүٶ3KB 4 5&ͩyR0 S ;8p2oC6Ҳo= /UZ|f,e`!WP me~SE! We`|=3llڥ+@r$E$Ez 2"Ք^kB4ൻh.yP ^0 GL3HO) ~cnwћQ*zs7KZboǴ-qI5_ꔸt7]\E\(@,0ez?ĮLV+g0MSyn:X L2;J) /t/@"&{CRu*Ol}>02/Rr0=[v!rg0M)&Iخ(]b) ~@ 4WȎ7l7iO0 T;'O0 |WVG:UH4S!Fb>۳I6dфb]4!M'0@](RKSБd֔ru!4AJ^J5${>fű*E(*{Eٸϓf P])%|W" ' L#fom$ƓYE_'&('DlpBYΟ3f)8#Fb̋T9 +[M3@DN7clOj{~۱DF^Mb98< %RvvwA|Uڕ"TId|W3 pBsd`8Y@v1޸(Cd3-3YNbLүIƄ*vj؈ p^z17a=šBhu7@@FetR2#0IT7+zkqH((.*@1 HGq'\*ËV("R(Mۦ|4I&) 0&1auOv0 er R&J>$ݲlsV*p* ;]!=>^;HTԅBh S}am8] hcn?kĈǤu6DZ† H˼"PFvvd2ok0鳣^-Zq˗Ť`{u鷀,1_};'v=K^+XQJE 4]}]XNHE$y> T"֤߰WzD9JU=e{`;=H'"FyfMX"\J 5 vPNOHDNQLwpNXʻ75 vPm3)%v-aDn-OGڌM*$@A`;$ڭhؔbH)mLU*v GDBY镂]Dk8"5 h9g`]qe ZjvKW 2vP ˶GL1b}2uخ!m*tJ٦)%a14'zB(|JQ;E$9:`+j(V>7@0$K)^}@hnJϯN؄ 0@DdN ڶ%l!čԵW-"C2[]t%oel1}>yr͝E"oHkۄ % }Ǻv8*"+KS+R:ʇSHVE$(/l{ˋZ}JDDZs4^=^"pDNX"{:`7+:Dɻe { @ۣctF̟Ĺ>pD.}Euz خ  9DD C ϊ${6)e=MVGְ]A39(g۰qRsX_bQ#8J0XWh'N~Ӌ,cseDs\{\jGc,ͼBրatpg?)"o|.笒C!vp#x-yNʻEl7"͈a.͐H(/ruO uH)~vp#f׺شډ˶O4Lg2R O)8rv]V Gdv lWf&qkhide ߸۔wHhה0x Gj,esخ QQfOmϛr׊'UCHI%ʻ7L*<۞ؗɽez +K JY~r5%̯9%JخDP.$Sd|_ Z؇"R[mQ 7twɥ2HJ Zo""Rm+wH `){ .IENDB`planarity-1.0+svn6432.orig/planarity/media/vertex_clash.png0000664000000000000000000000362511203655336022426 0ustar rootrootPNG  IHDR22?sBIT|d pHYs ltEXtSoftwarewww.inkscape.org<IDATh՚mhGwz6\Ŝ|(@Rbi+)=( AP$Џҏ " !-)XJ)iTI5ѴFL^nagrs/wI)<ϼ?-RaL9HϷ|Sxq9ƅ#^\󇔲h;]sUS^{W޼LSzڼ,J{iگ@F<5yw;zw=3[Z6}c^D"+>SLج3z9,!!s-fKOc_&r2L5HIu!-eANet 3?a`&$94K~PhqIJonB~⃼$~S?1xkkBsD̾W.b'ot^}XqЭ&#aez5o+WO+\O@@*XfּFŠ]ߦze/-zdn*UL=?7TAz,I4Wz HM{~YĀ=6;6C#Cϫ^Iũlp}Yٴ&U:ϋ ̩^-ZRdrQ2/{IQAThOߤIBn RW6oAD+a : 0e#tRP&e5Wѓ[6ђvo'I:&0xi%sQ3kIx@^y2]Ĵ?HGXqEf6FDx2vTX9r(sPGj/Ut%i+o L0fiJWra[, Xg_c[`PDXmkAur7B jM[w:W)>@W,"6/? (w~{HIK ۑ[q3$}V-G J7yƁ|śv2D|*묕IoZED!V{ V6phd7}~oBz 0=tP ^KN7-VVRUisg:O `>FV'{ I5!*=&f&p2|1CKb"[Qjo?Ѐx?ѓdJٿ=ByIENDB`planarity-1.0+svn6432.orig/planarity/media/close-button.png0000664000000000000000000000062511316435640022351 0ustar rootrootPNG  IHDR sRGBbKGD pHYs  tIME  tEXtCommentCreated with GIMPWIDAT8˵ @F. { &rH5!@ U/c#Xz pg$1@s'$)чolș @lŷ(+sZc(J^%+ 8, 1,4Y]=UFgs\- 47: kؠeRgJoח5{:`.ltcosUAUIENDB`planarity-1.0+svn6432.orig/planarity/media/black.png0000664000000000000000000000534711204564053021012 0ustar rootrootPNG  IHDRwS pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxbf``?IENDB`planarity-1.0+svn6432.orig/planarity/media/menubg.png0000664000000000000000000000026211203655336021206 0ustar rootrootPNG  IHDRĉsRGBbKGD pHYs  tIME6` utEXtCommentCreated with GIMPW IDATc``]ԋIENDB`planarity-1.0+svn6432.orig/planarity/media/vertex_hl_clash.png0000664000000000000000000000377711316103374023114 0ustar rootrootPNG  IHDR22?sRGBbKGDIDAThݚL[?& <с BqUR1j)$4H&֊.HUTmYeJԱ-?IɺV΄uX2"4SI-F8C@?~=={s=W!CW"PA]`&W֩|9phkMef D6X2d0 {@J 7cw螪dlцbۚ,ṙ3ԫReHFP$K8޹I%AջZx /^?CSCtbڇ♬Ҋ.r/5Tm1[ie^vkQ^Ox USbBI` 0es|ky5R@4}zl)W[MP 4,K#A<{QcU;G&ь„J}OSwlXLݵS&K#2f:O}-Pc L$ 0!r1;qu&AZzW߫,6J,an:8Av,$o尕.6hT^8 ENH ;}Y$BK TLgHe?% HD]:hJB=̀_\[l]_ݳe]T0HۥYbs=y ,H*̶:$țqf43Yu g:m5@eSypI*k =ˁb5Kg~𖤁XHz۔5 /"eۃ-^)]z՜8-aWb:7A}6WxP51ijF]Zȥ"e1roƢfL@2U>BuѴq]Z1ێ^,JRlay#oߺ_Q¢HzrLXu]?d=%^+xi * ՙ'L>cB%e7b6!,6%"K/  e@oiW{qH5iܻ>@>@,B"KV81?W>^r㲔PI6HǠB'>;|Kq~:?) i{3oIѭd&/g Te\ NqJRoZ*H*9İ$NISo :k%Ї!F9Y۝dI*ΐ~x&Ռdu]#tOO$s \)-#4Wm;)6 L#viG8 Lp,ți r솸0zs<XՆxiIENDB`planarity-1.0+svn6432.orig/scripts/0000775000000000000000000000000011712410575015627 5ustar rootrootplanarity-1.0+svn6432.orig/scripts/planarity0000775000000000000000000000214011521340677017560 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- # # Startup script for Planarity game # # Copyright (C) 2011 # Thomas Schott, # # This file is free software: you can redistribute it and/or # modify it under the terms of the GNU General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This file is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this file. If not, see . import sys try: import planarity except ImportError: sys.path = ['..', '/usr/share/games'] + sys.path try: import planarity except ImportError: sys.stderr.write('ERROR: Cannot find planarity package: reinstall the game.\n') sys.exit(1) if __name__ == '__main__': planarity.Planarity.start()