summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPascal Rigaux <pixel@mandriva.com>2004-11-25 12:07:44 +0000
committerPascal Rigaux <pixel@mandriva.com>2004-11-25 12:07:44 +0000
commit21499786291db824f9745f4c0875eded9d44370d (patch)
treed05b38b64c55c268f78f7ee820f71fa8776f2447
parent07edf02d12388e941a375fe15769b706d18ff132 (diff)
downloaddrakx-backup-do-not-use-21499786291db824f9745f4c0875eded9d44370d.tar
drakx-backup-do-not-use-21499786291db824f9745f4c0875eded9d44370d.tar.gz
drakx-backup-do-not-use-21499786291db824f9745f4c0875eded9d44370d.tar.bz2
drakx-backup-do-not-use-21499786291db824f9745f4c0875eded9d44370d.tar.xz
drakx-backup-do-not-use-21499786291db824f9745f4c0875eded9d44370d.zip
- create analyze_wild_device_name() out of subpart_from_wild_device_name()
- rename part2device() into part2wild_device_name(), change its prototype and use analyze_wild_device_name() - new field {faked_device} - for LABEL=..., {device} is not empty anymore and {faked_device} is set, merge_fstabs() will take care of having the real {device} and {faked_device} unset - for devfs_device, {device} is set to the devfs device, merge_fstabs() will take care of having the non devfs device in {device}
-rw-r--r--perl-install/diskdrake/interactive.pm3
-rw-r--r--perl-install/fs.pm106
2 files changed, 69 insertions, 40 deletions
diff --git a/perl-install/diskdrake/interactive.pm b/perl-install/diskdrake/interactive.pm
index 2a440a4d4..9b28808e8 100644
--- a/perl-install/diskdrake/interactive.pm
+++ b/perl-install/diskdrake/interactive.pm
@@ -27,12 +27,15 @@ struct part {
int size # in sectors
int pt_type # 0x82, 0x83, 0x6 ...
string fs_type # 'ext2', 'nfs', ...
+
int part_number # 1 for hda1...
string device # 'hda5', 'sdc1' ...
string devfs_device # 'ide/host0/bus0/target0/lun0/part5', ...
string prefer_devfs_name # should the {devfs_device} or the {device} be used in fstab
string device_LABEL # volume label. LABEL=xxx can be used in fstab instead of
string prefer_device_LABEL # should the {device_LABEL} or the {device} be used in fstab
+ bool faked_device # false if {device} is a real device, true for nfs/smb/dav/none devices. If the field doesn't exist, we don't know
+
string rootDevice # 'sda', 'hdc' ... (can also be a VG_name)
string real_mntpoint # directly on real /, '/tmp/hdimage' ...
string mntpoint # '/', '/usr' ...
diff --git a/perl-install/fs.pm b/perl-install/fs.pm
index 47b290fd5..2839489ba 100644
--- a/perl-install/fs.pm
+++ b/perl-install/fs.pm
@@ -126,25 +126,36 @@ sub merge_fstabs {
@l;
}
-sub subpart_from_wild_device_name {
+sub analyze_wild_device_name {
my ($dev) = @_;
- if ($dev =~ /^LABEL=(.*)/) {
- return { device_LABEL => $1 };
- } elsif ($dev eq 'none') {
- } elsif ($dev eq 'rootfs') {
+ if ($dev =~ m!^/(tmp|u?dev)/(.*)!) {
+ 'dev', $dev;
+ } elsif ($dev !~ m!^/! && -e "$::prefix/dev/$dev") {
+ 'dev', "/dev/$dev";
+ } elsif ($dev =~ /^LABEL=(.*)/) {
+ 'label', $1;
+ } elsif ($dev eq 'none' || $dev eq 'rootfs') {
+ 'virtual';
} elsif ($dev =~ m!^(\S+):/\w!) {
- #- nfs
+ 'nfs';
} elsif ($dev =~ m!^//\w!) {
- #- smb
+ 'smb';
} elsif ($dev =~ m!^http://!) {
- #- http
- } else {
- if ($dev !~ m!^/! && -e "$::prefix/dev/$dev") {
- $dev = "/dev/$dev";
- }
- if ($dev =~ m!^/(tmp|u?dev)/(.*)!) {
- my %part;
+ 'dav';
+ }
+}
+
+sub subpart_from_wild_device_name {
+ my ($dev) = @_;
+
+ my $part = { device => $dev, faked_device => 1 }; #- default
+
+ if (my ($kind, $val) = analyze_wild_device_name($dev)) {
+ if ($kind eq 'label') {
+ $part->{device_LABEL} = $val;
+ } elsif ($kind eq 'dev') {
+ my %part = (faked_device => 0);
if (my $rdev = (stat "$::prefix$dev")[6]) {
($part{major}, $part{minor}) = unmakedev($rdev);
}
@@ -161,19 +172,47 @@ sub subpart_from_wild_device_name {
$part{part_number} = $part_number if $part_number;
$part{devfs_device} = $dev;
} else {
- $part{device} = $dev;
my $part_number = devices::part_number(\%part);
$part{part_number} = $part_number if $part_number;
}
+ $part{device} = $dev;
return \%part;
- } elsif ($dev =~ m!^/! && -f "$::prefix$dev") {
- #- loopback file or directory to bind
+ }
+ } else {
+ if ($dev =~ m!^/! && -f "$::prefix$dev") {
+ #- it must be a loopback file or directory to bind
} else {
log::l("part_from_wild_device_name: unknown device $dev");
}
}
- #- default
- { device => $dev };
+ $part;
+}
+
+sub part2wild_device_name {
+ my ($prefix, $part) = @_;
+
+ if ($part->{prefer_device_LABEL}) {
+ 'LABEL=' . $part->{device_LABEL};
+ } elsif ($part->{prefer_devfs_name}) {
+ "/dev/$part->{devfs_device}";
+ } elsif ($part->{device_alias}) {
+ "/dev/$part->{device_alias}";
+ } else {
+ my $faked_device = exists $part->{faked_device} ?
+ $part->{faked_device} :
+ do {
+ #- in case $part has been created without using subpart_from_wild_device_name()
+ my ($kind) = analyze_wild_device_name($part->{device});
+ $kind ? $kind ne 'dev' : $part->{device} =~ m!^/!;
+ };
+ if ($faked_device) {
+ $part->{device};
+ } else {
+ my $dev = "/dev/$part->{device}";
+ eval { devices::make("$prefix$dev") };
+ $dev;
+ }
+ }
}
sub add2all_hds {
@@ -258,7 +297,7 @@ sub prepare_write_fstab {
my $device =
isLoopback($_) ?
($_->{mntpoint} eq '/' ? "/initrd/loopfs" : $_->{loopback_device}{mntpoint}) . $_->{loopback_file} :
- part2device($o_prefix, $_->{prefer_devfs_name} ? $_->{devfs_device} : $_->{device}, $_->{fs_type});
+ part2wild_device_name($o_prefix, $_);
my $real_mntpoint = $_->{mntpoint} || ${{ '/tmp/hdimage' => '/mnt/hd' }}{$_->{real_mntpoint}};
mkdir_p("$o_prefix$real_mntpoint") if $real_mntpoint =~ m|^/|;
@@ -288,28 +327,26 @@ sub prepare_write_fstab {
my $fs_type = $_->{fs_type} || 'auto';
- my $dev =
- $_->{prefer_device_LABEL} ? 'LABEL=' . $_->{device_LABEL} :
- $_->{device_alias} ? "/dev/$_->{device_alias}" : $device;
+ my $dev = $device;
$mntpoint =~ s/ /\\040/g;
- $dev =~ s/ /\\040/g;
+ $device =~ s/ /\\040/g;
# handle bloody supermount special case
if ($options =~ /supermount/) {
my @l = grep { $_ ne 'supermount' } split(',', $options);
my ($l1, $l2) = partition { member($_, 'ro', 'exec') } @l;
- $options = join(",", "dev=$dev", "fs=$fs_type", @$l1, if_(@$l2, '--', @$l2));
- ($dev, $fs_type) = ('none', 'supermount');
+ $options = join(",", "dev=$device", "fs=$fs_type", @$l1, if_(@$l2, '--', @$l2));
+ ($device, $fs_type) = ('none', 'supermount');
} else {
#- if we were using supermount, the type could be something like ext2:vfat
#- but this can't be done without supermount, so switching to "auto"
$fs_type = 'auto' if $fs_type =~ /:/;
}
- my $file_dep = $options =~ /\b(loop|bind)\b/ ? $dev : '';
+ my $file_dep = $options =~ /\b(loop|bind)\b/ ? $device : '';
- [ $file_dep, $mntpoint, $_->{comment} . join(' ', $dev, $mntpoint, $fs_type, $options || 'defaults', $freq, $passno) . "\n" ];
+ [ $file_dep, $mntpoint, $_->{comment} . join(' ', $device, $mntpoint, $fs_type, $options || 'defaults', $freq, $passno) . "\n" ];
} else {
();
}
@@ -351,17 +388,6 @@ sub write_fstab {
network::smb::save_credentials($_) foreach @$smb_credentials;
}
-sub part2device {
- my ($prefix, $dev, $fs_type) = @_;
- $dev eq 'none' || member($fs_type, qw(nfs smbfs davfs)) ?
- $dev :
- do {
- my $dir = $dev =~ m!^(/|LABEL=)! ? '' : '/dev/';
- eval { devices::make("$prefix$dir$dev") };
- "$dir$dev";
- };
-}
-
sub auto_fs() {
grep { chop; $_ && !/nodev/ } cat_("/etc/filesystems");
}
@@ -454,7 +480,7 @@ sub mount {
-d $where or mkdir_p($where);
- $dev = part2device('', $dev, $fs);
+ $dev = part2wild_device_name('', { device => $dev });
$fs or log::l("not mounting $dev partition"), return;
VLgpPԿ/'2Y;<#pyGA]Cs?4$6~6ȌJO~)΋+D\ {Kx%P@ w;i_Y|v/K7ZÏX'OƶPنg1ǴUoIΖͭ^nVm=FI*:t@7,E@ޖ&DRo E>%ښ/\_~quM-9m cmkQ#߉Mhh3d%/-I$A:\2 o0Ikxތi^E qa؊K|4_Zjx۩sTTT"oP/~zQOjQ~n=ݽ\?scwO'4q=/1%U1)ќsd0ˮÖ пX+% [anK!gucLԝ^C̦|5(+eP?&^W017؍cTVcA9BG4B}!&\}jfo|t//aRQBE/teFE_KP`^K)r# z Y@U!{ǣ'*w]2aoRZ6H<+:˜Ȃnq]<Jlǘ9.aEeM'ȱ=K&*eΉ 6/}g+T5}c黟 VN5 چ51d?iu|1E_C^ *Hc2?ᢍ>>G.6/d Nś#wdً\r@=HzXBr/&o{ͣGc~<p! م2JQwOT;K1'̱PWas짗iR/=""cg#v=3"!bImf7<fj&{i!@̛֜!6j!vFќi16I-\njufZ<t)ElQ }C8kV9Uc}s|U}F:u}@]<6 bEyq,]~qi}Ty&Wz4̬k]B }[_sh5O`99רCsAZ»j !*o0;-V!ެaHe*2+ݹ2`ؠ*WhngݡrqTm/}S;S8M82y@ +Wrhi]g]ȫ;G)PY_d(-P2=P`-W+}=Ns:A. L,5ӟB1;^).ɟ MwV@7kyf 'l\.m[D"bl$4wt!!n8eR̗N6bbߠ}͗6GٞğBV]ᱶ[7YufDžcCln>Ruѵ;7b,u yMՠGД ňx*P<I&0.oFX|@ gʸ-ؐM &I}XLhL&t;+B,y/V[5>wZFw' D~~>]+-[G5 8n O*#g0h0{m y{cl)zfc ?; J@^ڳ7Q8v&o8 S),o AVWcbxL|!ev8Yjv pöZ 8. S3[1ˍ,4 iC:@Lы>VrIP\&bR"P&mUy`Ʒ#$YR2gG?*GkaXUo:GevuI!W_/# O$Vv@O2k~)&)  %`dU^"53IJnOŴw'I0P:{Y~h, ۉC<|@=v+mpdǘyeֹj`[I/P9NSYDYD^00 )lA|x.R=foa=1D-?ڗLBVʚnTBVŇ Fi+1,Zղy&=P-pkeȁXVt&AWvd|1~A%~Ta9AGꃧTGe +E" 1˚K<͉0 R_ ES#' (׋-W2z& ݥG&-H4{m4G{ȇ,N||PU퀎lV? ~YN(> z! M6&wUMW\EHy%D C&FjqqG}$(f!P3;% tcqս}4(;B:8&u?h_LDiRplOE8j#sO5D]d@9 ؠ*f:`J|.niv]G"켨TS ɘ  /Gk@?S@vqFxJi;NϗsK/hu4+pCkG6ٸzyc069I,Ft42n5Wy:2Wh>ia,ߔ6Uweo0.bFjVrq95>^c!+XCܥƎ'c_2wrrtK$*uN[>bj1t<}5'OUk#*%mR0ː-#Y+NpJ;͸6& TPV\(t Lgg=BɱX&bBBlT^`&?$yDL~ԿA7 RXxk* )_,,ة,c;B]C||ncܥDwv Lus/Hs&[ުP /AVN8գ>{pOErߖ&PB0} ?FB:{NoF8'JZ/ĥ&Y,4sZagM$~h*{gkNc ]\c36zxvjC.gJkjm _b+~%n %v:FNn'z`6G"2yd5E7*kP_D %QeV,YsWhe5Hx"~ 3qQ?SNPY9elЈvNk8ֺĮȋKz pƘ.3aIR'6N5b蹎hJ$ 5xU8pmE}Ѕ ҡ_J ”$xAH#* )ԡB!mF44ˏLؽۀoIqpo.ݠ{ h~t<M85 T2 #f~>шZ')d,d!43^,$6/Kl,~m9b9_RTz޶|F 4HujA~xNgҀ&1Y-} HAY8H=9[F)&T5רt?0_}(R2\zYߝr>ÝEjŔDT~a&=z`&f 4C\0zl§),ѤOP n[)2/īeH=32.#5F6_9AotR?|D( vSd}ЕBi/ΒNh:_JrB mcyV+rlZW+ZIX d{xP>(ײG ,`B6Z9⇕jS]>_ ؕtZݕ"iQ CW5L£0H)ɇItrnA*& [/Ja% T.MM^G.G& nQ<ꄿԴJ.(ċW_SM!Z`7eYB৚eH`͂ |ō N/Bǎm εoKPf`Ȑ;/2Ko?X籀 v]'*nQ }V'["QԻ@(kM-y/Ocqp~3wm 7@ (ɖ} 3v)߳QxW_1k:<0pBUT`檟9" ۬Ն'c'+'Oc"hQgaѷTEc$R. esnQ(ԘGj * ˊV`]wOR>hLѨI%N*W:k13[X58حQRn<}@AhjsIJ8>`@ f0PT3ca7Xv罛ΣeasEџtpRI25a|͖%mڤW~B@d{H{ e3-~]ˬ_ɘrǞ6z"?ù w6y[ix9FIYemq| ! FL"gVkM1&wlkxv^y;*u05@|>=6_?Oʝ_*"bliz*}P> agʥDBQ:){dHH2wPo#&2O40 ayɂ&i̽23Sgd,_ 8Ϗ:BKBWBaB,А3o3TkI]~e\5_ >c5Pz`Rlyؐ/L7;q/ Ճ|&k@LMHŇχR[uE_s(ؓ*Bgc^`:5j Ҏ;ѺU8{x ?UY$G1yGJr_QDW*/"eb}k{2CkSGtxj-o*v]XY?B}a{vi\S=#qo:#3."yU1(+$H+IRH^YзIl,uAͨQ2:d)ͱ+n rB |1wB8|𤻮-?h0q}ZgH`k7 )#,u JS;Geiya|O3PdlHoE[?$"ɚl v4]tG./73@ő(LRU@ 6Ux`PAI޻=N;O%wjL:w_fECհ>xFn',[-/·+j8(C%8 ,UƯur5H%%{OpLZ'?LEd{s}ŷM3;ubsf_B(?焀)(pMM|jkPQ8 ;ݖ`dwY }s>+j\(})9ϴaݢ]Y| { ܈m] 4=-#m-5!Ec<^)NRnLG;=g&܈{Ӽ<$ӶQ~YL:qݗKڳ4=I.AeTta|efVAꊘV'_LT`ebC'' :fZX0r!y q(SKz^3ûJYԮ Z90_e)XbI^|d]T 3at }DTO:BKEl hQѾ? n ~Ґ|˟ɂe\#r2P ukR4G.8 }YUJ`-xH!Vrb Bɘ{!cx^pT+͍{|ZƻWzÔ]ftFg"l OOR %8'AC5mO]?+ǤG@NgigUghŠuXԷsy|?>9kyW ES{K6 P >0vNE^q`y2 9FW[k"u7Fc-"0L/+jʮ)ff``Y'6$ 5>q>WP0F-Pqcڲ>lHR~x h"=vV(;n+^u[_|N{_\Kb.iV¨xⱪ[pYe0xP\FǪlu{yq ,}MyS"PHQ@,C1Y֒a@B1LT,\ZL eW>LM[ ܣpt>ߌڂ:8KXJek73؝XdЋ3Ҋb! I)K} /j݈1ݝ6xd7O '"zY5VU ט4KYcE/NpvQ鎭k9zH]8&&i:R!MLu ]@=87 9:>6gGuH8 ]CB=߻mxJ_X{I U]}"5~rS*U8N#/{PA% 4JEYvc [պ޷ 0Ϡ%a2zq}☝_'џ~=([^y.t  o5PqeJȦ?^C QE F2ɹ;\ZT+:}=I13n/-D$ "pҘ*HЄ.tRnO.VQp4з7_}%f` :B_mLS|h^_[8<᚜毮{O0҈~6b;B;K 2 SԀ&qrt'*r.82޸3mM:JMۈ bpHo1Ǒ#UUz'JU'*&^Z*NbסF@Ђa%T@n 30>@7cxhVǢ~2Z%iҸ61t6:pXG*\iyT]tZIk.,%F~ tCߛx/Vvk2U┭sgTMVCWFa|f`vaړw8M^CZerj7 A/k^6QKl1ikuRS U}St3NbJ{&/J6A Fl dΩ/G6OYe1tiVf /.?QYG1_)qn%ؗڀHϯp14*Bi11KY!7/{Iјh,'z qmrߐfHwt7nfU1?W$ 8yBPP8bY:SS SB%5PA{za%v*mPc@oL~juΰJeo6aͦw40ZIMzR$Xx6^$V\DPr߉0Z= _f<2!>٠b9@38D <"M5(T]'9@r?qPcɨOǻ.\S{Lɢa%gtщIYOV+@zNQh E~R=J1њ R_K,{z3 XtZs_A:Z|ҭ}نp¹řvz }HD;CJX¹-.m^薠Q߂G 8 Cَ>Mr}~.m p?P7}lu"E17NQhͶ,epw+";eR9M&! {tɚe3GV$O4ɃLQ9GXPte.V+ȢIm<v%/SD/u0;#qWPG|;mpB˯[IH,S/Lm PUG  aN{PG^Yv~%]͝ԏ PN0k ^O(})rYrIZ0fz,=W[K),83emI@ ^σW#=gvs< [Ōn oK麻ulnt ̷.Adz"{bXy 4?p)MM:!7SBLB,u27-կ4smE] w42-Chn ~w;]3iܪf/6ܲl*3[&SSKS}+Q]HlkKۯ:wdf.,4`jv\I@[yҋvB+:D6'0y@ 3raɪH\Qƹ/=T&|[Z3=wNh |([p޲6yH}!8P3׳ԫ,N!kۅx4*q bwJBnGM yw4D(/ >u\?q@!?D1Ǩ[iY6}.o4Ԝٓէㅙ?Ga_"xq7BjCaErJm'><Э'S۞2Zy>Gχ]S;7>3WӒ|P¬1+>##󚇴+(h76=A.0T:2Ncf@ɚߝlj ) Ntl3+K StѠx!}g' k"e͒1+U[Uay]> s&+ /Z4t͝<_d$iP# ZxRk˗뜧4xCEv::)d*|B5ݑ\xb'"'Pkyg@!dθKxͪ|V#5P̐>j̫cF*~3Ç$>3ٮMf^Lb m0MS25wMl!I a亡|DMϱq=g3#vԄ/ ^-C^RCDЇ*`DgY"( ZX@yՏپ#v&םGYG=Bݹ;C7c <M&(n.}]aA/lHZ&Ve)ԌT kNЮ~܉߸Sj92hHTwiQ7Ռ4g4Bz9&Zmjr޸kK*nsB`D`2Ԃ2Nliɥx[$Ӆ EaDM[;w JlNٿf 5>W\J%㕣3g,tYҗl:Gbz2iH&h)?@ !N mwMeWt6-T Y9!~&H3zSO˾+s/aot8aǎ::6xkt{Xzv[znQXb2rYNzt0Ou![2)F_3}Q6 56UYx]雰\?SNJĮpHDz9-i-5Yn+bJ0VA?} gj~7ˇS. ;O`5z@rc*o! (m1 yѵ86O!_8eKVԌiZi;9̴ !u< +Ngh %uJ&{ ""؀b4 R2؛X3a)GAQK--v_FX0L;æAptiV2_ 萎"rLBaK8k´R`zs3Ő'p+AXQVMU/ sEՙϑ,wrMZ&I"eú1H+C':{a9˱) ̬D҄y dyjRG> }Yh.<75>p( ?ާZyb-G%8M&C??7̴k&C[%zdh914㜬Izs-Tl_T:Gx:!W00ljFĮթPa|4>u~6(j| fZց!!Zeo8 .7WI$8&2`5(r(IR#?9;j$ '.fq8  s<[ӹ'V[Hhtfa=5ޠIíBh)TVQǰ;*RK\4B_rlL5E#7: /^ga1C JP$R'Q9> H`kEj/Y9cE[m(d^_N`W FN"5tb:΢Hy7$vIKҶPh]M XAE2 .%˜S wmZE,,brPYDğ}) ؘoLGx MѶ%(LlRwCrJ/+jwO"]U'en;J1*TQzDW_b%/\2=hjdh?V4{ƥd~Jͼ]ڷCt'reofj"<; ̱xFMH5٣]@#\ձqŚC}ߞ;E]6D]~ԗ L" +g*t_ v^-I܅cJ",ļ;S&gM,|acVdzK&=,7x׺`NN@2Aq&ϬWկ^7ջNӢCgrCXhgT`3JF˳UZ;Jeo3<\N,3Ẇ+1_7dߧtv.mqry$%ٺ,GrLB+g 1nj0)QP @򗍈jDPkވɩ<$z=$zP8XPaUEJ0TvoL 9㲬%D<#/@t\2xUp" Gnaҙ:÷~ ۱@ks2U [^ȈW'{)n=!d0(_VP*,51#0mu(vbn#|fH8.R͠e)_~<+z{g`0k7.l4Z'i"6a= @y-*3(,×ѪP)G`bђk#uz%Hp aV N@tA*og-@#{l슨ϜD-ӮuΩIUF R7:^u15ΡY\Tq]a!ؽ4v&\ ozxM -jSuR}fߐhzlw -A_\D~{6-x+a,hHQQa ݮ5 C=a(Ӏn0LjM\̴! |ܗ^u949Za1d%3ʫ_$zXaѼ}B`v~%g j gR;˵]q|Bɤ EV.t?ciɷ% Bœ2Zʼbily'u4^Ov3V~n,f{2uSMwhCy,S[/]or)-e{"/PZn"CްSaSTŀqizc񓜭jr%)2Yo~H*tDsn8*WPlc N3DT+ہfmv o]dy\/mx,<D.oyJ-~&#3?I|%*'n/FmQc!O@Il"~|toS>bUܾi+\yt[>B4#sg⇄S}ٶ -0kRB'(^TV~9cf>NZ]yJ!~y#mHx؄wDQT1>7FprT!6>R>/u xsBX`z)lN0d#ElblYŻ,0gؕޫfDaS s#@uMahsj?XKr:bW0fgk_|2[#fq)]yFA %f X *ͺFaz# 4|kz爒]Ɋ&/G#UG:")4QiZ(q(HqyrmtDHʆl˓jHz/z.5*^ɠ*<*lP6BIh<bڌbNO-57^idhrt ^ [(r1VE`!oT vPۣi/ *Z؜Ӊ&&+/rJb>xvnRiShˉHoz &:=5 9@t#“lOUS_b']-0Ք?>:ž.w ՜یoYdiIT##42R᪾ T`%Zi|ymN>+X7fYp6/jnADUyeb-"sDQd,7B.N,=8+TE-#*]E5}Ɣs+i>myޢB1(.N# TsY5\ʿ-˦2{IF ?ٯqᘮ%`aa)ix$e`[4c_d +:W:^JPf8#l Rs?tc{FHuqc2,);վEڲ.{ku,4W@&5O1X?=-Wlr1&zfXsݖoD>f e^v%jC[c7$1j?hb6d?0|nբR.WMͨL[5K.uw#TzETt> ,HUm'0VMj(uR;LfЛ5l(]t*Qj,%dU1/ WΓ'rk$ݖ@>t]bkG^Pb, k-%L`TG>s.,{ȒxuJu_ ^=^ ԁ{|T-Cr#~{tmj.z`ȺF4^KCjZdK䌶|Ig,\jޅtpBXX.n㱒e!@5CI4ؕZdhΌnʒq0~|2ks9u@hh+3rK)Uk)Oa20Uu'Ohx-%7Vs̬R}_km *]Ld$,ݑ6G ~V Y@xy#5w; s*Q 4V7 %I0otΎ+g5ܭ6Yar+4dOapw %3)ΏFc[%_m;`o-77LPbfHNY8WU-'4E.{]q~),Eŧ=D`auVcH Qs$#HS⭢Y̵dۗ=/*%/FtM-:'%Q&T $F"~E mA+إPnipTj2\e*0#9vCOǖf}&}jX~W408@.7)vLMp}Y\8FۃBl~A4@N^JH['eXJS:b~)bp6<|LO/Ԏo+r6s"˫H[HC6[!ld-$"zIX9ߏ&} mH3qŠ<)Ah(KXW!YRUI a,vXȞ1QƞAּ]y.6 )``+׳~wBR}} v(27PMa '5Z }<$IfkBM OEIiX\B-FxNr'NG-]càdX-~c@ȀxaND@#|alI2ʉC쥡f6Jɶ'N␆&U#^)+A24˗cg;cU񂿨os(){%9:w L82:D+ pfٵT-;H#Xwhԍ|Pv92~Ӽڲac!7cg42tƛ`p/R ςY?^&A;~đh'8Wƨ}YI !g1]s 4HJ"h㔌W_%-fudy@N=B1SdlivA  O"psEKYYx U;}); * .^2Tb.GAiw7 \H<D 9*8@YؖZyRZDi}Zbxb-?DZpQ]E~\s|9YַNX{dzR}iǛ*[C&>O͋ FYLK޼XB} } :RdΝ?뚶*0a+:cg*I8I+uOUgv^Ydbq#lNTo3Dpָ,itC.3pR(" eLdwB 3s5NbǭF_ | U$1YJ9ڲ4ʁ{oXnN݊cO;Ĉj}}3ŦՓcwKJ09b^&n|*T0(6Kz-ϖ#RV& ?Wcǟz:omeYc"ӎʴm-'kvrWNj@@ɩzjzcudAq &ئ(7@A!x_ E@l|[*z侯:[ߨF˦7:ɗ r7cxӆYZ(|=3y|jb㼛N=""XB>~ly +zs+Y}4W  ~.i@\>25x|#Ur3R?hΔ<ʑ_9 G)2G<e)o޲aw͇Y(ߡxeYh>ccBJ5%q0J/R3ub1|D:TFg6 t} ̑ɀS;{H#kY wo[3E5fwn+ ]ͬϰ5We" /7"e` 5|"`sD=Ņa">)`r. *LpE+b|0jamgT9UdJtufP{@FwTJf`>?9a-cbƘaNSJIEAj 'XKJ>!媠v0k:xPb͉^΃&lf8%R.Y,p$V#x9IDtZb6ꭊH453RSIT!ntr*۳%F5U:9v9O=իT>9 ,[ś4c\+0WPMTүQMfgjS,0m2u ^t7UkZ ƾW@Eַ;ZLv2AJM J4ǫ""(%ɾ jkuzWWXEkNuGR&F8F8\& K/B_!LgC B.K{re$ߊ熻tt€;5裄֬↑K}(JCG:2z}įsS AS3>*~[qlkTS@eEY &<`{L("Ka}Yy"an3m :+:-I TS[F +cuQwX&֡lۡ8G=lK g( E/bQ݋yBalX뾈'c%+@)D@By8"{M% ӱ&rr |zkdNo x=Tfxd]污$ybW c/8m( x_aOƌW,oF~C\7w Y-!C $O h£>du(KUvtSJ1 @,<׌ȕ }" $Yxw 4{q[بG`Yk#@la*3`k,pVPZwv"j8;G`4 *ә| /zq7*/K_~6aW " +]a5 9 (MB1-+A<0AYTrg%OGѰ+[|f YS< N@"adFږqk+$b-]>Ђ es|gVޚ4M17r{۲LPWX4c@nTc(33-L[:3}X'[4I#Oeq H9|ѠAmKMUd6غ30ZUUdNm=zX VPMYsClW=aHH3t֖Tz#7E#UE<ҝRFR|o/Q$)߶U9X)hmrUҘ줧>yIu*:rm/SՕqD) 7tI R9Y%pӽaGR*8/=k=9 (gY I3xGld=ZtpƽQg@ϴk֘.Y@0=u)W!xqr jJwĠ*Y^~v!*\+ hZ`cK$x嶋Ba&Hb>jtPg%䤆ιȚ>78QǦl'1ȃU8G*$0qQw%tЎVaW/;;:>mb/.f֟dlUdxvrq=̋щl܈wЫp+i;f|t;>] (He?I?S oOFJ?L0r>m `r]81}'D `y1gq?e-U]SjJmN1gd^-Tպƒ.`]f!? 2 UYr#) PDƝsht5jSAv m%~]?:1~.v$Z|Ouqc:s/KmŬS]4Q¡dq2erEG`vBSF\&ޏK]4 U\uK5z, .HjwUŵ,Rh{$s7n4Kyc5h:ޮwrϦC&?]ߎT{(WYv|,@Kg588|S8AZv&8EDqY0:qxH'BC,~_K:Ɍvx'4P2>P& /kE A3t@M?@fR8&1(*Ę%buz,Mc]WnM~ONɿ+MCa:K2j->%Nd2? PxNJWO |ps>TA,E т;AHq )ͼufHhKe[kod JdvR$@uHR|[2#h]> ?l] 'Y\%d NM0D*0kY9fVFyGb)aOSTbDj^|"Z?Ee/^Za,\NykjpQ%蕊S1+c1e%D<Wxҽ =@%t6s;>.⾊{iVM ]۝k*/s|eĄgkQvz>:jwn?*xb,:D,'.<,rq ЀNSs׿ESps~dDK i&?GѧWʿŶ5zl)Ld%AL쫹EW nz54J &3T%05BKJ|RJʻAy AQTv]y_z0͔:"\tF=4_k$\+@g!EԵosi2֠Wr!.%s/H# غ&Q);!j=0o*ydymLiSw+B n\[)j29Ve_x *}X]Z{2i3Nw5=ފDՉ(+?S<쌤qoNJtSCcOa>RQkBM9?IRd *HoRc&ʎ <-x~|;@i&en"`K r,pJ7:;{IXtȆI&4vءW{JƷl_qs2WTRXSksAzZPcr]MMӑ[9`SaYVH8p1{KvπX38P'J28u2fD3 GNx KX4JwE9a^@pīA*zdzK!03Q wD[XiBM㥉eD=Ք3Mx}L5ĎLd]Iu' <79E[rqBV K^C?X6*J̕05bm [I7?Rlj?YLwpewM`ue#:"%6z's}| l؋MI,ɽj$VӯBWg2hTIz8ܕo&ykD&}o}4,RF V2; ׵PPzg:1}jPnpDЩ^Y_)c g+'@f_ `-gu_%D:bw̜ Oqq8#qkB1Т{2H͏%HSDb7ѿh Voڻ0&Ṁ@/XדC }`bA dR`QpBqyjXk=+E?ZlneyT=qTqYU/ɟ$Fezx@E+^WDR=H=Z4VʻI8+&"xV22ۮA .7Z|%>)#ޥAwBV7|ux*ϓ7yVgǗ.AlwQBWK|FFE É$K^e?CJ|핦m4~{/G7s@,pFoN>cCT̂_HH3*'QM-bUgug ~MJ䱷0*)u%fٛ N;ԤH/Qle1wv@'p;BbjQK jU $V[:c zl{_M̽  7%o˂뚒D뺒pk5PۇGoV}3 r6#}b ^"O]^ *+` )m kv{j W514BOOeuθ]Slt'lak-'#B`@WlO{_U˶(t1;ZUb*:Go8v:3Qz>>LWB`+`9G8)n8e!0foF 3L?Fv,[@'>ly$dؿkΘڏgk)V.>Q6ͷ&6p<8.'Voio6ի:nDžGQ@XsqrX>/0CS|$MC(C1TNQ;A4٣ D{**6Pfߚ0UD't9Dg*kŒ@QW2ڦH `ʜG&.ԟ0]魈ոqb5qȑ0; Be5"n'WN㆟3FMDWb)%6 (D>vD;jT,ʸp"eb)BS}) VyySuSc~ҏ)|\S @PԊl:/l{ϵ8iRss` y:NlhKYtI+HDTdoV91ʜe6]LкV<}03p ``m:}~v،;)o D\í(8-A uD-<^؛I&?jAe p~!o_1vҺ(<6۞ۻjFpu"XӞ(Tp$QocW;ҡ A~oBxEm @#thhTr6Jୁt8M¢$s7Ud% >KB6}71F.}m(Ħ޴A)l+ B(ŐlS @l"?zМĚ(óFqc;e[ޅJx]ƥBܬk5C1#s za5X#F9C5 a\@]xA2'dW}cɗV9dt91 oVW8q du3i_J:?7:R #iEq9bG]