#!/usr/bin/perl # drakupdate_fstab # Copyright (C) 2002-2008 Mandriva (pixel@mandriva.com) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. use lib qw(/usr/lib/libDrakX); use detect_devices; use security::level; use common; use fsedit; use lang; use any; use fs; $::isStandalone = 1; #- not using standalone.pm which generates too many logs for drakupdate_fstab purpose log::l("drakupdate_fstab called with @ARGV\n"); my ($debug, $verbose, $removed); my %args = ( '--auto' => \$::auto, '--debug' => \$debug, '--test' => \$::testing, '--verbose' => \$verbose, ); each_index { if ($args{$_}) { ${$args{$_}} = 1; splice @ARGV, $::i - $removed, 1; $removed++; } } @ARGV; my ($raw_action, $device_name) = @ARGV; my ($action) = $raw_action =~ /^--(add|del)/; @ARGV == 2 && $action or die "usage: drakupdate_fstab [--test] [--verbose] [--auto] [--add | --del] \n"; main($action, $device_name); sub device_name_to_entry { my ($name) = @_; $name =~ s|/dev/||; $name =~ /fd[01]/ && !$::auto and return { device => $name }; my @l = detect_devices::get(); if ($debug) { require Data::Dumper; output("/tmp/drakdump_devices-$action", Data::Dumper->Dump([ \@l ], [ qw($l) ])); } my $e; { unless ($e = find { $name eq $_->{device} } @l) { my ($prefix) = $name =~ m/^(.*?)\d*$/; $e = find { $prefix eq ($_->{prefix} || $_->{device}) } @l; $e->{device} = $name; } } $e->{media_type} = 'fd' if $name =~ /fd[01]/; $e; } sub set_options { my ($part) = @_; $part->{is_removable} = 1; } sub set_mount_point { my ($part, $fstab, $is_hd) = @_; my $mntpoint = $is_hd ? 'hd' : detect_devices::suggest_mount_point($part); $mntpoint = "/media/$mntpoint"; foreach ('', 2 .. 10) { next if fs::get::mntpoint2part("$mntpoint$_", $fstab); $part->{mntpoint} = "$mntpoint$_"; return 1; } 0; } sub main { my ($action, $device_name) = @_; my $device = device_name_to_entry($device_name); if ($device->{media_type} eq 'hd') { my $all_hds = fsedit::get_hds(); my $hd = find { fs::get::is_same_hd($_, $device) } fs::get::hds($all_hds); $hd or die "unable to find hd for $device->{device}"; my @parts = grep { !fsedit::isSwap($_) && fs::type::maybeFormatted($_) } partition_table::get_normal_parts($hd); configure_part($action, $_, 'hd') foreach @parts; } else { configure_part($action, $device, undef); } } sub configure_part { my ($action, $part, $is_hd) = @_; my $fstab_file = '/etc/fstab'; if (!$part) { print STDERR "Can not find device $device_name\n" if $::testing; return; } elsif ($::testing) { cp_af('/etc/fstab', $fstab_file = '/tmp/fstab'); } my $fstab = [ fs::read_fstab('', '/etc/fstab', 'keep_freq_passno', 'verbatim_credentials') ]; my ($existing_fstab_entries, $fstab_) = partition { fs::get::is_same_hd($_, $part) } @$fstab; if ($debug) { require Data::Dumper; output("/tmp/drakdump_entries-$action", Data::Dumper->Dump([ \@ARGV, $part, $fstab, $fstab_, $existing_fstab_entries ], [ qw($ARGV $part $fstab $fstab_ $existing_fstab_entries) ])); } if ($action eq 'add') { if (@$existing_fstab_entries) { print STDERR "Already in fstab\n" if $::testing; return; } set_mount_point($part, $fstab, $is_hd) or return; set_options($part); my ($line) = fs::prepare_write_fstab([$part]); if ($line) { append_to_file($fstab_file, $line); system("mount $part->{mntpoint}") if !$::testing && ($device_name =~ /^fd\d+/ || $is_hd); } if ($verbose) { print $part->{mntpoint}, " user\n"; } } else { if (!@$existing_fstab_entries) { print STDERR "Not found in fstab\n" if $::testing; return; } my ($s) = fs::prepare_write_fstab($fstab_, '', 'keep_smb_credentials'); output($fstab_file, $s); if ($verbose) { print "$_->{mntpoint}\n" foreach @$existing_fstab_entries; } } if ($::testing) { print "fstab would have changed:\n"; system("diff -u /etc/fstab $fstab_file"); } } t֏|ӝRe=&Dgpiz4D]0Ľqߞ1lSH)OX9B@}GK_|.&!=KJy?AVNS9֍Fchכ70UM-f Έ.z+͑QxuȂ|WGYMjVT 1ځǥ59@c(V-q)6[fh^0i?y 'R3z]gN*ڴx#cЋ3 p\/ \^_Ų/$rfɼ>:&Gu>?0Z kH7cCšVrگT,bקf`SK(oH`b+~.&\JX:v3/V\gAeV6шY=SبJt:YGx!j&6()C)Zcɑ8W%9u!ܚTjhmg h2ǡo*f#pQx?g`=BDs$< 0wk44)rkD\@I?+ۀ&-kϩ&<% 9iY\HinSpvgظ/9ܞU4j!ȇ$LE);Fn_ШMLfNu1Doڒ]^0烽}IL(Oˆ #hƠŒus]86s:ꪦ$UJ;7`s%GGAq%mK5@se=6ѧn<ՠKHҺh`q0[Ks7%džZuo䒑)6[$P:[7}R2'=pk# ;[ӔBmM~v'y3Sd7w'F+?\S넊&DT$. o4MN'@W$54vǎ%Ҡ@xBJ7Ĭd%?U%á5V LiK<4tV*8w$%zHI)i(14Yɠyq)hO8Uu1I,{mEqbtĔ>p3K@Ro Q~SƉ ¡KC){D%dOW"=SR/Q,vYGz tC7.#h}ayXW}iy an}\i6@=2D?NkS EIe$m>`u^1^ UY] T6[7{3Zyj# -?>1bFGC8$li h< g:Qa1lOe 2Jv~{g fݝj 4w=GXQ3 ]v=i}|q[Ӣ&&wҁ#9#۠OdQY~ԏ5?h#Sau;OPLiY/z&`W\iǣr޳I/ y&+QDe]FOMZxD]J$XG&srJ؎}j< }@͉֋ ϝ}%L]a7m= OWDi7܃׉JfHʊ9yg%]f,=,|z2#\ oDM5Y4/:Jo7;s3̜s.;;o9Qnk)$΁3!qiz5* h n;mexԔ49O~׿b##5SNQ^R@8*BFޛDĸq>]_GgCXIi~O[Vgo]}tSf}T*-fj͡:I ZʷNryRqVHa#"#83i݂^Z8u.*}Wǒ% dMӇCq-3سt],T*^=ު?2Ւګ;˚bŢ ͚}ZrC XDՈEG\dkx9[*ޅꪳ KH7-Xܬ'/9kf'Q6"\(K,i F4;/WylyQ3豤,7y͋!3V8HO9}~7˜`ya%b#Z :(&|p֨lo_OB4Sޘ[ΙgLg.r`*N=> Հ"\\{^H>NP ➨ئdz+e-5QnF–$LmK'4@C<$m``/kY<V(.Y+~ )zp{C*r)튦W b eI mcx^u= !;+a"Oc~d5G T&pGC</=zsԯvT ,W!1m('|@MO5FK&|B3iAUvW\m!_xW8qKNE V>YU l"JCm$UwһZ#` og%ix8u1;*5z2/F7G2k5iW[AhExuNXQ-[ yizXrU'nvc:(ƁӴZQ{[:T톬"UbAsg'ʉyr.g-xyq֞5:Ib1S6-&v23{mvVqUT[b#o0ˎht9+`.rS~ͻyx0`U  7hyl.3ԊNtd uʼn.| l6K(or2a85ذα[噑Or֨zmeXа軶&,&ÿ?w;M=˧Lذ"ݨrCΞ/yX|BdVOVu("-kF=1拂JjGjjT^m<CmbT#ڑ~桵Yn52IŬFjӥ pckX/"5b dczʱJ?2rn0̄xyJYTf.|r_r\՛R v9ըk{ +s ؞Sdbꓗ?a~`^Gְm?4ij<\+xϠf]}y2~sx ~kDs#c*$vnsndX4A&tˋʻɺ?™C3[OxS3VԎkЛa=3s()YBn!d^D?Ŀv^;ͤ825Unؚ#& ϨWIL0(߽ 'N|F IxӍXU1WL :Kcf$<(Kم@( 'gPmg2:KX<':߾97F 7aiT*ٟH Yh\j#SomZaJ-O9UiXF{<%'}S$ S|۫R🮬[9!ڝHU[80FUU&pZZ7((bE s:4("])(l m$" >2r?!:lZ\n?#;m`O !lfho=+FFoOzS/eRxp4%o`^JG:`1RL W-dgDm"(pm]a08gd [jKcXm*Dηth)3Q[оν (~[z21N@xjhB+W6=""~D j~CֶWd &9["]o 4vƛO;4$cdymq{\ktWj/= J 2U=KvBSL= T@ޅSx>[(Z h [L|Ú%\8X;[ҦP !>Q2qĪ!,N Ufg%'3@ˮ'qӳgN޷#yM+>x{ZS {*D|DxU8}^ gVjq:4Ya(EۧsMQHHB 0i䤜Rץ84ε')?LWg"-VRZ} "pxضf_#W+ףT|0\y&F942[o0fL4B}tB}Nu2?4Sfd7@2 Gm6 F<|ޞyPU?Td→\@c Yn4O}E"ʅ(զNxxQmx1I]Ej#K " ~q4X]waK5`R.t X yF s<}7cSyMҨ%iʟ\}=ϷpHYvgWU6%iQYG5 (C{-*':4H@jڿy%q&I_(F˚th}lc2> kfƤyDW[g7^fovކ#?hHoѳFGϨMx )ҭ1L_'*)-\!M]O75Xk!V:$xO1Y$E=(*QTK8?*vxtHRef[ T7"d:PdY*X)2z&Şy2Y~jXSSvLށ_34ـ0ʱz'`s@*/c>6nԼ69(AӂmtZҷ?Ҧ,d<|zB 뎯 a aJKѪ*9a=u|t'WBPy$R+ԟk+ȨN*VoL7x1)qQ}Q{6xOML(3!5s_ nW~ %Vf~@t-5:bӒ=p Fut]Fy>E/v{6Ґo$q: kN5V AʹazA qÐ"*YsmTBԓ̩r!)!u4νQJL>VE9fKQ& 􂠪Q|y<#7$CORsFEX FͫųG C$~ IEeX%d_ ߥ=,]MҶtdˎEl"UʶѲւ˦ۊPr)'jM-eeIѤ@K@6g}Dqʧ\j2>!XJ16\f6f?rg &/ il $V,R:/{Ǯ,_1aDe8qS!sOxa7I1F[̲.tS!\\@!_fR9j噠@avϭ} S <|LX]"πZq,ʲr{9Ek NHu}-}+=2leOcIm)۫oe sp9{!t)N_[ٹ5g4+PJ:] c[sW.R34Lzjv=6td}ICII6A,xf/A}7~|enxPfvAQVy}'^N )b$A%( RS%;yxNdӆ!u?uU ~|k/Nن|G6Rw"deҚk|NAas~?% 3J&/űeSz룽.Q<.= q/%0!23~sXliT p0`l"> F 0 k#{j>vy2Oth p#_>Ƚ 3#!cv8P])4?5 _:K%W>ͮ-fhrRۤF'Ef,|1"XQ5A;By2~ mbT؎s=Y~0ܰ}5 %H,A bsNYgx%MLaӻA3ot%.eSGAB)A$~Te/R5t "ՔdF!wQKdəQnqE^Z)$l@X6T71)b:/6g9(DA si[j=8"1W-"[/}}.@U\,sg5PI,o~GIn50A\~!X`tZu{_[V82S_{c"-?B Uɔ6~"d|t>cWJ+e)uaNj(;E+iW u bا~ϼ1߾DBfhcIɶ8W7ӽ(9_Qh~;j؀5bhaFb6DQOVwGgte8>x~+2/)O =C<@gg3cR'o \ `n'V @d0}Op8QXʫFy3MdpѹX2 4[Zf7VJ0j o;V҉=1HX߸/ċ-W)i3 [.s"Ay!,.W1;n6D}v27P1^rU-D7pt>B|/ gR+}[,uc {!& 0]˳r7!9.DHFB̭ݕ瀅6v]_Tff)P!K2A0Dsw&jZp29x ]:]mt`!h%ϣO /24L4/9W>Ր{>(ů %;rHTu,=hi ryiC ͗eu 0(icmPD&$> Acʏ?a[^DZ2ZFcLͰUuD2an~E㐮HtPww Qefa |401)VH+cV+H43󳰄)2_S⦵(XOڏwe+d+E0hPhkT`.V9n\m>&>w4?6XDΉ/"ۃٴ,[ ߀5ed x1S?#& /J@5>Q8~~’ZW6*<|P) 2^7AT}!\#ʍt}%bkfZY@|l^xO!՟:~]s[X|]J@=k_PUh(ëP't !tKEJ${YH*pB\S}HzQA/;fțIzHܠ ; ]@%Z7w2ajS2aLAPu%zk[*oތ Xqc[̙bbrRMf5"ЦX6>R(;csnq}ۡ@PƗ*V {¢6UgGLc2eqڽ̩614cm+o36qF']Ӻ9,/!WRv?kͿEWy%2L !e6l|ﮬ V7qL8G\l |@uk5C]XLWw]{aWs/v صm/WAmOMvls~ՈLz{u-l2eo',8rgQ L\q̛ qz2 {9EefmGXRޝ75 W"Fl==*#p|+ rB;dǪ xN0p<j1ek#m?Kn) ׎犉ͬ A4/ GF aI5#hcvb"*Lj%\X)OǾ[!Ä -E*'7W9|N3~KsB R}jߌZ ,w[Z̏#O eMbL9OL䒮c9#]42-,ȋ'w'Q!$R1a9-әW(? 3.*. s b g(Zg-AOHNؾK(l2yE*j.2%_u?76Z5h.<_ MCϭerā~SAWh?a iLbAЯ0 Nh6=a0s 3ŔpOaON#>spp S36 6)pc],`&kBܢ|Bq6`.Z$INS[^x4`x{b8VV$KCvtu/&ɝE J;eS T=2+9[ݽoNbś R%Vڥ{G˻a>I^"Ț+a`8M-v5ֶPo.EL3>10$kNx" \ߊWol6ZA;C \ h ԑJ@礨 \Nnvaw%- 3gAbxoCxۍp[L$bT!!t;l@cv г?eH&*/o~x [k\ŎHUTG i%eNWUa}n=l< jFQoEҍnҸΔdmbx ء|.fX6&f`YXUL) 0/쌙f(R2ET'PTØqƕ*pPHG@'Wܧ3[՞QHzb5lP򸀘K1R+znRTOVw$$Y ??i#hx]-َP)X^cT*NkvoU4 GXNFrEΔ)(ʧXYfv?9CA|n-U";XHxOyTOWA 0>[9GeW"_wxGSn[ s\"9C~b)2θrmS_'`33}sP"f>BR!?@}pBO-,wpW''E81Ga IҲ=e7jWX6.k v7[?wkD@.т!PIz\~ˀ良4;,U#vD(hؿnhRWnpsݍ Pcyќ|5.7,c:չ벆u/ဦ %z7_Fw^DdßX:T'oD=)ϽBIIF p(o~թ 8%c8:°j!JwW\v Aھ**r< zxKvL+I9]m7o {*B]"X.o?HmϠEA%]RN? k鲀wvSM{usӫ iȩx^"( p!X̄-L>%w2kۿcV:_R^)_ZJYvӭ'FBsb=\6Ÿ9$1k(*-bPMGn-rD Te97zHփ xNZDYtKZ5rB[ZMΒ+ܜ y:"ETՆ$c82<zLoff(*y%h>4߈&%7s|A8uz*X ^5:1]rIK _+z˰o+5so%7\븅zsw^2`rg܋!:Jʨp9Q 1).xC#呸'iRn8MF1-/;`z< 9bp @xo1=6vqK"<ؿ*h$ެެ`YZTW&>)< k&P 8## f:ou?<@(w6)%t~UU-WX]ޖ404l8zCXO;XU e#cn'P1gy)0vQ"d9B%7X/s'>jY*6yBqia}\SR0KSqU[Ufm<zYOEત^Ї޾3`[ZWGfխM/!=%Ͻ)G9lqA^;5ZQ=Z,% Ks%t &KȘt3) I>h^@@hgܓd\AɷG=Ty׸wF"ȹ푩6Q?0{-65x_K}z  +g OpYpuMI-[Yr>$ #anys g& o k To%2|bzo;Vg9Ҽ1υzZ/tos0,BB^7M4gpP$V.PCV|1E/@ xDv)mZiCb۩fC;25~$&J >me8ǩQ!1vB&ŝ7%1[/>}v*S4 ?{0T1qջ鯲5Ynhhҡ4B(-~RG5DVRBB8EZ(=޵)HRyD'|(?i۳_  kr myXn92ErRLTZs>$]`WCÆNQ{HFH#S ΐ\)sw n1) 3%wNy9ɓT?78%z; _Ή=S9:{@O wmĺEM l 1C%/$H>;rzA.ҧzX#a ݑI?.ssjr3pJމAI Q]3ڕ6%['p!2u:Ldl4i"1 C,?c+H=_v:?+[! "{r# ?X.Ľ[ z;A4 {SMZpjJiW[$J }kU=ЃqSP~7/„cNcrvIVq.? T[ft\-ȟ~cR aPQg@_R\]7jjjFOvA<}YJs#L]^i2F5װe]MM!>\wW @L^ބ"'ͷ.}~*qƆMzE Hdbć'#KH>jc @ `vZ`-؁P~Z-`u$X ٌ(*])z6`L>%c_ 2yZW, < s2`Jd4&R8,߱ ?7D|jEz#b{BՋ(AI:=UN}[ .%ֻ2So'L0߃iWzLF4H#ϵpBR=);$r/Ny!V(zݦ+ :,o綤(|f^fQ?LRt6r4>ŠC_(h`YQmuәxEΉb x#1/m«mѴG74I 3 x݄41]C "Z^,]"UصlW6L6$&)5-Nj)kMJ!s4 t,+0a],ovK7iBɨZ$1,Qv?JflvgG0ɱڍK65Mq9}Xx5{>=/piǮ+~mۍ! | ,ӌf:ԢwlS^,uyMn A24jR6􈌁'/#Z_\r=&hHCeԅu`w~ "-{oJAgVP׀=0pKZa lBNEgK Վ"pu{ggJn.CZ 0 (^,G= ,VCa*T܃Z)gr }CjǼ]ӅP]A{v5 S ԣK1e1l7fR)3UE=DL7@kވA I<뽱"Òrvk6̧pƝmXɻlHŭ̎ >hKᾊ"ø26W1,s_,psg-t0 ֱ\/$hKcY7Z9qѸBY2`Ņqs[ >\~ɅBs?*+fJęX #~P 0X3KԮ]n.skErXGUܭ& g.ҁZ\u:.nq<6:6i?=;7ᣬJ-{²i-];[mp)8t^ ʼn6ϟ'(:nwV1nѪWj@VK_4ú`VU+0?ИiWfgF=*_m>wOT[)KF r i)aҜXϲ9E:lJ&c*VB",=Ġw>H6_?BJ9+2u8q; :܋Z=z@)Ӛw i}#OaZD}R*nbDUKK$:d+0./' tK|4i`B*W;+.qx;a{;EORl-Zɣe崘^i׍eh JZ|P H섞nj}Y'" iٯlN"9"dœ<^Js"%/##TO0tQC]Vx2,N`K[H*Յ-7sw! >[6 sw^IlW{EFD_AmIY$ FIhGt\"܏'Ez4W_bQu0x,X{rߴU]);X S6l(kIf9. hз3^w dԯC@ϦHL\MTc-Mͷ[A&:5t7]FV*y,?Ib:'_)/,)}[7_^7Uv%Sm)[>'լ4֖Έ qo3w; x )K+wd.&t5U}o:dHh= bȀX?6 8 Rp üGc՝?! !e}kƶ#Uqbe޼롲 b"wԧnqg:a$Z|$mi߸_N$5c1 ]|UL-2KYppI\ !2_īʁCW.y// @_iґ8_1d zEpmz 4Ki /9ՙcD~L ʲktWB)(5l(+*؞hYVYW>Tҧ@&2#KƱ}RaH+i#n=2AaC.׏ˁ⿒ T 5ߢψ("+; 0L> 4"[Ry5t҇1|iInT[:bD Q1`(rysw vƬܗW[|Ŋ% bUq-AZt. K:@!5Z BЉbFr2[%D0հUlGa9\\bR X[~5 rOϐ5Wh;GgnmoJBl?O&rFRa롵jJ=^vko+˫arA[)~Q*dEvޒYeg<ʢ =u&R<n/3~`7ſ^JnF%HXӏv^>ND CQK7NltrҶՁ8TDŽcw=JG5ӕQ6AVy)YY2yBc8jǪ{|0l] 4ɧnjto!+sH'%OA?5$E~*$^WϻR{TS$ԅ8{x MN1ȨcNs6{Fo^r `c60~cęsmI0 V&ո lFj Xnx)LCz]Ќ'4eA9d$&"}TĠҶ F}J]I \:p '/1^kA&+9ӝgslGhs\|VP:>; *js1V|').aOzNs[9?g/썳2EvTtpXwSDQᑖv pLl_`ê)c T m]@踬c8KU)ud Lz8y E#᠐w8Ik<w>K_S?+0vR7ut  V[C26?8))tOm;;]b-6;Btlx2e3X|H < [dȴOJL8N#(]A7چ+4]O*4L hԁ7`!2t}?Vy СjɸPlD,=gWmH߄_pyB^kX#b;%F7Hn Yf)ɊPNFaiZq~,h}1}īq\)m~=;,fCqxw_n*6'r٨ j# ֻ֌G!SnJeƕ,E 2qH rÄqF5L` f[䳭ķoQesz爋6~!}AS9-7,kx#}I<9֕Z\7.̜b7&zKL([Y8w⑍~(5/C}={;ڙ1s&9J LL_k|@Eߛ,>B+"LO1} GYj@ѠeWeYا \([OiCcj@@ϐ`Nп[k(H]zV N6Њ:|E3ը[3hF|+!@gtsO61Hao9,6}4b P+wQ"E3&gk# W;cFHAkLR]4EH)ˢm܁=h@y]q+-&67G":nB D!5^/?ڬp ǎddbzE̐KgĜUBoO&I>zza~n @cĊQ Xjv!,߬k9"LObv( FTjyg\k,?~oHI׭%%q/} xqw$eΙo}=?ڢa3*gQHq/nZNs1 =w(szbE:e=o4 e) @SЎ`34'.š1q_+G oD#ZwxG[jhž¥ڝ s8tE#o{5/W*{9g$hpjV]< wvo!:pvA6P50SOzG! ?.m[";˛/mY!BE;\%I <ޗ0ҳ)'1o8(wruo/+ahUjS]fZT5]<8yZqz;e'v7Zg_eo"Ncu6?} HKp?yR+EO4AUUZ/*20 S9*wCsDRWzhl׮R; W*ؼ8Zl9G Pϒ+w Wi=C{z[g暺]T:}§(SI/] !བྷ#c:+l/ /lM6Y}qeb((LR!ޓԌValꋛ^u5$4 @gYdbi{6_OT}.5@qe3-'nΆf|%PwiyQܯF5u[=rw>ܠ; Gh+ @8x{ 5x#;V2]O<ϗ^ʀP"y .zqW67fIe^M q6}hƫ%q\hv&FƢ$PF bȭ2ܻ M(9|L6$j,1BzdW[-Y#vi ]}Yj( mKRWP6 _Ԗg^i/SZYUJvV:_-=Ie=R1 p'H9N,;jhBaL2$cM'p {.a5rKx522r.+~MC^(7|NCXŸFp&9Cסh]]ԡXY\?S>rv)qU2Q gք$2Ӂ!3ZH:oNܼ~D#g }|݋U ҵ&؃ƃiW3K2~ pS3Mxj2ԦrT|0+fPۭ!ˤ&vla GZ`s'LXjpuч4Q\a"Fe6)dg/ۊjof=jM%k6iE c}\6˜D.!vWY}qdˑ𕂊_ՙpCOq;~VqLQGf A#B/ԁ©ʼn %'0+Pȱ,S;Ɣ(Rԥ1IDkqv ArD7nǛAcy 0+glG}0:E1-Jiz[xVOCL[!d'5[nqLF*4Ba纠$F4 1|&'H˱Ok6P2X%F {ᗿ6Hd=4G v}8*'㈜w5)R{ #J*VWs n]/(OtZ?!%|EܷZH*YKsSxoo;څOgL^<r)iutARsdFv1p!E}h< A"b2t6xm4o7or򩵢LoN_z2S7[(;6E.Tޞ n_@e6 ־: ZM^?5Js{qu3‡%j*vPt?Gd,Tn" zaQRFhf] fJqmN{.ztidc]H@i6loFˊWh.@ 09c)T@SحG\f h!W&_)-~FDYCBeц74VA QĻOO[Ⱦw-%+}1t{2Uc6gf# 8qwB{WXl2<9 6cZw\bmH"Q,bDV5kS5ZlE&7XLio^dg]/(}f5xMeT7 +1׭J6H aeoNQyc6]XLK Za^z;R-\ [OͮlCP xUAPJ+[ۣ2MЩZ@rb:H] i2% aQ5kYL8e<8rFcXxrXmfoktbUM %1 4TiCS/ḗ7aϫ/.}gf":HOi-įa؍0%Q[C)2gA$Վ: !0`m f-Pn_-jPЌs8+-yi',3ZfvB }Bl|l +e|N%.=$*'ss/^1IYQOa2EWv;A ƩUbNBij7<@7f8~UCrbɇx`h@q$G{B@ULq:=J氇W\%bQ lTň.eP:VؓGcH{[eqxdڗ}tu,uT/S:QAOEL:Î&?> |T^% 4<1Q5} k{nˆzP4xtJs]έ BQd7QUe;Bܹ:tT"jbĦCg-$Z{p@7?Kj@߯l 8[0vu#/^C`LԶX]|Tk;bj=*Ua 'K+ir6R6Ȩ0ΒGZ?aj{0A%Fps$4?{dbf'DS( >Tш?8,: 5L4/Ţcx߯n[fd UPQcvmm'nN[㳩5`l꽓T{'Ly;e~nJ?ul<iH~rʯf.Pfx0 SũjI꺻F=a$ŒU ّJYBdfJ{m%;.),7.8YnSstL\`7^N4SڡUTc2Xs'U\SJh$[폁 '+t]:z!r Q̬VF+Is2ap@NK2U6wQ/|֫̐`By-a5ӊ, ϓ!kZs7_tAUPo#1HN1h=LX=jj[_{S }pSM*rXO}T|Y7'?s?(pK6=HӨ>U1Zv>1x=s\qwg< d7Llɾ Ap;X:WUGFD X;FJtw}t_ze5☊ڒVtqx?({Cqp7J#ܲeg5L6-9 "%=&U`?۲}HKtL [nVaAfclbQܿ&0F]؈*7v"er0I(ex^_LpaeDց" -hsFi1ж}&c m..[@uR E~W ~^cqWRx˟(7Xr>"Ϳ8 %Ey =>q]ܮ+ß:1,m#Ius+P 0t`-32o٧sE 9?{z;oVbn|Ah֮/OZ?j#bLcy >WIՂ~yIϮ ds*$>cT {QԷnmXeGQTZ8$gGJmNë\ֆI(jVbcV`G45a15mot6mAO> +Ҫ^}&`vdG Fϲ̆V7q 8@ Mއ,UmӀGPxfSK^u&)v](E鶑5 ֗OA*h+MB@Yo j$$%h}R}&-1Jy L.`ݾ$ &G΀$QprwE u= Y[fydDtZW׾̙É~"pB3Ӭ*<Ͼ] s‡54!a`׃ 88̾ɣhGN.Y5 .x0a2;IG@!AF=j6oQruZFoq  -EE?dPr/41 _)D )`3(rdWCVvZAH9|G2Czސ -jkvR7Wԛ>[WNh~X4K2GhM*vdh$@-&ڷ  M k v9G@5"go} `n$qFa(wzW*Vp{E^}.ėkC] y^{Wv7q}r9/~Ώ},x͌KmYt <>ΌHfpY`%ZX( .B-m0 B rPx!xÒt*^tஶHޕ<﹀f/heƉ;w{S6H'}R㣻V: 'Q+~D`;z9ۜP$N 91v'LEwJ.YӅ"H8"oW{=GZJ+wy/o:[W}uh #O1i mL~Ӕ3!% z(\$\)X^n7" Y3ov!F3yD`jX@kVƫݚ; ^X"uU Fqkp_*X&\`T_ <:\)G G3=LP+3刔glp0'qPiKqS|'Ble{*k3LfC>ׂ/"Rܿ O(BpJK ]3M6;e얪<~aıxgK Y&+T-W¬ k0 }!Usxtׅ!~{Tq(pѴkOa#JuIKapIgӼz\dc08tv6OЍϽ:.=V-,rPé_u.BTۋ sզ8OAm7dZf4Z-9rS!ux"KGRZ~kRtՑ}>BBkK5{aNivhnO7x{Y.-?f@-?5!gh+}= VTo !0P5\_Z./awq)#윚0Y5;{£/@ nl߮N Mۊ٤Gz7i9nȢ3ABN&w|nHV*u@vv̸ P*Erxy=uB>7#M,^Bz(w1aȆh9?Q)/뚻-H/>]T/\ F5y1_o#:BrpΑsql7e#4d1gD3TCڳ9UAըe0iK>, -Ƅ@>SޢմTdC>N DuwE I^Jh9 &Q6p6m &u)'|j ,^L[96rJ -Q4.Ě ggj3%k8m8WTh}cbFրح=&g(2_,pqΈӆУx1B03Y3Ҫ)sVɵ?٘zoZ ҡb!ý_A)rsM>^,w:2CvH'-xEW-U+4ݗI8jX|I_Y]ҦQsqk;dRJ]۝&3&b`ݴ붺ݷ,H;"Ȅ:=[`:SLEimK">{ c%}4Z-a @EEl`ț`<|w av /Dm|/39խ/4Bq5ʅ]ĨmaadU5:*^:(* Zxi")T@; IYB`@u"r$$W\ 9.=չ?-8,y83z M9kҼDBZLE/},/OD!D P~dF~J]f|âpN 40t_ l Js0!IJ>.!;n V޽B<&[>́ `Њ{\^Y Jӫ,&@ZNam[6 2y7GI0O ㋹قxębXٮW`8B=Gn[ѡȭФ i?S7I-WMDj7y`̯*!4ε9R(b$-rHCXr=qnxm&y(Dd=;" ϤS -ӳZߙs`"|i4CE` u#O:nX<k'#؃@t?ˑj|r!iq u/`|AcKI]`+# Se]&^2(/;F̂_T UT!$!͖#T p-LOG^O;Oj=r@UޗnUS LP+i\:~Ne)l`Lady^a'&0H唘UI|ydA pVFvWm':.#"(ڬQBOJ!*pgfd ]C| }gdJR l$a/G|2p3ʚHv`~nrancſ(%6K$.Y{y??kT>">Lʿ> rJ5$(ATxcvQDv.+f}fظ ڢon1/1~GhWzl x_4"|Q5Ǽ+ƔvCP%*_A{PbQaAgW.r^AZ,`Zc4f°7@ӬۏÂ[A!jT861SٙǓl {!Jj|XN!Q. ;snbN 8' r|bejc⛊Rا'ɘPmHL/aֱ+$3^DR$wEKK7뚝"r;V(<60 0==] #!K@}]d~Zµ@Քk#M4s(=*[d].B9AkU: 'y27rD* ɡKlYX >⫓]==zD7Rewx*;Q' }>_~Gw^wZ/\FVh:%2h/s\ZP/\`BZDZ*p@Ǔ9I/<ې$V3Ao r;F' ۵u!N:GXD8QvhX 9>ś~Y0lUSnvӇx]Hq疈h7xU ڗGM |pU70k-ԟ\CtCup-IVqeOiC*)(ǽf) , ]h&vaQe09p#{ /fݐ/81kTPM M`~JNF`IX$uBU6Q]:.7MN>o{<%^}Rg>d4\xKwKȻM$`L7lHN s# *4=@k#eu,ztDս"#p 9{U S w :\VgEVG %/[޻g-(CBGZ{rd/ .( .[fݏWYWWDdL[V4J`.alޣ6z$x׹|O"Iϴε6DSq wʼnvrlIsk_Q2f_R?%3dj%#nUP@!޴y?BU{T-Ȯ mP! ׀9hȄ\$ hڷ*|x^ns߈GPdőbǥc9w b5.(~u`LKEKL*ѰZ܂;qڐ Ope'_<0[vXK,z\fs ruܜpɞ2/|*e9`W@pהJO{3,v)}N^dƐטmڭ D3:s2D:^pE/Pd3]t&:{0/hE'Byx0wFmQ~+쉕h:SPNAuASS7b:: ju jx ߢ2fڣ.iuԅ\ U< G- 6u˷̖٧Yċ6KӢG;^R!mq pi=zC7?o+#¨oiYQEezOwz<1y¨P:M!pd͒:q41q˱l$2w&:5m{Yݘ3W:B]յf 8tmCH p`Et03D6!@`c,؟:x{5yXcm-7LF_v`?#a aId8CLH6F, lO[n,!1硰p8J5|Ѥ/F )oF)zMPS*p,Y$˲{| {mꌥd´PA4w]`F%cА76ٓ `-p 7w*ϯE$2ێD{Vۊ)oMŬ!X}='ׇێ YyQC免_G+lދOPIe{O~SNJ TB"üP?'5%g{`6t% x1?H$=4&kаR[/4'{5\P'4'<"K?g,{s2_XϤIz陪nTy@2:{yY p*wOHxW.}D&#ǧշ Q: +F%W'<:.G&I]`2mR "q5 FzVH#7[=%ؽ8?# ,,jYm]Zt8 6uͶ7tSImG}gc!*8G^*42n 7O뀅.!CCTmŭ㉸upS 1Z͜\vI79Tk<SywϝVCaإZz.QwZaskn,50K%G (#q4CKan! 1 fO/6aIrs"+(DgC!N?6@, A37ؽC HU$RD+2[x f  DU"T&HdR{nĈA l7F7$Z-^ʜOߚkt=5| ĀL+(tOZgX{D?dGt |-3MR-6}Gx~\G}+L%?12SU`*dq11GE_6bQ8_ɮȬuLvЄw!ڨٖ.nKA~z%f~m.wőr4Ov,IHx:1rT 9[3r>lRwU6ف j/nq~Bf!2X fd MFVéy%/[ ~$?*Ib6үno) p]QYA^e^<*\]n\/>,pB%oIdbd9\Kh=H(m &_q^9|V~ܿY)gP16{}ʑA1_e|;`m<]5?KiN㙶\| `w "z#nϹ$}YgۅbrJgם&[F|EPʂ8=#V7E߯mv bi'WYK_]ND6DCGǜEĆ'zrhrFjLo݌x$6K.)b6ci =Gi_)؈$ړRTLǗP}WKcV>Ak%z!kAw)]( @7-jƆ 4Fwf]F˛cܗFc|3uhe-Q4m|ut-FnDTN0i=ZS]gw~c'v"Cobl`:'$gWz`2Zf 4U dzU`w W8(]CO@ 8܎F-ƕ<`-()2 %(17cL/QqyDV쉶@&5lA:`f HV~6Wy1=<"/3=_j)u8mrLxg:*R?9Qa#U3{=_Y}i(~r BBΈ%70 3p٘ҖDmpqX(OMEY6 rkGj8 ɺ9`xMrԾ3CZu *IYs'ޜi ߴDKb84Ȅq(wɴ nW/C[Mk2h!$+:3/ 2yH6$ Q' PD2L#yw)2I`ښb,ܗGoZ<:G@f2j"yIvfUU3 D1֓Ghŕi ك~m))q,ߐ3+ La:'_C+dq >|(MLj=^f)Uڬukq`U+^_l%mWr-31`|+u2AXl5̈́'3HPa1s¾k@jqE^c{-B RdA%9RRHJ . tZFT 5]-5ain!f*yCl@є(e!]">Dsዞ,!$~8zW  L7$kAa\|SҴRV<88 5~\= OC8 <*ַKϸ`:4})=ak $@{@V/6/ʑ,~3 T*ej˜^^ Y!g=Ǐ#Ԃ_G^DzFEWPui}FUe w|O/g=eٌ$DlI5o `AFsE|@bKONpE2YBGǯ8ԊQ1I칪*[t =YI;aW}/?d>Xka#i5M L IbO!*^`@wkYBƪa{.}, Wz6,lǁG٘W&⍤B`43."zj0TF6{z2L4szw:,A\q^|-|2!YDžt^iINZa{D2-<%Gi]JSIOQW !s#~bP|1!,[}%Fp RI6B؋ DJOf ɬ=ܝVO[)yu1V 6tpMfQTW~4w/lV5VʢЖoa[.?mn[,w 3[[f,<05 EÈt~Iln{2o!`DX)a޿}G{c2pNgt`FK ͆sZ}")yi1N$*2;(,2{Eŵ!na0:m[OqQRWs0.y&g?vg6E MOT-R.ڞ7h7,4PT}7!Wo@w^v6{I9KiP7XoUHݢ52nMCb3LZwYA{j *fM{*cVӈ+NwRu7vR]PS&ȷn;Os6 \M=q_ѾE߶3Ywwv 4UK4 ًLM7͏fFr`ayOVӗ6JPMAݛ%F?HjAֿ,h6yoF-%)EBaӢU};بl8ڄPIԣwM?? J6ׇ!KF$VR1~>Ȏê6w*rn lvp6I<bbpZPJ>t9V @׾PѶ<̤WH7.l&'{6h˞Њ46LmRmb.i/]RX%Q' aqDe,,4Ee7wK}@0*%hRJv8H$=%뜞bffX Lb%Ϻ^qaz_ r遇MxI=,BOJ]`jlA c$JtB0t TC>/$O_N"eߘ v l;qtKHqCk-/xCHN{ګ#XYҜedf0SV\Glb)"=)aALtsܼ8~)&.ZjKndBL)(2{jJ2p@) '߫~y{6&z*={`DcP@@~Sײ)`|\P%<Oj5]MD,fxRJP<* ~-*Pn$6ťƎxW VJւKR|2X}I%T.]p"[Őx13˩љvT:uI2kF؟zuµq.zܤ>N7djdpV'NpѢNTl͢M Fq*8~B<}U|_V|{|}*jj')Q:%et^,Ɏ״I-0GEҧ~&X,z{㹢gJ4bA_K#Uc4}@֑|0r gf LEk[?0 H™]d@rq<##:3]a=B4"]]k!1tX[sId3cGsBE*78ػ 3U%XqJKIxf۔pA=A*S!}rRQⲞ -+sk9OkrhK *n{v{j/8_'3ۼ0Ut8,cf<դsBbhjׄ 1d P׷Ԗ,o(w՞juKS'Q>R8q`vʏ=ȨN O]Pd\icPNOw3| x7@y?aԙTeM˦^ f*j'<+@Wr!r,ѹoL>"Q۶9ܠsbs[WCe觛j>oJ'):.8&Xq:pP"Ywe\Sg>bxe:QDܭ-;bRݱb{݁ck]]ĵ<+?V2k mrJ 9PO@(v8BqsibTnq{&]@%/S~(u]#ܔr:ODҍ*PUv(Wye )Q~J8aFs0b@2z xͭe\52 xfUc7d7m:[bl6Hk3, ÷zV=šaʏ~k?[[$@UpRtg]p5?@bYQE͈o3m[&X?j˂E-j޽V;#cgYůoT=G~2E 1s&u5s{|t-TwxEы}^-")&:|sf+Aa%1 ܲa$}T&Ttcxz Km?hdBXG$Hi&|`lIqڽ1L]t}J]7xtJ$#EP{`ފ28f.eRQ;FrsL ]eI G?ͣzrbғ]^k0.3r?ғ*ge34Έ’ǒ"=k+wvi/X y@5᱃FՍf A ,_G]xHzBוe5;ZȮlh62f%tWAgr b3Vj)qiTB*XSEr*, 6`"bq;-La! f,x2}t_ R$Fa$5rfF42"5ɤQ fݳ2]XI&yTjp*+I& F\9vP/jc-}Dy&bÉ~AG磄  v_O)Hχ Y6筫TI߻(k7 ֌L: ZyGQC.Gs?qHMoŠ דw}=GC49 \ةPu|^2*$] f]w2(W?LGdXKPTź?7e&PrtWcfA(g=x۹@sAx~yZ0&-^aJ#u-J<\^ndai$CkrXZPͽ뎷b`Te/\$q[3Sua)w+h\Q|H@["um2bLt H~?GMY"y6k0X-V1{+g ƢRgvO(ˑ2S=mf;xOg&JǨ"(3A}l[h7GW"@qz~o&Wvp励?.l37aɁ Q>*Xf`9K#_$m6fwܷoT:s-#jh\R.,' &aJ0%.,Ktl/9D Z.,򡔓_@&bMgK!ƻiI&O`8-Z?߅$NmI%wg)"֬_wc[$5gRW{c OW80KmopF0 ;f:,EnlxJa9yj9]r4 64砾FZ,,gOOg.Kh ?Ƒ/SV##{+^s#'6rdӧ4Vzϖd鰲t2"s(ZC9]>3%i'UXK 3ƛXBaA аK%(EKJ]rd7U{p-_ G}XNgϒئcbc=мJb Ԙ AB{-J8>y.vj;?Wl7Qs~XpoVAln;{p{J<\7=Tx}K^yU~af`sj0Ė>bOA_Ehe'%NBg."|h|?znQ c.iZ7W5.i ' NUCΜrvB %7l>k6tS{=vJh 4` BMO $&>_/[lCzIH. ΣB[b5LqjC{hkm ٰӭPu`\zcFn%]THYg}4/ij['fc , t0Їo*d023Kbqy^ գQr[.4 LD^Xj*|0窐׉]To%eE2P:n!Z~sWǧ6 NiN |IA[xE:;Uc|ȹF6<=gHnG{4S/4.{5~ۯTl{j;"cFXcx [ ׆לi; |QVZwOgW^eUsw=@l/FN@X;:?v8^OtV>j(4TN3#^Zr[2].,o6#dىY:JcI3I|Sr⭬@$>A_rw+^. V'TlQ +,v!Is]\I0١^k$105oxs8jcۦc*$8_&6b=9%Q+w"q!"\z~Ld6:C~߂Ƚ..z%"TmVew$oWlJwVF3x8fn4d?Ƶ]J\iþ.$j&B{&$t=A1ߓkľ.͍ibwn#@aE2 d̵# gOٗ_ФC SNN)%Zʏy-E0|N({w%><:(xܔkw>5k[9۟44~ml<QnJSbR-oj}\ =(NkIuO(qPQ".Zhۑ-.V1AD^-41䗂@z>دh+讀u rte/52Ak!@_X󾸬F=7C Cg FQ )ad'kц-*H~ÅYgxO*_?hapʕ ]s÷ kYR \X4= f}&]eDC+(b*XѶFKSd}?.2jNphg,/7O>?;K3ppU:ßC+=~y`" HQ"ɫ?ocD ≆P"z~*8$팼ՑGVhd ɃVA=[glEb,Bm|Iw ֲJ|nks|[\1|b# fAo XQL6qVSNC#Ir+pw`na<%̔fǔp[M Sivp!Wv 5~grfnaZ13cꦴpLLӸoKeajɹ~2jtMܳs^n\hVP zptri)E6k*ʘ#"UaA o:cX17#~gqD:1 oTuX185Y1Ǐ)jw.ۊ,W=4rĸI/ ̷ ّ%3 ;fw[3p]1Ui;¢J}| )Dҋ؏x3yKlE7Dک}HPuL>j"[^3Kq 1) TH+0Qf[}#b:7] 5pT֗XNcк;n`؝4(M֍yY N䚆/>p։[Mblu|`67