/* * Extensible SAL Interface (ESI) support routines. * * Copyright (C) 2006 Hewlett-Packard Co * Alex Williamson */ #include #include #include #include #include #include MODULE_AUTHOR("Alex Williamson "); MODULE_DESCRIPTION("Extensible SAL Interface (ESI) support"); MODULE_LICENSE("GPL"); #define MODULE_NAME "esi" #define ESI_TABLE_GUID \ EFI_GUID(0x43EA58DC, 0xCF28, 0x4b06, 0xB3, \ 0x91, 0xB7, 0x50, 0x59, 0x34, 0x2B, 0xD4) enum esi_systab_entry_type { ESI_DESC_ENTRY_POINT = 0 }; /* * Entry type: Size: * 0 48 */ #define ESI_DESC_SIZE(type) "\060"[(unsigned) (type)] typedef struct ia64_esi_desc_entry_point { u8 type; u8 reserved1[15]; u64 esi_proc; u64 gp; efi_guid_t guid; } ia64_esi_desc_entry_point_t; struct pdesc { void *addr; void *gp; }; static struct ia64_sal_systab *esi_systab; static int __init esi_init (void) { efi_config_table_t *config_tables; struct ia64_sal_systab *systab; unsigned long esi = 0; char *p; int i; config_tables = __va(efi.systab->tables); for (i = 0; i < (int) efi.systab->nr_tables; ++i) { if (efi_guidcmp(config_tables[i].guid, ESI_TABLE_GUID) == 0) { esi = config_tables[i].table; break; } } if (!esi) return -ENODEV;; systab = __va(esi); if (strncmp(systab->signature, "ESIT", 4) != 0) { printk(KERN_ERR "bad signature in ESI system table!"); return -ENODEV; } p = (char *) (systab + 1); for (i = 0; i < systab->entry_count; i++) { /* * The first byte of each entry type contains the type * descriptor. */ switch (*p) { case ESI_DESC_ENTRY_POINT: break; default: printk(KERN_WARNING "Unkown table type %d found in " "ESI table, ignoring rest of table\n", *p); return -ENODEV; } p += ESI_DESC_SIZE(*p); } esi_systab = systab; return 0; } int ia64_esi_call (efi_guid_t guid, struct ia64_sal_retval *isrvp, enum esi_proc_type proc_type, u64 func, u64 arg1, u64 arg2, u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7) { struct ia64_fpreg fr[6]; unsigned long flags = 0; int i; char *p; if (!esi_systab) return -1; p = (char *) (esi_systab + 1); for (i = 0; i < esi_systab->entry_count; i++) { if (*p == ESI_DESC_ENTRY_POINT) { ia64_esi_desc_entry_point_t *esi = (void *)p; if (!efi_guidcmp(guid, esi->guid)) { ia64_sal_handler esi_proc; struct pdesc pdesc; pdesc.addr = __va(esi->esi_proc); pdesc.gp = __va(esi->gp); esi_proc = (ia64_sal_handler) &pdesc; ia64_save_scratch_fpregs(fr); if (proc_type == ESI_PROC_SERIALIZED) spin_lock_irqsave(&sal_lock, flags); else if (proc_type == ESI_PROC_MP_SAFE) local_irq_save(flags); else preempt_disable(); *isrvp = (*esi_proc)(func, arg1, arg2, arg3, arg4, arg5, arg6, arg7); if (proc_type == ESI_PROC_SERIALIZED) spin_unlock_irqrestore(&sal_lock, flags); else if (proc_type == ESI_PROC_MP_SAFE) local_irq_restore(flags); else preempt_enable(); ia64_load_scratch_fpregs(fr); return 0; } } p += ESI_DESC_SIZE(*p); } return -1; } EXPORT_SYMBOL_GPL(ia64_esi_call); int ia64_esi_call_phys (efi_guid_t guid, struct ia64_sal_retval *isrvp, u64 func, u64 arg1, u64 arg2, u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7) { struct ia64_fpreg fr[6]; unsigned long flags; u64 esi_params[8]; char *p; int i; if (!esi_systab) return -1; p = (char *) (esi_systab + 1); for (i = 0; i < esi_systab->entry_count; i++) { if (*p == ESI_DESC_ENTRY_POINT) { ia64_esi_desc_entry_point_t *esi = (void *)p; if (!efi_guidcmp(guid, esi->guid)) { ia64_sal_handler esi_proc; struct pdesc pdesc; pdesc.addr = (void *)esi->esi_proc; pdesc.gp = (void *)esi->gp; esi_proc = (ia64_sal_handler) &pdesc; esi_params[0] = func; esi_params[1] = arg1; esi_params[2] = arg2; esi_params[3] = arg3; esi_params[4] = arg4; esi_params[5] = arg5; esi_params[6] = arg6; esi_params[7] = arg7; ia64_save_scratch_fpregs(fr); spin_lock_irqsave(&sal_lock, flags); *isrvp = esi_call_phys(esi_proc, esi_params); spin_unlock_irqrestore(&sal_lock, flags); ia64_load_scratch_fpregs(fr); return 0; } } p += ESI_DESC_SIZE(*p); } return -1; } EXPORT_SYMBOL_GPL(ia64_esi_call_phys); static void __exit esi_exit (void) { } module_init(esi_init); module_exit(esi_exit); /* makes module removable... */ I%由ZLNT~tY#jGSWk=8>b7=EayT|)Ә.IXɄeõ5, $v4-{dQLې onB9Ɏ'[T(R$)(vO#~)K@$:4ef=NLY_냊_Gi x7;@2RAn80H3]q6zF@Ϡ3Mw:&+93⟙Y_>XAγzID.>**i~Zš4/ &wzdM>ҋHK+mwO{XįE&lwM9 m-ɮgIM7B5m:(̡+$fY<"͙/3o|7Se1tGuq/j1;R"kW`>[ xlk.Fϰr$-,J[ʢ@E:N0+2d>ݺ'T2V .uu-w4:s >-殴]R&(M'j5$]wiHv{?J)D#1]F;hq*Pa;GFGo:h,Q=@&R(7IzV:BVC!|o#ޜ,+|? 7XEH9F}%11=+5,/K^IBA#]'*&7ᵩr?]9u;—)xbذÁ`;16,2q ] DsLY N׉'(pqepFdkЙ=Dx[I HS`E_%&=Y=5Ε^s, af_[-&'[.D}psր2{;{HfŽ=*iuBP=pEDPdճ(agw|U%%JWmj#sS(ƫx>lO, QT=p, ?vra;XB!cc!M$v4k4hLR/yGxmAÙ9bt4#j]dHChɻjs(&MtiVm"aI4mw5pˉWp3a[XdwyBóPT䐻]v:4u%x* 8Ud:Vӏ#VvȎIiW34m=96sϏV^_c=.#]e;AI?zsp6ەw|%VC}-H3em#} f3yoՈ))I3(l[jB4!Ug3rT'wRco#/-G`<8~`dŕ-~% R CWݖ 5gcM+ڗǰݗ#re&~*f#Lv%=hF[a"~B)mu׺4jyQg ,Ŀ}q,nx'w7fO )gFEÎ]춑~Y(Q2hmG:\3.o~m`]ߐ% ֥O'i~|}r)RjòfqLR2Ih~!3YǑoKYVBq~qmhKEZ6J@#J a.a`gC~\lBQC5f  ̼7q`EsAc]@mDܭjb D"|z%S-ަx)r؞Md17ቲD'nWt4Ӑ}m>ΗkYQHUܡ?/nUL 2N@mL~o Wks>]6R-SC5D ǩ" -!lAf3s1Yhn;vs&xȆNrhG|i/ kp;̎[~Cߙ zk`:}eL=6A&\sli,T9D{/姦bSana'js&8N +YBNAYWeFmlT:IZR$`cVNrHyNDrzDX&!H'43UJ}9Fxk!z&~ 2!'sxݙax/<Ohd.~T0IMh'3D+wRh;DA P$CŠJLk.PkT&! lebNH#-=WG@Z CnI.@9{GJmlˈ.[umX6o.R7VIzh 8jduۼ- B[,QS]D5LM >6\LxWV^KrYPO5AF^ȶT9nNZ?SM#I}d (%dkbpJXFt :*zL7[ƀ|i7}u־w^ä.z&kľ`{4{} <]kd4s2o tw_55T;ٸvF*^AsdA|NQ[O*Wɧq=$H$ .}ۉ!`3,qgr `C!rv"'xW2vB8*xޅEZdUgf47Π7F}wF*Mwt$SNqSaibf˵h5r@ՀBTh `dXery N%:8͈`V*\awDf P 5K`X]ꛭit>Qa{~em=Q&ˍE^T1l˟*nبtO-ǟ꒲k1˟5 sa.evf8fPOJZ/%9}@N8:(˶waXAP}y1G6v$Z}pXs! ? ]a8.9\;4M?q@9h-O{f9(g(ol'Q 6f/\ n'<Ζ@uw޷<=aNњpHUQR YFe` iQrq;: [@ fkdQ"Ǽ%ywXۛvضl gܓpg  1LD:a[Atq8(^}+Xa%ctb +kL%.6ӭ)+f)ڵ|&Fhl RK@+dt]c?vHz8q5A: t2LTӓ$M'ӟjgzCO !y$,8\ ;#+h5d6Aϳ|zT_`TrߧXDzfr՚P%3Sel|62$V8ܮ-$(9|B?֢Vjj bnzRy(*|֡Ls*C\}Π!{б'\?c77 aX78#۵ kbB%;/VkWy+zN+y ^Q+Bl>N_ȒxˁL\q j}F֐cެfK3֊'HnF+9ZI p;V49,Fάgx+XL|ު& ZH NUξ^%oXyU[G<%DަpՎ:&7П5<,}N*dJ ̶2 "׋P ,+|6*t|r2$I- ෛA@ǽ( 0|UGlsj!x=גT4gK[ 22"/Uj4ᡆ˔䅠m-_wNN"^W"WZ%]V t9vA3{bEeJ~=/}G@~ZLbG2jÊ:6%/ Ԑ }U;Bsb"d޽%,.*9N2:(uV E9Ήv6_ӂAy{ \_hbntxbSd2xw2+50ѠDOSx.= @`CwBP{0b.J!sa2lux0Lu"h;dثC`+ZރNh UѤ}Qt9P`$\ ) *kb^^lo 3قMʪ8G~W ,Q[~FvlR=(OSnUc)aERdE@3[]n2K}#N1j-HC{L܍++qPHJ+\Ra͍c9pm.&O_<2-!HeI 2*RcW@(\lƀhHb_O "훁QՖbe9K!R-~!zx ¾I, (ڹ Oݓ'o}Kky_$vqXVb4cB ~I(ug 1QU 벊VJ9ŀ+Vg9t6Kۧ91S{`LtfsNPړ d^f9;-:38A8^VQ&>Y^! 7ȳ-]$τiй6m lS8j P=z(Nq~{ l:Fu"]}B:8~ye-=gg;; "o#q ī8ύ&;lј+2:*ʅ}jAJ+L@6"ӿ0VG~ys ko,::6%MQ3 <)+-_ öfK=|v{fV>{bNf9 ߌj(g4#&L I$GCكSIOzJz }.vw] *}=F^qa)5MYKqXns? >{MS-(@ڰžyI^F%>PI:}==mN!£v qitV1E2uJ +ZYޙVrK  2SkJzl*I@ӗ`6= KJ+O/o+YBvpHTV^l8Xܪ=b̌69 w}2kت^^s<ڵ8F($r|L8%vҟ=G:c܉S cɯ,$f@iyY%RR8`j '+ cc펵:q;mIjHEUۗ@5 ƃ>q'pa?<(d#K.\5 ԆݗEoV[$U7G%\L A$/xb{}_S:%޶h=?EػSΜdU'#,Dm?2m-Ӳ. -uPu#uAovoV1rz!U|=.H /Etgk(<ßs(&;U&UL{,aZsX hI%İ; UsiR󠃾=0F߉{ʀaX"/o{wJdϺ ^cd;M3Gu̡[lH5 8sh_IסLxqrڛ"VdSKނ+zȩ67^VS7dURl R w)8tF>zo=E{*,`5~qmE A ?FaJ, Ism.!c+Z]. 瞃@ou p'NjKKc]8e lrF4O =+}=}!LIw _5`H!Ɋ5֐VgR=45Aˉ9;b2gcY/ A[ jr6lJEjͥ\Z;d]F2PȮ.4Q {M)aMp|.Z>jnjbv0ؚ<蔒.ѠZ"sAT]\S0FB䧴MQU\#6ץ[;͕'u2b~ h#Ľb.nS~o]^oNZ O!GGpWf[+ iz= m!, oSHlā:z )ܪD"h{ؽ)]'#DᝨVJoҎ_nC"ʤ}*ΐLB0vnԾ&FF7 8*SbwZ" :# 4*dԋފ9hGi`s{?DGF'e#7D'pơX/@[H_!|3$#TboO'^?e5_r{^9~GC2ҝZ5}(m'Q&22cjfvL9waԺo 1p x S$trQIȦ΋HWUŹ:;7KruIt@$OZt n]"d lA7rvEl\%x5D\oK#E5Tq1ZC_$l M2r@HQ=m #Px:CH؜oqkqnҰA 4;ki-v,#y XR=sA<*R 4(fp`v/+lO$I-ԝ!IQ:ڂo* A1R/־h()j jkTPhAU!jcD7%8de,2=nAieؒ-}=.Kk?LU6uy+|;/}sfth%p$;;>bcNX7;᭗ol˝KJu*an)y]HZk5)b?w̗\Ya8qեh̽AZt$l9p-1oY{+˙E]D}+Kw蓄=/$ ! /dWA"LHG\afen>6ENJAQ5 [D.3(;5 ()kB3E+U嚏/uɈj}2% -nc^aHVP|\]'a@Z{k&BZ.Jh1.|5:VWWۑ L Jv&[ _Z,) e񵍾[!lEDP6gZ y8N\hA D3!zPWkI-r#% 5%bM b^ a"5aX?m uGpL^U_Grq׊|>v**|> + #\ӖVVܯMes ;;G_CE/Cx8 u֘iO ܲh{֊JRE v5NfL5 ԌH@iK"ͫ\gn_lm}M[s+ՀNNss+/Rv> FruiBU3,.;'>*cG h)^P ڃ{09wJe#\ud5j5(,37`O 岖4Ujk!Jj/ԫlf P('˻8npISz.5OBDQKuG1pGh>q_t`>EI@3aM):GC`<;Qx~qmH>CE"Q_bثgXq[*b#taLb2 t8{Hב!0] N:]rvn/-uU롾FZʢs o+I :5OB$8_aYLs~Og9ATcm/y5gA7́/ⴲGyY}ƭNq, C/pnC {ɺsf/V@:_( .0VT@5Hg0:Az2ȥGrKLnI _( <`MqH9Dm2] H2Hxt4LYN%6|cӅusb&1J3CVB}^/9 5H FؼBeVn!c8&_+ WV BiZ0s;v =8GzxѼ([<߽H=9y*9'xL6/| :V4bAJw Mct ~JPraGs[tuAl͝ћ)7X9$ (P~ 9R"l1G;peؼn)Ib|cJN\ZG y 갳Pe|$Q[SY75[ڬvbe8x8BM{HFNg[`mBRmXZO8YAORlybTiK!EcNNU-JC##NJbm"֕9J0j ) x>.QttH|jIo$[qh}+;/gb~yUFrQRbh^o jK&ulXHpyӳk#{O-,Y,[+oQ/^e|6R.udѿ~t7HVx}Rii;q%[Z 8p3S5TN ]1*F~pe2dgXFxIy8u5˶3ZA#]0Gҕ48Z_)G|jLoFD&|yAJ)j|gચݖ-)PZǕr$lWύx& y~ث>8EHZ p##tgJc75$d5xPl%l[b8ZBU ˟0{ߛ1\˂OQ1|go]_2y?7#5:m#A75̩Z<;9fO k {``îs9xR0@w@}Heg+et5{(Q;ThR;T1Օ%ee `g J}8Y z wv?:@))7 2¯NJyA0:Z {.UX}v ̂\#) 'A'[&;0+\ȺJU7Un"QQ ̡LT똒u8R㚳6b둏>|#/6a}KCAg\ݰ2J[^45 7l\ s.8u.X<#^iC[4J6ʩgrٜ4@8̋daCdm ^/~G~y D]zV=p9B²r`fm\ ]Fe7 k@y7uhFT > } m&أ=R!0)WĒy[bsnI-v%XFNw5LDFy CNK, V]q*؆^ӖM$Nf#TJIL {Ѥ'0)h;!2idCNswʑQwT ;4,@;10H.,_'ySxG[.uͣ[(b.J'EhB Y]W7:޽OdbI`gRy`ɕ[]R`i0vO*dk7@{d"p1tIi[^Um7dVEzbY&``.>xU&UB3%sϨ<(?_x a%=ͽROljЗDwKpVpwRS¢-@0;O4SֲxӀZPݼA TRy=2 +tjUևS:HY2IO ~`!&]կ؅w0/D:j{Hh<^Vjz6.PҠ]6ހnp!t[„E% w _E4S;Pb^ qa`O 7!KhnRV3'- Qa9^A=Uډzd@+@E-)YȌf6g(d~\\=3EQ7~P6g w)@[o=mbaȗ18X5& ߘ9?ʞ\ Gr;4x)2x-RTM !72&y4~Ixg+@?[;MOA0Sfm>oz\B48th}Va5(Fvt|ZcttK{08NAnAav/{g}"^\@NE T]{}d!)JM&eɱ)d l]?)rl6x^o\!qEC>N`3WI*7h^[Z:JJPM #Y /a6 iY#xk=LMչh>s,NϳI ٳy>B)]Ьƴvkd$?I.ڥ3@Ln#*}$pp{ t̃FBjjcVp?E@jwD+, j#K}/Z? yz *o77[K|)^G7~1&މ} ;%0LkqK|Ww0K<0qc}4ym}HbY`gHi.]~CWmefyo:"8~!P=?6(jʁ!n nE^^&GA9`Z}햘5ȹ(\^pi0y7 H%.!F.\(Ʈ<N;}A e %QD :jWoN2ZGZAKUi 4zIھjPZ ڸ,숾f^ԩ5331E‰@" vY1Βp";#*ퟅsO$ucM! :D.?|S ]/ ẐĤzInvupʍ+Gdϼzɡ9Ax+\HHvN ;6zz$n/xo''SEAǾ ;r|hPtyp w=4}l2A9*f4/>/nE5TTar&h&-{LeTS<={L5 Hc>LƘyw4urcP!c<5<}=s'y&$<*}T0Yo]~v|gv6 ̅e څkk]pIJuWǍ"UDE*gh7s [.*Ȗ8x]z9Bo/;uaq-Zb7(yx S|OzՉ,9;M_w(,rЖ[ 2'7HC>|oJdgfq |7SHf g Q{;gqC6dud+6cve! Uj#˦q˙@xʆo9OLPuzRb;n?)~Tfœ}{a^Wv }7IEһZ8[PostW,w&/>g,aQiɣ+yOUu [XmQ 2̕ijć~P3BcAIAhPL` su:=GOpc59ū*GKhbq48rf] a*h!G,HH՝&IMŲ&ЙI7J4yZM. "DW1B7 =po >GR| |aY*W;,V]Yo" d,vbc^eCo \X 6βl\B>i\)UeWt>d⟣D=Z#&`O4Z|$=5"j23Oﰇŕ;1]T ؖS.GM#/bHi-:n沎_^06 ߣ:tK뫶C\6#}Lʡ놰:ãn38?L9=oxتu^jŝ^)b5ػPpd n"ba9U37~$VZh~qj1,73n,RBa/A]l*w2&~5 "$yi нo4;t}/@:MW8zmsԨ8abK2D…yskS:0nRMyÇ.-_OӍ8t%Ǩp;4%ӏD,vfєe}&1~hP-^T};T:)vl_d+F!gJ㠾x+TJ_+5\@*J&G@׈ 47:W>t͒#~㸈˜#L;Qh T!n9ĭHXnT`#QdklyM"dՑk0IVZzX\sSin0C^\% %bVD.aIc}R3]ĺT1N4EEHFsSe(`rbx-Tig~}v\a;H&To(q8x#]{_rag)Bo~ʥIT{{t%\zl}0G M41CW {AhD/]g ԇ'd8CXD|IhʌeȋvPyvH:sᄷ1w֗"*DYvR1{=ܭkL+>?(5 .K.klK/HNVB;=˚_ #N_u.Ͽ_鍝yݿ[D;$ vl%v-`"LZ8{a22P1dѻY=ꡳugъsKEO1BroA#=o1T!i}:X$AcHL0fJpNҗܞuIJ&Ԙ+&Y;gTdYv# -a'a$a CQ F0efE>VJnyִW3ãKezSoMIn!jJ+ᤖs@t0fE*|~н}ӑ,(Pɏi$`9"'x!ϊ3Xq.y~3<%Gu c,E|Г҇+^d>?eVp3Ui RHAP|՞VQIiL]!Ƅd4V [7^t)ٛiOG5@+e,j X!. h\aɡNة>UA̽?Ven{xp^<to۲5*q]bF"ApN9]@}|{I|X"̱8/5r=%@ݬ"eT'gԷg5 o󾜋I(י{ >1j`"`P `>-դ`#r.^l8 Mw܈cƯv96_D \Ռd$\.@2㕏r(݂ mk*^X捯Y4{r)Jz<<S!aUS;*~h CvebQ|@-]x"!{vdBSCd譒sX>Ix",בLڎ;`XJq Prhw6KkvE,^9>-zVip`~K rNR aR-zilGC <΂zsqmxגZԄbXNqtOĺhN : O:(i:z :`8? Jq*MĐb`|=yZYxvا=(4i'"WPK5#l%X|An Wjk?Ku[?Ӓ'z(Bvf`(m#ZsM=bo:-p7Ժ:jh} Fa=BsH{EћwU 8zX?qO֛ OE_"gu9Oj{OF 2 > !w0EhiY5˶휍Gˑ}~?ǟFx^hb>M2 ~"Qmk!5RH"F膿DCO¿530vӰye3{".*h}0/″3 KkA UQ͜A ZuGK]rKMik(z5!damW>3Znh=ׇ";qV_[G׭ˈʒ o.6ǼjRIټQC+W$o}]YP]Ԥ9GTnjrƚpB`p}D.r%Xv)Q\h.lf۲-vf@ :q8XCAK3[%{gWY#B +(BĀ?V|S0:0Ld5PG5?lB\+y \($\0`0mD|OR6t󕼖M'.'x_uVڃ'(?MՍ892 'ÛVzzVM)M!xbAm(͎D^g4uB=0*Q3s'|$\ʡdžh@ Qnvhi˗= U?o_( tEӻ]K4bo[كBlDXm&4WJIN5Pmr/N7$.3?c&p9 2BChKi;zCQ#E$uŒ@U?VЏA޿c^vkf KExA\ҿ;4i@U8>Qǀ6x{uHVbr9!Wg0;7YEG0FBC% 6ɼXYF 8߈9BI|/K-c&-oBYm044$IeļKf7WKf}X3֜' N##SXT׮-|',TxBj; R)kT E ݞ-oDdykRprs96k!Yrg VÌk7*8+j-oS̶Wb(ߛ+` ZJͶQV8OcpInD)x?2C02[y5tV)B7Zp N:d( g8dlדqx+UkUCfSR@,b8LrH#s''SĘ;US/;D2/0;X FTk)ժ36UH%MS4tЩSO"TBtNc4Mׇ8!&;~m\8 P3M,1/9$玩 ^s'ZuA@{Bgˎ%gҩf!x9WIH7t.4iQXgBg[ _dz֡_te^TDLr0K[&4؊qWsk'uQo5nAuN#+mP!kf5w=T<>lG ۽$𧊱 >@K9#R!oF t'!ɞHr8$c'bpL%vyGV)B5B.?b@|NOm);#7|X0%/U\ ˜3*=tvo/IS稃9ܡ㭥aZp/H{Ku|?j@vs7I tWaڷL-;إh??]C,@|+{vFOp oՔqB3p(Fg*0EB©gttW@\yoQ) 96<̨,>K9%vڲ(g3s>&&Ncsm<ҦJ=3qg^b GO} wR9p (U2W$nߴ6pgŬz.cײ4uu"ܭ^0G 򻶁1\MMA]C=MPQX\wtRu$E'N7n mEW#p< =Xԭ@jXszI,lHۯ;AiM<ƤoE`(9NTVj"6\jrl-oS35%BKdǿ6'c8s`HV񓏊J u )pQgH2dMHyNU*F<)O/8B Mc3afC%Q{Cd]9~ >N:f C][VR̺v;!לA^7@unhP܌KNki$5v$8P`(17O/|-3LitqTqMB/#.h,Į(4vF GjPqJ+1r[{y&OSaTV"\ j $pAfbgf>s^ ;TJ(VKoiQXc+In@E v`o<\3flbx+ܫt#=jXS5碝Pgq p3) NK\%؈VYUWs;Hpv }+Ts.fՓ nΧt{kL]2EܚXCWx A(9ݚjLeZԥ\?49k>YH,9/W,۞X̓QZ݇̂]cut Wiy:WtD[VafbbPf06<Wu"ԧ8&qp)l)C$B]V3JeS3=xR':,5c|׀ZI(̎~ܖfV=AQcb ") J<#VosPt:C{ |/3' ䷆!&CFg|aB򣆧o? t0gn]}CmIA {( cހ 8v۾ѵx\$u^Ǐ[:ddj|U2#08pB2Iy꺀C+J#8щܖl`iZA kQ")w:J dxz]t89;|sV[UN Mv7\ު?0 ӟ~S1:` +\aga;jxKL+#+셖0?K P1'cis](ӿFw]T`OQx䝆GD .eOBD%ö%IG._fU8) :{@K&(jv r:'S?Mu>P<D͋3=)xaDE4guP4n{ HJ*n}S \}@'0F޷ǕCg:%qIZl|벢dmIs4].@0qwmEwE~pӢ"|ѻ5ٕ%cUB^&nujy%5A#nG )Ҩ.ԈDL\4p<4ER %ZZw6 ' N*F*NI,mAOQEߡ+62'p\' yM ,&ּ8Ln4p6_h( ldr*Ņ.<0  FDu``?Z?A=3 d2QΫ5!يk:%:qVVLh^135rd܂ZBKj #zFEJtXE5b)kۆx(#l;h\j6~"4XNk} ?oٙ SՊwL !e*BP+jm{ic!|cvYJ-ee{3Қo)׆K .>^ V &Z@#` Y wDhӺ{ Jt9W Sr1ƞ+>TJ6wSma6$mU!OG9ҋ.L"W1_ @:v*zm!X#Y YPl6uڔNYpZː9 F=υ""amHLAayCK =ku@{ #L TϺ4V>xd}T{8.F|h{? B}?U4Qd'5V 'milGJh+l-#Qi,#q.g1ZBx&BU3kB6w@BC_Ak2} q yT"TC1ҷ9N=ʗ~ 48M+Rש7閟6[KJ*bS1TpqU䓤بp_ [ڬTտ(`[t7}o"bSmf󾓖Y5V 2)z"R@yfA!S3 vEV4D0]Foty"X|FEPl?bS>绛\B$^%1=/=2c]>I6)-MGCr^ j"RD#>&dsE X)Wa=y")YΑgh#D^2zp {/c-Q ̀‰+l(Wmhvaܷ3n'm{.$% U{uQ7dKKGaցh>6]mxLqc12CMg6-|F91P3 t>jd~\䧹d^\r%Ź =.*/ d>G|:פ tQo>ӶS8/̡d]3/%]CT%Όul( sQт1\1fh щXk1F?}ELcpX2@6"|[Ӣ*{f֔'W'y,0^޺ WUURb*x̂ZZ>3Ѱ4{d7 ȏ+3m x;0}1ƸFXNZ_tCׅ 7;s$ctJ?K/>臻s9lUC?!}݉nx={>ʘT:UNP].6 NN~O|ҸLPhcxڴ l4Gq;;!oj.hS@Ie#!WZEFr$$,`mRIER%"'8C<`}l [Kq&Q”#*D\d jJǾlfПx:jLj?"vQ /m:`j?Gh3jUP=F'B%Nt 4TR=ZpjRȲ<Ͻ?7x AIg Dj B~}N&@eG[oـ['AE 4丘s.2/l0RyO&bc.N@6h6䖋>q<ИJ 9S(%qWoFcC.z\) %$os|ONʬ|q$xMàqLPr%'=,w+4aݻYbls*b.r#vvwkVՏSK"4hiˊ-HMԡuk+ol UR>me#n_i7 _t;ZCX!)=ԒIy d8,)TrWl9f $UBt y/qMȹWqOXPx}'uRSq BZSz{YtXhZ׃7D"# tf\_dUrų/v1A b0pZjY4mE\Rq3;EO 6Q!IA9ApE ׅdAr(=>p@Z;nV_l2Bx޷r7n PvvZY9%3i_wW ewkkV&,{lٖ!zBth"Fԫ՟w;x'2 [에&ql:FF^^ 3jc |k\>|=}nz! -Q':@vSbzV%#!'8Alc%xćaJh#I6lRvt6Q4\4 ?s"tG QtWY'-Cl00_Z~'r.+ߥ]x: ߃R 4ʴؚ(Z/\RO`Tۨ~+H e.e[\׊Fv3l" N !qc{&9Q:U{;M 2$%ƒ:_*[inAM0,ӕL›krnHoD/$pK܀Ё71l^h*I*1a$/YUVO'۝x!wpJxw&"V??؈<6r=wHmCIf ՟ c㘆sCb:)m9Ygȉ'zOfO9vCJ {Z¾1%: )A"Wj<\X+*hj ON :5>q NsFGj w|}?%nx̻K’8R IỈ3 _r߯g"F^M{^%H1è' ~x Qȼb9d;z$Fݭf JOnܘ_GUxe_@^%vZ,Fq8qEIiL0zqĂnS{lH_e:HJ S`t0k3QbruUyAlLVzFULޒ5|J) Ycړ:E`Wl]18u=^Vͧ2edjM&S鯒wQJ x$*>Rg6<~gL[-%ry_ PPi 4}C7D$d}H]PdA쿓Ếg`KE"ݣ+R;&s鿊/%+'3Ӛ>OdgO@}dlS4z7[".^]RLt8Ngl2db2Mgk>w*xQ9p9ސ=H /2uua9DH]EFe Uekw7,mtԶmu3RaN0 V6{Xi{qB5ml#uʝ: Y+xOIOx*Hb&(fl OG?#CN)ƢQ 36nɐ/+ꭨtWJ-D 2A,L63 ixUOwC+9.+Ph"*K9-p(Mx7JoW394av{AUE)=uuXv~b/Q41 39ٺ2Cu@K!MBשWSWQ󷀣 Y8\E#YXe|؜zs|U< ۏMCoi;X[Z3T C.1\Y%#0J~"2-N-mң*‹677D5_ɻ`p8OUieGlv<.h.=lP. n"IU=ur݀]Fh1dk- "i,ۋ@sanr\1s/OԟF~}:x L鴠.4[ ۭÚǕzX;R'S֞gԊIxc$#@ZpaG[yŪx$\6Lh E$j*r֙Y=e5LBd6ˆ DF'=E5 ^T'E+YdZ{6!kfʹL^YoEh\ MVΊ<1C}f8Nbt{YgImAy3M/OxxU-}?E# ,KWR/ibruZӷB\Zv*VR'1~3QD4BEcR`]Pr.}nab47dĶz qo^ښ) ^ wKK >=\YR OdLA|snhU$D"jK.4Mǻ6sV`6vՈǹwXt;< ZHK{J0kQ4\j7I` knbOFFiYG .>:3CS&LWJ̇ڙrQ#/O]E'ratS%E{VZU4_ehcXФ]-|d?Hn _#-G3jlb@6@|9Orz(m;R*΅Bi 2"9m`Z8q0Ɯ?=ߒ`(&nܙe _FXyez{ ء%}2"B56?=_qWL;"T/o;\U3K|ؖ>T~5 swg@Bѱ<)1!㥑-NgMJ0ABbto MT΄~ANs&ϮXXgК_)bfV%elUWKJ,M7[Z6V "PUL6'gs֫+[<Lj}Y@*;lU:q~* B .qҢzqlu#ξ&>OF+`?`fH6>gQ}`iNNA;F @t8QÉ8i[+:ձ")G駎ߜ#Uxhėm Hp0o_.Vt:A+.t!B[l&.@]:;h0y8$ gnF1 I}+|OeĴ~Ff09B!B/Q\]$EYk EӼ)pCax_ngi$;=mRROd{)_FSm^)^r[2DBs'V%pF.:>a7Ms>!%)`ok} l)㻵D󖅋[^PoI@N>i)@K0 qR*#Crjo$-;\)gsk eq`.1 J3_O #BMS.Z{}Ǧ= ݌1qړhj65M9d/;~<Hc{RS sY>Mbr0'ߣf |ڰyQ9nԽQZ8Z7՜|s8HVORs G4.w<\n1B4pX:`ϵ2)֦}uI|Q>]}qZm.0,Q[N9\BFaHksU+eqUg]D2Gfq;HQX<.@_n% 8Ev<P9f?$vv\'aqIU"h_Ի >YYln8-oT"k .2(CXdupu[L*sv⢔aah$ֶ3ml|FcqW6tƵ([H} ~-8 xPO?]0=&faO>MYVdX?ajOV2N\EG(l]Ho(ʅkm{V.ݩڅ){jT,WX>TB9b R5)ƘWIuJI݃ b՚gR* 3]*'&1qF]yc&k 6B9jq.}5l1{4k%҉dJ>\Ug7O/ HǓQ;ܴ'͂ NlJ,|YtӉCnћ_n,L5%jp'ڗ`Fz;bSo?DL4)$y.\*!c`<\n}=jߠ<35@Bk^"ki(츲psYv9glZVO-Vծ"Nq) ^]Bs.b?e$"/ N|EtKQT;wul.v4y$ znĆ{C1 ly3@ w8Iab%^ +ڈc11X>ЎL@zŖHfT7 8 ٭P lR;Ǒ}'$MX:GEG -]@:@YVRbТtw&))΅sV'6QNS̆ik!}CV]G(c6UŁ.=Qcu,]?!í%".VC-Z|Eװo4 (߯3M^\ظEL4Ge5iQXFδ-3_Mr~%|1 Ps b=H_ ȲpXnݐ`N4]}U_DQ#3hrܲ<Ȋ lyF7He ^#u; -7. i5.dĺWaivm~ҡjLMYBU9C$Vqj.^ [,ΟD'@[:I 33πU|e% #疽I_1I~zRɥ#͔gMĎZzu8-;5 \90Yb!^[߬"88? #a:zopf ycAs~Io;\vsЋ*m&`}ET^tNe%ΣK5$@lXk5j XYL[E"Lx:uo-މoX8ZN,r@3d=4%z;+\A& ޯ2y#_ 26Cq~BX(-HRJZ^薇d@WV.p-2GDiJs4l[YMP?&pBJp?&i _xK۞.PV-x02]CST{l<:$9 aݙhtD"[w١|$!wp"*tْ-Ar} `-d(our0u56/?fYgdLM?n^PJ 7zZ [='Ft(۹uqM/FЪۯuw4H vml5 V R'10Љp#O%|^<<(vs$U}1vh;;aN6^fafB6+,VN>1uRM!&E+Owl+tӘ$!I"Q-C0^>t#-' $&ُ`wP}I\x j=gfx2פ*>(𯋰hu{cuOrE^iKXWRҥd)n ڬ@@IUIvPGVh$D\)qM;m2G&4m _y;ngo-k*L2C1Gߺ A!!u}l"Of'{Aʺ󲑼-k5ZW{g5ݫ?9sCz/9Eoj(>8B`Q'hu&F5VE JUR0=ĠG"30ar1Yzk m, h.Y Jd;0s&vrw!_,DDK<[{Ƨ$ԦHn}Bc|G9ZGj\ȹEj6 `VXG~Fe7Wr)k<8׺]6Bm5-=|li%r+?˵F(QwD?+'W.e#q=kgGXc4unCH|]WpO@JMZEO>75O.Uw g I[p*uUs/K{UW1̭K%K!* QAF_Kii9x]۔{p\p v'%L0_3'VMmJ 3+h rޡ6)*lFG/i^dOvkd*Sc 4@x4 Mu>ؖ) ( yl sgd^UZaÚ Lc *2Ɉɦ؆B8ZKR&cME DjH(`V8Vs?{믬QrO;IѸ ^Ė TBx8Ώ )?4w?OCN;DEZR9쏢[c_-78!uam pPn̤S7zOA%b9=۝,& I Ê.Uyih&:R.Ĥj̃e3'L ׵Q(\$1fHQCqd X:@9:8$qHhzǗ9 k=NyyG<褂Um|[Sc^wт{f R䓿#WRW"rKjnpE3*Cdӂ]]޶J}Py&w?ͦ_U&Q ]4$rz Rr'N{D {u˝eD-k3tfL ^nss^6oz@8RX>.LJD2}pm55g,IHM,ǧbtu]D cKwE9I>M]XJ{\k4=Kb۝1usd҉$`ٚ!{4],BNS; -s;]Mħ>vۉsE<>I4k*X~}*71$_䢡>N!Эtev $Ĩfzymu.=F긹l_=+zm.T+VH^2C yd3=/ܮ&6r*h)n o )y;%?6Yvd-C;P-LT3$.ዝB匃-X*T(`2&0i;FvvcNjz;kۼb@E pgWz+|Kn>0q=y%+gT I-6Cye'AroTŗ7!~ }80©1 Ք, t49Pp*+!+roݒŮ&!t6'+J]njRE BѽX뤀?hgXҮ!W9p p=zvHL%k,8^iet2*?@QԍY[roW^2b:oKdY z eLCk% ߃; D 5rTԟ@sPj f/u10+{$Xe Le FIŃIʌY8n])\OzI)sFu~IF nJ0Z y~_7F \&=@?p4x&|ɠԲ116ןd~YD] iF2ȉy􉈰eo7;FReqڔkS,I4;ﲁqk~gJquQ*ei0b[@)BDFy dn_FԛE@Q]jjp+eæ rF.MKܥ$,g[`׬dk'h M4p}iaTőzdfOQDʖ<=JQXm, KքMBI<2&(4MěG#xgшЭ=ufO偅.! ǜk,ҩA+nk:rea̋G *f*ǻJ.qi"PFmr>ȀbI s)dB0GG[fbaXԷK\?)HG/I`p[ք ]zϳ-őTIy LI {+$%œbZŶZą1L ɘYh ڿ~($W̡;Lٲsr9 |^z\EL^nw~,18݋vĕVSx Boos#Bsxiz/VZOr~`30%KDLݠCόODMg'W^Hŵ9TPh!ü?LQ=#A~Vm* h+_5-F{cw(ہ=rDڿ9CnO(-FJL]Њ3zYjo!fp/rX rJ KZBUJfyC(v{4[ Iuyc&̏=6x Ks4a^*!d4 | Ύhyy&EP{v#?ju sJ>X,E/*>Ne[|<5^3mfPح2Wh ; "2\bF(ٻB.s(VN5x!Qqd 4/m`{%DMC5:b@"mbE!ē+[ Tt[iXXaly }˪JdM]u Fh^h1 2,}αha,#ڝ`7 \.'!@r+c\Msn%=薐(;H85f,7G>H=#\Eޖ0dNVO8î䟋4ۃ\egل ̡Sx`=y#KRH= ٠s.-IJ|+;:rK%l.BatsR)CiBf=&lQyeI&!T-YH#??*P$ YHPJ]hj{pl3QEYrɊJEja e0Rw3^,TGe^>%~*:#E%$BрR̬nmUaS QUm7/?zU}{;J;N:%EƜn,fϕ?Prx~Ոvf3itILx J*}/AX&PYo1% Ն1Җ^H=%kvm9!,ʕ dZ{E,S3T(^e>wm;qUs\8 2^f!6dH'oAZÜyum?ruon ѹsY}–~y+d漅t*q266+y+@"5G 6Oɥ)p(waa,|o ~ gujIlYqj8GV{kl& l=- X_rfO:O 1?sP ۇFðո4U_o%˿x \硙U` [+)phdh͵QKZp'*R?$ߣ N*و@ƻqzM3y" e" =a7D}G,̉Cܕ5H$=%: @&s ]w`Rmfxz_߽iv/~ZEG7U3NHt٤K9kiǫT%)K{ \Q3?(YݏmT#ֵү w$rZ0^,%t.Kuz_joc @`klP S7NݑcąNQ"R5щѓi³3 .;K{~G>Lbr?"!0|(Pq^ӝo,Ѯjch2ץn;G/&m@'g& Ή[ 6D)g7={uK><==Ĺ4Yc&m Tgbn!-@j4I2WH{pw2,{ Xc!94Tת 4 w3_ak;V>ӟcL>Sctwyhޓ\"FƜ,!B'l+HsIpZ RYPĶlHg'd>ƀ<e4+c:o},qϡӀK}az[jd8hqZNa¨xD^0gUs1P3מ``EKG,`?R|+e'U#6F!j=.}?FuUo%՛*ކ:yYLꠛ=[9|Uspo2Prӳg%?B c+pr0 rA:`?<>4P.2ORpӎ'I)N2eu>=iG M/X7:FX2Q7͜au7F^ S֗2ꪰ 6CN'G&9྆-PP1[fY-W3KR?x}c6[lPMRjQTW$.EILFއ|2&x`U;sRY?S{g+%]tm`ͨ=^&K_cAc > "XCQN\/GFO$=Yfh1NnKdo$SRZu@f _YC]gUX|}dXRT e gn1Y[.9s1{cNKybEm:5,:MJGKбQs6w Ai޺ky0UL7[\"}n!V_c n 4k+>aN8!ZqZUthT7Va]ǖDPfj1֔\YC*ڏq+mgy-yBG~<2}`{&ŒL&l!wr ;сtP#?j'{;'x7:vhZpV&tؽJV!$@aex̓)qQP r>ۃ7qp-DUKϜᐃMvP-I- 1k D@dk' azA_SA+f:eXhY? *?opXTGH/2SQ㇔qUTj:h =Ra/U܁'exԢ~>O+C^م^|^10+ ag1-..6RO䶓}>rQie'zBI(RW_rٞ9]'&s_‹ICbƜFh9DTb#1^IM [sVbGxv91re(1(R%FdXZe{ْ"bn{w:_5pN^vBR3B,0p@xh{9 9RuweQvݚŁ[ܠ!XaRA! .KԮi***ъ$kZ΁do"WӶd m'l +>z_d(<_嚕 iPn[kBf'9ǐ䍲uԹNm>)% zgаD&xqP{tN<{l5d^oT/0k|&@ g6T8*Y1Ai112 riBtB `ً7d?@Z\i l 3/O̷y_ɡ١ oWҲ|y+ #m!=a?+1QgO<9ocQchd2t0}day87O1BMlE7$j#xw=̫+y zUAt}prFJskWPq>`5~<ÂfeH?lg;q{5Hej̻Z \uOTr1q2pT1+'z9ڂD*m)^4墾]"8vtE7@6CdDJ:{?Q~Pܳ0 p2XEv>g"=;AT,|M =d˜t%QC332"4ol61 Ojdcn:oi~eM&Y1a!Dr6c~$Hpư̸4(DƑ.9 Uzd?22PTO/L((W5BJg]/̜--RDŽG #}g_߷⍧'-10'&_ I}Jeݳ6v0rv[No'6GsiJ :6J"k06@:ԩFb3oAt!tYOw}R`1kp?<B4Yh4r׋6g\wG$x3}$GEWGlYKbx+ '_QFFZ/hp$Dܕ+%/ djCI .!ia6 p7h*#zSl߼SP. UōqF Osx^ZM|=m L;:ʴ%4toRe4alqin|jF0W!N-EDg$0%KKL"U#ҏi*G,aVAdHѷ( %@"+muԕ*Z٬.]tus*Tyk{cg\XlJ.Vё"5/x$W K29ӹSQt0֜LXt V'ՈH@M(5 sb77oI{~xe^ܣ> oeR=JH1L\4iIU%a) kB.j1LVo !!^b/8d TO}i~{݈߳Hl\oTļ|ƤZ#t.!M;z\՞ԛfowx9js-58E'^4|Ʋ8pu媓e Zd惥7W;p UR!49IZUS>6u,9VQL*XSySi)yy=B;8aU1kT S=k\4 |=:,_)ŁO#'̼=궋5?C=t}ܝы%  U<8x+GJE/VPֺ7zI|nZqS^޸m"7彁\ȯ| =m GV An"Gg qFC%;Q{ߧ_J@edKnl4qDٍqoi&@*"0l~?=5߃ô89}ҔIY[WF Jya:9Y)h&6f1nB'g$ xG sN'Nw&?87]՗gEa宰l%Åɢ;jeRXa˜#Q%8L S g.ͬW2<\c} SU`^ݍv!?A?)"#СAv2^9isrtFt\j+gњ%,>^h*ZtOꔽ{R JˡYw ՜d ?FJ ՈU.G9#!8SKQEG pi$Bho#zB<^Y/b.#3/![D,)p+0\EN#4⸰LW6+]yoD+h|f; F&cKySDo-6"([%֞FŠȐfHW#vVD ;Wss-UdWy"P&Q4h|Hi \r$<Fł-+CM_ۮd>RE+JXʫٓWɎ5wMSfEyc{=֋:"%%'ݤv:rj0rxTauhIDOFuUQ象W@%P:b)(]|Sp3&NB%uYWyX YI8R8)[k5띛MoCrY6+Pu<2pRB>9Yn~&Mɩ`aksF罾XymwKF+VͬRSsiyN*>+zs5&_Z| o Ek}h0FA8\~#28,0w\R+RisMe=L-$ԟqy0E&sUv+wF}fxt]җ*Ns؋&kK})X"zd K:%rW)+_>mFRgIb/˥C:uDf3E tW/+ R>㟬AF5N!8qߩTj.BwnQ_MzUQYZ}@& Ew!U†L #:k#|^HQnJ]%5nFÃX ZnѻQ_K@7ȋ)ևpi,]tЎ QnG/| Zw6&?~h  *L҄QgUoKGE2$p+ Eb! _@ylv{#.wDv;~StGSbð6 LHHJ G+o"h(*ZrHKYWa Ku}+J!P!a4m;X79\XI 9fRc% DB s~;k<ɌE ռLwvehn.34l!/ dQI'´^g}uX ozW.pZw%S+L0$c ޜ S8JoTάqA¦tG;ZОXւVlh{3Vb Bo[g&ħմaZ*{ج_pSphUG=ҍYbO(qs[inVzmmN *R;̄Xř0.8#9˄RBF&+Mhô(Sc# 8B0ɓžmiyz:j̐6U<<}8W0x9j)YhIހ nE~uMCB K7DGo0v25žj>ځ#Wp/]F)1>B htLdR3_YBE