summaryrefslogtreecommitdiff
path: root/kernel/user_namespace.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/user_namespace.c')
-rw-r--r--kernel/user_namespace.c147
1 files changed, 128 insertions, 19 deletions
diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c
index 456a6b9fba34..f5975ccf9348 100644
--- a/kernel/user_namespace.c
+++ b/kernel/user_namespace.c
@@ -9,6 +9,7 @@
#include <linux/nsproxy.h>
#include <linux/slab.h>
#include <linux/user_namespace.h>
+#include <linux/proc_fs.h>
#include <linux/highuid.h>
#include <linux/cred.h>
#include <linux/securebits.h>
@@ -26,6 +27,24 @@ static struct kmem_cache *user_ns_cachep __read_mostly;
static bool new_idmap_permitted(struct user_namespace *ns, int cap_setid,
struct uid_gid_map *map);
+static void set_cred_user_ns(struct cred *cred, struct user_namespace *user_ns)
+{
+ /* Start with the same capabilities as init but useless for doing
+ * anything as the capabilities are bound to the new user namespace.
+ */
+ cred->securebits = SECUREBITS_DEFAULT;
+ cred->cap_inheritable = CAP_EMPTY_SET;
+ cred->cap_permitted = CAP_FULL_SET;
+ cred->cap_effective = CAP_FULL_SET;
+ cred->cap_bset = CAP_FULL_SET;
+#ifdef CONFIG_KEYS
+ key_put(cred->request_key_auth);
+ cred->request_key_auth = NULL;
+#endif
+ /* tgcred will be cleared in our caller bc CLONE_THREAD won't be set */
+ cred->user_ns = user_ns;
+}
+
/*
* Create a new user namespace, deriving the creator from the user in the
* passed credentials, and replacing that user with the new root user for the
@@ -39,6 +58,7 @@ int create_user_ns(struct cred *new)
struct user_namespace *ns, *parent_ns = new->user_ns;
kuid_t owner = new->euid;
kgid_t group = new->egid;
+ int ret;
/* The creator needs a mapping in the parent user namespace
* or else we won't be able to reasonably tell userspace who
@@ -52,38 +72,45 @@ int create_user_ns(struct cred *new)
if (!ns)
return -ENOMEM;
+ ret = proc_alloc_inum(&ns->proc_inum);
+ if (ret) {
+ kmem_cache_free(user_ns_cachep, ns);
+ return ret;
+ }
+
kref_init(&ns->kref);
+ /* Leave the new->user_ns reference with the new user namespace. */
ns->parent = parent_ns;
ns->owner = owner;
ns->group = group;
- /* Start with the same capabilities as init but useless for doing
- * anything as the capabilities are bound to the new user namespace.
- */
- new->securebits = SECUREBITS_DEFAULT;
- new->cap_inheritable = CAP_EMPTY_SET;
- new->cap_permitted = CAP_FULL_SET;
- new->cap_effective = CAP_FULL_SET;
- new->cap_bset = CAP_FULL_SET;
-#ifdef CONFIG_KEYS
- key_put(new->request_key_auth);
- new->request_key_auth = NULL;
-#endif
- /* tgcred will be cleared in our caller bc CLONE_THREAD won't be set */
-
- /* Leave the new->user_ns reference with the new user namespace. */
- /* Leave the reference to our user_ns with the new cred. */
- new->user_ns = ns;
+ set_cred_user_ns(new, ns);
return 0;
}
+int unshare_userns(unsigned long unshare_flags, struct cred **new_cred)
+{
+ struct cred *cred;
+
+ if (!(unshare_flags & CLONE_NEWUSER))
+ return 0;
+
+ cred = prepare_creds();
+ if (!cred)
+ return -ENOMEM;
+
+ *new_cred = cred;
+ return create_user_ns(cred);
+}
+
void free_user_ns(struct kref *kref)
{
struct user_namespace *parent, *ns =
container_of(kref, struct user_namespace, kref);
parent = ns->parent;
+ proc_free_inum(ns->proc_inum);
kmem_cache_free(user_ns_cachep, ns);
put_user_ns(parent);
}
@@ -372,7 +399,7 @@ static int uid_m_show(struct seq_file *seq, void *v)
struct user_namespace *lower_ns;
uid_t lower;
- lower_ns = current_user_ns();
+ lower_ns = seq_user_ns(seq);
if ((lower_ns == ns) && lower_ns->parent)
lower_ns = lower_ns->parent;
@@ -393,7 +420,7 @@ static int gid_m_show(struct seq_file *seq, void *v)
struct user_namespace *lower_ns;
gid_t lower;
- lower_ns = current_user_ns();
+ lower_ns = seq_user_ns(seq);
if ((lower_ns == ns) && lower_ns->parent)
lower_ns = lower_ns->parent;
@@ -669,10 +696,14 @@ ssize_t proc_uid_map_write(struct file *file, const char __user *buf, size_t siz
{
struct seq_file *seq = file->private_data;
struct user_namespace *ns = seq->private;
+ struct user_namespace *seq_ns = seq_user_ns(seq);
if (!ns->parent)
return -EPERM;
+ if ((seq_ns != ns) && (seq_ns != ns->parent))
+ return -EPERM;
+
return map_write(file, buf, size, ppos, CAP_SETUID,
&ns->uid_map, &ns->parent->uid_map);
}
@@ -681,10 +712,14 @@ ssize_t proc_gid_map_write(struct file *file, const char __user *buf, size_t siz
{
struct seq_file *seq = file->private_data;
struct user_namespace *ns = seq->private;
+ struct user_namespace *seq_ns = seq_user_ns(seq);
if (!ns->parent)
return -EPERM;
+ if ((seq_ns != ns) && (seq_ns != ns->parent))
+ return -EPERM;
+
return map_write(file, buf, size, ppos, CAP_SETGID,
&ns->gid_map, &ns->parent->gid_map);
}
@@ -709,6 +744,21 @@ ssize_t proc_projid_map_write(struct file *file, const char __user *buf, size_t
static bool new_idmap_permitted(struct user_namespace *ns, int cap_setid,
struct uid_gid_map *new_map)
{
+ /* Allow mapping to your own filesystem ids */
+ if ((new_map->nr_extents == 1) && (new_map->extent[0].count == 1)) {
+ u32 id = new_map->extent[0].lower_first;
+ if (cap_setid == CAP_SETUID) {
+ kuid_t uid = make_kuid(ns->parent, id);
+ if (uid_eq(uid, current_fsuid()))
+ return true;
+ }
+ else if (cap_setid == CAP_SETGID) {
+ kgid_t gid = make_kgid(ns->parent, id);
+ if (gid_eq(gid, current_fsgid()))
+ return true;
+ }
+ }
+
/* Allow anyone to set a mapping that doesn't require privilege */
if (!cap_valid(cap_setid))
return true;
@@ -722,6 +772,65 @@ static bool new_idmap_permitted(struct user_namespace *ns, int cap_setid,
return false;
}
+static void *userns_get(struct task_struct *task)
+{
+ struct user_namespace *user_ns;
+
+ rcu_read_lock();
+ user_ns = get_user_ns(__task_cred(task)->user_ns);
+ rcu_read_unlock();
+
+ return user_ns;
+}
+
+static void userns_put(void *ns)
+{
+ put_user_ns(ns);
+}
+
+static int userns_install(struct nsproxy *nsproxy, void *ns)
+{
+ struct user_namespace *user_ns = ns;
+ struct cred *cred;
+
+ /* Don't allow gaining capabilities by reentering
+ * the same user namespace.
+ */
+ if (user_ns == current_user_ns())
+ return -EINVAL;
+
+ /* Threaded many not enter a different user namespace */
+ if (atomic_read(&current->mm->mm_users) > 1)
+ return -EINVAL;
+
+ if (!ns_capable(user_ns, CAP_SYS_ADMIN))
+ return -EPERM;
+
+ cred = prepare_creds();
+ if (!cred)
+ return -ENOMEM;
+
+ put_user_ns(cred->user_ns);
+ set_cred_user_ns(cred, get_user_ns(user_ns));
+
+ return commit_creds(cred);
+}
+
+static unsigned int userns_inum(void *ns)
+{
+ struct user_namespace *user_ns = ns;
+ return user_ns->proc_inum;
+}
+
+const struct proc_ns_operations userns_operations = {
+ .name = "user",
+ .type = CLONE_NEWUSER,
+ .get = userns_get,
+ .put = userns_put,
+ .install = userns_install,
+ .inum = userns_inum,
+};
+
static __init int user_namespaces_init(void)
{
user_ns_cachep = KMEM_CACHE(user_namespace, SLAB_PANIC);
Lڸƒ)@_WG? bczZ:AWCp]l ͮh5cF=DG<*tkrp^="ZLѻ*@oDʯ[\}WO"'QlE@ }-}J)h@7=(yHyF%<l3=@ gD 7+W'rWoG;`Bu*/ۃ`{Z茘[03}h:3SuzQ׵SnX>W'8}P.v}:ƹ/$Al1SE7I7GU1#gxj)'u 1! X$B0YK8gݾ~5 u +Zß@ 09Q7_ńe~Kz}[f^v=/cWԚ6[alW(eػ5[6 9ǿ͇y(\0p{g,\5 `l"W.Fw^܃ by.v6:|C}(Iz"9*vtcyq ef@X*Ґ=`8` q=@| 9*%|\5|c׺!nuݟ=C?7`GnU'!Q3c,`pc'z${bGehUE$‹j KCU=/OהqiN:fXIh]]t+|w]/LHO}z:s3ZS*,o19g¯t&G9OYM!-g6Zu94P+f6x3t1p2xU% QV]ԈMun=cǀrǵ:'y ~ArDJ奤r- 4yz<|5QZ/+~!6|YN3{KqGhy =O~1}~綞Ϻ<Мfcdpqǯg4[c'^[r#I,=i\0fc3XG]< q((o,#j^p\<>,GYJ,U{[}C> sS'׉ E:iwQ{*X?䯳}U,h)9 xa>8b狵CnVM(})[r=DK8h"yiŜ}㾳GȀ;ȌW (w߻=IE4vVp ~峮~3*A\rDv#`R: 1g-A߁~ 9zZY{Buno( $1P9q϶6vYVϩP6 5` 8r+]茨dעNn<6X>U1xy+TDhk4@pxaQ„P 奞Ye).oUэM5=d)}s ?l/oVFݣ ' G:dSՈ ?֨GɜH G OsK"=e@^>[ERƁlxdy=WG׼aDbb6#Kಛ@\ڛR?]"b3"˪%b)-,y.s^i=o̐&TZi2Y 3+Qd UR` B@Qq.Cuyϝ-ϊ~#)sCA~ﱑ~z;n_ӭ}y ŵTQX(08vԇߕ=_ÓιDUegdu^l/]0_fq GlԋD xG J=jw|C_ӵ? G-^ϰeԼ<' ݩWؒk]yy!ތ@@7(U"^-!NȢYA\mzumdHjn\,ǒnNW.R6X@8u|޷z?KG(9 jU穾<(=Y [e{8&>u[ lq{ k5FaDo~3#+=E~:-u.dAƋ@<51i:a*ׯ5zǻf|[ˍURkɠps%Ws);KL.S1 TYbܝ(v C3/UD z iw*ҞpZ\l ?ps<5ue) d;~Y<=h3F}W"'ձM|K;( gU˰h[D0)2-)4 KZ P/UPsTQxit~B =W0:·Ģ kgO$,(ߗSĢA@(5``)Ab ;pߟ+#r Ps跇 -bi[ľ{cl;,q>6J`_DEWeoEk/?M.x8O`D OjdL^baF*T㫄X988)BT}bڑhsŻ&tnǖB[ Q$ OS?4g7H?f؛9ee)(WD@!!"&6, c[=SOh/ 椉tթڋ`F=xI߿vײ>>ͩh׀h|0(D>*JR8E{A*Arjd4N6!Ox~vK}m҄uA0>ge֭ߊ""}0'D`8mmnܾz8Ge2s+6oǿam%_pIQc9pYPz̘mYZ9˚II8<YGoׂ:=V6*H=l*nE棤r340{q 8_[W;~>bSK▰hP1bc uEt]n=銙.>^^Cӯ¼ [8ݣOMlǢ<yS-3 I[4RL5 hi*ỳ^vE̎8)5#SlDHe!6!HⷩcנV W۷2brCt=(A~ e{]-Ue$a=" 0`S?XW+(nG\ |vQPtQkqI6bFYA/qLߨ=~]J8\l_%ߚFb Tt"vBhxT/E׻_>fw!:[;[;K}XWf1cثg2gCѴ│P ^9Pp^0E]"|>x|ϫ"q Aa;rȁ+ 9I9|z ar{N%QZiώ7FqhȀ>/c >}_FmHkx9l*6>OaBŊ ,UD$۸H{ wdH?(^0-7v,u0E\<-58@l^o}oXTED`֟= zCgqx.98>Zh1B:&Ib!L0 9Pn];A Pd2ֿo*Ujޝ߅TȅB?Y:ix@4@ӓ椅1Ю&|2<ƒ]^:(bqy/.MV!xK+hɚ[WAUj?-sŚ=|Wv2I$f)*ˍIěCEx~J7w1rz --Mz/pB] oLc,n ND(Ϭg>0DRI0aB{,X xM7Б3*ьpMhoVpX[~X$z*ɖg%0㪧< >jMf'^bAPSMtLo"%i1swI٣&3ȝˆ! UcT \ ̚] \yn76Z0suj]9go hw2۱8&ˋx?i$~|[h'3PZbQýnY$uGȱWUFYVЏK Desފ=z<|pq5u%G+HXk<[&9ven$AS̈2(3Bه`:x: 0TW8\AFkEqA&.DE/.#בJE{"Q/>`褈j5Zᅅ3⡯::.ϒN@Nxh5J;XG-vꓙ|V9% K#R};gaUS]xpƟ$>J]339!1TCq2d?S.RAyY2?V < ެWjktAm'b(Bӵ?+E չܿapAdY 'x"gk~~.y[.@1\9"o,Sl Mܕcq$ *})jGh,6`7|KY Qw|105:F(wȦi?9u2'xJx>A`*$_(SU(| YOt4S*Ep}߆J-,,0p%C o#~ *uIC(kŔaV kZ37~u7ks| =ˆ9\bW<>-x 'P3OEQFVp磨P`xPF!Ar7_h9٭':){3h5}Ӥ߭ѵ)*c̏ 8hE6!c~[8 yuЀ C6(7WE-7 Zcd혭axD<)هp4X6G界pNTch ^V*ãc?o?'[VeQâv[[~gkr-V^1cqH"EF";Rh$&LmX=ml2^xy^֗=Ϲ,no(AHX[gbZ JY:!W(L9}pjZN'4/]^)wӌ_3ϪY.SSӺDc&Tp/Asp@ݿlA LՆSe|t;˩vo~hv>ʻf`ؐU- ʎg[-[7SB3\I> ȥBdx(}\&hۅ*37`̹v/]F:v'"b0ƿ>m=J*V@ /,F&!ͯ\>u9_ͿvWHkK+t y0ʘxѭm\AT#k%mHsH8*Ɉtpsƥx5qLWLO6O8.YP% e,h02"Xd0 X̹ jh-{.`R"\5p̌\+z4q޿w_]X .e- IS(t7:8.*+a+ ?Zyvy-ᴮc xǹ fMmrK1dO4ڨcp vQKL'p!zq?0YBz2ܛq1ٻ{v|O1|>J1UǠ~TY<-rsq|BT^ksJ]ZrM-Z,|SZ\W9 t$Ks<( Tk<&.t(Q(oo훡ׅX^zjK)NS)>74r">MHN.85/ &J;$>R)g4"#$Umm(ZG'h{ic]o˽8~5өȹ=R\=f/׿:>9f5vE隕lfwIsv+HĀad-iV.\: ȴʦvq5,R0KXO>+2ܸWNl%J+IK3ySGaOՃb Z }8jp!],Vm*bς)M)) 2LRSĺV~/IxT7Ĝ'URSRc4#21$tIp9pW;Bm`1WQZjjB%Q@[@C|^ ީwF2: jIň]L4`YoaV%76>pn>ht`|;?϶ݗ?D 3ϙAH͝ ő=o~NfPX%|6ll8<gLhhA|U3 pM<>G?[WU|g7ϵSzIR qӈ#YOwM~̚UNi~Awv3>(P=SpG;M!6Czo39 $ B@W">#=RB.'7 ڼDF?y񯞒Yꆧʖ65nQiH fmT_^2=O@s3ҡ$=+tHbF,#A,b]_wk+ C[Vŵ?ȾHzz "[ $yYY^d퓘 bɈq~;gla˺_گCu`en'QPt79A2 DNKc1S=rod_=|ϧ*'A(ۙ5 !͜9~6į=eNH*뮘L|~ Rvx/?|eSdf1I"7?ϯX7/X-zlz"F*5Cp5a';^aKfojG(b)}|XX ǘMڞ5/q{ʶ6n!:NYUGD wH k!HlGVU$⪐~6>e9gLL(.TL'Qo1Ys:v* G8v.xGnk2rlEhф2UJ vn{?1{Ipa 0$֗=]<6 1Iob=9 |FvUhQwGVߴ "9?U((p# `^P9HKt6-6 DŽ70!_6ϗ9ʤH4 n^2m⸘ wA؁&?wd K-)2,u62&(ʇSvaC0fѭ}u3H{x\ 5g`گ0Ҁ5ܗ{Ŭ BI'CL9-zc\o+7܉/ Q0*d^S浄)',?u]ئxqb 1lN/ͅ!d<:N2L﹥i 3T6 [GN'g|d_>9xc\diLGIP;$߱6#塚YEQqzB8Ocdth `?L{vWUW{"t]Q0 S2`(}HeӻaA:\: oc&pB0ᬳªypL:B$ pnۅ' L[՟T{f%5 *y]Fh9*ZS2CSPѭ}VJ'-clXM dSlBiݼD p>%ƒjc%$lemW0@@ځ3ny]^eRfv P2>GHvC";x6T5|Do9t;۶NH a.IԴmA  M9sut?ߥgR:P1//g:Ν:P(iᗅc Ĝ9w [IqjjIjW_ [wbaV 2?oTxp<:Bd_aƒpW{_:wت/ŬAC-99"<ve3(Iˮ?uP^Vm D!'z)/-^=psNk}`!v>>s;$>qQ֑}-76k|d v5XR80Et"YI'En8 _3z;X]|/qp<@Lf ClHwOicL=5Y/``kFVLC@Ors">Jpi9KlUx{X)#{(5=e&SiF=u߻:0ed(K%uk'Owb uXOpqvΜ O茲`]r,#[Tۏ7~x$&?d}y0=ћUŠ)h `@'8ʹ2m Ibh2j6H" |xq74@`Oى}y:bIپcx9jjA`;\ O7,S^ۗiF tVW:壯uG)$O '̿Fe{3%OSQ= AFa7p{&-ӢAj$AhwB_ 4X]bFD'6T7׈ p*@9yp~!3Sϯ_N\_=TGjT%ۥ8ׇ,ilEeN룗?Ph5@y~,#5r3mh)w#frwk'S$!Y:ѫSORZ1K {'Hd Mʩiʘ~2Nsm蹿ښaVe7N±=*[bɈ{΋$LFA5`+4h !cN񹬭=$G%L =L2q=Aw[*E|&ǁl~9ܴh~{TTL|} KBxbg|xtHwoU\+3h#l/=!F1kXdB=lk') A o=0TFh(e$adE`{@`b}̷%b $ӓWIP=ӒWo rNlj'T,KOG5ƤΦ UED/d6/.)j`Ą]Q.ҘO2fqF j(PZMߦK3}Vg+_IR8NV,'[UWEkztQc{0&ǟ;!ݟ_/*ݑI Kh |aɥS7yOt0ۀIow1#ГpA?xN>v_Rdf +~I4~0RﵘE0o#ΠuGoM.T*4Q`읧4\ipqi}eΙjdrdrҩ&zV:v$zDԎ,K0(rhB:結 O1 :NkđvR(@V0-7EΟ!<6@Lp7CDP%~DUBiXbP{s1)}ƃٮSD0 GB;*7c간; Iy1r(  E*GT9*DeBv68B3%~~O4l(T *96`$6,p󂝻lְ Ni?3> *b]`_NIᩅ84oS{dcsj`M),:|)]ݏ?Bۃ\0PǮzaK{]5ԬFVES M. iG;T^d(‚ };鲷E$G|Q>e G0bw`L:^!vDyyy(<4JV7W{8{EZb}dk3Ⱦ1{%EDR"*nNַ8AwAݾINDlIS{XwG b1FdwiR!B,NH+d%s.a﮶IF&y b% D`zV۝0 wn=]@AT ]tr%&xpv0&g~g!f^q82%xA$@zYyIuCo{`0){[)'^Gڎ3_.iBTk-OPg6ŗ;`aSZtE[\Sz \믷%~Sv0`Q5?zc YEf"E9q.N 5\qGj5ۖr+c e}[Vx r;uҧXH?cs!יڣqW/6&-3y K*¼(P6BjjBи-x-a5p#e \"S4w}*8tYAdbEF"5%Iagq(x&Y&?:*"~QvT..Dsk|;1|C=#[r+I'ڊ~i_M:C9U:u^Hu" q!--A 툘| SC# wE@z&ߵ'!\:CcT72;ˎ&* /kZ8gXT 6`%V dyks(!U,|\hۣ戭@)4}ywz,ܭN Y2La9bNre%lP /p38eC"*BΦښzq"c\VшR ?b$ڟdb#2S1I[HLv̈́ |P럺.=NrQyf" XpH]37az~b4c0uK}[T "_>T,\ҳK[9q4ZnSZ# \ʨTL 7 W $$%b?Ybp [us>IG,[gcp ۹yuʻkb,}ʳ)?d]3Q)Z^ßޢ8q2̓12 F禩KoDr R[T%'>nNTF@}q~bP:[ZkrUTz_6N/0,b1 $߂v%6:sruvj;qQۯo]P$ΆiANGFTYPKrLsD*,N@PҬ^Sn?O tOQvB Po˷ ,Fɹ&²F%ecQ -c?^h"d5E_RցMFf/i@ôQkxJ "QN<%ԢFХUC]zQ #ҳG?W%?>3p: >*(;2G1WQ?[.]ZhYtO;߂ׯHEtZZn 3wWC[Mj?+[Ԏǯjs-9Pd)oO2vU'Kdxrh6VrpQty*Z^_Ts{˨XpeGpd 8Oү@v({'=s,C_F̚""p:ZkVƿa?u6>ɾgosQ昣Y0豯 /MjQygk_mzZ<~HIOXbNGx"tZH;wzX8чR%Y+Z(h1x[׺߮"̘$#PH"#){'tQsaLBoMz_iV 6UuX)0|1݅y0>x=]ZX){V@D= RݹZvsBH[1!԰e^V٬b+0{6ĄUóҹYL$bA aK{vKc7foz85b<ٽKxR]?;0$X)̹nWp}*/& !j"q@ǀłUf\7'BbCHʝgK-:L:IȈ-Xws 6F68֜}]DC>N_s='rM]BڄԛC>A;H_Nc?vWeY]TLxtWC|;劎xܱbV2O)^Q1SGӴ3Lpy3aZ悕G*aӤ?nwoBDǯѹYB'v_{35 dmmlY->kSLʷ`g0>5ЮfGf^W 7gFPp4sL?8sρyKtt}8IJ:kC;R~WJ E>) p}OSL^:xiK9!lCcLeD&8]cS! ㋠gs4fO]}1'G ]r,,Ʃ )hsL\Nppxs\1(ł1M%}yra'ef*+E՘ .Z65ʕgӇze&N&dm" R|uu0+!\ ?)hD5,PBbL{mve[ -Xt&NfQ+`r0}+^فfF-\P">&'5e\@TGW%WX" WۍE?^{[<y?|d5`/-wY)鬳F }KR#"@(c{ʻ-ɂwtE`HWZB[ܸ ooF;Zkv5E`fΛ"ݐFJo|&#=N櫻E`|Kl%Kj-nͮ ɼS`UYBoOUQrKN%Ş@WPX]rxyX~K<z/ev?GlBZ1Nw}~8XUo`"Ȍu9s&z~ I;/Ndb?[Jf:qpwTa>G|D4A+SĞwFD?5+pӭ,N> , k5w)n,8Rz?sD9ǜCי[,}o;oK Ҙ"an$bz۩ԁYMH0O|,wTz#Rx hr5a?)] 'fM BmүZA/7I93P~5f3?V8)ߘ(N>P:i5s;g,޿݆;ںZfՏ7^ A$4T{7|m*B2$AٗA;r~}-\-W]5rjo _l.0۠kCx:{_FE dv4~ziV{Soݭ̆5ܝ=#u-v%]Ӣۅ^DvatJQU,Tb `ps9^3S۵t͚{y4N&^!-@ \_ld]AkkKUЛ" yx\/hM 0u/94AϚɚE _U\Щ[3^x=1D~>71i)t]2kdJfąA`Z5f`K}x37~\>vIUs9T5dEKZe+X!$PM*5-s:T-৛Oϻk1c@ h]ZL'*4'o8ow׻o)ˏag?=c{ìG7πےOpCsX!v83* u=M;,@@7:  ιNӶa7?^s7pVq+翉hfM>_Co|1UmnI 8@*d4]&R(I֣ 1@(finiVPGD%u?,(_epn鏖((=JfWVE"p(G&r2͓DZW1m\>|K_w6˨ۏ9K;=PeKCi09A(?{̖NX2Yq}X_,Sk=H'4yFa9 :M P f1tZ8waoGޢ!;T$3E2Ǘ ?]]i֗jo HxVh{˿WzG Ur| ݰs5mj/J}w,d([W2knUcz{LkņAh  gt+-8%610;Сb%TA䯏vG ?xt0 oZ`d ~#P{wVC̀Yc 86,\gjuCRߙWX 鵶Q:'(<ஐh$(z6U@V`[9V%R`_k>ʰPKJb4y΂/!s"q{{4gkIV870u%.FmnaJ*ne 5iј,X4.t>.x_(2A8i gI/hfVstUAhfbXSۜCs\t>>f$ 4x}SQЭ^ǹT$cn!F,JA% 0ߥ Bv.v/%+C"1z 5닝] Kop[N# e:Ej8kz5 k82ĆC?ToJY͋'rSYBD\6Dl/x2y6dZi3!;ֆޏ#6ܝ.t0G$DyΟU0ailIGT~,NqQe1oii)prv%6^*|Sv"%SLݕWlg_Cq^Ƣ?oW&wC8T2&npV(?JEi럇6`*I3ލ'6/T) H0GcPͽ>|h XWj|=wԭX!IYƵg>D}luz 7-Z6L˃+FBFR'p!A:Nu^%+Y?[o¶s}ki_MF,E{W+qo[ o^GW-3=\q?]ڱ-֑!0gm7mQqpP f#o/}ާhf.iv=A G"s 6TE\@w阜/ļy^giF 6&dq=%w($Gv فgkZs B/{P8lB)ZIZ޶X Oae-ޘQ'tΏRw`ud rz@|Vᒴn+@eƇ%, {-""c6=t[w! 3Fm7.u W=3ߍs (hI:Լo1wGJ؎rZl@r)%qEXzQ\'MFvCʾ$~,DܻBUynr7X14Rt-N89iw|Ժ-wH;r:۝OcŞ5lγ}PZ@Hv]uOG31;V!x܂`eְA&S)ߧ1FnMbdD%nfl55&r2h[\%q\FB;={UJ).4srh"DƅNhZrwsXl31f%'eԻ:!6|)Oʂb0zIw`uף2eӻ6zb\p116mvX] n1fQH|6Mg&餯r Ƶ,q[a}}7.Ҝv~ilt\x"xNĒb80^qs08[Hn08t/,c` M4YV[qaJ'f0F[0Py7˜/_Th"LL+_a,gf,dq55{:yS?9OM(GUfVq2-;A m5|bhFuZ2|.'6JduI|=sV)C)4wt8W/pL2;sTob"W| ;gwg*Ә6nȐSb;29/ "#㪀G:ؘs;3L fr%gpRx_/D8ewKCFq,_0iqxp\gKX8+)cvcֳLz4DL,nh=-lb;5Q'hsi\o=޺MU9'+.z滽u)u4!2aokQC9]ζn%~v)w*+:9xhb!z>HQO;ql`nn{g>9G[`k3.Ptv up|$lĘv±G4Si(O3gB{wMk[,YЩ3=g Ly$s q&3%cSNeˎjtaϋ#&o~v\<+H+aif8YŴ&;z8Ďw |sm*("MDP,b+fMZybK)N !ԢPi!J)㱆fYq<;*b[rcsr]ݾ8,45k8ulN 9jgX8]y;T&^&f+z%,G<Ύ4.<߃) kœm03_8?&zzּD([]aǴVxCN"}fw gRģ~9MY5SFgsC!aRg~3_שLF WT`Ws6#?V#J[ Vq\zI1y˷[yLѠ31Tfb3KmI7~8/so)ّJtpd䍷jg zg3n78&f䜇y?mb`l.%>\*]=OOcf wY&>e*d'LEh@j$(C [ ә0b\sK:9]#8p2U B)* 4 y~{w!~ȿ7h"%d]gZD2,+@lc1W}?~A:fOn_z' |jBޚLMe>0I O!H/Ô+/ysQ<`ECK?}lϯ_QUaTʹ"LΉK:<-:nc9ЉT~Hol>©Z7&)\x߮@vqڎ>ti!aE19"e`a:c+S%);\i 58|a) g$,Ֆ@mRξ .0D+G2,῁EyQɱvxo-f(mpep'olK|+ ܠA(BtsWJl4!8`pE[Bs?;>K8\S6$Y$'m}tEYYLdAmrX^@[kpgAwDC3ӯT5N_0Pzق& e(\٧hH ¶!.=ufU6W"tgl ;|ョ4\poԫQ3.K0atмz_GcNqv|bI.kYr&ǏH[+G ?Z%/ "&ϙYV5^17gP;x{|DGel QI7YDNǷ}E{QufI '`VWq./=wǙ$INH  ՎuIBARm31De{z&,aR0gXk(l[Z&)%zH:\rE WAbˠV[h q K nSR'iJ(-Ƒbc4(4J~co6 Nc"8܏&EQ92ya+~x<P˗yn/M=k93a1W8k#~C&}DazknI]FI_dM+8<ɝ.9:-;l滵ocD 7S83:t>ɂBDuEsI߷m{ -(ʙdGRp1HL#(`6lg2Mle첑#Д^U $Ej "'8}Q0Tr`nѺnn0H%%  ׽ j` x-W! =0wǛ82!Si#Ro;ޝْAKz(T0t ZGJp|Ҷ=Տ^ӊDxD쯠J {"<~ BcƽCQ_be,xh,KEaqQ"j:K{.% 43)  HͿKB}u&Rz0]4 \]h.t"*-,]Ry,t>D>97̺8 ryj~+;~cg:/(9_b=3dYgM~r5+ *oj8w5ne _;9yML6iH~\CnvhwPA,YC2t/kw);—'lѺ/',HH:l*Ȍ+ LJ뫉> vvA3w^iS'mA S: Y%o߄5d|(c}үҵr\XbtgڢrŽ4O⿓/cLFq1`h?KBo%"#YwْP&HԶr`X1ͣ(w\oSgȇ>b=EIYJvl|hIl ibqvAˮ Pa󊻰td-/ 1 "-D&f1PJxusw8 Ug1A6:_+~X +T@,V}>Y/q5_}j(q"W1$Ր}%=E)!9k {y֤/|3L|U<d}c0qtm"=zo<[uE5dlF㉨7 YkQ*S(p:͊JO=(`D{]mSyw*Qcd Dvlb>T@|(}ggxr x3p=A\10:Fgх_GGod6*[ޭs\"V,s6Ü 59MNnQu6u\SβCX+lDϫE#ӵG. t$uDL $(fgǟێ@MTdA Ld4%t$>A?$ CBSҚ|~+̓bb /ϐu@Еf"&iQ?TxˆJћPz@.lȒl C?ߩңM^H rJ"v5w/;;{Al/{~o˪Wͻy8h n7P b#,1bֵ.UBT k&[!EGϔwQ+(BH Z0԰wgw2Iqw oܲBX-9f;oə-J˿wvbܗagZr?n*64.83Br-Jf!8[I{U2/?gl:>n\l%!6_|Frå>_`eK!;0(5oOc6(\Fǔw=53C?6#ӟGͬa÷YsOQP (A}YOc:@CW@$K{f {$M w>4 eV~|atUȂzz#(PИ%AVm`tZ檅oХ\cOIZEȿ`.9)-G]k[IЬdo( R H1Sdzz7tHǪ$w)h|&i"0mRRD9ɣ1"HT"D:DcHZ H(eSOkH>B a RKI4`] ]$DᣟWWOBU@ p3X~A7~>Ϲݚ/)QA[n{8N7etk8_;˃ & K`ǶTE_cdc7Iѯp0a?d2l??*YK݂o.e&O 9CK%>ҝ$z?g63 mcjH c$PW= 4FeS8 oe:Y_դw_ɤ\v{Fϯ1nu?Z'ힿE9Eqye)FgwǛ ~06}Vaa!-|s]o17](w-vFUU`x'9p>~:wPVՏ>_olw`Y߷م!c#}ޫ|p_^}-99nL?Iq}p2 %^,||3=M'>xUJl_sï78Q%pYX' ^7Q|v%8/sFˬ).gfTr U NafpӯwOa߯>WzpÏwU e (]>muş̩A9(ȗPzʧ0 ި/[:Coy[Z0S/Lyj']`+f~/ ز80 ~%:{ʖqFSJd?'GuI=~_ogV/Pͱ΢H@/BQKx2߰ģZ+ǫF`d\?;Z'X9lP_oCDȀwQDJ+귈JliRE\RVŖx+~|+\7gd{E-#-?(XZ߶tXg~M(5N2M;-A 5 8Wnv.#BN \Td|Ý(? t! Յ|g?Є}D:kVyuW?271WyCISC6KspQe,8LJtk^:ire8| ^i`ï.=,WzY#_[vNvC#g|_o(pGv7m-e{A͘IMap~{\IVԶ? <ݽ?}^k+3Zp!V-\+g(@_c~WzDž&N\K!o gKqo=.xO./,ԩ0UmlxosSXwQxv";Lt~24Ӷ.ܑ\8J*N7rwO!S />evty=Fh6#Ww[A}oh$7d: } rF rpƕӌ4J{Zgk֦ LVnI׿!dW݅q䠬|KcŮKCw{9e|%GPZR0(<#2,j/OY؊Z"& ?EM_!~=p]_{ROn~\?.z9ULzݱ֎ٰ?=FƦqx|zAJ\{L<4vJcYpq Jf574 KGӹ>U-{u.lك뷪N#Ϣ:mxT.j-Uٙ4C򾮜HoxYj45cGN5Wgc[Kh1"f{`7bs ʽAf=NSX=1EO!Qrېz)_uy3|^KD1#gNt9R㷵( .fANx/` &$̡%"f}G)T CDEq ï' CX ?=_o+`F k^AMP?_u1K?v.uFu0xY"NPl):nA'u zyYN :0a nqehh}zc7~#sv_0xgg>|AHWD 'hYAm VYNhA/Ga;6ZHDٰ(;#@O2+?Ҙq|AO:a8 _w1EFOe64@6Oo =h6~rs~' pDm_\}Cnl>a7ze*36XLW`85P ,m9w̡" PT \k6w]貍SmL@G6qC-3y 1յrhn%`8.;1q$iiqF(@ӱFYV0HjM* Xb6j r %q /$@40H`Ct1b3hot&h1EHD^fxD5 P41 g,E)Gݝ;ŰQ§_bYU[ cF#in(aWэXҽ02_mn\wl>[-|Bi:t_@ຯ=*8:@9gsdr:GCaɀAgM4.q~ ;`샦\B"*yrt\nfԾj8/m\SSkzJUl/ ~S 6O(:EAM&5ٺ6`z_ ^]'=QXӻ[ 2}y\=$OxW)EC̷oLYʌS/$2L'[AXrTC))%1 T.WD5!F%;EnQαX?|Bq_[ʩmyƱ\̾r!51υ{+螖aRAGwCb.  rq%5IZ^_GME4af_>Kϟ N;Biv cȻ&^Rh[j؎_kݲĺ eu-.2E|m=8 = Ivl"SR"̛ @|͘Ѣj4Zjj2T]ؤrlpƟ[N\L⢫)c7{7?Q'jc0R/^i:H9ʍ; Z'qۏl_.FUJ{yq)81 ,ǚHI8܋?UFk?&-IՔ"pJyw_++фh.UW =F%Z5Rδ>9.Q/UoUY%`j0{mZ<(}: 8_]Yu|Z.|l? l;WT9ZTQ\m;afjUIWAHYkcԼpDEk6\FuXF2@^ې(>7-_:tGwV>S=9RlOTL} U%1 OV*R"aS׽pz~|0^6C)nEE!9d^0J v!HSb3ŔZռ\.*~j:5sCyms[ i˺k I"ro<~iG_=([L&%`ph)S;r]O0HZD(!+cS>Z1!Yd Yϱd|5=IS|mjxaTŅA۶.)v? BJ9^\9-Is_;֧|}[tB%{iعU0qJl>֙ ˰ =O?㩛\2g]gQn#za=澏F0Wrya3?*"n~MYt[, x0A"DH)~<6VPu.r1j7FSy'NG>)x/l OOj GtlO \%[u41O\;ˈjUH_TƱpϣf2񈩆d7{_%^+EH5\bS <'Rj}T-f|>!@8s/c+wABvz2z1@컘l"]ޮieO b-7t_wfz>eysݗ [?׼ MK2A><&1ߦqdoU AMucB# Jg&zw:+~6Gl5d/QЀbS:ɓ8N=qG|>;瘞V4&t=;%wE8-fwPKo]d;K|45_l3m}gWE+y_U>;Zx3 ^yB-X:\9wVvUxh\.C""Q)bY-r ]Q9H+,μΌb$` ̏" uZ}xICMNm^e{{9tDH>sDQ_:ZSx}Ô$7w~0HH}wِ m1׃4XP$7H>@ wuB: ֌Gnpgx8KȀ<T9Cn 7*ps&]sF5kA,b1XMD@T;;~%T/Dpݐ$0@Gu" jNK5TAԮ5I:R{<#Ƿm0%vFMqr6](&ipGFA957M@X֣6`'z"" 4R5T:ePr٢[< o<8Cd? E@<Ng"jzbȃrݗ7aiiCImZ/hsif9Hl;TϫlgLJZ;uHSq+<]bG#zV*gS,0(aYn6S[+6mN~{ Q # j$$ ~FHdNEՠ['Y_0닶N;+IQ\4rmsw9NcyO"ƠGdDQ9Isr4c[,#b[H3.)sۈfa ۄ6NЙJ@S50DJȈgj*Exffjwq}q{^Z+Y;HdQP^]ha9۞#0{-=zZ";vt۝4#K# ]ȷ?`bNpڹb?J8n BYt S[l㵅\.)pn9ʹ:"YE9<.4ZlQ}(mW^$*Vb'm@Aͻn2 &'qTh\6( @j%$%7xJvơvз0UTAEQb&ݸ fhNud qcy}4EKkIRUӟSU}Vi@R}pj龴^6i{É~޴fp[grŷ:Qe Zq\έҏ}(:3X<2-BE~6)-Uzoѓ)p9-hΰoXbkT]ٔHTuQ};2 ),\߸rě'w_> >YR wlXbjÃǯxe!x9B,yGgPq.-K 08J+:q -ID)hCQGAt7~zN(>~)*@tz6!k7Eaƣ l_GYCx ϩ/n~kK!A;9| ߸= 6'_}OZ؞xnz֥6f`!!ЀjkXV"&aHf`+2QAn)KQRj9,qv%e !WqAswyu뉮EU3/pai[ Yb\iG DaYM!~W HCrL+fO ZGw fJ/2M̒5KD().vBATP ǢNu|p @'^%)>:Gɇk ujPvQs͛NqTKZy+H <i :B@;/B 7CneD4Ba聲*'艠C+ন& L _4xAի, T29e] ܁ZaVΟG9IKnEใd`^wn퐱SBm Bkju9qav"546`ix(eπO:Qti?-T0V2yj *(*(*)((((F(JQJgr2'_z_' C>b`4j yCBi !@n7'-f?PCvsO?$ϔJ$DA.^ܵ@vw$)=NA<'7$bϜ96Xݷڌi["HBA @ ( TfJ*"hhJ J /^'wg7&&&qhV"XA%CDh )"1%% DDRHRKE[ XiQ151@PDQ~߯7xӘ|uM5#8Ɉ-u۵x-HqjAՓjurβ&7΄&JzC[/-ڰ%sywtV6LW7QQV!g67_9H#vqr]Xނ;@SԺ ] i{hUDl_ Pt>p ^Z.:M=D*DU%W^5mt bm؛DZTuS/;ZƢT5"Q(eѦg+1%6nj H`9a;APa ٜBi-]8e;d8 g~}ռj?G;>Vh!n}!/D'Uv=dןdةdu{$Tk0J8ސA;e4u&W&<j*j O*_}F%P|=hȘ0 ER\ PKgĞi~}^Xf& |:.L47X㯦醩L[.;:,æ{4eCW9DIbwrG@^Jx 7qRpYcneC0 ZR:ZZX`Eu;/bsE@ $&/+ȟ.(DDJJ*r%⨫UUUE_ T К J,@J!֘`fbJf.M9u?uCј-S0DT#Iq糧$i=ft=gM*|䠜`>]̓H3J+ B/c{(\!EdJ-BgIBVWav2&E>CE=+xk=s!.W#TZYFxςAaMi\!*nu a5a" $;:Un6A'oKh7 !\3<]NolEzձ"U]T(rwj3!.@̈2cV=PXuv0zmAhC^.hذo|&,j4at5alɅ0Z%_MN1N)7U-}Dr1G0WF!8qso@f%/@6L>G#ʨrckd%Ӱ)t-t)h9|a:FӮZxѺƣOh٬ vQ  F鶤+nD[e?qZflyp_8nahWWCi<_l+Y~p 7Uj}WđhQPtFD@PАP␓/WOcU9[;`3`=AsۥHg*xH9`Zv+#Ԃe!nsBC״Wg0li]Fz όQdEՄrbuA<NSlçǧQ4T;>T>͍kI ᮂ@)%GG8]Գ3(psg|7M5m1`(hJWD!жUӲ(6JX?HG{@Km:ꇄLS+ߢ<%0ۀPétBWhCmtUwp )o=fO]ȓld5Np򨐚ЇiCXl]M;̹짙x ݞq'OVUI͌?eQk&h5Ժ3v]fD_X8 ʳ{, nC;Xa+%a(p|Cqv~Hx wЀfw>Ͻ o(,ۃu?Y *O NWDuUšУPr%EsɜaPi;j4rjp{-Ւo'Ia{J0!+l< :a%}ۈBvі0,6+lA="ax4J, ލM|u9U]*.".,Mԧeɂ[oʯϣ.OїVT 4@,2l@DpPx+=?~ i5$%D"0]zqF7pf\$4O+N)5$8,wJo-ѥ1ݾ >j JR?7 kc(n|8ʷaIB6e7:٢Cq_[혪yŽ7K|Ŝ5Ŝ#.ՏL%cpV vD"P0# zF_&jhdE#_FcMt@sl&ﻻY@ ^Z}sp+ )9ȵǝU-Ag0=YT^M_LbɩaIYwe@)5S<oJn6Y_;&\YXS!>lf:%JE(Mq p-|詣!fOﴼm|"C?Dž?ceb yԔ@bAv~{D"3T{*׹])x>Kgx0} By_7ʰ^Âf6)j?eCF˝>G>;2ՙ#D I}WÞx#16k3zx*-:虻~xtuun㸒 $C Q ͏vM_Ex$Rܶ0jDVe= 0kQ?nKep~b V݋@a 0zu6M˝*fy_F?8i#ngg翿ϿRv<p>6kﺘaa(2rf@ 6835vr)sɊ )yn_  ]dr\%P,v~ Ꮋ ]uB8.>-t3P>?_Zdo72oE҅SyB枱 ;?!' z ,hǼAޱEG(?c'YܜQTsj>/DV#7E]Kʚ&5Q6:hu\ސ_t;j:f80z$zH s. ʍ ~Oz&HdUQ=O+(!ϫ\ 8\R֐e< W7fimH,|J yއ&t2vu{兇~rŷVTG l7=Pտqp2HqD^]_T-+'`r{kң9d]k$v! )λ]0M0H:0(=6+.6gyD2ұE 0B#%h4^3@U3 ;j]MKD5V ebR54c20NTfpPȐTaM[8Q1<8^ݦ|2$ eR-#Z11K8FOi0 0XhhԊPRG%0$UߣO/=v?]u5<*A.#[c0F1l"Q\;#0y"~X1|?aosEUn_~vb=/3 >1x~O] mW N_43s UFR_Nl˿fή"*&~w~!|ѷH5{>i#6q~ˑWtzjYQcl`%=vn !^]fڊ|}ްz <̱v_rq1Xa7RpPUr#TYGH")D2|<>q6s\PvӺdk'rUab2M9H%4ǕZ]zPDX BF@ӂ2ŷ% P뇴y}>!Ő@iޭ(QQ5> J8~*l>ִ0Qp;}ͷ>!noR="/>&vwoB=_H.2wa`7%'S8@,冷nTb)bS5#_؍_G)p$F1@FF38JۏO]`{f3r9t^B1F-b7Qs"+Րlܷ6|喩]m n\LҕϾG 񬮳W+ lw*x']NNru8[tǥTDB]FB$R)$L@8ٷ>yOA 2p~AFOP6 9Ha1d&Qd&%3- *=e)DhK 3ww90n*q #e:(1jC?}=ݑ}O F&hw⢜KI5\W1K+}DuT(/% )n᯹ǑvdJ P2)h E}8UV.QTq1@A@Vl{L&lDV- h1`8H}dH"'IXۮkud~?gǦDU`9Kqv=k x]u%PotL>xE`'p:j#?OX]/8>U' x3W)d`(k҇4a5E F߈NT( Z跠H S\kj$I6c=BS3[TuQƈm=MoPT'tߣ OUW'SAagOe  ^q?=x# iuw1 2"OQ@<7=92~o"q/DBW,wSF"Ubj['J%I'DG{r\X(3"޸H蟬D @0uXh#gX@1"P;ctlѸ4e{N40Z͕հ: