summaryrefslogtreecommitdiff
path: root/tools/testing
diff options
context:
space:
mode:
authorJohn Hubbard <jhubbard@nvidia.com>2025-02-13 19:38:50 -0800
committerAndrew Morton <akpm@linux-foundation.org>2025-03-05 21:36:12 -0800
commit0a7565ee6ec31eb16c0476adbfc1af3f2271cb6b (patch)
tree0f3b65a591e5dd06c0b245a1982dafb0def55655 /tools/testing
parent8344017aaf32a7532cff293eb3df7fd2265ebafd (diff)
downloadlinux-0a7565ee6ec31eb16c0476adbfc1af3f2271cb6b.tar.gz
linux-0a7565ee6ec31eb16c0476adbfc1af3f2271cb6b.tar.bz2
linux-0a7565ee6ec31eb16c0476adbfc1af3f2271cb6b.zip
Revert "selftests/mm: remove local __NR_* definitions"
This reverts commit a5c6bc590094a1a73cf6fa3f505e1945d2bf2461. The general approach described in commit e076eaca5906 ("selftests: break the dependency upon local header files") was taken one step too far here: it should not have been extended to include the syscall numbers. This is because doing so would require per-arch support in tools/include/uapi, and no such support exists. This revert fixes two separate reports of test failures, from Dave Hansen[1], and Li Wang[2]. An excerpt of Dave's report: Before this commit (a5c6bc590094a1a73cf6fa3f505e1945d2bf2461) things are fine. But after, I get: running PKEY tests for unsupported CPU/OS An excerpt of Li's report: I just found that mlock2_() return a wrong value in mlock2-test [1] https://lore.kernel.org/dc585017-6740-4cab-a536-b12b37a7582d@intel.com [2] https://lore.kernel.org/CAEemH2eW=UMu9+turT2jRie7+6ewUazXmA6kL+VBo3cGDGU6RA@mail.gmail.com Link: https://lkml.kernel.org/r/20250214033850.235171-1-jhubbard@nvidia.com Fixes: a5c6bc590094 ("selftests/mm: remove local __NR_* definitions") Signed-off-by: John Hubbard <jhubbard@nvidia.com> Cc: Dave Hansen <dave.hansen@intel.com> Cc: Li Wang <liwang@redhat.com> Cc: David Hildenbrand <david@redhat.com> Cc: Jeff Xu <jeffxu@chromium.org> Cc: Andrei Vagin <avagin@google.com> Cc: Axel Rasmussen <axelrasmussen@google.com> Cc: Christian Brauner <brauner@kernel.org> Cc: Kees Cook <kees@kernel.org> Cc: Kent Overstreet <kent.overstreet@linux.dev> Cc: Liam R. Howlett <Liam.Howlett@oracle.com> Cc: Muhammad Usama Anjum <usama.anjum@collabora.com> Cc: Peter Xu <peterx@redhat.com> Cc: Rich Felker <dalias@libc.org> Cc: Shuah Khan <shuah@kernel.org> Cc: <stable@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'tools/testing')
-rw-r--r--tools/testing/selftests/mm/hugepage-mremap.c2
-rw-r--r--tools/testing/selftests/mm/ksm_functional_tests.c8
-rw-r--r--tools/testing/selftests/mm/memfd_secret.c14
-rw-r--r--tools/testing/selftests/mm/mkdirty.c8
-rw-r--r--tools/testing/selftests/mm/mlock2.h1
-rw-r--r--tools/testing/selftests/mm/protection_keys.c2
-rw-r--r--tools/testing/selftests/mm/uffd-common.c4
-rw-r--r--tools/testing/selftests/mm/uffd-stress.c15
-rw-r--r--tools/testing/selftests/mm/uffd-unit-tests.c14
9 files changed, 60 insertions, 8 deletions
diff --git a/tools/testing/selftests/mm/hugepage-mremap.c b/tools/testing/selftests/mm/hugepage-mremap.c
index ada9156cc497..c463d1c09c9b 100644
--- a/tools/testing/selftests/mm/hugepage-mremap.c
+++ b/tools/testing/selftests/mm/hugepage-mremap.c
@@ -15,7 +15,7 @@
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
-#include <asm-generic/unistd.h>
+#include <unistd.h>
#include <sys/mman.h>
#include <errno.h>
#include <fcntl.h> /* Definition of O_* constants */
diff --git a/tools/testing/selftests/mm/ksm_functional_tests.c b/tools/testing/selftests/mm/ksm_functional_tests.c
index 66b4e111b5a2..b61803e36d1c 100644
--- a/tools/testing/selftests/mm/ksm_functional_tests.c
+++ b/tools/testing/selftests/mm/ksm_functional_tests.c
@@ -11,7 +11,7 @@
#include <string.h>
#include <stdbool.h>
#include <stdint.h>
-#include <asm-generic/unistd.h>
+#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/mman.h>
@@ -369,6 +369,7 @@ unmap:
munmap(map, size);
}
+#ifdef __NR_userfaultfd
static void test_unmerge_uffd_wp(void)
{
struct uffdio_writeprotect uffd_writeprotect;
@@ -429,6 +430,7 @@ close_uffd:
unmap:
munmap(map, size);
}
+#endif
/* Verify that KSM can be enabled / queried with prctl. */
static void test_prctl(void)
@@ -684,7 +686,9 @@ int main(int argc, char **argv)
exit(test_child_ksm());
}
+#ifdef __NR_userfaultfd
tests++;
+#endif
ksft_print_header();
ksft_set_plan(tests);
@@ -696,7 +700,9 @@ int main(int argc, char **argv)
test_unmerge();
test_unmerge_zero_pages();
test_unmerge_discarded();
+#ifdef __NR_userfaultfd
test_unmerge_uffd_wp();
+#endif
test_prot_none();
diff --git a/tools/testing/selftests/mm/memfd_secret.c b/tools/testing/selftests/mm/memfd_secret.c
index 74c911aa3aea..9a0597310a76 100644
--- a/tools/testing/selftests/mm/memfd_secret.c
+++ b/tools/testing/selftests/mm/memfd_secret.c
@@ -17,7 +17,7 @@
#include <stdlib.h>
#include <string.h>
-#include <asm-generic/unistd.h>
+#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <fcntl.h>
@@ -28,6 +28,8 @@
#define pass(fmt, ...) ksft_test_result_pass(fmt, ##__VA_ARGS__)
#define skip(fmt, ...) ksft_test_result_skip(fmt, ##__VA_ARGS__)
+#ifdef __NR_memfd_secret
+
#define PATTERN 0x55
static const int prot = PROT_READ | PROT_WRITE;
@@ -332,3 +334,13 @@ int main(int argc, char *argv[])
ksft_finished();
}
+
+#else /* __NR_memfd_secret */
+
+int main(int argc, char *argv[])
+{
+ printf("skip: skipping memfd_secret test (missing __NR_memfd_secret)\n");
+ return KSFT_SKIP;
+}
+
+#endif /* __NR_memfd_secret */
diff --git a/tools/testing/selftests/mm/mkdirty.c b/tools/testing/selftests/mm/mkdirty.c
index af2fce496912..09feeb453646 100644
--- a/tools/testing/selftests/mm/mkdirty.c
+++ b/tools/testing/selftests/mm/mkdirty.c
@@ -9,7 +9,7 @@
*/
#include <fcntl.h>
#include <signal.h>
-#include <asm-generic/unistd.h>
+#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
@@ -265,6 +265,7 @@ munmap:
munmap(mmap_mem, mmap_size);
}
+#ifdef __NR_userfaultfd
static void test_uffdio_copy(void)
{
struct uffdio_register uffdio_register;
@@ -322,6 +323,7 @@ munmap:
munmap(dst, pagesize);
free(src);
}
+#endif /* __NR_userfaultfd */
int main(void)
{
@@ -334,7 +336,9 @@ int main(void)
thpsize / 1024);
tests += 3;
}
+#ifdef __NR_userfaultfd
tests += 1;
+#endif /* __NR_userfaultfd */
ksft_print_header();
ksft_set_plan(tests);
@@ -364,7 +368,9 @@ int main(void)
if (thpsize)
test_pte_mapped_thp();
/* Placing a fresh page via userfaultfd may set the PTE dirty. */
+#ifdef __NR_userfaultfd
test_uffdio_copy();
+#endif /* __NR_userfaultfd */
err = ksft_get_fail_cnt();
if (err)
diff --git a/tools/testing/selftests/mm/mlock2.h b/tools/testing/selftests/mm/mlock2.h
index 1e5731bab499..4417eaa5cfb7 100644
--- a/tools/testing/selftests/mm/mlock2.h
+++ b/tools/testing/selftests/mm/mlock2.h
@@ -3,7 +3,6 @@
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
-#include <asm-generic/unistd.h>
static int mlock2_(void *start, size_t len, int flags)
{
diff --git a/tools/testing/selftests/mm/protection_keys.c b/tools/testing/selftests/mm/protection_keys.c
index a4683f2476f2..35565af308af 100644
--- a/tools/testing/selftests/mm/protection_keys.c
+++ b/tools/testing/selftests/mm/protection_keys.c
@@ -42,7 +42,7 @@
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
-#include <asm-generic/unistd.h>
+#include <unistd.h>
#include <sys/ptrace.h>
#include <setjmp.h>
diff --git a/tools/testing/selftests/mm/uffd-common.c b/tools/testing/selftests/mm/uffd-common.c
index 717539eddf98..7ad6ba660c7d 100644
--- a/tools/testing/selftests/mm/uffd-common.c
+++ b/tools/testing/selftests/mm/uffd-common.c
@@ -673,7 +673,11 @@ int uffd_open_dev(unsigned int flags)
int uffd_open_sys(unsigned int flags)
{
+#ifdef __NR_userfaultfd
return syscall(__NR_userfaultfd, flags);
+#else
+ return -1;
+#endif
}
int uffd_open(unsigned int flags)
diff --git a/tools/testing/selftests/mm/uffd-stress.c b/tools/testing/selftests/mm/uffd-stress.c
index a4b83280998a..944d559ade21 100644
--- a/tools/testing/selftests/mm/uffd-stress.c
+++ b/tools/testing/selftests/mm/uffd-stress.c
@@ -33,10 +33,11 @@
* pthread_mutex_lock will also verify the atomicity of the memory
* transfer (UFFDIO_COPY).
*/
-#include <asm-generic/unistd.h>
+
#include "uffd-common.h"
uint64_t features;
+#ifdef __NR_userfaultfd
#define BOUNCE_RANDOM (1<<0)
#define BOUNCE_RACINGFAULTS (1<<1)
@@ -471,3 +472,15 @@ int main(int argc, char **argv)
nr_pages, nr_pages_per_cpu);
return userfaultfd_stress();
}
+
+#else /* __NR_userfaultfd */
+
+#warning "missing __NR_userfaultfd definition"
+
+int main(void)
+{
+ printf("skip: Skipping userfaultfd test (missing __NR_userfaultfd)\n");
+ return KSFT_SKIP;
+}
+
+#endif /* __NR_userfaultfd */
diff --git a/tools/testing/selftests/mm/uffd-unit-tests.c b/tools/testing/selftests/mm/uffd-unit-tests.c
index 9ff71fa1f9bf..74c8bc02b506 100644
--- a/tools/testing/selftests/mm/uffd-unit-tests.c
+++ b/tools/testing/selftests/mm/uffd-unit-tests.c
@@ -5,11 +5,12 @@
* Copyright (C) 2015-2023 Red Hat, Inc.
*/
-#include <asm-generic/unistd.h>
#include "uffd-common.h"
#include "../../../../mm/gup_test.h"
+#ifdef __NR_userfaultfd
+
/* The unit test doesn't need a large or random size, make it 32MB for now */
#define UFFD_TEST_MEM_SIZE (32UL << 20)
@@ -1558,3 +1559,14 @@ int main(int argc, char *argv[])
return ksft_get_fail_cnt() ? KSFT_FAIL : KSFT_PASS;
}
+#else /* __NR_userfaultfd */
+
+#warning "missing __NR_userfaultfd definition"
+
+int main(void)
+{
+ printf("Skipping %s (missing __NR_userfaultfd)\n", __file__);
+ return KSFT_SKIP;
+}
+
+#endif /* __NR_userfaultfd */
=2:DIe?YKhpc5vTh 0y4`oCPQbkzNSmw$h-G[{v9Sʻ%}9inoNs% /~1"ikjմ;`щ~rr Z~xxܠ-KiuR%,a|%Jd}LGW Fyi>&]ѱ Ö&E`3Y7ls='EB;B7"Byقc]H] +i{GEmӿÇEq){koe=N_X1ƀhhSCs߉,nc^dѹ;&0H[G< y\-u XdtuwV !]`ARUʵU%wE擥[ h~ŅU%#sնe~#q@_]{$KzzF`n~p\?7 -TeBX=b*pay\$D'<.Qf_Hh-R qlMOӋ wmqT" ͥŭs`4+ +ؾlf%K̃`{ [a9C LFeiGjGoeds%|FE0%!BflKѷ$6 ϒVb-o(g奚}^ܑJY}QSr"iMcxYQooEIvrlThN(-t˸ tFkfd/#n@@l V, 8bp=K7fY( 64 ")3^,;]ޚx+&/znU7euVG=0aiW+gxsv-`_8Ox|ߢ>^?&aE]ֳE#x&*vϻ~BN'ƾڴj×\qFd_x{+evhTɗh! F늚oB@?dDǯf}`#F#-d2OH l1( h-rI-7@\˴13Or$Ow1,R̞>#؅rt 5"_FMU,aҦawAbעg1N)BfíKMN{CU~qUhDAN#g!B\;hrun!! |{xCt =ga\[6v<d +)-H%V'jrK\[9Is^79m9HjH4TJǤ?͇obRi8QTWR.PbRd¿g}~*"Q3W~6_nUmTl6j:R&zJEEY2:}T=I\^V.cޫ kHuM<:[KJΘ 7.Y*w$H%-_~NQ\Aƞ홢xo0Tqms/A3Nfg؛LTcc0d袿oOJ|ivS4q&x\ z ~"AWMحN9GOU$uQ#] FʠaP gU1mVt heV3J?u'Isz |2G^, P1|; BwmD xxY΁^A [oC?ݻ`_') IF:jp2f}:3ho=x<%YFqu&͑D͖j 5 JFSDZ:5b /4-TV$p7yKwH.=JNc2]<Oh Hz:ï$pKw06C.rp+Dc4I1LdQG^P9i'm/lW!;栻Cr@Fw8{?hn*FIr !ѠOnK*9r̽"+dC^LIOjn}2xbaEws=wۓ}hn n"[1#L˅ϩ2O# ]G,DZ= 7Ƀkak)hiB~^8zܒpgh s}tjkEdV"`+w㖠eL^iWNtP[|pa jlRᡓ5 3•mu9: ~/]pc:N4Z1"gfIho6HH" SGrᇎDo/kJꪢooҍj[M`]6\ݑ# 2[B 7b^kG[Z EkLNkLǷamq7'ܷKS=D a L!S壙v I}`p@40q3Bf[1H==%͞ =m,|n.Lˣ)_?ki x7Gw,ۻƎnV7Jk]O>=֧Ӧk LJ_&n$=[$Bzg)LKz5| bRyVRNid1=jap-Dq;ʤt>oD3n@mQI _99;,mnG^wTύYZ >y%3m$՛t<:C{j7e\ 3f-8l, _ -FCxZRȷVd)m$vZ@!|*ߙ>sY7ϻS gG-O2RpO!P;Zl's챜 Cql?[7~ÛEr9-t;T d'l]s dT^J]$ɏc?Ht^02GjBy)NZ}=RԢ=ll W*Ե Xj_Dl`_/S(hiMXH[Gx4=flMMV,PʏiH2 OeL;66]l20%$tu#$`iEGE$syᐌRQ7In׊ Lyǟ~LcEMEMƳnW?rN߈N)uFA6<.0Y޺pZ=Y16ZVݡZF..Csv \{2Z_j/G'Uks/o rVW#qP6v4ދC!mbOAlJƗdObsvOit]>畐ZU~O}@* lT2!tT&K&&>mxioENGܐr-wD;ww9Lfʦ6DTDx\ɓNYe8uT.%vHHXEþ0H6hhrTݣc=l1b+)/`Fn"emt #0< [nHw93eb7 fTIE3fE0<-R>BW;oB 'wOSΊe'w(Fns)!N|#Z@^<_7~v?\@LƟ޼DYj4&)ִǥ-J`!0%w*MRçy[Y曆k;& I r2M~|\Z|N;dVQ;5-nL29# P8@q D fvi¬)T?]\OIiN 5RI*}N'䳡t@]Y1~!$K6(m/?gТN;5;¥H^KW7i  r vt>0s?QZ{OHZc&wg&:QTg,.1WK2%IGṰ'9a zs֙=6D)7 RF_M2v蕧nt* V.zbn 0CuV\$z$Qg Xڟ3)f8ػk16+8xQ?3Mk{S (Iq6Պ4Fc|=~S l[giBϮ&eXd f#hmeyEvKN÷KK%*Ig[休!”dqEi' b;vmtͧ'cYFE|iEgx!@CHLow^عvڳ(M~=7 ?yoa@z$Qʆ*Ӏ>GM7/rӦ9 ,kf ji hҋQM@paJׄ&nuS;_HoG$$,+y׽7xZRuNDlpI uK3nv~d9cmASzeI><\@}V/\ D6aW(#]7 `ZŔrίBw!#_"׉wG mh!kK P' C)ݑΈ]Gl܌q^ݛH;ԅѫgbV ع@I- ,MUs |<4@XYn e_*@r^@AqY`pH٢s2f"Ό8}n;8âq].'#:Ojm+]!qi% bV$-0 QrQbh ,5]/2D/lHɽ* .0P4}~Z(YfO]݁&`TlE~{%dO-I5kuѝM!%G1p 5쌷rREWn3B->S4KԱr+|aB BQQ7{VM,\e"쨂UؔX T~N6ۤ#ل5Ydl\]8\T\z+nHJ\<\8 sWFqT -wENŦcMa䡐YPr3 B}' ;%N4?)MOl[_E'+ : ֳ*U`^_Wb%gfHs n>$K6 T->86[hAFB֯utq$vk׫97xS:q5Oj1T$ڗ-wX$W/UiƗ)I}**VoԂ"#x2p﬽K3,?G͚h;q HqZAvO -y1:9ᾠB6-:TvpRXÝ)_ Cɱc?oc>B#'pϦj-~ 4{=e3]Yvwr]&QUI%Hb^އz]2ٿI}6nPCTB8_wUx߸PESV`#O |ȤS_HKe/p˷QNQ.HFL:]/EО'F8^j<~gG$/s5Nt,mɥ>%UGI/k=կ9-OTn93#;tq-A-_'[-4?;XDBb.ktbMqĖ'K6q+ɌH`z*?>\?g.Zg.6!&Y=HJ 6&3yL3Ι8IO99wj MPVTfӺ}E~BlC_ dhz Y]YX"8>P6fޥXɱ}-"Y6}p6?]\~}0;*ӀT3|z*xgDPbz4Jr7jbڒf-=}Ⱦ>^Ε$z!ZS[VP+(6hRN* fC#)TyޓXH6vŐf1G?< zx,m$5> q?>|FMHn0Lj>HG oLfiZaWә'-uKU޸Nf!8Cc"<|CoH#R'}&@y+6}o՚ͺ$AAz;޺p<"l*Xg5Ejҟa~$i#1f"yzf¨uKHVt>kaG5z}^#MY Miߋ$si=3.\QH`goq_֗BڿHg[]ɨ5#777!e@FXY,d. >"]Kz|mD>gh^@Qpj͔,|n3MzE]>4oWw0:tXzTsi?vnkhqm!|MzM|gHF-wM9N黱3 %w9Ȅ1 XV߂(I!+A1`9$+i˓tvd{=wA^ri+l8$>_^ۤ1:rcd79JC4NeBPfr_Jm?MbyFz_& ;\fVu}yU3ZMKRjBmTz/c)? +.xv6PfC*^(?A{G@4)Iw$%9)Z5lXuFQ 1 ESFԹZ6 X~iQDVt!Ө2vRɰSɤM Sx wd3#tVn,BIPN- aķST:iY}Jy.1M mjТ{/PR}m6J_{ٷy8[x~ -JbR0 $ӃM&_ogz/2vQyyy2iX8\/TKѭz CDNp̃AAp-\FtXKֵtw8eZ;[ t7 d0Q/rj#- z95H~Q?aB(N+`QQl2-GꆖCYg->XRVHb2Bع{r$dOJykme]޵r~'#5+3=MB5?53Td(oIvdOht)В kHg*,i5lJ/U<Q{"m`nAcW!Mc_0]ƱPFlw9X{ñ2G;j Gu5髦fOG6͙ ï%De=Л2)^fR/jTD\=B4|Ev9aglG:|Fo%9!k9-)̞C)f8Ț:*0G)"~1i0)IlcD7*XB;- SpWdm}h_hWrxEұM;#h`) 7=6(cj"]c4 ɭaAˀ2 ?FІVS3kĨ{йI*l,|dVR5ׇ_fwIp d! K@,pˢ\ŬwX_Yt2 ze 36v G Ezڪ|@"Z}inA՗؋chIl6%{ГגXl])\ŞF"4#1vZrǨ.%e^așd֥N73~[vZ!6''~E&MBCuoBx<2Wܖ# )rbn鐲: 4+7YTdx=5ӧY̡u#4hN% Śd}u5hqe9\^]78i\ {KJPw'Y8*^"^J3wx-B GN6 -q=OTAD3Y'YU6*f916KQS^'Vˍ_Ov+9mγX?=Z-%ش/%uU(q/ߥnF @RZVZO7O|2O7 HlHx3[2X邂ZB6xhnMft1cـҠ;Wge(v+W4 ɒ8a*4ewI?X"C7Cjnt4J (c?G$ Ek*N{^1:ZE(XF'k:lZSAZsGl}ʝ-}dv }|8DFglpՠ1nSei')ΚD5W8[ͯjG‷hG@ÚX)4eƒ GT4Tq g"H|[?{pHnU)_O~DuGNF t :J.92G g("{ }8;cv&U[$UMJ' /v~cb&:bL50{:UU{4d}EP1+WNZa-Co2 h<8€ y]>] Ltv";"нvTs`Zh4Iy<X- N\6'#4 &^h,q(?Di>=) qw?lA$W?bf U4nO>ϫF%<^<Ωj]4.C]5/oOHT-g$s|pp?%{]4HuކЯM.طE{G7gtj,Pα(5aM_+spOD>Y#|XY4TA:ކ{Dh@h?og/w7+Y!f a@g"qe.Ռs#?9p# ]n:+ ԧvvwMˑr I|W˥we-A<`'DG^FwQݬ*^[봖R}e'< D'hӻvej:Xj2|ev rN`_K-OKqLE}X`hfKBr̢^vwgE)i^6 pG8\$GMF9iLڰ:gjT ϖ2[ȺnvOuG6jaK [2qSsr CY>9.ZÑ1Nzƒl)ҽ 8.bƭF+-mHwwrx7ƪ+Ո z)!E6 C@R6=L= R9y g=W[Gn6n4{팈~< CdfF$4K =eNlG:!eN10) MtOJGHLq:ZBIItٸcp8v1$R\AQ;#EebV/<@5 X~Ayϟ]5%\3sI _eJ/ydb3b_6aP42ܖ < ץ|+4_rb6\ $!]8H)bԂe}hn;W4Ҏk=Т5[;/AGN]rjDUE ?4uxl8bNLsk]C> - s #Y ؍%u KCYBzc3ViՑfGV$R[6E1zTM)˚ģ}*ω hw7l->r&G{nŦ*}曔Cn ! Mh1[]5;>wUE.G VSCw 1<<< U>@ts]1Ɂ?l7D> }~#E.qH)<)7hO7xh1M2IbD>ѝZ|Ejcg'#{ݛzF8W߬[9iM0n]h')+3 #k&ר+6mJ1RM~Eʼn6OY?4jMx^miѢC; ZMTcC3l܄HV8Ez p3%sq{;O[z+Ywɡ3(&` MퟳZГg2ŸN?H`9w~'iXf5Y.a0aARil Q䥺h=O1`ZDʔ:4J]BcM[i6D_K4+u=ȫr(~i 8B^ 'sd6~ ]\/dꂷƿ9tg, FItflDGB!9]ҜF요M'-+^Q1탒!%xDJʡu뭢\~}a9ӵvڴ:߉+22Hz`Z:KLv^Xk]V!k 5QK8͝G0B@iAE dcj >Z~|OC& {mvJ<>,Zz蚉v-򰤛jɐq3:=nA@Nd,2 [(Gկ -])2گl\}FL=wi [n|{隟f V;5 =I1O_ғi{H s,J<?jX[L۔FWwAQ]Kܕ# 59z dk8\Oo%4HT(eXG(DG>MVH(nnݹ;ܽs^ҿ~_0eҸz}Rn\^nFKҎ:{[!&GZ9m&tYs}NK*KOyV%ERVLxK0f%fng`@s9y_ qW j|Wige³P@L75` `~ {wg yj(eDur[wMML6$:Ph;/\ x=|Sçf&M(>uWHy#MߍP& X[pqgiT7%$ hTGt)՞1T8C^˭;>z7@{!"9<& ɍًج?;4={c~6B_m?qI#z va[5ș|,8͑TˬyH\͠pZY{d P,85Ű-}ꭵ_u5]S:BWJ@8Uњ.5,/ӅR HrA/4! ds R,`S R%bge)jƳogYB$ \F۽B_i8H{e'ktq@'7)u{}Kɵ6*gyt" dnOAA"/@+~(_ܗ.JIahWe# M^˃Kfci{WvITRz kR'LD2.hq%މ$w7ނMu8-iXI*NVn2kaʞ^0BpGu;U͑R}H!XA9qr-YR ՟T}v DLkA]QA_bӢ+?&ݻWYyQ=rFg*yi* 0qv,봻8+B]BfNZ[eTw $y˼#Ǿ[',SCr*v%ȞpOV#:`[z;~RBOğS+!GyNjI9\.e'2?.+<|9C,v'AkC.xF#"4J.`N&g6b{j`l34Gk7_: |} ){*nz!iFY/}4:z56LN^P &K=<<n4ץ ³Uǥu`@bS cTŶJ"tOCcB'wN?ty2vRd.Fꉏe&+qp9Ui2 (iTk Ti}´Ƽ;¿TiN̳ux# `Md8L4o!85;a|r}t}gtQLɢj FڤAMTt=AW ڸ>\~Y\ޢBM[ IGX6jr/{~Yk1"< ]܉gCJ/Fw7'c|15k]%1o$}K}^Z WwO !LͶ, :9)bL.pp IXךZ4[tG67|'Jͫfܼ.go5dfk9 g4.˘ To&Peʺ3!"wM.\O-P{D*E$h QEx)4:. l)| P;r 놴=|\.0AuEB[dH/tm8ypnOCF ]=0LIo{VˎcK#-X5ffh>zʜvtOk"88x$v.¯ŹBkl)|CПѢy}y;7tD$@vpp{W&/jʷ i d9i]$M>>/>yd=|X6Pm&[M*RjrE9NK]}rVfc ]h[XkO$UF\RcXVhouEc"("ð'ݯit?Y[ƎS@eK썣djhMjFd8I VCrh%fըhX_Io>lr 9EN=5p L| V+L:ѯA#* I+ Su6s]MUZ2xOiLIUnm$I4ŹD*mE:˛2RSCh'J҃!3)ĥŜӔpW'm'>+n_sNu讜5:dOY #U?.>+3k-k[͘Ax;/}"H]/:Pa,k8z'n+I(7kHjCT~TkEj~DzK*OCN(@;ҧ6B2V(BO[ezrhɑ%! )q #QKP9v-qG9>8az<΃ȗm.q0CLA' 养n(6[NF zR*.B tVkip?3[6 =|6R~? 9BqDDOmosx|J/iSdP,fC(8oӽRy+1ͺh"`H-译*iG +R7 hWͦo7wz7BG2l屔 lH[3T]OԀMTsf UӶC&h,n &OJ&<{K]%<`sUtGn۔:nl(L΋33Ь_pѯe{z[cqSm,R@ieǃ2)Bt&>li"`CVqD54ۈi֩NHXi@H4)=˯z @az 743 $=YFۮj{SwJ*ޕy(hmY:XNn=(Unԛݢ^uռS:~-7w`ӫs[Q%GǻfRQdDK 0#3WGfŏ*0II iEΞɊ@"'zhٴ6NF4wʯw7W`$]u$M8ORaRh?M4}SœRەon4DgIa64"hHtB@i#| IYietƓ<@L`"S/C"oCv>"w]Fb>ӤpB"0`\̝sTQv2@Id D+H60HxuEG˸&s:r LWz9o< PԛF+=f91Ӌ0l*"r6ϰ NֶĴbHc4fbsDsaqsG>f|۴",VrIk"-* lI< ࠭\qiv㔿T~i` 躁9#ϧ}nT G(;04+9axI>&E^:ʐ G`AjbA4#ڊkB0V[t ( 8tO,IW3>`2HwV@ӂ8g  O=YݘN6el6w`rU6i *@ɢGE E-.uGECe>,)t`OH WiA:O*'٩ORd B z==ߦYR/i@eHmpрH`YkR`" Ϛp{+ό35_`p@?Tt'M o<4Vzr1XڍZu}X~\fka vQY3LЋb&fyKKl̛4~V[Ǔ& LVe~k)xdNjbO7A We #尗$&aEXj^)s(g[Ԙ?ھ!VS4 |#lPwm`;4c~/wHҍ(mXoL;Hp6uIu۽by5m5" qErUOBs2S8CY56h$ ss,pٕQ!COl@4H0NMO N)\XDA҅|.K ƨP'Y ײoAƑ4?FB}W:TgDg RGhm0>Ǜ<' %v$>o*iyٚ֨P*[3P,'6\JoT􀤸#)cy055,be Xz&ΒԫRëQf1-Eu>TwWZ]?>2ǖ>ap[]h5Q dlkNIo`S>AG@8gݥrNbpzu|X Od'&0+KI8u$<9RRtFDx!&YCi1? RuLմ[]ޫ6Mm5EB}LŽ`lTwI+9!K3ŎZV)rTم{#Q)뵛Rim:Ȏ4IMÖNԴrCXh L'j6V $U{tLdBI?^ZѴnԤ6\֧$^H>ϰ$:3СHAkic0$✂; YU_Uيuix%wQSMIÀܪT{m*:5ÖUh䥚Flխz0SvxG,}ҡ'~FJrK)/'Dx"C$r5t ";%fmZ&m@z/AnO1h̐PQtȷɘ rlҽDlX>8&0x{9]:M4"J>c-ɬQ0aa2PqE{'| 3Q9L'z{Fi76G ̾BG:huP GIdqVPsbD߲&g`0Wo{kwV"ꅷ|2Vm t)AӑzO:_^BQ_} mmK8eT 9 r_8z` a -™\brSX!Bȿ ⎋ʝ8ӵs_oo|`2|8΃6:Q'f١~L[:5>>vuWoZqsnOZMh<홪"ߞRF{p g(a>pni|>/71K:Ǚgޗh< ,o)QZN2c Dsr|$|(5<'*o-i=٥7.'dJ~%xVm!< #{+FE#?rQ|:?܉C M[s7tl7kovh3%a-3=MY&mRp/`K*JV ;w?"hrSgKU59w;GH8'0}iq-:JF_Ɲdp[ƾZg5em0-;K qo! wḻK#9B܉o.ިf[1:Le){ $ʺY>$#@~RG'|hͭwV"|"HP'YIHJ:69KOI9|{&Wsd E1R+ƤMWVJ|fVXJi|U:YтtuH>%xH;み68͆"?3[SnfM3qee˧Ni6d>N n3ϨBS/<\SljU )}ǷC4FLS[t f|~d]PoiuS ފ8TVAd; , u4x " 2ʑ#X+f/x#(5k 5}|NxBqF9&P5(Zf_۾Q[qf+JBRZ2@m4O#zfvxXɻٗBK2ܴ{ .H52 >V#bOoOMߏqOXr$(zd%R~^-eޔ+xt5Eӫ6%.^_)9q>uA|z?o^s-!Vi.-__C!HҍL V苸h6e"J|/O>ƾ3ST>' >acO =8rÐW-|p+2i5MjAV^Ljfj2"DZ7#?l7Ug~]'öwȟ fO uM.&9MsO/qlO22±nVt|SQ44+D/ݍܐ=\d9Y穞b=Bze(iqP+pǡӧq2* %|hI7 +&?eQV7(C2IV=Ac)TR:R oG8Jң(C5}(բZwu0# Ϋ(#Oh y:DSe0MWbB8.g~z#z(|"g\5 n87jl .% DBb~3L#+Z4RjtJ`v@[w,,&Z.,ݗ,>aDqپNEiZRZZ/Z }!YLUAʌqRL{7K-WRvBAY%*;8\t&mY!$3 Vlbk$C=wuq⦩;MJ#Вlc!Ĥ^x))/TwRo [HeFR}p=QvA.wG8 B;$A~﬎%uBC2xgTxg/bp{~Z)vss$/+gM2:wm5X.WTF@xx(A\s?[d~RA]ː8 3DF=6kMqd#ڇɴ0Po7}xwlq䫛"85=kTqmf,{ &pOִ^krsE5mi]:/IlIۍ }ȃyY${F~}L*7 ȜQhg|8| (ލo=YUMp$1P01b;X 昒B(32@NԬlNT!(%Ĝ3S U}\^6f A {AJ#Ӏ4?/c]X/ɠ7VM,@#:ޤQ|kPC_Yǯ}H>,?*sTapy@ؼhO{dz$1tߢ?x-'Y'wER{'}O@VP\q&SWKOUJ~nkt-?eܢ3az՟\,hm\%s ɫr99>۱vvܪ։'cVH?Tn鏜]O bFKkp!(ӻ!w=ʤ`2iqycΓxO$%ظ'L@Gch'~bb)O~/ 3>be,40$Yty)yzBxJ<8r F3Y*ס$gL K(͔nO\[U~BZ0A**9O;/V|Q:XMsi}7q$VpR,Eqǥ|tǭ(mr9 )mz s)wM2xĐjTq-CׂrN܍KG(ōY޼_Ndݵmw5K\^_wlz^nk,oslv;h7K? N'~oȟ766>) GO?x Z'W(S\[E0U L80???]5:oMo~o[!?IWY+&S i\6Uu?5//epu`fE] 1g~IW{ܷ92EW^($!{+s "UE V_Uv9Gh xGf\\1\${4}cWys{/*QQ08^ #P zO+*Cd2}t>.:?zx^}w2#Yi9/#-^}r䕧n\AIPtԑW]78W\g`*qA8=Lfs.bGjc5HƒL ߧtZZ`޾, #cPoaܷGtDyP/._.eD%P(p:yh<'wŗG>YQ9e¯w6@~adlV[#|GH;~0 Bsa 6N3ɫﲉb3%#S9QI"@\ l:f K}Y껥Üy_+m;.н:M* 4꠆^r0Oᓇ|ŕYhZp;n"h:/OƗ*o۳d!c4rbLBNv {rLbDݔgZDzߘJσU-oCN/jEek·=G=%uG a=n[hBj7NQQ8@~)P1 ,No*V/g tkЁC?5Gtq ?Q@#c#Ufn.1l&4t$Q6Z8WR)yX%˱~w^HW) 79hVL(r,}|MLj3Y>эE '<Ƚm8@zu~ %hc%ipVQQE2!j/ -M'u@7xk4׏PUn^|?s'3Cmu#9[]&Q5_x-??6LjhH èE5P͉0:F̍Ljn:H[+D7@HT2ЛZiO|c]W7roD2/*#]Ѣ!Bsi}}7/GpSPL|:-J*tL E~E.ӠsnUn(JXůt }}#*0\J "k2B>;xp|tⱰ?U=K~*&Q ;.Z $$#DYSod@Hd$Q|6T`dH( &1^:WH\XG55E! Y Ӑ/UG g$7F jCnd(KJG&'*QIBp0"˧C%M::)bEnHN 7kx#DpzѢ9FrA5 ) _ʌvyb MC6$B< ˱:qແ3.1?Z` ӫ_ۑ 14kP_\IdĐ֥,z Mr:KzDABr$i1Kr8GLYD2čPD-5."Μݜ'qVbI,we7_U +٭he`ZJL|gUz2qhO>*oӘ*-/C=t`~߿qPȷ‡O02̅hjZ{b+мAz6ߘ>zڒR9@㹁:?HA%}z9] #xOʉSUaHvdwG#30Kyj84 x4y!cKt{#Às4MA^5{(ؗiw~D/er E5Rew:g>kNeJ,:]1NHC,r^C'2p[DYiƳݴ֒i%W YK[O9 ӳ^[reMwގZmXX\6}NEGvln~E`Xz@5:xS0' N#dɷcw%1J˾2$d2"|68y71"NMԑb:8)i$kxѨxbvc_꾈5sϵ:X;{)J)76|9o6̇9k*P8A \?բw-CzX9;)}J^Rc7C’`eW<&*M n|q>,FYV&PRo{FGZӟjgR štePreVp9+jW gp d43TZ1bBH$hsZ2ė8xjOWG m.) #8yP(c185,0])5 s`sڹ݊ ۳zH=2EyX1c qrlrߞ,8-$YX ?{O+VYy?(yr^4cJZHkK\ 0 췭3Cb^P;׎+@'E {Q&xԯTa #?*_,+#c,v4 = F;]6_ uE#bŷZø%ѻ/)>r ^G?#w+e_H5aUf} :sr1=\,cX`jGR(T*3šh_ž=1""I.Խf)3#F;ۘe|D(JeNA5JAHd/ 6$fL!b)M"˔/J=g|k  U*&Í D8r/1{i&^܎i!;l\ p1e/˖8hIo-(;Qo P1vj42FQSuXB PÀq { ߇hl-sȈlb3Bf+, (B[Bj )5UJxҁ="ᗍ-Ҧ@V-X#)-B~ `dl>/J=^g(3 T)=м7:z7 h7ȞaLсjY$>RrْdVm7,t>=Q7:g Iw."x ڜSvxNsF[knKWY]S@EFn SLt[ ,JNsNM`D_>ܧ}gd 6^2.»@g9}5x8aՋdNЭA6Ql'}ךBm Yo0hh{Kĭ/b^u^z(9Y+: 'xmݦD%܎=XARYczaLw|ӽ5mEC̃P,gP9ĥv {@+Z?ǴZsYN? mir72BA O )60 mM \t 1#722b_HF++g&ϑ*ϷJؐAQзK&.HS#}#&= tn9w[QE0l g [ʢE/PGkfvA<&ױu=ъ@j"4{eP(*u]{,'THC$ @v6׷0bFCuWfJ1b4?9肮LiZ#VϜF@fWt^u۷L! NMQdq Y0%mm #i{ȃڥMJ1т%bq L&Ua)[O$j V ^ pro14;BqfR׌TbL}:2(/-K^JTdȿi_{OS< 4d;sS\`L̥0"$ZmGEv 9ؿ@ Z36ڗ6 Kr:U+4AK&xo}'v5Ʀw.鎲bӧ6k55n]_HR|ϺReڇr 1:ɮMC]7`,%hlp[5 X? DLhnn/uVqџn殫䇮u+щ2SU6:sz7c{VzLEK|, ^~='x盒X'O,~ NW7!;|bk+<.Ew|^mOf8}E)X!zR,uk^El싫qے**y_BgElvϭwkڲ@,/_8aM? %B qa_}0 \@_< ^ 39SoR0vOŚ\"J;mPQFo~ET/kO.-XmA_C;'<&%;/4^|fvf-'sr`]{j|O;"G _<'_irdXhҷ:K/z˿_c_/,k;MR_ԳړU.7LCgn}նbK7+dDd x%##rM-S:N9" Ś&qBcPL:hn `s{$z9Y2m鳁N8f{-E֓؝ +IApf~]$=^h{Ȗ,}ffUzG]g-o;It?OS)k,UY)i5s)^{aŭ{|q7_[7G,Gb}q}2«}޾K{H^go_2 K8{^fB ]#lP,6Ϙ{暽ža<|l$N]"9֬eW6\|[ {offŶfǜ,|I.K/>֨N-}N U~Ti wvj:#uۥ"j Y;d~ʽI$F7}8--C"@ qGIbp}b9H dD: b?l_} d~hʼn=:ŌnǭH#$WI)2jBhai88TJX{Ri )ml)*O< 1<u8 G3ż҄žƯ$O.ѻ99žaZ/V" I 5Mי,È[kZ_ѺLy.xqQn̗0NLI٨EӂEIx_6pdsh@=Q{qdacּDTN]0P/g2 b5x*%m&7HC CT\>̲t^Mo,cW.~nAyFe\< ء)T`Ζ7GjH&:WB\̑ ~ !RX]? lKC'Yg".> ҡvܹUF@?bz8>n}dЖ>Ʌg3lڈM`Mq6\9ǭLxZ!K0}_ 11apj@v_rQpZ :OK|vI3 OKߟ N5dn}MY!Ț1_Ӗ4ߥcv۵=ozoߒn@-7ɎKK"9-de &bABQK"e  [AVH4Z7v?&~1k}^8I/ X +d L0$.,9is백WUcN_(p/"lU2N+Gp\9O|X*LZ&ie/X@d-@$b16NFE+]b񰥟x2gMz׹ʖ X)w^,-!eoR+/>77Vi<_۩N/efػj/LJ̡6>IwCtW}7Ur#4ɼ L8$Էtc~g/:(q؇tfs$"[W}jvX$GwKUqBCes