summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/process/posix_spawn.c13
-rw-r--r--src/process/system.c65
-rw-r--r--src/stdio/popen.c68
-rw-r--r--src/unistd/pipe2.c20
4 files changed, 110 insertions, 56 deletions
diff --git a/src/process/posix_spawn.c b/src/process/posix_spawn.c
index 8a6ff6db..e8557487 100644
--- a/src/process/posix_spawn.c
+++ b/src/process/posix_spawn.c
@@ -4,6 +4,7 @@
#include <stdint.h>
#include <fcntl.h>
#include "syscall.h"
+#include "pthread_impl.h"
#include "fdop.h"
#include "libc.h"
@@ -30,7 +31,7 @@ int __posix_spawnx(pid_t *restrict res, const char *restrict path,
if (!attr) attr = &dummy_attr;
- sigprocmask(SIG_BLOCK, (void *)(uint64_t []){-1}, &oldmask);
+ sigprocmask(SIG_BLOCK, SIGALL_SET, &oldmask);
__acquire_ptc();
pid = __vfork();
@@ -43,14 +44,14 @@ int __posix_spawnx(pid_t *restrict res, const char *restrict path,
return 0;
}
- for (i=1; i<=64; i++) {
+ for (i=1; i<=8*__SYSCALL_SSLEN; i++) {
struct sigaction sa;
- sigaction(i, 0, &sa);
- if (sa.sa_handler!=SIG_IGN ||
+ __libc_sigaction(i, 0, &sa);
+ if (sa.sa_handler!=SIG_DFL && (sa.sa_handler!=SIG_IGN ||
((attr->__flags & POSIX_SPAWN_SETSIGDEF)
- && sigismember(&attr->__def, i) )) {
+ && sigismember(&attr->__def, i) ))) {
sa.sa_handler = SIG_DFL;
- sigaction(i, &sa, 0);
+ __libc_sigaction(i, &sa, 0);
}
}
diff --git a/src/process/system.c b/src/process/system.c
index 0f1c07b5..c8f26008 100644
--- a/src/process/system.c
+++ b/src/process/system.c
@@ -3,43 +3,62 @@
#include <signal.h>
#include <sys/wait.h>
#include <errno.h>
+#include "pthread_impl.h"
+#include "libc.h"
+
+static void dummy_0()
+{
+}
+weak_alias(dummy_0, __acquire_ptc);
+weak_alias(dummy_0, __release_ptc);
+
+pid_t __vfork(void);
int system(const char *cmd)
{
pid_t pid;
- sigset_t old, new;
- struct sigaction sa, oldint, oldquit;
- int status;
+ sigset_t old;
+ struct sigaction sa = { .sa_handler = SIG_IGN }, oldint, oldquit;
+ int status = -1, i;
if (!cmd) return 1;
- sa.sa_handler = SIG_IGN;
- sigemptyset(&sa.sa_mask);
- sa.sa_flags = 0;
-
sigaction(SIGINT, &sa, &oldint);
sigaction(SIGQUIT, &sa, &oldquit);
- sigaddset(&sa.sa_mask, SIGCHLD);
- sigprocmask(SIG_BLOCK, &new, &old);
+ sigprocmask(SIG_BLOCK, SIGALL_SET, &old);
+
+ __acquire_ptc();
+ pid = __vfork();
+ __release_ptc();
- pid = fork();
- if (pid <= 0) {
+ if (pid > 0) {
+ sigset_t new = old;
+ sigaddset(&new, SIGCHLD);
+ sigprocmask(SIG_BLOCK, &new, 0);
+ while (waitpid(pid, &status, 0) && errno == EINTR);
+ }
+
+ if (pid) {
sigaction(SIGINT, &oldint, NULL);
sigaction(SIGQUIT, &oldquit, NULL);
sigprocmask(SIG_SETMASK, &old, NULL);
- if (pid == 0) {
- execl("/bin/sh", "sh", "-c", cmd, (char *)0);
- _exit(127);
- }
- return -1;
+ return status;
}
- while (waitpid(pid, &status, 0) == -1)
- if (errno != EINTR) {
- status = -1;
- break;
+
+ /* Before we can unblock signals in the child, all signal
+ * handlers must be eliminated -- even implementation-internal
+ * ones. Otherwise, a signal handler could run in the child
+ * and clobber the parent's memory (due to vfork). */
+ for (i=1; i<=8*__SYSCALL_SSLEN; i++) {
+ struct sigaction sa;
+ __libc_sigaction(i, 0, &sa);
+ if (sa.sa_handler!=SIG_IGN && sa.sa_handler!=SIG_DFL) {
+ sa.sa_handler = SIG_DFL;
+ __libc_sigaction(i, &sa, 0);
}
- sigaction(SIGINT, &oldint, NULL);
- sigaction(SIGQUIT, &oldquit, NULL);
+ }
+
sigprocmask(SIG_SETMASK, &old, NULL);
- return status;
+ execl("/bin/sh", "sh", "-c", cmd, (char *)0);
+ _exit(127);
}
diff --git a/src/stdio/popen.c b/src/stdio/popen.c
index 4f9d6e9e..0c9f24e3 100644
--- a/src/stdio/popen.c
+++ b/src/stdio/popen.c
@@ -1,18 +1,22 @@
+#include <fcntl.h>
#include "stdio_impl.h"
+#include "pthread_impl.h"
#include "syscall.h"
-static inline void nc_close(int fd)
+static void dummy_0()
{
- __syscall(SYS_close, fd);
}
-#define close(x) nc_close(x)
+weak_alias(dummy_0, __acquire_ptc);
+weak_alias(dummy_0, __release_ptc);
+
+pid_t __vfork(void);
FILE *popen(const char *cmd, const char *mode)
{
- int p[2];
- int op;
+ int p[2], op, i;
pid_t pid;
FILE *f;
+ sigset_t old;
const char *modes = "rw", *mi = strchr(modes, *mode);
if (mi) {
@@ -22,29 +26,45 @@ FILE *popen(const char *cmd, const char *mode)
return 0;
}
- if (pipe(p)) return NULL;
+ if (pipe2(p, O_CLOEXEC)) return NULL;
f = fdopen(p[op], mode);
if (!f) {
- close(p[0]);
- close(p[1]);
+ __syscall(SYS_close, p[0]);
+ __syscall(SYS_close, p[1]);
return NULL;
}
+
+ sigprocmask(SIG_BLOCK, SIGALL_SET, &old);
- pid = fork();
- switch (pid) {
- case -1:
- fclose(f);
- close(p[0]);
- close(p[1]);
- return NULL;
- case 0:
- if (dup2(p[1-op], 1-op) < 0) _exit(127);
- if (p[0] != 1-op) close(p[0]);
- if (p[1] != 1-op) close(p[1]);
- execl("/bin/sh", "sh", "-c", cmd, (char *)0);
- _exit(127);
+ __acquire_ptc();
+ pid = __vfork();
+ __release_ptc();
+
+ if (pid) {
+ __syscall(SYS_close, p[1-op]);
+ sigprocmask(SIG_BLOCK, SIGALL_SET, &old);
+ if (pid < 0) {
+ fclose(f);
+ return 0;
+ }
+ f->pipe_pid = pid;
+ return f;
+ }
+
+ /* See notes in system.c for why this is needed. */
+ for (i=1; i<=8*__SYSCALL_SSLEN; i++) {
+ struct sigaction sa;
+ __libc_sigaction(i, 0, &sa);
+ if (sa.sa_handler!=SIG_IGN && sa.sa_handler!=SIG_DFL) {
+ sa.sa_handler = SIG_DFL;
+ __libc_sigaction(i, &sa, 0);
+ }
}
- close(p[1-op]);
- f->pipe_pid = pid;
- return f;
+ if (dup2(p[1-op], 1-op) < 0) _exit(127);
+ fcntl(1-op, F_SETFD, 0);
+ if (p[0] != 1-op) __syscall(SYS_close, p[0]);
+ if (p[1] != 1-op) __syscall(SYS_close, p[1]);
+ sigprocmask(SIG_SETMASK, &old, 0);
+ execl("/bin/sh", "sh", "-c", cmd, (char *)0);
+ _exit(127);
}
diff --git a/src/unistd/pipe2.c b/src/unistd/pipe2.c
index 83282bb9..04e0c128 100644
--- a/src/unistd/pipe2.c
+++ b/src/unistd/pipe2.c
@@ -1,8 +1,22 @@
-#define _GNU_SOURCE
#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
#include "syscall.h"
-int pipe2(int fd[2], int flg)
+int pipe2(int fd[2], int flag)
{
- return syscall(SYS_pipe2, fd, flg);
+ if (!flag) return syscall(SYS_pipe, fd);
+ int ret = __syscall(SYS_pipe2, fd, flag);
+ if (ret != -ENOSYS) return __syscall_ret(ret);
+ ret = syscall(SYS_pipe, fd);
+ if (ret) return __syscall_ret(ret);
+ if (flag & O_CLOEXEC) {
+ fcntl(fd[0], F_SETFD, FD_CLOEXEC);
+ fcntl(fd[1], F_SETFD, FD_CLOEXEC);
+ }
+ if (flag & O_NONBLOCK) {
+ fcntl(fd[0], F_SETFL, fcntl(fd[0], F_GETFL) | O_NONBLOCK);
+ fcntl(fd[1], F_SETFL, fcntl(fd[1], F_GETFL) | O_NONBLOCK);
+ }
+ return 0;
}
X=:\Ҝ>ÊH4)8̮MޗQ&`vJBviS])=ԕ`9BA>3GJܰ2Բ $c0at>2:>!*T6؀C"<.=S4 4M`5fUP0vT]RmC+<_x[OnD:2X$]Ů_?mNa2@fJg45_-x3 <7H" d_|d[.xU oh|mǂ @PAhEEU(* 'W|=ꭋM4¯a_}H"%K?^^O߽=OpPHegI%Y>e2]6`G?5>g{/n&LJ}3U \Nفa8h@꿛Hb 0z5g2dWM}B-mjomY)9*:%k4w+H6l iQ VOFn aMT&S:I7|V69*Zp.|K{Op s%4&(}9"%ynNO@&DN25aji()BJxz{~dGtnf0%N:eNJ'} *;h_))ooڳ@%y,]F%G?R~'G6 @GA}0r3u U}){@ BRm@ŮPj+C"|VmVeYu)ϩbVɪMQ>=IY -2Ff(nI?njMQx\N?f.8WތgfO*ddw- jLzFmLޡ.q>%<>rOЏ}rp!$J!T0//46=:iAGXϧ*e7JB%BdD7.0¯:! @Fk7.O_?n3ÇwJi%>>}t ?Z~n4kyGx`dJ3 ;~/@×zħ~WOEVPy*Az:L@ǵƉ,uꯛq>NkͶY8 z I%hX( ǭoE Ao: ƻF:mY‘FXQPٓX A6$qljEwcAƉE7z5DCP9#5Z$a5kz5(Vh)3_괩祪r.1^tdFH AVs./ j\ǭjg5[zbdʂ"͆%qʂ"ݶ,%(*{f@˂"k9U RiE.ڵoek{ͤT%/1Шa$R@R\V5ޝ`Ld͖Z[JŮ+U (VQ (tZPHғF_K@$$IhU(IR-IPhT-+Ƴ*Hπ=e䬮 RzU)@gUt$wjw;}1hgJ4_v` >F7JxYv ywOZ$Hn~gJ r"Vƃע-AVVtdN:[^=Yk .-\W*K{ZPPxWJCA2^2[C9Fed5`z6mvvS 9D5I8GڲyIVIR+9 k256PTyhڛZݑ->[$|ނ]{V!74w17Va`!oɗ l0K%T齾,Y`j]-]Px6:R>R} Z'X [k pF+H5.<̚\5"{Qo5A=@0hFѰ#9.]FAj.:RY͋3,A̴-H^k0i^'yJN  kء/Zj0~t^Zaq`^=)T(|cXGg|>zwuF-섒{l U*%v~Ivm*%lJ 3 (ºk;IE4ab-exR9Ah1AC2 ֪uO}206250)k{AA5H:TI=N*:ZҰǹZhгP8KbQNk}+mfTJn[4=0u-=(o> Cj1%3ABAR ;K;guvp!:m.Or?y>T@8޲͗9|oڡL!+Tk>hRXIvmE.. .a0uR 6?h+ rĩf^wG;6ΟTx9a ꎗw7Sv}+8]2C/r2QadL.Z{Kw]+wo쥬&VR~$*䤟]{M%W:$t]L?~DNk"{dZ8nMzJр8=?3.aʍE;N/MFUl7vRKHق pzN?n89Nzmz~eؑKFA3}h,HپxE쑪wڪ+ 5۬ |3G>_fGۃEn G =,cuj7쑂Oՙx,t{&j~ѧ\; oձ2C޼cKɎxr줫_,[>zJL'F9i2ar2 %0{lN.Y XqƁZ9LA~|CwR8[?k5Ud:mXj+3^=wQr >Sռ L:Ylmyu{M+di)h߁ 3.q0AG,DPJp;F-Wc˾/>ŃeUV0f.&a6N~z 900-:n'b3H|zB,gVexBЅ6zIYy>j6%ZsrR^-XG\rxvg68n}1m,C1ڃ^) r1 4e$kwEue+V2+=ׄ߁ĭmj@$I78i,m$.\%ztK\y=xh $ `ITx]u'BP5>s5E .ҧ%[lkZ[إA, 0ZPF7 [n?"pîyn.Ə<1^n.qmOE|Ҫ Vnni{Ry-mnS)[y[)P}nio;\B.z6P)`v g29vjz 4ʑ"韦Ô8NãrJNBxw-)Ʊ%xf,+v6z.ޭY  \Lu&Ar66 0r v77<:΀p3GR'_~, CQ 0>{ ( +(*!Q/QUoMc?/?w)+*=W7u.u]H>,ι,xھf:Q΋kx tmh0 =@j=ɑ͟s?<8z%>z :85¶MVzmrxI=R _m@r}lN=BMd` yv {]'h,aJAV;i75ƙ &ײ؂ h`5ӰhDO ^*DTe!gѭDž= oR=ŬoF:JY9v䐴I_h@yRYD:,En7H!A^vy$VAZE$TA>e-F߉K:ɱwabd vg[tDz좝@ /N}\βK* x\ycN/HO3pY=B̤+ӅrR)5 >"}2L憎2|0ZߗMc2u|5"m@|ޛ$4ȿx6xB8\e5?d_a\5OQz*|q ߍFAiz!S*kbä~;!fo',lϣ ,j50)/]wG SB%/A>#2 l)4 xa4_Ae@(hp0W4W.070?}c$_$i!<ǔ!OD}X>Y[ài^V 2I>9NW}d.m2`D 2kkUe5ɯb3O2Rdɥo ye QHOIgR$`(dg?T#݊jn?Y08VKff.b014"TO'<9Vte~[^79|S:ٟ.o%֎U #/sKnviĞeEۉUfiE! vge iIY׌N=ri[WNyzE~%~@bXnN/4EGѻ{Oٜu>z6۷hHĵ.ڜwhܜķ$-J%{}?Q_4~F,O%>zOrCbЖ˼D|0һT-q_ |Ruy|5WPH(}ϋ0ZL@)/1\)o&I4.kcu-@C Srs[]PtE4 kihpI"wq>!z~ ρj8 0r=P5n^ŔM5Hw'V3,6/o.L/r*;5p cِFȐ!DKc׸ϰ<|8mKV) [hL$&xr&L)~$RkHƘ4 !0ӎAE4}C4YߗLypyPxRy[ \mNw`#?\'d> 9?ov+?Cd^]WCdnHGN*<_JңXI O |kZHA=M_snBsR13'ߗZ69k.启s+o}O+0۷xĿO7ޔ?W ^~?zx}}_XC."u1ԝ\* +lc® mLj2&h ʚ|Op^έ`w*҂tWSy+/:7r)mhD>g4V~1w9>g6xYWf3TS:̾='v񎧪ن5++ˬh0\l AU'kwː?[yNV[;m-?njVN­-VNN8ܪ:PjND3֑&V!y8 dUpGVq e:]Oso0b2*:Ϣ|Ut^d8(di*Ut^)[a3kK|$8*9'ZEn>*9(|+\CV&ђrezUv,K3"*;/WRq/WSAfWҔ\mU2YUq׀*حJ5xkT."(h[4c.trUMcv*V U`I=gT]:y wvM0}2:(:\Is2[4w[ 03Wh]4:t{7#!zt:*ȇ֡;<aj^"kYztl6 [Gt\)>:r4N %wB?JG[,'ew[Gnw%G::r6V2z?7k;RO+HO|z^;p򩥊2dgnӂj=஦ɪUpSxநPd> :Y  M\FzʶUpaP:滋0t͂ɜ&x!dg_ط[w- \]}Q,!ۂ?ؚӫLUVD؂$,ɢ"wžU;F&.Ey0 Qpu 8^Si171/Rܕ2 +]swYi)$sO$ʧHv:Iz-|\ {tr# 杫" s: (*,`F`;ǕnNQvCW0вv0 `U7Aܝo*\@W(!8W-C\ Csxc@phN8̈9nO2/s%@\U~t*; M(Ҥ ,0 (ÏpZGAkqWCZ ª*H Ii*H@'hU@ELiLWt)9@BОD+p\"$aSLm!;_pz363W.!r)*!HK7]KKS,kry̚53 %uU `$I 5\Y,6'@] i۞F1Ʃ`p`-&7j@΢ՁXF VG{`lh5?FV1`Z$m1~#!Nw ȵt3S s'1nB t uކ:dYY∹x=F cT 5 ȒXxT9CQsChU%被1ḣ!U: i0 E׋h'JT4Q.PtHZ\tHyȋpBhJ뙓F~4*W| ̶el}Nu"*I`Ӻ * MbE6v5 ^W]7haT@W l0um]m|t*^\J\W#Ԧso"쩫g^IXj靏fܝ n5`¹&$^tLHGXrL;R\ җ@^B:_rUKH] z`v׳&vZa2 $Ub?B"Ֆ3t@ג=v%WyD)ǁXj$uU'<}ДOjx Y,g&+h2p+dɰZ`H(pD]C!V 밑fi8'PֲAB)sIA8cJm'7 W]NV_x{DlkĖ,7*fd |ZN̨MPn֌qmcr+H5ƧnjfKft|[(jC~w=#Ǖq#ٵ0=\WVlxt||cAq&% 8?3063̮ʮ/#&%ItGpl`gccK RM7 !;;Ȇjgӆ|+53n[eS)T %0$@W|8#_n.秛ζ)|KYif-^=e|O tKB)8{~*CH<=)YiI6GZ Lq=ωn@lБՃLL캊PsU[$mULrV)Y4eJU身bZ[K;ΪQWR]WULL{RS*u*姊i7UUJy]'ULLbjEJS꺧Nw*ΩGo*JY]TLtS;_x-TEv)UIUKNvULSU[椔f)\S^)S-]Se*I9rϩq9xRZf`)u)3mRgSͅzdt=M GSʝgʣr3UMgx*|3L5N)/1A0,ScʿV{a ǻTՒr.%2~kJ1pK7Fຕ*%r*b#˧$FRf:*vIi&U8TQ3Jj')IU~T ۍ"AI9jcv!Uȸ^)!?JGDKyܮ(7&LQtUCh%6j5)4dgLQ"dc)QbEiZrh҆,R)WQbM 0Q4f phMN ZL' ߓjIun$rRi-Ꙏ gy*@e{y N ㉐ .DTr: $ީF|wbΝ4|;`kg촠YI Nq:hWu:`O^S.f LytRG9M$>39mpڗdm+JTlGN T 7NI۬'MڇS.4Z:Ῡ}ezo&7ܴ|7uɳԉ)M$oSɀ,MAkS:m]MlTcS%iMkd[S%ΚLWS:*Tɮ&1O&S*Ma^.YNa*ES\MmrДlL#=!坩ms^}3I exfrz13Ldeџ$C'I]zmCJט,wLZ 1 r}1Hmrʧ1 aRn4/00~fh]0yfz`>I4O%!}|)+,Ky)p/]mDh풸,u"ʤ}.)9˽TK`[l򶴠)gK]%Bwqef9ZYuTyY|**3N.׿Ҥk(Ut8mʵRUNL9V&9ĬFҕ;;hvL(.R6OKW *  BQEQYydL\o+]ȕ@Ol!g]rxYוUW:Wʙ42Gj,;KJ6~gIT\%)Ik\F4%IҔ>[$'OirrY6!Fm]H[FX|ͪ[eH{DT~ v4\(;C&_/$/ )۞z؎V*pi7Hff 2IFҟ^$z*O}~] ` JItT% Nk8]~a@ p#x>Mݧhd#Fl,@~wk=~zXƧ7r7gTT?!Gػ֠z瞰@OI紁࠲qwgWQK?XEsvJ%_tǿX)~t(| a`Y/q6:vx}}]  G&7 cG=}V^Wgl7lָ* xX>;=FDwVZ$Bw,A2GPJ Bj(?M4p~ٓ׾Y 0÷?;Z T#8\ s fX䢒*TÌ1 ?1he>u1^L۲jo0S;[x5A|}oՆ 5tG/ |5t~|%R_V~Ws1lt`C'?"~y؁?|{_M/У"d.@far5huP>_}HL "%`?^^O߽=OpPHeGă%Y>Sx6zf Fn=D{q39>=?rzW_l4n")ɋcz NuX"W2Yd7IW4MFEځ\椥!cԀ` ?RF5@se0ҁY:Fu\iH*Sh' 4ѵj2u}˹%Ķx[=8% "g{MʽV&E_ChhTHc8ݗ!Rt$ dy$]ZH P|DD bwLf^MÏ" p7.a\t)tU:cxgH&u ɜ~%ur4a,n`(EFXJ ~x5O859_m\aQ ̅``K7_Z.?Q0k{_lۀq_S6bWV(ZY!>CìU[ŪU|z?Z3,ayP04߳dzwOP2J4$W)Ě ŖƦG'͖?=t0YB !2hZxG! @F(䖗GQʗ+)rK|}?t~~>LnVTk?Mr9z` iғK|}s{&vjn,\M) Pdz>;czJoǵƉ,u$X6[ cqvZ>dQWZHPv4גq$q|{/pεٓ jkodCٖmF31yٓOQ~Sk FC8s@65"?m7ok~y.vNHz"Эj A >OkzX~>D[Pk %9Sjg~iusܪK mj+Y E[Qk#W\ǭjg5[zbdD[ٰ${ 3ۖEZv} }JoԕE[m-Av/[ٚ-^3)%""- #"-ow'-1*lT K_EPO(b2u (EO:r-X$I/ةk HZRU$ /ШZ$9V~w3dO9E[ ^U FU..3"ŠhfX%JxY&7~E $Hn~gJ r"VF ҰZ%j ,q-0ozd" P%P*ozD"w/-&hV9&(v$Asj0 #jKѼ830L[b)gMo=AΛ]U uZu7PXuR! _KBZaq`Va 1qSϣ?4T<GOÅgGfuJvVԬΠ߽0[5;UgP;ǨUIvm`udD  f fN[friѵ$R',';(-f6hHfZO7($"S YߪK94.Q~ "IE'WK8W zvvIL:io͌JbRMzF2⠮֠'ʅPz_c? SnF34@9$[|snG!]e(?5쿫4,ЁZ孖,lwn-Hy!V.F І&;DA}qx'߂΢ED+<@2>EK+sBoJ@Bm(RrC dw"eLb/ 4)A` 1>M"ڴQvk, 8>j+36 JR;^au-yFR8-<3IZA"'BHaQםg> BiT-FV( bTWK^Tl9%9_8<:GRj%1k:m(?,A|Xppr6C-,&^Z:)bFP*6az2B;>^o/hpPΘŧ%>Fkvpwm"Ow~ FPx cĽ酝^IŋLFvS. (2*wR>+w]| [;{)+߯îVD$$U%'Dk*bgU'Y~eq[|$uu\4]%'@#qzJoC| pz~=g]):8`7Uan6۽fH.! e r;^;9quNZaG6V,finG֖`AZ;.bTV]i8f; =Z9nvT=X{`â=V&pj)jJǫnj֏hsYKy:VfЛwv:ّ\.t5KEzQXAɜ^dtw8('S\ LSRvaf)Х=kv+8ЃTb\+)o 2tZ g |gͷjמLMKmr{_v > Pռ L:lmy^V YFoyÀ:Zw;\ȑ mmmɷ1 Y6;ڟ&s\3.2@0f.&a6Nt4Hh8C!@: UC  b ZX]h C%eٸڛvhKyA` pQipHu IKƴ=O,jz,YX\LdmXITz^ΞZ/'=薎e9Xw;'Ѳ\ۃfIhY/q;FK QkLB$pDh)Y#1zZS,}*]J?u]ٹ7xa~l~-pa~iN{\r+e4=▶Ut-m -mQA UK |uݱ[gɀ\̧J/*m.[5(N ߮MԀԀڕ^7S#fKywҦw7[|.Vvs=lM3Jw;FHOSaJN'kQ9%'lp!U]Q3G`v=\qj,]u v .~V E9\HX~w9;nM Tue Xg@쿋ϊO*O/Q)"\0"0* #'`NAU0IJ!{BPN8Q0W:O~p2Gd}q_cE;Ex ؇~9ۙO:,US@`yqmo2MpF8(O$G65gψ/ _⣧hZl'*ꀗSM.>O$6yۣIdޤOF <+5}qd+Z;}SmB`r- -Ў&[ F[kX1 {FD"JDU,b|Vksѭ煬= oR=ŬoF-:JY9v䐴I_x@)HQBdl~Vo ݮJQ 'bQ4Yym$ZIjm$SI}'2]&Bޅie%mU."Kv-8X8q:.0qf9 oBA瀓j﹏b&]_#?q|k1Wja>: lUVL'n"2#K2bIr^ޭBj?3U~D i:+Ōi HY.ҏm0x鿅Qœ??":/$nu>BWKO?}>fl0ֳعqիe}άW$^0頸{xyL`:\لQ==>ۅ?#PIl_OFW@3Q4Ʀ2JHve`Z+٣?eV O |ZσndIVwN@wVlئ h2khlddמCӞu#\5ϥ޳uKZփ>ql+/e>/IE9 Fup{(>}ٯWR'Y F0QX=ς)qx5bRpcMvbRińi}`^g~ZF;?)x8e)W?_%r1^ þf-۝?dLοHL*lV G?sxF,?b %N~oH ^)cJ~P|>+i&1U"ˏQb*%삑5 jLixU8@zyltl/H{}unGfѷa*NqwKf ~u F&:]oxL/MƎo^W7c(N&h9~.o3T2X#-OVT!59jڂUw9]ALTAg/͌/o`oBN\޶6[a;|{X9w鞅8sZ;&eN/Fsz~\ة p,^{݆sm?HT{rE+؝w;q'g݄;'kou~v3ڳ{}Lɺf ;XSNGNzYϷ@>޺ v7N=H|lc#ۺ vzޡqsߒ)kStKjxEÏAi}-qǺzrH=p&;Bz WES8cR Tsv]^M-|p էo_7Ph} p۷jw5ZY]{`4* `rs[]Pr jg4 kihp/x{"1 ءǤ; NR/!(!@uC5o*B?`頰q1v~'1MdzSA܉- M},22h11~| Y?Oi8 `u\*NgDbl! nɔ2!oJ 3XTdM7 M,vyhW ϗ$ojZyt7wvVN=o+xnz)s4WXa m>mʁQaЎ9.mx!f0q& QСa{k[ (i$@Tzgg+xN0,?v?vOt%>z"4I?TA7}͹ UK|_j௹TC*sV2rp}9q&x\8\p0Hsr_E.thلvd Thv͘t5x@@-zwZ?L{O> ߇z>xSL_/xEiot -|ߟ~a,D8AҎ{ Bۆ';Kz~( -?/óo1Uw؁z^u?yr>97ՂAuWC?]%~}M!}->z|-}}-=o[tkQ='_+ukVEc||,{婯_ 5n6;:QsG$1} _ka!Nu(skS=@J+wAO@|B%]%*Լ͒ϑWĒOVvgjʸKSAFKja嶨>`+7*.'6m0!+ 4ps.UAeP]+鄿-pI,d)/&٠e8 iT4SlL.w^OBɭa ~3e_1.4.v ǔi='vf".W=|ҖX;r /c؂d4.6/@ZҹVuN~LtwG_̎%Ύ Lu,rOcWNWheEnGBbp:,p*2_<re|jI*<]Ditd2/;sS)b,N)N4^iBNh]Go5i_ 1鉼`aQ-!WKdjzc.v~r aC}/8Z*8pg5:L\!d2B`)Uux,\-A$ (C$@ ('(\~ ĭ#c * 2QWbx]! =&ȑKKs N!Pa2i2@GbO\:_Ypuh* UA-c+Bcԅx2Gq:>Y 15m/ Rws 0RhLDBJ=TdtCn0!] 1Af+*WMDἌ\UT]OM"~@ɲi8`G~lV!\GBJK~U%j/QpUx2]Ls&af(M( Nc0׌_z u ]\; +D2^0 9f3ȮRJiuԒnŠ t+ n49S&,R(B9U!t:_W W";mt 8.ZL.PIHbUUM f-sն|Vb9rIY'U}AiW]BPp\*Uહ Mİ*ҡ ,0(sҊWp5YΠ5.P2Tquu:x\5=Tva\N^BQ0Gx˥,F UdkqhpVɮ>j1ݵ(Me골zq)ʕ@BCô]&+266 *&0,h\L fS2-Wx'bJ.YL狮kKSF7I̚.f('C{4aƱ)f1V6v]%a @yqu2@ZA,J2فRX,yZYJ x^Li6XJ~,4۩X/smk%0EYt2jSPgbZeLC꪿ .EW5V0~e,94P2rNZ&Q@xug!KF$nH/2ֺţ*HsS( 2NJ']l B5OA].'xzbDdLx25 ى ̹b0Ip!fjr&U3jtIsBfJAFKV񝋁ˁ{^Ǹ#N-7lluL٢riS*ٻgJ2Jv6mVR3)ޗU62M$] lNt׌B2q~lr!ɷT[ x&i\m3[YHD˘j&Wˎ߮Z?hwKt'#&ds5j4 TF=R܎1KSN\s.ǘ8 c#ߘݍ19mYǴ1Uv5䴧1f8s)?cB03XYNTO\ ɴ1&3U)bʟ.,bL-Vp-Ҟń~ڱq [1UibbO15r)ԴG1ϕC1Qʟ݉19MLTJ9ku|)sʕ$Vܐr$Vܐ#n*ڋXRNjtkb)bLp L8ÊiaB%yXr0rfia߰)a Hy f (e ê aI +2݅,[X՘,[V$z&SXf~ze ٙ%̠0˫ aŶ.zO{3 `)[HyӌL9Sjo0L`ޙ, Ҏ*=gS[Y^ZNb|,`ii`̃Vfnfykmg`JR+ O`?S3){ gykq6 +ʥ]];rV+W龮 ޿ӦY4,_-gKKF_v~kV9WM/;Yj]_}}Xf8H!Td/ KCv򥩓PJR.k/avU?k{Ew/kkձ7ɓkUٯwS6ǭ7vW/|z>FKjm(ãWgۡ'^~)w^x7oZʙ7A-4A6y& G+n 4ۋ7g;&,^w /2=xyےrUMR ]ې,],]\wYČi]Ze7jqە kӮ֨\]S.Fr=vDîK`u$[W2uͼ5 W]kxZ;Q7]?]K89ntrt-8Z5uUfxꎥtJu%>K|K,\(!1WUzH[W.OL\4> \/#vȥRzZ7.S#Knr%ĕuĥ~Rk*^jX7:&\wd*He;*3o(h79/l\oM@i[Śn͸np%.u_7&ًTRV n]s;ζ앬웱nNYm] ( i[0Ŗ [keҺv"ۻVas-U[ ƵVtYv[[J5N2[9MʜmrEZݽ#ӛC3-ceJ+`)OZmrl?Z#Ӎ5M^rRY> pMZ׃VYfVgiedyϲveV:[R,LYf3f vfxɿiVM>T>eca8̒\%.PLy&sYֈݴ,a*klOYj/Q2OVV&+Y^YIVȺڎ"д,R`cP{,Xz{ҩRR)a:SrbMZ6UeL'Sئ\bUĔClIj$]Y&mW؄k)eBk~ࡨ ̬!U:JEZ5\Y؋YqfE,WW_u]Yus%hoZ@#sƲӮdC/qre Woŕ2ά$x3ҤQ,,&έm5X&*T]7,jrrY6!Tm]V[FX|ͪ[eH{ 5VMͅkU2.'jrv_efW$*|W*\&у?_X,?}<|5gv+o8WVRN*i8ɯv߶^!><@cITOyw7]4NL7~`omZN7~ tjJ/zW嗎\ЮInzRe~Qo9:4\LszrBXH?;[WO9izvZzK%f12)RvN]JvN~+MvzcY/3+wu%;5BnI%[uk&QvMBr!c!1Ȑ\d+qO3{ySsp%Y Wr yP)[3kyWpnԚFw^yؑ\%/B~T$ B!/%(,Y"h@QHq$"*bfT] (JG,eQUD? G:d? 8T`ӽPPe  @Y-~44nߣbݙo Nj@tQh ~e@d([%ǵnAZ5R•ޫd^$eI.Cl qJ׻~BȆN¯/ !k-#?E^C O7{ !Ѭڰ"¯dQL4o4v+Ev{"NCK&(Q~; 0U8'<$'1. ~+E_L?SuFtӝzՖЖJrE+Lf=TEEYcֳ jn .Xio'w() jFwk{Ps @pm?z}5DsBdiԎ'j~Z]t;k"yg]5 ?t/i4?~b9bWpޟ`^wϹ$ $&$V~}j:ZE-۷;67䢴wwWoEEadm VsEev![-]OAom * U%*+ߧjx5x{=ƹT|=hot (^+yBޞ7tK+Um!~o3p*mGpq-fN2"j(vd]?r[Ϗ/0oAe_(*Qu;_>*M>Kx` %>z?h~]k jY>xA96`%-^q _YZvǘΗɮa{v bo(,ieGW0#xɏB!iz<(#b mgϷ ; }e4Z=C6-9:&^EË>"F&vͭ ZllHX< " _lt(4Jn&n8.WR%FW5Ӄ8AOXNCqǰx4`VˁLLh㍖ƿZȧO_` /Ɨۃ <!7 ۫߿j2X{|(Bn!j|>P`Q)TݺLR1E Bȫ %VUndJY0dڄS`Y-rlNkE8m"X%='L%4&(}9"%ynNτ0y6{dk(> J0h(!o@W|f~dps.ab2rNȹvcxg@`{T{8%ur4`,(_FXJ  ^ ~wՆf\8f ItB'rpsP$02WzOۀS[ѪU*+[e w;j+gզHټ?Fa6Ṛ9FMJl\N?f.8W&gfO*d8R3 )- }SR6 jlA_`1Y%wh0\{C y]i8gXf=y@KZߍ!J!T0/fG K04[ #dβ a94I{Ƞnhу_t0. l7ğGqpx?/WR |}?t~~>V\k?Mcr9?H_c<{⊫~$"4ײT7Qԧ,@TD[l`/S90|Px?5Nd$_l5DEiM"E3_PJ$k AEKP% ǭoE]&w͞PP]#Kʶ,xh4Ɉ͞aZ$FT5M賈u=Dc换s"α;oK451dl+@v}dѱvwkSQL<_*{!x$gJw:Nz...CEJosC|xuUv.ZVG53ǚ-=12ٰ$xff-K PZ*sL*Y)gx'- C )@:v;Sf2G=ע-AVVtdkIy ԫ'kx)Ax؀H.Rh|+O ț؜ޕ[<_8"_gm5.##^a8J\@cY;猿xKt8?@> >T[6ot9*^_7q?w}nTL³ѹ0QN?bٞTb&*߁k-)gT04h@Y&=$Qo5A=@0hFѰ#9'Ve'wT[,řI} fʗ}7L9k}뿗 w쪒hu7PXuR! _KbF4Һ LQa+Ѱ\)Hۿzth>zw.>;RWOf03Pcfv٪q/;9FLl-3h$?' fg`@Pȅu501[wuR N4h)a2&DRN4q4'풘tZ {;Ho ZiU>+r!m/?"3r47!`w;Ҷp(/@@)a]aIHµLJ-odA`p;o4@ D[|ob+m*QoCGpn.:vPI,jMU.d:~d1 ( "% bp?C2]&Z`ɗB_VҠQ _jYm]ȨHё\q|Vfmx2zw¿miRIJ$LV퀈I}Xg~u3~_A)+KB1T䫥p|T*ʜ[/@JrP,|njy괡D\ a:BW8jH}XN塀s gY-5fEX٩k'S[!*SpV?ä/=/1z^Sv/wo`O*wK~H_0BuK+'M/Էf N*NRdDa1*nj-rL. <ܱrwr:j{[[J9oh$*䤟]{M%W:$t]L?~DNk"MQI2-D^&ahvpb0qʁE;N/MFUnP o3d9A~qzMs8:'z˰#+ I4 NnkKg fGi4nƃXoL|q7;*,ra=Z@0aS^v\5`T NjfU7x5UG[,WʥVk+3T Mra%Gd`Gr;eWr֨[>D-JL'&6:i2a굘n %0{NjYYqF΁^9LA~L|& R8[?k5UT;mj+3^=%3\Ыjm\`:blPX0| @.$ @Zb eA @ ;LA.HLPJ醚zV3>s8,*ɜ޻Hg>Ńe)mda4L]LnlН@ 7 /8ІBhсv=u֤A҆CPg<e&*a.Kc$U2-7КVn:92ę >4qTi{`ZM&Yqy=8?%Y>e+V2T=ׄOĭtnj@$I78i,m$~sztKpKC10o>rK ETPjo-mn3&|]wl䖶aY2q .J[ ~V SsS:5685v.תMԈYRޝdipd686>KE\#E;lӮLR5=0NQ@9R#ETpZ~xTN \H5<86doԌ%x.ئ]Wڻ5K~W9ႝ9ႋՄ|?HQRæ]δN|SC_w[Xg@My:+'/Qd"\0'EH(* Ccu`lNQ|0IJ!ž뙲8Q?:,rH~i#[?#?*NJJx5 znwR79 s3 /tAӷ^9/ MV=Ga<4?al'yzvdpRk=m:ɵuOM.>O$7N=FkddPFvNy`'wb&[0+FX f`4=ڇ=ӂ(Uٲ@eYf& C>+GN"r.vIrmd_SvڎHn6#˲[Ed'dn$Q%)?3n8m nϭ8j&~oIȺʻ! Y82G"o7x@Kb8 1^pDzU,Yiv%k)d5Պ,Y?u%:dN6ۉw˹W')κ+ͲpoCmy/k(׭w:qZcO}O0s'b) :?4) .bsRN\ަR9?d4!Ji,iAČ6 [֬|G |tgͺ?>/>0StÞv _׫{1}GKg$y'nJv<2k> 8ťYqdpH8MPEB_ВG+K'PZ0*$#F2NuDGBHpzbjJx6?K:ay$`BI%J51t[Î| >Eڛ) )"Fi@_ӿ֛kvPjb?vWX\>ғ^w[ !NA. O, k|I^qQIc$։z.Q^$LXxi_~9@^;_5<&k3[>,pL;o=LW~~iqqi 꽃+TٚdDCqu0F_9rɮ|w2c'rπËP~g,I7~;s/(G/+J_\ '򂎻<Ї'~q~o8 ig(=t;m΀ t,ʶo:l?ja.]mϮ85x#?Ks?>IŸ@ eKl[S74fUt8޶[.m+l[~옚3"fo(nU! 4d^1(EǨ 9'$S Ε79Ft:f#oq:9<WvZξ~x9|8C@vN.+DL).Px)v0bFƓ*l___? ' @Y{$Z7xbOy^8#I83 %òD$ƤIBx? @j򵇋qZޞmѰx gip MI>X+[l}(8,4"+84x$vIgu:?Qh?#zio}~?MUn2 x9F FKY$MMd_zkJT |&%<JFε+999Wr˹!/@: $<9Y\qL&#Qi[aDQ:tﯔ?=m͆[kO-rreM#/8k }+ĵ@|MMZM×r]/._G3kK B[F/ 7O?ٲ^R'[_Me/RY񕴧KBz~f|GW&y IXQσϬ|f1|_lO,}7p>m[ۖm-\c2˲Ȑug|R Q"S"=Z $;E?r\/'(g,җl=U<>"}HϽ%2lՂ_Ɣ8PSOr0M|fhpDU5`e5Q4b})CQ~$Q T͎vC(q_c6 fE8jw̓ۅO EpG1fQt0r E|hjU+` ])[񞡔}-d[M)=6ώ1x3/S{jH!󚪁`1ƏAIU VuGo:KFmPG ͓)rz QpJ'4SuE ႔PW0QZ)Հ_iZ 3.A[z!GCSEuch,SCQ$b:c(n@,2+ ^։(csSZEl5ND5#McjHE!išBS$iUSLjd3/8C)?C)D=ud 9sO@GZ2oOkN`=͂԰Sدe8@GD'炡Q*n_jK89s־ad,r_pTxlƁrRYQʿb~0m|M Ro*XCy E~G-=U.hcWUx̢)cմPSJ3 yYCX0+#r 0ڂuZaVHdM%l-„P",>$xFTUGeBLFrj+1D$ih"9S 0EtL՝UIt"}Jpz[:U}J[roN%R Ca Ƅ~ZL Y%NTo 6!WQ $[u=񜅗(iIfaz܆Old$R44x}B =*$U' [m=4@!/$! QljMAHwBy) ȩ:4ȅ S.c i_{3S]cKe`TL[ul)6[ulyh[L4V=[ɭ;c:J]v؊iUO~UwsUgo7;v&@ 3nEM+}8 F |uF"+0ڦ>yhéy i.e^<]1WQrVa`.2E=aե x f,ZECي,(׽5LPBQVa_G`y[S${hشxJ-j_b+ZKW7譪/[P`1 էFػ냶W鍗1c**&bO LEG"Wu\݆YU4S؊& [<VW5Q.f 8t2,M&ءnQ82N2c'Jh佳E>C8H8e=5:q.vToқcpؕ~,>؇CZVTץ"~Ogn P7 CI4v- .anh~O)(xӪ4/'\_2 >>IJZR|# ƍ@DP(( E>;LL4avTU_GಛKS7ң: c#wu.Ns NV$xޮi'zxRXN̓9d)oI@_yRT[:-^㨳RcMh|uq!.:$Q n,_u~Efu"WV|QA>:owc>8\13Č{j1kLyfc?y2dy.~ 1~΁8ll^ ,ub\y1fNH 4:W(/m< u760E NyĎR`+FT'L/w9;i,: Al2Ru@~Z=k '|t逐 Pg`~qbɭNd7&lմ:!gX-j,Vu"r$/H7B_CC!0_n {a6^8CpyP0`@px :܅tm@vacu!,3҅.p.\9P. n iq l^[X2[!-bL-:Z:Ё-Ta 2Z8j,)ieBШdd x,,c Pё,<6EXm"8:EXl9&K1,B?&Ѓ Ei`¯tJNGd+% dH  XMFV MAn 2)4(ť"̕d#(_&FtH O tf܈G8pQbL`Q8|#3L@A+PR rBpkRBA;0(m "B،?S ?!ʌ>aUcd^=ޫz«ۈfpi^ #c,#&HԿAB-x8/CɬQkȌvUb$F.1! !hTbV`&)3uhC*/3r8u!^!)3r,uƐ˱_{R4cn 1֪!YunxƐ{͜!_Sv.T)TĐB AbHBHBHzoΏ,/5%-״ 63#2r]&gB\j=贎t#twl 4#5nfSJs4ltاBYH[=Ui(;ΐ3$rz𕦜Q5U9DuzٹIEF`9atjCf=jE`)J~rGZ d'y>E @{,S(Y)QёnXѠ 4'=~сƬh7GxTo#oq_#VTpMo[ O|:px,h5}xs5/_{#ל|_uxQw5p+n7kFvv{__NEx{Sqå /t vt{B^U[dXn 1WWPOތ+?3.$%Usw]bZ}^qI;lzq>Cj)'soPuL~4c3!\M!+TgfF*hʏ@,3c#i!{^;ĥ%ut4بvsneA N"JJVgujOUsaX(pB֠pQWF*;Nfož-U֪ظ=`(ϗe5Zx xZ\Wr&-dS~cPbMewWOU`?{GŸ/[$,w;GQ8Ƒ@Nm7ǷA>]-ٽ}]Ny$\^aSWy˂w,'{}2ifHR֭"0c)ݸcbC+يʳ/3cqm|3ݕ'4t[Ӌo66(imEnj+϶5%G+ It=ϳ~>45J?p_W׿? |A՚Gx{7i7s k,ܥM0o&Us >Y~~Zg,,:I׈aAjN7*(Cq/qc%dɝ>ˑKTK˾O}4&4x߿ku?Ex]7@}|o^[|a_koo14I7f7Q< .gsc-ݿ!&[g֟v6At\1MriI2&axcL=N vv?lW0-.a8}\O?i||qpa(g֛8L`a9U۶zͼ]G0V/ Vз;pa}ZcY$?'q_v~ Uina̴-"l,^Y^di_j@w.sA"֍?a2B .TEZ[ vC"n@&^-*q495nc=,Q1t%X|AbNwߘ}ϣ/0b;xCxZ+IYA4jY_M8i_IM("^FN^]|h.{b?'?C L0i;W`tD#1 Ҷtv;?UGBF0 b_I ǵݦqpwBj>9;3,Ĭ ۓ9Ny@2o.pZQב,HoK!ߴNGJ^榨1ܱR)T糭y,gR8I-M(*h)^m="!o1h?}*Љ/DFw$HB3j &)%=R,%P-Ư9s5N.=47zhVHGR>1d򡎚طb//,BU5=Ɠg-({x|hũxN`2 ,\І<#Wu8mD]Z䯊e;%h16Nq"^9,90Y-T%ȝ}C%<,wLYi:nI'F&EB&ͪLXN)b"|ar x2bcr_XO )NO&7 t-(OX<9Uo$ww՚\Gyzv+WZ TueT ݳVhth/_a8ۺ0^O6FMY.&;]{ :>}9 e`IWeioTsTa M : qidMN j> 'Í_QuFms)` w$t[/6y!yfe,-xsj,y(Yos?7x/L15Ot  Nt]zMދDquf- ,8_[~"5REGGI0]eB SrOvj}gUTa<$z7BA(2jXbuYXD3ڐQS+qy/ُR{K0э4D 3izU"b(pE].'D٩FRo^ZڲjetP`7@9Ѭ׶ͦ=!K `ך`AWN_]̠d :W|$1zFB?'>CLQ$c Q'IǒoQmz$=q_nG ځ_s =`>Y;u&1w@.9^/pL=kFA'6y[L ZyI޻Sק'۩D^ޭA26;3y?4WԉSDĸ@&)^<uS~|I]]Png 1Z-'d:纤rֲ\T׵<eMk|sLerbԲl~lֲl)gY&Ǽr=,>bc-1zO %Y&SzEuo&F-K"d)[j (ol̅$w-mOPS֤&1{ {Rnnl0,3YbZ^%IKJhuJ,7l7`RJQi?%pB~)ߐr,nc+|n>ur0P׫ U?\;&M02 mGD2>;k2WWNSzY4扲7w`ɘ,$@ Is*YY4I};ѻ;̾zӮ惬w[W0AZ&|;cB2!vwIllhI\Һ9w | s;": yJZ &~7:+ (/Y ާ\_/Upl5zQ(,tbVRb ZF9kuPβwlkK/Ms1<w0lIJ+8İUâDR=;tXkO60=G'g%Vv$za qz XuDnR0EX% KZ_wwpRC}|]m,hkiqawֳz1IƫH|BAz, l{mUDd&ovMʢ+&dEU*4 G%FMGn/Ԝ7U2$q? Qg3Xb{ }e\ 奅72Wo%֖)vTJ#K>/! _%͚+I|`?`db/d(PRw&Czřaqn7tZ2=>8hT}{nzۀ ڙ(GK1ٻ涍$}__Vbb_c  >KXYҊt3rԞ*xy̌8Cf8-9Wݡٙ&?׀۵N仆@G,ra*5gP~&u dy}2ns-erO]-iOBҚ]VnG YI (܅@v$T9ڋ@%T._N.c?K6T([6.W= ze;