factoextra/0000755000176200001440000000000013641202602012406 5ustar liggesusersfactoextra/NAMESPACE0000644000176200001440000000423313641173154013640 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method(print,factoextra) S3method(print,hkmeans) export(eclust) export(facto_summarize) export(fviz) export(fviz_add) export(fviz_ca) export(fviz_ca_biplot) export(fviz_ca_col) export(fviz_ca_row) export(fviz_cluster) export(fviz_contrib) export(fviz_cos2) export(fviz_dend) export(fviz_dist) export(fviz_eig) export(fviz_ellipses) export(fviz_famd) export(fviz_famd_ind) export(fviz_famd_var) export(fviz_gap_stat) export(fviz_hmfa) export(fviz_hmfa_group) export(fviz_hmfa_ind) export(fviz_hmfa_ind_starplot) export(fviz_hmfa_quali_biplot) export(fviz_hmfa_quali_var) export(fviz_hmfa_quanti_var) export(fviz_hmfa_var) export(fviz_mca) export(fviz_mca_biplot) export(fviz_mca_ind) export(fviz_mca_var) export(fviz_mclust) export(fviz_mclust_bic) export(fviz_mfa) export(fviz_mfa_axes) export(fviz_mfa_group) export(fviz_mfa_ind) export(fviz_mfa_ind_starplot) export(fviz_mfa_quali_biplot) export(fviz_mfa_quali_var) export(fviz_mfa_quanti_var) export(fviz_mfa_var) export(fviz_nbclust) export(fviz_pca) export(fviz_pca_biplot) export(fviz_pca_contrib) export(fviz_pca_ind) export(fviz_pca_var) export(fviz_screeplot) export(fviz_silhouette) export(get_ca) export(get_ca_col) export(get_ca_row) export(get_clust_tendency) export(get_dist) export(get_eig) export(get_eigenvalue) export(get_famd) export(get_famd_ind) export(get_famd_var) export(get_hmfa) export(get_hmfa_group) export(get_hmfa_ind) export(get_hmfa_partial) export(get_hmfa_quali_var) export(get_hmfa_quanti_var) export(get_hmfa_var) export(get_mca) export(get_mca_ind) export(get_mca_var) export(get_mfa) export(get_mfa_group) export(get_mfa_ind) export(get_mfa_partial_axes) export(get_mfa_quali_var) export(get_mfa_quanti_var) export(get_mfa_var) export(get_pca) export(get_pca_ind) export(get_pca_var) export(hcut) export(hkmeans) export(hkmeans_tree) import(ggplot2) importFrom(ggrepel,geom_text_repel) importFrom(grDevices,chull) importFrom(graphics,plot) importFrom(stats,as.dendrogram) importFrom(stats,as.dist) importFrom(stats,kmeans) importFrom(stats,na.omit) importFrom(stats,qchisq) importFrom(stats,rnorm) importFrom(stats,runif) importFrom(stats,var) importFrom(utils,data) factoextra/tools/0000755000176200001440000000000013572034661013561 5ustar liggesusersfactoextra/tools/clustering-e1-cover.png0000644000176200001440000005737313144620011020065 0ustar liggesusersPNG  IHDR8 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_FT&IDATxwWy9gfnw&]eȽwljB0@B@!$#B лm۸ےe.V^n/*,c̙3{>@|||_ >>gLض Ccdt)sL  /_ >>@||| /_ >>@||'?y1== g&4M2*ߤq|gFM,b! g&/_ >>3}̄뺾@||^7V pJy렿( SٞqLb8w4@h'`{PS8LpJAP %h](5B($;=\?Q79_0]GS;_̼Bn[0K)Wx <-DOI̳ILSLɛXuj5߸#u,I1q" Py^2E͟by)gyV#KnPY&+.n!nUw%f{)NcԞϺAUq%,| v^}9̺c\X=q: d 2nO}g\=`Ve\Yt}'oapTlAe32Rsf>H.it{?Jtլ<ѩ1d+3u`6DHZfpWRWlǿfx@n/1aptb'՟}],x]w6SH81ȍ3U?<=H˕,]0#-Qp7NS*?"fkYLcEkBVADzF~cDWlQ'm>Kʷ v#ī:޳1C@[YzA?|s>Ƣ~v~qZ(5q{'P>HKo!Q}_j(3za ?e$=¿M>CaA|fg.l Ig12]Bi аkAL(r֟~ .;B} xl[MO~ À1Z6$,^EeȅHqϛj|ܑ6,s?os8Os͏Dc.Ì.Ѐ&j4|xNv; x F0w!pI'\Gx@x';Iߓ[I?sx'ꔌ?z7C]݌S1Uq'1sdf@|'鉝$G73t!)bxsLY%Ûz i2Oۘ<0BZhg䃼fTI^w`x#+9^bjrO\)/'_r)%ͫ*9[g- ^= YKZ ( d@G "QdPaWmh"h(mgsGITq S@FH#CA&)MH=ĤG]ē~tJj"*n$:gFP#j1?;DSbm `ҷ/o}?`77ҹ/k]ºT &{Ywn PżNZϊ[ŒZXҿ01nsGⴉJ]r10[6OIU.'@p;kF_ aK7?GRqY3pGB CLiZģ_gbbZK}hdU?#y߅IySvq #w}>g &B"qr̞ <lW#!NA>>y5h&F&0QER4}OR?{'7'T}1ңVQ7{A]['{v"CX]v`s闾Y틮wwgHM:h='gϋXSӓXEAxѕ\Cb} _@Ĉ0m]3HC+8>8̔M쎇{'xuK):79 |GLM؄bʒ*j)mDkNz%I\&ܴG`E-b6Ӈynoكb"$_J2C]hAԞQz P>HsY5C|} Ӽ*:o\wm~'HpG;)Ϧd > %༫{n`jh~O3LL ++4!_*$@"V A #\+KHry./vbǧXs4]);N{:(OxrQmu{*BX bA^S.k--\39G!a5j QTRqPF]-BMvYwDj P9%? (DD߷o@k ձ)DSe9+4=ZHA0Y۾MU~D S.rM/~cYo 0H=L07 _@ʶ߱oyLr>NJ>==廢>>3D_ >>d+ WFRC6RA)Fo=2B||^{?2<ϋE"]ASD(L  /_ >>@|| gF/SS@||fZ[gyq}<ߤ|䤏 C"1̼4X Uarx+< 4"N!n sb`"Wr˘S8"pYJS8@hyJ#C3e۸]h`(ON}޻t6 6zr>s>x;1t4m+I$r4ێ=>Y闝Yv2Tvr EX"n!7~}+WEhb!ʶ-XDsaAƳXule Q9T_ 8]Bj@ͷ+0eog鍷1ІG)9u4]qMK.9W-(6oرӓ&&1% ʗ[cᶜK;!J(2MQ4. \3Gi,Zh)p J㔦8eiImb c{n*8H!ş,Z[af)J81N9UZXS;u.bRO ʼn)Lfc;.%-ʗvN*+u@eJ=Z2Yœ81A9S@~Eo]}hqXVh;}F6U8ITx K>o/2vt cHmb;9.nz7X/G8ɛI}$"vN,t}_?LǺy=Lσw8Ug{R6R Xc.ᅢ7ˁ}cLDT瘿H>C{q׳74/I}{M%dw?ơ|;9 ?ZJ[֝yrYgkq_"XEt|೴"}0nx?|3Msk(~C?j 7\MmC_^9{?ImsMXyMoQEY:+Y|c-eo&uㅈLTqň>il>ϛh05 MBWYt}YZ>G,4DE//pZ,zJC4\OUU]0&V$-rS6k/B NLSHJ$QvӌoxE=R 6 '7kK>}/ASU=D_ebv4Q BsG Z?Qtm~ q׿J99#UlA:d#rpC35ZUUGVHp| 6\"IZ.h9Eۭa$ʈ4_rf&OP {)P,ћP lSQD,4Te9(ʸkW6 *[0EG5q z7=Nnl5E9SDtXz}AwU㶹REh>FvQ󙽰`?'%N몵̝ws8朳9WVQ7o6^kc["RL11MXI S,(Fe)bN)M¡g]JKA~"vvFcODK.!I3y±ίoAPdi Oo~ 󿣷Y\AME-Ekv-Ig)ʹߴsD%'Aլ/YEtRb8;_`gO I.Ew|Ο11\{ $==AhZHGtD@@!A)ui^s/:8\M:J[C?"A`xaKܖ`/}@}'ׇB:U+0`Oi.8S()fB17س#-c_b/J ג6L))Mư weWmTd}|f" ْ->?ǵ}!3FW5y7ďb"@||| M.~M\ؖ^WBE_syݙ*xUޯ SZ~E y}|fDJ g& ł/HҾ@||f:Y g&B/p]+ /_ >>@|||LLWHTs*:L8 3G||NzzIIX,~fBv8 ]2@ޏU!QJTu=ҹ'ֻ*@\=3r2_VB3zSuӆD]i )ePDȀˉ C9 N 5mp5S؅4YBh*d0Ti괞MYr%h(BSܛ[);hI8SVTeG V!uH.!ݻz=R\ѫ%RB1׶6RvcJ.3/kjQX%!"۔Y>IUk' ,S}̡qI% t67k>XUC0f6Ȋ!z(-4Uؾ@Nǻ3+֠IkP"O&bmwCz= J)p˕F *0BL!(D 76ctϳ@FȀR<^XXJurʞL0KOHzWi$Q f;u#{S3PDٖW cu傮#FuRD=z"JH!JJP&9Uvz=RQNefq]RrR!4%X$}tb`Hp䧔=&Q2ŜcTBʴPB-mC(F¨8fz@{s %ž>m4#ó 4_U" N~+;r]@fcA 0Dٶg D ZH?.}=5H4Yp;9H{o݅#D p)eFz 9Ayj%05ZqiD HKL/N! Z(e1K))S2Ҏƕ]SWu"\= ߣ5/h]DHUJ 㖲^qDFH+h{"[0j0A:D0'QA4"أO2#E '˩n-VڟF;^q X7CvϝdZ@".x6R6!4ޅe7hjBk)_x:jֿ@P< SǪ:`)?\D=a>Ez2ԄnH#ۻ =^w.o#R-@Ax"痸 d#CX-y'74":J]η@~ʃ{Q[84!g"}GѫbYzm袅Hw~%V\ dzUI"5 s-_B;7 Zn)x^Զ*(_0E&&p{)6nb߉}6#ցJ<6@#k1^1NiW^N,Ǟuu-&pQB x:2RU:۳-;Wh59>0j FCb`{ct>d$ki/:d"Biߗ( t"q4pA h8/H},F ]JڳCRN] ,Waj*(0")gpFv+{(s3ũ4לF$M;)r="$h$V~Pt"Ӆ=sD 4AhF(F %D.E{pE'іEP*@,6fj3=IU)MIa BUMFT ӌť4pq)nVoEz4\ <ປ1S?`X2ҐիF<켍 *=)TN&AKϧ)<$At/U<"u+$T̖M2~i3cZT,JAXh7N5鸜b_N-M6 ~T }' *8 Ia/Ek"ʵ)u/*^E8)L9'&*QEodsj%C\.< R*bN!"hLRu=p@ZJ#(O##7ud%uZ (ND <P0m`lk{>8RFegpEn^0 d4~Z悎4N2RzU[5!e-64#`p-74Cyt&%W@XW!@0mDeU$BOЪ-_XD  GQ"=ί5SHp'hk\*DthfwL$#MjVm9P܂SUئ7R^Cv}8$kgƦPUM&8nRФ'M)Q9.;P15D;Zᘠl(bf)nr VW&H&9K-qLsPǚ: zܾ~N)\R~5)a ;ԍ])֡G@녭I7ik;G?8f*(n G al@h%#d,rPEfeמMl.q;aMv{.D)5\=R ){KOQFg舕BF1d۔{T' B`6SshDJ'^B8i]yx+Nz9 5ٍS\m5(3k'p(|&#@9E2e5c/+sIZ#y ')LѪpӏ`Z-ZT>E GpD&ZS`%n9Ae,p9CڨZ!B5A#)MėhlsA9<۞2b:n~l3r8%*i+/y^eFvW@<*)8ЍctBuj" p E-dvYD ՝UFln''Gkf#ٸeW&-x{=ngDp,8sZ5K6*Fhm瞋P`"w\q -k. R.eP"?%"uTqKqX=Ґ"%tv1 [ZE!X'z@RZlH#p!?7ϠDG"^l;kB RN:6hApF BẺ8VaTG@MH#z0ml@=pebgq )]B!FhD5қZj@ Qq@ I8J%0uMCH.P"mA,n1 7EH=[u,)B/}:X)(DO4("`簲}r'1砇,ZNug@ lm"ZK{,-AH1x{qR@.8f%{BkuZ!]:=T1NNYT2c5FUIz%Q):VK JA2Dqϫ*xXYyʳ/D)eQNμbZa w]BUFL!aDQ/N zծEt(Ǜg惸​]*0=tP*BnpLE hB2_d7u4Nr +Ο(jzI@յPk^PrS8x<:~S\ءNu8X4CZ]x=Vo3eH#ZhFYI%{Ya NW/_WÛG%B3tҥ5s~ 6n|*G'0y?KĐz¾{yއ_>r3s愡Ty [8NX/{wju,qWMkPxGK+B7wGUDLSL$C ygC\!SO'e^Cj<ݯrmW!S y࿿pڡi֋^_Z0y{:';!~1po d"yfNP%v>|d#}+[IHH4$B pJǦpUh2 S&;5A$$1O˗q Ր(+x7B-r!"±ȍ/q5P,Iuu l\ǥXeM/*򤏫Flgl7Ef- u6qN88teV H]KϦ1-RbIJF0]"x5P Eft[IZbQRzl.eJ4C#&QA.`:#ڀ. lA8^O<@&J:ξv&m(ס` B*5IvDGtrN1J $_!.ZT֠4Ύf&3=107ܣG֍.2-̫Q ,5–AB3/~HN~ ]Zˍx/ A CxK k*0<st$ ]E\Eca3ܻʌ>mH#3<\pӻX(}Wx~ops'V;x+E$3 UTE- ]D!T[GꎲtjCO}%dh4~׾"CX#MV^{^~ǒ$yccô^v:avoYu_qn>9tt8Cu FV.n! 30zio 2Yx86,nΎzDPpy>z] ړ/.yKAY3 Pz}5̪QDP  \FbVD3gGw))[U 8YRiQY 庸VW?.XDPܗ4t@#MבN6R!Wdk%{:J/cgr_2 Q4 'LUA4Z9ፇ9w JT @CɄ@EWD yZY:Y*ѝQh%3}16 L]ŢYd?N1F0thl9}V ȋv R?1H!2Y&v= Wp z.X#1^-nmGhKGF>4EX*j2 Q}qұm;)MorUR/pGغmGV\z#bNX8?Lfq4([1D*֝s3c'a {]l#α мbW_ Im;z9 ²2^ٸY4s>P^#Mw'4,\O}"?tGP̟-ܞaxãں# hXMfh3Gz&Եl9o3~~}9 9Q,vĩ WDCQU PNʂo'=3mn[2QB(6羍EضHss tg|-ͬfYJZ0e< '8"\U0k Q.-ZPfQ,?Ŗ>e <^_y~+vֱjpԋv }`x 9gqe\SƷ~lr{6Mv|y+p-\h,z%HyiAC INrP8\ t9E4 [^#4eA^4$4zulCPNWǭEZ,ZЈ*@ \L3&{n׵Q09ـ(LAx+ޞsp woq+ "ԙ̤;`3AB~?.Df⼛.cŊ0dm\D~YlۆŬ\'O߆P7`aQN,?Fnmţne?⅟zeZ9khAjWc55GGy|c?O!@,YR i2ӠQkQ&Rzf{y ϣg(sgH^uh \9&5r QukoKB|V=5F}V(`*: tQ'g"g)i顃 OIlR=؈u"l.v9СnJZ4h(ED9HRyI =QO}-{FBA*! M*CѬzH\[!a[=P⚕!ϻth: E\GԐh%8ZF!c{.,x bQøH$RA!*['{D^Su1 9iB'd4J9ܲ@9Ll{064T \r5A/KYtD8wՑtTL_y+@+k^^.xTŽ|)ky9jRhW5 rPզ#b1g)pMu|-g6yJ3Q̱1E%qR/'%ӾrO*=߻a^G\y|zBX#4Y(齘Qt7K?R|g]Ǖ5\zf&}굸ϠZDϯ^FE({1oo$rțu +;(tjț% l>>3D_V ,M+d,𢹅_8(u O7zбd8  RxdK~{_H}9Hd8 W<2 ~9GY):2zQҨᐞa,"#> "2ld2` AL!)2#5( H*/> )LɡQ˔y&<q2G9ڗ!4M1#K. \oƶYotDj>tⱟfҙv)W5#:p7rbƞVWZrKHNq #k6SKV/,cS^ 5Gr"| wW%9U10<>JsX/rA{0ws-#ѶQrE.IsY1:3?{{wf(1.k ir MuB4Ddن^&znv)m~~~cWضO~g/p+D),-F-Op\:Fh[ynS{z{b9+yMD]i,]0w`Q%'ضg'_V6( CkeCN(di~&s(qt)v36ঢNVw6*ؘ±K:5/0CUe-3 @*S~r9A0a#BcPɞQM;G(7ZIBT;Y@6fpI\֥\SBA~|i!㵢G4<3yiqo 5\H3Eʈ`tRVc)EmM֦F.8P~#9pc k#%Zqs$纳k ;4tfԗ;WQgWQ*bN.XTC\2XaC,m㢹14,r&.XL[sCDB` +Tϊ09;wc_E-4- k0SHC.F{ACc UFn][t@5篝ܺ R&RHQ֒z6B7>wdլ[CFdft֡ya5f0ihlU3i%ACqrnV$ j+rL /(N9M47'B#m:QDn}mĂ/fh^kO1|[ljf7@zCSu i2h:&R/ ArD(nE0>2ʈa~k=h2|8^JDm GB8 YZ$ ī5&Q2FP躆t\%Po[iע$Cd,u2m ft%$uda7$ī jH\ʶKފ0> D>{4n+JON:˱r"dkz)SIa?{l\.(dipl[T~(Z^z-vǯ-][]Gڛ'ㆹ`M+1ß ĦG / S04\r櫻kې|tR J~U)d>_ >>3¾@||f¶-_ >>Bc@||N}@]}//W2|@||| ϛa8__/SL& PSS g& Jq|D*= g&tM3d/p]+ kGG_ >>@|||yS>_ >>B gr@he'm+@HA*?5ﲥ6+pmxs '3!{[5FtBCzfQa&I&TFL%ԼOUӽYNr"}srp*׷֠$zd8)2APQFt,r!мvc($BӼ&ޮBCH(!텭#~|B9dRd c͔eGyUBH)ʥ"aX5+X} Ф 24#S(=B('S6ł3SL Ktu>H gvb4urMud&zسG<;TMUq7]yûJ=Y*xݵ秘.e1t<̽ xVztMUͩpĮ}5Wpa>tM YK=὏t`Y7o`X9糪g@%픆fxFPDV/sΥ.\kkb)@s[ ۓԷ1~aLh n6mȂe׳wz?~!sn`ϖ2&M /%s# FkD璙@\X-mi#ifCw>F\A'NF``x;e\Kdӓ?"m-h@{{ݝ$+@`_8̑L&V:Ϲ :Xfd7Rɧx'sxsٿ]{'haݒCJzl^7"k_9.:9Iׁ-ef_l-X\E,cdy>lM05m;ehAw1.z]{g906M]SRuH\\V΢} x=7pxrrqAt@0m;H8J\ORSLCM gNg(9kȫ R,BugyGYƜ&j GjioK Xt5uĂlk$5Z$20#DVnb&vbFZsX#pxhƺzA8zT 1ƘJ16OIvr~ӣcVm 8Msp X8wA=}k.d~s-PC"&NTFB D!&O=Mpkx"#^IP(C8RV~A9*\(u!@ e 4p2`imx t(gp-~M,W cIXiP 9PApJ' 4ȧ@@pd 2g N=uYK.c"+EG鲖dO{ (_>迿>~xϙ _@||^ej9%R%}||^L޶X9IENDB`factoextra/tools/README-mca-graph-of-individuals-1.png0000644000176200001440000021367713572034651022151 0ustar liggesusersPNG  IHDRDU iCCPICC Profile8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o@IDATx]|TE[Rz{ ADEŎώ{;* H{o-i9&m.ey3mvr-F@#hYh4F@@+]#h4m1F@#h"-gП4F@#h F@#E@+gП4F@#btR;e͚5pvj~S\Rm'$$xݾ7׸ƽ|̾}WIJJ9s̙3e޽noٲEjUVJ/Xݟ2lذ<Ǡʈ#Zj_K\\\qX䩧xyGȑ#~2p@s74F3!pOhFfhiܸ8l6[.:|WH͚59kז>8?5&VZɣ>n\}2h I;5<}x^>}d+ɳﯽZɷnݺ2`5)6lP7===<gΜsbD=읯-gbu|qTHe]͛7Krr06VZyqJ_%pHLLLgV _.={TX}yF@#P 8|z;wZ5JA<T&jN\._\;ኖW DUM7d^Ƙ1cwSRRdӦMr-/y7uӧݾ}{u; 6Gb)t# n@sn j]vλ|@w|j? 3R6^5F j%TRE[ _XBs2|wU<}VUtE曕9 C5O7h}/}rp@e~[, sϩ3Rw'WZUv*ҼysJ3<3$JSN:thwqkwիW}M6wtrUWKd2ɇ~XХF@# ` $Zl;Ypto&s9 txU~)_}2s>믿sNǸcMˇ;yf͚) +]t;dqSիglz|N: -5= .Y06(x{!ׯmTh%qge=Qh4Щ@pRʞ€>J5ԻwWh_vzђN{-6g̘!-ZP(c$83^|"K1L2E_Ni@$O'ZlY8)At#Ok0ށaCTP8+>xPy@"%Tشh4@x^ |]mӦq2ʔ8F؃GA)E牏m1sqt,X@)'\?ꖞSGWȐ!Cz5(Kƫo߾>Gb@q,Ns7'H9oc(dƔEg1\ƾ%K3 8![yUx; >H]}v_:uzU5zZm&/o`;ÌZ2hwZ) ڠA}:8t1ϋ>Z ͛ڜh4'B&in?27T,#GTwuW1FchoV)>\3SF3 a >c52vqNL{Ý\y*#+o}{勇X wוd1H7N,?O+(+SA f9Qr6wZjw.%q'ҠEOh4b *qGL:]'LyKd-(]LȕwF FE׋M#h4V B)1j4FKb%P4F@#Z1Ǩh4/Њ@ihh"⡷4E@+EץKRRs0 )O<LCRcA믃n\A}oL߽`V 1 oJ[F@#(h PF@#hF@#b(OJS#h4倀V d} F@# @F`VBTTTyVO#~}sFYfbXoFЮRT7h4E@+t5F@#PhŠ! q ysvq괜3{>~9F@#'Z1ⷽzwN~$gd-+KYFv>-ivseÇZ4@(!SԩS`޲eL>]9Ry`#vD꿱uC95j<0=F@#5>S g-~ܸq˪U[o={x=0}b"pWZQn_|LؽGqS#h(;wnIRRR<"k.7oL0Aykeĉ6n+ c.Bqxmk-bS#h9sFx 9zL:-T:t fs/sβE`C灃2s<x^U+˕PZ:o_jLٟ$RS*U¤jxޭR~]}@#h(e̙q*U\R$rw.#F駟矟()m*O6[r@3xx3y4YfIjה/ S{VUH9\UUJSn P9@.c|2]y(UO#7F]>D1q2G͖uK/HNRJcHB kݓ('60zX`XnP~L:(ց0TE?ټd 1O!|"&OJ5cdpL i_O \rTVͯS "`ddO-b == NM&oNs4s=:䷊A͚5e'Gjݺu >`}h„2~= EY3vAAE_Lu.+A)0iL퐡HwLTB5F\>B \LBN@>BR%uk˘fM~E\bE&'@RNA;^;9Cf'd:$5nݺ;#{U ݻwR!zvU* _$itŃPp*CyU ZX$4mXk8bb$ZUh@ꕉ@%aDzy3q# ˉ9Q}F@#d%x d̘10c dȑ*t_|wϜ#]/<Ԗ%zi 'sJxM+һ\Pi|`g6.=F@#P`E ͞4)Knw% ^Om,S$&R]bz47LWl5'N@XM_J^F$բq$dsd` c mPҢ(/ʕna`KK @m+V\LY9L(ޜK/|ѵLEᦀq`R!@5ΎFh4_YPLI|# 䲅K`ޑkZ4@(!Pzڅur?2itVUa5k*wP _,j(m!ƍKYݞF@#kb׏:n@9e%.:@=˯fK|ݭ  2tb.e`5@qЊAq H[|5ҳFui _3Aq80[0Ml$@\dL!I&ܷz=W[(d4Bkh4h36!qѫրsѾL$f(PaW+F>Ň>W!ZoR_1[%`U|e ^d6hh4}V#%E`* #KA_(B)Ua-`1<_+]FJ0j8i<OSkswdxrkwoh4V ia,#^R(Xt, ;dKR irE3yv&u`NGneJL_U8Ch4V 4Q&WAo(othO)ps^=/ɘq0T,p<~*" LQb\/F@#V PV(\mRV8!TaAdL(]V8Qza_${֢h4Њ{\nL 4ltq0aaQA?ɛǂWAYkV*ȲhÂ\eu&󿇏V|F@#2h 5dݻzgA0)j(DDyL$O:c;xϪBG6cm̙3G,Yާh=;ww$oZy^\ ++ce Zw e"]]Rp/-UH%pӝ^{5O<5@P"Yүf00Y'ժʋP^ߺ]އbd$6*R"x0CF@#G@+1 =ǸCѡ`zW_pX2B=j ,nob?P\(}F@#1buHCJcW@d?ׇ+&q1T3 Ci-=nqR$-F@#pcp"C϶n%^㽸i\[_֮#SU!Xf|ŧBEiL&2 uXwm=rw;i4E@+Ah8_^V f@|C@6֔e] TVc$;;۷t!O#-Z1G˪[PV-!HPYyТR]ELgڴD4yZ4F 7xFJMd$~GP\7SǔBEXUno'#na/Z4F@Dg%ѷ fMhT"?.? +a=!+aT\C f5!_?} +Kac5@AhŠ tY>߽GhHjp&2!&ZrEz2^\$Y` BcQ@ %_-L|Mkarygy Z4@(#] AF]͈pըF !/ CC{/znf52_q섌nXT"Om$AQAa;e3]6l=:w[h4V )8xHB~H@V&Oj)}bjȃȊ8 #-2 v v=m X1`@_yVC233ŦK4pwF DЊA?L=kAg$_ýl,B ;WBd:b*3Fg+X29q:}j`F TЊA?OQ=0C-|*VEVSʹR9cF7il6 m}}sF@#KbKKx#r)''IEvXTy~K p/,;vL Kɗa5 F@#h zv9,U91Uo[J8Y*a,Vd|-^f9G:}+崟nP_ɛtEڶmuY#=Z1G̉={2@6]7-[)Y07sd!3< '3vVѧ_[BƎk4F@+x)oDʾal)Xf ?9O!['O%  & I̩J{l;c}h4PC@+Y(iB. O%_F́tLVx\pz-g-F T07G) >n;"HP_/X>|ߦUq(`%rR k ] <W@{|GiHpߖ-lyT@2Kq #TNLU2娨b,~-"ֶDK;NjV~0]A,|Uk< DLAimJ;|^({xWJ1*$+?jբ'2rh}M[鉦qrRIL&kmV*ǟ `JQGU{|N(>ŷg1ӧe"\߰OǏyKR@^ڱKEd=2'(BZ4@( zܥ|!ߗmno.DaֳzuZ4@( yh'yW?@ +cd9~9F@#b O1Џ~|-HnE0y5c:[ h4`G 8)a|?$jFD|! 2#&7^S A`>A_aw¥po<ۦDF@#_x`ފjw4>ҪШJ>ȱaDYRzNbm\G4e5@oב)&?q UX@~ & 7UDuR?c[+/Z1(xu/ ٩>15^݇t|eG؟L!'5gYB*Î3u^q81&LYiRi '5pO[ (T2|*Q|'zFhŠץ׿VD1ySya ֕RՑ;g/C@l`R6_BV3EF qcS+JU' 7nG )X^Sc_N/Xꋹy 4k&6k('A#PLbPLǎ^=֪y򻽉'|%>Ab9wp{8GE~xƙ-_l׺o;`:I? >L1ת-.b]G̵Aww+t2f@y%(d@tL_^rd~Yv 6gVv `)4мyиIRe4Њ@!"WVș?)ysvR`ɓ$\2"۷a)UQBd⓭[]'g/iڻG6IDh኿V-XPL+{ ii`<"Qp;N=!A'씌~*bnP) ei+Z1'~1=nԮ%Vd`q(1'9̶,[k-S>(cco'ϡrIea"9}Fe3(arlO @V%V\ʘk"|AsJLS*ؖ/?1* aWomMP p˂#GLC XV2l1.0%-|g:*uPLE!.IM짟6mM"))٫dz&&MCn4diH¤+1ڱC2/?&IXP؄P1jp#p2TFʼn I2g7yp>$6ZX YHoŘe$V~,Ѣc 4žmVƮ,Pp#$`] =;) E\t+^YJy9_ɜXڶpX:ǫȼW-@!úHwJgɟI D—Eyܓ}>a<>Zv3>iv+J\R+BGگf %{T/GͬCP Ȏp`իD[Ui3 NX1J RfAIH?NLXq.;!'0Ç%eFxqWA_p'ш^пoC5X-bNt(h`-["  *ھYs1!^K0!u29E3͕_V/sn"ܹ7-hD@+^Uާ1!)@Rڲ1׏+/UGqX}o&rWٜi$27q8dS3x"ĽPXa-riDC@|EF_8p5ra#VEE#PhŠ.F|(B -Vy'eK`k'n ap#в@D!}EBA.\Jd8zvi]93^d .K6:-/,KUb=SR_xF.*]ᷩ叔cY @m:NkT/aK/387; '}̍i,mOFRϟ&SpolX6 s9x6VXj0bcnK̅Ŏ( zM[L((hQ y{dW;RtK݋`C@+~Dbm+w Om$.Q1~IZT&e*W@whdj)ҪD,.#C#iI>KU'e5trs(]Ҷ&#Ef͚Ҷ^<TZND)zO _w QDRCj̼/)k_ݛ(o&/ՠ48@Pe[T)_$^=z/x m@bCW6 Ep5iެlnPVWa%U(dA6oeL"˳ UAs~ŕbx(o@4#@WOeQ'zǰ!k?`V I.*9C ?ϠםG+Q)7w;!9׊3fL³Al3xH%`B#&ï1;X.wbQ"r;|^(=(̂iPm$d,OakW5oi@X~%HOy> ݋#kGZ&ʙ'Uia9|3}@F@+~EP`3؋ݝp'|l VnGɜ;W2QZ]3ïN](('h)Q>.+|L= bGAېҕ6(22w(k +d]@~}A#îFM}8`m f#8P" N!0r=F@+h ڛw$Y]-%/% "+P.DY*vHTε9OJ9)XL`4W/J R}$Ač7IIڻoKCen3Њ=ܹ񌋎ں*_O:T=gpAZNaW͚KҸImZu׃bXY>|QY$3pX~z}ֿ>,>1CqXJ-I}%}?E@+~`6 \! g௿kq\.Ɠ)n֢RBU|G:oXWF Ίm:qd%3R"#dX!Y&-AUȁYgɅ{QP65w`YH?f?Qg"? p.ǥ?8!p[촳<>͊+$..NZzH2%U7onl'XZT 2pNA)xlFY w ke1K:iFG:.g<ȾeS!غEP."KH= Dwn߶U2UAS5] *(CtG;wBU1 `QlKK8ea (D\wC ~%u(V~Z $tMr'|"]5'CAÄJ}V;"h@6o %2- 'BXtKb_Jm3?A׀]{)Eh@u'R%ҊY޽W8 +֖ȨL+кuƍvaiR0Z0WR4F`$Em 7s;}ŅcZZ;,%KF1×!$ c{ži*`e ve۰A'fADDy|p/BEo$ꁇ|}o?DDpOhgᇵq㳴gΜd9|E%~I,L2c 뮻rwrn(Gin陒}JtDfK]Kv>n;*N*K*(S2^I|W()w]ٸEԨ. kG5QйG:gX6Uv,Ij/K/c3 cߖK|9Ob5%5w"a{=z"gJ9d]0H)ur_qOD`j$p8u`8NXE`5~̸mǽqU[~K8 G` *z Ր*SxuJ+B yx b?TΊ;òe$ 渱c7߬, uR6l) 4H?3@XA? ;1ᇺuJj`Åuj˅N}:_k7eߎmWe??BU!LbWի~⥗ԹN@f^XEw,u.{oYw ʻi-19.$PtJzV q0rVXzqm?c\Vi4cȆu[w ʀn= 0q _e&(O\LwLP۱bD8"Wu%A.G,N[_~EqR5k&}YŠ]v[o97ןWEw[sL )U;ת%A۸Y"|mk+--M*b(P" *ݤz¯-ZdU3,f$aY5>"msӿJ-$T$?3`nRmH@Fqs e)BqR-X_~>CҢ(wŀ|=dʔ)2b?ɟ/jt54jHNNY9<1ˣcFb=9qJ@RuS<=2~,c5nO)hqQt0SY L,yAֶm%02'޶q*#Oع}$&je!~D2 Y-=q,YL+g<"YPUF~~)Y$AZ4[~a*DED>Jihڴ >\c@^xALb0 ~@s<м HG:(E[N_%kK8Vd+HĸlOM>(E=fߕ iߖ{O,M9'"aZgw}r ceH4Ib񒿠 1* Y3OS̍ a(}b@/t+hI0dԨQ2rH9uP169#9#3j$y &}NDr%Ŏ *\Nt%P#430qd>SPݺgfbFfɝl  }_ ϊ9P;mVXC&clD10 wV }(Rq "VKaХ(LY\=ꈈk/žc;#l<}kJ>˫EY 2- B7@ap(N424!o㴓R  < ֒ŴZR+-T1(T{s&2y(>_[sm4v8 ߏ 1SԩGt Z?- 2KWJ>zWJ DjG5@̭Ce[8N"bC^='6?Wμ|WKؐ%bb)& ۂb "}PG낹f(:>3ҥ°|{EC b:EF6lQy4"E 5og`/hLJMЩqQx M}~!>gT^vXNBng11pT k f79o[H2 if6kas;vo]ӧT!WQ%73=9?uK(/YHS11_^6hŠlpm4Z\GgS.OgPz6YCA"c5ZqD#&b)Q1X ¨Ul`iߗ(mk۴.s*awo8Z#% .m@Pnǯw(S ah 1bK%~/)\FV ͉{-j'4m"\޹buϕAƒǟ 8+H9!#oHPd\+h8`IY, Bl6 ZBm1(g?fry?;ب+H-L$7"=n=V w{*B^i嫩GL!'o?tWV]cE#h0;!cBJhs!,66_(_ITgo\[_{("?}`).P~_](24#`r Iٛןb9Tw_V0KMabL4Pʮ+DӍ!`-V/} |xcom&em|Oo$(Iփ@PhVERB1g:"(8^N4{ ]`/:Ǔ%/KW*:+1v4XP*`+srd!#Erlc/0m RQ"H*cѰ`4)aiKF0A7ǁzZӣ)hŠ.,ň"1a0\(Z9˨[֬a1(j(2\,6Fl)y Q:b0JRLj JAF$u 0j-_"P` CFB#lH$$o? :t(zKe%w}s>?|ܩ*͓Y+gz^kA{<4'㴵 0z/0תz_EwЊAc Z=AAsת5bkWE%k%d~i3 ;0Yun/دf *Xo7WF-h‡\lO'HH2r@IDATsZ/>+a+rp;GMI+ۈq [@)˖- '-*nDvlZc'db!C+!`TY'6[t ηY|LکPz֨.V(i\T[U4j(?*n^@p3fw;upUϴ$IӜ8 o`}f6šU޼g"jʹ~*R֖/c6•Wү =p]`dv* Gt1ٲNWe'QReb;:{- >|dl$RMhnoؓa=w V7ʎ)B;|GI (߰>Ȩvjg.LIDH(E1`R0 ,(B9xeZT⏓ž|l[z`q" @܆Nbݰ^(dkZ;+ ܃~^)❮*/e)يq(௸nb*ԟ P8MѹpKyp(ŋT ܆C ǩ( }!7D7EY}2XD}5oR:}FlL;E9ݦ"f|pذw$9]teh6IGlOLN֭/MkhF= ߘQ<&O)p?$n(D]w7p<ը<{+YI:,`)hl-#!X 1C)@GgI[1U!^[vA;tS+>x:gd༅bY? ZJߘ"h *O0JF5aP:VT`2b|2&@O DnkÕp[xm6yJs޹Oa͙1fY^ObٶU\Y /;QVEQ}"ӧ̝E<(XqVrJ@+ӷQX/ؠnۢcTQIqCpAQ6fvB%11P2Ү\wA[` "Oe+tlVJA؆@?!_ ~uz,|/kh 鑩leKW1VXG>01ĎW_H$;_$pumʔuj &LRus&dD>q ʐo&MG<3tF.1%}޺IMs9Y @>4>  ݾeؖ-E.]&Wo4i<} RzdG޸}:bJRU` ޘ(ڱiH{Z s~uKYU))0ҊЯf ;*VLTh5HQxim;% !#<1{80 1* j'b*#;JAaRNTJJ*,}O19cyr;b8!P # mHa$U2)-%G2tpTDZL(H(缂Nr01V; m1/੓؈ Zvy~=ق$r& f1+W|Lh#š(Ӱ Z:bnarv//{Kn`'ۑ q!GVd!~!}Y t.iWoBDu/?EKL1bٲ)i|$9qDNK:ugw4kEt/pbA޻E+#0^ܬX;NjIsׂ )f2AwН b'jL,0 *!㟻3Uq2dLzuݬN;af`nH4V_+6nvn^+M\UxIԹjUyMky}6|a^W:HS_3z!V-7kY HB2%id;2} /gCrG}aqz}1Fp*ߴiKmx.NfR:߾z.8`̒0bR0%1oڨbRJъR tAhhXS#&oe((/Bi_l`a?}h[aɉ&={e2NQBXbݯ3/|$)Uc؀gUpf%6?~'¯& v2^ַk=};iO(ErĬ-!1#?ɯrX  ɇENYi!Ӱ& L7zv&WC|ns,}cjɆ0xVGEhhY)BSⰋJuQ ~z>K?W Wtx#+W 64(R.vb0)10EFIXss_f[fՏwk9)IIʲ`{bpRzX->x >dʂIYb ߼s79ن5lF 3[[mfPYåa@rd]v5(_lNwA%{:P`!_v?X1E|Xjlc}l+m y.KLLɛ.Xy5iER ϘB _LSRk82)V R{X1g`j𵷬tF) E1/m-j!G`үTD r$^IW*6:Ee<#:z]@6Tuc"Y+!s|i^UкbrBt; n,zxsR2؉1ҫ sNb,J=PWv]zk M+dg$JR"]cx 8\O(EW{(EވEDd"Ҿ#RnR?WOiL 1no^Q፜QzJ, R+0V#c;tNw)Q>G<gof9.t'-dZZF]|'9 9׸lRﯩbo}ECu , "'JazvS) N2FD*(z# ȄeK$o5 YqTJK#u q5W<؟xDp˓[G %AN۽RXz. \ZHIY;V~,HHo\ K,„g͒S<6"9=TfNMUaTtw>UV>#s,`aeܯSl蛶Ȗ޻ߵg`?VXQ5SKP8@bgJȫ1VBMEuIJs8tq,[) Zg„?@Xm 2, fTo1vdfeܪpsrWvd@R֯A+g1*]s v%/ASC@+>x`)>dVХ8TB4NC„ * 'ۡ4ݻ̔m$^}V&X@U/{xݰCm1pN =.8]*j g\֊AH$7"&YX( Gɽ[wy;ٍ u#>-EN/bVRܔD=xX>=pA9$vfمƧ7\n.BZ2F=dae(=zkPLkŨX7 5t{쑍7JT3ԩDη[!7#Uh.Nse}'vinSg&)=S*"6flnzѮi#>n$5QZ(o*4mm~83(7iI̵HoP3xi)95>Št VR VX!O>̟?_NU$ [j%/~Ǥq>&r11؜~2ƊKznV=7]^fN5;&U: V7K$CGYԻ>,c'qԈpMcHrCL,s'`EJ,g=+a2?"Яt3~A+rOqo(%-1iG;t&''>T|]z[ G}^4cH☜KJ{S@ߊw0osD@N[ߙB.)GvR J9'*w\V^-W\q<ҨQ#_R6o,|-\P宻RWBʝ/?aWq.4ľZ }XIs?ص[N QP#;B' 3M\&t dA&)l2{x)2W0IܰNn\+ѕ1/@`N̍m# l#_ WY/Nȸ& m G℣}bu+L$3AH4;  ]J*=zԭ[W^57B NNfd%:/>DXycuͽJrbLǒqy~?gi粂 ̹Թ^} W<*2^T{N&Noիz|/;#!w~yf(ک LLI߉r z艿ݓ(_ݧۚU6I _ Ip߆MR{/=bE[1)D.)J7]/Ͱ2?o,O5j"ov$Jw#(-&]>RAѤ#ɲj^GfėI?pXiBE0I8_3T0 ҏIt:-1Q~Tp&ʨܾqc)uur{t*TxYqCb41okS8ߧ8Geu@yg7W,fd_x)PޓhQXi ;S{n&\FT dqq ly Z{eҤIлc 6ab Cǿkjcuf`%ŶulP0Clj4;6_Dܟ7'kbr>`"g:-U.^UޅIyE8S@D|V1ޱ|زX2vNa݉(D.u0?sfJp( ibq;JN]( Qc[aFEac{d?d 7X_y)ϙ3gmBtK/Cd嘳YC驟GŀY$̳(+v~6hOr&Uǎw='ۆĜyX"*$\ s: mv`~>\LYF6c\/ .Ur! v>KS,=}_q B" VXcQn7FyBL跫U`V5\#*VN(LHdQU:qqn7p9̟`\ 2D^ VX"n ʝYlKzlà0TJ(螏< 8p@sNAc%@9&M(jĊaAyp)ߵYA-du_N8 Zܦ❊ Kn17!6ŊS ukҦm0Gݻܤi^w4td-"c@]Pfa YBTz IQ-:`t0w $!2KwDQڷlO?3Vľ-{16p|oIdHifEm{*Ҭy Cr=ܣx 4i"=@e-Z$t)0=tE-L' HSDG08#UD* (,.iuL s(ށ Nbi1pR뗬VT ^iظD3uqv[62?|($Wu\dk"q  SsJ8ˌb`g6V 4mVJڇ+KAĨ=^UV$Ix1~pq!ad jΊ0~(3u򶠷|!sC=$6mR4ȝ;w'xBj֬)󡵔t 0O{P缺elO>{N,@fΧLS}W(w4SI{X#a*t~9^^mEL6"yو/7@Lª|J62?`hPo'o4kw +b;(BX$qaߥI0Vkn dLc)xFbCٌ|xZ3KX\Xx)J9`EgE.Y;wh7B~XBjGW5h!h c3F^}Ui׮b:;vcZ TN8,5+V!!K2 zD W :H|O X[51)Ͻ /T Ҧ0WԊ.wiI](gVA;aF@pi eם0Kb 0nxڒ?u1uvWCq ''Vńņm\̕(|9J"P$,:+@g~hyvrjCIe֬YJ1`6 Zn-Tf( -ӥ)Rj<߄OZ#OB^ wBᅮokԒWjT Pu=r"=C`^[)WA٠r@0$ɰ.B& ĦvE®zwϨP-!Vn, *%Frb/( (DH|PΊ@|@,ł d˖-ҲeKeͦ[K(NءC@S?^#^f๊Aw^qGF@ME'c }Zxw>,w?O"UqY$ƹ " 9pYTŤM:I"{0/;ۤr@$Zfq`uG]˜ٳ]Oz;(ڕJws*R|S޽bG.83bbYt#@h(U9/1H~Ĉj*!U?,>Z@6 tȒU]H/b'!x} ⽤ ~OR<} R(}l[H'Č7 1硡nX/ c25D'8ђfx?maY KAԂ5g{=71`);Y+SN\[2 )+1j\d%0V)Z[JH?N'}#ߙʊs?`ࡥ]{?evXw37o޼e˖)k}_@?)N?J%c4" !k)xr)$Om)F}Mp&"ů\ `: ^I;҅b؀AdTKVՋʳvH[Ѳ`.&'uPܹsKnX "+;FjrcbgyY<G_̊sc?ڑ_} uIj[o޺u7Ne @/SNUI8 ]._\hر蠵 .PQyd~7D_~sTJ&\`] \`?#~S̀yhI{ꌄsDCag0PL|7gf@[Μ:E,]QnCgD X:!5`Ak*5 V-eB/6Jk@܎ŽVg:I]@TP:,E4[P_X {gaEATDT(MT)Bf'Ll͔;w=H ƧiGE s?# 4E (dzdh*#1J Fcr#":N5Cf[|aN "Fif1Z Ŋ i߂boMĿg8N9Q3,Ykf-+}"F~MM&clJ qI`V[`DEƘ??&%p%̇*B'( r*p{$l3kp0 b%jO`6 b c Ψ WYVE]yϏR@kU`H f24-hB:?tJ{0PmwTD*PRu7Nd?Q%NW \ ҥKOŀs q燘<=biڴ0}],we ʺT ^uy饗d*@KYqȐ!oP{O5%8 h=$S)̘.2E.?W*n'%ɘ^\ji1G 7 \(U=Q;> ܹ~ pM*jbZ^=M(bֆ_;hCݺuUˠiѺ|KM¹n]B0 *R % ({ "QFC\P>FV"ɓ'˴ikUISӧO蚲h)STDJʉnj#D/B;vlHC<eR10ޢ{a:x"|0fe|>܀t|Up"4Wط4't}"ipAARkB`(%Vi <. tY nS] H^nz19PɁ\C \XQ@bG S sOLS2mmޢ i1L%͚5*xGNF!R #6lؠ5pQM]TDC(S11hsЀќnkm+VShDaJrٻ0aڮ8τ5rel!+a|-y~&03`70'# Q!G+ƿ k҅fH. |LƏ+^Ga P_Cr;a0* 9ZNGtG]y1I骈]+}#W&n+|EPeD)G&yE030yvڷo;\slD-5;w H8}=h) /(Pߛo,{BgϞ0`C |JBYCo R##&UfUdh"9i&!Ѓrh^)φL&=KDmV~,Rr) K,f[ oE+ӟ0o̐!`9L1Ӯ:n x'tĄK0q/dE> c745G8׾*ΠQ0N3 AO쮽r,^O4/ 0&{d%qBp;\ȉoēa0߰Ne't?]lwoaՅϠ9!I!o8?@--a; k8}@:#+iVVʂM'u1V4ի =ZM$ڵJpWdh idzbF5@[{*n<Ǭe],pQe* 9ĆUfZdҥKYم\7,_)G>NX؅ƴ[MVOk#`ZN0b-@F9R7Hދ/5;[%-LfƤ=1ҝr4Ŋ(BhwZPy W?M u?Ҥ4r1cd+4[/,]1'cJd4sj1Vy ƍ3[r\[T NY*z̶_@S`ZuBGUׁ^p.>WΈTR%eezO¿̳<rw*:h}Xu뉽g/!m0c3o=);rnEl "زY;{DELN X?~x/޹s9"7H=dVoq#uřBd=1 8T\usb)Gў{ dCWo8 0Ҋ@f "vĬ-3 3YPҾBѵ0max[sL5Ĕw6jݘBA2ɩP&Ep?n$fy$OgGT-Ljsxy|=]cשm$u+&ڹtnwvIB>G5!9k.5C!޾cn]~1.*]B*ob=EV QNk}фs\a1xєK1NBPR<;) E36p T(!(싑XHϝW oB"jO[N~e`AE"+D^*@O1%Xudy"Eɐ֬~,G5lX_ڠ{l65!hY-g>Gtl?޵Ga 63&2?Roc7 ̀+# 8I)YL2Yy<} J.&?4k]`Mѵ?0Awl]%4Ĭb wR`d m%@CZgu1t*R&VNԫ[k%cڊ9iiF}^:-KߵGȊARWxx;^ m &&Aal(Yȉ3x9?԰H'۴Q";x[qmFXn۴,||rT .AIn nI⯅)fkn}&oT ~kC@"E3c!d @#4Z Q..dNJ DC83o_Jl7ʎ+:XυL+qfyaJsǏ ٞ;|!C)~PٲdlsioׄYa67mCB6Q4 i^xNZ"?nw&P( U@S@!sQ5/VFdnT0ON}9׌[6*I]:a̰/Ұ7n:?IQ ފoe,Dr\2p9Q(ЈoT?\4}+ifst?xmaPJyZ"-B d" ;{\Rs%%JTVkq!y~' Jc`}8eI=}C(-0@Lŀ }_~ g@dS H+n}6u_PA 4$s"²{*&D;O2JQC&WܗɃdx$z17cϔEQPg i_7…b( fv,+6]V6ُ(a&,y{J\A~{WST /(,Ϭ㱽Hd' M.ʺb2 N~Sk DV*\iUk52Ŗp&|3翏"osD4<TBiAXWqE ʢR)Vؚc!jeۓ%#" Ϝ1@R>JѕD@LŀYIb#"/y< q*zM;&u +H%y/v# h!/G~3=3#vɝf}JjR7۱߀̇o e6,Ɗ͖UEco*fXjy-Z&ES.=DRy~]D޶'à S3O+"97Gf@JQ/lkLq%Pagcwr|΢~Zb];x :~5FMc:ՑyYFF\l"%SeI="(goˍ2nMl.Uf,\PnVEfAb f:dƌҽ{A2ot27]e`m *A#YpLh|~@n9<"&:l)8B0;>falHdno~\TFt[_% leMp5 Ԫyy(oV^۠P]zYa D[0( MPBeZVP~6("'GnVَ;><3t&aqAeɜʊ@72k/|a7.O0q. Zo[`"] 3 } T Sʅ1\Ozu56fF4]R=2ީDGRhT Õ.p4.w8o1g*Gl({v,$Yz̖e]0Xw'!K}>s0\qG +.T]L>aկoj-3GVQLp7+p¢% D\0'矆E\)p]sm ޵xnD7~OA :b2O+JdcIF"UV!(c$;xL=8[v'43|Ɂ LN:Qd5*07LnL*D[#9PTK[) EU XVZ{BDL |@P͏d2vln"(|M?ͥ*Mf.K. ":`EHhEZ(rSQ(1"-bYE\@.m$K)pg!CYh|WԹٳgѮf57;!bÏr .(p?Vg&t) )'!o:1:a h)Upcz:1a7~duX[EDB| (?GVT+/žtXg?ɍe=4^_s@;ͳ:%J@UdHB !F\ ( 6iIt%T)uܸqrHJJLQyejӒb@ŠeD}B׍};HV'upGLoeL s80`#] "\F/ 9O+uP<\c~0:hG?Ua![2Ԫ4ˁQo[yA Kv( QxHT^@:1WEcR @@IDATŐLnto?61jf&*A|%K$c.:x˖-*s͚5+wk#/П~Us£ -aH Zd*Z"ߝ T. 4qd3ov-`eb̾Ka V@ՂP) ] X+eT,¶rEv1.j-^NP0Đ0wqȰCC;sEf`6Lh1,3pg0b; PbIn, WQ"]؀tĚb,[L>9Se2l09s ܆֊իWHFDb(B@&+dB n6$LRw'?o^.+eaY6o,͓>H̼{o˝wY-,[02!Y'wޒuUb`>.B@l(m ԶYNes}ͺkٯGQ O5k,INZtk0" u'tXpdsߍI{bf9׬oܬr1 '+=cЉxj o]z2Ξ%S>Rg( n$^Eh;["4Xڵn³s6S}?0VV&ϐ#"%2";ٶbҲwT՗:=yg|]==C<^B̗ F?B&ԻK-V{<dJtӺ]TYhb\b(@gРAE6c*Ф„&mxk b&oގqGQY9):tiӦ'%ңG5k&0u/]Ta'B7ZSC_X9۞z)![o|P>2Q ;WGab]y eOG8 e-(-`_Y~ys+#ƛns1K@_;bwߡ&C|Bc͂;;p-*h~a=y楗'LRKѡO/~zCuzHmhk<^^=.S^/<f/z(mbպ:bjd褷%0wxyOct+'Un)Bࡇ%k*ƤI2O?(ςB?q5,BwzR]Y+7^׮Mky{)-"x^>rXd}7O-jH<49)7nWu]t޹ruOA 8;&b'xHmOy̧Y?G*s/j!'@jHЖ'>P<5.xH 퓷[ 2|f6T_`%wȑVD {cyO8“OH#?e'aa>r套ÚVwHJ 2:e>ҀbeV6HiՋGzWkp_pnn6ʇ([VX>W~*{ ŋc7J>|NT!΅|\ 1+ xSs㰬>_JYZ #3fL9?d]8Y2AQ8yM6Ze붞XwL5\,XYλ *ZcB[G: ʡ`ɝ+pw3u _)8t|uJ)gxc]1x9+$K ME3=Oe|L+ߠ'aN'!enOuẃ"xFTh P 7y}1#nj ;CDLpqV /ωgVM, %qD>K^h=ի:GFpBe6Cfύb( y }V(RLq@:0*N0!V;GZ<THld&]PȼgdCiQKTx؁ B ߑ ZE8WGW7tPhB-d-]XSq%3'4up6e/B{1i۶bM$Z}F},%пiEY^JO,a SԦR8F姰T:+lioJA@K. }+Bf}ohxGV(χ 1=$^-q)HXSm[EfVؠ%끇J^/@ o. ĪG?0̞m ]Ë^K 4In x.\C/Oy _f34OBk >cXی֭@x˽0bᆱn,[6#\rDU j"k4"Z cڵg¥ӑ*^1*Ѯ!82 Zx-&Y>re6 |!LCT\kŅ (&Ma-k)[$cGOۦ5b?I<\ P1) ͹`xhϿ&$zWOVh- u-0j3b; )9"cO][WG&⡢7)^(9)FF+hLD#Qc.ʖrLpw4? jUV(+ٯxM)7 ϦsR,V\׮]0H޽UnH%AP.[u6ϨZ3^.Wg8W_fpW_UHK8hn1_tE \AMZZ r;bh~gP2JZܓkUKDJ>`FlSF"oG%sa]c!Da'dP;`8)`1hpRG&\}I3] "!r*.8M//3tGu;3!{.LdV.Zb`6lqq券HU4X4GɏR*܎sI1*hU'1S1oD3>q:llE ZҟmBwQ1_WE yfMy8wϿ-f=hXY2fE)b7֑$`XuXKiG؀+bVJOmuVJ+-M(q~~m(X5@xAbڵBtxu]5"N`c(s2ODhav_`.QP/ [[c5 ]7.9hW<%-DӧXJ`&l chɐC]10"޵x*1ɠhh㛣f`%-.L"1LVj|K\[jmH8#PD=15זe}GcqF?l%)ub\;`6L 0z0B_T77'>f4T>6]ֶAGՔv4Vжuvq~;C0::"k/}{bJſ7ɹᇟ6gMa H2Pr#O? "IB>4^͖rU&C[bZZz£ 1["biuEwfyXJom&M4bmJ@W\O="Uk{|p GAWv!ЯP:l|2!xre=}_JcCuG9q0DĂ}w(0bNzlFZ@|u@W>Gx]$C\@NU?b[y+T3sšA%2?OF>2*VNHqROb+TJXG]'Ǟ{sxUUB3RVi5`PVT{%=2$/6ăy|\e-.YkA+Emcs`C&T<~p7 st ?+8t8/Q@p,IċO.cl ^@A9ϝ B?ky3gtd,bA@ƈlCamr "Dx0%t$+{*r!)Sk>P5tYPQ &Si`BgyU^quץ:y 'st"S rpmOCqǧ<;+MJؘ4+:xWVK+eŀa'_+΋/-\ˎCb(\DMF *Z92|%`(HE$ MWAFb^TeXJZu}p_m?C~Y#QŊ$E1zP"<_|QEJ&~<кC4 X[KB 11)/ <$e~*?CQz-m%/5k~;IQ(k97@$ր D6Ж"v)7Mi ||)&X:]ЇX@1a1 4!h/ܾjXgC5/wޣ&&:hHEA-;[uQ ~HJ. )R@d$D,QeXP3Z ב;@XN9?m@tXX~76CI;~]qPL;,R | mZELŀIrBj=<<ךV 8ɉbKwm@_**F AI +֮1;ߏ6AR|2jn޸I.Sjue+eS}Bb!?3(^(=uY/0C BFS!;]uGp/_GŊ$Mw,-VND1YA8c@ k.UjTOEKWL -0xQ_rJYٔ(ӧOuY\#@4w];e=8uwUU98y51 ua }T +L/V׵Ov@])-+~أŃTt_f{DJfL:&Q s4UVve)b ˙gGZR^K q)HSz@&[k%i))büC\_)BxlbZ Hu̜mڀ /S:wy2c Wʻ߸A p@y (qCR}`TY',M˶<0Zd}'oZU7B+B &#KϋU0/B1ʥ;'%RJ/wqBIav ť 5l0$lvǟRd}pvt?)(,W /Ul{dG"bWqLAƍUVCxrYg%6l0Jo'8(_k +ʢ}%=9-m#h:R|{}v Md$ Z#1RuߴE˕"ı#>RfPֈ>ƒ_HaE!pOXr_xV#;^ҵ(\ZLD T&wLXqUy ^.#b@ ?쁦J-5:Gn핌[o&CM?B1=ղ ւ6UHn( ׬ Aʋ`^+뗎m&wE.E |JqX0OmZ:8: Y%%V9g8Gd5o!/!YaZmƠ3Oɡ",Y5!s5\}`M"mBGOd4ċ%gi-@ҧ%|´_@7O0`<p %Ĵ0g!C tW^QfϞN&0>|88YH HQ,)7O7GmZ 2ڙ6-dqmdm卖:kB&X3a5sAY#|ğX.PVsTy1m)9DxOH)P]"DA?s%ј*T-/ Cn)4=.1NI]OشY]|c'XejWݶ]Y|oK\O0{0X'|"7o6Jj~˗`_IKL77N!@̼/e]&;rHK#{+Hz.yaʜ!~"BIl1_HLF%̘h Suoy=~t#a;B&,l ?xg9ud:vw ,=Pc_y4p /zX9[ M? "ʍP'ЦM4)^W\q*|:E)fFtyMGʵVȫΠtOTp]w)Ky|/صk lh"};84hPQM^Iiiy4wc57 7Thϗ`JA*(=B$޶m+չ)]Ùv]}+rPkw4m&4[֭5S4< %PLut9A:w"5V@`>Ѕ SLF.PL"1Bae_B$I, q=Kbq@Eo F#Zo,n) Z;Sʕ{d@eb^ۦҡBF<=Cl=a{B̉,H~ՄWϰ3<3}A ^-,^gcv⹦M*߰|rn?q啈.{_ Gˢ빈wy`iJ6&g{キ7;>H侕  q]6 fp*x4/EGd~Ka׼9Q @m!wu.Ngc=$5I8Qk?$ ?+ңWa*-|ƛn5 8 lxXBՔI>eE7V(e}\Yq\jy/<'݁7GڂI& #W:ڿzbJK4(|D|>* Q֯,HPXwg.~?Ⱦ$?˯ܼرceL~` ~2t0IS \43qK1uѐܨzhV(`,LRx P pCۖR?%LYa y>In94ѰaE@Ў7Tb|W0|8B $XPP tbrytwh 4 a  9( >(e5(*r"/]b,ZRjS(np@f ;JIJE^`oٲ/TGWX!ԯ_?eE4fdrG qgΜ̚5K^}I BX-瞨J>\Y0Kh 6LM3.ŀ j-$8t4WQƿʬ;|Xo&(c@[tQe&mEh 3SY&;tj @_6jq.&b,е)>Z_@;hD={N R8 ʩx !x{sQeKX$A-dR(R#j )7'󬳑1ԫBh^z VҊ{gT6iR`{wy/GţD|^q2ydutĉ}΃k֬)Cz5ĂFWx ;L ]&MB,Œ#0 JΝ/'pnݺuՄK1`G/ ]%͟+چ0ٻquG*oq t+&vHUT_DbuAתa!v9A)V4 -0xN>UT&Tء & ?юSٛiI:'BPgڍgCrҎ7KgA謽O_ՎY=14E .EBW.~ }+̜gSܷ+7W`gv50AYE ]p2gًZ:'xZӍ3 ?2VJQ׼?q> :TYqc 2~xi׮]/ ~ᢴB_K"#ƣ[?7i #5"GaQF$ECaϜBwoe:mxR*iH<m[Mυe+aϵ2Y Beâpx˭aeK^զ!j!(<'F|ǗY!O:D~aaxQh*q-(`^<ɋ@z{+B5-*OQ[#|8 D)'^=_%.p,oGhI*qf)O| @͸ƾ<-m%_]{a9@1侖Erg8ѣҳ!BŠ@SNUUV :v(D,Pq'\K/N8AEXT[1 aN;49"S&1z`:Tqcl :c@(Zt_$'&hݧ@_\0} cД s2\E:lLUQ !fQb03#ʈ o}R ԇ_zYq5טޝn&~dDR,w#S,-ѹK) +{wQ ؐ&+˅фol# S$MoۆpHT& 8!NX,G #B?\U: )'{+B䔣v'?LQ;C 8駟UOia'XRQ H"/0 vF&FRE0xA`AAihNRq hgfMV p#D3q[!ow VK%wĵl4QՐ=5mZEp΀2ᤩ Hc_a+x˿HG Lva58Rp P"ݑ $xYdؤXӾP,\WFA;>56LbEx2Z+ɡbf Pbn#R4L.: p]0v n$BK<[Q20oH- ȺX*ˆo*.*0eEC*Qϋ͛!GV7,S9v-$GL ڵ)бw޲}vٽ{02A*KϾfBW|ꩧKTˆ#B&#`rICq)40\"F;UÊu8.i \@ ]NF1،13nK滓u@%?s2 k& $cӭ0oϭ]W<}ŷZk3W(mpU BP#|!?1 oM F*`udD=H`H>Y  L175#)}=~LW>cD3BWss$~o!ŋC@~g}zio$^VSpĊ bXyae@ 8&.9f͂MwC/wNX]Lp6vL;u}1l<*Ψ$|dT* %V  Ң K13sU> Ca:f](H߰^|0o;A2GP$CS}p4oʢI2s/|ps~7;F6A ?c7>݈~p l4+@VUnە@q,\ n=qNv:O&ցV(M4ax6GJ5UdĽ7\^`3@{8NQ0:g?Mv4Mzj 'f , E; ܃Q)왒^a\[>me8<3 'VD9 !ΜHŗ(H0n6<6`^*V?>ڙg]I~ٮBhF}hxNj b*n`ԨQ*V#%Mp9"X}~-³! ^vld!. ,]p'LgլVwlWkJ V' ê5kd䌺I/0jQn1"T 2[H*f/ -fi(ft(j+`Zax(X t Wƌ'$iqdb/J/KU#; FI fE;Fd&X\>HiV1P"Os *) r0{2> Jw#;SNVmz]܊c,uHdM̛ad\{}RD0]$LUb؂vRHWQ=qen6$aN:VJ"d }ʛa-NaD+@!sl < 2!bEUE>]^dC}p!8ׁ{ g˃`;=⃲ExOYy&|)v :7ca1λCa7b =YB! DgզuI  ^k$"KAcA弹wI. :+fEEp.!b"2E0yu[(/?qq " +# m.ЅVX`k{ՍgumŋhYTZI_T_Je)N7c=d4G6UϦH`V((Wȸ*uvU`,-(3`sbIG3IGTL焟Hp';$H+Wjȹ)NJqN:kzW)'P9m.$A*T0xhlX1b '9)|î0ɽ:J&@sH2 C\ s'aI1` $xpzZ}|@41P:H\&$=1Zp_ۇ^1({mg\u{*T RJNĆlXyOqNf5r$z-;*uT -[30d41{yF+[я>Mk<h) (t#l{n_X뽈x;tRtg-mU$*s!B+!T8(Ga>&rG}UFu3J<@W(I>QYdE2*$wsOɊUYلnp<8}@e~B R<#S1`I]~|p~7 Ў8xfXGHg _lޥCCkJU*7"zz(R @)8{En<vB/T ,P&@tsŸCr"ϰ@sr8z/!`=$s3XW*UY++ӒިՈfZe1Vt1\uUPŴG-u?8f>DƋnip:B "$E1w TG_MUdFE$Z`1`$fni =& . *df`P%S>)+&`RjOw,OAJH* h)QF!1%%BGH '~ ¿vX((WBt%XYʕz>;%cc>JW(T1 =3)MI}W*?P3DY%oNz|0F/t4o;a /w> >2@ΨVQ꠻8B̛#? Gnr!.o V9ȥR /ժO m>^.^InT %s$IgLUŨ ]P0_pO }ih_eb2@[cG H!$ROQ:N)`M`F*A3u@ ~4Iam5p]^`)ÒAT>o2-1 Q2x5,x0t„<[y%sRo_ol@LSFT ZŦxm)Nh&o 3bYh!6T0m[*jؗ636'w)8 D,=D"Iv9B/&mwդ{bҵyw:^Ȇ$;\e` {` v?hX  sx0yTOUt_H 9 >\LP| -VP@~/D\e,}E/,Hs\R :t!:ŤI@'6(rbH\]j!3Iџ$//˘JccG [_zӟs,xf*A L,s' >\Ne9#V#iI.]H΋˽ dP׍%`D\XoSp܋m d}wkă--WjmJ2Mln2/@lS¨; ݲ\(g~ʚkI9z5yfEsW [$$!\~!P`a R< 6 oGtWZfQ?4ѷK3Vi%sSO:dA L+-(i1؆詧-$6bMJ/Ps2 At>]@1Xy4c%J_KtHLIʞ|<,L^DKc]X8\4ϓDŽ(""1ERE4pp0a)h[ѿv-r2yT0+͔t|#]P\TV!Wb17Q4$:LwEk/8e+Z 2~hץ!YTvomymb*H?dv>|E!aZ}k]S?0˯Q˩*OS]se&à >h j4m NqlƐ=P"*(ւ՗)J)QL |y&AF ? Vɛ*,n p" LɽQJDx*9TQF&ڲ21] lg}&[U.,\P7.zqW1W[)hIܶr}:r$8h-萂ۍFZm`6I;ɛG*bEÉ$A+\X;S)<^w|HYA(U^sS" .2E V(9C9(BJ@ZDD8Lm$Hyg@|09֢, ̚gTaAs4'bޚbEĕw&R UyPrb*+Xn{F%TFaZT\\["y(#aI)oO`h2QzΊ0"@]XEyuPOEYNLNpxALvD]|Hإ[)F/LŜ6(6T(td=i><<(p*d~gTe !*T̰X6fO臩yE0Rj;Px!i*{{4A6 ѐ\|^/U|(,-ۈ(2Wi ?pEHWއ/*Q!'V/bj{`p! A@gzZN|W;hm`H;<~MqE f,#˜q aOW ^qt<$AJj{.Iב̅~6xzw,'YߊYNJKD >e&>YE /mq eOROGZ h(+⇯`D耽HyqeJ<\>a_yQY> ~\T@TE<({E߇BXX{e8%ծDbmdbg%/f[۶Kϯ"߲c4]ba7U!-נ#NDb0oDᑊيkJ!0R E=x,|D6TYe(]|pVȌ̄i #YT^<NLBz *#$^aάx\0D`9}4xY sb7V,˦w*[%y#$;kz:d#a5>W\)=<8)C# ``ů" :t .0S)؉R[_20A(+@ 01ͦW[6>11_c@S[(//+bmPy#!;E4U?0xRTn?7yO2A)v0.2g!Gcz`BjPTr5o^$R8_*~$ssY|!a7-8L;M9!-(/#V ɔlo-iV +Y܌T޽/+f3pY~t5R6X'5,o8*Աn9Nb5Z?+S*'źM靃)% p+ъ+u*Ѕ#?,? <r;c"?'yg*k8S'ػvO DпGL ۥNwT°PzTRa(p\?_>I RwWTtsyC̋zo$}J 'Fw1dQv:tD?닠 W+ !<1rI֊enxVaL|Յ\Z"7ANXZ7LJƛŽ#9d R5p ‰K_7*bcYUBlVHǰRuJ<2r=]0z$:lڬH/|qH3턵L"=h Kuj<\l{:&k# B5S !4ceEX,3cq|iI@E7`EY Glk5B+>,4n D}q)vmv>L@X VéޅAyx I4B!O? !p"!]Z^%C?"mDڤ6%" im*b}#wȰ5-iY$>]-( !^u(,23%s8 ,'k 8߻pJO'S!gZ#Xe$ j؎\ UM! R\WH*Νh6"XRcz'dDRrhҊA_Iuۖ,kaP~~d^%O#|cuM"lnX#Tq_ #<}frCK(~TGVK6Vv$"PŘ!+9 R-X1ɋ@>m[%ob ѥ^,H~ҮB^m^j[ˏ0 3 |/2\.!9_Vfn ^p Th1p!{DյϤm7Azb!XX?XO{ATDQ"A7ﹻ ِeٔIf2νM9=Uȸ/S@T6+Wom&%_c͔֛y@C@ j^e2=; G@,`T1/pKEswыM=(JmkVS+ +ʍt޷CKQ򫦍"‰}3g*T㜊ˌE;q{t!@ S'"7za.,HxdNF0;=}1*Zlx؏AdAu=<~4nBelVz6 EKٲg> leg^-7NlM(JU%HSVPw(To"TJ,&(ԠdAbp pZQhO N,DTNT} ^Җmv X-,HU֬ƒs+~ !ힽ8J/׭M#PvBj1{>`2ObPPq'z`!'*c4PZ߃RP&e<(iRQ N1$c!O#pS**\]P4HrR`|k*xN+8 !M f$".bq}IS\[r=y_'~8 x< sr RPq'-3gA5Ig$Yf/Rs?x,0MjWHs$A;cF9pF](az&, yĆ"L1rкC#!>GgT.N]w@eP .O: |?ЉrѮPM$tWRkHI|U* O$+!="_;2DC!)џذ+]ЂlǜY)>q?H )\I)vr'jB]]7krՅ ,L^\=y"`wiS6蜳4e+"( fϊ5ȤJɒ5a& /ɍ@tV dIL/IQ<7B`o= uB0tVh{e`[ݪgp˃w Ahd?2ٚ&;h:26NtB*4sr:7SC&?}g>,;đwCS f.LJAf>AQ 21ҏ" p0{/E!nWǓ4WR oP:\{!="6eN#7*$\xQ9N-*dٵ\guR;Z)ʲOi $gf#5U-4)@8-`iZEM ǙE+.*v` /pr p9砟m;Swx֫butO3g_0ΡKZS06 Pb-/lތ ^DnhELm2ʾOm)Hdݼ9ȒqZe>$e>$_sSѠ53 |Q?X !{9F`j lΏ>T*9O\^9N >tB?W\OXe>@S>`m=gM뽠N\8x\&=r ꫢTa$'y-$EKQ b4 <1YVqxfBRP:Fِ\C@Sc>~9Qwe7U -E{?dhVnNQ FA =@BD2l<Y= Pu-Fw`w\vȭ3YȻp!mky/OȜâb&?sH G)p} Ie MC(@X8/9԰r֜Aw*EiOQ B̠q#8]by7Vwl@VCb|g&`uL^;Y`X7ω)(kCsoX(9:&~6lJQJ89g?8Y*/7 G!,y:ew5. 噭^ct= x6dmx. \h|JlWa$NL%~dYfsÚ e)I +){?WV-jذaH,lB '*T>]qGP,(BLz(ҩ\Yq}eZz9$=re/·_X<𵪸߁0m6VιiGme} ja]p4yc*gz6|0=J|~z6U{؂p_srS1λ<^4Yld1 wY4$ǵ}Y,ćI,.Ly 6 .[o0ɹ)@lcŋ驧nݺ;C={tȑ#i\F-`X+:O7AX<7.R^G;ʖV,\x]z?pӠ-Nsq$^}|ua>r=l=x"Ӥ32Ag=%m۔__G YG~K8AH}b`iI)dp 5ɶ h4l0j޼9Ӈn6ѣ9P4(P֮/S K":>a]z;U"]ӽByza=4/խrPƭ7^B=aa0}+.l>rpe:TO> 5*aZ˜1R|M#S /$2?+` siq6EdXI'zH(•S N\[qĮ ZQ {J1@ ?mxrʕ+S&m߾j?HڳgAtǎzy Xhk}wq5k9 ˺HaDQ):/vÇB;t/Rt^/YUaT| £UOnι %x&q?{Zs]|Ҡ2~ `GDK^Lܧ[߹9|^ܹ ݚը",QҮ]<XO!;\ܹVFn#5 j٧Ec+[OAXn:y?Mʂ:BN.uV|4XH}oPuE-?ӋW2JR2PqN+QD- ̫*Yx!3k4`eY!f(_t6.?vx7sQWBOn UNX`Ƕg7yF!ձ_ci}c@\*Iv)U^8!xy- pRj^gu rs>9)FHϒb-ݷBL1GUJ5+rKyv'ţ7Gy0~$dKljv5NH!s`#"Lɉ.ݻ%g8=(q4a*^(Fʣoߞ͛Uԏ#@CZ.7Ɗ?}"Z4W=Ȧs/!A݈񞋊w"Xkf(ᤒuD7rِ*avQg }*׉`q=P d3op;}fe-;ÜxQ7!ց 8w>!€S gMִ)*E1f-"ܟѣTjUct̢iS98O8VA̿j4[!#{ԇ2bHe$S)" +vy!d)YOCN& >ն/l)gd3΍Ch6o[Eb7(.M鹍[hĶ7N- NwHB ><gpɛĘMu5>Ȗ "Z)`,ΤQ rMH(c0(e bq 'nݚ&MD{V]jY&Bиq5`T)@eGa=9I}g&M֢}ozV m&rUNv\(5WUy!ݺ矠=q:ڦ2NշHSґJ ኋ[؅+^@' Q \"} [4?~F)zEf-A Q\15y*SYV\ICUJC] Ջoؔsυj.jZT0#_QӨ ?h)XG^G]Xܸb1-ܽB9i~f 2LFn W"OGEtʾ-^C-,JW,XtFa##ӝXUƂ̐!`wǿXZ=ro>nXWb b{**pW<}zuU,(;"Jcgwɼ/?ݱ>F{~ ]hTGxj{kQ3pLh%eVB4&mm>r=˨ɖ;B ٠dWB< @!HRl碌fhgqP'G~Q+C8!{0|| B123{#I<Ɔ K=Գdũ$kA  `b`o{A F-`n'xo j@2P(~^#Q"+Lօ9#Ρ%'K\0V9>xA^xb~CdMq.@! ADeLwν|*BFA2}xbLZh- lwKX*`5}QdSpGjVW@N&#A5T̺'D  Q r3ئb \Lœ .y }A9-ptYT}_d[RjCg (ZˏmX( EPf}gl7"pZP  HCp8${\w9V?\)"EG@cV Pa GUB]1;=II^j g-x>EȪ }rjlom|C9;#"O`0ч?#;~A{EÑn C@8MIe'_߷Ϭ^&D~xZmP@PsZ6eN,QJ!$mu9Z2{AMx! 8X(־xl(`(n)/w$ﺵêl/1D޹ y#cU^z}D֩S!)mB\&ŗO_q$LJQ 4sPiC0Dsp%TFe_rķD6`ZY[lɅ,5i"jػ7g3 '|}ws ].uvu@\ Npsuj3ѻ (&p+|vfC fkį@,\x}֦M32ck'M! :u/mA _T\n|w,d}Y*T|9 C+RƛЖP:X4ʆX*$ @ߊ(q t|lR>O O59`$Yk 1S!w58E1٪+`@dxX[K3P&"ǵ%~ >O> pSd &vvS Q xF8#nv|?,uQ]:8A;J .#4)AЮJW+f)!*"@@yʖFƾ܈zs̏BH)kɩuA'u:kJM F@@\0:V*۶#  8=rO*Ѹ!A@5k*" =۶kݞ:7i:Ғ eD1ŀӍ F603bNO%r),~:vqdE@+G"۷ltT> r!лzYH7,L%.")(!R6q (,+&}GL~d;@#)(!&֦-9?|VdV-+x׭#6W{7'K3qqwuo\'OTՖEK}lD}nET_GP 7Vdn - SbkFsf8*bk'ei个bz}8rj\֫@)J]8T'WȳXvصM_ ~U 1}Нo 8"R/=OTQ#yP θbh۝âT (xM%N]2_J !sϐ ,c>#Ӌo8~{RaCG* 9M׀FwY.L+$ozy0qo+V(].-WbQdd۵'~*yO"7 abI!/6QQʮCV0:+}cAp/xK&3/ ׻~oGI&ON5Jp Qjͨ`wb;5jґssZs^/Tm+j ͖RKLKRj+*?j6qɥQ!;'lȠT?-W(YVxG 9@߀1l pB!l@z`q@Gp+w|effS}rM@UR=$Y`a]ο,5Tms@Ncp ]/&.[zP,"t)xzU)qxjba2v%eܿ("#gd9mФS ) Rp\sv}@~Tˮ _! <Ig>:z]CvthѲw3A@Q %/ +I):2eGӿ'Y:.ԹdZ錰9LN%rj<."@]QUAdEA@! |9u5n y"7sLJ>wASJSO}{Cwf'9 C"FKR޻ыYJ"oċ ׄoI߼F)Ge"\)fB@fPmQ+<*akfe֤YQkG"rdPA;%7Ȏά|єGgP\&bGӫQ:#H+A4)Җ Zb|ڑ͋{r CA$v8.@IXՍl:j[C4}Zk5szJ"oN%a"U٤! &[Ȇ[UJ5DA@Q C&`?G+L#R$xbv=eO4ҮAYCI+_!q>\qRFwk4"'7T@p&+" ]q\{y^MOFQENB[` ?MN*A(`BrϜAƞ*`ˊB'ɖ a <aħp*W3FQ/¼JN Fv= 78d=,_O`f1Yt!R2e<5[3OM01b1(XN?>4${vZNe8<95#g2#-LrߣC%џ[/\Lбcd{]ZMW $r\ؕkOB ̂0+N:,VY{\UK QA@`dHƸA_x9Ylg5ϻO>AaGdAp D@`xg&_Q <:8ܰ01Nn4DQM ԉ_z9u'TO= DQ " 8V?&+ 8N$<{^ᵐgy7mTIe*eVSe@Š3`܅D1œ0ErQQ#(~d;(l& x-RqcDAp#W= *3pOnFR$O֦qdECA@(QKr}{DeQj\͸<((eUmFt=zV f6cbe; E ~#!5 pa W05Dqz?j4O&cn Ex4e ы*O?&!9_}6ך]&f)l`eck_Ӈ j5C7 A@JcRA4g>; %O|u{}ݻTJG?xz!Z2 BM 8&"q`? N#ǕBb˒ fFw32 t*f:e! }D)R"-#,ޭ[c v') Tݰʁ*inN*.[!ַ@8[FYJ4\KޕXHq,O,0P8!?jhK:~ﲤzgeY =px{]iJP2cRMtVↀ(q3W-ZRqւglwf0bhqu[k5k.Jedx" K*VLڬR,Ur(7I_Neh+9_؁,*A  3j >VJq9Q'r Hjeˑk$JF"Gy@mU ɮu?]Wm V~6 ˇgr[ʶ`.b#f= D -$h'wZUIG$;br\q%YIĢAG+^(J7ﮉa TLGPYY9.T1 ׭OZTZ5߰R]j%$4J䙫T(qPvƵ_~Y;lwa"<%KbwTDU?b,|)fgɳN{IRḻ @1cg\qb`oax} <" qkg+V#w2Jeˣ)dkOT 0pr9ѵzv*vAft!XnԪ9PNxD}` f`7W `EJ@lU:!f ͲO0@ ӧOAqA@RQ L>lv\zzq"f`vOޕo- 3[%.mkQ( :8([(\J iA$s X!+x*U ?5jb |F@$^v!X.r=˖wE9ieAC +3KJ&FLXϾxF55 +% "%9Á3!,̴6nBVy2yjIwA@"G ѣGih=IDATҥԮ]|Gfڌ'-ZPŊd˷q>竗*jeNA%as:+ aBVo~x7Mѳ;r>GWU\! qzgkq(g;gu/'+>ZkVi4!r  0 < ,*Ç+WRߦ7|Sv S;1 w/vΝx \r 9JCqh'@}G^F*%@)iODo9_{D I+_,P4PAUbD)0Ȼ @HbQ= Pi&;w.}Jy7n3 t|g9)?ÈOٰH iUɂwfN1#" `}?NiӦD8O,J:ujsٚ'WY;Ld%,B+!]zj^1zA0r9s?:l1b`cW /7_nL(/sؤ27ȑ#Q T/ѺV+H[Pn;ldQXE XӦMJf&bÊDl߾ƏզM:3Ͷa"ahfDmM?_\%&>WJ& ^$Lh0.rEF"/`פH!s`#L2EË7HLE{ Xku֍,Dy*i, TDNLߖP"'w0zsnKS?\e˖O߿?UZY6{5A+Dƶ)[źEι1jQ{X]dbA`~ rP2{_|NP23sM7WA@bٲV.#h[={_1H76+Pr:?2䤌n$~ Q sչTw7h0ȯ|rݺ&KL޹sgiN@< h{ݿSqb9z׷ߨDGkCO|s?$#roA@∀(q8݊ +r#WT %E@̓P>A@⎀>zaTb[d_JF'~QCA@(/9;  .ɜ+l p\rW"/ =lE!\A@bsWE'9ii]n}Z¿O6A@(k:_OoƓʘֆcw E*Æ wEA@|X&;C6hHi "=u86jLwܝQC,WG"U.A@HRD1H҉3s'[vd>3Er Mr1A@H$f&)=28A@HM$ 5UF% D(&  (qٳggA6m]c+; JrIzz:+դ(-p귵aÆTPm4[)5I)8` ^PȚCm߹GQ ( $-ǩR ݛJ*ǻʭ"ESNTRH/@ʕGVصS{et @+!lDA@A  As\vBm(=oy<RA@p333ȹCtŊi>6׸A8 A g-b%!1j}=zT,K14+\!1]tQ]wBطo_] z&]A %r1;$)GQ\VD₀(ee @A ) @qA@22NA@A D1$9EA@(.bP\fZ) [t@U+ ߿|ra*&LrQǎ ly8 O>ܽ{ҷ~:^|TVo匍5jǎm@1GyAHDG{,8y=s:uxZs,.xg4Ç?%+ W<0`%}$>βk.%KPjըJ*^J*>sMX5kh֬Y4h ݻwW͛[A  'P_4xd=[>3vZ8>lk@yAŖ}w:9?L\l},}UWO?yq CzǕZ_x88/2lՋNJ^zzUV*pҥJY@-.rfpb|I{L{AP<ԢǍpt~U{T$ uW\oI~oN:t&M+)–δ/cс|qt뭷'qQFw[:X*<& SO= hݺ5uYe/w&*&pl @r# Arϟ?֭%VVi,<"LA<*A'݁޽{Sn5WPA-`ӦMg~zU=߄Lb"P\ZDRQ Rg.e$ [ҍ7Ec WVq *@uB#SwXPր7|3ϡs*Ex :trM+ ,s䞪" :b:s)#)VxADJ}7*;oYpyLߟ}ҸqceGdKO,L1 0?ss{|3X`^P|>-\П}NY&A))ٲe3s^ A HK @1Iʗ/>go`AR 64np[iӦ09|`A1n B;l р@]ELRP`W||#B X $рׯ@C cEȯ<'A@H4i3cA u i9S >910"sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o@IDATx]xO1ff,)ܔ!efnSfRRafr3r$[e1|,쿲4PT"   A"hTA@A@4D7  DEܖ˂A@A@ y @! Pm,XA@D  DPZwމX~m6qe#5~3gDzz:J/^ n/~-^z%t9=z/v*7oX 55&L[h4jΝyAQ 6 W\qzeĶmpM7o߾  (T_~ѣ"ncc#?RIyh7tP[;zk<ϟnnMG @ܽIʃz';8 m=yyyjnݴG.]Ԩ(}Ȑ!jyyzC'$$xh<" R|TRhk6˳  7GŨO?/˲zXlFpyfرC{ٳuuu;zjZc]+[~N:$PRRo+VM .!-3f୷h)/A@7i(??eeeҷoߎ~[nu 3g ILLD||Fd+_{z*J}?7⡇6kόo 3?# [xd?G`VɏG=㵣@{#&~} '=Y*JKKUV/6+6mڿ)ajNNƛn җvmёH[oms׮]Q˼򑒕lԴ5zyLJJJ#6HSsss)J~W֦6ϤTڵ§{ig]A@A -@W_}laZs9/L㱕z|裏4[f}6iii8>ݻ5+̹km{N; cǎ[m***p'k|:xؿ&{UU֬Y?}S?f-@֯_ÇkY\n| Hqɓ[ƐHYm)ږj6Rf h5~ZA@,!ufr#vFoQ dqqqج/{sKA hb 8 EgŃ}sveeԩv+cB>E8i֤>ZonǬ) YYYvYYp][G,c=X~=lMabE;:.9$CUV0^k{>IV 'ٳ':84_3J-qĉXrePv8gE-]WHA@pW5J;3eddh?$9k V:"~'r#M2E?`x |Q;'ga}/>ҨQц cR`ժU&,3+mՊvDr !A@ABESN Gg9Jvxw5ɚ4Ѷ5zGiUk G'矚t̙<뫯9skGxGqvlJ3bKG{}pGg +GY}}X#LVpxͶngˏ9C[A@\A -@-؇d-_%{ve)؁-1+|[΢<PVfm-la! y"^uٗ2kxr@>c9G Y17EĊ`^V_&G|ƾAJGqV@9ʎ-? 2f^x!(fm#8  t2(QGF~Cx@ JJG(*Y":,A*Esie҅<@ENw߭L*)#*)%Z; A><@h?Xf~p ΍CGZ*YZ!R\2KGXq^E{yMȑ#[bJc-y(UvgmF:ZkA@!p#}E e'h_P׮]NNqv[N:ڑ۶O<7q[{2k09N  D  +s  @p"бLp-R   6 A@PE@P9[A@F@  ;'r  6t2PA@BQBuDnA@A@pQ܆N  @" P1DXWY UD$RAABQuٳG+hm\Fy#"s=: P0'2 @h" PhHALZ,U pYXx1z5^  8F@ ǸH  1A@A19EZA@A (7W& 1.*8#  pYCG_rxvzCFaBܿx;,d  (@.^-[<5y ؚ.5 V;vF  @@F%->P EĎwxYw8^HA@ ┣';eOX(Nk\3l΢#6m(tk ˗5Þrx[~Gy?}^7oO`Q(g/紛E0﷢(NPE $ ٌJ;F#}`FWOfY&!ZPg~8@$ț'?ѱ GE3+qYH"^wqqEJ8TUU!B#q555Pwm{=Ca^PGO(q>'>}H hv,쨮Ŭp 9-{[a$xrZA`( LcY'):VtXٵUSzPmceQ9^tJBK Qbg.ɕ "F=buFnrxCk2u\QH"w ,A@f<(=A7~*IQd}bp|;섺}, c?RFYѤ PDr=3/ԏڐT ^ª 8`Jh׀^@#66hʎǏ5 uPz?WB7P| CGY~ raPhR %zoiGcM:OOЯ :?U_LGlm݉w7l&$#Tv^?緯: CPu46%1z⭛~.[0w)~ոJVW@ADVxМeL@n6۸K PB`ʕ0a,YJb~D@%KȾ0^}<O ~μʏ8|^7D= ăa~4Nӛvׂ@P! NnƊ*,/-#T_tBEXPXۜ*sN-ܕ'rPɗk0(P[ ݡ'BwqPBrz {Bݸ;_KY쾬IGgS*/7' Y1x@ .g.a`v8E^%)oCu(rr'ţ_z@:g7*4̤ ,~`];2xP)?<GރZLe߶ PDKj#x6{(TH" ڥhNx Q]Aâ\/;JszE@@Nl;9@wbWx.:;+Ih kٿCCbқ[a< O͆ndoNs^Jz6 ݔ`z *8>Wfpiݺ"*@N + c3YFFXI)캱?k0nq a~. !Ө<9;wh{fr\n E 8*_VGTldYegA@1eH|rQg@OUJ\'{ P6y){&^~c78'茴^Aݰf [#PG2fe0 Vʏut'_Jgf^D6vYY+]V1"$ς pN3i U\5-J.xpʹ@@J쬮 qD"k.<@]CuDs_BG%,"g\eX)#ʚ~lF"f# hbV?VQ'Or fDPAbyBC0$Pr*TZpֈG(@UTN8̊< axDDQv!'>Ŕꇠ_,~ل Є(@.-l4[ӔY,S&A Lo?ӽC01=uYwS7gEj賠]"m P;r?(H%2Iym& $k|pkРA1|pXNĭACZ@"9#`3 !i&沒2TZ;HDu7^M 8B3Lj#> ߦWk`X~?B @ʡP ڥtۂg~MKG9(14=ȡim|`{A{yI/ނ IԒB/9ʅ0S$c2,V}iť`E'4[ ^[OmNj1F/ 1!. ؄FЍׅQŊWwY>c)$ QAvYVjg?=α~ϊوT/(ngrKeb48 ?0MV?HHgj]B@ 'Q\߀]uZ.ZsjL4R(Ce1Hu@m5gnllLS,#g#t)ˈCwPD,FEr0;@3 IKv#8ǐRфe!HUVXqa^+̼a$(GлBB!?,2:8hA19|GGL;E=gD8Y4 /0Lw_ݾp]›8+)8o&[% 0 sY՜AɚO ZA"! $ Pn /Ӿ7>! 㺉{`ٰ˜ @@_ફ–-[0sL<Ӂ9,؏ cmC `Y4;΅2~VTzue$f[̅c#wl6wދ3f',Al b|rB%0BF#z쨮 qEFA O2h 7?Eo58(CǑS0'28~Փ_[oՒٶ`J8S8Gǔ,y[òY(.*)[ql^`kp=%^{ECsgkeF-Cپ7 Kv7]P]CC9߃;k;^wԐ'RS}7B[?3<?{&ؔl|r_WUT#z&l^zY1Jť-]!1W{֭|ADQ1H[uOiJN~&ԤTD~!Ӻ{g^suGg`X'hj-S d9@@ ^c0sۭ,-- ][ ޺+kc0e'B!66RV襕U>1-~l-LJJ...FrrC dUUU`  RK`z-fuXlF+Duy_9Q' (@}7#//7x#ؼLSsIeᄈ_o߅FprF!A@juWMZUGgAjcmXmj 8BھQn 8W\qESbVd6ZӺ早u.y" NKroiJr;(LJڱmd|Uȇwy t}Y4 (5k`1eʔݑcV6eT@D}(acJt MYdVY^9TFR8<Ihp܊;y#pLUĄzmvIQm` .Dwظq#.-X`ԨQqn RiE_;^n7o %@2쌫RxI̸oF^B2aI#  ̳;z;ɷ?[[.r"YyNJOA 1@#gk& %oUj " )Yii-ZfKuO$>Y[)U"_ xYPBރ@$^]j$2@ٱ16-]GUB1tlכb(TvL \ۨɽe\~6lrssCz-$yk|τn`Md 2bj@.R$X#9sO #`Y>'nГ?Z. IR{ŠԼ3\# o-oĎB ЄGZÃ@~rSO$6:Cu&i5,+@90\Wb655E:z^z {m͖ ݉B7\ʊx 0Rbf 2e8! P|N|lm/F[[,*ӧ##CjSj}Lw_{?ϸ]62.XK$QE  Y9D+f:S' PO:3њU˯; C#$`6[E ĢNSXYۄHE/|*g]] Cx[k?QZ>>@yڠ(.:e0{ ; #{ K Pkź5P#D" PU͈g~͖B:@M% ׽E2w Gub] zD[,@qPbN~@ᴮHZҥK` ,e{VlgjG | VWfQqNN7Qo B*i~r pL^eO;ɵA+ H PhYJ+G`)>?[v֣2C9r07Tƪ -/ }ʽ: W@ʵ\@b ]D"kk1&3hyNȴ"yvN LOQYWҳR$7Lo7PMU_ yGEòdLDR Ͷp@@;'p@! #-5P|YvTעMNt?-@L- P d ͯz;ԔQtڳ.$B3sP9Ia2jArEFs_$yyBBWvJ[CN7m-;eCcTfw-\Og}!vر;ޠH΀d}1uTdGQKToz Es}4{!NƅN}PRu٣(!"ȒjOH{1 q]:)>SʃW@,$7jdJw(-kwW%MD&#eөq?.}6Y^R&Df%lnaIÝeqA3l}}=Fc^t#JU{;uZᅬCGYaݳ6A8}!0Xze!zJFcEtٙu&bӎqll$DdU)>Zkwe:=tUw+a#­OH(@V~Z9UMd#Oyh'jق583־gw}hׅ***Bll,q'%;HaVV5eP...['O[|*=5q"SG^]]ukWP9 Imo,h<|B͎Yo@B\)^w-%{+?DU1?"mmG`є$_HiMY1-Mti[r̖yы$bgF3 ӔGWeP*h~N ft8LB@ c0VF|jܒ趟ޝD;St?Y~oKSrph&Ǎ@6)E)s~8wwN=H :(oh8,x KŞ_T C" 3sgUxذ BT"EN1Ta/tqt |QWP#B$!qKdKjpgӦூ"$ч6Q^~BcwɏiJN6~tmnAirEn9ByoǏZVOA2}4CI zA_ k2u ?j+@MQ]f "TJ4?[_l%ә7٢?akͬ<6[ޙP!cr-زeK O cN!r|GGPz0,IYM4g{IP)X14qvPH -b/r(-K߹ :MZ\Z3I C~m5;>FgxY’+P/PNJ}Dg'",c E IW:!   PI}`,@P`kR9xg/(@VD~ rH~צ?zr^kA'ai(DǽS9!Z8A{uPnЖ1= F@4xX}%,+/A^3YOP~o[{GߢCKVU; >X!5Rj)&`.YƏs2$ ;HJP0ʱ1F>A7xHD7rPsţ^giVJjFx`"֞a8DGE![0<= /Mt78lyw UqjY֊zˋz3.vp&E1v+J]M"֞K#" aN# vf p>ch% -ŋcرA+x}\Orpv_߿ \ %9Sh.ԒB߆`:zcI3e!ZJNX,ҷͷkprԛH [j|y6#6Fɚ-dM7݄ݻuPɈI1SXzr`:4Z3tCi{]垯 ?zI?0DU|d!*`t֬[qW?9P.Zj> &v.q5 //CX  }6N TC(HLHw=Js+ N#0(@N.#࿟u.䟎&_xkSP/-9dF!fϏXqP1PJ񞶩VCk('.cRG#h%G,@(c\|%6msH8%jbvS~`? rWNEg`[^{ʁrtѩc` SNWH?/"E1.EX#U*@^9'֑2Ӆ4?1i48Rޝ> 밆ÚQ)*nzE}M . DQ " jUIV_GI9bJ#Ȼb~A c(_Op'fcNAt8kFL 9WPD֬YSN9.ƍ+VdE2 I}/158[4^hT)'}U=*3۱|mp\ZvŅJ# }ElZYV+Q4uEQ}Ac>خHŹ~[2}1? j t7=Doڣ!y0 _>sУ1:#a8z 9LBvMUa^r흜ˆs5,VãGᠼNp3Ip}? ΃n"fπaPݙP@%0r jr t #UWWcٲew}=Z;Ybc USYǖm7[pU>STG,9GQ0% >oP;2uW_Wj~YZTۖv_GX#aY{S_ݰrLc^j Ѐ] 5 oS>{J յ/V9JDmf)tVWTyI.G\N`nTc#?&B:/Ok?װ )v5: ť =3z[*ڱ5زa]4 ihg$@KwyfvmHII ɸj OgXH {1JI B/4[OA1ٓ ~bqGm U|p>Kx_}ɇ{AQ? 4 ZrSB~7)/} uZ^B >@C%=\D ;t~())~FT믷9MCKg_si,YY|\H y~Y úfa)Ac2Rq>~iU&J d53җ'{c}¾O>?>㽲vTObHFP:D,Z~1]X_%͝R,FwQjGTj K-Oeˍg#*:[`Bnia/gێ/L?_?(^D6loJڽLj 0M_.,TQfQ}7MWLJŽrҜQ/"YGg)mGy*[}wYK`6K6zR5UY#Nks;.-Uێ kdiUeC )->[ ԯ90k8llwBgrԖuVUIP=wˈr=& PGpHPjJKK裧Q{VnBj]x/c/wǯxɛޭԟ"t˳^v\TT8Jcñ!@>1ڵK+|:)))XDbddd u=]ߢp6RDb/XezN#1dsMm Ĉ&d;]lRhʜ48$霑 -9d@IDAT48R␝݆o7!--nS.XҲ3X}W5 e^7=9y n[ +J+0,-?sF|{)b2EB3*ݧTв 1O$?48~dut1t PqT7IV dje-k @*@\ O9W;N}T8_;} lR3G%WC5"m#IvhEQ%ˮ#¢?J^f=+IB#s(gJJ:)dGIc 훡lCnx^?ꌰ],DTCLؙ{wV޺SRg2kb|Gz/\E*8j{.zP5;>A-J(%u~v[2`|q])dWȰODk;Ps_A3ȫS 3-,@ΏLCe-"g : ¯M:>_N@I(r hIqYiiE+@%kH(4عs/k۶mn lf'Û,^2г_-o /Cl.U{eyv}cR^ ZTaD`h$t!t2>IQb@)ڂ|֯=|)jw|Lkz#>֓5ͼ:R=V>ctlѮǩ.շ%<-ңbY?#0 ܁BP)}%Qċ(@@:sTo}J]|ϒJ/҆U}R W座`ZnK6m^dF ۯ VW ӣ{zX~g gu?1 t˪EPmC Ivm` g@EWVg."F>c#C5Ȟg,J(Q4f( q=0_:dࣙҥ7 둈ϵwu6rcN@tPgjW7O(I4凅X&ܑs)@$;B{([ ܯa=;tML@ 0r!4#O Df@YAaT~x^1U1C8#EC u}.-t )?Q_\N({zuf]_ eJKje˵_cjSz:2@g6[6yG@*" 0, J pٳgcȐ!. [U'e S{[ym-מPw+=0>jӫZBJfo+X{WF3tyJ vDX#31E|& ߓ'OFrrK27lmv"ҘOa,_f׷|#9:}v\|C9X;dn,Gcr]W3kH0pTo#0q.fnJ^Y&Rl1ՠbcmk)jsՆ0C̷TH*ډsS5~ouBN{ڝ^ILAۧͪ{DVF`^Hzo][ٳKlܮd'@UR;1J # PsQ(i|&ͯd>2'MJk#!]`f"ǝAEC,dRﳎK+NLc5s Bym3*6yX Ѵ\|==ujr#5>=-nTtR> •p "E0@o z O@s)eAEE=*_y7;l@[{ T{+H"ݠf}Q2/iEK5})CZTQ8@.䑩Y-@"-w'WJ!e˖aXpY˖"_tO7*? ?:4VaN6j}+?i(Հ(@tʘ^8:@9ADq @ ;C(P{w^a/]r |2wj#ju *n\5C}BĦwk*G`8]{x{e@D*@@RFW}4oBEN {rXfLebq-2)J?n:11Mڽp>-kEB!IpJ$ "'H=# )-*-Wz>c(f ܼ^+zNBQ86lkJDWDe]ж .HPRR]1ɗD:~! PqAF(_,ru-珿|AWGOה>.r4)x| '4sizARmI̱ׄҍ\T'@d*@-Q`]xs=pp*ʯu="@FFN>ddffIa\/ 0 oAʑC֠pbRZjWC\oIsnGR*]T. ʈDdub&F<|-cdz11d,,,,m^gG„84[:At;ѭ={g+BT:c2怿VʣbpQEUM77VZΥ5c(xY ?A@C M >ب>@9>:Oj޺Nqqߕv8/>@@p9;)CnJ.oїśl;ͫj/:;@5[LuO^7'x@~"rXz5RRR0j({$@ [hL:J bd"!@]:fSĊaUFoaL25,qT&dLF|#]^ НzJ څA~}4&U]Q {-Ad4<ގͯ.ڴ`uv'^2ӦRrgҿ{9vǞHaO]K п;DVt?h >[ѻw]$kl0"OU1hxB ?,2 y\!%4W5a !K'*>)ñeJ辛c4QM<+2"|,>Stcp>@r>SqgcժU{qW^"SrZZ&O;q /0ph6|y^OdO\4.^y)xb(y[=(WLL =)_ޠf: 77o\uQΟ[3$!A'LyvrSBVn|'PhnRMM_ZCEyt% Yvʅm,f! 9s&f͚~O??˗/GAA|AH"T/[v;0xvʛ?:-..k#m=pX\s0S(ـr|w(ھ#y5Eܠn@c _4X-^`. %P3S1> 2Y}ڛ)h8 0}m @U9slu fݑJ><;vnݺiV_ۆ̘1C ȧ27tXŒ_~e8cO\ﱮNiӦ;w7|;ꨣp7S>5-ߎiӦi_]K!D_{J3b- v]/(hHZ2۱nYCRCªնi5DބWw$t?9薮Z9?+ ϴv,MGTVZؿ>v."~%s65ݹb/-)=òߑ0Mi hoIQ_kG7rݲbs衇:\"񃉕V>~7?^s \tEHLLԔo?)-Ӛ}|JJJ6W\q>x`_vy93QZZ/..ƍ7ވ"ס!خl gqc}u=*5%OSs˅Y?'"NLxPnWc8O(4h,[C$KChӳ`eg8Tm$_V |Ĥt8ƶ!eZj ~0: =\?)ԩ ok?3rrrMy:N稯&ƭh͜GoXCv3< u{˹nɹX qO@tBoW#0LsǬBAVV*++"0qp1bgHʪ$M8Q,YJr7N~fUCє+>z&0]vexwpGb:tk>;sEݖvڥ_;b3l5U:=6R~%e-_ʪҧd=#3Pp#`,ov E6)$d'烏XQ;6oӗR *}9VyܱFy%ՔJ>}TPԫK Z fJ Ga믿n3mfxa RB^SH& ;d˘l)==555ZSO=YE 6EAjZԩS5Y k~>(FٙpVU=uNoV=mC%iQLrfa69 ]4$kܙ)LU_A\7kvP)wfom 5NӞ0Qw)}^~m8B2Ncnj}/?mj8#<{хSeqklr;S45gkWb-:کgg#eDʁU&mxyʓI١ooچi=s7\ /.*GWSЯ{wN Y*.U;WK  l= ~Oy(k!jzD#EJ ?TJֿޗ cnmϮ/=䄑;Gm&DCcCӗJ] ܿk/ǜЖ}!fhMm=&ukC; \ǭbi7q`t6̙3G36#45M4Is2;w.{1t]K=p~>Vx hʔ)5+jIyv[ӲeoNӜYb/j?al e߮xIÙ)hnω 'G<=MK)\Vzzo{M-^"JT"Mۭ-rqBn-׎^lՋHLP7ΣcZj5ָ,{*z!蓇CnW;#OACho\!vj?E\{T؞:UeWuu("g?m]Oƭ#N s_WQ_5 +2z^t,uWja]lkű_}$VPtvu{饗4?Ǒۜ\mi*U9 5ᤌL&O={|ݡċe/6Gf8{3?󛯵ɿZ_n˷C>=f5-/l3Ei]:\OE-3$nW!t.bJ[\$ _ŝ -1jvΆr%RǾ >5)-^C!gC\MHxzamSΔ2Q#Qب3\>&O.ꎍ0V0~*!|.| \L|Ga̰48jMÇ|8T'Vtlj)1ʡq\>qT+`WÁU>MdB0 +@^{"7x`M KF+k@?\חW⡥ۼWHUTkgڿK8tGoeְ5ulК8jJp\1>`#篚!6ئ_\Z_ "՚RO`jMG-LctBl  T7}tB , BEZnwξΈ>JXF9JmMmgE4fZ'X)3Bg3q +0 /+[YHNc4oBpFhBNqmk;)7LyqT_`bv\Uxe⢬/7c2#4 >jS:My8<_^R.N2)y[-/Ȫ{;'q5&u'PKvltGQϴk0LN6|(xѦſ/-v*]{060SC%c..#Qd>qY?vlWJIIr ?n߾] GZFI۶`{?DsBKJQ'i|vFDo3Us p_59nxÍ\ek0}iR3rT-UdM! 8,[^x5~qv(@jq_(3npQ]/6{#.pBAu Fȯ P v[R5Q)]]/̗k{[^ koIX;\l>s6X{|q,1SѸe`YN DzWyҡ^'LWhŽOILSع*w^I l] S(*zȇ5V8l>"Gm l#6Uy]!:ex Eiwn/@INuدj{-{Ԇ"To}}g8ꍪe "C}ޖ2A>zϵ Ji6T,۳Y,OTT b/4T@j  I\r\^{-Wjv>v7{;;;L/KԒKIpׁ&)-QtyS ۣ2 BW٣.Hl0QN LxB0=N310[탚M=>Ff12|8K)pɢV)%9TC:'1~iىvkEgk@{ӠI,u2{Cԛ踍DIm_BƄ|^I_ʤA^#<Zug Q Fҳٹ t" I'K߇~YDit.2kX /Eh$b4VGLJ=ĦD79Kh@)+cE]7x#OA_~%"Hxmo1|UZn>B }Lnq +\<Loȳ -q$Qhp|Fg`Z$~zZ*\`Y0VT\q!n[t`.WzV"5 B1NFKw>y[Ͻ|LdVV0%؈' Bnř{9Bw{r{!4ſ_6RaCT"$P2u @ 7?*wd(',͒cr6I#D-(U xrH? 8$䰝4ZȣO:x5h,is.߆9^LC](Ǜn>nV nrrņ|c(䝒,6e/,,EbIٲe M SÉ( 8hvgÕ,-)0noҧ-~B%ùpu]glAUFG$`s:hw&WL )\*!V,Ǫ~s9O9=dcm\=nSaPRzG`Ϟ=lJBI٨ "ˆnv6kmNP7aV&PCFϸ rK+d*}4@Pͻv#yI6Sq|L90蔱l >îy'(g[͕GsT>)(3u4Υ9`޲SY@i=_#9Rd|| ڵ 8YYYpI'Yo~"Pa& DNRJ 6^#G`9{R*ȣ3!!CawTR2&}\q PO8bwq6k;(lI_=|x/γ[xw`KPؔ:K[رcl)CP Z톣~<$Ը6KD,!IdmQ[m_"}XWw?>Xj9L<1ѼCEJI] yAM̴`bH$s֓nіn毈;d8fbrI$q pKr02)3\ :U 6I?xzl8r(CD9>+)c Pܬ7 a}G W.ֿЛl~:Ĵ%Q=0 *iJpS@ ܶLGcd @6FY!3 ,0dqS(iY1PU z\ 5kD‰(&*x4߬bfGL@/ @lh!; 0:dqTʠ0&Д~ɃpemN +պE7ПD4s`( o~G4])T9 7;N0%L19g(?0zܼ@!v?j7t= Ӣ@k.I8D &+Cs=%!#C!Wr*"d\\Pu fB>|xՖL&SKnpu=J>]"]?a` 嶤ہ OԔ~ۧiGGlڴ 1EΧH"5k8F QvjXϣN#@|i::nFP/ Z .z7؜AǻAԋ/(/قEQi'p,,ay e}A~͂(_q0Ȍi0iX}rAvkuޣ*D.`yKw<^r܏I2 lSzz: wßjkkټJң|QQLrAtJmo_Kii);4???GS`J`Z:'-SNa7MńD1O>01`h_0mE~Ro31׳FS"O|'2I>@ћ(IW{BB ~bq)"Ð!CؔXtNϥQFQ`())(_~>}^eeelm?s92ZRz'Y[ FEEk{.tYguaS xc\`Ag6Fb-6GM{>GuiPnZT?2 f!|(OvC;py7 ?enح[䢕{ﮝm?cƌ/kP}N= T l'A2 _B ;AكA<<4&0d#O9FIcQ}zTZ2Ġ:3ܞGf\\ȪC n+! .O?h\ śy3`K&aÄM k 49AQ.;*l9ڟІlb_F?3 x=V^^] 7y$@qZ8P&`ڋŠOQGabJOڞ%EBʫD-2,6^ڏāE)m( OF|{< k _|9z뭬В%K`Сiro:)O<:/{Ϣ$]|ŬJ Q;<|pׯY(..f&vs=0a _p{"6t"!G6= #"ҥKٍE]$3TKԤ5 =|E<9Ju=|l9#C̟L{Z)/ucDrG @ʄHޢ_fB%SSFoh-hl9<(:sQ`dE~@lt8CB`CD2- A$I"yFr\3$?LhgDseǠ3gW_}hi+s)#6 9>=06Zyz;pWN[H',^x!猟:u*,>Uh)ƥc-7 !L<ФdіEvQ~?db05ģjkwPȼu@|d?ȷr0,NLPL?#1f0\ c׭H#v1g9=ɱ/p{# Ma̶Mλ"K!Q2~g}#kښh7>;1v9<~9H @  ;l=>DNUb'aBn·ƀ%iȧecn!!t5@T.{` z0(\S>vTj%qGt&gq9.QhQ?(dq,)ۺdF慛ÿ6 7 .u4ڽN~Ty6e ,(HJzާt4y<SLs#}ݘ&-4Xs7&x‡~ܛce|g;ufU $ \B$H层UR@[gȞ7sMUuݬ)ph͘b9sȁVC|17V⯧h0Lq"ٶ]lc &Mr04턶/!\G$lk@c@oB∅ƶ 4&]&@!3_ WK 0kG #1ؖ{eorWm)˕cL: ]nE<[ LLtOrv¤}=^c&:Ėۥƴ7DEC`6ߏ|+"NsOuRb-0P4 8p^z) d-< %B=ҖHD'Cl~+~ć Tڵm'8˕Ӧç5շEqa*QК?T}~}(57  Pk`且THv);/k>E lfٖ~YPF'gz v zV~]@Ris?p'bBz]E5mp(-x_'vk-MwYCrۥ4 }z>rN؇Ă 1Fvrat2-"j4  @Z[=$84hYFd Y#:{aĈla9Do3f`>Fŝ“NJx:-뺴:\YZ? :|Ɩ6m܈o|E2b* 9a\6.J< !`ҔJB[@[&؜E}z5hԀ:QTNZN8gH (ʐ_|?sDoŴcB‡ |6| %&&#*CD}mKڈіݑMkW@!eԋp:FQR5j]Ø# ;;-i跷~&v딁vpϢz̜1̝ӧS}<\r Ǜaՠ-}˶=2aKǎd_|Z2.F|듐ݡ]ili̩l}?چFY߶)aυq"%9 4p!%(,%H2m$ P[E@Nηwr,wqv(ğ2^x{a?1Q/v7lIjO5Ү|O~Ve[qivF|^lay Fq%7L}>voB;76w Yse?~(55!!*H|hnC!c9q'AcS2z9#jw:*,'"x>!蒳9IcDh(_|~?4oW }:M ZB  ׿> .9_$Ѓn@MCl֩:YL:ٚIGS*_@IDATk; ڦCk~]jHDu2}h1־bZ/wȻv"DX펺v WlK )߯r xzJpo1 $SˠnfO> TV7_nMb< >v-n^zstqꩧ ݗ4`(ZړiᬳbHo&MoO7wG+IuhQ %Fj mdXjsG϶ m(wHS l5h%(FI}5i;4#Q2NDj@##CfKhEC{3j,2oރ[A_&4D꿛nJ@'<裬%\f%E[ce]r%/AT)gHru`vRD{[G4̥)kiTfotmJ0:) ڣ!(ixW{2iWͅu!2rL:i\4ARWp.LmfpՌ?;cD>梧SM@M8wNR8AT$m:&?-rGU1( @mb.cHĴ_)#$".z⏘Ak`S;2 fjt&\ٽRgDRп %Sh5Z~ bf\ʀ66ޟ:triU@+(GТ}iJކ2_$.5@F&[?fZC|m!xf0>/}, @xloGnoZ]Q]/o.v&Ƭ5o͑lJ{(FR`Fe2)S\x=W-4^-a ˗nyW9n I/X3=[+BRd7Dm >ni$4@{|H"q90؜9 W%;FI9c!LY =13Md(Ț<~:2Ё[Wsw$ J7-lW2mJlng>J5nq@LIW tDg}BFպ@9s& N{_Xڗ k_VBu@ xFјRӻ~P[ԴaHCn>oA?,-#d ~Om%(.5=s@>ASB=8l䢐"(ڥ %\>"%L> ,>AB pp7K vͷ1ˍ-Ƨy)9jh*jp Z:T[ʿELoJ, Qoj#\اmٷ d\?=Z.9̄Q^HhK\ :CK:.>^ӷlX"~|> BVrXN=o# XիY1SPUV4#?yyy@wO[nγƢܢ$7PQ"2]pv鮺kí?.}(m%<%}VuMDޔ[DDԆH5Ui$F)&LeH@ⳛE\?%o0h΄W HܝFh97٢!4YCv'ar`AL2%-J5+E㨄n^STB&cb^MGڂ>7s HSnE y_X;iJ?`WinmCB 8 'b( C7|-$4-\v=9"4{DFI)5 qD)PlYw׆nO?] @x.!k-o͚5nz@W ? n:Xs4HwH#ɑ|c*hcs7H-a)wus>2 3UG`ny sr":u Y2E1oL,,&2vpj CY]5i}P@\YNk=>dxP&kn~/ހIW.u{z^TEť"m  tz擰'R>ì35 @|H87o+Pt(99HBפa"aOإD).ȮGGDo&k#(yd8S<&!hՑrۚ1/غpqg`O0xMsmhjnZz_Mx 'dzV~q}V88#?5L ٞ3V}hFs@!tP bZ4ǽ )?- F9Y"{0c:# 8<ROW>;nֆ)XDA 6Q6Ev_̣糂iHcCyE)z.c##jiÛʫCIMY HLIj yǙe<& Dt3ڊ((!f$o&;x.xaH/Ԯ٘=+T:Y|Fd:l2AGA8٤BZHJ>QPsE%4Y+<0i}C+.9mZ >C}5(HϡrM]/bהHA~Nz4?ԖBɴsvZ6Sz-"j~z<..N9rv\{O?] @!3ϳ^ा9ÑҢ@ͳCj7 +?j@)|IO3r{#4T1Py茬C PDb[fP7$mW69ayqz(C}m)9P9SX晦t92GdZ+D! 8ƈy1dL|GPNKnfĈՎA>r`IrV/8j;+ '. RK}TQF^DaJbJIM.dΐiKPS:@+ON5l}s|I:sP7awS7Ay}VJ*c mG !k:\ѩB?S`A5h;'4Ii>k*N iv8@9[,_O sI0EA{=a#. .^q+#wRe;pWsmB3;c&:_Zmwu̐cQG "|+ׅqzL4rOvŢDq`44iB#(=#˖(ܕٿdgγr뜲Q:#5S~P Ǥ\U蘮sH-;"nD\@q}臦rF*FLӁ^b%n @4 ?vNTG&0[o*u" Ps|B/$H>@>_ m7cr_dOKK%C.zFTiF9l̬eGK##uŌS>Ch_tO rg3j8C߯J{zm) &_{5yqr^Qs}I>@l)EM@Ƅ^i)dPGFc'eq'i|!*y (<F׻H[@ C -{qE.3E.zxwŧt>'{.^|AlS"r-)ܹs챶9ih#sdBp;6cQ~R,1 ўUpo[`o%7:;Vy?hhU>[g"p &}]>ȒR ,h26oV[0_x&0<[PLL \~CSO= D "ʫ[ ɘћ~hYqip 2I k|sCA2l/G[Ҡ۬j+11kl-skE`mqH'WokW4Z> {e&| a`o@~ۿ{8[-{P%Kѣ1uP?=3?k4@b;(Ѷ2ٷ_I;FI KyR'؝U렩a6D>f.L2̆B@_@߶ޯ͇铹N L.P>8 Yr#upgP s$ 蚓&BGRe 8 Ps祿Zx:=7&JvKy|;%DBC[〩8!e ^lxLHH=w=c?@̨F rǧMkh'٬һSc{-=.^O CA>ޥH[O@Jg6+a2wuihwG*5r(ע}>/9Q#t E2DysHDR;rFWMQG f{xT҆&ӯ·>]]%-GRxƾՀ+Zs;oSt[L ~ADsu6 jʈlr.KN<ر I. w+(+#[%1߿?PH"ҀD)||cZaAAk9_5x<M${t5?vd0Q(/~&NXV+ˆ[JRknF &]).07gu,AGt^QɑrDDߍ 0<_n3r= S/zMFhRw}0"1GwNb`MpwҦ: lC1$ wrjh0 ~MAi]2~i-gʏvI!~bNE'Dk_: bkeϘzn:&XvO;-c `;2[^&#` \3[7v;w1n .\jnv+"m|ʎ7vA;_ozKM,.&0) +v% dwȁ|wڎ-﮹^>;'.q'fL(*WZ^\@m ^_p]0F3@ތoκlC7Fʂ*DgvF4m@^'  9'uUفe* Qs0&=Ef*I 8Jѽۧj4a'3iy{4h1WPo@ÍC`A ՘#LmeV"_5|k@'( {hyok50lOCAWh k o>O0XK,38:ZH8HYh[@+} +P3##;Q*Ps~<#^G# :֏_,VZ#14ܠ97eae*ȕ-ΜA@H.:#?Ul<*q0_8(!(_1`ğ\,(o{zn=A:VffP>!Riir{aI# gur-sNVAYn`[ZZرcp!8x %f߾}@I "eJQQ ={6hZ W_e<ѷo_foZZK"3":kԄ~;h{}U/EqScw<aM(F!91z[2vu} POֈĻ4KN`. e@eB4E0R23ݡ) U>ԺcYB2(v6@@Sz"\s }@i[>SYOʏ~dddoƍ+W1ìPDÉ' voH>|8{`0sυ*ظq#{@'ºuhnO\ @jr d޶1D̙I߮(%f7>)*{$Ƽ#`xJ"5k 8d HGuZc/`~Gub,GPF' ߮MC,̌\/0جk{Yu@[oF?U =]o3"m'{9 G|.~V&?#S W$uײk;ۻ/ -b߾I!iEZ|9\|բlr]2~M@T^<o&PX9?545?|fK:ֹ{Wb ZXHMHW!oia 9[*>AW`;f}ZĜQ[(THS➄8׷U2N>$85m܅?,شtGv_ue%\–h\?] -)-\A64@Fbώ@(---i\] : Jl?8%ڪ1!P `hɦhoM\Nm.ۄsq;?P!7TŦa 9u~z !_s粖!_^)L~ps"3WwNνzBgF-?4@4l H9YmRZ$rlwt8NAnINcWAcs j |bU! 1EsSl1f~շRF i´Ft2H0[ցA4ED˖- Zt)?>RD;N>C~@T^m~m!qeEvË1; bH ϾdNV#bS%QsGz#,%l= twg28sKߺ kE~?60׸nhoos(:cM+P0 %K yڴipM7CrH>gDΔ{\ٟ܁2OwY8_1 Y&͡ u yȽݴ j :ZK߃ c{-k CTD6{W#"q/ @&E֣BsEO/f޺{Ѹ䱹q3nh Ee|dxuYn9.Bao쟫( ,L`tfx0) 1⻰ű*+1D#ӿى3OӢL X΂g>-QZNr10זrlԤ솓| fOw,9Yfh3@{c܌9WBBK8@xQr>s.l GWӻς` UebN)2F"r,;mL` (QMbid>;u |VRi. p>&;-HvByv54Ah"R9XʹtHan_v?Gg* 2 @a6% }owHJx|_8_w!6;Cr_> ͈v>@g2L5 "P="w/ {qWV:EdiZD{5\ @FN-i  kwIn~+mi~ 5=Da]A6I0wWhRK>+;7~Q+cԪHL z7_/Xch͑w e徜PȥtQ}v->\ r]OK5GMH^5"H0 v`Rx*PHQQǤ&OrNVܼh^sm_D4ˆn Уv ݶ -@ ۏC\7"{N1PL:MPI{t YчQmL+Aq3/i3q@3ٱh:`9c*`ԮL @t>0)DCuρ#- nD0bp C_: /E n Xc軹 _aixFP`xDwji?~]SW 7__8* YȏYgonkJ+ 1b 3|j4UhCuNμnvD$ٱaA;dJ> -$ ,%/"Qd' @\2UA͝Euy&ix&^G C<oc7֫7 Ow.un|0u87/n_*CPH2ٱaAG&L1M#+> %G:\'Lsyi<ٟm;~8Qo\ ̿},1|̣4s 8w!vj`oZ܁%s:H1 P4@O(a666ʯfhկC#E[CLNύ2&/ҁāIʽ1x4@zUm~ħD Qux ;j((GW"(x@%k ȠBj/vX9-o$O7_N6Sb{iD֛P;QF56P'ozKwok_3+'rPTmV^z4Y '4qTj_]R;ATh Ci+d\LvE- Q ̓WkK O(t QO݊0fݎ (ť^6dYg@6PL 8.S@8 @ UGmspP┓G1!zlǀUzI`QrNp1G$06ic_DvVa7jPaǐ ,0ܻJ޷2 )#~{*СBrEy p(@׀򵯭eҁāIyІ L6=xˆ|q.-k0(># }] ͻi FO$E7 x]3h3lMbNߍbbNs5|DQ)ӗ| 8,"(mJ@wNO+ڴ~(GGD?$碃06i:?cF{>}z;٨uMI[&(lZ(MG 8cbD*FŬi`_1q}zc!>?&K|A:~ /BSX%7M0h@/q^ -sE kl*)LW#KS19j>,5Kb2V+"8 9A. gV 0hhLRƔ^q Ճlϛ*( zD9瀾y[ !y=~s΄~I J@1Y@DZAؗm\1ZJ6h,=Kp' &T50(P].@PVL{n:uj|迳萵hv3YD;2HGgWW>9ģA~}E^Q`cBT:dӚ#K1}I O5!H$CAȝ/ny` C28vTR;,qԎ'x? #LID{B]_Qʜ4ufʀRS-Q\NmF^ˡ%0j5#ɜ1/,2y D9gپ13eP\rGLJ8ȑ#pWF!!B'dB~8> 0Yo@H4Vfm~GQ&m?LJDG?eP$&m @'E}̙vbsRF4}AfP_8H¢E~AH̬3gZzWu]g=uu‡w {v=hs250]xs#utb;Am' tCt_Q+#͡Q .#~7ChϦeR-F)#ɫeɚzR 5D۱?~]!rdfЁ[1V#Q&`Іȵufu7 9 ڞZ4m&[diiib %B4rlƍYӦuT'zږ995.ٴN qѡ4ԈcT< #Qx =Cڻל {J GcC-i|0i`Z.۫e~(+<8n5h4$#k"Θ\XL9}=UCʷ8{(N qq_c!QqPii)|w,璒ફꖋrَ]h?D & =jDh9r^FVdf@r%YP,7 6A5@pW},`hJh"KlA.j~䜇' !mI"`QW %X~PQ@RQБ96k9L RF>Q0M`z9 "=@pP 6!$aVx xd9٨caH*UKZCA4o7lϼﱶg@& MrhDXzH$q@{D^h/VCS:!b;7m cTahjp$ H_Mf0bC&9:0T5յhilb{M*AGgukA;Ę[<*0{L)l<u(:H҂#;mDϫM I8h`d]po[qj ꌓfQHm(۽D9GD"UAAK$ʪm;tC0ˀ+0lDiǼn2Իȹp`P!׃Ԟ>ߝC+&0VVXGkàa1vE(%$ 6;uSG"?ƚG?1f:B<] S`.b-]@w=+z$ K0[(Aexw4_D\{ͻ1Fh!@ۇkT◁1Zy3vj5P~ "cvQ` 3Ί=^Gu#(_dAi3Il$0+| Q @ NI?DsZf&#F.m(v)@)szp G-b yÚڮOGP>#{QJLHs^U Hʫ kg5fwpv@+^thBr1٠i{1TDv1QK҂&0^ة<*zMºٮ ;p`^.EK|i s9(ξ4¯=$9- @;PZDdSzΦT4]ZdWdrs#:)ェc ?el?L9Àٶ RFsEW!$['ych/Gv`H&0' xdؠW`<SgeA4R [vSd;A뢋@ƈ<P[`{lh9~ߤsIrr$[r#ydؠ _"I$Ɍ5kaK=*LC$ Du1}>|Tb8#VbcӺ`^5(y#BqҚ$<_l :1gbN0/Yܞ_asJT9BOcP]}^Z948MQ#K@P+6mM_\em2G?b޵%iIX"r1l@(R:o)5);1A[s#Kw~? ʇY:8 q{H KICjB] *.>X(ݬh\R% W` jHK6[i4@,YBh:H<Hk:&=jtP&p6Pi/fȞ&Ĩ-CXG5}:voˋCYV%DOB@!Og@>HlҞ$'{i J!]jGڤ@Ik{7IDAT h9sY;6"PW#HTў[S:8 qgHOE,$!IMStu6 -u١?dp 9uSs' ;ft5kiC 0j"fnA[JdCL]HZ`xFX3A["* #q@1EH0&&L:8`eC1QG.LoA߸^ђ 7y/` LkH80v=$]|˹'/ z!Y KhE_Ha\z S PVH&.i^eɔIa5d6PyA?wQMKDPTpֵ.tw( kC! DIm28! )iwysӾO99)\n;5(gʣVPB(!9e7 Kq`ڹؾ^!AO@踴dW۰V\l=s ~ +}7Rʋ CG\j)66$([V7:.E|gi;ȔFEaZ*n{NeB@w$b K6 .k qLBo#(I 6jD @q.#˚a(sd9b)IUӚL78s}ᚉH Uy?C-WӐ=W.TcGmH%! ' Xqf(]m!9c68fd̥p5l2zCg n5_:;320'  7~`CQ1NO#6rU# Qv]MNiK( YmFc<ר|dTMqfTϣ*!)M5z6X"zT !c"퀬RA ?vrM<4NɁ-гfHٺq0Arvx1רnQȽt.YOˑfkL!ww700D]k9&oЉKxjddzhIjz l# wf1]n@!l[kG_A{TRBhÐkm>ag,{-9ЅnGIII=H}~<Џ4ߴTUU#7UAZ6+1x/!PxinޭfUY.V(Gʱ21OTB\ʚё 0;_|%?q`wm9WRS.oXؓFj:F:3"_y!gz/5*-k#}ۑhwq&J)/t!fOtH^ :ٱ>ݗkd8EСCB\27Q6oib8>/F)J( tklW(-%3C?rWϸ~!DGT#224VGlq>Nsn]_'{Ygn.(W"{wigTrchޑOXzTJKKQ^^R~[uW~d kv@\jTTdŕuRMc.𶲝`$.Շw?}.\rX(QʃU ֿ̙sVT6Z8\'դhжwFqs_0|I1!}yV ~SGb<~b;uT^kR'PctFZ$)GOiU?JHe8s _3a+^ۍⰢhSyoPUGfPvnR %^5o&7bjwc>!?}ǔ0Ox[M~rS!<s=5@""Kq_q$r2URr?Jw]J _EH|J*'ۑV7} ;W[]C)4&X) ?xX{4W&B@hG i= S^R;{_Mv @(wYId*NioypQM:m%|TՇק5oyB KB/J{6ʏUĵo]p=j0dצ'Vl,Odʠ\8#84?*_PI@ 7AyP0 @kH['p G@_M˼V{QV\tj<pcZܑ .P0;p]W)0?osΝZcl r ^󃯈Z0Z < HM²|\޵c+k^[Dnb2Z(mJK6!*xDF :,ɪXLskbyk 0x*Ws_@]@zhp6ZU?ۑ7xiK"TKuֻǼ0" +|H@ `6 X ?\O2 XLp:jr`(Lv48QU?"7 I0L;Ήdc~w`P #J~[. sǑt׳~s%/IӂFtNRO ٠`fuU~>5*xs[yOUj q5k8Y3 |ZOVonox+(濔Je9Oߦ ?k&/ZI@Vy)_We%J;R*?~|ʐSaQs(+a 1=rۘ;*TdxFK=\TxX
  • w;ʃ`/݂^<֬*EP.q_yT_تap_B"y(&daS^W;\e_:f5kz$l۶ï#Ep @z&oxT_EqVtkMU `pRn/;ER[TG@ /d mUZї,YnFaH:%GQL.(oҟjgwi/˃iCbO;Hs&\%o?,|Ә 2 !rDbIe#vyObT W;ަb{x ؛q8E&h/CZkrzG=ƴl?|j~ m1s1-(@/քFw7{a (RJ}{NG!˹pը8_*+^St1aeؕc$tvqyC(EU[/_x8x(W^"y6c:;[vO BEfL_IBlyaZxd(uX7С+7kamҥӎ-Ӑr 5[J[J)/2nЦ=nǂ9pTW/Dѝ!d uJQ)|~>՟I =;ӞA׮}>9kZT` kX3Hq\k}Z?l+0F$SSτz_Kٿ IWdr?4DSLyui>ٱwhݯXztpq>hѽ&s\/$L щ ~[Q[WrJ@d|^$, @-jí/׍Vwn\EgL)ؿ)E6ѯ[=x D!51^MA]߹}nߍ^I BpRG5?&n/NƿNOˬ2,pN} F2 6 8ѫ*[z~NsT1y8.}`y'{j.RY -awY98"s ^k y]K')'`0x(+W [Z%|cbA0) `8'?eGWˈi{,Y< tˣ{?/}# 䤬tMIĻ[>c9cI$L5Z3guA,9_#y*kw"5 +@p>IA?쭞]ɖ)qь>nk+(V8} -0t$skaB d- 7XN|kB0FR%Շ\eN\zd_ѹljXb{Ϳ 10Md(B9_Pֻ?| I)?E)̇}TخN> i_ bW0P )B@7|(3:ZV\m//`0׎&[WD)u>Vy&鄵b:}٬m`  w9)(-hhxsH= z=pI]{*rDL Frq"`>ρh =0\YGK7s29cd:iw1=jAMC0: m9|ʊ%0P6yS4**">9p|տi0]}7Lco!9ݧ}IcB@P1/fqUN0ӋdTRť hik^cnB t^ ӻ=~ibJwq;,qTUIŽids.\+" /ל!DM䨷|y}>%9xל14@97q?ؐCS C?~!:N=ni) ?#wd3g"66VrUU(7 FRJ/~uaÆaĈ|`%%% [<ط&X6nvYݩCl j;Z)+7IQx8澜Q+) S6$̙G ڴI S1>[׿ ҆며]ن'`ɠk5?5wD87ku#i&D5ײ̀ @}:_{ F~.v* Hak5򫬈1pjL;$'*WDR?TΣDH9BhS` Pi?Wxm GB@@^zaz`1rx3|Ft$iब4DJT[oذ%?_^Nq|j<>#YݳYD&t<%Ј@ &QްK(X"hCJ6!2e6^P}:u~7u2?}MA9}zb8n@ VM;w+BDWx0c`&ce{QjOɒ-SQ]ÿW"ad~%/h5@~: ^FB{qZ&! P`8K/ALB`j( f Q]n}E FRn|2 ! @sDj  8$ LH.eqt_qv Yz bG<< ϩUTT⯵(5B?iuۥ:*'sLVח B@ H0vD.ZX`muX>x3YTwvcY΅ .IoљgFwQnDM|dB@/weudO`a/]%`؋+n@Dbo ~.9B@_ @tH>8 p?&e4҆\B@舀@:Z,- 86׉N[V6^o8H2gt&2l! "a!GaN &h~ mdb] ;fc*k+>CuKHB@ȇ0)}i{:ʼA3 LnɘJ"utDgS! ?iw:5>j\#`?Gɖ4qʨM 0zWY EYOaINlg4mYi+ː2N(XsbڍCRG҇4*В@Zq?S[]Vk~D6ͱ;<8gle;&҆ B #wwC! N Ӆkl 5>E$l(*iQK\Xz6ؼ&˶-8R"ӑ>l ОN% P-}ߔz6%!59i@l+x@ ѺlڼXK`HE$Ki_!4Cr%ƫ ǚ͘:0/֒r)`(K%umڼ ~`%i~.e=xuҸBsc99z]V(Zdy=YRrp\SS\X!/HT_s !Dbko$Nq"xq]n$-P:O^""dF^.>$ aJSChFbω< %I:3ߪ).81X8k-P/@H0(T}&YUU(unf rVSh5o^Pb?jMٻ5EQzֽoœr2b 4[;oMy6 >hM_M{q=Bd4]ovhx!zmv;2'A@yG#blZ4UEb<|`}\~EhG`GU [*іvo3Ţ~ܝw(|X' E#"y ڜ\,! B.4@ 2C=Hv+֐;#_{g48HHo[^B΅;"ݒ˄}A u eW(Z~"г005~<GDg_>’| ! @d 0rY4Gk߅2 nRl%;)[}Wd+2~$O@B@D${8=X{ 5(ZC.hn];^="oɅds# D2rfqLh}(q.rUMs 2GGR'P}z>I S2Zv%/;h  ӡ~98O9hs"2r~T -BElpDeUPv֠zcEg3`(ҍӡTqdRfguVuh}/0Ős*q7bڍ4kB@VE$SPPDm"&&Z A~92.G˼@T6HL:Qiy81)Q;mE)d7dAuX{""LXN@ZQӄV9}VVVCЬp}k<; PC.7&P;F̔׌QuNFL0ǴWS"SJ}UVGt 0Z[*)*GWjɥ. III! @BcՕ ֬Y!C`ѢE>\ %CpRMxK U6!BC!8&B@藀@];B@!!<'ՄB@Hk'#;v,`2E! @tXKOB:tiӦ!)B@!;KiI!  tP2L! BwDKiI!  tP2L! BwDKiI;pua>o[B@3yeAO} ~2@! Ւ ! >! O0J#B@! Ւ ! >! O0J#B@! VJIIguРA;wĤIBg2zXŵ^^1x`wy! |Cf@x3gT__UU$fH ;v`7x] tM0 ]\-|_\8XԩS1rH_ ؾ+11ӄ>|\B@ݨ?#ۇQFDeFB H$ 0x믿Vo/Z=ZxU#xrMXW7nGttg%w_~Yfaʔ)s<#DZp+"d٘8q'*P~G ==WmhӦM&?j𞙙Y ! P,Dch׮zyv[rZN8us޽W_5KM]~-~̘1#,e!B  ,}ƍq75>}j0n !۟;t'|f$a; /"?y_Ҡ@S c/hU&t\2X! B$/(JB@!  !  /(JB@!  !  >(m ,\K,ћ9Ugt(q87ej;f ~yumr烣sYv-;tEMJC3sYqGWYt)8Ch…s!**| ! N@\: e1m4 :Tfii)8{II 8+{uuԖvi#ᄙ't*LXvnwq+pw>W$ט۷oK/Tb8#ŋ} ,@jjZ'н{wXUr'㡇R?5f{キe9B@"E4%JnݎjSJ4"G¼yRҤ( j0K!Sϒ࣐6J뮻R(BZ"J!G!zNʕU$)6mR)BzE퇴F oɹB `(}YFT prn$0͛5+xo ,[oŸq0gΜZzEEE` 'pcƌ?{n.>jsm۶UvQ=t:''G=g-j4FFF5R|[|aa!mدz̋/n/;wa[zK} 1L*7 19JNNwON @P>!.w{챵Nȑ#kc+SE7֯_ظV;pE[mluWN*d7|S~>@c{,qqIB@hA@4@ZP>ÒiFDXӰ4&\>srmm5n<.ޖjƞc^m l=jĚޞêUojs! Du3 /\Ӱ7*W[/:zX13m/cA5Ebj޲c}ܺu]ؖ[D!'" 4=\qs8 {xqkz}Q5@.oذ}{I=.6nfcm|^z%u "kгo>50Two`/1O'I}! _l4̅؆my =##CB)ֿ53 k 8ԩS1a5z3e]_~U{ƌk;{qa{O?@177Wu}84 IRZHZ~@ kp&5faݪP4u/qǫZy+Xrn5B*9eB@@- p![U>Z}GKB@& 0"v<jQ8J4>|޽)P $?B 'gעxpJ )B@- %}[! Єk]:B@! $ o! B@"i]:B@! $ o! B@"i]:B@! $#eIENDB`factoextra/tools/partitioning-clustering.png0000644000176200001440000017042113144620014021144 0ustar liggesusersPNG  IHDR  pHYsgRiCCPPhotoshop ICC profilexڍ]lU93kU-I!Y( .Z6icݱl WD wwGbb"x!7L ؘhnlwhs{}=gf un҂/TB7>a.1ͲRP}֭I\ظeS2!И HR]Bt}zEqtMF@-@8`N1*HO*ǶʅURXkm.#xm A]ɏO@ʬwlX 5 Us,Izsp!~P}`$&j/wrf9hTPHWN\rĩ}̎8[W*J@7hIPAxp19G>: 7TZqjZWV|wKŨ7=(_﫨|!KkMT4Dbq2X(Tqp) ($n;g#HQ8"q Ve ibQ<걼4-r+EZliMvUcgsbȉڵD5y^Ģ^%˯x4wXws}gzɱ!`:V=\_/W\'CYwҸe=3/ťdͼ1qWvx./^X~p;AGoׇo sJ~?Qw3kvK;ѾѾ>Ѿw}db}KEf\e>nfg47:3gj[\/8n۟ŵ H<4o(*x'U)z&1t*4F,col2v:#T@0*V3V]i yv_Uq]K9zXJRʩ>OX'fXq@M4D+`vSͶTlgAe~ZH ߚ6|Up cHRMms{n3'InIDATxw%U?pc癞$*HV1`a]ݟVUiְVQ` &2y==ÐvR˨^,̑LgGrޮjz#-`;k sU9 nޣ[g)f]^< 9 k$!qr ̓΂fx;"?GۏNa@5'<`=g`E\ Gx[EW]꒷!fW}|h _BZr1P^9A]U'Ƞcw x^@!7ܷԹS*w݆ 'BBy'evbY8R-S; ւ0*#/GYcpDPI!uWťP X % nW9:!uVYuX+"Ym;s{ `%@΅t[H-X ;Z:5skpvj?l:}x..1S% '`kܙ֬0T@\s8QӣY֨yDRD< E9]ߘimc(0mߪt_t!Щw:I ~յP]V5|urI;k 7xۼ2 )(#<8nma)rV 0pPs-M 07ibYktQ-{,T6B4S58Ulv"7"nu"}( &>Voo_xkڒKk%bg*:QU_DtT<Ӿ~P ]@"W&";~/"_Cx鵗ӛj j{M^-6l .o0:Y~J[$WX/:iuuFm1 ꀻ;gNHKР0}m>" an v0/3ݹ˚>A)J9' (6SBz}bUy%sEx?ºA ulU>``Nrߴ f~%h^֯y</<ֻNMgP(|ܯD G&t5@OGTw^s%T:)Ŵ]Υx_km}伯#}#q~y7 2v蚟VUEóqwx!o4yKg=u,|-zO%dAqЧ BR>Bn.I͉O/gb)xj[jyk׉hDKN̗qvZNlo;KArpi[cd`ץ;un7Ӱ qG4P̶;Tmk;XuLGm_c'-@jqsgX-3v!{yY $ğZ-H ƈLhx7_RM:T61~?[\8G\WLYխTW*j<Яq*7gyo>@z/ * 3 ,"ֵ/DQUwS5vW KqĠ&8ˑ9J2k-ȃւk錏YOۗjOOHZˍsr&'9V+ S>ΪK5x:r'({9h@¿3EսVUwSUZyeq_n-cgDLA%R_ا8;`S,Ąhc.ރ 45&*8xbdΪkeC/ϵ};P`FwE@=A}qɎkRvf}е[UebD:*HEj)Uc?# cHW#C믔.+dhRO3 -"?qShчYDAv٬q{MBu Vĺ`b[j"oXaIaE|dAdyz|H( v'IxmeOM W) j_$C|cƭq~:HQr&3BIЧ pV 9ykZڶ+"s Boi9/-][x-sl[mK ^G |  CiyXڑ< ;`k/H00f#iTDmW ,Лo@݇iY51#(L 8=9{z3'-sK[/W?< >#;v_t[(ݽ?a߃X oAv?}\+ tFF&pSmS4GGi 47HO;ɳȗ&1>:kB\r!j{qotD WE}ՇuRRӀdV'+d^y!I#_f˜DxW.U KwZgi"9s_EFo@3I~X<닫@i|4K[h_{]PS}!V"iS2͘axF1:y'}75vݷA"?;?aj-P-ڛ/%"AD9mqO_Zp#Dԉ~ŽQp$]!F;ws,Z< FAmF#k{oDh$(   ?hùjd+/N }55'Jh!pN1z{Zݲc{~L ">ϒ 89,"R(,X/!SUWM?UAN0;' {]|,aRQcBX-ɤ)ޓ0Z=u$I4IwQ,`9\wS%[2^p3u^D߶R[U4̥i\'>u3m0Y<L_a o~%O'3Hx̟C*BФ_>8TQ+ [>Enjg֟é!P{I\ȭ1?VS }$jmE12کUOCIЍC{sa6)mW_cKӂJ;.JlZt""fxFymβ|VF O+`jlulؐ@ZwR3Bzk0a||9r"a~2co(GЖ{,{.ȍhd1b|\Z͕B01o姂> \:F GU:|)ܟCw?n4qRɶ63not?hRx<1_T깚Y 9)hgj9-8M9 I1'=x|ٮ=qP6mo&0UkΦm?]p8rюGס+0wN r E=A0?QoA_5>EvۣT[:&Xtuoי[;)M !Q:{!lȩr쿽C vPIehn/|°' Gvmpx4^C[Ͷ5@ gVd PE$7ݡ%.A9.M#yՌW1-)H)}b@5un0W zVHz+sg }*3Eqơ* Nozw{3w&mFrN6A$$0ʪ'.[ÉY=/p)SC)zҊGLRoӄOs\K/$Q"~1oRԡSuQI@]}}uPЩp4.a-1 :]kTLl\MȽ'|0.267Ѕ\j evT8`p%mW|:ck7atx ,%uhnw ?.bp~ W09}#-fi|pev׈cѱ<ͶHD6D-b AhG-7&V6>tfwaVČGI> #˟,n\ s  O `tiC-ax׿Hu+ >OI k| XRRmK)sꁸ#$o٣Թ 1Lg@<^ Qy爉cLNM uD>ޫ.E|ooS6=M*ވQ 8\yFOR@ +1ORWra[˲u3'/T?D?&̯2kwP Mx_I/\ZM׼3p~6<2UjmۄȼEf I_9%UjxH؇(sȃ*ۢ(oυHCHgYL3ӿӻhTĻu{ C %Y6tԃ*/weF:ގRUuKӷo/Bnc4'^c#\ 5/Fqt]Dz "D 2mswzyP^_ k|GP Ҵ񑶏w1~24Ry!2y4zӯab$'=)ȼsMegQxI(>n\cɵ wB+Lw׷$+BQ[)chymk} 7pQvZRl;h껑s$0֥{yYHl-4iWFbFNHA0\ yXwm.?MAdU('o՜wNq5Z݂;5W" :#ƥ 4@I4g+S8j' = ؾ.{{9}G̊|{:]ρL& ]T+r߶EA[w+`T*4?Qܮ$0V?Gn-q`AsZ$, YH8]/(|,ڏH$q*j \coPڵo&nt\-oF! =s'/w4s<>{ WXf'22ɧ.>sSa'-"B$WZA[?f{ _h?5_]N&;RͰXD@Stb'nAuIE{1 [n.%bzΐ tVƏK/NG{W$s3i#9m  ~ߤYpשL0F>*wѳ\L PCCDD-Lx FF֐Zj}S&4vU1餩ysvl9kNBĊɮ_s%gH7,Cl4~N=I[ ݉1ջpxO$Z?޶Dqz'E$#ۈ;ɃK=< ֵ\wAr厴2Qm]<yjv-G`7Y`M!JcΠᢡ ymQHTz}quk)\,3Ǖg&t@9/ĉd1;l( q %Pӿz~TQ B<~`w 7lɵ?._C@_I!_FQk^' Pl1w=Զg@#Hp0mpۯCR7v;57_ ̘-#Rs|_m[4BTpanИysx%س sOK(5j݀/.4O'S/:qN/o ?eK~K蠳鉪nP]LQ9$qL F̅3+2Uhweݞ^PTy >hɉ,V 1wݟYP aj L|\S#aG|ߞ6G^B*o2Yn/lDp8ZDu;)gcx6Nc qv@sXyFORoÇ{O,5Ok܏P/l7|zb>`;/kg{n"܁rE01'bh䮅39}_@Qc۩NUƌ3B %v{qYnwhs[a2a;B q 1I\J i@[qgtdӲ`-.WK1Q9K_}8鐻+vxmZxCߢv6ݙN dCZ{HG.9sq"1K gdbDZNo{qen%GGk8y++)cӖl܏wyJ:8pUx_:{~y.k:_Ўiju jr3k{{Ev1i;yyяdžeծg8n.ڮE&W2q2m옷g] ȵ&UEn_nPЄenb]eDROձN&+rh]:_ŴlOfmC Om hN;/;g/.,w?VInac\~'&`iGI upޒ22euo+ p} k|R|!Q>v)%MT̡BM-7ysrM]ڏi^M58q[,o"xx}흢>T|{%x!Mq+Z^o!1Ը-b顔A 1IiB\hW!|8^5}|ۛImIa>uD1W%,p _x{ 1q=*TMS|W>>oY>' gT'1)~-ey=Dl+h[Bb'!Qe!37.)e\f{}?'>S*'-D BI7ouM GnMT1w?NvȟPgyb vI{B`PJڀ/ئEV- 鏆o|WU+䨉k}@ K3VPP5EJvS/`Z^|k=>Ɗj bx C@ªZ./')x1u厏r'#'%dIXe?9~y燾W>Ħ'-`ΖN]>; 5b 06w9׭|.zǹqy?&؎6,(JЅ2<瘐S˛?*] z[Јq?Zj38 ~4Tka:9 7뾇l&Q8[? 4 _;LUؿZ?.^3r+Q @k.f;CuB ,ke OdtQ$K#! !" Q{362WyFܕ[^-OVǫSe؋EK9b,x=_{q_0^`ޘϏ]k6|en-fCh[ugS'5ԴR 1αRxmr sZ~ܣ8߇ҫM6;+'=ayqT|?KPi9mHF>M|ĕx`IjS]V_K?;H;qpרE%U,{ (1'<}1x<8#'o7f)x.z 8[| QPǧ`9rw\̫1niZ6 v JEZel$' V-/q6umBujZ6Hi籠5y^ȚJJrBؘ[Ȁoe\s $Sq₹QM?Sf lݍSFK8~~/Z[{LDqnj_Ywp#pj ͧ0@ɵ9o#S^7.95sKSWmwn9U{bFv\j-V G.cngOϑm܍BbI[cakPI$,mk~?i//.XLrx^Oֺ_Zur֧Gձ!6K8+8m].BRSġ]ERh|`ZXD9q,FٔO"&8pCW÷1LJZ>1{7###+S"y+-F ҠURo6H,jmf81p51ٽ^P3i@ p)ߥt%U,ioyb\9h~=3?&pzq7I_B 1v\xɂ :6?@;.?wLmcn9mLےX1mRul.C xl~rtzy[Z3-w:B,)v2.۠4fͽ>h:`ڕh<,sm߬hNl#@I3ZCȑR"E$`AD s"ӤO̵5uZnfi(k&&ߜSN }ml+!)=RbĀZ|Qߩ Օs)UU1ȟȚ]q>Lh%:.iVլ*2wW%HܬrF.'.Ǩi G]] Y>jZ9j NPuMU}Tus Z2\lxwl:~).I_<>!4jf>~]&WU7;没y-[jMZis}wZT"R}1<zZsTuEVk#Բ SK ֶQ/'H"OsD36?\wMl-$AUG[Iy!ˑ^L4ZҝtqPآ"v;h'/|*`T+\lvNAWїj7ʡqИ- =*!Oxfs_9@/f# :95/R8/_ΦMM圻DƘߚ\.fU}(hlSP=1;V1$i("l6}1U%|GD4\sbbbt}P(pM7Q. +CF/Pjlg-/~~_`7ne\ް[N#Z5x{>`g=ꮥEq㶧csM1W>]s=Gf{YA7R_]9ֲϽ`>/&֏;Qian:!&:!3YG7o^RT i,TvP fiU Y/YAFN!/6u5k;r mr F ijrj!sSqܾQKTϗ*N@Έ֡"3U茈竳I';6woP΅tB!vT9ggir9gsE1o޼lٲYSSSȆ_?ZkZVZZv'1EkӚXk#ƫ88-]Dv;?cU9w3p!05500|PC]kh3c ~3GLCg 3q7_º/Myߖbu:S4YѳeE#=} \TCm,N8u-[6Jy9yQ.V!x1E=jO#>xaƌ&tY_mhlk?,j<'4Y+4c p)UN1*nגk ?+@것]~ڌk&D q+~NQ`½Su"x@[/J7[xyǶf0ډVf_i?A'jw/6¦hٓ |teUl{@_ޯ=Oi*7,{H D.97&S떫6j.7+p/k&{]7bx򫅋VH.x% V.:\kWI\ZS7!Y\+;zrg|ډ#0nmA ~jLMMY.T*s3&qksGUZŋ9 Ð~>copk4% Cj ݓ$y^$IEDe}6) X?TzcA\9ƘanJdOc \R\M6h#<'?Ils>ꨣۋ~ :.?蠃khh6o|c$4MͪϪjSD>!ιiy"4Јnι3(nԟ4 ?!~[~Tut}zr~)xԇj1^y}-E#x蕚X 9)jM&noQ{ޥjJ.-cȕ齉MlWozmw?\(=w9Aܲg|N8Ϙ:N7>H}=kf ꁩgm[?싲YX2).Nۄo0 .m%5(Wp#U]̘m|j堑u\!Toº6Su`{+[F;BI'F5l+zio9(%^!wTsj֚JbΜjEm#w:dkDY?j}(Ȉ8y0 ):,<C:ppp\[i-ZoGUߧ݅Baܟ$ ߨV[n$I>Ǣ(UVkv]>֬YիWS,1E:m~1pݘ$˜s?It1E\}>.^ >;дag5'~|<ʵ{nCGwUF [SO}ֶ :[K[Ҩ%"YpbͭY$4j%,[a$y5ߨ_qy<4FkA+Uv >j(.9U]m !}_ܞ9"rP-F1T( De|؈ Zq2#zJǵ](jʖ.-4AO_Q-xRcB߰® 20x|Ybt)nh|-a^my_\Wj*0^Lp6g4J޾f$H_חrri *M]7_$YTZ[UνdۄKa~OM]l+)҂0h2 {LCI`OoӓeҊicʅf KtMlo+jvz옄EDr$8WD^`/`s:=~>qEѴYxy<年?x૯bEyNMM9ҥK7.[3;DJ$Jes>?pӦMSjc.M=8ÔJ9;ȍy^ijjZVZ:"ڳ|O0<+c Q(z^YU.TҎ_ Tu8'ry$I>y޸yߴ^'"sTqveAigx\ttu^ ϸK\?u4NͶ?It|i/|u*WMTIrI`dkUߺi xQ==L吽ab[*^Qݲ m["Gv>jx65JكSTSE=!Qs&EԴL7Q`*֦D=x"FGu-^\x>,y#nh,[9ߡ7R X/H {%/]9;gAg(z#?oߴgwkp(#|Ǧ~r-۞+8yx㍱3~2W4Fn27]r̝z1q|T$c3ƌiʪU j\.r󈢈6ߊ?i#ιQyސsnF0Ɯv/q XkGTu<rW<˗/g|ͷztA~Iy{yIyιg]z}ot*\?Ƙ9lWWW^y%q̫T*=YBU_r饗N]sED:cɒ%}:s.Ƙ/?r#؍1A1f:e/ی3Bxz37@!{-XQc?!mLPuw;m%CB ؑ$)Iյz7zHO$'5尀5rϝ׏ˆ )<Y/.M>q[|soryolj\vq967MDY0YlE[ (`s5dP̣iz ->_Lix[ Cu+DXz5=[|ѣ/w=7:.<Zck|yzְ\&&NQ0hLE`Ag{Ck?u|c־# ñj5-ZDT^.h1hq|;߹U8x…AR4?jKFCtuuh4Xh=0 [ץ#t TUϟ}$7oƘ-($IU.Zc.ꪫ+˗A۔$4ܟ =SYS-_&K ,ng^] K{2دI!5\{Py?VvQqhzbȗop~FDDdOOSᎵSw9|.( qUzqdbeV~ M* qzg]w;Q*'bյ[*or&&]6`"W|v!'39|}rگxU ^ sKzsZTX"#awq6^ ɔ8o {Hbr]cDľ_T6b\=5ORFZ[*2iEmMYUrK{o16_ǭ4I[?p9P)R),ik1VN5} H'*ݾfMI$+Xkg9IXַͭ?vM"R au+F/?]后*nZ!mF}u{xK_|T*Q=}]VkDl'=r̬ qk4MټyCCCwt[05\$Dd###G|b}aѢEvn-ZtQ|N8s5M4=ZЊ-[%"\$ UiιxlGyݝQh_֒$IEя|3<ؿ u>9;<\1aR(l4 y(c75ryOcrTbcؠJ8A55$ZMHRz_Y*ӜB4SY_LZ_v)n]oyܒwȏ.榗,xn qQt gC^VF8?U/kV^q S|%wL3:9okڳ ܿDJ!*GAb<4vE20 NBg;>]HoZeQ3j/t2fz,cK+yH:yrv(O|or@S.QqT^ ҨkƍT[npy_87?3;LJ[M }#?hݚ6RlںPaa{LȺ7g-N6wxQtaΘu^silѹuxuo#ٞn.DxAFh[=㏽CV OGc֭[?wAUz{lRU Ð\.7311qƍj1liZ& oc.%g=+xs4|TU'"Wq5w\,Xp4110 u+ᕍF˗jժ7OIq٢ Uc+ x̦ev32=_Asto7Q4ƗGmށ^̭1pceٴ>* >";DocROTj‚՞ӨwWFj-m7?s Rwrܖޞ4MJ͹\A`Keo?R;jvG}4Z4M?]YV{b@ʴTH~(RJktac}IE {oaP|>sJ߫lzu \U7UUTBXt1g>3`I̛3gίΝnw344syp4<k6c| aR. ͝;z Rc9l,DQtٴђr_z' +GR&-ѽ&* fbTݥƮru#2v+"f;]ISt30m\`|gr5j6iv-Ne?|2> }y M'余 3EײC*})4"xꬽMFfRmS2*"4"8NIYR\-uJwΫ=v,̱ڎs b=v܎GXe*m]y1XG>wBDQ\4 cmgBul8hTU3n~^';4Ɔ 8IjF4MQյև&ET[3tjB!qΝ3]eZ4{sxG ir!0dɒ%YFCI[$qZUr$IBٜ~MιB ;Ƙ1'+=j]V-# OVbw fGb1XmSsӿ`0JcHQC&߿pG}Շh&ک>8m1?:IGS_]}y roDU]hчTVuvaRsAjӂtc3dBADSz\O-TIJ!hM0;=Xce×Q-- zGxm(9N!>t&/c|7K/cgd#\uc/־hh4}ܰaO:ry&E/3B&88w~,ymSC$;O6K#R/Ou K]łǓX[4L& K,v5=[vgo?E.AQbLw10y} =*w@5BD xQy/JY34T;ncJFc$4]tJ.T5mc~nyZ̙ɣh<?k\F2BH쥹KrC7Q0'0ߓFc!X~ɇet+S>|Ai| qj^*!qP$Sbߛ@"r8c#' ZM"r40$>"OʼnGT \?9,8/%ۮb ͰZaa{X^ϊ_I[aHq|$AɷI;F*Ir%|)`sr*փl/qk'>#U>~(b3! D>\84MI#&@[0@$0~QA0B2 ϛ6pHVRb8%So) 1Olݺ5kְpB:];|5C[^ 1M?Bfq?I|${> kɵy"B$TUCZ)vn!# x}{bI^EԼ qFͱlUtʺcp=\{vS--;S]M@\wϹvSCqA#?T!-Vdі;htޟzfF՗a Bфl#d3`u,nG!BJ_u = 4ssPṄf؏||b߰`۵l 9D۪ԝ,Rk(襙Üv cuQR-,++Uc C&&&T*3h===iʇ>!,YBooLOjsKfxBDKvit:y֒O&q^@◙ڃ_[T:>% ʀjl$W(ߝmmVkGJx@ѧ0Q^EmUWE #*0޽(7ތ zmeVT7ށq)H :QPƙ#Qq#gT<53>\R%19t 8KMBg㥕Iz+v  O4L7eD=fNc]MO^E3?Zz&n" za7]2dT\EiNS% ٽW蚺(KDz9@&mLHgO[TKڝ\ڤNDS *v &{W1Y\NWk+=P.A4zgR4v֔s4M0$ >fPQN-ӄ>9f$ , "mF>!Zl}B{$/{˸iZJ%FGGgj3gB! jl6f:2~"399gewX$5|zaԪ8㷉׉okm6N%q2S ZPF`۽%R/GtD5"߃OR¸ڔIR(wT49KvV!Hi kŽ9cQVRE"W`qє _ zB)aRs)iN1+c-A޵$(S*H`f gRgnrTCWiaXJ%fȐ!C S'П܄SU3dȐ!ÃceufQdȐ!CGOv,C 2dxtxRg!C 2/@F2dȐ!CF2dȐ!C3dȐ!C gȐ!C 2Bϐ!C 2Bϐ!C 2d!C 2d=C 2dȐz 2dȐz 2dȐ!# 2dȐ!CF2dȐ!C3dȐ!C3dȐ!C gȐ!C 2Bϐ!C 2d!C 2d!C 2d=C 2dȐz 2dȐ!# 2dȐ!# 2dȐ!CF2dȀs\62gSaWTI83!|QտxUUcbb8P(`}sTq(b9hG\~B򧮝VEZ9G>9GEr9AkjnpA9y4M&&&<~|τ gaGAWWIDs4Mm<7yXkT*Q(pΑ)Ap1P.!pNXX,Zy<Ϥロ[QU?pYz57n|BX`hPTXp!Oә;w.===i8[n[narr9sJE,^ 6f0|I1UHl2ggj뮻hZ~Ug=ß4M Ð >s֭[ǹ˽˜9sjl4|\|tuu1BSO=bHZgܹXkj<%qEQ*Hyы^Doo/f{ !Qk-9N:$-Zą^md>::JWWoxxӟN0?ϸ馛<4M>hw_nn'{9 g$:?z*9>QT2B较dx(qL3͛%"VX{8fl6y_͋^";쟭*zez̛7oU%M4>Bd&1.]~>h `ll+;@U7ooy[8EU4YsQ$vx;w}iZ0m]z̐!3IP(߁E xֳ+_J^򒗰~z8~H `0loRڵk1>97sN$|ߧu3ck>N__kb8Lj58[ DRַE47QF2Bg&298HUK_B,Y=؃nZK CJ1qLV#Vj513R###3Fm顫z\@Vc=dT*iZ3i3qWWirE155{EvD$If69rJcjDQD\&Qh6iN˥^ʶm}Yl{V*3:EzGPX,byLz>.<ϣT*Q.4bIW_,Y%KI?JP.g_(J%&z}&e{}gQE;!]]]xGRg̐zvU1\uU/`ܹ3t䲵vۍKl"f-[p=h49G$EVXAE{,];zw;8oۛ.Yrol!zǦRH!7$`z {e%!rs_^>mf9s ~, wqvzzpHLL qqqL2A}}=SN9Hss3NN+`00qD1 8N***غu+*|>ӱQQQAFF'x"KYY[lAbZR1cjh4h4޽;:כd۷SVVf`0.n7EEEbX`ƍTVVRPP@BBMMMu82bƌ駟2n8L&j:f cǎe|G\|䐚ݻ0T*Wy@ ^gѨT*d`0a :;;)//VfG799رc1Lvt\.:;;XBl޼ |XV bΝ2i$ٶm---$%%1zh~?Q{ll,Fbbb>}z47D( ܌j*j4*++Yv-Z1cD{[" CҴ܎V5jT^OKK ̞=~_NWWvmlݺP(wuO0*N99N#999* &L+7P_ w7tG^ --n[رW^yh^0###?7|Nll,w}7Pz .W9D/QThl6s뭷2~^ΨQ8ә?>oVta /dҤIѿ-\0:hLD=FF!//{nX,xo]#R={6iii㭷U]]]pwsϱi&V+|;k9moA[[`"g?gzgSO9].saɒ%vZ-L8k+W{]grwD\p_}n{ܹr4551m4`g㏹1Lw *0]N:)a677G]))){vYbQfϞͳ>[>!!Yfhmm%66f֬YCBBB⯩o%2 t:jjjزe iiiQRAq*fN8n喨{ʕ444ԩSOeee8^vYYYx<V^Mkk+cƌ!77QFq /`69~?>Fu]GNN lذSgACC#)) Ӊ^G?[;wӹۣA{[pc h4FWQQA]]IIIƒo$wʢ# p \wul߾7z㏧o/8N:;;Y|9t:ٲe ~L0!zHDiHKK'&&?^m:###siUUU466#َ:u*6M6QVVFFF&MnsuOv1444p 'D,]ԩS5jvF[e- IMMM/ =bT*M%\@GG6md2 {7b4 ~nFf͚Evv6Ŭ^W?W_}EAA-[駟30n8k~E{W7wӦMcS2w\0~C^'''?^{ ˅#'''8c /_K?h4^)`0VnDW=\_> 066͆ZgBezW:=s%D(&&O?>?zT*N+2qD.]J}}=?7t7t555<裘L&zwyQ1Wy뭷mbO?K/]vQ^^+=ϲtR=(LZZZxGYv-Pٳ馛HHH`ҤI̝;P(DBB_|qMuu5W^y[o??Z>O]]r5@U*&dƍ>C***PgÆ DUkkky뭷8ZQ̟?7xdv؁d")) ^l&55V] fL&RRR= :::8Ӣ.?Oر.\'? 999L8ŋT|>?Q__ONN*Jz-N>dj5)))F3ްa= $%% غu+~!~;QOD||<3gΌѻKAA@ ŋ^g_q@NDd1:"Ȓy{SO%''t@Y~wgG_%??JE[[=7u$^]呗߽ۼр17 nd^o45n'>>W{˖-#!!!QEDrG:ޘL&N_1 @-Pt#D" fZ0(..f͚5TVVIQQ .uHR^^^t)RZZZ5ltyڵAUĺKII I&p8o35kR__ zܳF` "Z8"qmmm444ȍ7Hbb"7nۍZh4deeEfstR06ȏ>(/l6{nϟOnn.@͞X7RPPjEVG=:Dۑ^PVUUQXXm&͛Ǹq$N] tvvRSS J㡣2/_֭[Ȉ.LMM ?D㉋#33xD¾^$`^rQF3~G.:(X`-Lv{ԕZD־k耦U<bرz..jjjعs'[laÆ a2zhjx^nf|>_]HĤ$V+}>.WUݍj~{0x "HGsHF:tab ~G-侮MMLL yyyL^n`0ȬY8y{R]]n{XQsm󾈈kDE#E<z>*(=z WսT#W9 9g_m"sCd9Oލ lX,}hmm5 ZGy뮻"HKKSNO>Ej^h`)xMG220_zl**md2@AkC L&bhZt:]T"Jgg']tQ4覭-[PSSCMM %%%պ_W\bֺUm4k#FzvyYi$6tE;X+;R/.;8233IKK~1_^}ict:)))YS\\رc=z4cƌٳgc0M3 $RNtttDW&r0Lф0 2{ƥ싞WRmc\A8:Rtvv2jԨXg}&4 zObbb{sZ_v,fbccIHHw? b0NgأhseRf9<@0x"Æ ˰L–-[H}{Q7Vv[7}뷯)35.ظqctܤI[̘1e˖Zj455\mؼys4 u#~pVq\֒JZZZI\.WV|չ0؎;bGD"#Tww7YYYihheggc4)**Z/\f6}։ihf.P$&&jɉmݺߴG Ž;hkk`ĉeر?`)))믿fʔ)TVV~lC5*C^mm- .{mEd2E"T}Q|h$zQQQoo&#K-"3E9Gzz:YYYdff^>G2>h4N'7odBR1} "4-%d&]ohnn&==YfgYo DGDk k/D;WՊ墵_g$o<ח_~9~ڨfEשn:,1bPSSܹs 8ijj:&LЫ.;tF̙;OohhV&O̝w^̙3]viHOOF***(**sV]G6lyx^:::533ѣGPYYISSS4g%h4R^^m^x!vMMMtwwvihh;g}v E每 pdr-$&&RWWGcc#N* pVGq 31lٲfIHHVKnn.g}6vǃ`&Lmd#H׌3xǩ/Z "L:{Z~x֯__ӉcѢEtww駟NZZZQ]]MNNFvP#w8>&NHAA7t3f`$''3ydh] S&))Ry~a 7x#z*[nDNNcǎz7{=+rss: Xt)ӧOpp}1w\欳Ί&2WRRΥ^ʌ3tZ ˅Ncwq̝;7gcBB{/ ,_Z̙ĉZy睌=۷)((3Έzx^1 Gr5W_0r1n8q\` "1lk4V=ԩ=c1a.2&OܹsihheS$ oɒ%L6 ^ԩS8q"V[SdҥK9餓jL2SZZcZ-ɼ+.2FŨQzGD>Q#k\lAt=9#=( p8䗿%?2e GZ.?ϜuYL4itLff&_5y䐝LË/'|BFFf@ +gY||<+V>s!33n!}ww7=ztv7|gqm6k׮s!%%1c0fZ[[پ};< X~=彖Da0زe ֭S[[͛ٽ{wtʊl߾իWc˖-ڵ Mww7lݺ5YδpB֮]ɮ]?>_X~=YYYQw{0rƺuza"sVTTe˖hZ`0HWWMMMlڴ);FEE۶m+{ި뿼#=n77s$Z 6<u\v8^{Rn 3르Ed캺:0 <^8hnnF^^ffJKKQ‘E{cD0+++.BPRRBww7yyyHD6e1j2331 Ann.)))c.+*P=##Q{ ʨ #\ڵ Ivvv4(QZZJss3dddD]vr#11W C$NG~~~t1cڵkdF5 IIIѽdɒh&њL8D^7"L=+55hpadj~4Mj$AnMAAA4炙K^G111J _WWGCCCHIInQWWO>2lJݻwc0(((s0Dii)z耪rv;oE֗G.++ Maa!iii[m۶EqsRSSSO=`AFJJJxq@򊊠6"sdNE?RXޑeksF:ވu&}>_{ψ8hgY:983lV"}&χ #{=F6@w[vyL&sW^!%%%j566rsWy'hhhp:%U쯭 T^sz<|>_m}jut0V;`}G'rl =xc0f#g9{MҷMM$AQdɄokCC^x!_|1NzhcZy'IKKc ah ̡ {ṷ~g U}dܨ3ڑX,=s_/ Hz}TF|#rξe]]J6|vIVV~G~$o\@}WEDhĄf T/{3C`hѣ9_}jzoctaXO=$4P@;[v9q=t~{ޞc d;Xh4뤥}k`OV\K/f;(+{̲}W|=˿AU{V-MoF;6@mje^z%n)..gyGwb1A!y%恜p]o:͡GJEll,{|}ٜx≤b6q:pB͛f??k,c-7j>c6oyѣ ٸq#)--%//oЃhA]Hjj*ͼ|'Xv~Ұy`4ʢ?Dd﹭ .1el%$$`Zzx^k#[WD233K"Q%kv (y䞁\}6- MAYi " z){ `oj׾. 0(L:WRh&E  "   .    .   "  .   "    "   . "   .    .   @+EFhz0 RD5[hAB@(=bM*T3A!D**d# JNCu#x F.;$_8Kբ«kP(ɨF Qg TW %D(:Z҆B30H PsM0Э]!%B!yF`Zt_:ʍh:.)11qf0L  YaVvquS6sS&{}@phF(qvW5YWUGI^@!Dgvņ_ 4B`w;EcSu)"*5Z&dؾʥoc4cAѨ`eCCÒP(~b555K_]2P15g0m45)+PZ5sJf7gܸH ם×1[#CAR/Wp(~qZZפ̣%}if;Ѕ-P Ik RZtŀ=c-C1n%G,/]Ȋek'wo4+q9sxCL]ՠb_; 0)yq)+6 .⩜S~|sYMN:@5̖ ns5W;^ޅ(! |)_ԷҾGBCӁ2Ur͐vBn1Wkz_D7DT솆:9~_* .!?[sN%M5XXwng`)cΡ]_.H9Ō#&*n[8/ BAq6N=c:q| "0 7]7dF9e5{ӡ^. oqJ Я7Ufh Y+=ڋܮQvvn:yctAC\<~2ִt>p%aΆ,L=sG"Cwg' G>V X_8b~ZY}L*?O2D 5/ϗׁ3QzY9c8~)(X!|n?%Z P4Vxd& "ܓxKq2oCb )NηuP0}aGE3)seY?J"lW]sт00]Ws/na&6)p b7Q"{K#75\]ëNݐƹcYKtuzN$qAuO=[RRDЅ xw|ZQ 4DCa|jl\D#0[Nj\+?`| W{HGJyF)<5''o . kfL/[϶Tj'ANxwϣ5wc1vv &\ݝQ1o}D/: m#[րxw>/9MxA]vh`ڟ`WS+ꇏU:OEkxs.gL,{"Y>[8skf+=8 :l/;}xta4>5^~Mi Y}laCG7wR9@x w}x7ft0tx\{JQeOWy/(*HkDЅ¨~Cf~eKZxߛ 9&2!#]ҎNHH紼L'-es ,1gS9K"~1KѤ<~$?"οZkyssuH5VSq\=԰K_QF]PUȥW-ދ.".ScNbMt쨦fdtyc}Gqy\2~D/*-Mb>hl? R0"#Q'`Cm5bi'8`JUVruΝ9>[O~5q\z*V}̥#ꄠ `c`D)Yji9}bmt;Wf‰\vuޯ I\x?Jz˴v 4CS}6޴qDA=09fbU$M%J$+r:dg()  /nHJ㌼L؋n~5+,V@=nhk>"yR."HrsRʺ(f_ JgxyĊ\ա`GAe[qڛ!Od]zKs &\TJVCVM-w|0°w糪,N ~:W"UQsk1iۤ9;!-mqhbij\b74ht%R("8'xI%#gΛq`s&p= w|^ƒ_4 akY4u0ë゚=|?r\DЅ2)j8.l5IKt7;7 dzy,^7嚽$hiZ%>HG(M u>$)taሃ;/cu[žO t3 {;)&+- ; R hzk474\~{C-c\zR("0!#^9\/Gc#_c%{lz=`@n0ա-{y=˗UꂖF g?y/";ʔ7Է<^ݗunBXfwuH"fb?)V,VjXO9<413V]jp՜[١U3I:zUkidxRv Fȹu47gҗ9JߑJ3CyϐAv s~}E|C[`6B]3-={}D' aKo+}ѼWinlQJ-G#>QE]81NjO0/?@q;xՀ.l%Kz.E\`S )"sVM|%x?aԘ?'-]rƊ 3)IzQ;`! :/Z h s>~t, k1[Tj*{xz9A F]8FjOqC7%@X^3w>unq\/bfÓ4m%b~PhmY7arA&EY0:aVxd}c&ZSvTۧu3LbS?aY4 j0\A[n]?})thp)0Zҷ ϗJu#9\%6(|{h>む,_1bQr7dfʶm"‘wpe{c+es34;H 6-˝Rv/*q9\E tNC}XJ!4 -v2o'.fKN*nv(8;|8`Xa1똼\ 0 c= j+eaNhi6rٟ?23\DЅ!?ˏ5ʒCI ΓӉݲa2 49}M*VzgY2V}P[ E~=cX)ta?t-=]lospB_ bH.% ,ojk*J?\aP{<.d)ta\ lɯoRuR} ܹNrpv*@Mwv} 1bV4p9&3/Xw<&".Gr,s2 SZ)V TS|^c2G1>1s% zR*AY_VWaXWAu5p)O/? = #.i+Rh.@\8A >]MlesJ%o'TFdfe_%F#!*Tt!f'g7Y F}cP-p?lbZd};b,PQG,;w$`. &H\ϥ q;jՖ!4ꀶLοl ?6\DG&F#g<|,aij]Ҏ;lb^k`+&,'rA^0H/ɲ/c<ֺm0p}+">XGht!ZDJÏ~;u 'p+w$uㄜ\;Cؾ/jJ%@WV(et-f;'}oSJb?by1ż>xn-b~Tsa]Ք7P"eogYȅ.)ǣҲ9`,5=Kx?,@+p< e\b^|O( |TtbMXR H1*T4yZsESW1zAY&a~४P}~ .*#~Tr\WR G>Y̋]߁AYi$drd;puAZd=q/b6yр 9U;ID4"G y۴6U~Yϝz9@0qRhr~K_˔tسֽhi)'{v"G^~zVo-OB"^fٮChf:hcw;!̃ҽ,]FB#_e`^œɧ/"臗}1$]B:c:ŽJJ_jQ|'%d0㒲<q;!>Ip~[KeJ?Jmm3m\suؤDC^}30%vNlV4αYPAd&rM'SDz!Chf8PTtMRtgnhnTqֹIjA%55.iǤu8l],-u烞;O!.sWtwXi\a+}T,-]~+ZN)9cEL 6?o_ˊceǺs\l4`c`Lfbq~[>_% CZhֶI\wv~pyeɺHp +e38]|ͿُpMbK!awA8f{簻t#VXCZw9S>涻0E]}\=loP gqcfUPcm7[?\[sQ0A'9`&p-vmCRy|7LO<9fNR<}p [u|PXS~ΝkuP8k%Ь{gjH)V_ sCր?p?e)W]}eTWӦti%x|2_>s [Jѹs0113RC 8-o ۑ+;}.Y+VFg7's+{{T8=VKvUJ-!78&k^ f?&qJmȟ_92eɂ1H>OO-Sm.O0V;<|3Wշ*CϝoLy\Q\.}P9;!+⒰l޹K ).x vwz0%%^]y&oTAS|(c2‡x"lWo? cRCdE0.  ձpbSC[ x\D傺Z8WAp녜i1q\ul2:p >Z /U=A]DQJ$nXꂔ,N+҃@#^/#Q[6ӇHA7Gx+ssΕ,'pZNXQc=vKvzW44kvpu!q>!|V $.n ޛ5bPNX=YIooKgI~=xbಫ?އ4dfD ckdgfUJda} >Yۀ@1c2N}`u?n =nwٵcX2s~i"(z <}7=~kI%i}4E-h*~$0も\s Űϣъ>\D9~P%WN'~, 1+푬o:X¦O΁ZYd$sSt8ꆔ,ŨFV.`w>6+ර'%EXĉd[M,֝UP[3E u>+uF̡p$͘@O4h b wKݻ`ܤ'x/5*~yz}w0IˇugM%t1s:7Y N>~.*d=jX}oY&V:v?.{gp䆝eg_&Nnj:/qLL3^7).̹2~ [-|=ZG6'[~ |cw^}XX_9;~4_@޹lW}:(^ρ 6{!x7l V+JA;a߿Mv1m۰[/渿=3j:0~T`2(BuGjZ>3.Łd Ga$d3#~;]IjsGu5YAZLo$&rm'zq̬X>;/Fܞ\~3qq"臂4דv}G%"#:WQQ lqvuꇑ2d91z?QJce~؋% ~?fkwU.i#:ú7߹@Ε]D]R# ⓙ\4J7jܶCggw)Xo'6qI"\Ov1$m U yh:Ph2W2yBeI\{g 4hދhe.}Ģ@S#uc;Ki VkW罝h:efaNV}4jyb* y\-FuIO4 b]۶,!hQ*-]?},r+CFO@?gAV<(o#VN , (ԋLbd`0S4Joc\x)K$_=f| TלI?BIS*@3xϗ>1w7I\vJ2n~GlݼXt[ Ƨr #X4hH[hnLn3ϙy8TӨqկĶVF7s<1l':`6[aw+̅i>i2vi5+?aۖe.]+t&rpa4oA~̟/*kQue+(m@??gcT_XxicH|i?vTA0مnzk|ADd3>1ﻻl=!) '2 N̥oX[7%€#FPk.Go`w]w/:;i딁{P{y 695Bz CJ{xnٲ1.<$:Lt;y熅u7e RžTR@ADfB"mM, &EJײe2Z3!gX^:%30^>|ПyI {s8Q"TBR P}Ч:?Y;q)h^p{'i*TP7rOmk!B͡1}B*OK *py=BhԊH~ UʵB;RGR]nI璔DcLt\|Η5xӒ85!N]Uu@Vs|&6wAU"15)Srw0@w @Iu-]`A޻'帤xLN0.F"G2J#nB,yM1#>{1XTEkPmPKgΡ0ݵU&!A_;Y.˷f ΚMz 5"=oM.jNG1Qް矆/wc kN1d|:ax:sنܱf3Kbc|ܜYiԺ=S]7H͙:ulbl{[[A)$hqޠ/rL9@g ˠDЏA J&[bsA?`ͻ5T & c`,T@1uZM$P~>_I#GZpKύA7@4`5eךM>ؓ^ؘ?X&d^FâO&W" {X-si,eyUt;1봜̹YLŰ'p8^e`y9pekғqB0NdihR\Y>?z5~t=^X: V1$v8,5bT=s2SŖBԵáx^tcb>XsUFuea9I%کZ_݃՜*:BRc1sKIj\98*.b>PߪL.* &l⽙SbGj-B x=yd,ɠs6Či\S[Jp|vOPx\;XJ{DBs zSzZ\n~H11133"5n ېTvM tO =btTkwaٛV-v?OdTށv=^g}=7Cdž{=GsP>p`z$70,]9K7| dg,^_>D6YS2.gx Rc\U[V IסW+oJXyu?oS Bq:oj+~ J8 &Z-:JEIa 11] |^+S`9Hg4E<DžKiqɰ4- oq(|}]2%cQA>> @Ay[[dY9b5m/ e)MaX,[t\$ܦ>!v>tN[_盷n408Ay@S T=gSA֚j5WXU xAc砵$ {y<*5-9^ E>NPMhmhc }3V)NcCkFmBK:k{i4Ɇ\Q>99AH ,x:i˹me_ 3$'i2cG"q6CSncǒt"ݮo큄ru>yCm.7g$pRB]Dݐ Iɐ瓘غlج fl&CxiBߎGz-rXBgY_pCnf ծsb$$BJ ddP؊+6BÅI=lkhjf&%prR<8]C>jX.( Sc7?xHOay*i!!i*_Ekzʟsۯ v1}*qGgsO-Pܐa !7gKLOǝo]GvjC~0e%N Ul_fU/ҽ _3Km4.; fcA|k,y Wh 7 nPcO+P2o˟YjMglĭ> Kva193G]JNwN4l#- װf>vk0"6W,vWk睁^kb9T7n;R`+3ShsDiq7XB!0E [Xł^J.''$p|xYyQʕ8-5YܦX{8J{\^63p@}Wb\T栮V*66Iɉܐ5 r?GOQ1/[|p {\?yA=N:$X2E(GOV+,?Fv<3WM#w xRjܞ}\taGe=Rޏq9*ٶ92;v_W)VmoWZ $%<3|~.0Աr-ma+=CY#B^⎬|<>t'=fqu>ax*Rs!oo U98xcׇ q{+߾Tn6FP _'{t/gś3 ^JsE"t5fYO3_m,9?DWLN႘QD|Y_c1l]p2XM:{A,};W>Xj> _Ngi4UOf֍'Yx(y_{>eoM^ @L=LᅘQ;W{ ͢SYhGip A(otW2tuۡӳ ,,|0]t0Q9u6|f~ ⬐^`VCəiOGZT:ؽ! U-")J Z:+'"1)4^@fXcg[s^@HB yWl fhsX~}=FgnrBj&lf-m-h,G΄+f봻 Asͦ(yi'|"g]UkTEǨ ~Jdח[y_4EX0!~?PJ^ / R|捃J2;[ϗ7l| .'K*iۖZݚ f%P"R)+YzǫXi.oz/*`r3Rl1Cr>} RZC,[wIbG$E옟ѱWhL YPTj=!_=^^O\,8\^ .ox|8kS٤we ivUqz]dO$֮hE؛~A5hBYĘ!3,6Zc:jC: "gb_S,Sr-!)>w[4 Bj!z-)Ö8mY+-s׮*KDQQ˃ԷdpӸCmBsLs!fcͻ?$ֱgobl-$&]%J`G՗xbG;cA=9rwSR,p8Bj:<^].,RL=IR\>AioU8)d$'ҨQT$OJgFR˺=LTX z V >xNL'bbW}#W%n@cB 1+K`QLO a.;/+klpܰr8X,ٰk٣$F\tb?-K/DoSg~XnVtsUBA6yʉ٨ *I^Fք ֣|U &J )5F%bcܹ k}2"f!6bg QFa1*ics`PКPթ|ڄ! `❻Hyr3w-OnnMf$gL]S%m! +.e+p]_ zxPtc G{%7 2t\9zQq f!Zx<`K) 餥u{qW]M+[FCٗ95ly NC=ʴOP%2F"98Rјq<#qWDhld2z~f@| Ndď0CYL[nY|O zHi^l"`5n˙ KG WR%LOK{I$Y-4xWp9FkVm拊FR͍ͬil"d w$> $<+ǷPwv7* x~ !!\7f&Lg{Pv.Q j5Zn3"bh8'?VYu۔PCv^JrViA%7˻xƟљqL|o@SFe%z]ހIUN's"#=դc ,{.LeROX0t%8Uo%s}i*Dž^|϶í'PP/ $@s{mkÑziEW^<TFlOc etѠ&7zHQ(Ӑ/ɺRمͳ>WWziPz~tqvVE|/_$9? B]=0OAϬilEČ=MwrǟFe0Aǫ'W\Wg'w\ίMdu&XtʴP/Ԕ| @LXGݍ+lM]C4^J^JsRvZпA?t5 .m2Y!9UYU$IJi߿S} 3 8Az$6|q [ S)BZv*Ƙ^^,Aw0+ FIIٶA GՀѢ$1-GoP,bZYk3k f{,X2o~ov6ncHKDaYt8i%>>ͬߩG !7LVomN07cWƒ-mNg@s+ggqcU,رK4{C= x[RhnZ2uF_ RoY6'CvۥjA~Z2`0 ,۱.l_+TRBr3316ٺS9ݶ~E on @EIC2sܰtTF>aWq6;YtI [6ʆ哓 qyE/h&N)qH@R@F4O~].gKog=)Iɐd LvC&ʌ &.R*Ht((ʋvvvJ~~*uO?i;Pz.I}wHIUqfdd@a!N!#M4e9mr}ɻXK%"7/\Uei3^a. YZE'Cʥ᝶L71l﹞rPvJu5vF|Ď=!o%ڏ03&6Swi{t45rhWnj8}-eb€o.sKʊ/`L>DES56}?!;?FfneqćVBb$e|;]@5bX9_/‚o:feͅgTQc4j|!8%MQ qqJ66}j0 gWt<ܐn葓iDVM>=e Sk\vb ZVUee|XRʬ\؄X6u*n^#8HUQiBWkjjumז؝} @oGshYy!2@ zzPDߑvc5o ߛ xbcaǢ{0I+k}X!еցʘxYyhHH2&. b׶Ά>Q5 cnr ]|glU.WN"PE1>{~Vh Yt4ock ^i$ X./ {bhr˿\|:ceǗ?A֢߃VcTO:ذ#fM%dzV_迅T+4]::yq^GεŠ2Ņc0D;z=: y{UMgpl,**_i9grev:NOf]ž{kCVrge鮖ͨxzEFtnEoL dR)Q]NXeN)?0M$E=ml{K~Dvu`碟ٺQ'<ٖ>ܰ%_AGY$FbńTFt1r2g.!pu}Tj%JBb -eݻǯ7Wt>FƁ452ZiʮuZ/TExP{D[^,1jB}~BHF4!n&R\()O^7@)<}ڳ-ȞII3tvw[M3@\lT\X&1Vy_;:VV9%QEOY4[WV(YUx@GWx;p6Bi 9`k^'5JiN)}fŌl̖pž'B -21x"hs(mFR~׳Uj?w)Ϡ>^8J1Ҡ׫pGd)ߙLJ%uu:eaV,ksؕd+ԴZi}j+Y,=5*V+Kҭ6 wAyCar7 !Vi "f2e(m<>WCXս6;jO#A>ikzxj%^Xw0~{*9F~WtZ<AeoP8l;Q+ϫk~#֨ݠ{$ni4u{ޫY;~hi v:聀Np=ǩ`[>K6U*6^%ҺU-iݏlɬtr@іN42u?Fޒ^8 7DWkv;ALUH[QddԸMx}){fQtp`R.z :DB޿4ϧר WA^)F =[uayh*MnϫYAC{CОe{ }~́}/F4vU#! kit{?FMEuAؗ ct/t:p,ciFv @9Tq]Aٛ]# = ۂ    "   . "   .    .   "  .   "    "   . "   .    .   "  .   "    "   . "   .    .   "    "   . "   .    .   =7QZ-x}R!BxZTPSB3Bp[ӀZ j5*T( ` %F~;935CuA7'솀{a CJMԡx\ʹ!֌fs:5^] I! 7<,1*C2SbcSTEIxQ!-_6?Dɢ5va.1ͲRP}֭I\ظeS2!И HR]Bt}zEqtMF@-@8`N1*HO*ǶʅURXkm.#xm A]ɏO@ʬwlX 5 Us,Izsp!~P}`$&j/wrf9hTPHWN\rĩ}̎8[W*J@7hIPAxp19G>: 7TZqjZWV|wKŨ7=(_﫨|!KkMT4Dbq2X(Tqp) ($n;g#HQ8"q Ve ibQ<걼4-r+EZliMvUcgsbȉڵD5y^Ģ^%˯x4wXws}gzɱ!`:V=\_/W\'CYwҸe=3/ťdͼ1qWvx./^X~p;AGoׇo sJ~?Qw3kvK;ѾѾ>Ѿw}db}KEf\e>nfg47:3gj[\/8n۟ŵ H<4o(*x'U)z&1t*4F,col2v:#T@0*V3V]i yv_Uq]K9zXJRʩ>OX'fXq@M4D+`vSͶTlgAe~ZH ߚ6|Up cHRMms{n3'IIDATxw%UkWI{raa9Q(5bkxt*9gfa:TU{`{⩇~zN{ת$JMjRԤ&5IMzbjKPԤ&5IMjRX5IMjRԤ&5UԤ&5IMjRX5IMjRԤ&5Ԥ&5IMjRIMjRԤ&5Ԥ&5IMjRVMjRԤ&5I `դ&5IMjRVMjRԤ&5IMvD|kXxq1KW %`Cs7EbV#lOm)7(BɳbCG>97) Ug#wχ5+F&A8'ӪSzKCm "$ _E=Ze$.mY/r )60xTݣ "*9{[nP{X 5M[ r" G8i1:`'(6tjc{,} 0J[ 2,zWzvKEw1P8خӦ#{ ΠUt޸3Qav=!EES?y-?"~nǔ;sn.H(jܽz0wNj5hK#jmhΓɳ*,:a^Œb,8DFh] EHk+&@C ]lM@1xŶZV5*cZpr נoFru4A*"=1yS.I6MţNUfI.]*Zw~80A8v|0ƠXkmg1'N$c}ܿR__OZ{oK/j#p9y󭘸lb^nu$@z,c5#XS@1ΝDi;v/ax0,~){趍p!Q6BtU.I7nMoj1_" $9Åྥ? 5nADP@rX^Ø/NO@"`= ĂQ|E/@m|~2~n^[~=dȪG(k‚#_}ԟR0vX !>ւg~,j޵җa&O 1U}m)t@0&s8[R{*DNGmhɑ7fk$M^#kLuTkF`G\2*{D: G j~DPɍr)U~sV&i\o9Aƨsuۙ{,J|0 ):.eB6bnw9ŘT XqgӁg"&u,c[OL ~59,.vk{Xw7#BAeo0ܢQQxYt`7w_CCN;(> A~GC럁č+ۿi0"oT#DȄEGOuw q=%ci}:V/5-">GuXRw'"ƞ*oAR|Ksuz8mM *`dzWCe3~Cc]ʊ8\2'#So]eKS'oc+ܞM\WhS?"~6Tqgǵ p29d%C|QwBb|4.ẗNrOBeT9N~]tN ýU6?SHaoxDw+};n# {5^94 -i3k9ǝ!s5 zO0$qU&>i_WU5@+bxMw3?Uܡ>*3mb6OCHN|ka`)-0 HC;bnbˌq !ulpioE &̭Y8Z܆îKZiPɴI0e ;ehC>9ڜ?-qDws Gt& 'oHF6ALtZ[࣒1R7`6_b:2H#P9X!?i 䤹vq$Ald [x~OI55."`olXre1rNycGNNI2 ycxԛĞn;ZjRX5ݮ ̷Ce%|?H׉ OPmƘ.bVJhF1^,n`҄cG ÈD7 bFzR3FPZA7?y巊'jA]oޠ8Em>0up;#S?ŏ«|_Ttc}BD(Ua 7|!:PVLW<|ɟ DXoDJ9H\5#}E04a1ibّP[Y\>kd_:C&A cKtF">&uzhj=b6KRB }̙֑u'[(atK=Թg`~AK 2l d'@f*,}ٵ!pUT9e9!J)W~0y1_ʥTw ~ۇvu!Fp,>Q;ʄ,b]08 w3!ȶMnXBA~UMNw >лZ (&z9rRDH *O$Xפ&5UDs7w=vm{?Gm]J8z1J'yeFŜq}.^g |M2^.΢δ!G6-+ˤ8w 1gZRi0;b\u{ &o KSd ŀV[Q|,'=Jl!MOS3 fjGxmcV: Ôܟ@={30^ \.p^'5ߡo_&e!\pٵl| rW 3)v.fKӀj۲3J%Lu WWp|D`YqaXa~f4#s9)~'{;?Z<n|A3G@M]1j뮦 xh$ 9H` J0SD S%Ax{ᜫ`;Y<]4ϸNx7V,} GD+$qd[wl&IK9KQpi8?E?7~ق- I_`A`*e1IK5CRɮ%:[dnq5Z:8s0ۂ,.1"d0:29غV=۠yL^KՄe u_*r ] J"8a|Ttz QjZlI2ˡy `L)\9Pv;j@0%[kȚ1DJ] 'JfÖǡ<MѕwG/~ *7RpnG!a!N(F&)ڨw@="+NFe}RS![]qCR_R50CKL+C" uz)UՑY$`< %>c/Lク "yIKķ^р0A0V%THkgn Ld%^ߪZS}1 KM뢛M%%u/xd[Aioq{lȬN뷷K/IYls"93Pς񪨖C { m#m_6SHb".y@&ݩ'd 1/PIMFĊGGŚݹx9Smkd D6f%t?4G:8*Xr|ⲯpJLC\makL&ruiGM؜$iqsLb:؀(E fRCRTs]4ꆑC+!]%z6ev Uĝ9e2t2qhJKըEJ }DMF{I⁔ )E R ӽ8j/t#XAqQ4zߦo* Q8?r~d,P/L~\05cIl4_@o )tz~_7Q~"htsTH}Pb\dxiăȢV!){h֙oQoBM #A%K]\fQZ`.hզ=8X!w?g3Uve_VdتM߱A[x)* G#@"a壴DQgd3j'2-ӝ%Qe 1VEr)1b qׇ0 YߨϼƦ o8?meR2n-͠d 74ó[ <|UAL)B P cǥV*{փ8ܞLO@oNhnI&݋@ς^ٲK[k ri5B8EA5<#UԦq}jtnxǎC-#9kuc2XbNIU< UzTDw]#~as#IOZjDJ[ɲ_܅q"c/č{;\nxAyw?I,Yi8n4uLwf&CPOt׏OBbb T`I `դ&^AVf/L Yp߮A8^@jJ.km0~y%Ls_rql\⧌A;gQ~@3"}EkNyތLΖjl;!W+ȴYHdBY֮\ꆇ&S>@pYu-W"/wb4>u߃lMscdd5LuB<2ͮU !&,ٟ*r.U8O|Ilv/824M1J]c|Ss*T]b̝}L%\Ji3 "RTOzuْW'+"sF't@oNKZCK+XMj1e|D .K\7FjV d""preFܬvǃ1 4T|>I3ׄ!5FW rn|CP?[_q\tT+{d@ X*gZ0\oߛ\9D}XÆiyӳ\DQ%I1iF ÙL[E<+Ƅ#9a/{O)=T7ߢ5||BO9l_?Bf65{_&mYš.o8eW|m>}uxq!^3s .bw]TSB٤nX+>VLS9o4ߥÿoOE#6*{qy&Az]ϼu_xIx'WY%,v7<^&O5;3)!êY -Pd+=6B5ӫ[˽kXU0ʕ4q_#8>v/drϵМ17OPAZ2G骇N&ڇ@ϭ'U2*ctJ._5Y}= I jcAZ'ЧUho"8=b=&,su.g^O+c膠 oF/a B bͮثA` |W*X1+A.֝.?\'eYT yӡ;`GtSɜ]k{`h{QfQabZX>T՘XYٴ,LmΉB+Re2 )rWCc#5GnLmO@7")n(T7xVMFOUch-Wӝk wM;)Vv':uP-ӑ)Ȅkjx"8GKϢ鎖wKK]`}{eK9rWgoVyЍǮVad&% h*!^dsی >K{?~0myXƹ9bX-ڿi %IO'MH]jid`pl~7|2NQY"L &i9q*rFRPޜYҧ6@}ԉIɆ#4N럀ϿWCU1Ě'zyP3\t_||y/QAj$7*r5 qV #f2LS:aJm3 ~fViXNW3^h䃑e) j-tL]ĵj8pTw~nJ9@P j7}Cdϼi420px>Zx+ZW~w.ilIl ~:#WD5a?zD*c.M'2ay?坘xYbkp}SYLwlRu/^jWuh`2 \]j^` P|QըK =ɼ<-|ņQ;EBh[oe??vt׸i,0–` O'"*'N ʽ:Rn0-"lKRIojyuIe̸8(:4 @"Chq{~s>i2k_O[;[rV+Ae0<rꦃzvS%I ,qR1w] ȸ>4_,Źl"{QX<0X,!BM|+w6jRX5{,< YN{ L&IIW᥽wȕ(aA^˸Ը8ex9yx7ю+?{bTfczb*"-c4^gxCϭ%DwҐ9XGV!^ӭEwũ{Nux IEu7+惈l7#CeR`;&%]*E>aoL<=Вt]/<8y:~sjFJDSL&F]bCpf'tsY x3I=hxd,o'*f>$v5sg8Q}7vqr۸[I'uwl~4Cnj+~dU{xx1{"ݺ$tf:0Al򅳜M*F,{; c Jsi\ҥ)i?H|Ph`q5en_K.hl׎?qO=F<1==C~3E)\~-O_ޝ^(Fu OFfkcvk[2ZKKs!]&|l"&i;*'j`nӞ(?2+NKAIwK]yfk'zTe8zc%.p\'<g/;qwa|$sބڛt$#qQ>`!O;u[]ӥ䋍YYjIʃN$)T%_L㹹; _cPIUf:1sõ0A1Vi<>N98R ZդjYuD[i=N8_Lz'J[%E Ry,Nܻhty2:R/ߓ$:?MX3>g-i(Zks3{Tb ѡ%H i^5I `* &ԅ[ɷ11rSx mmxkhH03H]F&JpŴ Zyn\TS?4zY !FbpdbII_RSh`_'1PuUdW`%Msx/SLf>wXIZCIMj&m8&g72s΢aUSvoCwshEQR/#Y@0<ڿĠ~9?ټ:^n)uZ)<p%ӹY[5.p]I Hqn2 N$ gvJ+T$v `%|@T),LE!q ?-o LVk>~n# RsEW f =^zf8S+>&0ZŊ\1qRJ rW!B"Z" c 0YKX\I `_]myëQUi_,oZ Ŏ UtImg?se)rP*їo9w3eh# )C+Cҋf&AE.q \H"IU|L(ui9/s[L"-Q$ypj~*  eLB,KfנutFUpQZYǓ+`hLi&U)ư6 ,0¼=zZ&ǽ83I,ÏxU 3Р4$BdJv߯+{$/`gwvRl""“N";y"VsxLa7^Dʟ R'cLeIUդjJխ 2o'UްIFxxQgT4Er?v>EdE(mN ぺ٫Vk ٴ;xu;T$o2`AByR&Qd.o&eT|$Y&C;eit+0ғX6(h\s:o73(3r+SR b|S*7ŹlnN 0@JRG4HH_ cA$y>͞tT#?x[BP"x\;mrJ]лC;(ng ["{9A`7y\NsGū67씡4odEn9b,pk)K{&, P*5x&0Z"9n23>>;?(ɷOe{+ Q6g^GwnI>$k ;z8) h*C\:4̷?;xU|. $͟s4FbX&mG u!qNx+Nt\,hAbܒُ-үYsHi3atXwdj X.yb?DT1F0;0f1QkQx^H|H&/ tsI{8ƥ 41{r)q[Sozf5t|xoqό& L-ngc~o>eٹ,9l߾d,.gsn FfGYXLac5N]TlPBv$J0 "n䇅 pXPF33h쨛u|~ڴL%ĐÂ7{s1u%-WE6YzdI Q`"eՄyz<ffrZFidi.oMXőuÈ!ow dV) bhp!lr<*BF#nco RR2L=_v0-A &tp5V:~.",R O1Na#f yl;P ‰2 B>;>cR)f".Q`d5f+Q7B+𸵩IMjonE^ܞlkF`P_* '??,;i/YbSzoid=:D֎_Uǹ<wC<a\_USv%_U=yZz )!<2%j͋k6V|,F(` 2WRK[-?Cg5&Q&jZw72AzbU",k(fsΡilF2^cر,yH`pg`ձu0©k;IbJ>`lq1b؊11qέ3|F&La6oLWWjk1kTظF;}G64Vc?ca:;;T*zx7f[n#=/JTzN'"FbRqŻсZJUqU}RUTmO|M0R |6UHcL3 LZ*i$/o}vA093gaR?,^*zcMPt{ ZU}DUzJU4Y*7ilL?1jn>#`UT ؽ9[i4ʹux-Ex3* oڿM_SxwXCU Q@ Pѓ '0MЊ舳깣Xy|r>=Mգ R|!:_hG{h{sn1̦&f477pB.\ȬYWTs<ϛZ___^܎XyqZX,>>88z衇r 7pǿq֭GdmxJym!/c6mAw=ϛͶmd2/~pJmFWWsNgXkEQ"d=ZSU] }B@!"ZZZFe{{{o.qF4q̰s}UU;}^6}MpEpJ%rLcι0Ƃ$ٌkTٲe gu\s W\q}{۾}HJI`muTT@`Z fEdvG~vr);!̔#BU}YZ ```CCCO?slݺuM?q: )ZC=c~SrkX闬+uu9q;U Z(]-FNL7X.>bX8)ǰ-p6g잕<} sa#^Epϳg<2d+Ԑy4b$qilD۵gL6m[]]ݬիWWs\."cӦM_SN~\~Kas=穧yZT>?}t>puqM7ִ|>Oww7|~pf:<U=R,Lٍq,_ysaqWxb:::hmmCCC&M3ɰm6=`h``ஷ-̘1~DQݹ5 oxsrٿ8WĬ+!uiZ exsq5|o`nQK^m[&%,SMU#G%캰C_^((9Zadr|vgFs'ovC뫴օoybȄ״d!fb# C˺tv^ϕ7l~%gĞghB(h,Dj%1[bi &y;;Z0|mmm.UwxGWWIƘ7ȣ"rcbyƺn駟Ιg֮]K[[8q4d1\s5\veOL: 30lpOUGes@YDTv*1yyhGW_}5r)S<<܍g&e,30f=fHK?SLK/6tѮ^.{ "q+5T;::Yjlڴik[[OGXםވcw)PL:uܡ<֮]{L_+7}FjosSVGZ~ [x.X{9c}gg''|2o{|SO=E[[0 N1ƴ{wK {rEa<W8qPVq|xR!2Fôz&7D>;X&g5m}qu.D.T%Z({HUyňGa<U«#+wھ-SڥJ6~a_Q  sH-ـ|m ;Z5ޱxzSLUCY9Ñbj,d$6S"u#EG ahJ]-peG{7y ػq:Ӄ&897z~yk_E]7 nf|75Ƙgf͚ɓ}*s #5kF6]Yr9> Cp'.RR ޸qכl6(^GZiJJ2}A0=5P T)s}$V*ncLv8~ h42ӝsKT*"e8;>e8>wNxv˩T*ۜs"2i8! crRD2 twwSWW7Zg}JṫdUsGq)xR[u7`ʕ 1[gιڧ.\[V8 8 >lN8*l휻9y 멯'y(!cUUkT UA`]Tι(c83g"[lBTyG1\TcFf)c*a>XTnll37jmR՟j ÕJ;ڦ`="VXO?ͲeXt)˖-Z|#KF:nczqzrF<9tzH)qLZ=}sl ZUN7G1@txeE a="Dw ~EUW="u"rU0\QF}Jι| dQ4'|d%哢R5;_^2彧hgOVGxz/&,,4"+U9=QUpea\hߕˡ=3u8|$*?wN[E{C[~ԉ`g~J5>Wfo +QfYAUq8@ํV˔ӌ_U֞\h]do؝{FҪ[ݘ-<Ԝ ,0vwg7Xu>b|O=\7Kj"q?`EQt1y\uUN*n톈'=(:]UKƘ;CrXk) d2^*O81~ԩ===yscҦ--Ç755`SDm=S:pBEts[[ۺ7wc} kjc̑ƘwwbŊB/9c٬zJrm),ιxMD~`gctwC6Ƙt^On 7EoD,YisnZ{ lVʝǤl T*ձIUW]EKڈxs!"T!Uz1fsuq?vmb7f2St5HOKK x;:vv10c[O馛hllqgDl6iCw$>`ǻ:8{z1u[={swƘ=Ed:<9@Xkc7 xrM83fh9FHEl6K @)n߾}B]]ݣCCCDQ3W{8~CT<Չ&-ι8>91$@\8lcSj|>"Ϗ2o\7 ^?L1mڴ=ϣz)۵t/[n{|ߟ\[""T*b<ߜTU2Ngs]{U G!BXG)A eRC[e Qd޿G==?g^l/38m\c8Q+&cpȿ >A6ֹ{ s_, f]C*sT[#8dsMGe[8\Aas葏=!|k>>w{@7b ɲ[b3Z{X\.:;;ذah{EMq[UaIUL#ȁUc̹}+_w]b0 \hnn(FZ9Pkm1SUXkA;~E (\DcT[EE MO@~.=(s?UPUJL&CZdX}'O}!MXknoڼy꾾>rDl.K+_^o=% ÓGbjRXi7klEp=}+4ytgp&\JPEJ1~Q\N%A䜮}x~n2 U\?{zn:dzްISU@i0-;Aعzφp] U߱6 =v^巓VC\N0`/ ijlyCD[@rΩ:/crtvo_~E6{6VkoAGrw[,]^1iC\ppI&ظ_4773alɡl{{}ߟC&yzL}#=c``Ѿ,sI2 Ц`1j{ɜ9snWJ6m }2 l39^x!|~8_fqOjooH{{k֬YEI=jJ3mڴx$NJDK[ԩS/;ihh;9G&y'OhFڭpr7ttuu]seI&y? `IaepppեcXő5H]N)"ԩ,~vxϻ3|// Åb]y2^>M]o]֯|P[!6Ch֒u47 }dc&Ϊ`Apc}fT6yM|xMeqg8PDЌ#_ |oT*Ii M<+"r9멯'5,{pS&IcGc=-J<Ƕ{7X,={2o^n]]]ӓùHY'P(`PwHLJ=6fYkJT*R!u{1L hѢ[oa Z1<<|@O󈵖'x۷QWWG\ojٳ{z}S#csN|'?ɯvtt!fu)0`ܹJ\Jrv<՟)S\`/>7O}1 Îjz\:'tJ܀8VaH&o=`ҤIlڴUu\.Yhb+6lR,zc'%ƘKR0pX `ʔ)]e˖;;;{_# RD46S6 8]Tb9OD ECJe ."?u΍t8#U=8$XUNݡZ[[6ma~sÆ (Wg2Ş} s%}ΝÆ V?3 n[;&=ܬ-\rsID,f"|ӦMs ADGD'LPgR%~zS(/|݂[{pA6̝?Hi6)lEWS]G (+ؾUZv6hn)3]G w1=| ]KhcE9qmV1~ો@^>_@7xFqC29,6WT+lٺ~ ć|%:sg7eOq!pqȪ=wwe[ymw|Vx1ŋAu_!籲ёjdc!f0Ϭ#_o^#򭘮XG{eٽ jm۶-fǨ8ׄaxXe˖_WWDQ:u,6Yk\r%A0ʕ_t^ibE[|VU @UgϦX,qcu===MMM#{qaxkj(hkknG9k퀵v65vGRr,;餓x{ŋiii98)#E]cH2L׈ m$f$?uI3!eGzW\(FQucc<lvy\|g2aE ~/eHA 4|胤ܹsAY*֝~Mo+8g?y7F1E`STb͚5}ٷ/^;㢦7c7SN! wuH[ X{~ 9,Tr86zʕ{|. To/Ҿ~{onX݈/ ={Y'OPrySmyå-m+[7{oGcxVjlwF}wH8fsg:3Z5췴TC\5:`v[K!lP!;+.!AmH|c@zԠV$hnjd )McXlrtZzݥ^J]]ݓMMMXk 4U}SPqWWR\[P8RU1EbXkoۼyج"8>COOϒ`2 SN2̽CCCtww3eʔyiyZPrnApv&\.mrSfSjuX,EZ&M &uVyD':uiEQtn֞Tz{{d2>4|gƌtww:88ޫ#.)tˁFZ[RUZ;wVi˖-G:R#.Q 2 Bᆴ$8~KUɓyR̓Sޣ|AI;jwտ}UKcخYfmC>?*`i(N:$\qw{ΦMаuJ) N "zg5c``Tb8qqUTBcc#/^m۶.[J.љU`>l|8sv܉mRa>>66 r^-eYT0\a&:;;oذL&!DJj֟VJkKܪjz] '(J50<fϞ_ݠ~ak 0|۷l6ʲMnq-6Zi_ttw5VNa0ASNeYk-a8F H\.&s֮]{}uWݻ|m3AҶO _S,6m6m_0>R o0 |f. +\={U1YaiY̙37dYd׀{j! VX,Nk.JV u,d2* !)0 }%IH`T)hrgg|_SIKHka41ch-؝mu u M u/1ChQf 4vhs[cDt֬?bKWo#"dt_+; l`  `giGfdi IzA1ޡ :"312SZ&:1ʐ$].DKb!׬5P5yQ+f5Z?EC[\ihPoϹ|D I*'neD'M9@J0ߏPˆc A~Mww}ymmm;w͛fOR"Ngf uH WՋƚADKd2jQ*Z8"V*ai&w0^"rR}䶶Ν{0z{{OV]ZȫתIѻlFkk+&&&Z###l2mRocccS4)s̼?nzU5AbٳgK.A\_V6rOE-Ljr,˺X,:rA'd2xE5d?R~pW J/{}!LIJç |ٳ˱Xl%3c``&|Ě5k֭[[S˵߯ST][ mr5T}Zs4fo/}ӧk)R}UGk![]׭?餓zfϞ{WضF˲"j(3 fFn8\Xu_R<{7 زe lٲ0LD)uݔCT FH`=uc֊Yk2'-o~[wG FNgv־$ ݖ/yCVp$q km |`s[diVo/:e;!L0 {aYx疿JK)lZ}|g+Xa&s  ֤ N:mo[gy$R&h&I&$@'M4:y-;77ݛ'H Zk.XFKulZkGpNq{H$,y*H}R-RD)Ae H,T- W'Gk;f>_JFGGQugf ?tR/m}'^8ΏFf>V1Mi^:>>P?2 W/]I2󢦦MsGeykkk̙3jm4z{{aYV/3opFX,͞=c]t֬YQض0 QeYks###I),);s 49snW_ 0Okkk:wbT5¥X,NDJ mY83T{Q)Z`tguuu?{oR.5Mbx)-$5B֊SQb1,\pg/%O-E-T. ٶ0 o*0MMMM#?.o !oyɮ].e 0Ȫ h?:qf2an, f˲$GDH&>0PӪ/?hhh h-9% ;B)uݓU +V駟nd;wv塡뾎LӼ\.`׮] !l!Q-{ i>nv&QWW˶mAaS˝Zp!=Kk_3y_`~kknf dvtIˑ_ǿGD/BIk=? ÷Q0jI4W;C6wb_}K. rh!~Q._L&/RJw¶5k|.B_S"K!τ_tE<޵k׾7Lf^,8MӼP(]~}pA*Fj0 ( _?ӾKD\vX7Dt0 W1h0oԜՈH`4X}I~Dt|+ @3#iXdU]M7c~,o׬? a?']k0P?(s_BhxN:q0ZnGNwM0-8Χ k `mT«^*޽~MmDJ)GFFNG?zOgg'>O8a񳱱^۶N\}pi]]NӉ0  S}Yk#;v}8@kZuRDR/4RT0]~XK$Uݾ&, ED}onne&y;>`Y֕D}ݾAX sEY.uO\ZkB>+HdJN<=66Vm;N(Doo/n6,\6cJT]^k U5Z]wy'.2mB,3MZKR/l`ՔF0 ZoW۶qgDbsv=ܳ0Nw'"}u|||+a'H摑wQWGD4 caWJ3R v{C=ND7 -DI)i``y\b>BmƱmk}D0 R, RVk0|gD$%8f\W4j349=kF17&v-a)mddŧNK6I,+ֻbJ:A?  JdPޱM0KTKW"BD-G~t2L[h:↿'A/bvmҌP1:&@8O:I1FwC, 0P<0{i|agaO׀@~p>P UU/&CjZiϞ=+aD> ðyƌ3g!3jw܆a*JB\Tckӏi/<@@ CDmm$'̯g$!Č0 144L&D"7I)Ix<4R_ZߵvNCf8Bч٬xP(`͓k&&&PKPUBj9SrhQM4K%h3 ̵}:۶U<cGJ n]]]9vǔZ87H)g㩽~UZN\Xkk+ysNYua-axxODUvJΜ9ϟjbYUm_5111MX,[*维p߾}8Zw%K}7|]<y<Ӟrӧ#H}R)lݺKZ/5664M[K["K'Rø&L^,q=㩫=)%V+S͝>}:Hk_T;vk!/\CDbA?oߎL&=H纮A:Hdk׈H`E=sEV@I cL1=ܓ/5HW ;́% xD0W-1\OM|/po ~weaw/v 'oK[zӇΠ̳Ow:xzX,˲\&Ro}SV= SSZ4MT˟P _jԷ<=Ӷ)s M53&D Z m+O]כTg7*񸩹hxGéWsVtDT[c|3EgOO5xQ5.N\tE5s>ӎ!doũ3D42u?{-JZ;>k2M<ù3PSF3)犪ԙ9٪ `$r"q1M4]%HK6ʱwiZ~I/u S^7#n;ڥGލŌ˄)%n5mXsDɴnB0MW 2#$/x3W_}uR.[eՊGFFH`ED%16 lS~0NR?Z J!gIw؄5Kv_}DUcEp92MhP8JEL1`6lP.e`Bc@;A?>Aeu[ )lb*bK+8a^m*JVDDs"XaR:!YbW"]F pKyI>`gD+dt0 !pu= =0AA*(4!A`aa 1@d V0y&4fxm`>h~AF'֢>_هC; @ ~r6pm(X<˂H`EDD<{a!`yYu-@q l6_iBpt % q/4=pXzB`CC`MMv&i D Q? hH@Bh>X8o@O:ZVEW*Vր *_4YCc@E9v$f OJP( WTP㺈)xldX!j Lm b%[8fك߀ 0u 0vx.H&}ÌH yQ L5 U{#$`%#_$UFn#7B87@/"|e}?#nCt(ls+0gTy1\%ǁDVDD$""".pya܌v<ַb`? @+/ z5H_SKdB"iA1TH,]0k?\KHj /EpJ㠩z+JHG"""qdCb]] WK xb$^ ^F^ p#W`VH=DkB<ю4Z t=8Pf+ %N&4ARCQ@IHd2`,XPJT aD 5@2p!\E vg^P]_\?Z|TjjQgٳq[nAXD!ۈH`EDD}XO; V /ZT1<aA+^aY)u*X,vd`PZ,bZP C aA1`! ]ibd}a!I( f%墤I~ͼKp; E NK L&FxuX.lrWCBЛ@Zzi&&0:s&n[(VDDđv~q'>j^LM{?4!P4⹋ջ7c͌@`-[VJnWے]+И(-1`*Ă{[ UJd wt/q0'&P}x C\Ffl DR)1w\<6%ߪD !>0|7Y.s- &.˕%ɛ:V)=Z9T6!X ѧP( çOB7BpBB'!"E8qFGê5k18B-0;Δ 80rGJ$XnGPDZ"Yhx Bq&$ a}u@SlFC* `k>+f` @WqsGaޛ 'B:c})7X:44coBM"<p]onPc#?88> ':"""q U|l / ,]zpP3&o?'_Qdq)9w݅y{`qD"" b i a0#?( ߃/$_} ,Yv18?HOYA -iha@BIcT$p)E" m& Vi? (1?ՄIe R@\ຕiVV:8<30r"""w+! V-%@;Gϩ,9X`AQ*%|tM¥2:f ԤQ.f9Q\+̂8@PK߅w+IV@x&dT V@GVDA% FDf(Cr (/4@Uш%ڡ PH 4!*LqY5fvVJ>l/|xv HWw=6Z.t+(0p`KBĖF(|/~adFF0$dtED"+"(WF L6dM;Q)!U>Z0̓ - !#P^Ư>YTUY"IhiSNJ1ԥpZ,, ? d8Gw>#9O$0ajne)4ܬH`EDsqgX1x{`wU Zu0F%R K{|FG_k4Jhݺ:DVDD$"jr_D$ L!0 E7IF ,a*“)V ?hL`Q)6`F*vb`wSϞ cۇQ d 0V,3 7X ZTn)h/0o)@3? A@njB(+R/7?۶0mpCCЀUcc0P ChۮjEDDD+͘g%hP6LdmBZ`BL#Z>gVILn@Gj sZ܁}ʬ'QpL! HBNNvPԕ2#r>>&fZckc#$|It͜YW_:p(Jku m͆$&4C5> PϧI `ok9qS~z)kZ?WaZ3tP _ދ.B޽>8;s]'YxFQbP4\ dy٘}[d?"q8m9()eJ~-DP@HCqd]H#mB(m4!L`zd6Ի=ȸhxCpZ"BcO H{`w) !!<FhH4)ۍ(i~i\ag[;\^r̀@[ˡsB>mg$~ SQ0{,^msqέw F4eDDD+)uH"/X{ իx  abz~#suH+_T6kZ:!BaX @9@ Թ} qǦVEt6#1L8HC` yHL!T iiAp:0PWA؅kBM#tgQ#*cM%Axm0a[]=HC;0֯m}WQIu(Y/RߪL).+o}C~O}'g6̀#PA^P,P@ އ`4}z.'@ %Lx @N3ık0}~}hL?X҄U7O؈;ƙZiPD30 @:``QqY5|#Q V*54GPld D-MhPdgLdeA /lL8m/؞n?! lYio 7O?X4(2}X*ҽ?ͷ ݟDxB# BbH\#E\} {xkwVSJ()6c(B2FW[5P LNc1h#""l*3$BiC!A Ve#x_ez82 5wjzgaMN!%u%ՆDE|?\gH)Jh7fE6>ţn~L5σuVS lo`kPiwb>َ@A2&lvCJUTzFab2 lq X}$v6  $?C/$V/{-u gKŌX!O@o$ p'}NeԺngt ػ2FhXW@)_7 VG] A/a. ]0j @\\M}aO{'^r([.3'Y-Pfb,s8`/19 FۂA/Le3rOcP! {ˣX0FB}hOX$V/z0knLT>""XGqJCcC8I p2-{0<0)Ї5"O&)h1/DDUU2Hw`cN-Q)"W&&@X*!D޾}0z]x!1z2̀_828*|o=}-GFh"q/7q)巳y߂Kcdd-20œ @,wJ0J^L9z %FDxh9a6 #agĕk% @pT)1<# 8^ Yq9d< OԂ`$B!ER?r/: 1ǣ1ؽF;B SJhDf4vDd1֨\tӸyX p#bF"@ A(8R$Ŵ0n(Ї 7p S?2o!r)ZoEh}> w̃[/rkm_iH8x yT-1ֿɑBLd'^u5ٔ@V +< 4,{:2fBJ\ #¬ Saj1B2&n@CA&Hkh"֨C( B?*4Ɍ1My hiPGg H  xFv Xp1`Zs< ρ""L6 }m7cF]zB\H ڸqd@`Bsc3f aѧ g3ooyX߶m< {{sb`;MBH@Hd>HHgqV Cxv8Z!S)("@2ǟAk0Rd2mRiR[Io̘@<}c#BڐO&*ؕ,O !|Xy0-lCoL῁(GՁYDOqp[^eQBt%ȸt.ؓ/k{ {7?H = CC)KDH`=kɪ{e2HANU`%aV֐R9 : @JEG!5tZkb18۶!rrj *8GVȼk?yQ\u%BׅcW ? HtGu!_y+]cO08zILGCڲD+ ți'X~:b C[dP+ـ x&XPRD?y1`‘8IDaQR]ZC)D""}lR dT J)'}&Xv< 1Y## _ ;u髰d@HrJS& *Mt~H eA5BpP) ې”D!k @9P:ÒlC>lu}`[R@91k ʸ Qd*ڎ1d`  ZIlhL>5aEC6(r@rvS7bw$JB8¨[h@BpXBLf9`xn.)%,Y!qgnPMxt| \TdL |/^r/r9g mdLAd;|@ ‘|oJŬ)'cRU81hc]E(y}הiϛwfC)Fɫ-CJE$NP\;64 .hs@_ ·; Y g BVE`#fNG҉#A$I€,*B-B#6HOO11l]p\qۀ ($SAfon5ӿFbn 4:q)B*mnzq0tu:@ P.;(B]#:TJf…^]?9<T&\:Hd( Z 0@s{N~;*tW(zq \G gLב J+|97mXIg6ԯ^~lrC%CbZo|Ǧ.]Kڦ\br%.nkzOܘs0V5e(t΢';iYߺwGC*/἖76[W[ ~A#>|PRbEM0?Q4 0R*10߁x}6ע)a ,A.8 /`ճx ESP-ЅPAvE1Uգ> dU"06J`(й4eDLؙch߄-("|@&@[bڷw@n`֬' #@lUzf3D's~2 s +FwQAX Dٿ"$ZHQ}m0_}p$ig7mN&e} =O=&7{ɳ^MK[esݺ ːDa/9uX4.[9S7YR4& ##l;];l F>jJ>R)Dӻ"M5Ā20(E`[iʀ-mM}] &؀.z pP Dšb h3`. Z>X1S /}?Dj|z(/ S7BLLfa=xY K.새H`EDQގSCnRɣAҸ 1 7@ $R28,/&<Sͫ{7.@1gq͛O]%--?wgO g/ߞ౮ ucCd/^b9?{xo\!a/T ZKWNoRšz1ZZ yHǔO\vV.U)l\ƙ-QX\#.xvQc 84|n~ٰ Fb{Wg=ST{a#Y2"]@%Bm[!۶P1A/<+Gv(Q>C"`ţ8udX *hK륑R`ϞC,@/eHŝt̶L)~,Hd삥͵}ww $-;9nfCJiv P-)| xʜiޱoQ[:uuki aDityO-6B'RE@rm7[Dg!ua(Wgz V 0:o% k}{3,fóAM|Q2 h*tRThaz$""J^t ~e'Б};H9ig"rǥ/BpMOy/1R($sRHe D-l鬫T>˯7ǝj!bo-a u1;a+Lyi< ŋWB/;nfwJ< sIҰm}s(ѩ"}))fa(2is9ϸ58L ~CXzR`p; 2TL+S}QxVqz4 CCu`\~F cV,C09q8WMoHcf,KyZ.]1v #^LϹ^5RỲ2fڲ&f/3_=S9~1Kl]1!c0_nHXj]y 1"t斣֦=dS6olځF. ĕQT3AWjvFD+"Yü:qG#t9OATh(89L2NXmn8}ns3{{ndbvdzUg S'Pؙm=Ⱥu 3a\sMI<)dLxY=x|R$elP%>s:~C׶hCira!|ثɹY7!) '̝lT%9LU!Y02PGSf0ϹouM{)X kӘ-B ȹAPBeI!Y59`i{3JbusJ~dqVLk;q&׬:8wf<0 Z !6=+h؛iČ( \1p"5xNs>:++<Ӿ@n;܂ڇZj{:3:PX=3ظ1a[ P/rc7{r֝uq'fJQI+'PE?TyYC=E7W9!)H' ]Қ ug-hiCHŽۇ$Ielg* fIPYq1Fkf"kG!Zj&NEךH`EDّIB|iԿh$yƼg|8𠠧ˎv]C,)fFQ0^\ޞa^U =DN̻Ϭ$sx3gᚽwr0SPVhFHE9^I#aqӐmiK!ku |p(Wo60*gvdy K ?k(ra[ً`yӮY PhH8`|).XѼtZ}rpm<T<>%[`<؇d=x4&aQgInBtyJHXED+"ͪihO!s=K<I@C x %,+wl¶Ɠf5ַeb΍o?GƲE?8iVC]Kʱ@iV_mnh3O}#aۨ@C)p΢34fbuΖ/i^M}h,v?:ֳ!wG̏6Oxi>ϊH;Xnކr$""Q;x|{ eBMȚcDtZS+HAòH;џ-{ǯyiaK6$!@dmCO2l݃1Sʇd㦔D=YiL̕~}לgko;I|xh@kX~pp%<%ygb-zGgzŀnM9v . DL=66(/zv`QF gGNYD$"""g3[}hnaύTܜuH%v!8LD{̻n0s I>4$,SCo1`W߿ۮO4+ xzw# gCQ}4f8cRtVDD3矎[$.xFCC=<#"HF'mJS9F1'R̎!hZcQQSm 6u6O36xqUW$ 2qc ` D@;`u>1/[KHD$"""sfĪi-xH$`@Yρid12'f[Ь psf@!a=Ye"pYm{T0XPW`q Ջ6qTtVDD_:[A!Xh HerbĬ[V߅ FRKcC چ ڏMS@؈c7a=1 X ݵП+J:l!ŽG #4" (aռ"P6e&fSUA)̓yoJږcHoP-C4JP є&Qk_vrMQFQ[K'`!^YsDD$"s0 @=:  s-߽wWO}R=} ;q;7N6N[31*ԌeH(r ː+XXMD$ ^Ҏ)-CѧKR!E6dՇY<7[r>1!uSY7Tl&Q:8hthtCgOǟH`EDT8 `!@Xi0a*" ٪YTUmg8|zavf~؎s@}"ϝ_nӇl7|!\ҿ@ IC`qf˱Wژ}ևb4ʞ Sƾa/ڐNod n>i詹)ghHR}469әٷn 5߰'ƄZ%S~т6$,s z;2c:& &D@5Zߖ$C34 <\$wz[ہb""q4aYDt|h;ks]B z;::rwT+&q\םZ(`搈"$3[D$Rv,K !r=`Sk݁J 2|<nfC%"!7\ $sa-!) @+hE(యrCQt2ۄ|'z^}⬶cw1o˦5jǾp=o߷m\Ԛ%li,l$~fO{}t{]D.^x ?gxbPWw6&l?_:?hcGWE/;vzX緤 |Qɮ(FL*E8ֹ1LszDDD+_WZ9Z˙r'0x0D8Z=bq%\Rڶm6n܈D"!lۆy֛a0 姌4Mh.ձ hRVHTiP|$q`\hiVpX`"ʤL xX-;.X>4C.sÆGs,< 8Տu'ϙÇvVߺSf7]SW~m]'lLyO}vo8yNGc6{$.hIyoܾy߭v z 5[k;u[N?-w)1@d2hUhH`1lł(H\ED+(֯d3)5QU$Bn!ğܯ~63BLCZ맄.K=A*y $Uaz>3 S^~1"3̿Z}?mU ,^hB a6f^}r=Æ]Qoܽk=;zbJAJ1;[}]C T+g5&7ώOc!wJiq9/]07;\ /޺歧{_ptjC`X: h+Qyt]+ׁU;aPH`ED+GJ 0 ^*.cfg0R>LD7hARjRL?d2صkFGGa "ŧjͧZObKk !LӄyRN}>)}JĉyR*.0Bb?#4G뼅qmӶbY)qB` S{"{p]2P뉒lF CY#cJ3 "*JB▙tLQhC!n{FeHA9DU}K@b0,lM%d⦼}s螑BqVcA'r@l8RhGUՄN{3!#ED`şeY;mY+!"!6H)R/xBdJZ7n l~*QRB0 T8)-˚j*mDoi6 ,)UzyZ>.ԍ|ڑ&wꉀ`@yDrCWTC@W+A<;'Ԍ@id[Ʊ!BȨDu$BeȔDy/ ˿ml|뻟/]9kT+gN՘72s0u1gI_CG@lHBumGkV ` W&E@%GDVđH%rJԿA!BL ר i#B*SEQ]*e TrzDuf_K&Ա?=Q]k 4a6 eY}SW`"4{|w0. ^HDBk})]|x$|V/Z8,Y;6o]h bRV,Hk?)ȔD!mOqnZ)X "QZ$9rLns Piݔ+yd^jj-pٜu+~xт|s O-x^SҶ'JjOl\b;! CB@oІ$!UN{9됍r""qjz3@ֺ8-Sf>D4=yJ0 gR`4Q͉JLbֺE"awRkyjqa7?0ZN)'c!ÝJNRa+՝Y{&eحDhHWRS>t!!_6)(NJ;ytXW聍y :Տi4~v__xl_e@6yʜݰ~禾!;־eǺf7%m[ ! ] bL..~ ՕܫH`ED+HWaהR$o'ѵԤz; @)sZ!S֧i !fE?~Ut IDp]61"a0BV- d]Dti)2 j"W;M~‡-3=͍G!b0PA@%dlBl%XzE$zpD6d]2@vh.a"eF4߿{x"3Lʹj.fp3}Y1s߮FIjM,k(~ ;>n{')Ƌ 4-S>L\Ђ+gF ^աވ9:ܫH`EI0||V'0 ?0m "e0 ^p.3CDZ=mҠn xs5,X,|7ڊD4QͽeYOOmXk~ 3s_ 'L;~󊋰;1;=  U z3 , $MDZcttJ0^k?~zh`ӒLݧ<@:u(\* hj&4Uku^JO@/ZkfCV1VG14^̣1N$Ck9!.\OHaV)DDD+V.Z0 ö[[[\,?y^yU51gDt]J78uo1\A~"i &K>TR~7e]I̯oPn;O; }d= Cb!4 (hg~]cڰ彣{+8xc(Wlf4$mٲ7---UlB<  4>a!`ިpP !:2!G4òK8>sGՈH`=wB CG)f~MgDthnnd*}Rʗ#]\}<^.}ZB0"X,bgRKA!64cx)?nl1 B؊*Y0,8'Yh%?pL)~ړ4i_7Жل.`TbԎNNĵ655ϫ{2/OVrM93us:[qz\/!яZڤW0>RJū㎋RF%as'777B>Byk9C^J, JqP!~3W8!n)ǔcE/C͚3-@)f.f!Xu Ƅm%mCx AP6lN:fC7PSZR@Ps&f!G~JW9)H(NӔ%;+M8. F!,ÇLU +G c`yu$""qxd\lML׿/B(J&>N KUuT;UawRk!=pimr?]`XK*vV}u_S+@dII{:W^ (ι{_p)|l[{Y3Y K~ĬyyNoHߵcp n;Q^sҬV7TuK3~ݎm/_rbׯۙ[ƋWLk )X5ecѢRnOt mЖW>C ٍ;[~<7ʔ>wɊ/\ָfHlӟ-{?yN*~ֆMgoٴ-o8eNǴx?_|'b'~Ir |@ }&3+@e¹MF#*X(G3WJgѕa\Xt)N:$lݺry2J)oVJZYs73])_kR}T !&kiruz 2(3P ic(( G.BPx3Pi(otҎGN<{h=訋uw_ضw_twy- |d_NyN]e-WU! gV{{<{qDoo8eNǯ?gw~',J:go%o-/8avG&5OYy܌W._ 'n/Nݟŗջu017TgMNYZzʹm|FK^2F 4IH^F7|ˀw$=4Pj z~l$""+ZnBy6AJ_ T @:F,ifbxў[u}N!j%,ayaѲ?%?^5;XpMi|,.|aS,iB*1SmD$aJ"K )_ mc>vg,mo }ۿ}φ2]?ZuJ/i-7l|5l}]};sşe8n65lC6'%s ?s/byfc9mnKCF.h}_˦r}E+RЯoݵ.ޖIt}3Wtfҿ~kͧݠ1a~F+FY l#˽Tw@!:ED+Щ!J1s*~H$^[.Z"d;̯Z3zY"0>]~# 5Z[}Y'fYo0Q)0y7. 53gNX<Pw0j~2@h%,\̲\DZ QZJt`gh)~KޢTZ#E/ӔtbجƤx [f6dm1P3o!f 4K} X~t̔rS6{8_Nj1/ZPL2ɲ8c^KC{]Ans l#Tj@Ai B3q('~֟Z#Js̹l޽;X5.`Æ o𭺺:#rABpy,{5=J}vtww R XLYݶm@3?̗!n>=&$~ve8`T"TV@~] 1N<Z5׭|q3oyY'|i^C+~ڜvڍ}/^beYZג?)Z?AJ" M+5EVB n=<=U3G&S ؆O|cYZ.z {w Moܵ_r삯^q}}) ^~xD3]ÅMzb=(KW>-o!msC>{1 ^vMw=5jzC:rޑ\1 /νz ' 5F7ND2C͸iCp7}iq{CD ,Xyqa?1`P8@ҍ >$6"mVÎƣ8λG=唪>du~PP g<\eC__ǙZ]^ͷ;::yy=W* Rမ)^oCؚH7g;tS"3%Gi[j"䊎ל5IB p4An(5rwhuѠeJ)-KBT!+*p2w3Z}۽fX&8m!SbyW+ \sPlV H/{/v %d.;ԺeģsGq3+ J"=Mi;WŸXb k,D`< Y4`;b!p $,fG`WQ/]Ò_$ p!;u p\شjJ^\l ֨tZovh<`0Hmm-wFJIXRڡ ̨ e&bqQ[[j4OVUc+eNrw+vY go ÷ EO#40+η-,'ueðVM*uȒrl],)=_Ӛlkbͭ5+U?6- aÆ[ob ,3Ckbe)w è#4bOjOf !N!|,H$8/U -V1\D9g;ENM?=JL8c$<>#]1P4 )򎧺Kx2 )吣cH!bAKB(A˨X[xÎȘ}e 7 d8~ 95]&^!k G+ɾqpg\[0PC( FLOZDCqDՂ>!Cf2'r`4<3DZsB `Vs?p7kZZLlWJU 4;j-AP`P/5O + {6-zRCc%2%O,:;lw=9K6 !% 㩂AӐel3'l;k`,hI mWX4gJ '}َGu[RL!L)ٗ^H@4O6 TW_=qӨ8, WG^2\5砙5k _i枩yGqH6]BfUPS*3WH+ E9`ihgV7<"EB䰵dg42Ǘ/q+[|:xntXo+fŊr2X !ΕRncꫯ& hZ jDZ ȪTi1iǕJr RʒeY[?`P,gpx-xq~oݿ,tahn=@(훇]'ޗ ;twͱ,BycWmɗj#3W$cWs+v_)mW J;BH! mOZR捭_k |g&>sW򶧅̠:4(wƮB10BBC$_0"iM"I;%{#nIb` [ER]Bz1AFiFQ5q4 i0}ChAVi2ZBVe80D4[,sJ/@9TB  XҊ}!djzzznb!Xh4B?cǎ&N>JfZO͹9>_k!LV4ŶmAJ}!'=;`C*VxS@sJ%c F\$l>K"_1cxW]WO?}ܟ^1PtO?}^}w_t M_;IyۙݒLC~V߽t{/:t &4wmgfS<{Wom6; N5qb]4<ܢy`k7[.!"=enyq.=b΍/lo/,)[Rнwu ! S4XvVM#`!z&܍!WtCB7Ҩ;ȪhPO=.uj,nbG<F>< P9,X*0ClZI+JEQ./qK$*.R>h^5\跢eSݷ2 <ȹܳ`=˒1+ nQ?FqtXĚĚ&LND"3J5%_@>۶b(y,1MWmπLPQНL#dξtb $^Lk}2B{{X'7*9wYsZoyl!弱W^_=+[SrWڭyQst~ƶseGџ{c]'Ϛ2Prr]4k<& Yja!_X4kR,dZ3>{-0?Θ3ybm4/osoި hyIB+DDb㈆C~ EH&>|A?_xԆOXV:%ϑHqa rYl=8]DY8@ .kP,SgEEA. [DfDJ׊+ŇVl_iGߣk/کϏxb瞯455WJI}}M`[Xd2I'DCCZk,J{sۙ4>Κ%00Mt:R 0X,hlly/VYa7my!e~Da#[OCozJ.*-ΓBoߛ,SSW /?vX 44nK-3[*um+=;f؝>ELlg-O-֩eݿjWttҌt'Ƃ7c@v{/mogWm/`"`J/_zU?Ŀ]]U Zޭ. # qCH"ĚEܟ۸+5ReJf+A`P\ .aM _tFR F  "}*N43I`ۨ:tuy Ypw~RxUfΜ IӕjY1Krd \.מ~x{C0} z'R\.@ 0_JǙ*/G c2ȅO=#&G_/8T${Wm<Ǐ>a+>c=ڧV?W =TiM͆%g` FB?KORJ`FiJ Aoj/|CD]ӄx}8&!Nle ЧϢ(3dB  \ r\nLVK@fݻ >CH<%⋞_Q]|` ?g dPggB xd~F( ?5 {=jdŝPGq@~WWג{Spx8D"MRTZ :@3 °sV7w

    vr},8?~zkgH_:#LLCJ)h )D3lm7/W J+QqѠus[v}q2_Z {O9W:zϾ9eN?vؚdvlѾ(\}דM[:{4>k`/, $큈ˠ'? Ò7q)_&AE9(q3c]]2`\H5yqw T]@[r9!NWjDp>U߸\Ig I<%0i2}Ж'cM(v@q͗gY6 ͖S.'JHscƌY}M7Q[[˸q2eJΧFsZfa((X^y-[0a„ Z(Zx4l@6Kk8GaKOGn u-GoMKg!DpoϾ:4ŇMlyt}g\)i ]-/u|-<BĂ\uɇuJvM$H]L2֦3d˶fj{pm{/Om9gsnkCc<s宎6t܃ghm',8fZc2lIݽwՑl70|Drl#?9|fcx'#^ ~2_ T4̍I{?,(|/>d{"v -c C̲,.ӂS}MH)r iD ')xʳ|2ck9Z4x|@<%\Ce~&Fuvi/~q~I& 'fYߖL&I$twwC=z_WG666>3s4۶+>H$> l3fqW^y`08VJaYG;XֿIBC,;-8QNxw%洦bmRwv(L1hgh,֛/:Rc`M4`-30!>LҶΉupeHSJ3Os' [;ұ hGX:bJ}Yc䋷.ީ uɾџY8.qƮLɹy,qdgS6gaVbF,`Y>zB,KpfHL** ;LhWέ8 qd $2\1A 蠜V܄F@ ݖO]@Yg"{.?%A/fϣkwND"/<BX54͝l+:xk]8ez>d?BkD"?p8Ν;ioo?; uPB φFeή8R\d5-<{뫏6OB@WMCK nN"[r`Y> Rt@_qs%35Ѡ]?\\Sh昺S~җf!KiMOvm6hh0!nv bP+#ӈʊ=u4hѠiJd2a͠HZ Xs}ys[c`/!?O) *ǩL˷ 0mG447OV; d#Ox `@lvг9n緞TS _Hȇ#0nD@ɧɇӚӃ`pyhvH!*p-屶S>}aŇuM n.v2Xo.䒽`!AA&p8|)%J)ǡT*~jjjQy^mmx|S[[d 0vX^yIO?H$V !H)EcqX=6mE&u:Aqz`?<]#yS!%ܠа[SMP BY͔Á>o& v lT깸^4s;`7hﻮKTGJn}W?cWr-<N' è%Zl뺏O>N8p8̎;xfGP)3srlpvm$ 4{m(gK=Ax{/پ^3\z8-_i-iıriW`}BЕ4w)dF`?k 1LO$`gi~j~;¼ ] ES.b5Ā-/qulx LřǯyJs[tv+O{[ri&}wF"nݺ"JT4|G(3)%lxKrwƏOWW"?~g/ܱcǡHm۾4m{*f8%c ƷkR/QAT,+ ͐#\uT1i~sᑆݰaHu,v*"g9T7FA| xxl WۃƱXNE.B= ';E6yUI%g&Ӽ)lj FnˢJe;}8GwQ ڵk<3~߭:Ĝޞl6ˑGɴiW^9"ܯ|eeY}Xqm   }BrR !a4eea>vgO<>KP N /Pe"ZLaI#-Fbq!^};FZE̮K>C͕U _lPC[D> zj ghn%g 2oS{|73>FO}>X4>j|ls>+Wa 'b ?G|эvzIHUBr] (\gHM{dM.~#%=x,.YJtfKs2O+y߽wJV( pqP09O4>|ͽ)p%̄9뫩A|M|-]wO\/Bކ`cTkx%jpԃ`L__6߲ ɲH ~{nop`|>ϤI8S<_7 BߕAB ! m Gi'/ @{384DWy?s26 VǴ?ըEOIqn@sٔˁ ҋҿ10WO <muCFCqni iizםs/`Z4?Qp2Y*P}Ӯ2&"=lN,+Ï(zM oӠ3<8hBia@WWױ|ܽ-t:j#l+U_0M!\*Kߏ&+37q[Chȃr@yׂUHR%bghMqTHq%hvo[4!#|(~76$5Ӈn(jZmpF/k1f?\4$[/8/LHgZH6B0ȌO( v7 $ojA,Wny |MUZ_W7 Lj|D)rS*vI.X,O~vTmdt]/+4ܵZ j?_yY,BA8/7gA7yemS at@`}T jq&PqWv4փ'Hy)XY x(!}(5@Nr84Yb@AӾTP0 r04{1lLl AM(zS +4`a`ek=Y[{ʝޝ=URCP]I~`}3VJ)uOzG"RmmRK6u]Jң@M;A}%lՇB Phoq*(abثihV+,Zk8`p0J)2 ~a B]iT(<0B6}0\=i͵A16:@0.Y 08h!L 2ax~_/1oet@2>r(=X)`g(&鍺TV> KsepFI櫣9Xϰ9w.J7V%mۦT*Ui+.&M"H 7RJ>===+BmT*UIfҤIO{{{P:& p]X,ƴi0M;wf27bc&s! E__a7]JyQ.N;.H$u]wzʲe yJ1=غ:Nh Зp>—h#ܙvA C;M5[oC.bAAr!3@.6~rܧhOxnSg̘mxVotG`֙Z&qhllip͛7dR̶FdYH) ÜuYxǭJMMMa*2M\Zk|߯*S*0a_I&⋔J%,˪c>bqlٲ[ozܡs~%4}T5hFT??E|՘*UyfyWըz=סc,:F&zBf͚Sm| 6ؘT*}^)uj2DV Wp $4bF̛~n߁`:NQpiX-i>- !>=F@ur~l`V`nl C !oO"g8a&ziWֽH /祕c3\qJ]kL'|f }p}Z ,3w i>lk^J7,ۤ|FaaX"!Hd][[;v쨂4m;pUGG?p˲?>weq 'OPJbA|ߧ@ @?bPP(T߯^>*TI֯=7x#d2̚5۷o _RJ"՜~q<ϣp8LRATP(T rdqHӤR)0b0(J$I|'2x}d20 +Jd2jNY:&8 o:Zɻ;?… ZS(R(>/0<;ݶUÙG LmN,GFGr^R ﰌ?%K~[zԮYMo }!Q[sAۮ̗*'b.So]g5 ZgB/y.ym*? OiR@>_O;cb~EmOu5/:7_Mi<tMUi1`448` Jq?SfhA1SL!a6;w吝 :OzjN.\AĪUx駹K7n'N_:w  m6,"ssG3f";vࡇb˖-R(8ꨣ8xYt):u*cUC'x"< L4/q馛8餓8lݺ8|08?>aTyYgQSSÝwɖ-[D"okMmm)J͞{ aKy\^7Y.`}$2 @ ϹAȦ0л}ZN4F;W.Zwi˟~f,(ZfGk]z˱ZׂJ)WB_ _B E$m&*ݪF~k p.O]GL0 > $4dCs k\5@9%'ߙV_D+O#׺X<֋(TU+ϛTT"PWWGMM Oss3_Wil|uĉ7o7Yr%ӧOgڴi455a&H5@LB4ogܹ,XP(SO= $ ͛իftIZիW89묳^5Srqgy@ P["SO}xMF4#x≄axGFr!KCCӧO~wL4od2,3̫&L '@CCeϲf͚=X.bY9xU RE)u`)B?alN]=l;0q 9 &k"m #~^u=7:fZksOz)45zF*Ҁ7Y{{}%b 6-qKG%[Oͷ9>tH!%EMkwTz2ց[aTvo,\<l<<ӎşBIP.pt* ˲B7?\JPj0 6ӶS9b1wy@ T ؾ};rJ\wc(x3f/S*=x≜r)w}X̅OC ڵx˗3f̘W[?gyf\Y;p8E]Dss3ٵk6l555uV/L&'?I,裏殻zUwhsLu]/>=PƏό3xy_Gyn<}cռ+q܃ |ʇ=T}4)K-qǙ w ?!/a7=y:_Sظ5! AG+^T pIP#aC?%2]zXX7ca&twW@[%zx,ZK6Κ.䒿{T*qٰagm;v)&H$|AfVO?ͲeHRդ x'8hhh;SzUlP#8t:/~ v܉d2J8Xbū߱b jŋs- dzs;w.PmO.c466r9 ,|ux.{^)E8&Z!xBk}R7=L)zL@X"]}N R.>u /z_?HmGgozeܹ:;;I&tIuQ8T=߲\d5}hbJ4Mrb ]ץ:kIkk+sNo΄ \d23flۦX,VЊdRWU@B9(췵j޸~Hٳg?`ǎ9|8Nk0fcqgQ.ǖP7BC=w'']A8p/Wp'X{6`!pQD{ lXbqsNvk1z駇g !0bJt)uuuo|bH0PI2$N3{l/ <_| 6pYg}UĶBϫnav ?:FMoUaF̾"MMMg_~

    EfY|_!&*-J= a=Z3) LYLchA/Bfb' @ D?%?I@PF u{Du%m;vgmk&E8c\5A&1]@ }1.qd۸1jKh>Дtex@i3֙`+ؖ9 .{seע % 9*ZJ }^{FfثQZ0aYV0 H$cX5Wqد1C_*z衇b7o;vg('̺u^e&tR.\H]]ǹ뮻B\tE@97kɒ%ac8%K0w\(gXx1sckpT:QYJĉbݾ}s#Qs%FMJ &|LZhdp؂x=K^sIįeO"]a!Ep7i E) D8_tyN(ANBkibP"V0=KJ!iOܢ'2І <\=Qd^Mp7z@ P8-Nq:0:e=FdˌшZagJɪAC} \ Dp,fcqh`eAǤ1Csz$/ -zz#Op7zWT*SO=Ŕ)SXh|0| 7e˖8j8Ck*} N(O2ydN:$Nʧ?ilfᾖ Gu]ڨzpRBApx\(j˵}Yɦׅ1[hm&Cy"igO#BʳeNjUOR*8c8p? /L3H1?( Y+ M1&d PeP}zPV9BӁnзGѵ=Pk8ʸ>=m?.] raA 2˲\;G~|ΗpB2Ί,Cϴ=8*.X! SYFYl@G5%N5~G ߾kҥo4M<;  "ܸu5wjN)u![֭[cݺuժcGb> J)N8===p w\.G]][lal߾ 垍mmmp $i&Z,=!B)%t؞L&NfaX=#N BW5*,VMM l\.eY$JdM:& afUMP r;555r9 èWkM22RNRRSSmձVX!\|>eY/!|:J˟jKjZkP( "#Odʔ)[yW\qЇ}o}[lڴU`eYP$T&T2|7 ˠ'O< .I(&< z"r" vC(?Mu1xIbOÂpBX(za*`* zZ| oHA`򳣮 !ՒB+ _~ E:qYh`Y5(\ I~( Cǥ^b3 ˀ4 l3 I(*8Dxr9e3 4axI>D(3[r w '.g{>O@HXQ8#q֡9~?1ϋ{eS=)^=| nZ㧯;/mM۟ښ(Uĸun|z~n﬍.Y̙{0X{sT-_dAurpo_UAW_GayUoxG8J͢+`&F21B!`E{9ձi*捍:֚H$*3P9a{l)eu.*=+Zv't=Xi&vw 8sT`9SyGRqRj h kdW0w A مw;Br? 8!"B@id,ZhlUR(@$Z7lD$@ |hdJߊP1+(_-uD?z q35f12EC1Ð|;CW_s,!J 򔦷REO-4dxM^|“ x[(]rff{wSc? n80"}L%Þy( y4h>9oSSO' !Reݽ҈AM,<;t$WڛQfߞ|~7KA4Ga„ ~;/>nFJDb)Y9˲s:uQJz\60},Bz~i0)8zL.BDЃZnZh"Oo9[ͪ ʡAXd9xX-%f3*LWK>OVU{u  5;&o8C~3l{|4~2jg;U}̢qn|boPE"q&yLJkX(ToSG[*\W\qŚiӦqF?We h?6- R,/~c=Ƅ aʎ.]J>+jf r-ò8X\݃/ N!jQ2$PNj]H΁V,ޅ2C ۳CZIKoN~׼2ˡdSd (7u#ecfx|MlZ7:R_.EC wk:s5YQ-ŷumI(ڸ&Ԕɼ Z@< ކ˶=+7z쪭FH)QJ5WK`y455`(JtwwqFz{{7ohN:;;X|Ƥ& TI1c@;vWx<z{{)-ˢ"[TJeZZkfg7#۰\9k:A~4! U3:d&z@_pS@sXbD盒 ML0>s%r_*t4h̘(ݮwz|jkkp=Ω̈a=yos}r|CƟԸ[svhdb.`U9;ɱQ]ZbI&Ϟ=Vbo`+r x;8s_UeF_=+W$D?LMM >(_}5h8C:fܸqGa֭|36m]wEcc[zM10*4M|jwӤ*U57{ 'm 6Ș< ^]].AU%dŘrkw߉A_lk^wv9@i6[# YN*J&\88)-0E?$1 R0:O!̹.S%܆iWocޤ ZVʚ9솇WrX'ӌ >peWG `ٖ#Bbi۷W,[U(% =V3ՅeY̗e~sA2CVe^JREb===zU t8u]߯*HyUݮK)Uz]*RqRVC\nʿKRerzaH ,<#V hm<Ƀ,h= Jngf˙븧 2T/%oFehW 0X& p %=!ysojd8XgFS_us(ߓqp3]>p 5' g2l݌Fׁ.nZ;BH r`X%Br Y&RXo3Z2JHP tvveq B4sfL6>v 6`&r \p]tׯUth^V>t8 VG.C)E4%~U"LZ(뫆KiiiX,200P-0Qbd2 @ww7Hzmgͩo߾/}K7p]2 XŨ)%||>O2<,hbx';Aً}ѕg ws"j@&CC@PLw\)%'f ;@}=^(kSvٸ5m7wz]Y qS s;5 Ǧz/%8jMDس)SiAM&LL z3, 3xofА͠36U'\U)ximmu]n={6/ZEƌe]F4gժUA}}=^z)Hx+V>seѢE?0fժU<ܹ>wU|˗f;v,gqSNEk֭[Yx1۷o'Ÿ ocٲe<}444/r!w;wrwh"O,#NL& 9PJaS,*ć2q$`bPM~484-"hD)zx表K  3,v+te+@dG{UZ"|JA*ZÈ)PڸQ0a[;{!L)U9te"1CvBWzyn$g{Wce=1(i s']4f'{yQ5Ifά]]&ˏӿ66 \X*"y^vs90uToΆ hmmr mN Vva,[Kb&`C= N;4JPWW̙3?>_җ0aB2 S曙6m_WJcǎkᥗ^ Fihh JU[b1N;4]>5k'NdLP1n8Dcر\~崵1a„*r]wA^[vFqr*OF |`(QncNLe1 !ߋG~P>k - DYQ^xCa#_&(;03Bd\ ş3MFV @'`bڝOXk8Ph9$yɢ~|W[JɴHpL'6jDNC(P~__yˌR Wp9>7J?k@QOXgv pyNmQQ!0WbBZU$*`: 썈iP1xC_ IU*cVX5\CX}/>i2ydnX`rvZB^x!hݻw\.G>̙g͚5k(J1544ca6˖-#NWϱ򫴘 ;vя~8:ɓ'sqT7̣>G>o+J^&Ư PV3yd>rJ^xxjYr% ,j# H,Q<}_ T;CQS b:;-=_M'`eK<1)0E}Cm@w^)ob)f9]lGA'u~Q&fCc~%6sޡ+=E]bė) hɂ AڅQVuA8xHw@ 8 r 藂!h 2nҌjdi;Wo{S PZC4D0%5:ؐԱ `bGҦ{wR"azʳR?AWRgQֵ!T+ ɐ&ƾrK2}tb~^m%3o<-ZD8#` m!&L5sydYf"qwp2c <@>lL{}14\k_ۨqM&Ly}=T*ܹslܸd2YMi??8߸%G݆/jNO1qO:ޚ5̶AFY>!/o1t~)4˘l EAk-|gowИ}L5l o po<4(YR-0S)w 9$WfgL N= kam ]{0\K_hl7G&"MH\)6xamD "ʂ)f#4ڔȚ(kN Ɖ†ڃSq+CÐ<(> ,`|ֲl2$'tp^x1q@ 1ի ü۝yh>Fss3w?9˖-C)9waP(ıK]][laݺu̜9s=]vG>ϟ_WnhϠ@,K.eڴipWsqGWsm aKvoGBl:T\炭nix#lN'c}[4+Ro E 0k@88!Ё2㥍2G2@&6ØL*No,4Y4$ج&EjYJ9Ⱥo2d# R;xM/G x!Zm\IkX]vT0A@g Acy2 @@}+`̏+ >~A;hix ÓoiAQZ6 ('藑>`0HXk$-bҤI|`Νr6Uoo/s_~9---W5cqjkkٱcG8>|ӟo䪫b̘1|;y8x ::::ujuCCwis_Qk *Puy!D'rss300e˘?Z[?x VHj|6e^r2h Y""К*#ag)tn{˓[3l%Tcq^(CenHfRc!v%^yxhFg{SP]}RJJؽ{7W_}5r s%JU=?3,Yp8eYϪU0a[nj=xr9,XeY,]{:ӧNcc#?0;vSOeɄaXr%/P(̪U馛81 իWڵk8 LB,~gyD"y,_cDzsjNV ```_~zzzH&tuuvZRd29j*dYBkc= p-0ydϟ_m˳ݽU޷a[ U+). ]mG 'vĸ !mb5 BClDfؗIǿJ:܍!=IG8~7hİ^ic"Hd49'6|Xݻa.Ǝ >(IfP~Yn,toO3DO34H! rm= D:O)MzPj~l`㮗zgߘٿ&oƝ)0J 럷!\qCtL>ERR,[;I&J%,aH$,*_q^%<8ӟ;$ ?`6Td2l޼ն:l۶`0wC=R ۶n~ӟäid5 qZ_v=|;}R&L`ƍ\}Vi۶m'Zkjjj}}477|r~_c è*ϻKPؓoi[*iq0>^RSH1m!uR 9 JU*'51S`yݿ"٭Qgmǐ &}IM;VSxd8Ybܙ!#SVS(i,3F %!A^]| ONFN PeүJi=V5Y㎮;ns>qw;oW<aE 01 o~y eH=(1q+M[ж/"`aH_+/ѮoД#e9Y5Y߱S=G,G zs1+gư=W&B, 2F@o\Q5(M(U}CBQCΠľCcc#S*RR__댓ڿ{4M^h+UD .]%L&_GOJI]]]F"HH$RmJN)۽AR{imCkJ0\SIO-X㏝ZÁoJ{_zҐGT}lwά\2+gA h[OwW6T;R76x9W"WĎT0lFF;luM\!Cr%X*dRvbaH)5&"mǕB ! SfkmS=Wr\@p$J]5 \dC%F^:OiR(zW\YC؇ Wֺyma7eb̼ ךaT!rw̼y8q"'NuVT[ 틊k4._YW5I+MP&Z=NCSW6,( r۶O1&Ԇ{ K#(&P#MwQ'ֱ|GÈkeLA{'&7ZkȠ~o_#g]2nZ;kA'ҋ_ ̱G5y/KD){^ms5ddR>9+xd]9y+[+s9eL'&oWv8밯HF& kɥ\4%`,G)27 `e70mBֺuzGȵp8LP?s̡ʬڵe˖~5$/LJy}l!D`~_`@4c4![vKP g|M^7D>+҂5L g_~l.X7ok!/PT UvЃh=HCrQAAYtŶ{loY gyV^uɆxwǏ_6g%cz3kk3'Wnw]U?kvdI %@MZ "bEAUpыH^B={$ϙLBI0yΓ9~n _Zusұyr_}Ӈz/'mz_ۻF>c1'<1}xT:6̞2#n}ڂetCsхtM~N97?~!O6VT7#qãͯOMIq?Yhg g~?ua;57ǎeG~w^{?cܺ5SSGt3):{`k6:ۘ1ZGQ@PRBSƞX{7oerx|bzˈ[[Wr$~axUmYV0e vX,T5 fA2d.Z~ay^x̙_¬fb=\_PJu455͘1cSxbkK$%NwY~{.ku {4!E=:c%ϢQ;|u04Mo-J:$"'~:!cYX10 !ֳyY5֧>k?شQ-)?fniMT7U ֮r~p<(FyOzPvz㇟ڸz=~P ?|M.X-y` [{K?nU/^rņ}F6\۞Px¥^賆-f/|ó+o^$u6'! :wm~@_oI4& ᔃ<^P5''&f*Բ[61Ӟ57z),j];gFn%+F%:z)MZAُ ބޤ-V#W+#aƌl޼B֚bGA,[,Rs b=ϣ>D"-[Fkkk޲,86l@./IN>)%+W?GUٸq#}}}/)aTT*Q__Ϸ-J?ӳ'ܭۦT6"#Sc F^$Jb4Qڡp1G?ŕc}JoHI7JD3Q 0 L,w ںvZ@-W|O5ғUc܎@JdNNņr-acmFJ2!chꦚә(Uw_;]7ඏ۬/^.ƨ'n R$F9rc<2QEmeij0YVO~S)faH,Y?m+%֧&3ѱ|yĒuߐ Yz8e b8eGw~idonuiu7,7ʠ0\BP# Ъn*F^ 8W'ʭo~Uկ2|p,{\p!p]w;+RxLOX|IDYX\.o=">#@)ly<@p 'SO=⤓N"~7 =X}[6Cg9s&\pǏCqIJ)כ8{뮫q|_K6-\ ~;]i(j'3'VrzRj_hPT^%( 9ܺ2?0}$uT*N R5/4Z3$^G- (Rd{)sV.5.uo|ORgL}G^c䊖:F6ZS6w7qtbTceLB )mhzW=/cס~zOo>ы?(ġ9Nj0$Pimmeƌ2~xoGss3tK,q8qb?W!zRm5kB`L&cRj+5 G+Em$ *l8! 7)382r1YZp st'FQEN}aNF5R-]ihӚw PJCjr9uw%[VtWW?M>3Mݹ#>3֞c?;\N㇞А+ u$'$>s]I_״^-_>ma m n{aYfP %%pZs߯1ÿg./k:~٦yI7xm?elIR466rw3tP>h<Yhs'prl6UW]E[[G}4gy&AȓO>_W9&M1cưtR*|gĉڵk &Vauuu-emO*P =!4X$0 ԙ뱌wBN(A-9&SNN\PF  A#CI%LK~s|63=jٜoiHѓ>ˣꓓ= {k:nw?[z^ץm|*{s(yA:ӝu#_8|#SQMO<Ƈ:B_~͘f}c'/XѲȩFrMR_yY{]6I[zȤG<85/Gk5+skJIa껟ʮB'&l)YWz]oТ!0T ]OAo,$\\Xza^jZ|kPC ԧ>}:> gf„ h~;}ݗL&Ï~#N8;<..".R;0r _~9+V/3 W\qvK,O'|2_W5kp?u].R^x|C;ap2zh,YSU58=ZL&G>ºuXx1^x!k׮#`̙s=aH2_dʔ)<p,]ѣG VkiaH" L"w뺘v'vא:ூD, @Hs9ƣt@c Ճ֠¦1 pB;\UBвŨdGAқwy!p p=6yzɼC qu[<FDy>4kC"qlM%bXI'VuO61$"ΗwJATLDZ@lX] &F*k !lFTqR!\MZ]ILűM6H8Xz&lOVTۅIxRO,z\ Rq씍\ivT [7>ad [7}ƐzY&[@ $,]lj:;J-ց @˲fW!+lC,MMMb1>O#G~R<<̝;F=X}Q-[… q; )%ӧOCAԩSihh/gڴiwy!TD"SO=c=F:fժU455O.wygoK6%NƩi_-ZmXIl޼.?عR)B]]ׯOT*Q*8ꨣ L/^G 'yXD"ѿ0M@q_./ĉI$ {ڵW4ukvۦ8V}6@Y3?P+Z1x)~$}jisObtj +J~zzà|6qac&捭/ȤSd;j,aI(8M47{U[g1V\٪ALWU ^v\c 86/d\̢0X;۶Nz碧RoU"Fc}_̯~ L&mC===yJz{{G?㩯O䢋.{@v)%}}}}cĉ|{ߣ#< L& % G)ETwWCI'Ĝ9sd2twws9pgR*H<Üq|'J· EJ(`J`-O騛IJgk<ēj~JZi+HСB+0UVMN,̚i5Qp(His YjXq@3.1 s YŪ>_`/J Tǯ2KzS9pZ&!ײ~?$XX{:ZD˻8C }pX3m֛ɘRr|y 9e6EJ9'Je IFd`LNDW7 _җ8Az !, )edN}}=]wp^{-k׮娣ncӦM/SO=CqȐ!h;.wƍ|_fҤI f\p\~崷og$8 SNewò,b ̞=38N; p[رcYhDdZ_̿/x jjjMZ,P(={v<ŐRbskV {x9`o{Uq+853g ?%cFLB U\33Ɉz;$r# !߲G5+gA! -[XB]ǒg<<ox=ߞY BT2wL|n[Wb֫"cܐ~[j9p BBn b 0`Yw%z3nߧm{Bk.NJT_zU"f`֭b1LӤ' 60kf477W_M>gȐ!<W\qGcc#/XhRJ ?xu]if͚l7pRM6c=_Y'eiJxYlv9˲<,_dT7 i`,Çg}8edivVב22,6}|@8&i sW SX(6#_x-8&ac   %IC,3ޕkDiJLr9fϞMWWRr|mۇhxǜ9sHضRZV\˩/Ył pT*E.L&C"`͚5h\.s]wZZo"Tgg'm 3 Zk/^eY :vz ò,y:::Am۴y#Κ5kgܴq/^L; quЀR `6,Z+Wnڃay&Ll6ƍUtXUEV;uGh}'5gOp~L EЪMp2ic g&gRoҫE.;A+ [e2YˤbRTG@ 3wKiȗq'8I_љ[Qz ky!'.xCշJB'?o~lӉuYf3= k#kKn?C,M:40nrȩZskoxCkȕڼM m}AHxȄ5Ho*ODEuuu"*PQJQSSC,#L,UT*GS__OCCUV. \CCC8q$d0  D"D"iOn)lTYzvdvԐJd2T\I$@MM x0 y' SBG0d}6_W9묳&{\e^:z]L;&&*UUTpbb]J^5Y=ɫ1gOD_8{N_k>$S0rz9t9fU! 4Ppzs{`z?漦/!8k9pW[ϝro&ПO*y~IOI$i#o+‘~P =LpsUâ͌#>ux>32qSFܾŝ!W޷tܞ:||:g_ܼnw<饏,nmbl~ڂ-[rM8ux<,#.Knw0vd}zr֧?dyŽ%oRc;52 (Rk& 0hXU͛$b-80ex<,)%|lyA`Us]EJ9\2 thAߪcre+/iR=!i{{rJl Cؙ$ּUX }H<QYuC4P@('Wi<ǢFeDdWEz$щ0}̛1sX7^@VdTE Ѥ-BfG˄Be#LkZ@MoaۻOdFjпL9ԾrUf⣜,>!G~cV#jxxuR"@fK^b-\C3{\$m}G *_Y'Lٸ1CeͰ_m?wuP۱E}lm[ iT|h-hO]pO.Kg)w9@! @)GJ1De.X'wńc=uܰa>…0H.ITdnrcXek̄ݏJ0L5BJ7$ei#$#--KhӊGlĪH! ?PO/ |JE+GS _-3]5mZE~bNHokEF_󸆏JngP7Jig$Ү\i}ma[ѓ\2c<)R%?gH8 FsQܲccJ30 6ovzJ%O/ncS" @90K r5k ,"vŠsbzx"g?kT*G>.2L&[+ !rtAL<ÇN2enV:::0 I&/~ x'PJq2m4y{MF1uֺ߆bzyc*o{MKm`{H6mk2X&IHM():$1 °P=y%~0:#!Ph| @F%>+$6*IRޛ%inn*Ҏz maFTZ fb Qp-/OY0]0(l <}} 7C > {Y, Hx4Ԝ8i[5)iU9@ˮ:ےo랗=zCGMha=궧\8ʺ}F3ex2m'|9~@ؐC&}UW<வu)^_^ln/rݣ[rwGgvy23cN`p*3K>}<.2]A/!uuuviw^}_r! ,?!Ǐ\. J)I^/N"'lu[vM=aSc,@<4|2GdO#n}%gu>w١RHyӟXԲ[>_r&Ek *n'^o6޸] sVvsS큩O??, <5&wY܎grGmԖ{|fErzcifB>t \Xm}';޵kozDu=bYZ0!u2\ H)}o=)4f"܌uq]O?}O˨Q=z4/8q"G)AeY~tuu>3gdڴi_\.3qDƍ78; Eo!X]ץjPgW0| B2sM!nQ adVn1B$D RF`-5e)( (x>bK;"m%!DXe`(SgPL+d\) C8B!Q)o[IE:N?p,bHe )"5qq%0 MHHLIB0Ą0))L_IM䉺>lD0[v/iD= 8);{:!^J<h,1bO;fh"_yr^GzW]u]?PXdyЙ[^HE:lR`\{8&f"N`g?B }Kǻs[JEW!7<)d&=غtoıP|8|믿{ ˲8cXYgž˼y󨫫{?w0 rbթ0 GVU/4X3AZAi[huIP2 ԺV,S$bhSPiLM KȣJ@c=wUR_ՙv'ݐHIh._]Su. _/WB]!P8"e iK cli0錦鏤Sk؋X,FpLZw }>e :Fs\JfHaEvK}/a!+Cr zvcVa\η>qH<Zp4eW!Iw҅W t5QxMb[[[Jq2&[E/rcބΈ6%Jd~5mJkOO !f+5 ܆_tv"Ծ{o&,Z#8[n[#cn~MT¶m vƍnP(yׯOgJ%0d֭_.2?|ƍG}}=7tS?[~zN:$ƏOkk+adclY}}}qAG" >R)zR^~KzWݷA\ ۾xC$|n;v+$)Le Q( Y?{p:GwtMŎ=2sVX2];@^8s?ԘZZh C!y?:~& R H_|i!tL5U>Pc"% a} 6ŽUa43L/> 2I_ wМj>}}:}ׂ#Ew|RKO/EH:CNs4Ŷg qP./Ɠ݃kW*,MBcR&R 4z0UJno:X[n.qh>FT㨣bذayE87oOߺgᤓN >,Xd2I:& C?? .D"͛׿E]]2oIOOm=|ӟfҥ̝;>OpB-ZDSSgu=VzKo^Z1 /U֪VEwND*XA,RKLxͮ^7BnP3c8(@KANnEDRF7gvZY֭偖φnkRC:G:DaF,R"GʰE$$h:(aJY 4m{*Rل* zB:dt !"d{?E=P(rQw 8$4OtuCZ|@&ޡ#{~Hmytp}$K369GX<ٜcM?8k>)T*uI,祔Z*յL&ikkK.3 _W,l9RضM[[i#`6uuuZsǏGJɢEMD$[l+0|{.f͚3gdմ*iغu+r)%SNeӦMeLdc=)a8uUvu3B':yv& vJW!x#]p)erCc ˭lIdԤK$M۳R2cV*%z/ N]^T |4>; %#ע#('N.q T 9ha~dd0g9p #D`R)5>fh+m&F&T6.QZb %vlh.ddaF.-Zg(c=!3y9H@NJbyeRnX-s͔"ev;Ewlmmݥkll/g͚F 8PJ``Yb"0 7郪Nr~IReJRNHkiAT*_RۥRd2ٟX{͑RH$[r9֌93g2k֬r8C,# C BTr98U%B0Z?> 8i~﷦i"w5n/u𿉍zQLw/zd 'sIoʠ'(@R6pHL7ˆ: ltc4ؕ4,pKLm5^CV\ Ȃ%0f$4g0$p: 2'5KP&[ Fe/bL R9p̈ ]Н @cMF9[Kyx(?:~)-BfS Hm`P*Lի, q,tAl$xA8k ш8u W3PHM4ˆ:0{}&/EkmJ[a:hEܛu0:!E uA0+¸i0ڀ{B: JP@t 3 ?_5Dm,_|8+cpnSDjuooHi{Mq{&wl ]30XwHVO8]`mذkAX;E4 0 \*.`/ʤT*N$[}}}u{,ZnT@dPR~P߫j$~3ى8ەuSTg{:~ɲf3զZJ%ϯ0>#|04Y6#nm*]qPYdФVE*[+x<ʵ36~Au~T~K7ELP`ӅOE,5 +QĬZjςR@_C:ʏUUBw}a:¾c쟓WZMkt5SIpb}h5=H|cccnϣ;YSiʤ }j &`c i5pɭk~%afhe!?+k;~|(O@+R[=5h;u;lY ϼF{֌ OP6,6kfuuu7{n WB;j9[JyE.dLe^w!mg dboḢĴiӨGJ?[*M$h>i1E&N9~N'®Jt %G<`\CaiA |645ifrϾ{BDt$PadCN ] ]PR} WB zYZ>]{u_ȫym%;r|k 4y8r tTl,vXz'eb/26(%va2zVo~֩p?"/ \_BϚ ~ߡ}PWI v1I lslTm#;KI_RpS ?{`#L[!Ĺ@<h!Zkm8orܹc "/7uTG0^}QFQX,߬B%MYGfțĭƓq[qTH&M:Cc"uD`ʗP!:o!P jM F QK pX[}h^{N [<a`AבgT~Vӕ%>%mYۨ 0HPYX ѡN BHw3shwlV 9J}?? ?y 6o(Y)B X-GeXkK~Eq;-+o:ƍN[_7oh i[>1rW"4 A;G<5GJyRSi4ͥUض}qwwqƍwa(`޼y0ܷfoZbIy{t u\ g|ߓhGL֩+5WmJ= wY1u H@e{S#0DCЀF&j lQI 5J QMFi"Hl @tԯ<4| A^*z4th&DH<8b ,+-DkI62 yE! dHbf)Xc@iO3< 6Y!"j}SGk,Erpm{ o}d:p:y5S4!s>K@"h0p8BwG}`d]A|0 #>g̘1J%/_Ngg'xRt}[ 1ǛS[[{Ɍ3b֭cڵH)R N?/uWp#ĚFd E&PL) !J!Z.&SPsFv`%IT*^Հ(M!Ҍ!'55P ob)@T׵̋L+5OY$ 8 H LD=ZӪ4uJ:d#N@! V}Щ*NAZxlmnfD9\$4ق5A$# +Q[_W ZȖbQI (T)\?uruR<}]  .bSbtXo\uZkgCBIG_  ppX;URy}}}?| YJ)8r?)myCkM,z~jRRqZk eyEo8MS0giCFTY&K94HIW $Upq.VCgg)bt9KL(VNĉw۲87nE>Œ˗/dҥ*]bR)L$oZX,^9xl7nibY555JJa8׎5$]LyTa^d d*% C B6e#$!m0,+we@1I42&4iz@4~id xIIӍ0*s "H`U pʦ /" ^wilӟ ЪT~ ҤErԌԚ1hMBDi:a\Qq"P`kKpV|dyLTfR iRRdNV%cLFh2AD ac2ӑl8>2@{Q F]n_,q i'mMpfYgPQ#" >^ߣV,W`cCy8kTkK7^a:Ʊjk{0 bֶ~/2dnJ>լ}RJ ǛXkAeYqT? 0f&ÇeYRBkA3S&pA`.Jy&1 -4f,ͦFVI"=7UT Ö-UWxlq}6t0ɱ0+k)Ka"$0ј ݨ:d5UJ~X_ HK8szZ~[BRLvS/Bddt4!#RO |g[2ɪ 11&L1%@˜ҁd/UVB:kfx&\ S"M,}o"a0*z0 c ; fodB84tFޓ l af!’vSP|usEiۃ9{j/OEIمBq]u%a1:]xQ$]FX +'L_, syh!~j/l#gSt` Z+wd:%$V_'e3vGT >|ߎ1&3*zWeG$s^ZJ|O_pfӯUkym^- ySg L/l0U"A!p)G^1ihDs1# )R,y=0Oc"IRhJ:QlІAkNd;n_n3G+-d(ygH(s!jۦL٣"7@mE!F-#p$#f-0+V4ȚB) Y3]ADHGUۀ]XG~1q%>`R&K,`+II/6h::{1j$Q.&?}z)Y.N;ߞx,0A@ ˻\9'%x !1݊Wݬ?|Sɿ.XJZ&]?Oijjq:;;qlWXT]oJ%&O|IZ ٰaCdOXBk=TA&yW^ye˃6M{{g S'[cDeHE3Bx:3e9.nh+$ n|[Et]^LPB F!~-%v#)A}Fb6*xfmBW‡'2\HgK_4vBEMTLZqlW JC ץNW & EgP1DA}-b w{P =: T<р#,=h`>jD Y8|=7櫛%fq:[~E}sQ![A֎G-V\мURf,VEo`я~G֓Nٸq8=IrO۶>HdRba|u}' Z7F(.M&w755ΦM( e0<}m7aHmm+#Cٙa"2=feGsWeH:]0DzljPl+6aa 88ˮ>GkA#%ݦ'+XCkBbx}M5lt3+V-/(GBg_ʢ֝@L-_X|zcF!&IB^⣜'tww4͹uuuwK),˺ӲK\ץk @c\]H!׵;- j*E#MD؇>d<5+wdx :G0 r LMoӫ%Q4HL ,!eZsM,d@+ofuJm }+ 0+ : RO+g#fο4WB.%O"̶AD\3W;_z,"]R_7 r])/{.555Mk֬୷8 6kE彅% z{{q]#FJXt)J)ߌ}iR*, )%ea6!x0fLk&C@_mb) 4RJc6} 02uIP𷡴#$>GKh<1DsG@;s֗ hI>aW|TA,%-;BKV/Oy<JT͛@XiX4(*kRjXt۹뮻ذaRJ2}}}I&A@_DvPsPI0Ig#\y,UQO H{)aE4/!q1!GWIE"4axS,vyv# &`$" D௵\^ [:YۑlM(L {XYqz#Q`"}@@gr l#=1^&Fkڕisl(8:TK 8Y-P "WuV @uf^#γnҧNAj1BּXƘ+H*%anLS/Gፔ4 /1>\)];[bM%mX;qEV6#ZeHSYjHtߨlD7AgGt} '|ynP 4)H) JCR>ٺu+P.BZtܫ'xRD"8amض=V)uB>'Jo(u7M1o~0te{ FHXtjN/jQa +/쑮ϰ"YnO(O@gt.ÁdtȩZKS,oZRڝxr̮ p]0 GbcAlbm6rD"(B\QVJe !D 8YkT%G\.Gww7a" !f(waZkWH)\׽{S˲^: KChaxy-3b4}8fr)>|\kxNRP ^Q]AKTE_Tv%ViENeʖ5R} sqp-{ՈI֣ T_A+T+5izx$ګxU(P@[S&ū"lZϗޯ*2MGP^ BT?Ĝ(<ˀ`b! \1Wem  ]P2J|Zi+ J"`dBm;Xw7_qFrI(ٲ  (i'\}Fҝj2X1nL-]Ja ,dB#˯s&`tFc`1vطr&|Dz3nlP`Yr9dQIQ)yh1 WB.t{b+p0}FɑG7\5IJy*87%W#m0 6X񦦦Z[Xli_ƫ+0AVӀlRBp6VJmʏ;E "&0SokJIYb2ئRj[2^ͽn0F`,0Qi$+,[#;0 4 5I6ҖK@ ʬS:TaBt ؠ`]k*V[qq*q6Jo+A"Nj׸fr!X)'kACj8р f_JHw轔 Se OY,#LKوԊي۴Ⲳ6 o^9W$sRTT9뮻nEOO/ַK)$\U}+aBK /HhEګ\hjOiY6d4ab3tIaMX3Hrli!iz0ڈ*QYDž~/'ÿknxz*,X#p`P.|dVh*4˴`>NmQ\>@m[z@-J< ,4->`ME 4CkhmB̎`{k݀Px <0"QH;GcUȥd ~.]@M{hE<fY)5W`lOd `qDžbr 8M$5MH)'"\$[Q' 1H$ |6lVL ˅\%B)!Ec[p`SLj#VN8񔶶'}}}WO$89Wq pR0 'VA# Cb?MxTs!?ss-))Zh ߭}Gֱnm{RZ0+m%!* e"dCUEmع$>X6 Uhl 9Gkj&bJ2/^_ Je|+2KK'"j3A8B8D1RHj+ӑ;GUzw\N@>(:2|azgK m'L0|[;.WL%0j&YvV BHuF20P`_B(' fHj%<.52k.6sW!Ed e <*cz>w8A ,T=ݐ`44PgYYCa,&CXhno)`pYU#`BJR4>Y,tu@  >+ |^CaOSpXVe zbLB$K)UŶmI{r)a~x(84 BJaho*!Sa/ (|N)uwAMJSet1$Hۢ\wܡ,((PcE*PÉ"${ p_2Ik6@YZ{΀#Uȱ^!Qh B4RmY}3*4$dEw<)4,╷oJ= Jexq#WYRX- &0b d\gD`F̵$ه/3B6k!|"|C.n.0f?Zj֜%6–Malї%L c)z` `0qPkLq4&P6@䑶Z -/$+*Pb}HWaT8Gi>*Hwqe wըxJK)KYBPkeYh b7n +L]0RhR<{R"=eՕ5kֽe"^\Jy{ Eq.S.' K YgM.m)HrP44725%CY&KBBʩ0mc^*bn@ Zʬ=n6k,N`a qN+z02#CjҐ%d+~>cHqwa#~Xa/6[t֒/FixxX.JE_Ɏ)/OUυ4ت )NCLP KpD\K`YQv(#l "*wo ULGMlRr9MFMM z+8i> Hm68hRji9uf}jqnF˵ZaIR[[[5 : }3ql $@%HRD1Ȁri E !H#yJeE4\wXo2l 2` !ӊ6_iX@KHDޤE1Dꝴ>&&ROGQLZ'` X@t<倲(vƣ>#zlwiM&g5 ׊y퉌bfE'fͳXo L3zrLz&-~Xi0+z*(5+pGh&~U#RSJ 87pxJWO8vkAfxЗtz 0Mp AqbR  `\w`Z AJVva?SJ}֟Z7 !>*۶M]]J~-90h*%@k}a"c>0T˂JYRʦX,F,Yk7jfܸqWJ5AFߠBuaMZPbt CK`uAT.PSCƎt4n1.|Q(4PFKda|)S_+. N $ӃCTlrւ` 5.?&AKVBVܔشa;~>)7 $F 2 i2EZuZ[^#IVWb |V‡7^i.$`Ww! !Kc>^NYZp'~ޱ"IKؠ96V[ۀP:~LjRER%'xV ^9q!o4Fr&>+BPcB .ud @AnudF;(d=t*X <L8(hCМ'h"[-a"A58^Z*P 2ŲJҝIBi5t+VM"@)!d?W+W5By 󼖪ѫ뺄aeYǕRh1cMx^ (%A"ad,),cZ7.s ^K;<+zMġ~XT2XJҲ0Zr:^@5f*-w"Dh6nW 0ZC^@؎zaimNؤE:C^iZbC'W吮h~j%NUȌz{_($+ܝ4 G4aZ3FiI-h+۔ J(+U1gh{< xQil[3BG)G!鮰pE |T`֎ ȺJBCSc:fi@<_fO&n(i l,~_q/nN֒ 89d̳$iZ0FJ PᎬ8q..2)k"W]]]w}<=== j œC1yo[k?d8_)qgf=O:Iy _s~ m \#. T*7>4+y쳷rգXeشip{L8mn~0y[}w}4Z~wSZj˨ !nE.E_].Ȁ~Ǜ*PY;{뚒M G)s^ FVz֛kyQ ܲ'O[{8.OqcsMXŢ\s>kYu(0]>hk!?WO1{|܉ۙy춰 Ev3I(ޖ_{Mw_6tl6TmJfժTg?;1ug>3{wQR.Gnkg2GI~RxZuTBGg<xi*̥A!u#r{W+|SQ4hrq D9Vrӎ]>oSi4e8pUvBf'߂Vu )_&a~Y!FT`6VeEƥ^i&im|ãMO9xԟey6JJgY°Y(ݚd ȝBVZI´s<9av7 Gerj`- gnXzY###JIlry:xoo/b]v>ݷX{>{ffD0 ,c̜T*ss .se:,nN9^Nr?}G" y?GrB(n:r+O|~.׺T4ҷr=h+_^|_Ҫ$-A өQ)n!ײQB8$2K:F->w^q nyvZ} #L6LlOބ6e7VU|U~ R8/{I[eZg׌}?Yrlkv`,y͟6Q ᭚V2`7 DƦ} -Cc38~Z#|C=}VFe =ii%k-206^7 ekE&YGgqyBiEFV$;}ŠPs}bR#@ V ha&̻|D䃌1{ CxrwEk[(W&V]4NWҾv>iqAh" PE ?"r!h؉Cjm`"(h |菱ģPW) W;kR*r `[ʹWV K%5ÐA΀M . V l^䓔 #6=$p65*ԬCiM%8!Ƙ D]|K^UU?("mԮT*8:^i! >~[ֻ6lذK/͉$WA~|===noB7|rʕojZ9sDQ~UP>a)jlPB19^j;33ͳXB30W·VwwR%˒ c#|lI,,F%eO6S 0hGv~?׷:{ZU+u|*^F9*   L~LlvR}t }E-{X]B]2BZyckcoDfA'](K}*cߓ;KIG}Ick%<Dž;m -&1ɇزb9z R\! nd +XGy?Aȍ=p߽iUSbON#-2O~l5\RwZk_j~j1󘘘`||K.Q5[E5ڟuν(q$Ƕ9bZV]]]y(;J{y1=k[$v#^a1֯Ram7ؾm*8 0n3=r?яO{QJ2M#a6?fJ!LpFuRPty ^ גxU`8agF8)Axӹta:O2et>-if #^z ߗ $#˶\/KccV6b.̮qB"i}*ݷq9c`-ysDos/ wr/$>|x|>mV,< nZ/^R,_$ɚvShuz| ^'#֣MMMqWPV)(c~RXwWWZCj/;vx +$֐'[.|1ׄ=k(xvs<{`ԹyCb+V ݻw%֟Ee8S}?.4F~ e;;I֣NY a/cVaSeUh]2FO gT511,_}K]5b,MVh^ΖZ&BPxp8\gM`>nn x&Q*mAU_r!Y0M;jEI.mnj@S^!'kjQ(n8+z0^cA9%z9g3u_z#Lv-͟RK]){rO!"De"<[kq"}>199ɶmXr%Wf߾}S\s/T*WHcq;/!cN{b9x^w:ϽX,c/˩SIEU}s7UuCTBU "=yl)S%>mUTtI$+5Ɔ*q.βPkr`mLBA6&^w᱑,ιf|KcHVD%N)D#IY} ]\_v&i y\E͕vm9K1#PS( d:i?jF xI_t-fHɼ.(TM/*0x4e:Kk%NzTxKoab,7vZũ{)ӓ'¿f_ɑzdzރ|:_檦N 44eԕj0{鳰6\9wBq3UCG(9-ǩˎh"Z# ʟs_Aס{Km ^ ^\3"Ge`- bv眻 Ͽ%I?Ld1fg۷/'zzzY9Ѯ);U91AH^{8[U V+>ܱ9h2Ýd${w۫ n}_]&lBL8=*ﳖ7JjY;k婲j|)\m]&U&$:j{UM^_aĽ^١FvE^9o0bK:@ל>;fkP %)938)[oRaf 6+ao4Q>kHr\beƖ/ ;bϧNמӓ;TPa,8k\לIZ[փMZn])T~&(:s0k7`,۝Bq`k~w>óR/9PM٩&?ݽb|||1f: cLEW*8#km TEdRՉ\.VxrppUsuNp>{~wGQ|oW(*ȩ$p<_Pr9xsa̡9&)LrZӍ3zhyKʡgpxw6*S`ǎn[A~m?\uF)_/!+|)0¸))bC]SBPX:(W+슯2K+~Ilʴ.1|3XE?Mݵ+vsqLuu@ˆ[$)}+U(opRl#6TT.ٸNBO>*uT93<7:_\WSρlI*sQh bj 'BYp`r}пdG}p#_Y>>|k13.dS[RARMQALH(,XX?w|Þ罹lZT:X$:ρUՏ_Fs 7!Ba2I1 !݋)k-EFGGdbbZQ1fbJDlM!U)z{:Gfkؤ@l/17ӈ3<ȃCU +$N#C2<cA!ryaUSiD cN1W[#]W9kY]i^xFF299# 9&fV_$vѹ0lEnG W/8D}So̓\@hXh?:HC?I>x֤lYwYF_Jq5.8^I׋Vꓒh5>(>3Tr_޼;yiɿYDЍ"ogR{NRFueDj\p:$U: y!7 ~,8@sk-5=~WtΙJ ^KUMDSXU) s -w-k-fK#Q؊!Sh6 ;AWg8JU m?l۶m=[ c,pEexfZ.p-:;~R+U ~yyMz鴔WMȋ=᝽_~KzMoo|WڹvJtwC[4-:8>6 lXI̯u\0ĕh<5dł0pGyc*NVYT((ՠwU }-BYvbRiea`Svjڔ=1)Z+DU%>\8 oSǻL -X0NKlZ:Ȅz5](g d SyX@QtIC @C«jʈ{,7uڮ[: Ԓl0aȾF2<"t]!V]Z~9TDj2greO>A RwV Q0qr,% P(>j%UVq}=a/Yso{gS0Os(}3jP7TU8@K6@ ҆N#< " ׀_~ىRPe@S٤ZJz'<^{5Zm_3Cq(ZZ%aXc1^`zRqh&®+ٻ2>F!<8 +PIGee X1oȋW[k_y!{Iܢ7<L0 mk:G< 躀sO.m66t/a8#;ngl7g>7}xEbHhّi[t$aօ&qudm"a [<ԪyFcr᷄aI.c#I/zQ.chC9OSV<>xzWgߵ%GO=mgW_)$X L)4lEMyuy>a\`oUJ*9qTxYs5ԗ +N)&KM ߸*5(v-TA[^íޮˑV O@޴Eok9p5="$I]#"/>8-%Zk/_Hj:n&"~WѥNXig!i:U]j6-zsN'vADn+"_n\,?JVY {; cf9=`2ЬٲT;mBR#^m!ʪL C- =C:QSs9^[#,)\QfC ӬY ?BvQIlCwYd$%ΖT;'KҀdtwh0IwUC8Z{1x^ d)=o%5҃R"jM2n7+CB?w=e^tx{bnÃi J$ς& ڍeiR1/`׋2 ,1W5mMK <ل1|2_4U44f!W.I q+1BUP4*PQ6wpL/v\N=<UURNMs>㓖w9TF< yhXQ5(*IKR5`/&|n_ȓuDyQ}zP^p:{Ê\H0Xm-ŝTf߹Hxy [WC+^N-^DbĐ45gy,2Z2}}ι"2,"kU4&}:AsA6ڢD$cb`VU'DdRD8޻zfԡ0 #'rg#A~XgmA@g'NAb9vJ>uyʥ|/@t({s _ 3@楍mӟcEjJ ^U57nݺ+\_S*pqc%W#(Umz[L3cW_u.8a/M<;YBbyW#|C Vˮc~[\.ozTCb2S=c( 8+S`܁5-P`K\j4R["m/ p!n/|(O"6j#Fh.aHWv_)NrΥqw/[Cp&3CO[jN!aʩgʣXe'n8OnU'f IjDDҴƘZAsnΚ PgqbVU23vЌǵ{6fK׳}2@rn j4t5 P+p64 (QՊ#~dD acBR[2QD_ >o9`8Ө܍]4%71ixnkDJ.t\P#0ݕOkIJ&HvHs=JȾgs%,Mx#J,ͼ;C&x.`ZWPT>fx8{"UBXqOC3 xìDwPnGȮ^tu$^Wx=i!>҇23j|P-xJE);~F$s`=!PAg{}$txkY#nQ\+TЂRjtVa.uJ Ҕ6k+\g'?Q삁,ޘ󞵗:w0:w -] όbX[j֝ VxG~\ex@ؖ icR>pb )r Je?rتc+I牦;MxFPRE_9&nh&Vv]Ն[r*-K.8mY`YyJ̺-Ss(V`:^ƈeȣ$7hVI1'| PI}I4aʉdH 03`v$ͧw5-'`E-t?[׼C^d3TZHO6$eiKnyZX'6=A4### ~n}.w,FU `i9~9Lߚ{_}t R0Ua ւyCC]rU R,`Z9tNz֝>Λprّ+@+Eprl H`6)tŇsy70$BS̕I6uLę`>u(uXF$W'+ȬH2D)#'\ӂrqטl78Ej2Q t]ξ+q0cAxtG#ՙ}Pr2:}QX,k.ns̊+똘89t/~y3([l.[UOY6a㕴^ ?Cz<ޕ6V;u`CڼU 0{i?>J}Nk<=Hu>vWа/j<f4U ej4ӭ:22t %pQ qqwN&ӃE\<ԛ-Pd?⧟sjXx)kBq$NI:~%%(\ax[pjxm3~NΝunc(t<^M-3v@ ӣ);%! 00pF…>^8a(aUS|$BO6>E|)k:y bO$tUiy 5nB iȖrL/Vc%U(|&JY.\XOj = :6mXk֬ADxY~=Ql6g>Ç>!suY P.y{CT"qg,9|mѭohH'ZUv8$dhJ-=hlJ@=>pg+Hm!!Z0{Z 7 &Ml,j:ЬXϺu>mMIr"*5}۸+cjrRaVWx3"K$P>N'LPc@ -,2}mV6&LW< ƫp.8-"q2-|8g\L.fǯ1wv]Am]GIf+ߕdrLpz-" I+جyZUʡbWՀ z59.P ߂U3}?xLr2{J$ VҞYˠj`s0 \.ϵ~ahh0 1ưuֹƗ_~9۶m5y qi&.zzzbvv$T-ǣ:V]9k4XRz|ECY=2WYMub!l'V廵TYTzA6QD:fLi tm[_Z? ;L E A>W#BR_c-oi(iR?=gppYbW{e_sWv9awoox;-BJq6!41T_xʰI$ uhB\oj'+GaE p8=f`9URˢa^Ckbql&ߝc^MU-HMO ̓7 IK>nX ejpulo!j0t^:"ImA*K;Lj<7/GwwUx_]mgc2c#kmԃ'k۔묳bѻo zRm8P`r 4g`SfT {z6ᾕd|j fV@KrYo_٩eZr w-B__=== f(8 ׉WIc+;𷙜HLkתo1 Ch4 ̼PY e ~qq\3II@zg al`Vg/5A GF8\) ]iO.J C#G)}JV˟<*]TEN}!u'|Jv,ɇ8핖MK8-QU*o q8I} 0y'=;ȳ5frJ yrJ/w5}fx^{ {6ar+}zC ԝB4 q(6p{Ս}Ώ%c=&߷dƊv\-XSn BHA qʂLJZ>u42 >yUw~G>7]ɜo! ~[(OCo!qbdfπ¦ Ǔ;r&b`-ǓĦȜ3糵{nߏ1bH?r9p$ fs">pV~[!,ipQ@{iPo[hY.Sk6(nY~7[R' yoaEE0[sӝ }gXNsңPXkݪUyy[71"(=>+Ocޑ5ý"bȂJvS)j/I'x5`~/`$|Kyb1@.BEeyXj0^,*B p^n@Ԣi*gi~] Io ó0aȎ-w2[ߩB.-G.(Ϥ-j>\fh{3M)YhH0XXis1c \nLZell!PU RDV#yLpA0gāCvxAVtTǨb uk@<)VyC\=AsCg Oa6 *(/]BkT|Y]g?λk98ژk.]5'J.AsF) b 5鄖7D+wdS z(l@%@NltZM-3U˱ :7i_ \V4cccf cj;Jl $Y>ANoxMj$%kG%;Hu\B RrɉمژB V "E(J7 TlXGei"лF<$70)U|[_Pgy1{9KNYtf !ޮY9y\thg`lm-:10:FSFu#pk˗<=‘)eR31&1yO:\?81{87p0dܙJ=՘o+КJ惧Wo6ͻӝ @sCs˱G& RU:;wdJ%h6/`xN4o2ՋU.$LQ;>i*\{(/J 7`*3!WikhղP" .}!ICi$ Vclq.]rt= !Q]G=&㘁R} [I-ZEա~l_ڢiapίUh`ř0RӺcDXa (S@i}MN2MҔ\5׎G]]` 9K_ ~ɕr8(]ear9ݻajj gB1cc\1QW{x8gD$MIS@X zGo K=$LBo7j XE?;lebl$LB|H) (Ys^m ?sBϿzrhl.^?WHS4J@WE鮄dy\aƦZ=`;;"xx.WdpqriA-ZH%{|.,sqU"څkF^f2mbvLw+CqL1toГE/*pZYWBk9nV1 9Rc FqJͣ2]]]>jk-]]]?R9/Oq\ )8t` 3ļbA[NJb8 %_01L6"MrQ 9ˍ^˝ڂǬ8Yfb>ѐ]Hը5k`h5U1)'rWӡ:ی-tqD I~ZT d +40Ð`ǁcLJUx(fѩ!{k9+HO( s[m! C.8ps}kT Ľ nrN@l)aLx2IV%)л!]|l8lj pV秆|XY5.5E*Xo1Gw\?>z+bjC^#߇f i̠E rFjx E$JR\!0Awv_cl.5Fkf4P^}qN$dA[|rgx;̎K, (<\[쇙Bwn@/T:B\$#%f8 3TyI- T7 5\;/d!$6`P.؋⩂hӔ㉨D שry;+S=EZ`K,]:z YOFޠxVjnkAZ|rdu X,U nMWEfbK= uk9T+{GA=ol0g\>O^N6ƥ0,2ZC)JaHVc||{) ^$STy!zIrfvvn<3ΘjZsOFX Z?s7kZ@ X\CjMmbC6sLRWZCtA؜- ҹMxÚ^-xUP%I-f%< 0%W.rY:Pü^wj!PeIA9Uڥ;@T)P"f ~|?#Si^$^:j: 0|z#Z~hlg#`h 4%0d,Aէ*Ŭ' NV(^4zINR%j3nˎCj8Y'Ƨ/RqVx"~BNCid]03&sB1c `c:+9~º9NgZnyKs~n=EuQA\M\c=8ˑ%9Qw1|b`L8IBPxF]c 6M‰Y' SL iJNxNƄE* YczF?L~@05K1&'+T/Ž<'fa^Z(˱ |'iFGGٴi"BXDU֞X-q ArWO'\jF0qUfMkn&/{†9 B y+`Tyڄ~xӫtc;Jy]֪q ׶ۖ\7@z[ŨrKCЌ}SCιϋ`Vڔl[D&c[dl o۸GsEhX1>-yO5WZ#W@>eMb"Pڜͷ_ ZmДFATǘ{;XXXq*-hZV"ϓi6PDIf>{okpS*yO @l^qQ_ ꙶ_ӮR_ja؅ՃJ*lϧ ;NOiyN.yVaV({Akxy.>{|7k,[^9nz%ut:aS eu"PB0kդ/(5 =Ǟ~=p5eі) 8Y%x0Y@$P[BF1_~%[B5JWF}߱()wPq b1L`3| 8i~=P(7iyIKO]j`&m[%Y&Е*"L0#g<է˽}F/}կ܂]N!.8E#0$IFGGs9 8O17|:)g\螴C@!0* [1I숢yr ]ԿpCU\_(߲Tq`Ɲ/Z0EVK*K>~aL˚#SpNJ &~7}TVOo+TDZyִ1/N8j+D-m NfhJMNlW:XRR)%҄"fl Xyjj*|7B˜ejB~py' <\.OkyYax3a7  : ;l0u8(oD ܯ҈ #aJVR ux@F*T12 ؋zUc A#b%8^Dmwz4Hf=l{&rp?C1>|+I'FWe0Tzi B}E\U^\Z$'yphGCY+MVZpG. f5"Bc#(RvQ Vt@wa`!\H*_p ]pZ%Y-:`gN0{FbG^!j 4S}[|BVڐ4%'vK+!>ɾ"5Lp|Izgs.`, Pܟq$1B#U$2NSgHO *WNDjSNC1'mKa 5 ^u}|'`[8dN Ɩ/NSˑrB P+"M;6UX3 5[e|~-Ljr;wS{. NP L mˠ߇ə1j*K Uқ=Y9ɓ kXm!$(z\l: }`%,/CLfr؎݄pdL,CDL| D_1]xie|E"Fm# ̑W1)rI2PGÀ@d63eD@ Fu>'}E͝b0v%HI -6iE0x `l}\N4ƠچĄä-wpDžɚj?)#PKVɵ2mF1öx <8\gU,Yd*ճ{{{GF\뷉=H:־Piza_ɞWӌ/F*DZ8m@S9IQ{f6&> ?gIF$x~`Jػ/- u~7l#o>?ev#LY?}ߧg3p$Ûh^3am涰uU^T)R-b!@%6N"60I$ߗ|RpEV%hLpԬis `$9(iY(J /~O(.2W&CҌD/)- ̀ C_vBvXw|=>XƦҭT!MtTvU* gbg1ዙQa0EOd b wAl/B{1ܽ +c I "CιKUBBܰZ&DdTUoDd\.:jV+"~jfH݂M|w_+_aU+~Z8ns6 TAR3&p cO`G[92<"|㧮Ao7S~""2Zs8~n$.WՍ@lyι"o_RJ$i3]Z-j&S|cp>aRpQTXvmT*޽{}\>sz=q] l~iZV1D9jIM.=BwG29Wݔ)pie#&0 cʂ3 Sɝ9c@#ZO,9k$Av!i1OB w"f%TSXi8i e)uuEmZ픴sP(hк$R !Xk˻i]{^Pw0d3)"3Ho2x9 } a"{AgXn$?v}LM$8354x? N~+s/Hd;ES|0 rZɞtUU8}1TUwCqײb T]]]=DJ0ܞ,"yJ:"We 8}4fN{ ^A@𔖧Y8"/8 :-MܫUCߧ^{9IQ\O2x`=%miZQ9wqӞ]/"*߯;sA\.9#6Ț{} 022B٤l1Z6l_*R f9{zz=|j}?QT^455K$ICD,ϧ>)5000R՚V1_x>uApR0::JP`ff7R.y^_ȫso}9U|'=;oXMtaK;:G2ā?`wsJSvZ/=+eh1 -8X6Q+:w"H`u].+;LUw4'6]m(QmD$g_iNsx <zL.̷sܭJᄂQJYj#©žk,#j %CȢ I+5>ʈPŹx!4+?/Y1ŊߏT;` n_q lAw ˀ >ʱM`(.3Q3ff3`^HWl ~N ~"c[K;w\?00 Uyc\;=\twm"rsnj6dkZH㪝H~7EZmj9az-ιOW3T=h#{f:UmrIa޼f͚[k%I2'V8ðZ,?h4>W,j~'1?-"wrsg <j!&fanza_"/>6`g޿ (p&N Ƙ}R>A055ymP/r] lz3:p'ulRD&4]*Kn;+V| syQ1==l\.Akŭ[w77nf9{2ž9}>6TiVOs);[o,jlvD9%Bk),` <$QoGZA8bb+W.Ro!Aq뫣dW\Uml&/)X@̕Ap&'OXo%M+_[L3kӓ:cØR]ji ~?]~ VrmZ;0\X7P:$ |7}cl"WDG]`WH\0C8G<^Gd9%𮏱aP7%@nR,~n;D}g_ZX{U$y 㮮qR.tUv:lZfS(}K Г6c0BAZVVP(xvvy_Q1aXk A$;t s흶'"<ҨyFVn9 :̿QTQ\-2mUDbc4>V`}Ytp+ҊIf4$qnz`kbE/eMK4bI9 Bv[\q-r>EI\oUcU[.5g0u'Jpϲ\YRgW7q bwqvVuۧI HBWbWWW]UײkZ]D!%!'L;?7I9׼3><9s>G.1OD#ʖȸSB21И"jLwbv4ZD*k[2x^oT Ǫ~n‹\LX2R`4JȉC'z }Hq!NM 3Je&-ᓘ=6("~H7%4 :h|XЉ'?e|u/ХwSȏK :[0G-OЫƀmVi`<l+ (Vv0XG1)%eR`7(~W0 TŶ}Kk=g!R륔?,kPkMEG-zU,Bq)] gy]ksb39 ܙUeT%&I!Uup_-$ _NZF (7 _PR5GPSmrӝqd}lhaKJP!-!v,nh;&whr]ޑb:Nl?h /QI{--K`lase#ٱB\$.%jkj>\kN۲ƒ?{Pyƀ/PiLc/niL/NFkkxIs *=uvݴ.⏆<." *org/mUIvr!/bXߔNLi̶xC[â4kKU֣帓f.m{+O;B}9}WggcKiE]}jN̶ ù5ŝtWWAV&#$t 4Oz T:4h;juS%yV ĈpMr,ç XP\:'EDtYï>Bw:(H0_W=GՓZ -ŷċ4̓a7k6|ۯ%L{ >h-Oz+eQ*axו*vWfjB)5>>.^&Hg2"E_<Y"]ƘWWc~Xf8T*2}5o*m١,WQپj*^m,*OTWK3Fsq2S ( ]ZU[2k`nhL]4_s܇g#k_4m :6޹^qOw5T(U_ޕpqdTxQ3No.jL/HMNnX֍+7 We͙$cm+yxܶM{W`:?{ '%RxxccIc (]ו;닏{ko6J^UYd5gf~*:L8%ts/^yB:{d۷^5󷟔It2 Ro=o͉ڄplg߷ܽotU:v6kƺ$+O“|t%CFK׏z+8>9qun|Qv]>1N:.{@4f83@C =qT|o&Jܘ $ # Whjx7M{iq@+c0@</^;19M8?yt0z҉>yyGS`\EqnTY(>} ~a |:cWh\TڥDvŬ1B߶mJ1؊b !^n1o[cghAcNǟU%Fg)r_I^䄍hGLVq6qqmDC+!Pզʆ86w}[ Jsy0Mܷ<4cm{~_ 2nw״5e^t6W<漬g~X~kqݞޠdkfn8.T/kw<~,Pw4. TIma},8/_AcY4խ+/8Kbvuc_RGP8Ek_}}+ Mcf^5뢶Ϟ?4fPwlV7,;kg_7ɨ+Nt;6VZ屏l6\?3,9phб=N6rWycnmBnzGVLj{QΗNo=e'|sUPa,[RN1k%LNBϛD~ !ZBCBTRQӷ (P醩ނ7 1(@ܴ70)^C:l )4 MѮEO# vWOwnzqq " ,y 6F |3ێ'ZU*z{{$B2) 5`Qepj!eZ+)e;Dj%c aɲZVX ofkg uDφ8톔l~`&F0TZS䣄f kPHubfLRRDsW=*a$P)FhŮf%c\?tco/,;ųw5[Pc]"4}S,LrǛ^tϊ4;͝mݾGАvc-Skpm 段y??o|->6w][wʢxǗQWw_ym!:>m>G?>]/;矺c3_tܗo9;1燘3y9組^}Pa7~qgߵqEiG}l¶$w=poyѱo |lΖ?םG-~eu\>[x )⿼qڙrlqw~cڀ֘RS<ޑΦ=s/Xrcg.X?X+>w{睷[ v_6eA}Ж\*߮RJs TԪiqLZN'Vj !vK/>4XǘJ[ɽzBFˋXD<0ְ}2qp >ۛ=7=0BTseWv`=G[GJҿBwc&I6oLX Bc\wzP !rJ֧_1ZARDX,[)0 ,=Bie U_fך杰YϢGammHp9u -‹";uAKfZkDbBokFWnS^А ;W?n+ښ3SxUؘ+7gHVv3 Fc\۵#)pAx>HnC?-$Pn\Mήj>E9՜?uGg޻FVB3{~ֿ[N8ef>}?$vǚ9綼mWs1pc޴Lwq&\p7Y5߶zRXb$g;4P$XZs|׻^x͖6PTŽͩ_S\ N\}feK-y`GqAeҴ0ʢ&u%N<>MRb h<:Zze}Jl;psg} !ܧw 8k1XO\)>2,xG>ORd2np]wQT1fE׼/cN5: L&ض}mCCC?bN3&p<gҵ m=;Ahued#~d>'$6 C}|ʕ/<ȃGӦ' [@QD?NvAba D2~Ûo\M^NXA@($"O/\2mvnS^24]OQ ib;XҞ㊪1l\^zUITM} k0Ket5VL:f#Ssc Y iS&DxwF/ȅ1ΩOJGN'q6N^7X2&7\گK)~H/)$F_WO-m!@5;?(t 1#g(%CzxЀڧHܳ)ZiOz qCV &G%iM!!"MəU;O>5-3>f28M$8{Ppq]xx!~_ B}:)p$4L%i cIgu3~B}Uk1|زI)d9Ci1/UJ}B<$BWBY1ANzCooχ!ϟqLv417K1X`M1hs@,h?8Hi1 q{=[M :`Vc i3{Nhe~= fٜ3:w]Ԕl[OJLD6XȤd|?D_]lK˒imIiHv㠄,8csmd*p o=pb%"Q,7=㤓5po|?648c-k{:rl *xyړjB=i޸<Ք^j[r5;@ i?<]hG F2V^!,1%u ۰ʉq-㌙B])2'0<=Q2u0b͆ȓz.sb%6 Nf/LT > ,Voz?3afX85?ރnA G"֪)cGoɝr)\q|{O,k%,ة\Yqkq9ǯKz_,\[/F<Ȳ5%ftE:gdՄ)SrUS!,U]DHWc'G TCPN0O\C_n K21:\hw"K4:?NoHk\scfK 1e2h R)1BbF&*&'3w6-)K:U*D#60e62pu2V\N$#MW1N}eUbPrd\J9@$%B~>޽KZe\{t?-*7>s#$*G}(3 j T;4S*$"Dc\)(CRRKHIm#3i1k5Zy C2Lp@;A~' QWGMo9 r}mޡ{s>kd/8 .FZBH-1H{HD*Bt5ƘbkS,0p,l+lt4pz4dC?De|/wӢ%Ɯ *t'$"mJ"!K◜%o$__ +JO3%Hm.zXWJźD{M?-dRxh#eM;i^)EJLTIU*Q(W&Wj 8cXU TBQWN!}Wv:RL=L>5482P#Ot0 ]$cy\54cB|r/ P~ ^uP# ^V5l6{9Y)me֭oy[W}٬TJeBydsZßN$M|=qwpe׼f͵^l6X,Ƙ)**J8i oߜN~`=ǜAGe"<`{rRS|؇h!q} = _VƮ.d E5+>`̭\< <6^f/hwe c<_Xpnƹ/iׯg81˵nS5`'z|h?.ء6A Z+E>Ōo-$XgYP ;T71U-6(as&k.c]'` |kl b"4 9G?L)fxm%r$ }E7a{;úg֭[kR R%e}%HlRc޽Ї?mRz7ٶ#Od]dssijjz(˽K߾Wk}r~MFX|'oll[n?Ϫ9}8(Q{j.d X/XbX1Ѩ T@!R1c4UmA7OsLRy?7wױ9YWld1%@C 1AWueNM(cHHzݱ`W14jb+n͵_IXuR34vsa9Y|JJHQn@K=X1!qOߓa!;4]r53.$L"pӾ{s6S:ڒm}z tmӣݞm%o(H-y̽#=V{w5i-4av?8v%G}>E<_ƿcͿl[V|egtm?3[H9wdwޝk3cq+u۾\s;m N΢?T1*m }ck{TU&R*W–R[1S7 o;'~i >8f0(c ym~s~oD@*!CUd}[. S,m'!.##]=Ak1^Ā œxܚC{S/S_)F;uؚdKث| ?C$/bHc6kJ#9lO\yGRk4up!)%K.g?_Wm_>}R+@VcA;wd|3A)u?gժURٍ5: h|+sN2Ȋm1^'] mUfC" *JP+RBѪ0i!rZ ʩ͡JHOGX]6ۍWvR>kXy 0"zu_Ehav+H%m2ww3D {Ɍwfl'o ܿ ;}׌%қ?qo~C[S3m~-cցI\=CCbI,F eF[Ms}c!5w l|9/oHN^~Ǘ X P_CrCc#u莵Wn={3늮g]ޕ/z*Ý n[6* ]MMK2JY}߱S;qbq{,O޷?tR{ל}ׅk ?hxXsgm=U{T 0nL߲KC_Rx74ThHOb͎$bi?iՖkƈ?ۇ1XΟs.k9-+g\D|RR$h%d&(M1g8Su(Nh(>a4ő0P[O& K hcO@x/Ĩoj%A0t"#XTlo}&X z;V]E㧒ruؚ8Sw@Uy\) cKB\oY!hll3ƘJ#JOɒRyahi5y d2;e2~}O׻0sN@ %M\ Q#P*E!Oi_o2M "UVe cPƐ ČT[P7ɪb A&(cIzh$&= '3=u83~xЮcVQ &?a;FQ/# ٚl;yч[뗦RXo[F q96ƸV |9>>zƛ:IY2f淖{.!5`r?^W|mASfI X)CwdS?3%/mOLfǮbԐ&^N藶/wʢϘvvc]bZLi_ d=۽lJkcMk=NigG?Rĵԧޔ|Jƚݎy5w_e__J TF {KP)@B[Vm> HcCSSӝ˖-c?777_?66&&[(M3Be P!?ǞVk__ K qi>k0Zb&ۀtDXaNwPe#iM2H3G-#RČ :ZܚhC~?!gy&_5kA`ۖէ7>};\9mQqg؀,L+eߔ)H'0вA. bVc)1f$7VBtJ82Ҙt׵HCToIDK&,GG˕kJ (VdFNĒT4;o}w_CRf&:_M2-B>>K'F nN48mYf!ACA ؇L|Jk @׾[ ضW H]F |J(ރ݁R$!f}-%8,y"7/}lRibmضY!6Ɛf) 1}DWG6R3LiӦ/~upg1sMMM?RJ}r)eX*jO`aHX0! N?WxRI'-Bmp-AlNk")ۂBd-N`ƌ&$s]i0c G=ލl^fyq`XF$Ĥ-&e\b&][-&ǁstjqRkjtX3+ ,Bg`wv}qoRwE*BJy${p.Y 8;wdtt/ldnv7KײQUH-<Ȥ+>D էac( w\ ܽ&}=;!$c[jNK2knwK%u>$'|7 rTc ]JJMK4n~x-O1a[oޒNeR̺̞n$NWV~4fj'S 1"ejp`!TdBb#XnTK_'8MBAj lc[FYru1lkaŶ1d#tU ԙ\ű / ;GEpw6wУ@|>z<Ѐ# /5C˖AS*̯Tn[MXQ{'oMI_Tt _9넛GcGcq"2an'.Kٖ[Q:[7o-I%"9rˎzikٜ/叿kcRyQ{s[pm-rG> ܱw߲CUO ݋v 1w6;o{ }|B/rmڲ,(WlWb1*UVZb}l]1V0'7m=MuL_^ "NT/D̲trHrxa,AZc̨8#Zqϫdb.]'\Wҧa0xgT= *Pe'j8=?n ~oe:C%s = AZ# ŒLJqeYʽb@Ad%ffʆf.s -f@u.-%PWSnG<@o"P۪IC!VJC扟b5l J!l| 8 !O0F@0MDnc!Rt▴^ wn6cd2;agҶe[j^,_2{ZO]~2c'̚\h{B;fuuN\:=/y@pGcPvaH.SO~YhA۶sdMMMZ@37Ɯ{WD8N8WaHPR +J= +tG6mz޽{dkbJrfkc YQ. f1١^~FZR`|`,0#F*-7‰["(DIRCP&fF{6 F}čyDI:FQRpGG>-D}+َ )dИLH?ca,_۶(Sb{4sqXw8mԫ"(~^7Uc/V=)Wŏ]]3lJH+R LFI;ȋqc*5 +)(6FgU\|'--rMh\հ"Y%'ˌDURĪQC e&}J `Ñh_Mg Dh$*33 0~8ᵊ@ Mx|T ΆcғBck0'-=ν}CT_f68s\];/|= ~A-1`S{{;o7ر^x^uU>ׇmk&d*ӓ#x*@p*tWrer2Bq)mi-E2״rտd畗m%$7|’xL=Ģ W]kgýt kY}ƍa@W 43OW~}nr~ꇙ &6ݽmcؽicHPh|(b1,KN _KR1 A|:v5E*:SM~E|Q_MUvٍ4`!(]Rqzdrl|HTx=.0@ A47P/Q( 17fȮ&D̻>/O;"9|t 0E.h7PXSs@G꯾.Fhn Qz&}x-wlƺ{aIq|cC@!TaYkF&/= &PDzز\,_pQW[ƺ\X4*|vꩺT)u'b W im_,"%ȜIUぐQ_Øu )޷<\}O*JM{5 c !mu]zzz[*ΖR,c RJO[!Y3^X䋷:DJ"q %G}'?ׁmw$yDk-[A%wb1r0۲( I)!ݚKٳ*͝ˑQ6ԌZF!Des,\'}}Z4Bcꍍ wcBL %k'#%l MAlxU_jLZFЕc&NŀV?\ȮH 9_ɿ'Ex-a;XtLאZ $oCQ&U/: Z2E a"9=Mt5=LK:UF Hk9.\\ӛq,Ov' 78\!._*նƒoى!qŒ]Wn_NuUf|QkSӱ sښoIX~(dp"{JPR`G8ֱGYfa6cccs0|},{@)+ihh N(˗ !|R靝7ctjV2dKKQ7@?F€_wvg#Ңk 0I3>h![lezNu w oSv,qEiTCf~)79 21뷲lF;#Cq*%8S̶RZ꺓8DWrtM})FWiށ""(= ;ү׌ Fd뮽W.=#_:>7_(:{ 08ïtez1lDcjIs ׉ hR^ +4669A\ >y{S՟Z ޠzM<}hbU*bc S-dڐg]8}^ow]{2vilN2̸)\W1=xTk=7Yƀ؉: >fW֓IK2 V8V%?Al ]>s lL>ZB}j1*ʓ)HY .7Qxzv̄0m,V.AOuRl>dQN4$z5/zJZIVl}|AtGl,&hi.7PmfOc?sbC̜7&ۓb;3`K/M{eD"եO潓 Рf5_)>>dS#x; gG~H1M J)e ־>_(]{zm=o1Lk0~҆d<^={F*0y3bn,޲W)r.cweZ"!@RFʵ`9Hŋ544y+<[&G)eL&C\fddZN)#gc2!Ŷm_[cYuRJreY 0IJgM%uˤ Z򘆓_e- H%Da%.08ab{ʕ⸭9M4N #̌'vyly0$S.8,9u9G 6D~r I^ pJqy}T5^:dqR󋽲:;gh 08UVyWQ(4&o.c :qWֱO@ K1رXMu&- x  ]Cl]}{JGiM̕| -<ʕRXqw&tvOQ,3{91EvVf=x6t0{@i@kyHNXfl ݣchm}Mw{[ҊWg )!侊J$b-U|*AᏎ_>f~g_Ccr9twgmkn>yk{팮/mC>-0kk$l`"L Ora{eآ#D㠔2Ɯ[eh4QZkRR__u !^>`O"xm鱱J2òEms7>۹sA%X:MyipÍ&8tTnW5*ٖL=ԉ<ch,MaԦsnFD>p;d#&,@(v]N5O9P6D%H!  S> ` YPr( ϷY CIQ=VE>j%abA"Z5+{W6y "ȀA]Q4;HaXsBTJ݆ݛ原zo_wLDZ2'"lgxk*h]Lcþfh'6|mΦ ! 9C@} K qGc:+ӪiK)pX.ZC9:ٓ]}xdIȗ+uuv Wv6uǃm˿pδBL˺Zsos"hBs:)p|y˜3ktt)ܶ=J),cccc^ t !znB(Yd2y֚q0q/Msg!jiC U1MJ9?/TJMZۮ*e:Yʄǜ5 KMfg2 P ?kYضW9K).  PB-2g}lZN:f Q[Nڳ2p!1Y(2MHJba;F9ML|Wj ^bi#P`hrXCYi)u -`d3|{dq\A$5rf&*2<KX@2?;?V3g DgtǢE(*ZK`.,bKx{ֶL= 4Xtf>31/sFr3^N宽F܊`8 ]hIFtoћObRur qx4ٶuh6{o\!%-&(-)r%񎞾pԼyAkwo?Z \ucj%0kr7=ӫU)W*_\2ofvw\1^(5sɇihl E&V:N;+7kq_[k,ir\\.$ +NZaJE q]W. S( 4 ldҊrzRɤ8꣨岲m[d2z|V:&X,J5#vN-۶J)MU0ԊbV~ˤxW*BT7 XDEkT}O1RCk=_D)5ii `~uݝ\d2=Jq߷X~:ǔ 4ubXmMS(=NPrwBs2ϱh!,0DjזX2> A o'2&#y",&XBGHbu |V'-&?_+coQL ,UP#! JS8yHIxH ʆHV* efK8E:/O<=H!Őβ+Oa_ =2ycZ`}Ac&"6 0XaØ6Yb;0≟Ĭ\: 'ahE9sjlYr\uUЇr\(L|h$msf[så3:bRZ?^dgϝ=L*qݼ ?P-:[[k]{GƆxw-gO `e~C]zxt5Zq3O@*G-\a^#0 &fٶm?|eYӫbO&Z#d̙I۶ETRB!U'0 u:;;;\.!/G9biӅ`8kO (=RP oAӹ̎"K3Sj]c.,+9?<7*Ќ#z:.[ĻQ++BHK aͤg` s &<|00VقfA!*22Uj>'> [ZZ܃>_|ʛGvYIVTRmmmcΝ[q1F(??~[2aЌy/vQ^pag?򮮮RJk&J8+|kǓle!t!Ƙ͙L:dž<4qK)7V*jl{P c4`1f8ʶ1OJ98&cmul6;A:fᣵ+ԵYz><LGԒA:fPՈL@a@,8e-@[c e. ')qܲ9.j{EBEP;ApQs.6# ia0h497vG~>!́W+9w.RAM6 S/G'lHcW[z3&TsjX\7<%ͱf9,u` HEb:Eԫ $ dP7O Ne|Қ;BW/;zpQj3Bl64#EþX1qFbh*-kW}x->02qlRݼsbYiu}q5孻]N,V TXIJ, |w%]mGեSRR_5Ϟ Bʕ۲s{0CRC l+JUofB)4 EXQѳrr2dppr뺳'cƟ<,H&v5tgOdu&Y@=W_}|&qk:ꨆB:;HL T*ӶREBjtڮ~Nf||<ԧ>5| @-H&v,_WN={v굯}Þd2i@eYO(Yߧlyax $]k}eYX("ZϓR.iV5~vcx<5fW\4s6'x/|j%1ˣ>=4% L%:nU.> # IHuX1ژOĒZsS:1ꔦ<5˭&jn7G%?҆VW2ǡ{{5"5-.!L9:Cɫd,VN!ڐ/p1ǕҐC܎…7/`& ! ! [c^9ot>o1͌TL U$dMsg*WoO==XĒ TZab0Z lGG] @.d=Yymk_}tÖ`x DzgGOB@<#s\y0Ķ,DZ-kpvM0c#b$bneۿٱ7뒈SLx<20<D]8k5@ Z6 &Vš"$mXύ̄axR,P(T*Ukgb ɚBR~yG/[,^|dB|SZy-22PaOjC50X,y%/ik֬>?>.>Z.]xeM=yϚx1 UJ*j߾}çzꩳfo~x|1fQX\,m^)b;|8Φ0 M쏩) uӇz/\8 $5mM 7CHNn#DrTG>O IX"E+D?j-cѝܳ7&cNZ X!l°PڂrGgw? "yY,# i$x<4_Fc֒(A#?PCvɊ : ѤCpm}/;[1ԤqŖiӇPOXV2D]«9WT (f[8E䗪AUߡG\p:-{,XmhLC85JNK|^a=6Y^CNs@ew9Lzb3)<'!zBab$+SyDA#p?*aY"\8>>|>_#JS1n8=>>R胀_p饗vviW_}}eO~w]sw]cV 466ڙLعsgRZ|>_WumI&֪UZkjr>{)vmCI!uuuv<*I)N`rUX$ CR۴iyw}SSS@l*mQJmw'_WWSSSREEx:C򣐰bi4*iR&4!"I?%3AwʶXW HÄ+oDžpBܾؐ1bbhW1@sX]|Y ,q,NI&shab, &ʽ:@OVsBappK?2ZUch$3E.JPYΡ F,絳!~OWãP.C̚|L-*$/ aXUvt'ȀCJQo ؂JEv gq7o]]m2Ķv;(D3EG$3rMD c_=׿ıti LզF|aH=,]$Pn"e, a(0`,.4VaIn ?ɨl'S,0iQ jp]ָ}VEY#F`M) nn'r»fɶF0f1<1- R@#ޢw>2ѮЪ(HXV(Ƙ#/yKv_tEg?c׮]$ɣ L۶fm}yu/hUq]jmmTr\L&1U(АdqF˺+FGGo}[ۿ bŊ+V4c̖-[ӟ~.J:>lc Zw !1f뺾;US3cZ§qa}1(M)B3Q Ig:N&͢P:`-|Kg m:QŪ AFUY)SGp*搪?y1U:d)l?%8 &"afЄ(6bkn'_lnhhp:;;cR) 8#m=믿ll,x7g卢.\Xpº3<=yϚl6R)Y1Jez8Rjzjs|ԍQ=ZK2jR".iL 00Ǘc6[.KE#Fs b$| x F0J1(WZ_ձϲ&!^wCK}վT*>|QY0# .XkN/4)ᰱXmFC;`f%+ހHALPIBƸɅ27]ư R{։(PnLP; hAR=yE%|H2A?ZD!Ay!©vu3,!~Ra.20IX5Ok=uݛJk 1Bgdx`?Zldd_׽n&@ |:WJ)m0ƘR|1!'RB«;^bEe-[pYgR)cm+?z|O@ 'Y)E\Hdb2Ve~k|=ͯ49aC+0tqtr#jN ;bQ< 0d Z3;L3AapWek&0(jCxS}zۚLwl1g _lIT+# 8D+@0 kV/,<̆ g- ͢;xE}+˥i|չdMu:"gD `1*2U؆(ԗaȄZ2 ;4͐\\]'HV?!?b_jXښ 3@3w: @".`aԐuֵ=7e󑰨/3}< zGC0|Ɍζށx~Hh< mBir7:ȕxȡ!]Y8nN׎2A.h3Ui0IZ+6qs "QAF$ ʴ a4µ,s5p _g\S OHe8tS Jc!k7%j8= ۛ?xx}cl V57lQG326}(mp)JkP̜ywY'6n+c.hށ0Blڟ|`iB n߹NP)±QD"=(Ui_ @jR8EJMD6%3yD"auwwcՍu]gʕ_~L3]v8c7L?>;vI9ccc~OOOTXD"a ! Ys1uzp\˗/ϴ&ҥK/U-'>%V*>R]uٲYI˲Jf͢om'Roz/+%H]giF"i Es蒯+B`X0[XiN2)Ec8?[a {zԔG~cOpkxJmkyԬɡOY  B|.1 Ϛtb猽{& Ŋg2@Zb)J;w',=>l cl {yqS j<2-:"v #7O> !4nRgugd?[eti$m`X'V~Es H`6 FFڄ$Zr~{Ks"J=?fa?RvS!Cu±T;2PimM65=}oxxFOkݚIs~ZVZ?:0MdZE͍4?47/x~L_Ga4cWw$Q6g3=kBjjjrnƁW/~;>jW_ݫү{릝~?w1rP%"/| [rb_,oy{{ ?XZ~}3wN;mڈϹ彄NTjN3Hn% eڒevBj3aAҒɈ<-h 'Y!wL-R|UUonHρBh ^(ݕJ X,Z]O㼆|6r}Vf@z0O'£-UP~}[̑XQxlKki|=63{awz?3,O#1Jys]ܧ edbyD ZjJs*C & qs^#F MXe0Z2C:|2p('?c=k *>4$- nXw%Y : Ю>as}o!f-!Qlwr!%i: =+H &~\U8 X>j>@ u;큏q,LJ3RԖK7%Q?߫PFl< uX)(s9m ˒{JoZ~-[:]]ѐ!ht(6q)eCպB?ؾ3[w%Ӗ☺t:4oƺLrKN;Wsft+cI/9U>yge'.]K-r/xN(8#Z`uIq1t(b(*aY&J} UDq #9]&X}f>6&'Dk4a'Jv tF:i eGGyH&XxҐ4.:23 g.}F ǥ.M<0гC~ QA@O0|xBBH<-&څ"ܵ9( HFKk %,nfgIHYSX$+9rJ̨gD vuWoN\zԲmcXB OkBZOHfeQƠ6«ca^soƲ;F_܄CXW_o[L_8{F\J溱ETjUg ~Ljq 4t0H^*PaF6G|W)"ISG; A59,MTAjsA4.$X,-%t@eإR U`4`X`Il}476H#vp {xbI@XUh8mCgv9A'#ey3PR5iH%q oġ4D 'bk0gFfB{OB4 pF1d/w]fƪb}!S'ͫ(K]eGEM;D0HJHiʈB@B.*hv+&)e.Gs- 's1' 6m*H$!m-ݗUTqъ +^w `xxl6 PB /x&aӁ$BAa!LYUH4i:n>t!DŽD"Ќ0/X={]"T(swjy_q_U ψW-rv3MN+_PY d JreQkJYyWP \H bX%S&7*ƈYO)υBa: #X B>nJ^AtW*ؖ=G*L(d6*qw~LH X\*wPijB)Pn9=qhŤ ),OOd1d?2XQ0Oa8g4 4 EξG̙sC3ZRu̪Ȕu qJKcڌ >K&ܶ|*S4 󲩭-^u5U?|| |bx4'ށm;:{^9w̝9/]lADngHS@E^! uSMMMN;Nz!Sk9k>j=UY5q8_Sa !5_} dH&ƿ1&AD*/& ;UixB@qԦi'v0B3lKѓ:DZ\InJc"۽tW< .@S_$a7$1% (!k7A wx\5L4}2\A2ʭmX4;Qg%|g:ExW;&Ag*S@Q?SY:*k\ǟ_67*Czތe<7=wc@Y$HV{$B/"8@,AG6y{7)zk\ t.y poܧiM 6"gibDf,+iT9&j-돝=}_;l挕CA( ) c(76tL\c[RHBP,sct_ݰXКQW]uۙ'.<lqŴ lnfˎΕg|##nޖ\aXA T=Csd{ilv;qJ^-Bcm D١JgZ,4ERlpsjRP4nH}6{/2 ͱj<0>[Ќ9!#"hA?Z$Yfr592|jbt? $>gׇiu<9ֱQ~(Mfz&3-4AcdJBFc*dJߘ\Ob؅JZH3Q|O*ݙN/f zF!)E?!`0wKV݈ڥgSMZD{ _ӭ'aq:`ʁ1> vo 7mGqTb+ [^`&a_۸-m]-;\z_ٰ=a۲u7u d i30Xm[[nHg=j* mZj2Zy냃CiӔtN?r@SQ^vղ~wbMeŕk6n];8RaTȑ_ 1)1Ӄ/Ya󼑑@km0 1<<A%+ CfJK)Ƃj_3,(a>l)N `hhȷm[[0 122eQe6̉Q 0eY;3dI&>H7h/y7,=VDݶPYFP'.].( BD (`y'Ok"6#h(K=};y lܣjw-&MT}LgMk""B(5{ M2b)^E^W s`Qu058cZ&E3{2|+mKF nW[79EB#.46{SG*c:KPh!. `9:- Sh݆㐩d CYV@<9A]7J;m )F0M0i" f4LXDe g{wi!mضeKvtJ$m SB;!5ّ5}CH)I8Rk$"6BJMPX2z6^2D)1qPK$ xo~geIuMMxFϮַu]l>h< ,Ȝr)տ/;Ɣm"0sÆ cz&zk=]f^I&%+щrM>`zg^=V,1Mt:M0֒``tvzZCWbrENjӂJ)3=,V(RPPoiN.۞ \1gņx@YX$3|O-(cؗadt&[x/ۀ!QO8RP# @Y̞轶˗q:5Jcc$_65;vC"8V$vռImv8ZGEopmE6{^$WJdOwAkw5gPx8HlJC]30 FѸs=MZkLÀHOێ9ߍkE gƖi~3v3"hVƊd!?n=i/t֑-8 "@M#ThFRXq㋳hŞlȁnI'T3k֬u]CJ)]Uƥ^:iɒ%>7z~>-UUUv"CCCRJJJА_*B!VEE922x} ÐH066)|3gL_x?OڶmV2iaؘSxTyyQUUe) Bt,JG]yW}ݖN5Zk[(/^0dӦM"gIrgϡ ҵ5izrPX&S =ҷ c%vb1ŃcI.**r,!qݚ'Ғvǥ6$X[ZBPm+!)G3!-i0YގfH1Xb 8Ae(`6n |Ej4WIB EB M.$žY,T"5_I=ww|tbņf2 +$jzo򸑐\+l0(]nEn0f1+,(vCPiPUxTEj"L&(&z^i7/!|0FA=*`ՆXxlB9]<¨¯;1 e*\*4n|At2wVذr0dچh'2wc6^'^gN1D!=m`?i$QSJZ}6"3DL,u< |#BrD,zHrX=onx;qDxžͷE/݋5K"3w ))DBFxOVkVX!o"<Ր<1cxPV{Б^1J0Ӗ ? pe?6zop !4Hr,&Ql1?ǵrkW@Xj?2-u )_ǜঀ!Aipbb <ySSH|f 14fB8bv {+w#1U:UAOAz^Yy:Yp뎍$lc3BqfYC!iYCGgZ}(̢՚$RXE+DVJTuݰ>k-2\U&MJضm~z݇>zꢷg{\rIG]wɧ~zy5\Ϯ{^tm^ve^5~.Xӟ1o,EeYsL75iҤԕW^9}=mɛomo{?dɒ7|UUUvWWWW\q*_[owڴi7-gu֢l6|8 ,3`xxXٶMPxN1d@Rc6^ $cJzS=4Xmz-t4H0rd  %%Ȋhh~34\ A68Yk%Q-cui a}E")-$jJP2BRBҒjҠ[<(A0{*Xe#h(tWdoK*`|* F4AlPol2k6g>BJ Mw9JDτ*?AJp#tx]{<@iEjҐ[m Zoq8Jlys[iΛ͍Dټ+mIrc'>O`vc&>,4{}f3P3hbH)y|qm 2Zj`<|`=Zt ^VZ+)ejyh:a8Mi3HXR)(j|3~n>xEͽ{E]l*uY*++ַu7u饗No~s1S \}衇Nk^uUkL ˲ۮڭ_oxo`&r7f)8ۨe[Ȟ$%oit_&E4W5=1]Qx(ۇMĄ/TlcJА^Gd#4$őFsTOђJ-ȠYW&)OEJPWL BI%;OM!] ̉fZ;m]ksf , @qg{CJB3M vzֳ`?$Qmk:B\|pJBN@G"؀B R짟>8yZxeGFRW?ζ+?03d c[ Z *M3 AiH06-LӠ%Rm׉6i!c$DS4$!Wr! CB?2 0ĐcARB, Y3x61Ȩ^Ba,, `&BKx/ % J"cYAP,|!DNqP'{#|;;cL캳:T֚yjѢEJ_{>M|hP)Szŋ]tEͮw}wܹs.]>/Xb2vO?qc܄t…. ̙Sя~tyjɩw󝓖/_*uU"0J,k ֦au] )ebxʔ)")8J܎|Ř,-5SD i*nT z;cr4y hγJFy[5;ꚸ=!~JI**7aRCk.  i)Fi>2&V6ȀrJ $-fC$7iW}x\Y& AI@`G*xlM96\|%:5kRF8,HOdɧ@'M?ADK\2yBOl:L^vR췱ĖD+|MDgy^#~0 "6"X`A|]Y`AS]EdlAy*yÓ@W4Dh|s9ؘ/>rÖΡإLm-ƺ?wu%oNYYw=j݆|c:Ly/޴'43Vۦm>a43ƺ-;R0gϙqQs}]y_ZyڒdܦmLYG2N\@}9oސ/>jC3gLnjMVcۗ6ӟ=6`!t2?&1ʃ2zyTQðlll, D,Zj*80MS p֭D"aPJ0ㆡL~-[ǑMMM-[w\Ȉ9sfꦛn:'W%HG PR)4M84 >κK6559|^ٶ-mȘx*H&뺪pªĻ) w-7ok%I+ ܹs'|27ndɒ%X}Jk)f$JZFaogېeƤԚE}o+5FDU2(. XY i_;EX|YdoI t1jP5`9QHZrb@\o ~g80Q,k3ϮټOq蔄\qx1G^>M\O;n}?W.fNֶ:{~89Œwֶ[N2#L\;Μwv_G2[_Xv#<1`bYXdk+@!p\R83MR)´m4MSd2+LRJ˖- O<na駟^~v'>qniiI&~򓟬{ʜ0 D"!+**G}4[(G>W^yS//6 Cg ڶ-MӔm );{/xk^SyGjkk[n?+b3*֝Zk% H۶l6]x1QYYR*~ũ4f ZY1LLa2 KP#@ej&HTDlCa#6/49wT@5+p*2/ZSl&T!#{,lZ;E 3fU-(`̅232`jYd{#_)ϫFFtd$UI Fe7(nTs1#KC ʨcE u?.k_O1(BԡQnC ; 3P Zӕ(48nkː =8)a, aFwn"m0 Z%xaEF +,Ao{ĔS8F2| J<@,„Zicaza\IʜtϢWu ܾgkO9C3&}=CfM[u'{҂'VVͽwђcߺgG=lI)4q__6;uy=r]wgAxyLjcKc/]ύ;n^eۡyg65m\,]AUWYQVR6L^^M )8wC++._O߸"7: wNn~ŅZ[ -_VJ Ƌ <ʓPnh8`!Xo^eif ZAPaa>!}mYp3!a}V,JX,^6 >GOunއzh/4<+_ʡw}+2я~tRJr)5aj˲DP;;;KA^OJ)׿wq۾oBcǎ>o~[>836l0dɒl:FFFҁ9X޾>lƶmZ20e 侥ٶrNS9t.I*TTmpl((j/bb(s0U@HžW1)qE-*}hIB‚0iiR [/׫R( vhA0ؿ H2v@ Ce&Svʼ~Nlth+ ))2*cN`^;ˁ^ UǟYS<Ξ'm)C\{TWd E^UWU1P, TQt'FvaXi$l#UJS)(ܒRLYѱBWTlN:|jKGgLnZ.yc2e_ HJ)? ճ?:"\ \>vAWf٩`TUeuYM)5&N,ODTԔki3]F6/'6oŋkjju֍K<Ȋl6[n򗿼A)EsssT*W^yglٲd2iTUUY못?HTZd͛ٶm[TSSc_~+ִ&|>5 C~_/dVUU˗/7XhQY|yT*y{_VP5 'J/ Ha7FhǵG<@%D mRsc%(z84d, ԉE$WqQF"D*iiOdn/ /!9S<ݡuFGbSU+11i ~6hMQ(s2Y4JBJ-XL֚r!(hȋ 5k$"(!E<5iؑ0GyA)ek7.aFM=xB[C@"O=xH0Ob>b'Ҿf,ɌC(}e|Îkt-Z!x]Te6 ]@\\o Ta~:<@SnJXd{J=!>ICYgg'p{ /<_P,Be*0N@g-ϝ}ߛwȬfNtkq=w Nr)lM=C$t:qSgO!eT#gb')u/^eNnIFO 8~O8nN:r)`.76H<<8ҡ3f&Ύ,BC3 B:۲%CH)͎56#5SZj3mHl\7Hұ6{ZƱ|ᄚİ)xwLIcbQ1JeF^1"U.F% BJq7)%BN"?kiB|J)ggeYRk жm˪*}ta)bĺ*jժQ0Duu* !x8Q)m?>lYcm{f+lk)%e:cL&lkk+رJ ˲|>ڶmyl^8,>~?-6i9aL`{4t`(2Egz*DtoX+q i00h~nJ DY#98ߥk^%+['?E n{,CLVky!{__ ġrN>Z缚(BERJ4MC0҂r b(=M2VcVl2 *gt $$bas1z#d9EOEa%2} "|Į>p5dI rOת~&ܲQ\4,7Ԩs*&e%h c;b+& hd ׃!-xpɮ=cFYC L9>z;~ ԴyKW$p%I̎]j̛=븪L9544+ֵy)rQ[q47ن0z.Zk[JYi-mmȌM?q[w=]׬[vajKwuTX|4[((d'?7=??unw`9Ʉƚc*3s~bŷ220@eM ǾwGWOYt1#̲4g+e׿-51 cR 4R6 O  P<!n#(_!/Y###N6׷q9ەRY"M=7BBL,cY,k70fYwL=”}r籣 Rq5Bd2iLBN5C:R#])%aNSJh?SxωPXFXe&lu&+V B$4Ey|qqhG߄` Z"gh[pىeE|Dӣ 5J} 7?H IN0&+ ɣ.7!R1[jTg#&X]fvGKt˺@N988x_G;ck~$BJG諆@r|-J*hT$cQYg3LɅVȡa1) :#>r:ҵ#7Q !eXE1ayN!C˝u51&,wb!a/  ;:北 $۫7mZ,=u'2e\쾎~NGX#9ӧ\(J0Z(`[V.kwo+H$쑱B/Cf|oۋ%O>0;嫿t茩yzW.YKA5uں{jNū~u!38g~NɊ#'FFǰ-) mݽ~ꍋX#[3!4芵9zo6kz^.Ve~݋4ώl+].5Jt{qy#܊H:/jo|=q``eJk}U&q]wa[7qiqҌ٨\.e=T^tf˥ ZIeܲy!yd2S/Ⳓ8\ $^ߘ~RQf J06SXyx0ev2@qPQN=Cmxu? >T8~ 9sI[T=%a%n#ZJ2bi| Ce<3>/M&=NX1 &kDt-"D旑8܅t10}H0RZHThIoS!*BAK訦vД .% (.2.Xtm2`$h/]y)JǤ8 A BLUm ކB` > 4NOWuB:oɧ]N8v'$c`&mQ,h\?@k?gfNn9^" *\l 4H%Zkҩ$hMXBJA*za!(K%CEb[&~d!d!XU]dHB7|;\ -H1q/3Xg۾};Rmiݾ}gA6H)~#Zvi͛7=d2iXAX,q+b Bgu]5yd2;v( _dM0mr|oes=wrLRekCi@ TklG>eҢgFE̊͘ #SX:!M!nH(4>,h}9:8ȯO=4LØ =}'"Ҟ,( ApRQWv[x ({` ;2ӤkBb8P7 ;y<.%5QmyP92lޏ$%rK>C eqm!3E5K /qq4j &f4/8vt<\.}Ώ¦6-P; LM TC)l;! (o@rI.REA sXeGnJ 4.p41/Ͻu#͟d8Vf پĠSt 'I&0we4 L39)I#uO'mĶLҘ !%;N?ՔY%v=ql Ƌ:+!%edTي_R; G{MLB͝wډBe\xW¶,lBj33BRK54)Ǯg8>3k\ !Mx,d2hJ0 a8U}|1R3 59;IJ)G?SNMr`ҤI;S/_1ydG?_җ6{cxH<ez_24|dMojD"!ŢRJd2ixy ]]]}CS?wO !D"02Ki5,w9.Z>ʬ`z`:}F1lٜ)q=ՄrcDv2?3@޿%asu)5)D6 cRPs +DaJ৙JgXeFwbIwx)ギJc$20: C t!Ǫbs1pe(@I&OIY(Zy+R4:ڄ+݀?k_cp-^-~wUAH3U怯v~غ=" ]4HLeiQB5lt! x[瑿0()|2(Vtn ގ!0J;>g^)pP1 XrRD~7ibYA*\zn^I'AS vojz)g?S˥y <{@k=ΆRn<+x;&͘13xhӦMw?ܜHR}?׿0 /}iVggg|33?&0?;&G>i־hy{3EJC=ԧ>O9gL<9ew}wG)=تT*e|[|7:#/rgm߾'xbn,//Ӆʤ+߲$Wpֺ0vLAB~" $U`vh6iB ]Cyyѱϑ ͯV>$>|\ }t?y NhQ)eΞ;YgLw^'-v Ju9B$ÀvL0Wi(jn 4e2?TX/EO`DF i9  QH5"]U`6Xd}b5EI>q-5_b뱳tɊ{VGmF=lK5!0DE1$H+4l\ \B— d:2E1掁aP!`քR`)Fǟ:!owb.#lAM =BF5 mvE&hں{w1Hk47ap~pՀ5uQvx}6l'!8(]#/MX|۵'߉3v/Bb0(d-[mٲԔB0mڴ?񏁁OgΝ[ ,pjuO>/}}}~-[6t= ,\n y{ܴiSo^Ozŋ.I<@ߍ7qy5:zk\0./}KsnS.w˧N׾6T*)ڴs3Rʶyh\k`=;Nƥ*:g|\Ax.6#Yo*!0z<-r DV iUV~e""<`zKL %v_$ӱuGMKrxS8[Q jT\+cKb:ZEEzӰZD"rU:.=#FO'@Z&Aq?D~N2@Ê(*w"/n~D/CG!B :2 '"I5 U)7ƼJ$>a4R!Ji4Ԥjhx^!Q#tRʍBAQ? F0͔%}MUr?B3Jǡh|%z- Yá0dXwft0iw*B&S*`*@uमӟG0z@zcaHЂ@~˶vԦ77l,$ J(0 ,ع 0ggO!_(>`I:]&~,0j~PQ}AY0\ oR46+vy?fUƗlw!/Yʯ,Zjav4)JUJil*8OiiY1icddDab?Zk};7,޼ys5yM}bŊ/|JOO[[[kUVVVlٲ%9CCC|3k{챁N8։Ð6mNbeUbd0#t+2/Wq ?]eB~|;bta"AZ/bvL=3r=2r7bFw/xETԖ6Ӱ @8|?~) um~Ҫ±Okiܒ/2M )w>!~kJ˔#Z8)TL8cJscù#yLyՕ 2gGrr.)AU ܕlʔ%7 UP[8;<(eWXqB4OFc&jM(~xAT~`p FFA!V/qK`yH)1 MBa.TRuW֯__83aEE{]vYC=}_* C]tү~s====+R:6(***,qPUUeuwwsO24٬gNI)RJ!FGG}NR),//7˭A ܪ* +MTfRj0Ai\Ν>}YfQ(붼M=借ɷ_")#?/C'stʑR~SǣK;) w]or*oKWghӐ9 k6osࣳL-)Klo4/NK 9oϬڒ/?jϬټVEʡ3L'޿d9R9jj*3~kG6uϛ=::\roN=ٰu0|Q?Yox'ׂ0>(-5@WP8 .Ŀy "g"w9sNK)QJ-8at:mzg~K_se=%*++/ˇaξq z{{ ͩ9s/_|/nZ`AyYYYi-Y}C?wiۋ}}}nꬳZ跿S'M {=B3kZJ8,s9 677'N>䚕+W(5=XAJ$wyAP(ظze-4ҰRT&ֵEb`R2HA9!X{]~` +rfkN,򷱀 I`/&8K5ڏ@Mw&dzk6qDPrL>9[!@=YG;MJ;Zc7CH~¾b xJ#O\s L`j`;pVG!"ftg'x~ČY2BLdNMclNVNٳRp Oד/wq$TUaGŗU5wᇜQ_S]{x'{Ԗ3ꪫ>,UW]u:ip.u[J&p=5-ټB|eg4޻q{-J?jÖ7mojiˆrcS<|햶OrW2m76l>#9,͍/n3mڱ|S1傩͍8UNCNͅzo䖦6cJu2dK~vzJ0 ǂ)Sv @rWH2zڬY4MZ[[7r˗/?񪫮|/K/x;p)w0RQQam޼9~v׾͛WrO>&J~%IJ$={Dd2V6㇜x≵+Wiiiq~m߲eKaڴi?O馛:-z \rɔo~:;;a" CL&e*2:iڶmQ]]m/opҥKO lv`;H_kK&;1\nG/466Hio wlK \đwLr :uN: &OL/m; >XN&)CŸモHށFB 6N>Щ8DyXJ.ךwР.)$00B$IN6ܫܥd> % 99We94@- ɘPIeP@ʥPMڭ[RUUE:n+JAz!D`R1q7vn۶-VWW[wqG;vgϞ׿T*oӟ׾<7S(ԪU,y[:eʔ>uv[o"0>ϭ>#+V\9z.}{;1}n 7qQGU\}Jnllt㎾ + ClڱcG9Qil6]veOvi?mۦ8}}DXJ)ײ,u]8CPxmmmئMzի^<AQ+eR%׭Ҷm麮L~򓟴uuuM7_#HaD"!N^d<0(aF;_$JWŭeKKKr۶me˖455%jjjX믿֮٬u,_GN4)u?~מp ՟'W)U~aYf#~zʎPJ0-Z6nqeh-ˬhTQ<MA@# ^!a?k&"]d$yCºD:LpaQQ-=F6y0m``%ދ`+5/P1#dh2#܃C!1,]NImRX]w2Y1V B;[#g|"1Gj?HK:`98IMǁ ҃vHmT ^ԏQQ Pig/iB+fLn ['o`vp.VU[N;_mRsZDZf#^dx|I-mkK)wBb7Քۖs}\x'?#Le}gK[S=4s]0 oʻzSZ֜u҉0 {J֟%W4W[U?4K e@"Y=xELT?V[_kXRQQ1P(H&;^H$nɅLS%^#XcJY I>0 ,g,(?S_<}!xC.GHO_BeZ|rC鵯=億r4ÏXLC,8*4O]X C?ny " ^x"i̭ϖFB8uaQH;]2yДؕfhIy W8aAIFb@>i t@Qy{F5.>M <jBÆ ytnٯp=:hjyoda9ff<7IM ݽ0[VJ:g]߿/MK"T2Q()RRTr |)}磵-+i'7N:- mE׽,RJ%.Mg|\w=t%t[T)?zh0R\c|CEYښbɽ)~8GrZ7_czY rs~a,# Ey`ge:8e|N8aa::4 #lFRbgJzbBJ%eYp`QGZ)5ٶkwTTT`6amm'620s]w~7_f4Vn凴;&FJ2!U8NT,/iD̎!s]LӝZkBPH)ZA{, z(vJn\ea(}MrrD`689Q9?]+]0бRLP$3`X߉YDCᄟ ^8ϤpTƦMh4NGM>"OQD@6zk#}˶{c@H璲$ f83B`y!UvReJ#BFkZM\ntl)`4&աςZbRca-<40v|۶â?#~eO:_׉ꏣU:z"ePG#͸xAH!LӐ;I.*aamYVV۶| w cVHj*?3ʓ#}|űL4a", )q=00 w4;z%H<4 1ul)l(&aKF?iSϘr 5!{Imm#|+y')8sCX_DֺbT*1<<^08#fǀJ%lDC{( BS?h,E{hR86G$a}~ Ƨ>7kgAR !7EnYH+/.vOG#9\d4y"(!bA@пaaHAS7O P _ k<)3j \)]ֵXƷ`XQ`6yH%Hރb5ȨΓ|ip/Y/\Oӿۼy[[ƖMiBy7 $UWWQ7 ?QSSb͚Ɍ.{ގ[9<+NOe};Ɔf& drRŷj4j 30P+* FcہҼU ؽ8ћ LlZy RmE 1N p$08 Gqbh*G,U(53NkV'q͉ݮ+eG@TF`1𱿳P+.!juW;&ZZNgvƤԬ[ҌԸrM}:U- /T)x±q= M(b)ޏ"o^LRla$HƵ͗8DpbJ՟ O>db.+jFCoF*/Rk G9ӧO0Qh0d4R'^0gZ7ض3BTVVR,+JSJ=N5וTTmٵlQ0a)<1[ž9o0Xrt Kd2PRGJf"S<XxBPrk(r(-ST݄ *J4-D PV1{V㌔X͏&CAl V)Ѝz߈:Fn[femG IiռNfC 2@3%k8أ0'ż- #YJds)go5V~paoC5XG P 3.4߈.bYiTib+@M *Ц S re"n,`^zC=喖+R״xZox9Txv8Z'lR um J.H|tlllP(BeHYŐmkAXOett !0zJ5ӎNݩv9Wvtj$b#ϑhnӰϤD&ȀWP lsu.j>7<J@0hBӠ,<m?b U;/mFW*z*M'^C2\JgT(X xCqpFb6pJqjhMv"XԂJ#۰Ca-#Jg`gaJ,@ba[ط$ώ#03ly|l!GQH+h^7?hNOi> )vs΁tB_SS>N^{xЗP{۷?H)u >X,N$ :Nپ ̔ Ыd2Y(J8tww󼋅?=4]]e 4:MZ"n2I˦v,' qSTA*A6(KB8/ή2Pixp|K 3d9 #pɇX0: +a< 2WP9nZ^0? Eqڊ4"28wyMi- A]d܆ !؊gC;k Rbˎo8n ?#X---^˲ȷGGG/4Ms{ss3h0H6aul~eB+0Yfq㏟YUU9!#e}R|Ubժfz{44B(AbsȰN 7b` _b68[jh [!UFȡ'Xg ^moتyXINbPus ~;7wA ЁB?ƉBDAYk`C,p!0#=0h6(])#W¤1i a%<5Ux' 8aO-Ǡ2JZE.òjA ZɶUls+_hke X%hFR)|AՙL旑Hd!Cj6By`0"Aur6P > .yQ !aA` a\$`'8$j1 ٬$RЮM?\F u$;Uh+\Jn `B%M:̍ du)^DY` S™ϪG Lbt@HIStht$_JiƷ5 $*(XF6iͣc$[Q-x}ʵXGX < YND,[Jd3piZ\P7I_IJ^a EyBzd; ]jLhSܲ׺%+,BJ͘U(;"`(! 6e5Q,UgPvB'B% >]˔vƷ sd6KlibAQh"7\INbxt7b4`hnFVAv݇yr1oW {D"7ApZ PW 6njz!D 8"G!0 @"ABń] aO`lj;iz}h\/Dۻop"B /"uXo- Kym_jW n&!DVRh4zY*Rjh"ؠ*r#-zUk mOeH$r9H$r!Ġ J4ymӪ|e>}H_'8AG+\-Iıf*bfAT JCT66$$4b$*P*dL*c=1h2h09[=zJaBDX&Q6?KB،>bLb('$z c!ig,}ҹgk,N/ CsD B/y![`?=t1ŃA4qI;Ėl@Z !~"i.cǎeɒ%!C>ڶ-w$0BD *x@J oYKgMX86lط\E)֚ `iWqTT>*gI}Oπwq>nd?t3׵WO ҦFnjǂ`"ePyIKӐ`JrQ[l"D%!F."(%aW)њؠf5AVRޠ^:2owLh(Ɉ@1JV1JkLIJjHūZ HP|4g|zr},\qv .̏07# \v0Rܒ+q˳nFpw,s@/^ "0I^y}99S9 -P %R ICHi4T0 7~+Zu' fl8{(V;vT#a.iڥ!HCЛ[Lo`3(%8a_l;7Н leL˲.ZU)0;)%B8V6?nnnUgPiRxR?f?!o&k9s{mmFRcgmXT1'Տs@%Cx8#A]XM=K^qQF^U2rl|υЗ1ǀ C8 .#,Lz,) f! aB"d,>"Jp٨}ZMC/Lnޔ.MV%Ct@s D3Id[*6n&cZEN51SX"pS!h](ʪC`x\aӕXXI_{E n8Lap?S8 vs><Qgh>(G0|m&TvHVqy|/ ‰cC h@S ^4!>a)4*}(ه@ e J@12=P|\'q;߃~_W)VX[k+Zߠ*~ph{W!"Bt|@VW R|߿quww&5Ayee ˲r!実*&TgTEpSTz5k2p&dW0y[,9T*'1.pi>+4,(L2X &84kXanj $= 6ًXf &hAGk2lb:(%X."G0Jz9? Y.ymǀ8 !*hjQj5$H i#z` A ,JXx49K6# 2|E:<\3.5dB V+}&T嵐2`X蝢^5- ٪JLlg;m68eփ<`i_LV?HDoQ<}j|_3I.lgrˀeHLK$z %7?ATD!+ 9. hNf}tgJ 羍J-[`O6kc O.]|?сyb1-zEk  !6 ! Hh:}WDD~ih7Apn4m"`P$[(ZU9m'89Ty!u ٔ%F˚ v { j5 "iZL .yZL]p+97|ob>M,`KEE\?`3UZӚڐ CpT'Q|TXI%AI4dv%xaW^qZm:HLi[DQm*p, h/4 }[X "1  Z$cЮRv,wdPOGNWpy=êSB&=&ELJ1,*dye;dY倇A<Qp,U{S'OfK%v~\t~.VO}%U{.8B5pX|.GBe:ڪ K+*YnP[jw@&7ر(;_$|-G\XXY17|uDk˖-룦Rkkk/hkkZXZGyvw}?j 7f2CKG; ĕXSˑU|>-@~v5T:PO$@mҡ!SK$2 1> fқZԿ@Yѯe+hm_\qm)LKR8C$Amm߿Q__?S#sX ˲z{{c}0R`ҡ5 4 -zxn R9'RM}|6n` #yS,_@3b>@ ؈k*1aN"H_ EeCɌ!PH͠$VMx_C4EYFUeg&/4|q!˶m8TWWl/ !>cB g*BtttygܹsFXR ˲HRY|GJ.R.WRӛ6g% DD%1Z)~ _`] 䮃+}uy 9@ L<{aK0fnuMf۫2`6BAq4ڞԐ]GgN P-lح6(RVDAb(6 x!|@F,2eUX;]V q\.7_q]X`!ď A@:FJdT*uzT$Zf!UZ*)Rb֑#Gfy"3Od2?~άz²l6;(nH"d]&$wƓ 5;} q(N! -seRPv}5]ڒo< RYZ xIs`qQIwDxHXw rRjZRA뀨B`R/ y@xRR@EEg)zz%C* /Cԥ\෿4JB"kҠ &:5ɯzi A]S4&\l%Le~b)eͬPտA9d9qwO?{Or=94rq;Z`wKk0R;Z׍=gfϞH$rW,R Vmr9"ƍy 7n뺧9sz:o,ZkRvh, d28(oywqAv>dmP>}v ev[T/A>։ o)5S^+-B0*)V!m}ɌJ6]U-cڐPÆuy~k8ݚkoq y A+XvBQPG-[;nEvْ(2܇H5^O/78*`Rd~NJ P%Nw2; 6|)["=;s8{p34cڷ%VP(Ԥ<=;ٶ rJ )%dhiiH$>C96I[Z&dT!D )嫶m_8΅RʯA0K)iq 5H$c V)kɖeL@ʯhw%l|KYb(6W7x{܎0 @(V4v|sնǘ/1̌ZܑflWkadө#0~8*ٔm }sվ}[b+X1@ ǣü+ǐE`03 Pi@ -=4"a+F3&Pvx>ʲSv4%mq됹ֶ#?@]_Ȯ6 b꽘,Y3*[ڝ%h!ĝlkJkֿv˲rhh4]}P(۶JR[5Sk=!Z%ᳩ|{4=b-M@VVV꾾>_J9BeYK /ny VjݜN?)rO)srBaP1W࿪7xɉ%1[1BBA[2OXp5LTC7T!ӄ˜U:biUR0&ޓfcޣCJ]j,7IQʃ^H$ ښIL! #ABsW,tTĠ1 {ALSX5[~Ķi ݘT|Nmx +=B7Qc°xIpdX~#{O J?s;wL9VX{iv׺u.y7?DnB{+W8d|>_hhbeYXe{AuRbXn#.fmP(zO;dȐP({O<Æ cR)Yv-eQ(۶l!YL,!ċHB@&o0%4Yf_˙Qa$ ?!O8xθ Tl!)BgP}݂0.3o(@}Tya4 diI'n%ʕ[t@3ID@h*OѢHtQ:ɣ&H* > cG8p#3^:UkyelHs[`T-ρJYIzW+_$S'kA >1$WH)Ƙ!saJ8-f_CtpRA!٦F&bHL[ n< =J|>]~wN>VX FAe˖Yk}?2ăB6J7H))QZk_kK)k yT3i$|GAX$LR]]+BtttԄmF|SG !,+bTn M#\=QNV=HyKuZѰ:P[4) JCNڡrm0|UmkTbs̠b Mo.0-J-3N!diJk@c:u^XtKAWI 1 KH<ƨb+~Y[1+/V V/ffQx<%6@hHڂ E,$)Z",Mаt!KX<Kgj?1զ/ w* ]u0#T{3$1"fR0;~{~NtNA kR)LO >&X9Rʗ֋ZJ/Y*2L?)`<\fѢE 21cR3~x̙C}}=m#Bi:8P(4Tq3Y4`3Kh: 1TApan5n&AWX DޫBzh`Bkaq8ȴAebpC!%9KAPA}2oA`Qh B:!ZނGE3:ﳲS%+h)LlkGS~%"!lʢEU"5nG @"t+A{e'߷! ^,PnxO /mظ *n;aCSOVb=s>wO)HkIVC/DX+!WbL@Bk "t-)~!)i葂Nצ3 *}I{fWY /*yHGojʽ%Y& ~t'Dl °&wι VX{{]P7Z BzKb1f{*++7hW !!Z|RӲ 'KأMkV\mT*AEwwwѲLf#RÊb\ G4nD{=҆t4D](X'%woCkDu6R-bӣhq\\bOLjb ĉu7hiDMf0M$OBBXxv@h|#Њ"[!'-rB U10aqh`'u,(b`L;Y-4ew6P5 vX4c~wa͘>t-ݻ`;^cVB ajY=?7L<@97,m=cCw7DFBS]C}iU2EcoΌq٥*XPܫ @6;/ۆ|(leU=\g?{3M(ݚ0i=V8ObIW&ywE  I@OPV [&φ2+w*%yE2KhڰFyPN\| +fޥ[-7~( ʶǃRB{9,KB$c&zkmܭs%q @L\L8R3 4~~mZpahwo_iQE*R y-B`}M rYܱ;5w6Ī2*[`mOW?\W/pJHY;zx *ZQ$-e%"4ahXiFWUpp<;Z`) [ tJs!Qqa 4,m^gI 6LWBh*(aqM2fr&=,j=$Dm)L!:lE %=TUt=,XJ+2,^~p9iqVXe UWW {saNq[Jv,5q9JZ!qtDsh-T>d_U@Ux,Nz}> )K[)J* UiK}&C`h0v Qt4jvcy4k5,})?_GqYjQ57,37ȱM[?MޝҡCP/B@CUJ)= K<^J}_2&ȄgKrT/O"> zEퟟc{_ͭAfQ*[`mpBu=Rfm,7ʸj]U;P }0a? IqaHY;0U1-) Dlb_,6K׾ Fx8hT , z!i) *j^+M̶NQ3ÊQN\Օ|a^nd^ΟRx@0R?M=+- 2/[`m0Dӧڷ/(I 8BbBzOZA-xJ5f؎S7akB>Asd6ެeUģ>zlcZiL )}'P~o47@A lVm~e@DN}CţMAAPa7Wφ*u$9r^VɁ˫_?'l刽{x~}2OKo_c÷ng((+ 6(LJEGIh 8zz%.sba FT_CU0NZqf;̖G6zZwRCւLn7/e b\o^˪pz:'u6`0pHM?&+6(# AScl46^'EdtЉM*KѴ" @,;V;WpƂj[Ł#oߍ|9 , Vϭ{qء#C _Nm([`mP0W1=@Am .5SbTPs.-jr6վEDlZ*| G{tG}:]A.) &BoTA2&X<l'i_YiO?L&p[K F©K`F+q~i'<;9w^x]!ui4L@M QE}o+Q|J`3~k)G!h,FKB`F,l7SP 49z#7-|FFݭwB'ۯG,?6K%J8d\8~"#@\Q2*.c:;.gaHh#wW}.MSAW~GPv G%Lna 2؁ODHh+Lo2HH_}17EB/YYmw?PƘ i8[LpVۏp Fn80A6 Cz[sh$AmtNH~%mDTeVp4Es40Á(ts<Anl `4Gg)-,cQ$ ^X_pj>5a+-Nڿ#&vkՑAQC;K/|t 6e+tH1̜پ1U "94Ȗ K$xQM96Tx$3;,g-rI'5"5d}(9m;ADqj ll:$śn%S(V!L" 0ZAR\4 oJ"&bPq!  'ik)"sQa+(L*Y&ZC0@S#H:a6 xxuca#X>f=5 jAoZ~9 |&ܥU|^AT,spӐσܩ V::h~=RaBpIZpVWWU2%ACA &7>ł< CE+t4wTo-=@ 6>4,{edGakL㼑kFVF,!t`Cs*m> KmU Y)N,B)Q4U5&'Zyz,ʼ?nR@,g*oz \pb"֧w!;ANn#948z0`sSM%$МMydC6?u,d߫FvssFS7rkK^2)W~Ae]I _Xe+ێWmmQ yfJAqJ6y*9pe%Y;YD24ͺ/Ha+c,-A5tDt#TpBEoD4keUY 976S{} zks0>WFjqbۼOsQ2Ƽܧj2 #P XxNZPQqoJNe`B ^w T j/`٠,G-m_T}0ʼ$@*GqѢffaʟQ\\0'+dRC.E78]oa >#D$$V_bb8pAIW+x =L.7^An+2 PW…rH%Cj2*[v"5Efۑj5H>Vkؚ #teqy׉*Myn YRJ5'{dtp x<`0 8I@ty5Zo:pFusr9qCWJ_Q='On#q=D`0Su;+ao?4fQX- "|t>Ln'G~zpjBOfti~&lg,#ݐZ8V0yQ0`Tf bI.5~܃ AInr p#{;a%| J&?,/r[E`/;2*[ٶjmyne.{7Zy vpXaif <tZȵGB>&h[™ Mq7:a%`@x8ZixRh֎=cI1%W=ܷt:p%`nQ@g/ngQفZ 6Fi|@MeKI#ǟ>pZ|V36ڿ1h~GwbԠt2XD\4YQЅz6nh\g_ILDd!\P08|t U :okӠ #-Ǖ/sիCHB|bF[T` E#E aSv:»݀&B|CH-< ^' 7:RPj(S5ih9Y.km/v^7qJ^>˓MhdÞ§+ 5 Dx~h\]zd _-N\x 7׿̷\Kgt]l,KZf~eP+mgr 9a ߭qrx8MPC4uhH&KT f .(sbJ)A9C+5RP|-X<ǐo $iX]MX$O⳯`s"6Y8Y$]hIgl'+--fv0M Ke6.=E̿/{8'1`>kШI'4؎Am@ 7_UXlj.aUM\(Gq?ߡj_Th]:8M|2ԲVXp!ַVӟ.-Rb36?8;}R:ͺbS~Mp_#V4C–.L{] LNY-.¥X2"t!δ6N?w) ¾cc5q?EJq`% <;cc z#턯,VB\blBMۛ/vr ))\~-C\N8 Q3=N~X. d0kOEnzk8~7͡>E97kOrll^c({qYX{lô 8k-]}|Z[ l.:`!%(T &}dW1\Vln 6dh9IגE\ Y{Zsk6Z8 7= Ups6KwVxy>j#ԩ4rXJsEXXzVXw{lM?-Fֽ"'7QO3ǬՃ@cJ^4\1\'O6 :lel]O ZZ"]䷿}n+ۥ4 "_}}K ͥ{Sӵ{8:A7h.;Cfї#h|R'Y9GnjJiV-芘=+?Kj%t$Mga!G_S; s8׼@d|LX,mp1?"!+Y(l"oМ`USWzm%9*.! o^ >v%$ǀ2Uի|71Z>`qa|na-=Ljh~>\X s_@1U_Șq\K/!x@W*~2Em<8+vxev*د&Fx :EpX~g;.x(u pj"#=.f"E'&<7ĉ#hA[$hj܀?):TThZAGy\,z -boXeS2U=,KN۬[__:UDY 7\鯑4UT !5T+˞Lxs HbTMIa.<WiIgW%+aD#ކjC/bXpl8~TtlRߑuӣNlJߢg(1"0FCVޛsV<'Rj0`yskAn&hIkr" O`#cΣ_hc)'V[-^c7j ʧxg/euc/'RKD}Mq>p;p8.7n4 @'i|nGUpG؟?L.pIP5yf4G_2؉[cX7U0$mx[6tax7\:xƯhrvd(flS܌'F,VLpghDS0/L?Ph*Q`>2ϟ";@ɜudVH֪fÆM7ԩ"[͝2͡IHZu&h.so"(L8pwm9~p|gDmrGN_Afy'EX;;{m+Q('Jng1kaPq٫KfBl*Nfpp>5ep +ȵFpLNuO`A5 [: VS & v+`]i摚~}5_9(K}Ofb2=q!KBWT\CX >DMm|)d"dm%YԐ3<1ˏY "[;M-$;3ṡ0mhd_cݮ}8y5TfFX,jy>1x#QπqY\m¡4$V0&_?v-3\F#ɣ*?xE:ӴЅ/̕t,vr`1nD-k`"x/IC`u t4Qք=?eFcH3X8,Vsj& gF#ťǬ&Gv Z}p"8oEMXebи\D1AmrNmߡV`Aq$&߯ >:iXr5U\F5$Wd!DFdz38vXKS폲Q͊!2*nc MAIVcUW.|u[aL_?}cIkx@q9Z' 1Wf+fc2+Q91*O_=O|5 a8lVsR /N}߀ g4dhV}.a,}c\ć#,3D8!9%>4&5.W=7 g.n7$zWګARe+ ^o+g#Uы K J4 /̉Br2SĔk(_(ˬ[fS4W<՟᰾:˙Y!s~kYUE,tj0ngu|:Z ȕ;ce bgh׏e sviέ6B 1h~U/ib7Ŧ?E2 x|#R^}G!ɣ)^@:8vl=S ƥfBs&}vOA5-ܷv \5鋴L{N_^VeUAt0srm;M蚼agC9/e>Q$Ϻ\E%|+EGH 9;ͫ2ڹ붗jF>\Kc.}t;.8ohS<̷AHB Ly%Vٶnrc3.\5WwXqp" 3;U \F#'kjZ@V"#x%椌͏]1N`>3)}X[lvvNo aM 4 b׍h.!FN7C7A;cUͽ_c⛵L?"YH>pʧYu?u r1]٬2*=BXlUi 8i܊Iݝr5{us'p#0"乔i|, HHv~?q)e$ɝ6Ӯk✺Ʊty678NFR^l#(q# ub{'v2-N?gDJIeU5Rl!nߍ C:Lٽw5P/KӨ,NS$K@0*F%1yW;H,ڨd&:)Uu>1Usޫ y:>H$jN;!l~'!I=7PFOJ,\F="IdN\'SYeU͑!0V=@دjmr&9]QضEJA&"!pJ&lX4R l_"TDp"4BB!( 0tݷSB:=#@>Sp,Ҝ"N'x{8SpfKm je2*;8I+SqMuq(P/kfR'^1a @3OaON86gH$!zM_$m!@k]fTC<+7;kCvSZc pVHf4Jk$=Vxz3G$ KJ*rX>ӎp z?,rks\@픪8ψ.}"Mog9!&M ZlQQ$"=6QU׏Vڤۋ\}+[%Oį4^M߇% ,&G4EHa4?U^9,aD9D1!T9MvTRqү<lWG Y޷-ı>@|Q:5̐pZrj&us8%!8A6^3 *jGOQ3"0H>Ra2%%߭oDZxa jGĈ&mI8 DL;fX4t@nC$5CVU=4Ą1} oFh ^Fmo42\~<cf3B`g;Sd4`5 -+Nߟ$G1Ay/4!S<5npb;")f}"Hg߳QzG~@F"Cu*x;4jxpC~jZu5q-+rD6J}ΩaIXaI7^즖`hF9d?4ETx,Rl_2T~68:Wve4 Mg`!cV + (zm/" JQ<L.,.F ?[HS9&:lk ߉~Ǣ0y%o!zQs)ôz TFάyBK{ 4Ƙxl[&R }Bil*uo\,IE&Ϩbڱ]&WD1T(B1G)sg}˅'2| >wim ϱ{hD L{C +Yё&9`tj_4BƧl2z&Ob^U2磵&V0JqS'#ث°cEbU6# rOW.p)(>L>aKNhݳD5 P\©B1DVWpTi\H9~AVF[_^[ŗ74Sve0F#d_eFeɑ`a-CGknG!9*L~۱)ՖuPVÚiaʶX XhSy6\1M)pt%o.5)PK.zgк(ˍ__@ wŢ2t9|hOTxK3Ω塿6?$q6|Rf5VX{0 /y1KP64qN`yVBAsu[oio`3`G f5qqGVݝazYR/(MQֿeSMʥaLek;`U"Cq+2)JU%*dh$Mj]ˤ`-!_O/vO' p%4"Ugpn\w*w [V͸,`];H0=k`_u" kt`7GR}`Uͮ۹@jC ITAС j=d}wC T&c_:qaX>nZ_I),[G561L MzNg8yy+oZ&z^Xګ)&}^闼02pxs"xr-BoM ir9&k$5#Lsl`~"G~GC>5n6&l6.ȱC&%y@n%McMۆch^$HC. Ǻ!iV*&WR]&tŊ(E1c@wȖJA"czr#Sd=<[9TqFEyXCF!N`Rx(lz<:VqU nYr]>=-ԍ/lnfٓ)\wx rV1I}{xv}y+lYRg5pF%8MA Ŷ<-P1*+ aFᨘ_vҠ#᮶#w >K(ZuDpiez'WAQq,k&rAQӶ@ 8M?S9 ʘCP \Og~,xm}_8.ji[X/`Iď&6tޡO0b$ E|Hk r\ڦ!2%NG*+P=uOq˸y ^҆ ä4VZ6쫋qZOA,{nˡ*Q3V9*C.  粶mbj,bheH/N שq[`Q^NQHgSB6Hb m+ VcjhgUg}!:9a" 2nܢsU?>р1-0id%4hٰ$M &qfnm!ƶb D2T@e k+wbڡm/^vl&>ZƒÀ `~훪KtC  LYɴ))gyJ'[C4nHHGW)?Bc; -R-3D&BYCSGuFלd 0"ɯ)ׯ߆bkZh<b`UEDeU] d\Օֽ'9.M̢ Q*9R2X|fm切K'ydwpfl+L x,}a*|tMKlj;ӹ<_nXY{0M8;ptTl +Fanסd[_9Zvb -;RcH;Ե"i4&wUƿgw{$;7UDP@TlH (O4H -^wlﻷ)nD%eCslN;g&Z 'H mNUNl` s[G>or%Q*4# 3`8>;'D(ܥ])8/a/hCLJ^B$T'^unN[vTq`v2lK'hnK@P|mϩbo],lspѿiI3vU9~uqʆE(*y] X&IjYfd͏HI~W(h>D> X\GHI޾a![OD>־E$fbcDS*#jrXRNˤ~e2}oHn5 ꗤ(%H8s3Oa޿11sжn'˗w!r;FGUdؠRj0@,`{]J ͆ΰ@{/fdI1/":T"$XELM|#{OAg4S62)9qR&f_(}St5i>|@Dch( ~t1H5s;5 iܷRemc ]i7gGg]#Rz^'Bh:-<ь*o *q3VsyeHyp+ wd.#xY"$mJPyO򰄓efnn@JPhz40l &ʾ\)yOIcRLvćJ6eȯאB ("H $Fhh G-PDf;&)O"amQD|l\gO"`}x*KEз3`=F2L Wd#s2SA.iQE5;|T(vE>VP~@lwriI{+޾CM'UU L$ܮOaC [ue(&E3xj+:$0Y&zWzttm5r vl)=(k֟7rEE}Zn7Bbd0E̖ ṿ-~m}\ }(jc``8(y= ::*!DHg=#X{ ͦYEM\Qm#u5A \iؔ;/[tZ1UD( ޕN Ei~ASrh]n"fn}̭MT1 fc@*bљԉ`RU%dQlФ-M>խd˃݁mO!G?;OA Al'"p}WAd F9Z4ݱD"L8̓G А9QwrN x NJi$Sʂ6Us`d\I^a\PI(DacKD0)"Kb7wKaW#KXRXL˺4[9X),P<$7;8Ya5I,0;Oz8˔[ɘd\*F&葑826-H)ckFqGABLt`>P+hͪ:}&}dwQPR@?r;e~;}a9$֒ErJ}-a̯4Tt tr*,\ g-өZM```fB"1DP]G攟`4M Fu7 : az.q`D#Q߮D ^^K!|6d " cs1S6>nCXh\eA:~9R0YbyS"$mΖl!9I귖c:AUG]\/UE-\|DwKMw7 !'_gM\#x-ZE~bdtN97ϴKKP]LJJ%|!t4$), ,hQq7NΒt Ek$O~ŜYF#ɠ_̌Q0$qzv6 #0}xW[xr-i֭)H;A@e*Mm(9E }~ʾ픃ӹR ' 咬}ATwZ:y$@`+C+!ҷhMD#F#rqx ^mecc7N/d|FMeǝ$rT 3RD*Z@|tvN[`< |,{þU/7a`c6!926.fA4Ѓs4?ƊH, $DHDE~CTIP?Q3?Ʋyh(\a]1E 4l IEILPȦ,0| ^s x_ӏMi zFDuqGrE4HpI˨㚷 R'qKX4\|09 ݒ];7ȩ̜ĔchNWldYɛ3BW&aZR̬MgEx<2X;7sݜ;1fb%_8fkVqa6Se{d%P,K!(Rs#X Zv}s8lbSmh SdScRE@%V.;*U¢NU@BXubqtwlQLrڐPk SASFBQ<:oa87>3A`USWP0ZԋʙxF.Atr7S8O~!Gp/bd,ᶃQ"a,rT/Ory:igs!\HiAAz~<3F1369e>;g%Bl`UϏa\jwÚC" J 6aAha „]BberְuN1Pm44Oi 2-,8k>md9[eԯsmKKy{F-7=xÎ(➫Wqyue7ˢ|\uF:^tLl 3i=3Z먞9u؆hPW~gȍ̗Ϛ;)c3}1\t5XYNosˁT |cO+b͌NJ VˎyƔs7. G}]\}G ._ OKbHbu | ]!K[GǽW tNT^pW0:"M%ŀEx< `™E| I:fqr娚2lGEۍiؔ cY0a5CX4~v#-bjZƝ\)Qn9`>K۹㱩*xrLc-4?}13"_TďmIrJulj}Kɧk!9u&DɌr^;j%i[h}  ksk׮#CNih@'`KPlHIT"<0=On 4ZQ)@nW‚Z ub-G~ATM!tڈ ?<_巏D*x@%>-iy 8dXaG^\Q9.BRI̍p։Y~;g7MSab'2nlGErF;G]$b0l|Ɠ7n$n@F$&usrѱ%&"LDAIaw/I#!71e߾>&2T6QatڱB2dWdyMlv8kU\p=̜[T4aVtpH lFQEorh -#AGE)6G|D{,&EXQ]VΔKn5@E:T s+nCMUBQi,f>//T9, V2F)O[D Zce]V0bPȄ3 9G+VM߽6% n~.Fד ԇ-%"Pܤeovp}( 3mOLEՠ.C gGU_XvE_a)<.`gZE&f^SfFG:F P<6=Z^}WҗU I|t NGRJ̌Oʌj䱑<1 :[t-śޫ桔qQKh\"\YC0dj_<͋┏SRA9=௕Ֆeśď?g1bFo iKQ9pӲ>/о9Iـ?9a]AsXT+!4f?ed1yDtfyrU|SC+,oܮgM?m`bAa*1jۃG>}vl Ub CP9B}&oS1)BoߓON&Btj~`X~,.ASr!z=aBuR}62$< iK"C[}BX4 CrN E]pgH&o҇Gp8:-hzma_'eR#7MVfNWbk`–NCU })'صy6!CW8 @e[vlqv['lJ|ٴ,iyEES<,}~#,yƦAT:aTE/_[( 6R~u"|yx3<܀m+ Z Q 713b~%/uМrLL~Ap}5:~YhPHc{?֍i}܂_\E&iOt|f %R;DdԢtkp(@^]!r?AWz[}&HCcNZw08W hmc2xt8ߟ k5n7zQr }5Z6) `PO jvf9m)I?H@?3dR6 äc6*I4Duk3⑇ZJ k>ΰyض6dVFSS>I7YFc EsFe),fŌ ِ!Z#mie#MG"|E8"~WWNN.֧TexfY G.$b<{ͳS8#IaW[v==BTt2Dа8&6~LM>,;66~4Bn1IWSArG* I`a`F'I d˺d kc~y|6,j%]Rg㡣@J`B scwp3Y^E j7n`-k}{'B&taXD *IDV(VNιeh vĩ(oc.h'x̀$F2kz0>/ryguATPW\UL͛clCCAEԝ$?YK;PÏ[͊PaCtjbXHU3Jئء *m{1Z !BQXPgYIPAb3t[SedI ! (4a Uu;x%znFOsvߑ1~FpӏĿ]C{d'=׈{o*iHr /mת)ms^lfgZ<)@?00m>l`y _n(HzB6KPpN6Wӻ;k÷(z']3Oz4{' MœOC~y}1?ױrAnmdX%:V\JR c0vsӣg΂\h&IBG#;Hvf@h.͸m* z NvES.a;f]d\qFϏڏ&N㓤,G}1VtL` a$L65I !>cte9vn]} 7/=[:+h%95&MS82J[nC䶽ݡO% hC@qK)A5}v~ Vd1pRmV!i쩊c#E'Ns( 񽜙(:Inb>RzRXL>E('n|fZeI Vg$E2d*"Rvg$Q9&ěm3Vk[gNf<1HcA d&ˠãAd-'i,)Bi؟ߠ"Be66MN.E1ZlCϾ[z4>vJLHRtI6@9NAD- D|LWnDgdUJ5W)$:a)NY ?1n2{ܥ|p_ v=lN 98p[HT Cl lJ)&l +C*5sb"ps $Q|PHчF nr ^I&ޙD6*!Z(::@<نھVpr};tAWdRn-UDN8e'[+opoBɈ?fĠ\μi Z@p*xwTۂD{Q!*B4)փ<.twi;p%p6.5Mlޘ_ gMٸ)8GYI&im3B[,+?垲ø# Do1 7TV~!j;O We[ps 鬓?s'R$zK/XD b#X sd01i&'f hB2nWWiT_;ԑKKE8F+@¬WZPҥlM͠.Q1(zHa+nJ2rl1STo61̌HX,'YG6f-լ\E[M%(& VfPPQ(#H9_?Gcͼso>W?Ina]VJ49?Ƚ\In(2lks)1B^f~ض-H2lb@41*.-4 h+![`2ə;&LbRs.Nk6r##nDx26/3\V]ϒKu=J0S/o^gsS, h{~wR7fƃ#Y\ q89>7x`9{]SfL{Us5Ur}\gR:1Lk$KO>IbP :3Os%f PRd a6G\QA5˻4Bo*I( j[tfɦl(% ?"So뿮f{ $&t5ehpY#x⪍TŬY[%MZD$ZMy,k˪ui 2EQx =4~3FXFff˲$EvdVNog\H~s-|0lՎ?u`;Nc$@ li4s}).A vsɺdI8sx) >d>乭w 1A[ҁiq^5pǏ7.yTqK.$*HM¨P /nCp/be%F&PuPGyA8\XCms” J996d-xiēx`vڄ 5 +2Y[csuqU-s,`A>_j̛Q%RcyS.&m=٤B̫nvqٯ6ly>]Hل46-WN!!ZEouP:-T0*hGq8hޡ8_Y;8RZ{TaEu,$\0 zH&S44ȅ;sCnf?NK2k >{҂!r jl'mIT&]D1˓7|Q<" sU(AHFC|Q|5 7-sȤKټWnGPh-t}0_%:F4^ۅe8W(T185@xP`?wD^M(*3l? cn.m嬯TsH+? h`ӰQ4HFD挫S^LFt5g9|!䰯*Ѳ>Ç6r֯Ӽ&EPk֒x\WTt']sm$Z@4l"E*:12M\A {t/^ ~|("Nm'X(G"@j *6"ƞV=u}%Q kCkhy!gr$kxx(,~ lyaȆ=kWVbi߻  @oTx_uR ccHjFA L2qxeh4aImb]OϿ"XHUb`uw~ugl#69^ ʝs{s{oXo;cؓto!)ئ%I6[z/sH ۹g!@$RUgۆ n$- \@myyH-;LK.]:.⩻4r48;W fxI Qyrz<쫐3x(ٛC XQ$际{|8;cg~T o4e%\?yxv3|ܓ%9Y7h6fP՗'W+ɈɹT chvw#6yI> P8: k*@# f>~~8n̑8a?mBعoDip⡆WGOfFGv^p_ YWH.!Xމs &C诣L#w A6T &'AtsR :(% 熱iOSMNUzPq+ %N~E8bf 7̨DrՕN0vy7itve61_av'͸ )Ya͝) M$Q'ieť~IX.Bﵡ* ʪ(($1phƢmijQTbQ ʫHXLP~ }@73t=lm''mc8^תr Ӏ8A+oo ,p7>$6v1ZbX^eC/hRCyvry͔ hle?31W@Te.LCp7ʙqm'~FJ k*[>-Ix"U"#*Bra,/i&3tZkWvL~i ɩWs\BGlg*}.~zڃԀw|V1NKq&?hT , H=;PI%).Y9$hOޖ9|(*χqꋣǿG6!YhQ؜l^ݰ @ckꀧnhz leNz~7K1ylD/-%:1fc9^Er;_I*txe3|YbMVzdD4!bp!e\X~͂g[Rq:)H>97s*9~3ZX:u'\9/7^!`q9LZ1?_z/\\On,'*£,,-y|]GNkd żflU߳"IgWGdpFu~ƻ~/kӎO)"K2$~4f|]܂N7C,<¢Q]kU!_^)wE@D߭nY[ϝO.d)78ɣH(S'QTҏP4D|GT7w.x>|6p9[K|h|/k2vL>i874{Xʟ=/,_U4QJY(<+TX\ƠfyoX,;Ō{Rĩ{8jId.4 TA$0h@L/HN~g 'Pϭ`5`QOcWХ^J@8~H9 Hk@ \e-.͞=\߅vdsOQ (*} Dsu ٴ*lmuc`SX'R#HutwdхB ]Y)LgԱu&FUڷdl&7&<_M[H{H+vVJMM|}+8;oᄼT뿑q\ŷy՛jb|+.!9`sG> (&ayr-@-/c_Cv@'3wKo{`WP$%ŔEMUC1)f8RF,n$F:>^) ćp,!44bMuT ,|$0se\H~ x%EQHb#(:ILXm#fa>heجI+#Ȫ"_^;zRIR EÑxĘkЇpQ~$S]fG=W9XD&<÷\-)|i49So T^~yk6`wP-\N17$ӗ0I~yd6?%^Bbbqɟ)VbZ^t H3uD1fj#R?^5d9cY-'uFbq zKD܏$DOo $yB8j]wK>$Nxfn}.~`Y\G%Tdܚ^] TXr0)1l,D޺ӯ xWQ掃lU!S~F[;aG ҧVU$1#uh uH!"8{)4ᕗN2{b=Or #X{~?xw^ó j٪́x @R`I5v^H)1Q̽[$=g3Iw.*~!)I92B [P9IN[/$~C㷤Dt+BCLXfCA-Pn!7 G>GJQo}!HV'swO%<jitFTH/'뿐B5b ::|qO^moNw…m6w+ɴG50BȐ " dй ~0$1|>wRdErlŒtp->+96*!Ax&zn_PPldvv W ,vw\Mx Ta Mik/tL'{s]V deF򶥁%`=xI<mt9] Su Pʭtm$%wLSԭk(#pP#EVlչ ={ LH Tn1yn@a 嶲o1y$ݤ=Gs6cx. !XarYM10&ڂYQ9ۤJX Msװ/1_'uW2% <| P'IlJG Y'_(h|!·1 8ct#6tLw `E@`}a4x Xu$f'5&5\W*q~JLlbn" ,ĘZWȓӫ "x&&U3TlP`5WGk %"M*v; pZGuݔ2 8ssTT&6=`[N(n+#&lFaY#YD W%@)‘UH@Q._TІnLq3 Kd{o `yG<|>+5:dO(%X,ӎ4F @j:ƐM144ytܥ-@q6_}1u܆ 1%Xl (n.)"/N]UDGȣv'*lTʫ"` 0HIA!mCpM[T#QFäZd)8" VܥE m(.LG*HyW,[!|J.}y07ʰnG,t֡ t. ͕@.mM{OV Iq7̢<0cV#1&B 5÷pڄ W.g2|{X; K1'ޒI0P8n6!FQ@B H"aGHcm3\bTR.гaYw'ɜ2jULOþ `yد G5(-a5sZ=SuR * O-4Y@%N>觑8nۉOH/7cB?;qi8{4!0y-r|+d_9Z $f\R@MnDdd2ozC (Z7/8DW氍9 j_j(ˮ6<==T#[X\o a|Z-H#1Cn8ơQ-(x%HNBA;NhIT @"rٛAiQTsպb9Qwz>Lh{;;JmǮcF/f|q3+VXN2X,Q `2lem] eڠ@ֻO8RlP@qd|FcR}Ô6(1d^&jfHO42d,Ϳ18q箏9AOhRdfF)Ž?@GЊ4>" Rlt "Ӻ9d E\9g uAMX#6Ň)³{یvW*+Ȭʄv?:N?~*:7:5rS%'GK[~LnqZ"&&'X ,f ܌`;=qraj]3)Qai5. @kE\ %J T s%UEBp&ipɾpN@vz%G{͑ϸx z?IvkA52VJ ίq>4eA)o4rβ"ʻheI2Y_c:y!T@ "6DG>>1 nC40I iG6Qekbw=DKX ((S[SNy^"3]}xLG%`yCx@ F+?T4|~ 2%P0UpTRl-R%)L_ V,T$2iM<'K(͊pXE0A6oea_Z IigѶr*´F~J%Tv UK$4 Zm|"CوJ$ XR8+ysg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o@IDATx] LUϼ]D(R"}HD%-$ ZRi=ZTRHRlmhޙ=sݙ;;yy}of=s;sc AIPE@P o)"(A@"(@! @!E@Pez("(2B]TE@P=("% arϞ=Xp!fϞ9sਣQnݘsXt){14j\sMvZ1vX,[,Gy$N{9u]]vQT^=j*"gܹ:Sl/_ԩ%,Yg*U|~s렃2ZjYZZ5kܹ!]7nرcHY^;|MjR{nOR;"(G TД|?||xWw5Rw}5j@,o m6}zDPMx4ѣ%뽖0@u Z֦޽{[+Uœʕ+[kTϯ:~a; /`( ?ˍ>z%[izj9f̘uHG}4֭[g[ACeFO E@P@VYASuJfӮ]!$Ӧ$R*.Q%|'gۥK֭[C" hO֍1dGƩܨ9&sxo pښDmRE@HYŀEJ*ɐ!*g4m7o6t„ 6lX.hPժU2B%%u(r]tݒbQ۶m̗m2lE#=5i$|6;w6_aN*"b4f:cqR+b4ӨCfmXIcժUhذa>$g׀̰y1 htEr^*}:[nŬes9Z\ nI;5zKIFݯn+"z5eNo,1 DVpX UleM#*(WGbCG%[@?`//e-&e4?`q k)%9Eջ%/$q[]v%?p7)0g"(@+yf-5VѴ4KCLfD/yne:-[{4_hɈ`[S"(C Tҗl}9/ivV!SE E@PE@@K1λ3HEu⊀"d)YMOKPE#*"~u"(EeEE@P8ʀ+"M릳VE@((.P("P4P\4ZPE# 82#sg1ݡ;p̏xmڴ)S3:e"^bx.Sċi33$v<5ӈsR*2įTE@PR2A)y#@\qP[(@# 8/`&!ХK*sQA@pண*"s@O_PEpP\8먊"(eWE@(4pணS4i~"P ؍n+iF`ԨQ?~GE( (\%"(@! 8."(@Q@@pQJ:GE@PC@p]R=!E@P҇@ƍΝ!CSQ4s=*aS2ZAFDH .V^J0bL$GXLKV*1Ǥ{ 8=j@T ]6j*E[tT@ʡ~~=JVVpl7jS"x-h;-vF,; ~D9dSu"(@4h`3PII*j*^=`XQOi<8p@@?]*ԭk3GŌ'vd~fM!݁^jɒ8W_ `[0z40mcnl-e@UTE  *_|Yfk/}={p6\z)p6e 2 G~xmiqݎzRpcݺ Sx߾%޽2]'dz![Zv2ti`PEz~,`gګ"(@!@F~Wyvj>H~{+VZ>8t`baCW/ ag97bG4on]gs rcjQ\7#&3O')N'ڷ"(YEl̋)UT/; e睗#LQR%a?60\g= H|вݷ-gmK̵ݻDŽouTLR4ǠzweݎlP4׏?>O:TTOE *EI(P mn܏>k9ddMR)Klclur`a/oSL&8`>xHCVJ2xΚeK=$[m.8Ԓ׭-S%SSRBXzxM3 jpGHj&RT!P%@ރJb\YO?")Q'Т&LwzNkT)-_pR'ck7scڦ4Ot2t#+"P 85I#N੧`V8 pMuXChJΎ4 Ȁvc0\ )ISr%-#WA mKP,FGl1~Z"y`/>1Uu1݅p^K曶.iܿm4E[)'Bfie4 (usc $2i[_ R "[8L8R ؾ}Xs>[ c @ Ub0]&e;RQrͯy87|W\umW ʀX"(@"\m͘g̥Љ("PJ9cea|yON[( t:"(][zW8P`D;H~F~}wYmuӹC%N[ H,,L-n?:tLH?i=?ѭ2yt֊"P@j^ Y[\ }j,ۺhoWcԩg[oÇ۷Ӧ&|Ю[̛,%qnEEq:gE"p-| C ڵinTT&z>xॗ%KO-̾nߎQߋuc߾ x dBP223ΰ?^ Яl&>lpJtYҏ?Bl|[>B0ŶG^Ы% 'Ə/~詔Qpjp`{͕Pls9"!Jn ?!ݥӖA9sPb~}ylWoSFn&!Qu{hC8+=|%#z]}-;ByI֪_Ey @u_ ȭ{8 @nSm Vc[rI%|zmt('ʆʕyf3o޼8xdt*Y2EEall)eK`Pg]C-,ãHǺ!EFu2y֯w_x 9gZ .%T#{DfPZd}g A!g[&ˆp <Qo˯w0i+Aɸ%/^`#獵$H !R\.NUP 2!CTtvG;5k2>5%p7/dMyH!D>$Oʍ#U5ޮ'{t `\f υS9;nƍz̀Y{r|fM6_V|kxa= 1 ],"Xd9\q*,I;Ȫ rm'Ez'Cֆ|rֈ=:br^NmӢ 91d[e2"ttEQFJQtJE  svDv ā݃a"Esd#s{F,'t\d?d5Ҭd+W*`+o[_"oۉ0+W]ff"6>Jk=F͵cQ2@p_!_V!ФI=;ΩLs6m>Gke{{Ņ:}.x w|7`O`j_sY.v=Fp +rքN%q"D5xɠ'I1m a--=)zi\xR5.L`#}_k* РׁE@(ZpEk:[ezatZى/bt0*)E KBIۆNG[E 2oʀ3茲cǎY|zjيWT%7ì;4ʀLPEx!`-s/`Ig}G Spd6@-v嗋 &=kW"{ND53 GX&LZIShy{fڻ"d^'Q6T.BŽ܍]f5"4)h"(@ 8Lq&ҪV-ƍk R3=P$?F[:$$,C ?=X̩>8D;;ӟq\e7.@۶mѬY2]"e.رlv o6f׭D ,temM&L^xAHp&v[b l!@/:-fe88`nnfL>LXg(iCDz.B!!DNtu߁3DHy#1Q6d$/ 8Wfчgm?,~4|b]v7onMk\Yٶm{ѿH]RH0#oL|_)h#C_`>֔͹S,N;4,ljZŊcl=S+Tbj4iVL~|c_y7न>nqDRUkyⷄbSE@EPC=$A+iӦ& %SgɖPN.^:$\o{-)ke.Z--*Y"#4 l'5PEZb&J"(Y@3`~cJ$IlF&*W^TO;̙#!K dE™^+:e~Iy1rȰa>z+N>9PHlY0\0OD'xNo/1#\NUFzr#9qn6Yw*%敩xQuIu}9ĪL"+nʖ-+˚ebN0 Pʗ/oBάDffI]bL&˓%CI!oܸ5k2Cz@_Άe?rm׮d_ȃCt{_?oܒ%C>$s~\Refڼx+yx:Lċs"ey)^u/ gLTIH7|S#T5s_h|&DSE4*QSqتF28cń矐lhiNW ʪwК2H1ª D2ըRY#L+Ӎ/h*p7$Z2D!Jkvv?v:0 z$2~ݐ8̉v-ɔ~("g%JVb(Rf?),qlʨ&)N<}^owKn]a zf<99qXIPE@ 4QRLJ$Ҋ+$;݆9&y=\ 0ncj׶gGNtN`~_f.Kю̅'򆡤("5kXPNqĚcAg0ݢZنN۷{LxN:5$G%q=(Srր5Gbwx ҧMbrA1\0V6/I%J_ gixfWǏ?J"*.(۷Ĉ?}DjY?vlhjNԩG&7_Focb_&`N?fseG{|fδLQ8✸裶}୷GC |vMJ !@<~E@(Q DLF Muc Eѯ$}؆FK$>xiHk!R!BՈPB'dMcS|Eg/FmơTKzE +WD ɀI'joI嗐Q9,_,^lKv VE@(,&Ȏ_?n8GBxqIØۡ$_1pYWFuJdrd>r7eDfF"cbZfF[åʜɀ)9s]jg@mǛ9 ӤI9h6mJ}oG3˵tP%#c%z 'Z)"`#P0OR}Ab3]_ʧ(Mɜka|)@Ŋ ͹ҐlB@2@JYKi<nGJLД56Ϙ|"Dsϝ 0~֨qۥK1;0FPBMƐغ1IOF^}7 7%c?0bZONxҐh/=gǎfadC{$tTEKB/D4mۖ+61\hk@و6Sxyixevd k{5!66jӧfZzMj.+l[`Td+FS^06QV9M*Sy%o28]a/n֋CMqOS(E@(~(q=t0jhk +h0<&uCu6H#c-I"kXW;s>y9,/I, zۨi'k?6n'm|IJ`3]d N(Oy7g\k٢yVu|AuuWEd!Is1qb)IWFoFÆ~LR]VܲgӦw쐔}dX,#~a;T#￶t%~e_oP73t&(_p 1 Hݢ[%sg=0%WҥdZ%-W8v2?br/f/IJ쪤"lAnn%}ڰap77,a0_ s͒@ZvkYbo_pe5h`IH!geY]y-w,y[&e"Z]u㍖U]Kӧ(E{䔵|̲h&ҳo⋦)d+w`+>,k`|ߪզ{ǭ+AΔ7ߕ’5cCdA$| >9(~A'bd%L?|+D=G S)nsLΤgkw 0!LTE#}0SK[_P3. :s&f5#0eQ{x^x!+/(iE@pZM_bt0)1_&ʡsWi_ķ+Q?9cC_ depRo>n 7^xɀI;w!gX|O~]> i&oBL3|=J=9 yօh,]ay0 q4hkާ0i3^/E>3qK_WhCi"d&|Wp&2c0kV 1 ڵ>Mkh L/ï0-t_T KTp`mQ1OEy^$:tX!qco[1q)H)l} {{ޞ=d |/Cma?Vugc@Z8}.: AM|4mN; %[.[v21Jj޶vo_ &ɸ>V)S{w\MG^mYA]J(I"~NPm^PΘ!wp<nQ!VN,tW+i;.MC7&{ZEIT`Y춖| .( 74mOV",ȱD jyz0wPX<'E0POwg&ڸq d؊C,Ё?ى+,mh Jh*!҆g~~=$BU$ޖm[pہD6"e)ZU+O>i|G܂a ;p)Kb rYۜM|upwC1/Xh (E5G8`}-q+T%Aۺ~xu"Kֵ7/! Q:`T*D0r0Ԕ`瞳oBmۊY L/F*~0@IDATY3&Į>ńCEe&$Բ`4+2K3^`^ӈn@^=۶W/}PnqU4wݺز.<*_U-kxLI6o% b ye˒2Բ7_9shòʒ-ݖ$F5k8d0 \..o đX"l5pItdTN۫v\xD,,E&Tbֹ+u}t荩SÚ=ڷBK|H,pX|drsJiC.e4 "T-`Ĉ&%%sS(C OS{V_UԽTTх_|Řn8I$VO7Ouk$bLEkwFbF\ E a' 6TR@׮0N;DcqQb;l2$ #iE`-IL4q#tאY6O{0>ʢ۪}n+@jPE )p v< ramTբ 3T{$g,Lҗh<' -Y"B}IQߊ"jgztO(0#!UmƶDc3}aJi MFLKkɈfK|`"5W2n{^EQh_ ]eAQ'H ˜0p˜kLNZk%y) VICRJLkMUȎK;woqJL:iqZ׌v< Tb5nx%vapbI[))A`ĉ 3Kr8B@-Fe (Y(E@PEP\Јx"( XoE@PEP\됊"(2`D99 pDJP2+J&K"yLO(-("ʀ uSPE#  "(@a 0P1E@P=jUo ;$ВRR E@p^Vv"p':裳E )T\XPE@H ʀS("$2Ɗ"(@jPE !|ƍ F"(ga-ZȰYtE0P\똊"(BcfΜիWǽJ"(@ P( .Y7x#|ͨx3G6 1j;-TE@P㡇ѴiSt GΝQT~ׯܹs1ex^+xq-"("PT(pM41լYʕ/zpM2_RAR2jvލo v0@llذw sڳgOH޹sgHY*Up'qgҥXvmDJ*oݺըC eCf~P_ʹQdI}!eYnˈrFc:#_2bѦMEĮ]@+VhڜuY!/R,ٳ#hܸ1w8͘1۶m )fvZHwVZ+VDs˗~[nT(_Cx<8sCʸO??(?cQN@97{z8m j38w>Cw>#pQGEϚ5 7o6c2ė/{v8?R{5fpZ`y[զM駟75ϋ D']|ye1w1>O~N.qέB 9MSN9c{>{!s75ۉwyڄy'9ovX]>߫V+7w%:dK//B&Md=2qݰ-9G lB[pC>s i'/˖-m9gy&k+h˹#ޙW,n+ٖ+j[1-7~DQFEm+PDgܜGe"ɢ_~D[_Z흱ݿ]vYԶ_|qԾ|ݿrD{?~|ԶZhp#^ߺlvm-[0vQۯ\2M7m.]"ڲTw~鈾E;uіH{EE+ڷs-ܿzhԾ̙=m"tIQ"N/:TwQK999|rol|vSx;nmBn@َ;7 J $jrv<|e7nؿގrFN?|Zw8Q:tM8 @ MTݻ:u_=Zl~)Gkm|pԶcǎ5kxm 1q޽{D5<mwߍŋ;|/]Bj'xH}mRJ$/!on4)- 8JcIJΑoOg@:!fXF yY> o_rDޖEM8ըQhXo@G%nVRw?XFǎC󞧄 G2뮻.d}Gי%.yOS2]ޣ-аa@MZ85ߥgϞ3 N}2]JCMiE&G@ usa >"Sȑ#MwT}ɧ22tWdq$@,y>+y)^ċ/-\ $z PaϑjqKJJ6^ks&l\/[66uD}{m% 0PNK9?q~S7,pmwy'4g"("Pˀ )ۨCMf-U 42U%2X"Y0ͲaZDzjAi!ݫW//+)"(ـ@L4N8 :\̋h-ëWsSOMea!çU_ACYUŵbZ_>:UNJ5LUeFX46"wpXYedbeB9()@ :r=| 'Z/+)"(@|2XMX-WE@PqkL Kk2Y"(@G &V>}"܋$ډ ŐoTp'.+"(@L_2WFP]8R̨GGy$q1rE >g׬^1ZE L0`53ZXI ݏNIPF/ F(@\LxnE7a90&oºS*"("y2`:3Su]#|T"("P|ˀ%ݖ p\m׮1{%F7Tlz"(@ˀhd|I&&3d6GyD:1))@|f͚z(~#Ub@\TnK,1jfƮfxHxꩧ ,Vs*zY2笒"(q#Lry2]dD3("("ۻh"FU_`j"("(q [wG6mPbE*"(@ɀGo٤%իg/_>,:wpLPE@P@5gyǏm۶ ,@˖-qWR1{3f("~'R(@#W~7MN:&Lì . ^hև'O;f;Vz~@?3@P4q%M6>Coܸ[n55j0hwVE@Pet9z/$ ݼys˄ #GĹUE@P⪠ov,]ԬYH& 8i@;"(@eeʔoʤ%Y&Zn fϞr=PE@P2`efO8) GD?Ğ={7ZE@z'rt"p)GIP|3:TM+)"(@$=ZE@PE  1u_ : Z("$@ XcA'6W PNX"N R@5`]\n=ςB`ܸqʀ lGp2`w,RJ=d,YĂ5j ZIPE@PG .XЉ-E@Pdˀ5t2Pj[E@PE qai,āԖ"(@2e :("7cƌ3gX[(@V#ౄ wڅ;wtLs e)^]Ν;'w`[gŸ @lٲP@2J'^bK.p|G[.:u7RrnR^NlM1V/JMʏM¹eڼmf6Ld^dr|yʹykiT(O)^=Ӎ5<aϢFxG矛<|ڱcڵk3gR yyp^p/Q"Oh*ǜ[yɴy|^L疉=i5yW>/#)_ԪU se̙3?-KIPE@PG .~qw㮻r0'q?߼)mW_}5>GԖ"("zV~*VwXjU`皩"?o6BP [nFT1޽{ >0<(@@n(@E gϞҥ ze,(묳I'o]ۊ"("q0})~w=GyQ=!&}Cj"("d43Qҹ;*T>;#6mڨEt8P1;"(@5``-XO=7o?'|29xD,~ϟo||Aqsr:E@7`"௿F K'!ŵ47 ֬YnAࡇ ( `;w.|I&G-ZnC=2Ή\?=8Gr&m`x`R5N')޼y2cVMڝ"d,q3koa֭[ δ9|W Ӧ0[oUؘy&D_Hnd5Ő(bT"Jhm^{-1;9xu"dy<&O Yotl4s` ?Ӏ] J`jՀ>} j%jrC*Dh~eÇOH6x@Y:Dk{x(w}o S>H@wc/ O{jF 6(>1="DK=b4m QB  СCP*bCh<"pv_d^|) q4d)8 A\i7`(&kK rsu]  1jF!1c8+~2  %E@($.SL! \ֵ h`a{oS+v$xmS٢zu0M2ҩSmi7ib3,Jz(0aʕ8k̏ɐ0v+0`e(s%X]0ڎ%DuUuÀA鼤8툟7˩:/atibY?u#K\ 2;(C".(㢾}w/ ,/GTۖђk$!GILb~F .vAfi_}8-4zt) đc%ͶL%kK2#Bi{E@(x2C,-[&aMhJ&`x ~:b!@#&Z^w P;@k`6mhLlW$1.::׸LdSE)bTEe\DHNڵC 8hJf϶]|hDϏ}Q \Ft:f.tbA]3-RvنF`N_*B̝ .PϱY_ΔlA \OߐsFW>[֟\ P!t'[7Q+=J\o[իm>4F:,C\+- eq%{j\oknO,bJ5U|a )DmA]E_ ͂s}= &Z;ו̈́d'Cjr QC5/G 9őu\F>_X%fRNN8) Ŀnb'<].pvV @ڿ@#4 UyÏ $"8)siPO,Yf_.n8h{RV°pmNŠ)$|9ے+[ܖ} c;Crjvhȥ%KrE\s9׼hZ3 s$/:0)CO6>]"7}?z;"')=VO4 Wq1N5Nܮd@¥uoE͸~|Rjrn4 _?6ɸPڥ;Uq0KR͞9;08-)a׮ᨉvY7/FDhf.wF .c 8V.b<In:JE3%eR :'o^CxQcˇםwo|1.6NHfwͅg\D(2F1D>JIl8mIO5sŊ6cCJ\29@MVL*2DCl^+w匟9ppyqM)/vv};Sف@B /whq%zb"n⚰RE`ʔ2 ä!>)8jmf *82tJ|ø> q(P @mB L/ۜ0bb nǐcD&j-QҀ׏ܸHn#)^p ܏:F|a{B)l%ּx/Suui@3R!-`9QJ KЉJn2PD|w̐>}#NAM K)8ϛnVeZ@2Lsĝüc0 ׆ssg.ƍ[y#ɰ L(mҥ1cZ6̛S k{Bއk,GJG7Q*v2NqU|\kڛs;3D%˕rZ|:>SR&׆b1vq ¸68-Z~APLeh{׈i2x4hmE2eJ45c0ښu+^TF~9d\Ӣ![%i5>JbY0O޽{"d|f|Y- kg f ʕ7F[mR7-c 'k_/l+ovx#xW@L0AVlhǖw_yp>+hUM v|KF_WżutC?ZPfƢ-`Q6hI/Jb1_I/ؾe6 1 b ZG b8~3~(8j@w/M/(N7ұM4U\kUR 0'Ԅ版rEb)t_"PT ۓRBOlrY? ~mE $̀T+%%3!GDE `g0ȥ)+sJ*:Y_b1[XpfKVGIhɠQ2eiZ}2۶t9.꫽NWF~qFf掦˥QR  xpшwNHV5&!_ԧO(5$$O 4hEdρfZe1`o"ؘ>]nM8 NurbmڴB҉=(}{;0-ip:Q׾c!SRu<N"ov,Y# QI=1r *y" &ԿE PT3"IEbD8PQ %ٙٙٞ非_}>]]]۵^8))G"lXnPH=.'aߺuo2gf+ 1Cʡ_Brz!)A&VU^u'RGq[xz5C}uAG>] Aw_Y^DҦMPlհsڵTRR 3M^}ٳDm Y;/[V ]W_aIK)hħbqM Z_0.1;u*h8[j*#4kW [U^Ul}}y͞$wȄ{Y[ R|cph pͰѽC#q%,\XBoO @gSv~4IxKGJW=%\+}uh?e UX(`3̘QK^xa#Qm.T_}05McnTW5+뫢.) FKի TUEfR__2{x"y#A8mun#5R#]:_[t/om7uuxG>0zo"I @jc߸H@3jn֬mH$[n=X81s}٫#(^zSXI_˖531ML{Dt,Y.8Re.xÒ,'8]#t?:zNBw@v=,tLAzLA`>-;(a{5J];1)Ӯ]zvalHpΏ숔_0}$8k,(3ΰ}E8aW̿$@$*:QMa(z̟?(aF>.L(lçƀC0tTՄ]r-.|]V7zGkd YAJ);<"q+A{!: %%X[C| sg. B@"' $T?r1zXBy[XI' 1J߾}u.o 6̜rDS6m¾PC\tW:zNGD5B0^ʄۦ0a׵?'cX"L!⿢GXF$ 0{US/;תUHr@9`X+cn;v4C5zfv\gz8=cCp[ ǔs j//EfΌ} v{Š5(~)XzͶ{,B=XQI&rց3_ L$@$* Y5oVEp| 9Sƣmb 1PT z(WYWI2'4QGZU8t(V%V="%H@B ˅bxsGu^ќ$(j"29:ĉA5S.LA7 m5 @H"W>H&,0f"{ !=   P{Ւ @"T xD #HHNDH nV=͵:cGKIX !@̆@HMjbrz{!]s&WK %pJXH ̙SP"04qy{$@`8U<rCCT3;*$@i @rB/JH*$l$p%;LTpٷl9n pHpA`„ g(YE;Ԅĕ4{o0V4" >a3b[HHQ?_ (ҸH͚ǹG$>TcɚH 'ԫ' I &}E>$!0@[DBTGcc. @vG鳔U"EE"\PU+`l @[/>O#덑ӥƗ+bN q2l0W2.>E^~Yd},YTW"&ҼHZvʏ_vȑ"i'FDٴ֭̎2|E^o?~J(r'H6[:GM$N 8I ['ǑKW|`<?)r]"=T#A i^XW/k-WҨ;EEO3FDxy-#k@9dׯ+q(%Knyq)rk]cDƍ60@,5be2H{/r>m)% a ۶@1b zHPԏ=&lHǎvޞ{JCϸz V9"GeA%/"&һoA$S_z>@?'Ҥ]I" PG TOyը?rﲋ!^ ';c3J?{PNq/5ŅKe캫C 4vSO-?za ~lËVx}grHw"\E2vCG-"=z{SuzY1/m0]axu"GYyaxy6z9~Ɣ7zL$@#yp<%pYgIfLӦǻrH˖v+VC°Hvڴ % +(ZkE;Fo_l߹sE-Ta^ѣń7İ9p93nCFX ~@5;VKi>ؕ9Vш )$IRf1 0$`=mzܟ.vs#F<}kR}{7Wg?Ty9H><6z1=c7 E;i ZXFOű::P'Y/0BL$@ ,M7gͺ.r62Gl`miѢ Rm/-/Dsĕ=h^nuӦD>3o[Jb8gTsKJJdZ!ƍ\dW wb @6!zDy0r]@Htb>~M.>Gy *RaD*u O 2~ Ј&_yA.$r%^hc~ 2_u >RN)&Tc8YE\Źh~h^6L^pC oj eG^ڗc)^vXHHJ 88Y $&EEE ( @^ȩ!xbɬ&0N 6@$@$@ @$ P @Pg:/I$@$@Tl$P|I߿5^"+ZAP$0uT7o^NoH 9'NjIHH -ӂ @r$@$@$TiJHHH 94JK@JnYtiJud @ϑw%:t mڴi)& 8%]M$@$@qPl  tY7 !@ I W%KxQ5$24ʲFq+`07BIR&pY $O 8yf<HHR&@2BV@$@$@N   +e8ꨣdӦMO`I %p>Zޘ p 2sL?FHp5HHHHHH 3$  *`  * @%СCC_s * n/_.H|O  "*\|'  Ȩ޼y| !-[Lf͚%{r[^|EqzɓeժU^ dc(..Çڵk7ވ JCRP`#tQf̘Qv!j'iF5jV黬̜cǎ*I`P *--%/#//?,˗ޏ WB'^ʈn߾gիWG(ӆ ~/vZ(kr 'Sˁ(Vg!WVuDǸ?xURJcWjРm"+NOn=s ~o Ӫ[nx޽,X ײe:zNI}Qغuk‡VYff0&[E#2ҷW^[l1ϑ#/D5m TK^n<̞+`86o\/^{ݺu뮻ѸqcԩSD^;pSƒDC\~C' n,){&MgJ@߼I~+6B6U |Hs#=C `>}(AXzRҥ,YD~G6mt547I oOٮv k~Qi 8.]*_~9^x dѣzMf:T7H XjȻԞ0zą_ dT!9ͳeH:Xo#RG-;wgR *JB#PpbH j8Qb  ƍg@ 2xx<H S77)ӤtڰvI'M7W[~m-K 'Ov{*ˑ dpy@`&ߊusuu.8ԽejYE$ )YH c3wXBuW& Yh uȯP$@~#@'Byr@Hi}V~X|-){? 6CJ eK{K #kF)l)qvX?ze|]7,";$@O yLpܳR_]E%#sIbsMeKw+E5AUOIϩJW#MH Ϙr/qjoZbK NXSzE l($@!@jemp8)q~kHJUWH`}]yo;C2кZ0 8G':YbM|YdU @fPg;,(!gO^'reL*  4pT0p1p4R9k+o7 g38 XPjI`w j迚NFTIDATᄾr5<_h:V@"ݎ 1?T Ə +M L`8Syݜ$P֫o 3WM$Ш4ubFݹ5-;I`ݣ$8b>EW-rxW 9l(Hp5r@kN7և%X tw(ϊkvjeJf^=S#Vy&?$CR02$~TϜWa"r/ >]ʎ"gH2@ `iu}{#IÅ~Jep5ҡL?%ȄO( LXZZ*[l/\pf(ж .YWWL'Ao=5ctRsKyJ3XwexE2_RRvp[aÆ~nԵᐋ4/aE>@Z`7Q eDE:pd}X_}-֤Wp֌XEG$!T˒@u(;[!}@\)#U%y  ]b1F3pigCȒ2@ P(#4m#i( @8ZA6 xL`ԨQҳgOIp6<%ʘ3Ν+-ʙፐ TpL  2**$@$@$PuTUg3IHH' @ pRLHرc~H<@${s|L>?Ǹ( 4A͑ _ " iT9xys$@$@~%@'Crŋe9yo) P'NjI %Æ !CTO& Ty$@$@YF !m߾]nݚ#(ةH6lHt wreY˯ ۗ/0#2E^ڕS߯:u>RN)ZjIҖ-[kРA.H7;$+E$@$@$~TgIHHRT"b  H?*3e$@$@$P)*J Am۶髐5 d-*}t< Y8TF)3 @z P'k#  W]ab!  H/*dm$@$@$+L,D!дiS]vz*c-$@YM(Ql#+%XVK$@$@P'c$@$@$*`Z  HD 8#  P{Ւ@,=\r%1H  :8o7&M$ˬ: /@!HHp=q/ /P1P  |#@oOK$@$ 4cBo>,_nI$p8<  P{Ւ@,7nիW:_?5tbʇԑBrrp%%p>: qD7v.f>c]>bEXVt߶yձuE*r"3 xO {ƼBذAdŊBods lQWq]_ ټ9cK\ l%@Or@YY"UgQn'A*ƫ$@Ȩެ|A;;G jղGP7o>B5/${t.RH"o{Ni\j%r}vE`ב ,f/$Ҧ.r3G$ 3ڶm1B]Hnbرc_~ƍ:tP#12ICcTJ/<= 7\yH߾"b{-Æ[Sv6OKEf5г{񆭤qk9X/;XNEMYRd9T%KDw=pH 32[7{O[G{+^擀'0$~7-:^\^BTTd#BDl@ݼyTMBJD*,,Q[f>{8aæH~h/xܖ-kfI-2b޹O#Pm b s0Br^+GG.M]70/|j()ari^:mrz!ď۴Ac_>T0p Ȕ)/^@Aqb6VZy!ČΜ!SE^},E3E a$V1tr#l/]Z%嗢eE$9+`PK|N=]hCQTRa~ 裏>XM'I )Qk}QRhQ6lXmzɆqԤI"Pb+mG%a y"#*"_"䬳_"*7]쐙9`a{F j:H/;c 0swW!]wիKT^AhѢJI= [Ptz7n_"t:z$S vwˇՍ!pIcofN: Tu%c 7_Ip sx- .@WAC#\Cs!U-dh_yB`|`6wݺumBͫƴ+n* n 뤽4z9rvvͭ}ED+̧SN0d uQ2Sl۶}ᇾtu )F%Kȏ?(6mt\'ל9sA-wߕc9]E]EsPd^8LR2^0?x_Wa}ge5kȽ eҿ3۷o_sSN9DsE#"J,C駟G1O??cCU`=[o%W_}u($uHcjٲJR$`1K,tu.eg~U7}KcV[*tIu衇ZkO=?js=:^ͬ}Н-lRw2;ҵ4q7Z7tMܺCԓ@CyƑGi^g$u$$$o7K@Ygıhfnt=kW XcZ^{mKjt2-lAq#}gFIϚ5B2pqUWОf[YtP4m=CSZvZxI p8,(p^U"&|رcm!δ6SA<¤aHoy&0Ȍ3pW\!/!yg駟ɓ'KvB66l`ꄗWQp%O<7 d#*l|j9ghBZj%EBlC1A1x;{([nEǔ?SMyիQ(&O7ntD;^ve؁RRk|Re>,и<2~4ܟ͋K/$ګ5z2lذP躡{)J!@VVV<& 'H㥳:Kns &0BJ \nvzbØIr#͟?_qYp|B۷/XtAJLRkR iɫCҹsgcXh"GD,jGCF=l{b7`J(^RrR6m  HV%-]TsЩgX>K/ԼC//? q~tBwޑQF b|U4zw?.DH 8ej1"BKjeqș/EfjDJv(z9/ =rHAwM>TuP4]lw@;/0Zg?7׮]kz8`֩S'A8:9o;*`?!ʗ3`X8^%_{OL2,s5u1rν|ɇ[_;eb} .ghsw%aZi0>7 d#ƧFI Y(daUٰz1 kj휣Ez_Xn]' Oyf=|^@&_ '`x#[z0;EdIh;$`- K'/lr@W@ ?p{uV*bITA\H1 PL  IHH &*XI$@$@/k'  cba& xK [HHbYG^zIENDB`factoextra/tools/README-pca-variable-contributions-2.png0000644000176200001440000005672213572034643022623 0ustar liggesusersPNG  IHDRPP& iCCPICC Profile8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o@IDATxE%Gɠŀu`|W]ӊʚs9ukXD #̊ $x_i3Lw;wy{¿N:uTgHE@Pj@Z("XjCPEH ~(2Pm"2"E@Pm@P"hRwe˖Ʉ d̘1oHUUlr'J^ӥsӸKcǎrI'w*ݺu?Q_wߕ;S=\Y}գF{ӦM+RyYyeᩤOX|~m{ .=z̺vϏ9昬$o_J:?mrqПڷo/]tAɺe~swAcǎ_|Q~ۮ8Y{cN-GZx?Vu{i6mXF) 6m2﮳:ޞ{/bҥހ/<?n1?~|&\ 8kҤ3Ϭl?lq8qbho;q= R>ClW]uU{ 6QFa-_<+0SN9C.5kk޼CŔBHݗ43"z7yf諯hk`ifAH'O}יWds̱ @gϞ}… 3i֗ h]RGT`%K:ue\+^ziֳ0W^yŶq#g̙37kӦ7cƌR)>ԁ~_,x(#{r뭷ʗ_~)W]uU& xޓ^۬gk b0̻LCΝkc֬Yϗ^{M͛gM%KV2߻j裏W_\%FE'm8a￷o#}J+$fp*?KvF9speDQ) [#.pc:uP@hQ\re7GL^u1LL3L:ɇ=i$5jL_/,~tz. oܴ?uw/Շ{'o׮]-.f&%4};yz}zG>SO=5ύ$jtkfQIyo}ix+Vț @=Ӹ3G12HZɕ_TeyG'|k۶=3*;γ>~{ 'x{M r8Hl;xF15bZ=al&?߆#! +3wJؑGiBb=v]weM^w}E*aT[+i5D`j뮻zFe'!.sqwl$N_qidIgqעE [g馛f0ryFmI^s3y׿2qsANIXꟸ Q> ԽZh߮z}9{8ᧆJ =Ôs /[oxf@YN߿d;8a\L9^xmF:: [n4vY* );cm2Jk<<`@i@~W 0tP.oX @;,57xOCg0 r?ܾg{x%` '0ǣ>^Dt*S+lĨC#xF I.>~-A!>SNYsQy2 ܸq*bsYdwyX36 Ey-[o?kCWQ#7.w_ s2Pj Al[@N}Q%AGK|Qm,cH)衇F.3 6&G\A8zf*+HJgE)@#vmI3ODGzfE53( Atdȶt|[N>|Qp"Xä]V3ft>?*x&8N":#8fQGesҷc{) 3PƘ;'Ď;h1S]QI[TM! oߎ/ԍ00*%Sue`E2]SwuMegƄY A5G̨{o]H5g}\sCIR>#HߙFmgfĖ>vtUP{۬.t ys+t~V6{j15ṙ 뮳2s'UE= N;$$>BAćQ.| цvyg%_Ft7tS3)Fa={3;:gyF&ʹ?B7qׇ?=tV@qkf#3w0r.詧Oy}ݶydM6Rd3UcKT3e="O0fFf:8l\ %H.os?p t\i.i>-7ttI6#@nQSXFcWYdBzdsZNLIFHFרu'iƗ[w`Kt6AuU=j$_zk|/ cT07V<SbXudvgP#ީ ouÀ47l3a55$/V ͢ ^mLgk*ND6|qK47#uJSAeȍO0W$3!< fm}G^Z2Yc P`nT&rWە|VXolz֝Ö:LO󄘹4a0oYH +P7*.{l)j+53ǬV!l;ffP_'+Kjhs,-J1Lmm&,qcz.gڥUvSx ԆkPF$@f6J}kHؐ!C,6fĆ#`#0LH0a*64VSQTafQN_AvLi%Æ a{Ɩ 7'aƜɦC=T[P$7p\DfTڄ 34>$K R{ʖH0=~zf@= 4S'TK[70!>sB,2R b\]U_< #q!cg'/nEؾawk`ƶHF: 6(a2頞\RӠ]BcvFQ{* 1R3ss lL믿]zqT'g5U#.G0lͭccty׿5kL島r3[tcOF bFϻQ#7^ /ִa,T:@3vd+m; 0 3* ?OkW?52R@ 5:NzV7^Gc^@$(X.7A"}Q|(Ӽ0 $9Et _|ņljm<`Հq"wASi,t~oxFHa]:,:DxQ( y` bL"P(EPP*ePZFE@He*@% jY˨( 4X5RE@VB-kE &F(2Je-"$2D`HX]]ku@1Psu:8cb3c+ wAx>"\{I͖E[R$ҫbF})-b'3-brg5i&I@SVB@heշVPbD@h`jT"PY(*@(LJP* eUZZE@e1Q)@e! [K(1"~K %Քi(x‚̞=G4ilN:\\^Iv- /(@e"`c?uY?ȅ^(Fq7u]'uQg"(ďcySE"82^ 6&l27ne|ҧOi&MtxHKң )ksq_ZQ4ӣRWDqyy7c#F؎ ktƖ-[f`= Qc őfݾ}`{ߴ1Jmڴɛ^`&riŰuGX$-Z&ۥKm۶ҴizԜ!œ&m7b,-_!Pƴқ5kJa dz4:e~m>cҥ0=r*nWPz@ I;z#CϞ=e-I&ɔ)S9rHr-5`9E@PO:O=TD.a͊<'tGː!Ccǎ|.o(@F qJk(4h 0`,1ڹ"( T+t>4?EUE ׁƑICP2X+'E@( E5i&E>" >֊IPeeQMIE@(yR@@hYTfRP#@chE,PZդT2X+'E@( jY'XGq\h&E@(Hĉewe{s8hmntfyE@( Bw}g_b}wr&I8?@38ú<#7o^Y\3(@e_r ^z&:H#81TREȫ,7|3]ݺu+ҞyR iE@+M؉t,(q(U.qVnz(@] @esΑ=zc8vqG{{w5\P@ UW^y.$vivRE y(H'Y}e׶fL)LE@$2P0vA;8-.{キ=S47h#Y3ϴ+UP hN8kkH~Oӧ_a*7ԩS)B(@!@e˖rYgɧ~jon&rswi'i֬YaUE"|r+q:ttIr5[8=X9Sm۶lٲ,YFX , eA,]T$f/e9yPrœz…vXJxɥGI3iB/͙3'.|XF5{TTT5]~iiZoi3iWUUURzP:|p$;u$ӦM:W_}2PV1ݻeLFeu3|yhݺ5 zn%*$F&J-K4_~:x!I vA[htr łevn\h<۷o/i73`c[]J &EJo֬YvMZVILBHoL}LZyeذav8Ӑ@AUEB%PF{;Y<•0{Az(@E *^qrW[V[M Ph!E@(@o-.ȅ^hݑ#Gʶn+]w]ثLP@)<Ygy睭&t@;xnG4t " os=[nGx}x fٝIt4i]H6"(@$צM벎3[ *\s(!&CUREȻThE@(2BsE@P 40(@!"3P^ #^w{キP\P@dA?,?{O>Y} JP0"3o]{9ٳ<2p@1b\z#E@hDbx8_}ks$:Z(E@PBd3VZٝHL n G0}qCG"4L"1P(IGzp:90R)"@$,xbr-mrN2#E@P ܭzֵݗ_~i3۽{w駟J@UE@x 2d=07￿7 WE!N:U8}38;)g+)GX9O>8nԨQYQ!~]vŚMe~`WTܴt2u5(^/p)lɒ%yӋe!OwT3ͥbsuLrkQ-= bt[Zgh3iWji7m4ouDf͛7&LxbNM6n KonܹՇk.9t3fsOۣ]q$%5vw… Ͷ58qq,X oz(4д)!ip"j4{4&i]Jzm۶~ᇲ뮻ZCz_2@?S0ĈPJrȈزe~93# $ l{%vw-0Ϳ2bB۷o7L-`>}oؤ Ȏ;6ڊ>lWz D \\xpDtK  ^A,F%У>Zoy؁Dg}eRe~x$9rYge#cvDsw4q|2PA }8}A #4B}(@=@ ʈ#%a O?TƏo=oVdQz5|I"(H )ƙ2𫯾Z6|sAkɰaÄc=Q޽|9&7yħ[Bኀ"P4'wq]@•Jn$=2SzJ!Vy~(u@$ Shĉv;g}fv+lM][TEexG2d1c<W^nX ("& =sҴj"( P wޑ X;09{v(^n'|25`5o3ȀeW~AT zR|e˗^X= a[JG8ƥFQ.WiGSz̴,B? m?? 6LMtW꘹zE恬Lk:Q1;JC-%i|GMջ]t2 O<;h++\(|P:IXńqyIТ_|ݼYs5c#ߦl Cn }5WOn𘶑|b‘.\(OUL\QYhתU,GQ-4Q0ңH38v/B|P\ѭ[7 r6)"Pez.|Cf-"$@( |z|IdXTE jƄ7ٶ /X:6{J(@2P>_E@P:SxWxV=j9s™IJ"T(\r%'X_{(@CF 2Et4WJ@  gG6mm>|y䑕QP,B% &K/d?Xc'*k("P 2еZKN?tGF҆S^ϯ"d!@;u$ƍ^{V z(@"@<3Vp\wTC9^IPJB 2}'dȐ!2{S H4@P* ㏷+wt1 $P%E@P* H tܹ2m4kk׮WP@"1P΄_}{G`D,/MV]\ OΝgL͚g/ +ǖKօ+T((\~ri?`RlPS|L?,E ?"NVV>S 3gs15EyqOqL2h"A 2:uj޽\(@!6oܚ0aL+,l㎩UiU@dʮ*H}_U~g{FSO=G[s(@DtGKeʔ)i{w>oh "(gqctWHm9p)$ .@`~ ΕO>^+"Po '/lJ+lMm_=]V۵k c32\tMrUWeFo_zOx;sŊպӮ f^?]#A''zB ky>¹A^Cn1a?m$p {=luʄϚ5 R;IU׫:y~n|=>_-vo7J. _MYp-6 G.J?~EtsxDzҟ f'⣏vɗ_ٺssf~̽wݲ|ܭ2:oCV7$/ ~O9C?^hb9madG؂8#)|q.\2HOt9Fi.WVw3Z–5nZݭ&︭jʽr-dRuvs'a?ԩF܄!ۇ*VFR_W2W5hh̒mXTAUGYq9;74wq2r*ìn޺56lh[mOV0Е[F&yʸܴ~Ͳw 6ڤo`{f0ucO)v0Rr}"",=zȼ@2/.^uykwW{lMчz뭾];աʼno]pP?U"8cėSLv!t܎olb=)3m,Jm५C/5R3Ά9qLҴh"y_icAgi9''-ʈJ. bE 3) Ձ8.L`Db.Hq&YRF‘#G :V%E@PPzE &Ǐ>Hnv<1afWtE@(Bu/{}]Pa $B)~sԳV@Nf#8Fo}9Ia>C3W@(z^ -Ä "2FE@(CBN;$>|嗁E3fݚ;-|YE@h`@O9y7-Yge`?P`nt衇ZfE(@AB(?yr}YObĶju֑nAN: "4B(a4qO"\[2{WV%KHS366j!Ҳy&W(}j՚ّכK4#c>Af[f}v͇wx?>PZ1r,4"mU;*)@yWEVE @("2P4HP(((@@@ E@P 4 J"(( EE@2((;" 4 RE @("2P4HP(((@@@ E@P 4 J"(( EE@2((;" Pv͛'˖-Q%ÏA ̙3\tonHflK 3gl^Euupxg͞%7v\7r%M+VI̞=x/vܸ:JO!;ӴңzCwQoײeK/m۶m`Yfw͟o6TK\PU:պy}yP 믿>}X n5* 7|Sƌ ;CC{wlٲ#{7%Kd Z|hѢUW… MzMp HU͗n݂kSwq!_z_e˗MȰg>a-nڇ?I?>X[iܸή~vn5k&ޓgi׮]&֕VZIf̘bܸqrWfvi'iڴi>saTt/[4ji$.Y7fM$.CfeA3@eEpka[Q߈ԢiX.\T7mآY-Y(L̴CS*dXn8}ګ^|4S&L^zwo+ںFTmڴ eUF҈ `?șgi_SN'x"쳒믖o߾x~d6mh"[/];wDK3{lڵbJMfܹ*UI2vVSA-_5kf4a `Ќ5ŏb/O.]d̙Nd E@PDN[l!&M)S:ő#Gʖ[nYdQ3E@PE X!Rj}2dرS>RdE@( :ed}РA2`YbVQ*)"P.9(VWEͧ"T$uHĵЊ"`P`R (i# 4m5=E@h0TꫯL41}ZY߶6t>KzK2Ll$ lU$М0KF'MMyjQoI-=ɦNJ";#R+]xᅩg::ʼo=;3K-=c?~{OSUp+@%! j[˪("bCX#S~d5H%8-vm{WUUewtut8XyC\96lܘZ[bܲeKYSΌ6H6dqlelh:.rv:5gIQzcJP"(i S4P4EA" AVJP@(|ɢ(Z4*r'ǃ`mlKCNVN`GeYWEoua:O?FRpK^Iӄ wy'2m(gdYM'OX3gjiOQ;>s$%\bMQ]w]{>< {\ve™0Iҗ_~)g}MGu=#)4`h\s\wuI%ee(G^ c=f$/:K}bI0q^+9*i?!gq\uUo?n3~@H3 ;Rɵ{g:g:b7O<3{=aHZ4o;=&3gLxFJw=xf0/{"e#A3z~g]}!=S}cqر{;L|pE{_3{pU9m}Qzrqs1[~fWڼys+!!\~VtK/$?07ސg}Vj+;ʣobdZ"(N(̞#Ꙟ!]$\\SU@!?#W\qE8:'|R8֚t`ox㍱KZ GNjTUK/^>f߽= lG^TIg{(R/'C6G-̚&fGl&A4OBT*Q_F ^x!풓ia 'Uˍ鼑`I&vjņ+z_6^:=~Z&44.G8ӭ=D9֕qӚk)xc:,c@qߌrrܤd``mf2l0{  <$'3Ғ{oax1`9e}aYo*{jjĈQu]6M?_n EXA]'}b?~DNŖ?g*7V]`p2$ez2ץ\KtIDATᆩlTa{FJޢ>0 $e dWѯpᄏg;>蠃<QWFS0DU?LLfqa=[3+H֣-bu,n>f;uAj+_X 篿xi%T$2ܵ9g `Joj33(xvGMH' h(]CqLK^{p~u]w՛3g`rh)o`f?+WKuz3V 7`t;>쳢a0COlܼĬz{wf b%\̂ծN);b)| DƏ/f b%^.or)gTQb5>{ԟ =k̓|1Q0'<3q`h&;Jx$.ce;Ycq*af&ݷ~iwI'ei@:6y0bȨ2\n CF;#yF/g2vtqk*qD'4j;`R~aZH,P9§[sLEWG7=^|R 70Qܨ}1a^1q}ꫯz-AL485XhKL$3:A([JDs7[oy1Q: C׵gLi*&9I2;3QVE]7. LI4 0*ʀ~uL(b(|S)] 1ι꫽]v0Q^qvHtevDm]\ "J{t$G[[HL(F")ESmș Ic~N~I#YA0J$P?aVS3&tV_][,,T>DgϞk$˧~ڻ 2q0"EFSOh ڃ8|GdTbtj;TtvA`־6_oEwԩ褊)_ΝN/C SwY21CؕR޽{~Rҽ=ؾG0k7.f mڎYGͮ|6}k׮Q~ƌ6FeHX=cdg4ɴ,UXTt "I$2:uA fp/g8EE†*jX5N¬"M|!ʎ$: sU)&:[)w}cô"dli;0*e/)<>+h fC>V:0ӄ.]R؇1c! ƥ3#f]P` bJDdUri;Dg5qL4.}uc}q>+DaF"[7(N/V*8|;vmgQbYo3P-0G4ؗ)Q\l,jF~&Z$Cr95<g8AP:82H MGg5?sN|ԑ#C3Qf̽VT`0L 4mGYo[_hu2LVY5⻰ku# ٰJsVK!zg2:!4N1iWt"8iJXi5:ӈx1xrbeUq#5ؕv3m'X6Q1 뭷\cڠ֨DQ¥g7#ò+;Su_Q Gx"qP.ٶHH#f#t0a=~N{v*,46GPíPSbqQ.RH5ab6=3ۺ-#MZp4đfbw7<#R͟u"I1Ey͞8=al!-A2=#vL1ӡB@ aV=b'1IH(`BB~ RDYϤrdP9* `.&yc'p 3Vb*y(pGWc$(i‚ҍVvS|0`BwG5zrNuSfb!!|JR?֐cL\7:#aJ b` byUt0zHg:BG*8LT80ft8yh\Ahw BP-:EE`\EZ}3PlKRa„ϑq\cg{oܝ<°XdC!ϖ>/1c-wE :Ӊ+ !~n+ipi0QvO0TfL&3 :cWpٗL\S,2ks`,T&\xm~ ..D Up$3e6U i;*?щS6DQ!%M0eaC?ypm%.<) %9&BVVp6T9y}|!D.]*0̶Z([O#yZDKM'aUSѐ#:Ͽ6a:,4T=kіcU`xl1V9J!̑`4|GN&Jn)DgvqD*s^3`~&Vf,xlJ(VńVpGp',_1Ra4r# 2&y2Ѩ2 Ml@-!tXtp.HH.kmaDNWtHC*P#koz/?RЙQ0|# N8NvLVߤ0 b2aIfd`Ͳ`bnY.⸦yDi[IR]o(qbWyS"yL l_ &%6W2NvM8Yp+0n) Kƕ>#: i#]"1`P`A FW+N [cI|9&`b?^cN'V\&ddCd+~)W .ơrq_T|2$1"tR::G}0S$ 0HJ̘0եñL&1aᄅ1 HLQ`xK-Zm4NrL%M,"0])iƕ7.3zgH5g<506ԚFdOګiZmZׄ>FMvYyc"%Fik<6t֭$7\ÍԆ9ZCcqF8ctK0 9]3)25'?Ӹދ+=#Y\UW]ՖHdO4biۣm4j1npqXKߺ3R FH,V°_nhٲGm .3ٌB{d l0:y^¸kXU,o?HhyA"@)iJvHN@Jb_{E=)3uaZI.R&HSqzGK75+lΌb=|N)yCEŽo!yX I Vqm*}_Č-ƕ^ԋ)"E^G/Un"d 35A2d;B7 b:7)-K%S9btqԒ}F)LU**v:^V QBN1\R3u5+ qs,1LE2q }CYHÀ_(禳!Fz\ta0t"0cf-L eN:tαj+fo=S91D{3kTPl,5~O2%GJ쀳gP=kI}pܦ!y4Ll"闈Xp_܋۩${!aH0+3uAjbR&UVK ʙ5:Bk(⦳Z{f!Ld_ČClc_~uQKYŮPD3%PdVnɊJq.P#5oܞdhvz%H8 1kҗYQ mĞ.i7=/8q7,>{2[ )l+Of,5bct '2bLX]isfٞ'fm8f64;I0XawҠZg (L8ye;!Dݶ7ìkHO(? 8WM%^ᚣ8BL}Y]]>efB:t՝A ;\cAc9:]g/DY<˕RYDB96;#:5nBC cųR%PQh(oa+ fؖ#>ܣU "] DCrde#0QxB$Q]CU ֬K\>bȭsyaN}饗+hEUV(x _G'DRZeV i˿pl [8ih||:cp`JjZ5VB`3g2Z HP=pDՠڠW ;ׯjaJ+y2ڗ~T AaLݻwn* (>VCiOG(2 +@%#.T&@kb!"CjC@W(@-P 늀"8:$WPZ" 늀"8:$WPZ" 늀"8:$WPZ" 늀"8:$WPZ"wL؝IENDB`factoextra/tools/README-hierarchical-clustering-1.png0000644000176200001440000015624213572034660022164 0ustar liggesusersPNG  IHDRʥ iCCPICC Profile8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o@IDATx\Uǿi{I @N((XbA@( + '(H>S {x 뮻+_ IFA<[ޫ{|Km6 \]UU˗/6Scc:|䠶V>‰ݻw{$?"rfe]F.I^nᆐ[ݺu;-Qz\$p 􈥌#uӔUV$aoGMCnZr% ;ɓEHK"ϟD?yZ~^dIN@@ mP7ZQQ EĬ0< C aHn6#ōvi)?n7wkLs?׬V@{gQӡX #'7nTo֐k'<T}/]T7nWgq 'i< /T|k_ ȋ뢋.$=.wu裏͛7Oy__r//rFy *c)K۞={4W/EJGNIQr~ 'hilA۾}o(?~C[8Ν 75Xc?+[yxE+--&O꫚I{ک^QD\ߵko|C/G?R /% MN)g0?I{衇T|@q۸_:'"xC%hsJC]|ZVVR_~o}KLTYta5W^yE1q-0DTUTThGq@@ Npz_~z+ x¢z 牅a?馛TêhhhвCqK)oa .(tXހ.ZHݮ@@t?^ɡEz_8QЅx^'0r:T`a‰x_î_!$Bc `n{$J_7/7靐z|;  8>LtQP7np.xy^zite|Z!HnzȸرcDq#-[FLk׮Us '}ՆE=_1|qh\gΜ9 ~6mX~As9\>Ip~:[~$-[T.d~8OdY7%fΜPjp  L' V4Es2ANt{5i=ɲD~$oa WQXM?:u<`HI-#1^^ɇ?S!QO0AM/7/ C&E:vB{$yo^PJo֭4}tﻤw! O!ˢ/'@@ NHyʨp~;"Q4i/~N ~f`Xޒ#ae?L]p׆ߊŶwr=#>ZHih?c9!!NH;ݖi,8҅8!4d\L?9_B#Gr<xa@\Q_Bp!D"CF.D̉_(jCO,k[{7GX+|@@ @,5nī4OSKƬýK=K BVňXWēIውy[qbP~;eyPT@y睧m"<C{MX0(BCH/|ibyc7߬D]z,xxKxoitnjCW^y%}Iaǫ3 IŊ#/_TE 3qSL)“O>I2L".@yG~ʔ)j!ySq@Ҋ r3nv4͍Ɔ|֥pOfKXOmnTԹn@qc˺zY;Oˋ TO}n_ɳhQdU,'e7KM|Fe"Dr۹&YfW{@)xKɘyev~M,E|΋|H=OeGGAs2OAVY}  "vR~+bPʜ('eL8"p  00/b * Ȑ-S4… MDA   C=ay$@*\DQY Ɔ@@'a`4+bS00e!   ` c"V0%SV2   00+bS00e!   ` c"V0%SV2   00+bS00e!   ` c"V0%SV2   00+bS00e!   ` c"V0%SV2   00+bS00e!   ` c"V0%SV2   00+bS00e!   ` c"V0%SV2   00+bS00e!   ` c"V0%SV2   00+bS00e!   ` c"V0%SV2   00+bS00e!   ` c"V0%SV2   00+bS00e!   ` c"V0%SV2   00+bS00e!   ` c"V0%SV2   00+bS00e!   ` c"V0%SV2   00+bS00e!   ` c"V0%SV2   00+bS00e!   ` c"V0%SV2   00+bS00e!   ` c"V0%SV2   00+bS00e!   ` c"V0%SV2   00+bS00e!   ` c"V0%SV2   00+bS00e!   ` c"V0%SV2   00+bS00e!   ` c"V0%SV2   00+bS00e!   ` c"V0%SV2   00+bS00e!   ` c"V0% fC@UUUѼy!   8 t]wѫP|~Z|9]s5cǎ8H-[W_MMMM%۶m-\x [/{. N@@@G ! nvMɓjfcn: K/9G!N@@@ " &NH&M xuu5 whFG7@ e1l6rݾ\.egg+_x@@@ 1r]㊊ 9@@@K `ƌfڹs'Io믿N3gL,   #ԡSpuѵ^K%%%4tP+|@b $T̞==\:3/@@@ * "p|@@@K s [t   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   L A@@ @q   Ls 4n~%{ΆpV6iZ39>S.x6!h'/uTK8 b'p5m$O>q5~X[xoH;cH "\U2ˎ179 vZٳhQI\hnCO L#"U[V%Tg_)?ҤTY}l(10@@LIՆL1 XA@@ LYm4C@@LIՆL1 XA@@ LYm4C@@LIՆL1 XA@@ LYm4C@@LIՆL11\5HB\ֶKG15ښ=>ޒcKnvr3oL/ ;4nl @Y̙3^y gy?~lMI=*$&zs'P<p@b#U,^{=ӢE,_nѣ}~8zvCBoFT Jg|U-݈   DFo:::tқoI6aÆmAl)^pcBxd5ux(a  KQAii)}*sࡄ^@@@R@Ta^{   }@@/={A?U4p?@@|k_ RK/1@w:3믧ADpsI466ݻ9dFȲ;v)@%KPK/~;9ĆGGq~o* oڵk?\N00 <@@@ K}b     L_׭[G7BZjcp8H}Q=ذ6 0tw-ܢ{@@@dbZ e/I&LmFۢLD3jkf1@vA@@ހt)[Jw8o<%6nH /`ǠhȐ!!Ej/    0!c|%[l=3tǫ/zꩾ80HO>$4n8a^صk+~(0w\s@nA@@|bF?>Z|9eeeiӦnf5*@@LG 0XxQ ?#r\dXh骠4|߿?M8tGA@@ D\s M<y5x3D   `:Q Hh ! DmeEݫ222Idep}iժU8PHoQ{ |tYg޽{Պ;LQĂ   `nQ{ & f͚. Fx@@@bdկ~Ejnz-@@@K &a sg%k׮UB.@@@tb2OnI9RJ/,c|34]aP1O>|'Ԯ3gTKO>dr:կ~~ Y.}-\֯_Oҋ0uT1]abr;:'ll05@Qs#GTs ;hϞ=K4zh9@@@G 0{iݺuܸn4g QpZ***R "LĊcwnذaTRRl֭TWW!⩰0؛6mD!cǎp;WʰLM0AYUUvuIǏ`o{hooMd)ح^ZM >2e l`oŝWHNFV5-ҳ)纓ʕ+ӈbsҤI!;;;i͚5!vmmm$‚S~6lr.˅e`'l޼9;伸//۶m wب]5 ˖QYY 2$$Lmػsy!I>9Wvv4zxɻ!m߾jjjC{H/֯oܸӈN`ӨsIdٱ,5} gVfo;'s }=i |nwN56 Y9םɡqƅxm.#F &m1$&E+VNoΉo؇@ܹsg ="Z8a (VaN%H[EĖ4X^,BFrᄁ<#?\4EXs;'pNJSr!w H@!N1 ~yѰpׂ00+ ᄁ< D 2{YNo"|`8a Xp8a XqN(w4pE 4(0߸KqI;1c:2sū7O' O8a @w‰q'$pt< Hs鋠 ' YK#tKT, p@^~0s)4 ٳIa'Ʌ-AO7 # nI2p .?XZy Qݹp@7ac[w8' ~,o6撇. ^jwi9)ֵ6Eχ᥇p=/eHeCO&sz=_ ϩyQ2G^awpw o޳''E;:th`XDw4DsG*X2=rՐ퇿$KidD' V{b]D{Xwaz7w)XҏT{[ HzN>7H7sE?dHCw" qF7 =Q!@ҰԀE˄<Dž{[I|"juk;5uxb`v7npH®7=>%@Č< -?pa0l,RN*3)H &ڷ4h5"Oo=KK07`m"GIYa}Ἤp~" 9L~^m Q¯ZH~a0}tw+_oqۤUV΃(K@/^D '@RL葱3e&cmw-aydjAAN@dH'A  /;O>Q3߉+cpt7Ӌ/&ƽtI'DAL t5iS:2@ɜp N  ^j!`[%-K."ԬWtwm!ޖ#~Y#395q {byRD @R /$U]yj \FAfه[snd[VȲXV$:oH@@ tJbd>A2DAA@@ % D1H#S   d8kΜ9!%.:ф? MHa#I% a Վә8meuB8s&e۶mSMŤXB9sf %,HzJ 텁LʓYobVd5\ Y#QYYyX_*uˆa}( x 0 eg5 kQ_/wO ̘1#ճXQD0ST2   nd;wyG>ȲPB"a'+-&FudE  ` WD:DNRZIdA@0`J;,;wÉƙH88H&dOBUUUl2jiiIBH28H&dG )O@.U Ɖ $ Ez.C pC`Ĉ4h % R^H{a V Uhǎ4yJL0 Y Hn$b^;ӗ!M@@htp @@Ҍ@Y}  &! Cg},C$60eQPff CJƮ &'rh_vK7oM6ѨQi̙TQQ:DN@ i/ İ ۀb^.u ꬳRjnnN!'$>FA6M}҉@ 4WVV֧W\3N?n35## ]f[h4w&["5@L ''? n upVܷ;]ʴ/x/Ĝ%U;-RR,5g"=#a3^ q# -;p8hƌq> 6|ƌCT]]M3g$ٶ:F<ϯ0(oDNO@&J\#G -[|K8IJiIJF# `„ т$@ PF"   C2Yr"t%VVksAAADD%^Vmk:t;d)*ѽ$j'W?&,x$$b3gN<)0;ФIH>p iHѻj,KVҦKtU @Ȯ d;d;2fY K:?:~Z6kf^{jLLUĔۤPF&!2$#>Lu'֑ɝT):$Fs^v&a`֚e񩫫C1I$s8GMNKXQheˈ**#:!x @=%0sH I'oVۢ&){A~bs0̣G/^ vm{Qɖ=ٕqKiy#nzmlXC2*}}5"R2z،8SA*Jt:ՒYnXz 3{ )V֌1e=}g֑ǚG%Gd!jXW62KgF ۓg#uܖ񪗄e @ 06lL j* 5ٰ;>@W2vKӮ(0&P%2icHH @@b% ^:X-AP""9zF7Rkk+HFD"apҦrј|r`/Pc;1:'or6a1ޅ`Jſ7|Sc1k֬TfZKlJGV&4sL5_^2*..ܞ[ƺe7޺V Zȶ0n +]2'6J 텁XԩS{% 2饼;-9Pmw=$޺Vg G60D  H{aȡJ2hWK==9`mmI/Mřq Q2ޮdee%,LX.b $=T͛G .L\z ;9ص|@@@;1@0Hʖn޼V^eYS2Fe˖-)Od@0uPݻwƧ#'% !@@Is Ii=I3`/A߿?Ɍ9I!G =>,wPix9RmصKcƌ!@:H{aPZ50G~zxć8@@.b Ҋ=mTc~yD*w&g`ڜVIey #7@OTN Zc޾ߛa015%YyV|B~dWiXA<ש=_ KG۳:{:YGOK:mI*qIAw; )ʈp˸hB,>5:(;C ׳턕WrhE֟>dDviq'@VWEoos'3YL\vT14C \wvv&0E$+͛ɪX @}y.RlRPȱB!m m^KT_CT^al:8d/a4H8 H;eqfJw)UM6QUU;ZuBį,PN:~')&ג睗2|\rd^PCs f tS$n@%8(H[Pp/mOO(H4x0I  `nYzT @5YAaﳡMמ%*.QzF00n -KZZZTvK 1 6uؼ'u%Us~E[FRڍ{+d) \Zk3i ٿ~C }Ϣff۷= (v%JTqR Ǿ}md,jlPq>`/b!q!&{"T,' Cb(C: 6,$ /]f_f}f&}qsm'袉75_/"N?tU[m(y3yY𲩹}[8#G|RYUls"E%ՋP\C$% _~$oFWƍ}F]Ə4ӃtF']&K}MD, .GSg*teOqݝu,> =xQO#izͣBiݞޏ  0$C 'æ".ȴn̺VU,ViWVeL .Vi9ٌszI zu~SաQ{@ ^ā!B`pC]SIO]<8JVUeo   XV***R]Y:DFZ  $o!mLСSϖu*gڎMzѰԶ|I2Ia *'xa `<MӔM SB =% G#f߯<;*#:b`q$~5{h}ܛ劳f2qI^ַlBb LL766Ruu5ZP7ba`=R 4[Ӗ~D[H/!u/xhfCi/ O}}= 0@m4ԇ6lQƏބt1lQGE ࡄd&UrG4YnJ{a o۷o'ˑ+/O{fd}ShJeY-_hU-U{ģu:(Fr/|tY!8H6ɮo.;*{.0%?q5K~/آbeEо5o;ZG6h'@80nmY CYr"tL$1~~E-ms҈ *=WoWlFm 4uzI4h?s l~{fm]=q:i|LWޕ,p?Of57+9;s6mR='9x+BaI qpK[ύ?1bvѢECsIXzJX5j'Uݟ>⦛1LE=!je1C gͧ {ѥDž.ng @,7iNޡκeQќ l8zv-*-{0 :byŔ에Yr$9 &D װpx?,㦑%k{WyVNwˈf [$Ǎq8csJ.Ðac8ϡ2Iv4@IDATd]Q?7 qbˇ>khexl ii75{?8<D֮sȒi΃ Qvͯ ^ap/.&NV~B.ua6:5 ]@F *( >%9-6!̔><P]]Z2N|QI\=dw8@OFt,o8p |s: Ÿ0U4<ΰQ!c)FajOq}d8ۢh̫S߰C7!@\ @Dz~YIqmz~cG'9Bq:ۿlD_FO@7q@,JND0M@&]DsFUGPkv2rpo~ Kn>?erO_Y>i${P^>/g؄ `",\NF%T\O}&dyކC61*FN&5]Y޿aKqY w<{C^LcT]G<6#tYR?w7A[yUGo N4߿?'ѯm]5z83sJ !~365N^ \_~ઋBăy35o++|Kx/ Lg MG#y^a0w9,)'m1坧0zi,̬Xb36sRC{*Xy>r(y>OW&̙3vˠ},ǜFYsOE9*,ٹ;DeP'A;@\)6h-P=xҶo>5Vd_=[H<CmUdd;ܐ4yd~!V0;b=70 HC'Dϻ:qٿ}=p?\"n/7zs /u,85Ļ{X֌,;^mCOq.u.!O^6= }@ov&< G: fV{[nrRy{Ȓȏ?C y+fCHNz4Qe~W."EY?&2P_۞;DE(O})l?'fGΞ2YW>jiCC ɈZ:;%aƿihE}zELXQlTK-?ӻ]wt`e𹞯w74*aПWL 'Κ5+UɺUUUއ]Xa`_CÈx(ٻeJʱ 玹/mXG4d$e& Oܽ{2SYYI%%o B/V,+Qf75xw^jiGs M&M"u! 7.CG 1k}8x͡ k]Wő{պ6tֲY14e>$_.h^bh4S%m\]ީi,+^%csphnYP<"$ly@*PC-O>se-$'i/ sH,[X:tMλ,W}h?`@%b>{$8ibI! fyʚz*#\"h5m~lep9эa3Q0kDȫH8|T1UGrwԐ2RMTUUEcǎ%Q]]t! P" 0رcԄ]׋ N6d.y"nR@AAtIJ$PS"O}-uyU\͛j\Kѝj%Ӑ@JQ沜n _! EiORki7_͐ckF o<&ݣn;EV,9wH,7?Ff(H0xiڵ4zhzGNwjsXC)oؕadhL,_pT/PYY|$Ul۶.\H/2n_|{9[ *- CQF0?NƸ|ri# lB'OV@P|̀ڔ|~b3}8b:CeTop 1=-ld%iw${GiժUO#<"FjŊ = S]]`n'xbm "BXt;2FVǜp f~C̜9***tQ"Jc0gΜe.C 3f̠5kΝ;I:\bVNv 'Q77 _5;͕8<R7hY\m{|ɺvOЁȲ^S\׶ZkJƳayV}'vyV/@kiRz>0/"@5iMƺ?w(<;6hZY'|P;xM\wutת7%yc+BQ9=u< v \dAze+{[ӎ/oFrD.+b[w"ke-=tQhcc]1jXLq|;65z. D@Feޕ+~N%n»'^1C'{謱`k35۲:˥]{ԯAϲm'W5kswқ3좧.);5>0nlRם{ϬPao +Π,]Zzocepק_>xyu2,BPae]<- U]Բ$vCjkeRo#w;78\&w/L84Mu+oκao(ղ+Τ𸚩qCԺ5MGC.M[Ͻ`A֌b*[_Wvj(wGK#ťq5Q=Pqhi0[-\@ḟ#>z?f_8V3&-/I1{oГO>Iw_WO[:iO+otqʩ׏tlrm$c9c~n683*sidAWC+}~v5Y4QM;֣ő簫 <סs8xmQCz~P6SS]o[ b@❭tٕTekCt_P~e -0/\>T5ru{> 4*^}u]#mrdcvnr8?S|5q$XYFxs';;[^|&ǝNǡO7ǛCU>1 w:∡c3"" ntY`a;/,#֟G2g |]B"s=t..7~lt]I"S JoZc/݃~]7S*P6W¯L/o˩42)B~3r%m0uMwХ# :{j貑CnFeAǔbœ JhHD.T`K3e+8[3_Qݵt5]8l0-W" ܅э,Sa׶Ə%_/[Cy]GN=RHB#UaUku]{ (@H 'wf0 <&3y}ofs:Y2]r֛+dV gl_vBcD+?-*cz~ÕoblD.%UywKހ WYU h=AT6& %j":UσBIPBKmie̫0ir?J70Vc3rBXJsfU4VN<Iȁ`s81ada퀲 =alV_*܎? Wc9 sk Zbx/}/< ΁#CbXЕ"_}T\_.<Ə ѲP<~OXu"7Uu?w 2pxB7GնN>DeVݹ'>еwMK8V~$];aI8惥k#rtZNK,LF݄ɉgH Aпwpf9G\ht>Tt 5{ q`~h- !MXGb`#\1`E(0GwC;K:gKV ܭu=bk {snnݺ4Ui}KU-:;K{y>)=Z4L; TL^[H";*cN6Z]r9L3KɅz [ L^x.,ɻc,YJr%ȍ:ֵ^z_>wh{NE/DL9ָܫsnKl EoL\w섁<n.b|]s#(G|?x0~Lmp[?˄n83V\i# _x|MH=wL+$C+doY  )Hz(ҳt>#NWaRuT Nyu@7z?R~*-VqH8ji:dkN5r83z`wvجx+pHY0BJ=cZg h8I5'?]%?OT\\,oB顯Rt@V36W8P$ɾ8AskuAT#ٮ2=+' LZLZE =Z:M88&\;ZGc pv c7p.&!\:jõ_u<_*XyD]GsIox}HzK@8s洨AJ6w3s^QpuNn`.{ݚxne{qG3OSB@qs~8?O {͂@p~[3 ΙLG C֭F0N`h~#`ͤ!EI϶ :<\s2gYҺi2 _YɁ_7 ^XP@:竐0?/4` F>|՚M6lo֔*xC}b5h#eq'@$(rJn2wCԻ& }Às]g7f`~qo*~>1  *Kfg +e7 L0 VA2XܧgcXWR|+,] ` %ɜDPGI'H>[X%ݑ8ھa[,C1F;"xi[ʤ%- )欫1 8qX^ɔ92K{HvCEyrnEWފɕ١/&Da@C> ]}uY@HNU\[Ή2-`|M:yEX&$md|A!"Vkӹ#0[H%E-8la&V3J?M<-BO>R:3] D@Tҹι^ ĉ"FPXz_{L׹7:z`[)w:w"X]6]X:к p"< pw_QuQbvF"bQwT$;^,vœ>:A>`ɝU |ijp;dv8.Chndgr9Iv[E%'oS L ދ~DEUH `4 p8o8h?ǴPI%*#7$JX<\Hxmp'K,/ˆ}*HLd3CGruMPb1X VGlX_  >w0`o&1 M2#ol%ӿWuŎ1ce 7ՠvDjLƹB4%Nb|"X l(dy&8;2S'lL~xF'a* = `$P5y ($ b.` @ƹdtPm|2mU'cS?(Ei1kmKsQ`̆`ۂK&9ܦGňc) ^zxWl+7a^vAo\-oZD,*1 nme%V E؏ta )>! `8Lh,䊖t7?0 U''61F d+eaBWXE| `dbƗ1Ut=@AЫ]#rD+ eymɘQRbFq 9`-2L \'\'Ix7ٿYF{s0p0R?[ ?1xj_q\Ui-Bh=?\#G9~+<׬Y#c f/XS*ϿQ*+(bL$],G|ȉe`d Y o |2Ν,VJ$WՌafV'0<9?Bh+Q6+P<Cȼ0jE^] `JȭMb߇>áϑN&cY@d-@mVMw[16&l,kVaUU3<'w2 EIR}ٷR #yc>AcZ2!zl&c}VnPCn_O&BQpwDrQP1 P)z8^TR(2Izb^Ջda{V`b$ccfZ5/ݱ 0W0!\Ug* ]R&3d=DZu*o&Ą+W m% HBV`{Ù؜J5p# TW|nd).Ka…C:mvz ޻.Ao~'\C!H4 Ãh} (Ibd}\ gujϩNhG및Zwx!&e(PU~ 2l-I'!=j e +@F)n 00R= 7V0SH*auüIlW0M6@~eQVDͲǘ{vrzNѿ'!Vcq% =eSZ86Wf hm x&+A[lC9v0y薟e0+~&@_@v-+O3$_BE^K;6`iwR >~ڹ7ԗ}pLD6hǥXe/I#8Q1pHldAD&?ϝ5߅ē#4L80_|5|{'ViALO/dDuݢ&:0(ZXeK4"-_πukQ)V^-UniժKUUWK[yEy@:0b%N[pbOF<Uep*m <9;t5/SCwTyl8.m #NoK@@@L|ލh@@ 1A{|"X %`w TO>o"qRQP8>-%j'OV.2M{.}AqU?w"08*`IQXͳEJo`MqtެBhQAl vƆäK(A`k;+;`XczvѥylWP18S{y?T# Ʌޘ|8{Fw<#H¢6R5nKqso00#< lӛyG̓OgpCRC|X3F5gb~ZL0kαT | =yĥQϹ @dYOT>I=:o+: >L,\{$1R'/Yן}z| ^(Qt{ƳCt5(cuKE8rK&2AeC 8¸vP7E|U(HTpOLƪ 6EILaU7p3UVnyV eFiҡ?@[VHy=HD@m;!X,PL( E*\0rΦW¬_Gb~3aR ߕꊝ2g [k睔%0 M,^G<鹋TC_.1"3M@E@w#疓^]=JJ{Uۧ:lRI@M&J s&&Xu`qA`߆:`ihmk?Y#Aq3S#50 V@aEBp|1'?R ,J. Ľ)'ܺA(ү9V|h1ʇLD슄b8s-=r~Hb33hSR(&rCP?\S#UowZH+ Z0- 3POQY}{4; P7<P5RnՄEC}im4vub<ƨZ@opZи7lYІJ$sF +A/*¸ N\m5+| >S"\5؆ "T 'GT)ԁw+q59P#D1xއjŀ+~2'Xc::vճ6Q4 a9& ~Im "h&]&Eo0 /*1$„ʌ [ !' H@/?NBE\2).W7:\HFw l@d*xm >E#ن)oÓnD9\찭 3ʇ/YʇRаH|lByr,JRVm/:d"p䖑Cd~*+豍 Z =4oTEG+'x$ {}CO.C&lc V^@IDATwk K,ߋ >d \6uoOpFsMU\_OheU>EF6K^c*'kBcju>f}ʎzt}J,ϊXĄ싍u k#`WL}w(@Abg걅#^_V)vn+gG11nR4s߆I_VB&'LU@S09Q@>4lJ8~&mv_՜Bj 5ŀoH}*l% #8?r x2%1 KڬPoZ;?ÉV::wCsvt@c\j+cm?ʇS5!=થĀJm ^3U-J/rd0@Jc2EBJ8j@3XJ"+N(J>ҎXYS VH 렣l#3rt!E4b3 "yA`2=(E:pQ򢢼bV16 h_7_ { AL _ ,!'S>d@?̄BL &l2&HŻGW9XFd)+>^ w)"e',#S t&H#zv̄/'[kx[*pedqڈ*LCPe0y!Q-:,2aU83!a Uɀ`C[Xbpłi+>0y쏷Wﵪ3l@ESnA^>'tz5+a=wq NJh D}s޳bAP-o/Z!myG,a{%p%͜Gh0,[}B}@)0X_ƿQT(9FE ]1m.T+uS8,AypE(K~ "sD);>n4wT.r5H-RŖaRb?* R ! Tʇ>h-A.xpox&JہK&W!h!A'"ޜ>6yJ869s3fȲeˤ]G=?ulsժJ7 CҰ '=R)pdbcCZmp81许?-rܨ&" E&*]1rȩƙ8qNB{GTk!N}my}g(?y~L>9Su$:m;Xx1WKREqqYtB߀ؒ L$p X0١Wvޜ`͞Ld6ƁXmlyY/Jл2F&M.INBh=Dk'O:1~]2, h4A #|mal[9hWB[AoK-5_-w} #7@+oQ5AR]&4?PvKî\T,VRÆŏ(l5dmVHbGjL+dp;I/qL2U>5O?i} Nj&ݗhl&^Xa;,*pP ">fH֠G 4"@Ӥ>:aEuAU;$A[6-$INgu?T ס QBbx>2sB&Wrp3=tR@U yֵQZ~K ^QDCSsP~o ||3FbQIfd}mܷXK=(L/k l դΖSs˜2bFw`+0&)i"vb0ySWΧ@jpVbS /~('(؈ch]1a0IX4e|ABeRE 622=r`Bkcڪ}a4sL*v1 SP/<0Lv5==ur>T Q1*t>&iV0h..L2pzץ#pBKiY#6mT_4- EQs1؆!EoHZ }5+Ձu~NN$g qoGʕGt`LD_J aL[fPIz -zoT-}j'|pP>6Y)cg`I4allOuke?S%9qnN_} & F?xVAsResaW(i HA:o=VO}Lz@I^Mh@+%)E%ǹ@ROGK5*a1 }UnGk[|a@DUscMH5{yrh55hM<`1ywvm99vC*Bs|*#eS۰P!jaو8}Q8 a:fN`*(ĔH;>fJmM# z{rU9RG$읠3+#ϳ‰RI'SsA#R97;Ɩ'1s{V'l0|X{n7Uu%1%lW4|RQ&Feg0oi=pQ#I-P#&K:*+4g  A5HA@Jx'P?ح! ED;25؆'ݻwK_PB >!0b>5j[‰?NdŽ ;@Ap ӨS<9(v $r_Vs?_+V* !gAVzbI>;ei%p~x^,_ge$AKg&LZ($ RA|mJ4Z k Rǿ ʐrPaf8K4j< _W"l/:-> ,`x 8!:T]׃xO+;MZG*#']OAcVAb)X6} J'iC=+|1-z_ ͻރ-)AQ7Es1~?i{(.5)0+WAO$ FGtTd!#n=HC/q>9S"+0)Iȉ/- Q(XM c- dP;qtX:5n(/V~߼ƈ+Bn@ƑnH9T|eO\eHs_P 1vTBikmKs:(JPg?u}TDK9"~w;޷5:N-m?KH~_P(CvPJ@贾="Ok&H%1֒cɮq 6RVC]ckcLb;c |W Q)`#ՄL~Y$8iavX ̀]';`ILX$ҳU(0NRX&=QTb7Gh"gcטV H],vpj.HHk T>1@O s1)\{|xX-sO$ OqꞫY7oI*@ٷȹG@1(Ӳ(k.-r*U̿>Hu4nH́Q-d2Q1Q m^ qH?xDUX`{8{krF(MR?C.]Wkiv.wEӵ~ T,ծ1Xba6OprMAKKbGR.ƖvHJ_C\q5 E[hS88qx\2= uߐJ d!lVA^!ZBQ_?a\X!@{c2`ѳZ:TM雑NRL-9d*A`8Wx=8c#$GBȨ4(񺽥%"g&W>z{RalỆL8)\L(.J~0Px w\Ƀ(Ҕi(L**A l*бKs xnPvi ~L^`UR$)Ī1cuVõ^z&{.P3 /V-  pоQ˜^T/s{%·0CU+c99^Q<?*k\VfcLCg2*x܁Uߖi"+`' 0ұ]GRAEIw$2&X R!"! ~-mBbu:(V!úoY]Y/A.+i뼐 H%_d8I4PGHd_ydW&hnD XW-y+1Iʪ4/ڈHg#͐le$1ՕNmʇ/Pv'c ;QS~l &(.7{VB芔2f_Vp -!wܼgO} {DEBt3+[Lc`%UhS͏+nIhaS7jk!Ls"jզ*$Zڧ&g ,.jE:@̀~ S.xP5VPF8*r(q8iD`:Z Pp]C@3 =<1/f (Ow`Pߙ<W4_U)qG . )D%[u Ч9`$CTFA$`?}_a#I;dE%jS-Z)Dđ"r|$t]u2 JRqHu0Z"2_7/~AFoCwϗ8 *p4#Q' 4~nOC@$A9db=ëuN֭Th-&o2LU^JEb1s;ۮ٭y bI7vy#4 Dτ"V >&N!v e^Fh4IѦۙt(d)"H~\I1Rhq% ~vV Mm `L^r+ `U~5([ Jp 9"Nf6 ̇\~g1gPَz`"vb>c89sR(-9i2wΨ^;ّfoIl1pk<œL N:X &"D:E~ηL@lx0 S`Q8~\c{_ BJɎ=ncV%hfV0ru=zL0+7â%S#Bo@П9i:}1ɮ4 0 1QJI5Bn,;E%Yz<O 1 GL&-4/A;wL-Id|JP8@ L.$x"H]d$ #Zϊwc+Id" &6@;$NvĀz/;~Z5/`߷5*g7ؘBzHiXo4౩lBH>#F$2q ѓ?K5)[`@Bt,G%1y*H5B |&)yz#H-B@a'4ːdaZQ0$x/Ǭ2pf9pB1330GTQ㉫d8 &21![,P$1"0U>rƿV>DR12uEU 2MH3+E@`5 @.KLNOM}Wn v<Tz I}:CEGH3E/_(L SU>D5:|H.UC`G7<h c9v$#h::m&ЋHcO (k7v3WDpȰ4dezŠ7|x̹tH vG]GMe̲YzF ّH$;cc9&:7JVPV ǧg>X$3\1h0$f 6p{ -;g &#$06~N)d- s}:G ldūI 1Ɖ]e*T 4LvL dDWXUlE5&$T* =ˢ&B[Rs8C9W1%6k*>1RLpeD@c'Qޏz$fB z"[P]`K|BEdw5+P,f iQ= Ɔ6OYRk~,d=mVg!JO}PG PLl5ozU$e8nh=0-" 7Xc]PM4: 0r Cugs_r 1 ;PHJPSG q1k1"^n{!-֎V#axr{g{mt-5ū3{=x!saXDtVdb@Q6RqNIt +8$"8&&i%Q`fzQ}om b;0<&NRigp0B+Xcyj slX(XP+7{WN_ǵ.O؇Hy*l cvqR6/Yq6)~Q'P$ `82PWr*α!wPd?V*Gt>' JQ){1ts˯?@x%hL$rխ186ԣϰ'tQ 7*4%,15Bm}↋$c"&}ƕ*L$ ..Lj" J${l294qŨk{\ _^-Z${k2D&7D>=FEζi&`|oKI{щ䂕] /OD߼r=萇w$H+ 43D*FDc:9Yg^c/>vn;sI#EwʗmnAU x>&l{~Ϥ6I yR8\~dɅ&%LhXx-Z/@$"qbWHT 8ah1xNZƿc$TMUp^k+:Aq mdWa{NМ?@ L?Wފ9),U7' IPr@$cAS;djEۀ&06qVH֑6/Fa.X[z_201£W/ֺPcuxa.-}]*SGM͐ |:&>[ {7Gqw?t:`O`Vn=ٓhVg`eX xcEgvutSXu{OM }ݔ*T4 H1`kDiHd#2R 脀j>ATP&;.78Uz?b  '|z B\FL2H4 &S?xVޖLٜ`%Uk@p9Z+UKX,?4k\54sNYf|/-r~ V}L*b1N=JZX[+6@̡d4U:>M<DFD #ztf]7;:Q?XSj#V 0SՑWZ wo̗8UX $z*6H ds>81 xL8 egP M0 Ecbpr# xB}LqlOH`d2FRC1h%y|'BC yi8AGQMX-?O.(+l>/x%C`AE䠴{g;m_'fNn# Ȩj$v̩錡'Ww\q߶QåGnr&2x :hY^ #JffܫJ0LIC)d: @p o y@KHf^W0 J埩p|Nu_ % fbRk?`vtl VH$pS꽉E T~d4 K5YCtS)v[W cZI(΀|H#.HM!mEF>[4aQ4Ƥ-MyHVX}"H*yrwh6&<$ nx3[@.Xńa:BXD?3z>7Z8Ohfj_2 OL`qZd08Ϲ^oH䱛\!'k 'FG"n-"EA!L~lAĐz,Dj_'y KɾJ߯ܿ K Nz&_tt,Ͽ߃Q9 _3~N>vr>N /m/W,DX]%h?4@Xs*f}4GOAw73F|,OKa$Oj<`"]1'O pmR.%?!)ϣJơɂ+l ,B20}7`?'496A ^;ޖhIV1v^I$t4d(MT?zYgd|~o/P;b[`=h1TGm3cpbˠ)sIAi>bx)UADOnw}UKCT Pq E"EI|XS$/˺o!ww1 lM0It‰^/vީFx,ͅE@ hpk@ ċ.V7&QB!9|#NJ[B7JP( FE8Aږ d_Tm9puDS{a\8`VHj 1j~[7nh2 eY g +ݑTEB@OQ`c)("TGJ ܀ƶV)0H j_"y^Z9IX hU31`~,]AIaJGOؒ<7e)cuȣNy<ΉFBCfnLbXمtNH=W/{[cgu&nz6YG Pj%"]=5 (S7Go.}Y]=߾O3$S-tbU*/o bhzG ѷgbHvcΓ;@@Kz"$ //?OwOE{@oߝLBhvSyC3e).MltR Ǟ+dZ׬@ Ya2ψCDĉ\c}#D*Wm##%\;pDMlr8)G9fHJڑ|H@$5 |5+VzH&6xBFGAI}.r\Vy#)F2C"[?124lj5t$#B:GGMhps2WBnh0nAtf|fr:k%nN` L\vpR5@Odjtc|z$psT8A΃Og}*$-x1w]LMRb!+!43]fܫqܤYU,H%`ӹ˟͌"N z")|!O6 >']xЭGaI.VS4AJj6j[-ssř#+k7~7f|z`vw} |H $휿Y[*+x`r!QϗL9NY|^j@ϯ΀ 1Tx-Y 8CQm`4]b "$T $+\FCI ݱpeSςu,S 0A88HqN!2H< <{@C db3 [h@\80h5c6cj/P Ct! 6) nA0^pps~Xxnrc= >=} |7 *nE3)|PA`"u;vU`0M$d%M}^EB!0CmC ^1CE#؜HZ'pCCh K-@"8{j8{wMT$|y2yI \5½;R};x_ w]^Lvi'Y{c_J~Xg@V߀h CT &bOX#Xq#Ƥ>I1!J:p\jH6W)?i=ح Br7\x广tV%3txRPTV¤I?Eh @\+RRa& 3Ceni"M[1"lVVU`y4 $(^Ϻ Nר2?/`_el4PR]$aYD*uD6adw9^(P:]mVc9q"Tp#/p:,G} ]ӻox"Opqh VwsH`-]'8zZORSpͫ cΉ$- Gd'fM]MsKa;c5(A,_8w6uV㶺<#xP_q‚:@G &y+T Ḟ]JGXZ8XixgO^rKSV]w>!$LP+z/b& OPisF( c` Vyi9Pp.b(Die#Td.KXb~MޏտOVAp I+U) j / rW-{QeYEH"RpfJn(~f ?d?hlAPMčAb؏z줻(q^dM l*cwA: ǖ[U,'sqd7SQyNˆq)pD=t,ي9]O(Z@m狿S^)qSF*jP)]=b@rbs  uyYmkċHP0+C2_voZ:*P Z<Ka[-sӟڪbS^Õ{A1ٶ8B*"2?bHxƊ ۊM04DN $Ft'&%h_h&Hb mtpui@E?ɀ:\Y-`bi-0^(E;GJ8==ЬxTPNƱ0t= P>i*|la6Y@cOP%P%Cn$Qn/H"Õ++f,%P D,`SM }~D{^־$ڢ@ߩYUHŧw̓0MϾl !*RX;0Ͻ8g%>]aq"3N*V祤%*C:!GA(UIDFZEHגjTTo/Ŷ+_rcc%t 67paBd"ֶ M@d H #׬',Rj z5>R1Wm.GĊĮ`SYH`{VK=V =ڵ䔤C߫֩L.ʒvIcXIk&xb=fxfoy/ \Ay $AY#R%H,$:v-Yt9^*>,yԾ8- ΌP>=8α<\yK P 7PҙQɆO{_[.n7Rl"۷홓]Pnwddp#$FA ZLq$1^ vLȉ>QX[- *>t9m&tHH1;|b> $k!l ovxt6Je(j[cgɖ#u{,ow@FDcC ) zm3 hAܩb 21ha敛? F0۸Z/40D 3o{Ng1U7lS}XF񡌂QR+׸{8_:Ҽ"IvA_*dxv G~67gvo=_ RَT~ 1Ǜ|Р!DAwO+]&TIrYaFs\^{/_%"[ /(%߁TK=d7W\ נ7@ZyӻѬa_J\~Q-z_RGڇk 덊ٶ=ݧlZ,Z+:[H݃?"w 4op Nh'o ʍ0&žA;nH#;07U88{EɨNh(R-4Ť9NS}x/f͚@a Z1m*-ӳ`aVEŅK)͚TqJk?BoyFBdc4o?)TE2>FBP -ۭݥPd4l|)̓/F6lga6-b/׋ ;5G{Ҽ*slIR,geFU@"4 I.6l8Fd]%xX}ʥ=߂ >܆oS-_b&Z;s-lA!do-Z?P뀷DxD3RA$Rv3`dtEw;ٹgRiC4*rijDsVѫ$ЯfջQWZ,@!QKxxuӼY1R ~S2iތgu%.__u}_%^{"??L@Zo&/7':`Jy $1m5J؜wk =wB3h eg%)訛LZz~p ZA mu=ɓXМp:@T/+1%%~|L5J|83(,`pzfu K1OD|֍p!$' &ob@NDz@QQ~.ҽ{w4hdA|+GB(K<=uGBU sU0J=t` s?"#0B N.8aRd_@1Y#JOJc(7* [~"B,`]S)$GmF>cWGUD[R6"}#^oVQkebлwȋ&J&3 F'4Z <dEE(ld[Rd.p_P؜M߁/L$RfB6ύOYawFG{qHU&Ε0=ت`Hht13][4mIt}汾wCY>%\_û+ )!\ +=͒Xoyr')nnl+pd_'U˥mmU+{q^n8X,:* i鿯[o"<:|5+rcRIibi2U< B7^W#ފyRSԕ|GJM{ oqpaպX\{KĄjL<UDɮǚC^%_y=1bOLܢՓh(@W͹OnS)m/As{' y נX-x?oGb#nң OG1m@:x%ԭ,n3N5!kU/EP.]1J˿@h#%ᨇ!ՕڗufLpw.^F?=W<PjpSSEdtS5!wEDɀUikk[W bYfիc7o;{mۆP3fȺuMq6,noCBAv5JZT/o*UDl c.7vi'&> ,eTpos})c%=KO0!sLy70KC>͍Pzʔ)dH[cLMu_ه{k֬9v&ӛcT ~6UѪV*x3|c31Y9V`*Dn ̍oIp#?L.\(K,-xs̑+W}+?bȐ!q I#FFЩ9ᅲ7_YaPy̘]E^,?7Mo+67ɿTAC-mEXI?ovCǞ'Qiߎ \MУQF]"x?Qa\`0;%6 &"b8ZRlN[ڴaVT6WZ-W\j2KE P&!9|A@!A^.p ss~/ rrRrr2 S(i]*%d/{KK >deeQ~U nllTֲ~cU[BqA)?LQ5y5I7%p+y,uͻ^޼ɒ$J:ʣxH~,B)ot 7j_&z;12z)ơ/Sgs%PvQ֢ <(iFNrRG5T˳z˂"-=gto1v=GO(yjn}E)a:Swg']pSn),tyԞ*Yv)o u55APڗ&|N DYX韂-?IU=?O4c@UhQ*: 2hI?<-}4_qc莱숧ӡ߿N9awC=߳,m%յ/jS/2ޏLPlK .gЛȑ3g%J _{,W]l(_Fc}&tBY$hٻT n'5r4]LZî]*w9mm<ۜ_DFOfl+s:U~2ʘ/K45Fs[̭`I78-eRak;5Xq>[/wM5"Ž>iv>[SkM֚lMp}9(~fU!$p_!8`0ЍAJ)נ)]{鑼iStkHZɤ^p.ˋ)sN7~U6Ήx+ͦ5*.Y0 IIlȺ98 #{F|}:˄><?6]FCKbW5ec \Hn6I֚M\^/O )Qu&Lq>gJ;VF=8Y%uxXLzj4b ~N_-^ﻁNOo:= J<]'G)y# Φ_A6J+Va8Nvjׯ+˄~_qլ~s]<<6VB\F`&|nmzYE4XMlhRp>5CZIKr;zMAu3I18(ҥl٪ZVy3)u4`Ζ MvTsX9Jz}m  d9[2ܥ{I"%(^w:5 Pr%-n3wY <ئ, l}GF*RF@\TjE-׃aVP$} (Հ70R&~(ʉ#q( `VvjVmm˙L}f9EΩ0qaՇB'14ry}o*%9D1XW%d^;5qk9Z= gqɹFU#+ 26Q`'Gz~h~X" ĵOAL-t{hJdM%7eֺz_TƯ{hll /_K H ҦBݬ)Q'3[1U,hcH  BiH#Fӌ^k ~<@],Ł^ڝWhZZ=%_KUCsh;A F V7J K8H"("@0   FJ9~SDsvch;Vf| gA,HyZ]5Zp es@@$jX!t5TH[mv F ÁHQ5I4Q 2QA@@JRW @00)*``ݱCA@@t LG A@@ Xws0ӑB.;@@L't@@Ku= @00)*``ݱCA@@t LG A@@ Xws0ӑB.;@@L'?3_WOIENDB`factoextra/tools/multivariate-analysis-factoextra.png0000644000176200001440000037124613144620014022755 0ustar liggesusersPNG  IHDRX^F pHYsgRiCCPPhotoshop ICC profilexڍ]lU93kU-I!Y( .Z6icݱl WD wwGbb"x!7L ؘhnlwhs{}=gf un҂/TB7>a.1ͲRP}֭I\ظeS2!И HR]Bt}zEqtMF@-@8`N1*HO*ǶʅURXkm.#xm A]ɏO@ʬwlX 5 Us,Izsp!~P}`$&j/wrf9hTPHWN\rĩ}̎8[W*J@7hIPAxp19G>: 7TZqjZWV|wKŨ7=(_﫨|!KkMT4Dbq2X(Tqp) ($n;g#HQ8"q Ve ibQ<걼4-r+EZliMvUcgsbȉڵD5y^Ģ^%˯x4wXws}gzɱ!`:V=\_/W\'CYwҸe=3/ťdͼ1qWvx./^X~p;AGoׇo sJ~?Qw3kvK;ѾѾ>Ѿw}db}KEf\e>nfg47:3gj[\/8n۟ŵ H<4o(*x'U)z&1t*4F,col2v:#T@0*V3V]i yv_Uq]K9zXJRʩ>OX'fXq@M4D+`vSͶTlgAe~ZH ߚ6|Up cHRMms{n3'IIDATxw%EYU;8'L!,A@15_^5GT($+A2 q&3'}LQ{<اwwuժZokZ4)MiJSҔ4삦4)MiJSҔ&jJSҔ4)Mi4)MiJSҔ&jJSҔ4)MiJ`5)MiJSҔ4VSҔ4)MiJ`5)MiJSҔ4 Ҕ4)MiJS)MiJSҔ4W__mJCaAҿ{{ETT9PU bU (WBlG;̓dBNbəl w Fp)ʀB[4:bikCJO΁Jx:7_G>M~EHsk ΁ ^%IK(go*m >(*S3lePV`3'ӟ+xdCQуDzcԣNqa,#%]YAkRgrP;>T}Dt5< Œt klqaD `>B5cBc!~\>fUt1c"opz Z<`(`-q>PKRUZ$q40m;M:^ӁW&//;՝!1 gXN~-Ap) 2T"{AAxU^%\68n( F&~MĎJ@yԿHYEdX]>񾝠x `%2x5pᄱ`' v _ⷹ"ϒԥ IS0_jnM@hX:0t$`^N ؂yc"dt zU:Ivϋ@dsJ$@'pȮ.U5}yڿ&Dmd^T`KS,X~z W*ZeB]<x!x”D] *~G%[Vs{1oJ`5B#E7*J B?{4]*tç> .N>*ZlE)\}^=4q 2ǒD CDDӦ9Ն 4SW:ZԤLU3|mA`K [Ϸ޿;IPFh\ SHʇw{`5%1EDrZ16:I5gHUQ'b? WC*s>QO?y6`dyƻ!O!>_z͠fB& 4VSxeG9{[fkR{@VV7?VޯcwC5al imKx?Sy2NJz.G`_{ZM.WF?>:g0#cHS ]ńVHyĊw:ezĹ@-y5!AjI⇗}lÛ2٭ YЫGE3Yq'‹-|VK=M|o:hwlTQШ.b)MmXCgX\93tD^ H-kyV|'`d~h[eRǁƘ2-Fө"!|ZШ~54acjkͩb#COr˜`nkUBX%pgjGXu8jp 6@hcyW_(a{wKhdާNEM Iq 6WGb9l2 aCW=qJN87)ĉeveM{-&{my -d,VR I ;hx=E*RW D; dlǸQ{T&l=7DoK+ ]HΞ:$ʢ;PEuT[g!1re@F cw[cqʛ;B13/ I>v53aiB&0X7ߨw`W#ӻvK"!wM\|JU"Ho-r~̗?~¶1=o9|nlPzHy/5mZ@z?*c r̴ѱeg2~^@IOu{:/Qӷw&pZ cWjd/%A 'q[?uBTC.hA<3#> f#и; ]b:m;^A_(UcfV i;l!:n O<~=+/(>qJsy~e 齯 @WZ\BTnW}NC #WqM]1df} LӸ&(yWbs|cZ= Q-^-ƠN_#}TO@JJ *+oAP]y:/X}%'AA(a2c,Nqx]M["d}D?9wdC3x)IW %n1;Lf3Z_Њ<?7||@s;vkGjrP.$qmπx*"ݨ.6{;8*o%FtU'úg@= -W./2݋ZM |7\{Q hmnP\v*S{ se2!fI`kp_mCD.Fw"SVFNc*(h4-Ւ D?o~ڿ&h9CLf븎ذNA֪j:as"x/'>q[TF=qd=N;Q(7)?ŌXU_#Gi NT10JQf_^s\v0n 'M3XMb-7_![`q:GuU@`UU:b:}z| ܞ2Ӡ#ac?TԞ/bS|;W0fָ>K.Q#yok$]3J/IlTѱ2 "/:yJ{[/{w~q&tw"#WZڊ3)bLu`FN4`Yƙyyr"VWv/$ KyBՠsrOJ6и~93 *Ed/F@T b`RsȤS?@{ 04 OW3QD4 QF`r|9~F>ɵw`YO>qYuAq]A?Ŭt`("z:`;I>C[H< bձƉS/"QC&Dڦ'Z䑖nWb-2&@&wYA_zcuU\01 2b0K.w;.W~8lCs|W_ n *TSjRkйjwb=h/`b^JT蚂xVI_""p.3u /zEZZ.o )AlZ&A$Lٍ p ܂ ;$HX)1\Oʇ X}2E |LDk0nڦ"]!{& ?OWqٔ#Z0*z"'@[|\660$00 ֢CC֢CȞ!{_Bt8+u4ѲJ]`5No2Ptb̅xbM :d"qM6kҫDl|Ȥ=Mo:cnh?a&{^A%k ;Jn^C~2?y19\)k-c! MHOS- A l==4 ~Sn1Iҿ;JbrA+#I^̀T!F6'LU+B'a! Gez.1i8 ] ]&$ܕaX|Tޥ L _1:TYƼ+\3زfHML5 VTsz^橯D &Ⱦ.`XW`0|`] \_z|-a1(cن{48h{bS~l̓p5Mxz 2aXzho"Q=&P 7I.AFt NXO$yZjd;x{+7$79:u?mtv?gCiyӱLEb{} KO\lwWQ|hffk{g`O/+zËg d-lـ0Q{ʴAqQi8FD Wɗu{74Γ~].G4o~wu,SYtlZmOleAڥ_I~Ӻ}>jÏ׊ߏ5O{Ъ^ 2[0y.z苷mGG'hTbգc ;|[\@jlbd[eH%& 볼Tz˅[h#UxTa n}vcC"{0M{,>$&H}.CHU[ ?cv<6` zARIv`#8fL$ZeK1uDdz'GBwb={Mz E5>z-yK(8B 6xV=YZo;|tF:2YR}([j>E_'˒'-ZfX \Z bXx XD 9cOYo'0z'ba&6BnW.Z&hۯMqj%u/12j2z!g^|?-jR'$s>K#޻ȃev~ ۄ=ƚ/8oɇ_M: 1*-Pތ_ $ Ek1J|Wbtӵ&~[ wrUK9uǘb 51RX| 1-x!KЛ@ZDPITj̣"ǡ{[B1}I _Τk><wm;&]9]f`h}t0uk8XC"0"w;&PMgϰWtG_7ä@s>zyUn~Qv!dҥ;މqKL&#C$|[|W9^쒭92lU 9Ĥ_gr ݋%f/! QOhAaxC5mA{z} -9DZ Y2_, ?z5>nL6XOZ;hm͐s:]U> ܦ\4ADvRO6.ijSmqx"팪9!h{{Zҩ0C%#&ߠ^QtFATeMz<È1Of><5鄹?=əઝcLE){լ?ؔ) KT)-A7?$5ѪvЎVס~义ɭ߽Ee,{{0x߉lr)|J H;$I Mww>UbAS n^ &.zaBq%-˜c)+ Ze yUD9}nc1݁&lw(ԷZ H؉dZA)&ˎFQ$I/="r-~Z70 P^)- hb}]w*w]*Ì}w%[ϳ ˞{ckXAO7d Ho/LJQ%DT!Hf[Ikp@} >E[z::N7#>ҭҩ ZCؽ^b촓TjmdspC0}F sĶ 6ȶ2:<$K#Q(JjUV1٘ß/-mjTC"\3L{/o{Q rH؎d:Q9Z MfA-$EyaYxV-'|(84J+)MO(UEL!M#HqJ+x%>3ʡKw<|Ut lpGk{.OӪ62~x(1l䊻8Fk Z6tVee#^ 0ꨯ( nQ"L-]ƺXF:cckAnֱzV;?yC''5Dc?G}Ҥح!SP^֫oսY7rhtZ'=15ACEAԔV!/hT{VHaa? a ud!va IκXxz4&qs?lXoiSv&_C_i%hrfzߑ!-,Ƕ~(Og*-2]ǚ)Moz꛹eґ\2tF656tⓄP:CL듢 ҵl7hyjuU_Q MOvrgQYdۗ@u!b U+lWYLc^}dУMT@# oo]"`j6@mO.DU~@8V@xb0Q#F4?`! ҇13}7|g6|e.Eƹ#%DtGv0uiDN?'I ri~;_#~D6h\5eT!={ {sPFտJ5xcLb#[HJN쁇H,#kKgY@Vga>ҲKvq?"+A&.B ]}_׆ K)嗒s2{ҧ$4J`[WOC`jb-m z|65n5A3?66j=2o֥js$꿍1~t.tF!ԭWі}Y/N¦?ᛱ6. +jԧ3Aj4e oVx9L @l^`찆XЕx3O;O5(Off0sFUr!. )0:0K%k t` (AvO__FcD7E`uR0n5"tb@\= tCdX2kOyp5|տ\RfO ,&cËKc}r5ʪ5hk7vNǼ~ܗ:ݢ#8(iC:so)@ y\[yaߙdw7 GZ!NKbՐ?vUF/ɱU0YVy\p+6LĩdyUڈd 1?]%F6@KRwoSz{u:2h2Ed#a]_%rkD2.kU?s,iaR?"4{n! 6" M@UZ[ݦwf\|]Pu9Dkכ~?9}U.wޅrWG"> z -};خQiƏ2anVqoBmxS׳X9aYj eHZjV0H Vlԥ=nlS#%?IQ-uhw#AKezU*c|䋷?H-$¶~;ٝ؊ nzzĬf˫oWF su"iRd DŽ`PD5L&ȜAmӆJbJv _"68^7i܋\`!8'pF AOc0V6aa=H.yeۀPpR NӖ(8|_,bU"SAK>S GvVwC Ӧхp:^0*۽$FO}5lf_ |Ǔ:u{8e"cEiuJRY2g|]"s~9f}(:D*{}E¶OtCcrO:wz$?0A 8bEb[_%r5wAtM<^}Pyʄ\q<}n qy)M<%Bougs12qo\w!y& 2QLܮvdq a, N1Ci:9א? c3SLyg#|չ08-ud}> |bV-q&I,m?P>,v٧ Be#^0 %I]sEDWoLlC4YA8U(_=b'L\n-Pj2j,TlW\lW!d䵾:ÆvF%FHJRɮ2^\"s7ED+DA BYd[hMث(Nj%>}<(l7~ J@@쨟Q1M)M0xlqN=)_#Z1/n/w,QbOg`}WlŌ/7Ց\]zct._cWEME`Xe'ܞ~E5Jl&юC{nޟT ;.M0ĉ ~۠g}2{ ϤK,gfv^m&).I~&m@`R;vtncɮ$0~!Xf<ՅۭyO7k+s'Ksi2WMyrSb!xhxdl#BTLc27My>/>Z~3ߡ\?H@C$q7rz|ThQҟkUb%XZM۔!1cq8>*U(sEsԲ4VStY\eۍ Mޔڹ!%F0m-#H kXR#37ٳ*;F@kI~,“yWUVT||mOv{K:6㷣q;(=CLRLIYUd~zmglkAv9)Qn~/:{”\5ٛHEPZ!t>ÿ/ンuC,kٛ'FCV%9\,mu2BV~͖9=F.&";>_Xr0= DIڂ K`q-|J~ 8l}My P%o 3RR=-@F*{8W{r[+GЙ*v 1܋cYb{tyLx9'' *[œd-q@:}čd5e 2y,<8V%yt$tvK;;?,覱;p/XR@;Cdvb8=ؐřr݃j M0Wy>,Vew^3 a$lC忤_ٝMb fp>cdQ9cn\$W$ahK|N]"N=sj{>f03QR`:7YM#.7{qOz~CVb$H5x4'fq;?=A1$-Kaa,߇9^?$-%XnuyA+)r,f#A:Ȏ@h >f]fO$ZCB^L\.{q͌a#&DS؁ֹ7PHm+-CGid;3_Q|?e2$F y#+8\-hݶ/[[f>MKPeq۾ܐ߇CCl 8th%4h]f* fH3j=D2s?Xp)MildYڢ' 7%o[s:JILoxe$!,.>3kh_Q9^5r'3x$UB\j7َhϵ<qYb4`eMK ( έ%|eͲA|~[$}?(, pNp8˲SLT+2V@(,S,n$6BR2p&Q. yY ,68;8lg-'vFEZLcp/&g[PW1a O1\,lXpIfRNx .v GCGq,;(]~?|fq!5&1sݛ[r3y[ʡ3{0,9fk^~؄mz{doOc V庱Qj'gcj;O[Y?ŋݓut|F;HB2d4f ]W^)0i-Hw;mQX N.y1|=O.JGu{Ma7\vرIZaa")hT!L>&NTb@8@<RǨִTz~m;>obfjɲ;!G Fp/|XpLjʮD[4JFHCL#\Y_Qx0ΕTm@󹓑UP0*xOV0a;100Zl(Ԩ sxPv ,Sh,6i2Қ\ybonl{m#\?<ה&jaG4D6dr)/bL\LA YXzF8 Phjr#3- ~) cUk4J~J`1Ib|N#i;XExZ\lki((BVcx"a44;2*5Mby2'z'F3KQ~OM&WB4~{%cT Q IK ~3{QFenBڵ6۹[U%¢O "=o!#²t0Ixxym9JD}h$mc(h4<>D۱]07ZN?4m+n#@[ljZtze-N!өe6zT{jsUCI6CdLJ9z: UA)SaQzm7}(OcM 4 /D$I0}a۔aMiiɉHg73z_T5G˴y%wvU=ӳCrǖB##z~4gH?@1fjRy"c ,\$io j&Zb8Qc|E+ \L&3{?&3Qvg.)8;\%hZkmcn`k؍$U-o1LUMlT&Fb:BgsU,XM؄ȴ=dލi9E$nڒg%ބgUߥ)MOX'g1$daHA@*6y¯Ӣ14^'$$+FF *ZĘpl #“[jT),TT3K7UwJKFTUkzNKK =Or7N EV{Kq-"8(cn~"Je ={6rTu_ ZH#ܭe"v}*ߋ+^x1h\~aZ[[Nԋ"eݺu'FQ@ f̘UEU[QջFQtA| TD?90~8+V`Æ dYz7a}ƌT*oT m.㸽---gٲe4cʔ)a~nqaY݈z:un/]N\4sL(bddOιS1T=իS.sƘ9g!c񻭵ݪJkk+{3TopN<ꀈ\ |X@*mDEIk\>7X;Hm`XD1GU+VCnZQ?.#<" u[S $"q=:/U}._/O9+Yazw%%0!hh4MvL\0w.P񙢎(le@ozX7 ۝s?5ƼbH.clliƮZ"!"L6eQVU~9dLāW<e)JE򕯐o~ P(T;vιKGFFq=Yr_r!̛4iҊ|r|q ']]]UVqS(QiW~WUT7 չsܝr!!K, R#<ԧ wy3g>hGExס@gj6c:y{rcK;V^}VXaVUƞ|A@^o04PUڞ㘑Wx_V?g'eLwSO=8"ϖ4O}.>ᇟZ;* >Aىs=AP՞vMa= /f&_EQ4&"DreAa ~jr1ǰtF̮T*D|>.2juZS&YȒ+S뻗 tAlf%bN=y-TG%R% տ@gc}}q&B׊%.Bٍd ]Vͨ;#'tZAc+kM/`?hTvL)ꈂ"c|3.DQo֯_6઱@O%7ب7loK.9gdd${A^S*7o٭o[vZBkڵkg?qW0$RiǮgv}OU=Z{mPAXdll]]]?c+J$?|L;]VQVi0چys?(ZTsiV;{S(8餓馛exxjʞ{y[PooGG{ '4&4\};q[ݘg{18SxK_:~M7'|2hiiq(cLlsݍon{{##ׯ'288wJ%JҜBO\.G?gxORYX,yzbHCc}RշcccO~ΙL&ûz{9s7-]|>OZeL6WoV\yJDYkw 3g?80_?c?͏~#.r&OD;Mk gUk+~g9)t&m73ZSz6jd,xaR + G'3\+"!Qx޿ szԬܴ9:3 WXA_\:w@&gj^3B\wzwفz@C5(DZY{ ,;#Cj$+2je*[ %ғ8.U=_Dq6cƌ%Anħsc1#zqm줜s*{7G}^qS|>2crp6l  /Tkê9scL "Ǫ`f{ jדFZ.e+оi%w D$E/D N"{) CmR/"]zpP'/_Kn pl6h.+jkmD#D,yyKg ܱ37Dۀ!c14i?pqܯ~EZ”A{{O<7yP^`OKgʔ)1ydn6֮]{xOOϨ.M]dd)U Oi;`Pw,4pxmsQG_/˧=qǣ(CCCwtt/s3j1IjDac 12`_TojXk˵ZmUKK1gy&{6nk_Z:::p7::EFls8.7 x ps/|׷CaqݺuRN-\pIRY/~k޼y{qpnU 9*c̍A4XA0u71ڴi?OҲ{?Q~,HUo, r9sD䴴_ϝ2eQ NX^zL/088x0lUZ!_|+?#'1bMC\$HU}M:\ѱ)<8X Ƙ''nxXϚEێcc~`l0gJ{aڑ1"s/~o'a=c|g|Jգr D.5\ȗ}|=x`S^~N8_~cˇlZӿ r 8%LJ!v/H4xs-}AS8>h})BEρ5H諌a6ě ۀoTU µwu׫իW>,FU&M-CU}ܹsm&O5\o~JUUR鱖}T-ι 9ꨣiii^x嗛(4QV?]?BbH\>|ttfkyztEψ Z~bdd0kTXOޯAp$40;FGG޿HU0UDdIcíO-Jei\~>"" 9q4 C rsڅιz"v5 ';X,\.9@U/^Ä`;k⽧(jFGG_gA󲗽쥳gle4M7vc SL9RU/󴵵i&J!CCC/g}}+ŋttt㜻ZԈtMƆ/i J[Rs'p1 iyƘ!UmW4hT*O|gJԩSVd 8?EW7lLTl6{h&\Vj/-U}~ a`csZ3ffy|ƍ(d2O$"Zk+J8;:;;._ac̏TF;VJͪ'}%1J򶑑K ˝kT*JUo.鸞иo^g``}kʯO:u)z\&/gAdιW6uvݕz}{uXұgpp˗/cW`9HDJZ^vW*{묵˫>ۭRd2ݼyE\rɿ}AU/FjrkRSnJ`={.76>ZECv|ڍbZi$[o\.-DZ2zڧJTǢ\zG6Gbƈ܃L]|EGW#mY3}KIeύƪ7y9MgAJsV=1|>gr7yՁab|q7^dg_WoUU T1k|y<5wAfyME؃}O#~1Ҷ#6<@egΙ3kCCC?ǞRtVX (TsT*6 Cir[֭[wg?^ 9aYq_2Qu}(UYAjzsJraZ}CUnwjE=;c sFGGJr5ߪ#644ĢEؼy3Zc5<~wd#gՍ?MYw/k9wxj,l\gy~1psx{pǴ>#c `~s8 §J% ~~e]v7߯J!ߒcdd1ȥ8_z~T*=PVQJA(e(Eι9kf$5{anٲL&(̞=(^b9 ϿIUMDظq=ιýBVkyAUliƍDQtBh]zٳo\3::JOO)Y0agqvmes}$ DL&l6ٱl6{٢Ez{3ulllcGG{1"(LutS09TǙb>cKvttn9sι0͞IfϘ1###w]tE+M͵Z >'"稪:>Uן;tTMX-" 8qƤvҥK͛d2d2OFQD---XkʴsOϘ1։) v/ttt "[T~ "/,/k;\Q"sM609pecell޳: avj&9]|cEHk#vE@&}WUr_ #H__(q:ԩSLܹs:u*ׯ穧zBM6;ڃ h4ɼ#axmܴi+VҲ1vDQ4\.=W]yf 9wxs h>1漆{8͞[,vڃ9cV=#RT* x7pǧUtD{OkfTc L!* =}}}ԭq|Mǟx￸iӦxc}}}x2Dz,ӦM^/T՛c;/`dd5k4V`=o,=_b)u ҒPv̩G֟Mm4v`[cաȯeͻceҙWVd|P3P ZcFUݎX[2| +:VN+F U -_=5^̽Gh3KFFߵf_ŞIvNZadSxg7TKEMa}_e dX&|RnXh=q XGΖ!͒d^aaŊˌ1 2yaHS#!snq4lٲNݵZk 8ؖ-[N0iӦ>FGGrvkGGÌ`, ÕwLfL&c29ژ3gW>aƍȇujMvc=ŋf0<_UommeΜ9]9ׯGD>h^UOPU 6<2e \rL&3eppp., OzK{n_U0 Ϭ'78>{O.3 "tvvKE,[q4Ǎ1/!cz{{?E Uͤ""S=xb11{ ,gT.jE_~+Z̙3ۈ_MRn eLf^\~,u(}eY&OEGNoܸq}_1LQU=Z{n GXk`ppb?579};K/tfGGGGSf Dħ'LY c8>Z;Wtww3uTFFFX|8Lc޶yf(bҤI3VUI=oc,T9sP(pk֬9vݺu|K^җ>qexE'| \n=ܓfIL&96 C㘡!rCXɿu`\,kӦMc``Ar&ZཷLb>M7d)SaJ^{u… ?9ua=<<<89˕운l8/j罷aޞj r'f85U=yʔ)JȊ+s.qΛiX 6&чEd+WnyO9* \~;::R}[U{ AAZ}^6e6>|_}g׬Ywju^RyE=քAM׮cuNɱ챑gSKm>ϝttQոVsK,ҚϹQڳf*aj@%򃵱zz +l8l/rs%7zlDzZȁ3:cҊ_%տOA%Y c/ q\G3Wl~qeЮ,ylׇ?ڂo3;Zz󓘺vV\BZXkuuuviu]/zGF4 jrz"'c̟ZZZNkמ>44Վs1]kյhҤITUn\.wi\__}}}y1zٴiCCCT*cR#s1F)i c˖-cdd0 {͛ZWZk&]ONY~3/qLPıuCarA ==g?oDqs|{q޼yE.]z~uSEƘCSfZFŕ+W~xg>oO9ax_#8SUEъHNz(SV#3e2LGGǃ__4m4n&֯_ϣ>zںu>oT56#96l@Cq"BV{b>M'_rz{{{GH'OO}zk??::z'`Jj[lE>Tw*:."044tLZ%-]L&C&9wxʚ`r\SO=Y[r\k:CM6qed2wAk^JzkG ȟJ=OPІ^o*O+ R&\Zi::L㩧G>oK1!`s}.r 8X,C)XmW'Tbu&{XO4}qV?H9lL+Oy\Hx@qkKƺX2?bƊWZ/GIqR˱`b E' ;֭Un6\|MпldfK dBuwwp%?9?}s u3kʹ<ӆ<3OZL,{zcTb fxW6\B!-0[߫T*### " & 1Y֞."ޯkt1渖Rl ,vZټy3a6vGc(J7gY̙pt2Z F;;;Wj5S(fk[[[7N4ة?Z[|2Xr`X\1::*a^iӦSg̘q .Jq0}lllu!Gf:(J<8+1L4N8a{1{-c9"ҒTuLU7PZprGƍN[77 T(~Hcډ̗IՑVU/?ι)S2yd-ZĦMhooaK[[lڴx:0 7Ƽ{I[SO''x({OTzZk2 ׯ?:Μ98GFFVOsc:Z{w^ںOJB(K.ED^("YkO~2}sd2y=䓴S`cL`X$1aR۫>k֬YSG>BGGǺ0 N͗SE100pr$Yfѱe˂8oLK&iӜsÃDcyOGGlv͛sHIzN\FDpν%?g{e'qƿ~2l_W,ιL4E6b1hS[׮]9Yf]UƖWJ8^M[[ۑ vA7%KLkrAGy3ŕƤqVx 68Xҏy{Yk7j^Dnݺs͜9Q <_X.Ϯj;;;?>ׯ?5Q*cLzQW>S\.)S?000#q/%MXϺLm>GQ`ܮ, *2GAZP89Z´Wg[[؟Ȟޓ L`YTcM ?кZRVɘ0vP \ d+5QĶjU"rѬi~m`UKln&qӰѓџNk DFe1zWM3Ts5±J55E'xb},]Zk pvK49sp'3000k2eUT#bbJ¬Y{'Uu6鳽6zST(R,(bM&j%&آ&jE@QDHmoむS9s=)%--_suuu9@IFFiiifvv6't1TU Va{f$I8sNz 6`GOڪUe=ܔ\ux>Z4p8)i6I&ז3M`Fxa0%;9vCM>4<ϣ֭C4@ p8vm]W_瞣:$I?,˲Jn5˲&Zp8ތD"`0t:$gbY0˲YYY+&]3N<' "rdGe8K/e͛G]]얖;4˲}G"zɏ~#.]zyhhhYɜ5Dy]$ k233'gY}`.R.bh4˗L"3%IR%I$Iҗ [Ӊ粒yeY͒$])I횦yN.4iРAsk4Mp̙3SMܮvYϖeihfGVyg˲N: >кP(p֭W|-r%( o/={$==}HEEť?$50e b=333QUuOfYV'=0|_dggaÆnxծ];dY3vk%IZ̷:!Yii)]vg]n݊.eyiu$ $iKrHߏ=LdY>AM|ޮH.IRY0ߣGzP(Dzz:[n/4}50!_%IGAnAQ\dzTVV{eee!r-auϷ ''P(igʲvDQ 8#]WWUW]i\hQ`0d1UUq:vTۈ2 ǹ/eggijjX,oNsᠡp8?7 =2==4MӞꫯ8쳹1MSO W^J$5@brI*ZZZ,LEQ4YW777SWW$IKm$=voiUU38uG|ד̏t:t6\;I~eY#M|)k^o]=J PXX$IwEѳnw$adfYUU @bO08)Dw!X? -@,jXE%,øQI E"|ڕf/6^ 6ƮTUe"KFL)[1yrkD5Iðn5-ةhYH$Hc1Kfp,*m e6[\B4`4vMUT=]ΈG=ciSmlĘ?$g9 oDouOOy-oW%Oe^)27Z\mZOTE4/ӱL! }icix<'Ip:NcM me?Oz낓ׯ'777u]i?ey{,X I42w,k鼵UUihhX8Χue$Ip[ZZͫ(((<-\.ph4 //O>?IFPZZ( &;_?:/sss;w.| $̤xq皦#_^SYYyy429l,+ Oח|L>u| ŤYTU^$I999u ?/b5$=hF^,pW.m׮H˦MRt8躾\Q$I \fIn+4sM|; V عT,eLǃVUUYl~-N]wņ xml aYd߻u,+uaIH8Vrәjժ̪% [_zVZ*Yp8f[h)9`~~^z/b?E%%%l۶ۘFq8Fqiʕ+|444TF_bN󫺺+++K.c#$ "򂂂VZ7ߌeY$Ioߞ&Bдx<>! } IүnwæMF%lNe9b3az|Hdj,/}%_bXX,v,˸\tR,B]]x^\.hdi~ WfNgr.?bdeehllC(z[_m7o&^<iRa2J4},?V(ߛhiiyi=WXqILNʐ`)Y @V$djӲc=~[1c*`zqљ]r͌62;MqaW Ppf/F5XQYC˒ް|sC>n MgWǍ?Y*a5a齱g[\1iv-i*\4HLL5t,ϳ,h~e3g6OW_駟~Ixp\W__?O^{goaÆe-ɡ/$I~;$9l kBx@Ue}>dΗL`}8^\:h>+(iTU]^\\|rEEժ^=---!M0Ԑ$IEa4773 ȕ$i}2$)t@t]7 HKK{y.0(Inn---E$!YzN[n?o[4hYֽxdr/%I,I|Iڋ "'%I,*v8 }>㦦&3;MQY塯UTUi0_'Y4M۷9g]s5677ߟV-uŞ~7;ou:EѿIŹ'VTTt`0Xظ%9tU`Yf4܌ieYn'J|\iaQKii5k ?q?@vvn}Hx i`}{~:9eY,U%_vlRU%&;; [lRUT4}Jx<^,r0䐅}^+Iz9zMӶ'lpΝC'7LHKKg_|i,Ie%@-2I[Cz,뗒$rf%,_p8\Q@˲ ؼy}gY ܞg JdY~:dYnq8]i-˲|4٣GN:m-"zjY{zR[[{bCCc>c |>Y%L&'&>ʕ{̲EIvg%OeYAUUpL,ZiRxjm *{rO-IV=\b .kZ4͚\6mtKR2m+<=)K-@'Mزe $mq8߷a8u$Igʲ\ ܗ]v%KPUJdh4Jsss϶f[- m3M~?ӹsgCQ>UUU69t:tP _:+33;r4m~<?4"[p8Ȳp88N"gHEEk֬!\n:EQ&1w+djs}tbINFCU$ÉC b*;t ["|?i,kcRsT%+3b`;,4%>.ٞΟ;qscf'ȳsWppeR2WY<'zǝNf2iޯ]0 kzQ;^ka0wd{Ӯ :V~g'P__OSSYYY ,h-jvY;rXj>dpkJ FQ;guq9$~[/kwX;J͊蘆d&)o-;q$mbwN~nllDUVg E 8TXo?~6/;n4vvFfOG''T*[eag`;nw~WTݵb}NdaWB]۝BXq-hQoKA0{Y 6tRJ٭R"c&HĞE@`0H9r$Ʋ,O_VZ"%@4p~v^ %ov ]ש&g''{5u]'f/N'qW>\cw..~ ` q\^zѫW/8 ,X9sغu+6minnvYv- 4Ç3lذNF>#GdڴiZ 8gΝ9sfƌlذIڵ+{gyxٹ|;D ##Mضm ЧO,XZt<9tLϞ=e۶mٓ,֯_O4W^|,_u֥oݺLN6@ K crB1:|9iii >!Cj*OgϹRU.=>';;뮻;ѻwozz<.]>6|>sv )vRn7p]v_5:K,AUU 'G_USҿ(t !CyYlYJj@ %;j 8z?_4A⬳⬳b֬Y;|7DQ8:t@T` #Xt]kA=zhC>|8f/fd B]R=\n7cǎSN{@DJD ŋiӦz !XUKK qWr 'Ku/`*0F> ?{bqq1<O?4+V@}.$*` C(W۷o0 &NСCÁw?֭[S˳]c&"~'a75^xꩧ_ʿojkk4M  BA[X,Ɩ-[8OJ=e^x<."+{^'++#Gڹm {oSN9͛7~z6nH=Rk677cFjl@ K " Ȳ̽رcG&^tCEEyyyZV y駉F; uo^o߿?gu%%%v/u]D!XP( b1|AN;Lp [oEEE> 8bH 5%%%p_OY`۷Q,_&|jhh 2u+0d G,[/Dz,t]-[b?0rٜ  iC4~J(D"@0`N=TĄ@@ 8?\YFuoN,Ga?t$f ʲ,W? [K/Ų,1D(Z0pN>d0 NQ,## MhiiaW;;v,4M!YA[M 9(Bee%C aРABQD.@ K LIJ,PU뮻N41Υ^J8Fu!Y,@/(B,#  ,'xΝ;9۷/7x#UUUh&&%m %a"i| #oIJ,^y~?$aq!X`W 6_~?x(g?C%?j222DDK 8}hmD/!#=zO>\q466 ` ]0eZFigצ-@ss3$[?((Dզi , IDYz:[@$0X[Tyذa.;@SS>?_ss3]tfȑTĤsws駧iW_O<Dz,:t耢(h/K DCC`0H{HOO'xBڷoO,;رc !XHE6oL8fܸqD"ү_?~zFHD0dȐ!׏=zljD"D"1 Btڕs9ZvwܑZ nH$B8!R )knn)5~MMMo;Bf---455܌aA,[oGl߾EQ0 #giwy~l޼FD@F,fn&6d9%>зo_fϞӱcG  2 #2|>rssY~=P:n7wу-[/cwHfN'QPP`ӦMx^N>d^/[la|>uK>}ؼy3=@JzMnn.555^0ѣPTTD 4MCzz:k׮6t-`YCuHOO Bc YNkmp8"pi1k,ZZZ8묳0M5kihh{EQN\xᅌ=nxTUc<Ȳ}Gaa![n?8̚5k>}:ǏOdӦM\uU |mZnVnf***[D"@p(uEQ?񏏈}$ EQ?>:t`0H~Xnuuu(eY8eaYpzlڴ?`03̙CQQݺuSO=_|\@SS/裏+x<Aaa!3f;冷<0]voON_iӦoO<nn^{[opRFMuu0 @$( SOa]Β%K ݻ7 ;0f̘TO?E xz}ҥKq\8Nb3gΤh4idgg3g,YBn5j:t@u<x4 8CKK G&##4QU~oxwuW~ G4@p у~SN9Ⱥ:SUYv-{o߾q/_NZZ^KѾtmG$IBUT>w\ze֬YXE>}?~g[&''TTT`](>R4@px䪹x< 7pĜwp0o<Yx1P(%Pvjcu;&Ixޔeddg1`~SUUŒ%K;`L<:.;T^=s4T ~3*++9r$zjF$uVdY;Cǎ3fLM3^{----o#i*N,eIĪxP(ԩS82 Kzz:,\;33rLEۉuYh%;;I#--[ow}χEUU6oLyy9C套^"F]]=zϦs\tE(GUUSt:ȲLee%;wfdff2|TgqƌÚ5kx駙8q"O?4 ,+ :Nn6ؼy3999ߩ-z@vm>1cR K ǎ<ԞsݺVU5uv'[vyyiȉzI(//碋.bРAGzٸq#qj(&77:rrrψFk׎Yfz9S>1{l$IW^Ae.Bo&ݺuCe?89Sƣ>رcٶm>(۷o'33;_ve8;vݰ +9j}Ӊ$If @彊~ֿֿÝ( px,1!L{m-Jwݔk Ifˑ~ re9UFe222FD"Lr( X,|^"HjdYNU D"#'iϽ{D~o,[/\xwu\E_GQ曼rrrRGu^|Tkn222Xn/&+++X^YYɤI瓝Mmm-K.%77 ***L^^$OSUݿ ~?%%%,[ GYx1 . xODBit:x<쨈=tzS 6lpPZZJss3qt54wӥK֮]ˢEu=p8R%pݩdJ(™N3uB\ɠnwvp]wu^YIIa!Aשּׁ,t]GerrrRMpN؉)k=1c#zO˕*a<`&; 1i|v&''g}8RoxNE}\O2v*,p80MۍHc[TUMɓr"ömhYVJߊ,Ց;UUq8躾fذatԉ_l߾\ )"v*8,rp8RQ NR=T*NÁ! 5<٩hLu¶Kx<dYvIG*-O*n;u׷~=xPUɓ'9;&:BAZZZRollL mH-g.֏,_z˲HOOOZ%2331 ۝Z6 әepٳ3m-[P[[K,"%8,ѢY"@HoNJLŮų(@<+MS2gvm_~_aw|>oO[cʕQVVvDQ:0Iܹs*"/Sô{ws:R[[+ۋ?8<>N%IJEw[Gwy;l۹o{wվ}{> ~eYUP[FF466 zm` q k&`rh{~}x򨨨a؋.`Yp85kgq:"x[ &rEc`ذa8N/^ʕ+k[n! #@@ @(Juڵ+v---h,˄sŢuVXԩSSru,%s9<#}\wudeeqFF;D[ZZR ;iB~~>Ç'''-[ 2j tӢ.hh "nHA]K,e2FA̘>? 6\h4JZZz/ԐPee%p/_~LΒvZ&L@YY1N$IDQfϞ /@vv6p>{w+V0k,$I"??N8EQXzuja޽{9Xn۷oSN 4Y|9uuuJ"+Wd(rL/G^^;v7`֭aV\p ͥK.,##`0H8۷syJ2d{=f̘ƍw7;a@H>kk\~by>[-Y*N^ {fsj;332+9r$ .dXΝ;sӻwo͛GSS~!PÍ7H>}0M%kթcUL񐓓CVV|lڴ!Co0fj*++q\q/_Q,A"/]V|ޒ>|N=TF-YD.ĢիW3qDƍwJV+z{Cyy9=z ++!C_c&>,7pW\qӧOK/'0 ;ó>7K.'--:ǖ(GEiAaa!9;}Z=ѣGOٳɹ瞻}gyf*_te6l@NNN35R KІQdPĤ*gߜRoߥ/c ,Y+Wd„ 7.5Xo۝w4e:v7ߜt555p8Rt:D"tԉ;3UB" +'իW3~xO~̞zWзo_'\!YBm/Qb}}4'<'O !~m]VZcmva뢕X ˲ԩl۶'\xlڴ7 H>4MxA222s=0o<8#G$==SXXGpUR9Wvt%\_믿]vR%#Q4Ŗ8*Ϝߞ;O偳qBZv-eeeB!yuof͚Բ-555<[OdɒԺG\M0YEgĈ<\zHD0d۶m{m G(1"79ߞ&:%קJ8|R,W_!"2. TUrn:pݩN.\Hnn._dee}vRKHļy!)hbʕ<*"WG YYYs=l߾7j*֯_OMMMj ,Iʤs,0ǀd? &ueء8 IjhZb'OFځ|4h444֎-!X%fP[n'dq)9  t HVQQ6l &9YHZ_+'+V0eʔ\aÇ3l06nHUU>(H8BBv>% K vFұ&YũHĉ;ʕ~l]htڕ]"2?<+VSNȲ,"B{Y=8Ghc0R3iҤc !W=$ :2d Ga…p8RÇB`W#"aazF(.:K9Yvvʕ+y衇\ PU￟ 6D0ge۶mbB]l8|Bcs#]4`UTTĚ5k0aeee;,&+8YjSL+wҥK>~͛7! h+Wkc ?țvdϺaf:D v+YGx\41իy\ ѣG X~=`x<.f ::QdnYUaTt޺#nqu!7j@5k0qD!W?2ox'뮻())4Mm jhdᡔ+ "&NYs קTA.a5qDƍ' bJϞ=ٳ'N4 ~h!XG.ͤI Eb%80bŊڅ? ])*Du/k׮eBL^yfΜ)fdA@!æƆ(HvMgwBȕKɊF)(8E$:ЮêURr%H=\F% ""XAefveSp:5vbf!qvsAڵR^^'}xh4C::uDN컿n؛ׯZ> b&999H$cYJDQtt2w&ĔWA,dYp8oܹs99rE)N>3^}Uz p{zl^> tb+@ֱ#Wa͢΂k{O6iСC9r${4`$p:}7,YR:qđwu׺=z| *2`==y͚5;UvvvJĤ@ֱ ĶsSLrr6#KJJJ):39r$zY o&hnnN8aҥKgm޼֎;16m_~%XL@ C%QPX%fPv>(G40 <~`0h1{|0n86oޜWZZJmmoҤI<uڸq#ӦMcb1b%:EX[㬮~\HsRb(Pp֛oɜ9s831bYYYmj)++c˖-i9993i$~߷N.oSb5}tϟO8&''67R :buQu0 ~|A^u̙9C[InbgӦMbF|-Y<zk\e˖j*!-- ˲D@ @%jZ4 nY*?YȯN#-Jpl`&^7zy̾iFSʖ`0c=zyJ$!CAA+@ֱ,Q.?!$[O4ۢx(ax6U ===U3L@ "1VaL,^" 6$(m++.%Yk !X w=gBRBeyAd?;`>3nU\J(P=\"$DqK5!Iz% Y=[ZZ6\.kO҂,dddVp$ 8TTWW3ejkk)((ؓdu5 + S@ ,B$vO$iܮ( XO׮]E ` ljjj(++aOae} | 8 gW~/ÿ|ȕ%˲9hYֹ;?Ge1 2/N KptP[[˄ ۝dnIn,9bT> $)C_Vr$I8t],˚ Y@Jz)NpIHCN^^Ǐ'//۷j}Îrĝq|v+˲I6v'WǏr%8舂O*Y&L`{L|$ Y 477}v8dff'w4eMm?E!++ EQv[O4kZZ'Uih?4QfaKzz:,e&LdܸqKt!X\ƍeL[ZZZXdI*i{؏$lD"8N8YYY}هmb_}^׎N2zӧa f*++qh$--m3f4$I"`&NH$B޽)((8lyfr;Nt!X=J-W.;Yf ,F1c-0 XRP(D  ;;.̤^|Eڵkɲ,*F7|Xm۶rXr%|dddetޝݻsiFٳa](0i$***,477f ߍHoihh`isUU~=]tisl2Oŋ,{ښXafС9vڵ}}7x饗h߾=~iYq@fUU1j(n6ύL>O>Gh%'Ԅiٓs9O? 655QVVFUU۷bY?hjjmY{/'phB&555?!sw:Sx6)W mf=]U}}=YYY~5G_^z/UU="sԨQƭڦӧ3{h|6yl@ @<OU[&PVVFuu˲Fw}BBd$ Vm]vE!r-YD" VEEEGL楗^̲/uuu̘1czm&)Iibݛ#F0dȐ#7nV߹{.r%%8\8N$ 7BK.c=w 73xh XH@4|ߓ/^|ŋ$&ZvXmm- 2ѣGS\\7//'>@I&!IR4o0f`ވ̙33g۶m#33VkFݛ#GXu #| . .6āzJv` n@{+ɋ->`ɒ%\$I"QWW#GRRR7/׾|X__χ~Ȝ9s$33wHEKeBPݻ3jԨ}[׾DgDs}t!Li ,*AZHVs(~ܺx}oa_ =OlG$| <#Fm xX&Č5 ]iX`Ǖwf裏O###qP};Ϫ E]ĕW^/go.C7: TLʄI_v{'H!o<*"4L$͜C NEwℼTPt೽Μ9sxjnngϞr-c5x`E|h.2 $I,k2'uze?png}瓖v텎CFbԨQta_618Wi}u$]v * #oۏh !Xk _%WEiUp*¬Âal¿.,dp`3Е/a֬Ytu@N$F禛nM,ͽ3a*x ]n=y\r[cID{?ӹJmFqq1cƌaذab` H<8 Oda#V@BG6J@G5&ze;S}#KI<\ZlOkHOOA( a~3bĈ_kg̴3q9b/ })h"?> ( 3~xg3KN;,{Xv"m )KaH &KpA-߿?wPh$KQ\M0@UCt ?q6>>>N=T***Zȕ=,[ӍA"K@ 8$ 0{wP(D0ܭdɲLee%ݺu;P+)WeG\ !X'w߽[ɲ#W]t G̏?%r%J %v)oH(TVVҩS'&Lu!Iw'|2jڵkC,cРA7IIᠢ;2i$|>hcӖd.L4,X,@3z*oì^Zȕ (w} 8 TULu,ؑo?I&ERur)dp@M~,@ `e…?CA@bqGaÉ; bKʘLJH>IJŎKYV.#r @0@@ @UOi":%0 *qe×o^IHēfsA^>QйKbU+!Ht?AC-A@qB,χR{/ _B#pä~a݇o/ˉ `޿&1`]@`+C.ӕ#AAO<8W#w `Az|7pCa0`,ĂuHOD {AǓC|z /)| ¯N3n7K/5AAcz LXs@D{M UðUIa۰1uX`&/E>۵>Aiu T| VzDh ]5upHo[% [!xW(AZABںPK IZ"%A!AS̤.lT$budo!j3,TY"DtUk&GQ25mD nΤ+VHcڷӾp,qߞC0ϵOmAApr:W%kgӑHD>{+$=/ kP<dھ%Qir淥"!X*WUAN^Վ//a%żsQgz ,ͰR4L&tPbŠB]27kf@<3!a@Kvm}m7sbdi D+3˙N~F/n. saaCqѭp0bp9t,,0MУp ӊZ~J' !w=7AM(!*uDI@IFbfj8%nRҩ 4D/Ej&qx|{ _- #5Ԥ11 nņ@9)du#B7-"g)A]ؠEc] aAmHE=>6DTT>HybXqϴDwqw_w3 7فH "DIm=tkm7HR3Q4=h/hI/a1"6ڷ߫9 C t4n'z F!'"q~h4NX$Tr`5keD^7 2'fF@߱0p]pX? }}ȋ`&8'Aׁp j(~4azF,Bo# ܤ3rt3!E\Kgy|Za[HB7B Q˂>ntbsFCԠkJ8/#,$ +QѬ1mcYHs* )1λ냘o|^ĨN>n5,z9.ICdBct+̀mnfnH3IG$-T,.bpN3mSCREo GcA:f,z3!O_o'w]\eC^wO4R׼ HdS]DC*QE'WB \C$5Nµ|\Z\4z\!0=] El uY| N cmL\(GqDԷTr@\cZ:kq?zdC!9/C^W0^*X1<慠}/7~ 5_<g? lIxW{xHB~4T/^@u"D1D(%шɩJ\A53X4LKq^X 3zMi j9ẅ́r6Kf:d2[(ĠB. pguN^^ yI#ݲ(Ĺ|, .0"©E~zbc߮<$1kZG%*}/,Vyefv8e/ns!o>َ*˨"`CTnG3B|r&"=uM/ Ny?,W~ }:]}vs糵vg4M?3C3b5t;+oӏ})ȒIob7G\0)*PIW}BIP:^ϖ_1ctB+x&y2ᜥ5"6լg#ʠ3Nxw_DzM :XxJ8$U ,||/w!00xs\@L&($ڞPL`۫`((Ȃx8'm`΁p(_D+~")4e% lhd tD fEg Y+%aAܰP :xmu gA܊0wN%+yqS_y'"ʔ 4Va< 96)(?qr[\r9_Bl'Hc4 idy2\ ԤqEt q1?|ni7oT0M{q ws]𦠕`Yt@~4.%C1QJ,tVfеHov7/tkt*J4^OEvn757qr|$^暏=)ꚣ]H%s)XCU_8iҮ7 -pRkjM_>?"w/ugҿf;lgKn&smw_mIȔ4B$9aԘR "XaEhWC* Yv )9j"-s# (tt-V$NMM|-Jܰt)b Qe EM+ǵJ),+^K )JS&F$6Int-tR w5ysM ώhG̰ ~5 ƨS8 mԱbYܩ1-,aj{,Z?U3b :nf,]lu0M-&.s^HInW8dN$' *RSL0L 35 lo>]nf;fLJqՙt*coSISEI ɭ.JR.T On %yk> D Rx DK 7} Tu$ \Lt˶GS}_<)/&da݄xBwSԑϵ YxUUJ0, J$̧ѝ:V{.y3 s(mЈV*yކܪ~ߥ-8 Za֖FP'ǣ3j)eq#^q6N!Cy>47bP25Cip;0L-Q,)f)M#W0PeƥflgV&"~ᜥt;H-K`}$(9:v$ב=E71 Š%R.c{`%^hsN@`N)4y9 r"gK %ؙt̂(_UGylX>,ryO?3XQ_[(2YnC6!-ɶN ߜ/9oջUh&n9,.K^$(ur-j$Qǽj xy 6S3eY\~Φv+VCoƧߌ#?qI&HIb&`D!OD)߇hۨF􂞼[U(ܶsQ!MnavkBɛS~l;"Ԓ_ H". 2O1E,jw+|M g&GG{S琩$f ũEn#,S8MŴÌ.E£ʸD'QĐ ɦ&N䁑,GwZAQ|(DLaf1<6@_E7J.J(WF/KƟu/K\3n`Q/"n'6ڜQh4ɬK_4W n|+NG8;v(װveb80='7A=\(JYYhcBoiI 4;甩!W6setz8yocy]y]f[5yeܜdCj&lY#ؤ.C-Ĩ)IsP2X^c}ƺ& 4L X@u`X4̼!d85 TcKԤ!F#[ڢVL!HiSt?a0|w*191(8>rVʶuB*Nؼ}=k+_$?EٽjL~#=M0/ _I$ֺ9߰ Jgvd}loZJ(ZMcheQ^ !7QU?p: 2Ob]ջ,\  ΢ 7|݄54S۴ qj'DeU8h FC,qAy&*gҩ`8ٝY]|:pf@'ddH-*1}^Skd'ةm8\0jWC+B~7X> s!h݇'o$NG%hW4kw0fT|990^)h5t>F>}%y S n|5\{X.47Oa0J0ZB~ξ =υh=1goaIbryqz: -,K\C\ sW[YnQQe UJ@>fRI$˒Fl 5 *34* QfQ"K,*[tJxTʠND7)5ʹ 5^m!6t$q%*-:!$ϣ5,zQ3ܤ)f"9nR6Hw5C&ϫ2lͦ&g)< 5@?;%±D1N#1 gCAW #DcPod9 _MDH? .'4@eK԰n*''17Q|;D,vITw~T7AQvgnJ9J.Ж<7"ȍin0o=(v] H=4e'KHԄ jB.9dZ&Cb,B+/|,Ǔ;˭NiK蜙hEW*mzTH&,Բ=NQq'MFb%vdU>/C0-2Jr8+q3o[@uzJBR2|Iyv&'o1oTNZyʷo'Iq%isZ>7+)]mΎJ<.sq^7A$W= ^\PCb.Q&AI0s E[=hhiĂa?M 7o`_!O !ƂN FkI]/_83$1n3|tA ᭻aݶĶs\H DU&@'۲Qw~.\ S3'AvΰBEr6~R?PdU3gG}>$iKOrmSd+V4ZDnHس[$咸ϲ*`2쎉aD X610NKCh˺jyЀB>E9С$8c,6!kr3PxnR -u|2@@  A`6cᲇ'dА&YIv۟Hfr;+-Px\y$ %YjH f&6[I$DnD)6,q$6ޟmS5_Ꮧ&JgԂgCY#?7=ДϛA' Q+I] 5ڭ$j$): !eHo ei˞Nb'35$QJJnB@pHʰEww9޼@E(@ K @@ ,@ ,@ !X@ B@ B@DaKAXVߑlanS(:>$,+8$8 M?i ͣl#K*(~ec瓑X(;qbX(?BU*:f8(-Qx?.NUgA?N gߵ%o+Јy!`jE'TF%8؞改Wa>\xl hc@;д#Ng{d\Pwwjp݉%oBB~ (-s+1ͭKתPŴѫa^Q@Wxs|`=qhh*;f6s%wD7{S|g0 Y~d9DWI(̅߾ ]@"* %8z">)3kKƨ$ddd ƢmCLp2۹Gj"k+;͑-,YOj`Z:RIKKKCV6rLdzWR~Ga0-_A #Y l#reSaص^d?r0O` TOmBn~m $%hc ,wA#V/(C&(lslmr>VoKX` N.O^EyNUVl\{KǏW{ƙP{7$_9ʏ@JҎM4CeE̺6f$r^Vsy|cn0xg` M /zG2#CO ͰxbVZ1_Ӵ?Þs+H >ЖvsbիVgffoJpX͂6ɓYp!]taĉD"a,^)St:駟f̙a){1ΝkuԉrƏO =MՂ ())b\Yﯪڽ{wƍth"N%--K˲b ƭʹ{P(D<?G$n7{?b1~?gq1/Ws̡ԯz,TWW...,CRc&SNeb&ea&] &0~x!YǸ\c|n7<3əg,˻˲em%>WUU1w\+t]AZZE QWW%\reaYaо}{*++7n&L ;;[ v2e .> 1Ms$ISeYnݺ1n8|>hc xHOOK8I2eY60aСCdYޣ(B^ѣ}9?sD0 ~?׻W%IiR]]͹{Iru]o!Qs(TWWӾ}{&N($K KpcSNe…< Xdu҅E|W<#;`iA= ,-[zۗ#FpI'UQQ/hll$+++5|:cdUUU1bĈcFqfϞMii}l|Gl*((%%8&jewtܙ2!Yǀ\%sv [,ʔeHOOG[B"iR__$I琈֭[>}:9@\\.ix$iXrS* 2e}hC=ĢEZ ~`N:1a!YG! ,G2ɲeRU5\P(,Ȳi44$J-V}MMMv[G`,Y#GdرG\͙3]RZKVva֭TUUM~܅0Pj-Y5551/>=أ`3ydD1R,}''MMM߱Jgbu04SuE rWe2i$!Y!X#4Ώ$;7M35$Sٰ,H$ l$餶~KZYmm-#F`̘1G1c\`b&NHFFA bAgʔ)"W|(,,dL0h4*a~)SN'瓞NZZ{f&ci~GB{{RoqLuL^^3fw=c}TTT0~x[ Kpd`-x0jgɲ+: e1gL/̶mRbu OibcY^GZcGbA;$ɚ>}:(;wA%k֭BBGSLaUvիWSVV&$ 1w\|A^xTƽ]凊an!=esb~ ф(H;sf p*//cmMv".**b͚5b ?*֘qHBCHH$i{q񸐫$e$k̙mZ̙sHjgڲed ` ڮ\}嗇sl-YZ' 4773|&O?Oee%dfft#SXX,>mW9\ǺdÅ3g䭷jsO0{CzqZڵkǖ-[7nI* CGZXj&L`ܸqGEQ^^~>G `ũT>a*uEQ1c@)FO駟jC*++%B:rd^'ђ5{l{9LpAUSE9,ykb]vmFx >*z9}„ BBGfڒ\,YvNָq㎸| /RjaѶm|HSvR*YvʖЇ.0qD@աNhߗK81~#fYf/}X`eYIz  KnY`pPe4m$I3eY~PVkɚ>}a'|25,Vjgɪ`ҤIB{$* ~HJ1ci+Y,YK.yy9b* aS>=3\$ղ¶3J.i\9\z7CV^V;U|'Ot^Wr[څ!XC<#C`ْUYYI.]0aB3f/lreYNbK-˒Ez_bui$[|b͆aƲ^ot4MlsO?@o -Y2e@C=ĢEV"X;Kĉ\N?qDEE!;Xr 1 sK$9+Sg"]`ƻNsp8JaB!\.w}7}x ̙CQQA,X,"raL:-x(ЋٰaǏgĉmfva8&??{\9NBХxOQMD\=v.TZZ"ȳH&`,˟vT 6orm?䓩o*x|AEt})ShѢ-W-ecduڕI&r{uݵ%,Ūʲ\'l?Ip8a]#:UUp88\BUUwq~+;ru?A`Ъ*JJJ8q,.,^3u԰~Ҵg[2dE"f͚E~~>Mhu8 Gu8$U&Q,4cРA!Cںu+eeeL84q vM L… αduӦMH8/֋-!~8{p$vŲ,%j=t֬Yüy\A !X Uck*,,LU||0f";;HnbawdYFUUt]GӴ/-y0(gSI,*Iiii{躾۱,,,< D =SN=l 7J***bʕL0K֌3:O+EQuH$CuN4躎(Ȳ׷o;L{'DȲiiwsߋeYa $1Ceڵk;O2{#2}_۳i&!%~?~~0%PF0}YYYG}:444fz]wEΝٶm466@KKK*z(JJ[ibFf'm)Ipzhll91bb1~?.X,똦()9l-Qea&ci"Ip8DQZZZ'Q V]D ԹjsÅ6mÅ!X=C3rdX &3gRYYy$^}g#˘'[L àW^G?0H&y$vFhnnFbDhf8f۶mq틦iwqtޝM6hhh  Dhhh L0$~,v B466?{&Uu>鳳ӑދT[TSX@)b$5&MF Ai۲6νǝY,˞y恝rsfy;~`JLv7Q{o5255 6pCyѮ]6sLN&%N $Boަ@H$r ;wnm&2P]QU1q4Mk$$I"Q]]8:$ ]iY5%U`_i5=BTEAu"HbIJJ oAJU[D6w[m6f͚EmmP` {jѢE]LH~;w.m&z:pqmz}%)} ɵRPQ5m/)QÁ?IL\k 55M6`|c=\sH™"!YB{HU[\H֮]]wE8nU[jK1u\=}Q?(**bƌB` ڲL:d[ٳg m~!-ts˕BVhep88HMMe˖-|ڟdS\\ө'U!X&>`[~(퓟M3gN^%)K IRcay睽͓r\.!,%h#[xŋ *((`Æ ̞=#W'zO*0)nx @j3cYVюI8iivunʦW7{]ر PTT#<ܦ<*((`Ν̘1r(m6[믿nh",XakN=Hھ};~;g}a * ̝;6vMS#6=۷oVVV0,-)#l&"H^˲Uezh^Bi߾=aPWWb0tk1ӫ([,dee[oa&'t斬ݻw3m4>l:u"m`5/>`xY|'Y444K/w=INbƒ%K~v;?##n鶓W&6^p8vQUUxa4i+ (CeѢErqqqOϗ!E"$MimŽ5MkL]#( -FJ_y9Bt8xpPQQA<iB7 iit]iZ.r ø0hԴ,kkI2Eyڲ,fpc(ZإiпnMfaŲ,$ n*//Bө'rRp$I4KI~YPPpڵkOᕆa<$IR$I:F NO/_+))yn̘15~W_\~a1_[MӴ}>?kkk BqY4H$B8~\TU0 t>`xfeeX,֘]޲4SǦixnܸ@ p(ϚyeYo,D.-if(5M{nTU ˲̤Hd&z͛7oݴibFeJJvMӨHd\]6mZz8q"7n^xe"˲#EErI$jkk6J ]Qz˲6)rBPgEQ$I ˲ǒSE ŧ@ %͋eYJ⢋kX,@$ɰ,!IReY(a5Z$DyLeYk2'aGRRRR7o駟&v˳x<~F_bJ޽a-//R,2PԲTEQL\xNge<=,MD,!Ii 5+|+!IReYt'IRi]rT$I,˹@Ll# IPZjrVp&D. i]c,˲4-$I҇P˲eYJKKURR~}}=*IREbYbxik,4m$Ie&ދ@ hC@p,p8LVVim6p'4Qrl?=6I⺮*.ka_$j4| H4}.JH$-LM>P%S øtvIUUpx(f]]S) $l*IJyPQ[5?i)2!-EQ'W!XP;v0i$~:s7ޠR,BUU4M#{@0 LDUUہٳ)UUQ%Gc#xm#2fnwm(.q?>.Q__rdY^Ǔ}r;M"Par4xD"LpxVE"٤2rH:vhD{~٪P %EQ(//gĉׯ3f 4wEt]'4N5v5x_RƚKfRNjj*999bv0,PYYٸ=Ihhhz4MC,MsU%l~4Mò,(a4{,pp8"r}M#`bP %P(DFF&L}a֬Y'd5 E2T(²,GrxO>L>]ש;!$+! G2m0 b^W673a_!I.WUזecNIҒk[~?n ҥ D"Z˲vx<@t:3~Nr:/'cu;@@ /,SYYgq˴iӈb'd%Hap8BQ.,/ ڵk&;!]cL\(6nܸ^MӐln˲~%Ii>7M>+++yO^o7UU,F4gYY?>2Ms$IziSRReͷ8ua|,g ai~?ɲ@r Ӳb]-]izk^|Q!XPHFƏH߿?SNEu[d%Ӓvܶڵk9;UUp\;_$<VChu+p#4Kt,D"\.%׆u]OD"o']׳rәvu=%0=CRsѣ]p)"{gYU-IR4 Ŧ}0M U(,(JTUխQĀ>d QYgEyKU,,4 CÎ~9992"{MuuuVeU$I&ݝ:iT]]ix]4m/!i=)Ro4Z#%m$S($_tM'Nd~dYZ|NjԨQo!Cp%J K 8'䕃3+w~.lɒ4ʓ.e B< ֭#77(8Ӊvvx< k%EGUUNgn7^ٸ(@uEw%߇r5n6r~Ngo](*nC\O|\](Jp8v9H$t?Ƀ:#{rZbyEQ6m)))TUU*IDBt-//g̘12dr XzEi8 hZ{a\,";;q?{2GdYJzƏTޟ\uU?!W!X;#)))\p--B4Skq,keY@CZZgKo+駟NJJJrp$'w+Ҙ;9oRSS;*32|pNYYYO6+Jl?.D~.++ /$c4hz+= ߻=PKD<'iEe= ]KJ5}r08XEatԉ[oꪫغu+UUU|>!W!X`o"@ /UAׯO=֭N)$ ] BaBl4߲\ !‰80lYwJUR 8(ACqxcSRR8sLJJJPȕ@@pQ2.sݺucMq @=zPSSC$kzbx O (@EDDU K 8$W'OnW67zy>s&Lȑ#~޳,+r]9e=bYVĠ+q?t](;EhӼZM(9Db9ZSSOwߥqa+!X!Xq& ^5#1M\.N-[C[oqYg1f̘NG%tV\L| YeŒ$o)"o@b(nry#zܢXBד@ E:MDPRR?ԩS;w VjsjxҒB^^f|>^k`>d[ƫ7-:a"VCQ&Mt̢XB,SUUɓ rAy @u9xO6 ye`[`$%Jp\IFV!YL[t:\)aW=zn料o bMs1ɲ|,Oϲ,`IĈ^!IR0ߚy'{~;v0p@Ni-}oߞoロr$"q;^{eYHLG ` )'dޫ}2{l.ɲ,LW= >-Ze?}\evA[\%),,d̙u]!YKR'S .9AVVV2f̘={2k, àyUv-_2 >!Wf-Z0sL\.学H!^uY'ѣfbTUUpMИQ<RYYy܏rKm $xܞ B|M;hU 1cw}7dffH@ K g K.!##M%J,TWWz2eq^TTʕ+ B|><Qp 2z⤓N:}pBvy)ӂӧOo >}:{/]3ؒ,$8qbyIɺ뮻%-2555q~_ѻwqܻwf̝;^D+yуI&Ѿ}{rrrZ:t73f;qTUU8b%.,ɀ:zh{ѣ3g0 jkkd$09sf+;<>.2<B# IΝ;s 70{lb ]v̞=Խ)ɲLqq1 b̙'DMBM㡺ż'!W!XAFsiGL>4E2M;=z\tE{L2CII!$IP^^N׮]뮻9rdj@I?{1c6Z50gz>jժ>zBñxs}mͱ;vC &+bF!l,˺F5 [,_Ĉ#KktΝ\p?>nz݇;UUU||駔$IӫW/ƍLj#f*'@8w撬|P(DFFƷ<u%W 6hT;c+v,cSDr$1,f%o,iC4vpw6==.38>9sF9sqWTڸ"I-ގıw>°Щ1!/>oxîwDk׎[o?444T)W, ӫWc95ˤ\}w|a8H}H웦¨f|G.gffrW0rH(ݺu;?~6i%*N;b%Qw:,^>=oߞ?t +,0B;Ex ?x-&ТXZ'\Z#{'P0Сá6g˿!>`q5;==Py̘1\/7{w!W#A%ci@f8Vgk$ Nm zwvW߷$QpE+vyl>c$'00cSc?A3f :t8($IBB7v#ygQ5ن?IL6`w?ϕG F11o}SۋyfhTm>PcRWWwP$Jp4F [Je8ka4>C(!y~xau1jN[*R}X|#gp?"I'Ovueݎ=ߕz ҟ~Hq/nDxs۹$ 21-NSFPÌ| >ƅ 3qȓ|ns3D^ tb-9)Z q)v j z6 O9˸bǘ&t?>O^ Fqz (ZҘ힥e য়/܅< ;} CSxBd ˴xu*Q0 $]Ă!t"G TACC, 2n& 5#zNQQ[a?ϩ x%/!nXUU 7+VwHӒэ 3"KD:dWVY-EP,H=嵫Q%e+ex!')#= 20Qe7G Յ}TU)˄vlĝXe&n(XNM2W9k#[xfK1(p9 .N8aO1t6'jw#>O"i/?1y펬ݱt١"턍%_RYs=ӎ9ˮ0ܡ1<7oK>[/#KOHk'~W`زk'YO 3pѩg.g7,4~]aWWDb{C۔+T'Svb\Ķ:soHX~i,aʼEwJ6~Ĉw;b;@Bh^?ahXAj ͠.+$dHmzDլ+݈Qv/)Uv5^RQ%xpiɮ+cTjdIK|h}}!oG.u"4 _3ǹ(rg[DX^0[~PKD(Za0=IVS< 9Qi(*U RٰX]51>Y=D?!Œ Kjٲk:S{Lp4xx\HtܓdTݤsSe7:+ǼG0RF40M EwOTesqgE& 5T︤2n'`}CO |ECLm-kB6 Q$Igr,K: xN&$fg.<p;=2^ .M"יt(̀ɊmDSo=|O[Om x?|]5sْҠ~ o-FUE-ئC<#aZYJ4eAJ|[kBJ K hqCDz`dioװDN~^nW܀ʵ<B+ZbGj+[|z U40L]՛c2%N@(@}?bﻲqMז) 5ԅjb\Qݟ6CmQ:T8ҹGgBaŖ*ô$ʴ`7Z57HVNn/Grn䕊`}k|on}?[}doDƛ4Z{0)'B;:tm4ݾxl_)KcBױ,ϧ߻smgB!XAFȆ)p;{d> )L2S Uw $7!C/!b&œFǜq8T2S4,?aOEt`%{,F!$ßG0jͲ`XP&;~n6,Ya#,:d ԅk(Tț*KȒܺ:0n@4FMeGbuj*٤]N'USq)];#&3'b:^7YnwcIN. GUN)*xnC(u8;X%> 31gQd7| N.=tKDo ?`Ki R,s9|_g,).*>%/mF?wtġ G7B)H܄REEZZ s;7q8m6#+*o/5W37To[y|Q>X>p 2Y\8ekSTEQm!`~y5E\*-o)^WTsiAT.+5r{ kvWrWk&;eM-^ [Qj5{GoWo6iQAI9\t5˪~:3ϫj9%7 *ev1 "Zl@Hi^%kUqQٰ]0!${H2h9^p(>:,Ӿ_ZMBb%-㰗X%q섡9rP+ Pdìrj08i>p9$xh #]%s`N x h% 'aabΏx NQd{(bg\4))›utJ"Q@UL4LPUI­H'eqJFADM$ƣ;4[a;,Sթue ]NՅt9!e}C.'H5NCYU0,it[B!Kp<Է3(FQ-Ȏ.Z8 u=*TͥMah%) #xvAƋ$IF-I KX5QdBH)iC ;uơ(Z#oN!gRvJ${EPmƩ(Ba]kw~$)Q;C}@) NJvU'Fd0*3-bCyl>T$I H3C3,=@y(iN&dG8J8=Ӣ_[+ QP'2z4[QqugJ"1(#r3"֕WNӿ@)A4@2:aW18")}8so~jX18CNaf.=*abRrmel:Q84?=]JVJHqfbvdr'3><$`hw !]'qQdkWK9䟐ƅ+F0(ng6^u~g 5-\tOięKԊD t˲MƥTWqE5/ˀtҎdiQ1$?!˸eb:~Ud/.il>TBXi;qUӽ#OiYȪoePCktprcJ\<!}ə y8Y°"3(7w@e4 D!` - u:hN~}'75լ!݁?IDo.T[e(1n) È3`iq+#zJQgȒC]5_eq$Ɏ(|n9_?O3#xdv]Teθ4 *-Nag8wJhE0z-i~&IGsG\?XX6/||~c]}膈]/ßO}]O 3)( T^7Yes G%Zn8Q55j8DJӄa=.Ţ#3ʤ j("~X`OD5QG2ycv^-,:y;_y+$F4L-\p+g~Ėjq}{I/4MS| ОL{]844ME,H F!n%vdԑO*Yb:1ևfq.JBܓV.D)Kv: R|DM}܉>|^c1"!T4}yZ T O_|jgY5$u6_1@pcYTiBe} dKerwC0Zado4EL Yׅ`2GK:\'gRQWm/|&uE(rsbC>"K:ӂR#{PJ;PS( %2ĺriRTc7nvGhaNnCQDT9(i'vK;sk11[LӖ&;F By2qhUw︑!XAA_dJ8xiDIb"܎ + GxƢ),xӂ&ci*\u؎]j*KZɹu̷')JNp:}:l"ř 1oG-W|a B6XTQ҂\U- !m8 r8 ,qy%l/ӤF7(Ƹऎ)fUuOmnTf!{\ܛLU}v[ i\ץIywQЪ*0}t/Xhd? ]*.wRgg|E!#7"k:#pg =rÐ Ac5x+FȰWQc^XF,=@0 (ԁ'w Gx<1R$JgeL^6V8NS1.;lM^]yqp=wbkh?"1v# M pCN:߃tLtt0& "ӫ+Ϗ0S!xdi)٧#1sL!W"%8?g%6R]=M{_ɬ޶+x+Gg!U/aQF  <ɟ޹˂+F-!Oh(2zCik7qs\벓M.eښĀN}F]Q 8_qWu*d~.IɢrbpjL)ag$  UU9,XLuXϗR2̓,#\Zc%e,3yٔGmA2b:$!M?{ ө/WAY%LV!Wh;}F%8^eY?Ð.7.>8IČKES}d:e!XMq:bfuIt"]7f ~ѭ#"WQi %a; ph ˘ Iܼd%un'C˚zBxjAJJ"NL4HT~~/$Sh* q щyY`Wz|.uR"j;ZWcrUgAe-Wϧ6n]+HOe!JyvW CnĘia&Y%$f5d&deN.P@/NP^Syn{ i!=6;ð,Ns.܎Kyah_l 8&-Y(z+ "K%+??_DZ9BQܔ.c.Ax.)8*' 9FB*@Sw^^@C$DNզݿE[T ^_UQY6v8KvWC,z=JӁGSK0 uAWx>=BJ2Y?SY{*.l9;;'Q..Ԏp+kxa`/V\+˫펕%Zl\.PdV^ ^78XnO9>4ib+dC}}=YYYC;Q*rm %hMeY/dBRM$9oegt;;ulK|43m eY}Bk(֬a{6ǾK.}ck|UWQUU),,l*WӦMr%KК%/?a$+)W 8c}3-SDzt4cqS f4:vR/TLk\EQnvADV-YI***bʔ)vij >w#!>w^zd9"ӑ`d;̄ahƌ3Zd5;C%8$k׮]Rrc;upΐNGY g84&CV_qͲ;lӹyHJVٱcG\E"O.ߴ;Sݻ7_xPf->޲J6jY;wdҤICJթNt;VC;R4R(f%G-x,Hꁎ9#|t9+ٞG `#0e@OTCD[֚,I)>e 0(5  Ta9Y~=7n$4%Iz nc#0c !WI\r/8/Ӝ)F$I7\pgOJr)"u{+ TTE88vWX%3gc0!1:'a-#zi*Np$a-it5N sau]X9S8eYH|rU__O8 څ` ڢd 6d5`YEii)sW_}uKiY-?^{-9;7vNܸw}ǐOfk[0 fϞʕ+KE\nDQ,/6d5/)W_>@g 94,⿣_yկI&|-:Nn6hhg+V^3^/<-d {u-EQ5kfb͚5dID"L:Uȕ,A[%Y _$//EHVrZUSV'n-e˖/ׯ[DoU"ضmKڵ+zZpḃ+Ywy'|q,Yihh ͭq٘kFtA|r~#IRG,_\4N es=Ԥ7dyb18i̜9={I | 2Dt,`O =窸s9%,hoX|Ӊ'q:d5S5WBcå^eYBQFq7RUUE8>-2p*nFF%8ѿN߹.)WB2qwN"C,H֔)S(--d%#W&LoGnrJn!W-p뭷+YIruPU;3=z4JVRB-(K 8~L2K/t6D ^3䣗&~p ` ̨aqGy~ME£;OMH3,&\xnB),)FFU ); t_G& .O>tQO\=k6Q;/O?ԋғ8- M, 37%D 2O_SB(|}Q̅tOsɒ87uU1&uy {뤵;^9E, 3_W)[Gi^ aS, \ph3pǍ`-Yᇹ`KΉ^ p4QE)FB%KOwY\7QIq#˯CS շ':#~RP]I)Ή_ߟ]xvFܲr-WnC 7ZdiZ.+Dɉ Tn`D4?"V">NMīBadK+ _:z)Uu=b>#~U 5T-ޫ]>,HiinkYL0fǫLKD_L0{@~sS3|X-EA?ծG '@_a4ݎM0Wˊh#$yv`ɒX{Hvlڮa,H_¾I% E_&uFŀ.% ZS;(@ %@ K @ K @@ SYBZ"@ WԳvfa2)Yj؁|"s)g?*vFu)vM 86B@ -`i0"\e76~o?b?/3 k]R& r4[/@˄/O>#b VBnx5e쿷 ̴',@ Z0מSBB/tEKaDwj?>RMHꄺX.|->C.]`RpxVb\v.ro[@&_O~h,@ MR l#LS.°K- N|DNO:|O0`h }ǥ~Q ԗ))?]K ,9хBmYIP7Q=?}%QNP{;pWx *s)d,,AcE,']R5ܪx~_QeyY4Kay.F_^MƫI P$K{YScg}&FCAljR ohcu8 e?OU<&8Jt5& n&I@4fw8qum!n؏56)Wk{KJ-0\ >vA6Upœ0,{Ѻ7N0a[f+%o@ExTw6_ H庹xm}q⬎^^9/U_MO2aJr0(ƪ8i.Yo äwrZY|1ʗch5C܈as9:'ѯOp"tEY4 xv&HA$J4~ޱ^K8bXA. *Z ,Gg'N߹ X#Yq:02#:p]mﱧMd% x?Tԓd-L-S&δ~h;B;`Xqb=zY#Ԅ5=y)y>~*?EHVDEY(NuԤ,gJ b` K7CZ\Jr8dj"s,ts2uI:bAI8,b2/~rK7=[y)g7y{MiYR"Ic:3v8eFPdy ܅~6! *}j=έ];krOJxMҵdLJNv"&sTT Z}H$Mjrlbn)BDz(˒+;HX>EjysSWb&Ne3p)1"qty]|N:~=8sxyvMQ=)҇ݵު uphv厎9NǿN1}^Ye<( vW{{ *Kh7 H,MSٝ\W0$}>oUܷ~+Ou>1# ^"@n ;BLpCP o<i~z* ;Ȫ/B 8e< bpnQ1,PhEu:XUCK!flwe8*v\JC"eES!ף,¨v^<*:{YtU_3[A% 0MWZ)B#%GЧUȒBA)Llӫ^p19na\ўG,;]C>wKpq~ U7QDF!K\(aWuR~07N "saa.^PDsU{b0:μ]]yװs 8={_O{t6 vBĔ,$R *ܿ ,y2 i' QsCB^ٴ]$9/ vН!7|9|b/W&,4ю nk&NM;xx3aa1x}th22~Wx7xMU(5 )7lJ~ދ.y;޸^. _&.XW0a 0'{V@s3?OӉd)Qgiס8x9&K 8Cn|oŞnU­J3"L\>(M'~b.ǞuΦiͽ_'Ac&w!WGc|D@wߚ`fߒ=rܦrD҉,}oAZX3{?ϲ o'ɋaHs(0,Al8Q 6;%.";A,#YRv+6Vu&vWsヲ* \'_H=TVBޜ['"%wZ_vt`ѳT~ -_oG"uv=({/~gxO@@ '4nf2{U;`BXz _ځup߅c~6_eƞ v}?7q5,@ NpSBIJK!y 8':6_i~D Q<:y×U*DqN+tsJ;y59iIihC"1HKu3x:N SV=|skoerͿ ` ^XU0nL| J4QhvK7EM~R>0߇aB]̤cʋX ?M-@Mut( u!|Ü7e@İq4vWmѥ*%F̥k>T? E_[A* p~Iipfܩ k Ӆ 4`=xrE  &${nJ zg9qP@-C9fʇ P~1}o޳Q .Wbt{-ҽf:&w[!4G!L,H5W?E 4a;e .u_ǵd`alQFl+[H,^$:`moaT3i} nɇ~u?+jYZUCU\(.!ƂlƘt ݮC3i71@!$p>q6$C!X/Ǟb6=7 urбj~ۼH{>:C;Qض茽Xցa2Z9` @89}'2Ifl@JC=x u3p51>}56vW %'"eX@pi K(j*4Ǝ;ꪫիnG'x_~˗p8$ ˲ؽ{7H׋aҤIy晢,{n W\r u{?Ν;r0 1%2,:уo/O Z"EEEs=TUU 0`3fSQLjX,ƽˊ+(((@4i_D, ӉiSZZСCHMM%ihL@ K 8ެ[l^uڵkeYӣGf̘ u \B tPTU% i^X,z狆Bj,YB޽),,l5K/ӹsgFok$;wҫW/&OLEG7X}gŹNgj9 ȒƘ`l }'}1Ɓ 6&A r晝ر5n-HgtWWt>[]Zg5k^u3Bz7%@kk+rֆB\tERsJ)NZ:cP_EX ,X{->=Ps9( u!bHhllĉqcر(˘9s&,XZZZ0c HfϞ%K@|)%ԃAiӦ!Ocٲeb8cq'ΡZ"i?'xaL @GG-[T*˗R}C|_ys11cF -3ø+-Z|8s1a„M:QWjժB=: 444C}%K@40*ҚahhvX~=4MA)ƍ!DZESSƏ|>5k AuPJAGSbx뭷7o̙>XFR!?~|_ds߿A۶0i&A\. pz!$U*0}tA|{.:,L0olƬYڊѣG'֭[Q.1fr):u*+Wk׮żyp9`}E&5kP,1o$o?^Xv-.444<̮~W8|>f躎A0jRxSNřgcǂs7|@)뺘9s&qQGaΜ9xH&8S upcرg}7::qW~7 CCCXf <ĉqgsϭ%V3gěo B@)Ŏc A<44 W<Va\.ömhT*94M +pCD"& H L}6H$J8lH$}+RT 9566N:f͚˗CJYSvpOBMĚὮ*ݮW)/;Sw $ 躎 vnj]x>A+WUuϓn={6^uyuUGuUǿf/K0a^z%}'Goʹ:uւ pGSNĉTGuUǿ2fd2Xl6oތݙu `2݈M YI*w% %cZPrYu mH;z(Cjcp}P JG~ۓs>@?eJکjgc]}}}s^}ȎʛRfz#-5e̘1c{zz`?`TV144Pu VOJNk ӻ#sY6RA< R \$|PBHR9Oy\.%\4iK9s0{l444ګ<_Jy!dInXZqV AѤ#?!dr93 !sGcÉ+OK)1VK\@R;Rd5ARzŐ)姃 XE >B8{W*mmm>Yx72P9}jc) >on K|[Jy\?p̘1{wm\.W)%6l؀{ k֬A"N; cǎ}&#LJE /3g"ˡgy&LR[ꨣ:P j-qyB3r:-2Y񠔒~/s=cҤIزe " cF2D:Fgg'~_c k׮E2q衇bܸqeu Ŏ麾[mIbR]|jw!A8Y3M>gUr+R1X;s~K6Mq+}}}B|9=ԴG𪳦s|ߟFRA*CNJ\jjzEZoM/~$2۶5M@XǙX,vi)~i7/^aB##J&W\9$JBK)|ewQBPTdFRZ öcAt:(.Jp]*+97RJRJM8[=ϻ48/H)^JQJg-B6l0yi* !.X! ܐ27$I)+M4 d2)B,y5RJ ø':G5Mi%۶ㄐc{AEjb~xر۶GX,A9JJ@YmS1d2b1 I63fL;8I)/m!D)}J!g !q"|>fΜ kojmQs aɒ%شilقD"VV 644|cT*H$Xf 6l؀'C7:pG!( W.C>? [}P5ٝCʐd1.ӄBRp8}A PJBNM$=liO?'?;4;&NxҾX,x;",ϕH$biR>H)KӴu?`4u>clnkkhqz|mBoo^ry)\.oZl4M2^JBM^JZ( &i~4e\hh1BG䈢! (~ cg0Vf2_R m `mY}i>V uuGJytSh8! Ny4]>ٖ)At{jzgZ!d:׃ "fM:D8Vt[J ^ m8΅|*/l彽#3gq4MVx7FJy8V9X)kRq!Q|P(|\.[lamooW^WWWRzc"H$088R9 |}%|HJy,|bV}RK)#{sXqơfU ءe2e|݄zEͨOa, xk֬>G}f[Gu]Z"JVBp׻Lr-0'= pOܶm,j6Ms"#appT jUM*fWuVbYJ۶mN?$};C<www$2ƾ*]ŤIu{{{A)"!SJ!gڴi/73{/$T*B+Y,2MH&/9stY}<(8?iYּu!]׽0oQJ"|2U=uBS%MP,?̹Ll,k0삯OH$Th:3_xK+WaZX< ƏT*nŸip"!(A!du\qѣG߳vZ$5~KOpί!|@JH8QW[ĉqW}0 cms2Jt]G0… _nKA*:Z `uRC`JϷ׿_fN?K) !dyޓ!1sA&<1}}}i cwqQ(چJeӧO!}{'644}? ?M H'MoB$;c4 #H\.v",}sYׯǤI0ettt[QG`6T(J)0ˢ]n(7( !4?^tЁ-[C4$Id2l۶ LJ%Rx_lFKXSH$}b*Je2RXZUd|kPB'Rz!眷Q{I%6K)kΙt:Xv 6 &Ji_:OӴ?F>$HQ _yyUCIg0ƾE)vZRz !YJ'tEOu]5 `0:8ݍx<!qa ̚5J;7oKA,34M{5̃!$3̶%K[V5yEJh}Ess3^-}}}:s8fv@-H1(Hӿ]x{zzd.'.xJei>9'{as#Xovv4-d#uVdZY]pvuUǿ6!Gt]"ظ+7$XPHTYJR4 l===394>4MkVH$U*)?f~*b?AJe2dD$d59QJ=qd$[7,sV3!q(,eP,Y\lfEJ+J"oEVBH_:{ ~[.gB4E}0 ;}!QFu jz19$|IJ{A|6s~*1l$^TDKB={.';NvivuUǿvr3ν64l)%.] BMe]9pI)R6kV\ոq'O| եjS.V*4-iZbmUD8։R,L4Ƙ#j4MS`@,qH$9LBȱl@J9FӴ+(A &lfmi0î*rx<}fI)O'Xy'L/B~Q.iSJ_'0<߇mOQJC\i !V!F)V XL&`1F}G (X;ն577R-[|0)!DS}_i@Lp)_:nf7<35%t]R!DB0]i/c;::|s~x&yS]JIڶe\/ ø2$EQ"!kRs}ߟN)uyB)!"q67$WkdrxJ,q}_UT&RJ5MJǹ22s øDJ8jṦ"Ӑh!pp t]fBEj6Ắg9>YJiTu2-M>^V !uO!wH3k ыRʻĤw W8SO=URޭu]#̉bҒ}뺏=j0^iiin۶m !ĒR&(H$(r&y֭= QJ؛RzY2ZBRJ鍔-#Ew~Bh"Bpꩧou Vވ("f8޵eYT*sR cFiٶ!-ca^'MMM/H$hllTXDJit6v"HCAbxE"NW5B{I$3D*4K)p[ßyB%#( ! ~BaB466,J%J!a{OV;EK h3 j:NJ3;Js*!TJiIJyB !4BqքT۹*V&|R:R81(ϟzjrs>;Z< `BccG9#Xjƅ)o3r/)e5J)*$eH$ JݲVw!Y$:㽍hz ޝ0î"F0%uTUs 'kb*i7VI- !f^s.J!Be- {Wm"5jԟBGBP`5h(%EX絑$WӴnݮht%!dߜsJdE`~^Bz(sFqҲRzs4/(bq{×eA4;ozkKˑ˄(U\.r!dmG gKfm {VmcUM~:u]!UpΗ' ضM׮];CJ EU*Mk !QJߖZkJHQ466֔SN9~NxoBMkrk"L"AspΣgj^TI2JJ9|-܂W_}V.3{իWcPv ܣ+B%0 M*ZABMqC`Դhu|7Tl޼f2>!L\2ư{`ppJxJy'(ԢRTo)E^]ב`YlۮF!pB u5J sg4M\RA:VFեX挞H$fL0r\\ďjmHӐRBjJPQ'Xu1RMPU4tNX,+ѣw븳gφ뺰,m3FFֿS`T*a}׾yv+U ÑJ \s &O !?xm۵RA)S<֯_T*y':RQGT[5MÉ'sȘ"WT*@GM7* F59v#?ufq5ছnB?.\X3UG4XU;*>,QG__d۶k}RVkJRJ}CPBp$^u$YSm8hkk֭[3T]hpcʘ^ִ< ՈBs9Xp!-[V## JJV}ua #Xȉ^vHv)AFJ٪ PJ-СHRX{]RY8@9bGaõjH2Q*cTCB%tDa*D0lIAwԆF}^m?F)ecT INb8+sR)zm|,C*R+1!inݺ9*Ʋ,!fbxZn5jV rSR~.^yg)%2Xq4iicƌzե]@hBK)/fPDku>LVG۶kD"S E4*418S+D8Om#!m*s4j*eu]!044T*US΢"|_׎?W-kWA *=) ]=ٲU P |MT*L:Fߜ:ɕظK7|BW{{}|RBkΜ9uY+j>Z_Ji2 T)?L$W' l޼7kA۶?O5j+?x!uktU8a3bKb}I/VXQ;)4vφ!i^ /I8SqR8Z0>RR}?( Wd-'JF-QR^Ju+WH$*u]B)gb8 ))C5M[SR?d,Ze$I&5rG 2$8Ծ9_DBCJT!&ehwEߍEQXŶ+ǹkG+~w_ *i?BF !}u]5776nܸqҵǏG:xEAss3֯_~}8C:?^H9;r8CO}jR믿?mAƘ(JBgz(clV!DۤI)H)" ǷV*J'Ǐ?u}=qhh3xf)xSJOHJ ˲jj)eixCqrv}:_466>y޶r~BI3,!V˲8w Le͵, J!5߾jժRF]8֭847DbFgg!hM!JŋmBȍD"|=?yo[z5̙S⪫QG`dJr+1B!Oc=j-[j8`z<VkBA06mtѣgB.R< y*wg+$wGj[[[[ׇ>ʴkעX,X,3,YrH,4c1vB&i% [LbĶ*WJB#M6}䠃0\e* U<Uh=]u 'R[=.`B7H8cƌoCRt]p(n0s?iZ_ow]]H)4Mu] *ۊX,Q%3؈BX,uQTpRohhmo[ZZZ#𶶶)oݺn̘1oZ5y}c L&WT~J%H$YJ5MB$BA9cƌ͛77nR|WJY0Eu5k׮-/Y䔖H$.VE)򪶶6kܸq'/XT*EՈ(R߶mSJ]4Vv„ S x5OBn,UVi9?߲K15_ ]#,q}W>3ݕJzxw뛤PJLD*`yX `{}_ooϯ/ژL&_Kuر7 ݘNu]RJu!Đr}߷Ə=!Dn޼aLK&, O=c{~uUɶ ! !eؒwR6FqRRԶmL4yZn}A̔R CrW;$M?~< YrP4 #4yi/I|!Dw,q 뢱1=u.]r,Rks.#};2;0 ʓx<#qJO @↪Kq(s !@)MY7 !Fy0pA!gSڧ:d- #yHw544\!\nvH`A)CCC/麎L&qq]7$ MqzzzNLRuNym[4H)y^ڲ'yA˲f;9?21vWo+x%4g!I)iV<#@)=3Ǔ͛i;v,Fݽ|uRI¶/PJZ*$cX,a---8ꨣյy4iڑm?R,1qDdy+Wf͚s::: AJi !,T[Y?T*[\"O8- 4M|ꨣN_G)]׷ ! ,kW8! ,]mhmm}bΜ9oL&fc5Skb8o mmmhkkCPXm_B>"|R: Rt>󝫯'|=vᱽ(dI۶,Xt:=vhhk.L )%IUQ,!L3NrU7|xR8cLb1Y.iYa~169N; gu|A<^CC!fH&( OrίB~il^Bio$a'1Ƹ\PJ}X k}oڄbCF"_R/r?J)p\.X,ƘE)u]9TbB$J)V~\Fss3l6BYJRCJYs¾dRJ$_BʜsCӴƘ*z>'mmmhoo!ahRʸaVVAU4oBe===~Xi l/)Z+!iy8X~?+WmV^\F8N !sBfQJ õ/H)Sj<B… -tѭ[W,3e\T`kd\._i%ry/!<&7J)W'r8R_/\T=Nr9^87:'`Z=nIZ;ӫ!N,8,ˢ}}}{drVwwrX?Pez3uH)_c!ēՍ3)K)Q(~N?AofcB)#D"eY=wuW[___o& fވU]T]JSV:m;y=4͇~[.4m90b AC9+\=R:NӴp4B3'HjB' yHcmu]BRXH3Nr[[[!DbZ?~alڴi\&*)MJ$]ם)8RZÙRB)}})Bȋ 1rizdJaR'4M0|F7l 1Ic!R^bg8A\K)`.k"LN$W8s!DSd}H$3ld2y]v+5Msa~pJ|( }_c])$,vAPBZL3bQT*&n#Tc\.y^^Ӵ !088)B4MNRB,$?'ZdBaBmRJ ؙ!8( `D"xQ(jv'q9\z!_|b^z5,yW1}K,y7s1ouQ'Xu8POλ#|J_8R۶!hufRXl6c ClD4n?0krs. ^(fARTJ8Ξ_PJ1MuJ&ꫯ~)10TJr&R4b MJA)ruBAoWYiUA%bmppx<~*CjaH$k?OR6 #Mh^Bt9#OR,N8J矙NuႉZ,d2ow=kYƘiYӎܸbŊerSɞ}?{V,1ydwy}uU{I)qܰwݹ\n-[.3Mp"9 0eY)_R+%Y>9aVc LF uٶ?bBބ!J_=agk@Ӵ#2A&=ydeia'6m!] \iYtؒ.prK*B `L{{Þ籮.aF9? RB9'NU*oVD BȫWH)7 !V՚M42BHjʔ)xQJ u/nkhhunW^NRʍaYG!<۴iӔ BC* (P:/L$rNP=6l@,RNR^iZFJS!Ĝs0;B ?u!(s΅"Qs{[=IȿPwWغuu_hkkJ3 Hs#B0Mʧ9@1!W8cצibܸqX`b(yWq*6=}<,2wpppn҂:/7vD5M{DرcUMmB~Pu!ħΡΉ{eQ1f̘ۗ-[V;=)ʉVEmi;1clMMM=z4B4X}>(Ek*\`AG>Ш9`Sv:n jH bYc3g/ sj.e-PChZ}C@2?ZQmu VS70IjR[ޱN <B-TVCqNZ•]'\.Hfꧩcl{~Wڒf w,q2)Zeuuj^91iZDۢ&wʭS+@Eih_8\l=!BDU_V* Zub[lAGGN6T9hTmW^mn)T+>LrD"G)t:e˲j+Y먣N0a„1ض裓oH X lBhy{@>lBLJ0zagpbf%QH4R*jaƑ&O!^x9Zl6)ej !vHmXjpxW6Jj2v$"ćG^.E3JE ނd293HVgjGF6 c;H(ywDpFeg0Z8#Ę1c..,PDj}>g۶X/3SGuU?&\.]|6JU(A)Q!`~)%p9(oƫړw,=}(OmoE Ktmjjz6(S}8r9jHJ 0jf̘1T*(˵Tl$>,8P0gk>e\.#1#4kDRr qz3sO4j*j%ǪJ:~R 'NgŋgU[ۍ'e@bŊZPfEm#ˡX,Rqơ\.cXf bR4MێkȢi5.4lۆmP:HG)E"@,(qo~ ݰ:A]j/e9PQ R3ԏw mU0؝(hll xV7*z*2iA2׿ui&~\V5),k"X=CT%jyt]"zsEww7t]ut:e˖a``emD?N!Uz(sO 0 NSY<ҩU[[>Ob˖-xа]LR6Rg&Z[[8NMC*2%uQG]_ åc&bح\`J.0vS[[[aY J('rϴ,/G({ `:s4mu81ƞ k-䵃Zv]t Be 4Jމ6Br0z;:r(#Iȏ !O=zʹRR<* <ϫ)$bۙņǽ@IJ" jY41{X>YGmpΑNn:ZQYTNyq/gJ)K亝D"q)>w6z̻_u-Acc#f̘zFpCy!_crm _=XAJt:}ڵkox/chhH-SR/HBcPJ, H)n%Nǰ#hRQDf5":,Y_ABn jJjWeY466 ---,}jS/cAQH$>ǩN*G)tYGXJQی$G$GRR8"f5頃RD"P˩R^dYb7͛_~RI_cbJH+,"fs~8V*!)Bo؋RSJy^o\{ "خ=e>]?p]w1K.fGrꨣUv+`!tbߝ<,XBHuG4M;#Yf}k+J*$Io͚5y䑣,7kv!D皔r!5iutthѢE]7nܸ֭[DŽ&|x̎S:*i } D)-ABk 4saS" *B2c i%_>3ũ=.Y~H)' h.P81 RU*:Ζ5k\)%1F2BHHx4./Ȅ⻍X,eXvmst]4 RX@?'LW|G'Dq=)BH=(ĥCJو0<ڲ,1QJ9#cxTd}a^<餓 fB0/M9&!D#T'l术 \Gu:70r bxy澻%C#Qtvv~u?OJ#z{{u]) !6mf!B&Bpj**cZkx rLӬ`8JCZ(B v]7oR~Ig9_9N1Ms$"BBl<7CB}8\YZETB>߳}CWN>}˯WjclORyZJJycrbTZH[Z}5L8Ҳn˲B088RjAdw9RJDž6a{8fvDq<>KB{ S(Wp[l:ڇj 7B滮[ڼy*ÄBLΡG)mB'Jy'1OV ǹ\./3M`, _044\.7Ƙ wp‡' i`l6{ifΜyؚ5kd>788P(L)]i4͓{F@)J~:=ګ pOX]%ij<9SW!#BS$tD]А3M-˲kJcG>Y~B#Uݤvt6* Yy'!+젭&!ma[B|,,cL~t,qT}R| !Ɏ[cJ)oϝp Riw{z7SJ)婱X#Bᆛnr,(677z8X,"N a\t:=dn4x<>*tB’(gض~)ejuACJZ^*n WɾիWmcW\tEشiSqcAu)Tb}4MApFwH)e !Rnaa<gJHqy/K)7J)OaYV/;w)!w褔^iZ_t&12H(m!. jOpp#9%"eY?oq]Z]/cs C[7n]+WSD1* 1JchhH4Mu=M)wîqǰ/,yS֔1cƤ 0}߿H1s7n܈ .u}}?f}vطAX̖R !Rʁ r=t0pԨQW뺗ka@<$BH$5j<ϻs>@)}IsKuJ)4ְ)䜗!7_4PQU`RABH_"XnY֧u !1?~|C bpLAV|ĉ6mSJx<~#!]M!Q_iڶUV^z)S_T2ƞb=lcҪ"7pigg'mFammmmfccþ8)jwww{Tcy=7 !\m^kRq忶;v)uQ=9XAK)8!ی5Ma+e!d B_nɖe.X*d26ttt:)=(aWrcT,GQmchiiΙ3gZ#TC8͛6mв,?yEMA B4PXqiR<1YJ |=: V5Dsc 4}'+4ҵ]Gm BɄclBȅfͫT*7VUh2s=·>),N;4"]ȡ ]iֆ6J9&Lh?# CZ !*J^\}-4}VI)]ApeYX A蚦Gu۞-m, ;]H)!ܣX,!!4u5裏f[[ @[-1444,OR/B~yX Qߧ]fytH\!DNI4Ji1=8$ mˤ~8FuH$a LR< zzz$ KHfEpwr/f8A x{\.7:5k4iv !gXUBHBJ9qK:5Pֱꗮ`NG/RJW.9sLtvv"HB,]׏NJC-$Zڶm?UV8cp ë6+$Z7͞nRA)}ׯ[āu]1bV!1hhiڝLr3b---w%0K)?9r6NVe"^hv1cXVoV1 Ebp'v2^B$Cҧ)* 6Gc8Zc*t]?st\>1v}.l֋APRV!kv!dc)bGk-8H*z{{8qԨQ/8c7m'yߔ)SBx2ɀ1v0.0t]2yՄ3!w:5^*9⋷#L*ܧjڽӵ*&׎ BD"x<^}߇i7wK/(qYvIB$ yXd F)%ZZZ`8T*/"kؼy31MSF0Ee g{R eᬳ’%KR]]]jl6 kƕQ1 Z ڶ !>h㥗^Bgg'Ǝ ") #84qDqhiiQ &Mø[ڶm۳i_(%s'#iRFS;?EU9"ՕJeG}/V': !9Z~xr9 / 6SuR)iZ%\]:#L4j*!y^;8<9}Qֶonn&ˡ!4666XꪩQr-[u:c$vGG/SMm0ZaeUeWW)N[8B+j"u#" !m[7rő팖9QRQڝ23Qekw#WI)۶k$Dub1 {灾cwZ[[C#J߮n}pΫCGd hH@U#U%me;?QG`G<Oٮ;XAȠV]"R脦ԈGr";m3,_rBeYڭ*A3MGxۑx<^Gl߆al׶aL8ffp]W\re2PZ)mjTrqG>DPd::v{/X,bo#4;tL;ѐyԄD"M)_?^"8QrIYu<|8蠃0{Q!b~XWʾ \.oWS/0YFT kJ0VuQTC<n;:(!U4twwCNT!-ErU4MCcc,˪REbG\pb ?Q?UUDvg$kySB)\:ꨣ: Qb gd=}t$IR \ bdYT}R1T*!Oǩ{OPQGuUG98]9w !3gf͚B_J9SJy,ph lRdT;ϓK/t{1 _ϢeJTZ^SH9a! wGZ*$O`'kr͖-[uwNQGu V;x:c mò ]T@PVa&ia@8iR M")u_}y'_rH#L&k׶O1 p;{Χ@0 @Qc`PbKJղ,R~@IJ#  P*ڊSO=_0~xU$bhhH)eRNP8iih1fRSN%P!beYGh pG/!\׭-:cwPT*El>3$&!d?xNX@iA !RQ Xr)lN9ap@#Xk皛{/^l̛7r9؏4M|k mkk{pڵ??ɼE)WJU#gޝݔR:hBCR5My}G"^ӴO !$!DJ)~RZRApi}BO@6E&Bm4: 'اC744n޼y'PJsRT* 0ROO$S2L !d"/.]בL&/[~Utǯ圿.|GT80Zqx2G?D"R"V4lnhhju}OO7 ` Azzzr]w͛7  Vvtt|ɲJ,z1y^7t)g}pvCzRN3z IuQG`bzاߥ%<+jwVo_B4LB!.XD)mlJ9i~l!0Q&HI)$ɩTjI>GTibںb͚5b2`aVhW)df=9D&/Bu$ 8em4kmۖa<+*mP .9oA/z.L],_<'N|ݺu7l؀ nRW-7Ms\Y0lRyl \^O544|&2Ljc=i&fΜYm[i 9)J6a}JZCf2Dsse}GuKJRoKM,Jߣy8g: BYn'u]+T M먣: u@3ңMӼ1V}'h>nBKqFBpF&c i^bxf~ ٔҮjzC>GXW0 K/a֭wn"jƌQJ9!D*F#ab8}Ms>>@o6])%}aR3b؉'iv+!d"uUi5jcK>ߴJr!ՔaֆBqnT*Rn y!E&B#)Xl6\jF躮4M0ƾT*T*RJ? ص_XT!dsN|ߧ!afs6&ɳ7{챗B W"T5eYhllݲ}kaXzo]dB pga}]]]Gr1滻 _]ͪ:NR~NQb2WJOw1ifH"^p80l*`49実?> ,R+ H)]nYABdLB̶, i)w9RuRhv"&`)寤^,$ߓRu],cOJ\4n'8Rz82 å(K)?X,T*_frΟA0T_Qu Pw*lذ===mjjԩS圷2ƞB-QJCCCd27Rb BȳL)BBt]϶8ceDz#/ömbBR!BD)$HSJM-B4R*qW^S ꨣsQ/x;EJ x'qJ&P 7oykvE!۶bL&X,]?0 * ֜ң59(c, `hG& lpνAU[>ۗR,PWH$;?m[nł JVY4֔JjJ=u'cL Cd ][ u`ܸqz{{q駃sg}͵훚> `Ym۶òCrKVGQԓaeI*Rsi kh'Yoye] !T"FxEEI>C*ow"!ٝmR uR ֮]D"qT*w{.!+1iuQG`Q{sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o@IDATx]|E@==ދHADQĂ|"EEE!*HH/R  ~?q]rI.ɕow޼`"!A@A@Ԃ  a 4- "1߀  C@$-A@A    pa a![ @#+={>NfJ֭[S…c'**֮]K˖-˗STB +PXXX`֭?SٲeW^c?m۶ܹ͡sSr 8O(88^}UvV^MÇ?[UΝ;G!!!NI "8@C`'[l_uʍ7ƍ3g67on0SӦMk0PߺK/ҥS3gXyd}a&371ʕXbuʗ/o4k̡,f T{̀U[~eGA9UVǎ3?}v*^=zTpiӆ,YBǏٳ*'Oɟ_v_ݻwiذa1x SL8N8A7oޤ 6P^pĔ)S_~q(KH?~R5/  x1>8ÒWԳgO}6\RUXbQ/ĉիԱcGjԨ 2D1f$ڀZjԡC70@dB`$4Ӆ yWڱc7D6mDsΥÇ;cx:k  ~VIF1Aȑ}o㏫O?CRɒ% &C% > vM6k&MD~TjUbѿ:6,X@KV H˖-hѢ?ܹ*V[uU2Κ2A@?D/پ@֮][ݦ5k(A("J޽{[O0jjOV3fPӧӟT'OA̎9R1\tu릘LW`ظg„?o<O<"` T1cƌΚ2A@?Dg4s!x( N(,N``yc/ Xc^ j{0 vq: %b`HLO6MFRMV/]7|_>_!q=v™] 8nӧO+g̐  7~k.'uňI{ Lpoq^͚5cu;egTF g.9sRI8ch-]\?1`LذaCk5shTL1@z`]G!A@y1(RM48!=Os&=ZM~gaC=`bptA Wc$I!H3;6ywV̿C`4cI$&0D0Kv ]A@#|%̓[̓Ƅ*406zx !Ygo.͌:s'8DwY&")JA@1HVTb " qmA@A ) )P6A@E@qmA@A ) )P6A@E@qmA@A ) )P6A@E@/qHht99SNԣG@9n+J,ӦMSCSreA@ a BH  0te @\cBr\A@ 1-CA@B@+ƅ!P <֞4$G@c*-  6lHS1H>J~K)8kjZ#L].\AVU;Oа7 ~"oަz-B,Uu[qƚf 5kF3g'NxXc@#+ q P44;WʡVyK6?Cuw8v]JwOu}(22wNsΥtѬYRJ; |1}6]|9S.#;w|r7c=[;Gw*?}adCFjQ=yqJ*]v әnܺM;NѵQT<_6H9*U {sԝUԺnQjTy|c4qt%NKHKUQLh47zf_O^JSTznT@6㌫nrϛ7~jժٳf͚j?ƘSoube\ʽΙ3?APP;ߕ! ꛇiҤ!P} Ǹg9Rt!ul}4b>jߠ 5^o>J3S&)KJ޿7t98qlS FcFlB3ǀB~z,1\#Cw{7D )='ߖK W+TH.U>t6|he_,_:r" {;=ۨC3Clq乺Ԥz:sӓLqKwOVwG+F~XH'/\|8>A]>OߧΓ>z>d`6$xI0_>2St}>J=0RZ P`\'gA4VP*BVD\cU$ֵW*-&s+t;D yЩ] d7VyS9Dh)LE0%Gi8p20p_|$Nz(k֬I}xߠAiNFfJ 0xeE23ouֆzv vm JПQ jO9wkiRyL<׸[ixOU;i K5Y-m.mE4b \X1:e˖JuCac/xzҞ cI:@)}/S͡wrdNOyr8:(bk\Y:Қ浊)[Ѕ7ؖ!LU!㨅;{*,0u#3цҦQ`J6xV{Gѣfʑ#5i$D>L(rr ڱmi&_++w;U*f~)+ =s~Hئ@Jozx(;3 H'/(at? AP۸4M\G9+oю#T}gu\A1#ޙHƬfo}m"!$]ŋӋ/Hg%KYq/~B~n]r̙TD ꫯQ;vPw-[Λ:u.oAH>$. ߱bFP6Vxbn{8=Ag8RcS.Xۅt"J%ZOoCj`f!!rl.ԺukzǨyJs̡!C_M={Tz7m# 4]Et!9Tˬi /رc駟tu ;FF >h&!A&L2ٳ8js@ו+W63Mؼy^Q>02ed߿_{׍… Ǩg/8~& 'Nhb0bgΜ1x FxxYЍ@8n| >V<$ٳgĨÌ :eXl#Gb` /x@)q w}G  ZBFE;}7o߾Hϓ}AE71c!bO,#x*$!Y>zc &Mrz^xbCC*^8-]@b~9v 1Aot]w8r/g^D`%\.Y_2NT+2m.:x }1~-y p"Θ1Kuvح[7ׯqL_@ FH ȇ֟[rk$Gjg2WJ%SB vҢmUD?ؓ9Ym68$2X6 8uq #R'6^{ @H-]J~ýdEE ]Pj K@bɔ)4pzXDv.]0'4cӮɘ1#-ZԧWcrA[[K XU)G@(h{v@Y/l'P\aqKv% 1XRU !Ț1]0HTSAO 4dVuK(u9N*%$ރzϽɊ@B Uisutк >]该{Y_{ ~;z- 4H 66Ӈԡ'&wycrjj-r-zҧMC,F)P%Bk$@@$q$E$_JS8! 7(Cgz,)xM G'@} FԠR!Bk Hl?t'o 0#ODjafa 3 Vn~cVSY[*ѰLoA@paJ  -MnR15ޠ4๯S6OVma&ՊУW=:>qլH͢jЩeB\Yb\zۡ4w!ۻ ͮC0rVIlC1`¿,](OɛI[JN056@B@# @mX% Jo4`暃jG82j9:aj^э$w-S:@sЍp K4SrH"*pY>J)]'UDžho5|g7t9E޼L:j{ub6M_:-ٸl~H ('+HN\ZeV5c-Xz 3|%&2h(czWKR.2?+;" K &yH!0pBeBY_4UECꊹE޺C㺷,~6P~шn9Flf5*nG@B@$teAixW뉥OŸbm)Б/E6N]&WX/{jц}6HA2-^WoAR it]zmM̮EBTb@8OoA  n X@I4D}wۖ߾RvVشz-tD`DŽm% q[+df%l4D6v cw^-0%#/V %ܺ}~>{"l`F6?wj< x'~>6V !-#4:zi9* C@{XȖ p@bpABhʽ=[WM0Wttam{6X F0dD0Q3iiJ+}$*خe;acfG!A@pa Jj ~l @ sqgZCU;nl3vr%0@`JK6 (z pLJp`=ߴ/^ 6P)_[D'#Ҁ  ~Ve ߌ (3]`qVO :e;dPl~J\R=9lz ^<% NjG$/գ>VRw'*CEx-<פK*5jͮ`PE>[Ǵ0+ʆ Ċ@]>}:M4ׯ2eP^bh􇔝Wv9y;/+l@8&mIkك/(\ W._߹i1)m{˽NN\NNݿV9\OvL]N2h j֬#B3q@Y ܹeh{':7~Ξ}8L˖-s( @EAeHN]Cr{wÊSDBJ\9=ٴWϵxO2%zsuz뭷(k֬ԯ_?J1i= Q/q뙐N2t40r#Ɂ@01.]{=Nܲ89/h99@ ދ@3v5k_ᲈ֭[% 31 i?C$-Һ ƠlٲbŊDtYNO#P@t=.r$ v!u]ZO!PCcLqG+ . r$ *WWddEE8оIho۹ i+R.)0)|򂀷 P3-K`EwǰyjFb|.bROH~DDDtT$pI4-$a -  ]I7! w#?1{*#@qN v!A;;JHvBgh$hb `1H0tr  bRH t"Ab^?dD! ^ ~t3e(@b(& &i۶m6mZ*[a *Aoрs_|mۖOÆ 3%JЃ>HoN_o1a#}F5kTIp.mΛ7/_;F=ܯWl0pe (G_A"" СCK./믿NnݢqsW,NBu餚x"9r{P*GNd)D5>GC QhQ>]r/^;vĉ16\QTT8pQŊcT+\p2)|a |J" $TJ,cOsVEjժ)={nݺ*E¡-6|eI@nhj…6oެ3gL&,Q=~x/mfΜ:wLo:u7oNyeSF *],Vm4ϯV8C]5;$$vD{[@LwrTksi;M6˾ CYj[2D꿏Š~Ŋ*`Nœ+VIδU.}>l<0gWrK~' X=f"&t=LyQLܹse?-X@]½Y۴]r%AOmHp_|xH Ο?o T޳ {߀[S{_/=#D8g:m=Z˔)ZZ{-[6Zvez6oY~VXǐWcI[hO$:RBRxN*L0ÛgM"6M`^Xz.׷?k1-ʂ5Z+]|An=Mې\yn]xpJ]+1?X_NOBA &lrAlٲD*K@~h: /X/4r!)Ig|;wZ!T@HH  S3I@2$E'Od׼j+pB3S iUhU QLaf Igy& l8CE"PT)|Mfu)ybhNA^ BWk_c P_]H$WH0FWtzx]ٷN k|˫;q&F5k":PCa;u]۶mpWl WͫҺ=:1R;:|4.5hKd5U @"W"VKȔ iiӦLH gBS#D'Ro>2d*1;#$BZ0[x1 06mDӧOWuq /ʭzǬ N9Æ bŊ`BjK;v Ġ.^`@x:tTbUڸn5cq _,+*NXxZb.)0ݰaCbO|嗊yߩ]v^PKC]Q{`qt&z~Ort5חǨW_3f4xTd.h':NXh6J:5hF`DTV-z@FqM!~&{l$Br,g91Hx ʝ; GiAߘ]DYUTqPy*#Q%$rA"tp@xQ>s/KzpEյY R)#+l 5kF`ɓMK*m!b?ʦk׮flv}׷.( fWQsN`M+h{5k:8goRK x\l \YkRlc @"_XqS/2@OV+*@/ B=if`Hᆪӛo.k} B+u4f?z~\ׇ-uL"!pI2=5?SddHo=|v >3@oݻxV.m*eVڄR<Z$Ori^ eU;)C"!a~Ve\zujAOz[8`0zH㊗ jA#N@^C2 <xQB Csʨ Ն Ҳl*2rGЏNom`~)!YSP >׬kOTHʕ+cl7~={6M:UCgq0h `8WH$ 5!nIƋZ -&p6Rn-R6m8X6T R)`o% Y@4E3Y|r^Țz}}~9]2*B~%.$ĆD H$^ ^<Ȍ٥K:|a?J?~bGI:uma A|.Ad%pVeXʾZX@U҄?Zaz>ᘳl*]~SEᬞeX  XѻwoSσ!짟~4ᅣ b!G";1 k 1llzs`'<7 viT6'NPPߵ&$P.Q(a l6c!B"x RB2!Agk][)>¹H lmAV~H[ZbpSbCy@p^-st8fm[w(ɔ"ݤQޜ,;rJXG䬀F+gW@J=\xpOzWv<ܐw7,.p`_s}` :z,0 *dkXUX`pE(]Ht(]֟XYcJ@'Ol}$#V OJZg"0tJ".0ALnwEgΜ1@z T pên;[T{;\w@:H]ol qZv#Y QGa0&ȑá $pQ%$BCX 5N O\J7]uؾ_xF]3zrLRc /;,,L]$Tgq}L6&Uԇ忝0i#=U ϝP#as{1+VbW>X6,uct*L}RcX\R[`O?jBʝ m- 4̟ZJ:F8rAݬOGݾCm>ANqsJ]oͮ!"P&eklm@AzAIm)B/k'!~ !dAOo'}:BقɁ<IH~p"yQY>Om!4HE%fi' Wd-઎D``m pV|9xOl8;msƇ0 ?݈ l݈d$T F l 0! & ݬd߇[lYXe FW?20s"ad\ {EB"0&Mhт:t蠌 Cl!%">g}Fd0L{-gX#=M# "Wq8T "vunt4HeVʘ> ΚhA8G>ԋضX}V|X*qqh!]vQ޼y͸4~/}frjq Y|6mjլ7cpXM <PY߈j׀~Z 1_H`;mWOy TYo*J¡=>wէW׶1`f`79(Tf>9cq 1#>0^f^1w6 jNu[e{EWn?nt0xF7=rh02dYU|% Mޝh|2j1}=Obp㉾%Ʊn^gp1q匹4lQXq?an|J&s Ex:\Hdcn0&Nл\A]fo["R/RZp T#T,$ B٘h5/%ef:zw@;F;wcUf Y:|$`;;QL(dH 61G0w!z&T4a^B>S&hPy>ڴ m=t<'%ܫ{_PCmz M+PXKwdHN1{L@MIӦMS6Cv{.:ZR>/رc Y֭[gc֞v'NrC|ؾ8#L6 ^SXhvgU(2PI*e s.L4}~:t*LۏD3E1( 3`СaY{󧜌:W=pG OG3Pƒtz_2ۆ^tAi%f3/ߠs#[5=wiBo=r{7;$c7UxUڵO?ihKƍvک`dO,J`m)IA&NKgn~ՎxH' Ӵݩzeaϕ-.&2f p&~+w3]n K#Ԃ#rw .Cwdd|~EA=a%L:dB ˊ+Ml74A퀗u5/=z+^LpuE, dSR;x`우<_ 4gA3ax jH5J aqnTWPaeᅣC|8#dӄw :;UelG]_D4CpjtNW9G*MWFO<٨RܴpZ3 1ΓU S*!W+Bߤl욘ʜ!b:8y6//RsdL'kD;ٳgWϯT=Ʒ0~e| kZ'Y U>7֭r䌚* D륎 @`_~0A[P͜9S*:D\:\Jq>&Z*&f͚L^ N`UpL 0pE@(Jm: D\ DDR+\;OkZ۷oWp'6xucS1#s  L*Lfy`I*ؠt&U WmU[ @e0sdQ޳3%0 |Iіh{tQp=|E*k_VDvYڍ[F8"Gx.K;Dnw+%u~Lg*ȉ*!f9WK<յ$mlQb /H0X|n4np!}͹8 &ȏ?XUU[5^=;ڵ~)DŪ`邺bCp-I& XZ^ɩL`ԨQǫ}%*FŠ1h֮y sa Y/OwV} NER &&箸l2t1v^z]1;(OQYN5x <^6L&rg9.t ,p =&U*cB C)4L^5o0>$~Ci"(W5ʗ/b[ Tbf&EpEq#L!AM ~` ZZZ=XQ9ηma |yQ$Qn!g !5k*#71X FmDX< `cG*TPװ~>\aWvmUl?se;7 d #VLVMpDI3 (#0?0/c{m6p]|W^tvZw`axaLӦkת6}%̀!c4[HW_)CGӟ G? Z@o:OCK ~0E6;zˠ!CTN0Hʆg1څWײeKDa /b>,Jpoe'LUWaJ@`lvD{" B9sdS̚^C5`PĂ3Q U>{S] Mg *eM7^F_< 2x~0 f.VAuY$@`XyA=~wC컜E->EXX|};Eᔐo#ovN0d|{q% +haˉsShzpX1WRZ^kPXW^,xV!j:uegO9S^t<"j}9;]6uN,dm'Kq}a qܭ\s+P\I(~ i` [+= acxhBb/ľw^*[m? c "n 1bl*%qC`]>}d\.)7[00?!@= ps@Ð{xti^v9OnӇR7AT#ђ>t3Bs2B.>n\:E[->aP%t[s:SN m!BX`!G0lvԤ<իP9rNV/dLBCΝ;˖-Sa܊$eXPjo(B%#vo}>}()ϔUJ9#YLP̙3ʘj},EX?VȰ LcE">$n-RLB6m}A1NXح.wIu*&ݗ3Q+/n85+݈8@e1`¿T"sE]H/֣ ,zjwmY0=}!|>Ί&-߫D;'*Y JΌRɿGG*ͣQat%]OG3RF al2l8yEK{ˠ"> rgrҤINĕ-`B{ 0GnMc*ݓZKx"pnlX/Ϛ\vݑهAT,Dߐ p PCwV"C$СY+tI箢'/~3S?1>Z w"YIeF_sdHEE8-GX:eZҭԹiiZ4MXU/Lf͒y蝶U;i재[,Zu=qہ=C>]whڣ8yT}.O2DﵭB5n޺Ygχ -]Dl$vXv0g`rGxoXۆ!nXX> #⽤#6BU n04 R+ϵ;ia 1 1&1>A˜1f 1(4*˕+ွM`x@X/FleT8$3=@a J8j2'zeh܂'UU_4-cpUcWty 'dLDKZ]{= a.BfBUh4xv]2gKR ʘ. :ru RNdε D"}ҡ*Ku/m['SJ_KKpbct@31샩arb~+pX8a uZSmȱyXaɋ&u;A=V9ɐڇa6"EL00ݔ&CMjR8,_o=z6Dcz?AHHegKץ_ tǂg-77/^E8@ޛlyBr'omNN~^6XQR(M^}N]MMʄ`Hv56.](NFD9`b=l;M#.﫳PxQ8`cƵ >cugؗ3ýN-x/oCLkO9ձZk]Q[?H=L(ӑ{ .|9&U*B?x2(/Sg>OVLsn y֮+p, Ig2 QƌnSiդOۚlr\wLPc珝L]CT(@4t8!{# #a,I}G&ՊР )oш;oг_V!pXmΛ ɩFTJoYBgvlǹ]{:=v#V`N:u:]e3B(jiY?Æ ceӴiӔjY?o0c{ 3uY=)| }kڝX)+;OR1>y.(t?Mx_|VۚԦ~i'yDCYwithf/-|8*n '!0O g{0:>˸z2&ө-ePiʭutT2f 6 4 | 0b59~1z¹#iTl~S.?╭;D%T1 [ȅ;zɼ?DBS?XZe[=X -c/3֦j((3ViKo+H~ӴiSUԻoAJ-u8wRXPq1\$ Pǵa !۞5&aA6x ڶI׫/\ݺJrk?u߿_~ { !A5A܌bc6>GO jHNr@`NUYt 5>Ji|x423d P4&teB^Gd(im@F2d0ϳ2-: g\zqghttfjf{vժUJ*4f十uA@Uф 4 44Фz׮>,@sw5Fђ%mS_RdCJ^d_A@_S!P=W0Jؠr!ʚ1w ܍XV*EhwC7nLȟxT ҥK10KW*6FTȲb>ᢊHGQ2eT> U?E=L BvG$3F#9A=B{uO<4z9in͝1z@_|EzZx*%.\ AHhaz)<8&L -$ hkuڅTgϞdmPG N׻x*ʒ4!pVfW?q $A\UV.eQ,i⬑ΨQ 8;$e~@*C;TaϱE | =?ȝb tLXד9XQQ\\m$q 79 O<9b|=~yf|SH1IGFF[ @H~IW@JXcϻ L΃ώpze*`\XU?u۾zN!pPwE Ԕp{b(Gl1_V pae Ý0Q#!ҥ ] Z)^lYR0* {CWPK8e/vDF"4uLX%x IFhӦ 8qB+B:0gbD{U*X`4ƴH"&S*QVPzip}60}~YY4N-]gbe 9nȐLh֬Y0"Ef=HUW\`C Il 8O4OyiB/ЯPzW*go@k&~k-rkӧWVB z?W)Zfo@"D 7ϦOFBҟo5Ai" 7.U ^n]kem\tiCҔ+r r14IJsv:oy~f /M8G^br?Χ|2.s<(mtA EqH'}׿4sB{8Nuy5x˷WL2U-=ZYa0o!%AԸjU vi|=bk}[\Â@(r\H ~ gj,3+ңITݚ,>~u y0+ˆKNI )LH<b O)lKTjcWoS6R f <'i#US8v~rR v,Ȧhvj 7E`~9+ncW,TAZА-IE{_6U'uM6 %$[&Ss~&tc.qre$"$?JKvSgG}rhs %H1`l8EJ7Ξ$Bƍ8"gJtažl|X :q&d15W؏ɾ"Rj॰h" K*C @F*Ԓ NZO}Ffɂ/6AtmBߡC%E( N&}wҩ7Ǜ`Е$:[v#1!e̞]"U#~f!dA e*K/<\`̈́h0sS 3}|c2-q_~wmSJd t?NߤoܺC $xT*=q&`4z^ImV:Hm޻Lh+ :9dcg hR0`̈ 4LjӋlnFSfkWe{u@N]N؋!C zQYW } ;9X5t>=tzy%Ҹ-T_CSl( 07hЀuF᪷leZLr護rxWTP/<Ӱ^h/Lsy3Y2+r$e<=<8r~gۓ浊y-" :d~XBtϪ,l;|NEM`&d v= DFѩ Ա˪8Z ivNrQ66n=A ߇؛ 4`:~>m"ڨ& I"*ʮý.KDC.!BwMŊ#1’BD%P) 4)4DHg`حe˺V}E5o$e*t=x2BN]I/G|9VP Q0Vb U:冒$|չvl0@WPv&jh]ȗT)@v:&ͪS6?K)Tj "=H{ vRaO>nO=CG}b= g+#jٛhJb3 I@PP#qȟ"9Hձ7H Jݷ|/[;"&x`Bel.\qA}GGFKza-7Ny=n?uf4p}[hl.OVvNp,$Hrd ``۶mʠ G0\ @q^g‚ g{ԱcG2e/ܵg q53uZ$%> 0vZtWqz pѴԎkt;aVI,"+dgMۇTʶ֖@ V`ҤINXi )bW3Pe˖U)R\CHI^1[PI?h0)/}mBr@y&ްNZ]qz3lVrZ' j쭟ç#]U? , ݝ*H" "(G7tK) ,Yc^~{o̝;w{)-eJV="lT6D-پť ZBYoBb Hd|kR9BSLtip(F ;×hˑtRHzsi"d%8"2Ҝ @G'O6ú`[Μ9CS(҆#]Nj38AHK.^Ҭ?p|D^) 4+/6@H_Hm~!9ubV):m;%"<bh+U3Vz83̝R$)a?>TLj[T*#% [Ru!2j )޽(\KFʔ) Wl2pZ_:8,荄$e|u ~*h 2`\#Ydg%5~l|&xFQk E]]̜9{5s&Mg$Xᾐ.xQ_!}*^?yʸqscF 7X`<i~F^o=zRf^YQs|Y[`pU;<4lk0_lppWp]j o>h 5+|YΝK 4GT~}I pB"4fɿ|*!\wqmap㳱<30Ye}!Y^耋 3@RYiܔ\kYjj˳@Jqh ?S2CMmxNi`ᓢ39@u9a„V7oE`PuRs p@´f&0E?xD/MVмǩF9ri[ ĉSܹsrKݮ]RB!*TbǎMb2Ȅ-[67nەt(!|r]TUPǨ#\ 2bF$Rz1!r>SETp ' p`K%вz]z;rvT50˗2#R|#e5",\ h={e˖` ~:UV (@3~(fl_yъ+>h$9ڴimVmAV"8,X@h<ȯt҄0Zj?,.\ U<{C·?1DxQF5-H`g/3atAπ,1S=uŏ}YjvB.PoaAbU]Xmׄ GQ I>a80duی  #mU,|`Ҥ9Y8v @B?PΝ z9Hơ{)Ph7V  خ/?dӧOEظq(Q \r,`d86ŝa HYf"ԣǂzJV[@2q (C ~AM}Ls`h|H0}ԁ9ʗ// h~%@a#",yǎ2 ʜ`[_w̑. '1×-uٙ mr+@_'IǸ!BpMWLۏ=0`2g%;!˘My8wݻwYB >R!uOi72k t_~%zL$B3ନ^yԩSwe0- i[^@ns+1 9oY&^Zm8DɠA(w܂<#2p6Tߤk|A_@ \<D3~;[`p ' l>8k'(8.;s 쎫Z*AsdoZu7Ph٬8U/[ت-̶qߜghgxwqC̼pV7"o3~JLG5mڔ/pҤ9Y91?'_~E [j%iӦ os'$m?H337xs$.k׮-&q L .`FPM˗֭[,>&G@_1ڱ-_&ƹ~<=s`@8 ]:8 ხsBܺu\rT&4[`wy/N:(MS n^C4p@i 6vQ;,$I"tX{$7+_`F"G9@ZBip[0;⃃¦"(r<*PÞw߉ " $Ə, % c!!L)Bʟ9)a[{%EO`VP39`ЩS' d-f/Z4!QCZ=(3-f,[Z8'ڹxmqmDB[\P=N簿VPŞ rH>HI2,cE}b5Us%ytFpQFmȩa"-O@Hq믿PO?Ih*A okҤIgWh@09,YRD u!y7ُڅLLzH~ 5y"jV@ȳCx6opU5'1>(e1x^Hwa ڡͩ}aJv,=#+ oآ}ќ {ۼ=g47avAx\Bcsr)R֭[Qgx΄iyh=t1l_/A:M0؁ }ș,Y@aUԷo_q-6(j‹9j7M4k!,,cv۷oΊ#Cw u{Y)"RH"Op UTug+xGJS9z$TcӕmLlvT 8+F(L?L!Y:}a^&U^5ra)C=X,B==%3K(: s$U#+"dJp| j~0C}% ZXK'"P\7'EG~:gIp b+F$~#4јehǝ$%NrJˋ.~RRXOiՅՔTdq^ `)'x%]}f%f([_T%1T^%L/䳴9 T:VJ)͟erEK"dRiمtLDC+n ܾ^lY0[*Ͼ\;́Ɂ c3ݨrjb󂤮+J< OߤdG,AO^sY3`1k̗1)>{gpi`zv2VlEE uW.6vY =oFYh75N&j ٣}zB e[koT4'gODr+SNMӒY+[U'7ev Lׂo† D:L PeKV\OuZb~ ejJRkyj̎!uw 접,KFw*h@dGHP\9qtH H>B ,(GsPGNQvZ7INT ]gEK'хׯD<}ÂA,;3Ahz󄚽nQXշq Iz啀tyY{`TL0޲qmzV,YhA3" Gs 'D8Q‘5W\z9Rcqj9Á8j76;D`K,Dcvʹh~T8[ m^6/$9S@#hL4j~S?ka7s`4&%_Ҁf%)M8 :t68aa #\^QTwC_ɩB2U>?JtB'rdAON}I/_/X;Lh 153KrS`P C# %Jg8Fb6L"\B+qko ۿooٯS TFQشo5]`")o޼޽{b,9<\WG<4%@;hWdh!Mׂ†iJ99(=|>F]'%XPлA01f?D1bߧ+]@l:8xK$M=>/L3oArƓKNh"L@:u^ޗ8j7N\(۶B$+0 ?@@aVMԩHHfmC&́/In^ZAa}ȣâgHٰ"/ap )r1 ]^j>SA^nkq__?ʣ:@>K[ԮI.:~0pᦟyҭGt5Tzy+g aK?8aAQLNX<^z9rDYHEzVh= П@RŃ f4t>j=|-}̎jq)pie{?1%AgpR9Bb`>n v/V>K]osƎiX{P>dN~ l,~91:f<>-Kwr׿iӐtq,;x9O$$NkS$9-Qo~o.GA$cTpFK/5QXTR" R$!?@ۑ{f{'w1)aԨQS/R`k)KS/54 IV-F/=@C<}˳\:Cvq!pUL~:o'wptz=N,d 7V(6Xt 9R0pv]kenguqƟOxgۛ0r"`b9f!IYt1eL?ЧZCsj tc n|6MON|Aж[pobg?$J iBI'pIFy}_ = ;J0KҽpāY0N^u6Lj>C1`z '.=J%px?nhSUuJeUrd-+1pP$FVl`/8ڐOJfj30uZm;vVcg1iZG_t-x==1@UިB6/1Ka3b^ y!L%`2 cxM=ܪ>BsH'Rb-Ƨ<06ǰqK`Cg? 7yv/l/X)Ѓa~ݢZ?I]f _fPfS BIdOI ǧK`,@h@`z=.c矔4iRPժUӂAd}uk`?{֠El^@l#W-}V:8 !L祩=jCܡ5U !Vu^zxg88|PS%b %'?  ?d!, gs3sٯY#{M*o&Vȥ`0m4J$ -Zm&Yi/]iC4b WAbd ?B`A5r¬"U-ZKi\yC.`(?_H6q8^!y|ʟ))aHF!NuCNB,U?>KpAM[@@"6/8~z}%h @p@d?>vv0hcQ0ktB85M!@bDkɕ.DIk6f,XhexIs`xg-́H}ߨ8>f jDX{.s`Ϋ|D>zjh;wN0==5+ȇXՇ*~>a HK(ZTaTabB+J_ ~"x8)˹?Ω6l±]Fݕ+W?B &8J3nuunZSGd;ZЭCT}1rb6/ '0 H M׎n!1PB=X^8[r1_ m Dg5uX5Mb9DB@jv I !Z}B|;dxsm^wY:?尨{tA T[z8T0{ng;~ dM)7Z]*f즒R $N'@p\$+ӇY05*"Ss~y_:`/7&SsDŃ-gd x1@ycgK9tx1EC?dJfGŋo0qG⬁Ie{ގ$p*ئ]v,HȄ?C) ځB Q>}K_$OͻĀmAK'?@^/f6?Hߡ kTݣ<\<]S>(r}R2QXl2CsԆ;KG hN[ H[t4_,uĹ"h dV* ~t>fOFq9&%ޣ]]I!dsOLHE9K`HYqd C:@xခ,πh=w!~PA(2'~7m["q$A8c[44eK@!N8Իwo !hA@q(._=`tf5 ;65*\`ǰcOvz.ݣ4}KTge$7g)(vхj~"*AaP)/!fg[k% G׋5$ێ]9ۈÇݿo $r6!p3\kBo40xR _ Hټ`6xzm~b*vׇEGop*tf2ϝu$O浟Rʹ1_4G ~ 8`|/?S} ?~i·"f'ca9' D~߀H xO~35>Thput 4| 3)ݫs8Gd6rGT:W L.G'4WPUB07fuFk_x/#xݰlFI=?SC}vrm炀@0;m}牫:ncke>ўvMJ;UVO{tivoU=xO61xl)'):&# % G3Pmj毖WM#`aס|e17 ó u x ǀgxn?y۶Z !iBwp zkн|̳ .73>䟊3Wx3KRD;@A`3!L%X ʛ1 <~ ٰ2d0Ԭs6HHæ$@X,F?;BASL/yr:BB0-M0&8LcD/:fe?uQk k0O5Ρ6@Y3`/jB jF_SC|)cRH:B1LYoB 4X.ڪRNC0@ QCf 2r-h 7Vc U90雲 8 3Λ7rBEN> A+2Ϝւl%sQ.i66r^gHY$@/zs\1: ^P<șT#ʔ<~z 4<{tOl<gJw=@D6Gc?470AK~Akl!z#RzbŊE@Y̘1zlbi/FuV˶ZP>}z)/^HhU!oȑj׮m[, Ο?oWޣG26X®reCѣGg)RP&ME|^E-ZDVjIKs:ZbEbcM;v4:;7n+GZm`Y=7|eK.|Jl%k˷s*&:aXbjO}A }{0.ݻת/)eʔVڙ8qU6f_zusdށȻnݺdȑ#fr`L2CPiĈLiҤ0sClOmv |MhN{YSJESN4DBΝ]`*rvoߞ/_n >X@ׯ_'K݄PVT5Y^xQBȐ!ܹӶ ( //Q9nL@v5jH!8J0:uj;3+|l飏>CfϞm't㗴YfM(m)K,왵}C aaɒ%Խ{ww\Ym8C~9ɾbŊ˗- "Kn"2k/((:Ų%ճL1mڴ_d3v<*j-U^t1Z9c$GU,8vONK`)[v'uj^ϲVB7SDt U7/W`eK+)Ns2P8}.Y3ζ[‡ ja([t](w?wN;zwcǎMO=]~=5mԮ \mW5kVzUw/o[Nwk $Mcgm+е'ƺͻ(j|&`ŗzN*Ç oW7wϩfvԵv.˾ˎӨCKV09„G'f4QcmEԦ,>pDG\r1 a̲%  me˖V<2g.&٧xeKV-ٻ[tir4&cLXv@.Jӧ"0S "yxrS51pvhbt <Do߶c l Ҿ;gΜi[Z 3+ m>h0kepQ18ru g3p:dxεk}iҤIjP e~p>gpN`K>I%}0/-gѩQ,TdI&HK8(GڪIP'ٷokMYC^JYG@va?Uܪ2oɓ" 0@ k&+֬Č#ayWϝ=G7obX^Cן2 SlZ Uȗ YP]!ؒ﮹>cǎd.׸fR﮹ A"EE8&TlYѬ]ݖϖWDȥ`6T_|x̌t G7^~P*sd6mQt=o9r`!Fg^ 2naIp¬r/x~7wT7~뷍ıD[6/@yeۖ}(6f:͂I!:q]|-(a١ {`7bmPQ4(EmO{oQD$?y-Ui) Le3| ȹ$6N[5{mDǤ-g-E֪,[a["K<^o~X'GBc]vUPgUl61ÔfcPY- oм=3qBdkYvǹ\fvnF}~mk] f194uy`re ?`S޻[|ޏ SUv}+q&W#Ȏ/ nSK=xktk>زZ.@8] jR9@՘r m .#H9=jJhI0c\8,p)ԫW/jM8k({oFP 6$Iaٳ'_bG&́rZxmaq__7[~? : #x of%f~pyg ųǔ*yRN1UqgNc_3!,6#BK-wuƬlD,dp-@/D uAYzmF>Ic1d> ͗pZggP  Ìj %\N+)}ʀi@xpiJ ,a>q(IdAuTv7g#cyDPCAȄI@Fs7lj|:<wKc."To߾vΈmA`L 8V5"i}EoVc`2N̈Kw{~[p$;*]&GXy鬁r&OT>j>ӶKo)8m9mª}ވp ޽{ 8KU 6WӄU$O [L0't`B܂Aݝm945+AplJrp$Wt% ҤǗ\q7,˴`ڹ p @C?! h3"D ' hG_Hh2NXƷF vZCJ6#R4s";EZ u[0@8has [s 2~@`!@v!^RH GMO w1mG0q+Kt3#{Z٫qК44BW!ى4^/Ӆa@ʈJ@W4ەǮSѰv\B2jK  pc4ihh̚)NsNb4|R0z:!>kM]tqKk l}ϟ?3"< Ϋ0!՜jY1cŊM6ԫW/UlYBsҀB8fʔIrשSGS@ꪃYhQ2yfUlDhѣծ]۪^P7B 3pmb|2$Н0)PɾKHr^ H44Bn r& 5z#{LtU)Cb!L $.RWϟ?_ 1ڂYڬY3ՔÇ%H޼yi̙@ʼndl:DG.rh1YЛ_>JE ~/pxAЌ3$u7|~̄Y6x48 Rŋ򼣭ƍKzyQl٤>Ǝ+EY"S*BZuERfiG-Ym9ڮV8,fDbJ&Gt@0q_v?2dzBЕ;_)UnsI…   Ι`pJoSrj`Nn4m\$뜻}*Ss]T)AUݲଡmwVƌ#|?u1g èuF.sg35ep[rv-YV-RJR̙3&k[ 7w\,3xƍRa~Dka={H=tR c6 BkqY/%JlWp<#g@i›~l@#{.oة؈mf@8GG总X[[3f>a[fM0a!ç;6 H9{iڶmD  ă Rsׯ_W.9zl?f"v}%9u[6/JOSET\NY; jS(5"EЪUy}jh>8@7n$F.?~]ȉ4޶*Sҗ_~)k1H:ulsq@}}a,U r`6{l+iDZ$VXA>},m"]xݺu)K,U:B=Tʦ$|{}H!LqbFI#f{6qPI$UT B#I p2oi-[ T_s#YK(BҶz7,FwШ*JE`ih8+ eHmJpũPJU g3?JfT)}mR3KQ{wU5'KU%; U9Ə?7ڵkg0U3jI&FҤI/6'r,Vn=xj2ˌN]7nuO.]ȟ?坓Ԕ3ts,1=z$ÂQjUgK5V/DdOt`4:vhoe+ & ָXtK_հF^ 0kwM rAwJ<2 Oqڐ6"D ll`'J+ik-ADFKPv f=M42[7*&C8kU,M v&* jZӨaMcls6VU`3NR͕O^ ~Yaĸ~G]5^`γ4%=£Gw;?4rXnV>CE'?<38{xDV(]n-$l I1S_&Q߮Kn-s%z<+{ZUK;~H'70q + Fs@s.UV/7xV#@+`Oiܲp= v>wҎt(_t.cnAKwVЫoi{Tw2a0̔5'u}EN@I#?u<{T6"uYu/O@j:X] l)?^u8DH>@<~@ܘo[ӧ QLM֤8< z.\p-a#@1:og~pȢ .w>Vs r PB[8B(t>؋&WT)[LZ͇vKK, 'Th~P0"D$Y!0S%nJz=uKg, DIU[֭i#/V =⼾CpXK$-#m 3[ԅ#̙dߠA "%QO.Sٶ鯋;T>Wb7*Y؛RV/"'O13ucvF \#"*M^ }TlsH|,VmLL@#"_ ^P3L@C.̵ D.N^Zm" @(Pjpv 5jЏ+Goy:,%UΓ[H{ȅ.楩E2`c@(* ^oRepۏ^3q1*ef*vNx *n$]xM %Mwx4x>{5&矢@;55`&_>BTH lt]u=_Ƥ4y)w=Nêz}@+XpFrFΚ51h gUty9ѝ8ݨgQy޼VXr,G.o\d @{vC­,cT@h(fCV4`fQEFlMg6cվsƣ/|&;g=J.6ի8G`n`(.@i&>1 M#2 7cƌi @1ydU$7b  :+-vج tʂm` v=-|wu\B)aLN$WMp Qܘ L:Kh+\ey ]6s|;4wGzFzbd!a""a,t1E1нGoh<7U+À%;:"`|G~U]60!` |E0|\cjBӺ0cpp|"Tʗ/Np-ki W$ #ݨN\D. s!Is=uV>K2&_RSQ=.QD;"p 5"\O LXyOͪ73zeMcWh eXΔP# o)EتYEIZa /">HP5ވ *#1|$<|C d Pw&>ks;iedE{{"CP PWI?C^ЎDI 4=aBْSt7 ׯa@pXx.~:ʦ$kF>ФkpK o'\rNAsBe@,]QYsMH;N\])S\)$y]pڰ{su.+]֐dL̒*_P;Cb#YDx1VxY+,Oơv5c5Yս$^ uQد+ѡ8 :|6-rHAoGK(%MaU_@`8pM"sNWБ *פ9~8-/ fuZ01b^0 r0!~f*8Ѓh爗fW4ih^3As@s@s 8$IV_ųR'CTs~hZGs9=s{M6yE`p\]DWpGu@O79xs:{9ЂA(3\Ns 04h!!cڵiС 61@aӥ[)[ɗrhQ kw@> #m1P/^~N>M'N wNwvE?s"5iD&h 2m}_[]Ct觟~QF-7oQЁLg&Ge- !'aܸqzz)o̝(NL^a@Hs@Bú}́YdWTlo߾9sf=:!>>T\9HŋGUT2/]/;=Z ԥNAZ͇=A=]yhAXAs X8yV|Ν;GC A^ cٳ)W\m6j۶-aP vIBz%2Gנ9/`/t۷e@}"EX:={v?飏>2ͳ# yuܹs%{ 4i"چ3J[p?~<:uJ+WP… Dt钥/a: $wi"ekpmJpSss8___dpeW(QTƍh֭[Siڵf6e0 @;pׯ5hЀ>CFT[p|sacnxݰ`?wHr~=q@ qH@ M5h"%bŊ f,u86vjSe)f .`ɒ%VΌڵ'O/> mڴc`H탨KҜ3!].O_``]9~8~H A7GGTA@NB_`ƌ!A?_@IDATo@TC^Dѣ{n/x>l6ޓ>L`p9oիWK0~_D'M;&ΉGAZaӵkרUVRlX/[l &Pĉi׮]IB0mhc|[nZ~v! 6 $q3F1͈"LZE2tn޼)Θz;t8ܳgϊΈgO?={Hhr-8ޣ9Q!"@\%KFTWZE@B Ypȭuw0u'MHFoi\Jm&O>D܍7: |UcluzΖ & j p&t9%$5 jY0ӶXa|#8{o`G?VL#SLTR;w6ؤ!叧>R;KZuñQf0Ha6ǦwZ ?XQ@|cY0`:uj#6TU#O<fy b6 \;]@[bXH#f1wm7R1ؤceu~߾}ւ&;5kZic<AG  &JՃ` FOlst˿mYL4U Vh B8Gx,pY.jKN'u?289dvf LPoڴR,w.~`~2Pƻ0@-믿P/~s]Wl9yfQỦx3Qf/X(9(gC#`رqeK6·Yaڴi(( q$SbB]z߾};"~1[ RJǏ }o7Juc|ܤgj~y_O)5p>T@I֭kQ1s+4L%40O+6&SR8{>~,aڀy ~znJYءϿPsxxCMwV03 嬋b뇽 `>|<9K G(-zTiv}pP#!ԿZa }j`r Nh'Om0JtӨϙmi%A f\CD%O cgij3-7n}PL 01 5w?n(S˥ ’έ5A㽆S j ![>~1jb6[-mGf}l˖"_|`x6UHt ;3謯`<}(aQƅ~3S mNhM (-=M0Yb3QreC[|<[LA<{sa?>B=W'%EəQ<@PLd"}g0Zj؛&`,&!<Gjg}eׯФnU)iXvNl:!JIGe<@= kF r(@c*9p/D·xWt4"(A!6;H(s ΅UT jfQ9 p<$0Ɖ)ɯ^nW-YmM $ܪ= Y0 mY =)Z0;99(=X`n5d$PywPqhd t3zЬYCs @ #IR<%7$ikV@!%!MeŻE Ν;Gp8 s)v:"4!צ99@|7pl mB}`ԿiIs ^'k y WdsɾN@b}2mݠ@G@ P@{ \F`dP }U3-u&}9a/C~zsm j)~pl;2^3ڟcGjez uL 5Y5>,·@E6 q<]Q(-=9F92Y#+پgvpE|  oOE qjS/54)GnN&D 0ݕ0А@pN ~_}F?M%s$ '݌TVZ65q\pijs*TK?eFԖlL"E{xwݬLx@p=^_+NP$ `u k l3u=tH6~Q.hPf>y=E~=<y:$rr `U>vGuecǚ-oܸRG9Ν+EHm3ο(F նІ!q:GcdF>Da Hd~_6:ZgT18ynDLk +CN^!1CӦM %Ps `cG]D8# MH]v7o^jҥ2dVĹ}Dƻ~r< `)h+ѣ}@۔S7]R$KKiD "DN,lBI< (q-e ܎Tvh>6mvH׬Yj׮iD$VHqpB @P([ xsD fZ2~@''9 pE9}z9IL{dnaߠAfN4D [:; [ڃ0n{8O\1B4l{PH"?b3 qH!kOߛF3:d@Xr Lp}ńp~$OAE_7 Q5ժUagΜ)!tÀN{^9rDl0E)k֬4h ȄCMs mx4}yt1}7e+Nv]Ss 9n1r֭[EK\nx.\ϟt"4@3)} Nǟ[$!\e4Eh@II4ϓJR*ԤҬTJxo2 >~8y|k[gYHY̓1z8> B2Vmݺ5u+Z5YJ 'iW AZMA4i"aF8s28.Wק_7 Ev0 _Vz9P?H:„3<.Acp=;Fnɇ.^:1=&5 XO4IjFq8F*V?ƋPA'A} w\rC.UtY=n袋P#GT!", 6A°ЏЯ_e=UJf"ʠAA^cǎ 7;8p3sȆ;&9-B*wH(%veʔIZpc'MT#)h1s Qo/a\r%D\r1ϐ6 r3۶+H _uT?t&{p5Wfh2ڞ<) $#KF cfaZT~6K]L:cYkƐI90t#`AOuHO;tR%˃N]=cU/mE1E=H;0"[oUo?5^ >^,c.?N pTvի5aQT"'tR؎S\QnڴI)݉uqR2Nj0oi|:tƟ{Lb{|BdD~`#Fq @·%excȉgp>_Wy9rKtr*2vn/fwP'7$D/ÞMAD*H*/7N?Xa>oHV4|+ҢE O_7n뮋s@K/4(N~ZB6o!֚}NQK=T 6I8vipop,S8s='=zr:uYoWw.LsKL>]POlٲJv)Mh"SG2bBH2k ƱEM_.X%^!o}X6m.{81T=83{~0 h4mT =)E/aL*L,A!h߾vmZ|뭷 cqzK/'TCW e (Ri ^{jE.|pRt@S]8r؇"u'-[acƌ .@_Yp5fZ\j&h SJTVX$$c; 1GT]W=;3GqQ"@h_*QGP~}!s.BU'PA60a[S}K(1~(h1Q<쳑yz0aŽ_sD\~0ҥ?;` 7ܠU8W|P1cT> ʖ-[ r90!:w}dDGRpe5^(y%r'aO:udΝani}\# eI h&._\_wSO=%Rׯ_Ǿѳ#g&M8?,+V/SYfQ@?/Ȼ+'OmkhV`9n[5k֔c*ctق1]2 w!CͲ:" UeRb|`Ȑ!y1f,8bJ2eOW/+)SHf:䪫R5/ڽ@ {:YFb<+W^y%nd?[)aU\9.gN;=?E C,n09R:zVU2\說d33[!PcP@JcC/ ?Qď%XQA|G?dAbw>M}TA`nh/+l'|d$H%ȳ޹cǎjScǩ%gG1Ź [MFtqMυ!&O5+?v/ۜeŃ()(LLPhӳ` п_wQ ()&(lxH\ve:u gyF FC(ڱcl2%00>a8ȯD"lcEϊGy{6l?=Ǩ#_Ha#E%+a`w&$6iD*WRtbE,zؕr<`@`Xx7 ɌO{g#&b]N ×}j , iy@]3Ř~}uHs ~FrBzi*'h Ԫ|7 {_/ߜ-k";7 ;q-=bS%鸇k;-;v}S.7>|^oUg%VTeK#og-{nji@{}.߻| jާדÝ5uZ=yޅZ^zԭz\H9& -H ƀ_qcLuv/p!aqc!AN+8><#}ݧ`b# A%JdC^A)M]y&y3toկuB3W-gcpa:rt̓O.QjKεꫡdK喽n{Gx7j;T{:t叿w&*?I[MRr<48GrbM@4_%>/ww?NM O#Wr-OOi-?&C =9oH\f 9e6D/gXCu ʃu F H}؎0 5jHw6hᗟ88o ']~;|`]رq}lРUƦC[a0P WY{8w~ܻtF ]vbq/?g:]Jz_vWwc[~ו;?>*'/=4|34>?9ƀ;m_}~K5U*g u z˿W''75mw҆ҫ"eTEneQ/Yk6aUGR0p6ŰTelrիw-$ alӦ6L{V7Cb \Ex' r{c>y-QG% Rw3i⑙~#O!& zxc`|3T G1#6h).ge3͎cϒ%mSU˗M"/r|Cc+SIvdzQU,[{\Y0vSs!r*敐OpO$&|}u!GEbŸa̙3塇ʪj]y1[`HN=0|dfгgO5$ q$ AkH؄ ʍ ^q͔*weBI-2HXawG/j$QTD|w\wxϊ KFi@RH p^"dɒr  =O3#v~bчb0['PS )0xUE˄]Ό;<?*B`D*LomA&`: .owv;{):eH.yx㍙N^{߷YC؍/X--rҏ?*G+T&1HI.!XBjRJ9lƠF0\[:N,Y'w.9FQ~aBqx,_Q=V;0*I:|oL#]?dpjYaR, 6USyC 18e-^iZjPY69̈w"d ltCrӤ^{Z皘W"us3d=82gV!>S^a'p3)w:rVг|n}տd/bTYֺŴަ^ZaRLvI ؗ[9"%S!$?k3@bNW:УS%Tm&JS$pZ>}9sk{ӱeU?We]KYF0P`< @w-ʊ5JêIoה5ʨ0ƴ$2[_M(w -҄` 6)7CK7D(}1HבFFaX @"]b_M2sYhytpxD1?I7mTSu8|_:E wfVٵ@ԘB^XRx[Ȁ!㒗$(@'6wKb]c=3d%R'e>\U>Ǘ_޽_^ a[h.H z 9]"{➌h"[$q>^mM&3>Ly .|Ci.7T`>  O$BOq֙\0@-2}tUCO`.MuTu+0b.^X@r[Z}%Od'.'/n:1yi")MaWBh*ap̹ kBx.g:.gYQM w :uD\yvOQqx{_ qT iͩ13]%>F!7H҈BoI܏  ;3<3!ʕ+UJ'6&1OW [jQ׮]Uc=V%~`gVo2;N1HyF'j0HtE;Uy9cTvnҽ{wMWOPٰf͚J͋NpR)bdznݺ?isީSN9%!")Q'@x(2x)ߤfCk`p00" F鉀1I< @A֬Y;?R X $rѥKyM~q M8-X VnM~;0B;رc4=Nki¥^ԩSG31s Rl }% xfR?Ї~IjD|˗/TEdmЯSɌъA"J̉$¢ -H+d.Æ 톳{O2# oUF꫕9r G@b4CDvM48Ȍx>D6z&8qbfխ<0AO0?^;vAR ƍkb%1:J)kgr$ndJPI&i4@״GZ/ Ő!Ctӎ'˜9s!m6!dz +aUd}V$d;'X5;s/|=ҹsg0ڵkպW]84eFέ)\-veas^3f̈]Ɂy%䮋yϡ{K.>BϜ WCGJ敐W~G:|"P*U—bX(#@('12 !fn=bŊqF s}2J_1HFN}%h~['2|;+WNiVVMfeL}"!`|5j`}%rXq'tRq\a0p_`*֯_R~:VfD!l˖-.Y!`$$DG7XMtg; XK cC·lzE@P. [>9 ;7@H C q0wĝ\ /^& Kgq:t6;h|v ZϽ8)ꫯ}"iBN#C0 @䘧l(hիwcǪ0mԨ.M __]HŹHN!bS߾}5)K C0]K^L2>x QgXp] Z2R8 ;]I:5׉XRۅ|D8ư(߳D_J6A"Gb_r !W`Ds7϶ C {c=!`x䷿~>t˚0  C0 tGt@#>lXp1#[!D vl@"l2QSOi;qպ\cP # C(h7oQ׬Y(aŕ'89-0F156C ;dРA dp)&sy93}8&$KsY5z8 ۘ1c0\oժЖOV/\wK$\UMh"~_|B05F>YjUb#d3 |C`h+b3K./HF$s=7Vw}'m۶3?=G`DK;DXݾ}L81Y;餓bevk0DQQ2!`>(>`^Jణ>:$I2dp Z^zuˤG3QX16lFH0`!M44)S4ѣ9BʕcR/>HHfh$6:ck.O:]* 'n_zgɆ;uhv,,$P SÆ eO>̟?_,X :#=={J m}Q ;SiRzHP+ c#߅YZ|6ooݺua K/OS)ݲ1fv)8ton.w}N?t7nkN ~m-`?sLܹTuIΚ5kǸ<|z-[bmt7)[2klVKF _|RT y9>蠃t^(tƀNL֬pr,QuY&,F)]֭[4Ɲs͎\Yuc=&dARԯ__kT9AujPŽ=ApؠE_Jnb!{U]=H R ugx_xb֏GŞnV[nXy#iy0)ƝsӞ34{クyuk-+Lkn.Wtio2&ݻ{yx^s4O>n܎^SzN9<|x̭S=x. 礹Φԩv(z.U<<']30+p2agSFi~9߿rA tB'P7+R-)3Cۨ`q}Ofnjժ;yl0_ꪫK.^ziֻ[#'r?CJbƍ(^xlp;AU(9(X"+Be*)\v9%noF`OtPnJt34NnV`ˡRJi;Y3k]w8L0!vO*$\B1 (֯|W^Nnu C `Ɏ'.,R2}1.Nf cSM˗שF^Rc@3NhX C O 2`7*\~GU GsyM0z b֬Y+iӦH{F>!P$|{J6 bNrXʕ+)f/LD^Ø |ԩ p/h£7d҉ { 7>,N[!N0g0xxjTX"0%K!`#!ҡQ!P誄zlhF6d71xx=#Cz&<`ތ 0AVصD03N' d=XuPnxѻ뮻b߉I%sz=upbw>6qdE}ư'~׿4\0-!3,"wsΕ#;0˞q3c#QOjYڊzmc1E5X1B`>&$# QAO c,l4WAA;_tv{ٲe*S@*]Dǣ.nń%?\\tE:%05k% FMZo ˆd>5+f"D>t.][X=$&}s?sYX{NWz.YvsHz.IM?p`4 cYl{@,.b_wΜ9[=12wDs(÷[y_}^s b-v^V<'s^Gţ/p-r^ ^ U7*{O/ǝ cƍ(HYԌ]Y$@wIe<s;mH $ 0cv\̎XF *,,.|\=N/b։=n& s= gƱI}rbDş.2ysX{9hٲ٩Ru6 y1HKd 6l9Wvm}^w.JBz.q1p.Z!vmqu7o'p9u'W)p}b" \;tv kg |x-NduC'$©PvW-宧{mAaB)v3{mը{⾣Oҩ*ӧOW=l-@1V;FߣG 3 ĦL~e"<3r̊^rkBp[#.)u1h !q)8Ädƶm*nG}4ܜ@ `A L !wLs1>ƀQtQGirbϞ=[u_Ϟ=uHPC`8ϸ]UZǀ #DW6 7:А DSoh:]-AfX!jcj3jXgРAҦM `7za}fp.̛7OHU^]@Ə A"m םF lܸ7jHxn`qR.[~ofIrj H]LF>ڋ"_Bc#CHM1HyQeent$g@>8nܸ 1M.\F"}DA"0, W@͜@HT?&* zGdرB\u놛s 2@z"P,=mNW؝sO.]ɓ3@?~\ vN K TY;x;}Bڵ`Vr_ˍ7ި1 PsD%kN% GlgS0FYfgʔt1Z Ȼロ6FC(`n25{˅镀[{`=g]gA?7xc@zϵ %KԺ<WFpCznWWF&}޼yVw,=Nr4 /o>p 8A.13ǖ]%BfxøD6fs"E9g~xMCŊU#]f(ʰ0".$c4bwPB}x= ޕ[[TkS%= `w6y'2<!a~im!`I1I>}C0 C ?0DWTI}sՀݔ4rju4W=I0y :0v4O'75G:y;!`!WBCj  ^6J}HGLѦQH(03!`!P`* C0 CT 7gI;vh<0* Ν7U@?3gܒOQ/@~k牁ω1 S%'n !_I 8|ME~2|pQFM vl{)ua20f͒;SZn-|C:t萸e@ D1)130s108#GR8Uq'&G~Mj`޽ /ć% de͚5wBC%>' IDAT<崗fcSĬ~`޽{ 6;0-\PsL0A+qYUSO3Tj0f2ԱDKd ڵkUr/!"錒{grS3> ZV71BB]tѝ!ǯ7NuQY G%K=Cڵk'gq2N6JlHnchpQDjv$$n @Y!.@cǎ_|QOVR%C۷oe˖)SEv%ى%>e˖#8C:N@]^);{wnr3c rݗ-;<9Âoˇ~(HX샴tRٶmbG}*nРA'(͚5wyGwӧQGXbҤIqaʔ)r'Ae݊@ ȼxrRk:uR nΒ}  R+u|LGzݺur7c*bjcB%Я_?C*sΑΝ;0sTo$ICf͚GJ'yСbsrc\vk #v $7mڤH"\'1J}}N96 9zi!` fcP(0C C0 @'!`!P(cP(0C C0 @'!`!P(cP(0C !@A\ϐ!CDΒ%Kr]?<Áׯ_/]w]dU<!EVtx7!fk[?{7X$\qc!@ c bP؁!xn@|&N1W.u_hNFiSdXE˗/S+}qwˊG zJiiF gּ 'xbqGǕ/jժf|nC ]pY C A馛_zGDT`^ʕ=kԨnYxWV-1%qu9wbx.E50xv>zccU^ylz~rz.#b ^|yoz"yM6<زeway.*_؎ C0Ap6ΔBno]E^z[|{Oyg30 ԣQNL/cç^xAC(;8ilR'hFƍkHԼys 0K$22 d4c}+1 AaÆqFYj~ҤIBHC=T:vl駟k&,$qp/ZHȂYFX'ڗnݺ)c5NUӃNnqj;5_V ]wݥ\߼ye3{R0$y!`I Ž B7#uկ__ar)͟:(ש͛; C9PuD!t?R>9y駕)8cؑror F bF!I 3C iB @{SpF…Ox!#C 0 fƘ{WXQmp,W\ cz 0E7|=Z%Ǐ>ABZҳgXш#~UVҶm[YfM\P$o#CȈ?gJ CDsg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o@IDATx]EAPAQ)T "(( (vEE@EAD(B"h*U^.$䒻.{wm33ݝyA@A@`  6HVA@Db  # t,dOA@c_@A@HG@t,dOA@H/zuutBW]uUϙ3͛Gg}6 8'~,YBK.%0vԻwoROZ_|vAO>$]pޗ?zhڰaOY˗Zjv-4d*S t+WĉiРAtYgLrcA@$Y}Aܸqc梋.Is)ղeK}hѢM6}YIo0CJIIQ}OGu0*UgyB޲e˪e˖mkݺϹ)1YRh)f |Ɂ @E T *TѣG3i'OTxqktؑ/^L}8pΝgsgPĉ>pYv%Gɓ'3Ɖ"E"ڵN>MW =sO>z-s:oСC*^A@31С쟾 PbЯZ*o<:w[;OK/٧Az% ԵkWh>ibu5G j MŊ#0Ǐ4M:|0}?I3ݦڵk5ri߾}t} ~!A@@1 ?cƌ Omݖ+TR3d7||s &MyG`2r0Þ.knݺj@z;0NK/`+Qf@ڵkiժ:}GǏ'˥ 6,TqrMA  p0Ǭ>M6ƍoX{Y&@k bMFc$wN} } f͚E#GKaȸw^[v̷sN^a㯿0t@LsO-!-[1FM|ܫpºH0`0;6ছn?H0i u]~i@BHU0^jU^]ψ#hժU4{lma =@9A@@B2׫WG.*#ѻN6M3C߱c41uT=k}(?{~ǍH;~Pى=|D*ڶmQ!A@@14P' d_~ Ph"mX%- x#I&0 LAi@M͛7K..b-7N o o]ȶfdJ.A@$,c~:aݺuԴiSuq<a`O`8.թSG|t$ξEZ~">yZrL-Ahʕ+kH{l`,A@ ̙͐3 #<=C-ܢG{ꩧ 2&L',ƎKxJQFGzv. s-ؽ更e =E`CDBoz A@F au :uA{@<H҇Y? a_sʔ)Z)M` rC>#  pC,16sDꫵ!b6pƀ ʇm#8TV.\H P,YR3.>2A@  +3 9EYĉgP"=&RubO+@&%X8|8p>~8: Uguwy1H''A@a AH5L4̒uA@0قO2 9uϧ . o >zi  a 2b"gA@|0KA@c9# [1ȷ^H,Y*VHիWOjK]A (u* ;֬YCJwm @" [& 5  909MA@k1#A@ra ro[&ӧI^IwyǎԤI_ł cp2C@x #wI6mJ?){ a b5Ԯ]d4h&RラB$ @ [Ih"`{q]R3$ t.C0N@zRNn]Ia-];x UV-,q9A0ß7͛f,Y3 ^' uǹXbAjb3x1FI[ry*~\/t|8[ ;W\FEXuqtldL).=NۍW7@o SKE[nwRQft;vta䮛8U9['{=f '@p h}{J3(pFڑ+*ݿPv_ob; eKŒL21N蔇{Q3Rxckd\XGPrΔ*28a:}f쒓uyn , *e|Sx`s60X|y21}l賃~^OnnG:du,M Ql2C} l\,|q(J;. {*Onb",UT(7A0.^8Q*ȑ#TpalCB%K̡;f6`r!I$auHƕ\a 0h?StgOJ􎏦zI2/)NwFѸN/ GVŊ:k?NJ6Xx!2Ngzw8B #+AFԻwk,9@ XEl۞i9ͬNH"5 _Gjc֪)C}"d4sθmJV6݅1BI(79.c߼y3}4}tj֬~zz~0XDJիă~R˖ne}X0BebK)@x|(AF>b8 lA%"g `y]\۞uYUVym A@/r\bPfMZlY|jcz]Ru'Nl ܏=E;+?Z /!Mk("p^ޤJ{ݿ*Qh.trA3Π &h} r\b6H"xa(Qz侱'ŁvVadaQKV!Ԯߑڻ':ċY6E),e \gcOs+D~hќ%n߉9k6Z` $ c V$͜Fu|5r_Lf :OAZjrW:3qU3GΆ `ADPa<+c&͛fd>я,VQCA@#`hřr>ܐa0RPQz8pʱ~ 욖)vaRMH (K'ѮmfEdz+">^pKKwŜyR⮘38wEw` Py F-S03nފDP캪̇-W\S ,,r7F wȜ1S!6HZ4ҼS*Q.U~\2 6,5]+9@{%pvq]Vc@,闟ֹW-lNXHX" A,ѕ3E z¶;4$A@:J:R  cNj. Da (D(be2 D@l b-D ,:#T" D@$DWA@ a IuA@X" A,ѕA@C@{`R]A@A cKtlA Jٳ:vH ,RR  0.rV+|wtҸTFg*-A@0YN2  ya 3  YF@,C'A@D{TZ^:5Zl['MxB@xzRA E:Z Aӂ =D=,$A@A  4@A@DK)IA@Hx1HG( \.Zv-y2щEt8Qֹ֭͛#4 "ZX  WEc~/ H8Rפ$ʼn' !jڢ P)]rԬI`AP)=@[$M@H RYj/e5oni*Y,-[4￉ 0ݺ= ы/%ŋlz:vmls46[lY >H6YiwNk1/Pb@ G9U4(B) :]Wi^<NB"f$y772G!j9rĻޙA a`ܱiʔc4}z 3hçNFԩI2X\gr'ddrxuH1Y "cZ>TL-eR!bu elg+D?Jv)iU[h`J+2#׵Pj߇ȼw*$Y`ArnE^du@i ,\DƑ_`BJyg &9۵Sop,qDB՛.ӌ:|H9uY:ƛ؏J]s~,urQܳf+g݆ռU)gR~{rR+T뺟1 2 ɫV{ئLcvRk֒WR9 5d\.EoMm2*rse)9v::j^hIT kIkV~E ࡾMQ+vY顇>fn6hЀ?\\:hO.H$(ɞ Cu~$k֧BבѨCG$EϤL$TA4k[fBk#_?Qݠm Kw~ƒ-[7Mkq[;|Og1ɖ ۢH %O-C6J*/I-/(J(qmwb/>> ذe_(' >h^'o  QHA 5ԩS4x`3gNb#G[bફeé̙D Nӧ!Dktzn$w4{$"L"D4l9 FBԨQDݺBA@? cuV|QȬ<`…U5<#iՊ@h39E uaY3# "woH\.G&R{%7BCwmD/H<-[6dA@(pߟ4o޼ Ц*U !].LNYÑ+Ov.ڼ9 䞐vƏOb7!A0zqoգG ׯt77Ojd?bNN<E/Г!Ĝ>5kf[*@W\.&ONa ޙ ,sjGxN' ! kFTY3qFi'6jP_HN OƠvں~}1szsΡC"Ii+WN LYdTR%?4Cf|oo ,?D;Am f2x*}Ya=;{(- ڵKaWJm Nb%XQqcʗ/ˑ"|l+ Xs!h7~o9j~K@ԓ'O~DP&a R_[cpr1+l[|ymm_/z—/GFM$AjGXZR6栱c=gRRRi%(ufVpuRFEHvH!ƚG}ijK/t,1'njڴtܴ/^L7C+7 Q# x eY(tq @1ݛa֒ f1;tz B,K‡݋1Ho^Zjy5!][č/e ȑ$ C!@|DܧU/Tl]JU|o5RxTB9{_;8I{VlBlC$c3c;(osN(D3 Tgk7 Ή|#FuwB#{Wq bI<f8;UEY8_ZlS(ysĉ kY%4!B i1I85~J mx98iܭj0`8զPI֩>(m>#wSLAD`7ٌ}A@\e ܨc jFnDBD›a4c~>%" /[F`战 SϞD{Nx B gWI6A@!VHYC 4Z`~w-Ff#$̚뗕%n+X5-F H V1O|0q!1$Np[8Ɵ'$@~F@8}GF f1p&Z ;hb$ΫXᣏsDR-@|" Ƈ\8 qx'dɉJ@;a\܈ j`y̫ZnʽA " A?t 7RAY{jDܒ1v aD[cFϡ" C5Cƍ0u @b" A?73!-5G{]:Qti퉖.%2x5DkgS.lןtIgXA@l J{!lo8kvE,jmUWY.8,~m;"fFXn^HZkmFap@tV-!{ܦM!C=cK:^{E[$$+5x0az-ry(%3'@n" B`2"D~m~D_7Xs[f^IP!5X d~5E_/RUS"`v+g+;ڄ`j i yG%D @3}H`{w+hī)rb@IG8S'+V{/DE@;"1#vFk&ۓGCnOeJ:-V'\xX1Ѣv0lmjPfzI#d\h"Gmڤʎ3u$l iŠ"zc8<͉z˪ 0@iwov0jۤZDj ˺QCJ:XF9FN믳O6A= ڐ9G>?RίSr{[ŝJ@׭|ɀAʧ,Kh`iԨ'& YH$壞C|қA33HGf7|S5{"SCHe̞:BtS'cH2xVwHy/'<#BpǏ]v)7s>W927o{D,RJkJujRJTWWF*ӫ-j(9yE L)voZYWPM*V9a7ZjT馎R uʩ+_S@eJRYUjj׎)W_)Νr:}.:+URG\ځs RЬYjPj Vti|0u3-ڧb{A[̈́]IGb{_ph5܋ʙTX ԧHgsG1SۧqM׽{-V}رcɓ>}}-^"DbDigAj`~0NȀܝ|]2OFT`jIW2&ض{z{)iB:JinǒGY3^ս'eۦ۾yN{*)dԾ~ޖ}1\(2hz)GVY7`q&GCkP5vתa ȡ}[Eɓz ", hO:%AC`xMD%J!蒐 (fn>*HNSV41ANZpImKe7.Cb:bv:]꩎'wPEJi3R?qgF.P r(GVml,.֜\[c֧T! 'W֬ %+zţmr=lߞE[*Reu9+\n@0gR;ZP΢- w='{[ZM*Uc's<%H:wzDUM79o5kuZπ+nu h4PԩJ%'+5jTfT Z3/L?ͽH9Htd^7.1V*1X“{UfMC)HMՕjP_,3y iG_,X\ǍWu~{-1pO*40,Y^Ǽ)վrVӦ+E.w)gdi%J4M\r^yrdNl $_Nq}P(EeY+˓ɣfи?<{$ϹSk`OEt&x@sy[.j*uQv1>O1!wn^4cЗP/Y1ؽ[%jV}?ln9DRX~PKBn^%c0c=b0c6:S1vnV% {=}:DܿOҏDn5?5%sSut @6AF>B çўݖȾR%^C|~ZX `|CvV: =Aé+M`4e~{ d;-3< vWG 0L h$lwƗ_G[ĄP}7k2نP5>r/@,@TQ|Spˌ#C$~=ц V+ ĉDÆYǞU/`:3\2.Ij 6p ?Hq澹'˻vs6l=u6-1i2|x&5۸*/vmUI*YH)@39~O\xDFnd>$8~qlYod%?la_,7YcuO4RB, B'^ ē@#fW2&<# F?j}=p@߿dr^pششk} [&,;@Hml'٪eFmrՀqN6Rd\\W1Y-N>fDk[q~F/u߃[h.`!=C|m$%<}3zM6fH/M UB,ur^rru}\W&[GCduYj[GV%Yɩ*An-2,RDu(g.:JhPϭ`%N-)x}_nMg/.qcI蠕 p 7\tRII qJ=@zH^yŲ]ھ=y;]JJ;Z$շo x% + iݺJl3d6G=f @zi,VFv LL U\3ա#,U™fͥ˔{m+]uy?qʽ+}7e}IKZyYBd cl$ŽQ.♲J`vL(0{6Ud]4[M}] 2yt}UMIc!5l {ӪV&eJjܽ),=&7n*G] ]ad o,IIfcVWN&C2lnj Q,]DUH5B#v6a3tǡW;k_:^+#>)n~>N#Kѷ)e'xu?sWR;Y 5nH f1)9n V>ZJqR,e$R+`iAF3dn,1., iLfy{t(TY]39 G=wr( fkū0mZh װhQ``Ry=dUժI}f_|a=]>J-8nd1sֿs)vC"=[nKb~r*(>0&t]Vn;*gk:{**8/v52o oa Q:iS*oQk:|k*` 畂KQVh k FV,JnVޭ]G<;c`W43[j٩=ܳG 8+6&BUWLWfUm3zV%x]Q%ę |X¯\i輫#7{A,13WJNF)99R,ks}2{`a%aMu@ syԔi@7`"~ѳ؎ hj` NV =P%ӂ`eɗ?1VT{ B;CC 2x8;B>Rd4{7 7}`ʄ/OABo0cÛZ`d]l̖Mg.zXC!鿽!#x%mLD%K%:X-}X4RjNu|*+L99V9kk]wCGw. ')=ɎSćC_m>ENd^Ǯ01z?lv!܇ʕ3=MלF.yjE¬{V>|ͩ[ggSo̳?8#ݨY9r^"[\7?[u@I8 bSb/s=t@IDATѿB#QoY=Ffg}n!'FI;~I1S$Kik qߝwYpleKtFeY$ ~ݺY/lо4 X8*d{VڸZLw\H `hO OOdRpJ"6l1ѓw*$A 3tpxAO_g1֧tui'BEaxuN2˗= Cie>*C "T\sMX1MTݗ!.j;a)@/9Xߦp~}"P S!qvx8ֲ%Q^hq¤Ogf |![Լep&ߢsla?a&*Hui.I/DaR0 1,zS60IGq x5 ?ƺXZ= Yxdac D1!ĉ?Ht%(1q3kkPl=ؐeصCm[σ<`)@  $ɥ,!Jh$ nsB0\.AR)R㟞ifXwh *2/}Np̘;pf5M4ٷI~aƀ|~$Dc5m芜ˋcrmfiSl 6fZw–!Hǎb?:;3tpѸVnJѨQD/1!cD:-IH +>ˆ÷b^q~4ݡH4/+]Mv{D\ gK4 !o>+y |MVKb@&CP,n)ea]?$~| %aàI"PeoxkD $zCOTuٺu*nYGbScBfc|&V0sט2`|TfLv 9 D``e.?35ѯ@+7jlH bqBeо0ؽ5kݴr<A$vn҇}w%QgHpDC)L# Ę%* 06 .[ `AE` $s7}=ZhI9Tݳx B@$#/˓?=`ʷʋvR3ŒTm |'G:j Aq<$iDoh̘2yUc I/B3X8RS82\"i۶]ڶM7MZO>-72BT#M;`׀ѢXbW+aV늙 Vj򯺊bmx`%ODkYVk#Ga{m[0fω ˘; co^nX#I̡a- pf^m[X"a a0E$#CoEz f"^>* TBժYlK#< WcHpif8OV xh 5<ױZlV>=eY٪X%R $2XJw |m *Rm@T=r1w\M,jր@`"䷍,G0= / gf M+{YcuE~ؒ  uݙyKZy-]:kXMjxP! 5LƷfTj!_?_> ;yYԐ!J<}{n:>}ƙ-Ք)J]tRl*URj%KZ}ڵ3;vB0Dr͕ */C%u+;rmvERX bjXۃi-fɘ9lf"!bV05G;!iDv$}Pq^ uF)5E`v5֨&aj Ь٥,l:4 PH%ъ "Bx9kA}տTH74:$`o ]2y# DB 0 6&T 4!%!EAlL` }A(C #,Ill cK Ɓ9 ֙AGBURfzCMNʒ@vkI&LFR6Y0`3#KKgB} b4E d>LzQ%5 N_L)a.nKտNaBLKI?;>DZ Wh[1Y͛g,5Pgf["~D:w3@|VN 1ê0͌;k ^#߅ڛ`ԫW KR4] 2_fq_l-EHE(A|xA]; TϜP'઻u#K_.Sɑ+&ǚ X\Cv23' ufXɊU=XI7+B5#BƄs`$MSrbx_XO{a2{k> D}eD$O*`oRhJ-WY*p [g+d2+:Ao "er|EM*m5Bi`~Ԕie_18}Hs#`0#ǴYb p`KRہEl'UlT}];*&k2*T dÃ[R+lSD/qsa[gZ-C`G'$Aq3 kKBP#OX?{7<7ue_֒~<$GZmފ!dz\)Sg-OD/QU9/6xU`b0a؏?Nfgӷgý .0 A6:wF0֗]d׌NQz0"L3 DЙo>:^zP[@ szuƒGFm@_u3yI 2ya"zĎĠޝ"a(BRS=BEU~&ض>10;u 5#ln#[A@3MXi޼7.FHu05כ ?Hdo͑㏝T`NRLanb `|푸5ޟDƞT8/^'d\ے1"s>lX_d+UfRw*bua~68c~^OfكFfg!:r*I3s 1ϾpΘP+uAϺ9bh߾ iSK-`_՞IݙŐKof^w&qWc#5 |9U Ί{#IF܈W<#B,Jeft)K5ׄt<$B't@E:`Qu ׄNrvA DrK ]6#*\5"^Vr (T~\/SKTNJ^폃H!v&Wd~s.Z;`F2ѝM`Lp  ^-f1~,]VWad snfݽ&w.{&K)VmB(V\HswwR"sTr]X)u^ 2GWathCtJ{?^Lkf٨o'W'!! w &3; +3^:_ Mr5jTgţ+&==Un6w+up2; Iu~|r5lBㅴ3[Xv׽=vB[( tjs~,urQ?'YS{GʙTXIΒ{:P_zCMU3ZΡU*#1me RFyeτ_ 5։xA  :o`rgYuߦY&+CgL.PɁ\*g9Mo\!^r^rrU&FM뎻W}XyV4T9V_8E"><GD* UbV%0+y K7gAj8=ާNJԩe^P7ݤ28k GK#9S) g };uae^fuϘ/Q΋F8 *SZ#@֭Jy[^~#]zp<e1@*{iorWC~TryD9/s͌Fm}N~py`0 ](h7l" n1j)דxv+f#Ǖ S=3ujz<~qȇLs>MGWܼ:J5iBk.:~ՉtħVԊUs0azrUEuROTWA{t' >?YB. p2Ү&Ja^qWV#390NkFnsrK&s2k8=D$:2@yNrVKql\u/#ۘ}`óm4 Ӗq\w Xڏh31-JoSHm~Lj侹blx,~E-&:[ 5N[o%CK| 5?@j< s*q)%{֛!"ahGX.DÍ&y/.`o?t0شlG69g#uWvYԑZHڳQWAm uyiO]{TN:RsZ:e52xсso߂e+$OxW_Y.J')*{l:K>%*_̳$UlKAFriSl&*ӖL}/-OGQUQy&:Ѡ65Ǎ'#U^X:׶3"`jK?( Avm\*cԒlr:g.T6M.Q@7܇1W+ݗЩ琚5[ rwskh.%_w{6ndN;XAgW7'#v׍94k% SMnMΰ딵 _ׁ}{heT'wz+VfߑQMdWmGrz`n4&"FҾcE7eg6`aS6&W;^^-aP^dtNFL%9zJjAB`~:CqnNxI(&flga[u;6>ciW!AwI-Fm'k >${.ĖjY9T)_̥6r &S?D͚Y`BN.](i}qjW~ڃx7tHǽHVͭu-"Iw"Z^p )}.]ݫ{ՀC# jR3?5/!=ylW_V|EAr2 `1~v~g5nH&ЁzӃ|x;nD9(8!FBpCAts#}H9L*՘!GSȚ&Mx f4ԪմntΔhs7iKvl=yTQz6z}փT)7e88`|.;wwJj_Z|g4}~Q8f\<ȿo_DR0n[ғxV1#^ldFv]v,-aZd}NE߇NXD/<bAW "-gi#Q0|Y=W5]RPm9a.25}&Muta-H0`"$%нcqqG6H ̓xkRsK`]GpO$ˌ1@Yoa RP,/޳HnӴxg7Z `I! a ~pSN{lMyrJZ)^ t Q@%FPײ}Ýtz <;xJK}5%e&ټ]tAuΕR*"DG3bskeeSkd,Xx]P ^T`탨O/_l<`_Kˉ%`Tw0z3e}JL!h#])lבUy H*>zw)? ~CgAc'*Q ΃m~j׮]@VY X D \#]VgOk&'ߔ;mzڷ/^ W+X1<^oQj. ]'QHpJOZP:V-;wXg?PSB\C >WRC7_zIXgQ #&'OU'7#R M?I q*|yٹOy9lM+95-6))(˷ߊ j }j31LN4"`k Ua 4MFi8E3S2?uaWU*k$+B wFzЇZ Mt͓?yQ{sl 6$O$>ڭüu yt9a-Jە"_ΰQ-)ߗC ǡ"eEFpMb^å]K_h[ܭ@Cv$ N+#R(j~$o$\~\QHtKNܿhaCr^:bJ@uLW2Kef+1zYXK%H-Ɖ0X$*I_Ѯ[տj(?+9 /&m}Bf2APP T>}৲t%|駈'Tߵ~] WڔMs8>*ԁꙁ^uk=l駧ٲE nҤQvmvLVGx-Ǝ\ T{(J͙,yإ,ZT}@ad{,n#hoDeK-n >Uzbu=6铤/=9ċO7OI ;V6UTg4/M.qx+±`x 5Ws87_$J~q>J&I SJJe+YFc]y#ډJp2]u6QR~<w:8+s]Q "U޼yC}fX-ApѠͫN_Sfk %+܏~͊: Dcby"##2LwN,.y5…` g4Ȉu5B3@_|- ZwT x'$w ה`@ V`j:}uN!{+Wԥp')5JEQEQ'TJw1hZJ-^la7kWOA\\x>x9¨*eFFb&<9g> vx vW$b@cS!9&EKDrMݶM1mF42U& @rU% -a"cOGeiRmG})Eei+jZD,BpvTИ;)b@`ib;IQ m@=7+U5i:n{Zypߠ(xnYXG+gT 6 ? NbIQ ܑj T-vd?cر`qC.%"X?6=@p$oQc\CnϯmtΣnsRMqDWJF%8tJ\ 31}V~wYii„ӈCIan+ ,ffR$$_DT 2aT^PAW ^fΜ|-{ =Ji:܋xDH+KIߍ $ꪮJA>Wax֮" Ra"'Q2Mᄆ3RH4ȉޞX8~A z[oTh°n969m5 aPA?h,ɓ1 &[ &¶mZk5ߌ``!.9D>ImZȨR uo .܍D%ͺBۖ"BԱlRL2 ݐр*<K{q7+`[LZ&=3HŮ۶ PGvH\@mvFo–&]sȺx!Λ=7Cz_H7rv(piY0͙}'IqxqxH y^}o}d"2W'"u-H[& 4ۦSLr~d3P$EbDS>-1HF6*f5fď?3-4v`nUKR7Y˙ٍ"qqU5:IV̞ HNhYFZ>4ܹb}c߯G%*MVp*vL ǐ!jtR.y!T<^tvQ纄aBIAU8ʾF0i)"0Jb^݀fـ9+?+3NXK4sD߷^h#\y4Es&'0Oѐ/BG;PC WV҇"|;rȕŊUOR@ n|I7.i3˥Y }vHj!V&vOPoAݑO ^O>q(N]4NoD.n E2c^G&aLhX^R|Nn937V ro{׾m@%VPrL((nd]5i&>e =j#]0[qo ̘jj̘1:W^Q} 7G%x})T,R\ͅ߅Kwl*yGeW6 ʠ=g( c^8TT¥ /'NGm>asooK7Г''no`NPb̙Qia 7,u*an?khteH3gx&v. q`rR"{.Ymy =S曕ڿ_)'0/F Ja{ֻ> bG%$G]תD%$6Ǐ'T*i|? {d;)x=(Ѱj$W7G7Z<6:1[ezobo"E%{0Ļ_y߆tb=W"ƨʓ8].~ޡ)mU,e*(N\Z_ ]ca^A%vOXTyxشS2٦9 (hs+ _z%̊I;BdȌ5Լ-(?.=)6nn[^[nYR).;Ww2t f0-h7Wjb Quy+V#UM5:xo.#F'9VPI:ͪ#ԙě5teresjta4YY֮8&}բ1z>+*2hɟSIF)奵?(i-]˄Z  J_$?zKJq٣+㩧]<+XrD K HMDz$_ K_1H6sEjX*- JgEZ7G>1R[f1MWNQ(k*MZPi$o|7R S͟QR澝Q6֔Sw#TV8'gobꕡ}޶,.ƘtYtoEm/C7)㽭ۛ=/Ƣ8sU 7ꬨ6ݽn=L{բgM%fFW2ݫ39mcV/0fb\P͛1[-{6YZ(:0E% +=j|V[zbKOrVLк~}mt:߱N\DNh M?wzOk+ʓ::U& UGd"igC=}2ޘ5v1%: EPyNeϮ47Ҙe·VZ/dcװu'Ԋinݥe*߂BST6aTyܡ<7۝7WOJq̳ "ګ3nܤvo;jJ/#>o1J)WQy%+㫝>[ O`\K~p^+WY}zzbgWc1oC{Q3f0r2d2Hd{۶mu#Qw} x'SE1Y_?ap>p nPϮԇua_(O= q1nqw؊zO@ 9ƖRs3"?:jFbo~&A !3+z+MLs-Z;51r~vϲO<`AgijWrj#uEjYNjRCp#p3V{noWx y Q?K)=)ʓ&lmԲe^[n€JL}I&$[FZ-`aQFS ^b?_&!{}SͺmŀO*9&tm_yzSq0蚇cݱ'Q'䩊)9'}_,Be^}TF}XtX&pV ,"be==lT9z:D^4g(Uw SnVX6߹Yp1G!w |`du%CR!$rlG9p}0 2rH͋@HIz cd1" I +'0"90dΧ3e@"ʘ|G}JԄM+Η. i7Kw7?^gwUǥYukgtjUvGqի# a|W:@r\nݽqpZDHqq6r &ϝ $aaɗ4O `- }G]gn/iyfZ9KR}qdfxAW)p 8z%n9M w'"$%K ٮT-w-^{!G|{8!^Y 'NIAszPK4. ?#Y"ufVl2S ^oHuNR+샸Q-E>r d_Fм:wH 6x`MmFQtz樎Bv L?,A‹D$ #bTh@X_ b`6)\PJ `a9(VM0 P9~NM^AC;HI;Uxv(mY2])=T䪽@IDAT,3n"nR%\Nƒ<'IyLSII,RKr>-OgI#l쯸qV_k;}8\HNA,\Xt=wy$5n ~ ڷT_1Wz_GL"̠,ξe܃lEAw<]\;Цݧrk5ߒz3}׈*urӛe+T~ i%Ӿ~)Pe\:TE0.9w._Q%[[7-w1S~>Ч."'e j-ΐ"YK~6-/ZNK)=zd %Y`.hPPYqξ&i#^e10A,.zt.VZ_]{$^9d!|ފ= ۶S"r%IDOI_!|Wi\ k*tJ⹽19'C ,1x0Nn0b ͋Aa9U΃km6/5yݵujATB"jJn-}t[\h3HTϞ *.s丐E,P!}Z7bySN.G 钓ii}rOYx&NӍ{@Uc{ L,4\Wޯ'OZV-hdU.=EB .LRA$_9'=|v1NJJ,45apOd5+8 ї{/8L1(zJHֳgO0l:lԨk{Q<_{Ĉ:۟:˅.ƀəB֟ln7v&4>i]ĪSڵ;jpVL=dYpO\Kǝm|.rgnǰaB}orl:+ˮ0LǾ?uJ*^,d!N~-iVPȲ]cS;u7lkNen]t Yù'zgUJpkc՟ۮf'oz2l4>R>i?^HpxFulRu*bb| e;>qTM˜DޏKoazJsgԑuթ%YeCN>9pQ@x]6/˸":STn l5ȑ})RT 系~ ԼyB;]tu9?\fxvYh^>A+-~5"AoC^3B=Nb_S2vO8Ný\~vO>U/Rr;#^YgiaYb߂R4U\)ulwUl)Cj?޳jT83AV߫'3{|+Hydw]Z`xeY7n٭Q:,p|vy'P)7wD5{Ov! jիߎ׭[q8y7Y{'j=7nQ&Oв,w")=BNpv㤠/^Yݻ>7.;% BOaFp;a$*)a Uu/Vx .O~іJ+>mW_F$Wn^اZJAI˅lYR@ا閾#A=Ɉ[:wٽGoZޯXݞ]I`lJ.{6(. ϝN [^^Ԩ$yPgI} :w=XmeK]zǿԞKaIt7n,﷛6ETz GUd[ *uq&FW/gcٖy!b"|V.ݰ}w!oAU>J.hHYD꿤͚ [lXɝ% >Ȫ_')K켫xl߅-1x+;RYSv=g*ϣ| ^/kȠL[0r]4~'@3cKIfP̥Kqgx6}MKl)VTm%#r풡|9XzZbyL2+^[~VCHK1vYe<5kvpOgܴ_FeR ,it %h݆-swיs60,#g׍7;_N˅ J9.b⭙]32H>)gNj۷9V b X]G]+UT kCx =ښj7 e,S:,,i꧆fJJf:rLr^MkI_.,$HԹGj|J&I.$3Q}Nn3 ƍkD _ S{ (lWF@f0ʭT6i!Xj~YtTzUI7pjJI%Eفm6,(y;yUo Ũb}=q |-۵ջWH1Э6Eẑ?0.`_ JjHZܿ`r oξFx7f)Gy ײe$O% 9HaIq <[@=.1^˚E[e ڢ뾣xϖxRϝ//Cؒ;_FJ8>SrMJ}|kBi6-(z 4Zi hQs/pW0[##.:@F/'C/5"v[UDs>jw>ŝA!sl1QkƂEoV "ew{4|8ddʡ.ҪCWMn.]e5Z rh@ ^X l +7^c j^Q.eBOg0Q/f:kN[Vλ+wPK]mT"J-mu\u4UAu^ҩK)zFۀ(al8SR=DWBEuIմ3w.D- $b #R}u;L_mL2Jē9>sn:]0Κ6)d7ё/Lm'󔯤d}ڨEh.?'xoWp]mc-[{Lcao\C9F%ZC38*:wV z-e̚Bs Au낯Bj #TuTr'J8*k!W AHiE*ٕgZG`DJX:;n| [g ~ࣷ8vL`A<ύ-OVȠg={|'%"+0 d2D6auP4&ܨ,O5A̳:4]dti׭JAbIF""U#߼:e5*G'O^Ds@q7?)7`ǹ<2fx۹| aC­`ŀ^)w{Ttaws.0Lp0h&$CHĀ|ʑc#J:.5xu=@3DO>:z_O<:S1X񞿩&L@<"ЩLz@Iy^\Q&_Bm8‚sb֓O1eaxO<534P!H դ ~} PEw"y' ><:29Rp_T 2BG_ܟlj* b!Y>~yjvoٶk9qWJWW.1%F/^y}~%_b2lyO>dGK߭4LCX5y$Im>O!qf@ 1+.U# Lf (k:!&@D/fP;ǎ!>+cNigBѻԫ> ,@JZi0G^s6\Dږ,#? xԧ3 XB&$(icVOfj`LT&P],\O>>:JY! UfԘ Hph}QyNHj1Q/n> 7Ty1uS$З/E}Ssa'^I_rk}}ʨ獧mk)FΣA) U p.6'mHJ2x $)3V~R8l|&n~ Yi~e`r @)>4R(zJ2uENz]><_"B<$KU^)/_^(3搇Å &ɻC>yooFPS;Fc͒V5ɲ?_Jl| bPҲh{vn؃&+INt; *$K! OI(~+woRkPe)]Ais?Z!L;˶&\7ÿb6A;q p V6ǎJ_ߦ |̜6S\4th?ϊ } m:y!#Μ:: uhF:PY>^"cj'! °S[IִYU8Ʌ˥A-*;@*\}~nU>zJL}ima*n$^#9!wK\o6[R:<d&y}BF,ᚑ_ɫw6bPx<,hm˾ZsTے":ثݧCKqI"բpOi?[(th[_.oo(>`6=|2PnثwXok֬jw .(>,xu} (dew̤_&ߎjDOJۨ*=Z(xBk! x˭@ScrJ \W4SxRDŽTnp <+?G]L& {|{wSRYJ`fNjB\kdK ޡ/79| N=,_' Q(' `YS4-Y\+ʕ`i61Е_QX-Yd,Y6c9}ڞ5!fs`8(olcKt$WBNi!FѣR%K=c}Ҭ]j.9JV%Zj֌J AR s7RtOPJO?%ᐽTLn ,_\ H3 &|+O;KLj{; ϐǫ6[չSUUYڦRnE:o tj5w!*] kR.b>r+r4@$9!uq8/O޷(X{&W5#d8(@;9wQS:7bX=a,u^y5wnX^_K @Iæ7[z ܣp@B0&K꧟%ڿiL_ꊾm`ŪOg >X(ŀ]1blq%kZ8IhT~ nv*QBW=%v?׃ذ'ťW$Hjf i!_Mb@V u ]7`6דoc@HnSL+Pz"u /Q>P0(u䈵>b eSti o`+ W$WB`FbH4_(Ir@<) ,Vo[pcRʣ\T ھL{V `{q]ny3Љ&2#PG?-qM`.Isx6hbCХqMpk}Xb> Bl TLOf[ RȊw/H n /Xxc ,w-~(X۾,[fa4@"CГ#o?:}\Wo]wI"ԀoVw4&&|e闋䑉]T)hS{?b#5T$:W+$?J`*0H5`5{/I!5Sc*'4ۤxRe#"-g"oW˻ߑJJ य़0IE^^>F6(UKTIH))$@ĎMɶȷr" أpE8*.лLRK; |1S^5e+DgexڔeT`9w+@,PH:cMZY`7sI)UH31vFO`" @}~60`%~-~v'e>4؏fp:|F8 T%N)-mX ˯&bỉ=Rbv XwkǥZHً˧Owyɢ+'JYVX 8O6 ڿZ<~s?w9[B^`4np2̨PEdcqӧeUT1}\<aR\LqTjϟ?{[ڻ'@I1DPqf !o,19mْiŮb6AslQ@'+}\JMP(>X$.~(mҞhac )2=* -TJIر=M|G&Lpat\` ӔsܳY-'{gn\u221(W#BS$1`$x7bHX%1+"eqNN3,y ea|\=}D/\B#7m܄ אl-3dJRէ^-XH_$Mj\idQ}$,F*!CF,ԕetTRcJS^ԡEoAS}'i2Dȸfl3]耟vi@,]d):|Th}F\6S-hi4*Xi5t8(ТleoV]x/1 pϗ.#!ӕå֑!]3A&P)-4w^h0^“r$÷|Zx'R>YfHu/ tL!>o; g#C%m7V-Vw ɋ#Ku,dDdkF񏙘5m1H1a1#x/1:#OV3>|\X>Ol'pBzfͬ"F.yih,[vo, e ;^͕IDZP$"d]o$|!=nu|$Q.%$sE"4W$ qJTJ{ `wV"̓qU]NyDʐ&4R𖴸CF&O|Ѽ%/=$¹W/i{cVٍt̑P G3TU%~NɌ^{" eUHZFTx'رn]kZ(]~ :1R[V=vn9\$< H<uED.H+T/hb[)@lBRp5b$ 1rwbIH2p&VJn`uq┑ǥE$$`KiP>Qc@N{UiycNq?Br-6O? 7TL÷Hc# s3qGv|UݣM5Pmvxm[>.!Wr$FEuz>ǍEP}\ʚ[]4$^Qgۈѝe#a|Sf["gƂO1_jL^C>k Pҡ5*XQ5휀;*S>zݿ&c"!?/l'8o?2PLhD!60t]jY @LAo'}Ƅ?آIFbKbMkiO4e1`(J$3- 11JFZ"l9E?OݡB @;#H7X aU&F, uE+|ϻဂO Wb51e#mfV]Ԇz;t⽩拑xo.-&kP^bd-Fo<|3#N<+E+?T} -|s"u2o)n0g- 9cZvyo '5",,VH!h^?!ϭPUDj I)G {>" t<:Z8,^,2dHRFVR@~F Rj^7X1=  o]8ƿi@@MTK(#'XZކIEǚ&yO3q??T\o-z󙡘I>k?Hܼq`uq$ YZO=tⲸ@9{<16%ǟ:ټx"!KK&pƛSgzutrRlq 뾣iqM\)J '7PjneHT3tCƌүjzJ)Y3d?iF'!z$ߢooԷC+.dzb4m)|;Ha=$<%~GQEļ:^fU]pζ|uBYu"[tW_ǻ%;hzhU7ЌŊK.Ia`srs 8~!{ wrlFy{Llc14Y1d,+'ZANQWzxU|ͺddi9x49/ގ[֩#bk7 - lnvu邫ߤfS3;Eh`C1Kj`5j> _7*qҵX"(VS.I,)r!ⵚJѠ1<^-^X֙΀)ɴ2ye,oʾ(˷"%s]ڴ,,bg.^q$[JsX$ROqu@: XeUrA685lP +p*ReqIFUzޔdnyt}HaWB@u盰q$^U.im|7Rv&[\{P6o(^#i!"EDdDstVojȯS 6'MefYȶM ?Y22kDB=8BTRIkcF j G ߽p񞢹1v}7CŁr8ِOk-@j:)@#2jQ4;،`* Uk#f *x{ ] '>ivg2@lBub_8͌' fʹ_&Gۧ} sٰC 昗͜qj֝/Dپ1 I@$}s8xL;?D&s`\Div>LR1:DR$l]b\  Q_mw(aj{r~m-oIW+Ma?yaٲX4"RSޚ^+&JNoI2*T?=YqHW,d϶d\"bK8w=2q .6ǭ=,3N a0 ߼ 3U&)Rǥe`*IʿV F,FNDmx\?ߥ uy<8jTax H'jY% +skL,Dnܞ| x9m]oZ h%9b@} S$  }KG:-B%@niIjDmL.KgFntG:?|pf"*IxZpW>>'Il ) PcDḆ.%J'(7│rn0A; x Ŷ@Զ{J⾌W0Bj7.@{7~* 䰔d0K b5yBP3ͽ܆oHcKnmIŇ!ԠP< RPWw?f_IyV*`&y}=a]O3c0R9`-85VvIZf;߭O:Kb"`51ś3db*Ifw=O1=k3&Z[97(mRY43!#ԱtI9S[`^F0S"*XɌ䧐Z%TXyc ,t+n~xő  ="jpS'L:9'E Kn}Zd!U9;j@{? fOvbgZDC5DOq*)Fbbd%FfbBr" #"-ӵbE "g$fqa$h^PIWizdL\uk[XIs)#7J-\)W>N4C}8$`uļ.*k>*Jqv#f~:QG0R~K:̗ f*1a$rծ!1!!Mj]շ|T<lܝS>h:׮(ޞI=ċk\Mea,d,p2bAWޜ7-K%2]E/Lu옿9 u [׵pQ @;)Cݳ=YoBNR~ '[ep !|HmoIF%(1濫/+dӈ͛?Jlhr%{ o!dN&*1WB#"IP.1j.$1_UVJt\Q I?|y3*ECFoTٖTNոwh<*z?}hٻ+svIW' N'R>OR'F̈́;ƹYs}JwPkgTBvJ5hW;'(TZ=X|\Sx[XmHŠD%8gb'F2gŒbrFϿM?xiTe,ZioNʓ&"չ5u"DǕJ65U]׺mW.g]̊!#y]W Fapi6nə_1j}& N2*3'2A(Y #{iU(U,fL˯1v?Z?n]$`"̙`BEfp +\,L6~=.~Κb01e|Rrv֙/b`Ήs`\̝q^[yRלyޮ"%S0b-Aoo1rp0U5>[uTTxs7 h\Q?'g'$8{v\;n* &4u3JRqfG Vel+ZYdK4 ~}rCS`2s?JK* R)jʟ±0X1>=D*O 2:z?US ;j)|cфv`!QH?m DvY<κd!>eSRz`n¹{=K0\Y(ŀԾuq17idR{4e#&PI1`yƷwrA??bzذqT߬ΧFI[[ Iυ6.+bE3  Os˖Vh>bg(zv :^FTNL| [{W\D&M4FIH' Vt̙Y*V!b@IDATbe9΃ƒJ$c:QN1H>:ukyQD˨(PҪሷ$dd8զ(Eƺ 0b+tpa d"_?T`ڞu@j.ߝ 6nr &U}0c{6i!rv1YNxAf4|#2b,ߟ\+x>9i&FvVD> J [=prVVh! Q䉑~լ\?0"EnfQ$ʚ⃖.&wsc` s0DUo.@2 ʕkTD #Ori:١L+6|c%x/#3Yi$Fs˳Jl\:$@Ѥ 8+`FP,ko:2un+#$Td;rkr"S,=+vK)yҺj"7ɷ6b@HJZDYB.i N%|)  T>GPɽjA3ެټyčfxP}Y̥ok࠾B!;,dCB=\|$6Õ_M+V̉1 ljFBTn -:śLK 1$R+}pԇ2?o. CAO[|E M÷p· vlElYٗ.m0l&iOnm8Ѯ!qߚrGs(1ی_ȰaV,?KbHlٙڿ粩R[ :LW|wܐw!2 MQɮ!^h_uhD$8#b{ ȭEᵦ%c,>Z!jrQļw|a hM$KsQk;0'IvMAQ@yb/VTbW_+`CEPQE, b4EA)R$;;;I6el29ϳ̝;f2sSN'qXɴ87{~e}ϜU t!/Û&/6Aᷰf-ظ8.@=0\>*O}wC7]|?$ J|p{isq^0{v}$JDŽQ\Hţ;Lӥ*j6pM{}: y,%ĉR?a{ƙ3^7wTkXkr];]0eJ}R87H0Ax?Ԯ%K҆;T`d2w@Q*P@/ɨ_/PjȲ괣PMhI?Sb|X詪PU`߃ Zn:1_zƬ<}4v _[c7>:ŮJ ɓM vx F4 ۡb\%[y#/a*5>,wEE´Jy7>~:q+WYomGgb֬YR~޼y:AZ*~k,@[r"QS,g㕪^ kr$kxK1:59M-te=kU?Xo;(n}Y鹀0~cw%^~#.򏕕P(KX_ hLG=P +nm͊B`񒐶Yq(jX+{jONU7 (y۹ªuԗƩ<ǎFhV. RBPtIg *u 3h, cφ"zuzA)|Y+M_A Wev1 ؎!_TqO]Ľ5wUJ-].%7Z_^!z"}`RR>W:ue`cx`B !Q,|jߚ;չ~c5+PlV`[uA7X(5,ڤ?ƥdbAf|H7ҮJV 𝕞?y%%JJĈN:Q,8'moϫe+GxĴ1몲IbP_||:O΄K% uh+\SAyFe20w.5@&5־H匹q{G0)hJEL09R$7.]l.wXmVq}7 ;H>HS^QGVfY8G05a($sԤIn9U-<Ɓ{ hjꫥK$ 3OeRy4Z[Qb+~=.]VA`Ƒ\G(lHb'll`ڮے4'q*l e$nᾓmojl$aѵKnϚUY2&ٗ k|W^`OmKղ}*!As/c$,ɝް9T[AFGHr)mq'̴'?2r$}*O WBx㍪nݺ-jrb:lYQmC:sֻcgiGR hMJzK1Xbا0[wC58YX7NU1OAjQT`fuSSn=~D`c/jr1^=ڮR.88RMJ9j`̙Uϡs'`FJC+4ą =R}LP#x2:F†(yoȡ`XgtLJĉJլiNFVb`׀]E-G:iߣ)~jm/F%xS pBRce3sZjem5?:̭69K$cZ`S.w؊̞$sr,F.] dn%r D@tHTGyYA`"wxkN U3?f ջGߩ jsj~M/Z:w]9<]|=XAc"qdy*7Z Jhf0I[}9¿۶i ϕu<|\qckJl[6[KN+^ BZ T%~Xi^7Fn՜g= ^LI1XT6%*bk(ۊE#𰀜xii.""A*,AL39I^'>Ϊ`m"HT?e0[=ǼsK ;gA[V=m;Yku{imCiÑ=l5v|ly05#Ł)Î1vAװ MkAscpxLeS`SCe,F7Elm4[X (9aG$ [8u2NB5.|Pd!gÑ u'mT\v[KǑܹ_<̚l/{R3ԣN'΁G1Nס*}zҼW~,Z~砦TuK*z~W֭ӳ:)ҙ|{v*/KH5mG-&@;nAgSgR;V\ȑ0Rۜ'"T7clCp{27^b/]/k/Wv[0Spc9/ڝ빜q;g0-gB!ιk~O(S&Ƃ ?k'JJ)yͿ_x^GRo/|gոF2~\@H ;<.pԴ'w|}]9.D?U(߮=-TPQ1414Fs;л]Q^Oyw}QJY}X*U*[eI X۾^!D>H9?}, |pͿ>q.?J40rἆlϗ<^x!؈1 49 (>eZ7du'Upo>frB]T颡T):eW(yyxn]qvİLɻO. fT,x@npdQ \C}^DC}{+¬ɕ|GuU<7Xl_< g:D[ΆZ1~>9MfܸqlRCcDjVEI$LY:q<:#:u8Q!%_zEU}}ai)1H R&Rؐ~azxhm0[E+FG9>6ߑT0}XɃba9)+4GM~KfKFY>_|oyhwF,J~yuAa'#1Rn& Ko1jRߥIx|;+qN4l!ny,1kb I!oHQ23sϕN-9A<=rhE*t}n/<}\4.T¢ 5/I+<(y~BO=;wPc:lg3Y߼^=S\7Xk7 c:8[ _N Ny*ފI2i,cƘX=N:ܶˈ cJVoNԺu"lM*=bдvnu_ 6&| |ր8([Ը?kȃ]RE\WUCD[×ے…ԪOQjUx Bk걏XZY%i1xU&Mvˡ%[f#-gA5TQ[i/F֝r](vDγKEop#sb ?|YEwzhEzpFhꊊ 9 pvיe\mx%z:L1QU jn\}}uô`SuD\397NevMLQnv൬G߹{`F?^+u o,#~es7ppYN좊ZAW>bC Qq;~>,-vYႇ|N1Ng)Yust` 'mc)R pp0o مps(T>~u֩>ZFjS((P lI N( bqb 8#uU6xYLU )?EP ڇcz*rm+z{XS svW[$o:U"AȆ֛R` ߬xr<{\6dHX3!"[qŀGgD$U 7o?0 D9bYUi/U7; K͛/ F%SNQnW)#0a)[ϡ%̈L#ˈ(.~eBVt ڋ5| ɓA" _t܄.'|X XxLXT P y͖:+ʫFuT;Uģ{߰Z?pY׊=r<<.6l=1]'mߺovvIbaR 6ul-O1uU6'(e–NeQ lP T+, 8?-*G <׷OHs L&['`z\eIy Ev3zJ9}Ӿ!%W*^DA $ώv6/<]J}mhhS;C4ABb.Pl޼88+cs͕iLD[8dHM6=|[`Pj~tXlt5 F#I/+ 4*aTA>K~WMF}4("QSx [*pno Ʋ'6n)( B _jmƍ9<3W4h孖wGk(Y<0)bOVŃ_L^qv8G<'w%:L@CUv4'l >Ȣl!g8ZԆ?GABC/g4W}*`4jDF>)زc$S>IZ~IG)@,[8C~E19CGn,%>KS)+ֳիB5i\t%AڷBô-,NDA\6p(|mXT_Ӱn-Ë:sL'Y )Vm1@ٵ{Ӟ3 67JrCwla,O( W [d*uoHWj2:wV y,]jlmv{!,񠰷yTsD$ w n FiK\q}XE)0C-I`WP|q>8YA6׵k8K 7\MdMVj?%r_P#A=bni[[%~)ϿXo0pw ta GM-8kkm724=b`hMx>Dt*+x9K~<u H<-DzThR`9s45S)P ӒXk*VKs̬vNPn,(NdJ7 TJĐ`'哩nUG1,Y*uծu;?-B$ e6$^R2b`qHg(1m kUZj4eLL6:m@AǍ&|Y}>,zpXFG6t^(eV@ǟⵉTqE0FʲV:I;+ &CZ$M#8^{j,xcG mԉ4>0 #HxN@.׹s^kdmf}!;cxthT+Ls ,O9Ŵ@F\z)\ɠJ{ϔ읜o"I+O7 Gi3P^Y'M IDLJv_o#e*a÷TI/`),o{ﭶuտj7l`jchBǰ̝kݩ `*6haP "om EX+gV-H>bxs{V#O:\S^jD _#^E`%-K0 kȴ尶&s X˘A,}C2lʈ_SQ ڟU&zMR ޯk[3 ;/|K2𠸱"gOT.|a;TǧӡS>5m /̧VNJ;0c^fW 0pW(NH)7S/T>b%+\1ȔGTVp (R =vQ bI޶\Q lإyi1!HC*S=618yv9x`-NZ='K0k;:o 5kxwkox{q^`W0^pz*n4'Ndn y:\0dҩeСD\Kb&֛o6*ӻW2h&. ҥKiʔ):k<ڈڴiC8>V1p|f?cFU7/~fH M7Eo8  ̣9 իoH{檫̌|PdHkjoߎUɶL+ė)!=zl*c}/"rxe0H֜ avf~:qU3֍7-[ff<}i1@ >(8Z\^Qbh-5 C& ٤DkBNnVay!`*xG3M(BGRRtݱ93ki6ix3W^Y>_|\F!(^x`[Ȣ,rh0*3[7 'L0]Ɉ1 s$"w=D)˲Ml B-}$QʲGY1OݛColR`')l"_3*kFV0XxCRNK20JpCr d*eM4#GMeL-M!1go߾}zqgH- \y=1lۉ5k{8#CMD!  L\sbя [2<0/\^4& ;#0m\D! EMb 2ƒxc+GJqь!9~3gHY_=+! @&Z6>B@\!W1f{Txv"O8?~Y[k}\"IyCBkm c>, ! @2T |r`1>#8Œ7ߌƏ'Bxbn~@Tɘ1f^{|=4Lq3^"'I3>! \N b= ;͇o!w@N φ.]{:0:rzb)(0#MrY0*gSLR N.@b* &;d46o.) ?dݻ33J[~|Xz,B@ zDw!_2Ckv^@ʉ pD(q{1C 'zB! g_1LW0smKÌG* lc1Mf*߅B $BKʆ@~={ c:0@)}@>6YUc Q8mq8D|fb@9+.#Y! "Xde@Νv-B ~k@K7͟O2,S9ѣQZ:_v-}vo.bwG/@ >94^"bΒ>g!-̐^ И-F)E$ #+u#j$ڴLE}Uc_ Id~)B91p*K@5, e|9rcDEV `* #w>Ȥ'mB=D1pϹ*wK1$꫑A#l0=r |2%f^૯L/ BeJtK#!ӈL7dJB@7HbMο̦`7m8dړ!Q aU PrP^tG ؂ИNx]""x+p@~M! (uV8 3<N8dV-u%HB]0zni7%V׈~؜b@),Vn%omڴXe>z!i1Xw!Cn`m<(S1wre3>}]:Æg>F`G۟|4@tH [ t.RJtI!@0KEm 7G{}ԋԋwz d0~x^6k7qy<mhYCGQjDGɓ-js*8c㦛jp[2lnI*:2+h*/QpVv^̣RDpv’Kjs~ez3EMŵ*>vqΩ[R/8H}3 ιǜLbFB>쳈vs7?r)e'_pr*UFz* XV%^WԦmb?hs*,a<0T›~o/_35XP|`М9c+dݻOitԐ26h7Yy np]7l)bw(0frq?Wjqh˔aV^M3f CCrObl7~,M?zjV㰎Pv"̄9 ({n"xu`Y ]ۑH}; JAC6:*,D8\1j5M?>y:NUd   Kd~|NӉ Ͱ2L@#x&0k[׾3YgţGJ! \I A#F3h Wq[S)KuIgIRHFaUF]{o1TwZw,4j(v+JcǎuGB@{\7{3uԊ_ש"_zދ.D2Uk !c-|S`ThM58RklC' ӧ%! %VŠsΥ<B'K u%mPR{XQwos?!v o{'dtHaW~!Dlt B1z"z>Oˇ5!r0|y.LIB@l!l~M<&kmkGҜ 2 Rθ*\l>=C /Ї,osя?@Lj?XD3N6t`뮡HёQ9tIB Q rfϳOq١M2vy3/LF89'd_U*i7E{nQg{8`'D7P2*W> TbP|TB@x(+E338{PBFϥbzP`?$Rxh[bS*0oK㏳6=(vQz%e/':"  ]hm)S{ iYK@=;O;0rMGOg/%5;᠌HGDwߍ bx y .ج!ϏZlpH`}'`_wbB@22asN>EjxدB1hyXν:̙fvCj\iZ# 6!D<3$ZS!ǭ xv08QFnf:!,]`U\B ! G@F wΒbD@"[N:P`:~Xƫʣ7߬9<"+(pf*d((cxa+AtDom~zDd[쿥D#8>pVHnJAH %[ȑDxzK.Y7nk]| C&b $DNDÉ%{7! @v ;c^'"yA Om[0nښ k7է o1hzAW_NԣGȡA}=D;DF"LTO6|-B b'\mL5{l9i%!~c>wLkR͂thݍ4k:ڲb!ѦuTߍ3鐼_tN20 2ZTZ";)t !B D1H% ;0rm@I@D%;[>X_Vy?ԧ/_Bx^Zhr\3!nPye#&NBWKRdz}B@D b(1W O~e+n=o?9qxE6%g_CT؎!D`PyQD{81z?t, ! x%d G2\{!A *;u"N0)pr:"TX K`*AD!D13<H)vJ̲yB֚.!ٸ GB Gb#'ZYeP9hB7M~}"w\IyDmD9JhтVs:%(9YI@<),  p @DG! r(pq RD! xT ! B" EB>B@1k@6ׯ}nhQKGHQ ]*B # M1زe ͞=֯_`QB@! r@Zӧ5\CWƍB@! 2@+#}饗aÆј1cFDLf͚^{Qƍ#B@$0Kr\Ν;z?O:իm۶{ԫWಓ/>J*d]2̞={r'WXXT餉˸3~TR%z+qmnݻwS^^绦ٸpo3b : n6lH#Fpհ[.iB@HbШQ#4hPHNjѢ]uU!eA! H/ [l͟?^uرc!_EL`ݺuԥKz7"B@$HAx;;0;wnjYB ͛7~(5c7$H@$BA! 0Tj9B@' A#iB@ # A ! |n|HB  ̙3#ȼI*2bUS:J! RI@TҕB@(.;a\! $ A*JB@! \F@0inn@iӦڵksZ # A Xb]}OS!( I! B@\9O! bB@!+D1ȕ3-B@!( I!nxԱct7E/@\ Y~{A)S$$rvNh2bѧG'Bb bPhB@! 2(}zqB@! *([&B bѧG'L˗/MҘ1cB D1H)^\$ݻiϞ=yT(!  Y-B  bg],B Q B@! r(x֥Ϯ#PR%zTV-׵],HHdw/imhٲ%9GϿt[T$1Hr,! N@ ?AoiqFӾ8C9E]B1(]tl5kj| JA5(Fcsu7cv(&`ΝTJ}MGv2q۩jժ "szƵuD8g-gA)BD1pɓ ! H6Q MTB@!b)6R+Wdh֬5 *! @D0>\CjN> K.Dr%e B@F *s֭GH}0,RB@D1%Wnh!pR. R6Z/+:TvPz%@L9ڱf 'w!_?=qÚ/ XhoߞNcǎM`O)*H(FӦ} ?P! r _%[?/J茪Hq3Miq)'B\Жj+ӯ/Pi}(?XOGQH=?]帼B@!J\M#W)˱WCI-g|ЙUkoR7;&j8Uz1§]߬!@ݺu@[j^ !1R1P@~$_5SP8\.PQ8 ']'u9s0.= ڹO797FB8;\ڋIԺ)zYy1]t8:Eǁ3"3O19] e/8ϟO NJτJعgmwo'uHsuT Rw.mՒN$#!zѴ G<q^?Ws)RW稶d4ryydp]lj|>2Uqq8ԡ@3I>._z 86z+9"B@! *G 0oSqcA&Rт/HYцd釋Q#'h ︋Ca(2b tѥ3QjDKZ~7 +w`(;K! $~;})x-`5~@%?\RžVWԍuAf+d4Q|cB7Cicc-Ul[B@! *8 HլA  ٕ5Chؐkz=kzʕ<,).E#=O'<Q_r,,B@d:O%8 l # LDj )Sxwhj>hv^7՟̲%l٢=P+PuS!pDB}(#|m۶4qi([jd7! @\9`p0.uoc<2Z238 2R1Anpŗo}(Ӈ.HH֕hv)pV:# ϔz`3ԕ ~!ի}(+m۶ƍ_~)kB]sGShf/y ""~gPn͟8 @O l-Аkٮ֭#{o26ܛu19^zomnwQv\Di թS'z5Y&{2çTe{+77qJ|ON?XD9 \@,Ng(Us  >:蠈ݻwk /O?SO=uT<;cǎ%"O(}fmڴIg]q~A_#Ok%+vԎBpq_1w.$0m4=z4 80b|$x؜+ݠBa}肯#ty)UMVF'6lؠN;4ţ\!;$rBv 'Q35iҤ~%1EEE[nQײ*((XqgYiqvz=gy=R-ʯ-5C?(qZJ[IC+$@_~!H\U+kd q"?#d_!d'Yp; %)M< 1hVGw^Yr)yl+3"Y (3ErJ-n`1{9;Hp5"[𶲣Yh|p{F:|\24bĈd)&p;3"NX;&r>}3JCW`Vs;ŃhiL63fssoV0Afh„ Իw@FC8 (_4X%;Ӊ+ēHy҉Xȶ^Ϯ1*ޤ~ӌxo_%!ׯ__ J1ںu+mٲ%@N]qƄl+ȑ/a,F[,t:=VJ)gƚ:Taz#"#|$YS"׳+ )>gqCN:$9s& 5櫯m?7|g;7w}9y۶mtuaZ:u `siÍC;buATI;X!V$3JaO#3FO%`eGEr8; )7Bu&E\wqr!:uLu4Ψ |8O[|͎.oUv30% su>J{JluH ۂh6ԑepp7c 2!`:s۱yUGos0 nR#Υ:]9 }B@!W$A)+B@8' sVRR! @ OtP! s8g%%B@d=WF>"ޅhaÆj;Ѵi|AHkk@V8.iZxb/=z06|n/ +HG8N/Rڟ'|BvJBy䑄+/B WBd{ o;Nw }vB\#,|Եk2wnL MOn$ .E9~sVH;w.!bYyLm?=7D B@99'~:G~VuRWZċB X)@馛TK5٧^qme](_X)PQ4n5Qq^`nPD!-4)v9ܭo.)\hã+ĩW8HI8Q"muB AeIV L'|x#9rn*z6,\~S:_NH׌ц+RG:ujg[鬳 FDdlҤ!X!-o{1/?C԰x;x0"aS1;w8#muB bWߵ0<${9?2."B>nݺ_|A~z({:D*v4]=@y7uA,>@.\Hf@ZuBa0e\j Ժtogy$.$A~hTSLY & Ƈ9}n&5X~}p<~m $BR $̙3Oȡ `ީ(';vmLVYb`99FG>`o'sܸq:NM6Me!ɍ O'JD2bPB W9# Y@!%Hl [~.]T<\-m믿ƃ2[e/(ݻyW?^{Mc zRL'O&1݂OdCd(JCDP%!lhG 4HNVB+xGXY"렘`t^ xۑnݚ CXS1|.X|IB"B@ , W믿^<;N9kQbkxCviӆ~&(֭ӣ_0}(2vFXPuHm۶Ȳy% 2 0sLb `DsVZ7yZXx0$hiСwMPD(M@"f"kp@C@ڵk<#%X!l "M`;"$kN`L)J%8>Fz)իZ>(& \ B@7CV2UT; ګ2"B@& Ai&F0HV زeK74Y(*(\(< QNBf! " 2Y+B ' WBNvB@D1E ! IiN ! L@\dB@$ ANvB@ܽB 鳕dIENDB`factoextra/tools/README-pca-eigenvalue-1.png0000644000176200001440000007521313572034642020254 0ustar liggesusersPNG  IHDRP + iCCPICC Profile8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o@IDATxEӇ 88r9DA0 PD"0k|9(̢ 䜔̞=[F% .ŋKRwޒ+w-_}UrE@I)&L ruץ~rΝ;Kw+V/{Iw-[&%A Κ5+ܹset]̐xɓYZzY9s?,ݻW7n\F}͛7`IPd@PRF=ofapTWqB YZo߾{=smС旲ysmڴiM嚣 [\?GX@V@@ҥÆ i#0wq… /(SL}n̐z=T?P-[kr)xzWPdF <2d8>fʘ1cqkP'N&MDgd}ꩧ܇fM6M>]-j֦X.ke%ُ8b~yozZ=8dɒK*R8駟ϹwU8BYqx̙r离"5N믿nNtf8ڭZjsԈBJ͚53 aϻBjժ"AYdK˗GicENCO -;?dx  ^ZjujvTƂ# }DE@s$cg"o y(9|O4ڶmk:{87p0cD8E#0?t8F FoX(cqԊ<饗;~c |L {*/墚tҝ9r9PTW|s(@ xΌX:j X:awq1wf`ǯT G5hu*icMֈs7a<1Yo :x`S^=|8Nh+c< cvpٺwnh"H3c -[68SW'RGYG 83 ` >&OP$E iN;t#6zw. ge CK"X4gfκ1Gp&F[""XF6gpτ 0.8N֩RJFc{1s;ܗt_PF;[RFD`(t]m۶ /A$j=mذaw8>Z&F^cDg,ZS;+OޥE@yB Ь`Y}VWE ?#tF"(lwEHS"(@PbһE@P|}ʆ"(@P5nE@P ' l("d `YKVE@ *|ʆ"(@P/^y IZ>ݭ #O~mDa"NJ'حBD9}œ ]'E9YĖɝemٲŤ/4|ڞJ/2!DN&zaf!TKP^E@P<#3Tz"(PP^E@P<#3Tz"(PP^E@P<#3Tz"(PP^E@P<#|`={v::v Rp3|O& 7`ʶ"(@"YK2vXc)g!Fz0L+ۊ"(I'ۥs&/g}r dÆ IZ}e[PE YdX\9Pѭ[7|L\CwdBVE@H.< 0X#&!_TZUz%SL;#j*"$=h{& t7O~ v-PE@50[Rƍeҥ˚5kL^UE@Pr302[nQ#3>SRMFlE@PEؕW^):uGjժexM>]+"('F²~|yX?LIPE@'OHHs ͙3'2E=("YO;4eԩfe"B>aJ"(@<lABJo`B_퓋.C'.E@PE^L#YfKM3 ,0-"l'Kd39xDlժL8`J|Gy̖-[_mԶ`SRE@ȈQG%m۶5& .4Y3gXPKwG[XmuYČ+VOEZ $9ؔE@P#Y}'&e &so+4h )W\{a*/jժ>=O=TX1xzȑFp~lO7xCر|RdI9"(@z<(zu:ۼ@_y?"z\?ͺkkyAa,BQF_^~es}?ٙ"(a< 0L6x`\ގ;+!CXWCԉ^xŸ́Ȗȭz1#2flY<;%E@PCxR!Č!Iy^ޓ5kȰa30͛ nQQ9z3+oc} 9sJ"(4v,0_jfntfe͛7?\jkXEFI֭]?Pk!,;ҢE c wߙ'e˖5k ģ̉ 3ڻ"(Ɇg֭[kP?_訓0d8731T^'0\Xjf w%[A˜1c-XyU>"w< 0Lm|Pl,88#Q~Ⱥ^|Ecca2>Jcǎl!IH,@^y&J{dNb{%%y)Q+m op@I)Z"/E@Pb'"oŤ34 ,qx X"*)3bvErGT-[fraBx#FMvb{On#/|Q_+̗JMj"(9D wVݻwuСCerGe("T\wuA5$,YDHhc}DPGXq'ٴxDJ"(F -fY9_J/ZȨaaDn"',4?37Ղ䎖X{nr;guBnWul)[eV7K kݵkh;QPԟ,l~#?FDa~.~J22(Q{Z֤!&ֈ(Z,D7.][!PAZ„XbNɭvd1SrtddFRdyٸprXҥbfFOFd~x.--ͬ}andSX3:>") S?}j|/\qB1%/^BJccO񇍠/av 0:P?aےڏ~6X 0S(E]Ϧa}jf4B7{O bɳU_:uٳgʕ+zr|ru5=;eÂ5^("xG c16n@د_?3#+_ Z{&dZl\0Yk"(#IoիW$u+Gۜ;sS=L.~ˣF{9LJʍ+"$iРA&<͈#pǨ*v[yRap,9E@P#Y1dm ,KT-EV3ֈ*>(@#YaaZX^ MYش/=Rpj"(@j)/s/t|ã5=yKz("< 0lĉam-r5*^P˱F5UM(@@ r%0Xgr`n)T$}z(" O3XƖ?hrr("D=oMe\aFLS6E _!I"9F\HٟS]&k#*ߊ"',("s4ib&A|}]֭9W^= gyF=؜s$%Z 1ֈ;$\+"-lU1ʄ*TJ_Dž 6j܀WTE?ی d9x 93<,/݄Ss浲ӱHTRE@?lw…Rre_?Ӆn? ~c:-3؈ n}"[QiРof5k.]Zڷo/͚5sߖoY+(G8Ej{QVTP Y0!=Na'+SE@&TlR׭[W}}TۄZv%/֋ǏKfg_ 4H?m|7Z[PB#7^u1y7n,ؘ1cL UVɽ+_~e$R<+V^KUJ>J&WE@P*āJ^d&%Kt'A[VdȐ!&eˌJ?6D>|<3٨@=JbURE@=< m۶ *hYa7۷O&Md'ܲ1Eڶmnv9ԊR]GYpS^MoEgc'JrJ_~O<Zw!>2o~|SHo''XRB!\d`&!SC>}x)2e=7n +=7DzF{%n&l~#?Wnٲo0 &l~#?͛5ьBX`TT)$`G1~`c!@pnD͛ð/B~GkdԨQtқM\rs1ShѢcv 8BBP>#2MeBtƨH˖-o&JL4t|t"ڱcs{/)I4OhXDz.|_6BrrePkmݺ[?|COc>ӧKǎMH2tP!GJb6m$ժU%8~qOd„ ryEe;L򩩩{1'ڂu !E~k?2J9/?A?d'!dՆm>pEP^~e3 y%*sʕ+=zqd9׼y 9#dȑ9`RgSPD UM2Ql[C%o-BOc$M7d<ZX$2'W]ulD]||2׻woy'OdTyWE  ,yxYgbhGS!rs.Cv*Bl2\ Y 9@yV@TsiMCaI@fEhrܤI#Q# rz"(*BVYD0hJ <`auOPFs()|X"3fl 6v 4#Zg})"n3Vu'N4>ua<&Bׯo,*Q#*)"O 5u3'lfb8^r-c={@^x|7"(@l$Fg=Fhڴi+G}`nԈ5#6zFP"I!"QL0IBƱcǚ2giF̋uRD# ܋/h"wYjcY<8T jDd÷"(@l4U۷7&w.u5 (ixlGM] jDr(ɇ@،3h֬^ژY)#dfJk6 zFPE [D`2!j|fY(̞Q#5jjE@ Qد)C;bG\Ns9fEʙo9ɸWvE@'Q>o\UXQN9FT 3KP*B&C~+3gΔ *QG.[rz|Ԉ_~,[{"(A"mڴs=d_&>N}1Fyy~zW^B@d OuUD8px≲j*믿doD>ln'&Vn݌1OTH+(@$v)ӧO'|R9 ;d Fr5"3 $ʥ"(>F+QjڴiBg&2DϞ=XbF TE kx6{䪫|P1+ꫯ䭷ޒzJ;ffhL,Fb0 tڼyI 멧*Ç|AIKK3RA>O "k,$ ^HS=A y0v5~?Tۏ?[$*45:̈h/BfzFJC1-8M|(Z8Ⓞ?-ZD 󏤦oxq۶mFV\9o{L+'Dh/䎂`V~!i * iҥK6SvQ|yd:NzUP,,YbrL[gyIrgBką NiUE@F_|`0`9#ͺ!W\qE^vլk,LE@PgF~zBo)M6f}&I>@(@,LO(S'|"'|mV~iOsi+5"q'OjQE >x`~4oܘ ĈxLJ<YՈyQ*"W< W_}U>#qDoԨQ\ /Z`=!/S(@n!Y|׈#䡇5k.k6`^.5ի姟~Ժ)"+x:&}ݍw:{0LtO?xa yPG5 'kUSE x]yҩS'ިVZ~ĞbY>(9l /ejkE@ -`=x2vX{JjDm0,>+"o$08 7BiΜ9ʟߏj]fMF{C)";< 0O;4曍`VK/dҫfIћ/aOi7>eSP1`FС,]Tt"}N:In| aΫ4 &LyaZ"(z&j|q`FI6cPP^LՈz{f,!< ?sǸCq?^=K$LwAE@3|ܻ_~reI֭n}j?< q>Ax0 g}&|<3G@M; ,FP/7~HS%E@P@X"袋lƍPUTdx72\.ԹG6w}@?s2mڴ eR[֫W/#X G^fxFO("o&H>qDYvm:2keÆ f7nVؿ^8BPR:uLe^gϖGyDS_f%J0Dž 6k F֭[\E@H$Q#q <بbM6ШQ.GvIrM7PuaO<šCʐ!CLx'ٟ/^soCƝ>}&ai֭3QBOS>ov3k׮̘1<,0;x `#+XipnH !yFW7]ŧ~o/OJ| #}_g`UeCeČ 79G#:TNvm Ϛ5+((B{ϴP!.Rxmy_J#3&::<l ^AbP2 H3f訣+Vr/^l,/gϯOa_n7$'; SY߰O߹,= 0 n @hL 0 5,h߾QI\t"9k-tF */¨11@}ؠAs;kc :`Y!1YgjL(@"(4<@Q1̝> HW'4$0܄@C}WYڧEm.ZyM> ]C_f3ø1HwUyJ7+̓*j)FC %Ft9!F^9y_%p2#RQG~_RE xZc} cԄ,곐ό "bi:MůeβZll߱ lX?aW*^۳Si^E@POzg# qFc=3PFJoeQEL$[9VG=_$K<86 +ޢ(ɅgFB" 4fe%̐Rx^P uU\HXBeR1I(@E!"8#M)w(X(EZ\L{}#O.Zm^+~p4~qD\KUE ȒKz%5&6vT)R|uٳ},1}̅R]2(@NdӗYG@BRbm#x:Tiv}R婲b2ӲOFЬIPE 9PDz}Qe9{dITeUP!,vXƭ ;ʑ=],,?|@}ޭ/RE/dIa6?bU~͚5mRGrեŅIe7≯M ZOE@ȟx6 aM|0"De8XJEPҨRZYӻeh*eDߦ(@<#bNj2&9Ε@ՖHp:vuMO3fE@P℀'F DRГҝвJ*r7رcĮ&%ԗufceߗADijWE 'x`7!/{CiΜ9Zy=?)EKJI͎cޝψQP8 Idd%<Ĭ7YIjSrwͫMYӧ9BP"IW_}-2&/]Tt"}N:IǰAbUTZ-cZ5 <8]XGQE QxB$Gɓ姟~2|̗Mɟ)Y^sTy/;#e6 ȑ#M]vMyHVvm3'4$RXZxp#z7+&XmV>#iӦM3=g6[#L}ꩧ_z`s'ʻ+>L2%S f~k_ %4<+Mn:-_\x 馛|^+xM4_~㝒>Rmscx{Mx`slݺ5".Ŋ:1^&aHo߾t ߓ"{'v+.K/ԤAطo_˶_ŝYҐ!C#2H7n8hʷѢE yG E=c8o5j4iDXoX 0@.S ֱ3H<0 ݻ gQ;xbh`hO>B߅VSy&lBִ>Y 4Ȭa6hժU2n8-b:-_1 %GHPϕ(ZXP| J(afΨ؈ҿ3[1cz#J贴4/vDžn3e0; iwX?Ek5k;.<[|y#GA… s/hݺuϫ4Loٲ C;6o,eʔB ^N1+^DnڴɜSaЇ@X 0;Ɉ7#hFیtԩcFt2|f4ϨJE?aÆ;v4B քSN _cj/"6pD.b,:.yWQZhYz(yOSiC ㎵kך\R?\sL4ɬ-kN\2υ^hf]w] [ofQ/6~3"&ٳ͚W\aʴӰ/Г"$HQӧ ᤎ;83O hN8A=\ӾV+*1ꫯkԨըQYb RR%{5:[IP>0`pBiڴԭ[0qݻ|XPGsr}4XB(hԘlҔFZ/(y VԚ Ԇ -؛_! ?0U~a" zPG2bd +M uݰD=^p4֍cƌ1h t_P{g:p}j`y`͌ >fenPelwɒ%_DBD矦??KeS(~b~Yo_~1>ycj( Y2<̚&̨H㏛-$B䧞zʨ {êc,Yׯ1Zgo:\2#P :e,"Yc*4E #IF(f͚ U_oJ{1}W 99#AG0Ff͚X %Q{ɑ9G=V"Ɉ-ue 裏6jز )L4+Vlԁv/*"4CxO< CHzĒ?JKB4n޺=C7m%'^{0 QNtiUK9*GG"(O;wgJΝ"ħ?"%#oAٵP0Ьr[Hq9omIjYW#OtE@H< 0B)=1Yw 6RF _RQ@!Yyt}ERBMO 8*)"c<^𪫮2&_|10w=nJbj~R~kr5NY<ٳ}cFA(~B 䃘C?YC}HrA>궖vW MWNۺ_߿ ~uiR㨞R4ct"(9@ #!HGR7Sz0EU)"P0ToC*"k~-kgf'!VuWẒ"(F #~5qtJƚ)-/9HI-!VNDV:ҙ}%>W*93=k A4281;_gJn6"?s O>AW##uOV^S\Bs!3. 97l>\QM2,/ NZZ,%ԗ%߾!U"=.7tfO8N:d>f^t=:"8m}q#Db5FIP@O>mJijCOg8ޱcIyA&._t+Vt_$FxҤ-}BY1Y3RjCs\oV洪/Qw3"=3!.AƠfQ jsilUy߾}eMb1|ͪi@,(zx^Ԋd%EAG`< I!СCMRp7(U4?~ټdeaٳiѢE*Q& B(%#^CwyǬrl*ܵkdѢEfF6ds)@b$PQ'SJD'УL2f/[LH6b>|S)!P~[)[lf]Y͠A[FNk|%ncL{:/XPvir5טt0dc 5*"]+@|$J.mPdg+)06nhT6j6rC1+Xoi8=(o.ː~É-BMzp_w6ng}vIK۝p ((ޟ)i<8Aq뭷f{aTV-Aa\AVf/iWό^xcABL9 /k_{6mg;ݙXc'cX7L X`_b㛂ɦ8^hPF%\U0s[v1+c!Y5?YBP"D,u=L#v9>f(!IKcaLGx֚&+Gx_+G>$?7x$myf 58Y~Y+C7Ad5$"Gf0&33;BSN WDYl\@.<`yb0Za|)Gy1`yr(y5}2;z~hł:[45hޕٵUHNbK5aeT(eNXKBmj55 AqFž2n83ӷjAfci!tkB9RƏ/;ww9a| ;³HA᫯r6x=\Ɔ w4cPM 3~(!1@6س=XwnTQgijժCG`H,ׯ1SJ!MAES |;F^y!E'lOs?lBmԩfƆ??ݖh8lcI--GCɨ?0T2:w,xgL4ӡC5駟 LQ#r4bMU=5Jp袋̣>!C&ga7wF/s!.>^R4KG4J"3ej.D,ԑcV9#m<^gżyǎ~0F=NOi=:2VwyF@Ohڴi!W_}uYfvȠ̙3=y$rU=R8L~33cPV0캇9E 'ր@T1X`qE*X-R}֟0HBh-Xjef Q1bM =Tr 4ȶj;T~d%+fUǨSPˆG}TXFDpbqk2*)a< 0fEt"L7̙ߍҽj7,R%r =f^v`o5!kz:X:Λ7L47cv(z Yy睇K=E ?pP.|tL֝EtNdm(MN@JV!Jp=҉)2.<g"f?d~҇$G0zJ5.]xqXxp I(X{ZqG^Pqq>Fq=ala NeIrՂvPK)蔕K4w\c%pև,+ޡgɓz2ٔD @spWzW vo-d5y޲V,!UDYGU 9R׉KZ,lDHX1Rz^ȋx`Tx 5"(,-/,GkX(Z4~)Yl%*][@Bm:{ < G=ig 5 fֽbY:_FƏV^SVT5a_n??uV_"[M=ڿ}StLwxuM@[\}ZpMZ"QG.X1߹c*Cԇ3fΒ+'ʬ3;K#g1O &߳Hl&haȏD!C_n#Z1;UI, $9_CzMdE %+S-.RKU2ZHՖJJHu#7O!޸V0LvC2B$*f͚A,XEE޺ǔ0p={4mPbLJ@$8pI'.Z8ݺuWPS~gU0496h0~[dՔOYGs{U"ZfD|,1Scb s anӎ_X/rCr%E xR!ҷ8b&jEF`2k8BM"\.Fx-Z(ft?>|Y1`t>}Qibmi}`GJ %Db-@Qr*YH  AxnƊ#ʠ<3ꭐ\k-0#x"}bFlttMF 0"5g&[u|yf7l99ҨYoa BcwVŪB1*'p[kD8x\s֕rPq̄t9sgKph@c50kFd@^ӳF0BaAh/0c>CȰ"QX^={k߬83ӱ˒Av\29 ƜY!,E[伥 $~Ґ>"(\kP<p ޼ `T_KȢ dfc'83AU. [Y~̘/aH3 uZ޻!JrYg53!f_t&fQQ,A|0hl;U![ _f)zh5QS\T"%~ Gez^Pɹw !vC)\4=ƉkQAbNx\ZnRg1)Rl-rl%ۘ>ǜhDUVN I !,!$Y_C. ^13+ 9&H)z 03~5!1}gډE"(^ '[iZ≯z'p,{$֒f?x<\7x&PB)NTԁe­w'kHbgy 1Ra{^l07\Tx( 1RpM6D ({dUEEE ;9cmI࠱vLq|`KJG5^hYr#+/g9줏k;&Saw\ \RKWr& ,ϻx;30Dg&+{ L!E@ &:C9Y阨 rev 'WWXW,^#w9.s =#K;͛0ܹc{ٷ_PZ~2*E@HF8I)egUN,WTRۛRY[rx`Odύ-#JlEfڛC~LCn bVp[E@P97=uJ@kOkeߎ; _~  j/tl8p2ټ9>\YTnv/ޝf"͊_s|~'I*֮].NҤ3paOhsG,8Eks)qN' U/WL:|D U*U,ThJyrVlMPdxF':YV|rBh)VJ%dgZ"+ ŋ2|)^8gqaU)[T~J _%p&qگHJWRi/SΧt(h 95+-!p^#Z\Cejժ`b3L̮xm<˗/ixE"G܌'bFYp}4|~2{b75b "Ǡ:Zs1BhD|Ŝ lSSJ6!5m`Zj,MSE@O$Tz&X0ѣGKZWE@Pl"503 ⋝tJ"(@&$TvjJ, zYPE@8@lw8E@P@Br("WTe/E@P ^TE@+*2ʗ"(@TTEG/*"`N,^Xjժ%&MU;uYx_裏JN|ԩSM_#W2wҥKߎ;L 7#;vt&dϞ=&1T?JFe˖ P%'j:*;wcM0˥m۶qMUN,]T:h5j|r '!ִiS馛/'tX|Ʉ~Adɒ%;O'dモ^xA6l|ar·Dhذa @O?ɘ1cpYd/; Ƿ~Ϟ=sI+w[o \Z2'ȳ>+'N ~C<̙3G5j$ 2Dj׮mɝ_1_8묳{;6X8={n /;w q'[uByOO?3z-Ԧ." ‹KR%r9C$rH(x)(.O.!$/[[{Z^c#S_,[,cC~8q"8{l<>}:xyE<ȚO;w^ ͛9O'O =v~Z jkk_14iR}̙3'Z`ڽȧz5d5OM:t`ZĐ!C0f;LRYZ`ATlӧO޽gg[Hvz <16s?~&N=zdZŒ%Kȑ#3+dg5ρZ+&>}d͒khh(_C i3&^/L )4kbB|eAjljQӧGG3]v5XDy7sT%6 g~n͚5K.%ZV`FکSX03ŋ+vuabǤϢuM/_M֋+VG&NMiFvub?6aR-&ݻw[_v/lK{no߾%}|M|`xe42>yJ#s&ٳ7Q;|O>4#f&H%m۶ݽ{&G+ J… >|hC|>Y {&h4ޜi7G&IߏQJ MsL7ntݺus{q;ve9ΨXxJF$tއТׯ_o8,Rw1)K _T * O%}DX䁾~xyEٲpb$3y$H… 6A9 {?}i, faÆ[:f6y |9)3x]l&%ъ +BKT KrÇϊq GS&b,uqư6wbROw=7nܸxLǎkKG޽{о^jZu 7ptRmztϝ; |r303m1N7QcD$V& h0eq-^!4L6- V dIq֭[0<_<>V5̾+WIa40|^ 4( cց%hfΝh6~-<x^&PT%W~&EW"@ RZп!VZ|qL7uTB+C3Ei&~;B81֘1cx72&Rܭ[L0ZgXa} ?`1|R睋oӗJ9|bvkRT ano_fy/>S}Uy/YA>rMЫW׈#ZU}T֯Ot ]r%뗝߱cGt͛vǏvXї!RF@QO4`kFL}k!aQ؀ m64Q?VZHɓRXO2ў(%Tt*hS-.$E jr4p@$ TXXoB %dBL h @PfĦ/C_OO `A0/2DžPX;#?>3Pz$%I0cQO*P*^0~>\3TXck_T j,w?D-5'K9NrDV3gXMzM}n׮]A8'-|q! 6448*U/I" $ |mm[zh)M24;wZPBe˖ơcLB~,G1LťR֠>cl{ B9cK@H%j3W_TMMEݻס$A0݌1O]0f[Z,&a[L B?||iydJʾ7gⱵ/2W]-*@—n܄40D߭*,״tP$X`+! HZ# ! @H%B@Kk$ "  J! C@,=5B@$X`+! H HB@! ` B =NQA q1IENDB`factoextra/tools/README-partitioning-clustering-1.png0000644000176200001440000031104713572034655022255 0ustar liggesusersPNG  IHDRʥ iCCPICC Profile8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o@IDATx]|E]zMҋt6Tl(?a D"J/Q^B \r\K2/ͫAID@" HU H$DD@2&]" H$)1D@" H4,D@" HG@ H$4$c<H$@#` N8ѣG(^8qM7Zjɓ([fÆ 1j(ԬYݵ?uܕx/"..Æ cO9kp8zj,]˖-(hҤ yԨQ#]g=x>`:;}69 )8@!q v b*U_%J$}QLn{6^ywfYj(󧎻q>4nӧO>_7F=܋+f\uU1f,teq [x3[,gϞmCWxd{D L:UR<~;w[nEڵyf.]gϞشi5k&|8COu?7|SN_~-[{n/_w0|ᝇDoA,YgϚD Gckvc=Ӊ+]G(wLH'ƙ3gpEg2\o>X,ku'u}->犬{ϒ7ĨdɒƷ~+ o~zA?-[!m3&Ig;{x?KZ3?<믿^`a~z).$HF $$&a׶m[M0[xEqǎU㏠G1}'[.k{ػwςͪiӦኼgQ|ʕabHx6o bP@ _qlǻA᫯u|d׎wz+Zl)vdQvV|>dOb>Fp1/4n8!a w Ƙ3ի"""N,e`XALU!y>~Voۂ3݀N|})L6 ,4K9sDuCg^FK$(ny/^6n.wL}'2#0=M#ZM"Q/+CA rw▼/S;Bxc5w\k];R"jv-وLbwܑ]v'޻\sn-1#e̜9 u(7y1ݎag O_N>\;[D3~ ,1bAy*%@m!PwnwlשS'+]8pz-ag;xIÚNwy-/ǼsecEHW_-Y;>&dB ®wYQv.Hu;y+lsebF؛ʕ+'HYMd#%cXJ* ,_[ $'Lať jժ p;&<(Xw^AE^B[?S&` cݺuf|H$!@ ӢJ?S`.JX rd ;wSXgoobZD{Z10S-q>`o7 bL yЎ`o|A.bBp5H( Z܅E=`/Y҂ƛ8{Q›EЭ[t I)m3{ƅgN?XI<br =W> [g9n$D@"L? !K,)xq2ߘ !?s2@92̟w0R>=86CVxWq<Py8<^V?df,ެ:ⱱgCN=uVm2Vu)I" @3^z%pA'u&VnYCHX9-D@" 5F" H$!d BiI$D 7H 76D@" Q$cVNK" H$A lN e"_3h|~Ώ_q]ʘZ$#'xqq_1rC9&)75oi3D]o=RRRi5װa  qY10(6{ px/ g\3- ~A!:5W~)u4<hƬI3@c jpX#LhRf0@ĚE>fu11;U,ԯI0Žh8m-[ ] QQs(هW~"WO}Ԡ0ˁJmlK*|AcwTظPHj|ۡMuXGYxOSD;mO-ꁰ2sI%P ,4›y}s}u!;7Amp(M39gUy Hs Q Zk9ya%> I(8~Ne(Ξo]+*S78w}>m0_c`t~&@ߵҼMՑ'D  UB0* ឨMy C)_ ֑ڤ q^"ڪ }=O MCXn f0vlYW!dVyX=ȳ"Q K-QՅc`;\lo$@"qً>qոПh YGwy͜E 2*T=oBL^瘘dU7=S(+3d;D"=ni~J"/9FI8(OJ*w.ݠoN 9W#ڻTah ?'cͮDޱ}yghQa)X)1(ށCoDkLn8H$j` xj̀O-Ҁl9&}P_K5(Hd& :.] tD@" $c ЇA;i^\9K>oϋzo6y -XPR"]_ 9 뵰d}ewUSDJD)πs= @V4Bə,ɌG}KS@2*Y wӚrQBsKk-5 U:j`| X7:Mf'`V\a{;xa.I$@E@2d a\j:<<Le; yqkX)(6N:j<1&(kJPh6PtW0pExp&H^j>Bjm}of vs|V<;:Pfàk kdعUIi17 JZbޖٗ霽DH6E{rC۟M*!M_n`KmOJw9PAY=IR3-ӢRȋsb@ޠER;*@:PPP;).MRx9ׁRJJdPm$I)*C q/} X!)%C@J *IbxGkDrXm@dtZ!;Rg*K7<-u,iCi+uX(Rp I" *RO%T g}9 ҦZ }HTM.Ţk~c#L [VPGFHN"Bz/^Ur[T; ٖ%$%̄Aj$"]QewRm:8}F\9drX뻡,H$Ed =$' E|zLa+ׂP[vr>PhS{6$RW]ůs6ݵNnؑyVXn>}!0K@y` ˻ FmLX=A1^p-CGXI_ב]:f2O ʕv=3i)%@"h8hRw󈏏h0 OQmPW2i}@ Kί'A lc or! x4Ȏ`\{*IBXّq(#Sk$K$0E@2auڬw~ y+MƑ]VT,Ie/d%D lA> xD,$af@wdED@"nH ܞxנIrElّbRA.AD@" (8ba+{'㟅peN)9{Gpp#4W#Co!;Ru08yZdz]y]" 1G| 0 PB 6o瞈[}S(xsL"AvuD@"FHUB=`*93Rp4-քcK`r[ wrJVH$၀d 9,#dHbOB:kߣQGҕl+HB# W7C3G:'P.ID@"F@2n(A #"'at9,[)ّ$D@" H@~ιjPQȨ|3)b d'@h# ~!1;1u> ?cz(_;I$ E@2AeؼwJP*TiMrY8?Rb/;H$d e1^C׳jp?Xz/ Xo}8sڔqvٱD@" $c,O*qj~nw++`o(+g"w砯[n7)13ޣ*R:1 ]iT[e}m0ke0HH$ad k~9n(>1Jx!b:;3wB[2''~倄jǠ}09OQ8nwo]W.&wY^K(-vdF┐hpeID !ksCzlƻgb6h @EAXJ83dZgc@M? ۤ"&١8+CaWp?̏Ģ)ۼ:SzG^r7 틷*pY38($@! %Lr6" 6tg& geٓpRWs9z7r_ז ߑrc0#x~_'wwqF7*{jp %<ʜφz]L$8zu*PCq<=r-{Cߵ}o男ap X󇸦QlțJ6'oqhgHدx}OV58 )jޡ4Ro4]QH$ E@2Aa[c&ojF'-ƅ@<7l)0>&lPށp<\]Eqd٭]2YO[oևV#'z:E#1XPþJ7vo5.w'!Qm۝HH;wPFE6fF*nf? (*r#E2dҹBҠ+Sh}})_rKwLU 7bHp,7 +1W͘ .  mjB0?EO" ;1'hi Oo}p޻W5hGl[ ːD2"qkhrBm~!W#|SV֦R Xl,) ]}ZE/ȻsW*V,p̻{f0P3nl|vA$?24H8XK U̝\Dx/+QiBfe+BiϤWUTJj#c2 /y.H"18s ֯_ƍ#>>> !C m m<SA][adS^q{м+Wۓ~vwYnԚj+z&oɄwe}o<*; >؟6VVPp"&"C9vT[t'I6NMW -C -?} +O^ DUF$0tI w83W,H$Z={6}Qݻ/"{「Fߓwq Z 韂 DB 5"6 2:v( cCw="I Y+B߳g 6s<{_e .׀I!.+^! dwgtPN̒aH̆I q ׆ FE%ɂBa֑D (t@#òiӦᥗ^;`ѢE` "PПk݋XWI %V@_] o*$?'ۓJsxWAtlx]yLزZ-J`wۇAmY,}JDȲxI(qҕgubfLRf"X Ih,`Lϵ$D@" n o*iO:Ŋ7MNNŋ$5)) {P͚5CV9StmԫxY8N{(] M~-,[*R"(`\8G}ag\*V)~Pۏx$NwܴwTO>w횞9w= -@s8:B!U2&7k $ I>H>@z)Tb(x<ϑ>#L ExIt sя0Zuq9ՋaKTO!CI3vdN? d0utcKV(Q8yWRh(ϗm0| ﲏ"~839_bDTR(tƀGi2:Ə>}lٲ ;wÆ s?c[<ϧsGD,߾IbIZย'Y}z"MxGAzjH|j5#案j<_ Y'"(p# (6X3nFB_ e?e{zcdx I`C q 9=hn!@'(W\݀2Ҍ՜Ӊ q:֑`AX`p$ꕜ(}턄`ll(< 烻p>WP8Y:b%۠ȐgNm ^x /8Sq^`3c B1:}YY}g_DI1?0X^ qV5uŇ2}')$@!P$ /c(?MhP%Зګ(vGJKH$@رV3g8q"PRx!`)V^(5@C6F #,WtEP$IFD@" ? 1hذ!3cz) {}JnXCq A{H$yEHT ylb$ ŁJJd,>,,hBD@" Q$c6ŞƹGɋQ^^7DYAxF,WP:y=\5prHD O*!OC軡5g)XEa\ŢLu3\-w<Dd(I" 1'yv# ja6(srD [*![dB8w tuW$s"U w٥D@" (Z$cPE*dNʛ,`r]gOɐ *X )H2C@2!# }\(5AF"oג$@(! PzA4<UCm־]CA ?f%@fH 3ddy"LP[u*djPshYD@" $c O1SAR }ڐ-xd?4J,I" 1dsLlxrz]][0SHD@" F$cO-l%Ơs5|K@sBb>r@x# ~E2{F(V"~T)Q(٘$@" B[ތЖ eG(j|7+S!K$F t~1Ŏab R6Xo'M+-WY&Hc ArP#D@ixYL*u&jPs0/$@@2f:b1@N$@n~v+H$d jy#{C F=Er o6=ǏdW]^H$d 4V#XP I,7Cl""bHOTNN" I$c50'ja+(AM1h*%`w/oY沾D@" (R$cP͍'`lY-ajR+a0e9GD DA<@/>|b/n_/KD@"PHƠ@Fsi TٰCmz9:P10.%ͼD%F@2bFEkFoaIhSS]֑H$Ed  =l ,l8WKiXX'rZD@" `$c'fxjG;9R}Qi"H$"A@2E{TD;,]J3i3Ӗۇع>j"D@"H 0CHK)ie(JH1'R)Ҧ  ($@ " @|*!2&ѰW#x>N-C g}g<H$d Q@tN e7\H)W j[}!sًl&H a3)-A\s@=V($mZowO7#Ih|ܴhh_ ^;=ow௣'|6~]G.Ňxv&gT,vFup:|J8H$c?8^`@i;Ұ |,cYRtTI**wR% 3'РT 1DO_PuO3o >y=]u-E?ƌ9B5eLC\ 'Rcŷ_ |,v1;8fUhobAfY=$M(qOe\p+D=>\ fD 'Vt9_p(ݩNQ r>LoC>uH l}M OcۺvjݦPs+0ΧVn;ʢbu`݉HttXV0ˎ3 L+DWb$Lz 8r ivC1C]GGHqmwvwazhPzWLJ[]{T4*b֞ʿ}ը,T |!ɩŸSf/ۂGujA4`L kXH !}R,FsbSu'qҧ t+L:Ijn˴9 \}I~e;P_kYJ|I$ S|a<%1?,eOv*.h2ΜElAߦ |W cXж|Y7cg.R,z1f \j^ <[4B?ڹ7+S wi!7wGH dЄl>:7/u2YރuDqA ~Vt cQcMc38bG2-5Ǣ7-8D ǤU9H f0&I _\\rhB"K X"*RdШtI #f%.%c?a$};W/cZbƮu ||3[i&c!`)DY?76ɔ1 |1^hKBݰR2Ώyտ筓"lշCS-‘[3vl_peGzeJ a8K^]I+X,ڽJw2lVG,,Y%Ynu! XC ӷ!FmYv0U6:+4SpE2(n uKl+3!tǝj`HEn%]3[O#H\YARX-hFLQb &]H*%,Lh9HSxF\t3<@X2ze"ƿTjClORzGt.  6(38~T#dr@2p;UYTtŞ BvɞƅW ,-hN ^Z\.j;-RkdD Ӡz^Av Eq՗pKxqN6n&M2Zd{IUr-mx0Pά&*ȑ¡S&f¤v8DzT Z,ak2ef|rHnӮ/an[-uSs\8E8lV2"ѽTð55l .գH/%%%nO.Xw b܋dWE%- iVת)#1Nznb&~ķZ"~?%Ŧ~-(74я>[X{ j{?lX:Ϭڀd&%4Lx8亦 cmaAsUZ7'ی$-hNt?.i!m)zoBcΜM556➘Sh>faטΜz%e1?&H&]3k4dwRX#%.̘}DGG_r@P0V M_;1*9;@yJ '(Q%u4S#F9X4V%$$ &&?4 :]Y ~F}jVaU҄^ɛPNWlݫ6 6>zVFVxϒ5`C)]ۢ^|Eq؊zZx=yG/\fr+n]f#+:"ץuRP, ̶\I,8b^FdLH.U+z$Wi,11T8^T(R-.R3sIYZD1f.I Չܠ߶tRǹ>i@ (U `Z ʼnpEט?`)KLb3ByHAnjUa#]B[D4)ZgrmPJemTf p}٭bT&Y=; ZX%Yv^oUדx2}oq|Ouvg,cI*ЄY=6 LtBO y!ekПjEJӻ. I4}+)/AmaNv $j/qγgI r`5# =vAҠ%/AIq֨1Nl>7 JdM"W&HJL-,Nl5ea"P$~eF{3f]-(X/f_ ϴh֦&#F`OBfr\Nٓnȳc6ӧ@IDATp2bkfk"6K,=fo:M ?E{n5UQ%Z1 H3?!r&(5AmF_]WZm:lgOB_%Qߴ28@ {fyC]lSӡm ugyGV%/^\D)/ |s:),2$WJ'yWg,]|bѤgˈ#NZ^"\sBHjƐsp9kN(\3&Bw:uO@w/ޢvlSA u @;{U'(eQXnsϪs42]#67CN2DXK_ NY 0\G# cP=h _P2`"Bht.۷\{gqs2ɻBVׅDJeư9]=`3Lև<1s`z |Pf \9i#稍9%(I" B%X gn t3Q*׀ϠT.7X9y\w| jV:o?DA_ C`4RWhLs M>8 Lk+ ^}4Jd1@nNA#}+0J嚰(8@8ںxϊDL˜9԰spHD A~!nغa#b92v۽ ".4;ꃈ)IG"nf _ɰemIz~rUTigRFE!vI)HM'F |A701`Q,:Ep&p~ "}+?ξ})3pA9 \d ^gkbt/ҹ\)1¶ h̷R e]տAa[=νZt~Ὦ25%}$EgR_)766c1 okP;u  +X!ʘ)<ۇac4| (YERqa8}lW}"=D.z+,a0m5SZ]ua} H5g{@WD 3,rEv}L"1f2 8׸c0dG ɴa ]1p%cњB t_s;{_)/rEwZ#]e_m׃gϒ&IfMW.bf %7F[QKX cIwB FgˤJP+%Jr z6,#36Qȿ9rmDC%q%jH.93?ˬB9`4b0 HTl'"T栠]s0Y5$c @v애,&c3 `=*MR.zPRµN},oLmEqPHBa2!eוu`bI[=OkR#6؈RP6.l s\Bݔ5ʽ0Vģuzfb  ^8m$|݋%QeND$0Qzv,0(0[1ǰ.CCЖχg3x|SIiJÖ~-A `pʛZ\Ա:B_ ^E?©Ļ1X%4w런) Οd6Be*Kœs56FI$.G)HJpaBy8U$R؁ L9fMIUp߸2 1JA>y룯^dXXPvouIWp:G|h}b&m2{y;Ēhayl, Zȱ0ReX*xOB^=ڬ 7طu`Xx J+9h(LۣՔ8*},$&ާwY[7Q'VpB4W4{=<@yfS%\Sʐ!˕%"@(N 7|"O*# cF.fJiQ,`O3Jl {v&˸:F}Oz3z l}umWﯣ$Hթ̟2e\2ܝI^l97!_)1`C"'>}b*R*"Yy 7(8\rfLSR|,)#JzainCRp"fއ77{V P(/A@2j'U a*9B'NwT@!c^+R69!) _%B60dWӠ:UJBuz!9/c-IX@DRn&8*"8(3)rN}:Efdjt휤f`H6H 2uX"5 )Pj-'gqa+6a3J5~VhIFP¢jl1 p&IJgx#`K!"2h~WGػs9j:\2)fP~X A`֞X_vkkP\ gJR*!h>Rb4h`{qO@`EIs#a[@1 Tv]$R;]盜q+-nM26'5C/8By8峑pK(W]c#+t{h%3c#儰9\̕ˉ! ,y ۧv&A<$O />Z(2T('afP$ ΆiA1gvCQ%ƱC7 #O2*"G,8A^G<]H()}D'$=(F St>P#O"X ~;b [Ԗ,Ыip3Y2J?L-a+^W* 8߃tb jE{1q(U1\=X8iQFrd(Yh!٬k([8""Tfl^6aD)Su趧ul9@jƈ)K*.}:wEEt? F R^7REBG߀>(?OH d,v-$MɎ8u$C0ڤ q^"Z ]$k@""kud8)zAlU"L ?L vpp]N,l J6xp&4RTfTK4.S뇠zs;qҙPdָ|%t,+t'Ur-.1bZ1aX(dyk񮥜@aڡٰ[iJdnQze_3] ՁB,3g&OF\\cix?&CUnU 7լhųZ{e ߤY߯YL)4rA ݄wI-R,s,$1gt B83NmJ҂k^#.^~T꽙f?% nkr7"˶Geqq`#j׀$ q|1K'_QJnPv8I++t1\AfAVL0P!5XD~wHӺuk)SPH/p2CIkY0/țd@`g9пxpSVG2>n w%p)!!XUsc[ } ɚ_w&E="D`uű`? ]vlP )ZX)l |MP!׎}o\C`o"x~-l8k"̳zy»yމc|{?ܸ.%GTЇtzھ=.A=p\v2ܑ_7Q{d` x5:A9lk1~+@KNeCO pf® nq&an{E٨--I$^b $ j>PȀCVkd*%eD`8g!F܀%bI+TF)Up,&3!_,N$cPs;OA,y#"+Ͽȁ<(2S8gGe"\gJG~k+PФ ( 0j2T o#:{1q藺Ԗ?3%P`HaQ# 5 MFIu9ͧ΢4x^ W=_>/_n>&O_=^𞥫C1ƷoZ7C.C[ur@9JId΄cW-*~%z4wuVq'Iqn:#HpTl9ʼRT4`V?}*u_&U< j) KePð4mkV)w}z'$q*ª^[2=?Rp"5͑9_#zN]LDΗX'`VSw\NNA_cv',6ɼ#EʆmXpIB0MKRSVW2%ˠ`ο^%cXDOJQbA!HP!/ jDr"NZAgHqd/Z8s7Ed]7;ީ["EG͌ 2ܹx%6^ЬdzNmGĴNӎ|Ѩ7iZe?|gSp,6nO#j+U2!첸d ͂E2m w8AQ2 29S,$E=¾chiprTsH;kL@Oi1 ,gFGl?s{w`yi}נ6. `y_wխ&q2(^yC/7<9'V57|zuQwP+>)SZq$FXGG=rf_TQk6wQVMwv{B B]:"(VE7T(*bŎ觢"vE"Hs޳9wn6f6I-m˝;s  7W_wUVM>c.LYkAy|BeNmdkT'7TW"kUe\rP b3dɳ9 }^\Z>q? &BQFS 8-UqHr3ʞE7t @sb@>T jQ${/i ҤOCjѽ6;8-/]ȷz2v $C$L+S VhXmBO}pKN9|F1$!௧^ݳ3ȇJLfAN{&uSҡdhW廓֍!NŠ/Z2%Cg_u?NŠwe1/VE{@$1NRXVuOc]9 Y޶5IM宩2b퐐?` ">aq {\ar0,b2 6}a)Hn,BKHqf{G'!l#@6X ss."," .a\-q>5])+/D*WDISc΃r*&SriYèS1fBk/۞Ն+´$TѷPEzn=.yWB!Xe:2z]5XO_ܲE[,/:z~?_ݵ_`9Q& ;eH9`p)GMS ̟ӎ (4lM77P8^\ vH<*(rPy. T 0<4aǝɔ*(ubPUY }*5~;@)ȁۀDa ru{-3`e`nY)rᴢ:h|zɍ@ {ruN 1Ɩkx~?Qjs?f sGOְT^<),?V uJπJL\oTb"{쑾}3`z &Bmg(*<CRrU`8_C){I:wr%\ 4?CX#'9 ul R yf9(5b JvѱX}UmR1@L&* xFBe)0 :h#ș(\&P! _Pikɇ95^sJ_k3Pi3͚5 YN;k9)dӉ')"V \+dzQ:M[U'&fme.c*hlu$<)N "8➭j ic+Ű~|$XoCҿnB @"}? wB俈4`=BKQ< N(m(3zɋXx!~6@)\Èek  u5/y~PGjD0>3}ٚg( N3@]|]m|ǫFo^TJ'x9 PoV~yj-@V2&q}uD)1! X3 ,x~\IX|4[U0AYv>}Vnu\}wg =sd@4KdMcm4l+׻y7I/DQu {5L@ִq}L+DeԝӍتCKM?:(-ʼnVjخyþFq2׈(G"Jb0Q2\}j.<˲)pMg). {ďPH`ë|%8(Z"sP|vEU 5%6ߌdyn4f -ծ:.FW --MyEFE/@3NHæi1x.9#o]H1$CW/[1(,.Ā?WEEē3y4@is\Z1YDgn2IcQ 7}?O#@%GtO2V߾!}r p5AeW wajVEsΑOŰ}--TH a3#16ݝE?VSDT,5Z%Vg;$?\%/՞P`smIuO^`$FX Hosk!ڋd6,_FEj11TTnv.Ma=&+wDkS6o^vڵV{%76{'g1%,j5XgBJ8JޅD_/A|)YS$4"}ǗoKP<;6 IIk>GxX ΜwO1$IPu0F2`=/X ,i_?V%s̽ox?n/xRbB絬A7/9&j-1E=m79^ܷUI;sٷp G@#/a+~Jڣ /Rg({ ^ޑLO_8V!{fH^P(_ͯHRH}1 /X:2#yc:II1O (~Te~m:q۵A 1Ƙٜky%V5AHYp꼤xX` 7?\IeK^LN TqtPf`FDYX"!,-6}IɕSh/AL{e &M 71⪔,ׅh?߾yTNO/ ubwGDJW-we<]N?곕4jՒ?TI&TeQ2a ٓ|$f7)>$q֗@n1UNC[.ASӣM Ўz?n_EEoYO1leSq0Y\wlwq۱N=]( kkĵ}7/x囝uF+]%M=^ݺB)6SR^$~QgU?hJ<5B늇xs ݴ?0\U >roϊWAƺtyvnKdܣ"ArUb9}Ht,waFd `7+.x^^^xK& *k\.?3Q2؆f$ gKNS+@9M##ge,ojPGO(8 J*eJi~\B ȅ5/U.m`q|[8cPa+U/Gg.ʠ /!0%9y-~ ٹsp;uT+a<<5 9. ft"9yܰѿ0>|y<,̖kU]u2$(ݾ~z 1F_#%cO9P;R8 = 1}tAԃNX{=S7Îz&h ͆5wy@<Ϋ`%VEG:}O#, F,={Ae=$^o Eℋ#lɨi ׆7<.p:( O%q)X>sX¦C(iQh 0%#4q}vYcc5kc6;ϳV?_ t$诋mϵj;v{!޽{Mr˖-+tUR1af\#?G$ϻit1`g)67{Tҿia?X\̸ Iq D {Rm (ꅛ_T/ >V C:S@W>?^]2@uʛb8K`p\z]oΠ^ ։aV!w7:S7gxM+@;8oF\}0RCJ>wgAyk}ȅFAEr$˯HLrC" C+WBI:mA# N VDda`._>P 2Ív)BdD@LDIwtcq+GX/-QD0J ;Ob i\W ݹz3 10`y=dEXZ $$$ȑ#G*e>J.:{:K"6;`TGuK%sXLknw;Qq`]v&y섚Rq2 EᙥqN9+lI*1ɟo)*]Jl1A`z !@t#ձ/x1S eSHϚl?JɻXtƂ3*3sLYr:NJJ1B&L VRoƍoO?$_* 0@*"TSݞ3$ 6F<^%oc9]͗CmkE+r^?'%ct $" $kTKɺ o6:z^Gѵ$z`̅w*7IC%EG>NK͋{KSnGrdmldB@F @9 x1o* !MT{DY0[QH 9|qJ:D.T̐H^ rK>]܅`NCو`%"4"rhЋQ 뙸L9>V _wbRYaM;%@ ͔ti܍B+6w`x9b]oOڡp7> ,e2<2 Jz N}f߹PKAԐP;PNXV] 313_ # B San^BO@h=,侸V e1k6/T[n o_妛n*CЛ+ 5)wyYFƏ/ݻwӧŝnN:2:t:unݺɲed̘1ru_=bs(E#00PUsJM}@4'S j!!FQ փHlHXme%O:(s%SHyi^tÇ fL$¤EVcԫCz#αͯ@&v&3u?9J."'t*Ô ̂Qsq_z$uΕ鷫;MǘV kG5C>+C"$.$OB/F%_BPH;jΏƓLZH.!pyXṳs偊ͪ).̛a%;`|؞P"̅ *W7p̐ʲ]\&'8U"yy^Xj/ ~pׯ tgiPM[# ćyyQ  DM!ɔ$\6B7z)뮻?T"[oÇ6mٳgĉճ[cv%W<#: *FQqڵ:/?bP֙B~x&3.R`V돑CXT}7,ʙ)nVvQÍ* C|?s?\Q0?]fHb[X,BF`#ρ3T< N*TA!OC*wxaB㔂xs. _^90 ((PG\Љ<\_Me1S[w͐v솖A@tnz!$%zxNbе1uN+`V}xxBU1qV}5"jgsp$&CopŒOc!:0GB6yp#tK0b%SB{nr 7_WVׯ.zwˣ>v^{kW5d۶mr@A .(Cs2: 烕=ߒ}9,A=]PJQA" TsćP@GׁR`^QJQY1$@:kq_vR^r$XS BR`>#cg~UT-+Y/oY I(^X VX̅9 ӔN0& w%ܡAdD+P\QX}ReJ b$D%?YOo%a~g>bT1 DE, AP]!l0Ҥ]H \g,qvԯL8? !%pZV 2ݽTLnF$06]  B(&ypnNpKP?5I`{ܾjRcٰa,ZHԄc 4?\#jQ7Gg}]E2Dr#|C_|!/L h7 cLInKr"Heqe I`t @m8 h(`X"6`~w HՑ"L~Kwj#}ʥ읈.s@yYf# 2܍'de̟1T֗#WۋEHk-9며 sPNZyN? 0qa a<\U ʅ > cȑ#峍-@IDAT>S ?8~fP^=ad&M3Y_B#<|mG<T.j׮-_~r+DFuϭ=ǥR {Y9xbP5=25M1N:,)H@)E+J^iܹH˪&5ŕ|T.(;͗J*e';m,6$kB_qCh9ee@@B#Bc$[ۀ@N*ٕ@~#^\ &ᕌ' SВ(;Oա \bЬ0ec?h ('b M*bm-F1Jc(Paz y Hϴn"C+5s50S hWcb<H>6O2JY.fO6d^(*32ӠS3PҠ ) u r[ ]<( IqJՙAqdxc'g9p@EP\Yu@v I?KQ{"\A>(!~{f_%8 mYf_7 0!VgK`_]b@q ;XjŀqR`GLbJYVszC ]: ȑ]}Ŀ"?ȶҖᙹCzdT 2=X!S3 ̓z5iHrDn9j{`m,*N8QN*lBx K$ *$x9|f |Ɍ¡g{x W Pŧ$/~|8g30 ;cJflUL\>COh.5'vn#kfOi1ZGC. f}"Rn=31aUUзEBGpJi" yڿTip6\f`0 ~x?5 ޚ7ҍtwJW9jxn^!5i-eš"BM&cjDU8(Z AN7Rr#rQkÚ۶G EjG s;\ժ^Ink޸\.m*{WٳJA.͛7+Nh*+7W.OT|IGo;ͯEx͙]Vcl"r;,= zi/AT)6bt032!}|F=)|$Jm43[U#EYA*"6v Oȋhҥr10u˖Ue45'>̘ ҟV0} Hn8ۭa3:녩4'*aC $<1M2]% d.-Fi%0esq1du 3j<!YӃH0R*+PXrT hab׫$/۷O%{`h$S?9g$aL^+!}@j$ˢ'%iSR8g G)G۶(Gm/@yb+]HNQwwޤ2"n? ւD1f0vzazykA[] 4 8Y ɯR޹4 mOoe2 Nq T /^=ҡC߿*2)"۴iRP@쎇6]# (Zv;gL3@#Vgb毤H=LH7ߚD­0cn @w{u'ڵc+=-H(:.!3]ϼڽ)b B bڲF!hMB1831 >!*;eOlǝ06*۶m#GĎ;  C3$/!-- ;6' Z h=]nUT̹K5kw^s@g;!_3lSg7,L-es*0k;ib8ihLx{pBdBtgLZ=0a=PDVZuJI*j1 fXnET8:__:=<813`S1]v)wӧUa3$:Z`A+sY3\%}#kbt!dFԳ?r;gh0OOYzb2Do#Lś5!$PZ9 ՂײYȞ:,¡B~gL\!)rKПvT؎X s$o/?!{Ьv|ԯ noW` HpaT3/C)m??C?~d(m}T> >oڳk =#g5#흁뀇/cYgakc=>lcCd4BŁVM'mcdQzBnN qffZߧv<١XŲa* vodBǰcNDLz0[+NrIu?Oåe,ޗXx??F r~}Hh$,lqݰOΕg.'(.N`3*Q cm eo\0̑ɛvkXtUEew *|\Qa-"eyTش|rM7. NjY1.v+eK+egsuƆWXswo &"Թs.՝W&Mp(/;*g$`P$S;uP2<'^X`N#FUn#߽ޣ|ֿ O'O}:TEU_=,cN̅J0OF"ǹ,Nee#0"ep"$3vaUv[@ ă7f/~- i eʔfh!9r Q\ۥnbH| H5wgqeSN-%w,|U*@ |cmrJs @7,$ {#OX~z|oNfbw!,VeL,7 6gdFjtaXBK2iIzGMGjhxܹ#}f.N6HӺ=uTo  ڕ2?s#~Zc.F|;BR&#B{n=pSӆyd)A{dws%=-s{RG']d>`Ŧŀ=`$$>ÊaÆ*o¹s*53AU)]LtE 5v?g,Qes#6'tU KdڡݮRKXfC?kJ܌(=M-^D I2^0$q6|{a!Ҝ7M<]4pCyf Oե;sѧf\͔{ 8'F,3/^QzkĚ0CDG j't{TK%AcbNZ76i19ss=f0թ;9Oq7M6݂LŲqaVmdCv]_D?+z);?5D'EBa`v>wɑOSڝَP"o.Ve{=$cmUN7hQ Ruʾ="K\(_B$CwU gJ.Y$ɯۗꨘ:J`Lsj 'jU s}%fD l>5=I>(~m+itTB{}c*D%kHPǷ@f5T"%Eo[ yֻlI3?to])!~~~5Sdjh'H-11QH^IG 8kZX\.ꊁEe9{qFFSZ& o_3/GNAXYJjv$],mfwlbhݳi1wy̘1Þ2h>yCG\ AFB \$[Z-n~Ň-\в~ VMRN/TM2bKJoY罚9)[-#Uh9Д0U)pTeOM{ SKq]dYe@kRPa*eC! vڥl-k2vȜ/3VOMeŃK.nkIv^MA(amnpJ|B߂gKv1it@Z]$ipuѻ_± #W b\ģVw) '=x)GHkի~U~Q8/#iyP}g J,H,Sj ެ|KMF7쉏v|lGST?<6 _$\C8SQ+}0tZa0fKYkeH>>Yq/54̃\6妺򲓠,|S %baehb<1%̷ ,ZPwz"YIN<ڿOjŲT?C8EbV1Wՠ r}kPʴ=uܹ TF] =͌d{wkK7vjVw@"3!oH~7V INqo2<2&SWuJ=Ha o>$3N!?夝-T=JpbGrFQ?PHAfnkq{gUM8 )CR1"sU'D+Dғy2d(#1)%&WF, M-lv0*諫$tU(~ױ ?SUSGڅ?c_ Y?p# -RWJxķ_2 \tP ̅7,N  Ae0/31"zg iqI99Z "?Tal5g5E1\>nxDV2y0Z5%(>cY޼,N[) -;IU]22\dQ0ck\[4DLMŀ֩SG^~eDu <1B.\(̝VŮRF]ҟ cw,G_Vn.f̘ "eFoPw`U+椝G9D]w$T)/t]4.R!7JpO<0xcsŭۣV7`5(+ŧ᭪\T9RKISiv홑ZE\ZE]@Z L\DHK£',B?A|+xNWT֚П>.".L>X<yW(cV?Ssp |G*Gw0I2rv?Xmlo>y衇d*'B.]J^U+ϺX5M۔ͅ`9xO}..jhAuJNQϮ*<2m'8%}OR`kGd]>X R 9GE3-ͷ|i$DGӁ+S3`6^'ېm&hD> 3 %Q[F85ŀXg Fw܍3s>|=ЈD|'SY/;vLeM[{)I-H| 01>|9 g=K!,3m(_n;ٹFrq66Dp!-Rb |b옜l̕^ʑP\v I;x?)i0g~ yJo/(7]9򪌮+iQfK7K\K/y$d/4 ju5jɉGr}zk  SRŭq~3\Z׿["x*?VP8f<3A~")$އk9a))ڡcc)qQ8gW}Ʈ =}^e#K㤞Y,H'+y8r>Sޔ$o )blb4r> 9.]bJ39^.ژ{)ݱ& };E=d,Lw5i c  e`SdrdpP>!(Ph-` 8!r&5M61 Wd?>#rrE3.Zu%>SbM]w% y%n#T..Ҵ G@Wo|S;{nM%L ~zܻTiB=,I$(&xwztlyK5o64-M-7Um^WoX%&Kk蓋u}[ gRMpA,O2v']|lz%Ψ<׵໳L"L~1KRSAù0s&J&61ݰVm[7/oXRl9^Ueޯ=2Y쒮vNј-@^XsH@8;!Qp%9,쇐ώ^. j)!x{G$U1 %Ψ|.="fK~p\A2IQE"--M\uq Gy;%'2eP_yzV pxx?BkGwʲ>\8Ҵe0|4: rvNl rw^v.R1dG%=j&q+^ة@R1NU{vp_vf32mu4Y6͐[;͡b2`2M /i%}2GgM@|mAًӵS]iT>0z>]W˺Qلy}2:(|4Oojio邅Z(oށV/?'A^.խu~<Bc*}xq͑CQHgO:"r5 죗׮ ͽ䋭Ik]Ӆu>C'Xx&R/?0*~v6=Xwā2O sd7G">ێ⧖-[&ׯ7)юײATT`Ȑ!2l0|Bu|wv%yZBҪ>'z71\\/ˁAD#|PT^Q1XE^nz AZV솲bDžŠ[oi  ǿHѭ `B']{˨60sr=,sCKWo+J(.kͬ}sZ:SS JGT#}$k}{ k[P3܊J^a ۸  {dաr19G0?, `uIO{:{AMIؒ/pSPER`j-N{n nu r,!E5S9ҩXW ]z#F%` yUƍnyRͶR͛eԩҾ}{iٲ̟?_z-eӦMVr/!1v#BL7_aLdWdr' i#3i~ 4!I˞tPI.'b`tYAK`mg kG4]Z\&LcK>F^p< k:_3P:W)`/Jcȷ[c%6Sd|_蟲ٳg5=cսo*p5i;ݚ3&Cao? LmB Tى݌=0ƾBт -1j^y1MRhy+d#Ox-W9]o{RGyKN^E "'BI,'GCL涳V/14*0t{ ?.'NTgseޓ%K(dq+3F $._Qk$ ~.'بߌ!zDC`37, ?=!w $u}uK#6XwebǴ:u]$LWˎs2MBsL߲#!9y(?{;GN̈sG@G j lG̛0C+|Vl.;#Sr,dUZվSvE9sڵku6GNE+M ">||ŋO<)M65#&?Rju|F_ow% bD'/H׷:o$G XpSCymu2ٿ8ޟc'Hi`yI}~BX[@i{ca_$8<]TyEbYkT.4 eY[S[Re Z@ ëUdtDMeӭtAgKQ& ˗FV"0i& eR,=ח(3}jnY8'3p7OK5kN5;fWZ p|>I GٸqJU`se)WFrر2sL4ɷzѾ}*0" ~,dDC:O~LrPi1Dd$J^ ]r8DXmď̏QO& :x9;| VM1*@2< ( BםNg=/:K[߀<vx'gKJ*6Vh %k-@tP& 3;=޾x`CYӄsFՓ4TQ?;|ysDŠfTT?X招csOnuf͚%{dƜ啷]@ (.F%0bFT$$8|GRr$vCV|ft^o1Hj.k}>7^?F@/_uHe//HDCr!X*\7Fu8Uʿ1^:p a>A٩X?逹uRS)ؓƘ\U$>"Ǔ=0Nx|pa b? ٖ0db˦`@LP #1٥x.^5PO0"ō°=`S1jZ %@w1% 8[3~ɼe5 QW!݅ mfN8xX S!w hl?)kmZAg@6ąB2eW$~Ơ2NWL$8J!!%.-W#BVP{\EߖB:eT Y&H1\ *3#-L)kMhu.̫hU;ZpVsȅm` 70Zm| _6c4QJv D)SUC~SR9 uB$)hX@V4r8k#Y(b`+j%'}D囗 ! _Cnf0@=~Ds JqŔm_ EJ-ՠr/dtWG<`2"検#_.j@p?PIܜ*h\nY虁XmIZ,ቬ&u@!#GR[=-A#, 1* .) zGgsanM5ftt0:0;Ze6P:D,:.?A>L SX`}Ba/GT<\M ՞6*L<"G:!k!l}GMkﲴcg,ub`AqY"OQұ3E[P$BɅ93L$H(qQv>!ADpkJ'}_wIv%^a66D-oKr[&Q wL1uV%@MjuyX0;^vi<:*S'H=2+FaŻj$fp)L&\ۀ&eGU}$14Pr3c1q2S8Λ-xI=$H$z *_(:]}D| E,57M zae mz`>m^]&.MAȂ9v3&<XLd՗GT3i(Mnp ҄V7$޸\'0BmѱW n\2{`SRMs|Lc(1殾_w01`tm/QX(KD(Tw~"JpXK%YU;-ϸEW gzg-?R%KT 233eÆ X޽Œ\2prfVŐ;M&EpvDo{O)| '~$\rSk+x^w+J&$F\ q;bQ/[oWG=dd%lqM2Jy^bމ9x_2wGpj1~a:6)O$AI9x&R|*AʩF&p*dD5 @(5:SIh1 AE@::T>ؖ,z^pwnrt(+oBuQ00k#a 1%\SafҘHœ[ag[yAtn 1x2"j(#Hkr<ָ) c`$,DkC3VDEEDITW|2|pS:22*]MXO4p3*ihKY⠼lθBYH2 .7Q;a k-xd^\]|,vjA14Sq{wZP(L$셴j+O(:4)ҧУozR"# L[=(*!BՔmx9ꛆ: 3Ӊp˿#M2h>CfȎ^V,XT\ .$(kx  }abOܱ I)fԯ-3l+;-: iOEH BH ʼEԔqYa6;B y'bPJ^z%}tsΕѣG~00\ЂgeL7O^\ 2hwn)!0T EY펳wJV6,be!7\ $KZ=vPà?00Tޞh׼DW\Zhׯ=W-PwI:}Q D(xe?@IDATa0y,'*G>%yJGd6<CPmKvF,BΰQ0>sj apa5 9("or3>2]iYk̀MŀTӧO̟۫?_Zhr#\R)W`#4'yO a~KfrM>w"2#L90tGxV=qq W$OTŁ>k&@t#X=#) 00̱ r::ȕ 0ܠëv#3f xZ'mz {Eڼ/\]ΦȤKBu \W^7O$K"ђIz ;b$A(ow}M| E7N1~P6`4;z[]oҤ$'{LĮXg^Q< EEy+"T%ޓIu&w23L!Ʉd w39U?q#pI?r)ɯ,٤Geo)wy{5 ?Ҵbp1: ƢB4ȉDtTdob|ŒMV}O1 ,7 %'F ϑ7ʛʅA8SRz&,, ,3,xC9*OsC: 'n%?ύUqv T!UƿwWV-7W}2-Q ط;:!T|^yMeil?$HJe-hϟ5ckbp ̘1Cx/dgg+-dK!0 %C¦WD'$✝p  mf8r\p ӄ jarg"I|oO~#j?_.N2\kꍝ[wE0UﵺM#I?dB>#gX؇@k9x(g LY*cq"혿w = ܧ,g@ uܞZ*`W,PHHb~ Qx" b=$(Ė鑡a Q\wB gGɍJ3aԷy&cl+34S'F1 1adƊ{vд())Qia~Ij|͛'~\r%_*wKy&>'.on 777WMOxۤ ~? R~ԍݼIk4wBUFVik9a DIe" gN~-q |Zkgݽ(iiie_(QfK,r0rɒhA*@wAV4 CI7l+O*odl-2=ѧ${_r(ܸnl2y1 Nt| OR@N?..[AA3vD)|Lߒ( CfltxnQ<+2ʦ޸uTV\)rg,5Ay'a~cq5Ī'$K݈v$vӕb3>6ՇqYK:"=75$TNٝӫ "ZE)3ղ'KMMU]v}im:yVZGAW)qI_gn{UdC F$qpFjGاt;G/e"?Ķ3@$Q d?>m[/FW*0&y{0ww2ܦǁё qNl #9 ˜:ؚd*L-g$3/`p*u#W_}%wq >$$Do߾V)액? `D޳+<]IR >ylD?KhugKY@Wj+0nx/ p(?—OR=JX+(}Iݨe|J-asIٮ֟{{%{ⷊ{9}[|sd#@Wov-cm2=s,lg`lL!m)ΰX sHCV H|q)i:l2̍]b{ YFtHa֚oi/ RXLV_dl)LkL _] Cef&#v@ F~P5⣟(b&$0X=UWNv>f?=;o t :JNGi7EQW` Gt_'p*&ّ-{"tr5o(E`.q\3FY5n i,z͟B3Bt`wbw4:+7g/>[}Q/:D˯X DF!̚5K _|㗵 LQQ梲g2p~lsp#, ښr<Y"G8q , BhOotnM^Y!6k,> VWdOf凞;pv;Eb`j;!1Jl1Bآ}dU^$Oc'4$K9pcxuag)rQl(wZ=É*@;(ҒPܸR?K%NTpҥ*eN oJ1puuJlkazYZI[ M] vvNB& $ 39ֹ:EGp#QB@ױMfOV([IQ'LoT_s'0w-d:\̷UB퇂`Tcmb8,)VtZui *YCeeX,o-[T>C=䢋.իW䑬<2`ydbhԩjm~Tn V<',cг5k12_h!v'jBLu88i]6(QΎ$trf6R&RJQ.ƣ Bs'0:nN(H8~~XH`!B1/d\wXcY!&/Byf7ƏPu駿iV30y}s°GF | OR$krr@( 9Mr1 ]3 'X?A*b䢘dO,(-ٲ uk7y~Cno& ;Ibqˆf4IރwS֏΄jV  3c;$ ,ah!| 﫻BF#@M悅ލȏI'viM"(TD)h}U:DEy.4ںS݁z/S3rpSPqɆdXKEh!H`۔c y}pYt8udloA}=}Cy=ܲu WI)Qan2 G*/@ύ%WQJƧ|&uM;Se2vXڿmQg cw-w&[Iз,9 G7$wzd|vLG !;i<8pύo,Ƣo.fH,xph?k% ʚ㙒EXY$)Dɿ֓* f3,LuMa1,=XȰr?dWnr @?PΞ g,&Cܔڻ"x3Jkր9XΈ  xRZ•ٜ 5m`%sH^ ŶGzL7l%VzxzzJn݄rE6$\OpU_b/ # ! 2 FCĿN'\0S  g7EnD !+aX[cLaMW_..Zñ7kJ.|­ MڠE`ys%D+c#0 VgQZ\m-V)s&p} +1& ʣ|5!TmPd2iM6u_+wvH˩_k̓ݮ# )rqjxNkۈŀTU#:a:ېE`qaV x6.@SFѮn5 yv^09tpp[*i}1Ue5fw,B%9&\6xxY7Dǀ3o]kU`b1Wpث5R\wjlˉ߆:뮻@eV4/bk#Zz^\AAtt!L;zPKf(/o \Y]+yr&2#W;NH&TD4M`@h).8;gM ]d)ȁX>dw wK%FK죹Z4Jl:B*х3֎/xv`y̔_a4<$B'] >aAt*ʕ@wkѢEjKt!lI @{*o,9Op4 HoH0~cwzOy@\@` @di n :FNPTjà`q%hQc)~S7%akc%`0kV0%)mR^CD!X;߾/. ]8pXY% zT̟C d{r&XoRG7Zk=w[Өŀqg0Lq͊t~S9[>Ć8O'7"yVOva`>i9U.}y,]9Amz{?.Jړ#PS"VFR/faP qԤٰ"pւOٿW ^;V5zowP@M|6y2CM3PX+#-4b4ԏ5o `,>9nFP0z UcfIiؓ`*WhﮄeF:: 8͗Ҝ:'viKp\Eg?썶avE|[T!ss8 .[f.~+.Dd# >˼ ,숿v Uud#ɑ7LT4$y3/Ǩ <:l ޅkfKz_WIɈiɰO&j Kld޽޳.o˂Z va@fff68[M4iKnP979@ąB$fLrF> cwBsL# bQpo-`w2 ;k˟ >s5Х1?$x@9`uxGO۸MM&‚ª@.4Ƃ/vT[\@ĹA#1!v–DV␫\ [{h` N[#8As8K+`/n0/J[}^ۂY;XºihHlK Py"򊽮?32Ktԇ*VH6Dʫj$ Bz4;&wb*ZgmA⌨Ih;,93" Ah2X4 ?Aj@/OS?XH y\jv1E6cI>c^n^!}["Y;fÊfvU WeĈ*cǔR@+#* '+oʭpw3D}' G.=-p?/qfȠh>IYkMgɫuAϊI򦺻Mxaa.ї?ijIlOrt #TW涗atID$4h(1} j=>q.2ّ&$6uՀL\:Ȱ@F Rg>h' ea;04$* d:d{p9< *ūrUu7ZK^1:14wIǝF-k׮UFc ,jBNx@e]3fR{u⤤(1􎩩8f>}:*+eܹI*К^vN=䵾 x 1@ȧ"S .܁GGs-5Eн7c-3ZMtY'e bOgdC;9 4%t K1u*}w|O8ՃwVr4Z"dH'm" F=*ߡrI+֓ΰ{B|:Zts{P+iU /od;C|\-[UW@ 쿑&~k6cS7+vZ3^1~yP (k+I$V#1Y0ւH'rn \r-ȂH^+ y#!y A7VrsEy[=<<ԺT9[ޯٿ]jӒa,[vcU ,X 3gδ9tYFE-0H=ɑ~/MgRfv^*,b 'yrr#mжPv ߁ŝy4YPG Oe\ Bk @<w8L ӷmRe_BjJ$9q0׳{{\` l6/[jSZY}kT1Ξ8LOt1X+ku%0FPQ`j*>Rݸu_ f ~}BGIq,݆$K%$`[R#C8 "Ŵγ~/O;"j GRuڿdnX%εiOt"o ِQ %.Hz]H65Q_`/-HCMku?Q@z2rF<+OHyȦ}j=RLۈE9uߝcXb] )\ pѱL=jjI-A|~8<#d97{ }}8XVp!r0{5G Zgylq37YazEWX}+dA52sPjcTM A V2ç#@YQ٩N <<[kK,@c涵7nO-Pߋx96ə* E& H̙BUs;fnw^eΗ1@\#!'BxBֆ+pF  Y_O3'/ m"~Me^dBE~ߕbP;~X\@1$3 4ūƧ*sv!\$\jK`v5 sP-d<(ʼnDW( vTc e#pTT+07vߒd< n2/aT}fΆf:qs:pa{@0>AH_$JRҰtSh~z呡08#AY:9r[^\!EKQ"БLA4e8%A{ c1ϮUj Z;R[sʞ1 P}?j2y8ȓx@yŬUUE*O R0zJp0vu3P okU_jv!ܘBU aS_0b~!1O˶9] N#Z K޷LGJ%/\-{-~4㈆4 c`GssW _93Pc@L6n {0\1{G %J/IIe */ }&N7 \K`,(4(j +bPL)"d6SY]=x@cNr@ Gey?`g~P9_j?"6E<&o?.lnS%+"] `6@2:x֡y<&yƎzQb=⏍HD5ZP,[3p# rw~9wIW@ V2>4P |e 27^f܍Mq ]05EجB ];u/ >ڟi4X˗+(CBh1Tdqn9{xǤY$=&={,H{\o-VjtE${*^]Vk+|m& o„T}^wH֟[Q i3nkz81u)w;1_Rq\ ($m)㵪->2as20R4QT8` :6>5;7IwO>Pzy)5^ʻ  t5j1 _$!d`¯J@2 Ofup+P H\CIѱ鎣{t#ow| VI/k^s0" H3v.6hSUHRDjk`]8i)wys9o@<xX*q'@gΖ\!+;"2+$}I+P"}z53=7k YV-Gٝ.qZ d'R~Da+T簨k23ZC}l0q:ЭeןBNZ%Kb8whhׄT! Vg@h t=4 q*FQf`8$=Ѹ&^Hf_/a،KB_SGH^z[(rJ W[R[*32Š-x$|޴n<(DwS~r'# Rp^{wv^ ̏ G>u3dQʈgN@8ddyYJA4`.Rry)5uL޽b)K +৸Bl[EK{Gs+0oI9!P^Z2,R55bn&'CD|N R3 &P`rPLIOs?| d|Y p4_f~INSiF-vQ;(}au4&9߇ 0WfP 8r@nDXS7GTLT%@miT{I]!|􊴲hWs`k'bug~;0{ayweƍOi*ݩm?t'c`+a" 4q%a6i胅X¦a8UīPZBmZzo3Rca (Oš2)m23ի< @YGZ tp4U5*YZj:?:X%9>"l\ 7=ȭh(p%fG"INd.`7WNN|]@}ĨIچ,s/ĦN\?xZT߬>*X1QC_'M.4Paͽ E1S0^Ĥ&$.(\5{7o,GbgvëzȭH I7D]|:ylȒmP 9$K$ DH !vkOd Yh+!Ɓ ;ąaM?B.sM䵅R}THVA0Q,N;*F]{B ZlS;i6t%4+'Vm};07GԥO(#}ӢkI7**@Z6JzD6 9.zKeIBgkqp 17~ö2zBJVиݫ~n]>@'S{:]mwOiU*O.6eL\- ~cmҎ8'B M ۠IGWD>?WK狦3CqMcg$Uu[wk#` kcAS+Β {-JA- , VdwLD*.99Ot/#v!zbἫO1[ǿ(ҲM [Z B~𛤯;G26?-XP{*> 7QUm ~y 4nJWR],)?"43PԟIҷcw[¢IEfI_3E${\|ꀜh苹^WԕI./J${ VYq/W9Ao >;7 NJ嬏(tyba kĐUF#k巧)`)x|jE9gwY$'P_GH,\??tLsHE s; 5]=5f h(._Aw3$D%\W^rlϬh..;RQXs=YzUґ؋Ჹ {a\׵gz.|"v[KYw,ҫVN3x`UIaazu]BFb[(Y J`"3A4 X.Hy?:@sQϤ%*U60 cB+-;]FJI1{\E6咨j!#qR6_HMݣgl8DP%d2aA$sXDm+ICo6]"~_RcѕzS~YZho>gٗY.+9݄7u18"I*-X),__S)^t9Z,3zwTHɗ %A !e Z@]|F QxMt!"ǩ{ PJ05د T#咔L~ĵ4?I.+adY~u@1ENokAiJALg@ 9xb_0Ȕx(qY (9`=A ];z[ՙኸ( WQ}AD835ylKdž`O,6fɊ"n)~pr&Y̖Z#b·-"/>x&Y]I@! ɯ4b/M|,Ț}K0m#]*ׁГ'R2%͛r J{.c ]GE#~Pi^fЖ=A bsZ÷'cEd+K[aR-r}ZG;ᏸ%VIG^*1s|s3"Jev{t~ B =s#!#nkuJ[~7}6oGrd2 ap[hv2~DhJv;W ȖHc9|(>E.5XSPS;yUʍś l5J .4«1$d[WgbL"rhq/%kWAĂ] pm)erDea`#6'\(ӊyp5Lr%W)#H %"Id\ao=L$p`gMՠ fl~:W @aAkhc82e-hhn,NwER#b?l8wu R*p;g?Dv6 Y3uN߉JVILqKAu-θف) 4K:X߁A8@'NY ԩZؒ#HqX\>TT/(K+,\ɄYbw,*cYOqѝpstqS/i;F{"dHٚ\征`2gWY<JYHZ= {@S xX í M;(G)0+0SC C)nܧE?[sRP={DekXP_SɠPX3_ƾBj]11E` )xeLP.i th]-oy 2|N.Y%Bjtt0Ϙ%`ĻkTC+З%bnDs BOT;%Әa.qFZqɜt]c]E,ZIiFH"V͋h@XXf7Ÿ_x^11wT!Ak0$FB]4r,BU0s瞈 p#T$@zngƦ]|TR%S蟁_oศ C=2`+kB9,d`ɢyj< {0||}w=>Ad<ܚ_ 2Tsc $m۰%[6@[wB԰˫!A[?SgϜURW]|؁ۀnʼ~DePVdC&RYU$|)yoԗ=rto3rI).U(APG9q9|X~L)LAM sLQe4%&P21\\xwOᮚf/-OA_#ravO 8rSWN5Ҡ(0"@ [KTӪh\ˆ%u ]-528BJ)r:PX E /|N%,da|`$e)Y6HD F^^\ B~2(T΂ՄG/I~IIC#"P'_Z0~ r꒮ t:ŀa]?YVI2 ƿ-^Ls<"@go+(ocg$ )g!x!̇ #}xP\zֹk޲0UV#a^*?$ʵv,9a@ww|* & p݉>$#el}=i$+"% pkʥ~5`F\hK`:kjQ , 0}#XaD#ʴ^*_erp_I`Kd@YFFMh.]yFEZ cAy}R(jfw0V  K]9@tU,BApD)COM_49Z}r *E=xTVgW)kJ d.~"5:hrޤSU(J;ߡ]ְJw]\8Y%<{H7E M+RζuY[U#U;w4E"C>rq $3JuYg˜YOțd:W=f&1h %92 DގGfb2~l0`cbM+#`RC B@we ž2pL> i#(lJM%q}\B>>~*~+Y|;w-5茯WxIj#HtGhf. ]   oD7VTBP,$cj7L_}K*p}",L 2eF@IDATƧ 0W>꿻~HKAَ.Ai iWK4=vnb7t*X[w5]ߒkضDT #Mml;Ŷkkv}tĖ\RZvF{?A8Z)E#u,;5/-&,紋~iq;Ω"{S{l׆3@ayZ`@’qb^_ ,  Mb(/Vh} LN?]'َ*=RzC@4 ϰA ?= jCsf`X(";sD#qwӔp\נ.,  kb8&kBvנsi3Mf>RE6)kTçC ѪUcxMY W#fw_l.p7pӛy@%x wųa'1r Î})=$p'?gdEFM"J}aZwT*H@ cf(Ԅ}Q#{.?\.Fd?e,N 6>U* ȗfaǡWg)R$ 7 4?&9SJL!%͞6soYKf|ts\]b #2 A*5pk_@⣜KUaA&U2 ^`Bh2&v- R *bĪt 0͝ȧQmO0 4-r G!\`\`ХSG00臆AY_94o0I뇱RP}kVB-* ZfETs s>jÝdEdTp>ɪ]; *u#$GgcņYkuoZJCV_7LÁMA8j:#/%@c`P^`{oVHH!n20ǂ_8q?(wUƿS᳿scpUpOz_`Dp9ɹ`J$x]@!L\,-S 39 'L|ZK"s|hitpN̝x}p9{Yz8Q&O"%XK6w`n:bfm7P#oA^(.8A*Hs=sƿ%GP5 Re1`.Hх'~fDf(,أg~a<|}l瀅keb,2ȸ57O' _*m ?_fnާUQ&vᾑ(Y\tH4K2M?`D;(?@m~{~Ø}cU)ȂH`젲6T |)F7R1Xq1pc׻%4;hCfcq >#kݪOGU*Co`< )yx^HG;".G五\TX<]ڛ}фڶlUZnI_d$ GMRvSE`-!NQNЮQ^3Dv)FlEkA_d_K]5 @t%p2N$G }zUL v AЕڧð"bs tZŀ 4f]㶳] VFֿ]8Gax~)ˁ;Ww*OYy #G~h'|1bf)IV\&,̔XH1'a1{a*뢝}9~#װۦdԬ<{ C `cwBkG'hcswdžs"ÄaM o,΂RT5`,/INʳ!mqX=\|ui98D&lKk`E{xF0D\lho15pb:It%]3 tj'w{gSr&>ㇿ43cns`1p3X| #҄mTVq5YM}Z{TݮF+{q%+jn#2hJȶ=X!bj#G᷅;sIz[)82eO'2>A\ͷN5֖@U !Bɫwgf@pÊ )-U1ϒhLc,Q?Ɗ=f{uClE#f5 2`_sd;\p!P2d^2Lb;!Rͽձ 8uzN݈ύ#gr:ۆblY{] ƿ!d >U"ώ7 /.EJy|WB**g?$MU#pp#w?cNr)m)2Psr-jIW$~]dm2] t_M{@ubS)/\ ~GXd"~MX#_3_> &K, 0^S/BS,jG-]vnhޏ2r'Dg@mP! K^Ey"l;چ[?^R*kR3_zrwI X;֕ b.#k*Saե&98-O3$Q!g+싮Ӌ9Ư.S-I%2 ~?RHyHA.lQ9X[Dc씧G hi{j 2i?@,P~+D g 1"py(3ܑp LȣTڣhg6lzv-u[,]v3PM_0.އ Sm\Q>Ίk@-ټ\  PY\.0?7&O(p%v<=%r?wws _^Z<2cZN~ff A$k$q/oS'""7uB HlL(>(`(n nunۖ$dⳘ(VɂJ9bEo}5ahM0W[ч?#Պhٞ|Ʉ)~䵙sl?T(r~bZz? nGݙV߂\5OYIwL/w#bI)`eQ-}ۏ%BV8Il] ]5';Z1ŠL[w۞j!lOX^0.h;I.֦<ءE=?w;3Ξ/s)kn@pbA mf nw|]c郧py v|~Mb֔vN єfH&{o,B+gͱ '}?-eТAL2hsL,۹c|zJ F2R|>hMpw 6G|g*i N+I#U^r~ũ2X`Dj!9QhSAD5i3raǿ2҂`I)FhJ3.||'~A;kˀJ5u vo>DUb4`54VZ 2* TKgD&Szx*$@=B-\|=!736BtpT…Q#lx$+]˱vܡSܲS*[_۳sW"?t^ IiuI(,SIN+Uoj:Fv\x߶K[Y6@ 4eZx-cj  VmY7OX1o̖ǰ`;#kyըG%' L=pmPYA

    [LaR_:2O-BF@y_/9XP,Zcǚ.ɔ%4z'-QI'J^R y"gd"rCQC%+4==@y\S[9V//AA66@6!%rO!~4WhMx`R30 W-M.PEPTZr=~|;~HZH`rDғ0YA{<+a% S##s!\4~TƼ/cߋGBS-%v~ַƅ'gAm t,!հĸ2-f_kZS }LFmXwaS;q3?<v SsN7B@PU:?_( IejHġ!,\Եmr|x|S}+'O*epP*lZ0#w*hf 7wn.3`V?{ 4Jm["[Jk*ՅUݒC]~x(\T*SUV측*`4<Թ9({fɴ=sYa0 9h8EhsoxNe=(EeX)"$5@Z(2TtM@1.Ok]LjrRZh ԇ駸qyK7sҕR:; *W'3tA$ȏcd'n̨QߋHRw;&Ycb|1CnȐ][ƹmD}07NX%N^ۗ##䣃*4g7 r+ŝXpfzx3R O( 샅zN>j0IŁkzF+!Ah3i륬 vu53&ʔ Y {ŗFhXPb*D[Pjq,{_U[5Q/ #|uIfങ9~[*ڰs S$Gv$ZئU?WZj=G'6m^ki xHb;]#5ԞNг"Vc?ݏ9%wn/c̊N2hg$ikk<>`*a6타I(&!M q8kt@g#4QTuә``\~Oh00=`{<=⍟; `rJA_OُE=}(>X3`upgc^ 5B{X>:tL8WϔP>zI,ԫA2ڴ,C[FAN=cEN?nZ?g ݙ /(S7?WC)z~0dZwK?b`ӛG=9KMR>i;;:#u۫uhfJ({Y/Sؙ\$޽RY 9vxD]lq["QJ0oOWkhkaw/>}Gh)KZ$GF T)3$m}]m~ qLb3\¸51hG:L!P#$Y^qM~@35 &Ҽj({-/J`3]$%y[';S^{x=%ؖJ{T۲R=Pj'!!L#ӄ@ɇP⪉2ŜG0;,΄t݁O*!Zl\l͓E)inc% z+,L!c? a&},X C L,8?Cd1x,<EpS~?f8y@[]13!T?g !I_q?)w^ߞfzk-<|| hKuھ-]dX1HϤ,o"Lޗ)R4~v-/xyJ䠻U{RozP|ÇZ,UdLOP+w)3?n*""_iLބq 0[Az|cKS;Iuq_K`xwwhIC(-۵WwIXg`хOf=DB2$4^9 0<^߲Sf]O9w)#cXWa, UlczjH~TB3G=Hew yu8cS2 9Ҫ߼_o{:a`x ݔ+O1DzQ35ZLȓվOAQQ()1k\B良Bϑ8wreY@)esoM}" ?)t[_7[o`(8XyrW{THL΄ LdmMk HS|6WN3c}B>f'ʉ67=k6ʉMK5D715=qq1r~Պ|&A^ZeX _zgyKcކ),< !P=Dxxe+XR0$BeGFuI!EkQ0`$/%9*J,r HqRL6 L InZdVQv{y;>ߤ=S9W``KOPu'@mC{`)DS8i*9(LOS@YcHBƢ*Zbcn|K'I!_˖zxXP'\ 1Qe`WcEmc}#Q̫m4< O !;˫ cDxFFVp9Pd0r_X&q1|fq|,d6 f8,0 g{z7Zрx J$u XuĠ;k9%^p-WA=;Xe$G O6sї+'#C|l`N 5KS2^B C% j&5 N pc ])Z{*g] /*]EY>l^,\_)X+>e-A]G钿S8ӥ()L+A 3k9z(Z&x "%jXkY;Q8鉆| PX;trRxZ!x c{N,L%l6Kd+*'2?dC$'2M0m;y]^ 4 $NG+R},T_8}k|f)*ol&Է5.$ oX8HEkpÀn*U{@tDcR98h5懂}߉O`"VW.Q%'О/ˬ]!{8|,1>{[,514 d Vx&E-,m~N0P|,]$jR2W vÏ('i͓܍|8Aa d&z\-b#rq?N=3C2R46$#!a^(0T[! cϸK;?K *敪M,vta! XGf&ֻ 6_e7܀̈c8YGP 鱕0Te GD&IjUw00w@/DsClhdzwFc:61(ݙsqk5e$/q6!@}'|澘,.MT@ܭ/!1A;T(GLDbb'|>dlV,υ~_)s$i؉ ~zO`B W%-A5W%,=i)zՃ 0 ,Yfcd*$.)\$@S>٥49]ppe+冁13@D:g#ص6<߲7U,LPlWis0ga&s>g9 Tރ\Zf ar\J[T;G)/NOS1?)y{QtIX8G*2dҼ&`XMgW&} .;11gpr[™>#_}{"Br6<">;% J!Ct/ү0FFFR\3@0^^5W-1d)3ɜ0.`W;=%kAj sDaF AX" BrIR5f~_ȺeE  &JJ"aLdWQjUjz$h\^n0/R+'16ݿg@!*.W(Ȗw0 [7E2I%ǏVeKW M鳵9N ؐ2>4|ihM Uo+oNRY33x,ARQ/ݎd7R qb+@<'Z7 eWI- rX OغJH~Md&֭" j .ׇh"FIګ"XxGЇ3)m0 S j"Xzh ؆ 2Hr.@$?l* c@eVS,pt?S]3VACLq%=|ζ *@_2D\\d22~b϶~ Nhp5Ң5+fwI|[}2_P|+pB35_˛Bb91|OVYZa Vc[wit ʴcQM+bt4Ս +;ߤ|3Ha<X$:D N0 K )Lz>rb7>T]hsDߐCj=̓s5k)^%˯UFW_A1 +):(0 ȖB _Ah'pBր{h_(xhz &~o#abTW߃'Z_wmS2NP$*noZ{}:"ތҜ8H9 څ,ATBkJQv-^ac$ Bo1{1S#@C tXU|)Ad6Uۘ'aq Ep҉vF$h2*4s:dcJ\{o[d;8AFpyh&@8gcc %I:zV`p.;j78UD@]J[Yks6#'J8l,ft\6;W7%>Mᯎަ%4>"OC&+c@qXaT }ĈA0{ > ɿ> Jvo0*:Vkzp-)p)}@yNYq-h2J1j#_7܂ y k0ojpBGӉ@S4~ˏm:АˀTDʋQ`s|qu FA]mia/|PnbeI<`Ag#`2p/4 a#b։q ;q#lbTO|7R?09D3xJ9q[<Z +BCțV_o_R),h0*#f'hh<0hJ~Hq>ڣ]PӐ0p 'i/?xG{xqU rRϧQPHc@# )٫%?f"4'H#Kb ёiJx1n3I=`>鶳 Teρ`巖f6T^~A&<{\W񫯙ˎHxxMe\vjJAAǷd(&+UWdV-l;nLDȰiM3 Zs7'htM3.\1yg2%2 x^" o-͒[$Hrg[ mm}-OҀ6 XFY=2K wO|w\6.FNTep?yx˜}jkOVUVTsW{d֘(TOL:>g쒱uDV*dY*`̓jLhc'\N]qր6 5_x?l1uI{yr? @Č{8qIץ ̯a,ؑh*p' _7Ub^NtŔ2):0qz'$8H*>-ᖎsBOȈ WS)fCG]k4б9fSHNCreI.S ޾z8% 0r> 6 m*v_Q 91N&%2k{%r7Rg ϦR4vmKLRP؈0N O+|x&G@!1@ↄmXl,bsY{ FcgS]_խपosl9(Lb墛s_Ԁ6 ] eS9T݄^ךzoˋ3QJL*n >ZJJ3}1zNעRQbcĆIK KGyL֨p'$!)ć!_<OEs{0wwp'b\ST6@cWEeKzb;/6Ҙ'T5* d\4Q _Q,zzD8+6z^!3PIP F2c~&rБ[ VLȬ0+r4R._'C"q_4zI~ƠKq]z\\%ZTG%t8UZx\ MYBgUyIX4* jzgDLUٱu% {l#S7/HGN^ )e%Yc`l #X*P!-.|x$ҷ`HGCʳ QGq8F1 L \` B1B4^#gHNm`[z,Ą+D#Kc_\8Kd>ԼRwn=%;l,~Ca2v?[#e1ˢ #ЂnZJc-nyu>{},ާX?@5wjQ UsQmJ WyڇVRℝ4%ϩz̐Yf Tn‚SfjfFz*:W`C*CNVET ?rD}D$xѤJ*9f"͐~DErŘ ɫ8zCp_ w٫`(Y{Vڏ&`&@̞/3ak:aSR@y$0_?9Vy npRA1JL h6 l2{ 0Nt8պyNƤ, ʂj,LQG)e ,(ntv&iR+Ê3 ei0L ђH`b > Tik~n{ dH C9~U؂Q88cDI8d.<]yۑ2LPBU<s/MV </e8SNp |K^^^(kJ?""?\0dʪl ?A%Kepȳ稒04=tEÌY^ApBv?p5Pmmhb= 3( 0r0yb=]bB/PEh0)H6 Is=RtLȢƨ,/zdB{R$vWK]n| <תk)Č{ mRO0{qlBN[2u<1kSw08 ? |ٛS*U`,tדPd*yQa91'¦ 1c51q /x}_~sƵ[]ZCOOր6 <ݠjno++\͟z ^>Lc#:Kh(/[gm}CzٷY) 5Fsx TIY6[((nNH$O$gޮ#l Po@\3( o;\4">=(s'X0"x>.@<\'kbL *\A^ ِZD=\aow6vB+*uJ0p*_w'xYlaRDm]7Nb:((;+bNi O]Qx$0U I(sޯcA{auP n骪lFxx >#p"4&Ux,9_〒 wJssF)|.Taԉ.3$%0W9`BG U< obClVe CC.btFK7ІO>,,'mo`j -7;BmrfےU|nj{d9QPB#B00W(Тop/)±omWo[0폫+/?n)]}w k  A H{c`誧Y  bXY_Q#Hl*z'ր|kMO ]p1QU0kmtp%EHtbnHT$En{U|`0U m5}E) %@$0^% Y J "C؆{(3P?(^~a < %x#a#G^8>ج~!r3S 1Wƽ<6~6{x *dtRpC8ۧ%w]puMef}XkHl y *SWH0W(TC&g|SYn2p81 4H1 g>)lA r^⢹Ԁ6 P9Pl,BvB !9Z+1~@/U?b2o:0Kr?>UB&2]kyy w 4cS@ȠSI]x؉ TRMǹ(c'v‡9 6'Xң`!Ri6["КB<_!Ld=!L[G0p6dqQh j~kZy})ukP$5⋓fy>W%n2X-Ԩ=&l==Ei!g@@ fMܸz'xkR?И0a%>4e=M|HSǑ8~U>NkF"Yj8ȉ@m?ŞXY0,H0`x+468 v(5:rlC|Yiy"\gmB5ggІ3`cL+J{=FXjq<䳕QsT j׶яVQ`nCq.βWVv۷&I"D@CqC{ _,V\47Iu2$ ~v2Vh 7\No娌0pD K vHXu 0H.5z P8?93#Dzc܀z ${Ya6BJ Q9z7(]`xdfɻ4gS*r aOtl ʉ1U?W`K2|I*s0uc=n庍k$"Af=׀k~mZrKXVc|H:K],XSJr$J|L4dhIzKNxF'V`~:/Ã@a(C(~9#ҿ!j|M/hXL DxJaU@:PPdRv [v!~ ,Yh0 W` j5L@'(tXpсDLvؐp%䆡U؞a]- 4[.r6F@&,{H c=X e aaZ}[r>@yyyrJ4iR[sŴŬշcǪfZW:v~d/~uq1;-2@s_s*}А9X uVm!ӯ+A(tDR qgB vcUz74ɾq rpe<6j4gn̹4`Fsz[k-5kKw-_u]W"ys݌;)UĚhѭc  u?oΫ Eytm%$IOŗtv 4gK2T?-'Q2>0R1LE0VxA6!K{ lͰyx]>.تͬj\z*h[řc>ZK1ضmvm^usL{8Kc0*6loÅ_ђpƓk:玈Te2gcʝR"?Ez$-52 س1UOԎh"C䷭V9rz d0[1wZtg)"E:dȁu!zà0KC?@"Yh%t;$ѭ~hPb.?$C <}eʔ)(++Hl^'zL8.wYQW)/؎:X~[zw w5vof- J94HX;"wN+%(G@ /)@]걡FށL }䪱a#\bKQm]P)yYk8XFt4!o_(Ɂr@oTKg'߂ѕ#}SE eePy 3$!7.TM{}diȏgǤn7q9 ښjx\tuyÚgϛ7o2 }礦ʐ!C.+ퟛQQ.~}mg-5o';o3zhSLER)CF^!Ck3MFCp+XV_2¶v;3cŕe3ϊgW~iY QaVPûqT*#8gaES}REFw217ܟluHHkLXsw{ o.}_XX 5..NRRRlהUX1}T+K` ИSڽ W\MEG.<璻)?ZTy3Ptuzωϒԃҥ8 !W!wn zYꩁ0|}}+-m-0N???; 4l'鑵4@<y X[!7v5 < |i}@ "h h Tk=IIIryU_MPU'uW]EO.)N_Ix;r|-p -ʃV@_@j%4N#TN5(gåR>FA4U\جtXy#C:oQkA a0m4q68vjkID RyK$YRQ-SǷ*shiwpiB|nazN֭u9=aaPiO rl|L\H5K&>4K Pzl84w2.FA|I6WM0+5ZWQk5foրh@M|~a3 >3(JWR3y9]a++rL[dCZqhPշPd.rkn{6@E] PYrh+^W| ׌;)en~VB{_0޾*YGxHPY|*Ko;$]h@|ց Fv{U*LM2] Zp(2"4S1p Af. СftVu/m4z(qfxlwKHOm?}FiCFF+B3LOԢ55PaP~=JAuk<^X$} oP{K_ (@\AH 8ltNm[Wgw섊RdN ̑K԰GtA y[ZJ_іucC|d"hhXWa1aRAq$}%jlBeį%y/@9 fk`|YuHn;$^Z'v6 _>qJ2߱*宕7*d8O,[xwE풳?)enR;ngHHzD|o/͔Arx 8l.KϛiH^ž\wzၟ%o e)<=(to({ *k|:G5VՀ6 Z^Qa oJڻ?~H|5k}8&GX)+׬Ʊr 4SX׶ʵuTu,$6r#9JCei0j>P[؂ywdHJ^!ilqvu9r(P55P4ai()5(Jmm}k5`(#gC(anjmyL Wy*?NZ\.JtHE䙳1W?K .HMSl'[쓩=CdON-z%bk~]#U&|5rZ&Ar0_X~ٖ+C592+&Aw̋*iCerA>#}up4 }LA1P&k9=^na{Xi hlqv|>)zր@=zC#`j).mWQ+˯”_%z+9>dxZ*O/R0fL v5/^>>t9}%nSVؖY"l6nJx|$9O<+7Y%)̏FteTgqv1Φ 7j t$ \tX,34',6y Bqw7M &*a}BddW$iƴ"1)?L~.2խmN8->p肉~<9uh`ωȾ!ϙ#`"/="d qp8 a1>3="Lmw: !> DzAʇGbu? FFƓSXxGf6 cJ/U??>?MB/?rLNix)AH;5D80KӕqCÉxlPo"weʇY> 0t|vP'\56Ryux G2<*Ƴdۦ -Z1pS IGnjY%ߋK|$?QЂgyH te&Q c֌/N[0q;shH *>_ 6g􃪑G pq-p!K0)ҍ_n菓M)VAAin9!znEeޛ!7"sưH/$s.ꥌ߇c7ޝy3cC`hB{EO78w K{׺)?Ga FKO'@RVGgHwSXᚅzd19rp`C޿}UP_Cž /$< .@VٞP_2pghSeM譲01R|sis_,ׯ&^agV+uz h`\N` cdCZ8C·@''Gv  QTBЫr9H!gz,ObuyHHctd\s\^x *7v7k`Pd1ٚQ<W!|T CQwY!RkFcx/ bh O@TVڊԸZf2L3Q]c\X*9$~ʏ(0w?8V㹚5'S81U=e]#a]j$9q7BQ !¶_51 06/Ld^B!pb {xhَL_<qX >ʘ$r+RNRAWq1Gt$Ȼ t(!@H\ÐP!vU7irӔX垏$_K]Wcx\4 )R!pd #7LNoQx `ទԏ؅nJ|>WS8ph!6lH4DEn؏o G9~|W` x=g*O-a1~;YBx5IwL]qM1~J4fXQN̗Y SG5&x ͕9 I6ރȞ`(+KMYpSBmdP IjیWH08F!Nl1RxFhU*afkiPK`)YW^z_XDy&@,)i-_GS8gAhdڽu ޫYl.511V}#y7_/1H3pR|,]]}nV2$r3 p沫ȩ,QßĪ>\r<?1Ba(}1T-J[ ?2(x[,q0Cw ɒYx q('2|9 !!u,'#7jT&߉:k475_4 c;NCE**3`8 VFG#_h|@By o45VU/ɉd ]o*WRNKBOWSV9*FFzh"["0dI s0be_f%Ӏ0$ '85`4gۛ]@|x313 ꎩHH$q~qs;j&2?bno|T48#TH*iU>{zV 0pz eި8 +nr5Nj| dxy۶ #1]rw{PhH8v?jgn@Y&`7z{| @ y C4J5E&WY>ү@{2!bNp3;ʟ np4.f!̵th }PEL<*a zT jW+\`2@aXސ "r }c原+<NjZIvl3+_A#8d!$8 MGPgӃAZejD t (ń{p瘽AE)5aLKʟG/Vq$h"yvxdAAg'f7. dHcb~TElxTaKp$kSRZZ\)z#$2v >h&مe*$a`"V:.B*'л`6@$LWr%pA\ j' 01"umCeCX&@ 54.-?+)^f:V(Y0CJ" B!fp' ?)Q܉`Hb.-'Ch h 4O0j|Jz Q U@-z嘘˞o%m.sC]*%r#2VtA!R+{>R&^ު,d,)^`cP[`ݟJwNk"8ʘ)K,U)c*bIfc-LP!M? ?  AX Ύ/<0DL+@D0!&NC$a@̽<ΰiT ;~>qXt}rM!2 ۨOR;]I'J)$TIďV?6ý=EU\+z JL$C*8OG>m|ɪ?]cOP 0N@^7FFʋ(0Tء {dcddRS2eYq>@XXKWY.D6|d0ِlwhwRs9 !ѺbrmjBg:LXݑbe ̄`>Q"HFV,AI+۫I۠Ek@kyT"@Uy}Imt U2L_jr4!Ty8岍TDVFeIz ZZ5s0333%*ʶZ(EoJAW f屈:@'ُr\MLLteB t߯ ؗ |yl^ LK!2 o 0˦" C J27FlpߙHo?i :%!:d[VYّ 7 ]LE7^jJAAۼ'il5~";e=w~cR練<8/0LD8/ v:4o2 Sh1M5xwhθ3'WeH#`W(P jH3$W@cxl#28gX }x~rTIuU#7cܓfopyƫ9x=4oso畖_%}5ܒJ鞷Pax4W* 67&-{Rcivr:{\6[npbq1p+_Z*Eo.mYV^.hH,^HLvBѮ)Gk;n(<0On"'jﲳq>~3}yw9Ba``5Es縅a֡W MMUO`t9b#\qKC cJpM"4E 7#D! XR -ɐ`q${_[]C ՜>h2WLѧ aĶ0 lW\F!_fag#@߮Q َD0czlϵ Xi'p"#}jha8=8h xX3/c2^ |BG]jC IDAT)>MR̆|*K%=V(1wk@שQkSk|qo T< @N(BfvD$ ;l \ ɑӀ6 ZIׁ!lPZ: 0!"lG(,啿3Da62րր5 TEk@kn /6PjnK>]1Ek 4 6Pր@4^P.&"#2 jEk@ku5 կ]k@k 8h h 4L}55555С4 8`W0h_k h h h h t( hàC==Հ6 WZZZZZJ0PCFk@k@k@k@k}5 տրրրր@Ҁ6 :Ѓh_ hà}55555С4 8`W0h_k h h h h t( hàC==Հ6 WZZZZZJ0PCFk@k@k@k@k}5 տրրրր@@1 :[{0o$''e:TE:ԘZ{0{W_}/ӡl{LFաAk&88XZ2:4i :cwWTTHyyޟ1xwsmG3mt'ǥ55555ІA;(-.٧O9SRO>Y׎#Зnm ŋeʕChͤO?$7nw4?B{h@63ΐ ʷ~+g}%B˗/ /P6m$7||mqY}6Ԁjh@c js>sZ[azt74X=kK//// 999RXXh7Weeeg:txEw^ٳޘy p umJhCe奸rSD2s̶V+i 55Uy̆_xxdffunkRc!~ٰa#GʤI7|#<!w۹oǧ%[1z;ߖ6 :iX#F1A X%Z}j~HUPUc?Vb_ jQF5 &T3ھ땱>|tJ#U޽gi?=1A0.gyټ&O<ѼKok h  9=䎣~X&O-^{`ii\|j}7QG%\ӵi(WZe!ar?_n&6n69_|Qj{"+VPg?))) dC)7LϠfݍ\nƍ2o/OZZn]Dɍj\U߿O?t;n9i'$$ sr b : u |w}ҵkW9?VF '{juSO)ŋ1V$믗ѣG 7 +WTKxS0yUn10kDok q'I9B"z?&&F:pѤIk׮f)f =O_T5Cos=r+ {pP rw*/ f/ļ_ok h a>Jj`Æ &hgCۈseF@ٵϔC 5``O>̙3Gh%M0uR4>xd`,K^^yp3 hn@jj @Ȇ.0 A) U{JO7aԩ榵ɏ@;/X'^1ip_ h>;=6@aa̟?_]b pip<#(7xj \sop8W^yE=\" 4Y$9:餓ԮcǪs8}ܯEk@k}4 yVzӧLFɘ>fO<a4HCf: ra!/ZCfh"$$ľC$pb:E168c̻րրi n6f=\omzFa DH$\"G@4vqң[\/e۶rv!Ge_/$Qi b$ag$'DŘN> ! 1OZIV qA+rǂ))eY:Ehz X|[X|bQຮ:6|lQsyF rVx \ʍ+ r H r @r Fr H r @ @ @Ġ)` @ xOb!nqIENDB`factoextra/tools/README-determine-the-number-of-clusters-gap-statistics-1.png0000644000176200001440000006264713572034661026620 0ustar liggesusersPNG  IHDR ۤQ iCCPICC Profile8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o@IDATx]Uz.]&((*" l  JTPJ{osn\r䒻~!o_o{3f٘HIPE !?΍X(" ("(qeqE@PE@P(a+" @"QVE@Em۶T|yJ:5,XZhAܾ'޽ۡ{G 6tH v4s`4giO:zYٍ7w7o^ʜ93n.XҥKthS 6L֭[;2eJ,=?~|DSn]L%||C7oL/vH ͅ Ǐ9KĄ=zzYY޽i>}z]/^<-_ .L;wv?`h#0ՋKjԨ=ri'g̘^u3_./zG9]搦7uQ$I+N7ngφz7~ ;ۺu+}29C$b%Pܹ7ޠe˖رct}ϝ@TLdSgʕ+7oޤ}">1޽r'~>|x[\U-hɓUXѾCz;_~>l$_֭7nlZmڴi,Yt^x$߮]l)Rg,Rkmȳzƻ X6o?ᕣg`>}hm ŋOXb6c~=Ŋ+fͲ>^ںvv:ul{6ݳ!/_$,Rm…1D>y#ʕ;!ۇ~(+WN҇ b^J[L>矒d }QۨQl}c=f+[00 NH ?1cA93n8ifc4i_~UXQ&d06=Ge87b6vXl(QB#G}ȑÖ-[6ػw6:gϞm{饗]\;o7ʂفYEpC-]ԆE}Kb:)JBlZ7mw`PR?:o?zA;3fW(IL:t=۹s Ϝ9#m= ; cj^DRa2yӦM|^P09O4xn{0e3܁YꋂڨA p-ʗ/C9):,0㽲HElْX;&r,X aiLhMalg>y\]߿_1s yH"Xs0{X#fK#3Ӿeab 40,3XnmN& &[L&<ʢC,3r +j^˧SC.sy^\D*ь}uR2{ &aL0 :$s#`pEV`OiG#ueIaV*V.lܱdĖ&VďM/X ,z. hJ|^K<d cj M0ԁ D ~Ɂ`=a /[NIlV6+gϼ6\:d*#b$yW`Nf/$j4x=1Iエz[V`mҸPt`'rG' x1`2yÆ "'l0'(#rU cb3N%ߥJ0FCn@țCP i]p5&@ ;dseXbsJ80#VlNKPhJ >@w*pxQJQ~ yWE`ru{=?t""O.[5w2,ٞ={Xz۾ylz TɄL?Cg(3P؍Ü8셃`կMWuG8,re'w+ztص?˴žr _@Fc0mA0'dw\,l?d!ppL|J[I6@q&XĶ\=ƝC^✅/3RMQf xa߶j];oGyf~bkfPL{Z%a}0K dDiߔ]/@vf`O E@PBU )"(T l;TU("TE@PB;)"fmDPC@@"(AA@@P`FE@=;)"fmDPC 3L%{>]~[*^ZK(@L#;##P1R¥3nҲmu'.LГf4'rdLI()@x"wڴ׊"21E@KkN+"?PkPE ,P-4:pa7~nhtH{(>! '4{QEͨ">h8cwsD!M$NG#k"xF@g|i!p:qh:ybʒ.ݾ{?z]Qe|OeMCu/8< ]&7uy\EP2"(}T@fJ?n jA&M2d@9E@Pe򦴟"X2E@˛ ~:z^ChoP J%N])vBC*)@! ޙXPKP` Z"(ᇀ2{gcE@P,A@%0j%"LIS%O(dQPWc9į(z]UEJX֥(@! ^vUP+P`%q7о[W(1FF|qzyqn*(?-(@" l_v\PP~ZZPE@@ؾ:"(! ?tR%(q" :E@]AʑQRD@w޴׊"2! E@Obl 7yuiE@3k׮QϞ=PB>}zj֬?޽KÆ J*Qʔ)FzHe&NH5k֤ɓSŊiѢEh"(@Ag}iӦѷ~K3gΤPݺuӪ}̘1S֭i-[6Sڵ,YB۷g}V\I˗ Җ-[yZV8A UkS@P֭[iȑ4tPWN'OM6]͛ԿСuԉTB`^7ޠ-ZЛoIeʔS`A/yZ._M^Pgpª)AC ĉabŨp4{l#;Ydѷo_{ŋ۔(QD(cǎΝ;gEӦMiΜ9iz("@P۷2e$LgNO6'9\g̘Q x>zݻWs!?{,PPyݚ5k $~2oE@PbAeW\ů3ҥPC ;v,͛W^*2do?{}Q2‰'[*UZ/B'Nܤ7K22vw@"Ty%n`/^\dt!I$O0A&G}TNb0IתUv*RHAڵ}E:wL"E_]xqB}_I[nT^=;~׫@jhH0>U{$}r:p2;~I֐]O_pzP @T{1}zv3[wQw#E d`v9j(/d+ao&0ݻwԩSe;y1gk(p{9ءC.+wX۶mŮ`< í A(FQ~є?~#~9S!3N&L/)N7*3=c3CDN\{O̕7"W ) ֺ0 '[*_L[O3WWk24R<ˋPc91on ѩҫ2NbRݼٌҹf(Y+T LpӻX;V˗/,ș>ܹs… Cn32b'Ɵ~)AT;wn~l ˓r n'sQ6+O|4jmݵ%] zw }[yNl'Y+.p |8wF-0oE :$0e蒭(_4+S*ѭE>oxd AQkջ+krU:+aΛ4iR̀kR{2yje>iT"oFa57u#0I w'TuEӣ^Xl6RT4 ͛7Sҥ~"_皨D,J*)oSNtG>we݆sٳA9>{podgE`NXRK@)!d5jH?~\v ?"`8+U!3WuS%trgvmJ\xvW4B7Or>srr=A?֢N L@AӯJfLvVgn{NQ? Y棃_!-Iq!E [W>ؙ :;`|Hb#$„ꫯ%PrD1+PT)p/;5)CUJ+nJo2<);5ks6A#5E-i9sUFEe˖+Wڇ{uz b`ܽ/*&[I\qz Z6gn]0e 5|4؊ .lǣgϞ+V S tr,{'SdTtnxpzu+Eg3ɸD`^dNM'(.0 Z4xdAO<ha6m\6?ػ眵(I48lvh\Cq#l^TiIpwS8#p 41v!p-zfnl?)}kDI9ykшUs3 4?9ْcFCu7a#.^lx7O u*z~M^InK7߻a`#d95jH>o&wJ^v}DB˚5kF8HowߥٳS„ 8FP/t`ROv OIĂWxS A{Ye*J8"U{$ Y:%Oz-Lz3Iv 8 fA2o޾' V}"%0 %V -]TD9ʕ3guy`=4lb… ٳ]2ӷ~KճE|d'aJ2e=2,gO~\IY8GZvA}ZM,!zLrw gW_'1;St2缸ݻ7LDI`4ӸqW^KlfR+ph NgL//Ӱ ؼ }Zct/f7nܠ7ҦMdG(H8ҥ[ _vG+ ~,wjl4NX1"8&@Lˢ "NY 8zAɒ%׏6,M0f{8x~KE 0}Mub|*x=@?*qԔja+}(eT-$cОc {5m]4uo@X,<yۨrbXܳpa"/'c qL|zxTŋ@Tl"~^=V/$gP {_ $8qL7OYӥoJt3z.U &`(Y!rS7o>e z. (dJO>q["?S˖-#僋 8Ih߾}+ѳvH<^d;㖊[7Vcp63c箊( gf:ScfsDզU; ħS2tw"Clo ̗It`r&Lwݧmω99 {L e7 6TEde$,Tq$P,AYOxdNph +v(Na "\09HpRq̠Ν;S9LDl zkp>~$IJ ӛջNw8tV] ӡ{?dA4*WxŁ(riS¦#3dIJ7DDQ˰ )- r(F7ϕEf~?lXw@kL  fa1;c>{BcUT*& hS[ S<̄ӹ4i=sf݃!pAf8 uc|cG/B3Ďn'# m"򍙳ʲg6=:|j7$1/toYK/^36?(;}Li [+>ehZiěFsO R•-p xad?ge‡D |͢T`ftwbTz!zGQ2`eΝ WfWDE0Mib(Qw]ZEUO\z?`N"@I&#.ajcx[E4oAzD(8h6'VLB٤{ .ldYW>wky%03SW'S&KDvZnV9jS Ÿf[ pth%bq|fLj0d這Fe Z"Sd:`W dA03L$D0y~HUs^8N\&>VxTP ?\-|eAjxtF zJ\N_)rǼY<]SBIbV͡ 7@b_T$o<LQ tljv5fWo8cgy3W#7˜ | :[g7eC=O no Wv5<_`qVͪJlBa5i3z԰B>6U8oe'fegv|8qz+J`u<OgAPfε80-iV"Ks B"$0㖙j/i8 1ƅ]vEmcmjfNQ2orR)teM9~V1IQ Le?AOX>LniΤEKe^ĝZa={ |R}4Jp@-J`&(Ce8rG)@@1XtXfj% F`eZW?Рl}bJ8؜4i;GV!kq8nZlqxk͚5~~xI&r8q[{KXۨb~Ӳ1e{]aq@Fv#b{t#i /^LǏ'O_~Yi"d$l럞Bb ?)M61m[P|C J`n̙r (nҥʕ3g oVA6IJ"O > 6jԨA7`@vh̘1%,%փg#i4?FLܢ/;V8jQE@@'mۊ;\rI i֬Yr&`ʕqWɡA9Y&7-`p Pmꗠq%}٩'_J^!m'378x UL`U_">o[OS@()@x";{ow`٠_P\yu]8zQ؄@v0Dx+V%LjĄE>gU)O>`;嘾c7 o)n× hˁnN* F oQzI'Pڴi40,RJE0zSn׷׮]={RBĉ\fsB%_Nɓ  2'N5k"UX-Zd~ׇN_ vP˚E(DEFɕ.&m[OK]&YLקyݻiСTjUZn Կ>}М9shԨQ 6up36&͛ԯ_?inɒ%Ծ}{ =6l(1B\?2NJ~CO,Ja^$Y$^3^~gJ"ǎ:PZD9?ʕ+'B͛籺:uȡ.-`~wSL0CuQaId&*T9o0%#ʔZS7^Rhݺ5-_\5k۶m&MD?l& 4M6RHAڵr͛7gܹX&0(p6@nݺ(LFq`ǎonMX=i;N!IIDATCPC?C.Ӓ(eDTCW TXL4ZjE™Xd/&4ies='VCPނ!@Y;,u( Z)c|e˖H` /ݻw1Y_P#]E g~t$8`thp&a$Q|*ʧpq }~f%XѢE >w B0%(gAI& ô?i]R'w< ,]'VJp_Q x@biHgP)FڍFfXac%0PB>eh…QbjUx*F . CB޺sﺴE@>^3t >y$IBs sud` J&~.ע >BQ6i\~v-cM]P*^W,ǏO /0%lfO3W.,ϖ!L>^d8_l{_}'.RIE">֦Cș=(%ϳ@0$PQ]긴_O 2`vF?C!r9I?oiUuZO"ɾW{ΐڷ=]/ 5_~dUVۃkf׋b1+(3= $O4gC _;}ZN>䓄F 1X T!ٖx=6x,S 3 x% ƽ|dl:@"xĈg G}T?#V/>pS58'=xlߨOAVXVu0q  T}d_A`{-[h#+{Ox/MP"xa;a͞řg̍TWUK8F)3 @E OP^k&8~C wΜ9z6pE@4/aб+@#qPlY14bc.N ~X<Nł.C 6NMP [PC#@L]WGXE 2B4zpN!si}2l[wz ˇ|7֓>~E <z)!gTB1XO'7qCLBW%E@Q2Y ,(YϟOƍ@)t!o͈d&N(" cW?~(%H?6WL.X4kE@?5S's)Sd ~ĊG6x~ҙ8hG$'"x1h -4v6z8J"ĨƁSC7oތN1-("`B ڵkePB>}zj֬?%ϗFX΄z+FEuk9+"0A!؜9shԨQHޢu҆ (^;w{o%XUPAi۶-ժUH=zdɒrpB}g E@Pb)AeYfEEŋ:uc&LZj-ZH{w_~%崒"(q eFgϞ;|)ʟ?C/7W^+V\ҤI;%(3ul\i` TPN~.sN]v{Z*1¡iӦzngKK땠 ejE@*(Qv*V=Ǐ'ԭV5o>Ν;ӀQ]ʕ+W_}EӧO'&L@0;"8I$QUE@sI&H"b1c8Ϛ5,Y_tZ0 @IPE 2AU9rܹsb},Ñ{_Jng?N_tIN!NuIE@#t`ʡ̟oGIPE3Ay> 'n=F:nփt޴2 3WF:ܠPKP`)Z"(Ⴠ2yWSE@P,E@pje"]\O'MD2r8r)[b mA PdNGIPe~36К]':GJ?uoYWE p(ܙS|䐈R??gZ\P OXR"(1*cwmUPG@@SǿwН{~wDsE n! noKG&sWje@P$E@PB eF?" eAZQE P3P~#O)qĘϞc}$b=h;zI٘= @W\kwޥ;wPdɂƍ$I|-b11ׯS„ )c6sɃ)lsD(qľ<Sctg|Y؁(#ڵ|!s̶^zRg1bСCWc S>?ȩN2kIoX|򉌙m_5<4d{w}(eM>}ȘoݺeM^“۷o_/KMu~"(ዀ2}wsE@PB BTPҥ)iҤ'ܰaI (L-@y*[g9UׯS|ҫzN#q[.2W_}n޼IG&64h@+W Δ)E5zfŊbݦMAc _̙3t?C_)W0fW_Qjɖ_2>#߿?թSƎK/0@Epqs/e˖>SYX͝;rGTʜ2j({~뭷nݺ_x񬁁J~ xⶴi` ڼ/Ox5hД)SĆx4//iy'"īi݆Dy 2Ɠqo/I.6gϞmc-gp4{_qF6 w6iI6ε,X^7Ӭjزe-~3f؛۱ce޼y4/T'EcqFʟ?y_]v7˗ǜգEQ@ l׃A|0HD_=\06Rpm{~ 2!CxaoiӦ8Hw{O.3~)Fb\pHL Zil n]o߾]&G#0@oA,qt֍XT i:tT4n8R(F +.s;1I|@  (Xz%m&$Y hsB+qsNыi~G[x#!J)E <1XD rQȧ͟@$]44l| fs6hҤE`v-X0$D]g `x,o6>d}|6nZj֬)oX$dcų.j[t]wlE']!6 01;w.(me47۠PʲիF}]jUi `&bw&}y; 0{Y0p[ (c`2зX4ofq$ء?ak}~L^t>B2")VE_WE LP/N((A-(@" L_v;<2DZ%E Po ώ(E.w ڍ27p )|q\|@IEϗONRƊwwhV56ס 6{$nPzF߾} ރa뮯 Q(=И+E `x FؕwPw}F7l04`Bvsag_r i=A`=ZOsネ`JA@@pps B]vu;v(Dׯ_I!4q`BFTĉI&tcb l&F;dW |Q<+w߉ua15! Ll㣿:muE! 7% /&@ M".?f?!?^v 'E]%&{lD$8]`7`ʨ LN0QL`~h?1mkCPR,C}YW ,A<=ݐ{!'O{?DI^n9GD3ApqV mڷmcF!i'O ޡؘ/( q v NԧOǎ$DB!=""a  :D n( nxwJfwm}+<~@B()ADD ÷w_8p"OVX:+35IZ "k\ ~ bHJg&dJ |C ճADh氊oժ=䓄~#X@veF,[ D[C=uaG]LTٳɈU~}n-Sk3! ۆPtF#i+s$ȧ[|xtf],b2`Pb Aοg{ߛ<ÇK(E>01ʕ+RÝ lyQ*C 2@7gtOC'ՕrJfs,_wD:ꀛgL "2s\{ĥ2W,oa͘1AY$2UۂJgOxX$@ ERpP\dk|1}o0smf\maI+^0%L@] &,\Сş9sޞC77PbEl&X7nݺeNg}& ]0X 8Pl"  0A0{ԨQԢEH}B&sS(q 笘7Q=z \x߁E@@`+$2-11 6Vϲ0Dsq!!GIFh?1;0iw's^`RGl\ۚOG mM0A,aV@1+Jmj4'I?2x$uexujIRJW,[QV@X*쐇X.%SH[ns'pgckӦ l )`θova㕿-mڴoUR\2[rCi2kЈ`SY ( U=~{ q+b (! 0D=P\O-v8` LPbCo~܌ppsUYM >(@H :x E@P2c-*"(נPE (>ڢ"(!2x E@P2c-*"(נPE (>ڢ"(!2x E@Pt6~IENDB`factoextra/tools/README-pca-variable-colors-by-contributions-1.png0000644000176200001440000016102413572034643024521 0ustar liggesusersPNG  IHDRqZb iCCPICC Profile8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o@IDATx]e~"ݺC ;vz8/RJ]h]wNd-F&/7<3w^I#h4"`hz0F@#hA#h4Q@@3(h4fh4@ 8 !5F@#4F@#4zHF@#hF@#D̀R#h4{@#h4Q@@3(h4fh4@Ga̰ caΝxaJgӦMx'pgSO-;.\7xw}7ZhixQ^=p s}iӦkm.͛5lRRW}bԨQKZiӦaX,ܹ3n&4oܫ?/?86oތ;Z<5@"jHB?0+;&NXOY|ym=_Ν)]۶m]~zSr{t.HQFƍP;:5<ȑ#4R߈jN:&'t,Y]rZܴݰanݪ>vBnn.~\RIB)wygal2_uUW]ժU5\>@>74@ #W Z2oԇ9UTe^}%.ԩSo) ;;T]䌥K")Wd/^\\؁TLhʔ)8|n8p@13{Պ-Z(bL8B1T2[^{5L0=.P]mP˖-+`ݺu4`_{A$g\|8x >s&z[#.1/,/PjO>%+##uQ;v(u\A_~>lզ$վ/KT"QuʶkvO14hk.qfzm᫂.((pYg?_ap8]% v ~yR~Fh4"221cx+++˕U~X]믿r]yOfJ20}W]ڶm[ ,: /tjUw߹jժ"0 cݻu׍7ިA ذqs=.FE"t:OilCf?5kָ#1`Q1f- ׀~;vzմ:G$hwF@#0+qǀ 4uȄƝ̔LOw(~_ݽbTm Y7>WvW(P웪?8Qrub>O,*jWJJJ F>bp '(;AvQ3eVQ%\N7?IjBh\ňqF%D_F@#K.D^xt ZxtdagQF:ySVI6=zO?"i>VZl؟Hjsbh?6lƏyɉK\'7.M~֭[p 1o)%i7A5jPt{ii/g(I%5k[oU9`q$&щj껿} ~) &<쳪_chb d-e<*ɀl٢|/֯q$.СIy] x}B믿^1@hUo޽U,HoۗDU7tTb;QytZv難_bXd'Oؓ+%2wz3>k,Dr޽;UqegG+VJ9A~uwQ9҈֤hbdt7n(2 $*juYΚ5 dd(~嗽&3=><8a3)u]z`{2tQ{DLޗ{e.qq?k5;zU8%Tve78.O^̙/ Ϋ:(v̀+{e@T%}y sT駟vuE_ Q'%HS7lڀ{5Wz. cQJ N:.ù Egs9_4NAG-:hVه8.R6!CxyW]wy\ti}JKs=i-Gbj׿/]TFL7ϼ/F F8`7%:eJRlۦM%վ[J$%Rʤږ@H3fz});0m-$_%&MTFZK&1cn6lp~iww6L6 RwJ2xiWҹ(Mڵ+uj⥮3XF@#YbE!i #R=;j'4f=zDI^KT.JbgV9JG œW/RrM)D2ʈ3f/]_ ^Jwq_};*cFpƧf͚.펹6g]1%^^{}L#  '$*O$t,Qc-h((g$eA칿mOXXM1M3j*r+0MizpWd[TtF jh5F@#P[pUzF@#`~4653h48D@38zIF@#`~4653h48D@38zIF@#`~4653h48D@38zIF@#`~4653h48D@3c%M{9?IEipVVW'3McyH3)3X}JcF:[ܬsyi|ʚb֬d,4a$ߏ5k֘6J4P0 Bp4gg*؀lh4!pEF@#TݥF@#h*B@35F@#4KF@#TF@#>7o)S[nD-IUо}{U%uj4 X F@#Gt=F@#h4F@#h@T0Κ5e^&M¾}mjbܼyN OY#PIƀw}WgEpUWa˖-e4 0`̞=;T0`>t.r373o⮻…^?zF@#hb OF&ݵkWX={ď??dƍ.]_KU +hD1H=xYQ؛y~İd#Se<_w<2Du~nݪqƀbչ)))xe5p*;?y~֟uD L"9fT? [珞ok|xСC1g]Ao9rD]v}ÇXb6BVZ!yz}ԸYQC(ݻWOigTyoSfMcΗVX;I'y_և̆p/?X[pP˗W5(_}$&m8 3΍jԨaU9שSK.u_ 4pP!@Ç.?4U^P ʿl,w5נE~ 52cL!]vy'2L:!!~F S[|fЧOU*:2~} ˪3=zTAd=_JHXn] 1ԨQ[hJ"`*Lu#<^=TuWرcK@UjAۆz> 4=+{HbB;p[;xAh*E${Tzew%]mÇH|HpKddfQ39R%K[.oqFFB[Mַp7^h;nyؾ}6ldޔ1Kڀi!m"W53\KiTi}|AcTtIݶe˖M[+8M#޽z  0|e71_h^Ju @t0=.C#y4|!L 1x%u7tlڴP2^j05etq\zq ?(6aE!`dT1SCmma>"S2Km֭k|ӆO[1%ƍk'\ = lW ͇-L@iAJL\UJKFURAOjJEx*^V^*47AJRcsb^U M(qTKIͤ)/uJaDUuF̀{܎Z05NIX%9mP8 MQ%$+ګW/SZv? }l+ґtjfKaIk&yCm?|)jzڵꅄJLI#hW6Zʖԏw ql1S<Ʋ-a&-$^W^\{6Fk~:SRn׬vݏ!f~وv޽{{ىfPN==fpͶ{OVz*VWFhi2HBztbq+K(cp9K] jF:v쨘.}x̘1C9uEى@ 鶱@Lcsz@ȚR~w`IVpYgs*$?.L|7w@eo/ +-Ⱦ9ñRW**@}Q8cㅿ1&G}K'5~uM$K <^-,;l=ȕs Q{^_=qTo]+5 '|*τ%&MRS0|XEg]Q&G%^hҤ 8 ZLڢ6 >?^'}( 'Uw}fKЭXB=(q1BIj/Yk4nZ>h$@fCx9YEuMy u/"vה w ]2C^$ <_5q C/9^xܧ>juw _Ep乙kzw27|e6B3̤.ܧI#`vٯd Be+fC~}흞KItџQp'^ZImm;ةJE+t"F{ڕ j$\`>Ň$LRW\\E,@ajcm^-FI]kHs<("ҬE0z2liʔ)*G&fAVOa"0rHU VbxHv0!.$ {|Iٳʜ5|L:U=$#օ} *h}'@^cN;-,̷zF T^'t Sjm۶xݝF 8nq{Rgʔ^g7/x\wU]vP{{ڴi`?:tU#̱n-:D} /bB_Lꩧ-%o݀ZmeԱ 3v<]!(L{@ Dz(ݟ0QdEO7 ̀,NCVD'm&NCګ$eqHk"IC Hyf.C[vpfB#9= 3LjiߑkAʄŤ US<݌0!1=|sc SiZRW^Qm/(?c~(ġ?񄲺(sf~hyoj:WVXZup~kE+z!ȝ$r7.EXau\5Z=\n ߽R9UpX!e7}ٖ K`i~a~xx]8l2czGi-JAL3=XHoBn(jH|5ke@!̜9;v@߾}Ѻu\L[1c.@dFʦ?41J2.How Q}P|RdńG)\ȬbSޑ(kޢx>€ӎU)XNɽCBqș,F?5NnA/@WAbjHv}|!yРA}Μ98p C/hj *W 27ql2>͍c@]q3WZg˘Xgh؁K;ٶpddx5_RΚt#^/%F礜bk8>6ȿǮs_Hr?Qb8j4#u}긽V{|3'4BW|W { ;$wijrޖ(c`D} /L0HvРAh֬_{n~MF ˋ!D93O ; ԣN <+Љ6\YN\?ERݝ@qFT|n}q.(kРrr>pݎ6jMmIj=5Z/w&mp_x|CgjP{ W~w#rU{8ˋ*/3P p(P4ITO4I Y^z&ebw l#}+_~C@B^Q~"$;n_W`!..D`KMq! :5Wִzp s&9oAiy^"zDp3;<2e"O^ 6N 6=iѤ W=o>|`1ڝL{*Zai>FbSaI(lRɾ^" ;nTWXk޸#up=X$p'e•OkM}\yY >ֆ]*uRb3 NAbHh$!^U/}Q-WRI#,8[ rH1ђC>{ G:ldE Z9plJaIpIڷ@Jkf" HbT1[2ToqnI-6lQd=ֆ۶Z<sBxHEw7qaJ̝N_ fҤ̀ADlܸQ=ԩ#G"9X芉 Su*$[8QCTEDΌGXpRUh T WwKc[fS۸zd|ɋAjz\~3|pԬYS SI#(گZJyf6mU9U(. 3cAl,(9mTv_Tڞ!jH;r%Uᖙu'*i! 7]]$V[+Ca3,fk^|_.3aޖk5g2 ,fx2D̀~ %?SebXmSGk>,~{ 6)R%^b6c`t$45Jrvp\| :dai8u|tHO5[U-NYsFDN<6*h}ȄuP![5Oδ9͝;W"K1ՔxLa\g}~彜q$Fe% ] W=o0 VQEaԲyJD)Se1_d\e&WM#K1%loot{- ȕfB|f[6?s/fPQP:`T!R@j4iB@3ಐ1e˖xC&`nZMAeJCWPkjK41pJ,]xX 8s$ݺu+z*WKi%/4i8VN+pmٲ7 7WF3) ӆNu'X̀M~I^x1Zl֒&!bӳ6hKFb 8bjX Z(u:< ėYX:t(.-gԨlZʀ6!( gQפD@3`O4LMJe&5;#wqXɵg#{7GnP-GĜ=zڵkA&f&K/.2HSw7o^i@ѣPп c͜9YYY2ASdTknAt,@dzhڇnq=K̀ÍpNT;5NKTC'K^I7M*V }3eqA,Z Ss2GxzjYFJSI}`dsOBe?h޽;[gh՛o߾]yIii.eҙ{#;:#6l9s(SSdGף ̀Mp5hݷ~`u#MG [AKBYvU \9p@\=>4UM46u7oXW!3V2DQ p W~TQ?Ũ\( j؃Y-IۃtL0G"_vRs!< EpHpƍ1:]C6\_>֭VZm۶uz^aD@30[QLQGf͚EHH%v60KLnؕ5U5:vV/eEޒͳbVJY}sMÇ// ;rN9Wٽ# :G,K heMjbbF s#1YyUڡ .n -|tUل|:=[{קːeb`Ǻ|BI u v~ئ)x"΀^T֓xoflЊ+pw_"}K:W@O/=<qbو/}5Ν;0#VV(}( &aP5#~>;aҠڈ7)U-ݻhMHI,sڴiXfCi07]h _׬Y7k B9BݮQ| w%)J$J|rG;ń 0lذA_0.b׫)~`8R( 37`½=УuTpՆmsKxSV%m=-XB 00~x;o&jUV8s0n8ՎYa.2u /4*-pQ-ާu5d't qS]e]y؛[D.5u@YuMhDE<[솞9tV2$cK{%(/=QmؾaU0=u8 Wߣ%(mvTSX b{թw+u}_R;O}<c N7*BOkKX2@ /{fօiWGDX&E-|hwhwgj?m2ޗts╪͚CGph&8sQ]/*@ܞu'Δ9v/;{uν1i&| z~ ޖ˂W8BL i}Q\ieV6F!ӶIVSCg. ha\:ܰ.1H7̜3^mo7msOoluNhX1yjۓ=!\6uFN[rD^LܾYlħ4ni?`0uWpvӆyImshw¢-v0ՋdTde8GR0Q}\,q Z::xa#DL/E*& wdz.J)ۓ832qJn4U824Vf㙘·qƪPCM'4_?f 2uP ]գp ',k\pP6弲b-:TCz!_<55^( k60 O-ƣu -)[Փ*W1=!_Բw7G+DN;64Nc>~ [nUϞ8]f\/2y&NS@@ف X5+fܳv Q@u⹜$j$"]>a5ڵ/-/Dgy-`,|~3.*ih/fr{Ebs^ou(i Zcރd6dkil[ķLhffAVh\F'&`X 䲫݁ZG #D|MVxJо#%ڈ]w/3JBKO[39 7M& +h-Q8wI7SŠ}$[ ȒUj~O$U'HF\ sk 0c~ZuH?(巶ț1O hD3o|9T)vP#)x&:F2,Hlf|CQ<|h믕'\ᦛnBq '|*V:uJ\ Ap4`FVb0"x`ep(|<qSoR3>*{"biqaP3_c~7٘1pe\0sD3op}Sh*&7ܤp%fնJç*;߱JBRQVe%AҧЬl)Y?>nV/`;'|JWH l:R xLb/ݺukeϤQ, ֭[-r-REke͐KU ɣ :a ckS*Utnd*OD@A Mg}&MR9s <O>o ^^>qѻvR37mȕ!̀D~5 ̖RIMLjd[S3 M^-ަSILq'N]a;SqW9^ޝ z98kݍ& ɒ' zO ;eJGU^[\ %  3%iMUUЬc2w}*ĈvWzyx@aÔ3C6\TYuY?~<[VE~8}j>%C3bSJV?S>G0ϢJ{x?WsJb|ŒPM"$~&nSоckz;cS% }´"Y['|RXISYq!}U]vJ`bv1/ӉR-M4TϚ5KgH:Du. ړe}Qʛ!Cø袋TA?zaznf"G/­~+|qKj#v9E: ޯzOgdy'@Ι6b *mPw[oIjؒJ{,: UY'N"N,!xH\ztc}դXo[+7#WوɴD`;|HX}*:UtNyW_QoJKOrk^j=_x,2ESfM^Y'[ STy&'44z{P? Id-~J1ZMlV;z'5>Y^I vNWRW"k3Hl8 z%N|p"r7~+g"1MyL7@v;{vq3fa͡H#YSJAJ=۶whbF=@gS/gG>qx5Ԯ=x#wױ N{?]6:Tw߽E(!FG݃ϩsS/Q{Xj˂ G}N`y*fhkJg,TFhx=h O gv?O Y\]9 U}zN7*s*@T|@PeQ"6;7YHهzmX[E6lf_c [&1a`}`MAZ::21VU窏 %`?Q܌lz>E}3lV/ځ]ok Rٴ<f܃3$F$4Z3H_B:c 9Rj@ 8g?pڅY[>O8NIdb~ wXࣛo6nbeNDՉ5smXkHQ+B@+BH37)Ls4ms[FUM2 ,Կd[냕GY֦]Ty„!\^|a/Zu_%kCz+g yR7wѱB^kጰLvհT3`?P3r?ُڄ8-jURJ^ePRO;C ( ̮NX.\ZIF 9&Е}Il܆m`mf]`mQR^g5jPcV/cڄc0Tqͮ~N u@¾?%qs7!@Dul8dMh.%87-ErbYI[,gnp|4 k2(*(&9t>W{!W0ĀyɌV\s2fD"Pa;u2/#odbpOכˆ8$gjPb:`NJ߫ΑWM);v?z6͏Qŷ,ipx%jք~µaڱFxtx5TCMh5 ^Xtx`͛I .:nܸͺ+,Z ޅ)U/ŞO[肇E:j;0fcILeXIq!W\/mriwoS/gaɏve{nٙKI\™1ٲe}2)^@M0A1Z!f3fnSꍞ={ :HlHbGڏ*UѪYhd-{{>o/~'Ul˱fUdf,zj"6 '@&8ip$ _44);@qٔ%)EW#H|F8nED++aճ+7 IYb0b,g ' !.S\p~R Ru\`]8/z9BvFl|5ܺu+j= ^[}Gf 9p;׃i =7./'xP6f`7(oHP` 9d,AOŒOC׼h㧰v 9RY)>G?`z,Ymb>8س vk;:%ku+l}NuijCKx\? 9rdFQA#tڻw] 2pi`~)yYt)֬YC!y^ѿrĺ['~͇ 0xla]eSZZc&Y>~> yKif ͯbry_w Ms7o0sI9 ă ޸Ib p Hyk# 5nXK1Ƙ;>i6R0+#u3,;S+;vSNQn֭&Mgoe7+Sm+ă>-Z{رcrW|ӧ߯l /D7iUa-F{2cx͋Wb\pdlH4΁}E%gwR^YWan [ms = {Sþm(jjg{r88.Gk- \Vڦ/λ'LjȆ(W\nT rR9s˗/W=N>YLy2Cq׫9Ιg&A|;v߮q%aSfEք4pj>E%Z)>8vPHn 9-Grl\|q !cݟ^Hg!HOٷgR\5bMzd2,!SܶJ:_=%ah($^J W}l I7^E-9˕ |aOp W~\:G^0IN~'Y1M CƲM|$/,q{?;km"E4tS&+^}m!e~@A&EeL xJ 8 mۆ{*;!O Bo$0K78?\QMz6z$yLCKŞ-56ly䶉G pєX'։ Jk$dK8Z2j.L"9 죮U__r-USxG"[orloE?V,#א-+ Qrn\9%s#=l݊Mh*Rz^1DIQ'HƩ~įd$yGu;!ǽڅU$?ueluF=$|ybK/XC|a%cϛo,2` qϣG˕۶mc(WEsEWR@Zې2w JuS%:[U=$0g|ݕ/OLx 灝p̖t328OD]kiX<.[EZd\-+ݧZ \{΍֎o/I%AnX y%.[%zPM|$n[ܣae} P4SQ*\vx7 ~qHbM4̧v2͎5lWᲨ8N$ڃ-[ LA;2gdT R.EKrSEgJhD0?4u-iaT~6ĪCG0i8RP b@Xx(?=<y׵A╞(jۛt1H_T$|^dO%1.{!-!I;pq|>ۼfqۛ6uc*WYOT{ \`I'g}W]#YЏgr[;tPSO)OhwAMH(yneWЖ p7}-2 YC_lGKF7zVv5C^FJ] laERGjpLOѡFdň)@}LYފT•ω$ C/[4=,5~R۰6Hhs:w38Kt/w̟L1爻)6p0l\*De= rt>s9'^JV.&?zjrԵkW)K/lYVBNNNct_f]@TbJms䟞gER1Y |&''UۭOPj>.I&v\zt([v_gMfJ-8=/Dz!:^]~TUc$S2_Y#х_>8bRu!ău&}$*u%²g(O^xx*c6lXwa EN:ꢱ2P*ME#`3A/%V7T?#?><"|TTeST~|&5qǼE٨>)vbl[ò8Ky$G^btHK[nCSo(|szo[Dm֩8R&x߬%%oF'خPӰ:MJ(R/\<܆TJp]ۥ2R9޻t +8MmI~X3ZET8,R?6:>'T.~pM7)gz>`x'2`m U&f"꓿c*r$qχ$3N'4mx pHJ>N 6H3Kۺ6kOHOc^7k -I G czW2mJ'ZSjkOvvܣؖƛ~ N{svg->D=3EќŃ3IH}yȘېt$UF]ӏhC `s# u >~H f%:X97>WRc=̡]%S~=6eFW 4 3Ήտ Bom 5DFnRȼ)9Se)JG.>C֘p#7$2={bŊevFhsg~ed1DSWoϡZ#w%nj#IyRGnB!Eb8ɧ߃YzA9ʯ;srU &b _'W/z0;$]#$qI9w`עRd_qisiZȀk7Au“\|2DeR|eGy|a,u/D]M=p vϕL[o!kS`g"8$5 92E3>s6qn<* ;㴵oIqO5#",McJG*uI8 S'Oؙ*aY::yö2N0|#B`i?k+G}4P v%M*VdE]wݥlOT>.hS9y.)3)MfÔ=!DkIog&5R{@z*=r6Ri*jzJ(r?O/mzdyh(?q"63X=>y)sdR.K6sߙ /E pJtZjq*-:dVw8夯g*@ ]RRȩ!?'NXZc>1`x˩ 8P8RI 8V]@Y>B s8w4[vJxPS:?}FoTa.-)lԩi}Ga7'ظeH3f 6;qh_ґPB> &x:\U27M}Oj2j!r7RiRnO]$K:9BxBm?ϥ&cRJ'Ȝwyhd-;MIReoxN-lu̘`)̗,6O n=S3G g#?'S_.z?!9Ю|YM|2lb:koFþX0h>U ^^0fH7p}BW_}`NnݺҥK)Bw Ggwy}#y<Ż+R2ŴFiW  ~=Rn:gpUYy.g79DǏĚ%ذ[rN"Ť3%sJ{<51dU灡{K0^Tp3hy;_ciRހC8aJ*3)6$LJ`ƟqfdEӹsѭd~6İ5ǨdUڇ'{3OY6v+ʲQsd+e JɉqFҵ Q7i;A Tа;}\RLP!yUO}y_/z7ȑ#t׋?ɓi߾}tEXX,=kڸ1~O?I{bf5Ha;,\)!"AE %鰱Rb|gSۇW_o=E:JF@ GNHڂ=YmbXu˝ظi]z\7-Y`q jj5ٮ ғ[XbigՉY˯߰lPZC=Q]ƫJ(&Q  DՆz$q5k4z^r7H+a/;-X5h\¹+M̘/cK3U@淨pbʞw.ӺSgttq~r2&uiz_ͅkźRWu;}:="?] _} 5j#.gonIO^-3D 6lX[Le?r0g^B'4#Át˰`˗.=l;Pё#TT˙STj/>H`8Ojc1 :&TX-\Z}_1<3Bzkq>r2Xc|+f\%'x.r85˽wS.%%`A_xW^y%~[={"($+OӧOwJ5C p2hNyj<;̧ /Sį8qj)ՓEf<2`kQ&2_ɱ)-Xo֨R?]1"TmJ:sP \Y+stM^Vkރs =P_VY|=/Ğԁ`ƅD'e^hؚ4knk{z_=Ha]:- ǑЏ*bL6ױ򿄝36nLY`>ĻVEӨq_$k}J'ZX= U9:1%/g3,OJ&1[qrͼG'C&z vGm.sIvS n^)S?$%lӦ }gtF.R =P`:x{ǷXuVJ;g.zvnRɞo)Lr]<[ZXJg9#n|r-E9׹\k^{J8ΰ5TjO A(CT'ly3Ww\k6zGX݇G*N+/{Rȷ]TŧT';uJ/& gJ:{_jߩ`3d>u~֋w~NkÒ2$`隸L*uVK;i9^Di;]cdj4!s_Qxjˣ)X2X0Mם͋c`/-EA{N I\:n~ C']Bjx}U` [PgL"SѠ<1+ϻ܉b F#5Wd2%c4IxE[Xe S ⣬NϻtBϘJQ̰*5Oْ'~N[g9lI&0sm+_XŒQM){մv٬&`% sr;I(7Tpk2`|S`t Zxtnz?qmcupff%1 &zt><vVS\ˋvײ픳_\/rٮ\9*pȣvLNVv?i6aY 떜2Q1N(ֱ<튫W^ Qvɧn<7tX׭[G3f 5mZ|Ѫ4tX݆+^ІFR#R e4ՃIWmXQE'G"S }qu*f;g%k#ۧ_8 2c%ŒCgv-O<4]d+,61 xԒb㢩hݳng:6!)G!߿Ď8 =Rpx0`e`54~pCˢmPᦗL`^ .?mr N0=y٘4ye ٺs#3\5Ds2`lXzM?-Y:uIe TìJusQ$`[L&CX: qX9n)v.*م TbkJAz{YK?0C!%`ji`m xzӹBBB⇤o+:ƒVNd{p783 \xPg|>ONZ3#QHƨg PC/IS}t/(%Ǐ *ƶ;$?g~616 8ls0w#T$VuX`ͅ9H9?3tplj@^/L`YUչe]%Q@\DCTKN x%^v 33G;!Dm3Uil?(u(WGFCoM*^3[pą{C 4ԋ\A_53Ik׮ ;vAۗ4!ST[1Je~3rYe~!l5˹rهm[=dU 6tf.VQy>z DdcI{G_;IQ44Ub]v?V_?#_$}O_(lQ]Ȅ5Y.o%JҼFQee؃ÆodGf~&/X~&6J`yTAuӬ\beoAND2ϋ$ZkԼDf eoL}: uey"jp&HرcHJXM jgk!& )^a΅UBB:KP1\hs+/`A Κ5rsU~q aWX~==4~xz뭷k?鯼 mݺ:t@3gΤ7xZlt;lܟci-cX_g 1~?GB^窛D}w621s;+"걊OئS~=jOG%3DZ[cKg)\9O#?Lv|*jvd͙][<;d$ Lւm~t-|$&CSU_S KKY"`cqdr`G"V0֊b1*Rc|[vjbjX !fFszz3ߩlg}V%QUTJLcaYL\MXJP|rgg.Z]>Qu~ߜ74zu7 DJRr|/_>jذ׊G&L4c ի]r%t7Z oF:KC0,( l+)MgI#N?^Ӆrt _>v^ؙK@Gڷ]]a* gqRLUu6.d QG 7oJ1.oq#dr'ѱT zNWO\s~v0=20YR_jS5gu<W>hv=Rt:tHZ,7>s$t'e9ELQzjaR(aW&P!=6VI}vP!;6雌!fe!(_ױAt;E*\ryWpc^w >.yJc.~6}hRj>Ǒ?ՍRهjDjs uIM>g.у8VAgp_pxpĤ-;:D~<mƺ@IDAT!Ǡ3xNJv}LK~Dͤh;u9r^kRo#?Hvʋ΢3,%r fzXUwAoW7%^GZ Ey^_H )nw0sm>|,Xpx%9]֊_fQEVL4Nlpx}h`R&$pLy91b~8=sx8)UxT10459駟ԻzU..;Lp-rᦛn'|}7r&jpw9$﫯[T4iҤJ ?gy&}駕w}wsL=<@s(xoP,;GjiL1=ر#=þtUej0ܹs'\2("YlPq wo.o6a@HIl].((]\6!M3dD 1ȇ#,f栯;ФInk\Bxb)|- zd0K.ζ f۞J$֭[+%f"0|pQ )QU0TqKo ғczg)PYI`rpBh6g9=P-3St*+p;n}uCؖ^~i͔x5IѩQ뇲sy*]viLUeCKt$F[*G5gRXa(K޽sq7ѥH/\G#z5&#G#h{9wcw 'RQg Kiܭw(LdPo|C &ܿ-_.Yx9 N !@F f_uz}Y̬j* 3‹:*=̡{JPf 6mHyzfZhA{ka2/3ODڏ`簟QvV)XcםQVSdf I2CRK㖲"fLyfaq/~5}q{fj`T T;d;H8'M1Ԡ9EH̑QZ Lx ڔ3OFYw2ԊzB}_Znھl֐}Zm^Fph~v/"ŃI1|6Ƌ4q=nq^]_}y'u8/>< =~}3~w}ֻk`(Ӕ֥tJo0y=;R=K}/+5Zs(ԔCnjV8kXB;)~GT%6KZ/<%<صZoe=ڱ'&_A:f_eվrmƦSޟw<ēFvD\j`%,N9ߑ6 K+" uo{ .MI紱;D'}9 [ ,}0^B(p p *0@+`sfJ8TH0C-[ɕl0N| "P+)*"b/6-_l;fZ`P&Wʷߝ 88/\Z|[a í8A]$";meF /KfFҵB~#p=Rn0a qL:GCQ͆s;2 2w$FXl%'ĸ m_9IKP"R (s&Jhiv1yv9Ry#ۿ8N*4Kmuaa%CU0du?g%8{ :Hv8_LU.`pmg5\Yg}v1Uw + X GPGǴ+Tvd1 uOsڳBq9'S~K w-Vf:YP%'p/Tʝdfҹcd;prE>SFvm$4Es#Øؾ^t2L<<˿P߯Q޶Xr,J+lTJce;xJ,Rb2SqzLե+c [KP]w [%A`P| kcTcMUݹ5D5E] خ,,c!qTZ]sOr-K-dRkmHH{~2mW㺙8)iBCQkH DH[d\$%rl?%gSt3QK Y+n:Sbg؆\ XTjnd9C X.~CщSSY*icSL/ҡ_7 FN6CIi"!.`EOFJ4Kl[!ا)f`es ai4M+ [3_-oB|eYhbu{=hKp*Ӓ zj/d{la=A8ݖ=EF춡Q'{.TzEK#+6>r*V3rlTˀ XF(#;H ۪m!x[ Hצ3z%ÕwTmy} _*_R|G(aì=Neq6Bj `  +zl̘1*/H\e(~B !KrgCe yR 9v[x%>$wa,ٲA${C^'Y%=r~Хf"prH00ihX֘*yeH1fJ3g]te= /$`6R׋k8'5gk6[mY, _xNXE6m" > i]Q [O,g"QK\5P9C5mƒ1mi$ vK b)IidI.Rj{J)`J÷R8"{GҲ Q{FC GCd Q'"lz>(11Q;؇ImuBҥ5(ۊ|f| &D5(*u]H5tRdx?پ} WC1`ܬ֭[x !:`eKۢv[D6\rKݖ$CxqȾ"-FR+)穔ٔ0Qy_Lah4yNBJgj۵Bc[i϶/[Ѭi5utرBFe8?ԢE fAj }OmڴqɢÑ`p'uDYD\V׶ I3&NpJkY05sP'd:LCg?ީ#+r[W J'OVI-׀E)˿"{N^gcNӨ%z˃>g˴D:u#Y d`G)5Xl?M#Hw8o][d_鸺cur]R (b25U^cx~^v㨯hr_Hź'Je.<^W0n-@U?M z@ny7!o})mZA[wُɋ$*]5X. S:Ĺ Ӟ$|&!GDidu"9Ip1#b_DyKqn. aE<Ȁ?q# >kA*+lݺUܶmf(XDQJD(lr4dzpn}FG*`HJQ,m &R,2اX:}L*Z=J1Bjǯ6| ߺ]vu߻Pv*%3_y{}ur=+t[^ÇiU^* .B5Ppѭ$࠱Dm:8|~hSE6]lrB$eҨ(h%'ְ 踽>>:= ?!QAd` 7]J? nXj Rc5Ppu-|Vҧ߯9#(vL2_u}_5hSպϝlVZ^Y)>oC_3n q9YA:-r~E\M2_u=LsCR-vڑ,Ste˸V#q9HlZS B(ldG&9|4:: 0ˇk<&=Z%; Ō^J+ZS|*yqn~{Q-~mFQBU}/O ah[09jZ5nFH*s8!Yc9uQo'ī;Oc78$_1Ƨ?R;- Lza~؍)>l:!Ⱦk3K:"8s:?UiArER )m@gϡPl9# !lEDE*҃ڈUڴaƤa~`Y Cu…9'3buD{AXmr-Y?y%D\ey1= 7s\sm_?r>crg@QQ-agQFQӦZp) uZpQ>-hڶmVxQj̀#wǎ 4:=fc޿pp /E$֠YX Tn2HJ p<Ć"Tvgbյk2>.uR}~,O(ۆE妤^q4o޼bʭn9WpdfʏQ|FSKa _P?[|Xҵ+駟k@ sX#FԻ?~KC兪cH|U.P+0`MaG.ΖEhNiP /%Vygs$P0= ܯL|븶IH!W<5)9/=1@K(0.l}YK逖(¥UV|Y"r))P))i賔rWd>2Y%]vbU=H ߭p~A@fO2yz0`C -AR@R p Ĵ9G1 wcp;gz%v \ 5tph -QFKBB9U䪤0&ep %_z?etJ6BHpcpV(~ '7RcDBsO$CSNMɣޤd\ȹ9ss |0lUZw̼OaH{GQxB+A@JJ ]{I nb;^N-tp&vm4*V9r$,=E"ΆXi-d>A:\ O8,LR)`LLx)Ŵ=~rLvKq wp[/hna;m' Ϫ1/haHw7m$U ueN)R}1vau)"}!߮](==]!cU|q~K6qoZvK 6^)|Fs +O=qG)55UzCA3TR_ pQU}ưD Vb H@2`?GJoh?&{={DIϥKznPOS(uה0*2c$kzJ ߇n{_cyz\FK0I0P|~Ν|)ԑ OJ5ͽR. )^ZpXd*=q+2x{$}۷^7(((  &ܵkWP\NX~Oz(?&K hQMٳr/9Cj k>"{nBv+Mo ~w?Sf6lXH 8B ޼yvI@(`kD̥Pg9r.oi ]E9999t):thX15MJs9y.laŤ7PD#z .\Hz+S>(hO@2( qFZJP")Pc8qcd45ˋ{(zS|M>3GP lrQO0 \N2xgyH^/80 w}n:5o}ԻVH֨Q#ھ};I\nPC={ rqA%@E:WuTV0?\k CZ۷oj8.b[+/fY*ӫi nݶ@޽{̙"!\p}4uTTnҭ[7~0ruFxC5`:!/lHhYϠ$;/Lb|lEXhB8a)CVld \6kEƹBҖ-[#d$8_݃d5$?h P ++^{5QލQL\_&61\R̒O;9ss.Z=A P{Ȍ)xAQv!) )PS 2S*l:=P^cs2&##\Jj|dB^zCzZ6 I|;=5۹dRC{HHڍ )wI %{JQsi+)!l#~bڝGq]M3)qȿIvcä GLnՌ UAp@8i Ae7AqVIf(g唷|-.ax &cǎMU\;W 8H7;[\%H H hTJ-% ~6ϤESTѢް l6A.hK<=P@2`D tM&m۶-.y.Z/!toS1R'}G|{|YswSšx{FAewMi"|;uD[n=zPlll{]E"`DzZ27R=ŤPȾ+cǴM6!Ko H*I7Ƚ$$@Ls9d-8$$_k~r Qꐣb@1`$ XvaiyѣGөCm-@;wؖ ) )P@/%;vpyU\'6u]'<@}G}裏q eY(*E8u OpU?"u"4c @~%*PL{aQ}[{D&j얞ZJhQZCINRPcKk=30e4i<~CtǫPc/lD~H!gց=hĉzeHŨgQaUT~PU++4dcfA4ݻw'$ۇCرc1 _Yo~zb}9xic< )}B˄TW ŲDQ|>cP+Mo NnȖ+q\7=Ҕ>TKu1q(BSPO}&-(Ϡ/j}黾 9GO x(!*/ _| l0`؁1SEaB-[k&( <>U!1tPZ`]$|a[C SMU_&R*8=  j!;&&5-z@q8>qzЕpn.':|ea_*KJJM9m&Ս̇IvMy̕!g-ZS\Y~⋅}L?|ġF9f{/} )zȑ PBqa"AR@Ry1, (\H @?"2s9GT5*;Up8EKՐj ) p ք*I2M?m =^M![s+:C,ۃ]ּrICڒ(%K}OAʕ+ETHe4;$NE<`daF#:r\BŻ&ؐ_,FR$cZg*=XomTF i%Ti ׿DzB>X.]THi !) pcz\K1:$T'#'ҙY-3FlO6j2Nw&)-PpST}bN~؜~CͪްaЎqJ*Eց:uŠ,R>$]@~%KTZ/dK)d k$6V]=6󰭄(̏D 08,(o齤m(ڥL^YI*oΪFKΑ'^NiS~b(nѮۘRA_=3$4'feu>o)$ޖȅzY"R{ټys H>KN?av">NrFV3o) \؝*jD0__˩I&ԠDvD3åqJ^P>Iߡ V5gZ#_̤+)a"-Pvkf}rgO75D$}Ka0`pؿ%U$;:_MY8c!I01ON4>|91YFfӦMr=+ycrpcdC5kֈu|-SfEAZ/'_ԀbC|qkPlѣ"1@,Q@2` s8d~J5D!ގ;D^Fv1 _ +kP?) ;1BxLC&iH$BD}-[&""IkF!)?d8p` ) )@iR]EpL%_ H', 6mڈXxAQ$$"ǎѠvn4aCdp@J$g'H$$ŸwZ Ht0>F}?2_t믿&HF"K}.AR@>|cȑ"4~2 b)Q x.ڶ $D*`VBA0_$ ) HAG9)AR@R (pq֭ )ƒ5<99.<&K/ aI5$VSCDJC AӧO wH5J}**%mۖ6n(q`ȳ$$j|-Z$cƌ! )Nɀ).]J“2+KUTJ|/R|#WXu2_hodS@2ڧy@WD!CK,€'i 4i$ﭭ06_ PH2߀IY/N 8nh$0c0aFKT%"=#^ktbЁҥKeZ7 $_L+Ȓ5l0B=Q41s$G{)d%H Bɀ}۴hB؄Q= hŢA,%JM|a䛘 *$*9k3&!e%Ja^ZZZȫ՘;v L/^\dKo5$H Cɀ"/?l?jIDAT=%._BP1ijg$ې )/$blߠA?~PC/\rrr4DIR 2(u3`ҋ$109ZdN\3 &; :u*4J c >XJzzz=zM) pM)I(ئ>!$*M* + B6l9$[\ <7&1ܳgOp/ { * 6|$hpp|%AR0ִ-G@cbGrWܐ q«V+VG]lX ́vܤIO)%%: ԟg/P Hzǫ#Fx|m[C2tzM"H@' D%fX%&&&C~^~C+ߴw^jӦ sv1 E5/PӮ~>[ *~x/Z;ދPwڴiHѿ3\B+Enx/Wg->ZuU8E=Ї=//TID +PWƴn:!b& -S ݷ/ׯ BE'Wa6g8&Vx/`^ll_M~.&Fׯ֭[woW6jk)'Zů:FbpCB1H`>˗/h$H H T&ӇBi|u>Qw}f}J*Q칩dGF+`Ad[d{k֬K,$P8~8BYȫW` 8묳r$BIɀCI] d͂k2Ll9GBPիUV"6y dԤIyxaxDJo ڵGgqoAW2:$~]^jйsJ).ovS^":w\8 o HW})##Cԃ4rvЁ+z\Dw-AT@|||YO X7QvlذAHĐeھzk֬*gD 4P(? k#EF 7mڔ-[F(kأG֭&kxLl߾=m޼Yh"D YߋP#dԩSXC"9 8rePFĉiƍ"s! k5RP] 4 JXC̥!ܹSc%0Ӥ>d܈C&*$T""xlbǿ7N0шgU Hg碵 N:Y#ea0&t F={4cƌNFqn֭[Ͳel0smH碣m!F6B#1G&MXoj<8G+VS\n]^c`aVEL@8ɽaۛ7on,88hcFSB+f<켴*Lh^X;.c$uxI@ƂY0W29IѢE +;qw!UD`ɠhK.O'/~j. N;b4cԘfYq/FX)D믿 SH'yt' \]0LXK Sb׌aLhL XDk%͛SZ.wa`F"D@اP]"0 SOfLjD̡hbxPc%|xaPXpqC%,$/6pe. mE E@8B_jh`,E,hhh#8GRۭIٙa`u]V1cFV irLof}g͚eԺaÆ4gvZ;>sQX>hPͧ*1[D#}B(I}rc,`1nll,O>^hh,ٜ, 6LϾ>Sy+~LSD`3gNYvW0a&L/!:fǃ]I}pS?Z?ꕮ}OQ4I3.eWƒڱc:5]:a[i _^֏ Jq. 0}t[K6Tc8C^zaJĈ#W2]|2i3"&񟒇4BS8^ط✰Y|+}K: r_)-_U:7S:%bC=zx;RЙ0uTѣGΝ;f͚չ?co6md[0V|:/^Fn&n~έ=#]) z|ETv>f{O9hkYqi0[0t`A.]p.fV  | /+W ; LgK/?p=}] z듺_~ŋm׮]+upDe[ M0nܸĨϺ_Y{F!1`rbB{U ߿3?i۶m**WCLBl<@oiӦy5`͚5 뮻売sPDe9"M8|g&|ƜN͋ˇqWH&:M޽uCM4mI믿17'˗7o]ta)(! #a?ʶA1L^0zk4޼(Ϻ|7~ED8a|8$1(A›"1T2EerW4= Xh×_~yٶf2c%RfxeLb{Ύ>6s<`Qi@>>B 0B% ޽Z \n[&ګۯ^1{@( /e=|bZ (p$b7\(qpz51u2sZ\/7q\69- ;sӝȣmʸN9%j@ $b U D?E@D@D$+AY @SD@D@*A ِ*Xר<?̝;.~ { -J|0yŔ+V_|m<6l0w}ͬٳ mӦM&-L|a5 ^{N c:\! ȳ>k#0FlǮ]U=hѢE!"P(o=Tp)% pQp*TM ©eA(j^8u#hݺuyto9_ hmAF6V 2A!v2lꩧ{nZٮw"8#R^ u#LLx;m 1DEbEܪUzmb}874rV Uf3CFPLst :0_p=jժଳβhLsuLb7[A^4#oIg̘asҷo߀*" !1":1)lͿ, #\QFwyDŽyem뮻ΐ"}7p6iҤT ZF6așwNj"d,W]u 5OC 8 sev=|<æcuʼnjPӧUD@' \D3u2~1(͢E-ROOvO@x:C@ 8*5&7-BV2I19]c"G%|!W_5Dz1bkr!Y?6h ;[ /_npNS(p u 0:|[34 @B[0Z8ػ{#0<Ƭ 0\p9ꨣR 8gi ȁv t׬YcF _e#UD@' \sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o@IDATx }?yL/ME_H")"BT22$dV 2d~o};{;{z{{skZk2P)s s s s s`8p9on@@@@@@`AKd6-w:s s s s dddd%ۖ;9999X~2222W^oaVlV[mճŅ^Xr!ŕ|-fwx^Vv[}kGQ//nst׿[}L-^W,Õt׽n:o}q~YgU}ZkU.w)VZ^Gw=ܳ+Xt[ ?uS9?O嵮u}lc}L|]|eSqy7&2b [V]zq{f;%]ˇ>q}2,0 ^ejKx3Q^jWó́1!Uŗ?qu?o[.t?Ƈ=ayWw洅9?w[QOJ 3(>O?>ͯgg?[?\|;_;N(o|q_sG?Q׽=} Znb7&[,S@ kk NwS=heea"K9+< %ӗOycJfD뭷^< ~?h e& 1׿~ܞڻo\tI2_׸5ʫ\*{>&mca{ߟNLɜ||G>e|7dB{サ6V'oc`eLkl_?n[5N22Bfo]K,9z0mu1"rJUeЄʧ?|f"fm)?G}tYA< OxBLc?эnTGj#>OA[)/Qbi" 07\rI2/ykm]<&KW>#vE(U%{ .~k^ oq>QuJޞ99`Xq0 :PxDg`Zp:q (αKT`Xe@C'|AwlQG &Ÿ*) :@E4?/8Q2G?Zs9q%FP_b3G?Q/̝?Ozғl6 UV p>!s s`n8p0(MnRM)6}T1|p ;}{+ª[BAK0Kd[C6~D_駟I:߹0Jx-oyO}SEx{qW[$ n0K?O.,x4sj!CaqQW!YCni}̓ū^afd#F6Q~piP4f%?R>ϔ+2*c/|aP0V1O@Q¤^md"ӏ[j`{lTW gθo~q/;'/ Á03,*mEQhDO6SLc"0yar`! HOZF?xMŁwwi 5i,(_|=17*0C=4jJ֘0סCo׽U\y^$AWgDr//_ '?ٵ1s s`80xȁj(J=U) u6Bo_MJ46(^?% oxC}m?b^hoJ@oqs <*w${\VӯP_hu+CVص_ч ӍBX@ky[@q`Ł8ҽKyB|`8EWP%a&Ss`AX,&P^C$dy{Mg~#HO|bd8:[o]zꩱ=qq2S<XeM6)7`O>P70:eXR!.V/}i4Z(M98>Hqgc$́́s` 07&!DWJ7=1!-A CFtX|h;SI!`h%#>~g>%*QUp N@Qs|~_Ю?=qm`M(uP$S|!yIaBmvsȨr#v۝ed,20Yd*\BV̆Eжb RSq}sy ?A)yܴw>AoqhkϽ=+8-@`-1[9X余-@`-1[9X余-@`-1[9X余-@`-1[9X s '~ís`t`S8qS~4LOŔJ:6[mP;X ;X'Trhu=1ǻ>3222@` 01799990}8+fd,Ávۭfm9*X|d8p8:Ċ 6<́9MC,9999dֆ999904é́́́6p 6܅܇́!8?=́@g?_WOw+N= .yLޑ9hx\l6<́9ZO|8]u;sq/yK;qyc@@@bru0zrC)^Ww݊vءe]G>ծv坙 0צnZlVŃ\&~w]fŵuEq.n_aj`6+ЇCm.\ɟbz|8!z_Z\~ӸH|>?<{Wߕt7\?9g8VCս/Y}\B6;mUFEܨ_},ok_K^ε^P;' 0nV'B:IYăq[\x&giB ( =\=w|&ܴQ5!QUڵQ6{m<7s?J[)qk^#ulx!/2эnt⢋.J?TВyl+)h&6I7AMB7 b⍞.,.rtL=EOz{v9N|O30mnSl֝߶{Kb&1ky~*ܧv꺭dv]]rKzQgV\ 0 heBcC&[m? B"ʞGdcN7yF~'sm' vۈBlb1eQόߥ^Q֥쓀3ζNs90W/.L&>ŧ>q{\qgU@́9`IH%eI1y3M,nr?y"7qVj%s&EUy7iYU9Os%gx`D<b́&8@jX&o&;NQXGu>7IA۳ / /īŷ I19VS/U3R&}Q۟0^h4|STҮڠ]ЌoB(;$? K}$]:iKwc?lۑ|`zJin^K.`&h&[/hVLqoM6엿e|(GYfm 6|T80 L}h?)'1o~a1@PG]|sku1,hf5pŽ@OraYU/#ږĺFxy\#k^/@`K-d . UV *8b{1sLfw^!)_AƜ]Wp,.>.gQhW)2쳿eYf;OL w,YgVhf¤|ў'ksMblQJAmG9 LAPhB3ΈfErQCs0<gsвJg.b 7,nۯ hA&M<5Lhe9S03l34qr w+o}[J\ч" O~g}"ngqn|oxM'/x &A?޿b=z%$hg|w2*`~#],ˤ:"A{k38#A׽_}F[<1HR|:餓bHJsa,\kd ln %=(<țBPl^Eƻ~_uW<'v-k s|f:hO2]ͻ.QN+;묳OƔdWke l 0㳟lq(l*[y%z[m1o$MǤOsܨ-oK>ePDGqD,*1oݸ>;ة0΄U|3qҭ *>Y-_ⷊȿo Zz@`}jt4-3‹x@Gy[I]\ի N ߿/F Η{A8^Lp heH<;$2gׁe2hReNK`*?a)_mf1Be_(Xne^lT_Q<>( Yr;\eٗ! SLPqY`%ҏP # G~7瑏|d:<~-!n%ұ/AAzPf뮻}ƴ{/|<l(rN(gGTTMkӟ.Zk1R>! ˠN}ED'>3< %?cxoiw!8"BZ4]Z:4Ӝq P2 BIC 4\B!VNkk]" ԠPB4ҙ`+ *42h%T\ SFyVwB2he0kxK ³4DЊڅR0A㌛  tG},.;2k L(Ġ:Րѥ AN1؟Y)ڂ3D6D/ pf&|c^ʷbei<.خ.7[P\m%BD)8<>[$HQne?^`%dXH+HD-V NǥOC58-?F=&oZ:x+!is, <>T&dfz{,2EOsEK;5aV>v h]&(v^/a?ҁ^؝[,\WvHEHPa 4?ʱL+a5:.fk$‹n [c4'>h̊Z0N6,B(W~?Q~00@6Xܙb݇LT+""!F4[d6[ե)udF3p%8 lB,d}/BvVzp㥣O8kâfXCTy{b,W/YZZ' !9rf6U -dv4C;!ᄷr 2X0;NBz7 2YMssP]W^s31;*1 B, 1>i{H fr@y_Y1/,sO*^& HWS_U+Ї>򖷬o ŸuI'j{AgXEڶI޿a>9wZǦpR}$%VrmX9- sĻq#㬴Lmhk lc?餯V4 +a_A1nzVda@r'ӢP9diYx~о6]/>Ӳ' }_&=L5M8wznmτKx^3. T,&0Pm-N;-#e,X!57bCֵy[g&Y i+O̻L4D8x&<զ2%% l};38#$|tYUeP&]tGE,8k0#V;5*7LK,:7hl4YL]A,Ĵy>>+eG9SکիWrm}Yxqr!!L3"΢$(a6!gقM:Qj8pL4lfl0Wosg 0ѳ Zu֢gf)л,e!6_su4!įY 5w?gْSLRNI6kt,y1쵳csr_\tElqY@JYg=ekVi~ĊY v7Osu8o}[1?W}2#{M6~_z~Mu߾r(fZY-ϣ:}L+>Q t j&~1T\˂s7%0z:#l*Y5ϙ&oH.(yH.geFdZS`2Iۛ'n ėZ`11Q䔜,>k.Fqmt.g7XJöԃ9SHDisؔn/Ü::Rl)?\ `;,9+OSLYg-V_jt+8oi_KVif eVRVh}Y~⪛ni,U0lY ˱Y>5L?r_צ։lB[q!շUPŢ59> rB'y3z7Q }sS5эns_r%Ӭ;ج׿!Tfˁ_14`^\EZu,Zu;wƪK_R4#_:B;50#~_2qѬMbE`|FJ~CTu`əv'Mx;blB4>_ ~pLY"QA6sMA7ͦW"ey#)ƢvR`sp/Bvj.sEZ4`̇(k`+9KX(t%m^QY&8Z^%+w2 l\n5fXiX׼f{GIkaI&ĕ=V?, ?s9'++ݑ`ΑE|`)e-eZ``{d_-YgrY.tï~XZ\aՅA-Dww&dBXOR-A}D[ KX6!+tXD1аU,:eֲ;6'z^{.wg0#}9X^ ˹qXQLD֜E,Ztwa:24V|_LL( w\ϟ@`3}2L3fД6d=OʌPi-XS׻ 7ܰS 6pb_$dy)Si~9 P%/#|pqquoj> b4 ,LN; &&څiX1!: #H<{F~nMS׮fm>s}_?&7\%w zmo{c{Ŏe 3)Z=y⬳ΊeWn}[/H['~[lEɘ7M~X7x *ws3b=;iTȞ)Hu[E4j(T[)$m䋏 @SN9|gaD?m7=6w׿Ƙ˦t;ff`Yr4 KywihANIAn *i`{_7bvB+|׺ֵϡ?={ݛe]@_A@cMD c9&o?OC8t |Q'& ,~헿;0+hF{k^5/zы"A ޗqQ i21x8 0$tL<׿~\M2 ".&TVu $>J cPqZDY+ٔж ;:RD{誄i\rIg6< ^N+LɁFdMǃ%M[*MJc %cXW+r/kzE`= <'WGX_җ$1_|q,7)f*w'A{VZ3ͷnAhD&'4ɏ*od͝}'FՄG/| wqcS+yݱ>vAv#>IH?b,8vؒS-YLu_r`|h?]jǃ'<@Рg?1OJ񨣎*G^hϞrEEA,0bs3~_olL6h40[o]<я ''?9hL^ziE E2"Z(qѿvu~fL%g]vf)'~p }C*zG3xEw|g>;Ukp!(VRX!Ķl e*]k\ *|yǖ!Mq~0o+o&2Aد7ֿg) 2L>>l(XY ⾀-_/9}o<U*]9&, D}ݷ %f@C.xLOzғq$޻vXa\+n <125lb[X@YӭqUyyt|`A5Aa։, QؤwQaZu3{=)Oh΄d<Uql9${h'@?jĀdF,Z\pAGt˘Z+慁KV1.csf}'17E`Bd>JB"6͏ŜU<æw޹x^G]'(8As߼x93 D@U# P~PJ49}7> I-/ylw]SjԬ9@^1g;󤁽o-92᧠'|}@I<#@PXO׿/DD|T栤:bg=s>NJ@#JP++L yO@Akҡ}yp dZ90A7m N?OL]*E1sD\2Ӽ~Ef\RtAH`?h<zh?1ӳGMI2p뮻ϸ,xG ڄ?O:X -i^WlJwN6/,͂xTtLXL{+_(D@Gһ1/6!Uy=i9vǤɄ"D.?~wm\\ S_a}HkU=)m4Rz&EV։M6س6gc־`7פ؜?->`5UhIF`ih_lVHnt3 0Aq(i`f'9`!$T静y͹ɱLdlb~=A1WbkX JЍ$ MLjE@Rh0Y@o}yUw r}o3  L5s@\Iy,&x朿YC%H r- L4;bS$1DVW2 3RH"=i`ES>VincB޷m6{ϜWm'—YtqC'̭TๅJI'sR3)$~e6Cd}uT;!uE*1Q*!w}@&O~1AU/T+Y3AU6(LiyX<nD-_}02K)eBnb/3&-L!ߜ ~4{'%%KıU2ؖ@,9cS닅{(c-n{zI|l\}DCb~pSvl/r7JqCorDjCJUrꉒƶ曧ME)Q0#l2 %sJ`_  Ezӛ3ŝbr-g{q;',4|{FdZ_T|焱INHfU9 C&dyxvqǸԖ7%ܴrbBaeH2Jhnǃ¿$ oM$J`V5P\+фo2г(1`QM+L=uWS!Mv b뭷Q8%.Nh:7n.UM`>E{F`%hGl>9HzڝK_> Xvp%s N%ISLs@XcT?X2%A|٢g-oyK\'>(`M6iE*tb0Ϭ~w_}'C*pu[ũ-%6$2}ZeÜc>cBZ QIz;^ͣ*y8mO+s&7@(ĄLTBc=xcl{YF`ibZI_A9,PxPKJ"pd#!f:R_; ?6A%ڠdLW\bNA|Ló,z2H&*% zJ2mR>)7GϤ(ᬢfY?6dn7Ti*C<3eYY Hg ^uj&jI@u` ~*'!k1:YlBUKBR% OZKLRi X3>WA3ɯ`i$ԣyc&^Lp {`{d`Qk2;=nR;Cɖ28Yh>^ˀ<\c{2L>/dTmqbhlmAc(9qvVï xvb[X4v_YI fcWm JưS{P XOe0VX|ӵg 2tM  `22x簘-s|Ztwecs0Ԥ߽}-!Sq6vXLaA=w5D[PF6Cz \mV[ʳ`v)C戥q" y,8z64!ɬ 2n| a:Ll# )Cb*XG%Cé~@N;-Le@E/6oiq `:k K&P\UX4\ncp2r[|>{ͅjs:5q ( ~p~% / "d~=?yaZw-pZ /_v70<Ǭ) uҨÆ#`*uLC&4TȆiSWlqT$nq,1n)@MD(P$ ]m,+V ^n+9@J54,1 EqHf(QJ$wLv1` CAM)5-N&zpY ,5HDg &y%~2&8~3BO#4%WU'qa0a9d>lK |*9giz@V 5J@-?WJ()fJ Ktkaia)5B_s`~,.h Yx50 ? _3i&D;q& w^6- hB04`挍!<@IDATj@9hY ʩ͋A%T1s'bWz.o4)RҜ]7!s9$Ӷ'/ $:UzĻNjؘ?$XB*_G%oiz %6gPXY6<̂&iMx>h_9ġrHL!k͓H# 09O, <  |ް$S}{ژ2%0,fNlB\n F3XY,F dz&GLdf}EfaۗE<_*tP3"]=.¯sP l"PŻկ~PyP#9\;~h潶J2Nnym"hBl=|Q AL VUtVߗ9L8+i]\+{S LO[Aߚ).to&?X̄nBcl0-}!z !X|SA~d4~jŖ[nYѯGC_ dW]}U|]_@mb1Xh !@byk%&BȻhD P҉#<+@}EA? eIC<-ufᷜ9Q 'a27q XdF(nj"@m괮1n*eu_mN#Ӑ9M,5HxMB{,lmlBL \$ `"Rpdpwdep #|fL,<\w@q~d&^&!urj^}dŐм&|8M}.)u2$ƒ[/ΛxH38c>1!=DիWpi}@Ya[Q8=4Z|#e if5_PPH;fQ1z%.T??X<4K"-PN-lMPӞAy f<OseFY*16 3!p.袱]Cם$ "*-=G`z׻]w5:噆L:niJHe;j*V#@/2Ϙ V1#Sʄhma}wᙥ0`}{w4J{'܍[mU 0WꚐ!+&%m>huqrH?%Ba=kY"Yx*VɊLzE"l5{G w1P|b1Y(%1lO'a7J>Y 9T0K.+XwHqa wG) =]/iZiɭ1Y1AB"SĄ S7:1$ ]/}j@cd \@Q%s1>'*: ճ0sPO1W``&2ZS 1˰2+Ãܺ5l.DC2L4|^[gB+ZЮ_Xs-+%'C>0w>|^M(Ġ1!F1"a!%ä |ArOܐY qe+2cBQJDۆ2X:93TC+_Y2Tb&b[{05b `,`* Vx|A0GaqTg!cVX ~DŽM$qCb_`e`Ӟ<a ꘽AC+/IViH|]$d6.*ː qڱ60!#Lb",BJN0044B%ďM$ۤ",h,a@k۝w9 1V_{ZXP̚qrA!KHx6b`ldb``$*r]朗r - Gq@< 6mYbq 63b*ѫikT\os:$~B=-LcR1 b0JLo!FyPM4>qn$I\V"̔P̗LUR'Iٸzlډ< s{n4OI+΍,89I NMSn<8dwP9:eB7y,JT Mv:M3|~Qo >$#"'@ViRq@/";GFC |ϯySBdcVX7쵀O_#bF`GR'x&~,&. px2`"qd &x0y%ڥ>M~j-!i m!ڌxqs&pB[o=z@iWBm%iE{К'"B)~3`S6֟ WJEPJ㖈QIZY E,U: 6Yk[q*3IӍUS sE')H$MPy❘Yӻ,a&P> u}|c>eabV  I ndEX|,lg=' X#`AHBK0TyW~Q nڢDڞkvt{H4Q T66 yfJeR_fv +2$^/@>qm (qxK)bx"iCuF 0)Edp( i0~ ,@%`84,gx|nwG_ D"wej!<;I.|p񸰐)yDC2|_?eDv #9o? o43<6 ѠAQ% q 0", 6R`k<1{t_Rދ"+Y*)Ao,M?"Am84 U f/~qdtkɹ A/ Pw<#]IPγJ9 ^Ɵ 4ϴ sIcI2$w1:D=cq29cG6!uAPRT7 ՝i' 2s鎠ӠƘVdPk`bj+=͈ɷs<$U}4uT$&L}{ IH$$䃲M<#~g"R3*4*UsQW2ڄ؈,29ѼtlԋF@ƙi8`7Q,KR:wWц34[]{M1h:29HT 3-2a&W,!Gd_*٤\3E0׉Pw'14?ͮs8K]>`ihF%JL%HמgP&}d82Y9ȟbVL5,ÌЕZ n"&:riL @`E0uEkj4$4 5|80$=ZX0uN49dbPDXO}S#*ȉ-2i(5E Z K<+~,ӎ,F&n:o)1I𦯑c~Yg,@2Vt9y!͞cP4mJ+%h[rd+ZS,0Oh%.OYmB"cU )yFg!d[j?7{:w)gZv`)ݎmPaB(άƓAs^K ‹]K{?+< CطΆH|!eL$'^qe3FOQHq_DUJ R 韜tu,>93_QXxu@.AۋBD@9RWZDŝV1ЅD:MhrS2 ,eppl'"N;ɿ(mӦPo e3J!*NfA}HA9P!4%F C}Ip ^#"i*>۾걎!К$D!lfllG`H'.܀T'sȡy!]f-аH޳^LSw< 䦲oVJٚl[[}ON|Cr \,x:\p`ɼVZb*LNQ%* 뾇DA0) `[V4O gBbcZe*dV _a7 ?F} z ߡ]q$GMW1>1\kRQQ͸ hH1T\5ɒލW Ci[%()-1 baa50{e4厧D!3A c8˘zzNX}G3rH=Y(1LIz1!Lpa)@(h\bTק>>b;m50fS4GuT4ucFӞz|J&S|nTIk+k2ʄx̑7eB- &F0Hy LN: vBX98M9he]&s cڤI6ʧUV:U궭N^{]wF3u܀ۍSp4IbD V^s8աiE<7$ DaLipy,%R^"qeZm:s!IL4ݧUIFիgmZe6 `#ԼkﴰBaL"0wmgǵ-Kc5R$~!ۈUR(TU`]x㊫q~ qiRqt9!dr92Le0cծu#ZqՒ(~N*b *&-Cl_A! h G/ GR8Vꥁu<|!80ĪAc?gYjS85X1gFI HԘIZ<鴼A!b'֟yͻ2Kگƛ`텅e|JmKsJn4܃msQ}M\&,<$* %ޣ樚_z tOmUXв:_)!y&~B*$ļ`"W.Q7aQS7S~:7S yQUM?sN/G)ϛJch0_=scbx9%Chv\8,צYs6 kn,g2okM5oy:_eMg>dvrϳX*H5qO-,,/w J¿<[s'0&qd5bbˢ4odj<JZI4*`$,7Ū`0+v^0D!1&8M 0ԆスSuPFy"cw`J kfljmQX |!%R;~8?6֏XLV}α/cb7ASZccȓ'O?"|=N'{#|E &ј70ĖcSc)#Ky}{_}pC Z I{C!"R7T`y#)$[*Jx0ƥ{,AjovDR$ )~j$~^Lm.ϜP5D]ju }fO ,c6 Ģ} )!G(eOGUW?o2~~0"\}D 5ُ*%#Ę%s7+2Np>'!wrN)!ܦ}w}Tܲ/klK@;eW ][G`8J(/6O1]<NXa$hBIJu{DCH -fQ4w R @r/qe B#4!pz)E -dI@F22(Ih9sx՟2O!h D7 Ha;9!6*BA Y{7GЖcgOC=ǨZ`ݘb#AAMhe PAZr$v0T6Pc+_i;ɳJy0ń´2(UIK3Zw# qU ff!! 4BJ&2rBͪ!D OqU@-G݄P71~&m U5 }X.+*yd?2~ǵXK{ N a"+RWȩ\x7y*ɃRF`d{j" r²~ `v30'n'*& $xm‚=#uZa}V~,g´B2ӈ,]O)oJeI2k4z Tr,Ӹ}X$0 Y;oU<́Ц5KlcJ MV&Pz !Bs#U㙺B3';0Fu#AU'ځ?G9> xiUMos?l !mJm`>zѸߨcnP>j5,0Y%$Zc>#rSC+J+9U+I1X ̶ҨlZavg}jb,`\}4rFt36mF7y0م1L~& G )&HD'dM^J4^O1!OU($E[`S# 0BХi?$Ս6ӊ a%JeV&)>{6V},4B@S%&MAMuJcn@T'>:IWe,UCv9OLD3֑n&':$`Iu4ZU}$uSNLWL8LJ sT'iU ` 7N, lC2ICՉ0 XĿTXa+Z'k7Fs5_&҂!B?E!|>>D&nL<~kuK>7@N`NHU_D]&HZR NLz^tO f:1bMҍL^ݨ.YXӟ`X3nw89H>u[z@bR%nn |v9#_=[ݞ'A7aJkfo$Ĩ7 ɻo{ \W nc䓆rS3𻋧|uԯ5_ԩ߻knhKsA+AcA )&CKZzxL‰IR@VbNGW%7dK31Ij81 |ʷN`,U2ytӒ%i6&'}g:bI^4ABg0p7hn63ƺ`Igz\4z0fͳqlBUm[0IdIt;G& 8l4-t $-M+QΤkm$H{wIB Q"DLIXO?M;;AH{ie<$, $DP eٮ[}?g2R<9lv3qU3#k`%d/B$g&mDqH{9GV^df%+Q+B ip&Iǁw3?0I8\oc- UȨaZIcH}u"30$`#p!гpgcJOYR9|T[3j`n cD4E%tĦtCtcI$P@ 6ِ=Hn펻f\m#gqr4\~b&:Eg_) +~ӆ ~H9d #@`䛰̔9لXe TQ%_j04m`*c?0 A6^{sOC* V }2յ-7ԢB`(zf[h`աxa^f#9) :~.}V?>69O +&d'ՆzPAYtAKPmmC@h\5ѩ6X~\mRXAڦ>#%Ua)&9ht+e<+%.NNDLā,)nf0$׏[~+h!~+Y@+VmrmXG9YLIͿ3Y xE4_No@H)oD@4I1B*@SFi2Y x؀ aB:JvVB. h8\6.Fػ`Js,12L0d_PD~Eɒ~1$1oRtyH"UOȪʸr ~F:j{+;xA(CTQP/M& 3Aw2:dڒ^ iʐ^;Ke!!!h&3&2N+ ~v_ Pd!kBrЕAȗ2o2Ht`H"[ eHZI 5>Cq7 eUe!lz*l 2,C50 9|džOGnY J|gCXՉ7^xf,67$C/M4|$:ˠ:au[8M!& +N{$B*2d.Y>.FUTk,'Q,@G ZY!sNbZmm?$@R/m/_]@FUw:Q`2ewKTQef\a/OXAA< ;Q&ɛ6-o`g$!H@Th.S`10 UJz**'?9BRq1+VGnv| ZzFjXZ{u㤉VOpv%R`H 1:-ƘEQ́n /֦Yi_ɤUJ{N(ĭ7H6aZ<4FS P4`_"OIB*SY,*+!JR>iW Q4 qd~X IѽSc{)ssau'{,CdOW]I.(D"Xdm87G<[lWWƇ׿T̄guV>bLmH"YBOi1W}VHMx11,ҵZ7| iWuh25fi*`s#sylf}'䌯s$q7g<RS.x_G+__U T3VCp1$٭q1]VV4P[ne ɴo܆$fhl=5]wI^6=G0י&!G00Ǣ:e!@ lҪd~`b\؍>״ 1k:W:~% Hc_[jק)$eV;O㛆yW_s@hP,.I.?|Q8B$ͬMkVes<ܲc6,*AarO)7//]/ПOH^ׅ\$ {iDgUaE`%D#U*sOhK^v"a:=ߧ0Bfh2﷐?K.3IVv? yF>Ytڦk< k7)'A:B9h4%UH7ͱӰ/ 袋"8쓰ꖫqo,YX[3<$4fVԈ#$r$U4C+{{]138#YѲa[qʋ_#ߪ'~xŔgaRh_دyt8y{F^t'/&$ K& SN9e u%oVD H+&L2=6ɻ5o(RMhw,⩽L3dD9 6m6Ѱ^y\kA_MLqMHZ݆lqsꩧ.XlzK_l]H+jճ1K3FKEfZ|Bˍ0fCnW`i&hK ؚfEp7Y~-8y/FOI]3,*FO`!,DJ1- AUs5 |ԧ>}]ğw%XUE@a YZh!/7g^<蠃bNeM4Z`(^(n5֍@wkvfZrШ7KmD:kf;_x<~[t'1Za +҅mb¡kWҿ7vao[~$ʦ˒ |v*N>${1S@9 \ XSQBB|M2o[kNr;.cE+L?1`eo2lmOJaXӢ_q<%g4 Ucu!b%c]wVgz[_8 a;)Ϭ&Dq)o{̋%7VM4ks3ŝ܉HwQ8@`qsh,Hߔd{6 >Ќ&ḱp@Y|+1'҇>t-cHGElBL<#b /0& BK+E%?/+sQnwՍP47|('Q&~e.0]* ^OՙyZH;k2yıRGfT>qO){3o$!5Sb˩ث།mnKXg츠_ATJ>Xo}BT2gXA g<}9 ^h6f__+8$S[̇z6ЙO<5G:bxЊHVȱw7i}wp3^c'}P5Mld~bժU}wn;9??/;F" 궴oؖtqv><\zի8PT[S2qg]YT6={Y6F`²#U?;djR(uØMRZ6JMCw_F}GvC/b5z/m&-4Gr$~,!0PN{I>=c78sK/47]0ߨ~1_u~lYm`jUaP[U&kwN hc&&]At`1k>zgeksNzG sĠ~#jyw,n>chV;^{lzg=׺#_lV̍BJ=^̸FA-2خ"խذ ߼O׾֨n Ýa6gdF [/9M$Pw]3S9NE$_b6?яx8y<-mF`V: F W͋+/yp`m(=qd_Ypf "|l2#b22 d=3Ɲ)e.f>ą,|<idd>=s s1rJ |>7M/|Rn`3>fD&*tSap@į}k*#|H `ژ2 0 ,h.79ЗzhV[=fww^~hVy[O@(b͇XO3"_X6#6IJׯ Pp* -i*&Ϛ`uYg2,d`:]Pe]3am3s s`2m݊/}K\ e}9|(\J6R` ݕdFhĆX=#~7/ǰARW-l]r7̇Lm,+ٌ#s3Cp@Ġĸ!ȇyJ믿~#f9 4b6#6TWXo]ԍ{WqgF 줓NZhl?c.60Af8g2#f0GMX,+t {nzc֔danpzMnpY|HӸ\?q&zHY5|{AOǩ=prs+Psq'~!!0b9|Ȣ4h9[n,g^Fĺ.x{Sl]bo曦11]q=( J~hL-ϚXO3bjńR-$O8ᄘ^MLAD` rc6hJAu{X }fĆYguVqᇯ=o!.o|c=K (s9s^_hW r5B~,w\~_^(DLuzߺWܦ%3hm%/-"%P@@4&"PSDLT/ $ZFI$&C删( r)GQH_^w}ޙS5st{fܚeI\G`G-@{*DgN=T/Fg3lҐQFfr?ԬY <$sp!6qѲX!- Vݻw"a$qI]zv<|~n6krכjժY1߸qdz]qYovӽ.eqFCRz^U[AƑhFdɒ2ڵ;v̆馛 zꙗ^zp..D?:taSB7KDDAX?:tiqbMDO>R/Yͼylop N0\O($D.SF , p|w,&+$^jѢy2LL$@~@6~r;F3b~f^̶H9}t#QjΖrl׮c=fVZe&Md3{G… MϞ=97SO=eq(HeC;w4fË)IDAT0:tȦ^+bFK~2#4 :pst S!(s._33g>O*zʈ73~:rD]S3xVyHf{ѣ1Y:FeH}]s5>pl_xJ2*wf`IF%܍UQ׭[bU"@4#ZW_}1K¿[F_ ,f_.5kk׎ RxË2'd(9[S晁r&Óe/博ҽT 2|g֡Nm^{4hآm۶6j=ͱԵkW|>}cZ,tgT q}뮳ey߶L0h7 'G)0ϔH@)6A0H=HRqeD ~%iY0@jypӒz>0!OLgOT4!:{O1GC|ݺusZeE Y3'`^Ȅpbeda<h( Y|1@1g}2\3D¸r({ʕvq&U  cvUB [u1˭H(;riР m9 s"0 ! FiaN>d.[_`X/~0 X{gA j=ҬD|7e`իWͭ[6x'b`á0(($cgiD;tZEw="r‡QbqU]sQsd$g]pe?2xqs1rү8g1wh\?|7W}tټXv:ct;B460`b^NҎ`_1LˈiF;⯩h6fWtl/|܃Myzf^\{`?tGPvĆdMP6t6Z&Ol&cdqbOT&۲ee+>p&^3$T-0/L;4G[$R!f~ 4D3^$*CK,4v2oh.~ h7x]`^HzK`LUkpxQypvTPtx[7,[q0G!0a3xPìdqƅ1bٸq`OZ{5Ȧ"0Fg.ђH!-|O}a+TtX<0!¶`E+)13sԦM3e+EWWi>a00s-:.@Xz.] +n怮Zj3:rm¬pHi&LU)&ӧO7wuW1{Bᰌ a){qƆ\>׋m,^lJ1#`1%J @B+Z1X4|"K5xڵt1aʩR@H , |g:.yꪦ9F,<ˇ1MJp.o/ZhaѹLJK"w)b ,oF_`_"޽{hsЁc?&O-e*y`I+b| 룏>zN:)uXJ*{ȑ#RUe!&0.38#ͫyX@`\r:ME/1X|Dغu!H!^}uܹ^=,F6lhMi-JA~Əo0 0Kz}.V@n!R_Sn=j>Fu)m޼2TT1xr3ַLjլQUZXbٶmi۶iҤWE@ , EWH٦Ms[z,EB@UV 6s=לs9lDj-V u LSz"! lң\x(9b`ɱ ի[Gg|rJ>HX>yaQLQUO ܳ]vw1p!p 7wjZcEdh޼} P01 M65}Mm UZdh}D! N<6'FRU#eˬ!Ky=I> ߡRONTCQt,Yb5pNXXLד͙(PD?%ݩJ|^{5pz'\qY $ *} {JϚ5L0!-Pշon]Q+'B ,Sx]fl0Pb&Ο?H<ЗL6-xW-;wH7B ,;w51%g3w\+R \#Ta!Pꫯڬ]v5DeXO?Z(Fەx Yk֬i#yeyb`cN=Tӻwo[w޽{UZL_z%SF ӭ[7~.V2( L};fgUZ38F%D/c~gueW*;=֭[gSuYUVTmg1wX́;t̿OX{)Շ&m?S 8`N>qy`b0E#7Qj`fknߩS'CY F8q%10K k=#38F3g!,UNHT"_[oe%'~mOT\ Tz+-"w`n߶m[Э@J|2"A(?_?SB'BY14 9&9f͚eX/֬Y3m.T&Ol^xᅨ?R#?Кc3e1`Wj[n]ӿrPT۷oȈ')Ĝ|@\H$t %(xWc5kfzj{g6mjufȈ8T l .1#@g+@AM M](* :jڗ _rJ;paKyrn+%{g>a(az`b03H.dO4 +]..nR;Cbf2:cQrqmܸ9bp袋 &  lKfO`f`01"3+CԈr+Fi Eسgceìjժsӗo wh{`~Odr;C#D"k?q ePzxµ- Ek'gݖ]z3,DB=jIøpB8֮3"VV@Xt=Zʼ6"b [-|N;VB@ ,XUSݻ IE,\a ?э O#"Ē@ҢD@ 4=Qb˖-v!;f`f0 _t!ɨQُTٶm5@-[VJp+~ ubz'DNьad 6 Ȝ(GP$!  ,̶P`#cfSCxE٢ .)LB18sO,|t@" nSSE=Xb[ ƌ s}t, 3*   /`WVaD@ LOB b!;4ӭ[ڼZ8ICժUǙ0+`ۏ4x`ǺQ'N#u `3:Lz~ Yjn`-lcN"G7H8q':|ٱcG+BD0+f$6 O=͝;t=GQ_yqh L`ł4<_05"YL,駟ZϿ[1BXu¢arĤ=̛+Ez EB 11u_ƍge^{:tׯOWe  9 S, Qd +efQNb4 7YʷB"";Co߾V|Jxl@ h74Xy8 &- XGGO3ev`nqrga~(}Qm!czW%Gèѡ#^6Tձ4{&QPf۷DhE1߿?T@U^}# H:'T嗇Mj@3iB@p" ~UG@ ,] ! ‰X8UB@1w65jTؚK2] K/TJBT! H11B@!| B@X ! b`)vB=r%ۦuJlذԫW,[,vdȧt4`GJ:vь7UϢ_SڪU;vڢ`("$n#(s2GE!w:;X}B>}0#w- uPާF6iQ߿nϐF95kִtyS@s2?])EB@"" ! @vHX ~s5ݻw7_zbvmVXa4h`5kVIiwxƍ3[6jJm̎;K4m4]+wa|rk֮];sǗ2dڞ >0֭+smlkpZzԩSR8Ryf^+lƌfĉf޼yJ*|7رcM^96d}#(] .0_}JmG*:t 2g>þ6.d?ͤIL&M{Z1/D< !IMxa;с"pѣ#Æ t9u\u7FSL藻;fon-@uԱ|'͛-6αo]{?O;w;cųd8*>)byoW1A=3f8p`ܑ6S}f"51"+꽸d׮]O.#^'(vܹӀjժ={73(h0pя~dfΜ=^+ :J;^j[t>ƛeTe˖(g2=2!R~ɓ 3*kʚ}\48*4=yl2!9 SwC,O'D1v83}bVRȑ#R։3Jٛ(uR}fS/3< d< $3vPnݺZ`V{Z`E;T: ̹1K~7۷p`i=駟oݰY%\Ķy?\7X.]ٳgg}X{^tEy]p.3r"DkݭZ NCTwg6_Փ1MdGa~_4z;/@YęCԯ_8i}gƍ sq_0VgYg}^vefV3Yt <~}rԩvP/wg6_8,"C~.*`ŬXxUD q%}@߿9UbiA?0{b`@Qe! @B@! rB@# VpuC! b`@Qe! @yTBg71s1] 6Ab׮]k?TN"զmRTFz QVpNoP]Ęg2"֦f]v4:  l=2~zկZ>>Mǎ+ 0.BF<_H="^y9餓"vssċ8tcρ6쨴2x/fsߓQ=+wsx /ҦMrw 0 EP|߷BE>,⹉DXg?^Nr/zJċJVi&!s~ % ?i<ֈ] ҨQGTX^آ+2,J.%Q /e٤e,052#^Ԕh/ݞ>}z`׽3/ko9_:E)ubi]2ʐ#@X1B&}m|6pؼ[ ̉ҷo_3n8Ę9rYfM)Dt?a9d+8Sf| x%͆lX[!M7ݔRTuĘDF \Kr}y[Bfdv̻>|ݎq"@>*34~VG "h0޽{[=z&2&mH0!ᶈqm+4?0]q*>}oY洿6%\2be{&VNaܛ}2ekC B*'$$mǙx٧mcf4̜`0@)a \e\6¨#vNq{w-'8 nK/5ʴmqfՖa ≺ksf`BRDf>ή|Nd`sx<<3slݿoӝEe8o<Ț.ew]kx饗˨MzH1|2C: fU0dDXr"%!Ş[:AhIꈈ;v0!H6Y .r0هa%#瓆] 6r z%Nfb`@UeDd4cS B+D6f[j,D,%-ɴ7p5k"{~--bEg&,-j"\" X.TYFFpBkyGN˗[Q|$+jQN9QO8d=3ӭ[7+1ݔ)Slvl0p!J#7V${$eFa+vd3} \  UF(YbV3~xhlNʐĬЧ!*%hQADB _ Y+yE@"ļ«…B _ Y+yE@ ,p! b`BV ! @^+*\! 5z4IENDB`factoextra/tools/README-mca-graph-variables-1.png0000644000176200001440000014623513572034652021200 0ustar liggesusersPNG  IHDRʥ iCCPICC Profile8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o@IDATx] MUι<)RfI4 ʐ&I*E7H4FCTJ"I i+S@oH{νNo֪瞳9{{B    + 1w@A@Ar% {D0(  d! Ar% {RB0p?`<  ˲ƋpպM6Ŋ|Ŋ:_z3rH$fk*Tg}K.;vk֭[{vƒ> bծ];lj@kĉNP;v(:u8/.fK  ĉ SԲA<=Z4 gI**AsG l ܹsܲ B4kOZXGdꨣRsR`S˖-Ssbft:n`3_s?7߬þ@.ƍ)6lPgy_b(ޙORc^ES]T|`U\9EzaPur Æ S4WӦMӼ]|\Ɠ XR4&<3dQƪvڊf:/2hƕy饗tyq[0 BαC]6`@L8N~۱c> z+DA )%@ 0`˃`ݝ EeųhD*nݡҪ@0 d8  T;*>C炀 DD w ,NnHxM8?@q.ȷ\o&`Ϳ2iwp;I~y wo /o߾ "YWԄ#v,dbpB3Sv?%ɖxf @D6ő00PN IŌ:#$ c:8Z߮WЬ5. (Nl4Pjg7txy'F8;ϑ*^`|x͒f$fO4W4pyE39·MmΑ4+4(U'Iy9";N:$ġt>nC'wm Np6C~WKMʉ,p-RH R%iFZ,BukC;NQG0 5Ώf=ɏAG&G0q9 </9da&qZxh.޼L)^9.ܼt 9e %΋qrW JW'ܤpV% 8j ^uvn{o]KB ,(2OβIc3/@wo$ 䬂qһy(q뭷Z08&u$E6Y0/eyzшUmf/quq/\&rdz8ǽxyxb-?_WG ݍ i>4ws+;rO%xvfVOMoAƆd崿+A# "D3 R[MR R̈́b֭wy^,D@D-e  II@ž  HD0H$R  ` $  D@D-e Dtѣjժ$ !_4%@*UϣrʅɆ-F*  " AHIOQz^BoA! {dN FGzWF~nrСC(;&$[²%#!frn"p븣l]!飿K.$t9Aƌ1R_c~IT!YS g~S^Cq._|*$\0`N_z ݺuCjLrz!CЬY}<0q^)1ߡ O}s[ e8p PPRg`߇A.0hrcơE0h~_88~ڜӕnݞGZ: xJh1JO3NGY2]<coJ~t_7%VF#0J,eLQϿ`5m? Ew%8[R#eY8O5JT!ƙߍTx pTqfJ5qH( ȑ#9(@5hZh%_8/RvލU:iQrmc_5꯿`>3 F0OD}~% __>%J,HT)̦KPaN$^vkH-n266R(w(P^0]3yp#L{F:xg0kt:3̘ %i>n} (  B |A4l7|s9yC ,63n=<0kyyP? uѤq ZM3reauf 8|*U }dHYHDA@,c_~=/_yᬳ Y\U!`'0~P7l^ &R[HMdF" #TWA8*\0pAj'"[᥽͛7/ru @r!pAƍtBqc:?`4rc\q  h3| 4JG#s oI A'F·1N2y Gxy/A@(H1(H!`a06v~U0'< ܌.dBhDw} c{ҡG~Ee?'gOǁCa$nNvya/x6ZAHAPP/ 2xޘ 㼮~c$$(Z.hΞ s@=ojΰԇ"|5gg{j+8;(a2$~!U|V7 {`6Q[A@G հafdbp&O9Dzڵ Ⱦf8T݊iBv027E(+U|zFb#Sm"o$7Aͦ^*$R\118劢1Hԥc̼AoBAP:*.@!aDPtUawB[g $ Fa>? ohU.xo`TÜ6bd(nڂN; -*nU @HOKRWM|8$O\! A`D@bرcZn?8Ki P5TXA@' @C@bRaA@`|u=)CB b?v.&j #2["+⯕+&mZW6 LE~T;ދebW5rBaZ63Ì>5 #;ex۠_k.\YA 㸉8ys=L•s;ܠJnuR>Q)}Ddɒ>e^m/sx6ctT'd)/fdd -- CqfuB[;*[Q| ;dz F'_Qz=\ *o82n hiط^WPr <x^=pd3y J<˿gTZ|-2nQYzk6oFwʖAЛ~4 5Q#`h3ƿi|OOFƠ(5n|R.쭼;w*o壕Ke-xKy[|fKo4Kk漦+*oʚ/Pdܼ[(_vZ|7ߪ(Uu>Tuh*765K+M5yQq%7dym^Yo=4m2,{7Y"8p@^"N\|p_.eL nIGA@OHꂚ:<_.FzPB4}=$)ρTc0_zFJ`CQXXm:@}_ 0#L{Fz`t`myz{ۡ>Y jhv8D*E9h trM94čeQe7E0cQ7TMDNPx>#@0 [T7DOϩ<&rAXgw!-0 sGaj_U|wW2y8K5oI`# / 䦞 /jTZ_*Uʅ"RTV-#[h:c1gׯP:7!u{eZg PLYUHm91)Qﰪ䏖Xm G 9GҞ;w$?ƒD*@8b"PfG:REL{Hͬ=j 0ڞVhsٞ=;B&yA@4yAO   z$`Y{0/;wp$" A@_Pgd @HHvĔ-$ @!`O s{Ƌte0RՐ*m1@@bREA@H,'$ bJHFGhzR*/5" AB! 2+W]J8 N$  P8QA@ J   C+KA@8 N$ PTRSNE֭ )[A1hdb#Ǽ^xrVB7@HzDcM$  C@a-%  IID   8D0HR  `M$ Q^=  d.J)öPrA "DFA@∀űե΂ @D0   cKSRJcǎQF. @j! ["V{ UbΜ9%r1m H Ucp,[,A@A 18rF4ѡC(,#A@A@H1ظq# 'R  ā@h :#Gb׮]dbS֭-^ϧ0H lT!׫Y6KwR g[~S,KkFҚT9AH S}v~#A;H :/Ђナڶmjժ6lF A!ڵc⪫Bf͊[ ԬY3S(X^:֮]GuT> a`FNJ*UI5sʕSXR gg͚s=ժU [d ܷo*VEAٲe_HI`*}{A%P|$C32;Aɒ%#GJ'1+ѴIٓݤI<머K%yeSY*j8;~2:d|׹O9վA~'R}fsM*}N{2“  P5TGA@ jJر#OHA@B BH~իWO~fCA@HiĔ'I.]TY)+ $#"$cO @!! A!/  Ɉ*“ o߃wA  ѕ|B޽;,YO9J6 G@H  P,X6TZA@qPc|'6=y+:ת-J>|y ?^_&p=RtyV  eۂBB@5A;Յ=Ű%}]>kA"s[B €dX.U&|wv%_e& c Vzφw|гx$pq̀4x ӝGTPÇGƍS[a#}ͰnjՃ9gO(U V ~- 7dU# AȸBJe9JUwC!ס#2#iܺjy;wfgmH`6Xjq(:cpTη+ˆNYxű|FZJ'T/_z+6lXI@B< ^I0{t9j ԯk ;p<ʲIc+}PfQn)'J$AȠ}+='T5K.?`w>jG"-k`ue쁃a^%tg9E(*G}JC_+̇G͚WfGנ}maOPli \ ov A}gޫ0G/j3iy;\}QsX%W!g AX7 _ca _V 䠜KWb5X]{މ'V&|=P>S%Ig"$A_~ zgøXp`'= 3f0'VEб5 UW }~̞uY?qeUhxRփ(W< PVXjvOC]}UTH<ǟ`95lՌ&aFZC`o"YsL6141\Gϯ50_ QPS o'9SYk%؟᯿tA0 ϚoYTZVbwEUڐao}mPGME0Hp-UKد%j*]u0:wQL (GOkÍs:r%`߾<\Nnvhsqz<*IA euucͺ|!a\p>iA}y >W$9_FN-yeq4zÖk'O<z.1h".\9~Ճk."dty k@N;&=k6pZk͛jҮQJ^_:ݬ+r)(2^|\A8!= jd66 4W'_*0ȷ +iP_.4Gmlw/X0`R k@dd~}wþXԟ]ρq~'}VѯTXФ5L?)S^w Ѽ .XȆ{88kZr(7$甌+ﻈo@*9BSN8q"z\$ w  if2g9_T0?vi?gxɖ ҽ@2_^ 0k,)d~OtǨVM;,$԰iè[71o!J6l Pƍ._4+0wЫhV;+ :&F)xuL9BC P~|wjglϧ ij7~?(#V`PHo @KWZwpZnX$Q{~1r\1siӢ:r$ 2']0Ȍ $s,MTo] 36mgj£092oe՜V=c#/-Q@KѦ%gkB{ i9AT.Gk njf-((/v>]1%R"&yڲ_~6+*B!al!4+.HvVC8qJRA @D@OTޘ5z~hwWsL,;^2n4a;׫`G2.^N,7nc2dZ ]`xYXu$'(¨SɰI->%_ Ôk71-w6&+ "qL{Vׄςarb}O$ي;Q<<ccPFWZ(켭si4y8A&Zc,5%#4ME/CP#[Aa3)o 6PjJ{*6$(QY|:))JQH1,yg&0hﱢ2aSjA]o""pVиk/6e>B.X4Ip^ͥE%ԓYAyz_^|.]}|rT\9G\3v?ʨY3'F呑i[6FzZ$E0HfUznF_2 `W,$#BAL$ $5z& {gfV(T܈)!}6y\YwݓUr)@C.:荖>fVrnMlƈ\L.Dc 6Bkxɞv8T_.o 8ꃅέ4fe_] P$~ybJA srNP6D0ɇAZ&5}t͚ Dhz{1%1p!ׂ@"[!5 ?cr(l @QA@ҒRA@A  @,A@E% @> ·>:@(ZS>֘Nuwޝ"Q궭yԑ3S gƗJs*}!:\,##/Sd~S>gN^Ho7Tql4(T];w*},xU](&{pgsVJ(K5>>mڴ3f #/X0mSI0ضm*2';xTLw!J%KRJz$FHKNvV9ANƕj(@1E;Y Ŵڂ@"Ho"QA@bŴڂ "C*j³ @R#VݯR9 "!#@!>LB AMa( P@VHFoߎƍ>HF'A@p!`::ľ.(ZNJ$A** (ZZl7&O˺O+ REA@@~lyK'(,oddn"Λ ,DHπSNV5g[d Odʫ5hݙv)ɓ`g*]t=6ǺkuC' ;k>z'@mݚ#x?@mwvzy/QHu|~U1nj?vJFŊHs&۟"BWJ4NӒ7|z"he'[l cy٥˿=EX}gbֹU!E0ڼekˏ:;<K[Z.e0xGm]m/>Ջ )LyaK$A /௿^ \ܐΆ1fx|U#U@dnK  BvOzϬs{Ngg0};u\XmNzfJXU[,!S ?jzk _՚E0ً?*&Eɺ2X|-=?/}?]`U{<HNgo _6PI]O0'?%drlotvp&R7?=Gխ6#ڞ|'4U|v;أءXx~.I'OM{c k)}Zm:xeWG#-U? hixɕ >s;oWӓ5ܟx\xHw?_~ n]w6ʍ PXU Q7yxKi}G:NT+W ȑMC6د_fJUu{k}#;?S޾k}4i%Jo <~UwU""Ѧ5$9Pɀy Gf`4oq0gLl4`[]X`\ka7 js:mfW_ s 3ꅗˊbb4M"~i_j0ԩ : p@xfԜy`}0/WihVkuc~:.\˰v5DQ.]M[*']{*_^7dr>8bVqv+?1/fd⬿uqt/p߅7tkwY '4ĵ&OU:HX@o߿r/liWL,s甿)ǟ|=(YZ۷ȟGeoDJ[⾝Ɏ;x(SIه룅a.}ѬYuh<صkW <>{wߡw޸qqǡv8@b?cAVp 7|ygr 9/fXt9l2fj0HZZaYun4h^`Gzh4n#VI#-a26 jqQӴIVF /F n]%mہ@ k6igFo\JgG#=u,v)WvcJ"20ic>Ժz`P8%`@P¸K/ek3~@IDAT:?Ͽ@-FY}w3{v2zvhNz@#էFvgy W yA~ݺP IgLkB((;cG02}8{SG98Ge#eMGtl{N(dJJ3VGƫ |x8p ~aH0ӫJbaMŸPPD=wC8J7e |ÇGǎ9gvæX0[as?ʑ选 NwL ы!79+ s jОٹ0UYI*q" M$lf|GyEߕQJpd7$6xCrKcMC5ssܸq4)!J +ZvnxJĎjtVZd7虶Ӓ82q]wk[-ϖwlc9Ȧ6i &0\"G4{X}U) >tl QKg{:b`m]^]<3XCofƸȯv9boO×xRH: :K`sݧRx oXH4oה&aR۶Z1"c a}z0*T4kx"?I&x@0O&<E-{FEQw}Jf_!#FI|Q?P@v !D~!!E$uv٩:Z?7:$=W`ԡx;sk̋Uwk5A*d"~=AUv`/^vZ|Znfټu(\v3 BPTȎVd۔> t a ;Xe4Qbt9hT4dV1d?3g HSng^s쩉ӰK+ rz%}Ϧ2El  4D` $C+ZY>w2VL<%ΛCo[ [4"a9S*D*{ĈdzUSNXlYE*%;P~vI#3%U8lC7.8_ 0-ȟ i OêHy&cZQ߉׸};oMGZ{.ba^o>xw3m3=l똌RDަ0JL+4Ԭ2 +kŠ_mk겎8rH7wH̀4ֺN^$%ϤW jKEI 0Gy-(=Νq0]& 0?1^FYcA@0_h1cy0_[<^MD-*CgsQ6l wQgy;JR\tUBNf;ˑ{ͷG[iEF(U ߕ}@ oGTpXq;޷/bGA~fZC3gNl.{DϟMIQv eǵRƦU(wW7ܪouׯs4*!1M՞pqb.o]8C"^| -OGoz_^`n z$PP H7)hֳtR=f&B>4k =홲?y `Ҳ4>lÚh?(Q8N.Y g߷ tOFdO6(y=ҿZ"~A odǻ6c_:,T${c=UVѡk;ѸqcL0krE&mɧA,{cig.!Qxr0 bȰ څh1ӆF 3#Ăॴj˹>-V\ ~-hiSh,,0O %>Фu69{ٴ?Qonk  lJ,| Oz__k֬?hK;?=)?g,{ L B9C6 h$%v k@F|H_i6IP6!U5/_} * ;}hC.w_?[+4u۝ bD ƎG}T :t;Xb"?R#v>!]-Hy!ۗdh>S<܂˟^5Y%ǽ]j*]7/K67j*K*Uu8V b 'm\2|2[QKV6m:k!^)w207u`t^,[)Xwܳ0s.7)yOo=*ZH5 ӱVd^j>9|[i{쬼mN)UAY3^P\ߠuz+r6n׭]wB- V?s}-| {Bc{`tl5Ag4 Lv?Nd!j{܉ê7C$s= nn|j?OoÚ򖮨*ks]^C6oş*ϔũ۲M%WS5%}UFJOYRG+aoڤYu9uϟf`EtY̫5ꡰIm7l8KcA߼kt!o = 2LGrqHir]r o pEY-e[}v}C?z/vmۖCXrH1cFJѾ큰)S(:l)pիM\|x(Nq xSOf'|:z tu(~ϸf`0^ŝx`K _.?Jr2ȱ`(HCxP 9̉?5IʫA;MGK_- yfP(5V+Wz=eޙxI Gp启wao6w۝aqf_P?QY-Z57r&=18>WO0>\~|'K0|0}򖫢GG O>^]$dtՔkMc{:Mौ9'|?0/]I׏o1c[[u,G_y=_}nHj(VEPdr۽{)`:,֧h6p֑}m5f~Okb]tH3OBY |  3g{П1tj7ﻛՓ^)NiT4+OmD* gWFK`7v4 :k? vOțA=r OrBAy-·4qĉUTEIhժ޷oq))qYrTlY:kaH $NJ|C >-9N BJ ͂#jB9r凾p|]8X &%B|Ca=%Xz}p7E =7oPy!>E1;ţhYx.eIB/0hg;vV-ͤ>t+=qzߝ/?u"QSIVdsp Ś=!;xHtˉyhJQag+/q 6ȷĠPrS0 #3*UZcO\' >;9.Loi\ѱ0_ \l0ȹ 7Ctc3Qf'$ŐpߋC aIzlҮay4^K@W`5Srd|8G'ݜJ[{{x#s;9ɍF7O% Ee߁c}үv0=^.HH(6nUF>tZof0'kc}e^vC70:no!ҍާ#oPWӹljys+T t߁.Ho;nEgm[Ḟ+d`R菉_ -+ZI.A%!/sR[4QPGM|/&jrk2$(-u0>P |}|VnPm4=gy1S|j,;>o6gK\fu%ɏ79x{_u\ުvmO> ۉgwŸOt2~mX'O~~W/ýO\O5 ud9m$9q,. "zP+(/ӴnZtM ވy> @'Fre m|\ׯ_ƿluօK'Cst-l|ӉKa-.RJtuظ7xc\G:"[%K{A&tRrt uE;SU> K:JmvH+vʩ#6w1<+Ж{vrnoZuչ aʫl燍;zhucWCdC;-~&Mqw>/aV?(lkwuI]Pgyfi1ylqNZ'^2 u֍W_}uؼٌq~Gȍs}5ר=ּt4g|jU;WZ)5jTgtpW~Jظm22j/ٚw,YJ#Uzjga #ҷ~.DyuTHՊ7?!CSOwd'^78[\mv9񻺙N;{?M&5m{v?Nihwܰq'vM8?A[M5V:;@xη{q|ڶ?lj-^%5m˫'@7tv|oyU~Wo(f˻3՛ܱh~N&Ł={fys}HNnȏωߨQ@$蹇\!~}]|wmyv߾} I헥nG*s$EѲ3gtk9=-[{eq4Rɒ3 p{9㢋.q0uC=iҤ!S)Ž+p'n)t"-6B,iFF^{;vrljT![[r3 ΞK7=Em R ]"nիWOvm\/B~!x́7Z<>7&d wi퍇)8]?Ƈhlڭ6bdZt7֥k5Oc!50~G{@e%L[Fs*Ϩ1z;BV_QG7xE{Nh2"!Tz{%l8\z'EiUE-=X1剘 ,򧟼w ׻3>9ez' JQ:rDS sCŠ6*s^7-Zy=_` ؈3yڀ Fdһ"Ax 3@l-+(Ij}T+s̀}b RKW3*2ǖLVW۷)>wnIm37,>_>T3XڹGkxp>̿R.wc˞{i7S|0^CwdJH1":^70txӈ0U1}CZ۷+h0?XmީCGbkhkEqMo-H]9E6n٪kګZPo|`^͛} ÜVb}#ǃ-1} + h*[1 \9!W Tm% } ;3`)?G+82H=nc`x%X Un)? X}1Oԁ^;+[UG.WzWF:B8y"b0n(?إZ )kŰnS/|Hj23ԡ|ܤ=;L({MخN >rK Vֆcƌ U,,;zI˾z~3U*]lJDUVҰoU7D w:PjQK4Tx9pkp4}zgTYba#dU| uh^1_ؓ\BIH5+Ԣd/iYz>'Qo*[{iʮ٬ȴbx ~,Xj9X~%{kOMk58[ig}IU˝%as#n|=zEc|n7tJD/{·/~dxٽ]mjD-T MH6 dR H w=^A-c5cCZőzp\Lfg!X»gN')  _+}~* ?1Ogs=PxXYkC1t0`,|w@PtgHu7t+)ZXyq68fN l_/8g}|Z^]shԸfkCϻg/3_w_5=`,X"}0nE[c7>kH2U[¿jNoGP|;=^|*}kܴ%;Z7l>c|r=\~ݺujŊs|>YS=}Sy2U.n6ԁn<S|N,i 56! E^kݝiWk:dPC[x5Ьm"!'#1@Do=cېP}`kv#zڱF^tm`;UO^vl/๢vЕ/NcψT{;*^?UxoaN#EkHyy(!D 7n~G-S|?y:GQ@}>Wu쪐6/PMC ! YxSUG X; |46\*MP4\X-a7`~ս{쑩Mt({'vqohWKكs:Ƴ0UjM-c[>U R?)F4UϽw-^HG: db_gfm=䡌 U `bL=+vVkf|s3w?з,&$YCUcݬ(`qW8\BimcLˌANKAF؛*[*jW z|0}4ME  9u&q76ucyг7놶\wQ/٫ڕV}<*J"nI׶XԮQZx{>4kRN0i5D[٥5T.SvW-ҺC os;Q5&h;顏^6h}5xC_L{Z7~F5/,b (f]Bek&WsVX .<}hŇleeU'םCKU3 R#E42>&YMC˒5Ao8Vȗ?m v9XğÒwO0D BԲeK#/! gQƒt5Nw'@ e& ?YH ZǫƼv;Ztz71zd [@LhshU-C*47wLo `V?QOWiH~h:E.N2W3f[W2DD;O¤S҅^N1gi]9;_8V _-YJxatu GpEqow8i$T["Hx/GR]{='뜼'G:#n/O܁eP!Ѿ x[>>?>VOd8zHj Abm2&xO)M;20/#PI8du5ߢg|ѵ8ER^}yvN:nL<I}6/=.ͥ;1\^ `@ށH#%55ڵk MTYv;s#fN~2)x;:)Kd IFd4>5g6h1՛/{R}c7{r9 nLZd?Bcpg"W1Yp-! 95kJ5dqV3X%$gv"V.oA{]'E+aV +\ͨW.Ho YiZPHqhzY?@f[ttq I8q:{=wHe6cCV*֙l28v˩/e\P&$kr]P דQ`T8BLN+y.8gF8y^V!j XqQo!aH:!D:۷\\9A~H$t]ءN Ԏ"\:#+kv_tWnE,B.ߩ5CNsʀilzn; Ww FO&ҷghufלOQǫTI2,G{Nw: J@qtY})Vuݻ=蔺~l/݆G u߀AnG:Qk7 C |X_ETjv:  mr:hPju2Դ#uq@*!VpM<ʊ^EJ5`Nz˂ۤdJȞ3!C 9 %D19s& L{rUojc=@b}~9 Mʺy`q(d7wS ٽf .DwRm!"[8щK2.hO){ *BE⼥Q/l q},l]N>K7|TF\MoM .]<V~gTN6F^o %"@DDUOhܸq4yxlԮMvc׾k}d6nX DZVppSǎq)? -7.cKrieգOz~Fme jyYs瓋:u͞e,^}pe#;N\}~t7ڑWnfBmNjW_I`/8uE|wm}Min*RO%٭39sQFzjIG;f¶³i"DT ,/X`mذ!Z=I8}(6b#!pܦ`=b"1am)F *z*@~y*^8ǟ$JKF7n<oo=JFD 73Zgz{]~O6έol0f5q  9DI=l ÊA@/N:氦,&Xq7^6DIgcQ3[VPǬ& ((3B ' @+yެ7N{¼>++ + zo}:1urkLr^';8WMƙ5k7>0f,-kV$[/ VNr@&=|8.Kh[mё` .Af&-FXg&.t3cBa;H5i! =X]{_+j~|u)_2mpMBg[_m.%[?-{Ʋi@(^^"4PB2#rz\ݚN㡺 AK⛍=["WaZiU s4zh6PW&N#Qcx5Yw&>:cXh ;o#YI&9H@IDAT]D{̝ C\$bI:jWRvtqPFf5WJkK[W3UUl#bLn Oz{!הg;<\&"JvV%\?!'_Z2i{bpnmWƽyAV`/J*֭[|P͞=[XB-^XׯbwEFQ>[Wv8敀$AJMU֯xD*u'ပ~8gw:~<ꘖ{ Pc*B(Yy`8V+{{%|aZr+ֹk-WKUNnUOɀZz%>gUoԋ/ ymDNU'^ edJZ^<V IH3/PW>*P }doM'YOkeGpI"(G iWTvM-PLkW_" _0R7e梷Uj.'%bзWZa _6nʭ|bZ\+"}]p⬊'yWfۋ !zM` =rH<ⶳb.։d=Q8_$qw,) #–;bdDȁԮO{O=˶#!*jx}={`O'?M7zݤw̞<,4?}^w)z&o@ZujSdrW.`k|D`EֶeHq&S+ 2#?' nFtߘ u1Tf\Ќ`lzoXVC+'\/0"7]=\0Rf&2!9Nw;6l\̱<ۧfLH{Qg}6LC-[߮w,f"1H/MmOwN=N9\2g NuOp}`;Nd+3G*DTڿ_YD·cœ3W,2G:FYL#CjמSɩIE+=#WDry%rd!ڼy3m۶MH+iҥU7}ݨi 0@F\.9g)4JɂD;j4TTFنq! n71 }v C<\j:|yCIur:.ź_6:~ʕ%o}e'o?F6?LADué~}2emԭ[7B9jϱ#˞5|d&u}Y6x'^} `f S7;{ތ~C! b%Q1@O?3'r._ o}Νdve6yٕz"pg-awن6n/ƞb (b%7ݻ[ۊ!"*xwԉz°-">}^4;6k{OK;*EH[ 8"uvYr|_ eBns552Fj=,C_Zp=GS 6v~CeMOzd͜pyFx1`(zDJ 'L4Ǝ.a|9MF}!2kg9urHWH{a+nb38DC ['-yʉx UB''π)?\We& 9u\eKS3ϓlF2x!Rgc|=p]݌wQUc-7ߒ1#/Nj|.oVs=} Yt R;ӑl,a G9'7 VD /7+6}C_buO>q߉U ຃Y {1:X7t9\h+c+@{x=1"vo}8 <#*L^/Wڵkg Nt!B3ZONu/_APMI(4!5L(?pBY`@"}^]e^B8-r)Y쎻+=^Z^);9ڗX[2wsF|$J!y& G[l|Iײ6p7[DZVa"{k_0q CAVl*X%Z) so0 ^67S^]G/2yR ;GWA\#&ydɪXb07Oɩ8ڗc9G!W;O({؟I,Rc5:kW*UP_V pVNcйJep˲|G tBꍛ)ds*D9r[̕ۯ^/6[rdq!KV- 6y1HTKO-u2'< Uj|movJmJ/6^}[>0^ynRKW)ssھ](*e}D"ǒ9J-SQ 굕 _H(kD!)F$`1cু͞&NH>(G< d,XW:'#b{c͌D$ZѶwS0-h>o|~vsD]-ebpnu5ӧnX7BxYÆk:5fQ|[Hư[8v };vy` {Tt߆{!X\]1.θW|H5]K3c]={*8c~ՙгv8ظ6"ܹرy1VZCΘnY.D }?Zah?uܙ@w;DQ_.Xhpw '_;y87(y#]m#ԨCCf]2!Ody!6-b@f^w ɚl\oh.rx_2RnDF:d~&N#s= w>c@lbfp^uRz\ojD}c^7Law#4SVe1W~D?rR/~(P *znN>}oȸ9uΊ2 ZC0E|"7akM ?ru' hC^ |n1)ի6D[Ζv;_̎W9ʆH[6C2v8-0b=@^MsB?H͘Ejʋzۛ-Zqz^w_$zbjCϸ:DvKEƗq  Qj|Rvm'5;_2?{'(ev0.F} 1ouWjOe,v:ƍ' oz"yKj܈oH2|}1܀MLn f(DEL# ,+%mDӬ(ֶhE_^'B bR Ј1cЋ/He9CZuCD>gщng9]we[Ǧ/݋\Ӟ'yZw=26&}J`d$r9EBG'<Nm9Qt=sB[k,sgCD(f`/ƊqJ҅ݍR<k\؃AӾ%<EU;Ch3cPLDDd7CH;GÊ+RxT@Q;drlA" ) zSDx/e_9D (Xs5.Z{yvb8c2q@V49n8?j-=nW _}ŗH=o~·ˤ`E,A.D ݈ogM'U݈ !`\߃:ؖeYzJ~2Lҡx؀{J䁞U$ bonJúfƶK=Q0`so#umԶ5Fݧ a"hoiho.Χo8K> C=FrVHq ܆E+TCL}z=0A֬.ƹBLEg{̨o7C oW㾦3իG,ĕ›;w\Ω.g'K"۬{=lcp 9Um.2b_givu 糹EĤ Ç3cWٰeۊ޹*Ћ/xlt㥲'h g.&aldpѤ'ɼ_b;(k6tw#z8J`,·foߎE𛎋ߔ" v BǍ${/UaQ "_ F~p2"MCs N#Wj&v|#f5w( 3B Ĥk{u:fʳuyzACݺnߞ^Z+p3O dfH{,N~[$0=rHsGJ}t%d$C +R|2? '(j!'Z"0|Ԯ]Dllrh}Uo{[WrYިZ`p(Q)!ڛrp_B$+NڹsάxJm9>PI .Z^kwަ=pߘ\l`i5P 1zq2%@PZ-F}nH-u/t'+۪|MΛ7zݻpBen{nc! Ҋn6nǸ ~}Kث#;jx!,⿻C 6l[Q=L~zk7<B4-`NˮoP"Q\d]8 E'Y3fFu W,B ~};= ,"Q1߿?5h@ spv& +x {V3@~(8Pݏf^t@d$"mΜ9:H5K@LFQB DT 6m^G'`YࡄRapɨ_Hd&lnڵNi'Q1XH,̸N !  Q1KnٲE џl_j 1 8("B@Qz)jҤNSB)C>: AB! D1Xjh4j((EÎĆ͚5J B qLe8q{k" `F=P:MN:UGAo#z1xwY!"*ҴiӰqƄ!! B"*.f\XDLp! B"*8hLwz'߿Zj[ֻwo߿o> ˲M:ELmvJ{q6 ĝ53zq@{tmx<fث q]3km\lٰy_>IVԬY,EwInJbXeq'_|832@z N8 v^i,pv.55U3~&u{$ W vAK, +^8WOGrSNT$꺣Gju9RD_@qϋ"E_%&U\$ևy6DB- 7E:F e&^ξ΁ A…PB9Ђs; ,uou!}]8MI#GhׇSH<BH~Yh~+eƹ (U2PK>b lڵtSժUQ ! r%+UT>}JxvPƥr1/:cfF1Xʤ8hAVTe=Nnh޼yԳg ! @Q Y vXc&‏ rejѰ_EIw!׀hԐ\>HBe;>\Oj֬-_e^6!  %䁫@qkC#~AI@𢌊{7MS9#Aij} dH EOD!HcHIR5z}TsAJ^o! p&Q ybn5BG됂B@!wPB.?K` (92 B@(6\ۛGu%FB@$(+u ,"O>Jr. ! @" A"JB@! F@0iB@D tn! # N4W! @" bHR"I&Ѷm۲FF!(R!T?8q"}I.i( ! 0Q 2N6B@!bΩB@  dC! D}T(@He˖Q r! !L ΆE!$JP $WB@X,# AB@8(?rB@! (YR*B@!|8eݻyhI$}ٷ޽{I&3!MB CᮈxߔN<;v 4M:zhN:CxE}Rճo'! $G %3#-/^}Q D&H 1H WU! # b&B@!$*BD1piF ! H Q UjYJ=zڵk^L!L@`"2/'>}%aIB@&䦳)"B D1$@\! @n" An:r,B@! 2I@Lͅ@v@"$B! @" HHDҕ@Pm߾]B"gOF <Y#B  ϝr9`!  bB@!bNB@D1F!pqZx1ڵ+i$ B w wW9\F4x`ˎLGd# AiB@$ A—] ! H6$! A |ٵB@d# AiATR4uT:BEB@# $F :w,FX*B& =6 B@! HB@Q |(dB! @! BG@ K`Ϟ=Tzuzw2! rQ riRt ,+9L@>{! D diC"B Owޡ;vAǏɓ' /B Ydb`&4a8p =Ӻ="B@&P@jժ/_>tY*"5,+j9BEڵ+-\ʖ-4tP_}۷N:cxs$Wg.̧po޼ZׯO8!mmxɲx{9^3{:'뾝ٞXs ߡ~NkIA\ 1%KxԷo_= - hq\kQ2NB@! 2B A*UO>m;v,ծ] \fB@%b=_,X@_|, ٻHb*9r$}7IJi@{ !խ[>2/@ۜ={6uЁ7oB@d@dB@!H$-BaD1p ! H$Q IWB@!0n|0>\!kƍTzh4BK@z r﹕#ESbŊˡV! @" A:rB@! " 2Y+R#l=! r/Q r﹕#EO]vZ*H@d<+&! 9D@/B@!D1HƳ"mB@!CD1![! H@d<+&!DXbtRݺuȬB k H) (Z( :J,R! M@z l-B@(r! >PȄB@! \B@! (>2!B"mۖVX !+b+NDn'$J?:t(9L@>{! D@d:! 9L@>{! D@d:!UR…ÔB@! !"J|a PR =r! >PȄB@! \B@! (>2!B@8P)E'e.q.s˲mvvJӧSΝv f968wN n_N8+Ni3C|=G(8cǎ=P+I7kϮeRq}ѸqZjTzu`Xv\DIowN%}78}/cr 朒wŋѣt *Vz p{q'O$(EHh69#!>p$ȑ#T`A}MgB˦ p}*TQAܟv=ׇS:H<;,H;B@8(>yt! YM@&* ! p0Q tq_~qPYEL2pB JG!(!$B5i KIJFZ-Ze&t?RB@\j.Բd!f ! b3fEtk8)ArbiB@0Q pH[p?L깩eJ! @ @& 5;]քIW wu 6vyrTB@$GD>LP9ֆ;ɸ >Al%u2 ٳԩCͣ={CcB Ib$'"\3 ~peB@,%)9SZӸ={zm\7ߒڱ#mtfwދB@!V A? װ۽;o#WkH\хR9PMf\ן1G!5c&Y\^ ! p%(@n `m=K/7W#B݋݋ ^#Ȝ"m?dTr))dp]g\2 "8$դ>X FgUD)3!y3l:)VrDB@d`,ݫq:]FWgRIYўd\1= ~xq2E3xfa('{Smk6&n(U@NBB@!I1s7wۧb m-X0`1fz!Z#}wؠmkrLv 'c.J C#\~32)B { 8_1˨XT]mQK?$*WʕIؾM޹ ~[cm 1@p?2mB@d'Co'Wf:|W_#B2z_:7A]Ojn2άc??[S8=PD{g>TL (|ߟ6lؐ*d;! @Lba㦾dz;%뇷ѧ|\C23Y#G2? d DRY1u!M+Rܓ1ڵ%..JѨ!ޘ{ $dp{Ňd)B BtR͊B  v'r/9PQ146sRD6O T @@a] CerEv%_v"*]`]kdi)r1ȑe˖|݆4λB %QBOGɒ%~~y@*V{2ç̛I8L~)rl7V0>8 썼{È^ ! `zL$3M?iveu7nԜl=SJ8 6qKqpl8EZh陮';+(Aٜd_6m۶ѣGg'L;ɾ|7R>}:\X Զ2:pN$b]pN8bpC$sbڵ3>HU eB@/\kcp{t]N)3EGh\E<^9kj׮\veT^!k$@! @.$ C ! ! (\7?hjժdr ӖM6u%oȃ۶m_7n#oA#9d)S`- #uir-aw@j޼yF࣏>6m 8 ,ZqݻwH n\hc *W?W_z>4sL7TߺoY[7/ ⥺tE?zGBnԣGŽ !X}׺={W\+`xC2# gfL͚5˷LG 55U9R^Fp rcYibkl `=c S.?m5][ng; ۷~;)U8~H`H2w\B ЫVv D\GƱdG Vয়~ɔ/(>MC/] 'pupX\\z饄ql+;"قidgB _~!rF ;~l;å]j-xl4|3tT@3g ><2Hܮꪐ{$ gl $pI7 A֊qX!e*zDBƒ%KJ(b1~3ϤW^y.;@FC8 (_8X%++uēyHȺbcUI|ӌx߾0]RHunsF~rʥWbt/[͹k׮NnMޣ?_#Ұa0^VZnyicWfw>3남|#H:/HQb'{駟C XFaV$lG&w7dzx\pرإcǎ@̂ &-\Ǐnx `yf6_9qC#d'DzHsFugϦ?X+x|q)o{LFnjCgua_ r7?`'NJl%9)`F*f Ky n.ZhD PP D#mGXC:X8zpuv8XG"v=I /]rB@! !HxP !  vVRR! @' A?rB@! b' A쬤B@\OsYiޅhrb;QzuL 5BXqQ7G +4mټyRfMtg{/ +PᴻwN8Noޞъ+hԨQ"d OWL<@@ICt.?t胀-:t3j< ~!m6 7&CDQĦ&w}v 7袜T?9+$}焈˗/1>xt5(A((;'g *XF"[8=ZJ\i/BD$cK`ĈVZS8ݺ.XlՊEVY űABCb*MBA8 -AK Rqxtő8VPH4*UQ .jY&<1,"!oģGMETρ=Mvz+!]3zn6s…D=޾s￟:w u#XZ5]/B"B[ z_c&6m69 z2pG(pL֭u4PeD1Wc `x+ xHy )ߟϢ]vzjrDS]wu:D*60]=@y뭷tA,>@0Қ[/^ !$BVC(h?l H֦M~{ժUy$.$A~pToFղ\ib|O 8l v?</^CWZ I 駟;Cȡ `>V v H,PN.bݶ2eы>|޺u9yd -Z{ `{FR O'JDS "nsRc$C/[淗eƎ7`چ 6hA2eq\P q^{Ozu13fh>͛G8VLcȆ_(Ap"B@ `C;X~@jtvV%w%/Ծ z'` [࿟ҁCa;{*C/NJ?p@q:~D1!sBۧߔ{#[8nˤIK/g7zLl3p=lРOUPvڥ{| &0|(@2v{XPuHs F@' A@`<q.]J8@`='^zM aw1@xkn` h 4Py,Kk@6o MY|aY0gvf8q*gǛ:C*dPvE/]V*܍BGMӄ!1!eHO\.\P|vx' ;>'onEQ Vi*Ɇp8cYdNt]sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o@IDATx]xTE~@Ko"T+򁊽7+bdž W齓^Ldl nyͽw7sو $ !A@A@@CB  A@RDbP  a  " A)r' {SO=`L:mXpw .^{ۭ7n܈YfC֭+O?~{y1ƣE*CMf|XfSAAAF1fL&d,]:gu.jʩ=LJ_|#III(((O>;vݽ6W\q_#-- ֭[~4lU_gϞHL<~Þ)7 5O3ǏGFFȑ#?qС A7NZW^i#uhI؈rJ'FH/Pda#2  PĀ=;No-$`?|Ao4w_~]qƁw,(11Qo&-b񫯾}򳲲0aՎSA7rѢEj999عs'nk)bgtMs%qs(n@ hC6 &RK6*dcDG裏D!vڵJXNA@jg h7 W^QlذA]y1|I ة6D$;e¾n:xl;A W:?vQn:.,X (a ϵ2bmn-[< ΀]xAC m۶٫'3h,vA@jg x+K23}LqqqaU]-oNjE]/W Y:[`ta)q!CTW96|?+~̙>{C={ +{V؞Vr1۵$W333N3`)1A@jW%Tԫ"lH- /?bΜ9Ђ!9p$;~;{NWX͛7nc(IG~R;Vy1xafilEmTΪOE3 h̀*~YR ꄊЖtA@ T5}z޼ykcU:w֋uݼ8E"Vqh> J:"8 x9hਁL6rϔ)ST:GVd;Xlk* pĀCXuӦMS*Ŏssxe< *F,(X|Z9Nwl@?Ta5#;nY ,QM~8X8/Pܖf+᪞'bo!͌{}'lҤI M%ʮ'{f0q|!A@FD>C\x1h /8/gFh\ LF6.P{Wq HnF ꋌl<P?-6ZU:=$'4nܸn؏\,:V6KP:){} -*Cz. `i w P]F! x'U+ٽs2*A@A@xTiRA@U17'A@<0UA@|a |ɸA@ @&A@_E@_}s2nA@AcPIA@AWWߜ[zT֫߅ zcP=NtQQ̅Ӫmm:p8j `ԩ0uh#}qb$%%ˎ_+e%Ϯ5.* +Wěo3㕁 w# w  PcPpKg w# w  PcPpKg w#`A*n 4b/[cLRH^6lPL| Q%  E@+  >0>d gJ낀AbbA~ Ax2K?F?~25AF\ Cجňn{3b:LtO0f٧OZOqqw<;~'N& pjσ.撷M 1nY\?EUϯnU*/^5|WBBB!"hDllg`|2=K4.#22v:`/M@@XyH;6EIaqs^(Ec"Ƅ|W&6^Bd8 `Bgp{L &{Q vzꅉ'ڟkF庳S` i\.]A7 Uo@)Ç޹NCsݠ ՒΠrRNCA@8c18cA"` GqQ Ҡ?ư \1(S!aoA@AƠoDfzdL c/F%  d'V܀?wľ[qOYio0s+1EiݜhIN#;k[ῇR%Ua w7oWП0vcX $ {DQŹU6K1Ly)baaX3}+:0۩|XhO\W {GCPS<w" w 63vPx?"5VWɠ/';A;79$ 07Dl{}rq ~s9@xZ_gOA@n1#@_80`-AIaEh#88\|%Ve7 |W\M# Ƈ1Aصk~ /0N@2AVƠVG`{kaiQ%.A@\# k\$UA@cP/_LZA@p0qTA@A^" q kI^x!6C  Ta  N:Yf^5& .Jw'#A@ja jRiPA@]1w'#A@ja jRiPA@]1DEOF.x3gD.]`$2A@1駟p=x0c R  fuҷt*@39Mɓ'7P   @"Pq >SNϓgAL4h\pƍ=ܕ糛L&{[V;u|_e3`H+ K?t: |8Δ"e|)[+!!!%|r0JS Gnj 'Oڟq4_%/{C{7_Ǽe\=@0<Y/zԩNŒ%K|wxx/OC=99̵GFF\kN:t!CSA~~>z w-))I}CCC}w_D-MN?*? V/ !pcԨQWYj  P:a ytwuWȣ  %ܹWVo>wyݻw?ˍ  >t˖-J  P%ǠIA@A@313cAfXp!~iLZz0_@u6oތ9s4d!\-u)nccpA@yli'`.,ۖv`3C߱b߻W&pfcpfիۑv YDAhB!(܍xf?SC~UYOFQ>bH5GTt=҉Yrg|9X+N9'"qtĴ nwx(9doCo 18Q/BtˠFl(z (A㡿a{>Ti[FEPނC_8~h5a1m4dv0f5ÔwkiXnMi$\Ķf?pth6`b8✃8M$t^o̅9C/Ղ4rwO$FՏ8Źpbh9S[n !E]JD_5t;^#Q`XEwT>BkY6\@@x|ul8&ۈl2GWߋ}!Zrk~oC?ٙmP6=<kINW#0};W!87 0vk`zjG蛴+Б"ir{3Ƥ]kb:, JCuJjR*9|<Aqk8Ĥd1wU)0qW5VnnêUji?Y&o GBry|Cj!AO~g06oߏŰ,)W^=I-Db[+F[ 9"NZa)@ƁpZX zcڎl` *=f5R90$U;T o:Vz42/'O8;>dHGtqtmd#pAqP6$'~f`uEꖧPpD`d{5.jĨ)NC4&LJnSbflEɎY04FPd'v$2 U)/©}# o# l<#Ew-SʛPLQ ]TT^Cv0.,ڽ Z^ùW@ߨltXc۞0 'U-xZ" v֞ګ!.VrvBϧi tmo8=kyTd~?@v z -?(5u{I_(Q),奬%a2 \eE$ lsиgVkAX <"^.j166GAJdh23Օ͜M6y]EzMyK)4NȘKEџ7Zzat{-TU1'#/qZPY#jmahEdO>0-tYBXmt,/̅-' 8B#awi8EGfj0z] Kϻ~D6^ZP/}1<f#v?1iiDFy]uvlL-m@ELk^Z۱nD?H=ג̃si@nb <4O1zCo|\Bw:|;ӏMΙ C`j*lB" %ATD٭"^Q#%$ ZFppE4]4I*-k`D[WecR-؎zd' ]-W@~v9E[a [qzksxT=Tj[ĶNgkt! /_F\A_nbdՉ1 > BbkW {E|hB'愂Ŕcx1-ky,1fP1JӿS7EYer}fR!n#$ED/3Dk)J`&ȕCi)t;C9@?wJz{a%.(;V˺T}%Uh+I< oidoڡlSc/l1Pl3c4cҖѝ]6ފvJa:黛@kU]Y܏cSFc>߻ۿV0{rX5M.B־OpddW0CH 2lІ%;kqt"C Oh9NikH“Fil'#4a8BNY]?-9(vI\"]sj!(p!)6:G8zt-:O@:2^Z۪>T0$b D [\XrAC06Kzڞ.70dY"'ɬfr-F9D2 2/L16 O\f!7im' 4B~:;cjF1aL+)b[9IK`*rclJ?Ơh6gdyy'~G_TlsШ!y/_{ܴ)='u0^N$iWGdE(M.Rb +2$ x\$ z0s`mߺW `O(a{ӷ Åw;wokﳞ6ًrD9`Y=I\Kʍ/!PWۗF/c2wSgc2mwxRv=xS heƠ"mlLō"fP)&mNR/!-ܵsRM3 4l4x+w(NM$mAS6n5c8R4h}_qJ͇b1gPqr(*EU"I(VQ%}|2| Ԋ}eQ˓ZHȳFԈmɇn]PsFmԇKnTF=3 [/A@/y0 o0d%BBBY[;fYvLՐ?vt $wbU7/].ߡJ޴:E]w#1? (#[NPk hrǦC+] - ;G'ڌWrc{#q$Xq##iMwt^R"ld`"yd{?"RWYoA&C3?ɕG_F@Xu_~{2v8}&vۿ@.Ur*zA!sJڐxH_b4bQmVKg~U$MyTTVҽ[>=q>,ߠ/qm0tva9ƥ:E@$u ti8A:Ed@8v!Oi)אA@( 8F'(3GުlKy: 'E[-A@fdg;D:F~ƿ)}?ڤtduvxi&=ڄ߀a6k~:oK={ 4icuu81^r(K`4VZS\Ll q"路.- ma3ߪ35QҗNcq'ȵU1pc=CW< aHE/*p`IXJkۏoye0@+C! F͏229h׉OlѢ_raLZ@ټ<[+!"ht\Kn6bF߲g}_zZ̈́."uacm_BGG2g@.r2`+*@<.Fap/["a0N ?!b{HdT ]T,@ɫڲ)iTDs'&1liJKȹxt\s՜UH#|j $ UG5_!`/)JgFK_k(/VXke|h F< n|K.7Q`<F38ڤk;ճ]w _0Ỹ'0{a/5xB/Xoi/ނ~hqFl )Z yl]}) 'ZtBJw"$J*BH 1ЅA -{_HB`rxua56 ]Vd n7iuvb L.ktziIgt= \]aF~}h!怓a]TKVW(ieVI{N Ar#gj+<ܗgw$L;Z0s;rLwR fY{gя0>^q]c w}I`DEbزItX섙TKJwm[YWR}*u?ȧ՗N–| C){ Y\q`ۺ)_Gv)۰c!$E~ [a6F?I_q8L?DG 2)5(F6O圬V)*!3G)A-iQD&ucGv t玵?ѵlete˺z>ND >ΓҙYеp>)ⱓ8~@Kߢ w>1臑J$'[D td_P1}dY WM`~vYYNP<  `'= t2OFκԀQ4a9 =;{.2 oLt:]eMй֨:ά?V!he@ϻ`ܤ5m dU؜ t(*"8H Xjzb5>[ワ= Hyb `;G{iB{֟?-ͯ81v_ʤvz $m81!KslJDlҙF'`#UCE -6l؀?حR 315hB;]{{ rnGIgrbr{$R_w/|s|y3G"0m֞؊P0~<9"^eՋ}L>JTר) HGJ&}aݵT1l;6jHuOI%whᖬѴCFDmX]a< σYaJˑo;Ŭh^B櫏˴du8Nfƥ}9vpV)9,X:#ҵN9hINWR`u*q/-""Y Đ8K F@ 04gC;֑CXw]Pd|h]@5heCʅP߹7~ӷxWCO &)tQxajF_IY0=@ ] J0J{يn5`~N?T15trgCČ] sӠ'dK*"yYHbz 'u͔0N ]N%2wAcuFGV)_{v%7\Hq26@w23@m /z5+xțqb -zzb;IBP0grމȚ%?c1tghч:ENpL_´acD %i->c@ƇN`ZudϋQ!m9DzXe4y&-H;cxYk#0?u @@̃ lEW72җYGb$2G6u/# _cOx3GuwpS[~3,bv+'"9o΃IVE<7]TЩK~AB$Ooab#a Le2Au)2J @U;g:´{Z{f*.wс&ہl*Y(M,> WT=>u Gz >{qXRHvν#;RCvu)`OEd U6ً\$ dq)p,w::ū+` V tHlQ.sNf z(5ΛY1 RIsU|ZbRVr4.#}ތ=lw= S]5^67ʦWYf.UU_G($j,=y Jv| u. 9J`h;!?MX78{"& -3LzRe gډ%{+W+ SP >ސf9F҂֎)r/x!_~A N1&A IULWSU9~/1>[ŋgzTGXUMcB6}?^$BR \-dXFf"KBu ÿaf?};-S| {?ՕP)  pFHgOw?q.nT!}Ӄ.wгgOy&$-Ps#wr5#L[no@RW%ENww;<jDLkF ,sF;DvbB {J,\2̙Hr1Qrb44!pmԐ0m{\M[I2<2 S9t\XN5#x"KXTl~G)R܂|; ;ȼ(0e[Rn2*p_<_ݩ~'{?)m#i(Ʊ_"{I/xl9Kkdnމ0e)?GlԵB/;R9H\G1X*LYӁ;?u.~qguJ"ɕVܞJ=d2 7 }ʯ߱݌cQ6ו+řktQ(H^OEsv;k׫3.HTDE| ɴBLE1-%ō FgȜwi Ʌ买LI:26Ġ$NCM(qPy"/Rf( YwbApZ4I0ךPԕ82otʓAд"_KE)t bcd&g甖g4,\_jGS?̍BFዑmڥ"xR/3@oh(J-ZDzSחm'+C@6,J[“`kvop8s303р;^@H1(l:'D+݆l!UebˌM`dg34 $&?t.՞1Ǩs ͑\OrZczVA1A̔h9R:I|hr0]{L 䑐epZΪʋ3MYp>-د#iV]vQPl_{ƐƈoJ=":\1!N$iGHhgm~9謍`\1ަ0 RsC3t3Љ_hpb ~*Qb@lK 'M|5Z$(n_SH]JrYtr83A 8{A@GcP^7O5=OMCGف'(n X6}6uIWWFzkkmN$ N9!a^٩P+RGJy<8Qj$pCm5e3b nD (&A VxPL!+GR2󪤪d  P'i>y_D;EvOcCKQNE-""\bbDA_ ~ jAu@I+Wr6}}hr<m~I$U>/ưdñ 0LV-1$R s2n|AK #1㗝o6rG‰‘s~9'b 0YANe酔!N9VRר XOX@IDATΔ$J;[Tv.KS #Zߌ-!ߩ(LYJnek:ڽ1aHe(^XKVd4YЫ\e_Idd2rU<]js#),ZR7y6X !;}U:YAD;{N#Ƅ)LyGR?Vmpi^#;܇"EA!mȣ  "O}I;aHAچ;vDltr~Peކ#*o#Hp* @ZXb,Y-[b„ .M~!iQx{r-p*&dnJag*)>0J3Y[CtCTg%vå'Õ9aʘF1 qšH㝆<@NQ1 (OHH<'@41cY)+)plOb\WD9*PSv?<s?fş5Sc8Ȇ gdZ29̉1J M!A@8sѧOuoի{p 1kci0FD;HPZK+/ưLA!p G|S8,SXC53C(F{?,S`Ϥ6td ^jz m۶ž}'HIIoH2k3kQ$g&C8(KE.iR+&/-[T=7*dڔ@+>M6!M/$/8-K];IbJFNAZF`ݺuꫯ>rH\yhԨD^{ [lQi_=FmM #GЦML<W:5зo_|8.2|go|rdddwވƔ)Sj*\|Ř9szfaСkCh"uVt OƜ~ڵ 1rrr?00wu6m{ 7tmۆ|̔9>֯0 w!gWQUdn$%#~'UV-F-eKXR)N)jFbT4D-~$($@M# ͛@kA?7n܈#Fqݻ1`eCо}{mvd0sHN9:0g4o0SVZ[s8P{lrj[/.{İʦ,R>\Zo *.ʪhsxykoDi*mαlp7x(C|ֱ%lrc;N88~/c;fڝwމI&\n|"M[+0;.5+9[WUnl=<<k׮Ŝ9s0|q?bذa'N("22K.E\-~*N*:W/h,֭n )~\-~֢W=B芍Pe0Ët WƜ{I^=3` ]x{ T~o}ۇa3ب/ڏñ @"PANEZ Zmij)61}*'q"H rM}uf,|4?af*w8; a׮5^Xshl6R 1w8 ]cc0ax$M]ygq ..ъT۲ Ú5ݻ =֭+uִ]*?I"iE(ճƴlYTU ca@V6ePzRA*E@T #@ TzUGFƇlКsȺG|]MOeӸ8nH66^fNA ;G ״gr .=XD;YيR B҅l ~Lye%x*RPKRa͛qqE H$Vb~H12cȃ ~R[~\KyqgiHH~M7bMNꔥb R݀2JEV "ёOm4wraLv5q PxY1[RҔ7x ]م6*ÒUhm$/۷/WA`CYx=^Çquaĉׯ~Ww[˖-Ã>~Lztқ, |<,?OhߖZ* GGN1 z;=ć1ƀ UW]{_|Ei8p|͘>}:fΜI&o)W^A3=y,y<<~8ơIvB@}A@Gް Ϭ:gO`B@O? +W_!>_tB pHc!A!I <1q .QS56,5X:hf,$ x3C 8k8̬}Qh6lVXQ< U Ph*Ȍ_E@I h"zcT*1p55kր.\,^X.]UqIo v06;˦ 6Y 06m>}xiiS?xHbV(1`Ûn'кuko^ X $GgkSج$OWί8j̝;VNDVB zjo /EС2e ?F{饗b۶mJЭ[7t=iY tlrrvzHj!-TVkZ!yصkڴi@jj*VZV){brr2]QHąE)i893 Z\A `U>^8ʆT)cCBBcΝ* r^0uTc ,n|eJ o4Ў:~=Бߦ*fx5ć110ӱ0++ < n NP?D:. z.ǀ]InCdpg:VANyp4C'2d28|WgBJJ :w^{ l($gz4o]+@TH bƝB pS\Yv-vޭF޽;Y`bWŷzKEGd;*$&ŒYf&җ WÓ<F9** 6mRltG.GGG;͑}Ni x 3al;'s2Vq |c|vިvv鴻i)dT: P]tG(ymJ%/^~e 1͛7ѣ}l2\BNm w az#57/)ݚjvaTd29yd\!@䉏2h1*u됑A;3>vl9ؑxν}[uVִ-1 䏳.|T0ުV UYwan?RN<=ծ К1 ˎ'(r _P6ϱ 5vWY~xu wycɣG`OeӶ71@wʿ~d11ehP;^x3\EP=lj|F.CRVI&hL>ǹGg(p R䵪]:l<  PT u\TT|#GDhh:1 ,7"u7-Ɩc{qV-u&so~ 0#Ɋ_j(l%;⁑hF2"b1@zDdXIm#iI8 xF ;\\|)8 ⏛]]φwzHcN7. `Г< :A4`~_=:Ta^]RƠwؾ}{cb/ &od55G)&`u~ڲa ~Iw}%甆(n84~8yR Gv~ x!煿l"$58f*7Uq 2rpyuHIfgJT|V x:ħJAN%(JWGۮ `f&#Zߑ4i={*ڳkO*7xrM6mKB8j̘1={2HlذDz.|Bkjޜs`IRNNN k|K.|~!2r0S8yM"㐟WB&:qh K )dcbMHHǦC: IbTg7G;6p٘0tk !/tdMfV]unK(7[@>QV&s|ExC:_}:g+((ym Pyyyy1c _l{uD6ו+WkozJy rDb{18UnME3g>ltQ{5ēxm//AÆ4X'szbvFu.10d6{X{toߐFR/\BMV I\3iϝ_ܓ&;u--)L yɷWaQWax]}9q7ήS%N}7Րޔ>״pOjF6oތk8ŰaðjժBRo|855Umfx1Pp#&&^)S]wfϞm$o@!@zuʼiDL Z'a/ZwŢ]kxZV&~ۺ;I4$SWU^2 pž-jȴ")8$RиqxAp'Q{nW 8 6%GH CYKuG*_ L=Absvi+%).4'~@14YC!22v6C;|*V-[(U;!!!9r$~itMEK}^jƀ5FGG㯿RAȵRG3=~xd|zXӳ3՘xUQjl &kɷdz'@;qbiبllAb7am{x(<6}F/ tqU") .3gG/Bv8f FHG 7[p kvɾ=;w[!CD^[FؚEnvyrNR[qVuӅc#e^%H4Ѐ w9W+ȤU2RzKSפ60pIU=]ݝ*]X䬙pI|_(I&wY -4hb υXw<&ݻ PK2D£>jJчA݋c ؋p&'6@YGE:F@#J\qҤ4a|嗊$?w\eg O_, Ϝ9;bٲeȦ"e5!(gI#('THb`w}W>/ԇ ֏{%ިHtYF@#Tc)v]+{v!G%$FhK.QZw߭$ *Ah4.@ OEťStSWPb bE04g&%F@#(Ii #dJ̜ jkl A]uyBU"WV,cwuhK]> e10##,SWf9OOş[cxױ!"z#PqW/o߾|⑻-)_͛]U݂F@# ӧS]s#g'06XW(M'hʍWcSXU d 1Qwjg4v3oF`t 6T]Uؒvb^7;fו,4ydJ׬hl m]-Σ4>C@dxU^7bU U ݎF@#p%Ku)F@#Pyxx3WI#(bU ӜTlضm[PQF@#PSeݢF!કu!2+WTA֫Wnj$]F8O?(5ykU:A2[:f/3.]h WnT}[.~G,]WEt bcO\`>$%",Ⱥ : C;>ߠmȪOwJ(nBV9<<\2mςF@#`@˨9{.A=}'vۮLEHБ#:^7< Jn+k}VC~])vE9)V^23ziF5I~َ?0 ipҀ%R2=c>uy.~(#;aRO~ڙ #J^@iu34;t`osjqn]y'ȑ#GΝѳgO<5hʅ@1XwfDqW} E/1EVp|4`#(,2 "s@,mEm&:K"#q 4 }l {PLĽ>:A*9>%N@0] =":\0?'}pFǰfJo: UJN]bjȴh EyW+}=P-s5jk7&bݟ+2f7ň*ah9PibW^jZ7Zc1#&SYF dކ_T2 G.L* #hpd߈>h 8N*pS#2 taA"o"#f C u bldRt??'hOpQhRYC?6Żs_/|•W" 5 2Ȼn!b>ׄ{*gbV{-ݭ/gee!'';:u  u >>n?-[`۶mk},0HHuta><1/$ %Zg -SzI!002:j˻RiD;\+ QՅEbqF<=z4}x㍸˪z=@@e˖_:EB9) `4iCzH\ADdffb)5j|}?222l޽m 6`Ν>|86, e.A0oytW\qbܸqEQF@#(^r1Sd( &-- #]F3]tt:4hw} /Э[7HáC1`BH>HHT8&cڵf_.Byyu:8nE)Nj-r̪T:q d5L JdN1i0#-_܎k kZ e3q@̑˃ۍ;aqqqv4UD^8ŋ{hN=a?x/WvލGv$Yf]OZje{'3L|:]㘬ܜrDqseT]nd`nwTw]vRwwݺuHLL4wC-+)뻻cǎB!uU.S3*2'A=7Pqӯ*p3S޽1{ls:~Jh3ݻ.<ꘁo(f2Sdd$1ϑ~'<Îɘ6m p {rgXe`,Gz{H8NN'e{9r-ƩnP -ApBs:3Js`0Xcs/lΑ #͝;wYX`U$RjС;H;dɯ8}9m`$uvyAۄȬap$guL3)))ɩJ?sVu3/΅ٻm]3 9sժ]2Ld *sx0wXf*qC=g:g ;yρ#3b \~Ysp뭷Jwo颃 rcPR|+ Υ|,-~--w:l<,*X;C$NT pĉ͈px=(/-uM7(x;vTI|h?aMII1۾j3x\};?seH|#׸#sHcH eG&y,؋898.P#qƉL^3#5nX1tdڸ4&rgA^s&A SGn<5>w$ҝmM 3͛X8~%:Y?gz}}7LrgڙA[•8pͺ7pǕ&g >#gəq&=GϨ؛3gۑzw)A`ֱVǻ3iwA}0p\(g.%qΤUSϪѾ}Aiwg\")󐕸ݮ"7.vVkn/P^EproHȬr,Ss/)}5kxQ BHъW^*1㡇9ȏò2%JQ#= MyVQ2XT{%T1hRDvdHJQe'RtJ(P5$Kҡ8!&eh:i;k3JS)'KjRwjrk0w׫4%. 3 n_@d/os+Ǖ:/R"%rB]!.+G}c F@#!Ƈ|r-_Rj3'|GmX(4ױ|؛Ue ';'rk/tpOT?j:]#h4BO{z<GJG6 u#U> 3f([7RӴ2vQ׊e hEC2瘭kkgQuN]._S}~F@#T"d ,.䗰Y ]iGC6zhxQMHBd8 UUzhP*FLTgF:i=Nƙ9|m jݯ-ܴA{Aͻ'졙8ⲔZdqh:W Yαehk,ۡ̕)CR1eU;[:Faf(/(gGn<=Wp#%?*ѪM }^~ m=xx^\ؒByKOiۻa/{Un4@YȷX#\i4uTuRI )FW4i|Aycn?kl\9GKF=2Xr3|i˞E^>y׮`~Fb$Z{Ȩ]G^oɸl(3u>rOC֞:;"n\Ϡd&"?B}nÒ#KM݉خ%OҬ;ow; Y;g a@_LY5RKN-LF@#P9PZ ʩ̡\zu(Y};+:pH8 F@:i+G]O<'XNFHw$K^ju1% $NȤ}5]&r#RzkF~VOwDzaxv6,x8B}}0u}]>_/O4 Dp_vQ[waSe;pҵw˓֟+w`K\"dbHmK[I *0n,?y؀#eh{k|X0/,O.wNR?|c+ \ 1if8XE- ^%2^1U\%ao4D)A/bsr#G!&,ٶ328u~sCbv1NRsrqH[AOxz:Ck4}Z(3q4-v2ux_wS0&[/o& nuᎽq* T8z!oASW^6u`ժUȕ3jРg3d7͒Y;C"/?+sscsjNoAwE)Rxd S%F '@mdL(8JFƌg@Zi n"M$Y~H | wTO4co?/"9|h_U,C'[DdvN^h{{ZGRvC0.8t#P6I!u[q_x{G[ DZ0ES\_3`86oU!ݬ,XVǶ7,u=G>^( }I Cē`,k b/gdƃ3*M/@? "/Xwis5$= sGv F>~{7Ty +_K۾%'MZ+jQQA|C޿CXċWr=!=321dx&J>~+ \TfVSGlBzv* ě$<>K]Ӻ9ڶkēoHA2 sI#p \Ad6܍Jo={-<#GW_UA{wy_2t!'|4?^ǠE9TyGPȧPdlԶtsxC lE6G~/_ۉM2(K-C >} sNn@W=wr6gn$Yp{yȤ)}OM;;gf#U GVxGOa^iBukWѧ^rQ4<}Ƴbw黶. V! Cà&F9d)5py5;X`ɒ%*%''cݺu1cV\ 2SLQ.>|f<~>?MDde(ҁU6"@ByXɞib+`a"O52c)g̃:׋]D*a—$v dn\ûkbB|keH+N)1%X.7%ƀ|$F! S!.B0hsH% ?2`xZ&F(\FQtYQYrJW^y%믿:'+=<:QYY#4vwb< F 5UӀ#Bɵ[pfBJ+tEԟ.n?Kwôadں[ k 3Zk5~;?/<%"6MЮMzo|1/.nnwun[j-H6Kg2 ^nKt^v7m LjI0A4fVLY=y$XxWܥe˰x,\@mbT]P,:iرc=z+$/qѣbФlK!VI^OGCU$+7qg<-*QGP]PzOW,9qZCCsGuPQ]%ZbSxY&;Q \,1 (XK^T9( =?#Ƃ99HXc/H#_; !ܳ` &pewBiWA׭}W̞=G6JC-Z[#PaI(J@A /aoHZgʪݠQ)Zq ѤW :ƀ vޭ>ݷ}kP2y3^*`RIe]y}XXe5O6m\9t]FV#;+sDdffbvԨQE2Xh2d4hMylnʯF,Vb0o޼Gץ(~ɒoSn|}znD>,UE)P L9[ 4i4@09.b n8_ѿ߿oۤoeXK/U`K쩧R!hGb>1FF4S2P!p{k8ҎvDH4dRDbS\5i4TW›ocVA?J3#gQ ' i&V$J ̝FÕ০ݲ,|(q{GE2]5i4W7ٔ8Kk}Gi ?l޼Y 4ЪU 1/$ܘ~kΞ=Tg ̜9_~9bbbAk[qWbp#݉e,$ttcZY¸:oxGԆǯ:6y?HOm/yW*G:a+6idpӒ`˵K+IX` snѡCi k WP"`o[lQͨ~ ȑ#O㦛nY` 8(2Jǝ`ƾ6<ď"Ȋ8~-P.]~ƀ!R9ٝ`<)))c cJ6D׆9-! Hk}-;MWE(acqԨQ#>PE P0m4pf͚"OCV۵k \]*TyZe4F@#PXȆK>%AN0_~Rbܹ'NPSNU._B\\HJT>SL8LtU;I#h4@  .᪫œ9ss=cj\nqwupwhG{~BiƠBF@#PpU"/>m 8'&&Efʏ>-'|?Ƌ%TA]^#P0 4!@;DNmG{` f R)SNtHwD#d$X!$1(o,Wh4BwD?)Ҡh4@E$X7PgZdC87# u-̛ [#Ab-AD.i> F@#P{pĠ85EĻTm_fڴ=MYܷh1U[tpf \wt*BMx8&kk s/%3 O"yaAGFɗzm W 7oF ))a{2Tg܍o msdS϶npBB*U} L,=z ډ^QQb6 #7/적X&}y %ɦ-2zFֽՏHhVIPAb$4nݪjy4t UW®WvKDɚ&m]Bl6Idnz@lʲQE^=,m_Bs n/^0X1o܄gdusW 2 __<v-^S/h*@&(aFЌA&]v"lHd0y' nuln.g=cH$dQYw8tpL%qw5mS/OOǿW& ޢ8-##)m!4i4p@0F1p;ri*)ۡrQ7>?NǶlN_o߁I/LwţfaI\AAy^LL!k; ;kہ M02}Tmc`]}C_l D_]⨨v6mM(-R)-`9Q |yo4 L5 ?-Fָ{7 =M|?Rة¶ɴhh*m EjO6> 5hj")kGDھw s[#ߏ&Jbӱcl_nۦ m LЦ0SGxnc=: 06.X&e|]( d|\g*,m{|{lUYUPFX^] >DwUϐ@e `u7G VWUDHIT16X7RA`Rdw';w*iB 4!.||f&"Qڶ]Ց%uK*ٓx`\:@@ uDqԽY[D׵D7_,oFajyu}gflj3~`Gr,V QLA;ih@EW61lDu}n1>D A=1:&c p2g|(^\ !͔ mJK۶U Μ\xv@<$q h ׫^gQu!CBiڴuVܼ\6*a e ܭL#xeK:vV؊@ {KX^3E6[^O8,x &[u]Rp[K*wQpɅdee!GނG锈u.;'^*M)=D+*BTUPI(!I"0SH8 Żu qÀѯe'U,O~g`ȖUy\e zG[y^#S1C)䲽|f<4v 6\$ax֮-HӉO;}aڤ F Em&3޻USG0mӱWAhd00su.;I? N*mir #oogvUd!뇐g# |FߋSr7y«d{Owձπ=eX3y:۲ @CQ |w%v UF{{d"i"hGZMG)}$۲n#DAJf0xK?GD)&, ~S5Yg#~޸DAb]i)jlHJO;fIx5 I 1us ,{Na??tUUL@kn%](x}<#YorPWtwX2So,Id HKG5NK??yM# bK ȏ; ^CjP~ l-z(&13xh>?*=y9vg}Ox]}R ;O$b[!Ɔ8w-\X*0RP|Z2>{4hWω)%*4R8`=Ju.?$ɤ8?bйq wFub{6o߷PRuw* LMQ#':fY9;MFxge.l5% d Z' km$w9V$#ͻ!gt H3S3jZTbzϑBɂ?ކ\fM}S2Z&7" X?yw__W}.^Ă[|:W+Dt/j19BS6yy Wl9'cp=#r,8}|\w FO,7Pth_&i[в^cշ8wy܅|ݬl(vcYDlݷd!㹡.XP#ʹW$2XP\3|y( Qj; 䮘o97_OձU/³Na U\@o˛ h4D =HնS 9ذц#aYt/MSDX{кBt,C)Q!bX`0dBv|], I1l Gl5(}h,Q+ Gul<+!N#s.3_RL UF QK8J2Yihg˫1?6"๿O3f+ Ia5XT5Iv)=S ,_jpI(ƆTAw$Niy_CƅS%6(\ extiN 1}/eHgʨq Zw]kUF7AzV&~ۺ5D:]4H9 || &J)B$'tâ[6hi@{zQP1κiWyD7oUϺ@nM&(gΫ kxSl <ϩ<w@/#0L$ Ȟ0&D[E0YbcSB-iVF|4cPy7Ge_dћ!ZܘVtR C)`ƀbT!`9ET8qfthidIY='z WY(1յ%Kh?a8TyzF}i`D8Me効xAU(z4kb3]|Bq# ѭ|z C=++,ߤTk1 56 t;tF  RF"1(Q̓W2ؽq ҨE K-"-lR$rT_,z pTǜv O y[[>hAztÇGQET[?AKa oԵ]#$*Τ$*#KJ @GqQiJφH]-.VЌA-z8 -b'f}`W~=5eqXT"4\d%M@Vƀa\7oތ^F@#P}z xcx2cpDRQTOhrW4UT4N6 Sv{g>Q3NNT!6rw#g1m }Wc\8p7x#UF@#PKYwam8X[=\  Z_R\qoFxEb@'xqqq [:-+JVapG:ߵ*k,.3iҹ ƶ)7a]LlۮuDŽoe"uij8^gh";C:l',^fr~{^Z̉$T]~N!_ͅ޶c%~di྅m]7j-Pm>bڎٜkԞ ?bߑ"*Kqᕡ#зqcsN}+JW.=qc*|nouDCRYJugƧ_-ANm^ȞΈn>5]{#6SQMNYQ)kUG9{v!Q#>)#sDBrDml.3gN5/>gJ!2ƵX1p2 vnXi?6%3?q4 /G \VNHwW.uN$& ԯ={`ҥ]F0f7*t^nd. N3UAS.m"Y~jU׳`.$$Vl_oSMxXN|Wݪn>Uw?j{.g I7Ri,NW_}u?td*c2nPYcIK 5L0 ň-!xmGa䏔M%ڝ|}T@ͰLDWD>_љw֟<`t?O+V_n)6kc7cR+a}ʣ2?aHƶ6aX_|KF|H<Wp_H]4մcN3cPYLtu'+T7N}6iSLQ bl8*m݆ z ʕIÇ1EK#I} xm(ߧ?؏v7<:ODAn!cp5xl(j3q}m>ݸ|C8-[E'F@#0!r-}p-j"U/W!~hg!m<з?:p;ԭAAa\&Rh[`NPnr>ɿ0d7knו~{On .k׷J\7|7afDJuH.iݦPhBZCM7C`DnQ'F80o.4HT Dq>?E A`hU9EXXdzj 0I|^8I 6ҊeBT t=ছn%7ěAF@#(W^2=âE ~z,=z#[„+&Ŏ:!.#d42eQIK8~)v[Q*kǛ6[#V]iY ?Q"=pfAą]-:xKl웩!K ǎB e1EGz<%~a Nơ&/Q)(*=CF@#pժJpՠt@H:`z\s.΅(.il]VIԭ4!}RGܛZ=cǟ$#ꎝ\//lBd`FheW䄸A>~.Wݣ,:/P]b"-(6ĠO1nVaAFF@#p1pr!@m[@gU3Z$0}gٕ/>j FDҿ%`LK: 91&g]~JJ?/4_VP+- ]gU 8<:` nevyF@#PQl Ř- Qh S+z<Գ$H ȑr5/ $_[BDZ|r9l7:^<+^t}<4cPI푧y"49O~:ΟgJ=~(4XYwJש Gm|6U:F/T10;<MǠN Bf!fJ;kps4xrӑv̮ I;.ύHgJ1f Η;]Im_ly{QQ'THއ;?*T18kY"  A7!v/J\*) qc^QiA]p7',ԞNh={*!8\jn uDߢk[v'!e$U$;d6]G QXN=^e6>$+tJ>*$-Jn4jH' SQ +Xaϐ#4ܬ:N; y{ms:6KKܴm{tS#;~ҏAx*xGHCpO;#»(YW}>!mԵ|14M?f4sS"Q. /Dbnx"͗CviƉ%7E4.vF]z1W06$W*mn,\)TΓ>E@z6m)Kl@u#*Bj6C@aS_g4a h @]υ'S.T11}#d%ꟶ9A5$O4 t86#bO2F~wpOX)֘9;j~VAu@(W2  ;|h7bzs)1#CX߆ L[ktȟ{gzp]%JhtS~= rѡӯH >GD]h _դk'>!12  Nk<'qQoğJۂ2*k;N-"X\Eoᣏ -(\fKbO4QE@eUt|w`SQ'-J}@53Q# f>HߢNgl"z}} ":G9i!1gy VCn _ATO;=|: i[d [l #-bN7Zaoڴ ӦME݈ 5Me(Ix5U[0K*+kp@ D`kŘW4bQ9̂x P,oo]'n@??ϊcxd !Lc+`BY6۾ ֶٖ\6$F bPp]\4{_c~#5[ ^KֶҎV^v!MII^h#ati\=7[=6ejb>uߤcƽ},m'ɇjӒI nGȈK[e3 SKMyWHtS-w6_8wXsrs ~ NYMĿ;U&S :ǘulxf!>g7Ԝ#i'D^*.iZFf'.Ʒ<;gd+䐾a5+KDBiR˞1f3eAβH9oCgcu9)v)|\dΊS# Ķ 99ͭpN$c) *X9=!Y&Mi'd*Ft?_c͸?j`n+w}vSHktke aaIOp>\w2@%Ɣ,\:?G`ǘzqAx"YhM|{!Tq|KJqtW 9Kh> @B&_X۵4Gyq(`KJ_^"Įϒ!3#'v:wyX: 9C?q$M 8s㖊 wf+e#`V5'5 cIOOW+B/y޲K"lG1$5w c/(層SmyW>TUL>NPӉ"JORnMz?+~x#\xI&ӿD ~;hxv, UD:e~ ?5v}2#1K QTwSË{v B-jV4cwNlm7A ǽ%7C&"53 pjP2w~=/Ay9ȍi)ogly<q؎yW drOoMK¨7?;UTE8OJ2o@B@3x;׿"%[_dE#↵6+E?@_vxNշ0\6ٕIiڄ_ItxRp~O#qxqŷHpokڷhټ휮~pʴ Pqk> M"#ϮzeoR!&׮}psA5@KfEߚ2_4uH~x:REI3#u]X?9:ugy&gHP$TF5pݢSxwUJ ; Q?"э.7vw6$ OJ3?+|7cP;APu*:3XෝlJ=SȌo" ڈh_[_oT@Yf)>?|QrLh뫴mtG}P:%%BME^'_d-, R7y^u1#!| !uz&"-dE z\c, Dt ]=)33 jK}|  Kݒsu"A웹}H[?Mw {1+$e%{%C}=#PTz0}1п@5_Ӛݴ IDAT((DW%vpq=#Al.>u Y{"'.$Uqs%КHYR ". cDvz!.ˮh8 5Sߦ-h 'S;](nO~#-un0#P` 7zXVev3DoJ_ u|Bۺ O26=/7W$>GyF`xI{ell8PQk@ϗ.] Wnפ$ Ʃ5S>첼` jdq,JV/^QQ!4'>[q_s &K8o}:e>j*9#P~`򳗼 > 7oe3@` Јr#0`@śSgF`FcF`T*<:#0#h04#Pݻ.\Xʣp#P^(3 996l.\(RA`ƍ0}Ra@+W &ɓ';i^!#0#J0p8_i`ԨQ0w\9 'F`F([JNEAXXXbt AN-]v#Utuо=wj_XV~QTUiAԞB|v`Ow߅>}@||I2dܢE UN}F&qZQO~QlJa-S9/,/=( JGf9 8~@SL)M^^A9RI#D^3xjСCp4hPUPAs8RpKIͪr) %9 _xQL8H`Gvu?$Ft@g@Ds)#0D 5k<1ɓ'CBB?#F7Nk*$ %u7?!,݈sF(%N=w!>˗/W͛K`%MH,HI9o+kzmƈN# PAƍa˖-` F@Dd⌼p9Y/wDMMB6jލ` //`nFH5--- NLz 1 -se`oȸ#P6tC]X-#c $kٲeLJE:/_^yTdJ]PF@r:@-Y>7'Є8ƞr]9@D %jwy_v.E=\э]~D뗑Hp}-w ۿmH \Y"Z7zZP:Ch!b 7!H;c4=H04u"_'g]xk<š>!P_m<+ k@/W`Q{)pmx[xA8@dۙU^omBi '.|0h6"C[ =GOY)b(w,c2+*FSBښE= pn&>83wс+ qdO z澩R֖|}(xQ `d2-`J.Yp$N@DAQDX\˴\goVэJi^!Hl1oŬ QP&qWcm XH2BÔ>LA#냩J~0HI %{ip^ڨ*ӳo 'A2=!ޙv#L`[)i@P!APm'CAX1 O}Wt7V;CYN“}tC?!;OE.z$r'n>Gq%`UɿmҀMH[aH0D=X6 :kM٢!mHp};ћ̆ w 6G&} ,q7N~ ; E홌\F ֤{`@{(e$u[|fA jLǍC@N#V> b'o$[\Ԧؙ}cG :"=s:%$2] Ć^ ڽ)7 %օ8ĭ"ۂ1J!\t@Ft7=_O?d;}\lA\)D\D ADzy'd`]huZצM]wݕo)Dwvw!c8 `0-r:wAX<O5돞!ץ_ 8ȚlۿQ,ixd<SQ8=*8^G?0@0a?>\Z RwMz;XbZJO:o IGx`hREP\Q`GQq":\+rH*Dto@*8le6C 3׻E9b/"@Rw: }rr%QBr ,,|5OʄY'ߟ!e8PQ:**b}oB `߱"nq g mqjhjHK'Iw}}Zy 0Y0)@[.d W΂~[T,mע.!q75 #c5@/Q٣:dof7*ፃ+e$W\o HH=J. 6?KրNlH("$|.h*g7XONU"5C"`>I> pZ Ϸh_m%dMlM'S6S=wj6Щxx/Z0}ǃ48Фбu3[W-Mt{E8Ƚ|n@DV]r_F0aPX샔CBWk-i Tk/T~~$ay`zReq)ڐ䤏  QF^iIMx}Qjd)PR$pL-5'@P(2fă/Db@YeZ~Svu4H0g@`y~|E I7} C;+88E7-V>y(3t!I@ۗH,+FP0aP(Ra e䟇1Moi˹)]B V|PI!TuC\. ,LJ9ЁcG rՙzuB _E G%9lv4ImvG $B!Є!u+yrDȠ5F(℔@oF;~@֔n`1գXCʺu F؏q< DWҢ~T6m]jBw MhP[C@Pr'b%:3&FTƌ$Yx'۫ s+!r/6=f)1;lm|:Jm}!=0%<^\G> 9-MCq|>A1"EB'cz<8?E6hk4S$C6Z"= X\5h,A}„N#?4#BN%El#X%Kl6Cdd[Zq$=z&=٪8Ֆ0qWLB 66֫dG%pɽW ɘ:u*̚5 233dFyOCrABn&OF ~'BPB.}%W,Xc1X繋J^x 44XM[)F4`AoNEȺ%Tw?  Fu E@@oQ#7Q@50։.] s3#& WcFHp'DC@1'˳c& xsxj#PxsЩ=pMF *!!uTm۶ٳgj%?/5#·2 |#M&SՄ\QQY,U|7(/GR3`@4t8D/uN)o%xgLfF`5L h޼y;@F&rg\z:t(ԭ[7M^ai#~ Jq`FbcěScF`J6W,mU6^rr2ٳ6m ժ4:tAȑ#pihӦ ʕ+aŊеkWA,ƍa޼yРA\r ,o6\BNODu JR:-ZhU~iҥ~_U`4h@oZ'Kkǎb zr9_@a#%&&’%KܹsE[2Z S':.ǧ\;vŋaĉj]r… "R}:F%YV%/)pTTI5J,LNt_zuF0 9()"kqLێ|^xćɓ'CBBL4 PpON; S8z'QC wVܫ}1 C2 ={^ڵk'zr ЇR.]`ݺubo(Zn-O(oڵkOY͚5k[oUE?+(lX{1 'KrL/7LҺu`2|e!mO7p;_a'ȑ#~@0î9]4œ((GI:twUO?'|UC~(+phҤ ]V| Bo'q7g =u"Z81(ȍ5#ԭ[Wz=$2(իWO·u<_^BWIK7tS]Qd<|a* ܥ rسg,%q=H 6O UʫV*>|X! uYi~.%.g=#rj*0fNiΝ""ݓQFE$B~B pD"bIE"_܈Dj q%#FW^yE88rw$䫟"ӧ^ 1ő"@{<&w;DX4o\\DQt(,}|&ß1<:]Zt0([@A(d0%rKnFpPC `Ts TMx ԪUK`!R_5@P%Rt$n?(qg "9.]T(f= t(+WTЍ+-FQp5hF@}0a=0K,bzK/Ժukضm241  ዖ@&EMlݺUp<$^0h 88 w)fqE0C 8lٲEdh(9bٓ?R+D,ǧ;u$>s!?)8C̚5KX AJ1| D zhƌ :D ;w@$J*'nKՋ@pbA G @8Í_ux'lt~Y_!4i €z=zW$ nHL5j$bϞ=<%##)]*=#? 4y@B teRX(_R$.{"ժUtܤd |GǃR7#0PVD+o]wD2cE/^+#P` <&\!@7nŪE d9Q`]ϋ(0aPQvש:-1 C5L5snSN5̝090a1#0|X #0#9X#0#P` F`F & r;F`F#A 0#0@v1FIENDB`factoextra/tools/README-pca-variable-contributions-1.png0000644000176200001440000005706313572034643022621 0ustar liggesusersPNG  IHDRPP& iCCPICC Profile8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o@IDATxK9!BLHD}`# 6D$crd0M0YFsA(WoCgfvvgvon'tuwuuuuu@I C0Z@Va!`8ZC0 CH }f1Pk!`1" C0jm0 "ih"ysΑZf9>+}wqrWfžvi׿5sE8/|駟uq|rQG&l"/S;id3a_|7SN9Eڼa~R\i?wODsO?~vH ,~a+vm5\w%xV/ׯ_Xc@{&*lR.8>;͝w0x2ϪbAΝ:еI[ouy=hРE0iRVʸ-۷{ֱc`mY/S={v@z3g{qu.٧HH0O>vmN;In\~6tS9_={ϧzJf̘({G' @?i-ҕ{Сgr1~x7Sx,KՌOkA>Եk+f{|B:S3پ3K/$￿m~]SZ脧~W0O\y媫>H;,uĖW_}U~iܹssd…2n87o޼L<4Yf{TӧOw_~3gc:Z-X$onn7|S fLeIs ^|ťSN.W_c=&01ʙK><'^O+7l}>l:*:p(.Z̞x 8qe I>[o%>kL?\?..|?m4.tf7mgu4iҤ-W>L8\PyYL,}{̉:}zGtuO~QU$\qk~nK,De6G}4`z\/*x0~{jлwowMx;yλ?!CvXjenʑ;x㍃#G:t1U=S&7tCl'|{=Ё +E;};E噎.-_n-+n}衇;sVL(G>*Ǖ<-NLr Tq'OT6~>NjSTŅ8C= c w묳N[&\^YzDOJ|scԩYM\P}8rEȟ (׹Sxߎ~g}wqG{ί ?-TCӟs=7P(wWhV6p]q21Gy$ɭzF;: S~:*O>NJ*E\wHRyNgQA;Xfeu.EI'J{ !=zveAϷ]ttarȍb Chߴ#j]w >C @6cƌ 8qQ!cA+",R N&m#7,m&G\AxzfE裏v&ΊAS"qBgw|(+n ƃ? 4輞tQRl:8#ra &/v11 w|Qu@u~n0|CwyK<Ӎ7=3PƘ;'ĨQ7:uqJ*^|ŬgᛨoM}% B37OvD?# u T[C@knINLJ%)k6lb':Er,6TykgߡUɬweJpZkL-m(#65BᮍSB!+N/ӥjpɿvL؁:jXyEk>EVIEn;Zࢋ.rbwq&6!a*T'o8{= Ewz>OX-Db-|0 =/첬w-*g+NmRYI>Emqg#\_ܠ ;vl%tu^Vc*QóQT"j"VQ=S; NμC!K4J:J2/DЁsҜ[QiȽ-7m-Ƚ'=U%\FjLPT_ a*8 PNI J jQ5͍/<3(LK/#DUEΞYfJFO ]UnYG+`T^k橋[¢2@b[!3$e]] rQQ&RS9ЙЧB80C?&lm0a&=_*R(L^Xd}!7 c5z= HWnxrSa#嬳Β=sӥatMӉIݣQR9$Ptq]hӈ4i"ecB_[)J͒*jL@= [ 0Ub2l.Wus&w@a{ P.R Ϫ/f\: dLoüWe. ,Dse-̘XqdžN%!FLRJOza.rM>J-'Y\]yW_=`5CST(tjzV7G.Ͻ^~f8T>k+'M*eL_wއIPW>SfO( >r>boMA7X~iƔێtŚYxHLT*|2ibu#$^A41_$ I2.v&&?HQD QA3$Oy,YA*|&ID@xq"wQa SiXR/8V #'taEJG0킁J@m P:ڀric|!P6 Z0;@{ [ Cl-!`w@0Z6h-bChm5l3 !` lжMĕXfM=[Ձ@1P=F#iT.rRoT03rpW%OEv\ieT kzd*Wޗ*El}Vغ=\՚4Iu@ m1o+!`1 C0Z_m5 0"!`@뫾!"@SӢ2 Bh}շ0RD /)&T&~F3LfƌzM'=pA~}z g C>9'RF qZbl^oIbw;g8˼Uc _'0z¨O؍`G?ؼ'z*VHf*;h'F;4(!9tASҫ{qZC*@̙#lƙ2yRK-%CW_Mz}bٻQˤEfCb trKǎ_/|,Æ Jf;_rm COO>}0~\p +Ƶqڨ'˥!P&*@͛'rL:UzLQx>m42e<32rHYn2ﹸ뮻[n<;e{pAawܹ.QR?gϞuJ.ѳ ^ׅ #7>=Mf̙3L555$f̘!:0Z]Ji[hf*VJz=z" t5t?SY]G0aQG%=:F#D?7(d8 5ixɧGu[ΧQt}+O\>JGZL" jرce%t "7pCc=BԽ{BAZ~^ ZQԵkԕ/xlzQy}FC믥W^/} f~[- ?7 bЗwR~k 'SNIAa֬Y%d(c\oM\IN>]h3Jš/I0mjJTOAYPS5~ CFڔ:(fmVV5V0j 6loEx{`C>.x*̝3W=!o:vm_9_(Xq%>hrSJΕEPwhk@ڹ1faB &G,(q,j.U4ET}9yR;#+F>Oh{e@D tªO<8##C0 X"ҾI&&l@ zRdSSSS-Z$ Di&W*([\zADK-…y+ H-r}e\?s镚cU*=-LRܹGo~Gr~;KdnjԹ*[T@ ʰu9NQ1iS\\zi'577EbY\MMxVOT;iM:D<ܼ}W{_8%[[RBVE('zN;M?p NQG%{NawGS(#?[nҫW8-E>J+^9T2Mճk$?Ժ+[Ҵϟ/B)i!햚Bi0wcEJɓ~Sbu|]wK/vtM )Sj&_|qW!@a/diذa+p{=7o^{d@,y}W_}U/}seKdEA_n CJs}//[ou=be4 C y%PL&L ӧOwL sh >gw#TríRJ|ǎE<|'je/첂뺤'+43*@2oשׂF@l3N?Q曼wF]tQް0 @t^p Dxh~-p^Ѕʎw%<ad@= @)<|;+tGx\wun5olC]w]9Sdwϻ2@}!z([l1λ3g@گ!`D 40T#C0Ezo@!B!1`!`H@#. <0o,7 C]"bvW_}%zL"Gq~+!`H@jy衇dWoYF-wyrmK!.H@M&gvw2x`]c2 C @q&±>£fmqLG' {e@D e;:P|ĹHxNhX Cȃ@"gjZ]Gy.Myn ChS3Prꪫ:v}r-''Ov.2mZK0 J#}t3f㮻*wqG0 @bz衇:!"}Ĝda7!P'$b8Ooc P44{uH86?7/ʮ CZف.J+K/TtAX|:ӝ}8K/T889ޮ CVIdϖ>Z&Miؙ2Rk[F;䓅sg9һKO>v439oa0 jE 1E:sLwGna -"͛7ّN:mX 'Ϙ?}{<;eG"OΨ%[|b޶2qɥw[P~jLֳU+s%{[6|- rޜ9ODLB~-?&V{k7LK͝!?,{OzPw"[Lv.+ h߼xh攬s+7=7kOzOyw\w J>鷜{Nij"jL,?&+쉯N6zvo=#k~G%_VQ!#7"M#7u3g/Ьѧ,`nVilj9u82GtK.2ZgcnMn)cӠib-ΛnJv;Ey啲 'ͷ5m#vnt8ycD[F8(M|w8E"|n0u5[Ey:Yqo|tO_?Z&2lxs˸pa$hQ>L"pa]vXFsňOHÇw8 %⣂ UqBJtT|LZK܇Ҥg~E쾁lOYyZAi&r!dUp&N|W1'n++/DxL ]=һgt[uG]t`xϿpݩc#p%{w,sܹsifq,)I?>}cڕZ(FC5VrQb 7ސ32eϞcs2߿!^O8-Tiگ!`"h: p eĉ/W^yŝ #䭷rq666ߟ&ZT!`D "&LHl߄p0czq(|:||G aI!D =Ri.AzLB#G„{<-TEh #c׆!P$³Cʜ0ac?rWȖ[nYR9tb̳$cCh 1P2v5׸$\ٱj~mV[o=9c"!`m@)<9:t㏻#ҵ^ž6-%n@@6^mO?uzI?N"̻%e@"O9xQTh+g70 ZG /CJUz#CF/$ I=y(㞒n0GQ99(GXtT oAtM7{.(vou@^ E{s矟o.{[ !`@ jKWO c?h ,9]!PeK-rӳ{C0 tV3;j1˃!`T (H,y={wۯ!`@bUsM6q.=\3+!`vqxqǛof֞!ОH,Yq_9|'P,!`$A 1@(g"L:$iYC0_|K߫W/9qO0 G 18³us#묳;Q!P(g!=ڝ+w}ҭ["O C]~˧~*cƍt[sC(D(FhԝW _<~بXƥ򴉺KO$5hzi">54,7K>KpNhqKYXjc\425`Fq%2}VjvfYe&a+{JK?g@EqQ)={ƦשclWYX%%1{LZ7quPc+} NWDK'iz>LɓY- -h!!`G2_ŹQ 8PDg!`2P;T0ʁ@^>!qU=/G-NC0l|Gs|j)0 J ̟?>J俱_C0;yq&/9as~ g&!PO$brg8[뮻w=0 C=#"ybxEBŞ@{G vi'Iwu'+!`-+?^{1e{'e`yС!P7eC c99ǃ>3A'\7YA CeK-<.; z0 zF / I. (!PO$fw}x2cƌS H!`衇V9۷o4HF!`Yo .@ PoYy CD (g¯Je#C0 H$ϖ>Z&MixRka!PW$f@gΜ)|p l$0 o Ժ:Њhu@b0aLK/-ÇQF ; C737xCj+A6lL2E+wFرcV^COA$nL8Q8v{r'zVjCkIs&LH-Cn x@N8ᄢdkɓ3߲޼;e Cb1PNę24Ν+_N-KoPM 4 6D ȑ#O[9y'+#8"|n +Pt!`m@"JƮyeח˜9s:~{9c;i܂3<㘴Wx wi~.544>*~6(jT}ITD#.=WMsqǷٳgKX! 8,g^PJ1"mcӛ}%m=ĕ/iZxOJUc)8J@V㏻#ҵ^[6x㸸 >㏝$;aϣ:Jo?=ztw}W.zr0*|2(jjnz\3t\zvдa@,\ ;?e;Ƹ[\Qlze9b<.&x9=VJqO"ϋ%Bj%tQnȊS@NMG/r|xޱS4PqZ:wftZ|{΍wԿ_ݳkFǧue)iǎbӛ08^Ǖ/i$Hf"K'izӧOAM:UhǞ#͂dg@#1Q4y%#ieK6͟@-/m?ot bpÒrMނ(mjjlM/iZ0NUNII>ʉ׭[7/j3,6]_|h;wQi)^N"Q^9ݻ~=Ebu"4"IcA{+_Ϟ:y.K RIޢEXeӤp!`)@؆!P:@Kb0 :EhV0JGhZ !Pӊb@-C0cuZVlC(cch1@"` N+ފm#` t -CSi[ Ct`u@yczbUY˩s oق%fvaֿOOYoqucm]!Pg}V.رvm2f9餓j<ˤ!`7m@?6lcT:#>`V7N~̳K\r̽Xh4I~,\(sD{illǦܔ$˭ 3o 9m=ĕotG[XԸ(6O$qCC|zI.] hk׮_E)?ꫯO>X_|q:uj枋^=̳7<mP]:h\h:It^zOhX 6:&=Î.CϮdn`kzM ݻtr޼֥c`c[`~ic[]zht3@4*J/كW2/2]h3_%a `Ԍ5ŏb/Oeڴ\WȚ6 C m@G!oL8Q)̴0 Ch9`jtArJ߾}eW=أ9 C(6ed{ZXCakd@ 03HbjP+Z> C>hSh}@l4 1ZV.C(;@%`c|O|lekQt|tdkСCSꥱ C 6 ؖ!`/@0ZA-Q"hǺ^+O>3N il*~Ywʱq cРAҹsy`p_n/W` +Jk,(h6G$rd.@^G/8∀4Hˊ樣n'2jw0O>9P ŦYgy&س( خ3PG܁2@)]L;mZ݅JSN<~W*nݺ4$ v[NbTɾ^ t̘1C1Zce@s1qz&GcBF\iDGq93Lc0Oҁq}0^ x/9YoĿO Se](& S{ܠ1먷^zI |Xj'L;HhU_qNori+*f'!ʴա-2Q{#?v_2[ɾ򪝬]*B晩-S9sdʭ =R.vqoO[rQ)T >ЎRJ6@n:KDLŔL3ҫ.˩&aG}tpW^Lv\=хg /BVTEn2OHGqV=]_:!NE:?]s$Ut t0 w_WEDFxR}Sছn fKyWw`&5_̝ΧqU# R[+:qtI3gtoSIDAT\&0Nt/>c2]0ԵO]'僁D=8 뷿m@Ԃ!aO<'D3/Ky& Md%Lӷ &z3b\&R'>?9m%{a,bnt# =P3DԐו&ӱ@uu~?@uN3 " T_IAd" 5 `:(3Q<_F:BDeWE*ETs@踅 AW]nNxS28z补%[K,=BoIbVVaY.}<_3eAh$35r!bхD'^*V"85e ed`H_VNL!TUFliY ;8pb1b KΜo߾ZJVhth1P W\Q_~ywذa%#VO%>QhGt;skRa *,1կ~%lFZW[m5Œ~19ra Ow3KG 3(l+CmMUF.gS1̊ۮb_J0'\ K-TIed/N]w]Ŗ?W5KJ+]?FPq\ _2ˊ#Fpy삣.JXve#4zanZKqLQpu94Mb; '|KeTSW, XQ\s5nKQq:\)X!jbIŇRӌ[`dv]#eK"eaSW.IgOB’hZ0f$L3#A"3#kTN?fH{A _S|X%^Sڄ]gU %EGFf eх{禭|'$^*ɕ[XtLLu</6| t6# XR)ה34AˢeM0NZcCL{i@ ulo6WB6P "@RsьZȨ;6/6+H.>?pi\>BDDτ Yˎty&DFf0OLy(_Z`ضY.M{p@;g[nǻ(}<֬؞ef+ tE,ZPN_gYѫptlCǃN KDH,aI-~:bNgPWݯJN Sn=*aؖ| )3[Q+8'򮒉fW:W8C^TRiZT]4qM]Lt{E w$qǧSɐ}5Z$ Tu=:Qt/_ÐOeD'0Kg}|֌HD[A$%O. BJ`"1iuOr񒨺 R5dXL$7nRئ-̢.(gO؁S/zT$2ҁz)Ĉj . B@.!/˔@YDj%eD\LYzb/풙d}: r˭0"Y lڀD ꁜ$п!H1#Q9%DgmeDOrQ&}ro YƫR. N\YfcRꯪA ƜDT~8Egic$b/ 4u_$&e6D# ށEdͪ7G!GxGzHT42lEEuΫ!+X 0 \xc]&PgE@{*|ɷ:[[ N` L/j@:>L //i& bN%ܞ´^Z ;i2sS>J#<3(qޤc9 c'  @tL_03f0H\{4텲*ΤN 9BsJ|b`[?L`(jN_zUYQ 5j,ڦ?4~1O`EF(kq="mfD1?֊ ϞP$c>ĴĹy\Lh"F(6|؇N7$Ni!R:2m||j;+}D3k1dר4Oosh ,Ʊs%W_ڪ]TiA; :*r;+}իE$}No~ʤsGR%KpUHY{$r38ә4(:HZ3b3fQ trnpIR0xGoTX_{GeoӺFM|}/t4yS} C_u>\9D ,,lfؖss}x@9P5Q2P@b f0MCq+f: Ga LƾR9$?IDKIo)8z)C<-3,Yp肏MCf{' &6f I+)a^Ǖ/{҃(Wzj~KӤ8(%~@ 3Q 0Oӎ՗ߪb¨21ąM }\'0-LsXmL̿LRh:X7{8E`Hn+򋤋LU>F֤z-g9@O&"N„n#zB6ZE`: !RڋĆKH(#9/!I)mfXJSh-3 "ޚvGp RNr_fLij.XD$QDLEJ5+=)~-9PmDˈ f/HxSsFă$ vHgB ]mldր4y $Q,0’hXW>l0be-m*MdG24?;L#D٩9 {ui癣wE\MZy_]sE5lFՂIp8UZ•kʉ!Q)SwQ #F]2t;=tu52\H.- %9%U"IY:j8 /PM0e~K9V~ HTL*O%v@^EMQ1rL_q`;MlEЋɔWlZ]2ӝiNșB`<}9<Mn+鍊njLԃSoa(9&;,wh{}KP *`1'R14+5}~$L43Q!nT8 Ψ4ڍÀ$^zXayr&z.xJ<`YE\=9@5{q T&C/Ra߷D(nt!j ̔L_z]; $a&%´'`DMBC.%Q"&ͣk y!%О>cY䩦-n5wzQf{{0햁RE04ბ)zq>I& VQ!`C^x0h-1EbQnv0E:QcQ3C"ЮhՆѴ:>voUVq[Zǖ8&Zlz!`&@#ML!CO6&@#` 4 j `8_S0[}'q~ zS=r`C9Y[CHv oE\q"='N%pd$i0'@WPlD8OtLaؒvC}6q+!P>` u[6a1Q!i̖aÆ9O=({l1 S,$!y!1dc C M3Pd_fMo0 E$k !`M>3 CC0Dhg!`6`@-80 c C(cEg!` ڀ!`E";\IENDB`factoextra/README.md0000644000176200001440000006410113572034662013703 0ustar liggesusers[![Build Status](https://api.travis-ci.org/kassambara/factoextra.png)](https://travis-ci.org/kassambara/factoextra) [![CRAN\_Status\_Badge](http://www.r-pkg.org/badges/version/factoextra)](https://cran.r-project.org/package=factoextra) [![Downloads](http://cranlogs.r-pkg.org/badges/factoextra)](https://cran.r-project.org/package=factoextra) [![Total Downloads](http://cranlogs.r-pkg.org/badges/grand-total/factoextra?color=orange)](http://cranlogs.r-pkg.org/badges/grand-total/factoextra) [![Project Status: Active - The project has reached a stable, usable state and is being actively developed.](http://www.repostatus.org/badges/latest/active.svg)](http://www.repostatus.org/#active) [![Pending Pull-Requests](http://githubbadges.herokuapp.com/kassambara/factoextra/pulls.svg?style=flat)](https://github.com/kassambara/factoextra/pulls) [![Github Issues](http://githubbadges.herokuapp.com/kassambara/factoextra/issues.svg)](https://github.com/kassambara/factoextra/issues) factoextra : Extract and Visualize the Results of Multivariate Data Analyses ============================================================================ [**factoextra**](http://www.sthda.com/english/rpkgs/factoextra) is an R package making easy to *extract* and *visualize* the output of exploratory **multivariate data analyses**, including: 1. [Principal Component Analysis (PCA)](http://www.sthda.com/english/articles/31-principal-component-methods-in-r-practical-guide/112-pca-principal-component-analysis-essentials/), which is used to summarize the information contained in a continuous (i.e, quantitative) multivariate data by reducing the dimensionality of the data without loosing important information. 2. [Correspondence Analysis (CA)](http://www.sthda.com/english/wiki/correspondence-analysis-in-r-the-ultimate-guide-for-the-analysis-the-visualization-and-the-interpretation-r-software-and-data-mining), which is an extension of the principal component analysis suited to analyse a large contingency table formed by two *qualitative variables* (or categorical data). 3. [Multiple Correspondence Analysis (MCA)](http://www.sthda.com/english/wiki/multiple-correspondence-analysis-essentials-interpretation-and-application-to-investigate-the-associations-between-categories-of-multiple-qualitative-variables-r-software-and-data-mining), which is an adaptation of CA to a data table containing more than two categorical variables. 4. [Multiple Factor Analysis (MFA)](http://www.sthda.com/english/rpkgs/factoextra/reference/fviz_mfa.html) dedicated to datasets where variables are organized into groups (qualitative and/or quantitative variables). 5. [Hierarchical Multiple Factor Analysis (HMFA)](http://www.sthda.com/english/rpkgs/factoextra/reference/fviz_hmfa.html): An extension of MFA in a situation where the data are organized into a hierarchical structure. 6. [Factor Analysis of Mixed Data (FAMD)](http://www.sthda.com/english/rpkgs/factoextra/reference/fviz_famd.html), a particular case of the MFA, dedicated to analyze a data set containing both quantitative and qualitative variables. There are a number of R packages implementing principal component methods. These packages include: *FactoMineR*, *ade4*, *stats*, *ca*, *MASS* and *ExPosition*. However, the result is presented differently according to the used packages. To help in the interpretation and in the visualization of multivariate analysis - such as cluster analysis and dimensionality reduction analysis - we developed an easy-to-use R package named [factoextra](http://www.sthda.com/english/rpkgs/factoextra). - The R package **factoextra** has flexible and easy-to-use methods to extract quickly, in a human readable standard data format, the analysis results from the different packages mentioned above. - It produces a **ggplot2**-based **elegant data visualization** with less typing. - It contains also many functions facilitating clustering analysis and visualization. > We'll use i) the FactoMineR package (Sebastien Le, et al., 2008) to compute PCA, (M)CA, FAMD, MFA and HCPC; ii) and the factoextra package for extracting and visualizing the results. The figure below shows methods, which outputs can be visualized using the factoextra package. The official online documentation is available at: . ![factoextra R package](tools/factoextra-r-package.png) Why using factoextra? --------------------- 1. The *factoextra* R package can handle the results of PCA, CA, MCA, MFA, FAMD and HMFA from several packages, for extracting and visualizing the most important information contained in your data. 2. *After PCA, CA, MCA, MFA, FAMD and HMFA, the most important row/column elements* can be highlighted using : - their cos2 values corresponding to their quality of representation on the factor map - their contributions to the definition of the principal dimensions. If you want to do this, the factoextra package provides a convenient solution. 1. *PCA and (M)CA are used sometimes for prediction problems* : one can predict the coordinates of new supplementary variables (quantitative and qualitative) and supplementary individuals using the information provided by the previously performed PCA or (M)CA. This can be done easily using the [FactoMineR](http://www.sthda.com/english/articles/31-principal-component-methods-in-r-practical-guide/112-pca-principal-component-analysis-essentials/) package. If you want to make predictions with PCA/MCA and to visualize the position of the supplementary variables/individuals on the factor map using ggplot2: then factoextra can help you. It's quick, write less and do more... 1. *Several functions from different packages - FactoMineR, ade4, ExPosition, stats - are available in R for performing PCA, CA or MCA*. However, The components of the output vary from package to package. No matter the package you decided to use, factoextra can give you a human understandable output. Installing FactoMineR --------------------- The FactoMineR package can be installed and loaded as follow: ``` r # Install install.packages("FactoMineR") # Load library("FactoMineR") ``` Installing and loading factoextra --------------------------------- - factoextra can be installed from [CRAN](https://cran.r-project.org/package=factoextra) as follow: ``` r install.packages("factoextra") ``` - Or, install the latest version from [Github](https://github.com/kassambara/factoextra) ``` r if(!require(devtools)) install.packages("devtools") devtools::install_github("kassambara/factoextra") ``` - Load factoextra as follow : ``` r library("factoextra") #> Loading required package: ggplot2 #> Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa ``` Main functions in the factoextra package ---------------------------------------- See the online documentation () for a complete list. ### Visualizing dimension reduction analysis outputs
    Functions Description
    fviz_eig (or fviz_eigenvalue) Extract and visualize the eigenvalues/variances of dimensions.
    fviz_pca Graph of individuals/variables from the output of Principal Component Analysis (PCA).
    fviz_ca Graph of column/row variables from the output of Correspondence Analysis (CA).
    fviz_mca Graph of individuals/variables from the output of Multiple Correspondence Analysis (MCA).
    fviz_mfa Graph of individuals/variables from the output of Multiple Factor Analysis (MFA).
    fviz_famd Graph of individuals/variables from the output of Factor Analysis of Mixed Data (FAMD).
    fviz_hmfa Graph of individuals/variables from the output of Hierarchical Multiple Factor Analysis (HMFA).
    fviz_ellipses Draw confidence ellipses around the categories.
    fviz_cos2 Visualize the quality of representation of the row/column variable from the results of PCA, CA, MCA functions.
    fviz_contrib Visualize the contributions of row/column elements from the results of PCA, CA, MCA functions.
    ### Extracting data from dimension reduction analysis outputs
    Functions Description
    get_eigenvalue Extract and visualize the eigenvalues/variances of dimensions.
    get_pca Extract all the results (coordinates, squared cosine, contributions) for the active individuals/variables from Principal Component Analysis (PCA) outputs.
    get_ca Extract all the results (coordinates, squared cosine, contributions) for the active column/row variables from Correspondence Analysis outputs.
    get_mca Extract results from Multiple Correspondence Analysis outputs.
    get_mfa Extract results from Multiple Factor Analysis outputs.
    get_famd Extract results from Factor Analysis of Mixed Data outputs.
    get_hmfa Extract results from Hierarchical Multiple Factor Analysis outputs.
    facto_summarize Subset and summarize the output of factor analyses.
    ### Clustering analysis and visualization
    Functions Description
    dist(fviz_dist, get_dist) Enhanced Distance Matrix Computation and Visualization.
    get_clust_tendency Assessing Clustering Tendency.
    fviz_nbclust(fviz_gap_stat) Determining and Visualizing the Optimal Number of Clusters.
    fviz_dend Enhanced Visualization of Dendrogram
    fviz_cluster Visualize Clustering Results
    fviz_mclust Visualize Model-based Clustering Results
    fviz_silhouette Visualize Silhouette Information from Clustering.
    hcut Computes Hierarchical Clustering and Cut the Tree
    hkmeans (hkmeans_tree, print.hkmeans) Hierarchical k-means clustering.
    eclust Visual enhancement of clustering analysis
    Dimension reduction and factoextra ---------------------------------- As depicted in the figure below, the type of analysis to be performed depends on the data set formats and structures. ![dimension reduction and factoextra](tools/multivariate-analysis-factoextra.png) In this section we start by illustrating classical methods - such as PCA, CA and MCA - for analyzing a data set containing continuous variables, contingency table and qualitative variables, respectively. We continue by discussing advanced methods - such as FAMD, MFA and HMFA - for analyzing a data set containing a mix of variables (qualitatives & quantitatives) organized or not into groups. Finally, we show how to perform hierarchical clustering on principal components (HCPC), which useful for performing clustering with a data set containing only qualitative variables or with a mixed data of qualitative and quantitative variables. ### Principal component analysis - Data: *decathlon2* \[in *factoextra* package\] - PCA function: *FactoMineR::PCA*() - Visualization *factoextra::fviz\_pca*() Read more about computing and interpreting principal component analysis at: [**Principal Component Analysis** (PCA)](http://www.sthda.com/english/articles/31-principal-component-methods-in-r-practical-guide/112-pca-principal-component-analysis-essentials/). 1. **Loading data** ``` r library("factoextra") data("decathlon2") df <- decathlon2[1:23, 1:10] ``` 1. **Principal component analysis** ``` r library("FactoMineR") res.pca <- PCA(df, graph = FALSE) ``` 1. **Extract and visualize eigenvalues/variances**: ``` r # Extract eigenvalues/variances get_eig(res.pca) #> eigenvalue variance.percent cumulative.variance.percent #> Dim.1 4.1242133 41.242133 41.24213 #> Dim.2 1.8385309 18.385309 59.62744 #> Dim.3 1.2391403 12.391403 72.01885 #> Dim.4 0.8194402 8.194402 80.21325 #> Dim.5 0.7015528 7.015528 87.22878 #> Dim.6 0.4228828 4.228828 91.45760 #> Dim.7 0.3025817 3.025817 94.48342 #> Dim.8 0.2744700 2.744700 97.22812 #> Dim.9 0.1552169 1.552169 98.78029 #> Dim.10 0.1219710 1.219710 100.00000 # Visualize eigenvalues/variances fviz_screeplot(res.pca, addlabels = TRUE, ylim = c(0, 50)) ``` ![](tools/README-pca-eigenvalue-1.png) 4.**Extract and visualize results for variables**: ``` r # Extract the results for variables var <- get_pca_var(res.pca) var #> Principal Component Analysis Results for variables #> =================================================== #> Name Description #> 1 "$coord" "Coordinates for the variables" #> 2 "$cor" "Correlations between variables and dimensions" #> 3 "$cos2" "Cos2 for the variables" #> 4 "$contrib" "contributions of the variables" # Coordinates of variables head(var$coord) #> Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 #> X100m -0.8506257 -0.17939806 0.3015564 0.03357320 -0.1944440 #> Long.jump 0.7941806 0.28085695 -0.1905465 -0.11538956 0.2331567 #> Shot.put 0.7339127 0.08540412 0.5175978 0.12846837 -0.2488129 #> High.jump 0.6100840 -0.46521415 0.3300852 0.14455012 0.4027002 #> X400m -0.7016034 0.29017826 0.2835329 0.43082552 0.1039085 #> X110m.hurdle -0.7641252 -0.02474081 0.4488873 -0.01689589 0.2242200 # Contribution of variables head(var$contrib) #> Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 #> X100m 17.544293 1.7505098 7.338659 0.13755240 5.389252 #> Long.jump 15.293168 4.2904162 2.930094 1.62485936 7.748815 #> Shot.put 13.060137 0.3967224 21.620432 2.01407269 8.824401 #> High.jump 9.024811 11.7715838 8.792888 2.54987951 23.115504 #> X400m 11.935544 4.5799296 6.487636 22.65090599 1.539012 #> X110m.hurdle 14.157544 0.0332933 16.261261 0.03483735 7.166193 # Graph of variables: default plot fviz_pca_var(res.pca, col.var = "black") ``` ![](tools/README-pca-variables-1.png) It's possible to control variable colors using their contributions ("contrib") to the principal axes: ``` r # Control variable colors using their contributions fviz_pca_var(res.pca, col.var="contrib", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE # Avoid text overlapping ) ``` ![](tools/README-pca-variable-colors-by-contributions-1.png) 1. **Variable contributions to the principal axes**: ``` r # Contributions of variables to PC1 fviz_contrib(res.pca, choice = "var", axes = 1, top = 10) # Contributions of variables to PC2 fviz_contrib(res.pca, choice = "var", axes = 2, top = 10) ``` ![](tools/README-pca-variable-contributions-1.png)![](tools/README-pca-variable-contributions-2.png) 1. **Extract and visualize results for individuals**: ``` r # Extract the results for individuals ind <- get_pca_ind(res.pca) ind #> Principal Component Analysis Results for individuals #> =================================================== #> Name Description #> 1 "$coord" "Coordinates for the individuals" #> 2 "$cos2" "Cos2 for the individuals" #> 3 "$contrib" "contributions of the individuals" # Coordinates of individuals head(ind$coord) #> Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 #> SEBRLE 0.1955047 1.5890567 0.6424912 0.08389652 1.16829387 #> CLAY 0.8078795 2.4748137 -1.3873827 1.29838232 -0.82498206 #> BERNARD -1.3591340 1.6480950 0.2005584 -1.96409420 0.08419345 #> YURKOV -0.8889532 -0.4426067 2.5295843 0.71290837 0.40782264 #> ZSIVOCZKY -0.1081216 -2.0688377 -1.3342591 -0.10152796 -0.20145217 #> McMULLEN 0.1212195 -1.0139102 -0.8625170 1.34164291 1.62151286 # Graph of individuals # 1. Use repel = TRUE to avoid overplotting # 2. Control automatically the color of individuals using the cos2 # cos2 = the quality of the individuals on the factor map # Use points only # 3. Use gradient color fviz_pca_ind(res.pca, col.ind = "cos2", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE # Avoid text overlapping (slow if many points) ) ``` ![](tools/README-principal-component-analysis-data-mining-1.png) ``` r # Biplot of individuals and variables fviz_pca_biplot(res.pca, repel = TRUE) ``` ![](tools/README-principal-component-analysis-data-mining-2.png) 1. **Color individuals by groups**: ``` r # Compute PCA on the iris data set # The variable Species (index = 5) is removed # before PCA analysis iris.pca <- PCA(iris[,-5], graph = FALSE) # Visualize # Use habillage to specify groups for coloring fviz_pca_ind(iris.pca, label = "none", # hide individual labels habillage = iris$Species, # color by groups palette = c("#00AFBB", "#E7B800", "#FC4E07"), addEllipses = TRUE # Concentration ellipses ) ``` ![](tools/README-individuals-factor-map-color-by-groups-1.png) ### Correspondence analysis - Data: *housetasks* \[in factoextra\] - CA function *FactoMineR::CA*() - Visualize with *factoextra::fviz\_ca*() Read more about computing and interpreting correspondence analysis at: [**Correspondence Analysis** (CA)](http://www.sthda.com/english/wiki/correspondence-analysis-in-r-the-ultimate-guide-for-the-analysis-the-visualization-and-the-interpretation-r-software-and-data-mining). - **Compute CA**: ``` r # Loading data data("housetasks") # Computing CA library("FactoMineR") res.ca <- CA(housetasks, graph = FALSE) ``` - **Extract results for row/column variables**: ``` r # Result for row variables get_ca_row(res.ca) # Result for column variables get_ca_col(res.ca) ``` - **Biplot of rows and columns** ``` r fviz_ca_biplot(res.ca, repel = TRUE) ``` ![](tools/README-correspondence-analysis-biplot-1.png) To visualize only row points or column points, type this: ``` r # Graph of row points fviz_ca_row(res.ca, repel = TRUE) # Graph of column points fviz_ca_col(res.ca) # Visualize row contributions on axes 1 fviz_contrib(res.ca, choice ="row", axes = 1) # Visualize column contributions on axes 1 fviz_contrib(res.ca, choice ="col", axes = 1) ``` ### Multiple correspondence analysis - Data: **poison** \[in factoextra\] - MCA function **FactoMineR::MCA**() - Visualization **factoextra::fviz\_mca**() Read more about computing and interpreting multiple correspondence analysis at: [**Multiple Correspondence Analysis** (MCA)](http://www.sthda.com/english/wiki/multiple-correspondence-analysis-essentials-interpretation-and-application-to-investigate-the-associations-between-categories-of-multiple-qualitative-variables-r-software-and-data-mining). 1. **Computing MCA**: ``` r library(FactoMineR) data(poison) res.mca <- MCA(poison, quanti.sup = 1:2, quali.sup = 3:4, graph=FALSE) ``` 1. **Extract results for variables and individuals**: ``` r # Extract the results for variable categories get_mca_var(res.mca) # Extract the results for individuals get_mca_ind(res.mca) ``` 1. **Contribution of variables and individuals to the principal axes**: ``` r # Visualize variable categorie contributions on axes 1 fviz_contrib(res.mca, choice ="var", axes = 1) # Visualize individual contributions on axes 1 # select the top 20 fviz_contrib(res.mca, choice ="ind", axes = 1, top = 20) ``` 1. **Graph of individuals** ``` r # Color by groups # Add concentration ellipses # Use repel = TRUE to avoid overplotting grp <- as.factor(poison[, "Vomiting"]) fviz_mca_ind(res.mca, habillage = grp, addEllipses = TRUE, repel = TRUE) ``` ![](tools/README-mca-graph-of-individuals-1.png) 1. **Graph of variable categories**: ``` r fviz_mca_var(res.mca, repel = TRUE) ``` ![](tools/README-mca-graph-variables-1.png) 1. **Biplot of individuals and variables**: ``` r fviz_mca_biplot(res.mca, repel = TRUE) ``` ![](tools/README-mca-biplot-1.png) ### Advanced methods The factoextra R package has also functions that support the visualization of advanced methods such: - Factor Analysis of Mixed Data (FAMD): : [FAMD Examples](http://www.sthda.com/english/rpkgs/factoextra/reference/fviz_famd.html) - Multiple Factor Analysis (MFA): [MFA Examples](http://www.sthda.com/english/rpkgs/factoextra/reference/fviz_mfa.html) - Hierarchical Multiple Factor Analysis (HMFA): [HMFA Examples](http://www.sthda.com/english/rpkgs/factoextra/reference/fviz_hmfa.html) - [Hierachical Clustering on Principal Components (HCPC)](http://www.sthda.com/english/articles/31-principal-component-methods-in-r-practical-guide/117-hcpc-hierarchical-clustering-on-principal-components-essentials/) Cluster analysis and factoextra ------------------------------- To learn more about cluster analysis, you can refer to the book available at: [Practical Guide to Cluster Analysis in R](http://www.sthda.com/english/wiki/practical-guide-to-cluster-analysis-in-r-book)
    clustering book cover The main parts of the book include: - *distance measures*, - *partitioning clustering*, - *hierarchical clustering*, - *cluster validation methods*, as well as, - *advanced clustering methods* such as fuzzy clustering, density-based clustering and model-based clustering. The book presents the basic principles of these tasks and provide many examples in R. It offers solid guidance in data mining for students and researchers. ### Partitioning clustering ![Partitioning cluster analysis](tools/partitioning-clustering.png) ``` r # 1. Loading and preparing data data("USArrests") df <- scale(USArrests) # 2. Compute k-means set.seed(123) km.res <- kmeans(scale(USArrests), 4, nstart = 25) # 3. Visualize library("factoextra") fviz_cluster(km.res, data = df, palette = c("#00AFBB","#2E9FDF", "#E7B800", "#FC4E07"), ggtheme = theme_minimal(), main = "Partitioning Clustering Plot" ) ``` ![](tools/README-partitioning-clustering-1.png)
    Read more: 1. [Cluster analysis in R: All what you should know](http://www.sthda.com/english/wiki/cluster-analysis-in-r-unsupervised-machine-learning). 2. [Partitioning cluster analysis](http://www.sthda.com/english/wiki/partitioning-cluster-analysis-quick-start-guide-unsupervised-machine-learning).
    ### Hierarchical clustering ``` r library("factoextra") # Compute hierarchical clustering and cut into 4 clusters res <- hcut(USArrests, k = 4, stand = TRUE) # Visualize fviz_dend(res, rect = TRUE, cex = 0.5, k_colors = c("#00AFBB","#2E9FDF", "#E7B800", "#FC4E07")) ``` ![](tools/README-hierarchical-clustering-1.png)
    Read more: 1. [Cluster analysis in R: All what you should know](http://www.sthda.com/english/wiki/cluster-analysis-in-r-unsupervised-machine-learning) 2. [Hierarchical clustering essentials](http://www.sthda.com/english/wiki/hierarchical-clustering-essentials-unsupervised-machine-learning)
    ### Determine the optimal number of clusters ``` r # Optimal number of clusters for k-means library("factoextra") my_data <- scale(USArrests) fviz_nbclust(my_data, kmeans, method = "gap_stat") ``` ![](tools/README-determine-the-number-of-clusters-gap-statistics-1.png) Acknoweledgment --------------- I would like to thank [Fabian Mundt](https://github.com/inventionate) for his active contributions to factoextra. We sincerely thank all developers for their efforts behind the packages that **factoextra** depends on, namely, [ggplot2](https://cran.r-project.org/package=ggplot2) (Hadley Wickham, Springer-Verlag New York, 2009), [FactoMineR](https://cran.r-project.org/package=FactoMineR) (Sebastien Le et al., Journal of Statistical Software, 2008), [dendextend](https://cran.r-project.org/package=dendextend) (Tal Galili, Bioinformatics, 2015), [cluster](https://cran.r-project.org/package=dendextend) (Martin Maechler et al., 2016) and more ..... References ---------- - H. Wickham (2009). ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. - Maechler, M., Rousseeuw, P., Struyf, A., Hubert, M., Hornik, K.(2016). cluster: Cluster Analysis Basics and Extensions. R package version 2.0.5. - Sebastien Le, Julie Josse, Francois Husson (2008). FactoMineR: An R Package for Multivariate Analysis. Journal of Statistical Software, 25(1), 1-18. 10.18637/jss.v025.i01 - Tal Galili (2015). dendextend: an R package for visualizing, adjusting, and comparing trees of hierarchical clustering. Bioinformatics. DOI: 10.1093/bioinformatics/btv428 factoextra/data/0000755000176200001440000000000013641173345013332 5ustar liggesusersfactoextra/data/decathlon2.rda0000644000176200001440000000276613144620011016041 0ustar liggesusersVKlUS#ZUb춉$DU2N;6 tLۉ*B PA-PEQT Bl@B] ,h$=wZ,`}wyrI(554JMgs 5K5md\,얤&X(dN߱t3~C^w(j?|[We{=K lXwv%Y }R}_PVKOnmˌȾ/+C.ӟw{`.ѕ {Nte=݈^"w/w9]WG{`續ס{gom{e_s<"_;rBϻO/ @U);7 &i9BB#WuY >?Z|I @0BWhy]_?)Ka`?L8VilOYDYyRQ]%?Ou3>O+8 xWϑ}U^⳨c/z+8c"Csă9T>F~:Lxŭ'0<7/AYg ~8_ hE^7N)1v;-864n }}FuMCGxT/q}\rIOe`S9u|Vܿ[0osm9|[pm/7wl8/rSA2y?K%I?k-{!]Y^/ *~'lq 9';/qayn k?.֜1o=5+G7e[sb6n2;)gLŴįz7}#/N  䡬Kjȕ'JX[2w5|@>4WsÉd˙j̜׫9~P d Ռ͚^8Ŗ13[p#fhTY>VpM=4cXg ltr谖rd~ GTXI->N#G>L&)v khxySD:VZÚ઩t:]'OSD<ْЭ9FúU073K8U: E-RY2rN%p0 #lհnYzTT[49sK24? l| factoextra/data/multishapes.rda0000644000176200001440000004065313144620011016351 0ustar liggesusers}y4U5)4T$͊liPI  4EI!d("C}tq/隇 =ϻ?9{콟,g}vs Fa`}dg}Q8)|,\`~;L,ܡP8HE,1 NR&z_~Px Qw xj k #Բd`z}Jg;ޛSz؞Ó$3kBzVbrh[_1Ri(wFDyXG[2;Rq{jH ZdNgƁA8$.n Lm Eؒ5UkT|GEf"L@`m>voX>; m1튍(+wOb JN a˕z!HRWpUA͚#н.tpv<ͯ;F;c^8kc<^s,nnb;<Or?N!c=}uCx2~ +c2y{حVXvNrzBiФbE[.~net3b-&۸ Y`.9h6 Z*{˓j]ѿI Sg%CB!ɏsvF-LAScjv?l>WW{N'Ae۲+mXpSrt%_[t6TM0xj_VX10GKq-Zx~2HLN5] Pvss^!ԑew1'(V6}fx2;f=>*4OHz'! 0Q+_8$5A}yw>0vh?)Uy޾b#ODŽ.[`zky]l~Yk Ww`K^goM^(}]m\-WB*i 0^LsB"T|; ?/߃e/Zc v]|ƘG Sݯ)k޻7 ko@GڈV- I\Umv<퀎[wS1\@zI94JjR[! B}vL)5- U/PfЎ9>9=JN#".^q;XkgtVJdiq]#~Ʈpih4{ UEͷAQzWP@_2KbR!*`DMi@y\ƴ!5kƁ)00Om1~E~м5Va07ϫAޞgr.N!v_VJ {wֳR{<pyl ĀC^/saW`k$I#h[/MKZ. =ڤc_dC,}b]<:}+/e AȚ+so qˏǞ ksdKX7tYL_]|mЧ|$#,JfVFdX`0kc5[R> gns?m` O0T ;l.(Ad^1d~ z7;_+DGC'l6 \||Ϫ|pΏ[Y* }r-L'jϱxjRD1,C'JeGY֝uUj;.|_7 \? - # :zQB:[_vūsG (=rH*:ŭZ{T7z vTb; (h!OB"d}}2нaFV4 χyd`pەL!~DQX侲%MV]EF>X}19mVzR>>FoO"MɎev p,_46ݘV:2~kwE}녪U'fۄVPk2um-0ioپ!,?kC4R2ư=u%oRNØc`+'k\fȎJљ*EWdjSڥ~LsD,/K8 +IY⩚?hkE& hSgS36KZ1Ja풓X%{?mֵ6zUf3GiwCB[W\ڹϏ}gW`eaR,N>5EKʡwDz&TMD4_tdIhMq*%/|DBn0IT$ۛʷűb-GclǩpDTxkQxl0xBo SNcE.nNyGv)|yۻC9&1a68mhjW0@ija"|[Bcqvrw~;ʧ>{ .=# فk40} v)V6;fةt:|1Rډ&C/:ԴmӐ0{f ՗G<&9t@T]s5Ve^n\qF%2h +&7V~b{?w߇74~tϣVX?eӖpj<vGrD^a/c;4>=T# H^$ڧvi3˘IX0;w"v#ڑ= 0{-yP5 P%>f6q?rw1 UK$Aиय PW{}2˫sCDUS u٭†iQ'TJ3{dӾ|ojٺw`ց/k03l ]^'5 ?ņr0WK/Ej&ZV;0+aQm0*l es[M, 1NY])EmI uS<WEm/U;Ka?3 KJ鄍P;wmzDIDbM'm*jzvY4:m.r?9>Y砍۴u`l^dNt j悄@˛ cj0VbXlF{hJ;hڽ {MraBjs_d5oN̥Q 4 Bô޻|JW3*iSW=LCic)jGlUnwZ҄:+AiO`U{P}`%d^]8~=*k/a> ;ս8gPb:Y@3F;o-z[#doݺn-̆>A]6VP#}ۿTKh>Bt-e0{}YKaI9YA8Ջ['3N,+V<؂4E|`垶=P*ȕ ;/x~M 2Zb@[FYs ~ۺ&.B׼k.B2$PKᇹC~ji\yetq]ۀn!4UsRX@=Vle%z9;+.<.S ;F@OZW5ݝ#!wǁP2$P G(&Cz=f>UAž)9-_C ߴXcfnz+fx*t(_`l5TYE-/“LfN"Cf{(~uWQ﹘yn-ƅ/ GҜţƭ}_tIfkl,3X߁RgS'6D+~ 8t`e^rt _~Zmms_9>whBpkPv[G; +f]dôgӱjϐMuW#TʭӀZ엻%G^7V̝ _v9a^Y9氢4c 溫Qźu(mFke᜕77A JWؠ %>agϋCSul>(VIuф6 ,/q=&nٕ1~vT5=c_beقw1-`;lٶ[A W U-N-Ϡ^p3Z4y+'(374+[&=p>io VtƾGw eձzQ>Lk;j*=ceY,.k1Ip}`HԐה/4LqힳPѮmNxC XĹ`\,zHb㘸}:Pj'Vh:rE5XQKJvٳ5O⧏h/w"Yuoqay6Xߣ\L3kuABZK_%PNA;TMU.%Th1dc/G˄O'b}x=!_WwmSԊ3 [hx Գt}r9,?!&ɷ%+S(L5:r_)3~.=ZO#y =jrk=R~TiTۡw"~D1$盐v&Icu2\C$W_ ɺ物vi ~"GֵevGR7i<2xHȺ EtWր/cT駵߼}aG{T{&k'šȺPaW)ܸxkd=N?M Z@"q9n׎ L]L[Q_Oq\CX 2MgРR}r<4$G'($VdM$~ޓ@ϑM\EߺOy}u Fxsc)zkH 8yb*[ao[IbY_$FNd}_vNCs͜iv..e}sR>ar߸ڞދ!\M^g>%Oo;.9W^ߟn2⏭L)2_eC.=Q$MUd 7| ~>$;5X!7^_݉?~%o4r3|S:^˱5KEJ$ܜ7ߕǂ}I=nG'I>seԌm~K$v$F=cvr<&cDҙ~o{H <3w&{Nֱos'|B^9,Mگ.]o-ɺUk#Z<@`Ɠ$C2q ]Ǹ;>':wL"N̓h#*C#Ebv1suuh ?VIΧʰWxIw`&3 _=AkĩHo,IR>Q_{~$w I8cTY\z&P wm(o=~d b'F=?:2!{>;Iް/S6u2&N}2.Wd~$bIC^EQ'9nUBoOi"~9~$(Eu/W&噋3uVMz~ $_toXuʷgR%冊-!1}{3`rK{?O 4v_-a'&IU;.rȤ.Gv O0,xDq^ >|A((Cj+[+cDGe`Q]Ov:H>?_Cu*8ꔃAV0Y9Q#}H,Cbmȸ;$ kz;&t-R| jUy6WQƖy'e&6GUAg6qtvn]Į? :rŠ=gW]oր%]"XJHsyAʗO@k !h~h*FAܙoAMx³ţ!zg?RIH?׸2_^J텎*ɽv:β6,D1aXyxk/t77 m v)#x@CSp>,R|3~/]c#@v5#8;j@|gQe?Wz L)wwpL`UY,v%tdѢ>*Y!vT=l8C^kW`K:,dB{^N Z;^В0iZVaΕ{l}J^{֖B v߱^h#-A7#A$t2Z8ʜlߌσAZv+zY}x#|q]_^y?#]wb# ]HP5GRܻLpR<  ? apzav*xls_ K^]cl8]L/atx̅7Bxɩ PNw9v= |O&uw&v-+=qzdf=1! ٶ>+Vs:q?bN]߾e+I^,Nj?=pth'v>U{[aod.Ӿ;WUoCi1X.̽tZثuZeOyб̉C۹雽E;lLw2BW0 M+cMoQvR9'c4?}bu0Y6=)n.1؎mK~~ٳ EZw#k5B%v!޷y[J< $- _T+XGy|y!^ݗ2[Ֆ/ͅ _C`虐G-0{F&>C݋ jC1nUU /|z=Λ'O\E}N=Tlf -Rضp+MBt H*>UKxS{:EARZ+d  Þ!w;`'>q-[˃ݡ3Im2OƽfW"S| ˉWngLpult-bغt(3;;J90 [l_lo*RXD[d2`jXs]Di{O .Hü P;/1((f#ɔlQCaGW_mQa7>׎4V(}#Ut8m'I ٘6YR=rkH_>Sr@KsdX9vıbkJۣۡ`l=}Eyë8tmO}UbB=7Rq-) t/aQY^`h\0`wѮ}*Nx|η -ɇ o"ٱewJ:q1tiqW6XeYLi@Vsj5UZԏ@#+[^@ xO+߅ a::w.A&Ltwno},ye3Ï="G}ҫż+Z_ cP]wJ\t~*]CۄϽ"|d8|a6׎=o2_$!_kؽ["yc4%e4*"q~P~-w[(88ik"E@p?uu5sgVʧz"B`+}OM|ĴPFuo(U0j:m{BnYkI,]U8O)cB <[cgjT sX LV0rho~R<IZLcO'tNtWE}P*pJ4R"R%؅P&h I? 2u_fS6W=/ s ),܌r*@vÚ%@2նaJakA(.쿆t} pĘx<{excw4;+bQiR(I|m vڥ6߿2>WmУJmk֍y [n!/`>D_d]w_Oyu/1Gx!xMCZظ5(EJei3J)Plh %l!%~mӜ1)P}u%?ߡk"|@Ԗz7df5g2?mPC/ U'7f  :A%kw*2Qc#~NH/D.pl/fA ykZn`)P~cTBei<Ԡ1iCNEkUeEV+S%X?=o9z` |.2W}9QečU&@}rj: ՛i̍$l/ adxgN%t-0(>iH1&IN|&*1@+R.o jSCҡ-K0A+_-3Ң缪/!z:q#Ru~>& R=>(k$C,Vרa=7U|b6?XkFXE!nΘlizDͰG -PnVql$vgeT@o/Xwu=ÆPG'.rzK筄&/Hg>I4M{?J]T&X]F4h//5ol\o6k׀Vom:sq0$j%kdz_AbWgHli^ * /.:*{? doZ%#lpV6R(c9qBP%P4:T7Շ52LfhZ aX&Q>s >n/WaIrC~L7RmxAQ»:WXkC 2V'uKZ5[:9v>tSf XѤޔ'bE?6؋/97Gm{;4<l| w\fܼ.˜MqH{tij+1ES|L_ʊNQ!7~g d}̑L'?茕Q`,x/!} úeݡcᵸ݉P5d} dnX毣?ʫj,Ĉ¯[<$76AH+HsE4°#P*V^,ϝٱ6&WG ߰_2ƭj ĺڙÀ^9oTs7Ir=T!1(0UaüM8Zծ. űى\jz`[uߵ/PV|%Ǝ^C(8[_5gQCL!v3TtI C 㸧VxY)xo~ |ۃ_ƄӠҾ |ST!#U// cO8|Gc+B͟agAnL}!LCMh'Q+xgk9ZNڄ:ֈ^~+| ( , /7 f;pip(k5 (!L]mR%(ǒPoO4UN=YӼ8.蠟DP"ćq~db啞 M}.8ATbƹ%(} S]KN:?*DI'Qhs\ֿ&(4+SStӮsẊN.Ɂ<k|a| R|!(.Ef#Zl<􋼺hn`t|U8v+A{jpD` &4ο~8_QSޖ`-|$(7w'(A=04q{M52;eiMPί/^mI ( (%(DFκ32sGM޲ >s;9>8{ƒ%18{{":vOFNe-'(k̓^ǧEn$/2).}Gi8< g?ݢEmhpɔ9eB& ?+Vl7~^ehXoaV]Rv 6J^A21Slve6k=]V۳5g t~A38sBeP|3_M >^}lA0K>qٜyN'D\Mtlp :),q\PwRJdF_&L/KpOŬ?Ċ?wSY#,ekp5m wHԌHO"xֽ +08Ί~ؚqnnor?%~*szn <3g3}BC,ǐ^7ʼnsZZvY7 MJϸA%#x$#$IZNpl}N3\oR,ضUt++-{eǻZཨd\"xݿ%] TY u%xΆ.pZeuI{+C>l}KyG nA 7 ŢcgoG%pW/,5+#tS5˶7^:,ٵѡ_`;:pA8!ޥzVX5!4C|wxs:"plN {u 5w!eew":1<v髺b;]zFyz0,"|{@AWNY/)z`TEq⥎rk 6EMJK{+O@$dǂ`o)-729uЕҧl";Lu~ُg'ޕ'X%'fk˝8o)V K>vI%j|ۜ5N΍0Y5#50n͓kX[ |~}zm,ĔDVAqfk7)q7JRƑ7Kٓ8;}^=> 6o]O$tT\wa?yugjpjGpsnz}g3O2KݻW䅔 32􂉔ΛV7M%.1)% ωKdq}y"ϭ\1^{9Ӧh[zzk'Xwp$.#8~K#8s!SgnsѝAu^sN(r+(u'8˸#8 ?4${5c38@4>wALnYfF8}8s`$eo,-)lpaJի vCcTBWWUfIl*VD#T{yȗ??oQ???e-sGu(BGu{?_l#w./d۳>O'L&/53bFsE>Z hfactoextra/data/housetasks.rda0000644000176200001440000000053713144620011016201 0ustar liggesusers]MK@I֪G=("[ԏ"Ddl6vi)⬝MBOvw}gf0u]Ƙ܆kwg1wϤ>|"$D.c2nuXX6SZCdZʙ|!4ҪytTѝL/Ҕ1u{1}od\IȄ|P{W=ަBfIYyAXa ҏA}-Taue!@+RreEAg$zM֧<]l!Lہ gݿ:W&b!_Peq s_ض`factoextra/data/poison.rda0000644000176200001440000000150713144620011015315 0ustar liggesusersW]S@ݤm*#|d`}@P7'iAϣޓlsͽ{'7w3:h0[MgcGN ix$Ǯٕ4pW7F~Aq-ĬQ*~Y$Ǚ)v~6;!SBE||[X~:>&?c]'S^{J9qX_y>ͽVPhq0Y41۳ǪahbuF VUerkgp5!L_3\ʟp"( 0`8]|"kP*^NLϜ|,:4qՍZ9֥N7}`j-ǓUq UVu|>&M*6p2&APݰ}ja0Rnt<퓳l G.yso=;_ť/p˯g#qxv4fL{5 M IOʂh˥ы_[EIvua20@W@@6y@;@@{@a 68lpa8p8p.8\pp .8 factoextra/man/0000755000176200001440000000000013641173345013174 5ustar liggesusersfactoextra/man/get_clust_tendency.Rd0000644000176200001440000000551413641172644017353 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/get_clust_tendency.R \name{get_clust_tendency} \alias{get_clust_tendency} \title{Assessing Clustering Tendency} \usage{ get_clust_tendency( data, n, graph = TRUE, gradient = list(low = "red", mid = "white", high = "blue"), seed = 123 ) } \arguments{ \item{data}{a numeric data frame or matrix. Columns are variables and rows are samples. Computation are done on rows (samples) by default. If you want to calculate Hopkins statistic on variables, transpose the data before.} \item{n}{the number of points selected from sample space which is also the number of points selected from the given sample(data).} \item{graph}{logical value; if TRUE the ordered dissimilarity image (ODI) is shown.} \item{gradient}{a list containing three elements specifying the colors for low, mid and high values in the ordered dissimilarity image. The element "mid" can take the value of NULL.} \item{seed}{an integer specifying the seed for random number generator. Specify seed for reproducible results.} } \value{ A list containing the elements: - hopkins_stat for Hopkins statistic value - plot for ordered dissimilarity image. This is generated using the function \code{\link{fviz_dist}}(dist.obj). } \description{ Before applying cluster methods, the first step is to assess whether the data is clusterable, a process defined as the \strong{assessing of clustering tendency}. get_clust_tendency() assesses clustering tendency using Hopkins' statistic and a visual approach. An ordered dissimilarity image (ODI) is shown. Objects belonging to the same cluster are displayed in consecutive order using hierarchical clustering. For more details and interpretation, see \href{http://www.sthda.com/english/articles/29-cluster-validation-essentials/95-assessing-clustering-tendency-essentials/}{STHDA website: Assessing clustering tendency}. } \details{ \strong{Hopkins statistic}: If the value of Hopkins statistic is close to 1 (far above 0.5), then we can conclude that the dataset is significantly clusterable. \strong{VAT (Visual Assessment of cluster Tendency)}: The VAT detects the clustering tendency in a visual form by counting the number of square shaped dark (or colored) blocks along the diagonal in a VAT image. } \examples{ data(iris) # Clustering tendency gradient_col = list(low = "steelblue", high = "white") get_clust_tendency(iris[,-5], n = 50, gradient = gradient_col) # Random uniformly distributed dataset # (without any inherent clusters) set.seed(123) random_df <- apply(iris[, -5], 2, function(x){runif(length(x), min(x), max(x))} ) get_clust_tendency(random_df, n = 50, gradient = gradient_col) } \seealso{ \code{\link{fviz_dist}} } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/print.factoextra.Rd0000644000176200001440000000116513144620014016745 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/print.factoextra.R \name{print.factoextra} \alias{print.factoextra} \title{Print method for an object of class factoextra} \usage{ \method{print}{factoextra}(x, ...) } \arguments{ \item{x}{an object of class factoextra} \item{...}{further arguments to be passed to print method} } \description{ Print method for an object of class factoextra } \examples{ data(iris) res.pca <- prcomp(iris[, -5], scale = TRUE) ind <- get_pca_ind(res.pca, data = iris[, -5]) print(ind) } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/get_pca.Rd0000644000176200001440000000407613144620014015060 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/get_pca.R \name{get_pca} \alias{get_pca} \alias{get_pca_ind} \alias{get_pca_var} \title{Extract the results for individuals/variables - PCA} \usage{ get_pca(res.pca, element = c("var", "ind")) get_pca_ind(res.pca, ...) get_pca_var(res.pca) } \arguments{ \item{res.pca}{an object of class PCA [FactoMineR]; prcomp and princomp [stats]; pca, dudi [adea4]; epPCA [ExPosition].} \item{element}{the element to subset from the output. Allowed values are "var" (for active variables) or "ind" (for active individuals).} \item{...}{not used} } \value{ a list of matrices containing all the results for the active individuals/variables including: \item{coord}{coordinates for the individuals/variables} \item{cos2}{cos2 for the individuals/variables} \item{contrib}{contributions of the individuals/variables} } \description{ Extract all the results (coordinates, squared cosine, contributions) for the active individuals/variables from Principal Component Analysis (PCA) outputs.\cr\cr \itemize{ \item get_pca(): Extract the results for variables and individuals \item get_pca_ind(): Extract the results for individuals only \item get_pca_var(): Extract the results for variables only } } \examples{ \donttest{ # Principal Component Analysis # +++++++++++++++++++++++++++++ data(iris) res.pca <- prcomp(iris[, -5], scale = TRUE) # Extract the results for individuals ind <- get_pca_ind(res.pca) print(ind) head(ind$coord) # coordinates of individuals head(ind$cos2) # cos2 of individuals head(ind$contrib) # contributions of individuals # Extract the results for variables var <- get_pca_var(res.pca) print(var) head(var$coord) # coordinates of variables head(var$cos2) # cos2 of variables head(var$contrib) # contributions of variables # You can also use the function get_pca() get_pca(res.pca, "ind") # Results for individuals get_pca(res.pca, "var") # Results for variable categories } } \references{ http://www.sthda.com/english/ } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/fviz_hmfa.Rd0000644000176200001440000001533613641172644015445 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fviz_hmfa.R \name{fviz_hmfa} \alias{fviz_hmfa} \alias{fviz_hmfa_ind} \alias{fviz_hmfa_var} \alias{fviz_hmfa_quali_biplot} \title{Visualize Hierarchical Multiple Factor Analysis} \usage{ fviz_hmfa_ind( X, axes = c(1, 2), geom = c("point", "text"), repel = FALSE, habillage = "none", addEllipses = FALSE, shape.ind = 19, col.ind = "blue", col.ind.sup = "darkblue", alpha.ind = 1, select.ind = list(name = NULL, cos2 = NULL, contrib = NULL), partial = NULL, col.partial = "group", group.names = NULL, node.level = 1, ... ) fviz_hmfa_var( X, choice = c("quanti.var", "quali.var", "group"), axes = c(1, 2), geom = c("point", "text"), repel = FALSE, col.var = "red", alpha.var = 1, shape.var = 17, col.var.sup = "darkgreen", select.var = list(name = NULL, cos2 = NULL, contrib = NULL), ... ) fviz_hmfa_quali_biplot( X, axes = c(1, 2), geom = c("point", "text"), repel = FALSE, habillage = "none", title = "Biplot of individuals and qualitative variables - HMFA", ... ) fviz_hmfa(X, ...) } \arguments{ \item{X}{an object of class HMFA [FactoMineR].} \item{axes}{a numeric vector of length 2 specifying the dimensions to be plotted.} \item{geom}{a text specifying the geometry to be used for the graph. Allowed values are the combination of \code{c("point", "arrow", "text")}. Use \code{"point"} (to show only points); \code{"text"} to show only labels; \code{c("point", "text")} or \code{c("arrow", "text")} to show arrows and texts. Using \code{c("arrow", "text")} is sensible only for the graph of variables.} \item{repel}{a boolean, whether to use ggrepel to avoid overplotting text labels or not.} \item{habillage}{an optional factor variable for coloring the observations by groups. Default value is "none". If X is an HMFA object from FactoMineR package, habillage can also specify the index of the factor variable in the data.} \item{addEllipses}{logical value. If TRUE, draws ellipses around the individuals when habillage != "none".} \item{shape.ind, shape.var}{point shapes of individuals and variables, respectively.} \item{col.ind, col.var}{color for individuals, partial individuals and variables, respectively. Can be a continuous variable or a factor variable. Possible values include also : "cos2", "contrib", "coord", "x" or "y". In this case, the colors for individuals/variables are automatically controlled by their qualities ("cos2"), contributions ("contrib"), coordinates (x^2 + y^2 , "coord"), x values("x") or y values("y"). To use automatic coloring (by cos2, contrib, ....), make sure that habillage ="none".} \item{col.ind.sup}{color for supplementary individuals} \item{alpha.ind, alpha.var}{controls the transparency of individual, partial individual and variable, respectively. The value can variate from 0 (total transparency) to 1 (no transparency). Default value is 1. Possible values include also : "cos2", "contrib", "coord", "x" or "y". In this case, the transparency for individual/variable colors are automatically controlled by their qualities ("cos2"), contributions ("contrib"), coordinates (x^2 + y^2 , "coord"), x values("x") or y values("y"). To use this, make sure that habillage ="none".} \item{select.ind, select.var}{a selection of individuals and variables to be drawn. Allowed values are NULL or a list containing the arguments name, cos2 or contrib: \itemize{ \item name is a character vector containing individuals/variables to be drawn \item cos2 if cos2 is in [0, 1], ex: 0.6, then individuals/variables with a cos2 > 0.6 are drawn. if cos2 > 1, ex: 5, then the top 5 individuals/variables with the highest cos2 are drawn. \item contrib if contrib > 1, ex: 5, then the top 5 individuals/variables with the highest cos2 are drawn }} \item{partial}{list of the individuals for which the partial points should be drawn. (by default, partial = NULL and no partial points are drawn). Use partial = "All" to visualize partial points for all individuals.} \item{col.partial}{color for partial individuals. By default, points are colored according to the groups.} \item{group.names}{a vector containing the name of the groups (by default, NULL and the group are named group.1, group.2 and so on).} \item{node.level}{a single number indicating the HMFA node level to plot.} \item{...}{Arguments to be passed to the function fviz() and ggpubr::ggpar()} \item{choice}{the graph to plot. Allowed values include one of c("quanti.var", "quali.var", "group") for plotting quantitative variables, qualitative variables and group of variables, respectively.} \item{col.var.sup}{color for supplementary variables.} \item{title}{the title of the graph} } \value{ a ggplot } \description{ Hierarchical Multiple Factor Analysis (HMFA) is, an extension of MFA, used in a situation where the data are organized into a hierarchical structure. fviz_hmfa() provides ggplot2-based elegant visualization of HMFA outputs from the R function: HMFA [FactoMineR].\cr\cr \itemize{ \item{fviz_hmfa_ind(): Graph of individuals} \item{fviz_hmfa_var(): Graph of variables} \item{fviz_hmfa_quali_biplot(): Biplot of individuals and qualitative variables} \item{fviz_hmfa(): An alias of fviz_hmfa_ind()} } } \examples{ # Hierarchical Multiple Factor Analysis # ++++++++++++++++++++++++ # Install and load FactoMineR to compute MFA # install.packages("FactoMineR") library("FactoMineR") data(wine) hierar <- list(c(2,5,3,10,9,2), c(4,2)) res.hmfa <- HMFA(wine, H = hierar, type=c("n",rep("s",5)), graph = FALSE) # Graph of individuals # ++++++++++++++++++++ # Color of individuals: col.ind = "#2E9FDF" # Use repel = TRUE to avoid overplotting (slow if many points) fviz_hmfa_ind(res.hmfa, repel = TRUE, col.ind = "#2E9FDF") # Color individuals by groups, add concentration ellipses # Remove labels: label = "none". # Change color palette to "jco". See ?ggpubr::ggpar grp <- as.factor(wine[,1]) p <- fviz_hmfa_ind(res.hmfa, label="none", habillage=grp, addEllipses=TRUE, palette = "jco") print(p) # Graph of variables # ++++++++++++++++++++++++++++++++++++++++ # Quantitative variables fviz_hmfa_var(res.hmfa, "quanti.var") # Graph of categorical variable categories fviz_hmfa_var(res.hmfa, "quali.var") # Groups of variables (correlation square) fviz_hmfa_var(res.hmfa, "group") # Biplot of categorical variable categories and individuals # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ fviz_hmfa_quali_biplot(res.hmfa) # Graph of partial individuals (starplot) # +++++++++++++++++++++++++++++++++++++++ fviz_hmfa_ind(res.hmfa, partial = "all", palette = "Dark2") } \references{ http://www.sthda.com/english/ } \author{ Fabian Mundt \email{f.mundt@inventionate.de} Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/dist.Rd0000644000176200001440000000503613641172644014433 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dist.R \name{dist} \alias{dist} \alias{get_dist} \alias{fviz_dist} \title{Enhanced Distance Matrix Computation and Visualization} \usage{ get_dist(x, method = "euclidean", stand = FALSE, ...) fviz_dist( dist.obj, order = TRUE, show_labels = TRUE, lab_size = NULL, gradient = list(low = "red", mid = "white", high = "blue") ) } \arguments{ \item{x}{a numeric matrix or a data frame.} \item{method}{the distance measure to be used. This must be one of "euclidean", "maximum", "manhattan", "canberra", "binary", "minkowski", "pearson", "spearman" or "kendall".} \item{stand}{logical value; default is FALSE. If TRUE, then the data will be standardized using the function scale(). Measurements are standardized for each variable (column), by subtracting the variable's mean value and dividing by the variable's standard deviation.} \item{...}{other arguments to be passed to the function dist() when using get_dist().} \item{dist.obj}{an object of class "dist" as generated by the function dist() or get_dist().} \item{order}{logical value. if TRUE the ordered dissimilarity image (ODI) is shown.} \item{show_labels}{logical value. If TRUE, the labels are displayed.} \item{lab_size}{the size of labels.} \item{gradient}{a list containing three elements specifying the colors for low, mid and high values in the ordered dissimilarity image. The element "mid" can take the value of NULL.} } \value{ \itemize{ \item get_dist(): returns an object of class "dist". \item fviz_dist(): returns a ggplot2 } } \description{ Clustering methods classify data samples into groups of similar objects. This process requires some methods for measuring the distance or the (dis)similarity between the observations. Read more: \href{http://www.sthda.com/english/wiki/clarifying-distance-measures-unsupervised-machine-learning}{STHDA website - clarifying distance measures.}. \itemize{ \item get_dist(): Computes a distance matrix between the rows of a data matrix. Compared to the standard \code{\link[stats]{dist}}() function, it supports correlation-based distance measures including "pearson", "kendall" and "spearman" methods. \item fviz_dist(): Visualizes a distance matrix } } \examples{ data(USArrests) res.dist <- get_dist(USArrests, stand = TRUE, method = "pearson") fviz_dist(res.dist, gradient = list(low = "#00AFBB", mid = "white", high = "#FC4E07")) } \seealso{ \code{\link[stats]{dist}} } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/fviz_pca.Rd0000644000176200001440000002315513641172644015273 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fviz_pca.R \name{fviz_pca} \alias{fviz_pca} \alias{fviz_pca_ind} \alias{fviz_pca_var} \alias{fviz_pca_biplot} \title{Visualize Principal Component Analysis} \usage{ fviz_pca(X, ...) fviz_pca_ind( X, axes = c(1, 2), geom = c("point", "text"), geom.ind = geom, repel = FALSE, habillage = "none", palette = NULL, addEllipses = FALSE, col.ind = "black", fill.ind = "white", col.ind.sup = "blue", alpha.ind = 1, select.ind = list(name = NULL, cos2 = NULL, contrib = NULL), ... ) fviz_pca_var( X, axes = c(1, 2), geom = c("arrow", "text"), geom.var = geom, repel = FALSE, col.var = "black", fill.var = "white", alpha.var = 1, col.quanti.sup = "blue", col.circle = "grey70", select.var = list(name = NULL, cos2 = NULL, contrib = NULL), ... ) fviz_pca_biplot( X, axes = c(1, 2), geom = c("point", "text"), geom.ind = geom, geom.var = c("arrow", "text"), col.ind = "black", fill.ind = "white", col.var = "steelblue", fill.var = "white", gradient.cols = NULL, label = "all", invisible = "none", repel = FALSE, habillage = "none", palette = NULL, addEllipses = FALSE, title = "PCA - Biplot", ... ) } \arguments{ \item{X}{an object of class PCA [FactoMineR]; prcomp and princomp [stats]; dudi and pca [ade4]; expOutput/epPCA [ExPosition].} \item{...}{Additional arguments. \itemize{ \item in fviz_pca_ind() and fviz_pca_var(): Additional arguments are passed to the functions fviz() and ggpubr::ggpar(). \item in fviz_pca_biplot() and fviz_pca(): Additional arguments are passed to fviz_pca_ind() and fviz_pca_var().}} \item{axes}{a numeric vector of length 2 specifying the dimensions to be plotted.} \item{geom}{a text specifying the geometry to be used for the graph. Allowed values are the combination of \code{c("point", "arrow", "text")}. Use \code{"point"} (to show only points); \code{"text"} to show only labels; \code{c("point", "text")} or \code{c("arrow", "text")} to show arrows and texts. Using \code{c("arrow", "text")} is sensible only for the graph of variables.} \item{geom.ind, geom.var}{as \code{geom} but for individuals and variables, respectively. Default is geom.ind = c("point", "text), geom.var = c("arrow", "text").} \item{repel}{a boolean, whether to use ggrepel to avoid overplotting text labels or not.} \item{habillage}{an optional factor variable for coloring the observations by groups. Default value is "none". If X is a PCA object from FactoMineR package, habillage can also specify the supplementary qualitative variable (by its index or name) to be used for coloring individuals by groups (see ?PCA in FactoMineR).} \item{palette}{the color palette to be used for coloring or filling by groups. Allowed values include "grey" for grey color palettes; brewer palettes e.g. "RdBu", "Blues", ...; or custom color palette e.g. c("blue", "red"); and scientific journal palettes from ggsci R package, e.g.: "npg", "aaas", "lancet", "jco", "ucscgb", "uchicago", "simpsons" and "rickandmorty". Can be also a numeric vector of length(groups); in this case a basic color palette is created using the function \link[grDevices]{palette}.} \item{addEllipses}{logical value. If TRUE, draws ellipses around the individuals when habillage != "none".} \item{col.ind, col.var}{color for individuals and variables, respectively. Can be a continuous variable or a factor variable. Possible values include also : "cos2", "contrib", "coord", "x" or "y". In this case, the colors for individuals/variables are automatically controlled by their qualities of representation ("cos2"), contributions ("contrib"), coordinates (x^2+y^2, "coord"), x values ("x") or y values ("y"). To use automatic coloring (by cos2, contrib, ....), make sure that habillage ="none".} \item{fill.ind, fill.var}{same as col.ind and col.var but for the fill color.} \item{col.ind.sup}{color for supplementary individuals} \item{alpha.ind, alpha.var}{controls the transparency of individual and variable colors, respectively. The value can variate from 0 (total transparency) to 1 (no transparency). Default value is 1. Possible values include also : "cos2", "contrib", "coord", "x" or "y". In this case, the transparency for the individual/variable colors are automatically controlled by their qualities ("cos2"), contributions ("contrib"), coordinates (x^2+y^2, "coord"), x values("x") or y values("y"). To use this, make sure that habillage ="none".} \item{select.ind, select.var}{a selection of individuals/variables to be drawn. Allowed values are NULL or a list containing the arguments name, cos2 or contrib: \itemize{ \item name: is a character vector containing individuals/variables to be drawn \item cos2: if cos2 is in [0, 1], ex: 0.6, then individuals/variables with a cos2 > 0.6 are drawn. if cos2 > 1, ex: 5, then the top 5 individuals/variables with the highest cos2 are drawn. \item contrib: if contrib > 1, ex: 5, then the top 5 individuals/variables with the highest contrib are drawn }} \item{col.quanti.sup}{a color for the quantitative supplementary variables.} \item{col.circle}{a color for the correlation circle. Used only when X is a PCA output.} \item{gradient.cols}{vector of colors to use for n-colour gradient. Allowed values include brewer and ggsci color palettes.} \item{label}{a text specifying the elements to be labelled. Default value is "all". Allowed values are "none" or the combination of c("ind", "ind.sup", "quali", "var", "quanti.sup"). "ind" can be used to label only active individuals. "ind.sup" is for supplementary individuals. "quali" is for supplementary qualitative variables. "var" is for active variables. "quanti.sup" is for quantitative supplementary variables.} \item{invisible}{a text specifying the elements to be hidden on the plot. Default value is "none". Allowed values are the combination of c("ind", "ind.sup", "quali", "var", "quanti.sup").} \item{title}{the title of the graph} } \value{ a ggplot } \description{ Principal component analysis (PCA) reduces the dimensionality of multivariate data, to two or three that can be visualized graphically with minimal loss of information. fviz_pca() provides ggplot2-based elegant visualization of PCA outputs from: i) prcomp and princomp [in built-in R stats], ii) PCA [in FactoMineR], iii) dudi.pca [in ade4] and epPCA [ExPosition]. Read more: \href{http://www.sthda.com/english/wiki/factominer-and-factoextra-principal-component-analysis-visualization-r-software-and-data-mining}{Principal Component Analysis} \itemize{ \item{fviz_pca_ind(): Graph of individuals} \item{fviz_pca_var(): Graph of variables} \item{fviz_pca_biplot(): Biplot of individuals and variables} \item{fviz_pca(): An alias of fviz_pca_biplot()} } Note that, \code{fviz_pca_xxx()} functions are wrapper arround the core function \code{\link{fviz}()}, whih is also a wrapper arround the function \code{\link[ggpubr]{ggscatter}()} [in ggpubr]. Therfore, further arguments, to be passed to the function \code{\link{fviz}()} and \code{\link[ggpubr]{ggscatter}()}, can be specified in \code{\link{fviz_pca_ind}()} and \code{\link{fviz_pca_var}()}. } \examples{ \donttest{ # Principal component analysis # ++++++++++++++++++++++++++++++ data(iris) res.pca <- prcomp(iris[, -5], scale = TRUE) # Graph of individuals # +++++++++++++++++++++ # Default plot # Use repel = TRUE to avoid overplotting (slow if many points) fviz_pca_ind(res.pca, col.ind = "#00AFBB", repel = TRUE) # 1. Control automatically the color of individuals # using the "cos2" or the contributions "contrib" # cos2 = the quality of the individuals on the factor map # 2. To keep only point or text use geom = "point" or geom = "text". # 3. Change themes using ggtheme: http://www.sthda.com/english/wiki/ggplot2-themes fviz_pca_ind(res.pca, col.ind="cos2", geom = "point", gradient.cols = c("white", "#2E9FDF", "#FC4E07" )) # Color individuals by groups, add concentration ellipses # Change group colors using RColorBrewer color palettes # Read more: http://www.sthda.com/english/wiki/ggplot2-colors # Remove labels: label = "none". fviz_pca_ind(res.pca, label="none", habillage=iris$Species, addEllipses=TRUE, ellipse.level=0.95, palette = "Dark2") # Change group colors manually # Read more: http://www.sthda.com/english/wiki/ggplot2-colors fviz_pca_ind(res.pca, label="none", habillage=iris$Species, addEllipses=TRUE, ellipse.level=0.95, palette = c("#999999", "#E69F00", "#56B4E9")) # Select and visualize some individuals (ind) with select.ind argument. # - ind with cos2 >= 0.96: select.ind = list(cos2 = 0.96) # - Top 20 ind according to the cos2: select.ind = list(cos2 = 20) # - Top 20 contributing individuals: select.ind = list(contrib = 20) # - Select ind by names: select.ind = list(name = c("23", "42", "119") ) # Example: Select the top 40 according to the cos2 fviz_pca_ind(res.pca, select.ind = list(cos2 = 40)) # Graph of variables # ++++++++++++++++++++++++++++ # Default plot fviz_pca_var(res.pca, col.var = "steelblue") # Control variable colors using their contributions fviz_pca_var(res.pca, col.var = "contrib", gradient.cols = c("white", "blue", "red"), ggtheme = theme_minimal()) # Biplot of individuals and variables # ++++++++++++++++++++++++++ # Keep only the labels for variables # Change the color by groups, add ellipses fviz_pca_biplot(res.pca, label = "var", habillage=iris$Species, addEllipses=TRUE, ellipse.level=0.95, ggtheme = theme_minimal()) } } \seealso{ \code{\link{fviz_ca}}, \code{\link{fviz_mca}} } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/get_hmfa.Rd0000644000176200001440000000501013641172644015232 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/get_hmfa.R \name{get_hmfa} \alias{get_hmfa} \alias{get_hmfa_ind} \alias{get_hmfa_var} \alias{get_hmfa_partial} \title{Extract the results for individuals/variables/group/partial axes - HMFA} \usage{ get_hmfa( res.hmfa, element = c("ind", "quanti.var", "quali.var", "group", "partial.node") ) get_hmfa_ind(res.hmfa) get_hmfa_var(res.hmfa, element = c("quanti.var", "quali.var", "group")) get_hmfa_partial(res.hmfa) } \arguments{ \item{res.hmfa}{an object of class HMFA [FactoMineR].} \item{element}{the element to subset from the output. Possible values are "ind", "quanti.var", "quali.var", "group" or "partial.node".} } \value{ a list of matrices containing the results for the active individuals, variables, groups and partial nodes, including : \item{coord}{coordinates} \item{cos2}{cos2} \item{contrib}{contributions} } \description{ Extract all the results (coordinates, squared cosine and contributions) for the active individuals/quantitative variables/qualitative variable categories/groups/partial axes from Hierarchical Multiple Factor Analysis (HMFA) outputs.\cr\cr \itemize{ \item get_hmfa(): Extract the results for variables and individuals \item get_hmfa_ind(): Extract the results for individuals only \item get_mfa_var(): Extract the results for variables (quantitatives, qualitatives and groups) \item get_hmfa_partial(): Extract the results for partial.node. } } \examples{ # Multiple Factor Analysis # ++++++++++++++++++++++++ # Install and load FactoMineR to compute MFA # install.packages("FactoMineR") library("FactoMineR") data(wine) hierar <- list(c(2,5,3,10,9,2), c(4,2)) res.hmfa <- HMFA(wine, H = hierar, type=c("n",rep("s",5)), graph = FALSE) # Extract the results for qualitative variable categories var <- get_hmfa_var(res.hmfa, "quali.var") print(var) head(var$coord) # coordinates of qualitative variables head(var$cos2) # cos2 of qualitative variables head(var$contrib) # contributions of qualitative variables # Extract the results for individuals ind <- get_hmfa_ind(res.hmfa) print(ind) head(ind$coord) # coordinates of individuals head(ind$cos2) # cos2 of individuals head(ind$contrib) # contributions of individuals # You can also use the function get_hmfa() get_hmfa(res.hmfa, "ind") # Results for individuals get_hmfa(res.hmfa, "quali.var") # Results for qualitative variable categories } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} Fabian Mundt \email{f.mundt@inventionate.de} } factoextra/man/get_ca.Rd0000644000176200001440000000357113144620014014677 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/get_ca.R \name{get_ca} \alias{get_ca} \alias{get_ca_col} \alias{get_ca_row} \title{Extract the results for rows/columns - CA} \usage{ get_ca(res.ca, element = c("row", "col")) get_ca_col(res.ca) get_ca_row(res.ca) } \arguments{ \item{res.ca}{an object of class CA [FactoMineR], ca [ca], coa [ade4]; correspondence [MASS].} \item{element}{the element to subset from the output. Possible values are "row" or "col".} } \value{ a list of matrices containing the results for the active rows/columns including : \item{coord}{coordinates for the rows/columns} \item{cos2}{cos2 for the rows/columns} \item{contrib}{contributions of the rows/columns} \item{inertia}{inertia of the rows/columns} } \description{ Extract all the results (coordinates, squared cosine, contributions and inertia) for the active row/column variables from Correspondence Analysis (CA) outputs.\cr\cr \itemize{ \item get_ca(): Extract the results for rows and columns \item get_ca_row(): Extract the results for rows only \item get_ca_col(): Extract the results for columns only } } \examples{ \donttest{ # Install and load FactoMineR to compute CA # install.packages("FactoMineR") library("FactoMineR") data("housetasks") res.ca <- CA(housetasks, graph = FALSE) # Result for column variables col <- get_ca_col(res.ca) col # print head(col$coord) # column coordinates head(col$cos2) # column cos2 head(col$contrib) # column contributions # Result for row variables row <- get_ca_row(res.ca) row # print head(row$coord) # row coordinates head(row$cos2) # row cos2 head(row$contrib) # row contributions # You can also use the function get_ca() get_ca(res.ca, "row") # Results for rows get_ca(res.ca, "col") # Results for columns } } \references{ http://www.sthda.com } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/fviz.Rd0000644000176200001440000001717113641172644014451 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fviz.R \name{fviz} \alias{fviz} \title{Visualizing Multivariate Analyse Outputs} \usage{ fviz( X, element, axes = c(1, 2), geom = "auto", label = "all", invisible = "none", labelsize = 4, pointsize = 1.5, pointshape = 19, arrowsize = 0.5, habillage = "none", addEllipses = FALSE, ellipse.level = 0.95, ellipse.type = "norm", ellipse.alpha = 0.1, mean.point = TRUE, color = "black", fill = "white", alpha = 1, gradient.cols = NULL, col.row.sup = "darkblue", col.col.sup = "darkred", select = list(name = NULL, cos2 = NULL, contrib = NULL), title = NULL, axes.linetype = "dashed", repel = FALSE, col.circle = "grey70", circlesize = 0.5, ggtheme = theme_minimal(), ggp = NULL, font.family = "", ... ) } \arguments{ \item{X}{an object of class PCA, CA, MCA, FAMD, MFA and HMFA [FactoMineR]; prcomp and princomp [stats]; dudi, pca, coa and acm [ade4]; ca [ca package]; expoOutput [ExPosition].} \item{element}{the element to subset from the output. Possible values are "row" or "col" for CA; "var" or "ind" for PCA and MCA; "mca.cor" for MCA; 'quanti.var', 'quali.var' , 'group' or 'ind' for FAMD, MFA and HMFA.} \item{axes}{a numeric vector specifying the axes of interest. Default values are 1:2 for axes 1 and 2.} \item{geom}{a text specifying the geometry to be used for the graph. Default value is "auto". Allowed values are the combination of c("point", "arrow", "text"). Use "point" (to show only points); "text" to show only labels; c("point", "text") or c("arrow", "text") to show both types.} \item{label}{a text specifying the elements to be labelled. Default value is "all". Allowed values are "none" or the combination of c("ind", "ind.sup", "quali", "var", "quanti.sup", "group.sup"). "ind" can be used to label only active individuals. "ind.sup" is for supplementary individuals. "quali" is for supplementary qualitative variables. "var" is for active variables. "quanti.sup" is for quantitative supplementary variables.} \item{invisible}{a text specifying the elements to be hidden on the plot. Default value is "none". Allowed values are the combination of c("ind", "ind.sup", "quali", "var", "quanti.sup", "group.sup").} \item{labelsize}{font size for the labels} \item{pointsize}{the size of points} \item{pointshape}{the shape of points} \item{arrowsize}{the size of arrows. Controls the thickness of arrows.} \item{habillage}{an optional factor variable for coloring the observations by groups. Default value is "none". If X is a PCA object from FactoMineR package, habillage can also specify the supplementary qualitative variable (by its index or name) to be used for coloring individuals by groups (see ?PCA in FactoMineR).} \item{addEllipses}{logical value. If TRUE, draws ellipses around the individuals when habillage != "none".} \item{ellipse.level}{the size of the concentration ellipse in normal probability.} \item{ellipse.type}{Character specifying frame type. Possible values are \code{"convex"}, \code{"confidence"} or types supported by \code{\link[ggplot2]{stat_ellipse}()} including one of \code{c("t", "norm", "euclid")} for plotting concentration ellipses. \itemize{ \item \code{"convex"}: plot convex hull of a set o points. \item \code{"confidence"}: plot confidence ellipses arround group mean points as \code{\link[FactoMineR]{coord.ellipse}()}[in FactoMineR]. \item \code{"t"}: assumes a multivariate t-distribution. \item \code{"norm"}: assumes a multivariate normal distribution. \item \code{"euclid"}: draws a circle with the radius equal to level, representing the euclidean distance from the center. This ellipse probably won't appear circular unless \code{\link[ggplot2]{coord_fixed}()} is applied.}} \item{ellipse.alpha}{Alpha for ellipse specifying the transparency level of fill color. Use alpha = 0 for no fill color.} \item{mean.point}{logical value. If TRUE (default), group mean points are added to the plot.} \item{color}{color to be used for the specified geometries (point, text). Can be a continuous variable or a factor variable. Possible values include also : "cos2", "contrib", "coord", "x" or "y". In this case, the colors for individuals/variables are automatically controlled by their qualities of representation ("cos2"), contributions ("contrib"), coordinates (x^2+y^2, "coord"), x values ("x") or y values ("y"). To use automatic coloring (by cos2, contrib, ....), make sure that habillage ="none".} \item{fill}{same as the argument \code{color}, but for point fill color. Useful when pointshape = 21, for example.} \item{alpha}{controls the transparency of individual and variable colors, respectively. The value can variate from 0 (total transparency) to 1 (no transparency). Default value is 1. Possible values include also : "cos2", "contrib", "coord", "x" or "y". In this case, the transparency for the individual/variable colors are automatically controlled by their qualities ("cos2"), contributions ("contrib"), coordinates (x^2+y^2, "coord"), x values("x") or y values("y"). To use this, make sure that habillage ="none".} \item{gradient.cols}{vector of colors to use for n-colour gradient. Allowed values include brewer and ggsci color palettes.} \item{col.col.sup, col.row.sup}{colors for the supplementary column and row points, respectively.} \item{select}{a selection of individuals/variables to be drawn. Allowed values are NULL or a list containing the arguments name, cos2 or contrib: \itemize{ \item name: is a character vector containing individuals/variables to be drawn \item cos2: if cos2 is in [0, 1], ex: 0.6, then individuals/variables with a cos2 > 0.6 are drawn. if cos2 > 1, ex: 5, then the top 5 individuals/variables with the highest cos2 are drawn. \item contrib: if contrib > 1, ex: 5, then the top 5 individuals/variables with the highest contrib are drawn }} \item{title}{the title of the graph} \item{axes.linetype}{linetype of x and y axes.} \item{repel}{a boolean, whether to use ggrepel to avoid overplotting text labels or not.} \item{col.circle}{a color for the correlation circle. Used only when X is a PCA output.} \item{circlesize}{the size of the variable correlation circle.} \item{ggtheme}{function, ggplot2 theme name. Default value is theme_pubr(). Allowed values include ggplot2 official themes: theme_gray(), theme_bw(), theme_minimal(), theme_classic(), theme_void(), ....} \item{ggp}{a ggplot. If not NULL, points are added to an existing plot.} \item{font.family}{character vector specifying font family.} \item{...}{Arguments to be passed to the functions ggpubr::ggscatter() & ggpubr::ggpar().} } \value{ a ggplot } \description{ Generic function to create a scatter plot of multivariate analyse outputs, including PCA, CA, MCA and MFA. } \examples{ \donttest{ # Principal component analysis # +++++++++++++++++++++++++++++ data(decathlon2) decathlon2.active <- decathlon2[1:23, 1:10] res.pca <- prcomp(decathlon2.active, scale = TRUE) fviz(res.pca, "ind") # Individuals plot fviz(res.pca, "var") # Variables plot # Correspondence Analysis # ++++++++++++++++++++++++++ # Install and load FactoMineR to compute CA # install.packages("FactoMineR") library("FactoMineR") data("housetasks") res.ca <- CA(housetasks, graph = FALSE) fviz(res.ca, "row") # Rows plot fviz(res.ca, "col") # Columns plot # Multiple Correspondence Analysis # +++++++++++++++++++++++++++++++++ library(FactoMineR) data(poison) res.mca <- MCA(poison, quanti.sup = 1:2, quali.sup = 3:4, graph=FALSE) fviz(res.mca, "ind") # Individuals plot fviz(res.mca, "var") # Variables plot } } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/get_mca.Rd0000644000176200001440000000477513144620014015063 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/get_mca.R \name{get_mca} \alias{get_mca} \alias{get_mca_var} \alias{get_mca_ind} \title{Extract the results for individuals/variables - MCA} \usage{ get_mca(res.mca, element = c("var", "ind", "mca.cor", "quanti.sup")) get_mca_var(res.mca, element = c("var", "mca.cor", "quanti.sup")) get_mca_ind(res.mca) } \arguments{ \item{res.mca}{an object of class MCA [FactoMineR], acm [ade4], expoOutput/epMCA [ExPosition].} \item{element}{the element to subset from the output. Possible values are "var" for variables, "ind" for individuals, "mca.cor" for correlation between variables and principal dimensions, "quanti.sup" for quantitative supplementary variables.} } \value{ a list of matrices containing the results for the active individuals/variable categories including : \item{coord}{coordinates for the individuals/variable categories} \item{cos2}{cos2 for the individuals/variable categories} \item{contrib}{contributions of the individuals/variable categories} \item{inertia}{inertia of the individuals/variable categories} } \description{ Extract all the results (coordinates, squared cosine and contributions) for the active individuals/variable categories from Multiple Correspondence Analysis (MCA) outputs.\cr\cr \itemize{ \item get_mca(): Extract the results for variables and individuals \item get_mca_ind(): Extract the results for individuals only \item get_mca_var(): Extract the results for variables only } } \examples{ \donttest{ # Multiple Correspondence Analysis # ++++++++++++++++++++++++++++++ # Install and load FactoMineR to compute MCA # install.packages("FactoMineR") library("FactoMineR") data(poison) poison.active <- poison[1:55, 5:15] head(poison.active[, 1:6]) res.mca <- MCA(poison.active, graph=FALSE) # Extract the results for variable categories var <- get_mca_var(res.mca) print(var) head(var$coord) # coordinates of variables head(var$cos2) # cos2 of variables head(var$contrib) # contributions of variables # Extract the results for individuals ind <- get_mca_ind(res.mca) print(ind) head(ind$coord) # coordinates of individuals head(ind$cos2) # cos2 of individuals head(ind$contrib) # contributions of individuals # You can also use the function get_mca() get_mca(res.mca, "ind") # Results for individuals get_mca(res.mca, "var") # Results for variable categories } } \references{ http://www.sthda.com/english/ } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/multishapes.Rd0000644000176200001440000000167413641172644016032 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/multishapes.R \docType{data} \name{multishapes} \alias{multishapes} \title{A dataset containing clusters of multiple shapes} \format{ A data frame with 1100 observations on the following 3 variables. \describe{ \item{\code{x}}{a numeric vector containing the x coordinates of observations} \item{\code{y}}{a numeric vector containing the y coordinates of observations} \item{\code{shape}}{a numeric vector corresponding to the cluster number of each observations.} } } \usage{ data("multishapes") } \description{ Data containing clusters of any shapes. Useful for comparing density-based clustering (DBSCAN) and standard partitioning methods such as k-means clustering. } \details{ The dataset contains 5 clusters and some outliers/noises. } \examples{ \donttest{ data(multishapes) plot(multishapes[,1], multishapes[, 2], col = multishapes[, 3], pch = 19, cex = 0.8) } } factoextra/man/poison.Rd0000644000176200001440000000122613641172644014774 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/poison.R \docType{data} \name{poison} \alias{poison} \title{Poison} \format{ A data frame with 55 rows and 15 columns. } \source{ This data is from FactoMineR package. } \usage{ data("poison") } \description{ This data is a result from a survey carried out on children of primary school who suffered from food poisoning. They were asked about their symptoms and about what they ate. } \examples{ \donttest{ library(FactoMineR) data(poison) res.mca <- MCA(poison, quanti.sup = 1:2, quali.sup = c(3,4), graph = FALSE) fviz_mca_biplot(res.mca, repel = TRUE)+ theme_minimal() } } factoextra/man/fviz_ca.Rd0000644000176200001440000002164413641172644015114 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fviz_ca.R \name{fviz_ca} \alias{fviz_ca} \alias{fviz_ca_row} \alias{fviz_ca_col} \alias{fviz_ca_biplot} \title{Visualize Correspondence Analysis} \usage{ fviz_ca_row( X, axes = c(1, 2), geom = c("point", "text"), geom.row = geom, shape.row = 19, col.row = "blue", alpha.row = 1, col.row.sup = "darkblue", select.row = list(name = NULL, cos2 = NULL, contrib = NULL), map = "symmetric", repel = FALSE, ... ) fviz_ca_col( X, axes = c(1, 2), shape.col = 17, geom = c("point", "text"), geom.col = geom, col.col = "red", col.col.sup = "darkred", alpha.col = 1, select.col = list(name = NULL, cos2 = NULL, contrib = NULL), map = "symmetric", repel = FALSE, ... ) fviz_ca_biplot( X, axes = c(1, 2), geom = c("point", "text"), geom.row = geom, geom.col = geom, label = "all", invisible = "none", arrows = c(FALSE, FALSE), repel = FALSE, title = "CA - Biplot", ... ) fviz_ca(X, ...) } \arguments{ \item{X}{an object of class CA [FactoMineR], ca [ca], coa [ade4]; correspondence [MASS] and expOutput/epCA [ExPosition].} \item{axes}{a numeric vector of length 2 specifying the dimensions to be plotted.} \item{geom}{a character specifying the geometry to be used for the graph. Allowed values are the combination of c("point", "arrow", "text"). Use "point" (to show only points); "text" to show only labels; c("point", "text") or c("arrow", "text") to show both types.} \item{geom.row, geom.col}{as \code{geom} but for row and column elements, respectively. Default is geom.row = c("point", "text), geom.col = c("point", "text").} \item{shape.row, shape.col}{the point shapes to be used for row/column variables. Default values are 19 for rows and 17 for columns.} \item{map}{character string specifying the map type. Allowed options include: "symmetric", "rowprincipal", "colprincipal", "symbiplot", "rowgab", "colgab", "rowgreen" and "colgreen". See details} \item{repel}{a boolean, whether to use ggrepel to avoid overplotting text labels or not.} \item{...}{Additional arguments. \itemize{ \item in fviz_ca_row() and fviz_ca_col(): Additional arguments are passed to the functions fviz() and ggpubr::ggpar(). \item in fviz_ca_biplot() and fviz_ca(): Additional arguments are passed to fviz_ca_row() and fviz_ca_col().}} \item{col.col, col.row}{color for column/row points. The default values are "red" and "blue", respectively. Can be a continuous variable or a factor variable. Allowed values include also : "cos2", "contrib", "coord", "x" or "y". In this case, the colors for row/column variables are automatically controlled by their qualities ("cos2"), contributions ("contrib"), coordinates (x^2 + y^2, "coord"), x values("x") or y values("y")} \item{col.col.sup, col.row.sup}{colors for the supplementary column and row points, respectively.} \item{alpha.col, alpha.row}{controls the transparency of colors. The value can variate from 0 (total transparency) to 1 (no transparency). Default value is 1. Allowed values include also : "cos2", "contrib", "coord", "x" or "y" as for the arguments col.col and col.row.} \item{select.col, select.row}{a selection of columns/rows to be drawn. Allowed values are NULL or a list containing the arguments name, cos2 or contrib: \itemize{ \item name is a character vector containing column/row names to be drawn \item cos2 if cos2 is in [0, 1], ex: 0.6, then columns/rows with a cos2 > 0.6 are drawn. if cos2 > 1, ex: 5, then the top 5 columns/rows with the highest cos2 are drawn. \item contrib if contrib > 1, ex: 5, then the top 5 columns/rows with the highest contrib are drawn }} \item{label}{a character vector specifying the elements to be labelled. Default value is "all". Allowed values are "none" or the combination of c("row", "row.sup", "col", "col.sup"). Use "col" to label only active column variables; "col.sup" to label only supplementary columns; etc} \item{invisible}{a character value specifying the elements to be hidden on the plot. Default value is "none". Allowed values are the combination of c("row", "row.sup","col", "col.sup").} \item{arrows}{Vector of two logicals specifying if the plot should contain points (FALSE, default) or arrows (TRUE). First value sets the rows and the second value sets the columns.} \item{title}{the title of the graph} } \value{ a ggplot } \description{ Correspondence analysis (CA) is an extension of Principal Component Analysis (PCA) suited to analyze frequencies formed by two categorical variables. fviz_ca() provides ggplot2-based elegant visualization of CA outputs from the R functions: CA [in FactoMineR], ca [in ca], coa [in ade4], correspondence [in MASS] and expOutput/epCA [in ExPosition]. Read more: \href{http://www.sthda.com/english/wiki/correspondence-analysis-in-r-the-ultimate-guide-for-the-analysis-the-visualization-and-the-interpretation-r-software-and-data-mining}{Correspondence Analysis} \itemize{ \item{fviz_ca_row(): Graph of row variables} \item{fviz_ca_col(): Graph of column variables} \item{fviz_ca_biplot(): Biplot of row and column variables} \item{fviz_ca(): An alias of fviz_ca_biplot()} } } \details{ The default plot of (M)CA is a "symmetric" plot in which both rows and columns are in principal coordinates. In this situation, it's not possible to interpret the distance between row points and column points. To overcome this problem, the simplest way is to make an asymmetric plot. This means that, the column profiles must be presented in row space or vice-versa. The allowed options for the argument map are: \itemize{ \item "rowprincipal" or "colprincipal": asymmetric plots with either rows in principal coordinates and columns in standard coordinates, or vice versa. These plots preserve row metric or column metric respectively. \item "symbiplot": Both rows and columns are scaled to have variances equal to the singular values (square roots of eigenvalues), which gives a symmetric biplot but does not preserve row or column metrics. \item "rowgab" or "colgab": Asymmetric maps, proposed by Gabriel & Odoroff (1990), with rows (respectively, columns) in principal coordinates and columns (respectively, rows) in standard coordinates multiplied by the mass of the corresponding point. \item "rowgreen" or "colgreen": The so-called contribution biplots showing visually the most contributing points (Greenacre 2006b). These are similar to "rowgab" and "colgab" except that the points in standard coordinates are multiplied by the square root of the corresponding masses, giving reconstructions of the standardized residuals. } } \examples{ # Correspondence Analysis # ++++++++++++++++++++++++++++++ # Install and load FactoMineR to compute CA # install.packages("FactoMineR") library("FactoMineR") data(housetasks) head(housetasks) res.ca <- CA(housetasks, graph=FALSE) # Biplot of rows and columns # ++++++++++++++++++++++++++ # Symetric Biplot of rows and columns fviz_ca_biplot(res.ca) # Asymetric biplot, use arrows for columns fviz_ca_biplot(res.ca, map ="rowprincipal", arrow = c(FALSE, TRUE)) # Keep only the labels for row points fviz_ca_biplot(res.ca, label ="row") # Keep only labels for column points fviz_ca_biplot(res.ca, label ="col") # Select the top 7 contributing rows # And the top 3 columns fviz_ca_biplot(res.ca, select.row = list(contrib = 7), select.col = list(contrib = 3)) # Graph of row variables # +++++++++++++++++++++ # Control automatically the color of row points # using the "cos2" or the contributions "contrib" # cos2 = the quality of the rows on the factor map # Change gradient color # Use repel = TRUE to avoid overplotting (slow if many points) fviz_ca_row(res.ca, col.row = "cos2", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE) # You can also control the transparency # of the color by the "cos2" or "contrib" fviz_ca_row(res.ca, alpha.row="contrib") # Select and visualize some rows with select.row argument. # - Rows with cos2 >= 0.5: select.row = list(cos2 = 0.5) # - Top 7 rows according to the cos2: select.row = list(cos2 = 7) # - Top 7 contributing rows: select.row = list(contrib = 7) # - Select rows by names: select.row = list(name = c("Breakfeast", "Repairs", "Holidays")) # Example: Select the top 7 contributing rows fviz_ca_row(res.ca, select.row = list(contrib = 7)) # Graph of column points # ++++++++++++++++++++++++++++ # Control colors using their contributions fviz_ca_col(res.ca, col.col = "contrib", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07")) # Select columns with select.col argument # You can select by contrib, cos2 and name # as previously described for ind # Select the top 3 contributing columns fviz_ca_col(res.ca, select.col = list(contrib = 3)) } \references{ http://www.sthda.com } \seealso{ \code{\link{get_ca}}, \code{\link{fviz_pca}}, \code{\link{fviz_mca}} } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/hkmeans.Rd0000644000176200001440000000624713641172644015123 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hkmeans.R \name{hkmeans} \alias{hkmeans} \alias{print.hkmeans} \alias{hkmeans_tree} \title{Hierarchical k-means clustering} \usage{ hkmeans( x, k, hc.metric = "euclidean", hc.method = "ward.D2", iter.max = 10, km.algorithm = "Hartigan-Wong" ) \method{print}{hkmeans}(x, ...) hkmeans_tree(hkmeans, rect.col = NULL, ...) } \arguments{ \item{x}{a numeric matrix, data frame or vector} \item{k}{the number of clusters to be generated} \item{hc.metric}{the distance measure to be used. Possible values are "euclidean", "maximum", "manhattan", "canberra", "binary" or "minkowski" (see ?dist).} \item{hc.method}{the agglomeration method to be used. Possible values include "ward.D", "ward.D2", "single", "complete", "average", "mcquitty", "median"or "centroid" (see ?hclust).} \item{iter.max}{the maximum number of iterations allowed for k-means.} \item{km.algorithm}{the algorithm to be used for kmeans (see ?kmeans).} \item{...}{others arguments to be passed to the function plot.hclust(); (see ? plot.hclust)} \item{hkmeans}{an object of class hkmeans (returned by the function hkmeans())} \item{rect.col}{Vector with border colors for the rectangles around clusters in dendrogram} } \value{ hkmeans returns an object of class "hkmeans" containing the following components: \itemize{ \item The elements returned by the standard function kmeans() (see ?kmeans) \item data: the data used for the analysis \item hclust: an object of class "hclust" generated by the function hclust() } } \description{ The final k-means clustering solution is very sensitive to the initial random selection of cluster centers. This function provides a solution using an hybrid approach by combining the hierarchical clustering and the k-means methods. The procedure is explained in "Details" section. Read more: \href{http://www.sthda.com/english/wiki/hybrid-hierarchical-k-means-clustering-for-optimizing-clustering-outputs-unsupervised-machine-learning}{Hybrid hierarchical k-means clustering for optimizing clustering outputs}. \itemize{ \item hkmeans(): compute hierarchical k-means clustering \item print.hkmeans(): prints the result of hkmeans \item hkmeans_tree(): plots the initial dendrogram } } \details{ The procedure is as follow: 1. Compute hierarchical clustering 2. Cut the tree in k-clusters 3. compute the center (i.e the mean) of each cluster 4. Do k-means by using the set of cluster centers (defined in step 3) as the initial cluster centers. Optimize the clustering. This means that the final optimized partitioning obtained at step 4 might be different from the initial partitioning obtained at step 2. Consider mainly the result displayed by \code{fviz_cluster()}. } \examples{ \donttest{ # Load data data(USArrests) # Scale the data df <- scale(USArrests) # Compute hierarchical k-means clustering res.hk <-hkmeans(df, 4) # Elements returned by hkmeans() names(res.hk) # Print the results res.hk # Visualize the tree hkmeans_tree(res.hk, cex = 0.6) # or use this fviz_dend(res.hk, cex = 0.6) # Visualize the hkmeans final clusters fviz_cluster(res.hk, frame.type = "norm", frame.level = 0.68) } } factoextra/man/fviz_mclust.Rd0000644000176200001440000000621113641172644016031 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fviz_mclust.R \name{fviz_mclust} \alias{fviz_mclust} \alias{fviz_mclust_bic} \title{Plot Model-Based Clustering Results using ggplot2} \usage{ fviz_mclust( object, what = c("classification", "uncertainty", "BIC"), ellipse.type = "norm", ellipse.level = 0.4, ggtheme = theme_classic(), ... ) fviz_mclust_bic( object, model.names = NULL, shape = 19, color = "model", palette = NULL, legend = NULL, main = "Model selection", xlab = "Number of components", ylab = "BIC", ... ) } \arguments{ \item{object}{an object of class Mclust} \item{what}{choose from one of the following three options: "classification" (default), "uncertainty" and "BIC".} \item{ellipse.type}{Character specifying frame type. Possible values are 'convex', 'confidence' or types supported by \code{\link[ggplot2]{stat_ellipse}} including one of c("t", "norm", "euclid").} \item{ellipse.level}{the size of the concentration ellipse in normal probability. Passed for \code{ggplot2::stat_ellipse} 's level. Ignored in 'convex'. Default value is 0.95.} \item{ggtheme}{function, ggplot2 theme name. Default value is theme_pubr(). Allowed values include ggplot2 official themes: theme_gray(), theme_bw(), theme_minimal(), theme_classic(), theme_void(), ....} \item{...}{other arguments to be passed to the functions \link{fviz_cluster} and \link[ggpubr]{ggpar}.} \item{model.names}{one or more model names corresponding to models fit in object. The default is to plot the BIC for all of the models fit.} \item{shape}{point shape. To change point shape by model names use shape = "model".} \item{color}{point and line color.} \item{palette}{the color palette to be used for coloring or filling by groups. Allowed values include "grey" for grey color palettes; brewer palettes e.g. "RdBu", "Blues", ...; or custom color palette e.g. c("blue", "red"); and scientific journal palettes from ggsci R package, e.g.: "npg", "aaas", "lancet", "jco", "ucscgb", "uchicago", "simpsons" and "rickandmorty". Can be also a numeric vector of length(groups); in this case a basic color palette is created using the function \link[grDevices]{palette}.} \item{legend}{character specifying legend position. Allowed values are one of c("top", "bottom", "left", "right", "none"). To remove the legend use legend = "none". Legend position can be also specified using a numeric vector c(x, y); see details section.} \item{main}{plot main title.} \item{xlab}{character vector specifying x axis labels. Use xlab = FALSE to hide xlab.} \item{ylab}{character vector specifying y axis labels. Use ylab = FALSE to hide ylab.} } \description{ Plots the classification, the uncertainty and the BIC values returned by the Mclust() function. } \section{Functions}{ \itemize{ \item \code{fviz_mclust}: Plots classification and uncertainty. \item \code{fviz_mclust_bic}: Plots the BIC values. }} \examples{ if(require("mclust")){ # Compute model-based-clustering require("mclust") data("diabetes") mc <- Mclust(diabetes[, -1]) # Visaulize BIC values fviz_mclust_bic(mc) # Visualize classification fviz_mclust(mc, "classification", geom = "point") } } factoextra/man/fviz_silhouette.Rd0000644000176200001440000000574413144620014016704 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fviz_silhouette.R \name{fviz_silhouette} \alias{fviz_silhouette} \title{Visualize Silhouette Information from Clustering} \usage{ fviz_silhouette(sil.obj, label = FALSE, print.summary = TRUE, ...) } \arguments{ \item{sil.obj}{an object of class silhouette: pam, clara, fanny [in cluster package]; eclust and hcut [in factoextra].} \item{label}{logical value. If true, x axis tick labels are shown} \item{print.summary}{logical value. If true a summary of cluster silhouettes are printed in fviz_silhouette().} \item{...}{other arguments to be passed to the function ggpubr::ggpar().} } \value{ return a ggplot } \description{ Silhouette (Si) analysis is a cluster validation approach that measures how well an observation is clustered and it estimates the average distance between clusters. fviz_silhouette() provides ggplot2-based elegant visualization of silhouette information from i) the result of \code{\link[cluster]{silhouette}}(), \code{\link[cluster]{pam}}(), \code{\link[cluster]{clara}}() and \code{\link[cluster]{fanny}}() [in cluster package]; ii) \code{\link{eclust}}() and \code{\link{hcut}}() [in factoextra]. Read more: \href{http://www.sthda.com/english/wiki/clustering-validation-statistics-4-vital-things-everyone-should-know-unsupervised-machine-learning}{Clustering Validation Statistics}. } \details{ - Observations with a large silhouhette Si (almost 1) are very well clustered. - A small Si (around 0) means that the observation lies between two clusters. - Observations with a negative Si are probably placed in the wrong cluster. } \examples{ set.seed(123) # Data preparation # +++++++++++++++ data("iris") head(iris) # Remove species column (5) and scale the data iris.scaled <- scale(iris[, -5]) # K-means clustering # +++++++++++++++++++++ km.res <- kmeans(iris.scaled, 3, nstart = 2) # Visualize kmeans clustering fviz_cluster(km.res, iris[, -5], ellipse.type = "norm")+ theme_minimal() # Visualize silhouhette information require("cluster") sil <- silhouette(km.res$cluster, dist(iris.scaled)) fviz_silhouette(sil) # Identify observation with negative silhouette neg_sil_index <- which(sil[, "sil_width"] < 0) sil[neg_sil_index, , drop = FALSE] \dontrun{ # PAM clustering # ++++++++++++++++++++ require(cluster) pam.res <- pam(iris.scaled, 3) # Visualize pam clustering fviz_cluster(pam.res, ellipse.type = "norm")+ theme_minimal() # Visualize silhouhette information fviz_silhouette(pam.res) # Hierarchical clustering # ++++++++++++++++++++++++ # Use hcut() which compute hclust and cut the tree hc.cut <- hcut(iris.scaled, k = 3, hc_method = "complete") # Visualize dendrogram fviz_dend(hc.cut, show_labels = FALSE, rect = TRUE) # Visualize silhouhette information fviz_silhouette(hc.cut) } } \seealso{ \code{\link{fviz_cluster}}, \code{\link{hcut}}, \code{\link{hkmeans}}, \code{\link{eclust}}, \code{\link{fviz_dend}} } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/fviz_mca.Rd0000644000176200001440000002617013641172644015270 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fviz_mca.R \name{fviz_mca} \alias{fviz_mca} \alias{fviz_mca_ind} \alias{fviz_mca_var} \alias{fviz_mca_biplot} \title{Visualize Multiple Correspondence Analysis} \usage{ fviz_mca_ind( X, axes = c(1, 2), geom = c("point", "text"), geom.ind = geom, repel = FALSE, habillage = "none", palette = NULL, addEllipses = FALSE, col.ind = "blue", col.ind.sup = "darkblue", alpha.ind = 1, shape.ind = 19, map = "symmetric", select.ind = list(name = NULL, cos2 = NULL, contrib = NULL), ... ) fviz_mca_var( X, choice = c("var.cat", "mca.cor", "var", "quanti.sup"), axes = c(1, 2), geom = c("point", "text"), geom.var = geom, repel = FALSE, col.var = "red", alpha.var = 1, shape.var = 17, col.quanti.sup = "blue", col.quali.sup = "darkgreen", map = "symmetric", select.var = list(name = NULL, cos2 = NULL, contrib = NULL), ... ) fviz_mca_biplot( X, axes = c(1, 2), geom = c("point", "text"), geom.ind = geom, geom.var = geom, repel = FALSE, label = "all", invisible = "none", habillage = "none", addEllipses = FALSE, palette = NULL, arrows = c(FALSE, FALSE), map = "symmetric", title = "MCA - Biplot", ... ) fviz_mca(X, ...) } \arguments{ \item{X}{an object of class MCA [FactoMineR], acm [ade4] and expOutput/epMCA [ExPosition].} \item{axes}{a numeric vector of length 2 specifying the dimensions to be plotted.} \item{geom}{a text specifying the geometry to be used for the graph. Allowed values are the combination of \code{c("point", "arrow", "text")}. Use \code{"point"} (to show only points); \code{"text"} to show only labels; \code{c("point", "text")} or \code{c("arrow", "text")} to show arrows and texts. Using \code{c("arrow", "text")} is sensible only for the graph of variables.} \item{geom.ind, geom.var}{as \code{geom} but for individuals and variables, respectively. Default is geom.ind = c("point", "text), geom.var = c("point", "text").} \item{repel}{a boolean, whether to use ggrepel to avoid overplotting text labels or not.} \item{habillage}{an optional factor variable for coloring the observations by groups. Default value is "none". If X is an MCA object from FactoMineR package, habillage can also specify the index of the factor variable in the data.} \item{palette}{the color palette to be used for coloring or filling by groups. Allowed values include "grey" for grey color palettes; brewer palettes e.g. "RdBu", "Blues", ...; or custom color palette e.g. c("blue", "red"); and scientific journal palettes from ggsci R package, e.g.: "npg", "aaas", "lancet", "jco", "ucscgb", "uchicago", "simpsons" and "rickandmorty". Can be also a numeric vector of length(groups); in this case a basic color palette is created using the function \link[grDevices]{palette}.} \item{addEllipses}{logical value. If TRUE, draws ellipses around the individuals when habillage != "none".} \item{col.ind, col.var}{color for individuals and variables, respectively. Can be a continuous variable or a factor variable. Possible values include also : "cos2", "contrib", "coord", "x" or "y". In this case, the colors for individuals/variables are automatically controlled by their qualities ("cos2"), contributions ("contrib"), coordinates (x^2 + y^2 , "coord"), x values("x") or y values("y"). To use automatic coloring (by cos2, contrib, ....), make sure that habillage ="none".} \item{col.ind.sup}{color for supplementary individuals} \item{alpha.ind, alpha.var}{controls the transparency of individual and variable colors, respectively. The value can variate from 0 (total transparency) to 1 (no transparency). Default value is 1. Possible values include also : "cos2", "contrib", "coord", "x" or "y". In this case, the transparency for individual/variable colors are automatically controlled by their qualities ("cos2"), contributions ("contrib"), coordinates (x^2 + y^2 , "coord"), x values("x") or y values("y"). To use this, make sure that habillage ="none".} \item{shape.ind, shape.var}{point shapes of individuals and variables.} \item{map}{character string specifying the map type. Allowed options include: "symmetric", "rowprincipal", "colprincipal", "symbiplot", "rowgab", "colgab", "rowgreen" and "colgreen". See details} \item{select.ind, select.var}{a selection of individuals/variables to be drawn. Allowed values are NULL or a list containing the arguments name, cos2 or contrib: \itemize{ \item name is a character vector containing individuals/variables to be drawn \item cos2 if cos2 is in [0, 1], ex: 0.6, then individuals/variables with a cos2 > 0.6 are drawn. if cos2 > 1, ex: 5, then the top 5 individuals/variables with the highest cos2 are drawn. \item contrib if contrib > 1, ex: 5, then the top 5 individuals/variables with the highest contrib are drawn }} \item{...}{Additional arguments. \itemize{ \item in fviz_mca_ind(), fviz_mca_var() and fviz_mca_cor(): Additional arguments are passed to the functions fviz() and ggpubr::ggpar(). \item in fviz_mca_biplot() and fviz_mca(): Additional arguments are passed to fviz_mca_ind() and fviz_mca_var().}} \item{choice}{the graph to plot. Allowed values include: i) "var" and "mca.cor" for plotting the correlation between variables and principal dimensions; ii) "var.cat" for variable categories and iii) "quanti.sup" for the supplementary quantitative variables.} \item{col.quanti.sup, col.quali.sup}{a color for the quantitative/qualitative supplementary variables.} \item{label}{a text specifying the elements to be labelled. Default value is "all". Allowed values are "none" or the combination of c("ind", "ind.sup","var", "quali.sup", "quanti.sup"). "ind" can be used to label only active individuals. "ind.sup" is for supplementary individuals. "var" is for active variable categories. "quali.sup" is for supplementary qualitative variable categories. "quanti.sup" is for quantitative supplementary variables.} \item{invisible}{a text specifying the elements to be hidden on the plot. Default value is "none". Allowed values are the combination of c("ind", "ind.sup","var", "quali.sup", "quanti.sup").} \item{arrows}{Vector of two logicals specifying if the plot should contain points (FALSE, default) or arrows (TRUE). First value sets the rows and the second value sets the columns.} \item{title}{the title of the graph} } \value{ a ggplot } \description{ Multiple Correspondence Analysis (MCA) is an extension of simple CA to analyse a data table containing more than two categorical variables. fviz_mca() provides ggplot2-based elegant visualization of MCA outputs from the R functions: MCA [in FactoMineR], acm [in ade4], and expOutput/epMCA [in ExPosition]. Read more: \href{http://www.sthda.com/english/wiki/multiple-correspondence-analysis-essentials-interpretation-and-application-to-investigate-the-associations-between-categories-of-multiple-qualitative-variables-r-software-and-data-mining}{Multiple Correspondence Analysis Essentials.} \itemize{ \item{fviz_mca_ind(): Graph of individuals} \item{fviz_mca_var(): Graph of variables} \item{fviz_mca_biplot(): Biplot of individuals and variables} \item{fviz_mca(): An alias of fviz_mca_biplot()}} } \details{ The default plot of MCA is a "symmetric" plot in which both rows and columns are in principal coordinates. In this situation, it's not possible to interpret the distance between row points and column points. To overcome this problem, the simplest way is to make an asymmetric plot. The argument "map" can be used to change the plot type. For more explanation, read the details section of fviz_ca documentation. } \examples{ # Multiple Correspondence Analysis # ++++++++++++++++++++++++++++++ # Install and load FactoMineR to compute MCA # install.packages("FactoMineR") library("FactoMineR") data(poison) poison.active <- poison[1:55, 5:15] head(poison.active) res.mca <- MCA(poison.active, graph=FALSE) # Graph of individuals # +++++++++++++++++++++ # Default Plot # Color of individuals: col.ind = "steelblue" fviz_mca_ind(res.mca, col.ind = "steelblue") # 1. Control automatically the color of individuals # using the "cos2" or the contributions "contrib" # cos2 = the quality of the individuals on the factor map # 2. To keep only point or text use geom = "point" or geom = "text". # 3. Change themes: http://www.sthda.com/english/wiki/ggplot2-themes fviz_mca_ind(res.mca, col.ind = "cos2", repel = TRUE) \dontrun{ # You can also control the transparency # of the color by the cos2 fviz_mca_ind(res.mca, alpha.ind="cos2") } # Color individuals by groups, add concentration ellipses # Remove labels: label = "none". grp <- as.factor(poison.active[, "Vomiting"]) p <- fviz_mca_ind(res.mca, label="none", habillage=grp, addEllipses=TRUE, ellipse.level=0.95) print(p) # Change group colors using RColorBrewer color palettes # Read more: http://www.sthda.com/english/wiki/ggplot2-colors p + scale_color_brewer(palette="Dark2") + scale_fill_brewer(palette="Dark2") # Change group colors manually # Read more: http://www.sthda.com/english/wiki/ggplot2-colors p + scale_color_manual(values=c("#999999", "#E69F00"))+ scale_fill_manual(values=c("#999999", "#E69F00")) # Select and visualize some individuals (ind) with select.ind argument. # - ind with cos2 >= 0.4: select.ind = list(cos2 = 0.4) # - Top 20 ind according to the cos2: select.ind = list(cos2 = 20) # - Top 20 contributing individuals: select.ind = list(contrib = 20) # - Select ind by names: select.ind = list(name = c("44", "38", "53", "39") ) # Example: Select the top 40 according to the cos2 fviz_mca_ind(res.mca, select.ind = list(cos2 = 20)) # Graph of variable categories # ++++++++++++++++++++++++++++ # Default plot: use repel = TRUE to avoid overplotting fviz_mca_var(res.mca, col.var = "#FC4E07") # Control variable colors using their contributions # use repel = TRUE to avoid overplotting fviz_mca_var(res.mca, col.var = "contrib", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07")) # Biplot # ++++++++++++++++++++++++++ grp <- as.factor(poison.active[, "Vomiting"]) fviz_mca_biplot(res.mca, repel = TRUE, col.var = "#E7B800", habillage = grp, addEllipses = TRUE, ellipse.level = 0.95) \dontrun{ # Keep only the labels for variable categories: fviz_mca_biplot(res.mca, label ="var") # Keep only labels for individuals fviz_mca_biplot(res.mca, label ="ind") # Hide variable categories fviz_mca_biplot(res.mca, invisible ="var") # Hide individuals fviz_mca_biplot(res.mca, invisible ="ind") # Control automatically the color of individuals using the cos2 fviz_mca_biplot(res.mca, label ="var", col.ind="cos2") # Change the color by groups, add ellipses fviz_mca_biplot(res.mca, label="var", col.var ="blue", habillage=grp, addEllipses=TRUE, ellipse.level=0.95) # Select the top 30 contributing individuals # And the top 10 variables fviz_mca_biplot(res.mca, select.ind = list(contrib = 30), select.var = list(contrib = 10)) } } \seealso{ \code{\link{get_mca}}, \code{\link{fviz_pca}}, \code{\link{fviz_ca}}, \code{\link{fviz_mfa}}, \code{\link{fviz_hmfa}} } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/fviz_famd.Rd0000644000176200001440000001305513641172644015435 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fviz_famd.R \name{fviz_famd} \alias{fviz_famd} \alias{fviz_famd_ind} \alias{fviz_famd_var} \title{Visualize Factor Analysis of Mixed Data} \usage{ fviz_famd_ind( X, axes = c(1, 2), geom = c("point", "text"), repel = FALSE, habillage = "none", palette = NULL, addEllipses = FALSE, col.ind = "blue", col.ind.sup = "darkblue", alpha.ind = 1, shape.ind = 19, col.quali.var = "black", select.ind = list(name = NULL, cos2 = NULL, contrib = NULL), gradient.cols = NULL, ... ) fviz_famd_var( X, choice = c("var", "quanti.var", "quali.var"), axes = c(1, 2), geom = c("point", "text"), repel = FALSE, col.var = "red", alpha.var = 1, shape.var = 17, col.var.sup = "darkgreen", select.var = list(name = NULL, cos2 = NULL, contrib = NULL), ... ) fviz_famd(X, ...) } \arguments{ \item{X}{an object of class FAMD [FactoMineR].} \item{axes}{a numeric vector of length 2 specifying the dimensions to be plotted.} \item{geom}{a text specifying the geometry to be used for the graph. Allowed values are the combination of \code{c("point", "arrow", "text")}. Use \code{"point"} (to show only points); \code{"text"} to show only labels; \code{c("point", "text")} or \code{c("arrow", "text")} to show arrows and texts. Using \code{c("arrow", "text")} is sensible only for the graph of variables.} \item{repel}{a boolean, whether to use ggrepel to avoid overplotting text labels or not.} \item{habillage}{an optional factor variable for coloring the observations by groups. Default value is "none". If X is an MFA object from FactoMineR package, habillage can also specify the index of the factor variable in the data.} \item{palette}{the color palette to be used for coloring or filling by groups. Allowed values include "grey" for grey color palettes; brewer palettes e.g. "RdBu", "Blues", ...; or custom color palette e.g. c("blue", "red"); and scientific journal palettes from ggsci R package, e.g.: "npg", "aaas", "lancet", "jco", "ucscgb", "uchicago", "simpsons" and "rickandmorty". Can be also a numeric vector of length(groups); in this case a basic color palette is created using the function \link[grDevices]{palette}.} \item{addEllipses}{logical value. If TRUE, draws ellipses around the individuals when habillage != "none".} \item{col.ind, col.var}{color for individuals and variables, respectively. Can be a continuous variable or a factor variable. Possible values include also : "cos2", "contrib", "coord", "x" or "y". In this case, the colors for individuals/variables are automatically controlled by their qualities ("cos2"), contributions ("contrib"), coordinates (x^2 + y^2 , "coord"), x values("x") or y values("y"). To use automatic coloring (by cos2, contrib, ....), make sure that habillage ="none".} \item{col.ind.sup}{color for supplementary individuals} \item{alpha.ind, alpha.var}{controls the transparency of individuals and variables, respectively. The value can variate from 0 (total transparency) to 1 (no transparency). Default value is 1. Possible values include also : "cos2", "contrib", "coord", "x" or "y". In this case, the transparency for individual/variable colors are automatically controlled by their qualities ("cos2"), contributions ("contrib"), coordinates (x^2 + y^2 , "coord"), x values("x") or y values("y"). To use this, make sure that habillage ="none".} \item{shape.ind, shape.var}{point shapes of individuals, variables, groups and axes} \item{col.quali.var}{color for qualitative variables in fviz_mfa_ind(). Default is "black".} \item{select.ind, select.var}{a selection of individuals and variables to be drawn. Allowed values are NULL or a list containing the arguments name, cos2 or contrib: \itemize{ \item name is a character vector containing individuals/variables to be drawn \item cos2 if cos2 is in [0, 1], ex: 0.6, then individuals/variables with a cos2 > 0.6 are drawn. if cos2 > 1, ex: 5, then the top 5 individuals/variables with the highest cos2 are drawn. \item contrib if contrib > 1, ex: 5, then the top 5 individuals/variables with the highest cos2 are drawn }} \item{gradient.cols}{vector of colors to use for n-colour gradient. Allowed values include brewer and ggsci color palettes.} \item{...}{Arguments to be passed to the function fviz()} \item{choice}{The graph to plot inf fviz_mfa_var(). Allowed values include one of c("var", quanti.var", "quali.var").} \item{col.var.sup}{color for supplementary variables.} } \value{ a ggplot } \description{ Factor analysis of mixed data (FAMD) is, a particular case of MFA, used to analyze a data set containing both quantitative and qualitative variables. fviz_famd() provides ggplot2-based elegant visualization of FAMD outputs from the R function: FAMD [FactoMineR].\cr\cr \itemize{ \item{fviz_famd_ind(): Graph of individuals} \item{fviz_famd_var(): Graph of variables} \item{fviz_famd(): An alias of fviz_famd_ind(res.famd)} } } \examples{ # Compute FAMD library("FactoMineR") data(wine) res.famd <- FAMD(wine[,c(1,2, 16, 22, 29, 28, 30,31)], graph = FALSE) # Eigenvalues/variances of dimensions fviz_screeplot(res.famd) # Graph of variables fviz_famd_var(res.famd) # Quantitative variables fviz_famd_var(res.famd, "quanti.var", repel = TRUE, col.var = "black") # Qualitative variables fviz_famd_var(res.famd, "quali.var", col.var = "black") # Graph of individuals colored by cos2 fviz_famd_ind(res.famd, col.ind = "cos2", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE) } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/fviz_cluster.Rd0000644000176200001440000001160213641172644016203 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fviz_cluster.R \name{fviz_cluster} \alias{fviz_cluster} \title{Visualize Clustering Results} \usage{ fviz_cluster( object, data = NULL, choose.vars = NULL, stand = TRUE, axes = c(1, 2), geom = c("point", "text"), repel = FALSE, show.clust.cent = TRUE, ellipse = TRUE, ellipse.type = "convex", ellipse.level = 0.95, ellipse.alpha = 0.2, shape = NULL, pointsize = 1.5, labelsize = 12, main = "Cluster plot", xlab = NULL, ylab = NULL, outlier.color = "black", outlier.shape = 19, outlier.pointsize = pointsize, outlier.labelsize = labelsize, ggtheme = theme_grey(), ... ) } \arguments{ \item{object}{an object of class "partition" created by the functions pam(), clara() or fanny() in cluster package; "kmeans" [in stats package]; "dbscan" [in fpc package]; "Mclust" [in mclust]; "hkmeans", "eclust" [in factoextra]. Possible value are also any list object with data and cluster components (e.g.: object = list(data = mydata, cluster = myclust)).} \item{data}{the data that has been used for clustering. Required only when object is a class of kmeans or dbscan.} \item{choose.vars}{a character vector containing variables to be considered for plotting.} \item{stand}{logical value; if TRUE, data is standardized before principal component analysis} \item{axes}{a numeric vector of length 2 specifying the dimensions to be plotted.} \item{geom}{a text specifying the geometry to be used for the graph. Allowed values are the combination of c("point", "text"). Use "point" (to show only points); "text" to show only labels; c("point", "text") to show both types.} \item{repel}{a boolean, whether to use ggrepel to avoid overplotting text labels or not.} \item{show.clust.cent}{logical; if TRUE, shows cluster centers} \item{ellipse}{logical value; if TRUE, draws outline around points of each cluster} \item{ellipse.type}{Character specifying frame type. Possible values are 'convex', 'confidence' or types supported by \code{\link[ggplot2]{stat_ellipse}} including one of c("t", "norm", "euclid").} \item{ellipse.level}{the size of the concentration ellipse in normal probability. Passed for \code{ggplot2::stat_ellipse} 's level. Ignored in 'convex'. Default value is 0.95.} \item{ellipse.alpha}{Alpha for frame specifying the transparency level of fill color. Use alpha = 0 for no fill color.} \item{shape}{the shape of points.} \item{pointsize}{the size of points} \item{labelsize}{font size for the labels} \item{main}{plot main title.} \item{xlab, ylab}{character vector specifying x and y axis labels, respectively. Use xlab = FALSE and ylab = FALSE to hide xlab and ylab, respectively.} \item{outlier.pointsize, outlier.color, outlier.shape, outlier.labelsize}{arguments for customizing outliers, which can be detected only in DBSCAN clustering.} \item{ggtheme}{function, ggplot2 theme name. Default value is theme_pubr(). Allowed values include ggplot2 official themes: theme_gray(), theme_bw(), theme_minimal(), theme_classic(), theme_void(), ....} \item{...}{other arguments to be passed to the functions \code{\link[ggpubr]{ggscatter}} and \code{\link[ggpubr]{ggpar}}.} } \value{ return a ggpplot. } \description{ Provides ggplot2-based elegant visualization of partitioning methods including kmeans [stats package]; pam, clara and fanny [cluster package]; dbscan [fpc package]; Mclust [mclust package]; HCPC [FactoMineR]; hkmeans [factoextra]. Observations are represented by points in the plot, using principal components if ncol(data) > 2. An ellipse is drawn around each cluster. } \examples{ set.seed(123) # Data preparation # +++++++++++++++ data("iris") head(iris) # Remove species column (5) and scale the data iris.scaled <- scale(iris[, -5]) # K-means clustering # +++++++++++++++++++++ km.res <- kmeans(iris.scaled, 3, nstart = 10) # Visualize kmeans clustering # use repel = TRUE to avoid overplotting fviz_cluster(km.res, iris[, -5], ellipse.type = "norm") # Change the color palette and theme fviz_cluster(km.res, iris[, -5], palette = "Set2", ggtheme = theme_minimal()) \dontrun{ # Show points only fviz_cluster(km.res, iris[, -5], geom = "point") # Show text only fviz_cluster(km.res, iris[, -5], geom = "text") # PAM clustering # ++++++++++++++++++++ require(cluster) pam.res <- pam(iris.scaled, 3) # Visualize pam clustering fviz_cluster(pam.res, geom = "point", ellipse.type = "norm") # Hierarchical clustering # ++++++++++++++++++++++++ # Use hcut() which compute hclust and cut the tree hc.cut <- hcut(iris.scaled, k = 3, hc_method = "complete") # Visualize dendrogram fviz_dend(hc.cut, show_labels = FALSE, rect = TRUE) # Visualize cluster fviz_cluster(hc.cut, ellipse.type = "convex") } } \seealso{ \code{\link{fviz_silhouette}}, \code{\link{hcut}}, \code{\link{hkmeans}}, \code{\link{eclust}}, \code{\link{fviz_dend}} } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/fviz_contrib.Rd0000644000176200001440000001134513641172644016166 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fviz_contrib.R \name{fviz_contrib} \alias{fviz_contrib} \alias{fviz_pca_contrib} \title{Visualize the contributions of row/column elements} \usage{ fviz_contrib( X, choice = c("row", "col", "var", "ind", "quanti.var", "quali.var", "group", "partial.axes"), axes = 1, fill = "steelblue", color = "steelblue", sort.val = c("desc", "asc", "none"), top = Inf, xtickslab.rt = 45, ggtheme = theme_minimal(), ... ) fviz_pca_contrib( X, choice = c("var", "ind"), axes = 1, fill = "steelblue", color = "steelblue", sortcontrib = c("desc", "asc", "none"), top = Inf, ... ) } \arguments{ \item{X}{an object of class PCA, CA, MCA, FAMD, MFA and HMFA [FactoMineR]; prcomp and princomp [stats]; dudi, pca, coa and acm [ade4]; ca [ca package].} \item{choice}{allowed values are "row" and "col" for CA; "var" and "ind" for PCA or MCA; "var", "ind", "quanti.var", "quali.var" and "group" for FAMD, MFA and HMFA.} \item{axes}{a numeric vector specifying the dimension(s) of interest.} \item{fill}{a fill color for the bar plot.} \item{color}{an outline color for the bar plot.} \item{sort.val}{a string specifying whether the value should be sorted. Allowed values are "none" (no sorting), "asc" (for ascending) or "desc" (for descending).} \item{top}{a numeric value specifying the number of top elements to be shown.} \item{xtickslab.rt}{Same as x.text.angle and y.text.angle, respectively. Will be deprecated in the near future.} \item{ggtheme}{function, ggplot2 theme name. Default value is theme_pubr(). Allowed values include ggplot2 official themes: theme_gray(), theme_bw(), theme_minimal(), theme_classic(), theme_void(), ....} \item{...}{other arguments to be passed to the function \link[ggpubr]{ggpar}.} \item{sortcontrib}{see the argument sort.val} } \value{ a ggplot2 plot } \description{ This function can be used to visualize the contribution of rows/columns from the results of Principal Component Analysis (PCA), Correspondence Analysis (CA), Multiple Correspondence Analysis (MCA), Factor Analysis of Mixed Data (FAMD), and Multiple Factor Analysis (MFA) functions. } \details{ The function fviz_contrib() creates a barplot of row/column contributions. A reference dashed line is also shown on the barplot. This reference line corresponds to the expected value if the contribution where uniform.\cr\cr For a given dimension, any row/column with a contribution above the reference line could be considered as important in contributing to the dimension. } \section{Functions}{ \itemize{ \item \code{fviz_pca_contrib}: deprecated function. Use fviz_contrib() }} \examples{ \donttest{ # Principal component analysis # ++++++++++++++++++++++++++ data(decathlon2) decathlon2.active <- decathlon2[1:23, 1:10] res.pca <- prcomp(decathlon2.active, scale = TRUE) # variable contributions on axis 1 fviz_contrib(res.pca, choice="var", axes = 1, top = 10 ) # Change theme and color fviz_contrib(res.pca, choice="var", axes = 1, fill = "lightgray", color = "black") + theme_minimal() + theme(axis.text.x = element_text(angle=45)) # Variable contributions on axis 2 fviz_contrib(res.pca, choice="var", axes = 2) # Variable contributions on axes 1 + 2 fviz_contrib(res.pca, choice="var", axes = 1:2) # Contributions of individuals on axis 1 fviz_contrib(res.pca, choice="ind", axes = 1) \dontrun{ # Correspondence Analysis # ++++++++++++++++++++++++++ # Install and load FactoMineR to compute CA # install.packages("FactoMineR") library("FactoMineR") data("housetasks") res.ca <- CA(housetasks, graph = FALSE) # Visualize row contributions on axes 1 fviz_contrib(res.ca, choice ="row", axes = 1) # Visualize column contributions on axes 1 fviz_contrib(res.ca, choice ="col", axes = 1) # Multiple Correspondence Analysis # +++++++++++++++++++++++++++++++++ library(FactoMineR) data(poison) res.mca <- MCA(poison, quanti.sup = 1:2, quali.sup = 3:4, graph=FALSE) # Visualize individual contributions on axes 1 fviz_contrib(res.mca, choice ="ind", axes = 1) # Visualize variable categorie contributions on axes 1 fviz_contrib(res.mca, choice ="var", axes = 1) # Multiple Factor Analysis # ++++++++++++++++++++++++ library(FactoMineR) data(poison) res.mfa <- MFA(poison, group=c(2,2,5,6), type=c("s","n","n","n"), name.group=c("desc","desc2","symptom","eat"), num.group.sup=1:2, graph=FALSE) # Visualize individual contributions on axes 1 fviz_contrib(res.mfa, choice ="ind", axes = 1, top = 20) # Visualize catecorical variable categorie contributions on axes 1 fviz_contrib(res.mfa, choice ="quali.var", axes = 1) } } } \references{ http://www.sthda.com/english/ } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/fviz_cos2.Rd0000644000176200001440000000730713641172644015377 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fviz_cos2.R \name{fviz_cos2} \alias{fviz_cos2} \title{Visualize the quality of representation of rows/columns} \usage{ fviz_cos2( X, choice = c("row", "col", "var", "ind", "quanti.var", "quali.var", "group"), axes = 1, fill = "steelblue", color = "steelblue", sort.val = c("desc", "asc", "none"), top = Inf, xtickslab.rt = 45, ggtheme = theme_minimal(), ... ) } \arguments{ \item{X}{an object of class PCA, CA, MCA, FAMD, MFA and HMFA [FactoMineR]; prcomp and princomp [stats]; dudi, pca, coa and acm [ade4]; ca [ca package].} \item{choice}{allowed values are "row" and "col" for CA; "var" and "ind" for PCA or MCA; "var", "ind", "quanti.var", "quali.var" and "group" for FAMD, MFA and HMFA.} \item{axes}{a numeric vector specifying the dimension(s) of interest.} \item{fill}{a fill color for the bar plot.} \item{color}{an outline color for the bar plot.} \item{sort.val}{a string specifying whether the value should be sorted. Allowed values are "none" (no sorting), "asc" (for ascending) or "desc" (for descending).} \item{top}{a numeric value specifying the number of top elements to be shown.} \item{xtickslab.rt}{Same as x.text.angle and y.text.angle, respectively. Will be deprecated in the near future.} \item{ggtheme}{function, ggplot2 theme name. Default value is theme_pubr(). Allowed values include ggplot2 official themes: theme_gray(), theme_bw(), theme_minimal(), theme_classic(), theme_void(), ....} \item{...}{not used} } \value{ a ggplot } \description{ This function can be used to visualize the quality of representation (cos2) of rows/columns from the results of Principal Component Analysis (PCA), Correspondence Analysis (CA), Multiple Correspondence Analysis (MCA), Factor Analysis of Mixed Data (FAMD), Multiple Factor Analysis (MFA) and Hierarchical Multiple Factor Analysis (HMFA) functions. } \examples{ \donttest{ # Principal component analysis # ++++++++++++++++++++++++++ data(decathlon2) decathlon2.active <- decathlon2[1:23, 1:10] res.pca <- prcomp(decathlon2.active, scale = TRUE) # variable cos2 on axis 1 fviz_cos2(res.pca, choice="var", axes = 1, top = 10 ) # Change color fviz_cos2(res.pca, choice="var", axes = 1, fill = "lightgray", color = "black") # Variable cos2 on axes 1 + 2 fviz_cos2(res.pca, choice="var", axes = 1:2) # cos2 of individuals on axis 1 fviz_cos2(res.pca, choice="ind", axes = 1) \dontrun{ # Correspondence Analysis # ++++++++++++++++++++++++++ library("FactoMineR") data("housetasks") res.ca <- CA(housetasks, graph = FALSE) # Visualize row cos2 on axes 1 fviz_cos2(res.ca, choice ="row", axes = 1) # Visualize column cos2 on axes 1 fviz_cos2(res.ca, choice ="col", axes = 1) # Multiple Correspondence Analysis # +++++++++++++++++++++++++++++++++ library(FactoMineR) data(poison) res.mca <- MCA(poison, quanti.sup = 1:2, quali.sup = 3:4, graph=FALSE) # Visualize individual cos2 on axes 1 fviz_cos2(res.mca, choice ="ind", axes = 1, top = 20) # Visualize variable categorie cos2 on axes 1 fviz_cos2(res.mca, choice ="var", axes = 1) # Multiple Factor Analysis # ++++++++++++++++++++++++ library(FactoMineR) data(poison) res.mfa <- MFA(poison, group=c(2,2,5,6), type=c("s","n","n","n"), name.group=c("desc","desc2","symptom","eat"), num.group.sup=1:2, graph=FALSE) # Visualize individual cos2 on axes 1 # Select the top 20 fviz_cos2(res.mfa, choice ="ind", axes = 1, top = 20) # Visualize catecorical variable categorie cos2 on axes 1 fviz_cos2(res.mfa, choice ="quali.var", axes = 1) } } } \references{ http://www.sthda.com/english/ } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/facto_summarize.Rd0000644000176200001440000001071513641172644016660 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/facto_summarize.R \name{facto_summarize} \alias{facto_summarize} \title{Subset and summarize the output of factor analyses} \usage{ facto_summarize( X, element, node.level = 1, group.names, result = c("coord", "cos2", "contrib"), axes = 1:2, select = NULL ) } \arguments{ \item{X}{an object of class PCA, CA, MCA, FAMD, MFA and HMFA [FactoMineR]; prcomp and princomp [stats]; dudi, pca, coa and acm [ade4]; ca [ca package]; expoOutput [ExPosition].} \item{element}{the element to subset from the output. Possible values are "row" or "col" for CA; "var" or "ind" for PCA and MCA; "mca.cor" for MCA; 'quanti.var', 'quali.var' , 'group' or 'ind' for FAMD, MFA and HMFA.} \item{node.level}{a single number indicating the HMFA node level.} \item{group.names}{a vector containing the name of the groups (by default, NULL and the group are named group.1, group.2 and so on).} \item{result}{the result to be extracted for the element. Possible values are the combination of c("cos2", "contrib", "coord")} \item{axes}{a numeric vector specifying the axes of interest. Default values are 1:2 for axes 1 and 2.} \item{select}{a selection of variables. Allowed values are NULL or a list containing the arguments name, cos2 or contrib. Default is list(name = NULL, cos2 = NULL, contrib = NULL): \itemize{ \item name: is a character vector containing variable names to be selected \item cos2: if cos2 is in [0, 1], ex: 0.6, then variables with a cos2 > 0.6 are selected. if cos2 > 1, ex: 5, then the top 5 variables with the highest cos2 are selected \item contrib: if contrib > 1, ex: 5, then the top 5 variables with the highest cos2 are selected. }} } \value{ A data frame containing the (total) coord, cos2 and the contribution for the axes. } \description{ Subset and summarize the results of Principal Component Analysis (PCA), Correspondence Analysis (CA), Multiple Correspondence Analysis (MCA), Factor Analysis of Mixed Data (FAMD), Multiple Factor Analysis (MFA) and Hierarchical Multiple Factor Analysis (HMFA) functions from several packages. } \details{ If length(axes) > 1, then the columns contrib and cos2 correspond to the total contributions and total cos2 of the axes. In this case, the column coord is calculated as x^2 + y^2 + ...+; x, y, ... are the coordinates of the points on the specified axes. } \examples{ # Principal component analysis # +++++++++++++++++++++++++++++ data(decathlon2) decathlon2.active <- decathlon2[1:23, 1:10] res.pca <- prcomp(decathlon2.active, scale = TRUE) # Summarize variables on axes 1:2 facto_summarize(res.pca, "var", axes = 1:2)[,-1] # Select the top 5 contributing variables facto_summarize(res.pca, "var", axes = 1:2, select = list(contrib = 5))[,-1] # Select variables with cos2 >= 0.6 facto_summarize(res.pca, "var", axes = 1:2, select = list(cos2 = 0.6))[,-1] # Select by names facto_summarize(res.pca, "var", axes = 1:2, select = list(name = c("X100m", "Discus", "Javeline")))[,-1] # Summarize individuals on axes 1:2 facto_summarize(res.pca, "ind", axes = 1:2)[,-1] # Correspondence Analysis # ++++++++++++++++++++++++++ # Install and load FactoMineR to compute CA # install.packages("FactoMineR") library("FactoMineR") data("housetasks") res.ca <- CA(housetasks, graph = FALSE) # Summarize row variables on axes 1:2 facto_summarize(res.ca, "row", axes = 1:2)[,-1] # Summarize column variables on axes 1:2 facto_summarize(res.ca, "col", axes = 1:2)[,-1] # Multiple Correspondence Analysis # +++++++++++++++++++++++++++++++++ library(FactoMineR) data(poison) res.mca <- MCA(poison, quanti.sup = 1:2, quali.sup = 3:4, graph=FALSE) # Summarize variables on axes 1:2 res <- facto_summarize(res.mca, "var", axes = 1:2) head(res) # Summarize individuals on axes 1:2 res <- facto_summarize(res.mca, "ind", axes = 1:2) head(res) # Multiple factor Analysis # +++++++++++++++++++++++++++++++++ library(FactoMineR) data(poison) res.mfa <- MFA(poison, group=c(2,2,5,6), type=c("s","n","n","n"), name.group=c("desc","desc2","symptom","eat"), num.group.sup=1:2, graph=FALSE) # Summarize categorcial variables on axes 1:2 res <- facto_summarize(res.mfa, "quali.var", axes = 1:2) head(res) # Summarize individuals on axes 1:2 res <- facto_summarize(res.mfa, "ind", axes = 1:2) head(res) } \references{ http://www.sthda.com/english/ } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/eigenvalue.Rd0000644000176200001440000000771513641172644015622 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/eigenvalue.R \name{eigenvalue} \alias{eigenvalue} \alias{get_eig} \alias{get_eigenvalue} \alias{fviz_eig} \alias{fviz_screeplot} \title{Extract and visualize the eigenvalues/variances of dimensions} \usage{ get_eig(X) get_eigenvalue(X) fviz_eig( X, choice = c("variance", "eigenvalue"), geom = c("bar", "line"), barfill = "steelblue", barcolor = "steelblue", linecolor = "black", ncp = 10, addlabels = FALSE, hjust = 0, main = NULL, xlab = NULL, ylab = NULL, ggtheme = theme_minimal(), ... ) fviz_screeplot(...) } \arguments{ \item{X}{an object of class PCA, CA, MCA, FAMD, MFA and HMFA [FactoMineR]; prcomp and princomp [stats]; dudi, pca, coa and acm [ade4]; ca and mjca [ca package].} \item{choice}{a text specifying the data to be plotted. Allowed values are "variance" or "eigenvalue".} \item{geom}{a text specifying the geometry to be used for the graph. Allowed values are "bar" for barplot, "line" for lineplot or c("bar", "line") to use both types.} \item{barfill}{fill color for bar plot.} \item{barcolor}{outline color for bar plot.} \item{linecolor}{color for line plot (when geom contains "line").} \item{ncp}{a numeric value specifying the number of dimensions to be shown.} \item{addlabels}{logical value. If TRUE, labels are added at the top of bars or points showing the information retained by each dimension.} \item{hjust}{horizontal adjustment of the labels.} \item{main, xlab, ylab}{plot main and axis titles.} \item{ggtheme}{function, ggplot2 theme name. Default value is theme_pubr(). Allowed values include ggplot2 official themes: theme_gray(), theme_bw(), theme_minimal(), theme_classic(), theme_void(), ....} \item{...}{optional arguments to be passed to the function \link[ggpubr]{ggpar}.} } \value{ \itemize{ \item{get_eig() (or get_eigenvalue()): returns a data.frame containing 3 columns: the eigenvalues, the percentage of variance and the cumulative percentage of variance retained by each dimension.} \item{fviz_eig() (or fviz_screeplot()): returns a ggplot2} } } \description{ Eigenvalues correspond to the amount of the variation explained by each principal component (PC). \itemize{ \item{get_eig(): Extract the eigenvalues/variances of the principal dimensions} \item{fviz_eig(): Plot the eigenvalues/variances against the number of dimensions} \item{get_eigenvalue(): an alias of get_eig()} \item{fviz_screeplot(): an alias of fviz_eig()} } These functions support the results of Principal Component Analysis (PCA), Correspondence Analysis (CA), Multiple Correspondence Analysis (MCA), Factor Analysis of Mixed Data (FAMD), Multiple Factor Analysis (MFA) and Hierarchical Multiple Factor Analysis (HMFA) functions. } \examples{ # Principal Component Analysis # ++++++++++++++++++++++++++ data(iris) res.pca <- prcomp(iris[, -5], scale = TRUE) # Extract eigenvalues/variances get_eig(res.pca) # Default plot fviz_eig(res.pca, addlabels = TRUE, ylim = c(0, 85)) # Scree plot - Eigenvalues fviz_eig(res.pca, choice = "eigenvalue", addlabels=TRUE) # Use only bar or line plot: geom = "bar" or geom = "line" fviz_eig(res.pca, geom="line") \dontrun{ # Correspondence Analysis # +++++++++++++++++++++++++++++++++ library(FactoMineR) data(housetasks) res.ca <- CA(housetasks, graph = FALSE) get_eig(res.ca) fviz_eig(res.ca, linecolor = "#FC4E07", barcolor = "#00AFBB", barfill = "#00AFBB") # Multiple Correspondence Analysis # +++++++++++++++++++++++++++++++++ library(FactoMineR) data(poison) res.mca <- MCA(poison, quanti.sup = 1:2, quali.sup = 3:4, graph=FALSE) get_eig(res.mca) fviz_eig(res.mca, linecolor = "#FC4E07", barcolor = "#2E9FDF", barfill = "#2E9FDF") } } \references{ http://www.sthda.com/english/ } \seealso{ \code{\link{fviz_pca}}, \code{\link{fviz_ca}}, \code{\link{fviz_mca}}, \code{\link{fviz_mfa}}, \code{\link{fviz_hmfa}} } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/deprecated.Rd0000644000176200001440000000516413144620014015555 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/deprecated.R \name{deprecated} \alias{deprecated} \alias{get_mfa_quanti_var} \alias{get_mfa_quali_var} \alias{get_mfa_group} \alias{fviz_mfa_ind_starplot} \alias{fviz_mfa_group} \alias{fviz_mfa_quanti_var} \alias{fviz_mfa_quali_var} \alias{get_hmfa_quanti_var} \alias{get_hmfa_quali_var} \alias{get_hmfa_group} \alias{fviz_hmfa_quanti_var} \alias{fviz_hmfa_quali_var} \alias{fviz_hmfa_ind_starplot} \alias{fviz_hmfa_group} \title{Deprecated Functions} \usage{ get_mfa_quanti_var(res.mfa) get_mfa_quali_var(res.mfa) get_mfa_group(res.mfa) fviz_mfa_ind_starplot(X, ...) fviz_mfa_group(X, ...) fviz_mfa_quanti_var(X, ...) fviz_mfa_quali_var(X, ...) get_hmfa_quanti_var(res.hmfa) get_hmfa_quali_var(res.hmfa) get_hmfa_group(res.hmfa) fviz_hmfa_quanti_var(X, ...) fviz_hmfa_quali_var(X, ...) fviz_hmfa_ind_starplot(X, ...) fviz_hmfa_group(X, ...) } \arguments{ \item{res.mfa}{an object of class MFA [FactoMineR].} \item{X}{an object of class MFA or HMFA [FactoMineR].} \item{...}{Other arguments.} \item{res.hmfa}{an object of class HMFA [FactoMineR].} } \description{ Deprecated functions. Will be removed in the next version. \itemize{ \item get_mfa_var_quanti(). Deprecated. Use get_mfa_var(res.mfa, "quanti.var") instead. \item get_mfa_var_quali(). Deprecated. Use get_mfa_var(res.mfa, "quali.var") instead. \item get_mfa_group(). Deprecated. Use get_mfa_var(res.mfa, "group") instead. \item{fviz_mfa_ind_starplot(): Star graph of individuals (draws partial points). Deprecated. Use fviz_mfa_ind(res.mfa, partial = "All") instead.} \item{fviz_mfa_quanti_var(): Graph of quantitative variables. Deprecated. Use fviz_mfa(X, "quanti.var") instead.} \item{fviz_mfa_quali_var(): Graph of qualitative variables. Deprecated. Use fviz_mfa(X, "quali.var") instead.} \item get_hmfa_var_quanti(). Deprecated. Use get_hmfa_var(res.hmfa, "quanti.var") instead. \item get_hmfa_var_quali(). Deprecated. Use get_hmfa_var(res.hmfa, "quali.var") instead. \item get_hmfa_group(). Deprecated. Use get_hmfa_var(res.hmfa, "group") instead. \item{fviz_hmfa_ind_starplot(): Graph of partial individuals. Deprecated. Use fviz_hmfa_ind(X, partial = "all") instead.} \item{fviz_hmfa_quanti_var(): Graph of quantitative variables. Deprecated. Use fviz_hmfa_var(X, "quanti.var") instead.} \item{fviz_hmfa_quali_var(): Graph of qualitative variables. Deprecated. Use fviz_hmfa_var(X, "quali.var") instead.} \item{fviz_hmfa_group(): Graph of the groups representation. Deprecated. Use fviz_hmfa_var(X, "group") instead.} } } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/get_famd.Rd0000644000176200001440000000376313144620014015226 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/get_famd.R \name{get_famd} \alias{get_famd} \alias{get_famd_ind} \alias{get_famd_var} \title{Extract the results for individuals and variables - FAMD} \usage{ get_famd(res.famd, element = c("ind", "var", "quanti.var", "quali.var")) get_famd_ind(res.famd) get_famd_var(res.famd, element = c("var", "quanti.var", "quali.var")) } \arguments{ \item{res.famd}{an object of class FAMD [FactoMineR].} \item{element}{the element to subset from the output. Possible values are "ind", "quanti.var" or "quali.var".} } \value{ a list of matrices containing the results for the active individuals and variables, including : \item{coord}{coordinates of indiiduals/variables.} \item{cos2}{cos2 values representing the quality of representation on the factor map.} \item{contrib}{contributions of individuals / variables to the principal components.} } \description{ Extract all the results (coordinates, squared cosine and contributions) for the active individuals and variables from Factor Analysis of Mixed Date (FAMD) outputs.\cr\cr \itemize{ \item get_famd(): Extract the results for variables and individuals \item get_famd_ind(): Extract the results for individuals only \item get_famd_var(): Extract the results for quantitative and qualitative variables only } } \examples{ # Compute FAMD library("FactoMineR") data(wine) res.famd <- FAMD(wine[,c(1,2, 16, 22, 29, 28, 30,31)], graph = FALSE) # Extract the results for qualitative variable categories quali.var <- get_famd_var(res.famd, "quali.var") print(quali.var) head(quali.var$coord) # coordinates of qualitative variables # Extract the results for quantitative variables quanti.var <- get_famd_var(res.famd, "quanti.var") print(quanti.var) head(quanti.var$coord) # coordinates # Extract the results for individuals ind <- get_famd_ind(res.famd) print(ind) head(ind$coord) # coordinates of individuals } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/get_mfa.Rd0000644000176200001440000000576413641172644015102 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/get_mfa.R \name{get_mfa} \alias{get_mfa} \alias{get_mfa_ind} \alias{get_mfa_var} \alias{get_mfa_partial_axes} \title{Extract the results for individuals/variables/group/partial axes - MFA} \usage{ get_mfa( res.mfa, element = c("ind", "quanti.var", "quali.var", "group", "partial.axes") ) get_mfa_ind(res.mfa) get_mfa_var(res.mfa, element = c("quanti.var", "quali.var", "group")) get_mfa_partial_axes(res.mfa) } \arguments{ \item{res.mfa}{an object of class MFA [FactoMineR].} \item{element}{the element to subset from the output. Possible values are "ind", "quanti.var", "quali.var", "group" or "partial.axes".} } \value{ a list of matrices containing the results for the active individuals/quantitative variable categories/qualitative variable categories/groups/partial axes including : \item{coord}{coordinates for the individuals/quantitative variable categories/qualitative variable categories/groups/partial axes} \item{cos2}{cos2 for the individuals/quantitative variable categories/qualitative variable categories/groups/partial axes} \item{contrib}{contributions of the individuals/quantitative variable categories/qualitative variable categories/groups/partial axes} \item{inertia}{inertia of the individuals/quantitative variable categories/qualitative variable categories/groups/partial axes} } \description{ Extract all the results (coordinates, squared cosine and contributions) for the active individuals/quantitative variables/qualitative variable categories/groups/partial axes from Multiple Factor Analysis (MFA) outputs.\cr\cr \itemize{ \item get_mfa(): Extract the results for variables and individuals \item get_mfa_ind(): Extract the results for individuals only \item get_mfa_var(): Extract the results for variables (quantitatives, qualitatives and groups) \item get_mfa_partial_axes(): Extract the results for partial axes only } } \examples{ # Multiple Factor Analysis # ++++++++++++++++++++++++ # Install and load FactoMineR to compute MFA # install.packages("FactoMineR") library("FactoMineR") data(poison) res.mfa <- MFA(poison, group=c(2,2,5,6), type=c("s","n","n","n"), name.group=c("desc","desc2","symptom","eat"), num.group.sup=1:2, graph = FALSE) # Extract the results for qualitative variable categories var <- get_mfa_var(res.mfa, "quali.var") print(var) head(var$coord) # coordinates of qualitative variables head(var$cos2) # cos2 of qualitative variables head(var$contrib) # contributions of qualitative variables # Extract the results for individuals ind <- get_mfa_ind(res.mfa) print(ind) head(ind$coord) # coordinates of individuals head(ind$cos2) # cos2 of individuals head(ind$contrib) # contributions of individuals # You can also use the function get_mfa() get_mfa(res.mfa, "ind") # Results for individuals get_mfa(res.mfa, "quali.var") # Results for qualitative variable categories } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} Fabian Mundt \email{f.mundt@inventionate.de} } factoextra/man/fviz_mfa.Rd0000644000176200001440000001717513641172644015300 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fviz_mfa.R \name{fviz_mfa} \alias{fviz_mfa} \alias{fviz_mfa_ind} \alias{fviz_mfa_quali_biplot} \alias{fviz_mfa_var} \alias{fviz_mfa_axes} \title{Visualize Multiple Factor Analysis} \usage{ fviz_mfa_ind( X, axes = c(1, 2), geom = c("point", "text"), repel = FALSE, habillage = "none", palette = NULL, addEllipses = FALSE, col.ind = "blue", col.ind.sup = "darkblue", alpha.ind = 1, shape.ind = 19, col.quali.var.sup = "black", select.ind = list(name = NULL, cos2 = NULL, contrib = NULL), partial = NULL, col.partial = "group", ... ) fviz_mfa_quali_biplot( X, axes = c(1, 2), geom = c("point", "text"), repel = repel, title = "Biplot of individuals and qualitative variables - MFA", ... ) fviz_mfa_var( X, choice = c("quanti.var", "group", "quali.var"), axes = c(1, 2), geom = c("point", "text"), repel = FALSE, habillage = "none", col.var = "red", alpha.var = 1, shape.var = 17, col.var.sup = "darkgreen", palette = NULL, select.var = list(name = NULL, cos2 = NULL, contrib = NULL), ... ) fviz_mfa_axes( X, axes = c(1, 2), geom = c("arrow", "text"), col.axes = NULL, alpha.axes = 1, col.circle = "grey70", select.axes = list(name = NULL, contrib = NULL), repel = FALSE, ... ) fviz_mfa(X, partial = "all", ...) } \arguments{ \item{X}{an object of class MFA [FactoMineR].} \item{axes}{a numeric vector of length 2 specifying the dimensions to be plotted.} \item{geom}{a text specifying the geometry to be used for the graph. Allowed values are the combination of \code{c("point", "arrow", "text")}. Use \code{"point"} (to show only points); \code{"text"} to show only labels; \code{c("point", "text")} or \code{c("arrow", "text")} to show arrows and texts. Using \code{c("arrow", "text")} is sensible only for the graph of variables.} \item{repel}{a boolean, whether to use ggrepel to avoid overplotting text labels or not.} \item{habillage}{an optional factor variable for coloring the observations by groups. Default value is "none". If X is an MFA object from FactoMineR package, habillage can also specify the index of the factor variable in the data.} \item{palette}{the color palette to be used for coloring or filling by groups. Allowed values include "grey" for grey color palettes; brewer palettes e.g. "RdBu", "Blues", ...; or custom color palette e.g. c("blue", "red"); and scientific journal palettes from ggsci R package, e.g.: "npg", "aaas", "lancet", "jco", "ucscgb", "uchicago", "simpsons" and "rickandmorty". Can be also a numeric vector of length(groups); in this case a basic color palette is created using the function \link[grDevices]{palette}.} \item{addEllipses}{logical value. If TRUE, draws ellipses around the individuals when habillage != "none".} \item{col.ind, col.var, col.axes}{color for individuals, variables and col.axes respectively. Can be a continuous variable or a factor variable. Possible values include also : "cos2", "contrib", "coord", "x" or "y". In this case, the colors for individuals/variables are automatically controlled by their qualities ("cos2"), contributions ("contrib"), coordinates (x^2 + y^2 , "coord"), x values("x") or y values("y"). To use automatic coloring (by cos2, contrib, ....), make sure that habillage ="none".} \item{col.ind.sup}{color for supplementary individuals} \item{alpha.ind, alpha.var, alpha.axes}{controls the transparency of individual, variable, group and axes colors, respectively. The value can variate from 0 (total transparency) to 1 (no transparency). Default value is 1. Possible values include also : "cos2", "contrib", "coord", "x" or "y". In this case, the transparency for individual/variable colors are automatically controlled by their qualities ("cos2"), contributions ("contrib"), coordinates (x^2 + y^2 , "coord"), x values("x") or y values("y"). To use this, make sure that habillage ="none".} \item{shape.ind, shape.var}{point shapes of individuals, variables, groups and axes} \item{col.quali.var.sup}{color for supplementary qualitative variables. Default is "black".} \item{select.ind, select.var, select.axes}{a selection of individuals/partial individuals/ variables/groups/axes to be drawn. Allowed values are NULL or a list containing the arguments name, cos2 or contrib: \itemize{ \item name is a character vector containing individuals/variables to be drawn \item cos2 if cos2 is in [0, 1], ex: 0.6, then individuals/variables with a cos2 > 0.6 are drawn. if cos2 > 1, ex: 5, then the top 5 individuals/variables with the highest cos2 are drawn. \item contrib if contrib > 1, ex: 5, then the top 5 individuals/variables with the highest cos2 are drawn }} \item{partial}{list of the individuals for which the partial points should be drawn. (by default, partial = NULL and no partial points are drawn). Use partial = "All" to visualize partial points for all individuals.} \item{col.partial}{color for partial individuals. By default, points are colored according to the groups.} \item{...}{Arguments to be passed to the function fviz()} \item{title}{the title of the graph} \item{choice}{the graph to plot. Allowed values include one of c("quanti.var", "quali.var", "group") for plotting quantitative variables, qualitative variables and group of variables, respectively.} \item{col.var.sup}{color for supplementary variables.} \item{col.circle}{a color for the correlation circle. Used only when X is a PCA output.} } \value{ a ggplot2 plot } \description{ Multiple factor analysis (MFA) is used to analyze a data set in which individuals are described by several sets of variables (quantitative and/or qualitative) structured into groups. fviz_mfa() provides ggplot2-based elegant visualization of MFA outputs from the R function: MFA [FactoMineR].\cr\cr \itemize{ \item{fviz_mfa_ind(): Graph of individuals} \item{fviz_mfa_var(): Graph of variables} \item{fviz_mfa_axes(): Graph of partial axes} \item{fviz_mfa(): An alias of fviz_mfa_ind(res.mfa, partial = "all")} \item{fviz_mfa_quali_biplot(): Biplot of individuals and qualitative variables} } } \examples{ # Compute Multiple Factor Analysis library("FactoMineR") data(wine) res.mfa <- MFA(wine, group=c(2,5,3,10,9,2), type=c("n",rep("s",5)), ncp=5, name.group=c("orig","olf","vis","olfag","gust","ens"), num.group.sup=c(1,6), graph=FALSE) # Eigenvalues/variances of dimensions fviz_screeplot(res.mfa) # Group of variables fviz_mfa_var(res.mfa, "group") # Quantitative variables fviz_mfa_var(res.mfa, "quanti.var", palette = "jco", col.var.sup = "violet", repel = TRUE) # Graph of individuals colored by cos2 fviz_mfa_ind(res.mfa, col.ind = "cos2", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE) # Partial individuals fviz_mfa_ind(res.mfa, partial = "all") # Partial axes fviz_mfa_axes(res.mfa) # Graph of categorical variable categories # ++++++++++++++++++++++++++++++++++++++++ data(poison) res.mfa <- MFA(poison, group=c(2,2,5,6), type=c("s","n","n","n"), name.group=c("desc","desc2","symptom","eat"), num.group.sup=1:2, graph=FALSE) # Plot of qualitative variables fviz_mfa_var(res.mfa, "quali.var") # Biplot of categorical variable categories and individuals # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # Use repel = TRUE to avoid overplotting grp <- as.factor(poison[, "Vomiting"]) fviz_mfa_quali_biplot(res.mfa, repel = FALSE, col.var = "#E7B800", habillage = grp, addEllipses = TRUE, ellipse.level = 0.95) } \references{ http://www.sthda.com/english/ } \author{ Fabian Mundt \email{f.mundt@inventionate.de} Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/eclust.Rd0000644000176200001440000001017013641172644014762 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/eclust.R \name{eclust} \alias{eclust} \title{Visual enhancement of clustering analysis} \usage{ eclust( x, FUNcluster = c("kmeans", "pam", "clara", "fanny", "hclust", "agnes", "diana"), k = NULL, k.max = 10, stand = FALSE, graph = TRUE, hc_metric = "euclidean", hc_method = "ward.D2", gap_maxSE = list(method = "firstSEmax", SE.factor = 1), nboot = 100, verbose = interactive(), seed = 123, ... ) } \arguments{ \item{x}{numeric vector, data matrix or data frame} \item{FUNcluster}{a clustering function including "kmeans", "pam", "clara", "fanny", "hclust", "agnes" and "diana". Abbreviation is allowed.} \item{k}{the number of clusters to be generated. If NULL, the gap statistic is used to estimate the appropriate number of clusters. In the case of kmeans, k can be either the number of clusters, or a set of initial (distinct) cluster centers.} \item{k.max}{the maximum number of clusters to consider, must be at least two.} \item{stand}{logical value; default is FALSE. If TRUE, then the data will be standardized using the function scale(). Measurements are standardized for each variable (column), by subtracting the variable's mean value and dividing by the variable's standard deviation.} \item{graph}{logical value. If TRUE, cluster plot is displayed.} \item{hc_metric}{character string specifying the metric to be used for calculating dissimilarities between observations. Allowed values are those accepted by the function dist() [including "euclidean", "manhattan", "maximum", "canberra", "binary", "minkowski"] and correlation based distance measures ["pearson", "spearman" or "kendall"]. Used only when FUNcluster is a hierarchical clustering function such as one of "hclust", "agnes" or "diana".} \item{hc_method}{the agglomeration method to be used (?hclust): "ward.D", "ward.D2", "single", "complete", "average", ...} \item{gap_maxSE}{a list containing the parameters (method and SE.factor) for determining the location of the maximum of the gap statistic (Read the documentation ?cluster::maxSE).} \item{nboot}{integer, number of Monte Carlo ("bootstrap") samples. Used only for determining the number of clusters using gap statistic.} \item{verbose}{logical value. If TRUE, the result of progress is printed.} \item{seed}{integer used for seeding the random number generator.} \item{...}{other arguments to be passed to FUNcluster.} } \value{ Returns an object of class "eclust" containing the result of the standard function used (e.g., kmeans, pam, hclust, agnes, diana, etc.). It includes also: \itemize{ \item cluster: the cluster assignement of observations after cutting the tree \item nbclust: the number of clusters \item silinfo: the silhouette information of observations, including $widths (silhouette width values of each observation), $clus.avg.widths (average silhouette width of each cluster) and $avg.width (average width of all clusters) \item size: the size of clusters \item data: a matrix containing the original or the standardized data (if stand = TRUE) } The "eclust" class has method for fviz_silhouette(), fviz_dend(), fviz_cluster(). } \description{ Provides solution for enhancing the workflow of clustering analyses and ggplot2-based elegant data visualization. Read more: \href{http://www.sthda.com/english/wiki/visual-enhancement-of-clustering-analysis-unsupervised-machine-learning}{Visual enhancement of clustering analysis}. } \examples{ # Load and scale data data("USArrests") df <- scale(USArrests) # Enhanced k-means clustering # nboot >= 500 is recommended res.km <- eclust(df, "kmeans", nboot = 2) # Silhouette plot fviz_silhouette(res.km) # Optimal number of clusters using gap statistics res.km$nbclust # Print result res.km \dontrun{ # Enhanced hierarchical clustering res.hc <- eclust(df, "hclust", nboot = 2) # compute hclust fviz_dend(res.hc) # dendrogam fviz_silhouette(res.hc) # silhouette plot } } \seealso{ \code{\link{fviz_silhouette}}, \code{\link{fviz_dend}}, \code{\link{fviz_cluster}} } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/fviz_ellipses.Rd0000644000176200001440000000616213641172644016347 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fviz_ellipses.R \name{fviz_ellipses} \alias{fviz_ellipses} \title{Draw confidence ellipses around the categories} \usage{ fviz_ellipses( X, habillage, axes = c(1, 2), addEllipses = TRUE, ellipse.type = "confidence", palette = NULL, pointsize = 1, geom = c("point", "text"), ggtheme = theme_bw(), ... ) } \arguments{ \item{X}{an object of class MCA, PCA or MFA.} \item{habillage}{a numeric vector of indexes of variables or a character vector of names of variables. Can be also a data frame containing grouping variables.} \item{axes}{a numeric vector specifying the axes of interest. Default values are 1:2 for axes 1 and 2.} \item{addEllipses}{logical value. If TRUE, draws ellipses around the individuals when habillage != "none".} \item{ellipse.type}{Character specifying frame type. Possible values are \code{"convex"}, \code{"confidence"} or types supported by \code{\link[ggplot2]{stat_ellipse}()} including one of \code{c("t", "norm", "euclid")} for plotting concentration ellipses. \itemize{ \item \code{"convex"}: plot convex hull of a set o points. \item \code{"confidence"}: plot confidence ellipses arround group mean points as \code{\link[FactoMineR]{coord.ellipse}()}[in FactoMineR]. \item \code{"t"}: assumes a multivariate t-distribution. \item \code{"norm"}: assumes a multivariate normal distribution. \item \code{"euclid"}: draws a circle with the radius equal to level, representing the euclidean distance from the center. This ellipse probably won't appear circular unless \code{\link[ggplot2]{coord_fixed}()} is applied.}} \item{palette}{the color palette to be used for coloring or filling by groups. Allowed values include "grey" for grey color palettes; brewer palettes e.g. "RdBu", "Blues", ...; or custom color palette e.g. c("blue", "red"); and scientific journal palettes from ggsci R package, e.g.: "npg", "aaas", "lancet", "jco", "ucscgb", "uchicago", "simpsons" and "rickandmorty". Can be also a numeric vector of length(groups); in this case a basic color palette is created using the function \link[grDevices]{palette}.} \item{pointsize}{the size of points} \item{geom}{a text specifying the geometry to be used for the graph. Allowed values are the combination of c("point", "text"). Use "point" (to show only points); "text" to show only labels; c("point", "text") to show both types.} \item{ggtheme}{function, ggplot2 theme name. Default value is theme_pubr(). Allowed values include ggplot2 official themes: theme_gray(), theme_bw(), theme_minimal(), theme_classic(), theme_void(), ....} \item{...}{Arguments to be passed to the functions ggpubr::ggscatter() & ggpubr::ggpar().} } \value{ a ggplot } \description{ Draw confidence ellipses around the categories } \examples{ \donttest{ # Multiple Correspondence Analysis # +++++++++++++++++++++++++++++++++ library(FactoMineR) data(poison) res.mca <- MCA(poison, quanti.sup = 1:2, quali.sup = 3:4, graph=FALSE) fviz_ellipses(res.mca, 1:4, geom = "point", palette = "jco") } } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/fviz_nbclust.Rd0000644000176200001440000001230313641172644016173 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fviz_nbclust.R \name{fviz_nbclust} \alias{fviz_nbclust} \alias{fviz_gap_stat} \title{Dertermining and Visualizing the Optimal Number of Clusters} \usage{ fviz_nbclust( x, FUNcluster = NULL, method = c("silhouette", "wss", "gap_stat"), diss = NULL, k.max = 10, nboot = 100, verbose = interactive(), barfill = "steelblue", barcolor = "steelblue", linecolor = "steelblue", print.summary = TRUE, ... ) fviz_gap_stat( gap_stat, linecolor = "steelblue", maxSE = list(method = "firstSEmax", SE.factor = 1) ) } \arguments{ \item{x}{numeric matrix or data frame. In the function fviz_nbclust(), x can be the results of the function NbClust().} \item{FUNcluster}{a partitioning function which accepts as first argument a (data) matrix like x, second argument, say k, k >= 2, the number of clusters desired, and returns a list with a component named cluster which contains the grouping of observations. Allowed values include: kmeans, cluster::pam, cluster::clara, cluster::fanny, hcut, etc. This argument is not required when x is an output of the function \code{NbClust::NbClust()}.} \item{method}{the method to be used for estimating the optimal number of clusters. Possible values are "silhouette" (for average silhouette width), "wss" (for total within sum of square) and "gap_stat" (for gap statistics).} \item{diss}{dist object as produced by dist(), i.e.: diss = dist(x, method = "euclidean"). Used to compute the average silhouette width of clusters, the within sum of square and hierarchical clustering. If NULL, dist(x) is computed with the default method = "euclidean"} \item{k.max}{the maximum number of clusters to consider, must be at least two.} \item{nboot}{integer, number of Monte Carlo ("bootstrap") samples. Used only for determining the number of clusters using gap statistic.} \item{verbose}{logical value. If TRUE, the result of progress is printed.} \item{barfill, barcolor}{fill color and outline color for bars} \item{linecolor}{color for lines} \item{print.summary}{logical value. If true, the optimal number of clusters are printed in fviz_nbclust().} \item{...}{optionally further arguments for FUNcluster()} \item{gap_stat}{an object of class "clusGap" returned by the function clusGap() [in cluster package]} \item{maxSE}{a list containing the parameters (method and SE.factor) for determining the location of the maximum of the gap statistic (Read the documentation ?cluster::maxSE). Allowed values for maxSE$method include: \itemize{ \item "globalmax": simply corresponds to the global maximum, i.e., is which.max(gap) \item "firstmax": gives the location of the first local maximum \item "Tibs2001SEmax": uses the criterion, Tibshirani et al (2001) proposed: "the smallest k such that gap(k) >= gap(k+1) - s_{k+1}". It's also possible to use "the smallest k such that gap(k) >= gap(k+1) - SE.factor*s_{k+1}" where SE.factor is a numeric value which can be 1 (default), 2, 3, etc. \item "firstSEmax": location of the first f() value which is not larger than the first local maximum minus SE.factor * SE.f[], i.e, within an "f S.E." range of that maximum. \item see ?cluster::maxSE for more options }} } \value{ \itemize{ \item fviz_nbclust, fviz_gap_stat: return a ggplot2 } } \description{ Partitioning methods, such as k-means clustering require the users to specify the number of clusters to be generated. \itemize{ \item{fviz_nbclust(): Dertemines and visualize the optimal number of clusters using different methods: \strong{within cluster sums of squares}, \strong{average silhouette} and \strong{gap statistics}. } \item{fviz_gap_stat(): Visualize the gap statistic generated by the function \code{\link[cluster]{clusGap}}() [in cluster package]. The optimal number of clusters is specified using the "firstmax" method (?cluster::clustGap).} } Read more: \href{http://www.sthda.com/english/wiki/determining-the-optimal-number-of-clusters-3-must-known-methods-unsupervised-machine-learning}{Determining the optimal number of clusters} } \examples{ set.seed(123) # Data preparation # +++++++++++++++ data("iris") head(iris) # Remove species column (5) and scale the data iris.scaled <- scale(iris[, -5]) # Optimal number of clusters in the data # ++++++++++++++++++++++++++++++++++++++ # Examples are provided only for kmeans, but # you can also use cluster::pam (for pam) or # hcut (for hierarchical clustering) ### Elbow method (look at the knee) # Elbow method for kmeans fviz_nbclust(iris.scaled, kmeans, method = "wss") + geom_vline(xintercept = 3, linetype = 2) # Average silhouette for kmeans fviz_nbclust(iris.scaled, kmeans, method = "silhouette") ### Gap statistic library(cluster) set.seed(123) # Compute gap statistic for kmeans # we used B = 10 for demo. Recommended value is ~500 gap_stat <- clusGap(iris.scaled, FUN = kmeans, nstart = 25, K.max = 10, B = 10) print(gap_stat, method = "firstmax") fviz_gap_stat(gap_stat) # Gap statistic for hierarchical clustering gap_stat <- clusGap(iris.scaled, FUN = hcut, K.max = 10, B = 10) fviz_gap_stat(gap_stat) } \seealso{ \code{\link{fviz_cluster}}, \code{\link{eclust}} } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/housetasks.Rd0000644000176200001440000000145613641172644015663 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/housetasks.R \docType{data} \name{housetasks} \alias{housetasks} \title{House tasks contingency table} \format{ A data frame with 13 observations (house tasks) on the following 4 columns. \describe{ \item{\code{Wife}}{a numeric vector} \item{\code{Alternating}}{a numeric vector} \item{\code{Husband}}{a numeric vector} \item{\code{Jointly}}{a numeric vector} } } \source{ This data is from FactoMineR package. } \usage{ data("housetasks") } \description{ A data frame containing the frequency of execution of 13 house tasks in the couple. This table is also available in ade4 package. } \examples{ library(FactoMineR) data(housetasks) res.ca <- CA(housetasks, graph=FALSE) fviz_ca_biplot(res.ca, repel = TRUE)+ theme_minimal() } factoextra/man/hcut.Rd0000644000176200001440000000533013641172644014430 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hcut.R \name{hcut} \alias{hcut} \title{Computes Hierarchical Clustering and Cut the Tree} \usage{ hcut( x, k = 2, isdiss = inherits(x, "dist"), hc_func = c("hclust", "agnes", "diana"), hc_method = "ward.D2", hc_metric = "euclidean", stand = FALSE, graph = FALSE, ... ) } \arguments{ \item{x}{a numeric matrix, numeric data frame or a dissimilarity matrix.} \item{k}{the number of clusters to be generated.} \item{isdiss}{logical value specifying wether x is a dissimilarity matrix.} \item{hc_func}{the hierarchical clustering function to be used. Default value is "hclust". Possible values is one of "hclust", "agnes", "diana". Abbreviation is allowed.} \item{hc_method}{the agglomeration method to be used (?hclust) for hclust() and agnes(): "ward.D", "ward.D2", "single", "complete", "average", ...} \item{hc_metric}{character string specifying the metric to be used for calculating dissimilarities between observations. Allowed values are those accepted by the function dist() [including "euclidean", "manhattan", "maximum", "canberra", "binary", "minkowski"] and correlation based distance measures ["pearson", "spearman" or "kendall"].} \item{stand}{logical value; default is FALSE. If TRUE, then the data will be standardized using the function scale(). Measurements are standardized for each variable (column), by subtracting the variable's mean value and dividing by the variable's standard deviation.} \item{graph}{logical value. If TRUE, the dendrogram is displayed.} \item{...}{not used.} } \value{ an object of class "hcut" containing the result of the standard function used (read the documentation of hclust, agnes, diana). It includes also: \itemize{ \item cluster: the cluster assignement of observations after cutting the tree \item nbclust: the number of clusters \item silinfo: the silhouette information of observations (if k > 1) \item size: the size of clusters \item data: a matrix containing the original or the standardized data (if stand = TRUE) } } \description{ Computes hierarchical clustering (hclust, agnes, diana) and cut the tree into k clusters. It also accepts correlation based distance measure methods such as "pearson", "spearman" and "kendall". } \examples{ \donttest{ data(USArrests) # Compute hierarchical clustering and cut into 4 clusters res <- hcut(USArrests, k = 4, stand = TRUE) # Cluster assignements of observations res$cluster # Size of clusters res$size # Visualize the dendrogram fviz_dend(res, rect = TRUE) # Visualize the silhouette fviz_silhouette(res) # Visualize clusters as scatter plots fviz_cluster(res) } } \seealso{ \code{\link{fviz_dend}}, \code{\link{hkmeans}}, \code{\link{eclust}} } factoextra/man/fviz_add.Rd0000644000176200001440000000342513641172644015256 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fviz_add.R \name{fviz_add} \alias{fviz_add} \title{Add supplementary data to a plot} \usage{ fviz_add( ggp, df, axes = c(1, 2), geom = c("point", "arrow"), color = "blue", addlabel = TRUE, labelsize = 4, pointsize = 2, shape = 19, linetype = "dashed", repel = FALSE, font.family = "", ... ) } \arguments{ \item{ggp}{a ggplot2 plot.} \item{df}{a data frame containing the x and y coordinates} \item{axes}{a numeric vector of length 2 specifying the components to be plotted.} \item{geom}{a character specifying the geometry to be used for the graph Allowed values are "point" or "arrow" or "text"} \item{color}{the color to be used} \item{addlabel}{a logical value. If TRUE, labels are added} \item{labelsize}{the size of labels. Default value is 4} \item{pointsize}{the size of points} \item{shape}{point shape when geom ="point"} \item{linetype}{the linetype to be used when geom ="arrow"} \item{repel}{a boolean, whether to use ggrepel to avoid overplotting text labels or not.} \item{font.family}{character vector specifying font family.} \item{...}{Additional arguments, not used} } \value{ a ggplot2 plot } \description{ Add supplementary data to a plot } \examples{ \donttest{ # Principal component analysis data(decathlon2) decathlon2.active <- decathlon2[1:23, 1:10] res.pca <- prcomp(decathlon2.active, scale = TRUE) # Visualize variables p <- fviz_pca_var(res.pca) print(p) # Add supplementary variables coord <- data.frame(PC1 = c(-0.7, 0.9), PC2 = c(0.25, -0.07)) rownames(coord) <- c("Rank", "Points") print(coord) fviz_add(p, coord, color ="blue", geom="arrow") } } \references{ http://www.sthda.com } \author{ Alboukadel Kassambara \email{alboukadel.kassambara@gmail.com} } factoextra/man/fviz_dend.Rd0000644000176200001440000001064213641172644015437 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fviz_dend.R \name{fviz_dend} \alias{fviz_dend} \title{Enhanced Visualization of Dendrogram} \usage{ fviz_dend( x, k = NULL, h = NULL, k_colors = NULL, palette = NULL, show_labels = TRUE, color_labels_by_k = TRUE, label_cols = NULL, labels_track_height = NULL, repel = FALSE, lwd = 0.7, type = c("rectangle", "circular", "phylogenic"), phylo_layout = "layout.auto", rect = FALSE, rect_border = "gray", rect_lty = 2, rect_fill = FALSE, lower_rect, horiz = FALSE, cex = 0.8, main = "Cluster Dendrogram", xlab = "", ylab = "Height", sub = NULL, ggtheme = theme_classic(), ... ) } \arguments{ \item{x}{an object of class dendrogram, hclust, agnes, diana, hcut, hkmeans or HCPC (FactoMineR).} \item{k}{the number of groups for cutting the tree.} \item{h}{a numeric value. Cut the dendrogram by cutting at height h. (k overrides h)} \item{k_colors, palette}{a vector containing colors to be used for the groups. It should contains k number of colors. Allowed values include also "grey" for grey color palettes; brewer palettes e.g. "RdBu", "Blues", ...; and scientific journal palettes from ggsci R package, e.g.: "npg", "aaas", "lancet", "jco", "ucscgb", "uchicago", "simpsons" and "rickandmorty".} \item{show_labels}{a logical value. If TRUE, leaf labels are shown. Default value is TRUE.} \item{color_labels_by_k}{logical value. If TRUE, labels are colored automatically by group when k != NULL.} \item{label_cols}{a vector containing the colors for labels.} \item{labels_track_height}{a positive numeric value for adjusting the room for the labels. Used only when type = "rectangle".} \item{repel}{logical value. Use repel = TRUE to avoid label overplotting when type = "phylogenic".} \item{lwd}{a numeric value specifying branches and rectangle line width.} \item{type}{type of plot. Allowed values are one of "rectangle", "triangle", "circular", "phylogenic".} \item{phylo_layout}{the layout to be used for phylogenic trees. Default value is "layout.auto". Allowed values include: \code{\link[igraph]{layout.auto}}, \code{\link[igraph]{layout_with_drl}}, \code{\link[igraph]{layout_as_tree}}, \code{\link[igraph]{layout.gem}}, \code{\link[igraph]{layout.mds}} and \code{\link[igraph]{layout_with_lgl}}.} \item{rect}{logical value specifying whether to add a rectangle around groups. Used only when k != NULL.} \item{rect_border, rect_lty}{border color and line type for rectangles.} \item{rect_fill}{a logical value. If TRUE, fill the rectangle.} \item{lower_rect}{a value of how low should the lower part of the rectangle around clusters. Ignored when rect = FALSE.} \item{horiz}{a logical value. If TRUE, an horizontal dendrogram is drawn.} \item{cex}{size of labels} \item{main, xlab, ylab}{main and axis titles} \item{sub}{Plot subtitle. If NULL, the method used hierarchical clustering is shown. To remove the subtitle use sub = "".} \item{ggtheme}{function, ggplot2 theme name. Default value is theme_classic(). Allowed values include ggplot2 official themes: theme_gray(), theme_bw(), theme_minimal(), theme_classic(), theme_void(), ....} \item{...}{other arguments to be passed to the function plot.dendrogram()} } \value{ an object of class fviz_dend which is a ggplot with the attributes "dendrogram" accessible using attr(x, "dendrogram"), where x is the result of fviz_dend(). } \description{ Draws easily beautiful dendrograms using either R base plot or ggplot2. Provides also an option for drawing a circular dendrogram and phylogenic trees. } \examples{ \donttest{ # Load and scale the data data(USArrests) df <- scale(USArrests) # Hierarchical clustering res.hc <- hclust(dist(df)) # Default plot fviz_dend(res.hc) # Cut the tree fviz_dend(res.hc, cex = 0.5, k = 4, color_labels_by_k = TRUE) # Don't color labels, add rectangles fviz_dend(res.hc, cex = 0.5, k = 4, color_labels_by_k = FALSE, rect = TRUE) # Change the color of tree using black color for all groups # Change rectangle border colors fviz_dend(res.hc, rect = TRUE, k_colors ="black", rect_border = 2:5, rect_lty = 1) # Customized color for groups fviz_dend(res.hc, k = 4, k_colors = c("#1B9E77", "#D95F02", "#7570B3", "#E7298A")) # Color labels using k-means clusters km.clust <- kmeans(df, 4)$cluster fviz_dend(res.hc, k = 4, k_colors = c("blue", "green3", "red", "black"), label_cols = km.clust[res.hc$order], cex = 0.6) } } factoextra/man/decathlon2.Rd0000644000176200001440000000231313641172644015506 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/decathlon2.R \docType{data} \name{decathlon2} \alias{decathlon2} \title{Athletes' performance in decathlon} \format{ A data frame with 27 observations on the following 13 variables. \describe{ \item{\code{X100m}}{a numeric vector} \item{\code{Long.jump}}{a numeric vector} \item{\code{Shot.put}}{a numeric vector} \item{\code{High.jump}}{a numeric vector} \item{\code{X400m}}{a numeric vector} \item{\code{X110m.hurdle}}{a numeric vector} \item{\code{Discus}}{a numeric vector} \item{\code{Pole.vault}}{a numeric vector} \item{\code{Javeline}}{a numeric vector} \item{\code{X1500m}}{a numeric vector} \item{\code{Rank}}{a numeric vector corresponding to the rank} \item{\code{Points}}{a numeric vector specifying the point obtained} \item{\code{Competition}}{a factor with levels \code{Decastar} \code{OlympicG}} } } \source{ This data is a subset of decathlon data in FactoMineR package. } \usage{ data("decathlon2") } \description{ Athletes' performance during two sporting meetings } \examples{ \donttest{ data(decathlon2) decathlon.active <- decathlon2[1:23, 1:10] res.pca <- prcomp(decathlon.active, scale = TRUE) fviz_pca_biplot(res.pca) } } factoextra/DESCRIPTION0000644000176200001440000000416213641202602014117 0ustar liggesusersPackage: factoextra Type: Package Title: Extract and Visualize the Results of Multivariate Data Analyses Version: 1.0.7 Date: 2020-04-01 Authors@R: c( person("Alboukadel", "Kassambara", role = c("aut", "cre"), email = "alboukadel.kassambara@gmail.com"), person("Fabian", "Mundt", role = c("aut"), email = "f.mundt@inventionate.de") ) Description: Provides some easy-to-use functions to extract and visualize the output of multivariate data analyses, including 'PCA' (Principal Component Analysis), 'CA' (Correspondence Analysis), 'MCA' (Multiple Correspondence Analysis), 'FAMD' (Factor Analysis of Mixed Data), 'MFA' (Multiple Factor Analysis) and 'HMFA' (Hierarchical Multiple Factor Analysis) functions from different R packages. It contains also functions for simplifying some clustering analysis steps and provides 'ggplot2' - based elegant data visualization. License: GPL-2 LazyData: true Encoding: UTF-8 Depends: R (>= 3.1.2), ggplot2 (>= 2.2.0) Imports: abind, cluster, dendextend, FactoMineR, ggpubr(>= 0.1.5), grid, stats, reshape2, ggrepel, tidyr Suggests: ade4, ca, igraph, MASS, knitr, mclust URL: http://www.sthda.com/english/rpkgs/factoextra BugReports: https://github.com/kassambara/factoextra/issues Collate: 'cluster_utilities.R' 'decathlon2.R' 'print.factoextra.R' 'get_hmfa.R' 'fviz_hmfa.R' 'get_mfa.R' 'fviz_mfa.R' 'deprecated.R' 'fviz_add.R' 'eigenvalue.R' 'utilities.R' 'dist.R' 'fviz_dend.R' 'hcut.R' 'get_pca.R' 'fviz_cluster.R' 'eclust.R' 'facto_summarize.R' 'fviz.R' 'fviz_ca.R' 'fviz_contrib.R' 'fviz_cos2.R' 'fviz_ellipses.R' 'fviz_famd.R' 'get_mca.R' 'fviz_mca.R' 'fviz_mclust.R' 'fviz_nbclust.R' 'fviz_pca.R' 'fviz_silhouette.R' 'get_ca.R' 'get_clust_tendency.R' 'get_famd.R' 'hkmeans.R' 'housetasks.R' 'multishapes.R' 'poison.R' 'zzz.R' RoxygenNote: 7.1.0 NeedsCompilation: no Packaged: 2020-04-01 20:17:41 UTC; kassambara Author: Alboukadel Kassambara [aut, cre], Fabian Mundt [aut] Maintainer: Alboukadel Kassambara Repository: CRAN Date/Publication: 2020-04-01 21:20:02 UTC factoextra/R/0000755000176200001440000000000013641173345012622 5ustar liggesusersfactoextra/R/get_clust_tendency.R0000644000176200001440000001036413172626753016640 0ustar liggesusers#' @include utilities.R dist.R NULL #' Assessing Clustering Tendency #' #' @description Before applying cluster methods, the first step is to assess #' whether the data is clusterable, a process defined as the \strong{assessing #' of clustering tendency}. get_clust_tendency() assesses clustering tendency #' using Hopkins' statistic and a visual approach. An ordered dissimilarity #' image (ODI) is shown. Objects belonging to the same cluster are displayed #' in consecutive order using hierarchical clustering. For more details and #' interpretation, see #' \href{http://www.sthda.com/english/articles/29-cluster-validation-essentials/95-assessing-clustering-tendency-essentials/}{STHDA #' website: Assessing clustering tendency}. #' @param data a numeric data frame or matrix. Columns are variables and rows #' are samples. Computation are done on rows (samples) by default. If you want #' to calculate Hopkins statistic on variables, transpose the data before. #' @param n the number of points selected from sample space which is also the #' number of points selected from the given sample(data). #' @param graph logical value; if TRUE the ordered dissimilarity image (ODI) is #' shown. #' @param gradient a list containing three elements specifying the colors for #' low, mid and high values in the ordered dissimilarity image. The element #' "mid" can take the value of NULL. #' @param seed an integer specifying the seed for random number generator. #' Specify seed for reproducible results. #' @details #' #' \strong{Hopkins statistic}: If the value of Hopkins statistic is close to #' 1 (far above 0.5), then we can conclude that the dataset is significantly #' clusterable. #' #' \strong{VAT (Visual Assessment of cluster Tendency)}: The VAT detects the #' clustering tendency in a visual form by counting the number of square shaped #' dark (or colored) blocks along the diagonal in a VAT image. #' #' @return A list containing the elements: #' #' - hopkins_stat for Hopkins statistic value #' #' - plot for ordered dissimilarity image. This is generated using the #' function \code{\link{fviz_dist}}(dist.obj). #' @seealso \code{\link{fviz_dist}} #' @author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #' @examples #' data(iris) #' #' # Clustering tendency #' gradient_col = list(low = "steelblue", high = "white") #' get_clust_tendency(iris[,-5], n = 50, gradient = gradient_col) #' #' # Random uniformly distributed dataset #' # (without any inherent clusters) #' set.seed(123) #' random_df <- apply(iris[, -5], 2, #' function(x){runif(length(x), min(x), max(x))} #' ) #' get_clust_tendency(random_df, n = 50, gradient = gradient_col) #' #' @export get_clust_tendency <- function(data, n, graph = TRUE, gradient = list(low = "red", mid = "white", high = "blue"), seed = 123) { set.seed(seed) if (is.data.frame(data)) data <- as.matrix(data) if (!(is.matrix(data))) stop("data must be data.frame or matrix") if (n >= nrow(data)) stop("n must be no larger than num of samples") if (!requireNamespace("reshape2", quietly = TRUE)) { stop("reshape2 package needed for this function to work. Please install it.") } data <- na.omit(data) rownames(data) <- paste0("r", 1:nrow(data)) plot <- NULL if(graph){ plot <- fviz_dist(stats::dist(data), order = TRUE, show_labels = FALSE, gradient = gradient) } # Hopkins statistic p <- apply(data, 2, function(x, n){runif(n, min(x), max(x))}, n) k <- round(runif(n, 1, nrow(data))) q <- as.matrix(data[k, ]) distp = rep(0, nrow(data)) distq = 0 minp = rep(0, n) minq = rep(0, n) for (i in 1:n) { distp[1] <- stats::dist(rbind(p[i, ], data[1, ])) minqi <- stats::dist(rbind(q[i, ], data[1, ])) for (j in 2:nrow(data)) { distp[j] <- stats::dist(rbind(p[i, ], data[j, ])) error <- q[i, ] - data[j, ] if (sum(abs(error)) != 0) { distq <- stats::dist(rbind(q[i, ], data[j, ])) if (distq < minqi) minqi <- distq } } minp[i] <- min(distp) minq[i] <- minqi } list(hopkins_stat = sum(minp)/(sum(minp) + sum(minq)), plot = plot) }factoextra/R/facto_summarize.R0000644000176200001440000002213013637600414016130 0ustar liggesusers#' @include utilities.R get_pca.R eigenvalue.R NULL #' Subset and summarize the output of factor analyses #' #' @description Subset and summarize the results of Principal Component Analysis #' (PCA), Correspondence Analysis (CA), Multiple Correspondence Analysis #' (MCA), Factor Analysis of Mixed Data (FAMD), Multiple Factor Analysis #' (MFA) and Hierarchical Multiple Factor Analysis (HMFA) functions from several packages. #' @param X an object of class PCA, CA, MCA, FAMD, MFA and HMFA [FactoMineR]; prcomp #' and princomp [stats]; dudi, pca, coa and acm [ade4]; ca [ca package]; expoOutput [ExPosition]. #' @param element the element to subset from the output. Possible values are #' "row" or "col" for CA; "var" or "ind" for PCA and MCA; "mca.cor" for MCA; #' 'quanti.var', 'quali.var' , 'group' or 'ind' for FAMD, MFA and HMFA. #' @param result the result to be extracted for the element. Possible values are #' the combination of c("cos2", "contrib", "coord") #' @param group.names a vector containing the name of the groups (by default, #' NULL and the group are named group.1, group.2 and so on). #' @param node.level a single number indicating the HMFA node level. #' @param axes a numeric vector specifying the axes of interest. Default values #' are 1:2 for axes 1 and 2. #' @param select a selection of variables. Allowed values are NULL or a list #' containing the arguments name, cos2 or contrib. Default is list(name = #' NULL, cos2 = NULL, contrib = NULL): \itemize{ \item name: is a character #' vector containing variable names to be selected \item cos2: if cos2 is in #' [0, 1], ex: 0.6, then variables with a cos2 > 0.6 are selected. if cos2 > #' 1, ex: 5, then the top 5 variables with the highest cos2 are selected \item #' contrib: if contrib > 1, ex: 5, then the top 5 variables with the highest #' cos2 are selected. } #' @return A data frame containing the (total) coord, cos2 and the contribution #' for the axes. #' @details If length(axes) > 1, then the columns contrib and cos2 correspond to #' the total contributions and total cos2 of the axes. In this case, the #' column coord is calculated as x^2 + y^2 + ...+; x, y, ... are the #' coordinates of the points on the specified axes. #' @author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #' @references http://www.sthda.com/english/ #' @examples #' # Principal component analysis #' # +++++++++++++++++++++++++++++ #' data(decathlon2) #' decathlon2.active <- decathlon2[1:23, 1:10] #' res.pca <- prcomp(decathlon2.active, scale = TRUE) #' #' # Summarize variables on axes 1:2 #' facto_summarize(res.pca, "var", axes = 1:2)[,-1] #' # Select the top 5 contributing variables #' facto_summarize(res.pca, "var", axes = 1:2, #' select = list(contrib = 5))[,-1] #' # Select variables with cos2 >= 0.6 #' facto_summarize(res.pca, "var", axes = 1:2, #' select = list(cos2 = 0.6))[,-1] #' # Select by names #' facto_summarize(res.pca, "var", axes = 1:2, #' select = list(name = c("X100m", "Discus", "Javeline")))[,-1] #' #' # Summarize individuals on axes 1:2 #' facto_summarize(res.pca, "ind", axes = 1:2)[,-1] #' #' # Correspondence Analysis #' # ++++++++++++++++++++++++++ #' # Install and load FactoMineR to compute CA #' # install.packages("FactoMineR") #' library("FactoMineR") #' data("housetasks") #' res.ca <- CA(housetasks, graph = FALSE) #' # Summarize row variables on axes 1:2 #' facto_summarize(res.ca, "row", axes = 1:2)[,-1] #' # Summarize column variables on axes 1:2 #' facto_summarize(res.ca, "col", axes = 1:2)[,-1] #' #' # Multiple Correspondence Analysis #' # +++++++++++++++++++++++++++++++++ #' library(FactoMineR) #' data(poison) #' res.mca <- MCA(poison, quanti.sup = 1:2, #' quali.sup = 3:4, graph=FALSE) #' # Summarize variables on axes 1:2 #' res <- facto_summarize(res.mca, "var", axes = 1:2) #' head(res) #' # Summarize individuals on axes 1:2 #' res <- facto_summarize(res.mca, "ind", axes = 1:2) #' head(res) #' #' # Multiple factor Analysis #' # +++++++++++++++++++++++++++++++++ #' library(FactoMineR) #' data(poison) #' res.mfa <- MFA(poison, group=c(2,2,5,6), type=c("s","n","n","n"), #' name.group=c("desc","desc2","symptom","eat"), #' num.group.sup=1:2, graph=FALSE) #' # Summarize categorcial variables on axes 1:2 #' res <- facto_summarize(res.mfa, "quali.var", axes = 1:2) #' head(res) #' # Summarize individuals on axes 1:2 #' res <- facto_summarize(res.mfa, "ind", axes = 1:2) #' head(res) #' @export facto_summarize <- function(X, element, node.level = 1, group.names, result = c("coord", "cos2", "contrib"), axes=1:2, select = NULL) { # check element allowed_elmts <- c("row", "col", "var", "ind", "quanti.var", "quali.var", "mca.cor", "quanti.sup", "group", "partial.axes", "partial.node") if(!element %in% allowed_elmts) stop("Can't handle element = '", element, "'") if(element %in% c("mca.cor", "quanti.sup")) { if(!inherits(X, "MCA")) stop("element = 'mca_cor' is supported only for FactoMineR::MCA().") result <- NULL } # Check and get the classe of X facto_class <- .get_facto_class(X) # Extract the element element <- element[1] elmt <- switch(facto_class, CA = get_ca(X, element), PCA = get_pca(X, element), MCA = get_mca(X, element), FAMD = get_famd(X, element), MFA = get_mfa(X, element), HMFA = get_hmfa(X, element) ) # Check axes if(inherits(elmt, "hmfa_partial")) ndim <- ncol(elmt[[1]]) else ndim <- ncol(elmt$coord) if(max(axes) > ndim) stop("The value of the argument axes is incorrect. ", "The number of axes in the data is: ", ncol(elmt$coord), ". Please try again with axes between 1 - ", ncol(elmt$coord)) # Summarize the result res = NULL if(element %in% c("mca.cor", "quanti.sup")) res <- elmt$coord # 1.Extract the coordinates x, y and coord if("coord" %in% result){ dd <- data.frame(elmt$coord[, axes, drop=FALSE], stringsAsFactors = TRUE) coord <- apply(dd^2, 1, sum) # x^2 + y2 + ... res = cbind(dd, coord = coord) } # 2. Extract the cos2 if("cos2" %in% result){ cos2 <- elmt$cos2[, axes] if(length(axes) > 1) cos2 <- apply(cos2, 1, sum, na.rm=TRUE) res <- cbind(res, cos2 = cos2) } # 3. Extract the contribution if("contrib" %in% result){ contrib <- elmt$contrib[, axes] if(length(axes) > 1) { eig <- get_eigenvalue(X)[axes,1] # Adjust variable contributions by the Dimension eigenvalues contrib <- t(apply(contrib, 1, function(var.contrib, pc.eig){var.contrib*pc.eig}, eig)) contrib <-apply(contrib, 1, sum)/sum(eig) } res <- cbind(res, contrib = contrib) } # 4.Extract the coordinates x, y and coord partial - MFA if("coord.partial" %in% result){ dd <- data.frame(elmt$coord.partiel[, axes, drop=FALSE], stringsAsFactors = TRUE) # groupnames groupnames <- lapply(rownames(dd), function(x){ # split at the first instance of "." str_split <- strsplit(sub(".", "\01", x, fixed = TRUE), "\01", fixed = TRUE) unlist(str_split) } ) groupnames <- as.data.frame(do.call(rbind, groupnames), stringsAsFactors = TRUE) colnames(groupnames) <- c("name", "group.name") coord.partial <- apply(dd^2, 1, sum) # x^2 + y2 + ... res.partial <- data.frame(groupnames, dd, coord.partial, stringsAsFactors = TRUE) } # 5. Extract the coordinates x, y and coord partial - HMFA if("coord.node.partial" %in% result){ # Select hierarchical node node <- as.data.frame(elmt[[node.level]], stringsAsFactors = TRUE) name <- rep(rownames(node), length(group.names)) # Prepare data set dim.group <- dim.names <- dd <- coord.partial <- dim.coord <- dim.name <- NULL for(i in axes[1]:length(axes)) { dim.group <- NULL for(j in 1:length(group.names)) { dim.name <- paste0("Dim", axes[i], ".", j) dim.coord <- abind::abind(dim.coord, node[,dim.name]) dim.group <- c(dim.group, rep(group.names[j], length(node[,dim.name]))) } dim.names <- c(dim.names, paste0("Dim", axes[i])) dd <- cbind(dd, dim.coord) dim.coord <- NULL } colnames(dd) <- dim.names coord.partial <- apply(dd^2, 1, sum) # x^2 + y2 + ... res.partial <- data.frame(group.name = dim.group, name, dd, coord.partial, stringsAsFactors = TRUE) } if("coord.node.partial" %in% result) res <- res.partial else { name <- rownames(elmt$coord) if(is.null(name)) name <- as.character(1:nrow(elmt$coord)) name <- as.character(name) res <- cbind.data.frame(name = name, res, stringsAsFactors = TRUE) rownames(res) <- name if(!is.null(select)) res <- .select(res, select) if("coord.partial" %in% result){ res = list(res = res, res.partial = res.partial) } } res } factoextra/R/hcut.R0000644000176200001440000000722313144620011013675 0ustar liggesusers#' @include cluster_utilities.R dist.R NULL #' Computes Hierarchical Clustering and Cut the Tree #' #' @description #' Computes hierarchical clustering (hclust, agnes, diana) and cut the tree into k clusters. It also accepts #' correlation based distance measure methods such as "pearson", "spearman" and "kendall". #' @param x a numeric matrix, numeric data frame or a dissimilarity matrix. #' @param k the number of clusters to be generated. #' @param hc_method the agglomeration method to be used (?hclust) for hclust() and agnes(): #' "ward.D", "ward.D2", "single", "complete", "average", ... #' @param hc_metric character string specifying the metric to be used for calculating #' dissimilarities between observations. Allowed values are those accepted by the function dist() [including "euclidean", "manhattan", "maximum", #' "canberra", "binary", "minkowski"] and correlation based distance measures ["pearson", "spearman" or "kendall"]. #' @param stand logical value; default is FALSE. If TRUE, then the data will be standardized using the function scale(). #' Measurements are standardized for each variable (column), by subtracting the variable's mean value and #' dividing by the variable's standard deviation. #' @param isdiss logical value specifying wether x is a dissimilarity matrix. #' @param hc_func the hierarchical clustering function to be used. Default value is "hclust". Possible values #' is one of "hclust", "agnes", "diana". Abbreviation is allowed. #' @param graph logical value. If TRUE, the dendrogram is displayed. #' @param ... not used. #' @return an object of class "hcut" containing the result #' of the standard function used (read the documentation of hclust, agnes, diana). #' #' It includes also: #' \itemize{ #' \item cluster: the cluster assignement of observations after cutting the tree #' \item nbclust: the number of clusters #' \item silinfo: the silhouette information of observations (if k > 1) #' \item size: the size of clusters #' \item data: a matrix containing the original or the standardized data (if stand = TRUE) #' } #' #' @seealso \code{\link{fviz_dend}}, \code{\link{hkmeans}}, \code{\link{eclust}} #' @examples #' \donttest{ #' data(USArrests) #' #' # Compute hierarchical clustering and cut into 4 clusters #' res <- hcut(USArrests, k = 4, stand = TRUE) #' #' # Cluster assignements of observations #' res$cluster #' # Size of clusters #' res$size #' #' # Visualize the dendrogram #' fviz_dend(res, rect = TRUE) #' #' # Visualize the silhouette #' fviz_silhouette(res) #' #' # Visualize clusters as scatter plots #' fviz_cluster(res) #' } #' #' @export hcut <- function(x, k = 2, isdiss = inherits(x, "dist"), hc_func = c("hclust", "agnes", "diana"), hc_method = "ward.D2", hc_metric = "euclidean", stand = FALSE, graph = FALSE, ...){ if(!inherits(x, c("matrix", "data.frame", "dist"))) stop("The data must be of class matrix, data.frame, or dist") if(stand) x <- scale(x) data <- x hc_func <- match.arg(hc_func) hc_func <- hc_func[1] if(!isdiss) x <- get_dist(x, method = hc_metric) if(hc_func == "hclust") hc <- stats::hclust(x, method = hc_method) else if(hc_func == "agnes") { if(hc_method %in%c("ward.D", "ward.D2")) hc_method = "ward" hc <- cluster::agnes(x, method = hc_method) } else if(hc_func == "diana") hc <- cluster::diana(x) else stop("Don't support the function ", hc_func) hc.cut <- stats::cutree(hc, k = k) hc$cluster = hc.cut hc$nbclust <- k if(k > 1) hc$silinfo <- .get_silinfo(hc.cut, x) hc$size <- as.vector(table(hc.cut)) hc$data <- data class(hc) <- c(class(hc), "hcut") if(graph) fviz_dend(hc) hc } factoextra/R/fviz_dend.R0000644000176200001440000004604213637601121014714 0ustar liggesusers#' Enhanced Visualization of Dendrogram #' #' @description Draws easily beautiful dendrograms using either R base plot or #' ggplot2. Provides also an option for drawing a circular dendrogram and #' phylogenic trees. #' @param x an object of class dendrogram, hclust, agnes, diana, hcut, #' hkmeans or HCPC (FactoMineR). #' @param k the number of groups for cutting the tree. #' @param h a numeric value. Cut the dendrogram by cutting at height h. (k #' overrides h) #' @param k_colors,palette a vector containing colors to be used for the groups. #' It should contains k number of colors. Allowed values include also "grey" #' for grey color palettes; brewer palettes e.g. "RdBu", "Blues", ...; and #' scientific journal palettes from ggsci R package, e.g.: "npg", "aaas", #' "lancet", "jco", "ucscgb", "uchicago", "simpsons" and "rickandmorty". #' @param show_labels a logical value. If TRUE, leaf labels are shown. Default #' value is TRUE. #' @param color_labels_by_k logical value. If TRUE, labels are colored #' automatically by group when k != NULL. #' @param label_cols a vector containing the colors for labels. #' @param labels_track_height a positive numeric value for adjusting the room for the #' labels. Used only when type = "rectangle". #' @param repel logical value. Use repel = TRUE to avoid label overplotting when #' type = "phylogenic". #' @param lwd a numeric value specifying branches and rectangle line width. #' @param type type of plot. Allowed values are one of "rectangle", "triangle", #' "circular", "phylogenic". #' @param phylo_layout the layout to be used for phylogenic trees. Default value #' is "layout.auto". Allowed values include: #' \code{\link[igraph]{layout.auto}}, \code{\link[igraph]{layout_with_drl}}, #' \code{\link[igraph]{layout_as_tree}}, \code{\link[igraph]{layout.gem}}, #' \code{\link[igraph]{layout.mds}} and \code{\link[igraph]{layout_with_lgl}}. #' @param rect logical value specifying whether to add a rectangle around #' groups. Used only when k != NULL. #' @param rect_border,rect_lty border color and line type for rectangles. #' @param rect_fill a logical value. If TRUE, fill the rectangle. #' @param lower_rect a value of how low should the lower part of the rectangle #' around clusters. Ignored when rect = FALSE. #' @param horiz a logical value. If TRUE, an horizontal dendrogram is drawn. #' @param cex size of labels #' @param main,xlab,ylab main and axis titles #' @param sub Plot subtitle. If NULL, the method used hierarchical clustering is #' shown. To remove the subtitle use sub = "". #' @param ggtheme function, ggplot2 theme name. Default value is #' theme_classic(). Allowed values include ggplot2 official themes: #' theme_gray(), theme_bw(), theme_minimal(), theme_classic(), theme_void(), #' .... #' @param ... other arguments to be passed to the function plot.dendrogram() #' @return an object of class fviz_dend which is a ggplot with the attributes #' "dendrogram" accessible using attr(x, "dendrogram"), where x is the result #' of fviz_dend(). #' @examples #' \donttest{ #' # Load and scale the data #' data(USArrests) #' df <- scale(USArrests) #' #' # Hierarchical clustering #' res.hc <- hclust(dist(df)) #' #' # Default plot #' fviz_dend(res.hc) #' #' # Cut the tree #' fviz_dend(res.hc, cex = 0.5, k = 4, color_labels_by_k = TRUE) #' #' # Don't color labels, add rectangles #' fviz_dend(res.hc, cex = 0.5, k = 4, #' color_labels_by_k = FALSE, rect = TRUE) #' #' # Change the color of tree using black color for all groups #' # Change rectangle border colors #' fviz_dend(res.hc, rect = TRUE, k_colors ="black", #' rect_border = 2:5, rect_lty = 1) #' #' # Customized color for groups #' fviz_dend(res.hc, k = 4, #' k_colors = c("#1B9E77", "#D95F02", "#7570B3", "#E7298A")) #' #' #' # Color labels using k-means clusters #' km.clust <- kmeans(df, 4)$cluster #' fviz_dend(res.hc, k = 4, #' k_colors = c("blue", "green3", "red", "black"), #' label_cols = km.clust[res.hc$order], cex = 0.6) #' #' } #' @export fviz_dend <- function(x, k = NULL, h = NULL, k_colors = NULL, palette = NULL, show_labels = TRUE, color_labels_by_k = TRUE, label_cols = NULL, labels_track_height = NULL, repel = FALSE, lwd = 0.7, type = c("rectangle", "circular", "phylogenic"), phylo_layout = "layout.auto", rect = FALSE, rect_border = "gray", rect_lty = 2, rect_fill = FALSE, lower_rect, horiz = FALSE, cex = 0.8, main = "Cluster Dendrogram", xlab = "", ylab = "Height", sub = NULL, ggtheme = theme_classic(), ...) { # if(.is_col_palette(k_colors)) palette <- k_colors # else palette <- NULL if(missing(k_colors) & !is.null(palette)) { k_colors <- palette palette <- NULL } if(!color_labels_by_k & is.null(label_cols)) label_cols <- "black" type <- match.arg(type) circular <- type == "circular" phylogenic <- type == "phylogenic" rectangle <- type == "rectangle" if(inherits(x, "HCPC")){ k <- length(unique(x$data.clust$clust)) #k <- x$call$t$nb.clust x <- x$call$t$tree #hclust } if(inherits(x, "hcut")){ k <- x$nbclust dend <- as.dendrogram(x) method <- x$method } else if(inherits(x, "hkmeans")){ k <- length(unique(x$cluster)) dend <- as.dendrogram(x$hclust) method <- x$hclust$method } else if(inherits(x, c("hclust", "agnes", "diana"))) { dend <- as.dendrogram(x) method <- x$method } else if(inherits(x, "dendrogram")) { dend <- x method <- "" } else stop("Can't handle an object of class ", paste(class(x), collapse =", ") ) if(is.null(method)) method <- "" else if(is.na(method)) method <- "" if(is.null(sub) & method!="") sub = paste0("Method: ", method) if(!is.null(dendextend::labels_cex(dend))) cex <- dendextend::labels_cex(dend) dend <- dendextend::set(dend, "labels_cex", cex) dend <- dendextend::set(dend, "branches_lwd", lwd) k <- .get_k(dend, k, h) if(!is.null(k)) { if(ggpubr:::.is_col_palette(k_colors)) k_colors <- ggpubr:::.get_pal(k_colors, k = k) else if(is.null(k_colors)) k_colors <- ggpubr:::.get_pal("default", k = k) dend <- dendextend::set(dend, what = "branches_k_color", k = k, value = k_colors) if(color_labels_by_k) dend <- dendextend::set(dend, "labels_col", k = k, value = k_colors) } if(!is.null(label_cols)){ dend <- dendextend::set(dend, "labels_col", label_cols) } leaflab <- ifelse(show_labels, "perpendicular", "none") if(xlab =="") xlab <- NULL if(ylab=="") ylab <- NULL max_height <- max(dendextend::get_branches_heights(dend)) if(missing(labels_track_height)) labels_track_height <- max_height/8 if(max_height < 1) offset_labels <- -max_height/100 else offset_labels <- -0.1 if(rectangle | circular){ p <- .ggplot_dend(dend, type = "rectangle", offset_labels = offset_labels, nodes = FALSE, ggtheme = ggtheme, horiz = horiz, circular = circular, palette = palette, labels = show_labels, label_cols = label_cols, labels_track_height = labels_track_height, ...) if(!circular) p <- p + labs(title = main, x = xlab, y = ylab) } else if(phylogenic){ p <- .phylogenic_tree(dend, labels = show_labels, label_cols = label_cols, palette = palette, repel = repel, ggtheme = ggtheme, phylo_layout = phylo_layout, ...) } # base plot # else{ # plot(dend, type = type[1], xlab = xlab, ylab = ylab, main = main, # leaflab = leaflab, sub = sub, horiz = horiz,...) # if(rect & !is.null(k)) # dendextend::rect.dendrogram(dend, k=k, border = rect_border, # lty = rect_lty, lwd = lwd) # } # Add rectangle around clusters if(circular | phylogenic | is.null(k)) rect <- FALSE if(rect_fill & missing(rect_lty)) rect_lty = "blank" if(missing(lower_rect)) lower_rect = -(labels_track_height+0.5) if(rect){ p <- p + .rect_dendrogram(dend, k = k, palette = rect_border, rect_fill = rect_fill, rect_lty = rect_lty, size = lwd, lower_rect = lower_rect) } attr(p, "dendrogram") <- dend structure(p, class = c(class(p), "fviz_dend")) return(p) } # require igraph .phylogenic_tree <- function(dend, labels = TRUE, label_cols = NULL, palette = NULL, repel = FALSE, ggtheme = theme_classic(), phylo_layout = "layout.auto", ...){ if (!requireNamespace("igraph", quietly = TRUE)) { stop("igraph package needed for phylogenic tree. Please install it using install.packages('igraph').") } allowed_layouts <- c("layout.auto", "layout_with_drl", "layout_as_tree", "layout.gem", "layout.mds", "layout_with_lgl") if(!(phylo_layout %in% allowed_layouts)) stop( phylo_layout, " is not supported as layout. ", "Allowed phylogenic layout are: ", paste( allowed_layouts, collapse = ", ")) layout_func <- switch(phylo_layout, layout.auto = igraph::layout.auto, layout_with_drl = igraph::layout_with_drl, layout_as_tree = igraph::layout_as_tree, layout.gem = igraph::layout.gem, layout.mds = igraph::layout.mds, layout_with_lgl = igraph::layout_with_lgl ) # Convert to 'phylo' object hc <- stats::as.hclust(dend) phylo_tree <- .as.phylo(hc) graph_edges <- phylo_tree$edge # get graph from edge list graph_net <- igraph::graph.edgelist(graph_edges) # extract layout (x-y coords) set.seed(123) graph_layout = layout_func(graph_net) # number of observations nobs <- length(hc$labels) # draw tree branches data.segments <- data.frame( x = graph_layout[graph_edges[,1],1], y = graph_layout[graph_edges[,1],2], xend = graph_layout[graph_edges[,2],1], yend = graph_layout[graph_edges[,2],2], stringsAsFactors = TRUE ) data.labels <- data.frame( x = graph_layout[1:nobs,1], y = graph_layout[1:nobs,2], label = phylo_tree$tip.label, stringsAsFactors = TRUE ) data.labels <- data.labels[order(as.vector(data.labels$label)), ] # Support for dendextend gdend <- dendextend::as.ggdend(dend) gdat <- dendextend::prepare.ggdend(gdend) gdat$labels <- gdat$labels[order(as.vector(gdat$labels$label)), ] data.labels <- cbind(data.labels, gdat$labels[, c("col", "cex")]) if(!is.null(dendextend::labels_cex(dend))) font.label <- round(dendextend::labels_cex(dend)[1]*12) else font.label <- 12 p <- ggplot() + geom_segment(data = data.segments, aes_string(x = "x", y = "y", xend = "xend", yend = "yend"), lineend = "square") if(is.null(label_cols)) label_cols <- "col" if(!labels) labels <- NULL else labels <- "label" p <- ggpubr::ggscatter(data.labels, "x", "y", label = labels, color = label_cols, ggp = p, repel = repel, font.label = font.label, ...) if(is.null(palette)) p <- p + scale_colour_identity() p <- ggpubr::ggpar(p, ggtheme = ggtheme, palette = palette, ...) p <- p + theme(axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text= element_blank(), axis.line = element_blank(), axis.ticks = element_blank(), legend.position = "none") p } # Helper functions #%%%%%%%%%%%%%%%%%%%% # Plot dendrogram using ggplot # .ggplot_dend derrived from dendextend::ggplot.ggdend # data: a ggdend class object. .ggplot_dend <- function (dend, segments = TRUE, labels = TRUE, nodes = TRUE, horiz = FALSE, ggtheme = theme_classic(), offset_labels = 0, circular = FALSE, type = "rectangle", palette = NULL, label_cols = NULL, labels_track_height = 1, ...) { gdend <- dendextend::as.ggdend(dend, type = type) #angle <- ifelse(horiz, 0, 90) #hjust <- ifelse(horiz, 0, 1) gdend$labels$angle <- ifelse(horiz, 0, 90) gdend$labels$hjust <- ifelse(horiz, 0, 1) gdend$labels$vjust <- 0.5 if(circular){ # If circular, change the angle and hjust so that the labels rotate if(circular) { pms <- .get_label_params(gdend$labels) gdend$labels$angle <- pms$angle gdend$labels$hjust <- pms$hjust } } data <- dendextend::prepare.ggdend(gdend) # To avoid overlaping of labels at coord_polar start if(circular) { n_rows <- nrow(data$labels) data$labels$x[1] <- 0.7 data$labels$vjust[1] <- 1.7 } p <- ggplot() if (segments) { p <- p + geom_segment(data = data$segments, aes_string(x = "x", y = "y", xend = "xend", yend = "yend", colour = "col", linetype = "lty", size = "lwd"), lineend = "square") + guides(linetype = FALSE, col = FALSE) + #scale_colour_identity() + scale_size_identity() + scale_linetype_identity() if(is.null(palette)) p <- p + scale_colour_identity() } if (nodes) { p <- p + geom_point(data = data$nodes, aes_string(x = "x", y = "y", colour = "col", shape = "pch", size = "cex")) + guides(shape = FALSE, col = FALSE, size = FALSE) + scale_shape_identity() } if (labels) { data$labels$cex <- 5 * data$labels$cex data$labels$y <- data$labels$y + offset_labels if(is.null(label_cols)) label_cols <- "col" p <- p + ggpubr::geom_exec(geom_text, data = data$labels, x = "x", y = "y", label = "label", color = label_cols, size = "cex", angle = "angle", hjust = "hjust", vjust = "vjust") } p <- ggpubr::ggpar(p, ggtheme = ggtheme, palette = palette, ...) + theme(axis.line = element_blank()) if (horiz & !circular) { p <- p + coord_flip() + scale_y_reverse()+ theme(axis.text.y = element_blank(), axis.ticks.y = element_blank(), axis.text.x = element_text()) } else p <- p + theme(axis.text.x = element_blank(), axis.ticks.x = element_blank()) if(circular){ p <- p + theme(plot.margin = margin(0, 0, 0, 0), axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text= element_blank(), axis.line = element_blank(), axis.ticks = element_blank())+ ylim(max(dendextend::get_branches_heights(dend)), -1)+ coord_polar(theta = 'x', direction = 1) } else{ p <- p + expand_limits(y=-labels_track_height) } p } # Function used for circular dendrogram #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Create the angle and hjust vectors so that the labels # rotation switches from 6 o'clock to 12 o'clock to improve readability. .get_label_params <- function(labeldf) { nn <- length(labeldf$y) halfn <- floor(nn/2) firsthalf <- rev(90 + seq(0,360, length.out = nn)) secondhalf <- rev(-90 + seq(0,360, length.out = nn)) angle <- numeric(nn) angle[1:halfn] <- firsthalf[1:halfn] angle[(halfn+1):nn] <- secondhalf[(halfn+1):nn] hjust <- numeric(nn) hjust[1:halfn] <- 0 hjust[(halfn+1):nn] <- 1 return(list(angle = angle, hjust = hjust)) } # Convert 'hclust' to 'phylo' object # used for phylogenic tree #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # from ape::as.phylo.hclust # x hclust .as.phylo <- function (x, ...) { N <- dim(x$merge)[1] edge <- matrix(0L, 2 * N, 2) edge.length <- numeric(2 * N) node <- integer(N) node[N] <- N + 2L cur.nod <- N + 3L j <- 1L for (i in N:1) { edge[j:(j + 1), 1] <- node[i] for (l in 1:2) { k <- j + l - 1L y <- x$merge[i, l] if (y > 0) { edge[k, 2] <- node[y] <- cur.nod cur.nod <- cur.nod + 1L edge.length[k] <- x$height[i] - x$height[y] } else { edge[k, 2] <- -y edge.length[k] <- x$height[i] } } j <- j + 2L } if (is.null(x$labels)) x$labels <- as.character(1:(N + 1)) obj <- list(edge = edge, edge.length = edge.length/2, tip.label = x$labels, Nnode = N) class(obj) <- "phylo" obj #ape::reorder.phylo(obj) } # Get k value if h specified # Make also some checking # dend a dendrogram object # h: tree height .get_k <- function(dend, k = NULL, h = NULL){ if (!dendextend::is.dendrogram(dend)) stop("x is not a dendrogram object.") if (length(h) > 1L | length(k) > 1L) stop("'k' and 'h' must be a scalar(i.e.: of length 1)") tree_heights <- dendextend::heights_per_k.dendrogram(dend)[-1] tree_order <- stats::order.dendrogram(dend) if (!is.null(h)) { if (!is.null(k)) stop("specify exactly one of 'k' and 'h'") ss_ks <- tree_heights < h k <- min(as.numeric(names(ss_ks))[ss_ks]) k <- max(k, 2) } k } # Add rectangle to a dendrogram # lower_rect: a (scalar) value of how low should the lower part of the rect be. .rect_dendrogram <- function (dend, k = NULL, h = NULL, k_colors = NULL, palette = NULL, rect_fill = FALSE, rect_lty = 2, lower_rect=-1.5, ...) { if(missing(k_colors) & !is.null(palette)) k_colors <- palette # value (should be between 0 to 1): proportion of the height # our rect will be between the height needed for k and k+1 clustering. prop_k_height <- 0.5 if (!dendextend::is.dendrogram(dend)) stop("x is not a dendrogram object.") k <- .get_k(dend, k, h) tree_heights <- dendextend::heights_per_k.dendrogram(dend)[-1] tree_order <- stats::order.dendrogram(dend) if (is.null(k)) stop("specify k") if (k < 2) { stop(gettextf("k must be between 2 and %d", length(tree_heights)), domain = NA) } cluster <- dendextend::cutree(dend, k = k) clustab <- table(cluster)[unique(cluster[tree_order])] m <- c(0, cumsum(clustab)) which <- 1L:k xleft <- ybottom <- xright <- ytop <- list() for (n in seq_along(which)) { next_k_height <- tree_heights[names(tree_heights) == k + 1] if (length(next_k_height) == 0) { next_k_height <- 0 prop_k_height <- 1 } xleft[[n]] = m[which[n]] + 0.66 ybottom[[n]] = lower_rect xright[[n]] = m[which[n] + 1] + 0.33 ytop[[n]] <- tree_heights[names(tree_heights) == k] * prop_k_height + next_k_height * (1 - prop_k_height) } df <- data.frame(xmin = unlist(xleft), ymin = unlist(ybottom), xmax = unlist(xright), ymax = unlist(ytop), stringsAsFactors = TRUE) color <- k_colors if(color == "cluster") color <- "default" if(ggpubr:::.is_col_palette(color)) color <- ggpubr:::.get_pal(color, k = k) else if(length(color) > 1 & length(color) < k){ color <- rep(color, k)[1:k] } if(rect_fill){ fill <- color alpha <- 0.2 } else { fill <- "transparent" alpha <- 0 } df$color <- color df$cluster <- as.factor(paste0("c", 1:k)) ggpubr::geom_exec(geom_rect, data = df, xmin = "xmin", ymin = "ymin", xmax = "xmax", ymax = "ymax", fill = fill, color = color, linetype = rect_lty, alpha = alpha, ...) } factoextra/R/housetasks.R0000644000176200001440000000135613144620011015124 0ustar liggesusers#'House tasks contingency table #' #'@description A data frame containing the frequency of execution of 13 house #' tasks in the couple. This table is also available in ade4 package. #'@name housetasks #'@docType data #'@usage data("housetasks") #'@format #' A data frame with 13 observations (house tasks) on the following 4 columns. #' \describe{ #' \item{\code{Wife}}{a numeric vector} #' \item{\code{Alternating}}{a numeric vector} #' \item{\code{Husband}}{a numeric vector} #' \item{\code{Jointly}}{a numeric vector} #' } #'@source This data is from FactoMineR package. #' #' @examples #' library(FactoMineR) #' data(housetasks) #' res.ca <- CA(housetasks, graph=FALSE) #' fviz_ca_biplot(res.ca, repel = TRUE)+ #' theme_minimal() #' NULLfactoextra/R/zzz.R0000644000176200001440000000023513151214542013571 0ustar liggesusers.onAttach <- function(libname, pkgname) { packageStartupMessage("Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa") }factoextra/R/get_mfa.R0000644000176200001440000001177413144620011014342 0ustar liggesusers#' @include print.factoextra.R NULL #' Extract the results for individuals/variables/group/partial axes - MFA #' #' @description #' Extract all the results (coordinates, squared cosine and contributions) #' for the active individuals/quantitative variables/qualitative variable categories/groups/partial axes from Multiple Factor Analysis (MFA) outputs.\cr\cr #' \itemize{ #' \item get_mfa(): Extract the results for variables and individuals #' \item get_mfa_ind(): Extract the results for individuals only #' \item get_mfa_var(): Extract the results for variables (quantitatives, qualitatives and groups) #' \item get_mfa_partial_axes(): Extract the results for partial axes only #' } #' #' #' @param res.mfa an object of class MFA [FactoMineR]. #' @param element the element to subset from the output. Possible values are "ind", "quanti.var", "quali.var", "group" or "partial.axes". #' @return a list of matrices containing the results for the active #' individuals/quantitative variable categories/qualitative variable categories/groups/partial axes including : #' \item{coord}{coordinates for the individuals/quantitative variable categories/qualitative variable categories/groups/partial axes} #' \item{cos2}{cos2 for the individuals/quantitative variable categories/qualitative variable categories/groups/partial axes} #' \item{contrib}{contributions of the individuals/quantitative variable categories/qualitative variable categories/groups/partial axes} #' \item{inertia}{inertia of the individuals/quantitative variable categories/qualitative variable categories/groups/partial axes} #' @author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #' @author Fabian Mundt \email{f.mundt@@inventionate.de} #' @examples #' # Multiple Factor Analysis #' # ++++++++++++++++++++++++ #' # Install and load FactoMineR to compute MFA #' # install.packages("FactoMineR") #' library("FactoMineR") #' data(poison) #' res.mfa <- MFA(poison, group=c(2,2,5,6), type=c("s","n","n","n"), #' name.group=c("desc","desc2","symptom","eat"), num.group.sup=1:2, #' graph = FALSE) #' #' # Extract the results for qualitative variable categories #' var <- get_mfa_var(res.mfa, "quali.var") #' print(var) #' head(var$coord) # coordinates of qualitative variables #' head(var$cos2) # cos2 of qualitative variables #' head(var$contrib) # contributions of qualitative variables #' #' # Extract the results for individuals #' ind <- get_mfa_ind(res.mfa) #' print(ind) #' head(ind$coord) # coordinates of individuals #' head(ind$cos2) # cos2 of individuals #' head(ind$contrib) # contributions of individuals #' #' # You can also use the function get_mfa() #' get_mfa(res.mfa, "ind") # Results for individuals #' get_mfa(res.mfa, "quali.var") # Results for qualitative variable categories #' #' @name get_mfa #' #' @rdname get_mfa #' @export get_mfa <- function(res.mfa, element = c("ind", "quanti.var", "quali.var", "group", "partial.axes")){ elmt <- match.arg(element) if(elmt == "ind") get_mfa_ind(res.mfa) else if(elmt %in% c("quanti.var", "quali.var", "group")) get_mfa_var(res.mfa, elmt) else if(elmt == "partial.axes") get_mfa_partial_axes(res.mfa) } #' @rdname get_mfa #' @export get_mfa_ind <- function(res.mfa){ # FactoMineR package if(inherits(res.mfa, c("MFA"))) ind <- res.mfa$ind # @todo ade4 Support muss noch eingebaut werden! else stop("An object of class : ", class(res.mfa), " can't be handled by the function get_mfa_ind()") class(ind)<-c("factoextra", "mfa", "mfa_ind") attr(ind, "element") <- "individuals" return(ind) } #' @rdname get_mfa #' @export get_mfa_var <- function(res.mfa, element = c( "quanti.var", "quali.var", "group")){ choice <- match.arg(element) if(!inherits(res.mfa, "MFA")) stop("An object of class : ", class(res.mfa), " can't be handled.") if(choice == "quanti.var" & is.null(res.mfa$quanti.var)) stop("There are no quantitative variables in this MFA.") else if(choice == "quali.var" & is.null(res.mfa$quali.var)) stop("There are no qualitative variables in this MFA.") vars <- switch(choice, quanti.var = res.mfa$quanti.var, quali.var = res.mfa$quali.var, group = res.mfa$group ) element_desc <- switch(choice, quanti.var = "quantitative variables", quali.var = "qualitative variable categories", group = "variable groups" ) class(vars)<-c("factoextra", "mfa", paste0("mfa_", gsub(".", "_", choice, fixed = TRUE))) attr(vars, "element") <- element_desc return(vars) } #' @rdname get_mfa #' @export get_mfa_partial_axes <- function(res.mfa){ # FactoMineR package if(inherits(res.mfa, c("MFA"))) partial_axes <- res.mfa$partial.axes else stop("An object of class : ", class(res.mfa), " can't be handled by the function get_mfa_partial_axes()") class(partial_axes)<-c("factoextra", "mfa", "mfa_partial_axes") attr(partial_axes, "element") <- "partial axes" return(partial_axes) }factoextra/R/deprecated.R0000644000176200001440000001125113144620011015026 0ustar liggesusers#' @include print.factoextra.R fviz_mfa.R fviz_hmfa.R NULL #' Deprecated Functions #' #' @description Deprecated functions. Will be removed in the next version. #' #' \itemize{ #' \item get_mfa_var_quanti(). Deprecated. Use get_mfa_var(res.mfa, "quanti.var") instead. #' \item get_mfa_var_quali(). Deprecated. Use get_mfa_var(res.mfa, "quali.var") instead. #' \item get_mfa_group(). Deprecated. Use get_mfa_var(res.mfa, "group") instead. #' #' \item{fviz_mfa_ind_starplot(): Star graph of individuals (draws partial points). #' Deprecated. Use fviz_mfa_ind(res.mfa, partial = "All") instead.} #' \item{fviz_mfa_quanti_var(): Graph of quantitative variables. Deprecated. Use fviz_mfa(X, "quanti.var") instead.} #' \item{fviz_mfa_quali_var(): Graph of qualitative variables. Deprecated. Use fviz_mfa(X, "quali.var") instead.} #' #' \item #' get_hmfa_var_quanti(). Deprecated. Use get_hmfa_var(res.hmfa, "quanti.var") #' instead. \item get_hmfa_var_quali(). Deprecated. Use get_hmfa_var(res.hmfa, #' "quali.var") instead. \item get_hmfa_group(). Deprecated. Use #' get_hmfa_var(res.hmfa, "group") instead. #' #' \item{fviz_hmfa_ind_starplot(): Graph of partial individuals. Deprecated. Use fviz_hmfa_ind(X, partial = "all") instead.} #' \item{fviz_hmfa_quanti_var(): Graph of quantitative variables. Deprecated. Use fviz_hmfa_var(X, "quanti.var") instead.} #' \item{fviz_hmfa_quali_var(): Graph of qualitative variables. Deprecated. Use fviz_hmfa_var(X, "quali.var") instead.} #' \item{fviz_hmfa_group(): Graph of the groups representation. Deprecated. Use fviz_hmfa_var(X, "group") instead.} #' #' } #' #' @param res.hmfa an object of class HMFA [FactoMineR]. #' @param res.mfa an object of class MFA [FactoMineR]. #' @param X an object of class MFA or HMFA [FactoMineR]. #' @param ... Other arguments. #' @author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #' @name deprecated #' #' @rdname deprecated #' @export get_mfa_quanti_var <- function(res.mfa){ warning("Deprecated function. Use get_mfa_var(res.mfa, 'quanti.var') instead.") get_mfa_var(res.mfa, "quanti.var") } #' @rdname deprecated #' @export get_mfa_quali_var <- function(res.mfa){ warning("Deprecated function. Use get_mfa_var(res.mfa, 'quanti.var') instead.") get_mfa_var(res.mfa, "quali.var") } #' @rdname deprecated #' @export get_mfa_group <- function(res.mfa){ warning("Deprecated function. Use get_mfa_var(res.mfa, 'group') instead.") get_mfa_var(res.mfa, "group") } #' @rdname deprecated #' @export fviz_mfa_ind_starplot <- function(X, ...){ warning("This function is deprecated. ", "It will be removed in the next version. ", "Use fviz_mfa_ind(res.mfa, partial = 'All') instead.") fviz_mfa_ind (X, partial = "all", ...) } #' @rdname deprecated #' @export fviz_mfa_group <- function(X, ...){ warning("Deprecated function. Use fviz_mfa_var(res.mfa, 'group') instead.") fviz_mfa_var(X, choice = "group", ...) } #' @rdname deprecated #' @export fviz_mfa_quanti_var <- function(X, ...){ warning("Deprecated function. Use fviz_mfa_var(res.mfa, 'quanti.var') instead.") fviz_mfa_var(X, choice = "quanti.var", ...) } #' @rdname deprecated #' @export fviz_mfa_quali_var <- function(X, ...){ warning("Deprecated function. Use fviz_mfa_var(res.mfa, 'quali.var') instead.") fviz_mfa_var(X, choice = "quali.var", ...) } #' @rdname deprecated #' @export get_hmfa_quanti_var <- function(res.hmfa){ warning("Deprecated function. Use get_hmfa_var(res.hmfa, 'quanti.var') instead.") get_hmfa_var(res.hmfa, "quanti.var") } #' @rdname deprecated #' @export get_hmfa_quali_var <- function(res.hmfa){ warning("Deprecated function. Use get_hmfa_var(res.hmfa, 'quali.var') instead.") get_hmfa_var(res.hmfa, "quali.var") } #' @rdname deprecated #' @export get_hmfa_group <- function(res.hmfa){ warning("Deprecated function. Use get_hmfa_var(res.hmfa, 'group') instead.") get_hmfa_var(res.hmfa, "group") } #' @rdname deprecated #' @export fviz_hmfa_quanti_var <- function(X, ...){ warning("Deprecated function. Use fviz_hmfa_var(X, 'quanti.var') instead.") fviz_hmfa_var(X, "quanti.var", ...) } #' @rdname deprecated #' @export fviz_hmfa_quali_var <- function(X, ... ) { warning("Deprecated function. Use fviz_hmfa_var(X, 'quali.var') instead.") fviz_hmfa_var(X, "quali.var", ...) } #' @rdname deprecated #' @export fviz_hmfa_ind_starplot <- function(X, ...){ warning("This function is deprecated. ", "Use fviz_hmfa_ind(X, partial = 'all') instead.") fviz_hmfa_ind (X, partial = "all", ...) } #' @rdname deprecated #' @export fviz_hmfa_group <- function(X, ...) { warning("Deprecated function. Use fviz_hmfa_var(X, 'group') instead.") fviz_hmfa_var(X, choice = "group", ...) } factoextra/R/fviz_ellipses.R0000644000176200001440000000566613144620011015621 0ustar liggesusers#' @include utilities.R NULL #' Draw confidence ellipses around the categories #' @description Draw confidence ellipses around the categories #' @inheritParams fviz #' @inheritParams ggpubr::ggpar #' @param X an object of class MCA, PCA or MFA. #' @param habillage a numeric vector of indexes of variables or a #' character vector of names of variables. Can be also a data frame containing grouping variables. #' @param geom a text specifying the geometry to be used for the graph. Allowed #' values are the combination of c("point", "text"). Use "point" (to show only #' points); "text" to show only labels; c("point", "text") to show both types. #' @param ... Arguments to be passed to the functions ggpubr::ggscatter() & #' ggpubr::ggpar(). #' #' @return a ggplot #' @author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #' #' @rdname fviz_ellipses #' @examples #' \donttest{ #' #' # Multiple Correspondence Analysis #' # +++++++++++++++++++++++++++++++++ #' library(FactoMineR) #' data(poison) #' res.mca <- MCA(poison, quanti.sup = 1:2, #' quali.sup = 3:4, graph=FALSE) #' #' fviz_ellipses(res.mca, 1:4, geom = "point", #' palette = "jco") #' #' } #' @export fviz_ellipses <- function(X, habillage, axes = c(1,2), addEllipses = TRUE, ellipse.type = "confidence", palette = NULL, pointsize = 1, geom = c("point", "text"), ggtheme = theme_bw(),...){ df <- facto_summarize(X, element = "ind", axes = axes, result = c("coord")) colnames(df)[2:3] <- c("x", "y") # augment data, if qualitative variable is used to color points by groups dd <- .add_ind_groups(X, df, habillage) df <- dd$ind color <- dd$name.quali if(length(habillage)==1 | is.factor(habillage)) legend. <- "right" else legend. = "none" label <- NULL if("text" %in% geom) label <- "name" p <- ggpubr::ggscatter(df, x = "x", y = "y", color = color, palette = palette, ellipse = addEllipses, ellipse.type = ellipse.type, legend = legend., ggtheme = ggtheme, mean.point = TRUE, label = label, size = pointsize, ...) # Faceting when multiple variables are used to color individuals # in this case there is a column "facet_vars" in df if("facet_vars" %in% colnames(df)){ groups <- c("facet_vars", "Groups") xx <- ggpubr::desc_statby(df, measure.var = "x", grps = groups)[, c(groups, "mean")] colnames(xx)[ncol(xx)] <- "x" yy <- ggpubr::desc_statby(df, measure.var = "y", grps = groups)[, c(groups, "mean")] xx$y <- yy$mean grp_coord <- xx p <- ggpubr::ggtext(grp_coord, x = "x", y = "y", color = color, palette = palette, legend = legend., ggtheme = ggtheme, label = "Groups", ggp = p, ...) p <- p + facet_wrap(~facet_vars) } p <- .fviz_finish(p, X, axes, ...) p } factoextra/R/utilities.R0000644000176200001440000006403513637602503014766 0ustar liggesusers#' @include eigenvalue.R fviz_add.R NULL #' @import ggplot2 #' @importFrom ggrepel geom_text_repel #' @importFrom grDevices chull #' @importFrom graphics plot #' @importFrom utils data #' @importFrom stats as.dendrogram #' @importFrom stats as.dist #' @importFrom stats kmeans #' @importFrom stats na.omit #' @importFrom stats qchisq #' @importFrom stats rnorm #' @importFrom stats runif #' @importFrom stats var #' # Check and get the class of the output of a factor analysis # ++++++++++++++++++++++++++++ # X: an output of factor analysis (PCA, CA, MCA, MFA) # from different packages (FactoMineR, ade4, ....) .get_facto_class <- function(X){ if(inherits(X, c('PCA', 'princomp', 'prcomp'))) facto_class ="PCA" else if(inherits(X, 'pca') & inherits(X, 'dudi')) facto_class ="PCA" else if(inherits(X, c("CA", "ca", "coa", "correspondence"))) facto_class="CA" else if(inherits(X, c("MCA", "acm"))) facto_class = "MCA" else if(inherits(X, c("MFA","mfa"))) facto_class = "MFA" else if(inherits(X, c("HMFA"))) facto_class = "HMFA" else if(inherits(X, c("FAMD"))) facto_class = "FAMD" else if (inherits(X, "expoOutput")){ if (inherits(X$ExPosition.Data,'epCA')) facto_class="CA" else if (inherits(X$ExPosition.Data,'epPCA')) facto_class="PCA" else if (inherits(X$ExPosition.Data,'epMCA')) facto_class="MCA" } else stop("An object of class : ", class(X), " can't be handled by factoextra") } # Get the result for supplementary points #++++++++++++++++++++++++++ ## X: an output of factor analysis (PCA, CA, MCA, MFA, HMFA) ## element possible values are "row.sup", "col.sup" (CA); # quanti, ind.sup (PCA); quali.sup (MCA); quanti.var.sup, quali.var.sup (MFA) ## result the result tobe extracted for the element. Possible values are # the combination of c("cos2", "coord") ## axes a numeric vector specifying the axes of interest. Default values are 1:2 ## for axes 1 and 2 ## select: a selection of variables. See the function .select() .get_supp <- function(X, element = NULL, axes = 1:2, result = c("coord", "cos2"), select = NULL){ if(inherits(X, "MFA") & element == "group") elmt <- .get_mfa_group_sup(X) else if(inherits(X, c("CA", "PCA", "MCA", "MFA", "HMFA", "FAMD"))) { exprs <- paste0("X$", element) elmt <- eval(parse(text=exprs )) } else if(inherits(X, "ca")){ if(element == "col.sup") elmt <- .get_ca_col_sup(X) else if(element == "row.sup") elmt <- .get_ca_row_sup(X) } else stop("An object of class : ", class(X), " can't be handled by the function .get_supp()") # summarize the result res = NULL if(!is.null(elmt)){ if(inherits(X, "MCA")){ if(element %in% c("quanti.sup", "quali.sup$eta2")) result <- "coord" if(element == "quanti.sup") elmt$coord <- elmt$coord^2 else if(element == "quali.sup$eta2") elmt<-list(coord = elmt) } # check axes if(max(axes) > ncol(elmt$coord)) stop("The value of the argument axes is incorrect. ", "The number of axes in the data is: ", ncol(elmt$coord), ". Please try again with axes between 1 - ", ncol(elmt$coord)) # 1.Extract the coordinates x, y and coord if("coord" %in% result){ dd <- data.frame(elmt$coord[, axes, drop=FALSE], stringsAsFactors = TRUE) coord <- apply(dd^2, 1, sum) # x^2 + y2 + ... res <- cbind(dd, coord = coord) } # 2. Extract the cos2 if("cos2" %in% result){ cos2 <- data.frame(elmt$cos2[, axes, drop=FALSE], stringsAsFactors = TRUE) if(length(axes) > 1) cos2 <- apply(cos2, 1, sum, na.rm=TRUE) res <- cbind(res, cos2 = cos2) } res <- cbind.data.frame(name =rownames(elmt$coord), res, stringsAsFactors = TRUE) # selection of variables if(!is.null(select)){ if(!is.null(select$contrib)) res <- NULL # supp points don't have contrib else res <- .select(res, select, check = FALSE) } } if(!is.null(res)){ if(nrow(res) == 0) res <- NULL } res } # Add supplementary elements to a plot # p a ggplot # X an object from FactoMiner # element: "ind.sup", "quanti" # axes: axes of interest # scale.: numeric, the data is multiplied by scale. before ploting # select: a selection of individuals/variables to be drawn. # ca_map: applied to (m)ca only, see fviz_ca map argument .add_supp <- function(p, X, element, axes, select, scale.=1, ca_map = NULL, ...){ for(el in element){ dd <- .get_supp(X, element = el, axes = axes, select = select) if(!is.null(dd)){ colnames(dd)[2:3] <- c("x", "y") if(!is.null(ca_map)) dd <- .scale_ca(dd, res.ca = X, element = el, type = ca_map, axes = axes) p <- fviz_add(p, df = dd[, 2:3, drop = FALSE]*scale., ...) } } p } # get supplementary columns from ca output (ca package) .get_ca_col_sup <- function(res.ca){ # supplementary points index <- res.ca$colsup cols <- NULL if(length(index) > 0){ # principal coord = standard coord X sqrt(eig) coord <- t(apply(res.ca$colcoord, 1, "*", res.ca$sv)) cos2 <- apply(coord^2, 2, "/", res.ca$coldist^2) cols <- list(coord = coord[index, , drop = FALSE], cos2 = cos2[index, , drop = FALSE]) } cols } # get supplementary rows from ca output (ca package) .get_ca_row_sup <- function(res.ca){ rows <- NULL # supplementary points index <- res.ca$rowsup if(length(index) > 0){ # principal coord = standard coord X sqrt(eig) coord <- t(apply(res.ca$rowcoord, 1, "*", res.ca$sv)) cos2 <- apply(coord^2, 2, "/", res.ca$rowdist^2) rows <- list(coord = coord[index, , drop = FALSE], cos2 = cos2[index, , drop = FALSE]) } rows } # get supplementary groups from MFA .get_mfa_group_sup <- function(res.mfa){ res <- NULL # supplementary points coord <- res.mfa$group$coord.sup if(!is.null(coord)){ res <- list(coord = coord, cos2 = res.mfa$group$cos2.sup) } res } # Scale row coordinates depending on the map type #++++++++++++++++++++++ ## row.res, data: an output of facto_summarize containing the # name, x, y, coord,... of the row variables ## res.ca an object of class CA, MCA ## type: a character string specifying the map type. # Allowed values include "symmetric", "rowprincipal", "colprincipal", "rowgab", "colgab", "rowgreen", "colgreen". ## element: possible values are "row", "col", "row.sup", "col.sup", # "ind", "var", "ind.sup", "quali.sup" .scale_ca <- function(data, res.ca, element="row", type="symmetric", axes = 1:2) { res <- NULL if(!is.null(data)){ if(element %in% c("row", "ind")) res <- .scale_ca_row(data, res.ca, type, axes) else if(element %in% c("col", "var")) res <- .scale_ca_col(data, res.ca, type, axes) else if(element %in% c( "row.sup", "ind.sup")) res <- .scale_ca_rowsupp(data, res.ca, type, axes) else if(element %in% c("col.sup", "quali.sup")) res <- .scale_ca_colsupp(data, res.ca, type, axes) } res } .scale_ca_row <- function(row.res, res.ca, type ="symmetric", axes = 1:2){ data <- row.res res <- data eig <- get_eigenvalue(res.ca)[axes,1] sv <- sqrt(eig) mass <- .get_ca_mass(res.ca, "row")[as.vector(data$name)] # rows/columns in principal coordinates if(type %in% c("symmetric", "rowprincipal", "rowgab", "rowgreen")) res <- data else{ # get standard coordinates x <- res$x/sqrt(eig[1]) y <- res$y/sqrt(eig[2]) # standard coordinate if(type %in% c("colprincipal")){ res$x <- x res$y <- y res$coord <- res$x^2 + res$y^2 } # standard coordinate X mass else if(type %in% c("colgab")){ res$x <- x*mass res$y <- y*mass res$coord <- res$x^2 + res$y^2 } # standard coordinate X sqrt(mass) else if(type %in% c("colgreen")){ res$x <- x*sqrt(mass) res$y <- y*sqrt(mass) res$coord <- res$x^2 + res$y^2 } else if(type %in% c("symbiplot")){ res$x <- x*sqrt(sv[1]) res$y <- y*sqrt(sv[2]) res$coord <- res$x^2 + res$y^2 } } return(res) } # Scale ca column .scale_ca_col <- function(col.res, res.ca, type ="symmetric", axes = 1:2){ data <- col.res res <- data eig <- get_eigenvalue(res.ca)[axes,1] sv <- sqrt(eig) mass <- .get_ca_mass(res.ca, "col")[as.vector(data$name)] # rows/columns in principal coordinates if(type %in% c("symmetric", "colprincipal", "colgab", "colgreen")) res <- data else{ # get standard coordinates x <- res$x/sqrt(eig[1]) y <- res$y/sqrt(eig[2]) # standard coordinate if(type %in% c("rowprincipal")){ res$x <- x res$y <- y res$coord <- res$x^2 + res$y^2 } # standard coordinate X mass else if(type %in% c("rowgab")){ res$x <- x*mass res$y <- y*mass res$coord <- res$x^2 + res$y^2 } # standard coordinate X sqrt(mass) else if(type %in% c("rowgreen")){ res$x <- x*sqrt(mass) res$y <- y*sqrt(mass) res$coord <- res$x^2 + res$y^2 } else if(type %in% c("symbiplot")){ res$x <- x*sqrt(sv[1]) res$y <- y*sqrt(sv[2]) res$coord <- res$x^2 + res$y^2 } } return(res) } # Scale ca row sup .scale_ca_rowsupp <- function(rowsup.res, res.ca, type ="symmetric", axes = 1:2){ data <- rowsup.res res <- data eig <- get_eigenvalue(res.ca)[axes,1] sv <- sqrt(eig) # rows/columns in principal coordinates if(type %in% c("symmetric", "rowprincipal", "rowgab", "rowgreen")) res <- data else{ # get standard coordinates x <- res$x/sqrt(eig[1]) y <- res$y/sqrt(eig[2]) # standard coordinate if(type %in% c("colprincipal")){ res$x <- x res$y <- y res$coord <- res$x^2 + res$y^2 } # standard coordinate X mass else if(type %in% c("colgab")) res <- NULL # standard coordinate X sqrt(mass) else if(type %in% c("colgreen")) res <- NULL else if(type %in% c("symbiplot")){ res$x <- x*sqrt(sv[1]) res$y <- y*sqrt(sv[2]) res$coord <- res$x^2 + res$y^2 } } return(res) } .scale_ca_colsupp <- function(colsup.res, res.ca, type ="symmetric", axes = 1:2){ data <- colsup.res res <- data eig <- get_eigenvalue(res.ca)[axes,1] sv <- sqrt(eig) # rows/columns in principal coordinates if(type %in% c("symmetric", "colprincipal", "colgab", "cogreen")) res <- data else{ # get standard coordinates x <- res$x/sqrt(eig[1]) y <- res$y/sqrt(eig[2]) # standard coordinate if(type %in% c("rowprincipal")){ res$x <- x res$y <- y res$coord <- res$x^2 + res$y^2 } # standard coordinate X mass else if(type %in% c("rowgab")) res <- NULL # standard coordinate X sqrt(mass) else if(type %in% c("rowgreen")) res <- NULL else if(type %in% c("symbiplot")){ res$x <- x*sqrt(sv[1]) res$y <- y*sqrt(sv[2]) res$coord <- res$x^2 + res$y^2 } } return(res) } # get the mass of an element #++++++++++++++++++++++++++++ # res.ca : CA object # element: possible values are "row" or "col" .get_ca_mass <- function(res.ca, element){ if(inherits(res.ca, "ca")){ if(element == "row"){ mass <- res.ca$rowmass names(mass) <- res.ca$rownames } else if(element == "col"){ mass <- res.ca$colmass names(mass) <- res.ca$colnames } } # FactoMiner else if(inherits(res.ca, c("CA", "MCA"))){ if(element %in% c("row", "ind")) mass <- res.ca$call$marge.row else if(element %in% c("col", "var")) mass <- res.ca$call$marge.col } # Ade4 else if(inherits(res.ca, c("coa", "acm"))){ if(element =="row") mass <- res.ca$lw else if(element == "col") mass <- res.ca$cw } # Mass package else if(inherits(res.ca, "correspondence")){ row.sum <- apply(res.ca$Freq, 1, sum) col.sum <- apply(res.ca$Freq, 2, sum) n <- sum(res.ca$Freq) if(element =="row") mass <- row.sum/n else if(element =="col") mass <- col.sum/n } # ExPosition else if (inherits(res.ca, "expoOutput")){ if(element =="row") mass <- res.ca$ExPosition.Data$M else if(element =="col") mass <- res.ca$ExPosition.Data$W } else stop("An object of class : ", class(res.ca), " can't be handled") return(mass) } # Reconstruct data: get the original data # res.pca is an object of class prcomp or princomp .prcomp_reconst <- function(res.pca){ if(inherits(res.pca, "prcomp")){ centered <- is.numeric(res.pca$center) scaled <- is.numeric(res.pca$scale) if(centered & scaled) t(t(res.pca$x %*% t(res.pca$rotation)) * res.pca$scale + res.pca$center) else if(centered) t(t(res.pca$x %*% t(res.pca$rotation)) + res.pca$center) else if(scaled) t(t(res.pca$x %*% t(res.pca$rotation)) * res.pca$scale) else t(t(res.pca$x %*% t(res.pca$rotation))) } else if(inherits(res.pca, "princomp")){ if(!is.null(res.pca$scores)) t(t(res.pca$scores %*% t(res.pca$loadings)) * res.pca$scale + res.pca$center) else stop("The object res.pca doesn't have the element scores. ", "Please use the function princomp() with the argument ", "scores = TRUE.") } else stop("Can't handle an object of class ", class(res.pca)) } # Build plot title for contribution, cos2 plots # used in fviz_cos2, fviz_contrib, etc #+++++++++++++++++++++++ # element: possible values are row, col, var, ind # varname: the name of the variable name to be plotted # possible values are "Cos2", "Contribution" # axes: a numeric vector specifying the axes of interest # example: .build_title("row", "Cos2", 1:2) .build_title <- function(element, varname, axes){ if(varname =="cos2") varname = "Cos2" else if(varname =="contrib") varname = "Contribution" if(element=="row") title <- paste0(varname, " of rows to Dim-", paste(axes, collapse="-")) else if(element=="col") title <- paste0(varname, " of columns to Dim-", paste(axes, collapse="-")) else if(element=="var") title <- paste0(varname, " of variables to Dim-", paste(axes, collapse="-")) else if(element=="ind") title <- paste0(varname, " of individuals to Dim-", paste(axes, collapse="-")) else if(element=="quanti.var") title <- paste0(varname, " of quantitive variables to Dim-", paste(axes, collapse="-")) else if(element=="quali.var") title <- paste0(varname, " of qualitive variables to Dim-", paste(axes, collapse="-")) else if(element=="group") title <- paste0(varname, " of groups to Dim-", paste(axes, collapse="-")) else if(element=="partial.axes") title <- paste0(varname, " of partial axes to Dim-", paste(axes, collapse="-")) return(title) } # Select rows according to a filter # ++++++++++++++++++++ # d a data frame containing row names, coordinates, cos2, contrib, etc # filter: a filter to be applied. Allowed values are NULL or a list containing the arguments either # name, cos2 or contrib # - name: is a character vector containing row names of interest # - cos2: if cos2 is in [0, 1], ex: 0.6, then rows with a cos2 > 0.6 are extracted. # if cos2 > 1, ex: 5, then the top 5 rows with the highest cos2 are extracted # - contrib: if contrib > 1, ex: 5, then the top 5 rows with the highest cos2 are extracted # check: if TRUE, check the data after filtering .select <- function(d, filter = NULL, check= TRUE){ if(!is.null(filter)){ # Filter by name if(!is.null(filter$name)){ name <- filter$name common <- intersect(name, d$name) diff <- setdiff(name, d$name) #if(check & length(common) == 0) stop("Can't find the specified names") # if(check & length(diff)!=0) warning("Can't find the the following name(s): ", diff) d <- d[common, , drop = FALSE] } # Filter by cos2 if(!is.null(filter$cos2) & nrow(d) >= 1){ # case 1 cos2 is in [0, 1] # rows with cos2 > value are selected if(0 <= filter$cos2 & filter$cos2 <= 1){ d <- d[which(d$cos2 >= filter$cos2), , drop = FALSE] if(check & nrow(d)==0) stop("There are no observations with cos2 >=", filter$cos2, ". Please, change the value of cos2 and try again.") } # case 2 - cos2 > 1 : the top rows are selected else if(filter$cos2 > 1){ cos2 <- round(filter$cos2) d <- d[order(d$cos2, decreasing = TRUE), , drop = FALSE] d <- d[1:min(filter$cos2, nrow(d)),, drop = FALSE] } } # Filter by contrib: the top rows are selected if(!is.null(filter$contrib) & nrow(d) >= 1){ contrib <- round(filter$contrib) if(contrib < 1) stop("The value of the argument contrib >", 1) d <- d[order(d$contrib, decreasing = TRUE), , drop = FALSE] d <- d[1:min(contrib, nrow(d)), , drop = FALSE] } } return (d) } # Add supplementary points # Make a ggplot2 bar plot #+++++++++++++++++++++++++ # x: a numeric vector # title, xlab, ylab : labels for the graph # fill: a fill color for the bar plot # color: an outline color for the bar plot # sort.value: a string specifying whether x should be sorted or not. # Allowed values are "none" (no sorting), "asc" (for ascending) or "desc" (for descending) # top a numeric value specifing the top elements to be shown .ggbarplot <- function(x, title ="", xlab ="", ylab="", fill="steelblue", color = "steelblue", sort.value = c("desc", "asc", "none"), top = Inf ){ # top elements if(top!=Inf & top < length(x)) x <- sort(x, decreasing=TRUE)[1:top] # sorting if(sort.value[1]=="desc") x <- sort(x, decreasing = TRUE) else if(sort.value[1]=="asc") x <- sort(x, decreasing = FALSE) # bar names if(is.null(names(x))) names(x) <- 1:length(x) #data frame for ggplot2 d <- cbind.data.frame(name = factor(names(x), levels = names(x)), val = x, stringsAsFactors = TRUE) # plot p <- ggplot(d, aes_string("name", "val")) + geom_bar(stat="identity", fill=fill, color = color) + labs(title = title, x =xlab, y = ylab)+ theme(axis.text.x = element_text(angle=45), axis.title.x = element_blank()) return(p) } # Points jitter, to reduce overploting # data : a result from facto_summarize containing the x and y coordinates of points # jitter: a vector of length 3 containing the width and the height of jitter and the # element to be jittered ("label", "point", "both") .jitter <- function(data, jitter = list(what = "label", width = NULL, height = NULL)){ if(!is.null(data)){ if(!is.null(jitter$width)){ width <- abs(jitter$width) set.seed(1234) xjit <- runif(nrow(data), min = -width, max = width) data$x <- data$x + ((xjit + rev(xjit))/2) } if(!is.null(jitter$height)){ height <- abs(jitter$height) set.seed(12345) yjit <- runif(nrow(data), min = -height, max = height) data$y <- data$y + ((yjit + rev(yjit))/2) } } return(data) } # Finih a plot #++++++++++++++++++++++++++++++ # p a ggplot2 # X an object of class PCA, MCA or CA # axes the plotted axes .fviz_finish <- function(p, X, axes = 1:2, linetype = "dashed", xlab = NULL, ylab=NULL, ...){ cc <- .get_facto_class(X) title <- paste0(cc, " factor map") eig <- get_eigenvalue(X)[,2] if(is.null(xlab)) xlab = paste0("Dim", axes[1], " (", round(eig[axes[1]],1), "%)") if(is.null(ylab)) ylab = paste0("Dim", axes[2], " (", round(eig[axes[2]], 1),"%)") p <- p + geom_hline(yintercept = 0, color = "black", linetype=linetype) + geom_vline(xintercept = 0, color = "black", linetype=linetype) + labs(title = title, x = xlab, y = ylab) return(p) } # Check the element to be labelled #+++++++++++++++++ ## label: a character vector specifying the elements to be labelled # possible values are "all", "none" or the combination of # c("row", "row.sup", "col", "col.sup", "ind", "ind.sup", "quali", "var", "quanti.sup") ## Returns a list .label <- function(label){ lab <- list() element <- c("var", "quanti.sup", "quali.sup", "quanti.sup","quanti", # var - PCA, MCA, MFA "quanti.var.sup", "quanti.var", "quali.var", # MFA "ind", "ind.sup", "quali", "mca.cor", # ind - PCA, MCA, MFA "group", "group.sup", # group - MFA, HMFA "partial.axes", # partial.axes - MFA "row", "row.sup", # row - ca "col", "col.sup" # col - ca ) for(el in element){ if(label[1] == "all" | el %in% label) lab[[el]] <- TRUE else lab[[el]] <- FALSE } lab } # Check the element to be hidden #+++++++++++++++++ ## invisible: a character vector specifying the elements to be hidden # possible values are "all", "none" or the combination of # c("row", "row.sup", "col", "col.sup", "ind", "ind.sup", "quali", "quali.sup", "var", "quanti.sup") ## Returns a list .hide <- function(invisible){ hide <- list() element <- c("var", "quanti.sup", "quali.sup", "quanti.sup","quanti", # var - PCA, MCA, MFA "quanti.var.sup", "quanti.var", "quali.var", # MFA "ind", "ind.sup", "quali", "mca.cor", # ind - PCA, MCA, MFA "group", "group.sup", # group - MFA, HMFA "partial.axes", # partial.axes - MFA "row", "row.sup", # row - ca "col", "col.sup" # col - ca ) for(el in element){ if(el %in% invisible) hide[[el]] <- TRUE else hide[[el]] <- FALSE } hide } # Generate a data containing a cluster of any shapes # For comparison between dbscan and k-means .generate_multishapes <- function(){ # First circle (big) set.seed(1234) x <- matrix(rnorm(800, sd = 2), ncol=2) y <- x/sqrt(rowSums(x^2)) y[,1] <- y[,1] + rnorm(400, 0, 0.1) y[,2] <- y[,2] + rnorm(400, 0, 0.1) x1 <- y[, 1] y1 <- y[, 2] # Second circle (small) x2 <- x1/2.5 y2 <- y1/2.5 shape <- rep(c(1,2), each = 400) # Line 1 x3 <- runif(100, min = -1.5, 0) y3 <- rnorm(100, -2, 0.1) shape <- c(shape, rep(3, 100)) # Line 2 x4 <- runif(100, min = -1.5, 0) y4 <- rnorm(100, -3, 0.1) shape <- c(shape, rep(4, 100)) # compact points x6 <- rnorm(50, 1, 0.1) y6 <- rnorm(50, -2.5, 0.1) shape <- c(shape, rep(5, 50)) # noises/outliers x5 <- runif(50, min = -1.5, 1.5) y5 <- rnorm(50, -1, 1) shape <- c(shape, rep(6, 50)) multishapes <- data.frame(x = c(x1, x2, x3, x4, x5, x6), y = c(y1, y2, y3, y4, y5, y6), shape = shape, stringsAsFactors = TRUE) multishapes } # Deprecated argument .facto_dep <- function(arg, replace, return_val){ warning("argument ", arg, " is deprecated; please use ", replace, " instead.", call. = FALSE) return_val } # Check axis lengths .check_axes <- function(axes, .length){ if(length(axes) != .length) stop("axes should be of length ", 2) } # Add individual groups column # x an object of class PCA, MCA, ... # ind: individuals data generated by facto_summarize() # grp: group column index or factor .add_ind_groups <- function(X, ind, grp){ if(inherits(X, c("PCA", "MCA", "MFA", "FAMD")) & length(grp) > 1){ if(is.numeric(grp) | is.character(grp)) grp <- as.data.frame(X$call$X[rownames(ind), grp, drop = FALSE], stringsAsFactors = TRUE) #if(!is.null(X$call$ind.sup)) grp <- grp[-X$call$ind.sup, , drop = FALSE] } habillage <- grp # Data frame containing multiple grouping variables if(inherits(grp, c("matrix", "data.frame"))){ if(nrow(ind) != nrow(grp)) stop("The length of grouping variables ", "should be the same as the number of individuals.") ind <- cbind.data.frame(ind, grp, stringsAsFactors = TRUE) ind[, colnames(grp)] <- apply(ind[, colnames(grp)], 2, as.character) ind <- tidyr::gather_(ind, key_col = "facet_vars", value_col = "Groups", gather_cols = colnames(grp)) ind$facet_vars <- as.factor(ind$facet_vars) ind$Groups <- as.factor(ind$Groups) name.quali <- "Groups" } else{ # X is from FactoMineR outputs if(inherits(X, c("PCA", "MCA", "MFA", "FAMD")) & length(habillage) == 1){ data <- X$call$X if (is.numeric(habillage)) name.quali <- colnames(data)[habillage] else name.quali <- habillage ind <- cbind.data.frame(data[rownames(ind),name.quali], ind, stringsAsFactors = TRUE) colnames(ind)[1]<-name.quali if(!inherits(ind[, 1], "factor")) ind[, 1]<-as.factor(ind[,1]) } else{ if(nrow(ind)!=length(habillage)) stop("The number of active individuals is different ", "from the length of the factor habillage. Please, remove the supplementary ", "individuals in the variable habillage.") name.quali <- "Groups" ind <- cbind.data.frame(Groups = habillage, ind, stringsAsFactors = TRUE) if(!inherits(ind[, 1], "factor")) ind[, 1] <- as.factor(ind[,1]) } } list(ind = ind, name.quali = name.quali, is_multiple_habillage = is.data.frame(grp)) } # MFA: get quantitative variables groups # For plotting .get_quanti_var_groups <- function(X){ group <- data.frame(name = rownames(X$group$Lg[-nrow(X$group$Lg),,drop=FALSE]), nvar = X$call$group, type = X$call$type, stringsAsFactors = TRUE) is.group.sup <- !is.null(X$call$num.group.sup) if(is.group.sup) group <- group[-X$call$num.group.sup, , drop = FALSE] group <- subset(group, group$type == "c") group <- rep(group$name, group$nvar) group } # Get qualitative supplementary variables # Each variables is repeated xtimes = levels(variables) # Used to color variable categories by variables .get_quali_var_sup_names <- function(X){ group <- data.frame(name = rownames(X$group$Lg[-nrow(X$group$Lg),,drop=FALSE]), nvar = X$call$group, type = X$call$type, stringsAsFactors = TRUE) is.group.sup <- !is.null(X$call$num.group.sup) res <- NULL if(is.group.sup){ # Get group sup names group.sup <- group[X$call$num.group.sup, , drop = FALSE] group.sup <- subset(group.sup, group.sup$type == "n", drop = FALSE) group.sup.name <- as.character(group.sup$name) # Names of variables in the data data <- X$call$X vars <- colnames(data) vars.groups <- rep(group$name, group$nvar) group.sup.vars <- vars[vars.groups %in% group.sup.name] for(v in group.sup.vars){ res <- c(res, rep(v, length(levels(data[,v])))) } } res } # Principal component methods with Fcatominer f_pca <- function(X, graph = FALSE){ FactoMineR::PCA(X, graph = FALSE) } factoextra/R/fviz_contrib.R0000644000176200001440000001363613637600720015451 0ustar liggesusers#' @include facto_summarize.R NULL #' Visualize the contributions of row/column elements #' #' @description #' This function can be used to visualize the contribution of rows/columns #' from the results of Principal Component Analysis (PCA), #' Correspondence Analysis (CA), Multiple Correspondence Analysis (MCA), Factor Analysis of Mixed Data (FAMD), #' and Multiple Factor Analysis (MFA) functions. #' @param sort.val a string specifying whether the value should be sorted. #' Allowed values are "none" (no sorting), "asc" (for ascending) or "desc" (for descending). #' @param ... other arguments to be passed to the function \link[ggpubr]{ggpar}. #' @inheritParams fviz_cos2 #' @inheritParams ggpubr::ggpar #' @details #' The function fviz_contrib() creates a barplot of row/column contributions. #' A reference dashed line is also shown on the barplot. This reference line #' corresponds to the expected value if the contribution where uniform.\cr\cr #' For a given dimension, any row/column with a contribution above the reference line could be #' considered as important in contributing to the dimension. #' #' @return a ggplot2 plot #' @author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #' @references http://www.sthda.com/english/ #' @examples #' \donttest{ #' # Principal component analysis #' # ++++++++++++++++++++++++++ #' data(decathlon2) #' decathlon2.active <- decathlon2[1:23, 1:10] #' res.pca <- prcomp(decathlon2.active, scale = TRUE) #' #' # variable contributions on axis 1 #' fviz_contrib(res.pca, choice="var", axes = 1, top = 10 ) #' #' # Change theme and color #' fviz_contrib(res.pca, choice="var", axes = 1, #' fill = "lightgray", color = "black") + #' theme_minimal() + #' theme(axis.text.x = element_text(angle=45)) #' #' # Variable contributions on axis 2 #' fviz_contrib(res.pca, choice="var", axes = 2) #' # Variable contributions on axes 1 + 2 #' fviz_contrib(res.pca, choice="var", axes = 1:2) #' #' # Contributions of individuals on axis 1 #' fviz_contrib(res.pca, choice="ind", axes = 1) #' #'\dontrun{ #' # Correspondence Analysis #' # ++++++++++++++++++++++++++ #' # Install and load FactoMineR to compute CA #' # install.packages("FactoMineR") #' library("FactoMineR") #' data("housetasks") #' res.ca <- CA(housetasks, graph = FALSE) #' #' # Visualize row contributions on axes 1 #' fviz_contrib(res.ca, choice ="row", axes = 1) #' # Visualize column contributions on axes 1 #' fviz_contrib(res.ca, choice ="col", axes = 1) #' #' # Multiple Correspondence Analysis #' # +++++++++++++++++++++++++++++++++ #' library(FactoMineR) #' data(poison) #' res.mca <- MCA(poison, quanti.sup = 1:2, #' quali.sup = 3:4, graph=FALSE) #' #' # Visualize individual contributions on axes 1 #' fviz_contrib(res.mca, choice ="ind", axes = 1) #' # Visualize variable categorie contributions on axes 1 #' fviz_contrib(res.mca, choice ="var", axes = 1) #' #' # Multiple Factor Analysis #' # ++++++++++++++++++++++++ #' library(FactoMineR) #' data(poison) #' res.mfa <- MFA(poison, group=c(2,2,5,6), type=c("s","n","n","n"), #' name.group=c("desc","desc2","symptom","eat"), #' num.group.sup=1:2, graph=FALSE) #' #' # Visualize individual contributions on axes 1 #' fviz_contrib(res.mfa, choice ="ind", axes = 1, top = 20) #' # Visualize catecorical variable categorie contributions on axes 1 #' fviz_contrib(res.mfa, choice ="quali.var", axes = 1) #' } #' #' } #' @export fviz_contrib <- function(X, choice = c("row", "col", "var", "ind", "quanti.var", "quali.var", "group", "partial.axes"), axes=1, fill="steelblue", color = "steelblue", sort.val = c("desc", "asc", "none"), top = Inf, xtickslab.rt = 45, ggtheme = theme_minimal(), ...) { sort.val <- match.arg(sort.val) choice = match.arg(choice) title <- .build_title(choice[1], "Contribution", axes) dd <- facto_summarize(X, element = choice, result = "contrib", axes = axes) contrib <- dd$contrib names(contrib) <-rownames(dd) # expected Average contribution theo_contrib <- 100/length(contrib) if(length(axes) > 1) { # Adjust variable contributions by the Dimension eigenvalues eig <- get_eigenvalue(X)[axes,1] theo_contrib <- sum(theo_contrib*eig)/sum(eig) } df <- data.frame(name = factor(names(contrib), levels = names(contrib)), contrib = contrib, stringsAsFactors = TRUE) # Define color if quanti.var if(choice == "quanti.var") { df$Groups <- .get_quanti_var_groups (X) if(missing(fill)) fill <- "Groups" if(missing(color)) color <- "Groups" } p <- ggpubr::ggbarplot(df, x = "name", y = "contrib", fill = fill, color = color, sort.val = sort.val, top = top, main = title, xlab = FALSE, ylab ="Contributions (%)", xtickslab.rt = xtickslab.rt, ggtheme = ggtheme, sort.by.groups = FALSE, ... )+ geom_hline(yintercept=theo_contrib, linetype=2, color="red") # p <- .ggbarplot(contrib, fill =fill, color = color, # sort.value = sort.val[1], top = top, # title = title, ylab ="Contributions (%)")+ # geom_hline(yintercept=theo_contrib, linetype=2, color="red") p } #' @describeIn fviz_contrib deprecated function. Use fviz_contrib() #' @param sortcontrib see the argument sort.val #' @export fviz_pca_contrib <- function(X, choice = c("var", "ind"), axes=1, fill="steelblue", color = "steelblue", sortcontrib = c("desc", "asc", "none"), top = Inf,...) { warning("The function fviz_pca_contrib() is deprecated. ", "Please use the function fviz_contrib() which can handle outputs ", " of PCA, CA and MCA functions.") p <- fviz_contrib(X = X, choice = choice, axes = axes, fill = fill, color = color, sort.val = sortcontrib, top = top, ...) p } factoextra/R/fviz_silhouette.R0000644000176200001440000001122113637601633016166 0ustar liggesusers#' @include eigenvalue.R get_pca.R hcut.R NULL #'Visualize Silhouette Information from Clustering #'@description Silhouette (Si) analysis is a cluster validation approach that #' measures how well an observation is clustered and it estimates the average #' distance between clusters. fviz_silhouette() provides ggplot2-based elegant #' visualization of silhouette information from i) the result of #' \code{\link[cluster]{silhouette}}(), \code{\link[cluster]{pam}}(), #' \code{\link[cluster]{clara}}() and \code{\link[cluster]{fanny}}() [in #' cluster package]; ii) \code{\link{eclust}}() and \code{\link{hcut}}() [in #' factoextra]. #' #' Read more: #' \href{http://www.sthda.com/english/wiki/clustering-validation-statistics-4-vital-things-everyone-should-know-unsupervised-machine-learning}{Clustering #' Validation Statistics}. #'@details - Observations with a large silhouhette Si (almost 1) are very well #' clustered. #' #' - A small Si (around 0) means that the observation lies between two #' clusters. #' #' - Observations with a negative Si are probably placed in the wrong cluster. #' #'@param sil.obj an object of class silhouette: pam, clara, fanny [in cluster #' package]; eclust and hcut [in factoextra]. #'@param label logical value. If true, x axis tick labels are shown #'@param print.summary logical value. If true a summary of cluster silhouettes #' are printed in fviz_silhouette(). #' @param ... other arguments to be passed to the function ggpubr::ggpar(). #' #'@return return a ggplot #'@author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #'@seealso \code{\link{fviz_cluster}}, \code{\link{hcut}}, #' \code{\link{hkmeans}}, \code{\link{eclust}}, \code{\link{fviz_dend}} #' @examples #' set.seed(123) #' #' # Data preparation #' # +++++++++++++++ #' data("iris") #' head(iris) #' # Remove species column (5) and scale the data #' iris.scaled <- scale(iris[, -5]) #' #' # K-means clustering #' # +++++++++++++++++++++ #' km.res <- kmeans(iris.scaled, 3, nstart = 2) #' #' # Visualize kmeans clustering #' fviz_cluster(km.res, iris[, -5], ellipse.type = "norm")+ #' theme_minimal() #' #' # Visualize silhouhette information #' require("cluster") #' sil <- silhouette(km.res$cluster, dist(iris.scaled)) #' fviz_silhouette(sil) #' #' # Identify observation with negative silhouette #' neg_sil_index <- which(sil[, "sil_width"] < 0) #' sil[neg_sil_index, , drop = FALSE] #' \dontrun{ #' # PAM clustering #' # ++++++++++++++++++++ #' require(cluster) #' pam.res <- pam(iris.scaled, 3) #' # Visualize pam clustering #' fviz_cluster(pam.res, ellipse.type = "norm")+ #' theme_minimal() #' # Visualize silhouhette information #' fviz_silhouette(pam.res) #' #' # Hierarchical clustering #' # ++++++++++++++++++++++++ #' # Use hcut() which compute hclust and cut the tree #' hc.cut <- hcut(iris.scaled, k = 3, hc_method = "complete") #' # Visualize dendrogram #' fviz_dend(hc.cut, show_labels = FALSE, rect = TRUE) #' # Visualize silhouhette information #' fviz_silhouette(hc.cut) #' } #'@export fviz_silhouette <- function(sil.obj, label = FALSE, print.summary = TRUE, ...){ if(inherits(sil.obj, c("eclust", "hcut", "pam", "clara", "fanny"))){ df <- as.data.frame(sil.obj$silinfo$widths, stringsAsFactors = TRUE) } else if(inherits(sil.obj, "silhouette")) df <- as.data.frame(sil.obj[, 1:3], stringsAsFactors = TRUE) else stop("Don't support an oject of class ", class(sil.obj)) # order by cluster and by sil_width df <- df[order(df$cluster, -df$sil_width), ] if(!is.null(rownames(df))) df$name <- factor(rownames(df), levels = rownames(df)) else df$name <- as.factor(1:nrow(df)) df$cluster <- as.factor(df$cluster) mapping <- aes_string(x = "name", y = "sil_width", color = "cluster", fill = "cluster") p <- ggplot(df, mapping) + geom_bar(stat = "identity") + labs(y = "Silhouette width Si", x = "", title = paste0("Clusters silhouette plot ", "\n Average silhouette width: ", round(mean(df$sil_width), 2)))+ ggplot2::ylim(c(NA, 1))+ geom_hline(yintercept = mean(df$sil_width), linetype = "dashed", color = "red" ) p <- ggpubr::ggpar(p, ...) # Labels if(!label) p <- p + theme(axis.text.x = element_blank(), axis.ticks.x = element_blank()) else if(label) p <- p + theme(axis.text.x = element_text(angle=45)) # Print summary ave <- tapply(df$sil_width, df$cluster, mean) n <- tapply(df$cluster, df$cluster, length) sil.sum <- data.frame(cluster = names(ave), size = n, ave.sil.width = round(ave,2), stringsAsFactors = TRUE) if(print.summary) print(sil.sum) p } factoextra/R/fviz_hmfa.R0000644000176200001440000002340713144620011014705 0ustar liggesusers#' @include get_hmfa.R NULL #'Visualize Hierarchical Multiple Factor Analysis #' #'@description Hierarchical Multiple Factor Analysis (HMFA) is, an extension of #' MFA, used in a situation where the data are organized into a hierarchical #' structure. fviz_hmfa() provides ggplot2-based elegant visualization of HMFA #' outputs from the R function: HMFA [FactoMineR].\cr\cr \itemize{ #' \item{fviz_hmfa_ind(): Graph of individuals} \item{fviz_hmfa_var(): Graph of #' variables} \item{fviz_hmfa_quali_biplot(): Biplot of individuals and #' qualitative variables} \item{fviz_hmfa(): An alias of fviz_hmfa_ind()} } #'@param X an object of class HMFA [FactoMineR]. #'@inheritParams fviz_mca #'@inheritParams fviz_pca #'@inheritParams fviz #'@param habillage an optional factor variable for coloring the observations by #' groups. Default value is "none". If X is an HMFA object from FactoMineR #' package, habillage can also specify the index of the factor variable in the #' data. #'@param col.ind,col.var color for individuals, partial individuals and #' variables, respectively. Can be a continuous variable or a factor variable. #' Possible values include also : "cos2", "contrib", "coord", "x" or "y". In #' this case, the colors for individuals/variables are automatically controlled #' by their qualities ("cos2"), contributions ("contrib"), coordinates (x^2 + #' y^2 , "coord"), x values("x") or y values("y"). To use automatic coloring #' (by cos2, contrib, ....), make sure that habillage ="none". #'@param col.partial color for partial individuals. By default, points are #' colored according to the groups. #'@param alpha.ind,alpha.var controls the transparency of individual, partial #' individual and variable, respectively. The value can variate from 0 (total #' transparency) to 1 (no transparency). Default value is 1. Possible values #' include also : "cos2", "contrib", "coord", "x" or "y". In this case, the #' transparency for individual/variable colors are automatically controlled by #' their qualities ("cos2"), contributions ("contrib"), coordinates (x^2 + y^2 #' , "coord"), x values("x") or y values("y"). To use this, make sure that #' habillage ="none". #'@param shape.ind,shape.var point shapes of individuals and variables, #' respectively. #'@param group.names a vector containing the name of the groups (by default, #' NULL and the group are named group.1, group.2 and so on). #'@param node.level a single number indicating the HMFA node level to plot. #'@param title the title of the graph #'@param select.ind,select.var a selection of individuals and variables to be #' drawn. Allowed values are NULL or a list containing the arguments name, cos2 #' or contrib: \itemize{ \item name is a character vector containing #' individuals/variables to be drawn \item cos2 if cos2 is in [0, 1], ex: 0.6, #' then individuals/variables with a cos2 > 0.6 are drawn. if cos2 > 1, ex: 5, #' then the top 5 individuals/variables with the highest cos2 are drawn. \item #' contrib if contrib > 1, ex: 5, then the top 5 individuals/variables with #' the highest cos2 are drawn } #'@param choice the graph to plot. Allowed values include one of c("quanti.var", #' "quali.var", "group") for plotting quantitative variables, qualitative #' variables and group of variables, respectively. #'@param ... Arguments to be passed to the function fviz() and ggpubr::ggpar() #'@param partial list of the individuals for which the partial points should be #' drawn. (by default, partial = NULL and no partial points are drawn). Use #' partial = "All" to visualize partial points for all individuals. #'@param col.var.sup color for supplementary variables. #'@param repel a boolean, whether to use ggrepel to avoid overplotting text #' labels or not. #'@return a ggplot #'@author Fabian Mundt \email{f.mundt@inventionate.de} #'@author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #'@references http://www.sthda.com/english/ #' @examples #' # Hierarchical Multiple Factor Analysis #' # ++++++++++++++++++++++++ #' # Install and load FactoMineR to compute MFA #' # install.packages("FactoMineR") #' library("FactoMineR") #' data(wine) #' hierar <- list(c(2,5,3,10,9,2), c(4,2)) #' res.hmfa <- HMFA(wine, H = hierar, type=c("n",rep("s",5)), graph = FALSE) #' #' # Graph of individuals #' # ++++++++++++++++++++ #' # Color of individuals: col.ind = "#2E9FDF" #' # Use repel = TRUE to avoid overplotting (slow if many points) #' fviz_hmfa_ind(res.hmfa, repel = TRUE, col.ind = "#2E9FDF") #' #' # Color individuals by groups, add concentration ellipses #' # Remove labels: label = "none". #' # Change color palette to "jco". See ?ggpubr::ggpar #' grp <- as.factor(wine[,1]) #' p <- fviz_hmfa_ind(res.hmfa, label="none", habillage=grp, #' addEllipses=TRUE, palette = "jco") #' print(p) #' #' #' # Graph of variables #' # ++++++++++++++++++++++++++++++++++++++++ #' # Quantitative variables #' fviz_hmfa_var(res.hmfa, "quanti.var") #' # Graph of categorical variable categories #' fviz_hmfa_var(res.hmfa, "quali.var") #' # Groups of variables (correlation square) #' fviz_hmfa_var(res.hmfa, "group") #' #' #' # Biplot of categorical variable categories and individuals #' # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #' fviz_hmfa_quali_biplot(res.hmfa) #' #' # Graph of partial individuals (starplot) #' # +++++++++++++++++++++++++++++++++++++++ #' fviz_hmfa_ind(res.hmfa, partial = "all", palette = "Dark2") #' #' #'@name fviz_hmfa #'@rdname fviz_hmfa #'@export fviz_hmfa_ind <- function(X, axes = c(1,2), geom=c("point", "text"), repel = FALSE, habillage="none", addEllipses=FALSE, shape.ind = 19, col.ind = "blue", col.ind.sup = "darkblue", alpha.ind = 1, select.ind = list(name = NULL, cos2 = NULL, contrib = NULL), partial = NULL, col.partial = "group", group.names = NULL, node.level = 1, ...) { extra_args <- list(...) p <- fviz (X, element = "ind", axes = axes, geom = geom, habillage = habillage, addEllipses = addEllipses, pointshape = shape.ind, color = col.ind, alpha = alpha.ind, shape.sup = shape.ind, col.row.sup = col.ind.sup, select = select.ind, repel = repel, ...) # Add partial points if(!is.null(partial)){ invisible <- ifelse(is.null(extra_args$invisible), "none", extra_args$invisible) if(!(partial[1] %in% c("All", "all"))) select.partial = list(name = partial) else select.partial <- NULL if(col.partial %in% c("group", "groups")) col.partial <- "group.name" # Data for individuals ind.sum <- facto_summarize(X, element = "ind", result = c("coord", "contrib", "cos2"), axes = axes) ind <- ind.sum colnames(ind)[2:3] <- c("x", "y") # partial points if(is.null(group.names)) group.names <- rownames(X$group$coord[[node.level]]) ind.partial <- facto_summarize(X, element = "partial.node", node.level = node.level, group.names = group.names, result = c("coord.node.partial"), axes = axes) colnames(ind.partial)[3:4] <- c("x.partial", "y.partial") ind.partial <- merge(ind, ind.partial, by = "name") # Selection ind.all <- ind if(!is.null(select.ind)) ind <- .select(ind, select.ind) if(!is.null(select.partial)) { if(nrow(ind) != nrow(ind.all)) warning("You've already selected individuals. Partial points are only calculated for them.") ind.partial <- ind.partial[ind.partial$name %in% .select(ind, select.partial)$name, , drop = FALSE] } # elements to be hidden hide <- .hide(invisible) # Plot if(!hide$ind & "point" %in% geom) { # Partial point p <- p + ggpubr::geom_exec(geom_point, data = ind.partial, x = "x.partial", y = "y.partial", colour = col.partial, shape = shape.ind, size = 1) # Partial segments p <- p + ggpubr::geom_exec(geom_segment, data = ind.partial, x = "x", y = "y", xend = 'x.partial', yend = 'y.partial', linetype = "group.name", colour = col.partial, size = 0.5) } # Edit plot title and legend title p <- p + labs(colour = "Groups", linetype = "Groups") } p } #' @rdname fviz_hmfa #' @export fviz_hmfa_var <- function(X, choice = c("quanti.var", "quali.var", "group"), axes=c(1,2), geom=c("point", "text"), repel = FALSE, col.var = "red", alpha.var = 1, shape.var = 17, col.var.sup = "darkgreen", select.var = list(name = NULL, cos2 = NULL, contrib = NULL), ...) { choice <- match.arg(choice) if(choice == "quanti.var") { if(missing(geom)) geom <- c("arrow", "text") } fviz (X, element = choice, axes = axes, geom = geom, color = col.var, alpha = alpha.var, pointshape = shape.var, shape.sup = shape.var, col.col.sup = col.var.sup, select = select.var, repel = repel, ...) } #' @rdname fviz_hmfa #' @export fviz_hmfa_quali_biplot <- function(X, axes = c(1,2), geom=c("point", "text"), repel = FALSE, habillage = "none", title = "Biplot of individuals and qualitative variables - HMFA", ...) { # Individuals p <- fviz_hmfa_ind(X, axes = axes, geom = geom, repel = repel, habillage = habillage, ...) # Variable # Add variables p <- fviz_hmfa_var(X, "quali.var", axes = axes, geom = geom, repel = repel, ggp = p, ...) p+labs(title=title) } #' @rdname fviz_hmfa #' @export fviz_hmfa <- function(X, ...){ # fviz_hmfa_ind_starplot(X, ...) fviz_hmfa_ind(X, ...) } factoextra/R/multishapes.R0000644000176200001440000000160013144620011015261 0ustar liggesusers#' A dataset containing clusters of multiple shapes #' #' @description Data containing clusters of any shapes. Useful for comparing #' density-based clustering (DBSCAN) and standard partitioning methods such as #' k-means clustering. #' @name multishapes #' @docType data #' @usage data("multishapes") #' @format A data frame with 1100 observations on the following 3 variables. #' \describe{ #' \item{\code{x}}{a numeric vector containing the x coordinates of observations} #' \item{\code{y}}{a numeric vector containing the y coordinates of observations} #' \item{\code{shape}}{a numeric vector corresponding to the cluster number of each observations.} #' } #' @details #' The dataset contains 5 clusters and some outliers/noises. #' #' @examples #' \donttest{ #'data(multishapes) #'plot(multishapes[,1], multishapes[, 2], #' col = multishapes[, 3], pch = 19, cex = 0.8) #' } #' NULLfactoextra/R/cluster_utilities.R0000644000176200001440000000125413637600037016521 0ustar liggesusers # Ge the silhouette information # cluster: the cluster assignement of observation # diss the dissimilarity matrix .get_silinfo <- function(cluster, diss){ k <- length(unique(cluster)) silinfo <- list() if(k > 1) { sil.obj <- cluster::silhouette(cluster, diss) widths <- as.data.frame(sil.obj[, 1:3]) rownames(widths) <- colnames(as.matrix(diss)) widths <- widths[order(widths$cluster, -widths$sil_width), ] widths$cluster <- as.factor(widths$cluster) # summary silinfo$widths <- widths silinfo$clus.avg.widths <- as.vector(tapply(widths$sil_width, widths$cluster, mean)) silinfo$avg.width <- mean(widths$sil_width) } silinfo }factoextra/R/fviz_nbclust.R0000644000176200001440000003167713637611036015472 0ustar liggesusers#' @include hcut.R NULL #' Dertermining and Visualizing the Optimal Number of Clusters #' @description Partitioning methods, such as k-means clustering require the #' users to specify the number of clusters to be generated. \itemize{ #' \item{fviz_nbclust(): Dertemines and visualize the optimal number of #' clusters using different methods: \strong{within cluster sums of squares}, #' \strong{average silhouette} and \strong{gap statistics}. } #' \item{fviz_gap_stat(): Visualize the gap statistic generated by the #' function \code{\link[cluster]{clusGap}}() [in cluster package]. The optimal #' number of clusters is specified using the "firstmax" method #' (?cluster::clustGap).} } #' #' Read more: #' \href{http://www.sthda.com/english/wiki/determining-the-optimal-number-of-clusters-3-must-known-methods-unsupervised-machine-learning}{Determining #' the optimal number of clusters} #' #' @param x numeric matrix or data frame. In the function fviz_nbclust(), x can #' be the results of the function NbClust(). #' @param method the method to be used for estimating the optimal number of #' clusters. Possible values are "silhouette" (for average silhouette width), #' "wss" (for total within sum of square) and "gap_stat" (for gap statistics). #' @param FUNcluster a partitioning function which accepts as first argument a #' (data) matrix like x, second argument, say k, k >= 2, the number of #' clusters desired, and returns a list with a component named cluster which #' contains the grouping of observations. Allowed values include: kmeans, #' cluster::pam, cluster::clara, cluster::fanny, hcut, etc. This argument is #' not required when x is an output of the function #' \code{NbClust::NbClust()}. #' @param diss dist object as produced by dist(), i.e.: diss = dist(x, method = #' "euclidean"). Used to compute the average silhouette width of clusters, the #' within sum of square and hierarchical clustering. If NULL, dist(x) is #' computed with the default method = "euclidean" #' @param k.max the maximum number of clusters to consider, must be at least two. #' @param nboot integer, number of Monte Carlo ("bootstrap") samples. Used only for determining the number of clusters #' using gap statistic. #' @param verbose logical value. If TRUE, the result of progress is printed. #' @param barfill,barcolor fill color and outline color for bars #' @param linecolor color for lines #' @param print.summary logical value. If true, the optimal number of clusters #' are printed in fviz_nbclust(). #' @param ... optionally further arguments for FUNcluster() #' #' @return \itemize{ \item fviz_nbclust, fviz_gap_stat: return a ggplot2 } #' @seealso \code{\link{fviz_cluster}}, \code{\link{eclust}} #' @author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #' #' @examples #' set.seed(123) #' #' # Data preparation #' # +++++++++++++++ #' data("iris") #' head(iris) #' # Remove species column (5) and scale the data #' iris.scaled <- scale(iris[, -5]) #' #' #' # Optimal number of clusters in the data #' # ++++++++++++++++++++++++++++++++++++++ #' # Examples are provided only for kmeans, but #' # you can also use cluster::pam (for pam) or #' # hcut (for hierarchical clustering) #' #' ### Elbow method (look at the knee) #' # Elbow method for kmeans #' fviz_nbclust(iris.scaled, kmeans, method = "wss") + #' geom_vline(xintercept = 3, linetype = 2) #' #' # Average silhouette for kmeans #' fviz_nbclust(iris.scaled, kmeans, method = "silhouette") #' #' ### Gap statistic #' library(cluster) #' set.seed(123) #' # Compute gap statistic for kmeans #' # we used B = 10 for demo. Recommended value is ~500 #' gap_stat <- clusGap(iris.scaled, FUN = kmeans, nstart = 25, #' K.max = 10, B = 10) #' print(gap_stat, method = "firstmax") #' fviz_gap_stat(gap_stat) #' #' # Gap statistic for hierarchical clustering #' gap_stat <- clusGap(iris.scaled, FUN = hcut, K.max = 10, B = 10) #' fviz_gap_stat(gap_stat) #' #' #' @name fviz_nbclust #' @rdname fviz_nbclust #' @export fviz_nbclust <- function (x, FUNcluster = NULL, method = c("silhouette", "wss", "gap_stat"), diss = NULL, k.max = 10, nboot = 100, verbose = interactive(), barfill="steelblue", barcolor="steelblue", linecolor = "steelblue", print.summary = TRUE, ...) { set.seed(123) if(k.max < 2) stop("k.max must bet > = 2") method = match.arg(method) if(!inherits(x, c("data.frame", "matrix")) & !("Best.nc" %in% names(x))) stop("x should be an object of class matrix/data.frame or ", "an object created by the function NbClust() [NbClust package].") # x is an object created by the function NbClust() [NbClust package] if(inherits(x, "list") & "Best.nc" %in% names(x)){ best_nc <- x$Best.nc if(class(best_nc) == "numeric") print(best_nc) else if(class(best_nc) == "matrix") .viz_NbClust(x, print.summary, barfill, barcolor) } else if(is.null(FUNcluster)) stop("The argument FUNcluster is required. ", "Possible values are kmeans, pam, hcut, clara, ...") else if(!is.function(FUNcluster)){ stop( "The argument FUNcluster should be a function. ", "Check if you're not overriding the specified function name somewhere." ) } else if(method %in% c("silhouette", "wss")) { if (is.data.frame(x)) x <- as.matrix(x) if(is.null(diss)) diss <- stats::dist(x) v <- rep(0, k.max) if(method == "silhouette"){ for(i in 2:k.max){ clust <- FUNcluster(x, i, ...) v[i] <- .get_ave_sil_width(diss, clust$cluster) } } else if(method == "wss"){ for(i in 1:k.max){ clust <- FUNcluster(x, i, ...) v[i] <- .get_withinSS(diss, clust$cluster) } } df <- data.frame(clusters = as.factor(1:k.max), y = v, stringsAsFactors = TRUE) ylab <- "Total Within Sum of Square" if(method == "silhouette") ylab <- "Average silhouette width" p <- ggpubr::ggline(df, x = "clusters", y = "y", group = 1, color = linecolor, ylab = ylab, xlab = "Number of clusters k", main = "Optimal number of clusters" ) if(method == "silhouette") p <- p + geom_vline(xintercept = which.max(v), linetype=2, color = linecolor) return(p) } else if(method == "gap_stat"){ extra_args <- list(...) gap_stat <- cluster::clusGap(x, FUNcluster, K.max = k.max, B = nboot, verbose = verbose, ...) if(!is.null(extra_args$maxSE)) maxSE <- extra_args$maxSE else maxSE <- list(method = "firstSEmax", SE.factor = 1) p <- fviz_gap_stat(gap_stat, linecolor = linecolor, maxSE = maxSE) return(p) } } #' @rdname fviz_nbclust #' @param gap_stat an object of class "clusGap" returned by the function #' clusGap() [in cluster package] #' @param maxSE a list containing the parameters (method and SE.factor) for #' determining the location of the maximum of the gap statistic (Read the #' documentation ?cluster::maxSE). Allowed values for maxSE$method include: #' \itemize{ \item "globalmax": simply corresponds to the global maximum, #' i.e., is which.max(gap) \item "firstmax": gives the location of the first #' local maximum \item "Tibs2001SEmax": uses the criterion, Tibshirani et al #' (2001) proposed: "the smallest k such that gap(k) >= gap(k+1) - s_{k+1}". #' It's also possible to use "the smallest k such that gap(k) >= gap(k+1) - #' SE.factor*s_{k+1}" where SE.factor is a numeric value which can be 1 #' (default), 2, 3, etc. \item "firstSEmax": location of the first f() value #' which is not larger than the first local maximum minus SE.factor * SE.f[], #' i.e, within an "f S.E." range of that maximum. \item #' see ?cluster::maxSE for more options } #' #' #' @export fviz_gap_stat <- function(gap_stat, linecolor = "steelblue", maxSE = list(method = "firstSEmax", SE.factor = 1)){ if(!inherits(gap_stat, "clusGap")) stop("Only an object of class clusGap is allowed. (cluster package)") if(is.list(maxSE)){ if(is.null(maxSE$method)) maxSE$method = "firstmax" if(is.null(maxSE$SE.factor)) maxSE$SE.factor = 1 } else stop("The argument maxSE must be a list containing the parameters method and SE.factor") # first local max gap <- gap_stat$Tab[, "gap"] se <- gap_stat$Tab[, "SE.sim"] decr <- diff(gap) <= 0 k <- .maxSE(gap, se, method = maxSE$method, SE.factor = maxSE$SE.factor) #k <- length(gap) #k = if (any(decr)) which.max(decr) else k df <- as.data.frame(gap_stat$Tab, stringsAsFactors = TRUE) df$clusters <- as.factor(1:nrow(df)) df$ymin <- gap-se df$ymax <- gap + se p <- ggpubr::ggline(df, x = "clusters", y = "gap", group = 1, color = linecolor)+ ggplot2::geom_errorbar(aes_string(ymin="ymin", ymax="ymax"), width=.2, color = linecolor)+ geom_vline(xintercept = k, linetype=2, color = linecolor)+ labs(y = "Gap statistic (k)", x = "Number of clusters k", title = "Optimal number of clusters") p } # Get the average silhouette width # ++++++++++++++++++++++++++ # Cluster package required # d: dist object # cluster: cluster number of observation .get_ave_sil_width <- function(d, cluster){ if (!requireNamespace("cluster", quietly = TRUE)) { stop("cluster package needed for this function to work. Please install it.") } ss <- cluster::silhouette(cluster, d) mean(ss[, 3]) } # Get total within sum of square # +++++++++++++++++++++++++++++ # d: dist object # cluster: cluster number of observation .get_withinSS <- function(d, cluster){ d <- stats::as.dist(d) cn <- max(cluster) clusterf <- as.factor(cluster) clusterl <- levels(clusterf) cnn <- length(clusterl) if (cn != cnn) { warning("cluster renumbered because maximum != number of clusters") for (i in 1:cnn) cluster[clusterf == clusterl[i]] <- i cn <- cnn } cwn <- cn # Compute total within sum of square dmat <- as.matrix(d) within.cluster.ss <- 0 for (i in 1:cn) { cluster.size <- sum(cluster == i) di <- as.dist(dmat[cluster == i, cluster == i]) within.cluster.ss <- within.cluster.ss + sum(di^2)/cluster.size } within.cluster.ss } # Visualization of the output returned by the function # NbClust() # x : an object generated by the function NbClust() .viz_NbClust <- function(x, print.summary = TRUE, barfill = "steelblue", barcolor = "steelblue") { best_nc <- x$Best.nc if(class(best_nc) == "numeric") print(best_nc) else if(class(best_nc) == "matrix"){ best_nc <- as.data.frame(t(best_nc), stringsAsFactors = TRUE) best_nc$Number_clusters <- as.factor(best_nc$Number_clusters) # Summary if(print.summary){ ss <- summary(best_nc$Number_clusters) cat ("Among all indices: \n===================\n") for(i in 1 :length(ss)){ cat("*", ss[i], "proposed ", names(ss)[i], "as the best number of clusters\n" ) } cat("\nConclusion\n=========================\n") cat("* According to the majority rule, the best number of clusters is ", names(which.max(ss)), ".\n\n") } df <- data.frame(Number_clusters = names(ss), freq = ss, stringsAsFactors = TRUE ) p <- ggpubr::ggbarplot(df, x = "Number_clusters", y = "freq", fill = barfill, color = barcolor)+ labs(x = "Number of clusters k", y = "Frequency among all indices", title = paste0("Optimal number of clusters - k = ", names(which.max(ss)) )) return(p) } } # Determines the location of the maximum of f see ?cluster::maxSE # +++++++++++++++++++++++++++++++++++++++++++ # f: numeric vector containing the gap statistic # SE.f : standard error of the gap statistic # method : character string indicating how the "optimal" number of clusters, k, # is computed from the gap statistics (and their standard deviations), # or more generally how the location k^ of the maximum of f[k] should be determined. # SE.factor: Determining the optimal number of clusters, Tibshirani et al. proposed the "1 S.E."-rule. .maxSE <- function (f, SE.f, method = c("firstSEmax", "Tibs2001SEmax", "globalSEmax", "firstmax", "globalmax"), SE.factor = 1) { method <- match.arg(method) stopifnot((K <- length(f)) >= 1, K == length(SE.f), SE.f >= 0, SE.factor >= 0) fSE <- SE.factor * SE.f switch(method, firstmax = { decr <- diff(f) <= 0 if (any(decr)) which.max(decr) else K }, globalmax = { which.max(f) }, Tibs2001SEmax = { g.s <- f - fSE if (any(mp <- f[-K] >= g.s[-1])) which.max(mp) else K }, firstSEmax = { decr <- diff(f) <= 0 nc <- if (any(decr)) which.max(decr) else K if (any(mp <- f[seq_len(nc - 1)] >= f[nc] - fSE[nc])) which(mp)[1] else nc }, globalSEmax = { nc <- which.max(f) if (any(mp <- f[seq_len(nc - 1)] >= f[nc] - fSE[nc])) which(mp)[1] else nc }) } factoextra/R/fviz_famd.R0000644000176200001440000001401413145326766014720 0ustar liggesusers#' @include get_mfa.R NULL #' Visualize Factor Analysis of Mixed Data #' #' @description Factor analysis of mixed data (FAMD) is, a particular case of #' MFA, used to analyze a data set containing both quantitative and #' qualitative variables. fviz_famd() provides ggplot2-based elegant #' visualization of FAMD outputs from the R function: FAMD [FactoMineR].\cr\cr #' \itemize{ \item{fviz_famd_ind(): Graph of individuals} #' \item{fviz_famd_var(): Graph of variables} \item{fviz_famd(): An alias of #' fviz_famd_ind(res.famd)} } #' #' @param X an object of class FAMD [FactoMineR]. #' @inheritParams fviz_mca #' @inheritParams fviz_pca #' @inheritParams fviz #' @inheritParams ggpubr::ggpar #' @param choice The graph to plot inf fviz_mfa_var(). Allowed values include #' one of c("var", quanti.var", "quali.var"). #' @param habillage an optional factor variable for coloring the observations by #' groups. Default value is "none". If X is an MFA object from FactoMineR #' package, habillage can also specify the index of the factor variable in the #' data. #' @param col.ind,col.var color for individuals and variables, respectively. Can #' be a continuous variable or a factor variable. Possible values include also #' : "cos2", "contrib", "coord", "x" or "y". In this case, the colors for #' individuals/variables are automatically controlled by their qualities #' ("cos2"), contributions ("contrib"), coordinates (x^2 + y^2 , "coord"), x #' values("x") or y values("y"). To use automatic coloring (by cos2, contrib, #' ....), make sure that habillage ="none". #' @param col.var.sup color for supplementary variables. #' @param col.quali.var color for qualitative variables in fviz_mfa_ind(). #' Default is "black". #' @param alpha.ind,alpha.var controls the transparency of individuals and #' variables, respectively. The value can variate from 0 (total transparency) #' to 1 (no transparency). Default value is 1. Possible values include also : #' "cos2", "contrib", "coord", "x" or "y". In this case, the transparency for #' individual/variable colors are automatically controlled by their qualities #' ("cos2"), contributions ("contrib"), coordinates (x^2 + y^2 , "coord"), x #' values("x") or y values("y"). To use this, make sure that habillage #' ="none". #' @param shape.ind,shape.var point shapes of individuals, variables, groups and #' axes #' @param select.ind,select.var a selection of individuals and variables to be #' drawn. Allowed values are NULL or a list containing the arguments name, #' cos2 or contrib: \itemize{ \item name is a character vector containing #' individuals/variables to be drawn \item cos2 if cos2 is in [0, 1], ex: 0.6, #' then individuals/variables with a cos2 > 0.6 are drawn. if cos2 > 1, ex: 5, #' then the top 5 individuals/variables with the highest cos2 are drawn. \item #' contrib if contrib > 1, ex: 5, then the top 5 individuals/variables with #' the highest cos2 are drawn } #' @param ... Arguments to be passed to the function fviz() #' @param repel a boolean, whether to use ggrepel to avoid overplotting text #' labels or not. #' @return a ggplot #' @author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #' @examples #' # Compute FAMD #' library("FactoMineR") #' data(wine) #' res.famd <- FAMD(wine[,c(1,2, 16, 22, 29, 28, 30,31)], graph = FALSE) #' #' # Eigenvalues/variances of dimensions #' fviz_screeplot(res.famd) #' # Graph of variables #' fviz_famd_var(res.famd) #' # Quantitative variables #' fviz_famd_var(res.famd, "quanti.var", repel = TRUE, col.var = "black") #' # Qualitative variables #' fviz_famd_var(res.famd, "quali.var", col.var = "black") #' # Graph of individuals colored by cos2 #' fviz_famd_ind(res.famd, col.ind = "cos2", #' gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), #' repel = TRUE) #' #' #' @name fviz_famd #' @rdname fviz_famd #' @export fviz_famd_ind <- function(X, axes = c(1,2), geom=c("point", "text"), repel = FALSE, habillage = "none", palette = NULL, addEllipses = FALSE, col.ind = "blue", col.ind.sup = "darkblue", alpha.ind = 1, shape.ind = 19, col.quali.var = "black", select.ind = list(name = NULL, cos2 = NULL, contrib = NULL), gradient.cols = NULL, ...) { extra_args <- list(...) if(col.ind %in% c("cos2","contrib", "coord")) partial = NULL # Add qualitative variables if they exist show.quali.var <- !("quali.var" %in% extra_args$invisible) & !is.null(X$quali.var) p <- NULL if(show.quali.var) p <- fviz_famd_var(X, "quali.var", axes = axes, geom = geom, repel = repel, col.var = col.quali.var, ...) # Individuals p <- fviz (X, element = "ind", axes = axes, geom = geom, habillage = habillage, addEllipses = addEllipses, palette = palette, pointshape = shape.ind, color = col.ind, alpha = alpha.ind, shape.sup = shape.ind, col.row.sup = col.ind.sup, select = select.ind, repel = repel, ggp = p, ...) if(!is.null(gradient.cols)) p <- p + ggpubr::gradient_color(gradient.cols) p } #' @rdname fviz_famd #' @export fviz_famd_var <- function(X, choice = c( "var", "quanti.var", "quali.var"), axes = c(1,2), geom = c("point", "text"), repel = FALSE, col.var ="red", alpha.var=1, shape.var = 17, col.var.sup = "darkgreen", select.var = list(name = NULL, cos2 = NULL, contrib = NULL), ...) { choice <- match.arg(choice) if(choice == "quanti.var") { if(missing(geom)) geom <- c("arrow", "text") } # Main plot fviz (X, element = choice, axes = axes, geom = geom, color = col.var, alpha = alpha.var, pointshape = shape.var, shape.sup = shape.var, col.col.sup = col.var.sup, select = select.var, repel = repel, ...) } #' @rdname fviz_famd #' @export fviz_famd <- function(X, ...){ fviz_famd_ind(X, ...) } factoextra/R/get_hmfa.R0000644000176200001440000001113413144620011014500 0ustar liggesusers#' @include print.factoextra.R NULL #' Extract the results for individuals/variables/group/partial axes - HMFA #' #' @description Extract all the results (coordinates, squared cosine and #' contributions) for the active individuals/quantitative variables/qualitative #' variable categories/groups/partial axes from Hierarchical Multiple Factor #' Analysis (HMFA) outputs.\cr\cr \itemize{ \item get_hmfa(): Extract the #' results for variables and individuals \item get_hmfa_ind(): Extract the #' results for individuals only \item get_mfa_var(): Extract the results for #' variables (quantitatives, qualitatives and groups) #' \item get_hmfa_partial(): Extract the results for partial.node. } #' #' @param res.hmfa an object of class HMFA [FactoMineR]. #' @param element the element to subset from the output. Possible values are #' "ind", "quanti.var", "quali.var", "group" or "partial.node". #' @return a list of matrices containing the results for the active #' individuals, variables, groups and partial nodes, including : #' \item{coord}{coordinates} \item{cos2}{cos2} #' \item{contrib}{contributions} #' @author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #' @author Fabian Mundt \email{f.mundt@@inventionate.de} #' @examples #' # Multiple Factor Analysis #' # ++++++++++++++++++++++++ #' # Install and load FactoMineR to compute MFA #' # install.packages("FactoMineR") #' library("FactoMineR") #' data(wine) #' hierar <- list(c(2,5,3,10,9,2), c(4,2)) #' res.hmfa <- HMFA(wine, H = hierar, type=c("n",rep("s",5)), graph = FALSE) #' #' # Extract the results for qualitative variable categories #' var <- get_hmfa_var(res.hmfa, "quali.var") #' print(var) #' head(var$coord) # coordinates of qualitative variables #' head(var$cos2) # cos2 of qualitative variables #' head(var$contrib) # contributions of qualitative variables #' #' # Extract the results for individuals #' ind <- get_hmfa_ind(res.hmfa) #' print(ind) #' head(ind$coord) # coordinates of individuals #' head(ind$cos2) # cos2 of individuals #' head(ind$contrib) # contributions of individuals #' #' # You can also use the function get_hmfa() #' get_hmfa(res.hmfa, "ind") # Results for individuals #' get_hmfa(res.hmfa, "quali.var") # Results for qualitative variable categories #' #' @name get_hmfa #' #' @rdname get_hmfa #' @export get_hmfa <- function(res.hmfa, element = c("ind", "quanti.var", "quali.var", "group", "partial.node")){ elmt <- match.arg(element) if(elmt == "ind") get_hmfa_ind(res.hmfa) else if(elmt %in% c("quanti.var", "quali.var", "group")) get_hmfa_var(res.hmfa, elmt) else if(elmt == "partial.node") get_hmfa_partial(res.hmfa) } #' @rdname get_hmfa #' @export get_hmfa_ind <- function(res.hmfa){ # FactoMineR package if(inherits(res.hmfa, c("HMFA"))) ind <- res.hmfa$ind # @todo ade4 Support muss noch eingebaut werden! else stop("An object of class : ", class(res.hmfa), " can't be handled by the function get_hmfa_ind()") class(ind)<-c("factoextra", "hmfa", "hmfa_ind") attr(ind, "element") <- "individuals" return(ind) } #' @rdname get_hmfa #' @export get_hmfa_var <- function(res.hmfa, element = c( "quanti.var", "quali.var", "group")){ choice <- match.arg(element) if(!inherits(res.hmfa, "HMFA")) stop("An object of class : ", class(res.hmfa), " can't be handled.") if(choice == "quanti.var" & is.null(res.hmfa$quanti.var)) stop("There are no quantitative variables in this HMFA.") else if(choice == "quali.var" & is.null(res.hmfa$quali.var)) stop("There are no qualitative variables in this HMFA.") vars <- switch(choice, quanti.var = res.hmfa$quanti.var, quali.var = res.hmfa$quali.var, group = list(coord = res.hmfa$group$coord[[1]], canonical = res.hmfa$group$canonical) ) element_desc <- switch(choice, quanti.var = "quantitative variables", quali.var = "qualitative variable categories", group = "variable groups" ) class(vars)<-c("factoextra", "hmfa", paste0("hmfa_", gsub(".", "_", choice, fixed = TRUE))) attr(vars, "element") <- element_desc return(vars) } #' @rdname get_hmfa #' @export get_hmfa_partial <- function(res.hmfa){ # FactoMineR package # Group calculation is only for first layer valid (see Pages 2015) if(inherits(res.hmfa, c("HMFA"))) partial <- res.hmfa$partial else stop("An object of class : ", class(res.hmfa), " can't be handled by the function get_hmfa_partial()") class(partial)<-c("list", "hmfa_partial") attr(partial, "element") <- "partial node" return(partial) }factoextra/R/get_pca.R0000644000176200001440000001666713144620011014350 0ustar liggesusers#' @include print.factoextra.R utilities.R NULL #' Extract the results for individuals/variables - PCA #' #' @description #' Extract all the results (coordinates, squared cosine, contributions) for #' the active individuals/variables from Principal Component Analysis (PCA) outputs.\cr\cr #' \itemize{ #' \item get_pca(): Extract the results for variables and individuals #' \item get_pca_ind(): Extract the results for individuals only #' \item get_pca_var(): Extract the results for variables only #' } #' @param res.pca an object of class PCA [FactoMineR]; #' prcomp and princomp [stats]; pca, dudi [adea4]; epPCA [ExPosition]. #' @param element the element to subset from the output. Allowed values are #' "var" (for active variables) or "ind" (for active individuals). #' @param ... not used #' @return a list of matrices containing all the results for the active individuals/variables including: #' \item{coord}{coordinates for the individuals/variables} #' \item{cos2}{cos2 for the individuals/variables} #' \item{contrib}{contributions of the individuals/variables} #' @author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #' @references http://www.sthda.com/english/ #' @examples #' \donttest{ #' # Principal Component Analysis #' # +++++++++++++++++++++++++++++ #' data(iris) #' res.pca <- prcomp(iris[, -5], scale = TRUE) #' # Extract the results for individuals #' ind <- get_pca_ind(res.pca) #' print(ind) #' head(ind$coord) # coordinates of individuals #' head(ind$cos2) # cos2 of individuals #' head(ind$contrib) # contributions of individuals #' #' # Extract the results for variables #' var <- get_pca_var(res.pca) #' print(var) #' head(var$coord) # coordinates of variables #' head(var$cos2) # cos2 of variables #' head(var$contrib) # contributions of variables #' #' # You can also use the function get_pca() #' get_pca(res.pca, "ind") # Results for individuals #' get_pca(res.pca, "var") # Results for variable categories #' } #' @name get_pca #' #' @rdname get_pca #' @export get_pca <- function(res.pca, element = c("var", "ind")){ elmt <- match.arg(element) if(elmt =="var") get_pca_var(res.pca) else if(elmt == "ind") get_pca_ind(res.pca) } #' @rdname get_pca #' @export get_pca_ind<-function(res.pca, ...){ # FactoMineR package if(inherits(res.pca, c('PCA'))) ind <- res.pca$ind # ade4 package else if(inherits(res.pca, 'pca') & inherits(res.pca, 'dudi')){ ind.coord <- res.pca$li # get the original data data <- res.pca$tab data <- t(apply(data, 1, function(x){x*res.pca$norm} )) data <- t(apply(data, 1, function(x){x+res.pca$cent})) ind <- .get_pca_ind_results(ind.coord, data, res.pca$eig, res.pca$cent, res.pca$norm) } # stats package else if(inherits(res.pca, 'princomp')){ ind.coord <- res.pca$scores data <- .prcomp_reconst(res.pca) ind <- .get_pca_ind_results(ind.coord, data, res.pca$sdev^2, res.pca$center, res.pca$scale) } else if(inherits(res.pca, 'prcomp')){ ind.coord <- res.pca$x data <- .prcomp_reconst(res.pca) ind <- .get_pca_ind_results(ind.coord, data, res.pca$sdev^2, res.pca$center, res.pca$scale) } # ExPosition package else if (inherits(res.pca, "expoOutput") & inherits(res.pca$ExPosition.Data,'epPCA')){ res <- res.pca$ExPosition.Data ind <- list(coord = res$fi, cos2 = res$ri, contrib = res$ci*100) } else stop("An object of class : ", class(res.pca), " can't be handled by the function get_pca_ind()") class(ind)<-c("factoextra", "pca_ind") ind } #' @rdname get_pca #' @export get_pca_var<-function(res.pca){ # FactoMineR package if(inherits(res.pca, c('PCA'))) var <- res.pca$var # ade4 package else if(inherits(res.pca, 'pca') & inherits(res.pca, 'dudi')){ var <- .get_pca_var_results(res.pca$co) } # stats package else if(inherits(res.pca, 'princomp')){ # Correlation of variables with the principal component var_cor_func <- function(var.loadings, comp.sdev){var.loadings*comp.sdev} var.cor <- t(apply(res.pca$loadings, 1, var_cor_func, res.pca$sdev)) var <- .get_pca_var_results(var.cor) } else if(inherits(res.pca, 'prcomp')){ # Correlation of variables with the principal component var_cor_func <- function(var.loadings, comp.sdev){var.loadings*comp.sdev} var.cor <- t(apply(res.pca$rotation, 1, var_cor_func, res.pca$sdev)) var <- .get_pca_var_results(var.cor) } # ExPosition package else if (inherits(res.pca, "expoOutput") & inherits(res.pca$ExPosition.Data,'epPCA')){ res <- res.pca$ExPosition.Data data_matrix <- res$X factor_scores <- res$fi var.coord <- var.cor <- stats::cor(res$X, res$fi) # cor(t(data_matrix), factor_scores) var.coord <- replace(var.coord, is.na(var.coord), 0) var <- list(coord = var.coord, cor = var.coord, cos2 = res$rj, contrib = res$cj*100) } else stop("An object of class : ", class(res.pca), " can't be handled by the function get_pca_var()") class(var)<-c("factoextra", "pca_var") var } # Helper functions #++++++++++++++++++++ # compute all the results for individuals : coord, cor, cos2, contrib # ind.coord : coordinates of variables on the principal component # pca.center, pca.scale : numeric vectors corresponding to the pca # center and scale respectively # data : the orignal data used during the pca analysis # eigenvalues : principal component eigenvalues .get_pca_ind_results <- function(ind.coord, data, eigenvalues, pca.center, pca.scale ){ eigenvalues <- eigenvalues[1:ncol(ind.coord)] if(pca.center[1] == FALSE) pca.center <- rep(0, ncol(data)) if(pca.scale[1] == FALSE) pca.scale <- rep(1, ncol(data)) # Compute the square of the distance between an individual and the # center of gravity getdistance <- function(ind_row, center, scale){ return(sum(((ind_row-center)/scale)^2)) } d2 <- apply(data, 1,getdistance, pca.center, pca.scale) # Compute the cos2 cos2 <- function(ind.coord, d2){return(ind.coord^2/d2)} ind.cos2 <- apply(ind.coord, 2, cos2, d2) # Individual contributions contrib <- function(ind.coord, eigenvalues, n.ind){ 100*(1/n.ind)*(ind.coord^2/eigenvalues) } ind.contrib <- t(apply(ind.coord, 1, contrib, eigenvalues, nrow(ind.coord))) colnames(ind.coord) <- colnames(ind.cos2) <- colnames(ind.contrib) <- paste0("Dim.", 1:ncol(ind.coord)) rnames <- rownames(ind.coord) if(is.null(rnames)) rnames <- as.character(1:nrow(ind.coord)) rownames(ind.coord) <- rownames(ind.cos2) <- rownames(ind.contrib) <- rnames # Individuals coord, cos2 and contrib ind = list(coord = ind.coord, cos2 = ind.cos2, contrib = ind.contrib) ind } # compute all the results for variables : coord, cor, cos2, contrib # var.coord : coordinates of variables on the principal component .get_pca_var_results <- function(var.coord){ var.cor <- var.coord # correlation var.cos2 <- var.cor^2 # variable qualities # variable contributions (in percent) # var.cos2*100/total Cos2 of the component comp.cos2 <- apply(var.cos2, 2, sum) contrib <- function(var.cos2, comp.cos2){var.cos2*100/comp.cos2} var.contrib <- t(apply(var.cos2,1, contrib, comp.cos2)) colnames(var.coord) <- colnames(var.cor) <- colnames(var.cos2) <- colnames(var.contrib) <- paste0("Dim.", 1:ncol(var.coord)) # Variable coord, cor, cos2 and contrib list(coord = var.coord, cor = var.cor, cos2 = var.cos2, contrib = var.contrib) } factoextra/R/get_mca.R0000644000176200001440000001535213144620011014333 0ustar liggesusers#' @include print.factoextra.R NULL #' Extract the results for individuals/variables - MCA #' #' @description Extract all the results (coordinates, squared cosine and #' contributions) for the active individuals/variable categories from Multiple #' Correspondence Analysis (MCA) outputs.\cr\cr \itemize{ \item get_mca(): #' Extract the results for variables and individuals \item get_mca_ind(): #' Extract the results for individuals only \item get_mca_var(): Extract the #' results for variables only } #' @param res.mca an object of class MCA [FactoMineR], acm [ade4], expoOutput/epMCA [ExPosition]. #' @param element the element to subset from the output. Possible values are #' "var" for variables, "ind" for individuals, "mca.cor" for correlation #' between variables and principal dimensions, "quanti.sup" for quantitative supplementary variables. #' @return a list of matrices containing the results for the active #' individuals/variable categories including : \item{coord}{coordinates for #' the individuals/variable categories} \item{cos2}{cos2 for the #' individuals/variable categories} \item{contrib}{contributions of the #' individuals/variable categories} \item{inertia}{inertia of the #' individuals/variable categories} #' @author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #' @references http://www.sthda.com/english/ #' @examples #' \donttest{ #' # Multiple Correspondence Analysis #' # ++++++++++++++++++++++++++++++ #' # Install and load FactoMineR to compute MCA #' # install.packages("FactoMineR") #' library("FactoMineR") #' data(poison) #' poison.active <- poison[1:55, 5:15] #' head(poison.active[, 1:6]) #' res.mca <- MCA(poison.active, graph=FALSE) #' #' # Extract the results for variable categories #' var <- get_mca_var(res.mca) #' print(var) #' head(var$coord) # coordinates of variables #' head(var$cos2) # cos2 of variables #' head(var$contrib) # contributions of variables #' #' # Extract the results for individuals #' ind <- get_mca_ind(res.mca) #' print(ind) #' head(ind$coord) # coordinates of individuals #' head(ind$cos2) # cos2 of individuals #' head(ind$contrib) # contributions of individuals #' #' # You can also use the function get_mca() #' get_mca(res.mca, "ind") # Results for individuals #' get_mca(res.mca, "var") # Results for variable categories #' } #' #' @name get_mca #' #' @rdname get_mca #' @export get_mca <- function(res.mca, element = c("var", "ind", "mca.cor", "quanti.sup")){ elmt <- match.arg(element) if(elmt == "ind") get_mca_ind(res.mca) else get_mca_var(res.mca, elmt) } #' @rdname get_mca #' @export get_mca_var <- function(res.mca, element = c( "var", "mca.cor", "quanti.sup")){ choice <- match.arg(element) element_desc <- "variables" # FactoMineR package if(inherits(res.mca, c("MCA"))) { vars <- switch(choice, var = res.mca$var, mca.cor = list(coord = res.mca$var$eta2), quanti.sup = res.mca$quanti.sup ) element_desc <- switch(choice, var = "variables", mca.cor = "correlation between variables and dimensions", quanti.sup = "quantitative supplementary variables" ) } # ade4 package else if(inherits(res.mca, "acm") & inherits(res.mca, 'dudi')){ if (!requireNamespace("ade4", quietly = TRUE)) { stop("ade4 package needed for this function to work. Please install it.") } if(choice == "var"){ coord <- res.mca$co inertia <- ade4::inertia.dudi(res.mca, row.inertia = FALSE, col.inertia = TRUE) vv <- as.character(utils::packageVersion("ade4")) cc <- utils::compareVersion(vv, "1.7.4") > 0 if(cc){ # "v>1.7.4" cos2 <- abs(inertia$col.rel/100)[, 1:ncol(coord)] contrib <- (inertia$col.abs)[, 1:ncol(coord)] } # v<=1.7.4 else { cos2 <- abs(inertia$col.rel/10000)[, 1:ncol(coord)] contrib <- (inertia$col.abs/100)[, 1:ncol(coord)] } colnames(coord) <- colnames(cos2) <- colnames(contrib) <- paste0("Dim.", 1:ncol(coord)) vars <- list(coord = coord, contrib = contrib, cos2 = cos2) } else{ vars <- list() stop("Don't handle ", choice, " for MCA computed with ade4. Use FactoMineR instead.") } } # ExPosition package else if (inherits(res.mca, "expoOutput") & inherits(res.mca$ExPosition.Data,'epMCA')){ if(choice != "var") stop("Don't handle ", choice, " for MCA computed with ExPosition.", " Use FactoMineR instead.") res <- res.mca$ExPosition.Data coord <- res$fj inertia <- res$dj*res$W cos2 <- res$rj contrib <- res$cj*100 colnames(coord) <- colnames(cos2) <- colnames(contrib) <- paste0("Dim.", 1:ncol(coord)) vars <- list(coord = coord, contrib = contrib, cos2 = cos2) } else stop("An object of class : ", class(res.mca), " can't be handled by the function get_mca_var()") element_class <-switch(choice, var = "mca_var", mca.cor = "mca_cor", quanti.sup = "quanti.sup") class(vars)<-c("factoextra", "mca", element_class) attr(vars, "element") <- element_desc return(vars) } #' @rdname get_mca #' @export get_mca_ind <- function(res.mca){ # FactoMineR package if(inherits(res.mca, c("MCA"))) ind <- res.mca$ind # ade4 package else if(inherits(res.mca, "acm") & inherits(res.mca, 'dudi')){ if (!requireNamespace("ade4", quietly = TRUE)) { stop("ade4 package needed for this function to work. Please install it.") } coord <- res.mca$li inertia <- ade4::inertia.dudi(res.mca, row.inertia = TRUE, col.inertia = FALSE) vv <- as.character(utils::packageVersion("ade4")) cc <- utils::compareVersion(vv, "1.7.4") > 0 if(cc){ # "v>1.7.4" cos2 <- abs(inertia$row.rel/100)[, 1:ncol(coord)] contrib <- (inertia$row.abs)[, 1:ncol(coord)] } # v<=1.7.4 else { cos2 <- abs(inertia$row.rel/10000)[, 1:ncol(coord)] contrib <- (inertia$row.abs/100)[, 1:ncol(coord)] } colnames(coord) <- colnames(cos2) <- colnames(contrib) <- paste0("Dim.", 1:ncol(coord)) ind <- list(coord = coord, contrib = contrib, cos2 = cos2) } # ExPosition package else if (inherits(res.mca, "expoOutput") & inherits(res.mca$ExPosition.Data,'epMCA')){ res <- res.mca$ExPosition.Data coord <- res$fi inertia <- res$di*res$M cos2 <- res$ri contrib <- res$ci*100 colnames(coord) <- colnames(cos2) <- colnames(contrib) <- paste0("Dim.", 1:ncol(coord)) ind <- list(coord = coord, contrib = contrib, cos2 = cos2) } else stop("An object of class : ", class(res.mca), " can't be handled by the function get_mca_ind()") class(ind)<-c("factoextra", "mca", "mca_ind") attr(ind, "element") <- "individuals" return(ind) } factoextra/R/fviz_ca.R0000644000176200001440000002534013641172736014375 0ustar liggesusers#' @include utilities.R NULL #'Visualize Correspondence Analysis #' #'@description Correspondence analysis (CA) is an extension of Principal #' Component Analysis (PCA) suited to analyze frequencies formed by two #' categorical variables. fviz_ca() provides ggplot2-based elegant #' visualization of CA outputs from the R functions: CA [in FactoMineR], ca [in #' ca], coa [in ade4], correspondence [in MASS] and expOutput/epCA [in #' ExPosition]. Read more: #' \href{http://www.sthda.com/english/wiki/correspondence-analysis-in-r-the-ultimate-guide-for-the-analysis-the-visualization-and-the-interpretation-r-software-and-data-mining}{Correspondence #' Analysis} #' #' \itemize{ \item{fviz_ca_row(): Graph of row variables} \item{fviz_ca_col(): #' Graph of column variables} \item{fviz_ca_biplot(): Biplot of row and column #' variables} \item{fviz_ca(): An alias of fviz_ca_biplot()} } #' #'@param X an object of class CA [FactoMineR], ca [ca], coa [ade4]; #' correspondence [MASS] and expOutput/epCA [ExPosition]. #'@param axes a numeric vector of length 2 specifying the dimensions to be #' plotted. #'@param shape.row,shape.col the point shapes to be used for row/column #' variables. Default values are 19 for rows and 17 for columns. #'@param geom a character specifying the geometry to be used for the graph. #' Allowed values are the combination of c("point", "arrow", "text"). Use #' "point" (to show only points); "text" to show only labels; c("point", #' "text") or c("arrow", "text") to show both types. #' @param geom.row,geom.col as \code{geom} but for row and column elements, #' respectively. Default is geom.row = c("point", "text), geom.col = #' c("point", "text"). #'@param label a character vector specifying the elements to be labelled. #' Default value is "all". Allowed values are "none" or the combination of #' c("row", "row.sup", "col", "col.sup"). Use "col" to label only active column #' variables; "col.sup" to label only supplementary columns; etc #'@param invisible a character value specifying the elements to be hidden on the #' plot. Default value is "none". Allowed values are the combination of #' c("row", "row.sup","col", "col.sup"). #'@param title the title of the graph #'@param col.col,col.row color for column/row points. The default values are #' "red" and "blue", respectively. Can be a continuous variable or a factor #' variable. Allowed values include also : "cos2", "contrib", "coord", "x" or #' "y". In this case, the colors for row/column variables are automatically #' controlled by their qualities ("cos2"), contributions ("contrib"), #' coordinates (x^2 + y^2, "coord"), x values("x") or y values("y") #'@param alpha.col,alpha.row controls the transparency of colors. The value can #' variate from 0 (total transparency) to 1 (no transparency). Default value is #' 1. Allowed values include also : "cos2", "contrib", "coord", "x" or "y" as #' for the arguments col.col and col.row. #'@param col.col.sup,col.row.sup colors for the supplementary column and row #' points, respectively. #'@param repel a boolean, whether to use ggrepel to avoid overplotting text #' labels or not. #'@param select.col,select.row a selection of columns/rows to be drawn. Allowed #' values are NULL or a list containing the arguments name, cos2 or contrib: #' \itemize{ \item name is a character vector containing column/row names to be #' drawn \item cos2 if cos2 is in [0, 1], ex: 0.6, then columns/rows with a #' cos2 > 0.6 are drawn. if cos2 > 1, ex: 5, then the top 5 columns/rows with #' the highest cos2 are drawn. \item contrib if contrib > 1, ex: 5, then the #' top 5 columns/rows with the highest contrib are drawn } #'@param map character string specifying the map type. Allowed options include: #' "symmetric", "rowprincipal", "colprincipal", "symbiplot", "rowgab", #' "colgab", "rowgreen" and "colgreen". See details #'@param arrows Vector of two logicals specifying if the plot should contain #' points (FALSE, default) or arrows (TRUE). First value sets the rows and the #' second value sets the columns. #'@param ... Additional arguments. \itemize{ \item in fviz_ca_row() and #' fviz_ca_col(): Additional arguments are passed to the functions fviz() and #' ggpubr::ggpar(). \item in fviz_ca_biplot() and fviz_ca(): Additional #' arguments are passed to fviz_ca_row() and fviz_ca_col().} #'@details The default plot of (M)CA is a "symmetric" plot in which both rows #' and columns are in principal coordinates. In this situation, it's not #' possible to interpret the distance between row points and column points. To #' overcome this problem, the simplest way is to make an asymmetric plot. This #' means that, the column profiles must be presented in row space or #' vice-versa. The allowed options for the argument map are: \itemize{ \item #' "rowprincipal" or "colprincipal": asymmetric plots with either rows in #' principal coordinates and columns in standard coordinates, or vice versa. #' These plots preserve row metric or column metric respectively. \item #' "symbiplot": Both rows and columns are scaled to have variances equal to the #' singular values (square roots of eigenvalues), which gives a symmetric #' biplot but does not preserve row or column metrics. \item "rowgab" or #' "colgab": Asymmetric maps, proposed by Gabriel & Odoroff (1990), with rows #' (respectively, columns) in principal coordinates and columns (respectively, #' rows) in standard coordinates multiplied by the mass of the corresponding #' point. \item "rowgreen" or "colgreen": The so-called contribution biplots #' showing visually the most contributing points (Greenacre 2006b). These are #' similar to "rowgab" and "colgab" except that the points in standard #' coordinates are multiplied by the square root of the corresponding masses, #' giving reconstructions of the standardized residuals. } #'@return a ggplot #'@author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #'@seealso \code{\link{get_ca}}, \code{\link{fviz_pca}}, \code{\link{fviz_mca}} #'@references http://www.sthda.com #' @examples #' # Correspondence Analysis #' # ++++++++++++++++++++++++++++++ #' # Install and load FactoMineR to compute CA #' # install.packages("FactoMineR") #' #' library("FactoMineR") #' data(housetasks) #' head(housetasks) #' res.ca <- CA(housetasks, graph=FALSE) #' #' # Biplot of rows and columns #' # ++++++++++++++++++++++++++ #' # Symetric Biplot of rows and columns #' fviz_ca_biplot(res.ca) #' #' # Asymetric biplot, use arrows for columns #' fviz_ca_biplot(res.ca, map ="rowprincipal", #' arrow = c(FALSE, TRUE)) #' #' # Keep only the labels for row points #' fviz_ca_biplot(res.ca, label ="row") #' #' # Keep only labels for column points #' fviz_ca_biplot(res.ca, label ="col") #' #' #' # Select the top 7 contributing rows #' # And the top 3 columns #' fviz_ca_biplot(res.ca, #' select.row = list(contrib = 7), #' select.col = list(contrib = 3)) #' #' # Graph of row variables #' # +++++++++++++++++++++ #' #' # Control automatically the color of row points #' # using the "cos2" or the contributions "contrib" #' # cos2 = the quality of the rows on the factor map #' # Change gradient color #' # Use repel = TRUE to avoid overplotting (slow if many points) #' fviz_ca_row(res.ca, col.row = "cos2", #' gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), #' repel = TRUE) #' #' # You can also control the transparency #' # of the color by the "cos2" or "contrib" #' fviz_ca_row(res.ca, alpha.row="contrib") #' #' # Select and visualize some rows with select.row argument. #' # - Rows with cos2 >= 0.5: select.row = list(cos2 = 0.5) #' # - Top 7 rows according to the cos2: select.row = list(cos2 = 7) #' # - Top 7 contributing rows: select.row = list(contrib = 7) #' # - Select rows by names: select.row = list(name = c("Breakfeast", "Repairs", "Holidays")) #' #' # Example: Select the top 7 contributing rows #' fviz_ca_row(res.ca, select.row = list(contrib = 7)) #' #' #' # Graph of column points #' # ++++++++++++++++++++++++++++ #' #' #' # Control colors using their contributions #' fviz_ca_col(res.ca, col.col = "contrib", #' gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07")) #' #' # Select columns with select.col argument #' # You can select by contrib, cos2 and name #' # as previously described for ind #' # Select the top 3 contributing columns #' fviz_ca_col(res.ca, select.col = list(contrib = 3)) #' #' #' #'@name fviz_ca #' #'@rdname fviz_ca #'@export fviz_ca_row <-function(X, axes = c(1,2), geom = c("point", "text"), geom.row = geom, shape.row = 19, col.row ="blue", alpha.row = 1, col.row.sup="darkblue", select.row = list(name = NULL, cos2 = NULL, contrib = NULL), map ="symmetric", repel = FALSE, ...) { p <- fviz (X, element = "row", axes = axes, geom = geom.row, color = col.row, alpha = alpha.row, pointshape = shape.row, select = select.row, map = map, repel = repel, col.row.sup = col.row.sup, shape.sup = shape.row, ...) p } #' @rdname fviz_ca #' @export fviz_ca_col <-function(X, axes = c(1,2), shape.col = 17, geom=c("point", "text"), geom.col = geom, col.col ="red", col.col.sup="darkred", alpha.col = 1, select.col = list(name = NULL, cos2 = NULL, contrib = NULL), map ="symmetric", repel = FALSE, ...) { fviz (X, element = "col", axes = axes, geom = geom.col, color = col.col, alpha = alpha.col, pointshape = shape.col, select = select.col, map = map, repel = repel, colcol.sup = col.col.sup, shape.sup = shape.col, ...) } #' @rdname fviz_ca #' @export fviz_ca_biplot <-function(X, axes = c(1,2), geom=c("point", "text"), geom.row = geom, geom.col = geom, label = "all", invisible="none", arrows = c(FALSE, FALSE), repel = FALSE, title = "CA - Biplot", ...) { # Rows geom2 <- geom.row if(arrows[1]==TRUE) geom2 <- setdiff(unique(c(geom2, "arrow")), "point") p <- fviz_ca_row(X, axes = axes, geom=geom2, repel = repel, label = label, invisible = invisible, ...) # Add columns geom2 <- geom.col if(arrows[2]==TRUE) geom2 <- setdiff(unique(c(geom2, "arrow")), "point") p <- fviz_ca_col(X, axes = axes, geom=geom2, repel = repel, label = label, invisible = invisible, ggp = p, ...) p + labs(title=title) } #' @rdname fviz_ca #' @export fviz_ca <- function(X, ...){ fviz_ca_biplot(X, ...) } factoextra/R/fviz_mclust.R0000644000176200001440000001002113637601176015307 0ustar liggesusers#' Plot Model-Based Clustering Results using ggplot2 #' @description Plots the classification, the uncertainty and the BIC values returned by the Mclust() function. #' @inheritParams ggpubr::ggpar #' @inheritParams fviz_cluster #' @param object an object of class Mclust #' @param what choose from one of the following three options: "classification" (default), "uncertainty" and "BIC". #' @param shape point shape. To change point shape by model names use shape = "model". #' @param color point and line color. #' @param ... other arguments to be passed to the functions \link{fviz_cluster} and \link[ggpubr]{ggpar}. #' #' @examples #' #' if(require("mclust")){ #' #' # Compute model-based-clustering #' require("mclust") #' data("diabetes") #' mc <- Mclust(diabetes[, -1]) #' #' # Visaulize BIC values #' fviz_mclust_bic(mc) #' #' # Visualize classification #' fviz_mclust(mc, "classification", geom = "point") #' } #' #' @describeIn fviz_mclust Plots classification and uncertainty. #' @export fviz_mclust <- function(object, what = c("classification", "uncertainty", "BIC"), ellipse.type = "norm", ellipse.level = 0.4, ggtheme = theme_classic(), ...) { uncertainty <- cluster <- NULL what <- match.arg(what) if(what == "classification") p <- fviz_cluster(object, ellipse.type = ellipse.type, ellipse.level =ellipse.level, ggtheme = theme_classic(), ...)+ labs(subtitle = "Classification") if(what == "uncertainty") p <- fviz_cluster(object, ellipse.type = ellipse.type, ellipse.level =ellipse.level, ggtheme = theme_classic(), geom = "none", ...)+ geom_point(aes(size = uncertainty, color = cluster))+ scale_size(range =c(0, 2))+ labs(subtitle = "Uncertainty")+ guides(size = FALSE) else if(what == "BIC") p <- fviz_mclust_bic(object, ggtheme = theme_classic(), ...) return(p) } #' @describeIn fviz_mclust Plots the BIC values. #' @param model.names one or more model names corresponding to models fit in object. The default #' is to plot the BIC for all of the models fit. #' @export fviz_mclust_bic <- function(object, model.names = NULL, shape = 19, color = "model", palette = NULL, legend = NULL, main = "Model selection", xlab = "Number of components", ylab = "BIC", ...){ if(!inherits(object, "Mclust")) stop("An object of class Mclust is required.") best_model <- object$modelName number_of_cluster <- object$G x <- object$BIC # Convert to a data frame n <- ncol(x) dnx <- dimnames(x) x <- matrix(as.vector(x), ncol = n) dimnames(x) <- dnx x <- as.data.frame(x, stringsAsFactors = TRUE) if (is.null(model.names)) model.names <- dimnames(x)[[2]] x <- x[, model.names, drop = FALSE] # Add number of clusters x <- cbind.data.frame(cluster = rownames(x), x, stringsAsFactors = TRUE) x <- tidyr::gather_(x, key_col = "model", value_col = "BIC", gather_cols = colnames(x)[-1]) x <- x[!is.na(x$BIC), , drop = FALSE] x$model <- factor(x$model, levels = dnx[[2]]) x$cluster <- factor(x$cluster, levels = unique(x$cluster)) if(ggpubr:::.is_col_palette(palette)) palette <- ggpubr:::.get_pal(palette, k = length(model.names)) ggline.opts <- list(data = x, x ="cluster", y = "BIC", group = "model", color = color, shape = shape, palette = palette, main = main, xlab = xlab, ylab = ylab,...) p <- do.call(ggpubr::ggline, ggline.opts)+ labs(subtitle = paste0("Best model: ", best_model, " | Optimal clusters: n = ", number_of_cluster))+ geom_vline(xintercept = number_of_cluster, linetype = 2, color = "red")+ theme(legend.title = element_blank()) if(missing(legend)) p + theme(legend.position = c(0.7, 0.2), legend.direction = "horizontal", legend.key.height = unit(0.5, "line"))+ guides(color = guide_legend(nrow=5,byrow=TRUE)) else p + theme(legend.position = legend) } factoextra/R/fviz_mca.R0000644000176200001440000003134113144620011014526 0ustar liggesusers#' @include utilities.R get_mca.R NULL #'Visualize Multiple Correspondence Analysis #' #'@description Multiple Correspondence Analysis (MCA) is an extension of simple #' CA to analyse a data table containing more than two categorical variables. #' fviz_mca() provides ggplot2-based elegant visualization of MCA outputs from #' the R functions: MCA [in FactoMineR], acm [in ade4], and expOutput/epMCA [in #' ExPosition]. Read more: #' \href{http://www.sthda.com/english/wiki/multiple-correspondence-analysis-essentials-interpretation-and-application-to-investigate-the-associations-between-categories-of-multiple-qualitative-variables-r-software-and-data-mining}{Multiple #' Correspondence Analysis Essentials.} #' #' \itemize{ \item{fviz_mca_ind(): Graph of individuals} \item{fviz_mca_var(): #' Graph of variables} \item{fviz_mca_biplot(): Biplot of individuals and #' variables} \item{fviz_mca(): An alias of fviz_mca_biplot()}} #'@param X an object of class MCA [FactoMineR], acm [ade4] and expOutput/epMCA #' [ExPosition]. #'@inheritParams fviz_pca #' @param geom.ind,geom.var as \code{geom} but for individuals and variables, #' respectively. Default is geom.ind = c("point", "text), geom.var = #' c("point", "text"). #'@param label a text specifying the elements to be labelled. Default value is #' "all". Allowed values are "none" or the combination of c("ind", #' "ind.sup","var", "quali.sup", "quanti.sup"). "ind" can be used to label #' only active individuals. "ind.sup" is for supplementary individuals. "var" #' is for active variable categories. "quali.sup" is for supplementary #' qualitative variable categories. "quanti.sup" is for quantitative #' supplementary variables. #'@param invisible a text specifying the elements to be hidden on the plot. #' Default value is "none". Allowed values are the combination of c("ind", #' "ind.sup","var", "quali.sup", "quanti.sup"). #'@param habillage an optional factor variable for coloring the observations by #' groups. Default value is "none". If X is an MCA object from FactoMineR #' package, habillage can also specify the index of the factor variable in the #' data. #'@param col.ind,col.var color for individuals and variables, respectively. Can #' be a continuous variable or a factor variable. Possible values include also #' : "cos2", "contrib", "coord", "x" or "y". In this case, the colors for #' individuals/variables are automatically controlled by their qualities #' ("cos2"), contributions ("contrib"), coordinates (x^2 + y^2 , "coord"), x #' values("x") or y values("y"). To use automatic coloring (by cos2, contrib, #' ....), make sure that habillage ="none". #'@param alpha.ind,alpha.var controls the transparency of individual and #' variable colors, respectively. The value can variate from 0 (total #' transparency) to 1 (no transparency). Default value is 1. Possible values #' include also : "cos2", "contrib", "coord", "x" or "y". In this case, the #' transparency for individual/variable colors are automatically controlled by #' their qualities ("cos2"), contributions ("contrib"), coordinates (x^2 + y^2 #' , "coord"), x values("x") or y values("y"). To use this, make sure that #' habillage ="none". #'@param shape.ind,shape.var point shapes of individuals and variables. #'@param col.quanti.sup,col.quali.sup a color for the quantitative/qualitative #' supplementary variables. #'@param repel a boolean, whether to use ggrepel to avoid overplotting text #' labels or not. #'@param choice the graph to plot. Allowed values include: i) "var" and #' "mca.cor" for plotting the correlation between variables and principal #' dimensions; ii) "var.cat" for variable categories and iii) "quanti.sup" for #' the supplementary quantitative variables. #'@param title the title of the graph #'@param select.ind,select.var a selection of individuals/variables to be drawn. #' Allowed values are NULL or a list containing the arguments name, cos2 or #' contrib: \itemize{ \item name is a character vector containing #' individuals/variables to be drawn \item cos2 if cos2 is in [0, 1], ex: 0.6, #' then individuals/variables with a cos2 > 0.6 are drawn. if cos2 > 1, ex: 5, #' then the top 5 individuals/variables with the highest cos2 are drawn. \item #' contrib if contrib > 1, ex: 5, then the top 5 individuals/variables with #' the highest contrib are drawn } #'@inheritParams ggpubr::ggpar #'@inheritParams fviz #'@param ... Additional arguments. \itemize{ \item in fviz_mca_ind(), #' fviz_mca_var() and fviz_mca_cor(): Additional arguments are passed to the #' functions fviz() and ggpubr::ggpar(). \item in fviz_mca_biplot() and #' fviz_mca(): Additional arguments are passed to fviz_mca_ind() and #' fviz_mca_var().} #'@param map character string specifying the map type. Allowed options include: #' "symmetric", "rowprincipal", "colprincipal", "symbiplot", "rowgab", #' "colgab", "rowgreen" and "colgreen". See details #'@param arrows Vector of two logicals specifying if the plot should contain #' points (FALSE, default) or arrows (TRUE). First value sets the rows and the #' second value sets the columns. #'@details The default plot of MCA is a "symmetric" plot in which both rows and #' columns are in principal coordinates. In this situation, it's not possible #' to interpret the distance between row points and column points. To overcome #' this problem, the simplest way is to make an asymmetric plot. The argument #' "map" can be used to change the plot type. For more explanation, read the #' details section of fviz_ca documentation. #' #'@return a ggplot #'@author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #'@seealso \code{\link{get_mca}}, \code{\link{fviz_pca}}, \code{\link{fviz_ca}}, #' \code{\link{fviz_mfa}}, \code{\link{fviz_hmfa}} #' @examples #' # Multiple Correspondence Analysis #' # ++++++++++++++++++++++++++++++ #' # Install and load FactoMineR to compute MCA #' # install.packages("FactoMineR") #' library("FactoMineR") #' data(poison) #' poison.active <- poison[1:55, 5:15] #' head(poison.active) #' res.mca <- MCA(poison.active, graph=FALSE) #' #' # Graph of individuals #' # +++++++++++++++++++++ #' #' # Default Plot #' # Color of individuals: col.ind = "steelblue" #' fviz_mca_ind(res.mca, col.ind = "steelblue") #' #' # 1. Control automatically the color of individuals #' # using the "cos2" or the contributions "contrib" #' # cos2 = the quality of the individuals on the factor map #' # 2. To keep only point or text use geom = "point" or geom = "text". #' # 3. Change themes: http://www.sthda.com/english/wiki/ggplot2-themes #' #' fviz_mca_ind(res.mca, col.ind = "cos2", repel = TRUE) #' #' \dontrun{ #' # You can also control the transparency #' # of the color by the cos2 #' fviz_mca_ind(res.mca, alpha.ind="cos2") #'} #' #' # Color individuals by groups, add concentration ellipses #' # Remove labels: label = "none". #' grp <- as.factor(poison.active[, "Vomiting"]) #' p <- fviz_mca_ind(res.mca, label="none", habillage=grp, #' addEllipses=TRUE, ellipse.level=0.95) #' print(p) #' #' #' # Change group colors using RColorBrewer color palettes #' # Read more: http://www.sthda.com/english/wiki/ggplot2-colors #' p + scale_color_brewer(palette="Dark2") + #' scale_fill_brewer(palette="Dark2") #' #' # Change group colors manually #' # Read more: http://www.sthda.com/english/wiki/ggplot2-colors #' p + scale_color_manual(values=c("#999999", "#E69F00"))+ #' scale_fill_manual(values=c("#999999", "#E69F00")) #' #' #' # Select and visualize some individuals (ind) with select.ind argument. #' # - ind with cos2 >= 0.4: select.ind = list(cos2 = 0.4) #' # - Top 20 ind according to the cos2: select.ind = list(cos2 = 20) #' # - Top 20 contributing individuals: select.ind = list(contrib = 20) #' # - Select ind by names: select.ind = list(name = c("44", "38", "53", "39") ) #' #' # Example: Select the top 40 according to the cos2 #' fviz_mca_ind(res.mca, select.ind = list(cos2 = 20)) #' #' #' # Graph of variable categories #' # ++++++++++++++++++++++++++++ #' # Default plot: use repel = TRUE to avoid overplotting #' fviz_mca_var(res.mca, col.var = "#FC4E07") #' #' # Control variable colors using their contributions #' # use repel = TRUE to avoid overplotting #' fviz_mca_var(res.mca, col.var = "contrib", #' gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07")) #' #' #' # Biplot #' # ++++++++++++++++++++++++++ #' grp <- as.factor(poison.active[, "Vomiting"]) #' fviz_mca_biplot(res.mca, repel = TRUE, col.var = "#E7B800", #' habillage = grp, addEllipses = TRUE, ellipse.level = 0.95) #' #' \dontrun{ #' # Keep only the labels for variable categories: #' fviz_mca_biplot(res.mca, label ="var") #' #' # Keep only labels for individuals #' fviz_mca_biplot(res.mca, label ="ind") #' #' # Hide variable categories #' fviz_mca_biplot(res.mca, invisible ="var") #' #' # Hide individuals #' fviz_mca_biplot(res.mca, invisible ="ind") #' #'# Control automatically the color of individuals using the cos2 #' fviz_mca_biplot(res.mca, label ="var", col.ind="cos2") #' #' # Change the color by groups, add ellipses #' fviz_mca_biplot(res.mca, label="var", col.var ="blue", #' habillage=grp, addEllipses=TRUE, ellipse.level=0.95) #' #' # Select the top 30 contributing individuals #' # And the top 10 variables #' fviz_mca_biplot(res.mca, #' select.ind = list(contrib = 30), #' select.var = list(contrib = 10)) #' } #' #'@name fviz_mca #'@rdname fviz_mca #'@export fviz_mca_ind <- function(X, axes = c(1,2), geom=c("point", "text"), geom.ind = geom, repel = FALSE, habillage = "none", palette = NULL, addEllipses = FALSE, col.ind = "blue", col.ind.sup = "darkblue", alpha.ind = 1, shape.ind = 19, map ="symmetric", select.ind = list(name = NULL, cos2 = NULL, contrib = NULL), ...) { fviz (X, element = "ind", axes = axes, geom = geom.ind, habillage = habillage, addEllipses = addEllipses, palette = palette, pointshape = shape.ind, color = col.ind, alpha = alpha.ind, shape.sup = shape.ind, col.row.sup = col.ind.sup, select = select.ind, map = map, repel = repel, ...) } #' @rdname fviz_mca #' @export fviz_mca_var <- function(X, choice = c("var.cat", "mca.cor", "var", "quanti.sup"), axes=c(1,2), geom = c("point", "text"), geom.var = geom, repel = FALSE, col.var="red", alpha.var=1, shape.var = 17, col.quanti.sup = "blue", col.quali.sup = "darkgreen", map = "symmetric", select.var = list(name = NULL, cos2 = NULL, contrib = NULL), ...) { col.col.sup <- col.quanti.sup extra_args <- list(...) if(missing(choice) & !is.null(extra_args$choix)) choice <- extra_args$choix # Define plot types choice <- match.arg(choice) if(choice == "var.cat") choice <- "var" else if(choice == "var") choice <- "mca.cor" # Define color for supplementary element if(choice == "mca.cor") col.col.sup <- col.quanti.sup else if(choice == "var") col.col.sup <- col.quali.sup # Define geometry for supplementary quantitative variables if(choice == "quanti.sup") { if(missing(geom)) geom <- c("arrow", "text") if(missing(col.var)) col.var <- col.quanti.sup } fviz (X, element = choice, axes = axes, geom = geom.var, color = col.var, alpha = alpha.var, pointshape = shape.var, shape.sup = shape.var, col.col.sup = col.col.sup, select = select.var, repel = repel, map = map, ...) } #' @rdname fviz_mca #' @export fviz_mca_biplot <- function(X, axes = c(1,2), geom = c("point", "text"), geom.ind = geom, geom.var = geom, repel = FALSE, label = "all", invisible="none", habillage="none", addEllipses=FALSE, palette = NULL, arrows = c(FALSE, FALSE), map ="symmetric", title = "MCA - Biplot", ...) { # Individuals geom2 <- geom.ind if(arrows[1]==TRUE) geom2 <- setdiff(unique(c(geom2, "arrow")), "point") p <- fviz_mca_ind(X, axes = axes, geom = geom2, repel = repel, label = label, invisible=invisible, habillage = habillage, addEllipses = addEllipses, palette = palette, ...) # Variable geom2 <- geom.var if(arrows[2]==TRUE) geom2 <- setdiff(unique(c(geom2, "arrow")), "point") # Add variables p <- fviz_mca_var(X, axes = axes, geom = geom2, repel = repel, label = label, invisible = invisible, ggp = p, ...) p+labs(title=title) } #' @rdname fviz_mca #' @export fviz_mca <- function(X, ...){ fviz_mca_biplot(X, ...) } factoextra/R/get_famd.R0000644000176200001440000000656413144620011014507 0ustar liggesusers#' @include print.factoextra.R NULL #' Extract the results for individuals and variables - FAMD #' #' @description #' Extract all the results (coordinates, squared cosine and contributions) #' for the active individuals and variables from Factor Analysis of Mixed Date (FAMD) outputs.\cr\cr #' \itemize{ #' \item get_famd(): Extract the results for variables and individuals #' \item get_famd_ind(): Extract the results for individuals only #' \item get_famd_var(): Extract the results for quantitative and qualitative variables only #' } #' @param res.famd an object of class FAMD [FactoMineR]. #' @param element the element to subset from the output. Possible values are "ind", "quanti.var" or "quali.var". #' @return a list of matrices containing the results for the active #' individuals and variables, including : #' \item{coord}{coordinates of indiiduals/variables.} #' \item{cos2}{cos2 values representing the quality of representation on the factor map.} #' \item{contrib}{contributions of individuals / variables to the principal components.} #' @author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #' @examples #' #' # Compute FAMD #' library("FactoMineR") #' data(wine) #' res.famd <- FAMD(wine[,c(1,2, 16, 22, 29, 28, 30,31)], graph = FALSE) #' #' # Extract the results for qualitative variable categories #' quali.var <- get_famd_var(res.famd, "quali.var") #' print(quali.var) #' head(quali.var$coord) # coordinates of qualitative variables #' #' # Extract the results for quantitative variables #' quanti.var <- get_famd_var(res.famd, "quanti.var") #' print(quanti.var) #' head(quanti.var$coord) # coordinates #' #' # Extract the results for individuals #' ind <- get_famd_ind(res.famd) #' print(ind) #' head(ind$coord) # coordinates of individuals #' #' #' @name get_famd #' #' @rdname get_famd #' @export get_famd <- function(res.famd, element = c("ind", "var", "quanti.var", "quali.var")){ elmt <- match.arg(element) switch(elmt, ind = get_famd_ind(res.famd), var = get_famd_var(res.famd, "var"), quanti.var = get_famd_var(res.famd, "quanti.var"), quali.var = get_famd_var(res.famd, "quali.var") ) } #' @rdname get_famd #' @export get_famd_ind <- function(res.famd){ # FactoMineR package if(inherits(res.famd, c("FAMD"))) ind <- res.famd$ind else stop("An object of class : ", class(res.famd), " can't be handled by the function get_famd_ind()") class(ind)<-c("factoextra", "famd", "famd_ind") attr(ind, "element") <- "individuals" return(ind) } #' @rdname get_famd #' @export get_famd_var <- function(res.famd, element = c( "var", "quanti.var", "quali.var")){ choice <- match.arg(element) # FactoMineR package if(inherits(res.famd, "FAMD")) { vars <- switch(choice, var = res.famd$var, quanti.var = res.famd$quanti.var, quali.var = res.famd$quali.var ) element_desc <- switch(choice, var = "variables", quanti.var = "quantitative variables", quali.var = "qualitative variable categories" ) } else stop("An object of class : ", class(res.famd), " can't be handled.") class(vars)<-c("factoextra", "famd", paste0("famd_", gsub(".", "_", choice, fixed = TRUE))) attr(vars, "element") <- element_desc return(vars) } factoextra/R/fviz_mfa.R0000644000176200001440000003132713637601244014553 0ustar liggesusers#' @include get_mfa.R NULL #'Visualize Multiple Factor Analysis #' #'@description Multiple factor analysis (MFA) is used to analyze a data set in #' which individuals are described by several sets of variables (quantitative #' and/or qualitative) structured into groups. fviz_mfa() provides #' ggplot2-based elegant visualization of MFA outputs from the R function: MFA #' [FactoMineR].\cr\cr \itemize{ \item{fviz_mfa_ind(): Graph of individuals} #' \item{fviz_mfa_var(): Graph of variables} \item{fviz_mfa_axes(): Graph of #' partial axes} \item{fviz_mfa(): An alias of fviz_mfa_ind(res.mfa, partial = #' "all")} \item{fviz_mfa_quali_biplot(): Biplot of individuals and qualitative #' variables} } #' #'@param X an object of class MFA [FactoMineR]. #'@inheritParams fviz_mca #'@inheritParams fviz_pca #'@inheritParams fviz #'@inheritParams ggpubr::ggpar #'@param choice the graph to plot. Allowed values include one of c("quanti.var", #' "quali.var", "group") for plotting quantitative variables, qualitative #' variables and group of variables, respectively. #'@param habillage an optional factor variable for coloring the observations by #' groups. Default value is "none". If X is an MFA object from FactoMineR #' package, habillage can also specify the index of the factor variable in the #' data. #'@param col.ind,col.var,col.axes color for individuals, variables and col.axes #' respectively. Can be a continuous variable or a factor variable. Possible #' values include also : "cos2", "contrib", "coord", "x" or "y". In this case, #' the colors for individuals/variables are automatically controlled by their #' qualities ("cos2"), contributions ("contrib"), coordinates (x^2 + y^2 , #' "coord"), x values("x") or y values("y"). To use automatic coloring (by #' cos2, contrib, ....), make sure that habillage ="none". #'@param col.partial color for partial individuals. By default, points are #' colored according to the groups. #'@param col.var.sup color for supplementary variables. #'@param alpha.ind,alpha.var,alpha.axes controls the transparency of individual, #' variable, group and axes colors, respectively. The value can variate from 0 #' (total transparency) to 1 (no transparency). Default value is 1. Possible #' values include also : "cos2", "contrib", "coord", "x" or "y". In this case, #' the transparency for individual/variable colors are automatically controlled #' by their qualities ("cos2"), contributions ("contrib"), coordinates (x^2 + #' y^2 , "coord"), x values("x") or y values("y"). To use this, make sure that #' habillage ="none". #'@param shape.ind,shape.var point shapes of individuals, variables, groups and #' axes #'@param col.quali.var.sup color for supplementary qualitative variables. #' Default is "black". #'@param title the title of the graph #'@param select.ind,select.var,select.axes a selection of individuals/partial #' individuals/ variables/groups/axes to be drawn. Allowed values are NULL or a #' list containing the arguments name, cos2 or contrib: \itemize{ \item name is #' a character vector containing individuals/variables to be drawn \item cos2 #' if cos2 is in [0, 1], ex: 0.6, then individuals/variables with a cos2 > 0.6 #' are drawn. if cos2 > 1, ex: 5, then the top 5 individuals/variables with the #' highest cos2 are drawn. \item contrib if contrib > 1, ex: 5, then the top 5 #' individuals/variables with the highest cos2 are drawn } #'@param ... Arguments to be passed to the function fviz() #'@param repel a boolean, whether to use ggrepel to avoid overplotting text #' labels or not. #'@param partial list of the individuals for which the partial points should be #' drawn. (by default, partial = NULL and no partial points are drawn). Use #' partial = "All" to visualize partial points for all individuals. #' #'@return a ggplot2 plot #'@author Fabian Mundt \email{f.mundt@inventionate.de} #'@author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #'@references http://www.sthda.com/english/ #' @examples #' # Compute Multiple Factor Analysis #' library("FactoMineR") #' data(wine) #' res.mfa <- MFA(wine, group=c(2,5,3,10,9,2), type=c("n",rep("s",5)), #' ncp=5, name.group=c("orig","olf","vis","olfag","gust","ens"), #' num.group.sup=c(1,6), graph=FALSE) #' #' # Eigenvalues/variances of dimensions #' fviz_screeplot(res.mfa) #' # Group of variables #' fviz_mfa_var(res.mfa, "group") #' # Quantitative variables #' fviz_mfa_var(res.mfa, "quanti.var", palette = "jco", #' col.var.sup = "violet", repel = TRUE) #' # Graph of individuals colored by cos2 #' fviz_mfa_ind(res.mfa, col.ind = "cos2", #' gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), #' repel = TRUE) #' # Partial individuals #' fviz_mfa_ind(res.mfa, partial = "all") #' # Partial axes #' fviz_mfa_axes(res.mfa) #' #' #' # Graph of categorical variable categories #' # ++++++++++++++++++++++++++++++++++++++++ #' data(poison) #' res.mfa <- MFA(poison, group=c(2,2,5,6), type=c("s","n","n","n"), #' name.group=c("desc","desc2","symptom","eat"), #' num.group.sup=1:2, graph=FALSE) #' #' # Plot of qualitative variables #' fviz_mfa_var(res.mfa, "quali.var") #' #' #' #' # Biplot of categorical variable categories and individuals #' # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #' # Use repel = TRUE to avoid overplotting #' grp <- as.factor(poison[, "Vomiting"]) #' fviz_mfa_quali_biplot(res.mfa, repel = FALSE, col.var = "#E7B800", #' habillage = grp, addEllipses = TRUE, ellipse.level = 0.95) #' #'@name fviz_mfa #'@rdname fviz_mfa #'@export fviz_mfa_ind <- function(X, axes = c(1,2), geom=c("point", "text"), repel = FALSE, habillage = "none", palette = NULL, addEllipses = FALSE, col.ind = "blue", col.ind.sup = "darkblue", alpha.ind = 1, shape.ind = 19, col.quali.var.sup = "black", select.ind = list(name = NULL, cos2 = NULL, contrib = NULL), partial = NULL, col.partial = "group", ...) { extra_args <- list(...) if(col.ind %in% c("cos2","contrib", "coord")) partial = NULL if(!is.null(partial) & missing(col.ind)) col.ind <- "black" p <- fviz (X, element = "ind", axes = axes, geom = geom, habillage = habillage, addEllipses = addEllipses, palette = palette, pointshape = shape.ind, color = col.ind, alpha = alpha.ind, shape.sup = shape.ind, col.row.sup = col.ind.sup, select = select.ind, repel = repel, ...) # Add supplementary qualitative variables if they exist show.quali.var <- !("quali.var" %in% extra_args$invisible) & is.null(partial) is_habillage <- habillage[1] != "none" if(!is.null(X$quali.var.sup) & show.quali.var){ if(!(col.ind %in% c("cos2", "contrib")) & !is_habillage) col.quali.var.sup = "quali.sup" quali.sup <- .get_supp(X, element = "quali.var.sup", axes = axes) quali.sup$quali.sup <- .get_quali_var_sup_names(X) colnames(quali.sup)[2:3] <- c("x", "y") p <- fviz_add(p, df = quali.sup[, -1], geom = c("point", "text"), color = col.quali.var.sup, shape = 0, repel = repel, addlabel = TRUE) } # Add partial points if(!is.null(partial)){ invisible <- ifelse(is.null(extra_args$invisible), "none", extra_args$invisible) if(!(partial[1] %in% c("All", "all"))) select.partial = list(name = partial) else select.partial <- NULL if(col.partial %in% c("group", "groups")) col.partial <- "group.name" # Data for individuals ind.sum <- facto_summarize(X, element = "ind", result = c("coord", "contrib", "cos2", "coord.partial"), axes = axes) ind <- ind.sum$res colnames(ind)[2:3] <- c("x", "y") # partial points ind.partial <- ind.sum$res.partial colnames(ind.partial)[3:4] <- c("x.partial", "y.partial") ind.partial <- merge(ind, ind.partial, by = "name") # Selection ind.all <- ind if(!is.null(select.ind)) ind <- .select(ind, select.ind) if(!is.null(select.partial)) { if(nrow(ind) != nrow(ind.all)) warning("You've already selected individuals. Partial points are only calculated for them.") ind.partial <- ind.partial[ind.partial$name %in% .select(ind, select.partial)$name, , drop = FALSE] } # elements to be hidden hide <- .hide(invisible) # Plot if(!hide$ind & "point" %in% geom) { # Partial point p <- p + ggpubr::geom_exec(geom_point, data = ind.partial, x = "x.partial", y = "y.partial", colour = col.partial, shape = shape.ind, size = 1) # Partial segments p <- p + ggpubr::geom_exec(geom_segment, data = ind.partial, x = "x", y = "y", xend = 'x.partial', yend = 'y.partial', linetype = "group.name", colour = col.partial, size = 0.5) } # Edit plot title and legend title p <- p + labs(colour = "Groups", linetype = "Groups") } p } #' @rdname fviz_mfa #' @export fviz_mfa_quali_biplot <- function(X, axes = c(1,2), geom=c("point", "text"), repel = repel, title = "Biplot of individuals and qualitative variables - MFA", ...) { # Individuals p <- fviz_mfa_ind(X, axes = axes, geom = geom, repel = repel, ...) # Variable # Add variables p <- fviz_mfa_var(X, "quali.var", axes = axes, geom = geom, repel = repel, ggp = p, ...) p+labs(title=title) } #' @rdname fviz_mfa #' @export fviz_mfa_var <- function(X, choice = c("quanti.var", "group", "quali.var"), axes = c(1,2), geom = c("point", "text"), repel = FALSE, habillage = "none", col.var ="red", alpha.var=1, shape.var = 17, col.var.sup = "darkgreen", palette = NULL, select.var = list(name = NULL, cos2 = NULL, contrib = NULL), ...) { extra_args <- list(...) if(missing(choice) & !is.null(extra_args$choix)) choice <- extra_args$choix choice <- match.arg(choice) # Define habillage if quanti.var. Quantitative variables are colored by groups if(choice == "quanti.var") { .check_if_quanti_exists(X) if(missing(geom)) geom <- c("arrow", "text") group <- data.frame(name = rownames(X$group$Lg[-nrow(X$group$Lg),,drop=FALSE]), nvar = X$call$group, type = X$call$type, stringsAsFactors = TRUE) is.group.sup <- !is.null(X$call$num.group.sup) if(is.group.sup) group <- group[-X$call$num.group.sup, , drop = FALSE] group <- subset(group, group$type == "c") habillage <- rep(group$name, group$nvar) } else if(choice== "quali.var"){ .check_if_quali_exists(X) } if(!missing(col.var)) habillage = "none" # Main plot fviz (X, element = choice, axes = axes, geom = geom, color = col.var, alpha = alpha.var, pointshape = shape.var, shape.sup = shape.var, col.col.sup = col.var.sup, habillage = habillage, palette = palette, select = select.var, repel = repel, ...) } #' @rdname fviz_mfa #' @export fviz_mfa_axes <- function(X, axes = c(1,2), geom=c("arrow", "text"), col.axes = NULL, alpha.axes=1, col.circle ="grey70", select.axes = list(name = NULL, contrib = NULL), repel = FALSE, ...) { # Color partial axes by groups habillage <- "none" if(is.null(col.axes)){ axes.names <- rownames(X$partial.axes$coord) axes.groups <- sapply(axes.names, function(x) gsub("^Dim[0-9]+\\.", "", x, perl = TRUE) ) habillage <- as.factor(axes.groups) } fviz (X, element = "partial.axes", axes = axes, geom = geom, color = col.axes, alpha = alpha.axes, select = select.axes, repel = repel, col.circle = col.circle, habillage = habillage, ...) } #' @rdname fviz_mfa #' @export fviz_mfa <- function(X, partial = "all", ...){ fviz_mfa_ind(X, partial = partial, ...) } #+++++++++++++++++++++ # Helper functions #+++++++++++++++++++++ # Check if there are quantitative variables. .check_if_quanti_exists <- function(X){ if(!is.null(X$call$num.group.sup)) group.all <- X$call$type[-X$call$num.group.sup] else group.all <- X$call$type if(!c("c" %in% group.all) ) if(!c("s" %in% group.all)) stop("There are no quantitative variables to plot.") } # Check if qualitative variables exists .check_if_quali_exists <- function (X){ # Check if there are qualitative variables. if(!is.null(X$call$num.group.sup)) group.all <- X$call$type[-X$call$num.group.sup] else group.all <- X$call$type if(!("n" %in% group.all)) stop("There are no qualitative variables to plot.") } factoextra/R/fviz_cos2.R0000644000176200001440000001027313144620011014635 0ustar liggesusers#' @include facto_summarize.R NULL #' Visualize the quality of representation of rows/columns #' #' @description This function can be used to visualize the quality of #' representation (cos2) of rows/columns from the results of Principal Component #' Analysis (PCA), Correspondence Analysis (CA), Multiple Correspondence #' Analysis (MCA), Factor Analysis of Mixed Data (FAMD), Multiple Factor #' Analysis (MFA) and Hierarchical Multiple Factor Analysis (HMFA) functions. #' @param X an object of class PCA, CA, MCA, FAMD, MFA and HMFA [FactoMineR]; #' prcomp and princomp [stats]; dudi, pca, coa and acm [ade4]; ca [ca #' package]. #' @param choice allowed values are "row" and "col" for CA; "var" and "ind" for #' PCA or MCA; "var", "ind", "quanti.var", "quali.var" and "group" for FAMD, MFA and HMFA. #' @param axes a numeric vector specifying the dimension(s) of interest. #' @param fill a fill color for the bar plot. #' @param color an outline color for the bar plot. #' @param sort.val a string specifying whether the value should be sorted. #' Allowed values are "none" (no sorting), "asc" (for ascending) or "desc" #' (for descending). #' @param top a numeric value specifying the number of top elements to be shown. #' @inheritParams ggpubr::ggpar #' #' @return a ggplot #' @author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #' @references http://www.sthda.com/english/ #' @examples #' \donttest{ #' # Principal component analysis #' # ++++++++++++++++++++++++++ #' data(decathlon2) #' decathlon2.active <- decathlon2[1:23, 1:10] #' res.pca <- prcomp(decathlon2.active, scale = TRUE) #' #' # variable cos2 on axis 1 #' fviz_cos2(res.pca, choice="var", axes = 1, top = 10 ) #' #' # Change color #' fviz_cos2(res.pca, choice="var", axes = 1, #' fill = "lightgray", color = "black") #' #' # Variable cos2 on axes 1 + 2 #' fviz_cos2(res.pca, choice="var", axes = 1:2) #' #' # cos2 of individuals on axis 1 #' fviz_cos2(res.pca, choice="ind", axes = 1) #' #' \dontrun{ #' # Correspondence Analysis #' # ++++++++++++++++++++++++++ #' library("FactoMineR") #' data("housetasks") #' res.ca <- CA(housetasks, graph = FALSE) #' #' # Visualize row cos2 on axes 1 #' fviz_cos2(res.ca, choice ="row", axes = 1) #' # Visualize column cos2 on axes 1 #' fviz_cos2(res.ca, choice ="col", axes = 1) #' #' # Multiple Correspondence Analysis #' # +++++++++++++++++++++++++++++++++ #' library(FactoMineR) #' data(poison) #' res.mca <- MCA(poison, quanti.sup = 1:2, #' quali.sup = 3:4, graph=FALSE) #' #' # Visualize individual cos2 on axes 1 #' fviz_cos2(res.mca, choice ="ind", axes = 1, top = 20) #' # Visualize variable categorie cos2 on axes 1 #' fviz_cos2(res.mca, choice ="var", axes = 1) #' #' # Multiple Factor Analysis #' # ++++++++++++++++++++++++ #' library(FactoMineR) #' data(poison) #' res.mfa <- MFA(poison, group=c(2,2,5,6), type=c("s","n","n","n"), #' name.group=c("desc","desc2","symptom","eat"), #' num.group.sup=1:2, graph=FALSE) #' # Visualize individual cos2 on axes 1 #' # Select the top 20 #' fviz_cos2(res.mfa, choice ="ind", axes = 1, top = 20) #' # Visualize catecorical variable categorie cos2 on axes 1 #' fviz_cos2(res.mfa, choice ="quali.var", axes = 1) #' } #' #' } #' @export fviz_cos2 <- function(X, choice = c("row", "col", "var", "ind", "quanti.var", "quali.var", "group"), axes=1, fill="steelblue", color = "steelblue", sort.val = c("desc", "asc", "none"), top = Inf, xtickslab.rt = 45, ggtheme = theme_minimal(), ...) { sort.val <- match.arg(sort.val) title <- .build_title(choice[1], "Cos2", axes) dd <- facto_summarize(X, element = choice, result = "cos2", axes = axes) cos2 <- dd$cos2 names(cos2) <-rownames(dd) df <- data.frame(name = factor(names(cos2), levels = names(cos2)), cos2 = cos2) p <- ggpubr::ggbarplot(df, x = "name", y = "cos2", fill = fill, color = color, sort.val = sort.val, top = top, main = title, xlab = FALSE, ylab ="Cos2 - Quality of representation", xtickslab.rt = xtickslab.rt, ggtheme = ggtheme, ... ) p } factoextra/R/get_ca.R0000644000176200001440000002150113144620011014147 0ustar liggesusers#' @include print.factoextra.R NULL #' Extract the results for rows/columns - CA #' #' @description #' Extract all the results (coordinates, squared cosine, contributions and inertia) #' for the active row/column variables from Correspondence Analysis (CA) outputs.\cr\cr #' \itemize{ #' \item get_ca(): Extract the results for rows and columns #' \item get_ca_row(): Extract the results for rows only #' \item get_ca_col(): Extract the results for columns only #' } #' @param res.ca an object of class CA [FactoMineR], ca [ca], coa [ade4]; #' correspondence [MASS]. #' @param element the element to subset from the output. Possible values are "row" or "col". #' @return a list of matrices containing the results for the active rows/columns including : #' \item{coord}{coordinates for the rows/columns} #' \item{cos2}{cos2 for the rows/columns} #' \item{contrib}{contributions of the rows/columns} #' \item{inertia}{inertia of the rows/columns} #' @author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #' @references http://www.sthda.com #' @examples #' \donttest{ #' # Install and load FactoMineR to compute CA #' # install.packages("FactoMineR") #' library("FactoMineR") #' data("housetasks") #' res.ca <- CA(housetasks, graph = FALSE) #' #' # Result for column variables #' col <- get_ca_col(res.ca) #' col # print #' head(col$coord) # column coordinates #' head(col$cos2) # column cos2 #' head(col$contrib) # column contributions #' #' # Result for row variables #' row <- get_ca_row(res.ca) #' row # print #' head(row$coord) # row coordinates #' head(row$cos2) # row cos2 #' head(row$contrib) # row contributions #' #' # You can also use the function get_ca() #' get_ca(res.ca, "row") # Results for rows #' get_ca(res.ca, "col") # Results for columns #' } #' @name get_ca #' #' @rdname get_ca #' @export get_ca <- function(res.ca, element = c("row", "col")){ elmt <- match.arg(element) if(elmt =="row") get_ca_row(res.ca) else if(elmt == "col") get_ca_col(res.ca) } #' @rdname get_ca #' @export get_ca_col <- function(res.ca){ # FactoMineR package if(inherits(res.ca, c("CA"))) cols <- res.ca$col # ca package else if(inherits(res.ca, "ca")){ # principal coord = standard coord X sqrt(eig) coord <- t(apply(res.ca$colcoord, 1, "*", res.ca$sv)) cos2 <- apply(coord^2, 2, "/", res.ca$coldist^2) # col.contrib <- res.ca$colmass * col.coord^2/res.ca$sv^2 cc <- apply(coord^2, 2, "*", res.ca$colmass) contrib <- t(apply(cc, 1, "/", res.ca$sv^2)) *100 inertia <- res.ca$colinertia colnames(coord) <- colnames(cos2) <- colnames(contrib) <- paste0("Dim.", 1:ncol(coord)) # remove supplementary points index <- setdiff(1:nrow(res.ca$colcoord), res.ca$colsup) cols <- list(coord = coord[index, , drop = FALSE], contrib = contrib[index, , drop = FALSE], cos2 = cos2[index, , drop = FALSE], inertia = inertia[index]) } # Mass package else if(inherits(res.ca, "correspondence")){ # principal coord = standard coord X sqrt(eig) coord <- t(apply(res.ca$cscore, 1, "*", res.ca$cor)) # cos2 = coord^2/d^2 row.sum <- apply(res.ca$Freq, 1, sum) col.sum <- apply(res.ca$Freq, 2, sum) n <- sum(res.ca$Freq) profile <- t(apply(res.ca$Freq, 1, "/", col.sum)) average.profile <- row.sum/n d2 <- apply(profile, 2, function(row.p, av.p){sum(((row.p - av.p)^2)/av.p)}, average.profile) cos2 <- apply(coord^2, 2, "/", d2) # contrib <- mass * coord^2/eig mass <- col.sum/n cc <- apply(coord^2, 2, "*", mass) contrib <- t(apply(cc, 1, "/", res.ca$cor^2)) *100 # inertia = mass * d^2 inertia <- mass * d2 colnames(coord) <- colnames(cos2) <- colnames(contrib) <- paste0("Dim.", 1:ncol(coord)) cols <- list(coord = coord, contrib = contrib, cos2 = cos2, inertia = inertia) } # ade4 package else if(inherits(res.ca, "coa") & inherits(res.ca, 'dudi')){ if (!requireNamespace("ade4", quietly = TRUE)) { stop("ade4 package needed for this function to work. Please install it.") } coord <- res.ca$co inertia <- ade4::inertia.dudi(res.ca, row.inertia = FALSE, col.inertia = TRUE) vv <- as.character(utils::packageVersion("ade4")) cc <- utils::compareVersion(vv, "1.7.4") > 0 if(cc){ # "v>1.7.4" cos2 <- abs(inertia$col.rel/100)[, 1:ncol(coord)] contrib <- (inertia$col.abs)[, 1:ncol(coord)] } # v<=1.7.4 else { cos2 <- abs(inertia$col.rel/10000)[, 1:ncol(coord)] contrib <- (inertia$col.abs/100)[, 1:ncol(coord)] } colnames(coord) <- colnames(cos2) <- colnames(contrib) <- paste0("Dim.", 1:ncol(coord)) cols <- list(coord = coord, contrib = contrib, cos2 = cos2, inertia = NA) } # ExPosition package else if (inherits(res.ca, "expoOutput") & inherits(res.ca$ExPosition.Data,'epCA')) { coord <- res.ca$ExPosition.Data$fj inertia <- res.ca$ExPosition.Data$dj*res.ca$ExPosition.Data$W cos2 <- res.ca$ExPosition.Data$rj contrib <- res.ca$ExPosition.Data$cj*100 colnames(coord) <- colnames(cos2) <- colnames(contrib) <- paste0("Dim.", 1:ncol(coord)) cols <- list(coord = coord, contrib = contrib, cos2 = cos2, inertia = inertia) } else stop("An object of class : ", class(res.ca), " can't be handled by the function get_ca_col()") class(cols)<-c("factoextra", "ca_col") return(cols) } #' @rdname get_ca #' @export get_ca_row <- function(res.ca){ # FactoMineR package if(inherits(res.ca, c("CA"))) row <- res.ca$row # ca package else if(inherits(res.ca, "ca")){ # principal coord = standard coord X sqrt(eig) coord <- t(apply(res.ca$rowcoord, 1, "*", res.ca$sv)) cos2 <- apply(coord^2, 2, "/", res.ca$rowdist^2) # contrib <- res.ca$rowmass * coord^2/res.ca$sv^2 cc <- apply(coord^2, 2, "*", res.ca$rowmass) contrib <- t(apply(cc, 1, "/", res.ca$sv^2)) *100 inertia <- res.ca$rowinertia colnames(coord) <- colnames(cos2) <- colnames(contrib) <- paste0("Dim.", 1:ncol(coord)) # remove supplementary points index <- setdiff(1:nrow(res.ca$rowcoord), res.ca$rowsup) row <- list(coord = coord[index, , drop = FALSE], contrib = contrib[index, , drop = FALSE], cos2 = cos2[index, , drop = FALSE], inertia = inertia[index]) } # Mass package else if(inherits(res.ca, "correspondence")){ # principal coord = standard coord X sqrt(eig) coord <- t(apply(res.ca$rscore, 1, "*", res.ca$cor)) # cos2 = coord^2/d^2 row.sum <- apply(res.ca$Freq, 1, sum) col.sum <- apply(res.ca$Freq, 2, sum) n <- sum(res.ca$Freq) profile <- res.ca$Freq/row.sum average.profile <- col.sum/n d2 <- apply(profile, 1, function(row.p, av.p){sum(((row.p - av.p)^2)/av.p)}, average.profile) cos2 <- apply(coord^2, 2, "/", d2) # contrib <- mass * coord^2/eig mass <- row.sum/n cc <- apply(coord^2, 2, "*", mass) contrib <- t(apply(cc, 1, "/", res.ca$cor^2)) *100 # inertia = mass * d^2 inertia <- mass * d2 colnames(coord) <- colnames(cos2) <- colnames(contrib) <- paste0("Dim.", 1:ncol(coord)) row <- list(coord = coord, contrib = contrib, cos2 = cos2, inertia = inertia) } # ade4 package else if(inherits(res.ca, "coa") & inherits(res.ca, 'dudi')){ if (!requireNamespace("ade4", quietly = TRUE)) { stop("ade4 package needed for this function to work. Please install it.") } coord <- res.ca$li inertia <- ade4::inertia.dudi(res.ca, row.inertia = TRUE, col.inertia = FALSE) vv <- as.character(utils::packageVersion("ade4")) cc <- utils::compareVersion(vv, "1.7.4") > 0 if(cc){ # "v>1.7.4" cos2 <- abs(inertia$row.rel/100)[, 1:ncol(coord)] contrib <- (inertia$row.abs)[, 1:ncol(coord)] } # v<=1.7.4 else { cos2 <- abs(inertia$row.rel/10000)[, 1:ncol(coord)] contrib <- (inertia$row.abs/100)[, 1:ncol(coord)] } colnames(coord) <- colnames(cos2) <- colnames(contrib) <- paste0("Dim.", 1:ncol(coord)) row <- list(coord = coord, contrib = contrib, cos2 = cos2, inertia = NA) } # ExPosition package else if (inherits(res.ca, "expoOutput") & inherits(res.ca$ExPosition.Data,'epCA')) { coord <- res.ca$ExPosition.Data$fi inertia <- res.ca$ExPosition.Data$di*res.ca$ExPosition.Data$M cos2 <- res.ca$ExPosition.Data$ri contrib <- res.ca$ExPosition.Data$ci*100 colnames(coord) <- colnames(cos2) <- colnames(contrib) <- paste0("Dim.", 1:ncol(coord)) row <- list(coord = coord, contrib = contrib, cos2 = cos2, inertia = inertia) } else stop("An object of class : ", class(res.ca), " can't be handled by the function get_ca_row()") class(row)<-c("factoextra", "ca_row") return(row) } factoextra/R/fviz_pca.R0000644000176200001440000003222313637601520014544 0ustar liggesusers#' @include get_pca.R fviz.R NULL #' Visualize Principal Component Analysis #' #' #' @description Principal component analysis (PCA) reduces the dimensionality of #' multivariate data, to two or three that can be visualized graphically with #' minimal loss of information. fviz_pca() provides ggplot2-based elegant #' visualization of PCA outputs from: i) prcomp and princomp [in built-in R #' stats], ii) PCA [in FactoMineR], iii) dudi.pca [in ade4] and epPCA #' [ExPosition]. Read more: #' \href{http://www.sthda.com/english/wiki/factominer-and-factoextra-principal-component-analysis-visualization-r-software-and-data-mining}{Principal #' Component Analysis} #' #' \itemize{ \item{fviz_pca_ind(): Graph of individuals} \item{fviz_pca_var(): #' Graph of variables} \item{fviz_pca_biplot(): Biplot of individuals and #' variables} \item{fviz_pca(): An alias of fviz_pca_biplot()} } #' #' Note that, \code{fviz_pca_xxx()} functions are wrapper arround the core #' function \code{\link{fviz}()}, whih is also a wrapper arround the #' function \code{\link[ggpubr]{ggscatter}()} [in ggpubr]. Therfore, further arguments, to be #' passed to the function \code{\link{fviz}()} and \code{\link[ggpubr]{ggscatter}()}, can be specified in #' \code{\link{fviz_pca_ind}()} and \code{\link{fviz_pca_var}()}. #' #' @param X an object of class PCA [FactoMineR]; prcomp and princomp [stats]; #' dudi and pca [ade4]; expOutput/epPCA [ExPosition]. #' @param axes a numeric vector of length 2 specifying the dimensions to be #' plotted. #' @param geom a text specifying the geometry to be used for the graph. Allowed #' values are the combination of \code{c("point", "arrow", "text")}. Use #' \code{"point"} (to show only points); \code{"text"} to show only labels; #' \code{c("point", "text")} or \code{c("arrow", "text")} to show arrows and #' texts. Using \code{c("arrow", "text")} is sensible only for the graph of #' variables. #' @param geom.ind,geom.var as \code{geom} but for individuals and variables, #' respectively. Default is geom.ind = c("point", "text), geom.var = #' c("arrow", "text"). #' @param label a text specifying the elements to be labelled. Default value is #' "all". Allowed values are "none" or the combination of c("ind", "ind.sup", #' "quali", "var", "quanti.sup"). "ind" can be used to label only active #' individuals. "ind.sup" is for supplementary individuals. "quali" is for #' supplementary qualitative variables. "var" is for active variables. #' "quanti.sup" is for quantitative supplementary variables. #' @param invisible a text specifying the elements to be hidden on the plot. #' Default value is "none". Allowed values are the combination of c("ind", #' "ind.sup", "quali", "var", "quanti.sup"). #' @param title the title of the graph #' @param habillage an optional factor variable for coloring the observations by #' groups. Default value is "none". If X is a PCA object from FactoMineR #' package, habillage can also specify the supplementary qualitative variable #' (by its index or name) to be used for coloring individuals by groups (see #' ?PCA in FactoMineR). #' @param addEllipses logical value. If TRUE, draws ellipses around the #' individuals when habillage != "none". #' @param col.ind,col.var color for individuals and variables, respectively. Can #' be a continuous variable or a factor variable. Possible values include also #' : "cos2", "contrib", "coord", "x" or "y". In this case, the colors for #' individuals/variables are automatically controlled by their qualities of #' representation ("cos2"), contributions ("contrib"), coordinates (x^2+y^2, #' "coord"), x values ("x") or y values ("y"). To use automatic coloring (by #' cos2, contrib, ....), make sure that habillage ="none". #' @param fill.ind,fill.var same as col.ind and col.var but for the fill color. #' @param col.ind.sup color for supplementary individuals #' @param alpha.ind,alpha.var controls the transparency of individual and #' variable colors, respectively. The value can variate from 0 (total #' transparency) to 1 (no transparency). Default value is 1. Possible values #' include also : "cos2", "contrib", "coord", "x" or "y". In this case, the #' transparency for the individual/variable colors are automatically #' controlled by their qualities ("cos2"), contributions ("contrib"), #' coordinates (x^2+y^2, "coord"), x values("x") or y values("y"). To use #' this, make sure that habillage ="none". #' @param col.quanti.sup a color for the quantitative supplementary variables. #' @param select.ind,select.var a selection of individuals/variables to be #' drawn. Allowed values are NULL or a list containing the arguments name, #' cos2 or contrib: \itemize{ \item name: is a character vector containing #' individuals/variables to be drawn \item cos2: if cos2 is in [0, 1], ex: #' 0.6, then individuals/variables with a cos2 > 0.6 are drawn. if cos2 > 1, #' ex: 5, then the top 5 individuals/variables with the highest cos2 are #' drawn. \item contrib: if contrib > 1, ex: 5, then the top 5 #' individuals/variables with the highest contrib are drawn } #' @inheritParams ggpubr::ggpar #' @inheritParams fviz #' @param ... Additional arguments. \itemize{ \item in fviz_pca_ind() and #' fviz_pca_var(): Additional arguments are passed to the functions fviz() and #' ggpubr::ggpar(). \item in fviz_pca_biplot() and fviz_pca(): Additional #' arguments are passed to fviz_pca_ind() and fviz_pca_var().} #' #' #' @return a ggplot #' @author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #' @seealso \code{\link{fviz_ca}}, \code{\link{fviz_mca}} #' @examples #' \donttest{ #' # Principal component analysis #' # ++++++++++++++++++++++++++++++ #' data(iris) #' res.pca <- prcomp(iris[, -5], scale = TRUE) #' #' # Graph of individuals #' # +++++++++++++++++++++ #' #' # Default plot #' # Use repel = TRUE to avoid overplotting (slow if many points) #' fviz_pca_ind(res.pca, col.ind = "#00AFBB", #' repel = TRUE) #' #' #' # 1. Control automatically the color of individuals #' # using the "cos2" or the contributions "contrib" #' # cos2 = the quality of the individuals on the factor map #' # 2. To keep only point or text use geom = "point" or geom = "text". #' # 3. Change themes using ggtheme: http://www.sthda.com/english/wiki/ggplot2-themes #' #' fviz_pca_ind(res.pca, col.ind="cos2", geom = "point", #' gradient.cols = c("white", "#2E9FDF", "#FC4E07" )) #' #' # Color individuals by groups, add concentration ellipses #' # Change group colors using RColorBrewer color palettes #' # Read more: http://www.sthda.com/english/wiki/ggplot2-colors #' # Remove labels: label = "none". #' fviz_pca_ind(res.pca, label="none", habillage=iris$Species, #' addEllipses=TRUE, ellipse.level=0.95, palette = "Dark2") #' #' #' # Change group colors manually #' # Read more: http://www.sthda.com/english/wiki/ggplot2-colors #' fviz_pca_ind(res.pca, label="none", habillage=iris$Species, #' addEllipses=TRUE, ellipse.level=0.95, #' palette = c("#999999", "#E69F00", "#56B4E9")) #' #' # Select and visualize some individuals (ind) with select.ind argument. #' # - ind with cos2 >= 0.96: select.ind = list(cos2 = 0.96) #' # - Top 20 ind according to the cos2: select.ind = list(cos2 = 20) #' # - Top 20 contributing individuals: select.ind = list(contrib = 20) #' # - Select ind by names: select.ind = list(name = c("23", "42", "119") ) #' #' # Example: Select the top 40 according to the cos2 #' fviz_pca_ind(res.pca, select.ind = list(cos2 = 40)) #' #' #' # Graph of variables #' # ++++++++++++++++++++++++++++ #' #' # Default plot #' fviz_pca_var(res.pca, col.var = "steelblue") #' #' # Control variable colors using their contributions #' fviz_pca_var(res.pca, col.var = "contrib", #' gradient.cols = c("white", "blue", "red"), #' ggtheme = theme_minimal()) #' #' #' # Biplot of individuals and variables #' # ++++++++++++++++++++++++++ #' # Keep only the labels for variables #' # Change the color by groups, add ellipses #' fviz_pca_biplot(res.pca, label = "var", habillage=iris$Species, #' addEllipses=TRUE, ellipse.level=0.95, #' ggtheme = theme_minimal()) #' #' } #' #' @rdname fviz_pca #' @export fviz_pca <- function(X, ...){ fviz_pca_biplot(X, ...) } #' @rdname fviz_pca #' @export fviz_pca_ind <- function(X, axes = c(1,2), geom = c("point", "text"), geom.ind = geom, repel = FALSE, habillage="none", palette = NULL, addEllipses=FALSE, col.ind = "black", fill.ind = "white", col.ind.sup = "blue", alpha.ind =1, select.ind = list(name = NULL, cos2 = NULL, contrib = NULL), ...) { fviz (X, element = "ind", axes = axes, geom = geom.ind, habillage = habillage, palette = palette, addEllipses = addEllipses, color = col.ind, fill = fill.ind, alpha = alpha.ind, col.row.sup = col.ind.sup, select = select.ind, repel = repel, ...) } #' @rdname fviz_pca #' @export fviz_pca_var <- function(X, axes=c(1,2), geom = c("arrow", "text"), geom.var = geom, repel = FALSE, col.var="black", fill.var = "white", alpha.var=1, col.quanti.sup="blue", col.circle ="grey70", select.var = list(name = NULL, cos2 = NULL, contrib = NULL), ...) { fviz (X, element = "var", axes = axes, geom = geom.var, color = col.var, fill = fill.var, alpha = alpha.var, select = select.var, repel = repel, col.col.sup = col.quanti.sup, col.circle = col.circle,...) } #' @rdname fviz_pca #' @export fviz_pca_biplot <- function(X, axes = c(1,2), geom = c("point", "text"), geom.ind = geom, geom.var = c("arrow", "text"), col.ind = "black", fill.ind = "white", col.var = "steelblue", fill.var = "white", gradient.cols = NULL, label = "all", invisible="none", repel = FALSE, habillage = "none", palette = NULL, addEllipses=FALSE, title = "PCA - Biplot", ...) { # Check if individials or variables are colored by variables is.individuals.colored.by.variable <- .is_grouping_var(fill.ind) | .is_grouping_var(col.ind) is.variables.colored.by.variable <- .is_continuous_var(col.var) | .is_grouping_var(col.var) # If coloring variable are continuous, then gradient coloring shoulld be applied is.gradient.color <- .is_continuous_var(col.ind) | .is_continuous_var(col.var) is.gradient.fill <- .is_continuous_var(fill.ind) | .is_continuous_var(fill.var) # If coloring variables are qualitative, then discrete coloring should be applied is.discrete.color <- .is_grouping_var(col.ind) | .is_grouping_var(habillage) | .is_grouping_var(col.var) is.discrete.fill <- .is_grouping_var(fill.ind) | .is_grouping_var(fill.var) | .is_grouping_var(habillage) | (.is_grouping_var(col.ind) & addEllipses) # Data frame to be used for plotting var <- facto_summarize(X, element = "var", result = c("coord", "contrib", "cos2"), axes = axes) colnames(var)[2:3] <- c("x", "y") pca.ind <- get_pca_ind(X) ind <- data.frame(pca.ind$coord[, axes, drop=FALSE], stringsAsFactors = TRUE) colnames(ind)<- c("x", "y") # rescale variable coordinates r <- min( (max(ind[,"x"])-min(ind[,"x"])/(max(var[,"x"])-min(var[,"x"]))), (max(ind[,"y"])-min(ind[,"y"])/(max(var[,"y"])-min(var[,"y"]))) ) # When fill.ind = grouping variable & col.var = continuous variable, # we should inactivate ellipse border and ind.point border colors, # otherwise --> error: Discrete value supplied to continuous scale # Reason: individuals are in discrete color and variable in gradient colors, # and we can't change the color (https://github.com/kassambara/factoextra/issues/42) ellipse.border.remove <- FALSE if(is.individuals.colored.by.variable & is.variables.colored.by.variable) ellipse.border.remove <- TRUE # Individuals p <- fviz_pca_ind(X, axes = axes, geom = geom.ind, repel = repel, col.ind = col.ind, fill.ind = fill.ind, label = label, invisible=invisible, habillage = habillage, addEllipses = addEllipses, # palette = palette, ellipse.border.remove = ellipse.border.remove, ...) # Add variables p <- fviz_pca_var(X, axes = axes, geom = geom.var, repel = repel, col.var = col.var, fill.var = fill.var, label = label, invisible = invisible, scale.= r*0.7, ggp = p, ...) if(!is.null(gradient.cols)){ if(is.gradient.color) p <- p + ggpubr::gradient_color(gradient.cols) if(is.gradient.fill) p <- p + ggpubr::gradient_fill(gradient.cols) } if(!is.null(palette)){ if(is.discrete.color) p <- p + ggpubr::color_palette(palette) if(is.discrete.fill) p <- p + ggpubr::fill_palette(palette) } p+labs(title=title) } factoextra/R/fviz_add.R0000644000176200001440000000771013637600504014535 0ustar liggesusers#' Add supplementary data to a plot #' #' @description #' Add supplementary data to a plot #' #' @param ggp a ggplot2 plot. #' @param df a data frame containing the x and y coordinates #' @param axes a numeric vector of length 2 specifying the components to be plotted. #' @param geom a character specifying the geometry to be used for the graph #' Allowed values are "point" or "arrow" or "text" #' @param color the color to be used #' @param addlabel a logical value. If TRUE, labels are added #' @param labelsize the size of labels. Default value is 4 #' @param pointsize the size of points #' @param shape point shape when geom ="point" #' @param linetype the linetype to be used when geom ="arrow" #' @param repel a boolean, whether to use ggrepel to avoid overplotting text #' labels or not. #' @param font.family character vector specifying font family. #' @param ... Additional arguments, not used #' @return a ggplot2 plot #' @author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #' @references http://www.sthda.com #' @examples #' \donttest{ #' # Principal component analysis #' data(decathlon2) #' decathlon2.active <- decathlon2[1:23, 1:10] #' res.pca <- prcomp(decathlon2.active, scale = TRUE) #' #' # Visualize variables #' p <- fviz_pca_var(res.pca) #' print(p) #' #' # Add supplementary variables #' coord <- data.frame(PC1 = c(-0.7, 0.9), PC2 = c(0.25, -0.07)) #' rownames(coord) <- c("Rank", "Points") #' print(coord) #' fviz_add(p, coord, color ="blue", geom="arrow") #' } #' #' @export fviz_add <- function(ggp, df, axes = c(1,2), geom=c("point", "arrow"), color ="blue", addlabel = TRUE, labelsize = 4, pointsize = 2, shape=19, linetype ="dashed", repel = FALSE, font.family = "", ...) { # Deprecated arguments extra_args <- list(...) if (!is.null(extra_args$jitter)) { warning("argument jitter is deprecated; please use repel = TRUE instead, to avoid overlapping of labels.", call. = FALSE) if(!is.null(extra_args$jitter$width) | !is.null(extra_args$jitter$height) ) repel = TRUE } if(!inherits(df, c("data.frame", "matrix"))) stop("df should be a data frame or a matrix") if(!inherits(df, "data.frame")) df <- as.data.frame(df, stringsAsFactors = TRUE) if(ncol(df) < 2) stop("df should have at least two columns (x and y coordinates)") if(length(intersect(geom, c("point", "arrow", "text"))) == 0) stop("The specified value(s) for the argument geom are not allowed ") if(is.null(df$name)) df$name <- rownames(df) if(is.null(df$x)) df$x <- df[,axes[1]] if(is.null(df$y)) df$y <- df[,axes[2]] # Plot #%%%%%%%%%%%%%%%%%%%%%% hjust <- vjust <- 0.5 if("point" %in% geom) { p <- ggp + ggpubr::geom_exec(geom_point, data = df, x = "x", y = "y", color = color, shape = shape, size = pointsize) vjust <- -0.7 } else if("arrow" %in% geom){ p <- ggp + geom_segment(data = df, aes_string(x = 0, y = 0, xend = 'x', yend = 'y'), arrow = grid::arrow(length = grid::unit(0.2, 'cm')), color=color, linetype=linetype) hjust <- 0.8 vjust <- 0 } else if("text" %in% geom) { vjust <- -0.7 p <- ggp } if(addlabel | "text" %in% geom){ if(repel){ p <- p + ggpubr::geom_exec(ggrepel::geom_text_repel, data = df, x = "x", y = "y", label = "name", color = color, size = labelsize, family = font.family) } else{ p <- p + ggpubr::geom_exec(geom_text, data = df, x = "x", y = "y", label = "name", color = color, size = labelsize, vjust=vjust, hjust = hjust, family = font.family) # p <- p + geom_text(data = df, aes_string("x", "y"), color = color, # label = df$name, size = labelsize, vjust=vjust, hjust = hjust) } } return(p) }factoextra/R/eigenvalue.R0000644000176200001440000001473713144620011015066 0ustar liggesusers#'Extract and visualize the eigenvalues/variances of dimensions #' #'@description Eigenvalues correspond to the amount of the variation explained #' by each principal component (PC). #' #' \itemize{ \item{get_eig(): Extract the eigenvalues/variances of the #' principal dimensions} \item{fviz_eig(): Plot the eigenvalues/variances #' against the number of dimensions} \item{get_eigenvalue(): an alias of #' get_eig()} \item{fviz_screeplot(): an alias of fviz_eig()} } #' #' These functions support the results of Principal Component Analysis (PCA), #' Correspondence Analysis (CA), Multiple Correspondence Analysis (MCA), Factor Analysis of Mixed Data (FAMD), #' Multiple Factor Analysis (MFA) and Hierarchical Multiple Factor Analysis #' (HMFA) functions. #' #' #'@param X an object of class PCA, CA, MCA, FAMD, MFA and HMFA [FactoMineR]; prcomp #' and princomp [stats]; dudi, pca, coa and acm [ade4]; ca and mjca [ca #' package]. #'@param choice a text specifying the data to be plotted. Allowed values are #' "variance" or "eigenvalue". #'@param geom a text specifying the geometry to be used for the graph. Allowed #' values are "bar" for barplot, "line" for lineplot or c("bar", "line") to use #' both types. #'@param barfill fill color for bar plot. #'@param barcolor outline color for bar plot. #'@param linecolor color for line plot (when geom contains "line"). #'@param ncp a numeric value specifying the number of dimensions to be shown. #'@param addlabels logical value. If TRUE, labels are added at the top of bars #' or points showing the information retained by each dimension. #'@param hjust horizontal adjustment of the labels. #'@param main,xlab,ylab plot main and axis titles. #' @inheritParams ggpubr::ggpar #'@param ... optional arguments to be passed to the function \link[ggpubr]{ggpar}. #' #'@return \itemize{ \item{get_eig() (or get_eigenvalue()): returns a data.frame #' containing 3 columns: the eigenvalues, the percentage of variance and the #' cumulative percentage of variance retained by each dimension.} #' \item{fviz_eig() (or fviz_screeplot()): returns a ggplot2} } #' #'@author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #'@seealso \code{\link{fviz_pca}}, \code{\link{fviz_ca}}, #' \code{\link{fviz_mca}}, \code{\link{fviz_mfa}}, \code{\link{fviz_hmfa}} #'@references http://www.sthda.com/english/ #' @examples #' # Principal Component Analysis #' # ++++++++++++++++++++++++++ #' data(iris) #' res.pca <- prcomp(iris[, -5], scale = TRUE) #' #' # Extract eigenvalues/variances #' get_eig(res.pca) #' #' # Default plot #' fviz_eig(res.pca, addlabels = TRUE, ylim = c(0, 85)) #' #' # Scree plot - Eigenvalues #' fviz_eig(res.pca, choice = "eigenvalue", addlabels=TRUE) #' #' # Use only bar or line plot: geom = "bar" or geom = "line" #' fviz_eig(res.pca, geom="line") #' #' \dontrun{ #' # Correspondence Analysis #' # +++++++++++++++++++++++++++++++++ #' library(FactoMineR) #' data(housetasks) #' res.ca <- CA(housetasks, graph = FALSE) #' get_eig(res.ca) #' fviz_eig(res.ca, linecolor = "#FC4E07", #' barcolor = "#00AFBB", barfill = "#00AFBB") #' #' # Multiple Correspondence Analysis #' # +++++++++++++++++++++++++++++++++ #' library(FactoMineR) #' data(poison) #' res.mca <- MCA(poison, quanti.sup = 1:2, #' quali.sup = 3:4, graph=FALSE) #' get_eig(res.mca) #' fviz_eig(res.mca, linecolor = "#FC4E07", #' barcolor = "#2E9FDF", barfill = "#2E9FDF") #' } #' #'@name eigenvalue NULL #' @rdname eigenvalue #' @export get_eig<-function(X){ # FactoMineR package if(inherits(X, c('PCA', 'CA', 'MCA', 'FAMD', 'MFA', 'HMFA', 'sPCA', 'sCA', 'sMCA', 'sMFA', 'sHMFA'))) eig <- X$eig else{ # stats package if(inherits(X, 'prcomp') | inherits(X, 'princomp')) eig <- (X$sdev)^2 # ade4 package else if(inherits(X, c('pca', 'coa', 'acm')) & inherits(X, 'dudi')) eig <- X$eig # ca package else if(inherits(X, 'ca')) eig <- X$sv^2 else if(inherits(X, 'mjca')) eig <- X$inertia.e # MASS else if(inherits(X, 'correspondence')) eig <- X$cor^2 # ExPosition package else if (inherits(X, "expoOutput")) eig <- X$ExPosition.Data$eigs else stop("An object of class : ", class(X), " can't be handled by the function get_eigenvalue()") variance <- eig*100/sum(eig) cumvar <- cumsum(variance) eig <- data.frame(eigenvalue = eig, variance = variance, cumvariance = cumvar) } colnames(eig) <- c("eigenvalue", "variance.percent", "cumulative.variance.percent") rownames(eig) <- paste0("Dim.", 1:nrow(eig)) eig } #' @rdname eigenvalue #' @export get_eigenvalue <- function(X){ get_eig(X) } #' @rdname eigenvalue #' @export fviz_eig<-function(X, choice=c("variance", "eigenvalue"), geom=c("bar", "line"), barfill="steelblue", barcolor="steelblue", linecolor = "black", ncp=10, addlabels=FALSE, hjust = 0, main = NULL, xlab = NULL, ylab = NULL, ggtheme = theme_minimal(), ...) { eig <- get_eigenvalue(X) eig <-eig[1:min(ncp, nrow(eig)), , drop=FALSE] choice <- choice[1] if(choice=="eigenvalue") { eig <- eig[,1] text_labels <- round(eig,1) if(is.null(ylab)) ylab <- "Eigenvalue" } else if(choice=="variance") { eig <- eig[,2] text_labels <- paste0(round(eig,1), "%") } else stop("Allowed values for the argument choice are : 'variance' or 'eigenvalue'") if(length(intersect(geom, c("bar", "line"))) == 0) stop("The specified value(s) for the argument geom are not allowed ") df.eig <- data.frame(dim = factor(1:length(eig)), eig=eig ) extra_args <- list(...) bar_width <- extra_args$bar_width linetype <- extra_args$linetype if(is.null(linetype)) linetype <- "solid" p <- ggplot(df.eig, aes(dim, eig, group=1 )) if("bar" %in% geom) p <- p + geom_bar(stat="identity", fill= barfill, color = barcolor, width = bar_width) if("line" %in% geom) p <- p + geom_line(color = linecolor, linetype = linetype)+ geom_point(shape=19, color=linecolor) if(addlabels) p <- p + geom_text(label = text_labels, vjust=-0.4, hjust = hjust) if(is.null(main)) main <- "Scree plot" if(is.null(xlab)) xlab <- "Dimensions" if(is.null(ylab)) ylab <- "Percentage of explained variances" p <- p + labs(title = main, x = xlab, y = ylab) ggpubr::ggpar(p, ggtheme = ggtheme, ...) } #' @rdname eigenvalue #' @export fviz_screeplot<- function(...){ fviz_eig(...) } factoextra/R/fviz.R0000644000176200001440000004647313637602011013731 0ustar liggesusers#' @include utilities.R NULL #'Visualizing Multivariate Analyse Outputs #'@description Generic function to create a scatter plot of multivariate analyse #' outputs, including PCA, CA, MCA and MFA. #'@inheritParams facto_summarize #'@param geom a text specifying the geometry to be used for the graph. Default #' value is "auto". Allowed values are the combination of c("point", "arrow", #' "text"). Use "point" (to show only points); "text" to show only labels; #' c("point", "text") or c("arrow", "text") to show both types. #'@param label a text specifying the elements to be labelled. Default value is #' "all". Allowed values are "none" or the combination of c("ind", "ind.sup", #' "quali", "var", "quanti.sup", "group.sup"). "ind" can be used to label only #' active individuals. "ind.sup" is for supplementary individuals. "quali" is #' for supplementary qualitative variables. "var" is for active variables. #' "quanti.sup" is for quantitative supplementary variables. #'@param invisible a text specifying the elements to be hidden on the plot. #' Default value is "none". Allowed values are the combination of c("ind", #' "ind.sup", "quali", "var", "quanti.sup", "group.sup"). #'@param labelsize font size for the labels #'@param pointsize the size of points #'@param pointshape the shape of points #'@param arrowsize the size of arrows. Controls the thickness of arrows. #'@param title the title of the graph #'@param repel a boolean, whether to use ggrepel to avoid overplotting text #' labels or not. #'@param habillage an optional factor variable for coloring the observations by #' groups. Default value is "none". If X is a PCA object from FactoMineR #' package, habillage can also specify the supplementary qualitative variable #' (by its index or name) to be used for coloring individuals by groups (see #' ?PCA in FactoMineR). #'@param addEllipses logical value. If TRUE, draws ellipses around the #' individuals when habillage != "none". #'@param ellipse.level the size of the concentration ellipse in normal #' probability. #'@param ellipse.type Character specifying frame type. Possible values are #' \code{"convex"}, \code{"confidence"} or types supported by #' \code{\link[ggplot2]{stat_ellipse}()} including one of \code{c("t", "norm", #' "euclid")} for plotting concentration ellipses. #' #' \itemize{ \item \code{"convex"}: plot convex hull of a set o points. \item #' \code{"confidence"}: plot confidence ellipses arround group mean points as #' \code{\link[FactoMineR]{coord.ellipse}()}[in FactoMineR]. \item \code{"t"}: #' assumes a multivariate t-distribution. \item \code{"norm"}: assumes a #' multivariate normal distribution. \item \code{"euclid"}: draws a circle with #' the radius equal to level, representing the euclidean distance from the #' center. This ellipse probably won't appear circular unless #' \code{\link[ggplot2]{coord_fixed}()} is applied.} #' #' #'@param ellipse.alpha Alpha for ellipse specifying the transparency level of #' fill color. Use alpha = 0 for no fill color. #'@param mean.point logical value. If TRUE (default), group mean points are #' added to the plot. #'@param col.circle a color for the correlation circle. Used only when X is a #' PCA output. #'@param circlesize the size of the variable correlation circle. #'@param axes.linetype linetype of x and y axes. #'@param color color to be used for the specified geometries (point, text). Can #' be a continuous variable or a factor variable. Possible values include also #' : "cos2", "contrib", "coord", "x" or "y". In this case, the colors for #' individuals/variables are automatically controlled by their qualities of #' representation ("cos2"), contributions ("contrib"), coordinates (x^2+y^2, #' "coord"), x values ("x") or y values ("y"). To use automatic coloring (by #' cos2, contrib, ....), make sure that habillage ="none". #'@param fill same as the argument \code{color}, but for point fill color. #' Useful when pointshape = 21, for example. #'@param alpha controls the transparency of individual and variable colors, #' respectively. The value can variate from 0 (total transparency) to 1 (no #' transparency). Default value is 1. Possible values include also : "cos2", #' "contrib", "coord", "x" or "y". In this case, the transparency for the #' individual/variable colors are automatically controlled by their qualities #' ("cos2"), contributions ("contrib"), coordinates (x^2+y^2, "coord"), x #' values("x") or y values("y"). To use this, make sure that habillage ="none". #'@param col.col.sup,col.row.sup colors for the supplementary column and row #' points, respectively. #'@param select a selection of individuals/variables to be drawn. Allowed values #' are NULL or a list containing the arguments name, cos2 or contrib: \itemize{ #' \item name: is a character vector containing individuals/variables to be #' drawn \item cos2: if cos2 is in [0, 1], ex: 0.6, then individuals/variables #' with a cos2 > 0.6 are drawn. if cos2 > 1, ex: 5, then the top 5 #' individuals/variables with the highest cos2 are drawn. \item contrib: if #' contrib > 1, ex: 5, then the top 5 individuals/variables with the highest #' contrib are drawn } #'@param ggp a ggplot. If not NULL, points are added to an existing plot. #'@inheritParams ggpubr::ggpar #'@param font.family character vector specifying font family. #'@param ... Arguments to be passed to the functions ggpubr::ggscatter() & #' ggpubr::ggpar(). #' #'@return a ggplot #'@author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #' #'@rdname fviz #' @examples #' \donttest{ #' # Principal component analysis #' # +++++++++++++++++++++++++++++ #' data(decathlon2) #' decathlon2.active <- decathlon2[1:23, 1:10] #' res.pca <- prcomp(decathlon2.active, scale = TRUE) #' fviz(res.pca, "ind") # Individuals plot #' fviz(res.pca, "var") # Variables plot #' #' # Correspondence Analysis #' # ++++++++++++++++++++++++++ #' # Install and load FactoMineR to compute CA #' # install.packages("FactoMineR") #' library("FactoMineR") #' data("housetasks") #' res.ca <- CA(housetasks, graph = FALSE) #' fviz(res.ca, "row") # Rows plot #' fviz(res.ca, "col") # Columns plot #' #' # Multiple Correspondence Analysis #' # +++++++++++++++++++++++++++++++++ #' library(FactoMineR) #' data(poison) #' res.mca <- MCA(poison, quanti.sup = 1:2, #' quali.sup = 3:4, graph=FALSE) #' #' fviz(res.mca, "ind") # Individuals plot #' fviz(res.mca, "var") # Variables plot #' #' } #'@export fviz <- function(X, element, axes = c(1, 2), geom = "auto", label = "all", invisible="none", labelsize=4, pointsize = 1.5, pointshape = 19, arrowsize = 0.5, habillage="none", addEllipses=FALSE, ellipse.level = 0.95, ellipse.type = "norm", ellipse.alpha = 0.1, mean.point = TRUE, color = "black", fill = "white", alpha = 1, gradient.cols = NULL, col.row.sup = "darkblue", col.col.sup="darkred", select = list(name = NULL, cos2 = NULL, contrib = NULL), title = NULL, axes.linetype = "dashed", repel = FALSE, col.circle ="grey70", circlesize = 0.5, ggtheme = theme_minimal(), ggp = NULL, font.family = "", ...) { .check_axes(axes, .length = 2) facto.class <- .get_facto_class(X) # Deprecated arguments: jitter extra_args <- list(...) if(!is.null(extra_args$jitter)) repel <- .facto_dep("jitter", "repel", TRUE) # Elements to be labelled or hidden lab <- .label(label) hide <- .hide(invisible) # Define parameters #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Define title if NULL if(is.null(title)){ element_desc <- list(ind = "Individuals", var = "Variables", col = "Column points", row = "Row points", mca.cor = "Variables", quanti.sup = "Quantitative variables", quanti.var = "Quantitative variables", quali.var = "Qualitative variable categories", group = "Variable groups", partial.axes = "Partial axes") if(facto.class == "MCA") element_desc$var <- "Variable categories" title <- paste0(element_desc[[element]], " - ", facto.class) } # Define geometry if auto if(geom[1] == "auto"){ geom <- c("point", "text") if(element == "var" & facto.class == "PCA") geom <- c("arrow", "text") } # Define color if missing if(facto.class %in% c("CA", "MCA")){ if(element %in% c("row", "ind") & missing(color)) color = "blue" else if(element %in% c("col", "var", "mca.cor") & missing(color)) color = "red" } # Data preparation #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Data frame to be used for plotting summary.res <- c("coord", "contrib", "cos2") if(element == "partial.axes" | (element == "quali.var" & facto.class == "HMFA")) summary.res <- c("coord", "contrib") else if(element == "group" & facto.class == "HMFA") summary.res <- "coord" df <- facto_summarize(X, element = element, axes = axes, result = summary.res) colnames(df)[2:3] <- c("x", "y") # Color by grouping variables #:::::::::::::::::::::::::::::::::::::: is_grouping_var_exists <- !("none" %in% habillage) | .is_grouping_var(color) | .is_grouping_var(fill) # Augment data, if qualitative variable is used to color points by groups if(!("none" %in% habillage)){ dd <- .add_ind_groups(X, df, habillage) df <- dd$ind color <- dd$name.quali if(missing(pointshape)) pointshape <- dd$name.quali } # Augment data if color is a continuous variable or a factor variable if(length(color) > 1){ if(nrow(df) != length(color)) stop("The length of color variable", "should be the same as the number of rows in the data.") .col.name <- "Col." df[[.col.name]] <- color if(missing(pointshape) & .is_grouping_var(color)) pointshape <- .col.name color <- .col.name } # Augment data if fill is a continuous variable or a factor variable if(length(fill) > 1){ if(nrow(df) != length(fill)) stop("The length of fill variable", "should be the same as the number of rows in the data.") .col.name <- "Fill." df[[.col.name]] <- fill fill <- .col.name } # Augment the data, if pointsize is a continuous variable if(length(pointsize) > 1){ if(nrow(df) != length(pointsize)) pointsize <- 1.5 df[["pointsize"]] <- pointsize pointsize <- "pointsize" } # Selection df.all <- df if(!is.null(select)) df <- .select(df, select) # Special cases: data transformation #%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Used by fviz_pca_biplot() only: Multiply the variables data by scale. before biplotting if(facto.class == "PCA" & element == "var" & !is.null(extra_args$scale.) ) df[, c("x", "y")] <- df[, c("x", "y")]*extra_args$scale. # (M)CA: scale coords according to the type of map if(facto.class %in% c("CA", "MCA") & !(element %in% c("mca.cor", "quanti.sup"))){ if(!is.null(extra_args$map)) df <- .scale_ca(df, res.ca = X, element = element, type = extra_args$map, axes = axes) } # Main plot #%%%%%%%%%%%%%%%%%%% is.pca.var <- element == "var" & facto.class == "PCA" # We don't want meanpoint for PCA variables colored by groups point <- ("point" %in% geom) & (!hide[[element]]) # to show points, should be TRUE if(missing(mean.point)) mean.point <- (is_grouping_var_exists & !is.pca.var) & ("point" %in% geom) & (!hide[["quali"]]) # to show mean point if(element == "quanti.var") mean.point <- FALSE # MFA, don't show the mean point of groups of variables label <- NULL if(lab[[element]] & "text" %in% geom & !hide[[element]]) label <- "name" p <- ggplot() if(hide[[element]]) { if(is.null(ggp)) p <-ggplot()+geom_blank(data = df, aes_string("x","y")) else p <- ggp } else p <- ggpubr::ggscatter(data = df, x = "x", y = "y", color = color, fill = fill, alpha = alpha, shape = pointshape, point = point, size = pointsize, mean.point = mean.point, label = label, font.label = labelsize*3, repel = repel, ellipse = addEllipses, ellipse.type = ellipse.type, ellipse.alpha = ellipse.alpha, ellipse.level = ellipse.level, main = title, ggtheme = ggtheme, ggp = ggp, font.family = font.family, ...) if(alpha %in% c("cos2","contrib", "coord", "x", "y")) p <- p + scale_alpha(limits = range(df.all[, alpha])) if(!is.null(gradient.cols)) p <- p + ggpubr::gradient_color(gradient.cols) if(is.null(extra_args$legend)) p <- p + theme(legend.position = "right" ) # Add arrows if("arrow" %in% geom & !hide[[element]]) p <- p + .arrows(data = df, color = color, alpha = alpha, size = arrowsize) # Add correlation circle if PCA & element = "var" & scale = TRUE if(facto.class == "PCA" & element == "var"){ if(.get_scale_unit(X) & is.null(extra_args$scale.)) p <- .add_corr_circle(p, color = col.circle, size = circlesize) } else if(facto.class %in% c("MCA", "MFA", "HMFA", "FAMD") & element %in% c("quanti.sup", "quanti.var", "partial.axes")){ p <- .add_corr_circle(p, color = col.circle, size = circlesize) } # Faceting when multiple variables are used to color individuals # (e.g., habillage = 1:2, or data.frame) # in this case there is a column "facet_vars" in df if("facet_vars" %in% colnames(df)){ groups <- c("facet_vars", "Groups") xx <- ggpubr::desc_statby(df, measure.var = "x", grps = groups)[, c(groups, "mean")] colnames(xx)[ncol(xx)] <- "x" yy <- ggpubr::desc_statby(df, measure.var = "y", grps = groups)[, c(groups, "mean")] xx$y <- yy$mean grp_coord <- xx p <- p+ggpubr::geom_exec(geom_text, data = grp_coord, x = "x", y = "y", label = "Groups", color = color) p <- p + facet_wrap(~facet_vars) + theme(legend.position = "none") } # Supplementary elements: available only for FactoMineR #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% scale. <- ifelse(is.null(extra_args$scale.), 1, extra_args$scale.) esup <- .define_element_sup(X, element, geom = geom, lab = lab, hide = hide, col.row.sup = col.row.sup, col.col.sup = col.col.sup,...) ca_map = extra_args$map if(element == "mca.cor") ca_map = NULL if(!is.null(esup)) p <- .add_supp (p, X, element = esup$name, axes = axes, select = select, geom = geom, color = esup$color, shape = esup$shape, pointsize = pointsize, labelsize = labelsize, addlabel = esup$addlabel, repel = repel, linetype = 2, scale. = scale., ca_map = ca_map, font.family = font.family) p <- .fviz_finish(p, X, axes, axes.linetype, ...) + labs(title = title) p } #+++++++++++++++++++++ # Helper functions #+++++++++++++++++++++ # Check if fill/color variable is continous in the context of PCA .is_continuous_var <- function(x){ x[1] %in% c("cos2", "contrib", "x", "y") | is.numeric(x) } .is_grouping_var <- function(x){ length(x) > 1 & (is.character(x) | is.factor(x)) } # Check if is continuous or grouping variable in the context of PCA .is_variable <- function(x){ .is_continuous_var(x) | .is_grouping_var(x) } # Check if character string is a valid color representation .is_color <- function(x) { sapply(x, function(X) { tryCatch(is.matrix(grDevices::col2rgb(X)), error = function(e) FALSE) }) } # X : an object of class PCA, princomp, prcomp, dudi, expoOutput # Return TRUE if the data are scaled to unit variance .get_scale_unit <-function(X){ scale_unit <- FALSE if(inherits(X, 'PCA')) scale_unit <- X$call$scale.unit else if(inherits(X, "prcomp" )) scale_unit <- is.numeric(X$scale) else if(inherits(X, "princomp")) scale_unit <- length(unique(X$scale))>1 else if(inherits(X, "expoOutput")) scale_unit <- !all(X$ExPosition.Data$scale==1) else if(inherits(X, 'pca') & inherits(X, 'dudi')) scale_unit <- length(unique(X$norm))>1 else { warning(".get_scale_unit function: can't handle an object of class ", class(X)) } scale_unit } # Add correlation circle to variables plot .add_corr_circle <- function(p, color = "grey70", size = 0.5){ theta <- c(seq(-pi, pi, length = 50), seq(pi, -pi, length = 50)) circle <- data.frame(xcircle = cos(theta), ycircle = sin(theta), stringsAsFactors = TRUE) p + geom_path(mapping = aes_string("xcircle", "ycircle"), data = circle, color = color, size = size) + coord_fixed() } # Add arrow to the plot .arrows <- function(data, color = "black", alpha = 1, size =0.5, origin = 0, xend = "x", yend = "y"){ origin <- rep(origin, nrow(data)) dd <- cbind.data.frame(data, xstart = origin, ystart = origin, stringsAsFactors = TRUE) ggpubr::geom_exec(geom_segment, data = dd, x = "xstart", y = "ystart", xend = xend, yend = yend, arrow = grid::arrow(length = grid::unit(0.2, 'cm')), color = color, alpha = alpha, size = size) } # Define element sup if any # lab,hide: element to be labelled or hidden as returned by .hide() and .label() .define_element_sup <- function(X, element, geom, lab, hide, col.row.sup = "darkblue", col.col.sup = "darkred", ...){ extra_args <- list(...) shape.sup <- ifelse(is.null(extra_args$shape.sup), 19, extra_args$shape.sup) color <- col.row.sup if(element %in% c("var", "mca.cor", "col", "group", "quanti.var")) color <- col.col.sup res <- NULL # Supplementary individuals if(element == "ind" & inherits(X, c('PCA', "MCA", "MFA", "FAMD")) & !hide$ind.sup) res <- list(name = "ind.sup", addlabel = (lab$ind.sup & "text" %in% geom)) # Supplementary quantitative variables else if(element == "var" & inherits(X, 'PCA') & !hide$quanti.sup) res <- list(name = "quanti", addlabel = (lab$quanti.sup & "text" %in% geom)) else if(element == "mca.cor" & inherits(X, 'MCA') & !hide$quanti) res <- list(name = c("quanti.sup", "quali.sup$eta2"), addlabel = (lab$quanti & "text" %in% geom)) else if(element %in% "var" & inherits(X, 'MCA') & !hide$quali.sup) res <- list(name = "quali.sup", addlabel = (lab$quali.sup & "text" %in% geom)) else if(element %in% "quali.var" & inherits(X, 'MFA') & !hide$quali.sup) res <- list(name = "quali.sup", addlabel = (lab$quali.sup & "text" %in% geom)) else if(element %in% "var" & inherits(X, 'FAMD') & !hide$quanti.sup) res <- list(name = "quanti.sup", addlabel = (lab$quanti.sup & "text" %in% geom)) # CA else if(element == "row" & inherits(X, c('CA', 'ca')) & !hide$row.sup) res <- list(name = "row.sup", addlabel = (lab$row.sup & "text" %in% geom)) else if(element == "col" & inherits(X, c('CA', 'ca')) & !hide$row.sup) res <- list(name = "col.sup", addlabel = (lab$col.sup & "text" %in% geom)) else if(element == "group" & inherits(X, c('MFA')) & !hide$group.sup) res <- list(name = "group", addlabel = (lab$group.sup & "text" %in% geom)) else if(element == "quanti.var" & inherits(X, c('MFA')) & !hide$quanti.var.sup) res <- list(name = "quanti.var.sup", addlabel = (lab$quanti.var.sup & "text" %in% geom)) res$color <- color res$shape <- shape.sup res } factoextra/R/fviz_cluster.R0000644000176200001440000003030013637600647015465 0ustar liggesusers#' @include eigenvalue.R get_pca.R hcut.R NULL #'Visualize Clustering Results #'@description Provides ggplot2-based elegant visualization of partitioning #' methods including kmeans [stats package]; pam, clara and fanny [cluster #' package]; dbscan [fpc package]; Mclust [mclust package]; HCPC [FactoMineR]; #' hkmeans [factoextra]. Observations are represented by points in the plot, #' using principal components if ncol(data) > 2. An ellipse is drawn around #' each cluster. #'@param object an object of class "partition" created by the functions pam(), #' clara() or fanny() in cluster package; "kmeans" [in stats package]; "dbscan" #' [in fpc package]; "Mclust" [in mclust]; "hkmeans", "eclust" [in factoextra]. #' Possible value are also any list object with data and cluster components #' (e.g.: object = list(data = mydata, cluster = myclust)). #'@param data the data that has been used for clustering. Required only when #' object is a class of kmeans or dbscan. #'@param choose.vars a character vector containing variables to be considered #' for plotting. #'@param stand logical value; if TRUE, data is standardized before principal #' component analysis #'@param axes a numeric vector of length 2 specifying the dimensions to be #' plotted. #'@param geom a text specifying the geometry to be used for the graph. Allowed #' values are the combination of c("point", "text"). Use "point" (to show only #' points); "text" to show only labels; c("point", "text") to show both types. #'@param repel a boolean, whether to use ggrepel to avoid overplotting text #' labels or not. #'@param show.clust.cent logical; if TRUE, shows cluster centers #'@param ellipse logical value; if TRUE, draws outline around points of each #' cluster #'@param ellipse.type Character specifying frame type. Possible values are #' 'convex', 'confidence' or types supported by #' \code{\link[ggplot2]{stat_ellipse}} including one of c("t", "norm", #' "euclid"). #'@param ellipse.level the size of the concentration ellipse in normal #' probability. Passed for \code{ggplot2::stat_ellipse} 's level. Ignored in #' 'convex'. Default value is 0.95. #'@param ellipse.alpha Alpha for frame specifying the transparency level of fill #' color. Use alpha = 0 for no fill color. #'@param labelsize font size for the labels #'@param shape the shape of points. #'@param pointsize the size of points #'@param outlier.pointsize,outlier.color,outlier.shape,outlier.labelsize #' arguments for customizing outliers, which can be detected only in DBSCAN #' clustering. #'@param main plot main title. #'@param xlab,ylab character vector specifying x and y axis labels, #' respectively. Use xlab = FALSE and ylab = FALSE to hide xlab and ylab, #' respectively. #'@inheritParams ggpubr::ggpar #'@param ... other arguments to be passed to the functions #' \code{\link[ggpubr]{ggscatter}} and \code{\link[ggpubr]{ggpar}}. #' #'@return return a ggpplot. #'@author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #'@seealso \code{\link{fviz_silhouette}}, \code{\link{hcut}}, #' \code{\link{hkmeans}}, \code{\link{eclust}}, \code{\link{fviz_dend}} #' @examples #' set.seed(123) #' #' # Data preparation #' # +++++++++++++++ #' data("iris") #' head(iris) #' # Remove species column (5) and scale the data #' iris.scaled <- scale(iris[, -5]) #' #' # K-means clustering #' # +++++++++++++++++++++ #' km.res <- kmeans(iris.scaled, 3, nstart = 10) #' #' # Visualize kmeans clustering #' # use repel = TRUE to avoid overplotting #' fviz_cluster(km.res, iris[, -5], ellipse.type = "norm") #' #' #'# Change the color palette and theme #'fviz_cluster(km.res, iris[, -5], #' palette = "Set2", ggtheme = theme_minimal()) #' #' \dontrun{ #' # Show points only #' fviz_cluster(km.res, iris[, -5], geom = "point") #' # Show text only #' fviz_cluster(km.res, iris[, -5], geom = "text") #' #' # PAM clustering #' # ++++++++++++++++++++ #' require(cluster) #' pam.res <- pam(iris.scaled, 3) #' # Visualize pam clustering #' fviz_cluster(pam.res, geom = "point", ellipse.type = "norm") #' #' # Hierarchical clustering #' # ++++++++++++++++++++++++ #' # Use hcut() which compute hclust and cut the tree #' hc.cut <- hcut(iris.scaled, k = 3, hc_method = "complete") #' # Visualize dendrogram #' fviz_dend(hc.cut, show_labels = FALSE, rect = TRUE) #' # Visualize cluster #' fviz_cluster(hc.cut, ellipse.type = "convex") #' #' } #' #' #' #'@name fviz_cluster #'@rdname fviz_cluster #'@export fviz_cluster <- function(object, data = NULL, choose.vars = NULL, stand = TRUE, axes = c(1, 2), geom = c("point", "text"), repel = FALSE, show.clust.cent = TRUE, ellipse = TRUE, ellipse.type = "convex", ellipse.level = 0.95, ellipse.alpha = 0.2, shape = NULL, pointsize = 1.5, labelsize = 12, main = "Cluster plot", xlab = NULL, ylab = NULL, outlier.color = "black", outlier.shape = 19, outlier.pointsize = pointsize, outlier.labelsize = labelsize, ggtheme = theme_grey(), ...){ # Deprecated arguments extra_args <- list(...) .check_axes(axes, .length = 2) if (!is.null(extra_args$jitter)) { warning("argument jitter is deprecated; please use repel = TRUE instead, to avoid overlapping of labels.", call. = FALSE) if(!is.null(extra_args$jitter$width) | !is.null(extra_args$jitter$height) ) repel = TRUE } if(!is.null(extra_args$frame)) ellipse <- .facto_dep("frame", "ellipse", ellipse) if(!is.null(extra_args$frame.type)) ellipse.type <- .facto_dep("frame.type", "ellipse.type", extra_args$frame.type) if(!is.null(extra_args$frame.level)) ellipse.level <- .facto_dep("frame.level", "ellipse.level", extra_args$frame.level) if(!is.null(extra_args$frame.alpha)) ellipse.alpha <- .facto_dep("frame.alpha", "ellipse.alpha", extra_args$frame.alpha) if(!is.null(extra_args$title)) main <- .facto_dep("title", "main", extra_args$title) # object from cluster package if(inherits(object, c("partition", "hkmeans", "eclust"))) data <- object$data # Object from kmeans (stats package) else if((inherits(object, "kmeans") & !inherits(object, "eclust"))| inherits(object, "dbscan")){ if(is.null(data)) stop("data is required for plotting kmeans/dbscan clusters") } # Object from mclust package else if(inherits(object, "Mclust")) { object$cluster <- object$classification data <- object$data } # HCPC in FactoMineR else if(inherits(object, "HCPC")) { object$cluster <- object$call$X$clust data <- res.hcpc <- object stand <- FALSE # to avoid trying to standardize HCPC results # data <- object$data.clust[, -ncol(object$data.clust), drop = FALSE] # object$cluster <- as.vector(object$data.clust$clust) } else if(inherits(object, "hcut")){ if(inherits(object$data, "dist")){ if(is.null(data)) stop("The option 'data' is required for an object of class hcut." ) } else data <- object$data } # Any obects containing data and cluster elements else if(!is.null(object$data) & !is.null(object$cluster)){ data <- object$data cluster <- object$cluster } else stop("Can't handle an object of class ", class(object)) # Choose variables if(!is.null(choose.vars)) data <- data[, choose.vars, drop = FALSE] if(stand) data <- scale(data) cluster <- as.factor(object$cluster) pca_performed <- FALSE # Prepare the data for plotting # ++++++++++++++++++++++++ # PCA is performed depending on the number of variables if(inherits(data, c("matrix", "data.frame"))){ # ncol(data) > 2 --> PCA if(ncol(data)>2){ pca <- stats::prcomp(data, scale = FALSE, center = FALSE) ind <- facto_summarize(pca, element = "ind", result = "coord", axes = axes) eig <- get_eigenvalue(pca)[axes,2] if(is.null(xlab)) xlab = paste0("Dim", axes[1], " (", round(eig[1],1), "%)") if(is.null(ylab)) ylab = paste0("Dim", axes[2], " (", round(eig[2], 1),"%)") } # PCA is not performed else if(ncol(data) == 2){ ind <- as.data.frame(data, stringsAsFactors = TRUE) ind <- cbind.data.frame(name = rownames(ind), ind, stringsAsFactors = TRUE) if(is.null(xlab)) xlab <- colnames(data)[1] if(is.null(ylab)) ylab <- colnames(data)[2] if(xlab=="x") xlab <- "x value" if(ylab == "y") ylab <- "y value" } else{ stop("The dimension of the data < 2! No plot.") } colnames(ind)[2:3] <- c("x", "y") label_coord <- ind } else if(inherits(data, "HCPC")){ ind <- res.hcpc$call$X[, c(axes, ncol(res.hcpc$call$X))] colnames(ind) <- c("Dim.1", "Dim.2", "clust") ind <- cbind.data.frame(name = rownames(ind), ind, stringsAsFactors = TRUE) colnames(ind)[2:3] <- c("x", "y") label_coord <- ind eig <- get_eigenvalue(res.hcpc$call$t$res)[axes,2] if(is.null(xlab)) xlab = paste0("Dim", axes[1], " (", round(eig[1], 1), "%)") if(is.null(ylab)) ylab = paste0("Dim", axes[2], " (", round(eig[2], 1),"%)") } else stop("A data of class ", class(data), " is not supported.") # Plot data and labels # ++++++++++++++++++++++++ label = FALSE if("text" %in% geom) label = TRUE if(!("point" %in% geom)) pointsize = 0 plot.data <- cbind.data.frame(ind, cluster = cluster, stringsAsFactors = TRUE) label_coord <- cbind.data.frame(label_coord, cluster = cluster, stringsAsFactors = TRUE) # Augment data if(inherits(object, "Mclust")){ plot.data$uncertainty <- object$uncertainty label_coord$uncertainty <- object$uncertainty } # IF DBSCAN: cluster 0 is outliers. We don't want to make ellipse around # these observations. Let's remove them. They will be added to the plot later is_outliers = FALSE if(inherits(object, c("dbscan", "Mclust"))){ outliers <- which(cluster == 0) if(length(outliers) > 0){ is_outliers = TRUE outliers_data <- plot.data[outliers, , drop = FALSE] outliers_labs <- label_coord[outliers, , drop = FALSE] ind <- ind[-outliers, , drop = FALSE] cluster <- cluster[-outliers] plot.data <- plot.data[-outliers, , drop = FALSE] label_coord <- label_coord[-outliers, , drop = FALSE] } } # Plot # ++++++++++++++++++++++++ lab <- NULL if("text" %in% geom) lab <- "name" if(is.null(shape)) shape <- "cluster" if(inherits(object, "partition") & missing(show.clust.cent)) show.clust.cent <- FALSE # hide mean point for PAM, CLARA p <- ggpubr::ggscatter(plot.data, "x", "y", color="cluster", shape = shape, size = pointsize, point = "point" %in% geom, label = lab, font.label = labelsize, repel = repel, mean.point = show.clust.cent, ellipse = ellipse, ellipse.type = ellipse.type, ellipse.alpha = ellipse.alpha, ellipse.level = ellipse.level, main = main, xlab = xlab, ylab = ylab, ggtheme = ggtheme, ... ) # Add outliers (can exist only in dbscan) if(is_outliers) p <- .add_outliers(p, outliers_data, outliers_labs, outlier.color, outlier.shape, outlier.pointsize, outlier.labelsize/3, geom, repel = repel) p } # Add outliers to cluster plot (for dbscan only) .add_outliers <-function(p, outliers_data, outliers_labs, outlier.color = "black", outlier.shape = 19, pointsize = 2, labelsize = 4, geom = c("point", "text"), repel = FALSE) { if("point" %in% geom) p <- p + geom_point(data = outliers_data, aes_string('x', 'y'), size = pointsize, color = outlier.color, shape = outlier.shape) if("text" %in% geom){ if(repel) p <- p +ggrepel::geom_text_repel(data = outliers_labs, aes_string('x', 'y', label = 'name'), size = labelsize, color = outlier.color) else p <- p + geom_text(data = outliers_labs, aes_string('x', 'y', label = 'name'), size = labelsize, vjust = -0.7, color = outlier.color) } return(p) } factoextra/R/print.factoextra.R0000644000176200001440000001354113144620011016225 0ustar liggesusers#' Print method for an object of class factoextra #' #' @description #' Print method for an object of class factoextra #' @param x an object of class factoextra #' @param ... further arguments to be passed to print method #' @author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #' @examples #' data(iris) #' res.pca <- prcomp(iris[, -5], scale = TRUE) #' ind <- get_pca_ind(res.pca, data = iris[, -5]) #' print(ind) #' #' @export print.factoextra<-function(x, ...){ if(!inherits(x, "factoextra")) stop("Can't handle data of class ", class(x)) if(inherits(x, "pca_ind")){ cat("Principal Component Analysis Results for individuals\n", "===================================================\n") res <- array(data="", dim=c(3,2), dimnames=list(1:3, c("Name", "Description"))) res[1, ] <- c("$coord", "Coordinates for the individuals") res[2, ] <- c("$cos2", "Cos2 for the individuals") res[3, ] <- c("$contrib", "contributions of the individuals") print(res[1:3,], ...) } else if(inherits(x, "pca_var")){ cat("Principal Component Analysis Results for variables\n", "===================================================\n") res <- array(data="", dim=c(4,2), dimnames=list(1:4, c("Name", "Description"))) res[1, ] <- c("$coord", "Coordinates for the variables") res[2, ] <- c("$cor", "Correlations between variables and dimensions") res[3, ] <- c("$cos2", "Cos2 for the variables") res[4, ] <- c("$contrib", "contributions of the variables") print(res[1:4,]) } else if(inherits(x, "ca_row")){ cat("Correspondence Analysis - Results for rows\n", "===================================================\n") res <- array(data="", dim=c(4,2), dimnames=list(1:4, c("Name", "Description"))) res[1, ] <- c("$coord", "Coordinates for the rows") res[2, ] <- c("$cos2", "Cos2 for the rows") res[3, ] <- c("$contrib", "contributions of the rows") res[4, ] <- c("$inertia", "Inertia of the rows") print(res[1:4,]) } else if(inherits(x, "ca_col")){ cat("Correspondence Analysis - Results for columns\n", "===================================================\n") res <- array(data="", dim=c(4,2), dimnames=list(1:4, c("Name", "Description"))) res[1, ] <- c("$coord", "Coordinates for the columns") res[2, ] <- c("$cos2", "Cos2 for the columns") res[3, ] <- c("$contrib", "contributions of the columns") res[4, ] <- c("$inertia", "Inertia of the columns") print(res[1:4,]) } else if(inherits(x, "mca_ind")){ cat("Multiple Correspondence Analysis Results for individuals\n", "===================================================\n") res <- array(data="", dim=c(3,2), dimnames=list(1:3, c("Name", "Description"))) res[1, ] <- c("$coord", "Coordinates for the individuals") res[2, ] <- c("$cos2", "Cos2 for the individuals") res[3, ] <- c("$contrib", "contributions of the individuals") print(res[1:3,], ...) } else if(inherits(x, "mca_var")){ cat("Multiple Correspondence Analysis Results for variables\n", "===================================================\n") res <- array(data="", dim=c(3,2), dimnames=list(1:3, c("Name", "Description"))) res[1, ] <- c("$coord", "Coordinates for categories") res[2, ] <- c("$cos2", "Cos2 for categories") res[3, ] <- c("$contrib", "contributions of categories") print(res[1:3,]) } else if(inherits(x, "famd")){ element <- attr(x, "element") # description cat("FAMD results for", element, "\n", "===================================================\n") res <- array(data="", dim=c(3,2), dimnames=list(1:3, c("Name", "Description"))) res[1, ] <- c("$coord", "Coordinates") res[2, ] <- c("$cos2", "Cos2, quality of representation") res[3, ] <- c("$contrib", "Contributions") print(res[1:3,]) } else if(inherits(x, "mfa")){ # result: nrows x 2 cols if(inherits(x, "mfa_ind")) nrows <- 6 else if(inherits(x, c("mfa_quali_var", "mfa_quanti_var", "mfa_partial_axes"))) nrows <-3 else if(inherits(x, "mfa_group")) nrows <- 4 res <- array(data="", dim = c(nrows, 2), dimnames=list(1:nrows, c("Name", "Description"))) # Element element <- attr(x, "element") # description cat("Multiple Factor Analysis results for", element, "\n", "===================================================\n") res[1, ] <- c("$coord", "Coordinates") res[2, ] <- c("$cos2", "Cos2, quality of representation") res[3, ] <- c("$contrib", "Contributions") if(inherits(x, "mfa_group")) res[4, ] <- c("$correlation", "Correlation between groups and principal dimensions") else if(inherits(x, "mfa_ind")){ res[4, ] <- c("$coord.partiel", "Partial coordinates") res[5, ] <- c("$within.inertia", "Within inertia") res[6, ] <- c("$within.partial.inertia", "Within partial inertia") } print(res[1:nrows,], ...) } else if(inherits(x, c("hmfa_ind", "hmfa_quali_var", "hmfa_quanti_var"))){ element <- attr(x, "element") # description cat("Hierarchical Multiple Factor Analysis results for", element, "\n", "===================================================\n") res <- array(data="", dim=c(3,2), dimnames=list(1:3, c("Name", "Description"))) res[1, ] <- c("$coord", "Coordinates") res[2, ] <- c("$cos2", "Cos2, quality of representation") res[3, ] <- c("$contrib", "Contributions") print(res[1:3,], ...) } # canonical correlation coefficients added else if(inherits(x, "hmfa_group")){ cat("Hierarchical Multiple Factor Analysis Results for groups\n", "===================================================\n") res <- array(data="", dim=c(4,2), dimnames=list(1:4, c("Name", "Description"))) res[1, ] <- c("$coord", "Coordinates for groups") res[4, ] <- c("$canonical", "canonical correlation coefficient") print(res[1:4,], ...) } } factoextra/R/dist.R0000644000176200001440000001017513144620011013675 0ustar liggesusers#' @include utilities.R NULL #' Enhanced Distance Matrix Computation and Visualization #' @description Clustering methods classify data samples into groups of similar #' objects. This process requires some methods for measuring the distance or #' the (dis)similarity between the observations. Read more: #' \href{http://www.sthda.com/english/wiki/clarifying-distance-measures-unsupervised-machine-learning}{STHDA #' website - clarifying distance measures.}. \itemize{ \item get_dist(): #' Computes a distance matrix between the rows of a data matrix. Compared to #' the standard \code{\link[stats]{dist}}() function, it supports #' correlation-based distance measures including "pearson", "kendall" and #' "spearman" methods. \item fviz_dist(): Visualizes a distance matrix } #' @param x a numeric matrix or a data frame. #' @param method the distance measure to be used. This must be one of #' "euclidean", "maximum", "manhattan", "canberra", "binary", "minkowski", #' "pearson", "spearman" or "kendall". #' @param stand logical value; default is FALSE. If TRUE, then the data will be #' standardized using the function scale(). Measurements are standardized for #' each variable (column), by subtracting the variable's mean value and #' dividing by the variable's standard deviation. #' @param ... other arguments to be passed to the function dist() when using get_dist(). #' @return \itemize{ \item get_dist(): returns an object of class "dist". \item #' fviz_dist(): returns a ggplot2 } #' @seealso \code{\link[stats]{dist}} #' @author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #' @examples #' data(USArrests) #' res.dist <- get_dist(USArrests, stand = TRUE, method = "pearson") #' #' fviz_dist(res.dist, #' gradient = list(low = "#00AFBB", mid = "white", high = "#FC4E07")) #' @name dist #' @rdname dist #' @export get_dist <- function(x, method = "euclidean", stand = FALSE, ...){ if(stand) x <- scale(x) if(method %in% c("pearson", "spearman", "kendall")){ res.cor <- stats::cor(t(x), method = method) res.dist <- stats::as.dist(1 - res.cor, ...) } else res.dist <- stats::dist(x, method = method, ...) res.dist } #' @param dist.obj an object of class "dist" as generated by the function dist() or get_dist(). #' @param order logical value. if TRUE the ordered dissimilarity image (ODI) is shown. #' @param show_labels logical value. If TRUE, the labels are displayed. #' @param lab_size the size of labels. #' @param gradient a list containing three elements specifying the colors for low, mid and high values in #' the ordered dissimilarity image. The element "mid" can take the value of NULL. #' @rdname dist #' @export fviz_dist<- function(dist.obj, order = TRUE, show_labels = TRUE, lab_size = NULL, gradient = list(low = "red", mid = "white", high = "blue") ) { if(!inherits(dist.obj, "dist")) stop("An object of class dist is required.") if(order){ res.hc <- stats::hclust(dist.obj, method = "ward.D2") dist.obj <- as.matrix(dist.obj)[res.hc$order, res.hc$order] } else dist.obj <- as.matrix(dist.obj) rownames(dist.obj ) <- colnames(dist.obj ) <- paste0(rownames(dist.obj), "-") d <- reshape2::melt(dist.obj) p <- ggplot(d, aes_string(x = "Var1", y = "Var2"))+ ggplot2::geom_tile(aes_string(fill="value")) if(is.null(gradient$mid)) p <- p + ggplot2::scale_fill_gradient(low=gradient$low, high=gradient$high) else p <- p + ggplot2::scale_fill_gradient2(midpoint=mean(dist.obj), low=gradient$low, mid=gradient$mid, high=gradient$high, space = "Lab") if(show_labels) p <- p + theme(axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text.x = element_text(angle = 45, hjust = 1, size = lab_size), axis.text.y = element_text(size = lab_size)) else p <- p + theme(axis.text = element_blank(), axis.ticks = element_blank(), axis.title.x = element_blank(), axis.title.y = element_blank()) return(p) }factoextra/R/decathlon2.R0000755000176200001440000000226213144620011014756 0ustar liggesusers#' Athletes' performance in decathlon #' #' @description #' Athletes' performance during two sporting meetings #' @name decathlon2 #' @docType data #' @usage data("decathlon2") #' @format #' A data frame with 27 observations on the following 13 variables. #' \describe{ #' \item{\code{X100m}}{a numeric vector} #' \item{\code{Long.jump}}{a numeric vector} #' \item{\code{Shot.put}}{a numeric vector} #' \item{\code{High.jump}}{a numeric vector} #' \item{\code{X400m}}{a numeric vector} #' \item{\code{X110m.hurdle}}{a numeric vector} #' \item{\code{Discus}}{a numeric vector} #' \item{\code{Pole.vault}}{a numeric vector} #' \item{\code{Javeline}}{a numeric vector} #' \item{\code{X1500m}}{a numeric vector} #' \item{\code{Rank}}{a numeric vector corresponding to the rank} #' \item{\code{Points}}{a numeric vector specifying the point obtained} #' \item{\code{Competition}}{a factor with levels \code{Decastar} \code{OlympicG}} #' } #' #' @source #' This data is a subset of decathlon data in FactoMineR package. #' @examples #' \donttest{ #' data(decathlon2) #' decathlon.active <- decathlon2[1:23, 1:10] #' res.pca <- prcomp(decathlon.active, scale = TRUE) #' fviz_pca_biplot(res.pca) #' } #' NULLfactoextra/R/eclust.R0000644000176200001440000001563313147035440014246 0ustar liggesusers#' @include utilities.R cluster_utilities.R dist.R fviz_cluster.R fviz_dend.R NULL #' Visual enhancement of clustering analysis #' #' @description Provides solution for enhancing the workflow of clustering #' analyses and ggplot2-based elegant data visualization. Read more: #' \href{http://www.sthda.com/english/wiki/visual-enhancement-of-clustering-analysis-unsupervised-machine-learning}{Visual enhancement of clustering analysis}. #' @param x numeric vector, data matrix or data frame #' @param FUNcluster a clustering function including "kmeans", "pam", "clara", #' "fanny", "hclust", "agnes" and "diana". Abbreviation is allowed. #' @param k the number of clusters to be generated. If NULL, the gap statistic #' is used to estimate the appropriate number of clusters. In the case of #' kmeans, k can be either the number of clusters, or a set of initial #' (distinct) cluster centers. #' @param k.max the maximum number of clusters to consider, must be at least #' two. #' @param stand logical value; default is FALSE. If TRUE, then the data will be #' standardized using the function scale(). Measurements are standardized for #' each variable (column), by subtracting the variable's mean value and #' dividing by the variable's standard deviation. #' @param graph logical value. If TRUE, cluster plot is displayed. #' @param hc_metric character string specifying the metric to be used for #' calculating dissimilarities between observations. Allowed values are those #' accepted by the function dist() [including "euclidean", "manhattan", #' "maximum", "canberra", "binary", "minkowski"] and correlation based #' distance measures ["pearson", "spearman" or "kendall"]. Used only when #' FUNcluster is a hierarchical clustering function such as one of "hclust", #' "agnes" or "diana". #' @param hc_method the agglomeration method to be used (?hclust): "ward.D", #' "ward.D2", "single", "complete", "average", ... #' @param gap_maxSE a list containing the parameters (method and SE.factor) for #' determining the location of the maximum of the gap statistic (Read the #' documentation ?cluster::maxSE). #' @param nboot integer, number of Monte Carlo ("bootstrap") samples. Used only #' for determining the number of clusters using gap statistic. #' @param verbose logical value. If TRUE, the result of progress is printed. #' @param seed integer used for seeding the random number generator. #' @param ... other arguments to be passed to FUNcluster. #' @return Returns an object of class "eclust" containing the result of the #' standard function used (e.g., kmeans, pam, hclust, agnes, diana, etc.). #' #' It includes also: \itemize{ \item cluster: the cluster assignement of #' observations after cutting the tree \item nbclust: the number of clusters #' \item silinfo: the silhouette information of observations, including #' $widths (silhouette width values of each observation), $clus.avg.widths #' (average silhouette width of each cluster) and $avg.width (average width of #' all clusters) \item size: the size of clusters \item data: a matrix #' containing the original or the standardized data (if stand = TRUE) } The #' "eclust" class has method for fviz_silhouette(), fviz_dend(), #' fviz_cluster(). #' @seealso \code{\link{fviz_silhouette}}, \code{\link{fviz_dend}}, #' \code{\link{fviz_cluster}} #' @author Alboukadel Kassambara \email{alboukadel.kassambara@@gmail.com} #' #' @examples #' # Load and scale data #' data("USArrests") #' df <- scale(USArrests) #' #' # Enhanced k-means clustering #' # nboot >= 500 is recommended #' res.km <- eclust(df, "kmeans", nboot = 2) #' # Silhouette plot #' fviz_silhouette(res.km) #' # Optimal number of clusters using gap statistics #' res.km$nbclust #' # Print result #' res.km #' #' \dontrun{ #' # Enhanced hierarchical clustering #' res.hc <- eclust(df, "hclust", nboot = 2) # compute hclust #' fviz_dend(res.hc) # dendrogam #' fviz_silhouette(res.hc) # silhouette plot #'} #' #' @name eclust #' @rdname eclust #' @export eclust <- function(x, FUNcluster = c("kmeans", "pam", "clara", "fanny", "hclust", "agnes", "diana"), k = NULL, k.max = 10, stand = FALSE, graph = TRUE, hc_metric = "euclidean", hc_method = "ward.D2", gap_maxSE = list(method = "firstSEmax", SE.factor = 1), nboot = 100, verbose = interactive(), seed = 123, ...) { set.seed(seed) data <- x if(stand) x <- scale(x) # Define the type of clustering FUNcluster <- match.arg(FUNcluster) fun_clust <- switch(FUNcluster, kmeans = stats::kmeans, pam = cluster::pam, clara = cluster::clara, fanny = cluster::fanny, diana = hcut, agnes = hcut, hclust = hcut ) if(!inherits(data, c("matrix", "data.frame")) ) graph = FALSE else if(ncol(data)< 2) graph = FALSE gap_stat <- NULL # Partitioning clustering # ++++++++++++++++++++++++++++++ clust <- list() if(FUNcluster %in% c("kmeans", "pam", "clara", "fanny")){ # Number of cluster if(is.null(k)) { gap <- .gap_stat(x, fun_clust, k.max = k.max, nboot = nboot, gap_maxSE = gap_maxSE, verbose = verbose, ...) k <- gap$k gap_stat <- gap$stat } clust <- fun_clust(x, k, ...) if(inherits(k, c("matrix", "data.frame"))) k <- nrow(k) # cluster centers are provided as k # Plot if(graph) { clust$clust_plot <- fviz_cluster(clust, x) print(clust$clust_plot + labs(title = paste0(toupper(FUNcluster), " Clustering"))) } if(k > 1) clust$silinfo <-.get_silinfo(clust$cluster, stats::dist(x)) } # Hierarchical clustering # ++++++++++++++++++++++++++++++++ else if(FUNcluster %in% c("hclust", "agnes", "diana")){ res.dist <- get_dist(x, method = hc_metric) # Number of cluster if(is.null(k)) { gap <- .gap_stat(x, fun_clust, k.max = k.max, nboot = nboot, gap_maxSE = gap_maxSE, verbose = verbose, diss = res.dist) k <- gap$k gap_stat <- gap$stat } res.hc <- hcut(res.dist, k, hc_func = FUNcluster, hc_method = hc_method ) clust <- res.hc if(graph) fviz_dend(clust, k) } clust$nbclust <- k clust$data <- x clust$gap_stat <- gap_stat class(clust) <- c(class(clust), "eclust") clust } # Compute gap stat and get k .gap_stat <- function(x, fun_clust, k.max = 10, nboot = 100, gap_maxSE = list(method = "firstmax", SE.factor = 1), verbose = interactive(), ...) { gap_stat <- cluster::clusGap(x, fun_clust, K.max = k.max, B = nboot, verbose = verbose, ...) gap <- gap_stat$Tab[, "gap"] se <- gap_stat$Tab[, "SE.sim"] k <- .maxSE(gap, se, method = gap_maxSE$method, SE.factor = gap_maxSE$SE.factor) list(stat = gap_stat, k = k) } factoextra/R/poison.R0000644000176200001440000000113113144620011014231 0ustar liggesusers#'Poison #' #'@description This data is a result from a survey carried out on children of #' primary school who suffered from food poisoning. They were asked about their #' symptoms and about what they ate. #'@name poison #'@docType data #'@usage data("poison") #'@format A data frame with 55 rows and 15 columns. #'@source #'This data is from FactoMineR package. #' #' @examples #' \donttest{ #' library(FactoMineR) #' data(poison) #' res.mca <- MCA(poison, quanti.sup = 1:2, quali.sup = c(3,4), #' graph = FALSE) #' fviz_mca_biplot(res.mca, repel = TRUE)+ #' theme_minimal() #' #' } #' NULLfactoextra/R/hkmeans.R0000644000176200001440000001114013217670635014373 0ustar liggesusers#' Hierarchical k-means clustering #' #' @description #' The final k-means clustering solution is very sensitive to the initial random selection #' of cluster centers. This function provides a solution using an hybrid approach by combining #' the hierarchical clustering and the k-means methods. The procedure is explained in "Details" section. Read more: #' \href{http://www.sthda.com/english/wiki/hybrid-hierarchical-k-means-clustering-for-optimizing-clustering-outputs-unsupervised-machine-learning}{Hybrid hierarchical k-means clustering for optimizing clustering outputs}. #' \itemize{ #' \item hkmeans(): compute hierarchical k-means clustering #' \item print.hkmeans(): prints the result of hkmeans #' \item hkmeans_tree(): plots the initial dendrogram #' } #' #' @param x a numeric matrix, data frame or vector #' @param k the number of clusters to be generated #' @param hc.metric the distance measure to be used. Possible values are "euclidean", "maximum", "manhattan", #' "canberra", "binary" or "minkowski" (see ?dist). #' @param hc.method the agglomeration method to be used. Possible values include "ward.D", "ward.D2", "single", #' "complete", "average", "mcquitty", "median"or "centroid" (see ?hclust). #' @param iter.max the maximum number of iterations allowed for k-means. #' @param km.algorithm the algorithm to be used for kmeans (see ?kmeans). #' @details #' The procedure is as follow: #' #' 1. Compute hierarchical clustering #' #' 2. Cut the tree in k-clusters #' #' 3. compute the center (i.e the mean) of each cluster #' #' 4. Do k-means by using the set of cluster centers (defined in step 3) as the initial cluster centers. Optimize the clustering. #' #' This means that the final optimized partitioning obtained at step 4 might be different from the initial partitioning obtained at step 2. #' Consider mainly the result displayed by \code{fviz_cluster()}. #' #' @return hkmeans returns an object of class "hkmeans" containing the following components: #' \itemize{ #' \item The elements returned by the standard function kmeans() (see ?kmeans) #' \item data: the data used for the analysis #' \item hclust: an object of class "hclust" generated by the function hclust() #' } #' @examples #' \donttest{ #' # Load data #' data(USArrests) #' # Scale the data #' df <- scale(USArrests) #' #' # Compute hierarchical k-means clustering #' res.hk <-hkmeans(df, 4) #' #' # Elements returned by hkmeans() #' names(res.hk) #' #' # Print the results #' res.hk #' #' # Visualize the tree #' hkmeans_tree(res.hk, cex = 0.6) #' # or use this #' fviz_dend(res.hk, cex = 0.6) #' #' #' # Visualize the hkmeans final clusters #' fviz_cluster(res.hk, frame.type = "norm", frame.level = 0.68) #' } #' @name hkmeans #' @rdname hkmeans #' @export hkmeans <- function(x, k, hc.metric = "euclidean", hc.method = "ward.D2", iter.max = 10, km.algorithm = "Hartigan-Wong"){ res.hc <- stats::hclust(stats::dist(x, method = hc.metric), method = hc.method) grp <- stats::cutree(res.hc, k = k) clus.centers <- stats::aggregate(x, list(grp), mean)[, -1] res.km <- kmeans(x, centers = clus.centers, iter.max = iter.max, algorithm = km.algorithm) class(res.km) <- "hkmeans" res.km$data <- x res.km$hclust <- res.hc res.km } #' @rdname hkmeans #' @export print.hkmeans <- function (x, ...) { cat("Hierarchical K-means clustering with ", length(x$size), " clusters of sizes ", paste(x$size, collapse = ", "), "\n", sep = "") cat("\nCluster means:\n") print(x$centers, ...) cat("\nClustering vector:\n") print(x$cluster, ...) cat("\nWithin cluster sum of squares by cluster:\n") print(x$withinss, ...) ratio <- sprintf(" (between_SS / total_SS = %5.1f %%)\n", 100 * x$betweenss/x$totss) cat(sub(".", getOption("OutDec"), ratio, fixed = TRUE), "Available components:\n", sep = "\n") print(names(x)) if (!is.null(x$ifault) && x$ifault == 2L) cat("Warning: did *not* converge in specified number of iterations\n") invisible(x) } #' @rdname hkmeans #' @param hkmeans an object of class hkmeans (returned by the function hkmeans()) #' @param rect.col Vector with border colors for the rectangles around clusters in dendrogram #' @param ... others arguments to be passed to the function plot.hclust(); (see ? plot.hclust) #' @export hkmeans_tree <- function(hkmeans, rect.col = NULL, ...) { res.hk <- hkmeans if(is.null(rect.col)) rect.col <- unique(res.hk$cluster) plot(res.hk$hclust, hang = -1, sub = "", xlab = "", ...) k <- length(unique(res.hk$cluster)) stats::rect.hclust(res.hk$hclust, k = k, border = rect.col) } factoextra/NEWS.md0000644000176200001440000002514513641172476013532 0ustar liggesusers# factoextra 1.0.7 ## Minor changes - Adding stringsAsFactors = TRUE to the relevant calls to data.frame to anticipate compatibility with future R 4.0.0 # factoextra 1.0.6 ## Minor changes - the function `fviz_nbclust()` checks now whether the argument `FUNcluster` is correctly specified ([@robsalasco, #82](https://github.com/kassambara/factoextra/issues/82)). - Clusters are now correctly order in `fviz_mclust_bic()` ([@hpsprecher, #84](https://github.com/kassambara/factoextra/issues/84)) - New arguments `outlier.pointsize` and `outlier.labelsize` added in `fviz_cluster()` to customize outliers detected with DBSCAN ([@choonghyunryu, #74](https://github.com/kassambara/factoextra/issues/74)) - `pointsize` in the function `fviz()` canbe now a continuous variable. ## Bug fixes - Now `hkmeans()` takes other distance metrics ([@santsang, #52](https://github.com/kassambara/factoextra/issues/52)) - `get_clust_tendency()` updated to return the correct value of hopkins statistics as explained at: https://www.datanovia.com/en/lessons/assessing-clustering-tendency/ # factoextra 1.0.5 ## Bug fixes - Now, the argument `invisible` works properly in the function `fviz_pca_biplot()`([@ginolhac, #26](https://github.com/kassambara/factoextra/issues/26)). - The function `fviz_dend()` now works for an object of class `diana` ([@qfazille, #30](https://github.com/kassambara/factoextra/issues/30)). - Now, `fviz_cluster()` supports HCPC results ([@famuvie, #34](https://github.com/kassambara/factoextra/issues/34)). ## Minor changes - New argument `mean.point` in the function `fviz()`. logical value. If TRUE, group mean points are added to the plot. - Now, PCA correlation circles have fixed coordinates so they don't appear as ellipses ([@scoavoux, #38](https://github.com/kassambara/factoextra/pull/38). - New argument `fill.ind` and `fill.var` added in `fviz_pca()` ([@ginolhac, #27](https://github.com/kassambara/factoextra/issues/27) and [@Confurious, #42](https://github.com/kassambara/factoextra/issues/42)). - New arguments `geom.ind` and `geom.var` in `fviz_pca_xxx()` and `fviz_mca_xxx()` functions to have more controls on the individuals/variables geometry in the functions `fviz_pca_biplot()` and `fviz_mca_biplot()` ([@Confurious, #42](https://github.com/kassambara/factoextra/issues/42)). - New arguments `geom.row` and `geom.col` in `fviz_ca_xxx()` functions to have more controls on the individuals/variables geometry in the function `fviz_ca_biplot()` ([@Confurious, #42](https://github.com/kassambara/factoextra/issues/42)). - New argument `gradient.cols` in `fviz_pca_biplot()` - New argument `àxes` in `fviz_cluster`() to specify the dimension to plot. - New argument `circlesize` in the function `fviz()` to change the size of the variable correlation circle size. - It's now possible to color individuals using a custom continuous variable ([#29](https://github.com/kassambara/factoextra/issues/29)). This is done using the argument **col.ind**. ```r library(factoextra) data(iris) res.pca <- prcomp(iris[, -5], scale = TRUE) # Visualize and color by a custom continuous variable fviz_pca_ind(res.pca, col.ind = iris$Sepal.Length, legend.title = "Sepal.Length") ``` - factoextra can now handle Japanese characters by using the argument font.family = "HiraKakuProN-W3"` ([#31](https://github.com/kassambara/factoextra/issues/31)). For example: ```r library(FactoMineR) library(factoextra) .tbl2.1 <- matrix(c(395, 2456,1758, 147, 153, 916, 694, 327, 1347),byrow=T,3,3) dimnames(.tbl2.1) <- list(地域=c("オスロ","中部地域","北部地域"), 犯罪=c("強盗", "詐欺","破壊") ) res.CA <- CA(.tbl2.1,graph=FALSE) fviz_ca_biplot(res.CA,map="simbiplot",title="simbiplot", font.family = "HiraKakuProN-W3") ``` # factoextra 1.0.4 ## New features - New function `fviz_mclust()` for plotting model-based clustering using ggplot2. - New function `fviz()`: Generic function to create a scatter plot of multivariate analyse outputs, including PCA, CA and MCA, MFA, ... - New functions `fviz_mfa_var()` and `fviz_hmfa_var()` for plotting MFA and HMFA variables, respectively. - New function `get_mfa_var()`: Extract the results for variables (quantitatives, qualitatives and groups). Deprecated functions: `get_mfa_var_quanti()`, `get_mfa_var_quali()` and `get_mfa_group()`. - New functions added for extracting and visualizing the results of FAMD (factor analysis of mixed data): `get_famd_ind()`, `get_famd_var()`, `fviz_famd_ind()` and `fviz_famd_var()`. - Now `fviz_dend()` returns a ggplot. It can be used to plot circular dendrograms and phylogenic-like trees. Additionnally, it supports an object of class HCPC (from FactoMineR). - New arguments in `fviz_cluster()`: - main, xlab, ylab in `fviz_cluster()`: to change the plot main title and axis labels. - ellipse, ellipse.type, ellipse.level and ellipse.alpha - choose.vars: a character vector containing variables to be considered for plotting. - New argument pointshape in `fviz_pca()`. When you use habillage, point shapes change automatically by groups. To avoid this behaviour use for example pointshape = 19 in combination with habillage ([@raynamharris, #15](https://github.com/kassambara/factoextra/issues/20)). - New argument repel in `fviz_add()`. - New argument gradient.cols in fviz_*() functions. - Support for the ExPosition package added (epCA, epPCA, epMCA) ([#23](https://github.com/kassambara/factoextra/issues/23)) ## Minor changing - Check point added in the function `fviz_nbclust()` to make sure that x is an object of class data.frame or matrix ([Jakub Nowosad, #15](https://github.com/kassambara/factoextra/issues/15)). - The following arguments are deprecated in `fviz_cluster`(): title, frame, frame.type, frame.level, frame.alpha. Now, use main, ellipse, ellipse.type, ellipse.level and ellipse.alpha instead. - Now, by default, the function `fviz_cluster`() doesn't show cluster mean points for an object of class PAM and CLARA, when the argument show.clust.cent is missing . This is because cluster centers are medoids in the case of PAM and CLARA but not means. However, user can force the function to display the mean points by using the argument show.clust.cent = TRUE. - The argument jitter is deprecated; use repel = TRUE instead, to avoid overlapping of labels. - New argument "sub" in `fviz_dend()` for adding a subtitle to the dendrogram. If NULL, the method used hierarchical clustering is shown. To remove the subtitle use sub = "". ## Bug fixes - Now `fviz_cluster()` can handle HCPC object obtained from MCA ([Alejandro Juarez-Escario, #13](https://github.com/kassambara/factoextra/pull/13)) - Now `fviz_ca_biplot()` reacts when repel = TRUE used - In `facto_summarize()`, now the contribution values computed for >=2 axes are in percentage ([#22](https://github.com/kassambara/factoextra/issues/22)) - `fviz_ca()` and `fviz_mca()` now work with the latest version of ade4 v1.7-5 ([#24](https://github.com/kassambara/factoextra/issues/24)) # factoextra 1.0.3 ## NEW FEATURES * New fviz_mfa function to plot MFA individuals, partial individuals, quantitive variables, categorical variables, groups relationship square and partial axes ([@inventionate, #4](https://github.com/kassambara/factoextra/pull/4)). * New fviz_hmfa function to plot HMFA individuals, quantitive variables, categorical variables and groups relationship square ([@inventionate, #4](https://github.com/kassambara/factoextra/pull/4)). * New get_mfa and get_hmfa function ([@inventionate, #4](https://github.com/kassambara/factoextra/pull/4)). * fviz_ca, fviz_pca, fviz_mca, fviz_mfa and fviz_hmfa ggrepel support ([@inventionate, #4](https://github.com/kassambara/factoextra/pull/4)). * Updated fviz_summarize, eigenvalue, fviz_contrib and fviz_cos2 functions, to compute FactoMineR MFA and HMFA results ([@inventionate, #4](https://github.com/kassambara/factoextra/pull/4)). * fviz_cluster() added. This function can be used to visualize the outputs of clustering methods including: kmeans() [stats package]; pam(), clara(), fanny() [cluster package]; dbscan() [fpc package]; Mclust() [mclust package]; HCPC() [FactoMineR package]; hkmeans() [factoextra]. * fviz_silhouette() added. Draws the result of cluster silhouette analyses computed using the function silhouette()[cluster package] * fviz_nbclust(): Dertemines and visualize the optimal number of clusters * fviz_gap_stat(): Visualize the gap statistic generated by the function clusGap() [in cluster package] * hcut(): Computes hierarchical clustering and cut the tree into k clusters. * hkmeans(): Hierarchical k-means clustering. Hybrid approach to avoid the initial random selection of cluster centers. * get_clust_tendency(): Assessing clustering tendency * fviz_dend(): Enhanced visualization of dendrogram * eclust(): Visual enhancement of clustering analysis * get_dist() and fviz_dist(): Enhanced Distance Matrix Computation and Visualization * eclust(): Visual enhancement of clustering analysis ## MINOR CHANGING * Require R >= 3.1.0 * A dataset named "multishapes" has been added. It contains clusters of multiple shapes. Useful for comparing density-based clustering and partitioning methods such as k-means * The argument jitter is added to the functions fviz_pca(), fviz_mca() and fviz_ca() and fviz_cluster() in order to reduce overplotting of points and texts * The functions fviz_*() now use ggplot2::stat_ellipse() for drawing ellipses. ## BUG FIXES - Unknown parameters "shape" removed from geom_text ([@bdboy, #5](https://github.com/kassambara/factoextra/issues/5)) # factoextra 1.0.2 ## NEW FEATURES * Visualization of Correspondence Analysis outputs from different R packages (FactoMineR, ca, ade4, MASS) - fviz_ca_row() - fviz_ca_col() - fviz_ca_biplot() * Extract results from CA output - get_ca_row() - get_ca_col() - get_ca() * Visualize the cos2 and the contributions of rows/columns. The functions can handle the output of PCA, CA and MCA - fviz_cos2() - fviz_contrib() * Sumarize the results of PCA, CA, MCA - facto_summarize() ## DEPRECATED FUNCTION * fviz_pca_contrib() is dreprecated -> use fviz_contrib() ## MINOR CHANGING * fviz_add: "text" are included in the allowed values for the argument geom * fviz_screeplot: the X parameter can be also an object of class ca [ca], coa [ade4], correspondence [MASS] * get_eigenvalue: X parameters and description changed * get_pca_ind: the argument data are no longer required # factoextra 1.0.1 ## FEATURES * Easy to use functions to extract and visualize the output of principal component analysis.factoextra/MD50000644000176200001440000001260713641202602012724 0ustar liggesusers059344628aaca00e4bb81de5a339a5f2 *DESCRIPTION 3f95941ed1da69d1ab556ad48a227f8c *NAMESPACE 50b73522b9e3974eedd97ae1faf0e52e *NEWS.md 64d0c34e5da610411985064e3d4becd9 *R/cluster_utilities.R 1eda24086140cf0d2092921c63681eb2 *R/decathlon2.R 3e45b1d24ffac752016939a5de04388c *R/deprecated.R 471f087fe3515515531ade1ebd668c65 *R/dist.R f2d166dff2be287069b17c6a81427421 *R/eclust.R c9ced3486d335efc68523db1d36868ac *R/eigenvalue.R ea93bf9d1f0e4d84b8d2ebef7b557228 *R/facto_summarize.R 8265cf5e50e8bcbfea9d7362dd035536 *R/fviz.R b278ae33e8d169bb6a5da5adb41ac255 *R/fviz_add.R 4df40e909f7ee730d90e74e53f89ea61 *R/fviz_ca.R 395b7340138bdfff728222d9b5b1ca53 *R/fviz_cluster.R 70e07ef4b7b26ac44c7369ae6e836ec7 *R/fviz_contrib.R 4fe3c0d5b72d1cb104c9a0313c0de263 *R/fviz_cos2.R c6a9e588a9d919021af7c44ece70da7f *R/fviz_dend.R 1cf70a70e917a418c61abac09e44d98c *R/fviz_ellipses.R 0b9f77d301514c1b3a244dd8bc94252f *R/fviz_famd.R c49ede5de9e49df233ad053e65b25abf *R/fviz_hmfa.R 1033986b6e1f5f3401f83eded5f8c82b *R/fviz_mca.R 419af975878bafc4ab5df06fb4642e1d *R/fviz_mclust.R f55a4e4d85e4c066270d7c6febfa1b4b *R/fviz_mfa.R ee39028a8f51f462a5085d7ce9ef7ee2 *R/fviz_nbclust.R 27b7d92b8788f3b6dc4845940cda3562 *R/fviz_pca.R 4bc15a4529bc18411d664f60e44087fc *R/fviz_silhouette.R 1c2e0e72889d6ae53a316d25113bea82 *R/get_ca.R f65b7648a55bf0bfa8d93c16d7d19d1a *R/get_clust_tendency.R 15155f062d0f8121f7063ca01c226176 *R/get_famd.R 43d9ee664e37f919ebda4f3d71333d5b *R/get_hmfa.R 4d84ff81da38283daf27b93ea2554132 *R/get_mca.R 726341e40b01f484e0f4036732e11559 *R/get_mfa.R 4147c40bc32e0964bcf13db13cf1b666 *R/get_pca.R 5fc8b925a5379a7117fa07a476804547 *R/hcut.R 6c81bb918183f1d591ea19928894a9f6 *R/hkmeans.R 7bc92b5e47962d359eb856597aca45b3 *R/housetasks.R a0cb42d002186e4d5b6104e1136a8bff *R/multishapes.R 1b7fdf3bd4d3dea64fd2927a5f6e7998 *R/poison.R df4b45a50b02557db4570d2571d858b3 *R/print.factoextra.R 7d0faf30dddfb1de40258eea13b37322 *R/utilities.R dfb6233b8f4d5a58dcb0900710a3eeea *R/zzz.R 13a54431d6516fd0211cd2fddfb9ae01 *README.md fd6f47859bb3f5735afcbdac56f742a4 *data/decathlon2.rda 20374268603bfdf7c5cde5fb8d814893 *data/housetasks.rda 796a8ea8558430e0314c6587e84924ca *data/multishapes.rda bbe64b462deb30ed0a803986e43e452b *data/poison.rda 8a08d4986a1b60e0b1530fb363f9aaa8 *man/decathlon2.Rd 2c38326ff9b28c818666362a398220be *man/deprecated.Rd 4e90427d880f387011d853945603e631 *man/dist.Rd d1e3df7116c18bc133001aee0e298cfb *man/eclust.Rd 8bb3cc517ecac74e1f090132ad1b4518 *man/eigenvalue.Rd 5f535272f68d3e9a2cc30cd36e3faa4a *man/facto_summarize.Rd e00c5e7f7d76a3c96cc28282f96a2665 *man/fviz.Rd d97699a6602abb06e8a9b9a05913fb23 *man/fviz_add.Rd a026117ea7d322cb7d32389ce061175c *man/fviz_ca.Rd a240179c895b6cf87884e621b03c7abd *man/fviz_cluster.Rd b4b67b3c2242d1d99364f6b64757efa7 *man/fviz_contrib.Rd 83dedc23921129283234018a15028cb6 *man/fviz_cos2.Rd 8fa3fe78b8042aef653f62d5edce4546 *man/fviz_dend.Rd 743ff0887663009ff3cf9d102b839ff0 *man/fviz_ellipses.Rd 3eea117a00c5c7b733ea922742101e0d *man/fviz_famd.Rd bc4453cd8fb740e5a2eac0a696e5cf3f *man/fviz_hmfa.Rd 4c03afa20e5487ec5bfd987e93faf17f *man/fviz_mca.Rd c42137a9623f7f468ec8bf8d5d1c95b4 *man/fviz_mclust.Rd 05df681073e883b9afe12d207cc487b6 *man/fviz_mfa.Rd 000bf08d693c549f19a4c37c2f71f7d8 *man/fviz_nbclust.Rd 43fc8d915dd8d97ba100d948de956628 *man/fviz_pca.Rd 2df29156931678d2fbf9793f3bdbddb4 *man/fviz_silhouette.Rd b087a2084b8a0f53d882217a3851cf38 *man/get_ca.Rd 242127e6eb7eb2b4a92667b9792ea50e *man/get_clust_tendency.Rd acec16597f7b3cd1416c19ee9eb00d87 *man/get_famd.Rd 3869737b622a406991620f3cf42095d9 *man/get_hmfa.Rd 85c30023d6785dbd6ff7f1820f421f9f *man/get_mca.Rd 768125901bb69a97b4cbac7418259b9d *man/get_mfa.Rd 39d99be6e76b23d8f09a7b0d55972f82 *man/get_pca.Rd 22ba2adc62dba1db106e20fb191eef08 *man/hcut.Rd 11940fbbcb74672587ba0853db6930a9 *man/hkmeans.Rd 8d9d0e7787841b0354db76d07a34d4f9 *man/housetasks.Rd 8697017a24a16fa51da9887749a46617 *man/multishapes.Rd 3590446f23e1a2e3316556db7901b0d3 *man/poison.Rd 3deda376e0ffa008fadee517da63d81b *man/print.factoextra.Rd d1496be0f819b1520327752bc126ab8f *tools/README-correspondence-analysis-biplot-1.png bf5c9deb2b0dd139ff9738b6d27d8538 *tools/README-determine-the-number-of-clusters-gap-statistics-1.png ca054f92c40211d5f825f5b5b0bd0f19 *tools/README-hierarchical-clustering-1.png ea5f3d61ee52747a96b45de05bcde67c *tools/README-individuals-factor-map-color-by-groups-1.png 489c7e6e6aa9c01f3053f562e552a8f9 *tools/README-mca-biplot-1.png 29c9c6ab898db22e31ddbcd9332478c4 *tools/README-mca-graph-of-individuals-1.png 0ed0c9fd4c5152658ab9354c0175c6c4 *tools/README-mca-graph-variables-1.png bc93b8af07acc647e210ceaa26d06480 *tools/README-partitioning-clustering-1.png ad3cd77932beaab7e442ef28b42884d2 *tools/README-pca-eigenvalue-1.png efe0c608a3c2e1e0926224f0159f638f *tools/README-pca-variable-colors-by-contributions-1.png 0b8fbe1024cfad05adf1f7921637849a *tools/README-pca-variable-contributions-1.png 9e9703d31e1c0aba561442750f0c9a76 *tools/README-pca-variable-contributions-2.png ce8f857311c905fae455be8e57b4c1fa *tools/README-pca-variables-1.png d971c96c46bdb510e94b1406a5dff3f1 *tools/README-principal-component-analysis-data-mining-1.png c6db3a1db2e4e05f94c76102328936a2 *tools/README-principal-component-analysis-data-mining-2.png 54379e237b8383a5b59cf5d72a4d2f45 *tools/clustering-e1-cover.png 057b8f7ac9c5645ca3d9ecc3af89a975 *tools/factoextra-r-package.png a56ed23d1ce25660c588d8ac78531f61 *tools/multivariate-analysis-factoextra.png 33c79de022a7e10b006d0071cb625494 *tools/partitioning-clustering.png