summaryrefslogtreecommitdiff
path: root/tools/objtool
diff options
context:
space:
mode:
authorJosh Poimboeuf <jpoimboe@kernel.org>2023-05-30 10:21:07 -0700
committerJosh Poimboeuf <jpoimboe@kernel.org>2023-06-07 10:03:22 -0700
commitfcee899d2794319c9dbeb7b877b0c4ac92f5dd16 (patch)
treed5878b621427d0613909257645ded8d0d4efc6f0 /tools/objtool
parente4cbb9b81f1f7519c7ae3abda09cb15794022952 (diff)
downloadlinux-fcee899d2794319c9dbeb7b877b0c4ac92f5dd16.tar.gz
linux-fcee899d2794319c9dbeb7b877b0c4ac92f5dd16.tar.bz2
linux-fcee899d2794319c9dbeb7b877b0c4ac92f5dd16.zip
objtool: Get rid of reloc->type
Get the type from the embedded GElf_Rel[a] struct. Link: https://lore.kernel.org/r/d1c1f8da31e4f052a2478aea585fcf355cacc53a.1685464332.git.jpoimboe@kernel.org Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Diffstat (limited to 'tools/objtool')
-rw-r--r--tools/objtool/arch/x86/decode.c2
-rw-r--r--tools/objtool/arch/x86/special.c4
-rw-r--r--tools/objtool/check.c11
-rw-r--r--tools/objtool/elf.c6
-rw-r--r--tools/objtool/include/objtool/elf.h11
5 files changed, 21 insertions, 13 deletions
diff --git a/tools/objtool/arch/x86/decode.c b/tools/objtool/arch/x86/decode.c
index 9ef024fd648c..ffb12e83b238 100644
--- a/tools/objtool/arch/x86/decode.c
+++ b/tools/objtool/arch/x86/decode.c
@@ -84,7 +84,7 @@ bool arch_pc_relative_reloc(struct reloc *reloc)
* All relocation types where P (the address of the target)
* is included in the computation.
*/
- switch (reloc->type) {
+ switch (reloc_type(reloc)) {
case R_X86_64_PC8:
case R_X86_64_PC16:
case R_X86_64_PC32:
diff --git a/tools/objtool/arch/x86/special.c b/tools/objtool/arch/x86/special.c
index 7c97b7391279..1a54a249cb50 100644
--- a/tools/objtool/arch/x86/special.c
+++ b/tools/objtool/arch/x86/special.c
@@ -108,7 +108,7 @@ struct reloc *arch_find_switch_table(struct objtool_file *file,
table_offset = text_reloc->addend;
table_sec = text_reloc->sym->sec;
- if (text_reloc->type == R_X86_64_PC32)
+ if (reloc_type(text_reloc) == R_X86_64_PC32)
table_offset += 4;
/*
@@ -138,7 +138,7 @@ struct reloc *arch_find_switch_table(struct objtool_file *file,
* indicates a rare GCC quirk/bug which can leave dead
* code behind.
*/
- if (text_reloc->type == R_X86_64_PC32)
+ if (reloc_type(text_reloc) == R_X86_64_PC32)
file->ignore_unreachables = true;
return rodata_reloc;
diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index e06ffad5a93c..04b4152be206 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -958,7 +958,7 @@ static int create_mcount_loc_sections(struct objtool_file *file)
if (!reloc)
return -1;
- reloc->type = addr_size == 8 ? R_ABS64 : R_ABS32;
+ set_reloc_type(reloc, addr_size == 8 ? R_ABS64 : R_ABS32);
idx++;
}
@@ -1354,7 +1354,7 @@ static void annotate_call_site(struct objtool_file *file,
*/
if (opts.hack_noinstr && insn->sec->noinstr && sym->profiling_func) {
if (reloc) {
- reloc->type = R_NONE;
+ set_reloc_type(reloc, R_NONE);
elf_write_reloc(file->elf, reloc);
}
@@ -1383,7 +1383,7 @@ static void annotate_call_site(struct objtool_file *file,
WARN_INSN(insn, "tail call to __fentry__ !?!?");
if (opts.mnop) {
if (reloc) {
- reloc->type = R_NONE;
+ set_reloc_type(reloc, R_NONE);
elf_write_reloc(file->elf, reloc);
}
@@ -1865,7 +1865,7 @@ static int handle_jump_alt(struct objtool_file *file,
struct reloc *reloc = insn_reloc(file, orig_insn);
if (reloc) {
- reloc->type = R_NONE;
+ set_reloc_type(reloc, R_NONE);
elf_write_reloc(file->elf, reloc);
}
elf_write_insn(file->elf, orig_insn->sec,
@@ -4277,7 +4277,8 @@ static int validate_ibt_insn(struct objtool_file *file, struct instruction *insn
continue;
off = reloc->sym->offset;
- if (reloc->type == R_X86_64_PC32 || reloc->type == R_X86_64_PLT32)
+ if (reloc_type(reloc) == R_X86_64_PC32 ||
+ reloc_type(reloc) == R_X86_64_PLT32)
off += arch_dest_reloc_offset(reloc->addend);
else
off += reloc->addend;
diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c
index 2b45460225d1..be9d24dcdf56 100644
--- a/tools/objtool/elf.c
+++ b/tools/objtool/elf.c
@@ -541,6 +541,7 @@ static int elf_update_sym_relocs(struct elf *elf, struct symbol *sym)
struct reloc *reloc;
list_for_each_entry(reloc, &sym->reloc_list, sym_reloc_entry) {
+ reloc->rel.r_info = GELF_R_INFO(reloc->sym->idx, reloc_type(reloc));
if (elf_write_reloc(elf, reloc))
return -1;
}
@@ -831,11 +832,11 @@ static struct reloc *elf_init_reloc(struct elf *elf, struct section *rsec,
}
reloc->sec = rsec;
- reloc->type = type;
reloc->sym = sym;
reloc->addend = addend;
reloc->rel.r_offset = offset;
+ reloc->rel.r_info = GELF_R_INFO(sym->idx, type);
if (elf_write_reloc(elf, reloc))
return NULL;
@@ -910,7 +911,6 @@ static int read_reloc(struct section *rsec, int i, struct reloc *reloc)
return -1;
}
- reloc->type = GELF_R_TYPE(reloc->rel.r_info);
reloc->addend = rela ? reloc->rela.r_addend : 0;
return 0;
@@ -1231,8 +1231,6 @@ int elf_write_reloc(struct elf *elf, struct reloc *reloc)
struct section *rsec = reloc->sec;
int ret;
- reloc->rel.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type);
-
if (rsec->sh.sh_type == SHT_RELA) {
reloc->rela.r_addend = reloc->addend;
ret = gelf_update_rela(rsec->data, reloc_idx(reloc), &reloc->rela);
diff --git a/tools/objtool/include/objtool/elf.h b/tools/objtool/include/objtool/elf.h
index 2070860a099e..41d2149f8bb8 100644
--- a/tools/objtool/include/objtool/elf.h
+++ b/tools/objtool/include/objtool/elf.h
@@ -76,7 +76,6 @@ struct reloc {
struct symbol *sym;
struct list_head sym_reloc_entry;
s64 addend;
- unsigned int type;
bool jump_table_start;
};
@@ -208,6 +207,16 @@ static inline unsigned long reloc_offset(struct reloc *reloc)
return reloc->rel.r_offset;
}
+static inline unsigned int reloc_type(struct reloc *reloc)
+{
+ return GELF_R_TYPE(reloc->rel.r_info);
+}
+
+static inline void set_reloc_type(struct reloc *reloc, int type)
+{
+ reloc->rel.r_info = GELF_R_INFO(GELF_R_SYM(reloc->rel.r_info), type);
+}
+
#define for_each_sec(file, sec) \
list_for_each_entry(sec, &file->elf->sections, list)
^CLS5|7M,&M$=Ggww|¨)F0 ?+m5Y~w?]50㐛5?o\d}@#BXxFsj@|/ eY4}iOlCO`,Y_+0y*S#ۼὃ1p濹:#bȗjzWã@'EQ_8Nowyfm29f&|҉N,0HoYӻWtd=S]qӕ kV6G+Gxv?)xmvϖx[o#%6@+߹v[@b?3LS4Gm^vTq_7z =])֊V)UDLL{MTW\Gs? :bnΪO!?/ʸycN?bz6NLvJ"F?_] d ǫۖݐGKYтr]f(z}3刾*<9#,Zo@?AξQANmQzןu@ؼ s\<1Q IcE^^QJ(+\L8jO\Q>w:9l+YCˌ$$tӟ'n g[-$t}׼\R<ӗXsl= y88ޝ@r<>)'?U9hgUy<㙡Zo>̠-`,y#1~&s3@A qr~oaE/g`O;c}| W -u|6D߶BcLv,OlDV1o=l4L<1G; І>q{YCBH#ݔFZ,Yf]_(t߇#t"Gh8檄IQSLa7קqrg6 9Ӽ1%!Q7@SB*#]WѡݑmPD{L⦤'æML|28~Cs:Zq۪8)n.Ϛٷqza}7lC pG ־+^{@6k{N?G`z^ Wx't=r`eܾgfUmAۿHcSє;r[C%SuZ!/ hzm!%6+mav =Qjl+@?eN= =Ewuq(uvs@|柅Q5a^!-OȵQ`(HV//#JL\̟gر ۳d/V Ezw-Y[<=m& ဇthޝ."'ٽM[R7g&BuTm5WUfE Dyʔx.(</]0 =;hVV~v˫4cGf7(xasmP!9Nϳw󘰠~-(@(5چ &Jž-5D7AxXTV쟆B9AexB-fK[ v0ŝi_ <,HT0]Cm:xϔOot7W6M`VfRJHAvygZ~bb~ާOH~յ,Ͻ䴷1ǧ]1߳P2 JOSYyq^tk5KА w~v'eO wߡQI(>s󑧽}_8ԢJ)@e̠q d4pфZUZ:aȳe TR'= B4nŮ)`6  =⣆@ ʉAr!<!cG+C>GM.I}q) DE2~s,;V5]f:qVsye=5+@r-V3")(Ѝqpݎp |t𖑿VqL8n6KggtT /&jcP#6ewHw'C^~G>4>:B.Vjdq}04 < iY(.x֔HfnTfCt=ç0Jֈp2 0`5DdC (jQMf'l~&D꿫gpawG F ]о=t # 馤ۚe mPkȠ 11Np,#Ŕ\=wSJ:UGqLTS __)"ag p{Ý{` Ar(#\S=T-͐1(o@b HtFhX`l:Z=F0{}e& |>&ElgXa뾄90C#IF>6ypLQ &I)ZHz@7A +,z=7 }_uv&ztף)Vl"r쾀0r&߇J۠[!*aW>ٚߚCA 9G|D܁. cmyMOSڣwg.˄"p<BR! RRw/+ wen> T2 vO`ftcPS?6e)x^vu !-x dP@FwT\l=$Y\qU eclq_CbPs.9\H>;w \ [ @cQX2ggdQ8q\lGc=bEI0R[h b]΢P v|0FwRkr i'EhG_sS_=@[._go@|\14 fi=bТ` ㋂JfD61y))vŭy:AÌ́o(/k2SWṭED?I f0!ўn6cߓ/*P+sakk:%}ȏ>s-Qx~yʮ9u/⣅}bdEO~0N͊,tWQu3u\왞t^+Yx!0i37п?qǏw)qBadDX+4 $v")7\&qadA*yj/`kao֬cz:XTل૔Ty2tQD`P82Wˡ N[~.S^KEy'yx_s4fݚsbi ^>DS؇Xvh=!2钼50fj71z4YwDEe la(e f]ԯnG10e _~3 $ZWc74^}1Oη ݭ 䌇"fo~1!I][觑P(+']sf#Ye5֓JK ~NXFRx/6^ nwvg"h{1k - {R :qp3;8i@p9΀݌$IQϋqI 呂yBLt| afqÀ0"]LdXa+L "KXGc@X L𯭌hFC:%}FD4I3K{p84f`[kɽ,#tsH( )u_7pjdz_>w,R-VTĀc a{\Aîpw8:t<|,g[07תa<۰jPoH'wܻ95~[HxDNo#;,{GO}Y[ne@F0SNFcټXti]Hu L%$O R0k"iϫఇݐW?ӷs;rW*}{2%u|`4(E!㰺<.o,|u`T  0jL9IdH8(N0b qvҤe(Wa#=Z?b"jɆTBFqi8g΍Z-dr8my͢ɝUBaXH]ZCHsxMЭ͇@!Z,~ٿ"Zjo9ۂeEER8,w};7 Nҷk5nӸ"1yC"YeD۪jӁ }od)\f‘eD4$o?`v3 B$2or~U )=XRcEVPr]\D5b1LTT^@:# V,0w˱qsf}qh~+=4_WVkGj,͍=Pv ׇ0]^p/Gn9Q8TTWuW{ZT{xs:~r(=^Ĺ51;"TG .7QY>kZKή|w#Tlnߌsj)XQꤟ0椞49*l&AY}CQB @Y(glE@)` T$hr4*s7 #d\_\{&{A&Upp(&}ertzvaϱTS*VSH1qR@{\)x3 7>N {hn$li׌G@UGe} k<֒h3U3U_B|-Fp(:,s/0CU 0vV2QcȴɌ)sC!)P&Cza~{~gƲovWL><0zK(ЖQ$]l6/U&4vzc?:g hT3<cغ&;xU톻B8W[0nrDSZD2VMYll>sUx66{g"P|Cs~CI^ Y!:qNv !Wj[W 0;CN6}#>+W.7ԏ6LZ=Yp4\ef.\3E95y3 rZf.WǭdiJ<0̆zXM]]f]<(֊;#Xjbf<'隺:ML|3KxKKr 3X1jI|M0ӆШݣk^&StPm7V݌j&4xLwVUæelQSQ.wVOƶ+ 1fCJsG(%̵ Mu  Ʈ]Awp\7ȯfi:ETRFn .UI@PY2Ҵ<=v%\!7-|i﹝!t{*%wO%lAa-{ h`T7x(6p+ˇ\7JK˥7β!"űQp@ٶV&N{=5N ǟQXͯG 4.Tj.1i ċ+- <c =Q{5vBW 8H:R\pTQQlpCs\̑zr"R5Sz,fænPn#Zb[*!Vmc`Lz^"|y&@=\Mʺ6F6jKir`0| eu]'W`W#dߋu{ );^ٮ*Fv޺PHKhU 䁢MRP\Vl̾*R(â.7 SGD uD:"=1)dhI5V4)Zg Yaj,C0dӹ/Z<íȻo2#73-a,—PYۅjW1<#> ,a[^8Mjr@\>c^WPR$8׻MH*)ޢmwe&mǕ7+\AQ)Q9ʒDA#ȢVg 1(w7U ^U#>9ψxF1 ӽ{>ǵi~1DC+Rn2½2uUGtiatJީ0On+5aI9cƧpl=j#Ϸ?lT 萅pZϛf/D# ;%na;rYRs|D8<#G8RF>-+\z\ms(dbu_@{k,w.5"9 [|KD4diED}󻺐y:\]alnF J,Etɑ돿v",\+7 \kYyC7#HQzj8HH \#>| XoXD,]fo-bVEz: c@mD )8!gx" Käa/B[llB$ڹ_o׭VVfF.aV%(jůE}r)0\Jj'aQ+YFѰFkBM,zv@!@n.nܤ0`,>Q  a߽(dĂqMA7C‹^/r.&RM$-w:T4X"s=g6T~MI@@!˔KvK}W5g6޿vrq5)YI_YȚyƤPt2p(`3Jd>)H9FAo*SՇlJCVLbm`}VXDtȘG@$*Kz"F5m[@!C(n dɦ!I~>p_m/'(Jo\zG'{x:[oR9;j h`~ (6 }u#<$U 2ӻRN9Mg%m@u!¢D˴I͞"q; ,ï+@xakqI<&~\hwUFNlsH~wPo:}MB&۶ʗ [\=]]uAФp.PKX30״Mdm5龺߻N2.;A02}wC. E^Os=ZMȹ2QAA.x푊uT3RD%l!(\Cy%$ p$=G{s ccʏJj.Qj>(t"D|w13').3AD [B ;b Mze|u{xL]v:Vrn[٨:=@giV:떓`{̂mʓ~ >N5_EXLFqRq}G{l2 ?'9v83 .]_{xƛp{q +7֙uPLVd0Zjd27Q N A\8[&3RHr[v]T[fUb_A6 V~b*EYhg^^ 3= z `-eyzЊQ(c8Ud/|3 UN/܃Ɔ,2!ZAEIځH6QC]ʈ?)xy-,` "!LH30"v+++fӢ (.[_n;JFEC`V̢@Kdn0p쿿iGXim'ó7铥 'e+u<+Oz^m[ѝyҕocSi]M%}BBd 4/Y{٫ruj47@>duխQ$Yc9T#5凧V8G%g ,N۴y b(6:2NJ~d!w e.9轝ӢZĒ5]sS,o~(>t|KSr! w/3fTGŸ x`n*AƢX`T ҤֵfǮC8yL鉖z  +n  bApKdӻu"#s&i{K5gc(U`2; p)dM.l|!.ő,r>2WBIsXG"VbLF [w tl~݋4/JNA uhO沩DOm9(bGTdrUGk 8*.0AFt*`P}Fjh.=/"`>I@Pe~Ms?D}Sy+HFt9iiGWyȀp=[Tb(3 RRe:M{,n"& 5ު#yͿ'\ap׶aEbj {<ȧԃlaD,+XX9zxMս8jȡt@/>#|5>sݞ`)wH8m˱8 9(X}L<.㣄ۂ(ݻ%ӜD* \tH*'Ox5(/k.JFeP4R¶S {TG%e8GkF"~azZ:pT)c%Ex6CHT U]εElM`d" ֗K+w`7M"[Ρ*iŀ =DL>9 @hPdre&w9ܧ¨s17o|PS3 *Lj=,UO4FO ysKU`EDS$Ռp=/Ro} QwrD%M̲D*oq}+N˾q?cY.L> GC3*+i*AdN `{[qaa#~41 j_ mc}D@LO>͊X5Fk >FV s^iRHB(fNqln`S7^Cv3tϏ4.koǩnѠ[~̳'"=}&#B?&%Umn|v?X8+pGZf24 AP!'0\ï0.>Kp ee:ťQ$Ds9C HsT%@%2 !Om=[Mf{ Hw+J(͇A>wy:@:rźWT )luwGCX32?bgY!@\$5珆g!8g,Eo_~wA8Vˎnx$o׃Tu92x?^ymCS%p k ʚ^_oӸ1ug/pla+TTl.nǁGҶW"Naո:@FWdmTxm ȭ$>TqӑdG Hʲ}AJxJ< FȺG7$Gϛ3"y*@-[Qâ(ժ&7 ł<;"Gz*x5ܬ~kYFgr ?g OdV%?Lփ&Bda5 [˜rdYCx[B] z"q}8%"A>17ߛa >+ <s]s7Sh8o*mbL! )ŎcKLs~3sQ5pQc+\U\le;7@D+\V#S?ֻN>A^twvlsV{:oFiU K\rdcI68gD0CtPLm]c|L:0GY$}NIC3-r}nV~wG4;̙B-7l)D^,@0u_}=D/rA1jߵ@=Pׁq;ⷨFΡ W!:51Qpѱ9OxFfg"ʦv/0e!Ӥ/ ɛ(vø@Kn ~fhd:qⲇ {ټK_>72ECLaDj}86kX2 }i C!t]\R늿ޭ2lnvJsH?FÌ|n,X^aȇē@*ϰ>x@u#P),]03ӽ x4Y,G3m !_"*|$Tt%VѣOG<5 ^M[QEEA*_"M47գh7"fYּX ;ٹ5B:c]'sB8~%1}GE!Hzj cy }50uHbҲ^Ը!ڃtQDdjM%ZekDJḊnۭ Cd(b<^A|;\s٩:-녗Ţ:)o|3lsnB$8֥Jpn}͔sGҪH.jp]_|+ aG ~SmvP$u ? `A&0ңa./qTS5H drf;ӠiUIQU%8trdw(`GӈLHDto9h n}}h'9?#q%frgr ur6PP̈W%=8T`  F"X0trWs.YQ"Uu"hùxsU1g/!=Sݖ6T+pyTF,c,Gt tё`DCƁBbubOcF5`~u;"O^{JgdJ [؟g0$-[oMӘq/(-VN1bMc86 2q㌛/_MUr\D=CfADA"=+׻ HsT'H˅ /&ΪY_^QOL(^ʟ|{8t~RAs[%MS?K(S834j ehL(|IX־>Fp՟r ꐈ~{*>D1_~}=2˯P*~)!T<NZ5$h;I TbA_DP/1XhQO}RV[TG09YRD" cWցLջTV4Duֻ`a?U}J_Ѳ;ed ɹ0e[!~ #eY.({Cگa#9pʃG{Mfծqϝ57\ɚ VۯzF L2VqjB,C<}KX- 8kE4l=teCnKK1#n e=3n-H`T#!Srv3eCoKCS"pwBg۪l"$Np 0o g-Q}_~ge+tUHr@SnFH{/cB:J sܒjcC$`b"ޠ,^hW@v3xqgZqt  /9u ]zO T3^[k1:Ǽ~WqbV:'I4DoAϦr 1?)2> n1۱$ DAPjp&bI hy}yYPK {_ @^4, jYrt٠$Sږ}z(+11/'h_T]q(aoȟx|i0`eq,&[OxHwSh6O'W?t'A-z l+aM[R~c⺨sR[Eާ 1%.٩xd|ȇ_ ^p Kr0\:xN^<bcmpGw1_ $ 0YE@rWV⦫}5sGBL۶h>oAA/#KK7Qa\ʺ13 tt 6?]dR;1+=%'3?:>FcI~+SJC 1kqm ůƮs(H ?r6@%v E^G:mGߕBrf[77bo`tqy<BV1AT[BnP4|1{f}?G'}:]i~=%4IC$UnbHE+9ce߾6ÝpFaPׯ\־7+ c>8=SNL@:B\`D VEr嘑r;\@>p+m͠?c;u>jpl!dO9Z{31F$BB(Cѱ@.) x?G1F3&88pͧ KVt'{dUǍV Ι^mVcW+N@'zb☊\VN P}9nl$E]}b]]wKtC=cA}͡H5?_և4ԩf2k,zӟemaN^Rlсm,YF ;4Bp8_[󀵪UpUr$("8h 5VtBrBn مK.ǟH|1xjDYF 1s#Â%Zd(s@RYE ~,9|$"{\ E:(@K!HG9ځKvõߞi"=Lhq2n6,Gu0e*詒CS"^Aqď03b%qy P )& sT5ʮd J$'(>K(Ѕ 65B"3Qj?Yrx ׷ :Ï邤Fu9ol[j搃M{O-S `@ˊh! u^gqT'o5kGw&)He "'ڧwwZcD;DQDMv^*662C֨_7I U"j&zX  ò"SFCݴ?ʇ9U9g<3gH` g\|F~O~@?N+25]4^gNd݃`ci 8qOG6`hN1. m=31ω-upA!N0G%?:Usz )-uJzӯn;? B >̨vZ=̑>r LuWn!JJdSQ;EX~\|7e+QPh 5{b =\-wn<^[ \bMҐbP@qahradV?Da2 RjTC@""gƟtÅޱQlt ͐Gzn>1{6~"3|A<& fQ% %sH e%nP^1' C3ٓ~P &Tɶsu²lWBLQ7gGD}\"v/lB5HJ=tl돒a(ӈ۳97}Xb(NwVB  z`{c]z|w k;"*2K:ВS̶ P\<4a q֙%v{Y.lJ;T,Qzxǜp`n%P& \q9rJ%/N*%H '=8ZeGJ#ÌxR$|`1zL[ j 'S 6$Hj̼횬MAO޽*9tw3yyi|#G>SLKo]=f (q^x1 (LG,y"1̂h&N aPZ@(iI䬥d$𹁄)PO,t(mpHx3{aڰk'GabpZ9A"scI06JM!=]zpt" V&-w`@BDػ)`.)Lw$P,p f]X~OnkU]tX>[~r2MKO/j+όtYzcQĦB_%^D$ϔ>/CҔ\_A!Tu* GYU0X )<>\Ms-E"QTPW%^Ql,y@voӗ\QQ:_uIŷ#\j}! 14we/bW1= !2+$'%aLUpes.OppBQDBZE/n{#GfWn.Ll(8 fVʬj? P8[s= ;M80ΌD8IDq`esg`fbL,R@Qe؂2T~ N,bv A[_Ee3@FFgL/Ӻ@_2 @$)NeΎpd* xY^F7y}*%+s:iZ8%C(^͗],s=nԪgZ@(*^;{^G*#)pl K5M .vF`>@՗xBx_C^;o_ś,sJE$xč]NǓ?z?sL |vdXT˳ ھ"T%ȴL8"ޓBTԭ^A^삅 B$;;j:{<Gذ 0d !p]a&BABryRR)Mb@yE}|f(v ~?s/#=JrϩpMŖ:uwzk9_`sId;oY=O@DC`\ܧ=L) `wj[K$NC*0`('ob~`xD?,eNow8p5 #ykmdVW*11k$c˾1ĸi}CY`BmM5 Qp_U YLb冟I픨ξ'W';v ]Oψ*B]\;"=xiĜdVVЁ,}tp;TbcKMePYĪKQF>q6﷭k[sQW2Mw}rV˰!AF(k`,8‘<é<;d88}`HvCq/ngM#^{!9*d󻅛AAD:ʗ 56b` "J)xXeOjuǧ$~20?XI ? ߍ ) va~)!c̍lI03K!_RNo}I.`Em I _d:GNuW (^iʡQdϷ,IDxOv1/k%Gꤣ9VN9,ewAZ?4-ݞX #vl/w&p|#CZ=;?ׯƌ͓^(YZ"/7XeC`<L`ls4\us z@0"{D"b73G$<ʁ2[q}al Ay<2xC㱈1O{yŒ Oh= BϘiz$u;9N'z <"tdǾW+"who`52"3x.%1B-E U=۠魷T>xym L,7a5aqP#Z>oH_`Ze+b& lJ^  .|mfCC5 ةx">PWGgOQ{j̈4#N9˓G½ȤywŲr2ʄXɺ)Db!;gBYUig\?5{9uæ6;Ü.,9g&s%#F:Lv<307P(REQIq+V ?F #WQ<'[I6ǎ},$ɕ5qS}op N@o0,q ܿ= ^פe2Pr%zDB'/%<uSZO,7ˎ2F(SeB`ul;}k3>Xl"EƮEƓXZmJlkRam85@2!c`Y~.s\öscAŠDp,My+>iqnap0wk'b]IYL;.ޘ8r/<5,lu@!-N"/kV09Zp۸Gyӟ49}uRG$ "#nrY'޳FnNSa-#|gq&u@>(\#"7\iA;~fkXY`ZBl@x\]|WB;yӴ:~E0Zܰ~ES6|[=BJK]OC'/"i(F;3z=1~6&3f >YqA0cZ$yO9}F1pޯ>1ܻ"<a& 8ي+zŖ Nì {Ul喝 3\3 C57W_tԫxh$)Ai oxAnm,l?CVdaAQ8bq4 p_aZ;f";Pw P~^ƻkfgVfb " D2F`wh=*SH4Ӧ0|7Cx"ӴK*$a I8qӲO7Cz yRiӁc&`ҧ 4rk[ȾC'gkܙGO5;fE0L ͅl #IV0xX錆ymE?\4P&VG{ X9X-C 7W-Z֙mؽmx{:|M@]T=QA6n--59!#mcgrMӨ ިm'/W]A!B5ω@t0~_wzo:C`5<ЏUEە N˧c >,_C%YU {X E/qIT /^>ǵ@L⫐:j۰ N M"n0/8^2J^z4$_0iv,^l!i1Ŀ|6>e{ fMsgq85}Xn߃6)çӖn^oFCт_aPCn !bsg:),3ՠR&^6:ʃMhiߝ6 ((f.J^D%{Pz+@9VڰqZdg8W wC\}z-2SJf\F  ,~ΪU80`;ab?dA=vFV{M/WM->85pgl;&GTf8KL$t9IsA9 11F|?/4= EfL8rLqP@S!g/!% XTX_ ڟwƀ:B(Dyu=o;j[ aCMh^:̢PWZƴxLJVQX j / J_h=wby+{R~YCZs )bg>Mj0;>L2灏a_w4\B26&sTk]MŤ,Q |MbQÎSmU9>ib?x>̾aiLIzzcFϷRMbs"" 6fˢ T0ex؛("Y}mP#XNwr%~ZXɗ^؊`sUI1gLf1(~֘y p xna.V(2yZsN"[IlҀ7}1pwN xӓ]9/~=QP"l~T vp9!%Q%>NF}dcیI2 Ԅe͙ CXAVMP~F %GM ֕kJsIJJ3]l*Ýį:B_nnѢ~o77fh=eJ $8*TOCxjdFHu6EfRԥnP9*|AE!?VkD=`lP8=V-˱!]yvǏс2v|,E: 8>Px*5ɇ{9K.Hss]"s1gq;^xD.v G8v ꘘU!=!Iu,a%v^iwR˵عysJ 40bsa(1@ۣ&#$\!#k ?#g LلF5@DppWC=[o;t@D" fhFVd8 7SWV(o탢ld-5a k4M5'VS_pW*q=l iQiI5tT +Gr 8^ ([X< Xx{ 2a{#gB6܅輁VK-|#(3p5d7A[ȸBeyCv "ᗧ^\&J~ה~ܨ +F&rrGcG^/^W ??Y; UCɲ8Q$cT"i~'Ykt坝h+P0>f=L5! >4DGhZ4֭od:K{D{s}GCuOSHZ$ PΎ{~{ߘh'ag`ǻY^;<"7]Қ911+HHJϥmÇ,d!(%yUxֿ{9r80R iX Kl& Bj\2{a ZC`J6HrY'[X26a `o3Q Ą!ڟۯohf 9vIT=em:/r,Mtl{zElN^*sq҄DF77IR_[F1x4_ 1,y30u%ޭ1ؽ^ouQoիW2?ásc[Nۦ|ro) :nhAvYӛ n~p0 m~$.xj||.p)/!^g Bp~"9vKe9?i»Ýr ;Ίezͫ?N7ձʃ=~9p?צ5}cGgnewGͻ'AܺxZ[)N=Cd_l竻:{-~\<-B{'lG}n90>0+3M2CksߙA\(KGTAdAa7pr3;UW~z8AѤ=\Ul)aΊX+1V$/~S09{|[%o^>}to˩IQY@>Wk=gKܐTrg̷5##€k||t9r0;zpS=skmG4zTc:Q8l gVBRxp ׉`p _aA2K8Z"ą+ @Aby wT*_,CCzwI~8z4LfF_P>g8B?tS7K9\cN(/017F$ Z Gܿ#&H^-Z_qM';Uy~.oǔ^X}5˨K LSIװLIn /vL)9xնkCs@ֻv?> 3GgT(5?YX̆x|f}_(Y㪷`ڌpvG*%>[}Y=^#b;=E] ﳶ2irnm[pi`GڊM|9.[?F+-wi/((3`ݳ}8 069IECvt\ y22cZ{ub!N P:F/utqݕӛ޸S 4[vN ;`5qM _Az}5[[bǩ>[|۬k E/x׶= xr/ ǎ2K;E|AW/|!t1-@[Kνc(~Nt769.gi hw>Nn.x6:e)eaB[Z GIflrn$lkO2]G'(fd=gmGH[hohYwcDl"e~` CgLy`zpL4ys/|5},"s X %;~G~#;ZpcQ ٹo:>I, {>,ǚ h56VH `״s럸Ui2qn@|`j!xu\?U2Wf1Zyg?.|\\4/vΦK+\_^| Y>'F鬰 hӮҌh?+6/%KlH $VǑ7BPQ{#t~x8pwGA06yG sQ Z}C_3_7Oi` YWrneR=L,E{wvJ:w`(X0d'`Y#>(h AOU/y{"\~N`~ z#sE$P`y M4Q3?e$&(&#@킢((.u(mt{tԀI,F "P"F)$)T?DRU&}-@*Hh&(FǿM&Z8a'>Ma]4`*+CDg?7E J }Aa օ_>HS}zO侇Nl|÷z~_6` &X# } ͙~ʏ/n|c":Y_; < ٯhX E_C,G @ :'WX ]4UV! Pzo⟒w$? z"`+ !|pHpO$Al~nz4U'^8uE5Tbsu6}?K T=(ٝ.ٿ|mxc/؃' oN-yX?-BsF8/otAHU *?H1`!p5華  ;t.bFarnr!0S舀RDY) .>`#y'; #`3'2S1]fB( Vp:CoHcr3srˑμpi ҃iAOxxC}Ne5chEHX=5F20|sj:.Ab E` `jBH{fh ><&~M2P9l~@z/„@JD!yQ$e|Bbt*'w719z{;^&g%XQsz&6E[~ovs H$:DFijT@JۻcϞIqAz~o4#:&9]d.]U@ӵF0DAhc&&T|S|3`m،= AN@d`< u;5jQ`%'dčFm۞^EZSZhK#21\RS{7 AK= oRoVJFYۥȋvٍkSr(HX(mpmX ;u:xr$8,A-8\~NZls,8%y9VM6͕?vX-Qo)X>IYAw]I3`ջlr;7 IAK]0|A Bz E@ vsqK>f%`*F -& dR7r!@ FY1)";|He梅GLqޢVӺ^ c k[E?CUg%W\DÂ{8a|K ?qYMBpAHg'iJICXSa,mYu d*%1xƟIws@_3o]R+?[?Gܼ<ሃ%'] & 4P2igIx \E7.>X9#x#Pn{03ĉ(0h6.|f(LgMF yɣ(9GH %;g_AYzY-| !Ecg~ϩDDQ#$o*K$J8_)D -U0.xY8ryke C>I/vxj/j!-fLy jAqD$rQbisDquN|fŨ4Ti J^=.>pPu El ?|=Pn %SO}#8E:F_g$ZX!o0l}ɀZ)uɣӉuN|~tZ%*LG m>((e7U?SUms_ f~&A"WENDU|S!)en Xe4I`snN:)Hi(&+!(&]޻hS.Fiʥh]K@y$Je1Ԭ!Q|>GUc?Is9pXHAQ1KZ^l!26kOo;9Vk><덍#VPͼ2BjtT__ˋp)kNm%uSo$;{%Ov_0>0]p6}:쾥lDQgb'C!~ 0 ~7^'u_"do¾aYlJ)ɆQi" |] ЩƦWe_AS3 ^ߗoe쓯rhۻcJ!f/am"ݪCp?8\b{'|ڃcYsO!M5ꃑ0`M9?0@q~ 2UbOl_1-=VD㐟Gxlvp/A2ClD#%s4ϛc9ҫcܗk"c!ԯ L2t$ :/CA~Hh 5Oj]aX$=Q{/3W8*cӷ9$ձ].E!NxGk:Ao7,|Ԧ ݆[qYϦ9}iZUWPaJ,Z5&,t̎3H[À%fLd)rVjD*2/t{; J"fs8/iq-q(enwRɨnX Y kZ C13 a5$P!Jҋ|9;Y4v {S8x$ #z h Ł#Ӑ&ȁmZ+ }5$sc!8S@l\kFW 8D8Ҳ#+ĢAM"AQ(v!<k/njT-󓫤_7W\wM@GS{y5c̀lh`55KILDA;覲NW\tu.rZH"|` |ppŅ u[ڈ;3@ @uxx YvfqJӣxEb/U׆*" ]Fᩍ=;sΣ~OfA)Y.?bq}J.>h9ٕii[Qf3Yeu$ ,4p)( R )[\w|׾ǮUN1cv4[P!d%|Å 1?^@ɬz̜rIKjIX7|vJNTq"pש._/r׹Ѵ'Fe=>^YK^=NPS7me{c-4ܶ W0@AWV.)׹A?07Rމxke];֗}Ϫ/.9F/ڬ%_׵!DxCE~?wܫO/92nmI)Uhl;5w|x)K/έϮZXVsݫpw0 JڏʼSYM yjX=.A 6AݐG`jObWRT81`^r#[$hn# 7ô f`PO>OpO l6s{>("o쟮.޿[c 2g3q/n5J@Q@W}?{͕W`6OlS>zA&jgޟ7; 1zo ~`u&W."h/0l(̥\ܻP<<&&|`16ܭ4'`U?TU1{l 5=.0#.CZgOQ σODI}:zN;ך,^)<7Fڟ G=|>: m+w;+֦&*4K+8wgS@R_񜞂B#=0kΊ1`\}G1$LP־-UDֆv6'uf3A%'t=0>9F;mymtA'_9m!B<`eGL8AkK!p6:.rJ`G0S>]9-0gPADŽr/p4) Hl;BfQQU@DB?ECc ݨp֜DT5T kGjMi ZGe"VD%N(j`zGN  N9Rԩ}u4y%7G xZ%Đp!*#Ràg䛓K׏"0^ ޲dr vL"wcYF1}zOL@\!vjtGΓQ ^5W@esf *Ȅ7'p6}'Þ6DzLq#r:'sz|<y!! r&(]Z<:wֆI6,,$\]T@P!M+*;8\&\ePQ9D<ː~D])U|F1Zj ** ب|o܀}$Y?ݷ{.)uw -͉͒[/w5n ߡ94"7axVuб>~\O~SN, -  Ă%B%H-u=3@@1 g%WB) O)͙ =7e9#ï,䬇kᬃ&w i}np+Ze{cض6{*Yَt-vT.euul D4zOWY턻zϭco_<O(NY.LޒG`J+BfC#@Üy*pB}k)q.ڷ<9c o㥘gMXmҏ} WhrD!(P :ծʌ2^%-u'h(NýWp1SeO`In`ŇOc76ƾ; ̓, #탻P 0O-+A0,3` cMGX{>:8bRJ(PP$SO(EHJEY7aߥ{S D,( f˓H῝qS 1ow\ 3Fwsah`j,C1z@9_N׎A$ /nWzio\ч ^ F |%>oqDf 鼪z,ⲗz25+"=sֹ9vxn7v&_ƒڪ;;Wե"w?t^ǦDq|- :]U&9M\ޫ?Boݷ[F.yݯH]YCwc_;GJ aHHE;jȏl'+ݕ?}sH|BU~m /DdP!U A_?ϐP ׯ?d0@WI#m = 7 ';QNk ?#yp1c]!u aTMeh1Ii ) O=5D_;2vlk=L 30`lFV>nxnd3Q  `=n{Dp$Zemr c1+ 3,]0/z)W)ADjk%ՁyRY'u;Л$:bR@TH q0^?Yf&,e&r)0w'Fyq0=JϫY\gYΆv0'#*" yݘ:v\M3#2=l>\Q%אto^}K8tPbIQh,K 78ITG!@oAz`Bjwu}6_z{.u7aBwE{BKO |¿QL]0KՂQW;g 􁏝yuvYQFqRAER1_Όɸzܛ'𓃻G&(BBs}NzLp#Nz JR>ﵭO*݅%ٔXYx k;akN2,88k}HCJśdj>$:ꈅ߹"aj|22s>"eH?O]}k,r*/Rȼ|^v ~7 BX,P×Vz; (%9NsE>a &ZO۟.~|N< ܛY˩f́tdžA, #9aD8$zL^Q PwIүŠF.uOBR!⁠kaK.iB0>޵ dSE-SL1֫a@(Fogp֫_0vT栮,;q'ZXnzmx#LHCI@ {1- WEx+# J`0c>RsFbˉ }ԉ!峋SZ~{CFD=4A4t@/+