libseccomp-2.5.4/0000755000000000000000000000000014467535325012356 5ustar rootrootlibseccomp-2.5.4/tools/0000755000000000000000000000000014467535325013516 5ustar rootrootlibseccomp-2.5.4/tools/util.c0000644000000000000000000001015714467535325014643 0ustar rootroot/** * Tool utility functions * * Copyright (c) 2014 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #ifndef _BSD_SOURCE #define _BSD_SOURCE #endif #include #include "util.h" /* determine the native architecture */ #if __i386__ #define ARCH_NATIVE AUDIT_ARCH_I386 #elif __x86_64__ #ifdef __ILP32__ #define ARCH_NATIVE AUDIT_ARCH_X86_64 #else #define ARCH_NATIVE AUDIT_ARCH_X86_64 #endif /* __ILP32__ */ #elif __arm__ #define ARCH_NATIVE AUDIT_ARCH_ARM #elif __aarch64__ #define ARCH_NATIVE AUDIT_ARCH_AARCH64 #elif __loongarch_lp64 #define ARCH_NATIVE AUDIT_ARCH_LOONGARCH64 #elif __m68k__ #define ARCH_NATIVE AUDIT_ARCH_M68K #elif __mips__ && _MIPS_SIM == _MIPS_SIM_ABI32 #if __MIPSEB__ #define ARCH_NATIVE AUDIT_ARCH_MIPS #elif __MIPSEL__ #define ARCH_NATIVE AUDIT_ARCH_MIPSEL #endif /* _MIPS_SIM_ABI32 */ #elif __mips__ && _MIPS_SIM == _MIPS_SIM_ABI64 #if __MIPSEB__ #define ARCH_NATIVE AUDIT_ARCH_MIPS64 #elif __MIPSEL__ #define ARCH_NATIVE AUDIT_ARCH_MIPSEL64 #endif /* _MIPS_SIM_ABI64 */ #elif __mips__ && _MIPS_SIM == _MIPS_SIM_NABI32 #if __MIPSEB__ #define ARCH_NATIVE AUDIT_ARCH_MIPS64N32 #elif __MIPSEL__ #define ARCH_NATIVE AUDIT_ARCH_MIPSEL64N32 #endif /* _MIPS_SIM_NABI32 */ #elif __hppa64__ #define ARCH_NATIVE AUDIT_ARCH_PARISC64 #elif __hppa__ #define ARCH_NATIVE AUDIT_ARCH_PARISC #elif __PPC64__ #ifdef __BIG_ENDIAN__ #define ARCH_NATIVE AUDIT_ARCH_PPC64 #else #define ARCH_NATIVE AUDIT_ARCH_PPC64LE #endif #elif __PPC__ #define ARCH_NATIVE AUDIT_ARCH_PPC #elif __s390x__ /* s390x must be checked before s390 */ #define ARCH_NATIVE AUDIT_ARCH_S390X #elif __s390__ #define ARCH_NATIVE AUDIT_ARCH_S390 #elif __riscv && __riscv_xlen == 64 #define ARCH_NATIVE AUDIT_ARCH_RISCV64 #elif __sh__ #ifdef __BIG_ENDIAN__ #define ARCH_NATIVE AUDIT_ARCH_SH #else #define ARCH_NATIVE AUDIT_ARCH_SHEL #endif #else #error the simulator code needs to know about your machine type #endif /* default to the native arch */ uint32_t arch = ARCH_NATIVE; /** * Convert a 16-bit target integer into the host's endianness * @param arch_token the architecture token * @param val the 16-bit integer * * Convert the endianness of the supplied value and return it to the caller. * */ uint16_t ttoh16(uint32_t arch_token, uint16_t val) { if (arch_token & __AUDIT_ARCH_LE) return le16toh(val); else return be16toh(val); } /** * Convert a 32-bit target integer into the host's endianness * @param arch_token the architecture token * @param val the 32-bit integer * * Convert the endianness of the supplied value and return it to the caller. * */ uint32_t ttoh32(uint32_t arch_token, uint32_t val) { if (arch_token & __AUDIT_ARCH_LE) return le32toh(val); else return be32toh(val); } /** * Convert a 32-bit host integer into the target's endianness * @param arch_token the architecture token * @param val the 32-bit integer * * Convert the endianness of the supplied value and return it to the caller. * */ uint32_t htot32(uint32_t arch_token, uint32_t val) { if (arch_token & __AUDIT_ARCH_LE) return htole32(val); else return htobe32(val); } /** * Convert a 64-bit host integer into the target's endianness * @param arch_token the architecture token * @param val the 64-bit integer * * Convert the endianness of the supplied value and return it to the caller. * */ uint64_t htot64(uint32_t arch_token, uint64_t val) { if (arch_token & __AUDIT_ARCH_LE) return htole64(val); else return htobe64(val); } libseccomp-2.5.4/tools/scmp_app_inspector0000755000000000000000000000454114467535325017340 0ustar rootroot#!/bin/bash # # Runtime syscall inspector # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # #### # functions function verify_deps() { [[ -z "$1" ]] && return if ! which "$1" >& /dev/null; then echo "error: install \"$1\" and include it in your \$PATH" exit 1 fi } #### # main # verify script dependencies verify_deps strace verify_deps sed verify_deps sort verify_deps uniq # get the command line arguments opt_freq=0 opt_args=0 opt_out="/proc/self/fd/1" while getopts "afo:h" opt; do case $opt in a) opt_args=1 ;; f) opt_freq=1 ;; o) opt_out="$OPTARG" ;; h|*) echo "usage $0 [-f] [-a] [-o ] []" exit 1 esac done shift $(expr $OPTIND - 1) # generate a temporary output file raw=$(mktemp -t strace-raw_XXXXXX) out="$raw-out" # capture the strace output strace -o $raw -- $* # filter the raw strace if [[ $opt_args -eq 0 ]]; then if [[ $opt_freq -eq 0 ]]; then cat $raw | sed -e 's/(.*//' | sort -u > $out else cat $raw | sed -e 's/(.*//' | sort | uniq -c | sort -nr > $out fi else if [[ $opt_freq -eq 0 ]]; then cat $raw | sed -e 's/)[ \t]*=.*$/)/' \ | sed -e 's/".*,/"...",/g;s/\/\*.*\*\//.../g' \ | sed -e 's/0x[a-f0-9]\+/.../g' \ | sort -u > $out else cat $raw | sed -e 's/)[ \t]*=.*$/)/' \ | sed -e 's/".*,/"...",/g;s/\/\*.*\*\//.../g' \ | sed -e 's/0x[a-f0-9]\+/.../g' \ | sort | uniq -c | sort -nr > $out fi fi # display the output echo "============================================================" > $opt_out echo "Syscall Report (\"$*\")" >> $opt_out [[ $opt_freq -eq 1 ]] && echo " freq syscall" >> $opt_out echo "============================================================" >> $opt_out cat $out >> $opt_out # cleanup and exit rm -f $raw $out exit 0 libseccomp-2.5.4/tools/util.h0000644000000000000000000000550214467535325014646 0ustar rootroot/** * Tool utility functions * * Copyright (c) 2014 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _UTIL_H #define _UTIL_H #include #include #include /** * The ARM architecture tokens */ /* AArch64 support for audit was merged in 3.17-rc1 */ #ifndef AUDIT_ARCH_AARCH64 #ifndef EM_AARCH64 #define EM_AARCH64 183 #endif /* EM_AARCH64 */ #define AUDIT_ARCH_AARCH64 (EM_AARCH64|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE) #endif /* AUDIT_ARCH_AARCH64 */ /** * The 64-bit LoongArch architecture tokens */ /* 64-bit LoongArch audit support is upstream as of 5.19-rc1 */ #ifndef AUDIT_ARCH_LOONGARCH64 #ifndef EM_LOONGARCH #define EM_LOONGARCH 258 #endif /* EM_LOONGARCH */ #define AUDIT_ARCH_LOONGARCH64 (EM_LOONGARCH|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE) #endif /* AUDIT_ARCH_LOONGARCH64 */ /** * The MIPS architecture tokens */ #ifndef __AUDIT_ARCH_CONVENTION_MIPS64_N32 #define __AUDIT_ARCH_CONVENTION_MIPS64_N32 0x20000000 #endif #ifndef EM_MIPS #define EM_MIPS 8 #endif #ifndef AUDIT_ARCH_MIPS #define AUDIT_ARCH_MIPS (EM_MIPS) #endif #ifndef AUDIT_ARCH_MIPS64 #define AUDIT_ARCH_MIPS64 (EM_MIPS|__AUDIT_ARCH_64BIT) #endif /* MIPS64N32 support was merged in 3.15 */ #ifndef AUDIT_ARCH_MIPS64N32 #define AUDIT_ARCH_MIPS64N32 (EM_MIPS|__AUDIT_ARCH_64BIT|\ __AUDIT_ARCH_CONVENTION_MIPS64_N32) #endif /* MIPSEL64N32 support was merged in 3.15 */ #ifndef AUDIT_ARCH_MIPSEL64N32 #define AUDIT_ARCH_MIPSEL64N32 (EM_MIPS|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE|\ __AUDIT_ARCH_CONVENTION_MIPS64_N32) #endif #ifndef AUDIT_ARCH_AARCH64 /* AArch64 support for audit was merged in 3.17-rc1 */ #define AUDIT_ARCH_AARCH64 (EM_AARCH64|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE) #endif #ifndef AUDIT_ARCH_PPC64LE #define AUDIT_ARCH_PPC64LE (EM_PPC64|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE) #endif #ifndef AUDIT_ARCH_RISCV64 #ifndef EM_RISCV #define EM_RISCV 243 #endif /* EM_RISCV */ #define AUDIT_ARCH_RISCV64 (EM_RISCV|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE) #endif /* AUDIT_ARCH_RISCV64 */ extern uint32_t arch; uint16_t ttoh16(uint32_t arch, uint16_t val); uint32_t ttoh32(uint32_t arch, uint32_t val); uint32_t htot32(uint32_t arch, uint32_t val); uint64_t htot64(uint32_t arch, uint64_t val); #endif libseccomp-2.5.4/tools/scmp_sys_resolver.c0000644000000000000000000000433314467535325017446 0ustar rootroot/** * Syscall resolver * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include #include /** * Print the usage information to stderr and exit * @param program the name of the current program being invoked * * Print the usage information and exit with EINVAL. * */ static void exit_usage(const char *program) { fprintf(stderr, "usage: %s [-h] [-a ] [-t] |\n", program); exit(EINVAL); } /** * main */ int main(int argc, char *argv[]) { int opt; int translate = 0; uint32_t arch; int sys_num; const char *sys_name; arch = seccomp_arch_native(); /* parse the command line */ while ((opt = getopt(argc, argv, "a:ht")) > 0) { switch (opt) { case 'a': arch = seccomp_arch_resolve_name(optarg); if (arch == 0) exit_usage(argv[0]); break; case 't': translate = 1; break; case 'h': default: /* usage information */ exit_usage(argv[0]); } } /* sanity checks */ if (optind >= argc) exit_usage(argv[0]); /* perform the syscall lookup */ if (isdigit(argv[optind][0]) || argv[optind][0] == '-') { sys_num = atoi(argv[optind]); sys_name = seccomp_syscall_resolve_num_arch(arch, sys_num); printf("%s\n", (sys_name ? sys_name : "UNKNOWN")); } else if (translate) { sys_num = seccomp_syscall_resolve_name_rewrite(arch, argv[optind]); printf("%d\n", sys_num); } else { sys_num = seccomp_syscall_resolve_name_arch(arch, argv[optind]); printf("%d\n", sys_num); } return 0; } libseccomp-2.5.4/tools/scmp_bpf_disasm.c0000644000000000000000000003102314467535325017012 0ustar rootroot/** * BPF Disassembler * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include "bpf.h" #include "util.h" #define _OP_FMT "%-3s" /** * Print the usage information to stderr and exit * @param program the name of the current program being invoked * * Print the usage information and exit with EINVAL. * */ static void exit_usage(const char *program) { fprintf(stderr, "usage: %s -a [-d] [-h]\n", program); exit(EINVAL); } /** * Decode the BPF operand * @param bpf the BPF instruction * * Decode the BPF operand and print it to stdout. * */ static const char *bpf_decode_op(const bpf_instr_raw *bpf) { switch (bpf->code) { case BPF_LD+BPF_W+BPF_IMM: case BPF_LD+BPF_W+BPF_ABS: case BPF_LD+BPF_W+BPF_IND: case BPF_LD+BPF_W+BPF_MEM: case BPF_LD+BPF_W+BPF_LEN: case BPF_LD+BPF_W+BPF_MSH: return "ld"; case BPF_LD+BPF_H+BPF_IMM: case BPF_LD+BPF_H+BPF_ABS: case BPF_LD+BPF_H+BPF_IND: case BPF_LD+BPF_H+BPF_MEM: case BPF_LD+BPF_H+BPF_LEN: case BPF_LD+BPF_H+BPF_MSH: return "ldh"; case BPF_LD+BPF_B+BPF_IMM: case BPF_LD+BPF_B+BPF_ABS: case BPF_LD+BPF_B+BPF_IND: case BPF_LD+BPF_B+BPF_MEM: case BPF_LD+BPF_B+BPF_LEN: case BPF_LD+BPF_B+BPF_MSH: return "ldb"; case BPF_LDX+BPF_W+BPF_IMM: case BPF_LDX+BPF_W+BPF_ABS: case BPF_LDX+BPF_W+BPF_IND: case BPF_LDX+BPF_W+BPF_MEM: case BPF_LDX+BPF_W+BPF_LEN: case BPF_LDX+BPF_W+BPF_MSH: case BPF_LDX+BPF_H+BPF_IMM: case BPF_LDX+BPF_H+BPF_ABS: case BPF_LDX+BPF_H+BPF_IND: case BPF_LDX+BPF_H+BPF_MEM: case BPF_LDX+BPF_H+BPF_LEN: case BPF_LDX+BPF_H+BPF_MSH: case BPF_LDX+BPF_B+BPF_IMM: case BPF_LDX+BPF_B+BPF_ABS: case BPF_LDX+BPF_B+BPF_IND: case BPF_LDX+BPF_B+BPF_MEM: case BPF_LDX+BPF_B+BPF_LEN: case BPF_LDX+BPF_B+BPF_MSH: return "ldx"; case BPF_ST: return "st"; case BPF_STX: return "stx"; case BPF_ALU+BPF_ADD+BPF_K: case BPF_ALU+BPF_ADD+BPF_X: return "add"; case BPF_ALU+BPF_SUB+BPF_K: case BPF_ALU+BPF_SUB+BPF_X: return "sub"; case BPF_ALU+BPF_MUL+BPF_K: case BPF_ALU+BPF_MUL+BPF_X: return "mul"; case BPF_ALU+BPF_DIV+BPF_K: case BPF_ALU+BPF_DIV+BPF_X: return "div"; case BPF_ALU+BPF_OR+BPF_K: case BPF_ALU+BPF_OR+BPF_X: return "or"; case BPF_ALU+BPF_AND+BPF_K: case BPF_ALU+BPF_AND+BPF_X: return "and"; case BPF_ALU+BPF_LSH+BPF_K: case BPF_ALU+BPF_LSH+BPF_X: return "lsh"; case BPF_ALU+BPF_RSH+BPF_K: case BPF_ALU+BPF_RSH+BPF_X: return "rsh"; case BPF_ALU+BPF_NEG+BPF_K: case BPF_ALU+BPF_NEG+BPF_X: return "neg"; case BPF_ALU+BPF_MOD+BPF_K: case BPF_ALU+BPF_MOD+BPF_X: return "mod"; case BPF_ALU+BPF_XOR+BPF_K: case BPF_ALU+BPF_XOR+BPF_X: return "xor"; case BPF_JMP+BPF_JA+BPF_K: case BPF_JMP+BPF_JA+BPF_X: return "jmp"; case BPF_JMP+BPF_JEQ+BPF_K: case BPF_JMP+BPF_JEQ+BPF_X: return "jeq"; case BPF_JMP+BPF_JGT+BPF_K: case BPF_JMP+BPF_JGT+BPF_X: return "jgt"; case BPF_JMP+BPF_JGE+BPF_K: case BPF_JMP+BPF_JGE+BPF_X: return "jge"; case BPF_JMP+BPF_JSET+BPF_K: case BPF_JMP+BPF_JSET+BPF_X: return "jset"; case BPF_RET+BPF_K: case BPF_RET+BPF_X: case BPF_RET+BPF_A: return "ret"; case BPF_MISC+BPF_TAX: return "tax"; case BPF_MISC+BPF_TXA: return "txa"; } return "???"; } /** * Decode a RET action * @param k the return action * * Decode the action and print it to stdout. * */ static void bpf_decode_action(uint32_t k) { uint32_t act = k & SECCOMP_RET_ACTION_FULL; uint32_t data = k & SECCOMP_RET_DATA; switch (act) { case SECCOMP_RET_KILL_PROCESS: printf("KILL_PROCESS"); break; case SECCOMP_RET_KILL_THREAD: printf("KILL"); break; case SECCOMP_RET_TRAP: printf("TRAP"); break; case SECCOMP_RET_ERRNO: printf("ERRNO(%u)", data); break; case SECCOMP_RET_TRACE: printf("TRACE(%u)", data); break; case SECCOMP_RET_LOG: printf("LOG"); break; case SECCOMP_RET_ALLOW: printf("ALLOW"); break; default: printf("0x%.8x", k); } } /** * Decode the BPF arguments (JT, JF, and K) * @param bpf the BPF instruction * @param line the current line number * * Decode the BPF arguments (JT, JF, and K) and print the relevant information * to stdout based on the operand. * */ static void bpf_decode_args(const bpf_instr_raw *bpf, unsigned int line) { switch (BPF_CLASS(bpf->code)) { case BPF_LD: case BPF_LDX: switch (BPF_MODE(bpf->code)) { case BPF_ABS: printf("$data[%u]", bpf->k); break; case BPF_MEM: printf("$temp[%u]", bpf->k); break; case BPF_IMM: printf("%u", bpf->k); break; case BPF_IND: printf("$data[X + %u]", bpf->k); break; case BPF_LEN: printf("len($data)"); break; case BPF_MSH: printf("4 * $data[%u] & 0x0f", bpf->k); break; } break; case BPF_ST: case BPF_STX: printf("$temp[%u]", bpf->k); break; case BPF_ALU: if (BPF_SRC(bpf->code) == BPF_K) { switch (BPF_OP(bpf->code)) { case BPF_OR: case BPF_AND: printf("0x%.8x", bpf->k); break; default: printf("%u", bpf->k); } } else printf("%u", bpf->k); break; case BPF_JMP: if (BPF_OP(bpf->code) == BPF_JA) { printf("%.4u", (line + 1) + bpf->k); } else { printf("%-4u true:%.4u false:%.4u", bpf->k, (line + 1) + bpf->jt, (line + 1) + bpf->jf); } break; case BPF_RET: if (BPF_RVAL(bpf->code) == BPF_A) { /* XXX - accumulator? */ printf("$acc"); } else if (BPF_SRC(bpf->code) == BPF_K) { bpf_decode_action(bpf->k); } else if (BPF_SRC(bpf->code) == BPF_X) { /* XXX - any idea? */ printf("???"); } break; case BPF_MISC: break; default: printf("???"); } } /** * Perform a simple decoding of the BPF program * @param file the BPF program * * Read the BPF program and display the instructions. Returns zero on success, * non-zero values on failure. * */ static int bpf_decode(FILE *file) { unsigned int line = 0; bpf_instr_raw bpf; /* header */ printf(" line OP JT JF K\n"); printf("=================================\n"); while (fread(&bpf, sizeof(bpf), 1, file)) { /* convert the bpf statement */ bpf.code = ttoh16(arch, bpf.code); bpf.k = ttoh32(arch, bpf.k); /* display a hex dump */ printf(" %.4u: 0x%.2x 0x%.2x 0x%.2x 0x%.8x", line, bpf.code, bpf.jt, bpf.jf, bpf.k); /* display the assembler statements */ printf(" "); printf(_OP_FMT, bpf_decode_op(&bpf)); printf(" "); bpf_decode_args(&bpf, line); printf("\n"); line++; } if (ferror(file)) return errno; return 0; } /** * Decode the BPF arguments (JT, JF, and K) * @param bpf the BPF instruction * @param line the current line number * * Decode the BPF arguments (JT, JF, and K) and print the relevant information * to stdout based on the operand. * */ static void bpf_dot_decode_args(const bpf_instr_raw *bpf, unsigned int line) { const char *op = bpf_decode_op(bpf); printf("\tline%d[label=\"%s", line, op); switch (BPF_CLASS(bpf->code)) { case BPF_LD: case BPF_LDX: switch (BPF_MODE(bpf->code)) { case BPF_ABS: printf(" $data[%u]\",shape=parallelogram]\n", bpf->k); break; case BPF_MEM: printf(" $temp[%u]\",shape=parallelogram]\n", bpf->k); break; case BPF_IMM: printf(" %u\",shape=parallelogram]\n", bpf->k); break; case BPF_IND: printf(" $data[X + %u]\",shape=parallelogram]\n", bpf->k); break; case BPF_LEN: printf(" len($data)\",shape=parallelogram]\n"); break; case BPF_MSH: printf(" 4 * $data[%u] & 0x0f\",shape=parallelogram]\n", bpf->k); break; } break; case BPF_ST: case BPF_STX: printf(" $temp[%u]\",shape=parallelogram]\n", bpf->k); break; case BPF_ALU: if (BPF_SRC(bpf->code) == BPF_K) { switch (BPF_OP(bpf->code)) { case BPF_OR: case BPF_AND: printf(" 0x%.8x\",shape=rectangle]\n", bpf->k); break; default: printf(" %u\",shape=rectangle]\n", bpf->k); } } else printf(" %u\",shape=rectangle]\n", bpf->k); break; case BPF_JMP: if (BPF_OP(bpf->code) == BPF_JA) { printf("\",shape=hexagon]\n"); printf("\tline%d -> line%d\n", line, (line + 1) + bpf->k); } else { printf(" %-4u", bpf->k); /* Heuristic: if k > 256, also emit hex version */ if (bpf->k > 256) printf("\\n(0x%.8x)", bpf->k); printf("\",shape=diamond]\n"); printf("\tline%d -> line%d [label=\"true\"]\n", line, (line + 1) + bpf->jt); printf("\tline%d -> line%d [label=\"false\"]\n", line, (line + 1) + bpf->jf); } break; case BPF_RET: if (BPF_RVAL(bpf->code) == BPF_A) { /* XXX - accumulator? */ printf(" $acc\", shape=\"box\", style=rounded]\n"); } else if (BPF_SRC(bpf->code) == BPF_K) { printf(" "); bpf_decode_action(bpf->k); printf("\", shape=\"box\", style=rounded]\n"); } else if (BPF_SRC(bpf->code) == BPF_X) { /* XXX - any idea? */ printf(" ???\", shape=\"box\", style=rounded]\n"); } break; case BPF_MISC: printf("\"]\n"); break; default: printf(" ???\"]\n"); } } /** * Perform a simple decoding of the BPF program to a dot graph * @param file the BPF program * * Read the BPF program and display the instructions. Returns zero on success, * non-zero values on failure. * */ static int bpf_dot_decode(FILE *file) { unsigned int line = 0; bpf_instr_raw bpf; int prev_class = 0; /* header */ printf("digraph {\n"); printf("\tstart[shape=\"box\", style=rounded];\n"); while (fread(&bpf, sizeof(bpf), 1, file)) { /* convert the bpf statement */ bpf.code = ttoh16(arch, bpf.code); bpf.k = ttoh32(arch, bpf.k); /* display the statement */ bpf_dot_decode_args(&bpf, line); /* if previous line wasn't RET/JMP, link it to this line */ if (line == 0) printf("\tstart -> line%d\n", line); else if ((prev_class != BPF_JMP) && (prev_class != BPF_RET)) printf("\tline%d -> line%d\n", line - 1, line); prev_class = BPF_CLASS(bpf.code); line++; } printf("}\n"); if (ferror(file)) return errno; return 0; } /** * main */ int main(int argc, char *argv[]) { int rc; int opt; bool dot_out = false; FILE *file; /* parse the command line */ while ((opt = getopt(argc, argv, "a:dh")) > 0) { switch (opt) { case 'a': if (strcmp(optarg, "x86") == 0) arch = AUDIT_ARCH_I386; else if (strcmp(optarg, "x86_64") == 0) arch = AUDIT_ARCH_X86_64; else if (strcmp(optarg, "x32") == 0) arch = AUDIT_ARCH_X86_64; else if (strcmp(optarg, "arm") == 0) arch = AUDIT_ARCH_ARM; else if (strcmp(optarg, "aarch64") == 0) arch = AUDIT_ARCH_AARCH64; else if (strcmp(optarg, "loongarch64") == 0) arch = AUDIT_ARCH_LOONGARCH64; else if (strcmp(optarg, "mips") == 0) arch = AUDIT_ARCH_MIPS; else if (strcmp(optarg, "mipsel") == 0) arch = AUDIT_ARCH_MIPSEL; else if (strcmp(optarg, "mips64") == 0) arch = AUDIT_ARCH_MIPS64; else if (strcmp(optarg, "mipsel64") == 0) arch = AUDIT_ARCH_MIPSEL64; else if (strcmp(optarg, "mips64n32") == 0) arch = AUDIT_ARCH_MIPS64N32; else if (strcmp(optarg, "mipsel64n32") == 0) arch = AUDIT_ARCH_MIPSEL64N32; else if (strcmp(optarg, "ppc64") == 0) arch = AUDIT_ARCH_PPC64; else if (strcmp(optarg, "ppc64le") == 0) arch = AUDIT_ARCH_PPC64LE; else if (strcmp(optarg, "ppc") == 0) arch = AUDIT_ARCH_PPC; else if (strcmp(optarg, "s390") == 0) arch = AUDIT_ARCH_S390; else if (strcmp(optarg, "s390x") == 0) arch = AUDIT_ARCH_S390X; else if (strcmp(optarg, "riscv64") == 0) arch = AUDIT_ARCH_RISCV64; else exit_usage(argv[0]); break; case 'd': dot_out = true; break; default: /* usage information */ exit_usage(argv[0]); } } if ((optind > 1) && (optind < argc)) { int opt_file = optind - 1 ; file = fopen(argv[opt_file], "r"); if (file == NULL) { fprintf(stderr, "error: unable to open \"%s\" (%s)\n", argv[opt_file], strerror(errno)); return errno; } } else file = stdin; if (dot_out) rc = bpf_dot_decode(file); else rc = bpf_decode(file); fclose(file); return rc; } libseccomp-2.5.4/tools/scmp_bpf_sim.c0000644000000000000000000002160214467535325016324 0ustar rootroot/** * BPF Simulator * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include "bpf.h" #include "util.h" #define BPF_PRG_MAX_LEN 4096 /** * BPF simulator machine state */ struct sim_state { uint32_t acc; uint32_t temp[BPF_SCRATCH_SIZE]; }; struct bpf_program { size_t i_cnt; bpf_instr_raw *i; }; static unsigned int opt_verbose = 0; /** * Print the usage information to stderr and exit * @param program the name of the current program being invoked * * Print the usage information and exit with EINVAL. * */ static void exit_usage(const char *program) { fprintf(stderr, "usage: %s -f [-v] [-h]" " -a -s [-0 ] ... [-5 ]\n", program); exit(EINVAL); } /** * Handle a simulator fault * @param rc the error or return code * * Print a "FAULT" to stderr to indicate a simulator fault, and an errno value * if the simulator is running in verbose mode, then exit with EFAULT. * */ static void exit_fault(unsigned int rc) { if (opt_verbose) fprintf(stderr, "FAULT: errno = %d\n", rc); else fprintf(stderr, "FAULT\n"); exit(EFAULT); } /** * Handle a BPF program error * @param rc the error or return code * @param line the line number * * Print an "ERROR" to stderr to indicate a program error, and an errno value * if the simulator is running in verbose mode, then exit with ENOEXEC. * */ static void exit_error(unsigned int rc, unsigned int line) { if (opt_verbose) fprintf(stderr, "ERROR: errno = %d, line = %d\n", rc, line); else fprintf(stderr, "ERROR\n"); exit(ENOEXEC); } /** * Handle a simulator return/action * @param action the return value * @param line the line number * * Display the action to stdout and exit with 0. * */ static void end_action(uint32_t action, unsigned int line) { uint32_t act = action & SECCOMP_RET_ACTION_FULL; uint32_t data = action & SECCOMP_RET_DATA; switch (act) { case SECCOMP_RET_KILL_PROCESS: fprintf(stdout, "KILL_PROCESS\n"); break; case SECCOMP_RET_KILL_THREAD: fprintf(stdout, "KILL\n"); break; case SECCOMP_RET_TRAP: fprintf(stdout, "TRAP\n"); break; case SECCOMP_RET_ERRNO: fprintf(stdout, "ERRNO(%u)\n", data); break; case SECCOMP_RET_TRACE: fprintf(stdout, "TRACE(%u)\n", data); break; case SECCOMP_RET_LOG: fprintf(stdout, "LOG\n"); break; case SECCOMP_RET_ALLOW: fprintf(stdout, "ALLOW\n"); break; default: exit_error(EDOM, line); } exit(0); } /** * Execute a BPF program * @param prg the loaded BPF program * @param sys_data the syscall record being tested * * Simulate the BPF program with the given syscall record. * */ static void bpf_execute(const struct bpf_program *prg, const struct seccomp_data *sys_data) { unsigned int ip, ip_c; struct sim_state state; bpf_instr_raw *bpf; unsigned char *sys_data_b = (unsigned char *)sys_data; uint16_t code; uint8_t jt; uint8_t jf; uint32_t k; /* initialize the machine state */ ip_c = 0; ip = 0; memset(&state, 0, sizeof(state)); while (ip < prg->i_cnt) { /* get the instruction and bump the ip */ ip_c = ip; bpf = &prg->i[ip++]; code = ttoh16(arch, bpf->code); jt = bpf->jt; jf = bpf->jf; k = ttoh32(arch, bpf->k); switch (code) { case BPF_LD+BPF_W+BPF_ABS: if (k < BPF_SYSCALL_MAX) { uint32_t val = *((uint32_t *)&sys_data_b[k]); state.acc = ttoh32(arch, val); } else exit_error(ERANGE, ip_c); break; case BPF_ALU+BPF_OR+BPF_K: state.acc |= k; break; case BPF_ALU+BPF_AND+BPF_K: state.acc &= k; break; case BPF_JMP+BPF_JA: ip += k; break; case BPF_JMP+BPF_JEQ+BPF_K: if (state.acc == k) ip += jt; else ip += jf; break; case BPF_JMP+BPF_JGT+BPF_K: if (state.acc > k) ip += jt; else ip += jf; break; case BPF_JMP+BPF_JGE+BPF_K: if (state.acc >= k) ip += jt; else ip += jf; break; case BPF_RET+BPF_K: end_action(k, ip_c); break; default: /* since we don't support the full bpf language just * yet, this could be either a fault or an error, we'll * treat it as a fault until we provide full support */ exit_fault(EOPNOTSUPP); } } /* if we've reached here there is a problem with the program */ exit_error(ERANGE, ip_c); } /** * main */ int main(int argc, char *argv[]) { int opt; int iter; char *opt_file = NULL; FILE *file; size_t file_read_len; struct seccomp_data sys_data; struct bpf_program bpf_prg; /* initialize the syscall record */ memset(&sys_data, 0, sizeof(sys_data)); /* parse the command line */ while ((opt = getopt(argc, argv, "a:f:hs:v0:1:2:3:4:5:")) > 0) { switch (opt) { case 'a': if (strcmp(optarg, "x86") == 0) arch = AUDIT_ARCH_I386; else if (strcmp(optarg, "x86_64") == 0) arch = AUDIT_ARCH_X86_64; else if (strcmp(optarg, "x32") == 0) arch = AUDIT_ARCH_X86_64; else if (strcmp(optarg, "arm") == 0) arch = AUDIT_ARCH_ARM; else if (strcmp(optarg, "aarch64") == 0) arch = AUDIT_ARCH_AARCH64; else if (strcmp(optarg, "loongarch64") == 0) arch = AUDIT_ARCH_LOONGARCH64; else if (strcmp(optarg, "m68k") == 0) arch = AUDIT_ARCH_M68K; else if (strcmp(optarg, "mips") == 0) arch = AUDIT_ARCH_MIPS; else if (strcmp(optarg, "mipsel") == 0) arch = AUDIT_ARCH_MIPSEL; else if (strcmp(optarg, "mips64") == 0) arch = AUDIT_ARCH_MIPS64; else if (strcmp(optarg, "mipsel64") == 0) arch = AUDIT_ARCH_MIPSEL64; else if (strcmp(optarg, "mips64n32") == 0) arch = AUDIT_ARCH_MIPS64N32; else if (strcmp(optarg, "mipsel64n32") == 0) arch = AUDIT_ARCH_MIPSEL64N32; else if (strcmp(optarg, "parisc") == 0) arch = AUDIT_ARCH_PARISC; else if (strcmp(optarg, "parisc64") == 0) arch = AUDIT_ARCH_PARISC64; else if (strcmp(optarg, "ppc") == 0) arch = AUDIT_ARCH_PPC; else if (strcmp(optarg, "ppc64") == 0) arch = AUDIT_ARCH_PPC64; else if (strcmp(optarg, "ppc64le") == 0) arch = AUDIT_ARCH_PPC64LE; else if (strcmp(optarg, "s390") == 0) arch = AUDIT_ARCH_S390; else if (strcmp(optarg, "s390x") == 0) arch = AUDIT_ARCH_S390X; else if (strcmp(optarg, "riscv64") == 0) arch = AUDIT_ARCH_RISCV64; else if (strcmp(optarg, "sheb") == 0) arch = AUDIT_ARCH_SH; else if (strcmp(optarg, "sh") == 0) arch = AUDIT_ARCH_SHEL; else exit_fault(EINVAL); break; case 'f': if (opt_file) exit_fault(EINVAL); opt_file = strdup(optarg); if (opt_file == NULL) exit_fault(ENOMEM); break; case 's': sys_data.nr = strtol(optarg, NULL, 0); break; case 'v': opt_verbose = 1; break; case '0': sys_data.args[0] = strtoull(optarg, NULL, 0); break; case '1': sys_data.args[1] = strtoull(optarg, NULL, 0); break; case '2': sys_data.args[2] = strtoull(optarg, NULL, 0); break; case '3': sys_data.args[3] = strtoull(optarg, NULL, 0); break; case '4': sys_data.args[4] = strtoull(optarg, NULL, 0); break; case '5': sys_data.args[5] = strtoull(optarg, NULL, 0); break; case 'h': default: /* usage information */ exit_usage(argv[0]); } } /* adjust the endianness of sys_data to match the target */ sys_data.nr = htot32(arch, sys_data.nr); sys_data.arch = htot32(arch, arch); sys_data.instruction_pointer = htot64(arch, sys_data.instruction_pointer); for (iter = 0; iter < BPF_SYS_ARG_MAX; iter++) sys_data.args[iter] = htot64(arch, sys_data.args[iter]); /* allocate space for the bpf program */ /* XXX - we should make this dynamic */ bpf_prg.i_cnt = 0; bpf_prg.i = calloc(BPF_PRG_MAX_LEN, sizeof(*bpf_prg.i)); if (bpf_prg.i == NULL) exit_fault(ENOMEM); /* load the bpf program */ if (opt_file == NULL) exit_usage(argv[0]); file = fopen(opt_file, "r"); if (file == NULL) exit_fault(errno); do { file_read_len = fread(&(bpf_prg.i[bpf_prg.i_cnt]), sizeof(*bpf_prg.i), 1, file); if (file_read_len == 1) bpf_prg.i_cnt++; /* check the size */ if (bpf_prg.i_cnt == BPF_PRG_MAX_LEN) exit_fault(E2BIG); } while (file_read_len > 0); fclose(file); /* execute the bpf program */ bpf_execute(&bpf_prg, &sys_data); /* we should never reach here */ exit_fault(EFAULT); return 0; } libseccomp-2.5.4/tools/.gitignore0000644000000000000000000000011714467535325015505 0ustar rootrootscmp_bpf_disasm scmp_bpf_sim scmp_sys_resolver scmp_arch_detect scmp_api_level libseccomp-2.5.4/tools/bpf.h0000644000000000000000000000641714467535325014446 0ustar rootroot/** * BPF Language Definitions * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _BPF_H #define _BPF_H #include #include /* most of these structures and values are designed to match the Linux Kernel's * BPF interface (see /usr/include/linux/{filter,seccomp}.h), but we define our * own here so that we can function independent of the host OS */ /* XXX - need to verify these values */ #define BPF_SCRATCH_SIZE 6 /** * Syscall record data format used by seccomp */ #define BPF_SYS_ARG_MAX 6 struct seccomp_data { int32_t nr; uint32_t arch; uint64_t instruction_pointer; uint64_t args[BPF_SYS_ARG_MAX]; }; #define BPF_SYSCALL_MAX (sizeof(struct seccomp_data)) /** * BPF instruction format */ struct sock_filter { uint16_t code; uint8_t jt; uint8_t jf; uint32_t k; } __attribute__ ((packed)); typedef struct sock_filter bpf_instr_raw; /* seccomp return masks */ #define SECCOMP_RET_ACTION_FULL 0xffff0000U #define SECCOMP_RET_ACTION 0x7fff0000U #define SECCOMP_RET_DATA 0x0000ffffU /* seccomp action values */ #define SECCOMP_RET_KILL_PROCESS 0x80000000U #define SECCOMP_RET_KILL_THREAD 0x00000000U #define SECCOMP_RET_KILL SECCOMP_RET_KILL_THREAD #define SECCOMP_RET_TRAP 0x00030000U #define SECCOMP_RET_ERRNO 0x00050000U #define SECCOMP_RET_TRACE 0x7ff00000U #define SECCOMP_RET_LOG 0x7ffc0000U #define SECCOMP_RET_ALLOW 0x7fff0000U /* bpf command classes */ #define BPF_CLASS(code) ((code) & 0x07) #define BPF_LD 0x00 #define BPF_LDX 0x01 #define BPF_ST 0x02 #define BPF_STX 0x03 #define BPF_ALU 0x04 #define BPF_JMP 0x05 #define BPF_RET 0x06 #define BPF_MISC 0x07 /* BPF_LD and BPF_LDX */ #define BPF_SIZE(code) ((code) & 0x18) #define BPF_W 0x00 #define BPF_H 0x08 #define BPF_B 0x10 #define BPF_MODE(code) ((code) & 0xe0) #define BPF_IMM 0x00 #define BPF_ABS 0x20 #define BPF_IND 0x40 #define BPF_MEM 0x60 #define BPF_LEN 0x80 #define BPF_MSH 0xa0 #define BPF_OP(code) ((code) & 0xf0) /* BPF_ALU */ #define BPF_ADD 0x00 #define BPF_SUB 0x10 #define BPF_MUL 0x20 #define BPF_DIV 0x30 #define BPF_OR 0x40 #define BPF_AND 0x50 #define BPF_LSH 0x60 #define BPF_RSH 0x70 #define BPF_NEG 0x80 #define BPF_MOD 0x90 #define BPF_XOR 0xa0 /* BPF_JMP */ #define BPF_JA 0x00 #define BPF_JEQ 0x10 #define BPF_JGT 0x20 #define BPF_JGE 0x30 #define BPF_JSET 0x40 #define BPF_SRC(code) ((code) & 0x08) #define BPF_K 0x00 #define BPF_X 0x08 /* BPF_RET (BPF_K and BPF_X also apply) */ #define BPF_RVAL(code) ((code) & 0x18) #define BPF_A 0x10 /* BPF_MISC */ #define BPF_MISCOP(code) ((code) & 0xf8) #define BPF_TAX 0x00 #define BPF_TXA 0x80 #endif libseccomp-2.5.4/tools/scmp_api_level.c0000644000000000000000000000170614467535325016650 0ustar rootroot/** * API Level Detector * * Copyright (c) 2018 Paul Moore * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include /** * main */ int main(int argc, char *argv[]) { unsigned int level; level = seccomp_api_get(); printf("%d\n", level); return 0; } libseccomp-2.5.4/tools/Makefile.am0000644000000000000000000000235014467535325015552 0ustar rootroot#### # Seccomp Library Utility Tools # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License # as published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # noinst_LTLIBRARIES = util.la util_la_SOURCES = util.c util.h bpf.h util_la_LDFLAGS = -module bin_PROGRAMS = \ scmp_sys_resolver noinst_PROGRAMS = \ scmp_arch_detect \ scmp_bpf_disasm \ scmp_bpf_sim \ scmp_api_level EXTRA_DIST = check-syntax scmp_app_inspector scmp_bpf_disasm_SOURCES = scmp_bpf_disasm.c bpf.h util.h scmp_bpf_sim_SOURCES = scmp_bpf_sim.c bpf.h util.h scmp_api_level_SOURCES = scmp_api_level.c scmp_sys_resolver_LDADD = ../src/libseccomp.la scmp_arch_detect_LDADD = ../src/libseccomp.la scmp_bpf_disasm_LDADD = util.la scmp_bpf_sim_LDADD = util.la scmp_api_level_LDADD = ../src/libseccomp.la libseccomp-2.5.4/tools/check-syntax0000755000000000000000000000707014467535325016051 0ustar rootroot#!/bin/bash # # libseccomp code syntax checking tool # # Copyright (c) 2013,2015 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # CHK_C_LIST="include/seccomp.h.in \ include/seccomp-syscalls.h \ src/*.c src/*.h \ tests/*.c tests/*.h \ tools/*.c tools/*.h" CHK_C_EXCLUDE="src/syscalls.perf.c" CHK_SPELL_EXCLUDE_WORDS="" #### # functions # # Dependency verification # # Arguments: # 1 Dependency to check for # function verify_deps() { [[ -z "$1" ]] && return if ! which "$1" >& /dev/null; then echo "error: install \"$1\" and include it in your \$PATH" exit 1 fi } # # Print out script usage details # function usage() { cat << EOF usage: check-syntax [-h] libseccomp code syntax checking tool optional arguments: -h show this help message and exit -f fix the file formatting EOF } # # Spellcheck source code # function tool_spell_check() { local tfile tfile=$(mktemp -t check-syntax-XXXXXX) cat - > $tfile codespell -q 16 -d -w -L "$CHK_SPELL_EXCLUDE_WORDS" $tfile cat $tfile rm -f $tfile } # # Generate a properly formatted C source/header file # function tool_c_style() { cat - | astyle --options=none --lineend=linux --mode=c \ --style=linux \ --indent=force-tab=8 \ --indent-col1-comments \ --min-conditional-indent=0 \ --max-continuation-indent=80 \ --pad-oper \ --align-pointer=name \ --align-reference=name \ --max-code-length=80 \ --break-after-logical } # # Generate a properly formatted and spellchecked C source/header file # # Arguments: # 1 Source file # function tool_c_ideal() { cat "$1" | tool_spell_check | tool_c_style } # # Check the formatting on a C source/header file # # Arguments: # 1 File to check # function tool_c_style_check() { [[ -z "$1" || ! -r "$1" ]] && return tool_c_ideal "$1" | diff -pu --label="$1.orig" "$1" --label="$1" - } # # Fix the formatting on a C source/header file # # Arguments: # 1 File to fix # function tool_c_style_fix() { [[ -z "$1" || ! -r "$1" ]] && return tmp="$(mktemp --tmpdir=$(dirname "$1"))" tool_c_ideal "$1" > "$tmp" mv "$tmp" "$1" } # # Perform all known syntax checks for the configured C sources/headers # function check_c() { for i in $CHK_C_LIST; do echo "$CHK_C_EXCLUDE" | grep -q "$i" && continue echo "Differences for $i" tool_c_style_check "$i" done } # # Perform all known syntax fixess for the configured C sources/headers # function fix_c() { for i in $CHK_C_LIST; do echo "$CHK_C_EXCLUDE" | grep -q "$i" && continue echo "Fixing $i" tool_c_style_fix "$i" done } #### # main verify_deps astyle verify_deps codespell opt_fix=0 while getopts "fh" opt; do case $opt in f) opt_fix=1 ;; h|*) usage exit 1 ;; esac done # display the results echo "=============== $(date) ===============" echo "Code Syntax Check Results (\"check-syntax $*\")" if [[ $opt_fix -eq 1 ]]; then fix_c else check_c fi echo "============================================================" # exit exit 0 libseccomp-2.5.4/tools/scmp_arch_detect.c0000644000000000000000000000554614467535325017163 0ustar rootroot/** * Architecture Detector * * Copyright (c) 2013 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include /** * Print the usage information to stderr and exit * @param program the name of the current program being invoked * * Print the usage information and exit with EINVAL. * */ static void exit_usage(const char *program) { fprintf(stderr, "usage: %s [-h] [-t]\n", program); exit(EINVAL); } /** * main */ int main(int argc, char *argv[]) { int opt; int token = 0; uint32_t arch; /* parse the command line */ while ((opt = getopt(argc, argv, "ht")) > 0) { switch (opt) { case 't': token = 1; break; case 'h': default: /* usage information */ exit_usage(argv[0]); } } arch = seccomp_arch_native(); if (token == 0) { switch (arch) { case SCMP_ARCH_X86: printf("x86\n"); break; case SCMP_ARCH_X86_64: printf("x86_64\n"); break; case SCMP_ARCH_X32: printf("x32\n"); break; case SCMP_ARCH_ARM: printf("arm\n"); break; case SCMP_ARCH_AARCH64: printf("aarch64\n"); break; case SCMP_ARCH_LOONGARCH64: printf("loongarch64\n"); case SCMP_ARCH_M68K: printf("m68k\n"); break; case SCMP_ARCH_MIPS: printf("mips\n"); break; case SCMP_ARCH_MIPSEL: printf("mipsel\n"); break; case SCMP_ARCH_MIPS64: printf("mips64\n"); break; case SCMP_ARCH_MIPSEL64: printf("mipsel64\n"); break; case SCMP_ARCH_MIPS64N32: printf("mips64n32\n"); break; case SCMP_ARCH_MIPSEL64N32: printf("mipsel64n32\n"); break; case SCMP_ARCH_PARISC: printf("parisc\n"); break; case SCMP_ARCH_PARISC64: printf("parisc64\n"); break; case SCMP_ARCH_PPC: printf("ppc\n"); break; case SCMP_ARCH_PPC64: printf("ppc64\n"); break; case SCMP_ARCH_PPC64LE: printf("ppc64le\n"); break; case SCMP_ARCH_S390: printf("s390\n"); break; case SCMP_ARCH_S390X: printf("s390x\n"); break; case SCMP_ARCH_RISCV64: printf("riscv64\n"); break; case SCMP_ARCH_SHEB: printf("sheb\n"); break; case SCMP_ARCH_SH: printf("sh\n"); break; default: printf("unknown\n"); } } else printf("%d\n", arch); return 0; } libseccomp-2.5.4/CREDITS0000644000000000000000000000504114467535324013375 0ustar rootrootlibseccomp: Contributors ======================================================================== https://github.com/seccomp/libseccomp Alex Murray Andreas Schwab Andrew Jones Andy Lutomirski Ashley Lai Bogdan Purcareata Brian Cain Christopher Waldon Chris Waldon Colin Walters Corey Bryant David Drysdale Eduardo Otubo Eric Paris Fabrice Fontaine Felix Abecassis Felix Geyer Giuseppe Scrivano Heiko Carstens Helge Deller Jake Edge James Cowgill Jan Engelhardt Jan Willeke Jay Guo Jiannan Guo Joe MacDonald John Paul Adrian Glaubitz Jonah Petri Justin Cormack Kees Cook Kyle R. Conway Kenta Tada Kir Kolyshkin Lin, Yong Xiang Luca Bruno Manabu Sugimoto Marcin Juszkiewicz Marcus Meissner Markos Chandras Mathias Krause Max Rees Michael Forney Michael Karcher Mike Frysinger Mike Strosaker Miroslav Lichvar Paul Moore Rodrigo Campos Rolf Eike Beer Samanta Navarro Sascha Grunert Serge Hallyn Stéphane Graber Stephen Coleman Thiago Marcos P. Santos Tobias Klauser Tom Hromatka Tudor Brindus Tycho Andersen Tyler Hicks Valoq Vicente Olivert Riera Vitaly Vi Shukela Vladimir Rutsky libseccomp-2.5.4/README.md0000644000000000000000000001203014467535324013630 0ustar rootroot![Enhanced Seccomp Helper Library](https://github.com/seccomp/libseccomp-artwork/blob/main/logo/libseccomp-color_text.png) =============================================================================== https://github.com/seccomp/libseccomp [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/608/badge)](https://bestpractices.coreinfrastructure.org/projects/608) [![Build Status](https://github.com/seccomp/libseccomp/workflows/Continuous%20Integration/badge.svg?branch=main)](https://github.com/seccomp/libseccomp/actions) [![Coverage Status](https://img.shields.io/coveralls/github/seccomp/libseccomp/main.svg)](https://coveralls.io/github/seccomp/libseccomp?branch=main) [![CodeQL Analysis](https://github.com/seccomp/libseccomp/actions/workflows/codeql-analysis.yml/badge.svg?branch=main)](https://github.com/seccomp/libseccomp/actions) The libseccomp library provides an easy to use, platform independent, interface to the Linux Kernel's syscall filtering mechanism. The libseccomp API is designed to abstract away the underlying BPF based syscall filter language and present a more conventional function-call based filtering interface that should be familiar to, and easily adopted by, application developers. ## Online Resources The library source repository currently lives on GitHub at the following URL: * https://github.com/seccomp/libseccomp The Go language bindings repository currently lives on GitHub at the following URL: * https://github.com/seccomp/libseccomp-golang ## Supported Architectures The libseccomp library currently supports the architectures listed below: * 32-bit x86 (x86) * 64-bit x86 (x86_64) * 64-bit x86 x32 ABI (x32) * 32-bit ARM EABI (arm) * 64-bit ARM (aarch64) * 64-bit LoongArch (loongarch64) * 32-bit Motorola 68000 (m68k) * 32-bit MIPS (mips) * 32-bit MIPS little endian (mipsel) * 64-bit MIPS (mips64) * 64-bit MIPS little endian (mipsel64) * 64-bit MIPS n32 ABI (mips64n32) * 64-bit MIPS n32 ABI little endian (mipsel64n32) * 32-bit PA-RISC (parisc) * 64-bit PA-RISC (parisc64) * 32-bit PowerPC (ppc) * 64-bit PowerPC (ppc64) * 64-bit PowerPC little endian (ppc64le) * 32-bit s390 (s390) * 64-bit s390x (s390x) * 64-bit RISC-V (riscv64) * 32-bit SuperH big endian (sheb) * 32-bit SuperH (sh) ## Documentation The "doc/" directory contains all of the currently available documentation, mostly in the form of manpages. The top level directory also contains a README file (this file) as well as the LICENSE, CREDITS, CONTRIBUTING, and CHANGELOG files. Those who are interested in contributing to the project are encouraged to read the CONTRIBUTING in the top level directory. ## Verifying Release Tarballs Before use you should verify the downloaded release tarballs and checksums using the detached signatures supplied as part of the release; the detached signature files are the "*.asc" files. If you have GnuPG installed you can verify detached signatures using the following command: # gpg --verify file.asc file At present, only the following keys, specified via the fingerprints below, are authorized to sign official libseccomp releases: Paul Moore 7100 AADF AE6E 6E94 0D2E 0AD6 55E4 5A5A E8CA 7C8A Tom Hromatka 47A6 8FCE 37C7 D702 4FD6 5E11 356C E62C 2B52 4099 More information on GnuPG can be found at their website, https://gnupg.org. ## Building and Installing the Library If you are building the libseccomp library from an official release tarball, you should follow the familiar three step process used by most autotools based applications: # ./configure # make [V=0|1] # make install However, if you are building the library from sources retrieved from the source repository you may need to run the autogen.sh script before running configure. In both cases, running "./configure -h" will display a list of build-time configuration options. ## Testing the Library There are a number of tests located in the "tests/" directory and a make target which can be used to help automate their execution. If you want to run the standard regression tests you can execute the following after building the library: # make check These tests can be safely run on any Linux system, even those where the kernel does not support seccomp-bpf (seccomp mode 2). However, be warned that the test run can take a while to run and produces a lot of output. The generated seccomp-bpf filters can be tested on a live system using the "live" tests; they can be executed using the following commands: # make check-build # (cd tests; ./regression -T live) These tests will fail if the running Linux Kernel does not provide the necessary support. ## Developer Tools The "tools/" directory includes a number of tools which may be helpful in the development of the library, or applications using the library. Not all of these tools are installed by default. ## Bug and Vulnerability Reporting Problems with the libseccomp library can be reported using the GitHub issue tracking system. Those who wish to privately report potential vulnerabilities should follow the directions in SECURITY.md. libseccomp-2.5.4/.github/0000755000000000000000000000000014467535324013715 5ustar rootrootlibseccomp-2.5.4/.github/actions/0000755000000000000000000000000014467535324015355 5ustar rootrootlibseccomp-2.5.4/.github/actions/setup/0000755000000000000000000000000014467535324016515 5ustar rootrootlibseccomp-2.5.4/.github/actions/setup/action.yml0000644000000000000000000000252514467535324020521 0ustar rootroot# # Github Action to setup the libseccomp directory # # Copyright (c) 2021 Oracle and/or its affiliates. # Author: Tom Hromatka # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # name: Setup the libseccomp directory description: "Install dependencies and configure libseccomp" runs: using: "composite" steps: - run: sudo apt-get update shell: bash - run: sudo apt-get install -y build-essential valgrind clang-tools lcov gperf astyle codespell shell: bash - run: | sudo apt-get install -y python3 python3-distutils python3-setuptools python3-pip python3 -m pip install --upgrade pip python3 -m pip install cython # Add cython to the path echo "$HOME/.local/bin" >> $GITHUB_PATH shell: bash - run: | ./autogen.sh shell: bash libseccomp-2.5.4/.github/dependabot.yml0000644000000000000000000000110314467535324016540 0ustar rootroot# # Dependabot Workflow for libseccomp # # Copyright (c) 2023 Oracle and/or its affiliates. # Author: Tom Hromatka # # based on this guide from GitHub: # https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: # Check for updates to GitHub Actions every week interval: "weekly" commit-message: prefix: "RFE: " labels: - "enhancement" - "priority/low" libseccomp-2.5.4/.github/workflows/0000755000000000000000000000000014467535324015752 5ustar rootrootlibseccomp-2.5.4/.github/workflows/codeql-analysis.yml0000644000000000000000000000152714467535324021572 0ustar rootroot# # CodeQL Workflow for libseccomp # # Copyright (c) 2022 Microsoft Corporation # Author: Paul Moore # name: "CodeQL" on: ["push", "pull_request"] jobs: analyze: name: Analyze runs-on: ubuntu-latest permissions: actions: read contents: read security-events: write strategy: fail-fast: false matrix: language: [ 'cpp', 'python' ] steps: - name: Checkout repository uses: actions/checkout@v3 - name: Initialize libseccomp uses: ./.github/actions/setup - name: Initialize CodeQL uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} - name: Autobuild uses: github/codeql-action/autobuild@v2 - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v2 libseccomp-2.5.4/.github/workflows/continuous-integration.yml0000644000000000000000000000624414467535324023232 0ustar rootroot# # Continuous Integration Workflow for libseccomp # # Copyright (c) 2021 Oracle and/or its affiliates. # Author: Tom Hromatka # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # name: Continuous Integration on: ["push", "pull_request"] jobs: tests: name: Tests runs-on: ubuntu-20.04 steps: - name: Checkout from github uses: actions/checkout@v3 - name: Initialize libseccomp uses: ./.github/actions/setup - name: Build libseccomp run: | ./configure --enable-python make check-build - name: Run tests run: | LIBSECCOMP_TSTCFG_JOBS=0 \ LIBSECCOMP_TSTCFG_STRESSCNT=5 make check livetests: name: Live Tests runs-on: ubuntu-20.04 steps: - name: Checkout from github uses: actions/checkout@v3 - name: Initialize libseccomp uses: ./.github/actions/setup - name: Build libseccomp run: | ./configure --enable-python make check-build - name: Run live tests run: | LIBSECCOMP_TSTCFG_JOBS=0 \ LIBSECCOMP_TSTCFG_TYPE=live \ LIBSECCOMP_TSTCFG_MODE_LIST=c make -C tests check scanbuild: name: Scan Build runs-on: ubuntu-20.04 steps: - name: Checkout from github uses: actions/checkout@v3 - name: Initialize libseccomp uses: ./.github/actions/setup - name: Run scan-build run: | ./configure scan-build --status-bugs make codecoverage: name: Code Coverage runs-on: ubuntu-20.04 steps: - name: Checkout from github uses: actions/checkout@v3 - name: Initialize libseccomp uses: ./.github/actions/setup - name: Configure libseccomp run: | ./configure --enable-code-coverage - name: Run tests with code coverage enabled run: | LIBSECCOMP_TSTCFG_JOBS=0 \ make test-code-coverage - name: Upload code coverage results uses: coverallsapp/github-action@master with: github-token: ${{ secrets.GITHUB_TOKEN }} path-to-lcov: ./libseccomp.lcov.info flag-name: "amd64" - name: Archive code coverage results if: ${{ always() }} uses: actions/upload-artifact@v3 with: name: Code Coverage Artifacts path: | ./libseccomp.lcov.info ./libseccomp.lcov.html.d codespell: name: Codespell runs-on: ubuntu-20.04 steps: - name: Checkout from github uses: actions/checkout@v3 - name: Spellcheck uses: codespell-project/actions-codespell@master with: ignore_words_list: extraversion exclude_file: src/syscalls.csv libseccomp-2.5.4/tests/0000755000000000000000000000000014467535325013520 5ustar rootrootlibseccomp-2.5.4/tests/57-basic-rawsysrc.tests0000644000000000000000000000031714467535325017772 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2020 Cisco Systems, Inc. # Author: Paul Moore # test type: basic # Test command 57-basic-rawsysrc libseccomp-2.5.4/tests/57-basic-rawsysrc.py0000755000000000000000000000234714467535325017270 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2020 Cisco Systems, Inc. # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import os import util from seccomp import * def test(): # this test really isn't conclusive, but considering how python does error # handling it may be the best we can do f = SyscallFilter(ALLOW) dummy = open("/dev/null", "w") os.close(dummy.fileno()) try: f = f.export_pfc(dummy) except RuntimeError: pass test() # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/40-sim-log.tests0000644000000000000000000000055414467535325016400 0ustar rootroot# # libseccomp regression test automation data # # Copyright Canonical Ltd. 2017 # Author: Tyler Hicks # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 40-sim-log all,-x32 0-350 N N N N N N LOG test type: bpf-sim-fuzz # Testname StressCount 40-sim-log 5 test type: bpf-valgrind # Testname 40-sim-log libseccomp-2.5.4/tests/16-sim-arch_basic.tests0000644000000000000000000000170314467535325017675 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2012 Red Hat # Author: Paul Moore # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 16-sim-arch_basic +all_le read 0 0x856B008 10 N N N ALLOW 16-sim-arch_basic +all_le read 1-10 0x856B008 10 N N N KILL 16-sim-arch_basic +all_le write 1-2 0x856B008 10 N N N ALLOW 16-sim-arch_basic +all_le write 3-10 0x856B008 10 N N N KILL 16-sim-arch_basic +all_le close N N N N N N ALLOW 16-sim-arch_basic +all_le open 0x856B008 4 N N N N KILL 16-sim-arch_basic +x86 socket 1 N N N N N ALLOW 16-sim-arch_basic +x86 connect 3 N N N N N ALLOW 16-sim-arch_basic +x86 shutdown 13 N N N N N ALLOW 16-sim-arch_basic +x86_64 socket 0 1 2 N N N ALLOW 16-sim-arch_basic +x86_64 connect 0 1 2 N N N ALLOW 16-sim-arch_basic +x86_64 shutdown 0 1 2 N N N ALLOW test type: bpf-valgrind # Testname 16-sim-arch_basic libseccomp-2.5.4/tests/55-basic-pfc_binary_tree.pfc0000644000000000000000000002250014467535325020652 0ustar rootroot# # pseudo filter code start # # filter for arch x86_64 (3221225534) if ($arch == 3221225534) if ($syscall > 2) if ($syscall > 10) if ($syscall > 14) # filter for syscall "pwrite64" (18) [priority: 65531] if ($syscall == 18) if ($a0.hi32 == 0) if ($a0.lo32 == 107) if ($a1.hi32 == 0) if ($a1.lo32 == 108) action ERRNO(18); # filter for syscall "pread64" (17) [priority: 65533] if ($syscall == 17) if ($a0.hi32 == 0) if ($a0.lo32 == 106) action ERRNO(17); # filter for syscall "ioctl" (16) [priority: 65535] if ($syscall == 16) action ERRNO(16); # filter for syscall "rt_sigreturn" (15) [priority: 65535] if ($syscall == 15) action ERRNO(15); else # ($syscall <= 14) # filter for syscall "rt_sigprocmask" (14) [priority: 65535] if ($syscall == 14) action ERRNO(14); # filter for syscall "rt_sigaction" (13) [priority: 65535] if ($syscall == 13) action ERRNO(13); # filter for syscall "brk" (12) [priority: 65535] if ($syscall == 12) action ERRNO(12); # filter for syscall "munmap" (11) [priority: 65535] if ($syscall == 11) action ERRNO(11); else # ($syscall <= 10) if ($syscall > 6) # filter for syscall "mprotect" (10) [priority: 65533] if ($syscall == 10) if ($a0.hi32 == 0) if ($a0.lo32 == 105) action ERRNO(10); # filter for syscall "mmap" (9) [priority: 65535] if ($syscall == 9) action ERRNO(9); # filter for syscall "lseek" (8) [priority: 65533] if ($syscall == 8) if ($a0.hi32 == 0) if ($a0.lo32 == 104) action ERRNO(8); # filter for syscall "poll" (7) [priority: 65535] if ($syscall == 7) action ERRNO(7); else # ($syscall <= 6) # filter for syscall "lstat" (6) [priority: 65535] if ($syscall == 6) action ERRNO(6); # filter for syscall "fstat" (5) [priority: 65533] if ($syscall == 5) if ($a0.hi32 == 0) if ($a0.lo32 == 103) action ERRNO(5); # filter for syscall "stat" (4) [priority: 65535] if ($syscall == 4) action ERRNO(4); # filter for syscall "close" (3) [priority: 65535] if ($syscall == 3) action ERRNO(3); else # ($syscall <= 2) # filter for syscall "open" (2) [priority: 65535] if ($syscall == 2) action ERRNO(2); # filter for syscall "write" (1) [priority: 65533] if ($syscall == 1) if ($a0.hi32 == 0) if ($a0.lo32 == 102) action ERRNO(1); # filter for syscall "read" (0) [priority: 65531] if ($syscall == 0) if ($a0.hi32 == 0) if ($a0.lo32 == 100) if ($a1.hi32 == 0) if ($a1.lo32 == 101) action ERRNO(0); # default action action ALLOW; # filter for arch aarch64 (3221225655) if ($arch == 3221225655) if ($syscall > 62) if ($syscall > 139) if ($syscall > 226) # filter for syscall "lstat" (4294957133) [priority: 65535] if ($syscall == 4294957133) action ERRNO(6); # filter for syscall "open" (4294957130) [priority: 65535] if ($syscall == 4294957130) action ERRNO(2); # filter for syscall "poll" (4294957127) [priority: 65535] if ($syscall == 4294957127) action ERRNO(7); # filter for syscall "stat" (4294957122) [priority: 65535] if ($syscall == 4294957122) action ERRNO(4); else # ($syscall <= 226) # filter for syscall "mprotect" (226) [priority: 65533] if ($syscall == 226) if ($a0.hi32 == 0) if ($a0.lo32 == 105) action ERRNO(10); # filter for syscall "mmap" (222) [priority: 65535] if ($syscall == 222) action ERRNO(9); # filter for syscall "munmap" (215) [priority: 65535] if ($syscall == 215) action ERRNO(11); # filter for syscall "brk" (214) [priority: 65535] if ($syscall == 214) action ERRNO(12); else # ($syscall <= 139) if ($syscall > 68) # filter for syscall "rt_sigreturn" (139) [priority: 65535] if ($syscall == 139) action ERRNO(15); # filter for syscall "rt_sigprocmask" (135) [priority: 65535] if ($syscall == 135) action ERRNO(14); # filter for syscall "rt_sigaction" (134) [priority: 65535] if ($syscall == 134) action ERRNO(13); # filter for syscall "fstat" (80) [priority: 65533] if ($syscall == 80) if ($a0.hi32 == 0) if ($a0.lo32 == 103) action ERRNO(5); else # ($syscall <= 68) # filter for syscall "pwrite64" (68) [priority: 65531] if ($syscall == 68) if ($a0.hi32 == 0) if ($a0.lo32 == 107) if ($a1.hi32 == 0) if ($a1.lo32 == 108) action ERRNO(18); # filter for syscall "pread64" (67) [priority: 65533] if ($syscall == 67) if ($a0.hi32 == 0) if ($a0.lo32 == 106) action ERRNO(17); # filter for syscall "write" (64) [priority: 65533] if ($syscall == 64) if ($a0.hi32 == 0) if ($a0.lo32 == 102) action ERRNO(1); # filter for syscall "read" (63) [priority: 65531] if ($syscall == 63) if ($a0.hi32 == 0) if ($a0.lo32 == 100) if ($a1.hi32 == 0) if ($a1.lo32 == 101) action ERRNO(0); else # ($syscall <= 62) # filter for syscall "lseek" (62) [priority: 65533] if ($syscall == 62) if ($a0.hi32 == 0) if ($a0.lo32 == 104) action ERRNO(8); # filter for syscall "close" (57) [priority: 65535] if ($syscall == 57) action ERRNO(3); # filter for syscall "ioctl" (29) [priority: 65535] if ($syscall == 29) action ERRNO(16); # default action action ALLOW; # filter for arch loongarch64 (3221225730) if ($arch == 3221225730) if ($syscall > 62) if ($syscall > 214) if ($syscall > 4294957051) # filter for syscall "lstat" (4294957133) [priority: 65535] if ($syscall == 4294957133) action ERRNO(6); # filter for syscall "open" (4294957130) [priority: 65535] if ($syscall == 4294957130) action ERRNO(2); # filter for syscall "poll" (4294957127) [priority: 65535] if ($syscall == 4294957127) action ERRNO(7); # filter for syscall "stat" (4294957122) [priority: 65535] if ($syscall == 4294957122) action ERRNO(4); else # ($syscall <= 4294957051) # filter for syscall "fstat" (4294957051) [priority: 65533] if ($syscall == 4294957051) if ($a0.hi32 == 0) if ($a0.lo32 == 103) action ERRNO(5); # filter for syscall "mprotect" (226) [priority: 65533] if ($syscall == 226) if ($a0.hi32 == 0) if ($a0.lo32 == 105) action ERRNO(10); # filter for syscall "mmap" (222) [priority: 65535] if ($syscall == 222) action ERRNO(9); # filter for syscall "munmap" (215) [priority: 65535] if ($syscall == 215) action ERRNO(11); else # ($syscall <= 214) if ($syscall > 68) # filter for syscall "brk" (214) [priority: 65535] if ($syscall == 214) action ERRNO(12); # filter for syscall "rt_sigreturn" (139) [priority: 65535] if ($syscall == 139) action ERRNO(15); # filter for syscall "rt_sigprocmask" (135) [priority: 65535] if ($syscall == 135) action ERRNO(14); # filter for syscall "rt_sigaction" (134) [priority: 65535] if ($syscall == 134) action ERRNO(13); else # ($syscall <= 68) # filter for syscall "pwrite64" (68) [priority: 65531] if ($syscall == 68) if ($a0.hi32 == 0) if ($a0.lo32 == 107) if ($a1.hi32 == 0) if ($a1.lo32 == 108) action ERRNO(18); # filter for syscall "pread64" (67) [priority: 65533] if ($syscall == 67) if ($a0.hi32 == 0) if ($a0.lo32 == 106) action ERRNO(17); # filter for syscall "write" (64) [priority: 65533] if ($syscall == 64) if ($a0.hi32 == 0) if ($a0.lo32 == 102) action ERRNO(1); # filter for syscall "read" (63) [priority: 65531] if ($syscall == 63) if ($a0.hi32 == 0) if ($a0.lo32 == 100) if ($a1.hi32 == 0) if ($a1.lo32 == 101) action ERRNO(0); else # ($syscall <= 62) # filter for syscall "lseek" (62) [priority: 65533] if ($syscall == 62) if ($a0.hi32 == 0) if ($a0.lo32 == 104) action ERRNO(8); # filter for syscall "close" (57) [priority: 65535] if ($syscall == 57) action ERRNO(3); # filter for syscall "ioctl" (29) [priority: 65535] if ($syscall == 29) action ERRNO(16); # default action action ALLOW; # invalid architecture action action KILL; # # pseudo filter code end # libseccomp-2.5.4/tests/58-live-tsync_notify.tests0000644000000000000000000000034114467535325020521 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2019 Cisco Systems, Inc. # Author: Paul Moore # test type: live # Testname API Result 58-live-tsync_notify 6 ALLOW libseccomp-2.5.4/tests/49-sim-64b_comparisons.tests0000644000000000000000000000167214467535325020642 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2019 Cisco Systems, Inc. # Author: Paul Moore # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 49-sim-64b_comparisons all_64 1000 0x000000000000 N N N N N ALLOW 49-sim-64b_comparisons all_64 1000 0x123000000000 N N N N N ALLOW 49-sim-64b_comparisons all_64 1000 0x1230f0000000 N N N N N ALLOW 49-sim-64b_comparisons all_64 1000 0x123400000000 N N N N N ALLOW 49-sim-64b_comparisons all_64 1000 0x123450000000 N N N N N ALLOW 49-sim-64b_comparisons all_64 1000 0x123460000000 N N N N N KILL 49-sim-64b_comparisons all_64 1000 0x1234f0000000 N N N N N KILL 49-sim-64b_comparisons all_64 1000 0x123500000000 N N N N N KILL 49-sim-64b_comparisons all_64 1000 0x1235f0000000 N N N N N KILL 49-sim-64b_comparisons all_64 1000 0x123600000000 N N N N N KILL test type: bpf-valgrind # Testname 49-sim-64b_comparisons libseccomp-2.5.4/tests/54-live-binary_tree.py0000755000000000000000000000436314467535325017571 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. # Author: Tom Hromatka # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * denylist = [ "times", "ptrace", "getuid", "syslog", "getgid", "setuid", "setgid", "geteuid", "getegid", "setpgid", "getppid", "getpgrp", "setsid", "setreuid", "setregid", "getgroups", "setgroups", "setresuid", "getresuid", "setresgid", "getresgid", "getpgid", "setfsuid", "setfsgid", ] def test(): action = util.parse_action(sys.argv[1]) if not action == ALLOW: quit(1) util.install_trap() f = SyscallFilter(TRAP) f.set_attr(Attr.CTL_TSYNC, 1) f.set_attr(Attr.CTL_OPTIMIZE, 2) # NOTE: additional syscalls required for python f.add_rule(ALLOW, "stat") f.add_rule(ALLOW, "fstat") f.add_rule(ALLOW, "open") f.add_rule(ALLOW, "openat") f.add_rule(ALLOW, "mmap") f.add_rule(ALLOW, "munmap") f.add_rule(ALLOW, "read") f.add_rule(ALLOW, "write") f.add_rule(ALLOW, "close") f.add_rule(ALLOW, "rt_sigaction") f.add_rule(ALLOW, "rt_sigreturn") f.add_rule(ALLOW, "sigreturn") f.add_rule(ALLOW, "sigaltstack") f.add_rule(ALLOW, "brk") f.add_rule(ALLOW, "exit_group") for syscall in denylist: f.add_rule(KILL, syscall) f.load() try: util.write_file("/dev/null") except OSError as ex: quit(ex.errno) quit(160) test() # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/12-sim-basic_masked_ops.py0000755000000000000000000000362214467535325020374 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) # the syscall and argument numbers are all fake to make the test simpler f.add_rule_exactly(ALLOW, 1000, Arg(0, EQ, 0), Arg(1, EQ, 1), Arg(2, EQ, 2)) f.add_rule_exactly(ALLOW, 1000, Arg(0, EQ, 0), Arg(1, MASKED_EQ, 0x00ff, 1), Arg(2, EQ, 2)) f.add_rule_exactly(ALLOW, 1000, Arg(0, EQ, 0), Arg(1, MASKED_EQ, 0xffff, 11), Arg(2, EQ, 2)) f.add_rule_exactly(ALLOW, 1000, Arg(0, EQ, 0), Arg(1, MASKED_EQ, 0xffff, 111), Arg(2, EQ, 2)) f.add_rule_exactly(ALLOW, 1000, Arg(0, EQ, 0), Arg(1, MASKED_EQ, 0xff00, 1000), Arg(2, EQ, 2)) return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/22-sim-basic_chains_array.tests0000644000000000000000000000204014467535325021413 0ustar rootroot# # libseccomp regression test automation data # # Author: Vitaly Shukela # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 22-sim-basic_chains_array all read 0 0x856B008 10 N N N ALLOW 22-sim-basic_chains_array all read 1-10 0x856B008 10 N N N KILL 22-sim-basic_chains_array all write 1-2 0x856B008 10 N N N ALLOW 22-sim-basic_chains_array all write 3-10 0x856B008 10 N N N KILL 22-sim-basic_chains_array all close N N N N N N ALLOW 22-sim-basic_chains_array all rt_sigreturn N N N N N N ALLOW 22-sim-basic_chains_array all open 0x856B008 4 N N N N KILL 22-sim-basic_chains_array x86 0-2 N N N N N N KILL 22-sim-basic_chains_array x86 7-172 N N N N N N KILL 22-sim-basic_chains_array x86 174-350 N N N N N N KILL 22-sim-basic_chains_array x86_64 4-14 N N N N N N KILL 22-sim-basic_chains_array x86_64 16-350 N N N N N N KILL test type: bpf-sim-fuzz # Testname StressCount 22-sim-basic_chains_array 5 test type: bpf-valgrind # Testname 22-sim-basic_chains_array libseccomp-2.5.4/tests/18-sim-basic_allowlist.py0000755000000000000000000000250014467535325020261 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2013 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) f.add_rule_exactly(ALLOW, "read", Arg(0, EQ, sys.stdin.fileno())) f.add_rule_exactly(ALLOW, "write", Arg(0, EQ, sys.stdout.fileno())) f.add_rule_exactly(ALLOW, "write", Arg(0, EQ, sys.stderr.fileno())) f.add_rule_exactly(ALLOW, "close") f.add_rule_exactly(ALLOW, "rt_sigreturn") return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/41-sim-syscall_priority_arch.py0000755000000000000000000000223114467535325021513 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2017 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) f.remove_arch(Arch()) f.add_arch(Arch("x86")) f.syscall_priority("socket", 128) f.add_rule_exactly(ALLOW, "socket") return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/43-sim-a2_order.c0000644000000000000000000000751614467535325016404 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. * Author: Tom Hromatka */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; /* note - a "hole" was intentionally left between 64 and 128. * reads of this size should fall through to the default action - * SCMP_ACT_KILL in this test's case. */ rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 1, SCMP_A2(SCMP_CMP_LE, 64)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(5), SCMP_SYS(read), 1, SCMP_A2(SCMP_CMP_GT, 128)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(6), SCMP_SYS(read), 1, SCMP_A2(SCMP_CMP_GT, 256)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(7), SCMP_SYS(read), 1, SCMP_A2(SCMP_CMP_GT, 512)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(8), SCMP_SYS(read), 1, SCMP_A2(SCMP_CMP_GT, 1024)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(9), SCMP_SYS(read), 1, SCMP_A2(SCMP_CMP_GT, 2048)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(10), SCMP_SYS(read), 1, SCMP_A2(SCMP_CMP_GT, 4096)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(11), SCMP_SYS(read), 1, SCMP_A2(SCMP_CMP_GT, 8192)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(12), SCMP_SYS(read), 1, SCMP_A2(SCMP_CMP_GT, 16384)); if (rc != 0) goto out; /* note - a "hole" was intentionally left between 16384 and 32768. * writes of this size should fall through to the default action - * SCMP_ACT_KILL in this test's case. */ rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, SCMP_A2(SCMP_CMP_GE, 32768)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(5), SCMP_SYS(write), 1, SCMP_A2(SCMP_CMP_LT, 128)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(6), SCMP_SYS(write), 1, SCMP_A2(SCMP_CMP_LT, 256)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(7), SCMP_SYS(write), 1, SCMP_A2(SCMP_CMP_LT, 512)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(8), SCMP_SYS(write), 1, SCMP_A2(SCMP_CMP_LT, 1024)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(9), SCMP_SYS(write), 1, SCMP_A2(SCMP_CMP_LT, 2048)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(10), SCMP_SYS(write), 1, SCMP_A2(SCMP_CMP_LT, 4096)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(11), SCMP_SYS(write), 1, SCMP_A2(SCMP_CMP_LT, 8192)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(12), SCMP_SYS(write), 1, SCMP_A2(SCMP_CMP_LT, 16384)); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/36-sim-ipc_syscalls.tests0000644000000000000000000000341714467535325020315 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2017 Red Hat # Author: Paul Moore # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 36-sim-ipc_syscalls +x86,+ppc64le,+mipsel,+sh ipc 1 N N N N N ALLOW 36-sim-ipc_syscalls +x86,+ppc64le,+mipsel,+sh ipc 2 N N N N N ALLOW 36-sim-ipc_syscalls +x86,+ppc64le,+mipsel,+sh ipc 3 N N N N N ALLOW 36-sim-ipc_syscalls +x86,+ppc64le,+mipsel,+sh ipc 4 N N N N N ALLOW 36-sim-ipc_syscalls +x86,+ppc64le,+mipsel,+sh ipc 11 N N N N N ALLOW 36-sim-ipc_syscalls +x86,+ppc64le,+mipsel,+sh ipc 12 N N N N N ALLOW 36-sim-ipc_syscalls +x86,+ppc64le,+mipsel,+sh ipc 13 N N N N N ALLOW 36-sim-ipc_syscalls +x86,+ppc64le,+mipsel,+sh ipc 14 N N N N N ALLOW 36-sim-ipc_syscalls +x86,+ppc64le,+mipsel,+sh ipc 21 N N N N N ALLOW 36-sim-ipc_syscalls +x86,+ppc64le,+mipsel,+sh ipc 22 N N N N N ALLOW 36-sim-ipc_syscalls +x86,+ppc64le,+mipsel,+sh ipc 23 N N N N N ALLOW 36-sim-ipc_syscalls +x86,+ppc64le,+mipsel,+sh ipc 24 N N N N N ALLOW 36-sim-ipc_syscalls +x86_64 semop N N N N N N ALLOW 36-sim-ipc_syscalls +x86_64 semget N N N N N N ALLOW 36-sim-ipc_syscalls +x86_64 semctl N N N N N N ALLOW 36-sim-ipc_syscalls +x86_64 semtimedop N N N N N N ALLOW 36-sim-ipc_syscalls +x86_64 msgsnd N N N N N N ALLOW 36-sim-ipc_syscalls +x86_64 msgrcv N N N N N N ALLOW 36-sim-ipc_syscalls +x86_64 msgget N N N N N N ALLOW 36-sim-ipc_syscalls +x86_64 msgctl N N N N N N ALLOW 36-sim-ipc_syscalls +x86_64 shmat N N N N N N ALLOW 36-sim-ipc_syscalls +x86_64 shmdt N N N N N N ALLOW 36-sim-ipc_syscalls +x86_64 shmget N N N N N N ALLOW 36-sim-ipc_syscalls +x86_64 shmctl N N N N N N ALLOW test type: bpf-valgrind # Testname 36-sim-ipc_syscalls libseccomp-2.5.4/tests/54-live-binary_tree.tests0000644000000000000000000000036214467535325020273 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. # Author: Tom Hromatka # test type: live # Testname API Result 54-live-binary_tree 1 ALLOW libseccomp-2.5.4/tests/23-sim-arch_all_le_basic.tests0000644000000000000000000000137014467535325021203 0ustar rootroot# # libseccomp regression test automation data # # # Copyright (c) 2013 Red Hat # Author: Paul Moore # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 23-sim-arch_all_le_basic +all_le read 0 0x856B008 10 N N N ALLOW 23-sim-arch_all_le_basic +all_le read 1-10 0x856B008 10 N N N KILL 23-sim-arch_all_le_basic +all_le write 1-2 0x856B008 10 N N N ALLOW 23-sim-arch_all_le_basic +all_le write 3-10 0x856B008 10 N N N KILL 23-sim-arch_all_le_basic +all_le close N N N N N N ALLOW 23-sim-arch_all_le_basic +all_le rt_sigreturn N N N N N N ALLOW 23-sim-arch_all_le_basic +all_le open 0x856B008 4 N N N N KILL test type: bpf-valgrind # Testname 23-sim-arch_all_le_basic libseccomp-2.5.4/tests/28-sim-arch_x86.c0000644000000000000000000000341014467535325016321 0ustar rootroot/** * Seccomp Library test program * * This test triggered a bug in libseccomp erroneously allowing the close() * syscall on x32 instead of 'KILL'ing it, as it should do for unsupported * architectures. * * Copyright (c) 2012 Red Hat * Authors: Paul Moore * Mathias Krause */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return ENOMEM; rc = seccomp_arch_remove(ctx, SCMP_ARCH_NATIVE); if (rc != 0) goto out; /* add x86-64 and x86 (in that order!) but explicitly leave out x32 */ rc = seccomp_arch_add(ctx, SCMP_ARCH_X86_64); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X86); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(1), SCMP_SYS(close), 0); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/01-sim-allow.tests0000644000000000000000000000056414467535325016733 0ustar rootroot# # libseccomp regression test automation data # # Copyright IBM Corp. 2012 # Author: Corey Bryant # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 01-sim-allow all,-x32 0-350 N N N N N N ALLOW test type: bpf-sim-fuzz # Testname StressCount 01-sim-allow 5 test type: bpf-valgrind # Testname 01-sim-allow libseccomp-2.5.4/tests/53-sim-binary_tree.py0000755000000000000000000000733214467535325017420 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. # Author: Tom Hromatka # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * table = [ {"syscall": "read", "error": 0, "arg_cnt": 0 }, {"syscall": "write", "error": 1, "arg_cnt": 0 }, {"syscall": "open", "error": 2, "arg_cnt": 0 }, {"syscall": "close", "error": 3, "arg_cnt": 2, "arg1": 100, "arg2": 101 }, {"syscall": "stat", "error": 4, "arg_cnt": 0 }, {"syscall": "fstat", "error": 5, "arg_cnt": 0 }, {"syscall": "lstat", "error": 6, "arg_cnt": 0 }, {"syscall": "poll", "error": 7, "arg_cnt": 1, "arg1": 102 }, {"syscall": "lseek", "error": 8, "arg_cnt": 2, "arg1": 103, "arg2": 104 }, {"syscall": "mmap", "error": 9, "arg_cnt": 0 }, {"syscall": "mprotect", "error": 10, "arg_cnt": 0 }, {"syscall": "munmap", "error": 11, "arg_cnt": 0 }, {"syscall": "brk", "error": 12, "arg_cnt": 0 }, {"syscall": "rt_sigaction", "error": 13, "arg_cnt": 0 }, {"syscall": "rt_sigprocmask", "error": 14, "arg_cnt": 0 }, {"syscall": "rt_sigreturn", "error": 15, "arg_cnt": 0 }, {"syscall": "ioctl", "error": 16, "arg_cnt": 0 }, {"syscall": "pread64", "error": 17, "arg_cnt": 1, "arg1": 105 }, {"syscall": "pwrite64", "error": 18, "arg_cnt": 0 }, {"syscall": "readv", "error": 19, "arg_cnt": 0 }, {"syscall": "writev", "error": 20, "arg_cnt": 0 }, {"syscall": "access", "error": 21, "arg_cnt": 0 }, {"syscall": "pipe", "error": 22, "arg_cnt": 0 }, {"syscall": "select", "error": 23, "arg_cnt": 2, "arg1": 106, "arg2": 107 }, {"syscall": "sched_yield", "error": 24, "arg_cnt": 0 }, {"syscall": "mremap", "error": 25, "arg_cnt": 2, "arg1": 108, "arg2": 109 }, {"syscall": "msync", "error": 26, "arg_cnt": 0 }, {"syscall": "mincore", "error": 27, "arg_cnt": 0 }, {"syscall": "madvise", "error": 28, "arg_cnt": 0 }, {"syscall": "dup", "error": 32, "arg_cnt": 1, "arg1": 112 }, {"syscall": "dup2", "error": 33, "arg_cnt": 0 }, {"syscall": "pause", "error": 34, "arg_cnt": 0 }, {"syscall": "nanosleep", "error": 35, "arg_cnt": 0 }, {"syscall": "getitimer", "error": 36, "arg_cnt": 0 }, {"syscall": "alarm", "error": 37, "arg_cnt": 0 }, ] def test(args): f = SyscallFilter(ALLOW) f.set_attr(Attr.CTL_OPTIMIZE, 2) f.remove_arch(Arch()) f.add_arch(Arch("aarch64")) f.add_arch(Arch("loongarch64")) f.add_arch(Arch("ppc64le")) f.add_arch(Arch("x86_64")) for entry in table: if entry["arg_cnt"] == 2: f.add_rule(ERRNO(entry["error"]), entry["syscall"], Arg(0, EQ, entry["arg1"]), Arg(1, EQ, entry["arg2"])) elif entry["arg_cnt"] == 1: f.add_rule(ERRNO(entry["error"]), entry["syscall"], Arg(0, EQ, entry["arg1"])) else: f.add_rule(ERRNO(entry["error"]), entry["syscall"]) return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/48-sim-32b_args.tests0000644000000000000000000000254614467535325017234 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2019 Cisco Systems, Inc. # Author: Paul Moore # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 48-sim-32b_args all_64 1000 0x0 N N N N N KILL 48-sim-32b_args all_64 1000 0xffffffff N N N N N KILL 48-sim-32b_args all_64 1000 0xffffffffffffffff N N N N N ALLOW 48-sim-32b_args all_64 1032 0x0 N N N N N KILL 48-sim-32b_args all_64 1032 0xffffffff N N N N N ALLOW 48-sim-32b_args all_64 1032 0xffffffffffffffff N N N N N KILL 48-sim-32b_args all_64 1064 0x0 N N N N N KILL 48-sim-32b_args all_64 1064 0xffffffff N N N N N KILL 48-sim-32b_args all_64 1064 0xffffffffffffffff N N N N N ALLOW 48-sim-32b_args all_64 2000 0x0 N N N N N KILL 48-sim-32b_args all_64 2000 0xffffffff N N N N N KILL 48-sim-32b_args all_64 2000 0xffffffffffffffff N N N N N ALLOW 48-sim-32b_args all_64 2032 0x0 N N N N N KILL 48-sim-32b_args all_64 2032 0xffffffff N N N N N ALLOW 48-sim-32b_args all_64 2032 0xffffffffffffffff N N N N N KILL 48-sim-32b_args all_64 2064 0x0 N N N N N KILL 48-sim-32b_args all_64 2064 0xffffffff N N N N N KILL 48-sim-32b_args all_64 2064 0xffffffffffffffff N N N N N ALLOW test type: bpf-sim-fuzz # Testname StressCount 48-sim-32b_args 5 test type: bpf-valgrind # Testname 48-sim-32b_args libseccomp-2.5.4/tests/03-sim-basic_chains.tests0000644000000000000000000000175414467535325020227 0ustar rootroot# # libseccomp regression test automation data # # Copyright IBM Corp. 2012 # Author: Corey Bryant # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 03-sim-basic_chains all read 0 0x856B008 10 N N N ALLOW 03-sim-basic_chains all read 1-10 0x856B008 10 N N N KILL 03-sim-basic_chains all write 1-2 0x856B008 10 N N N ALLOW 03-sim-basic_chains all write 3-10 0x856B008 10 N N N KILL 03-sim-basic_chains all close N N N N N N ALLOW 03-sim-basic_chains all rt_sigreturn N N N N N N ALLOW 03-sim-basic_chains all open 0x856B008 4 N N N N KILL 03-sim-basic_chains x86 0-2 N N N N N N KILL 03-sim-basic_chains x86 7-172 N N N N N N KILL 03-sim-basic_chains x86 174-350 N N N N N N KILL 03-sim-basic_chains x86_64 4-14 N N N N N N KILL 03-sim-basic_chains x86_64 16-350 N N N N N N KILL test type: bpf-sim-fuzz # Testname StressCount 03-sim-basic_chains 5 test type: bpf-valgrind # Testname 03-sim-basic_chains libseccomp-2.5.4/tests/11-basic-basic_errors.c0000644000000000000000000001467314467535325017652 0ustar rootroot/** * Seccomp Library test program * * Copyright IBM Corp. 2012 * Author: Corey Bryant */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include int main(int argc, char *argv[]) { int rc; scmp_filter_ctx ctx; uint32_t attr; unsigned int api; struct seccomp_notif *req = NULL; struct seccomp_notif_resp *resp = NULL; /* get the api level */ api = seccomp_api_get(); /* seccomp_init errors */ ctx = seccomp_init(SCMP_ACT_ALLOW + 1); if (ctx != NULL) return -1; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return -1; seccomp_release(ctx); ctx = NULL; /* ensure that seccomp_reset(NULL, ...) is accepted */ rc = seccomp_reset(NULL, SCMP_ACT_ALLOW); if (rc != 0) return -1; /* seccomp_load error */ rc = seccomp_load(ctx); if (rc != -EINVAL) return -1; /* seccomp_syscall_priority errors */ rc = seccomp_syscall_priority(ctx, SCMP_SYS(read), 1); if (rc != -EINVAL) return -1; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return -1; else { rc = seccomp_syscall_priority(ctx, -10, 1); if (rc != -EINVAL) return -1; } seccomp_release(ctx); ctx = NULL; /* seccomp_rule_add errors */ rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 1, SCMP_A0(SCMP_CMP_EQ, 0)); if (rc != -EINVAL) return -1; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return -1; else { rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 0); if (rc != -EACCES) return -1; rc = seccomp_rule_add(ctx, SCMP_ACT_KILL - 1, SCMP_SYS(read), 0); if (rc != -EINVAL) return -1; rc = seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(read), 7); if (rc != -EINVAL) return -1; rc = seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(read), 7, SCMP_A0(SCMP_CMP_EQ, 0), SCMP_A1(SCMP_CMP_EQ, 0), SCMP_A2(SCMP_CMP_EQ, 0), SCMP_A3(SCMP_CMP_EQ, 0), SCMP_A4(SCMP_CMP_EQ, 0), SCMP_A5(SCMP_CMP_EQ, 0), SCMP_CMP(6, SCMP_CMP_EQ, 0)); if (rc != -EINVAL) return -1; rc = seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(read), 1, SCMP_A0(_SCMP_CMP_MIN, 0)); if (rc != -EINVAL) return -1; rc = seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(read), 1, SCMP_A0(_SCMP_CMP_MAX, 0)); if (rc != -EINVAL) return -1; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, -10001, 0); if (rc != -EDOM) return -1; } seccomp_release(ctx); ctx = NULL; /* seccomp_rule_add_exact error */ ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return -1; rc = seccomp_arch_remove(ctx, SCMP_ARCH_NATIVE); if (rc != 0) return -1; rc = seccomp_arch_add(ctx, SCMP_ARCH_X86); if (rc != 0) return -1; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, SCMP_SYS(socket), 1, SCMP_A0(SCMP_CMP_EQ, 2)); if (rc != -EINVAL) return -1; rc = seccomp_rule_add_exact(ctx, 0xdeadbeef, SCMP_SYS(open), 0); if (rc != -EINVAL) return -1; seccomp_release(ctx); ctx = NULL; /* errno values beyond MAX_ERRNO */ ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return -1; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(0xffff), 0, 0); if (rc != -EINVAL) return -1; seccomp_release(ctx); ctx = NULL; /* seccomp_export_pfc errors */ rc = seccomp_export_pfc(ctx, STDOUT_FILENO); if (rc != -EINVAL) return -1; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return -1; else { rc = seccomp_export_pfc(ctx, sysconf(_SC_OPEN_MAX) - 1); if (rc != -ECANCELED) return -1; } seccomp_release(ctx); ctx = NULL; /* seccomp_export_bpf errors */ rc = seccomp_export_bpf(ctx, STDOUT_FILENO); if (rc != -EINVAL) return -1; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return -1; else { rc = seccomp_export_bpf(ctx, sysconf(_SC_OPEN_MAX) - 1); if (rc != -ECANCELED) return -1; } seccomp_release(ctx); ctx = NULL; /* seccomp_export_bpf_mem errors */ char buf[1024]; size_t buf_len = sizeof(buf); rc = seccomp_export_bpf_mem(ctx, buf, &buf_len); if (rc != -EINVAL) return -1; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return -1; rc = seccomp_export_bpf_mem(ctx, buf, NULL); if (rc != -EINVAL) return -1; rc = seccomp_export_bpf_mem(ctx, NULL, NULL); if (rc != -EINVAL) return -1; buf_len = sizeof(buf); rc = seccomp_export_bpf_mem(ctx, NULL, &buf_len); if (rc != 0) return -1; buf_len = sizeof(buf); rc = seccomp_export_bpf_mem(ctx, buf, &buf_len); if (rc != 0) return -1; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit), 0); if (rc != 0) return -1; buf_len = 0; rc = seccomp_export_bpf_mem(ctx, buf, &buf_len); if (rc != -ERANGE) return -1; seccomp_release(ctx); ctx = NULL; /* seccomp_attr_* errors */ ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return -1; rc = seccomp_attr_get(ctx, 1000, &attr); if (rc != -EINVAL) return -1; rc = seccomp_attr_set(ctx, 1000, 1); if (rc != -EINVAL) return -1; seccomp_release(ctx); ctx = NULL; /* seccomp_merge() errors */ ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return -1; rc = seccomp_merge(ctx, NULL); if (rc == 0) return -1; seccomp_release(ctx); ctx = NULL; /* seccomp notify errors */ if (api >= 5) { ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return -1; rc = seccomp_notify_alloc(NULL, NULL); if (rc != 0) return -1; rc = seccomp_notify_alloc(&req, NULL); if (rc != 0) return -1; rc = seccomp_notify_alloc(NULL, &resp); if (rc != 0) return -1; seccomp_notify_free(NULL, NULL); seccomp_notify_free(req, resp); req = NULL; resp = NULL; rc = seccomp_notify_receive(-1, NULL); if (rc == 0) return -1; rc = seccomp_notify_respond(-1, NULL); if (rc == 0) return -1; rc = seccomp_notify_id_valid(-1, 0); if (rc == 0) return -1; rc = seccomp_notify_fd(NULL); if (rc == 0) return -1; rc = seccomp_notify_fd(ctx); if (rc == 0) return -1; seccomp_release(ctx); ctx = NULL; } return 0; } libseccomp-2.5.4/tests/26-sim-arch_all_be_basic.py0000755000000000000000000000313214467535325020463 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Author: Markos Chandras # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) f.remove_arch(Arch()) f.add_arch(Arch("m68k")) f.add_arch(Arch("mips")) f.add_arch(Arch("mips64")) f.add_arch(Arch("mips64n32")) f.add_arch(Arch("parisc")) f.add_arch(Arch("parisc64")) f.add_arch(Arch("ppc")) f.add_arch(Arch("ppc64")) f.add_arch(Arch("s390")) f.add_arch(Arch("s390x")) f.add_arch(Arch("sheb")) f.add_rule(ALLOW, "read", Arg(0, EQ, sys.stdin.fileno())) f.add_rule(ALLOW, "write", Arg(0, EQ, sys.stdout.fileno())) f.add_rule(ALLOW, "write", Arg(0, EQ, sys.stderr.fileno())) f.add_rule(ALLOW, "close") f.add_rule(ALLOW, "rt_sigreturn") return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/52-basic-load.tests0000644000000000000000000000027714467535325017034 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2013 Red Hat # Author: Paul Moore # test type: basic # Test command 52-basic-load libseccomp-2.5.4/tests/59-basic-empty_binary_tree.c0000644000000000000000000000240614467535325020721 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2018-2020 Oracle and/or its affiliates. * Author: Tom Hromatka */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return ENOMEM; rc = seccomp_attr_set(ctx, SCMP_FLTATR_CTL_OPTIMIZE, 2); if (rc < 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/06-sim-actions.c0000644000000000000000000000344414467535325016342 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; rc = seccomp_api_set(3); if (rc != 0) return EOPNOTSUPP; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_LOG, SCMP_SYS(rt_sigreturn), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(write), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_TRAP, SCMP_SYS(close), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_TRACE(1234), SCMP_SYS(openat), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_KILL_PROCESS, SCMP_SYS(fstatfs), 0); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/util.c0000644000000000000000000001345714467535325014653 0ustar rootroot/** * Seccomp Library utility code for tests * * Copyright (c) 2012 Red Hat * Author: Eric Paris */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include #include #include #include #include #include "util.h" /** * SIGSYS signal handler * @param nr the signal number * @param info siginfo_t pointer * @param void_context handler context * * Simple signal handler for SIGSYS which exits with error code 161. * */ static void _trap_handler(int signal, siginfo_t *info, void *ctx) { _exit(161); } /** * Add rules for gcov/lcov * @param ctx the filter context * @param action the action for the rules * * This function is to make it easier for developers to temporarily add support * for gcov/lcov to a test program; it likely should not be used in the normal * regression tests. Further, this should only be necessary for the "live" * tests. * */ int util_gcov_rules(const scmp_filter_ctx ctx, int action) { int rc; rc = seccomp_rule_add(ctx, action, SCMP_SYS(open), 0); if (rc != 0) return rc; rc = seccomp_rule_add(ctx, action, SCMP_SYS(openat), 0); if (rc != 0) return rc; rc = seccomp_rule_add(ctx, action, SCMP_SYS(fcntl), 0); if (rc != 0) return rc; rc = seccomp_rule_add(ctx, action, SCMP_SYS(lseek), 0); if (rc != 0) return rc; rc = seccomp_rule_add(ctx, action, SCMP_SYS(read), 0); if (rc != 0) return rc; rc = seccomp_rule_add(ctx, action, SCMP_SYS(write), 0); if (rc != 0) return rc; rc = seccomp_rule_add(ctx, action, SCMP_SYS(getpid), 0); if (rc != 0) return rc; return 0; } /** * Parse the arguments passed to main * @param argc the argument count * @param argv the argument pointer * @param opts the options structure * * This function parses the arguments passed to the test from the command line. * Returns zero on success and negative values on failure. * */ int util_getopt(int argc, char *argv[], struct util_options *opts) { int rc = 0; if (opts == NULL) return -EFAULT; memset(opts, 0, sizeof(*opts)); while (1) { int c, option_index = 0; const struct option long_options[] = { {"bpf", no_argument, &(opts->bpf_flg), 1}, {"pfc", no_argument, &(opts->bpf_flg), 0}, {0, 0, 0, 0}, }; c = getopt_long(argc, argv, "bp", long_options, &option_index); if (c == -1) break; switch (c) { case 0: break; case 'b': opts->bpf_flg = 1; break; case 'p': opts->bpf_flg = 0; break; default: rc = -EINVAL; break; } } if (rc == -EINVAL || optind < argc) { fprintf(stderr, "usage %s: [--bpf,-b] [--pfc,-p]\n", argv[0]); rc = -EINVAL; } return rc; } /** * Output the filter in either BPF or PFC * @param opts the options structure * @param ctx the filter context * * This function outputs the seccomp filter to stdout in either BPF or PFC * format depending on the test paramaeters supplied by @opts. * */ int util_filter_output(const struct util_options *opts, const scmp_filter_ctx ctx) { int rc; if (opts == NULL) return -EFAULT; if (opts->bpf_flg) rc = seccomp_export_bpf(ctx, STDOUT_FILENO); else rc = seccomp_export_pfc(ctx, STDOUT_FILENO); return rc; } /** * Install a TRAP action signal handler * * This function installs the TRAP action signal handler and is based on * examples from Will Drewry and Kees Cook. Returns zero on success, negative * values on failure. * */ int util_trap_install(void) { struct sigaction signal_handler; sigset_t signal_mask; memset(&signal_handler, 0, sizeof(signal_handler)); sigemptyset(&signal_mask); sigaddset(&signal_mask, SIGSYS); signal_handler.sa_sigaction = &_trap_handler; signal_handler.sa_flags = SA_SIGINFO; if (sigaction(SIGSYS, &signal_handler, NULL) < 0) return -errno; if (sigprocmask(SIG_UNBLOCK, &signal_mask, NULL)) return -errno; return 0; } /** * Parse a filter action string into an action value * @param action the action string * * Parse a seccomp action string into the associated integer value. Returns * the correct value on success, -1 on failure. * */ int util_action_parse(const char *action) { if (action == NULL) return -1; if (strcasecmp(action, "KILL") == 0) return SCMP_ACT_KILL; if (strcasecmp(action, "KILL_PROCESS") == 0) return SCMP_ACT_KILL_PROCESS; else if (strcasecmp(action, "TRAP") == 0) return SCMP_ACT_TRAP; else if (strcasecmp(action, "ERRNO") == 0) return SCMP_ACT_ERRNO(163); else if (strcasecmp(action, "TRACE") == 0) return -1; /* not yet supported */ else if (strcasecmp(action, "ALLOW") == 0) return SCMP_ACT_ALLOW; else if (strcasecmp(action, "LOG") == 0) return SCMP_ACT_LOG; return -1; } /** * Write a string to a file * @param path the file path * * Open the specified file, write a string to the file, and close the file. * Return zero on success, negative values on error. * */ int util_file_write(const char *path) { int fd; const char buf[] = "testing"; ssize_t buf_len = strlen(buf); fd = open(path, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); if (fd < 0) return -errno; if (write(fd, buf, buf_len) < buf_len) { int rc = -errno; close(fd); return rc; } if (close(fd) < 0) return -errno; return 0; } libseccomp-2.5.4/tests/22-sim-basic_chains_array.py0000755000000000000000000000272214467535325020713 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2013 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # # NOTE: this is identical to 03-sim-basic_chains.py but is here to satisfy the # need for an equivalent Python test for each native C test import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) f.add_rule_exactly(ALLOW, "read", Arg(0, EQ, sys.stdin.fileno())) f.add_rule_exactly(ALLOW, "write", Arg(0, EQ, sys.stdout.fileno())) f.add_rule_exactly(ALLOW, "write", Arg(0, EQ, sys.stderr.fileno())) f.add_rule_exactly(ALLOW, "close") f.add_rule_exactly(ALLOW, "rt_sigreturn") return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/43-sim-a2_order.tests0000644000000000000000000000514714467535325017322 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. # Author: Tom Hromatka # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 43-sim-a2_order all read 4 0x856B008 30 N N N ALLOW 43-sim-a2_order all read 4 0x856B008 64 N N N ALLOW 43-sim-a2_order all read 4 0x856B008 65 N N N KILL 43-sim-a2_order all read 4 0x856B008 128 N N N KILL 43-sim-a2_order all read 4 0x856B008 129 N N N ERRNO(5) 43-sim-a2_order all read 4 0x856B008 250 N N N ERRNO(5) 43-sim-a2_order all read 4 0x856B008 256 N N N ERRNO(5) 43-sim-a2_order all read 4 0x856B008 257 N N N ERRNO(6) 43-sim-a2_order all read 4 0x856B008 512 N N N ERRNO(6) 43-sim-a2_order all read 4 0x856B008 513 N N N ERRNO(7) 43-sim-a2_order all read 4 0x856B008 1024 N N N ERRNO(7) 43-sim-a2_order all read 4 0x856B008 1025 N N N ERRNO(8) 43-sim-a2_order all read 4 0x856B008 2048 N N N ERRNO(8) 43-sim-a2_order all read 4 0x856B008 2049 N N N ERRNO(9) 43-sim-a2_order all read 4 0x856B008 4096 N N N ERRNO(9) 43-sim-a2_order all read 4 0x856B008 4097 N N N ERRNO(10) 43-sim-a2_order all read 4 0x856B008 8192 N N N ERRNO(10) 43-sim-a2_order all read 4 0x856B008 8193 N N N ERRNO(11) 43-sim-a2_order all read 4 0x856B008 16384 N N N ERRNO(11) 43-sim-a2_order all read 4 0x856B008 16385 N N N ERRNO(12) 43-sim-a2_order all write 4 0x856B008 65 N N N ERRNO(5) 43-sim-a2_order all write 4 0x856B008 128 N N N ERRNO(6) 43-sim-a2_order all write 4 0x856B008 129 N N N ERRNO(6) 43-sim-a2_order all write 4 0x856B008 250 N N N ERRNO(6) 43-sim-a2_order all write 4 0x856B008 256 N N N ERRNO(7) 43-sim-a2_order all write 4 0x856B008 257 N N N ERRNO(7) 43-sim-a2_order all write 4 0x856B008 512 N N N ERRNO(8) 43-sim-a2_order all write 4 0x856B008 513 N N N ERRNO(8) 43-sim-a2_order all write 4 0x856B008 1024 N N N ERRNO(9) 43-sim-a2_order all write 4 0x856B008 1025 N N N ERRNO(9) 43-sim-a2_order all write 4 0x856B008 2048 N N N ERRNO(10) 43-sim-a2_order all write 4 0x856B008 2049 N N N ERRNO(10) 43-sim-a2_order all write 4 0x856B008 4096 N N N ERRNO(11) 43-sim-a2_order all write 4 0x856B008 4097 N N N ERRNO(11) 43-sim-a2_order all write 4 0x856B008 8192 N N N ERRNO(12) 43-sim-a2_order all write 4 0x856B008 8193 N N N ERRNO(12) 43-sim-a2_order all write 4 0x856B008 16384 N N N KILL 43-sim-a2_order all write 4 0x856B008 16385 N N N KILL 43-sim-a2_order all write 4 0x856B008 32768 N N N ALLOW # Testname StressCount test type: bpf-valgrind # Testname 43-sim-a2_order libseccomp-2.5.4/tests/27-sim-bpf_blk_state.c0000644000000000000000000000525214467535325017503 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2015 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return ENOMEM; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, 1000, 1, SCMP_A0(SCMP_CMP_EQ, 3)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, 1000, 1, SCMP_A0(SCMP_CMP_EQ, 4)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, 1000, 1, SCMP_A0(SCMP_CMP_EQ, 5)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, 1000, 1, SCMP_A0(SCMP_CMP_EQ, 6)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, 1000, 1, SCMP_A0(SCMP_CMP_EQ, 7)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, 1000, 1, SCMP_A0(SCMP_CMP_EQ, 8)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, 1000, 1, SCMP_A0(SCMP_CMP_EQ, 9)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, 1000, 1, SCMP_A0(SCMP_CMP_EQ, 11)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, 1000, 1, SCMP_A0(SCMP_CMP_EQ, 12)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, 1000, 1, SCMP_A0(SCMP_CMP_EQ, 13)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, 1000, 1, SCMP_A0(SCMP_CMP_EQ, 14)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, 1000, 1, SCMP_A0(SCMP_CMP_EQ, 15)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, 1000, 1, SCMP_A0(SCMP_CMP_GE, 16)); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/55-basic-pfc_binary_tree.sh0000755000000000000000000000143214467535325020520 0ustar rootroot#!/bin/bash # # libseccomp regression test automation data # # Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. # Author: Tom Hromatka # #### # functions # # Dependency check # # Arguments: # 1 Dependency to check for # function check_deps() { [[ -z "$1" ]] && return which "$1" >& /dev/null return $? } # # Dependency verification # # Arguments: # 1 Dependency to check for # function verify_deps() { [[ -z "$1" ]] && return if ! check_deps "$1"; then echo "error: install \"$1\" and include it in your \$PATH" exit 1 fi } #### # functions verify_deps diff # compare output to the known good output, fail if different ./55-basic-pfc_binary_tree | \ diff -q ${srcdir:=.}/55-basic-pfc_binary_tree.pfc - > /dev/null libseccomp-2.5.4/tests/regression0000755000000000000000000007674514467535325015651 0ustar rootroot#!/bin/bash # # libseccomp regression test automation script # # Copyright IBM Corp. 2012 # Author: Corey Bryant # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # GLBL_ARCH_LE_SUPPORT=" \ x86 x86_64 x32 \ arm aarch64 \ loongarch64 \ mipsel mipsel64 mipsel64n32 \ ppc64le \ riscv64 \ sh" GLBL_ARCH_BE_SUPPORT=" \ m68k \ mips mips64 mips64n32 \ parisc parisc64 \ ppc ppc64 \ s390 s390x \ sheb" GLBL_ARCH_32B_SUPPORT=" \ x86 x32 \ arm \ m68k \ mips mipsel mips64n32 mipsel64n32 \ parisc \ ppc \ s390 \ sheb sh" GLBL_ARCH_64B_SUPPORT=" \ x86_64 \ aarch64 \ loongarch64 \ mips64 \ parisc64 \ ppc64 \ riscv64 \ s390x" GLBL_SYS_ARCH="../tools/scmp_arch_detect" GLBL_SYS_RESOLVER="../tools/scmp_sys_resolver" GLBL_SYS_SIM="../tools/scmp_bpf_sim" GLBL_SYS_API="../tools/scmp_api_level" #### # functions # # Dependency check # # Arguments: # 1 Dependency to check for # function check_deps() { [[ -z "$1" ]] && return which "$1" >& /dev/null return $? } # # Dependency verification # # Arguments: # 1 Dependency to check for # function verify_deps() { [[ -z "$1" ]] && return if ! check_deps "$1"; then echo "error: install \"$1\" and include it in your \$PATH" exit 1 fi } # # Print out script usage details # function usage() { cat << EOF usage: regression [-h] [-v] [-j JOBS] [-m MODE] [-a] [-b BATCH_NAME] [-l ] [-s SINGLE_TEST] [-t ] [-T ] libseccomp regression test automation script optional arguments: -h show this help message and exit -j JOBS run up to JOBS test jobs in parallel can also be set via LIBSECCOMP_TSTCFG_JOBS env variable -m MODE specified the test mode [c (default), python] can also be set via LIBSECCOMP_TSTCFG_MODE_LIST env variable -a specifies all tests are to be run -b BATCH_NAME specifies batch of tests to be run can also be set via LIBSECCOMP_TSTCFG_BATCHES env variable -l [LOG] specifies log file to write test results to -s SINGLE_TEST specifies individual test number to be run -t [TEMP_DIR] specifies directory to create temporary files in -T [TEST_TYPE] only run tests matching the specified type can also be set via LIBSECCOMP_TSTCFG_TYPE env variable -v specifies that verbose output be provided EOF } # # Match on a single word/column in a CSV string # # Arguments: # 1 string containing the CSV # 2 string containing the word to match # # Returns true/0 if a match is found false/1 otherwise. # function match_csv_word() { [[ -z $1 || -z $2 ]] && return 1 echo "$1" | sed 's/,/ /g' | grep -w "$2" } # # Generate a string representing the test number # # Arguments: # 1 string containing the batch name # 2 value of the test number from the input test data file # 3 value of the subtest number that corresponds to argument 1 # # The actual test number from the input test data file is 1 for the first # test found in the file, 2 for the second, etc. # # The subtest number is useful for batches that generate multiple tests based # on a single line of input from the test data file. The subtest number # should be set to zero if the corresponding test data is actual test data # that was read from the input file, and should be set to a value greater than # zero if the corresponding test data is generated. # function generate_test_num() { local testnumstr=$(printf '%s%%%%%03d-%05d' "$1" $2 $3) echo "$testnumstr" } # # Print the test data to the log file # # Arguments: # 1 string containing generated test number # 2 string containing line of test data # function print_data() { if [[ -n $verbose ]]; then printf "Test %s data: %s\n" "$1" "$2" >&$logfd fi } # # Print the test result to the log file # # Arguments: # 1 string containing generated test number # 2 string containing the test result (INFO, SUCCESS, ERROR, or FAILURE) # 3 string containing addition details # function print_result() { if [[ $2 == "INFO" && -z $verbose ]]; then return fi if [[ $3 == "" ]]; then printf "Test %s result: %s\n" "$1" "$2" >&$logfd else printf "Test %s result: %s %s\n" "$1" "$2" "$3" >&$logfd fi } # # Print the valgrind header to the log file # # Arguments: # 1 string containing generated test number # function print_valgrind() { if [[ -n $verbose ]]; then printf "Test %s valgrind output\n" "$1" >&$logfd fi } # # Get the low or high range value from a range specification # # Arguments: # 1 value specifying range value to retrieve: low (1) or high (2) # 2 string containing dash-separated range or a single value # function get_range() { if [[ $2 =~ ^[0-9a-fA-Fx]+-[0-9a-fA-Fx]+$ ]]; then # if there's a dash, get the low or high range value range_val=$(echo "$2" | cut -d'-' -f "$1") else # otherwise there should just be a single value range_val="$2" fi echo "$range_val" } # # Get the number sequence for a given range with increments of 1, i.e. # implement a specialized seq(1). # # We use our own implementation based on miniseq in favour to the standard seq # tool as, at least, seq of coreutils v8.23 and v8.24 has problems on 32 bit # ARM for large numbers (see the mailing thread at # https://groups.google.com/forum/#!topic/libseccomp/VtrClkXxLGA). # # Arguments: # 1 starting value # 2 last value # function get_seq() { # NOTE: this whole thing is a bit hacky, but we need to search around # for miniseq to fix 'make distcheck', someday we should fix this if [[ -x ./miniseq ]]; then ./miniseq "$1" "$2" elif [[ -x $basedir/miniseq ]]; then $basedir/miniseq "$1" "$2" else # we're often run from a subshell, so we can't simply exit echo "error: unable to find miniseq" >&2 kill $pid fi } # # Run the specified test command (with valgrind if requested) # # Arguments: # 1 string containing generated test number # 2 string containing command name # 3 string containing command options # 4 number for the stdout fd # 5 number for the stderr fd # function run_test_command() { local cmd if [[ $mode == "python" ]]; then cmd="PYTHONPATH=$PYTHONPATH" cmd="$cmd:$(cd $(pwd)/../src/python/build/lib.*; pwd)" # check and adjust if we are doing a VPATH build if [[ -e "./$2.py" ]]; then cmd="$cmd /usr/bin/env python $2.py $3" else cmd="$cmd /usr/bin/env python ${srcdir}/$2.py $3" fi else cmd="$2 $3" fi # setup the stdout/stderr redirects local stdout=$4 local stderr=$5 [[ -z $stdout ]] && stdout=$logfd [[ -z $stderr ]] && stderr=$logfd # run the command eval "$cmd" 1>&$stdout 2>&$stderr # return the command's return code return $? } # # Generate pseudo-random string of alphanumeric characters # # The generated string will be no larger than the corresponding # architecture's register size. # function generate_random_data() { local rcount local rdata if [[ $arch == "x86_64" ]]; then rcount=$[ ($RANDOM % 16) + 1 ] else rcount=$[ ($RANDOM % 8) + 1 ] fi rdata=$(dd if=/dev/urandom bs=64 count=1 status=none | \ md5sum | awk '{ print $1 }' | head -c"$rcount") echo "$rdata" } # # Run the specified "bpf-sim-fuzz" test # # Tests that belong to the "bpf-sim-fuzz" test type generate a BPF filter and # then run a simulated system call test with pseudo-random fuzz data for the # syscall and argument values. Tests that belong to this test type provide the # following data on a single line in the input batch file: # # Testname - The executable test name (e.g. 01-allow, 02-basic, etc.) # StressCount - The number of fuzz tests to run against the filter # # The following test data is output to the logfile for each generated test: # # Testname - The executable test name (e.g. 01-allow, 02-basic, etc.) # Syscall - The fuzzed syscall value to be simulated against the filter # Arg0-5 - The fuzzed syscall arg values to be simulated against the filter # # Arguments: # 1 string containing the batch name # 2 value of test number from batch file # 3 string containing line of test data from batch file # function run_test_bpf_sim_fuzz() { local rc # begin splitting the test data from the line into individual variables local line=($3) local testname=${line[0]} local stress_count=${line[1]} # check for stress count configuration via environment variables [[ -n $LIBSECCOMP_TSTCFG_STRESSCNT ]] && \ stress_count=$LIBSECCOMP_TSTCFG_STRESSCNT for i in $(get_seq 1 $stress_count); do local sys=$(generate_random_data) local -a arg=($(generate_random_data) $(generate_random_data) \ $(generate_random_data) $(generate_random_data) \ $(generate_random_data) $(generate_random_data)) # get the generated sub-test num string local testnumstr=$(generate_test_num "$1" $2 $i) # set up log file test data line for this individual test, # spacing is added to align the output in the correct columns local -a COL_WIDTH=(26 17 17 17 17 17 17) local testdata=$(printf "%-${COL_WIDTH[0]}s" $testname) testdata+=$(printf "%-${COL_WIDTH[1]}s" $sys) testdata+=$(printf "%-${COL_WIDTH[2]}s" ${arg[0]}) testdata+=$(printf "%-${COL_WIDTH[3]}s" ${arg[1]}) testdata+=$(printf "%-${COL_WIDTH[4]}s" ${arg[2]}) testdata+=$(printf "%-${COL_WIDTH[5]}s" ${arg[3]}) testdata+=$(printf "%-${COL_WIDTH[6]}s" ${arg[4]}) testdata+=$(printf "%s" ${arg[5]}) # print out the generated test data to the log file print_data "$testnumstr" "$testdata" # set up the syscall argument values to be passed to bpf_sim for i in {0..5}; do arg[$i]=" -$i ${arg[$i]} " done # run the test command and put the BPF filter in a temp file exec 4>$tmpfile run_test_command "$testnumstr" "./$testname" "-b" 4 "" rc=$? exec 4>&- if [[ $rc -ne 0 ]]; then print_result $testnumstr "ERROR" "$testname rc=$rc" stats_error=$(($stats_error+1)) return fi # simulate the fuzzed syscall data against the BPF filter, we # don't verify the resulting action since we're just testing for # stability allow=$($GLBL_SYS_SIM -f $tmpfile -s $sys \ ${arg[0]} ${arg[1]} ${arg[2]} ${arg[3]} ${arg[4]} \ ${arg[5]}) rc=$? if [[ $rc -ne 0 ]]; then print_result $testnumstr "ERROR" "bpf_sim rc=$rc" stats_error=$(($stats_error+1)) else print_result $testnumstr "SUCCESS" "" stats_success=$(($stats_success+1)) fi stats_all=$(($stats_all+1)) done } # # Run the specified "bpf-sim" test # # Tests that belong to the "bpf-sim" test type generate a BPF filter and then # run a simulated system call test to validate the filter. Tests that belong to # this test type provide the following data on a single line in the input batch # file: # # Testname - The executable test name (e.g. 01-allow, 02-basic, etc.) # Arch - The architecture that the test should be run on (all, x86, x86_64) # Syscall - The syscall to simulate against the generated filter # Arg0-5 - The syscall arguments to simulate against the generated filter # Result - The expected simulation result (ALLOW, KILL, etc.) # # If a range of syscall or argument values are specified (e.g. 1-9), a test is # generated for every combination of range values. Otherwise, the individual # test is run. # # Arguments: # 1 string containing the batch name # 2 value of test number from batch file # 3 string containing line of test data from batch file # function run_test_bpf_sim() { local rc local LOW=1 local HIGH=2 local -a arg_empty=(false false false false false false) # begin splitting the test data from the line into individual variables local line=($3) local testname=${line[0]} local testarch=${line[1]} local low_syscall #line[2] local high_syscall #line[2] local -a low_arg #line[3-8] local -a high_arg #line[3-8] local result=${line[9]} # expand the architecture list local simarch_tmp local simarch_avoid simarch_tmp="" simarch_avoid="" for arch_i in $(echo $testarch | sed -e 's/,/ /g'); do case $arch_i in all) # add the native arch simarch_tmp+=" $arch" ;; all_le) # add the native arch only if it is little endian if echo "$GLBL_ARCH_LE_SUPPORT" | grep -qw "$arch"; then simarch_tmp+=" $arch" fi ;; +all_le) # add all of the little endian architectures simarch_tmp+=" $GLBL_ARCH_LE_SUPPORT" ;; all_be) # add the native arch only if it is big endian if echo "$GLBL_ARCH_BE_SUPPORT" | grep -qw "$arch"; then simarch_tmp+=" $arch" fi ;; +all_be) # add all of the big endian architectures simarch_tmp+=" $GLBL_ARCH_BE_SUPPORT" ;; all_32) # add the native arch only if it is 32-bit if echo "$GLBL_ARCH_32B_SUPPORT" | grep -qw "$arch"; then simarch_tmp+=" $arch" fi ;; +all_32) # add all of the 32-bit architectures simarch_tmp+=" $GLBL_ARCH_32B_SUPPORT" ;; all_64) # add the native arch only if it is 64-bit if echo "$GLBL_ARCH_64B_SUPPORT" | grep -qw "$arch"; then simarch_tmp+=" $arch" fi ;; +all_64) # add all of the 64-bit architectures simarch_tmp+=" $GLBL_ARCH_64B_SUPPORT" ;; +*) # add the architecture specified simarch_tmp+=" ${arch_i:1}" ;; -*) # remove the architecture specified simarch_avoid+=" ${arch_i:1}" ;; *) # add the architecture specified if it is native if [[ "$arch_i" == "$arch" ]]; then simarch_tmp+=" $arch_i" fi ;; esac done # make sure we remove any undesired architectures local simarch_list simarch_list="" for arch_i in $simarch_tmp; do if echo "$simarch_avoid" | grep -q -v -w "$arch_i"; then simarch_list+=" $arch_i" fi done simarch_list=$(echo $simarch_list | sed -e 's/ / /g;s/^ //;') # do we have any architectures remaining in the list? if [[ $simarch_list == "" ]]; then print_result $(generate_test_num "$1" $2 1) "SKIPPED" \ "(architecture difference)" stats_skipped=$(($stats_skipped+1)) return fi # get low and high range arg values line_i=3 for arg_i in {0..5}; do low_arg[$arg_i]=$(get_range $LOW "${line[$line_i]}") high_arg[$arg_i]=$(get_range $HIGH "${line[$line_i]}") # fix up empty arg values so the nested loops work if [[ ${low_arg[$arg_i]} == "N" ]]; then arg_empty[$arg_i]=true low_arg[$arg_i]=0 high_arg[$arg_i]=0 fi line_i=$(($line_i+1)) done # loop through the selected architectures for simarch in $simarch_list; do # print architecture header if necessary if [[ $simarch != $simarch_list ]]; then echo " test arch: $simarch" >&$logfd fi # reset the subtest number local subtestnum=1 # get low and high syscall values and convert them to numbers low_syscall=$(get_range $LOW "${line[2]}") if [[ ! $low_syscall =~ ^\-?[0-9]+$ ]]; then low_syscall=$($GLBL_SYS_RESOLVER -a $simarch -t \ $low_syscall) if [[ $? -ne 0 ]]; then print_result $(generate_test_num "$1" $2 1) \ "ERROR" "sys_resolver rc=$?" stats_error=$(($stats_error+1)) return fi fi high_syscall=$(get_range $HIGH "${line[2]}") if [[ ! $high_syscall =~ ^\-?[0-9]+$ ]]; then high_syscall=$($GLBL_SYS_RESOLVER -a $simarch -t \ $high_syscall) if [[ $? -ne 0 ]]; then print_result $(generate_test_num "$1" $2 1) \ "ERROR" "sys_resolver rc=$?" stats_error=$(($stats_error+1)) return fi fi # if ranges exist, the following will loop through all syscall # and arg ranges and generate/run every combination of requested # tests; if no ranges were specified, then the single test is # run for sys in $(get_seq $low_syscall $high_syscall); do for arg0 in $(get_seq ${low_arg[0]} ${high_arg[0]}); do for arg1 in $(get_seq ${low_arg[1]} ${high_arg[1]}); do for arg2 in $(get_seq ${low_arg[2]} ${high_arg[2]}); do for arg3 in $(get_seq ${low_arg[3]} ${high_arg[3]}); do for arg4 in $(get_seq ${low_arg[4]} ${high_arg[4]}); do for arg5 in $(get_seq ${low_arg[5]} ${high_arg[5]}); do local -a arg=($arg0 $arg1 $arg2 $arg3 $arg4 $arg5) # Get the generated sub-test num string local testnumstr=$(generate_test_num "$1" $2 \ $subtestnum) # format any empty args to print to log file for i in {0..5}; do if ${arg_empty[$i]}; then arg[$i]="N" fi done # set up log file test data line for this # individual test, spacing is added to align # the output in the correct columns local -a COL_WIDTH=(26 08 14 11 17 21 09 06 06) local testdata=$(printf "%-${COL_WIDTH[0]}s" $testname) testdata+=$(printf "%-${COL_WIDTH[1]}s" $simarch) testdata+=$(printf "%-${COL_WIDTH[2]}s" $sys) testdata+=$(printf "%-${COL_WIDTH[3]}s" ${arg[0]}) testdata+=$(printf "%-${COL_WIDTH[4]}s" ${arg[1]}) testdata+=$(printf "%-${COL_WIDTH[5]}s" ${arg[2]}) testdata+=$(printf "%-${COL_WIDTH[6]}s" ${arg[3]}) testdata+=$(printf "%-${COL_WIDTH[7]}s" ${arg[4]}) testdata+=$(printf "%-${COL_WIDTH[8]}s" ${arg[5]}) testdata+=$(printf "%-${COL_WIDTH[9]}s" $result) # print out the test data to the log file print_data "$testnumstr" "$testdata" # set up the syscall arguments to be passed to bpf_sim for i in {0..5}; do if ${arg_empty[$i]}; then arg[$i]="" else arg[$i]=" -$i ${arg[$i]} " fi done # run the test command and put the BPF in a temp file exec 4>$tmpfile run_test_command "$testnumstr" "./$testname" "-b" 4 "" rc=$? exec 4>&- if [[ $rc -ne 0 ]]; then print_result $testnumstr \ "ERROR" "$testname rc=$rc" stats_error=$(($stats_error+1)) return fi # simulate the specified syscall against the BPF filter # and verify the results action=$($GLBL_SYS_SIM -a $simarch -f $tmpfile \ -s $sys ${arg[0]} ${arg[1]} ${arg[2]} \ ${arg[3]} ${arg[4]} ${arg[5]}) rc=$? if [[ $rc -ne 0 ]]; then print_result $testnumstr \ "ERROR" "bpf_sim rc=$rc" stats_error=$(($stats_error+1)) elif [[ "$action" != "$result" ]]; then print_result $testnumstr "FAILURE" \ "bpf_sim resulted in $action" stats_failure=$(($stats_failure+1)) else print_result $testnumstr "SUCCESS" "" stats_success=$(($stats_success+1)) fi stats_all=$(($stats_all+1)) subtestnum=$(($subtestnum+1)) done # syscall done # arg0 done # arg1 done # arg2 done # arg3 done # arg4 done # arg5 done # architecture } # # Run the specified "basic" test # # Tests that belong to the "basic" test type will simply have the command # specified in the input batch file. The command must return zero for success # and non-zero for failure. # # Arguments: # 1 value of test number from batch file # 2 string containing line of test data from batch file # function run_test_basic() { local rc local cmd # if the test is a script, only run it in native/c mode if [[ $mode != "c" && "$2" == *.sh ]]; then print_result "$1" "SKIPPED" "(only valid in native/c mode)" stats_skipped=$(($stats_skipped+1)) return fi # print out the input test data to the log file print_data "$1" "$2" # check and adjust if we are doing a VPATH build if [[ -x "./$2" ]]; then cmd="./$2" else cmd="${srcdir}/$2" fi # run the command run_test_command "$1" "$cmd" "" "" "" rc=$? if [[ $rc -ne 0 ]]; then print_result $1 "FAILURE" "$2 rc=$rc" stats_failure=$(($stats_failure+1)) else print_result $1 "SUCCESS" "" stats_success=$(($stats_success+1)) fi stats_all=$(($stats_all+1)) } # # Run the specified "bpf-valgrind" test # # Tests that belong to the "bpf-valgrind" test type generate a BPF filter # while running under valgrind to detect any memory errors. # # Arguments: # 1 value of test number from batch file # 2 string containing line of test data from batch file # function run_test_bpf_valgrind() { local rc # we only support the native/c test mode here if [[ $mode != "c" ]]; then print_result "$1" "SKIPPED" "(only valid in native/c mode)" stats_skipped=$(($stats_skipped+1)) return fi # print out the input test data to the log file print_data "$1" "$2" # build the command testvalgrind="valgrind \ --tool=memcheck \ --error-exitcode=1 \ --leak-check=full \ --read-var-info=yes \ --track-origins=yes \ --suppressions=$basedir/valgrind_test.supp" if [[ -n $logfile ]]; then testvalgrind+=" --log-fd=$logfd" fi if [[ -z $verbose ]]; then testvalgrind+=" --quiet --log-fd=4" fi # run the command exec 4>/dev/null print_valgrind "$1" run_test_command "$1" "$testvalgrind --" "./$2 -b" 4 2 rc=$? exec 4>&- if [[ $rc -ne 0 ]]; then print_result $1 "FAILURE" "$2 rc=$rc" stats_failure=$(($stats_failure+1)) else print_result $1 "SUCCESS" "" stats_success=$(($stats_success+1)) fi stats_all=$(($stats_all+1)) } # # Run the specified "live" test # # Tests that belong to the "live" test type will attempt to run a live test # of the libseccomp library on the host system; for obvious reasons the host # system must support seccomp mode 2 for this to work correctly. # # Arguments: # 1 value of test number from batch file # 2 string containing line of test data from batch file # function run_test_live() { local rc local api local line=($2) # parse the test line line_cmd=${line[0]} line_api=${line[1]} line_act=${line[2]} line_test="$line_cmd $line_api $line_act" # check the api level api=$($GLBL_SYS_API) if [[ $api -lt $line_api ]]; then # runtime api level is too low print_result "$1" "SKIPPED" "(api level)" stats_skipped=$(($stats_skipped+1)) return fi # print out the input test data to the log file print_data "$1" "$2" # run the command exec 4>/dev/null run_test_command "$1" "./$line_cmd" "$line_act" "" 4 rc=$? exec 4>&- stats_all=$(($stats_all+1)) # setup the arch specific return values case "$arch" in x86|x86_64|x32|arm|aarch64|loongarch64|m68k|parisc|parisc64|ppc|ppc64|ppc64le|ppc|s390|s390x|riscv64|sh|sheb) rc_kill_process=159 rc_kill=159 rc_allow=160 rc_trap=161 rc_trace=162 rc_errno=163 rc_log=164 ;; mips|mipsel|mips64|mips64n32|mipsel64|mipsel64n32) rc_kill_process=140 rc_kill=140 rc_allow=160 rc_trap=161 rc_trace=162 rc_errno=163 rc_log=164 ;; *) print_result $testnumstr "ERROR" "arch $arch not supported" stats_error=$(($stats_error+1)) return ;; esac # verify the results if [[ $line_act == "KILL_PROCESS" && $rc -eq $rc_kill_process ]]; then print_result $1 "SUCCESS" "" stats_success=$(($stats_success+1)) elif [[ $line_act == "KILL" && $rc -eq $rc_kill ]]; then print_result $1 "SUCCESS" "" stats_success=$(($stats_success+1)) elif [[ $line_act == "ALLOW" && $rc -eq $rc_allow ]]; then print_result $1 "SUCCESS" "" stats_success=$(($stats_success+1)) elif [[ $line_act == "TRAP" && $rc -eq $rc_trap ]]; then print_result $1 "SUCCESS" "" stats_success=$(($stats_success+1)) elif [[ $line_act == "TRACE" ]]; then print_result $1 "ERROR" "unsupported action \"$line_act\"" stats_error=$(($stats_error+1)) elif [[ $line_act == "ERRNO" && $rc -eq $rc_errno ]]; then print_result $1 "SUCCESS" "" stats_success=$(($stats_success+1)) elif [[ $line_act == "LOG" && $rc -eq $rc_log ]]; then print_result $1 "SUCCESS" "" stats_success=$(($stats_success+1)) else print_result $1 "FAILURE" "$line_test rc=$rc" stats_failure=$(($stats_failure+1)) fi } # # Run a single test from the specified batch # # Arguments: # 1 string containing the batch name # 2 value of test number from batch file # 3 string containing line of test data from batch file # 4 string containing test type that this test belongs to # function run_test() { # generate the test number string for the line of batch test data local testnumstr=$(generate_test_num "$1" $2 1) # ensure we only run tests which match the specified type match_csv_word "$type" "$4" local type_match=$? [[ -n $type && $type_match -eq 1 ]] && return # execute the function corresponding to the test type if [[ "$4" == "basic" ]]; then run_test_basic "$testnumstr" "$3" elif [[ "$4" == "bpf-sim" ]]; then run_test_bpf_sim "$1" $2 "$3" elif [[ "$4" == "bpf-sim-fuzz" ]]; then run_test_bpf_sim_fuzz "$1" $2 "$3" elif [[ "$4" == "bpf-valgrind" ]]; then # only run this test if valgrind is installed if check_deps valgrind; then run_test_bpf_valgrind "$testnumstr" "$3" else print_result $testnumstr "SKIPPED" \ "(valgrind not installed)" stats_skipped=$(($stats_skipped+1)) fi elif [[ "$4" == "live" ]]; then # only run this test if explicitly requested if [[ -n $type ]]; then run_test_live "$testnumstr" "$3" else print_result $testnumstr "SKIPPED" \ "(must specify live tests)" stats_skipped=$(($stats_skipped+1)) fi else print_result $testnumstr "ERROR" "test type $4 not supported" stats_error=$(($stats_error+1)) fi } # # Run the requested test batch # # Arguments: # 1 Batch name # function run_test_batch() { local testnum=1 local batch_name=$1 # open temporary file if [[ -n $tmpdir ]]; then tmpfile=$(mktemp -t regression_XXXXXX --tmpdir=$tmpdir) else tmpfile=$(mktemp -t regression_XXXXXX) fi # reset the stats stats_all=0 stats_skipped=0 stats_success=0 stats_failure=0 stats_error=0 # print a test batch header echo " batch name: $batch_name" >&$logfd # loop through each line and run the requested tests while read line; do # strip whitespace, comments, and blank lines line=$(echo "$line" | \ sed -e 's/^[\t ]*//;s/[\t ]*$//;' | \ sed -e '/^[#].*$/d;/^$/d') if [[ -z $line ]]; then continue fi if [[ $line =~ ^"test type": ]]; then test_type=$(echo "$line" | \ sed -e 's/^test type: //;') # print a test mode and type header echo " test mode: $mode" >&$logfd echo " test type: $test_type" >&$logfd continue fi if [[ ${single_list[@]} ]]; then for i in ${single_list[@]}; do if [ $i -eq $testnum ]; then # we're running a single test run_test "$batch_name" \ $testnum "$line" \ "$test_type" fi done else # we're running a test from a batch run_test "$batch_name" \ $testnum "$line" "$test_type" fi testnum=$(($testnum+1)) done < "$file" # dump our stats local stats=$batch_name.$mode.stats > $stats echo -n "$stats_all $stats_skipped $stats_success " >> $stats echo -n "$stats_failure $stats_error " >> $stats echo "" >> $stats # cleanup the temporary file we created rm -f $tmpfile } # # Run the requested test batch # # Arguments: # 1 Log file # 2 PID to watch # function tail_log() { local log=$1 local pid=$2 # dump the output tail -n +0 --pid=$pid -f $log # accumulate the stats local stats=$(echo $log | sed 's/\.log$/.stats/') stats_all=$(( $stats_all + $(awk '{ print $1 }' $stats) )) stats_skipped=$(( $stats_skipped + $(awk '{ print $2 }' $stats) )) stats_success=$(( $stats_success + $(awk '{ print $3 }' $stats) )) stats_failure=$(( $stats_failure + $(awk '{ print $4 }' $stats) )) stats_error=$(( $stats_error + $(awk '{ print $5 }' $stats) )) } # # Run the requested tests # function run_tests() { local job_cnt=0 local tail_cnt=0 local -a job_pids local -a job_logs # loop through all test files for file in $basedir/*.tests; do local batch_requested=false local batch_name="" # extract the batch name from the file name batch_name=$(basename $file .tests) # check if this batch was requested if [[ ${batch_list[@]} ]]; then for b in ${batch_list[@]}; do if [[ $b == $batch_name ]]; then batch_requested=true break fi done if ! $batch_requested; then continue fi fi # run the test batch run_test_batch $batch_name >& $batch_name.$mode.log & job_pids[job_cnt]=$! job_logs[job_cnt]=$batch_name.$mode.log job_cnt=$(( $job_cnt + 1 )) # output the next log if the job queue is full if [[ $(jobs | wc -l) -ge $jobs ]]; then tail_log ${job_logs[$tail_cnt]} ${job_pids[$tail_cnt]} tail_cnt=$(( $tail_cnt + 1 )) fi done # output any leftovers for i in $(seq $tail_cnt $(( $job_cnt - 1 ))); do tail_log ${job_logs[$i]} ${job_pids[$i]} done } #### # main # verify general script dependencies verify_deps head verify_deps sed verify_deps awk verify_deps tr # global variables declare -a batch_list declare -a single_list arch= batch_count=0 logfile= logfd= mode_list="" runall= singlecount=0 tmpfile="" tmpdir="" type= verbose= jobs=1 stats_all=0 stats_skipped=0 stats_success=0 stats_failure=0 stats_error=0 # set the test root directory basedir=$(dirname $0) # set the test harness pid pid=$$ # parse the command line while getopts "ab:gj:l:m:s:t:T:vh" opt; do case $opt in a) runall=1 ;; b) batch_list[batch_count]="$OPTARG" batch_count=$(($batch_count+1)) ;; j) jobs=$OPTARG ;; l) logfile="$OPTARG" ;; m) case $OPTARG in c) mode_list="$mode_list c" ;; python) verify_deps python mode_list="$mode_list python" ;; *) usage exit 1 esac ;; s) single_list[single_count]=$OPTARG single_count=$(($single_count+1)) ;; t) tmpdir="$OPTARG" ;; T) type="$OPTARG" ;; v) verbose=1 ;; h|*) usage exit 1 ;; esac done # use mode list from environment if provided [[ -z $mode_list && -n $LIBSECCOMP_TSTCFG_MODE_LIST ]] && mode_list=$LIBSECCOMP_TSTCFG_MODE_LIST # use job count from environment if provided and do some sanity checking [[ -n $LIBSECCOMP_TSTCFG_JOBS ]] && jobs=$LIBSECCOMP_TSTCFG_JOBS if [[ $jobs -lt 1 ]]; then jobs=$(cat /proc/cpuinfo | grep "^processor" | wc -l) fi # determine the mode test automatically if [[ -z $mode_list ]]; then # always perform the native c tests mode_list="c" # query the build configuration if [[ -r "../configure.h" ]]; then # python tests [[ "$(grep "ENABLE_PYTHON" ../configure.h | \ awk '{ print $3 }')" = "1" ]] && \ mode_list="$mode_list python" fi fi # check if we specified a list of tests via the environment variable if [[ -n $LIBSECCOMP_TSTCFG_BATCHES ]]; then for i in $(echo "$LIBSECCOMP_TSTCFG_BATCHES" | sed 's/,/ /g'); do batch_list[batch_count]="$i" batch_count=$(($batch_count+1)) done fi # default to all tests if batch or single tests not requested if [[ -z $batch_list ]] && [[ -z $single_list ]]; then runall=1 fi # drop any requested batch and single tests if all tests were requested if [[ -n $runall ]]; then batch_list=() single_list=() fi # check for configuration via environment variables [[ -z $type && -n $LIBSECCOMP_TSTCFG_TYPE ]] && type=$LIBSECCOMP_TSTCFG_TYPE # open log file for append (default to stdout) if [[ -n $logfile ]]; then # force single threaded to preserve the output jobs=1 logfd=3 exec 3>>"$logfile" else logfd=1 fi # determine the current system's architecture arch=$($GLBL_SYS_ARCH) # display the test output and run the requested tests echo "=============== $(date) ===============" >&$logfd echo "Regression Test Report (\"regression $*\")" >&$logfd for mode in $mode_list; do run_tests done echo "Regression Test Summary" >&$logfd echo " tests run: $stats_all" >&$logfd echo " tests skipped: $stats_skipped" >&$logfd echo " tests passed: $stats_success" >&$logfd echo " tests failed: $stats_failure" >&$logfd echo " tests errored: $stats_error" >&$logfd echo "============================================================" >&$logfd # cleanup and exit rc=0 [[ $stats_failure -gt 0 ]] && rc=$(($rc + 2)) [[ $stats_error -gt 0 ]] && rc=$(($rc + 4)) exit $rc libseccomp-2.5.4/tests/13-basic-attrs.py0000755000000000000000000000451114467535325016533 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(): set_api(5) f = SyscallFilter(ALLOW) if f.get_attr(Attr.ACT_DEFAULT) != ALLOW: raise RuntimeError("Failed getting Attr.ACT_DEFAULT") try: f.set_attr(Attr.ACT_DEFAULT, ALLOW) except RuntimeError: pass f.set_attr(Attr.ACT_BADARCH, ALLOW) if f.get_attr(Attr.ACT_BADARCH) != ALLOW: raise RuntimeError("Failed getting Attr.ACT_BADARCH") f.set_attr(Attr.CTL_NNP, 0) if f.get_attr(Attr.CTL_NNP) != 0: raise RuntimeError("Failed getting Attr.CTL_NNP") if f.get_attr(Attr.CTL_TSYNC) != 0: raise RuntimeError("Failed getting Attr.CTL_TSYNC") f.set_attr(Attr.API_TSKIP, 0) if f.get_attr(Attr.API_TSKIP) != 0: raise RuntimeError("Failed getting Attr.API_TSKIP") f.set_attr(Attr.CTL_LOG, 1) if f.get_attr(Attr.CTL_LOG) != 1: raise RuntimeError("Failed getting Attr.CTL_LOG") f.set_attr(Attr.CTL_SSB, 1) if f.get_attr(Attr.CTL_SSB) != 1: raise RuntimeError("Failed getting Attr.CTL_SSB") f.set_attr(Attr.CTL_OPTIMIZE, 2) if f.get_attr(Attr.CTL_OPTIMIZE) != 2: raise RuntimeError("Failed getting Attr.CTL_OPTIMIZE") f.set_attr(Attr.API_SYSRAWRC, 1) if f.get_attr(Attr.API_SYSRAWRC) != 1: raise RuntimeError("Failed getting Attr.API_SYSRAWRC") f.set_attr(Attr.CTL_WAITKILL, 1) if f.get_attr(Attr.CTL_WAITKILL) != 1: raise RuntimeError("Failed getting Attr.CTL_WAITKILL") test() # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/20-live-basic_die.tests0000644000000000000000000000040414467535325017660 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2013 Red Hat # Author: Paul Moore # test type: live # Testname API Result 20-live-basic_die 1 KILL 20-live-basic_die 1 TRAP 20-live-basic_die 1 ERRNO libseccomp-2.5.4/tests/13-basic-attrs.c0000644000000000000000000000640214467535325016323 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; uint32_t val = (uint32_t)(-1); scmp_filter_ctx ctx = NULL; rc = seccomp_api_set(5); if (rc != 0) return EOPNOTSUPP; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return ENOMEM; rc = seccomp_attr_get(ctx, SCMP_FLTATR_ACT_DEFAULT, &val); if (rc != 0) goto out; if (val != SCMP_ACT_ALLOW) { rc = -1; goto out; } rc = seccomp_attr_set(ctx, SCMP_FLTATR_ACT_DEFAULT, val); if (rc != -EACCES) { rc = -1; goto out; } rc = seccomp_attr_set(ctx, SCMP_FLTATR_ACT_BADARCH, SCMP_ACT_ALLOW); if (rc != 0) goto out; rc = seccomp_attr_get(ctx, SCMP_FLTATR_ACT_BADARCH, &val); if (rc != 0) goto out; if (val != SCMP_ACT_ALLOW) { rc = -1; goto out; } rc = seccomp_attr_set(ctx, SCMP_FLTATR_CTL_NNP, 0); if (rc != 0) goto out; rc = seccomp_attr_get(ctx, SCMP_FLTATR_CTL_NNP, &val); if (rc != 0) goto out; if (val != 0) { rc = -1; goto out; } rc = seccomp_attr_set(ctx, SCMP_FLTATR_CTL_TSYNC, 1); if (rc != 0 && rc != -EOPNOTSUPP) goto out; rc = seccomp_attr_get(ctx, SCMP_FLTATR_CTL_TSYNC, &val); if (rc != 0) goto out; if (val != 1) { rc = -1; goto out; } rc = seccomp_attr_set(ctx, SCMP_FLTATR_API_TSKIP, 1); if (rc != 0) goto out; rc = seccomp_attr_get(ctx, SCMP_FLTATR_API_TSKIP, &val); if (rc != 0) goto out; if (val != 1) { rc = -1; goto out; } rc = seccomp_attr_set(ctx, SCMP_FLTATR_CTL_LOG, 1); if (rc != 0) goto out; rc = seccomp_attr_get(ctx, SCMP_FLTATR_CTL_LOG, &val); if (rc != 0) goto out; if (val != 1) { rc = -1; goto out; } rc = seccomp_attr_set(ctx, SCMP_FLTATR_CTL_SSB, 1); if (rc != 0) goto out; rc = seccomp_attr_get(ctx, SCMP_FLTATR_CTL_SSB, &val); if (rc != 0) goto out; if (val != 1) { rc = -1; goto out; } rc = seccomp_attr_set(ctx, SCMP_FLTATR_CTL_OPTIMIZE, 2); if (rc != 0) goto out; rc = seccomp_attr_get(ctx, SCMP_FLTATR_CTL_OPTIMIZE, &val); if (rc != 0) goto out; if (val != 2) { rc = -1; goto out; } rc = seccomp_attr_set(ctx, SCMP_FLTATR_API_SYSRAWRC, 1); if (rc != 0) goto out; rc = seccomp_attr_get(ctx, SCMP_FLTATR_API_SYSRAWRC, &val); if (rc != 0) goto out; if (val != 1) { rc = -1; goto out; } rc = seccomp_attr_set(ctx, SCMP_FLTATR_CTL_WAITKILL, 1); if (rc != 0) goto out; rc = seccomp_attr_get(ctx, SCMP_FLTATR_CTL_WAITKILL, &val); if (rc != 0) goto out; if (val != 1) { rc = -1; goto out; } rc = 0; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/60-sim-precompute.py0000755000000000000000000000222514467535325017272 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(ALLOW) f.precompute() f.add_rule_exactly(KILL, 1000) f.precompute() f.add_rule_exactly(KILL, 1001) f.precompute() return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/54-live-binary_tree.c0000644000000000000000000000543714467535325017363 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. * Author: Tom Hromatka */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include #include #include "util.h" static const int denylist[] = { SCMP_SYS(times), SCMP_SYS(ptrace), SCMP_SYS(getuid), SCMP_SYS(syslog), SCMP_SYS(getgid), SCMP_SYS(setuid), SCMP_SYS(setgid), SCMP_SYS(geteuid), SCMP_SYS(getegid), SCMP_SYS(setpgid), SCMP_SYS(getppid), SCMP_SYS(getpgrp), SCMP_SYS(setsid), SCMP_SYS(setreuid), SCMP_SYS(setregid), SCMP_SYS(getgroups), SCMP_SYS(setgroups), SCMP_SYS(setresuid), SCMP_SYS(getresuid), SCMP_SYS(setresgid), SCMP_SYS(getresgid), SCMP_SYS(getpgid), SCMP_SYS(setfsuid), SCMP_SYS(setfsgid), }; int main(int argc, char *argv[]) { int rc; int fd; int i; scmp_filter_ctx ctx = NULL; const char buf[] = "testing"; ssize_t buf_len = strlen(buf); rc = util_action_parse(argv[1]); if (rc != SCMP_ACT_ALLOW) { rc = 1; goto out; } rc = util_trap_install(); if (rc != 0) goto out; fd = open("/dev/null", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); if (fd < 0) { rc = errno; goto out; } ctx = seccomp_init(SCMP_ACT_TRAP); if (ctx == NULL) return ENOMEM; rc = seccomp_attr_set(ctx, SCMP_FLTATR_CTL_OPTIMIZE, 2); if (rc < 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, SCMP_A0(SCMP_CMP_EQ, fd)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigreturn), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0); if (rc != 0) goto out; for (i = 0; i < (sizeof(denylist) / sizeof(denylist[0])); i++) { rc = seccomp_rule_add(ctx, SCMP_ACT_KILL, denylist[i], 0); if (rc != 0) goto out; } rc = seccomp_load(ctx); if (rc != 0) goto out; if (write(fd, buf, buf_len) < buf_len) { rc = errno; goto out; } if (close(fd) < 0) { rc = errno; goto out; } rc = 160; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/17-sim-arch_merge.py0000755000000000000000000000301714467535325017205 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f32 = SyscallFilter(KILL) f64 = SyscallFilter(KILL) f32.remove_arch(Arch()) f64.remove_arch(Arch()) f32.add_arch(Arch("x86")) f64.add_arch(Arch("x86_64")) f32.add_rule(ALLOW, "read", Arg(0, EQ, sys.stdin.fileno())) f32.add_rule(ALLOW, "write", Arg(0, EQ, sys.stdout.fileno())) f32.add_rule(ALLOW, "write", Arg(0, EQ, sys.stderr.fileno())) f32.add_rule(ALLOW, "close") f64.add_rule(ALLOW, "socket") f64.add_rule(ALLOW, "connect") f64.add_rule(ALLOW, "shutdown") f64.merge(f32) return f64 args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/05-sim-long_jumps.py0000755000000000000000000000323014467535325017260 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2012 Red Hat # Copyright (c) 2021 Microsoft Corporation # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) f.add_rule(ALLOW, "brk") i = 0 while i < 100: f.add_rule(ALLOW, "chdir", Arg(0, EQ, i), Arg(1, NE, 0), Arg(2, LT, sys.maxsize)) i += 1 i = 0 ctr = 0 while i < 10000 and ctr < 100: sc = i i += 1 if sc == resolve_syscall(Arch(), "chdir"): continue try: resolve_syscall(Arch(), sc) except ValueError: continue f.add_rule(ALLOW, sc, Arg(0, NE, 0)) ctr += 1 f.add_rule(ALLOW, "close") return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/30-sim-socket_syscalls.c0000644000000000000000000000677714467535325020120 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2016 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; rc = seccomp_arch_remove(ctx, SCMP_ARCH_NATIVE); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X86); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X86_64); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X32); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_PPC64LE); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_MIPSEL); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_SH); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(bind), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(connect), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(listen), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(accept), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getsockname), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getpeername), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socketpair), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(send), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(recv), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(sendto), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(recvfrom), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(shutdown), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(setsockopt), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getsockopt), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(sendmsg), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(recvmsg), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(accept4), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(sendmmsg), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(recvmmsg), 0); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/36-sim-ipc_syscalls.py0000755000000000000000000000314114467535325017600 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2017 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) f.remove_arch(Arch()) f.add_arch(Arch("x86")) f.add_arch(Arch("x86_64")) f.add_arch(Arch("x32")) f.add_arch(Arch("ppc64le")) f.add_arch(Arch("mipsel")) f.add_arch(Arch("sh")) f.add_rule(ALLOW, "semop") f.add_rule(ALLOW, "semtimedop") f.add_rule(ALLOW, "semget") f.add_rule(ALLOW, "semctl") f.add_rule(ALLOW, "msgsnd") f.add_rule(ALLOW, "msgrcv") f.add_rule(ALLOW, "msgget") f.add_rule(ALLOW, "msgctl") f.add_rule(ALLOW, "shmat") f.add_rule(ALLOW, "shmdt") f.add_rule(ALLOW, "shmget") f.add_rule(ALLOW, "shmctl") return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/23-sim-arch_all_le_basic.py0000755000000000000000000000325014467535325020473 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) f.remove_arch(Arch()) f.add_arch(Arch("x86")) f.add_arch(Arch("x86_64")) f.add_arch(Arch("x32")) f.add_arch(Arch("arm")) f.add_arch(Arch("aarch64")) f.add_arch(Arch("loongarch64")) f.add_arch(Arch("mipsel")) f.add_arch(Arch("mipsel64")) f.add_arch(Arch("mipsel64n32")) f.add_arch(Arch("ppc64le")) f.add_arch(Arch("riscv64")) f.add_arch(Arch("sh")) f.add_rule(ALLOW, "read", Arg(0, EQ, sys.stdin.fileno())) f.add_rule(ALLOW, "write", Arg(0, EQ, sys.stdout.fileno())) f.add_rule(ALLOW, "write", Arg(0, EQ, sys.stderr.fileno())) f.add_rule(ALLOW, "close") f.add_rule(ALLOW, "rt_sigreturn") return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/39-basic-api_level.tests0000644000000000000000000000030414467535325020051 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2017 Red Hat # Author: Paul Moore # test type: basic # Test command 39-basic-api_level libseccomp-2.5.4/tests/17-sim-arch_merge.c0000644000000000000000000000514314467535325016776 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx_64 = NULL, ctx_32 = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out_all; ctx_32 = seccomp_init(SCMP_ACT_KILL); if (ctx_32 == NULL) { rc = -ENOMEM; goto out_all; } ctx_64 = seccomp_init(SCMP_ACT_KILL); if (ctx_64 == NULL) { rc = -ENOMEM; goto out_all; } rc = seccomp_arch_remove(ctx_32, SCMP_ARCH_NATIVE); if (rc != 0) goto out; rc = seccomp_arch_remove(ctx_64, SCMP_ARCH_NATIVE); if (rc != 0) goto out; rc = seccomp_arch_add(ctx_32, SCMP_ARCH_X86); if (rc != 0) goto out_all; rc = seccomp_arch_add(ctx_64, SCMP_ARCH_X86_64); if (rc != 0) goto out_all; rc = seccomp_rule_add(ctx_32, SCMP_ACT_ALLOW, SCMP_SYS(read), 1, SCMP_A0(SCMP_CMP_EQ, STDIN_FILENO)); if (rc != 0) goto out_all; rc = seccomp_rule_add(ctx_32, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, SCMP_A0(SCMP_CMP_EQ, STDOUT_FILENO)); if (rc != 0) goto out_all; rc = seccomp_rule_add(ctx_32, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, SCMP_A0(SCMP_CMP_EQ, STDERR_FILENO)); if (rc != 0) goto out_all; rc = seccomp_rule_add(ctx_32, SCMP_ACT_ALLOW, SCMP_SYS(close), 0); if (rc != 0) goto out_all; rc = seccomp_rule_add(ctx_64, SCMP_ACT_ALLOW, SCMP_SYS(socket), 0); if (rc != 0) goto out_all; rc = seccomp_rule_add(ctx_64, SCMP_ACT_ALLOW, SCMP_SYS(connect), 0); if (rc != 0) goto out_all; rc = seccomp_rule_add(ctx_64, SCMP_ACT_ALLOW, SCMP_SYS(shutdown), 0); if (rc != 0) goto out_all; rc = seccomp_merge(ctx_64, ctx_32); if (rc != 0) goto out_all; /* NOTE: ctx_32 is no longer valid at this point */ rc = util_filter_output(&opts, ctx_64); if (rc) goto out; out: seccomp_release(ctx_64); return (rc < 0 ? -rc : rc); out_all: seccomp_release(ctx_32); goto out; } libseccomp-2.5.4/tests/12-sim-basic_masked_ops.c0000644000000000000000000000433314467535325020163 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; /* the syscall and argument numbers are all fake to make the test * simpler */ rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1000, 3, SCMP_A0(SCMP_CMP_EQ, 0), SCMP_A1(SCMP_CMP_EQ, 1), SCMP_A2(SCMP_CMP_EQ, 2)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1000, 3, SCMP_A0(SCMP_CMP_EQ, 0), SCMP_A1(SCMP_CMP_MASKED_EQ, 0x00ff, 1), SCMP_A2(SCMP_CMP_EQ, 2)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1000, 3, SCMP_A0(SCMP_CMP_EQ, 0), SCMP_A1(SCMP_CMP_MASKED_EQ, 0xffff, 11), SCMP_A2(SCMP_CMP_EQ, 2)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1000, 3, SCMP_A0(SCMP_CMP_EQ, 0), SCMP_A1(SCMP_CMP_MASKED_EQ, 0xffff, 111), SCMP_A2(SCMP_CMP_EQ, 2)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1000, 3, SCMP_A0(SCMP_CMP_EQ, 0), SCMP_A1(SCMP_CMP_MASKED_EQ, 0xff00, 1000), SCMP_A2(SCMP_CMP_EQ, 2)); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/38-basic-pfc_coverage.sh0000755000000000000000000000136614467535325020017 0ustar rootroot#!/bin/bash # # libseccomp regression test automation data # # Copyright (c) 2017 Red Hat # Author: Paul Moore # #### # functions # # Dependency check # # Arguments: # 1 Dependency to check for # function check_deps() { [[ -z "$1" ]] && return which "$1" >& /dev/null return $? } # # Dependency verification # # Arguments: # 1 Dependency to check for # function verify_deps() { [[ -z "$1" ]] && return if ! check_deps "$1"; then echo "error: install \"$1\" and include it in your \$PATH" exit 1 fi } #### # functions verify_deps diff # compare output to the known good output, fail if different ./38-basic-pfc_coverage | \ diff -q ${srcdir:=.}/38-basic-pfc_coverage.pfc - > /dev/null libseccomp-2.5.4/tests/24-live-arg_allow.py0000755000000000000000000000326414467535325017231 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2013 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import os import sys import util from seccomp import * def test(): action = util.parse_action(sys.argv[1]) if not action == ALLOW: quit(1) util.install_trap() fd = os.open("/dev/null", os.O_WRONLY|os.O_CREAT) f = SyscallFilter(TRAP) # NOTE: additional syscalls required for python f.add_rule(ALLOW, "write", Arg(0, EQ, fd)) f.add_rule(ALLOW, "close") f.add_rule(ALLOW, "munmap") f.add_rule(ALLOW, "rt_sigaction") f.add_rule(ALLOW, "rt_sigreturn") f.add_rule(ALLOW, "sigaltstack") f.add_rule(ALLOW, "exit_group") f.add_rule(ALLOW, "brk") f.load() try: if not os.write(fd, b"testing") == len("testing"): raise IOError("failed to write the full test string") quit(160) except OSError as ex: quit(ex.errno) os.close(fd) test() # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/33-sim-socket_syscalls_be.py0000755000000000000000000000245214467535325020764 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2016 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) f.remove_arch(Arch()) f.add_arch(Arch("s390")) f.add_arch(Arch("s390x")) f.add_arch(Arch("ppc")) f.add_rule(ALLOW, "socket") f.add_rule(ALLOW, "connect") f.add_rule(ALLOW, "accept") f.add_rule(ALLOW, "accept4") f.add_rule(ALLOW, "shutdown") return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/55-basic-pfc_binary_tree.c0000644000000000000000000000655714467535325020342 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2018-2020 Oracle and/or its affiliates. * Author: Tom Hromatka */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include #include "util.h" #define ARG_COUNT_MAX 2 struct syscall_errno { int syscall; int error; int arg_cnt; /* To make the test more interesting, arguments are added to several * syscalls. To keep the test simple, the arguments always use * SCMP_CMP_EQ. */ int args[ARG_COUNT_MAX]; }; struct syscall_errno table[] = { { SCMP_SYS(read), 0, 2, { 100, 101 } }, { SCMP_SYS(write), 1, 1, { 102, 0 } }, { SCMP_SYS(open), 2, 0, { 0, 0 } }, { SCMP_SYS(close), 3, 0, { 0, 0 } }, { SCMP_SYS(stat), 4, 0, { 0, 0 } }, { SCMP_SYS(fstat), 5, 1, { 103, 0 } }, { SCMP_SYS(lstat), 6, 0, { 0, 0 } }, { SCMP_SYS(poll), 7, 0, { 0, 0 } }, { SCMP_SYS(lseek), 8, 1, { 104, 0 } }, { SCMP_SYS(mmap), 9, 0, { 0, 0 } }, { SCMP_SYS(mprotect), 10, 1, { 105, 0 } }, { SCMP_SYS(munmap), 11, 0, { 0, 0 } }, { SCMP_SYS(brk), 12, 0, { 0, 0 } }, { SCMP_SYS(rt_sigaction), 13, 0, { 0, 0 } }, { SCMP_SYS(rt_sigprocmask), 14, 0, { 0, 0 } }, { SCMP_SYS(rt_sigreturn), 15, 0, { 0, 0 } }, { SCMP_SYS(ioctl), 16, 0, { 0, 0 } }, { SCMP_SYS(pread64), 17, 1, { 106, 0 } }, { SCMP_SYS(pwrite64), 18, 2, { 107, 108 } }, }; const int table_size = sizeof(table) / sizeof(table[0]); int main(int argc, char *argv[]) { int rc, fd, i; scmp_filter_ctx ctx = NULL; /* stdout */ fd = 1; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) { rc = ENOMEM; goto out; } rc = seccomp_arch_remove(ctx, SCMP_ARCH_NATIVE); if (rc < 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X86_64); if (rc < 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_AARCH64); if (rc < 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_LOONGARCH64); if (rc < 0) goto out; rc = seccomp_attr_set(ctx, SCMP_FLTATR_CTL_OPTIMIZE, 2); if (rc < 0) goto out; for (i = 0; i < table_size; i++) { switch (table[i].arg_cnt) { case 2: rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(table[i].error), table[i].syscall, 2, SCMP_A0(SCMP_CMP_EQ, table[i].args[0]), SCMP_A1(SCMP_CMP_EQ, table[i].args[1])); break; case 1: rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(table[i].error), table[i].syscall, 1, SCMP_A0(SCMP_CMP_EQ, table[i].args[0])); break; case 0: default: rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(table[i].error), table[i].syscall, 0); break; } if (rc < 0) goto out; } rc = seccomp_export_pfc(ctx, fd); if (rc < 0) goto out; out: seccomp_release(ctx); close(fd); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/41-sim-syscall_priority_arch.c0000644000000000000000000000272714467535325021314 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2017 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; rc = seccomp_arch_remove(ctx, SCMP_ARCH_NATIVE); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X86); rc = seccomp_syscall_priority(ctx, SCMP_SYS(socket), 128); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket), 0); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/22-sim-basic_chains_array.c0000644000000000000000000000363514467535325020506 0ustar rootroot/** * Seccomp Library test program * * Author: Paul Moore , Vitaly Shukela */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; struct scmp_arg_cmp arg_cmp; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; arg_cmp = SCMP_A0(SCMP_CMP_EQ, STDIN_FILENO); rc = seccomp_rule_add_exact_array(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 1, &arg_cmp); if (rc != 0) goto out; arg_cmp = SCMP_A0(SCMP_CMP_EQ, STDOUT_FILENO); rc = seccomp_rule_add_exact_array(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, &arg_cmp); if (rc != 0) goto out; arg_cmp = SCMP_A0(SCMP_CMP_EQ, STDERR_FILENO); rc = seccomp_rule_add_exact_array(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, &arg_cmp); if (rc != 0) goto out; rc = seccomp_rule_add_exact_array(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0, NULL); if (rc != 0) goto out; rc = seccomp_rule_add_exact_array(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigreturn), 0, NULL); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/19-sim-missing_syscalls.py0000755000000000000000000000231014467535325020474 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2013 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) f.remove_arch(Arch()) f.add_arch(Arch("x86")) f.add_rule(ALLOW, "tuxcall") try: f.add_rule_exactly(ALLOW, "tuxcall") except RuntimeError: pass return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/32-live-tsync_allow.c0000644000000000000000000000363414467535325017407 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2013 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; scmp_filter_ctx ctx = NULL; rc = util_action_parse(argv[1]); if (rc != SCMP_ACT_ALLOW) { rc = 1; goto out; } rc = util_trap_install(); if (rc != 0) goto out; ctx = seccomp_init(SCMP_ACT_TRAP); if (ctx == NULL) return ENOMEM; rc = seccomp_attr_set(ctx, SCMP_FLTATR_CTL_TSYNC, 1); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(openat), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigreturn), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0); if (rc != 0) goto out; rc = seccomp_load(ctx); if (rc != 0) goto out; rc = util_file_write("/dev/null"); if (rc != 0) goto out; rc = 160; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/47-live-kill_process.py0000755000000000000000000000324214467535325017754 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. # Author: Tom Hromatka # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import os import sys import threading import time import util from seccomp import * def child_start(param): param = 1 try: fd = os.open("/dev/null", os.O_WRONLY) except IOError as ex: param = ex.errno quit(ex.errno) def test(): f = SyscallFilter(KILL_PROCESS) f.add_rule(ALLOW, "clone") f.add_rule(ALLOW, "exit") f.add_rule(ALLOW, "exit_group") f.add_rule(ALLOW, "futex") f.add_rule(ALLOW, "madvise") f.add_rule(ALLOW, "mmap") f.add_rule(ALLOW, "mprotect") f.add_rule(ALLOW, "munmap") f.add_rule(ALLOW, "nanosleep") f.add_rule(ALLOW, "set_robust_list") f.load() param = 0 threading.Thread(target = child_start, args = (param, )) thread.start() time.sleep(1) quit(-errno.EACCES) test() # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/09-sim-syscall_priority_pre.tests0000644000000000000000000000133614467535325022104 0ustar rootroot# # libseccomp regression test automation data # # Copyright IBM Corp. 2012 # Author: Corey Bryant # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 09-sim-syscall_priority_pre all,-x32 999 N N N N N N KILL 09-sim-syscall_priority_pre all,-x32 1000-1002 0 1 N N N N ALLOW 09-sim-syscall_priority_pre all,-x32 1000 0 2 N N N N KILL 09-sim-syscall_priority_pre all,-x32 1001-1002 0 2 N N N N ALLOW 09-sim-syscall_priority_pre all,-x32 1000-1001 1 1 N N N N KILL 09-sim-syscall_priority_pre all,-x32 1003 N N N N N N KILL test type: bpf-sim-fuzz # Testname StressCount 09-sim-syscall_priority_pre 5 test type: bpf-valgrind # Testname 09-sim-syscall_priority_pre libseccomp-2.5.4/tests/15-basic-resolver.tests0000644000000000000000000000030314467535325017743 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2012 Red Hat # Author: Paul Moore # test type: basic # Test command 15-basic-resolver libseccomp-2.5.4/tests/valgrind_test.supp0000644000000000000000000000121414467535325017274 0ustar rootroot# # Valgrind suppression file for the libseccomp automated tests # # information: # to create entries run with the "--gen-suppressions=all" option, e.g. # valgrind --gen-suppressions=all ... # to use the suppressions run with the "--suppressions" options, e.g. # valgrind --suppressions= ... # Gentoo x86-64 system with valgrind-3.9.0 and glibc-2.19 { gentoo-x86-64_valgrind-3.9.0_glibc-2.19_1 Memcheck:Cond fun:index fun:expand_dynamic_string_token fun:_dl_map_object fun:map_doit fun:_dl_catch_error fun:do_preload fun:dl_main fun:_dl_sysdep_start fun:_dl_start obj:/lib64/ld-2.19.so obj:* obj:* } libseccomp-2.5.4/tests/03-sim-basic_chains.py0000755000000000000000000000250014467535325017506 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) f.add_rule_exactly(ALLOW, "read", Arg(0, EQ, sys.stdin.fileno())) f.add_rule_exactly(ALLOW, "write", Arg(0, EQ, sys.stdout.fileno())) f.add_rule_exactly(ALLOW, "write", Arg(0, EQ, sys.stderr.fileno())) f.add_rule_exactly(ALLOW, "close") f.add_rule_exactly(ALLOW, "rt_sigreturn") return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/32-live-tsync_allow.tests0000644000000000000000000000032414467535325020320 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2013 Red Hat # Author: Paul Moore # test type: live # Testname API Result 32-live-tsync_allow 2 ALLOW libseccomp-2.5.4/tests/51-live-user_notification.py0000755000000000000000000000351014467535325021000 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2019 Cisco Systems, Inc. # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import os import signal import sys import util from seccomp import * def test(): magic = os.getuid() + 1 f = SyscallFilter(ALLOW) f.add_rule(NOTIFY, "getuid") f.load() pid = os.fork() if pid == 0: val = os.getuid() if val != magic: raise RuntimeError("Response return value failed") quit(1) quit(0) else: notify = f.receive_notify() if notify.syscall != resolve_syscall(Arch(), "getuid"): raise RuntimeError("Notification failed") f.respond_notify(NotificationResponse(notify, magic, 0, 0)) wpid, rc = os.waitpid(pid, 0) if os.WIFEXITED(rc) == 0: raise RuntimeError("Child process error") if os.WEXITSTATUS(rc) != 0: raise RuntimeError("Child process error") f.reset(ALLOW) f.add_rule(NOTIFY, "getppid") f.load() # no easy way to check the notification fd here quit(160) test() # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/04-sim-multilevel_chains.tests0000644000000000000000000000376614467535325021336 0ustar rootroot# # libseccomp regression test automation data # # Copyright IBM Corp. 2012 # Author: Corey Bryant # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 04-sim-multilevel_chains all openat 0 0x856B008 4 N N N ALLOW 04-sim-multilevel_chains all close 4 N N N N N ALLOW 04-sim-multilevel_chains x86 read 0 0x856B008 0x7FFFFFFE N N N ALLOW 04-sim-multilevel_chains x86_64 read 0 0x856B008 0x7FFFFFFFFFFFFFFE N N N ALLOW 04-sim-multilevel_chains x86 read 0 0x856B008 0x7FFFFFFF N N N KILL 04-sim-multilevel_chains x86_64 read 0 0x856B008 0x7FFFFFFFFFFFFFFF N N N KILL 04-sim-multilevel_chains x86 read 0 0 0x7FFFFFFE N N N KILL 04-sim-multilevel_chains x86_64 read 0 0 0x7FFFFFFFFFFFFFFE N N N KILL 04-sim-multilevel_chains all read 1-10 0x856B008 0x7FFFFFFE N N N KILL 04-sim-multilevel_chains x86 write 1-2 0x856B008 0x7FFFFFFE N N N ALLOW 04-sim-multilevel_chains x86_64 write 1-2 0x856B008 0x7FFFFFFFFFFFFFFE N N N ALLOW 04-sim-multilevel_chains x86 write 1-2 0 0x7FFFFFFE N N N KILL 04-sim-multilevel_chains x86_64 write 1-2 0 0x7FFFFFFFFFFFFFFE N N N KILL 04-sim-multilevel_chains x86 write 1-2 0x856B008 0x7FFFFFFF N N N KILL 04-sim-multilevel_chains x86_64 write 1-2 0x856B008 0x7FFFFFFFFFFFFFFF N N N KILL 04-sim-multilevel_chains all write 3-10 0x856B008 0x7FFFFFFE N N N KILL 04-sim-multilevel_chains all rt_sigreturn N N N N N N ALLOW 04-sim-multilevel_chains x86 0-2 N N N N N N KILL 04-sim-multilevel_chains x86 7-172 N N N N N N KILL 04-sim-multilevel_chains x86 174-294 N N N N N N KILL 04-sim-multilevel_chains x86 296-350 N N N N N N KILL 04-sim-multilevel_chains x86_64 4-14 N N N N N N KILL 04-sim-multilevel_chains x86_64 16-256 N N N N N N KILL 04-sim-multilevel_chains x86_64 258-350 N N N N N N KILL test type: bpf-sim-fuzz # Testname StressCount 04-sim-multilevel_chains 5 test type: bpf-valgrind # Testname 04-sim-multilevel_chains libseccomp-2.5.4/tests/21-live-basic_allow.c0000644000000000000000000000351214467535325017321 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2013 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; scmp_filter_ctx ctx = NULL; rc = util_action_parse(argv[1]); if (rc != SCMP_ACT_ALLOW) { rc = 1; goto out; } rc = util_trap_install(); if (rc != 0) goto out; ctx = seccomp_init(SCMP_ACT_TRAP); if (ctx == NULL) return ENOMEM; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(openat), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigreturn), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0); if (rc != 0) goto out; rc = seccomp_load(ctx); if (rc != 0) goto out; rc = util_file_write("/dev/null"); if (rc != 0) goto out; rc = 160; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/07-sim-db_bug_looping.c0000644000000000000000000000324714467535325017655 0ustar rootroot/** * Seccomp Library test program * * Copyright IBM Corp. 2012 * Author: Ashley Lai */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; /* The next three seccomp_rule_add_exact() calls for read must * go together in this order to catch an infinite loop. */ rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 1, SCMP_A0(SCMP_CMP_EQ, STDOUT_FILENO)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 1, SCMP_A1(SCMP_CMP_EQ, 0x0)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 1, SCMP_A0(SCMP_CMP_EQ, STDIN_FILENO)); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/24-live-arg_allow.c0000644000000000000000000000377414467535325017026 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2013 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; int fd; scmp_filter_ctx ctx = NULL; const char buf[] = "testing"; ssize_t buf_len = strlen(buf); rc = util_action_parse(argv[1]); if (rc != SCMP_ACT_ALLOW) { rc = 1; goto out; } rc = util_trap_install(); if (rc != 0) goto out; fd = open("/dev/null", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); if (fd < 0) { rc = errno; goto out; } ctx = seccomp_init(SCMP_ACT_TRAP); if (ctx == NULL) return ENOMEM; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, SCMP_A0(SCMP_CMP_EQ, fd)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigreturn), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0); if (rc != 0) goto out; rc = seccomp_load(ctx); if (rc != 0) goto out; if (write(fd, buf, buf_len) < buf_len) { rc = errno; goto out; } if (close(fd) < 0) { rc = errno; goto out; } rc = 160; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/02-sim-basic.tests0000644000000000000000000000143314467535325016673 0ustar rootroot# # libseccomp regression test automation data # # Copyright IBM Corp. 2012 # Author: Corey Bryant # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 02-sim-basic all read 0 0x856B008 40 N N N ALLOW 02-sim-basic all write 1 0x856B008 40 N N N ALLOW 02-sim-basic all close 4 N N N N N ALLOW 02-sim-basic all rt_sigreturn N N N N N N ALLOW 02-sim-basic all open 0x856B008 4 N N N N KILL 02-sim-basic x86 0-2 N N N N N N KILL 02-sim-basic x86 7-172 N N N N N N KILL 02-sim-basic x86 174-350 N N N N N N KILL 02-sim-basic x86_64 4-14 N N N N N N KILL 02-sim-basic x86_64 16-350 N N N N N N KILL test type: bpf-sim-fuzz # Testname StressCount 02-sim-basic 5 test type: bpf-valgrind # Testname 02-sim-basic libseccomp-2.5.4/tests/34-sim-basic_denylist.tests0000644000000000000000000000203214467535325020607 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2013 Red Hat # Author: Paul Moore # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 34-sim-basic_denylist all read 0 0x856B008 10 N N N KILL 34-sim-basic_denylist all read 1-10 0x856B008 10 N N N ALLOW 34-sim-basic_denylist all write 1-2 0x856B008 10 N N N KILL 34-sim-basic_denylist all write 3-10 0x856B008 10 N N N ALLOW 34-sim-basic_denylist all close N N N N N N KILL 34-sim-basic_denylist all rt_sigreturn N N N N N N KILL 34-sim-basic_denylist all open 0x856B008 4 N N N N ALLOW 34-sim-basic_denylist x86 0-2 N N N N N N ALLOW 34-sim-basic_denylist x86 7-172 N N N N N N ALLOW 34-sim-basic_denylist x86 174-350 N N N N N N ALLOW 34-sim-basic_denylist x86_64 4-14 N N N N N N ALLOW 34-sim-basic_denylist x86_64 16-350 N N N N N N ALLOW test type: bpf-sim-fuzz # Testname StressCount 34-sim-basic_denylist 5 test type: bpf-valgrind # Testname 34-sim-basic_denylist libseccomp-2.5.4/tests/27-sim-bpf_blk_state.py0000755000000000000000000000324614467535325017715 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2015 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(ALLOW) f.add_rule_exactly(KILL, 1000, Arg(0, EQ, 3)) f.add_rule_exactly(KILL, 1000, Arg(0, EQ, 4)) f.add_rule_exactly(KILL, 1000, Arg(0, EQ, 5)) f.add_rule_exactly(KILL, 1000, Arg(0, EQ, 6)) f.add_rule_exactly(KILL, 1000, Arg(0, EQ, 7)) f.add_rule_exactly(KILL, 1000, Arg(0, EQ, 8)) f.add_rule_exactly(KILL, 1000, Arg(0, EQ, 9)) f.add_rule_exactly(KILL, 1000, Arg(0, EQ, 11)) f.add_rule_exactly(KILL, 1000, Arg(0, EQ, 12)) f.add_rule_exactly(KILL, 1000, Arg(0, EQ, 13)) f.add_rule_exactly(KILL, 1000, Arg(0, EQ, 14)) f.add_rule_exactly(KILL, 1000, Arg(0, EQ, 15)) f.add_rule_exactly(KILL, 1000, Arg(0, GE, 16)) return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/29-sim-pseudo_syscall.py0000755000000000000000000000243714467535325020152 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2015 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(ALLOW) f.remove_arch(Arch()) f.add_arch(Arch("x86")) f.add_rule(KILL, "sysmips") try: f.add_rule_exactly(KILL, "sysmips") except RuntimeError: pass try: f.add_rule_exactly(KILL, -10001) except RuntimeError: pass return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/20-live-basic_die.py0000755000000000000000000000245614467535325017162 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2013 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(): action = util.parse_action(sys.argv[1]) if action == TRAP: util.install_trap() f = SyscallFilter(action) f.add_rule(ALLOW, "getpid") f.add_rule(ALLOW, "rt_sigreturn") f.add_rule(ALLOW, "sigreturn") f.add_rule(ALLOW, "exit_group") f.load() try: util.write_file("/dev/null") except OSError as ex: quit(ex.errno) quit(160) test() # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/53-sim-binary_tree.c0000644000000000000000000001016714467535325017207 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2018-2020 Oracle and/or its affiliates. * Author: Tom Hromatka */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include #include "util.h" #define ARG_COUNT_MAX 2 struct syscall_errno { int syscall; int error; int arg_cnt; /* To make the test more interesting, arguments are added to several * syscalls. To keep the test simple, the arguments always use * SCMP_CMP_EQ. */ int args[ARG_COUNT_MAX]; }; struct syscall_errno table[] = { { SCMP_SYS(read), 0, 0, { 0, 0 } }, { SCMP_SYS(write), 1, 0, { 0, 0 } }, { SCMP_SYS(open), 2, 0, { 0, 0 } }, { SCMP_SYS(close), 3, 2, { 100, 101 } }, { SCMP_SYS(stat), 4, 0, { 0, 0 } }, { SCMP_SYS(fstat), 5, 0, { 0, 0 } }, { SCMP_SYS(lstat), 6, 0, { 0, 0 } }, { SCMP_SYS(poll), 7, 1, { 102, 0 } }, { SCMP_SYS(lseek), 8, 2, { 103, 104 } }, { SCMP_SYS(mmap), 9, 0, { 0, 0 } }, { SCMP_SYS(mprotect), 10, 0, { 0, 0 } }, { SCMP_SYS(munmap), 11, 0, { 0, 0 } }, { SCMP_SYS(brk), 12, 0, { 0, 0 } }, { SCMP_SYS(rt_sigaction), 13, 0, { 0, 0 } }, { SCMP_SYS(rt_sigprocmask), 14, 0, { 0, 0 } }, { SCMP_SYS(rt_sigreturn), 15, 0, { 0, 0 } }, { SCMP_SYS(ioctl), 16, 0, { 0, 0 } }, { SCMP_SYS(pread64), 17, 1, { 105, 0 } }, { SCMP_SYS(pwrite64), 18, 0, { 0, 0 } }, { SCMP_SYS(readv), 19, 0, { 0, 0 } }, { SCMP_SYS(writev), 20, 0, { 0, 0 } }, { SCMP_SYS(access), 21, 0, { 0, 0 } }, { SCMP_SYS(pipe), 22, 0, { 0, 0 } }, { SCMP_SYS(select), 23, 2, { 106, 107 } }, { SCMP_SYS(sched_yield), 24, 0, { 0, 0 } }, { SCMP_SYS(mremap), 25, 2, { 108, 109 } }, { SCMP_SYS(msync), 26, 0, { 0, 0 } }, { SCMP_SYS(mincore), 27, 0, { 0, 0 } }, { SCMP_SYS(madvise), 28, 0, { 0, 0 } }, { SCMP_SYS(dup), 32, 1, { 112, 0 } }, { SCMP_SYS(dup2), 33, 0, { 0, 0 } }, { SCMP_SYS(pause), 34, 0, { 0, 0 } }, { SCMP_SYS(nanosleep), 35, 0, { 0, 0 } }, { SCMP_SYS(getitimer), 36, 0, { 0, 0 } }, { SCMP_SYS(alarm), 37, 0, { 0, 0 } }, }; const int table_size = sizeof(table) / sizeof(table[0]); int main(int argc, char *argv[]) { int rc, i; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) { rc = ENOMEM; goto out; } rc = seccomp_arch_remove(ctx, SCMP_ARCH_NATIVE); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_AARCH64); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_LOONGARCH64); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_PPC64LE); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X86_64); if (rc != 0) goto out; rc = seccomp_attr_set(ctx, SCMP_FLTATR_CTL_OPTIMIZE, 2); if (rc < 0) goto out; for (i = 0; i < table_size; i++) { switch (table[i].arg_cnt) { case 2: rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(table[i].error), table[i].syscall, 2, SCMP_A0(SCMP_CMP_EQ, table[i].args[0]), SCMP_A1(SCMP_CMP_EQ, table[i].args[1])); break; case 1: rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(table[i].error), table[i].syscall, 1, SCMP_A0(SCMP_CMP_EQ, table[i].args[0])); break; case 0: default: rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(table[i].error), table[i].syscall, 0); break; } if (rc < 0) goto out; } rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/36-sim-ipc_syscalls.c0000644000000000000000000000551214467535325017373 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2017 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; rc = seccomp_arch_remove(ctx, SCMP_ARCH_NATIVE); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X86); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X86_64); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X32); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_PPC64LE); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_MIPSEL); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_SH); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_LOONGARCH64); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(semop), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(semtimedop), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(semget), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(semctl), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(msgsnd), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(msgrcv), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(msgget), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(msgctl), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(shmat), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(shmdt), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(shmget), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(shmctl), 0); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/06-sim-actions.tests0000644000000000000000000000211214467535325017251 0ustar rootroot# # libseccomp regression test automation data # # Copyright IBM Corp. 2012 # Author: Corey Bryant # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 06-sim-actions all read 4 0x856B008 80 N N N ALLOW 06-sim-actions all write 1 0x856B008 N N N N ERRNO(1) 06-sim-actions all close 4 N N N N N TRAP 06-sim-actions all openat 0 0x856B008 4 N N N TRACE(1234) 06-sim-actions all fstatfs 4 0x856B008 N N N N KILL_PROCESS 06-sim-actions all rt_sigreturn N N N N N N LOG 06-sim-actions x86 0-2 N N N N N N KILL 06-sim-actions x86 7-99 N N N N N N KILL 06-sim-actions x86 101-172 N N N N N N KILL 06-sim-actions x86 174-294 N N N N N N KILL 06-sim-actions x86 296-350 N N N N N N KILL 06-sim-actions x86_64 6-14 N N N N N N KILL 06-sim-actions x86_64 16-137 N N N N N N KILL 06-sim-actions x86_64 139-256 N N N N N N KILL 06-sim-actions x86_64 258-350 N N N N N N KILL test type: bpf-sim-fuzz # Testname StressCount 06-sim-actions 5 test type: bpf-valgrind # Testname 06-sim-actions libseccomp-2.5.4/tests/31-basic-version_check.c0000644000000000000000000000206414467535325020010 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2016 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include int main(int argc, char *argv[]) { const struct scmp_version *ver; ver = seccomp_version(); if (ver == NULL) return -1; if (ver->major != SCMP_VER_MAJOR || ver->minor != SCMP_VER_MINOR || ver->micro != SCMP_VER_MICRO) return -2; return 0; } libseccomp-2.5.4/tests/56-basic-iterate_syscalls.tests0000644000000000000000000000032414467535325021464 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2020 Red Hat # Author: Giuseppe Scrivano # test type: basic # Test command 56-basic-iterate_syscalls libseccomp-2.5.4/tests/18-sim-basic_allowlist.c0000644000000000000000000000344214467535325020056 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2013 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 1, SCMP_A0(SCMP_CMP_EQ, STDIN_FILENO)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, SCMP_A0(SCMP_CMP_EQ, STDOUT_FILENO)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, SCMP_A0(SCMP_CMP_EQ, STDERR_FILENO)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigreturn), 0); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/15-basic-resolver.py0000755000000000000000000000302614467535325017241 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(): f = SyscallFilter(KILL) # this differs from the native test as we don't support the syscall # resolution functions by themselves f.add_rule(ALLOW, "open") f.add_rule(ALLOW, "read") try: f.add_rule(ALLOW, "INVALID") except RuntimeError: pass sys_num = resolve_syscall(Arch(), "open") sys_name = resolve_syscall(Arch(), sys_num) if (sys_name != b"open"): raise RuntimeError("Test failure") sys_num = resolve_syscall(Arch(), "read") sys_name = resolve_syscall(Arch(), sys_num) if (sys_name != b"read"): raise RuntimeError("Test failure") test() # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/02-sim-basic.py0000755000000000000000000000226714467535325016172 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) f.add_rule_exactly(ALLOW, "read") f.add_rule_exactly(ALLOW, "write") f.add_rule_exactly(ALLOW, "close") f.add_rule_exactly(ALLOW, "rt_sigreturn") return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/50-sim-hash_collision.py0000755000000000000000000000403614467535325020106 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. # Author: Tom Hromatka # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): set_api(1) f = SyscallFilter(ERRNO(100)) f.remove_arch(Arch()) f.add_arch(Arch("x86_64")) # libseccomp utilizes a hash table to manage BPF blocks. It currently # employs MurmurHash3 where the key is the hashed values of the BPF # instruction blocks, the accumulator start, and the accumulator end. # Changes to the hash algorithm will likely affect this test. # The following rules were derived from an issue reported by Tor: # https://github.com/seccomp/libseccomp/issues/148 # # In the steps below, syscall 1001 is configured similarly to how # Tor configured socket. The fairly complex rules below led to # a hash collision with rt_sigaction (syscall 1000) in this test. f.add_rule_exactly(ALLOW, 1001, Arg(0, EQ, 1), Arg(1, MASKED_EQ, 0xf, 2), Arg(2, EQ, 3)) f.add_rule_exactly(ALLOW, 1001, Arg(0, EQ, 1), Arg(1, MASKED_EQ, 0xf, 1)) f.add_rule_exactly(ALLOW, 1000, Arg(0, EQ, 2)) f.add_rule_exactly(ALLOW, 1000, Arg(0, EQ, 1)) return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/44-live-a2_order.c0000644000000000000000000001005414467535325016543 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. * Author: Tom Hromatka */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include #include #include #include "util.h" #define DEFAULT_ACTION_ERRNO 100 #define DEFAULT_ACTION SCMP_ACT_ERRNO(DEFAULT_ACTION_ERRNO) struct size_and_rc { int size; int expected_rc; }; static const struct size_and_rc test_cases[] = { {1, 1}, {10, 10}, {50, 50}, {100, -DEFAULT_ACTION_ERRNO}, {200, -5}, {256, -5}, {257, -6}, {400, -6}, {800, -7}, {1600, -8}, {3200, -9}, {4095, -9}, {4096, -9}, {4097, -10}, {8000, -10}, {8192, -10}, {16383, -11}, {16384, -11}, {16385, -12}, {35000, -12}, }; static int do_read(int sz, int expected_rc) { char *buf = NULL; int rc = -1000, zero_fd = -1; zero_fd = open("/dev/zero", O_RDONLY); if (zero_fd <= 0) goto error; buf = malloc(sz); if (buf == NULL) goto error; rc = read(zero_fd, buf, sz); if(rc < 0) { if (expected_rc == -errno) rc = 0; } else { if (rc == expected_rc) rc = 0; } error: if (zero_fd >= 0) close(zero_fd); if (buf) free(buf); return rc; } int main(int argc, char *argv[]) { int rc, i; scmp_filter_ctx ctx = NULL; ctx = seccomp_init(DEFAULT_ACTION); if (ctx == NULL) return ENOMEM; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 1, SCMP_A2(SCMP_CMP_LE, 64)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(5), SCMP_SYS(read), 1, SCMP_A2(SCMP_CMP_GT, 128)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(6), SCMP_SYS(read), 1, SCMP_A2(SCMP_CMP_GT, 256)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(7), SCMP_SYS(read), 1, SCMP_A2(SCMP_CMP_GT, 512)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(8), SCMP_SYS(read), 1, SCMP_A2(SCMP_CMP_GT, 1024)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(9), SCMP_SYS(read), 1, SCMP_A2(SCMP_CMP_GT, 2048)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(10), SCMP_SYS(read), 1, SCMP_A2(SCMP_CMP_GT, 4096)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(11), SCMP_SYS(read), 1, SCMP_A2(SCMP_CMP_GT, 8192)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(12), SCMP_SYS(read), 1, SCMP_A2(SCMP_CMP_GT, 16384)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigreturn), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(openat), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(stat), 0); if (rc != 0) goto out; rc = seccomp_load(ctx); if (rc != 0) goto out; for (i = 0; i < sizeof(test_cases) / sizeof(test_cases[0]); i++) { rc = do_read(test_cases[i].size, test_cases[i].expected_rc); if (rc < 0) goto out; } rc = 160; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/49-sim-64b_comparisons.c0000644000000000000000000000247014467535325017717 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2019 Cisco Systems, Inc. * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1000, 1, SCMP_A0(SCMP_CMP_LT, 0x123456789abcUL)); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/37-sim-ipc_syscalls_be.tests0000644000000000000000000000205114467535325020755 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2017 Red Hat # Author: Paul Moore # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 37-sim-ipc_syscalls_be +s390,+s390x,+ppc ipc 1 N N N N N ALLOW 37-sim-ipc_syscalls_be +s390,+s390x,+ppc ipc 2 N N N N N ALLOW 37-sim-ipc_syscalls_be +s390,+s390x,+ppc ipc 3 N N N N N ALLOW 37-sim-ipc_syscalls_be +s390,+s390x,+ppc ipc 4 N N N N N ALLOW 37-sim-ipc_syscalls_be +s390,+s390x,+ppc ipc 11 N N N N N ALLOW 37-sim-ipc_syscalls_be +s390,+s390x,+ppc ipc 12 N N N N N ALLOW 37-sim-ipc_syscalls_be +s390,+s390x,+ppc ipc 13 N N N N N ALLOW 37-sim-ipc_syscalls_be +s390,+s390x,+ppc ipc 14 N N N N N ALLOW 37-sim-ipc_syscalls_be +s390,+s390x,+ppc ipc 21 N N N N N ALLOW 37-sim-ipc_syscalls_be +s390,+s390x,+ppc ipc 22 N N N N N ALLOW 37-sim-ipc_syscalls_be +s390,+s390x,+ppc ipc 23 N N N N N ALLOW 37-sim-ipc_syscalls_be +s390,+s390x,+ppc ipc 24 N N N N N ALLOW test type: bpf-valgrind # Testname 37-sim-ipc_syscalls_be libseccomp-2.5.4/tests/09-sim-syscall_priority_pre.py0000755000000000000000000000253314467535325021375 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) # the syscall and argument numbers are all fake to make the test simpler f.syscall_priority(1000, 3) f.syscall_priority(1001, 2) f.syscall_priority(1002, 1) f.add_rule_exactly(ALLOW, 1000, Arg(0, EQ, 0), Arg(1, EQ, 1)) f.add_rule_exactly(ALLOW, 1001, Arg(0, EQ, 0)) f.add_rule_exactly(ALLOW, 1002) return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/27-sim-bpf_blk_state.tests0000644000000000000000000000112014467535325020411 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2015 Red Hat # Author: Paul Moore # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 27-sim-bpf_blk_state all,-x32 1000 0-2 N N N N N ALLOW 27-sim-bpf_blk_state all,-x32 1000 3-9 N N N N N KILL 27-sim-bpf_blk_state all,-x32 1000 10 N N N N N ALLOW 27-sim-bpf_blk_state all,-x32 1000 11-32 N N N N N KILL test type: bpf-sim-fuzz # Testname StressCount 27-sim-bpf_blk_state 5 test type: bpf-valgrind # Testname 27-sim-bpf_blk_state libseccomp-2.5.4/tests/33-sim-socket_syscalls_be.c0000644000000000000000000000363414467535325020556 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2016 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; rc = seccomp_arch_remove(ctx, SCMP_ARCH_NATIVE); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_S390); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_S390X); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_PPC); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(connect), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(accept), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(accept4), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(shutdown), 0); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/25-sim-multilevel_chains_adv.py0000755000000000000000000000243414467535325021453 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2013 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) f.add_rule_exactly(ALLOW, 10, Arg(0, EQ, 11), Arg(1, NE, 12)) f.add_rule_exactly(ALLOW, 20, Arg(0, EQ, 21), Arg(1, NE, 22), Arg(2, EQ, 23)) return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/48-sim-32b_args.c0000644000000000000000000000401014467535325016300 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2019 Cisco Systems, Inc. * Author: Paul Moore * Additions: Michael Weiser */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; struct args { uint32_t action; int syscall; struct scmp_arg_cmp cmp; } *a, f[] = { {SCMP_ACT_ALLOW, 2000, SCMP_A0(SCMP_CMP_EQ, -1)}, {SCMP_ACT_ALLOW, 2064, SCMP_A0_64(SCMP_CMP_EQ, -1)}, {SCMP_ACT_ALLOW, 2032, SCMP_A0_32(SCMP_CMP_EQ, -1)}, {0}, }; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1000, 1, SCMP_A0(SCMP_CMP_EQ, -1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1064, 1, SCMP_A0_64(SCMP_CMP_EQ, -1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1032, 1, SCMP_A0_32(SCMP_CMP_EQ, -1)); if (rc != 0) goto out; for (a = f; a->syscall != 0; a++) { rc = seccomp_rule_add_exact(ctx, a->action, a->syscall, 1, a->cmp); if (rc != 0) goto out; } rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/26-sim-arch_all_be_basic.c0000644000000000000000000000542314467535325020257 0ustar rootroot/** * Seccomp Library test program * * Author: Markos Chandras */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; rc = seccomp_arch_remove(ctx, SCMP_ARCH_NATIVE); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("m68k")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("mips")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("mips64")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("mips64n32")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("parisc")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("parisc64")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("ppc")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("ppc64")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("s390")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("s390x")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("sheb")); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 1, SCMP_A0(SCMP_CMP_EQ, STDIN_FILENO)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, SCMP_A0(SCMP_CMP_EQ, STDOUT_FILENO)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, SCMP_A0(SCMP_CMP_EQ, STDERR_FILENO)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigreturn), 0); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/53-sim-binary_tree.tests0000644000000000000000000001026214467535325020123 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2019-2020 Oracle and/or its affiliates. # Author: Tom Hromatka # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 read N N N N N N ERRNO(0) 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 write N N N N N N ERRNO(1) 53-sim-binary_tree +x86_64,+ppc64le open N N N N N N ERRNO(2) 53-sim-binary_tree +aarch64,+loongarch64 open N N N N N N ALLOW 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 close N N N N N N ALLOW 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 close 100 1234 N N N N ALLOW 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 close 100 101 N N N N ERRNO(3) 53-sim-binary_tree +x86_64,+ppc64le stat N N N N N N ERRNO(4) 53-sim-binary_tree +aarch64,+loongarch64 stat N N N N N N ALLOW 53-sim-binary_tree +x86_64,+ppc64le,+aarch64 fstat N N N N N N ERRNO(5) 53-sim-binary_tree +x86_64,+ppc64le lstat N N N N N N ERRNO(6) 53-sim-binary_tree +aarch64,+loongarch64 lstat N N N N N N ALLOW 53-sim-binary_tree +x86_64,+ppc64le poll 102 N N N N N ERRNO(7) 53-sim-binary_tree +aarch64,+loongarch64 poll 102 N N N N N ALLOW 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 lseek 103 104 N N N N ERRNO(8) 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 mmap N N N N N N ERRNO(9) 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 mprotect N N N N N N ERRNO(10) 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 munmap N N N N N N ERRNO(11) 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 brk N N N N N N ERRNO(12) 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 rt_sigaction N N N N N N ERRNO(13) 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 rt_sigprocmask N N N N N N ERRNO(14) 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 rt_sigreturn N N N N N N ERRNO(15) 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 ioctl N N N N N N ERRNO(16) 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 pread64 105 N N N N N ERRNO(17) 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 pwrite64 N N N N N N ERRNO(18) 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 readv N N N N N N ERRNO(19) 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 writev N N N N N N ERRNO(20) 53-sim-binary_tree +x86_64,+ppc64le access N N N N N N ERRNO(21) 53-sim-binary_tree +aarch64,+loongarch64 access N N N N N N ALLOW 53-sim-binary_tree +x86_64,+ppc64le pipe N N N N N N ERRNO(22) 53-sim-binary_tree +aarch64,+loongarch64 pipe N N N N N N ALLOW 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 select N N N N N N ALLOW 53-sim-binary_tree +x86_64,+ppc64le select 106 107 N N N N ERRNO(23) 53-sim-binary_tree +aarch64,+loongarch64 select 106 107 N N N N ALLOW 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 sched_yield N N N N N N ERRNO(24) 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 mremap N N N N N N ALLOW 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 mremap 108 109 N N N N ERRNO(25) 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 msync N N N N N N ERRNO(26) 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 mincore N N N N N N ERRNO(27) 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 madvise N N N N N N ERRNO(28) 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 dup 112 N N N N N ERRNO(32) 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 dup 5678 N N N N N ALLOW 53-sim-binary_tree +x86_64,+ppc64le dup2 N N N N N N ERRNO(33) 53-sim-binary_tree +aarch64,+loongarch64 dup2 N N N N N N ALLOW 53-sim-binary_tree +x86_64,+ppc64le pause N N N N N N ERRNO(34) 53-sim-binary_tree +aarch64,+loongarch64 pause N N N N N N ALLOW 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 nanosleep N N N N N N ERRNO(35) 53-sim-binary_tree +x86_64,+ppc64le,+aarch64,+loongarch64 getitimer N N N N N N ERRNO(36) 53-sim-binary_tree +x86_64,+ppc64le alarm N N N N N N ERRNO(37) 53-sim-binary_tree +aarch64,+loongarch64 alarm N N N N N N ALLOW test type: bpf-valgrind # Testname 53-sim-binary_tree libseccomp-2.5.4/tests/util.h0000644000000000000000000000222714467535325014651 0ustar rootroot/** * Seccomp Library utility code for tests * * Copyright IBM Corp. 2012 * Author: Corey Bryant */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _UTIL_TEST_H #define _UTIL_TEST_H struct util_options { int bpf_flg; }; int util_getopt(int argc, char *argv[], struct util_options *opts); int util_gcov_rules(const scmp_filter_ctx ctx, int action); int util_filter_output(const struct util_options *opts, const scmp_filter_ctx ctx); int util_trap_install(void); int util_action_parse(const char *action); int util_file_write(const char *path); #endif libseccomp-2.5.4/tests/20-live-basic_die.c0000644000000000000000000000277514467535325016755 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2013 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; int action; scmp_filter_ctx ctx = NULL; rc = util_action_parse(argv[1]); if (rc == -1) goto out; action = rc; if (action == SCMP_ACT_TRAP) { rc = util_trap_install(); if (rc != 0) goto out; } ctx = seccomp_init(action); if (ctx == NULL) return ENOMEM; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigreturn), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0); if (rc != 0) goto out; rc = seccomp_load(ctx); if (rc != 0) goto out; rc = util_file_write("/dev/null"); if (rc != 0) goto out; rc = 160; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/47-live-kill_process.c0000644000000000000000000000445414467535325017551 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. * Author: Tom Hromatka */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include #include #include "util.h" static const unsigned int allowlist[] = { SCMP_SYS(clone), SCMP_SYS(exit), SCMP_SYS(exit_group), SCMP_SYS(futex), SCMP_SYS(madvise), SCMP_SYS(mmap), SCMP_SYS(mprotect), SCMP_SYS(munmap), SCMP_SYS(nanosleep), SCMP_SYS(set_robust_list), }; /** * Child thread created via pthread_create() * * This thread will call a disallowed syscall. It should * cause the entire program to die (and not just this * thread.) */ void *child_start(void *param) { int fd; /* make a disallowed syscall */ fd = open("/dev/null", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); /* we should never get here. seccomp should kill the entire * process when open() is called. */ if (fd >= 0) close(fd); return NULL; } int main(int argc, char *argv[]) { int rc, i; scmp_filter_ctx ctx = NULL; pthread_t child_thread; ctx = seccomp_init(SCMP_ACT_KILL_PROCESS); if (ctx == NULL) return ENOMEM; for (i = 0; i < sizeof(allowlist) / sizeof(allowlist[0]); i++) { rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, allowlist[i], 0); if (rc != 0) goto out; } rc = seccomp_load(ctx); if (rc != 0) goto out; rc = pthread_create(&child_thread, NULL, child_start, NULL); if (rc != 0) goto out; /* sleep for a bit to ensure that the child thread has time to run */ sleep(1); /* we should never get here! */ rc = -EACCES; goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/43-sim-a2_order.py0000755000000000000000000000375314467535325016614 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. # Author: Tom Hromatka # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import errno import sys import util from seccomp import * def test(args): set_api(3) f = SyscallFilter(KILL) f.add_rule(ALLOW, "read", Arg(2, LE, 64)) f.add_rule(ERRNO(5), "read", Arg(2, GT, 128)) f.add_rule(ERRNO(6), "read", Arg(2, GT, 256)) f.add_rule(ERRNO(7), "read", Arg(2, GT, 512)) f.add_rule(ERRNO(8), "read", Arg(2, GT, 1024)) f.add_rule(ERRNO(9), "read", Arg(2, GT, 2048)) f.add_rule(ERRNO(10), "read", Arg(2, GT, 4096)) f.add_rule(ERRNO(11), "read", Arg(2, GT, 8192)) f.add_rule(ERRNO(12), "read", Arg(2, GT, 16384)) f.add_rule(ALLOW, "write", Arg(2, GE, 32768)) f.add_rule(ERRNO(5), "write", Arg(2, LT, 128)) f.add_rule(ERRNO(6), "write", Arg(2, LT, 256)) f.add_rule(ERRNO(7), "write", Arg(2, LT, 512)) f.add_rule(ERRNO(8), "write", Arg(2, LT, 1024)) f.add_rule(ERRNO(9), "write", Arg(2, LT, 2048)) f.add_rule(ERRNO(10), "write", Arg(2, LT, 4096)) f.add_rule(ERRNO(11), "write", Arg(2, LT, 8192)) f.add_rule(ERRNO(12), "write", Arg(2, LT, 16384)) return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/19-sim-missing_syscalls.c0000644000000000000000000000277514467535325020302 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2013 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; rc = seccomp_arch_remove(ctx, SCMP_ARCH_NATIVE); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X86); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(tuxcall), 0); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(tuxcall), 0); if (rc != -EDOM) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/42-sim-adv_chains.tests0000644000000000000000000000377614467535325017731 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2017 Red Hat # Author: Paul Moore # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 42-sim-adv_chains all,-x32 1000 N N N N N N KILL 42-sim-adv_chains all,-x32 1001 N N N N N N ALLOW 42-sim-adv_chains all,-x32 1002 1 N N N N N ALLOW 42-sim-adv_chains all,-x32 1003 N N N N N N ALLOW 42-sim-adv_chains all,-x32 1003 1 N N N N N TRAP 42-sim-adv_chains all,-x32 1003 2 N N N N N ALLOW 42-sim-adv_chains all,-x32 1004 N N N N N N TRAP 42-sim-adv_chains all,-x32 1004 1 N N N N N ALLOW 42-sim-adv_chains all,-x32 1004 2 N N N N N TRAP 42-sim-adv_chains all,-x32 1005 N N N N N N ALLOW 42-sim-adv_chains all,-x32 1005 1 N N N N N ALLOW 42-sim-adv_chains all,-x32 1005 2 N N N N N ALLOW 42-sim-adv_chains all,-x32 1006 1 N N N N N ALLOW 42-sim-adv_chains all,-x32 1007 1 N N N N N ALLOW 42-sim-adv_chains all,-x32 1008 2 3 N N N N ALLOW 42-sim-adv_chains all,-x32 1008 2 3 3 N N N ALLOW 42-sim-adv_chains all,-x32 1008 2 3 4 N N N ALLOW 42-sim-adv_chains all,-x32 1009 N N N N N N ALLOW 42-sim-adv_chains all,-x32 1009 2 N N N N N ALLOW 42-sim-adv_chains all,-x32 1009 1 3 N N N N ALLOW 42-sim-adv_chains all,-x32 1010 N N N N N N KILL 42-sim-adv_chains all,-x32 1010 1 N N N N N ALLOW 42-sim-adv_chains all,-x32 1010 2 2 N N N N ALLOW 42-sim-adv_chains all,-x32 1011 1 N N N N N ALLOW 42-sim-adv_chains all,-x32 1011 2 4 1 N N N ALLOW 42-sim-adv_chains all,-x32 1012 8 N N N N N ALLOW 42-sim-adv_chains all,-x32 1013 2 3 N N N N ALLOW 42-sim-adv_chains all,-x32 1013 0 4 N N N N ALLOW 42-sim-adv_chains all,-x32 1014 0 0 2 3 N N ALLOW 42-sim-adv_chains all,-x32 1014 2 3 1 2 N N ALLOW 42-sim-adv_chains all,-x32 1015 1 N N N N N KILL 42-sim-adv_chains all,-x32 1015 4 N N N N N ALLOW 42-sim-adv_chains all,-x32 1015 4 1 N N N N ALLOW 42-sim-adv_chains all,-x32 1015 4 2 N N N N ALLOW test type: bpf-sim-fuzz # Testname StressCount 42-sim-adv_chains 5 test type: bpf-valgrind # Testname 42-sim-adv_chains libseccomp-2.5.4/tests/07-sim-db_bug_looping.tests0000644000000000000000000000100414467535325020562 0ustar rootroot# # libseccomp regression test automation data # # Copyright IBM Corp. 2012 # Author: Corey Bryant # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 07-sim-db_bug_looping all read 1 0x856B008 10 N N N ALLOW 07-sim-db_bug_looping all read 2-10 0 10 N N N ALLOW 07-sim-db_bug_looping all read 0 0x856B008 10 N N N ALLOW test type: bpf-sim-fuzz # Testname StressCount 07-sim-db_bug_looping 5 test type: bpf-valgrind # Testname 07-sim-db_bug_looping libseccomp-2.5.4/tests/26-sim-arch_all_be_basic.tests0000644000000000000000000000142714467535325021177 0ustar rootroot# # libseccomp regression test automation data # # Author: Markos Chandras # # Similar to 23-sim-arch_all_basic but for big-endian architectures # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 26-sim-arch_all_be_basic +all_be read 0 0x856B008 10 N N N ALLOW 26-sim-arch_all_be_basic +all_be read 1-10 0x856B008 10 N N N KILL 26-sim-arch_all_be_basic +all_be write 1-2 0x856B008 10 N N N ALLOW 26-sim-arch_all_be_basic +all_be write 3-10 0x856B008 10 N N N KILL 26-sim-arch_all_be_basic +all_be close N N N N N N ALLOW 26-sim-arch_all_be_basic +all_be rt_sigreturn N N N N N N ALLOW 26-sim-arch_all_be_basic +all_be open 0x856B008 4 N N N N KILL test type: bpf-valgrind # Testname 26-sim-arch_all_be_basic libseccomp-2.5.4/tests/24-live-arg_allow.tests0000644000000000000000000000032214467535325017730 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2013 Red Hat # Author: Paul Moore # test type: live # Testname API Result 24-live-arg_allow 1 ALLOW libseccomp-2.5.4/tests/14-sim-reset.tests0000644000000000000000000000136514467535325016743 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2012 Red Hat # Author: Paul Moore # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 14-sim-reset all read 0 0x856B008 40 N N N KILL 14-sim-reset all write 1 0x856B008 40 N N N ALLOW 14-sim-reset all close 4 N N N N N KILL 14-sim-reset all rt_sigreturn N N N N N N KILL 14-sim-reset all open 0x856B008 4 N N N N KILL 14-sim-reset x86 0-3 N N N N N N KILL 14-sim-reset x86 5-360 N N N N N N KILL 14-sim-reset x86_64 0 N N N N N N KILL 14-sim-reset x86_64 2-360 N N N N N N KILL test type: bpf-sim-fuzz # Testname StressCount 14-sim-reset 5 test type: bpf-valgrind # Testname 14-sim-reset libseccomp-2.5.4/tests/13-basic-attrs.tests0000644000000000000000000000026214467535325017241 0ustar rootroot# # libseccomp regression test automation data # # Copyright IBM Corp. 2012 # Author: Corey Bryant # test type: basic # Test command 13-basic-attrs libseccomp-2.5.4/tests/48-sim-32b_args.py0000755000000000000000000000325514467535325016523 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2019 Cisco Systems, Inc. # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) # NOTE: this test is different from the native/c test as the bindings don't # allow negative numbers (which is a good thing here) f.add_rule_exactly(ALLOW, 1000, Arg(0, EQ, 0xffffffffffffffff)) f.add_rule_exactly(ALLOW, 1064, Arg(0, EQ, 0xffffffffffffffff)) f.add_rule_exactly(ALLOW, 1032, Arg(0, EQ, 0xffffffff)) # here we do not have static initializers to test but need to keep # behaviour in sync with the native test f.add_rule_exactly(ALLOW, 2000, Arg(0, EQ, 0xffffffffffffffff)) f.add_rule_exactly(ALLOW, 2064, Arg(0, EQ, 0xffffffffffffffff)) f.add_rule_exactly(ALLOW, 2032, Arg(0, EQ, 0xffffffff)) return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/33-sim-socket_syscalls_be.tests0000644000000000000000000000254114467535325021472 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2016 Red Hat # Author: Paul Moore # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 33-sim-socket_syscalls_be +s390,+s390x,+ppc socketcall 1 N N N N N ALLOW 33-sim-socket_syscalls_be +s390,+s390x,+ppc socketcall 3 N N N N N ALLOW 33-sim-socket_syscalls_be +s390,+s390x,+ppc socketcall 5 N N N N N ALLOW 33-sim-socket_syscalls_be +s390,+s390x,+ppc socketcall 13 N N N N N ALLOW 33-sim-socket_syscalls_be +s390,+s390x 359 0 1 2 N N N ALLOW 33-sim-socket_syscalls_be +ppc 326 0 1 2 N N N ALLOW 33-sim-socket_syscalls_be +s390,+s390x 362 0 1 2 N N N ALLOW 33-sim-socket_syscalls_be +ppc 328 0 1 2 N N N ALLOW 33-sim-socket_syscalls_be +s390,+s390x 364 0 1 2 N N N ALLOW 33-sim-socket_syscalls_be +ppc 344 0 1 2 N N N ALLOW 33-sim-socket_syscalls_be +s390,+s390x 373 0 1 2 N N N ALLOW 33-sim-socket_syscalls_be +ppc 338 0 1 2 N N N ALLOW 33-sim-socket_syscalls_be +s390,+s390x,+ppc accept 5 N N N N N ALLOW 33-sim-socket_syscalls_be +s390,+s390x,+ppc accept 0 1 2 N N N KILL 33-sim-socket_syscalls_be +s390,+s390x,+ppc accept4 18 1 2 N N N ALLOW 33-sim-socket_syscalls_be +s390,+s390x,+ppc accept4 0 1 2 N N N KILL test type: bpf-valgrind # Testname 33-sim-socket_syscalls_be libseccomp-2.5.4/tests/46-sim-kill_process.py0000755000000000000000000000246314467535325017610 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. # Author: Tom Hromatka # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): set_api(3) f = SyscallFilter(KILL_PROCESS) f.remove_arch(Arch()) f.add_arch(Arch("x86_64")) f.add_rule_exactly(ALLOW, "read") f.add_rule_exactly(ERRNO(5), "write") f.add_rule_exactly(KILL, "open") f.add_rule_exactly(ERRNO(6), "close", Arg(0, GT, 100)) return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/41-sim-syscall_priority_arch.tests0000644000000000000000000000101114467535325022215 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2017 Red Hat # Author: Paul Moore # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 41-sim-syscall_priority_arch +x86 102 1 N N N N N ALLOW 41-sim-syscall_priority_arch +x86 102 18 N N N N N KILL 41-sim-syscall_priority_arch +x86 359 N N N N N N ALLOW 41-sim-syscall_priority_arch +x86 364 N N N N N N KILL test type: bpf-valgrind # Testname 41-sim-syscall_priority_arch libseccomp-2.5.4/tests/25-sim-multilevel_chains_adv.c0000644000000000000000000000277014467535325021245 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2013 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 10, 2, SCMP_A0(SCMP_CMP_EQ, 11), SCMP_A1(SCMP_CMP_NE, 12)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 20, 3, SCMP_A0(SCMP_CMP_EQ, 21), SCMP_A1(SCMP_CMP_NE, 22), SCMP_A2(SCMP_CMP_EQ, 23)); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/04-sim-multilevel_chains.py0000755000000000000000000000312614467535325020615 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) f.add_rule(ALLOW, "openat") f.add_rule(ALLOW, "close") f.add_rule(ALLOW, "read", Arg(0, EQ, sys.stdin.fileno()), Arg(1, NE, 0), Arg(2, LT, sys.maxsize)) f.add_rule(ALLOW, "write", Arg(0, EQ, sys.stdout.fileno()), Arg(1, NE, 0), Arg(2, LT, sys.maxsize)) f.add_rule(ALLOW, "write", Arg(0, EQ, sys.stderr.fileno()), Arg(1, NE, 0), Arg(2, LT, sys.maxsize)) f.add_rule(ALLOW, "close") f.add_rule(ALLOW, "rt_sigreturn") return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/34-sim-basic_denylist.py0000755000000000000000000000247414467535325020112 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2013 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(ALLOW) f.add_rule_exactly(KILL, "read", Arg(0, EQ, sys.stdin.fileno())) f.add_rule_exactly(KILL, "write", Arg(0, EQ, sys.stdout.fileno())) f.add_rule_exactly(KILL, "write", Arg(0, EQ, sys.stderr.fileno())) f.add_rule_exactly(KILL, "close") f.add_rule_exactly(KILL, "rt_sigreturn") return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/44-live-a2_order.py0000755000000000000000000000632714467535325016764 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. # Author: Tom Hromatka # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import os import sys import util from seccomp import * DEFAULT_ACTION_ERRNO = 100 DEFAULT_ACTION = ERRNO(DEFAULT_ACTION_ERRNO) test_cases = [ {'sz': 1, 'exp_rc': 1}, {'sz': 10, 'exp_rc': 10}, {'sz': 50, 'exp_rc': 50}, {'sz': 100, 'exp_rc': -DEFAULT_ACTION_ERRNO}, {'sz': 200, 'exp_rc': -5}, {'sz': 256, 'exp_rc': -5}, {'sz': 257, 'exp_rc': -6}, {'sz': 400, 'exp_rc': -6}, {'sz': 800, 'exp_rc': -7}, {'sz': 1600, 'exp_rc': -8}, {'sz': 3200, 'exp_rc': -9}, {'sz': 4095, 'exp_rc': -9}, {'sz': 4096, 'exp_rc': -9}, {'sz': 4097, 'exp_rc': -10}, {'sz': 8000, 'exp_rc': -10}, {'sz': 8192, 'exp_rc': -10}, {'sz': 16383, 'exp_rc': -11}, {'sz': 16384, 'exp_rc': -11}, {'sz': 16385, 'exp_rc': -12}, {'sz': 35000, 'exp_rc': -12}, ] def do_read(): fd = os.open("/dev/zero", os.O_RDONLY) for x in test_cases: try: os.read(fd, x['sz']) if x['exp_rc'] < 0: os.close(fd) raise IOError("Erroneously read %d bytes. Expected rc = %d" % (x['sz'], x['exp_rc'])) except OSError as ex: if -ex.errno != x['exp_rc']: os.close(fd) raise IOError("Expected errno %d but os.read(%d bytes) caused errno %d" % (-x['exp_rc'], x['sz'], ex.errno)) os.close(fd) def test(): f = SyscallFilter(DEFAULT_ACTION) f.add_rule(ALLOW, "read", Arg(2, LE, 64)) f.add_rule(ERRNO(5), "read", Arg(2, GT, 128)) f.add_rule(ERRNO(6), "read", Arg(2, GT, 256)) f.add_rule(ERRNO(7), "read", Arg(2, GT, 512)) f.add_rule(ERRNO(8), "read", Arg(2, GT, 1024)) f.add_rule(ERRNO(9), "read", Arg(2, GT, 2048)) f.add_rule(ERRNO(10), "read", Arg(2, GT, 4096)) f.add_rule(ERRNO(11), "read", Arg(2, GT, 8192)) f.add_rule(ERRNO(12), "read", Arg(2, GT, 16384)) # NOTE: additional syscalls required for python f.add_rule(ALLOW, "close") f.add_rule(ALLOW, "rt_sigaction") f.add_rule(ALLOW, "rt_sigreturn") f.add_rule(ALLOW, "sigaltstack") f.add_rule(ALLOW, "exit_group") f.add_rule(ALLOW, "exit") f.add_rule(ALLOW, "brk") f.add_rule(ALLOW, "open") f.add_rule(ALLOW, "openat") f.add_rule(ALLOW, "stat") f.add_rule(ALLOW, "write") f.load() do_read() # all reads behaved as expected quit(160) test() # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/07-sim-db_bug_looping.py0000755000000000000000000000247414467535325020067 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) # the next three seccomp_rule_add_exact() calls for read must go together # in this order to catch an infinite loop. f.add_rule(ALLOW, "read", Arg(0, EQ, sys.stdout.fileno())) f.add_rule(ALLOW, "read", Arg(1, EQ, 0)) f.add_rule(ALLOW, "read", Arg(0, EQ, sys.stdin.fileno())) return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/52-basic-load.c0000644000000000000000000000304214467535325016105 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2019 Cisco Systems, Inc. * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; unsigned int api; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; api = seccomp_api_get(); if (api == 0) { rc = -EFAULT; goto out; } ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return ENOMEM; if (api >= 2) { rc = seccomp_attr_set(ctx, SCMP_FLTATR_CTL_TSYNC, 1); if (rc != 0) goto out; } if (api >= 3) { rc = seccomp_attr_set(ctx, SCMP_FLTATR_CTL_LOG, 1); if (rc != 0) goto out; } if (api >= 4) { rc = seccomp_attr_set(ctx, SCMP_FLTATR_CTL_SSB, 1); if (rc != 0) goto out; } rc = seccomp_load(ctx); out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/42-sim-adv_chains.py0000755000000000000000000000725014467535325017211 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2017 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) f.add_rule_exactly(ALLOW, 1001, Arg(0, EQ, 1), Arg(1, EQ, 2)) f.add_rule_exactly(ALLOW, 1001) f.add_rule_exactly(ALLOW, 1002, Arg(0, EQ, 1)) f.add_rule_exactly(ALLOW, 1002, Arg(0, EQ, 1)) f.add_rule_exactly(ALLOW, 1003, Arg(0, NE, 1)) f.add_rule_exactly(TRAP, 1003, Arg(0, EQ, 1)) f.add_rule_exactly(ALLOW, 1004, Arg(0, EQ, 1)) f.add_rule_exactly(TRAP, 1004, Arg(0, NE, 1)) f.add_rule_exactly(ALLOW, 1005, Arg(0, EQ, 1)) f.add_rule_exactly(ALLOW, 1005, Arg(0, NE, 1)) f.add_rule_exactly(ALLOW, 1006, Arg(0, EQ, 1), Arg(1, EQ, 2)) f.add_rule_exactly(ALLOW, 1006, Arg(0, EQ, 1)) f.add_rule_exactly(ALLOW, 1007, Arg(0, EQ, 1)) f.add_rule_exactly(ALLOW, 1007, Arg(0, EQ, 1), Arg(1, EQ, 2)) f.add_rule_exactly(ALLOW, 1008, Arg(0, NE, 1), Arg(1, NE, 2)) f.add_rule_exactly(ALLOW, 1008, Arg(0, NE, 1), Arg(1, NE, 2), Arg(2, NE, 3)) f.add_rule_exactly(ALLOW, 1009, Arg(0, EQ, 1), Arg(1, NE, 2)) f.add_rule_exactly(ALLOW, 1009, Arg(0, NE, 1)) f.add_rule_exactly(ALLOW, 1010, Arg(0, NE, 1), Arg(1, EQ, 2)) f.add_rule_exactly(ALLOW, 1010, Arg(0, EQ, 1)) f.add_rule_exactly(ALLOW, 1011, Arg(0, EQ, 1)) f.add_rule_exactly(ALLOW, 1011, Arg(0, NE, 1), Arg(2, EQ, 1)) f.add_rule_exactly(ALLOW, 1012, Arg(0, MASKED_EQ, 0x0000, 1)) f.add_rule_exactly(ALLOW, 1013, Arg(0, NE, 1), Arg(2, NE, 2)) f.add_rule_exactly(ALLOW, 1013, Arg(0, LT, 1), Arg(2, NE, 2)) f.add_rule_exactly(ALLOW, 1014, Arg(3, GE, 1), Arg(4, GE, 2)) f.add_rule_exactly(ALLOW, 1014, Arg(0, NE, 1), Arg(1, NE, 2)) f.add_rule_exactly(ALLOW, 1015, Arg(0, EQ, 4), Arg(1, EQ, 1)) f.add_rule_exactly(ALLOW, 1015, Arg(0, EQ, 4), Arg(1, NE, 1)) return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/59-basic-empty_binary_tree.py0000755000000000000000000000210314467535325021124 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2022 Oracle and/or its affiliates. # Author: Tom Hromatka # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(ALLOW) f.set_attr(Attr.CTL_OPTIMIZE, 2) return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/19-sim-missing_syscalls.tests0000644000000000000000000000052514467535325021211 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2013 Red Hat # Author: Paul Moore # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 19-sim-missing_syscalls +x86 0-350 N N N N N N KILL test type: bpf-valgrind # Testname 19-sim-missing_syscalls libseccomp-2.5.4/tests/40-sim-log.c0000644000000000000000000000257114467535325015461 0ustar rootroot/** * Seccomp Library test program * * Originally 01-sim-allow.c but updated to use SCMP_ACT_LOG. * * Copyright (c) 2012 Red Hat * Author: Paul Moore * * Copyright (c) 2017 Canonical Ltd. * Author: Tyler Hicks */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; rc = seccomp_api_set(3); if (rc != 0) return EOPNOTSUPP; ctx = seccomp_init(SCMP_ACT_LOG); if (ctx == NULL) return ENOMEM; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/10-sim-syscall_priority_post.c0000644000000000000000000000346614467535325021361 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; /* the syscall and argument numbers are all fake to make the test * simpler */ rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1000, 2, SCMP_A0(SCMP_CMP_EQ, 0), SCMP_A1(SCMP_CMP_EQ, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1001, 1, SCMP_A0(SCMP_CMP_EQ, 0)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1002, 0); if (rc != 0) goto out; rc = seccomp_syscall_priority(ctx, 1000, 3); if (rc != 0) goto out; rc = seccomp_syscall_priority(ctx, 1001, 2); if (rc != 0) goto out; rc = seccomp_syscall_priority(ctx, 1002, 1); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/12-sim-basic_masked_ops.tests0000644000000000000000000000416514467535325021106 0ustar rootroot# # libseccomp regression test automation data # # Copyright IBM Corp. 2012 # Author: Corey Bryant # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 12-sim-basic_masked_ops all,-x32 1000 0 1 2 N N N ALLOW 12-sim-basic_masked_ops all,-x32 1000 0 0x01 2 N N N ALLOW 12-sim-basic_masked_ops all,-x32 1000 0 0x02-0x0A 2 N N N KILL 12-sim-basic_masked_ops all,-x32 1000 0 0x101 2 N N N ALLOW 12-sim-basic_masked_ops all,-x32 1000 0 11 2 N N N ALLOW 12-sim-basic_masked_ops all,-x32 1000 0 0x0B 2 N N N ALLOW 12-sim-basic_masked_ops all,-x32 1000 0 0x0C-0x6E 2 N N N KILL 12-sim-basic_masked_ops all,-x32 1000 0 0x1000B 2 N N N ALLOW 12-sim-basic_masked_ops all,-x32 1000 0 111 2 N N N ALLOW 12-sim-basic_masked_ops all,-x32 1000 0 0x6F 2 N N N ALLOW 12-sim-basic_masked_ops all,-x32 1000 0 0x70-0x100 2 N N N KILL 12-sim-basic_masked_ops all,-x32 1000 0 0x102-0x200 2 N N N KILL 12-sim-basic_masked_ops all,-x32 1000 0 0x10002-0x1000A 2 N N N KILL 12-sim-basic_masked_ops all,-x32 1000 0 0x1000C-0x1006E 2 N N N KILL 12-sim-basic_masked_ops all,-x32 1000 0 0x1006F 2 N N N ALLOW 12-sim-basic_masked_ops all,-x32 1000 0 1000 2 N N N ALLOW 12-sim-basic_masked_ops all,-x32 1000 0 0x3E8 2 N N N ALLOW 12-sim-basic_masked_ops all,-x32 1000 0 0x2FF 2 N N N KILL 12-sim-basic_masked_ops all,-x32 1000 0 0x300-0x3FF 2 N N N ALLOW 12-sim-basic_masked_ops all,-x32 1000 0 0x400 2 N N N KILL 12-sim-basic_masked_ops all,-x32 1000 0 0x402-0x4FF 2 N N N KILL 12-sim-basic_masked_ops all,-x32 1000 0 0x10300-0x103FF 2 N N N ALLOW 12-sim-basic_masked_ops all,-x32 1000 0 0x00000000F00003E8 2 N N N ALLOW 12-sim-basic_masked_ops all,-x32 1000 0 0x00000000800003E8 2 N N N ALLOW 12-sim-basic_masked_ops all,-x32 1000 0 0x00000001800003E8 2 N N N ALLOW 12-sim-basic_masked_ops all,-x32 1000 0 0x00000001000003E8 2 N N N ALLOW 12-sim-basic_masked_ops all,-x32 1000 0 0x0000000F000003E8 2 N N N ALLOW 12-sim-basic_masked_ops all,-x32 1000 0 0xFFFFFFFFFFFF03E8 2 N N N ALLOW test type: bpf-sim-fuzz # Testname StressCount 12-sim-basic_masked_ops 5 test type: bpf-valgrind # Testname 12-sim-basic_masked_ops libseccomp-2.5.4/tests/util.py0000755000000000000000000000575014467535325015061 0ustar rootroot# # Seccomp Library utility code for tests # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # """ Python utility code for the libseccomp test suite """ import argparse import os import sys import signal from seccomp import * def trap_handler(signum, frame): """ SIGSYS signal handler, internal use only """ os._exit(161) def get_opt(): """ Parse the arguments passed to main Description: Parse the arguments passed to the test from the command line. Returns a parsed argparse object. """ parser = argparse.ArgumentParser() parser.add_argument("-b", "--bpf", action="store_true") parser.add_argument("-p", "--pfc", action="store_true") return parser.parse_args() def filter_output(args, ctx): """ Output the filter in either BPF or PFC Arguments: args - an argparse object from UtilGetOpt() ctx - a seccomp SyscallFilter object Description: Output the SyscallFilter to stdout in either BPF or PFC format depending on the test's command line arguments. """ if (args.bpf): ctx.export_bpf(sys.stdout) else: ctx.export_pfc(sys.stdout) def install_trap(): """ Install a TRAP action signal handler Description: Install the TRAP action signal handler. """ signal.signal(signal.SIGSYS, trap_handler) def parse_action(action): """ Parse a filter action string into an action value Arguments: action - the action string Description: Parse a seccomp action string into the associated integer value. """ if action == "KILL": return KILL elif action == "TRAP": return TRAP elif action == "ERRNO": return ERRNO(163) elif action == "TRACE": raise RuntimeError("the TRACE action is not currently supported") elif action == "ALLOW": return ALLOW raise RuntimeError("invalid action string") def write_file(path): """ Write a string to a file Arguments: path - the file path Description: Open the specified file, write a string to the file, and close the file. """ fd = os.open(str(path), os.O_WRONLY|os.O_CREAT) if not os.write(fd, b"testing") == len("testing"): raise IOError("failed to write the full test string in write_file()") os.close(fd) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/60-sim-precompute.c0000644000000000000000000000302114467535325017054 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2022 Microsoft Corporation * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return ENOMEM; rc = seccomp_precompute(ctx); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, 1000, 0); if (rc != 0) goto out; rc = seccomp_precompute(ctx); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, 1001, 0); if (rc != 0) goto out; rc = seccomp_precompute(ctx); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/25-sim-multilevel_chains_adv.tests0000644000000000000000000000220214467535325022153 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2013 Red Hat # Author: Paul Moore # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 25-sim-multilevel_chains_adv all,-x32 0-9 N N N N N N KILL 25-sim-multilevel_chains_adv all,-x32 10 0x0000000b 0x00000000 N N N N ALLOW 25-sim-multilevel_chains_adv x86_64 10 0x10000000b 0x00000000 N N N N KILL 25-sim-multilevel_chains_adv x86_64 10 0x0000000b 0x10000000c N N N N ALLOW 25-sim-multilevel_chains_adv all,-x32 11-19 N N N N N N KILL 25-sim-multilevel_chains_adv all,-x32 20 0x00000015 0x00000000 0x00000017 N N N ALLOW 25-sim-multilevel_chains_adv all,-x32 20 0x00000015 0x00000016 0x00000017 N N N KILL 25-sim-multilevel_chains_adv x86_64 20 0x100000015 0x00000000 0x00000017 N N N KILL 25-sim-multilevel_chains_adv x86_64 20 0x00000015 0x00000000 0x100000017 N N N KILL 25-sim-multilevel_chains_adv all,-x32 21-30 N N N N N N KILL test type: bpf-sim-fuzz # Testname StressCount 25-sim-multilevel_chains_adv 5 test type: bpf-valgrind # Testname 25-sim-multilevel_chains_adv libseccomp-2.5.4/tests/55-basic-pfc_binary_tree.tests0000644000000000000000000000035314467535325021246 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. # Author: Tom Hromatka # test type: basic # Test command 55-basic-pfc_binary_tree.sh libseccomp-2.5.4/tests/37-sim-ipc_syscalls_be.py0000755000000000000000000000300714467535325020250 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2017 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) f.remove_arch(Arch()) f.add_arch(Arch("s390")) f.add_arch(Arch("s390x")) f.add_arch(Arch("ppc")) f.add_rule(ALLOW, "semop") f.add_rule(ALLOW, "semtimedop") f.add_rule(ALLOW, "semget") f.add_rule(ALLOW, "semctl") f.add_rule(ALLOW, "msgsnd") f.add_rule(ALLOW, "msgrcv") f.add_rule(ALLOW, "msgget") f.add_rule(ALLOW, "msgctl") f.add_rule(ALLOW, "shmat") f.add_rule(ALLOW, "shmdt") f.add_rule(ALLOW, "shmget") f.add_rule(ALLOW, "shmctl") return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/testgen0000755000000000000000000001045714467535325015126 0ustar rootroot#!/bin/bash # # libseccomp test output generator # # Copyright (c) 2013 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # #### # functions # # Dependency verification # # Arguments: # 1 Dependency to check for # function verify_deps() { [[ -z "$1" ]] && return if ! which "$1" >& /dev/null; then echo "error: install \"$1\" and include it in your \$PATH" exit 1 fi } # # Print out script usage details # function usage() { cat << EOF usage: regression [-h] [-d] [-l LABEL] libseccomp test output generator script optional arguments: -h show this help message and exit -b generate BPF output -d generate disassembled BPF output -p generate PFC output -v perform valgrind checks -l [LABEL] specifies label for the test output EOF } # # Print the test result # # Arguments: # 1 string containing generated test number # 2 string containing the test result # function print_result() { printf "Test %s result: %s\n" "$1" "$2" } # # Run the tests # # Arguments: # 1 string containing output label # function run_tests() { local batch_name local label local rc if [[ -n $1 ]]; then label=".$1" else label="" fi for file in *-sim-*.tests; do # extract the batch name from the file name batch_name=$(basename $file .tests) if [[ -x "$batch_name" ]]; then if [[ $opt_pfc -eq 1 ]]; then ./$batch_name > ${batch_name}${label}.pfc rc=$? stats_all=$(($stats_all + 1)) if [[ $rc -eq 0 ]]; then print_result "$batch_name [pfc]" "SUCCESS" else stats_failure=$(($stats_failure + 1)) print_result "$batch_name [pfc]" "FAILURE" fi fi if [[ $opt_bpf -eq 1 ]]; then ./$batch_name -b > ${batch_name}${label}.bpf rc=$? stats_all=$(($stats_all + 1)) if [[ $rc -eq 0 ]]; then print_result "$batch_name [bpf]" "SUCCESS" else stats_failure=$(($stats_failure + 1)) print_result "$batch_name [bpf]" "FAILURE" fi fi if [[ $opt_disasm -eq 1 ]]; then ./$batch_name -b | \ ../tools/scmp_bpf_disasm > ${batch_name}${label}.bpfd rc=$? stats_all=$(($stats_all + 1)) if [[ $rc -eq 0 ]]; then print_result "$batch_name [bpfd]" "SUCCESS" else stats_failure=$(($stats_failure + 1)) print_result "$batch_name [bpfd]" "FAILURE" fi fi if [[ $opt_valgrind -eq 1 ]]; then valgrind --tool=memcheck \ --quiet --error-exitcode=1 \ --leak-check=full \ --read-var-info=yes \ --track-origins=yes \ --suppressions=valgrind_test.supp \ -- ./$batch_name -b > /dev/null rc=$? stats_all=$(($stats_all + 1)) if [[ $rc -eq 0 ]]; then print_result "$batch_name [valgrind]" "SUCCESS" else stats_failure=$(($stats_failure + 1)) print_result "$batch_name [valgrind]" "FAILURE" fi fi else stats_failure=$(($stats_failure + 1)) print_result "$batch_name" "FAILURE" fi done return } #### # main opt_label= opt_bpf=0 opt_disasm=0 opt_pfc=0 opt_valgrind=0 while getopts "bphdl:v" opt; do case $opt in b) opt_bpf=1 ;; d) opt_disasm=1 ;; l) opt_label="$OPTARG" ;; p) opt_pfc=1 ;; v) opt_valgrind=1 ;; h|*) usage exit 1 ;; esac done # verify valgrind [[ $opt_valgrind -eq 1 ]] && verify_deps valgrind stats_all=0 stats_failure=0 # display the test output and run the requested tests echo "=============== $(date) ===============" echo "Collecting Test Output (\"testgen $*\")" run_tests "$opt_label" echo "Test Summary" echo " tests run: $stats_all" echo " tests failed: $stats_failure" echo "============================================================" # cleanup and exit rc=0 [[ $stats_failure -gt 0 ]] && rc=$(($rc + 2)) exit $rc libseccomp-2.5.4/tests/01-sim-allow.py0000755000000000000000000000202614467535325016217 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(ALLOW) return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/01-sim-allow.c0000644000000000000000000000224514467535325016011 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return ENOMEM; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/40-sim-log.py0000755000000000000000000000225714467535325015673 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Originally 01-sim-allow.py but updated to use LOG. # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # Copyright (c) 2017 Canonical Ltd. # Author: Tyler Hicks # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): set_api(3) f = SyscallFilter(LOG) return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/29-sim-pseudo_syscall.tests0000644000000000000000000000070114467535325020651 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2015 Red Hat # Author: Paul Moore # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 29-sim-pseudo_syscall +x86 0-10 N N N N N N ALLOW 29-sim-pseudo_syscall +x86 4294957190 N N N N N N ALLOW 29-sim-pseudo_syscall +x86 4294957295 N N N N N N ALLOW test type: bpf-valgrind # Testname 29-sim-pseudo_syscall libseccomp-2.5.4/tests/28-sim-arch_x86.tests0000644000000000000000000000114214467535325017241 0ustar rootroot# # libseccomp regression test automation data # # This test triggered a bug in libseccomp erroneously allowing the close() # syscall on x32 instead of 'KILL'ing it, as it should do for unsupported # architectures. # # Author: Mathias Krause # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 28-sim-arch_x86 +x86,+x86_64 read N N N N N N ALLOW 28-sim-arch_x86 +x86,+x86_64 close N N N N N N ERRNO(1) 28-sim-arch_x86 +arm,+x32 read N N N N N N KILL 28-sim-arch_x86 +arm,+x32 close N N N N N N KILL test type: bpf-valgrind # Testname 28-sim-arch_x86 libseccomp-2.5.4/tests/39-basic-api_level.py0000755000000000000000000000435714467535325017356 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2016 Red Hat # Copyright (c) 2017 Canonical Ltd. # Authors: Paul Moore # Tyler Hicks # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(): api = get_api() if (api < 1): raise RuntimeError("Failed getting initial API level") set_api(1) api = get_api() if api != 1: raise RuntimeError("Failed getting API level 1") set_api(2) api = get_api() if api != 2: raise RuntimeError("Failed getting API level 2") set_api(3) api = get_api() if api != 3: raise RuntimeError("Failed getting API level 3") set_api(4) api = get_api() if api != 4: raise RuntimeError("Failed getting API level 4") set_api(5) api = get_api() if api != 5: raise RuntimeError("Failed getting API level 5") set_api(6) api = get_api() if api != 6: raise RuntimeError("Failed getting API level 6") set_api(7) api = get_api() if api != 7: raise RuntimeError("Failed getting API level 7") # Attempt to set a high, invalid API level try: set_api(1024) except ValueError: pass else: raise RuntimeError("Missing failure when setting invalid API level") # Ensure that the previously set API level didn't change api = get_api() if api != 7: raise RuntimeError("Failed getting old API level after setting an invalid API level") test() # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/38-basic-pfc_coverage.tests0000644000000000000000000000031214467535325020532 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2017 Red Hat # Author: Paul Moore # test type: basic # Test command 38-basic-pfc_coverage.sh libseccomp-2.5.4/tests/08-sim-subtree_checks.c0000644000000000000000000001143214467535325017671 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; /* the syscall and argument numbers are all fake to make the test * simpler */ rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1000, 2, SCMP_A0(SCMP_CMP_EQ, 0), SCMP_A1(SCMP_CMP_EQ, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1000, 1, SCMP_A1(SCMP_CMP_EQ, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1001, 1, SCMP_A1(SCMP_CMP_EQ, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1001, 2, SCMP_A0(SCMP_CMP_EQ, 0), SCMP_A1(SCMP_CMP_EQ, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1002, 4, SCMP_A0(SCMP_CMP_EQ, 0), SCMP_A1(SCMP_CMP_EQ, 1), SCMP_A2(SCMP_CMP_EQ, 2), SCMP_A3(SCMP_CMP_EQ, 3)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1002, 2, SCMP_A1(SCMP_CMP_EQ, 1), SCMP_A2(SCMP_CMP_EQ, 2)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1003, 2, SCMP_A1(SCMP_CMP_EQ, 1), SCMP_A2(SCMP_CMP_EQ, 2)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1003, 4, SCMP_A0(SCMP_CMP_EQ, 0), SCMP_A1(SCMP_CMP_EQ, 1), SCMP_A2(SCMP_CMP_EQ, 2), SCMP_A3(SCMP_CMP_EQ, 3)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1004, 4, SCMP_A0(SCMP_CMP_EQ, 0), SCMP_A1(SCMP_CMP_EQ, 1), SCMP_A2(SCMP_CMP_EQ, 2), SCMP_A3(SCMP_CMP_EQ, 3)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1004, 2, SCMP_A0(SCMP_CMP_EQ, 0), SCMP_A1(SCMP_CMP_EQ, 11)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1004, 4, SCMP_A0(SCMP_CMP_EQ, 0), SCMP_A1(SCMP_CMP_EQ, 1), SCMP_A2(SCMP_CMP_EQ, 2), SCMP_A3(SCMP_CMP_EQ, 33)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1004, 2, SCMP_A1(SCMP_CMP_EQ, 1), SCMP_A2(SCMP_CMP_EQ, 2)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1005, 2, SCMP_A1(SCMP_CMP_EQ, 1), SCMP_A2(SCMP_CMP_EQ, 2)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1005, 4, SCMP_A0(SCMP_CMP_EQ, 0), SCMP_A1(SCMP_CMP_EQ, 1), SCMP_A2(SCMP_CMP_EQ, 2), SCMP_A3(SCMP_CMP_EQ, 3)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1005, 2, SCMP_A0(SCMP_CMP_EQ, 0), SCMP_A1(SCMP_CMP_EQ, 11)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1005, 4, SCMP_A0(SCMP_CMP_EQ, 0), SCMP_A1(SCMP_CMP_EQ, 1), SCMP_A2(SCMP_CMP_EQ, 2), SCMP_A3(SCMP_CMP_EQ, 33)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1006, 2, SCMP_A1(SCMP_CMP_NE, 1), SCMP_A2(SCMP_CMP_EQ, 0)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1006, 2, SCMP_A1(SCMP_CMP_EQ, 1), SCMP_A2(SCMP_CMP_EQ, 2)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1006, 1, SCMP_A1(SCMP_CMP_NE, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_TRAP, 1007, 2, SCMP_A2(SCMP_CMP_EQ, 2), SCMP_A3(SCMP_CMP_EQ, 3)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1007, 2, SCMP_A2(SCMP_CMP_EQ, 2), SCMP_A3(SCMP_CMP_NE, 3)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1007, 1, SCMP_A3(SCMP_CMP_NE, 3)); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/45-sim-chain_code_coverage.tests0000644000000000000000000000115614467535325021552 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. # Author: Tom Hromatka # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 45-sim-chain_code_coverage all,-x32 1008 1 1 1 1 1 1 ALLOW 45-sim-chain_code_coverage all,-x32 1008 1 2 1 1 1 1 ALLOW 45-sim-chain_code_coverage all,-x32 1008 4 1 1 1 1 1 ALLOW 45-sim-chain_code_coverage all,-x32 1008 1 1 0x14 1 1 1 ALLOW 45-sim-chain_code_coverage all,-x32 1008 4 1 0x15 1 1 1 ALLOW 45-sim-chain_code_coverage all,-x32 1008 4 1 0x106 1 1 1 ALLOW libseccomp-2.5.4/tests/35-sim-negative_one.tests0000644000000000000000000000065414467535325020267 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2017 Red Hat # Author: Paul Moore # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 35-sim-negative_one +x86 -1 N N N N N N ALLOW 35-sim-negative_one +x86_64 -1 N N N N N N ALLOW 35-sim-negative_one +x32 -1 N N N N N N ALLOW test type: bpf-valgrind # Testname 35-sim-negative_one libseccomp-2.5.4/tests/38-basic-pfc_coverage.c0000644000000000000000000000655714467535325017633 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2017 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; int fd; scmp_filter_ctx ctx = NULL; /* stdout */ fd = 1; rc = seccomp_api_set(3); if (rc != 0) return EOPNOTSUPP; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) { rc = ENOMEM; goto out; } rc = seccomp_arch_remove(ctx, SCMP_ARCH_NATIVE); if (rc < 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X86_64); if (rc < 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X86); if (rc < 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X32); if (rc < 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_ARM); if (rc < 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_AARCH64); if (rc < 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_LOONGARCH64); if (rc < 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_MIPSEL); if (rc < 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_MIPSEL64); if (rc < 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_MIPSEL64N32); if (rc < 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_PPC64LE); if (rc < 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_SH); if (rc < 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_RISCV64); if (rc < 0) goto out; /* NOTE: the syscalls and their arguments have been picked to achieve * the highest possible code coverage, this is not a useful * real world filter configuration */ rc = seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(open), 0); if (rc < 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(read), 4, SCMP_A0(SCMP_CMP_EQ, 0), SCMP_A1(SCMP_CMP_GE, 1), SCMP_A2(SCMP_CMP_GT, 2), SCMP_A3(SCMP_CMP_MASKED_EQ, 0x0f, 3)); if (rc < 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_TRAP, SCMP_SYS(write), 3, SCMP_A0(SCMP_CMP_NE, 0), SCMP_A1(SCMP_CMP_LE, 1), SCMP_A2(SCMP_CMP_LT, 2)); if (rc < 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(1), SCMP_SYS(close), 0); if (rc < 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_TRACE(1), SCMP_SYS(exit), 0); if (rc < 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_KILL_PROCESS, SCMP_SYS(fstat), 0); if (rc < 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_LOG, SCMP_SYS(exit_group), 0); if (rc < 0) goto out; /* verify the prioritized, but no-rule, syscall */ rc = seccomp_syscall_priority(ctx, SCMP_SYS(poll), 255); if (rc < 0) goto out; rc = seccomp_export_pfc(ctx, fd); if (rc < 0) goto out; out: seccomp_release(ctx); close(fd); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/miniseq.c0000644000000000000000000000257614467535325015343 0ustar rootroot/** * Seccomp Library test support program * * Copyright (c) 2015 Mathias Krause */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include static int get_number(char *str, uint64_t *res) { char *end = str; errno = 0; *res = strtoull(str, &end, 0); if (errno || *end != '\0') { fprintf(stderr, "error: failed to convert '%s'\n", str); return -1; } return 0; } int main(int argc, char *argv[]) { uint64_t first, last, cur; if (argc != 3) { fprintf(stderr, "usage: %s FIRST LAST\n", argv[0]); return 1; } if (get_number(argv[1], &first) || get_number(argv[2], &last)) return 1; for (cur = first; cur != last; cur++) printf("%" PRId64 "\n", cur); printf("%" PRId64 "\n", cur); return 0; } libseccomp-2.5.4/tests/.gitignore0000644000000000000000000000246514467535325015517 0ustar rootroot*.bpf *.bpfd *.pfc *.log *.stats __pycache__/ miniseq util.pyc 00-test.c 00-test 01-sim-allow 02-sim-basic 03-sim-basic_chains 04-sim-multilevel_chains 05-sim-long_jumps 06-sim-actions 07-sim-db_bug_looping 08-sim-subtree_checks 09-sim-syscall_priority_pre 10-sim-syscall_priority_post 11-basic-basic_errors 12-sim-basic_masked_ops 13-basic-attrs 14-sim-reset 15-basic-resolver 16-sim-arch_basic 17-sim-arch_merge 18-sim-basic_allowlist 19-sim-missing_syscalls 20-live-basic_die 21-live-basic_allow 22-sim-basic_chains_array 23-sim-arch_all_le_basic 24-live-arg_allow 25-sim-multilevel_chains_adv 26-sim-arch_all_be_basic 27-sim-bpf_blk_state 28-sim-arch_x86 29-sim-pseudo_syscall 30-sim-socket_syscalls 31-basic-version_check 32-live-tsync_allow 33-sim-socket_syscalls_be 34-sim-basic_denylist 35-sim-negative_one 36-sim-ipc_syscalls 37-sim-ipc_syscalls_be 38-basic-pfc_coverage 39-basic-api_level 40-sim-log 41-sim-syscall_priority_arch 42-sim-adv_chains 43-sim-a2_order 44-live-a2_order 45-sim-chain_code_coverage 46-sim-kill_process 47-live-kill_process 48-sim-32b_args 49-sim-64b_comparisons 50-sim-hash_collision 51-live-user_notification 52-basic-load 53-sim-binary_tree 54-live-binary_tree 55-basic-pfc_binary_tree 56-basic-iterate_syscalls 57-basic-rawsysrc 58-live-tsync_notify 59-basic-empty_binary_tree 60-sim-precompute libseccomp-2.5.4/tests/29-sim-pseudo_syscall.c0000644000000000000000000000345514467535325017742 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2015 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return ENOMEM; /* NOTE: we have to be careful here because some ABIs use syscall * offsets which could interfere with our test, x86 is safe */ rc = seccomp_arch_remove(ctx, SCMP_ARCH_NATIVE); if (rc < 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X86); if (rc < 0) goto out; /* SCMP_SYS(sysmips) == 4294957190 (unsigned) */ rc = seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(sysmips), 0); if (rc < 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, SCMP_SYS(sysmips), 0); if (rc == 0) goto out; /* -10001 == 4294957295 (unsigned) */ rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, -11001, 0); if (rc == 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/31-basic-version_check.py0000755000000000000000000000201614467535325020216 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2016 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * # NOTE: this is a NULL test since we don't support the seccomp_version() API # via the libseccomp python bindings # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/52-basic-load.py0000755000000000000000000000174014467535325016321 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2019 Cisco Systems, Inc. # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(): f = SyscallFilter(ALLOW) f.load() test() # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/30-sim-socket_syscalls.py0000755000000000000000000000363514467535325020317 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2016 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) f.remove_arch(Arch()) f.add_arch(Arch("x86")) f.add_arch(Arch("x86_64")) f.add_arch(Arch("x32")) f.add_arch(Arch("ppc64le")) f.add_arch(Arch("mipsel")) f.add_arch(Arch("sh")) f.add_rule(ALLOW, "socket") f.add_rule(ALLOW, "bind") f.add_rule(ALLOW, "connect") f.add_rule(ALLOW, "listen") f.add_rule(ALLOW, "accept") f.add_rule(ALLOW, "accept4") f.add_rule(ALLOW, "getsockname") f.add_rule(ALLOW, "getpeername") f.add_rule(ALLOW, "socketpair") f.add_rule(ALLOW, "send") f.add_rule(ALLOW, "recv") f.add_rule(ALLOW, "sendto") f.add_rule(ALLOW, "recvfrom") f.add_rule(ALLOW, "shutdown") f.add_rule(ALLOW, "setsockopt") f.add_rule(ALLOW, "getsockopt") f.add_rule(ALLOW, "sendmsg") f.add_rule(ALLOW, "recvmsg") f.add_rule(ALLOW, "accept4") f.add_rule(ALLOW, "sendmmsg") f.add_rule(ALLOW, "recvmmsg") return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/37-sim-ipc_syscalls_be.c0000644000000000000000000000504414467535325020042 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2017 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; rc = seccomp_arch_remove(ctx, SCMP_ARCH_NATIVE); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_S390); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_S390X); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_PPC); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(semop), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(semtimedop), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(semget), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(semctl), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(msgsnd), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(msgrcv), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(msgget), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(msgctl), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(shmat), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(shmdt), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(shmget), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(shmctl), 0); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/51-live-user_notification.c0000644000000000000000000000511714467535325020574 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2019 Cisco Systems, Inc. * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc, fd = -1, status; struct seccomp_notif *req = NULL; struct seccomp_notif_resp *resp = NULL; scmp_filter_ctx ctx = NULL; pid_t pid = 0, magic; magic = getpid(); ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return ENOMEM; rc = seccomp_rule_add(ctx, SCMP_ACT_NOTIFY, SCMP_SYS(getpid), 0, NULL); if (rc) goto out; rc = seccomp_load(ctx); if (rc < 0) goto out; rc = seccomp_notify_fd(ctx); if (rc < 0) goto out; fd = rc; pid = fork(); if (pid == 0) exit(syscall(__NR_getpid) != magic); rc = seccomp_notify_alloc(&req, &resp); if (rc) goto out; rc = seccomp_notify_receive(fd, req); if (rc) goto out; if (req->data.nr != __NR_getpid) { rc = -EFAULT; goto out; } rc = seccomp_notify_id_valid(fd, req->id); if (rc) goto out; resp->id = req->id; resp->val = magic; resp->error = 0; resp->flags = 0; rc = seccomp_notify_respond(fd, resp); if (rc) goto out; if (waitpid(pid, &status, 0) != pid) { rc = -EFAULT; goto out; } if (!WIFEXITED(status)) { rc = -EFAULT; goto out; } if (WEXITSTATUS(status)) { rc = -EFAULT; goto out; } rc = seccomp_reset(ctx, SCMP_ACT_ALLOW); if (rc < 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_NOTIFY, SCMP_SYS(getppid), 0, NULL); if (rc) goto out; rc = seccomp_load(ctx); if (rc < 0) goto out; rc = seccomp_notify_fd(ctx); if (rc < 0) goto out; if (rc != fd) { rc = -EFAULT; goto out; } else rc = 0; out: if (fd >= 0) close(fd); if (pid) kill(pid, SIGKILL); seccomp_notify_free(req, resp); seccomp_release(ctx); if (rc != 0) return (rc < 0 ? -rc : rc); return 160; } libseccomp-2.5.4/tests/05-sim-long_jumps.tests0000644000000000000000000000176014467535325017775 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2012 IBM Corp. # Copyright (c) 2021 Microsoft Corporation # Author: Corey Bryant # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 05-sim-long_jumps all,-x32 brk 1 2 3 4 5 6 ALLOW 05-sim-long_jumps all,-x32 9999 N N N N N N KILL 05-sim-long_jumps x86 chdir 0-5 0x856B008 0x7FFFFFFE N N N ALLOW 05-sim-long_jumps x86_64 chdir 0-5 0x856B008 0x7FFFFFFFFFFFFFFE N N N ALLOW 05-sim-long_jumps x86 chdir 95-99 0x856B008 0x7FFFFFFE N N N ALLOW 05-sim-long_jumps x86_64 chdir 95-99 0x856B008 0x7FFFFFFFFFFFFFFE N N N ALLOW 05-sim-long_jumps x86 chdir 100 0x856B008 0x7FFFFFFE N N N KILL 05-sim-long_jumps x86_64 chdir 100 0x856B008 0x7FFFFFFFFFFFFFFE N N N KILL 05-sim-long_jumps all,-x32 close 1 N N N N N ALLOW test type: bpf-sim-fuzz # Testname StressCount 05-sim-long_jumps 5 test type: bpf-valgrind # Testname 05-sim-long_jumps libseccomp-2.5.4/tests/18-sim-basic_allowlist.tests0000644000000000000000000000204414467535325020773 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2013 Red Hat # Author: Paul Moore # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 18-sim-basic_allowlist all read 0 0x856B008 10 N N N ALLOW 18-sim-basic_allowlist all read 1-10 0x856B008 10 N N N KILL 18-sim-basic_allowlist all write 1-2 0x856B008 10 N N N ALLOW 18-sim-basic_allowlist all write 3-10 0x856B008 10 N N N KILL 18-sim-basic_allowlist all close N N N N N N ALLOW 18-sim-basic_allowlist all rt_sigreturn N N N N N N ALLOW 18-sim-basic_allowlist all open 0x856B008 4 N N N N KILL 18-sim-basic_allowlist x86 0-2 N N N N N N KILL 18-sim-basic_allowlist x86 7-172 N N N N N N KILL 18-sim-basic_allowlist x86 174-350 N N N N N N KILL 18-sim-basic_allowlist x86_64 4-14 N N N N N N KILL 18-sim-basic_allowlist x86_64 16-350 N N N N N N KILL test type: bpf-sim-fuzz # Testname StressCount 18-sim-basic_allowlist 5 test type: bpf-valgrind # Testname 18-sim-basic_allowlist libseccomp-2.5.4/tests/16-sim-arch_basic.c0000644000000000000000000001062214467535325016755 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; /* NOTE: not strictly necessary since we get the native arch by default * but it serves as a good sanity check for the code and boosts * our code coverage numbers */ rc = seccomp_arch_exist(ctx, seccomp_arch_native()); if (rc != 0) goto out; rc = seccomp_arch_remove(ctx, SCMP_ARCH_NATIVE); if (rc != 0) goto out; /* NOTE: we are using a different approach to test for the native arch * to exercise slightly different code paths */ rc = seccomp_arch_exist(ctx, 0); if (rc != -EEXIST) goto out; /* NOTE: more sanity/coverage tests (see above) */ rc = seccomp_arch_add(ctx, SCMP_ARCH_NATIVE); if (rc != 0) goto out; rc = seccomp_arch_remove(ctx, SCMP_ARCH_NATIVE); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X86); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X86_64); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X32); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_ARM); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_AARCH64); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_LOONGARCH64); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_MIPSEL); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_MIPSEL64); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_MIPSEL64N32); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_PPC64LE); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_RISCV64); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_SH); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 1, SCMP_A0(SCMP_CMP_EQ, STDIN_FILENO)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, SCMP_A0(SCMP_CMP_EQ, STDOUT_FILENO)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, SCMP_A0(SCMP_CMP_EQ, STDERR_FILENO)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(connect), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(shutdown), 0); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; /* not strictly necessary, but let's exercise the code paths */ rc = seccomp_arch_remove(ctx, SCMP_ARCH_X86); if (rc != 0) goto out; rc = seccomp_arch_remove(ctx, SCMP_ARCH_X86_64); if (rc != 0) goto out; rc = seccomp_arch_remove(ctx, SCMP_ARCH_X32); if (rc != 0) goto out; rc = seccomp_arch_remove(ctx, SCMP_ARCH_ARM); if (rc != 0) goto out; rc = seccomp_arch_remove(ctx, SCMP_ARCH_AARCH64); if (rc != 0) goto out; rc = seccomp_arch_remove(ctx, SCMP_ARCH_LOONGARCH64); if (rc != 0) goto out; rc = seccomp_arch_remove(ctx, SCMP_ARCH_MIPSEL); if (rc != 0) goto out; rc = seccomp_arch_remove(ctx, SCMP_ARCH_MIPSEL64); if (rc != 0) goto out; rc = seccomp_arch_remove(ctx, SCMP_ARCH_MIPSEL64N32); if (rc != 0) goto out; rc = seccomp_arch_remove(ctx, SCMP_ARCH_PPC64LE); if (rc != 0) goto out; rc = seccomp_arch_remove(ctx, SCMP_ARCH_RISCV64); if (rc != 0) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/42-sim-adv_chains.c0000644000000000000000000001206614467535325017001 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2017 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1001, 2, SCMP_A0(SCMP_CMP_EQ, 1), SCMP_A1(SCMP_CMP_EQ, 2)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1001, 0); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1002, 1, SCMP_A0(SCMP_CMP_EQ, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_TRAP, 1002, 1, SCMP_A0(SCMP_CMP_EQ, 1)); if (rc != -EEXIST) { rc = EEXIST; goto out; } rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1003, 1, SCMP_A0(SCMP_CMP_NE, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_TRAP, 1003, 1, SCMP_A0(SCMP_CMP_EQ, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1004, 1, SCMP_A0(SCMP_CMP_EQ, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_TRAP, 1004, 1, SCMP_A0(SCMP_CMP_NE, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1005, 1, SCMP_A0(SCMP_CMP_EQ, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1005, 1, SCMP_A0(SCMP_CMP_NE, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1006, 2, SCMP_A0(SCMP_CMP_EQ, 1), SCMP_A1(SCMP_CMP_EQ, 2)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1006, 1, SCMP_A0(SCMP_CMP_EQ, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1007, 1, SCMP_A0(SCMP_CMP_EQ, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1007, 2, SCMP_A0(SCMP_CMP_EQ, 1), SCMP_A1(SCMP_CMP_EQ, 2)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1008, 2, SCMP_A0(SCMP_CMP_NE, 1), SCMP_A1(SCMP_CMP_NE, 2)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1008, 3, SCMP_A0(SCMP_CMP_NE, 1), SCMP_A1(SCMP_CMP_NE, 2), SCMP_A2(SCMP_CMP_NE, 3)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1009, 2, SCMP_A0(SCMP_CMP_EQ, 1), SCMP_A1(SCMP_CMP_NE, 2)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1009, 1, SCMP_A0(SCMP_CMP_NE, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1010, 2, SCMP_A0(SCMP_CMP_NE, 1), SCMP_A1(SCMP_CMP_EQ, 2)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1010, 1, SCMP_A0(SCMP_CMP_EQ, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1011, 1, SCMP_A0(SCMP_CMP_EQ, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1011, 2, SCMP_A0(SCMP_CMP_NE, 1), SCMP_A2(SCMP_CMP_EQ, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1012, 1, SCMP_A0(SCMP_CMP_MASKED_EQ, 0x0000, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1013, 2, SCMP_A0(SCMP_CMP_NE, 1), SCMP_A1(SCMP_CMP_NE, 2)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1013, 2, SCMP_A0(SCMP_CMP_LT, 1), SCMP_A1(SCMP_CMP_NE, 2)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1014, 2, SCMP_A3(SCMP_CMP_GE, 1), SCMP_A4(SCMP_CMP_GE, 2)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1014, 2, SCMP_A0(SCMP_CMP_NE, 1), SCMP_A1(SCMP_CMP_NE, 2)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1015, 2, SCMP_A0(SCMP_CMP_EQ, 4), SCMP_A1(SCMP_CMP_EQ, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1015, 2, SCMP_A0(SCMP_CMP_EQ, 4), SCMP_A1(SCMP_CMP_NE, 1)); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/03-sim-basic_chains.c0000644000000000000000000000344214467535325017303 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 1, SCMP_A0(SCMP_CMP_EQ, STDIN_FILENO)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, SCMP_A0(SCMP_CMP_EQ, STDOUT_FILENO)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, SCMP_A0(SCMP_CMP_EQ, STDERR_FILENO)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigreturn), 0); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/Makefile.am0000644000000000000000000001430014467535325015552 0ustar rootroot#### # Seccomp Library Tests # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License # as published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # if CODE_COVERAGE_ENABLED DBG_STATIC = else DBG_STATIC = -static endif AM_LDFLAGS = ${DBG_STATIC} -lpthread LDADD = util.la ../src/libseccomp.la ${CODE_COVERAGE_LIBS} check_LTLIBRARIES = util.la util_la_SOURCES = util.c util.h util_la_LDFLAGS = -module miniseq_LDADD = TESTS = regression check_PROGRAMS = \ miniseq \ 01-sim-allow \ 02-sim-basic \ 03-sim-basic_chains \ 04-sim-multilevel_chains \ 05-sim-long_jumps \ 06-sim-actions \ 07-sim-db_bug_looping \ 08-sim-subtree_checks \ 09-sim-syscall_priority_pre \ 10-sim-syscall_priority_post \ 11-basic-basic_errors \ 12-sim-basic_masked_ops \ 13-basic-attrs \ 14-sim-reset \ 15-basic-resolver \ 16-sim-arch_basic \ 17-sim-arch_merge \ 18-sim-basic_allowlist \ 19-sim-missing_syscalls \ 20-live-basic_die \ 21-live-basic_allow \ 22-sim-basic_chains_array \ 23-sim-arch_all_le_basic \ 24-live-arg_allow \ 25-sim-multilevel_chains_adv \ 26-sim-arch_all_be_basic \ 27-sim-bpf_blk_state \ 28-sim-arch_x86 \ 29-sim-pseudo_syscall \ 30-sim-socket_syscalls \ 31-basic-version_check \ 32-live-tsync_allow \ 33-sim-socket_syscalls_be \ 34-sim-basic_denylist \ 35-sim-negative_one \ 36-sim-ipc_syscalls \ 37-sim-ipc_syscalls_be \ 38-basic-pfc_coverage \ 39-basic-api_level \ 40-sim-log \ 41-sim-syscall_priority_arch \ 42-sim-adv_chains \ 43-sim-a2_order \ 44-live-a2_order \ 45-sim-chain_code_coverage \ 46-sim-kill_process \ 47-live-kill_process \ 48-sim-32b_args \ 49-sim-64b_comparisons \ 50-sim-hash_collision \ 51-live-user_notification \ 52-basic-load \ 53-sim-binary_tree \ 54-live-binary_tree \ 55-basic-pfc_binary_tree \ 56-basic-iterate_syscalls \ 57-basic-rawsysrc \ 58-live-tsync_notify \ 59-basic-empty_binary_tree \ 60-sim-precompute EXTRA_DIST_TESTPYTHON = \ util.py \ 01-sim-allow.py \ 02-sim-basic.py \ 03-sim-basic_chains.py \ 04-sim-multilevel_chains.py \ 05-sim-long_jumps.py \ 06-sim-actions.py \ 07-sim-db_bug_looping.py \ 08-sim-subtree_checks.py \ 09-sim-syscall_priority_pre.py \ 10-sim-syscall_priority_post.py \ 11-basic-basic_errors.py \ 12-sim-basic_masked_ops.py \ 13-basic-attrs.py \ 14-sim-reset.py \ 15-basic-resolver.py \ 16-sim-arch_basic.py \ 17-sim-arch_merge.py \ 18-sim-basic_allowlist.py \ 19-sim-missing_syscalls.py \ 20-live-basic_die.py \ 21-live-basic_allow.py \ 22-sim-basic_chains_array.py \ 23-sim-arch_all_le_basic.py \ 24-live-arg_allow.py \ 25-sim-multilevel_chains_adv.py \ 26-sim-arch_all_be_basic.py \ 27-sim-bpf_blk_state.py \ 28-sim-arch_x86.py \ 29-sim-pseudo_syscall.py \ 30-sim-socket_syscalls.py \ 31-basic-version_check.py \ 32-live-tsync_allow.py \ 33-sim-socket_syscalls_be.py \ 34-sim-basic_denylist.py \ 35-sim-negative_one.py \ 36-sim-ipc_syscalls.py \ 37-sim-ipc_syscalls_be.py \ 39-basic-api_level.py \ 40-sim-log.py \ 41-sim-syscall_priority_arch.py \ 42-sim-adv_chains.py \ 43-sim-a2_order.py \ 44-live-a2_order.py \ 45-sim-chain_code_coverage.py \ 46-sim-kill_process.py \ 47-live-kill_process.py \ 48-sim-32b_args.py \ 49-sim-64b_comparisons.py \ 50-sim-hash_collision.py \ 51-live-user_notification.py \ 52-basic-load.py \ 53-sim-binary_tree.py \ 54-live-binary_tree.py \ 56-basic-iterate_syscalls.py \ 57-basic-rawsysrc.py \ 58-live-tsync_notify.py \ 59-basic-empty_binary_tree.py \ 60-sim-precompute.py EXTRA_DIST_TESTCFGS = \ 01-sim-allow.tests \ 02-sim-basic.tests \ 03-sim-basic_chains.tests \ 04-sim-multilevel_chains.tests \ 05-sim-long_jumps.tests \ 06-sim-actions.tests \ 07-sim-db_bug_looping.tests \ 08-sim-subtree_checks.tests \ 09-sim-syscall_priority_pre.tests \ 10-sim-syscall_priority_post.tests \ 11-basic-basic_errors.tests \ 12-sim-basic_masked_ops.tests \ 13-basic-attrs.tests \ 14-sim-reset.tests \ 15-basic-resolver.tests \ 16-sim-arch_basic.tests \ 17-sim-arch_merge.tests \ 18-sim-basic_allowlist.tests \ 19-sim-missing_syscalls.tests \ 20-live-basic_die.tests \ 21-live-basic_allow.tests \ 22-sim-basic_chains_array.tests \ 23-sim-arch_all_le_basic.tests \ 24-live-arg_allow.tests \ 25-sim-multilevel_chains_adv.tests \ 26-sim-arch_all_be_basic.tests \ 27-sim-bpf_blk_state.tests \ 28-sim-arch_x86.tests \ 29-sim-pseudo_syscall.tests \ 30-sim-socket_syscalls.tests \ 31-basic-version_check.tests \ 32-live-tsync_allow.tests \ 33-sim-socket_syscalls_be.tests \ 34-sim-basic_denylist.tests \ 35-sim-negative_one.tests \ 36-sim-ipc_syscalls.tests \ 37-sim-ipc_syscalls_be.tests \ 38-basic-pfc_coverage.tests \ 39-basic-api_level.tests \ 40-sim-log.tests \ 41-sim-syscall_priority_arch.tests \ 42-sim-adv_chains.tests \ 43-sim-a2_order.tests \ 44-live-a2_order.tests \ 45-sim-chain_code_coverage.tests \ 46-sim-kill_process.tests \ 47-live-kill_process.tests \ 48-sim-32b_args.tests \ 49-sim-64b_comparisons.tests \ 50-sim-hash_collision.tests \ 51-live-user_notification.tests \ 52-basic-load.tests \ 53-sim-binary_tree.tests \ 54-live-binary_tree.tests \ 55-basic-pfc_binary_tree.tests \ 56-basic-iterate_syscalls.tests \ 57-basic-rawsysrc.tests \ 58-live-tsync_notify.tests \ 59-basic-empty_binary_tree.tests \ 60-sim-precompute.tests EXTRA_DIST_TESTSCRIPTS = \ 38-basic-pfc_coverage.sh 38-basic-pfc_coverage.pfc \ 55-basic-pfc_binary_tree.sh 55-basic-pfc_binary_tree.pfc EXTRA_DIST_TESTTOOLS = regression testdiff testgen EXTRA_DIST_TESTVALGRIND = valgrind_test.supp EXTRA_DIST = \ ${EXTRA_DIST_TESTCFGS} \ ${EXTRA_DIST_TESTPYTHON} \ ${EXTRA_DIST_TESTSCRIPTS} \ ${EXTRA_DIST_TESTTOOLS} \ ${EXTRA_DIST_TESTVALGRIND} nodist_00_test_SOURCES = 00-test.c EXTRA_PROGRAMS = 00-test check-build: ${MAKE} ${AM_MAKEFLAGS} ${check_PROGRAMS} clean-local: ${RM} -f 00-test *.pyc libseccomp-2.5.4/tests/46-sim-kill_process.tests0000644000000000000000000000107614467535325020316 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. # Author: Tom Hromatka # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 46-sim-kill_process +x86_64 0 N N N N N N ALLOW 46-sim-kill_process +x86_64 1 N N N N N N ERRNO(5) 46-sim-kill_process +x86_64 2 N N N N N N KILL 46-sim-kill_process +x86_64 3 100 N N N N N KILL_PROCESS 46-sim-kill_process +x86_64 3 101 N N N N N ERRNO(6) 46-sim-kill_process +x86_64 4 N N N N N N KILL_PROCESS libseccomp-2.5.4/tests/45-sim-chain_code_coverage.py0000755000000000000000000000273114467535325021043 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. # Author: Tom Hromatka # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) # the syscall and argument numbers are all fake to make the test simpler f.add_rule_exactly(ALLOW, 1008, Arg(0, GE, 1)) f.add_rule_exactly(ALLOW, 1008, Arg(1, GE, 2)) f.add_rule_exactly(ALLOW, 1008, Arg(0, GT, 3)) f.add_rule_exactly(ALLOW, 1008, Arg(2, MASKED_EQ, 0xf, 4)) f.add_rule_exactly(ALLOW, 1008, Arg(2, MASKED_EQ, 0xff, 5)) f.add_rule_exactly(ALLOW, 1008, Arg(2, MASKED_EQ, 0xff, 6)) return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/09-sim-syscall_priority_pre.c0000644000000000000000000000346614467535325021172 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; /* the syscall and argument numbers are all fake to make the test * simpler */ rc = seccomp_syscall_priority(ctx, 1000, 3); if (rc != 0) goto out; rc = seccomp_syscall_priority(ctx, 1001, 2); if (rc != 0) goto out; rc = seccomp_syscall_priority(ctx, 1002, 1); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1000, 2, SCMP_A0(SCMP_CMP_EQ, 0), SCMP_A1(SCMP_CMP_EQ, 1)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1001, 1, SCMP_A0(SCMP_CMP_EQ, 0)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1002, 0); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/39-basic-api_level.c0000644000000000000000000000362314467535325017140 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2017 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include int main(int argc, char *argv[]) { int rc; unsigned int api; api = seccomp_api_get(); if (api < 1) return -1; rc = seccomp_api_set(1); if (rc != 0) return -2; api = seccomp_api_get(); if (api != 1) return -3; rc = seccomp_api_set(2); if (rc != 0) return -4; api = seccomp_api_get(); if (api != 2) return -5; rc = seccomp_api_set(3); if (rc != 0) return -6; api = seccomp_api_get(); if (api != 3) return -7; rc = seccomp_api_set(4); if (rc != 0) return -8; api = seccomp_api_get(); if (api != 4) return -9; rc = seccomp_api_set(5); if (rc != 0) return -10; api = seccomp_api_get(); if (api != 5) return -11; rc = seccomp_api_set(6); if (rc != 0) return -12; api = seccomp_api_get(); if (api != 6) return -13; rc = seccomp_api_set(7); if (rc != 0) return -14; api = seccomp_api_get(); if (api != 7) return -15; /* Attempt to set a high, invalid API level */ rc = seccomp_api_set(1024); if (rc != -EINVAL) return -1001; /* Ensure that the previously set API level didn't change */ api = seccomp_api_get(); if (api != 7) return -1002; return 0; } libseccomp-2.5.4/tests/50-sim-hash_collision.tests0000644000000000000000000000127514467535325020617 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. # Author: Tom Hromatka # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 50-sim-hash_collision x86_64 1000 1 N N N N N ALLOW 50-sim-hash_collision x86_64 1000 2 N N N N N ALLOW 50-sim-hash_collision x86_64 1000 3 N N N N N ERRNO(100) 50-sim-hash_collision x86_64 1001 1 2 3 N N N ALLOW 50-sim-hash_collision x86_64 1001 1 1 N N N N ALLOW 50-sim-hash_collision x86_64 1001 2 N N N N N ERRNO(100) 50-sim-hash_collision x86_64 1001 1 3 N N N N ERRNO(100) 50-sim-hash_collision x86_64 1001 1 2 4 N N N ERRNO(100) libseccomp-2.5.4/tests/21-live-basic_allow.tests0000644000000000000000000000032414467535325020237 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2013 Red Hat # Author: Paul Moore # test type: live # Testname API Result 21-live-basic_allow 1 ALLOW libseccomp-2.5.4/tests/50-sim-hash_collision.c0000644000000000000000000000511514467535325017674 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. * Author: Tom Hromatka */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; rc = seccomp_api_set(1); if (rc != 0) return -rc; ctx = seccomp_init(SCMP_ACT_ERRNO(100)); if (ctx == NULL) return ENOMEM; rc = seccomp_arch_remove(ctx, SCMP_ARCH_NATIVE); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X86_64); if (rc != 0) goto out; /* libseccomp utilizes a hash table to manage BPF blocks. It * currently employs MurmurHash3 where the key is the hashed values * of the BPF instruction blocks, the accumulator start, and the * accumulator end. Changes to the hash algorithm will likely affect * this test. */ /* The following rules were derived from an issue reported by Tor: * https://github.com/seccomp/libseccomp/issues/148 * * In the steps below, syscall 1001 is configured similarly to how * Tor configured socket. The fairly complex rules below led to * a hash collision with rt_sigaction (syscall 1000) in this test. */ rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, 1001, 3, SCMP_A0(SCMP_CMP_EQ, 1), SCMP_A1(SCMP_CMP_MASKED_EQ, 0xf, 2), SCMP_A2(SCMP_CMP_EQ, 3)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, 1001, 2, SCMP_A0(SCMP_CMP_EQ, 1), SCMP_A1(SCMP_CMP_MASKED_EQ, 0xf, 1)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, 1000, 1, SCMP_A0(SCMP_CMP_EQ, 2)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, 1000, 1, SCMP_A0(SCMP_CMP_EQ, 1)); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/05-sim-long_jumps.c0000644000000000000000000000422114467535325017050 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2012 Red Hat * Copyright (c) 2021 Microsoft Corporation * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; int iter, ctr; char *syscall; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(brk), 0); if (rc != 0) goto out; /* same syscall, many chains */ for (iter = 0; iter < 100; iter++) { rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(chdir), 3, SCMP_A0(SCMP_CMP_EQ, iter), SCMP_A1(SCMP_CMP_NE, 0x0), SCMP_A2(SCMP_CMP_LT, SSIZE_MAX)); if (rc != 0) goto out; } /* many syscalls, same chain */ for (iter = 0, ctr = 0; iter < 10000 && ctr < 100; iter++) { if (iter == SCMP_SYS(chdir)) continue; syscall = seccomp_syscall_resolve_num_arch(SCMP_ARCH_NATIVE, iter); if (syscall) { free(syscall); rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, iter, 1, SCMP_A0(SCMP_CMP_NE, 0)); if (rc != 0) goto out; ctr++; } } rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/21-live-basic_allow.py0000755000000000000000000000331714467535325017535 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2013 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(): action = util.parse_action(sys.argv[1]) if not action == ALLOW: quit(1) util.install_trap() f = SyscallFilter(TRAP) # NOTE: additional syscalls required for python f.add_rule(ALLOW, "stat") f.add_rule(ALLOW, "fstat") f.add_rule(ALLOW, "open") f.add_rule(ALLOW, "openat") f.add_rule(ALLOW, "mmap") f.add_rule(ALLOW, "munmap") f.add_rule(ALLOW, "read") f.add_rule(ALLOW, "write") f.add_rule(ALLOW, "close") f.add_rule(ALLOW, "rt_sigaction") f.add_rule(ALLOW, "rt_sigreturn") f.add_rule(ALLOW, "sigreturn") f.add_rule(ALLOW, "sigaltstack") f.add_rule(ALLOW, "brk") f.add_rule(ALLOW, "exit_group") f.load() try: util.write_file("/dev/null") except OSError as ex: quit(ex.errno) quit(160) test() # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/44-live-a2_order.tests0000644000000000000000000000035714467535325017470 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. # Author: Tom Hromatka # test type: live # Testname API Result 44-live-a2_order 1 ALLOW libseccomp-2.5.4/tests/14-sim-reset.c0000644000000000000000000000265314467535325016024 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 0); if (rc != 0) goto out; rc = seccomp_reset(ctx, SCMP_ACT_KILL); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 0); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/56-basic-iterate_syscalls.c0000644000000000000000000000403414467535325020546 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2020 Red Hat * Author: Giuseppe Scrivano */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include unsigned int arch_list[] = { SCMP_ARCH_NATIVE, SCMP_ARCH_X86, SCMP_ARCH_X86_64, SCMP_ARCH_X32, SCMP_ARCH_ARM, SCMP_ARCH_AARCH64, SCMP_ARCH_LOONGARCH64, SCMP_ARCH_M68K, SCMP_ARCH_MIPS, SCMP_ARCH_MIPS64, SCMP_ARCH_MIPS64N32, SCMP_ARCH_MIPSEL, SCMP_ARCH_MIPSEL64, SCMP_ARCH_MIPSEL64N32, SCMP_ARCH_PPC, SCMP_ARCH_PPC64, SCMP_ARCH_PPC64LE, SCMP_ARCH_S390, SCMP_ARCH_S390X, SCMP_ARCH_PARISC, SCMP_ARCH_PARISC64, SCMP_ARCH_RISCV64, -1 }; static int test_arch(int arch, int init) { int n, iter = 0; for (iter = init; iter < init + 1000; iter++) { char *name; name = seccomp_syscall_resolve_num_arch(arch, iter); if (name == NULL) continue; n = seccomp_syscall_resolve_name_arch(arch, name); if (n != iter) return 1; } return 0; } int main(int argc, char *argv[]) { int iter = 0; for (iter = 0; arch_list[iter] != -1; iter++) { int init = 0; if (arch_list[iter] == SCMP_ARCH_X32) init = 0x40000000; else if (arch_list[iter] == SCMP_ARCH_MIPS) init = 4000; else if (arch_list[iter] == SCMP_ARCH_MIPS64) init = 5000; else if (arch_list[iter] == SCMP_ARCH_MIPS64N32) init = 6000; if (test_arch(arch_list[iter], init) < 0) return 1; } return 0; } libseccomp-2.5.4/tests/16-sim-arch_basic.py0000755000000000000000000000361514467535325017172 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) # NOTE: some of these arch functions are not strictly necessary, but are # here for test sanity/coverage f.remove_arch(Arch()) f.add_arch(Arch()) f.remove_arch(Arch()) f.add_arch(Arch("x86")) f.add_arch(Arch("x86_64")) f.add_arch(Arch("x32")) f.add_arch(Arch("arm")) f.add_arch(Arch("aarch64")) f.add_arch(Arch("loongarch64")) f.add_arch(Arch("mipsel")) f.add_arch(Arch("mipsel64")) f.add_arch(Arch("mipsel64n32")) f.add_arch(Arch("ppc64le")) f.add_arch(Arch("riscv64")) f.add_arch(Arch("sh")) f.add_rule(ALLOW, "read", Arg(0, EQ, sys.stdin.fileno())) f.add_rule(ALLOW, "write", Arg(0, EQ, sys.stdout.fileno())) f.add_rule(ALLOW, "write", Arg(0, EQ, sys.stderr.fileno())) f.add_rule(ALLOW, "close") f.add_rule(ALLOW, "socket") f.add_rule(ALLOW, "connect") f.add_rule(ALLOW, "shutdown") return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/47-live-kill_process.tests0000644000000000000000000000037214467535325020464 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. # Author: Tom Hromatka # test type: live # Testname API Result 47-live-kill_process 3 KILL_PROCESS libseccomp-2.5.4/tests/60-sim-precompute.tests0000644000000000000000000000077014467535325020004 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2022 Microsoft Corporation # Author: Paul Moore # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 60-sim-precompute all 0-10 N N N N N N ALLOW 60-sim-precompute all 1000 N N N N N N KILL 60-sim-precompute all 1001 N N N N N N KILL test type: bpf-sim-fuzz # Testname StressCount 60-sim-precompute 5 test type: bpf-valgrind # Testname 60-sim-precompute libseccomp-2.5.4/tests/08-sim-subtree_checks.py0000755000000000000000000000747414467535325020115 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) # the syscall and argument numbers are all fake to make the test simpler f.add_rule_exactly(ALLOW, 1000, Arg(0, EQ, 0), Arg(1, EQ, 1)) f.add_rule_exactly(ALLOW, 1000, Arg(1, EQ, 1)) f.add_rule_exactly(ALLOW, 1001, Arg(1, EQ, 1)) f.add_rule_exactly(ALLOW, 1001, Arg(0, EQ, 0), Arg(1, EQ, 1)) f.add_rule_exactly(ALLOW, 1002, Arg(0, EQ, 0), Arg(1, EQ, 1), Arg(2, EQ, 2), Arg(3, EQ, 3)) f.add_rule_exactly(ALLOW, 1002, Arg(1, EQ, 1), Arg(2, EQ, 2)) f.add_rule_exactly(ALLOW, 1003, Arg(1, EQ, 1), Arg(2, EQ, 2)) f.add_rule_exactly(ALLOW, 1003, Arg(0, EQ, 0), Arg(1, EQ, 1), Arg(2, EQ, 2), Arg(3, EQ, 3)) f.add_rule_exactly(ALLOW, 1004, Arg(0, EQ, 0), Arg(1, EQ, 1), Arg(2, EQ, 2), Arg(3, EQ, 3)) f.add_rule_exactly(ALLOW, 1004, Arg(0, EQ, 0), Arg(1, EQ, 11)) f.add_rule_exactly(ALLOW, 1004, Arg(0, EQ, 0), Arg(1, EQ, 1), Arg(2, EQ, 2), Arg(3, EQ, 33)) f.add_rule_exactly(ALLOW, 1004, Arg(1, EQ, 1), Arg(2, EQ, 2)) f.add_rule_exactly(ALLOW, 1005, Arg(1, EQ, 1), Arg(2, EQ, 2)) f.add_rule_exactly(ALLOW, 1005, Arg(0, EQ, 0), Arg(1, EQ, 1), Arg(2, EQ, 2), Arg(3, EQ, 3)) f.add_rule_exactly(ALLOW, 1005, Arg(0, EQ, 0), Arg(1, EQ, 11)) f.add_rule_exactly(ALLOW, 1005, Arg(0, EQ, 0), Arg(1, EQ, 1), Arg(2, EQ, 2), Arg(3, EQ, 33)) f.add_rule_exactly(ALLOW, 1006, Arg(1, NE, 1), Arg(2, EQ, 0)) f.add_rule_exactly(ALLOW, 1006, Arg(1, EQ, 1), Arg(2, EQ, 2)) f.add_rule_exactly(ALLOW, 1006, Arg(1, NE, 1)) f.add_rule_exactly(TRAP, 1007, Arg(2, EQ, 2), Arg(3, EQ, 3)) f.add_rule_exactly(ALLOW, 1007, Arg(2, EQ, 2), Arg(3, NE, 3)) f.add_rule_exactly(ALLOW, 1007, Arg(3, NE, 3)) return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/49-sim-64b_comparisons.py0000755000000000000000000000217714467535325020134 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2019 Cisco Systems, Inc. # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import errno import sys import util from seccomp import * def test(args): set_api(3) f = SyscallFilter(KILL) f.add_rule_exactly(ALLOW, 1000, Arg(0, LT, 0x123456789abc)) return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/14-sim-reset.py0000755000000000000000000000214014467535325016224 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) f.add_rule(ALLOW, "read") f.reset() f.add_rule(ALLOW, "write") return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/58-live-tsync_notify.c0000644000000000000000000000451514467535325017610 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2019 Cisco Systems, Inc. * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc, fd = -1, status; struct seccomp_notif *req = NULL; struct seccomp_notif_resp *resp = NULL; scmp_filter_ctx ctx = NULL; pid_t pid = 0, magic; magic = getpid(); ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return ENOMEM; rc = seccomp_attr_set(ctx, SCMP_FLTATR_CTL_TSYNC, 1); if (rc) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_NOTIFY, SCMP_SYS(getpid), 0, NULL); if (rc) goto out; rc = seccomp_load(ctx); if (rc < 0) goto out; rc = seccomp_notify_fd(ctx); if (rc < 0) goto out; fd = rc; pid = fork(); if (pid == 0) exit(syscall(__NR_getpid) != magic); rc = seccomp_notify_alloc(&req, &resp); if (rc) goto out; rc = seccomp_notify_receive(fd, req); if (rc) goto out; if (req->data.nr != __NR_getpid) { rc = -EFAULT; goto out; } rc = seccomp_notify_id_valid(fd, req->id); if (rc) goto out; resp->id = req->id; resp->val = magic; resp->error = 0; resp->flags = 0; rc = seccomp_notify_respond(fd, resp); if (rc) goto out; if (waitpid(pid, &status, 0) != pid) { rc = -EFAULT; goto out; } if (!WIFEXITED(status)) { rc = -EFAULT; goto out; } if (WEXITSTATUS(status)) { rc = -EFAULT; goto out; } out: if (fd >= 0) close(fd); if (pid) kill(pid, SIGKILL); seccomp_notify_free(req, resp); seccomp_release(ctx); if (rc != 0) return (rc < 0 ? -rc : rc); return 160; } libseccomp-2.5.4/tests/11-basic-basic_errors.tests0000644000000000000000000000027114467535325020557 0ustar rootroot# # libseccomp regression test automation data # # Copyright IBM Corp. 2012 # Author: Corey Bryant # test type: basic # Test command 11-basic-basic_errors libseccomp-2.5.4/tests/59-basic-empty_binary_tree.tests0000644000000000000000000000054614467535325021644 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2022 Oracle and/or its affiliates. # Author: Tom Hromatka # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 59-basic-empty_binary_tree all,-x32 0-350 N N N N N N ALLOW test type: bpf-valgrind # Testname 59-basic-empty_binary_tree libseccomp-2.5.4/tests/30-sim-socket_syscalls.tests0000644000000000000000000000462114467535325021022 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2016 Red Hat # Author: Paul Moore # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result # socket 30-sim-socket_syscalls +x86,+ppc64le,+mipsel,+sh socketcall 1 N N N N N ALLOW # connect 30-sim-socket_syscalls +x86,+ppc64le,+mipsel,+sh socketcall 3 N N N N N ALLOW # accept 30-sim-socket_syscalls +x86,+ppc64le,+mipsel,+sh socketcall 5 N N N N N ALLOW # accept4 30-sim-socket_syscalls +ppc64le socketcall 18 N N N N N ALLOW # shutdown 30-sim-socket_syscalls +x86,+ppc64le,+mipsel,+sh socketcall 13 N N N N N ALLOW # socket 30-sim-socket_syscalls +x86 359 0 1 2 N N N ALLOW 30-sim-socket_syscalls +ppc64le 326 0 1 2 N N N ALLOW 30-sim-socket_syscalls +mipsel 4183 0 1 2 N N N ALLOW 30-sim-socket_syscalls +sh 340 0 1 2 N N N ALLOW # connect 30-sim-socket_syscalls +x86 362 0 1 2 N N N ALLOW 30-sim-socket_syscalls +ppc64le 328 0 1 2 N N N ALLOW 30-sim-socket_syscalls +mipsel 4170 0 1 2 N N N ALLOW 30-sim-socket_syscalls +sh 342 0 1 2 N N N ALLOW # accept 30-sim-socket_syscalls +ppc64le 330 0 1 2 N N N ALLOW 30-sim-socket_syscalls +mipsel 4168 0 1 2 N N N ALLOW 30-sim-socket_syscalls +sh 344 0 1 2 N N N ALLOW # accept4 30-sim-socket_syscalls +x86 364 0 1 2 N N N ALLOW 30-sim-socket_syscalls +ppc64le 344 0 1 2 N N N ALLOW 30-sim-socket_syscalls +mipsel 4334 0 1 2 N N N ALLOW 30-sim-socket_syscalls +sh 358 0 1 2 N N N ALLOW # shutdown 30-sim-socket_syscalls +x86 373 0 1 2 N N N ALLOW 30-sim-socket_syscalls +ppc64le 338 0 1 2 N N N ALLOW 30-sim-socket_syscalls +mipsel 4182 0 1 2 N N N ALLOW 30-sim-socket_syscalls +sh 352 0 1 2 N N N ALLOW # direct syscalls 30-sim-socket_syscalls +x86,+ppc64le,+mipsel,+sh accept 5 N N N N N ALLOW 30-sim-socket_syscalls +x86,+ppc64le,+mipsel,+sh accept 0 1 2 N N N KILL 30-sim-socket_syscalls +x86,+ppc64le,+mipsel,+sh accept4 18 1 2 N N N ALLOW 30-sim-socket_syscalls +x86,+ppc64le,+mipsel,+sh accept4 0 1 2 N N N KILL 30-sim-socket_syscalls +x86_64 socket 0 1 2 N N N ALLOW 30-sim-socket_syscalls +x86_64 connect 0 1 2 N N N ALLOW 30-sim-socket_syscalls +x86_64 accept4 0 1 2 N N N ALLOW 30-sim-socket_syscalls +x86_64 shutdown 0 1 2 N N N ALLOW test type: bpf-valgrind # Testname 30-sim-socket_syscalls libseccomp-2.5.4/tests/56-basic-iterate_syscalls.py0000755000000000000000000000333514467535325020762 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2020 Red Hat # Author: Giuseppe Scrivano # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * arch_list = ["x86", "x86_64", "x32", "arm", "aarch64", "loongarch64", "mipsel", "mipsel64", "mipsel64n32", "ppc64le", "riscv64"] def test_arch(arch, init): for i in range(init, init + 1000): sys_name = resolve_syscall(arch, i) if sys_name is None: continue n = resolve_syscall(i, sys_name) if i != n: raise RuntimeError("Test failure") def test(): for i in arch_list: init = 0 if i == "x32": init = 0x40000000 elif i == "mipsel": init = 4000 elif i == "mipsel64": init = 5000 elif i == "mipsel64n32": init = 6000 test_arch(Arch(i), init) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/28-sim-arch_x86.py0000755000000000000000000000244214467535325016536 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2015 Red Hat # Author: Paul Moore # # Adapted from 29-sim-arch_x86.c by Mathias Krause # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(ALLOW) f.remove_arch(Arch()) # add x86-64 and x86 (in that order!) but explicitly leave out x32 f.add_arch(Arch("x86_64")) f.add_arch(Arch("x86")) f.add_rule(ERRNO(1), "close") return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/15-basic-resolver.c0000644000000000000000000001015414467535325017030 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include unsigned int arch_list[] = { SCMP_ARCH_NATIVE, SCMP_ARCH_X86, SCMP_ARCH_X86_64, SCMP_ARCH_X32, SCMP_ARCH_ARM, SCMP_ARCH_AARCH64, SCMP_ARCH_LOONGARCH64, SCMP_ARCH_M68K, SCMP_ARCH_MIPS, SCMP_ARCH_MIPS64, SCMP_ARCH_MIPS64N32, SCMP_ARCH_MIPSEL, SCMP_ARCH_MIPSEL64, SCMP_ARCH_MIPSEL64N32, SCMP_ARCH_PPC, SCMP_ARCH_PPC64, SCMP_ARCH_PPC64LE, SCMP_ARCH_S390, SCMP_ARCH_S390X, SCMP_ARCH_PARISC, SCMP_ARCH_PARISC64, SCMP_ARCH_RISCV64, SCMP_ARCH_SH, -1 }; int main(int argc, char *argv[]) { int rc; int iter = 0; unsigned int arch; char *name = NULL; if (seccomp_syscall_resolve_name("open") != __SNR_open) goto fail; if (seccomp_syscall_resolve_name("read") != __SNR_read) goto fail; if (seccomp_syscall_resolve_name("INVALID") != __NR_SCMP_ERROR) goto fail; rc = seccomp_syscall_resolve_name_rewrite(SCMP_ARCH_NATIVE, "openat"); if (rc != __SNR_openat) goto fail; while ((arch = arch_list[iter++]) != -1) { int sys; int nr_open; int nr_read; int nr_socket; int nr_shmctl; if (seccomp_syscall_resolve_name_arch(arch, "INVALID") != __NR_SCMP_ERROR) goto fail; name = seccomp_syscall_resolve_num_arch(arch, __NR_SCMP_ERROR); if (name != NULL) goto fail; nr_open = seccomp_syscall_resolve_name_arch(arch, "open"); if (nr_open == __NR_SCMP_ERROR) goto fail; nr_read = seccomp_syscall_resolve_name_arch(arch, "read"); if (nr_read == __NR_SCMP_ERROR) goto fail; nr_socket = seccomp_syscall_resolve_name_rewrite(arch, "socket"); if (nr_socket == __NR_SCMP_ERROR) goto fail; nr_shmctl = seccomp_syscall_resolve_name_rewrite(arch, "shmctl"); if (nr_shmctl == __NR_SCMP_ERROR) goto fail; name = seccomp_syscall_resolve_num_arch(arch, nr_open); if (name == NULL || strcmp(name, "open") != 0) goto fail; free(name); name = NULL; name = seccomp_syscall_resolve_num_arch(arch, nr_read); if (name == NULL || strcmp(name, "read") != 0) goto fail; free(name); name = NULL; name = seccomp_syscall_resolve_num_arch(arch, nr_socket); if (name == NULL || (strcmp(name, "socket") != 0 && strcmp(name, "socketcall") != 0)) goto fail; free(name); name = NULL; name = seccomp_syscall_resolve_num_arch(arch, nr_shmctl); if (name == NULL || (strcmp(name, "shmctl") != 0 && strcmp(name, "ipc") != 0)) goto fail; free(name); name = NULL; /* socket pseudo-syscalls */ if (seccomp_syscall_resolve_name_arch(arch, "socketcall") > 0) { for (sys = -101; sys >= -120; sys--) { name = seccomp_syscall_resolve_num_arch(arch, sys); if (name == NULL) goto fail; free(name); name = NULL; } } /* ipc pseudo-syscalls */ if (seccomp_syscall_resolve_name_arch(arch, "ipc") > 0) { for (sys = -201; sys >= -204; sys--) { name = seccomp_syscall_resolve_num_arch(arch, sys); if (name == NULL) goto fail; free(name); name = NULL; } for (sys = -211; sys >= -214; sys--) { name = seccomp_syscall_resolve_num_arch(arch, sys); if (name == NULL) goto fail; free(name); name = NULL; } for (sys = -221; sys >= -224; sys--) { name = seccomp_syscall_resolve_num_arch(arch, sys); if (name == NULL) goto fail; free(name); name = NULL; } } } return 0; fail: if (name != NULL) free(name); return 1; } libseccomp-2.5.4/tests/46-sim-kill_process.c0000644000000000000000000000346514467535325017402 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. * Author: Tom Hromatka */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; rc = seccomp_api_set(3); if (rc != 0) return -rc; ctx = seccomp_init(SCMP_ACT_KILL_PROCESS); if (ctx == NULL) return ENOMEM; rc = seccomp_arch_remove(ctx, SCMP_ARCH_NATIVE); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X86_64); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(5), SCMP_SYS(write), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_KILL_THREAD, SCMP_SYS(open), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(6), SCMP_SYS(close), 1, SCMP_A0(SCMP_CMP_GT, 100)); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/35-sim-negative_one.c0000644000000000000000000000315314467535325017344 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2017 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; rc = seccomp_arch_remove(ctx, SCMP_ARCH_NATIVE); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X86); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, SCMP_ARCH_X86_64); if (rc != 0) goto out; rc = seccomp_attr_set(ctx, SCMP_FLTATR_API_TSKIP, 1); if (rc != 0) goto out; rc = seccomp_syscall_priority(ctx, -1, 100); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, -1, 0); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/17-sim-arch_merge.tests0000644000000000000000000000142514467535325017715 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2012 Red Hat # Author: Paul Moore # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 17-sim-arch_merge +x86 read 0 0x856B008 10 N N N ALLOW 17-sim-arch_merge +x86 read 1-10 0x856B008 10 N N N KILL 17-sim-arch_merge +x86 write 1-2 0x856B008 10 N N N ALLOW 17-sim-arch_merge +x86 write 3-10 0x856B008 10 N N N KILL 17-sim-arch_merge +x86 close N N N N N N ALLOW 17-sim-arch_merge +x86 open 0x856B008 4 N N N N KILL 17-sim-arch_merge +x86_64 socket 0 1 2 N N N ALLOW 17-sim-arch_merge +x86_64 connect 0 1 2 N N N ALLOW 17-sim-arch_merge +x86_64 shutdown 0 1 2 N N N ALLOW test type: bpf-valgrind # Testname 17-sim-arch_merge libseccomp-2.5.4/tests/10-sim-syscall_priority_post.py0000755000000000000000000000253314467535325021564 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) # the syscall and argument numbers are all fake to make the test simpler f.add_rule_exactly(ALLOW, 1000, Arg(0, EQ, 0), Arg(1, EQ, 1)) f.add_rule_exactly(ALLOW, 1001, Arg(0, EQ, 0)) f.add_rule_exactly(ALLOW, 1002) f.syscall_priority(1000, 3) f.syscall_priority(1001, 2) f.syscall_priority(1002, 1) return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/34-sim-basic_denylist.c0000644000000000000000000000343614467535325017700 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2013 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) return ENOMEM; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, SCMP_SYS(read), 1, SCMP_A0(SCMP_CMP_EQ, STDIN_FILENO)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, SCMP_SYS(write), 1, SCMP_A0(SCMP_CMP_EQ, STDOUT_FILENO)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, SCMP_SYS(write), 1, SCMP_A0(SCMP_CMP_EQ, STDERR_FILENO)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, SCMP_SYS(close), 0); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, SCMP_SYS(rt_sigreturn), 0); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/testdiff0000755000000000000000000000460114467535325015257 0ustar rootroot#!/bin/bash # # libseccomp test diff generator # # Copyright (c) 2013 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # #### # functions # # Print out script usage details # function usage() { cat << EOF usage: regression [-h] LABEL_1 LABEL_2 libseccomp test diff generator script optional arguments: -h show this help message and exit EOF } # # Print the test header # # Arguments: # 1 string containing generated test number # function print_test() { printf "Test %s comparison:\n" "$1" } # # Compare the tests # # Arguments: # 1 string containing first test label # 2 string containing second test label # function diff_tests() { local batch_name local label_a local label_b local file_a local file_b if [[ -n $1 ]]; then label_a=".$1" else label_a="" fi if [[ -n $2 ]]; then label_b=".$2" else label_b="" fi for file in *-sim-*.tests; do # extract the batch name from the file name batch_name=$(basename $file .tests) print_test "$batch_name" file_a="${batch_name}${label_a}" file_b="${batch_name}${label_b}" if [[ -r "$file_a.pfc" && -r "$file_b.pfc" ]]; then diff -pu "$file_a.pfc" "$file_b.pfc" fi if [[ -r "$file_a.bpf" && -r "$file_b.bpf" ]]; then diff -pu "$file_a.bpf" "$file_b.bpf" fi if [[ -r "$file_a.bpfd" && -r "$file_b.bpfd" ]]; then diff -pu "$file_a.bpfd" "$file_b.bpfd" fi done return } #### # main opt_label= opt_disasm=0 while getopts "h" opt; do case $opt in h|*) usage exit 1 ;; esac done stats_all=0 stats_failure=0 # display the test output and run the requested tests echo "=============== $(date) ===============" echo "Comparing Test Output (\"testdiff $*\")" diff_tests "$1" "$2" echo "============================================================" # exit exit 0 libseccomp-2.5.4/tests/38-basic-pfc_coverage.pfc0000644000000000000000000005470714467535325020161 0ustar rootroot# # pseudo filter code start # # filter for arch x86_64 (3221225534) if ($arch == 3221225534) # filter for syscall "exit_group" (231) [priority: 65535] if ($syscall == 231) action LOG; # filter for syscall "exit" (60) [priority: 65535] if ($syscall == 60) action TRACE(1); # filter for syscall "fstat" (5) [priority: 65535] if ($syscall == 5) action KILL_PROCESS; # filter for syscall "close" (3) [priority: 65535] if ($syscall == 3) action ERRNO(1); # filter for syscall "open" (2) [priority: 65535] if ($syscall == 2) action KILL; # filter for syscall "write" (1) [priority: 65527] if ($syscall == 1) if ($a0.hi32 == 0) if ($a0.lo32 == 0) else if ($a1.hi32 > 0) else if ($a1.hi32 == 0) if ($a1.lo32 > 1) else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; else if ($a1.hi32 > 0) else if ($a1.hi32 == 0) if ($a1.lo32 > 1) else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; # filter for syscall "read" (0) [priority: 65525] if ($syscall == 0) if ($a0.hi32 == 0) if ($a0.lo32 == 0) if ($a1.hi32 > 0) if ($a2.hi32 > 0) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; else if ($a2.hi32 == 0) if ($a2.lo32 > 2) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; else if ($a1.hi32 == 0) if ($a1.lo32 >= 1) if ($a2.hi32 > 0) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; else if ($a2.hi32 == 0) if ($a2.lo32 > 2) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; # default action action ALLOW; # filter for arch x86 (1073741827) if ($arch == 1073741827) # filter for syscall "exit_group" (252) [priority: 65535] if ($syscall == 252) action LOG; # filter for syscall "fstat" (108) [priority: 65535] if ($syscall == 108) action KILL_PROCESS; # filter for syscall "close" (6) [priority: 65535] if ($syscall == 6) action ERRNO(1); # filter for syscall "open" (5) [priority: 65535] if ($syscall == 5) action KILL; # filter for syscall "exit" (1) [priority: 65535] if ($syscall == 1) action TRACE(1); # filter for syscall "write" (4) [priority: 65532] if ($syscall == 4) if ($a0 == 0) else if ($a1 > 1) else if ($a2 >= 2) else action TRAP; # filter for syscall "read" (3) [priority: 65531] if ($syscall == 3) if ($a0 == 0) if ($a1 >= 1) if ($a2 > 2) if ($a3 & 0x0000000f == 3) action KILL; # default action action ALLOW; # filter for arch x32 (3221225534) if ($arch == 3221225534) # filter for syscall "exit_group" (1073742055) [priority: 65535] if ($syscall == 1073742055) action LOG; # filter for syscall "exit" (1073741884) [priority: 65535] if ($syscall == 1073741884) action TRACE(1); # filter for syscall "fstat" (1073741829) [priority: 65535] if ($syscall == 1073741829) action KILL_PROCESS; # filter for syscall "close" (1073741827) [priority: 65535] if ($syscall == 1073741827) action ERRNO(1); # filter for syscall "open" (1073741826) [priority: 65535] if ($syscall == 1073741826) action KILL; # filter for syscall "write" (1073741825) [priority: 65532] if ($syscall == 1073741825) if ($a0 == 0) else if ($a1 > 1) else if ($a2 >= 2) else action TRAP; # filter for syscall "read" (1073741824) [priority: 65531] if ($syscall == 1073741824) if ($a0 == 0) if ($a1 >= 1) if ($a2 > 2) if ($a3 & 0x0000000f == 3) action KILL; # default action action ALLOW; # filter for arch arm (1073741864) if ($arch == 1073741864) # filter for syscall "exit_group" (248) [priority: 65535] if ($syscall == 248) action LOG; # filter for syscall "fstat" (108) [priority: 65535] if ($syscall == 108) action KILL_PROCESS; # filter for syscall "close" (6) [priority: 65535] if ($syscall == 6) action ERRNO(1); # filter for syscall "open" (5) [priority: 65535] if ($syscall == 5) action KILL; # filter for syscall "exit" (1) [priority: 65535] if ($syscall == 1) action TRACE(1); # filter for syscall "write" (4) [priority: 65532] if ($syscall == 4) if ($a0 == 0) else if ($a1 > 1) else if ($a2 >= 2) else action TRAP; # filter for syscall "read" (3) [priority: 65531] if ($syscall == 3) if ($a0 == 0) if ($a1 >= 1) if ($a2 > 2) if ($a3 & 0x0000000f == 3) action KILL; # default action action ALLOW; # filter for arch aarch64 (3221225655) if ($arch == 3221225655) # filter for syscall "open" (4294957130) [priority: 65535] if ($syscall == 4294957130) action KILL; # filter for syscall "exit_group" (94) [priority: 65535] if ($syscall == 94) action LOG; # filter for syscall "exit" (93) [priority: 65535] if ($syscall == 93) action TRACE(1); # filter for syscall "fstat" (80) [priority: 65535] if ($syscall == 80) action KILL_PROCESS; # filter for syscall "close" (57) [priority: 65535] if ($syscall == 57) action ERRNO(1); # filter for syscall "write" (64) [priority: 65527] if ($syscall == 64) if ($a0.hi32 == 0) if ($a0.lo32 == 0) else if ($a1.hi32 > 0) else if ($a1.hi32 == 0) if ($a1.lo32 > 1) else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; else if ($a1.hi32 > 0) else if ($a1.hi32 == 0) if ($a1.lo32 > 1) else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; # filter for syscall "read" (63) [priority: 65525] if ($syscall == 63) if ($a0.hi32 == 0) if ($a0.lo32 == 0) if ($a1.hi32 > 0) if ($a2.hi32 > 0) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; else if ($a2.hi32 == 0) if ($a2.lo32 > 2) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; else if ($a1.hi32 == 0) if ($a1.lo32 >= 1) if ($a2.hi32 > 0) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; else if ($a2.hi32 == 0) if ($a2.lo32 > 2) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; # default action action ALLOW; # filter for arch loongarch64 (3221225730) if ($arch == 3221225730) # filter for syscall "open" (4294957130) [priority: 65535] if ($syscall == 4294957130) action KILL; # filter for syscall "fstat" (4294957051) [priority: 65535] if ($syscall == 4294957051) action KILL_PROCESS; # filter for syscall "exit_group" (94) [priority: 65535] if ($syscall == 94) action LOG; # filter for syscall "exit" (93) [priority: 65535] if ($syscall == 93) action TRACE(1); # filter for syscall "close" (57) [priority: 65535] if ($syscall == 57) action ERRNO(1); # filter for syscall "write" (64) [priority: 65527] if ($syscall == 64) if ($a0.hi32 == 0) if ($a0.lo32 == 0) else if ($a1.hi32 > 0) else if ($a1.hi32 == 0) if ($a1.lo32 > 1) else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; else if ($a1.hi32 > 0) else if ($a1.hi32 == 0) if ($a1.lo32 > 1) else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; # filter for syscall "read" (63) [priority: 65525] if ($syscall == 63) if ($a0.hi32 == 0) if ($a0.lo32 == 0) if ($a1.hi32 > 0) if ($a2.hi32 > 0) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; else if ($a2.hi32 == 0) if ($a2.lo32 > 2) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; else if ($a1.hi32 == 0) if ($a1.lo32 >= 1) if ($a2.hi32 > 0) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; else if ($a2.hi32 == 0) if ($a2.lo32 > 2) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; # default action action ALLOW; # filter for arch mipsel (1073741832) if ($arch == 1073741832) # filter for syscall "exit_group" (4246) [priority: 65535] if ($syscall == 4246) action LOG; # filter for syscall "fstat" (4108) [priority: 65535] if ($syscall == 4108) action KILL_PROCESS; # filter for syscall "close" (4006) [priority: 65535] if ($syscall == 4006) action ERRNO(1); # filter for syscall "open" (4005) [priority: 65535] if ($syscall == 4005) action KILL; # filter for syscall "exit" (4001) [priority: 65535] if ($syscall == 4001) action TRACE(1); # filter for syscall "write" (4004) [priority: 65532] if ($syscall == 4004) if ($a0 == 0) else if ($a1 > 1) else if ($a2 >= 2) else action TRAP; # filter for syscall "read" (4003) [priority: 65531] if ($syscall == 4003) if ($a0 == 0) if ($a1 >= 1) if ($a2 > 2) if ($a3 & 0x0000000f == 3) action KILL; # default action action ALLOW; # filter for arch mipsel64 (3221225480) if ($arch == 3221225480) # filter for syscall "exit_group" (5205) [priority: 65535] if ($syscall == 5205) action LOG; # filter for syscall "exit" (5058) [priority: 65535] if ($syscall == 5058) action TRACE(1); # filter for syscall "fstat" (5005) [priority: 65535] if ($syscall == 5005) action KILL_PROCESS; # filter for syscall "close" (5003) [priority: 65535] if ($syscall == 5003) action ERRNO(1); # filter for syscall "open" (5002) [priority: 65535] if ($syscall == 5002) action KILL; # filter for syscall "write" (5001) [priority: 65527] if ($syscall == 5001) if ($a0.hi32 == 0) if ($a0.lo32 == 0) else if ($a1.hi32 > 0) else if ($a1.hi32 == 0) if ($a1.lo32 > 1) else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; else if ($a1.hi32 > 0) else if ($a1.hi32 == 0) if ($a1.lo32 > 1) else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; # filter for syscall "read" (5000) [priority: 65525] if ($syscall == 5000) if ($a0.hi32 == 0) if ($a0.lo32 == 0) if ($a1.hi32 > 0) if ($a2.hi32 > 0) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; else if ($a2.hi32 == 0) if ($a2.lo32 > 2) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; else if ($a1.hi32 == 0) if ($a1.lo32 >= 1) if ($a2.hi32 > 0) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; else if ($a2.hi32 == 0) if ($a2.lo32 > 2) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; # default action action ALLOW; # filter for arch mipsel64n32 (3758096392) if ($arch == 3758096392) # filter for syscall "exit_group" (6205) [priority: 65535] if ($syscall == 6205) action LOG; # filter for syscall "exit" (6058) [priority: 65535] if ($syscall == 6058) action TRACE(1); # filter for syscall "fstat" (6005) [priority: 65535] if ($syscall == 6005) action KILL_PROCESS; # filter for syscall "close" (6003) [priority: 65535] if ($syscall == 6003) action ERRNO(1); # filter for syscall "open" (6002) [priority: 65535] if ($syscall == 6002) action KILL; # filter for syscall "write" (6001) [priority: 65532] if ($syscall == 6001) if ($a0 == 0) else if ($a1 > 1) else if ($a2 >= 2) else action TRAP; # filter for syscall "read" (6000) [priority: 65531] if ($syscall == 6000) if ($a0 == 0) if ($a1 >= 1) if ($a2 > 2) if ($a3 & 0x0000000f == 3) action KILL; # default action action ALLOW; # filter for arch ppc64le (3221225493) if ($arch == 3221225493) # filter for syscall "exit_group" (234) [priority: 65535] if ($syscall == 234) action LOG; # filter for syscall "fstat" (108) [priority: 65535] if ($syscall == 108) action KILL_PROCESS; # filter for syscall "close" (6) [priority: 65535] if ($syscall == 6) action ERRNO(1); # filter for syscall "open" (5) [priority: 65535] if ($syscall == 5) action KILL; # filter for syscall "exit" (1) [priority: 65535] if ($syscall == 1) action TRACE(1); # filter for syscall "write" (4) [priority: 65527] if ($syscall == 4) if ($a0.hi32 == 0) if ($a0.lo32 == 0) else if ($a1.hi32 > 0) else if ($a1.hi32 == 0) if ($a1.lo32 > 1) else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; else if ($a1.hi32 > 0) else if ($a1.hi32 == 0) if ($a1.lo32 > 1) else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; # filter for syscall "read" (3) [priority: 65525] if ($syscall == 3) if ($a0.hi32 == 0) if ($a0.lo32 == 0) if ($a1.hi32 > 0) if ($a2.hi32 > 0) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; else if ($a2.hi32 == 0) if ($a2.lo32 > 2) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; else if ($a1.hi32 == 0) if ($a1.lo32 >= 1) if ($a2.hi32 > 0) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; else if ($a2.hi32 == 0) if ($a2.lo32 > 2) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; # default action action ALLOW; # filter for arch sh (1073741866) if ($arch == 1073741866) # filter for syscall "exit_group" (252) [priority: 65535] if ($syscall == 252) action LOG; # filter for syscall "fstat" (108) [priority: 65535] if ($syscall == 108) action KILL_PROCESS; # filter for syscall "close" (6) [priority: 65535] if ($syscall == 6) action ERRNO(1); # filter for syscall "open" (5) [priority: 65535] if ($syscall == 5) action KILL; # filter for syscall "exit" (1) [priority: 65535] if ($syscall == 1) action TRACE(1); # filter for syscall "write" (4) [priority: 65532] if ($syscall == 4) if ($a0 == 0) else if ($a1 > 1) else if ($a2 >= 2) else action TRAP; # filter for syscall "read" (3) [priority: 65531] if ($syscall == 3) if ($a0 == 0) if ($a1 >= 1) if ($a2 > 2) if ($a3 & 0x0000000f == 3) action KILL; # default action action ALLOW; # filter for arch riscv64 (3221225715) if ($arch == 3221225715) # filter for syscall "open" (4294957130) [priority: 65535] if ($syscall == 4294957130) action KILL; # filter for syscall "exit_group" (94) [priority: 65535] if ($syscall == 94) action LOG; # filter for syscall "exit" (93) [priority: 65535] if ($syscall == 93) action TRACE(1); # filter for syscall "fstat" (80) [priority: 65535] if ($syscall == 80) action KILL_PROCESS; # filter for syscall "close" (57) [priority: 65535] if ($syscall == 57) action ERRNO(1); # filter for syscall "write" (64) [priority: 65527] if ($syscall == 64) if ($a0.hi32 == 0) if ($a0.lo32 == 0) else if ($a1.hi32 > 0) else if ($a1.hi32 == 0) if ($a1.lo32 > 1) else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; else if ($a1.hi32 > 0) else if ($a1.hi32 == 0) if ($a1.lo32 > 1) else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; else if ($a2.hi32 > 0) else if ($a2.hi32 == 0) if ($a2.lo32 >= 2) else action TRAP; else action TRAP; # filter for syscall "read" (63) [priority: 65525] if ($syscall == 63) if ($a0.hi32 == 0) if ($a0.lo32 == 0) if ($a1.hi32 > 0) if ($a2.hi32 > 0) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; else if ($a2.hi32 == 0) if ($a2.lo32 > 2) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; else if ($a1.hi32 == 0) if ($a1.lo32 >= 1) if ($a2.hi32 > 0) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; else if ($a2.hi32 == 0) if ($a2.lo32 > 2) if ($a3.hi32 & 0x00000000 == 0) if ($a3.lo32 & 0x0000000f == 3) action KILL; # default action action ALLOW; # invalid architecture action action KILL; # # pseudo filter code end # libseccomp-2.5.4/tests/31-basic-version_check.tests0000644000000000000000000000031014467535325020720 0ustar rootroot# # libseccomp regression test automation data # # Copyright (c) 2016 Red Hat # Author: Paul Moore # test type: basic # Test command 31-basic-version_check libseccomp-2.5.4/tests/57-basic-rawsysrc.c0000644000000000000000000000265114467535325017055 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2020 Cisco Systems, Inc. * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; int fd; scmp_filter_ctx ctx = NULL; rc = seccomp_api_set(3); if (rc != 0) return EOPNOTSUPP; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) { rc = ENOMEM; goto out; } rc = seccomp_attr_set(ctx, SCMP_FLTATR_API_SYSRAWRC, 1); if (rc != 0) goto out; /* we must use a closed/invalid fd for this to work */ fd = dup(2); close(fd); rc = seccomp_export_pfc(ctx, fd); if (rc == -EBADF) rc = 0; else rc = -1; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/23-sim-arch_all_le_basic.c0000644000000000000000000000563714467535325020275 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; rc = seccomp_arch_remove(ctx, SCMP_ARCH_NATIVE); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("x86")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("x86_64")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("x32")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("arm")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("aarch64")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("loongarch64")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("mipsel")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("mipsel64")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("mipsel64n32")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("ppc64le")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("riscv64")); if (rc != 0) goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("sh")); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 1, SCMP_A0(SCMP_CMP_EQ, STDIN_FILENO)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, SCMP_A0(SCMP_CMP_EQ, STDOUT_FILENO)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, SCMP_A0(SCMP_CMP_EQ, STDERR_FILENO)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigreturn), 0); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/45-sim-chain_code_coverage.c0000644000000000000000000000571414467535325020636 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. * Author: Tom Hromatka */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; /* the syscall and argument numbers are all fake to make the test * simpler */ rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1008, 1, SCMP_A0(SCMP_CMP_GE, 1)); if (rc != 0) goto out; /* db_chain_lt() path #1 - due to "A1" > "A0" */ rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1008, 1, SCMP_A1(SCMP_CMP_GE, 2)); if (rc != 0) goto out; /* db_chain_lt() path #2 - due to "GT" > "GE" */ rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1008, 1, SCMP_A0(SCMP_CMP_GT, 3)); if (rc != 0) goto out; /* db_chain_lt() path #3 - due to the second mask (0xff) being greater * than the first (0xf) */ rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1008, 1, SCMP_A2(SCMP_CMP_MASKED_EQ, 0xf, 4)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1008, 1, SCMP_A2(SCMP_CMP_MASKED_EQ, 0xff, 5)); if (rc != 0) goto out; /* db_chain_lt() path #4 - due to datum (6) > previous datum (5) */ rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1008, 1, SCMP_A2(SCMP_CMP_MASKED_EQ, 0xff, 6)); if (rc != 0) goto out; /* attempt to hit some of the lvl_prv and lvl_nxt code in db.c */ rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1008, 5, SCMP_A0(SCMP_CMP_NE, 7), SCMP_A1(SCMP_CMP_LT, 8), SCMP_A2(SCMP_CMP_EQ, 9), SCMP_A3(SCMP_CMP_GE, 10), SCMP_A4(SCMP_CMP_GT, 11), SCMP_A5(SCMP_CMP_MASKED_EQ, 0xffff, 12)); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, 1008, 5, SCMP_A0(SCMP_CMP_NE, 7), SCMP_A1(SCMP_CMP_LT, 8), SCMP_A2(SCMP_CMP_EQ, 9), SCMP_A3(SCMP_CMP_GE, 10), SCMP_A4(SCMP_CMP_GT, 11), SCMP_A5(SCMP_CMP_MASKED_EQ, 0xffff, 13)); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/32-live-tsync_allow.py0000755000000000000000000000336014467535325017614 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2013 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(): action = util.parse_action(sys.argv[1]) if not action == ALLOW: quit(1) util.install_trap() f = SyscallFilter(TRAP) f.set_attr(Attr.CTL_TSYNC, 1) # NOTE: additional syscalls required for python f.add_rule(ALLOW, "stat") f.add_rule(ALLOW, "fstat") f.add_rule(ALLOW, "open") f.add_rule(ALLOW, "openat") f.add_rule(ALLOW, "mmap") f.add_rule(ALLOW, "munmap") f.add_rule(ALLOW, "read") f.add_rule(ALLOW, "write") f.add_rule(ALLOW, "close") f.add_rule(ALLOW, "rt_sigaction") f.add_rule(ALLOW, "rt_sigreturn") f.add_rule(ALLOW, "sigreturn") f.add_rule(ALLOW, "sigaltstack") f.add_rule(ALLOW, "brk") f.add_rule(ALLOW, "exit_group") f.load() try: util.write_file("/dev/null") except OSError as ex: quit(ex.errno) quit(160) test() # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/10-sim-syscall_priority_post.tests0000644000000000000000000000134614467535325022274 0ustar rootroot# # libseccomp regression test automation data # # Copyright IBM Corp. 2012 # Author: Corey Bryant # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 10-sim-syscall_priority_post all,-x32 999 N N N N N N KILL 10-sim-syscall_priority_post all,-x32 1000-1002 0 1 N N N N ALLOW 10-sim-syscall_priority_post all,-x32 1000 0 2 N N N N KILL 10-sim-syscall_priority_post all,-x32 1001-1002 0 2 N N N N ALLOW 10-sim-syscall_priority_post all,-x32 1000-1001 1 1 N N N N KILL 10-sim-syscall_priority_post all,-x32 1003 N N N N N N KILL test type: bpf-sim-fuzz # Testname StressCount 10-sim-syscall_priority_post 5 test type: bpf-valgrind # Testname 10-sim-syscall_priority_post libseccomp-2.5.4/tests/58-live-tsync_notify.py0000755000000000000000000000334414467535325020020 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2019 Cisco Systems, Inc. # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import os import signal import sys import util from seccomp import * def test(): magic = os.getuid() + 1 f = SyscallFilter(ALLOW) f.set_attr(Attr.CTL_TSYNC, 1) f.add_rule(NOTIFY, "getuid") f.load() pid = os.fork() if pid == 0: val = os.getuid() if val != magic: raise RuntimeError("Response return value failed") quit(1) quit(0) else: notify = f.receive_notify() if notify.syscall != resolve_syscall(Arch(), "getuid"): raise RuntimeError("Notification failed") f.respond_notify(NotificationResponse(notify, magic, 0, 0)) wpid, rc = os.waitpid(pid, 0) if os.WIFEXITED(rc) == 0: raise RuntimeError("Child process error") if os.WEXITSTATUS(rc) != 0: raise RuntimeError("Child process error") quit(160) test() # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/51-live-user_notification.tests0000644000000000000000000000031014467535325021502 0ustar rootroot# # libseccomp regression test automation data # # Copyright Cisco Systems 2019 # Author: Tycho Andersen # test type: live # Testname API Result 51-live-user_notification 5 ALLOW libseccomp-2.5.4/tests/06-sim-actions.py0000755000000000000000000000241414467535325016547 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import errno import sys import util from seccomp import * def test(args): set_api(3) f = SyscallFilter(KILL) f.add_rule(ALLOW, "read") f.add_rule(LOG, "rt_sigreturn") f.add_rule(ERRNO(errno.EPERM), "write") f.add_rule(TRAP, "close") f.add_rule(TRACE(1234), "openat") f.add_rule(KILL_PROCESS, "fstatfs") return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/11-basic-basic_errors.py0000755000000000000000000000444414467535325020056 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(): # this test differs from the native test for obvious reasons try: f = SyscallFilter(ALLOW + 1) except RuntimeError: pass f = SyscallFilter(ALLOW) try: f.reset(KILL + 1) except ValueError: pass f = SyscallFilter(ALLOW) try: f.syscall_priority(-10000, 1) except RuntimeError: pass f = SyscallFilter(ALLOW) try: f.add_rule(ALLOW, "read") except RuntimeError: pass try: f.add_rule(KILL - 1, "read") except RuntimeError: pass try: f.add_rule(KILL, "read", Arg(0, EQ, 0), Arg(1, EQ, 1), Arg(2, EQ, 2), Arg(3, EQ, 3), Arg(4, EQ, 4), Arg(5, EQ, 5), Arg(6, EQ, 6), Arg(7, EQ, 7)) except RuntimeError: pass try: f.add_rule(KILL, -1001) except RuntimeError: pass f = SyscallFilter(ALLOW) f.remove_arch(Arch()) f.add_arch(Arch("x86")) try: f.add_rule_exactly(KILL, "socket", Arg(0, EQ, 2)) except RuntimeError: pass f = SyscallFilter(ALLOW) try: f.add_rule(ERRNO(0xffff), "read") except RuntimeError: pass # This shouldn't throw any errors. f = SyscallFilter(ALLOW) f.add_rule(KILL, "read") ret = f.export_bpf_mem() test() # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/35-sim-negative_one.py0000755000000000000000000000230614467535325017554 0ustar rootroot#!/usr/bin/env python # # Seccomp Library test program # # Copyright (c) 2017 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import argparse import sys import util from seccomp import * def test(args): f = SyscallFilter(KILL) f.remove_arch(Arch()) f.add_arch(Arch("x86")) f.add_arch(Arch("x86_64")) f.set_attr(Attr.API_TSKIP, 1) f.syscall_priority(-1, 100) f.add_rule(ALLOW, -1) return f args = util.get_opt() ctx = test(args) util.filter_output(args, ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/tests/04-sim-multilevel_chains.c0000644000000000000000000000426514467535325020411 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(openat), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 3, SCMP_A0(SCMP_CMP_EQ, STDIN_FILENO), SCMP_A1(SCMP_CMP_NE, 0x0), SCMP_A2(SCMP_CMP_LT, SSIZE_MAX)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 3, SCMP_A0(SCMP_CMP_EQ, STDOUT_FILENO), SCMP_A1(SCMP_CMP_NE, 0x0), SCMP_A2(SCMP_CMP_LT, SSIZE_MAX)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 3, SCMP_A0(SCMP_CMP_EQ, STDERR_FILENO), SCMP_A1(SCMP_CMP_NE, 0x0), SCMP_A2(SCMP_CMP_LT, SSIZE_MAX)); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0); if (rc != 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigreturn), 0); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/tests/08-sim-subtree_checks.tests0000644000000000000000000000345714467535325020621 0ustar rootroot# # libseccomp regression test automation data # # Copyright IBM Corp. 2012 # Author: Corey Bryant # test type: bpf-sim # Testname Arch Syscall Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Result 08-sim-subtree_checks all,-x32 1000 0-10 1 N N N N ALLOW 08-sim-subtree_checks all,-x32 1000 0-10 0 N N N N KILL 08-sim-subtree_checks all,-x32 1001 0-10 1 N N N N ALLOW 08-sim-subtree_checks all,-x32 1001 0-10 0 N N N N KILL 08-sim-subtree_checks all,-x32 1002 0-5 1 2 0-5 N N ALLOW 08-sim-subtree_checks all,-x32 1002 0-5 2 1 0-5 N N KILL 08-sim-subtree_checks all,-x32 1003 0-5 1 2 0-5 N N ALLOW 08-sim-subtree_checks all,-x32 1003 0-5 2 1 0-5 N N KILL 08-sim-subtree_checks all,-x32 1004 0 11 5-10 10 10 1-5 ALLOW 08-sim-subtree_checks all,-x32 1004 0 1 2 0-5 N N ALLOW 08-sim-subtree_checks all,-x32 1004 1-5 1 2 0-5 N N ALLOW 08-sim-subtree_checks all,-x32 1004 1-5 1 2 30-35 N N ALLOW 08-sim-subtree_checks all,-x32 1004 1-5 2 1 30-35 N N KILL 08-sim-subtree_checks all,-x32 1005 0 11 5-10 10 10 1-5 ALLOW 08-sim-subtree_checks all,-x32 1005 0 1 2 0-5 N N ALLOW 08-sim-subtree_checks all,-x32 1005 1-5 1 2 0-5 N N ALLOW 08-sim-subtree_checks all,-x32 1005 1-5 1 2 30-35 N N ALLOW 08-sim-subtree_checks all,-x32 1005 1-5 2 1 30-35 N N KILL 08-sim-subtree_checks all,-x32 1006 0-10 1 2 N N N ALLOW 08-sim-subtree_checks all,-x32 1006 0-10 1 3 N N N KILL 08-sim-subtree_checks all,-x32 1006 10 2-100 2 N N N ALLOW 08-sim-subtree_checks all,-x32 1007 0 0 2 3 N N TRAP 08-sim-subtree_checks all,-x32 1007 1 1 1 0-2 1 1 ALLOW 08-sim-subtree_checks all,-x32 1007 1 1 2 0-2 1 1 ALLOW 08-sim-subtree_checks all,-x32 1007 1 1 2 4-6 1 1 ALLOW 08-sim-subtree_checks all,-x32 1007 1 1 0 3 1 1 KILL test type: bpf-sim-fuzz # Testname StressCount 08-sim-subtree_checks 5 test type: bpf-valgrind # Testname 08-sim-subtree_checks libseccomp-2.5.4/tests/02-sim-basic.c0000644000000000000000000000323214467535325015752 0ustar rootroot/** * Seccomp Library test program * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ /* * Just like mode 1 seccomp we allow 4 syscalls: * read, write, exit, and rt_sigreturn */ #include #include #include #include "util.h" int main(int argc, char *argv[]) { int rc; struct util_options opts; scmp_filter_ctx ctx = NULL; rc = util_getopt(argc, argv, &opts); if (rc < 0) goto out; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return ENOMEM; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 0); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 0); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0); if (rc != 0) goto out; rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigreturn), 0); if (rc != 0) goto out; rc = util_filter_output(&opts, ctx); if (rc) goto out; out: seccomp_release(ctx); return (rc < 0 ? -rc : rc); } libseccomp-2.5.4/CHANGELOG0000644000000000000000000002213114467535324013566 0ustar rootrootlibseccomp: Releases =============================================================================== https://github.com/seccomp/libseccomp * Version 2.5.4 - April 21, 2022 - Update the syscall table for Linux v5.17 - Fix minor issues with binary tree testing and with empty binary trees - Minor documentation improvements including retiring the mailing list * Version 2.5.3 - November 5, 2021 - Update the syscall table for Linux v5.15 - Fix issues with multiplexed syscalls on mipsel introduced in v2.5.2 - Document that seccomp_rule_add() may return -EACCES - Fix issues with test 11-basic-basic_errors on old kernels (API level < 5) * Version 2.5.2 - August 31, 2021 - Update the syscall table for Linux v5.14-rc7 - Add a function, get_notify_fd(), to the Python bindings to get the nofication file descriptor - Consolidate multiplexed syscall handling for all architectures into one location - Add multiplexed syscall support to PPC - Add multiplexed syscall support to MIPS - The meaning of SECCOMP_IOCTL_NOTIF_ID_VALID changed within the kernel. Modify the libseccomp file descriptor notification logic to support the kernel's previous and new usage of SECCOMP_IOCTL_NOTIF_ID_VALID * Version 2.5.1 - November 20, 2020 - Fix a bug where seccomp_load() could only be called once - Change the notification fd handling to only request a notification fd if the filter has a _NOTIFY action - Add documentation about SCMP_ACT_NOTIFY to the seccomp_add_rule(3) manpage - Clarify the maintainers' GPG keys * Version 2.5.0 - July 20, 2020 - Add support for the seccomp user notifications, see the seccomp_notify_alloc(3), seccomp_notify_receive(3), seccomp_notify_respond(3) manpages for more information - Add support for new filter optimization approaches, including a balanced tree optimization, see the SCMP_FLTATR_CTL_OPTIMIZE filter attribute for more information - Add support for the 64-bit RISC-V architecture - Performance improvements when adding new rules to a filter thanks to the use of internal shadow transactions and improved syscall lookup tables - Properly document the libseccomp API return values and include them in the stable API promise - Improvements to the s390 and s390x multiplexed syscall handling - Multiple fixes and improvements to the libseccomp manpages - Moved from manually maintained syscall tables to an automatically generated syscall table in CSV format - Update the syscall tables to Linux v5.8.0-rc5 - Python bindings and build now default to Python 3.x - Improvements to the tests have boosted code coverage to over 93% - Enable Travis CI testing on the aarch64 and ppc64le architectures - Add code inspection via lgtm.com * Version 2.4.3 - March 4, 2020 - Add list of authorized release signatures to README.md - Fix multiplexing issue with s390/s390x shm* syscalls - Remove the static flag from libseccomp tools compilation - Add define for __SNR_ppoll - Update our Travis CI configuration to use Ubuntu 18.04 - Disable live python tests in Travis CI - Use default python, rather than nightly python, in TravisCI - Fix potential memory leak identified by clang in the scmp_bpf_sim tool * Version 2.4.2 - November 7, 2019 - Update the syscall table for Linux v5.4-rc4 - Stop defining __NR_x values for syscalls that don't exist. Libseccomp now uses __SNR_x internally - Update the Cython language level to "3str" - Add support for io-uring related system calls - Clarify the maintainer documentation and release process - Fix python module name issue introduced in the v2.4.0 release. The module is now named "seccomp" as it was previously - Deliver the SECURITY.md file in releases * Version 2.4.1 - April 17, 2019 - Fix a BPF generation bug where the optimizer mistakenly identified duplicate BPF code blocks * Version 2.4.0 - March 14, 2019 - Update the syscall table for Linux v5.0-rc5 - Added support for the SCMP_ACT_KILL_PROCESS action - Added support for the SCMP_ACT_LOG action and SCMP_FLTATR_CTL_LOG attribute - Added explicit 32-bit (SCMP_AX_32(...)) and 64-bit (SCMP_AX_64(...)) argument comparison macros to help protect against unexpected sign extension - Added support for the parisc and parisc64 architectures - Added the ability to query and set the libseccomp API level via seccomp_api_get(3) and seccomp_api_set(3) - Return -EDOM on an endian mismatch when adding an architecture to a filter - Renumber the pseudo syscall number for subpage_prot() so it no longer conflicts with spu_run() - Fix PFC generation when a syscall is prioritized, but no rule exists - Numerous fixes to the seccomp-bpf filter generation code - Switch our internal hashing function to jhash/Lookup3 to MurmurHash3 - Numerous tests added to the included test suite, coverage now at ~92% - Update our Travis CI configuration to use Ubuntu 16.04 - Numerous documentation fixes and updates * Version 2.3.3 - January 10, 2018 - Updated the syscall table for Linux v4.15-rc7 * Version 2.3.2 - February 27, 2017 - Achieved full compliance with the CII Best Practices program - Added Travis CI builds to the GitHub repository - Added code coverage reporting with the "--enable-code-coverage" configure flag and added Coveralls to the GitHub repository - Updated the syscall tables to match Linux v4.10-rc6+ - Support for building with Python v3.x - Allow rules with the -1 syscall if the SCMP_FLTATR_API_TSKIP attribute is set to true - Several small documentation fixes * Version 2.3.1 - April 20, 2016 - Fixed a problem with 32-bit x86 socket syscalls on some systems - Fixed problems with ipc syscalls on 32-bit x86 - Fixed problems with socket and ipc syscalls on s390 and s390x * Version 2.3.0 - February 29, 2016 - Added support for the s390 and s390x architectures - Added support for the ppc, ppc64, and ppc64le architectures - Update the internal syscall tables to match the Linux 4.5-rcX releases - Filter generation for both multiplexed and direct socket syscalls on x86 - Support for the musl libc implementation - Additions to the API to enable runtime version checking of the library - Enable the use of seccomp() instead of prctl() on supported systems - Added additional tests to the regression test suite * Version 2.2.3 - July 8, 2015 - Fix a problem with 'make check' on 32-bit ARM systems * Version 2.2.2 - July 6, 2015 - Fix a problem with the masked equality operator - Fix a problem on x86_64/x32 involving invalid architectures - Fix a problem with the ARM specific syscalls - Fix a build problem when the source and build directories differ * Version 2.2.1 - May 13, 2015 - Fix a problem with syscall argument filtering on 64-bit systems - Fix some problems with the 32-bit ARM syscall table - Fix build problems on very old systems - Update the README file with the GitHub and Google Groups information * Version 2.2.0 - February 12, 2015 - Migrated the build system to autotools - Added support for the aarch64 architecture - Added support for the mips, mips64, and mips64n32 architectures for both big and little endian systems - Added support for using the new seccomp() syscall and the thread sync functionality - Added Python bindings - Updated the internal syscall tables to Linux v3.19 - Added documentation to help contributors wishing to submit patches - Migrated to GitHub for git hosting and Google Groups for the mailing list - Numerous minor bug fixes * Version 2.1.1 - October 31, 2013 - Build system improvements - Automated test improvements, including a "check" target for use by packagers to verify the build - Numerous bug fixes related to the filter's internal rule database which affect those creating rules with syscall arguments - Introduced tools to verify the style/formatting of the code, including a "check-syntax" target for use by developers - Non-public symbols are now hidden in the library * Version 2.1.0 - June 11, 2013 - Add support for the x32 and ARM architectures - Improvements to the regression tests, including support for live tests - More verbose PFC output, including translation of syscall numbers to names - Several assorted bugfixes affecting the seccomp BPF generation - The syscall number/name resolver tool is now available to install * Version 2.0.0 - January 28, 2013 - Fixes for the x86 multiplexed syscalls - Additions to the API to better support non-native architectures - Additions to the API to support multiple architectures in one filter - Additions to the API to resolve syscall name/number mappings - Assorted minor bug fixes - Improved build messages regardless of build verbosity - More automated tests added as well as a number of improvements to the test harness * Version 1.0.1 - November 12, 2012 - The header file is now easier to use with C++ compilers - Minor documentation fixes - Minor memory leak fixes - Corrected x86 filter generation on x86_64 systems - Corrected problems with small filters and filters with arguments * Version 1.0.0 - July 31, 2012 - Change the API to be context-aware; eliminates all internal state but breaks compatibility with the previous 0.1.0 release - Added support for multiple build jobs ("make -j8") and verbose builds using the "V=1" build variable ("make V=1") - Minor tweaks to the regression test script output * Version 0.1.0 - June 8, 2012 - Initial release libseccomp-2.5.4/doc/0000755000000000000000000000000014467535324013122 5ustar rootrootlibseccomp-2.5.4/doc/credits_updater0000755000000000000000000000200614467535324016227 0ustar rootroot#!/bin/bash # # libseccomp credit updater script # # Copyright (c) 2017 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # # header echo "libseccomp: Contributors" echo "========================================================================" echo "https://github.com/seccomp/libseccomp" echo "" # body git log --pretty=format:"%aN <%aE>" | \ grep -v '' | \ sort -u exit 0 libseccomp-2.5.4/doc/Makefile.am0000644000000000000000000000354714467535324015167 0ustar rootroot#### # Seccomp Library Documentation # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License # as published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # dist_man1_MANS = \ man/man1/scmp_sys_resolver.1 dist_man3_MANS = \ man/man3/seccomp_arch_add.3 \ man/man3/seccomp_arch_exist.3 \ man/man3/seccomp_arch_native.3 \ man/man3/seccomp_arch_remove.3 \ man/man3/seccomp_arch_resolve_name.3 \ man/man3/seccomp_attr_get.3 \ man/man3/seccomp_attr_set.3 \ man/man3/seccomp_export_bpf.3 \ man/man3/seccomp_export_bpf_mem.3 \ man/man3/seccomp_export_pfc.3 \ man/man3/seccomp_init.3 \ man/man3/seccomp_load.3 \ man/man3/seccomp_merge.3 \ man/man3/seccomp_precompute.3 \ man/man3/seccomp_release.3 \ man/man3/seccomp_reset.3 \ man/man3/seccomp_rule_add.3 \ man/man3/seccomp_rule_add_array.3 \ man/man3/seccomp_rule_add_exact.3 \ man/man3/seccomp_rule_add_exact_array.3 \ man/man3/seccomp_notify_alloc.3 \ man/man3/seccomp_notify_fd.3 \ man/man3/seccomp_notify_free.3 \ man/man3/seccomp_notify_id_valid.3 \ man/man3/seccomp_notify_receive.3 \ man/man3/seccomp_notify_respond.3 \ man/man3/seccomp_syscall_priority.3 \ man/man3/seccomp_syscall_resolve_name.3 \ man/man3/seccomp_syscall_resolve_name_arch.3 \ man/man3/seccomp_syscall_resolve_name_rewrite.3 \ man/man3/seccomp_syscall_resolve_num_arch.3 \ man/man3/seccomp_version.3 \ man/man3/seccomp_api_get.3 \ man/man3/seccomp_api_set.3 libseccomp-2.5.4/doc/admin/0000755000000000000000000000000014467535324014212 5ustar rootrootlibseccomp-2.5.4/doc/admin/MAINTAINER_PROCESS.md0000644000000000000000000001103214467535324017356 0ustar rootrootThe libseccomp Maintainer Process =============================================================================== https://github.com/seccomp/libseccomp This document attempts to describe the processes that should be followed by the various libseccomp maintainers. It is not intended as a hard requirement, but rather as a guiding document intended to make it easier for multiple co-maintainers to manage the libseccomp project. We recognize this document, like all other parts of the libseccomp project, is not perfect. If changes need to be made, they should be made following the guidelines described here. ### Reviewing and Merging Patches In a perfect world each patch would be independently reviewed and ACK'd by each maintainer, but we recognize that is not likely to be practical for each patch. Under normal circumstances, each patch should be ACK'd by a simple majority of maintainers (in the case of an even number of maintainers, N/2+1) before being merged into the repository. Maintainers should ACK patches using a format similar to the Linux Kernel, for example: ``` Acked-by: John Smith ``` The maintainer which merged the patch into the repository should add their sign-off after ensuring that it is correct to do so (see the documentation on submitting patches); if it is not correct for the maintainer to add their sign-off, it is likely the patch should not be merged. The maintainer should add their sign-off using the standard format at the end of the patch's metadata, for example: ``` Signed-off-by: Jane Smith ``` The maintainers are encouraged to communicate with each other for many reasons, one of which is to let the others when one is going to be unreachable for an extended period of time. If a patch is being held due to a lack of ACKs and the other maintainers are not responding after a reasonable period of time (for example, a delay of over two weeks), as long as there are no outstanding NACKs the patch can be merged without a simple majority. ### Managing Sensitive Vulnerability Reports The libseccomp vulnerability reporting process is documented in the SECURITY.md document. The maintainers should work together with the reporter to assess the validity and seriousness of the reported vulnerability. ### Managing the GitHub Issue Tracker We use the GitHub issue tracker to track bugs, feature requests, and sometimes unanswered questions. The conventions here are intended to help distinguish between the different uses, and prioritize within those categories. Feature requests MUST have a "RFE:" prefix added to the issue name and use the "enhancement" label. Bug reports MUST a "BUG:" prefix added to the issue name and use the "bug" label. Issues SHOULD be prioritized using the "priority/high", "priority/medium", and "priority/low" labels. The meaning should hopefully be obvious. Issues CAN be additionally labeled with the "pending/info", "pending/review", and "pending/revision" labels to indicate that additional information is needed, the issue/patch is pending review, and/or the patch requires changes. ### Managing the GitHub Release Milestones There should be at least two GitHub milestones at any point in time: one for the next major/minor release (for example, v2.5), and one for the next patch release (for example, v2.4.2). As issues are entered into the system, they can be added to the milestones at the discretion of the maintainers. ### Handling Inappropriate Community Behavior The libseccomp project community is relatively small, and almost always respectful and considerate. However, there have been some limited cases of inappropriate behavior and it is the responsibility of the maintainers to deal with it accordingly. As mentioned above, the maintainers are encouraged to communicate with each other, and this communication is very important in this case. When inappropriate behavior is identified in the project (e.g. mailing list, GitHub, etc.) the maintainers should talk with each other as well as the responsible individual to try and correct the behavior. If the individual continues to act inappropriately the maintainers can block the individual from the project using whatever means are available. This should only be done as a last resort, and with the agreement of all the maintainers. In cases where a quick response is necessary, a maintainer can unilaterally block an individual, but the block should be reviewed by all the other maintainers soon afterwards. ### New Project Releases The libseccomp release process is documented in the RELEASE_PROCESS.md document. libseccomp-2.5.4/doc/admin/RELEASE_PROCESS.md0000644000000000000000000000565214467535324017022 0ustar rootrootThe libseccomp Release Process =============================================================================== https://github.com/seccomp/libseccomp This is the process that should be followed when creating a new libseccomp release. #### 1. Verify that all issues assigned to the release milestone have been resolved * https://github.com/seccomp/libseccomp/milestones #### 2. Verify that the syntax/style meets the guidelines # make check-syntax #### 3. Verify that the bundled test suite runs without error # ./autogen.sh # ./configure --enable-python # make check # (cd tests; ./regression -T live) #### 4. Verify that the packaging is correct # make distcheck #### 5. Verify that there are no outstanding defects from Coverity # make coverity-tarball ... or ... # git push -f coverity-scan #### 6. Perform any distribution test builds * Fedora Rawhide * Red Hat Enterprise Linux * etc. #### 7. If any problems were found up to this point that resulted in code changes, restart the process #### 8. Update the CREDITS file with any new contributors # ./doc/credits_updater > CREDITS ... the results can be sanity checked with the following git command: # git log --pretty=format:"%aN <%aE>" | sort -u #### 9. Update the CHANGELOG file with significant changes since the last release #### 10. If this is a new major/minor release, create new 'release-X.Y' branch # stg branch -c "release-X.Y" ... or ... # git branch "release-X.Y" #### 11. Update the version number in configure.ac AC_INIT(...) macro #### 12. Tag the release in the local repository with a signed tag # git tag -s -m "version X.Y.Z" vX.Y.Z #### 13. Build final release tarball # make clean # ./autogen.sh # make dist-gzip #### 14. Verify the release tarball in a separate directory # ./configure --enable-python # make check # (cd tests; ./regression -T live) #### 15. Generate a checksum for the release tarball # sha256sum > libseccomp-X.Y.Z.tar.gz.SHA256SUM #### 16. GPG sign the release tarball and checksum using the maintainer's key # gpg --armor --detach-sign libseccomp-X.Y.Z.tar.gz # gpg --clearsign libseccomp-X.Y.Z.tar.gz.SHA256SUM #### 17. Push the release tag to the main GitHub repository # git push vX.Y.Z #### 18. Create a new GitHub release using the associated tag; added the relevant section from the CHANGELOG file, and upload the following files * libseccomp-X.Y.Z.tar.gz * libseccomp-X.Y.Z.tar.gz.asc * libseccomp-X.Y.Z.tar.gz.SHA256SUM * libseccomp-X.Y.Z.tar.gz.SHA256SUM.asc #### 19. Update the GitHub release notes for older releases which are now unsupported The following Markdown text is suggested at the top of the release note, see old GitHub releases for examples. ``` ***This release is no longer supported upstream, please use a more recent release*** ``` libseccomp-2.5.4/doc/man/0000755000000000000000000000000014467535324013675 5ustar rootrootlibseccomp-2.5.4/doc/man/man3/0000755000000000000000000000000014467535324014533 5ustar rootrootlibseccomp-2.5.4/doc/man/man3/seccomp_rule_add_array.30000644000000000000000000000003414467535324021302 0ustar rootroot.so man3/seccomp_rule_add.3 libseccomp-2.5.4/doc/man/man3/seccomp_init.30000644000000000000000000001315014467535324017273 0ustar rootroot.TH "seccomp_init" 3 "30 May 2020" "paul@paul-moore.com" "libseccomp Documentation" .\" ////////////////////////////////////////////////////////////////////////// .SH NAME .\" ////////////////////////////////////////////////////////////////////////// seccomp_init, seccomp_reset \- Initialize the seccomp filter state .\" ////////////////////////////////////////////////////////////////////////// .SH SYNOPSIS .\" ////////////////////////////////////////////////////////////////////////// .nf .B #include .sp .B typedef void * scmp_filter_ctx; .sp .BI "scmp_filter_ctx seccomp_init(uint32_t " def_action ");" .BI "int seccomp_reset(scmp_filter_ctx " ctx ", uint32_t " def_action ");" .sp Link with \fI\-lseccomp\fP. .fi .\" ////////////////////////////////////////////////////////////////////////// .SH DESCRIPTION .\" ////////////////////////////////////////////////////////////////////////// .P The .BR seccomp_init () and .BR seccomp_reset () functions (re)initialize the internal seccomp filter state, prepares it for use, and sets the default action based on the .I def_action parameter. The .BR seccomp_init () function must be called before any other libseccomp functions as the rest of the library API will fail if the filter context is not initialized properly. The .BR seccomp_reset () function releases the existing filter context state before reinitializing it and can only be called after a call to .BR seccomp_init () has succeeded. If .BR seccomp_reset () is called with a NULL filter, it resets the library's global task state, including any notification file descriptors retrieved by .BR seccomp_notify_fd (3). Normally this is not needed, but it may be required to continue using the library after a .BR fork () or .BR clone () call to ensure the API level and user notification state is properly reset. .P When the caller is finished configuring the seccomp filter and has loaded it into the kernel, the caller should call .BR seccomp_release (3) to release all of the filter context state. .P Valid .I def_action values are as follows: .TP .B SCMP_ACT_KILL The thread will be terminated by the kernel with SIGSYS when it calls a syscall that does not match any of the configured seccomp filter rules. The thread will not be able to catch the signal. .TP .B SCMP_ACT_KILL_PROCESS The entire process will be terminated by the kernel with SIGSYS when it calls a syscall that does not match any of the configured seccomp filter rules. .TP .B SCMP_ACT_TRAP The thread will be sent a SIGSYS signal when it calls a syscall that does not match any of the configured seccomp filter rules. It may catch this and change its behavior accordingly. When using SA_SIGINFO with .BR sigaction (2), si_code will be set to SYS_SECCOMP, si_syscall will be set to the syscall that failed the rules, and si_arch will be set to the AUDIT_ARCH for the active ABI. .TP .B SCMP_ACT_ERRNO(uint16_t errno) The thread will receive a return value of .I errno when it calls a syscall that does not match any of the configured seccomp filter rules. .TP .B SCMP_ACT_TRACE(uint16_t msg_num) If the thread is being traced and the tracing process specified the .B PTRACE_O_TRACESECCOMP option in the call to .BR ptrace (2), the tracing process will be notified, via .BR PTRACE_EVENT_SECCOMP , and the value provided in .I msg_num can be retrieved using the .B PTRACE_GETEVENTMSG option. .TP .B SCMP_ACT_LOG The seccomp filter will have no effect on the thread calling the syscall if it does not match any of the configured seccomp filter rules but the syscall will be logged. .TP .B SCMP_ACT_ALLOW The seccomp filter will have no effect on the thread calling the syscall if it does not match any of the configured seccomp filter rules. .\" ////////////////////////////////////////////////////////////////////////// .SH RETURN VALUE .\" ////////////////////////////////////////////////////////////////////////// The .BR seccomp_init () function returns a filter context on success, NULL on failure. The .BR seccomp_reset () function returns zero on success or one of the following error codes on failure: .TP .B -EINVAL Invalid input, either the context or action is invalid. .TP .B -ENOMEM The library was unable to allocate enough memory. .\" ////////////////////////////////////////////////////////////////////////// .SH EXAMPLES .\" ////////////////////////////////////////////////////////////////////////// .nf #include int main(int argc, char *argv[]) { int rc = \-1; scmp_filter_ctx ctx; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) goto out; /* ... */ rc = seccomp_reset(ctx, SCMP_ACT_KILL); if (rc < 0) goto out; /* ... */ out: seccomp_release(ctx); return \-rc; } .fi .\" ////////////////////////////////////////////////////////////////////////// .SH NOTES .\" ////////////////////////////////////////////////////////////////////////// .P While the seccomp filter can be generated independent of the kernel, kernel support is required to load and enforce the seccomp filter generated by libseccomp. .P The libseccomp project site, with more information and the source code repository, can be found at https://github.com/seccomp/libseccomp. This tool, as well as the libseccomp library, is currently under development, please report any bugs at the project site or directly to the author. .\" ////////////////////////////////////////////////////////////////////////// .SH AUTHOR .\" ////////////////////////////////////////////////////////////////////////// Paul Moore .\" ////////////////////////////////////////////////////////////////////////// .SH SEE ALSO .\" ////////////////////////////////////////////////////////////////////////// .BR seccomp_release (3) libseccomp-2.5.4/doc/man/man3/seccomp_rule_add_exact.30000644000000000000000000000003414467535324021270 0ustar rootroot.so man3/seccomp_rule_add.3 libseccomp-2.5.4/doc/man/man3/seccomp_release.30000644000000000000000000000517514467535324017760 0ustar rootroot.TH "seccomp_release" 3 "25 July 2012" "paul@paul-moore.com" "libseccomp Documentation" .\" ////////////////////////////////////////////////////////////////////////// .SH NAME .\" ////////////////////////////////////////////////////////////////////////// seccomp_release \- Release the seccomp filter state .\" ////////////////////////////////////////////////////////////////////////// .SH SYNOPSIS .\" ////////////////////////////////////////////////////////////////////////// .nf .B #include .sp .B typedef void * scmp_filter_ctx; .sp .BI "void seccomp_release(scmp_filter_ctx " ctx ");" .sp Link with \fI\-lseccomp\fP. .fi .\" ////////////////////////////////////////////////////////////////////////// .SH DESCRIPTION .\" ////////////////////////////////////////////////////////////////////////// .P Releases the seccomp filter in .I ctx which was first initialized by .BR seccomp_init (3) or .BR seccomp_reset (3) and frees any memory associated with the given seccomp filter context. Any seccomp filters loaded into the kernel are not affected. .\" ////////////////////////////////////////////////////////////////////////// .SH RETURN VALUE .\" ////////////////////////////////////////////////////////////////////////// Does not return a value. .\" ////////////////////////////////////////////////////////////////////////// .SH EXAMPLES .\" ////////////////////////////////////////////////////////////////////////// .nf #include int main(int argc, char *argv[]) { int rc; scmp_filter_ctx ctx; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) return 1; /* ... */ seccomp_release(ctx); return 0; } .fi .\" ////////////////////////////////////////////////////////////////////////// .SH NOTES .\" ////////////////////////////////////////////////////////////////////////// .P While the seccomp filter can be generated independent of the kernel, kernel support is required to load and enforce the seccomp filter generated by libseccomp. .P The libseccomp project site, with more information and the source code repository, can be found at https://github.com/seccomp/libseccomp. This tool, as well as the libseccomp library, is currently under development, please report any bugs at the project site or directly to the author. .\" ////////////////////////////////////////////////////////////////////////// .SH AUTHOR .\" ////////////////////////////////////////////////////////////////////////// Paul Moore .\" ////////////////////////////////////////////////////////////////////////// .SH SEE ALSO .\" ////////////////////////////////////////////////////////////////////////// .BR seccomp_init (3), .BR seccomp_reset (3) libseccomp-2.5.4/doc/man/man3/seccomp_arch_add.30000644000000000000000000001256314467535324020064 0ustar rootroot.TH "seccomp_arch_add" 3 "15 June 2020" "paul@paul-moore.com" "libseccomp Documentation" .\" ////////////////////////////////////////////////////////////////////////// .SH NAME .\" ////////////////////////////////////////////////////////////////////////// seccomp_arch_add, seccomp_arch_remove, seccomp_arch_exist, seccomp_arch_native \- Manage seccomp filter architectures .\" ////////////////////////////////////////////////////////////////////////// .SH SYNOPSIS .\" ////////////////////////////////////////////////////////////////////////// .nf .B #include .sp .B typedef void * scmp_filter_ctx; .sp .B #define SCMP_ARCH_NATIVE .B #define SCMP_ARCH_X86 .B #define SCMP_ARCH_X86_64 .B #define SCMP_ARCH_X32 .B #define SCMP_ARCH_ARM .B #define SCMP_ARCH_AARCH64 .B #define SCMP_ARCH_LOONGARCH64 .B #define SCMP_ARCH_MIPS .B #define SCMP_ARCH_MIPS64 .B #define SCMP_ARCH_MIPS64N32 .B #define SCMP_ARCH_MIPSEL .B #define SCMP_ARCH_MIPSEL64 .B #define SCMP_ARCH_MIPSEL64N32 .B #define SCMP_ARCH_PPC .B #define SCMP_ARCH_PPC64 .B #define SCMP_ARCH_PPC64LE .B #define SCMP_ARCH_S390 .B #define SCMP_ARCH_S390X .B #define SCMP_ARCH_PARISC .B #define SCMP_ARCH_PARISC64 .B #define SCMP_ARCH_RISCV64 .sp .BI "uint32_t seccomp_arch_resolve_name(const char *" arch_name ");" .BI "uint32_t seccomp_arch_native();" .BI "int seccomp_arch_exist(const scmp_filter_ctx " ctx ", uint32_t " arch_token ");" .BI "int seccomp_arch_add(scmp_filter_ctx " ctx ", uint32_t " arch_token ");" .BI "int seccomp_arch_remove(scmp_filter_ctx " ctx ", uint32_t " arch_token ");" .sp Link with \fI\-lseccomp\fP. .fi .\" ////////////////////////////////////////////////////////////////////////// .SH DESCRIPTION .\" ////////////////////////////////////////////////////////////////////////// .P The .BR seccomp_arch_exist () function tests to see if a given architecture has been added to the seccomp filter in .IR ctx , where the .BR seccomp_arch_add () and .BR seccomp_arch_remove () add and remove, respectively, architectures from the seccomp filter. In all three functions, the architecture values given in .I arch_token should be the .BR SCMP_ARCH_* defined constants; with the .BR SCMP_ARCH_NATIVE constant always referring to the native compiled architecture. The .BR seccomp_arch_native () function returns the system's architecture such that it will match one of the .BR SCMP_ARCH_* constants. While the .BR seccomp_arch_resolve_name () function also returns a .BR SCMP_ARCH_* constant, the returned token matches the name of the architecture passed as an argument to the function. .P When a seccomp filter is initialized with the call to .BR seccomp_init (3) the native architecture is automatically added to the filter. .P While it is possible to remove all architectures from a filter, most of the libseccomp APIs will fail if the filter does not contain at least one architecture. .P When adding a new architecture to an existing filter, the existing rules will not be added to the new architecture. However, rules added after adding the new architecture will be added to all of the architectures in the filter. .\" ////////////////////////////////////////////////////////////////////////// .SH RETURN VALUE .\" ////////////////////////////////////////////////////////////////////////// The .BR seccomp_arch_add (), .BR seccomp_arch_remove (), and .BR seccomp_arch_exist () functions return zero on success or one of the following error codes on failure: .TP .B -EDOM Architecture specific failure. .TP .B -EEXIST In the case of .BR seccomp_arch_add () the architecture already exists and in the case of .BR seccomp_arch_remove () the architecture does not exist. .TP .B -EINVAL Invalid input, either the context or architecture token is invalid. .TP .B -ENOMEM The library was unable to allocate enough memory. .\" ////////////////////////////////////////////////////////////////////////// .SH EXAMPLES .\" ////////////////////////////////////////////////////////////////////////// .nf #include int main(int argc, char *argv[]) { int rc = \-1; scmp_filter_ctx ctx; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) goto out; if (seccomp_arch_exist(ctx, SCMP_ARCH_X86) == \-EEXIST) { rc = seccomp_arch_add(ctx, SCMP_ARCH_X86); if (rc != 0) goto out_all; rc = seccomp_arch_remove(ctx, SCMP_ARCH_NATIVE); if (rc != 0) goto out_all; } /* ... */ out: seccomp_release(ctx); return \-rc; } .fi .\" ////////////////////////////////////////////////////////////////////////// .SH NOTES .\" ////////////////////////////////////////////////////////////////////////// .P While the seccomp filter can be generated independent of the kernel, kernel support is required to load and enforce the seccomp filter generated by libseccomp. .P The libseccomp project site, with more information and the source code repository, can be found at https://github.com/seccomp/libseccomp. This tool, as well as the libseccomp library, is currently under development, please report any bugs at the project site or directly to the author. .\" ////////////////////////////////////////////////////////////////////////// .SH AUTHOR .\" ////////////////////////////////////////////////////////////////////////// Paul Moore .\" ////////////////////////////////////////////////////////////////////////// .SH SEE ALSO .\" ////////////////////////////////////////////////////////////////////////// .BR seccomp_init (3), .BR seccomp_reset (3), .BR seccomp_merge (3) libseccomp-2.5.4/doc/man/man3/seccomp_syscall_resolve_name.30000644000000000000000000001132714467535324022545 0ustar rootroot.TH "seccomp_syscall_resolve_name" 3 "8 May 2014" "paul@paul-moore.com" "libseccomp Documentation" .\" ////////////////////////////////////////////////////////////////////////// .SH NAME .\" ////////////////////////////////////////////////////////////////////////// seccomp_syscall_resolve_name \- Resolve a syscall name .\" ////////////////////////////////////////////////////////////////////////// .SH SYNOPSIS .\" ////////////////////////////////////////////////////////////////////////// .nf .B #include .sp .BI "int seccomp_syscall_resolve_name(const char *" name ");" .BI "int seccomp_syscall_resolve_name_arch(uint32_t " arch_token "," .BI " const char *" name ");" .BI "int seccomp_syscall_resolve_name_rewrite(uint32_t " arch_token "," .BI " const char *" name ");" .BI "char *seccomp_syscall_resolve_num_arch(uint32_t " arch_token ", int " num ");" .sp Link with \fI\-lseccomp\fP. .fi .\" ////////////////////////////////////////////////////////////////////////// .SH DESCRIPTION .\" ////////////////////////////////////////////////////////////////////////// .P The .BR seccomp_syscall_resolve_name() , .BR seccomp_syscall_resolve_name_arch() , and .BR seccomp_syscall_resolve_name_rewrite() functions resolve the commonly used syscall name to the syscall number used by the kernel and the rest of the libseccomp API, with .BR seccomp_syscall_resolve_name_rewrite() rewriting the syscall number for architectures that modify the syscall. Syscall rewriting typically happens in case of a multiplexed syscall, like .BR socketcall (2) or .BR ipc (2) on x86. .BR seccomp_syscall_resolve_num_arch() function resolves the syscall number used by the kernel to the commonly used syscall name. .P The caller is responsible for freeing the returned string from .BR seccomp_syscall_resolve_num_arch() . .\" ////////////////////////////////////////////////////////////////////////// .SH RETURN VALUE .\" ////////////////////////////////////////////////////////////////////////// .P In the case of .BR seccomp_syscall_resolve_name() , .BR seccomp_syscall_resolve_name_arch() , and .BR seccomp_syscall_resolve_name_rewrite() the associated syscall number is returned, with the negative pseudo syscall number being returned in cases where the given syscall does not exist for the architecture. The value .BR __NR_SCMP_ERROR is returned in case of error. In all cases, the return value is suitable for use in any libseccomp API function which requires the syscall number, examples include .BR seccomp_rule_add () and .BR seccomp_rule_add_exact (). .P In the case of .BR seccomp_syscall_resolve_num_arch() the associated syscall name is returned and it remains the callers responsibility to free the returned string via .BR free (3). .\" ////////////////////////////////////////////////////////////////////////// .SH EXAMPLES .\" ////////////////////////////////////////////////////////////////////////// .nf #include int main(int argc, char *argv[]) { int rc = \-1; scmp_filter_ctx ctx; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) goto out; /* ... */ rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, seccomp_syscall_resolve_name("open"), 0); if (rc < 0) goto out; /* ... */ rc = seccomp_load(ctx); if (rc < 0) goto out; /* ... */ out: seccomp_release(ctx); return \-rc; } .fi .\" ////////////////////////////////////////////////////////////////////////// .SH NOTES .\" ////////////////////////////////////////////////////////////////////////// .P In case of bare syscalls implemented on top of a multiplexed syscall, .BR seccomp_syscall_resolve_name() and .BR seccomp_syscall_resolve_name_arch() can be used to verify if a bare syscall is implemented for a specific architecture, while .BR seccomp_syscall_resolve_name_rewrite() can be used to determine the underlying multiplexed syscall. .P While the seccomp filter can be generated independent of the kernel, kernel support is required to load and enforce the seccomp filter generated by libseccomp. .P The libseccomp project site, with more information and the source code repository, can be found at https://github.com/seccomp/libseccomp. This tool, as well as the libseccomp library, is currently under development, please report any bugs at the project site or directly to the author. .\" ////////////////////////////////////////////////////////////////////////// .SH AUTHOR .\" ////////////////////////////////////////////////////////////////////////// Paul Moore .\" ////////////////////////////////////////////////////////////////////////// .SH SEE ALSO .\" ////////////////////////////////////////////////////////////////////////// .BR seccomp_rule_add (3), .BR seccomp_rule_add_exact (3) libseccomp-2.5.4/doc/man/man3/seccomp_attr_get.30000644000000000000000000000003414467535324020136 0ustar rootroot.so man3/seccomp_attr_set.3 libseccomp-2.5.4/doc/man/man3/seccomp_precompute.30000644000000000000000000000670014467535324020516 0ustar rootroot.TH "seccomp_precompute" 3 "19 September 2022" "paul@paul-moore.com" "libseccomp Documentation" .\" ////////////////////////////////////////////////////////////////////////// .SH NAME .\" ////////////////////////////////////////////////////////////////////////// seccomp_precompute \- Precompute the current seccomp filter .\" ////////////////////////////////////////////////////////////////////////// .SH SYNOPSIS .\" ////////////////////////////////////////////////////////////////////////// .nf .B #include .sp .B typedef void * scmp_filter_ctx; .sp .BI "int seccomp_precompute(scmp_filter_ctx " ctx ");" .sp Link with \fI\-lseccomp\fP. .fi .\" ////////////////////////////////////////////////////////////////////////// .SH DESCRIPTION .\" ////////////////////////////////////////////////////////////////////////// .P Precomputes the seccomp filter for later use by .BR seccomp_load () and similar functions. Not only does this improve performance of .BR seccomp_load () it also ensures that the seccomp filter can be loaded in an async-signal-safe manner if no changes have been made to the filter since it was precomputed. .\" ////////////////////////////////////////////////////////////////////////// .SH RETURN VALUE .\" ////////////////////////////////////////////////////////////////////////// Returns zero on success or one of the following error codes on failure: .TP .B -ECANCELED There was a system failure beyond the control of the library. .TP .B -EFAULT Internal libseccomp failure. .TP .B -EINVAL Invalid input, either the context or architecture token is invalid. .TP .B -ENOMEM The library was unable to allocate enough memory. .P If the \fISCMP_FLTATR_API_SYSRAWRC\fP filter attribute is non-zero then additional error codes may be returned to the caller; these additional error codes are the negative \fIerrno\fP values returned by the system. Unfortunately libseccomp can make no guarantees about these return values. .\" ////////////////////////////////////////////////////////////////////////// .SH EXAMPLES .\" ////////////////////////////////////////////////////////////////////////// .nf #include int main(int argc, char *argv[]) { int rc = \-1; scmp_filter_ctx ctx; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) goto out; /* ... */ rc = seccomp_precompute(ctx); if (rc < 0) goto out; /* ... */ rc = seccomp_load(ctx); if (rc < 0) goto out; /* ... */ out: seccomp_release(ctx); return \-rc; } .fi .\" ////////////////////////////////////////////////////////////////////////// .SH NOTES .\" ////////////////////////////////////////////////////////////////////////// .P While the seccomp filter can be generated independent of the kernel, kernel support is required to load and enforce the seccomp filter generated by libseccomp. .P The libseccomp project site, with more information and the source code repository, can be found at https://github.com/seccomp/libseccomp. This tool, as well as the libseccomp library, is currently under development, please report any bugs at the project site or directly to the author. .\" ////////////////////////////////////////////////////////////////////////// .SH AUTHOR .\" ////////////////////////////////////////////////////////////////////////// Paul Moore .\" ////////////////////////////////////////////////////////////////////////// .SH SEE ALSO .\" ////////////////////////////////////////////////////////////////////////// .BR seccomp_load (3) .BR signal-safety (7) libseccomp-2.5.4/doc/man/man3/seccomp_notify_receive.30000644000000000000000000000004014467535324021334 0ustar rootroot.so man3/seccomp_notify_alloc.3 libseccomp-2.5.4/doc/man/man3/seccomp_notify_id_valid.30000644000000000000000000000004014467535324021465 0ustar rootroot.so man3/seccomp_notify_alloc.3 libseccomp-2.5.4/doc/man/man3/seccomp_syscall_priority.30000644000000000000000000001004314467535324021741 0ustar rootroot.TH "seccomp_syscall_priority" 3 "30 May 2020" "paul@paul-moore.com" "libseccomp Documentation" .\" ////////////////////////////////////////////////////////////////////////// .SH NAME .\" ////////////////////////////////////////////////////////////////////////// seccomp_syscall_priority \- Prioritize syscalls in the seccomp filter .\" ////////////////////////////////////////////////////////////////////////// .SH SYNOPSIS .\" ////////////////////////////////////////////////////////////////////////// .nf .B #include .sp .B typedef void * scmp_filter_ctx; .sp .BI "int SCMP_SYS(" syscall_name ");" .sp .BI "int seccomp_syscall_priority(scmp_filter_ctx " ctx "," .BI " int " syscall ", uint8_t " priority ");" .sp Link with \fI\-lseccomp\fP. .fi .\" ////////////////////////////////////////////////////////////////////////// .SH DESCRIPTION .\" ////////////////////////////////////////////////////////////////////////// .P The .BR seccomp_syscall_priority () function provides a priority hint to the seccomp filter generator in libseccomp such that higher priority syscalls are placed earlier in the seccomp filter code so that they incur less overhead at the expense of lower priority syscalls. A syscall's priority can be set regardless of if any rules currently exist for that syscall; the library will remember the priority and it will be assigned to the syscall if and when a rule for that syscall is created. .P While it is possible to specify the .I syscall value directly using the standard .B __NR_syscall values, in order to ensure proper operation across multiple architectures it is highly recommended to use the .BR SCMP_SYS () macro instead. See the EXAMPLES section below. .P The .I priority parameter takes an 8-bit value ranging from 0 \- 255; a higher value represents a higher priority. .P The filter context .I ctx is the value returned by the call to .BR seccomp_init (). .\" ////////////////////////////////////////////////////////////////////////// .SH RETURN VALUE .\" ////////////////////////////////////////////////////////////////////////// The .BR SCMP_SYS () macro returns a value suitable for use as the .I syscall value in .BR seccomp_syscall_priority (). .P The .BR seccomp_syscall_priority () function returns zero on success or one of the following error codes on failure: .TP .B -EDOM Architecture specific failure. .TP .B -EFAULT Internal libseccomp failure. .TP .B -EINVAL Invalid input, either the context or architecture token is invalid. .TP .B -ENOMEM The library was unable to allocate enough memory. .\" ////////////////////////////////////////////////////////////////////////// .SH EXAMPLES .\" ////////////////////////////////////////////////////////////////////////// .nf #include int main(int argc, char *argv[]) { int rc = \-1; scmp_filter_ctx ctx; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) goto out; /* ... */ rc = seccomp_syscall_priority(ctx, SCMP_SYS(read), 200); if (rc < 0) goto out; /* ... */ out: seccomp_release(ctx); return \-rc; } .fi .\" ////////////////////////////////////////////////////////////////////////// .SH NOTES .\" ////////////////////////////////////////////////////////////////////////// .P While the seccomp filter can be generated independent of the kernel, kernel support is required to load and enforce the seccomp filter generated by libseccomp. .P The libseccomp project site, with more information and the source code repository, can be found at https://github.com/seccomp/libseccomp. This tool, as well as the libseccomp library, is currently under development, please report any bugs at the project site or directly to the author. .\" ////////////////////////////////////////////////////////////////////////// .SH AUTHOR .\" ////////////////////////////////////////////////////////////////////////// Paul Moore .\" ////////////////////////////////////////////////////////////////////////// .SH SEE ALSO .\" ////////////////////////////////////////////////////////////////////////// .BR seccomp_rule_add (3), .BR seccomp_rule_add_exact (3) libseccomp-2.5.4/doc/man/man3/seccomp_load.30000644000000000000000000001001614467535324017245 0ustar rootroot.TH "seccomp_load" 3 "30 May 2020" "paul@paul-moore.com" "libseccomp Documentation" .\" ////////////////////////////////////////////////////////////////////////// .SH NAME .\" ////////////////////////////////////////////////////////////////////////// seccomp_load \- Load the current seccomp filter into the kernel .\" ////////////////////////////////////////////////////////////////////////// .SH SYNOPSIS .\" ////////////////////////////////////////////////////////////////////////// .nf .B #include .sp .B typedef void * scmp_filter_ctx; .sp .BI "int seccomp_load(scmp_filter_ctx " ctx ");" .sp Link with \fI\-lseccomp\fP. .fi .\" ////////////////////////////////////////////////////////////////////////// .SH DESCRIPTION .\" ////////////////////////////////////////////////////////////////////////// .P Loads the seccomp filter provided by .I ctx into the kernel; if the function succeeds the new seccomp filter will be active when the function returns. If .BR seccomp_precompute (3) was called prior to attempting to load the seccomp filter, and no changes have been made to the filter, .BR seccomp_load () can be considered to be async-signal-safe. .P As it is possible to have multiple stacked seccomp filters for a given task (defined as either a process or a thread), it is important to remember that each of the filters loaded for a given task are executed when a syscall is made and the "strictest" rule is the rule that is applied. In the case of seccomp, "strictest" is defined as the action with the lowest value (e.g. .I SCMP_ACT_KILL is "stricter" than .IR SCMP_ACT_ALLOW ). .\" ////////////////////////////////////////////////////////////////////////// .SH RETURN VALUE .\" ////////////////////////////////////////////////////////////////////////// Returns zero on success or one of the following error codes on failure: .TP .B -ECANCELED There was a system failure beyond the control of the library. .TP .B -EFAULT Internal libseccomp failure. .TP .B -EINVAL Invalid input, either the context or architecture token is invalid. .TP .B -ENOMEM The library was unable to allocate enough memory. .TP .B -ESRCH Unable to load the filter due to thread issues. .P If the \fISCMP_FLTATR_API_SYSRAWRC\fP filter attribute is non-zero then additional error codes may be returned to the caller; these additional error codes are the negative \fIerrno\fP values returned by the system. Unfortunately libseccomp can make no guarantees about these return values. .\" ////////////////////////////////////////////////////////////////////////// .SH EXAMPLES .\" ////////////////////////////////////////////////////////////////////////// .nf #include int main(int argc, char *argv[]) { int rc = \-1; scmp_filter_ctx ctx; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) goto out; /* ... */ rc = seccomp_load(ctx); if (rc < 0) goto out; /* ... */ out: seccomp_release(ctx); return \-rc; } .fi .\" ////////////////////////////////////////////////////////////////////////// .SH NOTES .\" ////////////////////////////////////////////////////////////////////////// .P While the seccomp filter can be generated independent of the kernel, kernel support is required to load and enforce the seccomp filter generated by libseccomp. .P The libseccomp project site, with more information and the source code repository, can be found at https://github.com/seccomp/libseccomp. This tool, as well as the libseccomp library, is currently under development, please report any bugs at the project site or directly to the author. .\" ////////////////////////////////////////////////////////////////////////// .SH AUTHOR .\" ////////////////////////////////////////////////////////////////////////// Paul Moore .\" ////////////////////////////////////////////////////////////////////////// .SH SEE ALSO .\" ////////////////////////////////////////////////////////////////////////// .BR seccomp_init (3), .BR seccomp_reset (3), .BR seccomp_release (3), .BR seccomp_rule_add (3), .BR seccomp_rule_add_exact (3) .BR seccomp_precompute (3) .BR signal-safety (7) libseccomp-2.5.4/doc/man/man3/seccomp_arch_resolve_name.30000644000000000000000000000003414467535324022001 0ustar rootroot.so man3/seccomp_arch_add.3 libseccomp-2.5.4/doc/man/man3/seccomp_export_bpf.30000644000000000000000000001147014467535324020503 0ustar rootroot.TH "seccomp_export_bpf" 3 "30 May 2020" "paul@paul-moore.com" "libseccomp Documentation" .\" ////////////////////////////////////////////////////////////////////////// .SH NAME .\" ////////////////////////////////////////////////////////////////////////// seccomp_export_bpf, seccomp_export_pfc \- Export the seccomp filter .\" ////////////////////////////////////////////////////////////////////////// .SH SYNOPSIS .\" ////////////////////////////////////////////////////////////////////////// .nf .B #include .sp .B typedef void * scmp_filter_ctx; .sp .BI "int seccomp_export_bpf(const scmp_filter_ctx " ctx ", int " fd ");" .BI "int seccomp_export_pfc(const scmp_filter_ctx " ctx ", int " fd ");" .BI "int seccomp_export_bpf_mem(const scmp_filter_ctx " ctx ", void *" buf ", size_t *" len ");" .sp Link with \fI\-lseccomp\fP. .fi .\" ////////////////////////////////////////////////////////////////////////// .SH DESCRIPTION .\" ////////////////////////////////////////////////////////////////////////// .P The .BR seccomp_export_bpf () and .BR seccomp_export_pfc () functions generate and output the current seccomp filter in either BPF (Berkeley Packet Filter) or PFC (Pseudo Filter Code). The output of .BR seccomp_export_bpf () is suitable for loading into the kernel, while the output of .BR seccomp_export_pfc () is human readable and is intended primarily as a debugging tool for developers using libseccomp. Both functions write the filter to the .I fd file descriptor. .P The filter context .I ctx is the value returned by the call to .BR seccomp_init (3). .P While the two output formats are guaranteed to be functionally equivalent for the given seccomp filter configuration, the filter instructions, and their ordering, are not guaranteed to be the same in both the BPF and PFC formats. .P The .BR seccomp_export_bpf_mem () function is largely the same as .BR seccomp_export_bpf (), but instead of writing to a file descriptor, the program will be written to the .I buf pointer provided by the caller. The .I len argument must be initialized with the size of the .I buf buffer. If the program was valid, .I len will be updated with its size in bytes. If .I buf was too small to hold the program, .I len can be consulted to determine the required size. Passing a NULL .I buf may also be used to query the required size ahead of time. .\" ////////////////////////////////////////////////////////////////////////// .SH RETURN VALUE .\" ////////////////////////////////////////////////////////////////////////// Return zero on success or one of the following error codes on failure: .TP .B -ECANCELED There was a system failure beyond the control of the library. .TP .B -EFAULT Internal libseccomp failure. .TP .B -EINVAL Invalid input, either the context or architecture token is invalid. .TP .B -ENOMEM The library was unable to allocate enough memory. .TP .B -ERANGE The provided buffer was too small. .P If the \fISCMP_FLTATR_API_SYSRAWRC\fP filter attribute is non-zero then additional error codes may be returned to the caller; these additional error codes are the negative \fIerrno\fP values returned by the system. Unfortunately libseccomp can make no guarantees about these return values. .\" ////////////////////////////////////////////////////////////////////////// .SH EXAMPLES .\" ////////////////////////////////////////////////////////////////////////// .nf #include int main(int argc, char *argv[]) { int rc = \-1; scmp_filter_ctx ctx; int filter_fd; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) goto out; /* ... */ filter_fd = open("/tmp/seccomp_filter.bpf", O_WRONLY); if (filter_fd == \-1) { rc = \-errno; goto out; } rc = seccomp_export_bpf(ctx, filter_fd); if (rc < 0) { close(filter_fd); goto out; } close(filter_fd); /* ... */ out: seccomp_release(ctx); return \-rc; } .fi .\" ////////////////////////////////////////////////////////////////////////// .SH NOTES .\" ////////////////////////////////////////////////////////////////////////// .P While the seccomp filter can be generated independent of the kernel, kernel support is required to load and enforce the seccomp filter generated by libseccomp. .P The libseccomp project site, with more information and the source code repository, can be found at https://github.com/seccomp/libseccomp. This tool, as well as the libseccomp library, is currently under development, please report any bugs at the project site or directly to the author. .\" ////////////////////////////////////////////////////////////////////////// .SH AUTHOR .\" ////////////////////////////////////////////////////////////////////////// Paul Moore .\" ////////////////////////////////////////////////////////////////////////// .SH SEE ALSO .\" ////////////////////////////////////////////////////////////////////////// .BR seccomp_init (3), .BR seccomp_release (3) libseccomp-2.5.4/doc/man/man3/seccomp_syscall_resolve_name_arch.30000644000000000000000000000005014467535324023531 0ustar rootroot.so man3/seccomp_syscall_resolve_name.3 libseccomp-2.5.4/doc/man/man3/seccomp_arch_remove.30000644000000000000000000000003414467535324020617 0ustar rootroot.so man3/seccomp_arch_add.3 libseccomp-2.5.4/doc/man/man3/seccomp_api_get.30000644000000000000000000000721514467535324017745 0ustar rootroot.TH "seccomp_api_get" 3 "22 September 2022" "paul@paul-moore.com" "libseccomp Documentation" .\" ////////////////////////////////////////////////////////////////////////// .SH NAME .\" ////////////////////////////////////////////////////////////////////////// seccomp_api_get, seccomp_api_set \- Manage the libseccomp API level .\" ////////////////////////////////////////////////////////////////////////// .SH SYNOPSIS .\" ////////////////////////////////////////////////////////////////////////// .nf .B #include .sp .BI "const unsigned int seccomp_api_get(" void ");" .BI "int seccomp_api_set(unsigned int " level ");" .sp Link with \fI\-lseccomp\fP. .fi .\" ////////////////////////////////////////////////////////////////////////// .SH DESCRIPTION .\" ////////////////////////////////////////////////////////////////////////// .P The .BR seccomp_api_get () function returns an integer representing the functionality ("API level") provided by the current running kernel. It is important to note that while .BR seccomp_api_get () can be called multiple times, the kernel is only probed the first time to see what functionality is supported, all following calls to .BR seccomp_api_get () return a cached value. .P The .BR seccomp_api_set () function allows callers to force the API level to the provided value; however, this is almost always a bad idea and use of this function is strongly discouraged. .P The different API level values are described below: .TP .B 0 Reserved value, not currently used. .TP .B 1 Base level support. .TP .B 2 The SCMP_FLTATR_CTL_TSYNC filter attribute is supported and libseccomp uses the .BR seccomp(2) syscall to load the seccomp filter into the kernel. .TP .B 3 The SCMP_FLTATR_CTL_LOG filter attribute and the SCMP_ACT_LOG action are supported. .TP .B 4 The SCMP_FLTATR_CTL_SSB filter attribute is supported. .TP .B 5 The SCMP_ACT_NOTIFY action and the notify APIs are supported. .TP .B 6 The simultaneous use of SCMP_FLTATR_CTL_TSYNC and the notify APIs are supported. .TP .B 7 The SCMP_FLTATR_CTL_WAITKILL filter attribute is supported. .\" ////////////////////////////////////////////////////////////////////////// .SH RETURN VALUE .\" ////////////////////////////////////////////////////////////////////////// The .BR seccomp_api_get () function returns an integer representing the supported API level. The .BR seccomp_api_set () function returns zero on success, negative values on failure. .\" ////////////////////////////////////////////////////////////////////////// .SH EXAMPLES .\" ////////////////////////////////////////////////////////////////////////// .nf #include int main(int argc, char *argv[]) { unsigned int api; api = seccomp_api_get(); switch (api) { case 2: /* ... */ default: /* ... */ } return 0; err: return 1; } .fi .\" ////////////////////////////////////////////////////////////////////////// .SH NOTES .\" ////////////////////////////////////////////////////////////////////////// .P While the seccomp filter can be generated independent of the kernel, kernel support is required to load and enforce the seccomp filter generated by libseccomp. .P The libseccomp project site, with more information and the source code repository, can be found at https://github.com/seccomp/libseccomp. This tool, as well as the libseccomp library, is currently under development, please report any bugs at the project site or directly to the author. .\" ////////////////////////////////////////////////////////////////////////// .SH AUTHOR .\" ////////////////////////////////////////////////////////////////////////// Paul Moore .\" ////////////////////////////////////////////////////////////////////////// libseccomp-2.5.4/doc/man/man3/seccomp_export_bpf_mem.30000644000000000000000000000003614467535324021335 0ustar rootroot.so man3/seccomp_export_bpf.3 libseccomp-2.5.4/doc/man/man3/seccomp_notify_alloc.30000644000000000000000000001130114467535324021006 0ustar rootroot.TH "seccomp_notify_alloc" 3 "30 May 2020" "tycho@tycho.ws" "libseccomp Documentation" .\" ////////////////////////////////////////////////////////////////////////// .SH NAME .\" ////////////////////////////////////////////////////////////////////////// seccomp_notify_alloc, seccomp_notify_free, seccomp_notify_receive, seccomp_notify_respond, seccomp_notify_id_valid, seccomp_notify_fd \- Manage seccomp notifications .\" ////////////////////////////////////////////////////////////////////////// .SH SYNOPSIS .\" ////////////////////////////////////////////////////////////////////////// .nf .B #include .sp .BI "int seccomp_notify_alloc(struct seccomp_notif **" req ", struct seccomp_notif_resp **" resp ")" .BI "void seccomp_notify_free(struct seccomp_notif *" req ", struct seccomp_notif_resp *" resp ")" .BI "int seccomp_notify_receive(int " fd ", struct seccomp_notif *" req ")" .BI "int seccomp_notify_respond(int " fd ", struct seccomp_notif_resp *" resp ")" .BI "int seccomp_notify_id_valid(int " fd ", uint64_t " id ")" .BI "int seccomp_notify_fd(const scmp_filter_ctx " ctx ")" .sp Link with \fI\-lseccomp\fP. .fi .\" ////////////////////////////////////////////////////////////////////////// .SH DESCRIPTION .\" ////////////////////////////////////////////////////////////////////////// .P The .BR seccomp_notify_alloc () function dynamically allocates enough memory for a seccomp notification and response. Note that one should always use these functions and not depend on the structure sizes in headers, since the size can vary depending on the kernel version. This function takes care to ask the kernel how big each structure should be, and allocates the right amount of memory. The .BR seccomp_notify_free () function frees memory allocated by .BR seccomp_notify_alloc (). .P The .BR seccomp_notify_receive () function receives a notification from a seccomp notify fd (obtained from .BR seccomp_notify_fd ()). .P The .BR seccomp_notify_respond () function sends a response to a particular notification. The id field should be the same as the id from the request, so that the kernel knows which request this response corresponds to. .P The .BR seccomp_notify_id_valid () function checks to see if the syscall from a particular notification request is still valid, i.e. if the task is still alive. See NOTES below for details on race conditions. .P The .BR seccomp_notify_fd () returns the notification fd of a filter after it has been loaded. .\" ////////////////////////////////////////////////////////////////////////// .SH RETURN VALUE .\" ////////////////////////////////////////////////////////////////////////// The .BR seccomp_notify_fd () returns the notification fd of the loaded filter, -1 if a notification fd has not yet been created, and -EINVAL if the filter context is invalid. .P The .BR seccomp_notify_id_valid () returns 0 if the id is valid, and -ENOENT if it is not. .P The .BR seccomp_notify_alloc (), .BR seccomp_notify_receive (), and .BR seccomp_notify_respond () functions return zero on success, or one of the following error codes on failure: .TP .B -ECANCELED There was a system failure beyond the control of the library, check the \fIerrno\fP value for more information. .TP .B -EFAULT Internal libseccomp failure. .TP .B -ENOMEM The library was unable to allocate enough memory. .TP .B -EOPNOTSUPP The library doesn't support the particular operation. .\" ////////////////////////////////////////////////////////////////////////// .SH NOTES .\" ////////////////////////////////////////////////////////////////////////// .P Care should be taken to avoid two different time of check/time of use errors. First, after opening any resources relevant to the pid for a notification (e.g. /proc/pid/mem for reading tracee memory to make policy decisions), applications should call .BR seccomp_notify_id_valid () to make sure that the resources the application has opened correspond to the right pid, i.e. that the pid didn't die and a different task take its place. .P Second, the classic time of check/time of use issue with seccomp memory should also be avoided: applications should copy any memory they wish to use to make decisions from the tracee into its own address space before applying any policy decisions, since a multi-threaded tracee may edit the memory at any time, including after it's used to make a policy decision. .P A complete example of how to avoid these two races is available in the Linux Kernel source tree at .BR /samples/seccomp/user-trap.c. .\" ////////////////////////////////////////////////////////////////////////// .SH AUTHOR .\" ////////////////////////////////////////////////////////////////////////// Tycho Andersen .\" ////////////////////////////////////////////////////////////////////////// libseccomp-2.5.4/doc/man/man3/seccomp_export_pfc.30000644000000000000000000000003614467535324020500 0ustar rootroot.so man3/seccomp_export_bpf.3 libseccomp-2.5.4/doc/man/man3/seccomp_notify_fd.30000644000000000000000000000004014467535324020303 0ustar rootroot.so man3/seccomp_notify_alloc.3 libseccomp-2.5.4/doc/man/man3/seccomp_syscall_resolve_num_arch.30000644000000000000000000000005014467535324023410 0ustar rootroot.so man3/seccomp_syscall_resolve_name.3 libseccomp-2.5.4/doc/man/man3/seccomp_version.30000644000000000000000000000557014467535324020024 0ustar rootroot.TH "seccomp_version" 3 "18 February 2016" "paul@paul-moore.com" "libseccomp Documentation" .\" ////////////////////////////////////////////////////////////////////////// .SH NAME .\" ////////////////////////////////////////////////////////////////////////// seccomp_version \- Query the libseccomp version information .\" ////////////////////////////////////////////////////////////////////////// .SH SYNOPSIS .\" ////////////////////////////////////////////////////////////////////////// .nf .B #include .sp .B struct scmp_version { .B unsigned int major; .B unsigned int minor; .B unsigned int micro; .B } .sp .BI "const struct scmp_version *seccomp_version(" void ");" .sp Link with \fI\-lseccomp\fP. .fi .\" ////////////////////////////////////////////////////////////////////////// .SH DESCRIPTION .\" ////////////////////////////////////////////////////////////////////////// .P The .BR seccomp_version () and .BR seccomp_reset () functions return a pointer to a .B scmp_version struct which contains the version information of the currently loaded libseccomp library. This function can be used by applications that need to verify that they are linked to a specific libseccomp version at runtime. .P The caller should not attempt to free the returned .B scmp_version struct when finished. .\" ////////////////////////////////////////////////////////////////////////// .SH RETURN VALUE .\" ////////////////////////////////////////////////////////////////////////// The .BR seccomp_version () function returns a pointer to a .B scmp_version structure on success, NULL on failure. The caller should not attempt to free the returned structure. .\" ////////////////////////////////////////////////////////////////////////// .SH EXAMPLES .\" ////////////////////////////////////////////////////////////////////////// .nf #include int main(int argc, char *argv[]) { const struct scmp_version *ver; ver = seccomp_version(); if (ver == NULL) goto err; /* ... */ return 0; err: return 1; } .fi .\" ////////////////////////////////////////////////////////////////////////// .SH NOTES .\" ////////////////////////////////////////////////////////////////////////// .P While the seccomp filter can be generated independent of the kernel, kernel support is required to load and enforce the seccomp filter generated by libseccomp. .P The libseccomp project site, with more information and the source code repository, can be found at https://github.com/seccomp/libseccomp. This tool, as well as the libseccomp library, is currently under development, please report any bugs at the project site or directly to the author. .\" ////////////////////////////////////////////////////////////////////////// .SH AUTHOR .\" ////////////////////////////////////////////////////////////////////////// Paul Moore .\" ////////////////////////////////////////////////////////////////////////// libseccomp-2.5.4/doc/man/man3/seccomp_syscall_resolve_name_rewrite.30000644000000000000000000000005014467535324024275 0ustar rootroot.so man3/seccomp_syscall_resolve_name.3 libseccomp-2.5.4/doc/man/man3/seccomp_arch_exist.30000644000000000000000000000003414467535324020456 0ustar rootroot.so man3/seccomp_arch_add.3 libseccomp-2.5.4/doc/man/man3/seccomp_reset.30000644000000000000000000000003014467535324017443 0ustar rootroot.so man3/seccomp_init.3 libseccomp-2.5.4/doc/man/man3/seccomp_merge.30000644000000000000000000001006514467535324017431 0ustar rootroot.TH "seccomp_merge" 3 "30 May 2020" "paul@paul-moore.com" "libseccomp Documentation" .\" ////////////////////////////////////////////////////////////////////////// .SH NAME .\" ////////////////////////////////////////////////////////////////////////// seccomp_merge \- Merge two seccomp filters .\" ////////////////////////////////////////////////////////////////////////// .SH SYNOPSIS .\" ////////////////////////////////////////////////////////////////////////// .nf .B #include .sp .B typedef void * scmp_filter_ctx; .sp .BI "int seccomp_merge(scmp_filter_ctx " dst ", scmp_filter_ctx " src ");" .sp Link with \fI\-lseccomp\fP. .fi .\" ////////////////////////////////////////////////////////////////////////// .SH DESCRIPTION .\" ////////////////////////////////////////////////////////////////////////// .P The .BR seccomp_merge () function merges the seccomp filter in .I src with the filter in .I dst and stores the resulting in the .I dst filter. If successful, the .I src seccomp filter is released and all internal memory associated with the filter is freed; there is no need to call .BR seccomp_release (3) on .I src and the caller should discard any references to the filter. .P In order to merge two seccomp filters, both filters must have the same attribute values and no overlapping architectures. .\" ////////////////////////////////////////////////////////////////////////// .SH RETURN VALUE .\" ////////////////////////////////////////////////////////////////////////// Returns zero on success or one of the following error codes on failure: .TP .B -EDOM Unable to merge the filters due to architecture issues, e.g. byte endian mismatches. .TP .B -EEXIST The architecture already exists in the filter. .TP .B -EINVAL One of the filters is invalid. .TP .B -ENOMEM The library was unable to allocate enough memory. .\" ////////////////////////////////////////////////////////////////////////// .SH EXAMPLES .\" ////////////////////////////////////////////////////////////////////////// .nf #include int main(int argc, char *argv[]) { int rc = \-1; scmp_filter_ctx ctx_32, ctx_64; ctx_32 = seccomp_init(SCMP_ACT_KILL); if (ctx_32 == NULL) goto out_all; ctx_64 = seccomp_init(SCMP_ACT_KILL); if (ctx_64 == NULL) goto out_all; if (seccomp_arch_exist(ctx_32, SCMP_ARCH_X86) == \-EEXIST) { rc = seccomp_arch_add(ctx_32, SCMP_ARCH_X86); if (rc != 0) goto out_all; rc = seccomp_arch_remove(ctx_32, SCMP_ARCH_NATIVE); if (rc != 0) goto out_all; } if (seccomp_arch_exist(ctx_64, SCMP_ARCH_X86_64) == \-EEXIST) { rc = seccomp_arch_add(ctx_64, SCMP_ARCH_X86_64); if (rc != 0) goto out_all; rc = seccomp_arch_remove(ctx_64, SCMP_ARCH_NATIVE); if (rc != 0) goto out_all; } /* ... */ rc = seccomp_merge(ctx_64, ctx_32); if (rc != 0) goto out_all; /* NOTE: the 'ctx_32' filter is no longer valid at this point */ /* ... */ out: seccomp_release(ctx_64); return \-rc; out_all: seccomp_release(ctx_32); goto out; } .fi .\" ////////////////////////////////////////////////////////////////////////// .SH NOTES .\" ////////////////////////////////////////////////////////////////////////// .P While the seccomp filter can be generated independent of the kernel, kernel support is required to load and enforce the seccomp filter generated by libseccomp. .P The libseccomp project site, with more information and the source code repository, can be found at https://github.com/seccomp/libseccomp. This tool, as well as the libseccomp library, is currently under development, please report any bugs at the project site or directly to the author. .\" ////////////////////////////////////////////////////////////////////////// .SH AUTHOR .\" ////////////////////////////////////////////////////////////////////////// Paul Moore .\" ////////////////////////////////////////////////////////////////////////// .SH SEE ALSO .\" ////////////////////////////////////////////////////////////////////////// .BR seccomp_init (3), .BR seccomp_reset (3), .BR seccomp_arch_add (3), .BR seccomp_arch_remove (3), .BR seccomp_attr_get (3), .BR seccomp_attr_set (3) libseccomp-2.5.4/doc/man/man3/seccomp_notify_free.30000644000000000000000000000004014467535324020633 0ustar rootroot.so man3/seccomp_notify_alloc.3 libseccomp-2.5.4/doc/man/man3/seccomp_rule_add.30000644000000000000000000003440214467535324020112 0ustar rootroot.TH "seccomp_rule_add" 3 "30 May 2020" "paul@paul-moore.com" "libseccomp Documentation" .\" ////////////////////////////////////////////////////////////////////////// .SH NAME .\" ////////////////////////////////////////////////////////////////////////// seccomp_rule_add, seccomp_rule_add_exact \- Add a seccomp filter rule .\" ////////////////////////////////////////////////////////////////////////// .SH SYNOPSIS .\" ////////////////////////////////////////////////////////////////////////// .nf .B #include .sp .B typedef void * scmp_filter_ctx; .sp .BI "int SCMP_SYS(" syscall_name ");" .sp .BI "struct scmp_arg_cmp SCMP_CMP(unsigned int " arg "," .BI " enum scmp_compare " op ", " ... ");" .BI "struct scmp_arg_cmp SCMP_A0(enum scmp_compare " op ", " ... ");" .BI "struct scmp_arg_cmp SCMP_A1(enum scmp_compare " op ", " ... ");" .BI "struct scmp_arg_cmp SCMP_A2(enum scmp_compare " op ", " ... ");" .BI "struct scmp_arg_cmp SCMP_A3(enum scmp_compare " op ", " ... ");" .BI "struct scmp_arg_cmp SCMP_A4(enum scmp_compare " op ", " ... ");" .BI "struct scmp_arg_cmp SCMP_A5(enum scmp_compare " op ", " ... ");" .sp .BI "struct scmp_arg_cmp SCMP_CMP64(unsigned int " arg "," .BI " enum scmp_compare " op ", " ... ");" .BI "struct scmp_arg_cmp SCMP_A0_64(enum scmp_compare " op ", " ... ");" .BI "struct scmp_arg_cmp SCMP_A1_64(enum scmp_compare " op ", " ... ");" .BI "struct scmp_arg_cmp SCMP_A2_64(enum scmp_compare " op ", " ... ");" .BI "struct scmp_arg_cmp SCMP_A3_64(enum scmp_compare " op ", " ... ");" .BI "struct scmp_arg_cmp SCMP_A4_64(enum scmp_compare " op ", " ... ");" .BI "struct scmp_arg_cmp SCMP_A5_64(enum scmp_compare " op ", " ... ");" .sp .BI "struct scmp_arg_cmp SCMP_CMP32(unsigned int " arg "," .BI " enum scmp_compare " op ", " ... ");" .BI "struct scmp_arg_cmp SCMP_A0_32(enum scmp_compare " op ", " ... ");" .BI "struct scmp_arg_cmp SCMP_A1_32(enum scmp_compare " op ", " ... ");" .BI "struct scmp_arg_cmp SCMP_A2_32(enum scmp_compare " op ", " ... ");" .BI "struct scmp_arg_cmp SCMP_A3_32(enum scmp_compare " op ", " ... ");" .BI "struct scmp_arg_cmp SCMP_A4_32(enum scmp_compare " op ", " ... ");" .BI "struct scmp_arg_cmp SCMP_A5_32(enum scmp_compare " op ", " ... ");" .sp .BI "int seccomp_rule_add(scmp_filter_ctx " ctx ", uint32_t " action "," .BI " int " syscall ", unsigned int " arg_cnt ", " ... ");" .BI "int seccomp_rule_add_exact(scmp_filter_ctx " ctx ", uint32_t " action "," .BI " int " syscall ", unsigned int " arg_cnt ", " ... ");" .sp .BI "int seccomp_rule_add_array(scmp_filter_ctx " ctx "," .BI " uint32_t " action ", int " syscall "," .BI " unsigned int " arg_cnt "," .BI " const struct scmp_arg_cmp *"arg_array ");" .BI "int seccomp_rule_add_exact_array(scmp_filter_ctx " ctx "," .BI " uint32_t " action ", int " syscall "," .BI " unsigned int " arg_cnt "," .BI " const struct scmp_arg_cmp *"arg_array ");" .sp Link with \fI\-lseccomp\fP. .fi .\" ////////////////////////////////////////////////////////////////////////// .SH DESCRIPTION .\" ////////////////////////////////////////////////////////////////////////// .P The .BR seccomp_rule_add (), .BR seccomp_rule_add_array (), .BR seccomp_rule_add_exact (), and .BR seccomp_rule_add_exact_array () functions all add a new filter rule to the current seccomp filter. The .BR seccomp_rule_add () and .BR seccomp_rule_add_array () functions will make a "best effort" to add the rule as specified, but may alter the rule slightly due to architecture specifics (e.g. internal rewriting of multiplexed syscalls, like socket and ipc functions on x86). The .BR seccomp_rule_add_exact () and .BR seccomp_rule_add_exact_array () functions will attempt to add the rule exactly as specified so it may behave differently on different architectures. While it does not guarantee a exact filter ruleset, .BR seccomp_rule_add () and .BR seccomp_rule_add_array () do guarantee the same behavior regardless of the architecture. .P The newly added filter rule does not take effect until the entire filter is loaded into the kernel using .BR seccomp_load (3). When adding rules to a filter, it is important to consider the impact of previously loaded filters; see the .BR seccomp_load (3) documentation for more information. .P All of the filter rules supplied by the calling application are combined into a union, with additional logic to eliminate redundant syscall filters. For example, if a rule is added which allows a given syscall with a specific set of argument values and later a rule is added which allows the same syscall regardless the argument values then the first, more specific rule, is effectively dropped from the filter by the second more generic rule. .P The .BR SCMP_CMP (), .BR SCMP_CMP64 (), .BR SCMP_A{0-5} (), and .BR SCMP_A{0-5}_64 () macros generate a scmp_arg_cmp structure for use with the above functions. The .BR SCMP_CMP () and .BR SCMP_CMP64 () macros allows the caller to specify an arbitrary argument along with the comparison operator, 64-bit mask, and 64-bit datum values where the .BR SCMP_A{0-5} () and .BR SCMP_A{0-5}_64 () macros are specific to a certain argument. .P The .BR SCMP_CMP32 () and .BR SCMP_A{0-5}_32 () macros are similar to the variants above, but they take 32-bit mask and 32-bit datum values. .P It is recommended that whenever possible developers avoid using the .BR SCMP_CMP () and .BR SCMP_A{0-5} () macros and use the variants which are explicitly 32 or 64-bit. This should help eliminate problems caused by an unwanted sign extension of negative datum values. .P If syscall argument comparisons are included in the filter rule, all of the comparisons must be true for the rule to match. .P When adding syscall argument comparisons to the filter it is important to remember that while it is possible to have multiple comparisons in a single rule, you can only compare each argument once in a single rule. In other words, you can not have multiple comparisons of the 3rd syscall argument in a single rule. .P In a filter containing multiple architectures, it is an error to add a filter rule for a syscall that does not exist in all of the filter's architectures. .P While it is possible to specify the .I syscall value directly using the standard .B __NR_syscall values, in order to ensure proper operation across multiple architectures it is highly recommended to use the .BR SCMP_SYS () macro instead. See the EXAMPLES section below. It is also important to remember that regardless of the architectures present in the filter, the syscall numbers used in filter rules are interpreted in the context of the native architecture. .P Starting with Linux v4.8, there may be a need to create a rule with a syscall value of -1 to allow tracing programs to skip a syscall invocation; in order to create a rule with a -1 syscall value it is necessary to first set the .B SCMP_FLTATR_API_TSKIP attribute. See .BR seccomp_attr_set (3) for more information. .P The filter context .I ctx is the value returned by the call to .BR seccomp_init (3). .P Valid .I action values are as follows: .TP .B SCMP_ACT_KILL The thread will be killed by the kernel when it calls a syscall that matches the filter rule. .TP .B SCMP_ACT_KILL_PROCESS The process will be killed by the kernel when it calls a syscall that matches the filter rule. .TP .B SCMP_ACT_TRAP The thread will throw a SIGSYS signal when it calls a syscall that matches the filter rule. .TP .B SCMP_ACT_ERRNO(uint16_t errno) The thread will receive a return value of .I errno when it calls a syscall that matches the filter rule. .TP .B SCMP_ACT_TRACE(uint16_t msg_num) If the thread is being traced and the tracing process specified the .B PTRACE_O_TRACESECCOMP option in the call to .BR ptrace (2), the tracing process will be notified, via .B PTRACE_EVENT_SECCOMP , and the value provided in .I msg_num can be retrieved using the .B PTRACE_GETEVENTMSG option. .TP .B SCMP_ACT_LOG The seccomp filter will have no effect on the thread calling the syscall if it matches the filter rule but the syscall will be logged. .TP .B SCMP_ACT_ALLOW The seccomp filter will have no effect on the thread calling the syscall if it matches the filter rule. .TP .B SCMP_ACT_NOTIFY A monitoring process will be notified when a process running the seccomp filter calls a syscall that matches the filter rule. The process that invokes the syscall waits in the kernel until the monitoring process has responded via .B seccomp_notify_respond (3) \&. When a filter utilizing .B SCMP_ACT_NOTIFY is loaded into the kernel, the kernel generates a notification fd that must be used to communicate between the monitoring process and the process(es) being filtered. See .B seccomp_notify_fd (3) for more information. .P Valid comparison .I op values are as follows: .TP .B SCMP_CMP_NE Matches when the argument value is not equal to the datum value, example: .sp SCMP_CMP( .I arg , SCMP_CMP_NE , .I datum ) .TP .B SCMP_CMP_LT Matches when the argument value is less than the datum value, example: .sp SCMP_CMP( .I arg , SCMP_CMP_LT , .I datum ) .TP .B SCMP_CMP_LE Matches when the argument value is less than or equal to the datum value, example: .sp SCMP_CMP( .I arg , SCMP_CMP_LE , .I datum ) .TP .B SCMP_CMP_EQ Matches when the argument value is equal to the datum value, example: .sp SCMP_CMP( .I arg , SCMP_CMP_EQ , .I datum ) .TP .B SCMP_CMP_GE Matches when the argument value is greater than or equal to the datum value, example: .sp SCMP_CMP( .I arg , SCMP_CMP_GE , .I datum ) .TP .B SCMP_CMP_GT Matches when the argument value is greater than the datum value, example: .sp SCMP_CMP( .I arg , SCMP_CMP_GT , .I datum ) .TP .B SCMP_CMP_MASKED_EQ Matches when the masked argument value is equal to the masked datum value, example: .sp SCMP_CMP( .I arg , SCMP_CMP_MASKED_EQ , .I mask , .I datum ) .\" ////////////////////////////////////////////////////////////////////////// .SH RETURN VALUE .\" ////////////////////////////////////////////////////////////////////////// The .BR SCMP_SYS () macro returns a value suitable for use as the .I syscall value in the .BR seccomp_rule_add* () functions. In a similar manner, the .BR SCMP_CMP () and .BR SCMP_A* () macros return values suitable for use as argument comparisons in the .BR seccomp_rule_add () and .BR seccomp_rule_add_exact () functions. .P The .BR seccomp_rule_add (), .BR seccomp_rule_add_array (), .BR seccomp_rule_add_exact (), and .BR seccomp_rule_add_exact_array () functions return zero on success or one of the following error codes on failure: .TP .B -EDOM Architecture specific failure. .TP .B -EEXIST The rule already exists. .TP .B -EACCES The rule conflicts with the filter (for example, the rule .I action equals the default action of the filter). .TP .B -EFAULT Internal libseccomp failure. .TP .B -EINVAL Invalid input, either the context or architecture token is invalid. .TP .B -ENOMEM The library was unable to allocate enough memory. .TP .B -EOPNOTSUPP The library doesn't support the particular operation. .\" ////////////////////////////////////////////////////////////////////////// .SH EXAMPLES .\" ////////////////////////////////////////////////////////////////////////// .nf #include #include #include #include #include #define BUF_SIZE 256 int main(int argc, char *argv[]) { int rc = \-1; scmp_filter_ctx ctx; struct scmp_arg_cmp arg_cmp[] = { SCMP_A0(SCMP_CMP_EQ, 2) }; int fd; unsigned char buf[BUF_SIZE]; ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) goto out; /* ... */ fd = open("file.txt", 0); /* ... */ rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0); if (rc < 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0); if (rc < 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit), 0); if (rc < 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 3, SCMP_A0(SCMP_CMP_EQ, fd), SCMP_A1(SCMP_CMP_EQ, (scmp_datum_t)buf), SCMP_A2(SCMP_CMP_LE, BUF_SIZE)); if (rc < 0) goto out; rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, SCMP_CMP(0, SCMP_CMP_EQ, fd)); if (rc < 0) goto out; rc = seccomp_rule_add_array(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, arg_cmp); if (rc < 0) goto out; rc = seccomp_load(ctx); if (rc < 0) goto out; /* ... */ out: seccomp_release(ctx); return \-rc; } .fi .\" ////////////////////////////////////////////////////////////////////////// .SH NOTES .\" ////////////////////////////////////////////////////////////////////////// .P While the seccomp filter can be generated independent of the kernel, kernel support is required to load and enforce the seccomp filter generated by libseccomp. .P The libseccomp project site, with more information and the source code repository, can be found at https://github.com/seccomp/libseccomp. This tool, as well as the libseccomp library, is currently under development, please report any bugs at the project site or directly to the author. .\" ////////////////////////////////////////////////////////////////////////// .SH BUGS .\" ////////////////////////////////////////////////////////////////////////// .P The runtime behavior of seccomp filters is dependent upon the kernel version, the processor architecture, and other libraries including libc. This could affect the return code of a seccomp filter. .TP .B * PowerPC glibc will not return a negative number when the .B getpid() syscall is invoked. If a seccomp filter has been created where .B getpid() will return a negative number from the kernel, then PowerPC glibc will return the absolute value of the errno. In this case, it is very difficult for an application to distinguish between the errno and a valid pid. .\" ////////////////////////////////////////////////////////////////////////// .SH AUTHOR .\" ////////////////////////////////////////////////////////////////////////// Paul Moore .\" ////////////////////////////////////////////////////////////////////////// .SH SEE ALSO .\" ////////////////////////////////////////////////////////////////////////// .BR seccomp_syscall_resolve_name_rewrite (3), .BR seccomp_syscall_priority (3), .BR seccomp_load (3), .BR seccomp_attr_set (3) libseccomp-2.5.4/doc/man/man3/seccomp_api_set.30000644000000000000000000000003314467535324017750 0ustar rootroot.so man3/seccomp_api_get.3 libseccomp-2.5.4/doc/man/man3/seccomp_arch_native.30000644000000000000000000000003414467535324020610 0ustar rootroot.so man3/seccomp_arch_add.3 libseccomp-2.5.4/doc/man/man3/seccomp_attr_set.30000644000000000000000000001477014467535324020166 0ustar rootroot.TH "seccomp_attr_set" 3 "21 September 2022" "paul@paul-moore.com" "libseccomp Documentation" .\" ////////////////////////////////////////////////////////////////////////// .SH NAME .\" ////////////////////////////////////////////////////////////////////////// seccomp_attr_set, seccomp_attr_get \- Manage the seccomp filter attributes .\" ////////////////////////////////////////////////////////////////////////// .SH SYNOPSIS .\" ////////////////////////////////////////////////////////////////////////// .nf .B #include .sp .B typedef void * scmp_filter_ctx; .B enum scmp_filter_attr; .sp .BI "int seccomp_attr_set(scmp_filter_ctx " ctx "," .BI " enum scmp_filter_attr " attr ", uint32_t " value ");" .BI "int seccomp_attr_get(scmp_filter_ctx " ctx "," .BI " enum scmp_filter_attr " attr ", uint32_t *" value ");" .sp Link with \fI\-lseccomp\fP. .fi .\" ////////////////////////////////////////////////////////////////////////// .SH DESCRIPTION .\" ////////////////////////////////////////////////////////////////////////// .P The .BR seccomp_attr_set () function sets the different seccomp filter attributes while the .BR seccomp_attr_get () function fetches the filter attributes. The seccomp filter attributes are tunable values that affect how the library behaves when generating and loading the seccomp filter into the kernel. The attributes are reset to their default values whenever the filter is initialized or reset via .BR seccomp_init (3) or .BR seccomp_reset (3). .P The filter context .I ctx is the value returned by the call to .BR seccomp_init (3). .P Valid .I attr values are as follows: .TP .B SCMP_FLTATR_ACT_DEFAULT The default filter action as specified in the call to .BR seccomp_init (3) or .BR seccomp_reset (3). This attribute is read-only. .TP .B SCMP_FLTATR_ACT_BADARCH The filter action taken when the loaded filter does not match the architecture of the executing application. Defaults to the .B SCMP_ACT_KILL action. .TP .B SCMP_FLTATR_CTL_NNP A flag to specify if the NO_NEW_PRIVS functionality should be enabled before loading the seccomp filter into the kernel. Setting this to off .RI ( value == 0) results in no action, meaning that loading the seccomp filter into the kernel will fail if CAP_SYS_ADMIN is missing and NO_NEW_PRIVS has not been externally set. Defaults to on .RI ( value == 1). .TP .B SCMP_FLTATR_CTL_TSYNC A flag to specify if the kernel should attempt to synchronize the filters across all threads on .BR seccomp_load (3). If the kernel is unable to synchronize all of the thread then the load operation will fail. This flag is only available on Linux Kernel 3.17 or greater; attempting to enable this flag on earlier kernels will result in an error being returned. Defaults to off .RI ( value == 0). .TP .B SCMP_FLTATR_API_TSKIP A flag to specify if libseccomp should allow filter rules to be created for the -1 syscall. The -1 syscall value can be used by tracer programs to skip specific syscall invocations, see .BR seccomp (2) for more information. Defaults to off .RI ( value == 0). .TP .B SCMP_FLTATR_CTL_LOG A flag to specify if the kernel should log all filter actions taken except for the .BR SCMP_ACT_ALLOW action. Defaults to off .RI ( value == 0). .TP .B SCMP_FLTATR_CTL_SSB A flag to disable Speculative Store Bypass mitigations for this filter. Defaults to off .RI ( value == 0). .TP .B SCMP_FLTATR_CTL_OPTIMIZE A flag to specify the optimization level of the seccomp filter. By default libseccomp generates a set of sequential \'if\' statements for each rule in the filter. .BR seccomp_syscall_priority (3) can be used to prioritize the order for the default cause. The binary tree optimization sorts by syscall numbers and generates consistent .BR O(log\ n) filter traversal for every rule in the filter. The binary tree may be advantageous for large filters. Note that .BR seccomp_syscall_priority (3) is ignored when SCMP_FLTATR_CTL_OPTIMIZE == 2. .RS .P The different optimization levels are described below: .TP .B 0 Reserved value, not currently used. .TP .B 1 Rules sorted by priority and complexity (DEFAULT). .TP .B 2 Binary tree sorted by syscall number. .RE .TP .B SCMP_FLTATR_API_SYSRAWRC A flag to specify if libseccomp should pass system error codes back to the caller instead of the default -ECANCELED. Defaults to off .RI ( value == 0). .TP .B SCMP_FLTATR_CTL_WAITKILL A flag to specify if libseccomp should request wait killable semantics when possible. Defaults to off .RI ( value == 0). .\" ////////////////////////////////////////////////////////////////////////// .SH RETURN VALUE .\" ////////////////////////////////////////////////////////////////////////// Returns zero on success or one of the following error codes on failure: .TP .B -EACCES Setting the attribute with the given value is not allowed. .TP .B -EEXIST The attribute does not exist. .TP .B -EINVAL Invalid input, either the context or architecture token is invalid. .TP .B -EOPNOTSUPP The library doesn't support the particular operation. .\" ////////////////////////////////////////////////////////////////////////// .SH EXAMPLES .\" ////////////////////////////////////////////////////////////////////////// .nf #include int main(int argc, char *argv[]) { int rc = \-1; scmp_filter_ctx ctx; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) goto out; /* ... */ rc = seccomp_attr_set(ctx, SCMP_FLTATR_ACT_BADARCH, SCMP_ACT_TRAP); if (rc < 0) goto out; /* ... */ out: seccomp_release(ctx); return \-rc; } .fi .\" ////////////////////////////////////////////////////////////////////////// .SH NOTES .\" ////////////////////////////////////////////////////////////////////////// .P While the seccomp filter can be generated independent of the kernel, kernel support is required to load and enforce the seccomp filter generated by libseccomp. .P The libseccomp project site, with more information and the source code repository, can be found at https://github.com/seccomp/libseccomp. This tool, as well as the libseccomp library, is currently under development, please report any bugs at the project site or directly to the author. .\" ////////////////////////////////////////////////////////////////////////// .SH AUTHOR .\" ////////////////////////////////////////////////////////////////////////// Paul Moore .\" ////////////////////////////////////////////////////////////////////////// .SH SEE ALSO .\" ////////////////////////////////////////////////////////////////////////// .BR seccomp_init (3), .BR seccomp_reset (3), .BR seccomp_load (3), .BR seccomp (2) libseccomp-2.5.4/doc/man/man3/seccomp_rule_add_exact_array.30000644000000000000000000000003414467535324022466 0ustar rootroot.so man3/seccomp_rule_add.3 libseccomp-2.5.4/doc/man/man3/seccomp_notify_respond.30000644000000000000000000000004014467535324021364 0ustar rootroot.so man3/seccomp_notify_alloc.3 libseccomp-2.5.4/doc/man/man1/0000755000000000000000000000000014467535324014531 5ustar rootrootlibseccomp-2.5.4/doc/man/man1/scmp_sys_resolver.10000644000000000000000000000546714467535324020410 0ustar rootroot.TH "scmp_sys_resolver" 1 "23 May 2013" "paul@paul-moore.com" "libseccomp Documentation" .\" ////////////////////////////////////////////////////////////////////////// .SH NAME .\" ////////////////////////////////////////////////////////////////////////// scmp_sys_resolver \- Resolve system calls .\" ////////////////////////////////////////////////////////////////////////// .SH SYNOPSIS .\" ////////////////////////////////////////////////////////////////////////// .B scmp_sys_resolver [\-h] [\-a .I ARCH ] [\-t] .I SYSCALL_NAME | .I SYSCALL_NUMBER .\" ////////////////////////////////////////////////////////////////////////// .SH DESCRIPTION .\" ////////////////////////////////////////////////////////////////////////// .P This command resolves both system call names and numbers with respect to the given architecture supplied in the optional .I ARCH argument. If the architecture is not supplied on the command line then the native architecture is used. If the "\-t" argument is specified along with a system call name, then the system call will be translated as necessary for the given architecture. The "\-t" argument has no effect if a system call number is specified. .P In some combinations of architecture and system call, a negative system call number will be displayed. A negative system call number indicates that the system call is not defined for the given architecture and is treated in a special manner by libseccomp depending on the operation. .TP .B \-a \fIARCH The architecture to use for resolving the system call. Valid .I ARCH values are "x86", "x86_64", "x32", "arm", "aarch64", "loongarch64", "m68k", "mips", "mipsel", "mips64", "mipsel64", "mips64n32", "mipsel64n32", "parisc", "parisc64", "ppc", "ppc64", "ppc64le", "s390", "s390x", "sheb" and "sh". .TP .B \-t If necessary, translate the system call name to the proper system call number, even if the system call name is different, e.g. socket(2) on x86. .TP .B \-h A simple one-line usage display. .\" ////////////////////////////////////////////////////////////////////////// .SH EXIT STATUS .\" ////////////////////////////////////////////////////////////////////////// Returns zero on success, errno values on failure. .\" ////////////////////////////////////////////////////////////////////////// .SH NOTES .\" ////////////////////////////////////////////////////////////////////////// .P The libseccomp project site, with more information and the source code repository, can be found at https://github.com/seccomp/libseccomp. This tool, as well as the libseccomp library, is currently under development, please report any bugs at the project site or directly to the author. .\" ////////////////////////////////////////////////////////////////////////// .SH AUTHOR .\" ////////////////////////////////////////////////////////////////////////// Paul Moore libseccomp-2.5.4/CONTRIBUTING.md0000644000000000000000000001201214467535324014602 0ustar rootrootHow to Contribute to the libseccomp Project =============================================================================== https://github.com/seccomp/libseccomp This document is intended to act as a guide to help you contribute to the libseccomp project. It is not perfect, and there will always be exceptions to the rules described here, but by following the instructions below you should have a much easier time getting your work merged with the upstream project. ## Interacting with the Community > "Be excellent to each other." - *Bill S. Preston, Esq.* The libseccomp project aims to be a welcoming place and we ask that anyone who interacts with the project, and the greater community, treat each other with dignity and respect. Individuals who do not behave in such a manner will be warned and asked to adjust their behavior; in extreme cases the individual may be blocked from the project. Examples of inappropriate behavior includes: profane, abusive, or prejudicial language directed at another person, vandalism (e.g. GitHub issue/PR "litter"), or spam. ## Test Your Code Using Existing Tests There are three possible tests you can run to verify your code. The first test is used to check the formatting and coding style of your changes, you can run the test with the following command: # make check-syntax ... if there are any problems with your changes a diff/patch will be shown which indicates the problems and how to fix them. The second possible test is used to ensure that the different internal syscall tables are consistent and to test your changes against the automated test suite. You can run the test with the following command: # make check ... if there are any faults or errors they will be displayed; beware that the tests can run for some time and produce a lot of output. The third possible test is used to validate libseccomp against a live, running system using some simple regression tests. After ensuring that your system supports seccomp filters you can run the live tests with the following command: # make check-build # (cd tests; ./regression -T live) ... if there are any faults or errors they will be displayed. ## Add New Tests for New Functionality The libseccomp code includes a fairly extensive test suite and any submissions which add functionality, or significantly change the existing code, should include additional tests to verify the proper operation of the proposed changes. Code coverage analysis tools have been integrated into the libseccomp code base, and can be enabled via the "--enable-code-coverage" configure flag and the "check-code-coverage" make target. Additional details on generating code coverage information can be found in the .travis.yml file. ## Explain Your Work At the top of every patch you should include a description of the problem you are trying to solve, how you solved it, and why you chose the solution you implemented. If you are submitting a bug fix, it is also incredibly helpful if you can describe/include a reproducer for the problem in the description as well as instructions on how to test for the bug and verify that it has been fixed. ## Sign Your Work The sign-off is a simple line at the end of the patch description, which certifies that you wrote it or otherwise have the right to pass it on as an open-source patch. The "Developer's Certificate of Origin" pledge is taken from the Linux Kernel and the rules are pretty simple: Developer's Certificate of Origin 1.1 By making a contribution to this project, I certify that: (a) The contribution was created in whole or in part by me and I have the right to submit it under the open source license indicated in the file; or (b) The contribution is based upon previous work that, to the best of my knowledge, is covered under an appropriate open source license and I have the right under that license to submit that work with modifications, whether created in whole or in part by me, under the same open source license (unless I am permitted to submit under a different license), as indicated in the file; or (c) The contribution was provided directly to me by some other person who certified (a), (b) or (c) and I have not modified it. (d) I understand and agree that this project and the contribution are public and that a record of the contribution (including all personal information I submit with it, including my sign-off) is maintained indefinitely and may be redistributed consistent with this project or the open source license(s) involved. ... then you just add a line to the bottom of your patch description, with your real name, saying: Signed-off-by: Random J Developer You can add this to your commit description in `git` with `git commit -s` ## Post Your Patches to GitHub The libseccomp project accepts new patches via GitHub pull requests, if you are not familiar with GitHub pull requests please see [this guide](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request). libseccomp-2.5.4/src/0000755000000000000000000000000014467535325013145 5ustar rootrootlibseccomp-2.5.4/src/arch-arm.c0000644000000000000000000000562714467535324015014 0ustar rootroot/** * Enhanced Seccomp ARM Specific Code * * Copyright (c) 2013 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "arch.h" #include "arch-arm.h" #include "syscalls.h" #define __SCMP_NR_OABI_SYSCALL_BASE 0x900000 #define __SCMP_ARM_NR_BASE 0x0f0000 /* NOTE: we currently only support the ARM EABI, more info at the URL below: * -> http://wiki.embeddedarm.com/wiki/EABI_vs_OABI */ #if 1 #define __SCMP_NR_BASE 0 #else #define __SCMP_NR_BASE __SCMP_NR_OABI_SYSCALL_BASE #endif /** * Resolve a syscall name to a number * @param arch the architecture definition * @param name the syscall name * * Resolve the given syscall name to the syscall number using the syscall table. * Returns the syscall number on success, including negative pseudo syscall * numbers; returns __NR_SCMP_ERROR on failure. * */ int arm_syscall_resolve_name_munge(const struct arch_def *arch, const char *name) { int sys; /* NOTE: we don't want to modify the pseudo-syscall numbers */ sys = arch->syscall_resolve_name_raw(name); if (sys == __NR_SCMP_ERROR || sys < 0) return sys; return (sys | __SCMP_NR_BASE); } /** * Resolve a syscall number to a name * @param arch the architecture definition * @param num the syscall number * * Resolve the given syscall number to the syscall name using the syscall table. * Returns a pointer to the syscall name string on success, including pseudo * syscall names; returns NULL on failure. * */ const char *arm_syscall_resolve_num_munge(const struct arch_def *arch, int num) { /* NOTE: we don't want to modify the pseudo-syscall numbers */ if (num >= 0) num &= ~__SCMP_NR_BASE; return arch->syscall_resolve_num_raw(num); } ARCH_DEF(arm) const struct arch_def arch_def_arm = { .token = SCMP_ARCH_ARM, .token_bpf = AUDIT_ARCH_ARM, .size = ARCH_SIZE_32, .endian = ARCH_ENDIAN_LITTLE, .syscall_resolve_name = arm_syscall_resolve_name_munge, .syscall_resolve_name_raw = arm_syscall_resolve_name, .syscall_resolve_num = arm_syscall_resolve_num_munge, .syscall_resolve_num_raw = arm_syscall_resolve_num, .syscall_rewrite = NULL, .rule_add = NULL, .syscall_name_kver = arm_syscall_name_kver, .syscall_num_kver = arm_syscall_num_kver, }; libseccomp-2.5.4/src/syscalls.csv0000644000000000000000000034407314467535325015532 0ustar rootroot#syscall (v6.2.0 2023-03-02),x86,x86_kver,x86_64,x86_64_kver,x32,x32_kver,arm,arm_kver,aarch64,aarch64_kver,loongarch64,loongarch64_kver,m68k,m68k_kver,mips,mips_kver,mips64,mips64_kver,mips64n32,mips64n32_kver,parisc,parisc_kver,parisc64,parisc64_kver,ppc,ppc_kver,ppc64,ppc64_kver,riscv64,riscv64_kver,s390,s390_kver,s390x,s390x_kver,sh,sh_kver accept,PNR,KV_UNDEF,43,KV_UNDEF,43,KV_UNDEF,285,KV_UNDEF,202,KV_UNDEF,202,KV_UNDEF,PNR,KV_UNDEF,168,KV_UNDEF,42,KV_UNDEF,42,KV_UNDEF,35,KV_UNDEF,35,KV_UNDEF,330,KV_UNDEF,330,KV_UNDEF,202,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,344,KV_UNDEF accept4,364,KV_UNDEF,288,KV_UNDEF,288,KV_UNDEF,366,KV_UNDEF,242,KV_UNDEF,242,KV_UNDEF,361,KV_UNDEF,334,KV_UNDEF,293,KV_UNDEF,297,KV_UNDEF,320,KV_UNDEF,320,KV_UNDEF,344,KV_UNDEF,344,KV_UNDEF,242,KV_UNDEF,364,KV_UNDEF,364,KV_UNDEF,358,KV_UNDEF access,33,KV_UNDEF,21,KV_UNDEF,21,KV_UNDEF,33,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,33,KV_UNDEF,33,KV_UNDEF,20,KV_UNDEF,20,KV_UNDEF,33,KV_UNDEF,33,KV_UNDEF,33,KV_UNDEF,33,KV_UNDEF,PNR,KV_UNDEF,33,KV_UNDEF,33,KV_UNDEF,33,KV_UNDEF acct,51,KV_UNDEF,163,KV_UNDEF,163,KV_UNDEF,51,KV_UNDEF,89,KV_UNDEF,89,KV_UNDEF,51,KV_UNDEF,51,KV_UNDEF,158,KV_UNDEF,158,KV_UNDEF,51,KV_UNDEF,51,KV_UNDEF,51,KV_UNDEF,51,KV_UNDEF,89,KV_UNDEF,51,KV_UNDEF,51,KV_UNDEF,51,KV_UNDEF add_key,286,KV_UNDEF,248,KV_UNDEF,248,KV_UNDEF,309,KV_UNDEF,217,KV_UNDEF,217,KV_UNDEF,279,KV_UNDEF,280,KV_UNDEF,239,KV_UNDEF,243,KV_UNDEF,264,KV_UNDEF,264,KV_UNDEF,269,KV_UNDEF,269,KV_UNDEF,217,KV_UNDEF,278,KV_UNDEF,278,KV_UNDEF,285,KV_UNDEF adjtimex,124,KV_UNDEF,159,KV_UNDEF,159,KV_UNDEF,124,KV_UNDEF,171,KV_UNDEF,171,KV_UNDEF,124,KV_UNDEF,124,KV_UNDEF,154,KV_UNDEF,154,KV_UNDEF,124,KV_UNDEF,124,KV_UNDEF,124,KV_UNDEF,124,KV_UNDEF,171,KV_UNDEF,124,KV_UNDEF,124,KV_UNDEF,124,KV_UNDEF afs_syscall,137,KV_UNDEF,183,KV_UNDEF,183,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,137,KV_UNDEF,176,KV_UNDEF,176,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,137,KV_UNDEF,137,KV_UNDEF,PNR,KV_UNDEF,137,KV_UNDEF,137,KV_UNDEF,PNR,KV_UNDEF alarm,27,KV_UNDEF,37,KV_UNDEF,37,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,27,KV_UNDEF,27,KV_UNDEF,37,KV_UNDEF,37,KV_UNDEF,27,KV_UNDEF,27,KV_UNDEF,27,KV_UNDEF,27,KV_UNDEF,PNR,KV_UNDEF,27,KV_UNDEF,27,KV_UNDEF,27,KV_UNDEF arch_prctl,384,KV_UNDEF,158,KV_UNDEF,158,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF arm_fadvise64_64,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,270,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF arm_sync_file_range,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,341,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF atomic_barrier,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,336,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF atomic_cmpxchg_32,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,335,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF bdflush,134,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,134,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,134,KV_UNDEF,134,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,134,KV_UNDEF,134,KV_UNDEF,134,KV_UNDEF,134,KV_UNDEF,PNR,KV_UNDEF,134,KV_UNDEF,134,KV_UNDEF,134,KV_UNDEF bind,361,KV_UNDEF,49,KV_UNDEF,49,KV_UNDEF,282,KV_UNDEF,200,KV_UNDEF,200,KV_UNDEF,358,KV_UNDEF,169,KV_UNDEF,48,KV_UNDEF,48,KV_UNDEF,22,KV_UNDEF,22,KV_UNDEF,327,KV_UNDEF,327,KV_UNDEF,200,KV_UNDEF,361,KV_UNDEF,361,KV_UNDEF,341,KV_UNDEF bpf,357,KV_UNDEF,321,KV_UNDEF,321,KV_UNDEF,386,KV_UNDEF,280,KV_UNDEF,280,KV_UNDEF,354,KV_UNDEF,355,KV_UNDEF,315,KV_UNDEF,319,KV_UNDEF,341,KV_UNDEF,341,KV_UNDEF,361,KV_UNDEF,361,KV_UNDEF,280,KV_UNDEF,351,KV_UNDEF,351,KV_UNDEF,375,KV_UNDEF break,17,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,17,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,17,KV_UNDEF,17,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF breakpoint,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,983041,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF brk,45,KV_UNDEF,12,KV_UNDEF,12,KV_UNDEF,45,KV_UNDEF,214,KV_UNDEF,214,KV_UNDEF,45,KV_UNDEF,45,KV_UNDEF,12,KV_UNDEF,12,KV_UNDEF,45,KV_UNDEF,45,KV_UNDEF,45,KV_UNDEF,45,KV_UNDEF,214,KV_UNDEF,45,KV_UNDEF,45,KV_UNDEF,45,KV_UNDEF cachectl,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,148,KV_UNDEF,198,KV_UNDEF,198,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF cacheflush,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,983042,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,123,KV_UNDEF,147,KV_UNDEF,197,KV_UNDEF,197,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,123,KV_UNDEF capget,184,KV_UNDEF,125,KV_UNDEF,125,KV_UNDEF,184,KV_UNDEF,90,KV_UNDEF,90,KV_UNDEF,184,KV_UNDEF,204,KV_UNDEF,123,KV_UNDEF,123,KV_UNDEF,106,KV_UNDEF,106,KV_UNDEF,183,KV_UNDEF,183,KV_UNDEF,90,KV_UNDEF,184,KV_UNDEF,184,KV_UNDEF,184,KV_UNDEF capset,185,KV_UNDEF,126,KV_UNDEF,126,KV_UNDEF,185,KV_UNDEF,91,KV_UNDEF,91,KV_UNDEF,185,KV_UNDEF,205,KV_UNDEF,124,KV_UNDEF,124,KV_UNDEF,107,KV_UNDEF,107,KV_UNDEF,184,KV_UNDEF,184,KV_UNDEF,91,KV_UNDEF,185,KV_UNDEF,185,KV_UNDEF,185,KV_UNDEF chdir,12,KV_UNDEF,80,KV_UNDEF,80,KV_UNDEF,12,KV_UNDEF,49,KV_UNDEF,49,KV_UNDEF,12,KV_UNDEF,12,KV_UNDEF,78,KV_UNDEF,78,KV_UNDEF,12,KV_UNDEF,12,KV_UNDEF,12,KV_UNDEF,12,KV_UNDEF,49,KV_UNDEF,12,KV_UNDEF,12,KV_UNDEF,12,KV_UNDEF chmod,15,KV_UNDEF,90,KV_UNDEF,90,KV_UNDEF,15,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,15,KV_UNDEF,15,KV_UNDEF,88,KV_UNDEF,88,KV_UNDEF,15,KV_UNDEF,15,KV_UNDEF,15,KV_UNDEF,15,KV_UNDEF,PNR,KV_UNDEF,15,KV_UNDEF,15,KV_UNDEF,15,KV_UNDEF chown,182,KV_UNDEF,92,KV_UNDEF,92,KV_UNDEF,182,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,16,KV_UNDEF,202,KV_UNDEF,90,KV_UNDEF,90,KV_UNDEF,180,KV_UNDEF,180,KV_UNDEF,181,KV_UNDEF,181,KV_UNDEF,PNR,KV_UNDEF,182,KV_UNDEF,212,KV_UNDEF,182,KV_UNDEF chown32,212,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,212,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,198,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,212,KV_UNDEF,PNR,KV_UNDEF,212,KV_UNDEF chroot,61,KV_UNDEF,161,KV_UNDEF,161,KV_UNDEF,61,KV_UNDEF,51,KV_UNDEF,51,KV_UNDEF,61,KV_UNDEF,61,KV_UNDEF,156,KV_UNDEF,156,KV_UNDEF,61,KV_UNDEF,61,KV_UNDEF,61,KV_UNDEF,61,KV_UNDEF,51,KV_UNDEF,61,KV_UNDEF,61,KV_UNDEF,61,KV_UNDEF clock_adjtime,343,KV_UNDEF,305,KV_UNDEF,305,KV_UNDEF,372,KV_UNDEF,266,KV_UNDEF,266,KV_UNDEF,342,KV_UNDEF,341,KV_UNDEF,300,KV_UNDEF,305,KV_UNDEF,324,KV_UNDEF,324,KV_UNDEF,347,KV_UNDEF,347,KV_UNDEF,266,KV_UNDEF,337,KV_UNDEF,337,KV_UNDEF,361,KV_UNDEF clock_adjtime64,405,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,405,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,405,KV_UNDEF,405,KV_UNDEF,PNR,KV_UNDEF,405,KV_UNDEF,405,KV_UNDEF,PNR,KV_UNDEF,405,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,405,KV_UNDEF,PNR,KV_UNDEF,405,KV_UNDEF clock_getres,266,KV_UNDEF,229,KV_UNDEF,229,KV_UNDEF,264,KV_UNDEF,114,KV_UNDEF,114,KV_UNDEF,261,KV_UNDEF,264,KV_UNDEF,223,KV_UNDEF,227,KV_UNDEF,257,KV_UNDEF,257,KV_UNDEF,247,KV_UNDEF,247,KV_UNDEF,114,KV_UNDEF,261,KV_UNDEF,261,KV_UNDEF,266,KV_UNDEF clock_getres_time64,406,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,406,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,406,KV_UNDEF,406,KV_UNDEF,PNR,KV_UNDEF,406,KV_UNDEF,406,KV_UNDEF,PNR,KV_UNDEF,406,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,406,KV_UNDEF,PNR,KV_UNDEF,406,KV_UNDEF clock_gettime,265,KV_UNDEF,228,KV_UNDEF,228,KV_UNDEF,263,KV_UNDEF,113,KV_UNDEF,113,KV_UNDEF,260,KV_UNDEF,263,KV_UNDEF,222,KV_UNDEF,226,KV_UNDEF,256,KV_UNDEF,256,KV_UNDEF,246,KV_UNDEF,246,KV_UNDEF,113,KV_UNDEF,260,KV_UNDEF,260,KV_UNDEF,265,KV_UNDEF clock_gettime64,403,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,403,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,403,KV_UNDEF,403,KV_UNDEF,PNR,KV_UNDEF,403,KV_UNDEF,403,KV_UNDEF,PNR,KV_UNDEF,403,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,403,KV_UNDEF,PNR,KV_UNDEF,403,KV_UNDEF clock_nanosleep,267,KV_UNDEF,230,KV_UNDEF,230,KV_UNDEF,265,KV_UNDEF,115,KV_UNDEF,115,KV_UNDEF,262,KV_UNDEF,265,KV_UNDEF,224,KV_UNDEF,228,KV_UNDEF,258,KV_UNDEF,258,KV_UNDEF,248,KV_UNDEF,248,KV_UNDEF,115,KV_UNDEF,262,KV_UNDEF,262,KV_UNDEF,267,KV_UNDEF clock_nanosleep_time64,407,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,407,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,407,KV_UNDEF,407,KV_UNDEF,PNR,KV_UNDEF,407,KV_UNDEF,407,KV_UNDEF,PNR,KV_UNDEF,407,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,407,KV_UNDEF,PNR,KV_UNDEF,407,KV_UNDEF clock_settime,264,KV_UNDEF,227,KV_UNDEF,227,KV_UNDEF,262,KV_UNDEF,112,KV_UNDEF,112,KV_UNDEF,259,KV_UNDEF,262,KV_UNDEF,221,KV_UNDEF,225,KV_UNDEF,255,KV_UNDEF,255,KV_UNDEF,245,KV_UNDEF,245,KV_UNDEF,112,KV_UNDEF,259,KV_UNDEF,259,KV_UNDEF,264,KV_UNDEF clock_settime64,404,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,404,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,404,KV_UNDEF,404,KV_UNDEF,PNR,KV_UNDEF,404,KV_UNDEF,404,KV_UNDEF,PNR,KV_UNDEF,404,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,404,KV_UNDEF,PNR,KV_UNDEF,404,KV_UNDEF clone,120,KV_UNDEF,56,KV_UNDEF,56,KV_UNDEF,120,KV_UNDEF,220,KV_UNDEF,220,KV_UNDEF,120,KV_UNDEF,120,KV_UNDEF,55,KV_UNDEF,55,KV_UNDEF,120,KV_UNDEF,120,KV_UNDEF,120,KV_UNDEF,120,KV_UNDEF,220,KV_UNDEF,120,KV_UNDEF,120,KV_UNDEF,120,KV_UNDEF clone3,435,KV_UNDEF,435,KV_UNDEF,435,KV_UNDEF,435,KV_UNDEF,435,KV_UNDEF,435,KV_UNDEF,435,KV_UNDEF,435,KV_UNDEF,435,KV_UNDEF,435,KV_UNDEF,435,KV_UNDEF,435,KV_UNDEF,435,KV_UNDEF,435,KV_UNDEF,435,KV_UNDEF,435,KV_UNDEF,435,KV_UNDEF,PNR,KV_UNDEF close,6,KV_UNDEF,3,KV_UNDEF,3,KV_UNDEF,6,KV_UNDEF,57,KV_UNDEF,57,KV_UNDEF,6,KV_UNDEF,6,KV_UNDEF,3,KV_UNDEF,3,KV_UNDEF,6,KV_UNDEF,6,KV_UNDEF,6,KV_UNDEF,6,KV_UNDEF,57,KV_UNDEF,6,KV_UNDEF,6,KV_UNDEF,6,KV_UNDEF close_range,436,KV_UNDEF,436,KV_UNDEF,436,KV_UNDEF,436,KV_UNDEF,436,KV_UNDEF,436,KV_UNDEF,436,KV_UNDEF,436,KV_UNDEF,436,KV_UNDEF,436,KV_UNDEF,436,KV_UNDEF,436,KV_UNDEF,436,KV_UNDEF,436,KV_UNDEF,436,KV_UNDEF,436,KV_UNDEF,436,KV_UNDEF,436,KV_UNDEF connect,362,KV_UNDEF,42,KV_UNDEF,42,KV_UNDEF,283,KV_UNDEF,203,KV_UNDEF,203,KV_UNDEF,359,KV_UNDEF,170,KV_UNDEF,41,KV_UNDEF,41,KV_UNDEF,31,KV_UNDEF,31,KV_UNDEF,328,KV_UNDEF,328,KV_UNDEF,203,KV_UNDEF,362,KV_UNDEF,362,KV_UNDEF,342,KV_UNDEF copy_file_range,377,KV_UNDEF,326,KV_UNDEF,326,KV_UNDEF,391,KV_UNDEF,285,KV_UNDEF,285,KV_UNDEF,376,KV_UNDEF,360,KV_UNDEF,320,KV_UNDEF,324,KV_UNDEF,346,KV_UNDEF,346,KV_UNDEF,379,KV_UNDEF,379,KV_UNDEF,285,KV_UNDEF,375,KV_UNDEF,375,KV_UNDEF,380,KV_UNDEF creat,8,KV_UNDEF,85,KV_UNDEF,85,KV_UNDEF,8,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,8,KV_UNDEF,8,KV_UNDEF,83,KV_UNDEF,83,KV_UNDEF,8,KV_UNDEF,8,KV_UNDEF,8,KV_UNDEF,8,KV_UNDEF,PNR,KV_UNDEF,8,KV_UNDEF,8,KV_UNDEF,8,KV_UNDEF create_module,127,KV_UNDEF,174,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,127,KV_UNDEF,127,KV_UNDEF,167,KV_UNDEF,167,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,127,KV_UNDEF,127,KV_UNDEF,PNR,KV_UNDEF,127,KV_UNDEF,127,KV_UNDEF,PNR,KV_UNDEF delete_module,129,KV_UNDEF,176,KV_UNDEF,176,KV_UNDEF,129,KV_UNDEF,106,KV_UNDEF,106,KV_UNDEF,129,KV_UNDEF,129,KV_UNDEF,169,KV_UNDEF,169,KV_UNDEF,129,KV_UNDEF,129,KV_UNDEF,129,KV_UNDEF,129,KV_UNDEF,106,KV_UNDEF,129,KV_UNDEF,129,KV_UNDEF,129,KV_UNDEF dup,41,KV_UNDEF,32,KV_UNDEF,32,KV_UNDEF,41,KV_UNDEF,23,KV_UNDEF,23,KV_UNDEF,41,KV_UNDEF,41,KV_UNDEF,31,KV_UNDEF,31,KV_UNDEF,41,KV_UNDEF,41,KV_UNDEF,41,KV_UNDEF,41,KV_UNDEF,23,KV_UNDEF,41,KV_UNDEF,41,KV_UNDEF,41,KV_UNDEF dup2,63,KV_UNDEF,33,KV_UNDEF,33,KV_UNDEF,63,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,63,KV_UNDEF,63,KV_UNDEF,32,KV_UNDEF,32,KV_UNDEF,63,KV_UNDEF,63,KV_UNDEF,63,KV_UNDEF,63,KV_UNDEF,PNR,KV_UNDEF,63,KV_UNDEF,63,KV_UNDEF,63,KV_UNDEF dup3,330,KV_UNDEF,292,KV_UNDEF,292,KV_UNDEF,358,KV_UNDEF,24,KV_UNDEF,24,KV_UNDEF,326,KV_UNDEF,327,KV_UNDEF,286,KV_UNDEF,290,KV_UNDEF,312,KV_UNDEF,312,KV_UNDEF,316,KV_UNDEF,316,KV_UNDEF,24,KV_UNDEF,326,KV_UNDEF,326,KV_UNDEF,330,KV_UNDEF epoll_create,254,KV_UNDEF,213,KV_UNDEF,213,KV_UNDEF,250,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,249,KV_UNDEF,248,KV_UNDEF,207,KV_UNDEF,207,KV_UNDEF,224,KV_UNDEF,224,KV_UNDEF,236,KV_UNDEF,236,KV_UNDEF,PNR,KV_UNDEF,249,KV_UNDEF,249,KV_UNDEF,254,KV_UNDEF epoll_create1,329,KV_UNDEF,291,KV_UNDEF,291,KV_UNDEF,357,KV_UNDEF,20,KV_UNDEF,20,KV_UNDEF,325,KV_UNDEF,326,KV_UNDEF,285,KV_UNDEF,289,KV_UNDEF,311,KV_UNDEF,311,KV_UNDEF,315,KV_UNDEF,315,KV_UNDEF,20,KV_UNDEF,327,KV_UNDEF,327,KV_UNDEF,329,KV_UNDEF epoll_ctl,255,KV_UNDEF,233,KV_UNDEF,233,KV_UNDEF,251,KV_UNDEF,21,KV_UNDEF,21,KV_UNDEF,250,KV_UNDEF,249,KV_UNDEF,208,KV_UNDEF,208,KV_UNDEF,225,KV_UNDEF,225,KV_UNDEF,237,KV_UNDEF,237,KV_UNDEF,21,KV_UNDEF,250,KV_UNDEF,250,KV_UNDEF,255,KV_UNDEF epoll_ctl_old,PNR,KV_UNDEF,214,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF epoll_pwait,319,KV_UNDEF,281,KV_UNDEF,281,KV_UNDEF,346,KV_UNDEF,22,KV_UNDEF,22,KV_UNDEF,315,KV_UNDEF,313,KV_UNDEF,272,KV_UNDEF,276,KV_UNDEF,297,KV_UNDEF,297,KV_UNDEF,303,KV_UNDEF,303,KV_UNDEF,22,KV_UNDEF,312,KV_UNDEF,312,KV_UNDEF,319,KV_UNDEF epoll_pwait2,441,KV_UNDEF,441,KV_UNDEF,441,KV_UNDEF,441,KV_UNDEF,441,KV_UNDEF,441,KV_UNDEF,441,KV_UNDEF,441,KV_UNDEF,441,KV_UNDEF,441,KV_UNDEF,441,KV_UNDEF,441,KV_UNDEF,441,KV_UNDEF,441,KV_UNDEF,441,KV_UNDEF,441,KV_UNDEF,441,KV_UNDEF,441,KV_UNDEF epoll_wait,256,KV_UNDEF,232,KV_UNDEF,232,KV_UNDEF,252,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,251,KV_UNDEF,250,KV_UNDEF,209,KV_UNDEF,209,KV_UNDEF,226,KV_UNDEF,226,KV_UNDEF,238,KV_UNDEF,238,KV_UNDEF,PNR,KV_UNDEF,251,KV_UNDEF,251,KV_UNDEF,256,KV_UNDEF epoll_wait_old,PNR,KV_UNDEF,215,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF eventfd,323,KV_UNDEF,284,KV_UNDEF,284,KV_UNDEF,351,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,319,KV_UNDEF,319,KV_UNDEF,278,KV_UNDEF,282,KV_UNDEF,304,KV_UNDEF,304,KV_UNDEF,307,KV_UNDEF,307,KV_UNDEF,PNR,KV_UNDEF,318,KV_UNDEF,318,KV_UNDEF,323,KV_UNDEF eventfd2,328,KV_UNDEF,290,KV_UNDEF,290,KV_UNDEF,356,KV_UNDEF,19,KV_UNDEF,19,KV_UNDEF,324,KV_UNDEF,325,KV_UNDEF,284,KV_UNDEF,288,KV_UNDEF,310,KV_UNDEF,310,KV_UNDEF,314,KV_UNDEF,314,KV_UNDEF,19,KV_UNDEF,323,KV_UNDEF,323,KV_UNDEF,328,KV_UNDEF execve,11,KV_UNDEF,59,KV_UNDEF,520,KV_UNDEF,11,KV_UNDEF,221,KV_UNDEF,221,KV_UNDEF,11,KV_UNDEF,11,KV_UNDEF,57,KV_UNDEF,57,KV_UNDEF,11,KV_UNDEF,11,KV_UNDEF,11,KV_UNDEF,11,KV_UNDEF,221,KV_UNDEF,11,KV_UNDEF,11,KV_UNDEF,11,KV_UNDEF execveat,358,KV_UNDEF,322,KV_UNDEF,545,KV_UNDEF,387,KV_UNDEF,281,KV_UNDEF,281,KV_UNDEF,355,KV_UNDEF,356,KV_UNDEF,316,KV_UNDEF,320,KV_UNDEF,342,KV_UNDEF,342,KV_UNDEF,362,KV_UNDEF,362,KV_UNDEF,281,KV_UNDEF,354,KV_UNDEF,354,KV_UNDEF,376,KV_UNDEF exit,1,KV_UNDEF,60,KV_UNDEF,60,KV_UNDEF,1,KV_UNDEF,93,KV_UNDEF,93,KV_UNDEF,1,KV_UNDEF,1,KV_UNDEF,58,KV_UNDEF,58,KV_UNDEF,1,KV_UNDEF,1,KV_UNDEF,1,KV_UNDEF,1,KV_UNDEF,93,KV_UNDEF,1,KV_UNDEF,1,KV_UNDEF,1,KV_UNDEF exit_group,252,KV_UNDEF,231,KV_UNDEF,231,KV_UNDEF,248,KV_UNDEF,94,KV_UNDEF,94,KV_UNDEF,247,KV_UNDEF,246,KV_UNDEF,205,KV_UNDEF,205,KV_UNDEF,222,KV_UNDEF,222,KV_UNDEF,234,KV_UNDEF,234,KV_UNDEF,94,KV_UNDEF,248,KV_UNDEF,248,KV_UNDEF,252,KV_UNDEF faccessat,307,KV_UNDEF,269,KV_UNDEF,269,KV_UNDEF,334,KV_UNDEF,48,KV_UNDEF,48,KV_UNDEF,300,KV_UNDEF,300,KV_UNDEF,259,KV_UNDEF,263,KV_UNDEF,287,KV_UNDEF,287,KV_UNDEF,298,KV_UNDEF,298,KV_UNDEF,48,KV_UNDEF,300,KV_UNDEF,300,KV_UNDEF,307,KV_UNDEF faccessat2,439,KV_UNDEF,439,KV_UNDEF,439,KV_UNDEF,439,KV_UNDEF,439,KV_UNDEF,439,KV_UNDEF,439,KV_UNDEF,439,KV_UNDEF,439,KV_UNDEF,439,KV_UNDEF,439,KV_UNDEF,439,KV_UNDEF,439,KV_UNDEF,439,KV_UNDEF,439,KV_UNDEF,439,KV_UNDEF,439,KV_UNDEF,439,KV_UNDEF fadvise64,250,KV_UNDEF,221,KV_UNDEF,221,KV_UNDEF,PNR,KV_UNDEF,223,KV_UNDEF,223,KV_UNDEF,246,KV_UNDEF,254,KV_UNDEF,215,KV_UNDEF,216,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,233,KV_UNDEF,233,KV_UNDEF,223,KV_UNDEF,253,KV_UNDEF,253,KV_UNDEF,250,KV_UNDEF fadvise64_64,272,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,267,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,236,KV_UNDEF,236,KV_UNDEF,254,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,264,KV_UNDEF,PNR,KV_UNDEF,272,KV_UNDEF fallocate,324,KV_UNDEF,285,KV_UNDEF,285,KV_UNDEF,352,KV_UNDEF,47,KV_UNDEF,47,KV_UNDEF,320,KV_UNDEF,320,KV_UNDEF,279,KV_UNDEF,283,KV_UNDEF,305,KV_UNDEF,305,KV_UNDEF,309,KV_UNDEF,309,KV_UNDEF,47,KV_UNDEF,314,KV_UNDEF,314,KV_UNDEF,324,KV_UNDEF fanotify_init,338,KV_UNDEF,300,KV_UNDEF,300,KV_UNDEF,367,KV_UNDEF,262,KV_UNDEF,262,KV_UNDEF,337,KV_UNDEF,336,KV_UNDEF,295,KV_UNDEF,300,KV_UNDEF,322,KV_UNDEF,322,KV_UNDEF,323,KV_UNDEF,323,KV_UNDEF,262,KV_UNDEF,332,KV_UNDEF,332,KV_UNDEF,337,KV_UNDEF fanotify_mark,339,KV_UNDEF,301,KV_UNDEF,301,KV_UNDEF,368,KV_UNDEF,263,KV_UNDEF,263,KV_UNDEF,338,KV_UNDEF,337,KV_UNDEF,296,KV_UNDEF,301,KV_UNDEF,323,KV_UNDEF,323,KV_UNDEF,324,KV_UNDEF,324,KV_UNDEF,263,KV_UNDEF,333,KV_UNDEF,333,KV_UNDEF,338,KV_UNDEF fchdir,133,KV_UNDEF,81,KV_UNDEF,81,KV_UNDEF,133,KV_UNDEF,50,KV_UNDEF,50,KV_UNDEF,133,KV_UNDEF,133,KV_UNDEF,79,KV_UNDEF,79,KV_UNDEF,133,KV_UNDEF,133,KV_UNDEF,133,KV_UNDEF,133,KV_UNDEF,50,KV_UNDEF,133,KV_UNDEF,133,KV_UNDEF,133,KV_UNDEF fchmod,94,KV_UNDEF,91,KV_UNDEF,91,KV_UNDEF,94,KV_UNDEF,52,KV_UNDEF,52,KV_UNDEF,94,KV_UNDEF,94,KV_UNDEF,89,KV_UNDEF,89,KV_UNDEF,94,KV_UNDEF,94,KV_UNDEF,94,KV_UNDEF,94,KV_UNDEF,52,KV_UNDEF,94,KV_UNDEF,94,KV_UNDEF,94,KV_UNDEF fchmodat,306,KV_UNDEF,268,KV_UNDEF,268,KV_UNDEF,333,KV_UNDEF,53,KV_UNDEF,53,KV_UNDEF,299,KV_UNDEF,299,KV_UNDEF,258,KV_UNDEF,262,KV_UNDEF,286,KV_UNDEF,286,KV_UNDEF,297,KV_UNDEF,297,KV_UNDEF,53,KV_UNDEF,299,KV_UNDEF,299,KV_UNDEF,306,KV_UNDEF fchown,95,KV_UNDEF,93,KV_UNDEF,93,KV_UNDEF,95,KV_UNDEF,55,KV_UNDEF,55,KV_UNDEF,95,KV_UNDEF,95,KV_UNDEF,91,KV_UNDEF,91,KV_UNDEF,95,KV_UNDEF,95,KV_UNDEF,95,KV_UNDEF,95,KV_UNDEF,55,KV_UNDEF,95,KV_UNDEF,207,KV_UNDEF,95,KV_UNDEF fchown32,207,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,207,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,207,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,207,KV_UNDEF,PNR,KV_UNDEF,207,KV_UNDEF fchownat,298,KV_UNDEF,260,KV_UNDEF,260,KV_UNDEF,325,KV_UNDEF,54,KV_UNDEF,54,KV_UNDEF,291,KV_UNDEF,291,KV_UNDEF,250,KV_UNDEF,254,KV_UNDEF,278,KV_UNDEF,278,KV_UNDEF,289,KV_UNDEF,289,KV_UNDEF,54,KV_UNDEF,291,KV_UNDEF,291,KV_UNDEF,298,KV_UNDEF fcntl,55,KV_UNDEF,72,KV_UNDEF,72,KV_UNDEF,55,KV_UNDEF,25,KV_UNDEF,25,KV_UNDEF,55,KV_UNDEF,55,KV_UNDEF,70,KV_UNDEF,70,KV_UNDEF,55,KV_UNDEF,55,KV_UNDEF,55,KV_UNDEF,55,KV_UNDEF,25,KV_UNDEF,55,KV_UNDEF,55,KV_UNDEF,55,KV_UNDEF fcntl64,221,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,221,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,239,KV_UNDEF,220,KV_UNDEF,PNR,KV_UNDEF,212,KV_UNDEF,202,KV_UNDEF,202,KV_UNDEF,204,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,221,KV_UNDEF,PNR,KV_UNDEF,221,KV_UNDEF fdatasync,148,KV_UNDEF,75,KV_UNDEF,75,KV_UNDEF,148,KV_UNDEF,83,KV_UNDEF,83,KV_UNDEF,148,KV_UNDEF,152,KV_UNDEF,73,KV_UNDEF,73,KV_UNDEF,148,KV_UNDEF,148,KV_UNDEF,148,KV_UNDEF,148,KV_UNDEF,83,KV_UNDEF,148,KV_UNDEF,148,KV_UNDEF,148,KV_UNDEF fgetxattr,231,KV_UNDEF,193,KV_UNDEF,193,KV_UNDEF,231,KV_UNDEF,10,KV_UNDEF,10,KV_UNDEF,228,KV_UNDEF,229,KV_UNDEF,185,KV_UNDEF,185,KV_UNDEF,243,KV_UNDEF,243,KV_UNDEF,214,KV_UNDEF,214,KV_UNDEF,10,KV_UNDEF,229,KV_UNDEF,229,KV_UNDEF,231,KV_UNDEF finit_module,350,KV_UNDEF,313,KV_UNDEF,313,KV_UNDEF,379,KV_UNDEF,273,KV_UNDEF,273,KV_UNDEF,348,KV_UNDEF,348,KV_UNDEF,307,KV_UNDEF,312,KV_UNDEF,333,KV_UNDEF,333,KV_UNDEF,353,KV_UNDEF,353,KV_UNDEF,273,KV_UNDEF,344,KV_UNDEF,344,KV_UNDEF,368,KV_UNDEF flistxattr,234,KV_UNDEF,196,KV_UNDEF,196,KV_UNDEF,234,KV_UNDEF,13,KV_UNDEF,13,KV_UNDEF,231,KV_UNDEF,232,KV_UNDEF,188,KV_UNDEF,188,KV_UNDEF,246,KV_UNDEF,246,KV_UNDEF,217,KV_UNDEF,217,KV_UNDEF,13,KV_UNDEF,232,KV_UNDEF,232,KV_UNDEF,234,KV_UNDEF flock,143,KV_UNDEF,73,KV_UNDEF,73,KV_UNDEF,143,KV_UNDEF,32,KV_UNDEF,32,KV_UNDEF,143,KV_UNDEF,143,KV_UNDEF,71,KV_UNDEF,71,KV_UNDEF,143,KV_UNDEF,143,KV_UNDEF,143,KV_UNDEF,143,KV_UNDEF,32,KV_UNDEF,143,KV_UNDEF,143,KV_UNDEF,143,KV_UNDEF fork,2,KV_UNDEF,57,KV_UNDEF,57,KV_UNDEF,2,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,2,KV_UNDEF,2,KV_UNDEF,56,KV_UNDEF,56,KV_UNDEF,2,KV_UNDEF,2,KV_UNDEF,2,KV_UNDEF,2,KV_UNDEF,PNR,KV_UNDEF,2,KV_UNDEF,2,KV_UNDEF,2,KV_UNDEF fremovexattr,237,KV_UNDEF,199,KV_UNDEF,199,KV_UNDEF,237,KV_UNDEF,16,KV_UNDEF,16,KV_UNDEF,234,KV_UNDEF,235,KV_UNDEF,191,KV_UNDEF,191,KV_UNDEF,249,KV_UNDEF,249,KV_UNDEF,220,KV_UNDEF,220,KV_UNDEF,16,KV_UNDEF,235,KV_UNDEF,235,KV_UNDEF,237,KV_UNDEF fsconfig,431,KV_UNDEF,431,KV_UNDEF,431,KV_UNDEF,431,KV_UNDEF,431,KV_UNDEF,431,KV_UNDEF,431,KV_UNDEF,431,KV_UNDEF,431,KV_UNDEF,431,KV_UNDEF,431,KV_UNDEF,431,KV_UNDEF,431,KV_UNDEF,431,KV_UNDEF,431,KV_UNDEF,431,KV_UNDEF,431,KV_UNDEF,431,KV_UNDEF fsetxattr,228,KV_UNDEF,190,KV_UNDEF,190,KV_UNDEF,228,KV_UNDEF,7,KV_UNDEF,7,KV_UNDEF,225,KV_UNDEF,226,KV_UNDEF,182,KV_UNDEF,182,KV_UNDEF,240,KV_UNDEF,240,KV_UNDEF,211,KV_UNDEF,211,KV_UNDEF,7,KV_UNDEF,226,KV_UNDEF,226,KV_UNDEF,228,KV_UNDEF fsmount,432,KV_UNDEF,432,KV_UNDEF,432,KV_UNDEF,432,KV_UNDEF,432,KV_UNDEF,432,KV_UNDEF,432,KV_UNDEF,432,KV_UNDEF,432,KV_UNDEF,432,KV_UNDEF,432,KV_UNDEF,432,KV_UNDEF,432,KV_UNDEF,432,KV_UNDEF,432,KV_UNDEF,432,KV_UNDEF,432,KV_UNDEF,432,KV_UNDEF fsopen,430,KV_UNDEF,430,KV_UNDEF,430,KV_UNDEF,430,KV_UNDEF,430,KV_UNDEF,430,KV_UNDEF,430,KV_UNDEF,430,KV_UNDEF,430,KV_UNDEF,430,KV_UNDEF,430,KV_UNDEF,430,KV_UNDEF,430,KV_UNDEF,430,KV_UNDEF,430,KV_UNDEF,430,KV_UNDEF,430,KV_UNDEF,430,KV_UNDEF fspick,433,KV_UNDEF,433,KV_UNDEF,433,KV_UNDEF,433,KV_UNDEF,433,KV_UNDEF,433,KV_UNDEF,433,KV_UNDEF,433,KV_UNDEF,433,KV_UNDEF,433,KV_UNDEF,433,KV_UNDEF,433,KV_UNDEF,433,KV_UNDEF,433,KV_UNDEF,433,KV_UNDEF,433,KV_UNDEF,433,KV_UNDEF,433,KV_UNDEF fstat,108,KV_UNDEF,5,KV_UNDEF,5,KV_UNDEF,108,KV_UNDEF,80,KV_UNDEF,PNR,KV_UNDEF,108,KV_UNDEF,108,KV_UNDEF,5,KV_UNDEF,5,KV_UNDEF,28,KV_UNDEF,28,KV_UNDEF,108,KV_UNDEF,108,KV_UNDEF,80,KV_UNDEF,108,KV_UNDEF,108,KV_UNDEF,108,KV_UNDEF fstat64,197,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,197,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,197,KV_UNDEF,215,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,112,KV_UNDEF,112,KV_UNDEF,197,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,197,KV_UNDEF,PNR,KV_UNDEF,197,KV_UNDEF fstatat64,300,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,327,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,293,KV_UNDEF,293,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,280,KV_UNDEF,280,KV_UNDEF,291,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,293,KV_UNDEF,PNR,KV_UNDEF,300,KV_UNDEF fstatfs,100,KV_UNDEF,138,KV_UNDEF,138,KV_UNDEF,100,KV_UNDEF,44,KV_UNDEF,44,KV_UNDEF,100,KV_UNDEF,100,KV_UNDEF,135,KV_UNDEF,135,KV_UNDEF,100,KV_UNDEF,100,KV_UNDEF,100,KV_UNDEF,100,KV_UNDEF,44,KV_UNDEF,100,KV_UNDEF,100,KV_UNDEF,100,KV_UNDEF fstatfs64,269,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,267,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,264,KV_UNDEF,256,KV_UNDEF,PNR,KV_UNDEF,218,KV_UNDEF,299,KV_UNDEF,299,KV_UNDEF,253,KV_UNDEF,253,KV_UNDEF,PNR,KV_UNDEF,266,KV_UNDEF,266,KV_UNDEF,269,KV_UNDEF fsync,118,KV_UNDEF,74,KV_UNDEF,74,KV_UNDEF,118,KV_UNDEF,82,KV_UNDEF,82,KV_UNDEF,118,KV_UNDEF,118,KV_UNDEF,72,KV_UNDEF,72,KV_UNDEF,118,KV_UNDEF,118,KV_UNDEF,118,KV_UNDEF,118,KV_UNDEF,82,KV_UNDEF,118,KV_UNDEF,118,KV_UNDEF,118,KV_UNDEF ftime,35,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,35,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,35,KV_UNDEF,35,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF ftruncate,93,KV_UNDEF,77,KV_UNDEF,77,KV_UNDEF,93,KV_UNDEF,46,KV_UNDEF,46,KV_UNDEF,93,KV_UNDEF,93,KV_UNDEF,75,KV_UNDEF,75,KV_UNDEF,93,KV_UNDEF,93,KV_UNDEF,93,KV_UNDEF,93,KV_UNDEF,46,KV_UNDEF,93,KV_UNDEF,93,KV_UNDEF,93,KV_UNDEF ftruncate64,194,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,194,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,194,KV_UNDEF,212,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,200,KV_UNDEF,200,KV_UNDEF,194,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,194,KV_UNDEF,PNR,KV_UNDEF,194,KV_UNDEF futex,240,KV_UNDEF,202,KV_UNDEF,202,KV_UNDEF,240,KV_UNDEF,98,KV_UNDEF,98,KV_UNDEF,235,KV_UNDEF,238,KV_UNDEF,194,KV_UNDEF,194,KV_UNDEF,210,KV_UNDEF,210,KV_UNDEF,221,KV_UNDEF,221,KV_UNDEF,98,KV_UNDEF,238,KV_UNDEF,238,KV_UNDEF,240,KV_UNDEF futex_time64,422,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,422,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,422,KV_UNDEF,422,KV_UNDEF,PNR,KV_UNDEF,422,KV_UNDEF,422,KV_UNDEF,PNR,KV_UNDEF,422,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,422,KV_UNDEF,PNR,KV_UNDEF,422,KV_UNDEF futex_waitv,449,KV_UNDEF,449,KV_UNDEF,449,KV_UNDEF,449,KV_UNDEF,449,KV_UNDEF,449,KV_UNDEF,449,KV_UNDEF,449,KV_UNDEF,449,KV_UNDEF,449,KV_UNDEF,449,KV_UNDEF,449,KV_UNDEF,449,KV_UNDEF,449,KV_UNDEF,449,KV_UNDEF,449,KV_UNDEF,449,KV_UNDEF,449,KV_UNDEF futimesat,299,KV_UNDEF,261,KV_UNDEF,261,KV_UNDEF,326,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,292,KV_UNDEF,292,KV_UNDEF,251,KV_UNDEF,255,KV_UNDEF,279,KV_UNDEF,279,KV_UNDEF,290,KV_UNDEF,290,KV_UNDEF,PNR,KV_UNDEF,292,KV_UNDEF,292,KV_UNDEF,299,KV_UNDEF getcpu,318,KV_UNDEF,309,KV_UNDEF,309,KV_UNDEF,345,KV_UNDEF,168,KV_UNDEF,168,KV_UNDEF,314,KV_UNDEF,312,KV_UNDEF,271,KV_UNDEF,275,KV_UNDEF,296,KV_UNDEF,296,KV_UNDEF,302,KV_UNDEF,302,KV_UNDEF,168,KV_UNDEF,311,KV_UNDEF,311,KV_UNDEF,318,KV_UNDEF getcwd,183,KV_UNDEF,79,KV_UNDEF,79,KV_UNDEF,183,KV_UNDEF,17,KV_UNDEF,17,KV_UNDEF,183,KV_UNDEF,203,KV_UNDEF,77,KV_UNDEF,77,KV_UNDEF,110,KV_UNDEF,110,KV_UNDEF,182,KV_UNDEF,182,KV_UNDEF,17,KV_UNDEF,183,KV_UNDEF,183,KV_UNDEF,183,KV_UNDEF getdents,141,KV_UNDEF,78,KV_UNDEF,78,KV_UNDEF,141,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,141,KV_UNDEF,141,KV_UNDEF,76,KV_UNDEF,76,KV_UNDEF,141,KV_UNDEF,141,KV_UNDEF,141,KV_UNDEF,141,KV_UNDEF,PNR,KV_UNDEF,141,KV_UNDEF,141,KV_UNDEF,141,KV_UNDEF getdents64,220,KV_UNDEF,217,KV_UNDEF,217,KV_UNDEF,217,KV_UNDEF,61,KV_UNDEF,61,KV_UNDEF,220,KV_UNDEF,219,KV_UNDEF,308,KV_UNDEF,299,KV_UNDEF,201,KV_UNDEF,201,KV_UNDEF,202,KV_UNDEF,202,KV_UNDEF,61,KV_UNDEF,220,KV_UNDEF,220,KV_UNDEF,220,KV_UNDEF getegid,50,KV_UNDEF,108,KV_UNDEF,108,KV_UNDEF,50,KV_UNDEF,177,KV_UNDEF,177,KV_UNDEF,50,KV_UNDEF,50,KV_UNDEF,106,KV_UNDEF,106,KV_UNDEF,50,KV_UNDEF,50,KV_UNDEF,50,KV_UNDEF,50,KV_UNDEF,177,KV_UNDEF,50,KV_UNDEF,202,KV_UNDEF,50,KV_UNDEF getegid32,202,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,202,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,202,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,202,KV_UNDEF,PNR,KV_UNDEF,202,KV_UNDEF geteuid,49,KV_UNDEF,107,KV_UNDEF,107,KV_UNDEF,49,KV_UNDEF,175,KV_UNDEF,175,KV_UNDEF,49,KV_UNDEF,49,KV_UNDEF,105,KV_UNDEF,105,KV_UNDEF,49,KV_UNDEF,49,KV_UNDEF,49,KV_UNDEF,49,KV_UNDEF,175,KV_UNDEF,49,KV_UNDEF,201,KV_UNDEF,49,KV_UNDEF geteuid32,201,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,201,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,201,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,201,KV_UNDEF,PNR,KV_UNDEF,201,KV_UNDEF getgid,47,KV_UNDEF,104,KV_UNDEF,104,KV_UNDEF,47,KV_UNDEF,176,KV_UNDEF,176,KV_UNDEF,47,KV_UNDEF,47,KV_UNDEF,102,KV_UNDEF,102,KV_UNDEF,47,KV_UNDEF,47,KV_UNDEF,47,KV_UNDEF,47,KV_UNDEF,176,KV_UNDEF,47,KV_UNDEF,200,KV_UNDEF,47,KV_UNDEF getgid32,200,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,200,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,200,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,200,KV_UNDEF,PNR,KV_UNDEF,200,KV_UNDEF getgroups,80,KV_UNDEF,115,KV_UNDEF,115,KV_UNDEF,80,KV_UNDEF,158,KV_UNDEF,158,KV_UNDEF,80,KV_UNDEF,80,KV_UNDEF,113,KV_UNDEF,113,KV_UNDEF,80,KV_UNDEF,80,KV_UNDEF,80,KV_UNDEF,80,KV_UNDEF,158,KV_UNDEF,80,KV_UNDEF,205,KV_UNDEF,80,KV_UNDEF getgroups32,205,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,205,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,205,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,205,KV_UNDEF,PNR,KV_UNDEF,205,KV_UNDEF getitimer,105,KV_UNDEF,36,KV_UNDEF,36,KV_UNDEF,105,KV_UNDEF,102,KV_UNDEF,102,KV_UNDEF,105,KV_UNDEF,105,KV_UNDEF,35,KV_UNDEF,35,KV_UNDEF,105,KV_UNDEF,105,KV_UNDEF,105,KV_UNDEF,105,KV_UNDEF,102,KV_UNDEF,105,KV_UNDEF,105,KV_UNDEF,105,KV_UNDEF get_kernel_syms,130,KV_UNDEF,177,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,130,KV_UNDEF,130,KV_UNDEF,170,KV_UNDEF,170,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,130,KV_UNDEF,130,KV_UNDEF,PNR,KV_UNDEF,130,KV_UNDEF,130,KV_UNDEF,PNR,KV_UNDEF get_mempolicy,275,KV_UNDEF,239,KV_UNDEF,239,KV_UNDEF,320,KV_UNDEF,236,KV_UNDEF,236,KV_UNDEF,269,KV_UNDEF,269,KV_UNDEF,228,KV_UNDEF,232,KV_UNDEF,261,KV_UNDEF,261,KV_UNDEF,260,KV_UNDEF,260,KV_UNDEF,236,KV_UNDEF,269,KV_UNDEF,269,KV_UNDEF,275,KV_UNDEF getpagesize,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,166,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF getpeername,368,KV_UNDEF,52,KV_UNDEF,52,KV_UNDEF,287,KV_UNDEF,205,KV_UNDEF,205,KV_UNDEF,365,KV_UNDEF,171,KV_UNDEF,51,KV_UNDEF,51,KV_UNDEF,53,KV_UNDEF,53,KV_UNDEF,332,KV_UNDEF,332,KV_UNDEF,205,KV_UNDEF,368,KV_UNDEF,368,KV_UNDEF,346,KV_UNDEF getpgid,132,KV_UNDEF,121,KV_UNDEF,121,KV_UNDEF,132,KV_UNDEF,155,KV_UNDEF,155,KV_UNDEF,132,KV_UNDEF,132,KV_UNDEF,119,KV_UNDEF,119,KV_UNDEF,132,KV_UNDEF,132,KV_UNDEF,132,KV_UNDEF,132,KV_UNDEF,155,KV_UNDEF,132,KV_UNDEF,132,KV_UNDEF,132,KV_UNDEF getpgrp,65,KV_UNDEF,111,KV_UNDEF,111,KV_UNDEF,65,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,65,KV_UNDEF,65,KV_UNDEF,109,KV_UNDEF,109,KV_UNDEF,65,KV_UNDEF,65,KV_UNDEF,65,KV_UNDEF,65,KV_UNDEF,PNR,KV_UNDEF,65,KV_UNDEF,65,KV_UNDEF,65,KV_UNDEF getpid,20,KV_UNDEF,39,KV_UNDEF,39,KV_UNDEF,20,KV_UNDEF,172,KV_UNDEF,172,KV_UNDEF,20,KV_UNDEF,20,KV_UNDEF,38,KV_UNDEF,38,KV_UNDEF,20,KV_UNDEF,20,KV_UNDEF,20,KV_UNDEF,20,KV_UNDEF,172,KV_UNDEF,20,KV_UNDEF,20,KV_UNDEF,20,KV_UNDEF getpmsg,188,KV_UNDEF,181,KV_UNDEF,181,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,188,KV_UNDEF,208,KV_UNDEF,174,KV_UNDEF,174,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,187,KV_UNDEF,187,KV_UNDEF,PNR,KV_UNDEF,188,KV_UNDEF,188,KV_UNDEF,PNR,KV_UNDEF getppid,64,KV_UNDEF,110,KV_UNDEF,110,KV_UNDEF,64,KV_UNDEF,173,KV_UNDEF,173,KV_UNDEF,64,KV_UNDEF,64,KV_UNDEF,108,KV_UNDEF,108,KV_UNDEF,64,KV_UNDEF,64,KV_UNDEF,64,KV_UNDEF,64,KV_UNDEF,173,KV_UNDEF,64,KV_UNDEF,64,KV_UNDEF,64,KV_UNDEF getpriority,96,KV_UNDEF,140,KV_UNDEF,140,KV_UNDEF,96,KV_UNDEF,141,KV_UNDEF,141,KV_UNDEF,96,KV_UNDEF,96,KV_UNDEF,137,KV_UNDEF,137,KV_UNDEF,96,KV_UNDEF,96,KV_UNDEF,96,KV_UNDEF,96,KV_UNDEF,141,KV_UNDEF,96,KV_UNDEF,96,KV_UNDEF,96,KV_UNDEF getrandom,355,KV_UNDEF,318,KV_UNDEF,318,KV_UNDEF,384,KV_UNDEF,278,KV_UNDEF,278,KV_UNDEF,352,KV_UNDEF,353,KV_UNDEF,313,KV_UNDEF,317,KV_UNDEF,339,KV_UNDEF,339,KV_UNDEF,359,KV_UNDEF,359,KV_UNDEF,278,KV_UNDEF,349,KV_UNDEF,349,KV_UNDEF,373,KV_UNDEF getresgid,171,KV_UNDEF,120,KV_UNDEF,120,KV_UNDEF,171,KV_UNDEF,150,KV_UNDEF,150,KV_UNDEF,171,KV_UNDEF,191,KV_UNDEF,118,KV_UNDEF,118,KV_UNDEF,171,KV_UNDEF,171,KV_UNDEF,170,KV_UNDEF,170,KV_UNDEF,150,KV_UNDEF,171,KV_UNDEF,211,KV_UNDEF,171,KV_UNDEF getresgid32,211,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,211,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,211,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,211,KV_UNDEF,PNR,KV_UNDEF,211,KV_UNDEF getresuid,165,KV_UNDEF,118,KV_UNDEF,118,KV_UNDEF,165,KV_UNDEF,148,KV_UNDEF,148,KV_UNDEF,165,KV_UNDEF,186,KV_UNDEF,116,KV_UNDEF,116,KV_UNDEF,165,KV_UNDEF,165,KV_UNDEF,165,KV_UNDEF,165,KV_UNDEF,148,KV_UNDEF,165,KV_UNDEF,209,KV_UNDEF,165,KV_UNDEF getresuid32,209,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,209,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,209,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,209,KV_UNDEF,PNR,KV_UNDEF,209,KV_UNDEF getrlimit,76,KV_UNDEF,97,KV_UNDEF,97,KV_UNDEF,PNR,KV_UNDEF,163,KV_UNDEF,PNR,KV_UNDEF,76,KV_UNDEF,76,KV_UNDEF,95,KV_UNDEF,95,KV_UNDEF,76,KV_UNDEF,76,KV_UNDEF,76,KV_UNDEF,76,KV_UNDEF,163,KV_UNDEF,76,KV_UNDEF,191,KV_UNDEF,76,KV_UNDEF get_robust_list,312,KV_UNDEF,274,KV_UNDEF,531,KV_UNDEF,339,KV_UNDEF,100,KV_UNDEF,100,KV_UNDEF,305,KV_UNDEF,310,KV_UNDEF,269,KV_UNDEF,273,KV_UNDEF,290,KV_UNDEF,290,KV_UNDEF,299,KV_UNDEF,299,KV_UNDEF,100,KV_UNDEF,305,KV_UNDEF,305,KV_UNDEF,312,KV_UNDEF getrusage,77,KV_UNDEF,98,KV_UNDEF,98,KV_UNDEF,77,KV_UNDEF,165,KV_UNDEF,165,KV_UNDEF,77,KV_UNDEF,77,KV_UNDEF,96,KV_UNDEF,96,KV_UNDEF,77,KV_UNDEF,77,KV_UNDEF,77,KV_UNDEF,77,KV_UNDEF,165,KV_UNDEF,77,KV_UNDEF,77,KV_UNDEF,77,KV_UNDEF getsid,147,KV_UNDEF,124,KV_UNDEF,124,KV_UNDEF,147,KV_UNDEF,156,KV_UNDEF,156,KV_UNDEF,147,KV_UNDEF,151,KV_UNDEF,122,KV_UNDEF,122,KV_UNDEF,147,KV_UNDEF,147,KV_UNDEF,147,KV_UNDEF,147,KV_UNDEF,156,KV_UNDEF,147,KV_UNDEF,147,KV_UNDEF,147,KV_UNDEF getsockname,367,KV_UNDEF,51,KV_UNDEF,51,KV_UNDEF,286,KV_UNDEF,204,KV_UNDEF,204,KV_UNDEF,364,KV_UNDEF,172,KV_UNDEF,50,KV_UNDEF,50,KV_UNDEF,44,KV_UNDEF,44,KV_UNDEF,331,KV_UNDEF,331,KV_UNDEF,204,KV_UNDEF,367,KV_UNDEF,367,KV_UNDEF,345,KV_UNDEF getsockopt,365,KV_UNDEF,55,KV_UNDEF,542,KV_UNDEF,295,KV_UNDEF,209,KV_UNDEF,209,KV_UNDEF,362,KV_UNDEF,173,KV_UNDEF,54,KV_UNDEF,54,KV_UNDEF,182,KV_UNDEF,182,KV_UNDEF,340,KV_UNDEF,340,KV_UNDEF,209,KV_UNDEF,365,KV_UNDEF,365,KV_UNDEF,354,KV_UNDEF get_thread_area,244,KV_UNDEF,211,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,333,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF gettid,224,KV_UNDEF,186,KV_UNDEF,186,KV_UNDEF,224,KV_UNDEF,178,KV_UNDEF,178,KV_UNDEF,221,KV_UNDEF,222,KV_UNDEF,178,KV_UNDEF,178,KV_UNDEF,206,KV_UNDEF,206,KV_UNDEF,207,KV_UNDEF,207,KV_UNDEF,178,KV_UNDEF,236,KV_UNDEF,236,KV_UNDEF,224,KV_UNDEF gettimeofday,78,KV_UNDEF,96,KV_UNDEF,96,KV_UNDEF,78,KV_UNDEF,169,KV_UNDEF,169,KV_UNDEF,78,KV_UNDEF,78,KV_UNDEF,94,KV_UNDEF,94,KV_UNDEF,78,KV_UNDEF,78,KV_UNDEF,78,KV_UNDEF,78,KV_UNDEF,169,KV_UNDEF,78,KV_UNDEF,78,KV_UNDEF,78,KV_UNDEF get_tls,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,983046,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF getuid,24,KV_UNDEF,102,KV_UNDEF,102,KV_UNDEF,24,KV_UNDEF,174,KV_UNDEF,174,KV_UNDEF,24,KV_UNDEF,24,KV_UNDEF,100,KV_UNDEF,100,KV_UNDEF,24,KV_UNDEF,24,KV_UNDEF,24,KV_UNDEF,24,KV_UNDEF,174,KV_UNDEF,24,KV_UNDEF,199,KV_UNDEF,24,KV_UNDEF getuid32,199,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,199,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,199,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,199,KV_UNDEF,PNR,KV_UNDEF,199,KV_UNDEF getxattr,229,KV_UNDEF,191,KV_UNDEF,191,KV_UNDEF,229,KV_UNDEF,8,KV_UNDEF,8,KV_UNDEF,226,KV_UNDEF,227,KV_UNDEF,183,KV_UNDEF,183,KV_UNDEF,241,KV_UNDEF,241,KV_UNDEF,212,KV_UNDEF,212,KV_UNDEF,8,KV_UNDEF,227,KV_UNDEF,227,KV_UNDEF,229,KV_UNDEF gtty,32,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,32,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,32,KV_UNDEF,32,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF idle,112,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,112,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,112,KV_UNDEF,112,KV_UNDEF,PNR,KV_UNDEF,112,KV_UNDEF,112,KV_UNDEF,PNR,KV_UNDEF init_module,128,KV_UNDEF,175,KV_UNDEF,175,KV_UNDEF,128,KV_UNDEF,105,KV_UNDEF,105,KV_UNDEF,128,KV_UNDEF,128,KV_UNDEF,168,KV_UNDEF,168,KV_UNDEF,128,KV_UNDEF,128,KV_UNDEF,128,KV_UNDEF,128,KV_UNDEF,105,KV_UNDEF,128,KV_UNDEF,128,KV_UNDEF,128,KV_UNDEF inotify_add_watch,292,KV_UNDEF,254,KV_UNDEF,254,KV_UNDEF,317,KV_UNDEF,27,KV_UNDEF,27,KV_UNDEF,285,KV_UNDEF,285,KV_UNDEF,244,KV_UNDEF,248,KV_UNDEF,270,KV_UNDEF,270,KV_UNDEF,276,KV_UNDEF,276,KV_UNDEF,27,KV_UNDEF,285,KV_UNDEF,285,KV_UNDEF,291,KV_UNDEF inotify_init,291,KV_UNDEF,253,KV_UNDEF,253,KV_UNDEF,316,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,284,KV_UNDEF,284,KV_UNDEF,243,KV_UNDEF,247,KV_UNDEF,269,KV_UNDEF,269,KV_UNDEF,275,KV_UNDEF,275,KV_UNDEF,PNR,KV_UNDEF,284,KV_UNDEF,284,KV_UNDEF,290,KV_UNDEF inotify_init1,332,KV_UNDEF,294,KV_UNDEF,294,KV_UNDEF,360,KV_UNDEF,26,KV_UNDEF,26,KV_UNDEF,328,KV_UNDEF,329,KV_UNDEF,288,KV_UNDEF,292,KV_UNDEF,314,KV_UNDEF,314,KV_UNDEF,318,KV_UNDEF,318,KV_UNDEF,26,KV_UNDEF,324,KV_UNDEF,324,KV_UNDEF,332,KV_UNDEF inotify_rm_watch,293,KV_UNDEF,255,KV_UNDEF,255,KV_UNDEF,318,KV_UNDEF,28,KV_UNDEF,28,KV_UNDEF,286,KV_UNDEF,286,KV_UNDEF,245,KV_UNDEF,249,KV_UNDEF,271,KV_UNDEF,271,KV_UNDEF,277,KV_UNDEF,277,KV_UNDEF,28,KV_UNDEF,286,KV_UNDEF,286,KV_UNDEF,292,KV_UNDEF io_cancel,249,KV_UNDEF,210,KV_UNDEF,210,KV_UNDEF,247,KV_UNDEF,3,KV_UNDEF,3,KV_UNDEF,245,KV_UNDEF,245,KV_UNDEF,204,KV_UNDEF,204,KV_UNDEF,219,KV_UNDEF,219,KV_UNDEF,231,KV_UNDEF,231,KV_UNDEF,3,KV_UNDEF,247,KV_UNDEF,247,KV_UNDEF,249,KV_UNDEF ioctl,54,KV_UNDEF,16,KV_UNDEF,514,KV_UNDEF,54,KV_UNDEF,29,KV_UNDEF,29,KV_UNDEF,54,KV_UNDEF,54,KV_UNDEF,15,KV_UNDEF,15,KV_UNDEF,54,KV_UNDEF,54,KV_UNDEF,54,KV_UNDEF,54,KV_UNDEF,29,KV_UNDEF,54,KV_UNDEF,54,KV_UNDEF,54,KV_UNDEF io_destroy,246,KV_UNDEF,207,KV_UNDEF,207,KV_UNDEF,244,KV_UNDEF,1,KV_UNDEF,1,KV_UNDEF,242,KV_UNDEF,242,KV_UNDEF,201,KV_UNDEF,201,KV_UNDEF,216,KV_UNDEF,216,KV_UNDEF,228,KV_UNDEF,228,KV_UNDEF,1,KV_UNDEF,244,KV_UNDEF,244,KV_UNDEF,246,KV_UNDEF io_getevents,247,KV_UNDEF,208,KV_UNDEF,208,KV_UNDEF,245,KV_UNDEF,4,KV_UNDEF,4,KV_UNDEF,243,KV_UNDEF,243,KV_UNDEF,202,KV_UNDEF,202,KV_UNDEF,217,KV_UNDEF,217,KV_UNDEF,229,KV_UNDEF,229,KV_UNDEF,4,KV_UNDEF,245,KV_UNDEF,245,KV_UNDEF,247,KV_UNDEF ioperm,101,KV_UNDEF,173,KV_UNDEF,173,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,101,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,101,KV_UNDEF,101,KV_UNDEF,PNR,KV_UNDEF,101,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF io_pgetevents,385,KV_UNDEF,333,KV_UNDEF,333,KV_UNDEF,399,KV_UNDEF,292,KV_UNDEF,292,KV_UNDEF,PNR,KV_UNDEF,368,KV_UNDEF,328,KV_UNDEF,332,KV_UNDEF,350,KV_UNDEF,350,KV_UNDEF,388,KV_UNDEF,388,KV_UNDEF,292,KV_UNDEF,382,KV_UNDEF,382,KV_UNDEF,PNR,KV_UNDEF io_pgetevents_time64,416,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,416,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,416,KV_UNDEF,416,KV_UNDEF,PNR,KV_UNDEF,416,KV_UNDEF,416,KV_UNDEF,PNR,KV_UNDEF,416,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,416,KV_UNDEF,PNR,KV_UNDEF,416,KV_UNDEF iopl,110,KV_UNDEF,172,KV_UNDEF,172,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,110,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,110,KV_UNDEF,110,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF ioprio_get,290,KV_UNDEF,252,KV_UNDEF,252,KV_UNDEF,315,KV_UNDEF,31,KV_UNDEF,31,KV_UNDEF,283,KV_UNDEF,315,KV_UNDEF,274,KV_UNDEF,278,KV_UNDEF,268,KV_UNDEF,268,KV_UNDEF,274,KV_UNDEF,274,KV_UNDEF,31,KV_UNDEF,283,KV_UNDEF,283,KV_UNDEF,289,KV_UNDEF ioprio_set,289,KV_UNDEF,251,KV_UNDEF,251,KV_UNDEF,314,KV_UNDEF,30,KV_UNDEF,30,KV_UNDEF,282,KV_UNDEF,314,KV_UNDEF,273,KV_UNDEF,277,KV_UNDEF,267,KV_UNDEF,267,KV_UNDEF,273,KV_UNDEF,273,KV_UNDEF,30,KV_UNDEF,282,KV_UNDEF,282,KV_UNDEF,288,KV_UNDEF io_setup,245,KV_UNDEF,206,KV_UNDEF,543,KV_UNDEF,243,KV_UNDEF,0,KV_UNDEF,0,KV_UNDEF,241,KV_UNDEF,241,KV_UNDEF,200,KV_UNDEF,200,KV_UNDEF,215,KV_UNDEF,215,KV_UNDEF,227,KV_UNDEF,227,KV_UNDEF,0,KV_UNDEF,243,KV_UNDEF,243,KV_UNDEF,245,KV_UNDEF io_submit,248,KV_UNDEF,209,KV_UNDEF,544,KV_UNDEF,246,KV_UNDEF,2,KV_UNDEF,2,KV_UNDEF,244,KV_UNDEF,244,KV_UNDEF,203,KV_UNDEF,203,KV_UNDEF,218,KV_UNDEF,218,KV_UNDEF,230,KV_UNDEF,230,KV_UNDEF,2,KV_UNDEF,246,KV_UNDEF,246,KV_UNDEF,248,KV_UNDEF io_uring_enter,426,KV_UNDEF,426,KV_UNDEF,426,KV_UNDEF,426,KV_UNDEF,426,KV_UNDEF,426,KV_UNDEF,426,KV_UNDEF,426,KV_UNDEF,426,KV_UNDEF,426,KV_UNDEF,426,KV_UNDEF,426,KV_UNDEF,426,KV_UNDEF,426,KV_UNDEF,426,KV_UNDEF,426,KV_UNDEF,426,KV_UNDEF,426,KV_UNDEF io_uring_register,427,KV_UNDEF,427,KV_UNDEF,427,KV_UNDEF,427,KV_UNDEF,427,KV_UNDEF,427,KV_UNDEF,427,KV_UNDEF,427,KV_UNDEF,427,KV_UNDEF,427,KV_UNDEF,427,KV_UNDEF,427,KV_UNDEF,427,KV_UNDEF,427,KV_UNDEF,427,KV_UNDEF,427,KV_UNDEF,427,KV_UNDEF,427,KV_UNDEF io_uring_setup,425,KV_UNDEF,425,KV_UNDEF,425,KV_UNDEF,425,KV_UNDEF,425,KV_UNDEF,425,KV_UNDEF,425,KV_UNDEF,425,KV_UNDEF,425,KV_UNDEF,425,KV_UNDEF,425,KV_UNDEF,425,KV_UNDEF,425,KV_UNDEF,425,KV_UNDEF,425,KV_UNDEF,425,KV_UNDEF,425,KV_UNDEF,425,KV_UNDEF ipc,117,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,117,KV_UNDEF,117,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,117,KV_UNDEF,117,KV_UNDEF,PNR,KV_UNDEF,117,KV_UNDEF,117,KV_UNDEF,117,KV_UNDEF kcmp,349,KV_UNDEF,312,KV_UNDEF,312,KV_UNDEF,378,KV_UNDEF,272,KV_UNDEF,272,KV_UNDEF,347,KV_UNDEF,347,KV_UNDEF,306,KV_UNDEF,311,KV_UNDEF,332,KV_UNDEF,332,KV_UNDEF,354,KV_UNDEF,354,KV_UNDEF,272,KV_UNDEF,343,KV_UNDEF,343,KV_UNDEF,367,KV_UNDEF kexec_file_load,PNR,KV_UNDEF,320,KV_UNDEF,320,KV_UNDEF,401,KV_UNDEF,294,KV_UNDEF,294,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,355,KV_UNDEF,355,KV_UNDEF,382,KV_UNDEF,382,KV_UNDEF,294,KV_UNDEF,381,KV_UNDEF,381,KV_UNDEF,PNR,KV_UNDEF kexec_load,283,KV_UNDEF,246,KV_UNDEF,528,KV_UNDEF,347,KV_UNDEF,104,KV_UNDEF,104,KV_UNDEF,313,KV_UNDEF,311,KV_UNDEF,270,KV_UNDEF,274,KV_UNDEF,300,KV_UNDEF,300,KV_UNDEF,268,KV_UNDEF,268,KV_UNDEF,104,KV_UNDEF,277,KV_UNDEF,277,KV_UNDEF,283,KV_UNDEF keyctl,288,KV_UNDEF,250,KV_UNDEF,250,KV_UNDEF,311,KV_UNDEF,219,KV_UNDEF,219,KV_UNDEF,281,KV_UNDEF,282,KV_UNDEF,241,KV_UNDEF,245,KV_UNDEF,266,KV_UNDEF,266,KV_UNDEF,271,KV_UNDEF,271,KV_UNDEF,219,KV_UNDEF,280,KV_UNDEF,280,KV_UNDEF,287,KV_UNDEF kill,37,KV_UNDEF,62,KV_UNDEF,62,KV_UNDEF,37,KV_UNDEF,129,KV_UNDEF,129,KV_UNDEF,37,KV_UNDEF,37,KV_UNDEF,60,KV_UNDEF,60,KV_UNDEF,37,KV_UNDEF,37,KV_UNDEF,37,KV_UNDEF,37,KV_UNDEF,129,KV_UNDEF,37,KV_UNDEF,37,KV_UNDEF,37,KV_UNDEF landlock_add_rule,445,KV_UNDEF,445,KV_UNDEF,445,KV_UNDEF,445,KV_UNDEF,445,KV_UNDEF,445,KV_UNDEF,445,KV_UNDEF,445,KV_UNDEF,445,KV_UNDEF,445,KV_UNDEF,445,KV_UNDEF,445,KV_UNDEF,445,KV_UNDEF,445,KV_UNDEF,445,KV_UNDEF,445,KV_UNDEF,445,KV_UNDEF,445,KV_UNDEF landlock_create_ruleset,444,KV_UNDEF,444,KV_UNDEF,444,KV_UNDEF,444,KV_UNDEF,444,KV_UNDEF,444,KV_UNDEF,444,KV_UNDEF,444,KV_UNDEF,444,KV_UNDEF,444,KV_UNDEF,444,KV_UNDEF,444,KV_UNDEF,444,KV_UNDEF,444,KV_UNDEF,444,KV_UNDEF,444,KV_UNDEF,444,KV_UNDEF,444,KV_UNDEF landlock_restrict_self,446,KV_UNDEF,446,KV_UNDEF,446,KV_UNDEF,446,KV_UNDEF,446,KV_UNDEF,446,KV_UNDEF,446,KV_UNDEF,446,KV_UNDEF,446,KV_UNDEF,446,KV_UNDEF,446,KV_UNDEF,446,KV_UNDEF,446,KV_UNDEF,446,KV_UNDEF,446,KV_UNDEF,446,KV_UNDEF,446,KV_UNDEF,446,KV_UNDEF lchown,16,KV_UNDEF,94,KV_UNDEF,94,KV_UNDEF,16,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,182,KV_UNDEF,16,KV_UNDEF,92,KV_UNDEF,92,KV_UNDEF,16,KV_UNDEF,16,KV_UNDEF,16,KV_UNDEF,16,KV_UNDEF,PNR,KV_UNDEF,16,KV_UNDEF,198,KV_UNDEF,16,KV_UNDEF lchown32,198,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,198,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,212,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,198,KV_UNDEF,PNR,KV_UNDEF,198,KV_UNDEF lgetxattr,230,KV_UNDEF,192,KV_UNDEF,192,KV_UNDEF,230,KV_UNDEF,9,KV_UNDEF,9,KV_UNDEF,227,KV_UNDEF,228,KV_UNDEF,184,KV_UNDEF,184,KV_UNDEF,242,KV_UNDEF,242,KV_UNDEF,213,KV_UNDEF,213,KV_UNDEF,9,KV_UNDEF,228,KV_UNDEF,228,KV_UNDEF,230,KV_UNDEF link,9,KV_UNDEF,86,KV_UNDEF,86,KV_UNDEF,9,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,9,KV_UNDEF,9,KV_UNDEF,84,KV_UNDEF,84,KV_UNDEF,9,KV_UNDEF,9,KV_UNDEF,9,KV_UNDEF,9,KV_UNDEF,PNR,KV_UNDEF,9,KV_UNDEF,9,KV_UNDEF,9,KV_UNDEF linkat,303,KV_UNDEF,265,KV_UNDEF,265,KV_UNDEF,330,KV_UNDEF,37,KV_UNDEF,37,KV_UNDEF,296,KV_UNDEF,296,KV_UNDEF,255,KV_UNDEF,259,KV_UNDEF,283,KV_UNDEF,283,KV_UNDEF,294,KV_UNDEF,294,KV_UNDEF,37,KV_UNDEF,296,KV_UNDEF,296,KV_UNDEF,303,KV_UNDEF listen,363,KV_UNDEF,50,KV_UNDEF,50,KV_UNDEF,284,KV_UNDEF,201,KV_UNDEF,201,KV_UNDEF,360,KV_UNDEF,174,KV_UNDEF,49,KV_UNDEF,49,KV_UNDEF,32,KV_UNDEF,32,KV_UNDEF,329,KV_UNDEF,329,KV_UNDEF,201,KV_UNDEF,363,KV_UNDEF,363,KV_UNDEF,343,KV_UNDEF listxattr,232,KV_UNDEF,194,KV_UNDEF,194,KV_UNDEF,232,KV_UNDEF,11,KV_UNDEF,11,KV_UNDEF,229,KV_UNDEF,230,KV_UNDEF,186,KV_UNDEF,186,KV_UNDEF,244,KV_UNDEF,244,KV_UNDEF,215,KV_UNDEF,215,KV_UNDEF,11,KV_UNDEF,230,KV_UNDEF,230,KV_UNDEF,232,KV_UNDEF llistxattr,233,KV_UNDEF,195,KV_UNDEF,195,KV_UNDEF,233,KV_UNDEF,12,KV_UNDEF,12,KV_UNDEF,230,KV_UNDEF,231,KV_UNDEF,187,KV_UNDEF,187,KV_UNDEF,245,KV_UNDEF,245,KV_UNDEF,216,KV_UNDEF,216,KV_UNDEF,12,KV_UNDEF,231,KV_UNDEF,231,KV_UNDEF,233,KV_UNDEF _llseek,140,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,140,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,140,KV_UNDEF,140,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,140,KV_UNDEF,140,KV_UNDEF,140,KV_UNDEF,140,KV_UNDEF,PNR,KV_UNDEF,140,KV_UNDEF,PNR,KV_UNDEF,140,KV_UNDEF lock,53,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,53,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,53,KV_UNDEF,53,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF lookup_dcookie,253,KV_UNDEF,212,KV_UNDEF,212,KV_UNDEF,249,KV_UNDEF,18,KV_UNDEF,18,KV_UNDEF,248,KV_UNDEF,247,KV_UNDEF,206,KV_UNDEF,206,KV_UNDEF,223,KV_UNDEF,223,KV_UNDEF,235,KV_UNDEF,235,KV_UNDEF,18,KV_UNDEF,110,KV_UNDEF,110,KV_UNDEF,253,KV_UNDEF lremovexattr,236,KV_UNDEF,198,KV_UNDEF,198,KV_UNDEF,236,KV_UNDEF,15,KV_UNDEF,15,KV_UNDEF,233,KV_UNDEF,234,KV_UNDEF,190,KV_UNDEF,190,KV_UNDEF,248,KV_UNDEF,248,KV_UNDEF,219,KV_UNDEF,219,KV_UNDEF,15,KV_UNDEF,234,KV_UNDEF,234,KV_UNDEF,236,KV_UNDEF lseek,19,KV_UNDEF,8,KV_UNDEF,8,KV_UNDEF,19,KV_UNDEF,62,KV_UNDEF,62,KV_UNDEF,19,KV_UNDEF,19,KV_UNDEF,8,KV_UNDEF,8,KV_UNDEF,19,KV_UNDEF,19,KV_UNDEF,19,KV_UNDEF,19,KV_UNDEF,62,KV_UNDEF,19,KV_UNDEF,19,KV_UNDEF,19,KV_UNDEF lsetxattr,227,KV_UNDEF,189,KV_UNDEF,189,KV_UNDEF,227,KV_UNDEF,6,KV_UNDEF,6,KV_UNDEF,224,KV_UNDEF,225,KV_UNDEF,181,KV_UNDEF,181,KV_UNDEF,239,KV_UNDEF,239,KV_UNDEF,210,KV_UNDEF,210,KV_UNDEF,6,KV_UNDEF,225,KV_UNDEF,225,KV_UNDEF,227,KV_UNDEF lstat,107,KV_UNDEF,6,KV_UNDEF,6,KV_UNDEF,107,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,107,KV_UNDEF,107,KV_UNDEF,6,KV_UNDEF,6,KV_UNDEF,84,KV_UNDEF,84,KV_UNDEF,107,KV_UNDEF,107,KV_UNDEF,PNR,KV_UNDEF,107,KV_UNDEF,107,KV_UNDEF,107,KV_UNDEF lstat64,196,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,196,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,196,KV_UNDEF,214,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,198,KV_UNDEF,198,KV_UNDEF,196,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,196,KV_UNDEF,PNR,KV_UNDEF,196,KV_UNDEF madvise,219,KV_UNDEF,28,KV_UNDEF,28,KV_UNDEF,220,KV_UNDEF,233,KV_UNDEF,233,KV_UNDEF,238,KV_UNDEF,218,KV_UNDEF,27,KV_UNDEF,27,KV_UNDEF,119,KV_UNDEF,119,KV_UNDEF,205,KV_UNDEF,205,KV_UNDEF,233,KV_UNDEF,219,KV_UNDEF,219,KV_UNDEF,219,KV_UNDEF mbind,274,KV_UNDEF,237,KV_UNDEF,237,KV_UNDEF,319,KV_UNDEF,235,KV_UNDEF,235,KV_UNDEF,268,KV_UNDEF,268,KV_UNDEF,227,KV_UNDEF,231,KV_UNDEF,260,KV_UNDEF,260,KV_UNDEF,259,KV_UNDEF,259,KV_UNDEF,235,KV_UNDEF,268,KV_UNDEF,268,KV_UNDEF,274,KV_UNDEF membarrier,375,KV_UNDEF,324,KV_UNDEF,324,KV_UNDEF,389,KV_UNDEF,283,KV_UNDEF,283,KV_UNDEF,374,KV_UNDEF,358,KV_UNDEF,318,KV_UNDEF,322,KV_UNDEF,343,KV_UNDEF,343,KV_UNDEF,365,KV_UNDEF,365,KV_UNDEF,283,KV_UNDEF,356,KV_UNDEF,356,KV_UNDEF,378,KV_UNDEF memfd_create,356,KV_UNDEF,319,KV_UNDEF,319,KV_UNDEF,385,KV_UNDEF,279,KV_UNDEF,279,KV_UNDEF,353,KV_UNDEF,354,KV_UNDEF,314,KV_UNDEF,318,KV_UNDEF,340,KV_UNDEF,340,KV_UNDEF,360,KV_UNDEF,360,KV_UNDEF,279,KV_UNDEF,350,KV_UNDEF,350,KV_UNDEF,374,KV_UNDEF memfd_secret,447,KV_UNDEF,447,KV_UNDEF,447,KV_UNDEF,PNR,KV_UNDEF,447,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,447,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF migrate_pages,294,KV_UNDEF,256,KV_UNDEF,256,KV_UNDEF,400,KV_UNDEF,238,KV_UNDEF,238,KV_UNDEF,287,KV_UNDEF,287,KV_UNDEF,246,KV_UNDEF,250,KV_UNDEF,272,KV_UNDEF,272,KV_UNDEF,258,KV_UNDEF,258,KV_UNDEF,238,KV_UNDEF,287,KV_UNDEF,287,KV_UNDEF,294,KV_UNDEF mincore,218,KV_UNDEF,27,KV_UNDEF,27,KV_UNDEF,219,KV_UNDEF,232,KV_UNDEF,232,KV_UNDEF,237,KV_UNDEF,217,KV_UNDEF,26,KV_UNDEF,26,KV_UNDEF,72,KV_UNDEF,72,KV_UNDEF,206,KV_UNDEF,206,KV_UNDEF,232,KV_UNDEF,218,KV_UNDEF,218,KV_UNDEF,218,KV_UNDEF mkdir,39,KV_UNDEF,83,KV_UNDEF,83,KV_UNDEF,39,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,39,KV_UNDEF,39,KV_UNDEF,81,KV_UNDEF,81,KV_UNDEF,39,KV_UNDEF,39,KV_UNDEF,39,KV_UNDEF,39,KV_UNDEF,PNR,KV_UNDEF,39,KV_UNDEF,39,KV_UNDEF,39,KV_UNDEF mkdirat,296,KV_UNDEF,258,KV_UNDEF,258,KV_UNDEF,323,KV_UNDEF,34,KV_UNDEF,34,KV_UNDEF,289,KV_UNDEF,289,KV_UNDEF,248,KV_UNDEF,252,KV_UNDEF,276,KV_UNDEF,276,KV_UNDEF,287,KV_UNDEF,287,KV_UNDEF,34,KV_UNDEF,289,KV_UNDEF,289,KV_UNDEF,296,KV_UNDEF mknod,14,KV_UNDEF,133,KV_UNDEF,133,KV_UNDEF,14,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,14,KV_UNDEF,14,KV_UNDEF,131,KV_UNDEF,131,KV_UNDEF,14,KV_UNDEF,14,KV_UNDEF,14,KV_UNDEF,14,KV_UNDEF,PNR,KV_UNDEF,14,KV_UNDEF,14,KV_UNDEF,14,KV_UNDEF mknodat,297,KV_UNDEF,259,KV_UNDEF,259,KV_UNDEF,324,KV_UNDEF,33,KV_UNDEF,33,KV_UNDEF,290,KV_UNDEF,290,KV_UNDEF,249,KV_UNDEF,253,KV_UNDEF,277,KV_UNDEF,277,KV_UNDEF,288,KV_UNDEF,288,KV_UNDEF,33,KV_UNDEF,290,KV_UNDEF,290,KV_UNDEF,297,KV_UNDEF mlock,150,KV_UNDEF,149,KV_UNDEF,149,KV_UNDEF,150,KV_UNDEF,228,KV_UNDEF,228,KV_UNDEF,150,KV_UNDEF,154,KV_UNDEF,146,KV_UNDEF,146,KV_UNDEF,150,KV_UNDEF,150,KV_UNDEF,150,KV_UNDEF,150,KV_UNDEF,228,KV_UNDEF,150,KV_UNDEF,150,KV_UNDEF,150,KV_UNDEF mlock2,376,KV_UNDEF,325,KV_UNDEF,325,KV_UNDEF,390,KV_UNDEF,284,KV_UNDEF,284,KV_UNDEF,375,KV_UNDEF,359,KV_UNDEF,319,KV_UNDEF,323,KV_UNDEF,345,KV_UNDEF,345,KV_UNDEF,378,KV_UNDEF,378,KV_UNDEF,284,KV_UNDEF,374,KV_UNDEF,374,KV_UNDEF,379,KV_UNDEF mlockall,152,KV_UNDEF,151,KV_UNDEF,151,KV_UNDEF,152,KV_UNDEF,230,KV_UNDEF,230,KV_UNDEF,152,KV_UNDEF,156,KV_UNDEF,148,KV_UNDEF,148,KV_UNDEF,152,KV_UNDEF,152,KV_UNDEF,152,KV_UNDEF,152,KV_UNDEF,230,KV_UNDEF,152,KV_UNDEF,152,KV_UNDEF,152,KV_UNDEF mmap,90,KV_UNDEF,9,KV_UNDEF,9,KV_UNDEF,PNR,KV_UNDEF,222,KV_UNDEF,222,KV_UNDEF,90,KV_UNDEF,90,KV_UNDEF,9,KV_UNDEF,9,KV_UNDEF,90,KV_UNDEF,90,KV_UNDEF,90,KV_UNDEF,90,KV_UNDEF,222,KV_UNDEF,90,KV_UNDEF,90,KV_UNDEF,90,KV_UNDEF mmap2,192,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,192,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,192,KV_UNDEF,210,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,89,KV_UNDEF,89,KV_UNDEF,192,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,192,KV_UNDEF,PNR,KV_UNDEF,192,KV_UNDEF modify_ldt,123,KV_UNDEF,154,KV_UNDEF,154,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,123,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,123,KV_UNDEF,123,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF mount,21,KV_UNDEF,165,KV_UNDEF,165,KV_UNDEF,21,KV_UNDEF,40,KV_UNDEF,40,KV_UNDEF,21,KV_UNDEF,21,KV_UNDEF,160,KV_UNDEF,160,KV_UNDEF,21,KV_UNDEF,21,KV_UNDEF,21,KV_UNDEF,21,KV_UNDEF,40,KV_UNDEF,21,KV_UNDEF,21,KV_UNDEF,21,KV_UNDEF mount_setattr,442,KV_UNDEF,442,KV_UNDEF,442,KV_UNDEF,442,KV_UNDEF,442,KV_UNDEF,442,KV_UNDEF,442,KV_UNDEF,442,KV_UNDEF,442,KV_UNDEF,442,KV_UNDEF,442,KV_UNDEF,442,KV_UNDEF,442,KV_UNDEF,442,KV_UNDEF,442,KV_UNDEF,442,KV_UNDEF,442,KV_UNDEF,442,KV_UNDEF move_mount,429,KV_UNDEF,429,KV_UNDEF,429,KV_UNDEF,429,KV_UNDEF,429,KV_UNDEF,429,KV_UNDEF,429,KV_UNDEF,429,KV_UNDEF,429,KV_UNDEF,429,KV_UNDEF,429,KV_UNDEF,429,KV_UNDEF,429,KV_UNDEF,429,KV_UNDEF,429,KV_UNDEF,429,KV_UNDEF,429,KV_UNDEF,429,KV_UNDEF move_pages,317,KV_UNDEF,279,KV_UNDEF,533,KV_UNDEF,344,KV_UNDEF,239,KV_UNDEF,239,KV_UNDEF,310,KV_UNDEF,308,KV_UNDEF,267,KV_UNDEF,271,KV_UNDEF,295,KV_UNDEF,295,KV_UNDEF,301,KV_UNDEF,301,KV_UNDEF,239,KV_UNDEF,310,KV_UNDEF,310,KV_UNDEF,317,KV_UNDEF mprotect,125,KV_UNDEF,10,KV_UNDEF,10,KV_UNDEF,125,KV_UNDEF,226,KV_UNDEF,226,KV_UNDEF,125,KV_UNDEF,125,KV_UNDEF,10,KV_UNDEF,10,KV_UNDEF,125,KV_UNDEF,125,KV_UNDEF,125,KV_UNDEF,125,KV_UNDEF,226,KV_UNDEF,125,KV_UNDEF,125,KV_UNDEF,125,KV_UNDEF mpx,56,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,56,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,56,KV_UNDEF,56,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF mq_getsetattr,282,KV_UNDEF,245,KV_UNDEF,245,KV_UNDEF,279,KV_UNDEF,185,KV_UNDEF,185,KV_UNDEF,276,KV_UNDEF,276,KV_UNDEF,235,KV_UNDEF,239,KV_UNDEF,234,KV_UNDEF,234,KV_UNDEF,267,KV_UNDEF,267,KV_UNDEF,185,KV_UNDEF,276,KV_UNDEF,276,KV_UNDEF,282,KV_UNDEF mq_notify,281,KV_UNDEF,244,KV_UNDEF,527,KV_UNDEF,278,KV_UNDEF,184,KV_UNDEF,184,KV_UNDEF,275,KV_UNDEF,275,KV_UNDEF,234,KV_UNDEF,238,KV_UNDEF,233,KV_UNDEF,233,KV_UNDEF,266,KV_UNDEF,266,KV_UNDEF,184,KV_UNDEF,275,KV_UNDEF,275,KV_UNDEF,281,KV_UNDEF mq_open,277,KV_UNDEF,240,KV_UNDEF,240,KV_UNDEF,274,KV_UNDEF,180,KV_UNDEF,180,KV_UNDEF,271,KV_UNDEF,271,KV_UNDEF,230,KV_UNDEF,234,KV_UNDEF,229,KV_UNDEF,229,KV_UNDEF,262,KV_UNDEF,262,KV_UNDEF,180,KV_UNDEF,271,KV_UNDEF,271,KV_UNDEF,277,KV_UNDEF mq_timedreceive,280,KV_UNDEF,243,KV_UNDEF,243,KV_UNDEF,277,KV_UNDEF,183,KV_UNDEF,183,KV_UNDEF,274,KV_UNDEF,274,KV_UNDEF,233,KV_UNDEF,237,KV_UNDEF,232,KV_UNDEF,232,KV_UNDEF,265,KV_UNDEF,265,KV_UNDEF,183,KV_UNDEF,274,KV_UNDEF,274,KV_UNDEF,280,KV_UNDEF mq_timedreceive_time64,419,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,419,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,419,KV_UNDEF,419,KV_UNDEF,PNR,KV_UNDEF,419,KV_UNDEF,419,KV_UNDEF,PNR,KV_UNDEF,419,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,419,KV_UNDEF,PNR,KV_UNDEF,419,KV_UNDEF mq_timedsend,279,KV_UNDEF,242,KV_UNDEF,242,KV_UNDEF,276,KV_UNDEF,182,KV_UNDEF,182,KV_UNDEF,273,KV_UNDEF,273,KV_UNDEF,232,KV_UNDEF,236,KV_UNDEF,231,KV_UNDEF,231,KV_UNDEF,264,KV_UNDEF,264,KV_UNDEF,182,KV_UNDEF,273,KV_UNDEF,273,KV_UNDEF,279,KV_UNDEF mq_timedsend_time64,418,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,418,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,418,KV_UNDEF,418,KV_UNDEF,PNR,KV_UNDEF,418,KV_UNDEF,418,KV_UNDEF,PNR,KV_UNDEF,418,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,418,KV_UNDEF,PNR,KV_UNDEF,418,KV_UNDEF mq_unlink,278,KV_UNDEF,241,KV_UNDEF,241,KV_UNDEF,275,KV_UNDEF,181,KV_UNDEF,181,KV_UNDEF,272,KV_UNDEF,272,KV_UNDEF,231,KV_UNDEF,235,KV_UNDEF,230,KV_UNDEF,230,KV_UNDEF,263,KV_UNDEF,263,KV_UNDEF,181,KV_UNDEF,272,KV_UNDEF,272,KV_UNDEF,278,KV_UNDEF mremap,163,KV_UNDEF,25,KV_UNDEF,25,KV_UNDEF,163,KV_UNDEF,216,KV_UNDEF,216,KV_UNDEF,163,KV_UNDEF,167,KV_UNDEF,24,KV_UNDEF,24,KV_UNDEF,163,KV_UNDEF,163,KV_UNDEF,163,KV_UNDEF,163,KV_UNDEF,216,KV_UNDEF,163,KV_UNDEF,163,KV_UNDEF,163,KV_UNDEF msgctl,402,KV_UNDEF,71,KV_UNDEF,71,KV_UNDEF,304,KV_UNDEF,187,KV_UNDEF,187,KV_UNDEF,402,KV_UNDEF,402,KV_UNDEF,69,KV_UNDEF,69,KV_UNDEF,191,KV_UNDEF,191,KV_UNDEF,402,KV_UNDEF,402,KV_UNDEF,187,KV_UNDEF,402,KV_UNDEF,402,KV_UNDEF,402,KV_UNDEF msgget,399,KV_UNDEF,68,KV_UNDEF,68,KV_UNDEF,303,KV_UNDEF,186,KV_UNDEF,186,KV_UNDEF,399,KV_UNDEF,399,KV_UNDEF,66,KV_UNDEF,66,KV_UNDEF,190,KV_UNDEF,190,KV_UNDEF,399,KV_UNDEF,399,KV_UNDEF,186,KV_UNDEF,399,KV_UNDEF,399,KV_UNDEF,399,KV_UNDEF msgrcv,401,KV_UNDEF,70,KV_UNDEF,70,KV_UNDEF,302,KV_UNDEF,188,KV_UNDEF,188,KV_UNDEF,401,KV_UNDEF,401,KV_UNDEF,68,KV_UNDEF,68,KV_UNDEF,189,KV_UNDEF,189,KV_UNDEF,401,KV_UNDEF,401,KV_UNDEF,188,KV_UNDEF,401,KV_UNDEF,401,KV_UNDEF,401,KV_UNDEF msgsnd,400,KV_UNDEF,69,KV_UNDEF,69,KV_UNDEF,301,KV_UNDEF,189,KV_UNDEF,189,KV_UNDEF,400,KV_UNDEF,400,KV_UNDEF,67,KV_UNDEF,67,KV_UNDEF,188,KV_UNDEF,188,KV_UNDEF,400,KV_UNDEF,400,KV_UNDEF,189,KV_UNDEF,400,KV_UNDEF,400,KV_UNDEF,400,KV_UNDEF msync,144,KV_UNDEF,26,KV_UNDEF,26,KV_UNDEF,144,KV_UNDEF,227,KV_UNDEF,227,KV_UNDEF,144,KV_UNDEF,144,KV_UNDEF,25,KV_UNDEF,25,KV_UNDEF,144,KV_UNDEF,144,KV_UNDEF,144,KV_UNDEF,144,KV_UNDEF,227,KV_UNDEF,144,KV_UNDEF,144,KV_UNDEF,144,KV_UNDEF multiplexer,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,201,KV_UNDEF,201,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF munlock,151,KV_UNDEF,150,KV_UNDEF,150,KV_UNDEF,151,KV_UNDEF,229,KV_UNDEF,229,KV_UNDEF,151,KV_UNDEF,155,KV_UNDEF,147,KV_UNDEF,147,KV_UNDEF,151,KV_UNDEF,151,KV_UNDEF,151,KV_UNDEF,151,KV_UNDEF,229,KV_UNDEF,151,KV_UNDEF,151,KV_UNDEF,151,KV_UNDEF munlockall,153,KV_UNDEF,152,KV_UNDEF,152,KV_UNDEF,153,KV_UNDEF,231,KV_UNDEF,231,KV_UNDEF,153,KV_UNDEF,157,KV_UNDEF,149,KV_UNDEF,149,KV_UNDEF,153,KV_UNDEF,153,KV_UNDEF,153,KV_UNDEF,153,KV_UNDEF,231,KV_UNDEF,153,KV_UNDEF,153,KV_UNDEF,153,KV_UNDEF munmap,91,KV_UNDEF,11,KV_UNDEF,11,KV_UNDEF,91,KV_UNDEF,215,KV_UNDEF,215,KV_UNDEF,91,KV_UNDEF,91,KV_UNDEF,11,KV_UNDEF,11,KV_UNDEF,91,KV_UNDEF,91,KV_UNDEF,91,KV_UNDEF,91,KV_UNDEF,215,KV_UNDEF,91,KV_UNDEF,91,KV_UNDEF,91,KV_UNDEF name_to_handle_at,341,KV_UNDEF,303,KV_UNDEF,303,KV_UNDEF,370,KV_UNDEF,264,KV_UNDEF,264,KV_UNDEF,340,KV_UNDEF,339,KV_UNDEF,298,KV_UNDEF,303,KV_UNDEF,325,KV_UNDEF,325,KV_UNDEF,345,KV_UNDEF,345,KV_UNDEF,264,KV_UNDEF,335,KV_UNDEF,335,KV_UNDEF,359,KV_UNDEF nanosleep,162,KV_UNDEF,35,KV_UNDEF,35,KV_UNDEF,162,KV_UNDEF,101,KV_UNDEF,101,KV_UNDEF,162,KV_UNDEF,166,KV_UNDEF,34,KV_UNDEF,34,KV_UNDEF,162,KV_UNDEF,162,KV_UNDEF,162,KV_UNDEF,162,KV_UNDEF,101,KV_UNDEF,162,KV_UNDEF,162,KV_UNDEF,162,KV_UNDEF newfstatat,PNR,KV_UNDEF,262,KV_UNDEF,262,KV_UNDEF,PNR,KV_UNDEF,79,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,252,KV_UNDEF,256,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,291,KV_UNDEF,79,KV_UNDEF,PNR,KV_UNDEF,293,KV_UNDEF,PNR,KV_UNDEF _newselect,142,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,142,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,142,KV_UNDEF,142,KV_UNDEF,22,KV_UNDEF,22,KV_UNDEF,142,KV_UNDEF,142,KV_UNDEF,142,KV_UNDEF,142,KV_UNDEF,PNR,KV_UNDEF,142,KV_UNDEF,PNR,KV_UNDEF,142,KV_UNDEF nfsservctl,169,KV_UNDEF,180,KV_UNDEF,PNR,KV_UNDEF,169,KV_UNDEF,42,KV_UNDEF,42,KV_UNDEF,169,KV_UNDEF,189,KV_UNDEF,173,KV_UNDEF,173,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,168,KV_UNDEF,168,KV_UNDEF,42,KV_UNDEF,169,KV_UNDEF,169,KV_UNDEF,169,KV_UNDEF nice,34,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,34,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,34,KV_UNDEF,34,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,34,KV_UNDEF,34,KV_UNDEF,34,KV_UNDEF,34,KV_UNDEF,PNR,KV_UNDEF,34,KV_UNDEF,34,KV_UNDEF,34,KV_UNDEF oldfstat,28,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,28,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,28,KV_UNDEF,28,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,28,KV_UNDEF oldlstat,84,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,84,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,84,KV_UNDEF,84,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,84,KV_UNDEF oldolduname,59,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,59,KV_UNDEF,59,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF oldstat,18,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,18,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,18,KV_UNDEF,18,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,18,KV_UNDEF olduname,109,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,109,KV_UNDEF,109,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,109,KV_UNDEF open,5,KV_UNDEF,2,KV_UNDEF,2,KV_UNDEF,5,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,5,KV_UNDEF,5,KV_UNDEF,2,KV_UNDEF,2,KV_UNDEF,5,KV_UNDEF,5,KV_UNDEF,5,KV_UNDEF,5,KV_UNDEF,PNR,KV_UNDEF,5,KV_UNDEF,5,KV_UNDEF,5,KV_UNDEF openat,295,KV_UNDEF,257,KV_UNDEF,257,KV_UNDEF,322,KV_UNDEF,56,KV_UNDEF,56,KV_UNDEF,288,KV_UNDEF,288,KV_UNDEF,247,KV_UNDEF,251,KV_UNDEF,275,KV_UNDEF,275,KV_UNDEF,286,KV_UNDEF,286,KV_UNDEF,56,KV_UNDEF,288,KV_UNDEF,288,KV_UNDEF,295,KV_UNDEF openat2,437,KV_UNDEF,437,KV_UNDEF,437,KV_UNDEF,437,KV_UNDEF,437,KV_UNDEF,437,KV_UNDEF,437,KV_UNDEF,437,KV_UNDEF,437,KV_UNDEF,437,KV_UNDEF,437,KV_UNDEF,437,KV_UNDEF,437,KV_UNDEF,437,KV_UNDEF,437,KV_UNDEF,437,KV_UNDEF,437,KV_UNDEF,437,KV_UNDEF open_by_handle_at,342,KV_UNDEF,304,KV_UNDEF,304,KV_UNDEF,371,KV_UNDEF,265,KV_UNDEF,265,KV_UNDEF,341,KV_UNDEF,340,KV_UNDEF,299,KV_UNDEF,304,KV_UNDEF,326,KV_UNDEF,326,KV_UNDEF,346,KV_UNDEF,346,KV_UNDEF,265,KV_UNDEF,336,KV_UNDEF,336,KV_UNDEF,360,KV_UNDEF open_tree,428,KV_UNDEF,428,KV_UNDEF,428,KV_UNDEF,428,KV_UNDEF,428,KV_UNDEF,428,KV_UNDEF,428,KV_UNDEF,428,KV_UNDEF,428,KV_UNDEF,428,KV_UNDEF,428,KV_UNDEF,428,KV_UNDEF,428,KV_UNDEF,428,KV_UNDEF,428,KV_UNDEF,428,KV_UNDEF,428,KV_UNDEF,428,KV_UNDEF pause,29,KV_UNDEF,34,KV_UNDEF,34,KV_UNDEF,29,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,29,KV_UNDEF,29,KV_UNDEF,33,KV_UNDEF,33,KV_UNDEF,29,KV_UNDEF,29,KV_UNDEF,29,KV_UNDEF,29,KV_UNDEF,PNR,KV_UNDEF,29,KV_UNDEF,29,KV_UNDEF,29,KV_UNDEF pciconfig_iobase,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,271,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,200,KV_UNDEF,200,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF pciconfig_read,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,272,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,198,KV_UNDEF,198,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF pciconfig_write,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,273,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,199,KV_UNDEF,199,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF perf_event_open,336,KV_UNDEF,298,KV_UNDEF,298,KV_UNDEF,364,KV_UNDEF,241,KV_UNDEF,241,KV_UNDEF,332,KV_UNDEF,333,KV_UNDEF,292,KV_UNDEF,296,KV_UNDEF,318,KV_UNDEF,318,KV_UNDEF,319,KV_UNDEF,319,KV_UNDEF,241,KV_UNDEF,331,KV_UNDEF,331,KV_UNDEF,336,KV_UNDEF personality,136,KV_UNDEF,135,KV_UNDEF,135,KV_UNDEF,136,KV_UNDEF,92,KV_UNDEF,92,KV_UNDEF,136,KV_UNDEF,136,KV_UNDEF,132,KV_UNDEF,132,KV_UNDEF,136,KV_UNDEF,136,KV_UNDEF,136,KV_UNDEF,136,KV_UNDEF,92,KV_UNDEF,136,KV_UNDEF,136,KV_UNDEF,136,KV_UNDEF pidfd_getfd,438,KV_UNDEF,438,KV_UNDEF,438,KV_UNDEF,438,KV_UNDEF,438,KV_UNDEF,438,KV_UNDEF,438,KV_UNDEF,438,KV_UNDEF,438,KV_UNDEF,438,KV_UNDEF,438,KV_UNDEF,438,KV_UNDEF,438,KV_UNDEF,438,KV_UNDEF,438,KV_UNDEF,438,KV_UNDEF,438,KV_UNDEF,438,KV_UNDEF pidfd_open,434,KV_UNDEF,434,KV_UNDEF,434,KV_UNDEF,434,KV_UNDEF,434,KV_UNDEF,434,KV_UNDEF,434,KV_UNDEF,434,KV_UNDEF,434,KV_UNDEF,434,KV_UNDEF,434,KV_UNDEF,434,KV_UNDEF,434,KV_UNDEF,434,KV_UNDEF,434,KV_UNDEF,434,KV_UNDEF,434,KV_UNDEF,434,KV_UNDEF pidfd_send_signal,424,KV_UNDEF,424,KV_UNDEF,424,KV_UNDEF,424,KV_UNDEF,424,KV_UNDEF,424,KV_UNDEF,424,KV_UNDEF,424,KV_UNDEF,424,KV_UNDEF,424,KV_UNDEF,424,KV_UNDEF,424,KV_UNDEF,424,KV_UNDEF,424,KV_UNDEF,424,KV_UNDEF,424,KV_UNDEF,424,KV_UNDEF,424,KV_UNDEF pipe,42,KV_UNDEF,22,KV_UNDEF,22,KV_UNDEF,42,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,42,KV_UNDEF,42,KV_UNDEF,21,KV_UNDEF,21,KV_UNDEF,42,KV_UNDEF,42,KV_UNDEF,42,KV_UNDEF,42,KV_UNDEF,PNR,KV_UNDEF,42,KV_UNDEF,42,KV_UNDEF,42,KV_UNDEF pipe2,331,KV_UNDEF,293,KV_UNDEF,293,KV_UNDEF,359,KV_UNDEF,59,KV_UNDEF,59,KV_UNDEF,327,KV_UNDEF,328,KV_UNDEF,287,KV_UNDEF,291,KV_UNDEF,313,KV_UNDEF,313,KV_UNDEF,317,KV_UNDEF,317,KV_UNDEF,59,KV_UNDEF,325,KV_UNDEF,325,KV_UNDEF,331,KV_UNDEF pivot_root,217,KV_UNDEF,155,KV_UNDEF,155,KV_UNDEF,218,KV_UNDEF,41,KV_UNDEF,41,KV_UNDEF,217,KV_UNDEF,216,KV_UNDEF,151,KV_UNDEF,151,KV_UNDEF,67,KV_UNDEF,67,KV_UNDEF,203,KV_UNDEF,203,KV_UNDEF,41,KV_UNDEF,217,KV_UNDEF,217,KV_UNDEF,217,KV_UNDEF pkey_alloc,381,KV_UNDEF,330,KV_UNDEF,330,KV_UNDEF,395,KV_UNDEF,289,KV_UNDEF,289,KV_UNDEF,382,KV_UNDEF,364,KV_UNDEF,324,KV_UNDEF,328,KV_UNDEF,352,KV_UNDEF,352,KV_UNDEF,384,KV_UNDEF,384,KV_UNDEF,289,KV_UNDEF,385,KV_UNDEF,385,KV_UNDEF,385,KV_UNDEF pkey_free,382,KV_UNDEF,331,KV_UNDEF,331,KV_UNDEF,396,KV_UNDEF,290,KV_UNDEF,290,KV_UNDEF,383,KV_UNDEF,365,KV_UNDEF,325,KV_UNDEF,329,KV_UNDEF,353,KV_UNDEF,353,KV_UNDEF,385,KV_UNDEF,385,KV_UNDEF,290,KV_UNDEF,386,KV_UNDEF,386,KV_UNDEF,386,KV_UNDEF pkey_mprotect,380,KV_UNDEF,329,KV_UNDEF,329,KV_UNDEF,394,KV_UNDEF,288,KV_UNDEF,288,KV_UNDEF,381,KV_UNDEF,363,KV_UNDEF,323,KV_UNDEF,327,KV_UNDEF,351,KV_UNDEF,351,KV_UNDEF,386,KV_UNDEF,386,KV_UNDEF,288,KV_UNDEF,384,KV_UNDEF,384,KV_UNDEF,384,KV_UNDEF poll,168,KV_UNDEF,7,KV_UNDEF,7,KV_UNDEF,168,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,168,KV_UNDEF,188,KV_UNDEF,7,KV_UNDEF,7,KV_UNDEF,168,KV_UNDEF,168,KV_UNDEF,167,KV_UNDEF,167,KV_UNDEF,PNR,KV_UNDEF,168,KV_UNDEF,168,KV_UNDEF,168,KV_UNDEF ppoll,309,KV_UNDEF,271,KV_UNDEF,271,KV_UNDEF,336,KV_UNDEF,73,KV_UNDEF,73,KV_UNDEF,302,KV_UNDEF,302,KV_UNDEF,261,KV_UNDEF,265,KV_UNDEF,274,KV_UNDEF,274,KV_UNDEF,281,KV_UNDEF,281,KV_UNDEF,73,KV_UNDEF,302,KV_UNDEF,302,KV_UNDEF,309,KV_UNDEF ppoll_time64,414,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,414,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,414,KV_UNDEF,414,KV_UNDEF,PNR,KV_UNDEF,414,KV_UNDEF,414,KV_UNDEF,PNR,KV_UNDEF,414,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,414,KV_UNDEF,PNR,KV_UNDEF,414,KV_UNDEF prctl,172,KV_UNDEF,157,KV_UNDEF,157,KV_UNDEF,172,KV_UNDEF,167,KV_UNDEF,167,KV_UNDEF,172,KV_UNDEF,192,KV_UNDEF,153,KV_UNDEF,153,KV_UNDEF,172,KV_UNDEF,172,KV_UNDEF,171,KV_UNDEF,171,KV_UNDEF,167,KV_UNDEF,172,KV_UNDEF,172,KV_UNDEF,172,KV_UNDEF pread64,180,KV_UNDEF,17,KV_UNDEF,17,KV_UNDEF,180,KV_UNDEF,67,KV_UNDEF,67,KV_UNDEF,180,KV_UNDEF,200,KV_UNDEF,16,KV_UNDEF,16,KV_UNDEF,108,KV_UNDEF,108,KV_UNDEF,179,KV_UNDEF,179,KV_UNDEF,67,KV_UNDEF,180,KV_UNDEF,180,KV_UNDEF,180,KV_UNDEF preadv,333,KV_UNDEF,295,KV_UNDEF,534,KV_UNDEF,361,KV_UNDEF,69,KV_UNDEF,69,KV_UNDEF,329,KV_UNDEF,330,KV_UNDEF,289,KV_UNDEF,293,KV_UNDEF,315,KV_UNDEF,315,KV_UNDEF,320,KV_UNDEF,320,KV_UNDEF,69,KV_UNDEF,328,KV_UNDEF,328,KV_UNDEF,333,KV_UNDEF preadv2,378,KV_UNDEF,327,KV_UNDEF,546,KV_UNDEF,392,KV_UNDEF,286,KV_UNDEF,286,KV_UNDEF,377,KV_UNDEF,361,KV_UNDEF,321,KV_UNDEF,325,KV_UNDEF,347,KV_UNDEF,347,KV_UNDEF,380,KV_UNDEF,380,KV_UNDEF,286,KV_UNDEF,376,KV_UNDEF,376,KV_UNDEF,381,KV_UNDEF prlimit64,340,KV_UNDEF,302,KV_UNDEF,302,KV_UNDEF,369,KV_UNDEF,261,KV_UNDEF,261,KV_UNDEF,339,KV_UNDEF,338,KV_UNDEF,297,KV_UNDEF,302,KV_UNDEF,321,KV_UNDEF,321,KV_UNDEF,325,KV_UNDEF,325,KV_UNDEF,261,KV_UNDEF,334,KV_UNDEF,334,KV_UNDEF,339,KV_UNDEF process_madvise,440,KV_UNDEF,440,KV_UNDEF,440,KV_UNDEF,440,KV_UNDEF,440,KV_UNDEF,440,KV_UNDEF,440,KV_UNDEF,440,KV_UNDEF,440,KV_UNDEF,440,KV_UNDEF,440,KV_UNDEF,440,KV_UNDEF,440,KV_UNDEF,440,KV_UNDEF,440,KV_UNDEF,440,KV_UNDEF,440,KV_UNDEF,440,KV_UNDEF process_mrelease,448,KV_UNDEF,448,KV_UNDEF,448,KV_UNDEF,448,KV_UNDEF,448,KV_UNDEF,448,KV_UNDEF,448,KV_UNDEF,448,KV_UNDEF,448,KV_UNDEF,448,KV_UNDEF,448,KV_UNDEF,448,KV_UNDEF,448,KV_UNDEF,448,KV_UNDEF,448,KV_UNDEF,448,KV_UNDEF,448,KV_UNDEF,448,KV_UNDEF process_vm_readv,347,KV_UNDEF,310,KV_UNDEF,539,KV_UNDEF,376,KV_UNDEF,270,KV_UNDEF,270,KV_UNDEF,345,KV_UNDEF,345,KV_UNDEF,304,KV_UNDEF,309,KV_UNDEF,330,KV_UNDEF,330,KV_UNDEF,351,KV_UNDEF,351,KV_UNDEF,270,KV_UNDEF,340,KV_UNDEF,340,KV_UNDEF,365,KV_UNDEF process_vm_writev,348,KV_UNDEF,311,KV_UNDEF,540,KV_UNDEF,377,KV_UNDEF,271,KV_UNDEF,271,KV_UNDEF,346,KV_UNDEF,346,KV_UNDEF,305,KV_UNDEF,310,KV_UNDEF,331,KV_UNDEF,331,KV_UNDEF,352,KV_UNDEF,352,KV_UNDEF,271,KV_UNDEF,341,KV_UNDEF,341,KV_UNDEF,366,KV_UNDEF prof,44,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,44,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,44,KV_UNDEF,44,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF profil,98,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,98,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,98,KV_UNDEF,98,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF pselect6,308,KV_UNDEF,270,KV_UNDEF,270,KV_UNDEF,335,KV_UNDEF,72,KV_UNDEF,72,KV_UNDEF,301,KV_UNDEF,301,KV_UNDEF,260,KV_UNDEF,264,KV_UNDEF,273,KV_UNDEF,273,KV_UNDEF,280,KV_UNDEF,280,KV_UNDEF,72,KV_UNDEF,301,KV_UNDEF,301,KV_UNDEF,308,KV_UNDEF pselect6_time64,413,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,413,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,413,KV_UNDEF,413,KV_UNDEF,PNR,KV_UNDEF,413,KV_UNDEF,413,KV_UNDEF,PNR,KV_UNDEF,413,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,413,KV_UNDEF,PNR,KV_UNDEF,413,KV_UNDEF ptrace,26,KV_UNDEF,101,KV_UNDEF,521,KV_UNDEF,26,KV_UNDEF,117,KV_UNDEF,117,KV_UNDEF,26,KV_UNDEF,26,KV_UNDEF,99,KV_UNDEF,99,KV_UNDEF,26,KV_UNDEF,26,KV_UNDEF,26,KV_UNDEF,26,KV_UNDEF,117,KV_UNDEF,26,KV_UNDEF,26,KV_UNDEF,26,KV_UNDEF putpmsg,189,KV_UNDEF,182,KV_UNDEF,182,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,189,KV_UNDEF,209,KV_UNDEF,175,KV_UNDEF,175,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,188,KV_UNDEF,188,KV_UNDEF,PNR,KV_UNDEF,189,KV_UNDEF,189,KV_UNDEF,PNR,KV_UNDEF pwrite64,181,KV_UNDEF,18,KV_UNDEF,18,KV_UNDEF,181,KV_UNDEF,68,KV_UNDEF,68,KV_UNDEF,181,KV_UNDEF,201,KV_UNDEF,17,KV_UNDEF,17,KV_UNDEF,109,KV_UNDEF,109,KV_UNDEF,180,KV_UNDEF,180,KV_UNDEF,68,KV_UNDEF,181,KV_UNDEF,181,KV_UNDEF,181,KV_UNDEF pwritev,334,KV_UNDEF,296,KV_UNDEF,535,KV_UNDEF,362,KV_UNDEF,70,KV_UNDEF,70,KV_UNDEF,330,KV_UNDEF,331,KV_UNDEF,290,KV_UNDEF,294,KV_UNDEF,316,KV_UNDEF,316,KV_UNDEF,321,KV_UNDEF,321,KV_UNDEF,70,KV_UNDEF,329,KV_UNDEF,329,KV_UNDEF,334,KV_UNDEF pwritev2,379,KV_UNDEF,328,KV_UNDEF,547,KV_UNDEF,393,KV_UNDEF,287,KV_UNDEF,287,KV_UNDEF,378,KV_UNDEF,362,KV_UNDEF,322,KV_UNDEF,326,KV_UNDEF,348,KV_UNDEF,348,KV_UNDEF,381,KV_UNDEF,381,KV_UNDEF,287,KV_UNDEF,377,KV_UNDEF,377,KV_UNDEF,382,KV_UNDEF query_module,167,KV_UNDEF,178,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,167,KV_UNDEF,187,KV_UNDEF,171,KV_UNDEF,171,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,166,KV_UNDEF,166,KV_UNDEF,PNR,KV_UNDEF,167,KV_UNDEF,167,KV_UNDEF,PNR,KV_UNDEF quotactl,131,KV_UNDEF,179,KV_UNDEF,179,KV_UNDEF,131,KV_UNDEF,60,KV_UNDEF,60,KV_UNDEF,131,KV_UNDEF,131,KV_UNDEF,172,KV_UNDEF,172,KV_UNDEF,131,KV_UNDEF,131,KV_UNDEF,131,KV_UNDEF,131,KV_UNDEF,60,KV_UNDEF,131,KV_UNDEF,131,KV_UNDEF,131,KV_UNDEF quotactl_fd,443,KV_UNDEF,443,KV_UNDEF,443,KV_UNDEF,443,KV_UNDEF,443,KV_UNDEF,443,KV_UNDEF,443,KV_UNDEF,443,KV_UNDEF,443,KV_UNDEF,443,KV_UNDEF,443,KV_UNDEF,443,KV_UNDEF,443,KV_UNDEF,443,KV_UNDEF,443,KV_UNDEF,443,KV_UNDEF,443,KV_UNDEF,443,KV_UNDEF read,3,KV_UNDEF,0,KV_UNDEF,0,KV_UNDEF,3,KV_UNDEF,63,KV_UNDEF,63,KV_UNDEF,3,KV_UNDEF,3,KV_UNDEF,0,KV_UNDEF,0,KV_UNDEF,3,KV_UNDEF,3,KV_UNDEF,3,KV_UNDEF,3,KV_UNDEF,63,KV_UNDEF,3,KV_UNDEF,3,KV_UNDEF,3,KV_UNDEF readahead,225,KV_UNDEF,187,KV_UNDEF,187,KV_UNDEF,225,KV_UNDEF,213,KV_UNDEF,213,KV_UNDEF,240,KV_UNDEF,223,KV_UNDEF,179,KV_UNDEF,179,KV_UNDEF,207,KV_UNDEF,207,KV_UNDEF,191,KV_UNDEF,191,KV_UNDEF,213,KV_UNDEF,222,KV_UNDEF,222,KV_UNDEF,225,KV_UNDEF readdir,89,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,89,KV_UNDEF,89,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,89,KV_UNDEF,89,KV_UNDEF,PNR,KV_UNDEF,89,KV_UNDEF,89,KV_UNDEF,89,KV_UNDEF readlink,85,KV_UNDEF,89,KV_UNDEF,89,KV_UNDEF,85,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,85,KV_UNDEF,85,KV_UNDEF,87,KV_UNDEF,87,KV_UNDEF,85,KV_UNDEF,85,KV_UNDEF,85,KV_UNDEF,85,KV_UNDEF,PNR,KV_UNDEF,85,KV_UNDEF,85,KV_UNDEF,85,KV_UNDEF readlinkat,305,KV_UNDEF,267,KV_UNDEF,267,KV_UNDEF,332,KV_UNDEF,78,KV_UNDEF,78,KV_UNDEF,298,KV_UNDEF,298,KV_UNDEF,257,KV_UNDEF,261,KV_UNDEF,285,KV_UNDEF,285,KV_UNDEF,296,KV_UNDEF,296,KV_UNDEF,78,KV_UNDEF,298,KV_UNDEF,298,KV_UNDEF,305,KV_UNDEF readv,145,KV_UNDEF,19,KV_UNDEF,515,KV_UNDEF,145,KV_UNDEF,65,KV_UNDEF,65,KV_UNDEF,145,KV_UNDEF,145,KV_UNDEF,18,KV_UNDEF,18,KV_UNDEF,145,KV_UNDEF,145,KV_UNDEF,145,KV_UNDEF,145,KV_UNDEF,65,KV_UNDEF,145,KV_UNDEF,145,KV_UNDEF,145,KV_UNDEF reboot,88,KV_UNDEF,169,KV_UNDEF,169,KV_UNDEF,88,KV_UNDEF,142,KV_UNDEF,142,KV_UNDEF,88,KV_UNDEF,88,KV_UNDEF,164,KV_UNDEF,164,KV_UNDEF,88,KV_UNDEF,88,KV_UNDEF,88,KV_UNDEF,88,KV_UNDEF,142,KV_UNDEF,88,KV_UNDEF,88,KV_UNDEF,88,KV_UNDEF recv,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,291,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,175,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,98,KV_UNDEF,98,KV_UNDEF,336,KV_UNDEF,336,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,350,KV_UNDEF recvfrom,371,KV_UNDEF,45,KV_UNDEF,517,KV_UNDEF,292,KV_UNDEF,207,KV_UNDEF,207,KV_UNDEF,368,KV_UNDEF,176,KV_UNDEF,44,KV_UNDEF,44,KV_UNDEF,123,KV_UNDEF,123,KV_UNDEF,337,KV_UNDEF,337,KV_UNDEF,207,KV_UNDEF,371,KV_UNDEF,371,KV_UNDEF,351,KV_UNDEF recvmmsg,337,KV_UNDEF,299,KV_UNDEF,537,KV_UNDEF,365,KV_UNDEF,243,KV_UNDEF,243,KV_UNDEF,371,KV_UNDEF,335,KV_UNDEF,294,KV_UNDEF,298,KV_UNDEF,319,KV_UNDEF,319,KV_UNDEF,343,KV_UNDEF,343,KV_UNDEF,243,KV_UNDEF,357,KV_UNDEF,357,KV_UNDEF,357,KV_UNDEF recvmmsg_time64,417,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,417,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,417,KV_UNDEF,417,KV_UNDEF,PNR,KV_UNDEF,417,KV_UNDEF,417,KV_UNDEF,PNR,KV_UNDEF,417,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,417,KV_UNDEF,PNR,KV_UNDEF,417,KV_UNDEF recvmsg,372,KV_UNDEF,47,KV_UNDEF,519,KV_UNDEF,297,KV_UNDEF,212,KV_UNDEF,212,KV_UNDEF,369,KV_UNDEF,177,KV_UNDEF,46,KV_UNDEF,46,KV_UNDEF,184,KV_UNDEF,184,KV_UNDEF,342,KV_UNDEF,342,KV_UNDEF,212,KV_UNDEF,372,KV_UNDEF,372,KV_UNDEF,356,KV_UNDEF remap_file_pages,257,KV_UNDEF,216,KV_UNDEF,216,KV_UNDEF,253,KV_UNDEF,234,KV_UNDEF,234,KV_UNDEF,252,KV_UNDEF,251,KV_UNDEF,210,KV_UNDEF,210,KV_UNDEF,227,KV_UNDEF,227,KV_UNDEF,239,KV_UNDEF,239,KV_UNDEF,234,KV_UNDEF,267,KV_UNDEF,267,KV_UNDEF,257,KV_UNDEF removexattr,235,KV_UNDEF,197,KV_UNDEF,197,KV_UNDEF,235,KV_UNDEF,14,KV_UNDEF,14,KV_UNDEF,232,KV_UNDEF,233,KV_UNDEF,189,KV_UNDEF,189,KV_UNDEF,247,KV_UNDEF,247,KV_UNDEF,218,KV_UNDEF,218,KV_UNDEF,14,KV_UNDEF,233,KV_UNDEF,233,KV_UNDEF,235,KV_UNDEF rename,38,KV_UNDEF,82,KV_UNDEF,82,KV_UNDEF,38,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,38,KV_UNDEF,38,KV_UNDEF,80,KV_UNDEF,80,KV_UNDEF,38,KV_UNDEF,38,KV_UNDEF,38,KV_UNDEF,38,KV_UNDEF,PNR,KV_UNDEF,38,KV_UNDEF,38,KV_UNDEF,38,KV_UNDEF renameat,302,KV_UNDEF,264,KV_UNDEF,264,KV_UNDEF,329,KV_UNDEF,38,KV_UNDEF,PNR,KV_UNDEF,295,KV_UNDEF,295,KV_UNDEF,254,KV_UNDEF,258,KV_UNDEF,282,KV_UNDEF,282,KV_UNDEF,293,KV_UNDEF,293,KV_UNDEF,PNR,KV_UNDEF,295,KV_UNDEF,295,KV_UNDEF,302,KV_UNDEF renameat2,353,KV_UNDEF,316,KV_UNDEF,316,KV_UNDEF,382,KV_UNDEF,276,KV_UNDEF,276,KV_UNDEF,351,KV_UNDEF,351,KV_UNDEF,311,KV_UNDEF,315,KV_UNDEF,337,KV_UNDEF,337,KV_UNDEF,357,KV_UNDEF,357,KV_UNDEF,276,KV_UNDEF,347,KV_UNDEF,347,KV_UNDEF,371,KV_UNDEF request_key,287,KV_UNDEF,249,KV_UNDEF,249,KV_UNDEF,310,KV_UNDEF,218,KV_UNDEF,218,KV_UNDEF,280,KV_UNDEF,281,KV_UNDEF,240,KV_UNDEF,244,KV_UNDEF,265,KV_UNDEF,265,KV_UNDEF,270,KV_UNDEF,270,KV_UNDEF,218,KV_UNDEF,279,KV_UNDEF,279,KV_UNDEF,286,KV_UNDEF restart_syscall,0,KV_UNDEF,219,KV_UNDEF,219,KV_UNDEF,0,KV_UNDEF,128,KV_UNDEF,128,KV_UNDEF,0,KV_UNDEF,253,KV_UNDEF,213,KV_UNDEF,214,KV_UNDEF,0,KV_UNDEF,0,KV_UNDEF,0,KV_UNDEF,0,KV_UNDEF,128,KV_UNDEF,7,KV_UNDEF,7,KV_UNDEF,0,KV_UNDEF riscv_flush_icache,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,259,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF rmdir,40,KV_UNDEF,84,KV_UNDEF,84,KV_UNDEF,40,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,40,KV_UNDEF,40,KV_UNDEF,82,KV_UNDEF,82,KV_UNDEF,40,KV_UNDEF,40,KV_UNDEF,40,KV_UNDEF,40,KV_UNDEF,PNR,KV_UNDEF,40,KV_UNDEF,40,KV_UNDEF,40,KV_UNDEF rseq,386,KV_UNDEF,334,KV_UNDEF,334,KV_UNDEF,398,KV_UNDEF,293,KV_UNDEF,293,KV_UNDEF,384,KV_UNDEF,367,KV_UNDEF,327,KV_UNDEF,331,KV_UNDEF,354,KV_UNDEF,354,KV_UNDEF,387,KV_UNDEF,387,KV_UNDEF,293,KV_UNDEF,383,KV_UNDEF,383,KV_UNDEF,387,KV_UNDEF rtas,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,255,KV_UNDEF,255,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF rt_sigaction,174,KV_UNDEF,13,KV_UNDEF,512,KV_UNDEF,174,KV_UNDEF,134,KV_UNDEF,134,KV_UNDEF,174,KV_UNDEF,194,KV_UNDEF,13,KV_UNDEF,13,KV_UNDEF,174,KV_UNDEF,174,KV_UNDEF,173,KV_UNDEF,173,KV_UNDEF,134,KV_UNDEF,174,KV_UNDEF,174,KV_UNDEF,174,KV_UNDEF rt_sigpending,176,KV_UNDEF,127,KV_UNDEF,522,KV_UNDEF,176,KV_UNDEF,136,KV_UNDEF,136,KV_UNDEF,176,KV_UNDEF,196,KV_UNDEF,125,KV_UNDEF,125,KV_UNDEF,176,KV_UNDEF,176,KV_UNDEF,175,KV_UNDEF,175,KV_UNDEF,136,KV_UNDEF,176,KV_UNDEF,176,KV_UNDEF,176,KV_UNDEF rt_sigprocmask,175,KV_UNDEF,14,KV_UNDEF,14,KV_UNDEF,175,KV_UNDEF,135,KV_UNDEF,135,KV_UNDEF,175,KV_UNDEF,195,KV_UNDEF,14,KV_UNDEF,14,KV_UNDEF,175,KV_UNDEF,175,KV_UNDEF,174,KV_UNDEF,174,KV_UNDEF,135,KV_UNDEF,175,KV_UNDEF,175,KV_UNDEF,175,KV_UNDEF rt_sigqueueinfo,178,KV_UNDEF,129,KV_UNDEF,524,KV_UNDEF,178,KV_UNDEF,138,KV_UNDEF,138,KV_UNDEF,178,KV_UNDEF,198,KV_UNDEF,127,KV_UNDEF,127,KV_UNDEF,178,KV_UNDEF,178,KV_UNDEF,177,KV_UNDEF,177,KV_UNDEF,138,KV_UNDEF,178,KV_UNDEF,178,KV_UNDEF,178,KV_UNDEF rt_sigreturn,173,KV_UNDEF,15,KV_UNDEF,513,KV_UNDEF,173,KV_UNDEF,139,KV_UNDEF,139,KV_UNDEF,173,KV_UNDEF,193,KV_UNDEF,211,KV_UNDEF,211,KV_UNDEF,173,KV_UNDEF,173,KV_UNDEF,172,KV_UNDEF,172,KV_UNDEF,139,KV_UNDEF,173,KV_UNDEF,173,KV_UNDEF,173,KV_UNDEF rt_sigsuspend,179,KV_UNDEF,130,KV_UNDEF,130,KV_UNDEF,179,KV_UNDEF,133,KV_UNDEF,133,KV_UNDEF,179,KV_UNDEF,199,KV_UNDEF,128,KV_UNDEF,128,KV_UNDEF,179,KV_UNDEF,179,KV_UNDEF,178,KV_UNDEF,178,KV_UNDEF,133,KV_UNDEF,179,KV_UNDEF,179,KV_UNDEF,179,KV_UNDEF rt_sigtimedwait,177,KV_UNDEF,128,KV_UNDEF,523,KV_UNDEF,177,KV_UNDEF,137,KV_UNDEF,137,KV_UNDEF,177,KV_UNDEF,197,KV_UNDEF,126,KV_UNDEF,126,KV_UNDEF,177,KV_UNDEF,177,KV_UNDEF,176,KV_UNDEF,176,KV_UNDEF,137,KV_UNDEF,177,KV_UNDEF,177,KV_UNDEF,177,KV_UNDEF rt_sigtimedwait_time64,421,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,421,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,421,KV_UNDEF,421,KV_UNDEF,PNR,KV_UNDEF,421,KV_UNDEF,421,KV_UNDEF,PNR,KV_UNDEF,421,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,421,KV_UNDEF,PNR,KV_UNDEF,421,KV_UNDEF rt_tgsigqueueinfo,335,KV_UNDEF,297,KV_UNDEF,536,KV_UNDEF,363,KV_UNDEF,240,KV_UNDEF,240,KV_UNDEF,331,KV_UNDEF,332,KV_UNDEF,291,KV_UNDEF,295,KV_UNDEF,317,KV_UNDEF,317,KV_UNDEF,322,KV_UNDEF,322,KV_UNDEF,240,KV_UNDEF,330,KV_UNDEF,330,KV_UNDEF,335,KV_UNDEF s390_guarded_storage,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,378,KV_UNDEF,378,KV_UNDEF,PNR,KV_UNDEF s390_pci_mmio_read,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,353,KV_UNDEF,353,KV_UNDEF,PNR,KV_UNDEF s390_pci_mmio_write,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,352,KV_UNDEF,352,KV_UNDEF,PNR,KV_UNDEF s390_runtime_instr,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,342,KV_UNDEF,342,KV_UNDEF,PNR,KV_UNDEF s390_sthyi,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,380,KV_UNDEF,380,KV_UNDEF,PNR,KV_UNDEF sched_getaffinity,242,KV_UNDEF,204,KV_UNDEF,204,KV_UNDEF,242,KV_UNDEF,123,KV_UNDEF,123,KV_UNDEF,312,KV_UNDEF,240,KV_UNDEF,196,KV_UNDEF,196,KV_UNDEF,212,KV_UNDEF,212,KV_UNDEF,223,KV_UNDEF,223,KV_UNDEF,123,KV_UNDEF,240,KV_UNDEF,240,KV_UNDEF,242,KV_UNDEF sched_getattr,352,KV_UNDEF,315,KV_UNDEF,315,KV_UNDEF,381,KV_UNDEF,275,KV_UNDEF,275,KV_UNDEF,350,KV_UNDEF,350,KV_UNDEF,310,KV_UNDEF,314,KV_UNDEF,335,KV_UNDEF,335,KV_UNDEF,356,KV_UNDEF,356,KV_UNDEF,275,KV_UNDEF,346,KV_UNDEF,346,KV_UNDEF,369,KV_UNDEF sched_getparam,155,KV_UNDEF,143,KV_UNDEF,143,KV_UNDEF,155,KV_UNDEF,121,KV_UNDEF,121,KV_UNDEF,155,KV_UNDEF,159,KV_UNDEF,140,KV_UNDEF,140,KV_UNDEF,155,KV_UNDEF,155,KV_UNDEF,155,KV_UNDEF,155,KV_UNDEF,121,KV_UNDEF,155,KV_UNDEF,155,KV_UNDEF,155,KV_UNDEF sched_get_priority_max,159,KV_UNDEF,146,KV_UNDEF,146,KV_UNDEF,159,KV_UNDEF,125,KV_UNDEF,125,KV_UNDEF,159,KV_UNDEF,163,KV_UNDEF,143,KV_UNDEF,143,KV_UNDEF,159,KV_UNDEF,159,KV_UNDEF,159,KV_UNDEF,159,KV_UNDEF,125,KV_UNDEF,159,KV_UNDEF,159,KV_UNDEF,159,KV_UNDEF sched_get_priority_min,160,KV_UNDEF,147,KV_UNDEF,147,KV_UNDEF,160,KV_UNDEF,126,KV_UNDEF,126,KV_UNDEF,160,KV_UNDEF,164,KV_UNDEF,144,KV_UNDEF,144,KV_UNDEF,160,KV_UNDEF,160,KV_UNDEF,160,KV_UNDEF,160,KV_UNDEF,126,KV_UNDEF,160,KV_UNDEF,160,KV_UNDEF,160,KV_UNDEF sched_getscheduler,157,KV_UNDEF,145,KV_UNDEF,145,KV_UNDEF,157,KV_UNDEF,120,KV_UNDEF,120,KV_UNDEF,157,KV_UNDEF,161,KV_UNDEF,142,KV_UNDEF,142,KV_UNDEF,157,KV_UNDEF,157,KV_UNDEF,157,KV_UNDEF,157,KV_UNDEF,120,KV_UNDEF,157,KV_UNDEF,157,KV_UNDEF,157,KV_UNDEF sched_rr_get_interval,161,KV_UNDEF,148,KV_UNDEF,148,KV_UNDEF,161,KV_UNDEF,127,KV_UNDEF,127,KV_UNDEF,161,KV_UNDEF,165,KV_UNDEF,145,KV_UNDEF,145,KV_UNDEF,161,KV_UNDEF,161,KV_UNDEF,161,KV_UNDEF,161,KV_UNDEF,127,KV_UNDEF,161,KV_UNDEF,161,KV_UNDEF,161,KV_UNDEF sched_rr_get_interval_time64,423,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,423,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,423,KV_UNDEF,423,KV_UNDEF,PNR,KV_UNDEF,423,KV_UNDEF,423,KV_UNDEF,PNR,KV_UNDEF,423,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,423,KV_UNDEF,PNR,KV_UNDEF,423,KV_UNDEF sched_setaffinity,241,KV_UNDEF,203,KV_UNDEF,203,KV_UNDEF,241,KV_UNDEF,122,KV_UNDEF,122,KV_UNDEF,311,KV_UNDEF,239,KV_UNDEF,195,KV_UNDEF,195,KV_UNDEF,211,KV_UNDEF,211,KV_UNDEF,222,KV_UNDEF,222,KV_UNDEF,122,KV_UNDEF,239,KV_UNDEF,239,KV_UNDEF,241,KV_UNDEF sched_setattr,351,KV_UNDEF,314,KV_UNDEF,314,KV_UNDEF,380,KV_UNDEF,274,KV_UNDEF,274,KV_UNDEF,349,KV_UNDEF,349,KV_UNDEF,309,KV_UNDEF,313,KV_UNDEF,334,KV_UNDEF,334,KV_UNDEF,355,KV_UNDEF,355,KV_UNDEF,274,KV_UNDEF,345,KV_UNDEF,345,KV_UNDEF,370,KV_UNDEF sched_setparam,154,KV_UNDEF,142,KV_UNDEF,142,KV_UNDEF,154,KV_UNDEF,118,KV_UNDEF,118,KV_UNDEF,154,KV_UNDEF,158,KV_UNDEF,139,KV_UNDEF,139,KV_UNDEF,154,KV_UNDEF,154,KV_UNDEF,154,KV_UNDEF,154,KV_UNDEF,118,KV_UNDEF,154,KV_UNDEF,154,KV_UNDEF,154,KV_UNDEF sched_setscheduler,156,KV_UNDEF,144,KV_UNDEF,144,KV_UNDEF,156,KV_UNDEF,119,KV_UNDEF,119,KV_UNDEF,156,KV_UNDEF,160,KV_UNDEF,141,KV_UNDEF,141,KV_UNDEF,156,KV_UNDEF,156,KV_UNDEF,156,KV_UNDEF,156,KV_UNDEF,119,KV_UNDEF,156,KV_UNDEF,156,KV_UNDEF,156,KV_UNDEF sched_yield,158,KV_UNDEF,24,KV_UNDEF,24,KV_UNDEF,158,KV_UNDEF,124,KV_UNDEF,124,KV_UNDEF,158,KV_UNDEF,162,KV_UNDEF,23,KV_UNDEF,23,KV_UNDEF,158,KV_UNDEF,158,KV_UNDEF,158,KV_UNDEF,158,KV_UNDEF,124,KV_UNDEF,158,KV_UNDEF,158,KV_UNDEF,158,KV_UNDEF seccomp,354,KV_UNDEF,317,KV_UNDEF,317,KV_UNDEF,383,KV_UNDEF,277,KV_UNDEF,277,KV_UNDEF,380,KV_UNDEF,352,KV_UNDEF,312,KV_UNDEF,316,KV_UNDEF,338,KV_UNDEF,338,KV_UNDEF,358,KV_UNDEF,358,KV_UNDEF,277,KV_UNDEF,348,KV_UNDEF,348,KV_UNDEF,372,KV_UNDEF security,PNR,KV_UNDEF,185,KV_UNDEF,185,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF select,82,KV_UNDEF,23,KV_UNDEF,23,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,82,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,82,KV_UNDEF,82,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,142,KV_UNDEF,PNR,KV_UNDEF semctl,394,KV_UNDEF,66,KV_UNDEF,66,KV_UNDEF,300,KV_UNDEF,191,KV_UNDEF,191,KV_UNDEF,394,KV_UNDEF,394,KV_UNDEF,64,KV_UNDEF,64,KV_UNDEF,187,KV_UNDEF,187,KV_UNDEF,394,KV_UNDEF,394,KV_UNDEF,191,KV_UNDEF,394,KV_UNDEF,394,KV_UNDEF,394,KV_UNDEF semget,393,KV_UNDEF,64,KV_UNDEF,64,KV_UNDEF,299,KV_UNDEF,190,KV_UNDEF,190,KV_UNDEF,393,KV_UNDEF,393,KV_UNDEF,62,KV_UNDEF,62,KV_UNDEF,186,KV_UNDEF,186,KV_UNDEF,393,KV_UNDEF,393,KV_UNDEF,190,KV_UNDEF,393,KV_UNDEF,393,KV_UNDEF,393,KV_UNDEF semop,PNR,KV_UNDEF,65,KV_UNDEF,65,KV_UNDEF,298,KV_UNDEF,193,KV_UNDEF,193,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,63,KV_UNDEF,63,KV_UNDEF,185,KV_UNDEF,185,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,193,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF semtimedop,PNR,KV_UNDEF,220,KV_UNDEF,220,KV_UNDEF,312,KV_UNDEF,192,KV_UNDEF,192,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,214,KV_UNDEF,215,KV_UNDEF,228,KV_UNDEF,228,KV_UNDEF,PNR,KV_UNDEF,392,KV_UNDEF,192,KV_UNDEF,PNR,KV_UNDEF,392,KV_UNDEF,PNR,KV_UNDEF semtimedop_time64,420,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,420,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,420,KV_UNDEF,420,KV_UNDEF,PNR,KV_UNDEF,420,KV_UNDEF,420,KV_UNDEF,PNR,KV_UNDEF,420,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,420,KV_UNDEF,PNR,KV_UNDEF,420,KV_UNDEF send,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,289,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,178,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,58,KV_UNDEF,58,KV_UNDEF,334,KV_UNDEF,334,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,348,KV_UNDEF sendfile,187,KV_UNDEF,40,KV_UNDEF,40,KV_UNDEF,187,KV_UNDEF,71,KV_UNDEF,71,KV_UNDEF,187,KV_UNDEF,207,KV_UNDEF,39,KV_UNDEF,39,KV_UNDEF,122,KV_UNDEF,122,KV_UNDEF,186,KV_UNDEF,186,KV_UNDEF,71,KV_UNDEF,187,KV_UNDEF,187,KV_UNDEF,187,KV_UNDEF sendfile64,239,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,239,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,236,KV_UNDEF,237,KV_UNDEF,PNR,KV_UNDEF,219,KV_UNDEF,209,KV_UNDEF,209,KV_UNDEF,226,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,223,KV_UNDEF,PNR,KV_UNDEF,239,KV_UNDEF sendmmsg,345,KV_UNDEF,307,KV_UNDEF,538,KV_UNDEF,374,KV_UNDEF,269,KV_UNDEF,269,KV_UNDEF,372,KV_UNDEF,343,KV_UNDEF,302,KV_UNDEF,307,KV_UNDEF,329,KV_UNDEF,329,KV_UNDEF,349,KV_UNDEF,349,KV_UNDEF,269,KV_UNDEF,358,KV_UNDEF,358,KV_UNDEF,363,KV_UNDEF sendmsg,370,KV_UNDEF,46,KV_UNDEF,518,KV_UNDEF,296,KV_UNDEF,211,KV_UNDEF,211,KV_UNDEF,367,KV_UNDEF,179,KV_UNDEF,45,KV_UNDEF,45,KV_UNDEF,183,KV_UNDEF,183,KV_UNDEF,341,KV_UNDEF,341,KV_UNDEF,211,KV_UNDEF,370,KV_UNDEF,370,KV_UNDEF,355,KV_UNDEF sendto,369,KV_UNDEF,44,KV_UNDEF,44,KV_UNDEF,290,KV_UNDEF,206,KV_UNDEF,206,KV_UNDEF,366,KV_UNDEF,180,KV_UNDEF,43,KV_UNDEF,43,KV_UNDEF,82,KV_UNDEF,82,KV_UNDEF,335,KV_UNDEF,335,KV_UNDEF,206,KV_UNDEF,369,KV_UNDEF,369,KV_UNDEF,349,KV_UNDEF setdomainname,121,KV_UNDEF,171,KV_UNDEF,171,KV_UNDEF,121,KV_UNDEF,162,KV_UNDEF,162,KV_UNDEF,121,KV_UNDEF,121,KV_UNDEF,166,KV_UNDEF,166,KV_UNDEF,121,KV_UNDEF,121,KV_UNDEF,121,KV_UNDEF,121,KV_UNDEF,162,KV_UNDEF,121,KV_UNDEF,121,KV_UNDEF,121,KV_UNDEF setfsgid,139,KV_UNDEF,123,KV_UNDEF,123,KV_UNDEF,139,KV_UNDEF,152,KV_UNDEF,152,KV_UNDEF,139,KV_UNDEF,139,KV_UNDEF,121,KV_UNDEF,121,KV_UNDEF,139,KV_UNDEF,139,KV_UNDEF,139,KV_UNDEF,139,KV_UNDEF,152,KV_UNDEF,139,KV_UNDEF,216,KV_UNDEF,139,KV_UNDEF setfsgid32,216,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,216,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,216,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,216,KV_UNDEF,PNR,KV_UNDEF,216,KV_UNDEF setfsuid,138,KV_UNDEF,122,KV_UNDEF,122,KV_UNDEF,138,KV_UNDEF,151,KV_UNDEF,151,KV_UNDEF,138,KV_UNDEF,138,KV_UNDEF,120,KV_UNDEF,120,KV_UNDEF,138,KV_UNDEF,138,KV_UNDEF,138,KV_UNDEF,138,KV_UNDEF,151,KV_UNDEF,138,KV_UNDEF,215,KV_UNDEF,138,KV_UNDEF setfsuid32,215,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,215,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,215,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,215,KV_UNDEF,PNR,KV_UNDEF,215,KV_UNDEF setgid,46,KV_UNDEF,106,KV_UNDEF,106,KV_UNDEF,46,KV_UNDEF,144,KV_UNDEF,144,KV_UNDEF,46,KV_UNDEF,46,KV_UNDEF,104,KV_UNDEF,104,KV_UNDEF,46,KV_UNDEF,46,KV_UNDEF,46,KV_UNDEF,46,KV_UNDEF,144,KV_UNDEF,46,KV_UNDEF,214,KV_UNDEF,46,KV_UNDEF setgid32,214,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,214,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,214,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,214,KV_UNDEF,PNR,KV_UNDEF,214,KV_UNDEF setgroups,81,KV_UNDEF,116,KV_UNDEF,116,KV_UNDEF,81,KV_UNDEF,159,KV_UNDEF,159,KV_UNDEF,81,KV_UNDEF,81,KV_UNDEF,114,KV_UNDEF,114,KV_UNDEF,81,KV_UNDEF,81,KV_UNDEF,81,KV_UNDEF,81,KV_UNDEF,159,KV_UNDEF,81,KV_UNDEF,206,KV_UNDEF,81,KV_UNDEF setgroups32,206,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,206,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,206,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,206,KV_UNDEF,PNR,KV_UNDEF,206,KV_UNDEF sethostname,74,KV_UNDEF,170,KV_UNDEF,170,KV_UNDEF,74,KV_UNDEF,161,KV_UNDEF,161,KV_UNDEF,74,KV_UNDEF,74,KV_UNDEF,165,KV_UNDEF,165,KV_UNDEF,74,KV_UNDEF,74,KV_UNDEF,74,KV_UNDEF,74,KV_UNDEF,161,KV_UNDEF,74,KV_UNDEF,74,KV_UNDEF,74,KV_UNDEF setitimer,104,KV_UNDEF,38,KV_UNDEF,38,KV_UNDEF,104,KV_UNDEF,103,KV_UNDEF,103,KV_UNDEF,104,KV_UNDEF,104,KV_UNDEF,36,KV_UNDEF,36,KV_UNDEF,104,KV_UNDEF,104,KV_UNDEF,104,KV_UNDEF,104,KV_UNDEF,103,KV_UNDEF,104,KV_UNDEF,104,KV_UNDEF,104,KV_UNDEF set_mempolicy,276,KV_UNDEF,238,KV_UNDEF,238,KV_UNDEF,321,KV_UNDEF,237,KV_UNDEF,237,KV_UNDEF,270,KV_UNDEF,270,KV_UNDEF,229,KV_UNDEF,233,KV_UNDEF,262,KV_UNDEF,262,KV_UNDEF,261,KV_UNDEF,261,KV_UNDEF,237,KV_UNDEF,270,KV_UNDEF,270,KV_UNDEF,276,KV_UNDEF set_mempolicy_home_node,450,KV_UNDEF,450,KV_UNDEF,450,KV_UNDEF,450,KV_UNDEF,450,KV_UNDEF,450,KV_UNDEF,450,KV_UNDEF,450,KV_UNDEF,450,KV_UNDEF,450,KV_UNDEF,450,KV_UNDEF,450,KV_UNDEF,450,KV_UNDEF,450,KV_UNDEF,450,KV_UNDEF,450,KV_UNDEF,450,KV_UNDEF,450,KV_UNDEF setns,346,KV_UNDEF,308,KV_UNDEF,308,KV_UNDEF,375,KV_UNDEF,268,KV_UNDEF,268,KV_UNDEF,344,KV_UNDEF,344,KV_UNDEF,303,KV_UNDEF,308,KV_UNDEF,328,KV_UNDEF,328,KV_UNDEF,350,KV_UNDEF,350,KV_UNDEF,268,KV_UNDEF,339,KV_UNDEF,339,KV_UNDEF,364,KV_UNDEF setpgid,57,KV_UNDEF,109,KV_UNDEF,109,KV_UNDEF,57,KV_UNDEF,154,KV_UNDEF,154,KV_UNDEF,57,KV_UNDEF,57,KV_UNDEF,107,KV_UNDEF,107,KV_UNDEF,57,KV_UNDEF,57,KV_UNDEF,57,KV_UNDEF,57,KV_UNDEF,154,KV_UNDEF,57,KV_UNDEF,57,KV_UNDEF,57,KV_UNDEF setpriority,97,KV_UNDEF,141,KV_UNDEF,141,KV_UNDEF,97,KV_UNDEF,140,KV_UNDEF,140,KV_UNDEF,97,KV_UNDEF,97,KV_UNDEF,138,KV_UNDEF,138,KV_UNDEF,97,KV_UNDEF,97,KV_UNDEF,97,KV_UNDEF,97,KV_UNDEF,140,KV_UNDEF,97,KV_UNDEF,97,KV_UNDEF,97,KV_UNDEF setregid,71,KV_UNDEF,114,KV_UNDEF,114,KV_UNDEF,71,KV_UNDEF,143,KV_UNDEF,143,KV_UNDEF,71,KV_UNDEF,71,KV_UNDEF,112,KV_UNDEF,112,KV_UNDEF,71,KV_UNDEF,71,KV_UNDEF,71,KV_UNDEF,71,KV_UNDEF,143,KV_UNDEF,71,KV_UNDEF,204,KV_UNDEF,71,KV_UNDEF setregid32,204,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,204,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,204,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,204,KV_UNDEF,PNR,KV_UNDEF,204,KV_UNDEF setresgid,170,KV_UNDEF,119,KV_UNDEF,119,KV_UNDEF,170,KV_UNDEF,149,KV_UNDEF,149,KV_UNDEF,170,KV_UNDEF,190,KV_UNDEF,117,KV_UNDEF,117,KV_UNDEF,170,KV_UNDEF,170,KV_UNDEF,169,KV_UNDEF,169,KV_UNDEF,149,KV_UNDEF,170,KV_UNDEF,210,KV_UNDEF,170,KV_UNDEF setresgid32,210,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,210,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,210,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,210,KV_UNDEF,PNR,KV_UNDEF,210,KV_UNDEF setresuid,164,KV_UNDEF,117,KV_UNDEF,117,KV_UNDEF,164,KV_UNDEF,147,KV_UNDEF,147,KV_UNDEF,164,KV_UNDEF,185,KV_UNDEF,115,KV_UNDEF,115,KV_UNDEF,164,KV_UNDEF,164,KV_UNDEF,164,KV_UNDEF,164,KV_UNDEF,147,KV_UNDEF,164,KV_UNDEF,208,KV_UNDEF,164,KV_UNDEF setresuid32,208,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,208,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,208,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,208,KV_UNDEF,PNR,KV_UNDEF,208,KV_UNDEF setreuid,70,KV_UNDEF,113,KV_UNDEF,113,KV_UNDEF,70,KV_UNDEF,145,KV_UNDEF,145,KV_UNDEF,70,KV_UNDEF,70,KV_UNDEF,111,KV_UNDEF,111,KV_UNDEF,70,KV_UNDEF,70,KV_UNDEF,70,KV_UNDEF,70,KV_UNDEF,145,KV_UNDEF,70,KV_UNDEF,203,KV_UNDEF,70,KV_UNDEF setreuid32,203,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,203,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,203,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,203,KV_UNDEF,PNR,KV_UNDEF,203,KV_UNDEF setrlimit,75,KV_UNDEF,160,KV_UNDEF,160,KV_UNDEF,75,KV_UNDEF,164,KV_UNDEF,PNR,KV_UNDEF,75,KV_UNDEF,75,KV_UNDEF,155,KV_UNDEF,155,KV_UNDEF,75,KV_UNDEF,75,KV_UNDEF,75,KV_UNDEF,75,KV_UNDEF,164,KV_UNDEF,75,KV_UNDEF,75,KV_UNDEF,75,KV_UNDEF set_robust_list,311,KV_UNDEF,273,KV_UNDEF,530,KV_UNDEF,338,KV_UNDEF,99,KV_UNDEF,99,KV_UNDEF,304,KV_UNDEF,309,KV_UNDEF,268,KV_UNDEF,272,KV_UNDEF,289,KV_UNDEF,289,KV_UNDEF,300,KV_UNDEF,300,KV_UNDEF,99,KV_UNDEF,304,KV_UNDEF,304,KV_UNDEF,311,KV_UNDEF setsid,66,KV_UNDEF,112,KV_UNDEF,112,KV_UNDEF,66,KV_UNDEF,157,KV_UNDEF,157,KV_UNDEF,66,KV_UNDEF,66,KV_UNDEF,110,KV_UNDEF,110,KV_UNDEF,66,KV_UNDEF,66,KV_UNDEF,66,KV_UNDEF,66,KV_UNDEF,157,KV_UNDEF,66,KV_UNDEF,66,KV_UNDEF,66,KV_UNDEF setsockopt,366,KV_UNDEF,54,KV_UNDEF,541,KV_UNDEF,294,KV_UNDEF,208,KV_UNDEF,208,KV_UNDEF,363,KV_UNDEF,181,KV_UNDEF,53,KV_UNDEF,53,KV_UNDEF,181,KV_UNDEF,181,KV_UNDEF,339,KV_UNDEF,339,KV_UNDEF,208,KV_UNDEF,366,KV_UNDEF,366,KV_UNDEF,353,KV_UNDEF set_thread_area,243,KV_UNDEF,205,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,334,KV_UNDEF,283,KV_UNDEF,242,KV_UNDEF,246,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF set_tid_address,258,KV_UNDEF,218,KV_UNDEF,218,KV_UNDEF,256,KV_UNDEF,96,KV_UNDEF,96,KV_UNDEF,253,KV_UNDEF,252,KV_UNDEF,212,KV_UNDEF,213,KV_UNDEF,237,KV_UNDEF,237,KV_UNDEF,232,KV_UNDEF,232,KV_UNDEF,96,KV_UNDEF,252,KV_UNDEF,252,KV_UNDEF,258,KV_UNDEF settimeofday,79,KV_UNDEF,164,KV_UNDEF,164,KV_UNDEF,79,KV_UNDEF,170,KV_UNDEF,170,KV_UNDEF,79,KV_UNDEF,79,KV_UNDEF,159,KV_UNDEF,159,KV_UNDEF,79,KV_UNDEF,79,KV_UNDEF,79,KV_UNDEF,79,KV_UNDEF,170,KV_UNDEF,79,KV_UNDEF,79,KV_UNDEF,79,KV_UNDEF set_tls,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,983045,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF setuid,23,KV_UNDEF,105,KV_UNDEF,105,KV_UNDEF,23,KV_UNDEF,146,KV_UNDEF,146,KV_UNDEF,23,KV_UNDEF,23,KV_UNDEF,103,KV_UNDEF,103,KV_UNDEF,23,KV_UNDEF,23,KV_UNDEF,23,KV_UNDEF,23,KV_UNDEF,146,KV_UNDEF,23,KV_UNDEF,213,KV_UNDEF,23,KV_UNDEF setuid32,213,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,213,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,213,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,213,KV_UNDEF,PNR,KV_UNDEF,213,KV_UNDEF setxattr,226,KV_UNDEF,188,KV_UNDEF,188,KV_UNDEF,226,KV_UNDEF,5,KV_UNDEF,5,KV_UNDEF,223,KV_UNDEF,224,KV_UNDEF,180,KV_UNDEF,180,KV_UNDEF,238,KV_UNDEF,238,KV_UNDEF,209,KV_UNDEF,209,KV_UNDEF,5,KV_UNDEF,224,KV_UNDEF,224,KV_UNDEF,226,KV_UNDEF sgetmask,68,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,68,KV_UNDEF,68,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,68,KV_UNDEF,68,KV_UNDEF,68,KV_UNDEF,68,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,68,KV_UNDEF shmat,397,KV_UNDEF,30,KV_UNDEF,30,KV_UNDEF,305,KV_UNDEF,196,KV_UNDEF,196,KV_UNDEF,397,KV_UNDEF,397,KV_UNDEF,29,KV_UNDEF,29,KV_UNDEF,192,KV_UNDEF,192,KV_UNDEF,397,KV_UNDEF,397,KV_UNDEF,196,KV_UNDEF,397,KV_UNDEF,397,KV_UNDEF,397,KV_UNDEF shmctl,396,KV_UNDEF,31,KV_UNDEF,31,KV_UNDEF,308,KV_UNDEF,195,KV_UNDEF,195,KV_UNDEF,396,KV_UNDEF,396,KV_UNDEF,30,KV_UNDEF,30,KV_UNDEF,195,KV_UNDEF,195,KV_UNDEF,396,KV_UNDEF,396,KV_UNDEF,195,KV_UNDEF,396,KV_UNDEF,396,KV_UNDEF,396,KV_UNDEF shmdt,398,KV_UNDEF,67,KV_UNDEF,67,KV_UNDEF,306,KV_UNDEF,197,KV_UNDEF,197,KV_UNDEF,398,KV_UNDEF,398,KV_UNDEF,65,KV_UNDEF,65,KV_UNDEF,193,KV_UNDEF,193,KV_UNDEF,398,KV_UNDEF,398,KV_UNDEF,197,KV_UNDEF,398,KV_UNDEF,398,KV_UNDEF,398,KV_UNDEF shmget,395,KV_UNDEF,29,KV_UNDEF,29,KV_UNDEF,307,KV_UNDEF,194,KV_UNDEF,194,KV_UNDEF,395,KV_UNDEF,395,KV_UNDEF,28,KV_UNDEF,28,KV_UNDEF,194,KV_UNDEF,194,KV_UNDEF,395,KV_UNDEF,395,KV_UNDEF,194,KV_UNDEF,395,KV_UNDEF,395,KV_UNDEF,395,KV_UNDEF shutdown,373,KV_UNDEF,48,KV_UNDEF,48,KV_UNDEF,293,KV_UNDEF,210,KV_UNDEF,210,KV_UNDEF,370,KV_UNDEF,182,KV_UNDEF,47,KV_UNDEF,47,KV_UNDEF,117,KV_UNDEF,117,KV_UNDEF,338,KV_UNDEF,338,KV_UNDEF,210,KV_UNDEF,373,KV_UNDEF,373,KV_UNDEF,352,KV_UNDEF sigaction,67,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,67,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,67,KV_UNDEF,67,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,67,KV_UNDEF,67,KV_UNDEF,PNR,KV_UNDEF,67,KV_UNDEF,67,KV_UNDEF,67,KV_UNDEF sigaltstack,186,KV_UNDEF,131,KV_UNDEF,525,KV_UNDEF,186,KV_UNDEF,132,KV_UNDEF,132,KV_UNDEF,186,KV_UNDEF,206,KV_UNDEF,129,KV_UNDEF,129,KV_UNDEF,166,KV_UNDEF,166,KV_UNDEF,185,KV_UNDEF,185,KV_UNDEF,132,KV_UNDEF,186,KV_UNDEF,186,KV_UNDEF,186,KV_UNDEF signal,48,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,48,KV_UNDEF,48,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,48,KV_UNDEF,48,KV_UNDEF,48,KV_UNDEF,48,KV_UNDEF,PNR,KV_UNDEF,48,KV_UNDEF,48,KV_UNDEF,48,KV_UNDEF signalfd,321,KV_UNDEF,282,KV_UNDEF,282,KV_UNDEF,349,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,317,KV_UNDEF,317,KV_UNDEF,276,KV_UNDEF,280,KV_UNDEF,302,KV_UNDEF,302,KV_UNDEF,305,KV_UNDEF,305,KV_UNDEF,PNR,KV_UNDEF,316,KV_UNDEF,316,KV_UNDEF,321,KV_UNDEF signalfd4,327,KV_UNDEF,289,KV_UNDEF,289,KV_UNDEF,355,KV_UNDEF,74,KV_UNDEF,74,KV_UNDEF,323,KV_UNDEF,324,KV_UNDEF,283,KV_UNDEF,287,KV_UNDEF,309,KV_UNDEF,309,KV_UNDEF,313,KV_UNDEF,313,KV_UNDEF,74,KV_UNDEF,322,KV_UNDEF,322,KV_UNDEF,327,KV_UNDEF sigpending,73,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,73,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,73,KV_UNDEF,73,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,73,KV_UNDEF,73,KV_UNDEF,73,KV_UNDEF,73,KV_UNDEF,PNR,KV_UNDEF,73,KV_UNDEF,73,KV_UNDEF,73,KV_UNDEF sigprocmask,126,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,126,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,126,KV_UNDEF,126,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,126,KV_UNDEF,126,KV_UNDEF,126,KV_UNDEF,126,KV_UNDEF,PNR,KV_UNDEF,126,KV_UNDEF,126,KV_UNDEF,126,KV_UNDEF sigreturn,119,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,119,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,119,KV_UNDEF,119,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,119,KV_UNDEF,119,KV_UNDEF,PNR,KV_UNDEF,119,KV_UNDEF,119,KV_UNDEF,119,KV_UNDEF sigsuspend,72,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,72,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,72,KV_UNDEF,72,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,72,KV_UNDEF,72,KV_UNDEF,PNR,KV_UNDEF,72,KV_UNDEF,72,KV_UNDEF,72,KV_UNDEF socket,359,KV_UNDEF,41,KV_UNDEF,41,KV_UNDEF,281,KV_UNDEF,198,KV_UNDEF,198,KV_UNDEF,356,KV_UNDEF,183,KV_UNDEF,40,KV_UNDEF,40,KV_UNDEF,17,KV_UNDEF,17,KV_UNDEF,326,KV_UNDEF,326,KV_UNDEF,198,KV_UNDEF,359,KV_UNDEF,359,KV_UNDEF,340,KV_UNDEF socketcall,102,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,102,KV_UNDEF,102,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,102,KV_UNDEF,102,KV_UNDEF,PNR,KV_UNDEF,102,KV_UNDEF,102,KV_UNDEF,102,KV_UNDEF socketpair,360,KV_UNDEF,53,KV_UNDEF,53,KV_UNDEF,288,KV_UNDEF,199,KV_UNDEF,199,KV_UNDEF,357,KV_UNDEF,184,KV_UNDEF,52,KV_UNDEF,52,KV_UNDEF,56,KV_UNDEF,56,KV_UNDEF,333,KV_UNDEF,333,KV_UNDEF,199,KV_UNDEF,360,KV_UNDEF,360,KV_UNDEF,347,KV_UNDEF splice,313,KV_UNDEF,275,KV_UNDEF,275,KV_UNDEF,340,KV_UNDEF,76,KV_UNDEF,76,KV_UNDEF,306,KV_UNDEF,304,KV_UNDEF,263,KV_UNDEF,267,KV_UNDEF,291,KV_UNDEF,291,KV_UNDEF,283,KV_UNDEF,283,KV_UNDEF,76,KV_UNDEF,306,KV_UNDEF,306,KV_UNDEF,313,KV_UNDEF spu_create,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,279,KV_UNDEF,279,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF spu_run,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,278,KV_UNDEF,278,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF ssetmask,69,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,69,KV_UNDEF,69,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,69,KV_UNDEF,69,KV_UNDEF,69,KV_UNDEF,69,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,69,KV_UNDEF stat,106,KV_UNDEF,4,KV_UNDEF,4,KV_UNDEF,106,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,106,KV_UNDEF,106,KV_UNDEF,4,KV_UNDEF,4,KV_UNDEF,18,KV_UNDEF,18,KV_UNDEF,106,KV_UNDEF,106,KV_UNDEF,PNR,KV_UNDEF,106,KV_UNDEF,106,KV_UNDEF,106,KV_UNDEF stat64,195,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,195,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,195,KV_UNDEF,213,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,101,KV_UNDEF,101,KV_UNDEF,195,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,195,KV_UNDEF,PNR,KV_UNDEF,195,KV_UNDEF statfs,99,KV_UNDEF,137,KV_UNDEF,137,KV_UNDEF,99,KV_UNDEF,43,KV_UNDEF,43,KV_UNDEF,99,KV_UNDEF,99,KV_UNDEF,134,KV_UNDEF,134,KV_UNDEF,99,KV_UNDEF,99,KV_UNDEF,99,KV_UNDEF,99,KV_UNDEF,43,KV_UNDEF,99,KV_UNDEF,99,KV_UNDEF,99,KV_UNDEF statfs64,268,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,266,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,263,KV_UNDEF,255,KV_UNDEF,PNR,KV_UNDEF,217,KV_UNDEF,298,KV_UNDEF,298,KV_UNDEF,252,KV_UNDEF,252,KV_UNDEF,PNR,KV_UNDEF,265,KV_UNDEF,265,KV_UNDEF,268,KV_UNDEF statx,383,KV_UNDEF,332,KV_UNDEF,332,KV_UNDEF,397,KV_UNDEF,291,KV_UNDEF,291,KV_UNDEF,379,KV_UNDEF,366,KV_UNDEF,326,KV_UNDEF,330,KV_UNDEF,349,KV_UNDEF,349,KV_UNDEF,383,KV_UNDEF,383,KV_UNDEF,291,KV_UNDEF,379,KV_UNDEF,379,KV_UNDEF,383,KV_UNDEF stime,25,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,25,KV_UNDEF,25,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,25,KV_UNDEF,25,KV_UNDEF,25,KV_UNDEF,25,KV_UNDEF,PNR,KV_UNDEF,25,KV_UNDEF,PNR,KV_UNDEF,25,KV_UNDEF stty,31,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,31,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,31,KV_UNDEF,31,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF subpage_prot,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,310,KV_UNDEF,310,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF swapcontext,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,249,KV_UNDEF,249,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF swapoff,115,KV_UNDEF,168,KV_UNDEF,168,KV_UNDEF,115,KV_UNDEF,225,KV_UNDEF,225,KV_UNDEF,115,KV_UNDEF,115,KV_UNDEF,163,KV_UNDEF,163,KV_UNDEF,115,KV_UNDEF,115,KV_UNDEF,115,KV_UNDEF,115,KV_UNDEF,225,KV_UNDEF,115,KV_UNDEF,115,KV_UNDEF,115,KV_UNDEF swapon,87,KV_UNDEF,167,KV_UNDEF,167,KV_UNDEF,87,KV_UNDEF,224,KV_UNDEF,224,KV_UNDEF,87,KV_UNDEF,87,KV_UNDEF,162,KV_UNDEF,162,KV_UNDEF,87,KV_UNDEF,87,KV_UNDEF,87,KV_UNDEF,87,KV_UNDEF,224,KV_UNDEF,87,KV_UNDEF,87,KV_UNDEF,87,KV_UNDEF switch_endian,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,363,KV_UNDEF,363,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF symlink,83,KV_UNDEF,88,KV_UNDEF,88,KV_UNDEF,83,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,83,KV_UNDEF,83,KV_UNDEF,86,KV_UNDEF,86,KV_UNDEF,83,KV_UNDEF,83,KV_UNDEF,83,KV_UNDEF,83,KV_UNDEF,PNR,KV_UNDEF,83,KV_UNDEF,83,KV_UNDEF,83,KV_UNDEF symlinkat,304,KV_UNDEF,266,KV_UNDEF,266,KV_UNDEF,331,KV_UNDEF,36,KV_UNDEF,36,KV_UNDEF,297,KV_UNDEF,297,KV_UNDEF,256,KV_UNDEF,260,KV_UNDEF,284,KV_UNDEF,284,KV_UNDEF,295,KV_UNDEF,295,KV_UNDEF,36,KV_UNDEF,297,KV_UNDEF,297,KV_UNDEF,304,KV_UNDEF sync,36,KV_UNDEF,162,KV_UNDEF,162,KV_UNDEF,36,KV_UNDEF,81,KV_UNDEF,81,KV_UNDEF,36,KV_UNDEF,36,KV_UNDEF,157,KV_UNDEF,157,KV_UNDEF,36,KV_UNDEF,36,KV_UNDEF,36,KV_UNDEF,36,KV_UNDEF,81,KV_UNDEF,36,KV_UNDEF,36,KV_UNDEF,36,KV_UNDEF sync_file_range,314,KV_UNDEF,277,KV_UNDEF,277,KV_UNDEF,PNR,KV_UNDEF,84,KV_UNDEF,84,KV_UNDEF,307,KV_UNDEF,305,KV_UNDEF,264,KV_UNDEF,268,KV_UNDEF,292,KV_UNDEF,292,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,84,KV_UNDEF,307,KV_UNDEF,307,KV_UNDEF,314,KV_UNDEF sync_file_range2,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,308,KV_UNDEF,308,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF syncfs,344,KV_UNDEF,306,KV_UNDEF,306,KV_UNDEF,373,KV_UNDEF,267,KV_UNDEF,267,KV_UNDEF,343,KV_UNDEF,342,KV_UNDEF,301,KV_UNDEF,306,KV_UNDEF,327,KV_UNDEF,327,KV_UNDEF,348,KV_UNDEF,348,KV_UNDEF,267,KV_UNDEF,338,KV_UNDEF,338,KV_UNDEF,362,KV_UNDEF syscall,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,0,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF _sysctl,149,KV_UNDEF,156,KV_UNDEF,PNR,KV_UNDEF,149,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,149,KV_UNDEF,153,KV_UNDEF,152,KV_UNDEF,152,KV_UNDEF,149,KV_UNDEF,149,KV_UNDEF,149,KV_UNDEF,149,KV_UNDEF,PNR,KV_UNDEF,149,KV_UNDEF,149,KV_UNDEF,149,KV_UNDEF sys_debug_setcontext,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,256,KV_UNDEF,256,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF sysfs,135,KV_UNDEF,139,KV_UNDEF,139,KV_UNDEF,135,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,135,KV_UNDEF,135,KV_UNDEF,136,KV_UNDEF,136,KV_UNDEF,135,KV_UNDEF,135,KV_UNDEF,135,KV_UNDEF,135,KV_UNDEF,PNR,KV_UNDEF,135,KV_UNDEF,135,KV_UNDEF,135,KV_UNDEF sysinfo,116,KV_UNDEF,99,KV_UNDEF,99,KV_UNDEF,116,KV_UNDEF,179,KV_UNDEF,179,KV_UNDEF,116,KV_UNDEF,116,KV_UNDEF,97,KV_UNDEF,97,KV_UNDEF,116,KV_UNDEF,116,KV_UNDEF,116,KV_UNDEF,116,KV_UNDEF,179,KV_UNDEF,116,KV_UNDEF,116,KV_UNDEF,116,KV_UNDEF syslog,103,KV_UNDEF,103,KV_UNDEF,103,KV_UNDEF,103,KV_UNDEF,116,KV_UNDEF,116,KV_UNDEF,103,KV_UNDEF,103,KV_UNDEF,101,KV_UNDEF,101,KV_UNDEF,103,KV_UNDEF,103,KV_UNDEF,103,KV_UNDEF,103,KV_UNDEF,116,KV_UNDEF,103,KV_UNDEF,103,KV_UNDEF,103,KV_UNDEF sysmips,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,149,KV_UNDEF,199,KV_UNDEF,199,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF tee,315,KV_UNDEF,276,KV_UNDEF,276,KV_UNDEF,342,KV_UNDEF,77,KV_UNDEF,77,KV_UNDEF,308,KV_UNDEF,306,KV_UNDEF,265,KV_UNDEF,269,KV_UNDEF,293,KV_UNDEF,293,KV_UNDEF,284,KV_UNDEF,284,KV_UNDEF,77,KV_UNDEF,308,KV_UNDEF,308,KV_UNDEF,315,KV_UNDEF tgkill,270,KV_UNDEF,234,KV_UNDEF,234,KV_UNDEF,268,KV_UNDEF,131,KV_UNDEF,131,KV_UNDEF,265,KV_UNDEF,266,KV_UNDEF,225,KV_UNDEF,229,KV_UNDEF,259,KV_UNDEF,259,KV_UNDEF,250,KV_UNDEF,250,KV_UNDEF,131,KV_UNDEF,241,KV_UNDEF,241,KV_UNDEF,270,KV_UNDEF time,13,KV_UNDEF,201,KV_UNDEF,201,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,13,KV_UNDEF,13,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,13,KV_UNDEF,13,KV_UNDEF,13,KV_UNDEF,13,KV_UNDEF,PNR,KV_UNDEF,13,KV_UNDEF,PNR,KV_UNDEF,13,KV_UNDEF timer_create,259,KV_UNDEF,222,KV_UNDEF,526,KV_UNDEF,257,KV_UNDEF,107,KV_UNDEF,107,KV_UNDEF,254,KV_UNDEF,257,KV_UNDEF,216,KV_UNDEF,220,KV_UNDEF,250,KV_UNDEF,250,KV_UNDEF,240,KV_UNDEF,240,KV_UNDEF,107,KV_UNDEF,254,KV_UNDEF,254,KV_UNDEF,259,KV_UNDEF timer_delete,263,KV_UNDEF,226,KV_UNDEF,226,KV_UNDEF,261,KV_UNDEF,111,KV_UNDEF,111,KV_UNDEF,258,KV_UNDEF,261,KV_UNDEF,220,KV_UNDEF,224,KV_UNDEF,254,KV_UNDEF,254,KV_UNDEF,244,KV_UNDEF,244,KV_UNDEF,111,KV_UNDEF,258,KV_UNDEF,258,KV_UNDEF,263,KV_UNDEF timerfd,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,318,KV_UNDEF,277,KV_UNDEF,281,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,317,KV_UNDEF,317,KV_UNDEF,PNR,KV_UNDEF timerfd_create,322,KV_UNDEF,283,KV_UNDEF,283,KV_UNDEF,350,KV_UNDEF,85,KV_UNDEF,85,KV_UNDEF,318,KV_UNDEF,321,KV_UNDEF,280,KV_UNDEF,284,KV_UNDEF,306,KV_UNDEF,306,KV_UNDEF,306,KV_UNDEF,306,KV_UNDEF,85,KV_UNDEF,319,KV_UNDEF,319,KV_UNDEF,322,KV_UNDEF timerfd_gettime,326,KV_UNDEF,287,KV_UNDEF,287,KV_UNDEF,354,KV_UNDEF,87,KV_UNDEF,87,KV_UNDEF,322,KV_UNDEF,322,KV_UNDEF,281,KV_UNDEF,285,KV_UNDEF,308,KV_UNDEF,308,KV_UNDEF,312,KV_UNDEF,312,KV_UNDEF,87,KV_UNDEF,321,KV_UNDEF,321,KV_UNDEF,326,KV_UNDEF timerfd_gettime64,410,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,410,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,410,KV_UNDEF,410,KV_UNDEF,PNR,KV_UNDEF,410,KV_UNDEF,410,KV_UNDEF,PNR,KV_UNDEF,410,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,410,KV_UNDEF,PNR,KV_UNDEF,410,KV_UNDEF timerfd_settime,325,KV_UNDEF,286,KV_UNDEF,286,KV_UNDEF,353,KV_UNDEF,86,KV_UNDEF,86,KV_UNDEF,321,KV_UNDEF,323,KV_UNDEF,282,KV_UNDEF,286,KV_UNDEF,307,KV_UNDEF,307,KV_UNDEF,311,KV_UNDEF,311,KV_UNDEF,86,KV_UNDEF,320,KV_UNDEF,320,KV_UNDEF,325,KV_UNDEF timerfd_settime64,411,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,411,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,411,KV_UNDEF,411,KV_UNDEF,PNR,KV_UNDEF,411,KV_UNDEF,411,KV_UNDEF,PNR,KV_UNDEF,411,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,411,KV_UNDEF,PNR,KV_UNDEF,411,KV_UNDEF timer_getoverrun,262,KV_UNDEF,225,KV_UNDEF,225,KV_UNDEF,260,KV_UNDEF,109,KV_UNDEF,109,KV_UNDEF,257,KV_UNDEF,260,KV_UNDEF,219,KV_UNDEF,223,KV_UNDEF,253,KV_UNDEF,253,KV_UNDEF,243,KV_UNDEF,243,KV_UNDEF,109,KV_UNDEF,257,KV_UNDEF,257,KV_UNDEF,262,KV_UNDEF timer_gettime,261,KV_UNDEF,224,KV_UNDEF,224,KV_UNDEF,259,KV_UNDEF,108,KV_UNDEF,108,KV_UNDEF,256,KV_UNDEF,259,KV_UNDEF,218,KV_UNDEF,222,KV_UNDEF,252,KV_UNDEF,252,KV_UNDEF,242,KV_UNDEF,242,KV_UNDEF,108,KV_UNDEF,256,KV_UNDEF,256,KV_UNDEF,261,KV_UNDEF timer_gettime64,408,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,408,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,408,KV_UNDEF,408,KV_UNDEF,PNR,KV_UNDEF,408,KV_UNDEF,408,KV_UNDEF,PNR,KV_UNDEF,408,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,408,KV_UNDEF,PNR,KV_UNDEF,408,KV_UNDEF timer_settime,260,KV_UNDEF,223,KV_UNDEF,223,KV_UNDEF,258,KV_UNDEF,110,KV_UNDEF,110,KV_UNDEF,255,KV_UNDEF,258,KV_UNDEF,217,KV_UNDEF,221,KV_UNDEF,251,KV_UNDEF,251,KV_UNDEF,241,KV_UNDEF,241,KV_UNDEF,110,KV_UNDEF,255,KV_UNDEF,255,KV_UNDEF,260,KV_UNDEF timer_settime64,409,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,409,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,409,KV_UNDEF,409,KV_UNDEF,PNR,KV_UNDEF,409,KV_UNDEF,409,KV_UNDEF,PNR,KV_UNDEF,409,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,409,KV_UNDEF,PNR,KV_UNDEF,409,KV_UNDEF times,43,KV_UNDEF,100,KV_UNDEF,100,KV_UNDEF,43,KV_UNDEF,153,KV_UNDEF,153,KV_UNDEF,43,KV_UNDEF,43,KV_UNDEF,98,KV_UNDEF,98,KV_UNDEF,43,KV_UNDEF,43,KV_UNDEF,43,KV_UNDEF,43,KV_UNDEF,153,KV_UNDEF,43,KV_UNDEF,43,KV_UNDEF,43,KV_UNDEF tkill,238,KV_UNDEF,200,KV_UNDEF,200,KV_UNDEF,238,KV_UNDEF,130,KV_UNDEF,130,KV_UNDEF,222,KV_UNDEF,236,KV_UNDEF,192,KV_UNDEF,192,KV_UNDEF,208,KV_UNDEF,208,KV_UNDEF,208,KV_UNDEF,208,KV_UNDEF,130,KV_UNDEF,237,KV_UNDEF,237,KV_UNDEF,238,KV_UNDEF truncate,92,KV_UNDEF,76,KV_UNDEF,76,KV_UNDEF,92,KV_UNDEF,45,KV_UNDEF,45,KV_UNDEF,92,KV_UNDEF,92,KV_UNDEF,74,KV_UNDEF,74,KV_UNDEF,92,KV_UNDEF,92,KV_UNDEF,92,KV_UNDEF,92,KV_UNDEF,45,KV_UNDEF,92,KV_UNDEF,92,KV_UNDEF,92,KV_UNDEF truncate64,193,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,193,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,193,KV_UNDEF,211,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,199,KV_UNDEF,199,KV_UNDEF,193,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,193,KV_UNDEF,PNR,KV_UNDEF,193,KV_UNDEF tuxcall,PNR,KV_UNDEF,184,KV_UNDEF,184,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,225,KV_UNDEF,225,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF ugetrlimit,191,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,191,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,191,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,190,KV_UNDEF,190,KV_UNDEF,PNR,KV_UNDEF,191,KV_UNDEF,PNR,KV_UNDEF,191,KV_UNDEF ulimit,58,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,58,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,58,KV_UNDEF,58,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF umask,60,KV_UNDEF,95,KV_UNDEF,95,KV_UNDEF,60,KV_UNDEF,166,KV_UNDEF,166,KV_UNDEF,60,KV_UNDEF,60,KV_UNDEF,93,KV_UNDEF,93,KV_UNDEF,60,KV_UNDEF,60,KV_UNDEF,60,KV_UNDEF,60,KV_UNDEF,166,KV_UNDEF,60,KV_UNDEF,60,KV_UNDEF,60,KV_UNDEF umount,22,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,22,KV_UNDEF,22,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,22,KV_UNDEF,22,KV_UNDEF,PNR,KV_UNDEF,22,KV_UNDEF,22,KV_UNDEF,22,KV_UNDEF umount2,52,KV_UNDEF,166,KV_UNDEF,166,KV_UNDEF,52,KV_UNDEF,39,KV_UNDEF,39,KV_UNDEF,52,KV_UNDEF,52,KV_UNDEF,161,KV_UNDEF,161,KV_UNDEF,52,KV_UNDEF,52,KV_UNDEF,52,KV_UNDEF,52,KV_UNDEF,39,KV_UNDEF,52,KV_UNDEF,52,KV_UNDEF,52,KV_UNDEF uname,122,KV_UNDEF,63,KV_UNDEF,63,KV_UNDEF,122,KV_UNDEF,160,KV_UNDEF,160,KV_UNDEF,122,KV_UNDEF,122,KV_UNDEF,61,KV_UNDEF,61,KV_UNDEF,59,KV_UNDEF,59,KV_UNDEF,122,KV_UNDEF,122,KV_UNDEF,160,KV_UNDEF,122,KV_UNDEF,122,KV_UNDEF,122,KV_UNDEF unlink,10,KV_UNDEF,87,KV_UNDEF,87,KV_UNDEF,10,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,10,KV_UNDEF,10,KV_UNDEF,85,KV_UNDEF,85,KV_UNDEF,10,KV_UNDEF,10,KV_UNDEF,10,KV_UNDEF,10,KV_UNDEF,PNR,KV_UNDEF,10,KV_UNDEF,10,KV_UNDEF,10,KV_UNDEF unlinkat,301,KV_UNDEF,263,KV_UNDEF,263,KV_UNDEF,328,KV_UNDEF,35,KV_UNDEF,35,KV_UNDEF,294,KV_UNDEF,294,KV_UNDEF,253,KV_UNDEF,257,KV_UNDEF,281,KV_UNDEF,281,KV_UNDEF,292,KV_UNDEF,292,KV_UNDEF,35,KV_UNDEF,294,KV_UNDEF,294,KV_UNDEF,301,KV_UNDEF unshare,310,KV_UNDEF,272,KV_UNDEF,272,KV_UNDEF,337,KV_UNDEF,97,KV_UNDEF,97,KV_UNDEF,303,KV_UNDEF,303,KV_UNDEF,262,KV_UNDEF,266,KV_UNDEF,288,KV_UNDEF,288,KV_UNDEF,282,KV_UNDEF,282,KV_UNDEF,97,KV_UNDEF,303,KV_UNDEF,303,KV_UNDEF,310,KV_UNDEF uselib,86,KV_UNDEF,134,KV_UNDEF,PNR,KV_UNDEF,86,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,86,KV_UNDEF,86,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,86,KV_UNDEF,86,KV_UNDEF,86,KV_UNDEF,86,KV_UNDEF,PNR,KV_UNDEF,86,KV_UNDEF,86,KV_UNDEF,86,KV_UNDEF userfaultfd,374,KV_UNDEF,323,KV_UNDEF,323,KV_UNDEF,388,KV_UNDEF,282,KV_UNDEF,282,KV_UNDEF,373,KV_UNDEF,357,KV_UNDEF,317,KV_UNDEF,321,KV_UNDEF,344,KV_UNDEF,344,KV_UNDEF,364,KV_UNDEF,364,KV_UNDEF,282,KV_UNDEF,355,KV_UNDEF,355,KV_UNDEF,377,KV_UNDEF usr26,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,983043,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF usr32,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,983044,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF ustat,62,KV_UNDEF,136,KV_UNDEF,136,KV_UNDEF,62,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,62,KV_UNDEF,62,KV_UNDEF,133,KV_UNDEF,133,KV_UNDEF,62,KV_UNDEF,62,KV_UNDEF,62,KV_UNDEF,62,KV_UNDEF,PNR,KV_UNDEF,62,KV_UNDEF,62,KV_UNDEF,62,KV_UNDEF utime,30,KV_UNDEF,132,KV_UNDEF,132,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,30,KV_UNDEF,30,KV_UNDEF,130,KV_UNDEF,130,KV_UNDEF,30,KV_UNDEF,30,KV_UNDEF,30,KV_UNDEF,30,KV_UNDEF,PNR,KV_UNDEF,30,KV_UNDEF,30,KV_UNDEF,30,KV_UNDEF utimensat,320,KV_UNDEF,280,KV_UNDEF,280,KV_UNDEF,348,KV_UNDEF,88,KV_UNDEF,88,KV_UNDEF,316,KV_UNDEF,316,KV_UNDEF,275,KV_UNDEF,279,KV_UNDEF,301,KV_UNDEF,301,KV_UNDEF,304,KV_UNDEF,304,KV_UNDEF,88,KV_UNDEF,315,KV_UNDEF,315,KV_UNDEF,320,KV_UNDEF utimensat_time64,412,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,412,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,412,KV_UNDEF,412,KV_UNDEF,PNR,KV_UNDEF,412,KV_UNDEF,412,KV_UNDEF,PNR,KV_UNDEF,412,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,412,KV_UNDEF,PNR,KV_UNDEF,412,KV_UNDEF utimes,271,KV_UNDEF,235,KV_UNDEF,235,KV_UNDEF,269,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,266,KV_UNDEF,267,KV_UNDEF,226,KV_UNDEF,230,KV_UNDEF,336,KV_UNDEF,336,KV_UNDEF,251,KV_UNDEF,251,KV_UNDEF,PNR,KV_UNDEF,313,KV_UNDEF,313,KV_UNDEF,271,KV_UNDEF vfork,190,KV_UNDEF,58,KV_UNDEF,58,KV_UNDEF,190,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,190,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,113,KV_UNDEF,113,KV_UNDEF,189,KV_UNDEF,189,KV_UNDEF,PNR,KV_UNDEF,190,KV_UNDEF,190,KV_UNDEF,190,KV_UNDEF vhangup,111,KV_UNDEF,153,KV_UNDEF,153,KV_UNDEF,111,KV_UNDEF,58,KV_UNDEF,58,KV_UNDEF,111,KV_UNDEF,111,KV_UNDEF,150,KV_UNDEF,150,KV_UNDEF,111,KV_UNDEF,111,KV_UNDEF,111,KV_UNDEF,111,KV_UNDEF,58,KV_UNDEF,111,KV_UNDEF,111,KV_UNDEF,111,KV_UNDEF vm86,166,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,113,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,113,KV_UNDEF,113,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF vm86old,113,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF vmsplice,316,KV_UNDEF,278,KV_UNDEF,532,KV_UNDEF,343,KV_UNDEF,75,KV_UNDEF,75,KV_UNDEF,309,KV_UNDEF,307,KV_UNDEF,266,KV_UNDEF,270,KV_UNDEF,294,KV_UNDEF,294,KV_UNDEF,285,KV_UNDEF,285,KV_UNDEF,75,KV_UNDEF,309,KV_UNDEF,309,KV_UNDEF,316,KV_UNDEF vserver,273,KV_UNDEF,236,KV_UNDEF,PNR,KV_UNDEF,313,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,277,KV_UNDEF,236,KV_UNDEF,240,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF wait4,114,KV_UNDEF,61,KV_UNDEF,61,KV_UNDEF,114,KV_UNDEF,260,KV_UNDEF,260,KV_UNDEF,114,KV_UNDEF,114,KV_UNDEF,59,KV_UNDEF,59,KV_UNDEF,114,KV_UNDEF,114,KV_UNDEF,114,KV_UNDEF,114,KV_UNDEF,260,KV_UNDEF,114,KV_UNDEF,114,KV_UNDEF,114,KV_UNDEF waitid,284,KV_UNDEF,247,KV_UNDEF,529,KV_UNDEF,280,KV_UNDEF,95,KV_UNDEF,95,KV_UNDEF,277,KV_UNDEF,278,KV_UNDEF,237,KV_UNDEF,241,KV_UNDEF,235,KV_UNDEF,235,KV_UNDEF,272,KV_UNDEF,272,KV_UNDEF,95,KV_UNDEF,281,KV_UNDEF,281,KV_UNDEF,284,KV_UNDEF waitpid,7,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,7,KV_UNDEF,7,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,7,KV_UNDEF,7,KV_UNDEF,7,KV_UNDEF,7,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,PNR,KV_UNDEF,7,KV_UNDEF write,4,KV_UNDEF,1,KV_UNDEF,1,KV_UNDEF,4,KV_UNDEF,64,KV_UNDEF,64,KV_UNDEF,4,KV_UNDEF,4,KV_UNDEF,1,KV_UNDEF,1,KV_UNDEF,4,KV_UNDEF,4,KV_UNDEF,4,KV_UNDEF,4,KV_UNDEF,64,KV_UNDEF,4,KV_UNDEF,4,KV_UNDEF,4,KV_UNDEF writev,146,KV_UNDEF,20,KV_UNDEF,516,KV_UNDEF,146,KV_UNDEF,66,KV_UNDEF,66,KV_UNDEF,146,KV_UNDEF,146,KV_UNDEF,19,KV_UNDEF,19,KV_UNDEF,146,KV_UNDEF,146,KV_UNDEF,146,KV_UNDEF,146,KV_UNDEF,66,KV_UNDEF,146,KV_UNDEF,146,KV_UNDEF,146,KV_UNDEF libseccomp-2.5.4/src/arch-x32.c0000644000000000000000000000517314467535324014645 0ustar rootroot/** * Enhanced Seccomp x32 Specific Code * * Copyright (c) 2013 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "arch.h" #include "arch-x32.h" #include "syscalls.h" /** * Resolve a syscall name to a number * @param arch the architecture definition * @param name the syscall name * * Resolve the given syscall name to the syscall number using the syscall table. * Returns the syscall number on success, including negative pseudo syscall * numbers; returns __NR_SCMP_ERROR on failure. * */ int x32_syscall_resolve_name_munge(const struct arch_def *arch, const char *name) { int sys; /* NOTE: we don't want to modify the pseudo-syscall numbers */ sys = arch->syscall_resolve_name_raw(name); if (sys == __NR_SCMP_ERROR || sys < 0) return sys; return (sys | X32_SYSCALL_BIT); } /** * Resolve a syscall number to a name * @param arch the architecture definition * @param num the syscall number * * Resolve the given syscall number to the syscall name using the syscall table. * Returns a pointer to the syscall name string on success, including pseudo * syscall names; returns NULL on failure. * */ const char *x32_syscall_resolve_num_munge(const struct arch_def *arch, int num) { /* NOTE: we don't want to modify the pseudo-syscall numbers */ if (num >= 0) num &= ~X32_SYSCALL_BIT; return arch->syscall_resolve_num_raw(num); } ARCH_DEF(x32) const struct arch_def arch_def_x32 = { .token = SCMP_ARCH_X32, /* NOTE: this seems odd but the kernel treats x32 like x86_64 here */ .token_bpf = AUDIT_ARCH_X86_64, .size = ARCH_SIZE_32, .endian = ARCH_ENDIAN_LITTLE, .syscall_resolve_name = x32_syscall_resolve_name_munge, .syscall_resolve_name_raw = x32_syscall_resolve_name, .syscall_resolve_num = x32_syscall_resolve_num_munge, .syscall_resolve_num_raw = x32_syscall_resolve_num, .syscall_rewrite = NULL, .rule_add = NULL, .syscall_name_kver = x32_syscall_name_kver, .syscall_num_kver = x32_syscall_num_kver, }; libseccomp-2.5.4/src/arch-arm.h0000644000000000000000000000151014467535324015004 0ustar rootroot/** * Enhanced Seccomp ARM Specific Code * * Copyright (c) 2013 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _ARCH_ARM_H #define _ARCH_ARM_H #include "arch.h" ARCH_DECL(arm) #endif libseccomp-2.5.4/src/helper.c0000644000000000000000000000371514467535325014576 0ustar rootroot/** * Helper functions for libseccomp * * Copyright (c) 2017 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include "helper.h" /** * Allocate memory * @param size the size of the buffer to allocate * * This function allocates a buffer of the given size, initializes it to zero, * and returns a pointer to buffer on success. NULL is returned on failure. * */ void *zmalloc(size_t size) { /* NOTE: unlike malloc() zero size allocations always return NULL */ if (size == 0) return NULL; return calloc(1, size); } /** * Change the size of an allocated buffer * @param ptr pointer to the allocated buffer. If NULL it is equivalent to zmalloc. * @param old_size the current size of the allocated buffer * @param size the new size of the buffer * * This function changes the size of an allocated memory buffer and return a pointer * to the buffer on success, the new buffer portion is initialized to zero. NULL is * returned on failure. The returned buffer could be different than the specified * ptr param. * */ void *zrealloc(void *ptr, size_t old_size, size_t size) { /* NOTE: unlike malloc() zero size allocations always return NULL */ if (size == 0) return NULL; ptr = realloc(ptr, size); if (!ptr) return NULL; memset(ptr + old_size, 0, size - old_size); return ptr; } libseccomp-2.5.4/src/arch-mips64.c0000644000000000000000000000621014467535324015344 0ustar rootroot/** * Enhanced Seccomp MIPS64 Specific Code * * Copyright (c) 2014 Red Hat * Author: Paul Moore * */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include "arch.h" #include "arch-mips64.h" #include "syscalls.h" /* 64 ABI */ #define __SCMP_NR_BASE 5000 /** * Resolve a syscall name to a number * @param arch the architecture definition * @param name the syscall name * * Resolve the given syscall name to the syscall number using the syscall table. * Returns the syscall number on success, including negative pseudo syscall * numbers; returns __NR_SCMP_ERROR on failure. * */ int mips64_syscall_resolve_name_munge(const struct arch_def *arch, const char *name) { int sys; /* NOTE: we don't want to modify the pseudo-syscall numbers */ sys = arch->syscall_resolve_name_raw(name); if (sys == __NR_SCMP_ERROR || sys < 0) return sys; return sys + __SCMP_NR_BASE; } /** * Resolve a syscall number to a name * @param arch the architecture definition * @param num the syscall number * * Resolve the given syscall number to the syscall name using the syscall table. * Returns a pointer to the syscall name string on success, including pseudo * syscall names; returns NULL on failure. * */ const char *mips64_syscall_resolve_num_munge(const struct arch_def *arch, int num) { /* NOTE: we don't want to modify the pseudo-syscall numbers */ if (num >= __SCMP_NR_BASE) num -= __SCMP_NR_BASE; return arch->syscall_resolve_num_raw(num); } ARCH_DEF(mips64) const struct arch_def arch_def_mips64 = { .token = SCMP_ARCH_MIPS64, .token_bpf = AUDIT_ARCH_MIPS64, .size = ARCH_SIZE_64, .endian = ARCH_ENDIAN_BIG, .syscall_resolve_name = mips64_syscall_resolve_name_munge, .syscall_resolve_name_raw = mips64_syscall_resolve_name, .syscall_resolve_num = mips64_syscall_resolve_num_munge, .syscall_resolve_num_raw = mips64_syscall_resolve_num, .syscall_rewrite = NULL, .rule_add = NULL, .syscall_name_kver = mips64_syscall_name_kver, .syscall_num_kver = mips64_syscall_num_kver, }; const struct arch_def arch_def_mipsel64 = { .token = SCMP_ARCH_MIPSEL64, .token_bpf = AUDIT_ARCH_MIPSEL64, .size = ARCH_SIZE_64, .endian = ARCH_ENDIAN_LITTLE, .syscall_resolve_name = mips64_syscall_resolve_name_munge, .syscall_resolve_name_raw = mips64_syscall_resolve_name, .syscall_resolve_num = mips64_syscall_resolve_num_munge, .syscall_resolve_num_raw = mips64_syscall_resolve_num, .syscall_rewrite = NULL, .rule_add = NULL, .syscall_name_kver = mips64_syscall_name_kver, .syscall_num_kver = mips64_syscall_num_kver, }; libseccomp-2.5.4/src/arch-parisc64.h0000644000000000000000000000146214467535324015666 0ustar rootroot/** * Enhanced Seccomp PARISC Specific Code * * Copyright (c) 2016 Helge Deller * */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _ARCH_PARISC64_H #define _ARCH_PARISC64_H #include "arch.h" ARCH_DECL(parisc64) #endif libseccomp-2.5.4/src/arch-s390x.c0000644000000000000000000000170614467535324015115 0ustar rootroot/* * Copyright 2015 IBM * Author: Jan Willeke */ #include #include #include #include #include "db.h" #include "syscalls.h" #include "arch.h" #include "arch-s390x.h" /* s390x syscall numbers */ #define __s390x_NR_socketcall 102 #define __s390x_NR_ipc 117 ARCH_DEF(s390x) const struct arch_def arch_def_s390x = { .token = SCMP_ARCH_S390X, .token_bpf = AUDIT_ARCH_S390X, .size = ARCH_SIZE_64, .endian = ARCH_ENDIAN_BIG, .sys_socketcall = __s390x_NR_socketcall, .sys_ipc = __s390x_NR_ipc, .syscall_resolve_name = abi_syscall_resolve_name_munge, .syscall_resolve_name_raw = s390x_syscall_resolve_name, .syscall_resolve_num = abi_syscall_resolve_num_munge, .syscall_resolve_num_raw = s390x_syscall_resolve_num, .syscall_rewrite = abi_syscall_rewrite, .rule_add = abi_rule_add, .syscall_name_kver = s390x_syscall_name_kver, .syscall_num_kver = s390x_syscall_num_kver, }; libseccomp-2.5.4/src/system.c0000644000000000000000000003561014467535325014642 0ustar rootroot/** * Seccomp System Interfaces * * Copyright (c) 2014 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #define _GNU_SOURCE #include #include "system.h" #include #include "arch.h" #include "db.h" #include "gen_bpf.h" #include "helper.h" /* NOTE: the seccomp syscall allowlist is currently disabled for testing * purposes, but unless we can verify all of the supported ABIs before * our next release we may have to enable the allowlist */ #define SYSCALL_ALLOWLIST_ENABLE 0 /* task global state */ struct task_state { /* seccomp(2) syscall */ int nr_seccomp; /* userspace notification fd */ int notify_fd; /* runtime support flags */ int sup_syscall; int sup_flag_tsync; int sup_flag_log; int sup_action_log; int sup_kill_process; int sup_flag_spec_allow; int sup_flag_new_listener; int sup_user_notif; int sup_flag_tsync_esrch; int sup_flag_wait_kill; }; static struct task_state state = { .nr_seccomp = -1, .notify_fd = -1, .sup_syscall = -1, .sup_flag_tsync = -1, .sup_flag_log = -1, .sup_action_log = -1, .sup_kill_process = -1, .sup_flag_spec_allow = -1, .sup_flag_new_listener = -1, .sup_user_notif = -1, .sup_flag_tsync_esrch = -1, .sup_flag_wait_kill = -1, }; /** * Reset the task state * * This function fully resets the library's global "system task state". * */ void sys_reset_state(void) { state.nr_seccomp = -1; if (state.notify_fd > 0) close(state.notify_fd); state.notify_fd = -1; state.sup_syscall = -1; state.sup_flag_tsync = -1; state.sup_flag_log = -1; state.sup_action_log = -1; state.sup_kill_process = -1; state.sup_flag_spec_allow = -1; state.sup_flag_new_listener = -1; state.sup_user_notif = -1; state.sup_flag_tsync_esrch = -1; } /** * Check to see if the seccomp() syscall is supported * * This function attempts to see if the system supports the seccomp() syscall. * Unfortunately, there are a few reasons why this check may fail, including * a previously loaded seccomp filter, so it is hard to say for certain. * Return one if the syscall is supported, zero otherwise. * */ int sys_chk_seccomp_syscall(void) { int rc; int nr_seccomp; /* NOTE: it is reasonably safe to assume that we should be able to call * seccomp() when the caller first starts, but we can't rely on * it later so we need to cache our findings for use later */ if (state.sup_syscall >= 0) return state.sup_syscall; #if SYSCALL_ALLOWLIST_ENABLE /* architecture allowlist */ switch (arch_def_native->token) { case SCMP_ARCH_X86_64: case SCMP_ARCH_ARM: case SCMP_ARCH_AARCH64: case SCMP_ARCH_LOONGARCH64: case SCMP_ARCH_PPC64: case SCMP_ARCH_PPC64LE: case SCMP_ARCH_S390: case SCMP_ARCH_S390X: case SCMP_ARCH_RISCV64: break; default: goto unsupported; } #endif nr_seccomp = arch_syscall_resolve_name(arch_def_native, "seccomp"); if (nr_seccomp < 0) goto unsupported; /* this is an invalid call because the second argument is non-zero, but * depending on the errno value of ENOSYS or EINVAL we can guess if the * seccomp() syscall is supported or not */ rc = syscall(nr_seccomp, SECCOMP_SET_MODE_STRICT, 1, NULL); if (rc < 0 && errno == EINVAL) goto supported; unsupported: state.sup_syscall = 0; return 0; supported: state.nr_seccomp = nr_seccomp; state.sup_syscall = 1; return 1; } /** * Force the seccomp() syscall support setting * @param enable the intended support state * * This function overrides the current seccomp() syscall support setting; this * is very much a "use at your own risk" function. * */ void sys_set_seccomp_syscall(bool enable) { state.sup_syscall = (enable ? 1 : 0); } /** * Check to see if a seccomp action is supported * @param action the seccomp action * * This function checks to see if a seccomp action is supported by the system. * Return one if the action is supported, zero otherwise. * */ int sys_chk_seccomp_action(uint32_t action) { if (action == SCMP_ACT_KILL_PROCESS) { if (state.sup_kill_process < 0) { if (sys_chk_seccomp_syscall() == 1 && syscall(state.nr_seccomp, SECCOMP_GET_ACTION_AVAIL, 0, &action) == 0) state.sup_kill_process = 1; else state.sup_kill_process = 0; } return state.sup_kill_process; } else if (action == SCMP_ACT_KILL_THREAD) { return 1; } else if (action == SCMP_ACT_TRAP) { return 1; } else if ((action == SCMP_ACT_ERRNO(action & 0x0000ffff)) && ((action & 0x0000ffff) < MAX_ERRNO)) { return 1; } else if (action == SCMP_ACT_TRACE(action & 0x0000ffff)) { return 1; } else if (action == SCMP_ACT_LOG) { if (state.sup_action_log < 0) { if (sys_chk_seccomp_syscall() == 1 && syscall(state.nr_seccomp, SECCOMP_GET_ACTION_AVAIL, 0, &action) == 0) state.sup_action_log = 1; else state.sup_action_log = 0; } return state.sup_action_log; } else if (action == SCMP_ACT_ALLOW) { return 1; } else if (action == SCMP_ACT_NOTIFY) { if (state.sup_user_notif < 0) { struct seccomp_notif_sizes sizes; if (sys_chk_seccomp_syscall() == 1 && syscall(state.nr_seccomp, SECCOMP_GET_NOTIF_SIZES, 0, &sizes) == 0) state.sup_user_notif = 1; else state.sup_user_notif = 0; } return state.sup_user_notif; } return 0; } /** * Force a seccomp action support setting * @param action the seccomp action * @param enable the intended support state * * This function overrides the current seccomp action support setting; this * is very much a "use at your own risk" function. */ void sys_set_seccomp_action(uint32_t action, bool enable) { switch (action) { case SCMP_ACT_LOG: state.sup_action_log = (enable ? 1 : 0); break; case SCMP_ACT_KILL_PROCESS: state.sup_kill_process = (enable ? 1 : 0); break; case SCMP_ACT_NOTIFY: state.sup_user_notif = (enable ? 1 : 0); break; } } /** * Check to see if a seccomp() flag is supported by the kernel * @param flag the seccomp() flag * * This function checks to see if a seccomp() flag is supported by the kernel. * Return one if the flag is supported, zero otherwise. * */ static int _sys_chk_flag_kernel(int flag) { /* this is an invalid seccomp(2) call because the last argument * is NULL, but depending on the errno value of EFAULT we can * guess if the filter flag is supported or not */ if (sys_chk_seccomp_syscall() == 1 && syscall(state.nr_seccomp, SECCOMP_SET_MODE_FILTER, flag, NULL) == -1 && errno == EFAULT) return 1; return 0; } /** * Check to see if a seccomp() flag is supported * @param flag the seccomp() flag * * This function checks to see if a seccomp() flag is supported by the system. * Return one if the syscall is supported, zero if unsupported, negative values * on error. * */ int sys_chk_seccomp_flag(int flag) { switch (flag) { case SECCOMP_FILTER_FLAG_TSYNC: if (state.sup_flag_tsync < 0) state.sup_flag_tsync = _sys_chk_flag_kernel(flag); return state.sup_flag_tsync; case SECCOMP_FILTER_FLAG_LOG: if (state.sup_flag_log < 0) state.sup_flag_log = _sys_chk_flag_kernel(flag); return state.sup_flag_log; case SECCOMP_FILTER_FLAG_SPEC_ALLOW: if (state.sup_flag_spec_allow < 0) state.sup_flag_spec_allow = _sys_chk_flag_kernel(flag); return state.sup_flag_spec_allow; case SECCOMP_FILTER_FLAG_NEW_LISTENER: if (state.sup_flag_new_listener < 0) state.sup_flag_new_listener = _sys_chk_flag_kernel(flag); return state.sup_flag_new_listener; case SECCOMP_FILTER_FLAG_TSYNC_ESRCH: if (state.sup_flag_tsync_esrch < 0) state.sup_flag_tsync_esrch = _sys_chk_flag_kernel(flag); return state.sup_flag_tsync_esrch; case SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV: if (state.sup_flag_wait_kill < 0) state.sup_flag_wait_kill = _sys_chk_flag_kernel(flag); return state.sup_flag_wait_kill; } return -EOPNOTSUPP; } /** * Force a seccomp() syscall flag support setting * @param flag the seccomp() flag * @param enable the intended support state * * This function overrides the current seccomp() syscall support setting for a * given flag; this is very much a "use at your own risk" function. * */ void sys_set_seccomp_flag(int flag, bool enable) { switch (flag) { case SECCOMP_FILTER_FLAG_TSYNC: state.sup_flag_tsync = (enable ? 1 : 0); break; case SECCOMP_FILTER_FLAG_LOG: state.sup_flag_log = (enable ? 1 : 0); break; case SECCOMP_FILTER_FLAG_SPEC_ALLOW: state.sup_flag_spec_allow = (enable ? 1 : 0); break; case SECCOMP_FILTER_FLAG_NEW_LISTENER: state.sup_flag_new_listener = (enable ? 1 : 0); break; case SECCOMP_FILTER_FLAG_TSYNC_ESRCH: state.sup_flag_tsync_esrch = (enable ? 1 : 0); break; case SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV: state.sup_flag_wait_kill = (enable ? 1 : 0); break; } } /** * Loads the filter into the kernel * @param col the filter collection * @param rawrc pass the raw return code if true * * This function loads the given seccomp filter context into the kernel. If * the filter was loaded correctly, the kernel will be enforcing the filter * when this function returns. Returns zero on success, negative values on * error. * */ int sys_filter_load(struct db_filter_col *col, bool rawrc) { int rc; bool tsync_notify; bool listener_req; struct bpf_program *prgm = NULL; rc = db_col_precompute(col); if (rc < 0) return rc; prgm = col->prgm_bpf; /* attempt to set NO_NEW_PRIVS */ if (col->attr.nnp_enable) { rc = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); if (rc < 0) goto filter_load_out; } tsync_notify = state.sup_flag_tsync_esrch > 0 && state.notify_fd == -1; listener_req = state.sup_user_notif > 0 && \ col->notify_used && state.notify_fd == -1; /* load the filter into the kernel */ if (sys_chk_seccomp_syscall() == 1) { int flgs = 0; if (tsync_notify) { if (col->attr.tsync_enable) flgs |= SECCOMP_FILTER_FLAG_TSYNC | \ SECCOMP_FILTER_FLAG_TSYNC_ESRCH; if (listener_req) flgs |= SECCOMP_FILTER_FLAG_NEW_LISTENER; } else if (col->attr.tsync_enable) { if (listener_req) { /* NOTE: we _should_ catch this in db.c */ rc = -EFAULT; goto filter_load_out; } flgs |= SECCOMP_FILTER_FLAG_TSYNC; } else if (listener_req) flgs |= SECCOMP_FILTER_FLAG_NEW_LISTENER; if ((flgs & SECCOMP_FILTER_FLAG_NEW_LISTENER) && col->attr.wait_killable_recv) flgs |= SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV; if (col->attr.log_enable) flgs |= SECCOMP_FILTER_FLAG_LOG; if (col->attr.spec_allow) flgs |= SECCOMP_FILTER_FLAG_SPEC_ALLOW; rc = syscall(state.nr_seccomp, SECCOMP_SET_MODE_FILTER, flgs, prgm); if (tsync_notify && rc > 0) { /* return 0 on NEW_LISTENER success, but save the fd */ state.notify_fd = rc; rc = 0; } else if (rc > 0 && col->attr.tsync_enable) { /* always return -ESRCH if we fail to sync threads */ errno = ESRCH; rc = -errno; } else if (rc > 0 && state.sup_user_notif > 0) { /* return 0 on NEW_LISTENER success, but save the fd */ state.notify_fd = rc; rc = 0; } } else rc = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, prgm); filter_load_out: /* cleanup and return */ if (rc == -ESRCH) return -ESRCH; if (rc < 0) return (rawrc ? -errno : -ECANCELED); return rc; } /** * Return the userspace notification fd * * This function returns the userspace notification fd from * SECCOMP_FILTER_FLAG_NEW_LISTENER. If the notification fd has not yet been * set, or an error has occurred, -1 is returned. * */ int sys_notify_fd(void) { return state.notify_fd; } /** * Allocate a pair of notification request/response structures * @param req the request location * @param resp the response location * * This function allocates a pair of request/response structure by computing * the correct sized based on the currently running kernel. It returns zero on * success, and negative values on failure. * */ int sys_notify_alloc(struct seccomp_notif **req, struct seccomp_notif_resp **resp) { int rc; static struct seccomp_notif_sizes sizes = { 0, 0, 0 }; if (state.sup_syscall <= 0) return -EOPNOTSUPP; if (sizes.seccomp_notif == 0 && sizes.seccomp_notif_resp == 0) { rc = syscall(__NR_seccomp, SECCOMP_GET_NOTIF_SIZES, 0, &sizes); if (rc < 0) return -ECANCELED; } if (sizes.seccomp_notif == 0 || sizes.seccomp_notif_resp == 0) return -EFAULT; if (req) { *req = zmalloc(sizes.seccomp_notif); if (!*req) return -ENOMEM; } if (resp) { *resp = zmalloc(sizes.seccomp_notif_resp); if (!*resp) { if (req) free(*req); return -ENOMEM; } } return 0; } /** * Receive a notification from a seccomp notification fd * @param fd the notification fd * @param req the request buffer to save into * * Blocks waiting for a notification on this fd. This function is thread safe * (synchronization is performed in the kernel). Returns zero on success, * negative values on error. * */ int sys_notify_receive(int fd, struct seccomp_notif *req) { if (state.sup_user_notif <= 0) return -EOPNOTSUPP; if (ioctl(fd, SECCOMP_IOCTL_NOTIF_RECV, req) < 0) return -ECANCELED; return 0; } /** * Send a notification response to a seccomp notification fd * @param fd the notification fd * @param resp the response buffer to use * * Sends a notification response on this fd. This function is thread safe * (synchronization is performed in the kernel). Returns zero on success, * negative values on error. * */ int sys_notify_respond(int fd, struct seccomp_notif_resp *resp) { if (state.sup_user_notif <= 0) return -EOPNOTSUPP; if (ioctl(fd, SECCOMP_IOCTL_NOTIF_SEND, resp) < 0) return -ECANCELED; return 0; } /** * Check if a notification id is still valid * @param fd the notification fd * @param id the id to test * * Checks to see if a notification id is still valid. Returns 0 on success, and * negative values on failure. * */ int sys_notify_id_valid(int fd, uint64_t id) { int rc; if (state.sup_user_notif <= 0) return -EOPNOTSUPP; rc = ioctl(fd, SECCOMP_IOCTL_NOTIF_ID_VALID, &id); if (rc < 0 && errno == EINVAL) /* It is possible that libseccomp was built against newer kernel * headers than the kernel it is running on. If so, the older * runtime kernel may not support the "fixed" * SECCOMP_IOCTL_NOTIF_ID_VALID ioctl number which was introduced in * kernel commit 47e33c05f9f0 ("seccomp: Fix ioctl number for * SECCOMP_IOCTL_NOTIF_ID_VALID"). Try the old value. */ rc = ioctl(fd, SECCOMP_IOCTL_NOTIF_ID_VALID_WRONG_DIR, &id); if (rc < 0) return -ENOENT; return 0; } libseccomp-2.5.4/src/arch-riscv64.h0000644000000000000000000000130414467535324015526 0ustar rootroot/* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _ARCH_RISCV64_H #define _ARCH_RISCV64_H #include "arch.h" ARCH_DECL(riscv64) #endif libseccomp-2.5.4/src/arch-mips64n32.c0000644000000000000000000000635014467535324015674 0ustar rootroot/** * Enhanced Seccomp MIPS Specific Code * * Copyright (c) 2014 Red Hat * Author: Paul Moore * */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "arch.h" #include "arch-mips64n32.h" #include "syscalls.h" /* N32 ABI */ #define __SCMP_NR_BASE 6000 /** * Resolve a syscall name to a number * @param arch the architecture definition * @param name the syscall name * * Resolve the given syscall name to the syscall number using the syscall table. * Returns the syscall number on success, including negative pseudo syscall * numbers; returns __NR_SCMP_ERROR on failure. * */ int mips64n32_syscall_resolve_name_munge(const struct arch_def *arch, const char *name) { int sys; /* NOTE: we don't want to modify the pseudo-syscall numbers */ sys = mips64n32_syscall_resolve_name(name); if (sys == __NR_SCMP_ERROR || sys < 0) return sys; return sys + __SCMP_NR_BASE; } /** * Resolve a syscall number to a name * @param arch the architecture definition * @param num the syscall number * * Resolve the given syscall number to the syscall name using the syscall table. * Returns a pointer to the syscall name string on success, including pseudo * syscall names; returns NULL on failure. * */ const char *mips64n32_syscall_resolve_num_munge(const struct arch_def *arch, int num) { /* NOTE: we don't want to modify the pseudo-syscall numbers */ if (num >= __SCMP_NR_BASE) num -= __SCMP_NR_BASE; return mips64n32_syscall_resolve_num(num); } ARCH_DEF(mips64n32) const struct arch_def arch_def_mips64n32 = { .token = SCMP_ARCH_MIPS64N32, .token_bpf = AUDIT_ARCH_MIPS64N32, .size = ARCH_SIZE_32, .endian = ARCH_ENDIAN_BIG, .syscall_resolve_name = mips64n32_syscall_resolve_name_munge, .syscall_resolve_name_raw = mips64n32_syscall_resolve_name, .syscall_resolve_num = mips64n32_syscall_resolve_num_munge, .syscall_resolve_num_raw = mips64n32_syscall_resolve_num, .syscall_rewrite = NULL, .rule_add = NULL, .syscall_name_kver = mips64n32_syscall_name_kver, .syscall_num_kver = mips64n32_syscall_num_kver, }; const struct arch_def arch_def_mipsel64n32 = { .token = SCMP_ARCH_MIPSEL64N32, .token_bpf = AUDIT_ARCH_MIPSEL64N32, .size = ARCH_SIZE_32, .endian = ARCH_ENDIAN_LITTLE, .syscall_resolve_name = mips64n32_syscall_resolve_name_munge, .syscall_resolve_name_raw = mips64n32_syscall_resolve_name, .syscall_resolve_num = mips64n32_syscall_resolve_num_munge, .syscall_resolve_num_raw = mips64n32_syscall_resolve_num, .syscall_rewrite = NULL, .rule_add = NULL, .syscall_name_kver = mips64n32_syscall_name_kver, .syscall_num_kver = mips64n32_syscall_num_kver, }; libseccomp-2.5.4/src/db.c0000644000000000000000000021352014467535324013700 0ustar rootroot/** * Enhanced Seccomp Filter DB * * Copyright (c) 2012,2016,2018 Red Hat * Copyright (c) 2019 Cisco Systems, Inc. * Copyright (c) 2022 Microsoft Corporation * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include #include #include "arch.h" #include "db.h" #include "system.h" #include "helper.h" /* state values */ #define _DB_STA_VALID 0xA1B2C3D4 #define _DB_STA_FREED 0x1A2B3C4D /* the priority field is fairly simple - without any user hints, or in the case * of a hint "tie", we give higher priority to syscalls with less chain nodes * (filter is easier to evaluate) */ #define _DB_PRI_MASK_CHAIN 0x0000FFFF #define _DB_PRI_MASK_USER 0x00FF0000 #define _DB_PRI_USER(x) (((x) << 16) & _DB_PRI_MASK_USER) /* prove information about the sub-tree check results */ struct db_iter_state { #define _DB_IST_NONE 0x00000000 #define _DB_IST_MATCH 0x00000001 #define _DB_IST_MATCH_ONCE 0x00000002 #define _DB_IST_X_FINISHED 0x00000010 #define _DB_IST_N_FINISHED 0x00000020 #define _DB_IST_X_PREFIX 0x00000100 #define _DB_IST_N_PREFIX 0x00000200 #define _DB_IST_M_MATCHSET (_DB_IST_MATCH|_DB_IST_MATCH_ONCE) #define _DB_IST_M_REDUNDANT (_DB_IST_MATCH| \ _DB_IST_X_FINISHED| \ _DB_IST_N_PREFIX) unsigned int flags; uint32_t action; struct db_sys_list *sx; }; static unsigned int _db_node_put(struct db_arg_chain_tree **node); /** * Define the syscall argument priority for nodes on the same level of the tree * @param a tree node * * Prioritize the syscall argument value, taking into account hi/lo words. * Should only ever really be called by _db_chain_{lt,eq}(). Returns an * arbitrary value indicating priority. * */ static unsigned int __db_chain_arg_priority(const struct db_arg_chain_tree *a) { return (a->arg << 1) + (a->arg_h_flg ? 1 : 0); } /** * Define the "op" priority for nodes on the same level of the tree * @param op the argument operator * * Prioritize the syscall argument comparison operator. Should only ever * really be called by _db_chain_{lt,eq}(). Returns an arbitrary value * indicating priority. * */ static unsigned int __db_chain_op_priority(enum scmp_compare op) { /* the distinction between LT/LT and GT/GE is mostly to make the * ordering as repeatable as possible regardless of the order in which * the rules are added */ switch (op) { case SCMP_CMP_MASKED_EQ: case SCMP_CMP_EQ: case SCMP_CMP_NE: return 3; case SCMP_CMP_LE: case SCMP_CMP_LT: return 2; case SCMP_CMP_GE: case SCMP_CMP_GT: return 1; default: return 0; } } /** * Determine if node "a" is less than node "b" * @param a tree node * @param b tree node * * The logic is best explained by looking at the comparison code in the * function. * */ static bool _db_chain_lt(const struct db_arg_chain_tree *a, const struct db_arg_chain_tree *b) { unsigned int a_arg, b_arg; unsigned int a_op, b_op; a_arg = __db_chain_arg_priority(a); b_arg = __db_chain_arg_priority(b); if (a_arg < b_arg) return true; else if (a_arg > b_arg) return false; a_op = __db_chain_op_priority(a->op_orig); b_op = __db_chain_op_priority(b->op_orig); if (a_op < b_op) return true; else if (a_op > b_op) return false; /* NOTE: at this point the arg and op priorities are equal */ switch (a->op_orig) { case SCMP_CMP_LE: case SCMP_CMP_LT: /* in order to ensure proper ordering for LT/LE comparisons we * need to invert the argument value so smaller values come * first */ if (a->datum > b->datum) return true; break; default: if (a->datum < b->datum) return true; break; } return false; } /** * Determine if two nodes have equal argument datum values * @param a tree node * @param b tree node * * In order to return true the nodes must have the same datum and mask for the * same argument. * */ static bool _db_chain_eq(const struct db_arg_chain_tree *a, const struct db_arg_chain_tree *b) { unsigned int a_arg, b_arg; a_arg = __db_chain_arg_priority(a); b_arg = __db_chain_arg_priority(b); return ((a_arg == b_arg) && (a->op == b->op) && (a->datum == b->datum) && (a->mask == b->mask)); } /** * Determine if a given tree node is a leaf node * @param iter the node to test * * A leaf node is a node with no other nodes beneath it. * */ static bool _db_chain_leaf(const struct db_arg_chain_tree *iter) { return (iter->nxt_t == NULL && iter->nxt_f == NULL); } /** * Determine if a given tree node is a zombie node * @param iter the node to test * * A zombie node is a leaf node that also has no true or false actions. * */ static bool _db_chain_zombie(const struct db_arg_chain_tree *iter) { return (_db_chain_leaf(iter) && !(iter->act_t_flg) && !(iter->act_f_flg)); } /** * Get a node reference * @param node pointer to a node * * This function gets a reference to an individual node. Returns a pointer * to the node. * */ static struct db_arg_chain_tree *_db_node_get(struct db_arg_chain_tree *node) { if (node != NULL) node->refcnt++; return node; } /** * Garbage collect a level of the tree * @param node tree node * * Check the entire level on which @node resides, if there is no other part of * the tree which points to a node on this level, remove the entire level. * Returns the number of nodes removed. * */ static unsigned int _db_level_clean(struct db_arg_chain_tree *node) { int cnt = 0; unsigned int links; struct db_arg_chain_tree *n = node; struct db_arg_chain_tree *start; while (n->lvl_prv) n = n->lvl_prv; start = n; while (n != NULL) { links = 0; if (n->lvl_prv) links++; if (n->lvl_nxt) links++; if (n->refcnt > links) return cnt; n = n->lvl_nxt; } n = start; while (n != NULL) cnt += _db_node_put(&n); return cnt; } /** * Free a syscall filter argument chain tree * @param tree the argument chain list * * This function drops a reference to the tree pointed to by @tree and garbage * collects the top level. Returns the number of nodes removed. * */ static unsigned int _db_tree_put(struct db_arg_chain_tree **tree) { unsigned int cnt; cnt = _db_node_put(tree); if (*tree) cnt += _db_level_clean(*tree); return cnt; } /** * Release a node reference * @param node pointer to a node * * This function drops a reference to an individual node, unless this is the * last reference in which the entire sub-tree is affected. Returns the number * of nodes freed. * */ static unsigned int _db_node_put(struct db_arg_chain_tree **node) { unsigned int cnt = 0; struct db_arg_chain_tree *n = *node; struct db_arg_chain_tree *lvl_p, *lvl_n, *nxt_t, *nxt_f; if (n == NULL) return 0; if (--(n->refcnt) == 0) { lvl_p = n->lvl_prv; lvl_n = n->lvl_nxt; nxt_t = n->nxt_t; nxt_f = n->nxt_f; /* split the current level */ /* NOTE: we still hold a ref for both lvl_p and lvl_n */ if (lvl_p) lvl_p->lvl_nxt = NULL; if (lvl_n) lvl_n->lvl_prv = NULL; /* drop refcnts on the current level */ if (lvl_p) cnt += _db_node_put(&lvl_p); if (lvl_n) cnt += _db_node_put(&lvl_n); /* re-link current level if it still exists */ if (lvl_p) lvl_p->lvl_nxt = _db_node_get(lvl_n); if (lvl_n) lvl_n->lvl_prv = _db_node_get(lvl_p); /* update caller's pointer */ if (lvl_p) *node = lvl_p; else if (lvl_n) *node = lvl_n; else *node = NULL; /* drop the next level(s) */ cnt += _db_tree_put(&nxt_t); cnt += _db_tree_put(&nxt_f); /* cleanup and accounting */ free(n); cnt++; } return cnt; } /** * Remove a node from an argument chain tree * @param tree the pointer to the tree * @param node the node to remove * * This function searches the tree looking for the node and removes it as well * as any sub-trees beneath it. Returns the number of nodes freed. * */ static unsigned int _db_tree_remove(struct db_arg_chain_tree **tree, struct db_arg_chain_tree *node) { int cnt = 0; struct db_arg_chain_tree *c_iter; if (tree == NULL || *tree == NULL || node == NULL) return 0; c_iter = *tree; while (c_iter->lvl_prv != NULL) c_iter = c_iter->lvl_prv; do { /* current node? */ if (c_iter == node) goto remove; /* check the sub-trees */ cnt += _db_tree_remove(&(c_iter->nxt_t), node); cnt += _db_tree_remove(&(c_iter->nxt_f), node); /* check for empty/zombie nodes */ if (_db_chain_zombie(c_iter)) goto remove; /* next node on this level */ c_iter = c_iter->lvl_nxt; } while (c_iter != NULL && cnt == 0); return cnt; remove: /* reset the tree pointer if needed */ if (c_iter == *tree) { if (c_iter->lvl_prv != NULL) *tree = c_iter->lvl_prv; else *tree = c_iter->lvl_nxt; } /* remove the node from the current level */ if (c_iter->lvl_prv) c_iter->lvl_prv->lvl_nxt = c_iter->lvl_nxt; if (c_iter->lvl_nxt) c_iter->lvl_nxt->lvl_prv = c_iter->lvl_prv; c_iter->lvl_prv = NULL; c_iter->lvl_nxt = NULL; /* free the node and any sub-trees */ cnt += _db_node_put(&c_iter); return cnt; } /** * Traverse a tree checking the action values * @param tree the pointer to the tree * @param action the action * * Traverse the tree inspecting each action to see if it matches the given * action. Returns zero if all actions match the given action, negative values * on failure. * */ static int _db_tree_act_check(struct db_arg_chain_tree *tree, uint32_t action) { int rc; struct db_arg_chain_tree *c_iter; if (tree == NULL) return 0; c_iter = tree; while (c_iter->lvl_prv != NULL) c_iter = c_iter->lvl_prv; do { if (c_iter->act_t_flg && c_iter->act_t != action) return -EEXIST; if (c_iter->act_f_flg && c_iter->act_f != action) return -EEXIST; rc = _db_tree_act_check(c_iter->nxt_t, action); if (rc < 0) return rc; rc = _db_tree_act_check(c_iter->nxt_f, action); if (rc < 0) return rc; c_iter = c_iter->lvl_nxt; } while (c_iter != NULL); return 0; } /** * Checks for a sub-tree match in an existing tree and prunes the tree * @param existing pointer to the existing tree * @param new pointer to the new tree * @param state pointer to a state structure * * This function searches the existing tree trying to prune it based on the * new tree. Returns the number of nodes removed from the tree on success, * zero if no changes were made. * */ static int _db_tree_prune(struct db_arg_chain_tree **existing, struct db_arg_chain_tree *new, struct db_iter_state *state) { int cnt = 0; struct db_iter_state state_nxt; struct db_iter_state state_new = *state; struct db_arg_chain_tree *x_iter_next; struct db_arg_chain_tree *x_iter = *existing; struct db_arg_chain_tree *n_iter = new; /* check if either tree is finished */ if (n_iter == NULL || x_iter == NULL) goto prune_return; /* bail out if we have a broken match */ if ((state->flags & _DB_IST_M_MATCHSET) == _DB_IST_MATCH_ONCE) goto prune_return; /* get to the start of the existing level */ while (x_iter->lvl_prv) x_iter = x_iter->lvl_prv; /* NOTE: a few comments on the code below ... * 1) we need to take a reference before we go down a level in case * we end up dropping the sub-tree (see the _db_node_get() calls) * 2) since the new tree really only has one branch, we can only ever * match on one branch in the existing tree, if we "hit" then we * can bail on the other branches */ do { /* store this now in case we remove x_iter */ x_iter_next = x_iter->lvl_nxt; /* compare the two nodes */ if (_db_chain_eq(x_iter, n_iter)) { /* we have a match */ state_new.flags |= _DB_IST_M_MATCHSET; /* check if either tree is finished */ if (_db_chain_leaf(n_iter)) state_new.flags |= _DB_IST_N_FINISHED; if (_db_chain_leaf(x_iter)) state_new.flags |= _DB_IST_X_FINISHED; /* don't remove nodes if we have more actions/levels */ if ((x_iter->act_t_flg || x_iter->nxt_t) && !(n_iter->act_t_flg || n_iter->nxt_t)) goto prune_return; if ((x_iter->act_f_flg || x_iter->nxt_f) && !(n_iter->act_f_flg || n_iter->nxt_f)) goto prune_return; /* if finished, compare actions */ if ((state_new.flags & _DB_IST_N_FINISHED) && (state_new.flags & _DB_IST_X_FINISHED)) { if (n_iter->act_t_flg != x_iter->act_t_flg) goto prune_return; if (n_iter->act_t != x_iter->act_t) goto prune_return; if (n_iter->act_f_flg != x_iter->act_f_flg) goto prune_return; if (n_iter->act_f != x_iter->act_f) goto prune_return; } /* check next level */ if (n_iter->nxt_t) { _db_node_get(x_iter); state_nxt = *state; state_nxt.flags |= _DB_IST_M_MATCHSET; cnt += _db_tree_prune(&x_iter->nxt_t, n_iter->nxt_t, &state_nxt); cnt += _db_node_put(&x_iter); if (state_nxt.flags & _DB_IST_MATCH) { state_new.flags |= state_nxt.flags; /* don't return yet, we need to check * the current node */ } if (x_iter == NULL) goto prune_next_node; } if (n_iter->nxt_f) { _db_node_get(x_iter); state_nxt = *state; state_nxt.flags |= _DB_IST_M_MATCHSET; cnt += _db_tree_prune(&x_iter->nxt_f, n_iter->nxt_f, &state_nxt); cnt += _db_node_put(&x_iter); if (state_nxt.flags & _DB_IST_MATCH) { state_new.flags |= state_nxt.flags; /* don't return yet, we need to check * the current node */ } if (x_iter == NULL) goto prune_next_node; } /* remove the node? */ if (!_db_tree_act_check(x_iter, state_new.action) && (state_new.flags & _DB_IST_MATCH) && (state_new.flags & _DB_IST_N_FINISHED) && (state_new.flags & _DB_IST_X_PREFIX)) { /* yes - the new tree is "shorter" */ cnt += _db_tree_remove(&state->sx->chains, x_iter); if (state->sx->chains == NULL) goto prune_return; } else if (!_db_tree_act_check(x_iter, state_new.action) && (state_new.flags & _DB_IST_MATCH) && (state_new.flags & _DB_IST_X_FINISHED) && (state_new.flags & _DB_IST_N_PREFIX)) { /* no - the new tree is "longer" */ goto prune_return; } } else if (_db_chain_lt(x_iter, n_iter)) { /* bail if we have a prefix on the new tree */ if (state->flags & _DB_IST_N_PREFIX) goto prune_return; /* check the next level in the existing tree */ if (x_iter->nxt_t) { _db_node_get(x_iter); state_nxt = *state; state_nxt.flags &= ~_DB_IST_MATCH; state_nxt.flags |= _DB_IST_X_PREFIX; cnt += _db_tree_prune(&x_iter->nxt_t, n_iter, &state_nxt); cnt += _db_node_put(&x_iter); if (state_nxt.flags & _DB_IST_MATCH) { state_new.flags |= state_nxt.flags; goto prune_return; } if (x_iter == NULL) goto prune_next_node; } if (x_iter->nxt_f) { _db_node_get(x_iter); state_nxt = *state; state_nxt.flags &= ~_DB_IST_MATCH; state_nxt.flags |= _DB_IST_X_PREFIX; cnt += _db_tree_prune(&x_iter->nxt_f, n_iter, &state_nxt); cnt += _db_node_put(&x_iter); if (state_nxt.flags & _DB_IST_MATCH) { state_new.flags |= state_nxt.flags; goto prune_return; } if (x_iter == NULL) goto prune_next_node; } } else { /* bail if we have a prefix on the existing tree */ if (state->flags & _DB_IST_X_PREFIX) goto prune_return; /* check the next level in the new tree */ if (n_iter->nxt_t) { _db_node_get(x_iter); state_nxt = *state; state_nxt.flags &= ~_DB_IST_MATCH; state_nxt.flags |= _DB_IST_N_PREFIX; cnt += _db_tree_prune(&x_iter, n_iter->nxt_t, &state_nxt); cnt += _db_node_put(&x_iter); if (state_nxt.flags & _DB_IST_MATCH) { state_new.flags |= state_nxt.flags; goto prune_return; } if (x_iter == NULL) goto prune_next_node; } if (n_iter->nxt_f) { _db_node_get(x_iter); state_nxt = *state; state_nxt.flags &= ~_DB_IST_MATCH; state_nxt.flags |= _DB_IST_N_PREFIX; cnt += _db_tree_prune(&x_iter, n_iter->nxt_f, &state_nxt); cnt += _db_node_put(&x_iter); if (state_nxt.flags & _DB_IST_MATCH) { state_new.flags |= state_nxt.flags; goto prune_return; } if (x_iter == NULL) goto prune_next_node; } } prune_next_node: /* check next node on this level */ x_iter = x_iter_next; } while (x_iter); /* if we are falling through, we clearly didn't match on anything */ state_new.flags &= ~_DB_IST_MATCH; prune_return: /* no more nodes on this level, return to the level above */ if (state_new.flags & _DB_IST_MATCH) state->flags |= state_new.flags; else state->flags &= ~_DB_IST_MATCH; return cnt; } /** * Add a new tree into an existing tree * @param existing pointer to the existing tree * @param new pointer to the new tree * @param state pointer to a state structure * * This function adds the new tree into the existing tree, fetching additional * references as necessary. Returns zero on success, negative values on * failure. * */ static int _db_tree_add(struct db_arg_chain_tree **existing, struct db_arg_chain_tree *new, struct db_iter_state *state) { int rc; struct db_arg_chain_tree *x_iter = *existing; struct db_arg_chain_tree *n_iter = new; do { if (_db_chain_eq(x_iter, n_iter)) { if (n_iter->act_t_flg) { if (!x_iter->act_t_flg) { /* new node has a true action */ /* do the actions match? */ rc = _db_tree_act_check(x_iter->nxt_t, n_iter->act_t); if (rc != 0) return rc; /* update with the new action */ rc = _db_node_put(&x_iter->nxt_t); x_iter->nxt_t = NULL; x_iter->act_t = n_iter->act_t; x_iter->act_t_flg = true; state->sx->node_cnt -= rc; } else if (n_iter->act_t != x_iter->act_t) { /* if we are dealing with a 64-bit * comparison, we need to adjust our * action based on the full 64-bit * value to ensure we handle GT/GE * comparisons correctly */ if (n_iter->arg_h_flg && (n_iter->datum_full > x_iter->datum_full)) x_iter->act_t = n_iter->act_t; if (_db_chain_leaf(x_iter) || _db_chain_leaf(n_iter)) return -EEXIST; } } if (n_iter->act_f_flg) { if (!x_iter->act_f_flg) { /* new node has a false action */ /* do the actions match? */ rc = _db_tree_act_check(x_iter->nxt_f, n_iter->act_f); if (rc != 0) return rc; /* update with the new action */ rc = _db_node_put(&x_iter->nxt_f); x_iter->nxt_f = NULL; x_iter->act_f = n_iter->act_f; x_iter->act_f_flg = true; state->sx->node_cnt -= rc; } else if (n_iter->act_f != x_iter->act_f) { /* if we are dealing with a 64-bit * comparison, we need to adjust our * action based on the full 64-bit * value to ensure we handle LT/LE * comparisons correctly */ if (n_iter->arg_h_flg && (n_iter->datum_full < x_iter->datum_full)) x_iter->act_t = n_iter->act_t; if (_db_chain_leaf(x_iter) || _db_chain_leaf(n_iter)) return -EEXIST; } } if (n_iter->nxt_t) { if (x_iter->nxt_t) { /* compare the next level */ rc = _db_tree_add(&x_iter->nxt_t, n_iter->nxt_t, state); if (rc != 0) return rc; } else if (!x_iter->act_t_flg) { /* add a new sub-tree */ x_iter->nxt_t = _db_node_get(n_iter->nxt_t); } else /* done - existing tree is "shorter" */ return 0; } if (n_iter->nxt_f) { if (x_iter->nxt_f) { /* compare the next level */ rc = _db_tree_add(&x_iter->nxt_f, n_iter->nxt_f, state); if (rc != 0) return rc; } else if (!x_iter->act_f_flg) { /* add a new sub-tree */ x_iter->nxt_f = _db_node_get(n_iter->nxt_f); } else /* done - existing tree is "shorter" */ return 0; } return 0; } else if (!_db_chain_lt(x_iter, n_iter)) { /* try to move along the current level */ if (x_iter->lvl_nxt == NULL) { /* add to the end of this level */ n_iter->lvl_prv = _db_node_get(x_iter); x_iter->lvl_nxt = _db_node_get(n_iter); return 0; } else /* next */ x_iter = x_iter->lvl_nxt; } else { /* add before the existing node on this level*/ if (x_iter->lvl_prv != NULL) { x_iter->lvl_prv->lvl_nxt = _db_node_get(n_iter); n_iter->lvl_prv = x_iter->lvl_prv; x_iter->lvl_prv = _db_node_get(n_iter); n_iter->lvl_nxt = x_iter; } else { x_iter->lvl_prv = _db_node_get(n_iter); n_iter->lvl_nxt = _db_node_get(x_iter); } if (*existing == x_iter) { *existing = _db_node_get(n_iter); _db_node_put(&x_iter); } return 0; } } while (x_iter); return 0; } /** * Free and reset the seccomp filter DB * @param db the seccomp filter DB * * This function frees any existing filters and resets the filter DB to a * default state; only the DB architecture is preserved. * */ static void _db_reset(struct db_filter *db) { struct db_sys_list *s_iter; struct db_api_rule_list *r_iter; if (db == NULL) return; /* free any filters */ if (db->syscalls != NULL) { s_iter = db->syscalls; while (s_iter != NULL) { db->syscalls = s_iter->next; _db_tree_put(&s_iter->chains); free(s_iter); s_iter = db->syscalls; } db->syscalls = NULL; } db->syscall_cnt = 0; /* free any rules */ if (db->rules != NULL) { /* split the loop first then loop and free */ db->rules->prev->next = NULL; r_iter = db->rules; while (r_iter != NULL) { db->rules = r_iter->next; free(r_iter); r_iter = db->rules; } db->rules = NULL; } } /** * Intitalize a seccomp filter DB * @param arch the architecture definition * * This function initializes a seccomp filter DB and readies it for use. * Returns a pointer to the DB on success, NULL on failure. * */ static struct db_filter *_db_init(const struct arch_def *arch) { struct db_filter *db; db = zmalloc(sizeof(*db)); if (db == NULL) return NULL; /* set the arch and reset the DB to a known state */ db->arch = arch; _db_reset(db); return db; } /** * Destroy a seccomp filter DB * @param db the seccomp filter DB * * This function destroys a seccomp filter DB. After calling this function, * the filter should no longer be referenced. * */ static void _db_release(struct db_filter *db) { if (db == NULL) return; /* free and reset the DB */ _db_reset(db); free(db); } /** * Destroy a seccomp filter snapshot * @param snap the seccomp filter snapshot * * This function destroys a seccomp filter snapshot. After calling this * function, the snapshot should no longer be referenced. * */ static void _db_snap_release(struct db_filter_snap *snap) { unsigned int iter; if (snap == NULL) return; if (snap->filter_cnt > 0) { for (iter = 0; iter < snap->filter_cnt; iter++) { if (snap->filters[iter]) _db_release(snap->filters[iter]); } free(snap->filters); } free(snap); } /** * Update the user specified portion of the syscall priority * @param db the seccomp filter db * @param syscall the syscall number * @param priority the syscall priority * * This function sets, or updates, the syscall priority; the highest priority * value between the existing and specified value becomes the new syscall * priority. If the syscall entry does not already exist, a new phantom * syscall entry is created as a placeholder. Returns zero on success, * negative values on failure. * */ static int _db_syscall_priority(struct db_filter *db, int syscall, uint8_t priority) { unsigned int sys_pri = _DB_PRI_USER(priority); struct db_sys_list *s_new, *s_iter, *s_prev = NULL; assert(db != NULL); s_iter = db->syscalls; while (s_iter != NULL && s_iter->num < syscall) { s_prev = s_iter; s_iter = s_iter->next; } /* matched an existing syscall entry */ if (s_iter != NULL && s_iter->num == syscall) { if (sys_pri > (s_iter->priority & _DB_PRI_MASK_USER)) { s_iter->priority &= (~_DB_PRI_MASK_USER); s_iter->priority |= sys_pri; } return 0; } /* no existing syscall entry - create a phantom entry */ s_new = zmalloc(sizeof(*s_new)); if (s_new == NULL) return -ENOMEM; s_new->num = syscall; s_new->priority = sys_pri; s_new->valid = false; /* add it before s_iter */ if (s_prev != NULL) { s_new->next = s_prev->next; s_prev->next = s_new; } else { s_new->next = db->syscalls; db->syscalls = s_new; } return 0; } /** * Create a new rule * @param strict the strict value * @param action the rule's action * @param syscall the syscall number * @param chain the syscall argument filter * * This function creates a new rule structure based on the given arguments. * Returns a pointer to the new rule on success, NULL on failure. * */ static struct db_api_rule_list *_db_rule_new(bool strict, uint32_t action, int syscall, struct db_api_arg *chain) { struct db_api_rule_list *rule; rule = zmalloc(sizeof(*rule)); if (rule == NULL) return NULL; rule->action = action; rule->syscall = syscall; rule->strict = strict; memcpy(rule->args, chain, sizeof(*chain) * ARG_COUNT_MAX); return rule; } /** * Duplicate an existing filter rule * @param src the rule to duplicate * * This function makes an exact copy of the given rule, but does not add it * to any lists. Returns a pointer to the new rule on success, NULL on * failure. * */ struct db_api_rule_list *db_rule_dup(const struct db_api_rule_list *src) { struct db_api_rule_list *dest; dest = malloc(sizeof(*dest)); if (dest == NULL) return NULL; memcpy(dest, src, sizeof(*dest)); dest->prev = NULL; dest->next = NULL; return dest; } /** * Free and reset the seccomp filter collection * @param col the seccomp filter collection * @param def_action the default filter action * * This function frees any existing filter DBs and resets the collection to a * default state. In the case of failure the filter collection may be in an * unknown state and should be released. Returns zero on success, negative * values on failure. * */ int db_col_reset(struct db_filter_col *col, uint32_t def_action) { unsigned int iter; struct db_filter *db; struct db_filter_snap *snap; if (col == NULL) return -EINVAL; /* free any filters */ for (iter = 0; iter < col->filter_cnt; iter++) _db_release(col->filters[iter]); col->filter_cnt = 0; if (col->filters) free(col->filters); col->filters = NULL; /* set the endianness to undefined */ col->endian = 0; /* set the default attribute values */ col->attr.act_default = def_action; col->attr.act_badarch = SCMP_ACT_KILL; col->attr.nnp_enable = 1; col->attr.tsync_enable = 0; col->attr.api_tskip = 0; col->attr.log_enable = 0; col->attr.spec_allow = 0; col->attr.optimize = 1; col->attr.api_sysrawrc = 0; col->attr.wait_killable_recv = 0; /* set the state */ col->state = _DB_STA_VALID; if (def_action == SCMP_ACT_NOTIFY) col->notify_used = true; else col->notify_used = false; /* reset the initial db */ db = _db_init(arch_def_native); if (db == NULL) return -ENOMEM; if (db_col_db_add(col, db) < 0) { _db_release(db); return -ENOMEM; } /* reset the transactions */ while (col->snapshots) { snap = col->snapshots; col->snapshots = snap->next; for (iter = 0; iter < snap->filter_cnt; iter++) _db_release(snap->filters[iter]); free(snap->filters); free(snap); } /* reset the precomputed programs */ db_col_precompute_reset(col); return 0; } /** * Intitalize a seccomp filter collection * @param def_action the default filter action * * This function initializes a seccomp filter collection and readies it for * use. Returns a pointer to the collection on success, NULL on failure. * */ struct db_filter_col *db_col_init(uint32_t def_action) { struct db_filter_col *col; col = zmalloc(sizeof(*col)); if (col == NULL) return NULL; /* reset the DB to a known state */ if (db_col_reset(col, def_action) < 0) { db_col_release(col); return NULL; } return col; } /** * Destroy a seccomp filter collection * @param col the seccomp filter collection * * This function destroys a seccomp filter collection. After calling this * function, the filter should no longer be referenced. * */ void db_col_release(struct db_filter_col *col) { unsigned int iter; struct db_filter_snap *snap; if (col == NULL) return; /* set the state, just in case */ col->state = _DB_STA_FREED; /* free any snapshots */ while (col->snapshots != NULL) { snap = col->snapshots; col->snapshots = snap->next; _db_snap_release(snap); } /* free any filters */ for (iter = 0; iter < col->filter_cnt; iter++) _db_release(col->filters[iter]); col->filter_cnt = 0; if (col->filters) free(col->filters); col->filters = NULL; /* free any precompute */ db_col_precompute_reset(col); /* free the collection */ free(col); } /** * Validate a filter collection * @param col the seccomp filter collection * * This function validates a seccomp filter collection. Returns zero if the * collection is valid, negative values on failure. * */ int db_col_valid(struct db_filter_col *col) { if (col != NULL && col->state == _DB_STA_VALID && col->filter_cnt > 0) return 0; return -EINVAL; } /** * Validate the seccomp action * @param col the seccomp filter collection * @param action the seccomp action * * Verify that the given action is a valid seccomp action; return zero if * valid, -EINVAL if invalid. */ int db_col_action_valid(const struct db_filter_col *col, uint32_t action) { if (col != NULL) { /* NOTE: in some cases we don't have a filter collection yet, * but when we do we need to do the following checks */ /* kernel disallows TSYNC and NOTIFY in one filter unless we * have the TSYNC_ESRCH flag */ if (sys_chk_seccomp_flag(SECCOMP_FILTER_FLAG_TSYNC_ESRCH) < 1 && col->attr.tsync_enable && action == SCMP_ACT_NOTIFY) return -EINVAL; } if (sys_chk_seccomp_action(action) == 1) return 0; return -EINVAL; } /** * Merge two filter collections * @param col_dst the destination filter collection * @param col_src the source filter collection * * This function merges two filter collections into the given destination * collection. The source filter collection is no longer valid if the function * returns successfully. Returns zero on success, negative values on failure. * */ int db_col_merge(struct db_filter_col *col_dst, struct db_filter_col *col_src) { unsigned int iter_a, iter_b; struct db_filter **dbs; /* verify that the endianness is a match */ if (col_dst->endian != col_src->endian) return -EDOM; /* make sure we don't have any arch/filter collisions */ for (iter_a = 0; iter_a < col_dst->filter_cnt; iter_a++) { for (iter_b = 0; iter_b < col_src->filter_cnt; iter_b++) { if (col_dst->filters[iter_a]->arch->token == col_src->filters[iter_b]->arch->token) return -EEXIST; } } /* expand the destination */ dbs = realloc(col_dst->filters, sizeof(struct db_filter *) * (col_dst->filter_cnt + col_src->filter_cnt)); if (dbs == NULL) return -ENOMEM; col_dst->filters = dbs; /* transfer the architecture filters */ for (iter_a = col_dst->filter_cnt, iter_b = 0; iter_b < col_src->filter_cnt; iter_a++, iter_b++) { col_dst->filters[iter_a] = col_src->filters[iter_b]; col_dst->filter_cnt++; } /* reset the precompute */ db_col_precompute_reset(col_dst); /* free the source */ col_src->filter_cnt = 0; db_col_release(col_src); return 0; } /** * Check to see if an architecture filter exists in the filter collection * @param col the seccomp filter collection * @param arch_token the architecture token * * Iterate through the given filter collection checking to see if a filter * exists for the specified architecture. Returns -EEXIST if a filter is found, * zero if a matching filter does not exist. * */ int db_col_arch_exist(struct db_filter_col *col, uint32_t arch_token) { unsigned int iter; for (iter = 0; iter < col->filter_cnt; iter++) if (col->filters[iter]->arch->token == arch_token) return -EEXIST; return 0; } /** * Get a filter attribute * @param col the seccomp filter collection * @param attr the filter attribute * @param value the filter attribute value * * Get the requested filter attribute and provide it via @value. Returns zero * on success, negative values on failure. * */ int db_col_attr_get(const struct db_filter_col *col, enum scmp_filter_attr attr, uint32_t *value) { int rc = 0; switch (attr) { case SCMP_FLTATR_ACT_DEFAULT: *value = col->attr.act_default; break; case SCMP_FLTATR_ACT_BADARCH: *value = col->attr.act_badarch; break; case SCMP_FLTATR_CTL_NNP: *value = col->attr.nnp_enable; break; case SCMP_FLTATR_CTL_TSYNC: *value = col->attr.tsync_enable; break; case SCMP_FLTATR_API_TSKIP: *value = col->attr.api_tskip; break; case SCMP_FLTATR_CTL_LOG: *value = col->attr.log_enable; break; case SCMP_FLTATR_CTL_SSB: *value = col->attr.spec_allow; break; case SCMP_FLTATR_CTL_OPTIMIZE: *value = col->attr.optimize; break; case SCMP_FLTATR_API_SYSRAWRC: *value = col->attr.api_sysrawrc; break; case SCMP_FLTATR_CTL_WAITKILL: *value = col->attr.wait_killable_recv; break; default: rc = -EINVAL; break; } return rc; } /** * Get a filter attribute * @param col the seccomp filter collection * @param attr the filter attribute * * Returns the requested filter attribute value with zero on any error. * Special care must be given with this function as error conditions can be * hidden from the caller. * */ uint32_t db_col_attr_read(const struct db_filter_col *col, enum scmp_filter_attr attr) { uint32_t value = 0; db_col_attr_get(col, attr, &value); return value; } /** * Set a filter attribute * @param col the seccomp filter collection * @param attr the filter attribute * @param value the filter attribute value * * Set the requested filter attribute with the given value. Returns zero on * success, negative values on failure. * */ int db_col_attr_set(struct db_filter_col *col, enum scmp_filter_attr attr, uint32_t value) { int rc = 0; switch (attr) { case SCMP_FLTATR_ACT_DEFAULT: /* read only */ return -EACCES; break; case SCMP_FLTATR_ACT_BADARCH: if (db_col_action_valid(col, value) == 0) col->attr.act_badarch = value; else return -EINVAL; db_col_precompute_reset(col); break; case SCMP_FLTATR_CTL_NNP: col->attr.nnp_enable = (value ? 1 : 0); break; case SCMP_FLTATR_CTL_TSYNC: rc = sys_chk_seccomp_flag(SECCOMP_FILTER_FLAG_TSYNC); if (rc == 1) { /* supported */ rc = 0; /* kernel disallows TSYNC and NOTIFY in one filter * unless we have TSYNC_ESRCH */ if (sys_chk_seccomp_flag(SECCOMP_FILTER_FLAG_TSYNC_ESRCH) < 1 && value && col->notify_used) return -EINVAL; col->attr.tsync_enable = (value ? 1 : 0); } else if (rc == 0) /* unsupported */ rc = -EOPNOTSUPP; break; case SCMP_FLTATR_API_TSKIP: col->attr.api_tskip = (value ? 1 : 0); db_col_precompute_reset(col); break; case SCMP_FLTATR_CTL_LOG: rc = sys_chk_seccomp_flag(SECCOMP_FILTER_FLAG_LOG); if (rc == 1) { /* supported */ rc = 0; col->attr.log_enable = (value ? 1 : 0); } else if (rc == 0) { /* unsupported */ rc = -EOPNOTSUPP; } break; case SCMP_FLTATR_CTL_SSB: rc = sys_chk_seccomp_flag(SECCOMP_FILTER_FLAG_SPEC_ALLOW); if (rc == 1) { /* supported */ rc = 0; col->attr.spec_allow = (value ? 1 : 0); } else if (rc == 0) { /* unsupported */ rc = -EOPNOTSUPP; } break; case SCMP_FLTATR_CTL_OPTIMIZE: switch (value) { case 1: case 2: col->attr.optimize = value; break; default: rc = -EOPNOTSUPP; break; } db_col_precompute_reset(col); break; case SCMP_FLTATR_API_SYSRAWRC: col->attr.api_sysrawrc = (value ? 1 : 0); break; case SCMP_FLTATR_CTL_WAITKILL: col->attr.wait_killable_recv = (value ? 1 : 0); break; default: rc = -EINVAL; break; } return rc; } /** * Add a new architecture filter to a filter collection * @param col the seccomp filter collection * @param arch the architecture * * This function adds a new architecture filter DB to an existing seccomp * filter collection assuming there isn't a filter DB already present with the * same architecture. Returns zero on success, negative values on failure. * */ int db_col_db_new(struct db_filter_col *col, const struct arch_def *arch) { int rc; struct db_filter *db; db = _db_init(arch); if (db == NULL) return -ENOMEM; rc = db_col_db_add(col, db); if (rc < 0) _db_release(db); else db_col_precompute_reset(col); return rc; } /** * Add a new filter DB to a filter collection * @param col the seccomp filter collection * @param db the seccomp filter DB * * This function adds an existing seccomp filter DB to an existing seccomp * filter collection assuming there isn't a filter DB already present with the * same architecture. Returns zero on success, negative values on failure. * */ int db_col_db_add(struct db_filter_col *col, struct db_filter *db) { struct db_filter **dbs; if (col->endian != 0 && col->endian != db->arch->endian) return -EDOM; if (db_col_arch_exist(col, db->arch->token)) return -EEXIST; dbs = realloc(col->filters, sizeof(struct db_filter *) * (col->filter_cnt + 1)); if (dbs == NULL) return -ENOMEM; col->filters = dbs; col->filter_cnt++; col->filters[col->filter_cnt - 1] = db; if (col->endian == 0) col->endian = db->arch->endian; return 0; } /** * Remove a filter DB from a filter collection * @param col the seccomp filter collection * @param arch_token the architecture token * * This function removes an existing seccomp filter DB from an existing seccomp * filter collection. Returns zero on success, negative values on failure. * */ int db_col_db_remove(struct db_filter_col *col, uint32_t arch_token) { unsigned int iter; unsigned int found; struct db_filter **dbs; if ((col->filter_cnt <= 0) || (db_col_arch_exist(col, arch_token) == 0)) return -EINVAL; for (found = 0, iter = 0; iter < col->filter_cnt; iter++) { if (found) col->filters[iter - 1] = col->filters[iter]; else if (col->filters[iter]->arch->token == arch_token) { _db_release(col->filters[iter]); found = 1; } } col->filters[--col->filter_cnt] = NULL; if (col->filter_cnt > 0) { /* NOTE: if we can't do the realloc it isn't fatal, we just * have some extra space allocated */ dbs = realloc(col->filters, sizeof(struct db_filter *) * col->filter_cnt); if (dbs != NULL) col->filters = dbs; } else { /* this was the last filter so free all the associated memory * and reset the endian token */ free(col->filters); col->filters = NULL; col->endian = 0; } db_col_precompute_reset(col); return 0; } /** * Test if the argument filter can be skipped because it's a tautology * @param arg argument filter * * If this argument filter applied to the lower 32 bit can be skipped this * function returns false. * */ static bool _db_arg_cmp_need_lo(const struct db_api_arg *arg) { if (arg->op == SCMP_CMP_MASKED_EQ && D64_LO(arg->mask) == 0) return false; return true; } /** * Test if the argument filter can be skipped because it's a tautology * @param arg argument filter * * If this argument filter applied to the upper 32 bit can be skipped this * function returns false. * */ static bool _db_arg_cmp_need_hi(const struct db_api_arg *arg) { if (arg->op == SCMP_CMP_MASKED_EQ && D64_HI(arg->mask) == 0) return false; return true; } /** * Fixup the node based on the op/mask * @param node the chain node * * Ensure the datum is masked as well. * */ static void _db_node_mask_fixup(struct db_arg_chain_tree *node) { node->datum &= node->mask; } /** * Generate a new filter rule for a 64 bit system * @param arch the architecture definition * @param rule the new filter rule * * This function generates a new syscall filter for a 64 bit system. Returns * zero on success, negative values on failure. * */ static struct db_sys_list *_db_rule_gen_64(const struct arch_def *arch, const struct db_api_rule_list *rule) { unsigned int iter; struct db_sys_list *s_new; const struct db_api_arg *chain = rule->args; struct db_arg_chain_tree *c_iter[3] = { NULL, NULL, NULL }; struct db_arg_chain_tree *c_prev[3] = { NULL, NULL, NULL }; enum scmp_compare op_prev = _SCMP_CMP_MIN; unsigned int arg; scmp_datum_t mask; scmp_datum_t datum; s_new = zmalloc(sizeof(*s_new)); if (s_new == NULL) return NULL; s_new->num = rule->syscall; s_new->valid = true; /* run through the argument chain */ for (iter = 0; iter < ARG_COUNT_MAX; iter++) { if (chain[iter].valid == 0) continue; /* TODO: handle the case were either hi or lo isn't needed */ /* skip generating instruction which are no-ops */ if (!_db_arg_cmp_need_hi(&chain[iter]) && !_db_arg_cmp_need_lo(&chain[iter])) continue; c_iter[0] = zmalloc(sizeof(*c_iter[0])); if (c_iter[0] == NULL) goto gen_64_failure; c_iter[1] = zmalloc(sizeof(*c_iter[1])); if (c_iter[1] == NULL) { free(c_iter[0]); goto gen_64_failure; } c_iter[2] = NULL; arg = chain[iter].arg; mask = chain[iter].mask; datum = chain[iter].datum; /* NOTE: with the idea that a picture is worth a thousand * words, i'm presenting the following diagrams which * show how we should compare 64-bit syscall arguments * using 32-bit comparisons. * * in the diagrams below "A(x)" is the syscall argument * being evaluated and "R(x)" is the syscall argument * value specified in the libseccomp rule. the "ACCEPT" * verdict indicates a rule match and processing should * continue on to the rest of the rule, or the final rule * action should be triggered. the "REJECT" verdict * indicates that the rule does not match and processing * should continue to the next rule or the default * action. * * SCMP_CMP_GT: * +------------------+ * +--| Ah(x) > Rh(x) |------+ * | +------------------+ | * FALSE TRUE A * | | C * +-----------+ +----> C * v +----> E * +------------------+ | P * +--| Ah(x) == Rh(x) |--+ | T * R | +------------------+ | | * E FALSE TRUE | * J <----+ | | * E <----+ +------------+ | * C FALSE v | * T | +------------------+ | * +--| Al(x) > Rl(x) |------+ * +------------------+ * * SCMP_CMP_GE: * +------------------+ * +--| Ah(x) > Rh(x) |------+ * | +------------------+ | * FALSE TRUE A * | | C * +-----------+ +----> C * v +----> E * +------------------+ | P * +--| Ah(x) == Rh(x) |--+ | T * R | +------------------+ | | * E FALSE TRUE | * J <----+ | | * E <----+ +------------+ | * C FALSE v | * T | +------------------+ | * +--| Al(x) >= Rl(x) |------+ * +------------------+ * * SCMP_CMP_LT: * +------------------+ * +--| Ah(x) > Rh(x) |------+ * | +------------------+ | * FALSE TRUE R * | | E * +-----------+ +----> J * v +----> E * +------------------+ | C * +--| Ah(x) == Rh(x) |--+ | T * A | +------------------+ | | * C FALSE TRUE | * C <----+ | | * E <----+ +------------+ | * P FALSE v | * T | +------------------+ | * +--| Al(x) >= Rl(x) |------+ * +------------------+ * * SCMP_CMP_LE: * +------------------+ * +--| Ah(x) > Rh(x) |------+ * | +------------------+ | * FALSE TRUE R * | | E * +-----------+ +----> J * v +----> E * +------------------+ | C * +--| Ah(x) == Rh(x) |--+ | T * A | +------------------+ | | * C FALSE TRUE | * C <----+ | | * E <----+ +------------+ | * P FALSE v | * T | +------------------+ | * +--| Al(x) > Rl(x) |------+ * +------------------+ * * SCMP_CMP_EQ: * +------------------+ * +--| Ah(x) == Rh(x) |--+ * R | +------------------+ | A * E FALSE TRUE C * J <----+ | C * E <----+ +------------+ +----> E * C FALSE v | P * T | +------------------+ | T * +--| Al(x) == Rl(x) |------+ * +------------------+ * * SCMP_CMP_NE: * +------------------+ * +--| Ah(x) == Rh(x) |--+ * A | +------------------+ | R * C FALSE TRUE E * C <----+ | J * E <----+ +------------+ +----> E * P FALSE v | C * T | +------------------+ | T * +--| Al(x) == Rl(x) |------+ * +------------------+ * */ /* setup the level */ switch (chain[iter].op) { case SCMP_CMP_GT: case SCMP_CMP_GE: case SCMP_CMP_LE: case SCMP_CMP_LT: c_iter[2] = zmalloc(sizeof(*c_iter[2])); if (c_iter[2] == NULL) { free(c_iter[0]); free(c_iter[1]); goto gen_64_failure; } c_iter[0]->arg = arg; c_iter[1]->arg = arg; c_iter[2]->arg = arg; c_iter[0]->arg_h_flg = true; c_iter[1]->arg_h_flg = true; c_iter[2]->arg_h_flg = false; c_iter[0]->arg_offset = arch_arg_offset_hi(arch, arg); c_iter[1]->arg_offset = arch_arg_offset_hi(arch, arg); c_iter[2]->arg_offset = arch_arg_offset_lo(arch, arg); c_iter[0]->mask = D64_HI(mask); c_iter[1]->mask = D64_HI(mask); c_iter[2]->mask = D64_LO(mask); c_iter[0]->datum = D64_HI(datum); c_iter[1]->datum = D64_HI(datum); c_iter[2]->datum = D64_LO(datum); c_iter[0]->datum_full = datum; c_iter[1]->datum_full = datum; c_iter[2]->datum_full = datum; _db_node_mask_fixup(c_iter[0]); _db_node_mask_fixup(c_iter[1]); _db_node_mask_fixup(c_iter[2]); c_iter[0]->op = SCMP_CMP_GT; c_iter[1]->op = SCMP_CMP_EQ; switch (chain[iter].op) { case SCMP_CMP_GT: case SCMP_CMP_LE: c_iter[2]->op = SCMP_CMP_GT; break; case SCMP_CMP_GE: case SCMP_CMP_LT: c_iter[2]->op = SCMP_CMP_GE; break; default: /* we should never get here */ goto gen_64_failure; } c_iter[0]->op_orig = chain[iter].op; c_iter[1]->op_orig = chain[iter].op; c_iter[2]->op_orig = chain[iter].op; c_iter[0]->nxt_f = _db_node_get(c_iter[1]); c_iter[1]->nxt_t = _db_node_get(c_iter[2]); break; case SCMP_CMP_EQ: case SCMP_CMP_MASKED_EQ: case SCMP_CMP_NE: c_iter[0]->arg = arg; c_iter[1]->arg = arg; c_iter[0]->arg_h_flg = true; c_iter[1]->arg_h_flg = false; c_iter[0]->arg_offset = arch_arg_offset_hi(arch, arg); c_iter[1]->arg_offset = arch_arg_offset_lo(arch, arg); c_iter[0]->mask = D64_HI(mask); c_iter[1]->mask = D64_LO(mask); c_iter[0]->datum = D64_HI(datum); c_iter[1]->datum = D64_LO(datum); c_iter[0]->datum_full = datum; c_iter[1]->datum_full = datum; _db_node_mask_fixup(c_iter[0]); _db_node_mask_fixup(c_iter[1]); switch (chain[iter].op) { case SCMP_CMP_MASKED_EQ: c_iter[0]->op = SCMP_CMP_MASKED_EQ; c_iter[1]->op = SCMP_CMP_MASKED_EQ; break; default: c_iter[0]->op = SCMP_CMP_EQ; c_iter[1]->op = SCMP_CMP_EQ; } c_iter[0]->op_orig = chain[iter].op; c_iter[1]->op_orig = chain[iter].op; c_iter[0]->nxt_t = _db_node_get(c_iter[1]); break; default: /* we should never get here */ goto gen_64_failure; } /* link this level to the previous level */ if (c_prev[0] != NULL) { switch (op_prev) { case SCMP_CMP_GT: case SCMP_CMP_GE: c_prev[0]->nxt_t = _db_node_get(c_iter[0]); c_prev[2]->nxt_t = _db_node_get(c_iter[0]); break; case SCMP_CMP_EQ: case SCMP_CMP_MASKED_EQ: c_prev[1]->nxt_t = _db_node_get(c_iter[0]); break; case SCMP_CMP_LE: case SCMP_CMP_LT: c_prev[1]->nxt_f = _db_node_get(c_iter[0]); c_prev[2]->nxt_f = _db_node_get(c_iter[0]); break; case SCMP_CMP_NE: c_prev[0]->nxt_f = _db_node_get(c_iter[0]); c_prev[1]->nxt_f = _db_node_get(c_iter[0]); break; default: /* we should never get here */ goto gen_64_failure; } } else s_new->chains = _db_node_get(c_iter[0]); /* update the node count */ switch (chain[iter].op) { case SCMP_CMP_NE: case SCMP_CMP_EQ: case SCMP_CMP_MASKED_EQ: s_new->node_cnt += 2; break; default: s_new->node_cnt += 3; } /* keep pointers to this level */ c_prev[0] = c_iter[0]; c_prev[1] = c_iter[1]; c_prev[2] = c_iter[2]; op_prev = chain[iter].op; } if (c_iter[0] != NULL) { /* set the actions on the last layer */ switch (op_prev) { case SCMP_CMP_GT: case SCMP_CMP_GE: c_iter[0]->act_t_flg = true; c_iter[0]->act_t = rule->action; c_iter[2]->act_t_flg = true; c_iter[2]->act_t = rule->action; break; case SCMP_CMP_LE: case SCMP_CMP_LT: c_iter[1]->act_f_flg = true; c_iter[1]->act_f = rule->action; c_iter[2]->act_f_flg = true; c_iter[2]->act_f = rule->action; break; case SCMP_CMP_EQ: case SCMP_CMP_MASKED_EQ: c_iter[1]->act_t_flg = true; c_iter[1]->act_t = rule->action; break; case SCMP_CMP_NE: c_iter[0]->act_f_flg = true; c_iter[0]->act_f = rule->action; c_iter[1]->act_f_flg = true; c_iter[1]->act_f = rule->action; break; default: /* we should never get here */ goto gen_64_failure; } } else s_new->action = rule->action; return s_new; gen_64_failure: /* free the new chain and its syscall struct */ _db_tree_put(&s_new->chains); free(s_new); return NULL; } /** * Generate a new filter rule for a 32 bit system * @param arch the architecture definition * @param rule the new filter rule * * This function generates a new syscall filter for a 32 bit system. Returns * zero on success, negative values on failure. * */ static struct db_sys_list *_db_rule_gen_32(const struct arch_def *arch, const struct db_api_rule_list *rule) { unsigned int iter; struct db_sys_list *s_new; const struct db_api_arg *chain = rule->args; struct db_arg_chain_tree *c_iter = NULL, *c_prev = NULL; bool tf_flag; s_new = zmalloc(sizeof(*s_new)); if (s_new == NULL) return NULL; s_new->num = rule->syscall; s_new->valid = true; /* run through the argument chain */ for (iter = 0; iter < ARG_COUNT_MAX; iter++) { if (chain[iter].valid == 0) continue; /* skip generating instructions which are no-ops */ if (!_db_arg_cmp_need_lo(&chain[iter])) continue; c_iter = zmalloc(sizeof(*c_iter)); if (c_iter == NULL) goto gen_32_failure; c_iter->arg = chain[iter].arg; c_iter->arg_h_flg = false; c_iter->arg_offset = arch_arg_offset(arch, c_iter->arg); c_iter->op = chain[iter].op; c_iter->op_orig = chain[iter].op; /* implicitly strips off the upper 32 bit */ c_iter->mask = chain[iter].mask; c_iter->datum = chain[iter].datum; c_iter->datum_full = chain[iter].datum; /* link in the new node and update the chain */ if (c_prev != NULL) { if (tf_flag) c_prev->nxt_t = _db_node_get(c_iter); else c_prev->nxt_f = _db_node_get(c_iter); } else s_new->chains = _db_node_get(c_iter); s_new->node_cnt++; /* rewrite the op to reduce the op/datum combos */ switch (c_iter->op) { case SCMP_CMP_NE: c_iter->op = SCMP_CMP_EQ; tf_flag = false; break; case SCMP_CMP_LT: c_iter->op = SCMP_CMP_GE; tf_flag = false; break; case SCMP_CMP_LE: c_iter->op = SCMP_CMP_GT; tf_flag = false; break; default: tf_flag = true; } /* fixup the mask/datum */ _db_node_mask_fixup(c_iter); c_prev = c_iter; } if (c_iter != NULL) { /* set the leaf node */ if (tf_flag) { c_iter->act_t_flg = true; c_iter->act_t = rule->action; } else { c_iter->act_f_flg = true; c_iter->act_f = rule->action; } } else s_new->action = rule->action; return s_new; gen_32_failure: /* free the new chain and its syscall struct */ _db_tree_put(&s_new->chains); free(s_new); return NULL; } /** * Add a new rule to the seccomp filter DB * @param db the seccomp filter db * @param rule the filter rule * * This function adds a new syscall filter to the seccomp filter DB, adding to * the existing filters for the syscall, unless no argument specific filters * are present (filtering only on the syscall). When adding new chains, the * shortest chain, or most inclusive filter match, will be entered into the * filter DB. Returns zero on success, negative values on failure. * * It is important to note that in the case of failure the db may be corrupted, * the caller must use the transaction mechanism if the db integrity is * important. * */ int db_rule_add(struct db_filter *db, const struct db_api_rule_list *rule) { int rc = -ENOMEM; struct db_sys_list *s_new, *s_iter, *s_prev = NULL; struct db_iter_state state; bool rm_flag = false; assert(db != NULL); /* do all our possible memory allocation up front so we don't have to * worry about failure once we get to the point where we start updating * the filter db */ if (db->arch->size == ARCH_SIZE_64) s_new = _db_rule_gen_64(db->arch, rule); else if (db->arch->size == ARCH_SIZE_32) s_new = _db_rule_gen_32(db->arch, rule); else return -EFAULT; if (s_new == NULL) return -ENOMEM; /* find a matching syscall/chain or insert a new one */ s_iter = db->syscalls; while (s_iter != NULL && s_iter->num < rule->syscall) { s_prev = s_iter; s_iter = s_iter->next; } s_new->priority = _DB_PRI_MASK_CHAIN - s_new->node_cnt; add_reset: if (s_iter == NULL || s_iter->num != rule->syscall) { /* new syscall, add before s_iter */ if (s_prev != NULL) { s_new->next = s_prev->next; s_prev->next = s_new; } else { s_new->next = db->syscalls; db->syscalls = s_new; } db->syscall_cnt++; return 0; } else if (s_iter->chains == NULL) { if (rm_flag || !s_iter->valid) { /* we are here because our previous pass cleared the * entire syscall chain when searching for a subtree * match or the existing syscall entry is a phantom, * so either way add the new chain */ s_iter->chains = s_new->chains; s_iter->action = s_new->action; s_iter->node_cnt = s_new->node_cnt; if (s_iter->valid) s_iter->priority = s_new->priority; s_iter->valid = true; free(s_new); rc = 0; goto add_priority_update; } else { /* syscall exists without any chains - existing filter * is at least as large as the new entry so cleanup and * exit */ _db_tree_put(&s_new->chains); free(s_new); goto add_free_ok; } } else if (s_iter->chains != NULL && s_new->chains == NULL) { /* syscall exists with chains but the new filter has no chains * so we need to clear the existing chains and exit */ _db_tree_put(&s_iter->chains); s_iter->chains = NULL; s_iter->node_cnt = 0; s_iter->action = rule->action; /* cleanup the new tree and return */ _db_tree_put(&s_new->chains); free(s_new); goto add_free_ok; } /* prune any sub-trees that are no longer required */ memset(&state, 0, sizeof(state)); state.sx = s_iter; state.action = rule->action; rc = _db_tree_prune(&s_iter->chains, s_new->chains, &state); if (rc > 0) { /* we pruned at least some of the existing tree */ rm_flag = true; s_iter->node_cnt -= rc; if (s_iter->chains == NULL) /* we pruned the entire tree */ goto add_reset; } else if ((state.flags & _DB_IST_M_REDUNDANT) == _DB_IST_M_REDUNDANT) { /* the existing tree is "shorter", drop the new one */ _db_tree_put(&s_new->chains); free(s_new); goto add_free_ok; } /* add the new rule to the existing filter and cleanup */ memset(&state, 0, sizeof(state)); state.sx = s_iter; rc = _db_tree_add(&s_iter->chains, s_new->chains, &state); if (rc < 0) goto add_failure; s_iter->node_cnt += s_new->node_cnt; s_iter->node_cnt -= _db_tree_put(&s_new->chains); free(s_new); add_free_ok: rc = 0; add_priority_update: /* update the priority */ if (s_iter != NULL) { s_iter->priority &= (~_DB_PRI_MASK_CHAIN); s_iter->priority |= (_DB_PRI_MASK_CHAIN - s_iter->node_cnt); } return rc; add_failure: /* NOTE: another reminder that we don't do any db error recovery here, * use the transaction mechanism as previously mentioned */ _db_tree_put(&s_new->chains); free(s_new); return rc; } /** * Set the priority of a given syscall * @param col the filter collection * @param syscall the syscall number * @param priority priority value, higher value == higher priority * * This function sets the priority of the given syscall; this value is used * when generating the seccomp filter code such that higher priority syscalls * will incur less filter code overhead than the lower priority syscalls in the * filter. Returns zero on success, negative values on failure. * */ int db_col_syscall_priority(struct db_filter_col *col, int syscall, uint8_t priority) { int rc = 0, rc_tmp; unsigned int iter; int sc_tmp; struct db_filter *filter; for (iter = 0; iter < col->filter_cnt; iter++) { filter = col->filters[iter]; sc_tmp = syscall; rc_tmp = arch_syscall_translate(filter->arch, &sc_tmp); if (rc_tmp < 0) goto priority_failure; /* if this is a pseudo syscall then we need to rewrite the * syscall for some arch specific reason, don't forget the * special handling for syscall -1 */ if (sc_tmp < -1) { /* we set this as a strict op - we don't really care * since priorities are a "best effort" thing - as we * want to catch the -EDOM error and bail on this * architecture */ rc_tmp = arch_syscall_rewrite(filter->arch, &sc_tmp); if (rc_tmp == -EDOM) continue; if (rc_tmp < 0) goto priority_failure; } rc_tmp = _db_syscall_priority(filter, sc_tmp, priority); priority_failure: if (rc == 0 && rc_tmp < 0) rc = rc_tmp; } if (rc == 0) db_col_precompute_reset(col); return rc; } /** * Add a new rule to a single filter * @param filter the filter * @param rule the filter rule * * This is a helper function for db_col_rule_add() and similar functions, it * isn't generally useful. Returns zero on success, negative values on error. * */ static int _db_col_rule_add(struct db_filter *filter, struct db_api_rule_list *rule) { int rc; struct db_api_rule_list *iter; /* add the rule to the filter */ rc = arch_filter_rule_add(filter, rule); if (rc != 0) return rc; /* insert the chain to the end of the rule list */ iter = rule; while (iter->next) iter = iter->next; if (filter->rules != NULL) { rule->prev = filter->rules->prev; iter->next = filter->rules; filter->rules->prev->next = rule; filter->rules->prev = iter; } else { rule->prev = iter; iter->next = rule; filter->rules = rule; } return 0; } /** * Add a new rule to the current filter * @param col the filter collection * @param strict the strict flag * @param action the filter action * @param syscall the syscall number * @param arg_cnt the number of argument filters in the argument filter chain * @param arg_array the argument filter chain, (uint, enum scmp_compare, ulong) * * This function adds a new argument/comparison/value to the seccomp filter for * a syscall; multiple arguments can be specified and they will be chained * together (essentially AND'd together) in the filter. When the strict flag * is true the function will fail if the exact rule can not be added to the * filter, if the strict flag is false the function will not fail if the * function needs to adjust the rule due to architecture specifics. Returns * zero on success, negative values on failure. * */ int db_col_rule_add(struct db_filter_col *col, bool strict, uint32_t action, int syscall, unsigned int arg_cnt, const struct scmp_arg_cmp *arg_array) { int rc = 0, rc_tmp; unsigned int iter; unsigned int arg_num; size_t chain_size; struct db_api_arg *chain = NULL; struct scmp_arg_cmp arg_data; struct db_api_rule_list *rule; struct db_filter *db; /* collect the arguments for the filter rule */ chain_size = sizeof(*chain) * ARG_COUNT_MAX; chain = zmalloc(chain_size); if (chain == NULL) return -ENOMEM; for (iter = 0; iter < arg_cnt; iter++) { arg_data = arg_array[iter]; arg_num = arg_data.arg; if (arg_num < ARG_COUNT_MAX && chain[arg_num].valid == 0) { chain[arg_num].valid = 1; chain[arg_num].arg = arg_num; chain[arg_num].op = arg_data.op; /* TODO: we should check datum/mask size against the * arch definition, e.g. 64 bit datum on x86 */ switch (chain[arg_num].op) { case SCMP_CMP_NE: case SCMP_CMP_LT: case SCMP_CMP_LE: case SCMP_CMP_EQ: case SCMP_CMP_GE: case SCMP_CMP_GT: chain[arg_num].mask = DATUM_MAX; chain[arg_num].datum = arg_data.datum_a; break; case SCMP_CMP_MASKED_EQ: chain[arg_num].mask = arg_data.datum_a; chain[arg_num].datum = arg_data.datum_b; break; default: rc = -EINVAL; goto add_return; } } else { rc = -EINVAL; goto add_return; } } /* create a checkpoint */ rc = db_col_transaction_start(col); if (rc != 0) goto add_return; /* add the rule to the different filters in the collection */ for (iter = 0; iter < col->filter_cnt; iter++) { db = col->filters[iter]; /* create the rule */ rule = _db_rule_new(strict, action, syscall, chain); if (rule == NULL) { rc_tmp = -ENOMEM; goto add_arch_fail; } /* add the rule */ rc_tmp = _db_col_rule_add(db, rule); if (rc_tmp != 0) free(rule); add_arch_fail: if (rc_tmp != 0 && rc == 0) rc = rc_tmp; } /* commit the transaction or abort */ if (rc == 0) db_col_transaction_commit(col); else db_col_transaction_abort(col); add_return: /* update the misc state */ if (rc == 0) { if (action == SCMP_ACT_NOTIFY) col->notify_used = true; db_col_precompute_reset(col); } if (chain != NULL) free(chain); return rc; } /** * Start a new seccomp filter transaction * @param col the filter collection * * This function starts a new seccomp filter transaction for the given filter * collection. Returns zero on success, negative values on failure. * */ int db_col_transaction_start(struct db_filter_col *col) { int rc; unsigned int iter; struct db_filter_snap *snap; struct db_filter *filter_o, *filter_s; struct db_api_rule_list *rule_o, *rule_s = NULL; /* check to see if a shadow snapshot exists */ if (col->snapshots && col->snapshots->shadow) { /* we have a shadow! this will be easy */ /* NOTE: we don't bother to do any verification of the shadow * because we start a new transaction every time we add * a new rule to the filter(s); if this ever changes we * will need to add a mechanism to verify that the shadow * transaction is current/correct */ col->snapshots->shadow = false; return 0; } /* allocate the snapshot */ snap = zmalloc(sizeof(*snap)); if (snap == NULL) return -ENOMEM; snap->filters = zmalloc(sizeof(struct db_filter *) * col->filter_cnt); if (snap->filters == NULL) { free(snap); return -ENOMEM; } snap->filter_cnt = col->filter_cnt; for (iter = 0; iter < snap->filter_cnt; iter++) snap->filters[iter] = NULL; snap->next = NULL; /* create a snapshot of the current filter state */ for (iter = 0; iter < col->filter_cnt; iter++) { /* allocate a new filter */ filter_o = col->filters[iter]; filter_s = _db_init(filter_o->arch); if (filter_s == NULL) goto trans_start_failure; snap->filters[iter] = filter_s; /* create a filter snapshot from existing rules */ rule_o = filter_o->rules; if (rule_o == NULL) continue; do { /* duplicate the rule */ rule_s = db_rule_dup(rule_o); if (rule_s == NULL) goto trans_start_failure; /* add the rule */ rc = _db_col_rule_add(filter_s, rule_s); if (rc != 0) goto trans_start_failure; rule_s = NULL; /* next rule */ rule_o = rule_o->next; } while (rule_o != filter_o->rules); } /* add the snapshot to the list */ snap->next = col->snapshots; col->snapshots = snap; return 0; trans_start_failure: if (rule_s != NULL) free(rule_s); _db_snap_release(snap); return -ENOMEM; } /** * Abort the top most seccomp filter transaction * @param col the filter collection * * This function aborts the most recent seccomp filter transaction. * */ void db_col_transaction_abort(struct db_filter_col *col) { int iter; unsigned int filter_cnt; struct db_filter **filters; struct db_filter_snap *snap; if (col->snapshots == NULL) return; /* replace the current filter with the last snapshot */ snap = col->snapshots; col->snapshots = snap->next; filter_cnt = col->filter_cnt; filters = col->filters; col->filter_cnt = snap->filter_cnt; col->filters = snap->filters; free(snap); /* free the filter we swapped out */ for (iter = 0; iter < filter_cnt; iter++) _db_release(filters[iter]); free(filters); /* free any precompute */ db_col_precompute_reset(col); } /** * Commit the top most seccomp filter transaction * @param col the filter collection * * This function commits the most recent seccomp filter transaction and * attempts to create a shadow transaction that is a duplicate of the current * filter to speed up future transactions. * */ void db_col_transaction_commit(struct db_filter_col *col) { int rc; unsigned int iter; struct db_filter_snap *snap; struct db_filter *filter_o, *filter_s; struct db_api_rule_list *rule_o, *rule_s; snap = col->snapshots; if (snap == NULL) return; /* check for a shadow set by a higher transaction commit */ if (snap->shadow) { /* leave the shadow intact, but drop the next snapshot */ if (snap->next) { snap->next = snap->next->next; _db_snap_release(snap->next); } return; } /* adjust the number of filters if needed */ if (col->filter_cnt > snap->filter_cnt) { unsigned int tmp_i; struct db_filter **tmp_f; /* add filters */ tmp_f = realloc(snap->filters, sizeof(struct db_filter *) * col->filter_cnt); if (tmp_f == NULL) goto shadow_err; snap->filters = tmp_f; do { tmp_i = snap->filter_cnt; snap->filters[tmp_i] = _db_init(col->filters[tmp_i]->arch); if (snap->filters[tmp_i] == NULL) goto shadow_err; snap->filter_cnt++; } while (snap->filter_cnt < col->filter_cnt); } else if (col->filter_cnt < snap->filter_cnt) { /* remove filters */ /* NOTE: while we release the filters we no longer need, we * don't bother to resize the filter array, we just * adjust the filter counter, this *should* be harmless * at the cost of a not reaping all the memory possible */ do { _db_release(snap->filters[snap->filter_cnt--]); } while (snap->filter_cnt > col->filter_cnt); } /* loop through each filter and update the rules on the snapshot */ for (iter = 0; iter < col->filter_cnt; iter++) { filter_o = col->filters[iter]; filter_s = snap->filters[iter]; /* skip ahead to the new rule(s) */ rule_o = filter_o->rules; rule_s = filter_s->rules; if (rule_o == NULL) /* nothing to shadow */ continue; if (rule_s != NULL) { do { rule_o = rule_o->next; rule_s = rule_s->next; } while (rule_s != filter_s->rules); /* did we actually add any rules? */ if (rule_o == filter_o->rules) /* no, we are done in this case */ continue; } /* update the old snapshot to make it a shadow */ do { /* duplicate the rule */ rule_s = db_rule_dup(rule_o); if (rule_s == NULL) goto shadow_err; /* add the rule */ rc = _db_col_rule_add(filter_s, rule_s); if (rc != 0) { free(rule_s); goto shadow_err; } /* next rule */ rule_o = rule_o->next; } while (rule_o != filter_o->rules); } /* success, mark the snapshot as a shadow and return */ snap->shadow = true; return; shadow_err: /* we failed making a shadow, cleanup and return */ col->snapshots = snap->next; _db_snap_release(snap); return; } /** * Precompute the seccomp filters * @param col the filter collection * * This function precomputes the seccomp filters before they are needed, * returns zero on success, negative values on error. * */ int db_col_precompute(struct db_filter_col *col) { if (!col->prgm_bpf) return gen_bpf_generate(col, &col->prgm_bpf); return 0; } /** * Free any precomputed filter programs * @param col the filter collection * * This function releases any precomputed filter programs. */ void db_col_precompute_reset(struct db_filter_col *col) { if (!col->prgm_bpf) return; gen_bpf_release(col->prgm_bpf); col->prgm_bpf = NULL; } libseccomp-2.5.4/src/arch-aarch64.c0000644000000000000000000000250614467535324015456 0ustar rootroot/** * Enhanced Seccomp AArch64 Syscall Table * * Copyright (c) 2014 Red Hat * Author: Marcin Juszkiewicz */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "arch.h" #include "arch-aarch64.h" #include "syscalls.h" ARCH_DEF(aarch64) const struct arch_def arch_def_aarch64 = { .token = SCMP_ARCH_AARCH64, .token_bpf = AUDIT_ARCH_AARCH64, .size = ARCH_SIZE_64, .endian = ARCH_ENDIAN_LITTLE, .syscall_resolve_name_raw = aarch64_syscall_resolve_name, .syscall_resolve_num_raw = aarch64_syscall_resolve_num, .syscall_rewrite = NULL, .rule_add = NULL, .syscall_name_kver = aarch64_syscall_name_kver, .syscall_num_kver = aarch64_syscall_num_kver, }; libseccomp-2.5.4/src/arch.h0000644000000000000000000001026414467535324014235 0ustar rootroot/** * Enhanced Seccomp Architecture/Machine Specific Code * * Copyright (c) 2012 Red Hat * Copyright (c) 2022 Microsoft Corporation. * * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _ARCH_H #define _ARCH_H #include #include #include #include #include "system.h" struct db_filter; struct db_api_arg; struct db_api_rule_list; struct arch_def { /* arch definition */ uint32_t token; uint32_t token_bpf; enum { ARCH_SIZE_UNSPEC = 0, ARCH_SIZE_32 = 32, ARCH_SIZE_64 = 64, } size; enum { ARCH_ENDIAN_UNSPEC = 0, ARCH_ENDIAN_LITTLE, ARCH_ENDIAN_BIG, } endian; /* arch specific constants */ int sys_socketcall; int sys_ipc; /* arch specific functions */ int (*syscall_resolve_name)(const struct arch_def *arch, const char *name); int (*syscall_resolve_name_raw)(const char *name); const char *(*syscall_resolve_num)(const struct arch_def *arch, int num); const char *(*syscall_resolve_num_raw)(int num); int (*syscall_rewrite)(const struct arch_def *arch, int *syscall); int (*rule_add)(struct db_filter *db, struct db_api_rule_list *rule); enum scmp_kver (*syscall_name_kver)(const char *name); enum scmp_kver (*syscall_num_kver)(int num); }; /* arch_def for the current architecture */ extern const struct arch_def *arch_def_native; /* macro to declare the arch specific structures and functions */ #define ARCH_DECL(NAME) \ extern const struct arch_def arch_def_##NAME; \ int NAME##_syscall_resolve_name(const char *name); \ const char *NAME##_syscall_resolve_num(int num); \ enum scmp_kver NAME##_syscall_name_kver(const char *name); \ enum scmp_kver NAME##_syscall_num_kver(int num); \ const struct arch_syscall_def *NAME##_syscall_iterate(unsigned int spot); /* macro to define the arch specific structures and functions */ #define ARCH_DEF(NAME) \ int NAME##_syscall_resolve_name(const char *name) \ { \ return syscall_resolve_name(name, SYSTBL_OFFSET(NAME)); \ } \ const char *NAME##_syscall_resolve_num(int num) \ { \ return syscall_resolve_num(num, SYSTBL_OFFSET(NAME)); \ } \ enum scmp_kver NAME##_syscall_name_kver(const char *name) \ { \ return syscall_resolve_name_kver(name, \ SYSTBL_OFFSET(NAME##_kver)); \ } \ enum scmp_kver NAME##_syscall_num_kver(int num) \ { \ return syscall_resolve_num_kver(num, \ SYSTBL_OFFSET(NAME), \ SYSTBL_OFFSET(NAME##_kver)); \ } \ const struct arch_syscall_def *NAME##_syscall_iterate(unsigned int spot) \ { \ return syscall_iterate(spot, SYSTBL_OFFSET(NAME)); \ } /* syscall name/num mapping */ struct arch_syscall_def { const char *name; unsigned int num; }; #define DATUM_MAX ((scmp_datum_t)-1) #define D64_LO(x) ((uint32_t)((uint64_t)(x) & 0x00000000ffffffff)) #define D64_HI(x) ((uint32_t)((uint64_t)(x) >> 32)) #define ARG_COUNT_MAX 6 int arch_valid(uint32_t arch); const struct arch_def *arch_def_lookup(uint32_t token); const struct arch_def *arch_def_lookup_name(const char *arch_name); int arch_arg_offset_lo(const struct arch_def *arch, unsigned int arg); int arch_arg_offset_hi(const struct arch_def *arch, unsigned int arg); int arch_arg_offset(const struct arch_def *arch, unsigned int arg); int arch_syscall_resolve_name(const struct arch_def *arch, const char *name); const char *arch_syscall_resolve_num(const struct arch_def *arch, int num); int arch_syscall_translate(const struct arch_def *arch, int *syscall); int arch_syscall_rewrite(const struct arch_def *arch, int *syscall); int arch_filter_rule_add(struct db_filter *db, const struct db_api_rule_list *rule); #endif libseccomp-2.5.4/src/syscalls.c0000644000000000000000000003553114467535325015155 0ustar rootroot/** * Enhanced Seccomp Syscall Table Functions * * Copyright (c) 2012, 2020 Red Hat * Author: Paul Moore * gperf support: Giuseppe Scrivano */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include "db.h" #include "arch.h" #include "syscalls.h" /** * Resolve a syscall name to a number * @param arch the arch definition * @param name the syscall name * * Resolve the given syscall name to the syscall number using the syscall table. * Returns the syscall number on success, including negative pseudo syscall * numbers; returns __NR_SCMP_ERROR on failure. * */ int abi_syscall_resolve_name_munge(const struct arch_def *arch, const char *name) { #define _ABI_SYSCALL_RES_NAME_CHK(NAME) \ if (!strcmp(name, #NAME)) return __PNR_##NAME; _ABI_SYSCALL_RES_NAME_CHK(socket) _ABI_SYSCALL_RES_NAME_CHK(bind) _ABI_SYSCALL_RES_NAME_CHK(connect) _ABI_SYSCALL_RES_NAME_CHK(listen) _ABI_SYSCALL_RES_NAME_CHK(accept) _ABI_SYSCALL_RES_NAME_CHK(getsockname) _ABI_SYSCALL_RES_NAME_CHK(getpeername) _ABI_SYSCALL_RES_NAME_CHK(socketpair) _ABI_SYSCALL_RES_NAME_CHK(send) _ABI_SYSCALL_RES_NAME_CHK(recv) _ABI_SYSCALL_RES_NAME_CHK(sendto) _ABI_SYSCALL_RES_NAME_CHK(recvfrom) _ABI_SYSCALL_RES_NAME_CHK(shutdown) _ABI_SYSCALL_RES_NAME_CHK(setsockopt) _ABI_SYSCALL_RES_NAME_CHK(getsockopt) _ABI_SYSCALL_RES_NAME_CHK(sendmsg) _ABI_SYSCALL_RES_NAME_CHK(recvmsg) _ABI_SYSCALL_RES_NAME_CHK(accept4) _ABI_SYSCALL_RES_NAME_CHK(recvmmsg) _ABI_SYSCALL_RES_NAME_CHK(sendmmsg) _ABI_SYSCALL_RES_NAME_CHK(semop) _ABI_SYSCALL_RES_NAME_CHK(semget) _ABI_SYSCALL_RES_NAME_CHK(semctl) _ABI_SYSCALL_RES_NAME_CHK(semtimedop) _ABI_SYSCALL_RES_NAME_CHK(msgsnd) _ABI_SYSCALL_RES_NAME_CHK(msgrcv) _ABI_SYSCALL_RES_NAME_CHK(msgget) _ABI_SYSCALL_RES_NAME_CHK(msgctl) _ABI_SYSCALL_RES_NAME_CHK(shmat) _ABI_SYSCALL_RES_NAME_CHK(shmdt) _ABI_SYSCALL_RES_NAME_CHK(shmget) _ABI_SYSCALL_RES_NAME_CHK(shmctl) return arch->syscall_resolve_name_raw(name); } /** * Resolve a syscall number to a name * @param arch the arch definition * @param num the syscall number * * Resolve the given syscall number to the syscall name using the syscall table. * Returns a pointer to the syscall name string on success, including pseudo * syscall names; returns NULL on failure. * */ const char *abi_syscall_resolve_num_munge(const struct arch_def *arch, int num) { #define _ABI_SYSCALL_RES_NUM_CHK(NAME) \ if (num == __PNR_##NAME) return #NAME; _ABI_SYSCALL_RES_NUM_CHK(socket) _ABI_SYSCALL_RES_NUM_CHK(bind) _ABI_SYSCALL_RES_NUM_CHK(connect) _ABI_SYSCALL_RES_NUM_CHK(listen) _ABI_SYSCALL_RES_NUM_CHK(accept) _ABI_SYSCALL_RES_NUM_CHK(getsockname) _ABI_SYSCALL_RES_NUM_CHK(getpeername) _ABI_SYSCALL_RES_NUM_CHK(socketpair) _ABI_SYSCALL_RES_NUM_CHK(send) _ABI_SYSCALL_RES_NUM_CHK(recv) _ABI_SYSCALL_RES_NUM_CHK(sendto) _ABI_SYSCALL_RES_NUM_CHK(recvfrom) _ABI_SYSCALL_RES_NUM_CHK(shutdown) _ABI_SYSCALL_RES_NUM_CHK(setsockopt) _ABI_SYSCALL_RES_NUM_CHK(getsockopt) _ABI_SYSCALL_RES_NUM_CHK(sendmsg) _ABI_SYSCALL_RES_NUM_CHK(recvmsg) _ABI_SYSCALL_RES_NUM_CHK(accept4) _ABI_SYSCALL_RES_NUM_CHK(recvmmsg) _ABI_SYSCALL_RES_NUM_CHK(sendmmsg) _ABI_SYSCALL_RES_NUM_CHK(semop) _ABI_SYSCALL_RES_NUM_CHK(semget) _ABI_SYSCALL_RES_NUM_CHK(semctl) _ABI_SYSCALL_RES_NUM_CHK(semtimedop) _ABI_SYSCALL_RES_NUM_CHK(msgsnd) _ABI_SYSCALL_RES_NUM_CHK(msgrcv) _ABI_SYSCALL_RES_NUM_CHK(msgget) _ABI_SYSCALL_RES_NUM_CHK(msgctl) _ABI_SYSCALL_RES_NUM_CHK(shmat) _ABI_SYSCALL_RES_NUM_CHK(shmdt) _ABI_SYSCALL_RES_NUM_CHK(shmget) _ABI_SYSCALL_RES_NUM_CHK(shmctl) return arch->syscall_resolve_num_raw(num); } /** * Check if a syscall is a socket syscall * @param arch the arch definition * @param sys the syscall number * * Returns true if the syscall is a socket related syscall, false otherwise. * */ static bool _abi_syscall_socket_test(const struct arch_def *arch, int sys) { const char *name; /* multiplexed pseudo-syscalls */ if (sys <= -100 && sys >= -120) return true; name = arch->syscall_resolve_num_raw(sys); if (!name) return false; #define _ABI_SYSCALL_SOCK_CHK(NAME) \ if (!strcmp(name, #NAME)) return true; _ABI_SYSCALL_SOCK_CHK(socket) _ABI_SYSCALL_SOCK_CHK(bind) _ABI_SYSCALL_SOCK_CHK(connect) _ABI_SYSCALL_SOCK_CHK(listen) _ABI_SYSCALL_SOCK_CHK(accept) _ABI_SYSCALL_SOCK_CHK(getsockname) _ABI_SYSCALL_SOCK_CHK(getpeername) _ABI_SYSCALL_SOCK_CHK(socketpair) _ABI_SYSCALL_SOCK_CHK(send) _ABI_SYSCALL_SOCK_CHK(recv) _ABI_SYSCALL_SOCK_CHK(sendto) _ABI_SYSCALL_SOCK_CHK(recvfrom) _ABI_SYSCALL_SOCK_CHK(shutdown) _ABI_SYSCALL_SOCK_CHK(setsockopt) _ABI_SYSCALL_SOCK_CHK(getsockopt) _ABI_SYSCALL_SOCK_CHK(sendmsg) _ABI_SYSCALL_SOCK_CHK(recvmsg) _ABI_SYSCALL_SOCK_CHK(accept4) _ABI_SYSCALL_SOCK_CHK(recvmmsg) _ABI_SYSCALL_SOCK_CHK(sendmmsg) return false; } /** * Check if a syscall is an ipc syscall * @param arch the arch definition * @param sys the syscall number * * Returns true if the syscall is an ipc related syscall, false otherwise. * */ static bool _abi_syscall_ipc_test(const struct arch_def *arch, int sys) { const char *name; /* multiplexed pseudo-syscalls */ if (sys <= -200 && sys >= -224) return true; name = arch->syscall_resolve_num_raw(sys); if (!name) return false; #define _ABI_SYSCALL_IPC_CHK(NAME) \ if (!strcmp(name, #NAME)) return true; _ABI_SYSCALL_IPC_CHK(semop) _ABI_SYSCALL_IPC_CHK(semget) _ABI_SYSCALL_IPC_CHK(semctl) _ABI_SYSCALL_IPC_CHK(semtimedop) _ABI_SYSCALL_IPC_CHK(msgsnd) _ABI_SYSCALL_IPC_CHK(msgrcv) _ABI_SYSCALL_IPC_CHK(msgget) _ABI_SYSCALL_IPC_CHK(msgctl) _ABI_SYSCALL_IPC_CHK(shmat) _ABI_SYSCALL_IPC_CHK(shmdt) _ABI_SYSCALL_IPC_CHK(shmget) _ABI_SYSCALL_IPC_CHK(shmctl) return false; } /** * Convert a multiplexed pseudo syscall into a direct syscall * @param arch the arch definition * @param syscall the multiplexed pseudo syscall number * * Return the related direct syscall number, __NR_SCMP_UNDEF is there is * no related syscall, or __NR_SCMP_ERROR otherwise. * */ static int _abi_syscall_demux(const struct arch_def *arch, int syscall) { int sys = __NR_SCMP_UNDEF; #define _ABI_SYSCALL_DEMUX_CHK(NAME) \ case __PNR_##NAME: \ sys = arch->syscall_resolve_name_raw(#NAME); break; switch (syscall) { _ABI_SYSCALL_DEMUX_CHK(socket) _ABI_SYSCALL_DEMUX_CHK(bind) _ABI_SYSCALL_DEMUX_CHK(connect) _ABI_SYSCALL_DEMUX_CHK(listen) _ABI_SYSCALL_DEMUX_CHK(accept) _ABI_SYSCALL_DEMUX_CHK(getsockname) _ABI_SYSCALL_DEMUX_CHK(getpeername) _ABI_SYSCALL_DEMUX_CHK(socketpair) _ABI_SYSCALL_DEMUX_CHK(send) _ABI_SYSCALL_DEMUX_CHK(recv) _ABI_SYSCALL_DEMUX_CHK(sendto) _ABI_SYSCALL_DEMUX_CHK(recvfrom) _ABI_SYSCALL_DEMUX_CHK(shutdown) _ABI_SYSCALL_DEMUX_CHK(setsockopt) _ABI_SYSCALL_DEMUX_CHK(getsockopt) _ABI_SYSCALL_DEMUX_CHK(sendmsg) _ABI_SYSCALL_DEMUX_CHK(recvmsg) _ABI_SYSCALL_DEMUX_CHK(accept4) _ABI_SYSCALL_DEMUX_CHK(recvmmsg) _ABI_SYSCALL_DEMUX_CHK(sendmmsg) _ABI_SYSCALL_DEMUX_CHK(semop) _ABI_SYSCALL_DEMUX_CHK(semget) _ABI_SYSCALL_DEMUX_CHK(semctl) _ABI_SYSCALL_DEMUX_CHK(semtimedop) _ABI_SYSCALL_DEMUX_CHK(msgsnd) _ABI_SYSCALL_DEMUX_CHK(msgrcv) _ABI_SYSCALL_DEMUX_CHK(msgget) _ABI_SYSCALL_DEMUX_CHK(msgctl) _ABI_SYSCALL_DEMUX_CHK(shmat) _ABI_SYSCALL_DEMUX_CHK(shmdt) _ABI_SYSCALL_DEMUX_CHK(shmget) _ABI_SYSCALL_DEMUX_CHK(shmctl) } /* this looks odd because the arch resolver returns _ERROR if it can't * resolve the syscall, but we want to use _UNDEF for that, so we set * 'sys' to a sentinel value of _UNDEF and if it is error here we know * the resolve failed to find a match */ if (sys == __NR_SCMP_UNDEF) sys = __NR_SCMP_ERROR; else if (sys == __NR_SCMP_ERROR) sys = __NR_SCMP_UNDEF; return sys; } /** * Convert a direct syscall into multiplexed pseudo socket syscall * @param arch the arch definition * @param syscall the direct syscall * * Return the related multiplexed pseudo syscall number, __NR_SCMP_UNDEF is * there is no related pseudo syscall, or __NR_SCMP_ERROR otherwise. * */ static int _abi_syscall_mux(const struct arch_def *arch, int syscall) { const char *sys; sys = arch->syscall_resolve_num_raw(syscall); if (!sys) return __NR_SCMP_ERROR; #define _ABI_SYSCALL_MUX_CHK(NAME) \ if (!strcmp(sys, #NAME)) return __PNR_##NAME; _ABI_SYSCALL_MUX_CHK(socket) _ABI_SYSCALL_MUX_CHK(bind) _ABI_SYSCALL_MUX_CHK(connect) _ABI_SYSCALL_MUX_CHK(listen) _ABI_SYSCALL_MUX_CHK(accept) _ABI_SYSCALL_MUX_CHK(getsockname) _ABI_SYSCALL_MUX_CHK(getpeername) _ABI_SYSCALL_MUX_CHK(socketpair) _ABI_SYSCALL_MUX_CHK(send) _ABI_SYSCALL_MUX_CHK(recv) _ABI_SYSCALL_MUX_CHK(sendto) _ABI_SYSCALL_MUX_CHK(recvfrom) _ABI_SYSCALL_MUX_CHK(shutdown) _ABI_SYSCALL_MUX_CHK(setsockopt) _ABI_SYSCALL_MUX_CHK(getsockopt) _ABI_SYSCALL_MUX_CHK(sendmsg) _ABI_SYSCALL_MUX_CHK(recvmsg) _ABI_SYSCALL_MUX_CHK(accept4) _ABI_SYSCALL_MUX_CHK(recvmmsg) _ABI_SYSCALL_MUX_CHK(sendmmsg) _ABI_SYSCALL_MUX_CHK(semop) _ABI_SYSCALL_MUX_CHK(semget) _ABI_SYSCALL_MUX_CHK(semctl) _ABI_SYSCALL_MUX_CHK(semtimedop) _ABI_SYSCALL_MUX_CHK(msgsnd) _ABI_SYSCALL_MUX_CHK(msgrcv) _ABI_SYSCALL_MUX_CHK(msgget) _ABI_SYSCALL_MUX_CHK(msgctl) _ABI_SYSCALL_MUX_CHK(shmat) _ABI_SYSCALL_MUX_CHK(shmdt) _ABI_SYSCALL_MUX_CHK(shmget) _ABI_SYSCALL_MUX_CHK(shmctl) return __NR_SCMP_ERROR; } /** * Rewrite a syscall value to match the architecture * @param arch the arch definition * @param syscall the syscall number * * Syscalls can vary across different architectures so this function rewrites * the syscall into the correct value for the specified architecture. Returns * zero on success, negative values on failure. * */ int abi_syscall_rewrite(const struct arch_def *arch, int *syscall) { int sys = *syscall; if (sys <= -100 && sys >= -120) *syscall = arch->sys_socketcall; else if (sys <= -200 && sys >= -224) *syscall = arch->sys_ipc; else if (sys < 0) return -EDOM; return 0; } /** * add a new rule to the abi seccomp filter * @param db the seccomp filter db * @param rule the filter rule * * This function adds a new syscall filter to the seccomp filter db, making any * necessary adjustments for the abi ABI. Returns zero on success, negative * values on failure. * * It is important to note that in the case of failure the db may be corrupted, * the caller must use the transaction mechanism if the db integrity is * important. * */ int abi_rule_add(struct db_filter *db, struct db_api_rule_list *rule) { int rc = 0; unsigned int iter; int sys = rule->syscall; int sys_a, sys_b; struct db_api_rule_list *rule_a, *rule_b, *rule_dup = NULL; if (_abi_syscall_socket_test(db->arch, sys)) { /* socket syscalls */ /* strict check for the multiplexed socket syscalls */ for (iter = 0; iter < ARG_COUNT_MAX; iter++) { if ((rule->args[iter].valid != 0) && (rule->strict)) { rc = -EINVAL; goto add_return; } } /* determine both the muxed and direct syscall numbers */ if (sys > 0) { sys_a = _abi_syscall_mux(db->arch, sys); if (sys_a == __NR_SCMP_ERROR) { rc = __NR_SCMP_ERROR; goto add_return; } sys_b = sys; } else { sys_a = sys; sys_b = _abi_syscall_demux(db->arch, sys); if (sys_b == __NR_SCMP_ERROR) { rc = __NR_SCMP_ERROR; goto add_return; } } /* use rule_a for the multiplexed syscall and use rule_b for * the direct wired syscall */ if (sys_a == __NR_SCMP_UNDEF) { rule_a = NULL; rule_b = rule; } else if (sys_b == __NR_SCMP_UNDEF) { rule_a = rule; rule_b = NULL; } else { /* need two rules, dup the first and link together */ rule_a = rule; rule_dup = db_rule_dup(rule_a); rule_b = rule_dup; if (rule_b == NULL) goto add_return; rule_b->prev = rule_a; rule_b->next = NULL; rule_a->next = rule_b; } /* multiplexed socket syscalls */ if (rule_a != NULL) { rule_a->syscall = db->arch->sys_socketcall; rule_a->args[0].arg = 0; rule_a->args[0].op = SCMP_CMP_EQ; rule_a->args[0].mask = DATUM_MAX; rule_a->args[0].datum = (-sys_a) % 100; rule_a->args[0].valid = 1; } /* direct wired socket syscalls */ if (rule_b != NULL) rule_b->syscall = sys_b; /* we should be protected by a transaction checkpoint */ if (rule_a != NULL) { rc = db_rule_add(db, rule_a); if (rc < 0) goto add_return; } if (rule_b != NULL) { rc = db_rule_add(db, rule_b); if (rc < 0) goto add_return; } } else if (_abi_syscall_ipc_test(db->arch, sys)) { /* ipc syscalls */ /* strict check for the multiplexed socket syscalls */ for (iter = 0; iter < ARG_COUNT_MAX; iter++) { if ((rule->args[iter].valid != 0) && (rule->strict)) { rc = -EINVAL; goto add_return; } } /* determine both the muxed and direct syscall numbers */ if (sys > 0) { sys_a = _abi_syscall_mux(db->arch, sys); if (sys_a == __NR_SCMP_ERROR) { rc = __NR_SCMP_ERROR; goto add_return; } sys_b = sys; } else { sys_a = sys; sys_b = _abi_syscall_demux(db->arch, sys); if (sys_b == __NR_SCMP_ERROR) { rc = __NR_SCMP_ERROR; goto add_return; } } /* use rule_a for the multiplexed syscall and use rule_b for * the direct wired syscall */ if (sys_a == __NR_SCMP_UNDEF) { rule_a = NULL; rule_b = rule; } else if (sys_b == __NR_SCMP_UNDEF) { rule_a = rule; rule_b = NULL; } else { /* need two rules, dup the first and link together */ rule_a = rule; rule_dup = db_rule_dup(rule_a); rule_b = rule_dup; if (rule_b == NULL) goto add_return; rule_b->prev = rule_a; rule_b->next = NULL; rule_a->next = rule_b; } /* multiplexed socket syscalls */ if (rule_a != NULL) { rule_a->syscall = db->arch->sys_ipc; rule_a->args[0].arg = 0; rule_a->args[0].op = SCMP_CMP_EQ; rule_a->args[0].mask = DATUM_MAX; rule_a->args[0].datum = (-sys_a) % 200; rule_a->args[0].valid = 1; } /* direct wired socket syscalls */ if (rule_b != NULL) rule_b->syscall = sys_b; /* we should be protected by a transaction checkpoint */ if (rule_a != NULL) { rc = db_rule_add(db, rule_a); if (rc < 0) goto add_return; } if (rule_b != NULL) { rc = db_rule_add(db, rule_b); if (rc < 0) goto add_return; } } else if (sys >= 0) { /* normal syscall processing */ rc = db_rule_add(db, rule); if (rc < 0) goto add_return; } else if (rule->strict) { rc = -EDOM; goto add_return; } add_return: if (rule_dup != NULL) free(rule_dup); return rc; } libseccomp-2.5.4/src/api.c0000644000000000000000000005473314467535324014075 0ustar rootroot/** * Seccomp Library API * * Copyright (c) 2012,2013 Red Hat * Copyright (c) 2022 Microsoft Corporation * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include #include #include #include #include #include "arch.h" #include "db.h" #include "gen_pfc.h" #include "gen_bpf.h" #include "helper.h" #include "system.h" #define API __attribute__((visibility("default"))) const struct scmp_version library_version = { .major = SCMP_VER_MAJOR, .minor = SCMP_VER_MINOR, .micro = SCMP_VER_MICRO, }; unsigned int seccomp_api_level = 0; /** * Filter the error codes we send back to callers * @param err the error code * * We consider error codes part of our API so we want to make sure we don't * accidentally send an undocumented error code to our callers. This function * helps with that. * */ static int _rc_filter(int err) { /* pass through success values */ if (err >= 0) return err; /* filter the error codes */ switch (err) { case -EACCES: /* NOTE: operation is not permitted by libseccomp */ case -ECANCELED: /* NOTE: kernel level error that is beyond the control of * libseccomp */ case -EDOM: /* NOTE: failure due to arch/ABI */ case -EEXIST: /* NOTE: operation failed due to existing rule or filter */ case -EINVAL: /* NOTE: invalid input to the libseccomp API */ case -ENOENT: /* NOTE: no matching entry found */ case -ENOMEM: /* NOTE: unable to allocate enough memory to perform the * requested operation */ case -EOPNOTSUPP: /* NOTE: operation is not supported */ case -ERANGE: /* NOTE: provided buffer is too small */ case -ESRCH: /* NOTE: operation failed due to multi-threading */ return err; default: /* NOTE: this is the default "internal libseccomp error" * error code, it is our catch-all */ return -EFAULT; } } /** * Filter the system error codes we send back to callers * @param col the filter collection * @param err the error code * * This is similar to _rc_filter(), but it first checks the filter attribute * to determine if we should be filtering the return codes. * */ static int _rc_filter_sys(struct db_filter_col *col, int err) { /* pass through success values */ if (err >= 0) return err; /* pass the return code if the SCMP_FLTATR_API_SYSRAWRC is true */ if (db_col_attr_read(col, SCMP_FLTATR_API_SYSRAWRC)) return err; return -ECANCELED; } /** * Validate a filter context * @param ctx the filter context * * Attempt to validate the provided filter context. Returns zero if the * context is valid, negative values on failure. * */ static int _ctx_valid(const scmp_filter_ctx *ctx) { return db_col_valid((struct db_filter_col *)ctx); } /** * Validate a syscall number * @param syscall the syscall number * * Attempt to perform basic syscall number validation. Returns zero of the * syscall appears valid, negative values on failure. * */ static int _syscall_valid(const struct db_filter_col *col, int syscall) { /* syscall -1 is used by tracers to skip the syscall */ if (col->attr.api_tskip && syscall == -1) return 0; if (syscall <= -1 && syscall >= -99) return -EINVAL; return 0; } /** * Update the API level * * This function performs a series of tests to determine what functionality is * supported given the current running environment (kernel, etc.). It is * important to note that this function only does meaningful checks the first * time it is run, the resulting API level is cached after this first run and * used for all subsequent calls. The API level value is returned. * */ static unsigned int _seccomp_api_update(void) { unsigned int level = 1; /* if seccomp_api_level > 0 then it's already been set, we're done */ if (seccomp_api_level >= 1) return seccomp_api_level; /* NOTE: level 1 is the base level, start checking at 2 */ if (sys_chk_seccomp_syscall() && sys_chk_seccomp_flag(SECCOMP_FILTER_FLAG_TSYNC) == 1) level = 2; if (level == 2 && sys_chk_seccomp_flag(SECCOMP_FILTER_FLAG_LOG) == 1 && sys_chk_seccomp_action(SCMP_ACT_LOG) == 1 && sys_chk_seccomp_action(SCMP_ACT_KILL_PROCESS) == 1) level = 3; if (level == 3 && sys_chk_seccomp_flag(SECCOMP_FILTER_FLAG_SPEC_ALLOW) == 1) level = 4; if (level == 4 && sys_chk_seccomp_flag(SECCOMP_FILTER_FLAG_NEW_LISTENER) == 1 && sys_chk_seccomp_action(SCMP_ACT_NOTIFY) == 1) level = 5; if (level == 5 && sys_chk_seccomp_flag(SECCOMP_FILTER_FLAG_TSYNC_ESRCH) == 1) level = 6; if (level == 6 && sys_chk_seccomp_flag(SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV) == 1) level = 7; /* update the stored api level and return */ seccomp_api_level = level; return seccomp_api_level; } /* NOTE - function header comment in include/seccomp.h */ API const struct scmp_version *seccomp_version(void) { return &library_version; } /* NOTE - function header comment in include/seccomp.h */ API unsigned int seccomp_api_get(void) { /* update the api level, if needed */ return _seccomp_api_update(); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_api_set(unsigned int level) { switch (level) { case 1: sys_set_seccomp_syscall(false); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_TSYNC, false); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_LOG, false); sys_set_seccomp_action(SCMP_ACT_LOG, false); sys_set_seccomp_action(SCMP_ACT_KILL_PROCESS, false); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_SPEC_ALLOW, false); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_NEW_LISTENER, false); sys_set_seccomp_action(SCMP_ACT_NOTIFY, false); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_TSYNC_ESRCH, false); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV, false); break; case 2: sys_set_seccomp_syscall(true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_TSYNC, true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_LOG, false); sys_set_seccomp_action(SCMP_ACT_LOG, false); sys_set_seccomp_action(SCMP_ACT_KILL_PROCESS, false); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_SPEC_ALLOW, false); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_NEW_LISTENER, false); sys_set_seccomp_action(SCMP_ACT_NOTIFY, false); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_TSYNC_ESRCH, false); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV, false); break; case 3: sys_set_seccomp_syscall(true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_TSYNC, true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_LOG, true); sys_set_seccomp_action(SCMP_ACT_LOG, true); sys_set_seccomp_action(SCMP_ACT_KILL_PROCESS, true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_SPEC_ALLOW, false); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_NEW_LISTENER, false); sys_set_seccomp_action(SCMP_ACT_NOTIFY, false); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_TSYNC_ESRCH, false); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV, false); break; case 4: sys_set_seccomp_syscall(true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_TSYNC, true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_LOG, true); sys_set_seccomp_action(SCMP_ACT_LOG, true); sys_set_seccomp_action(SCMP_ACT_KILL_PROCESS, true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_SPEC_ALLOW, true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_NEW_LISTENER, false); sys_set_seccomp_action(SCMP_ACT_NOTIFY, false); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_TSYNC_ESRCH, false); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV, false); break; case 5: sys_set_seccomp_syscall(true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_TSYNC, true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_LOG, true); sys_set_seccomp_action(SCMP_ACT_LOG, true); sys_set_seccomp_action(SCMP_ACT_KILL_PROCESS, true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_SPEC_ALLOW, true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_NEW_LISTENER, true); sys_set_seccomp_action(SCMP_ACT_NOTIFY, true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_TSYNC_ESRCH, false); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV, false); break; case 6: sys_set_seccomp_syscall(true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_TSYNC, true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_LOG, true); sys_set_seccomp_action(SCMP_ACT_LOG, true); sys_set_seccomp_action(SCMP_ACT_KILL_PROCESS, true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_SPEC_ALLOW, true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_NEW_LISTENER, true); sys_set_seccomp_action(SCMP_ACT_NOTIFY, true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_TSYNC_ESRCH, true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV, false); break; case 7: sys_set_seccomp_syscall(true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_TSYNC, true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_LOG, true); sys_set_seccomp_action(SCMP_ACT_LOG, true); sys_set_seccomp_action(SCMP_ACT_KILL_PROCESS, true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_SPEC_ALLOW, true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_NEW_LISTENER, true); sys_set_seccomp_action(SCMP_ACT_NOTIFY, true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_TSYNC_ESRCH, true); sys_set_seccomp_flag(SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV, true); break; default: return _rc_filter(-EINVAL); } seccomp_api_level = level; return _rc_filter(0); } /* NOTE - function header comment in include/seccomp.h */ API scmp_filter_ctx seccomp_init(uint32_t def_action) { /* force a runtime api level detection */ _seccomp_api_update(); if (db_col_action_valid(NULL, def_action) < 0) return NULL; return db_col_init(def_action); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_reset(scmp_filter_ctx ctx, uint32_t def_action) { struct db_filter_col *col = (struct db_filter_col *)ctx; /* a NULL filter context indicates we are resetting the global state */ if (ctx == NULL) { /* reset the global state and redetermine the api level */ sys_reset_state(); _seccomp_api_update(); return _rc_filter(0); } /* ensure the default action is valid */ if (db_col_action_valid(NULL, def_action) < 0) return _rc_filter(-EINVAL); /* reset the filter */ return _rc_filter(db_col_reset(col, def_action)); } /* NOTE - function header comment in include/seccomp.h */ API void seccomp_release(scmp_filter_ctx ctx) { db_col_release((struct db_filter_col *)ctx); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_merge(scmp_filter_ctx ctx_dst, scmp_filter_ctx ctx_src) { struct db_filter_col *col_dst = (struct db_filter_col *)ctx_dst; struct db_filter_col *col_src = (struct db_filter_col *)ctx_src; if (db_col_valid(col_dst) || db_col_valid(col_src)) return _rc_filter(-EINVAL); /* NOTE: only the default action, NNP, and TSYNC settings must match */ if ((col_dst->attr.act_default != col_src->attr.act_default) || (col_dst->attr.nnp_enable != col_src->attr.nnp_enable) || (col_dst->attr.tsync_enable != col_src->attr.tsync_enable)) return _rc_filter(-EINVAL); return _rc_filter(db_col_merge(col_dst, col_src)); } /* NOTE - function header comment in include/seccomp.h */ API uint32_t seccomp_arch_resolve_name(const char *arch_name) { const struct arch_def *arch; if (arch_name == NULL) return 0; arch = arch_def_lookup_name(arch_name); if (arch == NULL) return 0; return arch->token; } /* NOTE - function header comment in include/seccomp.h */ API uint32_t seccomp_arch_native(void) { return arch_def_native->token; } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_arch_exist(const scmp_filter_ctx ctx, uint32_t arch_token) { struct db_filter_col *col = (struct db_filter_col *)ctx; if (arch_token == 0) arch_token = arch_def_native->token; if (arch_valid(arch_token)) return _rc_filter(-EINVAL); return _rc_filter((db_col_arch_exist(col, arch_token) ? 0 : -EEXIST)); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_arch_add(scmp_filter_ctx ctx, uint32_t arch_token) { const struct arch_def *arch; struct db_filter_col *col = (struct db_filter_col *)ctx; if (arch_token == 0) arch_token = arch_def_native->token; arch = arch_def_lookup(arch_token); if (arch == NULL) return _rc_filter(-EINVAL); if (db_col_arch_exist(col, arch_token)) return _rc_filter(-EEXIST); return _rc_filter(db_col_db_new(col, arch)); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_arch_remove(scmp_filter_ctx ctx, uint32_t arch_token) { struct db_filter_col *col = (struct db_filter_col *)ctx; if (arch_token == 0) arch_token = arch_def_native->token; if (arch_valid(arch_token)) return _rc_filter(-EINVAL); if (db_col_arch_exist(col, arch_token) != -EEXIST) return _rc_filter(-EEXIST); return _rc_filter(db_col_db_remove(col, arch_token)); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_load(const scmp_filter_ctx ctx) { struct db_filter_col *col; bool rawrc; if (_ctx_valid(ctx)) return _rc_filter(-EINVAL); col = (struct db_filter_col *)ctx; rawrc = db_col_attr_read(col, SCMP_FLTATR_API_SYSRAWRC); return _rc_filter(sys_filter_load(col, rawrc)); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_attr_get(const scmp_filter_ctx ctx, enum scmp_filter_attr attr, uint32_t *value) { if (_ctx_valid(ctx)) return _rc_filter(-EINVAL); return _rc_filter(db_col_attr_get((const struct db_filter_col *)ctx, attr, value)); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_attr_set(scmp_filter_ctx ctx, enum scmp_filter_attr attr, uint32_t value) { if (_ctx_valid(ctx)) return _rc_filter(-EINVAL); return _rc_filter(db_col_attr_set((struct db_filter_col *)ctx, attr, value)); } /* NOTE - function header comment in include/seccomp.h */ API char *seccomp_syscall_resolve_num_arch(uint32_t arch_token, int num) { const struct arch_def *arch; const char *name; if (arch_token == 0) arch_token = arch_def_native->token; if (arch_valid(arch_token)) return NULL; arch = arch_def_lookup(arch_token); if (arch == NULL) return NULL; name = arch_syscall_resolve_num(arch, num); if (name == NULL) return NULL; return strdup(name); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_syscall_resolve_name_arch(uint32_t arch_token, const char *name) { const struct arch_def *arch; if (name == NULL) return __NR_SCMP_ERROR; if (arch_token == 0) arch_token = arch_def_native->token; if (arch_valid(arch_token)) return __NR_SCMP_ERROR; arch = arch_def_lookup(arch_token); if (arch == NULL) return __NR_SCMP_ERROR; return arch_syscall_resolve_name(arch, name); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_syscall_resolve_name_rewrite(uint32_t arch_token, const char *name) { int rc; int syscall; const struct arch_def *arch; if (name == NULL) return __NR_SCMP_ERROR; if (arch_token == 0) arch_token = arch_def_native->token; if (arch_valid(arch_token)) return __NR_SCMP_ERROR; arch = arch_def_lookup(arch_token); if (arch == NULL) return __NR_SCMP_ERROR; syscall = arch_syscall_resolve_name(arch, name); if (syscall == __NR_SCMP_ERROR) return __NR_SCMP_ERROR; rc = arch_syscall_rewrite(arch, &syscall); if (rc == -EDOM) /* if we can't rewrite the syscall, just pass it through */ return syscall; else if (rc < 0) return __NR_SCMP_ERROR; return syscall; } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_syscall_resolve_name(const char *name) { return seccomp_syscall_resolve_name_arch(SCMP_ARCH_NATIVE, name); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_syscall_priority(scmp_filter_ctx ctx, int syscall, uint8_t priority) { struct db_filter_col *col = (struct db_filter_col *)ctx; if (db_col_valid(col) || _syscall_valid(col, syscall)) return _rc_filter(-EINVAL); return _rc_filter(db_col_syscall_priority(col, syscall, priority)); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_rule_add_array(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt, const struct scmp_arg_cmp *arg_array) { int rc; struct db_filter_col *col = (struct db_filter_col *)ctx; if (arg_cnt > ARG_COUNT_MAX) return _rc_filter(-EINVAL); if (arg_cnt > 0 && arg_array == NULL) return _rc_filter(-EINVAL); if (db_col_valid(col) || _syscall_valid(col, syscall)) return _rc_filter(-EINVAL); rc = db_col_action_valid(col, action); if (rc < 0) return _rc_filter(rc); if (action == col->attr.act_default) return _rc_filter(-EACCES); return _rc_filter(db_col_rule_add(col, 0, action, syscall, arg_cnt, arg_array)); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_rule_add(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt, ...) { int rc; int iter; struct scmp_arg_cmp arg_array[ARG_COUNT_MAX]; va_list arg_list; /* arg_cnt is unsigned, so no need to check the lower bound */ if (arg_cnt > ARG_COUNT_MAX) return _rc_filter(-EINVAL); va_start(arg_list, arg_cnt); for (iter = 0; iter < arg_cnt; ++iter) arg_array[iter] = va_arg(arg_list, struct scmp_arg_cmp); rc = seccomp_rule_add_array(ctx, action, syscall, arg_cnt, arg_array); va_end(arg_list); return _rc_filter(rc); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_rule_add_exact_array(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt, const struct scmp_arg_cmp *arg_array) { int rc; struct db_filter_col *col = (struct db_filter_col *)ctx; if (arg_cnt > ARG_COUNT_MAX) return _rc_filter(-EINVAL); if (arg_cnt > 0 && arg_array == NULL) return _rc_filter(-EINVAL); if (db_col_valid(col) || _syscall_valid(col, syscall)) return _rc_filter(-EINVAL); rc = db_col_action_valid(col, action); if (rc < 0) return _rc_filter(rc); if (action == col->attr.act_default) return _rc_filter(-EACCES); if (col->filter_cnt > 1) return _rc_filter(-EOPNOTSUPP); return _rc_filter(db_col_rule_add(col, 1, action, syscall, arg_cnt, arg_array)); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_rule_add_exact(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt, ...) { int rc; int iter; struct scmp_arg_cmp arg_array[ARG_COUNT_MAX]; va_list arg_list; /* arg_cnt is unsigned, so no need to check the lower bound */ if (arg_cnt > ARG_COUNT_MAX) return _rc_filter(-EINVAL); va_start(arg_list, arg_cnt); for (iter = 0; iter < arg_cnt; ++iter) arg_array[iter] = va_arg(arg_list, struct scmp_arg_cmp); rc = seccomp_rule_add_exact_array(ctx, action, syscall, arg_cnt, arg_array); va_end(arg_list); return _rc_filter(rc); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_notify_alloc(struct seccomp_notif **req, struct seccomp_notif_resp **resp) { /* force a runtime api level detection */ _seccomp_api_update(); return _rc_filter(sys_notify_alloc(req, resp)); } /* NOTE - function header comment in include/seccomp.h */ API void seccomp_notify_free(struct seccomp_notif *req, struct seccomp_notif_resp *resp) { if (req) free(req); if (resp) free(resp); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_notify_receive(int fd, struct seccomp_notif *req) { return _rc_filter(sys_notify_receive(fd, req)); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_notify_respond(int fd, struct seccomp_notif_resp *resp) { return _rc_filter(sys_notify_respond(fd, resp)); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_notify_id_valid(int fd, uint64_t id) { /* force a runtime api level detection */ _seccomp_api_update(); return _rc_filter(sys_notify_id_valid(fd, id)); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_notify_fd(const scmp_filter_ctx ctx) { /* NOTE: for historical reasons, and possibly future use, we require a * valid filter context even though we don't actual use it here; the * api update is also not strictly necessary, but keep it for now */ /* force a runtime api level detection */ _seccomp_api_update(); if (_ctx_valid(ctx)) return _rc_filter(-EINVAL); return _rc_filter(sys_notify_fd()); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_export_pfc(const scmp_filter_ctx ctx, int fd) { int rc; struct db_filter_col *col; if (_ctx_valid(ctx)) return _rc_filter(-EINVAL); col = (struct db_filter_col *)ctx; rc = gen_pfc_generate(col, fd); return _rc_filter_sys(col, rc); } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_export_bpf(const scmp_filter_ctx ctx, int fd) { int rc; struct db_filter_col *col; struct bpf_program *program; if (_ctx_valid(ctx)) return _rc_filter(-EINVAL); col = (struct db_filter_col *)ctx; rc = db_col_precompute(col); if (rc < 0) return _rc_filter(rc); program = col->prgm_bpf; rc = write(fd, program->blks, BPF_PGM_SIZE(program)); if (rc < 0) return _rc_filter_sys(col, -errno); return 0; } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_export_bpf_mem(const scmp_filter_ctx ctx, void *buf, size_t *len) { int rc; struct db_filter_col *col; struct bpf_program *program; if (_ctx_valid(ctx) || !len) return _rc_filter(-EINVAL); col = (struct db_filter_col *)ctx; rc = db_col_precompute(col); if (rc < 0) return _rc_filter(rc); program = col->prgm_bpf; if (buf) { /* If we have a big enough buffer, write the program. */ if (BPF_PGM_SIZE(program) > *len) rc = _rc_filter(-ERANGE); else memcpy(buf, program->blks, *len); } *len = BPF_PGM_SIZE(program); return rc; } /* NOTE - function header comment in include/seccomp.h */ API int seccomp_precompute(const scmp_filter_ctx ctx) { struct db_filter_col *col; if (_ctx_valid(ctx)) return _rc_filter(-EINVAL); col = (struct db_filter_col *)ctx; return _rc_filter(db_col_precompute(col)); } libseccomp-2.5.4/src/arch-syscall-dump.c0000644000000000000000000000761714467535324016653 0ustar rootroot/** * Enhanced Seccomp Architecture Sycall Checker * * Copyright (c) 2014 Red Hat * Author: Paul Moore * */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include #include #include "arch.h" #include "arch-x86.h" #include "arch-x86_64.h" #include "arch-x32.h" #include "arch-arm.h" #include "arch-loongarch64.h" #include "arch-m68k.h" #include "arch-mips.h" #include "arch-mips64.h" #include "arch-mips64n32.h" #include "arch-aarch64.h" #include "arch-parisc.h" #include "arch-parisc64.h" #include "arch-ppc.h" #include "arch-ppc64.h" #include "arch-riscv64.h" #include "arch-s390.h" #include "arch-s390x.h" #include "arch-sh.h" /** * Print the usage information to stderr and exit * @param program the name of the current program being invoked * * Print the usage information and exit with EINVAL. * */ static void exit_usage(const char *program) { fprintf(stderr, "usage: %s [-h] [-a ] [-o ]\n", program); exit(EINVAL); } /** * main */ int main(int argc, char *argv[]) { int opt; const struct arch_def *arch = arch_def_native; int offset = 0; int iter; const struct arch_syscall_def *sys; /* parse the command line */ while ((opt = getopt(argc, argv, "a:o:h")) > 0) { switch (opt) { case 'a': arch = arch_def_lookup_name(optarg); if (arch == 0) exit_usage(argv[0]); break; case 'o': offset = atoi(optarg); break; case 'h': default: /* usage information */ exit_usage(argv[0]); } } iter = 0; do { switch (arch->token) { case SCMP_ARCH_X86: sys = x86_syscall_iterate(iter); break; case SCMP_ARCH_X86_64: sys = x86_64_syscall_iterate(iter); break; case SCMP_ARCH_X32: sys = x32_syscall_iterate(iter); break; case SCMP_ARCH_ARM: sys = arm_syscall_iterate(iter); break; case SCMP_ARCH_AARCH64: sys = aarch64_syscall_iterate(iter); break; case SCMP_ARCH_LOONGARCH64: sys = loongarch64_syscall_iterate(iter); case SCMP_ARCH_M68K: sys = m68k_syscall_iterate(iter); break; case SCMP_ARCH_MIPS: case SCMP_ARCH_MIPSEL: sys = mips_syscall_iterate(iter); break; case SCMP_ARCH_MIPS64: case SCMP_ARCH_MIPSEL64: sys = mips64_syscall_iterate(iter); break; case SCMP_ARCH_MIPS64N32: case SCMP_ARCH_MIPSEL64N32: sys = mips64n32_syscall_iterate(iter); break; case SCMP_ARCH_PARISC: sys = parisc_syscall_iterate(iter); break; case SCMP_ARCH_PARISC64: sys = parisc64_syscall_iterate(iter); break; case SCMP_ARCH_PPC: sys = ppc_syscall_iterate(iter); break; case SCMP_ARCH_PPC64: case SCMP_ARCH_PPC64LE: sys = ppc64_syscall_iterate(iter); break; case SCMP_ARCH_RISCV64: sys = riscv64_syscall_iterate(iter); break; case SCMP_ARCH_S390: sys = s390_syscall_iterate(iter); break; case SCMP_ARCH_S390X: sys = s390x_syscall_iterate(iter); break; case SCMP_ARCH_SH: case SCMP_ARCH_SHEB: sys = sh_syscall_iterate(iter); break; default: /* invalid arch */ exit_usage(argv[0]); } if (sys->name != NULL) { int sys_num = sys->num; if (offset > 0 && sys_num > 0) sys_num -= offset; /* output the results */ printf("%s\t%d\n", sys->name, sys_num); /* next */ iter++; } } while (sys->name != NULL); return 0; } libseccomp-2.5.4/src/arch-s390x.h0000644000000000000000000000025314467535324015116 0ustar rootroot/* * Copyright 2015 IBM * Author: Jan Willeke */ #ifndef _ARCH_S390X_H #define _ARCH_S390X_H #include "arch.h" ARCH_DECL(s390x) #endif libseccomp-2.5.4/src/arch-sh.c0000644000000000000000000000377614467535324014652 0ustar rootroot/* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include "db.h" #include "syscalls.h" #include "arch.h" #include "arch-sh.h" /* sh syscall numbers */ #define __sh_NR_socketcall 102 #define __sh_NR_ipc 117 ARCH_DEF(sh) const struct arch_def arch_def_sheb = { .token = SCMP_ARCH_SHEB, .token_bpf = AUDIT_ARCH_SH, .size = ARCH_SIZE_32, .endian = ARCH_ENDIAN_BIG, .sys_socketcall = __sh_NR_socketcall, .sys_ipc = __sh_NR_ipc, .syscall_resolve_name = abi_syscall_resolve_name_munge, .syscall_resolve_name_raw = sh_syscall_resolve_name, .syscall_resolve_num = abi_syscall_resolve_num_munge, .syscall_resolve_num_raw = sh_syscall_resolve_num, .syscall_rewrite = abi_syscall_rewrite, .rule_add = abi_rule_add, .syscall_name_kver = sh_syscall_name_kver, .syscall_num_kver = sh_syscall_num_kver, }; const struct arch_def arch_def_sh = { .token = SCMP_ARCH_SH, .token_bpf = AUDIT_ARCH_SHEL, .size = ARCH_SIZE_32, .endian = ARCH_ENDIAN_LITTLE, .sys_socketcall = __sh_NR_socketcall, .sys_ipc = __sh_NR_ipc, .syscall_resolve_name = abi_syscall_resolve_name_munge, .syscall_resolve_name_raw = sh_syscall_resolve_name, .syscall_resolve_num = abi_syscall_resolve_num_munge, .syscall_resolve_num_raw = sh_syscall_resolve_num, .syscall_rewrite = abi_syscall_rewrite, .rule_add = abi_rule_add, .syscall_name_kver = sh_syscall_name_kver, .syscall_num_kver = sh_syscall_num_kver, }; libseccomp-2.5.4/src/python/0000755000000000000000000000000014467535325014466 5ustar rootrootlibseccomp-2.5.4/src/python/setup.py0000755000000000000000000000263514467535325016211 0ustar rootroot#!/usr/bin/env python # # Enhanced Seccomp Library Python Module Build Script # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # import os from setuptools import setup from setuptools.extension import Extension from Cython.Build import cythonize setup( name = "seccomp", version = os.environ["VERSION_RELEASE"], description = "Python binding for libseccomp", long_description = "Python API for the Linux Kernel's syscall filtering capability, seccomp.", url = "https://github.com/seccomp/libseccomp", maintainer = "Paul Moore", maintainer_email = "paul@paul-moore.com", license = "LGPLv2.1", platforms = "Linux", ext_modules = cythonize([ Extension("seccomp", ["seccomp.pyx"], # unable to handle libtool libraries directly extra_objects=["../.libs/libseccomp.a"]), ]) ) libseccomp-2.5.4/src/python/seccomp.pyx0000644000000000000000000011551014467535325016664 0ustar rootroot# # Seccomp Library Python Bindings # # Copyright (c) 2012,2013,2017 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # # cython: language_level = 3str """ Python bindings for the libseccomp library The libseccomp library provides and easy to use, platform independent, interface to the Linux Kernel's syscall filtering mechanism: seccomp. The libseccomp API is designed to abstract away the underlying BPF based syscall filter language and present a more conventional function-call based filtering interface that should be familiar to, and easily adopted by application developers. Filter action values: KILL_PROCESS - kill the process KILL - kill the thread LOG - allow the syscall to be executed after the action has been logged ALLOW - allow the syscall to execute TRAP - a SIGSYS signal will be thrown NOTIFY - a notification event will be sent via the notification API ERRNO(x) - syscall will return (x) TRACE(x) - if the process is being traced, (x) will be returned to the tracing process via PTRACE_EVENT_SECCOMP and the PTRACE_GETEVENTMSG option Argument comparison values (see the Arg class): NE - arg != datum_a LT - arg < datum_a LE - arg <= datum_a EQ - arg == datum_a GT - arg > datum_a GE - arg >= datum_a MASKED_EQ - (arg & datum_a) == datum_b Example: import sys from seccomp import * # create a filter object with a default KILL action f = SyscallFilter(defaction=KILL) # add some basic syscalls which python typically wants f.add_rule(ALLOW, "rt_sigaction") f.add_rule(ALLOW, "rt_sigreturn") f.add_rule(ALLOW, "exit_group") f.add_rule(ALLOW, "brk") # add syscall filter rules to allow certain syscalls f.add_rule(ALLOW, "open") f.add_rule(ALLOW, "close") f.add_rule(ALLOW, "read", Arg(0, EQ, sys.stdin.fileno())) f.add_rule(ALLOW, "write", Arg(0, EQ, sys.stdout.fileno())) f.add_rule(ALLOW, "write", Arg(0, EQ, sys.stderr.fileno())) # load the filter into the kernel f.load() """ __author__ = 'Paul Moore ' __date__ = "3 February 2017" from cpython cimport array from cpython.version cimport PY_MAJOR_VERSION from libc.stdint cimport int8_t, int16_t, int32_t, int64_t from libc.stdint cimport uint8_t, uint16_t, uint32_t, uint64_t from libc.stdlib cimport free import array import errno cimport libseccomp def c_str(string): """ Convert a Python string to a C string. Arguments: string - the Python string Description: Convert the Python string into a form usable by C taking into consideration the Python major version, e.g. Python 2.x or Python 3.x. See http://docs.cython.org/en/latest/src/tutorial/strings.html for more information. """ if PY_MAJOR_VERSION < 3: return string else: return bytes(string, "ascii") KILL_PROCESS = libseccomp.SCMP_ACT_KILL_PROCESS KILL = libseccomp.SCMP_ACT_KILL TRAP = libseccomp.SCMP_ACT_TRAP LOG = libseccomp.SCMP_ACT_LOG ALLOW = libseccomp.SCMP_ACT_ALLOW NOTIFY = libseccomp.SCMP_ACT_NOTIFY def ERRNO(int errno): """The action ERRNO(x) means that the syscall will return (x). To conform to Linux syscall calling conventions, the syscall return value should almost always be a negative number. """ return libseccomp.SCMP_ACT_ERRNO(errno) def TRACE(int value): """The action TRACE(x) means that, if the process is being traced, (x) will be returned to the tracing process via PTRACE_EVENT_SECCOMP and the PTRACE_GETEVENTMSG option. """ return libseccomp.SCMP_ACT_TRACE(value) NE = libseccomp.SCMP_CMP_NE LT = libseccomp.SCMP_CMP_LT LE = libseccomp.SCMP_CMP_LE EQ = libseccomp.SCMP_CMP_EQ GE = libseccomp.SCMP_CMP_GE GT = libseccomp.SCMP_CMP_GT MASKED_EQ = libseccomp.SCMP_CMP_MASKED_EQ def system_arch(): """ Return the system architecture value. Description: Returns the native system architecture value. """ return libseccomp.seccomp_arch_native() def resolve_syscall(arch, syscall): """ Resolve the syscall. Arguments: arch - the architecture value, e.g. Arch.* syscall - the syscall name or number Description: Resolve an architecture's syscall name to the correct number or the syscall number to the correct name. """ cdef char *ret_str if isinstance(syscall, basestring): return libseccomp.seccomp_syscall_resolve_name_rewrite(arch, c_str(syscall)) elif isinstance(syscall, int): ret_str = libseccomp.seccomp_syscall_resolve_num_arch(arch, syscall) if ret_str is NULL: raise ValueError('Unknown syscall %d on arch %d' % (syscall, arch)) else: return ret_str else: raise TypeError("Syscall must either be an int or str type") def get_api(): """ Query the level of API support Description: Returns the API level value indicating the current supported functionality. """ level = libseccomp.seccomp_api_get() if level < 0: raise RuntimeError(str.format("Library error (errno = {0})", level)) return level def set_api(unsigned int level): """ Set the level of API support Arguments: level - the API level Description: This function forcibly sets the API level at runtime. General use of this function is strongly discouraged. """ rc = libseccomp.seccomp_api_set(level) if rc == -errno.EINVAL: raise ValueError("Invalid level") elif rc != 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) cdef class Arch: """ Python object representing the SyscallFilter architecture values. Data values: NATIVE - the native architecture X86 - 32-bit x86 X86_64 - 64-bit x86 X32 - 64-bit x86 using the x32 ABI ARM - ARM AARCH64 - 64-bit ARM LOONGARCH64 - 64-bit LoongArch M68K - 32-bit Motorola 68000 MIPS - MIPS O32 ABI MIPS64 - MIPS 64-bit ABI MIPS64N32 - MIPS N32 ABI MIPSEL - MIPS little endian O32 ABI MIPSEL64 - MIPS little endian 64-bit ABI MIPSEL64N32 - MIPS little endian N32 ABI PARISC - 32-bit PA-RISC PARISC64 - 64-bit PA-RISC PPC64 - 64-bit PowerPC PPC - 32-bit PowerPC RISCV64 - 64-bit RISC-V """ cdef int _token NATIVE = libseccomp.SCMP_ARCH_NATIVE X86 = libseccomp.SCMP_ARCH_X86 X86_64 = libseccomp.SCMP_ARCH_X86_64 X32 = libseccomp.SCMP_ARCH_X32 ARM = libseccomp.SCMP_ARCH_ARM AARCH64 = libseccomp.SCMP_ARCH_AARCH64 LOONGARCH64 = libseccomp.SCMP_ARCH_LOONGARCH64 M68K = libseccomp.SCMP_ARCH_M68K MIPS = libseccomp.SCMP_ARCH_MIPS MIPS64 = libseccomp.SCMP_ARCH_MIPS64 MIPS64N32 = libseccomp.SCMP_ARCH_MIPS64N32 MIPSEL = libseccomp.SCMP_ARCH_MIPSEL MIPSEL64 = libseccomp.SCMP_ARCH_MIPSEL64 MIPSEL64N32 = libseccomp.SCMP_ARCH_MIPSEL64N32 PARISC = libseccomp.SCMP_ARCH_PARISC PARISC64 = libseccomp.SCMP_ARCH_PARISC64 PPC = libseccomp.SCMP_ARCH_PPC PPC64 = libseccomp.SCMP_ARCH_PPC64 PPC64LE = libseccomp.SCMP_ARCH_PPC64LE S390 = libseccomp.SCMP_ARCH_S390 S390X = libseccomp.SCMP_ARCH_S390X RISCV64 = libseccomp.SCMP_ARCH_RISCV64 def __cinit__(self, arch=libseccomp.SCMP_ARCH_NATIVE): """ Initialize the architecture object. Arguments: arch - the architecture name or token value Description: Create an architecture object using the given name or token value. """ if isinstance(arch, int): if arch == libseccomp.SCMP_ARCH_NATIVE: self._token = libseccomp.seccomp_arch_native() elif arch == libseccomp.SCMP_ARCH_X86: self._token = libseccomp.SCMP_ARCH_X86 elif arch == libseccomp.SCMP_ARCH_X86_64: self._token = libseccomp.SCMP_ARCH_X86_64 elif arch == libseccomp.SCMP_ARCH_X32: self._token = libseccomp.SCMP_ARCH_X32 elif arch == libseccomp.SCMP_ARCH_ARM: self._token = libseccomp.SCMP_ARCH_ARM elif arch == libseccomp.SCMP_ARCH_AARCH64: self._token = libseccomp.SCMP_ARCH_AARCH64 elif arch == libseccomp.SCMP_ARCH_LOONGARCH64: self._token = libseccomp.SCMP_ARCH_LOONGARCH64 elif arch == libseccomp.SCMP_ARCH_M68K: self._token = libseccomp.SCMP_ARCH_M68K elif arch == libseccomp.SCMP_ARCH_MIPS: self._token = libseccomp.SCMP_ARCH_MIPS elif arch == libseccomp.SCMP_ARCH_MIPS64: self._token = libseccomp.SCMP_ARCH_MIPS64 elif arch == libseccomp.SCMP_ARCH_MIPS64N32: self._token = libseccomp.SCMP_ARCH_MIPS64N32 elif arch == libseccomp.SCMP_ARCH_MIPSEL: self._token = libseccomp.SCMP_ARCH_MIPSEL elif arch == libseccomp.SCMP_ARCH_MIPSEL64: self._token = libseccomp.SCMP_ARCH_MIPSEL64 elif arch == libseccomp.SCMP_ARCH_MIPSEL64N32: self._token = libseccomp.SCMP_ARCH_MIPSEL64N32 elif arch == libseccomp.SCMP_ARCH_PARISC: self._token = libseccomp.SCMP_ARCH_PARISC elif arch == libseccomp.SCMP_ARCH_PARISC64: self._token = libseccomp.SCMP_ARCH_PARISC64 elif arch == libseccomp.SCMP_ARCH_PPC: self._token = libseccomp.SCMP_ARCH_PPC elif arch == libseccomp.SCMP_ARCH_PPC64: self._token = libseccomp.SCMP_ARCH_PPC64 elif arch == libseccomp.SCMP_ARCH_PPC64LE: self._token = libseccomp.SCMP_ARCH_PPC64LE elif arch == libseccomp.SCMP_ARCH_S390: self._token = libseccomp.SCMP_ARCH_S390 elif arch == libseccomp.SCMP_ARCH_S390X: self._token = libseccomp.SCMP_ARCH_S390X else: self._token = 0; elif isinstance(arch, basestring): self._token = libseccomp.seccomp_arch_resolve_name(c_str(arch)) else: raise TypeError("Architecture must be an int or str type") if self._token == 0: raise ValueError("Invalid architecture") def __int__(self): """ Convert the architecture object to a token value. Description: Convert the architecture object to an integer representing the architecture's token value. """ return self._token cdef class Attr: """ Python object representing the SyscallFilter attributes. Data values: ACT_DEFAULT - the filter's default action ACT_BADARCH - the filter's bad architecture action CTL_NNP - the filter's "no new privileges" flag CTL_NNP - the filter's thread sync flag CTL_TSYNC - sync threads on filter load CTL_TSKIP - allow rules with a -1 syscall number CTL_LOG - log not-allowed actions CTL_SSB - disable SSB mitigations CTL_OPTIMIZE - the filter's optimization level: 0: currently unused 1: rules weighted by priority and complexity (DEFAULT) 2: binary tree sorted by syscall number API_SYSRAWRC - return the raw syscall codes CTL_WAITKILL - request wait killable semantics """ ACT_DEFAULT = libseccomp.SCMP_FLTATR_ACT_DEFAULT ACT_BADARCH = libseccomp.SCMP_FLTATR_ACT_BADARCH CTL_NNP = libseccomp.SCMP_FLTATR_CTL_NNP CTL_TSYNC = libseccomp.SCMP_FLTATR_CTL_TSYNC API_TSKIP = libseccomp.SCMP_FLTATR_API_TSKIP CTL_LOG = libseccomp.SCMP_FLTATR_CTL_LOG CTL_SSB = libseccomp.SCMP_FLTATR_CTL_SSB CTL_OPTIMIZE = libseccomp.SCMP_FLTATR_CTL_OPTIMIZE API_SYSRAWRC = libseccomp.SCMP_FLTATR_API_SYSRAWRC CTL_WAITKILL = libseccomp.SCMP_FLTATR_CTL_WAITKILL cdef class Arg: """ Python object representing a SyscallFilter syscall argument. """ cdef libseccomp.scmp_arg_cmp _arg def __cinit__(self, arg, op, datum_a, datum_b = 0): """ Initialize the argument comparison. Arguments: arg - the argument number, starting at 0 op - the argument comparison operator, e.g. {NE,LT,LE,...} datum_a - argument value datum_b - argument value, only valid when op == MASKED_EQ Description: Create an argument comparison object for use with SyscallFilter. """ self._arg.arg = arg self._arg.op = op self._arg.datum_a = datum_a self._arg.datum_b = datum_b cdef libseccomp.scmp_arg_cmp to_c(self): """ Convert the object into a C structure. Description: Helper function which should only be used internally by SyscallFilter objects and exists for the sole purpose of making it easier to deal with the varadic functions of the libseccomp API, e.g. seccomp_rule_add(). """ return self._arg cdef class Notification: """ Python object representing a seccomp notification. """ cdef uint64_t _id cdef uint32_t _pid cdef uint32_t _flags cdef int _syscall cdef uint32_t _syscall_arch cdef uint64_t _syscall_ip cdef uint64_t _syscall_args[6] def __cinit__(self, id, pid, flags, syscall, arch, ip, args): """ Initialize the notification. Arguments: id - the notification ID pid - the process ID flags - the notification flags syscall - the syscall number ip - the instruction pointer args - list of the six syscall arguments Description: Create a seccomp Notification object. """ self._id = id self._pid = pid self._flags = flags self._syscall = syscall self._syscall_arch = arch self._syscall_ip = ip self._syscall_args[0] = args[0] self._syscall_args[1] = args[1] self._syscall_args[2] = args[2] self._syscall_args[3] = args[3] self._syscall_args[4] = args[4] self._syscall_args[5] = args[5] @property def id(self): """ Get the seccomp notification ID. Description: Get the seccomp notification ID. """ return self._id @property def pid(self): """ Get the seccomp notification process ID. Description: Get the seccomp notification process ID. """ return self._pid @property def flags(self): """ Get the seccomp notification flags. Description: Get the seccomp notification flags. """ return self._flags @property def syscall(self): """ Get the seccomp notification syscall. Description: Get the seccomp notification syscall. """ return self._syscall @property def syscall_arch(self): """ Get the seccomp notification syscall architecture. Description: Get the seccomp notification syscall architecture. """ return self._syscall_arch @property def syscall_ip(self): """ Get the seccomp notification syscall instruction pointer. Description: Get the seccomp notification syscall instruction pointer. """ return self._syscall_ip @property def syscall_args(self): """ Get the seccomp notification syscall arguments. Description: Get the seccomp notification syscall arguments in a six element list. """ return [self._syscall_args[0], self._syscall_args[1], self._syscall_args[2], self._syscall_args[3], self._syscall_args[4], self._syscall_args[5]] cdef class NotificationResponse: """ Python object representing a seccomp notification response. """ cdef uint64_t _id cdef int64_t _val cdef int32_t _error cdef uint32_t _flags def __cinit__(self, notify, val = 0, error = 0, flags = 0): """ Initialize the notification response. Arguments: notify - a Notification object val - the notification response value error - the notification response error flags - the notification response flags Description: Create a seccomp NotificationResponse object. """ self._id = notify.id self._val = val self._error = error self._flags = flags @property def id(self): """ Get the seccomp notification response ID. Description: Get the seccomp notification response ID. """ return self._id @id.setter def id(self, value): """ Set the seccomp notification response ID. Arguments: id - the notification response ID Description: Set the seccomp notification response ID. """ self._id = value @property def val(self): """ Get the seccomp notification response value. Description: Get the seccomp notification response value. """ return self._val @val.setter def val(self, value): """ Set the seccomp notification response value. Arguments: val - the notification response value Description: Set the seccomp notification response value. """ self._val = value @property def error(self): """ Get the seccomp notification response error. Description: Get the seccomp notification response error. """ return self._error @error.setter def error(self, value): """ Set the seccomp notification response error. Arguments: error - the notification response error Description: Set the seccomp notification response error. """ self._error = value @property def flags(self): """ Get the seccomp notification response flags. Description: Get the seccomp notification response flags. """ return self._flags @flags.setter def flags(self, value): """ Set the seccomp notification response flags. Arguments: flags - the notification response flags Description: Set the seccomp notification response flags. """ self._flags = value cdef class SyscallFilter: """ Python object representing a seccomp syscall filter. """ cdef int _defaction cdef libseccomp.scmp_filter_ctx _ctx def __cinit__(self, int defaction): self._ctx = libseccomp.seccomp_init(defaction) if self._ctx == NULL: raise RuntimeError("Library error") _defaction = defaction def __init__(self, defaction): """ Initialize the filter state Arguments: defaction - the default filter action Description: Initializes the seccomp filter state to the defaults. """ def __dealloc__(self): """ Destroys the filter state and releases any resources. Description: Destroys the seccomp filter state and releases any resources associated with the filter state. This function does not affect any seccomp filters already loaded into the kernel. """ if self._ctx != NULL: libseccomp.seccomp_release(self._ctx) def reset(self, int defaction = -1): """ Reset the filter state. Arguments: defaction - the default filter action Description: Resets the seccomp filter state to an initial default state, if a default filter action is not specified in the reset call the original action will be reused. This function does not affect any seccomp filters already loaded into the kernel. """ if defaction == -1: defaction = self._defaction rc = libseccomp.seccomp_reset(self._ctx, defaction) if rc == -errno.EINVAL: raise ValueError("Invalid action") if rc != 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) _defaction = defaction def merge(self, SyscallFilter filter): """ Merge two existing SyscallFilter objects. Arguments: filter - a valid SyscallFilter object Description: Merges a valid SyscallFilter object with the current SyscallFilter object; the passed filter object will be reset on success. In order to successfully merge two seccomp filters they must have the same attribute values and not share any of the same architectures. """ rc = libseccomp.seccomp_merge(self._ctx, filter._ctx) if rc != 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) filter._ctx = NULL filter = SyscallFilter(filter._defaction) def exist_arch(self, arch): """ Check if the seccomp filter contains a given architecture. Arguments: arch - the architecture value, e.g. Arch.* Description: Test to see if a given architecture is included in the filter. Return True is the architecture exists, False if it does not exist. """ rc = libseccomp.seccomp_arch_exist(self._ctx, arch) if rc == 0: return True elif rc == -errno.EEXIST: return False elif rc == -errno.EINVAL: raise ValueError("Invalid architecture") else: raise RuntimeError(str.format("Library error (errno = {0})", rc)) def add_arch(self, arch): """ Add an architecture to the filter. Arguments: arch - the architecture value, e.g. Arch.* Description: Add the given architecture to the filter. Any new rules added after this method returns successfully will be added to this new architecture, but any existing rules will not be added to the new architecture. """ rc = libseccomp.seccomp_arch_add(self._ctx, arch) if rc == -errno.EINVAL: raise ValueError("Invalid architecture") elif rc != 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) def remove_arch(self, arch): """ Remove an architecture from the filter. Arguments: arch - the architecture value, e.g. Arch.* Description: Remove the given architecture from the filter. The filter must always contain at least one architecture, so if only one architecture exists in the filter this method will fail. """ rc = libseccomp.seccomp_arch_remove(self._ctx, arch) if rc == -errno.EINVAL: raise ValueError("Invalid architecture") elif rc != 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) def load(self): """ Load the filter into the Linux Kernel. Description: Load the current filter into the Linux Kernel. As soon as the method returns the filter will be active and enforcing. """ rc = libseccomp.seccomp_load(self._ctx) if rc != 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) def get_attr(self, attr): """ Get an attribute value from the filter. Arguments: attr - the attribute, e.g. Attr.* Description: Lookup the given attribute in the filter and return the attribute's value to the caller. """ cdef uint32_t value = 0 rc = libseccomp.seccomp_attr_get(self._ctx, attr, &value) if rc == -errno.EINVAL: raise ValueError("Invalid attribute") elif rc != 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) return value def set_attr(self, attr, int value): """ Set a filter attribute. Arguments: attr - the attribute, e.g. Attr.* value - the attribute value Description: Lookup the given attribute in the filter and assign it the given value. """ rc = libseccomp.seccomp_attr_set(self._ctx, attr, value) if rc == -errno.EINVAL: raise ValueError("Invalid attribute") elif rc != 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) def syscall_priority(self, syscall, int priority): """ Set the filter priority of a syscall. Arguments: syscall - the syscall name or number priority - the priority of the syscall Description: Set the filter priority of the given syscall. A syscall with a higher priority will have less overhead in the generated filter code which is loaded into the system. Priority values can range from 0 to 255 inclusive. """ if priority < 0 or priority > 255: raise ValueError("Syscall priority must be between 0 and 255") if isinstance(syscall, str): syscall_str = syscall.encode() syscall_num = libseccomp.seccomp_syscall_resolve_name(syscall_str) elif isinstance(syscall, int): syscall_num = syscall else: raise TypeError("Syscall must either be an int or str type") rc = libseccomp.seccomp_syscall_priority(self._ctx, syscall_num, priority) if rc != 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) def add_rule(self, int action, syscall, *args): """ Add a new rule to filter. Arguments: action - the rule action: KILL_PROCESS, KILL, TRAP, ERRNO(), TRACE(), LOG, or ALLOW syscall - the syscall name or number args - variable number of Arg objects Description: Add a new rule to the filter, matching on the given syscall and an optional list of argument comparisons. If the rule is triggered the given action will be taken by the kernel. In order for the rule to trigger, the syscall as well as each argument comparison must be true. In the case where the specific rule is not valid on a specific architecture, e.g. socket() on 32-bit x86, this method rewrites the rule to the best possible match. If you don't want this rule rewriting to take place use add_rule_exactly(). """ cdef libseccomp.scmp_arg_cmp c_arg[6] if isinstance(syscall, str): syscall_str = syscall.encode() syscall_num = libseccomp.seccomp_syscall_resolve_name(syscall_str) elif isinstance(syscall, int): syscall_num = syscall else: raise TypeError("Syscall must either be an int or str type") """ NOTE: the code below exists solely to deal with the varadic nature of seccomp_rule_add() function and the inability of Cython to handle this automatically """ if len(args) > 6: raise RuntimeError("Maximum number of arguments exceeded") cdef Arg arg for i, arg in enumerate(args): c_arg[i] = arg.to_c() if len(args) == 0: rc = libseccomp.seccomp_rule_add(self._ctx, action, syscall_num, 0) elif len(args) == 1: rc = libseccomp.seccomp_rule_add(self._ctx, action, syscall_num, len(args), c_arg[0]) elif len(args) == 2: rc = libseccomp.seccomp_rule_add(self._ctx, action, syscall_num, len(args), c_arg[0], c_arg[1]) elif len(args) == 3: rc = libseccomp.seccomp_rule_add(self._ctx, action, syscall_num, len(args), c_arg[0], c_arg[1], c_arg[2]) elif len(args) == 4: rc = libseccomp.seccomp_rule_add(self._ctx, action, syscall_num, len(args), c_arg[0], c_arg[1], c_arg[2], c_arg[3]) elif len(args) == 5: rc = libseccomp.seccomp_rule_add(self._ctx, action, syscall_num, len(args), c_arg[0], c_arg[1], c_arg[2], c_arg[3], c_arg[4]) elif len(args) == 6: rc = libseccomp.seccomp_rule_add(self._ctx, action, syscall_num, len(args), c_arg[0], c_arg[1], c_arg[2], c_arg[3], c_arg[4], c_arg[5]) else: raise RuntimeError("Maximum number of arguments exceeded") if rc != 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) def add_rule_exactly(self, int action, syscall, *args): """ Add a new rule to filter. Arguments: action - the rule action: KILL_PROCESS, KILL, TRAP, ERRNO(), TRACE(), LOG, or ALLOW syscall - the syscall name or number args - variable number of Arg objects Description: Add a new rule to the filter, matching on the given syscall and an optional list of argument comparisons. If the rule is triggered the given action will be taken by the kernel. In order for the rule to trigger, the syscall as well as each argument comparison must be true. This method attempts to add the filter rule exactly as specified which can cause problems on certain architectures, e.g. socket() on 32-bit x86. For a architecture independent version of this method use add_rule(). """ cdef libseccomp.scmp_arg_cmp c_arg[6] if isinstance(syscall, str): syscall_str = syscall.encode() syscall_num = libseccomp.seccomp_syscall_resolve_name(syscall_str) elif isinstance(syscall, int): syscall_num = syscall else: raise TypeError("Syscall must either be an int or str type") """ NOTE: the code below exists solely to deal with the varadic nature of seccomp_rule_add_exact() function and the inability of Cython to handle this automatically """ if len(args) > 6: raise RuntimeError("Maximum number of arguments exceeded") cdef Arg arg for i, arg in enumerate(args): c_arg[i] = arg.to_c() if len(args) == 0: rc = libseccomp.seccomp_rule_add_exact(self._ctx, action, syscall_num, 0) elif len(args) == 1: rc = libseccomp.seccomp_rule_add_exact(self._ctx, action, syscall_num, len(args), c_arg[0]) elif len(args) == 2: rc = libseccomp.seccomp_rule_add_exact(self._ctx, action, syscall_num, len(args), c_arg[0], c_arg[1]) elif len(args) == 3: rc = libseccomp.seccomp_rule_add_exact(self._ctx, action, syscall_num, len(args), c_arg[0], c_arg[1], c_arg[2]) elif len(args) == 4: rc = libseccomp.seccomp_rule_add_exact(self._ctx, action, syscall_num, len(args), c_arg[0], c_arg[1], c_arg[2], c_arg[3]) elif len(args) == 5: rc = libseccomp.seccomp_rule_add_exact(self._ctx, action, syscall_num, len(args), c_arg[0], c_arg[1], c_arg[2], c_arg[3], c_arg[4]) elif len(args) == 6: rc = libseccomp.seccomp_rule_add_exact(self._ctx, action, syscall_num, len(args), c_arg[0], c_arg[1], c_arg[2], c_arg[3], c_arg[4], c_arg[5]) else: raise RuntimeError("Maximum number of arguments exceeded") if rc != 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) def receive_notify(self): """ Receive seccomp notifications. Description: Receive a seccomp notification from the system, requires the use of the NOTIFY action. """ cdef libseccomp.seccomp_notif *req fd = libseccomp.seccomp_notify_fd(self._ctx) if fd < 0: raise RuntimeError("Notifications not enabled/active") rc = libseccomp.seccomp_notify_alloc(&req, NULL) if rc < 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) rc = libseccomp.seccomp_notify_receive(fd, req) if rc < 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) rc = libseccomp.seccomp_notify_id_valid(fd, req.id) if rc < 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) notify = Notification(req.id, req.pid, req.flags, req.data.nr, req.data.arch, req.data.instruction_pointer, [req.data.args[0], req.data.args[1], req.data.args[2], req.data.args[3], req.data.args[4], req.data.args[5]]) free(req) return notify def respond_notify(self, response): """ Send a seccomp notification response. Arguments: response - the response to send to the system Description: Respond to a seccomp notification. """ cdef libseccomp.seccomp_notif_resp *resp fd = libseccomp.seccomp_notify_fd(self._ctx) if fd < 0: raise RuntimeError("Notifications not enabled/active") rc = libseccomp.seccomp_notify_alloc(NULL, &resp) if rc < 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) resp.id = response.id resp.val = response.val resp.error = response.error resp.flags = response.flags rc = libseccomp.seccomp_notify_respond(fd, resp) if rc < 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) def get_notify_fd(self): """ Get the seccomp notification file descriptor Description: Returns the seccomp listener file descriptor that was generated when the seccomp policy was loaded. This is only valid after load() with a filter that makes use of the NOTIFY action. """ fd = libseccomp.seccomp_notify_fd(self._ctx) if fd < 0: raise RuntimeError("Notifications not enabled/active") return fd def export_pfc(self, file): """ Export the filter in PFC format. Arguments: file - the output file Description: Output the filter in Pseudo Filter Code (PFC) to the given file. The output is functionally equivalent to the BPF based filter which is loaded into the Linux Kernel. """ rc = libseccomp.seccomp_export_pfc(self._ctx, file.fileno()) if rc != 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) def export_bpf(self, file): """ Export the filter in BPF format. Arguments: file - the output file Description: Output the filter in Berkeley Packet Filter (BPF) to the given file. The output is identical to what is loaded into the Linux Kernel. """ rc = libseccomp.seccomp_export_bpf(self._ctx, file.fileno()) if rc != 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) def export_bpf_mem(self): """ Export the filter in BPF format. Description: Return the filter in Berkeley Packet Filter (BPF) as bytes. The output is identical to what is loaded into the Linux Kernel. """ cdef size_t len = 0 # Figure out how big the program is. rc = libseccomp.seccomp_export_bpf_mem(self._ctx, NULL, &len) if rc != 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) # Get the program. cdef array.array data = array.array('B', bytes(len)) cdef unsigned char[:] program = data rc = libseccomp.seccomp_export_bpf_mem(self._ctx, &program[0], &len) if rc != 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) return program def precompute(self): """ Precompute the seccomp filter. Description: Precompute the seccomp filter and store it internally for future use, speeding up filter loads and other functions which require the generated filter. """ rc = libseccomp.seccomp_precompute(self._ctx) if rc != 0: raise RuntimeError(str.format("Library error (errno = {0})", rc)) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/src/python/libseccomp.pxd0000644000000000000000000001330214467535325017322 0ustar rootroot# # Seccomp Library Python Bindings # # Copyright (c) 2012,2013 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # from libc.stdint cimport int8_t, int16_t, int32_t, int64_t from libc.stdint cimport uint8_t, uint16_t, uint32_t, uint64_t cdef extern from "seccomp.h": cdef struct scmp_version: unsigned int major unsigned int minor unsigned int micro ctypedef void* scmp_filter_ctx cdef enum: SCMP_ARCH_NATIVE SCMP_ARCH_X86 SCMP_ARCH_X86_64 SCMP_ARCH_X32 SCMP_ARCH_ARM SCMP_ARCH_AARCH64 SCMP_ARCH_LOONGARCH64 SCMP_ARCH_M68K SCMP_ARCH_MIPS SCMP_ARCH_MIPS64 SCMP_ARCH_MIPS64N32 SCMP_ARCH_MIPSEL SCMP_ARCH_MIPSEL64 SCMP_ARCH_MIPSEL64N32 SCMP_ARCH_PARISC SCMP_ARCH_PARISC64 SCMP_ARCH_PPC SCMP_ARCH_PPC64 SCMP_ARCH_PPC64LE SCMP_ARCH_S390 SCMP_ARCH_S390X SCMP_ARCH_RISCV64 cdef enum scmp_filter_attr: SCMP_FLTATR_ACT_DEFAULT SCMP_FLTATR_ACT_BADARCH SCMP_FLTATR_CTL_NNP SCMP_FLTATR_CTL_TSYNC SCMP_FLTATR_API_TSKIP SCMP_FLTATR_CTL_LOG SCMP_FLTATR_CTL_SSB SCMP_FLTATR_CTL_OPTIMIZE SCMP_FLTATR_API_SYSRAWRC SCMP_FLTATR_CTL_WAITKILL cdef enum scmp_compare: SCMP_CMP_NE SCMP_CMP_LT SCMP_CMP_LE SCMP_CMP_EQ SCMP_CMP_GE SCMP_CMP_GT SCMP_CMP_MASKED_EQ cdef enum: SCMP_ACT_KILL_PROCESS SCMP_ACT_KILL SCMP_ACT_TRAP SCMP_ACT_LOG SCMP_ACT_ALLOW SCMP_ACT_NOTIFY unsigned int SCMP_ACT_ERRNO(int errno) unsigned int SCMP_ACT_TRACE(int value) ctypedef uint64_t scmp_datum_t cdef struct scmp_arg_cmp: unsigned int arg scmp_compare op scmp_datum_t datum_a scmp_datum_t datum_b cdef struct seccomp_data: int nr uint32_t arch uint64_t instruction_pointer uint64_t args[6] cdef struct seccomp_notif_sizes: uint16_t seccomp_notif uint16_t seccomp_notif_resp uint16_t seccomp_data cdef struct seccomp_notif: uint64_t id uint32_t pid uint32_t flags seccomp_data data cdef struct seccomp_notif_resp: uint64_t id int64_t val int32_t error uint32_t flags scmp_version *seccomp_version() unsigned int seccomp_api_get() int seccomp_api_set(unsigned int level) scmp_filter_ctx seccomp_init(uint32_t def_action) int seccomp_reset(scmp_filter_ctx ctx, uint32_t def_action) void seccomp_release(scmp_filter_ctx ctx) int seccomp_merge(scmp_filter_ctx ctx_dst, scmp_filter_ctx ctx_src) uint32_t seccomp_arch_resolve_name(char *arch_name) uint32_t seccomp_arch_native() int seccomp_arch_exist(scmp_filter_ctx ctx, int arch_token) int seccomp_arch_add(scmp_filter_ctx ctx, int arch_token) int seccomp_arch_remove(scmp_filter_ctx ctx, int arch_token) int seccomp_load(scmp_filter_ctx ctx) int seccomp_attr_get(scmp_filter_ctx ctx, scmp_filter_attr attr, uint32_t* value) int seccomp_attr_set(scmp_filter_ctx ctx, scmp_filter_attr attr, uint32_t value) char *seccomp_syscall_resolve_num_arch(int arch_token, int num) int seccomp_syscall_resolve_name_arch(int arch_token, char *name) int seccomp_syscall_resolve_name_rewrite(int arch_token, char *name) int seccomp_syscall_resolve_name(char *name) int seccomp_syscall_priority(scmp_filter_ctx ctx, int syscall, uint8_t priority) int seccomp_rule_add(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt, ...) int seccomp_rule_add_array(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt, scmp_arg_cmp *arg_array) int seccomp_rule_add_exact(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt, ...) int seccomp_rule_add_exact_array(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt, scmp_arg_cmp *arg_array) int seccomp_notify_alloc(seccomp_notif **req, seccomp_notif_resp **resp) void seccomp_notify_free(seccomp_notif *req, seccomp_notif_resp *resp) int seccomp_notify_receive(int fd, seccomp_notif *req) int seccomp_notify_respond(int fd, seccomp_notif_resp *resp) int seccomp_notify_id_valid(int fd, uint64_t id) int seccomp_notify_fd(scmp_filter_ctx ctx) int seccomp_export_pfc(scmp_filter_ctx ctx, int fd) int seccomp_export_bpf(scmp_filter_ctx ctx, int fd) int seccomp_export_bpf_mem(const scmp_filter_ctx ctx, void *buf, size_t *len) int seccomp_precompute(const scmp_filter_ctx ctx) # kate: syntax python; # kate: indent-mode python; space-indent on; indent-width 4; mixedindent off; libseccomp-2.5.4/src/python/.gitignore0000644000000000000000000000002014467535325016446 0ustar rootrootbuild seccomp.c libseccomp-2.5.4/src/python/Makefile.am0000644000000000000000000000322214467535325016521 0ustar rootroot#### # Seccomp Library Python Bindings # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License # as published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # PY_DISTUTILS = \ VERSION_RELEASE="@PACKAGE_VERSION@" \ CPPFLAGS="-I\${top_srcdir}/include ${AM_CPPFLAGS} ${CPPFLAGS}" \ CFLAGS="${AM_CFLAGS} ${CFLAGS}" \ LDFLAGS="${AM_LDFLAGS} ${LDFLAGS}" \ ${PYTHON} ${srcdir}/setup.py # support silent builds PY_BUILD_0 = @echo " PYTHON " $@; ${PY_DISTUTILS} -q build PY_BUILD_1 = ${PY_DISTUTILS} build PY_BUILD_ = ${PY_BUILD_0} PY_BUILD = ${PY_BUILD_@AM_V@} PY_INSTALL = ${PY_DISTUTILS} install EXTRA_DIST = libseccomp.pxd seccomp.pyx setup.py all-local: build build: ../libseccomp.la libseccomp.pxd seccomp.pyx setup.py [ ${srcdir} = ${builddir} ] || cp ${srcdir}/seccomp.pyx ${builddir} ${PY_BUILD} && touch build install-exec-local: build ${PY_INSTALL} --install-lib=${DESTDIR}/${pyexecdir} \ --record=${DESTDIR}/${pyexecdir}/install_files.txt uninstall-local: cat ${DESTDIR}/${pyexecdir}/install_files.txt | xargs ${RM} -f ${RM} -f ${DESTDIR}/${pyexecdir}/install_files.txt clean-local: [ ${srcdir} = ${builddir} ] || ${RM} -f ${builddir}/seccomp.pyx ${RM} -rf seccomp.c build libseccomp-2.5.4/src/arch-syscall-validate0000755000000000000000000005212714467535324017255 0ustar rootroot#!/bin/bash # # libseccomp syscall validation script # # Copyright (c) 2014 Red Hat # Copyright (c) 2020 Cisco Systems, Inc. # Copyright (c) 2022 Microsoft Corporation. # # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # LIB_SYS_DUMP="./arch-syscall-dump" #### # functions # # Dependency check # # Arguments: # 1 Dependency to check for # function check_deps() { [[ -z "$1" ]] && return which "$1" >& /dev/null return $? } # # Dependency verification # # Arguments: # 1 Dependency to check for # function verify_deps() { [[ -z "$1" ]] && return if ! check_deps "$1"; then echo "error: install \"$1\" and include it in your \$PATH" exit 1 fi } # # Print out script usage details # function usage() { cat << EOF usage: arch-syscall-validate [-h] [-c ] [-a ] libseccomp syscall validation script optional arguments: -h show this help message and exit -a architecture -l output the library's syscall definitions -s output the kernel's syscall definitions -c generate a CSV of the kernel's syscall definitions EOF } # # Dump the kernel version # # Arguments: # 1 path to the kernel source # # Dump the kernel's version information to stdout. # function kernel_version() { local maj=$(cat $1/Makefile | \ grep "^VERSION =" | awk -F "= " '{ print $2 }') local min=$(cat $1/Makefile | \ grep "^PATCHLEVEL =" | awk -F "= " '{ print $2 }') local sub=$(cat $1/Makefile | \ grep "^SUBLEVEL =" | awk -F "= " '{ print $2 }') local xtr=$(cat $1/Makefile | \ grep "^EXTRAVERSION =" | awk -F "= " '{ print $2 }') echo "${maj}.${min}.${sub}${xtr}" } # # Dump the library syscall table for a given architecture # # Arguments: # 1 architecture # 2 offset (optional) # # # Dump the library's syscall table to stdout. # function dump_lib_arch() { local offset_str="" [[ -z $1 ]] && return [[ -n $2 ]] && offset_str="-o $2" $LIB_SYS_DUMP -a $1 $offset_str | sed 's/\t/,/' | sort } # # Mangle the library pseudo syscall values # # Arguments: # 1 architecture # # Mangle the supplied pseudo syscall to match the system values # function mangle_lib_syscall() { local sed_filter="" sed_filter+='s/accept4,-118/accept4,364/;' sed_filter+='s/bind,-102/bind,361/;' sed_filter+='s/connect,-103/connect,362/;' sed_filter+='s/getpeername,-107/getpeername,368/;' sed_filter+='s/getsockname,-106/getsockname,367/;' sed_filter+='s/getsockopt,-115/getsockopt,365/;' sed_filter+='s/listen,-104/listen,363/;' sed_filter+='s/msgctl,-214/msgctl,402/;' sed_filter+='s/msgget,-213/msgget,399/;' sed_filter+='s/msgrcv,-212/msgrcv,401/;' sed_filter+='s/msgsnd,-211/msgsnd,400/;' sed_filter+='s/recvfrom,-112/recvfrom,371/;' sed_filter+='s/recvmsg,-117/recvmsg,372/;' sed_filter+='s/semctl,-203/semctl,394/;' sed_filter+='s/semget,-202/semget,393/;' sed_filter+='s/sendmsg,-116/sendmsg,370/;' sed_filter+='s/sendto,-111/sendto,369/;' sed_filter+='s/setsockopt,-114/setsockopt,366/;' sed_filter+='s/shmat,-221/shmat,397/;' sed_filter+='s/shmctl,-224/shmctl,396/;' sed_filter+='s/shmdt,-222/shmdt,398/;' sed_filter+='s/shmget,-223/shmget,395/;' sed_filter+='s/shutdown,-113/shutdown,373/;' sed_filter+='s/socket,-101/socket,359/;' sed_filter+='s/socketpair,-108/socketpair,360/;' case $1 in s390|s390x) sed_filter+='s/recvmmsg,-119/recvmmsg,357/;' sed_filter+='s/sendmmsg,-120/sendmmsg,358/;' ;; *) sed_filter+='s/recvmmsg,-119/recvmmsg,337/;' sed_filter+='s/sendmmsg,-120/sendmmsg,345/;' ;; esac sed $sed_filter | sed '/,-[0-9]\+$/d' } # # Dump the x86 system syscall table # # Arguments: # 1 path to the kernel source # # Dump the architecture's syscall table to stdout. # function dump_sys_x86() { cat $1/arch/x86/entry/syscalls/syscall_32.tbl | \ grep -v "^#" | awk '{ print $3","$1 }' | \ sort } # # Dump the x86 library syscall table # # Dump the library's syscall table to stdout. # function dump_lib_x86() { dump_lib_arch x86 | mangle_lib_syscall x86 } # # Dump the x86_64 system syscall table # # Arguments: # 1 path to the kernel source # # Dump the architecture's syscall table to stdout. # function dump_sys_x86_64() { cat $1/arch/x86/entry/syscalls/syscall_64.tbl | \ grep -v "^#" | sed '/^$/d' | awk '{ print $2,$3,$1 }' | \ sed '/^x32/d' | awk '{ print $2","$3 }' | sort } # # Dump the x86_64 library syscall table # # Dump the library's syscall table to stdout. # function dump_lib_x86_64() { dump_lib_arch x86_64 | mangle_lib_syscall x86_64 } # # Dump the x32 system syscall table # # Arguments: # 1 path to the kernel source # # Dump the architecture's syscall table to stdout. # function dump_sys_x32() { cat $1/arch/x86/entry/syscalls/syscall_64.tbl | \ grep -v "^#" | sed '/^$/d' | awk '{ print $2,$3,$1 }' | \ sed '/^64/d' | awk '{ print $2","$3 }' | sort } # # Dump the x32 library syscall table # # Dump the library's syscall table to stdout. # function dump_lib_x32() { dump_lib_arch x32 | mangle_lib_syscall x32 } # # Dump the arm system syscall table # # Arguments: # 1 path to the kernel source # # Dump the architecture's syscall table to stdout. # function dump_sys_arm() { cat $1/arch/arm/tools/syscall.tbl | grep -v "^#" | \ sed -n "/[0-9]\+[ \t]\+\(common\|eabi\)/p" | \ awk '{ print $3","$1 }' | sort | (cat -; \ (cat $1/arch/arm/include/uapi/asm/unistd.h | \ grep "^#define __ARM_NR_" | \ grep -v "^#define __ARM_NR_BASE" | \ sed 's/#define __ARM_NR_\([a-z0-9_]*\)[ \t]\+(__ARM_NR_BASE+\(.*\))/\1 983040 + \2/' | \ awk '{ print $1","$2+$4 }')) | sort } # # Dump the arm library syscall table # # Dump the library's syscall table to stdout. # function dump_lib_arm() { # NOTE: arm_sync_file_range() and sync_file_range2() share values dump_lib_arch arm | sed '/sync_file_range2,\+341/d' | \ mangle_lib_syscall arm } # # Dump the aarch64 system syscall table # # Arguments: # 1 path to the kernel source # # Dump the architecture's syscall table to stdout. # function dump_sys_aarch64() { local sed_filter="" sed_filter+='s/__NR3264_statfs/43/;' sed_filter+='s/__NR3264_ftruncate/46/;' sed_filter+='s/__NR3264_truncate/45/;' sed_filter+='s/__NR3264_lseek/62/;' sed_filter+='s/__NR3264_sendfile/71/;' sed_filter+='s/__NR3264_fstatat/79/;' sed_filter+='s/__NR3264_fstatfs/44/;' sed_filter+='s/__NR3264_fcntl/25/;' sed_filter+='s/__NR3264_fadvise64/223/;' sed_filter+='s/__NR3264_mmap/222/;' sed_filter+='s/__NR3264_fstat/80/;' sed_filter+='s/__NR3264_lstat/1039/;' sed_filter+='s/__NR3264_stat/1038/;' gcc -E -dM -I$1/include/uapi \ -D__BITS_PER_LONG=64 -D__ARCH_WANT_RENAMEAT \ -D__ARCH_WANT_NEW_STAT \ $1/arch/arm64/include/uapi/asm/unistd.h | \ grep "^#define __NR_" | \ sed '/__NR_syscalls/d' | \ sed '/__NR_arch_specific_syscall/d' | \ sed 's/#define[ \t]\+__NR_\([^ \t]\+\)[ \t]\+\(.*\)/\1,\2/' | \ sed $sed_filter | sort } # # Dump the aarch64 library syscall table # # Dump the library's syscall table to stdout. # function dump_lib_aarch64() { dump_lib_arch aarch64 | mangle_lib_syscall aarch64 } # # Dump the loongarch64 syscall table # # Arguments: # 1 path to the kernel source # # Dump the architecture's syscall table to stdout. # function dump_sys_loongarch64() { local sed_filter="" sed_filter+='s/__NR3264_fadvise64/223/;' sed_filter+='s/__NR3264_fcntl/25/;' sed_filter+='s/__NR3264_fstatfs/44/;' sed_filter+='s/__NR3264_ftruncate/46/;' sed_filter+='s/__NR3264_lseek/62/;' sed_filter+='s/__NR3264_mmap/222/;' sed_filter+='s/__NR3264_sendfile/71/;' sed_filter+='s/__NR3264_statfs/43/;' sed_filter+='s/__NR3264_truncate/45/;' gcc -E -dM -I$1/include/uapi \ -D__BITS_PER_LONG=64 \ -D__ARCH_WANT_SYS_CLONE \ -D__ARCH_WANT_SYS_CLONE3 \ $1/arch/loongarch/include/uapi/asm/unistd.h | \ grep "^#define __NR_" | \ sed '/__NR_syscalls/d' | \ sed '/__NR_arch_specific_syscall/d' | \ sed 's/#define[ \t]\+__NR_\([^ \t]\+\)[ \t]\+\(.*\)/\1,\2/' | \ sed $sed_filter | sort } # # Dump the loongarch64 library syscall table # # Dump the library's syscall table to stdout. # function dump_lib_loongarch64() { dump_lib_arch loongarch64 | mangle_lib_syscall loongarch64 } # Dump the m68k system syscall table # # Arguments: # 1 path to the kernel source # # Dump the architecture's syscall table to stdout. # function dump_sys_m68k() { cat $1/arch/m68k/kernel/syscalls/syscall.tbl | \ grep -v "^#" | \ sed -n "/[0-9]\+[ \t]\+\(common\)/p" | \ awk '{ print $3","$1 }' | \ sort } # # Dump the m68k library syscall table # # Dump the library's syscall table to stdout. # function dump_lib_m68k() { dump_lib_arch m68k | mangle_lib_syscall m68k } # # Dump the mips system syscall table # # Arguments: # 1 path to the kernel source # # Dump the architecture's syscall table to stdout. # function dump_sys_mips() { cat $1/arch/mips/kernel/syscalls/syscall_o32.tbl | \ grep -v "^#" | \ sed -e '/[ \t]\+reserved[0-9]\+[ \t]\+/d;' | \ sed -e '/[ \t]\+unused[0-9]\+[ \t]\+/d;' | \ awk '{ print $3","$1 }' | sort } # # Dump the mips library syscall table # # Dump the library's syscall table to stdout. # function dump_lib_mips() { dump_lib_arch mips | mangle_lib_syscall mips } # # Dump the mips64 system syscall table # # Arguments: # 1 path to the kernel source # # Dump the architecture's syscall table to stdout. # function dump_sys_mips64() { cat $1/arch/mips/kernel/syscalls/syscall_n64.tbl | \ grep -v "^#" | \ sed -e '/[ \t]\+reserved[0-9]\+[ \t]\+/d;' | \ sed -e '/[ \t]\+unused[0-9]\+[ \t]\+/d;' | \ awk '{ print $3","$1 }' | sort } # # Dump the mips64 library syscall table # # Dump the library's syscall table to stdout. # function dump_lib_mips64() { dump_lib_arch mips64 | mangle_lib_syscall mips64 } # # Dump the mips64n32 system syscall table # # Arguments: # 1 path to the kernel source # # Dump the architecture's syscall table to stdout. # function dump_sys_mips64n32() { cat $1/arch/mips/kernel/syscalls/syscall_n32.tbl | \ grep -v "^#" | \ sed -e '/[ \t]\+reserved[0-9]\+[ \t]\+/d;' | \ sed -e '/[ \t]\+unused[0-9]\+[ \t]\+/d;' | \ awk '{ print $3","$1 }' | sort } # # Dump the mips64n32 library syscall table # # Dump the library's syscall table to stdout. # function dump_lib_mips64n32() { dump_lib_arch mips64n32 | mangle_lib_syscall mips64n32 } # # Dump the parisc system syscall table # # Arguments: # 1 path to the kernel source # # Dump the architecture's syscall table to stdout. # function dump_sys_parisc() { cat $1/arch/parisc/kernel/syscalls/syscall.tbl | \ grep -v "^#" | \ sed -n "/[0-9]\+[ \t]\+\(common\|32\)/p" | \ awk '{ print $3","$1 }' | \ sort } # # Dump the parisc library syscall table # # Dump the library's syscall table to stdout. # function dump_lib_parisc() { dump_lib_arch parisc | mangle_lib_syscall parisc } # # Dump the parisc64 system syscall table # # Arguments: # 1 path to the kernel source # # Dump the architecture's syscall table to stdout. # function dump_sys_parisc64() { cat $1/arch/parisc/kernel/syscalls/syscall.tbl | \ grep -v "^#" | \ sed -n "/[0-9]\+[ \t]\+\(common\|64\)/p" | \ awk '{ print $3","$1 }' | \ sort } # # Dump the parisc64 library syscall table # # Dump the library's syscall table to stdout. # function dump_lib_parisc64() { dump_lib_arch parisc64 | mangle_lib_syscall parisc64 } # # Dump the ppc system syscall table # # Arguments: # 1 path to the kernel source # # Dump the architecture's syscall table to stdout. # function dump_sys_ppc() { cat $1/arch/powerpc/kernel/syscalls/syscall.tbl | grep -v "^#" | \ sed -ne "/[0-9]\+[ \t]\+\(common\|nospu\|32\)/p" | \ awk '{ print $3","$1 }' | sort } # # Dump the ppc library syscall table # # Dump the library's syscall table to stdout. # function dump_lib_ppc() { dump_lib_arch ppc | mangle_lib_syscall ppc } # # Dump the ppc64 system syscall table # # Arguments: # 1 path to the kernel source # # Dump the architecture's syscall table to stdout. # function dump_sys_ppc64() { cat $1/arch/powerpc/kernel/syscalls/syscall.tbl | grep -v "^#" | \ sed -ne "/[0-9]\+[ \t]\+\(common\|nospu\|64\)/p" | \ awk '{ print $3","$1 }' | sort } # # Dump the ppc64 library syscall table # # Dump the library's syscall table to stdout. # function dump_lib_ppc64() { dump_lib_arch ppc64 | mangle_lib_syscall ppc64 } # # Dump the riscv64 system syscall table # # Arguments: # 1 path to the kernel source # # Dump the architecture's syscall table to stdout. # function dump_sys_riscv64() { local sed_filter="" sed_filter+='s/__NR3264_fadvise64/223/;' sed_filter+='s/__NR3264_fcntl/25/;' sed_filter+='s/__NR3264_fstatat/79/;' sed_filter+='s/__NR3264_fstatfs/44/;' sed_filter+='s/__NR3264_ftruncate/46/;' sed_filter+='s/__NR3264_lseek/62/;' sed_filter+='s/__NR3264_mmap/222/;' sed_filter+='s/__NR3264_sendfile/71/;' sed_filter+='s/__NR3264_statfs/43/;' sed_filter+='s/__NR3264_truncate/45/;' sed_filter+='s/__NR3264_fstat/80/;' gcc -E -dM -I$1/include/uapi \ -D__BITS_PER_LONG=64 -D__ARCH_WANT_NEW_STAT \ $1/arch/riscv/include/uapi/asm/unistd.h | \ grep "^#define __NR_" | \ sed '/__NR_syscalls/d' | \ sed 's/(__NR_arch_specific_syscall + 15)/259/' | \ sed '/__NR_arch_specific_syscall/d' | \ sed 's/#define[ \t]\+__NR_\([^ \t]\+\)[ \t]\+\(.*\)/\1,\2/' | \ sed $sed_filter | sort } # # Dump the riscv64 library syscall table # # Dump the library's syscall table to stdout. # function dump_lib_riscv64() { dump_lib_arch riscv64 | mangle_lib_syscall riscv64 } # # Dump the s390 system syscall table # # Arguments: # 1 path to the kernel source # # Dump the architecture's syscall table to stdout. # function dump_sys_s390() { cat $1/arch/s390/kernel/syscalls/syscall.tbl | grep -v "^#" | \ sed -ne "/[0-9]\+[ \t]\+\(common\|32\)/p" | \ awk '{ print $3","$1 }' | \ sort } # # Dump the s390 library syscall table # # Dump the library's syscall table to stdout. # function dump_lib_s390() { dump_lib_arch s390 | mangle_lib_syscall s390 } # # Dump the s390x system syscall table # # Arguments: # 1 path to the kernel source # # Dump the architecture's syscall table to stdout. # function dump_sys_s390x() { cat $1/arch/s390/kernel/syscalls/syscall.tbl | grep -v "^#" | \ sed -ne "/[0-9]\+[ \t]\+\(common\|64\)/p" | \ awk '{ print $3","$1 }' | \ sort } # # Dump the s390x library syscall table # # Dump the library's syscall table to stdout. # function dump_lib_s390x() { dump_lib_arch s390x | mangle_lib_syscall s390x } # # Dump the sh system syscall table # # Arguments: # 1 path to the kernel source # # Dump the architecture's syscall table to stdout. # function dump_sys_sh() { cat $1/arch/sh/kernel/syscalls/syscall.tbl | \ grep -v "^#" | \ sed -n "/[0-9]\+[ \t]\+\(common\)/p" | \ awk '{ print $3","$1 }' | \ sort } # # Dump the sh library syscall table # # Dump the library's syscall table to stdout. # function dump_lib_sh() { dump_lib_arch sh | mangle_lib_syscall sh } # # Dump the system syscall table # # Arguments: # 1 architecture # 2 path to the kernel source # # Dump the system's syscall table to stdout using the given architecture. # function dump_sys() { case $1 in x86) dump_sys_x86 "$2" ;; x86_64) dump_sys_x86_64 "$2" ;; x32) dump_sys_x32 "$2" ;; arm) dump_sys_arm "$2" ;; aarch64) dump_sys_aarch64 "$2" ;; loongarch64) dump_sys_loongarch64 "$2" ;; m68k) dump_sys_m68k "$2" ;; mips) dump_sys_mips "$2" ;; mips64) dump_sys_mips64 "$2" ;; mips64n32) dump_sys_mips64n32 "$2" ;; parisc) dump_sys_parisc "$2" ;; parisc64) dump_sys_parisc64 "$2" ;; ppc) dump_sys_ppc "$2" ;; ppc64) dump_sys_ppc64 "$2" ;; riscv64) dump_sys_riscv64 "$2" ;; s390) dump_sys_s390 "$2" ;; s390x) dump_sys_s390x "$2" ;; sh) dump_sys_sh "$2" ;; *) echo "" return 1 ;; esac return 0 } # # Dump the library syscall table # # Arguments: # 1 architecture # # Dump the library's syscall table to stdout using the given architecture. # function dump_lib() { case $1 in x86) dump_lib_x86 ;; x86_64) dump_lib_x86_64 ;; x32) dump_lib_x32 ;; arm) dump_lib_arm ;; aarch64) dump_lib_aarch64 ;; loongarch64) dump_lib_loongarch64 ;; m68k) dump_lib_m68k ;; mips) dump_lib_mips ;; mips64) dump_lib_mips64 ;; mips64n32) dump_lib_mips64n32 ;; parisc) dump_lib_parisc ;; parisc64) dump_lib_parisc64 ;; ppc) dump_lib_ppc ;; ppc64) dump_lib_ppc64 ;; riscv64) dump_lib_riscv64 ;; s390) dump_lib_s390 ;; s390x) dump_lib_s390x ;; sh) dump_lib_sh ;; *) echo "" return 1 ;; esac return 0 } # # Generate the syscall csv file # # Arguments: # 1 path to the kernel source # 2 "sys" or "lib" depending on the syscall list to use # 3 csv file to use as input for saved fields # # Generate a syscall csv file from the given kernel sources. # function gen_csv() { # sanity checks [[ -z $1 ]] && return [[ $2 != "sys" && $2 != "lib" ]] && return # abi list # NOTE: the ordering here is dependent on the layout of the # arch_syscall_table struct in syscalls.h - BEWARE! abi_list="" abi_list+=" x86 x86_64 x32" abi_list+=" arm aarch64" abi_list+=" loongarch64" abi_list+=" m68k" abi_list+=" mips mips64 mips64n32" abi_list+=" parisc parisc64" abi_list+=" ppc ppc64" abi_list+=" riscv64" abi_list+=" s390 s390x" abi_list+=" sh" # read the csv to get the existing data local -A csv local csv_has_kver=0 local csv_input="$3" [[ ! -e "$3" ]] && csv_input=/dev/null grep -q "KV_" "$csv_input" && csv_has_kver=1 while read line; do sc=$(echo $line | cut -d, -f 1) local field=2 for abi in $abi_list; do csv[$sc,$abi]=$(echo $line | cut -d, -f $field) ((field++)) if [[ $csv_has_kver -eq 1 ]]; then csv[$sc,${abi}_KVER]=$(echo $line | \ cut -d, -f $field) ((field++)) fi done done < <(sed 's/#.*//;/^[ \t]*$/d' "$csv_input") # get the full syscall list for abi in $abi_list; do eval output_$abi=$(mktemp -t syscall_validate_XXXXXX) dump_$2_$abi "$1" > $(eval echo $`eval echo output_$abi`) done sc_list=$( (for abi in $abi_list; do cat $(eval echo $`eval echo output_$abi`); done) | awk -F "," '{ print $1 }' | sort -u) # redirect the subshell to the csv file ( # output a simple header printf "#syscall (v%s %s)" \ "$(kernel_version "$1")" "$(TZ=UTC date "+%Y-%m-%d")" for abi in $abi_list; do printf ",%s,%s_kver" $abi $abi done printf "\n" # output the syscall csv details for sc in $sc_list; do printf "%s" $sc for abi in $abi_list; do num=$(grep "^$sc," \ $(eval echo $`eval echo output_$abi`) | \ awk -F "," '{ print $2 }' ) kver=${csv[$sc,${abi}_KVER]} [[ -z $num ]] && num="PNR" [[ -z $kver ]] && kver="KV_UNDEF" printf ",%s,%s" $num $kver done printf "\n" done ) > "$3" # cleanup for abi in $abi_list; do rm -f $(eval echo $`eval echo output_$abi`) done } #### # main verify_deps diff verify_deps gcc verify_deps grep verify_deps mktemp verify_deps sed opt_arches="" opt_csv="" opt_sys=0 opt_lib=0 while getopts "a:c:slh" opt; do case $opt in a) opt_arches+="$OPTARG " ;; c) opt_csv="$OPTARG" ;; s) opt_sys=1 opt_lib=0 ;; l) opt_sys=0 opt_lib=1 ;; h|*) usage exit 1 ;; esac done shift $(($OPTIND - 1)) # defaults if [[ $opt_arches == "" ]]; then opt_arches=" \ x86 x86_64 x32 \ arm aarch64 \ loongarch64 \ m68k \ mips mips64 mips64n32 \ parisc parisc64 \ ppc ppc64 \ s390 s390x \ sh" fi # sanity checks kernel_dir="$1" if [[ -z $kernel_dir ]]; then usage exit 1 fi if [[ ! -d $kernel_dir ]]; then echo "error: \"$1\" is not a valid directory" exit 1 fi if [[ ! -x "$LIB_SYS_DUMP" ]]; then echo "error: \"$LIB_SYS_DUMP\" is not present" exit 1 fi # generate some temp files tmp_lib=$(mktemp -t syscall_validate_XXXXXX) tmp_sys=$(mktemp -t syscall_validate_XXXXXX) if [[ -n $opt_csv ]]; then # generate the syscall csv file if [[ $opt_lib -eq 1 ]]; then gen_csv $kernel_dir "lib" $opt_csv else gen_csv $kernel_dir "sys" $opt_csv fi else # loop through the architectures and compare for i in $opt_arches; do # dump the syscall tables dump_lib $i > $tmp_lib if [[ $? -ne 0 ]]; then echo "error: unknown arch $i" exit 1 fi dump_sys $i "$kernel_dir" > $tmp_sys if [[ $? -ne 0 ]]; then echo "error: unknown arch $i" exit 1 fi if [[ $opt_lib -eq 1 ]]; then cat $tmp_lib elif [[ $opt_sys -eq 1 ]]; then cat $tmp_sys else # compare the lib and sys output diff -u --label="$i [library]" $tmp_lib \ --label "$i [system]" $tmp_sys fi done fi # cleanup and exit rm -f $tmp_lib $tmp_sys exit 0 libseccomp-2.5.4/src/gen_pfc.c0000644000000000000000000003021714467535324014714 0ustar rootroot/** * Seccomp Pseudo Filter Code (PFC) Generator * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include /* NOTE: needed for the arch->token decoding in _pfc_arch() */ #include #include #include "arch.h" #include "db.h" #include "gen_pfc.h" #include "helper.h" #include "system.h" struct pfc_sys_list { struct db_sys_list *sys; struct pfc_sys_list *next; }; /* XXX - we should check the fprintf() return values */ /** * Display a string representation of the architecture * @param arch the architecture definition */ static const char *_pfc_arch(const struct arch_def *arch) { switch (arch->token) { case SCMP_ARCH_X86: return "x86"; case SCMP_ARCH_X86_64: return "x86_64"; case SCMP_ARCH_X32: return "x32"; case SCMP_ARCH_ARM: return "arm"; case SCMP_ARCH_AARCH64: return "aarch64"; case SCMP_ARCH_LOONGARCH64: return "loongarch64"; case SCMP_ARCH_M68K: return "m68k"; case SCMP_ARCH_MIPS: return "mips"; case SCMP_ARCH_MIPSEL: return "mipsel"; case SCMP_ARCH_MIPS64: return "mips64"; case SCMP_ARCH_MIPSEL64: return "mipsel64"; case SCMP_ARCH_MIPS64N32: return "mips64n32"; case SCMP_ARCH_MIPSEL64N32: return "mipsel64n32"; case SCMP_ARCH_PARISC: return "parisc"; case SCMP_ARCH_PARISC64: return "parisc64"; case SCMP_ARCH_PPC64: return "ppc64"; case SCMP_ARCH_PPC64LE: return "ppc64le"; case SCMP_ARCH_PPC: return "ppc"; case SCMP_ARCH_S390X: return "s390x"; case SCMP_ARCH_S390: return "s390"; case SCMP_ARCH_RISCV64: return "riscv64"; case SCMP_ARCH_SHEB: return "sheb"; case SCMP_ARCH_SH: return "sh"; default: return "UNKNOWN"; } } /** * Display a string representation of the node argument * @param fds the file stream to send the output * @param arch the architecture definition * @param node the node */ static void _pfc_arg(FILE *fds, const struct arch_def *arch, const struct db_arg_chain_tree *node) { if (arch->size == ARCH_SIZE_64) { if (arch_arg_offset_hi(arch, node->arg) == node->arg_offset) fprintf(fds, "$a%d.hi32", node->arg); else fprintf(fds, "$a%d.lo32", node->arg); } else fprintf(fds, "$a%d", node->arg); } /** * Display a string representation of the filter action * @param fds the file stream to send the output * @param action the action */ static void _pfc_action(FILE *fds, uint32_t action) { switch (action & SECCOMP_RET_ACTION_FULL) { case SCMP_ACT_KILL_PROCESS: fprintf(fds, "action KILL_PROCESS;\n"); break; case SCMP_ACT_KILL_THREAD: fprintf(fds, "action KILL;\n"); break; case SCMP_ACT_TRAP: fprintf(fds, "action TRAP;\n"); break; case SCMP_ACT_ERRNO(0): fprintf(fds, "action ERRNO(%u);\n", (action & 0x0000ffff)); break; case SCMP_ACT_TRACE(0): fprintf(fds, "action TRACE(%u);\n", (action & 0x0000ffff)); break; case SCMP_ACT_LOG: fprintf(fds, "action LOG;\n"); break; case SCMP_ACT_ALLOW: fprintf(fds, "action ALLOW;\n"); break; default: fprintf(fds, "action 0x%x;\n", action); } } /** * Indent the output stream * @param fds the file stream to send the output * @param lvl the indentation level * * This function indents the output stream with whitespace based on the * requested indentation level. */ static void _indent(FILE *fds, unsigned int lvl) { while (lvl-- > 0) fprintf(fds, " "); } /** * Generate the pseudo filter code for an argument chain * @param arch the architecture definition * @param node the head of the argument chain * @param lvl the indentation level * @param fds the file stream to send the output * * This function generates the pseudo filter code representation of the given * argument chain and writes it to the given output stream. * */ static void _gen_pfc_chain(const struct arch_def *arch, const struct db_arg_chain_tree *node, unsigned int lvl, FILE *fds) { const struct db_arg_chain_tree *c_iter; /* get to the start */ c_iter = node; while (c_iter->lvl_prv != NULL) c_iter = c_iter->lvl_prv; while (c_iter != NULL) { /* comparison operation */ _indent(fds, lvl); fprintf(fds, "if ("); _pfc_arg(fds, arch, c_iter); switch (c_iter->op) { case SCMP_CMP_EQ: fprintf(fds, " == "); break; case SCMP_CMP_GE: fprintf(fds, " >= "); break; case SCMP_CMP_GT: fprintf(fds, " > "); break; case SCMP_CMP_MASKED_EQ: fprintf(fds, " & 0x%.8x == ", c_iter->mask); break; case SCMP_CMP_NE: case SCMP_CMP_LT: case SCMP_CMP_LE: default: fprintf(fds, " ??? "); } fprintf(fds, "%u)\n", c_iter->datum); /* true result */ if (c_iter->act_t_flg) { _indent(fds, lvl + 1); _pfc_action(fds, c_iter->act_t); } else if (c_iter->nxt_t != NULL) _gen_pfc_chain(arch, c_iter->nxt_t, lvl + 1, fds); /* false result */ if (c_iter->act_f_flg) { _indent(fds, lvl); fprintf(fds, "else\n"); _indent(fds, lvl + 1); _pfc_action(fds, c_iter->act_f); } else if (c_iter->nxt_f != NULL) { _indent(fds, lvl); fprintf(fds, "else\n"); _gen_pfc_chain(arch, c_iter->nxt_f, lvl + 1, fds); } c_iter = c_iter->lvl_nxt; } } /** * Generate pseudo filter code for a syscall * @param arch the architecture definition * @param sys the syscall filter * @param fds the file stream to send the output * * This function generates a pseudo filter code representation of the given * syscall filter and writes it to the given output stream. * */ static void _gen_pfc_syscall(const struct arch_def *arch, const struct db_sys_list *sys, FILE *fds, int lvl) { unsigned int sys_num = sys->num; const char *sys_name = arch_syscall_resolve_num(arch, sys_num); _indent(fds, lvl); fprintf(fds, "# filter for syscall \"%s\" (%u) [priority: %d]\n", (sys_name ? sys_name : "UNKNOWN"), sys_num, sys->priority); _indent(fds, lvl); fprintf(fds, "if ($syscall == %u)\n", sys_num); if (sys->chains == NULL) { _indent(fds, lvl + 1); _pfc_action(fds, sys->action); } else _gen_pfc_chain(arch, sys->chains, lvl + 1, fds); } #define SYSCALLS_PER_NODE (4) static int _get_bintree_levels(unsigned int syscall_cnt, uint32_t optimize) { unsigned int i = 0, max_level; if (optimize != 2) /* Only use a binary tree if requested */ return 0; if (syscall_cnt == 0) return 0; do { max_level = SYSCALLS_PER_NODE << i; i++; } while(max_level < syscall_cnt); return i; } static int _get_bintree_syscall_num(const struct pfc_sys_list *cur, int lookahead_cnt, int *const num) { while (lookahead_cnt > 0 && cur != NULL) { cur = cur->next; lookahead_cnt--; } if (cur == NULL) return -EFAULT; *num = cur->sys->num; return 0; } static int _sys_num_sort(struct db_sys_list *syscalls, struct pfc_sys_list **p_head) { struct pfc_sys_list *p_iter = NULL, *p_new, *p_prev; struct db_sys_list *s_iter; db_list_foreach(s_iter, syscalls) { p_new = zmalloc(sizeof(*p_new)); if (p_new == NULL) { return -ENOMEM; } p_new->sys = s_iter; p_prev = NULL; p_iter = *p_head; while (p_iter != NULL && s_iter->num < p_iter->sys->num) { p_prev = p_iter; p_iter = p_iter->next; } if (*p_head == NULL) *p_head = p_new; else if (p_prev == NULL) { p_new->next = *p_head; *p_head = p_new; } else { p_new->next = p_iter; p_prev->next = p_new; } } return 0; } static int _sys_priority_sort(struct db_sys_list *syscalls, struct pfc_sys_list **p_head) { struct pfc_sys_list *p_iter = NULL, *p_new, *p_prev; struct db_sys_list *s_iter; db_list_foreach(s_iter, syscalls) { p_new = zmalloc(sizeof(*p_new)); if (p_new == NULL) { return -ENOMEM; } p_new->sys = s_iter; p_prev = NULL; p_iter = *p_head; while (p_iter != NULL && s_iter->priority < p_iter->sys->priority) { p_prev = p_iter; p_iter = p_iter->next; } if (*p_head == NULL) *p_head = p_new; else if (p_prev == NULL) { p_new->next = *p_head; *p_head = p_new; } else { p_new->next = p_iter; p_prev->next = p_new; } } return 0; } static int _sys_sort(struct db_sys_list *syscalls, struct pfc_sys_list **p_head, uint32_t optimize) { if (optimize != 2) return _sys_priority_sort(syscalls, p_head); else /* sort by number for the binary tree */ return _sys_num_sort(syscalls, p_head); } /** * Generate pseudo filter code for an architecture * @param col the seccomp filter collection * @param db the single seccomp filter * @param fds the file stream to send the output * * This function generates a pseudo filter code representation of the given * filter DB and writes it to the given output stream. Returns zero on * success, negative values on failure. * */ static int _gen_pfc_arch(const struct db_filter_col *col, const struct db_filter *db, FILE *fds, uint32_t optimize) { int rc = 0, i = 0, lookahead_num; unsigned int syscall_cnt = 0, bintree_levels, level, indent = 1; struct pfc_sys_list *p_iter = NULL, *p_head = NULL; /* sort the syscall list */ rc = _sys_sort(db->syscalls, &p_head, optimize); if (rc < 0) goto arch_return; bintree_levels = _get_bintree_levels(db->syscall_cnt, optimize); fprintf(fds, "# filter for arch %s (%u)\n", _pfc_arch(db->arch), db->arch->token_bpf); fprintf(fds, "if ($arch == %u)\n", db->arch->token_bpf); p_iter = p_head; while (p_iter != NULL) { if (!p_iter->sys->valid) { p_iter = p_iter->next; continue; } for (i = bintree_levels - 1; i > 0; i--) { level = SYSCALLS_PER_NODE << i; if (syscall_cnt == 0 || (syscall_cnt % level) == 0) { rc = _get_bintree_syscall_num(p_iter, level / 2, &lookahead_num); if (rc < 0) /* We have reached the end of the bintree. * There aren't enough syscalls to construct * any more if-elses. */ continue; _indent(fds, indent); fprintf(fds, "if ($syscall > %u)\n", lookahead_num); indent++; } else if ((syscall_cnt % (level / 2)) == 0) { lookahead_num = p_iter->sys->num; _indent(fds, indent - 1); fprintf(fds, "else # ($syscall <= %u)\n", p_iter->sys->num); } } _gen_pfc_syscall(db->arch, p_iter->sys, fds, indent); syscall_cnt++; p_iter = p_iter->next; /* undo the indentations as the else statements complete */ for (i = 0; i < bintree_levels; i++) { if (syscall_cnt % ((SYSCALLS_PER_NODE * 2) << i) == 0) indent--; } } _indent(fds, 1); fprintf(fds, "# default action\n"); _indent(fds, 1); _pfc_action(fds, col->attr.act_default); arch_return: while (p_head != NULL) { p_iter = p_head; p_head = p_head->next; free(p_iter); } return rc; } /** * Generate a pseudo filter code string representation * @param col the seccomp filter collection * @param fd the fd to send the output * * This function generates a pseudo filter code representation of the given * filter collection and writes it to the given fd. Returns zero on success, * negative errno values on failure. * */ int gen_pfc_generate(const struct db_filter_col *col, int fd) { int newfd; unsigned int iter; FILE *fds; newfd = dup(fd); if (newfd < 0) return -errno; fds = fdopen(newfd, "a"); if (fds == NULL) { close(newfd); return -errno; } /* generate the pfc */ fprintf(fds, "#\n"); fprintf(fds, "# pseudo filter code start\n"); fprintf(fds, "#\n"); for (iter = 0; iter < col->filter_cnt; iter++) _gen_pfc_arch(col, col->filters[iter], fds, col->attr.optimize); fprintf(fds, "# invalid architecture action\n"); _pfc_action(fds, col->attr.act_badarch); fprintf(fds, "#\n"); fprintf(fds, "# pseudo filter code end\n"); fprintf(fds, "#\n"); fflush(fds); fclose(fds); return 0; } libseccomp-2.5.4/src/arch-sh.h0000644000000000000000000000130514467535324014641 0ustar rootroot/* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _ARCH_SH_H #define _ARCH_SH_H #include "arch.h" ARCH_DECL(sheb) ARCH_DECL(sh) #endif libseccomp-2.5.4/src/gen_bpf.h0000644000000000000000000000232014467535324014712 0ustar rootroot/** * Seccomp BPF Translator * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _TRANSLATOR_BPF_H #define _TRANSLATOR_BPF_H #include #include "arch.h" #include "db.h" #include "system.h" /* NOTE - do not change this structure, it is part of the prctl() API */ struct bpf_program { uint16_t blk_cnt; bpf_instr_raw *blks; }; #define BPF_PGM_SIZE(x) \ ((x)->blk_cnt * sizeof(*((x)->blks))) int gen_bpf_generate(const struct db_filter_col *col, struct bpf_program **prgm_ptr); void gen_bpf_release(struct bpf_program *program); #endif libseccomp-2.5.4/src/arch-ppc.c0000644000000000000000000000316314467535324015010 0ustar rootroot/** * Enhanced Seccomp PPC Specific Code * * Copyright (c) 2015 Freescale * Author: Bogdan Purcareata * */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include "db.h" #include "syscalls.h" #include "arch.h" #include "arch-ppc.h" /* ppc syscall numbers */ #define __ppc_NR_socketcall 102 #define __ppc_NR_ipc 117 ARCH_DEF(ppc) const struct arch_def arch_def_ppc = { .token = SCMP_ARCH_PPC, .token_bpf = AUDIT_ARCH_PPC, .size = ARCH_SIZE_32, .endian = ARCH_ENDIAN_BIG, .sys_socketcall = __ppc_NR_socketcall, .sys_ipc = __ppc_NR_ipc, .syscall_resolve_name = abi_syscall_resolve_name_munge, .syscall_resolve_name_raw = ppc_syscall_resolve_name, .syscall_resolve_num = abi_syscall_resolve_num_munge, .syscall_resolve_num_raw = ppc_syscall_resolve_num, .syscall_rewrite = abi_syscall_rewrite, .rule_add = abi_rule_add, .syscall_name_kver = ppc_syscall_name_kver, .syscall_num_kver = ppc_syscall_num_kver, }; libseccomp-2.5.4/src/arch-parisc.c0000644000000000000000000000122214467535324015501 0ustar rootroot/* * Copyright (c) 2016 Helge Deller * Author: Helge Deller */ #include #include #include #include "arch.h" #include "arch-parisc.h" #include "syscalls.h" ARCH_DEF(parisc) const struct arch_def arch_def_parisc = { .token = SCMP_ARCH_PARISC, .token_bpf = AUDIT_ARCH_PARISC, .size = ARCH_SIZE_32, .endian = ARCH_ENDIAN_BIG, .syscall_resolve_name_raw = parisc_syscall_resolve_name, .syscall_resolve_num_raw = parisc_syscall_resolve_num, .syscall_rewrite = NULL, .rule_add = NULL, .syscall_name_kver = parisc_syscall_name_kver, .syscall_num_kver = parisc_syscall_num_kver, }; libseccomp-2.5.4/src/arch-x86.c0000644000000000000000000000312614467535324014652 0ustar rootroot/** * Enhanced Seccomp x86 Specific Code * * Copyright (c) 2012,2016 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include "db.h" #include "syscalls.h" #include "arch.h" #include "arch-x86.h" /* x86 syscall numbers */ #define __x86_NR_socketcall 102 #define __x86_NR_ipc 117 ARCH_DEF(x86) const struct arch_def arch_def_x86 = { .token = SCMP_ARCH_X86, .token_bpf = AUDIT_ARCH_I386, .size = ARCH_SIZE_32, .endian = ARCH_ENDIAN_LITTLE, .sys_socketcall = __x86_NR_socketcall, .sys_ipc = __x86_NR_ipc, .syscall_resolve_name = abi_syscall_resolve_name_munge, .syscall_resolve_name_raw = x86_syscall_resolve_name, .syscall_resolve_num = abi_syscall_resolve_num_munge, .syscall_resolve_num_raw = x86_syscall_resolve_num, .syscall_rewrite = abi_syscall_rewrite, .rule_add = abi_rule_add, .syscall_name_kver = x86_syscall_name_kver, .syscall_num_kver = x86_syscall_num_kver, }; libseccomp-2.5.4/src/hash.c0000644000000000000000000000274414467535325014243 0ustar rootroot/** * Seccomp Library hash code * */ /* * This code is based on MurmurHash3.cpp from Austin Appleby and is placed in * the public domain. * * https://github.com/aappleby/smhasher * */ #include #include #include "hash.h" static inline uint32_t getblock32(const uint32_t *p, int i) { return p[i]; } static inline uint32_t rotl32(uint32_t x, int8_t r) { return (x << r) | (x >> (32 - r)); } static inline uint32_t fmix32(uint32_t h) { h ^= h >> 16; h *= 0x85ebca6b; h ^= h >> 13; h *= 0xc2b2ae35; h ^= h >> 16; return h; } /* NOTE: this is an implementation of MurmurHash3_x86_32 */ uint32_t hash(const void *key, size_t length) { const uint8_t *data = (const uint8_t *)key; const uint32_t *blocks; const uint8_t *tail; const int nblocks = length / 4; const uint32_t c1 = 0xcc9e2d51; const uint32_t c2 = 0x1b873593; uint32_t k1; uint32_t k2 = 0; int i; /* NOTE: we always force a seed of 0 */ uint32_t h1 = 0; /* body */ blocks = (const uint32_t *)(data + nblocks * 4); for(i = -nblocks; i; i++) { k1 = getblock32(blocks, i); k1 *= c1; k1 = rotl32(k1, 15); k1 *= c2; h1 ^= k1; h1 = rotl32(h1, 13); h1 = h1 * 5 + 0xe6546b64; } /* tail */ tail = (const uint8_t *)(data + nblocks * 4); switch(length & 3) { case 3: k2 ^= tail[2] << 16; case 2: k2 ^= tail[1] << 8; case 1: k2 ^= tail[0]; k2 *= c1; k2 = rotl32(k2, 15); k2 *= c2; h1 ^= k2; }; /* finalization */ h1 ^= length; h1 = fmix32(h1); return h1; } libseccomp-2.5.4/src/arch.c0000644000000000000000000003250714467535324014234 0ustar rootroot/** * Enhanced Seccomp Architecture/Machine Specific Code * * Copyright (c) 2012,2018 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include #include #include #include "arch.h" #include "arch-x86.h" #include "arch-x86_64.h" #include "arch-x32.h" #include "arch-arm.h" #include "arch-aarch64.h" #include "arch-loongarch64.h" #include "arch-m68k.h" #include "arch-mips.h" #include "arch-mips64.h" #include "arch-mips64n32.h" #include "arch-parisc.h" #include "arch-parisc64.h" #include "arch-ppc.h" #include "arch-ppc64.h" #include "arch-riscv64.h" #include "arch-s390.h" #include "arch-s390x.h" #include "arch-sh.h" #include "db.h" #include "system.h" #define default_arg_offset(x) (offsetof(struct seccomp_data, args[x])) #if __i386__ const struct arch_def *arch_def_native = &arch_def_x86; #elif __x86_64__ #ifdef __ILP32__ const struct arch_def *arch_def_native = &arch_def_x32; #else const struct arch_def *arch_def_native = &arch_def_x86_64; #endif /* __ILP32__ */ #elif __arm__ const struct arch_def *arch_def_native = &arch_def_arm; #elif __aarch64__ const struct arch_def *arch_def_native = &arch_def_aarch64; #elif __loongarch_lp64 const struct arch_def *arch_def_native = &arch_def_loongarch64; #elif __m68k__ const struct arch_def *arch_def_native = &arch_def_m68k; #elif __mips__ && _MIPS_SIM == _MIPS_SIM_ABI32 #if __MIPSEB__ const struct arch_def *arch_def_native = &arch_def_mips; #elif __MIPSEL__ const struct arch_def *arch_def_native = &arch_def_mipsel; #endif /* _MIPS_SIM_ABI32 */ #elif __mips__ && _MIPS_SIM == _MIPS_SIM_ABI64 #if __MIPSEB__ const struct arch_def *arch_def_native = &arch_def_mips64; #elif __MIPSEL__ const struct arch_def *arch_def_native = &arch_def_mipsel64; #endif /* _MIPS_SIM_ABI64 */ #elif __mips__ && _MIPS_SIM == _MIPS_SIM_NABI32 #if __MIPSEB__ const struct arch_def *arch_def_native = &arch_def_mips64n32; #elif __MIPSEL__ const struct arch_def *arch_def_native = &arch_def_mipsel64n32; #endif /* _MIPS_SIM_NABI32 */ #elif __hppa64__ /* hppa64 must be checked before hppa */ const struct arch_def *arch_def_native = &arch_def_parisc64; #elif __hppa__ const struct arch_def *arch_def_native = &arch_def_parisc; #elif __PPC64__ #ifdef __BIG_ENDIAN__ const struct arch_def *arch_def_native = &arch_def_ppc64; #else const struct arch_def *arch_def_native = &arch_def_ppc64le; #endif #elif __PPC__ const struct arch_def *arch_def_native = &arch_def_ppc; #elif __s390x__ /* s390x must be checked before s390 */ const struct arch_def *arch_def_native = &arch_def_s390x; #elif __s390__ const struct arch_def *arch_def_native = &arch_def_s390; #elif __riscv && __riscv_xlen == 64 const struct arch_def *arch_def_native = &arch_def_riscv64; #elif __sh__ #ifdef __BIG_ENDIAN__ const struct arch_def *arch_def_native = &arch_def_sheb; #else const struct arch_def *arch_def_native = &arch_def_sh; #endif #else #error the arch code needs to know about your machine type #endif /* machine type guess */ /** * Validate the architecture token * @param arch the architecture token * * Verify the given architecture token; return zero if valid, -EINVAL if not. * */ int arch_valid(uint32_t arch) { return (arch_def_lookup(arch) ? 0 : -EINVAL); } /** * Lookup the architecture definition * @param token the architecture token * * Return the matching architecture definition, returns NULL on failure. * */ const struct arch_def *arch_def_lookup(uint32_t token) { switch (token) { case SCMP_ARCH_X86: return &arch_def_x86; case SCMP_ARCH_X86_64: return &arch_def_x86_64; case SCMP_ARCH_X32: return &arch_def_x32; case SCMP_ARCH_ARM: return &arch_def_arm; case SCMP_ARCH_AARCH64: return &arch_def_aarch64; case SCMP_ARCH_LOONGARCH64: return &arch_def_loongarch64; case SCMP_ARCH_M68K: return &arch_def_m68k; case SCMP_ARCH_MIPS: return &arch_def_mips; case SCMP_ARCH_MIPSEL: return &arch_def_mipsel; case SCMP_ARCH_MIPS64: return &arch_def_mips64; case SCMP_ARCH_MIPSEL64: return &arch_def_mipsel64; case SCMP_ARCH_MIPS64N32: return &arch_def_mips64n32; case SCMP_ARCH_MIPSEL64N32: return &arch_def_mipsel64n32; case SCMP_ARCH_PARISC: return &arch_def_parisc; case SCMP_ARCH_PARISC64: return &arch_def_parisc64; case SCMP_ARCH_PPC: return &arch_def_ppc; case SCMP_ARCH_PPC64: return &arch_def_ppc64; case SCMP_ARCH_PPC64LE: return &arch_def_ppc64le; case SCMP_ARCH_S390: return &arch_def_s390; case SCMP_ARCH_S390X: return &arch_def_s390x; case SCMP_ARCH_RISCV64: return &arch_def_riscv64; case SCMP_ARCH_SHEB: return &arch_def_sheb; case SCMP_ARCH_SH: return &arch_def_sh; } return NULL; } /** * Lookup the architecture definition by name * @param arch_name the architecture name * * Return the matching architecture definition, returns NULL on failure. * */ const struct arch_def *arch_def_lookup_name(const char *arch_name) { if (strcmp(arch_name, "x86") == 0) return &arch_def_x86; else if (strcmp(arch_name, "x86_64") == 0) return &arch_def_x86_64; else if (strcmp(arch_name, "x32") == 0) return &arch_def_x32; else if (strcmp(arch_name, "arm") == 0) return &arch_def_arm; else if (strcmp(arch_name, "aarch64") == 0) return &arch_def_aarch64; else if (strcmp(arch_name, "loongarch64") == 0) return &arch_def_loongarch64; else if (strcmp(arch_name, "m68k") == 0) return &arch_def_m68k; else if (strcmp(arch_name, "mips") == 0) return &arch_def_mips; else if (strcmp(arch_name, "mipsel") == 0) return &arch_def_mipsel; else if (strcmp(arch_name, "mips64") == 0) return &arch_def_mips64; else if (strcmp(arch_name, "mipsel64") == 0) return &arch_def_mipsel64; else if (strcmp(arch_name, "mips64n32") == 0) return &arch_def_mips64n32; else if (strcmp(arch_name, "mipsel64n32") == 0) return &arch_def_mipsel64n32; else if (strcmp(arch_name, "parisc64") == 0) return &arch_def_parisc64; else if (strcmp(arch_name, "parisc") == 0) return &arch_def_parisc; else if (strcmp(arch_name, "ppc") == 0) return &arch_def_ppc; else if (strcmp(arch_name, "ppc64") == 0) return &arch_def_ppc64; else if (strcmp(arch_name, "ppc64le") == 0) return &arch_def_ppc64le; else if (strcmp(arch_name, "s390") == 0) return &arch_def_s390; else if (strcmp(arch_name, "s390x") == 0) return &arch_def_s390x; else if (strcmp(arch_name, "riscv64") == 0) return &arch_def_riscv64; else if (strcmp(arch_name, "sheb") == 0) return &arch_def_sheb; else if (strcmp(arch_name, "sh") == 0) return &arch_def_sh; return NULL; } /** * Determine the argument offset for the lower 32 bits * @param arch the architecture definition * @param arg the argument number * * Determine the correct offset for the low 32 bits of the given argument based * on the architecture definition. Returns the offset on success, negative * values on failure. * */ int arch_arg_offset_lo(const struct arch_def *arch, unsigned int arg) { if (arch_valid(arch->token) < 0) return -EDOM; switch (arch->endian) { case ARCH_ENDIAN_LITTLE: return default_arg_offset(arg); break; case ARCH_ENDIAN_BIG: return default_arg_offset(arg) + 4; break; default: return -EDOM; } } /** * Determine the argument offset for the high 32 bits * @param arch the architecture definition * @param arg the argument number * * Determine the correct offset for the high 32 bits of the given argument * based on the architecture definition. Returns the offset on success, * negative values on failure. * */ int arch_arg_offset_hi(const struct arch_def *arch, unsigned int arg) { if (arch_valid(arch->token) < 0 || arch->size != ARCH_SIZE_64) return -EDOM; switch (arch->endian) { case ARCH_ENDIAN_LITTLE: return default_arg_offset(arg) + 4; break; case ARCH_ENDIAN_BIG: return default_arg_offset(arg); break; default: return -EDOM; } } /** * Determine the argument offset * @param arch the architecture definition * @param arg the argument number * * Determine the correct offset for the given argument based on the * architecture definition. Returns the offset on success, negative values on * failure. * */ int arch_arg_offset(const struct arch_def *arch, unsigned int arg) { return arch_arg_offset_lo(arch, arg); } /** * Resolve a syscall name to a number * @param arch the architecture definition * @param name the syscall name * * Resolve the given syscall name to the syscall number based on the given * architecture. Returns the syscall number on success, including negative * pseudo syscall numbers; returns __NR_SCMP_ERROR on failure. * */ int arch_syscall_resolve_name(const struct arch_def *arch, const char *name) { if (arch->syscall_resolve_name) return (*arch->syscall_resolve_name)(arch, name); if (arch->syscall_resolve_name_raw) return (*arch->syscall_resolve_name_raw)(name); return __NR_SCMP_ERROR; } /** * Resolve a syscall number to a name * @param arch the architecture definition * @param num the syscall number * * Resolve the given syscall number to the syscall name based on the given * architecture. Returns a pointer to the syscall name string on success, * including pseudo syscall names; returns NULL on failure. * */ const char *arch_syscall_resolve_num(const struct arch_def *arch, int num) { if (arch->syscall_resolve_num) return (*arch->syscall_resolve_num)(arch, num); if (arch->syscall_resolve_num_raw) return (*arch->syscall_resolve_num_raw)(num); return NULL; } /** * Translate the syscall number * @param arch the architecture definition * @param syscall the syscall number * * Translate the syscall number, in the context of the native architecture, to * the provided architecture. Returns zero on success, negative values on * failure. * */ int arch_syscall_translate(const struct arch_def *arch, int *syscall) { int sc_num; const char *sc_name; /* special handling for syscall -1 */ if (*syscall == -1) return 0; if (arch->token != arch_def_native->token) { sc_name = arch_syscall_resolve_num(arch_def_native, *syscall); if (sc_name == NULL) return -EFAULT; sc_num = arch_syscall_resolve_name(arch, sc_name); if (sc_num == __NR_SCMP_ERROR) return -EFAULT; *syscall = sc_num; } return 0; } /** * Rewrite a syscall value to match the architecture * @param arch the architecture definition * @param syscall the syscall number * * Syscalls can vary across different architectures so this function rewrites * the syscall into the correct value for the specified architecture. Returns * zero on success, -EDOM if the syscall is not defined for @arch, and negative * values on failure. * */ int arch_syscall_rewrite(const struct arch_def *arch, int *syscall) { int sys = *syscall; if (sys >= -1) { /* we shouldn't be here - no rewrite needed */ return 0; } else if (sys > -100) { /* -2 to -99 are reserved values */ return -EINVAL; } else if (sys > -10000) { /* rewritable syscalls */ if (arch->syscall_rewrite) (*arch->syscall_rewrite)(arch, syscall); } /* syscalls not defined on this architecture */ if ((*syscall) < 0) return -EDOM; return 0; } /** * Add a new rule to the specified filter * @param db the seccomp filter db * @param strict the rule * * This function adds a new argument/comparison/value to the seccomp filter for * a syscall; multiple arguments can be specified and they will be chained * together (essentially AND'd together) in the filter. When the strict flag * is true the function will fail if the exact rule can not be added to the * filter, if the strict flag is false the function will not fail if the * function needs to adjust the rule due to architecture specifics. Returns * zero on success, negative values on failure. * * It is important to note that in the case of failure the db may be corrupted, * the caller must use the transaction mechanism if the db integrity is * important. * */ int arch_filter_rule_add(struct db_filter *db, const struct db_api_rule_list *rule) { int rc = 0; int syscall; struct db_api_rule_list *rule_dup = NULL; /* create our own rule that we can munge */ rule_dup = db_rule_dup(rule); if (rule_dup == NULL) return -ENOMEM; /* translate the syscall */ rc = arch_syscall_translate(db->arch, &rule_dup->syscall); if (rc < 0) goto rule_add_return; syscall = rule_dup->syscall; /* add the new rule to the existing filter */ if (syscall == -1 || db->arch->rule_add == NULL) { /* syscalls < -1 require a db->arch->rule_add() function */ if (syscall < -1 && rule_dup->strict) { rc = -EDOM; goto rule_add_return; } rc = db_rule_add(db, rule_dup); } else rc = (db->arch->rule_add)(db, rule_dup); rule_add_return: /* NOTE: another reminder that we don't do any db error recovery here, * use the transaction mechanism as previously mentioned */ if (rule_dup != NULL) free(rule_dup); return rc; } libseccomp-2.5.4/src/arch-m68k.h0000644000000000000000000000206314467535324015016 0ustar rootroot/** * Enhanced Seccomp m68k Specific Code * * Copyright (c) 2015 Freescale * 2017-2023 John Paul Adrian Glaubitz * Author: Bogdan Purcareata * John Paul Adrian Glaubitz * * Derived from the PPC-specific code * */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _ARCH_M68K_H #define _ARCH_M68K_H #include "arch.h" ARCH_DECL(m68k) #endif libseccomp-2.5.4/src/arch-ppc.h0000644000000000000000000000155614467535324015021 0ustar rootroot/** * Enhanced Seccomp PPC Specific Code * * Copyright (c) 2015 Freescale * Author: Bogdan Purcareata * */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _ARCH_PPC_H #define _ARCH_PPC_H #include "arch.h" ARCH_DECL(ppc) #endif libseccomp-2.5.4/src/gen_pfc.h0000644000000000000000000000157114467535324014722 0ustar rootroot/** * Seccomp String Translator * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _TRANSLATOR_STR_H #define _TRANSLATOR_STR_H #include "db.h" int gen_pfc_generate(const struct db_filter_col *col, int fd); #endif libseccomp-2.5.4/src/arch-x86_64.c0000644000000000000000000000245214467535324015164 0ustar rootroot/** * Enhanced Seccomp x86_64 Specific Code * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "arch.h" #include "arch-x86_64.h" #include "syscalls.h" ARCH_DEF(x86_64) const struct arch_def arch_def_x86_64 = { .token = SCMP_ARCH_X86_64, .token_bpf = AUDIT_ARCH_X86_64, .size = ARCH_SIZE_64, .endian = ARCH_ENDIAN_LITTLE, .syscall_resolve_name_raw = x86_64_syscall_resolve_name, .syscall_resolve_num_raw = x86_64_syscall_resolve_num, .syscall_rewrite = NULL, .rule_add = NULL, .syscall_name_kver = x86_64_syscall_name_kver, .syscall_num_kver = x86_64_syscall_num_kver, }; libseccomp-2.5.4/src/hash.h0000644000000000000000000000032114467535325014235 0ustar rootroot/** * Seccomp Library hash code * * See hash.c for information on the implementation. * */ #ifndef _HASH_H #define _HASH_H #include uint32_t hash(const void *key, size_t length); #endif libseccomp-2.5.4/src/arch-ppc64.c0000644000000000000000000000433014467535324015157 0ustar rootroot/** * Enhanced Seccomp PPC64 Specific Code * * Copyright (c) 2014 Red Hat * Author: Paul Moore * */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include "db.h" #include "syscalls.h" #include "arch.h" #include "arch-ppc64.h" /* ppc64 syscall numbers */ #define __ppc64_NR_socketcall 102 #define __ppc64_NR_ipc 117 ARCH_DEF(ppc64) const struct arch_def arch_def_ppc64 = { .token = SCMP_ARCH_PPC64, .token_bpf = AUDIT_ARCH_PPC64, .size = ARCH_SIZE_64, .endian = ARCH_ENDIAN_BIG, .sys_socketcall = __ppc64_NR_socketcall, .sys_ipc = __ppc64_NR_ipc, .syscall_resolve_name = abi_syscall_resolve_name_munge, .syscall_resolve_name_raw = ppc64_syscall_resolve_name, .syscall_resolve_num = abi_syscall_resolve_num_munge, .syscall_resolve_num_raw = ppc64_syscall_resolve_num, .syscall_rewrite = abi_syscall_rewrite, .rule_add = abi_rule_add, .syscall_name_kver = ppc64_syscall_name_kver, .syscall_num_kver = ppc64_syscall_num_kver, }; const struct arch_def arch_def_ppc64le = { .token = SCMP_ARCH_PPC64LE, .token_bpf = AUDIT_ARCH_PPC64LE, .size = ARCH_SIZE_64, .endian = ARCH_ENDIAN_LITTLE, .sys_socketcall = __ppc64_NR_socketcall, .sys_ipc = __ppc64_NR_ipc, .syscall_resolve_name = abi_syscall_resolve_name_munge, .syscall_resolve_name_raw = ppc64_syscall_resolve_name, .syscall_resolve_num = abi_syscall_resolve_num_munge, .syscall_resolve_num_raw = ppc64_syscall_resolve_num, .syscall_rewrite = abi_syscall_rewrite, .rule_add = abi_rule_add, .syscall_name_kver = ppc64_syscall_name_kver, .syscall_num_kver = ppc64_syscall_num_kver, }; libseccomp-2.5.4/src/arch-gperf-generate0000755000000000000000000000161714467535324016705 0ustar rootroot#!/bin/bash # NOTE: changes to the arch_syscall_table struct in syscalls.h will affect # this script/gperf - BEWARE! ### # helper functions function exit_usage() { echo "usage: $0 " exit 1 } ### # main # sanity check [[ ! -r "$1" || ! -r "$2" ]] && exit_usage sys_csv=$1 gperf_tmpl=$2 sys_csv_tmp=$(mktemp -t generate_syscalls_XXXXXX) # filter and prepare the syscall csv file cat $sys_csv | grep -v '^#' | nl -ba -s, -v0 | \ sed -e '{s|^[[:space:]]\+\([0-9]\+\),\([^,]\+\),\(.*\)|\2,\1,\3|;};' \ -e '{:r1; {s|\([^,]\+\)\(.*\)[^_]PNR|\1\2,__PNR_\1|g;}; t r1};' \ -e '{s|,KV_|,SCMP_KV_|g;};' \ > $sys_csv_tmp [[ $? -ne 0 ]] && exit 1 # create the gperf file sed -e "/@@SYSCALLS_TABLE@@/r $sys_csv_tmp" \ -e '/@@SYSCALLS_TABLE@@/d' \ $gperf_tmpl > syscalls.perf [[ $? -ne 0 ]] && exit 1 # cleanup rm -f $sys_csv_tmp exit 0 libseccomp-2.5.4/src/arch-s390.c0000644000000000000000000000167014467535324014725 0ustar rootroot/* * Copyright 2015 IBM * Author: Jan Willeke */ #include #include #include #include #include "db.h" #include "syscalls.h" #include "arch.h" #include "arch-s390.h" /* s390 syscall numbers */ #define __s390_NR_socketcall 102 #define __s390_NR_ipc 117 ARCH_DEF(s390) const struct arch_def arch_def_s390 = { .token = SCMP_ARCH_S390, .token_bpf = AUDIT_ARCH_S390, .size = ARCH_SIZE_32, .endian = ARCH_ENDIAN_BIG, .sys_socketcall = __s390_NR_socketcall, .sys_ipc = __s390_NR_ipc, .syscall_resolve_name = abi_syscall_resolve_name_munge, .syscall_resolve_name_raw = s390_syscall_resolve_name, .syscall_resolve_num = abi_syscall_resolve_num_munge, .syscall_resolve_num_raw = s390_syscall_resolve_num, .syscall_rewrite = abi_syscall_rewrite, .rule_add = abi_rule_add, .syscall_name_kver = s390_syscall_name_kver, .syscall_num_kver = s390_syscall_num_kver, }; libseccomp-2.5.4/src/arch-x32.h0000644000000000000000000000157414467535324014653 0ustar rootroot/** * Enhanced Seccomp x32 Specific Code * * Copyright (c) 2013 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _ARCH_X32_H #define _ARCH_X32_H #include "arch.h" #define X32_SYSCALL_BIT 0x40000000 ARCH_DECL(x32) #endif libseccomp-2.5.4/src/arch-mips64n32.h0000644000000000000000000000156514467535324015704 0ustar rootroot/** * Enhanced Seccomp MIPS Specific Code * * Copyright (c) 2014 Red Hat * Author: Paul Moore * */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _ARCH_MIPS64N32_H #define _ARCH_MIPS64N32_H #include "arch.h" ARCH_DECL(mips64n32) ARCH_DECL(mipsel64n32) #endif libseccomp-2.5.4/src/arch-mips.h0000644000000000000000000000155714467535324015210 0ustar rootroot/** * Enhanced Seccomp MIPS Specific Code * * Copyright (c) 2014 Imagination Technologies Ltd. * Author: Markos Chandras * */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _ARCH_MIPS_H #define _ARCH_MIPS_H #include "arch.h" ARCH_DECL(mips) ARCH_DECL(mipsel) #endif libseccomp-2.5.4/src/arch-x86_64.h0000644000000000000000000000152414467535324015170 0ustar rootroot/** * Enhanced Seccomp x86_64 Specific Code * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _ARCH_x86_64_H #define _ARCH_x86_64_H #include "arch.h" ARCH_DECL(x86_64) #endif libseccomp-2.5.4/src/arch-riscv64.c0000644000000000000000000000224014467535324015521 0ustar rootroot/* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "arch.h" #include "arch-riscv64.h" #include "syscalls.h" ARCH_DEF(riscv64) const struct arch_def arch_def_riscv64 = { .token = SCMP_ARCH_RISCV64, .token_bpf = AUDIT_ARCH_RISCV64, .size = ARCH_SIZE_64, .endian = ARCH_ENDIAN_LITTLE, .syscall_resolve_name_raw = riscv64_syscall_resolve_name, .syscall_resolve_num_raw = riscv64_syscall_resolve_num, .syscall_rewrite = NULL, .rule_add = NULL, .syscall_name_kver = riscv64_syscall_name_kver, .syscall_num_kver = riscv64_syscall_num_kver, }; libseccomp-2.5.4/src/arch-mips.c0000644000000000000000000000650414467535324015200 0ustar rootroot/** * Enhanced Seccomp MIPS Specific Code * * Copyright (c) 2014 Imagination Technologies Ltd. * Author: Markos Chandras * */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include "db.h" #include "syscalls.h" #include "arch.h" #include "arch-mips.h" /* O32 ABI */ #define __SCMP_NR_BASE 4000 /* mips syscall numbers */ #define __mips_NR_socketcall (__SCMP_NR_BASE + 102) #define __mips_NR_ipc (__SCMP_NR_BASE + 117) /** * Resolve a syscall name to a number * @param name the syscall name * * Resolve the given syscall name to the syscall number using the syscall table. * Returns the syscall number on success, including negative pseudo syscall * numbers; returns __NR_SCMP_ERROR on failure. * */ int mips_syscall_resolve_name_raw(const char *name) { int sys; /* NOTE: we don't want to modify the pseudo-syscall numbers */ sys = mips_syscall_resolve_name(name); if (sys == __NR_SCMP_ERROR || sys < 0) return sys; return sys + __SCMP_NR_BASE; } /** * Resolve a syscall number to a name * @param num the syscall number * * Resolve the given syscall number to the syscall name using the syscall table. * Returns a pointer to the syscall name string on success, including pseudo * syscall names; returns NULL on failure. * */ const char *mips_syscall_resolve_num_raw(int num) { /* NOTE: we don't want to modify the pseudo-syscall numbers */ if (num >= __SCMP_NR_BASE) num -= __SCMP_NR_BASE; return mips_syscall_resolve_num(num); } ARCH_DEF(mips) const struct arch_def arch_def_mips = { .token = SCMP_ARCH_MIPS, .token_bpf = AUDIT_ARCH_MIPS, .size = ARCH_SIZE_32, .endian = ARCH_ENDIAN_BIG, .sys_socketcall = __mips_NR_socketcall, .sys_ipc = __mips_NR_ipc, .syscall_resolve_name = abi_syscall_resolve_name_munge, .syscall_resolve_name_raw = mips_syscall_resolve_name_raw, .syscall_resolve_num = abi_syscall_resolve_num_munge, .syscall_resolve_num_raw = mips_syscall_resolve_num_raw, .syscall_rewrite = abi_syscall_rewrite, .rule_add = abi_rule_add, .syscall_name_kver = mips_syscall_name_kver, .syscall_num_kver = mips_syscall_num_kver, }; const struct arch_def arch_def_mipsel = { .token = SCMP_ARCH_MIPSEL, .token_bpf = AUDIT_ARCH_MIPSEL, .size = ARCH_SIZE_32, .endian = ARCH_ENDIAN_LITTLE, .sys_socketcall = __mips_NR_socketcall, .sys_ipc = __mips_NR_ipc, .syscall_resolve_name = abi_syscall_resolve_name_munge, .syscall_resolve_name_raw = mips_syscall_resolve_name_raw, .syscall_resolve_num = abi_syscall_resolve_num_munge, .syscall_resolve_num_raw = mips_syscall_resolve_num_raw, .syscall_rewrite = abi_syscall_rewrite, .rule_add = abi_rule_add, .syscall_name_kver = mips_syscall_name_kver, .syscall_num_kver = mips_syscall_num_kver, }; libseccomp-2.5.4/src/helper.h0000644000000000000000000000160214467535325014574 0ustar rootroot/** * Helper functions for libseccomp * * Copyright (c) 2017 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _FILTER_HELPER_H #define _FILTER_HELPER_H void *zmalloc(size_t size); void *zrealloc(void *ptr, size_t old_size, size_t size); #endif libseccomp-2.5.4/src/.gitignore0000644000000000000000000000007514467535324015136 0ustar rootrootlibseccomp.a arch-syscall-dump syscalls.perf syscalls.perf.c libseccomp-2.5.4/src/arch-mips64.h0000644000000000000000000000155314467535324015356 0ustar rootroot/** * Enhanced Seccomp MIPS64 Specific Code * * Copyright (c) 2014 Red Hat * Author: Paul Moore * */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _ARCH_MIPS64_H #define _ARCH_MIPS64_H #include "arch.h" ARCH_DECL(mips64) ARCH_DECL(mipsel64) #endif libseccomp-2.5.4/src/arch-x86.h0000644000000000000000000000151014467535324014652 0ustar rootroot/** * Enhanced Seccomp x86 Specific Code * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _ARCH_X86_H #define _ARCH_X86_H #include "arch.h" ARCH_DECL(x86) #endif libseccomp-2.5.4/src/syscalls.h0000644000000000000000000000514714467535325015162 0ustar rootroot/** * Enhanced Seccomp x86_64 Syscall Table * * Copyright (c) 2012, 2020 Red Hat * Author: Paul Moore * gperf support: Giuseppe Scrivano */ #ifndef _SYSCALLS_H #define _SYSCALLS_H #include #include #include "arch-aarch64.h" #include "arch-arm.h" #include "arch.h" #include "arch-loongarch64.h" #include "arch-m68k.h" #include "arch-mips64.h" #include "arch-mips64n32.h" #include "arch-mips.h" #include "arch-parisc.h" #include "arch-ppc64.h" #include "arch-ppc.h" #include "arch-s390.h" #include "arch-s390x.h" #include "arch-sh.h" #include "arch-x32.h" #include "arch-x86_64.h" #include "arch-x86.h" #include "arch-x86.h" #include "arch-riscv64.h" /* NOTE: changes to the arch_syscall_table layout may require changes to the * generate_syscalls_perf.sh and arch-syscall-validate scripts */ struct arch_syscall_table { int name; int index; /* each arch listed here must be defined in syscalls.c */ /* NOTE: see the warning above - BEWARE! */ int x86; enum scmp_kver x86_kver; int x86_64; enum scmp_kver x86_64_kver; int x32; enum scmp_kver x32_kver; int arm; enum scmp_kver arm_kver; int aarch64; enum scmp_kver aarch64_kver; int loongarch64; enum scmp_kver loongarch64_kver; int m68k; enum scmp_kver m68k_kver; int mips; enum scmp_kver mips_kver; int mips64; enum scmp_kver mips64_kver; int mips64n32; enum scmp_kver mips64n32_kver; int parisc; enum scmp_kver parisc_kver; int parisc64; enum scmp_kver parisc64_kver; int ppc; enum scmp_kver ppc_kver; int ppc64; enum scmp_kver ppc64_kver; int riscv64; enum scmp_kver riscv64_kver; int s390; enum scmp_kver s390_kver; int s390x; enum scmp_kver s390x_kver; int sh; enum scmp_kver sh_kver; }; #define SYSTBL_OFFSET(NAME) offsetof(struct arch_syscall_table, NAME) /* defined in syscalls.perf.template */ int syscall_resolve_name(const char *name, int offset); const char *syscall_resolve_num(int num, int offset); enum scmp_kver syscall_resolve_name_kver(const char *name, int offset_kver); enum scmp_kver syscall_resolve_num_kver(int num, int offset_arch, int offset_kver); const struct arch_syscall_def *syscall_iterate(unsigned int spot, int offset); /* helper functions for multiplexed syscalls, e.g. socketcall(2) and ipc(2) */ int abi_syscall_resolve_name_munge(const struct arch_def *arch, const char *name); const char *abi_syscall_resolve_num_munge(const struct arch_def *arch, int num); int abi_syscall_rewrite(const struct arch_def *arch, int *syscall); int abi_rule_add(struct db_filter *db, struct db_api_rule_list *rule); #endif libseccomp-2.5.4/src/system.h0000644000000000000000000001475314467535325014654 0ustar rootroot/** * Seccomp System Interfaces * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _SYSTEM_H #define _SYSTEM_H #include #include #include #include #include #include #include "configure.h" /* NOTE: this was taken from the Linux Kernel sources */ #define MAX_ERRNO 4095 struct db_filter_col; /* NOTE: temporary location, move to include/seccomp.h.in when complete */ enum scmp_kver { __SCMP_KV_NULL = 0, SCMP_KV_UNDEF = 1, /* TODO: add SCMP_KV_X_YY values as the syscall table is populated */ __SCMP_KV_MAX, }; #ifdef HAVE_LINUX_SECCOMP_H /* system header file */ #include #else /* NOTE: the definitions below were taken from the Linux Kernel sources */ /* Valid values for seccomp.mode and prctl(PR_SET_SECCOMP, ) */ #define SECCOMP_MODE_DISABLED 0 /* seccomp is not in use. */ #define SECCOMP_MODE_STRICT 1 /* uses hard-coded filter. */ #define SECCOMP_MODE_FILTER 2 /* uses user-supplied filter. */ /* * All BPF programs must return a 32-bit value. * The bottom 16-bits are for optional return data. * The upper 16-bits are ordered from least permissive values to most. * * The ordering ensures that a min_t() over composed return values always * selects the least permissive choice. */ #define SECCOMP_RET_KILL_PROCESS 0x80000000U /* kill the process immediately */ #define SECCOMP_RET_KILL_THREAD 0x00000000U /* kill the thread immediately */ #define SECCOMP_RET_KILL SECCOMP_RET_KILL_THREAD /* default to killing the thread */ #define SECCOMP_RET_TRAP 0x00030000U /* disallow and force a SIGSYS */ #define SECCOMP_RET_ERRNO 0x00050000U /* returns an errno */ #define SECCOMP_RET_USER_NOTIF 0x7fc00000U /* notifies userspace */ #define SECCOMP_RET_TRACE 0x7ff00000U /* pass to a tracer or disallow */ #define SECCOMP_RET_ALLOW 0x7fff0000U /* allow */ /* Masks for the return value sections. */ #define SECCOMP_RET_ACTION 0x7fff0000U #define SECCOMP_RET_DATA 0x0000ffffU /** * struct seccomp_data - the format the BPF program executes over. * @nr: the system call number * @arch: indicates system call convention as an AUDIT_ARCH_* value * as defined in . * @instruction_pointer: at the time of the system call. * @args: up to 6 system call arguments always stored as 64-bit values * regardless of the architecture. */ struct seccomp_data { int nr; __u32 arch; __u64 instruction_pointer; __u64 args[6]; }; #endif /* HAVE_LINUX_SECCOMP_H */ /* rename some of the socket filter types to make more sense */ typedef struct sock_filter bpf_instr_raw; /* no new privs definitions */ #ifndef PR_SET_NO_NEW_PRIVS #define PR_SET_NO_NEW_PRIVS 38 #endif #ifndef PR_GET_NO_NEW_PRIVS #define PR_GET_NO_NEW_PRIVS 39 #endif /* operations for the seccomp() syscall */ #ifndef SECCOMP_SET_MODE_STRICT #define SECCOMP_SET_MODE_STRICT 0 #endif #ifndef SECCOMP_SET_MODE_FILTER #define SECCOMP_SET_MODE_FILTER 1 #endif #ifndef SECCOMP_GET_ACTION_AVAIL #define SECCOMP_GET_ACTION_AVAIL 2 #endif #ifndef SECCOMP_GET_NOTIF_SIZES #define SECCOMP_GET_NOTIF_SIZES 3 #endif /* flags for the seccomp() syscall */ #ifndef SECCOMP_FILTER_FLAG_TSYNC #define SECCOMP_FILTER_FLAG_TSYNC (1UL << 0) #endif #ifndef SECCOMP_FILTER_FLAG_LOG #define SECCOMP_FILTER_FLAG_LOG (1UL << 1) #endif #ifndef SECCOMP_FILTER_FLAG_SPEC_ALLOW #define SECCOMP_FILTER_FLAG_SPEC_ALLOW (1UL << 2) #endif #ifndef SECCOMP_FILTER_FLAG_NEW_LISTENER #define SECCOMP_FILTER_FLAG_NEW_LISTENER (1UL << 3) #endif #ifndef SECCOMP_FILTER_FLAG_TSYNC_ESRCH #define SECCOMP_FILTER_FLAG_TSYNC_ESRCH (1UL << 4) #endif #ifndef SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV #define SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV (1UL << 5) #endif #ifndef SECCOMP_RET_LOG #define SECCOMP_RET_LOG 0x7ffc0000U /* allow after logging */ #endif /* SECCOMP_RET_ACTION_FULL was added in kernel v4.14. */ #ifndef SECCOMP_RET_ACTION_FULL #define SECCOMP_RET_ACTION_FULL 0xffff0000U #endif /* SECCOMP_RET_LOG was added in kernel v4.14. */ #ifndef SECCOMP_RET_LOG #define SECCOMP_RET_LOG 0x7fc00000U #endif /* SECCOMP_RET_USER_NOTIF was added in kernel v5.0. */ #ifndef SECCOMP_RET_USER_NOTIF #define SECCOMP_RET_USER_NOTIF 0x7fc00000U struct seccomp_notif_sizes { __u16 seccomp_notif; __u16 seccomp_notif_resp; __u16 seccomp_data; }; struct seccomp_notif { __u64 id; __u32 pid; __u32 flags; struct seccomp_data data; }; struct seccomp_notif_resp { __u64 id; __s64 val; __s32 error; __u32 flags; }; #define SECCOMP_IOC_MAGIC '!' #define SECCOMP_IO(nr) _IO(SECCOMP_IOC_MAGIC, nr) #define SECCOMP_IOR(nr, type) _IOR(SECCOMP_IOC_MAGIC, nr, type) #define SECCOMP_IOW(nr, type) _IOW(SECCOMP_IOC_MAGIC, nr, type) #define SECCOMP_IOWR(nr, type) _IOWR(SECCOMP_IOC_MAGIC, nr, type) /* flags for seccomp notification fd ioctl */ #define SECCOMP_IOCTL_NOTIF_RECV SECCOMP_IOWR(0, struct seccomp_notif) #define SECCOMP_IOCTL_NOTIF_SEND SECCOMP_IOWR(1, \ struct seccomp_notif_resp) #define SECCOMP_IOCTL_NOTIF_ID_VALID SECCOMP_IOW(2, __u64) #endif /* SECCOMP_RET_USER_NOTIF */ /* non-public ioctl number for backwards compat (see system.c) */ #define SECCOMP_IOCTL_NOTIF_ID_VALID_WRONG_DIR SECCOMP_IOR(2, __u64) void sys_reset_state(void); int sys_chk_seccomp_syscall(void); void sys_set_seccomp_syscall(bool enable); int sys_chk_seccomp_action(uint32_t action); void sys_set_seccomp_action(uint32_t action, bool enable); int sys_chk_seccomp_flag(int flag); void sys_set_seccomp_flag(int flag, bool enable); int sys_filter_load(struct db_filter_col *col, bool rawrc); int sys_notify_fd(void); int sys_notify_alloc(struct seccomp_notif **req, struct seccomp_notif_resp **resp); int sys_notify_receive(int fd, struct seccomp_notif *req); int sys_notify_respond(int fd, struct seccomp_notif_resp *resp); int sys_notify_id_valid(int fd, uint64_t id); #endif libseccomp-2.5.4/src/arch-aarch64.h0000644000000000000000000000155214467535324015463 0ustar rootroot/** * Enhanced Seccomp AArch64 Syscall Table * * Copyright (c) 2014 Red Hat * Author: Marcin Juszkiewicz */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _ARCH_AARCH64_H #define _ARCH_AARCH64_H #include "arch.h" ARCH_DECL(aarch64) #endif libseccomp-2.5.4/src/Makefile.am0000644000000000000000000000461014467535324015201 0ustar rootroot#### # Seccomp Library Source Files # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License # as published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # SUBDIRS = . if ENABLE_PYTHON SUBDIRS += python endif SOURCES_ALL = \ api.c system.h system.c helper.h helper.c \ gen_pfc.h gen_pfc.c gen_bpf.h gen_bpf.c \ hash.h hash.c \ db.h db.c \ arch.c arch.h \ arch-x86.h arch-x86.c \ arch-x86_64.h arch-x86_64.c \ arch-x32.h arch-x32.c \ arch-arm.h arch-arm.c \ arch-aarch64.h arch-aarch64.c \ arch-loongarch64.h arch-loongarch64.c \ arch-m68k.h arch-m68k.c \ arch-mips.h arch-mips.c \ arch-mips64.h arch-mips64.c \ arch-mips64n32.h arch-mips64n32.c \ arch-parisc.h arch-parisc.c \ arch-parisc64.h arch-parisc64.c \ arch-ppc.h arch-ppc.c \ arch-ppc64.h arch-ppc64.c \ arch-riscv64.h arch-riscv64.c \ arch-s390.h arch-s390.c \ arch-s390x.h arch-s390x.c \ arch-sh.h arch-sh.c \ syscalls.h syscalls.c syscalls.perf.c EXTRA_DIST = \ arch-syscall-validate arch-syscall-check \ arch-gperf-generate syscalls.csv syscalls.perf.template TESTS = arch-syscall-check check_PROGRAMS = arch-syscall-dump lib_LTLIBRARIES = libseccomp.la arch_syscall_dump_SOURCES = arch-syscall-dump.c ${SOURCES_ALL} libseccomp_la_SOURCES = ${SOURCES_ALL} libseccomp_la_CPPFLAGS = ${AM_CPPFLAGS} ${CODE_COVERAGE_CPPFLAGS} libseccomp_la_CFLAGS = ${AM_CFLAGS} ${CODE_COVERAGE_CFLAGS} ${CFLAGS} \ -fPIC -DPIC -fvisibility=hidden libseccomp_la_LDFLAGS = ${AM_LDFLAGS} ${CODE_COVERAGE_LDFLAGS} ${LDFLAGS} \ -version-number ${VERSION_MAJOR}:${VERSION_MINOR}:${VERSION_MICRO} EXTRA_DIST += syscalls.perf.c syscalls.perf CLEANFILES = syscalls.perf.c syscalls.perf syscalls.perf: syscalls.csv syscalls.perf.template ${AM_V_GEN} ${srcdir}/arch-gperf-generate \ ${srcdir}/syscalls.csv ${srcdir}/syscalls.perf.template syscalls.perf.c: syscalls.perf ${GPERF} -m 100 --null-strings --pic -tCEG -T -S1 $< > $@ check-build: ${MAKE} ${AM_MAKEFLAGS} ${check_PROGRAMS} libseccomp-2.5.4/src/gen_bpf.c0000644000000000000000000017452214467535324014723 0ustar rootroot/** * Seccomp BPF Translator * * Copyright (c) 2012 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include #include #include #ifndef _BSD_SOURCE #define _BSD_SOURCE #endif #include #include #include "arch.h" #include "arch-x32.h" #include "gen_bpf.h" #include "db.h" #include "hash.h" #include "system.h" #include "helper.h" /* allocation increments */ #define AINC_BLK 2 #define AINC_PROG 64 /* binary tree definitions */ #define SYSCALLS_PER_NODE (4) #define BTREE_HSH_INVALID (UINT64_MAX) #define BTREE_SYSCALL_INVALID (UINT_MAX) struct acc_state { int32_t offset; uint32_t mask; }; #define _ACC_STATE(x,y) \ (struct acc_state){ .offset = (x), .mask = (y) } #define _ACC_STATE_OFFSET(x) \ _ACC_STATE(x,ARG_MASK_MAX) #define _ACC_STATE_UNDEF \ _ACC_STATE_OFFSET(-1) #define _ACC_CMP_EQ(x,y) \ ((x).offset == (y).offset && (x).mask == (y).mask) enum bpf_jump_type { TGT_NONE = 0, TGT_K, /* immediate "k" value */ TGT_NXT, /* fall through to the next block */ TGT_IMM, /* resolved immediate value */ TGT_PTR_DB, /* pointer to part of the filter db */ TGT_PTR_BLK, /* pointer to an instruction block */ TGT_PTR_HSH, /* pointer to a block hash table */ }; struct bpf_jump { union { uint8_t imm_j; uint32_t imm_k; uint64_t hash; struct db_arg_chain_tree *db; struct bpf_blk *blk; unsigned int nxt; } tgt; enum bpf_jump_type type; }; #define _BPF_OP(a,x) \ (_htot16(a,x)) #define _BPF_JMP_NO \ ((struct bpf_jump) { .type = TGT_NONE }) #define _BPF_JMP_NXT(x) \ ((struct bpf_jump) { .type = TGT_NXT, .tgt = { .nxt = (x) } }) #define _BPF_JMP_IMM(x) \ ((struct bpf_jump) { .type = TGT_IMM, .tgt = { .imm_j = (x) } }) #define _BPF_JMP_DB(x) \ ((struct bpf_jump) { .type = TGT_PTR_DB, .tgt = { .db = (x) } }) #define _BPF_JMP_BLK(x) \ ((struct bpf_jump) { .type = TGT_PTR_BLK, .tgt = { .blk = (x) } }) #define _BPF_JMP_HSH(x) \ ((struct bpf_jump) { .type = TGT_PTR_HSH, .tgt = { .hash = (x) } }) #define _BPF_K(a,x) \ ((struct bpf_jump) { .type = TGT_K, .tgt = { .imm_k = _htot32(a,x) } }) #define _BPF_JMP_MAX 255 #define _BPF_JMP_MAX_RET 255 struct bpf_instr { uint16_t op; struct bpf_jump jt; struct bpf_jump jf; struct bpf_jump k; }; #define _BPF_OFFSET_SYSCALL (offsetof(struct seccomp_data, nr)) #define _BPF_SYSCALL(a) _BPF_K(a,_BPF_OFFSET_SYSCALL) #define _BPF_OFFSET_ARCH (offsetof(struct seccomp_data, arch)) #define _BPF_ARCH(a) _BPF_K(a,_BPF_OFFSET_ARCH) struct bpf_blk { /* bpf instructions */ struct bpf_instr *blks; unsigned int blk_cnt; unsigned int blk_alloc; /* accumulator state */ struct acc_state acc_start; struct acc_state acc_end; /* priority - higher is better */ unsigned int priority; /* status flags */ bool flag_hash; /* added to the hash table */ bool flag_dup; /* duplicate block and in use */ bool flag_unique; /* ->blks is unique to this block */ /* original db_arg_chain_tree node */ const struct db_arg_chain_tree *node; /* used during block assembly */ uint64_t hash; struct bpf_blk *hash_nxt; struct bpf_blk *prev, *next; struct bpf_blk *lvl_prv, *lvl_nxt; }; #define _BLK_MSZE(x) \ ((x)->blk_cnt * sizeof(*((x)->blks))) struct bpf_hash_bkt { struct bpf_blk *blk; struct bpf_hash_bkt *next; unsigned int found; }; #define _BPF_HASH_BITS 8 #define _BPF_HASH_SIZE (1 << _BPF_HASH_BITS) #define _BPF_HASH_MASK (_BPF_HASH_BITS - 1) struct bpf_state { /* block hash table */ struct bpf_hash_bkt *htbl[_BPF_HASH_SIZE]; /* filter attributes */ const struct db_filter_attr *attr; /* bad arch action */ uint64_t bad_arch_hsh; /* default action */ uint64_t def_hsh; /* bpf program */ struct bpf_program *bpf; /* WARNING - the following variables are temporary use only */ const struct arch_def *arch; struct bpf_blk *b_head; struct bpf_blk *b_tail; struct bpf_blk *b_new; }; /** * Populate a BPF instruction * @param _ins the BPF instruction * @param _op the BPF operand * @param _jt the BPF jt value * @param _jf the BPF jf value * @param _k the BPF k value * * Set the given values on the provided bpf_instr struct. * */ #define _BPF_INSTR(_ins,_op,_jt,_jf,_k) \ do { \ memset(&(_ins), 0, sizeof(_ins)); \ (_ins).op = (_op); \ (_ins).jt = _jt; \ (_ins).jf = _jf; \ (_ins).k = _k; \ } while (0) static struct bpf_blk *_gen_bpf_chain(struct bpf_state *state, const struct db_sys_list *sys, const struct db_arg_chain_tree *chain, const struct bpf_jump *nxt_jump, struct acc_state *a_state); static struct bpf_blk *_hsh_remove(struct bpf_state *state, uint64_t h_val); static struct bpf_blk *_hsh_find(const struct bpf_state *state, uint64_t h_val); /** * Convert a 16-bit host integer into the target's endianness * @param arch the architecture definition * @param val the 16-bit integer * * Convert the endianness of the supplied value and return it to the caller. * */ static uint16_t _htot16(const struct arch_def *arch, uint16_t val) { if (arch->endian == ARCH_ENDIAN_LITTLE) return htole16(val); else return htobe16(val); } /** * Convert a 32-bit host integer into the target's endianness * @param arch the architecture definition * @param val the 32-bit integer * * Convert the endianness of the supplied value and return it to the caller. * */ static uint32_t _htot32(const struct arch_def *arch, uint32_t val) { if (arch->endian == ARCH_ENDIAN_LITTLE) return htole32(val); else return htobe32(val); } /** * Free the BPF instruction block * @param state the BPF state * @param blk the BPF instruction block * * Free the BPF instruction block, any linked blocks are preserved and the hash * table is not modified. In general, you probably want to use _blk_free() * instead. * */ static void __blk_free(struct bpf_state *state, struct bpf_blk *blk) { struct bpf_blk *b_tmp; while (blk->hash_nxt != NULL) { b_tmp = blk->hash_nxt; blk->hash_nxt = b_tmp->hash_nxt; if (!b_tmp->flag_dup) free(b_tmp); } if (blk->blks != NULL && blk->flag_unique) free(blk->blks); free(blk); } /** * Free the BPF instruction block * @param state the BPF state * @param blk the BPF instruction block * * Free the BPF instruction block including any linked blocks. The hash table * is updated to reflect the newly removed block(s). * */ static void _blk_free(struct bpf_state *state, struct bpf_blk *blk) { int iter; struct bpf_blk *b_iter; struct bpf_instr *i_iter; if (blk == NULL) return; /* remove this block from the hash table */ _hsh_remove(state, blk->hash); /* run through the block freeing TGT_PTR_{BLK,HSH} jump targets */ for (iter = 0; iter < blk->blk_cnt; iter++) { i_iter = &blk->blks[iter]; switch (i_iter->jt.type) { case TGT_PTR_BLK: _blk_free(state, i_iter->jt.tgt.blk); break; case TGT_PTR_HSH: b_iter = _hsh_find(state, i_iter->jt.tgt.hash); _blk_free(state, b_iter); break; default: /* do nothing */ break; } switch (i_iter->jf.type) { case TGT_PTR_BLK: _blk_free(state, i_iter->jf.tgt.blk); break; case TGT_PTR_HSH: b_iter = _hsh_find(state, i_iter->jf.tgt.hash); _blk_free(state, b_iter); break; default: /* do nothing */ break; } } __blk_free(state, blk); } /** * Allocate and initialize a new instruction block * * Allocate a new BPF instruction block and perform some very basic * initialization. Returns a pointer to the block on success, NULL on failure. * */ static struct bpf_blk *_blk_alloc(void) { struct bpf_blk *blk; blk = zmalloc(sizeof(*blk)); if (blk == NULL) return NULL; blk->flag_unique = true; blk->acc_start = _ACC_STATE_UNDEF; blk->acc_end = _ACC_STATE_UNDEF; return blk; } /** * Resize an instruction block * @param state the BPF state * @param blk the existing instruction block, or NULL * @param size_add the minimum amount of instructions to add * * Resize the given instruction block such that it is at least as large as the * current size plus @size_add. Returns a pointer to the block on success, * NULL on failure. * */ static struct bpf_blk *_blk_resize(struct bpf_state *state, struct bpf_blk *blk, unsigned int size_add) { unsigned int size_adj = (AINC_BLK > size_add ? AINC_BLK : size_add); struct bpf_instr *new; size_t old_size, new_size; if (blk == NULL) return NULL; if ((blk->blk_cnt + size_adj) <= blk->blk_alloc) return blk; old_size = blk->blk_alloc * sizeof(*new); blk->blk_alloc += size_adj; new_size = blk->blk_alloc * sizeof(*new); new = zrealloc(blk->blks, old_size, new_size); if (new == NULL) { _blk_free(state, blk); return NULL; } blk->blks = new; return blk; } /** * Append a new BPF instruction to an instruction block * @param state the BPF state * @param blk the existing instruction block, or NULL * @param instr the new instruction * * Add the new BPF instruction to the end of the given instruction block. If * the given instruction block is NULL, a new block will be allocated. Returns * a pointer to the block on success, NULL on failure, and in the case of * failure the instruction block is free'd. * */ static struct bpf_blk *_blk_append(struct bpf_state *state, struct bpf_blk *blk, const struct bpf_instr *instr) { if (blk == NULL) { blk = _blk_alloc(); if (blk == NULL) return NULL; } if (_blk_resize(state, blk, 1) == NULL) return NULL; memcpy(&blk->blks[blk->blk_cnt++], instr, sizeof(*instr)); return blk; } /** * Prepend a new BPF instruction to an instruction block * @param state the BPF state * @param blk the existing instruction block, or NULL * @param instr the new instruction * * Add the new BPF instruction to the start of the given instruction block. * If the given instruction block is NULL, a new block will be allocated. * Returns a pointer to the block on success, NULL on failure, and in the case * of failure the instruction block is free'd. * */ static struct bpf_blk *_blk_prepend(struct bpf_state *state, struct bpf_blk *blk, const struct bpf_instr *instr) { /* empty - we can treat this like a normal append operation */ if (blk == NULL || blk->blk_cnt == 0) return _blk_append(state, blk, instr); if (_blk_resize(state, blk, 1) == NULL) return NULL; memmove(&blk->blks[1], &blk->blks[0], blk->blk_cnt++ * sizeof(*instr)); memcpy(&blk->blks[0], instr, sizeof(*instr)); return blk; } /** * Append a block of BPF instructions to the final BPF program * @param prg the BPF program * @param blk the BPF instruction block * * Add the BPF instruction block to the end of the BPF program and perform the * necessary translation. Returns zero on success, negative values on failure * and in the case of failure the BPF program is free'd. * */ static int _bpf_append_blk(struct bpf_program *prg, const struct bpf_blk *blk) { int rc; bpf_instr_raw *i_new; bpf_instr_raw *i_iter; unsigned int old_cnt = prg->blk_cnt; unsigned int iter; size_t old_size, new_size; /* (re)allocate the program memory */ old_size = BPF_PGM_SIZE(prg); prg->blk_cnt += blk->blk_cnt; new_size = BPF_PGM_SIZE(prg); i_new = zrealloc(prg->blks, old_size, new_size); if (i_new == NULL) { rc = -ENOMEM; goto bpf_append_blk_failure; } prg->blks = i_new; /* transfer and translate the blocks to raw instructions */ for (iter = 0; iter < blk->blk_cnt; iter++) { i_iter = &(prg->blks[old_cnt + iter]); i_iter->code = blk->blks[iter].op; switch (blk->blks[iter].jt.type) { case TGT_NONE: i_iter->jt = 0; break; case TGT_IMM: /* jump to the value specified */ i_iter->jt = blk->blks[iter].jt.tgt.imm_j; break; default: /* fatal error - we should never get here */ rc = -EFAULT; goto bpf_append_blk_failure; } switch (blk->blks[iter].jf.type) { case TGT_NONE: i_iter->jf = 0; break; case TGT_IMM: /* jump to the value specified */ i_iter->jf = blk->blks[iter].jf.tgt.imm_j; break; default: /* fatal error - we should never get here */ rc = -EFAULT; goto bpf_append_blk_failure; } switch (blk->blks[iter].k.type) { case TGT_K: i_iter->k = blk->blks[iter].k.tgt.imm_k; break; default: /* fatal error - we should never get here */ rc = -EFAULT; goto bpf_append_blk_failure; } } return prg->blk_cnt; bpf_append_blk_failure: prg->blk_cnt = 0; free(prg->blks); return rc; } /** * Free the BPF program * @param prg the BPF program * * Free the BPF program. None of the associated BPF state used to generate the * BPF program is released in this function. * */ static void _program_free(struct bpf_program *prg) { if (prg == NULL) return; if (prg->blks != NULL) free(prg->blks); free(prg); } /** * Free the BPF state * @param state the BPF state * * Free all of the BPF state, including the BPF program if present. * */ static void _state_release(struct bpf_state *state) { unsigned int bkt; struct bpf_hash_bkt *iter; if (state == NULL) return; /* release all of the hash table entries */ for (bkt = 0; bkt < _BPF_HASH_SIZE; bkt++) { while (state->htbl[bkt]) { iter = state->htbl[bkt]; state->htbl[bkt] = iter->next; __blk_free(state, iter->blk); free(iter); } } _program_free(state->bpf); memset(state, 0, sizeof(*state)); } /** * Add an instruction block to the BPF state hash table * @param state the BPF state * @param blk_p pointer to the BPF instruction block * @param found initial found value (see _hsh_find_once() for description) * * This function adds an instruction block to the hash table, and frees the * block if an identical instruction block already exists, returning a pointer * to the original block in place of the given block. Returns zero on success * and negative values on failure. * */ static int _hsh_add(struct bpf_state *state, struct bpf_blk **blk_p, unsigned int found) { uint64_t h_val, h_val_tmp[3]; struct bpf_hash_bkt *h_new, *h_iter, *h_prev = NULL; struct bpf_blk *blk = *blk_p; struct bpf_blk *b_iter; if (blk->flag_hash) return 0; h_new = zmalloc(sizeof(*h_new)); if (h_new == NULL) return -ENOMEM; /* generate the hash */ h_val_tmp[0] = hash(blk->blks, _BLK_MSZE(blk)); h_val_tmp[1] = hash(&blk->acc_start, sizeof(blk->acc_start)); h_val_tmp[2] = hash(&blk->acc_end, sizeof(blk->acc_end)); h_val = hash(h_val_tmp, sizeof(h_val_tmp)); blk->hash = h_val; blk->flag_hash = true; blk->node = NULL; h_new->blk = blk; h_new->found = (found ? 1 : 0); /* insert the block into the hash table */ hsh_add_restart: h_iter = state->htbl[h_val & _BPF_HASH_MASK]; if (h_iter != NULL) { do { if ((h_iter->blk->hash == h_val) && (_BLK_MSZE(h_iter->blk) == _BLK_MSZE(blk)) && (memcmp(h_iter->blk->blks, blk->blks, _BLK_MSZE(blk)) == 0) && _ACC_CMP_EQ(h_iter->blk->acc_start, blk->acc_start) && _ACC_CMP_EQ(h_iter->blk->acc_end, blk->acc_end)) { /* duplicate block */ free(h_new); /* store the duplicate block */ b_iter = h_iter->blk; while (b_iter->hash_nxt != NULL) b_iter = b_iter->hash_nxt; b_iter->hash_nxt = blk; /* in some cases we want to return the * duplicate block */ if (found) { blk->flag_dup = true; return 0; } /* update the priority if needed */ if (h_iter->blk->priority < blk->priority) h_iter->blk->priority = blk->priority; /* try to save some memory */ free(blk->blks); blk->blks = h_iter->blk->blks; blk->flag_unique = false; *blk_p = h_iter->blk; return 0; } else if (h_iter->blk->hash == h_val) { /* hash collision */ if ((h_val >> 32) == 0xffffffff) { /* overflow */ blk->flag_hash = false; blk->hash = 0; free(h_new); return -EFAULT; } h_val += ((uint64_t)1 << 32); h_new->blk->hash = h_val; /* restart at the beginning of the bucket */ goto hsh_add_restart; } else { /* no match, move along */ h_prev = h_iter; h_iter = h_iter->next; } } while (h_iter != NULL); h_prev->next = h_new; } else state->htbl[h_val & _BPF_HASH_MASK] = h_new; return 0; } /** * Remove an entry from the hash table * @param state the BPF state * @param h_val the hash value * * Remove an entry from the hash table and return it to the caller, NULL is * returned if the entry can not be found. * */ static struct bpf_blk *_hsh_remove(struct bpf_state *state, uint64_t h_val) { unsigned int bkt = h_val & _BPF_HASH_MASK; struct bpf_blk *blk; struct bpf_hash_bkt *h_iter, *h_prev = NULL; h_iter = state->htbl[bkt]; while (h_iter != NULL) { if (h_iter->blk->hash == h_val) { if (h_prev != NULL) h_prev->next = h_iter->next; else state->htbl[bkt] = h_iter->next; blk = h_iter->blk; free(h_iter); return blk; } h_prev = h_iter; h_iter = h_iter->next; } return NULL; } /** * Find and return a hash bucket * @param state the BPF state * @param h_val the hash value * * Find the entry associated with the given hash value and return it to the * caller, NULL is returned if the entry can not be found. This function * should not be called directly; use _hsh_find() and _hsh_find_once() instead. * */ static struct bpf_hash_bkt *_hsh_find_bkt(const struct bpf_state *state, uint64_t h_val) { struct bpf_hash_bkt *h_iter; h_iter = state->htbl[h_val & _BPF_HASH_MASK]; while (h_iter != NULL) { if (h_iter->blk->hash == h_val) return h_iter; h_iter = h_iter->next; } return NULL; } /** * Find and only return an entry in the hash table once * @param state the BPF state * @param h_val the hash value * * Find the entry associated with the given hash value and return it to the * caller if it has not be returned previously by this function; returns NULL * if the entry can not be found or has already been returned in a previous * call. * */ static struct bpf_blk *_hsh_find_once(const struct bpf_state *state, uint64_t h_val) { struct bpf_hash_bkt *h_iter; h_iter = _hsh_find_bkt(state, h_val); if (h_iter == NULL || h_iter->found != 0) return NULL; h_iter->found = 1; return h_iter->blk; } /** * Finds an entry in the hash table * @param state the BPF state * @param h_val the hash value * * Find the entry associated with the given hash value and return it to the * caller, NULL is returned if the entry can not be found. * */ static struct bpf_blk *_hsh_find(const struct bpf_state *state, uint64_t h_val) { struct bpf_hash_bkt *h_iter; h_iter = _hsh_find_bkt(state, h_val); if (h_iter == NULL) return NULL; return h_iter->blk; } /** * Generate a BPF action instruction * @param state the BPF state * @param blk the BPF instruction block, or NULL * @param action the desired action * * Generate a BPF action instruction and append it to the given instruction * block. Returns a pointer to the instruction block on success, NULL on * failure. * */ static struct bpf_blk *_gen_bpf_action(struct bpf_state *state, struct bpf_blk *blk, uint32_t action) { struct bpf_instr instr; _BPF_INSTR(instr, _BPF_OP(state->arch, BPF_RET), _BPF_JMP_NO, _BPF_JMP_NO, _BPF_K(state->arch, action)); return _blk_append(state, blk, &instr); } /** * Generate a BPF action instruction and insert it into the hash table * @param state the BPF state * @param action the desired action * * Generate a BPF action instruction and insert it into the hash table. * Returns a pointer to the instruction block on success, NULL on failure. * */ static struct bpf_blk *_gen_bpf_action_hsh(struct bpf_state *state, uint32_t action) { struct bpf_blk *blk; blk = _gen_bpf_action(state, NULL, action); if (blk == NULL) return NULL; if (_hsh_add(state, &blk, 0) < 0) { _blk_free(state, blk); return NULL; } return blk; } /** * Generate a BPF instruction block for a given chain node * @param state the BPF state * @param node the filter chain node * @param a_state the accumulator state * * Generate BPF instructions to execute the filter for the given chain node. * Returns a pointer to the instruction block on success, NULL on failure. * */ static struct bpf_blk *_gen_bpf_node(struct bpf_state *state, const struct db_arg_chain_tree *node, struct acc_state *a_state) { int32_t acc_offset; uint32_t acc_mask; uint64_t act_t_hash = 0, act_f_hash = 0; struct bpf_blk *blk, *b_act; struct bpf_instr instr; blk = _blk_alloc(); if (blk == NULL) return NULL; blk->acc_start = *a_state; /* generate the action blocks */ if (node->act_t_flg) { b_act = _gen_bpf_action_hsh(state, node->act_t); if (b_act == NULL) goto node_failure; act_t_hash = b_act->hash; } if (node->act_f_flg) { b_act = _gen_bpf_action_hsh(state, node->act_f); if (b_act == NULL) goto node_failure; act_f_hash = b_act->hash; } /* check the accumulator state */ acc_offset = node->arg_offset; acc_mask = node->mask; if (acc_offset < 0) goto node_failure; if ((acc_offset != a_state->offset) || ((acc_mask & a_state->mask) != acc_mask)) { /* reload the accumulator */ a_state->offset = acc_offset; a_state->mask = ARG_MASK_MAX; _BPF_INSTR(instr, _BPF_OP(state->arch, BPF_LD + BPF_ABS), _BPF_JMP_NO, _BPF_JMP_NO, _BPF_K(state->arch, acc_offset)); blk = _blk_append(state, blk, &instr); if (blk == NULL) goto node_failure; /* we're not dependent on the accumulator anymore */ blk->acc_start = _ACC_STATE_UNDEF; } if (acc_mask != a_state->mask) { /* apply the bitmask */ a_state->mask = acc_mask; _BPF_INSTR(instr, _BPF_OP(state->arch, BPF_ALU + BPF_AND), _BPF_JMP_NO, _BPF_JMP_NO, _BPF_K(state->arch, acc_mask)); blk = _blk_append(state, blk, &instr); if (blk == NULL) goto node_failure; } /* set the accumulator state at the end of the block */ /* NOTE: the accumulator end state is very critical when we are * assembling the final state; we assume that however we leave * this instruction block the accumulator state is represented * by blk->acc_end, it must be kept correct */ blk->acc_end = *a_state; /* check the accumulator against the datum */ switch (node->op) { case SCMP_CMP_MASKED_EQ: case SCMP_CMP_EQ: _BPF_INSTR(instr, _BPF_OP(state->arch, BPF_JMP + BPF_JEQ), _BPF_JMP_NO, _BPF_JMP_NO, _BPF_K(state->arch, node->datum)); break; case SCMP_CMP_GT: _BPF_INSTR(instr, _BPF_OP(state->arch, BPF_JMP + BPF_JGT), _BPF_JMP_NO, _BPF_JMP_NO, _BPF_K(state->arch, node->datum)); break; case SCMP_CMP_GE: _BPF_INSTR(instr, _BPF_OP(state->arch, BPF_JMP + BPF_JGE), _BPF_JMP_NO, _BPF_JMP_NO, _BPF_K(state->arch, node->datum)); break; case SCMP_CMP_NE: case SCMP_CMP_LT: case SCMP_CMP_LE: default: /* fatal error, we should never get here */ goto node_failure; } /* fixup the jump targets */ if (node->nxt_t != NULL) instr.jt = _BPF_JMP_DB(node->nxt_t); else if (node->act_t_flg) instr.jt = _BPF_JMP_HSH(act_t_hash); else instr.jt = _BPF_JMP_NXT(0); if (node->nxt_f != NULL) instr.jf = _BPF_JMP_DB(node->nxt_f); else if (node->act_f_flg) instr.jf = _BPF_JMP_HSH(act_f_hash); else instr.jf = _BPF_JMP_NXT(0); blk = _blk_append(state, blk, &instr); if (blk == NULL) goto node_failure; blk->node = node; return blk; node_failure: _blk_free(state, blk); return NULL; } /** * Resolve the jump targets in a BPF instruction block * @param state the BPF state * @param sys the syscall filter * @param blk the BPF instruction block * @param nxt_jump the jump to fallthrough to at the end of the level * * Resolve the jump targets in a BPF instruction block generated by the * _gen_bpf_chain_lvl() function and adds the resulting block to the hash * table. Returns a pointer to the new instruction block on success, NULL on * failure. * */ static struct bpf_blk *_gen_bpf_chain_lvl_res(struct bpf_state *state, const struct db_sys_list *sys, struct bpf_blk *blk, const struct bpf_jump *nxt_jump) { int rc; unsigned int iter; struct bpf_blk *b_new; struct bpf_instr *i_iter; struct db_arg_chain_tree *node; if (blk->flag_hash) return blk; /* convert TGT_PTR_DB to TGT_PTR_HSH references */ for (iter = 0; iter < blk->blk_cnt; iter++) { i_iter = &blk->blks[iter]; switch (i_iter->jt.type) { case TGT_NONE: case TGT_IMM: case TGT_PTR_HSH: /* ignore these jump types */ break; case TGT_PTR_BLK: b_new = _gen_bpf_chain_lvl_res(state, sys, i_iter->jt.tgt.blk, nxt_jump); if (b_new == NULL) return NULL; i_iter->jt = _BPF_JMP_HSH(b_new->hash); break; case TGT_PTR_DB: node = (struct db_arg_chain_tree *)i_iter->jt.tgt.db; b_new = _gen_bpf_chain(state, sys, node, nxt_jump, &blk->acc_end); if (b_new == NULL) return NULL; i_iter->jt = _BPF_JMP_HSH(b_new->hash); break; default: /* we should not be here */ return NULL; } switch (i_iter->jf.type) { case TGT_NONE: case TGT_IMM: case TGT_PTR_HSH: /* ignore these jump types */ break; case TGT_PTR_BLK: b_new = _gen_bpf_chain_lvl_res(state, sys, i_iter->jf.tgt.blk, nxt_jump); if (b_new == NULL) return NULL; i_iter->jf = _BPF_JMP_HSH(b_new->hash); break; case TGT_PTR_DB: node = (struct db_arg_chain_tree *)i_iter->jf.tgt.db; b_new = _gen_bpf_chain(state, sys, node, nxt_jump, &blk->acc_end); if (b_new == NULL) return NULL; i_iter->jf = _BPF_JMP_HSH(b_new->hash); break; default: /* we should not be here */ return NULL; } switch (i_iter->k.type) { case TGT_NONE: case TGT_K: case TGT_PTR_HSH: /* ignore these jump types */ break; default: /* we should not be here */ return NULL; } } /* insert the block into the hash table */ rc = _hsh_add(state, &blk, 0); if (rc < 0) return NULL; return blk; } /** * Generates the BPF instruction blocks for a given filter chain * @param state the BPF state * @param sys the syscall filter * @param chain the filter chain * @param nxt_jump the jump to fallthrough to at the end of the level * @param a_state the accumulator state * * Generate the BPF instruction blocks for the given filter chain and return * a pointer to the first block on success; returns NULL on failure. * */ static struct bpf_blk *_gen_bpf_chain(struct bpf_state *state, const struct db_sys_list *sys, const struct db_arg_chain_tree *chain, const struct bpf_jump *nxt_jump, struct acc_state *a_state) { struct bpf_blk *b_head = NULL, *b_tail = NULL; struct bpf_blk *b_prev, *b_next, *b_iter; struct bpf_instr *i_iter; const struct db_arg_chain_tree *c_iter; unsigned int iter; struct bpf_jump nxt_jump_tmp; struct acc_state acc = *a_state; if (chain == NULL) { b_head = _gen_bpf_action(state, NULL, sys->action); if (b_head == NULL) goto chain_failure; b_tail = b_head; } else { /* find the starting node of the level */ c_iter = chain; while (c_iter->lvl_prv != NULL) c_iter = c_iter->lvl_prv; /* build all of the blocks for this level */ do { b_iter = _gen_bpf_node(state, c_iter, &acc); if (b_iter == NULL) goto chain_failure; if (b_head != NULL) { b_iter->lvl_prv = b_tail; b_tail->lvl_nxt = b_iter; b_tail = b_iter; } else { b_head = b_iter; b_tail = b_iter; } c_iter = c_iter->lvl_nxt; } while (c_iter != NULL); /* resolve the TGT_NXT jumps */ b_iter = b_head; do { b_next = b_iter->lvl_nxt; for (iter = 0; iter < b_iter->blk_cnt; iter++) { i_iter = &b_iter->blks[iter]; if (i_iter->jt.type == TGT_NXT) { if (i_iter->jt.tgt.nxt != 0) goto chain_failure; if (b_next == NULL) i_iter->jt = *nxt_jump; else i_iter->jt = _BPF_JMP_BLK(b_next); } if (i_iter->jf.type == TGT_NXT) { if (i_iter->jf.tgt.nxt != 0) goto chain_failure; if (b_next == NULL) i_iter->jf = *nxt_jump; else i_iter->jf = _BPF_JMP_BLK(b_next); } } b_iter = b_next; } while (b_iter != NULL); } /* resolve all of the blocks */ memset(&nxt_jump_tmp, 0, sizeof(nxt_jump_tmp)); b_iter = b_tail; do { /* b_iter may change after resolving, so save the linkage */ b_prev = b_iter->lvl_prv; b_next = b_iter->lvl_nxt; nxt_jump_tmp = _BPF_JMP_BLK(b_next); b_iter = _gen_bpf_chain_lvl_res(state, sys, b_iter, (b_next == NULL ? nxt_jump : &nxt_jump_tmp)); if (b_iter == NULL) goto chain_failure; /* restore the block linkage on this level */ if (b_prev != NULL) b_prev->lvl_nxt = b_iter; b_iter->lvl_prv = b_prev; b_iter->lvl_nxt = b_next; if (b_next != NULL) b_next->lvl_prv = b_iter; if (b_iter->lvl_prv == NULL) b_head = b_iter; b_iter = b_prev; } while (b_iter != NULL); return b_head; chain_failure: while (b_head != NULL) { b_iter = b_head; b_head = b_iter->lvl_nxt; _blk_free(state, b_iter); } return NULL; } /** * Sort the syscalls by syscall number * @param syscalls the linked list of syscalls to be sorted * @param s_head the head of the linked list to be returned to the caller * @param s_tail the tail of the linked list to be returned to the caller */ static void _sys_num_sort(struct db_sys_list *syscalls, struct db_sys_list **s_head, struct db_sys_list **s_tail) { struct db_sys_list *s_iter, *s_iter_b; db_list_foreach(s_iter, syscalls) { if (*s_head != NULL) { s_iter_b = *s_head; while ((s_iter_b->pri_nxt != NULL) && (s_iter->num <= s_iter_b->num)) s_iter_b = s_iter_b->pri_nxt; if (s_iter->num > s_iter_b->num) { s_iter->pri_prv = s_iter_b->pri_prv; s_iter->pri_nxt = s_iter_b; if (s_iter_b == *s_head) { (*s_head)->pri_prv = s_iter; *s_head = s_iter; } else { s_iter->pri_prv->pri_nxt = s_iter; s_iter->pri_nxt->pri_prv = s_iter; } } else { s_iter->pri_prv = *s_tail; s_iter->pri_nxt = NULL; s_iter->pri_prv->pri_nxt = s_iter; *s_tail = s_iter; } } else { *s_head = s_iter; *s_tail = s_iter; (*s_head)->pri_prv = NULL; (*s_head)->pri_nxt = NULL; } } } /** * Sort the syscalls by priority * @param syscalls the linked list of syscalls to be sorted * @param s_head the head of the linked list to be returned to the caller * @param s_tail the tail of the linked list to be returned to the caller */ static void _sys_priority_sort(struct db_sys_list *syscalls, struct db_sys_list **s_head, struct db_sys_list **s_tail) { struct db_sys_list *s_iter, *s_iter_b; db_list_foreach(s_iter, syscalls) { if (*s_head != NULL) { s_iter_b = *s_head; while ((s_iter_b->pri_nxt != NULL) && (s_iter->priority <= s_iter_b->priority)) s_iter_b = s_iter_b->pri_nxt; if (s_iter->priority > s_iter_b->priority) { s_iter->pri_prv = s_iter_b->pri_prv; s_iter->pri_nxt = s_iter_b; if (s_iter_b == *s_head) { (*s_head)->pri_prv = s_iter; *s_head = s_iter; } else { s_iter->pri_prv->pri_nxt = s_iter; s_iter->pri_nxt->pri_prv = s_iter; } } else { s_iter->pri_prv = *s_tail; s_iter->pri_nxt = NULL; s_iter->pri_prv->pri_nxt = s_iter; *s_tail = s_iter; } } else { *s_head = s_iter; *s_tail = s_iter; (*s_head)->pri_prv = NULL; (*s_head)->pri_nxt = NULL; } } } /** * Sort the syscalls * @param syscalls the linked list of syscalls to be sorted * @param s_head the head of the linked list to be returned to the caller * @param s_tail the tail of the linked list to be returned to the caller * * Wrapper function for sorting syscalls * */ static void _sys_sort(struct db_sys_list *syscalls, struct db_sys_list **s_head, struct db_sys_list **s_tail, uint32_t optimize) { if (optimize != 2) _sys_priority_sort(syscalls, s_head, s_tail); else /* sort by number for the binary tree */ _sys_num_sort(syscalls, s_head, s_tail); } /** * Insert an instruction into the BPF state and connect the linked list * @param state the BPF state * @param instr the instruction to insert * @param insert the BPF blk that represents the instruction * @param next the next BPF instruction in the linked list * @param existing_blk insert will be added to the end of this blk if non-NULL * * Insert a set of instructions into the BPF state and associate those * instructions with the bpf_blk called insert. The "next" field in the * newly inserted block will be linked with the "next" bpf_blk parameter. */ static int _gen_bpf_insert(struct bpf_state *state, struct bpf_instr *instr, struct bpf_blk **insert, struct bpf_blk **next, struct bpf_blk *existing_blk) { int rc; *insert = _blk_append(state, existing_blk, instr); if (*insert == NULL) return -ENOMEM; (*insert)->next = (*next); if (*next != NULL) (*next)->prev = (*insert); *next = *insert; rc = _hsh_add(state, insert, 1); return rc; } /** * Decide if we need to omit the syscall from the BPF filter * @param state the BPF state * @param syscall syscall being tested * @return true if syscall is to be skipped, false otherwise */ static inline bool _skip_syscall(struct bpf_state *state, struct db_sys_list *syscall) { if (!syscall->valid) return true; /* pseudo-syscalls should not be added to the filter unless explicitly * requested via SCMP_FLTATR_API_TSKIP */ if (((int)syscall->num < 0) && (state->attr->api_tskip == 0 || syscall->num != -1)) return true; return false; } /** * Calculate the number of syscalls that will be in the BPF filter * @param state the BPF state * @param s_tail the last syscall in the syscall linked list */ static unsigned int _get_syscall_cnt(struct bpf_state *state, struct db_sys_list *s_tail) { struct db_sys_list *s_iter; unsigned int syscall_cnt = 0; for (s_iter = s_tail; s_iter != NULL; s_iter = s_iter->pri_prv) { if (_skip_syscall(state, s_iter)) continue; syscall_cnt++; } return syscall_cnt; } /** * Calculate the number of levels in the binary tree * @param syscall_cnt the number of syscalls in this seccomp filter */ static int _get_bintree_levels(unsigned int syscall_cnt) { unsigned int i = 2, max_level = SYSCALLS_PER_NODE * 2; if (syscall_cnt == 0) return 0; while (max_level < syscall_cnt) { max_level <<= 1; i++; } return i; } /** * Initialize the binary tree * @param bintree_hashes Array of hashes that store binary tree jump dests * @param bintree_syscalls Array of syscalls for the binary tree "if > " logic * @param bintree_levels Number of levels in the binary tree * @param syscall_cnt Number of syscalls in this filter * @param empty_cnt Number of empty slots needed to balance the tree * */ static int _gen_bpf_init_bintree(uint64_t **bintree_hashes, unsigned int **bintree_syscalls, unsigned int *bintree_levels, unsigned int syscall_cnt, unsigned int *empty_cnt) { int i; *bintree_levels = _get_bintree_levels(syscall_cnt); if (*bintree_levels > 0) { *empty_cnt = ((unsigned int)(SYSCALLS_PER_NODE * 2) << ((*bintree_levels) - 1)) - syscall_cnt; *bintree_hashes = zmalloc(sizeof(uint64_t) * (*bintree_levels)); if (*bintree_hashes == NULL) return -ENOMEM; *bintree_syscalls = zmalloc(sizeof(unsigned int) * (*bintree_levels)); if (*bintree_syscalls == NULL) return -ENOMEM; for (i = 0; i < *bintree_levels; i++) { (*bintree_syscalls)[i] = BTREE_SYSCALL_INVALID; (*bintree_hashes)[i] = BTREE_HSH_INVALID; } } return 0; } /** * Generate the binary tree * @param state the BPF state * @param bintree_hashes Array of hashes that store binary tree jump dests * @param bintree_syscalls Array of syscalls for the binary tree "if > " logic * @param bintree_levels Number of levels in the binary tree * @param total_cnt Total number of syscalls and empty slots in the bintree * @param cur_syscall Current syscall being processed * @param blks_added Number of BPF blocks added by this function * * Generate the BPF instruction blocks for the binary tree for cur_syscall. * If this syscall is at the end of the node, then this function will * create the requisite ifs and elses for the tree. */ static int _gen_bpf_bintree(struct bpf_state *state, uint64_t *bintree_hashes, unsigned int *bintree_syscalls, unsigned int bintree_levels, unsigned int total_cnt, unsigned int cur_syscall, unsigned int *blks_added) { struct bpf_blk *b_bintree = NULL; struct bpf_instr instr; unsigned int level; int rc = 0, i, j; for (i = bintree_levels - 1; i >= 0; i--) { level = SYSCALLS_PER_NODE << i; if ((total_cnt % level) == 0) { /* save the "if greater than" syscall num */ bintree_syscalls[i] = cur_syscall; /* save the hash for the jf case */ bintree_hashes[i] = state->b_new->hash; for (j = 0; j < i; j++) { if (bintree_syscalls[j] == BTREE_SYSCALL_INVALID || bintree_hashes[j] == BTREE_HSH_INVALID) /* we are near the end of the binary * tree and the jump-to location is * not valid. skip this if-else */ continue; _BPF_INSTR(instr, _BPF_OP(state->arch, BPF_JMP + BPF_JGT), _BPF_JMP_NO, _BPF_JMP_NO, _BPF_K(state->arch, bintree_syscalls[j])); instr.jt = _BPF_JMP_HSH(b_bintree == NULL ? state->b_new->hash : b_bintree->hash); instr.jf = _BPF_JMP_HSH(bintree_hashes[j]); (*blks_added)++; rc = _gen_bpf_insert(state, &instr, &b_bintree, &state->b_head, NULL); if (rc < 0) goto out; } if (b_bintree != NULL) /* this is the last if in this "block". * save it off so the next binary tree * if can "else" to it. */ bintree_hashes[j] = b_bintree->hash; break; } } out: return rc; } /** * Generate the BPF instruction blocks for a given syscall * @param state the BPF state * @param sys the syscall filter DB entry * @param nxt_hash the hash value of the next syscall filter DB entry * @param acc_reset accumulator reset flag * * Generate the BPF instruction blocks for the given syscall filter and return * a pointer to the first block on success; returns NULL on failure. It is * important to note that the block returned has not been added to the hash * table, however, any linked/referenced blocks have been added to the hash * table. * */ static struct bpf_blk *_gen_bpf_syscall(struct bpf_state *state, const struct db_sys_list *sys, uint64_t nxt_hash, bool acc_reset) { int rc; struct bpf_instr instr; struct bpf_blk *blk_c, *blk_s; struct bpf_jump def_jump; struct acc_state a_state; /* we do the memset before the assignment to keep valgrind happy */ memset(&def_jump, 0, sizeof(def_jump)); def_jump = _BPF_JMP_HSH(state->def_hsh); blk_s = _blk_alloc(); if (blk_s == NULL) return NULL; /* setup the accumulator state */ if (acc_reset) { _BPF_INSTR(instr, _BPF_OP(state->arch, BPF_LD + BPF_ABS), _BPF_JMP_NO, _BPF_JMP_NO, _BPF_SYSCALL(state->arch)); blk_s = _blk_append(state, blk_s, &instr); if (blk_s == NULL) return NULL; /* we've loaded the syscall ourselves */ a_state = _ACC_STATE_OFFSET(_BPF_OFFSET_SYSCALL); blk_s->acc_start = _ACC_STATE_UNDEF; blk_s->acc_end = _ACC_STATE_OFFSET(_BPF_OFFSET_SYSCALL); } else { /* we rely on someone else to load the syscall */ a_state = _ACC_STATE_UNDEF; blk_s->acc_start = _ACC_STATE_OFFSET(_BPF_OFFSET_SYSCALL); blk_s->acc_end = _ACC_STATE_OFFSET(_BPF_OFFSET_SYSCALL); } /* generate the argument chains */ blk_c = _gen_bpf_chain(state, sys, sys->chains, &def_jump, &a_state); if (blk_c == NULL) { _blk_free(state, blk_s); return NULL; } /* syscall check */ _BPF_INSTR(instr, _BPF_OP(state->arch, BPF_JMP + BPF_JEQ), _BPF_JMP_HSH(blk_c->hash), _BPF_JMP_HSH(nxt_hash), _BPF_K(state->arch, sys->num)); blk_s = _blk_append(state, blk_s, &instr); if (blk_s == NULL) return NULL; blk_s->priority = sys->priority; /* add to the hash table */ rc = _hsh_add(state, &blk_s, 1); if (rc < 0) { _blk_free(state, blk_s); return NULL; } return blk_s; } /** * Loop through the syscalls in the db_filter and generate their bpf * @param state the BPF state * @param db the filter DB * @param db_secondary the secondary DB * @param Number of blocks added by this function */ static int _gen_bpf_syscalls(struct bpf_state *state, const struct db_filter *db, const struct db_filter *db_secondary, unsigned int *blks_added, uint32_t optimize, unsigned int *bintree_levels) { struct db_sys_list *s_head = NULL, *s_tail = NULL, *s_iter; unsigned int syscall_cnt, empty_cnt = 0; uint64_t *bintree_hashes = NULL, nxt_hsh; unsigned int *bintree_syscalls = NULL; bool acc_reset; int rc = 0; state->arch = db->arch; state->b_head = NULL; state->b_tail = NULL; state->b_new = NULL; *blks_added = 0; /* sort the syscall list */ _sys_sort(db->syscalls, &s_head, &s_tail, optimize); if (db_secondary != NULL) _sys_sort(db_secondary->syscalls, &s_head, &s_tail, optimize); if (optimize == 2) { syscall_cnt = _get_syscall_cnt(state, s_tail); rc = _gen_bpf_init_bintree(&bintree_hashes, &bintree_syscalls, bintree_levels, syscall_cnt, &empty_cnt); if (rc < 0) goto out; } if ((state->arch->token == SCMP_ARCH_X86_64 || state->arch->token == SCMP_ARCH_X32) && (db_secondary == NULL)) acc_reset = false; else acc_reset = true; if (*bintree_levels > 0) /* The accumulator is reset when the first bintree "if" is * generated. */ acc_reset = false; syscall_cnt = 0; /* create the syscall filters and add them to block list group */ for (s_iter = s_tail; s_iter != NULL; s_iter = s_iter->pri_prv) { if (_skip_syscall(state, s_iter)) continue; if (*bintree_levels > 0 && ((syscall_cnt + empty_cnt) % SYSCALLS_PER_NODE) == 0) /* This is the last syscall in the node. go to the * default hash */ nxt_hsh = state->def_hsh; else nxt_hsh = state->b_head == NULL ? state->def_hsh : state->b_head->hash; /* build the syscall filter */ state->b_new = _gen_bpf_syscall(state, s_iter, nxt_hsh, (s_iter == s_head ? acc_reset : false)); if (state->b_new == NULL) goto out; /* add the filter to the list head */ state->b_new->prev = NULL; state->b_new->next = state->b_head; if (state->b_tail != NULL) { state->b_head->prev = state->b_new; state->b_head = state->b_new; } else { state->b_head = state->b_new; state->b_tail = state->b_head; } if (state->b_tail->next != NULL) state->b_tail = state->b_tail->next; (*blks_added)++; syscall_cnt++; /* build the binary tree if and else logic */ if (*bintree_levels > 0) { rc = _gen_bpf_bintree(state, bintree_hashes, bintree_syscalls, *bintree_levels, syscall_cnt + empty_cnt, s_iter->num, blks_added); if (rc < 0) goto out; } } out: if (bintree_hashes != NULL) free(bintree_hashes); if (bintree_syscalls != NULL) free(bintree_syscalls); return rc; } /** * Generate the BPF instruction blocks for a given filter/architecture * @param state the BPF state * @param db the filter DB * @param db_secondary the secondary DB * * Generate the BPF instruction block for the given filter DB(s)/architecture(s) * and return a pointer to the block on success, NULL on failure. The resulting * block assumes that the architecture token has already been loaded into the * BPF accumulator. * */ static struct bpf_blk *_gen_bpf_arch(struct bpf_state *state, const struct db_filter *db, const struct db_filter *db_secondary, uint32_t optimize) { int rc; unsigned int blk_cnt = 0, blks_added = 0, bintree_levels = 0; struct bpf_instr instr; struct bpf_blk *b_iter, *b_bintree; state->arch = db->arch; /* create the syscall filters and add them to block list group */ rc = _gen_bpf_syscalls(state, db, db_secondary, &blks_added, optimize, &bintree_levels); if (rc < 0) goto arch_failure; blk_cnt += blks_added; if (bintree_levels > 0) { _BPF_INSTR(instr, _BPF_OP(state->arch, BPF_LD + BPF_ABS), _BPF_JMP_NO, _BPF_JMP_NO, _BPF_SYSCALL(state->arch)); blk_cnt++; rc = _gen_bpf_insert(state, &instr, &b_bintree, &state->b_head, NULL); if (rc < 0) goto arch_failure; b_bintree->acc_start = _ACC_STATE_UNDEF; b_bintree->acc_end = _ACC_STATE_OFFSET(_BPF_OFFSET_SYSCALL); } /* additional ABI filtering */ if ((state->arch->token == SCMP_ARCH_X86_64 || state->arch->token == SCMP_ARCH_X32) && (db_secondary == NULL)) { _BPF_INSTR(instr, _BPF_OP(state->arch, BPF_LD + BPF_ABS), _BPF_JMP_NO, _BPF_JMP_NO, _BPF_SYSCALL(state->arch)); state->b_new = _blk_append(state, NULL, &instr); if (state->b_new == NULL) goto arch_failure; state->b_new->acc_end = _ACC_STATE_OFFSET(_BPF_OFFSET_SYSCALL); if (state->arch->token == SCMP_ARCH_X86_64) { /* filter out x32 */ _BPF_INSTR(instr, _BPF_OP(state->arch, BPF_JMP + BPF_JGE), _BPF_JMP_NO, _BPF_JMP_NO, _BPF_K(state->arch, X32_SYSCALL_BIT)); if (state->b_head != NULL) instr.jf = _BPF_JMP_HSH(state->b_head->hash); else instr.jf = _BPF_JMP_HSH(state->def_hsh); state->b_new = _blk_append(state, state->b_new, &instr); if (state->b_new == NULL) goto arch_failure; /* NOTE: starting with Linux v4.8 the seccomp filters * are processed both when the syscall is * initially executed as well as after any * tracing processes finish so we need to make * sure we don't trap the -1 syscall which * tracers can use to skip the syscall, see * seccomp(2) for more information */ _BPF_INSTR(instr, _BPF_OP(state->arch, BPF_JMP + BPF_JEQ), _BPF_JMP_NO, _BPF_JMP_HSH(state->bad_arch_hsh), _BPF_K(state->arch, -1)); if (state->b_head != NULL) instr.jt = _BPF_JMP_HSH(state->b_head->hash); else instr.jt = _BPF_JMP_HSH(state->def_hsh); blk_cnt++; } else if (state->arch->token == SCMP_ARCH_X32) { /* filter out x86_64 */ _BPF_INSTR(instr, _BPF_OP(state->arch, BPF_JMP + BPF_JGE), _BPF_JMP_NO, _BPF_JMP_HSH(state->bad_arch_hsh), _BPF_K(state->arch, X32_SYSCALL_BIT)); if (state->b_head != NULL) instr.jt = _BPF_JMP_HSH(state->b_head->hash); else instr.jt = _BPF_JMP_HSH(state->def_hsh); blk_cnt++; } else /* we should never get here */ goto arch_failure; rc = _gen_bpf_insert(state, &instr, &state->b_new, &state->b_head, state->b_new); if (rc < 0) goto arch_failure; } /* do the ABI/architecture check */ _BPF_INSTR(instr, _BPF_OP(state->arch, BPF_JMP + BPF_JEQ), _BPF_JMP_NO, _BPF_JMP_NXT(blk_cnt++), _BPF_K(state->arch, state->arch->token_bpf)); if (state->b_head != NULL) instr.jt = _BPF_JMP_HSH(state->b_head->hash); else instr.jt = _BPF_JMP_HSH(state->def_hsh); rc = _gen_bpf_insert(state, &instr, &state->b_new, &state->b_head, NULL); if (rc < 0) goto arch_failure; state->arch = NULL; return state->b_head; arch_failure: /* NOTE: we do the cleanup here and not just return an error as all of * the instruction blocks may not be added to the hash table when we * hit an error */ state->arch = NULL; b_iter = state->b_head; while (b_iter != NULL) { state->b_new = b_iter->next; _blk_free(state, b_iter); b_iter = state->b_new; } return NULL; } /** * Find the target block for the "next" jump * @param blk the instruction block * @param nxt the next offset * * Find the target block for the TGT_NXT jump using the given offset. Returns * a pointer to the target block on success or NULL on failure. * */ static struct bpf_blk *_gen_bpf_find_nxt(const struct bpf_blk *blk, unsigned int nxt) { struct bpf_blk *iter = blk->next; for (; (iter != NULL) && (nxt > 0); nxt--) iter = iter->next; return iter; } /** * Manage jumps to return instructions * @param state the BPF state * @param blk the instruction block to check * @param offset the instruction offset into the instruction block * @param blk_ret the return instruction block * * Using the given block and instruction offset, calculate the jump distance * between the jumping instruction and return instruction block. If the jump * distance is too great, duplicate the return instruction to reduce the * distance to the maximum value. Returns 1 if a long jump was added, zero if * the existing jump is valid, and negative values on failure. * */ static int _gen_bpf_build_jmp_ret(struct bpf_state *state, struct bpf_blk *blk, unsigned int offset, struct bpf_blk *blk_ret) { unsigned int j_len; uint64_t tgt_hash = blk_ret->hash; struct bpf_blk *b_jmp, *b_new; /* calculate the jump distance */ j_len = blk->blk_cnt - (offset + 1); b_jmp = blk->next; while (b_jmp != NULL && b_jmp != blk_ret && j_len < _BPF_JMP_MAX_RET) { j_len += b_jmp->blk_cnt; b_jmp = b_jmp->next; } if (b_jmp == NULL) return -EFAULT; if (j_len <= _BPF_JMP_MAX_RET && b_jmp == blk_ret) return 0; /* we need a closer return instruction, see if one already exists */ j_len = blk->blk_cnt - (offset + 1); b_jmp = blk->next; while (b_jmp != NULL && b_jmp->hash != tgt_hash && j_len < _BPF_JMP_MAX_RET) { j_len += b_jmp->blk_cnt; b_jmp = b_jmp->next; } if (b_jmp == NULL) return -EFAULT; if (j_len <= _BPF_JMP_MAX_RET && b_jmp->hash == tgt_hash) return 0; /* we need to insert a new return instruction - create one */ b_new = _gen_bpf_action(state, NULL, blk_ret->blks[0].k.tgt.imm_k); if (b_new == NULL) return -EFAULT; /* NOTE - we need to be careful here, we're giving the block a hash * value (this is a sneaky way to ensure we leverage the * inserted long jumps as much as possible) but we never add the * block to the hash table so it won't get cleaned up * automatically */ b_new->hash = tgt_hash; /* insert the jump after the current jumping block */ b_new->prev = blk; b_new->next = blk->next; blk->next->prev = b_new; blk->next = b_new; return 1; } /** * Manage jump lengths by duplicating and adding jumps if needed * @param state the BPF state * @param tail the tail of the instruction block list * @param blk the instruction block to check * @param offset the instruction offset into the instruction block * @param tgt_hash the hash of the jump destination block * * Using the given block and instruction offset, calculate the jump distance * between the jumping instruction and the destination. If the jump distance * is too great, add a long jump instruction to reduce the distance to a legal * value. Returns 1 if a new instruction was added, zero if the existing jump * is valid, and negative values on failure. * */ static int _gen_bpf_build_jmp(struct bpf_state *state, struct bpf_blk *tail, struct bpf_blk *blk, unsigned int offset, uint64_t tgt_hash) { int rc; unsigned int jmp_len; struct bpf_instr instr; struct bpf_blk *b_new, *b_jmp, *b_tgt; /* find the jump target */ b_tgt = tail; while (b_tgt != blk && b_tgt->hash != tgt_hash) b_tgt = b_tgt->prev; if (b_tgt == blk) return -EFAULT; if (b_tgt->blk_cnt == 1 && b_tgt->blks[0].op == _BPF_OP(state->arch, BPF_RET)) { rc = _gen_bpf_build_jmp_ret(state, blk, offset, b_tgt); if (rc == 1) return 1; else if (rc < 0) return rc; } /* calculate the jump distance */ jmp_len = blk->blk_cnt - (offset + 1); b_jmp = blk->next; while (b_jmp != NULL && b_jmp != b_tgt && jmp_len < _BPF_JMP_MAX) { jmp_len += b_jmp->blk_cnt; b_jmp = b_jmp->next; } if (b_jmp == NULL) return -EFAULT; if (jmp_len <= _BPF_JMP_MAX && b_jmp == b_tgt) return 0; /* we need a long jump, see if one already exists */ jmp_len = blk->blk_cnt - (offset + 1); b_jmp = blk->next; while (b_jmp != NULL && b_jmp->hash != tgt_hash && jmp_len < _BPF_JMP_MAX) { jmp_len += b_jmp->blk_cnt; b_jmp = b_jmp->next; } if (b_jmp == NULL) return -EFAULT; if (jmp_len <= _BPF_JMP_MAX && b_jmp->hash == tgt_hash) return 0; /* we need to insert a long jump - create one */ _BPF_INSTR(instr, _BPF_OP(state->arch, BPF_JMP + BPF_JA), _BPF_JMP_NO, _BPF_JMP_NO, _BPF_JMP_HSH(tgt_hash)); b_new = _blk_append(state, NULL, &instr); if (b_new == NULL) return -EFAULT; /* NOTE - we need to be careful here, we're giving the block a hash * value (this is a sneaky way to ensure we leverage the * inserted long jumps as much as possible) but we never add the * block to the hash table so it won't get cleaned up * automatically */ b_new->hash = tgt_hash; /* insert the jump after the current jumping block */ b_new->prev = blk; b_new->next = blk->next; blk->next->prev = b_new; blk->next = b_new; return 1; } /** * Generate the BPF program for the given filter collection * @param state the BPF state * @param col the filter collection * * Generate the BPF program for the given filter collection. Returns zero on * success, negative values on failure. * */ static int _gen_bpf_build_bpf(struct bpf_state *state, const struct db_filter_col *col) { int rc; int iter; uint64_t h_val; unsigned int res_cnt; unsigned int jmp_len; int arch_x86_64 = -1, arch_x32 = -1; struct bpf_instr instr; struct bpf_instr *i_iter; struct bpf_blk *b_badarch, *b_default; struct bpf_blk *b_head = NULL, *b_tail = NULL, *b_iter, *b_new, *b_jmp; struct db_filter *db_secondary = NULL; struct arch_def pseudo_arch; /* create a fake architecture definition for use in the early stages */ memset(&pseudo_arch, 0, sizeof(pseudo_arch)); pseudo_arch.endian = col->endian; state->arch = &pseudo_arch; /* generate the badarch action */ b_badarch = _gen_bpf_action(state, NULL, state->attr->act_badarch); if (b_badarch == NULL) return -ENOMEM; rc = _hsh_add(state, &b_badarch, 1); if (rc < 0) return rc; state->bad_arch_hsh = b_badarch->hash; /* generate the default action */ b_default = _gen_bpf_action(state, NULL, state->attr->act_default); if (b_default == NULL) return -ENOMEM; rc = _hsh_add(state, &b_default, 0); if (rc < 0) return rc; state->def_hsh = b_default->hash; /* load the architecture token/number */ _BPF_INSTR(instr, _BPF_OP(state->arch, BPF_LD + BPF_ABS), _BPF_JMP_NO, _BPF_JMP_NO, _BPF_ARCH(state->arch)); b_head = _blk_append(state, NULL, &instr); if (b_head == NULL) return -ENOMEM; b_head->acc_end = _ACC_STATE_OFFSET(_BPF_OFFSET_ARCH); rc = _hsh_add(state, &b_head, 1); if (rc < 0) return rc; b_tail = b_head; /* generate the per-architecture filters */ for (iter = 0; iter < col->filter_cnt; iter++) { if (col->filters[iter]->arch->token == SCMP_ARCH_X86_64) arch_x86_64 = iter; if (col->filters[iter]->arch->token == SCMP_ARCH_X32) arch_x32 = iter; } for (iter = 0; iter < col->filter_cnt; iter++) { /* figure out the secondary arch filter mess */ if (iter == arch_x86_64) { if (arch_x32 > iter) db_secondary = col->filters[arch_x32]; else if (arch_x32 >= 0) continue; } else if (iter == arch_x32) { if (arch_x86_64 > iter) db_secondary = col->filters[arch_x86_64]; else if (arch_x86_64 >= 0) continue; } else db_secondary = NULL; /* create the filter for the architecture(s) */ b_new = _gen_bpf_arch(state, col->filters[iter], db_secondary, col->attr.optimize); if (b_new == NULL) return -ENOMEM; b_new->prev = b_tail; b_tail->next = b_new; b_tail = b_new; while (b_tail->next != NULL) b_tail = b_tail->next; } /* add a badarch action to the end */ b_badarch->prev = b_tail; b_badarch->next = NULL; b_tail->next = b_badarch; b_tail = b_badarch; /* reset the state to the pseudo_arch for the final resolution */ state->arch = &pseudo_arch; /* resolve any TGT_NXT jumps at the top level */ b_iter = b_head; do { for (iter = 0; iter < b_iter->blk_cnt; iter++) { i_iter = &b_iter->blks[iter]; if (i_iter->jt.type == TGT_NXT) { b_jmp = _gen_bpf_find_nxt(b_iter, i_iter->jt.tgt.nxt); if (b_jmp == NULL) { rc = -EFAULT; goto state_reset; } i_iter->jt = _BPF_JMP_HSH(b_jmp->hash); } if (i_iter->jf.type == TGT_NXT) { b_jmp = _gen_bpf_find_nxt(b_iter, i_iter->jf.tgt.nxt); if (b_jmp == NULL) { rc = -EFAULT; goto state_reset; } i_iter->jf = _BPF_JMP_HSH(b_jmp->hash); } /* we shouldn't need to worry about a TGT_NXT in k */ } b_iter = b_iter->next; } while (b_iter != NULL && b_iter->next != NULL); /* pull in all of the TGT_PTR_HSH jumps, one layer at a time */ b_iter = b_tail; do { b_jmp = NULL; /* look for jumps - backwards (shorter jumps) */ for (iter = b_iter->blk_cnt - 1; (iter >= 0) && (b_jmp == NULL); iter--) { i_iter = &b_iter->blks[iter]; if (i_iter->jt.type == TGT_PTR_HSH) b_jmp = _hsh_find_once(state, i_iter->jt.tgt.hash); if (b_jmp == NULL && i_iter->jf.type == TGT_PTR_HSH) b_jmp = _hsh_find_once(state, i_iter->jf.tgt.hash); if (b_jmp == NULL && i_iter->k.type == TGT_PTR_HSH) b_jmp = _hsh_find_once(state, i_iter->k.tgt.hash); if (b_jmp != NULL) { /* do we need to reload the accumulator? */ if ((b_jmp->acc_start.offset != -1) && !_ACC_CMP_EQ(b_iter->acc_end, b_jmp->acc_start)) { if (b_jmp->acc_start.mask != ARG_MASK_MAX) { _BPF_INSTR(instr, _BPF_OP(state->arch, BPF_ALU + BPF_AND), _BPF_JMP_NO, _BPF_JMP_NO, _BPF_K(state->arch, b_jmp->acc_start.mask)); b_jmp = _blk_prepend(state, b_jmp, &instr); if (b_jmp == NULL) { rc = -EFAULT; goto state_reset; } } _BPF_INSTR(instr, _BPF_OP(state->arch, BPF_LD + BPF_ABS), _BPF_JMP_NO, _BPF_JMP_NO, _BPF_K(state->arch, b_jmp->acc_start.offset)); b_jmp = _blk_prepend(state, b_jmp, &instr); if (b_jmp == NULL) { rc = -EFAULT; goto state_reset; } /* not reliant on the accumulator */ b_jmp->acc_start = _ACC_STATE_UNDEF; } /* insert the new block after this block */ b_jmp->prev = b_iter; b_jmp->next = b_iter->next; b_iter->next = b_jmp; if (b_jmp->next) b_jmp->next->prev = b_jmp; } } if (b_jmp != NULL) { while (b_tail->next != NULL) b_tail = b_tail->next; b_iter = b_tail; } else b_iter = b_iter->prev; } while (b_iter != NULL); /* NOTE - from here to the end of the function we need to fail via the * the build_bpf_free_blks label, not just return an error; see * the _gen_bpf_build_jmp() function for details */ /* check for long jumps and insert if necessary, we also verify that * all our jump targets are valid at this point in the process */ b_iter = b_tail; do { res_cnt = 0; for (iter = b_iter->blk_cnt - 1; iter >= 0; iter--) { i_iter = &b_iter->blks[iter]; switch (i_iter->jt.type) { case TGT_NONE: case TGT_IMM: break; case TGT_PTR_HSH: h_val = i_iter->jt.tgt.hash; rc = _gen_bpf_build_jmp(state, b_tail, b_iter, iter, h_val); if (rc < 0) goto build_bpf_free_blks; res_cnt += rc; break; default: /* fatal error */ rc = -EFAULT; goto build_bpf_free_blks; } switch (i_iter->jf.type) { case TGT_NONE: case TGT_IMM: break; case TGT_PTR_HSH: h_val = i_iter->jf.tgt.hash; rc = _gen_bpf_build_jmp(state, b_tail, b_iter, iter, h_val); if (rc < 0) goto build_bpf_free_blks; res_cnt += rc; break; default: /* fatal error */ rc = -EFAULT; goto build_bpf_free_blks; } } if (res_cnt == 0) b_iter = b_iter->prev; } while (b_iter != NULL); /* build the bpf program */ do { b_iter = b_head; /* resolve the TGT_PTR_HSH jumps */ for (iter = 0; iter < b_iter->blk_cnt; iter++) { i_iter = &b_iter->blks[iter]; if (i_iter->jt.type == TGT_PTR_HSH) { h_val = i_iter->jt.tgt.hash; jmp_len = b_iter->blk_cnt - (iter + 1); b_jmp = b_iter->next; while (b_jmp != NULL && b_jmp->hash != h_val) { jmp_len += b_jmp->blk_cnt; b_jmp = b_jmp->next; } if (b_jmp == NULL || jmp_len > _BPF_JMP_MAX) { rc = -EFAULT; goto build_bpf_free_blks; } i_iter->jt = _BPF_JMP_IMM(jmp_len); } if (i_iter->jf.type == TGT_PTR_HSH) { h_val = i_iter->jf.tgt.hash; jmp_len = b_iter->blk_cnt - (iter + 1); b_jmp = b_iter->next; while (b_jmp != NULL && b_jmp->hash != h_val) { jmp_len += b_jmp->blk_cnt; b_jmp = b_jmp->next; } if (b_jmp == NULL || jmp_len > _BPF_JMP_MAX) { rc = -EFAULT; goto build_bpf_free_blks; } i_iter->jf = _BPF_JMP_IMM(jmp_len); } if (i_iter->k.type == TGT_PTR_HSH) { h_val = i_iter->k.tgt.hash; jmp_len = b_iter->blk_cnt - (iter + 1); b_jmp = b_tail; while (b_jmp->hash != h_val) b_jmp = b_jmp->prev; b_jmp = b_jmp->prev; while (b_jmp != b_iter) { jmp_len += b_jmp->blk_cnt; b_jmp = b_jmp->prev; } if (b_jmp == NULL) { rc = -EFAULT; goto build_bpf_free_blks; } i_iter->k = _BPF_K(state->arch, jmp_len); } } /* build the bpf program */ rc = _bpf_append_blk(state->bpf, b_iter); if (rc < 0) goto build_bpf_free_blks; /* we're done with the block, free it */ b_head = b_iter->next; _blk_free(state, b_iter); } while (b_head != NULL); state->arch = NULL; return 0; build_bpf_free_blks: b_iter = b_head; while (b_iter != NULL) { b_jmp = b_iter->next; _hsh_remove(state, b_iter->hash); __blk_free(state, b_iter); b_iter = b_jmp; } state_reset: state->arch = NULL; return rc; } /** * Generate a BPF representation of the filter DB * @param col the seccomp filter collection * @param prgm_ptr the bpf program pointer * * This function generates a BPF representation of the given filter collection. * Returns zero on success, negative values on failure. * */ int gen_bpf_generate(const struct db_filter_col *col, struct bpf_program **prgm_ptr) { int rc; struct bpf_state state; struct bpf_program *prgm; if (col->filter_cnt == 0) return -EINVAL; memset(&state, 0, sizeof(state)); state.attr = &col->attr; state.bpf = zmalloc(sizeof(*(prgm))); if (state.bpf == NULL) return -ENOMEM; rc = _gen_bpf_build_bpf(&state, col); if (rc == 0) { *prgm_ptr = state.bpf; state.bpf = NULL; } _state_release(&state); return rc; } /** * Free memory associated with a BPF representation * @param program the BPF representation * * Free the memory associated with a BPF representation generated by the * gen_bpf_generate() function. * */ void gen_bpf_release(struct bpf_program *program) { _program_free(program); } libseccomp-2.5.4/src/syscalls.perf.template0000644000000000000000000000614414467535325017477 0ustar rootroot%{ /** * Copyright (c) 2012 Red Hat * Copyright (c) 2020 Red Hat * Copyright (c) 2022 Microsoft Corporation. * * Authors: Paul Moore * Giuseppe Scrivano */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include "syscalls.h" %} struct arch_syscall_table; %% @@SYSCALLS_TABLE@@ %% static int __syscall_offset_value(const struct arch_syscall_table *s, int offset) { return *(int *)((char *)s + offset); } static const struct arch_syscall_table *__syscall_lookup_name(const char *name) { return in_word_set(name, strlen(name)); } static const struct arch_syscall_table *__syscall_lookup_num(int num, int offset_arch) { unsigned int i; for (i = 0; i < sizeof(wordlist)/sizeof(wordlist[0]); i++) { if (__syscall_offset_value(&wordlist[i], offset_arch) == num) return &wordlist[i]; } return NULL; } int syscall_resolve_name(const char *name, int offset_arch) { const struct arch_syscall_table *entry; entry = __syscall_lookup_name(name); if (!entry) return __NR_SCMP_ERROR; return __syscall_offset_value(entry, offset_arch); } const char *syscall_resolve_num(int num, int offset_arch) { const struct arch_syscall_table *entry; entry = __syscall_lookup_num(num, offset_arch); if (!entry) return NULL; return (stringpool + entry->name); } enum scmp_kver syscall_resolve_name_kver(const char *name, int offset_kver) { const struct arch_syscall_table *entry; entry = __syscall_lookup_name(name); if (!entry) return __SCMP_KV_NULL; return __syscall_offset_value(entry, offset_kver); } enum scmp_kver syscall_resolve_num_kver(int num, int offset_arch, int offset_kver) { const struct arch_syscall_table *entry; entry = __syscall_lookup_num(num, offset_arch); if (!entry) return __SCMP_KV_NULL; return __syscall_offset_value(entry, offset_kver); } /* DANGER: this is NOT THREAD-SAFE, use only for testing */ const struct arch_syscall_def *syscall_iterate(unsigned int spot, int offset) { unsigned int iter; static struct arch_syscall_def arch_def; /* DANGER: see the note above, NOT THREAD-SAFE, use only for testing */ arch_def.name = NULL; arch_def.num = __NR_SCMP_ERROR; for (iter = 0; iter < sizeof(wordlist)/sizeof(wordlist[0]); iter++) { if (wordlist[iter].index == spot) { arch_def.name = stringpool + wordlist[iter].name; arch_def.num = __syscall_offset_value(&wordlist[iter], offset); return &arch_def; } } return &arch_def; } libseccomp-2.5.4/src/arch-syscall-check0000755000000000000000000000357014467535324016537 0ustar rootroot#!/bin/bash # # libseccomp syscall build-time checking script # # Copyright (c) 2021 Microsoft Corporation. # # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # # Based on an idea from GNU coreutils abs_topsrcdir="$(unset CDPATH; cd $(dirname $0)/.. && pwd)" SYSCALL_CSV="$abs_topsrcdir/src/syscalls.csv" SYSCALL_HDR="$abs_topsrcdir/include/seccomp-syscalls.h" function check_snr() { (export LC_ALL=C; diff \ --label "CSV ($SYSCALL_CSV)" --label "HDR ($SYSCALL_HDR)" -u \ <(tail -n+2 $SYSCALL_CSV | cut -d',' -f1 | sort -u) \ <(grep __SNR_ $SYSCALL_HDR | awk '{ print $2 }' | \ sed -e 's/^__SNR_//' | sort -u)) return $? } function check_pnr() { # NOTE: we don't care if we have __PNR_ define that isn't needed, we # likely want to preserve those values so they aren't mistakenly # reused by a new __PNR_ in the future (export LC_ALL=C; diff \ <(tail -n+2 $SYSCALL_CSV | grep "PNR" | cut -d',' -f1 | \ sort -u) \ <(grep "#define __PNR_" $SYSCALL_HDR | awk '{ print $2 }' | \ sed -e 's/^__PNR_//' | sort -u) | \ grep "^<") [[ $? -eq 1 ]] && return 0 || return 1 } rc=0 echo ">>> CHECKING FOR MISSING __SNR_syscall VALUES" check_snr rc=$(( $rc + $? )) echo ">>> CHECKING FOR MISSING __PNR_syscall VALUES" check_pnr rc=$(( $rc + $? )) exit $rc libseccomp-2.5.4/src/arch-s390.h0000644000000000000000000000025014467535324014723 0ustar rootroot/* * Copyright 2015 IBM * Author: Jan Willeke */ #ifndef _ARCH_S390_H #define _ARCH_S390_H #include "arch.h" ARCH_DECL(s390) #endif libseccomp-2.5.4/src/arch-ppc64.h0000644000000000000000000000154614467535324015172 0ustar rootroot/** * Enhanced Seccomp PPC64 Specific Code * * Copyright (c) 2014 Red Hat * Author: Paul Moore * */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _ARCH_PPC64_H #define _ARCH_PPC64_H #include "arch.h" ARCH_DECL(ppc64) ARCH_DECL(ppc64le) #endif libseccomp-2.5.4/src/arch-loongarch64.c0000644000000000000000000000247614467535324016362 0ustar rootroot/** * Enhanced Seccomp 64-bit LoongArch Syscall Table * * Copyright (c) 2021 Xiaotian Wu */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include "arch.h" #include "arch-loongarch64.h" #include "syscalls.h" ARCH_DEF(loongarch64) const struct arch_def arch_def_loongarch64 = { .token = SCMP_ARCH_LOONGARCH64, .token_bpf = AUDIT_ARCH_LOONGARCH64, .size = ARCH_SIZE_64, .endian = ARCH_ENDIAN_LITTLE, .syscall_resolve_name_raw = loongarch64_syscall_resolve_name, .syscall_resolve_num_raw = loongarch64_syscall_resolve_num, .syscall_rewrite = NULL, .rule_add = NULL, .syscall_name_kver = loongarch64_syscall_name_kver, .syscall_num_kver = loongarch64_syscall_num_kver, }; libseccomp-2.5.4/src/db.h0000644000000000000000000001361114467535324013704 0ustar rootroot/** * Enhanced Seccomp Filter DB * * Copyright (c) 2012,2016 Red Hat * Copyright (c) 2022 Microsoft Corporation * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _FILTER_DB_H #define _FILTER_DB_H #include #include #include #include "arch.h" #include "gen_bpf.h" /* XXX - need to provide doxygen comments for the types here */ struct db_api_arg { unsigned int arg; enum scmp_compare op; scmp_datum_t mask; scmp_datum_t datum; bool valid; }; struct db_api_rule_list { uint32_t action; int syscall; bool strict; struct db_api_arg args[ARG_COUNT_MAX]; struct db_api_rule_list *prev, *next; }; struct db_arg_chain_tree { /* argument number (a0 = 0, a1 = 1, etc.) */ unsigned int arg; /* true to indicate this is the high 32-bit word of a 64-bit value */ bool arg_h_flg; /* argument bpf offset */ unsigned int arg_offset; /* comparison operator */ enum scmp_compare op; enum scmp_compare op_orig; /* syscall argument value */ uint32_t mask; uint32_t datum; scmp_datum_t datum_full; /* actions */ bool act_t_flg; bool act_f_flg; uint32_t act_t; uint32_t act_f; /* list of nodes on this level */ struct db_arg_chain_tree *lvl_prv, *lvl_nxt; /* next node in the chain */ struct db_arg_chain_tree *nxt_t; struct db_arg_chain_tree *nxt_f; unsigned int refcnt; }; #define ARG_MASK_MAX ((uint32_t)-1) struct db_sys_list { /* native syscall number */ unsigned int num; /* priority - higher is better */ unsigned int priority; /* the argument chain heads */ struct db_arg_chain_tree *chains; unsigned int node_cnt; /* action in the case of no argument chains */ uint32_t action; struct db_sys_list *next; /* temporary use only by the BPF generator */ struct db_sys_list *pri_prv, *pri_nxt; bool valid; }; struct db_filter_attr { /* action to take if we don't match an explicit allow/deny */ uint32_t act_default; /* action to take if we don't match the architecture */ uint32_t act_badarch; /* NO_NEW_PRIVS related attributes */ uint32_t nnp_enable; /* SECCOMP_FILTER_FLAG_TSYNC related attributes */ uint32_t tsync_enable; /* allow rules with a -1 syscall value */ uint32_t api_tskip; /* SECCOMP_FILTER_FLAG_LOG related attributes */ uint32_t log_enable; /* SPEC_ALLOW related attributes */ uint32_t spec_allow; /* SCMP_FLTATR_CTL_OPTIMIZE related attributes */ uint32_t optimize; /* return the raw system return codes */ uint32_t api_sysrawrc; /* request SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV */ uint32_t wait_killable_recv; }; struct db_filter { /* target architecture */ const struct arch_def *arch; /* syscall filters, kept as a sorted single-linked list */ struct db_sys_list *syscalls; unsigned int syscall_cnt; /* list of rules used to build the filters, kept in order */ struct db_api_rule_list *rules; }; struct db_filter_snap { /* individual filters */ struct db_filter **filters; unsigned int filter_cnt; bool shadow; struct db_filter_snap *next; }; struct db_filter_col { /* verification / state */ int state; /* attributes */ struct db_filter_attr attr; /* individual filters */ int endian; struct db_filter **filters; unsigned int filter_cnt; /* transaction snapshots */ struct db_filter_snap *snapshots; /* userspace notification */ bool notify_used; /* precomputed programs */ struct bpf_program *prgm_bpf; }; /** * Iterate over each item in the DB list * @param iter the iterator * @param list the list * * This macro acts as for()/while() conditional and iterates the following * statement for each item in the given list. * */ #define db_list_foreach(iter,list) \ for (iter = (list); iter != NULL; iter = iter->next) struct db_api_rule_list *db_rule_dup(const struct db_api_rule_list *src); struct db_filter_col *db_col_init(uint32_t def_action); int db_col_reset(struct db_filter_col *col, uint32_t def_action); void db_col_release(struct db_filter_col *col); int db_col_valid(struct db_filter_col *col); int db_col_action_valid(const struct db_filter_col *col, uint32_t action); int db_col_merge(struct db_filter_col *col_dst, struct db_filter_col *col_src); int db_col_arch_exist(struct db_filter_col *col, uint32_t arch_token); int db_col_attr_get(const struct db_filter_col *col, enum scmp_filter_attr attr, uint32_t *value); uint32_t db_col_attr_read(const struct db_filter_col *col, enum scmp_filter_attr attr); int db_col_attr_set(struct db_filter_col *col, enum scmp_filter_attr attr, uint32_t value); int db_col_db_new(struct db_filter_col *col, const struct arch_def *arch); int db_col_db_add(struct db_filter_col *col, struct db_filter *db); int db_col_db_remove(struct db_filter_col *col, uint32_t arch_token); int db_col_rule_add(struct db_filter_col *col, bool strict, uint32_t action, int syscall, unsigned int arg_cnt, const struct scmp_arg_cmp *arg_array); int db_col_syscall_priority(struct db_filter_col *col, int syscall, uint8_t priority); int db_col_transaction_start(struct db_filter_col *col); void db_col_transaction_abort(struct db_filter_col *col); void db_col_transaction_commit(struct db_filter_col *col); int db_col_precompute(struct db_filter_col *col); void db_col_precompute_reset(struct db_filter_col *col); int db_rule_add(struct db_filter *db, const struct db_api_rule_list *rule); #endif libseccomp-2.5.4/src/arch-loongarch64.h0000644000000000000000000000151214467535324016355 0ustar rootroot/** * Enhanced Seccomp 64-bit LoongArch Syscall Table * * Copyright (c) 2021 Xiaotian Wu */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _ARCH_LOONGARCH64_H #define _ARCH_LOONGARCH64_H #include "arch.h" ARCH_DECL(loongarch64) #endif libseccomp-2.5.4/src/arch-parisc64.c0000644000000000000000000000124314467535324015656 0ustar rootroot/* * Copyright (c) 2016 Helge Deller * Author: Helge Deller */ #include #include #include #include "arch.h" #include "arch-parisc64.h" #include "syscalls.h" ARCH_DEF(parisc64) const struct arch_def arch_def_parisc64 = { .token = SCMP_ARCH_PARISC64, .token_bpf = AUDIT_ARCH_PARISC64, .size = ARCH_SIZE_64, .endian = ARCH_ENDIAN_BIG, .syscall_resolve_name_raw = parisc64_syscall_resolve_name, .syscall_resolve_num_raw = parisc64_syscall_resolve_num, .syscall_rewrite = NULL, .rule_add = NULL, .syscall_name_kver = parisc64_syscall_name_kver, .syscall_num_kver = parisc64_syscall_num_kver, }; libseccomp-2.5.4/src/arch-parisc.h0000644000000000000000000000145414467535324015515 0ustar rootroot/** * Enhanced Seccomp PARISC Specific Code * * Copyright (c) 2016 Helge Deller * */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _ARCH_PARISC_H #define _ARCH_PARISC_H #include "arch.h" ARCH_DECL(parisc) #endif libseccomp-2.5.4/src/arch-m68k.c0000644000000000000000000000350314467535324015011 0ustar rootroot/** * Enhanced Seccomp m68k Specific Code * * Copyright (c) 2015 Freescale * 2017-2023 John Paul Adrian Glaubitz * Author: Bogdan Purcareata * John Paul Adrian Glaubitz * * Derived from the PPC-specific code * */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #include #include #include "db.h" #include "syscalls.h" #include "arch.h" #include "arch-m68k.h" /* m68k syscall numbers */ #define __m68k_NR_socketcall 102 #define __m68k_NR_ipc 117 ARCH_DEF(m68k) const struct arch_def arch_def_m68k = { .token = SCMP_ARCH_M68K, .token_bpf = AUDIT_ARCH_M68K, .size = ARCH_SIZE_32, .endian = ARCH_ENDIAN_BIG, .sys_socketcall = __m68k_NR_socketcall, .sys_ipc = __m68k_NR_ipc, .syscall_resolve_name = abi_syscall_resolve_name_munge, .syscall_resolve_name_raw = m68k_syscall_resolve_name, .syscall_resolve_num = abi_syscall_resolve_num_munge, .syscall_resolve_num_raw = m68k_syscall_resolve_num, .syscall_rewrite = abi_syscall_rewrite, .rule_add = abi_rule_add, .syscall_name_kver = m68k_syscall_name_kver, .syscall_num_kver = m68k_syscall_num_kver, }; libseccomp-2.5.4/configure.ac0000644000000000000000000001033214467535324014642 0ustar rootrootdnl #### dnl # Seccomp Library dnl # dnl # dnl # This library is free software; you can redistribute it and/or modify it dnl # under the terms of version 2.1 of the GNU Lesser General Public License dnl # as published by the Free Software Foundation. dnl # dnl # This library is distributed in the hope that it will be useful, but dnl # WITHOUT ANY WARRANTY; without even the implied warranty of dnl # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser dnl # General Public License for more details. dnl # dnl # You should have received a copy of the GNU Lesser General Public License dnl # along with this library; if not, see . dnl # dnl #### dnl libseccomp defines dnl #### AC_INIT([libseccomp], [0.0.0]) dnl #### dnl autoconf configuration dnl #### AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_HEADERS([configure.h]) AC_CONFIG_MACRO_DIR([m4]) dnl #### dnl automake configuration dnl #### dnl NOTE: Automake < 1.12 didn't have serial-tests and gives an error if it dnl sees this, but for automake >= 1.13 serial-tests is required so we have to dnl include it. Solution is to test for the version of automake (by running dnl an external command) and provide it if necessary. Note we have to do this dnl entirely using m4 macros since automake queries this macro by running dnl 'autoconf --trace ...'. m4_define([serial_tests], [ m4_esyscmd([automake --version | head -1 | awk '{split ($NF,a,"."); if (a[1] == 1 && a[2] >= 12) { print "serial-tests" }}' ]) ]) dnl # NOTE: do not [quote] this parameter AM_INIT_AUTOMAKE(-Wall foreign subdir-objects tar-pax serial_tests) dnl #### dnl build tools dnl #### AC_PROG_CC AM_PROG_CC_C_O m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) dnl #### dnl libtool configuration dnl #### LT_INIT([shared pic-only]) dnl #### dnl enable silent builds by default dnl #### m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) dnl #### dnl build flags dnl NOTE: the '-Umips' is here because MIPS GCC compilers "helpfully" define it dnl for us which wreaks havoc on the build dnl #### AM_CPPFLAGS="-I\${top_srcdir}/include -I\${top_builddir}/include" AM_CFLAGS="-Wall -Umips" AM_LDFLAGS="-Wl,-z -Wl,relro" AC_SUBST([AM_CPPFLAGS]) AC_SUBST([AM_CFLAGS]) AC_SUBST([AM_LDFLAGS]) dnl #### dnl check build system seccomp awareness dnl #### AC_CHECK_HEADERS_ONCE([linux/seccomp.h]) dnl #### dnl version information dnl #### VERSION_MAJOR=$(echo ${VERSION} | cut -d'.' -f 1) VERSION_MINOR=$(echo ${VERSION} | cut -d'.' -f 2) VERSION_MICRO=$(echo ${VERSION} | cut -d'.' -f 3) AC_SUBST([VERSION_MAJOR]) AC_SUBST([VERSION_MINOR]) AC_SUBST([VERSION_MICRO]) dnl #### dnl cython checks dnl #### AC_CHECK_PROGS(cython, cython3 cython, "no") AS_IF([test "$cython" != no], [ AC_MSG_CHECKING([cython version]) CYTHON_VER_FULL=$(cython -V 2>&1 | cut -d' ' -f 3); CYTHON_VER_MAJ=$(echo $CYTHON_VER_FULL | cut -d'.' -f 1); CYTHON_VER_MIN=$(echo $CYTHON_VER_FULL | cut -d'.' -f 2); AC_MSG_RESULT([$CYTHON_VER_FULL]) ],[ CYTHON_VER_MAJ=0 CYTHON_VER_MIN=0 ]) dnl #### dnl python binding checks dnl #### AC_ARG_ENABLE([python], [AS_HELP_STRING([--enable-python], [build the python bindings, requires cython])]) AS_IF([test "$enable_python" = yes], [ # cython version check AS_IF([test "$CYTHON_VER_MAJ" -eq 0 -a "$CYTHON_VER_MIN" -lt 29], [ AC_MSG_ERROR([python bindings require cython 0.29 or higher]) ]) AM_PATH_PYTHON([3]) ]) AM_CONDITIONAL([ENABLE_PYTHON], [test "$enable_python" = yes]) AC_DEFINE_UNQUOTED([ENABLE_PYTHON], [$(test "$enable_python" = "yes" && echo 1 || echo 0)], [Python bindings build flag.]) AC_CHECK_TOOL(GPERF, gperf) if test -z "$GPERF"; then AC_MSG_ERROR([please install gperf]) fi dnl #### dnl coverity checks dnl #### AC_CHECK_PROG(have_coverity, cov-build, "yes", "no") AM_CONDITIONAL(COVERITY, test "$have_coverity" = yes) dnl #### dnl code coverage checks dnl -> https://www.gnu.org/software/autoconf-archive/ax_code_coverage.html dnl #### AX_CODE_COVERAGE dnl #### dnl version dependent files dnl #### AC_CONFIG_FILES([ libseccomp.pc include/seccomp.h ]) dnl #### dnl makefiles dnl #### AC_CONFIG_FILES([ Makefile include/Makefile src/Makefile src/python/Makefile tools/Makefile tests/Makefile doc/Makefile ]) dnl #### dnl done dnl #### AC_OUTPUT libseccomp-2.5.4/autogen.sh0000755000000000000000000000132314467535324014355 0ustar rootroot#!/bin/sh -e # # Seccomp Library Autotools Configure Script # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License # as published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # test -d m4 || mkdir m4 autoreconf -fi rm -rf autom4te.cache libseccomp-2.5.4/.gitignore0000644000000000000000000000044714467535324014352 0ustar rootroot*~ *.la *.lo *.o *.pc *.swp *.orig *.gcno *.gcda *.info *-coverage/ .deps .dirstamp .libs .stgit-* .stgitmail.txt configure Makefile Makefile.in cscope.* tags /autom4te.cache /aclocal.m4 /build-aux /config.* /configure /configure.h* /libtool /m4 /stamp-h1 /cov-int /libseccomp-coverity_*.tar.gz libseccomp-2.5.4/Makefile.am0000644000000000000000000000515314467535324014415 0ustar rootroot#### # Seccomp Library # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License # as published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # @CODE_COVERAGE_RULES@ CODE_COVERAGE_OUTPUT_FILE = libseccomp.lcov.info CODE_COVERAGE_OUTPUT_DIRECTORY = libseccomp.lcov.html.d CODE_COVERAGE_IGNORE_PATTERN = \ */usr/include/* \ */src/arch-syscall-check.c \ */src/syscalls.perf ACLOCAL_AMFLAGS = -I m4 SUBDIRS = include src tools tests doc pkgconfdir = ${libdir}/pkgconfig pkgconf_DATA = libseccomp.pc EXTRA_DIST = \ CHANGELOG CREDITS LICENSE \ README.md CONTRIBUTING.md SECURITY.md # support silent builds AM_MAKEFLAGS_0 = --quiet --no-print-directory AM_MAKEFLAGS_1 = AM_MAKEFLAGS_ = ${AM_MAKEFLAGS_0} AM_MAKEFLAGS = ${AM_MAKEFLAGS_@AM_V@} # enable python during distcheck AM_DISTCHECK_CONFIGURE_FLAGS = --enable-python check-build: all ${MAKE} ${AM_MAKEFLAGS} -C src check-build ${MAKE} ${AM_MAKEFLAGS} -C tests check-build check-syntax: @./tools/check-syntax if CODE_COVERAGE_ENABLED test-code-coverage: LIBSECCOMP_TSTCFG_TYPE=basic,bpf-sim \ ${MAKE} ${AM_MAKEFLAGS} check-code-coverage endif if COVERITY coverity-build: clean cov-build --dir cov-int ${MAKE} ${AM_MAKEFLAGS} check-build endif if COVERITY coverity-tarball: coverity-build @if git rev-parse HEAD &> /dev/null; then \ rev_full=$$(git rev-parse HEAD); \ rev=$$(echo $$rev_full | cut -c1-8); \ else \ rev_full=$$(date --iso-8601=date); \ rev=$$rev_full; \ fi; \ tar czf libseccomp-coverity_$$rev.tar.gz cov-int; \ echo " HEAD revision: $$rev_full"; \ ls -l libseccomp-coverity_$$rev.tar.gz endif help: @echo "libseccomp build system" @echo " make targets:" @echo " (none): build the library" @echo " clean: remove all build artifacts" @echo " check: run the automated regression tests" @echo " check-build: build the library and all tests" @echo " check-syntax: verify the code style" @echo " distcheck: verify the build for distribution" @echo " dist-gzip: build a release tarball" @echo " coverity-tarball: build a tarball for use with Coverity (opt)" clean-local: ${RM} -rf cov-int libseccomp-coverity_*.tar.gz libseccomp-2.5.4/include/0000755000000000000000000000000014467535324014000 5ustar rootrootlibseccomp-2.5.4/include/seccomp-syscalls.h0000644000000000000000000014332214467535324017442 0ustar rootroot/** * Seccomp Library * * Copyright (c) 2019 Cisco Systems * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _SECCOMP_H #error "do not include seccomp-syscalls.h directly, use seccomp.h instead" #endif /* * pseudo syscall definitions */ /* socket syscalls */ #define __PNR_socket -101 #define __PNR_bind -102 #define __PNR_connect -103 #define __PNR_listen -104 #define __PNR_accept -105 #define __PNR_getsockname -106 #define __PNR_getpeername -107 #define __PNR_socketpair -108 #define __PNR_send -109 #define __PNR_recv -110 #define __PNR_sendto -111 #define __PNR_recvfrom -112 #define __PNR_shutdown -113 #define __PNR_setsockopt -114 #define __PNR_getsockopt -115 #define __PNR_sendmsg -116 #define __PNR_recvmsg -117 #define __PNR_accept4 -118 #define __PNR_recvmmsg -119 #define __PNR_sendmmsg -120 /* ipc syscalls */ #define __PNR_semop -201 #define __PNR_semget -202 #define __PNR_semctl -203 #define __PNR_semtimedop -204 #define __PNR_msgsnd -211 #define __PNR_msgrcv -212 #define __PNR_msgget -213 #define __PNR_msgctl -214 #define __PNR_shmat -221 #define __PNR_shmdt -222 #define __PNR_shmget -223 #define __PNR_shmctl -224 /* single syscalls */ #define __PNR_arch_prctl -10001 #define __PNR_bdflush -10002 #define __PNR_break -10003 #define __PNR_chown32 -10004 #define __PNR_epoll_ctl_old -10005 #define __PNR_epoll_wait_old -10006 #define __PNR_fadvise64_64 -10007 #define __PNR_fchown32 -10008 #define __PNR_fcntl64 -10009 #define __PNR_fstat64 -10010 #define __PNR_fstatat64 -10011 #define __PNR_fstatfs64 -10012 #define __PNR_ftime -10013 #define __PNR_ftruncate64 -10014 #define __PNR_getegid32 -10015 #define __PNR_geteuid32 -10016 #define __PNR_getgid32 -10017 #define __PNR_getgroups32 -10018 #define __PNR_getresgid32 -10019 #define __PNR_getresuid32 -10020 #define __PNR_getuid32 -10021 #define __PNR_gtty -10022 #define __PNR_idle -10023 #define __PNR_ipc -10024 #define __PNR_lchown32 -10025 #define __PNR__llseek -10026 #define __PNR_lock -10027 #define __PNR_lstat64 -10028 #define __PNR_mmap2 -10029 #define __PNR_mpx -10030 #define __PNR_newfstatat -10031 #define __PNR__newselect -10032 #define __PNR_nice -10033 #define __PNR_oldfstat -10034 #define __PNR_oldlstat -10035 #define __PNR_oldolduname -10036 #define __PNR_oldstat -10037 #define __PNR_olduname -10038 #define __PNR_prof -10039 #define __PNR_profil -10040 #define __PNR_readdir -10041 #define __PNR_security -10042 #define __PNR_sendfile64 -10043 #define __PNR_setfsgid32 -10044 #define __PNR_setfsuid32 -10045 #define __PNR_setgid32 -10046 #define __PNR_setgroups32 -10047 #define __PNR_setregid32 -10048 #define __PNR_setresgid32 -10049 #define __PNR_setresuid32 -10050 #define __PNR_setreuid32 -10051 #define __PNR_setuid32 -10052 #define __PNR_sgetmask -10053 #define __PNR_sigaction -10054 #define __PNR_signal -10055 #define __PNR_sigpending -10056 #define __PNR_sigprocmask -10057 #define __PNR_sigreturn -10058 #define __PNR_sigsuspend -10059 #define __PNR_socketcall -10060 #define __PNR_ssetmask -10061 #define __PNR_stat64 -10062 #define __PNR_statfs64 -10063 #define __PNR_stime -10064 #define __PNR_stty -10065 #define __PNR_truncate64 -10066 #define __PNR_tuxcall -10067 #define __PNR_ugetrlimit -10068 #define __PNR_ulimit -10069 #define __PNR_umount -10070 #define __PNR_vm86 -10071 #define __PNR_vm86old -10072 #define __PNR_waitpid -10073 #define __PNR_create_module -10074 #define __PNR_get_kernel_syms -10075 #define __PNR_get_thread_area -10076 #define __PNR_nfsservctl -10077 #define __PNR_query_module -10078 #define __PNR_set_thread_area -10079 #define __PNR__sysctl -10080 #define __PNR_uselib -10081 #define __PNR_vserver -10082 #define __PNR_arm_fadvise64_64 -10083 #define __PNR_arm_sync_file_range -10084 #define __PNR_pciconfig_iobase -10086 #define __PNR_pciconfig_read -10087 #define __PNR_pciconfig_write -10088 #define __PNR_sync_file_range2 -10089 #define __PNR_syscall -10090 #define __PNR_afs_syscall -10091 #define __PNR_fadvise64 -10092 #define __PNR_getpmsg -10093 #define __PNR_ioperm -10094 #define __PNR_iopl -10095 #define __PNR_migrate_pages -10097 #define __PNR_modify_ldt -10098 #define __PNR_putpmsg -10099 #define __PNR_sync_file_range -10100 #define __PNR_select -10101 #define __PNR_vfork -10102 #define __PNR_cachectl -10103 #define __PNR_cacheflush -10104 #define __PNR_sysmips -10106 #define __PNR_timerfd -10107 #define __PNR_time -10108 #define __PNR_getrandom -10109 #define __PNR_memfd_create -10110 #define __PNR_kexec_file_load -10111 #define __PNR_sysfs -10145 #define __PNR_oldwait4 -10146 #define __PNR_access -10147 #define __PNR_alarm -10148 #define __PNR_chmod -10149 #define __PNR_chown -10150 #define __PNR_creat -10151 #define __PNR_dup2 -10152 #define __PNR_epoll_create -10153 #define __PNR_epoll_wait -10154 #define __PNR_eventfd -10155 #define __PNR_fork -10156 #define __PNR_futimesat -10157 #define __PNR_getdents -10158 #define __PNR_getpgrp -10159 #define __PNR_inotify_init -10160 #define __PNR_lchown -10161 #define __PNR_link -10162 #define __PNR_lstat -10163 #define __PNR_mkdir -10164 #define __PNR_mknod -10165 #define __PNR_open -10166 #define __PNR_pause -10167 #define __PNR_pipe -10168 #define __PNR_poll -10169 #define __PNR_readlink -10170 #define __PNR_rename -10171 #define __PNR_rmdir -10172 #define __PNR_signalfd -10173 #define __PNR_stat -10174 #define __PNR_symlink -10175 #define __PNR_unlink -10176 #define __PNR_ustat -10177 #define __PNR_utime -10178 #define __PNR_utimes -10179 #define __PNR_getrlimit -10180 #define __PNR_mmap -10181 #define __PNR_breakpoint -10182 #define __PNR_set_tls -10183 #define __PNR_usr26 -10184 #define __PNR_usr32 -10185 #define __PNR_multiplexer -10186 #define __PNR_rtas -10187 #define __PNR_spu_create -10188 #define __PNR_spu_run -10189 #define __PNR_swapcontext -10190 #define __PNR_sys_debug_setcontext -10191 #define __PNR_switch_endian -10191 #define __PNR_get_mempolicy -10192 #define __PNR_move_pages -10193 #define __PNR_mbind -10194 #define __PNR_set_mempolicy -10195 #define __PNR_s390_runtime_instr -10196 #define __PNR_s390_pci_mmio_read -10197 #define __PNR_s390_pci_mmio_write -10198 #define __PNR_membarrier -10199 #define __PNR_userfaultfd -10200 #define __PNR_pkey_mprotect -10201 #define __PNR_pkey_alloc -10202 #define __PNR_pkey_free -10203 #define __PNR_get_tls -10204 #define __PNR_s390_guarded_storage -10205 #define __PNR_s390_sthyi -10206 #define __PNR_subpage_prot -10207 #define __PNR_statx -10208 #define __PNR_io_pgetevents -10209 #define __PNR_rseq -10210 #define __PNR_setrlimit -10211 #define __PNR_clock_adjtime64 -10212 #define __PNR_clock_getres_time64 -10213 #define __PNR_clock_gettime64 -10214 #define __PNR_clock_nanosleep_time64 -10215 #define __PNR_clock_settime64 -10216 #define __PNR_clone3 -10217 #define __PNR_fsconfig -10218 #define __PNR_fsmount -10219 #define __PNR_fsopen -10220 #define __PNR_fspick -10221 #define __PNR_futex_time64 -10222 #define __PNR_io_pgetevents_time64 -10223 #define __PNR_move_mount -10224 #define __PNR_mq_timedreceive_time64 -10225 #define __PNR_mq_timedsend_time64 -10226 #define __PNR_open_tree -10227 #define __PNR_pidfd_open -10228 #define __PNR_pidfd_send_signal -10229 #define __PNR_ppoll_time64 -10230 #define __PNR_pselect6_time64 -10231 #define __PNR_recvmmsg_time64 -10232 #define __PNR_rt_sigtimedwait_time64 -10233 #define __PNR_sched_rr_get_interval_time64 -10234 #define __PNR_semtimedop_time64 -10235 #define __PNR_timer_gettime64 -10236 #define __PNR_timer_settime64 -10237 #define __PNR_timerfd_gettime64 -10238 #define __PNR_timerfd_settime64 -10239 #define __PNR_utimensat_time64 -10240 #define __PNR_ppoll -10241 #define __PNR_renameat -10242 #define __PNR_riscv_flush_icache -10243 #define __PNR_memfd_secret -10244 #define __PNR_fstat -10245 #define __PNR_atomic_barrier -10246 #define __PNR_atomic_cmpxchg_32 -10247 #define __PNR_getpagesize -10248 /* * libseccomp syscall definitions */ #ifdef __NR__llseek #define __SNR__llseek __NR__llseek #else #define __SNR__llseek __PNR__llseek #endif #ifdef __NR__newselect #define __SNR__newselect __NR__newselect #else #define __SNR__newselect __PNR__newselect #endif #ifdef __NR__sysctl #define __SNR__sysctl __NR__sysctl #else #define __SNR__sysctl __PNR__sysctl #endif #ifdef __NR_accept #define __SNR_accept __NR_accept #else #define __SNR_accept __PNR_accept #endif #ifdef __NR_accept4 #define __SNR_accept4 __NR_accept4 #else #define __SNR_accept4 __PNR_accept4 #endif #ifdef __NR_access #define __SNR_access __NR_access #else #define __SNR_access __PNR_access #endif #define __SNR_acct __NR_acct #define __SNR_add_key __NR_add_key #define __SNR_adjtimex __NR_adjtimex #ifdef __NR_afs_syscall #define __SNR_afs_syscall __NR_afs_syscall #else #define __SNR_afs_syscall __PNR_afs_syscall #endif #ifdef __NR_alarm #define __SNR_alarm __NR_alarm #else #define __SNR_alarm __PNR_alarm #endif #ifdef __NR_arm_fadvise64_64 #define __SNR_arm_fadvise64_64 __NR_arm_fadvise64_64 #else #define __SNR_arm_fadvise64_64 __PNR_arm_fadvise64_64 #endif #ifdef __NR_arm_sync_file_range #define __SNR_arm_sync_file_range __NR_arm_sync_file_range #else #define __SNR_arm_sync_file_range __PNR_arm_sync_file_range #endif #ifdef __NR_arch_prctl #define __SNR_arch_prctl __NR_arch_prctl #else #define __SNR_arch_prctl __PNR_arch_prctl #endif #ifdef __NR_atomic_barrier #define __SNR_atomic_barrier __NR_atomic_barrier #else #define __SNR_atomic_barrier __PNR_atomic_barrier #endif #ifdef __NR_atomic_cmpxchg_32 #define __SNR_atomic_cmpxchg_32 __NR_atomic_cmpxchg_32 #else #define __SNR_atomic_cmpxchg_32 __PNR_atomic_cmpxchg_32 #endif #ifdef __NR_bdflush #define __SNR_bdflush __NR_bdflush #else #define __SNR_bdflush __PNR_bdflush #endif #ifdef __NR_bind #define __SNR_bind __NR_bind #else #define __SNR_bind __PNR_bind #endif #define __SNR_bpf __NR_bpf #ifdef __NR_break #define __SNR_break __NR_break #else #define __SNR_break __PNR_break #endif #ifdef __NR_breakpoint #ifdef __ARM_NR_breakpoint #define __SNR_breakpoint __ARM_NR_breakpoint #else #define __SNR_breakpoint __NR_breakpoint #endif #else #define __SNR_breakpoint __PNR_breakpoint #endif #define __SNR_brk __NR_brk #ifdef __NR_cachectl #define __SNR_cachectl __NR_cachectl #else #define __SNR_cachectl __PNR_cachectl #endif #ifdef __NR_cacheflush #ifdef __ARM_NR_cacheflush #define __SNR_cacheflush __ARM_NR_cacheflush #else #define __SNR_cacheflush __NR_cacheflush #endif #else #define __SNR_cacheflush __PNR_cacheflush #endif #define __SNR_capget __NR_capget #define __SNR_capset __NR_capset #define __SNR_chdir __NR_chdir #ifdef __NR_chmod #define __SNR_chmod __NR_chmod #else #define __SNR_chmod __PNR_chmod #endif #ifdef __NR_chown #define __SNR_chown __NR_chown #else #define __SNR_chown __PNR_chown #endif #ifdef __NR_chown32 #define __SNR_chown32 __NR_chown32 #else #define __SNR_chown32 __PNR_chown32 #endif #define __SNR_chroot __NR_chroot #define __SNR_clock_adjtime __NR_clock_adjtime #ifdef __NR_clock_adjtime64 #define __SNR_clock_adjtime64 __NR_clock_adjtime64 #else #define __SNR_clock_adjtime64 __PNR_clock_adjtime64 #endif #define __SNR_clock_getres __NR_clock_getres #ifdef __NR_clock_getres_time64 #define __SNR_clock_getres_time64 __NR_clock_getres_time64 #else #define __SNR_clock_getres_time64 __PNR_clock_getres_time64 #endif #define __SNR_clock_gettime __NR_clock_gettime #ifdef __NR_clock_gettime64 #define __SNR_clock_gettime64 __NR_clock_gettime64 #else #define __SNR_clock_gettime64 __PNR_clock_gettime64 #endif #define __SNR_clock_nanosleep __NR_clock_nanosleep #ifdef __NR_clock_nanosleep_time64 #define __SNR_clock_nanosleep_time64 __NR_clock_nanosleep_time64 #else #define __SNR_clock_nanosleep_time64 __PNR_clock_nanosleep_time64 #endif #define __SNR_clock_settime __NR_clock_settime #ifdef __NR_clock_settime64 #define __SNR_clock_settime64 __NR_clock_settime64 #else #define __SNR_clock_settime64 __PNR_clock_settime64 #endif #define __SNR_clone __NR_clone #ifdef __NR_clone3 #define __SNR_clone3 __NR_clone3 #else #define __SNR_clone3 __PNR_clone3 #endif #define __SNR_close __NR_close #define __SNR_close_range __NR_close_range #ifdef __NR_connect #define __SNR_connect __NR_connect #else #define __SNR_connect __PNR_connect #endif #define __SNR_copy_file_range __NR_copy_file_range #ifdef __NR_creat #define __SNR_creat __NR_creat #else #define __SNR_creat __PNR_creat #endif #ifdef __NR_create_module #define __SNR_create_module __NR_create_module #else #define __SNR_create_module __PNR_create_module #endif #define __SNR_delete_module __NR_delete_module #ifdef __NR_dup #define __SNR_dup __NR_dup #else #define __SNR_dup __PNR_dup #endif #ifdef __NR_dup2 #define __SNR_dup2 __NR_dup2 #else #define __SNR_dup2 __PNR_dup2 #endif #define __SNR_dup3 __NR_dup3 #ifdef __NR_epoll_create #define __SNR_epoll_create __NR_epoll_create #else #define __SNR_epoll_create __PNR_epoll_create #endif #define __SNR_epoll_create1 __NR_epoll_create1 #ifdef __NR_epoll_ctl #define __SNR_epoll_ctl __NR_epoll_ctl #else #define __SNR_epoll_ctl __PNR_epoll_ctl #endif #ifdef __NR_epoll_ctl_old #define __SNR_epoll_ctl_old __NR_epoll_ctl_old #else #define __SNR_epoll_ctl_old __PNR_epoll_ctl_old #endif #define __SNR_epoll_pwait __NR_epoll_pwait #define __SNR_epoll_pwait2 __NR_epoll_pwait2 #ifdef __NR_epoll_wait #define __SNR_epoll_wait __NR_epoll_wait #else #define __SNR_epoll_wait __PNR_epoll_wait #endif #ifdef __NR_epoll_wait_old #define __SNR_epoll_wait_old __NR_epoll_wait_old #else #define __SNR_epoll_wait_old __PNR_epoll_wait_old #endif #ifdef __NR_eventfd #define __SNR_eventfd __NR_eventfd #else #define __SNR_eventfd __PNR_eventfd #endif #define __SNR_eventfd2 __NR_eventfd2 #define __SNR_execve __NR_execve #define __SNR_execveat __NR_execveat #define __SNR_exit __NR_exit #define __SNR_exit_group __NR_exit_group #define __SNR_faccessat __NR_faccessat #define __SNR_faccessat2 __NR_faccessat2 #ifdef __NR_fadvise64 #define __SNR_fadvise64 __NR_fadvise64 #else #define __SNR_fadvise64 __PNR_fadvise64 #endif #ifdef __NR_fadvise64_64 #define __SNR_fadvise64_64 __NR_fadvise64_64 #else #define __SNR_fadvise64_64 __PNR_fadvise64_64 #endif #define __SNR_fallocate __NR_fallocate #define __SNR_fanotify_init __NR_fanotify_init #define __SNR_fanotify_mark __NR_fanotify_mark #define __SNR_fchdir __NR_fchdir #define __SNR_fchmod __NR_fchmod #define __SNR_fchmodat __NR_fchmodat #ifdef __NR_fchown #define __SNR_fchown __NR_fchown #else #define __SNR_fchown __PNR_fchown #endif #ifdef __NR_fchown32 #define __SNR_fchown32 __NR_fchown32 #else #define __SNR_fchown32 __PNR_fchown32 #endif #define __SNR_fchownat __NR_fchownat #ifdef __NR_fcntl #define __SNR_fcntl __NR_fcntl #else #define __SNR_fcntl __PNR_fcntl #endif #ifdef __NR_fcntl64 #define __SNR_fcntl64 __NR_fcntl64 #else #define __SNR_fcntl64 __PNR_fcntl64 #endif #define __SNR_fdatasync __NR_fdatasync #define __SNR_fgetxattr __NR_fgetxattr #define __SNR_finit_module __NR_finit_module #define __SNR_flistxattr __NR_flistxattr #define __SNR_flock __NR_flock #ifdef __NR_fork #define __SNR_fork __NR_fork #else #define __SNR_fork __PNR_fork #endif #define __SNR_fremovexattr __NR_fremovexattr #ifdef __NR_fsconfig #define __SNR_fsconfig __NR_fsconfig #else #define __SNR_fsconfig __PNR_fsconfig #endif #define __SNR_fsetxattr __NR_fsetxattr #ifdef __NR_fsmount #define __SNR_fsmount __NR_fsmount #else #define __SNR_fsmount __PNR_fsmount #endif #ifdef __NR_fsopen #define __SNR_fsopen __NR_fsopen #else #define __SNR_fsopen __PNR_fsopen #endif #ifdef __NR_fspick #define __SNR_fspick __NR_fspick #else #define __SNR_fspick __PNR_fspick #endif #ifdef __NR_fstat #define __SNR_fstat __NR_fstat #else #define __SNR_fstat __PNR_fstat #endif #ifdef __NR_fstat64 #define __SNR_fstat64 __NR_fstat64 #else #define __SNR_fstat64 __PNR_fstat64 #endif #ifdef __NR_fstatat64 #define __SNR_fstatat64 __NR_fstatat64 #else #define __SNR_fstatat64 __PNR_fstatat64 #endif #ifdef __NR_fstatfs #define __SNR_fstatfs __NR_fstatfs #else #define __SNR_fstatfs __PNR_fstatfs #endif #ifdef __NR_fstatfs64 #define __SNR_fstatfs64 __NR_fstatfs64 #else #define __SNR_fstatfs64 __PNR_fstatfs64 #endif #define __SNR_fsync __NR_fsync #ifdef __NR_ftime #define __SNR_ftime __NR_ftime #else #define __SNR_ftime __PNR_ftime #endif #ifdef __NR_ftruncate #define __SNR_ftruncate __NR_ftruncate #else #define __SNR_ftruncate __PNR_ftruncate #endif #ifdef __NR_ftruncate64 #define __SNR_ftruncate64 __NR_ftruncate64 #else #define __SNR_ftruncate64 __PNR_ftruncate64 #endif #define __SNR_futex __NR_futex #ifdef __NR_futex_time64 #define __SNR_futex_time64 __NR_futex_time64 #else #define __SNR_futex_time64 __PNR_futex_time64 #endif #define __SNR_futex_waitv __NR_futex_waitv #ifdef __NR_futimesat #define __SNR_futimesat __NR_futimesat #else #define __SNR_futimesat __PNR_futimesat #endif #ifdef __NR_get_kernel_syms #define __SNR_get_kernel_syms __NR_get_kernel_syms #else #define __SNR_get_kernel_syms __PNR_get_kernel_syms #endif #ifdef __NR_get_mempolicy #define __SNR_get_mempolicy __NR_get_mempolicy #else #define __SNR_get_mempolicy __PNR_get_mempolicy #endif #define __SNR_get_robust_list __NR_get_robust_list #ifdef __NR_get_thread_area #define __SNR_get_thread_area __NR_get_thread_area #else #define __SNR_get_thread_area __PNR_get_thread_area #endif #ifdef __NR_get_tls #ifdef __ARM_NR_get_tls #define __SNR_get_tls __ARM_NR_get_tls #else #define __SNR_get_tls __NR_get_tls #endif #else #define __SNR_get_tls __PNR_get_tls #endif #define __SNR_getcpu __NR_getcpu #define __SNR_getcwd __NR_getcwd #ifdef __NR_getdents #define __SNR_getdents __NR_getdents #else #define __SNR_getdents __PNR_getdents #endif #define __SNR_getdents64 __NR_getdents64 #ifdef __NR_getegid #define __SNR_getegid __NR_getegid #else #define __SNR_getegid __PNR_getegid #endif #ifdef __NR_getegid32 #define __SNR_getegid32 __NR_getegid32 #else #define __SNR_getegid32 __PNR_getegid32 #endif #ifdef __NR_geteuid #define __SNR_geteuid __NR_geteuid #else #define __SNR_geteuid __PNR_geteuid #endif #ifdef __NR_geteuid32 #define __SNR_geteuid32 __NR_geteuid32 #else #define __SNR_geteuid32 __PNR_geteuid32 #endif #ifdef __NR_getgid #define __SNR_getgid __NR_getgid #else #define __SNR_getgid __PNR_getgid #endif #ifdef __NR_getgid32 #define __SNR_getgid32 __NR_getgid32 #else #define __SNR_getgid32 __PNR_getgid32 #endif #ifdef __NR_getgroups #define __SNR_getgroups __NR_getgroups #else #define __SNR_getgroups __PNR_getgroups #endif #ifdef __NR_getgroups32 #define __SNR_getgroups32 __NR_getgroups32 #else #define __SNR_getgroups32 __PNR_getgroups32 #endif #define __SNR_getitimer __NR_getitimer #ifdef __NR_getpagesize #define __SNR_getpagesize __NR_getpagesize #else #define __SNR_getpagesize __PNR_getpagesize #endif #ifdef __NR_getpeername #define __SNR_getpeername __NR_getpeername #else #define __SNR_getpeername __PNR_getpeername #endif #define __SNR_getpgid __NR_getpgid #ifdef __NR_getpgrp #define __SNR_getpgrp __NR_getpgrp #else #define __SNR_getpgrp __PNR_getpgrp #endif #define __SNR_getpid __NR_getpid #ifdef __NR_getpmsg #define __SNR_getpmsg __NR_getpmsg #else #define __SNR_getpmsg __PNR_getpmsg #endif #define __SNR_getppid __NR_getppid #define __SNR_getpriority __NR_getpriority #ifdef __NR_getrandom #define __SNR_getrandom __NR_getrandom #else #define __SNR_getrandom __PNR_getrandom #endif #ifdef __NR_getresgid #define __SNR_getresgid __NR_getresgid #else #define __SNR_getresgid __PNR_getresgid #endif #ifdef __NR_getresgid32 #define __SNR_getresgid32 __NR_getresgid32 #else #define __SNR_getresgid32 __PNR_getresgid32 #endif #ifdef __NR_getresuid #define __SNR_getresuid __NR_getresuid #else #define __SNR_getresuid __PNR_getresuid #endif #ifdef __NR_getresuid32 #define __SNR_getresuid32 __NR_getresuid32 #else #define __SNR_getresuid32 __PNR_getresuid32 #endif #ifdef __NR_getrlimit #define __SNR_getrlimit __NR_getrlimit #else #define __SNR_getrlimit __PNR_getrlimit #endif #define __SNR_getrusage __NR_getrusage #define __SNR_getsid __NR_getsid #ifdef __NR_getsockname #define __SNR_getsockname __NR_getsockname #else #define __SNR_getsockname __PNR_getsockname #endif #ifdef __NR_getsockopt #define __SNR_getsockopt __NR_getsockopt #else #define __SNR_getsockopt __PNR_getsockopt #endif #define __SNR_gettid __NR_gettid #define __SNR_gettimeofday __NR_gettimeofday #ifdef __NR_getuid #define __SNR_getuid __NR_getuid #else #define __SNR_getuid __PNR_getuid #endif #ifdef __NR_getuid32 #define __SNR_getuid32 __NR_getuid32 #else #define __SNR_getuid32 __PNR_getuid32 #endif #define __SNR_getxattr __NR_getxattr #ifdef __NR_gtty #define __SNR_gtty __NR_gtty #else #define __SNR_gtty __PNR_gtty #endif #ifdef __NR_idle #define __SNR_idle __NR_idle #else #define __SNR_idle __PNR_idle #endif #define __SNR_init_module __NR_init_module #define __SNR_inotify_add_watch __NR_inotify_add_watch #ifdef __NR_inotify_init #define __SNR_inotify_init __NR_inotify_init #else #define __SNR_inotify_init __PNR_inotify_init #endif #define __SNR_inotify_init1 __NR_inotify_init1 #define __SNR_inotify_rm_watch __NR_inotify_rm_watch #define __SNR_io_cancel __NR_io_cancel #define __SNR_io_destroy __NR_io_destroy #define __SNR_io_getevents __NR_io_getevents #ifdef __NR_io_pgetevents #define __SNR_io_pgetevents __NR_io_pgetevents #else #define __SNR_io_pgetevents __PNR_io_pgetevents #endif #ifdef __NR_io_pgetevents_time64 #define __SNR_io_pgetevents_time64 __NR_io_pgetevents_time64 #else #define __SNR_io_pgetevents_time64 __PNR_io_pgetevents_time64 #endif #define __SNR_io_setup __NR_io_setup #define __SNR_io_submit __NR_io_submit #define __SNR_io_uring_setup __NR_io_uring_setup #define __SNR_io_uring_enter __NR_io_uring_enter #define __SNR_io_uring_register __NR_io_uring_register #define __SNR_ioctl __NR_ioctl #ifdef __NR_ioperm #define __SNR_ioperm __NR_ioperm #else #define __SNR_ioperm __PNR_ioperm #endif #ifdef __NR_iopl #define __SNR_iopl __NR_iopl #else #define __SNR_iopl __PNR_iopl #endif #define __SNR_ioprio_get __NR_ioprio_get #define __SNR_ioprio_set __NR_ioprio_set #ifdef __NR_ipc #define __SNR_ipc __NR_ipc #else #define __SNR_ipc __PNR_ipc #endif #define __SNR_kcmp __NR_kcmp #ifdef __NR_kexec_file_load #define __SNR_kexec_file_load __NR_kexec_file_load #else #define __SNR_kexec_file_load __PNR_kexec_file_load #endif #define __SNR_kexec_load __NR_kexec_load #define __SNR_keyctl __NR_keyctl #define __SNR_kill __NR_kill #define __SNR_landlock_add_rule __NR_landlock_add_rule #define __SNR_landlock_create_ruleset __NR_landlock_create_ruleset #define __SNR_landlock_restrict_self __NR_landlock_restrict_self #ifdef __NR_lchown #define __SNR_lchown __NR_lchown #else #define __SNR_lchown __PNR_lchown #endif #ifdef __NR_lchown32 #define __SNR_lchown32 __NR_lchown32 #else #define __SNR_lchown32 __PNR_lchown32 #endif #define __SNR_lgetxattr __NR_lgetxattr #ifdef __NR_link #define __SNR_link __NR_link #else #define __SNR_link __PNR_link #endif #define __SNR_linkat __NR_linkat #ifdef __NR_listen #define __SNR_listen __NR_listen #else #define __SNR_listen __PNR_listen #endif #define __SNR_listxattr __NR_listxattr #define __SNR_llistxattr __NR_llistxattr #ifdef __NR_lock #define __SNR_lock __NR_lock #else #define __SNR_lock __PNR_lock #endif #define __SNR_lookup_dcookie __NR_lookup_dcookie #define __SNR_lremovexattr __NR_lremovexattr #define __SNR_lseek __NR_lseek #define __SNR_lsetxattr __NR_lsetxattr #ifdef __NR_lstat #define __SNR_lstat __NR_lstat #else #define __SNR_lstat __PNR_lstat #endif #ifdef __NR_lstat64 #define __SNR_lstat64 __NR_lstat64 #else #define __SNR_lstat64 __PNR_lstat64 #endif #define __SNR_madvise __NR_madvise #ifdef __NR_mbind #define __SNR_mbind __NR_mbind #else #define __SNR_mbind __PNR_mbind #endif #ifdef __NR_membarrier #define __SNR_membarrier __NR_membarrier #else #define __SNR_membarrier __PNR_membarrier #endif #ifdef __NR_memfd_create #define __SNR_memfd_create __NR_memfd_create #else #define __SNR_memfd_create __PNR_memfd_create #endif #ifdef __NR_memfd_secret #define __SNR_memfd_secret __NR_memfd_secret #else #define __SNR_memfd_secret __PNR_memfd_secret #endif #ifdef __NR_migrate_pages #define __SNR_migrate_pages __NR_migrate_pages #else #define __SNR_migrate_pages __PNR_migrate_pages #endif #define __SNR_mincore __NR_mincore #ifdef __NR_mkdir #define __SNR_mkdir __NR_mkdir #else #define __SNR_mkdir __PNR_mkdir #endif #define __SNR_mkdirat __NR_mkdirat #ifdef __NR_mknod #define __SNR_mknod __NR_mknod #else #define __SNR_mknod __PNR_mknod #endif #define __SNR_mknodat __NR_mknodat #define __SNR_mlock __NR_mlock #define __SNR_mlock2 __NR_mlock2 #define __SNR_mlockall __NR_mlockall #ifdef __NR_mmap #define __SNR_mmap __NR_mmap #else #define __SNR_mmap __PNR_mmap #endif #ifdef __NR_mmap2 #define __SNR_mmap2 __NR_mmap2 #else #define __SNR_mmap2 __PNR_mmap2 #endif #ifdef __NR_modify_ldt #define __SNR_modify_ldt __NR_modify_ldt #else #define __SNR_modify_ldt __PNR_modify_ldt #endif #define __SNR_mount __NR_mount #define __SNR_mount_setattr __NR_mount_setattr #ifdef __NR_move_mount #define __SNR_move_mount __NR_move_mount #else #define __SNR_move_mount __PNR_move_mount #endif #ifdef __NR_move_pages #define __SNR_move_pages __NR_move_pages #else #define __SNR_move_pages __PNR_move_pages #endif #define __SNR_mprotect __NR_mprotect #ifdef __NR_mpx #define __SNR_mpx __NR_mpx #else #define __SNR_mpx __PNR_mpx #endif #define __SNR_mq_getsetattr __NR_mq_getsetattr #define __SNR_mq_notify __NR_mq_notify #define __SNR_mq_open __NR_mq_open #define __SNR_mq_timedreceive __NR_mq_timedreceive #ifdef __NR_mq_timedreceive_time64 #define __SNR_mq_timedreceive_time64 __NR_mq_timedreceive_time64 #else #define __SNR_mq_timedreceive_time64 __PNR_mq_timedreceive_time64 #endif #define __SNR_mq_timedsend __NR_mq_timedsend #ifdef __NR_mq_timedsend_time64 #define __SNR_mq_timedsend_time64 __NR_mq_timedsend_time64 #else #define __SNR_mq_timedsend_time64 __PNR_mq_timedsend_time64 #endif #define __SNR_mq_unlink __NR_mq_unlink #define __SNR_mremap __NR_mremap #ifdef __NR_msgctl #define __SNR_msgctl __NR_msgctl #else #define __SNR_msgctl __PNR_msgctl #endif #ifdef __NR_msgget #define __SNR_msgget __NR_msgget #else #define __SNR_msgget __PNR_msgget #endif #ifdef __NR_msgrcv #define __SNR_msgrcv __NR_msgrcv #else #define __SNR_msgrcv __PNR_msgrcv #endif #ifdef __NR_msgsnd #define __SNR_msgsnd __NR_msgsnd #else #define __SNR_msgsnd __PNR_msgsnd #endif #define __SNR_msync __NR_msync #ifdef __NR_multiplexer #define __SNR_multiplexer __NR_multiplexer #else #define __SNR_multiplexer __PNR_multiplexer #endif #define __SNR_munlock __NR_munlock #define __SNR_munlockall __NR_munlockall #define __SNR_munmap __NR_munmap #define __SNR_name_to_handle_at __NR_name_to_handle_at #define __SNR_nanosleep __NR_nanosleep #ifdef __NR_newfstatat #define __SNR_newfstatat __NR_newfstatat #else #define __SNR_newfstatat __PNR_newfstatat #endif #ifdef __NR_nfsservctl #define __SNR_nfsservctl __NR_nfsservctl #else #define __SNR_nfsservctl __PNR_nfsservctl #endif #ifdef __NR_nice #define __SNR_nice __NR_nice #else #define __SNR_nice __PNR_nice #endif #ifdef __NR_oldfstat #define __SNR_oldfstat __NR_oldfstat #else #define __SNR_oldfstat __PNR_oldfstat #endif #ifdef __NR_oldlstat #define __SNR_oldlstat __NR_oldlstat #else #define __SNR_oldlstat __PNR_oldlstat #endif #ifdef __NR_oldolduname #define __SNR_oldolduname __NR_oldolduname #else #define __SNR_oldolduname __PNR_oldolduname #endif #ifdef __NR_oldstat #define __SNR_oldstat __NR_oldstat #else #define __SNR_oldstat __PNR_oldstat #endif #ifdef __NR_olduname #define __SNR_olduname __NR_olduname #else #define __SNR_olduname __PNR_olduname #endif #ifdef __NR_open #define __SNR_open __NR_open #else #define __SNR_open __PNR_open #endif #define __SNR_open_by_handle_at __NR_open_by_handle_at #ifdef __NR_open_tree #define __SNR_open_tree __NR_open_tree #else #define __SNR_open_tree __PNR_open_tree #endif #define __SNR_openat __NR_openat #define __SNR_openat2 __NR_openat2 #ifdef __NR_pause #define __SNR_pause __NR_pause #else #define __SNR_pause __PNR_pause #endif #ifdef __NR_pciconfig_iobase #define __SNR_pciconfig_iobase __NR_pciconfig_iobase #else #define __SNR_pciconfig_iobase __PNR_pciconfig_iobase #endif #ifdef __NR_pciconfig_read #define __SNR_pciconfig_read __NR_pciconfig_read #else #define __SNR_pciconfig_read __PNR_pciconfig_read #endif #ifdef __NR_pciconfig_write #define __SNR_pciconfig_write __NR_pciconfig_write #else #define __SNR_pciconfig_write __PNR_pciconfig_write #endif #define __SNR_perf_event_open __NR_perf_event_open #define __SNR_personality __NR_personality #define __SNR_pidfd_getfd __NR_pidfd_getfd #ifdef __NR_pidfd_open #define __SNR_pidfd_open __NR_pidfd_open #else #define __SNR_pidfd_open __PNR_pidfd_open #endif #ifdef __NR_pidfd_send_signal #define __SNR_pidfd_send_signal __NR_pidfd_send_signal #else #define __SNR_pidfd_send_signal __PNR_pidfd_send_signal #endif #ifdef __NR_pipe #define __SNR_pipe __NR_pipe #else #define __SNR_pipe __PNR_pipe #endif #define __SNR_pipe2 __NR_pipe2 #define __SNR_pivot_root __NR_pivot_root #ifdef __NR_pkey_alloc #define __SNR_pkey_alloc __NR_pkey_alloc #else #define __SNR_pkey_alloc __PNR_pkey_alloc #endif #ifdef __NR_pkey_free #define __SNR_pkey_free __NR_pkey_free #else #define __SNR_pkey_free __PNR_pkey_free #endif #ifdef __NR_pkey_mprotect #define __SNR_pkey_mprotect __NR_pkey_mprotect #else #define __SNR_pkey_mprotect __PNR_pkey_mprotect #endif #ifdef __NR_poll #define __SNR_poll __NR_poll #else #define __SNR_poll __PNR_poll #endif #ifdef __NR_ppoll #define __SNR_ppoll __NR_ppoll #else #define __SNR_ppoll __PNR_ppoll #endif #ifdef __NR_ppoll_time64 #define __SNR_ppoll_time64 __NR_ppoll_time64 #else #define __SNR_ppoll_time64 __PNR_ppoll_time64 #endif #define __SNR_prctl __NR_prctl #define __SNR_pread64 __NR_pread64 #define __SNR_preadv __NR_preadv #define __SNR_preadv2 __NR_preadv2 #define __SNR_prlimit64 __NR_prlimit64 #define __SNR_process_madvise __NR_process_madvise #define __SNR_process_mrelease __NR_process_mrelease #define __SNR_process_vm_readv __NR_process_vm_readv #define __SNR_process_vm_writev __NR_process_vm_writev #ifdef __NR_prof #define __SNR_prof __NR_prof #else #define __SNR_prof __PNR_prof #endif #ifdef __NR_profil #define __SNR_profil __NR_profil #else #define __SNR_profil __PNR_profil #endif #define __SNR_pselect6 __NR_pselect6 #ifdef __NR_pselect6_time64 #define __SNR_pselect6_time64 __NR_pselect6_time64 #else #define __SNR_pselect6_time64 __PNR_pselect6_time64 #endif #define __SNR_ptrace __NR_ptrace #ifdef __NR_putpmsg #define __SNR_putpmsg __NR_putpmsg #else #define __SNR_putpmsg __PNR_putpmsg #endif #define __SNR_pwrite64 __NR_pwrite64 #define __SNR_pwritev __NR_pwritev #define __SNR_pwritev2 __NR_pwritev2 #ifdef __NR_query_module #define __SNR_query_module __NR_query_module #else #define __SNR_query_module __PNR_query_module #endif #define __SNR_quotactl __NR_quotactl #define __SNR_quotactl_fd __NR_quotactl_fd #ifdef __NR_read #define __SNR_read __NR_read #else #define __SNR_read __PNR_read #endif #define __SNR_readahead __NR_readahead #ifdef __NR_readdir #define __SNR_readdir __NR_readdir #else #define __SNR_readdir __PNR_readdir #endif #ifdef __NR_readlink #define __SNR_readlink __NR_readlink #else #define __SNR_readlink __PNR_readlink #endif #define __SNR_readlinkat __NR_readlinkat #define __SNR_readv __NR_readv #define __SNR_reboot __NR_reboot #ifdef __NR_recv #define __SNR_recv __NR_recv #else #define __SNR_recv __PNR_recv #endif #ifdef __NR_recvfrom #define __SNR_recvfrom __NR_recvfrom #else #define __SNR_recvfrom __PNR_recvfrom #endif #ifdef __NR_recvmmsg #define __SNR_recvmmsg __NR_recvmmsg #else #define __SNR_recvmmsg __PNR_recvmmsg #endif #ifdef __NR_recvmmsg_time64 #define __SNR_recvmmsg_time64 __NR_recvmmsg_time64 #else #define __SNR_recvmmsg_time64 __PNR_recvmmsg_time64 #endif #ifdef __NR_recvmsg #define __SNR_recvmsg __NR_recvmsg #else #define __SNR_recvmsg __PNR_recvmsg #endif #define __SNR_remap_file_pages __NR_remap_file_pages #define __SNR_removexattr __NR_removexattr #ifdef __NR_rename #define __SNR_rename __NR_rename #else #define __SNR_rename __PNR_rename #endif #ifdef __NR_renameat #define __SNR_renameat __NR_renameat #else #define __SNR_renameat __PNR_renameat #endif #define __SNR_renameat2 __NR_renameat2 #define __SNR_request_key __NR_request_key #define __SNR_restart_syscall __NR_restart_syscall #ifdef __NR_riscv_flush_icache #define __SNR_riscv_flush_icache __NR_riscv_flush_icache #else #define __SNR_riscv_flush_icache __PNR_riscv_flush_icache #endif #ifdef __NR_rmdir #define __SNR_rmdir __NR_rmdir #else #define __SNR_rmdir __PNR_rmdir #endif #ifdef __NR_rseq #define __SNR_rseq __NR_rseq #else #define __SNR_rseq __PNR_rseq #endif #define __SNR_rt_sigaction __NR_rt_sigaction #define __SNR_rt_sigpending __NR_rt_sigpending #define __SNR_rt_sigprocmask __NR_rt_sigprocmask #define __SNR_rt_sigqueueinfo __NR_rt_sigqueueinfo #define __SNR_rt_sigreturn __NR_rt_sigreturn #define __SNR_rt_sigsuspend __NR_rt_sigsuspend #define __SNR_rt_sigtimedwait __NR_rt_sigtimedwait #ifdef __NR_rt_sigtimedwait_time64 #define __SNR_rt_sigtimedwait_time64 __NR_rt_sigtimedwait_time64 #else #define __SNR_rt_sigtimedwait_time64 __PNR_rt_sigtimedwait_time64 #endif #define __SNR_rt_tgsigqueueinfo __NR_rt_tgsigqueueinfo #ifdef __NR_rtas #define __SNR_rtas __NR_rtas #else #define __SNR_rtas __PNR_rtas #endif #ifdef __NR_s390_guarded_storage #define __SNR_s390_guarded_storage __NR_s390_guarded_storage #else #define __SNR_s390_guarded_storage __PNR_s390_guarded_storage #endif #ifdef __NR_s390_pci_mmio_read #define __SNR_s390_pci_mmio_read __NR_s390_pci_mmio_read #else #define __SNR_s390_pci_mmio_read __PNR_s390_pci_mmio_read #endif #ifdef __NR_s390_pci_mmio_write #define __SNR_s390_pci_mmio_write __NR_s390_pci_mmio_write #else #define __SNR_s390_pci_mmio_write __PNR_s390_pci_mmio_write #endif #ifdef __NR_s390_runtime_instr #define __SNR_s390_runtime_instr __NR_s390_runtime_instr #else #define __SNR_s390_runtime_instr __PNR_s390_runtime_instr #endif #ifdef __NR_s390_sthyi #define __SNR_s390_sthyi __NR_s390_sthyi #else #define __SNR_s390_sthyi __PNR_s390_sthyi #endif #define __SNR_sched_get_priority_max __NR_sched_get_priority_max #define __SNR_sched_get_priority_min __NR_sched_get_priority_min #define __SNR_sched_getaffinity __NR_sched_getaffinity #define __SNR_sched_getattr __NR_sched_getattr #define __SNR_sched_getparam __NR_sched_getparam #define __SNR_sched_getscheduler __NR_sched_getscheduler #define __SNR_sched_rr_get_interval __NR_sched_rr_get_interval #ifdef __NR_sched_rr_get_interval_time64 #define __SNR_sched_rr_get_interval_time64 __NR_sched_rr_get_interval_time64 #else #define __SNR_sched_rr_get_interval_time64 __PNR_sched_rr_get_interval_time64 #endif #define __SNR_sched_setaffinity __NR_sched_setaffinity #define __SNR_sched_setattr __NR_sched_setattr #define __SNR_sched_setparam __NR_sched_setparam #define __SNR_sched_setscheduler __NR_sched_setscheduler #define __SNR_sched_yield __NR_sched_yield #define __SNR_seccomp __NR_seccomp #ifdef __NR_security #define __SNR_security __NR_security #else #define __SNR_security __PNR_security #endif #ifdef __NR_select #define __SNR_select __NR_select #else #define __SNR_select __PNR_select #endif #ifdef __NR_semctl #define __SNR_semctl __NR_semctl #else #define __SNR_semctl __PNR_semctl #endif #ifdef __NR_semget #define __SNR_semget __NR_semget #else #define __SNR_semget __PNR_semget #endif #ifdef __NR_semop #define __SNR_semop __NR_semop #else #define __SNR_semop __PNR_semop #endif #ifdef __NR_semtimedop #define __SNR_semtimedop __NR_semtimedop #else #define __SNR_semtimedop __PNR_semtimedop #endif #ifdef __NR_semtimedop_time64 #define __SNR_semtimedop_time64 __NR_semtimedop_time64 #else #define __SNR_semtimedop_time64 __PNR_semtimedop_time64 #endif #ifdef __NR_send #define __SNR_send __NR_send #else #define __SNR_send __PNR_send #endif #ifdef __NR_sendfile #define __SNR_sendfile __NR_sendfile #else #define __SNR_sendfile __PNR_sendfile #endif #ifdef __NR_sendfile64 #define __SNR_sendfile64 __NR_sendfile64 #else #define __SNR_sendfile64 __PNR_sendfile64 #endif #ifdef __NR_sendmmsg #define __SNR_sendmmsg __NR_sendmmsg #else #define __SNR_sendmmsg __PNR_sendmmsg #endif #ifdef __NR_sendmsg #define __SNR_sendmsg __NR_sendmsg #else #define __SNR_sendmsg __PNR_sendmsg #endif #ifdef __NR_sendto #define __SNR_sendto __NR_sendto #else #define __SNR_sendto __PNR_sendto #endif #ifdef __NR_set_mempolicy #define __SNR_set_mempolicy __NR_set_mempolicy #else #define __SNR_set_mempolicy __PNR_set_mempolicy #endif #define __SNR_set_mempolicy_home_node __NR_set_mempolicy_home_node #define __SNR_set_robust_list __NR_set_robust_list #ifdef __NR_set_thread_area #define __SNR_set_thread_area __NR_set_thread_area #else #define __SNR_set_thread_area __PNR_set_thread_area #endif #define __SNR_set_tid_address __NR_set_tid_address #ifdef __NR_set_tls #ifdef __ARM_NR_set_tls #define __SNR_set_tls __ARM_NR_set_tls #else #define __SNR_set_tls __NR_set_tls #endif #else #define __SNR_set_tls __PNR_set_tls #endif #define __SNR_setdomainname __NR_setdomainname #ifdef __NR_setfsgid #define __SNR_setfsgid __NR_setfsgid #else #define __SNR_setfsgid __PNR_setfsgid #endif #ifdef __NR_setfsgid32 #define __SNR_setfsgid32 __NR_setfsgid32 #else #define __SNR_setfsgid32 __PNR_setfsgid32 #endif #ifdef __NR_setfsuid #define __SNR_setfsuid __NR_setfsuid #else #define __SNR_setfsuid __PNR_setfsuid #endif #ifdef __NR_setfsuid32 #define __SNR_setfsuid32 __NR_setfsuid32 #else #define __SNR_setfsuid32 __PNR_setfsuid32 #endif #ifdef __NR_setgid #define __SNR_setgid __NR_setgid #else #define __SNR_setgid __PNR_setgid #endif #ifdef __NR_setgid32 #define __SNR_setgid32 __NR_setgid32 #else #define __SNR_setgid32 __PNR_setgid32 #endif #ifdef __NR_setgroups #define __SNR_setgroups __NR_setgroups #else #define __SNR_setgroups __PNR_setgroups #endif #ifdef __NR_setgroups32 #define __SNR_setgroups32 __NR_setgroups32 #else #define __SNR_setgroups32 __PNR_setgroups32 #endif #define __SNR_sethostname __NR_sethostname #define __SNR_setitimer __NR_setitimer #define __SNR_setns __NR_setns #define __SNR_setpgid __NR_setpgid #define __SNR_setpriority __NR_setpriority #ifdef __NR_setregid #define __SNR_setregid __NR_setregid #else #define __SNR_setregid __PNR_setregid #endif #ifdef __NR_setregid32 #define __SNR_setregid32 __NR_setregid32 #else #define __SNR_setregid32 __PNR_setregid32 #endif #ifdef __NR_setresgid #define __SNR_setresgid __NR_setresgid #else #define __SNR_setresgid __PNR_setresgid #endif #ifdef __NR_setresgid32 #define __SNR_setresgid32 __NR_setresgid32 #else #define __SNR_setresgid32 __PNR_setresgid32 #endif #ifdef __NR_setresuid #define __SNR_setresuid __NR_setresuid #else #define __SNR_setresuid __PNR_setresuid #endif #ifdef __NR_setresuid32 #define __SNR_setresuid32 __NR_setresuid32 #else #define __SNR_setresuid32 __PNR_setresuid32 #endif #ifdef __NR_setreuid #define __SNR_setreuid __NR_setreuid #else #define __SNR_setreuid __PNR_setreuid #endif #ifdef __NR_setreuid32 #define __SNR_setreuid32 __NR_setreuid32 #else #define __SNR_setreuid32 __PNR_setreuid32 #endif #ifdef __NR_setrlimit #define __SNR_setrlimit __NR_setrlimit #else #define __SNR_setrlimit __PNR_setrlimit #endif #define __SNR_setsid __NR_setsid #ifdef __NR_setsockopt #define __SNR_setsockopt __NR_setsockopt #else #define __SNR_setsockopt __PNR_setsockopt #endif #define __SNR_settimeofday __NR_settimeofday #ifdef __NR_setuid #define __SNR_setuid __NR_setuid #else #define __SNR_setuid __PNR_setuid #endif #ifdef __NR_setuid32 #define __SNR_setuid32 __NR_setuid32 #else #define __SNR_setuid32 __PNR_setuid32 #endif #define __SNR_setxattr __NR_setxattr #ifdef __NR_sgetmask #define __SNR_sgetmask __NR_sgetmask #else #define __SNR_sgetmask __PNR_sgetmask #endif #ifdef __NR_shmat #define __SNR_shmat __NR_shmat #else #define __SNR_shmat __PNR_shmat #endif #ifdef __NR_shmctl #define __SNR_shmctl __NR_shmctl #else #define __SNR_shmctl __PNR_shmctl #endif #ifdef __NR_shmdt #define __SNR_shmdt __NR_shmdt #else #define __SNR_shmdt __PNR_shmdt #endif #ifdef __NR_shmget #define __SNR_shmget __NR_shmget #else #define __SNR_shmget __PNR_shmget #endif #ifdef __NR_shutdown #define __SNR_shutdown __NR_shutdown #else #define __SNR_shutdown __PNR_shutdown #endif #ifdef __NR_sigaction #define __SNR_sigaction __NR_sigaction #else #define __SNR_sigaction __PNR_sigaction #endif #define __SNR_sigaltstack __NR_sigaltstack #ifdef __NR_signal #define __SNR_signal __NR_signal #else #define __SNR_signal __PNR_signal #endif #ifdef __NR_signalfd #define __SNR_signalfd __NR_signalfd #else #define __SNR_signalfd __PNR_signalfd #endif #define __SNR_signalfd4 __NR_signalfd4 #ifdef __NR_sigpending #define __SNR_sigpending __NR_sigpending #else #define __SNR_sigpending __PNR_sigpending #endif #ifdef __NR_sigprocmask #define __SNR_sigprocmask __NR_sigprocmask #else #define __SNR_sigprocmask __PNR_sigprocmask #endif #ifdef __NR_sigreturn #define __SNR_sigreturn __NR_sigreturn #else #define __SNR_sigreturn __PNR_sigreturn #endif #ifdef __NR_sigsuspend #define __SNR_sigsuspend __NR_sigsuspend #else #define __SNR_sigsuspend __PNR_sigsuspend #endif #ifdef __NR_socket #define __SNR_socket __NR_socket #else #define __SNR_socket __PNR_socket #endif #ifdef __NR_socketcall #define __SNR_socketcall __NR_socketcall #else #define __SNR_socketcall __PNR_socketcall #endif #ifdef __NR_socketpair #define __SNR_socketpair __NR_socketpair #else #define __SNR_socketpair __PNR_socketpair #endif #define __SNR_splice __NR_splice #ifdef __NR_spu_create #define __SNR_spu_create __NR_spu_create #else #define __SNR_spu_create __PNR_spu_create #endif #ifdef __NR_spu_run #define __SNR_spu_run __NR_spu_run #else #define __SNR_spu_run __PNR_spu_run #endif #ifdef __NR_ssetmask #define __SNR_ssetmask __NR_ssetmask #else #define __SNR_ssetmask __PNR_ssetmask #endif #ifdef __NR_stat #define __SNR_stat __NR_stat #else #define __SNR_stat __PNR_stat #endif #ifdef __NR_stat64 #define __SNR_stat64 __NR_stat64 #else #define __SNR_stat64 __PNR_stat64 #endif #ifdef __NR_statfs #define __SNR_statfs __NR_statfs #else #define __SNR_statfs __PNR_statfs #endif #ifdef __NR_statfs64 #define __SNR_statfs64 __NR_statfs64 #else #define __SNR_statfs64 __PNR_statfs64 #endif #ifdef __NR_statx #define __SNR_statx __NR_statx #else #define __SNR_statx __PNR_statx #endif #ifdef __NR_stime #define __SNR_stime __NR_stime #else #define __SNR_stime __PNR_stime #endif #ifdef __NR_stty #define __SNR_stty __NR_stty #else #define __SNR_stty __PNR_stty #endif #ifdef __NR_subpage_prot #define __SNR_subpage_prot __NR_subpage_prot #else #define __SNR_subpage_prot __PNR_subpage_prot #endif #ifdef __NR_swapcontext #define __SNR_swapcontext __NR_swapcontext #else #define __SNR_swapcontext __PNR_swapcontext #endif #define __SNR_swapoff __NR_swapoff #define __SNR_swapon __NR_swapon #ifdef __NR_switch_endian #define __SNR_switch_endian __NR_switch_endian #else #define __SNR_switch_endian __PNR_switch_endian #endif #ifdef __NR_symlink #define __SNR_symlink __NR_symlink #else #define __SNR_symlink __PNR_symlink #endif #define __SNR_symlinkat __NR_symlinkat #ifdef __NR_sync #define __SNR_sync __NR_sync #else #define __SNR_sync __PNR_sync #endif #ifdef __NR_sync_file_range #define __SNR_sync_file_range __NR_sync_file_range #else #define __SNR_sync_file_range __PNR_sync_file_range #endif #ifdef __NR_sync_file_range2 #define __SNR_sync_file_range2 __NR_sync_file_range2 #else #define __SNR_sync_file_range2 __PNR_sync_file_range2 #endif #define __SNR_syncfs __NR_syncfs #ifdef __NR_syscall #define __SNR_syscall __NR_syscall #else #define __SNR_syscall __PNR_syscall #endif #ifdef __NR_sys_debug_setcontext #define __SNR_sys_debug_setcontext __NR_sys_debug_setcontext #else #define __SNR_sys_debug_setcontext __PNR_sys_debug_setcontext #endif #ifdef __NR_sysfs #define __SNR_sysfs __NR_sysfs #else #define __SNR_sysfs __PNR_sysfs #endif #define __SNR_sysinfo __NR_sysinfo #define __SNR_syslog __NR_syslog #ifdef __NR_sysmips #define __SNR_sysmips __NR_sysmips #else #define __SNR_sysmips __PNR_sysmips #endif #define __SNR_tee __NR_tee #define __SNR_tgkill __NR_tgkill #ifdef __NR_time #define __SNR_time __NR_time #else #define __SNR_time __PNR_time #endif #define __SNR_timer_create __NR_timer_create #define __SNR_timer_delete __NR_timer_delete #define __SNR_timer_getoverrun __NR_timer_getoverrun #define __SNR_timer_gettime __NR_timer_gettime #ifdef __NR_timer_gettime64 #define __SNR_timer_gettime64 __NR_timer_gettime64 #else #define __SNR_timer_gettime64 __PNR_timer_gettime64 #endif #define __SNR_timer_settime __NR_timer_settime #ifdef __NR_timer_settime64 #define __SNR_timer_settime64 __NR_timer_settime64 #else #define __SNR_timer_settime64 __PNR_timer_settime64 #endif #ifdef __NR_timerfd #define __SNR_timerfd __NR_timerfd #else #define __SNR_timerfd __PNR_timerfd #endif #define __SNR_timerfd_create __NR_timerfd_create #define __SNR_timerfd_gettime __NR_timerfd_gettime #ifdef __NR_timerfd_gettime64 #define __SNR_timerfd_gettime64 __NR_timerfd_gettime64 #else #define __SNR_timerfd_gettime64 __PNR_timerfd_gettime64 #endif #define __SNR_timerfd_settime __NR_timerfd_settime #ifdef __NR_timerfd_settime64 #define __SNR_timerfd_settime64 __NR_timerfd_settime64 #else #define __SNR_timerfd_settime64 __PNR_timerfd_settime64 #endif #define __SNR_times __NR_times #define __SNR_tkill __NR_tkill #ifdef __NR_truncate #define __SNR_truncate __NR_truncate #else #define __SNR_truncate __PNR_truncate #endif #ifdef __NR_truncate64 #define __SNR_truncate64 __NR_truncate64 #else #define __SNR_truncate64 __PNR_truncate64 #endif #ifdef __NR_tuxcall #define __SNR_tuxcall __NR_tuxcall #else #define __SNR_tuxcall __PNR_tuxcall #endif #ifdef __NR_ugetrlimit #define __SNR_ugetrlimit __NR_ugetrlimit #else #define __SNR_ugetrlimit __PNR_ugetrlimit #endif #ifdef __NR_ulimit #define __SNR_ulimit __NR_ulimit #else #define __SNR_ulimit __PNR_ulimit #endif #define __SNR_umask __NR_umask #ifdef __NR_umount #define __SNR_umount __NR_umount #else #define __SNR_umount __PNR_umount #endif #define __SNR_umount2 __NR_umount2 #define __SNR_uname __NR_uname #ifdef __NR_unlink #define __SNR_unlink __NR_unlink #else #define __SNR_unlink __PNR_unlink #endif #define __SNR_unlinkat __NR_unlinkat #define __SNR_unshare __NR_unshare #ifdef __NR_uselib #define __SNR_uselib __NR_uselib #else #define __SNR_uselib __PNR_uselib #endif #ifdef __NR_userfaultfd #define __SNR_userfaultfd __NR_userfaultfd #else #define __SNR_userfaultfd __PNR_userfaultfd #endif #ifdef __NR_usr26 #ifdef __ARM_NR_usr26 #define __SNR_usr26 __NR_usr26 #else #define __SNR_usr26 __NR_usr26 #endif #else #define __SNR_usr26 __PNR_usr26 #endif #ifdef __NR_usr32 #ifdef __ARM_NR_usr32 #define __SNR_usr32 __NR_usr32 #else #define __SNR_usr32 __NR_usr32 #endif #else #define __SNR_usr32 __PNR_usr32 #endif #ifdef __NR_ustat #define __SNR_ustat __NR_ustat #else #define __SNR_ustat __PNR_ustat #endif #ifdef __NR_utime #define __SNR_utime __NR_utime #else #define __SNR_utime __PNR_utime #endif #define __SNR_utimensat __NR_utimensat #ifdef __NR_utimensat_time64 #define __SNR_utimensat_time64 __NR_utimensat_time64 #else #define __SNR_utimensat_time64 __PNR_utimensat_time64 #endif #ifdef __NR_utimes #define __SNR_utimes __NR_utimes #else #define __SNR_utimes __PNR_utimes #endif #ifdef __NR_vfork #define __SNR_vfork __NR_vfork #else #define __SNR_vfork __PNR_vfork #endif #define __SNR_vhangup __NR_vhangup #ifdef __NR_vm86 #define __SNR_vm86 __NR_vm86 #else #define __SNR_vm86 __PNR_vm86 #endif #ifdef __NR_vm86old #define __SNR_vm86old __NR_vm86old #else #define __SNR_vm86old __PNR_vm86old #endif #define __SNR_vmsplice __NR_vmsplice #ifdef __NR_vserver #define __SNR_vserver __NR_vserver #else #define __SNR_vserver __PNR_vserver #endif #define __SNR_wait4 __NR_wait4 #define __SNR_waitid __NR_waitid #ifdef __NR_waitpid #define __SNR_waitpid __NR_waitpid #else #define __SNR_waitpid __PNR_waitpid #endif #define __SNR_write __NR_write #define __SNR_writev __NR_writev libseccomp-2.5.4/include/.gitignore0000644000000000000000000000001214467535324015761 0ustar rootrootseccomp.h libseccomp-2.5.4/include/Makefile.am0000644000000000000000000000125514467535324016037 0ustar rootroot#### # Seccomp Library Header Files # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License # as published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # include_HEADERS = seccomp.h seccomp-syscalls.h libseccomp-2.5.4/include/seccomp.h.in0000644000000000000000000006510014467535324016211 0ustar rootroot/** * Seccomp Library * * Copyright (c) 2019 Cisco Systems * Copyright (c) 2012,2013 Red Hat * Author: Paul Moore */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License as * published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef _SECCOMP_H #define _SECCOMP_H #include #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* * version information */ #define SCMP_VER_MAJOR @VERSION_MAJOR@ #define SCMP_VER_MINOR @VERSION_MINOR@ #define SCMP_VER_MICRO @VERSION_MICRO@ struct scmp_version { unsigned int major; unsigned int minor; unsigned int micro; }; /* * types */ /** * Filter context/handle */ typedef void *scmp_filter_ctx; /** * Filter attributes */ enum scmp_filter_attr { _SCMP_FLTATR_MIN = 0, SCMP_FLTATR_ACT_DEFAULT = 1, /**< default filter action */ SCMP_FLTATR_ACT_BADARCH = 2, /**< bad architecture action */ SCMP_FLTATR_CTL_NNP = 3, /**< set NO_NEW_PRIVS on filter load */ SCMP_FLTATR_CTL_TSYNC = 4, /**< sync threads on filter load */ SCMP_FLTATR_API_TSKIP = 5, /**< allow rules with a -1 syscall */ SCMP_FLTATR_CTL_LOG = 6, /**< log not-allowed actions */ SCMP_FLTATR_CTL_SSB = 7, /**< disable SSB mitigation */ SCMP_FLTATR_CTL_OPTIMIZE = 8, /**< filter optimization level: * 0 - currently unused * 1 - rules weighted by priority and * complexity (DEFAULT) * 2 - binary tree sorted by syscall * number */ SCMP_FLTATR_API_SYSRAWRC = 9, /**< return the system return codes */ SCMP_FLTATR_CTL_WAITKILL = 10, /**< request wait killable semantics */ _SCMP_FLTATR_MAX, }; /** * Comparison operators */ enum scmp_compare { _SCMP_CMP_MIN = 0, SCMP_CMP_NE = 1, /**< not equal */ SCMP_CMP_LT = 2, /**< less than */ SCMP_CMP_LE = 3, /**< less than or equal */ SCMP_CMP_EQ = 4, /**< equal */ SCMP_CMP_GE = 5, /**< greater than or equal */ SCMP_CMP_GT = 6, /**< greater than */ SCMP_CMP_MASKED_EQ = 7, /**< masked equality */ _SCMP_CMP_MAX, }; /** * Argument datum */ typedef uint64_t scmp_datum_t; /** * Argument / Value comparison definition */ struct scmp_arg_cmp { unsigned int arg; /**< argument number, starting at 0 */ enum scmp_compare op; /**< the comparison op, e.g. SCMP_CMP_* */ scmp_datum_t datum_a; scmp_datum_t datum_b; }; /* * macros/defines */ /** * The native architecture token */ #define SCMP_ARCH_NATIVE 0 /** * The x86 (32-bit) architecture token */ #define SCMP_ARCH_X86 AUDIT_ARCH_I386 /** * The x86-64 (64-bit) architecture token */ #define SCMP_ARCH_X86_64 AUDIT_ARCH_X86_64 /** * The x32 (32-bit x86_64) architecture token * * NOTE: this is different from the value used by the kernel because we need to * be able to distinguish between x32 and x86_64 */ #define SCMP_ARCH_X32 (EM_X86_64|__AUDIT_ARCH_LE) /** * The ARM architecture tokens */ #define SCMP_ARCH_ARM AUDIT_ARCH_ARM /* AArch64 support for audit was merged in 3.17-rc1 */ #ifndef AUDIT_ARCH_AARCH64 #ifndef EM_AARCH64 #define EM_AARCH64 183 #endif /* EM_AARCH64 */ #define AUDIT_ARCH_AARCH64 (EM_AARCH64|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE) #endif /* AUDIT_ARCH_AARCH64 */ #define SCMP_ARCH_AARCH64 AUDIT_ARCH_AARCH64 /** * The LoongArch architecture tokens */ /* 64-bit LoongArch audit support is upstream as of 5.19-rc1 */ #ifndef AUDIT_ARCH_LOONGARCH64 #ifndef EM_LOONGARCH #define EM_LOONGARCH 258 #endif /* EM_LOONGARCH */ #define AUDIT_ARCH_LOONGARCH64 (EM_LOONGARCH|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE) #endif /* AUDIT_ARCH_LOONGARCH64 */ #define SCMP_ARCH_LOONGARCH64 AUDIT_ARCH_LOONGARCH64 /** * The Motorola 68000 architecture tokens */ #define SCMP_ARCH_M68K AUDIT_ARCH_M68K /** * The MIPS architecture tokens */ #ifndef __AUDIT_ARCH_CONVENTION_MIPS64_N32 #define __AUDIT_ARCH_CONVENTION_MIPS64_N32 0x20000000 #endif #ifndef EM_MIPS #define EM_MIPS 8 #endif #ifndef AUDIT_ARCH_MIPS #define AUDIT_ARCH_MIPS (EM_MIPS) #endif #ifndef AUDIT_ARCH_MIPS64 #define AUDIT_ARCH_MIPS64 (EM_MIPS|__AUDIT_ARCH_64BIT) #endif /* MIPS64N32 support was merged in 3.15 */ #ifndef AUDIT_ARCH_MIPS64N32 #define AUDIT_ARCH_MIPS64N32 (EM_MIPS|__AUDIT_ARCH_64BIT|\ __AUDIT_ARCH_CONVENTION_MIPS64_N32) #endif /* MIPSEL64N32 support was merged in 3.15 */ #ifndef AUDIT_ARCH_MIPSEL64N32 #define AUDIT_ARCH_MIPSEL64N32 (EM_MIPS|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE|\ __AUDIT_ARCH_CONVENTION_MIPS64_N32) #endif #define SCMP_ARCH_MIPS AUDIT_ARCH_MIPS #define SCMP_ARCH_MIPS64 AUDIT_ARCH_MIPS64 #define SCMP_ARCH_MIPS64N32 AUDIT_ARCH_MIPS64N32 #define SCMP_ARCH_MIPSEL AUDIT_ARCH_MIPSEL #define SCMP_ARCH_MIPSEL64 AUDIT_ARCH_MIPSEL64 #define SCMP_ARCH_MIPSEL64N32 AUDIT_ARCH_MIPSEL64N32 /** * The PowerPC architecture tokens */ #define SCMP_ARCH_PPC AUDIT_ARCH_PPC #define SCMP_ARCH_PPC64 AUDIT_ARCH_PPC64 #ifndef AUDIT_ARCH_PPC64LE #define AUDIT_ARCH_PPC64LE (EM_PPC64|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE) #endif #define SCMP_ARCH_PPC64LE AUDIT_ARCH_PPC64LE /** * The S390 architecture tokens */ #define SCMP_ARCH_S390 AUDIT_ARCH_S390 #define SCMP_ARCH_S390X AUDIT_ARCH_S390X /** * The PA-RISC hppa architecture tokens */ #define SCMP_ARCH_PARISC AUDIT_ARCH_PARISC #define SCMP_ARCH_PARISC64 AUDIT_ARCH_PARISC64 /** * The RISC-V architecture tokens */ /* RISC-V support for audit was merged in 5.0-rc1 */ #ifndef AUDIT_ARCH_RISCV64 #ifndef EM_RISCV #define EM_RISCV 243 #endif /* EM_RISCV */ #define AUDIT_ARCH_RISCV64 (EM_RISCV|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE) #endif /* AUDIT_ARCH_RISCV64 */ #define SCMP_ARCH_RISCV64 AUDIT_ARCH_RISCV64 /** * The SuperH architecture tokens */ #define SCMP_ARCH_SHEB AUDIT_ARCH_SH #define SCMP_ARCH_SH AUDIT_ARCH_SHEL /* Little-endian SH is more common than big */ /** * Convert a syscall name into the associated syscall number * @param x the syscall name */ #define SCMP_SYS(x) (__SNR_##x) /* Helpers for the argument comparison macros, DO NOT USE directly */ #define _SCMP_VA_NUM_ARGS(...) _SCMP_VA_NUM_ARGS_IMPL(__VA_ARGS__,2,1) #define _SCMP_VA_NUM_ARGS_IMPL(_1,_2,N,...) N #define _SCMP_MACRO_DISPATCHER(func, ...) \ _SCMP_MACRO_DISPATCHER_IMPL1(func, _SCMP_VA_NUM_ARGS(__VA_ARGS__)) #define _SCMP_MACRO_DISPATCHER_IMPL1(func, nargs) \ _SCMP_MACRO_DISPATCHER_IMPL2(func, nargs) #define _SCMP_MACRO_DISPATCHER_IMPL2(func, nargs) \ func ## nargs #define _SCMP_CMP32_1(x, y, z) \ SCMP_CMP64(x, y, (uint32_t)(z)) #define _SCMP_CMP32_2(x, y, z, q) \ SCMP_CMP64(x, y, (uint32_t)(z), (uint32_t)(q)) /** * Specify a 64-bit argument comparison struct for use in declaring rules * @param arg the argument number, starting at 0 * @param op the comparison operator, e.g. SCMP_CMP_* * @param datum_a dependent on comparison * @param datum_b dependent on comparison, optional */ #define SCMP_CMP64(...) ((struct scmp_arg_cmp){__VA_ARGS__}) #define SCMP_CMP SCMP_CMP64 /** * Specify a 32-bit argument comparison struct for use in declaring rules * @param arg the argument number, starting at 0 * @param op the comparison operator, e.g. SCMP_CMP_* * @param datum_a dependent on comparison (32-bits) * @param datum_b dependent on comparison, optional (32-bits) */ #define SCMP_CMP32(x, y, ...) \ _SCMP_MACRO_DISPATCHER(_SCMP_CMP32_, __VA_ARGS__)(x, y, __VA_ARGS__) /** * Specify a 64-bit argument comparison struct for argument 0 */ #define SCMP_A0_64(...) SCMP_CMP64(0, __VA_ARGS__) #define SCMP_A0 SCMP_A0_64 /** * Specify a 32-bit argument comparison struct for argument 0 */ #define SCMP_A0_32(x, ...) SCMP_CMP32(0, x, __VA_ARGS__) /** * Specify a 64-bit argument comparison struct for argument 1 */ #define SCMP_A1_64(...) SCMP_CMP64(1, __VA_ARGS__) #define SCMP_A1 SCMP_A1_64 /** * Specify a 32-bit argument comparison struct for argument 1 */ #define SCMP_A1_32(x, ...) SCMP_CMP32(1, x, __VA_ARGS__) /** * Specify a 64-bit argument comparison struct for argument 2 */ #define SCMP_A2_64(...) SCMP_CMP64(2, __VA_ARGS__) #define SCMP_A2 SCMP_A2_64 /** * Specify a 32-bit argument comparison struct for argument 2 */ #define SCMP_A2_32(x, ...) SCMP_CMP32(2, x, __VA_ARGS__) /** * Specify a 64-bit argument comparison struct for argument 3 */ #define SCMP_A3_64(...) SCMP_CMP64(3, __VA_ARGS__) #define SCMP_A3 SCMP_A3_64 /** * Specify a 32-bit argument comparison struct for argument 3 */ #define SCMP_A3_32(x, ...) SCMP_CMP32(3, x, __VA_ARGS__) /** * Specify a 64-bit argument comparison struct for argument 4 */ #define SCMP_A4_64(...) SCMP_CMP64(4, __VA_ARGS__) #define SCMP_A4 SCMP_A4_64 /** * Specify a 32-bit argument comparison struct for argument 4 */ #define SCMP_A4_32(x, ...) SCMP_CMP32(4, x, __VA_ARGS__) /** * Specify a 64-bit argument comparison struct for argument 5 */ #define SCMP_A5_64(...) SCMP_CMP64(5, __VA_ARGS__) #define SCMP_A5 SCMP_A5_64 /** * Specify a 32-bit argument comparison struct for argument 5 */ #define SCMP_A5_32(x, ...) SCMP_CMP32(5, x, __VA_ARGS__) /* * seccomp actions */ /** * Kill the process */ #define SCMP_ACT_KILL_PROCESS 0x80000000U /** * Kill the thread */ #define SCMP_ACT_KILL_THREAD 0x00000000U /** * Kill the thread, defined for backward compatibility */ #define SCMP_ACT_KILL SCMP_ACT_KILL_THREAD /** * Throw a SIGSYS signal */ #define SCMP_ACT_TRAP 0x00030000U /** * Notifies userspace */ #define SCMP_ACT_NOTIFY 0x7fc00000U /** * Return the specified error code */ #define SCMP_ACT_ERRNO(x) (0x00050000U | ((x) & 0x0000ffffU)) /** * Notify a tracing process with the specified value */ #define SCMP_ACT_TRACE(x) (0x7ff00000U | ((x) & 0x0000ffffU)) /** * Allow the syscall to be executed after the action has been logged */ #define SCMP_ACT_LOG 0x7ffc0000U /** * Allow the syscall to be executed */ #define SCMP_ACT_ALLOW 0x7fff0000U /* SECCOMP_RET_USER_NOTIF was added in kernel v5.0. */ #ifndef SECCOMP_RET_USER_NOTIF #define SECCOMP_RET_USER_NOTIF 0x7fc00000U struct seccomp_notif { __u64 id; __u32 pid; __u32 flags; struct seccomp_data data; }; struct seccomp_notif_resp { __u64 id; __s64 val; __s32 error; __u32 flags; }; #endif /* * functions */ /** * Query the library version information * * This function returns a pointer to a populated scmp_version struct, the * caller does not need to free the structure when finished. * */ const struct scmp_version *seccomp_version(void); /** * Query the library's level of API support * * This function returns an API level value indicating the current supported * functionality. It is important to note that this level of support is * determined at runtime and therefore can change based on the running kernel * and system configuration (e.g. any previously loaded seccomp filters). This * function can be called multiple times, but it only queries the system the * first time it is called, the API level is cached and used in subsequent * calls. * * The current API levels are described below: * 0 : reserved * 1 : base level * 2 : support for the SCMP_FLTATR_CTL_TSYNC filter attribute * uses the seccomp(2) syscall instead of the prctl(2) syscall * 3 : support for the SCMP_FLTATR_CTL_LOG filter attribute * support for the SCMP_ACT_LOG action * support for the SCMP_ACT_KILL_PROCESS action * 4 : support for the SCMP_FLTATR_CTL_SSB filter attribute * 5 : support for the SCMP_ACT_NOTIFY action and notify APIs * 6 : support the simultaneous use of SCMP_FLTATR_CTL_TSYNC and notify APIs * 7 : support for the SCMP_FLTATR_CTL_WAITKILL filter attribute * */ unsigned int seccomp_api_get(void); /** * Set the library's level of API support * * This function forcibly sets the API level of the library at runtime. Valid * API levels are discussed in the description of the seccomp_api_get() * function. General use of this function is strongly discouraged. * */ int seccomp_api_set(unsigned int level); /** * Initialize the filter state * @param def_action the default filter action * * This function initializes the internal seccomp filter state and should * be called before any other functions in this library to ensure the filter * state is initialized. Returns a filter context on success, NULL on failure. * */ scmp_filter_ctx seccomp_init(uint32_t def_action); /** * Reset the filter state * @param ctx the filter context * @param def_action the default filter action * * This function resets the given seccomp filter state and ensures the * filter state is reinitialized. This function does not reset any seccomp * filters already loaded into the kernel. Returns zero on success, negative * values on failure. * */ int seccomp_reset(scmp_filter_ctx ctx, uint32_t def_action); /** * Destroys the filter state and releases any resources * @param ctx the filter context * * This functions destroys the given seccomp filter state and releases any * resources, including memory, associated with the filter state. This * function does not reset any seccomp filters already loaded into the kernel. * The filter context can no longer be used after calling this function. * */ void seccomp_release(scmp_filter_ctx ctx); /** * Merge two filters * @param ctx_dst the destination filter context * @param ctx_src the source filter context * * This function merges two filter contexts into a single filter context and * destroys the second filter context. The two filter contexts must have the * same attribute values and not contain any of the same architectures; if they * do, the merge operation will fail. On success, the source filter context * will be destroyed and should no longer be used; it is not necessary to * call seccomp_release() on the source filter context. Returns zero on * success, negative values on failure. * */ int seccomp_merge(scmp_filter_ctx ctx_dst, scmp_filter_ctx ctx_src); /** * Resolve the architecture name to a architecture token * @param arch_name the architecture name * * This function resolves the given architecture name to a token suitable for * use with libseccomp, returns zero on failure. * */ uint32_t seccomp_arch_resolve_name(const char *arch_name); /** * Return the native architecture token * * This function returns the native architecture token value, e.g. SCMP_ARCH_*. * */ uint32_t seccomp_arch_native(void); /** * Check to see if an existing architecture is present in the filter * @param ctx the filter context * @param arch_token the architecture token, e.g. SCMP_ARCH_* * * This function tests to see if a given architecture is included in the filter * context. If the architecture token is SCMP_ARCH_NATIVE then the native * architecture will be assumed. Returns zero if the architecture exists in * the filter, -EEXIST if it is not present, and other negative values on * failure. * */ int seccomp_arch_exist(const scmp_filter_ctx ctx, uint32_t arch_token); /** * Adds an architecture to the filter * @param ctx the filter context * @param arch_token the architecture token, e.g. SCMP_ARCH_* * * This function adds a new architecture to the given seccomp filter context. * Any new rules added after this function successfully returns will be added * to this architecture but existing rules will not be added to this * architecture. If the architecture token is SCMP_ARCH_NATIVE then the native * architecture will be assumed. Returns zero on success, -EEXIST if * specified architecture is already present, other negative values on failure. * */ int seccomp_arch_add(scmp_filter_ctx ctx, uint32_t arch_token); /** * Removes an architecture from the filter * @param ctx the filter context * @param arch_token the architecture token, e.g. SCMP_ARCH_* * * This function removes an architecture from the given seccomp filter context. * If the architecture token is SCMP_ARCH_NATIVE then the native architecture * will be assumed. Returns zero on success, negative values on failure. * */ int seccomp_arch_remove(scmp_filter_ctx ctx, uint32_t arch_token); /** * Loads the filter into the kernel * @param ctx the filter context * * This function loads the given seccomp filter context into the kernel. If * the filter was loaded correctly, the kernel will be enforcing the filter * when this function returns. Returns zero on success, negative values on * error. * */ int seccomp_load(const scmp_filter_ctx ctx); /** * Get the value of a filter attribute * @param ctx the filter context * @param attr the filter attribute name * @param value the filter attribute value * * This function fetches the value of the given attribute name and returns it * via @value. Returns zero on success, negative values on failure. * */ int seccomp_attr_get(const scmp_filter_ctx ctx, enum scmp_filter_attr attr, uint32_t *value); /** * Set the value of a filter attribute * @param ctx the filter context * @param attr the filter attribute name * @param value the filter attribute value * * This function sets the value of the given attribute. Returns zero on * success, negative values on failure. * */ int seccomp_attr_set(scmp_filter_ctx ctx, enum scmp_filter_attr attr, uint32_t value); /** * Resolve a syscall number to a name * @param arch_token the architecture token, e.g. SCMP_ARCH_* * @param num the syscall number * * Resolve the given syscall number to the syscall name for the given * architecture; it is up to the caller to free the returned string. Returns * the syscall name on success, NULL on failure. * */ char *seccomp_syscall_resolve_num_arch(uint32_t arch_token, int num); /** * Resolve a syscall name to a number * @param arch_token the architecture token, e.g. SCMP_ARCH_* * @param name the syscall name * * Resolve the given syscall name to the syscall number for the given * architecture. Returns the syscall number on success, including negative * pseudo syscall numbers (e.g. __PNR_*); returns __NR_SCMP_ERROR on failure. * */ int seccomp_syscall_resolve_name_arch(uint32_t arch_token, const char *name); /** * Resolve a syscall name to a number and perform any rewriting necessary * @param arch_token the architecture token, e.g. SCMP_ARCH_* * @param name the syscall name * * Resolve the given syscall name to the syscall number for the given * architecture and do any necessary syscall rewriting needed by the * architecture. Returns the syscall number on success, including negative * pseudo syscall numbers (e.g. __PNR_*); returns __NR_SCMP_ERROR on failure. * */ int seccomp_syscall_resolve_name_rewrite(uint32_t arch_token, const char *name); /** * Resolve a syscall name to a number * @param name the syscall name * * Resolve the given syscall name to the syscall number. Returns the syscall * number on success, including negative pseudo syscall numbers (e.g. __PNR_*); * returns __NR_SCMP_ERROR on failure. * */ int seccomp_syscall_resolve_name(const char *name); /** * Set the priority of a given syscall * @param ctx the filter context * @param syscall the syscall number * @param priority priority value, higher value == higher priority * * This function sets the priority of the given syscall; this value is used * when generating the seccomp filter code such that higher priority syscalls * will incur less filter code overhead than the lower priority syscalls in the * filter. Returns zero on success, negative values on failure. * */ int seccomp_syscall_priority(scmp_filter_ctx ctx, int syscall, uint8_t priority); /** * Add a new rule to the filter * @param ctx the filter context * @param action the filter action * @param syscall the syscall number * @param arg_cnt the number of argument filters in the argument filter chain * @param ... scmp_arg_cmp structs (use of SCMP_ARG_CMP() recommended) * * This function adds a series of new argument/value checks to the seccomp * filter for the given syscall; multiple argument/value checks can be * specified and they will be chained together (AND'd together) in the filter. * If the specified rule needs to be adjusted due to architecture specifics it * will be adjusted without notification. Returns zero on success, negative * values on failure. * */ int seccomp_rule_add(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt, ...); /** * Add a new rule to the filter * @param ctx the filter context * @param action the filter action * @param syscall the syscall number * @param arg_cnt the number of elements in the arg_array parameter * @param arg_array array of scmp_arg_cmp structs * * This function adds a series of new argument/value checks to the seccomp * filter for the given syscall; multiple argument/value checks can be * specified and they will be chained together (AND'd together) in the filter. * If the specified rule needs to be adjusted due to architecture specifics it * will be adjusted without notification. Returns zero on success, negative * values on failure. * */ int seccomp_rule_add_array(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt, const struct scmp_arg_cmp *arg_array); /** * Add a new rule to the filter * @param ctx the filter context * @param action the filter action * @param syscall the syscall number * @param arg_cnt the number of argument filters in the argument filter chain * @param ... scmp_arg_cmp structs (use of SCMP_ARG_CMP() recommended) * * This function adds a series of new argument/value checks to the seccomp * filter for the given syscall; multiple argument/value checks can be * specified and they will be chained together (AND'd together) in the filter. * If the specified rule can not be represented on the architecture the * function will fail. Returns zero on success, negative values on failure. * */ int seccomp_rule_add_exact(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt, ...); /** * Add a new rule to the filter * @param ctx the filter context * @param action the filter action * @param syscall the syscall number * @param arg_cnt the number of elements in the arg_array parameter * @param arg_array array of scmp_arg_cmp structs * * This function adds a series of new argument/value checks to the seccomp * filter for the given syscall; multiple argument/value checks can be * specified and they will be chained together (AND'd together) in the filter. * If the specified rule can not be represented on the architecture the * function will fail. Returns zero on success, negative values on failure. * */ int seccomp_rule_add_exact_array(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt, const struct scmp_arg_cmp *arg_array); /** * Allocate a pair of notification request/response structures * @param req the request location * @param resp the response location * * This function allocates a pair of request/response structure by computing * the correct sized based on the currently running kernel. It returns zero on * success, and negative values on failure. * */ int seccomp_notify_alloc(struct seccomp_notif **req, struct seccomp_notif_resp **resp); /** * Free a pair of notification request/response structures. * @param req the request location * @param resp the response location */ void seccomp_notify_free(struct seccomp_notif *req, struct seccomp_notif_resp *resp); /** * Receive a notification from a seccomp notification fd * @param fd the notification fd * @param req the request buffer to save into * * Blocks waiting for a notification on this fd. This function is thread safe * (synchronization is performed in the kernel). Returns zero on success, * negative values on error. * */ int seccomp_notify_receive(int fd, struct seccomp_notif *req); /** * Send a notification response to a seccomp notification fd * @param fd the notification fd * @param resp the response buffer to use * * Sends a notification response on this fd. This function is thread safe * (synchronization is performed in the kernel). Returns zero on success, * negative values on error. * */ int seccomp_notify_respond(int fd, struct seccomp_notif_resp *resp); /** * Check if a notification id is still valid * @param fd the notification fd * @param id the id to test * * Checks to see if a notification id is still valid. Returns 0 on success, and * negative values on failure. * */ int seccomp_notify_id_valid(int fd, uint64_t id); /** * Return the notification fd from a filter that has already been loaded * @param ctx the filter context * * This returns the listener fd that was generated when the seccomp policy was * loaded. This is only valid after seccomp_load() with a filter that makes * use of SCMP_ACT_NOTIFY. * */ int seccomp_notify_fd(const scmp_filter_ctx ctx); /** * Generate seccomp Pseudo Filter Code (PFC) and export it to a file * @param ctx the filter context * @param fd the destination fd * * This function generates seccomp Pseudo Filter Code (PFC) and writes it to * the given fd. Returns zero on success, negative values on failure. * */ int seccomp_export_pfc(const scmp_filter_ctx ctx, int fd); /** * Generate seccomp Berkeley Packet Filter (BPF) code and export it to a file * @param ctx the filter context * @param fd the destination fd * * This function generates seccomp Berkeley Packer Filter (BPF) code and writes * it to the given fd. Returns zero on success, negative values on failure. * */ int seccomp_export_bpf(const scmp_filter_ctx ctx, int fd); /** * Generate seccomp Berkeley Packet Filter (BPF) code and export it to a buffer * @param ctx the filter context * @param buf the destination buffer * @param len on input the length of the buffer, on output the number of bytes * in the program * * This function generates seccomp Berkeley Packer Filter (BPF) code and writes * it to the given buffer. Returns zero on success, negative values on failure. * */ int seccomp_export_bpf_mem(const scmp_filter_ctx ctx, void *buf, size_t *len); /** * Precompute the seccomp filter for future use * @param ctx the filter context * * This function precomputes the seccomp filter and stores it internally for * future use, speeding up seccomp_load() and other functions which require * the generated filter. * */ int seccomp_precompute(const scmp_filter_ctx ctx); /* * pseudo syscall definitions */ /* NOTE - pseudo syscall values {-1..-99} are reserved */ #define __NR_SCMP_ERROR -1 #define __NR_SCMP_UNDEF -2 #include #ifdef __cplusplus } #endif #endif libseccomp-2.5.4/SECURITY.md0000644000000000000000000000445214467535324014153 0ustar rootrootThe libseccomp Security Vulnerability Handling Process =============================================================================== https://github.com/seccomp/libseccomp This document document attempts to describe the processes through which sensitive security relevant bugs can be responsibly disclosed to the libseccomp project and how the project maintainers should handle these reports. Just like the other libseccomp process documents, this document should be treated as a guiding document and not a hard, unyielding set of regulations; the bug reporters and project maintainers are encouraged to work together to address the issues as best they can, in a manner which works best for all parties involved. ### Reporting Problems Problems with the libseccomp library that are not suitable for immediate public disclosure should be emailed to the current libseccomp maintainers, the list is below. We typically request at most a 90 day time period to address the issue before it is made public, but we will make every effort to address the issue as quickly as possible and shorten the disclosure window. * Paul Moore, paul@paul-moore.com * Tom Hromatka, tom.hromatka@oracle.com ### Resolving Sensitive Security Issues Upon disclosure of a bug, the maintainers should work together to investigate the problem and decide on a solution. In order to prevent an early disclosure of the problem, those working on the solution should do so privately and outside of the traditional libseccomp development practices. One possible solution to this is to leverage the GitHub "Security" functionality to create a private development fork that can be shared among the maintainers, and optionally the reporter. A placeholder GitHub issue may be created, but details should remain extremely limited until such time as the problem has been fixed and responsibly disclosed. If a CVE, or other tag, has been assigned to the problem, the GitHub issue title should include the vulnerability tag once the problem has been disclosed. ### Public Disclosure Whenever possible, responsible reporting and patching practices should be followed, including notification to the linux-distros and oss-security mailing lists. * https://oss-security.openwall.org/wiki/mailing-lists/distros * https://oss-security.openwall.org/wiki/mailing-lists/oss-security libseccomp-2.5.4/libseccomp.pc.in0000644000000000000000000000176614467535324015440 0ustar rootroot# # Enhanced Seccomp Library pkg-config Configuration # # Copyright (c) 2012 Red Hat # Author: Paul Moore # # # This library is free software; you can redistribute it and/or modify it # under the terms of version 2.1 of the GNU Lesser General Public License as # published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, see . # prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libseccomp Description: The enhanced seccomp library URL: https://github.com/seccomp/libseccomp Version: @PACKAGE_VERSION@ Cflags: -I${includedir} Libs: -L${libdir} -lseccomp libseccomp-2.5.4/.mailmap0000644000000000000000000000055414467535324014002 0ustar rootroot# libseccomp git mailmap file (see git-shortlog documentation) Paul Moore Kees Cook Kees Cook Serge Hallyn Thiago Marcos P. Santos libseccomp-2.5.4/m4/0000755000000000000000000000000014467535324012675 5ustar rootrootlibseccomp-2.5.4/m4/ax_code_coverage.m40000644000000000000000000002707314467535324016425 0ustar rootroot# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_code_coverage.html # =========================================================================== # # SYNOPSIS # # AX_CODE_COVERAGE() # # DESCRIPTION # # Defines CODE_COVERAGE_CPPFLAGS, CODE_COVERAGE_CFLAGS, # CODE_COVERAGE_CXXFLAGS and CODE_COVERAGE_LIBS which should be included # in the CPPFLAGS, CFLAGS CXXFLAGS and LIBS/LIBADD variables of every # build target (program or library) which should be built with code # coverage support. Also defines CODE_COVERAGE_RULES which should be # substituted in your Makefile; and $enable_code_coverage which can be # used in subsequent configure output. CODE_COVERAGE_ENABLED is defined # and substituted, and corresponds to the value of the # --enable-code-coverage option, which defaults to being disabled. # # Test also for gcov program and create GCOV variable that could be # substituted. # # Note that all optimisation flags in CFLAGS must be disabled when code # coverage is enabled. # # Usage example: # # configure.ac: # # AX_CODE_COVERAGE # # Makefile.am: # # @CODE_COVERAGE_RULES@ # my_program_LIBS = ... $(CODE_COVERAGE_LIBS) ... # my_program_CPPFLAGS = ... $(CODE_COVERAGE_CPPFLAGS) ... # my_program_CFLAGS = ... $(CODE_COVERAGE_CFLAGS) ... # my_program_CXXFLAGS = ... $(CODE_COVERAGE_CXXFLAGS) ... # # This results in a "check-code-coverage" rule being added to any # Makefile.am which includes "@CODE_COVERAGE_RULES@" (assuming the module # has been configured with --enable-code-coverage). Running `make # check-code-coverage` in that directory will run the module's test suite # (`make check`) and build a code coverage report detailing the code which # was touched, then print the URI for the report. # # In earlier versions of this macro, CODE_COVERAGE_LDFLAGS was defined # instead of CODE_COVERAGE_LIBS. They are both still defined, but use of # CODE_COVERAGE_LIBS is preferred for clarity; CODE_COVERAGE_LDFLAGS is # deprecated. They have the same value. # # This code was derived from Makefile.decl in GLib, originally licenced # under LGPLv2.1+. # # LICENSE # # Copyright (c) 2012, 2016 Philip Withnall # Copyright (c) 2012 Xan Lopez # Copyright (c) 2012 Christian Persch # Copyright (c) 2012 Paolo Borelli # Copyright (c) 2012 Dan Winship # Copyright (c) 2015 Bastien ROUCARIES # # This library is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # This library is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . #serial 20 AC_DEFUN([AX_CODE_COVERAGE],[ dnl Check for --enable-code-coverage AC_REQUIRE([AC_PROG_SED]) # allow to override gcov location AC_ARG_WITH([gcov], [AS_HELP_STRING([--with-gcov[=GCOV]], [use given GCOV for coverage (GCOV=gcov).])], [_AX_CODE_COVERAGE_GCOV_PROG_WITH=$with_gcov], [_AX_CODE_COVERAGE_GCOV_PROG_WITH=gcov]) AC_MSG_CHECKING([whether to build with code coverage support]) AC_ARG_ENABLE([code-coverage], AS_HELP_STRING([--enable-code-coverage], [Whether to enable code coverage support]),, enable_code_coverage=no) AM_CONDITIONAL([CODE_COVERAGE_ENABLED], [test x$enable_code_coverage = xyes]) AC_SUBST([CODE_COVERAGE_ENABLED], [$enable_code_coverage]) AC_MSG_RESULT($enable_code_coverage) AS_IF([ test "$enable_code_coverage" = "yes" ], [ # check for gcov AC_CHECK_TOOL([GCOV], [$_AX_CODE_COVERAGE_GCOV_PROG_WITH], [:]) AS_IF([test "X$GCOV" = "X:"], [AC_MSG_ERROR([gcov is needed to do coverage])]) AC_SUBST([GCOV]) dnl Check if gcc is being used AS_IF([ test "$GCC" = "no" ], [ AC_MSG_ERROR([not compiling with gcc, which is required for gcov code coverage]) ]) AC_CHECK_PROG([LCOV], [lcov], [lcov]) AC_CHECK_PROG([GENHTML], [genhtml], [genhtml]) AS_IF([ test -z "$LCOV" ], [ AC_MSG_ERROR([To enable code coverage reporting you must have lcov installed]) ]) AS_IF([ test -z "$GENHTML" ], [ AC_MSG_ERROR([Could not find genhtml from the lcov package]) ]) dnl Build the code coverage flags dnl Define CODE_COVERAGE_LDFLAGS for backwards compatibility CODE_COVERAGE_CPPFLAGS="-DNDEBUG" CODE_COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" CODE_COVERAGE_CXXFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" CODE_COVERAGE_LIBS="-lgcov" CODE_COVERAGE_LDFLAGS="$CODE_COVERAGE_LIBS" AC_SUBST([CODE_COVERAGE_CPPFLAGS]) AC_SUBST([CODE_COVERAGE_CFLAGS]) AC_SUBST([CODE_COVERAGE_CXXFLAGS]) AC_SUBST([CODE_COVERAGE_LIBS]) AC_SUBST([CODE_COVERAGE_LDFLAGS]) [CODE_COVERAGE_RULES_CHECK=' -$(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) -k check $(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) code-coverage-capture '] [CODE_COVERAGE_RULES_CAPTURE=' $(code_coverage_v_lcov_cap)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --capture --output-file "$(CODE_COVERAGE_OUTPUT_FILE).tmp" --test-name "$(call code_coverage_sanitize,$(PACKAGE_NAME)-$(PACKAGE_VERSION))" --no-checksum --compat-libtool $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_OPTIONS) $(code_coverage_v_lcov_ign)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" "/tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_RMOPTS) -@rm -f $(CODE_COVERAGE_OUTPUT_FILE).tmp $(code_coverage_v_genhtml)LANG=C $(GENHTML) $(code_coverage_quiet) $(addprefix --prefix ,$(CODE_COVERAGE_DIRECTORY)) --output-directory "$(CODE_COVERAGE_OUTPUT_DIRECTORY)" --title "$(PACKAGE_NAME)-$(PACKAGE_VERSION) Code Coverage" --legend --show-details "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_GENHTML_OPTIONS) @echo "file://$(abs_builddir)/$(CODE_COVERAGE_OUTPUT_DIRECTORY)/index.html" '] [CODE_COVERAGE_RULES_CLEAN=' clean: code-coverage-clean distclean: code-coverage-clean code-coverage-clean: -$(LCOV) --directory $(top_builddir) -z -rm -rf $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_FILE).tmp $(CODE_COVERAGE_OUTPUT_DIRECTORY) -find . \( -name "*.gcda" -o -name "*.gcno" -o -name "*.gcov" \) -delete '] ], [ [CODE_COVERAGE_RULES_CHECK=' @echo "Need to reconfigure with --enable-code-coverage" '] CODE_COVERAGE_RULES_CAPTURE="$CODE_COVERAGE_RULES_CHECK" CODE_COVERAGE_RULES_CLEAN='' ]) [CODE_COVERAGE_RULES=' # Code coverage # # Optional: # - CODE_COVERAGE_DIRECTORY: Top-level directory for code coverage reporting. # Multiple directories may be specified, separated by whitespace. # (Default: $(top_builddir)) # - CODE_COVERAGE_OUTPUT_FILE: Filename and path for the .info file generated # by lcov for code coverage. (Default: # $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info) # - CODE_COVERAGE_OUTPUT_DIRECTORY: Directory for generated code coverage # reports to be created. (Default: # $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage) # - CODE_COVERAGE_BRANCH_COVERAGE: Set to 1 to enforce branch coverage, # set to 0 to disable it and leave empty to stay with the default. # (Default: empty) # - CODE_COVERAGE_LCOV_SHOPTS_DEFAULT: Extra options shared between both lcov # instances. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE) # - CODE_COVERAGE_LCOV_SHOPTS: Extra options to shared between both lcov # instances. (Default: $CODE_COVERAGE_LCOV_SHOPTS_DEFAULT) # - CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH: --gcov-tool pathtogcov # - CODE_COVERAGE_LCOV_OPTIONS_DEFAULT: Extra options to pass to the # collecting lcov instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH) # - CODE_COVERAGE_LCOV_OPTIONS: Extra options to pass to the collecting lcov # instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_DEFAULT) # - CODE_COVERAGE_LCOV_RMOPTS_DEFAULT: Extra options to pass to the filtering # lcov instance. (Default: empty) # - CODE_COVERAGE_LCOV_RMOPTS: Extra options to pass to the filtering lcov # instance. (Default: $CODE_COVERAGE_LCOV_RMOPTS_DEFAULT) # - CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT: Extra options to pass to the # genhtml instance. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE) # - CODE_COVERAGE_GENHTML_OPTIONS: Extra options to pass to the genhtml # instance. (Default: $CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT) # - CODE_COVERAGE_IGNORE_PATTERN: Extra glob pattern of files to ignore # # The generated report will be titled using the $(PACKAGE_NAME) and # $(PACKAGE_VERSION). In order to add the current git hash to the title, # use the git-version-gen script, available online. # Optional variables CODE_COVERAGE_DIRECTORY ?= $(top_builddir) CODE_COVERAGE_OUTPUT_FILE ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info CODE_COVERAGE_OUTPUT_DIRECTORY ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage CODE_COVERAGE_BRANCH_COVERAGE ?= CODE_COVERAGE_LCOV_SHOPTS_DEFAULT ?= $(if $(CODE_COVERAGE_BRANCH_COVERAGE),\ --rc lcov_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE)) CODE_COVERAGE_LCOV_SHOPTS ?= $(CODE_COVERAGE_LCOV_SHOPTS_DEFAULT) CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH ?= --gcov-tool "$(GCOV)" CODE_COVERAGE_LCOV_OPTIONS_DEFAULT ?= $(CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH) CODE_COVERAGE_LCOV_OPTIONS ?= $(CODE_COVERAGE_LCOV_OPTIONS_DEFAULT) CODE_COVERAGE_LCOV_RMOPTS_DEFAULT ?= CODE_COVERAGE_LCOV_RMOPTS ?= $(CODE_COVERAGE_LCOV_RMOPTS_DEFAULT) CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT ?=\ $(if $(CODE_COVERAGE_BRANCH_COVERAGE),\ --rc genhtml_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE)) CODE_COVERAGE_GENHTML_OPTIONS ?= $(CODE_COVERAGE_GENHTML_OPTIONS_DEFAULTS) CODE_COVERAGE_IGNORE_PATTERN ?= code_coverage_v_lcov_cap = $(code_coverage_v_lcov_cap_$(V)) code_coverage_v_lcov_cap_ = $(code_coverage_v_lcov_cap_$(AM_DEFAULT_VERBOSITY)) code_coverage_v_lcov_cap_0 = @echo " LCOV --capture"\ $(CODE_COVERAGE_OUTPUT_FILE); code_coverage_v_lcov_ign = $(code_coverage_v_lcov_ign_$(V)) code_coverage_v_lcov_ign_ = $(code_coverage_v_lcov_ign_$(AM_DEFAULT_VERBOSITY)) code_coverage_v_lcov_ign_0 = @echo " LCOV --remove /tmp/*"\ $(CODE_COVERAGE_IGNORE_PATTERN); code_coverage_v_genhtml = $(code_coverage_v_genhtml_$(V)) code_coverage_v_genhtml_ = $(code_coverage_v_genhtml_$(AM_DEFAULT_VERBOSITY)) code_coverage_v_genhtml_0 = @echo " GEN " $(CODE_COVERAGE_OUTPUT_DIRECTORY); code_coverage_quiet = $(code_coverage_quiet_$(V)) code_coverage_quiet_ = $(code_coverage_quiet_$(AM_DEFAULT_VERBOSITY)) code_coverage_quiet_0 = --quiet # sanitizes the test-name: replaces with underscores: dashes and dots code_coverage_sanitize = $(subst -,_,$(subst .,_,$(1))) # Use recursive makes in order to ignore errors during check check-code-coverage:'"$CODE_COVERAGE_RULES_CHECK"' # Capture code coverage data code-coverage-capture: code-coverage-capture-hook'"$CODE_COVERAGE_RULES_CAPTURE"' # Hook rule executed before code-coverage-capture, overridable by the user code-coverage-capture-hook: '"$CODE_COVERAGE_RULES_CLEAN"' GITIGNOREFILES ?= GITIGNOREFILES += $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_DIRECTORY) A''M_DISTCHECK_CONFIGURE_FLAGS ?= A''M_DISTCHECK_CONFIGURE_FLAGS += --disable-code-coverage .PHONY: check-code-coverage code-coverage-capture code-coverage-capture-hook code-coverage-clean '] AC_SUBST([CODE_COVERAGE_RULES]) m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([CODE_COVERAGE_RULES])]) ]) libseccomp-2.5.4/LICENSE0000644000000000000000000005755414467535324013402 0ustar rootroot GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. libseccomp-2.5.4/.git/0000755000000000000000000000000014467535325013217 5ustar rootrootlibseccomp-2.5.4/.git/index0000644000000000000000000007432414467535325014263 0ustar rootrootDIRCJd޺:d޺:(6Uߺx _Y,g .github/actions/setup/action.ymld޺:d޺:(7Cq -$I 4.github/dependabot.ymld޺:d޺:(9W/( )ɽNb%.github/workflows/codeql-analysis.ymld޺:d޺:(: *>'9!Q}4,gj-,.github/workflows/continuous-integration.ymld޺:d޺:(;'xϯqۆ>t8 .gitignored޺:d޺:(<lgc*{P/ 5 7Ya&f:CONTRIBUTING.mdd޺:d޺:(? !N ?2tCREDITSd޺:d޺:(@_lOs@2!Ϥh,LICENSEd޺:d޺:(A kX8,jgjic( Makefile.amd޺:d޺:(BJ syQ README.mdd޺:d޺:(C *X˜]S&REjDG SECURITY.mdd޺:d޺:(D#"gy2wx^ autogen.shd޺; d޺; (E!YW?! σ configure.acd޺; d޺; (Gg. ڍ2Y\K8j_doc/Makefile.amd޺; d޺; (Iw-R%Y>doc/admin/MAINTAINER_PROCESS.mdd޺; d޺; (J oq㔫A isFEdoc/admin/RELEASE_PROCESS.mdd޺; d޺; (Kcau/a Kwdoc/credits_updaterd޺; d޺; (N 7++ Huv!sE[e doc/man/man1/scmp_sys_resolver.1d޺; d޺; (PTe T:mCEjdoc/man/man3/seccomp_api_get.3d޺; d޺; (Qno)-K7{#doc/man/man3/seccomp_api_set.3d޺; d޺; (Rs2̨ ǔ|}Cӥ-scdoc/man/man3/seccomp_arch_add.3d޺; d޺; (S&W[2=43K|!doc/man/man3/seccomp_arch_exist.3d޺; d޺; (T&W[2=43K|"doc/man/man3/seccomp_arch_native.3d޺; d޺; (U&W[2=43K|"doc/man/man3/seccomp_arch_remove.3d޺; d޺; (V&W[2=43K|(doc/man/man3/seccomp_arch_resolve_name.3d޺; d޺; (W[a_AUdoc/man/man3/seccomp_attr_get.3d޺; d޺; (XWǟ'pف2QSdoc/man/man3/seccomp_attr_set.3d޺; d޺; (Y8ZL-;4@?Vm!doc/man/man3/seccomp_export_bpf.3d޺; d޺; (ZEĚ2'l$>nŽj3%doc/man/man3/seccomp_export_bpf_mem.3d޺; d޺; ([EĚ2'l$>nŽj3!doc/man/man3/seccomp_export_pfc.3d޺; d޺; (\hb$Η@jJ2Nw<doc/man/man3/seccomp_init.3d޺; d޺; (]>\/CVģ*_doc/man/man3/seccomp_load.3d޺; d޺; (^5#Nwdoc/man/man3/seccomp_merge.3d޺; d޺; (_oH ,U/oo*#doc/man/man3/seccomp_notify_alloc.3d޺; d޺; (` ~Crz\U doc/man/man3/seccomp_notify_fd.3d޺; d޺; (a ~Crz\U"doc/man/man3/seccomp_notify_free.3d޺; d޺; (b ~Crz\U&doc/man/man3/seccomp_notify_id_valid.3d޺; d޺; (c ~Crz\U%doc/man/man3/seccomp_notify_receive.3d޺; d޺; (d ~Crz\U%doc/man/man3/seccomp_notify_respond.3d޺; d޺; (e +Э(wzX)7K!doc/man/man3/seccomp_precompute.3d޺; d޺; (f }8s;7)؄&]kdoc/man/man3/seccomp_release.3d޺; d޺; (goUU*b>}edoc/man/man3/seccomp_reset.3d޺; d޺; (h9U,ʕ2` zdoc/man/man3/seccomp_rule_add.3d޺; d޺; (iSqNs;2udţ;$t%doc/man/man3/seccomp_rule_add_array.3d޺; d޺; (jSqNs;2udţ;$t%doc/man/man3/seccomp_rule_add_exact.3d޺; d޺; (kSqNs;2udţ;$t+doc/man/man3/seccomp_rule_add_exact_array.3d޺; d޺; (l#V!\IEOh]'doc/man/man3/seccomp_syscall_priority.3d޺; d޺; (m<x?˰W^%QW +doc/man/man3/seccomp_syscall_resolve_name.3d޺; d޺; (n(G/"V0,p0doc/man/man3/seccomp_syscall_resolve_name_arch.3d޺; d޺; (o(G/"V0,p3doc/man/man3/seccomp_syscall_resolve_name_rewrite.3d޺; d޺; (p(G/"V0,p/doc/man/man3/seccomp_syscall_resolve_num_arch.3d޺; d޺; (q x4c,B4hvdXdoc/man/man3/seccomp_version.3d޺; d޺; (s W%Pa Y|include/.gitignored޺; d޺; (tٖ[s>NGMSAKinclude/Makefile.amd޺; d޺; (uҔ5%fPSwA`9include/seccomp-syscalls.hd޺; d޺; (vj@AY ֠6include/seccomp.h.ind޺; d޺; (wɴ?{ M'q*^#libseccomp.pc.ind޺; d޺; (y.;WF [dum4/ax_code_coverage.m4d޺; d޺; ({=Vku2{U-24< /src/.gitignored޺; d޺; (| G}cEV?֍src/Makefile.amd޺; d޺; (}Y۸^;ͫb}QS src/api.cd޺; d޺; (~F,t ckf̅ז`src/arch-aarch64.cd޺; d޺; (jw@$N#src/arch-aarch64.hd޺;]d޺;](ۀ 3jR΀}Z:~src/arch-arm.cd޺;]d޺;](ہH4+6 7esrc/arch-arm.hd޺;]d޺;](ۂ[J!5 0ˑwhsrc/arch-gperf-generated޺;]d޺;](ۃ>h Mn src/arch-loongarch64.cd޺;]d޺;](ۄJj5$PC 6x'psrc/arch-loongarch64.hd޺;]d޺;](ۅC}fHEhȡU}Hsrc/arch-m68k.cd޺;]d޺;](ۆ3eGșŽWN src/arch-m68k.hd޺;]d޺;](ۇ DTS܌3LZ+ϦUsrc/arch-mips.cd޺;]d޺;](ۈou*  "x src/arch-mips.hd޺;]d޺;](ۉ ق]%Ǔ2F5, src/arch-mips64.cd޺;]d޺;](ۊk꺀3Yrƞwsrc/arch-mips64.hd޺;]d޺;](ۋ ^)Z?n4src/arch-mips64n32.cd޺;]d޺;](یuFN`xi;!.Osrc/arch-mips64n32.hd޺;]d޺;](ۍWEʴAosrc/arch-parisc.cd޺;]d޺;](ێ, -ؐxEV src/arch-parisc.hd޺;]d޺;](ۏ7*P7qzĖsrc/arch-parisc64.cd޺;]d޺;](ې2~ȉ|xFsrc/arch-parisc64.hd޺;]d޺;](ۑs1. B9q-XwE>{5_Jsrc/arch-ppc.cd޺;]d޺;](ےnj3 ۋt1src/arch-ppc.hd޺;]d޺;](ۓجA#jIaةX&}4  src/system.hd޺d޺(ۿ5n̈́k~btjtests/.gitignored޺d޺(tUSau[ZΞŒ{ tests/01-sim-allow.cd޺d޺(b̈́7QlO-jtests/01-sim-allow.pyd޺d޺(tiDgiD֖M{tests/01-sim-allow.testsd޺d޺(a>Jù:tests/02-sim-basic.cd޺d޺(+)TD>bטGHŢtests/02-sim-basic.pyd޺d޺(Y61=l'tests/02-sim-basic.testsd޺d޺("d22 K,]8F J[tests/03-sim-basic_chains.cd޺d޺(@75:!~lsp'tests/03-sim-basic_chains.pyd޺d޺(Ny6hH 31=tests/03-sim-basic_chains.testsd޺d޺( SC6Y tests/04-sim-multilevel_chains.cd޺d޺(Vz+ ԗ^ALuE!tests/04-sim-multilevel_chains.pyd޺d޺("X)7Y o;{$tests/04-sim-multilevel_chains.testsd޺d޺(c@HIX.C6 tests/05-sim-long_jumps.cd޺d޺(m]C;MΰU!Qtests/05-sim-long_jumps.pyd޺d޺(ݣ? އs ytests/05-sim-long_jumps.testsd޺d޺($Vک\. vOtests/06-sim-actions.cd޺d޺( ϽOG2m|Dtests/06-sim-actions.pyd޺d޺(J ÅmKEQsztests/06-sim-actions.testsd޺d޺(_} !Btests/07-sim-db_bug_looping.cd޺d޺(<_Nsh' 3utests/07-sim-db_bug_looping.pyd޺d޺(jUp;bR,%OE)ye!tests/07-sim-db_bug_looping.testsd޺d޺(5I=lU+~g?Ӻtests/08-sim-subtree_checks.cd޺d޺(Ln)^.!tests/08-sim-subtree_checks.testsd޺d޺(6'Tz[]X#76#tests/09-sim-syscall_priority_pre.cd޺d޺([+ a2*5$tests/09-sim-syscall_priority_pre.pyd޺d޺(|'On@V'tests/09-sim-syscall_priority_pre.testsd޺d޺(6HȨCIq&sf$tests/10-sim-syscall_priority_post.cd޺d޺([)-Hpǝ|//c%tests/10-sim-syscall_priority_post.pyd޺d޺()1K z0Γ.(tests/10-sim-syscall_priority_post.testsd޺d޺(|(rTZnY_tests/11-basic-basic_errors.cd޺d޺( $|#7.ftests/11-basic-basic_errors.pyd޺d޺(59/`U?ǔGG&9!tests/11-basic-basic_errors.testsd޺d޺(qVf(2Uo"1/tests/12-sim-basic_masked_ops.cd޺d޺(Hc>xb{׼鞜 tests/12-sim-basic_masked_ops.pyd޺= d޺= (uf yiPDq1?ҨCj#tests/12-sim-basic_masked_ops.testsd޺= d޺= ( ;K2$k,Otests/13-basic-attrs.cd޺= d޺= ( Iv}UfsJtests/13-basic-attrs.pyd޺= d޺= ("x|DTV]T;"G \%tests/13-basic-attrs.testsd޺= d޺= (=V?5P tests/14-sim-reset.cd޺= d޺= (`fFw%!tests/23-sim-arch_all_le_basic.pyd޺= d޺= (^B1 XspƪE |$tests/23-sim-arch_all_le_basic.testsd޺= d޺= (FP1+z@f}o3tests/24-live-arg_allow.cd޺= d޺= (B8naTpoxtests/24-live-arg_allow.pyd޺= d޺= (][MPQ!؀!+ tests/24-live-arg_allow.testsd޺= d޺= (GZT6ޱD'b"$tests/25-sim-multilevel_chains_adv.cd޺= d޺= ( &W鯝`pe8Jsm@%tests/25-sim-multilevel_chains_adv.pyd޺= d޺= ( JBuܘw:j@X(tests/25-sim-multilevel_chains_adv.testsd޺= d޺= ( +m p* tests/26-sim-arch_all_be_basic.cd޺= d޺= ( Z*Qʹql݇T !tests/26-sim-arch_all_be_basic.pyd޺= d޺= ( ^aHEWsvQ$tests/26-sim-arch_all_be_basic.testsd޺= d޺= ( -o&wfbᬍIfztests/27-sim-bpf_blk_state.cd޺= d޺= (Yg.:ayzaԕ5tests/27-sim-bpf_blk_state.pyd޺= d޺= (P"~эw(v tests/27-sim-bpf_blk_state.testsd޺= d޺= (c4$DE"`h7tests/28-sim-arch_x86.cd޺= d޺= ("3Yo؏ vc+ tests/28-sim-arch_x86.pyd޺= d޺= (b裍 PkBh.tests/28-sim-arch_x86.testsd޺= d޺= (-A oQ!6tests/29-sim-pseudo_syscall.cd޺= d޺= (׫3'd,犹DT+tests/29-sim-pseudo_syscall.pyd޺= d޺= (E'dGmqnYJ!tests/29-sim-pseudo_syscall.testsd޺= d޺= ( !c8 vQpn\ 9FEctests/30-sim-socket_syscalls.cd޺= d޺= (5uJy59UFr7ޙtests/30-sim-socket_syscalls.pyd޺= d޺= ( IXöiI}/&C4;"tests/30-sim-socket_syscalls.testsd޺= d޺= (4/ff=vZGp'_ntests/31-basic-version_check.cd޺= d޺= (XqnȒtXDCtests/31-basic-version_check.pyd޺= d޺= (h#+KqC_BPH"tests/31-basic-version_check.testsd޺= d޺= (&%|2 )rm~tests/32-live-tsync_allow.cd޺= d޺= (ڍLU"U@ڡ}73etests/32-live-tsync_allow.pyd޺= d޺= (.;җJXytests/32-live-tsync_allow.testsd޺= d޺= ( pw5b1sWݨ˾!tests/33-sim-socket_syscalls_be.cd޺= d޺= (!*bO4hbBkԙx"etests/34-sim-basic_denylist.cd޺= d޺= ($<$u3nN4tests/34-sim-basic_denylist.pyd޺= d޺= (%qu8G\<7h={{!tests/34-sim-basic_denylist.testsd޺= d޺= (&kRٳaG'-Oeoe^| atests/42-sim-adv_chains.testsd޺zd޺z(?N$`cc8 irtests/43-sim-a2_order.cd޺zd޺z(@|M~W٭FpT tests/43-sim-a2_order.pyd޺zd޺z(A gD';Xg%#v7tests/43-sim-a2_order.testsd޺zd޺z(B,JCdw[vʍUtests/44-live-a2_order.cd޺zd޺z(C Kjn괥*'Z75 =q;ctests/46-sim-kill_process.testsd޺zd޺z(K ,GՃ2|H:H=̀tests/47-live-kill_process.cd޺zd޺z(Lb|^}Ntests/47-live-kill_process.pyd޺zd޺z(MOXK*Kv)REw tests/47-live-kill_process.testsd޺zd޺z(N-QVpDzs mvQtests/48-sim-32b_args.cd޺zd޺z(OHlHe[δ: Xtests/48-sim-32b_args.pyd޺zd޺z(PfkzO[&ʚPOtests/48-sim-32b_args.testsd޺zd޺z(Q86Jgݓ;KśKW<tests/49-sim-64b_comparisons.cd޺zd޺z(RLޥ4i/nItests/49-sim-64b_comparisons.pyd޺zd޺z(S=_fw&4zy"tests/49-sim-64b_comparisons.testsd޺zd޺z(T M$롑 &gw!1tests/50-sim-hash_collision.cd޺zd޺z(Ute9jK*&2 tests/50-sim-hash_collision.pyd޺zd޺z(V?oM^s?$!xeW!tests/50-sim-hash_collision.testsd޺zd޺z(W OHGرA$` xv!tests/51-live-user_notification.cd޺zd޺z(XH4ILCfDG/%,0"tests/51-live-user_notification.pyd޺zd޺z(YL^EZ _UB'¬7%tests/51-live-user_notification.testsd޺zd޺z(Z"<e1]ftests/52-basic-load.cd޺zd޺z([C9 y_9tests/52-basic-load.pyd޺zd޺z(\Q-;F{JPswiztests/52-basic-load.testsd޺zd޺z(]w%-uE=;Otests/53-sim-binary_tree.cd޺zd޺z(^ڌځM0H0NA>4tests/53-sim-binary_tree.pyd޺zd޺z(_֙2*_ <*,tests/53-sim-binary_tree.testsd޺zd޺z(`  %ה:Y]uCtests/54-live-binary_tree.cd޺zd޺z(a+8jD"ܦah<Ttests/54-live-binary_tree.pyd޺zd޺z(bcW^uTK29DDtests/54-live-binary_tree.testsd޺zd޺z(c o .@@{xpK tests/55-basic-pfc_binary_tree.cd޺zd޺z(d%@3TH9wI'wv"tests/55-basic-pfc_binary_tree.pfcd޺zd޺z(e,i=Wq!tests/55-basic-pfc_binary_tree.shd޺zd޺z(fiC곥yK_Z$tests/55-basic-pfc_binary_tree.testsd޺zd޺z(gtlֹ]UG!tests/56-basic-iterate_syscalls.cd޺zd޺z(h֝ Yyr;1"tests/56-basic-iterate_syscalls.pyd޺zd޺z(iԨD*5IZ vPA%tests/56-basic-iterate_syscalls.testsd޺zd޺z(jBHǪKXp`S#F}tests/60-sim-precompute.pyd޺d޺(u"/ fGbgtests/60-sim-precompute.testsd޺d޺(v|z`D竄tests/Makefile.amd޺d޺(w~#S]Gy tests/miniseq.cd޺d޺(x}塾W^w~tpu&qLtests/regressiond޺d޺(y |uK25?skj\tests/testdiffd޺d޺(z/Z&/EX tests/testgend޺d޺({/x'J]7l tests/util.cd޺d޺(|W,/uJwC0+D tests/util.hd޺d޺(} ֖A*dhSϰD tests/util.pyd޺d޺(~jWo*dVP:(tests/valgrind_test.suppd޺d޺(܀OcmU4KOfl0Mؒtools/.gitignored޺d޺(܁T:<Ը^atools/Makefile.amd޺d޺(܂  D oP1xvɷ~ tools/bpf.hd޺d޺(܃8jWlQbHtjatools/check-syntaxd޺d޺(܄{|a^WCtools/scmp_api_level.cd޺d޺(܅ aEk,ūcڴNtools/scmp_app_inspectord޺d޺(܆ f:5ε6tools/scmp_arch_detect.cd޺d޺(܇2Erew&#Uڛtools/scmp_bpf_disasm.cd޺d޺(܈#FI<5Ry<jtools/scmp_bpf_sim.cd޺d޺(܉ۛLf EjN}Ctools/scmp_sys_resolver.cd޺d޺(܊o9Ǒ'zhN LxeF- tools/util.cd޺d޺(܋ B$j'wb tools/util.hTREE330 7 [1S-rêɞ/ǟ !m41 0 :y 7%`/q}0>[Zdoc39 2 DSQ)أybHman35 2 ә9KaL'sman11 0 ~B4 )te4man334 0 \W9svdK~(tTadmin2 0 /ŴTBjm7OqK7src66 1 P wkpӎ3 1X5python5 0 LY)ޠn=6E/aBH[ (xdEnO$8bYҫR&~uNЋRP3Zɹfq1[}V`sr[2KjC]e;ڐN< ڇ FG]ŕvpY@?^_{(IϟgM-e?֨;+32p(oG"OnL:&tv&xOo |QNa-c ƫUQ9Dܣ6YX6oVs1{yCNѵƺ\1y%ழM8*R6"GC^Hun\%\]mE2\cfx nm[aǓ_C|r)WU sf0i09 OYÌ,s>#,d:=[` (She T U2h)5D/WItnWA]}e~)jAK0kK8NRSDu7ZY.~l2oGr4;ٍ=%F?}3aJ<?7DǢcxŴɸ(5U4<5<4"<)2Ȑ (5oXcVSĩ@WbNBQjNjbqBĿYxAN0~~ xv k黎ʸ~O<q9 a #\v'K"+7t~PB&$B$ yTHr0|kmpZ-?z-j|]F`nֻ`=ܮ] /,Y9lPeH?nO`+x 0 P!!&=sD"I]JG,T \'Hͽk9*ﯾX dCk,o ,9Ź"#A|c!z%xMn!1M:VdK%ОC8&T^WHѭj5~(jd=4Am݉# }_&9vZaT3]#TRuKD-p3Gx3s$]J};5phT vR9m(}Bt5$~Cm0 8 tNLxu$-ċ+,!pb7Hx-0halxDrY8 -(9苁4BxbHfp)jJD&+Ά$Ŕ8јl.vڿG>,H b?##mf?owqr7 \})3 ux ν 0@a);wcH A9(YO~VVHF D <b$sB\ڽ:S.^53$@Gܑ⫿1~2N˼nnS4;TaEdj5Dr`+ɺ"\?zO3xAk1VM2"E`+襧%&]j6F m 3LF -<(rSfT`k^yҚm@hZ)P"/4:8*mPVV|0̎2R-%v-RD=R-#笪/2lxuJ`~:xXj&'wKaZoj׽ߠc5l%\8wyx?Dq1HЮYwV̮/VVK* n|)N4i|]h(sݏ )#WK4!)3u!b?'}' x0 ;e ٲ%KP#ߥ0 >Amx|FE$I 9[DT 5cHCXI%ǭ gIcV5ׅ}׭ZM{7e}5AC*X (,x!Mn02B&xQMk0W ˲-9,a{+@!4Z"IGT ^Fhއr":IFXaۉ#p87vb'ͭy_V0Yi$e7 [0<; ^(ivy٧qDiu6(i˹}ZThe7Vr eFy\qv.@սQ[?C{]\)٘ 3p'( 3ml"JJèh(UR8xp3pNcvsj^Tj=_쫾=|Kc ry:DŽz}YA,sʍED֦1cMưYHGswNӼ.8kx;IhdB"iy{4+xQˎ }L f5fnDY[c p`FK ]E*G"TI$j%t^jkKي N4$-֪{}kLiιmk2"\ <pN}I[GѺ54KΙ /NSVjo3>0c!sᵺvg[wGr{ڀ{+3xM^^H߳5AxSn0+IX #pM&E$XK@Rv]Jr3Β"B!*RLReiGaϢ8YnQ{*$NR2QQ1f(2CG |h~o EV:0 CFhievH#Be{Xp''yׁ{1v 0) n?;hoidڡwpI(;] (U$5$[%[E) yРFK\CpϧQYCIi @y8w`; #v~ӵ~ gMNF" 5[Ɔ{EaM-ys$D-Zޭ{)Z*3%ـ{qΆ|Q(?|rhD g✥H6M]Y!pqKF # vv2mvG @w"+^nfPI loo7wn˳ W||cB t.!@*Yg O޾(NAR6E<=]9%<梭 #&w$F4DODSD#C5S\tp`A/i]#˶Oy,NXn'zi0@cWܟi'臢?]{/voc"1_NҀ~);~m)LQKmMQZVhzH'__ V2xU]o6|طڅ?K:Sc mAZHU$}YJg'-p8Hwwfg3Us.onEok,fo6zQeStq4 ]UWf7b*WeY6Y/(Lw~O:ӻww•{b.ֳ ]Vjgc^|SLJ-yhHqǔ׆hktQSca- .O1ںmNؠ`%$"]H6JX5;2!{qKѓmul]lR Sizփx ޅ+/_cr:26@{o`C8ycoCU+DƠ~X@"Rc[Ѣv|ԟi6儈?Ť@/LƻߢҮ&+߶4q-49ރA"yBr< )DrARgFQ_!߳ ~ƍRnڄ-T4aFFx:&3ꙝyKNuZ`nC{]!PydjYBPg9I^FBz[́Y4SJ=`6;P8Z$0:duH& rl@>F݊O1 1k?NhQ8j⫼A8Js$_I) z`RSCAV5 N%, an{I+l8ӹ =!(EUԠ:Z{+FeB樸xRk@ef;D? Y,tfHUq3d , N baC:C({#E l9'{5okC>`N+}q>[gCcMo6~H:Bq~]}G䮹lyRhpKsl:y.,]a^ݛ> {ҲMow0iO}F&G Πh[rjx5qb)ڔzL6;RcFxOk@)\Bʲ%[!->KOaY]설Pڃ5ޛߠ艠ږe^/6vU*UWsYѣ'MU9[aeDgT֋,p,eA9!v yߦĤT:fE,|U0Y&jT˲ȫ+"a֬rap( l3M.VIY!,_j @8H抋 ;ر<*/+"V@'0@t4 #5ZT# _gⶎ-)%;YCC^q~} ة=F6 { cѻZ+ٜ7g^جw:;;Ow_֜`o[ 0OqNڎby>URg \;ڵtH).F*o7/ tnWˠ~ 4Db |)&<1k)&bP+ay;fR`B7љiw~u>}tbv;\ێ]Ho ~x ı0  ."K:.Dž|Yك=Xun, )83$D&6Sf-8W>*Yb-4dqL۞!sw9MmC]yB18$B}FRʨJ 3&xKj1D:E_`mI_ i%(r 'xūE$kC5X9;M,8 Tcfm@8DŽ)bEF8vR gux .u}3 0,&դu ޓuUܶ#t$~ |oպ㟷eUxxMN0>Ż@*vU 肂_q%PoOf43ҧ<"Śi2p2WF3(eȴ׊1oBCkdYq^YD+ܤKJ#nX~"ƧxLYZ@A%dic3-)eV o, O[2~x<Oցosk{ Eu)ExSt`S4O8hB:K6t(xIn0 E:/@5APdM(nJ!+I}:|#-D`#(ਕNYjU ikZi6cBB*{#vaP^#7yzNxs!8[>G`rz^.e P+2uY-x cWR1F'.{Zfgo캇לPsڝc.[ަeU}HdtNxn0 y 4BBUU=2i&15`]~v.ٿv$SIBglQueXRcZS+U+1DC)k-z۲E+ i\ UUu pq5D$=lF}ҧ7%#skbmickBmccDqfq*2*l :FnT+"Va*}Zz2ie?US:.1Ps4s-ZpY!# SkvSeqT 3c1'~|P~~o^v;(9R8Kbŷ矀"1evplr`ll6 I[QheE m]0W$cd65ryA-1ڞ C1Xuu-ЀS]Pm=#cӆ@ Nv) Cl<ⵐMD6 Nt0(Tv/`_E5&Vʉ>!~xU]o6|طڅ}FO } (juGD}f)AБٙY*fݘ[U3㵹a]Yi^3[UDlZOy-WbZ\j KNh6%Adi<t%#H*]cIRlhǒoqKɓmu,65wu ѻx~Ea7e㰎g>S=>F[JTm:r&5-Z/؎3@lsIHg~0 5f2%v5YX۴ Dؖ49ޣOטb @9)O@D 87 *6= Zh]mmg(&ᨢ932. mdqR=2O~I踕t=|z[oK1=/(<`2v_!(HbpR=\F QO_>~<_-&{0 'FGC lԭ Äv^VQ_Sd7 eϽ$_S1~ΒVpsyA6{!(EUԠ:Z‹=2gsT\?Pv9q! ATa"  "@c3$*8`2(  YX8>5)5v䤊sa PFpmm, [Ќd]`h"ͦ313pS6>M&ȕ|k&-'8]N#]V;zgs.tz0>﮶{ߴO}MS kˍx;n {N.` 0*J}r[1fH}3 аUVe)5] ˢ )BJܱ16'M9w%-9 RI٢ ϱ­:Z_zmiZ}e.aNJu_8X?vqz6m88O)}_8?|eKxKN1>E_`F=B \mGɂ Uot`m+!/j+]p 3w9 F:csJ)2艣 ZV[p3Zu:OS9&tJq Avp9gcx8?^PǾlf$yjL{ǚb$x1o0 w -GAP[(v.(: $Ò޿/}=tnz"?=2ÑMGfݝ4[gQhkjSjQS4ڱy;PQ)=Gx^sXsP`wV5Z۶4=aeCHK8C9yv5KH/xJRT2m Đd'0D䑈KzpK,~zws&(ᔂ`ڢ!݉ D"q\1UU29#HBF;Vsؗ>(M>fd{~,՗{ 9Eh.i (R#xJ1y~:,"z|Nх3o,xKQQ3pL:gc *>E)XdNF;ˬe ƒ]@4K,2GmJ O6u7K0\x 0A{zV9?i =>_:Cُ4>hǽvz?sj)C>%~&]4+xQj0+ŎdB B/BdyHݿlnK{yͼGa+ny(F7Gm-t%jجNTtJZbϏط`97KvXBcLp4ix9&m<L iP]U-뚕lpD^<|1!<%~^*_ܶpE2L\f#ݤSV?V*cB˫V; C|Ǽ1'M} -e@= _ Z+=̳ZNHqڧdebѱd޿jr_֦xa{qۛ1hΙn-95tUV]~\>Zʐ?oUxuYVsK#s1:hd(*$f($X$YXX%'[ir9GxYj0Du6 !H V [ŃGUۘd=R"P\)LJ QivE|Q9$B->WlA˲1\׳>FA4IRtZУOW=88Bކoۇ^v[B|_3nK˟:cxAj0E:\e4gJBiz4j qd\y7K7ǃo3c9 eaT c),%頙>EW4Ţ,H$*Dј(Hcˡ Nv+vZWrtMܥ:߃cDwԚem]kےt6rWKCYRxKj0D:E3\ Q*TT@TjEY{Dq8 n+@ |oF/DJ%GdYh ʭ\%U-ra* dTV`PF DC(8k9v>@<T|Sus P^1䲒(HR]#8 zLR2wRTL$%Wp./la_Ͷ7OzwؽC?:y14Ƽ$ >L;yR'oL-85𜐗4ɼYgDߩb!0ϒ4xRn0+XaA{h5HN#[H\r!83YEYuWIQ&ʰZgiXHQm[2J4m ̚j8"V3{c5t]pq۫EN:s -n^ -elP€ 4vto5G [~=! c(|<4vk7jßPIȀeTpѿ0sg2nͺj4~Bx̑~Z=% /k}pb'4(A?t%y /b_gH/(OnG; +8+UG]dڏ7/@3OkF8lWbb^W.c8$xQN0+RqJ<&U* &V8=N`yW33PRbHI.\Vnk%2Je&t4.gMYEvݨB7U$epup<9;`8!lZCSp"/sQA%,v9ó`;nai|qeUBDn,~ t>` Nu3.;F#d0` /7_DL~poZ7C*;ՊsxEPYC֒y JTqV#uȎ9e`FjuҜ7>02xRn0+bC/KtiEkrȥET"rߕi{h/EΌH$]mwMԺ֕]V{,U)۲hT/f(#7,jY m[շ+Tg4a&EPmJazn&d-KmQ>F8<§"eL+i0W&JpلM:'1@BrΫxZXHB*GOq р RĔGRćGndWaVi <*bŅxuxX` YieR,?iG ZQ8Ju8%m6Ǐ 6QmW3F{9_pG᝝պR;t|ƷWO/)P(PöGl2vޑ:91pྡm4/>`Wo>]$[M!U'j@WCԣR+܃cXJN{ wp@nmަ{48BVBz dS=,Nn%߰лStc_5;dOyϓ1xRn0+,ղ%J )Т=1UĄ >ﻲ"%pV=u]c]۪nly.;j W+Yj-i U#Պ*ךjYr]ʶ!lZMQu{a4_u h!W,F.KȖr)#ya9O9~;-0]̺ʆ]VhnAY;A1B8B:^Mg^&SGHl4{,`'2WFzH~~{|<14t`i!}|Ec?h&c#3Y.M{\ɌO֜c%(sgOy#kEB{~m6yn5m \9.+#qr IAa V|0O:s]Eܩ&n _6 y?Σ_I1!xOK0Q[?VQDPxqiM'64I]*/B23y2'fȵ%k*T]qA{FiE(Re H4HYW{. 55d-jZY64OxǝlLŲRȴw'kN"UƖv-oVhOAmˇ[=?PCN'Ocbn@CGkb :΀mgjg^D LO8tVw8PXĭa~:3!>5F7>xgC~HKǣ^nWSlY.뾳 ?%6yH7mJ'xQN0}WƉ6vJ OhU2NM J}9HVXo JMբny)=JaØuGqˤe5e)VnZ)۲jHxT?*:b-dtUc%hM)nLay9KXMKcò֝Dzw3yD@У=A$3%} dMPp?ѥQ_nZ2y =1NVFl篛 `t1.YgÚBCsE[I,֋2?s1)l+e|$ėja4ErZyaڼf[&%ul%Nu^k?xKN0D>E_ mb`1&&8 nOFbR7fQfKWE,4ƌ{c'A4TЏXiGr`1 ـ%YaSm km n2,.r ez=t|99t>1+\.yNE;3;uXE)K*[j*jsГjBR:k̲Ljc<Yt?(ڤ˃ʻPqHȇڨt1FΫFs¼]`]L{Tퟴ1HkCG2D+&a&7tv\@-o}T8蝙 q&N!_{; NP4ZiۻO̼i$g^8/Mt{;:%'>"lT^y̅IS{[v1&gDjF'%}Qgٸ uduFx<{wI\T78Bx;o0 w @G֥@vdrؖC}6{>ՂQ ,eV+- }pR0  .(7!h* 2h0Z(IB$Bo m am>.BctTRJ:V:,״u+ KšRZ# <À˹'7|z&%\1v>ᵹ|z8<.딋o49ꯪt##xMN0 F9I6#@l !iN#J\ `c%߳>sB%u{)Wu2]%SLmd3j%02 rFwsuZAFuҦ]ywv(!/}]Hmd4mJn7+hgF.)EF7x&&(fqBmx|,p eD !)Bēelm+˲>DdOBo3woH|[Jn׿$ ,3d2jxO4o.œxAn Eb.lc tMJb+(Vio74U"2VycZKhiHҩ(C7dbTF,X40$;(鑴L'ozi14* zm m?.>p>ֹ^;`')Fu]I7tWDXM˂ϹMP@H05cw\~z\gn|))X5fvjxn G,ʐ Ԕuw:9K 6%K⡽{JJY]imAvګ<YIU1-c'u%n{33LWCv|܎>M{qP57+ xJ06& @ąIiSaoo:ЛpΟ4Rsuk5Q%VU8PH MQFFGM-J]"hQ+pJ8cV}faibwEn%a%,Oե(RekFRѿР)bdPݖ7@dtĊC{ &en &%eyOBLs;n.5a: Ro4Is6;s'_'dX%xQn0 +xed9I(ZtVl?@KTF2 .%nL3~z׺#O7kWf\]ݚlr ?q9M?,*-rfm`7Zʦ BMkt]PɄG#/1 (geUgP # xX%kJe+2G3uYX BTmR.̙K@)U)J@a$ E`k Zlusc ] vUIJ=ۭ-2'#pZ.h_uw ěxOj0 |WR8RFK lG^C(8`?}!wV5TBK:uPZS]Z,1w^jPjVDerY\s`["/sd!Hcq<=3ƼqBO뀿P6g!.qT)Jvk !<;΀~\h#h\{10)e]1J~ātܞxMj0F:\e7B(=@ %kFI }>|<%;f6x"TcQ fUoR<j) aL6W"hx7oWjmU/wx0?[i;ؘQһ螭Vv-]ir aݽ6Wxj0 ~ @nRa -˶ژ&qҮ"ORID vRSc]JaҪ֜Mh,im*i+TAM!ip.]Ls1&{Y rqxUZV+ْ'+UkLd&m!ye?[x;|57Ww! a[Pui.ǵBAIJxM 09\ x$3ikJI uWgf1*Y)e':f1:I^Ef q[Ȕ[FesXp*efM>|?`ʸբ6JiH+Xxu[iJ2Q u`xrzLMɹoY'xPj0+R.lR6%@Q,"KF'JK/üaޛf"p#v-5Q֐n{DeNbL;$'-jy`FV> \2<r"k&ޤ+nPWRkWL? J,d&B'j1@!!'_baBRjF %#Yp^oXx.){&8{9ʾk9Mg7_Ge֘1 Bo.9}_W8#.c>)~K/+6SVv6x_ Jȟ%xn0 z zi]CahJ!mAʑzDklYT$mˮ1MC>K`9) SQXtU+j"pG̑yea/ /pSWvm]AWZ+3/w]} ř1cV$h6f|ޔz{t+ΙF 2 ˓!Dh, [51FޘaX38Y N ^&w whTn!" 2 n02\SGw9L3\wbWlZQ< `6Q;]]i< ssp>hw`koԿ>GevxAj0E:\Fe) lyD#+޾J}f1d" R 'DhidJ]OqU˴0ƠVƍɝ]0* y/H w/3gxs3a1hrPH%4R蟮v =lJB [im6.B+M ~2pjuxW=!Dar[)xQj1+ ԃƝ&jhM rGse kA8W(l8WDwTSu-D8 zYve__؄l!Pa͕je׊APUeHU < тuzTc|Dh `.I vѥ@lysH ]5Kg @@[pEȴ5~MFK9* 呆EwiG=8\/Ķzo)ua7 xP=k0+nK;$H!dkB,Y2_%С.w'AdU\JK) F蜣uFd#6r-/xSHuʢ *2N<p2'؎i]r+'Eͫ2ϳ \r:1w.ñ߀v^ }il1\Ndό}(h.8dfp6Ɛ$8cGJ*Ħp=huI=Y{gq1./[oA4h0\1Wgjͼw7w36auo;QL[pZXeȾ<|xOMk1W{YIܬIDVJ[T*]{%ff13[y1zj 0CT[W~⶝QdaGWюFic޷i,`Vf,8$h9ы$5K2xuKs0 i"^$MlCMa?~}Ӧ{ovORpMM-!&*7k&ǔ@)lS̰jG0- "\W!7m61<AHÈZDa ̐A&KLL 2oص5X&$IC}oa`m iB_!Pu!%`^@S UY!uY_d/߀| ^c7W.\qQyNcw/,| oބbu'(` XC#^!n}69A|ϫV>kqijr9z"r3{PVMerƈi6ìֳn+yٿS\dtCU%Aw %oXUԔGJXٵB`<% ' R xMK1^ݒM6QԛEc]IJߛj=%Lxfޙ -lVYձLzhk;h*50#AFtgz4̨EZkC)D" !DաS+Xjꦜnz %SNK8_ xn7/o O` 1[Kr!X4]v,ߡ1`TB]P3c˜ 2C!A;zϒ1 M)~wXh*uY{py/a[:D矅fڕU@ `П:x%;N0@mPP#XL (3lVVN@APNw"~ni"&Chu2D.Q H*RHZ)dȮĄpg$TKjGޓ89G&k{i\i[wyj\@)YwOڋ9,h'_'\k-C5@N"f<)|?{Yu}n7w]XHv/xRMo0 Wf[ +Ҡ+:fad˖!3-|zv(=>OabJ֥uS"|QY%*bq Ñslʴ(R SQf"ϰ%LDDx# ="k6u;mBi[ҪJΙlΗ|>pJi%, 2Kp8Wi -4@B}F1voaucsϠ j/x-%^mv_m΋:i^FQ)<H;MBzF"y\.YC f0)A^,Yןۃ$LÔnGTm>.a:3ê>?5v4'g~$N{~ X i.江%3۫[uޛrb{k.^ fSx%̿JAq<5VaT`o ئr\y  '`~/?W苈Lt$Pf)`전sݢ|@.$T0MV6ƐE7A;|PDiEکtwJ{譍ܿKAGj'ϔo5$SKPEDvRӶ{z>:<n/?b HJxj0EZh,يBIꦴF/GĶ,<2sg΅Ii mTjЊ#gNV pVʖ6riM8cTPLtKG0}yԛ,ƋQ0@.YW˚qXЖRRѧdrѵ\;KRēW0r`fHURZVǭװxc3O=Fe7"9i? J>dJ)-R"!`BW+o%aX&D4++/)7-x%=N0@aEАT x36'eXcD{.u(Њ{_g?盥(ojbĜ"$Fb}a %.>5-J17p(Q;$Hx_֠!5uYlj:ۻ72:_ZO(ŻLt+)Yq "> /|13O#jz=OwUluRFt Ux5=N0 zae4 H/*f?&/=F pnI8DyzMɈ Zg 5*i-w3ۆlƾP;-ƠJnY;Nrs53?t]*鳺\3Jek]=WH0ИYT8I0s{׮m9񖼤mb<}T|UjzjyO+(8aMW2'ØB[rBs褴FAhPۍ,c~kVJ`:q> I8fxc*o)}npx?mЩТZ+YF_+O+ղRXv'؀rI&P\ϰؘO&#cǑ}hw $9VcH1 XZ5fNt^)kI넰)vHmy}ɹo_e@Vx%;N@@eA7 X쇎PJ 9Vnr +\@D>ߗ۹>E>eYYB12++s )M`p'O={ XHya_GFkMiyzzin?ߤ֣9 .hFv^C0JEF\\ k7^J76qX7/+H#xPMo!+ڂ%*GDQһ5 ]V[ʿ/Nzzi/'yƠ>HMRkap$c;>8%zXh ,<,*TJkAr -^ <Œ 3vsuDoVCo8|s9J^)B[۾|p S zXלÇ6(Cc'HuFI5agl/F=%r@ocJPhWP'b_?by½p3@ws\ WL3ɴz-G-ʂ7_D[/ kYV>Ue[RaKFt4) )J\h9X&i=z&n:S^9^!w Zxԧ4չ޵,8 $X`\`Џ.YɛBG`LGy 39Wt8<6 x0zb%$cu482 ;wD䢹`.v;Qҩn]`G/co1E ~n[m]R_eޓd4>TND!jtcrg5—xAK1sCK6fR/I2dSoj0 o|yp2jzAmI\(s +tN(J4a%Bgt$s=Ox`s!X\"]~0R+)5,x9knkJw,d fuGhSh" *zz.4CͰ?)Jb ^p:ԫa=Z lO#}PX a]sZ~M.k ܞiD4wLxMJ@s^"=C 'tLH& oouSU|T)D C$Dĉ뙌ƍ H:!ic(L.:!ɐvcZ7t<:9bpwСCTg:l˪V߀8* eb(;+"3ڝZK,C׺sCJĀƜ|l5FB>¹"ux#xAj0 E>"Ď=  =lˍ!훡ݷyV!tW<0zFU^Y% ɪ31&M*D m*>ὔ>BY^KgI-8[Wk.9P|q{ާ`+C^M m4Py/rY!Bb])[[x ƻ0 :JZTXBvHa*h8.-|l6UsmB) KQTX2D➘Ϻc8gFXPE"lPDe@nu $xKN1>E_`"!) vǑYp{+`l(^j9o\fJ.^SS&n8*@!ems|Xギ-eν Izۭ҅w30;#LzZ=hDU:~+( 2?^_'ۅ:mW.Su?Oa53xuRKo0+,1jc0Aꮖ<@Jm$<+Bf_ݹ}H#()`16b.8:&vLnqXi*E]TX!vlPS6 CB7unR&Laˆm 03&6N8rdRDJk vu V.)xRuגFx@'Ă-;[fJ Zu ϗ{ۯgwgߍi(M'Z }NK** 9#dUkڔF A[ $3א/xˊ0EZ&n,!{dE d]mѲR{)A&̀У{tT5X"U &ՈPOunt#łb U,MWUuwXh]KTT'uuEsC/=|!/8t&LAZe)NESK"< >0a"ܧ0ߧg-VA3A`4b"H#7u_ z {O+ܜVS4[k1 a ̈w5>[Ǚi#@e 1f"i;X$x,Όfts!~S-ȞFw&Nxe?E=/`:D3C>+S߽⫻̬S7fwXq ̄_KWz%RQ}IhcJwVvM/}տ('xPK0x7HҦIǐ A=8N(i򲆵MI3tz/KЊRL8*gҰ;g1yf;4u.LJxMiPeK!sZ턥cC>6 !",q_McN܄\d%hA)֧C 1:4,Sh Q懂&9*B3,wP5›O5X?$S90"AѢ޼nw{L9!O؇ΪQ#O_mO ܨ _FV2maP[0,+dNګߦgg+۔,xQj0)Z۲-{Y^z(=gR"[F?]}IJ E R@iQ1q=lzAᨴlfdB QQmݪCH5Mt`m&<'.?qtF^p%Be*f=mBG>H!\`E^>KuD'YuE!:=jtSˏU6MxMo0 vX;4A).ݡCv hڒ'IG_.+`D#XR*Be]UE5zE+ElVsj1eԲUŏRRL4[!6--8 .zLQu/r,0,&<ܻ0> \D׍KQG r1YUd9]na~yLAb FP~@&D!IhMHS 0||,K;,&BҖe73UMɨ5)˷ј6ce||nO"#-uc!ٱ`$`ϫ){0X[:(n?'С.q f>!2Q,su`1[ pAzk|CSi>=OC21̞}.Kso)Kas{,+4y54nhrk)m0<= uhqKX=Q}8kA9s.8 q 7H&īc5N:(orzg{ hy'VkdXrYppH~x- wd'~ΚMU}?3.T`d'*dbzZ y2 #xAK1sZ&EE"eڥ%fՃxc1fR$n eM$U”EsaP*'TyJ)cIRheK)"dxH-܇ Ά\_L2&cBwBR +s9g횔(&tpCipB}w!k$o " 0C"fmzvB91n^{Ps{\INݎb<и=y3|2*WWF_ C|INg!4vYdKf93& 8e؟|r[‘^~}r"ߵ*} Vx ;n1PPmd c?`< lv,2Բmqc`9p!vW i] }\HZeXLL^Uh8\@֒31dwj&MMʄoi)cAw80a8XWKT .)xPn }=Q%eH@; D yhW{I ꮜp8g9N*6J6ђAkY!t`t&ţUDezD-<2Zwڅ1[FQ+uDEϙ<)Onr GuaPSkX *]&8c٠ʹ qK E!Xe =նٯ3PzԸv Mu88rh)8o{!B.2=*QGJovàNjc爥V$+5#oZ˵ǜ(x?1{UPld;{P I'Q٬zr B*3ּ{S (ePNX#V!֌! Y {bUN= V9v]PC0&x'L1<)xN^֞?xRn0+95@mzY "A/\ZIQ:3˗tEpR$B-;IJoKuV7mN3FȚl$W;iH+lz)H஫ZU֦.pMc!Dۙw`iVNTzEx 1nS ab>tBu {jI(Q4{;9HRѪ@씑)ejd<) o)'jLi>,ɝ@iä/-Ú@4/Ns$cg2tL^2w<4é4-/j]?3~C-<<:T d1)3#dc=!gMLy`א"NMa>焁u.p #&Eg FEgڅ<+Zk!۴bbyƖ'XdaM0f3n)VI 9]4Rk1rWJuZWRmV}/[U$xPj1+H $C- qa43ʊxWF+@K/e7j7-!z! u.jw:c%!6dB::"1[7;:x9͹L+<}㍅ZNV)'Vi;\N9t~~xwPi*U+)\g) <_vbHs͐R@bAH kS5ꔖZW:L,k˘/'&n:Yxc܄>(yN" wQk>I}o{nLp iЏթď] Z#xPMK,1WQ]9و"+'wI:;ɐɀ{gy.j!㸳m+rFXl'Zc\ZlBcj$Q©Z8MR\r.Wߜ`Nt 4+rs %'W5m=~G6;gԷ ϗq=w8iv/an8lS`9'4 20cBڏGCr8/ӔK 3[q1n3`gR>a;7[xc8hۉ5қM=9/l)xj0z}]YPJC('`[F}:{;a`)Yldgڠ)8.&"}ݞ\jY:8lطZPЙ2 쥱׽S~+o=?ܬo|dwQ뜃 <"6U~@3*kL Uצ&>EJ1Vc^Qx 0 P:#8a88sABba owOG<*@nũĂu9H~~~Afb k! nn{V;\!^N'xQˎ0+궗Mpޙ! qF3cGÐ3+nH,.WW92cn0C?VWjtGM?s["v>ԚOc]Y;}uԤh˗6O!DƻU@i=Nij@[%g^9ݎywtZo}G6%F/p˔؈ y8_xEsA +C!С8-w=r.=sJkV9/dwpC>#ܲwTʻ CæյQg)#& 5gJ;]L>j Cmfw5JH*X!'E@((-{pg֫s|eR(v [DxHpgjy&8LK_m(t f"kJ.Ylcd |oSi.cZy (I S$ȳs-iqՌ@\/B_ 'D[f5dxNx_W:Y]XeFo洐i?Կ_Bj7xȱ 0FaQ%c;ݕEY$-[Ej&z0oYVx}A&0W{>j-Đ>iK1q:p'eB sZJ^~-$g+xAn0E<Ŭ ئDY ͦ@4@b@/֑Р@h7h4s(#©mZtWRTP ֭b6'YתӱnѪȪRT{]Lt-[f1exIrn(풲:RJa/f 90s}Y6TW30+`L/q I!CF?KO>M`Co02 2KA`p }0B;1M#LX,f)teYJmbﮰ♃[}X`ShHwp<]K^4; #\·Ӹus|N۷r*B|9eag_Ϝc6ǟ?rYS(%kQV!yK4FdEQPAPyQœ"§ȇS; ot:s)a"t 6L7 U)k=ѭ4`Q[8-C;0?޽^@s3ϱ̐ag1x?fN}ɹ_?;qZJm 2Z0i0BJ4R A v} GprOxxƴI(5U!8$$8(04"(81$tn @3Yq#xPMo0W9xZn\*!(?`v. C] [nB88NKo_g&ZBI|R$\ 8J n 'Y)K$NIөʚ-iN;iZiQ+*![B.xxc@PLT:lxE^W1%A$B"~h~"X#ۉq;f! i {ȲDkZ!̰/wN>-sE}W&x !\\_Tݸ{o~xNj0+l)z){QUmbEFUs{Yfy,DP⬝JFt( \D ^ "*6l;iТ 2X/ #s7sSNZrrtq8?csz2hm64B(l`s,^a\4i*cB@#]DVhmawuJ]Yջy=cCcfV~6[mk4|x.= Ex 0 P顝"BVH>FHCJH tB8}k?v:6Yf@ @! :!j.t[&ŧd/0i#XRa2k^!~~w3քk9fu'xj0 ~ @B;?.e]diBovIZu%ygT-Zj)aJ Q4 AhL7H!ڴ$Ƣ$sBqpͣp^w/]9>hf[^7}K*uݔU{X;8[<~N) ys5i<$JTp; yčgX*0[츉:Ûxp 5_MڙxMK1sV~Ac MBm7ē^a睇՜NjcfFT`ol # (%[dž7uW3;ecp`j`%}L}Dx ^K5'`Њ62mÍ%9ʣM[{ɀ&d:J#F9MעQ&.%^n|Gi'v= n_>L0oúEdՈ̏E1[tgXM5YD ko°‰-sajaݔz硊 qGJ]i#xOo |9]c7K=ðF0ލ} xzF=n&B{ߩF20rsҜ4YGeiZvd :?pR!x G7r\t'{YS2=Kԙ `xlf!ݸVVOoh̗}&14-@j8@4FHo0cI`h%ETز-,5{sBv[zJ،9Sl{(h|C'&sd']]^S_5 j=αm䀼̗xj0 ~ vJ;v0 XNM8*o?m"$D0dFcݨb44RGߵk9e2HQ{(' i#Z@~h^w 9[_oYnØPƙN[H-%1~hX1h<72~!M 0J;2i"C*r ԛ>\F/K0?(7U6A5&ϧ7xOK0sCOvYdy^$)va=~o@MSa-7%ʶK"s5U)AEܢ%^HPm-da08y;w:H;=eQ9K٪!% yݏ&|c*VŲ{x@H. 7<i`ɤOS?D| 1^SqgF`f@u⯼];}:fL'W=ە$xQN0<#HMqT$$WN#lп / 㝝#D(J0ʲLFRjU7X_=WE@^fZ6oPRVBҶʁDL`{',/~A&<-Z٥qϹHE叄_rX>-"sebw#0kݡ)hl5#0;- K*n.rዪwَ#i1n!7'?>|7,SyzB/xMj0:\A,P g#߾Jhiw1{9"o5u#J%Em}h4[L9V;.U{)A4B ^3kQYG8ER{s4=TWuo9gEXf! 2a|C8xy=Bڒ3W1< <2k+L&|%t*FBp}bd2$ɼ## UL?h7;.uF_Qc1ކ:xON0+\?āƒc[S8C3; ?:dP|pin'n^UʣH^05V3G%c$5?8936^9Z7:yu(Ρ5v5%AJBHhݪ1һ醄! 1[NZtjj mm! kM}=遐pKhg* ^FxJ0yI\."r!i3iM$xTD:p#"M4FEk:śIHa61dhPqeM}+pJ!M#ňZDLy/z_("\'Ujn뚕ԻlWSe9w.pJ\~-:7 3o_]x|bǂ3e $[qE;Ko:O XQ@ [rLԙW74Y[˟'܃xOj0 + vRJ[7'a" 3ҔLJczxDŽYcž ђl*Z`4F VI1TwM]-mQ2gu cBxtf9ia.vg?KNΪ |CV wsO9~AUS_/R\.{ -[: eFȷlTPT%wcT冩[%ZR/%_VMtѷӟꓟxKj0D:EZ YdOk,%#a|MQͫr"Z"Sc# F5d 0lUBFH8keB#/1Ly >[zJ v((Fv9ٶ,SLWpy"N*^of<_jVeb DcB`bJdO)n+`VS;Y ~}hądBY}wxPn0 +,JMq튜ơhS)_`Y'<刺e%KLFpK KYBiiVez^\XŬRֺT.b8yxM {&#txeXdX6iX!|$9<ɇzݗӽ5A*L}B9F8cjz bnJ}7pY]N~3_Ky~ixDxTnzbeί2&)wٻחw2@Rn﷿|\&xQKk0W lG~-/%Jz cikK$_BKs cSpDz(J(T%TԂ$=;aDڦ#ʲhz.:E%]%$U 9vb`::%ӕͩK;؉Z2CkY:"kz'\N{@ AKȐ@ ͧ'm E,c//HVq3 O``hG;j@H4=6!h}G$d؊iWMmdWmN"B|!m5+NZE&dgrOo'Siwo7Ke썮VRYÇ٥_>ޫS\brgW0l Y7"xPj0+RdPJB_ؖ}B{Yv-9Pm؀NQZ93[i(Zark#Y/cW텔"6tTVm[LJT<78DnYʝr݁iZye Lć+@[Wg}3~|ޘxj0EMvQPDj$-}#}B.w8sHmГJ7;ӒѼ9!ӂ vlHk1Wd/MYsEj8ZCZឧBsTi\LXU.>g7+NYLW@ka)u'ڻZH!8*k:<&$/}q%[%.H%xQn!-3y(O9DM 300EUuWw̠FlTqbգ$Xuj]Έ# 4- R4龙tF6H–[9D!Dkޏjف4Q0v TkQ(i~ȗ<3`й՘Ef!^+" &Z]zF.lS\T {l ΪTZ_$ĽdTӎ@H֟ u|㋅M@ 4?"ۢ#@$ZG0t#4-o[VL? 1޽s:m_ ArgpK^+4)_CE,>޼6xt X_4lfeyKRX VCdc:l~y~34IVў]Ձ_6nlݍSM3,)-JG d) .v]m53{RsهK-Ս 5 cin֍<�8XxO˪0+Iڈu)~99`SpaÔO!84xI4F b5l[{ ? H${HT'.v&2)a|B3OZ7Xo 4j:Jﻝ]u9~O `JP&X5 J]oSE|\Pb[;'xQM0 W0CӦ_Zą= !G&nMTI:{pK=)AUeM$Uu%;vHwENbS *+*Acڲ)Zj]9CרPQf; |>Qfg|Gq<ɺ᡻mQyU_?aw3~Lcĝ}] NY#p<]lG{Gd2h aݕvD }2b <'G؅a' ?wֿv'ӽxMN0>ň VӸNU"6@Bc5#g8{ϛIo8mVGO(PQVLidNJ צnQjlþΆ൑ w). SOkUغ@նjvTlNJQ3Y7V0<a #| Ĺgi"sjrj38g,깻Juf'39^J!݅>9Ex)"_ⶻm {1"pzQ:xJ1y +O"<}l2idI־Eo^77ôt`҄vC0L`jЫAh>/c:͹z3=\QIEbvvv>k~Zǵtܹ<>kQA)Y1v7Jo4n!OyDJ8V8vu ~+ZLu^Nm?9Uptxc@qp5ĴplX%NE{z~ $oqw9n8o||9&ڒ!xPMk0 WۖjRJwܡ0Îvڕ>= v<[zOzVD(=Ƕ誮 j^ZI^Ե}A$<UIu,jl%ES(ǕJvabbѓpƋ si Eӕrzxlp<9OR[ntJ9A;6ʨN[ݍVbۚѝ(uVliPƾՆ 5Z)թ*X"<cX0!䰜ﻻx:B#Ǯ$TQ ..gCfqRN`f\_ H 9@I z+. b9$QXˢ)&!#P?_LME%vGeypy ##%'%gA{a8afvL.` 330>la+'!.` M֎:ʲH]Q~ ECc!]8Vr+*LSy뿫ug, xI 0P G/\*dW"I"m-xNB\aj4cdkZ(/9e˧y/X=TUKҠepSTW9‚͍]L%yKi៣R %یxKj0 >.a(]7Bl788Nan nK%zI;$i\ΰKT@t:9>^A(tPu :XsjǏ Z:eQn8g{ZC'fx̹8.{&݂o˭Y ʴқn˒KlJ8ύyVXuw-1<\orp='#{txMj0 >.?)Ce7Br,7I03Bc$q&G.8]#U:ؐ]oX0̀ʪƗX4jAHI/p>e rNC)c7ҡK#*wV)Ru) n#< NKUMͺƵuaua`p+!pO\K?gw/'yʺq_!Ž?&ɴn#cIgMKAmP+}g"Rgː{xUMo7=bnK]d2"ѠbԨuZZV~}WZJR$@yďy|q=3|ZLLXϗE>ɔr9XZl" .i&Z鹉NWb!TKͼPdγe^g˫L.VY;+㳤qu}p^_ir^|AleȞdWӽs}Ȧ!:^.&WE[޴[ɵXYF~ L H)XW&P+Hj]:Q1zSt/?֫߿_ `)W5pMws=߈F:w5!hfSETyw$M 4=\Bx!rɋ J55- Z^dQ (@|a2Li+{㩖~4 mM!lڨ^0&ZE1HHYaӄ &D`鶿ncNrt>`No$K"[MFs۱+<7<>cգYrP=|^DcL_"5K o]гʼnǬѺ柌@7hd+R?I.-_bC, )4%OYZ< -Zh*AlgRk =J:Gs +~X"xPn0 [EСR hzP[ dErhѥ]DȻH  J+^4\ _r\WqQ' }%7(}erv!Qs^.>Ql)VY{1i J!+UqY+(et0Fzx1!9_OO1L檑\/W!P 0bqN"+9/y߬n̾G!xPj0+l%Pr%J Mdd}^afgVh^(0By& U yaWVN$Y ]\MMA$'7qֈ4Lh/!.pI.*2iPۡcݒDiƸqV-(.چN>lguM?:=ŒVv e|%o_'P/T2 iX gJZɅ^it ״Mi,@JzwfvNsߵH'[rL9K#l5-?oiL\(FÂ+YP ex/)eTݵ,uv^x%s5O@ƹ00nڏ?{'r sY{SrBؔ{ڥv^a"yS77(x]j0u~#PRh/+i՘Z -}° |˔LN6zi#5H7뜴(`B2V\1\@!8딏h-AA!pĜ nJ@5]cLl[R?w!B<æLBP0;&X˚ip>?u B} 'x̜! O?#l#8o cxx]j0uVUPJ.Y52@ۗaM 1i {@t1:8k?F,ZCw'$W\zʌ1['Q ED_kKnp |{?cØȸ aAj_w/k"*n-!n *vÌ4R"y yS^%Zx[j0EـHR(! i/n@Q-cBw_\.֙.c2J#l 6;+E/OAL~求 jE YI!$ Q s/\p3pX[:bAB:\jweE*q˔|egz=G/V qFNMɹ ߛ?^xPN0+ƅD+UJNnqphvG3MZɑkּ1M$2FӢ"(:␀VaGulefL46D"Ka;yw_ lxjQK(*YU$ޥyUlvv@ wK^/ۙ A| i56x8xRˎ0 +Mx(=(Zb!elCڋ!12z"eM_KUUu6nu[U:*:jTmĂUwG}tEthlA2<4k>& u}qX{U܍z&ĤR 3}qf"jrj !Y5^bZ^1ں -ֵaUom98/ nRrq*R8CП jTV|WCOIdx]j F]@ZoJ7P(tWN}gVPgt". 0KYQ.wPV /W%Ҟ$Z gK r'\#?D{[LlgWT1Mҗ+mQvrdk2fwP&̰C`[\`lt5$3Wl6RGƾD{UlR mgĿ+L|Ry1p;.Q_e+Iúxj0 ໟB]n2Z+upl1l{[[/BI9!J⢒/@ᄬlS; &a C|HR8YUSn)Μ:%0ss0/WZˢY!Mi 9l).bY&% DM>Bn1푱7S BЇnyC oa$8`猽@)5_KxOGLq^5%cUp'A~Z!xj0z!u[qB(R(CXGʒџCz5:_ pQ"(\eՒYVTRh؍A1ĮZ X>=ju:OړdZ aY"hk,M$:a73֒MI7)ac/G=x-;@1tCZ=G0:qve o{$hӀA&,f [ۤ{K\< ap qώ5z-ENߣĪ@ mvzFѓoLnT"\0L/l)bQ5GXwc)`H} s$0\k)垥^=7c_xP9%Ncǐk]@Ptya"t0cף=aGm.:ӓ[AYRֿb lxPj0+`#[!RJ!hoZJ W&=^YfgvB5Dd@U՝%% 2Yv@STT+$bI)؝V+) murJ5)aX&8xv! evMW- ל趠0n!YK#(E0!L!. 9aIțr u!?듧ᜭ[xފtKޖ(֙|z"O8$CJA  J@xAj0E:\a?lT 8Cyx]%Gr\|%p\o7̋Q*#}e?ɒxAn Eb.c*UT Xt] ̟@D)eu׶ʵedOk+mJ۲bHcRjlJIdHRQMhИn+03G<;s$MK_"rxRo4[R,j)g#`liaf+FyK7M4˙;ԟr j0r8 HۺӘ]>;TXv|R=޵)zp^ʠ;liEP Xp y1i#yCof)?.cݸNgoY&EYrX4xl6;FeG8.ḛPD5u$^<O5xLjC ˞2 Qa/k Rz,jk~z0Eԛ }ߖRKoR=^q%v7O}mF&`OmO7xS0+q8eٽu)(%W;7=B/Fy8"놚ZVvߠV{T)1K$})eծ+UkZKmNp@89?VC.Onnwm rSIWh !"86kH F!0b='<{#)`4: 0 *{/^?-7Bt0O) ~u6tm~u7;֖gҘ)_^BgR! MQfi;)3aJSpC&*˧ҁY"޸_rwFjcɏQBFˀڇ ,pg gnaa6hғc11qG/IgG<ǚ!Ϫcbt xEbW8ec~bm~1/dI̾:xۧ;89:R+>,͂ǔߟgqO*Wؕ4xMn0:AI%EѢ g$H.ht;]$v#|q""¾Sؙ+!Km(J٨b=AݴB5zVlEj:r)D8"Džןg;獝'(6u}V(xwDlS˕]քe Nq#¦N7E hz':p/d6UhLwR<06_3BքL a%$+#%xؾ|J$Xq`EGpÒ.O7KU N 7g :⊿_)αB_@?/gD(yj8 "06\O,cs~e-Ք}sN,$Ec )QM6̎Vk16SZ%Db!卭v0vf];z40 [u=s?XUxMj0:,ۅ(J hQc-}^>tfJ$_bAI#u4)15u^6&Gd.\ݭVT:|msk}3 r?@;&x"ΣUNrreH"}Mn(tmn^^.Cuoexi0Dm@V_'!@ [Fڃ*0 uo\)[N."W 7 +Aw9tLDR}<g{wߧ[ɃKB| EH#LerKr1L%x1n%5oN]gCqyIʔxO[j0 )tf,_-]6(%'{B%f b`I+ X5HXWieiƊ :T؈ ]i njeZ!ckԨVg ˖e! 4ed Y\$.1`n83u迯~Nx_{wۚȀ?"o5MWۏm!2+IaSƟ_'}ژxPn D@UJj1Kb)6&@{Ycfwfk!mbrYAm\[ 6L=۰ZaU8E9*B#4E'&%&^;os!8m-/q`.uVW+wU~^f煣%Ra6 nӎ^B\#y~`cyN㟪/9Awx]jC!wW10{PJS( ]@Q Qh_0pfGM:ɒ18uJV2&ijCц"uči ^,Fo{WWxk#<وMkAxPJ0|WXiO=O" d mrBLžJkF(b1xSmAN2΄~_GN,l! xga3  <ޟpO 4f!)|^xaeKWL!҂y]J; i\8\4gp^Qe#Q䵿Ri#]b0 >121|l!x&O VNxMj0F:\EџC.F(1đ1or@7Ąf$cGMX2GZx[L#L%9)x$rKdr *_xm>:g mVw;Om)EuR|2Z{WC_Yx]j0u=@g -@Ve,0%!bs(T =q+*PzL4%wp+e3f j%zi*r;/ 11+Ƙmy.A ?̃a^E@k\F2z&Ʋ8itD4τLZQɌ&$QA[ ?~w)U!Kmh j9.tU{. 1m+,=1dϵ#WRk4~w PbrUc!xMk0 뤔Q.+-koc(!CqУWRA/PeU+^PS2] ͒)JdJ9,9e%P5L  U MbG8u:X9<|~ oPqZV J}ocr`R]υ@h!N̐[`877f X,/+ƗPGb&dM&Sճqݡtɂ4tVz7$6Dpm;_;5>-!xPKn s*(T\ϣF1`n]Td̼arDJaZ`O9bfh4z`tk2>J*^֝fNi 7d["<U^Ƙ1om}7t1Ρ=DlM,s9Q ֦CphIZSFwe"ϡNd5<r.=N<EmkD Ѧ'H&I! ;8"NSYYT& փYR-ɏ 낕f|<<n?<*Sp{uoFOxAK0sbifYīAL҉ lެ { x|oJftq4C`iΪ1؄tVZ$Hz6hG6j$pT*~R*ik2,QvнTI#ht_1#xg(+ lu_ F97# 5sD1 ۼZm sYo!#n1!^JsWb"Y^~5xi0DUmtT(k[fI+g3\;Y .q`csc#X:NWY4k쑳 bPkLYz~k+}Nﭭ\r_IYFRtzcە 7PoO<ӹ:& !\4_n`xPMK0W,*}IۇA("dۦ)ef+CnZ/T M |}noZ\itruBҖ:kNq$K{ /Jpxj:KES 5T\s ;Ŝ?^i{eIki\Z(Y٘gC!%'=cOqz{qPt>unkZ?!NwہXڎts>;`;3|B7u⃉xAj0 E> q0@P.LLkps:e6B7B?DղQvM;RIt]?qD1nu; FCZ+I$qRk]wfhHgN3zδR o_mSCR)ۮ5TkayY|ΔỎt-y/ղe؏Gp~E⶘ ~$y&(&; 'Ny)~xKPbR$wOIZ E|?b/BK$W4Uv7NxQj0C}9@x8K)@Џ~=B{&'(G$$3ᔲЄ0{>b`u70H)0#>:o=ZcZ X۱Ao:ҭJx`{ٴ/jRA R,s4<9ymBO rlHb(Mi(8jkU76ʢQ}=JVA8hIՎGViD[%p |>{J957P]Z0@%;)ILɊٵ q%xD$t#?ahy>:W2 O`vʔ8=;+LM8}e7uz7xRMo0 WS$i\Eoۥ虒X-"4"{$%Agu4{G7Pume}iMӵ֙0Q0n[fo[v[:5V)mWU37]\Y#cLwg5Ή=Tͮnz rWfG/Bݕ+”;^/%O tlBjs 0M♠Ñ9߻Iv?W>t'Jr%<"8 ?ez:c$E- t&E>{ob,'QWGC3@a& 4=9edᆨ˴;E&P^dlOiH6`Vo6D:wG(Y5d*F ^_Ke뽗@ghiYv*v\ny?x&zw[>/q|];/$5,xRK0 WX↶U&)rb%B8mD۔$v=f"ȱ='"Z%zK$uM Y(+}Ց:9[1В@`#{El4mlVHZu 4O~gLz{D[P\tPsK|mO5Q{↕\wmʌexm5HQ4EGlp%/}3"EO{ !ǘ0=]b@N5r ~aC$ X%n[st< -ނKF#坄LgDN;]qm.N8t2ubǛj)wƦ1^}փq#xU5onXڢ?#Dk.h쌙0xRKk1W j/ØbJCi[J]]Hژ% 1oof="`,x ^7ضtj^wH!-!:Xgzz/xMj0:\F4X %tE g+/*t3>ވ ZBN֩ !Yk3Fl-윔t18dULM~{ \kZ8qhRRNLq׺<ϰ䙀\̏nse >%xƵ|+^,4 +<m!xPMK0WM=tIklMXn$&!n zGd|LND^c'{CVBVe ^ZIcZ^tcqlPjEdCHc6zUJltZr.wSZfvzG 6,ހ:v_{-1C.Viq4/|a4j k<B> a~dç#$-xZlm0m&G0->V2":Wtݟ| xPJ1+Y2#? y$݁I7"/MQU]TD`G=p+-DLJ i'EYH[eݠVWpZ K/Xx>Vߖ\xMj0:ŻJi]9*jS nqq`d8IS,bP:-{q+FJ[`Pd&`^>m+uZWyO'إ:rdꤕRlt[.{9S\p 7L_j4,]-B_{xAj0D:ſ!vE!H&`[A[zڽ@ax03LbyGf';A~8+FfIU2[I;8q&Z*]:k)toinXGb/[֚ηiL'9S_M(alԮqW//41o+]>9l~.axKj0D:E/>-5 !rԊe>6dlQtI)]lfzorʹ876^% KdCH:!Ew`QtmA [n6Ns[*]+PV^HAȰ?Dc.P8gZ8w.>^dG-xRM0W Z;K҄ qnYmH+/{HB=HHüތՈEcB1k"ZpFlDjUjk׬cku'}tCᰇ0].@:'q#&RwBTÔf{#  {(bv1G/Ndvd,?WeÐ JA J$K "0yni^K{;K"sߧ}.0ܤktbfn2?6,WڻĦq/_\ 85K!@">槟G+2o X>xPn0 ) BTMUV4MSHL "aj~.dÌ5GŰ(Z)dTdZd3B(,gՅRwRc)DUMz7s]Jzo&l.u.io%cG 2 =`,~2jqxPj0 +D/4I;)eVv -7-?`!ޓSD ԶDԶTr^֨Q iSlH>v7d+] R(۪%˅@Ď-aՖFXpI}!D˔ul븬9'~:.%.SȣIf;'̃{ُC/9 >gYl:N'PK#|=6_&C3%~S?e.Q]#{w7Oj= 鶚VxNKj0]K?C2g7Ѝ$$$*xyJ$~i WZFJ\k AhPZ#8"%Ҩ A's[ 'VJ%xr7,ZaPZ t|_b?]KXbv!84~/4)s^q7_bWR'OfxQj0DuJUzr ed#sB=MEXhsb4s wQmdD [qg?Fr:h1&t?p \bX>E`Qt{lU3LsB 4y[I]Kj)C|]To<`&xMj!/0Q%@ 'qPg!dSUAFF(MrZzau)F"pQHqp^sAAG)Q{V#W W̝Q|sZ1%KPP eJWLKòXCAOsa<^x;=QuhGz.S\jJ8kE xAO0 >#:ҤYiB; ''qۈ&t=-T\bR4"pYV؊smx)fL2;QXQ-VehvRnIRVKp}Lo1&eK)2ؘ蟡TB5uY ^qw9٦be{01\)e=gӣ hR!Gh`ad5ZlVԅ#p#J  hpK4]~m6z7)t7!&0aѡ[150kʣЖdqNȵrmRN»ݿsE8_cX LrR4 TPJ.n-6.i ans!Xrm}koS@b\|S;:21?s7xMK0sG,MLh۔4UߛUx9 ;oND`s7HF0ĕ57V+֎6ђAh9(eυ7M'I+YrZtHC;f<v %L_N?Poe57pהa9L >S>V5urQFU#|쫷 S2l1d¼R),἞v.9NjK,8 Wg {xPJ@WQlwR޼ z)& ߻A oތ$f o"FUU4y[x[-lkHx(}iuL)2H[=ΔzS/ڷ?oT&I82]\r|v>]B48 x^/߳;_xOj0tII%˄N[頟O L)Yڥ];rBR2 >h<5JyC.&]=Y:pUj^RK%r.&x#RM>8nd܀[`R( NfcB]VB1^Y%[d܀=| !$IWBpBjRpXIQ}C}0 񍩄 P\ {DT ,s ֍.W`.'ozmZ%`î +heJE9Т O3jM[+C5bѨ}B+^ B(Iˎ &&| :^GC$`y]Bh/Ncc;%;s,;[S >P5uXh[3'g[}-X.V X^SYc!J.IlcSU5dAʍiM=3 XB;Ozv Ygqxo_H,2DC!jt/d It4m \{z[#yq{9\7eȐxMj0N1p !4Yt( $( ԑEo_;t3<>xoZeLhW'BқX=d%^LAp)9WhC/eLɺhor2(ҮgX~\JeOk~N7nxi:o$j U[k"hWyR>fh_$rgJ]=&Wh\xN[j0 )Ve)@ȶ u8޾3̃7fhIiNFql'YLHƏ3fyKԚQ+:Z|Yp;{´?TW0,!&Vݷ?]ϭ+P@pY鋡Ss:d=7#Ry"S]f(cДxAj0E:\ad+(B #ib8ʢo|B7σD@ldhؙ0b$17,Yd^ &}ŏ~m|6b[^A%‰<"']JW'`n73RSV>|?.Ò.s4sQm`ŕxQj0Du]V((zd99A?M0")dCFQ#g&)7:ggAgi`dΈ:'Km>kmodX_7=k]U+ĺ=u@o,;N3T8v})rOTm4ԜsRJ]`xKj0D:E_F !@rolFvINYfM׃Vbo wVZr4 RR`Z;ĽF &/'5rRH##:qg[^J/3l0zڞaR WN, p[y \auFpuYcu\eЅE厅=@k=NB.md}1 ྯ6f?wxN0 y %ko 3O86U t2NH\, ZӒmJ$9%u:CR-3F2b Q֌+ܱFwx}^C Oҿ\K1^ T֍jbQG3gWdN94[ g/+0aĔ!EZ!8[+nWkLzq¼pq|ye 1c7BĶ37GڝJxSۊ0}W }) Im㥔^,4ߑv/Bģ93s@nZYW^F˶ֻa?v#r 6 UTQTuk%Mm4{T(pJ7#!VovU%8:}c4gԽ+.>dBL @a1Fd ``PDzL03RqNbOF- TGP2֝8d˺'vMfօږG zu"-_xa {EXʲ(,Q6cۯv y̴1ڑ|ROF5I&2Ѣ QA`rF#8gJQw<ý_/p-e#<<Gp %NH4ϭر_UcgY0F%SO\upx$q^݇猠sy*cmKJܿ~lxAN0 E9/Q&u;B !`4&U2d`a֯fth9Do)xZD2F 2i;QT!Ǡ<)3i=a$$"0$;{g^W5:3N[Oa&ʨ^ygR6h>@q.Y4.F3cɠ7Dn"\ǹvx o2[jye7ӳIZ)őm kQͿ-s_ 0Taa=5;qw/3M5)~?_`xNKj0)v3 B'xy~&vpBn t߂@23[@=)P;doH|48^zb{g3"&4h ^Nn;3R멟-J;SjNR3]RkL[mV4v Z1}A+sy_ _Hp::Fq)MgcxMj1 F>/0AC(@(fzڋۍ$ǧ`2YmR<m590O⁍.rfG  $fGMk19mӽn/R2\A;:XysIZΏ{+cBRO_ӖxJ1R/l'"R@sb n,Yw x3 3I]Ljmjcrh3E'<^aS0e;q$XSL֡ ҧީ0C5̟T$p5.,pTk;jEFwZZ?]%a9Tz>ﶏ/;'}y9ծ(?~sn0 Coѓ eb7adK"!T?(8rxMN0>,avH8I\nǍhyofJRiV^vJ g - GqNR^:CKF"R#s9x=T[iк4PB]HhUuP.y!~C9LBpKcoo( Nt7)@_ GK_V}GM ?_`?|1xaj {w5gRz.z>@1KBaV0#NE ]iNl#ب1 bgcCFr V#삠3J /ߞ"gpeyuރTN)qu/+ ǖ1ay|yVN,N`xj1E{}@ʰFc\ C҅WVd2Z|}dܥI0̹3SK`E?CU@JsM, KX*P4B+zS8JWBE%P epk(_wV\7nz&d(m`Eԣ6bt xɻ 0F!\Bc~RDQ֠H2H|y>~]BmIpI,''F|*6FWM6*B+b!dnőJqUeUqX HHv΀gjڧ$_7ȑxj0z9B()9{HԱP/a@Kij#$PJZ)K솑 5Z.qJk^s":T!s0.D8NExguYl,a- P Z/Ê{s.B[ћyUa+o 2V,nzO<0@Ri0$Ǝs! rGȗs>Uw,_.H Wi#ʾ䨋$xK0W7ϵ"J)T5MJr7"C;pBLbB8JqedURDʢ7~Gm~i^4mޠlFO#>̿_xPj0+^$[JJXŢ,CafW ]2r)z 6N]Äcf e$(U#m\m$'ԀYZSejyO;ešf9UCX!3a`)MȶG?v_E62xRn0}WM["FQUZJE{})VFif6e9c{qR$3(46GyneQ4I[dq\fqMT֙,,2RD"NDoj%Ԇōh%xqd ShWcZ߄Ϫ22*JFFyOwp"M({Wy/02ew3A'P8HURY=(k[c=P+'k4;%y@ ̴Ԅ%!ah ܿƃuϼV#L;SLtvH~:L65)9#4JG5nN6G]4 (_ O)( :t^ .vZXfC mo0!tvG%ݵG7z 306׷?3U*zQ1QΩAVo{A@h8>elPwU~HK 9h2hS^0lwQ qϮEJBQeb؏t6N')Rzx:k3rJ @pEg J.z{za_HKm0vcϖ~F !'x1k0]bs%G d/BtJDb24Uh.r<+> ۍҀ96AJ9B9Fm aD/GLZtՂrNޒӕ3;}\ ͟;?BP(){D4R*x )eR~hkZ#4({mIgX>q>q;O3&_v/Eq2 xMk0 :ҝpbJY8B {d[q`;-uRh/]J^}k0(,rERZ%;Zi-RZ)Vt};4 fN+E7R$#)b)&yJpvlӞ4Fq 85XUgWJpc"xXj~ڟü lǦ,=,1g'QYS+ex(H\x.KL 良勞nL:._@!u2a@W, sB,).~y@ \!:792쮁!Z{P+>x=O0 TiNX`?ik  x~eC7a0\ gEh%p) L*ߡv3uN[+T eJ|3n-ùQ\^m/:w\p:AC)Sk/Gj!T**K :1y$ͫn׌z|x`0.}cFrLkzxj0Dɶl9ܒC!JDm)J^=, o1m89ihYS%aw8d`32RMZ%B30 }[LNc}^o8 1x3[);xDqgs/1ka/jތԽ줆J !2/yr?y-V>k(EBTEqgo䯝?vCxSMo0 W9@8I0lX-ѱ0Y2$YHgKn@%=Ҝ`nFͮi7 nnW}wݮ^l̈"CCuխkinڦntͶם_SGy+O]UV,Q9<3O߃̈́L<>@ `S,'ˀD C{2cLNyΕ9Ej-sXp콦 =#$n|t"x(2tSSNyZ<0r1HǙ\(w1Qn8œ "+bxʊGxiTdJY |*yq cN/޽6SBDEN9RX \?Z NLq.fbdQRզr3%UZ* Cd ZTeB U9Ńx|iʲ5n0?>-S- qtxAj0нN1p" "PH/ьZY.n>ߪprL30z 4H0kri-{CqDc@ֱ'gԫR-l3JO{?>[ey5fУN[]ܚgh3 ox+ o6H![Usw%n?V2^xMk0{~܋%&,.TɮThoK;fŒ*iVȤP)!EHM!”Lz1@+``FaH\ \j̙G^;>-??I !",3~d؊+TYF!idT/ײ9ק9.%uЍĻ05:Y0@t0RumKu~&ߛyk$xQ0 +|t6mj ₄?$kmm\{w@l5c^`0mΪU-ـr /éW'R bJeeTziCi-ƚ3&`BǼ}>G\((-^̹w>Q92WW&J~kIwj] B .'9 W,Pt&Xe^ܔB|Cޓ\:$&וO{e5#oi^x}rJ 4/0p9 N ׍7\k^Ou`w17|̕=B \mP&4(YUǡO`C5[8ǮP2||?}_ 2u)_3z; N-c-~XWkÑxJ0F]n$"h/۽4l6Sڬ0 Á9_AyaӬ5*F2F`f`G S6RZmM*J [li}hD}_QBeBC%l}#'rEmP^v?? cR. gj Pwġ Wb Ep> =MN(6:dHobO͟cyŝxJ0yV4iNSQtV2 -6%MkͽΉLjPRl#sTZJS5dVj, uɑ 9FT CT&j.Ӝq?ٸ0!2*(%Ɏ},4! 7^.gB>;5]ݾnCxMm.yic/_Ф7C0S!|ѷ;s:bxxPJ1+Yz$,_q0dYA("T%fCv)8vl)e97#6LQ1SL9l"AoaZü uإ:@o thNck5ash$pxr|xz=B|RYrWKu5Ns]d(Kw!^ $E-ې}HvQdV?Tlkx{Ŵɸ(5U , 5"%8<94%<$<,8̀ (5oX=V#SC,̍t L J3sRJs J2RR3J'~"ҚxKj1D:E_`VkZ 1&؋ 'Ч20h}Ɛ})6gpa-✣q( &䌤0˵+F;>E[f:LNKu|KnZ=TЃsDg2ZxiM]k2YpڿߎP3ԛ|^%w.޶Z"xMn FbP[8&N.*Uj/0!F'/NAx@ Du3Kd\.ZTJVP51K`ZlH6Ra%*: 6% >+.#x<چbڂRfVu|9dSe5ZC\هir共F1akGbpruG#Z43xv7Ƃ D? HS4 43A=nqj$ t^Dw%}oՇZkeiȼ_?YV[-yzGGM Kx ˱ 0P!EBb Qľ}X"-QDQ!=X={{unV,5țU Sܔ"5CM1]q\-&Ԭ>(MWda@y/!xy>O s]i յutۜuP$T8=0005Q($4!2jXe Q{ ~I\%70i#űhP.؊!zRR36!"H4R+koWi*a2>!C]='T>x_>eNIqnfxMj0 F9ECzB'l uqhK7B|W 3h8 Jou44FvZH!3v;*I 2:4Nb/)th:x$xɹ0&kIPBt-]ZlGǒ{ɔxϙ1?#$-@z my89ƞn?yX=U ?ZBoU0ZБ!yiw!|xKJADu\ꢥADP.q@VeLTSV/3xMĕ5qV*pKƴ\]i(6tR ]1?Vva>^_?P g:ݟf^0WS6ۨHQ'E.#YO)r+~n|5xRˎ0 +xeڎ_.( =5E2$y})t Cg#"з}5(۾1;l=vخ3(#eD㈕>k*cRM/SYݴZ%O!78BDxsy% u;#쪮Gϔ3'vf7P} Zf=Av5[9 Fu- I $(5cИD3g6ȃL^ Xt8R 5/2C"f+һ)˘Kgc-!YH[%'ҏ+_2.ޞҥ oߓ{{K҄ ('qg51-UB]Uerx.fr䉗4dE1;ҔYix{_Du^6 BqM4`n+"o;:!AD/ӋG )~${ ]x Aj@ ErYjF.b$A=sޣ7e= +;eU My[1:$z6(d$?do߿e.놩%ylŻ2PS~v ,65J~77xPKj0l)$QJ/P(cϸ/q} ݌! ZDlG1Zf߳b41ѣXB4lP3(ewd0F ZgI^Y' |\^?N>7;C]kuUU,7 frjَ;U8#6twxKXK{rJ]nPOR[H*y(=ɋC0mtbS~ɦz+xQێ0}W#MBⲂB=ۓjj_,3{%,xYk7@ޯL,xǵKbZ4M%sQ YTUY٬j{٤+"g`,Fc O<œ?@V4uU IZ)ѳ^*/Zo = IJޣr.QuER$u#-p NNjH.j&Yӿj$1.Hά'&~m}~ePbؙY5[H(iM0Axn_~}OCM҈px@) ܂<{cJ_8(m;f<*?>iHcZM^5}¯gΞ}] :x-̽ 0@aQ"S?w>c>,A!005)(U5|7 .K$J∩gWa&PKlċ6)z#`Pۦ1&myKQ](ƨf/&h%$d+yQ7*xM1uTpwȲ&*Ie&&I̿ZYETާ޷R34fDkga$@TXE)VLVrZZK;]uG^3HKay <ސr)yBR2<)Lpr}__"`yS"Pqg+i3(飱3jxVAOQ*F5Q>RBa"Ur;^+r<_wɗBYcB5笩9JP bd.nǙ`m0Ѣ/T7'~My^ti4ocnRQ)@o>ۑxMj0:[ Io(UB{zĒQ@n߸=@ac7D g%6RhG)D&I#Q{è5d wN'miNZ\OG^kCx^uaك./  \s{,nKǹpWl2RrB?!|p8g  vs=ecju 4%#Bȃu'g"*dr4=o~xQxPJ0+QIdYDA^v mST^aaiN6H.ZK7`l8@|T7x~e.~,w㼖(2lC ( 9ޅ9Yy/w%xn 8=yz1..g=;adc+&yκM% %^t[ 3.orkhZHЯt\o7}s@fݩ?'~H qx;0 P!)2‚c{"ؖJ*`C`@uLLj"5_ bFI#[NǥzcLIrTP(eDa+PG=߿?ty*yrm[wHӈD"-`, \@k9)6]xJ1y>a$t~fŨdF=z#vq-A&$m:8!.*-0m6xwjmB-O050p9iɽ\^i y>C᳹k^zw9BυW>y8Ԕ}s)Bj 'K$i5;26*G.95{'AxjxN0~=pM8* $ ɽru)#)OO8C/hƀ4[#vYfiFuFuhlP32CڥRpU\9fWyHsI1%fG`gqj|)WJ0 )%ڷ1^D.~$)`4>DpsחrSݾ*y_V,*BB<"rD5BέYn(?˧&pEHw."rm x-λ 0".AX$w'0 BZfB 4Pн=0]T~=B'hLYTpvs9p*n5/)僖S2fO:m3XvT3#!I7eaǡniq&{Á #{*m52&~;3.QpY^`7J`Hyv~l(gegݳ\_gs_ۼt-(ޘ@})dc ^bs"mLsm%cyk :ñn&rRGP6zL]?]A\DR<_ #z[Htf8{-q7-km V\FenjZ}֍XkvFmHkXipoxPMK0WQM6YLhM)Y2<>Z ,8"7NzvDƨѠF6Qհ6@IA 5fNW)a9Jw/VJ ur! K~q2j( 9gͩ_zx-e}߶Rc=~9w}Jbwv]Ke=t] %]R>A%OZaW:yv#7୦hD}q'xj0yj4ѡ2-ͬH߾]\>pGL!Wi&P ȔFS*d3ZXr]*SM3Xp#cS9Z8:u[S$+XS$y5loُKa܃6zcf+zwۘYx+d#!m> ˰0A._קPUrjNt;B{QGΘH.?7OC x-!0 @Q0N]IkUS.U`|/cTTG )+qb[ bEaM_Q E٦`œS"%KVy`6uml2S7@& @ z"H!G)x~5ϜxAJ1E9E-uђN&U TRazdoo7@ptϞϒ/Mxh gz.f;LK =Z a\ Ώ1NEGvlxPN0 )|&ݺ !$N HdnHlYȜ`=hKܨt׫юҙd{Eۍ6z##& UF߭ѦͶ۪QjJ*ђ‡ /1&c/Y.Z=jgpXlwP>3JB1?EXf4 n}_=snq)_J&j}Y}p 3b$ R c3W}\M]| Ay%ě&:׌ݟ/W% x-10 @Xz8d"đ:*W`bBlt`z8UՐ$QRRks;D f#evxn4 1:YGYKzJ~L~{?>yneZL]fM*gbARr~X7xMj1 >b ,=l@=;(tつ7:3Ȧ(I<'t2 gذ:X8, Y@:#d0dJĨxo_pn3* \V2RGV(d6lfǡ5bw~R9*i #~?sSx?K@ӝ9v7 "^aqpXf&w6l6ޜ0< :P);2Śm)kYL+.H- 3I@,WBVh{F]RcmiSLpe}fZ)Ƌmx rTZ-Ū}V$ׄ O0g Ȑ#qێ$K<3+03&n&8sBs{zW8tGi зX.B)imU8C_n͆xNKj1o.7P"@hOl t8޾n$!!ވ@{r!IQi6ʏmM\؉36:uɕ2EH˜dL!dgBT9k?{~®F>/|3rAI(Xy`)Џ-ХþaS $,^n#t8Q*VΊi>֩:a@4(NdU +!T:_0нtŒxAJ1E9E-uђtW ࠛ$F3Ĵn>ZeI\vGy=Ao):QXyiȦ a^g 7A1v(R*o* n0GZ:OJ@.𼽻mJs9i%! e=Ii0uEK_?b6&Zf5O8H/u26G#4^oy?xJ0yYꢒ4?"+/0If46%*sS c-J21%YMJk/%Qlh` 6Il>D2dB01^jmOܥ<2v Kq/s e- }jǛ_ OBP}sKܔ嬡 /z '̄g AMDVLqxJ0EǬtђd n%M^:iSTq\)ǁDkEe9n$yINxHYKVM&јk)eŃGUohҦs0Yx Z5v: D.B9, LA*6Fѧkm 1pJu}E/a@(t{+ ǖ3a퉖:ŅwIВ}srj)CO9Ciu *IYhTJD„)Dg q̖"xN0 y /e4? B HHiFI0IͬFe}N0zmenp  Q))`0 )j+z Q29p ~PjQP\*=s)vQN]YQё ÉJJIKl ؔn`_mmF. lƒ?7W6ͻiBn.P·@Ő5pb|~a͘fOT6Lc?ŦCv1a_.}M[R_ p.7̈ZjC҅cJPV%ԌzbF 4ȯ}xOKN0o '!8KD64iHl,?[kG jkҝ8Z7i,`d[h|i4`XhL7*HK.[ 4Ayor,&|ۃ)<$Bo\`+u=Tv}e'1rk!{&xQ0+BH%[aYvtaRm-!IUB^yO<ͼ7%0hEڴܹV o *c!Vm+̀p`f !JN݊uBQ'u0}y]JS̓u;wÏ݁r׼Bwp9J /v9Lpjx9BElv m!X΋㸀#} ;",kJ1SS1PmܤǪ1@d(C:R\`'ߵ35΄Mλ}{y~wo a -.TB7ש8u%YG`ه0]ҩ}Vh^H[sݿVxy׻^;G kx[j0Eـ&  ]%ClUtMpp{D]Ey&'K%Hv!}ju!Lidf Z4nLh'5VO6k%\70HFGAiץwgkJr/'HǺC <}-u^aG7>MPyHߧ?OYxj0EL%t dkȸr_o7ˁýu9 M'DYQBڨ)rE>D.;s&qDKT\+<2 짵h CGM1AjV*a˔bgy=/v-,W&)97Mp}^JxPKj0LJ H(ؖe߾JKPS2"ЎY(υv=s\K[, ;Lƥ$Srj+_C+ڵq%1[cWMcFxL5~fN.ObR hJpn<W(#¼M% 8@Hpu_\vjuN\jrLk0er5εVH\] r;D[,84?/'0~8H= ځ!v':k{":e(SH>ַђ+xQ0 +tl3؞deOB d[ޘq`;ۙҽLЋӓ^+DdÀعar>FdLwB$#V,4wr `ڢ"TP)[9+{8{n0 H):Q>„OZ\]CU)Upr-݄ܠme7&݅0PvE^`+w)^h'FV\VW`K\^xc>B\ai& L+Ƅ > xRc^;(1F7n";0dJs= =,9=/.k.KC39 }NjCZcw^ޟ;* K䵞$xRMO +{b.-梁`޼yȑK'tSqΡpZjj:$c9nZƴآ0J֚ %B'\F!n]ilnnU;N>gO-˔rH-A 2c8vTP`򶊔x +;Sn%u!P/2t&Bln /G[ޯ;\zf!R&&׮8c/u Ux,٥!b0+@-$-W4*eDM)9l'B9xRˎ0 +xld!EQ=XJm!dH&Rqh{)Ћ!Sp8)A_V솪V퀭}'J 6)JbwJ-z(A/pKoO+qɅ'P6FbRy[`P3 n[$(M멃Ed1!zuZ%Aڂ7>.!&c-tM.&wx;ŕ $So5 _yػ}&L9"mڿO3뻷)dx{:ɲrm7EީKm.>nIc9iMt-}H>V4ۍY@z}l2+?M-m)FLяQޞîC }O55-N.E׫/۶쪱웺X:xM[j0)6J/P(ʪ1ĖQ@o_0 hUQ3-ܡ5hMNUyLBiYmB%(:ڽTxoTIzc* t9z vZKknpNU|,Xwhwԯl <ю=|nrJ_TR˺No`G:$D躨f:{@m ?A ʮˏTVn,j2os7=/._bxAj0E:\A)Ҵ6uRk,c+ܾ <>>,!bGP`zkIjC EVi4[1L^qlH`#lm[8ecK]l|NPkcFB l7R~q5kqr ui߽B*XϤs^x[j0D,[>(m>RvÕtj)82B3LS/zP^B9 $#L VijE/|hP[gR99å \a_LpYݚ6L t+!Uv-tJ, rR6 2ݠҵ^!e^q}ؐNBSble\xAj0E:r4= BO0fZC,YNiN_(t*$>uLqRd,ҐUrVti Շ!6X%82R፷ J_-v r輳N54Yz/A2v%C.曀Η]>dI]Q߇?ocəxQj0Duڒl)  =@YV!-zg̴U-dاl%## 8Zh! ٰC`,uq8Xo(g]'k]n_O\/Y{ӍցFtZj *[SmuK>jާGk:~_U?-`bxi0DU6 'Y:BH@*]bddrǗf30Aa 9cpÔ2 ƫ :D94yrH.≈ld̂SQjm_x⺾0v hQ']K򟭢, |6~E,*Ђ>NsF{mYb}mH2-S5=rv?K+(m8:$9K9tjl߶DW %;W,a-`J"!"n (\[9c>I\<2QjxAj0E:\e4,9H"P^`$482,n7ǃoh{OJ=eҋjH9Tq ̼ȵA`D]T0DA0Hmb6Zk;yEy1ON;.F>P=ilMےs5-s&חxcNUJWUGB[>xAk0FRJKeI )ݽ0{o FIk #u3R7UA)*F,Qu+۳jdɆQXvkEEs[ gFx~exXd:#R\*Yfd*ľ\_o^{yN07D]`[#C+Y qz8="\3.kܵKupp`VT}L6Nv}BqxAn! E»&$^RLeF@%*ucYOB^AhGQ Z\zR'˟mXhmH G&CIs ]-~P͹;^x˹q:M55!9l%ۅRf%<ʱ67;cEf%1Q}s6|ac*WzN!rBaӞxZ9^6c*xOAJ0$mڤES4ۛ@p3 3 3"ht]VIS+'Tѵ$V]'Tiَm zBͩ(#uv(}79Ż7 s7+puSpI'IsNuoDŽ#Ea陌S$degu(2(uR~Kq|1j{Z)Rt[23g+b 'طL~~y%wj+ȹ ts8ԔsheΜxQj E]@1Pl03)k\˭;\BVNNZ JL/ȆQ b+àpNCk&`K'O2wGwףtA}^^@ hzsKbU*\Z* Hp{c <-e#m2SJ]{*v;'gKəx_ B/~ܤuzxQj0DuRzMm+XJo cLDȐ -H0cuȞwMګ;oV uGLAX{g0y 'G&p?rSh)`iUOL]UUJ-ge/b^Tq8J_߲Me+9VIMP??g|x]J1s@$ﲈOI::3(fgtb؟*;l4eؔ!DZyJ<0䊉ڄIYk7BHD^m/tskrG@|TR2'ugR`h+~ DcɲhOB.ojc&xMj0N1p3 BO ɚԴ,/z&} Ȍdrd4(8eԞG-qrjR)eg8hk+vA, (*6/\jm޶[ǰd, hMVMΰ{} ǚ\0Z G^\xKj0D:E_~a@ 'hZ% +jtfp!dkJҢ c:*gC90¤GEl~/)o@!x"iFj}@)nyi|}֜l3TFu pRE~LbQf[v[L GOc Vφ΀Ro+/oi Ќx]j0F߳ـ5+tBW0c&*}}n_far2!=jIQP +YK,8佀r1t IlIG;bkQ鼶^OVHdx=*ߣeL({UhRt[JVɧ+B71efpoVܧ_\ʑ2_t_l3u/έUZCblg= mpx]0߳Jۈ >0 8Ioj&SOy9i.Q`ƣ ZtݱRn Fn )']=E%h L^JpiR ~Jڿ B`5{+6 :n8g+Sk%=hI5<mڕ3=x%MƮ=nexKj0D:E/CR3 a.ԝ1ؒbrxNȦ(ޘiaᬓFѱ 2^'+VlHƥO&c@wg/BU<6 6~3 Ra4iK, H;Uq]/j>CD5Ԣ]8Ud?/[_ixJ0y\}ܛ@ i*vĽnqzc`53H%#WVzb)O!6^;FGC4{ 1Jk0RZ>k|;=R]A്kRt)]s2 zcf\/նn e~ehY6x~GrY0}<ߵ'dpxKJ1EY@I_5"# tUT^)pp?A4S Q*tѣ]}1 ,zETI&7Y-F)8{ ~ZuC.O RB: ]]i .eL@w8HYPWlV6xy^jIBucRjS>~d<xA1E9E]%N:)AQ̜T9B'[e( EѐNgq&2ZTxDG/鸚R_ˍsWDKE]VxOj0+%fcTs/l_@X7B{n/0;̖t=΃q3#0jRlb^pV#.v4xGKqɣ~쌴4R߬,v?Yθ6dlQMRq"%2 pvhM~47wЙc:V")9FCQlx;7x)]ґxM1F9E\T~MDd.000'T4mMGa}}DMp)qȨcKt i9nȵCTFgb䉋E 1FXm/Z/"p=9۱G.gl0aڻ*^%4 zYiw=]%/8 Y|xMj!F.ЃC d!9Ai!j#"O |<<9՞[oɈsL:%\٘% Q8M!i畲1Ukl.+R{cBv#Wo>_ԇ8^AieNO+3  ݠGYzv* Yni9/_|xMjAF}HZ3BB" !\Z[zz^=AkU|Pe΅A&%̌rhՅxZQl= 2 A2|!(ZڱTR覇X2zZ䙯x 3VgQ[fVv5R?,ܕxU7!a=xMj0:\A~,RYeQ(4F"z:'dx|^H4:EC򁤢1b(K!FXyi"C<^8(=;e%^En^*|6W)cPOP;=tJ)v:WЖx[ ۺ o!~mؕ:;`Vxj0 )ɏ  ȶfKqr0v#wt@iy.t Q)RTJέ$!+KMiLP+n8¡NKU)*WS t a7a݅>P̆aR'\z8 n%nFݽ%ײ2^l^mw+9ntKOgtA=€-8L=1ҵ#,x3w n$HW%'t~}h%xQj0+^H޵-/l!4M#iVb[Fwm/!ySNDHvke4[۔V۶1Vƒ0јR5i0em-VYTڻFֵrZpD:-98x&acԮѲZ-R F3%ǥz յ宔PȊgv|AGf%\GǙ,?'L{B!i9!VL %D^ԎX\_(#=Dœx C;ms+03c08~+q42]ƌ3Ӹ.U&g[y!WD s%TӀRC~#|$N DsR\s*7^!qYI 9(ݰ B4}I.*뾭+.Pz@lڊaѠs!y؝~Bp?hJDJ!DUIFet41R#& n~9qrKaP-iHΑypւqpIeԡB?{#gJq4c4ށ~fO(r(KEwzL袽-H~4isꯤ"X_;d]xj0DIYJ Pu##ˇ}载 0o7`%rdx4E[M0R | 1$;Qǜ)T|>í&p]S;cфAo:޻ ~Y-O]Os<9ͲA'kt!EqyOq5]ҖxMn ɌGx$hD@:KR79A{+EF-" Z)VVpb3FH'(IHy/6Z#o9>Mr`1Dx[~.Vi;m/ًKY͙й#,LG&U|AMwIE;D|F`\bSFKy`nN rHƑʠFCA_Z| EOkAgOqs93pynliR25s9@[Kcv`LuZ} Ǜx[j!E]Em!d@VPj9#uP;av(ν-7GιWVi WVi+^ a2 Q1c(<護իӕ'[[B dJZAo0y0G]7I0}@y{+n9]v >iBd#@Fޫ[Sjn?/Oͦ=M<Qujt=a5WQWYxKn1D>E_`"㞱Q HNva$#c}\ R6+UU"0z=a[/9h%U6Ys.J6Ga4F&gr5WhRaO JůOy;kNjԚ3v roڔ$o~ؼ6JU+9w{axJ04?fY)>AL6Tzs8ND0:ZJh i2ɣC.JՓ *^;rΤar>O٠CH{Uam'3̕`5:LBoB'b[572H<`AA;<[yǰp=QP8.~od[xPj0+xlYCi ]ڣ@,__m =cxy9A/#VwTOcSKum$J:%ghcLީK . $V(bsH[ —p}?7!=߁-%dx93amΔm,|lWɶS} f7`&;qxNOO,T$ƶo|\7/VDU<82esd Џ1:k0eO4Bpc d0.dPas8<}q}9ܴah=UJ޼RcNۢDxMj0:[,[v%tB"d$I .{&G"iy+Q\#kARBNI)QlH>C6TJijUpQuZM'֝d1Dx_z;jH[PFּR>L͙"|#HWb 6Սm .WeJ9m!!,at6h3]cߣMpKBJ!L6M44f<9;óɯ=k{0e"S>/~hxT]6|ׯX˵hH,FP$h(A@+0E $ߥ>|м[DJB[oEUeB`#f' ܊2k*bPRh᭘~ߵ%dEYd]4OӈSG6*x2"P|6O7վ8-l,^ q ##qQ*<-!# t53RLӐvkQd4O,ƓM)8ooƥ >߁*hn<Qirq+1R8_;Km,u~ZJgx,u]Z K)wcXح- &0p[J[YixJ0ys-M3TtL⼽r8ܟ~0.zđ J1NrREfTL z9 zúG% +nqk9p5z['oZu>hבήW1.U//oxeI0]q1 ! ۞y;.cfàGT,JzORgL7G}wƟDJZ )S}"MMoi yuS06׷~3}|﷠IxJ1y>adғtEDO;fYw@R_QT&Z&Dd#/)[&FGfN^-ɱCEO}J9I"مM*6x<ߜe`| 14G4jV:{t׼± ̙|1 SzZʐnօ:[ɚQr+Ȅq7DuI5p ZވI30!S=g:*(%]}/,GpuAXP}xA >Gخ!l|DJݣڝېKXXt3limJ~>5ou5 T zO =G!vɹn|Tx='xQˮ0 +tȣʹWՕ@BpR6{\ bƲ||횉~$gպ[g^Hņ ʐtHCwU^ pZgؙW"ۍ: _q%La r.>-AVѪFR .V(fO0:Fe5l܋ 3B|PH;g3AIF a)b} cI"pN}?C 7:`tB=3a[X_ccYBV(s=;~:/g0Dt=UY!oKHkygPѕA,[e+ pxl9R.B| +Mݟ/ݶʞ xPN!sS.,_4SD4z 03#5䨬zF-ɨAc1Ҕhn%qm[iRug&w+c@ ^qB$ߗc=]&kZvV-+LL)D{4)OʐNɠLa( &gH)E^&}q%8s*l4d@S!V}9 \ɟP" r]]wU>ЖO/DSf*YgDlƱٜV}ꆮxQ 0Ds@%&1/  nؚDza Fkm8SobTP@~G4dѹC2n^F :RIf8f}^61Mhi*b]VK-;/h(y 3|_!.Ԥo²o \(xQMo0W x/'UzQw׉ibGlrګٙuIDЎFؚI%;9ئvcQ{]tbDnPۑh06VkNMe<|u&HJ SeA;YK)L6_ C8mGbԕj$[B[J{L̐ 3At}s F9#{fDs⷏_gnHrAj+!/>Z >0`㐎,)go+lefcXOCo+@D[+ >qu`9{v;I7]grPρ):wo_տIד5xRAn0 |@6];(C(yl %CߗM4I jtvoq@cl?qN]ݙԡZ9!3>4[F;k8U=[ iK얒qLX۾m]W]mΏ47b b%<z4[Bς$RB-{IH2M*̙8xę6e:;KwXvG+B14A xɅ,ڍ1L+Ɣ`% ZS4phEyʹܲ$_E}}~q V\,H.k_^#c$v}6*o4zgxՂ S֝qaCa;B|t d0UuA! ٙÄFlG3V/b}_фz \*e!eV7]opڿ@m8 9n vqwӬ~x)ixj0EBI(%]4jqdTп\Ü[ 3(!I uZ)/Ih'X^,TVbB*ȸim )F :hAk=o^9°_|آ7Ї<; tJ)/?]Q9`]"Uzf<^OZ|^ _>YǍcSϟ[g_7xQj0 D} ] Ŋ]  =d)󱷯0<^;'FIȓV 1P"iɧ|Xi"DeRCYG jȬO>a{\7@S8{޻N5n-8wf]6k);ފPeOh,^^xJ0EV}$i6, _0hmJ"v޲2m:jj6#>B+;pgՂ+t.mC1 71*{^9 {]Ũ+XJ;NR%'τ&qd;Jf4}G2)غRLQsQDirUjD(=洒R4)pZ y!3hDNu9PeJrKJF XfP7x0E$KRDP.Q { ֔.{+\.rni9+,"Mw,;ksrE/2^1L*Q[Lc(GK&$q20{J~ƥo? Je؀2hjzh$.BV}kTBew?ޮ qLMɹ qVX5xNˊ0+TZjDDt1EK؈MK0TppRD!Q:WYWVM˵uYG JKBK|7Z!rqC%)Q?nLSD ߿ _ƪ J99Yѧ '77mݝG}ngՁEry mfp۠M[}~eqGZ Kwrco9xj0z}ɒJ)RH/=U#-#S2 p%עZ 6dVR0I,Xif@1*zt2^IRGz (p[Te/G4N}A*}bSf^I~]z2še$؀ ܩogXi71 q_3 MIgjQ-xˮ0 y AtC GiL#ҤJ3$Til~;G)SNzjqyIR Z]OvRlNT]]8w}3m i swX [ڮijK(ʮ,߮q{=@N $TIq. z|b-dg`0jxc ecc"ZsS5@ q6DZBv|@"1Mj'`Wn=$=~" oDC^^ ^:KWvh6$~XZ`,F"wpskc< caCFKa/ M7>D$1t<쭱w'2Z?<ųB_٣.1|}?vŸxIj1D:ſ@̓ !uhr R# }+5:"֦,1bbBeF3m\x&Eu3"]Ih/sJsP<HocnN~Okc3 -X&-LTQJv1?.Yk=¶&?ƌFJM^n0,~5~Jȹ\*>ŃGUo"P)-))$l M)1c;d DKG&ڑ8b`Qsm>jmߟ'亾ő&:z]ypuUly±q}{=EvuE]XRtz\S?p_yxAj0 E>v]epq B{,'fN}nx/kfʨViuuRFJ+ 6ЊCmp-;ji4i2Q/娜nuq[-zNk3H-kdf/ʣ. |-VB٧ %BJw tc 8B|;KXi\v-2f}FPzDl*̘s$ć&:\?ۈoxPJ0+Q]i=z|s&v=ϏPlUWJ(JY"@XO"yXvw|zI]j ҕ76 2l3Jax&0`DR9[G7G`aƘ#m8B?gB#08?~6jluof)6,*8V[ﻮk5~ndrJOh K΅a;[i l128@#1Jg7 ^"йBB/fT! L$[X&{󟿊/xj0zd#ْByCi@?eI ,|˔sO(QYuFZ#Q?u­if1S?FNfGuQ>c7}Ę.{շihm WR)sVK~ug NA?{fVg̓ow)Kk+"cT5yE'{dX:~-O+#l wxPAj0$;u(%c XKH KF!}z* 3;Lv{FPУy{1rb+fRjA*'(m/[[u)nN)empZ?^Vr4f]Cƣd!]~>/P\ڂGa;@uXQ?+5/kՁէX:iM`ĬJ[zOp/},(ϩK>9dW :N /xRMo0WIg7Q Y9xcձ#t'- e߼?MpВZu-:ڏcT&Tq'M0&{U˱H%m$wcVЖ2dܰZpj=y nPVM 9d U?SK`AZۓ2GX5C|1:  }| VSѥ$ĜIpq8|=p': ʠHo 7!+?k/n VޕZ|{2V&>Ge4jMdje XFۧ՚zxA_6=T]b]@gw4lQ讎3Sz:&s+&xmn/xPKN0 @G# NiR5ޞa g?W"hZZ/6BGZښ]GgTA]Z/\)2]$Rblg {zC"-p1[VO#qi~sTJj)E3[cS|t|!#x_(C}'g!d!"Nw,p#(@V)P{b &(];[i QF{ " Õ,[1OBNC$W%+_|!xPAN0{C"'ݦBX‰)qP/pYؚ HNTkd:p}4&6BSEa+%W7{'ȋ[gyopC\/1.sٟQQ8>B#d+oKYaG3+y+vz.f8&Z0אLp`B&C \`Y%ƞA-> K?m*} Gߟ>'v`lfpM xȔO&C)'+dtnĉj3f'UtҗßŲ/zsxN0 y @G$k3!4 'pg6S ӓLŶl~;E"ЦZbd *)zQ {nHiMTˡn^r,&NEW$%Ü !DR10LXK{^CӪeYc UUm'a4hq&X*K/d^`;,H|X{A*"n)frpx01A`fπ[ ;i%pab,xю EylfUUTԾW. *6o/٬Z/ƌ^; u5 E'JјӍM${V9huPP{V;'Y#}M)>c]2M^+IMF6(10㍲?nket'oZa=?ҘA|tgD!V˼Fq.pH@a5W-EsE~anKtS Ӊ(h(5;,.dX;x*a%o +!FG';)k4_ܲ#}AKpfBAY?|$Nvf3Dr/I /ś5r(sJGN#9j{8Mpn>?QxMj0 >.bV~RBO8r:[uJ颛nY 1ێCfv1#?DbleW'Ar{Vc!LX~A4}};©hB3'tXk۶D߾iW# Bڷ-DVi 6d3Z@cR4~W9Z6EEg@BbvEG`tUW5=y=H >CJS`ʹUD o#ePQonV(8!*)muNm[)Lp_ g[O> e츮V38[= @XRЅ솀1PCe)6h+vG7:܁k7,9a#"/bk*7ʉv)]d xoj0 ſ@;DZ󧌱l0 [^L~O@ѴL=;-[ӛFv~ f NYlιi¶P` oF# ^Sޟ3hֽTH)f7R?N'.gRWc+{Z й!E\pה D"G8Ų|\wS*edyxsԹBBIL "܆XG$wHǏ ~B7xRMo0 WWm] X-Q$i(6!9lj[5AmlcpkKh4Nnu{1a1CSjT'w]-usPE[2X׵܇_ɝ|2 rP:_?¦mriFJL<"!1FֻfJX-#Fa f(yWgH/A0@n$Dn)'t#9;"Xtkgi`r,LJ-K_ҧNäpa.>kyh;ѱS9QXKeK0a9&vI(j.|U!S)9>(k" hy.l3q8]K&7~Kɻ}M <@d{;ZF8s_,=Rs5NJk]vate5g cn b_oxN0 y 8jӦM'x$$8[==iNe-s"")IY*PuD;PI10Fj5N8%+nloLCc#^/1&sXs"{@M O}voQ3iR?`ʜw(OwbC>Poi+7VwfB&1sdAxeP *:Wͷ?o)ԃx[j0Eـ3!n P 52  snyEg&Jic$uZ':x05@IH<{ sd$IP4;ڽTt ReϯﮝBW@fDglyҼ7MgH/8iUaůZ7]IWxi1DUm` i HF+Z .$Ǯ g >y6",c̫F)ibO+~N&qR*7JSP2EA[;|6.>}`xj0D$YvBNJ+ieږdJ?μe$"0Θlz4B9K%ugh) 5vF+$'5FW[v[uHjb1&mg/}$r#R\ N\quIɎW2Ž 4#}i 9%3IkLWxot m5Pz pg_aXj~%.~Jx$xO0s+H_ZVHpn=Nؖ3iߞIʼnd~o9Ac:5Ֆ4CAꚽF*a.-uc 5徬]Β…_ CO.<^b?B]VҰ-P&Ng3.#biZϧLv@މf%RW?9cy_&c7`&#>>%ߓZM<` [#Og%u֊D[`aZ;3pa(bW+4(;>F?6~< f¼_Ȱ$̀Y|:md:\7?_PxxAn Eb. CUYuROA ¤Rn_Gy*3H49G2`کɍCQ9dYN_ym&F#5&ZRnHҍHK=Y+\ҍ>\Kz/F:i!/Kjm.9WSYyLW;m-?(1$` oByer8o7 0EkTxAj0E:vYFF.BO0FimE!u]>|{7MFĦ2{F) 2JI]޵\\ n,6b)"Lƈ3ÐB!@1lJѐ$HR~ۗ>D\|kOn84phw?fѱ}p7b>yT$p7Șr"cBؖpn k&Y-i}z yZmCeڢiPv:Ij8V4`9u%O!7,3 e" AM[;H)鿜~8ӈٝ Җ4EQL`cX O|J Ñ8obf )T5LbFyUOz[ϛ~>\ \fƒ>8J79\ n t<4Kb#rm@c^ S{4=U\"NhwjWF5n!~θ:O#?!=WǿPy٢xj0 ~ CݸS`; AƐq笽o $/)E"ppT䊪ZKr[J`#F^nJU+ZKBLg86DKOxu5-=ɦ7p> i뗀zȚ׌$bG}c|NƉ!aLݸ #*gw;p>e؈Q>BR)jҭSNOC1[Ҧ n{zwM xJ1y]&eN$㤇uQ,*W"hvH#AZ8?:Cn T/7 6HVV#;=x x*+॔8!}A[Z osdKI32Ou@߷eϱd!fS\>Sumc+ߎC\+ÒQx4Jw;qZ|xp x_K0)66!2B;{M?6%N|_rN9\iYb" y•_!OTD4e#Z<*U\e"Rj2BUbYic!S!g#_nSSw(MKH&B*KY8[KACHh s.ɼ1[;̳֡s:=h]Zqo£igyf$5cWtߎu;-25Fkj17RVm]w_bv1b-?}Y0oTp^+2;2xRKk0W̥ƯRB/#il lKH,,Mr(=I"hvlTDM뭔VՅlmu&*rIʶ+hTuI,*IeUlCӻJ8p OQ@Y?{6ʍwPU[~"Ey΅r/.mSB׉)ع!uru nf?óuF;i1B|2BpsoY gCd=)Y`l(@(7=R``䈐企elh͵<"ۼ̢3*$^MZt?{𺃻ynBѦd%-2n _|QJ6b6)`#۩,rNο99$+&' qH%|6GZUM }ju"m:/%/O3u|:K{/:xi0EU4EBR@*F#X[clq*pNDГ]&l {cmz¥b\͔*'4/8L069çmܘ3˱[&2zeoF4RV)<b­y;Bi`G`Q i26`=iBT*ypO.pߙhS"W\CG`vxPJ0+o;E$B4EV7.pU"@-dD-tz9j6k)nZFa@(l1QtN!uU>V5:9gέ kplAs,/C^v5.;y>Rˑ#\-LSmguRSrKxO;n0 } n@P d*K=~4:v}`4*{LW.[4BH)G/9o6 њIh'^3ÞȬ(gFpy=L(JʾHigpDIrD=QKwF{mk$%fxsG5)TI|ܮnUR&kn+3e3%m?),/]u )x!4g*e;<\Bq_Y|xj1D{}tXcI0 ^aw%o%)2N1W80MaRXɠt IMбB5 HP0$kMqZh.Gǝ$;2-W@+\5ABM6Os<ÈBj=rnN{k…>sNesFjaKɵ1u1 9=}{v^xj0 w?Î'9rt/ $K8зo:t%@O= ec`:j&I%̲9PkY9um2mw>Xҵ 2 θmp':,'w0Mm3Z;xǨ.S) 1fKZG,/1kJ0 aZ2 )yb.P"QqZ$Y4(5W*P?u~G]AlNxO;k0+n/IeۄKdږ!J :8; *9PŪNI;&P!;lۖ+&^24MCql U8JsPu2 !&x=kE3=N$vЭ!BĖQ4q9@jSPz*R!@Ȗ}J1r4uIE"o %JJUN?qw 92ͥH7GR[_&~uOsoou- i۫9i`2WӹntP;ﲘ_b}4Ǻ?!~pYxj0D{}ƒm>p VgKFIKBf-3; 5v랏VAVIn[!0Q`vN8eBj;#TɢUZbQGc8Y p=) 7d7Pm yqxjʰBW3%k༭}Idg?oe U%˴%`2sdn=>c0UfdW*:W?~[݃}<xOK0s%鿴@APXf'mMBޮyAR5iiuhUYjTJ6hUNDL3uUbwhk(Zklei4پB֤1$xumz، Ul;I#(Ĕ! ,p ab@o3]Pr1 `70]9A!3+zu<G6?^nFi m /ׄt?_T/xvGf.?$>ݑϔ!xPMO0 WX\QmfЄq4!N]RPƇ8p[َPQ5 %8BZhTԥх1Fو\]֘k-4\.yK4TreKdxp;FmڴɤqUQdy У4@yLJQjMB/ X|KEkJCa~9hxQj0 BH,vRzB'-YH7=A50fF/3):4WV"gB936xAmJUgWm1s9Fcm>Gk{/xmrt"L1?e O9HD#{=˶c߷SuJnX(xn1 y @UPUB`$$3ɐxzoO #9wbNDКE;u#u}SMM U=J5Il(0(3^vڴvD#5qJ]*NJbϸ/c"x~Jdf(iFdWLL=0,>`gg0\ Z{*E0yB|s`40+k$ێM=;3(T7YC ;MU%d;X 2rDk|!xW`w-kgK<ưHQKUqISwB<#;7tL4/'Dgt^b`Yl3$?;.U{S=pVuC⫟CDkS@`"xPˎ0+Z{fg(Iq :3`5=H)=kCD>aB glk i)^lc|ޟAh5NTJ[.9g֨G<68\:Kb|`#+}Qm|RaYbjP(9kP~ުK80Va5[gqZq4bV4+}{1y+^,P1Tzm'JTr߷cbJB[rlN).ypav9E.xRn0+qdljV(BHLS'x8R$-?͛y) Bg8Zr 4*P3FjDu%U@ojӈJ6Z o[VL%|Jh';;{{;uk7ep!8*yYܨ`}y\)˦Ve0RAg!τAҨs' {w`'C@CxO bC8T@p-=S$#hrGLd]CX s"(X{l8Hr([&(O&6<ظXØ tadsX^nv@4]Q9DYt>xlMᬎh2>_(sw_?fywJv`f% /vZpޜ PS  dM8ؼY%] +>xJ1EZb$G _TRaČ; .p{(j=&m &%,R&'h1CMCFGNPO6uɛ&|u0`3F;չKEN+S{}?OiS]`ZJr[EަExSK٤Hu1km]J3BBeC̚#, \qz(xQ͋0܏oۇ,.DpA봙aӤ$S;}*x!0s8l ؓ5N=@愶0Q`8[G >ߝC]Xm5Z֜Fp%&m=\qmsivPԦLWLTL1=a{8xZ3\/1.0͔2ͩGI 3xY@>^/JAq /U5Ė9ab+L̷;* yo݆#|lݸK8"Cp%D8u&"7rv+IIU|bne 7~ynjӋJQ/)LRts [i*?~Dxj0EYI4.~3Mwb`s9ւFN@ZXi[t[i!hOF*"E NN6x$Z#sM]U+pkCUt'6_ c qUsLх1kg Z)$"ZDYc.S1Ɲ!-`' p,xȓpt)x&|ڎ:eMFb5Nnɪqiw. Kђڸai9͕&xOk0s/^?PJz@ =4DeHnW PzMIDjn;m+EV)oybb6\lD[ZJpRSJs28ii P[mFeX O Ly߃\b\I C?Ax9՗B ^c}Day& %?*h&Q~]1$ _(_Wc3ӻ*2d*7(a&_r %eRu,w-J8m* ~C B*-{ AchK  lܥcepb_62MQׇGۿ~Gήxj0 %[v(%R=V,AUr衇Ӳ씌qk#RXccQ$1{4H q$s3Dղ Uvx˪/><8)M^ .z1r(%n svvQ 9fO[Bb`/*3!\ C} ]0C *{$qwaxKj0@:\AP&Rh^@GFȋ޾ BWכ(*ryce%N=k2klr4uB$!ڌ%f)Fξx1qSmpjm/[2žuyGC- 5w̽KSj>$}9W1<_nR:ÓWx[j0EـH~EnP FQ-j[AxuJۯrZE m[8:IМʪGJ HyCWJ^Jx9/U k8XhC4]G[|FK/' fIBnRe[pIwҘ 7%&l?a gx[j0Eـd˖Ji(tci 0Wop甕p!^ @rsAtw(z\)hH8jF'qpzTm^n9oK |kc;[,g*aˑ TeL Lgϕ٧kط'Mv*B~xmj0@shb `23c޾(U =^b۞Ѝٱʦ` M E8(D1gIs2xT**pV Be}ֻ>FB֚oΪ` Ψ: σpYWT]A T!p{)>?6ᦌc?fۙxMK0sזIe+mmJeo*"gTVeQHʴ*\^uS)8sEfp ҜI]P%("XQVTRthTʲS譃9<Ãæsu2ʎ73ZbWYe$fG:;kf2VBH5h$~FeQ/^a:v<Na =4k5L60#2/H6L’m("0֣αnO>{k#x o'n/5x38aX?F>4ΟxKj1D:E_`1!0|}Zkd$yLVEQ7V81+Nj1O@\1[ <*b@ZDoe>߯pjo_GlVڡR5AkoIc`JPe@Nrcr)--%?K_xW]o6}篸b/[v ͊풬A +Dj"~.)r,PÐsǡdZD@o8qƾQ8KyqIO~)kx@0IП<'O$DwT-\rS #*hLSU7zS(UTXkV~? #B1L'/vO!+Xj6]L#mZ MN( *D j;iQvA4TgC^% DˬbDl,5vD(g+qeOKL`Y iRuU%<[1DB%SJnE&45Ht{aUۻODnȸ_o޷dg%u![ `2 # xJJۉssXAXZЅ`[ ^Ƒ? !lDh~%ܢߝ`LGxfs{?ҏtv,u@<7[4pvq3?alo}+k{O{{?^\0DiENaG;pJxvuWqCbb!U%fJT`VP*3vt8OTI7:UlnnJ1ⴟ,=0lBwh?#HC'tP(R8e"l1|PKD )`KwiJ0 c >}+G8 ×  7q+JV-cr%]Ee?v |ִhy=wĪxvJ`KI"yvul߃hzy\rHHj{fצ!\daO86DHR_ѶBTqE BQsC,!W`늹!'NbF6crQ$,jGHv88Jeƌv8e뾃;ۿ.ɶ-BQ뷗Wo?,T!jrrIn)U2!6m{ɿ͔"m]4JSݶi+Ň}jĩ8(쇐\’@;=1%[#zk+'t[ݖCcE66% ݠDXJ=. _}ۘN d1i7p/>)|i!Apbr4T̾{O]7T['ewV[=Ԧ?u2Y448,O$[-ׯCx[j0Eـ$%9Jt#{1ؒQ@wt_έ:88H@$O飦65j©BG7: #g\֙uG1h\^r. w v=\Z]Ze9MTNO(Mp5s r{um;>SE}#~2\,xRK1WxYӏke" :t4I5{kfX/)Pp$ׅuv}uZʕ]_ZMl62#7M]Wkv`h wB/B$x-!3{(uT]Y8(LLTL !>c jaaiIp "p>){tQ$!3],.}߾y~Hdd9~Q,`_-+2/W?N`OnCC0a+O>]6.!8D8 &"Wr II|bleY_#_Z_*M7=fn)H+E3ӏ+Cp0Luw# \ > 5eݖujliՍ KWQ6NOɝxMj0F:\Fe4,=X[2WuW, /G"`R |\ .$y?R׏i3lH>C 0JdX +Rè{d9D}"öHf\>B#[%tT\ruu9 f0<_oQL.xp&2@IgHa%-B ˥׻Atj>Փt?˾s[/xR0+!졗]hn=EeH2i'[ -=I73oH8FRaMue}*(N,gQ CUm+!3`%eLZuAys5|ca)ZuQ6gS˗y;# TA!,'; $ēa[z#ȔsqIQȾlec?1E77\=_k\&bd}uY63: ߑM)[陧bGO.O|}9A3ْV9,yWG{❝30415RUt( GmS]v Z7xRn@+Hrؕ_#@D$L==cvz HH N]U=J,o N`)B4aZuI;Grf&[P;  p2ViAxqɲ D@ @#L -ޑ'O6\)g3-$8x&g_57@__؏p=e¡B#َOpLHZHl7#U(+e"/߂C\rHve|=|y2Ɛ =CRֶ%m.[!yg+DΚ>r&U=$"$ڌmJz>E)n@'&0A%r;@GCrg Oۿ?i\vպP.p*USJQQ7XW5j)IE[:d?һ&:*x͊0z>&7,as r\V-#3fga!!뢺f"0v£2$F9hO8u=ڢV`fZ+PSK3 rN8nOhz`9ex:,%^-))҂!Ǵ|kY.V)fߖ|fqJ_VBJX0,X~{I[K3 CpƸSaspsÙƚ) V3m-֌Cr-#}i5Ps&Eκx;NC5?b85`_Z!зn=P(0b2 fN{tz6>㑱oaZzow؇l)WrsZU0 $=aToI%G]OjY+~iFxAJ1E9E-uђJ2dԅ A/T'MH/-@\}1 #fIM>SB#MMVjMtg` /!)i)%hbN#6xOjm 򓏍˔كhvZ]*%u>1<}<~@ +uW.C~_AD=k.Fc3Bܪo,kxQJ0EԏJ&Mq &B۔4_{ -Ymђqb Ŷ$jk]@#M%oӀ6.iZu--|-FO0sw&xhZ2*,4^V:2췝pgܩL[Lh;L+|^rjHo?ôlTN %/m= S $Im .X7y#xPMk0W̱bٖeSaKJNf$jmHZ Czzo>|MW mD)UGj[ي (:t\FuҩƉ!JΉexcpH-,_dG{m#lPڪb%;)'8 yϕ |Bvi%7^i*80%~N5RgGq%E6e T>[Xg_r- .0yȔ{RӸ/'H~D{Ǝv~|R˿.ʠ}MJr:q$BcU^H_ ֻxPIj1}L4zdB %lak4hC~'~@ȩZљ!:-iq #ˌӒl𑵞ب:2f%C\$iK|Zn:| :Vs:xlEԳv0I#w@)*/Z'ȽUg#]8+ YN+<ԭ l*tDl4{m'LxDg GrxWmo6_q $DtCE&k耢0(d1HMb؏ߑ[4ݾCC=h;DHCQ8X"i: QeEY 1f-PYfiyty$ie1i>$iV+n+ xo%ZM /v/Zkwo) aII0Zm5kҺCx6eEwv-ϡKX2 NTҢ=)=Is)Ac!FF6#'9]j[P|RЩ⪨^ [tZj/pi;XTF}]a9/fKel.g)|X9csvbֵ93igY! 7 (p ߸gbu2 B n䫗|nEc /pAEaiszAkS&`0;؛ 7Nv@O0vfӝīIv'ZU0)ȼ~c`dfU^?Ÿ̆~gNe6ءaݥ-?>ϝ|<.)*/r Zށ[b蛾Ȩù4=ԛi+;@=V{ݬu orضn*i~ ⴟ$W_% }\zERWb:4S!-{={z;sR1դZpEj)T Y?!e{&PqQ~>[nIȵ滆}ũ8A84!}ÆZSClO$5Gˬ߮P}ZWjv7?g[ &^9O3/tס'3T˙ΤC]<-7>9N\a1e9W xH%Z ? /Wnߒ`N YMu-COFرll ȲqVN0DĢ90&xe|B sC%$Rx}TM0W.Ҷj4i . @z_cG{ӄg&fƎ2J+ժFHE. r[bK2Dz,j*<쫜zM}8U 3ȞmO-~o@e䛍෭­ki `RDcPk@HPi :m;!6-`PHj;ZO0.w©!'`#9  AZT߬IJM3%AXL~)+0kZ33xvs#t5ev$@4Pwpu>Dgu9#'KhcZOf!B|`D مD0+;,<}8HqA?KAe\TA~y,JW,pt `\àn %gK}rm a mjl**5J95ċhyj=p UpC+瀗L%ے)I NBĤt<rݻo.m^, L?b_c0ԅCC?}3"y=\ sٓe.{Ӽ7G.Jpg:kޢnN;3ns\ˎL}4JZd`yZiZ.ʟElX)3IZiR-AțqG'IRR z?Ur+і:MJAj)ELO ^B:?xynܳV&{Y-3`B+A+B bkc ^lH 9OΔ'Ӄ^| t'ݹ]+F6`B|z0~z|=bL| &!~sLw{. ZZ5(8VM)'NevF?輼xKj0D:E_FB,򃜠[je dy sţQժp Y{8 l [h | CRP+U K|p?F0D5zq(ڥTxmRͺ]xև܂8Cjo5hO #\~M%ÔSF3KJJT?=^xAJ1E9E-uRIj " 8^ ]'MH/WMKQg$$ ^fM.83 90ŔsD-#4 Fd>y?KMv[Isށ%om  H曮KӔGط@ޞOY9-)CUus[m] h+g4'|zJU#M6_L*jʐxPJ0|WG}k," )1{03L`BH{=JgޱLXB*PL)Qa2CYKv! X*KhQ K{[d/3,"xAK1^&쮈XAAX*xM&mI$ߛ !yy`^^sR\yOFV¨CҝNrz]#  q%tÅj b+N26DXᴃevt>b@sQK)לl'ȧ8`^z }@00FJ%cRp bay|y:rJŤm5FMcΦdXls1|X]a>=8?Diؚ3a֫2lm)uLꐚٍ/`Qعu'(V C jEM PUU~O6 n 2xR]o |WcpƜ?ҨHQ?x9/QV}-3PD+8hu'Ʈ{n=J [UDO-} ںiu/Do S^)1ݮO[uHKejAּoa%TGT_T9.q}ʥIE3a2PDE8JЎc_@#:@˅XJ rsRIaAXgE6%UmC csTQEXT:VN{R)=_, 2]+/&?+%uk`! _*G,M!cXr_>/"©7&v5HQ.4#)|`M' |R^UxvIe}cBt׹5Sc^ $pmm$2W-<-Ag1!w]Y#^io3vy Gid#ԪP)*lNTZ^7֕fǾX;1xRn!}Cc,˾f)r 4dFٿ3EEwuutID`+O W8R5 ]/rն(iق#v9AzhF56'~`õL1w\=<Ƙn̄cѵ|#x9JW2L9%E)dxse2s= ƞkmxxz; 傯43YՐ0d슋sfZ|AoGeX [ʌDʤSgZM<\kP2l@ǔHMQ=]YBUʪC:>ؿ1 5u.{y&JƸpٓQRK E3DKLAoa6U 7L'ܢE}^3 ݱeh^`]M1el+"DhٝQXrIr.mӵ n-xQj0Dul>\VdK^Ph/vkE&~ ̼VcCҡ:1hBo-Q$*_0'.;ˁ`G%<0M RG_*c*3hk0XCw[7U 2R/"AoiNTK|HRsWDx?D=Vj R @mpލ IB}8D43' zԞ=xSMo0W-fBC c{6#e=,V*qo޼ɑR+̀MT%6MkC]'w߷bH>C5P[$C_Uu+9 Ue,웪n:kCG\'x!/sY?E2#[PZ9-VJ˙RAZ:af)c&@o ЀpɃ'M)a-C^OV~{bythLJ% H:Oq .4[0+AWl:?-B=R|qj x st z4&%ʠG,?_Nl?Я=$1ŹxJ_BN8n"f3ز%%B9-ƖfoyBNMT'5g"hsrZ팒}ohhTRF5Z]'V:2Uw}uJ%uqj0< oR&.|&MUSiUNRU%f`x{cOf>#;8œ`5Q |v 9p?d˱ ]XN!C%i|9+la #:ѭo"[V"X)B@9#\SJ9S<\{u`j0 i-h:E3{:%G[stg<[}T?.Qls\\ 'N1c9=ǂn/HְzQ"X7[No+V ` ?p Â| !F2[ R9x<< ~%鎨߿P нQ3Cz}lP{A'GvV-%e kZJ}װ$t\'>PCЫ^(7wvSvBd?J\˜"xn <W`l(S"V3E\5}mO^kfaV+-*C ~4frr6ުi;f<^#==5^95둱׽zM^r0Dxt7}M?_6 ɧ ԠH9>:fGIT甈b):teF&/w.Me>溾9:`wHg7O(G/ /h]|޾*C-eH?"0Z"#xJ0ya/^ܥٴVDz}I3ۤ6Sote ?|7Ix&k˺dl+kki/[SSQUk:j5LA7Ǫէx$ʮMSiMm[TH…}S q;grХ4u{J10Ie0;p!L,B\*|£*pn^%lo=P:j5RsY iz,e|=hG KJ]aR?u[XxPAj0 @vdYJB/e91$qP i4L̨ꕜ`B:AĎGBNH<赳^4~ M0:72~k2kfz`՞yN B@cX+ 6zQMIX3Sņ0Uxx,l52]m oq9w)=Do,rdxj0 ~ CىS< ENLX~iǎc B TѲAZRH-vx- URAB G&N^n+SL^cL rωɕ FkB%bK()\>|Br3Ln/1%[xzpD=O#>ƕ*z_lj/xQj0Du$KB @@y뜠k oF:@cT]p9D M=otEQq ( 8PW4ϜJ.0GC;?Z+?;x1Df6LV;]/"xTMu dбs{J\7j\\xxKj0D:E_%Ya !LANВZxdysM]p\[7316㝂 ro\5Sg3e?r#rQB 7 yrj)C91(~\Аxaj0FseD =$TAqao_=A"L:(m<%BqEv.U@6 }728DI䌍s:|,̹G8qmC^?@9Zhi׹V1/XwKϜ7tVk$69ƿo<_.JY(xj1 ~ =@e~:R(t/bIGLJF Kߑ͙VNK7m{Ӎ^dA8TȚ:in[CF;G2Pp#u{"``SBޝsy(weڤ '\+2R?ɝzGTm/xKj1D:E_`B%/`tg$ke>c>YU chtN&L^<c:xb.Q0ez>&grMȢc,{x^s缄Z}mE0CT;_H*nrY [,\s k(e/ʾzW~8OMdߧ?nP[xQJ0E@%&ixWbR)~]p+-NcB?151r:>L՞MH.m32]΢0Ȏ&qpBoLv]v#}CUfЄPomM1Lr]E#m-0*/ ,;DmbI4n4C>0MR^lj)=tkvwέ/&iʍSٖrY@jnoJ}υǮt{'v wTc"xAO0snX601f(Sha=ɼ7Dܙk"ui>`iCWj]Ψ# 5͌ڢEf5-m *T"<:Sn!R7 m!Pf& 2eJg$eR&d)I?vuYBdp?#e$hdyz&$|s 8wHSx#Q:[aNakRK惋a3{'X8KƜxN=k0+nlɲ$+ sNA,d}{DPI˃$'НaNzulBKm,O!wkn{% JFu.GιB~r!UkR@H\+NP(Fhv8rѰ`W%'qvybg.B3O9乀erexj0 D zʼn$^J)\( XY(]JEa "ٴ(["=̦ɪVw}3(MQV %=)Սw5aFk(tZ>x}ל )'hjJ8NJQn]5 B0Qa J95/j24^hBQزu!WO Xw$.(#DKGHf\J5r gA1Q`W.s&8fݦ o8 /!:wOI|ߡxMj0:[ o((z,=[2t j`oPYgZZA>*Ѱ FjWq.NQ9 8 R ýN \^o„ Vj-]ZeoR$xBk WJa ~9 m95}ܟ<. _A'_`N_sx955Qhsx}v|-xA0 qav:m+7@&N&U2,w:h\RRD0RW`:dB}9͠uӪ3ES?4u}.mgzA `UKq 9LvL!uAݜRM \UJg HۜlTb`7a^%`a\eI`̟ XWgҼf*w'`G%5QS 9/<;_`ANRp4Lg*\^g5Z^/3M ?e2Hd@(E lnz{79*!`Xn_.ڑ6yp^t9,&Gae"0FIJcG1q sNE#/~S$sHƧ7Ki(xKj1:E V?&v!dE \.yDԒPUc{ ċdUP?$D޻ytZ{<"iuhODPg*X) ؏C7Iw3n?uxnr[ΕcYrF9~ S?Ls=hv "ϣ1ȱj@ m$qr9FrrJUzL%ߖZyuKp|+[P"))o Ѳ {?o-/АJa!=5p.2~gŝeOVQfvA-\![m Ϲ/{D^ 'G{5l&mAQ)r_~HlxJ0y,uC&D8L IIT7F +ݏM#LU 3v}/J֠@Lc qh@ ZrġFSLĘ?-?%7QtU-uDR^ woӄ\CdJ4seCFy//o1l^5 %y»{`?&o&nb1Q>zF2/H,f_{mG'ߚxNj0)Kl\>| qp|Mu" !!B'}/8glP6t΅;A#Ze]lBsㅔwAk#v7RXZ! cxC.p9%|.o>UJhx94Jo2\JAP\s8MBkt1+Ēӑ|13f M韧>/y dExj E,j4RJ/m1c>-}j;=;Ip$4fTZH)!Bَ5n  QOqZPR o{5ҌJ~to^Z 4zj$+ 羗 uq\W0G(ٖ1vP]h 0|o?rxkj0{B(@[ j r0FsF%'EEN@dGh=#4;Ĭf yodFg9l Z^(_R@*X4IP#nwifgG'u#x'NJUS*_Ή[pxQj E]@DR@Wg#$cp 3} J.8*3ZZ4^Ej dFF?gcJ*ęQCDPZ?qR:emthf9->K ovGPF`ZJ[jX ZCa*]DYoF[)Nj98L >eMߍwu+Z-q-UQ#9u֢۹ uLny} ÎSy>m1l4VitnA:Acbc%`t2WQ&fj }F'Bclop;6M~S!b\&N:G'}%RE\q?t<5x'a]x״,ULJISs4aJ|2W!F18X"V ?(j8 1kB{q #!jD [uk B1J<.<|Bgx_k_i2}~3eSy)33sp߄{ԫ`̪?`UpȑKx͓M09f$1n6%ҪzBTL6MiՏSU.3;3#|B`ʄim$MBL5iLɋ tփV2InB8(E5-"G=ְsGx5Cڸ=p!4MEI67ʄEe` kl\)YO7w` <]]_[ JQjB?턓8`j O^ u8uLJGx~0=48 hx|a 8`H(jGf;k8H9hdBPR( TڣoK@KeVkP7MN> ,ǮdanfIq$L$AnkJFfQT[% qVݽuWM#ujt'mw4|;h4isI=څd`_W|TXL߈OվEre*~ kxj0D&(d[!@Ph`%maKre\K)iaflND4k:%u'%y*.ª-(dL'+NU\)Z=q,)TBVVj-ny VxqT)j1N]״\pLL ^q%DpY~X24 h-.L. b&<ⲺfǂVe}lPg&Wb/=W޾{sC {}зOYwmxN͊0){Q-e  Fber3J5aq'9 8(: y'Vm&baXx)-|c)ƌ9D2J E٪oA΅8M(W ɇ D.=&Y |Ze.AL>!Zg v.Wd{梂VJ);$د}B6?nVx 0@U+S0a(d:ҕcȽ ) ­S7ӖO}d6(^Y JCwj2yLs}-jUZO[[?o"xQj0 D} ] A^  =&S{ү7U@/R(4ZU?Dzd'CA$cpɆbcH gNxvF~ [Mzl|moǥn/@FB,Àht[{&=_ ھֺC#c5!\x7V:xMJ1F9E-u1CRN2"2.OPݩr;M >^"L1BGQK,O9wYUVfY.ZD}N#+:KW>੔*pL?{S%m2]#:$65;IçK&pp||9>~eqV}Θ})k\Rj Z b@zfJEl˥qOxKj0@:\E%P mYJ ȚGFȋ> BW3$/cc ƈqIt)Zڡ$ԅɔ$m$hِ1ɩ6>jm m1͹?>AgL@D F՟]Zo;C^NgJ+PEnVېx]j0wb/`PJc'XiWuhlU.u{ҧVE{8t09bpE(XBG6.1Q+UY`b3 C)[xHӈƠI֦Rᙶ;\K*$ԋu*lyڎښes^a֜[.xRn0 )x1َ \XDBdɐ`Ov؀' GѝMmi2KjjNk V{:1c$`jEî}HҮiwfimMo4#y cHxv}rW*mTW`#[)EN_0;x!E2#YCۅYr 1_)2GgHd zIT tReU,`oJ)%(&!!No?~u0z)0a:Up=cػ+^ѹ 8]]6 aH:y ECvd,R9o!:SN_E{FmvIr!1 #'%~r%ī=z20 PDH;7{!~9x]j0uSɒB`%bmg9A 7|A#Rd]2rL6H&c۠چ Ŏm 1ƜR&;rAZST;o [;nί|Ime kaFJqke"+=#LpyT(u![>LO~~sNV_?/t_xQMK1WQ5Gi{P(dv%*'Ӽy0Ih^ʪ&B ^HF꺮lR--q6c0S$Z!*$M9(zQM8(I 4\x`-,+%,M?0+@!hc):f+ zAg 45RAiKtRt'~A?BdVҘxQJ0s}Iv766%Mxifj;#Bmpls;X[^1G(j E Ե3 Fqܴ38Z6="YQ\-3\G_㘗g{;Du%*o*1}A4Y+| $Qp8Ai [A 79Ɔ'f9xRn0)KUUU{}/ւlF95>5[C5kz]WhG*UUJ"1c$Au쵬jMȮF+c՝Z*KB'\Fx !7gW)ԏze3S9c)ݳ-UhܣS/$m0aJbBV< wCd13|F+~ghv2(Ct'xj1z~]cr ҔfHޚu0,9$ Z"@MUpar [+)y8/3Sj/Դmm;5蚮5[\.SL/!D9bX&,OWEۗuQdtʪ,SI]eu՗l=1H&^-1, L0GR&xһC<^un<0D"/ (/])' ar&9LDlĴ9Y\tpjGl)"ц~KdxgL&#gxYޝ88Hk n~w>1'[8xϿj0]Oq['K%;(d(  ,H2IU >wp%8q:M)vvڞg| -Z:'+& tcGG=05q%=Ei)zKp+sL8 pyj>^%TmJ~BV2"xN0 y sMiBvFBp 4I夛x;Nlvb"xrK}untDySYmhj:S32u%6eԦe]oMhW fUN 4#[pBa08F yUB%&˔TM^q%&LfCmY*QLqA FbJVa >*>R$H&Iځ"ܝ(fOf~]w7 EWxJ0yYꢥIӿE.r!>@&`$MA\f03g8)AÛVRm3\OF4Tl@.A5 )nںRn)Dl:8O.U֗yEʯwh5obyڔ(3 NG;&mVxQj0Du*Zr(zvl+Go__Û7B$ϙ,jut%$){q1`VK6Kt.'7;8S&8`<4 MI,ZDbKmɯ>jm MpIH!zDsһizq^8K,4/v3Ci(RtR]1|a*1.˕,7Sc{cXoxi0DU6C^I|rH+*g-#G8| `xӪP8ctzNH" G!ĖrFUL>쬌V#e (:ڽTc[)Ue[~ ߩ]RY^hF:V']KE|ccjsOgFq}ZoxK?*9}]ɹ.]5x[j0wb6v$bPZh]Hł 뮠7fC=DcR6킟hu:4JkS"Q9=L8=yJdoM $9\|vKt/8ԟB-/ pP kɽ"pae篍Jܘ"|y]7^!/g,W.5XbxOj0+>b< ~lTDÿo=@d]ySIMh$Ug;F7kU WŠ^JF5a0Q <xB$x۵_#m 4R%PsVməd6w 9sy?d\&O }xAj0E:\EIB`4)v$y79AÃ.4|!%rYss`rq1yTd4 2' α`ԩ _4c|Q1ᓎ .vs_%4޸`^u0iz6Tm'8Z!0V*ХC.yLGL4\xKj0@:\AYe 'fjC!/z6'Y=x^o0o1"$FN1SlqAa{%b<,1Ί;vrR6~Km[h\f;omtA;Z.*o;CΧdRϝPEdhVΖx]j0u}˓ʒ(  =~Vm՚9A) |0#LYmG!zHўH:yU g5HvCc71`rQ]n0u[bJXOV׶Ch"]&R U\ #ӝ֩v x_a/\8-A*q8)3WJMɹ ?/kgϗxKJ19ͪ% "^`@%/v04I;@\+3X#CV:U8Ndfq`ÌjO^.*,+,q /.H/}+Lp+2<ɕ*jmG Rͱw)_!/h%3Pܠ1p}KO[@JR=~@?ߔc.xaj F{@uRJ/P Fg&.vB7=A{`3R Y2{ )})foMц Yw<{ /oiEq暬u^ä[/U>j`kde(Qjߡ/%h5O>4eǝD^bxAj0z|aB>3h-WFȇ>{rjGWZ}`\Y9ٔE')3׀"-J%*Y8>:|Gk]؟5<^RzK93Lͣ__4r-_<2*z?'JԘiZ)|_0?%ZxJ0 y]׃ ivѽx|#)#h4ZE;XRhm(Pbt) CF* km+Ʈ97 2o/c"xֳ?%3#td?NRAeOR d,Wp ¾ꪈZ1=X;%_ƞ-x@.B>(V:ϙ]V~B?A6Be-ms>þxJ0yymI7m."z d MI&꾽eeo>~~D`%*HRٶU4YMG2ub76f<*Ħ鰛I+锶</&/B$ן͆k{hZ9*aJRr]=3S`;1 x&#}\ VRXRJvt SC%X֛*f`7l R?ɼZWUa*~)@|0D6xRn0|W[ArN.%RUB TJ){X'! _Ϧ-*$xs$jS绶;S;M4N֭FqH> zlmՐ#5wZJ*|n-E{WxϤ lJ^=Qgs_p&Hpyr:086f&;?.ZYhqdJ9al38<\(B&8aVK4K@0a:Cp05`)S𔄉-鏘B 9axŨ&mG3i[r@]0.[zMTŐ({#\g'9+FY /SdO33֫DGkefٌ^wblE@u3,ׇ TIZo GjP).!c&=M0f-ޠǐ"&t@7e$31.׻_/{-/C(/xAj0 E)Ei"; dK&`{ǯ)v#^d 9NFĉqÁ Qd3U;";8IA#x80[ H$Ɉa n S6yF u9M_#~o?=3-Xtlo87@t[k:fӢOf9Ct)uo]n f{*qr[S-gTr1k ]R߬o!x?0{ܮsqNtW !QP"EܵPf47M̘wqrXhCbIUZIiaE̡ZOZqrQXių)5}1ȂZbj;>ǘq2zGqJJѧ\INy!t#R11ѱ/~2zʀjڡWjo%#D 16rCl ?Ԉ!pvt^¡ز(-+v_*|A?Tb w8A3Qnz⫿vd~=7Px2E(5U2$%8-51)4 91424Mܨx֛xOKj0&XJiP(bQ2\',[3"p;houQT,kIe'@Ȭ3NQΣE)%7^z LwP#zC)eykF7zi|ҾS m)%:Z?*2PR,gAPJ.p jД[:K:M+/$L6.w=pzpjy75+cdoGB>eB$s;1xON0 +|܄%sҴӄi~ M\X*MHl?="htB`[Bk"!4'ӵ0NZLUDTsֵ%j$TNY͕,Q)dfI}p43!M0܃*Qq8g|J,'8 pZH]#B霱C4MnK 2M!&^{?d87_eU)'hkhD6-6\hVّO>ykCY:Cݬo~CNx0~M$Y ZTz8XaQ޾c`Dfl"(P|S”e]R#7)/r[re*+Ruh *:ߡɴ8>y?<]z~H7wOo:6yQ*f௝*oK.I)İISH* ~`Ć-}4Li!56@Q5Z_{Apc' 8: @=`ۦбBƫ1p_4.dY#iUfl7㩧mlxERA珠M# Z4+UaG&ImѺj=qhge*̏',ZO1yrڢﯱ˸b9ϔ\bW݆kДp+(,xμf֟.o{O3ws-]$erq'B白)xj+&}kxn0E;AJD6;cbbd̢ߴRWgѤH3KIgȸ\x94 70쎑672F8,jg3#3Ur)gC=> !,o"u= %K L✍ͧD7FρsTX/M5ͩ5j@G1v{CV75{,4/Kv$8:QEx:xQj0Dum)/)`]E W9A 3E31ѢCtDB}EFE kM8ϚǖLZ^S.pN9">@okm oʏi~u{i١"Lhh;rJ rZAy el:guD.?; GcbP[h ͤp;rAcbvSᐩ6ck}[~qb]>tVt)"RI~İ}/\nw؏mM@*oʩ9wǷzatxKj0EZۀ[O(@{/IJAv_]@N߈@b(XuVX8cЖ0*ά<` 5m:dJ7wl ɕ1z6>ɍd9E/ңOyY6uޏpJ,;(+QJRkSϣNOsnk yE!׆ qF8,C~h/9cWxMj0F:\ AdP ] q֖,r:] 31_DPieBswFcЋ;rP;`hB(Hlz:+`T^v(2n- MZJ%8/}>W ї VK#W:2Rt [ 0Xe)Rvc)_VhZ/y;o ezOme# %ӑKf 2v3{xN0DVvǤBT©Z6#Ǒgij7'"(Rk[p3*IިsCڈ+cAB^ڊj&mŕ3%&8x}>`^݁(Ң*JXs6]3YZhd4dV0}L|BrvѿH=ah1q(%y->`'-ue 6|0BX1y: g%% ]n^8ξ3wėxj0zȲB-y[ ˄븇B^vo@k"֮ FKVX*MlEgh ֺmT7’e.YU@9u!=ӥ7؍?%0mlVE2}J"<#)U#Krb lpe|;8NBzJ33x"7A `wQ rYD6͑&<:fxrY`u~W#36xJ0Ei0Ȉ/xI^`Ӕ$#\]8f"І{!Jv4Y9[؆ kFj'ji~tNG: /㌫Xo`9ĩ=\W|;rvC \R-~90;9-4\&Tj9ƒsC)a;-J} Jp3\o_ݿ'}xKj0:B@:`GF~^Iv500 "PMT.bte|&t(IK[bK -xDReA) W$2Ql"<X l?9`Q(aB(^v1JHg8g,)/w'Q_;թ6xA[ܛxN0 y ߸Б !\x8Ț)tӎHp>Ziΐ* 9T '∅ Һ> JKT֪85FQƒY੎\>#J:-; 4RI)aGAF ,4!Ng#åku!L4 X!nONCy_?`xAj0 D>/"ǖ>(zŒ@g7[f` ӛ8Ր8pQi*R۔٣DLNFp}^̄,zCg_Kot~R{҄WOC1$;@0Wo˿L:kjyYbV1~Һ1!<a1nX xMJ0@9\2M!$-MH ooz3v]M %B#;hJvE'q9MQ;%.YjtmVkgxn_;Ӓi .b JލTiZ]}m3 du;!§J}PK㏧D_xMj0F:\ed @O0#bC E^MvF(Xx)ޓW\II500pT KMd BZjm1 xC9hÆK&\dVƛ#$9>\z |}{ee!JaVJm:'t2x[3 ̕aQ.ꬽB1-%}؈/w\0xj1 E -Bfb{fB(B.r$c?Hu@H {U(!0Zӣjܘ^#$4n'C;D@/7n$Z U䲓*ݑQΡ{jcUc"؝kJdgU&.qAJX!GdmRALM 咷`f2(3An@}]Z %~R=һ\ 2co|[J˴w-\g ؏U"eftBk^>]EVE È!xAk0ѯckyBPMRɌZT$>rsiF|=yRkیsYƵr7K61BT첍 !I.U-r*x^W:1,Js읇g-<: na;OǸn^dզ, Rw01,Raڼ{K;֒SOŌgX0qJĈ%&'k(ӵ&-/)6ێ@2eZ?[jQK_|np<~k^}[r$ 염&.0k4v{X}?<׌Hjս`o~7M:Y3b?߲Ɯ9?.{I4xKj0D:E_ՒB@HNOkl"/r8}G+7@㑣)l#0lu2zqJ"8-4wHb ꢙ2zIl"ebY {kRkx֟|nR]@[tN"uһɰ#5UCrDz@ߋ˥+Jΰ"st]}p;ПxAj0zrRHe-!@^0Ҍbm|BNMtuo"(x;01l*$%AMa .Nhɉu879hQ} >\&rl?քgϹnlxcԃnKJ O~ P˳_LH+|ºuP}^gxi1EU4a iH#i&+!} B.8 Jv!h'r(ф1جO(^#h9xmE )*ϵ ˱|+}{EEk`A^tksMEG;ѡ0WrnW޹.]d0(YpxAj0z|hdEB>(6"ku ECݛ*ؠ&Z8)٘K.?AX3{pl'uv_{eƴIehu'"~$ZxMj0N1p*  =h4S(EnoW`9^gD}{[E'gB-g8ʠ  nẂb]٘Ez?a:[/xAj0z~aeK+) }@YVu"C{{7U(E(Hcő#za%c!HvY%LǜI<>,^7|6xcZӾi^n`Nw:DmKrDoircpAnByUc/WC-e?6 Zɒx[j0uîB`WZ;6 BۯazSTő"b$c>}&R("; Bʼnr n6:EGo|,pݶp6-3S v"=|ֻ9[ny>ñ }VGeβ1﷏auvY՟xAj0E:\A, BO052B=~"`hHzB^<' !hgbɏcVV;άB~^Cxف#uuUxRT˱{a?Q`<{ V/d~KեvGb# g#cOe^JV3}CqX?7Z`hxQj0Du6,9  =JZŦGn__üF30&5lcV;oQ5.~BͤC8l/a49;营6cZqZHb'! hNw_Eү@), Ze^RZ\쑶m {4Ԝ~duxKj0:e%Rr@'xj2랠t500L+0JRgzT6ac4j;XANa0mQ I(\+s. {p>רP#Ӧ5)h]v qyqaZg[E{?_^xAj0E:\AeE.z4Llco_'tY(]}RKNy#Cd1κF .tSZ̸PaFuZ*RLYQ1FoRjWs]k]ׅbF>:2Z4Rf)q2{ Be,7Xqp]$1a(\aF$p+R7"{.x}j0DY,c/B>Ul P}@)0YBH ݭVl-}!dUUժd6朆(Bc1`Dj*kAx1zkg33٨1N 6 7gx+ b94P6ZjSC5lS2a;J~K-X=ciM'uOs#_y(aqgqHp@I} *PzӚxN0w?ahq8N*`d@;IĎlUߞu`JG;?9msegap*PX'=Z#|&]X@;8ʨVT5銃WՂ܇H'^Fz !i7azl[(kJJӐ3I겕7R<%rzʑ}9>D\)]q% fΦ'S 1'=(8fpwO֙vZqe5 >|y]pn]l߯VxQJ0@s@%i"Lnpn's9oB|k4T!/}kɔxAj0E:,ۅc,),(z0F\IN>PklnjݸVKo*X'DŶQbsքhV+K5*#]w l7JykAkc #|Ę^o}O 4"BUߵ}Re8ygvlRr5q㍯3M ;8G! {6y|1.2a$ %1fU wxAN0 E9wII:B !qq f=ҷR:=o3n ZgGM<+882mCTV(\epk΅:pQ(OϠMY]AUۺV:%S5] 0 F.@ ,J%M@H |I2/AFE2a_MG̷oRn10srWG3 xMk ahb.ca8nvk|0ϼN-D0vk"PS*9񽐛^@Hpsֺ1J'Yޛr`0;%ٙ"q^t=c8 9XSlhzT|3 R!-+kHѶ~YRX +~[ c_ᾐ;'va܉x"xPn s))14j`J (,J^W=`ƳF~J]c'9 ftgKoGe]gFJ;ơ: R&xYer֣M+8?)8H-h̵ϕbZb|ϟP' ՔBrp[8^wࡀRʡ<r\6pJ|F!nߌtkv)"/2h/vٯ0hh+ 04Y"O`,GZ)w?7?axAj0 E>.DJ @I CYBÇ{2y@VBy`Rz;7RROM1L|Bu>Ƅ1\$O_\]m[c<ކC#91 45׻Ϊ/2vb%ʡ : lP %qTWye9ErSDZIyo_ xKj@Ds{DŽ 9|z,Ic-od ^NRu 06\Й,micэ!%+ch$7*Ht&/K2Eyj>NzYS"䶾25b0i/3xT6"RKy5\831p{w[[:q 2"bxMj0:\ BO yFE^u ]D5)MhM`Qr-5w.aṛɔE`0 zQj/p \Mi hKh0j"Qt{5)vMy3$fxSc߶: T]ӧ(>܅Zʐo"\]&x[j0E@"RB݀3 Lk~ h}HƠljt4Q0/VJW\;(2ZJmY5 F!2xɍ +-+sExc_*s LNQ[ '9H)oYzuJ"lKNW)>am|}Fؓ3dlB|̸q14.eYȭ`_"/0<D}#UsxAj Em EM4ϧtBW5X3˽pgtf@U(-FcՒ4;-HNԹ5E4+#r0FQ’7 ::|й{k~gu+v&H)1_$Z%?ovz@5Bl,O1t.kZh5Koaʜx]j0u'6  =V^% BۧfF&ErL)qΚ9 uF=RuuB9Ĝ8lRAGaqk>~ֺcɷ.-Sn+hKp„QRǐyk*}@kmm!ۀR)YS+eYx]j0u'B`e;2 㖾'O1*3dIkÑMI+ǜMkR{HhD0Xtr69m0*X*\iRJe8o~V#Pж[t:tje>xJ4FBi@f=nw]Ŏz\֗xQJ0E@%MLC +$6fJL?tV_.ޘaz4(c.hMk8Xk%Τj\;o~ Gi2:M uԓsVWiJ/"ؿq^?$ٟ[0Qàj;z~Iϲ;,\icT34P-ԋTp)J!IrYT΃?|+ijxQJ0b.4Y f[hwW|ק>ïUHU!x̌]Ǡs.٩GD g'Q>٦R^K}}K9ol^,`I_(~Ɇ{+S/M@6Nh⍾?r-L0ڻY`Xw6iY}=D2p xj0zYBIzUl[A }C]o`J&傎-Nq.FҦ{eȲ;f pakґB\(U(-֒!ȍ`>e0_ q x)7>P7H)kJǡp]J`w>S0[-d2o%Ng8B | 4C\n;cyLc>>y>z9xj0 ~ G۱Sع0E,0KǠ`'Ck&RA:rASoNHdڶs]1RsB :^#$Y(6HkSTy%d,pc/Χmisxs9J^pR&8\ NZ%}`]2562/o+tg׃sWDsG~Wxj0 E 1n&c C^JKL;M)] {D Z iJ`Y6eSlqlU(%rZ)+hUp,M 4%ycB:ixm+x[K(x9ۺC$0S>I"u`A”<#b7 yE;{o#b wO3ExJ0̒izsӤ)tnś|/'Dp+,񶳔Ki5bͤ2I& TX״\3ajsűǦKbOx1!!FEvX&uJ `*xKj0:\l)tE1qo_Z PAϕvhBު DK#s\p}VMD Ne:vAΝ`Jc.a s.ׂ~4try~.ZzM[ XΑd^LS~Lqc$t\2Xs~P Bjco r񵲪?H#؍tcX#FdP|77D@Bbʶ70T:1o }Chv xMKj0$J&@I96ԒQEn_tn *3( 8B/dyIZX97:=Ѳs7$cyLlSp\J 4aۥ ZiFJkiw)Dp9_o-N ]8g!mgc_?>7<_Fxj0 ~ 7Fb;N\h7v('c kງ11IAf#ɷ!PɡjYyD MM4N"[Tx.F핮ll-]r(3པ*r_UwWsjgDu{K !>,2퐔~[/iJ}.~(! H[]0xPKn s _`" aQ9@J=) }uUە?5g$gb&=јi<ꬹwbL[(~4Nd ãeZQ^R}}La>5V]cTj+p{7"/mq5A NKnKHjT?Crlʏ}: }) Sb>M__tHxN0~}Ic'Uʏ@"!ٱ׉$oRp;vRDܡC[yE#K.m岪kAGH綨dÕQ5ܕ\JUHQRsBG nBzOҐژ.Cb{ Usf00³{x !"h;2|$K^䒒}oW !8>\mw:,e'T=O߷'y ^<7':?G'?7! 1I!D?@{c;Rt[4]{3fxj0DI*'(R ~@J+[IJ[ev`LD`/yڠy@dU*)2ي \X%:>¶)a'2<xL kr~ozsfSV^R5~s&7aZ|롑%{P5AXظ^V.J?(wpojX6(+sXFT/L[r};' ]xQj0 } )]N)c( vٖcGڝ~iƞ$CJVj2 x#iڠ3V qFCV߶Ͱ!Nc/pTx5Jp|G+ tjHV)2Iro#GL< '- q|A GFA-=Cv!7+5M=^37%xPKK0W56mD =ycbݤ${Ճ740s$D0hA! uJλnhzθ6bhn0,*a(LKV6]u1eYڦWwDe ^:K v9]}B;7tL \K ;RJK+I\U,1pJf" ˚ռb2!t;_67><%E9QwX>FJ1<<3*/񇈡*-a<>owžѿN_|r3 xAj0E:\ A.v"eq]*|{>" J:P6/emݠVd1R  YekLVimYY.Le ײЦ-냮;4)AurU9줖RtpR}|9 F@v嵝p"Xw,dwɴL# 1Xt=$c*-`<ݧ޵"hҞ nU 6@7{!h >K <~KowwؿG_Ffxj0E=,dM0zb-YWEj=S2"XəPsZHYCe(j2Du'oeEV1&`DG^Ɣnp^4~nXK0sk4TQJwJ fRF^3єN1VIYI;C>aCW+C-OYWSʱ&B#oR=MmJ$x*xQю0|W&qS7B !! MI9vu߳-}DpO^wvg9%js2:umC`1CӎmۘՊB]e7>c[{iFնQ7u~mKmjؕDzT..gz+T}8WǼÀ uia~$K1ǂ gǰbWۺƔaIM(avaO_ z`[߅ߜ2n$ _2Ss")Dw̸c 1DVY-{Wى>$&'L;5rWe{QE]4EsRkե?9 0y'!#1Θ^"YbHȢ뇛]]7z塓xAN0E>\%iԩv,=-9b;*=XA,yϴ:=*g;(gzcRGG &kRjNkuyjMo+֨IwF 1  YCXsGpb#xn <n 67J=W#` pS}^)RNUŁao"䄚=kG?YD:iBzʋJ j;*9K7L {;I#B.h~\>[! ]^/rEi8uWR;OLo([jq!XK3-^c )l1^=7hY%Ϧ?s/Tpf1] 嶚y3_?Bo 8@,"T#r\K"մ mRO!VXMc &]B}̄#b1/ +VCf۱ J6g!~Sd}l;xRM0W Ȏi -KKP{,cd$9$Pz(e̼73o=":]/kU U-x-E3K 6B(VlyZ`sդUٶHh2dboy~?zTt5P,ˇwcGL Z}fFA]cpc8$9 uƸ?aӜ CDbNeMid _zf']h^ j+x$I+Dl+&ce5gh %0nQ!yzw'Jv "[? ޼=ͦ8xKM~Nnvk%ϧUZtV(uk#̃^΢Z]4?>> 3}xQj!D=E_`3Fr@ 'n]uB 䫠իR` ;#Y-.>.b{#yv! B-58!8'HhhQx[mGZ[o-'+0i:-OQk =] 牼a3Qj]|SDJRaexKn0> @UwEEl4*u5y(U$\%&*&yוIlm4;*ޤJYd]2BUW01<‘!l's{raݓA"uSX%e5:?Ĥ7ϑ!8 ;sq$z?_|/1{?cm4Y!'iшn"&a%ox:{ 4?TدOEU-=xDのbY3D.\uV.:201-R8 Gx;n0D{b/ Qd #p@`]Z2$P |(Ab >wOD}}c}zV,T!C]hdKldqCF­R2y) 4r~A!vVIy 6E0;υiz72vΆ;m8M ~QKAmx]ɹifVS_MqxN0{?ŖP$O'tTD%‰#䮤@T#ْͧc#pJդktMi, =Z%+oIKOQ`.e OKICqۏ8é/w#;(Xe$Tp\K2a.wXvJR^ȭcӺo@p:!Ӝ'0FǙ B~1ÕROY Zy2E*Q{qJQbIQ.*>)e!aO^K<3R oVyA:)EL7E,{?1~QJ\Wh y+/XJs?_ ixMj0 >.?cW2tB'Pbc&@sz讋ҕH{O243*g-=g$ljT,KR@#هhk2*AY&ք(hkR)^VR %hCʠq(0HRL%WxmR*yMyzm:i;)ֽDc] T*yg)U\UM,W䝷C!!w̭I#Hgi6)hB~8Q,q2k^5u%N~>_{xMN0 95{I!X vF?'eN\23X[4α} yǾ>2/s-ElhS(1Cv /(ፎ ^53wjSj!ĴE1p7H[Mx+br] BD _[ͨvi˚i?|%y xi0DmF^Y:BHTvc2|Tk`ཙޘI$mFLh0NAJ cQ5;Dmʼnʼn4|; Jpe|쳢/;^7 gAOZJ(78B/ On_ka?tcG3>ϝPE}cK(T\4xQj0DuJiICh+ib(Go000 ' Dd|rA60v2NTxU@SjeVSRQء"6^'\sax~*{GPء2@#b]ǡV)b[XH 4Eؽ>oHÕoBı)5gǙj\9xM1F9E\)ja. *ʴ`w$9>x͡ 0RBXҪFjY)\rhKs3IYFt(ܨJ )pEO%GJ(1ɢȑ2E4k\z <վ}m688b@4o]W \aMGwaXx[j1uI֠ &rY'+bYVqN=:@$zjCJ9a6oC.M:68㬜XX.,.8X[]蹵z/:*!z&w}qvL ֚e 4iU(I.}eݘvE|2?_3#xQn0 +xkz^ٖErKX=,JCC pf8rF5 nFu;J`/qoV{;tgkĦ3F ;ӏWR:Yu) Y)5*sF蝗!V]^:9a: MVشČ.z5po>[4*杩+Lav !m7,c5)!!C_@||Z9|*8Mpy*' H/sA WO9ZfQC` $^0_v z& f`Mn?0ݩ爮I7dJ)|T9OX~~TX>-OPt%xQ͊0 )t.t8;qe)B }Vw¼}NO=ba{'l7ncX(2XO6F~6ɵ KM q w^Roe紅R^V_qC90H ^:w \ڶLה Kގ_iL;\y7N0 ?1=T6x+RCa]!Z(͜ cwJȜJ:#DjTAFB,2yy(2lx qM#EQVi}JRQ|H4ޞoR$8Dʢ}>Bй˞V`ooD5^x]j0u@,%Ҟ`cQ[mn_'(iaA/'炒b"$yգdtdEF!J4 NF s~V5N TuR.<5\#(=줕RltIS0>~fZ;<'CH9|Ys|PΗ>!;Ҙ.ܞ9\, Okb(>%oBLJy :yޛxj0~%۲8sPQmjIF? y9ZzZogShPc3 kٷ( vgV \y$Z$Xz#r(Vh*i>9}lvo餽}F[q}#Xwu].)q^.of;"> JF< Z đX׽2o[3xXvykQ\R"z .GLkvDk` {:c/9Ϩ~֗x[j0EY@ȖnPh70F1Li(}pK"+SUZQPFkKlt(L4h5sZ95r[ U-2xNkDLz,GTjUvlw ?}#c<.K@c K \ !'si7r 1Bv"~?8]ѐ=’Xg9;Zh"!X׋7^0I~d([dAo?_ .xj@ FuSoG{)/P( QA} ]$||D`q@%yS>D:4e] &8`YQ팮7-C\=EkmUTIq9Dʣe4a 5JE!fa܅![hDf v +8gKS+aL;x %X^t0(ƝY0ґxmj0D{B/P(med79Aaޘ!DIxiLk2h8:h&xeg[GPѲZFR;Z_L)=@ȄÐj SNvBo. ǑVk!cŧy P*^/0=2K .Lכr)C< )xQ)z+"A~7z+ xMj0:ŐU _]R(m/ ٣IWRm4yELU()2u\B,W2SlTHLsEcX Uc,S9͕dj YxSSDa7}X7G{LMXYx[R19Y05d{p%jTd-V0 W|ܥ7%ʁVei"g>4іN8 n=v4Yy;10q j9aPC74bG덾l vPV:Tq>do xKj0EZ#sPB+*6 ˃)tގ.fWF;*s\Fm k\F [,(ь줎Ǭū佲2;NABOG8zgK+I xu(Rc^򅰅Nk҄t?QԎj5\B|η y ǯ`xQj0 D} ] vY  =mI@[Y~ ̃m`)pRbG 1KYo i&Fpˋ()ڄfgy Ler+֣M#H9}IN!YRv +A%S)[p{'%oŭo7] pH&-Z%tS[n={o}M5`&ڲ{ݖH?n8xJ0yy.i7]D|A2M&6$%IW|{œkµÙ'opfΏJr_6$b;J 1Vv$'Ռ)"IrtjV=ã <\= Y-T.8gCkL|$H֨zK!۠HŮ蚽eX#&9xl-ltjW ^{[ QwqWܽ |OK9 [~SODn:˕xj0DK ,r!e) El_#}ujZ"oULZ6\NʄN*#]ЭhCR;4:Q)\;덗*8Z{*ވ ey+{WO+ jc4mkK k2!!u#€n:Lf;s>G}W^pyl5lBc^}.}XqxxMj0 >ɏ^Pk%C[C]tт}9Z:vڋ"H) RktJ&Zx"ح0aZ)g!OU6q8"3H~JYwz0D1L R/ƣO;0g!J? ?A|*axK0:E_AR0@RwO ey1Ϭfq DE$%DYA=MNQ[jvpڌ#L.64dop):o%w8NtKP  0hzea1 QMNG(5.uy{1 x%^4T!?t\ʞxPj0+c+P詅BzEdH}(v`w yDhxH^8jee7yŹM-IyfM£%m՘JlK.Ok,jz6eӶ(3&fU FIDb$Lb5ʴrX4eҍ&Bb6GNeZ6Dh  89K;5 KS$ôMɲ<OʹB QgJ**+2M3I3z *i\s)c_ :e). U`N9!4Ó#ؠZ:ٛ| =!%/*Kbx9SΘ6C>q wƥv(4лj{?ihq(Р~:Zr #ZCɒ\]G:7߱]xQj =]tQ}kߍj04JfVaThH;%ySĭA (A-X)70 CnfAqZ9!Ȼj$pks'R nK:]I X1*8s[l{cBLK-_m&zұ3A\K_ܯ-C =S;lX׏xf=3S 4?vtxj0 ~ vJq?NK-6C%4vcL }}DueNզ,**[4XUbDA)ʭi\T+UfU;ٔ\]L'nc]7x8.6,:QBmx]j F]@&C ׉h0tv J>8qNoDN(R4#*V󤄘 8)2Wnyradd g_jOG~V,~ӼrRo۲Sa1$odx[j0Eـd))  Y3!2tqWPup.W:QHhrnr>aR$_,Nb-q03%z'b.TJ̭OoZ'T$ci':DQ_  %娺OZ JfFVwXã(!r γF1%h) X*ξF_vnYk e~u'/5#;tW:bWP^qV\Gwyj`?pyMxAj0E:\e,8  =@FI r}z_ol'Kp(*M`Rg%)mDY(yvJ0<ĝÃdp |!pejn+#}eVBҞy uHv.Oc( ;Po{g8x]J0l7 .rBڔ$> |3mYYTNDgC['؁Rs]*QM1ogyIIbx6xdz[~QZp<źPvVZ*a`sv:Kzs-c!q;z-_ꨵ0~?7^ xMN0 9wfB\ 83H=n,#~sD08(C AKc/LʒMgm4:%fZ+Xfj'uխNj`ک 1+n^biLvz6qySoIR .VRCąD.A R&΁k퇄3+[;;hcI!&;ĜZo xPN0/Շ"np&lRS{˙J;coK!xKk0{l6CBɥB{+im lRR:(4~01VF麡])Kz҆6;B08YkFld-eƈ] !BVa`)&rKoQ̭s{(U)8d✭H1 } 8LUL񛔼_z%Nv]g @p$ -3N2k6.tON\tޱ[w _>xN:Ln)}l΀Ɛ{#ԲwKeٷŝxQK0)Qa+iQ愂ce{I\l&"dGiJV$e2ɳ4<3!8--$V8=`8T&eZf,xcd2fA-3lqwv]/|$pqCĔR^=$U+P|.uwT#ߴ' *ph\Apb@6 -֙W"Ias gm|vif(nc]E^O`}p00fl9lT>-RcǺ'ӛ+xQ͎ >m,UUPRa v=T|?C͈`G .쨐+;F/BazFdƹ‰q׃x[J0߳@5m"n@\A.pDħ7DPND3 wzB[J|rxOI葳6:8Do3qR*5/>pZ3g_kW{fx!7 _e0p9mIIfsB*{$-mm+Ԃ1#Ә0znX[bNۏB&rbj5#yxOKj0s}l BO0G btm Z!/>(TӼ*m'LRz҅/ڣcUEK3M$U0VOQ |xWBp}-ްPZ$ rRt6JvAA1o{X8C[?l⊟A~&??wJp`I7ЗZxO;8=7BsxA 0y~&DD 4٪`S߫/O3jHfm)yqX*sp0a-&:IG=`,av-Nañ*[*&$f򞵇NҸ*<y}Hb-η,+ԍ폳zdU!xQn 9/* ij*U.`$H" zh{YiO|s$)nJIh7FD)јSG6c$XiҲoLg [q}[騗vZpcpekF`ƬƟ d T^<(#}$01G#fkQ3V!G0Q3NsN>OPqpŨBsINۺ { ѵ˝xi0EbY˲,! ,RH e$ Za0pb)97b0p?"ưآ3j[72j#8Z@N ƠhS.E s_,&j;ZFZ:]\Ng,6Y`;B&J}?.t|WlexQj0 } ]N.e GmO궑R6r'(ݫ˙O 3| KHx[Be(]Sq$ <|_`ZLBNk qY &._7 ):^VB4+c$~@p~ .&0or<xAk0 'Ӥ1vmPagّS.B?1I I ՆZGFvhkUմEכ+ 3E*Dgйn\C-*W׺jmRGǔas24-10"m,RJ4R0'r& F<Hv\Bx#Pꎿa}<_0`fxQڦG\e7}L/,>z>?WaH%3ٲOLH" \/0r"T tAeU%mKNuU 'H6mmk S5U#ĘiY F`:r8q䜕ișEbR7t2(,kAr `G{S)7O's¥D vveZXކ` ӉwPx}x =L1ƽOxp{@d l,R{NL/=,S_Կ=u/):w귇?>}xaj0s$YJ `'*ĸto_=Ax>xSPl4x-zD A=V!HQF(٫ bѻ{ts. 9G8sޡ}#-:iZj 9Ms^;8ú<.5H ~Y`LG^J\ülR˴@eJx]j0u$7  =JZՆ W9A0 3p'κOu(H1URt!hN<`M5h/ cs6Uii o nʂ|m{5;5+흂IZ)hCff X pzRA sր6)sکL)\8 dxQJ0b6p%Mf"L-ئS[WO|E-PRLɺB9ci̵XsM+r ]q1y"ȗ-fr.-i4|:/u}.uf}(m}S@pduQ1bHxIQ9úlWwZz h6e՘}zkt?%q_xmj@D).,!XBr$?*m̀2rGG>% ;Il.xS0eJ RI=ӈfOk7DrՃIu%O&[Rp)z(IE|᭵..}ROm/mdPÄQ鶎!!#=Iwjv |C8΍"[WOs2ZǛ]xJ0."ޫ 2Ib,iݷ7UAF9ǸfձdG!HU-P9Qun1eeixkoFRቖ)e˸ݻ̡iFcJNZ)EUǡitD~Lg3G|Au#ra`Ja_aZV)1(B)#q(]ϭa9&x-sS";ciL\'!DV-ŗB!^NTr$d$ZDC9CPfg!@A(3Fkp=5=c;Xr~%yo&LSm)> 2?&739n9ŋ[ t_W^EѹO|}v0xQJ1DsglOd :NILVۛW ^QL |'$S@ #ڸJn`x20 q5q#/m) /Tmsyve}MD4kjMaڑj%7MZJe g>Tހ3H֭/>KyO{vP=CqgtԜxKj0:E_e}l CYd $ ,ȭEn U= ǍkTΤ$ ̈́~^4I?ǠUHFY-hg(I`1*T6evn6Q|kW/K- qh4%3?JR>K}kp~㨍)o˚NHg.}\_{8Ԕs]dśxKj0@:\a~Ҟ`$jCE^mv{bxsbLZȶĒQjj.e'P֥Z 5'K.u}K8=mu0ጨ!(LRqH|_3_~{C&ejNqc9WxQj0 BHcY.K @&ЬׁMO~ ̀#ghFD #J٤];*lVH/L5299R 6۾K3]?=Bp$vg?$S=N < _aDZu׏PK/W.xn08?lJU q/0v& D%o8*+@Hpƞs9ID `#e7-85QMgEkb$A^g=͹ZM"ZIsϸYB$xX]#M ;#i컺;IJ]gr컶ZdǓB=; 1(K&/0m53AړFk!qz1t"%!>x|x;s,'K/2o@m?kLan٬~k;4y&u!^Ϧ>/? X$t7kShp==d ڍ;[%sf_JȡxEP\Sll*L_Y/P9RIHSX*Rƭ>s}Bq ^*s!xj!D~E.:r-@*E}&((h]\hRNY 3hf2|Iu0]dD'TR^p1WkΕ࡬TGgG0É+q]SRRa9$%\aݗBR=4\ /?6cjph#GaC8V|J|f-6/<ʾ :u"xn D|~@ ͡R"U=Wņ}CfvvrDF ӡ0Z*n"okA7T ٴ59>VEYkQFk^Krn"e6Ԩ֔)!^MN>E4kGir*R1AiU(߂qIQg=npD6qKCȇ!ɫn.+QR#..S w3>ܓ zqMA!a)X 2%$9u\l; %/8e{u0SK sǍZ ƴ&YTљ `W{X1:(:[)4c=</Q\h>RpZGR2Wᳵv^ѹؕ,„Qu%MXj6=Zak+CNR\RωDXuxj0 mIǎ{`{ȋ!t헖]n7:HDT+]DmUPz7x'Ki˥, A߄J.[y5 Ԟ 7Sbf1x3)< ]zT]os$Bk%$#T/)^Ж1[ͮHaI5dV5F73 XJp~ ?nçh)N*\@]sNeWtU?Nv ŖSxPAn! ?I`,DUT~ &.V}*`yf:kLZxiLQȮXhm j7b$Qy+Hqp+5I8[;fx˹<_Qs͑+q9Z1iL֨z~&.-hn&,@MmƖašaN_}$gLj^CBH3էMmSq=ӯ}J~CM͐xQj0DuڒR(zI^[2%oof1ÀȎrEo Őiž&R{h\z툣 =65V(3!Tᔹ6 6=4yIu{}̍{;GD"0-M%|qdf8x$C;KY jg r+^>HJ(-aqKᆓRa\8 _Ȧix]j0uJnPJ/P(e mn(&Q;$d) >ɑ2Z!E)F&'гD82# pө6+|M-g5x ӹOv\~A'im7YkӲ\Wa+k*Ɯe՜~laQxMj0>Ż@'Ji]zyr'0S)훞t#@)OYaY'""q1P7Nl4#q69dtц}_k37zןR'2ONG4 k.Mr5q+J;ڝѾZh)z_> d9ǚ^6xN[j ww WQ2 ^Sy *8-a"HE'<} U6@І*͑ur12+8XAkJZ/ZJe8.De)C(6v>OT%QchL~مocPtc!>_WN]ɹ ??/v`xPj07CRɖ+R!ԩS,jKFSү]Jǽ{]DTڶFYv7;#B-ٌ|UѢ%oں!] EƪJTIJm{pCpecq :LO F e%aSd9+r3.3DП rM޽uw0ײD ,+3R ,8^au<b0KKq òSFw辊~yB\ycCHV> s2ֹ' no:xMj0:\IBtY =Hc$yW ]Fm'VMRBccORi :Q DCiU8[G]8ʜ {Lqz n+3AB'ioTAmǙ bYV_CBiEzc'>v"xj0D%PIc+ ,)k[Ķ$7W%C{YNPS  .q4%ʂaՔL$mu53R*GQ+)*B)N; 1sg؟4IL`!w}V$gd7 6Fޝi̓Sb<+)鶠LdH1İ^Zoa]!:g;ۈ;&27 CGe&;Y Ũ'<QKʏJi-ԌIyh$J)FbIѩvW=;g~PkYI|?(My cxQJ0E@%i7  Ll)i~]M shL3z G8DCЬQ!9;N''E3OERVޗ%o\k{%yƒAOZ-kOү@RB]x+$[->`DZƛ(m?/und!xAj0 E>.I$ e v_Y2vs*t/חjfvM-C8J=#Q8w!=vj̱luNt[3vNi;{]RwWxK)3lC_3moI[Vk%[O*̴cByBQJwxe@ʩRK(ai+CLX]* %īz)2QaTb"/p Ip}3?Ixi0EU40F@Gke-U@ׅ{8p1~#D&統s"hdzu 7hub"t&34zqi'*X~-l_p(1mcA9$ ח K(,>/w^MUfZ"Xs_ISOώ"='):" GbHQ[JW~A~0xKj0D:E_A- C@`KFn-r8!Y'W(nDsRpqғ5A{* U C6 nɸkNrNYOYURk~_(-bݟA0HR\t__&S0|QC륬jm%%-.+S}}JCy?'re)xn0 E|k $Į\ CE=$*6jD7O^E}K^KI$Vj|zG5m j_PLՌ@y[UYq3n{|}EV"=GxeHm>Q wvneUjؖMY|; "I%cG>A:CK҈BbsOR㔫fǔ gN`{( O Pq, }&[II] ,ɯY^FB#Bpxzqx)~C%#s ֑, \mj^ -.0/ve-źdToCHB]/_R?ce|Ϫ?OFxi0U6 Y[@ V`YFZ}r| # #S6PM~.sJaN 9g]R'6>7dGgY4L,8ϔ^x^kcɷyEyZ^X?;; זM_*. dehhVԶS@*r;3R3w>y2{hexAj0E:\a$$+  9Ձ HN_'d߮>|U4d 6p &ژ`Ӭ.Ik6!f"4$IA$kQT>KoUxz€QznMize&v=$T2~Ptބ0ߎ_[mxOAj0,'K) `lq8NKz(E Q%%C#YI0H޲7tfX(Z@H{2WhMki-K<#j%h/SNo)e[Kf?Q9AתS} q.]`+ nۏ.Pse#Ko(%'Ö"gg2Cz#u^Gp#o'!>qeߤ}wKyӑxAj1 E>.0b{B@@&۷ՇxUAU,fZS&bL9fAsE XȖYى5P|*1XZ7z\ZW8߷vơsvdnrƘ$LZsY^}S~TV_?.7Zxj0DK6]VU>=mAl\7 B7hhLʡ^"ȍ!NR B}y˅!%֣^S,2)xqs.|ɻBqr y 6p9;so2c}KTNauu#>~#+cog|Wmw?M(R[^ӸPl04c9nuxj0D{}ŖAdT) RZ2]HTx3%3$-:}c#cO>F1`&XK\:DB-j5H )C .)eus0ا H1,TRK)n<1k '720l׭w4}^7ֽ^ڏ{8υCbǵSakxj0z}D*{(kiUl+HJK>N=0L`шYEGI"{Qnv*HDψx21ydΊRHYKJA> GYJe8\UNXWPz'ER-]νH zO y?n-'x !r_|@=1(@soCQ/QLy3{ꋟg݄&9z. ?`L|,/ ga nnN)n >ӌw18s{yu\/W&D@NP'TJ_>@> x[j0Eـxb=J)P %q!oү ιҙ!zمld\p&g7!|MѺS(M\915\Z Ow_:Ӛǩj=&V1£nt0V=ԍ;:J+D&P?[Zx}Aj0E:\A4B0tY `$J2n?<0 Sx@VȓRq(5FSKJ+=qV4(i(V+/9?8piN6 I:RP+x o9w)T(>|A۠%-m vÚv "nw!>Ǯw|{1xe=?nxj0DY,)һY˫`KFRJus)Piwg SЖܨnIX!\ h;xGm(+g5l[ޠAKi8yP>O3#\0Z Cٷcy=:s(.'hj;ŅlW׹Jpq[98a!u j' nOA}`Ű@cݗ}Eb|xN0DJ48q*(z@T&MQ qZi4v"RuRUY NR˥6(DF0H;JESJV4Zq몭%Gl-331gx1!܍>$zC=2J+YVOO23-`wEx1-@=´L&Z2fx:}=ǻ˞⛹Z1Rn| $p[..>zccr<0H {T i+AŽ_"Jj ^fҙ2ism r4>܁B. J)v{'rmvzzy?5QA oue4 Ǡ\xNKj0[ק4g. .u܊RWٰ(@cX(R~|}Ao75u S@;Qo &Y;^R .8V` ٧VL¬g\ HVH$P>Pp%{|e0)g!olݼKͲ?mR;\~3LwD2da/5=nxkfmf-)JMU05LN0I1762MNJ154360764OJ40K54M200L2JިxMJ19E]%I2xAb7$&Aµ|9i 9l(xP[/:!s $Y4:%\d\G6DeUR6(>>^z Gyz{Z3"meSVG@?=Vn nj=zބx߯^.܈osZx]J0߳@%$E܀ Ll)uV]G3 e|B.Jٛ Gw̓'!KӄcD3R®p\cZm~q<=y2aVku""FJKBY>!j\yEf!8 4*)iG!͜޻R۝PK $exPAN0 q*iBJq@TdWpxdJN 4vX#ȦBZ&a hl[j;!{eBaou/Zh`h fcB[K}HhgC!. [nsVQ2LyyN.|\U>ؖ5Õgxr\ޤ K#8:]d2dŅϘzx<<+0ad- 1%ȟ!uqfՊ2MQ8 mkvagأRKoִ*L?tݣzV3Sq)=A^ڭ}JH=R_`\!# V&ǛhT7SJak!l{h?*%B yظnw `#,WLbV6~}VҀ!cz% \DyPnT.1h(ֈNxT->Zt K[U+#YM1FN6B-oK8g2{{fxi0EU40zBR!4Ǜ {8܉NPdMɹXʦHډ#t [f0E$ŚD98+=>᭵N|}O/ z{ 3ôJyӞ`<.r~+|Q[Z^ {+^خJGQ)_͙xKj0D:E_Cc rbKbn%d(x3d#)[jg :f/QBv Sv +Mf.2=++:4x4[ݾqzPIJFD1m3w):5qZZ<~縳OGc4_ŋ\БxKn b8VU+Ej.0<h XkIv]ьar-GZ 8J M]W\QZr !et2zF~()%i/[PRc*PM=4vd՚CY2VU'5?';G676fLBoh.11_H4u] q dnb2p*k=DoX2VC b&I,#L ֻ.ⲭ/Np {yޚ|(4gΏ_CxJ0ETMAD.?`xLSҌ([A8G:t15dA#>Ʈ7F-Td@PX wHl5Vѥ./s]Mt}YQm4MLssX@̐h^hVPGU&-'*a<}۴vIU>f}%)l4~J}ZkxKj0D:E_)0@ lmBnO>YUQI#]Ś!0>ybY҉bU]G㹏y1H E~P6x 6۶<ިQ../` [N;չ. ι!Jh _F>a9fߏmMz>V*]eUb"xN0EY¢SY!ʏIb)~ȞP{]ҝs%D@صBJx*mVZTApv,ʄAʂ6uT:TUCmj[&WCg.BBn{Y^wו`kYQ%97d2#Hc 1D0~.d -5afp4#d%.onAzs-'t d\&| [Яu>)Kh=l3DIz=or%pm/r!; t-1aIHL:-p){G S?>`mxJ0yy%mӤ]DςL&&%ۛDPO "i=y;׶NkXntNX(1h4Voc+[McgH{rC. 9uB> ]^ԠiRI)Dfi Ƙ TcN\"XZ X\LBO?>;6J6,.-|KXǧ Roo,{8 Bs"tɈ=xJ1 y]g:"x', mSiK 3 ^U!$DiATکtmb7t4"b"ϠII3ȩS@;;sHpƲs6{OdfM;ʶ饄CV1ӿaJh b (NZvq!8Cb!6`(c8Gą<%d<`: YπKB4A9"eV|s;'Bj˼=(ċx2`A}pzxMj0:[ ˒,)  =S,%ʁܾI*0 *"0jcqk'3RʵwAT dzi41D=1FEQ'foKnoT>_L;e\Q9B?a wwH1?$[8Aŵ\ nn11!1;)p we[=K?9t%KxA*}-xRK0 WƅLBJ qvH*q_;3h\p&Ȑn0 SCMsV]5m]U]_Mm]jLMMi-v5][)e3Y|4iyUӞ^wMQTL^t}Gq`釷#o`5lܛɇ}p5eVꃵ0ֿ=-S pv?f}`#7X*!\YLTpI[f_?Zw* )3/IE"KR4$@,\OPն=;9*Y!`X_|vpn1$rXܕ`!g Kd5=: ݖ ϑ!Ma|zǧP1(xj1z]4;1!C @Kjy5ҠٷfSCKU$nnlD۾m74vT+Jq@鼵N4l~:5mps._r.OhM[<'8NkUKQN{}S*gH`ndsd%k.K\\=|[_Xha-k w5/yeH =[!wDvCSu&1=*),kM w}?[QйwE[ڵC*bp5G` ?(.,xYbr,XZoS[hB J} !{0| )xPKj0lOB)  Q,%#Sr:n6BxogeUkRQUQ(6FuF[e7Ζ#ժ}۴Ti$SFWcw\'x1<-m$#ʺQRWPFJg(²])0Ko x$0{>jx*Pd!<7exvw| C sfÅ]tô8owRq?ѹbxKj0D:E_!%beY@`*YUԃ:ZYEcJ2Ϥ*alFk̨|PD)e}cRXѧo6VQ_b-/0JG-0p9;2N!u\sC2lqmuȧ#. Xu9\W~Ή~z}S\{?VJCy rx]j0uJkkPJ.(YՂ2@ߓaiUmxA'&0%LHb檬 XK2 1N`F]O@ܭͥ—µ*-OTkPOԏ9 HܚER-!;exw+f*+)uq~1` ZxYj0Du-VC@K+##3G>AH`#9oU2Fa$RRT8J%ԉdICg͒"}i X5&Ly % 6~A4RA;rR`WQ2z2=vC+Lw!Jfߞx] 0s@e&/ `l4`R[O > |ߴ ICHF2ƱQ Š]ShB:("9EkE y5QjAk Zp.2雧NmtV8BQl[MR~,:&5f]IXLxTMo0W,*V=zy"Z!N @X9ŪcG~=4)Pq3;;;;"YeEUHYc[hu^5K6.,UٔՎkU*/VE%umĘ:-|> &DJ߿^ x!#7)u>NSek[=c 7:8 q_TѩC0NkFayLށΡL^@/&{{I&-ҙ8q8{a-9_xXw1aIY$#2$qAOsB. ZfI\:~58>P^}/TKOCzhz0L}?$X'(˕ݡipE?o7-2:P NdpF=)tE-m&FΏbWs_t4ub tj&`KpGcr춀C]otm YbNlP:SSe})X8ClKvsj^,ZWhohos.GģF MGtYt ͈Ska dտW*˙}iL>6unjeN~>m6xj0D&ؑ,!@Ph@Vue\K)ia LNʶ%VtqRN8yBizva [t˜w5צV\:*+Q!:#8oH Wx"2הjDoHix lC% ^6 QB,aׄvX<̒9f'2Aqz~e}Xr/NE3!_aM!oۑ7?Dr{ vgdxNKj0ol+ c2fYh1Ô RsDhNNNjO(66('< ݷ7dr1~[xIj1zE`Lh1!Ą`A^<s99T&rD3;L,!p!1LLMNT5,:z$; .d1CmI#.zDsܻL[RyT <ﻗ׏|cuI400Ӫx%ڬT -rt>Z ͚\؏[a)e樎UO~pѤMG.p, <˃/U\g #B2&* 4956 >^߿NE9W]QƟws UxMj0:#{$[v%OS,*YF }^t5| Ljm3}kC䀝F5Q#x?F[1Rh:n&٢ۡ{nAvGEí);n^R5%J*!hsJo2`O)/zᲭPR$HLR18TvIvH  ݯ{w?2o &9ט鏑Dp1xMn0 :wt\Ez P=bK(c2/HD?~RND`q;}lЎ0tGt4dqUD>CCɌC ]uMx>'oU9$x^¡ZIuu9S'x !u>$3t*ހJ_/&] Z얜{yKyθ,J-N3!G9l2 &<ЛLb iNnʺD&tve0A֘o!٘,L2L%U^eW*}6c03Wp禮h1!bwA V"㒗+~X+F+C-BGI%Ο8(8emBP;r+$(1R)"\ĖrǥSc=x0M}'g~kx[j0Eـa9 tBV ɣYa4hW_g!_a"(4OS()) im3tPB376=4)Ni^|V?A[g)0CT[Wz3,L7׶RJm&4H)40il[#f8BKu 7{y[S̼d}yiw7LJUMfKY54oSB|Y8n.3E+S΄xN0 y 4i! $5"m&48|l?/5))G\jQkg5MAk> q)ducdENaU5!v%pC\ky4`޻8Ak]53-d-("n]C 7D?08ؽ /. %`9B+zzB1̫ މƧ! &ef,.Z|&I_͟&]Z|89xJ0yyJr].db mS: ՘V{ꝱCzD=j4Aw% =FEgrz :~2 7:Wx-2\OLu~ aN;U"rfͯS/pAf Hy(?hzehhFz[wN]ɹ. P|cԝxJ1y>aI6== >,8!=f⫮D &ƛBTR9%\:̶H1CHy6Ȥµ/)\&7}nR]@km&j\s/#!@"Kd~w/WϟS-e?ީo\0xO0=C@B-nvY;bĮkd{["(U|F󌗭(s.D;91u!ڬi)-gu1-*.ZhYK8*x7}=WV_֡ 4ɒST3 6bD;KJ=\9dk+?0\V8 &x養AA d\#7,g&ptjwOO('6@/ƞ {:n@FUg&$Hמɕޠ8Lƅ+ž3@OF[7wƼ` ݊p.sjm blo#xn0S,mԏ%- 4}).ET }S~SFMmً2tʴ؎Ts3X1Q(indkZ9f4ݠԏz )= J[Yb_9c",XsA]kQKw 3WR1M9܄x^8Êe^.ܹ,'Qrώ0lkRc2jv\P"ΫGp1y,Ck3s)Zyo򰯯45 m`08TI{\_:D[K+#Ԑ΁&8ݘ,o2hI?.]x]j0u%zC'mU~㞠i`ވ D2+ld="+-S0l0xŞm 1lFgQ|1Ifa628'џ# L6۾G#|~ze(A l;)QZwJe!J۱Y6¡2u/rXxAJ1E9E]T: p!az2۫'W@-EYB1(Ryq55\:ivse?rtNP8tkmngz ˚]=EU< ͏ݷ,5(֐;qai`j)ucoWxAJ1yE`$I'"z :3BT2IN.01#e&^'K`MorH0/Wx)Me~v8ѢEaZcwipWzUc.Me |WxKJ1EYţ瑗O4t*c]8gt"p%bM,BU*Y QDcG2; OXBDP ѕ-^[cٗNSj3V/8jDM:_Y|<8_k̵A!C+Jz{ם2oy}|dxN0{?vTA:BGA8^?HI9Ns zF3>MDt{X9d:UMVl3reGN &ڀ"E8X*cR*ö|SC@ V,An3 'E=D2ƒ1h5QrL[Br!iep֢6'#s mARhKohm|K3=+?>)`e؉x+a+ee`xQj0u ]E]9  9JڭEc(2soUf nq#[ 2$L}Jwƨ*M8ӳ "!8d ,6iK)y[U9>bY>u&tug#s%?U-ףsFu{0*u?+tBYx}Mj0:\A?TP\-r4El("JYt5}d"`[n4Ja )ZHKM؂M1*d] !J5X)LNG&s{ZS @x]K pI[V`_69i3&ƾmЕ;8~%=?/~vxAj0z~aW")Bs w76QPCroO3ESqiSR*%YN&Ns6o}c } (%>|?á&r]|ks@9t׮KFz봃&6C>=rcExCq7?hWcxK 1D9E_`$dL2… ȧxqSW nGZz%-Ze1 e=]G]Rj zkO^!CszNuc΅`)o.B׀MWK WFVbB8؞e4݉q>(v9οn{UxKn!D/`!(>R𱀉g;_UW"G\V\&gF-8!j vJ1/8N+ԜOR ؝2\/pYJ%x=W֔4IBJp9[)NrJ)Nn4vX/p/J^dLǝC&.ڍOx,=!/I1ەjcA vkCi=~%ޖpXms}?.bxAj0E:\ee)  =X3 eT7Շ{Se#ɘytdˌ>*Ƭ>;,E){crZ%q.o13B jޗp)pu{K4J ̓nk?3Dӯi ~M{4}*C-eOmYE!x}A0E:e3m춆f@@NPmedHj:}gH xU s6d\qКVeGInrcz2NJ^Vpvuz"kvn';kvdVה^ݕ<_=6t"ͥ:ڱmMkot Rо=nN$$K wBF;z(IL%ł*2,J LExgܩ ֕Usa+[]@ Sߦi,PGK'iM=k .q*ŀ+ZٝҲma o/xn0E5)bWX]zQ @ tȡD" IZ(r^MZckFjWTFZf7Jp%ۡ黺Iu^ҾucՍR50vf#f ߽_ >fL[/Pmuv|?3v^3 A "I O7x!;5{!~*Dۯf2=q"Aј'*=7O3`H,kƷw0ĸL9UL`Ka$k,+y.:uNAk1i~s1y k6@^r;}(0ҵ&8S+Q<,"˔"Rਸqo0EE& >l?Hm֛kxMj0N1K!] =Xņ Է+thE>Y)C/5֨@Q\⁕(O&k1tK*Yyl>-w0PZ44H)unwx/c~R킷FJzҭҺNe9SJ7\W!t[(5%fO+~cϞ:xj0sBw-zBIRhi^.4Z l'Y;.e{9s(zDx]Wm)7 V\J`[uMDM£Pskx*]M8lK]tݔ{yᓟ2u7~צҍ޶- (}MA;bzƣE|%wͮ$b[*q x"@] 2PKtCmap8\Rb.) q"?<>0YLtiu+L]˜hC.A'Wt(3ZT!e΢!L4j^uo9 DxAj0D:ſ$˒BIu|Y_HlI.B03 01D_BOýp[Zʆ ŀ:ZbP@7$."FTc4:9JCj8;V%&9xx&s}=PY1.O!>~ Ko u9-H8o / >2NL0XۺT`q(3g [E*_{/Kzx[j0uʫV((r=vmQ2'9A01C`Y4G3q41PъhiǁdXRtrAQkm_6c{qZ}uGd,Y[ rR3tv_ YXw H.-/; Z~xKj0D:E_-Ya@ HGĶ}}zTA,gr gVGx9a}4 8CC4^&t֠WH#DّJbE6x 61=BJuYŠ6`Qv/^.EF7X:CcMe\Qtpe=?o|/_xMQ!StZe/P(<Ҫu'X' Izce]P8.jӐ3œhCO2HvZ˂~ δ=Tkcx75^nwOPZ&iͩwS-=#\Qgj.߁:ZbZ1Sf!.i-L5/#`&xMJ1F9E $] "^@D`oxj0E.&R,iJwI̤ZV#qB -0p/g8A"/(^(Y!WrWWBH .4*P ֥Zz6 \8uQ+=@KfvCw>EtGE!UEC%,D#TUC2NG0΁?֤.D8О0voK|mKw^sw雦_Fnۂ. g;~vxAK0sS]6mEE=ałi4b$EM<{c'Tj2UWR5r*EJ5h2لlBeD;)^dBJtU\ xr8: ny'΍(kQ \pΒ;1 ah>`vzFq08A޼m"nNDNޒOz_[{X?l7;pa8Z4CAh.`"24&b9P?%cmj p}Pa_ 8xQj0DudIB`%ֆ29A׃734"e$&؁G#SbELB}yv㙲15 wk;p\FeD9:YLNkuyϗJhZP;i<&AFRSڏR?B]z^_x}N0 )|6G˄ YmR%6nOɒ%[?̙~Ф, #kAIĎ" MͨSdz4I /)e}ORZR63L 6$(aWƺC$sB&L!*#`@7v]DI&JiP(Dqz:m+!;֢/}_ɻƪbOYh夀m:=0Ě=]ͱTU[%esj;]JVШe'pyZ/.ɻg6[Cֹ3ʲ**/JU ~:wzX < +(Y)"Np6=МSYtn.Cx*A2@agNd[* H"00z705: :@ƞYFy ~@3ywA `~bjF6C]Q^&[F 1'KLvN<gmb.IxZ/~C%`AΝKO"o+Mq9MBXĀO,J?l7VB6*GZK$c~J WwvWr7vMc*׻ڻ!Vv?ْ;r9 ֽ}/6oxVMo8W rJIP,-{ib=8D-IR&]d7o3-nˍ^1/v\ޖw[o׹W뭾[.n}*M~_|ۭMhjl^E.쭣w޺B7ioCanz^wf,V+-6Eڄ>cWayZ7g@hMw7!9%ekδ!˾썧VbOJkOrT2 \FAUFF<&~J_8.u9ї=g}̶*]QlMy4kc raJ:z鯮SfvrlPvW?UfGmSb:dD%c{7U?b9SUe]@BeP p[I}JFo(\KS~:Fr>*:'`sƓ:ySD0yS#Q {4B`l Y$E l%(qJ)ԞGxI.b- Zwa4?mup%>k燡,)\{OS |kp'D >p{6$9Mix# d5"a#׉}Kkьժqܢj15ssQ h9$*bNVWH=A_61'gFsԡ3hrO eh4A, mDORsE+nG>ɟ|!aEV1yZM<hdʈ9.ZxZ^g'kP̯:T<י 4M"G&# UZ`r;Q Y|HV#a5_Nn'^>:Fd >Sq~q^K/24[Keo̖,?=_`= x1O0wahqT@(:ĒGSĿ)b$tݻサ@s.E\[n֕.MQ(Di5 OЬ\R%ͪPP媰XJ0R"pB$sd:LKPr^.d (X]JMaXa^\Ep\n]H|s#џ":W _?I mxKj0D:E_`}l}r@NВ["Yw"n~r0.X4}TAlة2L!h'G\V*A{ > X[v1&c"xZ}Nd惎8v<7ᮑM#8:Md;Hֿ’hQ~a ;)d@;ҿJtgX/kyGf^!|_xg cJt?y+kȲ geM{y,ӸZw^ik%Per Y϶pxwk%=`MqtT f튓iKOM2zaO<41RUrĔܩ#|bY.+̃^@\'-10 gxAn Eb.CUQTb$c,m|몫қD 0(o;e9R8-&\WBG;(:}tF̬uL:kJdr{tB;.MScEvJN YB<7(),9Dw#X3M`uK3;8H iv l]3iIvfsL /SkG΍I? z1}xKj0D:E_A~0\  ZR+6X > ^QnD0dv.)h'2d2&I4z6䣲,%ȜdYt):B)6kZ(/hX;(M/ikC&6دze$~eB|?;C_HbwYxTn0}W#n7B U+ ē±#i6JJ$_3gΜB0ϒ:0%U^)"昄iDHyCǁi*DS:ϾdמxQj E]WZӨC)B+x:t_SE#Uh'䙦NRV[LY)88PYm@If='7 :\|й{u_8ԟc]@!wڪgYr>w31?>'XJhOlˍQ&g8 5!/e^xAj0@ѽN1RFRlɡ^ +hF#, i]}xuZ9,r %8s%g44dWp8S,T eDdNR9Ņ@L֤S>; ׯ!yM}_Gp+խOCgmo u?469 ST y5QexAj0E:\EȑB `Ty=A_o"E4=1Z c tT5jw3%.Fxe Ȫ)q1t6gMфWon0"b# ֟sri#B:}(yiԞ y1 UuX:\xmj0D{}ŒC(@je,(rs_3y2CTу6 Ɠ{c{R9ZXyk6^+H΅D)X%z_ <\*|£p;?+ۅJeNW8褕Rm^Z"i|.sy1؎'G({NcZqB|/Ʊ+)uQ `xAj!E}B^퓁=g`,h<̋)`T7yL1Z|l18 ZcmZ||WOm/`1I;ՏeKR c@20pF eTIg?7]x[j0Eـ^!n  FҨ6VPƁ Btf@Th=ys-%D[`..[Iݨ&z$ 30'S؄ƌ6^.sp :鶾ݹ$/0ιd= k^v]DJr-G m 5~ߍj@XMxMj0:\A, PMZ 9~F4n..e|oQAmNAN;ƏApaToGS6L8{$aA R?J;'3;͹x˹ g?)VS9ktD'{\ "B(y{&{ˣ9V+toGAh] 5#(. 3JBWx`o }CGu pyxKj1:E_`~ !0r 4En!5 Yml^ed*HSp.jT'̆9EdQbA2zeE-\11&xcRq2Ƹ]k`VJG]_tV@S#FUGWsU;m0oǖG8^^x[J1E@KI"n@\A*rݝ&S{_peA0ؠ]hI9ΈۖguIJ&Wɥl2hFUr}1&v-T9N¢A.B/Mn] <ԳoE87ڕe0/}Hi \$xKo0.DBޏ>PJ ) ȉo:q8-T]T,|3vET˲Ί4Ҫ̺Jd\DQQ36sKC&E_'qqˢ,,BvS\˪Σ$a|u(VnWvfFi>NBՍao4-(N+htTΑ7jc icI ܽvuxgJ5l8QЪ>| _%.PiI@Myog_p v Nα{s{}}꥽^ޟ"0'e5 ?`1.w͹'{ \Ԃu\l?TnUS9xޗ`%6z"Ca")x??xMj0:,lK!^PH3b(2誋v}*3PE1#DZ8jALj+AzcZ9X/}Đh FfbC v-pk)R؞r8o^kL1|/: `nR.}sfOxQj0Dul>Z$ْB.P zHGn_z0Vd4z&x0!k4՜yU|S`~xQj E]l Qc̣nP/&|7]Aׁ  <'D)3zMO~ѩFwS\AM0ɘ{dGt~Gm|T7@kw^V׺"SQ[op 0^u";$pݩ?Z;硖2폢Oy`cxKj0D:E_Ar C[jeLl"'E=z&d TƢe]l)>کaV; )G#Kʨ^km}K 7Z]:.2'?Yg~MEr:t|JzJ䡖2 1[&xJ1E<; 2q-I'N/{GpA1 rJ+ùQsBxe̬AtkCNZ.Uңh"`ᘗ6%Wxnm yZ}2Z52'ϴFdD؏ۘo OoˬaiYڶ3Z>6¥į_xJ0@q-7ɽ)m{]8p8}#hI%f٤Ŋ-'M!Z̘pA HNQmW^ॵ~?|(R9^{ R;uq\v A !^qܡ,0ӗoPo?fw_^7&xOk0sL`7kRzR1ZԖES59x %[L ̻{UܶWݽIX|@;?~Ij1xRK0Wm/ȯdYʶ= -Q,VyJRJhM DV^8qjtUߎZKll@.A4wè8:[-hC;p s|>>+'b˗Q1o?m~lliX&% /`y%0;޼#Y'"#bD,5"ɂZ^&];:(%$)2}2Lr$AFfܝk3_K9+xW^1&!MvL!˔XrB xAj0z~Ak)u֮jAE9mJOfȘ&:3b8S:yI6iv@DtƢL#y'Ͼofp6E!0y`{mһt?e=B_ d.w_{5a].xNKN0 @KHHGNDjIܞ5h>n;3&Im@8]p3VZOnF;4M#>Z;S~63ke3AGe7:x-egx _vZ A'N:E+e786OEnv 9Z*BpR}#O,A>V{.RsV.gM+P?OyV s= }WB7,zzxKj0:E/gBr@ V;j# sx dU^ٶ'?aS{- LZ1s*<m<6}=%2½LE2<9LX.$ \:mT>c]b)Oʯ+(+ǐAeYy, KLG$͌i_Sr_Hrf*Qܦ830qR;qd+Q~ls8xM[J0**yqq [hR7:?`2L6J#:(,CJ"9SDspB\tHvFefERkZkDueIb;kk~"AەC _rC_betGvCY$ypj)S(lJC WBӀСsmE6҄gҏ[k=t#4O.оؙT@gtcn&Rwz7XD7xRj@}߯hn-Jҗ%NJ#HbwelJvZJ. eΙsf[fXuɂ,Os&8MEE$XīP#ZY\%˸.(zb4 eU$/Dppc,Pu8UW}|ϻjfx38NcEY):Wz5q+ԢqTޘޭa$ J;Z3qƾzN a>&9Oe[hI*(T Կ4 r4Bba`xEL[fICȁXaO^>ѣ>J?xZ)4CY~+}7-kˡh,Z؜Ο/%k3=js=; |''x/ee]3?kE 859ű -{""i0#g?o>/w7EUnfҼYuX>{f/H@*xOK0 MvEV=y?66%IWMUfJVՌ)yXj# JZT53h$8F1F JVB)׍hTUZ6Dαsn"|륎2b̭rkHɌvuA!R=ÃK,aգGMrQ2Z~$ba0+S V{!rO ȈP'eߟ'oqdizݡ~Y=n^/&k~O)/e@gpF;Ko.+=B ׾.m/9d\\uBWE+x|C+{.xO0slaOR -(%#q;r#潙7?#4jhƱT?U=VbuTJ0}SGbH>ø?Zn^} KǞCd"kA^ / A\P)x~z|nl40$o>{a 9{6@Ynb5Ʉũ SI$Y8z:ćsL0hq~A[W-9i/Xø5ն%Otw>b#%WR/ .3sh]za,[s2x YSV^2W("gLjRyQg=ɿOef" `l'Նٳ' ZE)xn0|/ā~-9C},%".W!EOE/"AY2!xtWu\ڡk1YbT׌J#Ⴃj3vfP\5Cխix=FBx^Y7۶8U]U|8f?$=?<ǔ 19`/@ca%Lώ`lj zd׻>x.#`]fqTL%0S6=#ݣ-[E%sTv׸ H8HUo>r;!nSpb`p :vr}"D8(L hmbkPY(deӳwHnr!{o5-74hI] mxj!O]LQB ypkG` !ooW|3:' jmMAD02)=V6tO)4QgЁ&9|~: XZGN|W:GlK($2O!+xJuq]ϝ z{gT/?v[9xRMk0W̱]{;!P4UW$g&,!҃5{@j١ƲútȥuTKMr*Z]TRUj˪ҪuuuNi\ pÅ˥5nz-^C! Uvٴ(\LJ' qe tDVe^Y3R`sNq h9J6q(|t>세T8d^^N!yH[z51,5(10NIi$Ƃp 83zpp!ysp'31#fL^l|bG! Y{6#I=9wGM,%yz\B'GVn`7Ya1R?>g/i rK603Q~-@= vya<0كKr=05~wsfB~yd<39rRė?]ga94[:~2Vn6,cCcLo7N$l x-ģp Q!7lFxS]o0 |ׯZ qnv0X,dmׇ-/vHGҊmN(lR 3Iu:2&)2YʒֹL7U95eR Y"MKc謃[5||Hv**V I$ 3K2VN!KCPEвv*| q j==bB8 8{p%4NҏM}t{l{a `a,enc)CpW7p*(3籍Q*#?UW 4-w^A-C[g{8J'g\~ z D[G$ZEDxz s^/9%^ؠa 51 ܁[cےR PYTb Ŭ Ŝ]dQw-FHT{Ddf CG===&녶fG  NuP8{u{'`'Ir)x@Pލ@4ӷW_>. *qI<y546;/t|#@##)H Bx;8#Z.EGvS1Xe쐡]op`la=1Gé=픇63rfI`V{zlł>8ysē3&MDcA cc=*m! IAle8P""@M 9ݓlF0;[&1B$]GgzYU` Oa6a^hi`Wl PGkOr TxDMs0LY㑾#1xuN/ż~u Gy-yGZӭIK q~ě8'OkO{{afw}u6)Yض]?N] xAj0 E>.!  =m)36BҮJ]IO\@SJJg14,6T[&QA.!oGΩWfa ?'G!`=ټhJL|s5Jrit2,v9V58[ J!]֐WsT5$k3'ƾ%xZ|q xj Ec6(, &:ib}Mwii_'a{Z2(΅h9PZAIB(ЪFYL`6ݩ4h˅!{4 n)T5k`4õL1W/1f4s&;a98?AӶk9Jg@kaYSX҄m1=l@B`9 Jmٕ W ?RyםwᆐPJzOWjPXC@vӑW8gΝx[1E@K*N""n@\A%]@H:~]0_љ!Xeg=aʌNarLHΦ 51KȰ4(c@mKý(3Í>+\[ wqHVV=;R촖1eKG(Wƣ TVeM2s#/~Ww'xQn0)憄U]IR J%=Y[ڑ=*o'{y8f&34tZ5Zj:#i+<*1cM תkzy+ƉVmXX<|11{@AkM#j鿐JzF 5d.#{v.[{!~YDMT:@_`yrlN _Vq|ϟ*лCviUE6bG}/{!n<}N.pk1o Q0x ժ> ̑BzHſ8P+忦%ѾU> {] Ow dvqvr?R- xN!<ż@+]b=4fY,o0cMD.(ʺCYBJ6m(7@huLI m|-eP,hZ_&CR&qaoܗ JuJk-0ZJClEJ ;- Hz+\bnHV8Ŕ`w.o{1W@:R*#MLEbͦDs^kacm=T X $|3KnVYt⠘|D<\obB}&fcuxJ1DNғM/"z ,LY0!d멠WUca S$[ޔ *%駘OdzP, -MR^OK -!G }EZWx<>wv'mrÂh[cKt3̓RF*#0v˫1׏nK+eI_?7VxAj1 E>.0d'.(z-wq;ՇuxtT)1]z06x^BHb@q< %~އ˭=mHXWp gdZvVkaM@;4ּncW)SuZ?WxAJ1}NQhM* K€'N*v3 ۂ{]}>7U)$K众يx̳K!P8@10[,:{hyVMh֗,x)5͋TGp#&,Ykv[{IFSr\M/ c桖2_?7VDx[o1WhoiB-H- {4Y]{e{_xF}@lwGO2Z^5Kz)T#2_rQ E6'Aey#QbltUֺf!Zb%U)3c<|DZG<Ч+O8EUŲ^`yƧ.OkpC4Mc[@D.[4(f@@= hځ#)6d@¹y>F,HO*N -2Bp8uθ whi`^ϜW1Bҝ;(Vf! =3NYpx^ =SCr"Yx,(3|[g5<yܞ6[dl&S3iqe}Qd?1*e][ihD)cJ*l:ҭRhQrm 4ƒ.k²uZVN)+8rg08טz8%]bvP 4#z.azs}_1!>v7]xKj0EZۀVJi0ByxjEn뮠tt.U"0JszNVI69MQrc\lJzsA}0J{mR}KI8+ 6 g\'8R ^om B)C5l[pi*O@ pZ ZO>(3.|;83vɟw]I߇?0e_,xMN0 96Aq$v=4RT;#8=@VdY @CwՀMގl\z6zlMk[w٣owśL o3=\@k֧?\N}kmǑn4jWSj  Tߪ G *I󗻖HbzwV(_ $Y9<%D>ϯx-Q見]ɵ2יJ74§?O>?X׈x[ 0DJ̣"$s`+9i>d9y5wފIs##Bbąu S9I-K0?۽TAR*Lp='eeH+4JFkTu[pP )8h rW79 s w:Vg-"/K*J8v 3CĀ8GcmQ|\ - R!]~?xUmܥ)Gixj0z=8ȖB(}BVZ Szo7 &\ MJё5*EIA|Ṃ䐶ڵ5!&oDmtKh_j |e 4=p}݄B,);Z H`IR' $PT\̐04zcz1ؙG$jQw^r!E _fvnєc!+D3:/jՄ;;:w" %I7}OAuBoxֱ {\HaIA{o؏Ae{}Sy3LhM4*jJd%%ʖe Z+unԙs'~]x[1E@yT-"n`@p H{_.{Fdم Q_39e&Gu. S3Z Y{H$zlAe),:yֺ^w3}aҨZzC7 tOѪ 1,EtZ)S|V/ ZVx]j0E߳ـ%1tBW0& 8B*}FIIIxMJAG]) i.bF70kGQhڠ-!:z=Xkm}Q_b]_Ai`0@'ka"㨍)A._t@lp>g&q%z.\#B|i՜8ixi0DU6 ˒>TWg- kx3HcԈZ7Qc?۞'&4kQ=qpnFJ!Y6>Ʉ`0_RS^ e_ [XCf\0H,;>G]ӏDiN%Ɠ{\xJ|x}Mj0:\adْBH-zgT l"M.z?^"P.FjxBZru'JO5ytFe)@V`Z6ͱ5Zvr+ޣ(˘2m$Ox7c./Cѵq"ThαI)e:#?ƚlRvb@@I{KK,SJR_{RU1m?xAO I2/=F`d`At7'L 0&~-+rR*ꑱW{\/|C!x݊0 l38,RzѻBL:v 'D{sRvr؍S?]f6L 7(qLfK%XމQiZ50e ^zc"xC% )EJI8q9kՕBB\dh-h@SallehŚ!@е+qPji5X,.N,`xYHtO3ޕ 5S;!A~|97*Gm2`;yϚNA-虱_Ȟ<߲?LzxKj@sBOϯeBHY 9@hIX1|Đ}zPTjQ~,uR# zS"[Kѭq)p7: =RL;ur\#𼯏}-:RuΒ"4]Z_K3t'XM&_R&Kz] j:+"w-|.ӦCDZ?7v[xj0z}PBC9Bs-U[Fȅ}c= 00<ʶSs9Z!bmG +IzSS@NM>ZzRuδ>Ϲ0.ӖoK1Jk/F:)ųnLTkT⸃ cO4Æ`a;E>gRw  \xKj0 E^68RB+Pl%)}v r$ Z)h'}mEBV&TFT97)$ȊVLʓt^A[XPo[NJ qt0I+[b= 6_@5lctqsh{ɗ=sF1߷?<{`%#xPN0 +|$f}!ā $$>`$Nmĝ|=8lDVԔJR#+3YVE^DeUSl 16e#bT B&5یtCF̉Z .: >y=Q8cr;qt ԾSx[j0wb6ࠋuPJ7P(tEՆ82Bۧ>EM)rb(+9[uqAk.¨g-c#ע>bdy7U>-/Zxڷ}K'j3q)Gxu 2<'$aĠwwRፏ;J mykUbY^itAg.5|Xo4\|V 9BW@^[-rDLa}Әs?VMߗ?>eE"xOk0öamٲ7XHOBh-bk${oq{{蕄{Yw5֙֎}kL'N H(m״}εpRi% ١Ty}| ߈—KB;hhyZʺzN$R𿔬U: 2(^Bo`B RY.8ߏ&-atpM }X,hvG nE (@9 `Μ>̏BrL!3}Dlwg7Ok>zf/3pbR3~$\n C['mbk8|t|>w9W-xJ0yy%mڴ]*>Af2ڤStT1| uд1dkq]r_^.sI3Huݷ]]H2 on5p]>e3*c4VWpҭ֪t 2kT/e0^lcAB d*9+"1|C6I9l,3f<|@GxIJAEqغ( r :4V@\}፮5hLpgSrIY9a{zxIDN,9FX&:Km,{]𵵮ow}Z8s۞0xǁq"Kc:c]q,i=p୵ ejNg~7YxKj0EѹVQ Y?j d\%[r9л'\ḭ8$GMHM!7=Uq.=Q FGjC4SxȽ4xcRín?8Q.l['3;Ӄ|$5RQ]r+1I`?j-M`׭`V[b8j ?'M; M.J̱+GmxQJ!@]z=\fBG1j gf̫d C 6cȊhBi1Aye %hvcX/jOsnm [ ^48m4bX,rRغ/E y>Z(\c̍ogij.~?8--%|]xod_9xn @|:i?0i&IPI4ߏtϦ$"Z6F 'hJUѸN8HJ &Z UZw$;enozaPhc[rkbw\Ř/~&'hJKѵpfg_ w@WJ8)6 9_LXm qaclGVx%X38l1OÆ @2V]|.] sICk av#X}LTB; _ľxMj0:u" BO [@,Unt33@P1'k'_!0|v:srbO {dqa@Vʅ5HGF[ t޷6Kk^Hͳ hVJ1;Oe|ZPJCZe kF q,Seb 01`}xQJ0E@%i!$6t~Åsҙ$ʜ9z$4eK=9ƥ{c*gr9"JZ0-υdem^~:s索<Ķ=V_A{nEi^i5 wrH ,\V!Āؑ 倲 VQ,r tg\xAj0нN1lY!^Ph/0Ƶmi]tݮ>|x/Z듋8-1l{6m䒺SU 0yg:MηǎA&c.F 9}ɗi$9ǼXxm05-$E9)(.@'q[|~u@ѧ AR:3\D%ْUayM} ]~xJ0FysUOf_@|8mBuu*@*Z+s <{; 99 {e+FB!m~H 44z۔+~ל+,?|ǐgRQ:g-uJ)v[?˓KK:( Dj„I27Α.Rq#P*mB+bSq@|e&xMj0:E;WCf100YKV[e4}),HH֢=ڡLuUڍ]U8UM? D eT056C?ھĩnu FWRg /ۚn64 e]]wuע- %goVmWn3D\BORg 5H8>я!aHxQwGy0,Fn`&t?b%'e`!z/=@$rS8]."l$4F'$3_@F`d13h I`1Ovg6A(;Cn9tH%헿tW}<C?cˮxOKj03رO)@Ol?'n;8/ sfڕĕl{mht0"&Fj7&6z#V:ap!v&mgB++ՠuZT*\pὔJ.w|&/(h'i$fWpk|3-s#|˺#eps_\gmXoB[<+0m \kc Or*J]7%Y4f 8"  xMj0>J'G `88Bo_(] @Ra@z$SɺH[6`zԁwp0aN~lMc3'4bLqRx\*[)~l?ZfT0C,tiZ-"|% l T'N_RVYxJ},+9wñexJ0%=dA49Fۤ^z% 3 R"Sf\At!\͗ b-~^S1\x;߷?(:|֗xJ1yHwz:,"Dadl|{멠7 .R;c8)3y !dpO9(1E#vNbs~2m:ZS?²ف|;[u؆~^=ݼ^?>oy9Q:C16_aUxN0~}V1B@B֍!#{oO ӬFO;Cx qVX!}pɱAi`O\Kaj 'J(sbє <6S~]nXO./ n@JÁ]"3I2;q@ŒpƄP \+-G_U(%rcs#eSAMbE/8!T|/tAL.*{oH=2 !p׻?ڳOPxKj0EZۀ$Q((:+%#K]8í8J(,72 Yt"zAZj Q#@ZD¨ę#3Ni3\υd BlK.rRN;i~B4{mYaZm{'HD?L3+sN78Vs5洝{D!t_`u`xJ1Dtyu0q)~tv'Ӡo+WNNI\56)F*I#༕%5ҁ\Z,:FðO`aSix.!|dži ~,R\[)#8g;M+'P;ui!cXK똎O-;Xo' OShxPJ0)=KIx dbiSTٷ7+(xOԍѦCAF?+>\j@9^8FK\Yg\/]Ќ5*)aא7x=c:_F.`=<߁:~S|k3YJN5[6f6KKalXŔ.A ړRcJb&߀X`,>֗%7j M`)ѵWn?9_s|]Gs9q)䊕xi0Dm>,:BH@*vW,\Uk`yޘ!*dɱAeFdZ8[(иtУSq*I0is02E5I/W8W1+? iAZ)nwS=!A_YZ`@Ž![~ʹ֣B.tV0 5!>Ȉ_JiNxAj1 E>v]M#z@(%7{pBn JW>t@@`*!RL4[vw!'12\̚4ącb"b,%ZoM}[]xY_sҗ#X"LͶ.UiZpޞ÷&R? R{,ۏ1&cs8V2O9 GGv[7pn3S(u& AGc o?u]mJs{J ZwBQ<&#=Rŭ\a: ,ÑO<|4nr:/tYi\$wk)]!Vbaxj0D=Ų$;fWZ&eu_^f`njl1&lB[>qԭXnFbԊ/ؚސh=;R5)R)e,>íu~8(/ ̱iPi:p}0\Tz{eTDaNJmUT{=?7ۼq@Bk]' HZ[xj0D=)d)({X[#$PuμfKmCtkTcYwl^Lt gBi-sm6/9Xn;%M 'RƔ/gH)^63eקT]K+Rly*"k[fTF8L2K,Q{7e"m XnԊS+pq9y'4D*Pu/f|xj0DeV(?PVڍMbțC.[{anjVf`a I )rhm:l)-V^(G#d^صK#M|T*\TmyzJeyڀРG4G̪/0! mrd\?Ozu-㲍t|וsSDz5_ScCxOKj0+z;~΄ڱqҹ}=ˮJA Z%4Ŭ&4#W~ErG%vb+ 5SB!8ޘyQfn»=#\ JzK% B).j.asմFO2WJu'?wki1xk0ǟH%ѕPƞI:[2,Yat &t'}#{ʉT.+WBM٠-+0jzŀBFƐ4u5Z4zVW&]ՅVZ)1nl;=ܡߟƕ7#(HYl`) )>gJcLwC?=J ]\J-43A8sDeu7s!v`[dOCL #hIK0b4NS>gVg3IM6b" ),Oqk~va/@-l6usO_ )StW?€ٶ/]{k&Q\.K M4/۟/ xQj0 D} ] Ed,(zŒ$^toߴ(``#Ӆ %vzqHC٩ʦc=ycRwC\ ZCСsFT۾KIbY`AhNfUҠkcѼȧ,M)o+ h>t>#w.\4Iyy&ܔq[Fgxj0D{}vdɖ#ׄ"0_Kg[2%_:y;%)V6̵A2Uӽ3ةzב3UR5;ɽ4Y2 R&xZ^2 ˣKj}J)cpP _R+ 93-p(;BB[ɻ+!E>7(Gpv /CFUbZixNi0|IdYPJ;@ >IĖ$}m:@ Pon BimЏa;c{udxpFխB?Zv~hwl RS LƦ :L-tK)^o~zvi}mT=d'uOR˕{Te#KIݛV#J9stQv[݅8ȅn|GW?NyyIIxSQo0~ŽU@VTiZ+omldLtƖw}w""K(e.YFiE$4@4ӂ-^i*'0w5DOow¦j'-~vD`>E1;_6 bǚ$xJ1$SSxal2],looRm"z5/1xDȍʥj4<FWT++S26G`ҚKQX蕐,*s-3CKv|7dmm߷`xj0 ~ =ZqR.;?rQ}9v)c; > "NJS4^*K cinycY#}⠥Gޚa^wfPJyN0ږT ϺNPЍ6д- vU:",UZ'xJ _Ad#hDH+@ 8] &ځa  %ר& ą6< +Pô@pIkU](h r5(2{ nߙ_N l[xMj0 >.8?tEBOL 0tbCBIdoTΩ0 ൷h0ʠ=v+qvȁ;E5(|ҡvqyml*K)t)>GC; p3wN;M|-1(RpB/i8 a.11cPwp> e­<([_e%_~5!a00xKj0: zN]tY(#kXRJz!tQJLD`U`*fR&mz`g+89:I:M'zg4 hKSGx ƧLnƺSxha ur. _NݝdJ-{hkb UPSK>u+sMP*FOr>eUHX}g P͌<:RP(2&M^oxMO0 8wG%ӄpDB?g Mq@dkAsFZ-2D㾍{-:j6ۂShFHm'wZH mtFvٵcImI pCۺy1tsFjB:S4[!Zmi7:Dr^c=x[ v )O#T$NG2q!~X2ߡnnlI_amX$ڱc%' Mqr;#7ƕaxMn b.QTuE* QzdѮFzFS"N"gr4cKA"qc$gf4Fw-YEPLARIQ!PgSg%uMĥؘ%9o" G\P[Qv*.Ox;M] )%U]\)*tp1!e$tFYBnVbZw"|o`.ļ&ٻ-SZ) ;Q[V{Z,d̐ݲߊkj{[dBA yw瀺4vaDlўxMn b.@UtRs CLjpܾj7YC̓W"ΣuJSXJ$ pTtoh=G,1kb,2q9L8=\k!ЎRRS(S5#bLe)(eI(ozmo"̱`œ 9uYbF%BP)n(Xuj1~S[Hg[yp@p0ʜP-?p3c$?YjC`;BeFD~GànxJ0$IeA@& MISavYoBp3(ĚZy2MGZrXr+{Q &3Hc#jIV)y_i-3-1K 0μ̥#꺺VZC![)N!gNcb8/ӑwf-jLmn w0 #aל~o;6-?`pZVB^y1zLx>/Bϙ}_鿟?ۏ#xPMK0W7钍!^CUV8}Ui}EYRZ0.0$6% Y4v}@X ^Vz0oK#BJm6MrXLa!ʚ̀L;I߳Ng#LlwW5'?~ 6u{pGǐS1kqzT.k~ysƟfmc &1o'^Cӊq ljsX`sE][߅d*gm RF1jAp: _kxJ= Du3]8ԫKJ Fbo >%,F'[RglyO"A۲9/sDCO N=}l++xQn0 )x\i5vb(vP`}ZbRG%0(P~1'"m&=6S3-5n`G-P(f{=@FmZfiVX ^Ɯ>K>m?N ^Iw9!Ƕ}7ô'@k! @&R8 xK~̰.0C N>π-4cY&)씙ɼmÏ͛1t&vUkRע|}W3lu3rP0d51ΔT~t h|Kx$G ECTA>}Hv?~d&xQ]N ~sJۍ1^D/0tKY7饭FOd_8A![mTu.+h%F7ZuM׷T m_HuG:˺J&j1*[-£OeZ@fD>j?=@^}״y]A&k)ENjN05:@c$p#BڢB_! {ك·xmLk X`)ndڛ*2~3KF"KtN/l'Af|0V5 ,f#$b 8\vYW}OV:fV`/<0dv''7a"xAK0s󲻴MlMXP/` la&A=GsHa]`:64Rc_3.+VŸ uIƞM{O4&JxKj1:E_`B.u=YZ dUN>e*RM:_\cҬ|>3kGTDcW&w W (məD^9Wl/?:=Ki;(S҆tRRs{nTA+|@@:"ղSV Ƽ`^ќxN0E+X;i݃Ħ;ǸH*vTjw̝ B2NkTFK͵g{Y.,*08(4LQ[+S G18.1kf=2Mݹ<|߫A0 U;ZBiz.WUX -a 9Ne{Pxe;kJt9xIߥ)2Nx78M{΅0.>ϠF0H#[;Ey7@"@q?6zV1Ճ}V& j+YwwZN쏆m+C.bi! R۞s xj0EYYl+ZPKy}PJ"t5˹Ý*Tĺ˙TQ JV3&ɀ.B!\&QJZQ Jg?))!3h)RYwiTM#G)yKёmq~isR@v])Ne{F(`[.+!sz7fMCxJ0E4i6˲⛂$löMIRſ7DD.3swnID´D! =G-le #ʵlDKa@'ӣvPܒsF4=í1} 0 gZwKF,G &iM4nP m<Ƙ/-"Y |-D ,=3cT:c^1o˧%g\ Jn,n)Js.y?gJxMJ1F9E]OAܸH%Iҋ= "khң&i8RnR|?Z40GنR.4C/$FS +E{pos.Pg,…3%6 t5Fr.m/TnNJu=ÊKv@ؓk1 aǽ6q/ jLt#K|KBg~װW~ xN <<c&FnIZhzmB0s|''G"ڪ{dce[n ق|^qV5FRǕІl+*JSspc!Deẅ| e[}_ꪊr9Y djia4q%S@KOg<җ*lE5Ӿ/RKytzd"u<1tU. f=uoKOۯ9td쉖3ڮ>:])aP{a2Xn˜PxQ!D=E_`FѰ,{v'Kq>r 䫊ţFg%cT![o Yȳq%E>sD뀐XgG;Ō)dQf6Z>;|>ZyW8Z>A7ZD$J)ZncKZ@3{a, {i@v]azTNSy .^%7xj@).Pj_[)|@/H;6voY9NI -zf':Tuuê,JL$]:UEГe$uJ[vU:/M4'̛I;i pGS~{uٮȓ,*)Dɿa&/C_wOV<^&UGPO-`p@YpxI~n8GŅ{`6Gg@9(h*×wN$?-ml RW!FF&Z)^Og$ i KGM3XPhwŹ=5Zw `fm2y9NkEʵ> g~f~-1xn0 z @;(@wVDJdɐf~Qm=t'Ϗ?iq$k 5U;M{@ӛ>FUF eזTؚ㾥74X}Y׵dԖUAGR8"''l4mk%j ߵu&t KMɬC ]ʇcM)DoIJOW)9ig|4B! 'l[g͚}$G\hM˲5N(>-LIF!=;|>*Pw^nfmx}uu*P+Oz,.7IȃMo(I6Te ӭ*~%l  Z>sG`eHؑ__B`Tt爭`s#"yLZeQBD: P)-{ޫ9d씖Gljgz ݞZ1Vհ/MK~,fx]J0߳@I4E +$Bc wӁ0p"jzr;k#lF1ZJz2 k9IFɹ !qvRq4A mI^q%Béυ܂bSx˹P3t\q+ 5䍠.mPmYsPMD TO#PǾ.gGHaQ; va,va#,x {oex0".yߙ @ 'xRn yxQT=)RYlT`-CJHH.%Ag'5ȁثZ=)+`UYhGaX`lT7K}$NyvI_tiU|+Qkʻ7uk>Υ2-D._.+:T:6ي/^Yړ=cHxAj0z~AZYJ)=V+k1đׇ JOhg"l0EB.0LjҜ`%o6P.ĄA\%{+0 UtՆ| zktᣵOu7Wp1 ֚_.(ﺟj}Y;Ӂ6hnb:4|[/x[j0Eـ[^C(@L4[FduWPu.G@}ec8& EKFMV4E]SK@DCbCwjO&pޖ_7% лcFkaYU4Zm?A@ϭ$+zv}]Ԙ w.I_f&xn1 E{};7ٵvZ# Q3B4@8~5FR pɒ@ҨmA{)UןV hņBQY*Xݛ4JIdetQäz,1V1&ۺ̂8F54=$\]])?s7-)J> hn9Ӫ=S-;Lz"Ǻ6<0 q !ȯ930΂h,Rf }tَ (rqZ3c+V!=ECZob m1 _q۳/ SMEdf_чU~x(o72hA_nq/ оxi0DmA#4c-etk.>N!ycgX59v)HE¬v b01[3eb%ߔH~)m>^GX0AKFA »vK)zdq΂}%Rc]t{^9L0E1 p܀b#B75'儂`?H`9c 8<_L ~L4llx ]3t,recHŧzĖalMh*a>ao]@yQp;KՍVfx1-l]O?7 9X-xj0D{}vib#:&e "epz]cC\T{0ÄƜR<ēM*)dF'} :Jr2YˤzvZ'6+ MVr3aC@u^^A# boiJe>yS\|%7*@Lee jST!>Vy1R-+O t`[qoZ!ާkԜu=# xOK0,$moބ%M&mMJ6wWȁ7$q-:kԽWC`QHJ*QYh:ÅR`RV3ws.tt^r.}cA]m}H1B)svnKi%ٸlTgտXw(eZsn~b,uF.t| \Z^)!49f<1}~nJ,xAk0sl!زii%4@HElH2N}[20i0)AYם@Q*UKYZh;YTiT& T"?JBEESTa9rs}`5c.iZ@Ǵ~e[))`;ڔ(dQ0DƞIݏ Fp> uy-c?GȀ3sŦz{3ͣei |ΰ-c7/8NY=s;`_W׏_OPP|f~ h#8[<<9u΋y/k`Y촋?{=Мﺍz>~7CvxW]oܸ} c8xnMh+%^CZe{.)$@DޯsW)wwM{N-i]=lvVnD$fz\ohۮ{~kU=><>hSm7B A~TzH_VwwLJzy'ΤDn)Փt4rZ6ƲK:. [k,Ԓ/&&gGWuTVK瓬iīsOJ>8t$'#༹g6PUal񒩩zġI'+ Z/_<`NTU|ɜQтqk߰ +wX)|g~v < yMHc 鉇^H|0Y+tBaY9,g. x=8G_j,UBb#\(a@JsS™y1hm^Jޓ Q^6hX7WSbZ,r.oÝ|* Vw]b",/|wf`Z̉CϛV`a`[[W^=\*Qu`慣bHl^R>ߩ_jSnbC~Yp_,(?\)c~5p/Zb)lϟ?BH7m{v Ud⯸+Sj_t 9Lw9oows]/bi6xRێ0}Wmk !@ڕ@ !/jbGnqv/Ş\93#B{Y-Jd.:x]q,Zf7lmEFﻶŢPJR*jlf"y"1o=^rȊʦ2sFфٴeY/s5w>jKfYW<A (,qAPg0\#.z3n;fB0vF!գjcNc'hUK;U)$ >-0ٲ^@ 29hґvƊaf |MTbG3a|u1KP7ÍkFtpt<%}4RTᛋH^*Nԥ5M̄HYfe,[:LQ(]SS†+HcQi > :w,_'n''I[a'ܩm59ލ뺍?u"xmJ0{J>mxOMv@۔ _ 129j 'B&uR㣃8bbBvq<ddΠٓ]˗y Q0hzؽ/m |uBoTr,'%L;-{YC[x}Mj0:\AXBI)z0F?A }]"jah+D%hȌ6uɇ9w*o!`9FZ)NV.M_RNqlvz'N菐^+u?6sljV}E;Oߊ==N { Y.2MѲ&עJ a겮T(_+J'JZA$O=OK( ڙV PdFv/-LmR oXFefK%ŇOO"Gva=ymhŴ[Hmvtt+qVMC.h ilZO-eԟ $7< gg>A봹>?pqn>{ / o _ p Cz&ݰfm kLX<~=8n|zv ?p'{-|]zwtؔQl! 6ɼD/Msxt9|_6g_d9έ8jdNvA~P(_3*ט/TE" LtC}BJ*Œ$:{ʜ(\o9rarײ6l.TБ:Ei:N AT)}.;>Z1FXa~$] q+ q%1(xOO!|bv1ƋGfݔ DFOL{?'F=VE}YB-E@&d#4w ^I uEo.ڞ8+ޖEdb; Y8qp$9fD)u Bt~L`Hʐ]ALP8aqNsRy49 .Wpae%V~gCNݢᕲK{8.W}N( e*= s y3yМ~vHaoIkqߧBwןxP=O0 +[X8Ԥ_ H'10Fj(qAiX̉+ )lUۮj,y"䶙OÅ5B^c a؈"|uފ<%mn |Yg C18\!" l,xӲ]3@o-qvمLיxs'{ p/?$A(DxJ0EvHM%yimSѿ#qs9`\x|Vx' 'pkc'P 3{i#:7XRhEA;M^C /)emL.`=ٴ8}C hdݒ)h4=`cw!)ޜ& bSv$"2.%4mlwj8@ E=pE(Q8c;1dz2Fcf 悔٤E5< $[9 m"cM¥Tqu(^$rڶ:ޱ+^(I[n,ݫckH8ZPj;:}<"ёoɶELafh0 ęlɈV)2ڢʣZw{0S\.<>vc NX"+ `dnn-y>x!F0 - }쐊=O\D*{*Q^Ph+m˯?ϟJho革q|w #jkW{ʟ}WA9U5YnauVx=k0wS28PJK@ L>[2L*С[t}1Am*[U ҝDAԖB jZ [0 E!e*8QPS:qp@0Z??B!E%Z@5,yo2\xsn-Nn= kחeϒ/13%Eāy_ ~Suu67W7+zx=j0F{bl_kr#FkmY[x2CʞȒRFsdg#rOl*o 31COl4%L1+eYf0NGJXࣔ?{^pfQ N:)sk/SKqWh ;oIyPX_}ԕ߫\=xPN0+HM~Tސ*6n=n84;3;;)ʶ(9c.@շyTU2:jHMeۣ!stښQ(wC#9A'ց>_QD"oh6i"W~mL*g#/ΞTa[L}Q7EH ; v59XO :"f"mH.:Q䭈}5y?dže.0w~ K'ac7mGGពxPAj0r")KB=XĶ,7iO-Yvfj!eCZsky71GCnXF袔 lx,k6.^J %piBúyxku;yRj^s.i𗳑ZSN3BOxJ N 2 8~#BPfCJvOuK#%]G̼?)>Έ9"xPKK1>7bIn}ZoBA2Lvɒjf*DO|艀WB\\*KBZA .9 Fd#h^`]5B)Rce)e%ʦj8i.vw=<8 a7TB%29EVdK`b1E)d@B~ # q6;}Rs ~1vSٴ$Y)1naKa~ f{4֌͌vmT ZXzl=}3F١m)I 0:6GZR ٯ7Ⱦ!xPj s[4d)/P( F7R!YZ ͗W"hQ6HižM` 2V[5tp; a%Oqwxxq%x^:_W2'f(dqr3Q'i= ݒF K91&L CpYWpT.[Yk]0]q.nGpHY($^"3-k)0 ښƅ`w CRXśB$5Sry99DkvTJ2xMJ19E]`ί""OPI*t'$i=8]{_{NB $w3{P*wYJkĤ*daFyGn}^qKs%x(u>U3#p)FdF8 zؾ]b?RjdC#zkGp35'zږk1R>7 x<kR%n+1׫ JBGGi%!xQj0Dudi%%  =zwb(Go__Ûnj L it!Ŭ31{`v 8 "EGfb`SƤk[z=ZWow; dZskC4 6x릏1kSZ)}Cm~W#xAk0 :n;Ilˎv/#7fnlee~nAYa; ==;w{)KUcnR%޷kTbH#CSVR6Ɣ]$jzu+KU6VC.S}+[PU)նe\K)zp34{x!lé^UIC>)!|'[QH)B]ipܸ__K+=y_ӸaAUSA0H;w0,)}=orcb&ˮ삆g.,xu"X[χ~߯/rMxQj0Dul)  =@XV"uzЯ0̴*=[Ƙ9; )>pu GJU \6ևALʘue`2)hkRዶT˺JS;qY> Z vZ.Sk> WZT7ZC+g~s) %]px]j0u}.8ڲ~B)@ J e!CP4 3!E'bA}.ڸڀ=GM-bu4)X-MرLdŏv+.\JܖC,;Y jO5?)%v+/z|V*Q{s? _Wxj0D=6lR?PJJ eпɹ4Eyk 7.0rǃCmG#h'R]C#>zj4Wq-Q)Ñ7N) _YJ3mmXh S)M.W^|k qhງ~]RIfPJC.+cqnJk+F v#=9d):]A\7ι0J+8mZJeoZ}OZϏ K qcSϤU_CxOj1 +t.lv~PB?xe)1ڋu =2ьfZemhސ ؈3yutD=T R'vI ňkK8QD^* R*y߾R9C;PٞagUn5Riyg~5l nχʲ25)߀JSJ[8aT'V;]+KI C&-zLڲuyckDD/ hcA Hdg%[,x8GɭQ!/ #p&&>;Pe|Ow !JwI8@4]z8o$LZmp̕]}~&"doU.ļg/?y xj0w=mbdYlJ2td$෯tjR 4ZIIQ[0K@]t2Q1DuiV&9X ol#-| d&LG(+kY} 8.mN6R;f;Dy8csXi"y7@g[!fSdDIjÐnVS?Xw~#{[&8M/`﹃POnm7\ >ّ9q< kϛ~}x;k1{-FIƄ4));atH fٝo"pG#$ь^X%{L˭d&LGkra Z%W=꦳(ΙM׫>Y׽4]+Ѝ};>pζjEڠs .WM~lb0et*QLf3RHՃߒ$7s= %Ls]9ۋ&$]A4A( QӄCK3nߙ?t]Ǽ&xQj1 }W4]f칆BB |@E1fvBh,霣c9GD emFL}k^̓J)R,Ȉ>C^fV +8;9V]N{^(4%P]D|ԴB+b8iXn.g("܄ƿC7N%ԥ!4R ' aS a npgpY++% 4,t~ęs灢) b DL>y`HaExtڿ9_//'F{9ryrr6]S }7ShE;{tڃ\D/̓#xj!}y&fwC(eUQ>}]RJB{g9DZ$"(9nC/iPp1uYD@);=hM ⤅4u 1K9*xd3(!>c٪0Cwc#iDVog[ -BH87;}YIU1(9b5>t#5Ւ,[ښTzU%wZ\ԗU}5ؙVzS9BjqjqXHo^W7n^- fz&>B]{n#Xn[^ɓc6m{?9xJ0yyIeEу(dMIS}{a @#u jt)mkSVmM)y^b+j[+!ǚ\y͙YsDgKgS佽lx´ωrploARs+sVcșuX\e+U?&.d wNO{ rZƛa!X _a"r G@+dۓ{ ljܦ<]wE G֑xJ0y9ꡥi]Y,>L6&%Mfa eH`x׶R+^cZc뮗\(^jDъAYޢ h4B6CeP9D)壹^49}Otz.M7uWNpE%e:(+nqɎ~JԢlrz%ւ|\prA3<ߝwoicoa ]wjރxJ0{bzhI$"z ,LwGLž]؃xO7?JfʳGɲs+FJr1&V9d Cj{0i$hk5iDXe}tdt z 2on(n o8gN.g$ZFx>"´ʆ*TBMð (CـBx%a&R#J7Q SBwQԨ-C𫫥s3.KSF5, !O"< X7ˑޑ蜔? 7I Yv 1[Q?g7۷"xAK0sEM.x( 'dhdqED4d^&z"BD%Vjt+M]YsiCOsVDIu)ke#{򦓒} 8Xؑ0U5x9KH>AOzrl7]I@}zt[h jB<9DB~LMh!^'H*lѼā'p\ Ӆvrp$Oby]cn))^t)K# <]x ť@c/f?Z%>xMKj0CGF^P di("t_zM3e4QFӤur"Qd&s49!:dL$1Km>kmoď&k;h|jWһ2$zmM K/sWerIjt?q~_-xPIj11H3c1 GĖDKJ#O!8ڠ*"V\wEBv|U/'TyFŢ$z[ci`u|i\v<dK ؓ&%b#Yd^pynYLV-TC !6^x?N%U bm"̅<|s7QE{17A޲ ZRSYf8^Y+ݹJ BIΟ /u-^gWm_2>9tUwZ 9ZHhػ;y4MQߛk*xMj0:\ ~lKtEB`F(ؑo_BooLQ3bRr$j}8hfV֝zZchN֨#1K1gJ|4X.O CTploP+]-c&8Fɖ` NPd}co+aM ARp;18\ZL`}qocr?Ɵ߻'Td<xKj0D:E_A_K!Ydؖ5>2dB*U"pFU97 e(8c@TGJ[C4ɪI(h Q\;n%v/^kk>JϕS, v2J C9[ڡoT뾞 i5$[r8(q "̹y;EfڨF)/t0G¡4??˱/BmϜx]j0uϒC(@оdd%4orҧczcD&ehh2iUžz;5. #Sud;d4Z*MFk_jwVkc3_Dži Hdnw)p?CRr0ܸ\R!g˷Lsw#CMicc<(xQKn0 _RI dW @sl!dH2^Kh]3 bݙiu7.8 c; 8tV;Fc7Wi4L:5];<4&G^C7<!2|ٷR#+ WuhZ ٜ':1Isc?aA;f yeHgpa{(ȷWޅz 12ew=G/@a')oBc+m4q[8 td>}͜|-KD߇,H 2}B2s7Ih}IU$.~$3^\ 511lK_ /+KRu[iL"/\2GΨ.*?y1?֡]xTn6}W d/p6,b}4FHbC*/wF+;i  `9g6z?l7[ڗ[z7_oWE_vŪPr fl~ZN͒7Dz_Wr08`@pӵ&P`j߾rݯ֛&lx5)ѯw*kH_v`I-! ID0xA~e_>/q\I%T,2G:k4&t$; N $$'(r :\$X\B@Ÿʽq E"|R'0X%6ɽ`VƊZ#XNF-LZ 4n&B j ;'-2Uci\ cC 4};Ҧꍫ/,k PI^{t$F\H15] &@a5 TT G$5= [St2&#s:}K ,A| kq) X 7Z۩끹]8LR6ލEns3yC0T^$ލ8m01zmP0ȗJGLixքxf4mGT.#[$:σ6-/O'{qtx{ۻO|r%<_GӇ!!I@rf9&И+LO>JR< I xM 1 @}O (L)u!x LajY#zSa|Ʌ չP879ٜ0&Dw]nci^iA=0yr%8hjoi fƳ鐗/9x%A b? hb0 k 6x|E*Hٻ`9` C, YU,UO#I㦣48N62o<6R׿d9l{!#*J{M \J(x%A 0y~؀f֊iJeJ߱ JibAq BH'/})9O4au-n:j+p)*\vf ܞH>vHƬZ_S>C*x% !T Ha0`׋Lw.3 s֗B1@&E`YJub V-ԛN8KxL4/9޻aRB_s{w2+x%[ 0s!MABԊ1%ƂLw93R2ȁ8Ɓ3P>?S P-e骧66Nkyn·/0C8`RR|R*x%A 0y~ij? 5Ԋ1%e^)qH"HgYkgM'ipε6R6%Gp>v#J{ *Kx% 0 N@ BҺ*Jl]w03A(%k`/#90!$qLٴϪЗeii,Zu ~pZ]ᖚ%g@/Gpp9c6<(x%[ 0s!MDXkŚckkgXc>gS`YJ`G(?@*x%] =^ T(( ,!`mҗfJxplOhcLhFmo.dZD 5 J#+ R*y|1!d]@["$"8"o*5x%Q =^ Z]J MH5XПaxNs֔ d;㘝Cӄۘ(]R-e6-O=~p1ݯr.D0(R_/+ x%[ 0E@dq[cZ*֔ Ԁ5٠ S)Fzax1UnT 3줭TnTvcX{yOvt<€.~c*x%Q =^ jL" z]7!`mo?0^ cCVޣ]piPKp` HMĚ\3PNi-4MW.p'r. kCZhetZD!.-+=>xmSɎHܣUPhKB’$!!O\˲d,y2XXHyy,S@<<(HENDǒ͇k&fJ+%|OGVu^o}t?w/EA c0hհl-lSg&plUQTMQFđaϴ+Ts$\)iaQVrLLm&pV]BU+vL`?깩ݢoK)mkl:]{2`c9YI{+a @?@랠1B{u3G<] vn:7FA9>xmXDsfMzo4,l0`62v5 =/`*(TՐ6E6e EB%IJÒN8@r2rdXlPgC36'?'bd0L }ߥp$Y_IGdID?pr $,Zi Zn}^ll4@}bK3MTc&Ej)J7vea=pɁTi6]/eBIJ{P,fʙ(GăSǥ(JaUu(j \mnw*%yKM8kfJ=ZhB=-; A؇rV*')eQD&~D4S\ŢeCҼ)ȳ53ak$ګK=J#Z#6; lӈQGqSۣ,с"ޮ"c1d\ǚhQ佨+u,FYxj#QbkWdf-AtX o{2Z -.;jf=(:{6xփ=#Z2 'kC_+2q j%X6eKAMȖȼ'۵F+:BHq~߇>^3NeuuHb+q-F-`78;!?amgwv91z949c*8lfz{{ ݴGDY/5 +_eӽ:N.1m1k>/e֏AGKAL>xmIH  {iC|3{a0`Ϳ~.s8>yHetId!-2H$Ɖ) $+ [i׶V3~̟}gNhw/!`K< CsQ Gu%rNGE,oict, gקEAnvחReUNK${']=N8Fޗw?!:ueDr|`?&lAun\gl+FmVNg|(`آD;,lp9G m{H@cOk-[ ";Y="X{9/y+pjzzlPx/Bn]zWA0ʱ%Kf"fh2 F|PkO4Kt>?xmɮVD|{\fNf fÎNgZUT;x匃JdjR`PUNI9-4Ub)P<6kD؜7J}1_/#7G4s?g4|=K1/8`IzZ%Y3.> WacXX,I"IjZ`|3Etg R "bQ931Z0R,IĶ;%SdK,5ҷflO7[S-}^#=X;c!ޡٯXrdᆼRZB{hL?ZyUO&4?<ۮдs-7<;u{!sa6;2zh h66s`JL"x^.?XT$yp[qu6&c<97Z,CqOnNC9,՜.GE.L*E.z~1iл-C:G˜˩OOsJ=obreV\hw)H$!)OI4 &(' -X}| 8nZ.N^J8QOqxD wn+p̙pvw}?jC-=IW%zւr:eK(2H$s0= sR!k;o Y5hҝNEs 9Zwm5@9H7Sp}D=ct2)\u??xmDzXD|{D| " %hGDmg9W(L& 1UX2=,OA& yLqys4ڶ9.х?G޵:vm<1}گg7i@3r ,ĜNTuo۷?dEPGqPOS,po M7Rɲ*Tb]+8ګ8{7iT]ܥ-?#Q~"tYs6:P\ 1 ^+400anٴJ-ޡG;B?u/ixׅ ,1GϢJp=.$/*]p{q!O=_$5իQu%bˆOX6q #JU6r<\(\[8L}I՚ϽBft͉wKNhc,: oλw-k;RHV~RO7!s 'BfpArTF_島 '\ 9rؙtVmbLVbPh!̜)n3 @rfv_>fnpY"YqWHnJAQ ȘyU0?ݱ`Ur':;" ])(=!;Qj'sK"yCxq v0{\ !q\Zǰ'"Q\SݙXJ d +aiM3蝾 bΣA^xmSɎXQ<5@X܀]}`YfU$RrAf8BLSAF; xgIf Ij;M v'`TEQ5E0n 5:PRl2v6J-ENۭzW%7740f/_e,h?;Д)ls.cIZئ4w /?>)] ;tsuH"mޭD!t/Gggk8y9MjyyvMuI:‰7xA[1V'5vOQ^|Em̈́$p8`KV Hy>s>m=rӲ>P"Y!nֽMERKݦbʙ>2r uI=,H1)Gɞp]ë1|_>pohZrSZ)|*`jI\͐yc!*j7WXMJ$=k{V^pmO#ACڳ([$PëU1OnHVOk&vE*D;Sa/lH+P;}jegɜӠ疡'k:^ڥ8|G Nkfߤ3>S^ =ޱq~^7/r`|O΍G_k8V RDw.*?lZ+5_]8e[?'%kъAQ./XU G:'#j{rK ~phny"#U yvq -yZ ^ozf*U;sy{ c#7Lx#`%RFlK4aN>FcぜC0ImB*V -QE_?xEN[ 1 Q "x 1nݖ6óf0  (c*{I< u\LwH&I.E.e\j@JD׀L<Ӝ S¼J:{Z0}Cc#OqRLún<ݼ,{`.zۅ&<:Tj_)ZVq0xkcZ4AYAK/=9/ D$̼4 O79,(1=U vx1j1 E9 MRO0,iaaab>w*I@൐wpC8NOK 65RRT6MW."`ޛ^z9L<7:̒iM'Qw̏&mSY"h$/iԵ&ǡeG!|'Kw{ObrNJ&mj0e؅R84uϠBxWMs6W`|IX%NNNԓ2 A@})Rq|F$}0,]$>)dP ?ub o (b>]Lb">HJ#1?>j)bD؆R#,+ڶbs:8}sؼTgWlVX]0G0ZR{D̮.[񲌺TA4ޭr^ntWhY}om!j\mtKoZ >jy=L&*>ҫ8dWzzu ȵv)$q/VO2ՠ'Km#죽 mJw/|kPY^qe>_\|󛫯2F6* *r%}(&lkeĚ~yh4b`o^![Ixx}&+6+fEUB>M9:3 a6,ޜ0a?y%"J&#[Bz=2>㇚<8;=8+ltbémT8þ0Iz:ϒCkep ]84`ݚ4k= %4%uҔBUϘ&g}Dvt,Le;"K Qwܧ\6(z% mJ.Ɨ'bT DD2hd М>6րa8$lVfZ@}?yFd5|JvϞY[it  g9qfC7D1<ݨR{gSNek=z/H弆f-j~eIJ% t~Y"b3i8;e!N9ct9QbQ`)mw^ps-'*{x޻ _}15a7St)Oj(F3WIpPGSp$݂H#ڤYE*R5 e VFdSc@V:i<5xڒ&rk#8H!ߧGd֮)xf1鍍'[)Zf4B;EQc54YwP9)@4QKȷ7(ZjC}4,)v~lϦ>PŌY,eH=Rh& HBLXOҴTJh!+!6AHI-hdy A"z4i,%iK"O8ZmQY`a.+Ts ~,.` irdnٖ$^!n:N䡅pTOUQ>HrH'ɕU :N@o%<:DR7΁d@KD0"Wy'$qft p櫔*\3_ l e#-XIoi#i_̓ XΌ-\3IXu%K1yYkS) Yj5뻬qh;ܭ?"<S1!N=dge8&_pU}QP;2,.0~ƫA@Q6J1کgsZcqEyg H _f٤=z)F{'Bu YR ye6t xUMo#E !8*!Uul'lI D¨=Ӷt;'w~g$˅CUaw@._p~oCEAZ@vF"u'YZ /ɫ!:)X>=>8Ԋʨ\)3'}t‚/>yײKIaAL9͜-de۲B7=J[ִX 9SF:ʲYUYqx["Hĉ4:GytP[#D u;&D yjU)}c-n\B:# 5_ޜm9NU6HT&|GLr-NpU6fWe"ek}#%}Su?z#B;츜g jd Dh)tm0XšAfDJ[D3UcA:suY.9KYnGBl':7L,)o4©:/$6%M!a6nr6޷m.m!lMR-[LuHpϔ`+ݒM tɥuVs|.͔]RC)MB :8{VA;*!.}b"VZpw[f{t{po|*;MrtzsC"g87/p+Ɠu6FL.dbȠwLӔ6wnu8|~x8|8ty2 &f`$Vi-.AŽm`+b1nO|XsӪEcCӓ J4lPaċoO36}NLL;V^>l Gisi1w;-cI[3G!J;a6oE3n嫳S'77%G*3.Z6 y~ iXejռ\i6uM۱6bb(& &hMcS/j"2<м$QLcg ?VE$ع??U{ygm>l(aT{y˂B xmSOkAElwA-6%μϦϞ\~7D0{1^&%;W97с6A *hQ XΘR?<{ᐣlW-L[6G8Cu©ࣵH ( $ k!#Y \B90(b0-c G/'j6^M- "N굣4Gx22zԽx% ܅ &1 k`:xXTHE֛ܹ(`H|K*o󧤕|DO)fbC .=Y26Z $VA̠d݆ S۾9]M/n X22j[wXb Ba' ɖ#$)ќkX#=ƐӲjEDH]C]YV&J˵eE<jYN8 )Lӛ,=5cwCA~D-l/w?+lxXoܸ6^#_kkڸk>r%jgHj!Eq X3o޼чp9OnpY49'`uv6MF1l!1ۻ|v[uWܮ%݆fv>[ږ&kɵO9L >G`NQrPض}'h 3MpV(,fm&68Պ3mɋ6"Lb%C% z e: }\!X/-).LEvG<˼Gg?+j@LFכܘUQ/6f i^"r5>xe&Pn9==䯷,+f"ĵMvDf`jAlУEɤ-ZOKb=i 8 PHJ:?_T42PCBEV}'h!vob $%5]Mz[sϬ* /諉dպH3ʌ#9uB޾z5ST] èZ1„ *^a[ H};J[yԽtjAcQC4 ~)7)Ug`RH@> rC,, %`06K@2dP')er%mnwE#C'?`$aTEWktur˯ A8FSWV va1q]0I0d$Bj㐄cPhSMOdcyJT's`+;/B ƺ%#2|:!<3Vd!JguC~t`KZ$bNSĹ**Ⲵ:bBsAӧR5ѶϲDg 1 <]N+qAnf9T6v7*PKte@ƣ=" r6nmz硚%s%$Tjl,VOy)Wp5,rȂl/?5Guk^3rm-#! CG~yz6?$\ +Efc:j?0C[[ed=aN6] ˙h؃)!;<@o. ks#=;wB:'(RFe[2{JSe*-#(ik0sr|aM} "&VO#R.LXq2C "4'Ij 1rqedmP].q yěߣ6tظE$ % ߂X>@nP;rejXOdZ|F?Y/13U)iHe* L p%G=Ox׸DV`g_zc;׫AO+Jr)Yf~qGq&`^EeX#& Y~fbIsX0{"6'J9Z+Ʋbe-+xp?Qozi*MP{n>Llo2xkO}B~ A[1vOm[o{׋Q#`KOP:?j26x ṕ/ex )c6P>:{?xk٨4XX>I8碋pRuN:Jc˫>?^2qbEG.sMT>u:ƙ8\>~,5 )|VX?9Bf5'UZfy{$bSY Y0_NchU9Pԧ/&w𶺿Lȕ_퀙 {uA! H!9Eh,IzLZ \GS.tx۫w@ol6FɳٴQJ\Iũ: XJ2R6bouV.=xuR͊1fDճCwyƃzYNL$&Y4O$/cugYpoT?~3i5E6sk,Ddm(C&ϰlFr6s &ZSJ4 zdY}N;0$&M#$\863PUKiҨPC&PhΑl?b~ѻ-,SB3_N\PT:!QfҮAX^\2OHx/šZ[i)TS<0T\_ՇQPax n; j>RcGyxl:UĵD"MJ97]gVX|W:>HrBL5RW¹f:-{LiH੆ғM BExmbBHjqBd~is~JBhqf^kEfq -ͬ͢옒ZRH/JK2s2K*7 3m^ka36 $9#X!(51+$#U!'38599?@(?+5dFsa\nbf#&dW*J*KMK-*JMSP,V\_>J#$Zť `piRnf 7e 7_<ǼKYC{fGid{9$ f'xM=nA3DZe@"03 jkgk?wvM܀P=6Ѵ{|{գ4CM.Zxl~6A6=0+ԍ F2Drej-αf軖P`JfvOSW`,/k`%n$3[l=&䒪MUCIUW[((%]Bշj_Wwb-,ޕEIoXBL@KX|uöcuriD /VkX] vz=OGDb0W3YQ}H&8rڸ5AnpXS:h 9bzy 9Ga #OePq2eYR/ } N,g>kzL}B 셶=n$ݱK?ܥ#W;l㖨zX&fwl7du\Ss]3R< P]r|ݘx{wI.UhÜV a .vRߑ!2_M oˣtT[Qw}؂> 4=8ah)cuz;/VbA2lxUR=1UPUN$Db;ɚGd{As J8Bogy;W6,"l`U4{ǶMdea{P?^~^%zt,;ޑx)ԮiR)MbW"f;gmiZ%@3찰KU( qCvZ\BJ*ʵX jI`w=SL1Hu$(F<45*8"Q絍ukg~Ԓoۜ9ȖS+Z&5UDAK=e7u3+J ADoNyv-jT"-c9"NUHMFJV!UxsݥBEӪc6y&x,Ih QrFbjwbQrFjMzfIFiCn6D@/%31@/T7)('3O/%u2/|܂b|0!;3,?'[/3R6EļDIJĢ|Ԣ̲*Ty%}`˝3 x\[s7~ǯ@%Rݜ䉖(%x]ÐgH3dojSI?ntt>of.wWYYw#{UT_~1^Cm=/i d+\7Iui4#;+Vcc$<+좡 M˲e`?{7o[kcO:YmeMR۔vEؤHmM-Ywcjc˵me\Q;v 6)6YY鋲I.?l]gU.i'eO썫kW7ckg}m P ++RvIҏL(ndX9_nI)׼t}2w@3(j&:vv[sÿM!m`e[5[Zz?:@;.*~\$<&Ȋ,!AKgNjWcBoА([|**QYۖ 7:Grw$~H1MΙzV{P%˰>Y}M6&lr> 0/i﷤Dyl˪ےZe5_ПJgpdC4ਊ/iBծhu e[LOOgIYY=KGJYRC(FċVmT6Xdm[>O vM|&]]*;V\UAiM/64"RQwKG[~,PIcm$fdwiUp+.8FRDKlgۋx)r+=aZaꔏqIcУO1Fu BDL {U] ;WIKW;TyjDY|T8[9m%'γ ,5x0l},%hdUʟJTKR8#lrdfꜤ=@#lYuSWF<ͩo"I4[59IwN6 iD640v4 /Ғ2o2H!_f%b7$؏ /Vf寓9&8fr1T,yf$Odhv_.\j/#Z#)!.d5Y @t Ɛl Dt1lA'@d-y9sW %DByKN"snPW{g h $L쫞j_MF5FXhxFLjKhHY}x%HfW*'VpVƯF&l 9XOjqӉyGcDރ̰VX',#G_qTO_xjZe6⏟3,̳$z\VJ\#tSUy.!hSiA"+X!?b>% U7-AKN@>5cAcSTv`OCF^Qқwf%&ӧ'ieB.8SjTq%uI*Vp1$"+](l-veOqE&$4Ms.;m8t4u&΂[t o L*3 9t`5X@ Fxӗ0x,%e=,a2Kd7"L5@ Ç 8D\O&Fv|Lj`BY켚w3%JT[bY  ;"l"Yp'^I5Dw>wݜ9V,`GOI;&;ː"=>lOCO!! @u} I:2S':2P?dE :kOfLmX" %AX8b'Kmbǔ(8FR"sp$LbR| ioqdB H3P0ASF񄦨oWMk{ѳ0gpXlke?Dl$E)HRZ{t@Jbl+.8>H!O^+0Z핽=nnN?~٫a>{?OwW?Xz :;dc 'JV56ASϷcRE|;9)IݫZhujҬ%W|=a겭s! zU+9fUo{Κ*&yMuUd;A>aD*|q [Rg`(*Y֚%L7aH1 RFFA /Z#ΒhܫVc_!sQM Z z׉fyFWuZ:?Rao4ۖN=7qz j7hOͽ5ɒ{ {Ry9 EW`P"EW \ 32`AT&yNαA>4.)B$SG)tH9[RQQ"ْBN?y%!@I:Yx;KPb0ia 7noAvQ&甎QӒ'6"ȧ$h])ʯp2 Fz? ˒D]wk~5DQH"G}9΅C*xqdԣd54fw <+ I[qr;SWHmgxHD~-CrAYEBI6DF4\OTcPh6 =PI}8 ?~&2/FL?sjԮ&ڹe.v`If=S}R;j'h\S@AEl2pλS.ǟP;mf2'hi6Il'5b9$,uA|GVժ49$!!dYJXO@^"?,)iLZik C 5 8Ki94= 6jϥ/0pOD&iM :}3hق2j/y[ C h[g(jFu ju0jۅ*= cGKqj($$o. _;L}pD(xW~NS;)=(_?2'}:\GV(X߃5 9vtIzt}pu.Sp*s&9ߏ̑7]K4UOx'U`Rg~H!L]w,I!C+RN?Ȧ䞴m|a하G0e1"Bޚ@*qyUc"62Y2n6yN!89j-*IS?URk2nB霁o`\,x1P2g闽2('[w#v IQNm29,;b+1ةƯJ+caސO.tQF^O;D LQs]ReRwu#E2CK3jrM^ 6DW- _f=%9ԝI "x2&י_"61wP3.;GIم5̽/$Q(-?^qCDm9Wq%}t /8wg$^J;̄4}dM+! uzaV\3nosN|3`.F 4=E/km/&GΕ=/$mƛ9=ayE[^fpcM;dЍBd\ SFۆ4>/ڧ~˔A;c¡ mH>WJHqxw1pn ZqՎ\G e;:vմu:I6W/hq#YUe"+tչs f{^]6L00A ߶ki'*H$[\q7*=,թ;DōYlЧ(J |ҖCySYZQcG)|W iŸG\}tC[qK/i947@ekǒ7ߖ(ݝ4;>%Hm|{Ivd!(ͱ[wB0-/ln zF榻3gx잇1+ХI)I2i+SqYMPՉSʼz{Hw E}x΍I*/lAZ=iIיP+@]Ab|w@kh]B_xFvB[/^ xQЎ_+%Y*<: wF82 |VH4Y"Ot#wWjMdgBʖgv9hVH8ш#5(S-kĭpk:[ו9Qj-!)4=C^N[-1PRE9Q[ eq[!6aYV jD07фi θħRK{vN+Ky r*sȁʷJJb?" WTD{ΗCIu.`FsyGeV [@Aɢ,XDCp늏/$9Y3"*rWكK%q-;`A ͔8s2BڀI10c*5u#_펣^d@ٷ_MLȶL9P^&NThgGsĸ */RV]މYw_]U\09 oں8K4{KTCSUH}ÑսpR曐#c%p3k3$=4uH.EH́G >mY ǻ.hpYK̓ʒ; Bja?|7Xo7B +^H]ܽS'ӶD&<`MG}y@DͶoĔrhdOy^{Wgv4~gà~u }x9;K.uزfX?oN04w{kuF m}-;MEJ 7ar.82F XnXs"~V!gA޺ߤd2Syeؗ(8g\[$' -^0.&^*͖YR5 a9O{iy+D/>q>]dH?~R}'w6O.+ Ł|3`Bxw7,Q_-JIB}pO;D4&5m4LX7 @[ `NU =1j"W|yblZoH%:<7U9FQQo,J`oߎ)Q/.UѦrr!꣑LV8?h+.Qt!@2 m]}12PrYbI:AkeDx/W_x<롟O%*vP6J (am"O;OR@۵9iy&bnkGi Ol Kf6 ̯pI2C7IBz[.* EV\}qJ_Y0U C:v{< ųTr]5>WGKىz:Gu9 襓S>W4lO{EW-.>~{3յ[RXWg@{=U?4YEFɽsgJ %9(^/_0Ґ7{k.{ʷ6ȘA|NPAaIx^8X1Ģ w d6h"pwVܢߙ"㥝MRIY.q{MӷpDž__#-r޲=huH2AubT}@(VkI$6'yra鎽8ֺ92ލ}UixG~ bW]:Cߨ䬄fq CM`XENx\#M e+:Clb~oэJkZC22|\\0!,Ry BY'_Wf)@"$XCJ>pX6n,9Sw` l4Ձ_P-XjE?6b“a&p4.< @\lITypeP1 TWBel1Bqv$>+2h!r绩`cG)Cx\h^)=bD~B\Y#([qbp y6O_?xrfN 2-wVs:D;O ~тjZ4z=?V^=kID <7oO lĨ&Kϓ|rEc~z9y\LǩO_l_Ǹ]ˏS3~.~+#F?Loti@b'4 |/魽gDa[y>{~|xws5? h'tawϮ{:,3y!{~1^tM}?ǣ!W66DO鏳˛+~=p{@hsX?;?Mľۇ͌"׳[ZY7/o&ss8[Li|(_8 siOK>'P#k=dA1ګa;.eFx`%ыK|z?-?2c[>?qx$p!xsB0 Ig8Cw_Hye.} v9yǟ,"bpDWOE$)3 A'ѣ!)ѿq N81PB!k^FhmUpgo,lWeOiOo_N9F fH6C2WAgs=<νwBLɲ`z1bkxIHG~J&WXd҅LyB F86uղhxTkFU@U[Ő*n֪y6IWxGf1ޱ l6ɞ;9vNbJܗJ:5'o(-ssLIV@RfLŶ "H{ 2U" LAP s8PSljTVՖ3"S6] ojuŏ`* w(̀%*+Rc簥PiW% Yrx^yaXS=ІKΐTs?ߣ60; Yq e( Ћ`VV>I R=c5) +Q ϠH+E(;,O+\]/|IXBQ1p08Ro$˱n4f1܂g'^=3Axa)FJeI8"ϘBd3v-`3!MoKtO"o3 lEf~8'ACEC{i$ImV^2c UYJe@3N`<ӎ7̽:+bWHTLRb$n uhׄ+׀;<;;)(֢X3tz- Nÿb"\'a?N?5;xΏ"q9 p:hn,-[Z{Ƅ\7^1bp.JEG]у[ K߽AFQq>!A7Q z%7H9=euE1vW7|ۂk[FS~n#Ԧy{фfWBC$ns_W咤|h{(cǨ2>c7>*;\xuO@mX/ K{=X4M$]A$43x)xW?'_h'I!a<}t;S\>ȯ=<09^I6 W@%KŠuH@ 7Q.܀>GSkmBk[ >T՚/~FH S - Lu{hI~PRHQ_Q/.wK:ufӡ c9_k:/~UYkH`pQtPMris/ۙ'Y"?(k/= /Bkݨ@ҒaKQ jBu'm5(q/HZ <V~U*m 4Zm+U ORtȮW\BHYa@F$H͖C]B x4d]%RhWR_e% 8{,J72R\2FK ''͖dㆈr-nѵԨ2 S!5*zP%{Ԍ F B^x*BY<6<7/v$K4FC:dέkIL`0 EEU&麼" 0 0~Ew' !UI4V"L젛w!Aώ'Bf+W#xWώAuAwm1ܵ'bMDaImG )K;aTEtfA>icIa~~j.WEc @ܸ]\|_-z|sj\.?_^qrys~w=}}1W@^Ѧ!$PC\ @K93vt7}WxvdIr&†VĢK֊Mu->z#FZ *ԍW=H~Wk/+ECā}d.:gB(q 昦3+ˏ޽={A/T<{}M"Pͳ/?p=ժ TXC!3XXX\쨆dAtF&b5`F4^]ShKpoePMM}ck2F廟iل+Ŧ5lQp%##@{RT ; ɎH'(mo [(.(9G Cl,P~ay?zN>%-+kcNk {0Xw 6 eǮ.!bC]6-ãf>6?mkqpeL, &3"";lF 󇻓U||CuEʊBq|THKWr =-*k5q'1"mz^|?M@  xPWH@8#4'E!-?''\$#U!%(5$3?X!3O!943$R/7E "/'Ax]Qn0!OH= vn]Plp@P}8NveWA⽸rNPXosv&YeWP aZTzp96@,&g޼y䧞&Qۆaԟ-U)S4 ;yz0:~sӏCǹ/X3 RO='mC[vcraI-6rC:qKt*OL:-Grt6֔.xqWm9.$%M!?%w] I>-BgE$bN{/)#ꉔŬe"lKLRQ]a+> tW&W$:+dF?b@JL$M %n ׎j1X0F Z r,]fl:5ƙC9=bLvݝ8R˝@^z'+M5p68S0e8n,7 L: (do2m(P'Ր +:wEy"oE!U@yQ2p@vCh9P:q  Q ' BƐdJCnPraoQRGS#*| 3Oa1 & H þއhZ7;hu|WTߘ-وz'ߘ(zܡjcORˠ3>ȄoNNi2fQ O**LL.q6` g DoU(9U Se9cVoH\̏ 33p6Rn!6D7cP:f"r,5j= ujnp»k~Eδ'&D*we q(c<"bgv{M0SWG~޾r5~qQ. @ĝV^^9cطة#gzڗz]ݰMsX@R}KWY6-FjLȟ>*j7|h9酂XG8dVBnۇ"ه.||<տ`4>xkj_ť̥[TXTXZ_S^Z\YPT>F=g&\" +(5OA7-(WA(M$kR,ڲxWas8~4f;!f3Wb8e8#lt1$4l푙ݧվ+9#xJ~@/& Ih%L3& NJA| =%O! 1$4dB&lJ LCl~2GK& g$Mi"jG5wC@ ӄDK' 0ЀƂhDB aԾm_?W$j|,@3(gD<( Ti-so;^7lwp}rS fhlcT \%zgN\f V6lo4ۃu- 9T $,t\#B{lcXo^"&'sYIxx`ĩœ(WE+6SS:c1atd߸DROAc7i%Rkvݶsÿs3FEIGL_7F+ jJWvf/1'8'f}ks V2cASR!*D s|'IZ@&PȃiEk?*wڹ&.eXfJDi_)Gڍ\(ӪQ[5 ,$cQ>bQe7R˒H=+iM\@.T)i,1h%h$H 6酻g&3M`` Ӕ Ag˲)e9uΔ+b)yh˙*?Q3$ y'mE^5]d5p ۷@FcMq 0u,P-RZ*TJн QvH'!KL>IsA,gᜫ]Č.HBAƣrel~l)&lO]qk]D̈7 dQSH4 `r uβm B;;a.%bY)foz}??O/|Ha^Um2Rz(A}a$:Y+8hpokA9:Q62V˪]R]>Ns?sˋ*Ũ_؜z fgvC3<Bp8.zkw8xeI4݌uEy A#R 4}5"NOo #Jο_HCjfQoGUeVU*~żN鰪**uЪռU:Ys`}#3緍 ;5i/vutRqr h'ʎ Z:ޅrXf=WFV^#:Yɛ7erDzepb7[|eQk^ lTwp&ٚr\$4>d{>njWq"8|nf4=K;,@c=ZgE|j;n w 0+(FŠ~djگafIfv;֕Q볜f)7:*6Z#SaRTrAun7^a'4Ys'syXusCݣ$W߸q^ Kb8T0Q@ է's-PjhSjnjyl͆ۅF x340031QMNMIKe{s{ )\lyib )y 7H:7ݻ}MLCsSSԔ̒҂Ē"w'>>ȔupD88x33\,gB㒩5nG5ٳېrBD1!zi;Bx8qBDFx/~IRT%! L 'x8qB~{H~)vo '_xRj@|bAA"[4N cd`(ieɎ+iٍٙ(DB)m\mIP?4^xe$/V+Bg+0@X*Im;<S&z~`ΔHk8ς9ks C$4,VeJ4I8h7Wc ~VG]0cUϸ$Be|]x99acF4A&aPPv2>|m#d V"lv!G Wnxfo/e/>/ 9tP %Cc_`[=SdN &򇖮9N? (Ox=gG̢\eEřyz\`"xsg?def1ԒɊ@fqj1B N*x;óo+O^~IfZe|bNN~dEfqN@Z NV`r3Ss2J`&&fNvd lVbb&ïx340031Qu bנ g`/7[֯kq>I~C WW`Wdbx]uݮ~ 뺋xXQs~ǯz%TqǍxD>`ixLvKHU廝6%OA_mJx\66mnDۭUߑKڤD.E)VI'`e7[t5^n|#T{4n 6.~4<:?\"W㪉 b,s FC>9 mgHۤD t׷ZR?`ȧirdUio(o7P4x2m@ۙhw6l lt52zٙlq.?,sL0@-"cj /^7$50RT>?d-<(-x1.mr`/_I:+ ӇS̘m r`d+J>./+zLơSGF8FG! 6=")jI*f=9n x29=\"Ш: pʋ@;my*.F(I;],ਝgV>B?:Oo‡rMxakA[/-<~! ڸscSbr9rz%Õ+uH1zS_pbC\*1f!qݡJ$lIGPOѮ)c{\5+TRC_EH2IKI\09јI2 % }0MN;S"}`s)YD &6ѻ8WI犰-xJ+Tmp mۻͺ%kE)g6lGYPe1t {ex.œT376ܯQ恂}+R> b6C2$\B::wrĢqwoD=]Ў;q֔j,-nwH9HΥ"#D nueo槫 ~f-Hat/*$-/\3hƚZCߔr+a7մ3PUAW#?bٔp;=-S{7ęjx%̪|0V9 b(1\\]ju8?LxuS@(G:NBG(D$z/?fwm˕^Giv H4d߯vط=C C4>FoBɄC/dMDљe$b9IBɱ;}bBx̼$% XFK>V"pD0$qG(pFS ;;$Q蔹ld+ɅPA, g[ƿ@U}d-^l67a{ݪBy{mvh.Ӆ7كr'Sl]od 5>kRcS"YchA#Uº*8,֖cV5iGť 5\SQ3e:}|TYkh-O͞.we¸&WsC!O O0AߛejB/1+PPEJ1(-Q^~\s4 Iyђ_Wh 0-f'yG͸Y\>MESoQf;gyy@ ̱MO__!tBxU]o7|~BFI1ຮl u [)ڼ<ymȊ>IGrwvvvh:U9]r1]X#ٹ5i٬Q U1lb2Y 'ךT1-Mי[eMҲJ7$H&6WTN&;x~IUUnc}Us4I,|` a*2L6hG(Ol)h9uژI (XbX=9{s)X~>!AkD4ֲ"k|*t @'цPB1VKqcsjVO /l%nWX,q,K2"@/4RpR_4L|ŠTv|FJ/p)',؞^Q,ت*^jZTWD_\+RܶDztB'ڳS:ܥEr-W%-S qKPH4x GC@AզaG z_o ӡZ IG-A!fiX>\g!ԝO<ey0NycĆx,zÔnw0`t2cuNhѭI[OW&Ov8 EQ #zfQ ǃQ~V9:V[<&_&O>BI_Ԋ/_]#C:wDJ &3Cͺ578#x{|:QCQa{-m"on-8I&DV 9l8ާ8jsOC9#6"u&YÕvO.N[oNk=kG'}dN_iW%m*+7x]R;oAڱ!GDB3<$+1D G&܍V=vJG@+!QSSQh H VZi;}7~,R@ Z(ip)A"dBuZ!|j98V_<՚YV|uwvkߨ,_n o]Iغ^:G8WFGhm4@v/< tv΃ X pY"`}ji$\Z z$Tp,*lï-lWWv]Iq~Ra6oXvy\wa8|>6^_k;CA#W|&&gɳhZ Qf)pJ;2j h FHPsmؠُHG΃-LsЃc+0]8OD,`ww7h6g* RTA3V!ʼ.L1w`xUmO#7sK&pr"5 @ JrY ^BZ;^o iQEa_֧̌T<-bjs=/.csBi-+.Fr;|#L98*Z`3"cǤ+]! Y)x_01Ʌf@ArFgn v`KLi 댘A8`*mksY*U\- X|i_} DB$ ˩.Ge%c߳9:]Vzޯqj:9z77gS2< !%LJY)?Ig~FCO %1/ a-}h~98܀6d|r9j=FEoj^RyKhDJ`ۣܹ^,*[2ޥC|L65p&gW~탨r# GgW&QU܏#\FaI7!F&5Y"\ȚaV|Gn="YV&Av򺮱wed<2*0O74ym/XnCu+źYl r"~DCܑf.zť[XLR ܉Ԑv?t ! m.iĐ!s_~^x31i:*4+BphpkLHN‚G\Ѽ[#;\ZiGDڸCvqI7/~OH7Hn lhx&UdC869#Tx*$ӪJ_?=$4I/9?W85Hd&Az ! %9:\ 99 @z. WQjA~QBb^BRi:P' ]xk$^)(WIGA)1(9,(ѩ90H *PgfglP $e'#XP bZA$ ,64PRHK0+6;ٳ.7Hx340031Q(NMN-O,JΈOLI3fI^L漖Iw߾Xj<%ԊjLGٶ=hb]#Ē̲T4擨8?,hS.JJSA8"]xG'_g”-TUϊ8w_Z^rn#Ԋ4z^->'u.. Ғ]2RQ;7.$ԕ]M76]e)R=ʜDPĶ?(Kq=È^fh*sSAAgŰJuFE(荒o6x&)-JIM,)J#yUZAd_?5\f)eXԊ4Vl*wxw͌nk ?1p1z(gK OL"{LW^+SiOcԢTҫ eO~x+~ʺ>wД&Us["R'L`IDU &3l p[sn3=h LkDko8 ޽GĒ㗞:명&quf 5j100644 seccomp_load.3.o ?i}ˮZvla#Nwalloc.3PȗDsڨx~m!"o^%sF&BCg-ԳQAV!\IEOh]޳&?oxϳgjP+^_9NXnF]!6g ,x! -ciuH ѐF@?fA/xϳg.H1˨+vPt*w#?F[-x! U~~igԭyܕ4ҳ /x: #xWajLzjy)Z7soH ,U/oo*aHx! m\P\4"C b 9/xϳg.o?_Y6Qj\;Oŷk#?F-xϳgȾ\4^YiI_joΑڍBl xX]OF}f~UP0 T,UhCU=];U{@ T[)f`b+dk"Qxi W1aEʀ/k$uR.SA*/#qH%l9 iIR5#͊f*K(UFs)z$R-C< i'VLU\A0BژB]bj aIAID76e"V)fJ?.@gV[6 UeeKlVaM~ cC7αH+ o2]'d4&uxk(+AH d#2C%}+܏?:p6Ȭ̴q P2r`o'X--$\& @ܚWAY/$p}:p$9=đ*T>Prh(pz4~z#ȵ)~`R*Lf xni7rHq</dAyС ]W&S\vO!Mb'froͭ,H6;;s^!v<;Ӹv΋Q V8F}@x][MרTB&P\7F >_ѹILC;5qSB,Q&>;5sml5U&:2xUƋJ<"j-aө.Fy ̏.YaC%5h+Vt 09Y匿N>xܴ%uw ]P)'xp @!TCÑ3 Q. F'?RXH]b‚c f̕ |GVJtRY$hfS- PЬ4kf\v 0܎O Ujc G6JƧS)WLK&# 7{}-EU uP Ä ; 4z/!1S+XKJv1S){‡&;e,@G ΁5o"0Ju@E4I+MFcҜvοY3Tb[4C=}!t|{7ݦHD>xQף٫t>T3]p퉴41$a7:Q>5/0M+e:υ/ eL2vM""JHIklzo(j}q(Wޓ()P]WdS퇇GDCDKCKn@NKj)锤ْ+@p_(LUhrz11+(/Ped^߸ͽ()uCOOX '͊:3&'OHf*p`ݓC뵡~@u8`-3׸\pUiEQij==`^7uxqsp)N Cbx 1"圱uRs hJkU6;ۈ1&bm>+Al{K IPZj/ҭ>řtt??r1@3</ŸR|qĊb3 nUEGj `I,Ėa 1EQDǧ^9@#`Kz}̡g~Ng߰pfu*W+-԰u]<~/\GZ `i#Zh-3f t򢰮R.,RPW]2褸/,b?qx<ġ__kA >X_7Zo՝l)Hj˥F=B(D> _[ם .$j(U)}\A5iȡ{%m\!PfL1]=ohDËm"><<-dPqONx.M% xVюF#Ru``nڮV

^sO+ !z{Rwq`Z 2_u|d0X%'U2ƸQYʪ{Zo뮫~UUzu5lQAI/&)WgvW[du6-YR3$W}B6;iVjX|\\}z{~qݳÃ&n HEV_U|$D$ʶSc@E&q/@]ћ.~P=C}sWAoUpxBBK}\'"(qZ&z|A}`"LiJldP"5r0R?ܴ ܑfu @3<3@*#W{Wp61 >kV #6֞ѵᙣ /)u99H] ]=cuhE$;5%\(=k; ܋gkxd48e0#jVi_*iꋈ$ H/cЀ 3b1W (l"NȐhCL3lQyNf!ױ'`"gSڈ| ʰ3HJߐiX2Qɪ&Mz4!ЈB,+vLf[t6ctlop:nF9qyVȖɜd&?q6XʜX芐87I S IINCdIrfҥ Zk7[d"5NO $HF^1-[O"r+`p?ғ`<C̉w؀itDUZ9E01p2ݏЙgj D`*Ek+1 E"zZ p.N7L55O^> (YˡA$lj9}2KOܹU@خx&~N]Yka'{$w?kz/l3EYuzu_z\@r]"$e1}3);&hH[nceJCw%`JDM$,qtƷx^M8a6 BG$LP~p54L6u6 kWᩳUYHN2ߤjUT3j8;N-pj~ Gdq>u.WuK-i2=13'Yļ:(+ L&_<0b% cV'#`AVcp&J4ba1A!lb8n)_+4̩f}x:9N4z qv-;hF3k3uɨU2+)r{<RاA3liGlȌ@{ovgT&Y0mG!}M&l?¥$oiJwrk+G5& +}g[`}+kـ+SI-{7X*1 4GAOTʷ%+UxXKT:@)q+mV`{Aʴ_T rxf$̺[ + Μ. 9[X.ɻCM-X V嵭g&3eqj&B;9{J&m1LJ|poR~#yջ|ɝ:`φMv?dmWsnm"Vh?d&_36T>>2xw'{oYS-ȋ$;p&qVNԛz[O5`vĈ$8˼IгL ӚpeH?uńݠ7u̓m']."p)#H+8rw zXC09&+[+!?`lCsm6,M#\¨/铀Mk|Gs=`|D_e SQ`1f9#vn}G <5-Q`Rk 5?C~],1CɅЫW.KtXy'F 8"mau+gMOjENw8,GA] Sa Ma)rC\%n,gֱs*V3Y96oU9DgGY@uɬ➂i1X>%#%Z_;J(c WZVbH!sw},.uĪՃntˠ_aNuA^و߇Q0wꡕ),ޠ wH4Y2ӢELv+_O`@ָʉ 6d&y̭x\Ƚ7(ԗEbqon:G,2@o<+BL"JsH;>~!1%FG:XvGۥlo4[k9E#.bbtcVx j #XN] i"ō"U, e~|d"f XYwr"Vx̯QnP b&wũ $2}bL;ã!KۅSf|i*'lB!>_\rwoxwyWu͟o>s]̥nפj81TWm.oɄcGcq ݕ2 \Vp =:ҸtisݚhgO7ݾ6t ) 7`._V㻈׾m0&S@1-2}{d^!8>bՂޔ^ ^nWh=_<[k Wo;U(Q7נơ0ߤ=[Nx ]o~g,_~P$m~BapsTΣ9^=Br/}f8G'F=<=< ;Vm"X)E&3']G.QhF7;0#SMB5I9G|Mix$zLVisq3d=D5kW]A!3k3ip=e$_SkGV'C;tS +w4do.josb0CjR_,іlƢqN -nmLJfhxxkvㆥ̌W3gb*HEt ̩e/rJ3mn⚼EXs<1{VN@,9%9EJ: ~Ap>*JٯzVs a? '@NypGɼyU þ%QjɒFƣ x:F+~H`~IMMZag߅iK!KT!c 2=5*_ pqry@+Aw'"`c)Kr] 8T,ϫ% ,A[J܁ZҀhd8SRW~U J z e?Hٿ-ClX+BG{E|fD*&a*\a1rW/"rn9X0PU5k+_,wSX D'UϋJϒ9$g?N%$mze~M|GڬT)@+(|`CH0 4n ?Ingv,}_rBܞR_D*VqDRN勣Beo{Sg|Z- )I\4gj~!cwtgdLE梓=30/LTy2;Όr%.^)\9sT)2W^MIrʊsX5pDj;+NoulƫuDݲ ?YWc#甥&ACM";_';^EzIad ?ڎw< vшtOaq_6ʹ$®~ =*d9gW7'Y)K`4 {8GE]9)C)[kxXT\dqj/YS]Kjj/F7 hfzxG{^o%+@X qo.>ʺliM+TȏoTZL'jIAyS[q0*UQ`BʤFk<, CÂU,-рER'&̀;商\$Hu U&'$3xGk'>օ۴J.Jк|A*f E6'BR<1duq|@? x(2DבHQБ|x R^9>|sV!ջa.c 4mZ6 n5[jNqf|İ8fP'>*Ɠ'kM/.F~^Eq 4DcԆYqFۀ!/+4[9s7CSwٯD32)oruZ&1tɮɊ3&7H0B(AX51u1B7IL#j$E OkJb|o4],$_1Hט8HjG<~ocKSˌ"eGk| q?&jG/faR}` n*T bjfYBcBHԂ0x̪(XuTЋ6*FmaQp,{]6ҙH Nن)!lVPZA> "] 6؝FbiHuux#)-9QiGv0:8b@Bc,N8$,N(i|朂QbeȔMHSx5 4Щˍt n Ɯ,K>tL{`% q2!=ldMpBTao]J +2>|Y;OM>UjdTr]dykfjV,u1Xcn^Nk~d]c^Ά9!Kof&͡FC<K DuxMC&̳W'gkwnE 靽I~?~ qdn_yfN_Dx1 |9@B77?(ucW_i ;&x5\ KX8MuM&7xm>Ɯ_P9]p3BN1&c*a FDx:B KX Mu7d?y>f v΂ԒԲԼɊbƖ3sx9S+sr'od4TVP*ɤNT04C-(/Ijg4|J4KjbJf 6wiv3e oюef.N-Ydi9^oNzibQJjJ|qI~QbzB||_P|A<d@%JB'|eN,XaƎ=7 3/}r7}WKAK!4/$3?o,ZEŕP:(drxIbRNjtqA~I5W-Hkx9Ϛ5-rc4 opy_file_rang36 S 59-[4\Hx;?q< Mu&|Y_$$XIG!>>/(>=DȐK-l',llfS#;2>1''!BgRH&(u)dEY~c3ch~dGW&M"dfEc#GAyQ&jǚũ >9ܔ-60ꤗ&%Tlli&9*xqIFe&R2'2%L/ 7m4s 2'x١>:<\ Z iy%y{}',(/,NYx5l 3-7c~T69Sts)V9 6|L[Xs5ɫ@<y,9%9EJ: ~ApJ f<E%pbBgH4E?Y{iRAbzj|AQ~ BInFybAr~^Ij:fFFԤ p+'_ټn#/xDjx;6 {TS 3JtⓊ`B :\ JIE?ZIof'_S WZZo4ȯSdd(-`ځc#d)c\q(l-hixeYlUv 2{teTdTĢ8-ӡ tf*hK Ld1, !-HB'MQ@1,}P4ʃo~sϹϹ~ywzd߷/|ef%Ϣ3i!kЂ$Wˈ] Ge8ejaV^)Bp*ZMdSXP ,h"X %̴qi볏(\Ks8JS/! ñ3< CN!~ >~3f}"n."O1_1~C>bJז+V?,'.E"-S /"ۥ_f8p)g #p֊2r< Xv{̖yQJ\y=y^~@!lBH="D6j9M/JgG0H֫!㋺.!p9@9ĻƬ?._AlD}>e*{PJafʧUPk g=] EՈ038W\\JAŮ|MN*H8 gWiI-zbG-*kWSﮃ:Tn]-c}axn.4X1U;ED1I%b '.Cb1̉qݜ<2ĩ;DEbJ RTcJ#ERsȤznxfs#Cz`%x6ˡ194RAQ@Hh2Tȸڛp)Pz4;eHm+)4{&dGK1dclϬjˣU)!ǸnF'?hi)<IՂDc+$(VDt5g%*D^SaU=O\ olCg/G0{Dj$٣Flq55bFB ءCa"ѠgyZ oqj\s?eO1tؓ!Vp{lz =:a&ґh8'eE*秌  |r0_4^b@ 68dA#lg}laM-KaÀHOn0]|f'aF' iTHrO1|a>VQ+}+6|Lq 1 nGPkgM۟m;OBcM A9\&n:qfz3V:IӅ:TY]F|wA*w'rEҡ pl82`WEG#MOg'u!U r=C|5F M7K=iyЃI|Ã7:/xqǽ"އ>Ąr0ك~`ďci?{?S 񙣽' (& :x4qt SY&ymͬ!ŕXTZ0+ 3ss3RS~AƖR :\ J2E%8t6I-JK,)IKlh5F;qx8inEkJ8LX b6VcBYt  U$M m8JҭQh<;V "tKr.H˹[/[}pO2w䄿ȓV\~ ʜ/8 k\yV[ []^b4ծ)3xWÜW&H%]jVO̹@lAOv'D o෩ x_} T_͊ji Wx9 kz k@r ʔ+n$\"ce'T W ;Wj˒ 76 f?=!nd0Rx@ J]̏N!2DqR.Xdr rd];`;XDÃ\"=B f)!Ĝ$'GڧDޢBj\}Vo3u ~lpr JOrNpXDtsuHz,QsB[ĭԐLRE($4[6-c陉&EqU-ojO"<ușӁC:L/uv4">7f#%z23/R@_p=W,rrva ;aމ#rs52{SF.7s#]ns _u۳Șv/bdضF_;1x;C̟0|_N _m%|?IIs-h-`KzVd[+M1G%>o@X>FvPЎz4i|e!ޚ|"h?ܺf  cA |<w@V?=G[K'bڙXiv; ,t. Ej&|k3R޼5p)Z3;\*qgB0 Cx[>t Ә7fbMJ,*ʜ|QOhə񹹙E)J: ~AƖR :\ J2E%8t6H-JK,)IPHPs_8}x{6t |9@B77?(ucK7 z%x;Ø 5-rc4 */ Fopy1= 324 223X,i PIx;Ă̼l{o.-Ҽގ3KL-5#%\\tt xt2e.CSݢds-}g6~g/)VQ OO-7aQ(RRJ~|*<ũJ:" gs+NzibQJjJ|qI~Qbz*܀bcKx4ɉҫd@%JBdVpp&T-26ܼ@~Hx[81eC;3>r2aNM.+QQ O* mg=˛XTZ763 Yoli_T\!PY*S^YCXE[Qi^Ifnj|f^q !P&glNQe/)FZo*TYfե̮Ei9%i)`AJ&yHRFRF_idexfxr,eC'3nQ.S"i9EyJ: 斛_9E^SdCx;-mC'3nQ>f Nb%lx /,5$ola1%fc _9fV''%Mju8 @iE`aS܂m\)eF`d1WE@;!"K`,N-'^X_\_ wxA<2d@%JBkde6L,[bY{nbAAf^pBZi^rIf~6C3% +t}Qb'N2j%I9%\\k}x[_6~ ]%I؞ݶh.Hi$h^axly[r,{6"(J6)ՏEQEڧ_ES$M*3V[q}|o[y*gXԕG"\KqJzM[+;I 3= }u2TgNyzqyWZTK?NJU%'54i(uߕEdOU'j9덨d'B^v*GR5" L~|^Z돲]Ra__l6Z?afof%=tτD٠BXLᮬ*b2'8//;/nn~0mAUmUdPKd?|oBuF/߽~͍x&ݼ{g7/.x{1r; }RVzoT2Q$G K*&"_7J54!^2 S}ӧwwwfTiee.ljȀ,Fs,@ |KUۦu7^|- *X^FfT50BXtTU\ }%C|+x"*OD\OO,;-+nLT1>4rAA*,o pM#dZ~4$. !L*j#$;Z1F8~} >5i3Q7~Y#42t:O&3!mnd}'\li8tZv0X" ;ôæyEVvn@5iTmSʌDI+S6> .>I+)[$n}fVHA@$[5[QH2a 2k 8I^2`mcuĀȌLVAhÙDR촚ЏB{*C}.)'8<=GxbqO-630ĩL>*?f |#ZJoLJNC̹t=m v3RNvŎ`8 /Z2HuQ O;i2҇L6 [v!eٞm+iKʧ j!=AĄ_<ȶ?&}of&O-փf6&VƣtVG9ukE@p[⳴m|pƒkdG'A4νvu!lb##` 1IEX(8FVp֨kYÎ.SxNfPTL&Mg8cOQȱ;< bRGZٓ Z0/& manì3 Ca2.YO1Ҭ(ŊL;y0kO\\ >2+UW]vkCf]fq1ͮUo몲tOUa&C3IϪwvxX-Qc͖¥ψ=MRŏ%A;5.Npb33 IcgT SPN<R6x=k,jIH+,-^mx{lSpS.['}nӺ-1u5T*j3\o ?dp3[ՌjJ>Ĝ e̪1Q$LA_qMS8g:J+n6R]tFa-SӷSf'Mjw )OQ<(ĭCgn -D'tՖHM:;dfC\ʷ!86bL0E]Wub\2 ?ak"a/21%ʵMًYiɺT #!5ϊLQXqF a"@`@3WBjN.5sи ͯDS ^ MFf"BȉdDdM";id|6Tblc-vܦbHlUroA] {At'`ؑ-"Ga\4cvDy0.cH{/PX&OCyޮ8_6Yܟh*=`@vٜN%oS/KѬ߿zeq>:~qs>]wRFjUH^ ^HxݓQ!J4u.눢 hNm}_7|DwFL#I#V!Sc'#WsBFyRVC'/G敞>S̈́ڇ)l .x{|k~',)(҃ů*m%N_Lvpa D/Y7?.q=-j嗏hCP4ۇYG[XXKC Z;Wٵgj򻡾 &s[| g\z03W}.rqs8s>6Y.ͼ% 7Cq(<[#rZHչ!'v*]% 2Ft!^5ɼ? =y?>ako*al(\(5A4%xy|iŝ{nČ+⿺"x5eB%_biC/J~ $x2+uC3nQ>B]ͽ̫E *2sRSt-79E|͌7oT; qSxz*}C3nQ|pNb%nx /,5$ola1_oS+sr& :\ J T)pnAQ~Ijr XlmlĔ2#0+ނL2R79S <ɯ餗&%^lli&9YPVl')2 ⒌LT` ee6ϔ]XRx/7{nbAAf^dCo8{BZi^rIf~k+%D L+aCQbd3#'FE8 Kbj+RxmW[lgq|I^{/N3K'"5u4gg׃gg3"D<@AR PEyB тBHFx>n2$=)EsVY G $nt}$mKgJ$\3g"llRSDC~] N4銜89$"ܒ.sDN/V#'KU7$^T^NI76#8GT^1tabDC;KȵR >lL4wGVcatkvF >O~=ũ:wv^٩JQ$fXmdi(;g7KFj3-U'nO\(И?k%1+rs4nt'DdnsGm#uQӶ|ۡ,kIS\.ਘs ,Y)P:\RJU()CnzX(CYNc/iL}8+<4,^tx HE,[Vv^/"N?9` .=AȄϟ$Ό/s`0i!ao>M vڻVNDZ ƙVoWt欶A%ɉE`ҹԞv 5 '𻉅-}$«?nxzΑ> (mfaK7)4ox J^gY@:EGb2 3u$1W}KSڡځt[XV̮q u g>?gN4ѢIbAbFA@uXQG=O0$ 0J+V *L'e\@1(Qʩkå-Yșfn!#Ǝ؉JSBL%~[2K':&hqK8Ex% `ݯ{3 6M(vܢ);)rVhZl)|nqoUWNJpB7嚑0kČcۢ[upoW+}*Z!Bto\mb$f4\UN^n2 $I(ƘVBG]Y. •2Օ(=MZt‚ǟWx;vnXc0[?3{Ǭ^[[/|?][[r]hgpmG];4J|kNNb`,ݍMVkoͱ3#NZ];BOZ;SgGvjbʵȜޙ/Oӯ4 xFy6fCl/-Te a,uMCw ݫ6`]M) 'yd4hW+O2z [L|* [JHuB |KxY#``VSm=Fzj /hW.[@~ YMM*z'e"1T@^t8vjEt`9h%Iz:T~c`Ab!D}te<$iJ!DN Aꃳ+ba- YE%&m@4SYb%cJ^>檙a@A]Y$mDL?,  {x*Xç"l䝖zc9}f,an߽fHOsNI #ly ϷX ÃZ~2SI\ǥB*j#i~(\ηK6 w&e%v23Q70GY#42E5=xS6c "Ĵ狱^!G `d,S9ôh}^vhB X*g*n̓qxY#6j\& HpSVÙe-Q"Ӊq$x8" АKK$vxXa /rt2cD'PA8x:ʍ% plE=;mLWLNeP*{(,ecOHupbjJRu9opza1qNsJ ֗9NsxK6lQ۬~Q2u~)ᴃa7)e Gܳˮbr7NBQZ5ie˻HtFk˃2忲Fs8Gie;NĭY ˴{< aX֜*s2D~,yȅY!e^.q%B%! T^ӊqX(D ;b.T:͑%$-S5M94+^LAW#nPQipBᙁ U\BR/h-|]a&E!x/JwlDN]nvU?+w`Ra Gu=;]^.BLmeS($Cb%ugGKBtkdDYҒ0 2/dMߎm-=ExJ[Nxo ">%[3'SRv)`A|һ'W6=F(dѓC'vJOhĖ!X^{J8Ҝ; 4PedD^&#THF!A "1~ Rc(h( %ɽ "lIk`I@,ss8짯[UX\h1޳E[],ݲ$)긙e99GuWt.dtb56] ,ReЪ4mR x* ->+ESKИ Muc>ecvR1Ʋ\ ٤Sb;3;1k20lLYrݥ,8=6r_=HwUtV*hFi,뱎M&hs5vN?' Ę8!\LX }'"Dt:걀c+ G]hɽC)931ěb?G1'}`wBu%OQH_كu=!8hȄ6HԌDOJ2ʞS\<݆ç=]#aĨ&-9#dCx*v_,6 ͣ~DP67f- ၬ>ڝH㾟!e]a[ ?DTa#@D> F sjn)`Ft0̇Nf<?+C|ixᓶ+Uu"cTP~Ã#eƍ yW7|SAG-=Oέ@}ySa1ܥ=,Z-\,O_ *$iY to. ]Zfڿ-% `Y>2LOO=߁j1jXg#N4|y:Sk.“C/>#agtq,q70xNwM~@;3{|rpBOm^WQi@OG:Tթ0p6i.@AaS'quy0ؗƪQt^R y8<+O*Zl L ;A4-$yyNm|: _kxߕ!RAKkD-]̗9 ҔtM72&&E,6X#SYZZ -m&XTX q6>n]P\4-.W RVP桨'V^T_P_GQXWZ!6H^|JjRiz|qj b %\'~kExە%iC5tjbvA~f^B||_P|RLhs!H|IN1\8/Sdd(-ju8c#d)cͼkU&]xے4=yC<3nQ>d+ͭ̿$t- JJ2sS3Kt1&ϒ5/%31Yt*exܛ!XAKk\LfYt 7>16;;zD'ҦE0Ɠe~&%e)(n.eg667/6:__T_lli*PY*S^YCXnsu&qcsԼ|,7Wlr')c66l 7\ʟZXS-;\DrxM>DjQo5aZhTaBOp*kz`;@o΁9ހ5=ʚ/:r7O'is$mX@ ёw$ 4Fa/^ OM^"i#FId99e,R$SYZZ -mwc,*I,˂8'l3.(O. / )pqV+(DJPT7p/M*HLO/(/A# (O,H+I@R\K/>%54=8Cee1x EnMmPxeXKG^۱]]1 XV yݳq?^d'H!H N1FK!F "Hpa.A $U\vG;}ܞ۶ٹ1t=>KQW_ssk 4>|=D/-%]C:m`Q IL1;Ll^/;toՀ?S Rc>qO5sؒb:O ۬8u\aiR6s dh êV>3)IFU"^:0H#^C ,^=p'z} sƝ]Kp ÇN 1 8l}Vǂہ7`Vs@n*4);+ll:a,~z7熚 8N'rmn@*) *7%dV4bxk|yuyqM ;4=/ crtKcB:atWi%ඛDf"'`S35ӹ<:t4Nu2X$V o69Ī)IdFS`W$~G0&da It=c7Ϋ_?;P%McN/qGZ,q)!dEj^:ɳב#$ØZ 1m,ؒB"1௓%,N۝*b `KXv̓ ZIGa U~wX 橴Z# 7Sv$:% OMh5nǬB MAدLHC.E8# ޞVgQ9+Jo<.I%gõY7;1 ܙb@1~p慌qIWY!".dJ.NA I翨J:JX1\DbQGpB MN'u"*n頌r[#s$tDkES+Qӕw ) c͙!*>3eG sofK RiIM '+pH 6`91MkBKuQg$l*JC>y[B#/`"\;r|s!QoIzEn+P mVl 6-YjR@6JW|bDLqj(u j=# 4'm[Ya)VWZ1FW5.4bIUaӼRaT tØ[߅'RRS1 Kű%E7a>bkɼUa]mE7œn÷[ jpqN!22>Zl]k<$b-HOkhI (adT-}iE` ”֊Xd0*niMUsTI/ bXPH:Dy1'k<]Mb1~yc$ bH 2Fˎ1l) _Y& ?_*"-ࠞBW"]wNG-6ҡ8T;EտK-S4d>T69˖Ȩ4gIii&*]! - )8qέRw\"E<Љ^2L#٧fDY W=r_K .QZ )pqV+(9FRFC'^x[ڗ!DH(TAKkB]%u- JJ2sS3Kt1&l6T*,IΈOKLCh@ݼU7Y+5 exK[!xsoRbQQfjI9 3ss3RS~AƖR :\ J2E%8t6ȾO-JK,)IKl4sx[2}B_biC/Jئh G E#x[~/}C&3nQ>zr{2TƧe%楧*(m`e7sL7Jx0kC&3nQ<@Nb% /,5$ollYRА1;2>1''?,hPYTO+JM 嗤&,';Jfp&K+(/ZtGAJx$[~G&V#==ߘZ)8N>Ŭ-YZZT_Y•3Ee: "3EW+(I-KQHMKќ|L,WYSPZUQ$7%_!/D!4$5V$#X (17hdU6lgɴ,?o|cG|@d ަWy'秤/K-JL22RеS())(///K+/J/O+)O,JO,-OKM,J^?"dX<0Q@ $\]RWi1!unx; |@xC Y[\I߿;y Nd:x```$i&y,j xƺuCKk̦W H$JRKfxW'I=~8ymIrNx8[Ŵ td-.a ,e%JUsH%7RE$FxƺuC.H<9%^W:2tzє| xp100644 Makefile.amz2vFǾ2 9100755 credits_updatercau/a Kw40000 manoI[%H-}x+(# lM2j'[^|@ 8%x+(#s?/dy\"1{ %x+(#b("PϡUolų)n $x+(#9SuƎLWV) wS Lx[+4Sx?t=dԔ̒҂Ē"; Wϐ`..N===TҜb mQϰ"*G[SaǛ␘N++Me[2\T7aQ^4Y&z4,*nÒt=X!wk'T$|;TM0x$[~ffv?W+ɧ%3RR22KRr&L6cQgsbYd&ײJ8`%Ey9 y) eSJ2Rs*J37J1jĕ +(D旤*dd+$%2yۂ;6qetp  4*TeE@FFjrv1v %%VzyzEi%E%yiE@'Vă Q6J#]\Dk+Xj >-Fr!9x-[~G&f#=_9!kxƺuCKk̦W H$JRKvuذkԂxs_ڇ?kEF8+MĢ*]6@iT'kt [ȁ'[o+ 7|W {z$TrsҰe Q[!nb U;Dijy@]kj4dO0I5UO2AVM> YG|s1[ |֬q:eS=JW0_G%-P9n$g ,AS _ }6Qz~_0K*" 5lfhg걯?6;./MqYwR.f̈~! x@aꝆ7ma? f/[:;4XbR8Zy%u[_i3}./'e>/-tMS#JAzƿjnHN \U۔l& ֟_ Xc\V:pjz,n %R"羍x[)âGcEL> >8}v7`1S͵˹4E  FD A´6>4vvQ7#y̹bߏvN#xxb<ڔnoʉL/?y@b߯Dsڪ6NʖdV `*HRLC)*rZǯmRaѺTazm GYMϿX"RXXAt^t]=g Ôq7][)Z Gm 02U3?}deݨ.I]ƐG10Zbd8=+yTÖތ߫DX\-]390@эUF gHf~أ܄ыF@WuLWVϙ VNni.9 jP󒳥f;I!t3[vd,w?Arh屁@צ:I\\CM> 5&U|R4p`<%]IFKh&EGNT<1Aχv("KƇ]YQZ^K5_F#\РGƥR 8@PDxXCl|D"|B|' J-C)w NyW]ӟ'y37x؁Ӄ<1E ϱȵT̏/54?Jb^X2|c\᛻Nwm2٨ QxyDŸ(bgj_]BB<|neW9v,r@g"KNĜlϯp}pjIX.R]4x6!V_-\|Fr:B&K%B(ZQ%6-;u^.?b1GR`Ǹi0 "9wMXz30p+W`joVĥ sF~j6-!&llUo~K万l^<QA&|{xr\s$; # LqG!3cՍhUQM `0͖A2% WZ Hn3H9}nǼMNXz#6\2p „'] J_eH.U+釡*̪˳mzE^Nޯx *}m痕ޔR ~N#P(dD@fR ] 9bK=QS17zJ6xYdړUP=#cѬ@x>ek@ktB O!&8>\V"jm)|R:LJXck@ .0M>.iAy_$lG '- P%rl$Pg " )nQyM7s/ CKg0_un9q gluSsYxWֻcY=/Tαk!җ>!YoRgr5oBJhD٫3899(JuTq9aҒ38כ5OX٬&Ѷ %[ G9JZV9pC@\Kǐy0uo節ܜryq!+ee$ڏp<?&(ThMX sg>qODREhCY XC%phR1>_2˪q/bbCh6ogbu-k~ {.gtz[KWd>Pײ`_51pBJqUvȰڤy&IËoB}e*KԄ u_Fw;ڏάڬz^hc%?=H*GjXcƫ7+׺ *ݗ&ř:ꪘJ";lׇch%gNߪyb7xkg-X'V۫mZ6r?ZW.J G;DXC NGAG遡fb/*q/R'%bOߎחlk#&h8";QCW#w罱7ζlXR&:-b. #3,Ogn8zqi݃amNƒ8=S$TVd_D鮟i !)e ཉJF7A!;7W 65oOQ΂ u%|Rba  /Y+2OB"2KbOF{v+̄oKL%ds Ts\$UzE2 P!0O*rppF;9Ȓ8w}$#S.}l#j\s{b$?v%MwK٪t6'<&쁀81MgJ3 C7͆YU7:;^"3WI?i.G,շzl+hq|vT2w'_]{,,+f׻p -#3pN{'=Y?CBjv<.b0kgۨ)dԛszٯC4WbȡM['!sS뭶)W'Cgc:@$C$,lL)naʠ'O"*;^1_0ҵ+S,YL{דdRFiA yAޅESl?2bW|֭?6vȥrs  ZByD}.kB4 j??THS{t!]VƐL,M#ςPc/([iE!o S+C#O;/y16͆vjh{ 6:QA|:ka`=8C&PH)a^r:.ʬ6]r<5i1&i$;2%I%gbEV#xQA?UsD&re!,BDž{gu 2 uoRt}eT함ʭd,{b%n_4[ Se2zԪS`Zq޷F>֬9.+؇PcX4?3OZU?ubdh 9x`w^DA/=$3=/(ay~{hXA务Fòř99řyz *NUkMoش\qc-knj]KA%壟~~R3:s)3\m(^\/(F/'MNMIKexЙ=S V%rG6sʩ3 _)KxƺuCKk̦W H$erp xmMN0%͒'!!hlsL76g((L"@Oy\^]7q {O7qczx=]EnS#f$dy9z [{Pr=_AͪưD]PRmy;XexvY`Ctwf.:3A\?J,vebI2n`ЪCj)eoPgDss.{=,-pYnФN@!s݈&8HOmwoxujPǡUB& Rڵݐ6J] ғ49Ygr3x5#+brӓws;g\gaW{e$0z7P3AHp) T^-h^:VJUwL"+uӔ !<Ք |ty UMT@&A4b(O0e oj Ԁ=ʗ^x3+=hrA\oJ, T])Wv6٭T'~-9@4?y8&rܢ . lfAFy JN0%ض=)JK$ydeA`_ѼW iSflX2hWsXhۊ^h;0ZMlMh}l``%7M{J?uxh ֱEnFu`riԔQ$h ^Ї44v;,eA51iE_bb[b:7Xdž`Zuu) #E0k YaiijgHl aׄ%iSX)_X\ [Fv0ԎJa(KqHAJq\896qX(_7X4{`\L1ֿ-)ȳ<̈QE:rRl$[3ϻb4&vw^$ x6Aj@STM_w'm6Z unQŸZM C_r V6x; |@xBY.3n22 +W''%3 :vS,rۖ: 0_8Auucɇdׯ}tؤ*"ܓHt|_g}zR0戸d)T n0 L"_Y폋ۻOYWsLe"D4dS5^ͨɌ"OlNvr-o]&k<9+lI)wP@7hcϦ,pm֒-K*"2C6uoњy go+YkDv>ΐI֞?J&[I~slM+R#> Z5:n:FW6'δBvK%jť]8[uH_3`Zrw` ۂ?x/yKi>Ȇr:B Ko8eɉ Z&Rwl~ 4s˵,7m+q$RL =9+;Ł $3;OB&2ԻHCSe Ҁ1 9_iZǫ?n:T&p0CI!A U[ƅrθ gl PH.]7U.2F5GSt.!GV͹F P]oklZئAHuH)2@ܥѱ.z40)L6 )t$ vA͠ ـ:QlL bjZ,* ʖ{;" i,r#,u?cėEa(gg's00IvOlI~/U_'{ 2CT#J X)X9v0, Ρ$`+&'Zg3m>})Bߋv>%o)z^D$y3^1^:qfH%S"= sœE * (i.stYC/u'5ލ9^Ƕ/3yЁaןa4==yg` :t-KIAscL,/^=+R`ivqz_<1 75@X, HbA/.!<Pߏ.kS& S1wu?{oUџEӚ5$FQh[{CR:(G+$PM/ Ur";<0h`t1-lX^z<6gOD%#<#ӫp&Ϟ_CB?p@s>.Rki OV5'Zš׼8U52WXxNįPU ='3&8ܼ-)<1K|QGIs}zEyz >2b2SpHJ.CMޮ|lq: P(I-.)fx05-ox73>)fXн>hG v "MfLxN$oGGxh@Du(ubk<^](+oto,Oڮ~R L#v_#]xX]|Uu~K#cFq487t\ڀ3sdb]40000 tests\ۭ,¯q |, E(fx[ϺuC45sKyْ[V/xEֺ Nx!8Cp-Hϙ_m~&YP/x:&iY*g&+3!~V>ҳWq{ %r_5P;fxX]N^eB^q487t\ڀ3sdb]40000 tests\ۭ,¯q |, `(V*x-\tn]d3ԍp[X x[ϺuB_1S\U>2WXhR $,x[ϺuC5~/V}z׵& ۚL B(SxYGGM09 ~+5Txm!C9?6h֛testsT᪘rCE 5;y#'}Ax[ϺuC5㧅 DlyӐL z#_x]6ޮjG ;.q> x[ϺuC4ȹ[}.tLj x:™ 8G\\Cǭ9t;E~z!A~ 5$CUPx[ϺuC4ȹ[}.tLj-x[Ϻul&?>l:xk:O|Xu %x[ϺuC4Haǫb}iuar>K Lx!Ӎ1HBkL6|97x{u%kC~"F+OTۜ#[y )x[ϺuC4m;g~G&|U^Lgr# nPx!8Cpf=un C|m,jp(y/KX>x[ϺuC5HpU{~iϑL xxrfh``fbY_pԬ,['GQ`V9ى5H۽QmbnRbqfnfIjQbIj|qeqrbNN^2C\նʀIL_j'^kvz1hsSS *ʗ@at"y#43p]pT늩gԔv̷,Y\畟Qkb %% U;qȧ႟[?GIG#9  7Uq[nR9yCPLx [h0Zĝivzo@x-\tN&^0UH/H-Jۼ+sbn5 +.x[ϺuC4s^~ɱ6xί`՘ Gx69\Zۇs6->M&?QiTKZQ~ݘQ100644 arch-parisc64.c+c<$!|& ൧˖,CA;^˺8,礓6|$lZ!h<чe {ESAșZYx{+V`#NWT͈[\f# & xXKlcI[mѶGKJ$%v\v$DZ&h"&lz[R*hz*bcrq[=0BE= ȡ@!.$ iyIkƆ&T q9tQ%] \S-EʠuU0D'3ZEY' ==[ŚkyodJBޟ`M40k7ZAF)췻h k*^j\ 'FN YZ]4(/LPrI TIXB c"0zC}ca[WU9Ġ&jhڊ'wTJJsΫ_| oX޼}WU麡tK,UU6!['+[M~+ }zvȦqP (zGTV 5&jfYEnC&!&zѨɸ)a׆TAV:ZdH4YBj&%9 osQpȧ,;|\{we gxCI`ɠ@~ \ k+h`tL/J6 3{Ȩ PpZȻm^u}E2j4v>uAaBy.PMZHmsYn Dzn;!5,U4լn=*󠐂gv:t\coجuP;ձRvv:贡R(y7M3ݛ H DN~gfͳ nFE}9fU148R:r".pw4,?ܡ^FvƷ$atqM$Ũe9u"^u4L҃{ƃ U*g23Q9>E~{&Iǃce.҃d?5EQ |gz YpYdoGHbb| ,.PkPTފ aNo{UGGRwr"GBwB^9zYoXʆ7AM\i8Qbď wBPڀ\v8zLG.q9@] @Jv-98w0}`␳6F'uByPАscPFvd7'$ LƳjxشޚ8T 1Ae܀,*m *}=hآYSUF_װ_!]mj3a+%%"]TdcIU,di3x&}Wst˷n MM4we]^r}剪FV೬;K@Rk477*lܤ*qJ`AP(nL ߺ0 '% ȝg[ n$H{3g:;ĝvs!]N2u[3Vl[ъUIғ`suCeRA QsdrYͣX[g;GTAYU`to,ú}*-[N'=O|) kЗ:n&Jh%mPT1 n /+Lk4s,QbBO¬EL,rk*޽~iݕ립Y̞SPgtҍ;AzI1elrMm@R&&, EuJ{aM!z5~Q](LBQ?bٴr߯ $p3x:| .%I9gDqd x8]T9_T}W~q 4Gqכ[]'kRdݓ QHxO?Nql;乼!?wSYU_eMkT+U@o,nrM'uuC ]xu] e';˦ J c1qC@ܻ .nL7\23,B)s[.r#n.CLğ8S4L 98+8 ֬ }40000 testsSzULNF^AY $J;Ex-RtN&^0UH/H-Jۼ1;j_;K;]^tkٜ:[8߰&M`)[/ģSɮW\4Cٲe֖ty]AFVڷ鯻|{,s9{[M^Z#vL>TQV4ْMZXuZDTMl^}r[zи6kį- ˓RaatW+M)$y^*6]Uҗ۸ L{[LD}1=cwHĬKgȞP|[su9c\H|4sr-oJs|"% 貽fZfd7fz`3B>aG>$GUgݺ5DT**T4%tԾVXIƛzul3 /㕸mۧ8}LNKebO?z}ߗ gz&R j.0͖Ms?^|ݴ͔,#T5 >Z#Wq=.Fɻ=xR9vCl \h1KW},QS}|mM.|& ൧˖,C~6uIp'Fa]ˉN["ax;hRx(YVげa6|$lZ!h\*\?Ix;.2GDA/=$3=/(!pҩ3^z'W3_*TobvjZfN^b.Gn/gpgv}(_ Nzvx7cIpoZ7\˛ȗ56(9C7(W/IIuf//^]rzA@U榦UEiyE% rV>9$F-t1uK鉈gj%KBͺm,(ZwTug JOj;Fw&[3Km[73jW{ ?ƑE敿YgEL?8we6ju4!hHD~ WgV\iR Df ;GLnf$%k-ck  ,cdM\_(>]qgI7=tXd>7'-8:㉸[idCVg=un C|m,jp(y!C- nh|ox?]zvzVW7/U_9\jsl,G_4`7O[m^>) jD%YǝHm/|Ѫzo[_&4|;cgeƣ#\f˝iڶM|W$k]W1S9v 3E6*/7ۢt/m"v ޷) V"W;i=)y:nĜbdFsRs na_ӯqLi`fQlƋ+ۻ"Wy -dKRs r@_ۍ~I4J\R>-9=EAx [{K&C6iʓo@? xB9 v\7Ү66yM calls.csv /K͖̃œ Hqtx[!Uxj6^Ĝbͫ2 ]ix[ϺuC4X4sHM99 -x[ϺuC4HT ]Aekv4XNgr \x;.r\d6b$]u-غ[;3} r.x;.r\d6 'm iRb]l9x:T ]Z LtޜldMβ9^fr-8&_wɇqalwz۰' ^x;8l ]ZEɓŦ \ɉ% *E`vz 9' qMlf1j QPtT27Whu8\)ŕY%#%5'D23͟f1գeB LMt}`o]h-,64o'7y<;ze?W+TԢ̼tԢTbԂԼԼ,2o,nrM'uu x;.r\dԿ*Y%xKE1:x[Ϻu=_dC@{XeEofa Nx[ϺuC5I_{Zώ>rwr?| =|x[ϺuC5v/)2: LlOYnr?˧ xrrW^z>6n39n)lT YxY}w ڋ ұ4NM9a7f&U]2=k 40000 testsB-i{HC ")ix[ϺuC5v/)2: LlOYnr?˧ Ux:{|& ൧˖,C~6uIp'Fa]ˉ^x[ϺuC5ȡ*_Y>hURL } X:x>FF jE΂V:CwW pfcp|*,BB K!tDxuSn@衵{(Bш"!MUhEATJZP^7]Z;G<Wn /0*T’xof|yp!>ޟuڽe9[[mYpM d3z ^||mƾm[܌(ȹLHq:q=b.>׶e)NAߧH B?Qu,)Sc0 3 1X5 ϔ3k6jB9,SM)S$V-& :ljoCW3M),)j0STPd ElPrHp7'߄2kkҖC|aSvOlHU#?EzAPZLoԅ9GYDB77P;[WmS,'j  hP(ݭo U ZkVcٞ]- 20XN|/I *xjY&Ӛ4D$3'>$3?XHOϬT` JO-j$'(25},2X~O~"dko6dfVkI)I-/-)(-QH.ښQq<v#`js"mS춦UV3ɮJN4*:ziL` 9nt߬Z۲jL @$QNgVY)! )fy!5fɢ2~~x {֨fvbne-Iɓ kx;gADA/=$3=/(!]@0_s^=;v3|Z$L$;5N_0&d[vsSSCcݤdĒbJ23sW_^ƗPc6.|XnNfYniqjQ|^~IfZfrbIf~^2=K~-fv ɜvMxgmmpz^o{Kv(jkC}$'n+4(NL/7i":n9n|wJ}<愄 \sSSC3\ĢdJFo.oZNyі~+04yq"nDT8]?DhY^؉y/p5HG.Uk P-uV&d礖,/Y?d]uRUW|D<>'?1E/A_;02lY׽ 5U)T篶<=ڿɜ-ڒb@>]kIjަGk3VC&fe%28Fɨ oWar2flaɁ"g|b5)O[X@p;o8rxYz Do1 ,/ߓS4?ƹ M\ 40000 tests֨fvbne-Iɓ (hx[ϺuC4H{KԊRo_pG)8R|&m Ax[̸qBBY43-9k ,Myo nNxp 680wL x;.r\dCGM);9>?xBJ^s+6v|\%'ڣOO͋O*HKfϤ/.WKvs4} 0ֺ8-/(Vl96Ys<9O(rM0;<#x!οxxD8 U,$-DdZ#xWolG.Zih踂zCjAk Benw;uf׮)ULP UJU @RsU+$B@-$!n"T7;.~lo~ї^ͫU~]WPD<2OG{G+4@9,̀F:uhM֙9"Sk9ԍyb#)hx֊ //խc;]ɽݳ,/?svZJ5>HFz;whgt%5bF ~X#zi{l7|ËǾ_>VxNR zJl0a0j\J|t`)-! $z/9󦦍[y@FxpB&-@ӟ¤RO*7{2vҿQH&}z@i `'Ux$;_E $\G%b7ėTg⥅L^`xБlK޼/KmX\`?|bȚM4$ [dPm@W2T TJ&hp)IqI*3PIq͠T>T](0̷λui[A;B)%Y`Iձdzt9H7hahr )5ږt^iCmF_zWU=q6/+MPCϨ5@^V3)=D6>2]F<4P`NAvnqDI*]RnV[r WL[uLB6ێf̔KdX4*300_T-RHD# pצdy3}vgZ~{ghÖ|sT0Cţ?Ӊ]uRBUahg_Y(Y@N`- qkSE6N\q GD?q}[RPaxxʼ}5EX7mnXβKN޻osɷzx&{O>yMEE%sL5O!o5WNyŒspqE2 %%v)i VPyxR|Fjb]Fbqo1Nf2!?WMv^i4q\T'̳5䃧&swn6& Y:%HxcB=_biC/JϬSSZą+,.I,Ƣ<513ي((OA (8Yɚ398U!7 1#Sl"r`z+IN*6KbQlli(PC-B,@ Cu=_ef&-yŃ]\CC#vs2#;A7qdWO`wO1W5YK'ۈ2n>$Ī```=ـE|r<ƪ%7I21)TOL++Mv kV ~ x340031QK,L/JeәvQBjeYQƇׅx !|S2sRsoߛ%7&j[̤.71|2gýPpe lLjH4c/F-2sSSR"IA'v_-gAˁJvx[ϺuC4;z$VrN{K@`@|& Xx;.r\dyi,TΕ{9ۖqicFpx۾2 O'_6:Xz |&O;ar{ik9'蒝,ԭ061ĒT]3NΜ` %3ytɕ@N,կf 09^x[ϺuC4-?jo$3oL!4x;.r\dy֘Y.-[㷫{cF .:xJA nX#&G2$*b#6.{ 99[!AA|A!k!QRo^{Bs~5>m8'\&`)dXֽ y%x")$wFΙ*@IJ`"L4UN]ur %ka0'iI -u GyK<~eÁ0 .i+OzŠ\HJlnRWrQKM=Zgzޏ@ y z&^5 FlԡN>IVsex o W?,|uWRwfco. Bzazwge@ 2jcAS^$a9ޣͩjG>zM6,a`w̌IYs, 'Z˧Hx [쾲"`}orZko@Dm x340031QK,L/Je3]5 oeΙ2jV 7MNMIKe9Mb}r*+NMN--,NN)`]Du 6gU^^fso},^_uuݾBTx[̸qBHJxzQ/I dMz +x[̸qB?OCoVKܴybj Ԅ 1xl9.~8׿@6;GLE ¥" ñMi= d:cdsHנs<\uPz>- JN- 8EGºo[DzS100644 system.cZ #a=ĪX5u# $LC x340031QK,L/JeәvQBjeYQƇׅx !|S2sRsL6at"!7Y xUT[WPwFKL_w½?\]nU WVY{E?gkyEMMSKJfU2H ?ٴo= Z,d~`P;x;xqwC r{\m ^3ѷ +xD]~monn$:y 1x;y?X Rsrlt 'ˋHn>Z/<$WpsdF 9a$6 \ Xx (*79CB !A҂i$<+.^$e7WH0Kd)h$%!8 OZ9@oxMOAëtBA AkiZZ 1Z") i,-"Q'u; ݲx5hzdz`L4l P^M;<[}}hLZ*Z}jƿZv=IӑTuQҐ eE BSxlgOt&1wW:n 2 8ͦjIԁDQ,Pv1~>ĠX  ˃a9bfV𫁎KpĬ_X3 L'9 ncX$I qQ7176,'҆UR_ɄS$ž6k߻ }dfqwZ cr?GO? B1x[M*REEaVZ"IYh%QDKd s RM3H]1t$l!"g/+tqLTv4Xs o4c P!:@H+2;8ʑL8 Y]NKȜ8u';.D (g÷{V9VT0feŌ273ਁQdVHRCZYgoȁQZZ# !U_>j *Ts3+ ߈ fBYkqR/H벤Mu]Jv+'+3R|]/y!? >0:-%e 'jc"IO`iF{lFwᨌJTH4kx&i6pWN@; ӊ;vy>5K9$v 2 )wF牟3aA$5 xQDA/=$3=/(!Z|l[~~GmV3 %:q///*;Qvu/lZ uFTޮIZFj7 675U0MJ,LM,ȌI-K+d(Y?d]uRUW|D<>'?1E/A_;02lY׽ 5U)T篶<=ڿɜUmIjqI1C [WoSbYԡ}S2sRsrdԅ+09e]6˰x@yuF9<|4(xqCg &k>͋8b$#.xqHXvk}yGO>|hd%;xx;*^d@QjZjQj^r~Rf~^fDm6(kRZNb^zibzBAeIF~RPUPL(ɩTŸy21fTT⒢ylL\i%EťɩV?qLq 춦UV3ɮJNHx[/rVdd%!n_xͶf_x[ϺuC5H{zF?VXk~&ޤ .x9?"? >Y`Ӂ \xS<7> H gH~ux[Ϻu= %xvzv12aFޘ1 xWMs6W`|IX%nNnԓ2)HD ,ֿHS}5"_ۅEPeGA% ?UMxcSx;NM;Ib:q JdDVA-m=X)qqu%ިōeԥ neMǗKrE2;m Uゎo[*x(/׊_Qd,ЫH]uՁ+#Bڥd̓j2"fJ-lC)v$G|ڶbs:L|yal(VΧ$hoB7g%{} 'ޕ^7\q{~_n?~u#d^mTBdTbVQ@K#BMQ/]F ~Pk3Xě(b>)tDp\[s)GGvq !φƕ<'u2>01҃Q T?4_t"#mT8 u: Akep“ЃuknbP122|m0P V=cR "R6jұ*.F=rrڠyV/!*_FQ &ʴJX9(2BvؼZ2~85[i=bwJzẏfHsO{]. wJJVuH}9;=~XQ3*.$tA8Fzw ;c=uzl>zh<^z#y ZJʒ\˭-@G~׬M%"6ƊSkXK(1&;ΩcKQm3$Ԡ=?=-3my>Q9ƣw޵My~F3Ÿ`Iѥ.On‘Nw "hH')XK jF`Xu?dXakKʭŚ B[: gb:{O>ԷR Ni&whkhr"S:)Q{ה7(ZjC4,&lJg]_̘5 CRc!f4 *wçG`hiZ*%퐕k_cpSh4ÊLhraE#%.u3jR߲(:@revUC4ЛA9}ԍs $U(I94vB6%! "CHKy e&zEX1x!Yݻ2'U!HO9? BydV;'c;9%Nr~pvh͐T5Kgsp쮮.p9Shr'sd*/yxwwtL۬C뒮C5gߝ׶ft$mytv¨st1cP8j}/{`cxhu6LIϕ >8vQӤuY@t>8VR ͓EXښlVmF} Q6qVkMJ?ؔ\m-Ad:?!Nċe'O6f*gVXn\LYq0RzH{S%XSpNhZ6#l&ARo~{hx&ͳRQ ?HO%*5@(ūKUHNNo=(jF/ d}xeK`If09z4tax{&t|D' Y%1Ϛ=FY7p@?oc QCڥ3߃B'0:\4w=V ҄1cέ_t{23D=5pV* m ECrF{ `M2i)#-:M0<l\(\vweOj*Mx Am_Zo#!Fem!{DW)ʴvNh)dJ^3tRT`k߭;Du`.ˠCXHj&PC/!)Q69v*FFg뫽^[^VYa&iX)::ԆX sT"fR3cQvؖ S"h[5RD(ϔU+9&]ʦzDNҔE ):Vy`:PcA>n*s*\+Nf전KɱΥ_m9Ct++}!2]I[|ua0if 䤾%݃;~jg.uO0&9GS PT SF@u]JUP{XvKpq-|,O-+hL?C4?T(M"ƶwF3f8B 1II"(8Z.!8K+N ⅑6IU5F$VȖ:s,KR@hkIL!h@\<ݖT+pKR6I],! lK!8{+"U'kBȐ;(!2eTuΣpPR]#llNaq JCČ2h4[+ y^̃۹'Gi}ߖܿWSR_gwx" \g("4ggǷx#hkLxo[Aks#wNpUn6F`8 fph5tep2&:Wqز|BD{O8tk==0|:Q$D)Z 9ЕHU CtR-ڲrӔ,A=ȌC*{lF(;q_(#`/;Cm;xZ}=z 'WLۜ؀b1*u~>+!2g@H`k\kOL< f4][c~%.z7 (.aK%ٚA>_‘fOa~ K L`OW"ҁ,X#'\~/u0B&1GĶ\d,c?Mba5pL;|[zeN& cOgj^=)ˈ) ]cSȸ 8ԗ(CJ= cf8śKeu9޾`;[J5FGl ~Sj.3\|)doRfs,'MZ J=0PTG_*_xT$l 9Ŭ-YZZT_Y•3Ee: "3EW+(I-KQHMKќ|L,WYSPZUQ$7%_!/D!4$5V$#X (17hdU6lgɴˏyU;)@RӁbev %%VzyzEi%E%yiE@'Vă Q6J#]\Dk+Xj >-F o)n/x[-Z~W&Fߘ-ܥx340031QMNMIKehޤTvǤ պM @!71\J)뫟x31.)ٲ=ξy/D/fX40[C Gp] kFJ:b`ly ipQ|[fo;>>& A(uD3%qj\Zkg/B Gryx[tIEΠ8mUX҂zdL,W"<˘f)1^27M܌dJDf1!Q I&jj0dcz 2 #&PP4wRlh5<[%u R\XRr)%b]W 2 KAiq IWCAt\œO.<%Adz]qtL f) >yFa4v<~׍+*gՃ}b,G\*ŏ{;LJW'f4}X'ҳ\gWXm-FUPP ,L(zPE+o%yT:htI):b(t&Ļu^OB9R92k,=sXN U.R2.g|)$\9zWsp'ʯ*ˠ,A= +V@qzFp~|漈ÓNRgLwK7zVc\^{`JL _d1|A9 Y+eg- S[,i>~`+2AD_w% 2Weà n 2BXQU7(a/;H`T =+27NgZ* ϐ9{u%_~,ԧO~'a{z'>ZFꉽjnDr0OG܎amدKz]JfM;hư j~ij7I_ eP ~kT0jl]|~{?<^n/V ._wxeAJAEB/=HzQCO:i35tDfx3LqW|}T']6zZBB/+yy.U!Yxk!k {&~!QD 6IҞ0 bs18]M3b3K)GȻhqWS>Ѿ=5s+3Q~j~ljxSٿZ+|EiZI|Bz/ƍ 2M{FFqO qBp@\J~3;kxAy}}woNɇh }xOCZ ஖ ]v] c~EuY{SO~v~2r[o0)7]* L6$0AadNnA{mezt~r.smuX\~96a s*0MۀMk+[G.̀rW֣̟o,{ 75[;-ɐ@'ŭ!Vωٍl6c][ܦ=3 BV2c%^tㇶ>Hsr,»^\X|C ~!h Xie5s/d% =Ը{<ٯa4uc浕\zWPw`%YkS-j6m{ރټ U&B?ڒ/u_,|#IL^5|BL{}S#Qg1uѹlAJrYLaI_M#,f 8HTEzs@e+xQq*}ݏyV"cZn4C-H:_%F]Owvq{6lBb&`aB&$?oN4omc00̐$?BRLext3YGnCc9EC`ǹ#z|!UWZU$U$WEUa1r\v #D)n=eD&ƊtU/2yx aJ1aLN6D*VȢ{ jxiΊ2!CЍ-Һ1Қ2X٥IXVQq:Q&Q3MH:PHT`)#{p@PƞĐ}IFΟJSؘ-fZ5C-3DXJ'& BOҜЛpJ ^ 똃&FxtE M֘˟Z_Sɩkh`d`2ٰBx,a 8rJjZf^B|_P<\q|c/Xd,)$`,Y6&bcKĢԔT\ʙiy@; `SFAŮ95/E.3MA_ ɊN,.ɨ̄8 Xц JVe@CO.){8Lxdx; |@x)畐7wN'tpeMfh``fbXPsz~ ,B˞ 76氈6,0ki_'yf~Ț#o\TmeV's|ptɍ."~ju-;!"dMVFCENxa=NVRc˳ɜ;D~Z{{_j3g|]/rJq]1F?0%UrS22ʫ'k(G['!goT>=5/> ԗ9·hkLw0Ƚ`3Z3! 2[;#8hKA'y_&s_d;=5/> M/;o:'LoQtF,״w2/hxprH@x95`MW;b5;aiq100644 api.cm^ _&ڶēS( 5h{uP}a:'GVdF;1H.qx^ Z)pԈ 0 Г.`$~ٍw*1'e?;frMm\6)zinN"ii!40000 pythonR~mxR֌$IQb Kx Hr0x:jn+|eme*CvA^@LUՓH(fIx2@m_=]04zԑoUdnS]QdL;g$h-S9s@(]5hlƇLPQ ᅱq,g s-d?'sh,Zr0eOn7.i Kˆe︐PWpl`$!&3嚇O +kt[ `j?lGQ&0 ۊeHgp[,?U?|4j =W 2g,_ɻC=x7]`^&&,w)pqf$ge(d@J $7bZXJ,J-(HJpnqeqrbNN1D?LI9̆hppi@QA` U-KLI,I%trkJuhkpOǬhb\\9Iũc$x7G`}*Վp~JuI~A|RifNJJfQ~f^rNiJ* Ua,ݴOg]OFt%|\ a|Ȥ"x.B`6Yjgxg0 Gw # =V!s6G%Ti$P2wv^c&7OT>zxRMOQM[L[Ep@[ZhTI-BZ*dyfJ/hc+c$ƍ`N@B+7{ϹOW+Qfӝz=o3L LW\)75fGxF⼜sKrnf~q)0qo2Lvi1L{ܙwMLJD֙F V0t&&}Y:+m|֋}9.! Nki{C/>c~r*\SbY7L St$1XB`=m6k֎0.x_a(;D0h-"BR To6ͺ)hE3EuQݲ_҂>39IoO\[E; eQK]9q͢P'?\+Ic1hQa `(4 VUQL4K0UWK՜4m;B&UH~/8xup,ڇn+\cB~#&c_bw,TZ0>e^թa$NOlY1WebXP5Lmՠc`R,DɃuV*gRg"{7>>F}bON\sÑ+~U x[q(rU929: y% ŕɉ99\\Z0BfBiqjBRBIQbrjQBIBqvfBIF*\>gfD]Ē"Ă:552[[\E%E,y ֛J]I^ š,ֿyb& Y@M :A_xuRkAgc̶*HJiqf6 U$D ggRZ/GDGQ7ѿ'OXcХH|}S> ;PH7 KAL"~A9S a-.#*M\FԏV/~R.̹a⠾r0Lg tߐ$ q"^K.>Ch- h:oYQk?Cb4k!5 S(j$VTW G-V[4g(ȥv}^Emň(,F.b,0M^09 ~lj6Pe}^hBJ 40 ń)|jAoK*B_xUA.yJZ ֽ0ed޶ "r)ּVR}Z:G }yl/g@!y娇uzCs y'+%~I4 B_.#ssC?;!8(xLI #C$? c`$ #C S3L?ʾH05 >hHS,++ntFvtO|]eXޘZak`⣾m,縟H43/gEnJ7JH<-rTJ2&zχ_#K= S J2! z-P1>_ ǑUVt4;!?+i.&gn[)ΟXv/ͭy1p;26DYJ1uq\O;O8&p.R &/'ۦIlݓ&oƉ5 )ⓆSX:5 4_BLZP|vx (]?[tY!zjz::vciwĈ{g?Kْ Ў͐h/L,!xt]jb\L<Җf#j^I\vlQxU<;IU~>!<%Р8CWxuXklWVۛ\vv~zma;OiBRa;kO흝&vRA[@ТVG+ChhC?hU(TUiS?(ߝ;?3~sιً;# ᧒Gf~fr\善r2w@ \x8RS1+>Qw(sXGǩP7ʺiA.p}G9N }_K?^MoaBabwI&MdJbB0((^FIV2@hռ˿B+lq"%(ˢfV1~AKҟ!2IWQJ~oUz\[*,%U93,)!N3Қȫ,>(7" eEGީIl}rAy(ٺ7( eCvyv!"?>ӻd>[d}C.b893'Pb,P|ڤ䷫Anq"ˤV"e Xܥ0X-b-{v@@0||uȷz=GWӿc`F`gujnI0}~ϔR0h#x>m6§ۮi"iq6}ͽDaBszKSE2^N3џni%_<@V˭.֩Xv*:J+A+>8mZ؆QYbv{vu;Kd;P;Z;t_nn;R.w4t`:+|;>ѹHt"0wb.А Jq R{} P*[v;(xKJM7A3ixnsSFCGYvqqMfWC9=!k F%pgb ]u‰9?; _](ʝ=~xGGknIif\*#*VJ no7pTE<{ Lm+Ca72;}jKeIBhII&~>-F1op#ڦ UܮOYEi._MD1OAуу^(~ )l¹+^:XSTUN&nnD7v$"ob}6`Gɍ>z8ǩER\Br6ܓC8Gp`}m~4]X qN6-}~kYJ::). ȮjzӭP/5-SԤIQII|6+-1Jk鸍VqΤdMʊ$5լU?gk+];ku~*~;~D9S|:0BAA BA0 8vMr!vwM[3a0|x- Oc0(AHsoEʯ"h+DBmf/OŠ;CY8Öaۗ1Q8yS BXH O&' Q`yQic81cJEɎq`c8|{%o ?nR@Y!d$ a|i#Y!Z&^x$OHZj$P'CFvM\GX2!;kH g1TXު 3y_I_I!?-Jl$&QI$'?I`{2u݊~Ԋ"!mb`=Fp}s1ځ@~uJ:OZBJPJw\(䥂և:ND5܉yjB; ua}ۅ,y݌G]tAD]F?fUB>Wr>}]$H.Ad~zݦ֭{:6dg'>>ꬽoSEdu/F}tn ~x80OuU113<3NmT,B!4-!U;8!4!J7`F080ü{V8YRǪJF2B&`˯MGgĔ\c%.%J妩2uT4ZMϛPs&8o`LQ}-)DT1=Dz3HRvhH:_iW-(Hh]ap?S8d絤U^ACGYc޴ ?H&˥؂ZѤ,BZɌ$4{ J9}zۊw90w&( >VX>^u|g/e6 nCLMbeQjWz#߱#W譭Poځ "7Ma<;i\7% Mc8lprCOOb6aB+^6U䄐`JN- Vxd[bږf2j*iɅ"fVY{Ӝ+g7EtyIz xؿAo{Iplwv=j!q2V{](s~/An:=O@@P>L& jAC7q*130' Ka^0F0Y5r  0_d~7E跢5jQ13k;#=oLNk>7%/0}!D G#QOitdS6jMݞ*GA1H._$>U Jkj]\ĘG<쇳ŸelB(oU"IYgu!<>b c(lBX)Jpb3_I\>}_ 17\A8}pm. ?2 ϢaNāq@AF{-,\al22v&Y˪\ջϞ|8X$_rZS4W7ېrSsWxuXylUOwKov鵻ݫAm )e;m'ݝ]ff) 0QK-QLA"&#$"1&j~of_]oɃ $ޔ#?P8,rGiNJgrv EkLm,b%% ](\"c_7cbZf9=QdaiD @p{BIzeI;9h$ XvýҴQɰ_`s bZIS)CSK&XL"%j|j-iXֺ4Z?V G!>ȱ_TMh EIJi,-4Sx;MnNF% ޗ,XF._KLdLy}z ~y|IYeBfWeUkv,Fc:oguYzFi rݠV͆ƫlEs 9UnX{7q_a\ٗJn-y_VCORwzȍÉD.[PT@ "$碇 ^Rl"xs1t.FWm%h*忠}\s+u|2T`c2yY9J]yAsZtPt0:U^w A4v8r2zP/<'8GD~ڪs.x@lBPtP'SrNSqF u/2ģkp[*Pg*Ph`pe@Шxz̀K*ڀ^- .`% OV"+c 0"HψvHyGaB{ dce|_l`4LT>>PFeuR9RRc^ (7ƪBF6 yՒɹ6a-"5x[ՠԀFjMLxAHl8]]u֢Q:Muu`:9%tȘܬ>uh qӃ1i2:uΚL gBg|^6!f`oz)| F-Do ce ɩzȌԣ-߇[͇';p~W:/u{1~ȣvLt tBpJe]x/vs!4( Rc|JM =t[Nd/EL甥y(Xwe%Zɧ@|v9=1{# ؃br/^G"0}}t  JsOsIXyϗP\%6oNG27xu1o1 Tт@һ6Ia H:VlDPe+3o脐<vpzG-~O~t7p\uvKq~n"(&r+0%IM8EC zTT]4WN0?jc9F|lǭ TVxu&) 2Baם{-slόXq*Q(m[I++M±>D^qP#up:8şWV$9,e4beY#;fIfLbfR+s"q&Br;eIVH &;m=,;?9(ߙ ԯ;G7 w"Ĭ>/'0OeQ6U]s E)k 2I޳{ݦzqNB)QgmmmQz01aʷC/b Lxr,}B%_biC/JT(\AKkrnU"i9EyJ: 斛uYEKr 5Vfc ͗;؍-6ıgV''5ju8"iEj@"(Jr KRKPDJsr* ́"wJq&e1EoAyQfI*TdSɳL:饉E))%Ew[ģIN^*J$^\Q,49KVfs:Ē %Ɠզ2o^VŞXP>Y.7RRH+K.ϛqrHAAI|qeq20/J,oĨ69HŚ Zm?xW]UNu ’]X،ungiـBP$"$3L@'3Sv7L1 pb!7!x3&d "G}iwf;M{[̾R.]Ch5JרcZy4oJhfM 7ÐAU]0jqw.!ИހypOm^S`u۝:f߼0aY-GPou`F[Vq4= N_whՉ!"7Cl%BHfΝz4t&)4O jHygG+[Aʕ#=>O@Ne'D ˳ K-U3\2݋5Ȍ nI !d=֙TJpfA['eJLHjdy0-kBB sˊ-- XŸ3jr@n$]zp{4Ͷ8B;c"<_w u\33bR.6%إ%V"yv,y&[ w]-S8ĵD:x5k+ãKJ\-YM qa Uzw%A E'VGDM|Aw#)f{蕹ƏhրK_-̍d=TIkp [6w9 ~Џ"Sh;p.c{z (xV77 .h" /* s390"" 2 = { .token = SCMP_ARCH_S390q32;3.G#k$ c kk I \ ABI. Returns J&qLo.))59x[f~dK''I&o-8I(%)4'5>@H(b VUxϋEǙHNqduhǍleYdA *DCS3ۤQ]ABrPPBԓ{?"xHnBEbUMtV~yկ{O5htk^W~PT;Zvſ iwjR#jHР A&vˉמ[lv6 Ge+4dDi{C ݐztxjHt䷍g~[sGEP7/Kz'=l`tM~YjwwO6`-l/ ?zBg=ƌI,.<.H-5&oJzHFb{E@YYH]"[~S@/Ϝ MPrY]6mCLt6 BG E:샾#Ѯgajm$ny6.49.VRvF&M+`q &~u4Z:(\WiS%(|47&rFƈ]W.GUΕD/?OnWWOKj{rC&V:i, RrE0p2 _\[}A#ѳO\pRqW A`ӥ1rk"cG#a\k>\qյ>CTё?\xN`|˕KT6򊏠a{+n\ x*omʪT.C M1'[dʇ=h,IV')N KT!"5nͨH™\I qjUBnD0y_EN@\ڒ|2w9UaSsxy  `HĂhO71T){JYY lJHo њFZb:ݪE<6EB2M0̃:Oofw EVc QrԱb" r1 /79pOG; s,1Yj&ܣr6C!FL\Fܐ 34ů'mLg{kLV;-WAttmW XQ.ⷕ«SeĦtGM^X'x}Tn@UU<5Kn^eR+'ѻ"bl%^Wʕ*J3,F2kMQ91њ)X u4ci##,44ø?/'`it=JaQh:p1x| D'Fq{}mo# X[p ={gns&1poٻ}5mRw,"[Lj֩jB+F҂˒;AE$d Tt`N`yeEQS̋"KUea}bbް1HQgS5N lK ?K'f_~ǭ$L U^fٴkE/0n 8.l %j VGX)iO('ÆFQqp+ .u\{X(ns)7(<P ga?waĢUm2%X`|jYDBx$;epbOXƚ4\,x5M{C/]^bn4_0vCDL/ Rx)[zB#_biC/Jث %x-JjC;Rr~^qBqIQirBbQrF|qeqrbNN|Jjy%4FQ[ 3dfIjQb$N'''PSB2c# 5 kr1$T=PI9=pL>é(TYPUds.\9|}ij3<,SQpF iIlR 64@2TRMH]]TE[PMj<`dVVUZsMSk79DҍUxVoGW|xBC>ecBBCj2iʆ;[ֻ^*@;CU[U{8JJ ݍnzHYϼ7͛wow+q?B0,{A㟱@lU]uTC9-p,o)l+O;EJubTe>9@@5.m@0YEKpa+[\@3p'ێ5&DR(X]Hڷ7 yw_7ECWW?v; z eSEq?.s]z0X>*sM4ģG3tG;?Y+( )'/agQU(Y:Wqn|a:'v~X1;yVsӳٙ˃^skc>k7g_q1߷F? W/>ESVM2(VЇ-<=BiWtV~:&ne?;i|i 344b!Y FٕvNmt nǰ$}#74"Z"#n(XF_IhÄM<2ML bE=ϔO?=0QĒQB ZHfc,;M)p w,"|}p ~Q=``l4){.DI gv(^`Pwbv~SN&Kl$%'Y`Z`:mԙ[\a:RVZ$5dTowA6׬{|޶`sq|td#4I. ,3lTBs|A'GݷX\L/ ]!>{cKn<kuֵbE-[/GlĝkA&hKw/JCa֛-x,61[j9a.;5fzfE5@~pHBtj-f={w/a{&4;#4;t~P`1c*XmEK;>;XE^uk!?drXaenxe)DT&ۡJ/&W `nxi١!u䱅˒h ú:fb^5Zwtx h"0UJ!.*Ft85#.L|,D xuSAkA%m-UZcFݤ%MV "NvgavIRŃIk{UQѓcP'P(J%@j,@P_(fįV,EZ3tΊg'6)#GL t0: ##BalbxGejxU7d]."pl9FU*"rXs.&V'T@PxKG:W!kwMGo]ֈwzPpVx lv{sr-̴@ah0*.T*Qͭ:qAc8|g|D4?$޳W{GTE &u2u*aJU袞J5!!{Oo{˓}rv"kưm+`[U\7 2n\; Lt!6{P7?ݛsqxOh#UIRviɿ-D"dxf*e(PЛx͓ eO^x{/ɛ&o%~~b5thΫ}b퇏J}[Mm{D?^> Uw덊vS*~;Wz3 ``P%A mCENQѹѳ``.lF sy`=&ZO_x 8_F+:^x#w[o$a>N!zp)B&.U DŽDeykr*dN60 y8qY,Ls ^E6&c)/ 'ˬna ڇlf$Q$ƟgR6*90(LS31vbALݴC%E 9x)fh)*b]ILxIDOsk{o3_Ҷ^YĆ}wD/oҥt{VygP bv y](SjxmYKGg^8ݝݝ9؎!ޞf}(D ꘘD$\B ą RDHDCU_=ų='^]zv/EV%I}; ;O/@;|_5bJEgw6n̰WIϚcbZ7gYs=O͎!08*#  W]s"jv9zE&E6כtXqtkN'S9zIz>|o;@ՂlA~)B i hod9"Q ~ʾR&n_R3뤡_dP#=S9b7NSΤku"\ܙR[!B+ c_Xˠۃ {"w@3`yhZbr@W߽[i=p.>%S E(ԡXMQ'nP% O$#*=?.t vܘj! lKS0KF҄(Cb=ܷ 㷛1_ƺ!_Ÿu wVJ-YC:؎3kExMOgmgWA W.vn!|=H0͞;VܢR /&{& ڳ7͞Tl3pD!,CHAQ.VHezW%e(/zaMmC%;:'gƔ+¼OBґzύgPoc;Ӡ%5Af|9ݓVC'͆fSVS7uK)A#H.&eOͽHUaK5Q> ' -vK<q?"A,NY~쟧ϾU9MA6Lቨt±^\  ͇&8bgfudPF%|nS4 i`ə$=ύ=_$7͏̃ !(P >d,mGMA"'QS_Xgj;̯P*L($,~X'}'ƞ$a ZX԰?,hjJNFҙ6wyLAc@&byHaS8 d)!(qYe0}q=.2Y셳t\qGA,ԧWjͲτ ; /; Q{>|Va㲦"ujvcQgנ/UG:$:&{9E.w.@0d&"&(͒B<Y 7ړ)|P`X,XXiS슁kI?) VTɇm@CGXʼ=Υ)P.6!cOsW !'`Ot~_e.еJjgW2(eUŃ<28⿏P~kƹKO<ٽlu'c"HZyaP U#B"OZ dX\8+ΥDfKӬT".j_TpR:(E bJڮ_.RtJ'zwl~S孬)PaZY\'ؠ:J C_9$y+S#+V=W.iuYAIh[Chܭ[egV疨eInAe{kd7hc 7+!*7j7W !&A,L.IYEn.)pusW[mΗT&*k>=}nuUؔ !׻Zo8rEb8F-LE.VViO_%ZmY2XyWHբ6'aP{}k7J[Cvb7ns d_h`&`=r R7sEcszE`%ӘZ{rE$Jeu,^TG(jY T*e([ZVu1|;s Cc;ulr9 IKŊCSô MjKW3k_+^ Ӈex@T3~۠5f[k0?YX{ll+Wz8YdUA谳E Giы0}"޺xAtś Լ6 G[ }dɣ08,N(X ?DV|g <piL@>˷.{; 0g^Ʊ*OdN-]A*d|#V6[r[O٭+ǣm2xǵ X^‡ʖ j950p?(Kʵ%,ъ0L@VQ .Gw=rZSsucۣ!OsGrWD7l-t콫a9Rr3F.ޤ0K|RĆYR/g(5s&~>:κӤ~ ۏQv736l#l<71*>Ck^ҮC)|-J~h`[Plh03jU_ "IWΐ>Qipq(._A`M*b 7ywoǍ≃:|1-DxS>q$ef߼q)U/'ezQ|{otcMqok}C0&Х1B~nt6:0$1}o-Ֆ1{p6 lYbcW_8zsP7 xWKoUVȃmSBD(4dƱhMmPFIJj:gܙqmYXA/ Vt d ! FH@B]ˉS=;߹wnOjh\Mu WJ6,ͬN Ed=av\/{NʆE07OQu.]Ir*%]\ϩkDjMUOZnߕ3FRyE 5T%ZhDe!ZȌ= &ibFa轮s,<PƤQ5exeasK0ߛI,('0KsD|yPL)RvXN(4wmYxuuDӶ752E/?]ig>8ԨgWV.S P'&.չeeve"\#o#hVy8?@z28P<рNPK]K:l/OPBbUvzz]bC D`;fDEbS5 /sӞA,.יrcN-*2:h0@$AY\X[kjǾT!FEy{ú # сOS[?[#2x@8uμ2yy-*8Љ}]§1:q@ͫO1{R.4n ~նe︚jC\$K$xpǶt?"wS*# ? lG%o|V\n286uM#Ue{ ^BNK_nȞG~"LW*tR 4/HpC7򃴚guT8ug\kD3K0=u*hMmMym%l"^T/%LA4Avb]6ʣ&R5p:vb¦PeKUby A4*ynAɡK]b5Vqh{T^3=\T=y1>Eہ-ϟCu:$d vfWH'aV%(tX'~haLΐmS% DelD8:]80j{X J?b>NFRXK<@t4qG7S "S2' {UKY6PHday)^& tOǁԚs=Þf%+G1 ,.ÖYx`X.+oX]Zh'APx? 'zt\zgA ZzDKiq E8KV7ٵ6W"*!+5^ T[*9:LAbSiKZ:t/L`JZmG <:+F)𭌤]ݸY\SfoQؚC6A$,E2 S-lZ뼾.&.d2 ͢.E,TuvV -8r6E]5Y5uSV{w_AŬiz99~WV=0]њ; gL8X-i6,eSL [~88c쇽?>@c Uͧ%0lq?z==>8<81j7ٳWG^zýۣׯ@\`&w`v\,rڸT5Xt lT< ΑOىl  +'٬Zlg VtwvUf1DnY>*gżhҧb m?I8Y4KŖ>=c䋬Y tY4Ťnllw'_?6wOy*#$3) L"kHTE-]<`iAPGySQ\feq};;/`NNϵixi֘UBxnsK*$7W yjCޛ?@/ hfoigزӊ 6?loavۭ=fKͽ' ,AX(C8J1iYw"r&׹%흍>-kê@AAlV'gbQ/a@ȥaS]6z@ 66[㎪ Jq(q ^L/I 0e(`r>j= nb4$0>z|{xΎ<l+n]ب ee?0r`y"q YIs)P>i~Odm`Q6H>,>iu k+\̈́ht#Gp {@Ǔq[9pf ?6ALb%q@ʹiW>?-!70WJmiԢ6 "2g [)W`bH%Gdp^|6uPɦU%K4(( ͖ j]$io5ʹHd`542C}TB": m2ҡ0 {iwizU=Άe- Tˣ2=J}Mֻ\t6d7mll.bL |WnP,bڍ0k:d>AREBMT@:hCX*Un+mO9ϰ貸3̙bbAnxxɮc{`-^ȴ6P]x\Gm]:)WC ` SYW֝4:;e3Ԛ꤃SJ$MFE]-%}hOiq 6 F6m]׌5@U~_SXzX@jOuc&XQ*1fH]u1LO7!I y)Bt`!8+v.{SODnch΅aX cC'AC#$ o(kF|DZ܄P捩ۍlW@H >8(qfF8򆲙N*-]i YEv z!ty"X(DFy=.:y"8TȠ1h0m;7ő `q6Ǐp63TRY{r+Nv_9 Mזؕ·g2fl=z[u6ߗBtM|20iDihŪIJ)pNKx` 66c&1']+{j绤ǿ~pxꧠX_LeȜ~b3߽z!cTqЌ4U9ȼB0WWSMJ#/hY?~h="g?jpT*s@;*`sh -cfA VI)R=  on ({m&k鸳U2J2 ߳b) M ȷ\@K邖 oRwow (hb*VgPheğiZ MlX6݂.kIӆ\Ԭ 19d9q!)D9v^"/a™bds;<|C:ǿ6&MqJz)4qlQtADxĺ0IDgS= Yf·y>aEk,,|s47$"εfN57],WM_ HR5LȂ@`3:()Qp]TP>Ditg׭yy~B rSUW2$z:`>5LD9>L7yY#b6. Mif,̠uޤCHp5g`c+em5}D,FuA/ sjY k ػWSs8ZM$01-3.8C\3X{Ɖ0!X2ЃtDClJf[ tMA-f`݄imQҐC3bS \ή! Q[{Y>-r,P8f_h5 vih܉Hd|˄br5t-Քni`ayhA];p0t $j ǚwv;T?zDבa0mOygCIfsdMrD@G7| }hvtmHoFqiow6tp8/_&`<" ƳwF°2>]p޳DGۂka@:=]ɭ=~12_EثO#-xЭ[xaUI=Ok{w<8o[4T>Rz@R:?jxAɃ{4]D:q6PPCdRjɩ[ug%QUؓ) %VzHQTiDPކ(mzN4lQ Z27"-vpi`/च vni[" xU"ö.z8w% `>_Em_x'a8u5>=Rb̳?m608Vf' Tdl\8 /"N5ad47Qd{QibKߞ?{{xX nO5xG9Mþ=㽧{8f$ +F AK9~'+ @ c/'uJic4j2e]BG*YH?!ϚF?dƝO ۆWǠˉlOnb^F E=%b⧘W#RBXНN-^&laM1AEFg<VyIL =v`qIh!+r^k]r*Lw"k!Oo]T7QȄo1,jxc.ߟ4.\&9 |TD\p4'Dcqv'}p2msW+~k9I|}!$at2|FDuil9QB2 @?OK4kSľPN|5:W'cnq{ɿ4S-YjPqEvC%vF&Ѡ%//!x&<\RNb)0XİTUc)$I.Ka+CaNC`骄uBkN"/h9 ph %GI'J$~D3!T? }\2 vbP!͘x5qJJo=5rC6,e;@ʕ5`/i`X, xB!nbm;HnTPʁsۄ3|2N@s/3vg {洚*58ǹzfĩ?lǙ:ʶn/EvF:rt)-񪝷wHlu6vJ@Q U13)'O_~0iQ.\6T~xM$CA0bVZ km S"0Jru#i+"Lr?e!D wO BŃcFpcLU*B#q:K{e:5V!jzH&( $)=\Iv\@xBGP8b"!z# )4OV!ľrӃR0UBsNchOI; 2Ya9W!kdn0(,OyG b]*)![6؛y-[ zc$.M:&o벡2*|1͊\k%65M3`;$H(/bK9>bdlXwM :yL[ ?^"ls_KhPzg׺r،+ Qm%D̳oɆ 4Ԣ`HÊH0 ys}})ql<;YoCꖝZ@uI=Lkקe!.!IG~JS[TgZeы5^x%H'(]]Isi1bug< MI޵yA Nk$4ѴGjGqné*\"Ÿ~-Ýĸd*<*)S%PNق#I#T(U x,Kh`Qzpm8A e3ƯdQFO3An/tOOStB3VOd P7VVQonZ(]9Fݠ72BV:klPVKcu |yqb@{QZkZPlnRNLNHni+Ћӄf1DY-Ts"BRйGN.uWW91p FxDȸ 7M&. bX} Ú0)$]Mg\=ڴZ5Ah$Z5W<: Rx6Rɼ|_ Z^aDlKqG*>;VO6{M0YsŌZ[F-*>fK@٣E{=M)"ZU 5{77m2ZZۚ(qk=zܾ5kC*.&tGne5- 1+ŕ]:rŎʡieSİI~*,OFT8DwXíJ @e'SĘD'#Q1 ^Z ëSfzӬkV"0viGJ\3 NRokw^lQғyj^%+]g\~3.[!t(Uŏ^nM% i!Կq3b?rxģ0Hai0U4\we⡫*7:jMm7q ?D%jLGѭ9A}R)ZL!qs>mkIBJ.+k ۴zOx eTp#px#/@ Q o]@Y-pfǘM}| v8zm0ojbgt 20RZo9Jca+ZƏR3eVZK^S*)TKb#_x$1j-RsnUBc<:d9ė.=:~Y?dHg9$ g|r|DBU˗[)I-=cF?"emVI'pJ|ObN ҒD1}Y;XgE$ű% \˧l(c0}AE_:!Bf\vŝ [5)( ϰҾl ӵ{ڍHdMX˱>0;q70obNsPiFs吗Dd߸iJ^QX** ]$@1D0@]bz* cXe҅DkQT^ΌYŏ7H 5@2P$اGەL7 RW7|mA;zu)oY􅳮q4__9 iRsMw,m!B[9ne@' p Q5, 5$n]YI/Hޅ`Y`tpXP5 A<+$5Gԝ/aFgE woRL&z}AAh]p便^]&9Bzi XE*(3U(wh ހTT%'ިk\`B AI ]w UaVzPMnY=&Æ^Ws,E +:)Q_wd6BȉV^JͲ5 $Ha15,.4XJ0 $Da(@rBwgyM r+$O 7V /ki$Amk(OĨ#vv@zzrMbRVD.|#DUM$vW܆,Sui(XguZ,!7촭:N8 ^K ySvPHT Ag%0 2b9y[h6-L¡/Nmta?UcaJDYAJ&vjA ke[^ G6fx1 v<#ȩ;5SV%8d# L6BI~7fV_1.t\nWR Zw%nK )NCh$sѽ-&cOԶU\PY65`|j_%B9  ס*wd% L;͕(B{ktwbd=e d̫X#J4ka?j0yi: + \z\_ kl(NxUi'}MիӚ俔t'x$k:ʛ#} 6Ӟ5NѯX;tdẤcPX2y9V 0x,C!yoޘbÎ5f7ýUB\ӢQ$6+$NL>j $BKFd),$%3jt/ %.i\7b7hQ{km"{fYxĮvZvkrhն?WR@XNhb=uZiSf-2Z R͉yfq|79Xf]I,).S7 ?kw,K3w[+ER?:Ȗ3q^qW -QITՉRN/K'#M'GI>N$$Tщ[JPƘBHNLhpsۄ!my=OT)!v̔q[vtJ*gZZ@\#lW[WÖ_v2:=ǎ~}4޹|ݜ&׮j.)+vՠ;.؊R;dMT?ypa$N&"IgėIxm~>MO&S1t%J ˪n;Y:QS"P3xb[gLK@ntz.t̋iL!*TPIiۑy>a֍nhF⾦&܎wg[rR!T+Nr$C`mLh}HvLW/~9fdz{|"hW Z~h$%1#iB V{{ pDؖP`mjPա |p ZKbLS|t\@S]B5"-VZָgZ euv+Qm5I"_oGa,W-4-GmaŮn>^u7Ȱo_Bo0fiۨɧ`m WL&v9jS5ޓofs5Qe?d@OGN(!#% ٦n6 Wu2krjh̢Ul_bgZG&S`;4b\7 l @kFKCG5r}cloJVGx@Ŀot'YWs=ͦI?6u]]5@$=ZI)Тb.F:H^?hhF!rFlE8 ,.-,pׯk~ITgvV|ѓ$ކĿ9v ΍C9]9uaƩ6q3Wx׹ӚaWD oq&nz쏗Ad'~5 =.3ZAչ*Pk3M}-f o:Ҷ&0\fk{S';j9+E&'qWI}ި({mwb)6ܕ%IB7]bk858ϋCaOq,H !Qkn&v.oLHk29ehκ^P McUeXk@+ Si3 #f$d@ ga/lzÂ/Î~˖taYvgIOI/~N+3V`C6a.^9`M˭lAMvdXKWq|eizi 4LPmR @`\ Y2Q*gG)\ yD+P 4VE$nl%=8&[woO|u6~ji;SauڵMYE/# ]cNMV3õ«w,DXпw wL#iKG YY4V إ!_Boa 5>v}k[ܡb떭Ϊ{GG&?r-ը-ke #Bn D0RHSZpiTa[ݒʥ>:NUz8jYEU3T3[!f+?p98[DK)x6ir~\ɱjW#O:wCOU}B$!1ylQ8#4(t%Bg]" T+D ]"558ZOMCX0|uT:Vz|pb^!KZ%r>M~Aq>8%P03`!܁&W0{:'yLysr{Q-ʠhsC!65@m:HIt,n4[ݳI18LCC` gerf`軌/-j`zd#]U:ňϹ~V*}BS3rǢ9dͬ&Xq+zg[xp YB z`4 €eU2DwXH"Lz+jg#$MNVsc7@*hG kQS]];8}:'=DW1 6#>,ODUg/,V/`V`#yP8? BmbD 3UQ(pǃG{S,6z1~Ne/+x SNKloΖ%]ER JD-z0#Qw_0?s (F_`jNT4q"p' SiAF$ITOh {̣˴ H,>dav7Ip11d'm%QnN9D\N <={AEh xA#[&#EDghUr29,E*(.0rD]S"!ay  QN4c28:fԖU=~O߮yxpYgKNj3>D/eLO\[UHZ_UH!G0iی>r xQ|*PKxEP %jYy>٨WSҔu[@V( lY8vFYqRpQT"{/wgUm4(a H ɮd:LJ:;l#8"Uv#^?UP'{y;\ݖ+V6xtr;T# G/F,FPVNyX"k]8}S@Czh؉]8?m@ /bFD3'P~An˸HJ ‘>!ɇ6g8{v_&oppRmCE~'AcN(*텇Sܛ(OnlW _rx^X&'y.+rc ۜq{(+8K0ɓOQ[  mcl9 sE#Չ .~n+34 qaH=dNgEɘ%7AʳDZw~#䓭˟&m'Dzxa:^nuh:m_F S)HǮ"w5ꩼ%#+[ڷ3IV3`fzB~;TCھoPKek7Ѽ1/y@=C"vazIil2Uי7VsaP5C϶R. XOaq!Nu`Z&ۑH"1PUu!%u+Ji%Oe|rY,UW!@C6u/bOx{ "9v%%Ez%ٙ̃E' [.;3HZ&mʼn͜rl0C$#5OP]fFqr|In PpR8xRkAMRC+mGuӤm@TDALv'23Xz(xՃ2Tx݃oiMՅYm~g>lll*T˂>d,RgeL&E xFe %jWO?~=jk9T~Mn{^4 ibQگE\;<쌘2M0ht)t7Thj **>W3%ЂKY~JD'(KF?FO4zJDhfa0Ӛ҈dX |:*6ʋvVJA^^+զ]|#C,\Ye<-%w9XlBZƶ&dB}p>ܚ(9Uǽ4]=,D)rԞ ^e)Ď* *ZiC]/\dɨ iIJcd?Vt֙NU3!xVklU=Tmy]NN-ۅjJ[fݽn;-T( &4AN#`b4&M4&&ĘGnw`ls999W){ӵJZKOGBtg*2l"d Ayd40w?+K3L=1ADdTL&Nmb`&΄bLỉڒ `P 3r~Htdžw(*=/,@'96쪵#wqE|!YVX9י8'><7qXpKGl?daKSO:kIڶ`h/ކY~f(dԺ-XחԄ((z$JmRZ|!nj5Z&U"b2J0f\Q/$ ׊)T_iO1}B`h 3Lb#\#gJA 7`BKmXn7ţ'kH]Z?x ~ v梦)&;C8a]afPhx]݅7:w YF1HD:JBK'MЊx15ϵuW0)i0ґQLӿ2 r P}rõ#i]gۀ6/MՊr:'.t<]3N$d9\IOB)o?xzs r-@/Y8->;HLK|d6(:3z E{r"^\J_0< 8 -v6 oygfv(RQ .Tr;0_k.ǻ:/pN!s{ڄq&u#@gn7-,+Jkq,)zuma[$۬3ʑ Q-2ޫt:H4ft?I9,*~jYѦ8ZL7)eN#5Pr~3>iMjѵ y?IV<Zi S, BKK,!X$Ȟ@$zXRlʉ5zoFs' Kx> b!g{*_߆$Sphz?.i-_QѤ|NƋT_KJxmB=_biC/Jؽm2;;H@'gQjIiQRAAl` W4)3T%k.T`g߀x gxb4X[D ++ TP(p;|~`G!O1W5gYl 'oNOx[msF,Y.&eJ"(Y-ɷɦ^]lXXfr߾Ow^IJֹ?xy}Տ&BLgK5Tih޿1ѹQEL٩Q?~tD^vfW$(չWEfc#&ƾ# NY8> _6u wzF=305)F)杤ZdiXQrG~dyMFc&&e/&^bS_|=>?: $Jt5n*r3)bXYtԛQl-{ QEhBMԏ^sՏoU`* Mx9ɌdEHs.y,;%Y,}Io><Ē4[ o sd9R(ҽֹ0ZDőEt$n)X/}Y'j唫Ct2P^i:XSx˚k!”F+^;Sʧ.8>zY)O OO Ox$jzxシYV8xE&Sq?JNhSE?HӠ+ZyL6VSsf8bj4tG(c`&trǹ1T$6WO?t;tI!O]+fUѡF<[`9/>U]W ɤ;,X[PVӌM,tDo ]P` ~ R%XH U45.!XceJL b9qhynC 8hcƘR8>}?n^t"G-:.OAFh$~@`α;M ӋBR~5PF `wiiUPHpb =" r}8 l, :ЙUQJ%X5ڙFJA80e<:-6+s0)c|R_6]wCTgtjBJq7)[9 >M r)]Ctp(&!{|Kx=k@op"wwRGC[M8շTKa=ⅇ(0rIxH=F&U1⢼-.E"h{ƭ٧͝ En0PcRbK/_:" ᐴ:$W%5+g@/0/8ȓ/= ɵ!g~6'KyؠԉRJwg-?SjwB{28=UڃU]DHצ>6\2ZM55¾\} e(:(GR In|HÏ: pj1EV0M\re@z1 e.,\Ԇc_V y)v YQ-ef\X R,I(LtxG!<+ D\5㱖YV<*'r,!tHɴWHF'(B88ql(S1&4S9r0&1 ɚMy|[ PqU a>eWlwInӗt; NTNs8^"yL|M,We\*Q1 jNm_M&z7 -w:1K6ЕW.q]*p?~] BpJ_(uuR>Ii.ʝ HNq=fN3^3tfT2P_6[/l~n^A42 !JIN̍ Jk%RB[ bI*jEo(JPHQ@Y eI^G3G7r+H bdCQDrGk4 7<=oAV=AOOAy=:/tKPyϠ`Qf 2tV9rjPsQIE1)3YZe+:14Η2R4$P!z(Ep ]F,)W4q! 8bn@eCfPe&^mUu=r37գt!XDAu1 %_Yj~tɈ ̢j戰9Ƃ(Xs ^0"ͅ!b9YQwVY7nH !7&\r֕_W5xźu`6&fPD?+\0߹xS=Dف *bF C<0XCL"?/}c&H"&,vifM uW0T4|w7r3)x-}wjt;#YԲCf59`+WK2ygf~Dܡ-/j<*~ǰ>6%Z'Ŗ]9K%T2zVU5P5~H˴ԯyr.LG'<]bu+&׼ښqkI7SmX'൦'vx+mSQmͮZ(~}6#(8V[V"*tв+"@G>j~'"}Ӣx?yx~>ގ6$pI, A xoJΰR8\# kX`;22|[ְ& eva/PpMp p]@t?BLXG&X}(Z?("dpe+5k#}-ذFٓ?8^kfcQvn?#4#z i/nc7ڣsg6yMmw rfkd7;z~VtrX}p?a]W5,F3to8*/S:wIz6Mi-6w>7Ћ R.єREZ䈛DLD0K:`ަdžz^.AL&2+l<׎DsG?C.On6J9 q#]r?|b#?9\%6kQǯ~`QЪO5啮. 3<#܃|*ŲːG-X2v6bB0,c95unPovz[\OSN!e[IzU ``cKf>.b+Kmf$8Sa97ǐx @gH9vr$$SRJ3JKsJSl &'+loWq%xeJ1b[Egefj+T,ZT bW%M6:3)I*',\ |7 Ng^0Ew ^cwob<ˮ<ѦcfF[pHS]k*$.PP7NjY R4Ken'nLӄw}  _*E/dzqyv.b+o^NݎQ`nMBƄʟ'K\@4l(ʡYջ ytgBW޺e8qѱkXQ,) m+4+QW9+8\@C34./aa#QAڒM'&13m#H q^_Oh$ضiC?/XHT٭^ٙ|W_f@ YxۭxLiG}rbqBo@cDf&8}\1%- PE9au98+x[#AjB_biC/JXxBIFfBybw̚b)iy AA~&#LXŦs,27's~ddv 4=91'G,?3EzO ;g*+wx;٢fh``fbY_p:6/5"3#u*g{TUQ-eIϊJo^ OűxjvsSSCSݤdݢ"Js-z_c8s&5Fl 廎VH13-9wHث[ܐ WXU40N덍u3suSK+srRj|+zޝ@cĜ-~­ 7͖+UVە9?v^34(#43l ys/~SXXk ֛XYrd A![YGqeǍm d' KOeBi/~*pFU8[Szd.ɵ\ L\zxx,:UtB!_biC/JX+x 3-lxJ0BAp!tB)^JE.ĂrYJ;`NR 7{Os^h{4ߐzRݖus{ݑuR׵YyʬQ9ЙaILIw֎a)lz`34Y0#4w<ɒ{#I È 3I{)kOB |~Ƅ2 +=:Ӿe?PKN ? "k旀hNv+s_4x$7Z_}Ծ%xkmėXP$tsR7}cw :ExuJ0C(xvH-F1>p`t@`FF,de#u-츔YvL7$TpD e-mK.  (2v?29f=mccH EACfըQ<ol2x;V~m_1oyFZ ;#x{+[am6I.NcS\ݼĒ̲T.D7bkgîds)ri|~!xNxSKkQJ'bUւi[ՆfD-fLsxH{s% + nzLk*8p5w{yyYKK@ysdn=l]Z Z]YX/ܮںl\Ed1#&r![Ґ.ςZ W?> ` PC3XR) kUJΣrP4IyX-H6㻣p)^] VlԸ:swSP5W6?x=O2ZFVY\Y_ZSZT>!siw]gɳM=tTyiIfP<-Ӻ.IGYEǑI75mɺ9݉O<|xüyHug/)͗wrzџܹl} x+N-O*HO,N,*3"HbQrF|JjIjr 7#hxmAK0xY."H\z桬s &+mЦ&$S_e?ٹ>_7teg; xXxӊ,ce%UF(+Y9w'0/oIYp9 ǭ4)$ֵƊjߨ %8,gL'84+>šy[)i^Ǻ.Mw<)%-O(:<-Wd}@g6aeA98:{@/8^[BV,ՔQHē'hF@#-M.xs&̢̜󘂘 Cx;$xKxB_biC/JX}r<p@''gAQf^IRAAF6Eq HN,)  64@, MD`HULH0xW[lEU7:՛m&)$8@:i);YﺻS !!?*y <~TR fv:MJ=s;޹3x-CYy6CiU7-sTU&s5I1Ha(ARF*`"4@8'JCihj2S1 =4L,ǰ$鴛=(jA $# ͅ,aN7()dW݀x iПsۜ;aJ ZFx> >Pp?Ź`y"wI+]#o~Ѱe6YŻ0œ?-1J*PT6t χ_\¨n\-Hmq$8A=08mi^$=ՅU;%^)Z_SE'yk">X\/&wBL v2}n Sݺ? Ys!Ffff(qfQqUĀU@qVˎa{WqCzXϞaVI!ƶ6&"1znx 6G:k_Z ȟ5^XY_^ G{ѫWluf$BGM]0(T>IZP2@5 T6Nj6p@JRl[+s MCg;MKJ #cD4Xoy 3ޡ] em k~#tmJpf|"HUizRiĚNbzR+g`ѣ"X;v²D UE<ʲ~u@`?Faj0g2u.cp}15g~4jVq~9V ^bYub8M!T`xɣڢ+Nڎ9ޚ}z[ʇ@T ""Yey-:HiaT #z2 J=l}(f^4c~OYF{+%6 _eG(4aiV5jIV/5a>"fKjV7` JKai' ͯ.]nƂۍiy1eApĭ'hިz{!@ :$K&ͭrbmcj];]B~j_9&w\)'t5Ud212y<'Dd̰JMȃr<>; {HCr `*ѻ;+Eg6/;6šYxĵkAH1oM:99kx{:qB_biC/Jݘ<_P93/94%UA$3G/Ci-p0(DflfQd/)04Әl*jfiLu|J4l*#3D!$hkɓ/IO(>M/cXaf`k`  ![Pϐx gxG92,('q#8(HVaPTM٣kfglDaf&~F_JˁL2H  @}R t.XmN*af&>`Ӌ- (* Bqf?L,)YœrWǧ$$*+&d*$(hsqM(/!: HR7JԣHHMk$y%E%y 3lN0 dlZ~F& kpRSQp p =1" @GcWDz&G`2TxRn@V( P aBDIm**Aj-Hz[{]OC/ x#/&pĉPQZzŞoݙ{V"ЂqPsqagQ"~ΆimWO'YK,g_UZ$iq˯qGG i ` OA >c~E3hmmN,SֵVgb L)g8#gفvC' I*44pvWSQO/Ǖ ;j[整3z2]CWþeRJ< J8v9=W_qQkY^ا+6ƣ!΋b* ?b[`ܠR_aNAj*-EetB"FOS'5xymo~UoI"1ٛ{[Kp3ct>B5$B*" \='YN 1ܽę7{a'k&x340031QK,L/Je{ԦŢùr2*)J,,֫a8u}>_%/E:Mͅ*spswwg{.zx>(3$\.ƔS ge&*tv ve8_}#D/8Y71;5-3'U/1a.=1wZݲ}5U몗7v UOζ`8S̐I[^ߝeٻ(IinjXZWpCFq;z>xjqr~^ZfziЁ G'_sܽ-oN;RzI~op=I:= y9) k߱`!ț{2yXړT[Wprjn.jMW޽yĴ\J. v+X<,.Jf|=T N=3SUT"[Z\R Z̩$U}y>)fX; EMܡײ!iK&0ft=fBceM @!%?3| $/ 7ِK)MIev3,ci {bل5)/|18d\K~a.Qٟ<ZZ\R̠VibLcu?%l3yFI_/KQrxZ^7< \k So100644 CREDITS B7=@RBOAJ2`rಋ-ar%' Mx;*2{dmlʌ/Nnaqu;=Ē̲T8T&qJs)So@|Hp{|HdmRbqfBnbvBrFjrnr~J*(K-JLOUPSë M83v.Ĵɽ;7xϽ{ nqIbIinRizfiFr\sN&xeTˎFU&EEV%,Hmw"m nco,(ʸxP`{_|CH H`wgE{έ{NU߿?9ôB㶀.y/i {@=V Lzg =8AQz f .[ F2mgEGeeMҔOWwɷmfKmFQ)ᠤ3H#Oj=5TJ5b7.>q#Gkإ4X"|0}#{}skO'M-sثEox샲$b4? +C5-h1QGIw"dmd*àvJb m׽Kt%gI?*Zf%XKR˨;Rg)LuͰ\'|= .2x-[~C3 y :3RS,x[ϺuB,ua|"u6Ў ,x[ϺuC5$[Ղ%*)Eov79nc~&F uxUA@&100644 .gitignoreg$5/FIW&  Makefile.amGx3n~*.'h8!zxun0ǥ 4&!.C MdaҺ6LCeEM@ !YV$iGH\8M#<#um~_~?3xq}[ [vM:Ѵ|z~vjMͶ~$,a.*upDJ[V S564̋ilh3в}^׏5"C y]Ӵkll,ʞ~Kt A|[yIiS*^po=L'Zh,1V+Q[90:m <|>g]fOn! `hLPHSTdDdA@_/Y:*o6-Iu$bd6N=>qm\.>q88A}ڷhMGw>{In馱 `}t*(dQ`[@=G嚩uA^ -eOsN?jVN;3 2ȥ[LO瘠x~{=M3h[6o~S,v0U%Rb3LEb?9c5At\i ,'|nI@&EDN ΉP; g^ 耗'P?*A\zjj"Q&R9.pNTx,P'a|r?yŋJ|eZDU7aU}>wu3,c h[ Օ^&Vݝ *%]Xs.e,y͚|_0@WM˶[fk-ǣhcwP\i3jmWGl6L.7{u Xx[Ϻul&׎p}9?Cu-_n8JFݲ U2WxkAI"-Y*6'}mhTQ V$vgP)ғ0X "ѓ8fy#u; Oہ_Amu3M%B`BF>*x#?5Zi´ElATwWrͪnߪ?<ۨ\hё GyaOToSkԑWv& JT šVW@1&`p$=) ʣ^&c~ChfZM;a ӱ y=MfcVM%:VڨCK5k/}MHI鈯_2ek4Ws?7JpumBvmMx20ޙ_ 8' xmQ;KADrA@bE$aQ%ɞYlޝDB",,6)L fc73;{]jWaaMq*" 7Wu;" aZ (cٕt@ܣ8h yBQ]$28lȅU0Gn`ۣx4Ɯ0S:%n"rD#S G aV ĒNl OX,p8I8H Jдp卒Ae[4-yȄlɘ2"ka&m[$iB;STL7]z~ ۿ,iMI1o4q|ߜ~ȿ mqT폼88[i UOxSOA?Ӫ%@P0 Q b2ζ;Y*@UM4o=o'|3-PHMw;}{o^&S3goI#Vދ6ݶ1,cN1gJT2fO3Υ`@jWysؕHi< ;XĞF~ "Ue^)<ߚKuYki i͌w ֑93&eCOp)5])1iytQe7PǞKy7 zps/3d\`lj 0MJiƺA`~S>$4ʬɍG{dS ux[Ϻul&׎p}9?CuPS^%Of{ (uQKr}ćm͉#'&o"J)KLZ%UQ:6nPIm\'\XVI&52d%te}-3zo_w osO/(,%u wBn55j+)Gj0n.b t^οzǴ~Vɾ|($Χ )# ԍI&t =r>!=NYѣu[ Owiz7"x9đ ׷dݩ6w 0b (( ZvpG$8p]$7F"wfL`2VU0.&(%Wˌr=heuZE6 ]=HoyL9{ *NP2I8 `G@Ou_yp,.c$` pԪy8|g! U&1bew*h,`KĤePtdYV|:(Y)QҔ*151&TҰ xLdd ˾qT^>l u+BPOg୼~ay n6~XZF#au0\?9=NbwI1 [4wvjIdz8mͦ)6]j܎jK0*J!CЈ 2qӣ'NLt(t"p+s렰DuPƤ S*GcZD\ A5Ӡ 鄛7{whLpE*^!kWT` I9oF|>'䛭A-+C"geݔ]--FvXO}Iiۨ4I$i׺q;{~tq<{pV+B۲z<1tm5%uǁL ET\'hmtwrDvu ;OstnK8U}dio.,QζuYO*mdv*7]1Ͼ્1T3P;Z40{rr@5M7:kcoba g,\AӲFSyln"ЯMvOcN43GJ#=ϠgV=\p2gxLǭ`8NnRrIo{S^BE!\h1;[fS78eXwVpm mkSxY / g Zo_6kxMJPIAqB:.| w#JKPtfLdSX;-y_Ǖ țZÙ3jkwՏ0us·<ҢĢĒD$^\!(5891'U/9?׎˩(913Ks3s&~ꑚ/*.I+Vj |T̤-j@c3srRSl! ̼ 210JUg楧)ؔ%d9o>nJLrxTMo7=bh VmcJ/EQp#-.}])2cưތMbcB?\wny|Io2 6Qǃz~T]i.h1ZD6׳< bx-'ҞX@%6Ğoy`|P~d.2:0 W(FCpiyҕR}O PY~?OgE+E9⽴2;O݌"6aa'SjgK Gn 7l:&_Lm ((4o_]|JWYg`a*Y d'H |<ܽޒ(w{ Rŷ:yefyŠƕ鯞!4 %۸"IqL--&:>G`WVhqGš\}+2xmn@p"B شJ"!N뱽hogٝki#QDJ cE\A;~}Ŭ-YZZT_Y•3Ee: "3EW+(I-KQHMKќ|L,WYSPZUQ$7%_!/D!4$5V$#X (17hdU6lgɴˏyU޿wAx340031QMNMIKehޤTvǤ պM @!71DH!ʹWNZ]}w=Kj x31ll#Qß|~srZ?O壠nǧt5;l=9g~4Kǐ,gS=нxPYv8e$D7JX*cL]:kװ ^qBj~ drv9~_-Dll0fodS_R-&a-ym~IH Y {:&Ս Uf_d!8dfGbLZ_mS3xc7~>o<Rc(^pt:.E]%00}rz: [ ]hї[Wt\ 8躊TQf)P9FUqOiB[o65>YQ5u``2}_;rtl_eS 'E5*G3fm8H J&g87>lbribstfS/uZ yvp+R4ƳȰ~QZ/P`Ȩ]wԄVx,J7"3$88 $eף*4s~i51{nO/V8sƬpIXr頱X0iX|Pxw^`AIt\9iRJ2UW\u2d: G˝Z=_jjQXXWH?H%@Aᚩһ͙8i*u o<3be k{sA 6V5"֝ Y[ݪ휏bʛLni%޵Vίq?qA9N"aeo7L{t"zb)|uw?LJ=;>!J~IFbOavVMTu #ZHtμ;fE8;{* >p8S9YFr*TL4:sf2L=mG_+:eh?[,^(XEW'uey4E9`0ICOG/1*4]nٻ/GCoT%;ۅUJI&xBKk6&zxO7:Έyurt]pw cPrw9c{Y;}̭&.hӊhUup28X{GuS}|yy~z \77 rB8є'6ߩUKJljp){&~+g~8 ѴEWusp|ʡ0auaR|E }d+e[~p{>jk͸IeST=o=H R>ś6YeSOL] 3'VgL^c&X^}RVJ='׎$w!766w,Z,bSj>7ڲ:u.ԧ"⤭S4Ҫbnw~ۢPU7ꤻ/@U_ zx?Q(kUw,io;ձ\bf7(%>b^&<[:Y!3u>T~_kEgF&lMCSA`X Šla$ME7ccYVZ%~PeȽVr=̫ z͘c/=4F 2q>u6}Vw3pfo;{ErI%LySդ0OKUJ] ͞NwȒew(Q,`_G>~svM'ÿX{1Gu_woSǜ_gvo'yKi퍍_᧖Aj^yMNmVVʧ]F\4 lm;_urC&/S4݇ќ6\RB$U;>!0'NL3Wp/ܮ)>ve)neb ݳ=JS|(R(@.#ptE!, ,N,PX`Ib5p- $rC ~ Cf&.K0](">( *]Y'6OZM=a7kSkK#}$| A?M;;jTu%ұFTF}O??S5R8'M*hUU8f;.wݡf:vq|'pEލԏCИ/1`88 xy:ZGSs2Ҕ=Z!i EPەejHaP-B ZU #K3鮢)>ve)njG鞢)T#ٽfНDS(gX&@0ӄn@9rPd6Ut! wEhQRBWEI9txhBy y.Bمu$(I5#,5@  Rܙ 'P؈*=@k6OEO&3QE(\DB:x{@@jo`H$TuPH^[-`aX_k/v`K;@c%68=v{ý֖kȃﰑu0C]Uf IBy{9 myAvBaʃne4QFb!k#)/T3[NZ@xMj++պ}ɘh7[rxaFTw)]awŒ;;b#(ķ!`3SGlDCS%F!IɁH'F$FB`61Ab$#41.8:r`A-hk>)C ^1 $f2Hpb&&f$f{m@b&L'frib U%3%P󥁞;^PP$r814߁``i3T:XSBҀg"jhKl{43KQ+1{OET֑L+6lCDK@C\O-*Cm_ܚ1!ΒQàk-[㣱itQE >M;O#[G&؈* t>j]ߒo9v}˘O04E{Z*/˾bOWXn^r{9P]nFv'ڝdjwݑ;}UD^4 (C$VSf2ms]'1'؈*=7J8 J-`- +4~W:S nE R| QlKe2QNS7x)-"0#vhﱚ̫-t}r00xkk0ڞ 0<ZB%إ2I vWz.OhU吹:f}󊄴LJ؈* ʛ{+o26F5cgӚAa9 U$<8H8$&"q[ OAP\o Fw Z>:2!5DH+)"nf9$RR&߄@9|6_~IS*vC_h"U4JX o'UI^Jbe"E_ԁ }qiLC!Ô8s(.5I}Um:I jRd.e}T9~'kMEl^:jy(8pǙt(PR%%֓4,7"j_ |%g>$<ܗq9- sHL(g]jl p`'bwOS" }}MBcŒ~%r֨|R:|M"NO&vb#(0paunlIx 'f Bǒ͓840eOP+G nh IP@\㯿0hC%Y_'=>+\rvd{r2C!v4rM %-)`%lJO\YjiIIJx ғn@4p!\q(/2՟n_&w`ñRDabqEW4F;5k[Hh <9TEڮ<ӈڏЏP ?0]G{V)GN`;N]Mhr/_)tFX7œDw}Mzffh)ߘ&߫L}GõtWvVvWsa.&661˳Ky}%Bvuč['vǦWWc/LA~65%"y|denaN&,JuzR~%a7ߢNsU/G[Q|~J鳑O=|ľ3hUū5?j9l<{ Ӯ2˅u7o7,C;1wGhd}՞IS^\P4??[E^S6U]@TYUEks-K%BE_n7UR en/?ɀߧ76P;cE۝q߭#}$dcs fX v>J}Tm+(4m$W#K<5H `Y=yTm1J}DxL> _g?md̩ D9XhO;j-KPWB%Šp1nVP >I}"~K*ϭjc> ,QAp.G*<-[AoR Х6J=펾oL_̩*RU$[؇l6m]Z>x%;r/6]ċCP\8VC@&*>-T%ʂ-b]Th YΕE8&2@&JM"M8jAK7"*US eAb;G,0 NvaQ1qiٙ g{![}OƱآ3f۸U I^Ę!ϥQ Q/uBv3K-H<]LK^(r"'3Tyarse'!Y(E0ۼkIT=B2-e8},zm" +52mS>L 8c/B̎m벭.+QfdX]7;'2-m!Mn$f@~vc ruvCKjf`.ĮJyu&(K6c߃o.fP.;iUw=|^ Pג7\~fQ~f.lZL~օ,EhsgR}!W\0tBʮQߘ Z(fά Kۋ% waG΋30=YAmj:=O']w0u2 X G"6:CG de,O v4'AG}(z%,nybT?N3 Lqe:sd@:x]֧6ٝ4ND\K&qNR!i7lM FD}>v}m>g:o9!5BG'͞Ih'(HƠ՞^[Pmt9xfQHg&. 2Sh2̐g&z.zn: ܤL>9zU!P-lmt0ښ[?3LIDYikBn:-?C ?_; O}1xVoEWÛ&WvhPiS5-=ТlXmqzw!n6=pAPp@KʼnkAHphśٍMR%.X=>7ͼ\{S[5N#-!߾iH?֪gz"W[+ mo{H9AA3 +^8KoC,4X!&hNaYH[u}>ts9nTrCLhưgbZCð.D 8(nB2 JCмMHyXMP.'Ý^vkM31=ղUqz`]./wa<}"Dw}hUM}p9G<=u/ ͂T錪ϩ3ϫ*ve _E:Г]-L'6f,(ޢ2{}zz,r^Pr4l"D"k˺AFژldrKAZqDf9a.v`;A'&s#{cx@r(~Q%0Z#vMh,Ҥ4b&(AJ(C (⒌U<<KK~4aDkwƆF!r8h<)Hѐú8u2 t gzy@Dxx4-6c=7C콩wN RYu!ll M\" ])נzؕmbfA-2Ֆl0f`r$.`3$/CYIМރؓ|߹~ ;fЌNO%Gtf0 sE(Xe[s@txxtp<JOKV_VaDZ)X5֚ABRgT*&z}>քV d ^ 6R8PQ b_cl!B;S#l+dhWYÂ}/!ě(ׄߘ,Mv xWoUOmX"=,ma U@Řݱ3\zA$cFΙmhΙ}˙zT=k3Vu]}ųN{FeV3+Ca1dd(δ&!o"Dd025 hURLf -|[T?B# >3 Z9h5 Y%B5,u|o."87n\Xz.^]ZX!33fHqLD/?E(%Y""#F̄c .$;UC֑XzQ1뮇5d\$cKo/,k3WIpbFQb%#b>#ܠ 7\Q=9Jg {vfyq?}2QnA$m%Dm+ſ=Ń ѫM|N/tR$[9]o-]3?ϏM9|T)Sl6, _Ŏ;_u$Y}Cm1ߵ7h馰s` ԑiс V58zU ?qM3$K0%C0dqy\bq"I`8NO_Ճ;ˏjYvAozV UF*yjL<;Q;_h4NIf$p5fX% ݳy\~^%k d͌r&YZM@b.# .q璭lK7ߣ9đ3fE)-aU1'AGky)tB48Dd=w V蠞2X5H\'HauEmdӂ;Mڣ-3yDy nիfӈ՜qBTwKIp0zwmA>eA@pr8Xri6婓Je|!Xq*nLNlRhK%MC,3穡(|E*|Yɑ,59Rt$=ϑr4 "'[eDNh.>t~8JX i\C5fQ-H92|0ǜlb1g4 o9enX[!Ӈ/k!!02d%(>rbT_Pg@4b&#tǷfqlN.tH zbfím0bEN~c:\#@x?K0ƑޒM:m)Nޠ~ ] I8 8dso$w'}|a!zgzܕt%9XlM PŠRA2p/gfB0(*jx#,D1JI47D)#! lB5$2ǹjGZX"+Z E<~¶VJHBׂ$RJxW0Mvxq{Qo⮥kTwNwwx˝Wnp_ڬO<$h/)m,iJ1V+}JUVjQ*kS] ̙sΜ9?[іOݗtW>׭khq\L۰%J ϧƏV;;}R6[k]03=>s'gׯ[d>`\Ş/ <߭>)5fjnݢez>ɹSf[Ȱ?xA ɍSfdJg`%),'~qjloڢ%9B6'j.9z¦Dp,P zBJ]% 53D HB1իk^[tq;s3\ߙ*ػ>潳p Z!s}{=[yOu*.619zs]2w(j|;-mx.xTOqIF.b@״2][R3FOUxO!3YKi.ѶD"x pAS[X쭝]lb)בjKnex! 6 Lʺi] }=U})1m4^ݾa;6|ݧw:uDR{yV f}68ԑbK{7fGpGuO.e/ 3]Qͦmn'3Cj؟]hYu߼I~mp,$K |KvhBDM0uί,/s7㻺o:K~#敖=Cc('$boU mX_mڻL]<~n{ƳW;:x׸`Қ;|'480,Z)&nz#|89 ӹ\1ǟ_OvS#Ȃ'71Sw\Dz(:7:_rmxpch xǁUmҥ+Y=7>y};{({b?7d 9,'z>-4r Nal6Zfmp^n;st~˫W.\`w z]a CO4af/Ξbوm{>NgDoK_%)kjq_gS;Q4W},DU ![Z-e %q? ׫t0twì( CCщ}r6b84sQ$X@<E3BM4Ft #BWot- 1'BmHbu>QC $]Q7RX8}RZ暎ktVv?VtMݪ<8 oۊ6Bl'DD^p[G$m,@ڞ*^vԯ辒2x`58煩MV۱! .`gS]y,z૬4[&,yjvCnE$'~]c{^DP XFC<PhYf3 :QɓaC#Q @w|-cߔ3*y^rB'ͨ7AlYA:pyN\}8Q,Cu$K#NROeQ/P**ap7%p p | ikniR,( .2"[H("ʙ:4} 2 sC,F[ 1)Zj޳E4iM,g33B8YA^@:˪dop}Lq<\FQKy"C6ATGbA#*B"KaU*tzL@ lk'Qm1f׫ELX®U; ջp=y'"N!-^˲ ﮇ >9.rX8f+!(Uo֬x!΍C7D!^zD5 qRL7Ξ;T Dzr$#qMCvD=RT(>W @$Ey0&@B9bh "ҳuq#(q'Ge{ 6y1~>A^bÄ)`WUW54lΖ'j]E J9Q7Հ_͚EDoRa@5E Yy]U: O/<>&Ǔm2f/N\9YeAy(P)gr7 _*12ԹOXN pAv5}wb WtRw`]H {!;Iv1˞ یT$(`cSbdLcM*)9JM/| 5'~z 6@N OPygV]ahyC[^ܫ4TߧBݛ%&3'{%q8[4=;n}nԅaoxS@.R\GnZPڞ9w=_ɫI窈TD+f80ooWˮS΃ǖ-%<)x9'Ɯ t0 \Sۈ$er4}hviA1A/ŒEC=*r3ޔj[^>'ͪ+^KŞ=iv s3fI'x|vU` EqNׅ-*jm,^^<"gknvнtYv6rI!DKb@ I5Q #]& @<2ƩP=ZY奘8Njދ]5qx>w/pmSEHF.[x}QNT1 D_C_ 7L0 X_ M .H¤1!n\V2_wppfbi{9OUbjηF8m;/%TII*-q/9Δ›eHe2V*DB|\.떕V<iqG+ $ CD:JzJ*< Ku9n`l!,d{Zc|N2H]ȡ,*n%Q#,])њW; vkov7suݱn4cX^ohq:a:>8Dst%9I3F60Wicl018Q%K/1;#s*Ϣ(IN!uٰZ]Gb) ` di1Ff'XAr?xKB _biC/J!/ F x340031QK,L/JeәvQBjeYQƇׅx !|S2sRs*<^|}ӗL+r2Ss *RDO-TySV~tiIFJ ՇL,a0q*"Nj%pe%@*XΘ-?<)hpKH4x䲻oȌ7ݢ Zx;FKDA/=$3=/(aS/ߝM^U.{F '=+ 7+uxՖ'<ū9MM Mu3uRsR *\m,UZg{o)27dU30tMtv+̿Sfk!zcc\ԒĜTdߊwg=sX:1g mᘿrʪ|~2'K|z]7BcIjqI1æ O\\07uQP٩i9z F^ | 4PvOa})hxuJ0"s*x" #v0D7AtxYd]S=  a%EۛL " A:[/٘88MU}ͣљF9,EiZ%K29&q)/P ؘDTL9QXf ~.ș=[{r7/- _9v#? qF[;BqThh5W;j_ݮ}ȟFםL* 0RR.f7 axZa*KVlM~ -syscalls.c(1u]];Gp^]m'o~PV0J$hT.x_S㹺!lg,ƅ1T seN?|u$v7v:py. c.r1u=W7}zPjT i*8}O_.䅣,ZlC({*D6 kࣟXZ|6~>y9SQy;βOw]Qk&2Ksԟr\M:j]LZ~0ꍓJ'GXToI |}XO&q0($%g[%3udoW*~u͒Y]lnY|Y3ӌ8Rh@e//-ɍE_UEN慏'g[_uç/*L[Q.d+,̀}TyޝKNb&s,czfY#9= v zx:IdY-,٘x^"N꾉ZD<}}oJ:5o|d=F-!Z6[i:>VN01dwHS*ȤO y9) =Zsx}&'ⷢ?,'3{(O`S2Tnr֒bɅǥuK_͞^|Ә[ Yx`]ϺA1!כ}]yi~?or\B^n \%SlmTOSNyG ro,hSFCg S;AB!9x[Ϻul&'nvNgQYlO7 bx[ϺuFK:Jtʧ_-vcd!Yx[̸q.sINXФiķoKD0 ex [.OFU83o@7>zx+-(lƳg'< J~Z9 'xuuaiTƯ-=S堦 yxZa*KVlM~ -syscalls.c(1u]];Gp^]m'o~PV0J$hT.x_S㹺!lg,ƅ1T seN?|u$v7v:py. c.r1u=W7}zPjT i*8}O_.䅣,ZlC({*D6 kࣟXZ|6ޙg#&s [|?.]Q:6$kI!h47x[,Z~_}r~JBr~YjQb:]̕kQRRPl_^^W__VRXXZXY3L/$7l2p9F;0 GwW.柼Z|0Mx31 hA ;kl]5d]yr3[}bnk87j-A9)@#^dq?{es>iASZ TzmSxDl4E9ũ@ܖ;yI-XQU%tŅL"7/:u&u~2_MV`|iH s 'ۻ7X4tғ'0WLbzCxSߪŷ%'evl:9_,83?h{3 myS/o]rҼ\–QxTnAJrDbΑsILCA*R BHfnlX^vlYCAB πD#P0{g;ʺo)TE.> h~՗MXD[tp ϸ=G" H,/_n;'ZY0HBjAh,>7 b*SD -TV`FYʣG -*'T>s)pn lȈ+Wش0)_Q(caA rm'ӠpHV{)K4t"P 6+֚Vr $*!d]CM4UG6˞-r &tzxZKjN8>,0f);/[Fcڜ/H8MA x.{wFLT69LtXJNEO ]Mq'HNX|~JaLl#fAM"1FcNV/[^GyzI픎F;GMb* F YjBj0;>n<+m)_]ߨfg7{s%l-ߪ/ ź/_ؼ[nm,-3aیohY`G¥}oXT[G,v ccA]NKr OgyH>=rcooRx;vNm&7Sfmne,|.XxuRo1U*%CbT!D*Z#}XWۗS|+ Xo%(KO}ٿ?~;'p& *A9(*fLIVpr3L@uL9pv{)`yٮ훡j!23 &L^BFp@A]g$ q*8*! ɑZHN(;\ɑv'NwS M&2Iѵ3H"!Ԇ6aZS5w)SڀFA70 Ӌ^p󳀼(vYc;܊mJ0ala6cR~X4&q} ~^@BZ'{K"V?u{UzVwUi, Gw7y &I0~mhd=xV>=v:P}ݿh)ԒO04è^'x+-(bzO9ȧ,>F 4wxZsG/ /ڎmL;.*b)w"$Z׳A \puq*.$@Qp?8(W1l߯u{{V>ɩOg~ˇ g_~t! BsɇÕ }vF1~+rˌf ?\92ht}}gI$W+MNA H4$GV#849W!x~a\I9ƾz1##$ 2;]_ :|mu;KVooVw֮V߅ڸriTԗfݎ%Dkgxn^4c!EʙOìEwc +ʒtN=9Ǿ7 i:' q:z?z A#.~n"gP}>2.j?/25{|~1ףѠ>{fLlaVihV\v.ڀ)T_g܆ Ñ&Xq0LurLzwvy& }I %ANxGoNl.Vwx0(qKp@͚v/ߊipL"ph[IA[.Tc3Q!AҀDcۈF UĹ`uˆezq) ݀RW〒u {3 &Mm)9!5M/3zVgb%]^ MM<ȌfcRTvLa):iD8(4.9vW7vb0l+:&d3"VH,a0}=+ 8::%P؍,BXtP4{OI 0hRp4Ɉ:Vkǁqq:? 1zh8Q6Nz"d<6!NlGo!*i0?n̎>aUO>p|P0n(ɴP /dR\X jD‘:"y4ORM 0Ϋ3}L]ioL$GLV` %RN$ jh|^]Y06QHP[tXdlx򜯓Vhơ-V#so'yoS'ix> ۇ)2cA7xO"Fp-se}!WbXjd֡ю ΕG lx7%g)%^6,~/Is>,-,*h7մmا-?r79+?TSȚmxGoznD?,k=4p-@?Oܧ4Z8luh;ǢW÷H,|sSJ)q}SE'쵐l'kɁ|wڳj9ԁ;e .c/{_%}dB@›vd&aIYScᅝ{޲&RHZi[십ڽ>bHYZvy%mW֢.k4,4Ek<2ߴ by/"[,LD#F"QrWG%ެ*MU?~Ɂ]mA`qYf6,SKҠk ;Әѯ )Q?`ǧf$jMLaho`FҵWNO n5TEi{uF}BSsB{W|>-/ z.V R98^=ׂ9w⚬%+ ٙms" ?IoZ[ :"U&4j(Ґ;u$υ]Y*E{\ڨpXבlp*%{, V(/Az( wB!LXm嘏kI5>}`w/^;YaQwϡ'} ܝݰ‡ [ͬ:RQcX&!3 1[ _ kU]^W+kH(ٴP*eU4V,ώ,8:}e!εt*ՐS3 hQh!u\ :4C.MDq6ϲ8S#P0̍Air2r,ј4hlz$A5Ӓ?9©NDtyr`uXxSCÙGyTKA"1[#[* @$ -ݵ1u$}[ڢSK]TCG"ɱFӾF%opJœM?һ`kw}$[Pp~x]M믑ApkIE2y4$X=BiWmxr5NkTQ`hc*XyŰewךPSA{@q"zA},<<*;7aUk՜.5l}j.wmZIꮗV2K<ړ? j:{ny^SBMX#FτjлNx `JT{CPE"!Xjj]0#E[e{Q0 .`k Ιƕ`Ƃv&<#w}G/1Px;5wC-3>dCK ųS+srt B :\ J`TT5 %E%%`Hs&-6J33eBŌ7Ȝ`M,(K6RRH+K.ϛl8PR,1(9$8xiE%:)˕$&FZsr^Px{)wC-3nQ:xq)# KZ.jT%#KFˁ|@c2RB`x:q| KX-7dVNOO]LTSVZA$V:9P]L U"($^d),)e'1[mfd/(/,I oѮSbM,(K gRRH+K.ϛ,8y3VbQn|qeq2Љ@K&9ɨ!$&FZsrN &x;?q Y-&|2Gvje|bNNdC~1c3MZ.jLZQdEG1Ac3STfɎ,ⓗ`MML)3{I fW'4(d'Fz,\\~H x0L Ә-7fvWNOO,(,&ldPYTI+J(!&ald*[P_<9]x )eF c 7OUQP^Y 4,@=7 3/}a/o8[[KAK!4/$3?o'xO^Ȩ65W-@u= @x;7måV\7qrf{&vdTY $֚ ]?yx;!uC'3>fCĜd%BgX$(5U HEInAQ~Ijr 2(\i~NP9Pdi0Ĕ2#d1WE%P%Ys 2'7 uxJK2&:N,!UP_\Y D<ФĒO dԐKrR Kbj+3`uMx$uC'3nQX#k-6_S 5xz$mC3|RĜd%BgX$(5U HEInAQ~Ijr 2(\i~NP9Pd0Ĕ2#dkWE%P2R칉y y:<\ Z iy%y:Nd*(H63/,Nz#hVQbd3#'FE8 KbjfAYLx;#mC3nQFJ{-6 RB /2xOUIRYwjW0ƭdg R dy e@ ы=zAGg~}BgѴ޼AZg`KKlV@ZHl(+KԵ,]= x mٹVCh":N=!0lTN#u D.>$Z_U4056] Kga~w}hhtnJON?EFF$4F(|>|D$?<,]|+#$[Ҟ @x <6<}4zP>WL=upnrI Qȸ:76^D5zP#dt4{.> @'wx0>V懥PZ6򦏠a{n\ x%ʖ  wbO6 ,Ȕ=h,IvG>L Hx@$2$7$p+>BB8"+dm1NA^>9G`4rH{o2؂|2gv9Xp$Esxy _P=\Ă 2hO7U΂J]+GbN`SO0 J~94 M-),8I .x0Nk Nof"u)N(8܄hzfjX1\|s藛̃8*'#,C∙r ,C$=9ļ{EN7q`d$e7aƱ""6XXy=tFS|ILoJm +Y_x Jm=p<*xek@IR]qZZbpQa&Izi6]lR+YxN (Ӝ)ՃIOI3Nv!oy;oG/v^^Y0Mo~_ y^͍uDU⫡_ϪIUEi0g8p7p)5ntdoWeDśR> n%GRT[knzXn}> ڠ{biKhNV;^cIPÃ6ѳQa'J)gZpS/7ƹʕO3RB(#[|)k= ?\ ]qPv.#`y$EҮA}<{bG$x,1eB²+$zvxFmթʙFlZӣ,׸Nq6~BOyeX=V%zfE8߇sݖBx;drdC53{qIbIfjf.V8c 2 )x;mXuĜɂ\ :\ J  Q%&R16NnT\551hfQ9E%P1+4s 2'_U}txJK2&8N.b֪06/,N3hTQb>NjXsrތAu8xOh#UIR;n ݵulkmc%,Zp,meL^C͛E<zYy^D EIX'/E^&7IK>͛\vhjې~; E๯r֨M}:2`ft S``ޮ}W Z5v}< lԣǫiF~J@\ߍȹ$nc Fu$p홌k%x>q ;y|Vv0z-r?WYġ6ٹ5ƭ]]>m.Db8gKfS!^Bz  \l9@\4JE&5+IWOM~ڸxQdS>lZgG 赿57zڧ Z@7ıPҎF@ &m=z7Bctv6L44=3n#͇͡:ݛe(KYn0`ۜyo̒TIRs 2'O0p)h)%dM7v\,19X|r# ̢Zsrq<xWoEW$n"B ~% jݴ1i%n*B8^uwMR*NzF Tqzffw)H\3kbj~WٳUT\ף}`]r{oO&OYaLJN Fut ?w~rV+,={դ%ˡ>[޺J> -5P-)~Ռ0JU3@Oz_U_tvN[%ijUjH&"%FԄe \xܕ LgsSԎ̰c3<P5mpe!_@ .S0=6EcZf;(q/s~.jv"x֣v=<( lݨU^%$@2 w*+'CC`>z~9:w!HH;#--kPaON}VY\6~Dv+Bm58tmŇn﫰ž=΂]Whs}o/DlN oĿG{Iƃh <@ nIWT`#1p" n[&_f.uTrLq+7rdߴL,J8HŅto;XL=ozv>d`-+l|/k yo=Č8uμ6yqm"8B1>Q'@s_Ts[_w,@۾۶QߵS^Ma+)7xp꧎dl;һAVQ?>Wۤ;m9LdB l̪_v ao}VXT?IR\:įH#kAFgX>q܀KJ50~SzX#}U)6Yŏxp {!8FC099p)wi aֶɦY+m:GЇBIpeԌx*q'VY :^0Tgc}t 9F2Xũcjt˖|P )Ϗ3XPNC,q;'i:iZ3pLKOfYLc; B4YNpjȠ@dxlHZ8N{>heb8mAp)\G 0j6ZǁdFʰ/Ow|[b3DD=*Fhފlmr#TB kpaGs0C*pk(x ;;FrRr%n,åm2GcS[4Z1ۊԄtZ . %_ݸYXӖlգp*9t+h(1 V^և-C0K vCr@ǣjFUQIr&W)̋J?l]hМ jD]){S;6H,"¶zASɩ^FÎ:<5FY@HX"-I1dZ-(TRk1PdЉBw 43Ábm{Bq'N~U(!tj 9Bbɣ4N'N#]xZ]lW]z7iO];޵In`N&Lfwglgf8URm/Bn<\rU˲ן~,ƆMժd5n|jGkk)t}rg?y=\O}Xoo}\=7X͟%׮]V*(jMW캡),c+$|LeXFbPadB/T;% Nd;85Cw[јaY5Vm^M%5%5S5[;ej]&4A@_IQ l>h0c Q8LJ|MӇnF[Wv%ʺ\ 3MKك{ru:;[>ulポ=˙N_/s(|yvPoPe͉N\z#=ef)9<)1pwV+ȝu>rO-@ؚR9&M44عD;^/dr;1$>~t:OQu1vS7י\ \"~fJ/?ѳPUBTBh6U&uD#ʲBIrZ*pІ124 Ju2g4BX*Z&|6ta[@' kXU *fSԚNl7to-Qժ&}ȢXP(M&Z-|8ud>ؼI,BH3˪nm}?<5QU7YAc C'ͫazq( /|fxG:Ynnc3 x#m]e@j=~uzi5[sY7uWW  ~>~OaJ+% 1< T`6% I6.0?@h&<;8HYdkCEh:>8kb48/ "GbC>L/Ǻy;+)١"W4nAZ09[q׋7q\A}w8`&##(rŸ U$ m04r?yZ_k?ɆR0@`̚2w4k96ɿО򼲺en>Y^>1ȟ8o;fźRjj%Q(uX.?:ui :_l37|~iu2Y`٤.MJԃ+^t1%4Nie G;_t\x=wϰn.3]4 skm\@BLs5_X8H[E˲f׫ Q0SiHEuA`Zw-ZߌTЬZQ`НV5(HZ Vd*@])Oİ =*FK"EV,` T՚bjZI1X_wPA3oϛ=>,,kTUuCcFR+`X&9=Xɏي.<˟]jcҳѥ{yuhSRztQ:lC3 B l۷o[j^'5jwҥ I@auiviUZX!5nΠ(ye8k ԃ7ٺfjJL7ECB!]jlwё͞.VTݔD)7*cK`ğz <}1q'8iRw0 M |,Wꮱ)V\FO厽VEjѿԶ_; ;"G"W G(|R|uF{+lݲu*}`/3UX <\S:񊾎HoCB.H <% }+ {Nح?j\#u#Czhk]TDՌ`EH=;Ap:љ2 ) B> [.#b_/=bUC&!7HW(DJ )EylX '2$!:"JRthD*lhC*(-2 2YǪ=SӊzY/zAu,8hR"@eoOHKT#U.}4Cfv ˰ V就dy8(`@ChyaX uܝlT+re b{[X "l ǍU|,STGbͧWz6]i18$BzNoOО'7ėޕ0&٬r2>PP(mzhDR:üRy2 zZcP7*+9|Sjr Q.NMLI(6쎩g(RY$Uaai #_! lVukF͜Ana"hiޠ KׂlAK>79971Oat4 բ]951YMW74"5=+O<:I U+# pHƞd LNO|]bd Y wi0pg;t[Z>Y Q dFƽ/>w ҒV2Xj'"󋜳s|_9{F$|Fso>oK#C j䵫t˳" @2‡o>KִtM !ؚ)BV 7cxo?noMe3Z!u`UI $Zbt֎k}>4zlkr]CN`oyƥNM0ߛ8d%'@'n -sL L2[zxkd2E5Gl4yDpjhYDpPm+k8ng=["wK, [[2Oω$%Q‹2yv&%O=!l0uDr$y+TbN28D&HH~BWz_:B Kpgz-c;g.FhfR២Mż҉sE0,9%!f-V{7ޟefyLw1MX^b_> ͱ&L雮/X o䑊=D=g`XQve䨘<(O˫a)405׮AU($ļDtsCO_^CbJ \U_t:"GqxJ v+ҧ $F񏉃D{%iYQʮB7W[k]4_ȣmd*"%^+iQZiy~>?Aiovݝh7wu -PGWzq%O>43{^ohoNz?F|sWM%e*Yl_aob ڶ`HVΰRɩ) ǔZHsl6M~bu.>>L*7(ufOPS6ijN4+_T lhXl%mjUB`bSHShF2¢JXJ*;rlohvɃk0&2+E҈`8pOP՜B 3$e {Y+T'7~j^3o!qjbyr]{ęs;Kj{GahJk¼ &t~%ZM߇Fs v޵&YୁܹtZ1%əHq܃/.2U-gE=7!X+zkDvArOOXaZ$"Gyk;Cm4)IRA*Wpܹ4igZ`"9绹'o-dGK%+\`s ;.He ಃjaPM)jSB_7zȰ!hȱBf1NٓA4%4уv JHA-Ae+?N8rloGB z9?)[2^ /z'uG (N% {Ezms]87^0LF`({w&3c}3U 7fo * ~qGww0,玭c0ԹdKxIkܛlEߚWno` Z/H"P0x[#'=!/4ǡHn\\Y<قYYP_K?J$#X~%{{_"]iX+9yKB9S)E9eE l[ƶ@Ov]'xK~.LGcSYA-zS0t3su3& b9'!ׇz1a!S8!5O=R@YW449˻Vd=~ͻsDlxjήw*5l-Xol ԒĜTdߊwg=sX:1g mhtcf˕*ʜ ;/"43l ys/~SXXk N\JBX˸1s2Kp=v2mܻ֔v櫋l1KMO,,KK͉_~϶7dٶ]"aAECAe=M[-WsEg?Mفk%; 4ڇN9G}2;L$Qg$uY2ZqN]')SA `jx_\xfߕ7rh>޷%ﹺ mد=N L9zPZXpxļ2\GwxB &pqX>᷇߼mͳ 3U~gAK=q{N {]fF hR,ZA\vbpe̬s?]U2^-@ÂRW2|(iq_$vޝ \S= KkZ uۏT[;{n-lN`, 曘`?C`=7"+ .73/8[!7oƾvoi7av^ËRӁnqf~\Rgղ#ޮMg퓟 y46ZR2K0e=;n_ =xhxhCnRbqfnbAf|NjYj^2<<>d ~{td=B 38LٿBwpPaM231QMNMIKe/h:'kcW4ƸoWg@8:xmQj1Aԇy% Tiu=͐G Mҝu<1zӴd?9?>=7qwq$CF\@g~n(d,T~QKj^lR R0'h}ݔ JVI Ua6ҍ-) <͞ &lB>x]kP/&c dmguus!+5bMKS]mXsҗ + rKylNSBDgA@N@Ye~OE>x )kY{FI_Cb48Wj,ZαSHL0on;u}SoXvSֲԘoX]rVJC&tCd ʛ8_U >GeC x6c5DS _vd;f݄Ҽ̼ĂLk..N `P[ŧhhZsqf)hdm 589RKJt A45Nv3&pE[TӍC8\\AzV xuώ@Ь$4Lf=H2,{ B+TjڮdRa `<ݛMxwgf~'LjYc1`=Q gd¨!G \tF`F|?y5,MU_q) y%GAP1ݶwD}xy5Y縮xb,NӤmX[ֆV྽T1<Z@e/;w4m H5m-HQ%"]:2zx3`-vI7` tP?Xi!?Nk;IQ8z~e5LhѳT.()p_S?x[rUeBv1.NcKݤdĂԲԜ gr3x8`^xT]oDUPb#RHrL|5fۭ*R&Zx{lfݲ?BOH < x7$^xܱQVKgs9gOϽ{ѿ v67Wz$FH-vn٪ww[]ji%凗1"tq1!\ zdDy\2.I[zQ㴝ZVU{sH7&WFpgǩ_0 8z tE Rzbȝ{c䇍{Ss#ԂAΐPTRl,QsTCc8ܣ+.D]9j^AmsfTIzV#!AkZsTbM=Hubb} |ܺ4Q,Ҧ3xJ\XU\=Rd&YQNS&l4վ:|ב7We!a?GX=dX6﷧'/g/oJS<@hX/ C-`kOx/ʄ@ic'0ķj/_ONUfjP-_׆y;5LW8 4xüyiug/)͗wrzџܹlf&& Iiz el:?idǮ"yk?oL.C/TcqrnAZ-H•k!Sq "MU2bLߟP݀DZР@9g2K~sA$t9AOamP\'_8'e]w82uv2: 9M^y"UՎ?zy|'% NFk<~.L@ D7)؂AiL740WF\`y DWgy&rdY\@ UD U-l:+ |?G왘W !40Q0 I%'rpGDpY灕H<+ w*qs3 6Osn~ÏO*4/l jo?Fq0L3G1$>6~y}N qL|\ͳWU$S)"*ljWja×#LzHi h.snvʻHt"R^ŭ'.4p)8=`Fme ³++܆h|xP6S1&7@Lkw嘸߱\jfcxde$2uA5CdDjMJ[rݡ}v@*)TEUww+E: a-4VZxZOaur?k50=?Cx{iB_biC/Jݘ<_P93/94%UA$3G/Ci-p0(DflfQd/)04Әl*jfiLu|J4l*#3D!$hkɓ/IO(>M/cXaf`k`  ![Pϐx gxG92,('q#8(HVaPTM٣kfglDaf&~F_JˁL2H (8A tjAAfU68l.XmN*af&>`Ӌ- (* Bqf?L,)YœrWǧ$$*+&d*$(hsqM(/R: HR7JԣHHMk$y%E%y 3lN0 dlZ~F& kpf SQp p =1" @GcWDz&m+x:]$ |3ʳ.-H#6yU2&#wo@Jx[ϺuC4ȅ K ?)߭Qt"֡|& Φ+x340031QK,L/Jes~en{!TUnbfNnbCzVu[K.}QԔ%eU0 Ji۶'k=W Pe~> ɳ}J1ޜ}3šZ" OO?w3jDfn9=dCY7LigH0ly=U^:ގ .LUpʿx~+Fb_(_9qTobvjZfN^b.Ccօۏ<䏩tuPeA. q_ ՏO)!egΓ|\]]A_p\pANd}MMKKS3.W~/Ҩ\"nGOALKL/-:0S;rΝyvBJ~2\mu" Sn^K)MIe`}̳.lLU[jONfRqjrr~n^A^f-W쫹}?X7]y]rM*&ح`t;CtD(a g# D$دjf;~}\T>??af{nZ.ݶ4+FPY:Df {xƺuBöt.|vg~Wibms_ ׼{ LL\]|]rSΧ?Yƞ^5>!&C;|\]]AU71<+ƪWbgoFFg=S{e M @!%?ave$stm{0D63/94%ṷw+o*׵;)8΁?: 975{NG3֒bEF[%4:icظ*Spdµ&0j0z7xƺuC XϖcvM|(3Lh"crz=%)CFHx ~j{ O+UBHND#.x:!Y_`Ⱥ0>Iy:Is040031QppswwgX}t)'K6.ȣo4+'|aMP/'>19*-x0omѯS5&0h=toߧ 0X[9Rm"}O#*#?f%甦2\zs0>g ~ƹ"b{C92o?h-I-.)fn."y鈏r9 rb5n.[纛h!uu}n.xYH@י 99gS4U >]\[40000 testsp,7u_2'vh 0& bx; |@xB9yf'ykBፍM&,-cL,SD!%I/OI{[ {2CuW%3E?mr#"3-EUpy%>}u_Yka'R_x``$rS\דE"DM`R xxh??A({͉C5WR0à100755 13-basic-attrs.pyKWC߸9'>?oM^s?$!xeWN-%x```$ҥsN)EYYL`r, _x; |@xC [EjN{͜WRnr8 x340031QK,L/JeәvQBjeYQƇׅx !|S2sRsL6at"!7Y xUT[WP°L(?9?\.`1T%\YeK[ƷOW㮼dj[Ͷ5;MMJJAX$şl}H-l2 P,9x;xqB޹_ߪ_N?%%t:GO[y*N x!gL ɕ%yV 9y饉9e9 %E0es+sO|pDy4;Z\,gx+-(r͟|j:$6 nx;μyCsp1T5x; |@xBY.3n22 +W''%38~g=Wz_t쌆g LL\/ДybO<3%} c-K-W0;A#4e}> -~:'+0,Moޡ- \Le"/-4MU l'2gm(qe, RO˜)gmwLлqx(W_n+nfVetV܆f&& EƖ@yֱz#!)jFMfdI\~-gstn|4YU֦zߟ3E+ݼ}6! kܡf19{^2SGYidK6io]~6x%{ZjǓ3E]FGߟZ׭ThęVel(g# t3_VqXȾ(RZ'dy结n4Ux#D!%I/2HeΦGj9]ʧ'cH:t6?fd[_._Nm`_i~ⷙJAc$5/j9omY簘i) [-Z #HBS~xUszC(obrIf~^|YbNf'Әgrf{vqTw>鸣'U( 5xo 7 8stKJrSrRl Rsr7_|N9'>8i:q. gn^eO(3Hf#WxGs쑵5M$9EW< x{"9vy%ii) eM>\lx;5Uk+>F̼ĜRQ|DTӚk<[7 `xQ[Ŵ td-.a ,e_ \JFh-/Gzು!v5 /KSᓖ y# axAQwƪ]\üGNMcԘhlӽU/?/cm PHOfy)#v8I|']Eqb!y9) JرpS[SrfNg 6$bZEw{W( ZZ\RpS\דE"DMƤ_Ox31ҍG8Y Xl>dϱsP$ff[-a9ÕrtY;0)SS"=ي5+:j_G 5_ٯX: D@m3vc"S{Q@DIGaYo.] 0wTcsiq S l!:#VrWGPTZ^̿?F`,hfh~ˎj؍K\/J!< po3ψ@iR crTLnDgt;eVVj^R-_h}PdZ܅P WIHWq ,Ғ'c[H0;PMcJP4+r2%b2EܜWϓ^ xV]$ |3ʓ.(UhMa=Ѓu Drv@ߢ)ex``ݰLX$cԛwuƉ71̼ҔT?gXr8e)9Ls'?d 6I-g?{/w@:V%% 7y=]$"O4>?Q &0x; |@xNop^ʾ'?]ہ== t *x; |@xB9yf'ykBፍM&l&Vfv sjx}ͯɆf&& )Iz pEMx2HKn6e8dVaUl-rm; $5W/Kp_4.tF0)qNVA<%x:/59G9c\./{Mkff6ЕȽ x Hx```$w.k} &]=g ux!~ϋanqx{yo 76gߝ@.ux``$ҘiR)bN?ۮ Mx;g~vSuf]t>|)x÷3fOTGXD\}|'{ ss, G8x[?!6v`gd6Z :/x``ݰ,beOGpZ%(d%甦2+ 2HUiGlN1DIɱW|m%% 7};2QXg;qra59yx8qBN.-GݯX޺~ x31yY-`ӄtm2wn=N&7T+q x340031QK,L/JeәvQBjeYQƇׅx !|S2sRsL6at"!7Y xUT[WP 4Y+jGm>yCU•UV0+J];YXḳ^ Tfnj TVR R")(d˿EO,h9`]ntL!x4CyC+䋬"\>>׳n F :x ~Z| @>9Q^xMv.f_O@`xN??A)2Tyw@3~CTY100755 13-basic-attrs.py~yp\%S:gVXzx[/FtfFWN6`]*89?\GPӚ33MA(YVA??$84 @3=$_!&58Uar#BdɅv[!7x```$i&y,j TxƺuC.5'be"Xu ],-hњ .xƠem6` },xƺuCs<67rQb7~4&ܝ bxƺuB,ua|"u6Qdk]ֽo&?gd~6Kӂ݋>Ʌv1R11b-A/N>.H|~~N1ô/2+Sҫa7=xNgiT}M}"S.Ucp n~U)cO֛Bf^rNiJ*Õ&+.yiENMlغTINNZZ\R̠UUZu("ͧ6TE: MƤw95xX+- 'UJH~4YĴn7Mk.YG40000 testsم N. G"NJ7? R&}gxƠem6` },xƺuCڲnu v kd6f6naf240)EӘؠWZ/='ưOYwa,ńXr=;pɤwfJ @|@$F7W_TjCX}l{VH~(tn a (IwI-&;y+/y\,^c*JĤVJŐ}# 92'K?^%fl3=/:vTB5G#I!b,CЀ!ǜЙ{ͽQ%-1xJys\Wbtpz0 ĤSCI ~!둵Zv/o:eYg?`t3X'-׿Wͅ Z I}8(4Mk'7Wn9"뽧\r:tS] F,޶J[U_ZhЇ/JHF? HMqӷ}RO6`kV4Nbn( 5;}6F55p̽Wg"1b|z(Э;TkrF?i$S<򆃔d v+2ĐzNb_+y$6)-Gzn۞}37:jB`Zi%TյdaxqQr 8鎸 GRc1ݢyo+w.n F%Kfo;Kg)> jPfidҖj.}.ȁ ޭ8cŔE.{-(#l͟LYC7|dbk=(tUfszO~%y/HׅRzcJo7Ud&%o;̊oכX%',|$lYKCże,+`)ZTWj{mYj1b4%% N!%n-;皽@=_Դ̜T\QL)=OwdExԊo\&Ny/=0Y]ax;==`JCdw[vʍUt}B^6 7LCT'hJxDL&xIGNB|l}}IxmQJ0Aa} Tݦnh6XӞ9G1 /?}֐.&@ i23ϟپ\bvEbk{#CYg[ yIH[ 1SsjQZ #bôzPeaE&,eP՜iꭑ)czL?!VXvR'H~AonXGPYj}u}(r.U87+~x~}fEc\D".ݜ̲T& -x>cEfS\̼T QZebɉ/(ON-.21,KE-Gxʱc(nqfQR|bQz1Vt{xuMo0ǥ4*qp@H$]Wr $:f5KJuThʑH;7NGqy-?_]Tv_7`h PQisfYX=PtZ'r\7ԍ=E)]SƛHQHM8֎zGhfuꁂ]y$R琑h`O:&cOȥJte}z#2wF/[.K"anh$̍ё|z6@/Kj1`^k-ǣ謶f6075 N6QtQ8f#Cx[Gc?B=xn6u xۣTs3nNAIFQjbf+fVV}.N3\̜bnNfY*f{,F84T'V g@dx{\kCB nqfQR|bQr,3xb*ȬWxƺuC ?k!Yt0AKd4&4 -xƺuCH̟{1E[+=Yzr XPx; |@xH([痈/$<Flx[lWULį$7' qv&iy;^o$ iRk2;{;jf֏46RU*HmI-M J$D>@J !BpxYe~_V+П!4-՟Է 5_08cpV`e5LDl-. :l;ä!af6s`bkRb/ QlMNM.gX%#y<,=K/HhfNMLVӕ oHMmNCU=ʷ~y/'d:>;Sg!/. CpDiud҅,h;4l8xv멭^-,(2#DܻOiI+P,5JktE9w ͜LS=~#^>x77U!5GSUVV b7 %kZ:ئ`YVlM!+ѱ^۷ ˲VL-:?$Ep- 1:_m5}{St Ci59.!'K<`'{Mɀc zQE79&&ʭ x=<5i2d좚#6@G/6_z],eIE[.ϊ{o)4Jت6C@6r_XwD{kI'_1.V^:<[m< v-ȗ2b'ZO;W`pt3%K{??~%xƺuCRm.(v㉇_L @$d۟5,tR:%2yNx; |@x3HdKm^?)\"LfqZ .xd5C+Vo@>͑oC^''&cź$hg DlG?.q@lELhq%Tbig2c"ѵ s?%?F3[H )v ~':(5.1rr3B Ђi  PoԬ .Zl@;#TzIכk,Jm +3&=HY>1RlPx#"9eA<7heYhgEs[[ߕsFu,2a:jw,`S;ya_DĢqrx; |@x3-ރy+'8X!,C+$ Z.x pɳD_ê Px<[lu,%IzeHYZ>dɎe%QH=([qfwgɉvgV3)KE$@6q\(j4AAH"E[MmiQH91wfgIqh X:Ϲη߿߻#[fXg=rY@6z`7-vW7u 6#X Y <2 VY~Xf90*X^2^XU۱'ӗ33SLf|q\p>Х8;sbJpKS3ӗLl]q&-Z]-^4uj` 3N\&3&Ki䕙gZ'0f,IhsLyǪn'05s/[ =\ oX_,dٱ1luЮdo,14݁3=nhoK0Ws2XFʹmg09:de\v5NTm:Q>12-0x(n(`b-*];;

Mִ7@ipk=ݲx2\ \,2"0c _uPٙ+!U=m^mP@|GKU%"/mq|%s-(I 9 tREL3JosK[`K]l~ٍ;Gw ?*qJ6Hm*(l_=ԖhC9ٻdM?2Y=hІ뇡3Vvva1DZֿ6=nڲ+C4!skYf.v3rvVH3J &ؠ .:زm+i7+l/9mhddj rȡ|0{3LFs4= M,!92$a{F~pD[ª-oo4\0&XO_HV`L3 4I+eh; |a0 J6 ]v}Kc,Ň# Pjʺ΢Xʾ +@!Uv7 Z 7*m_ &# F@BG+*j$>r^<q"a 7o|ls)?&a1##6{iؙy+XGmٚvi'ӵ-̰eK1!׵87m$\>Yx؎ ='\D}v&׷GD6W\pƕf2l!GE VR-d;~֐h+9 %i]HRZw:ܖ #TvdU[fΪ-'s$ f-FGYRǜ)`Qvmce;{ *_a5'"Eҗ|A*yc>|y,/l߄z#X?;@BڭB*:\j&Nj/v>.m>NB@~'qS0~*kl͎v,MY2ݧG_]l.s;If?e6`m=IkQV"9.(80W|e{ˏyZ}2r>4x'O^ĶaBQ- Qk{%=4WEuː Qp[:2HG3mYndWf =ѵ!c #53sT{I H%:h|kEއFda &(pjsNrY6.҈Wm8pJ w7"UHɴk \O(yu3u3$],1!G5](n5^`zaw"zl1יjM,23;75۪un#f_ϖ%2FGG`9J(W8J ̻FŽPPV6QzazaOz>qBLO^?G< M~ |z, \g: Yi~"~pr8Bi5aIRL$R6)ߺ!X%o8B'buŠX?x3.Hh* aU,mTtUI_q")MH:#)1T|ykIA?eŞP HiV_XT56  K I"0:tڀ䈈Zi5U..YA^7vbq^2s.H[]8{ZEȁD/* MM"buOCIb'䮟zPhk\?Qwm𳦾iGLIaGK`F.`#|kwGm0@ߺ303csY{c~qӰ[syDWwuMN$o2-`vXxwgu6/ƻbx\U IvᚴP1O7jU_]rX#&Wt=RBGa_,OЀ^P/_[%_Y$I /f"fڻ39…7{V7\DDV]x}Dx"VghE$cYܗ6Ef^mɨtpE?%Xי϶ *:vx\J\tFlyUxOJ }[`*."().LaanٲxEor|ك}kOaa=:w{8Uʯ33>7{rvv.!6?QyZ06P&S%,){f` /:E+|"}5~NXۥU`At*4G$~k|NEXy$Ul +\ x v=/4)0qQ-9@1 LP؈-ѭ)&j d tvo"0Kc KpxeL( (+U Ղ)+`<idw7M4LۤYa߿)-L$Ffd&%ŃfW{668}D+-5=u{cW ՟;jEw/K#&0^U=}.PDw 9>&f_{WoW|C`C;~+51eP/I&6vВ"zʂ>R%mxx 6i8QԱ QiP+ܼ2V+af`%԰`/d[??o L̫XӰ; (\JOָCTmIaOAh@Jat$7+ksΫ*|b*S*go9C?uGq~CR3Bqe jEOkЁb?.<ˬgپk'ا/le7 wg6׬Y,` {br!64}{νYԳaTaE%8WUQ&Vgɍkij0t~cJUɷf(I8nԓz[s=!ueQOcjpOsݟ5:\d|z6[ep#g=stE3!jَ"˞Lv1q _#]6ֿ}xxFٗǻH0zME|7Ꮟ=ٳ!F?—G#=S:U$ͱ`/jX6fֱ  wd.ޞ{|0vn;4":.^y<=p~&wҀ%U /ӚҬXUslcׇ#HB!%27\{˙ T҆N9<۷-:Dxf>9w_ &SҤW>)u^n, y?oANO^+mh-=Nd0& Ii1#su|> ƒ,YDQy亖Oف?FG Vd ][ o'垶cY%`!ŊU-:f<+>vpS-`cfɁw2f#S3xUst|hEX:ڎUac҈:7(a\4]OWk2#_^~{s;/现XXd?~9QD}Q^2H/sQ͙}`Z}p7{x;Op~a|[*jVvpVt"׋Uƨ4$;8[΁#o} stqSލ?{͞۳5wh9f ]V}=wh}Һ!~yC~EQD!{Oa` 0wRGL^|j\ {`gSW]WKX}n@paDCO{pؔoa8} C2쀽S^:hxo]`=m'b1)#OFF,<puCGq'Gօs3c Vl"ʂ3 \!o>9*Dkh >k-XFeyުEXXDn,%{mVy Y=GOyXvZS=O$b_b'^?flqݗPD)070(v~3..O\8s׷sL#?}4}^ڻD^v~vxXfʾyw)8GwL^z=ؿ̝blQF+W&BuZnXT@>Epk`|LG7CD 3-LrZ*ǯt5W U4%$Y|_ޕ<+<. uSknyO6Z}q;1(wTD;Tw7jϭ)j{w/6Ԗ(~YjU gN3qFYK wY"b=}^ϦC M:Nv#4TE[L``' ]k6g!]n}@pӍ$plnfÃy H[ 7~3[-wXO<:^>\?n:%`ϸg(R41:EP/{GG6wyd.ʚ{^.qcJU#+v@>a?W[?~{-0/$fѴ=+6xI訿̢w*ELמ"(JyQyyGG\`i*xX.82vX\lXHl¸:#ai y=Dk-D-/۶It7JT4r=W|I+R$>Y uBx}$Qq'eą+ hVW&mDUY` b,݂XǭCa]rw 5T~f.p1g8:/c yͦ)S&~bty &;,nx |ؘ_+fW[)Nd煀jÀx_OeȼGyvW NI:?_DizE3lC|q2 A"$xW^Mb8ޒ{nI las}ڟՖSG yo-[tA 2}S/@GSi/&)/?Lh<>wN⻆Eo&]#~к㗟:)al}lzR z/(/wTGFu^eT|P !щaA-Q^VVoEG9U*3'-vB714IE0'tZt߾xZKӲ5J],T.Q/ܝVC ych{D_<潉3mJ)oP}FP[)dXkr5 =.2,Mt8rڕئ+#EDuA\Xx˯]M=CS+LL(֭ir }H2NLׯHVsh2púRf b U|͔"$[ɱ6)a_QfVWfr.o_)q&N\ivq|_+ߩ!xR@kщI]>xxg<X66.yQgzKgR;#U, "ʍdNHKƪ,QԉrK_\o1O2`b*߰ORJAo:HD BSŃ8^*$C&CS?!&6A"ALy1%F9.r /|Kx b<.&SAv@.c/xƺuC ?k!Yt0AKd4&4 gxU9$?)3X;'8H$rH,.I̫KΘlκM^xƺuCH\jlZV05{ sx; |@xNgE(ldl/a3$ "x4Ui dfa|;& /bTؼ?{F^xƺuCHɔ)QƸP2W|aeL$ tx ~uqbؿ[^%Fx0IqQ^nN P{y$&5Djnc, ixƺuCɴv+/KnZ`"jb %% 9NZ#RfeU$Ә0!MxƺuCzWUiա7P,ܪ7yؖ rx[yB ]}7<ћ_  x AFU5JF통Xoj gx9==-4`e{x8Dm"%1ӓA^#):ddq ~N|ܤHx ==H}賂BnjAГCxƺuCH}Uj-1zO82y #x;==0'jfٌމZN?@m^{=Ѽؔz 3kSGW$]4100644y{}Sm"O'?&${0>uO5!ݢ6B_'&-°[:JГ} (ۺzx-bЂW..JN>p7ZKpQv9W,Jx2oD«\& |`2Ψe*%m4F~-h0C,UpTpU *x`&qMwдJ!z^6;_a`}5Qv;ʛc}aҩ_LtLLLx4QYk&0у&>OMJ7t' Οdm*z&Xm}e`kH  _AXl= ow{^B5okmC:{UZDmLn$xJ0S M."baaA| Dx>auߙOVah:yaDbN'gqIb 'AO|@kp0nqfnbrIf~^1'XSQI|qfzQjIiQ^%'db147248 MtM @5x3NNS]C054ȫ1u /~dxeJ0/?ɅH:VC۰VѫPlnKo|ON|/W-Jc[(*:0H =1#>(h5 l`D#L@m!4ZbjZSDp.PWT~^͠f_Uժ`8>˧ЦYM۞7'l4o*Ң(:. ^y[X̊%VdL BkJT'tv>DRh!lu~'G#xeSMOAcRy^l(-%MRa6.6픮lwqv4Gѹy00M޼zӟ]G)a<3<;%Rɥ68:FpidI Q6lK91l tyd ~inlX\ A8?:IY!g[܂5OP_)^>E |]3  uۤ -UM 6?.ۖc0AMD/lu%R pNk˴rKCң5Uٺ^lrbK5UEmb S:J6M6an2%hGԯz7!X<6J t y%@Fnr\C·я!V|aV"8ێL3ģ0l1_!SUEyJ+v_auGN{lyȹ Ea: 4]y Ѹ{Uc3L( HbmQt=h!v!?rPEՑ M/~]A8s]ȋ \1GXA7BpȯF? y3c̒+坷l26 Q [ZrR.VMŶ lXͳZ0362_ss[J*Cs-kTP8xuPJ17E(B0.v"ZfKO5nClI&S«xBl+K2M}_E,202p'TS!B̡H E.G2Jj?TbADĜ<P;&'52&QH 찹t 0}hlot(bW^S5XME&1qҨ}@rѨMe C@ZX<Ӓo2@I7(QFq&֤ eqa0ٌISf'ﴶ|eE} w GxǸ>s,> 99 % ŕ@BIBRBjEjriIjBbZIjXAbrIf~BFb1PAjBN~zzj,@&q2}|Aq7r+sHj!^ vv(sf"H^Ocf c;x# xuj@izh['E!;1!$PaҤFKVZ1;rO =D}ò3noXߪ2d Lݒ* ~!LHAVY( \i%9EZ`Aq>#2%)%I8fSFmK776 %YڶV<VZU9twr8YkS'ɿ<'_l<2aiHJ~]"Y[ .MʺxrG(3_؆:N/'AOv߼~;켩6b*AgW! r!<\]TQ@t߁oRJLu(`}f_I- 0x{εk##GbN&ug.33 LodԁJ%'gK0Yh&0dUhf2YIn &qFv3CX 1!1+Xd9&s(+I g2K#,9Rx gu7v%K ?BLox+-(MfFCWm* OOxi' E'g*o]}F x313zr3rė+(ŧr6 ꤗ&%[ģINN^%/.ɨDU $3BIr <4Hx; |@x3`q޽~<4]+Kxƺu"&9I1N7soovf퐺+ :xƺuCȝ7tsnjz$f˘K TxX4Jeh3驉T*54,8Ϟ>M :k3S3&C3N|Zҕ3ׂ&?z i|3T_dQ/›[c&ScShOS_$tfe5si>iy{^@Q/iuKα?2 Ł͵[{S[woV⠦YMk`EͲ= UM(x嬖A՚חsVs5 Wg=d\ڴ=W&%lemm,|TCx#N̲gvs[^㟁張ഞQm T gt:7<)~ ִ}N\S/oy͏},ep ώQ*X^FՆܩ~{ܧ+ cWPsXX6neܚ)>"! B@p8| `i"w sժ6H]>;݌kȲO,F, ݪU5*ּX у9O7t&dLf7w=|ŀ]C9`Ht oKlʾj]u=EcѼikz:gU6\˴izJ_@ D;`~W^*fsj\U dV07l?% RnPl"?,$Ac}rlzYعy["`!+{؋;kZ2 K2A VA=C8_7iY~,\}] L#.G0O 'Q5yvUKWGLkgںٿoy@h Ѳd#XKS?*\;a'gDwh&BPr n4pRDJtOE~$f8sqNq>\N&a"1~޼iO]NQ"A.ȣ9i׀tY-~@a("Q]{ E]ڊFzLm:WX QH ˰gAZn8k<j m)0PG a8`z`M84&q(zH)RXʌ3WfRDF/ SNo#7}!YBqK(ءDRhHš۱i;a k cm$Ev x,J&@VC\ajZ7Qx+c%ÏMZj }#ZzFYGkso0In$q2!Fͤ}/>/T{.^VZDbzxqG$>Cȭ<dGy3kސYM{3XY G}pi\AS 6I>2cX2غoF`;|k-ݾ^ݥݴ,'[ˊ,jVuF$ $ȾcKc"Xu[ 'e'Ql[qՆzc2r7T`Z̿ٹK7x/TJ.2[9vm^dʆYDr*>OX05#T Ul9x)*uZcY\*.d$.La5;^ܾ}X#Uѽ]O?nĪciWb9r0 uFL?}}z qԶgP'/l-pY:)"ʙXd4#ȑyA\1辒Ńp&Əb4]sLs0F4F%n\BG=겞2 Zb)l I yw5b$o<ߗesǒLj'9R[a"$[Ƴ̔̚qdX3LHȘ2rؕ[MK`2T$s%4/!04,UN!NSQM6[ADd0ew׸5ڨAY°-\ ɨ%Iɇ! ;p6~fs3g׼eإ>j  ll[+A:uҨW >*R.y7Ej zwƮ͟:5/\e5+4b3 iE# \>,7L^Ymĵ n -2=Q"*Ij,[es+֯ǘ"9 1)nP4\@k&M0k)! {\ۆ1^E4'MuTX,fFl=^ї1519DY7,} W߼}mlЅЪTp PSGl&&{/}ZS Ry soUÏJ5ML S=?}Etd&;>qt/CscFɀ l2fS'.xqtTܠP%,HK^35Fh4RJ?L&]~ٙXGs}?9>~&"QfSDȉ"BԂ[QZmA~$ u(wf{Oǎ,(%0B]Z~Nk0*s>cs dV}d}}Rc&3O^b:rz6^> ;e{>oXsp{܃W }~E.jp)"C<( C/ Ğӗgg^XGŶ6Bx (SYul hn܃ƞ|v'w7-)7px6ޑc]6v֬7N|cZh6ڐj"ľs6#BpI?mnʯ<սY~fW#т^Cy)s<C||hEIPZ}M5l/L/c DCE}=ra]-(oQLqb6<@NB=mo QF'i)aQ e  ń~xCĽ3.v)EDr0xj]wW%OrRC /2HBMʈKV(t5\@7 bX!HhtARjD:EqF,,]ʊ-P\@Eo]'uÈ!> #m&UM4߆>A/ `bveV(t(ID1(68*%8 X쌗T{$WPwSE`KՌ[Қ'&P$"Z`0*9 吶]-,4ob; ^HFΖ ih.wfW퀇H ` & ~rQ'jd'10Al}ڟyljp1h5Iܴ1‘0reJ-Rsn񠅌9"*sT@"K9f8ڏԍ BfļeB _0Q 3NҬ{zn'~8F /'#43&+?4U!@ h@3m?v؝\/̏1Z^qh8 E# ƒD7!3M];Kh :bhWs|ZrQ\ƠLʚ>ή4`ORҏ\AL짥MW}u.{hcT鋗|<;qv4Qm|lE!@kN'E_:#~#W?ű'% fh1 =G讃^ :AD[4HSYKABXB -VW^ZVoG3-rƎC74IKPxÌHimo,|~$Ӣ^aUW̯e o7)pG7qMX`ZjTwǣa G4)xkr5 =.2,Mt8s‡큓ؠ+%EDuA+<7P_8RPi| up?e_!'pj#Yš A+f]!:s[wH  6`"qt3Wfrαs=3#>jJ'4ɞ}(_!xR 8Vc׳{#;㺀}fy"_lasDF$i\{dqOl˵bBj]*3R^bgNJ +RTxR;SXѥ}vk, KQ͠D) RMP@VkOIC]=!}&03"N<:Tlü 79jLPp"G(O9âZl?VjTUE+a5x[CE ,4T&ϫ:sqd܂R86b:B|ҌQ8ո&6{kκeA*6t&T.'jH%͇.Er"W7]&ـhss&3.Cen?eB+0؝/^$#.NQixftuX2FN'~bcZa5Yx~ّ:*Kn60EhBnBcT ?$FcMEղ.~%>BkKV jW}DxT0Ӏ׃Q.Do:\ijБ)Ut\s\N*ntӚ6=σ%RDM)Թh3zp=4a4"?=];;D88a;!IYva5=.dUI=Ot?ܵ,L_Ikw}6D˜%@C)B+7dI  Uh ZhW度9m[,c)=x;l,|wN&&\{+KOL__ 2AQ,-2fxGQ-,2i}+tI*U:@F0`^yRW*Ls &ud/_ip<7jìdD"Zs̼[4$̌oEi =31w*k,]ZCeCr!qE-;p[p: ǁMycz:}QN_~}x,rYd#'?WbZIjQ|qirrjq$i ʓ7iL >4x,CdZNb^zibzBAeIF~RPUPL(ɩTŸy2'l?%1 x+-(U17}fчuڅ*}Vy1Mw 'x+-(qݔC߆@|H>W }Ob}u Lug$b[24UQFy$ Hɒ^QQe+qJ77(]-^ .D^ )K- 6EFVT4#!G4%9 B6Hb$? _MCyjO'/¯ىw5Bwr/ Y7yiؓ%~f\%t/S@WhS*ϊczw#ʗ%2M hP|@'OS/-Ʌ-E+j|UqJjؒg'O\ҏxƺuCHWY sո<ݼbiL  Vxk`fh``fbY_ 6swD:O:{yFL7Oz>ւbY"a@榦 fř%yz غVƦJIy|㎓v).I-.)faz$|JO[}G_͝SoV?73<"w>[o+SYl'N~ " /Joܿ+w'o!\vm 7N;0~ݜ̲TD"fȔ=3XꙂobvjZfN^b.2/USmw2Rv ~8MV o<*tх&ˆ|\j_sy4ﰷљ-ﮣQT_Q9$,G Gtxzm'3h99tFCĜN΢ԒҢB2x yӗ%1<ٕ&1-ݚW!i@+ ˖ K_F- +8gU$dcIgwmo.n1CVVTJM6!ަ7?2"lc8y!;i %EL2r4(KL߰[$Ҳ< uԙv( ӑZsLwXFbL1uFÓ $6ڝg50N6~)wQ˲K%#tjWL02Įt>n%I7I\Ty1Ln&}v[W6E8}rGc!-/9`c`x;#9 \6k{`M}^:wo8Ӫ@O#wʢ @2@9"v%eL OSؿ1 Bֺ,E/Ow-}θר/5XXՕyxw`/QU;9M@Y_y~le*8qh @#s9Vho詥x{]ԸiH_1𒅈2n'^ˠ/*#%>Q7慷{^&g I?8((Ɋro1gN}T&T}mϒd*FAuvodx&AS(6~\0=/I%9e標M-p׾fR_lϤ?W{Tv}lk㨽--$"#aRѩd*@s(9"kqDgOߴ@ERrXgŚ[ns >D]@eF\Sg5 =}3Ix!eOKfU9υmh1lZ -H,hߣE—cAIў#0ܗb/cy䃉O蹢 O'rʌn5bZ~ E!:*-2 Β! >?QRwn-ׅjX j<.Φv|YEHJϹ~z°{ej]xWAOI6%K2f@(ܳi@~d\hT ӌBV"^4"^㏥JRlY8mSen,vR [tt\H~R|LbI*U\m^֖LNU_tjG)}'>W0(BXB" OixB類uHyM,-LZrKW ~LtQ|ITU<F7!ZCϘj +{ ]hڧCQosDŽw[MmlLgjpD v'<]W1jig;Piht&"w ooE"V-]sAW0ZY>ȧ Nά^ƀan6t hs.[XV)t:3\⹣T\9.ٿ\*r#yUZAd_?5\f)eXԊ4Vl*wxw͌nZXu._8|sz,A9)@#^dq?{es>iASZ TzauoE/^Y'3ҢԜTqwnKĝZꤖ ,a{x&W֒O,Mՙr˨x.%&_`Z#%\{I ?"<  j"6ӷ؟@m@ o'[N`+K-*̿ üA[f[\4>kx{B}7dUNyTĜ̜TԔ|wIx;cbaf+JKJ2R+sr3DRBN~zzjvEox}ZKs\G. 2FcӎX4zG+"<x|NE  6؅%+6 ZPTx+(+ł-t}tx!=99}}G>驿ϭg~ˇӎo ،Hh:~JVץmbq{.2xkN.r=:ݯ7{l5țdj嵩7a bȊz s$<M@kÕvsu_%MspmrffПB6kS^ ctqۊȑ]2?3<sH{m!;.-LϖKsJene~2}m[Ad6:1]ɭ'&1)fWΜKLK?Zͭ^>4|T*+E`,sW+<Tur_ѳ׽ ϧ4wF.N?pa;}}oG?G#=JpAc}̘8Fc_-<⇟HqUq&,W?1 L{5ðԩa2E0,Q EJ,(( Sݭu}…ԬId'KD4 xEzP-J],?(t;Y~阳{vLcnl[Is\7`3g85A@gcۈ$UĝNmZR0N@)+〒 mπ0V0"eo*e+՞\KOWBbCj򪱕t*WrHvLa+ږiDdfmՉ]mE3lE 堆ʰdX>.ـ4@6-2Fgy@T n&.y@Ȇvа#ɎՍg:ӝ=^ǐ2FOTl, /Y(Eۑ۰@6JZ1'>Ϗ["cphGmA'w0{%8?[!r7J2-i 09MC3Z@Ѣ0^Gu2L^' ip(Γ́VrQ Da1<q\+t|Z. @ ?0#;sőۿNAu]0JSnIiH/=eW6AHP;Xd .? ЌCh-NY) so' שK6bijg7ۅћE~yXexpk'_^|oko\OMcamƊu8~^~!Ua}ٓ/;alҝͷ+o뿹6bup>6a(d?ߨ caƻR}8w.>P?C-}k.`_m|rSO=zB ss 1rhX [j7 OIz0<}dXт$_RTlL)^>0LUS=$?Pم8}EcGH#ڒ[5 y9^[2R`ʌBv-xqV'H' 1<ǷYB>GhN#BH#ڒHZ doToc&yk*/"*UIA.cl[z==*`"䓉x$ ٩2Bs,1vZu/j&A6B' @kՆJ.t@UZy׉O@֨3+ɟNbY"kyQU]e6S?6$>=~̦ |IZE*,RR|DAʷo9nVdƒVky^1.TeuuN>1+%B}XÖs)^mؖ+gI+KD5]QdOkv%4" m٣ěA $˂!Ej =n qo΁4ޥENbE!ߎ0a6踮rUI=ɩTR-X%Ң-^hdFj'9*CD互'c86ީ\֊,AUF8ȴT'#dyNwD'.q:BGoNZ1qHrr ǭ#\K ;l֪0UW3̌ UVCBTfn]N( ExErctAـ_}yЪ(vb7ϟhBk-).A߄wa }ͧѪCЖ4d|4񁘅v6, MVHqnXr+)(Ld& J(]1X] r]F9Z)n.WS[ FyʤBlz `&JSKQW3VaBJJYPTTø<&(UбA|AmIƷ7@TzΡJjl˛b!ZY|7_Z/=5>6x?#õϫj JskcDFaZBD\WN j d8Bъֳ/3KKR%Epŧ W"9Efn m,p1^Ma.m)hҟ9awdF#C JyU} A6m],z>|onT8%׷o\t%&*nyhy }g(@~:hٻ0uh"Zae!3N2UGvɬn;!dI(i 6%m;dsΞ_;,WV46-užG=}’Qd8ϯ6MZ\U5s&_b[x vBoZp<~-DD#,sUTrWG%ެz_ *Mؽo* ?~ɁSmA`Ɂu R33K3%i i1`BvfgkB>3LF~NU ?M;>5#Vkb&7ZU]{̓l.Waj%pĻ0˹%~9ĿVV9BpEXM͵مbg.7K9SnMv$Iwc#h6z  KK*LʕXXE%GFcKV.9\0G!5"nl1Ӊ1u56x; |@xBHcGF[|=}6MJYvUą ŕɉ99z ߙfϕo+;+<{44ev^S|)>OLI˜!.sR vЈ5h1Gdvy ?d L"tSw/x0yŷB+3y9S ` kSժoBdz[Ɇ3DYD'J\hTy2g>p#cy^09%:A՗ۊվu?վBbQrnзzu|hȦkJQYEW>kٜ:[8߰&M`)^bL m7oM`nȲG7hcϦ,pm֒-K*"2C6uoњy go+YWt\spZڋn2郴} f@ ՊKqڷ<3%gEW6{/g?^4d}v9k%ҟId{#rDRY-LN);q}Ai6?h9Z68ktTEJeo.nHfRDr"R? |xj'EZzNʸ٢**T4%K~W}zr d{2={~SYq첼M?_tPp\`/IM`vDwwYOj2O(qpL֊k׉:s)-x9;pͧZ ~9W}xf1tB(z9\Zx H5{xVoEW&7$m*4I$|CDk&i6_)R2۬gݙ=4\=! sxw$M!g{o8{.Vxy\=&i6<|X効Cw<\'0ƿчFby έm,2זnlʨYYn,{YS)C,0cd5i3C®2d:ƧÑ\GC|۩ Q"dzH8 X6| -7:σ͔H0"|vAJ6PݩXmvisipJSKU+xC8 H.46 {햰*qR񘀰(P>-1`>-"BwѲ:KnF $k"5ЊM9ee ^>uh`e*kpøPS&QeP⴨{ SVVt UHyN*U QlFwZUH4QOlfk[hdD鬡D@/).Ǡ.#خ<ND1F P؈m^b~ "XZ21' 0f^#y(rz3 UnZ8!!ۓ)@wPbr.-|m%X݂6tܺz.En&z6vރpqGbߤ4KJ3_.`(7+NJC?PW@GNNun=`ӑBx chpV},Ѱ?8"4%}\Y{w1{`xph|V),uJe(b^`Cļ z.՘H=D:};5s\XPub"ji1R;6X< &{e9>=:F3;>s_3k?1++Q%|kKoofЁʟ>]i2 yW&gVo49udMv ˛}}DJ~ѷ(.ʻ yL^PfV)U= J|hA zVS6sdV- `Tl]P4]0W -_XSRfu+0*s4bI!B#l% .~DSАc(QrH_hI4}^pWj=GXNvnJdg)/)KAeo0vTcKLluSrҞW!t̊E& Fv,=kպ_gۅ%(ԎړE$esǠ-\z$=Y?[Vwlx;y4sx-0xr}B=_biC/J,SSZYEy2;;kcg'gQjIiQRAbQfq5grbqBo@cGmXa+r,`ѴYpc~"<+ MJ9[Y/A6M!:el0'O nD {CbFNxYq!vK*Lv$GS"MM>NDws)H ݕtZG˖9P$])R.٤4Km a򦄻!Y䦃1injB&mAPtYnxd}ISEudɏ,ägT˻n 4>M`>[̺ñ8Ő nxsTseU}A0Ӊ Q㡶Cց]8ub$DZ@CF6P0hL?Y~8x~-Y93-/%5M!7 5$9/1ӇK(Sd]1<2>kydՀ4'rj^JfA@@J EJ *Ғ TA_K!1''\!1$H!'?==3/]AKB<̼c_Ӛ,?3E88s Ⱬl+9SQHx)Ob;;'AyZZlRإY xt!i}Aaw+.N΂̼4 % WiA8y Ax{iB_biC/Jݘ<_P93/94%UA$3G/Ci-p0(Dflffcw (c6 )3giL64&׋M>% o6̑WYZ4ɗ'KIMnv|Q &LΗ1NL,J03QTU0cgHcG#\Za^œȸOUIZ$J0_π`Ylh&I5336"03?c/@& a W]XYL `gz]zނ:^`Ձ* 6U6'j3WƖjV8b&9݋+SKJrKZJ2RJSK8a 򊀦eS)l$DQ$A5̼⒢|` Ohfv626-HA#b58)(8GDߊAh+`QiYRz/6xuߊ@ 7 j/bD X ݶ$Q0INa󏙉n) yqƚ\$}w|Y2,oϞM}dlֶ}Eo-l͍-Kn׽;#6vZ\B.U/A#;))4PHS22)iWiZ,lc[~؟K8P5'@4>:?ozLS S48CnN# GK@h L49(ev/hhgxDQ&h@<;`5M<]H.ҘҎ4"jm U'"u{h^$\BȅҠjň"6S.[cͅ?7ۑc%:\h* 9ӎPS-sW*Bd4hfb2*ok x340031QK,L/JeәvQBjeYQƇׅx !|S2sRs*<^|}ӗL+r2Ss *R|jj{>w+`GbEMoIWVR 4ERPɦݗYr`&FLv4x(!755 setup.py䲻oȌ76gxƺuBöt.|vg~Wibt5sZي'lQèz/QMf&& A.z) ӟ,cOxzpE>Aή ժmsHc+tlr#cCptʹ |_2sJSR|;inX.d~{2?SIځk۔v>ɳ7^p"G ZKRKJuxӆ*]EkO=0y2h.xr_: Qރ=հ.4tj_̦&儓eA4KևC^ {y V?40000 testsXnjhc"~p (6x b㾰Ԥ RAin[v@|x; |@xC ȁS-pI|%[WL N x{}fy$فuL<n (x[}q[K7Kq`#x@9:45#e$٦;PMT!755 setup.py䲻oȌ7݁?"xu1N0ETzjҀI&$ֱ#d49% q&/Z\{z~{2cu}@wP]3)I8PlH ;9쭳t,D[>rems4E1?ٔyb.^_]EmzCsKy݆D+C9h2/٭Iu=I/=n̸DNQǶg=Or6hȉaF9oo,zx313) Gzޔ-L*#xZsG/ ݵۘv\T,R]}F+BRlY^Krx=;ۻ;h<RTvrWp%A*>*UTQ^wtϘig۟Nzֈ|1x^@?(͈7iZK>-nhu]&B-:`χÑVsy,\-651l;"AlӐYQdzǡ zm~|{{mܾuuEӜ\fqܲ5vdC!z~;zY[ < ctqۊȑ]R[9lu6퐵;[͵58B7"x\JsEmu1صrv%#/_$=_:s.1-?jnn5sTZ.҅cgwǟZڤq8Z?{ ~| A#.f3H̞ o ;}o(iu3eqGz)ZxN?ⶫzҁMXBcd?;jMGaSd`{AXPP4)7֦wI *;<5hw8fM";_"F'(/҃hQbA>f4Rc¿;/eضZbPofΜGqUk߃<ǶA *MI4ȉ;,hĥ`RW%G=o=ڞQhsaDTHMzV{r5=^ MM<ȫVY#RT;4V-ӈ,8(4QiM| ۊgيA aɰ|\=+ hLm [ ]e׍,m©@3.%-#M ] . aG!ϒ+t;1zh8!e6X8  'aA=^PCn'#˷amxbXOq}8 ΟEfG lѤڰ+O8`pK`=q(B ndZ(ӆ`rN) .]f`Ea,dvNP'0cy/ +8K RlWj\ ~`FvۿNAhad* C'$fVK#(2S_i B-HZ !ޅ'q(3Ź<7%a&-d6:ui`xN-Mp ]s4zt]9sqE,vצ77'0]eSXp"*:x0azxX~?d$4;tggcRiv_]:8%0nNMoTұC)>;yC`"!dپs}slnnln6Ghӟn߁B:yU–fcz0<}dXѼ$_TTx0M& XR}L DCeRcFHe!\hKnk(D}xmɼ2sHeڂY*3 Wە̞w Y k'߮`"|$ќFF$%Aߨj~MT^DTZ+X]jWl[Ξܮ**=db,= 1 <{vdr nBKq<$&3Q7@䷡1H~QɅ`J>O:1YW k+?S$f6t6,EVm O3~yD|zMv%G`UXo#s܄KȌEֲ *b*\&e1}|ce;SZ r9Y-_RvҰ-WϢVk+pV0Jg" mܬQsMme^e"s#\s&wqAr+.7xQ49 } :+GURgzu7>#9J*UZb[[~«"-וH-9$Veh\WrrT~ ; 1"KP|`# T'/#diNwD'.q2BG7'M%8q9VeZy :*"LL<32?@~.*qI|!*ueU.'sۢ?"1:E lȯfSKh!FhKk?@BIR@ q&+87r,pn&V2{F%̮r.kGl-h7ZP *FyʤBlvY|ɅNs|RCإaL?jFTjOA_]rkEk9WeO"Fep-32ų}a91"#0C! +G2!qhYYa k70KKR)Epŧ W<9yfn m,p1^Ma.m(hҟ9`wdF#C1S6m],z>|onT87o\t%&*nqhY }g(d@~:hٻ0uh"Zn 4rC.c dWJ%x!&͂Y&C6)nr=oEAHcڒHZiY0?" O__m}h+Z; sjq1mg.QȾLrICϚk-ߡ~3W3\Qq".,y.vlL"kI-)]%)CMM*fg0@ cJKLRd-1E/#m6xo@eE-łkJ jljh:EuwΏ)bgyebeʻ ɺ|ޗۛ2c2.0U^ 5fz|ngʹ*#0gƢJU(xdvo-lPȴю40Gj6&KAڪμj"\XfKs̬-Ag}B06+,Kqdh~>~zw&ҍqp겱FV;U[wyq}EY.`W+7I'C`X1!C1]JP%rfLc廀$DH7P:C裖(D,(g}kQуf}\%[5$uCFp:_}X۟*mQڀ %%ik[,ඡ7<>zr( 6#o|CWhqquL{J5tGr̙ĹmCqq\$֌ljL5ivg6Jk"!z YtF+TajՀ'}1ߩ^~P8@ 0xm ӓ u`rgfMN`Gg4Z=ܵܥ+gmtFk+K$REo~lLN\@{:PMbN&jk[FQ3YV*nw쁜Zf7K,-cPx_>{˵4L͢nRV.ji\2]h:F+/gּTZB "j*{6 0{+9޾i{F:McKv۶MX6HF6L,.eCKgVkGN圵ാ1m iDgt:7< ~ ֲ}N\S?o9Ï},qSc ƴ>wbx^)JBz+Ff$q{5G/C]+v b88'dgOA74l eCjUM nfy5/VD $ Gm *8Yu6Ӭٍ=_1`ptN, D*((<':cW]xzQX4oŚ^f 2m_״4U襗Jh\1cp9k,ي& $A2)*(ӡ;L4gp0f&:7u,X!Šqpxb޾ؾ%Ȱd C$ bS29<0Uy"/Â%ki5$&Ϯjv?)0{ulCG/;M=ZVlQk>v*'Ekuv{Ft?f- %GRIr ',5AM1QWJa:g1HT#v:`S""F`ϛ7 CK jUy&(Eݗ}TY9'rc5!mVK|uPX4ʴHxԭcleDe׷^1g[ΡV1z+Rd}!'䨒YXdޠvVz÷Jve}n6)sbx_Gi_jn$ w4X-˴QVKkĪ{ۤ"sEQ;10$xujeOuO\h™;u{}9 ٣ljD=?Uiy1b ɺe,jR p+q3h{kkkHdھ~O/0??|7%1>~Ҿo!]­ Ho0@s 40aݎ&m5x妻E;O~AեOOqYu5É mAKޱo:X 4'E`Z y;4UB-R\61(,)ؕ W|yl/jCCC4w(Pq,Amh/bXUq ":[E Kt$jDr&#&Ma$w7|@ a ς*,dpx X9MRa?6p``;xph.5Mɇz!)M1PRN- .g)f㥈h_0ޢ-4GnvCFPCN$;%ű"F knǖayRjs),د/܊uؓ%z۹,౴;Lr*!NIɁ[UUH si}B F<_D=(~lRIK&-5TP &R$ !Eo3U:̒⨨l}AN QD(P7'clZOr87!!p3> pxvkWT%͑U7) njcW G]D5կ ;%hv?F'-ZLJh'_僪۞|e˨VH,Ro/<:NpİgHbw8hfm2e{f3qQe;;v&4\WTw>mKXC̱hl`7|]X@^_x‚nZn-eEk,jVuF$ $ȾcKs&"Xu[ 'e7nٶ6 WiP i1ff.lP)c#[SH @]'F<;T=1ĐJ4٭_zσILh$䦣-W!5 Í]n#IlW"Lӡ0\K2;a-ü|P d Rg۠dOaDV8ytgqƦSRpP} Dߣ9I"EGY*IXtc>%VKӕ :?JMwt|N0F4F%n\BG=겞2 Zb)l I yw5b$gxE7]3'3;{Ph,"(K9ƥ!\*hU ygfyvh^2!ӫfΩ\H 8bjToOxi_V8t` sCb~$4ţj+eۮj%q=~LXR d0I^)pqPGE_wGtܾB0>w̾#Q2:cwv;eIpMc˱/sSOXAOz\K.FNomok'@V `p`}vg[J |^t\Sb#Y*N)g;* ^Cgҁ>px-jC I;"s +V⇭l@Kbp뭹Goc3ߝ9,h9ŝ(7rMnB`.Ӯ.p| 84*;x@sʤA`eDDe;þ:s:Ɉ m"HXzNku*1VgRy˰K)jN#rl|[;y@:ҘW >&R.Āμ(h zMwƯ͝:=+\Ve55+b3<i{E \>견L^-_چKEhWLOTCRC˝UN+g1HN&Ҟ֔<MK+/~M {>sM2?d@!3x,k0ݫ?ڣiS Kq%,SC+2F&s5놅EN<z?"!J0 K@| `;`'_^M bʍ0;4V.D;bnkUA' -4Ilhg5DBb= B8A4?dmnɭ<սY~fW%#т^Cy)٦<C||hE)Z}M5@l/GJҜH<4g떠> >Dg>W탹\َXJٶgry?܅|sR>|vJ>~?[}7?~WE eDԞ^]RܵDe-wo"vj*g^` sC#+/SڥRf/i. A ʪRBbިae1!d^žf| m&:4 ߆>sAw% `bBe cli  HHt\H NN\\x5O{j*C=WPwSE`KՌ[Z&&P$"Z`20iߋ9]吶]-,nb; YHF ΖB ih.wkfO퀇H ` Sxdc ^(mh5E{xC \y6 6+ʞY- 7 Et7\Ѹquٰ[P@ߡ'A8\ ^!M{7mp伺niK:nWgbq?aǯ?BGo<׃ψh[=;C_2Lv Q'Q16ȕR G瑺qAЌ @ &*i{.1Ƒ#\54 hD!x6PFAxfv\uh׎f4bqLag]U1YaD)Ai~(OP&npDeMGgWM' ncL.q y&ɛ&ګTbr^2v4:?>cd={?yyT(N687MQtZʘ61>wz 5O/9COyq| cGlBu|Bq~Ag0="Ou|K}*k)H@V(D~GCJKJ>cY EUc&F=i~ jEbIW:mt_~ɴegX<+{}Y0aA$pw[(䍡} ܣ8qMi3x0 6_#e/3rMνFEƃp%T}.Q=p%D.Uwe#j1^kVPT !uB8܏ayWDF HVqh2pYWzbN&_1},mGc 08;5 +39pg[ٮY^5%ăW]f?J] T<)=ѝq]>r|Oj\Tyd'*6xaރ5mLPp"G(O?9âZl?VjTUE+a5x>E ,4TΫ:sqd܂R%6b2B&|Ҍ $qqWMl(W֜uU˂Ul:M\NԐK -\ |UP W\tM+k$G_ q%6(}u)Z\)|Q"YQluv 픊xn < B;tKX OVlL+fv 'cP67AeM&>]?0&MHC{+۠1b&Y"jYw.3yFy} b6=٪Fln GnD/TJd<0{ΜZxVWICXJir'Bq];ϋUM7wf[vx ;1xRQkAM)AU9(< FjeswInnݽ҇*(-ᓿ'5iz7|3;o҇Jǵ{);:x0ga G8Sd|}whf/[I9z-!8(-C#t4-BQ;:6_<&ekE;^?Å_ɝd% BD)=jU=(^VƓvml4*uh .:ܷQPy.hq4מTy !]OƵkɎL%uOhX.379Lcq≘b-$U]Մ3駠TeB#c ێvtrf%ș8tz:{S\3Sӹ)\zgE svgC+&KˏB_pc$ȠRH)ng"%8b6l. HT L 掺8-cGz,OY{?H-mAOdxuώ@Ь$lƮQcHd A0mhb2)JLS/>M0`;0;@˭̟鿃_ϯgEjzJMeC3.TfK;45)섎AmlFd1tNe2c48FT* Mj5TzU*lS$H2,  UC{ULij@a:q;0ah]U-rr#Jbx}y\SWD%aAM PTbgB1!Š EP2ZT D٪4Q)־,ϙ }=nGprrwu1x86KCzq=Ƈ=K#:5,/}r^kJ<čQ@pPG6%yTijh([M{L] }b]=7. Rh\ ozavٔ[~eM{NY y9ӎ:9$+RʉAZ½mc_GE$ ad?"^G--jT(+ДW8be( u2o1EkFMc4|[Zi-NKA)8lxI}SoܰnG6II7h`"˜ҳ~Af)˿ ~-pYƛגFQ,y-Mf=2yȶU/|OX~?G[JY%<ZV`mi") 3!;=\hEY!2i<2 Tд'> 2zHm##>AND9!?`S_NGOyY+KсJr1, ֬,SdAߨ\K>ʱ8)nJG1Rhd[Qr%-;74kweU| ~E훯 d2NGՍ \#/~ TH}7&}炣 Q{ UD!{A{J&P}m{i4 oEcz X$o#[߂#9Fh)+J'ؕe̝M!pk2)OߏIK.64^, ]ɽvvSYW,ظ^}$ҩd*r(q @NɈUz0kv>s\jZ1Qpk^{]@Z+x07+&p~RϕOzfE%; **?pҨ#dQk]hďjrXN[1Zz4$?UjX jS NFW`"$T>fiʔwݽuRJ|XKP]/||eh0@޹-fktaߑH;S-c[¨UOD8?T\(kw<2~?Z(*xN_ۿbgՇ)6L0؊75??H)>C,Yc6f"b0sUHݭ|.peS-%H&`V̈=YeՇgFjYhI u@Dpv *`.-v6} ܞ4s3q#f_ỿ@*ld>3܊!`5^<,F!6b/7-0Q^xƺuȕ29ʱߴz6/gz!C5 x; |@xBHcGF[|=}6MJYvUą ŕɉ99z ߙfϕo+;+<{44ev^S|)>OLI˜!.sR vЈ5h1Gdvy ?d L"tSw/x0yŷB+3y9S ` kSժoBdz[Ɇ3DYD'J\hTy2g>p#cy^09%:A՗ۊվu?վBbQrnзzu|hȦkJQYEW>kٜ:[8߰&M`)^bL m7oM`nȲG7hcϦ,pm֒-K*"2C6uoњy go+YWt\spZڋn2郴} f@ ՊKqڷ<3%gEW6{/g?^4d}v9k%ҟId{#rDRY-LN);q}Ai6?h9Z68ktTEJeo.nHfRDr"R? |xj'EZzNʸ٢**T4%K~W}zr d{2={~SYqY2{,Yq\`/IM`vDwwYOj2O(qpL֊k׉:r:xƺuC.PP5ؔ#:GFFSF,Bx%TdCBzfBIblәbxƺuC. յ.ȉLp/~wFFSFi /xƺuC{wK:IYۯ_2&5fx; |@xBå/69X):~?ņ5 +W''%38~g=Wz_t쌆g LL\/ДybO<3%} c-K-W0;A#4e}> -~:'+0,Moޡ- \Le"/-4MU l'2gm(qe, RO˜)gmwLлqx(W_n+nfVetV܆f&& EƖ@yֱz#!)jFMfdI\~-gstn|4YU֦zߟ3E+ݼ}6! k,LؼRq B>QVK1؊~OOɋO*H_~%b?~p+ >=9LD2=[o~U=?ꩬ8l=Yl>[0+\`/IM`vDwwYOj2O(qpL֊k׉:_6zT.xA4({B ?v%.Ab100644 db.hj %%SOWØI277vPx; |@xBHcGF[|=}6MJYvUą9AA.x d +'w<_@㆓x HRxƺuB7B1-[:kc+ Q xF9&B*s|)J100644 README.mdg|,`%_UC¸ScuVxƺuCɋ#g߬8q|-L @$'{,..](7WiL ^Lx[6@`YdϚN=QU/t40000 include TðP:~KS{}E6\o'ʦ*[uv@'ixƺuC{wK:IYۯ_(3zħ U|ת[z`4&M""x0`fh``fbY_ 6swD:O:{yFْ&ƺřFE)Ez O7KRKb2yߜz=C{7,KEvMg۵E'ܬ xd:l[\9rkU #S30^t 3\4`T/v.'Yi>L)y)@,(1=26ו[^:8O߷ >^T$GK/ؤxRɗ6BC?o|֕͜l{n VGA&fe%2cЌXg=-ǹ:#.wx340031QMNMIKehޤTvǤ պM @!71!l~ʥ]z)'x31hnjbצC2RivY o8]$RެUcYv.BصK6iϦץRiIHn>?n 8R?ǾT^H,i@ʷFߞz=ZLFWMJ?`}'Z=$~{~jU<Ÿ@v{[vջ ˮ2 jo~7<߉kdY LG@  9⇊|{ejUy՚Of%=n)Z&GZZ殯qU[ӗ wMV@ދӓGB_wMi{?X6kUO8WQ X3s.9r-ٝN;œF2 ZC *~#B3<  ,1FB?f uKmB-vrKU搪,BY2=t fX]Г:WY>C)4BB-2dFv^7R P*lzV%kY".Mr7 U(s}h>]װ ,䜬m_9 NؓO|l!5c O~} U\p@UY`ߋB&A P}%0N~S ͺVd-ϣjQ5T#"uKޞIVNHD4Vv QM3Pe *Bdu.F.eeJ}U蓏j}XUynOWkmtY@e z+u9T i x,4*@HV.[>d~ʜ!UEOOv#čwak9Jv/6];AǹrqTu=HMT|RE%[J\#{źA+U9DM4&2@&JM"MiuY#sY⩏ rMgqpCPIm_};ٰ8̆e烓ڰ-kuv[Xl<*$faϥQ Qï:5Bv3"wZO"Ovsf:9"' r1CVP_,*(Qv"XaO-)CHFQc,٠@7Ps'Ya[mʛ_MA`%wSd%mۺK`A}sehaLvm>ڨ~R+ ѡx;9XI1ҵ ȏ^ߪQ. Nh'Y@8K)+eARyE"Jdcǭ\ٴMO=v!f h"i4y$C[Ff6IЄNǾu@ RtUoZl<C4GLLCِeB$޺1]4<ќsp^pvzNtQҜ1'4)˃s ZQ"#;N*R1Ź]l7pŲcbs f>ps`뇛+o)Ǎx:/:kYoFø 9fͤ}s:ܬp[ `>Y+pdtj*~ 0*6Y7Y<Em/ @0J2)E/KaEݘ^c!Sy Jvǧ(&B$ԥS KI|dp%&5`w jCD9)|2.Pm mIaxW*9,NJ%3 |Wv#nw:1g;>n8!h3]i7tKk]!m"+$>=YS$zLq8D5i}-f p7yUocc6L b[!4n`&21iי5'-ʝ[8cO 29K}!z" 1vgF"6؛_!͹I$^t"9-bX NR+S-y ݆JDLso2!WfrQ-$ }0[LC8e0}@+)J%%!'_JG&Pn<}h[9 7f^u#W]N۩[(҅["eS[pTͧ!@h=?9#fN7SWk(:4j` m 7!r< n^lD9 8[OuwlX6<]t3 k} x]k{H&q.dls /Ztstԯ\Ӆ Bݖ!$͙9x%tg1G.wBc\vNдqih*;z07L2*bg|Q3e',#<ڿTX[tݤ]\ PMS3mN Ax8ΌA'7!ko?qr3K)@XR &sYf'/`Gz!;$DS&k&Wg%'*816%&95&A 6l8c;, +$ TE>QB/hOQ!SÐʘr N`4fB AǍXyA5i!?=A$?0gIR Q&_.yWxsجxKvZASHc! 5 `RrM?^,*P X"bkΧ?65Nkگ8g[/ebnqӀٔ* -Q,~0%oЃ+ Q[u;r|jڨrpһz ˋ)(/STp!ͧ${Ėvm3r5tEHY z)^ec<&[`PtDmqCT8 e #ˠ&;}+?rǏܡ[ 9.mvY-qCՂZbWH[3F^+IWd[w|yY+!r?%ԇ|}BmA”KWke eXeR-7RemfLt* ї(fj=T1(&,r 'Ix.pPx,`u>d,+ i,0bgؚ{mBk5ή8$ YO-n^T2{Ck^IVVIBW:b$amkƭe'}3\ILQ-4l2NT]螺zfJ>Bdq* pڄh{*ϹU^|ce'L|d)ߣZPff5xdqt{!OOg[N({.DX+ <@JS f%Kj:wM|w{$d]Th  Q1<-b=oI6Yu~m/}Z>BcZN=в!v-;6}>KɌ|UQ{ U gȻ޾;ɺ[|T$Lvn1;E$>)bzHoاSeS W!&^ G.A@'Fcr;[ԯ9aBu:G d1Ad`*0o?߼{MV?7ګhlX@@; ˞%] tޑ&Wzu4C;{|tSd9jG"TwӋs1Ѩ\ ȩFigcX0x|*s=j "zITooo~}KqɇN7o^F?Si4}#9 ]^3LGDjs"o4V޼5Yy+w oQO>y7M=Mn|^^Dzcs8c`@kK yY]{ƳǮz O^ ԏ`Iθ @m܎ok'% =b~|,ǁU}Cf~t^K:-.FȖ5_H'ug%.* ڗ#,t((s7:t0| 8F`IS 1xy'11s"iQ pNђ[=N_чNWDxN0Fn͆AQJEeb`M9xނ ƌ:Ͻfwk5d\GtOK%YVLMd/dV,%Wy}&8ɥAu5ͷmgmL9g`UbB`o:ErLKs%glg4""+rO5q %/$ۏᕠx.` X*Ԧ p]lR9p*l$ȫ12KAڕp#KEB8-q6!AJPSpܘ/Ċ\אU1/7t;ik,Oq#1 {˥!P' g'tWL VK@M1%{b$E0Z`m|{-Zc'It:,nFp8Jx]?hAƙ#Nr3sl7溤S&^8 "1bxlq: [[+Q {tݻ=}{{z/—/9M$qQɮf't\i /] ÿSo3tl(q3c7rE&83 |U2P<`tTu3^n 7SGJV*;(+? aDpRc:yøð۹߉zي8|BH<$c`a]q |Y։•Ky=:֪+A? U==QIito5>'[*>j1 e67ā4s; 2w(3* C+;pqܧxvGiii,0y5µqfq2T$*q|5[Z . 9ҊSVKxsNnojm#Lxd]} b kV?x Ex[lA5(8yDf ,f_W`''@~d`2shn6* ijtfCnof+p fԬIbpS$8 Flb/6Lx-}XfC! kbQfq› XV9y;[qqr&'*;;9{%L@Rŕy `pfJ~3x?AIEOr;N/zM6h#v6f3ٝev(rLa!hl!h#bg%vV؊bf6\n{y?g=V8?uB?^<۪#>WTu#۶RkJuVڊY. #>to0``Z$MG~GEoG4XCӦBY;*:zJ>0}G%map_ŢZm`IXB31^|Ngۜ|L$C'/ԣ4ө5 +!7Ĕވ:Y!-bg`EY ^.\V33y ݐM5٤(@c< t+YND$=ҡO2t}[D %PʿĨB2p <€Gd0˩!]U 4]/K0o,&"ᩱ*xL /\Np($ ȇ"ڷ4Ea J6q_Nl ]F%OI)g-WɈ(-O|Ml:lLD$*818s"OQ$薍Xblfɔ̭d0%Fxj4H$ƞpg6IeP H*0D}GALl)ELFސe)2bQI{ u T?\{1 ax41$ 7+<N,'x;٫fh``fbY_ʰCQ@KմJϧy746epl>YQXë<8/^nnj`hX[ZSZWP tmGlfeܯZdt8{%rFL%+bGlyޕcEn:4}kz ,&krM&,c%Y+" di)62.|ȵvMk{0A\6y!8-V. Mkr.=U-4Y_an&!h_a wM7[ 90g'gW'''%3V;끞ۯՉ9[oC6[7[4WYՖoWtdyh@gXZ\R̰)*̽Maa]T#L X/8r';q) a.R,..˴+vrZSRڙ.71;5-3'U/1!Tkm8gow"a1l.Ľ gW?̛x{ȶnqfnRbqfr|RNbrvNfq ; X0xuAJ@@ QpRѺFZO24ckV=D6z ;xiHl>:lSqd/pzV'og [#YX#\S'- /%(A:3^µL(ҜCNɌ@܆|ƈ,P<璻]ˣ܋\!G|]ǴLӣ.iUJndnS.Oy}awb uvʗg@\jDzt!_F`P:?nCc6)Iw6 xmRjA`)kŏM4)6Jk[+sUK~3;̶ Wx ++@EoE3?r^NPk,-B{a0cʏh[$MEl{mdVcmwPz$d2ŵP)B/,v=vV;+`"4Jک<Z2hr[ihfN$b&V80d2p_(#7*mĬpmVetc:LGI&~:IShmټ6-K SMJ˧miI$]vOН0!0"WZ5/L)< `P=>Lh(J֐Z.}e&x9p9kOn-Sͷm/O!A(_M8v@1&x:xƺuCa5/So%)rD&LƤ fxU98&100644 .gitignore%"L +? ǃdY& Makefile.amL@5Z\쉗 ЉiD[س'T! vx۩v@}/vM.Nc\D"nNfY*\kfAG-,Z *ȪM}IjqI1V-^@/#xƺuCȱ_'̒w XbM0Ә L3xƺu=Hʣi,Kΐ23/ga:91 /xƺu=:ٙ"YwxqČ_Ɍ8 -xƺu9lިa\k(Ӧz̟ x[.PfBFtԜb|IJb$37$H,]stF4'痥%LeBߜt_)xƺu=q%YVEoQ`whs0c2#] )x[.@f xfn^qFfjNJ^f~r~YjQbNd]&" LǹU"xƺuCHGi)J,6IM1y. \x}{8Ty(ACκ"Elq씄j3Mc0͘aθcZQNMVcR(]0*riw,vl%L۶\}J<ڋ\m]=ܬ0T65dϱ ``01dVk;$hgg,,\9Dø#HMt$T&$q%? ,}s206Ki*Od "5 I4w_/-R{*whiM4%}tsJFVʈc,l6Kad}OO .MC{92l5hNZiWڞL'1!(0y&>Һ5$3kyr:硨J>Cl/;6c;l1 ~.`A_Ksh(`+f "rgR{P$*+0[ i[ԩ){ѮEBt*|PXNO\J>wy@išjK$QH~Z34sbJM'OxF?e"JD_:CbH=G L@tۇV$P ?"̩*8f3IyY՘MT2/d3I \z_7+6 ҞQ< JWXh]S(m*YqEt.3br;\ޛ{eʍ]LQq{[2npRfQkuE|3li_EG)T:C$&"&x%uY9Ff;?QU]"AɰÅ~-}}9Or6$K(q&[ɌqNq*~ˀv*h4^CopPż0f1#mx;lafh``fbY_p+Z̓gE8Z=`,ӧ3v6'T.~]@榦'O.aj|{w歕jbdFVOYE|uzBn)=c}k9H 攴g7n<ٶfNif믆EOqo-'Ho(b:נ=׾aEVώPP[ jo17Nݰ^ؖpV1Ģ d}]{ʵ}j!6_bcg ` +R>:&iN!De=XeIjqI1ڄ 7ZWztTgWb#\Ĕ̼b+/|NS/ N1SUvX&ʁni~qӷOxYg|V).Oӱӝn B䛘`nx$zm<1ymk7ϑPg2'xƺuC _|آe>66Zlgs P(I-.)f]XmۗC.lQW;,ei*E0XMa9I_5 ?4<WV^h\"bFs85oaWBLSDk*r&#e48SceLU2+x2CT'0ID+wPrBQk*|UA|P O~mZ@ua;3{Tz6뮮_&1[Wq./Re3U;(1 0RCۊib(˶HH0;D)0*KV|doVv$o'AENTe{8ڵy>@'р."P:IrAV}+?Uͧxqc7:n4܍{^L\(U,)Z1etԦLBh?!DܚL? ȴЧ}DŽHn߿6.t|^%a" 3$˕q~ LU&<:qt![^Pd/R Z>L`E 0/7P8sWz>- ✙S.+;"ġXa/E8A& BӏrK6z!k)]>3 ^sY7/<Kxh66Cv 0bB.:100755t:>%sOJ88100644^cK|U3(O3gW7b(ocxۦHcd%V͹l'y0naxƺuCHkϴ.MZsOƤ6 AxU64&100644 .gitignore)HOH 2"t6~&  Makefile.am/74#NOcsȳ'w^"g{x>}|ĹrSrR7g&7@5e'K3)TOe>Yk׀+a^xx!ӆvŕũ%yJSVpwRE| lGxƺuCMP>mwJK\ylAZ2&w xx!H߮c*ߗhLOUr<\d) |]x ¨YqͪzCO GfxU63&100644 .gitignoreIt_sRPDw&V Makefile.amٖz$r6Cy@'?'q#ixmMj1  Z Y 8?3EqlwN2#T]'BI_sP&%@1 쭷ݩZ+{غ%PvxWP5e2 @*zN7*TkĒy<ԃ#$'pOY`ˠ\?N9YI{Ln| ~Xaŵf?A #e\`q9΅v,\nxuϊ@ǡUVoRH[۵=7mbdI tMI[, )>;&d?-~fO~'7wQD v*t%^ɒvnU]>* : ! K+%T1h5EihѴ #n4/eIb %M^klR̢8x.A[C2@VZ^~K^Gq֑{mڿ}z4#K_EKGQv9 xJf9aq&YP0qU؍e?0(A)-0R=,1ҵ`^v꧛f#v 45 uy͈ǁ%`1qn[җ;y\uDvз1ހ&^bvM{|legb5NF,m zh7,1OC1i9ے8pϖb4 HUy3l&< ւ Ԛ,I7@o7'ŞC=" 'XxaVaXjʕڑŸ_ʇI?+3x WI\97" NWx;l|x4g=`P˩#f~tAxƺuC&9jkŮ6ͰQTѣ+\SFv@$tx+-(т+꽯6fѿ}lkxZKs\G. 2؎mL;.*b)Ҍq⊐[Dǒ\t_);Y`Ta&A */`x 6,8^SwOzֈ|g~Q Mo <|~7^gN7vt*8Vk_-<⇟HqUq:,W?1 M}5Q2I0L򇨆"% )퍝U}f%<.)YȎ5~ыh@"(ʋ::X~P"趺Y|3Kսx;7N`礹X.ԛcSQ@y3?mDPJS rN`-Zq)}/q@ab[avx+v7R2N\MOWBbj򪵑tt9$ ;]4"df]Ջ]mEGӄlD 堆ʰdX>.ـ 4@.-2Fgvy@T %#M ] s. aG!=k/ %4G5>1xbc4l&ExBy *K؎,߆B҉a=,8~"=+Ejî:>s-ġha )QiL^94pw]:E: hHqd” #f穁&8/Hņ^nLra'.fj9s4K<G:yj+Ȇ48 垐[=C17L(ԎWnA҂{*~Vhơܔ7x ԥa9 H43t݃ћtsf&o~1~mj}]\>5 w+ xWUf/oKFB-Lw߮Tǿ^յ1S &{i\zva!e{g?y؇sٺE6om]_&[kk˵*'/>G쯛w G{!0;3;7j#FvióI ZY"AJ^j }jQ> M!Vh ^v}fڧtV YT,R[8q:e:nxu.WoR;rX~[OЇ ڠrqT%|w}3S+>R[J\E!['Z!r]Q򑳅=OrjUu%'G5NpZ]SeY䙍piN9:z ^0 G1݉O\0^moNZ1qHrr ǝڰ#\K ;M6c^GE*ɫxf~m\*qQb!*uEU.'wۢS<"1:e lȯT)Z/=5>6A}| DZZr eUB96 "#0C! +G2!qhIYa k%ۏ%"8S˫r"3Hi60m)hҟ9awhF#C JyU} Aévv=,z>|onT8%וo\t%6*nyhy }g(@~:pٻ0uhG"Fae!3N2UGvѬm:dI(i 6%m;`Μ[mw,W46-užج _ޞ?a(2@噶޷_vӰy.$K,sK`'WbIdZId*M>22YL/UzXY/ͺbDeISwqEG/9p#,9ZjffI~4$M!x! zL?̌~MHq}gϩ?`ǧf$jMLdcFky;ͥ+L@$xf9R/GXw[%.'r^;a>Eq?|xKz |IIe/ IoCX=|X$F]-11hg*2;f+(g,AeQjSTnf7 "S豳a_ N=x wC3ds3˘r&T((Yn G x:| KX M&|esbIdCMqF>%i Ix[? M&O|%SbD1fc3+m3ix0q, Ә M&xmmɜXR1YP]Ls.3 pkx[<, 3 M6ddN,|PT`m vxԒ< >3zroVL,P46ܼ@$ UIx{1uC3@#͛_(q&T(([o ~xۑv4mC63BeĒ %c grx~ PxY|xA6C-}6>ęXR`lnKQE,xRl!&C{6>SL,PQ06l*-W  xkøjdfFaVL% Y47o  |x{UlC23>dk]mVJ%J: ƛn) Cx9cC&3,fĒ %ccy |x{e1H # LxnݙX fx{eq~}]֥Ir%Y3BBCNq8$6kyY&@Wnᄬ/D@d3sJSR/^֪}r} <cpپM#&*xWm ZZ\R̰7+tIkS~Yt*SJ(b[g%'}y.WE/pN:qWo3St-W$+dC(d%甦2ٮ# Oq=nş&` 6w5͏[7:_&lh-I-.)f}Cr;>5wύz~;3=x7^\CEu9/ёriE28wpu?%aCFx ݧ%IJ;$'@ x2z |IIe/ IoCX=|X$F]-11g*2;f+(g,AeQ4jSTnf7 "S豳]+x340031QK,L/Jes~en{!TUnbfNnbCzVu[K.}QԔ%eU0dMd;WE3!/ф*spswwgh=~ˮ+ŶdG (3$ݱ=ӷx"Y'm*tv ve8_}#D/8Y71;5-3'U/1DzD+N+۲,U/7[eƻL5v.k15> 58 D&8ݗyJ :83$=>1as@2CNO0ِo `njXZWpCFq;z>xjlr~^ZfziG G'_sܽ-oN;RBd3sJSR2OL߶lZkW\d&&'$e1rž۷KZqӕwo1-ׄ|j~a )O3DGA$T׷L<$( ɪtjBlIjqI1CCEUK&_(\=||~~N1ÒE l.bm5 7x]~ ˙= ftuE`q- ONTRIBUTINGo 644 CREDITS5ӽLF2ZR Z69TFd\{մ0Ƿ100644 README.md щRU/^d`|d(1U68$fRu 40000 includeSiyR-Nq3|S4N]Ĝ&|eb40000 testshX7j):4] ?jgXxƺuClecz}?=5R(3tVZӏ.0}%?yk[ MxƺuMF%D??tۧZ2sJSR?;-;suJ?ie}Cn_-pӟ%|ބh-I-.)f2y˶w/7=Pb՛itBgs@c x; |@xBå/69X):~?ņ5 ollb7s[|gw>K渿|D!%I/aU[¶,W"*WҸluɺO<]g^_q{㕛.4}:.5jQayWŕ%z fhO\(zyU&ar'dzS>/`,sxƺuCϭ3N>gξ&iL 7kxU32&100644 .gitignoreG>Z#x F3݊h& Makefile.am$E5_ǝ]\G'x"Q6xmAN1 E%XxɊ !3sBfx SN < p ux;fth(s}j'K7z>HedbnqfnbrIf~^^A%[D}+4Ք*{WA@f&&KRK.zPӞ[3Mi0`3o^̼X^:x uL#9 E瓖 8x922VyuK{XU(jU` V՗p zhfs!wxp6+ S@ss&Bej40000 includeժӷ+u&>4}SLҹ;0ep-B6ʿv,ZQ~Xa&.kE\5dx+(#r|"TF g 'x+(#7~_hJ/7io=e x31O1? 5~T?͠/׸y29^4拠M-JO*ڰ:Y䇷"qMiQjNjbq8P;%N^-uRDTUɰ=]qar<ŋN]Is_ľLW%&_`Z#%\{I ?"<  j"6ӷ؟@m@ o'[N`+K-*̿ üA[f[\43j;x+-([ecLysd ,2xZKo2_ܕdIQZH|`%F")Gfg{K M8J!AFn KN!C!%-;N3#WFkn&n\e_<7&\G 'Vv[.\!T_g\q'Xu:1L&fXRihRrACIh[ U+;UOf%=n)&{cV;0s,*1ԩs( {P4 6""Vs5q,X @1wJy\J{%0+8cM #R&Bj^f|Yt {-$6=6`g47Z?r.c SѱL#=.fA@ JoXɰhX!d@!q<\&\*u(L1]xO7 iu0x@aU %m#&lܧKmTC?hudڋ$G>ktpEjؐL8T,p8Y l+x" D:X|E.rwt]ȆYr|ցfuq; FN %S* sסXmhS8XD:^ o48Ifs+\q9w/ +8C S9l1h0Fw25%f) `N١Q24tOs}Hϴڰ!BmmkWAח 8+b|`n(|, רKu>n3t݃1r9eexrǛ_^\_KOMk[Q aȼB،WU福/oKv-.5w߭T&ǿ]X MvC?y0TIulںMWkcG h6G손\z94-٭V3Lgw +x4i `A!05B CUVcFHEM!M\5i4sT^R9*KPFfBxnZHDؓ5B#)4 ! !ك[دKݺ*+BU(NumTH7۵׹ATBON@՗3nB:m(䜼_oe{Rܨ+W|N+5 jL83&4}U" e^7g| JaM:O +6u`(jKP5T#"%cCӓN{/e TG*9?@m9G-Ċ1Z+"JV')Aׇ_s>UqزUyneVMru +u9 id74U4Y쯭ڀNw@̪*RU$[8I{lxuݤZx%;rX~[O;@s!QUZ HM8JP*Flk|OtBCD\QMQ=OjjUɹR&cXީY♏ /#daFD̸_D#ہn8i9 '#kvrp,4شU}M?*”$fAbV Z  Q/[UBu9(Jɍ)[if~}7A-ݼ~P՗sSS\8? 1@pZRFi2-e%,K%annŠgZ`[%8]8\8/xg$̶X] rl-dP (O=}eR!6p{L|A |҅x6GȖ+f`!ԮJE,(cy߬*d':WJlsɷ"(kț\!F,FQWCJi~z.?`~G49j (k;(x2(q%f:"ڱv ~3ZzVܒTIfu`6 E4,`MdnI3'sm˕%-!MMNӶؗ{aq~۳',ņ'2?~ci%mߢ.i4,дE$~gnR vBoZp<~-dJ2Sei̪eUa`f7"&r29v G8m#,y .i]7%36i i5OOׄO19sTO >>=j9ZSڛ,hUj/܊ KpIt -%q9¿ي( pI<ᕋ'x%~)\LߎC~Žt sx; |@xBM*gԵq>!ȕ{^ąENxl-dqj&w]ӷںO2\x8ŬI:HAͭwށ+ZyvG(W%3Re|e }sڱ鑝x`nvkvpغCVƉV9;0 l\x 8 8MehbyjH0ly$\ %Ni)Bi8` Sƒc3RF~رg5E*&$p°vK!T*Y.+s!Bf\ E$0AvlQp;U*.V' # Qj""tf.-a@0&3ȕ]V0hU4vSC D+ D=[6Bv [9W:up(ؑ*;WQyX$OsI9%UJ *I44,SnPyF)*bFRCULi'v7h*^4H]zr/ќ}M"/ -_IHfLb&!Lh f?v|" 'lOI|,zߩX_қC[[;a/dW@V5tBq!EΙ]ލrwTN=Ywn=#z_ _-voJ^=T3kg%>`< oե;.6qܪ`d >0y HrWOglh=Cc&NFu^k7 *\%6ar9W7(1+iA@n(y M˻T]Z|{I@x̻lkaxYNuHoWdg)y/-@eo(fAWcCtli|@:fEݠ"E,xSo UxQ\=S4\FRv^zŷ[^ !hfW/ ڢ x340031QK,L/JeәvQBjeYQƇׅx !|S2sRs*<^|}ӗL+r2Ss *R|N_RU_q֛IW@U•UV0`>+g^~QERPɦݗYr`&~M1xKAuɒ"!(#NTZ ifGXwmfVA4AeTvuE403ye3[B~ڴiRtTRS sp [24N$.`Z * ΤsfGҀan'ejj ^n*ْ3l*rtjRftx$f87v=ϋL "Vn/piF۴WfR[|aOǝ19^t;ҠG2MM&l:iݭ7}M9^<ݚB-@QD)X6NBvw0$ ѕӿA uh \ؑĮBD7_$> E U-z-xǸMn pwl' he:j!>]Rkh[hģ{gs Ŏ.kk 3sWcҙET${랿2rL Fa !%ߦ`9:[t ќp2myP[.eڢ:hQGW bR="x˓x561 ¡ =UIm׵$zȧlɒaB#S-xٙ8 H.!5"k;( JBh6و<u}F8[Y7ouCLbvP=ӧPgٜ2'Ît8._{n1rj|*NǕkyE7bc\> vb7"^|Ý=YALFI7[|vV'Ѱq:R < ݗ&L {4ؐuDPƞ!nZQsG6. Y}YG HsxdnON(LѴQ @ NN-IQHKLI*++MȆ+ML.(ŗ(@TLjiZNbHd,'x b$dإ_Spv@)9x@ 8LgHJH(100644 system.hH[#4&}ѪUfxorpe/6O{ H>x(sCz)%x7%4xƺuCHVnz ?ؔxr kx31 hA ;kl]5d]yr3[}bnk87j-A9)@#^dq?{es>iASZ TzauoE/^Y'3ҢԜTqwnKĝZꤖ ,a{x&Wf:@]}֯&+0KLF$J~D,y?~Dl+o?!<)o?yʓ2Od /WZTAy<.qOi^ Ox; |@xBH/cqo;*v&n|Bፍ9bM\osJYrs̆f&& ŕ%z _}dž:4A?ߨe_ >z>AAI!: 2&ȸ32tx; |@xC7ǭߥLqs8UhPxU[oEV&n.$m*:HUb;hM҄4Ei mTg6Ywf6ƢR /H Ȩ<(!`>\qxZ~62 }?mLM#OP| I G2@bϫ YM̬myXJ>cJc714[Zi۲8!?kQݩXRvugpvK2"5u / !CQTHͥr`j +{hw"T.!O$svC'pz+"\}}zX-toAUEojxOe j7׶,= TOPF#e8SmNqV􏫹AOoLPXiz8[चU1ZM}9)gyϽ3+x>K͕3t˿wT9|rk|? &ep8rTh"Yhh{XqW7uF Iۣ3,ăX2') yͩQ.m3帞iHP,sA N&+ x-=9V;}+un%sF=H_@qϼp,&;|<]7;V._|RǼfvYvYoIzaj*|29WO;RS#/@XVH=Y|iܟX͢ x340031QK,L/JeәvQBjeYQƇׅx !|S2sRs*<^|}ӗL+r2Ss *Rv9V1}-)qfjBU•UV0H.>"p]BZ!JJAX$şl}H-l2 uLu3x;xqBȎKKeNHn_qqc˽Ȼ +x;xqB㒯':+vXX:T o2x04.% hk"4w0g! mxhxHDA/=$3=/(}][7b܌/ܸەѲQER7)83Y7 3>',5G/srngU2?=Q2 h=B 38LٿBwpPaB]盘p_JŵtN:Ʈniq%^O);xR22EV G*xl/100755 39-basic-api_level.pyI?*w E{3L۳#!xJ@QOك_`h[ mbjۊ9P$x!d7GC+(K~.ۙϋN&idn!}1\ckJF q3PǢ(Z{}J u ^8Dm$׫S2>)6!9{n|~>ۧ_Kk ]jEA ٕ]K,q9V`vؑ*aM|nhse$"JFo~KX/5YSl34++F/lxUn@}W D*6rRP+ֻ:v.RȞ=s'/z=*kE' -8ILQL5yvJkVÕ)k+׹NrJsJEYcr ' r] mLOU``9E& ϗMǣoY+t-.|dsoZґڥ23 CMEH .rUy&Ig,&Y V:EP3#цFӠ=9~aΫ tMX;&V! J$Zx FpőlJR7) [*Yiѷ~4}o8.EpndQ* fP 8t6]>Lł&w1h>ӫ(}<[ ! Fp?e/rmAR.6J%,7'(AC>[wu/8bH2#m9Ƚ/{v]k캇ҹOR}Eu)REQfMvv^GQh W< -JIi;: :~AWBJ{YZc;/' jທNj%n4BIӨAt;~AG̞O mhhi(=yQʱΠF(h>Fm[} ol|S5ێv[ 9Q'_440031Q(,.IKf`L\>jr۩R#foAUsC'(()DaUwf4>x;Zs}'$V=cD5 M]VBB/o2NX $x;fthd6b@,ax 3HĔPP鿓 *(x]~ ˙= ftuE`q- ONTRIBUTINGo 644 CREDITS5ӽLF2ZR Z69TFd\{մ0Ƿ100644 README.md щRU/^d`|d(1U6iye>òW40000 includeSiyR-Nq3|S4v\H*# |Ӟ|4E@צ./+py1GĖoASZX*TmWK2%UU2lOW\*~cSlR/dfֈD 2p{Ï%OC?/=y -7='P|[8/PBy[fɖ,XR37/0oЖ?%?)+b롔oxƹs=l$/7|5eZ']b91P 5xۣxKq7䋬!ޞ׳ng >ЏP k?0]G{:ZwHG3P6NݥgKÿGN֗[ݝ-6{tmrM,Eo=MצZp 9ȗC:U=;6-/FonF "sP뺾G3zoԵkf鐮|ou}r $ڝĮMdLR}9:Av:fWcIQĴ2v;KW~J˘ 8\>{}<._8YҀҋo?]:Wc#ɻVJ{"vҧc7_5!`lG'~k~FE<BVk[vʝVbeWyDž5v ;sesXu6A;4&%0$ 9}E<3v#F%nxpRD]pFϩ1>"DzMa y51_ U]XAn-:@H\4AynG*/R%[(K\U#bz}GNcaaaΎ}U ːP Ց@HHQHܪD^C6T]@TYUE^T+s-K%BI_mUR en>ˀ/5lB:Cm,䜬m#rȚBW>YTjDԌ93< g>6@TqUe駃^7 M.@H:)O +6X7[<-FP_'*#Y}O.d̩ D.Asa;`ٔ;cZ+"JV)bwLϡ }au"K*ϭJe>s,QAp.G*:-YAo&R Хo׆,=~>蘾TQU8HP˽k8q㝛Znk9 F(M#Î!hqrUE]z+]Cd U`v3X Hs*Gf zDU\Q =ҍ9,FUGHYjnm&u0DT\#׋uN6<*&!-;a^u{խxp7YABG3qM0BZ*T!;uٙG;-'x'F9H3LTE9Y +/eS_(PŧA!$#RF(AbJ٠@7Ps'Ya[mʛ_MA`%w܈d%mۺ `A}sehaLvuCڨ~R+ ѡx˄9XI1ń ȏ^ڪ Q vh'Y@8K)+eARy\EPyC2 װߘ͠\vҪz)b+aA@_Sfs5E5͆P k621;͏= M"_PG;(x )Hx+G|c6!(fzVhnq"xI*%GpG賰g`^{$7tD{Oڞa2+*)d4eOcn_ G"ECG de,O pj!{>o&/S y}]x}34zm NqjY^s6 NOW|T&6;3ƑHp)#72_jRrI/ =d;m@DC QH6'{#y- &RHڣ > GR֧6h.NCAHgA("jA"e[R]sxƺuBHvIsZ4>;9͍LDaxTnEVPb#R$P$6K8I(׮+Bc[*DxlvffŐX!@ !!-W<sOiZ VٙsΜ~׉& ÷7: V =`L-oriC3cwc=Dx{ksssl;{SI @G1c&r!q)d!͏Zfl+F0Ŧ\c H $>.@ЕB/?ٔ]α&` cBiIvi*x|ݼR%rU"XȽB2r=Xk0y&9 #S >jtT<lyBqtjz*lDIi se$N͚,}\B}^62>Vيi,㼻|5;|>wLDaXDY@'ߝ9Pr!No]~S)L #{EzY]R0<[b4zvUd]1/cX}I1mug摮x31~%{{_"]iX+9yKB9S)E9eE l[ƶ@Ov]'xK~.LGcSYA-zS0t3su3& b9'!ׇz1a!S8!5O=R@YW449˻Vd=~ͻsDlxjήw*5l-Xol ԒĜTdߊwg=sX:1g mhtcf˕*ʜ ;/"43l ys/~SXXk N\JBX˸1s2Kp=v2mܻ֔v櫋l1KMO,,KK͉_~϶7dٶ]"aAECAe=M[-WsEg?Mفk%; 4ڇN9G}2;L$Qg$uY2ZqN]')SA `jx_\xfߕ7rh>޷%ﹺ mد=N L9zPZXpxļ2\GwxB &pqX>᷇߼mͳ 3U~gAK=q{N {]fF hR,ZA\vbpe̬s?]U2^-@ÂRW2|(iq_$vޝ \S= KkZ uۏT[;{n-lN`, 曘`?C`=7"+ .73/8[!7oƾvoi7av^ËRӁnqf~)Gy|S7ٻwτgf<@{z Ε m#ZC)I(*7(<4' GX (B%D^Yd )vXV;5BiP#n }_8U8Z[jU6$uzw7<q x^\CEu9/ѱrx$Z~G&V#=c=ߘZ)8N>Ŭ-YZZT_Y•3Ee: "3EW+(I-KQHMKќ|L,WYSPZUQ$7%_!/D!4$5V$#X (17hdU6lgɴˏyU;)@RӁbev %%VzyzEi%E%yiE@'Vă Q6J#]\Dk+Xj >-F Yo(nx{e0IgEO-5RZ2JRKޤm]V&:J?:ٝIr.Nx{e0!v&2y-TX P(I-.)f}:,U].\ '3)Rx;)xRpHַhYQXë<8/^nnj`hX[ZSZWP`b6R֞k=6_(gyT",{߯ ˖َ]99KQ;k}XOS߷Vi& \l"ni̲f%'?{uw!;~$t)U/ƷY~=֯Nĸ☿rʪ|~2'K|,>[ƒbMAV?Ty=/`o azMzQ=ىKIprpNfq vwY_{ך|u}-٩i9z 1O]1#1iɳE<ڲ5Hs:?D{3Y"?]]XJƂ`L"q3"1xչfh``fbY_ʰNoM\.a.Q-qOR ̦|T֊U@榦 ƺIřɺ%%Ez S{m2ߐmVwJωHFo_[#z7{>Nɋ8\Ʀ <=ZN `ƛg&%găP[sNӕCz=bB"56p&q祦'd%3uXfq&c5 7o\er7e;¦$ܴݣOWׯqdxMha.?2 +sr;X7+ܯU+|20,3284r'+o䶯GXQ>޷%ﹺ mد=N L9=I@{p_҉y+dÏ zu~{xQVow<[ Mq8ZsLc7C&fe%2|h[S[=n5_TYnf^Cqj!Boތ}Ҿo~e2Pg1dXOLl4P!;exU/-&100644 .gitignoreIFWUrP*ձ&8 Makefile.amh?{g%1*lu(,mx'z !wdxg--A!UL}CJxʊ.100755 13-basic-attrs.py_ߙ q]bL>1H?p>* g +uxj--Ixquê x_{~D߉? &F f qy{100755 16-sim-arch_basic.py-iJ_*- `(9d A +xxY-,&100644 .gitignore]i$&NY,yH{Ϻp&?<$r2kKw>d s0  +:NlЖ>Vk:w 8P=x3[w8^Ƥn  ip= ZuOh zviȒ ~ y-eW,9[VHwɮ6mg>K100755py`,u. `}us. k0>j'3?@*[H~7 ?GVa-toȆJBH?QTw.vgx!,,}B bNX=NY^$x{e0!v&2y-TL Qx{e0Ȝלjj21n7sdu& rvx;)xRpȔ7A {g{yXnZwzxեQdrf/F7Xa x{eCY)|g:H^+ޕo!2sJSRlW8O\0tVqpdQ#ŝ߭%!ZKRKޤm]V&:J?:ٝI5x{e0TY/$=!u:< dvx;)xRpLvvȋyY/)BcZvF3 \x{e1Ȓ+tX%uOBeѝL 7 Lxkyfh``fbY_ʰi{& ЪKP}K^azԴ̜T\~ǭmt|ѧaQOQyũz Uws$Y%<\pMI"sSS<)~pl: fn^F$$%3-aRMd[HLx340031QMNMIKehޤTvǤ պM @!71n-﷋ܞ<,sǪCOx31\Z[]mPF,ڂdweDiO]OO&7/ƫllwX]^48o=hgcnIϊ>+ tgGB_wMi׶յUj_| z^p\y*+iKvN VP7Y)>Ǩ)%QAS#|3Tua{T_D!qG`FvR*sHUl,qU :Bxn 3 sv,.:WXl?Rh [ eȌf7R P*lJV%kY".Mb67 U(s}h>װ ,,䜬l_9`M'*5 "Cju:RU eXMdJ`$zI묛u٭ZCjGDϯy{'e[9Ys#K_X)24{G6eΘG%Eb0Ǹ}r)yT>MaW幕>^-ӑg% =(Re6X%+3D!YoE;c]ӗ* T*>}[6x}'nsXWc-'xz$~x1 :ΕCQo~Dj**BU,mzBrT(5=lCϓA+594Յ3U1PŨ*)K ! 8-da 8ՆHu\Ϸ CHlXv>x[~ao&6kƣ"HHh&__\L+qP:S*d.;(rE;$h=iC^큓(r"'3Tyarke!U`Ԓ2z8d[%Hq8#4 =|7,!XYWO!,{uup|(2h8J (g(|S.ٍ3x批_nR8ΐ7_\0gxhFd)N-+uFɀÕv؜fgF8I4r.e\9yKmWJ.nlmhh0j[&:txzq{t9rBj-:ͮI\OP> &>A5  #h-N E <3^/@'yɎ "ZAfL63ɬVD@l-ܬ*M裣WްS}ߔn 3D4AlBiLOcBi:#?C?{cC'F(¢&0Л,hU:z͂3"FA..2% .GXxR.'2  (`WgFxd*$!' 2x;)xRpBHmܑA7=yą'|;0Xcs"u« ڭmƮiA4̌kbq540031QHI`Ȩ+.٢}oUԞIPԼ4dvȋyY/)BcZ"rsŊxn[B}FrF4mxRMkA%9luP1xqIv(=Eŋ w7i{v 9AiÓa$ ]zU5oϝF[~r4~,uj Nt)XK{mXJv/왔 'cuZ"׼=O<~)y{ gkąfb^n8^YnA;*J2 %2pa6 b.Ai'Z?F·ug%$Q=XyaR0E*^}] XM9Okv53>Ǡ\o#SVS%p<5\J1_lw<꺵B6THp_nAOm3N`bH܇I*9դyAT jMc#sݍVS((jELK[o._DP쨋) '`R܃(^d}^bw ʣ.x Kզ/1?]L* "x340031QMNMIKehޤTvǤ պM @!71˕V_/u*Fb?ܰqVx31_b71+^z; x31^Ja?at&jM{:dbr||;?>vŭ=$|zf FX Yx995`MW;b5;aiq100644 api.c}[Rؿ%R(/( 5h{uP}a:'GVdF;1H.qx^ $ M3ſ!5Oα)zinN"iv $ ]q0Ix]20 H}T7x{e1Ȓ+tX%uOBeѝL 7lxȽys*{|x{e1ȍ3M)i]uE.dw&R{=[can5Lɜ rǸyh>zpz?uz"ljйD5%-r,%<) §<Sk5 ]4d fpǂp{Dnb uYx{yz͓m<b899BRK3 RSRJSJ&3gR⚜Y Fs}L̢Ԕ&16r)+Z)+d+ *K2BIBy~QBr~QQjrIN>r,L!R`KKS3tN`R`ʅ0e i΢LU! 9e\ >3"x340031QK,L/Je{ԦŢùr2rpswwgj#j{T%O>(3$\.ƔS ge&*tv ve8_}#D/8Y71;5-3'U/1atZT?_.Uʐپ3?[ȿ7x U̐I[^ߝeٻ(I675UH,-OO+`G^ҿJr<539?/-3dif&^h^^[  PHOfӜe&6ɵ6͂f%甦2]vQ/ f:ŷpƃ|d&&'$e1rž۷KZqӕwo1(A36nr$&AdKRK: g,z=qy63ĔY~F|ȉSyD\< }x[ecou +{w_ĥ/\ƞ5#ѯl=| Oc, 9Pltծz_pXpASJRK%7hRF\o̓3yFI_/K ?x[`6Qy2`nv*Jv޺40000 includezmL!f16M|1 ?Y`XE4@h~)/jxG- .travis.ymlEe4QV\&.md?M 1GG jF+-iUx _\.k̔F ;6x+Nd #Wylb0sd)Lyҽ 2x['Zt c}bSifNBpIbIiqFFIIA~IQbYfnr^~Q~qjrr~n~NfW\nTa[XkgI \\!?p $2 x;reDRs w7.tf߸4ǔ,n%kJx['2SxŠͶ9cx;reQJFQX;,n,x9zmL!f16M|1 ?Y`XE4@Hx ZS+1$ rz @L?xR v`ydK]yW ١J4\Yz.iGVڴ?|輞)XWx BQA9 P@xmy4Lsbs$}4GVz" 6Cw-28|=$ddI/HɖN&zmςrl&{+[[J>e~ɝyG`!ْ6T.GK7g{cx~7IdE2ޅ(oή@_t42\xvT/`Pi[Aq;4Wjꆋ SgNM {Ϙov 4E뷙,iU&2;s:Bcg 8=49QIaIv gwhq}[/;v\^~93|(;Ƀg6 D-'*M=فqS>JGR]a,q7(s@*}+-Lí<ևD8ƣ'+H>?L&135_4E{0=Cfc,j@jP(sY1g +K4fPv5C;WeO~S]O>͐:&QvkYRwߵfDnx[ƌJW |C7T(,,`JfЀM++0}}Dx M9j=C{nq/ir0>lcy }=o>Z<||q$̧zTGٛˬr7Q㯹vVXQN,o x;)xRpȡ O8 YϺc)nKynj]S կޟ640031QH,J-64KfЫL۟_1͵2:LU+.q1?EOnNdMz̒ibƞo4s ]߇ {rzؑ,q%Z{24¯obl&vJ1ZE< (z5^wɉm&TXiub˧pnglfms0Ţ*\l־xk_\Y\ }`cf(}K9TbGxKlXl 44)z/\o-Myo'|$hZm &ylcF MRO`=3ē s4' R c"R?!Eqs&tG^CgE.i>l(|Mգ$}l%:oÆ5~kNJhwR+k̗cF&djEgˣu?㒶 .*^ x;?q Y-&|2Gvje|bNNdC~1c3MZ.jLZQdEG1Ac3STfɎ,ⓗ`MML)3fCĜd%BgX$(5U HEInAQ~Ijr 2(\i~NP9Pdi0Ĕ2#d1WE%P%%< cx%mC3|RĜd%BgX$(5U HEInAQ~Ijr 2(\i~NP9Pd0Ĕ2#dkWE%P2Ru;xYxd V Ҽ<.o-'7,I-J,Ie4yH5W-xxRvlWK,! ?+Ҽ<.mVLD&bg*i0tqA~IH5W-SBxkj0}ͫt;Z*xkm6>,y7xC,:< iy%y\ Zm|'z qg%UM^Pal_\Y_]\_2Ś *#(Vx{UvlK^bnd1+o#JG!4/$3?KAk+%&Bܙ%E%@Uy&[sꁴXsr(;wx~>cC&3<;٩99J:  :\ J T!pnAQ~Ijr HrdwjbJo>yo̒TIR>F'&cx[eFnHHFȎc&?`t: 9x;)xRpCV3gw@c.~K*kj , WNx[eH9d,3t(9uu2S~x8B 3iug&}~.x~VZU(_?m^  Fx7M~i֯ ) ˥K޲ Fx$XnG&f#=_Z)8N>Ŭ-YZZT_Y•3Ee: "3EW+(I-KQHMKќ|L,WYSPZUQ$7%_!/D!4$5V$#X (17hdU6lgɴˏyU޿eAOi#x}UMo7E|-"%#BC]u$H[v s 9t.=¿Oo):ÕV"Q{ofd8 թh #jj C4x0!a Kh{qr|ʕytm5QVRԶ@>fӃ\we[*ŒkapB\FRQ\qià_C@*f3cy;T ErPxILkqe&S z}9.oY<1֋Զ>PC-\L0 :'\ ЄjQ_Wg XNF?6Q_7A$TwgQ>3qja.Ca3Ye>ǀ*^=mR|+ގΜgb2fyW{v̍ˋdlT"SИUt *m FZh1 6YWJ+8M[!z$ªٮ/Zo۹Z;G7Su|wq*|p޹S8ޜȎp4-n+3NF^ S w:&bȓ6/BóMrLftkY v(ڇ\# (#O9mڻ:Tڸt1'9}>[R͂qVoMn]M:sHj-h( Muͱo<a-$nO7&=2VJ`?1.uSũY`wtjjDx[eF&,n=w76$i pxT>-y'j pvRlK@E@֣>tk%ى҃&&M)Zo'$Cx{kG_KAK9(3=DT$XZ_d`Sa8dV奖%炰OL5ƖzJ\\Z f90c.Yx, bpHCZ,N`%u,-.K@|+ 7os?ar/D@R891'GV!>, QT P0'd22l/d 4Kj+!ɓ7x,1$K3-Ċ ,H|PcTWx{kfB _biC/J398UAbFnxc3k.'BQjrYnnq>P((O85/S)Pi-"'q23d7pf|f춞|+ os[33LNl f h*XM~%$y-.Kn4xeftaF3q- x[eFoَ\}TUv P(I-.)fxTj9=mk*ɧuv,Ĥq~ x;)xRpȡ O8 YϺceVEf .9D!(9CL/Azuh#/V1%.Tkk?bx{gg@Di5FN;2fMcVkuA Lt8JS lC]ֶ?%T$yM^xh!4F8@ V:>KXc`d:^*sO@$Vf[x]KK1W\L}tZ4BXEqIjBcRU񿛌.;.Re>(2i\b.3ie /٧ziS ӑ\)?L8g\*UܪXȖ=2GYܦ\~mp oh;&I5uuA'}[bty; 7kޫWU3"Czgp~K Riw1i mxƲ!S891''(8?,5>/17UVҠ"Mj)/,YcJ)I-BK'jJ@6kexkcy˼&O".x{))DIxquê x_{100755 15-basic-resolver.py?<$r2kKU T᪘rCE 5;"Bdp <GBܭ8Cx ))Sk+74G_˓ |x5A 0EAt3KAh ڞfHS6i'VPÍGxnp{_m^j]%Ġ,D->+*(|"d✭8@qQֈ#5$. H-SVͬ, 97#-x 9In'3nf^fqjadvf-vf]lz.N#s\ݤĒTX<(9# ,d *(N-Mɏ/,NNI%SK``CݤdݲԢl@NfYnIqe^rxe7cNV^7QAK 3iug&}~.x~VvAFV+%Ƌj@hL,JXڗE2cb~cd,wx\97pRwuM 8 $ ]q0Ix]2100644 system.cޘ^mD")SDr$L%mx{kjB _biC/JT ( vx+ObhhԢTĒXb+}dDNN^f~QjA~~zfIFi~qjrr~n~NfW\nTaX\Z8A*& 1Q!՞u]M5aGS 1Ril0_7/c(;d*^<sjsZ Q%GA&o\( 6QÚ=ɑqyZS2t z\>[勍t:> quF&[nfJٮmh8r=D5;c-*i,L5`d:0g8Sm={Џ?} J֠"x340031QK,L/Je{ԦŢùr2rpswwgj#j{T%O>(3$[hO חMPs95LOgW`WS;\1ODΉuJ|S2sRsVHKcnϻPeA. K2_5s<MUPN!!~! =oݙX~xRnjsSSҒ< *K4*}P32KKf0Q(WeV;BJ~2Zw̜?朷ҟz*lD63/94%hچܷ4M=9Iũzzy on. Թh2V<uӊŚm&/F_lIjqI1V Ӆ/].sQ|~~N1Cgz- V"cU=u)8 ~x[e1JFQX;މ2DJ+>J0oU0>V{49QGα~{u0qlif!brkH}|.JRK>eo_jU1PbkM376 -|@\G69=g 3`V 5x[eF/GuvlvdgurݖqY{&@PZ\R~5jMRv Ĥ>EMӏ-*aɉ/]8Q*O'ZP %45; '1֎Q~teDd5y *UŃ;<1k5 p/kΒv/<* qbu @i,M2Lmkg|KXޢd#W/9qNrChs$4۹ɐXPf7 BRT]MzɊBL+D/pʱ+i:7AVbY^2пX_F=4VRc )!!ϥwe534>[ŗ a~WxMAJ@E ;\@Az# APЍS$tc wg W^ Lg/jugB=,%Y!J0ڵS^I6uRfhʖd*"@V6(iASrqeaY_0Gѝ{K)y>3 `,Ö_ ҹPld~sCpyl)(9\ C!{`;6*n@zkr x$Q~ffv?W+ɧ%3RR22KRr&L6cQgsbYd&ײJ8`%Ey9 y) eSJ2Rs*J37J1jĕ +(D旤*dd+$%2yۂS6_<x340031QMNMIKe'Rz}Lτ_24cb y 9i/Sۙ*R>tg>x31PNFŢΗT3(7+d3WߞMh>n1:^0$xdKWD+.32bXT.ZSD `'?}2b"dKQӦKdO`6y- }YѼ(B30wbo$=jM1s#5D'MᄃZuKŊLt >%b%xP1w;RqNf6IE R7}qk+DMՎЍYb$qѳL. Qӹ<0w\|O֗Z;PX ^c>^'QSZxL(+`.eILQ>g5أn/_U=+0I0ek<îJ$(wĵ-|? ~MNx w|m?}pO5en?ܜ̄gӐNJY,= ՖUJ)zxWQ5:zKLj9zd}Gd*m_ }﷣j+7K=x+-(Ꙅٯ{u^G;o+'t 5 xuoU68V( @@GjH"RISdbQy4 r.X@’bSKv]@wx[kf=n;gs>?͏Ǟ~;QT42޿<{^:^tOŽ(XwVʍ^L_2vG*ol <[j׆ lܬLgUp -!nΝc!TD4t$խhK#lS7>ˍ'/di9vzdDǹ؍&*:D_ `<7&GQ) 7zGa9_Bwr[=]i9Z@ߟ(G1Ij-dŻm\XmQ2Ox\PXY·P=H="Fw[.vO|6G&O~E{(2y2=a`X_ (O|rH bf|+gAE*2Ehva}:쒻;1Ee#b($!o߰>P :5 㥡,l'I#BA2 mT/i/[aSmIs 8FWH܌~SKcWqJMPIp7X{h0LcthB 7^Xvz%A~kGvXC2qPr94d(w3*e, mm5܈ (KJU5\l=3A03 d?O7N0"U'cX%'$uO5I  &a(ҶC$>,]x6@3Q ,akkkftp4h( ?6W3vg3t#J}Z$]ߺ,QGDo֠(oBEN"?rx%+v sYȄd61{01L?c`\_dYiXLdrFL 3$nM CR/F:Rru M?#bN(QP7;@ߚZБ@ LXT)Nuu>(m#ܒ3өdd)}RURUDt=%Rs4L^I7gURT+r%2jEZTq̝R pMj!`m  Om_-/Т6]zOUp<9>pCMl9~,u 8X!]rͥ9c1M#b,]ɛew\mWW]  8 /9@sێYs`  E+HKx(jG wIJLS?Q0^~0&Z{*1kDqp47Ύ ҧ|jA{tx340031QK,L/JezS.m,;AjBT&fe%20w}L`hɷODs @%d%3d{é:y҃.6)(JMf&ŕɉ99@-sվ Uhg7%oXj׺[F(@l*3;g*w#kPT";aM ע+HC4@U>4MڽqVܖ{W*) > Ktl뉺7k/̂bdKbk8d:sZ32guL Fvn%fh[1e0y2kãG:fmkWtePg#n,yėnGS.\QYsK颥gwͷT.c}bYB`RI^`|,bv;>my?J#+"Yiz2sEW Ud028[Ap`?g/ot,"% hLee+Ov&o^:| 77^ux| |PԼ4!vKmLuKcz }xYh260;|{̧;%M2ioCۄ\G4kRES}/\Ӷ0mpQpbPڼg,<]9N<޲ YEKA'y_L @$#?aѫLfiDtzFzI*/8|b6w&T5 s4S{Jg刧,Ɇ*x;w͕rw~O{]x+ LL 2$;3,637-aą ŕɉ99@5׫nui=p<4:qa#|[޼eX)h cKY期pzaK'L^#iAe!yrO9sS_e1RgŬ-#'/gJAvǤ_2~k_0Iső0%g$Uݾ_j"(+g=ߌ*!J/Ӣw3Ubg'gd[bײe‹*m8?-l#aU\}wEf_sPQyvE\E̲"bnL,Y9@@oC-z,"iKD$kx$},"/e)`_q3gYwdl;dtߦڜV19Ux7)Qf_QYqV_n-qkvES'(ݛlf&["*OY\;kr-AMS"1ZWT3?.5ZL U͇tS#fGxwCKB gbQrnAA^ gW''Ő )r8Y\#B]@3U}Z]O̜"M̼ҔT.4PCuTXi .`2l6M RZsIl~x;R3zC7E̼: ~~: y) !~ΓL+UR\h_\kXRR,;9@@n$|M쓓%''J)Wǧe攤'h/y-ɵ gN`M,*J&]mBbQz|r^BfBi^qfz^jBqB(+$g&g+d*䗧)$=ř1dKuT1q3&m3e u4dm Nbx~"kC53nQzp&̼%"3 9%9EppNnE%pYgs)H|IB8߼JQպ4>hMI*B.PY)*CQO>v½4 1=5(b$Ay%HbՍ3K3SR2,CF^|JjRi:VcHn.Ґg)22*-`r6kp9g-x۾" YMtM&zmb(SYZZ[ V`QIb1\ټuAi|rQjbI*\.PY)*CQoget/M*HLO/(/A(@RXWZ!6!V<$9#>5/%36dgd=42ɉ99p+*SRJSK0"#}[dxk>A1wDgύYLVy9) 6%)9Izv\ʙ0Ԣ|T̼ Ҕ̒v̊EEzJ\\ +[j.N< ;7 1H$ Ҁ.!(řU PgkH85/%31&UkC*x{>q MtM7/cnQ*,IΈOKLSQ /Fݬp4x;0 SMtM7dV*,IΈOKLSQ /F|֮zx)9A3 dD'ύLU s3 L2KKJK3SRxJ[j.N< ;7 1#bL.> (8*$VMKL̃ǻx:;ypZs@dLdeR,*^=4x)\z66Ҽ̼⒢.NN͇1 N l[aaX_W;Uhr=ɳy$ [x{.YzSFIfLc 3 %..}-Lɉ * xԒĜNNC#.Դ̼Tx@#6_a'y0*L>Ȳ߂X899'O|w.9e“ySx߳0 x,sg@D5FΞ;2fe(qqM^&6<3''\xfI].3?c#.NԼ4[Pϐx gx,N:\A&4w!T*9 -x[x8iC;3nQ>r2aNM.+QQ O* mg/)Kk g$għd&UoW]ʬSddPZ )pqV+(9FRF_idN5 9x[4y4Di5'TԔ\;.-Ғ"+_ 4Wb69YDH(TAKkFm9ւd3o2J&fg(('6׳`%eěMM+1lu*P\XT[I,]++)*KN,I5ۼ;7w0#D(77`-B1W ũy)i9@L)wN$$s&+ԝPWP٠TYԞЂ,_u7CM&j<)22)-ju8c#d)cͯ4:P 6s_ƃi72ئ @!7z5x)ck@Di5FN;J&0$e(qq%(&($%għ` \z%٩y@vo@cG[ӎ @ĆS\C嫏jD J9E=. Zi6w7v.,moROJqdtJ2dz)ya ?q;uMqTmR3U2M޸}}Q_^1FI}>uLG}f~G밳jTLEii)N!";4sstm^tp}¢Qǣr%Zg^.%G4?%bX@^+E30qxo-.+bR]xT=oYU1 vB籝`l%Y#B0AɊDX~vF?@ذPljYiEJHS A ~ҾXID%{y?׼ƚ ^,Ѳ]=^sUswၷBzw9(Zg/Z;].>i-}S-tUEgA/@?oم9=w4Q0N]^C8 ( 7h `$,\vqݩD `N6\ Mja(E\@+u F4iU ᕨIfݼ h4ZN' 5[]6e[RF[.:w~tzh[Gcr?v3=Se>1xo0~$1F`CUD yiK-ŕ~ dZ!oO.-A94 J+IKVpw 3wp{Avע0Dm9&oZa0EX f2"`co €>  C0:5j73'|-?95Yox&/uCUEz,]寛g6O'n [+Z ^ϑA z>I{q1d;Vza5Z7&:YB 9ЭI <$bX\-eR_T2yune|lvfBL  Ɣsrq)s)+(d*/ e$t1:MHc8f[SDovPc&'g Pi|qeqhMI*B.PY)*CQO><4 1=5(b$Ay%HbCT 3K3SR2,C\rB/>%54 +1$7[^d)22*-`r6ieQlx)3Cfs/ #uxeJ1azU<['ғ{vv/! } >IR1$3ͼ'%- 6' e9͐.܈IDIco,Bj/gܬНB> BG09Z-4.K Y.SH-5yN=m}R+ LN݆ 4̀#0յiB+TT>^M9zv+]k ɟa:Hwvs|xsC&vf?hng!ؼlviܼY֝x~wwCVJ+ B}vw}ݍaGQl.C:m{mo]:B7|wmyN(SjW*3Y֚-۴];,m )/њr4i?m{SyYo&w֌folFI߼70{>*3l3X$#|;|btCPz&pnʆE`4澶fl1UO f~~uOH7_^>s3ð {DuWPffW_]jڞ}ww?]˫W/޿~~i޾|ӻ@j ې펕혖0W,%ҽŒeCdpm#f˓^ LY˧OoootۧXGZ Nϲɪ)1yO=} XB?KlwLBw͛^~i3.F4n6h0W!.\|%-| hokgIUa7=1IeOl6*F+PD'302f :,>?@(cty;:VcYۏDzr!0O*J͙uR12 \ Bɒl` lXM$΋jv"lew,S |oP׽MuK{B lUErs >L %궖&> `g1P@ mCq&Vݷ9JVM:OHb-W,vtL)eIIvQY"&+|JkH? Ac1ftZ&0T{tvx]dUVtSOÿ&6B7RKTwtSda#=h}1q $#ws\,N`;yz33Ч,Z7^Eمh.XپQ_,d8q0:+d_|"#`\G|׮kG`RlBXNz#T?}80LKDYn"J9rNhaQ:5&[6E|գy,+'pPan}1 |zp&iGޝ@:+-?ESvBdCh]P]ڧ|Xt :|+-5q$Tτ*zVl38U1Ca؊?pw+Yl46泿v*Vemɩ`k_c-Z|>xt)Z@NCtDFO VHUW2IZ7kqK-JZ6>DK8CL=Nn3tͺFhnkL%t| ֌4uK,ܻvW@d 6&&væ@sQ/NfrL0fD%i2/՚/fI~Qu `OUE޼׷M0<|,i[^Qp" Z!iELw+ &$@\F{aWQT 9J$4%H&!2Ոݛ/8`r:fF|\iÙk RwtADYd( HtS"ǎ5DtZu)_NkcqcR∹Z|Y\.p+ϐ_bqCGbgMJgC_*/hA;vMA~r8]=W˚˚oR'CrY!Fd ўĢ|[ hoNMzw/Yr%oKwYALf?no\3_S6,NX9h{26U9mrW`zgPGA~(l7;P3l@ƓR8׌ -!I/h(yTz`9H')NՌ'OAtin"zrTr0;GZo}$:5a{LZum7'4znC7 :ue*I jM6, ݒ=L{4|iZ,pߊ$=J@34S}m|(q{8#c-/b0];|~v^D ]m YD#}H*@3^Aoڐ'`@xE{HDO=2_C#>%BTc@k\py)atZ)·?z"q|\/5] {K`'rO;AN\<wv[\BoK[{=ìVn.]:Wpo\}p năcwH JE20qI3\td%"J׮`[o=nިa;zRwEG;4DOפ4чEkIiO"ГڛA#9.p))`x[t3uC*3nQ>~=̿S 3JtⓊ`BkX#dsJ2 rR+R*rKbO~d,*I,˂8ol I$$!UZo,/j]P $! RVP桨'U9^T_Pp{1 ܌Ă $u%FJ%y)H!NzR/>%54 +1$7G}g)22*-`r6{hawCx)1A9d-3PYTU+N}=#,̀:04cgɂ,L@JEm1fxROKA'hPP/"pP$2 -̠iZgsQwew:}{3vt73?xc]fn0ujP뒨cpRMR4ajxln9*Yo2t>ib,t +)B$4lKؿ`1XĨV0"5Ӭ: a`ex-`2waVO+Z~*30d2;/ncd}D<4~m~+KXBӒk`Q֩JH6VŜ-R*ծƗ)T@tMe'6=\b *n<0Đ)Z-lL&?PeJ?{$сţw}so?mA߫8M'>gopx*uC?BbQrnAA^rf^rNiJL|s#!4g3xT{@63)\ʩ9ũYM9 4 f{*ɢ< QE^t1ɉũ ξA}\89RKJ@n:%nM4LT|=`&aI) *CPu fL;Ί7t_T (@G:r,H6Wy d6(Ax{>u^~{uWLxx{4iKIQjd$rN3'aUe2s'Nf&ɪB?9!NEZxjA1x* 쒸⿃! !tzzjvt=,AdιxYB '/;x(!s/k~:/%j9)А"c*x)Eo9E2VA§`,uOUսY̜?| ZKOFE_[ i9/\ލһv؁JI^$V1y Grr73"wex֚ s,⛟1 :nExV]lUN PQ]NN--ۥ-k ?6;Beb&I|j D0QQI&_4Ac 1&&蛾;3- f̽sssνY[?*l H,@ظo|s;'ˢ -2@ dP &N5љ=9#y33|A ö䣃ct,= 2cG1Be<tjˮZ[9rw\aYޔ3tɾQAAŭĂ\=bS!u; @,i.&uhہZ,vo,jK3E%nyc%UA% R]2_Q=jW!K1&1#c4U)|઻-ΧQj, șRxP-R 7Uca2+5g%"wn޼O|Nȝb^ho𖫳oJ8 FA@' Pj:iC:I[G H̀EɌb@~:G):C\Ѧ 7\;4F. H:"qRK]"Of{rLzl*8Y>WijPL2͛wh/ޜAn%3 ce q ^聜TAcFZKrA0C{ON[˛^S!4t'a ~}kͽ'JiTF{;J%y)_%$D!/^>KpNڜvrY;xffWߦ64m՛9S^ _gۦY"eAfR`hˆRuc3VQ(qPRv$;#CC0?X*t,,2}k y˝g2F+cG: *af"}NiMgY9> r.;h74 $cOs ǻX Y8SbP4?y2ţN'_y !ݺg2͟7GMwJΈ|u?pDk0QgFlȼg\ kUӄ;(_wF|{u%`[<'(G^y܈ ךF=Qi>N k"~^u-8,_m)V`z)Cv6([y6 x{ \Y9J3JK6[ lkCxiٰuZD)+xV]o8|~Ţ 'p촸& 96lE,4)T|fe)\gwgV非FtJs%]444ATH׶غ|jt/nEbmS_J22d}(5q(Uw,ܓΗN-1uJi.hkK}p @$=hm<Ź&QBy=ٔ5_yF{~SF9iZ.u.iKe"S>Cmukftcq"rF2A dͮ֔s/N~w ޭEzH؋נ2%RUHIࡲbR-Vl_uA%\pbF#*J|K\n >r:JgT!Vz(t4jyH_f B0i G,ŋsjE fQ8X=Lb~?bw^i{e0_wzĉ#+MIsS:}@jU5'Jk7Hq/&up0;mF,Ei|s@i)s۟fMVMύv%nVdR_Qa,xκ.fmd桖J(YWX)-_Ņ+viE+Cc  "h<ǃt6>gmTX=BSʈVz[NFL{:!@>v|ü*0sZYZ1 w^5/v=vγ4$L*C"M'2Fl3HnϠ6oL]ô>|ljm bO U QجܣV࿋j،w=  ̥V”;Sӊ\#RU#F{9ԃ))x{72RաLC uk).d, )48m MH0w3^}&K-n:9 N~N0-x+/2F}"L&EOӋȃ *h` X"h9̩sN{)eRJ&)2+ox{=򎟗bh+cϊCkҴte%͟@@Su dPOu%w yIL>~'34gnuy´S?%9 [6 ezZ`clفfvJG\Gw J>1V%=X𼪓p2xXꙴ ugGir֬qdN9]JwcwQJ"s5ߝ |j9'hEH5#oI+.(byN9/`PH7Ζx'?n2Aj, ^%_C F #Tzp8E)%}TN{m!^#oP#۬g`KLD & ^tXIABLSDzш|B<8}Ts֟ Eȹz+*\ǩţm}d# AtH :r3M {̺R^u)j#e66gUp_Dwr 3us0V&[&X.딸j&,q< 1}spÑWo{+(B-m'%i|}]RTߌB֐ 0G9X- ?t+œvL[l9=J9 ,\޶4`PfSd-S,k'?GoQf~uK-W 4o`Mo:{o=@ʘFN]T:TN ` p&yhm T?PkvUK?+(.z >Q^"n cgU)'Ku,Њ l[s.زEiak%ry}~r9.9_M1qu.Rm5'+ ]7- @ " t c/bt֜:5XEVZp,rF7hDv"䋷e5bЎ'U% |!;P,'3_DZϕO*w_D$50ɵ;qǥzY5j4B|͙ks.Vx%#1žaþ#ӯZ7{n,xDѕd*r^fZ$Vp'A zs{x7A;sPTM9iOPʐ^OCœ?_fh>#-­sۇ?_~:g'C{U7jTy `ϭ濥Di* wyD-F8)0b_x匰 ᏧCagJߛTHU v(.!K d`b_/ʸe{e5I[/L yd2&fͱiVv;Wjퟐ>lŪ1@JSo_o286{б!7Z5-8YA\~p[~n RyZI.[GuBrk*H@A@abS:#wxp/s[ pxxJEDA/=$3=/(Jݲ`Khq£y֘:nTeV}<]Cwbk9u3su rKKRf8nH}u injUGA%5e?094}j8W^;LZJRKX'R[)ƙ{<`!)?TYnf^fqj!ЭUws$Y%<\pMIhg2٨z&W>x<ћ$p x#$$ D Db8oZQs `100755 16-sim-arch_basic.pyᓝFbf՗m%gQd gjYrHm0ܓx #!/P$.sqwi (^Hƞ H4x/\~k&Ԣ| D7s0g2OH|CyLɵ<ܙi E ;Yd'ȣm wx['F`)&%'%gh8 3%Md&8 lx[(0o3[i^fqIh⒢Ғ̜b ]<(=gQ-D2=(X$t@ 5834*m 489KKK'˱ʳ:Ovd Qv  (JMLU78/_s#dvQl“yظX@&`5* !JkP~ul6 +dߦe攤}QPZBrI·>f<x˳k+d~f#ĢbM}|5';Hz{((&((8k((WdekhjutLc/-!$M T%P=)%řE%EyJ\ @(qq<`PZZ_Pɕ\R,I-. ,$(辂RP&BvbIЏy% %yug5^dxs+d~ <[[ +. -QI?%L?4'GiiVs C3ɼl9bff%4x;+.;dnfN̼ҔTҼ⒔̝W3[sqq&TLbѐQU ,J-)-Spu*;فUl 83EJQG8599? >(9#(8?,5>/17UCLiE6&kbBL0؈xʼnEȊU+:s3 SsիMtz? LrR&d,.=y.[ 'dWqE%řt0Szd.ɵ\ L\ m)FxJ0BM/BJ-UN>ANA!J % BAU=j z mm/)x340031QK,L/JeXxPUڲ+"&ޫ* !|S2sRs6r?:]6YMPeIiz [|wy&vQj?Cc{{sSSlʼ >n\s,yL͜A''g&1hpf^6d-zZ Q]ZT⓰M1mR%!4>%88ze"t܋>tř K[O|ڑd ,,/J-)K-*XI[[['*/-x'Z3NM5{W [,_rʬUj g xüy=#1SVf<+~Žee1т.f&& ɹIi)ʼnŹz ~^|" w,(&rY|$rt'Yb{ [ y'W\= 5$3G/ap. :u{Z*MEBH)xPdL`!Ry(<ebCkp\9U=mKi+I=,R& E/ 4ߓ"U)  x/BbQfcGX 9953R'۳maj Bx;$MhC>x6~g3+.NN΂̼4 d3ɍl`9WLٜɱMbAx&JhcBV\Ey%iJɓ/ry xW[oEV7I]ǹzuJHM4&J8cfkv׉!J#^ިx& BBrQ// *@*B< 4)Ƀ;9̙dz>_J*ߍfƐ3Q %u#,Edl4p^,2PbTC zN %qh)즾ejϖ(>ZԂ-JsApH0-JJؤfZH# Aa[$L))0asKam@^&'Sl䮷Wfjb_k l DU)D+Ļ.0-'?+qJU'TʋT6L G^^9Hm_(f.noLNeʦz,t'tԸt.P56xE~m5Vt&4T#:Lպ` į2|W'imӷN;ebJ{j`<7EGpP/8,\`:. T69U^?-g, 4LB kңHDyAH{c[m+0 Ku/vme.vW$1#H>j세FY/LQ㙡CIs9@B8 >lc[oqS4AO`@Ջܱ?vvkg25ӂ"zvR(MJ =0N=<&c2] Lo'n7YA8zV o{nOO-)a&TEyMEqNEŀIc°Ym|%bL,bդX=6,rBJdX@. rѱ R5橜ڗJ8(OӿGSo JJ8i;D{%67Oyٓ[@OE6M"WG:K4ifT#RnJ٠8Z{ߓJ+*Iȗ-wv^8^v<~5vz߀@Lϱg?%䧶c^_JD6%g*"yr8bUQl|4@tvUP]C+^Ra|ョ΢`$we)I낿ϩgyf?b2Dx{0dv~A̼ҔTҒ ɷXlȢG$?Lcml1^m)HNf̼̒Ԣɯ%ON$>YJ:nrn@l69LF`rvbbQr&'lC]'L^^Ь`LLQ@QJEDjZ#+.)*M.ϋ/Tf&=`Gs*>m c42!fX\S[|pd0з mmPxM8$f%֛%.0 D+xQKN@C,`S 5Cc,$RXCͶe%mܒc#S Ă p%q pVaîޫthq) iAGQ`#>8I~)QY6~dSfBdHȣ].RY )eȒ` xI':& Җ2NU]SeYZiX&)@iR @Nk9MZt) rGJo){gdda/-[[X#gnPK V2)%Ewl:vJCޮ~˿|/ 00A ԃdA@WG|G}-W,ꘄhj%kPKBd}Gf$5rF-αx;{Yh3[jN^dvfC5}--.-T _Ģ̒ҢTԼbdKVɋ=L3RR\}B@~f^*'1rj^Jf\P'cgH??a6|V6q^ˆl??AYt*?nw|<0x340031QMNMIKehޤTvǤ պM @!71a s]+; x31}ਊ_0nj\V?(x9AJDIGXxf6j\5Ad_l%,͓n3NFݭ5C3܂Ԋ4=cD+Aw6OޏjLcrԢ{C#TI!Р '5tql[>%'ilqC`# *%*d5V E*m8b/v!S/FA+[AdjP8^?m_pR ?yL>^Ymm5DtS;[`<>Lo SD?%;aq OTσw7{d$KabC`->X?Ej )\ZkbkQBxX95pћuoɗ2 m100644 bpf.hvy,zP5Ye"r'nYE֢E*?wG% Nx[ecou +{w_E*jkc^|S &@SpXX)_kz{`4FdFpօ+[ ZZ\R`S.[<ؔ@-|~~N1ÒE l.bm5 %Pt*x+-(=!/k"k[ ?> *'x;)Chȝswm^ƽsU3?7gO,,N-,NN)KfXĨ-n蹾CqmBbQrnXPgכ:{΋+W6 ;~+p=}kmŶTGY0f&@C86Lft\VeYe.I1i[-{}ۿZTvC+64W9?IIck71e0tΙxW]c~A܈\"2C%ˍ=Ti<[= =~ñ#Y KJ0e0h_pΉM#ؓ&b]cvjG_ uwp>;YUZdt~ #O1)JNz*Adml@ѫBKN$h35F V'|Z \~ƶkV&Gb y e;VlL6d5";*Ȉ%l9zON^f:93`9Ow>d>B`)IZw`cf(}K9TWn  x340031QK,L/JeәvQBjeYQƇׅx !|S2sRs*<^|}ӗL+r2Ss *Rxٝ\$vNҨ幍Ppe S8/}{sGqͪd`i"'zX.M0Zx[9|VAU' O*, Xx340031QMNMIKehޤTvǤ պM @!71$6'l_?zt$L<x31 $> MϘ!JMS5O.<ѭ>O1? 5~T?͠/׸y29^4拠M-JO*6u~x_[\<"| ҢԜTqwnKĝZꤖ ,a{x&W;u>qo]2 /0d$p{Kn_zf5tSw,uQ*rYz4-YB'˕gmo_aޠ-3K.~SW3ˣ61xQ]T]H "ᇸmq~).m.?|]rpNsoW;b d|I䳇5;$XaxúuC1e5"3`!A߬{s;)#J \x(_tC`nbvBqQBrFjrNF.\ * 9) Eŕɉ99`z\ax.R07M~i֯ ) ˥100644 CREDITSw>YdYqic1eEAiFTijS100644 SUBMITTING_PATCHES.mda.l}@*TKXMRKDg)RҰTu4J-E3a:QZ40000 testsQ(0H D*jw ؞_ oxV.mailmapgc*{P/^~W|E)TYnf^Cb:"u_i[U%NfB)xV11)GqŠK K㓐I-2QkH[IG7A1d콣 Iѓ< %Oex!11RٳaL : DߺwM VJ100644 db.hĭT..9GII4x]V100644 gen_bpf.cdf= *yEMJГ\}6D5ck .100644 hash.h5q1w k|=g USjEfKhOӎ2$)H㡓x HtIxS9.~8׿@6;GLE ¥" ñMxE]lx7WdptK>PUo߮c*ߗhLOUr<\d%ggx}TKo@VUl7uZ! vܤMj̣jႸ *" I]R;R`7H_pݵc«^kծWonZǽ#3FZk(YՍY]-nd~9U^0vʣGvjUpT{ˮj<|=bHh4eıd!Cp&jݰsn6&qq3wVAI_S`Cy HQI$gbu!~~Ӱʧ tOqW+— I l\alD' xuR 4%R.!nxzaP\'f $(/V(N5>:$6Rxv.mailmapgc*{P/}߼Oocyw>1\s]zCh%0$S$aw.e,. ,myJ}ڢ)^Qz-C'D&sAc:+IM,u:d{; 2E;AOpZ u[`eܥo*vF3; R!3c_W|9M0Lc!jlg)bfvʞ&'禸ۖ㥐a'z;lC _1\3SMJU)̙pn&toFtvFVZWI~(ǵ~O9/X}߼ǂ׉>XxA *-T}㢀91gQ$.QX'GY"'xb`xúuRrqgS"O-lޟcNf& ^x:uC s~dzw}lo[YQVgŋL ֥x340031QMNMIKehޤTvǤ պM @!71qgSZCL[x;0IqW6q.NcS\ݼĒ̲_v3\%΂Sr_#' )>xة5?55?5>1$5OVAH?3/94%U?)X_KAK?(9C891'G79#59[/ysSB nqfnfAr),cX[_Z1 *q.)K=.%%x\$MPi..׈ x'`Og``! +|_lRV;oP؀w +xk13z|yi % %% E%: y9 Ey @<Ē̲TdT.NhGAVA)YIAMMAE#59#_AIHIF!(@APA]8CE]SA7pr& n~H 3 xK6\܅FjgL4.X,'SUBMITTING_PATCHESi+ܑvkWl"^c5Zx<).m.?|]r>.mda.l}@*TK25mx{eC [.kv]0eI&@Sʐ٨X}b5eZ[ޮ2cCU^q[o!ZKRK>*{:pNna[aiݙ8x{DA/=$3=/( t嗒|0U%Eez9  1|}1l9ҫ ݮƉVw31b4&okE+|ݙŮ;wxX9T]H "ᇸmM4J-E3a:QZ40000 testsh͜}ZI݄G 'UdxhPDA/=$3=/(aKJ_j-fͧj&xkdʶYT83W7/5=$,5>?/ xb)xvm(nqfnfAr|qeqrbNN19X|R*./x;vmnRbqfnAZr|r~YjQbz* a$x{e1M`Iflb׳ƺ HΤ' Ux;//kYӌ ,D`w0XYg`[-.X`Y',xgxTiRy!{<' s `x@4娍֑nS=40000 tests2L +1i]WVœG #x!H߮c*ߗhLOUr<\d) |*3xw@p^&&,r9Ez -,r 1\ Q HIrDCLkABEE@9d^22[\YS 1"S0zH68[t6.*uT#r rw Q*%d$N~:95_A:?458ǧvcVci41.̤܂ɱl`AX|Nbs@{0>jG_8uwqws rtwEzMS$ >43'%%V?3/94%xd-\,f#đH tVu/$ s3xOCH.EӰVs͋8lj xTٮiM,WqL;^}  x 娍֑nS='@>CxJAj*ۨnT0 D*P kAwm"!(Y3+uw<şo欻^O<2]e91sn+^bZפczt,dV>I~S6rJ]2kj PϠvh* CTATHcA 7>PPTEknlg#™V21g~Aa]W5xe(ϊ2o Z 1!u@_ONfb%z8#{&`d*>H=X^6NcCG\ܶH$ f@TBg %2$0,!ߴY K$uD}8_\rw<6 K~ZB`51  8r{ a%  #TT R}Q*6r0(;K1a%xMQOkA'i/S*%"}XhwCZS)z`lf,3ɥWx KU<~ ^DݒӼ~u01;ą=!F I}vfid_.ޟ|Y{nٜgvs՞ړ;Νlz0eÀ\{ZLe@#JWǁL!$J5+8QSgQ7FC=S}`H(:Y@p7y&{uZ ]RtJ'Ŋ"EAp -hTc.wyry:-_ܻRA,Ɏ *cf {+[Wl>_h؟g7xRKT?b2e|yF=G׺I@|Q?߮ՂG9/c_ۤ)f2rђxQhR% Sl|^[x{5, ,&o|bY 2 x{e0ɜVLnr[uuΒKObM @$Ṥx$sL XMx{e1GeqT'.-L}+?m; .wx[Hdf= *yEMJГ\}6D5ck .100644 hash.h5q1w k|=g :&rnx{e0ɻW|~wڥ{l-'BIjqI1|ދ',zѣݙ2Mx 󊨐D z՜]'@7PxN--AvWe06%vڨt100755 13-basic-attrs.py3+<\gZKdwI'!jxC*3{f^BQd, zej;;9{9x((%(iZsqf)h%+(*Cd489K3s&;AT!P;x@4f )"阒40000 testsftröFyhRޓG cOx{e1|ދ',zѣݙ` )x; |@xBH_u1 z7'..4jg#`1)F'_e׋[q͇ת]ry($e0Y2ADGӤBtOlT>=5/> M/!7 tgwF,״w2/hxpr}dHx=T ,ʙy9) J9EuXԥ&˛o^%UȌ|Bc+#D7\wiSxMJA4 b'  O%NVY7s!w힗Tl\ y WKq.bew~7Vyb׊-bzz?Tw(Kt)*\^]u"uېSpA:8`QJ'R0%ՀH[pog"Iwl'ME9fYM]*d9&@#)"cw-])Lf7f䊤< b)g;q;BhR ۑm,M{^ o'|xxYx{e1@.M+l N: &Te;} ]x!--Ixquê x_{\+7x{e1Ȗoug5κ^+ݙ>-x{e0;wXTن0gZm2Y 1x; |@xH{5;^0Qys G # Zx{e1ȷk1W}:+dw& =x340031QMNMIKehޤTvǤ պM @!71 6; slEx31 $> MϘ!JMS5O.<ѭ>O1? 5~T?͠/׸y29^4拠M-JO*6u~x_[\<"| ҢԜTqwnKĝZꤖ ,a{x&WY LVᕻ3l4dfֈD 2p{Ï%OC?/=yH:Y;gӺ(,shPBy[fɖ,XR37/0oЖ?%?)+`ox% BY 24+@e  4xA :ad+8ړ <x?˰W^%QW #Lxu1K@9BsXA /"hlΈQS !$Mrn4DHcᏰ_{"{3oӷsr}FT"O84A$gNxa0[TD@BaYo1 ROK; d8FA!l 1LU;k_TrS(_W:G{ A^auj_x+-(%Ef2۞XN;9YK Z =x{} ;3sJSR2Rs R6oa^X59BJ8D$#U!(9C!1/e_ue$];-XzgvA\@+2`QSP$U0,R'oNQndnM-BS8@Ӓ'F2 =7_/dnZ`=f2l@r_ƪp,MAJx;xqBe.iV}{pBTD[']xeQ=OA>)]Hb@BH2Dq`Bec{]kv.*HW;APs_&Xi77+׷+?;U~ӆ8XRy1,5րC|pdpr;n#8f ;CךLABlRz $а++{)])3֩X_/=#6Űb'!0f+k!I>[oJ (&b dX?϶E)"LgA0 Uii B8pْaPubQ{Z gbk k؁v_~9 $S tJkyWvһz)}zP~_Hz9=q}x -IDàͰMvҸœ 5x340031QMNMIKehޤTvǤ պM @!71t7黟' -a8ox31Nxx!ChȾ7/\Yڴal l}9}x['xW`+$vGv7GZG=&qtpxP9Ee4QV\M~oei~}n/Y&j3qqa?sb''ڝhb y9) k߱`!ț{2yX<,#1,sys}KL%% f(a`x(sK9;{΀[=Q9<5Shx cpEXZ*JÔEBwͣ x[̲eC2CR~[m-}̋/p2sJSRe,\e+:3Yw3b@Nx cpEXZ*JÔEBwͣ )x+-(U_ o.uQ9U yx}YsG/)dWZ-\c\)ҮD\&mzvW;h<RTƵvR.Qܹ$@QŁNrGqJ~3`^g~3oucMۮ/Ͽ ##:LўK{ijS_F)2R~rr}篍t||iޔy-~rOh70' pkr xR9|h_ҿoVGA?`9/$ȡdw:OEʀku3⋪xNH7 7! +?-ݷ2R 8#(7ۓ-UCd e`_mn XAXcavAw_cD 8ʐ۵^5nCD\*PU^J<ײD\"NnP%P&꓉ HvA\&"Aq e߮>& /R =fQ@o/Q P*K?N Qh$HvFҩOyj]ɺY݊Tm1J}D>}Xߎxq=)S(\(wN? v",AW\E.RoZR_D*0>,Y<ҧke:r,DEba}H $+BS~ʼ!UEO1nwƻx%;rP~[G⇁CР\98J@&*>-T%ʂڶgz.*4@,JU"Q6< ɹRH1{Z=ֈ{\BEx#,5Hl@|\90DTR#l%TLBZvfòq6jZ;.u+KM:k־GEL\S}6ʿV|!*ueUN]vQNvI$.zLGC'UQDNV?f +%@ .B0:%ePp8J#1 l@6( IVXaigsSP9{ɝԽ<&$Yڶ.2*@P\F9Z)]ﲺovBO =yeR!:So47)Fژk;Q0#a -0 s)%v,T UQD '8Bp {E< e'+!֕l5y!_Q_ l0f#cuj~tQ}hGVhz"GԀ28GųTt^H8Ǖ?~; u(@\958oF˨g 6^o/R W~$>˭8#4 zxPQ =mgNH>P R%qT>XéNt=(z%ybT;N3 L1YwS2dQxu2 :plNulb3i$2rC.㜼6x+%Q۴C6 D44 R-n{~ z~ek:o9!5BGk/7돃b O}lBAHgA(i GC2q̭ ) yfa#l 3V* yf2Qp>T)u 7<&r29@lTr PMa5Sxfh&܀}M>2Y|LHpͧ5 kx[eQ Ox2s[AK֪`1x9~hI\f =iQN拊ݓ6꒞H ~"@r3x!ChBMv +'rJ}yrBe_})㒿//040031QH,JM,-,NN)Kfw8^S{ lKݛh!2?=o2mͩvprS-'{忊8='/` JxN{.׮X 9Jשg" Oe.xuqLV`Wy3Q}ոk7_|٭f&yF.U2G j&*RZ3 Qn|,u#ތ?d6iL$'"j#0o6bGNOll'rUJVdKRk3yff7fa)>7cc,g@a"y/۽N<۪8YEVdlYˢ+:o&G؈_1AվdO:9yN_7gɫ`B܆kɷXDl~.4å3a3&kʊ|[T:_}{b>HV}J[8ަɲaoa7y%Z]!GgxxN0l|UZd&/*la}d6Y\~nAAT}1r$VX!G_3g7V_Xf3ɏ,D~\Azo}߻5{);Y]N$bv#Oϕϵ8η%qD\vD%6Kb'of7i(CCVN+˝TR2W|nAx9~hI\f =iQN拊ݓ6|QJ* EY@гxR v`ydK](W ١J4\YziGVڴ?|輞Z)jx9~hI\f =iQN拊ݓ6 ;W҆fл}PtE@ҙ=xdlXl 44)z/\o-Myo'|$hZm &ylcF MRO`=3ē s4' R c"R?!EqvFWpR@;^Q/!d 蠓1&tG^CgEi>l(|Mգ$}Zl%:oÆ5~kNJhwRk̗cF&djEgˣuY?㒶(9u3x[eF&,n=w76$i =x[eFoَ\}TUv P(I-.)fvoNf-<~CZIL )Mx[eFG"Ny*f.Ĥy 6x:))'T᪘rCE 5;"Bdp <GBMx[eH9d,3t(9u44x[eF }KL]͗dfzHu`$& hx )) \49ycT8\ݓ 0Yxs eaUT=\]4sҋ2RK2KsrRS48'2<'l qxM7cNV^7QAKAFV+%Ƌj@hL,JXڗE2cb~cI!]x7<+?.MҕOs2KK-x yhF?Ye@jx ޘ^mD")SDr$0x;)xRpȡ O8 YϺco  )xi0/4ǡHn\eZD -x F E=@܂ Lx7]`^&&,w)pqf$ge(d@J $7bZXJ,J-(HJpnqeqrbNN1D?LI9̆hppi@QA` U-KLI,I%trkJuhkpOǬhb\\9Iũc$x7G`}*Վp~FI~A|RifNJJf~f^rNiJ* Ua,ݴOg]OFt%|\ a6KxZsyZ,HSzn/x[eFe͕HpbWG5[zDx;)xRpV^+B:G}b Ox[#AzB_biC/JXxBIFfBybw̚b)iy AA~&#o0*%d(%d+)&'(MNə|]trxn)7O NC..}i9`'rK0+hOQݬi*60c19xM<)`G1x[eF~F$GHK{IL >xU)(&100644 .gitignoreF6*Ub")Dx(& Makefile.amM~\ƵIH+'c5#_.x;ͲUJK/ Ld̼BLAFř@ĒT.# `bQrF|%_PZ_\Yel-ON-s'nx[ʺuR&qcCݤdݲԢl.L cx yDv'3nf^fqjadvf-vf]lz.N#s\ݤĒTX<(9# ,d *(N-Mɏ/,NNI%SK``CݤdݲԢl..׈ Yv^A%wD9*50It]CSJRK!ApinBȃ%P{_+dă9+*D'T7xWBu!::g(&Uw47R nո7R_qA@340000 tests<TbǮhĄ?( %Rfx[eF#(j_L(!}x;)xRpCH ҥs4؊>3Kus;+c_٬5{/]vGZ̿ f&& ŕ%z &W6n_o{<+QT5 \5~^d4y# 6x;)xRpC.Ȓ7gedXw,Ekr# fxZ]l\Gn&%c;)ۉ^qk'qb'kIܽ;{ލVxxH"e>C @Cl[w_]ctn^ hnuy{f0|nTuj$jOB~!2S9RID7 R{$7Ne)GOrR+XS#exm. )=UsS6}'`bRbFŴ(ɸl|!Ԙ!T@ɨ^]ݢ;10Tٴ45~qaWG޾!7݅J/\zͫ8~șU]lbzr t-UHxvi?_ۡ;] ٞ㒌\Di!reʷ&f@8'\jQݣmE8#@,R#0:Bl"NuӪؙ}U})1m4^ݾe;6|ݧw:uDR{iv fz}8ԑbK7fGp3#¥gX2ɳ.f6}Sw]!h5QJٺoަR?{@f8R>% ;4!&n|~OkjV痹]t7[ `?zJ&$EϐI[C[:Vr.usbWg=~~tN44 n+ M:N"mKV|p ^(N,|0'g7Hi ױ,ʭ΍W\?`"à)(q{(<_zi%aƇ#dOeo_l}{Ёd ﰏGαdOhORlܱ3N^CM72l"۷-O//i5`R~9k; "4}6^XCk<;-F!=Z2mJA C1\[fF1r oG<_or%phH"Ly4 z pg${5) Wn}A.<:&$1):DjFٔ4Cٰf^wVwlya6fW̝ԖV9z{dfFS sb`M_3l-l:▭²}LzMzq u_68o{PRzr{dZ{RW ^[["(:j%ԄK*&hAF#>AP"! Y6ua:--hHFM:5:$ 66*iˬ*3 h ƻOzrkmRgK 뽍c{GUpM 89r=W:"۠>N4Ft #fϗot@- Q BEmHbu>Q*C $=Q7DX:q}TZ%暎k\tV{?Utmݪ<8: oۊ6Bl'DD^p@lm,̞^vԯ辒2xn`58o煩mV۱ -`g<LUV\+ja!P%_%nD}P% N03Fq`Ny$ p-M"%ZAd eTdQ9sC[Y&ua`1آlI fqӤزAqy,=1!w$rE-牐ـfSIG@+XLDkaU*;tzL@ l징Qm1f׫ELX®e; ջp=y'"N!-^ϲg n >9.rX8+!(Uo֬x!΍C7E!^zDu qRL7^;R Dzr$#kqMCvD=RT(> W @$Ey0&@B9bh "uq"(q'Ge{ 6yQ~<~>A^bÄ)`WUW5n{:lΖ'j]E J9Qv6Հ_͚EDoRa>G5E YyU: O/<%Ǔm2f^έ\tM#^Ay(P)gr7 _*12Թ7O=|JEGM#fw}q:I_-'Ni:JAUt2&+Scf 2Y֙h Dfb{B9dkkkdɋ #Pቾ#AkKJT-tm:>FNLr@*eϞJ$4 x "[V˳)!9f:d|!:y&ynVrRږwbEț@~!5*HxQnWǦh5ɾ?y3('ל|%ڜ91|`0YHP m4e3h3?#X(6IxlV4*Y&i;TwZ| +⭶! U+[m`Nl3^@Kg'K xSmySk6jϯz-{ G@0[t}U`[AuڥV{x^rD;s[T}Y6 1QyDK+@A=,ݠ{q/eh6le`B!L6Ak@GD @<2mƩP+=ZY6sNj~[3qx>wpmSEHFU &x[ic %|9@B77?(ucFQ [x{*\xB_biC/JX % !x[#OrB_biC/JXxBIFfBybw̚b)iy AA~&#9ۅJ x340031QK,L/JeәvQBjeYQƇׅx !|S2sRs*<^|}ӗL+r2Ss *RuW| \feU**+U椘_y_c_ipe% E ,og|qET4n8ZKD mxn0^ }=q"lliC8 ,:YgrG"FxkiP̗XP$tsR77wv /x[eFg柯:1)Z "b -x yh+zPVH@RSxxKL}( څev3oFIT%jQ1w$hHo6;A"? דl8D+:"vČB s[}4Gosm h0&_Se}Y.i%6S:ohB$q {lMXvz>^d+kzAUcƒE2VZ>w8CFzSCmoJl G!pZ[.1TԓgյPɁS~}g4jNͦ$ 8amղ'̥Zx;)xRpCV3gw@c.~K*kj , WQx[9+k5V̼%"32"%9p+-\:EFfpb OVZA 16B26( ]x5-gC-3><Ky2St,7?/HΌ̏/JMLJ[J)pqV+(ʔeB.?(-4$-lfk]'6/*x[x!iv=c-}2zr-`26ɝbOvҦxM < (` 1$n"S[lli__6|yQfI*XgnYnl kqj^ vd|"| J>9儘h"0p̍'Wllj9nNs b@o .BYQQi 6Ҥ< ܌Ă $uU 3K3^LD Yt{.%z)I00CrZ/LEiđ258ExMOPΗXP$tsR76s:  xVoUV7MZhl7iN֎`Y^**iҊejk?; k{!n&p\B !S9D\H? @*8DBBB$o}3f;߭|Mg fk6_)j֪K@ erbu[J rUT(i f~EI^3韽tGx],ZĆB}W_f^!*qqeEQ|KK $,/C$&^pʵ{Ut7p[П:$ۼC~V6]0Pҷw:ggd3tWӯ}_8к"D;p$鋙T*C/oK< ^,+s3WWs^y䉧^XFf3}]̊>3!~d d{Y ^\>GF`{z*-e$JDad[_t21F UniE *af^2UcbD`k*6(b8 g }/s\n6nQsj} a*$j1[=pFG}1{7_< )?A?Ct з5Â$Iu)~CVl&3Ư>bK*XYt BH,bxF>z/K8`!Fu@8Ji+ApKB_B$lӟFcw}Ԉ~B-$_b5f_"I$lʹ0#:+G xq+>|T6᭓g}mӾqYZHK[D> ,y ,!34j-E1D߀QCC?*G4Ѩ>GvGfYcRyc g $ 哅SZ%bQdT ]u,^1x iYIw"J.@$ I?|,41̼ҔT-L%ҭf|MB9B7Nhfy&|׍:?puZM+DkIjqI1CEZ_v&`sQz;1x340031QMNMIKe'Rz}Lτ_24cb y o3-Qf>%/g\x31iASZ TFƷpE`4E9ũ@ܖ;yI-XQU%tŅL"فUwL}2_d&Y%&_`Z#%\{I ?"<  j"gYrOTi@ o'[nx+-(RjԻt/Q^xU}| >xu[oEǕHQkRE-7*Xa7JZDYeo nR  ^ws۝9X?3;gf|n\\̛[Vy^ghF|{UoqGIaP7ˎ. mO\ 5b>~!X^XY_/- XkH:+l b :iH#)@^^KZ10~g,vwخNz4GWo :FQV[7FϠRy9=$J%:,{#w XӎPBUy+^Q9H<@S43pt%1C[N$gnf:@ !]-L%݌uLEO?<'oCp*A0u pz/TqIG"3 F鎶k%νrbQB~*(E ?~D*R22 O%wdd2jZG#%T7ȋGoV" 0t;|mDQLU|xĶldγ8?E@fE/]ͬQx/onZ*a=>}XcW_ a[, TA-aҋ}mϏљa{|f4@Y}I.Sv#zt(㯴eoO ӧڒ(30/RPyOw(ӧDXf\Qqx=S*J*=G9 {≅ Y\x[K~ǀ]z&GU8T3g棒 nF床%Av ш˩TP; Y8tQz9IkYBl L*AȞKmn1PE42*䖀*|S(8C 9!\bxuiq |9@B77?(ucb- qx"Zlr‰ek1HA"xU('&100644 .gitignoreQ@՝\dxj& Makefile.aml]`zl?q'w# x;"Vff6w80ovm`\J Kx[eB9:0/;rjDۂNe_p6MY7 LLr2Ss 2d:]sdҭy6NRM @(޾!B%j 5F"[Z\Rpyzwi3Z]7ҕ}_;C3}VWNH\g;Ox+-(R\;=uxOLh@ &xmy[MpJ.oپTwpW&czTUO 9*~ ):)]m$_BG oZMҔ,h$Hs2SH^܂@2GEpg1Km1Rx1|J{Pnq %\ , s'X6Y*݃ג[{T.{ItqtgT .Ź*G"w.aASH<dYhh$hd'~gD*F/PX1>, Cfes<~a+#<֔Ǘ5`z3jHVODlsȗbG'n>ߘ8`/mtxF.)b ]3 x1'CkV'u}߃4 妀En>!u^k2my|ڵ'P!n.zRP*+@tEtukƕi\rֹeV cv]v9߈o"VcÙ/ƌX"\qG[0rgLogOёpykǻ\( ٘wmKG9վkaPU/8: 3PpSJ98A ːD {.: peqh::"Uɦ>9e[ XNJ-GǞH&]glMj;萁ݿk$e BQ-Sq7:ǕO9!y;.@`woɸ{Ck{ʇuAp*z(ˑcR- @ Z~g'~ʠxy"͝JBmh@Lr%NI'̅@`U15ѩxCgtzs-JCI2]DroϦo*WlIk `Ӥr!ʇ@(F\ IQE:;mh=?ӝgjݲB/ER̅r_S3|$Y}=  @mtgoߖ8hi@9_2M̺"{]j{x;)xRpVr32Z5M ,x;2O?Krf^rNiJRbQrnAA^ bcKY^1e(d+*Xsqf&(" -߱3Oʡ*ԡɩ@n1VQ'rhDWS,V2Y2 bHZtE U07er-e|~2yfC䁴&H̳@pf)h(B\" 9Jp0 IJĀ2,dxԀBР,PP>Dp yY&7OL3A+&6JSZ.f+ j0CLa{ǂX!*X1ba2rxWoUOEfbiHZhg6li*MBbavٙe. .M6dl|w[4{~rN?}MuϨjDe83b9 'Թt>VYtLVFGLN@e2#n@Ega5@@li*J7(6ӭuy,;tip9aϞo!12= |J Lf8jfl0%cI_Z5<i]9sLijFXB%2+zo/G/e%V2*+3rMxuճEq:fW'.t"(!B|o_mi^졎^e{?g8WN龡OJywCg@vQPVd 9c })6xb&xlў>2 7h'Sx>πhMGoS\L*VAD ͆[aꋜtx:ŭlQ8D0U V\CMT-* vge%Kp rohjY "TJcȽwSBS$t=4D BSDʪFmGmr#nK@cD:4QV:ۆľJ%[()]kZ@z`mw} iuW\[K۱Q/d,s@n&l`IR]|$i(%;";i4sMXq|2r1t8tUOr?2wK&';'<9qF!s{ꤻv&u!@MN y[9+m@k@VRbYRm7 %Ji]c#B[e(9Wt2*(t'Mx0?tiH*gEbNsb͸:/[{/UAAlQe mP m4OɛDǮ&Zpd2KgvpgDU%쁤AR5,:t;DgnlM}y9"rLbR>$]΀Mh,:ⷃJW%! *Uz?ʃ\P5t>iE88z@꤬Wr XMb7>wf# 顲6b},#bjȅ_\te&6';Eϑ=9̔F$\ր.nĞ3Vk!xI&gup]ׂsӱDXs7;^dAs[. G eȷ'IV:f=ȗtޛzW/\<0jXϻqyT]~ܐʲ[d5ђ4ggs/ !7SX\XKD;dq <ޞ5U891$fy,z#S_ TRT13F̞["*:)1BVQx2m dvv~g3+.N΢ԒҢ< D>hRf&9J\ɉũ ξA@h ( 64@VV P]f vw{Ba,bVkϲ**XO6`ߜ(hG^ x340031QK,L/JeәvQBjeYQƇׅx !|S2sRs*<^|}ӗL+r2Ss *R5Jk|L+`-y娚 EeÕ1aev uS Kmx'GrBD-U<-Frxةfh``fbY_/ԦWn}%&bw֖RDF8lJ(bv?'G)LQ}p0 [g-zX̝v\$^Xtemx|2߹ me_yeO$ws'H:TL83W7(9#>)83Ysݒ}:}*[yӗ7p2FOg7CI>>09[r3L'/r:1o*吷Va$uȤ['}a{eEUkm`tp5"'1nnRt7;K=a[J R=J^ǯ0y7b9IiI9%%z 3YK|m̺߅B 5L\y]Dh4cRZ\R\ϰd:J1i=A"6 DtTX+鳉 v2ǡ"Kx_yÃr9'NOAS]Sv ËŽNs?] p֊"z0`ũ)ŕɉ99@'S+3_wy=j:էTl^M]W8[ccs+~. flVZV t*%:- %|Hx Izl.VvjmOIs\Kuq8Si&dQoEX&fe%2^zJμؽaSLN-XcRUYZtzI|n 5\b|tt`iP|)[{zsC|Sܥ?<z>7xJAM`+;l@.BH.QAPdrs{KOA͏Gt28x9}ۺDF6hԩ PBv1'|zvm oÝu^PE5W{2#ԄeR@5kfrĴF]nG6*q9rO6,D$amD'ƇbWuS5ox˳w+d~楓?1k8(($(ir)A^bJJ|QiN*\6 t~Aj~Y rs pk-+_[($,⓷M~¢ 3,TH ,%9z` 2(駤(M>jQXYahf0._r:xgC,򓷱M~¢fZY^_Zɥiz))E9p5IEٛUY#AxcB%On~~QCQjJFbOys fxüy7ȂƵ+& N+1P?Yq. E x;$xCxC>x6~g+.NN΂̼4 ɍl@q3t34XS6'$/lli"Y  ˑ =|)^xW[OGV x8o9lbX%@ZІ Sgֻ"ھ$}Q{S+їR^KVRU}jgv@ w3gOf/+\qUlMR 0r:Jae! *膈5 "K}0E@VSS웙*(AM9Mt|KJ.n`ڳ%JO`K20plx2tJ)f U H}͹Ym7a HK`m@\&97S,䞧2N1Z 9M^yʪl%W/*b@< Pղl^Ed|~ 9Z 0i@ ţӣH@yH{c[m+ 0+ssKu/vmy6vW$1#H>n세FYOpqCIҫM|~8|.Ow3۵8A}䑗c@Ջܶ?v @~3J{xjEƊ`:&cX! Ljz|9spԬCRvjN]A̔0I`&8CQޯӘ0,jvwL((Cdf xR3٣pAogp_ sEtl CT/!8|jgj"[`լmᄁ8W6{InΘoeyRFbא)~/z@w?0%UiN )M YWgKak:}K(p",v%`'TuR%Q(\ZG} SaGSk JJ8i;xk%65<ɇ@T "&Xyi-:KHifT#2( J=l|(e>4c~OZF{+-6 _eW({ {aiV5j)V/5a>"fKjN7'` JˋiT Qh9P^vOcQƴ 82_oT4==p)8x`Fe bͅgWVX X`~5SرFۛ V15Ǟ)!?ڗ+ȯlb|tDN23by򰳫6]Za?(Rɐ<*JvI+ k{wŏp+-QqZzW%$Q$_!7$#U$(=DAK@/hZFI~ 0 Q@QJEDjZ#+.)*M.ϋ/Tf&=`gs*>m c42!fXrS[|pd0п mmPM8$f%֛%.0s 1xRn@U( Jp"Ƃ&UT V 2^U2~r@8rl(-oͼy?o-d`8S(P .e͈d/?8a=lt>ZRJA.KeV"Ky*Z&Dt"3s4L$n%V}huThlu/z{"1p>3am @sz϶XCiQ 8RKgӣ ]RY:mi%:#;.O߯Lh4o.OT-itCM& ᵀ0sZ&3 ZaE'*dOz4{W߮X,'[+-pgs1*|zIUuH}ZJ |n]y6{> x[e1JFQX;މ2BJ+>J0oU0>V{db ) X/4t"Sʐt*keǶiRϷ(8Ϻ6yYwI[ҁkpNDkIjqI1]X%>cPlT>??atw]u@2G>ۙ.iXSx[eF{&,/ 96pא)<0xBUDA/=$3=/(fRҎ3͵%mTc&)Yx?עk5 21FEl7*nc3wrqxajӕ9h+.L>.}1 }}?,f.Ώ -S̝ sSSC3\ĢdJ'uK:lUO_ ܜ$={]Բ%?jtF)Or% ݙ\,-izۊ 3{'m"n=U9WSكQ'׈\YnJѵL^/%m +%tJ8x ־+-~{ElF`/''d$%3dq.293| $:^3QcKӇ֎suьUKIjqIq=ÒD*v{}+8sQ`,Qaat֯d&*.&dBJbo/}e~ 8=Mu=L95 /;tmhY+ZgtXuW''toOp|eO0[W֞WPqjfFFx5A'v]l£K*ٯS0TobvjZfN^b.CþSI5f/3sAA7TYnf^fqj!Uws$X%<\pMIhZqf~CluMMqt@Jw,x{کfh``fbY_/ԦWn}%&bw֖Rժ t3suSK+sr8WD,YoPHD(CS榦 8T2\h+;$h\%P`WZ\R4xZ>[71;5-3'U/16hԑ[i\K>{X惂2aw{x Yz'3nf^fqjadvf-vf]l&.N#s\ݤĒTX<(9# ,d *(N-Mɏ/,NN<.. *j^"sNJRKjj/w2#"[x,}JfV).Nc\ԒĜ?Xs㕟F#x+-(vӥO*o 0VxA ̂! Ɩ7rOq89C]@3U}Z]O̜"M̼ҔT.4PCuTXi .`2l6M RZsbf*xJ[A1"WB1iPQbvnq2&Wo\B P(馋>Hgօ|-)9?{z_g6h4vPĻ2wfrɲV]t7XQU^Rfg|,O8kİ)C\'R@u #%b,C&nٙ,PM("wdy)RmPJ먼~42`T<{}cDiRj7qj\unaG߳esT(ۂog>.,a*%VGC}fP"Lh PaKfCy:ksv1;\b7N=R\TV/CIW+ج K6OWs2R[xuXyleۯ\kn6A60RoYa C@* .QBPg@4&B?$-=w/@ j .-TWdEŽU+`5eWLQ>!xh1f>g*.+1;cIg#\ S{{a7QoH b>!Fo){N)o)EH V M5gIiؕ LW2Tߤr7XnC qf]p VrT$[<-8cJ6bqE$A#f$ؘJ)wB #RY"Xʠ>y m/1`z7&b[sZ٢yѬѣ@45 ]b9}Re$$xmW 壭A58tՠ5QnMSxjb{0qnNV`7\sѤ*+q+ZKpYfYw`VXNU`=B*}5ޢo"֌']$4Ai 4j`_~WAi N&hq]A?ZtNGun!Ё[#צdžݮ3zpG-a=^Dl=zpܪnyr ` EaR#N-F,)#boeXBl;}x41&B bql_%ϳiֈSńrC&PaB M: 3bf5#+3b5C.ud_ְs X < ;,X΂C|F٧-%" /Xo[1'jinoh#j)=ʮF 60GmbtvdhN=Iٯّ_lkB e uP>U쇛1?R>Mт}-8U0klěĊpm'](y%yQD D&F<1.>|ImBa.ilO#|Zm]{ (/HYΒh[;p|͎n,q'Q Ĥ~ tB.LyOW^][|Hw|yƍ&na _p3ͼ6<X'ٞng_^CFZ=Cx!`f̈́zo ސڸOM#{2 x[#iC;3nQ>r2aNM.+QQ O* mg cli_TWW\RWY!59KFfs*H|IN1Baj FPyfIrF|j^JfbPfե:EFfp @Bgcl,elAvIp#Bx[x+y4Di5'TԔ\;.-Ғ"+_ 4Wb69YDH(TAKkFm9ւd3o2J&fg(('6׳`%eěMM+1lu*P\XT[I,]++)*KN,I5ۼ;7w0#D(77`-B{:Ɩ@%y%EpcHMΒٜ$85/%-3;Ήė#tk5Ye̒x<dag2WN\Oi1PY!Km~"L Z7DNۼA65Q}<7YxmX[hF#[ݺKuuwvmi 1RҲήƚ̜%m^J\Z~T(uPh1~ !pBܖҷ6}CK3gf_O_ҝ]>G]%YE nQjz ~vk^:^mn({uF բڧ{ e=(ٕnxz.^])no)kk]F#mv-/@Կ^ۭ4U䫺́2l"=%r֤M?(M.ƨ%ށ*(Rdӱަw:D'C<+\BDz|7V!@EEzaEJ=׵rgQЊ||洨䛋X82q5AV@t^ܚ oZj ;sMsahc}; mDG1 =*kb( 8.îEQUfAR{A@KkR۵IU[YK6tt>nvEQչmʥԳ"|g'pzD59~arĮYUGs&I4F!{uLSA ._z1`olSm} \U}w^`ئvdz kv%vJ_ǥ7R!z]*5BCHĮ0KpE.Svk% ><|G@TWiG%z2s^:0Iyw-`90:lTBxtGEG74Xi*|00*h|:wGٞɂLhTPsw}8 ?܋@;gp!:rDCxqhTUy9ίfd&Cb,KЄjPN|/Ns%F5cp;֡F9Bۄ<鍱s*Ր<p17SHA,ib)eZW?c|{LfUc%jw̐oXhOX_f8[A4LTU/WMGty@BFȏ!U5)fI.H->'ltMW`ybJ$x61Lil Cjm0meu~>Q܊F*r+ +8JJlx]QVz|ixu\HB@ <-~ ϋ Lvf|J*>\1uYC8ULd)Gad72Yx-fL,L&jX[Ze@wfԎ-J1GMXKAåKUΪj ܛ묶+;%beh,T~ҰkUhË́xyFi7.r &4ZĹjZrMp\*&^x08dd3~Q3tƌI K1|vE6ԡ/W#2얠]UjQî\:ݐ 3+T3qӳW.(rʰ"lnInchA*Bfn\NyFsMZaYt"4v'hq MGoDQ*cKR1Ea-1O[ogXء&pA_kx`X$u1 쁍=\ 6SjQJ[^]X`_/dc[P`5+'ī! cldbWӨm*h/g$?' F\ϱHVh` "s+zrÏ[o10<&+ws5SInNPܕkH㐦 FhbѬh\kD§Kkb$G|0`qȄ}41yW`i$ޯc.+*~r3IA<0mIGmOj<~'Dg߈^V qvs(f-iox]NB1E+NpF!T$^.Dk!!q\bjKm&;k)PͫS2@}|d0δAZw7Z?åV&'#f1~*tjev?u*d[nԎI,ȑ3FY\\~=7t] Oi9<ַ*nHnW[nBG+aJWɐ: W-~>1~gx["yn=#ݢdS-}2zr5 dV)(6Nj $eA19 J㓋RKRrp!Z.j%HQi 6Ҥ< ܌Ă $uU 3K3SR2,C^^|JjRiz|qj תrrzxUoUVnINۄW()UB!Ve~vV q8q' !$z@B UOJA{q$,7yk?!: Y۞Q&Ha\y1<6 \t .3t4!|puUh&Jzskp7oRU67]TIvtU[k j}cM]_~MU^>0@} Eh~|^Psܙ W@xMȃ^_[w`oiq\-CR" ΦapcԠeq\0@M ,%wbRQJ|p ]A")+fpB?BLs8mѲz$Pk:-vaP>lۍpo*q~p##'^:}.u(JS?m>J}ufvE!t1JIs͒myu5vY^RlP|eG5ba?===W{uȭ#Y+п;B2H"NKe!ό;_aZr~|{@Ů/.iAa؄|S-:-()^C%yN,+,3hGD}N!y2?!J 287=ruvVqc#Ij|P SX1x1G}NR~?iw)9>ߧ%8} 4n]v R~a@8Qu@8A5c:`D/פETvqĽ(I"oetAҖ]o<9\(exqiYʃf !B~~yd;,ObsҜ.hYv&+WOavZG=zѾr^ tkkۖ=ry4!_٘n4]lAM@3 1 |j3p Y"iT"_FQg"3\M&1- h_̦ 6[\HeB {x)Mr7Y6qs)hMᲝɦ;0v^BqeJNɱLS*(Mf&6B볃 6de4t./D;b3~Dz:̚3Dxx+ssFgLRf\)iy A~ JEzJ\ʙy9) J)I\WjEIjQdGn1x@2JxĜTɜ)XeKs5@:&А"-d@kKg祦(4h"[OւjEљ[M &{:bu|3xU_oVWڵYl!U8$iJC4pK֕ Rd ؑ1Uho{} ɂ kO>ƯƣbtԳ6ՓafJ! !x:{*&蝦-XZzW<"ajuS]ER>mRkw %j@iWhQQdbʺ1%Z, TksuvPq@ӴoRUv=P$i0ABoR uJdͲ`Bz ~N_GHƦn6!kaZӲWy8reʚ9 qk=cgdI KDw(l^V.^Y=}罝 !ba˞_JIH1Tr%R׆Qdk52v>C.]TX{d6>IlyOsKWAh,9ۆKQ4kk}zi:)I7m7v1[ >(K|z?. xo6A{|1P8߬\/kۧdu` |/.2E=ஊXōRTd}޿|D&Q^^4.hH&Fl[.r&ө{62J׺Ά {_斢l(lď뗅#CP ;P}ڭ㕼r!>jjVٿ<{:¼ R\t6\!@oYһI(LVzlzxx./p᧨MTt2Xf> h5ĶnZ@t>͆)H|0:/M]ٽOkbx+Xb9dGnRyy% E ZE`&V&q OvۼKqw6 LxMk@iwmw#E"Enk]VZЊ++dLBfB)"IeA(IE8( ƥEbAa$e-FFH"kV*ڂ0ˠ 6yԘl sKCDeq=: !dԂӮhiZ~hrJm FcBF%ճcxd<2aתm1{9_5LONMS+F9,Fy6MlVvd]UO {!HoUTV縈#l&2 ؤ^/'O׳2V%KA8W(:AᬡvaP@s:4~yOEt"l <Bo}i$V&CK𗬗~=V?&׻O#g_z*2mgх8.ޖ~ {rFI#韂-x s,⛟1 L.|S 7Gx;*T&STAZ2Wnf^fqjF!K&k#s\]l|RNv|qIbI*X0(9#Œ/(N-Mɏ/,NNZA4x[#OrC4BIFfBybw̚b)iy AA~&#9:x[eCH~QÔ+p#o4.@x+-(yQXޚsNv M#-d`-h+Mj݉\,?9/CBX5Cw=ʚbS+ 8y[15{(^Ćt3|6 9ZBf Гc7_?x?4N@ ?4}xX 0=5k1p64B BDIP廏240000 tests?4N@ Y,'&x+-(-sգ)S7_fݭ7 'x;pi1 V\\Z ٩% e6׸x B 1x;)xRp[  MMzUe0Txp/55hح_PIa럯#0HځZ#ğ{xn,w]F@%TEJV}YCa_T;YHqs{"#mLa]xo@Ǖ4"jZJ"h*J:J"!J $ Lc9U] ;#" 1us'p~w^(蛣2l6/>TJX*XXXq`TMvۊvd1e &)Xqm .$Phcqla8lDW 0;Ȱߨq  E5BE\{hX(/J*2"DF /:PN} 44Qsڭ}un(*PhdePE~IB%z UߍO '+ :\Z~S0C٩RM*ܫ#VK,*bRf k!BrTdi ^/=?#^ |/X5"s;|T6^)f7?`vꫡhbPřVD'l5H#d;lO_n˖E`f^KEbXLC䶇2ð;\&jc{C} u ²:ɖ˓!NȞE >ƣ֌(jPf9,jSh=>.-d+MR.5<{uTsOJ=\(:B!h(B2V;fa9li;o_ -Axo:BG= \ 7_Uint sys = rule->syscall; y { /*8*1:0 HG #} M#9xmj0%ta/1BL:ut$MBOҡԷ(B&￟W1׫i[V(lE-?jrVh+͠rO}DoaLtǘh18܊1/nLIzΆsZ` ٢ ;_= 1F?B2D?6jjh3@+-cͲ N.ǰtk-*ݲ_݂xWoUOEvbiH>(3ma UBB0;vw2?fby1z6hѓ1r?{ofw-x~??OOM++c=^9 JN'ٙhvSvZr}JǪ{ LM;̬Z̬ w@RDid2<%=baf$Tkc1+G|0@["N>k`Yn͛Wfg872W.-g0"gfP|{)㖐A%SHi,GR"%vkԁc)`v ƳFW.DZ& rLdlqieWzՃ=tde2JHD8W4n]&zzXe{vfyq/}2Q;nC$%D)?=YӷUwtk> ;7#I)ON-[]Oa݅nqhn,mFea +-.T,semMaaRkm"Aup8b֔SM4hׇc-$6pH&Z9N88g}FOYc(w%@* "|5)HRmfQFC(%("r6n?ZnTsВ!qlxO:S5>UD@9#ifNk)&='!:xu1K1vIN'QĂ|nwA:A%!@+INq 8K67P+7NS>7_GΠr=YGz.Jr"sxOj6B +Ji-;sVq& 0*%ܔE<, Րeom˻j[-,oZs BDyhTUiR+IШR9zܟI"3s3g73-?p?>q[S]CmX%ކjG[K)-au ~a=p{mo}- _cm/b )wOJEM[fOrf-2,30`/A:5#eDt{ GrY&Rq!.-eɋNjB85R6]7mR!5=a}"8@(=!%WLB"H $J5/-:˸S;)snLM IsZvtthq[׼I^%&<$@WaKѲ_E`o'm~o;߅/;.EL"W|kRj i{6c) |¥=ږHY/AC04bj xM,:R c靭#da IY7K3Y7H?A훶n}}SJH$-Wlb7mcK)6j }cvw?5/\xjv/?=xyR o6m7u 8qׅVD˚m-@ o Dhc!^*e3\C"jƇԯ6vaey~ImO7|ӱEXʠ'yׄC9 {bhS]Bnen@ѽg7vރO4Dϲ^綂IkФ,Vhp镎 2r ~3NT ^OYqˢ|ȵϡ.2< w˳״˗/d{C#lh#`k:1dґii۶IkzMd 92m,c\jgO#v ygAyov On PH@L[RA.m WYQ\CC!c9k\ (,k ^=DYG'EEM Ub7x, IiL9Ac8Qi6%rP6Y; ~Q Yǥǂc 6GOTufsJ2cN > j e [Q_ܰS_޲SXII/|IWmOJJ_X.ruSbo^\j|ҳ++s+SEǢQvI$-H}'?J$v!kԦ.^%Mڨ)Q&28_d&FE7mUe<3Axlyl*wclȃ ba'\nxjnW|Tz'ƈxìyfILw ݲB/T4ц$V#k>2MLZuLΎ=cDžUYrk鸦E'kPm%`7{dz?SxH~֭:̓ìh-.vBDA % u aG+!sɏ VFz^ZܦnغK-0}> "@v*#_eťݢ6!ïWkSw+^#9 `b[pD#G%ID T'krD@|\ J RgO",l#LQIͣ:iF}pȏFgȲց EXs49f %Y ]:_FU3ÁlK&0dAAҤXP>,b]eDPFE3ui0)`ٹeB]ցH#-ʆ@A|Aml7Mh-.:W Pβ*gSrG1*QR| hnf9XyȽDyYaM7* ">˖~ZYcvZ0,*h}1tޅ3̓ < %p@ n9Zݚ7&Uc`У|V[Y"dㅐB87Vf xw(/H]0;{aP)u@{c5Al VHa.wP0<^-VC% pFr K)LKŝPm TSӑʘ擃ώAl%dAXgÅ6xe Sk ]vM,ydj~<7SWdR{w`]Ȃzj^+Av)nOzHmF* u }쵱]1Z yOcN*I%M[5'~z 6>N ORIQ]fyX|D2wT_gBݛ&g&s#q6Y=;juja(flxQ@$(RܧGlZPڞ9=l߈I (݌;GP?\ZZuy=b'/'ۜN 9pjzϪ#J x 9$[ e& \y ItJP-;7%(㎮2 흄% 0Q2"d],&XI>Ayʱ>oF2憉WBRi)ABL eqVq͂4 HKhE p"ӗ*i6d2e2M̉zChlbɢ^xoJ-hmbfUP}}U%bSa^f4k3<>S*p0^v˧8@,'r yHZۢ/Kf0$&j1`)/њ](/.,m | lRq<&P@30HyM3r4bu8u >viG<F^wƩV/v >w%:sTy'_y>x sweT@ [/x[eFWIg'ด*o}_γR %xi{Ym'dZBx[7*cȑWq?9=龷y(ޭa(ۓJi<=[<%kz~n'lh< 9H[ÓIvh1Y+Cyua] m5B)1HG^ԓTk-!_;*kIL Nt M $x~Rl",U٧ݱ8o7 4$!g:é|ɈקnZ`M&EZ100644 arch-x86.hO^&ػ>c3q(hGWraDj76)HUiKM@K·צ5100644 arch.hT8r%g-v;7aHt1 ~x>sGzNĜT[ĢxlR:\XQ(d_HF/-3$LQiNj|bJ \֚ @$xk|̽&s=^qeqrbNN|Qjq~NYj|^bnBnfAI<6Y.,Jsh*ES^Y8$SZ,(*IOLI ZOeV0N7!\" Gx}{s@F f悂j`z&4H|r#,b4 X!63,"HV$#UQ<:UR~~BqIQfr.M.QHIO,ȌY\bjrUsqf($&VL) r?F/\\P%@) xgPx_Lj*\\@œ_r[)#z@I D=lBǐP_ɨ@*RKTtĜLP" ǃB/(x2C')t< DxsCtZfNIjQ|QjyQfIFR~~BqIQfr,*xνsKYDi F.'1d&eq)g%甦*ؤ&glƬa3KD̲\fr̆0.V_$x}VoUVQJDE2(5NR㨑$ٷč-G8q ;R N;̼];mf7|3?﫯?nyr>Kxg|yHE1D݋GKj8~*TD?'˧_݋^}tYTfbmG16|FG2_O.k*cP^{) $gmOrA8賩~$U-xކ3Hy|@ipYPsʒrtwxA{AX)5ժr(Eh,e,xΓj.&q3d0^˿:GB:@S2@z&:->K<6Y*[!,*;3 ]%N&y)B),A!Eé"1)VRRx_b9<+[2 .c[ wX'JɪN;d2 kIh$#THmdkKT!ݪ7\X$C\6tᖤ8S\aaVHۛ7*ji4ۚV8hWrY5a-f|y#VrV{e$KwP;'$CD]Y}X͟~v=o+$ r%x EZ Z 8؅kvֶᓓ/lFL4;$񱓼UO"R7̑p߱U5KN>?:j8yz|x51vqp2ҒzU*^kTm%*Aݳ;z4!9Wog1>/ 8LS1:YV[ٮ Bw r&wФ}zf۰(XӥڍLiQ "imNäW]wI4Vq$S\1L^SV^7 !MX<439jAy(EKfꏟE'&fӝO&q ,&4<b4C ,uЎî"Ѳpk-y³mRmDP¹]oSc͖czD6&>fvcZYmDNRb_SX_<3 ̺NTܩ9jbmr%1U:F Zu4Ej F^2v顾UCsz۵gwHGtQ-NZq(O b; fx}J0$^"Bo'|"1iZ,0͗%Y74UjQSCL{\2Tukru*!P{gwc^XϤO3Sjy=obT)9yѠXLPu)𹑻Ex.ȳ0p'ʔ:o'UH%n h 9b;z̵\vx[eFc6Շ*6 ӾTaHx.9O浽Qu`P9kdMjnoP#eĩ_2Wl~/EL5gϠ䩓Ji6qNK =xndc\nr'OIvnB>[/romfzT Da)ϓTk~/;N8N%_׻K_k1 *7!O5ؓRl ܉'|#'{g; O{ϱxHzMuvgT5@Z0ʈ q:q2a8ZmE;< UqP hE7s*$o .h S100644 arch.hìRGۥ >q_ |100644 db.c2NU<;G9JE|}100644 db.h9NɛEl9zO100644 ge8dk"x;ǹsZk.Qkx͹֚ q=1xkýa>M,V̵\42jx{̽{CNFZk.5+6x[̳a-,̵\3R6k.xɹ֚ =7Exν{C>&{FZk.3k}xk`y˼#s5tkmxkc̼#s5kx{ys%Zk.l4x&uXj_n$k6_IM\͝^w>"@(7ZWJx@T $g7IQY-dumyHp@q쐄8!M+M!t\ff{3 .}=$Bd|-$n%QĄЃ9ZM{ECD[.hoR)OJPi;dlځC=[jӣ7@O?]=f'XBucf`{pc{(84|T:|<>]8һ\Gmx\bٰ̂ܐ,Yo;.Ax'nz.ˉrL!A@;1ģkR`?b}|? Q>)`Qnjϋs#pyY`iNק|fiNBD]m}Gyd;NOaO?\fFOGz1t5Ͼ[g߯ ũƕ܁*)L۵Ct@ 3w o 4\{ \9ϊ3,AQ(2(rS[U‘\>M70\2@̂ @h䫛'.t V|R]`4 `B8=UQ|OQf/B!ħawqwν>+cT9NL=ž9}N]{ޛ0G;P>1kloOl5Z0%%I&M|}piC`bn} FaZcC#]yl5+T< t\Ƿxc۸2g G,:ml~kRQ/[!ٹ&ݑK6`UX C3DkFH؃I3v1@dzt|p$-AWM5 ~|<"qtL:y=+A߼ Mv 5.Z%E]Z-Qk3R `iV'Ps{_fod)B`n'v>=~2(1!.8{ȣn ݩSGهk 7Z^}/IJBɃjH*{ z ~Ah(dJh"IPց1nm19;68J GgN6(d0z0 $oV5J3ڔ[݄Cqv/0A l+ `3S!jrM> b ?(tzD! il 'QEyC0aOAdfi ZFA) a%]L3H0>),]+2q,a1I^ID[Հ^sq=dj:+ Sq<{? Spd>8?booq"}n]lA[vR%)G ֺieR@h- a6 l:*"HU'"l ;DG83v 펓L@(dC`&/Z4D|+~pvmuT#+& 2fc7Q T"Yƺ(&|Z]סRu'NaY "54 k"ԦM5)׻|%h^:rޗ8a}y0).L=ϑ~`;25Pn B2Ij R1`=~oP}@!ŶA I ZݣQ?UHy< *dd8NK׌7Vo+;m"fqZojCzV!oa\}jX8Ob^CZOI~(w~rz/&"dWd竧!9?&[ft9>[uݹsG.y@uj% mWfp-&AT3iYRC1k矕'ذ SŃ孫 U4YYK/f4^˒&t*E0yXXեXY`B~FsqUb?\iؒ<ʼQ`ǴhV1۰Cq p[OF᎒bԦFUP#:wq-NjtuqKdaOh'1vkd(cq-0*9|8t|NR0[=o:x߭E]95/%3 /eGHx[eF33_߰˦Ed] kCjx;wRp'lҕ [f($d%3r(g V<1#(NgBaĜb>#}n~Dje-)TVawU3D~/7ka}QIڞ-\'/`ikZ%V}v&Y9ϾK_(W~iwdzcKdz߿%k#Md$5@@eQճhu_31e0Rh3Zߩ%+uzȢ(TeW9&tu("2W)>2Y_ 0zkA߿ sq4=nƂ*!qB̥36O='pAlr"&;HmHrQw!'' Of7Ud< š @2hnS2|i/W%}r$j(05sҵ:ME-A o۾_&+Pǩ"nڌPT4)B3WڑD?&dc63Ir^7˳;T\f,"aPӔHmf@̧VUfkL>¦/T9?R&g2;[B+u߲cWSH 8x;)xRpBȒKUKaJ'.85A?u~&_^ah``fbX[aaQHJU .>ʋ*%aGf]7ekSwgc lwO4{4W*_52+#ijs߫L.ynɲ|"TEJFRl~6^5,7Ag00{pls,U==OO<݂BnZx&!evy% %E% E)i Z D(f#Js@r%:\ `08gXebQz|r~i^I|nbHHs3<.@?x{s^⒢ĂҜ-SӚK95/%3  x[.c9}ҜTT̜"h> I9 %E%:\@firBJR|bAf&100644 db.hhX+A5^x-:?n)+3G5&? 1 197rؾ>xߥ3j}PXٕSR2Ӹ Yx[eFMKw햜,VrMR+xvZ޶cwqfߒt#e*=ӮaCowwjh4 4c4-}S&X9j100644 db.h y*n^A4txiq V'(o,ȸY[yc]d${ '7|E7\ÿ,qrtGs&?NH+Q(JVUuuQYb 5Vld&ϫQk/-;!陓w-|{zde:g&f*$*e%*$T*)d Z\p&/əSU TDq!K8kAR JN]&V (4&-WӂV, L++Mj'\&ϋd3+f +gK2tهݚZԜTXд췲6ױ}Vxҙe vɋD&_e|߉ { -x  Kn觢RpAQ@ gx;)xRp  MMjPXS)${]0УgT|'"&ϱ4jnK CcյTP $x5+g{ޤĢ"%# OD 3ss3RS~AƖR :\ J2E%8t6ǗZXSys./T[3 x1 幒2St&odݼK~|Arf|nnf~|Qjb P&>>/(UJVZA U($.lMEi9%iM-,4aL.l:8 tx2L X2'Og26,w? 93>773?(51EIG!>>/(UJVZA U($.@=QԢҜ4EM57;5z x4qt e2St&?a2|]v|Arf|nnf~|Qjb P2>>/(UJVZA U($."ݫ"t ?dY2'_g662Fv|Arf|nnf~|QjbB||_P|BgLyQfI*]`E8RKsJ&/c162ܜt6 mx45eC0oRbQQfj aaD||_P|BgLyQfI*]`y2Ei9%i)`M6o<;3 0x=elaޤĢ"%c38 3ss3RS~AƖR :\ J2E%8t6OiO-JK,)IKlW,;;x3bx9~[ O^n6y "xt!idMښ4Z $x3L Fr\IEEEJ: yEL6/HΌ̏/JMLJ[J)pqV+(ʔe,*ʑZXS69QQXszon4 Sx%e0oRbQQfjf*D||_P|BgLyQfI*]`͕2ռEi9%i)`M6\w2 _xK[a0oRbQQfjI9 3ss3RS~AƖR :\ J2E%8t6*%攤m6l}2 ^x[e1JFQX;މ2BJ+>J0oU0>V{db ) X/4t"SPHn= _: 8r4FIylN}V1kͨ=m%% '?zykwr{y&T>??atw]u@2G>ۙ_Tx[eFͧnw˗p0*D0=45 C;x;wRp'lҕ [f($d%3r(g V<1#(NgBaĜbYrTY:_h;O"ą";]8Ǜ|tx–]n_'0f7Yp̜ sDj.М;"b['LV`*"c`KڳHM^ΔۥO?}š`"a)J-(H }ۿ0d_TE"QW{]UCRX_bEgqYĪN$+r5zK-&b`dzcKd.r*,Njaa~E-w$Wφ}\PPKj}_Y"P[T B+᳖U0v:npPq ˏN-5{q wnb``up(Y|~ƹշD.7!, 2-cݡ5S]=7a~70K;Ƭ%%|'g\lBvH[ ]nVOIq+5tU g.Q|jeMlf"$/3Ovo7gw6XDHà)Oc̀O+|M_DCݩy7Ls:aLddvvW,e3zO:x;)xRpCH}wN}:ź Ea훻X )ix[eFn^ʛ} qUcIL Q ': xBUDA/=$3=/(fRҎ3͵%mTc&)Yx?עk5 21FEl7*nc3wrqxajӕ9h+.L>.}1 }}?,f.Ώ -S̝ sSSC3\ĢdJ'uK:lUO_ ܜ$={]Բ%?jtF)Or% ݙ\,-izۊ 3{7](ukDNcx,7nZo'/sö:z< kߕ"6Y_an~z#sϒ rKKRf8nH}u V@k(1́CWkǹމĪ$aɊu"i=bz΃E0mP0:W2g Jg2v~!%eC1Ev߷L2?KrO{~6@4i3D`:,: SKS+srNV8f'ztOk+8k3p#x # pdQ%W\)71;5-3'U/1aߩ?e3Kй ,73/89L, j.&R$4RӁY83?!R&͇K:x d%;{x[eCHdD# >|,\"i4ۜͩ=fmJRKn9<9o.1U]ύ*S̰gM}Z]U:M q#LH67xBUDA/=$3=/(fRҎ3͵%mTeV}<]Cwbk3pwS(b2 {*g&%g'%g&T2|8y[ᴏWOe=~RP&}}(PQۧ&qKN~Ɲ)rEN'MSe֊9L#=Yˊ1Jy|~+Y/n ^eElO0mV]Xٻy=BFK'(_#rrfv+EzC\=y!8Н%)I8/Xz w+}T_\X7ŹwFϬ[?](4,Z?xDa,MZ;ΕN V-%% KVH=sD-i@zY>^P:kn ))s.d_7<8/sx40`0NZ8V}3_)tXuW''toOp|eO0[W֞WPqjfFFx5A`]LKM曘PTR͟?L\P UYZtwI|&n 5\b|tEEřy ׭77i>7]'+ td^x:%%DX@cresୟ>X \$ x8.ܝ\ $(x[eFofuTG lSoPaj B6x;wRp'lҕ [f($d%3r(g V<1#(NgBaĜbYrTY:_h;O"ą"GK}G?߭ '0f_5e}mj٧{>O^##"V.9)w6T,r73*y\J[ٳ˙s{si']X,\| 3E@Uao쫚H$ʟ}7`HKhtL<.kXdEn\oer_,l[oliev\NTxѓ9,Oٚbzp:ۿ/t2 wq^Ԓ:Yk=KdQzK d"sv[{;|ֲn^ S>.x2aѩf/n]AMLu .%O8f;du{De;fʁK]W|&,OtfiWu?ؘUUۻ⁢̲"g?R~H7{kL`jmnOrXJ=9{K8d{miQKι_y'p)3eׇM0zkA߿ sq4=nƂ*!qB̥36O='pAlr"(}/ѰaQZDɉ“Y}?GU>=+OoCq3/b 3UIܻ"% :&+_c곟[{Cͷ o۾_&+Pǩ"nڌPT4)B3WڑD?&dc63Ir^7˳;T\f,"aPӔHmf@̧VUfkL>¦/T9?R&g2;O #xd+'D _7Ý qFW$hm.r;̠˙ll)-)ߢ7Sʂ!g s\08b[`lP+V*]0~¹E]hMF`gC_.d~FINxkAid)R^D&#֊T`$ЖڲfnfYB'ŋ Bq =z?@7Y<KtO}7B1bJgBYYύif]?N]{MNߊzk?-ـedÐ.ZD'W/>2` 8QDBN_n D\^p/^r Ž@1 DB|VɏZ8!A:`<07@HJ9IkI O~*T* ?zӃ{[Gs>8N#Wхuq]\]k0T~y/OJx?T s3sJSR+KRs7d6S\,2'FbrIf~AcDkPd*3K?'x[eʵ&əCOLy #{ )x[eF{2tI֝71bO<W%DZ&yC@ $&Kx6T74l5Ll-ƒhMSmKI0}uC#Xg7x[eFdY~x9܌RS>i>j9Q uxqb F:ƖEy%y%EJ: ~ARJ{}x :ƖEy%y%EJ: ~AR x{7q\:ƖEy%y%EJ: ~AR d6 DR+x[?\ :ƖEy%y%EJ: ~AR} d64~~x;,6]G +HT_`ϟvY}:6F e&x[eCH#c~4|`('B8W|:q_gOmob %% BxJZL^N|~~N1ʵ&əCOLy #{1B{xN9#٩w-"_CPM@Cz٪-F\t⳱0o!AMOP{R$h1_^ϐ˛VL$lI?~#8 d s8"PIxi-Xs8N:/ 2ɣY.i=t> z> .b']H:wCx*b.w!&+x^08W%Y\ؓJs dP.} *f|{M1f/0gSϥBPsY3KC2m4j2-kU?A["MfgК).w]ś ?,"&,1`I wEQ,"g?R~H7{kLjmnOrXJ=9{K8],"ҢsѿNR gʮ&fL8GtF"Ei]&ofM1Ud< š ̘ζWd]sR]JJz/LV&T9?R&gr}q.: pxu dvv~`cK+.N΢ԒҢ<b@5grbqBo@cG=zVŭK< ٕ`T \ZwˈpehсMe߂r2lXZn<|s$` ʢ\d't G,(LUVؿ@iI4@U>4MڽqVܖ{W*) > Ktl뉺7k/̂bd5eW ^vƠ*4AvJfѶ,>c(`8paeֆGu02;'P[wkMxfteَ/0uXl_e!Y?>EaWOE:ڹH}oLyFθU9Uw]^[{O$VM@E7_ȃ@0Sf0rVbN>oChOZt3Rf/(9yHZcO)-*fg5gJk:5iA_٠rsSSTe9)% :3>]*9IsO_]C65X*Vf-y2]y_Ԯ)abcWo)ൺ*anNcznۓ}52[.桨0CZ˻3ސvw/4E >m ӆ *H,{ֿJ9Q)-Ud0iQ{͏ *K2+|\GOO j0KRAki+_6`X;WJ8+G<ݖ۪7x, 95Lu˔pb2100644 api.c+h8.>n6ޛF`? -syscalls.c'&J p=qW)tǙEY'bv6&[d\>U^csNK9y;KH&9l[z!*gJdmֽ",5RRwl|9e2fَ2+yG'u<*[xoc%׈ x[Ģ ĜݲĜ̔ĒYB''(T9;9{N~j43'%%HS?3/94% TP*0nZ L+|MSƜO?xwCKB gbQrnA^'[\YS EւYdafw#3)x[ٛtjbvA~f^B||_P|RLh6O2ėÕ_)*NT?9A.Mf"#3b OVZA 16B26$bڡ^MjsjgMOLdtz u>XFh1עPgD}TT Jxߊ^\rtɩ\i[vxuΦ"*[<-Rb}EWvzڰ;LX=Gcނv[ɸq S`ވhgq$@33v#5>/`\j>*ֆ0q!D Z%0i”cƥ*Je%՛pį1yѸ\؎'h8.Z.WN`TkJTq8mG=mT (h?l46BLq:>k cNĝbtji:^zJ:9 i7 Df*9-S>3.61i\E$> 28$q#b"W$tv9fftѭaکkwKE9s81-g% ދO{hdv|5z'v8wx]rwS"1"1ԭ<67py9ǚ!偦Jd<^0&z.+M4nmj#Zm19;T#^<8^o_nc%aǎv0S:еJXky,W}Q$- b9y2  ^6'ztz2693UE6`qnd#x"iGIIqD̘dwMNhhd/Zhx:YWO2BShNZ]8vg˷|4/iLVRt!W!J`y qJLfxe-,T/l^i|J hU9tK~owNT>77]f$v彆xՆ-Qw958I)#w^&K upC1"/#Ilrd;~ q'=.9FPҪ8L^;>cp땓eo$)\(槪A"]d1`?gȶ#g>/ph/Xjxt#Я1%ju$*0>{@A*rX37f")g6E| ՝6czePxwd\B9&裢iHn\"}Q:+h<bC!{@!%D,̩Dr 11 y#¤ߑ`\1׊IUP+\X`=GqoF0Ez$ROx7шuEGw]VutzI{"fU:YQ`JMG<(hV5̤M缇DEKtC_/zEn Q^{HR_/V|L͓&H``|/gս nt`tK p|\)"%RYsɒU\s-nz)-Tr̄쨦I`F-řZxy~at2Ugaci#٤z<8`pǎxaV 2՝I1Z{EVcVL犳F\("DO7-Ha$mW2Ņ^+N6DKWt h.}&T &PkRmYmd<"`_8gE%L:ww>;K1ΣEӀ/Řl O^l8OtŢxjN+mXa ~A6& 㰕ƛ.6Hec1؆$8!Cn5o!]8BYV|*wjVf^82e=ćm.8ռcQRzR`w{#v<qnĊf\)lR֨RQjtըj[+M:F5,2'š {1Gޖ++8y wye&'XӼoOfʅ .fp`qF[ƭbќ3>8r<wucc'`4GI!˶@$sS2-i&/mbfcBRrM;IiHIIf:t i2 4i3N~+l{{{od_NKOW$B./tKs}J80[&gD,{uF ߴYkQ-`()9q||ul)u a:J LH:cFA%N9Jc1N&Dޥ$8^C,͹ib2;[EݪP:fSaG$Nn1{sDT5A!)/WDxm/7Ȉ;  4JٺD[ZܹG<_9l6t~;=9 bGpb?>FE>Z3B :]7)8u8\\*/Z#n) ;= -khVZUA:tbO'pXie#+N)@8L%b`=YCf'']8ggr!>#چsNu&|V;CJcm:8wL0/>P6niZm193UQ [H;V~vDၪUTR8a/ґ,1 aq|e]S`~pf"+EEzp\U%q E'yztN!:3aZ'^?B:NG bN,wh@cx)DRa!NocF,`KzgI˄82>ۙ=fH9+C9W\L`39>&ͧ͜$ ~5 6|P+upX^Pم ySD|ˎe"ϥs a$Ƅ2:)mM1)s[&2Ez=ceE>7Çyu}i)z11/|&UXBb{1>E y-G~ػhQ@'Ce7m|~3|F$K'X-NPz.pjJpqF00|kX;+s;HgOey|ˤm;L,jJ陉Io( ZXB.%NK]!;$7[W|LcT0/zǗx9[q^ȇ}Z ~6p ·Q}d5"Q5E(17=jS?7b5)BF[{^h#jrҮ5:=A"wѶ'Q984b{q#Ȥ;-x"Ǥ|)ѢK$FT sZ5".QrT숢 jq%D:qzC,-mSyL%SL~7Ɣl$|fG{\Ӯ={TueTŖ^՘L5IIiTXp["1moѢGd6 4(qrՖJןu{.",A!H-3EhT>j{> B#NusD}f짝d%n_$nNru ~;T%]x9,eydNq~NOtRgq֐\~ci.#<ƆmӠn;~>lr[j<[Jg3$_()BFGQ{XѤbe0a7e886чLޖIEat9@+Ĩ;U1oOfʅt itxU]Ԡ8{l+6Ͻ=jV>5[ۉGV}2/wme/'7eӷ L2QVL(x2ql 7u- JJ2sS3Kt16_* 5xmWKl([ozKJ\=-+b؂!E.%rv%Mǡ9( 4V#@" Z=Тr\).7O_# qT &ZRME&")\i8y]M.%IyN%~}v/Զ)rQ%[RP"q<j~RjzDD($Qo\MU=Vz8]o.wW %i&U bհqWP4/i:.Iampo_VqT2~ۿsXVX'wFm*LLeTM,wpQm4R(Ä w]b1CK-ͼ[E882NKJc%Hath<986T"DYUg!hS`pSulP뉵ssCS%6 Õ9>ns$ "?dLIEEnY /1Kx~xLQXL*F/|$$p9Fj%FW32yUc՜jU+J9(~H˕T#8YpE`ѯǹ_3х QS{ahdCʀ$]+UEP៣dNt coc_A߂"kb|bGd.Y34 IVeyXV)eP:&vfb: pb3Q;(;aNcS4Ż8cB4HJ7"oIKҶHIY Cab´ IlAōĠDyONsO'gvU)="Kp2bd7T[ T>%[@mh( N xo˲ w 0;%hn#vטrM PE0g53(|r!4N+LLh)舡@.4!*EQ٤6:;txRQөb-dz}Vb {QMDwnzp !"KRXH 'WRTOO ڰpļ3vvoUHH/~<ņ7ҩ#H??@Z\ZN[o"?%fF Z9=D_5 ޜ,r(h%>]O <@^v8YT3YzV<'#92Wsk.2!flRưΜv͌$~U 8Xo.yeeZlp>\!gazL'dlq:⊩F ?X~q.a"2`j]ʭ&cgshzU+|84M\&_*d9Y4Sk;JE#ĩF yNa=v׮oX* |_Z%y$)|r-/Q'1m$.&p{a>[e=e B?HR\ = ĆT#n.&l \BMNÓ5-mz?C_l~+~ynûp­◟39ex;ҬE[93/94%UA)(9C@/C pfnWL2y% `[k.Nwl̓rxJ:\ `ONc(6Y55 v@/E`>2Al>9_ X!AY@u._ \xjAlji+oZTTl1Y4 R "etlf~ ed o} tf7I?e̷:k$"&A&Lfd{f"ǁDҦgY KSy;CV<= 9$VRL/{zHyyë)Qth a]Q JWxjw )l~ǬJKF[Ѐr]ڄ Ҵfݢ.YB?C p 8O]#ULf>\S{EM*Ĩ=_4y(#"4`F|qH]~mY#Gn/17UVK@ ͍\J 2x;1g*$fVK-}\6w1eb*H|]p,tjbvA~f^B||_P|RLh%[=+KjrY̦&rP/)+/N-7W)22Ky :\ J@fIn5>xxp*:ƖEy%y%EJ: ~ARr bx_!RAKkD-]̗ ҔtMju8RB"y%@xTV{fAgq/)+/N-7)22Ky0{c#d)cײ~9 x[p'aA|Qi^Ifnj|f^qIB||_P|1(A2Ww=xۘ2/yCtjbvA~f^B||_P|RLhs k?&+Ȋl}$_S WZZo,/:Ku@0Uy :\ J@P;p2a{x|9y#cKҼ̼"%b ed6Y)e1fxRJ@F¦AQ:"B(J֪Uj- kiCۤ$-ZGs( |_%)X~? sL Njj:'5@()IٌxPZ斣r:)RNA BH׀}~1I-{ɇ-ˀ82Fj1,`FVv !j1hyO($U3ܬ0C&#tV:'7vw[u# uD-,j$!RjXfu*R M͓R(ԇƗ ʡsJJ`A7ݼFH)Mlx&Wd\wH9sހ%7]o?퇃4WSq;za1%x;79eC?bbQrn^rf^rNiJ\bs#!4x0?>^A_KT--.QHJUHHMNM2R ZYM SsFLd3c17sVLg r&Kpq&'*;;9{ă# X!+2\Plb /QbX>yax&OYZRZvҺ[P%*2r 4X&SVI$]f[%V^3j x340031QK,L/JeәvQBjeYQƇׅx !|S2sRs*<^|}ӗL+r2Ss *R;{Tc~9`uAJ &f*shm jmKJJA02 ;h:qFS_Kx!a2;;9{[pa*y9#O#xsqi e" @lli09QJDX!RE&OR`+_(n a4JC ͿfH$)fŗ(%攦**pMNtWؼ|((!xTEDA/=$3=/(y8Y¥S_VF&ްQM]dN''ʇȧ|x$bk/Ke.%x籉유}_Nnnj:y!xA%2{nb&U~{o_c:Y_an~z#s\ݤĒTd,%[?6RxfB!*`𚉲X>tv+%V-%% KVH=sD-ikK,JΈ0:W2g Jg2v~!%eC1Ev߷L2?KrO]˺Ҫ3/<}4Դ̜T\sپ=q:]V+S^Z\ǰ5j^ݳt]9Tȶ̴4Fg!^6xA$$ M[K>nvb1n  iy B!Z@n@> ~ 4 wqSqJ(O-'W||`c.a 2*) Zw}b +'ryF-'FtUr FAZjaGZ4M₺qu"MX>x;+zRdw̜ʙy9) 6y%);'fvgL.Ģ!`kYZRZ T3YUvdNqfBo@cG|dNi&kT ,Fc#\RAHR(R P+}=]}dE0eQtc8mG6ɂғ@ٹP}Kv5 CDTg:كhr-S-as<(xg/FLҋ5&dR4Ģ G ILIAV0S#of[YE2(Dũ91bCuaJ|QiNRQjbcQkBqe^qIJf^ZfNj^>0uO`Q/-!NajQ,pG'g(ttr~^^j2@AU)qqRBiIf^zjI|~A&WrIPP$D -I-"T:Y-gf"Px;+Jdw̜ʙy9) 6y%);'fvgL.Ģ!`kYZRZ T3YUvdNqfBqjrr~nA|bQrF|Qjq~NYj|^bnRl2L`*Ǜ '`rW Cu ~f W#B= DȃzzG6ɂғ@ٹP}Kv5 ]T_ɍ ֓T'{pMR`ŷ%+x˳g/FLҋ5&dR4Ģ G ILIAV0S#of[YE2(Dũ91bCuaJ|QiNRQjbcQkBqe^qIJf^ZfNj^>0uO`Q/-!NajQ,Gg)AB8 i\\VU(-KO-/(J. hSXh_IjQ<Ѝ JM..eĒT+oJ+ *K2&k:|x;+G`ciIF~obQv~sFb^JQbM.X@/*^i273rf^rNiJMi^fqIdɫ٭8K*&h(*hrqr)LV`*6YSĿ"P[X_ZSYP4" 5X Af&ՉPgl2#dAvs\(>%\ޏC.*/L{tr#d.\Fkjxn x#QpC&u,,ƖYXA K~r5s xJ@!zH0DT0iD$?4لى y˓ IT~oos󝽎݊GpqZ(H +K 1ݦXRӓ?lyϽUzxfvv9Lw˭[ުM (?TT~N'Leq'Ќ|l8Dc>,tt%gcyfU'4<ˮSod8z1ǫI{b<< HeW86y_FY\Ӊ,iOƱI߰H33HI qf1V rEɒ6Vo/_1{X)qO:f/<6QF|]Ӿ~/ב˼H1gu* `&J1y:dј_&ifǽI`Yߚ__}, FC|ť9|3o?=~k =~std^ms}x9xsxjVu+` Z{;7x|xal`(yoϏ77hςE:涱>z{$7qFZŝ-w}pu~iT4?}5ݲ=dPG;5vȻO(s ;Wsw nggA<[u Sm}G72F}trb꿛jmjNOͷ߂ƓlXY땥^z%gљgAP l4;/*r+'SsRுymm ^o}˧t礞/1;G9w^~=|c>`itDz 3~^bR9<b!HmWz壸j Yƽh_1+!W]\Ou!yA!ɐ]B$StiGcP7 e^7'@OL/ YU&0)&L"ND5 Tx!cs wq KHRQ)!sc`wԤa s@Fnt j;SW뉻]d1U*7okIUCW7m b+6Eԟ05aYk2$ j?M#<!Ad0Q: 8.l6gOZZ%YN+H>qwlNJU2\&xZn @Ɉ,, `4bs|'U Q C(abc?5YJsK}*KUv; (IEU$QY  9^58tulE1/2xn֖G=sn~?kkT6LUS5=TaҁIpA'U ve=G7IQݥI145'2NO6Ȩs껹L}77*Nym ugG]?/~b<c}7/wܷI3ܨMQf,nu!vA5ͦr*M6p,9/K-ґ=+$1 ޴g`"`qU_{k VuS%V'zG/)e/I ?GDFU7ZU[_Q#-Ys ,S/o8\]Dy<2̮{ sz[2I_O?DvŇS-$;V7d=H|`P2i[V}JO_ޫ3 Z;&vd L NM NB$bIm?ڇ݁Eɀ:jAR;x3Ež@^fZ \K5V&(Lq.y4 0iS lSՠv.բAy 6o~y}ǭY+'kU[t 4e~}u:\=I]!ګ=1^h<[h>|^!K9v^ڇ&Gd`uĩW!8NIjB:(j[ȧxlլױrŬmz%^>Øʟ`Vw\V-OdKQt{F*$֏/gzP"]{]hN1%p*{ud2ov˵#@jc nVg/Dҩ%XY{g\.uxs$PfmB$~1B޹S/bVQb8 o>g'9;sKϰ #< *h{PVE^各2ilB̆m"Ć0FXZZw@:A6­y3 |0DUH茼q !k"壨CqȐL>dOԺ2JEth'.-ye'f_+34[ޭ>$j4NZcON 5vp] m oa ޮf ޮӣf]A'̺% ,d'$AWP)")\\Q-Ч/H>9EH Z1^||\[]}ي%n\-9mVMYMNaYvhKH < NEax0o0\əkUfElkOvTe&i~okBiY d\ X^`|bKkcgβ8oO):!iu3v*_,JZv7V%qt{xoD>c2' =|t~*0+<k$fTzn!@WJ [_ڿl/p lv(6m%YEac췍:bǃ'meϠM΄2%>= 04/'=  ,(k.01#O/51aoӧT8a?RYC ,cVX!P"ᝈ+:dBc}جn 'Ũ%Y#d_#PXˊݽ=]\85#SJ"Nz$)ǡF5c Jc&@VOۂ´*7\)&f%3"i,Bw_pOj(W^p7;I %va[i6U3N$ B?>tﳟ@?t%#&%ـ:7[ 6ӽ.4M , M*ĺeP{obVͽ0{I ljjk***kYٓ'ڽ2g-o^FzaT*A+)c)ᑩv U}ND{.  w+D(S2F3K "zTovrvbx X | &~vр-ypYNAYui:P6&eEk|9;N"@ j(|PĬp`FjdKj) r*ޥ05(!Qх.Ӯ ٚ Qf-FQkrh&j\,оFH#CR2E sPϗڀ:(vXL{t$D}/_pT05rop,Fu0(u`_r"<=OL$:`\ m`µ"#BU IEj1g[ְvjja5 şY(0~$wI0В!T·m00߅u%2)+28R#1jK!l "q.{ Y%|%6wWz3+8[ jɦC.K,< h|y8S/ `X`]Yuّ3脝! ߨd{S~?Dxiż#E)+;)9B Eɠ~}RR\6k$H 6'.qZeVeș)ؐPZN4nʩ{bT[ެou6f1!Yg45!d>n7gZ[)E/0esrܜ&`.z}i[@Hץc+Ph".sQJ9MĪu5:–uKiUuy%Փ, <,Τ%X2gݨt&| YH[kNs_n.̂ E\6K.jO.3AK, - gMo>gk#Ue' 㾺.IδJ %~J)Ij#TDAu44 _'?ž}c errz*YiG)[Nm k8O2=, m`tXÍD[NxB^#xB^#xzXzBn u~"Nɢv9ԢfPMpOBWV\!L~.Xʩ(15ȨtX_>ɣF6T%lRpc&|*]e57}#T\Jg8-%R m!{g{zx_Iqͺ)u9 टa2 4|滾Lt gnG(@.w`Mi倨^ г2 FjW!mgN8/br7pW5M4:crB'Y|xZPS@PkfD VެDKiAy C{(?ɖyG8z_^Mԁ~T$edKW8 [<ƙ7z3JPk#gom`*XkhLGF^@wbA!~$pP:\ f d^ȭD$ $جA+1Zه,oBc#}+W4 t|4f!ݖ#L%8ڕZ]ă2~9O{ac'Rڟ/t"'sPoDA`)]H;L;aft15%Hm섖]8)A@hs_5> }d{\\>H/i#$O46:)ihw|һǛ dWq_)Ai3H5@ٮ#h$( " <$E]3tKĮYܟy6%:9B"aTAKcfa=kR73$wJ ]Id ÕN#Fj ^$RGCqq@]KI3pPpS#T)vVȇ_RlkNlRgc&TAebH?ۙP[Cru!ؐ/T!rCku̮ŝo$i"yLn+Y=2Ҳ\~Qmڈߐk( &y WQ0uFdE:JK=rDĩ-(Cڃӣ=pM׏aD$o3K`G6?A ާkhՋ%7VErd|,v*#'v5 grPV] {PY0P-0G.U BMm eI|"nMS%KJthaQFos[%6qeZ"N,R0>Xvh:QY$8TҒ.k˄K֤B';Jz h[Qeߐ_xh3:eݝܦ LR. ֵXx I \URFa`A)F; xր[CP&#jW$9- !D{,-Ixu[;<ˀ1Aנ1j[/qQv?>?:Cآo>T2>6SԮznߡ4o5.hwFIWF޻!,mbI}TruDAmQ,Xưli+UxbM$_2ʏ{b@f#N]z\k.t;GB':[!4-tz$'-ȭnP 09()i]X' hdcYU2FYX!-6$f_?p=8LU7βw:QM7ш hy,U˓J/@}gKc\0볟qMq@7ܢaQ$R DTܬ kfmf,P]͊⺠lay/ !ݗ!'fyʮMgqɯqծTV"Kk>` Ԗ[8G\YQ kՔj:o yrc"1cM|& 0յ×MgKu~%FÏ +P-uz)4GF2^$mC׋GWH 6j^s.! i#DwbAٻ{AJ"ʘP;: pJ)o]'Y߃ϡd òE0,W\UcፂrB6sg0tzU{KQľc'€075KpWATϐ7]mo*6Щ ~ ؛ r^fYpUw^o?zWՔJ6䑹E\}1U l ki8rG1OԳ#@|Xuoh.X jm K9SEY-&ҏlg/M wqd5A}P|V p5'% p8Cz`\tyD>ՄY*U[3CR\ʼn={nNh0ۨw @޷SߪCI:$Jp&Yx!tZLXX E`ԏqDMPn.vj9fZKmxX>Au"!C @2bTY@X$ZMl,WH *(Bm Ek~aMA` x[zqI Ɩ`bs"s;w &7:& IYx340031QK,L/JeXxPUڲ+"&ޫ* !|S2sRsM)Ot[kUTwgb3Dp:V*075UHHM-+I`X+_l)ft܂Ă̼" ;",}CcPk!3SRKU5}%u*{y/!4>%88dvW79 lި8r^s{ n0FVY\Y_ZSZT0)?6)N> U^ZT1;b>rOO1g~2-5YE—^'SV]}kZMttHxL9ɶVl2~<+{jM5QY'ѷn56BN G)@J MQH#[xP$e%RɑC3KF7XgO3%I=lDY"Xd:U"#Nzx;$AhC>x6~`cK+.NN΂̼4 bF6EqLTXTO()!x{zza,ʙy9) J%9zJo_xs%* C3ɦ`zQɧD#aͦb;92J2KR&<9Բɍ/J02ډEf&J \@RUp u w rwK+L ‹x%$Q$_!7hvIFBIbQzj>'L^^ڌ`$5yH=$ԴFҟW\RT\_Tf&=`r*>m c42!fX#9LF)->820 mmP M8$f%֛%.0 ίx;`}f6EEY- &g 1ʱD*@B kń'qxJQ4*MӡiLDpR^ ㌌g,= ڷ.{ڷEv\\sB@9 sd;`c!ɀn6B5f׈4g]gyIګR~ЦZF,c3 | J/!kiԒD8YTu]#If  ceߍY5 *Ir]#Rݿx^Ԑȴ)kb7ê]kTOWZ4s4v>۳וQbA5 6j%Bnu?=M&Qk&'Vlq玨/A*֓' 8kiS|T 8TS#ɔ9yYx"LnIfB||AE|[Z\d%'( \ʩ9p&+*7˰W*x;{H`3[jN^dvfC5}--.-T _Ģ̒ҢTԼbdKVɋ=L3RR\}B@~f^*'1rj^Jf\P'cgH,b{x5V1Y:i{嵓,3Yvn PKr`䠯2/x;_LZ l?Ho {tbFJ NKx:yC5䷜\i Ɩ&ڬ\S FixüyCZSբo--^_wu`_5yޙ cx[&Ov&vvm4bcK ʬ@Vux Xx[eF!ןteQ@ͷ&@PZ\RPU CP.~5Ĥhx;C!ȇ $z^}Q !\UwpVv x340031QK,L/JeәvQBjeYQƇׅx !|S2sRs*<^|}ӗL+r2Ss *R>ca:gzuR"9L|!NxWI@xs$ㆩ)i y%F% e9 \67߫zL9dx[TeC;Cݷ49Kc_:Y_an,&6t"x340031QK,L/Je{ԦŢùr2rpswwgpqsk,ND#dS`Tvn֤ƻ~97\`3*tv ve8_}#D/8Y71;5-3'U/1atZT?_.U0\ir(jh*y"83$=>15!mؿ;˲wQ TmnjXZWpCFq;z>xjfr~^Zfziu 5? e|}}> PHOfXˡ.3ǜrS]Omf%甦2_L8zIc7oh[''38599?@ Y/3A܅:M&ܞg.bZqQ2ËEKfEWOXp=g#D$!'ut%g%z=3e7T>??Qt;&\Fot9;8-y }x877<+?.MҕOs2100644 CREDITS7 LV4צ` e\nXif Zӟ[zqڨN!t#<2fXm蓖6TQ򜗳ܞ;q:S%40000 testsYIzmB(U940000 toolsA#T=vN)C W*Vx[eFT5 3e:"_~$&) ,x[eCÄG.zEJf?Wqr51l{pR,,2&@PZ\R0]O _H*S:qǩxWBwYD4B~0&x+-(jj<[snLϰ* naxv 7 4 x^9Ճ_ޱre lOMMgèa1~ 4[.;s ?E.7 ]ii;~أpUn:~|Fד*_{t%(fL v35ҎPl[xɿBY8"x3*'"9GA c2OJ ! o D+vx(JbCNd6SAL xTa~jo7j2m^u  .~x2'q YγLnb3|kW'*n`\f-,T-j˒ f.G0 /+vf.LUFF,ԬF(@n-Q@U3 UiKw%gjj,.kqÅ%5=9d܉ #cG?i9eˀrl`@ azә `]QާGSeDzH$NfMvJ`z;[ZkulDREЧmgk}-i={G y Rgi +5--<{;#9Ws,%bֻT(ذu…g$f طAz+7^x)W>>Abk K圓;·ז! ڵ>Lh| t)w<`o: ·Ajv?܈<ⵁ:_\sƅS椃w[%78.  )(Y6 m, (U0}i< :Bi>yT[t+6"جl]Ql&Tg@o! x#Ahfy̵Uu:t8yq4"=('|'@TO/3%>gHȣGK{\g;| C!K`%݀#b0⍶qj.,ShFcfB}G)m9m^hhcũ(H vSRL_r8/j[櫴݇F2ݚWGՋv2)%EzXqV~u_VH+6;ik-S)fP}: qK/9'ğ0iq ~Wd3, y\V ٙ@0F˜T+YB%/ !%y7!/,-rLx[eH>&IOz.nq 9 xüy7ҹS,D6}.as@rx;;!rC8Ŝㄍ&QݼRNQ Nx[ഡFn-YQւd32Γ*ErRAb@13e嘁0uv02*x[e1%/NDI_?&O,x9˥Myq)(lvsLx6Be) \gd@Wx+-(rN۷IJy7̸)K  ?x1[^3NA8w\Ro=u'4yeMĤ,m$h)*NȀܪ͛^l;*FuuAHPY sGkԖ2M+s2fk}0'T:Q.i*&$w.sHe~xeWYlfVLr}Y&7ls'{dfHjhoڎR*6!ZDˢVH-<Ehx M׊yT ڪ/  R99?_%oeY~OU׍UrKW|ߐRiV\C^cW-NֶKRY춦x>Q{GF`H*<}qm=JO}noÆf)"gR#Gi7o3=ӗ*p<@kQd7M| R']/tL'D~Saꑺy@1Is= V*bhF ]aNnGvUwJiL="GUڧwaHHUr޲CSL>읺R4 ԣy(pkT{k v*|PK3# Ipm|lWBjivhL.PH7$fL|KW'6fJε Zi9I&0Avo3UṖВ{xN; lGNH*k8~ߚz6G-/# bhΙAHw:r6j"Gn5ˆHgM3"NHa|716zӽ >Z%8\ݱ\9/yxօ͇x>߱ M}m!ZE@~rAȬL.%`hy%E >nx#KP-Kg8t-15!mؿ;˲wQ TmnjXZWpCFq;z>xjfr~^Zfziu 5? e|}}> PHOfXˡ.3ǜrS]Omf%甦2_L8zIc7oh[''38599?@ Y/3A܅:M&ܞg.bZqQ2ËEKfEWOXp=g#D$%;ԲNϜ|HU'yTGT>??Qt;&\Fot9;8Ab}x[e5WgLama+^ W)x[eCHU'6c|g+i.<,~bw}xwM @$uE7]'Q{1T>??AjvNƵC|?|ci8x[eCH{S⤊j6u3yYȶ9gl=e2 .8BIjqI1CZ5?%Bsҏ8|~xBs\/owMjɟ|.u1 #HxU=n1Kj䧝t!KH n&1=ɥp9 ж $BfdH BҐf潏ϯğW%t4;ݦUD?Gp3#%ዷud}>?o8d# lXB`E~z?{*.\AP`8g 0ߟi3l)% `qCF|Ѥ60K>|gblUBON{nKr6iΫאwE?$>kšկx/$ gxmC<\bk^zjNFbQJMV*㐙:9;93O*;3<3J&7 s(JMH,KϵM,J.-VM,.K-KSAgļTļ -2JRSJ2K3KsrUt r2K26+3D!x340031QK,L/Je3]5 oeΙ2jV 7MNMIKee1i C4mi*+NMN-cpqmQڻw}> ͆-yx+-(be֫*yk-s9 qcx[ .!AΛ?wq klx340031QK,L/JezS.m,;AjBT&fe%2}#zS*K,Kf+S%6ts;V]m SP$Lt+srZ>=zVŭK< ٕ`T \ZwˈpehсMe߂r2lXZn<|s$` ʢ\d't G,(LUVؿ@iI4@/}h{㬌-y;]UÝ3SM|buo^dUvk6ˮ.p_k.;7?)AWc35s+6E۲,ÅY=1k\ʬ+C n߭6Q$e;4t6qIOX;.Xf0~|U]?[CۭGTgl :4ܺ|ΡkA \P5]]t|)<d > BJZ}m wR@V M@|ooj -aC1ԧ35JO4꠯lPP(|[Xʠ?35♓4z:%=d+PlUyiߒ'EE r+con}N5tU ssMs+ݞ쫑 Vu96E̽|)kv`]?oIW<3r*i&[qYjg P(,corqÏ?=>b3X /tnO]Pd0,^`O+k#nK^G&Mx;{H ŽLaz}D箫}cdxCloą";lJDߊZGjNVa9,ukK$ 1G]Fp 3?X$/y L"df7Vjn\$ő w'/gJ/(H-,NN)Kf0ú.m׶Z'8BWq($%gUݾ_j"(+g=ߌ*!J/Ӣw3UbgT՛ .%elZO_荮.Mf]՘,uO3MLu RoJl5Îz5̼!bFduŕyDښ<\_y5}?YYZ$i^%;՚kWĵXNcً!fޢ;eɟwfr?PGxo ⵬޶Nǜ.2ĞE?̿ft`%Kȅ+*6kx)]쎻$|ݶ7pgsnެ(b2p?lڿMׯ>rq xxoCB gbQrnAA^'39A5"$138D"W\Y[X:!K$` gx gɏY'WiMfL*NMN-IwvqtR 90nZ |MWƜaE0x{7C^BbQrnAA^29 #x;R3zC7E̼: ~~: y) !~ΓL+UR\h_\kXRR,;9@@n$|M쓓%''J)Wǧe攤'h/y-ɵ gfk)$'(d+g祦(+QjjBIBrFjrBIFBN~yjBR~)Z\i Nf\gH70ca6XP]@ӎLֶٜl ՝V3xuW{lNؗ:'N>Ǐ뜦M\C$}PRd\l9iuPⱊnh0:P6Ơglkm:@P1`iCB6~}wԼ&cct9=\~ 'S ㈱>gvGf< ҮOEO,٩1YRR-}޲C) RwE OʦƥHd@dqrj>rɽ{#SgaN3 fǘU )ט\\|>WP%%1odQn<9.sczfT~LJQc^謁,{q)y2U׋橮 mR(ϖdrZ(.kV]!@ErZ٤`h6\ .ġh$U+"i\;BHZA aKDžjm]"EExaWÆ~e< o Rt"ZpqKBǢS06DTLaqE$8-x1[bj=4[~m<& 5YNEdrRZEM;G}* a 8bX'!dzk؇QaJ8F/GW#(~3\CT@^*MwઝƉ=Z -,4>h𵎢Ն<:LxխZ6^mm.bƣm͊zV>UY8ֳa"g$NWyJ8ًkFnG V0ڞȲTJi˙bիpݭ g hX+VamqX"1DŽ[io 9iܷ_~4m|ƈi } oNbr cr7ti]V8Ī r!i_tp7RVq^Z8AfZD4lŗnny;]ƥnh;V !6͑iP L܊si3A\!{ϡ2Ecl?zc:UJ aѠbG,I*qbHF<907Mk3R)V xJFNԂGR j¸Y"%?̀CuV& ajPuXJ)L?>qkMh̟D%E͉v4 Z;A/5#6Ȑ^Awq-$ԀF-d @B Y30Uįf,;idC͖"IPTŰw% `eMcT5«nMpp7G$j=2L=Bɱ\6!'#Bqn>9*;;@O Â3:^sS 氓laYqa T(WY_8TK|! 9ƴE/黫N_Tut:?r:]ڶ(In^] Kxlԃ>U'`kW[hb#C doŗ;iw; Ȇ_p a RE*1G1x c wP^\z^\6U-/(Z7U zoYΎ6 k|y)Ġ_PI0p'f~$Q"uD#"^XJRVLF¢d,gr׃9`n":J$AkNQ3ԠIX; ɀaTڇ8>n|b%H#pF:9~$whO 9h* V&f< 's UH'pdD)Tnv"/stSUڜ64^ŲZÕflz5 deZ ^MtC{uLe HR1(ӱEr2UavV=>JxsUxi|Ew8-|i8U{ UM!9d|EUvzW7ܺcL^qkg [,WLjKjS F*:;!}?;1Pf¸_Z< Tl_+$u t-ccc4bJ@ hXdr3Ђ8t$vC @Y83l8ڶJ-rM.NΔ܂xPښ(`fks2*KwP dz x\ms>V٤DIil_ʫVjr (r8̋%tr(R/Ft7Fn?V|~vu/bWQF J;⵳nwr7 <29AtbYJ$R˂8J8N< kq;vLL]}R9O,j0ȲPO7s"_ [mL3\<<,9;}gAFXd2D6!D^ҷՏxK—B 8mţq"%/ˉb'8w=LA"s%4_ є"ō$N- I" QF,,Uy`p'/ K{ц$"] na' ffX@G z~9)Oh-cP L،:(i nwxBKgz}̄<1!tݙ( qL|hȤj0PQ~k}' B{:s\4dr`}&~uzhCz!\,9Ni#Cvzg&U͊9 IX5O3RK/N/j}/>}x@~Wo^^|2bg~Ѩ'<{4`ɹ~}nFjPYKO_\`u2+U$jr$)֫۟__7vZ[* _MM*_Q4lEmj3ڶ=CKmSVsl}8kvDui 95&] 2l f`Oɤ CYeF!WA..f[|☏ɬ3H+͂0vp86v`0-99.JFk A3EG0GЄYG LS uf -1c cQ?>Qb!X#OC(Ō) C lYV@bv[H8Co_C?bsr?ˤ(k6IA2#Y)$Z JD$RlS7[IZq:pZoh#@<LbZI'Q>9Tqt˜$cE]?AYF0[ ꜎c ztE fƥحtP Ƕ/@~D؏N=Nv@m?gq˾Oyv-S@D-PF(L吨4xPXn'|j"ȲS7Oտ'N=%w@^NM$Q4q0ρku |9 c++A穱P~,)tTE% p0maxNL9A0jrd:^4559rVh` VxDIr`8Hm|/ISÐ:sD oA"|ʌuA ֡ؑCMN3d8xI` 3t3Fd&6DW(l&4EJGW-'uE^ZGo|}fdsk/WB osq/z9^NG #zG\{1l#nF{͌fg /ZS}gn]~(:#G:!7\4Sji7e zDg&pc=$ TƷ\EڶE>=Vkt8=T}z!\#,_ 佞mjWw}*V[+w,2 6e؂8 6vk9ޣh-zl,xiSvg,md>>I$.pZHx*)qWd CuU嗃Kex,r湞2GZ*|HMz!d//i.'K J:q.0kHse'E_/+=aՇk|`20TX2GSfyP!aG\,ΔiG~N F1SPn G&7G#q&_ە*DAˤ؃Ue90ĉ3}Ƒ-hAuOj9$.8gR 2]o!kԥJ*)Aa^5Ttka|]3a*\EZ& _td%h}MC| }桌 ).SD.eŀ,*RҺ{?xq:Ͱt5c-<|ʹ$f3h3 7y%Y%a'yQ[dݑ3|*5䊶++np X[R.ոmF=QیV^^u>X~GGKگ+ʇUY/jR](2<+HڪUԹ~ŽW/IEaڧús*0jJ[q/vC3{0uŭ}BC#-c~hw׹ sAG̨ۭWיm^X{2lv:J%[Dw+Mo4( ӣz%*X-U.jZG\՞gK=5|mU1.^ݫWYȣ?Dݽ7= -V/[&[a 0o`vP2K69 \U—Ϳwl];QY\U F\U-& +ґ|9߸*^jgXMn0uT.0Un4`m>Sw>j)#֓ OjS>/v}{Ds;HZѠ (UE(`c%^u&y 9% jSZvVz-XgʴTlWmd]Y1ZkHV|Z kwaL&./u7 n2eqzo-^WWG*XEiw"2*ԻaNRurcfC3% uҊn7&i@ < C|WNbH2ӯ;gsdNtϞ>yLwSW+7*}8u}o\;йNeU*%nPt B\V M7!}b_(EFe}b_(v|:}ec_W6}ecMݺ}ec_X|_W6L嚒H=,o?V=o&!oz]] -2*_QNleε?qX-87`TvN} 1mafj -գ͙ 4ŭ_g7 ?6_JÒ%0Y}tw_vvYobhܷY2,9p- yB;L? twK~q*}c^С_7>V;M×|F->_Ҩ u6Cw4jl4ںBmهi$ݝҨz-k^TxYKlEVJ ]i8i2i֯$~ʼniӔy5Pv֍IjOE( B *$ĭ .YNh Tg}Seު`a;׈x~B>"~wlTrf`kdЌVCE+ÄA0Ʉ` 9?m]ݛnC J[Y{q~[mnUf;zgĬX<&\ -[f)rm``]3@3Դ8i({KeXYa \C%'-ͳAoSjpR#"7R\EYي4.\¶iU^ׂ֭5LRL,*5'H(Ь#vJXלCj\*46ɇ$4vʘW[?*=@s:mlVhmhc`;1T4C)X2AsӀ) oN *nw.q6yiMVf%K%E.&b BHŮh` X:ʲAbVzZnXLc^@8ŕR z^|+vcB 5 $m3X L)GtO29Us٨JaŮCqqaF^`ag:GB+(b" T.% ?9lyT_ZzMiU;1Қ@a15 Pn<|Eě3N3r"}7\تétRdBSA0' _pJȅIqȪ,rZXvt#Qݬ_\I*K$J.-\1aYKJt4 ~ }k뿥X~5-n.QVMƲN &RnSVߔr`i'Gi8QuQq`w_.RJTda/V)ŬϤ/sa-s$jNߣk&OGG".ij$$Y*tSˋ(;ȥqu@T:ե܃^}[z꒯ض.T㩷ȭ)a-ԃZ#&MIWUuoI7P(,HM" + #ԠCAxoxGU^:(J٬ͪo7ApxW[lIaYOڒ<^HJ$S(GNk;q%K.-1"E$|( AѯZ EᏢIB@u%%J(-ܹ3sgΜC{:! e&z.+jҐ"d$30XI&0 YUgj\%^21 zeڪ/ v5v K.6=OĚn(>Hie;ޓvHn1C"L*d ;"c"" ,[RܯÚdf] 7$k]TC&v ivxJ-.hƋhP5|SEfK@:VEw[ ?-UD?C ,*Rv*ٞA,foc'~W͏S+>Ok|*Q6>VtCo.x˟=]_4՝,`Ыjr0B2sBdș@[!Nի0 a̧w 8M" :D MܒfnѵU0טKU*Ul$ڐn+LKrpRTR^QE 鎶 zYj$aHQq(Q?戥qtcV9pY2I ms5LvumDЃ[U6vxm0vgp-?وq>{*n __ى;4w8`l8^b)(Vmmŗ}b+O]·'p NcvzN'չAtB MK"9Z9c}[wbUuC¹ kJ93+8Ń_88$9C^_KZ7ܢGf3jzYfD߃,M \ g\ȁuᦶN<2')/ӉzS7n!?,J鴗PD5KF6%Np>J{I0ީvz2'5s ߙrnQ^SUR!k3KfHyz^$2iɖ zgpAjZIQ.F6! RFƠ)=ػygbSM4q?SJ%4cFO2K tFAp0%P }gTp u޺x{^//OP K]0oPmMPL"5Y-hZ h=ŗ*#S,>ZnOٵ4`UdMoֆ `ra&1iHK;PQ , 4Su5^;h6*kݿ-3TSxAǭ71$I&Ǡ8{\\ݶe sÝŻ-9I1?k7?~NbEtZ/Ox\$J8lHOEwA,<0[1No=nksi lgSJ 6Y/ Er@}㐧%>Ɣ/j$& vX7@J A`Pl6c`6R1r*{҅3ac^(U\ڵLVP52.RdCq;Hs_^OATC<a 7'&K#O,:[tF0] sR_Ou]IO:ຮhMUi;_g B=D 0A?fnssOEv'N׊W)4D#}aZ(O*HHސ=,ǶizLW*2_qk4L4Fx!U&LM%bNgZ %X0bSxX'`H7iIy[:˵e]\ב:++%XZ.s { Bt [2]sOH2*:w>$!LO2!RS?@_T+U348GwJnYóS8ϟ}glؘShb"Wn}h;vuVV'M޳wC~.Gt uB&-vְ[\7}.^ %{ādȯԔ['z(Nhtȯq-rFρI{!@G\9*#Jm#> 2qb|]eZe6w-s8m I]C?)ǼX<UuَxzS#?HyGIHmw[KׯD1Kj62"?|C(CRIb_x$Wa p ӝ& !e55n[;n/0MfZV_.ny_~S1 o{|yԙ)z LkShB vbC)=]3 3d$c~*/R* ];le .KoB8d?CFT?!|OU|aB_gȟ7JA^Kf~$H0'9K%V")gU\a'ѿ-3?wīѯE węU.@o4 aP@,J+L} :ɱƕcANh=0q-mGԗ􃼲y0q-=­a1E T wMĜ''/UBC|?6/ҾY'k\!/7TV>i uH^{LC; K ,QU?siӴ_;6Y gMHU4F%}s̭4_ 4]3L_jm3mԅ@ b>%۞[6?o+\ʪFiͷ*NZF:7wL #Xq4w֎oSuMDi'Dy?[M .B>W)/͏6c+M2D ٚWm#5Hc2؏N ࣒xԅ[FϺzNnSVU +x$!! D Db8oZQs `100755 16-sim-arch_basic.pyᓝFbf՗m%gQd gjYrHm0ܓx #!/P$.sqwi DR_H+2o ^jh100755pyˢޣ,Er. S϶,c=5E"ܖZaUjx_!!P(^HԣDـJ$GMbz@\\֨ vxuJ@A .T]څHC"]p"Ld ԙbV>D^7)| |ĕ0{ù|~^Fp}s€)J /Lc#+nD'DV9kp&m#DL!S|Ć6nk*BC-} m՛q? 5_5h0΃ILm"CQ&0άwzKTE!Tм Tii&|P()Vk г]-.!Ա=e]u l|q.xʽk; il>>ᚓ߰Hp{{((&L^":YE$6ٟƐEyȢ ap:Wx?k/F?Xd&0jiYC?WC#MMY&2AFF`ZVcklo x[zI Tb8+,8D$XXr'K2Kf&9J\>N>ANA!J % BAݜ\Wf@M|$X<,xxzI , ɛ{Yj@,~c pxüy F\ocUE\^} *xüy=GmA,4ln]/D89 > ->%88W/ze"t܋>b"K[O|ڑdLd5x'Z3NM5{WҒ UY #Y \KBC!{xmAJ00 dv\;HDLŮzaN#x7Ri}svzvB WTk~ K-Jpq\Թ(}Z]M)Cj9h-j}c̲nBf`L8cZ"Q2\4ASp 4 !P>J{I-!gx[(Bٜ`,ʛwr2o}x[eFK֭}ޤg[tmDż Lx#0]pC&u,f&Y'Wm: F x{ɽa'hfnւd3ͫ0]}x[e윲k]/~ywt ixcA=._ 6o100644 scmp_bpf_disasm.cuHG|aElg9+SF: I=6[e`$100644 util.hox1YZbQPnE6x[qC[f&d'U`䤂؁bf&>v0\x;`}f6EE 'Qdp,(䛙N>("33qݼVLLx";UnBfB||@I|x;U}?rf^rNiJRbQrnAAfnWLܙy% wl̓rJ:\ `Sas y'sgJhkC s&v)vLndgs'?(5J L,%d Y9x۪Q}+.ւd3͟qI6xkx-!e+ ?sAAH],'r oap63,,KMUU*SsrHFH *x*pCkAARST, Mj.d]W_CĢ ԢE\&TKԭ2еюьV)14B`bR@' P 7Wɽes589SJs +! |467+\CWQW3#pA*x{+p15!mؿ;˲wQ TmnjXZWpCFq;z>xjfr~^Zfziu +#>R~6z)41d9~9o-7?Tlf^rNiJ*j̈́Wd<<qEP{r2Ss 2d:]sdҭy6NR!%3XdVzE;iǼs6BdKRK^M-ɇTUy"GuAs߯:cJTo[<#զ~xs77 r1Ha}S100644 CREDITS"V$8xdwp I۠+n5|qz2 L*淸ݎV,/HI bfqUm6jKjgV|[؝@ ;gx[eCUeN:śo])1%v4F*ke-Qor:kqf P(I-.)fdqMzAI^̻)fSqO<0Xn13 x-0!SJ_?=$4I/9?W85Hd&Aksax+-(R7m,G O?j(i < Mx[iN-77 mb! u ! :x,97ŀˎBǂk쑡o2G zPP'!$hn~5WSKl\IeO먟Ve4~ s=biCϨwa[W!8C+ˆ޶t\?g3V2ol bj+{ūVay xyaKdx[ٛ\(P{s=]˘7qr 榥'&n&rJJc?x{;oㆥ\EɆ Z\m>|iw6yZR=D0757-%>(5$u>0 5xmXyp8Ү%ˎHu_JG.@ 8,JtEGNBJgPJ_%3A`8i $M  3-I LBthh_~}{Vw=jfmeb- RzIVBBOkBid5kFI 8ڰ&ؤv[Φ֭f|mcBEB4xB"_4u h5md*,Rb|L'R -bU<& .ڜMtr#`7^^܅\Zl0 ccF Nl%ELCjf2z#v/qő,6La{>"\c|TK%!J%a%^./P&L i0a-a_{M֝JNn˔ό zVW |)σ N59KK䦈Ue?]~wkqXG.q->RQ\x7NwL$.{C{Yގo|OĮ1g5CKSniP]#Fd4|f.-gH3;O!4ƨqJjEk 4"_oQ| "qccb"Txƍ]j>îuk pw::ѮãfJjG:z~ .+GeA,'3YfX/㛮Tv.YW&g&o }`;"%4~kɁ}4<,kCB1])+& l*Ý>Q"^w HbJ1,x:-BL!-革Jf#.hLOn*!̮!i"b3ȰP(~ƺqRY;:;,j.¨2%$ Zk ib'yVk٫*0r2k%-XoD Vj9ond]&|e#x:gFFZSfrB@.,*=j ɊA5[89ȈV+Pw Q(t/R?ތ@mUL1ޑ.){TdXA/]:Q\5]f$Ev峄xՆ-Q;uqϤ4;/t%J@rQlQhap$6z;~ x}'ag=.6FҪ"8L^;>cpEo$)L\,jA"]d1`?YmBmG,/}^^$K:N*cߧcrdR~-]|,Q$Q[[nS qCp$Mmچ3r"> M z_(:<Pq x0#fRIϓy X*.PrE Q, s*ü{AL 3x.BH0e$8uTI83R\'ԁUݤ⼄ $|̅U<<쭼xۓ|D.'føHtDZJB&pV ]!ֿ nhvͦ^R^ n\*Eer}U oe t~{ൈEʀDDE/yh,v-]Ue<Ľz{-.R{XD A'Dx(ڊs>J`BMc NJ߄HH\A*i{7QLEqSWNߍyrR| i&_M|;ĵ|0h+Lk.YVf0ec^L~3!;i p4FF`HYBdy~kf:d yXzXeڈ$T2tb[ 6=ޚAP&?] WduftZILrqADEmoבHZd6$hW3B}()6QX\S~y6*rU]X}R$ {и^(j_-7Y&\TLNeUJlfhٞ, JzG"M}1BNY9Ź>I/7"n߀,sYLoN|a/Qn4m\WN?aqyWbQߍq_#V0mr:٤`Gh1*`˨+C9ζ\\͗qrʌ1M1O04ۓJ1$8r<r[/1n``|: &xmXKlIg%c{;v^MZ$BVag==~m-J.X9-Z qAZ$.ag$GOճfU}ZG-pYr|Wn&as/9Er}wo9Ay!ҍ6'긮䫛+Z4a˒,c 60zLJݯ~3QfUNvN  4jDE[ &]o LxKwGdWWV;]?]E [(2* vw;LE<3MLkU(KP 8d| >p f^|dj7ѬVL/KߘL=8:bi*ul~Fcy-VIxH'{Bf4m;q[Ty/{4r9z; ti\vN pwgs#㷚_X~:.X@*Cp *w$LH>:q|Rm:y:9(#jz *".U(XD0#&yyaSh;yάB^stp~pꡑ $wOCT+X<^yfi(ZS PoY /jj`zd#y37) {tLҸcʘ8(b:z}-k k $FVO WOXP I<^tLOe~"lI5$aU&'R'Oˬ9Q7zVIv"o6lWlY2+dg4Ff1Xn"dsVmX*xdan{sr-7`ۮLv{ xa-{٥CNwԒJ 5KeIK4:~ĝEJc7t2QӥcgrY%d U! %r'}~ zC3wV8g%  3AT2| jnb^[*NMophcs|O\\7̿UB!Aeє c!-a ,»`|CSY*#ҐN* چIA#Nq}<{&rƬCQJَSr~ʶ tΰ҅8$Y*;NRoc+Fy^X{ C|nL0R!_7LWCe|f>xhtc&0ؾ?:_Nab?x]W[FUygvzfڱ}d d5F {̸mvfX` >".!$͆@BHG$b?xH>@Z~(#9Vݪ:ܷ*{{rzh[ZG=Z5<~R?cmԑ /\}s?㎅p2n7wGխS=3'IBKۣ# ˲D^ޮK2,4~7al'Ne1uQ~p˗Ls'-h9Y^`-;IܶR~b϶CB!͐#ҡtYNT3CL+{ǯVipB;|4xfxeư!HrIw&suc[s+HҵIK#<$>dxr\|gdm%*wԟ|gs7 2<ٖ|w4;Fs<7Nm$I<=zG|~9+F/pDptS$lrA*oǪĀU/f3n4V!F,vI@t 6%Du0kY@>CQ cJ;E ??Vb{t`R>,bȎ7&ĉ,M}č]IEXA/~X;~s$D OKwp="uIgN^"Q)u|+4=a\Q¥JdVp):cÛǫl)D7:SKte-#1iYQk/4kNჵy=OӴFR4H %u゠X8M]Q2fH\?X[\C|'Җ WA~#k1:ott,it : h7&mj5izs9]^7N7i6Z0;[Ow>{{g˹ٯ3x[eFo>ON <6o<듟IL q !x$!! D Db8oZQs `100755 16-sim-arch_basic.pyᓝFbf՗m%gQd gjYrHm0ܓx #!/P$.sqwi DR_H+2o ^jh100755pyˢޣ,Er. S:h>"Y]ٸ x=WƖ?b*lcy-GRrv#˲F\IIo13ecڴ.HsΝ=oZ0nV[(g'HQdY"\x<{9>g~Nr2pto)4Eg݁O&Ie0/ҙ♏OGa<ؼM9#7a^:0 %KbLŀ 4O@_'o1 "q6G/C?@x&B.$^Uy(0&70rD."4 hK@Kϧo/'/'B[,|n'Q<é9<3?xqt|tN$)yutyrxq!^qvp~y8{{~vzq"V# a (㩿h nV[@>tP^#/t)TC'g7y>oxLQ+bsDq;>]=;;=:"ޓ]q#t,2g{`o_e!=H{$|M)DB 1D ؁g;L }4B |94[b2= \S|ٜNcbrnn+ 0Q2008S0: SQtGg+fr[Ǔ%B|-8!l9196?vuIv'^'$M`>-Aa4}cԸObXˋ{@[/JQɘUn8'PQLBؙMYLx@v0c?/hR0 FCO偍`)ZcK,/a 8nD7#Fcp;pa L?" @OȞJ $ >"#~ aWMb; "eRޠL[&1=#713qY"נiJwm{0cQQKpݜG#4m 6XkRMEO86aVBɣ#=QZ,(&0ͯo@Q`(q}$sel~vpazդ`W<ɫ-qK0ַXú)iyAH!'\IR}>(`!CZu8waJo4#4QsΛJ?i}>F2 XcQ$kISh R8VɤZƻK8$ ^u¨M4`cZj/@ހ%a9{w :n]Q]nnPo ~0%j~TwhMoA|+`d<;أ\6tbШ%ɀ135[uwа)וTfWhuMT6`<(hhܒCtO7znd SЎ$ [dN2^4; < }pA`e2-[oi[oJ0͔ a_T[qa>~"Gq$BQ)#_׽Oo#~Ra#_klnTb|FafxA?o TA dvmIH(?6pN!«2ZB|R-Wt _0<n>2:Q,x 3XADuprD`Џ> }j/PN7L"2`9GHzdr3v>aD*t׏_6) ۝^9d^"J`R!RsalK[1'˭~|aaO )"2Fةeg=Jo6EĈ\,YGښVԡ{@\ cM/V^`_4oDc>P"5'(y̧w/Y*-\b;f=%jq؂H}rH7a xut$lB ~l 47-ra%~{A4͘bON"w'IF ayBZR$` @:bKHTj6o!e=9s"00C cVOvt|0:L B#%g-d-Kt}@PPØ1X#z*n%CMg ץÕ(y/Xn[=|nf=P9@ ~½f% LrS &kZ}0ZDz;ԝu+RDڲ! 3"%PWmjkF. 3^W-ȓ",kb#kmDk4߃%uuWdU@㮺 *y u&E)wEb\z9M27H+*)( &4 5Ҟ9 I %XKUMEIGWC \BDx]>в 'f\CKqr6BaX,/\$0/,3-Kr=}iEkYcghgzjn0P4`c>UI 3) Ƴgp5i5G+MISQR|i+!P^=Z V<iBHH*D0)k꼺ڗju'هp2iAhK^7~~#~&cNPEbdT`)h^Q ={R]"R2 ,\`\vskJUC## 0;1eQan$wIp>Bkvbo0mhssƗs3γ.iV" &э,.mF$d5k!uPAMdV_y M&1xʢPh/tcAG /(+Bނ#Z)ރ1 9f`?a1u$̿iةR%B ;WF&b#筫Fz!+B<C f9~tXS)=gZFO*<'W+R" ݃HG2zmΊ98cQ|Y c7|JCQ+f+&]gI \|6Զ:ӎk=Պ _Ej9Ԣ%'0M CWfQh.XhO8 ҩ(2yjQ$nOr闥Zji+$UE雭攝 9fG^?5%M{ߴ5Xi?sL\i[ 3+  0|>T@> `gIf r>TNb3>!kd$Ș%| 5lP-_k;ѹ {CiS6u 1FR5'Z>s ݶ5  NZ#2nLa-A5Bj('D`PHe~qDrUOyQ,$_DRwHPSD󃳹q_.'h\25cN~-X'sT ndɆ8>5 | -,T,שߤ Pv"VleеEZdQ [A99:ޭd4W,rcJ7dc>_I L븻2VoJqQ%j 42:q\%3_+1,#e(N )2-!.DWVx- Ūhn}i2ɸM*b>p%tq5h(O|Dȟ~q|,̯7 Xe,-#+GN OX{j5Cq>ߵZOb| MO[F5dhhmd-L[ٷ;T fѐeܺNg Ph?łjx:r;ypC6O,Ρ)0TbmLښ,9C[痼NyL +ԓRƀ7Sbg Şc+h8wKOqQ+14Zyo~D\n5Fyj܎خktkκhQ]dz0pdz`vVYz=Yy*5v2o ]~_8x <GrmZv1hquӳ˃׎n#e1% 3L?>̮[Ł LښlC@i0|nץ& U2D-"/D1_T Q.J-~Q3M@ׁ.QYV:F}8g{1=jX!U;oDR,3Jd9::'m@4K{loAdj˳'|8'/{|y#l0Rс "6>IM/u0셣~ۀtD-kO]"*7 ﵞȪ.V8 v3Ƞ7D! sģm@*vE 캛H@UTY:A/bst;X,uuGw?wT#J[́ J(Tȍ{A?})+k0?MS<]ЬFb0Dެ!e0V]Gx޽.J CycNI||߽wFW E+6 b:a#`"[Ԟ|^Ԝk֬kFkxQkRFszk?fxtR\٨r>X tr^4F9%J)哾J}Xt@O mw1uCJkKarx{qI Tb8+,8D$XXr'K2Kf&9J\>N>ANA!J % BAݜG5v , UH5q x340031QK,L/JeәvQBjeYQƇׅx !|S2sRs*<^|}ӗL+r2Ss *R>cax%$$SI $Y\,Ad3} =|xTEDA/=$3=/(y8Y¥S_VF&ްQM]dN''ʇȧ|x$bk9u3su rKKRf8nH}u injUGA%5e?094}j8W^;LZJRKX'R[)ƙ{<3Ry8qk¤9L7h=p|<[aJSJ.l*lO2k TܴDڛAl]QZ>Oh.{c&b9|Xِ#r/|8:h_YaM)˿>;qgvL(9\ӫ NFGQ`I\$l;GvW/˅ f= -zHחކ(^TMERƜz'Nq7 W% 7v8wޒH9{'ghNDCQT+g(aLX [DOJ^Jף1_oB 5B[X۳K)ڒ %c̄ ,{>罙]n_֯Y[秝/H'xmQ*k = [$x%$$S_'&-°[:JГ} /4hx]Rn0<%ɮP@PENJE 2?(/o,)nr qvvfv={y: 'm^|SV9@>'a-vF_dc-hZ5plwZpUh!ؠ&T#60q{,P픈L``]gQͱH6:E1sųY/Ml}:H[bZ kȡ]\_'| /H+6˻5zeˋIGHJ[욕0s&*ޝ~=  Rx 2SarS.ֱYCܸȓ@:x;{wC$ȵڑ$vi2}\DF/ ]mx2uӆO n˻98qsw2U )\x `[뜓7Y*Dr8@~Dx;{wC$jJK[٣UɵLr\DFz _x[eF-j֘)PE+c$& cx8SYDA/=$3=/(A2sfŅL )QmnqfnRAZ|RNv|qIbI^2QByؘ;g鑍@SMM(dH oB߹$'UܻZJRKmmL~((;r$#WPm٩i9z ~n6ޛF`? -syscalls.c'&J p=q:P"b“J ˵(3:yķgi( +X& 8w9j! {{W"H`pfғ`Wl]rѤqsbo&+.uKu[$Nm1E-AF ^Ϥߓ}(0|n(&P\Gz6C/|B`W%-tHېxS 9Lu˔pb2M.|:+Q;xhg?S4kP "޳y$Ex[eBTצ /M^tO[0?ƼM4 z xE= @FYA ; J!' JTY6C2F!^y/ >cb MEl ̰IFQNmMNx'@XfT@Wj)k٠=Iۿ8"V6DLG4 ! up 3v:T& Ibx[eQG2rҷXz}P Ixüy F?8wk^ 赫qͩK7 *xüyޓX4?6[ǼF:io>#@ ~x ivԀ3 }mY@'-xX 95Lu˔pb2100644 api.c+h8.>n6ޛF`? -syscalls.c'&J p=q() Q:NV@A[!H_]F!<#3'U(51E!hBJ>X33M!59#_AI$T^Z[dPQȉ,<[AZ(3DAP)DIH[DV%58flZ& uerb ol6b\(PdTTzs#P l";lJHy`,{t(3xk55rsMFsr딾e"ֳV#T sx[eۋy$<éO340031Qpru fp[ڴ ۋns <!$eZ<׉(d]_U8 WOxʂL LGxk-ar̛xb:.!x[eF%^ZN5\Zu&@PZ\RPzZhݬz-JoMbRSx 9Lu˔pb2MnxV]hW&wO6?q'DcBD7kb$nSigw&,3TcT[h=U-Ei-@BAhK PKTܙݸjp{w~ϊUjqk 9#C# !2r DB6-byS)YsRӊ9?HcA|֖|lhh|8K|D#TNwbP^^WHL| 4Ww;HFL=`WL55|S Gچ٫mqmVVМ&[Z5!k*D|ܼySv>f"PteNiT3L /w6{^{?ߐdiiΥAI빌-$l=< qe\b(g-4ľ bL1 7\;3 F. j9xTsxj2\o=\T2'Jx^Ifx7EF+~w_/ڈ7EYxZBHLw%x|SIY9#_}z6Gb{_B65La+~ú}*`JPFkpT%Wȩ0ɫ,CL,KdS<ܜv\vvTk75|:R5v S8>EYk,`T4U:MFhd0:5/.dϕщapJ@n#r Ut/i}}OLsdYg'PLEƊ]lf{Nz CG\VRK>oBP n+O DY`đI'[eޫt:i4: /7ԻcCq碽6W ú1ؓowp'ꪡ-~r6yh'7gM"^Viat;\pE79$;y3A ist|bŗhdx#G/dѝ/vL3 ryŠi~KA-*?_?/r:5e?`,Rn #1:7.O3%|܈ 7[ѕ~v9+F-ng"&󯘶>'=fEgP\V-fx'Ԟ$95{ƛJ"_[{y9PWxb˸k⼌'qVX:<!^"eIN#wnֽ,YZ γd=?R2pXFX+E7dϬǟ.z9DA$ЗxV|r'U{&xK%*GWUR0iaAXMWw>R_5)CI_Х$$< | C,p4jqk{,@90"9lyʳ)$lxk`X4C*lqx[ƺu cF& x$I~G&V#= i/Sڒ e y EEE i %\)y9XT&9,2kYt%A⊒ԢļɇȲy%E9 řyyX5A {SK KKRcJ22 sSFNVes(3$[hO חMPs95LOgW`WS;\1ODΉuJ|S2sRsVHKcnϻPeA. K2_5s<MUPN!!~! =oݙX~xRnjsSSҒ< *K4*}P32KKfRz$E7Ce$XL @!%?a-Df΀s[Mv="SʰOq#6E`}''38599?@ Y/3A܅:M&ܞg.bZqQ2"cnA^ӯW:m> ~-I-.)f'7xAU\0Aʼ]#'As,>딾e"ֳN 6x51 @EAW,RnɎ: ;g3x-1{{r%sEe'պ^PVC`k+XGo] 5:hGyi ,8d˳D8SRE_st5fx:!WJ_?'38599?@8M//dc ,xkfKOKL1*2Y~H0!%+QD:;B+/z, Tu7UQ\r .QVJRxU)LW+ڦcEµ6ZZ Y!ɲ-"bEܟNwsسlC_:bY=F97oGhajRDRIPgr7PS@#gWmW\"G==<~3z'͘ hۘ?UiJs(kpP}(L,UNj Jx[.#ef'slr+m]kT&x![Ak A - gxE=JA'(lKOw5tWl +{xi⽏hdMP)jO7( CKkQC9s vuxM1N1E%B"aA(Ҡ/ӆq$3&YqRp*$z"H|8FmtMw9_Π##1XІ$ &SU+Ȇ `ځ*`n`_<RaK/gG_L bFzѯ%z=Ȧ=EtʴTy pd|axXmolS6! 8d!)Qi4\%ٽQS!cت}=vl} e(R6m7 ̹]]?V`MmnylůtLcF;DR_k-݄&vh +* c!f Jڐu ^a|NVӝ N'?3NI^]kmN'7OF^BV0ØVsS) ,ex)t :kwī4|[9H?ŖOlxfgdqwqvM2:6+S. 7`/|RΜ?!Pa*<8|{qo8}-}̔$oÒ Wqra2јztOW1?G~l?@#/Xby>WGD8 Z ,:{,? `)zACA$M好 v/M_mVPYF:Hńa̢9޷a<6ж|CC‹z W5^W,,zETЈEvV_gk䶰!܍WO89 la5̓قEIugjAFcЗ/\q@z.ߑ`f"*DSGQҁRA%]C0&I blivC2X< $O(Y,~@qԸMo ]se+Z2e-{ꏮ_ cy[ˢωxNdBj}uD=-p#t2J~P2?4~[JXg%*/7*hߌ>YE2dY`iyO%r  5;kgM w ќl 6lDFqo: ipw?BYkzK a}j<A΂ޕ{2BgI)H5ddްA4{*`Th2 Z KD]MEƂq;QkD_Rԇ vʣ. S/0ڹ 뛾Yj3ԏ/Tt:HM6*R?J-4op[Zղe^OʭTJQy*o\[]7sr]P9*#^q5c`kPkϖ5G !rL XP!7߾=}k;M O\^ [YH q4RR$r>,=B'(WY1WwJ@_$B~gE ?Hm)^.jedM`bD]q'&;?肅.0tEB2S-utTDdtEkβQIN#cs -wƜ*%1kVNV0`*p'!!Nfʟ[ nPkQ[U8yA"GSL{0IA JHBYH[T(؆ \2%uyCQ2r"צ MP]}ZC:C4Eddjm[v5g:˘Sr>>mttY\;m+M]Ad0ps,g LcEd ofFI['icߺ-ii>r|ƨ̼ |oIGCWUɘwmT^c람8b{1mv0}]h ^p2Ԑ[iLzv3mҁ*fvd⒯Uk%@UĶAY^zwU5I!Rŗ"I9gl8}V=Qz~ƠkT|q2^&}N]Mᯃqz3;' Q_V,>3_VJ Fox340031QMNMIeyϚZ41L @!71AO˷Oϒ~zoQnxn0S^ Kj,$*"LUǎl$7={n\C_Lqa,Xf0akz:I&kC@9C1ϴ6`2%Kœ&%plTa*,31`uvu)La!L-m ӱH(ϑRb4R&آB+岌=O0Fk }FIk)8UQYfI,/lJUޠ8Ә#mlfcHuNΨNH kbR; ^Fp NW? WR?)[<(,ɉa&7$9hC:Q8/0Qo9/lKS1:&=dPƐ-Mq[ǀrII6U (Թjv;o OMK$wzVFr%EyæU"6#zsFAu|@P.%N"x>,uL̉?mwݸʘ"3ݲ<#A%+aBɇp^lHjׄ JdkDM!1bq1uTDvDXV1ӯEv Ƿ\2'`ΙUxS&k^a.^a0ӵDfCà8F WM7Φ.>}Gl-^"?4@4W7"ܠ^0k~;G79Q8Mx31>zi)x4]FrX %Z') kXIX&Txઈ˽? ?5H˕eO)Jur [0H,TIF2BJ CIvDž uz2X.@%e<ИF 4*(WГCC(,.XL@>UOҀY1Qʚ1Ӧ<4tK6@dR T,kF!N+קaaJd|q!󵹃lj!4jGb\@(\uknֶ=l9xCydsma'd6(f4X8nSY7NcǨV)z661β(D$P̠) bdhޱSEJ}}јXjg& !g=u9>-JuIO",eCO7C(*tDL:<oCʅa;em /|vW|M7^?}TßVk0wiWrPɽQkSo/Mc%d3xTKAzꥈiDZ 4+jEc ,l 3QAo^SB^fw#6={c3EˋPbu@ Wo$+,\\jj.SQ5$\GVL0`$sjJr^ȠJ 17tb#XZgAmTW }2B:S023u_sJ F5"r Vsa@@`lz?ΤT+qӸ5TO9Zt>`fb̀E=@H 1̹;mw+p"|7G<j-PsR?D) C.}:SzL 񻹏3;byjoxSRG("c]خU+Ů5)UH9~ل2)q&X_3Is4qk3ORT͝={cs>Z Ju>$&LSXEOB(T GXrbzJIڿj7V,X/􁹡L'ir<o:ə_J˖^<'ë'WG6/dI6.8Y$ӊG}x<hgnɤlw7Lu[xyC~NfRqjrr~n^q^^jBHFfP(RL.-*J+ɩ|^^QaKy#F2 ; roxT=o@Va(9V$@<ŕ~PJA* bd]K}¾ s۰0LlX{g ܐFy}y NP f!M@L&,4eϨȩV}_ uhgPe>vFVpaf(E!5ǖ8Du@U7sLkm0@LUXHy}!]_8r_hƐjvYmMoe2Th*-&g\`'Ts cy$UgYס!- bJ` $9PI"6mX8I^z!^GvMf?1bdL8ʎf,VJTt)eG8,amt`0ɣyht?&߮Om^cY[.ux}xTmOHHBi{T5@ s=X{5Q:$7<38z{mAm8VSMWB<t0a9OwL8s|D^{B'IwIn;G8ö`GQav- TnOvWKپZ;xs< hKQ+|c׎;[=s4Ǔlavm2}Gd۰;𻒮pa+ v~цP,dPsPxs:dOf^̼ҔT M̼Ĝl..ə2\\!> ɹIi)ʼnŹ 1\pL8(8?,.XZ\51/8f26..* œSHIM2Nť H/PʰTuv]#\R`S9K ʎwut[64Wf!Ygpx;ùs,@eIF~Sf^Jf^zFL?1ggO6`ά#`T[8d}bNBf^q NIM2J3sR M$C *R .N _MX2F@dSBI~ir<0 =6h[PYaUvt "9.fwx[sFL9E=\B=}\lSs 2&/f6Wрirqe$X)shx8{9:: B頢ᯩꧠ21DSAFF! vuTЭOUP/WU s "]>A}v@Ϡiyt.<+|5QC_e^Fxδi?rL涛|Wtr#OYjiy%)9\ʙiy)i ~A`?J(KBX6ER*&UoT[ 6 \ 2 MKLSBO~"V挢Լ#hΆKځ b:T`SD7oQ rOxƴiC欓9'sL-YtH2 0x4+#֪aA~^A\)iy ξ@x_O? NN$ Uɿ%EUU7+l)%?G{.̀WNhPr%xmx' , Y6rMΫR ?ix[TKY5/#1/95E!8599?@'3(R ;]79?/-3]L%dM4c4豀(5-B;pV&8\9I)Eځ+3/94%,`;pq%Z)C\Z\YJ!$#U!s  R())GWZZT 6!5>5(ρ9-'1JASZ.`HD}T!Ú ~qsx{~cg^qIbNNbIf~KjZbiNIFL~!>>An *~n\\0`'Ox Z GS_EM~qRf\M5x:a Ł@E a&O?gSZ H2Rsa Ѩ[p{hT&"^rx[TKY5/#1/95E!8599?@'3(R ;]79?/-3]L%dM4c4豀(5-VU/8'> 3BU+'3)%I3(S UPKMR.8%8(dBHFB*̹ũ@cQRR`0A8M//+,ljkP_|c+Qi9V *r$R PneÓm xXks~EQ6 ;GAU!).vv$#H\Ch33#^(/ N2FuE>x )=:n& l2泹3Gh1;7w88Lt`"s;4f p*5a:LOR pư=>yc19EnY07.=i:,I,v|˂qCD},5yI(Vd=2}0H6M%\]9UmQOg,CLb'K k [gho{|a8'gFp s8[s? gORpc~~+ A̚sp\o.ΓuG(mB$\hѸ3fAjg!QRFgVИ1qyi V1< 'qж vTtUm6}1Tŧ*|$@ZT;/e>&B4F {C"t`gi,ӏ^(cmU˘vzLDž-N̚Rkk1߁ [ X̹籠G JHe{Mq3Jr/rp" }wN@JSubfk[,#U8u)  EHI"^^M=BӷBL@@^R^ ,bMrx -}qZBE1N 0[WIZ{õ]nB YS/+iMt8\6X9ΊQecB.5Y{'1//S3mc3(e*&.JvYp+_ZQhW/ t0 idD˵TGvM)Eee(c6󜼷{} ҷBR}0_"obRPl ')m~w`w%]ԣ{&ŸQ҆T0uWV'EU~Sf-wT=o/?]u &Sr}ұIu{8\ʢcY~>U&zwͿC2!audP3;Ci~CY[2qɭaJH'-Csܷ*x5cY,&a L26^V[D(Fl,fTGٵWx) NePnc #˭3ySzUA^|ZH (݆|"z':A5{@M}esyV=ֿkTInviZOLf$uWϪs}+tn9+Y8AXRV 'eT%g۟"#_SmTۨVm匿G]&ۡkg,{·} ί\ )x[ՠe3+4g, * *6 *>.SʙRJs 6?[r>xk:E=XAVA7-ys4MڽqVܖ{W*aه |]U8mbQUqAp4dUFV3ݣJw)lZ~M9PUwbcWo)ൺ*S*_8Ͼv{m70CN$wNk崇}g94rP<=EE=\`X<3tS/Mzַ-놦*'ToJlНx=VL@9*2V^/o(`8#1DT`t$@ܗZX٠wW7!ٵ-Ud08y~T[fpf_n$ &Qѻ8=2 Z1'pzWqʤUveyIi@Cz(߶Q]nV].(kû/ɷg.|#1IQAZ2Фf!&f.e04|kzF -L>z2(#.6Y*D4 OW`·BVRЧGI4?f3WjF> P(,cH[Prxуޠן[j0KRAYȷxCݵrb-%RGx265Pm=3ۊ 2#8100644 api.ccs$Q]G&-kHk()YJG3 /sNlp$U[`~Jj/RSN<6 3l]Y)LʅwP K#޼100644 db.hֆ;~3Qu100644 gen_bpf.c!Ԓgq!Gke 6umgԞXր"`S3lTႂIcg +5+\\ŸT/ɽwy=(DV%~$RXAxkhpYڹ\Ղ/9M5. Ү ,xkhpYsĭOww Ѹ}"+wUxL*NMN-+5[uxToHĕ.1zNDq itZ5^㿿YH/?޼yofWx<#< ,h)H"w0#irj]!j$ʝdLC'B>D3!>>HdD;qn3!0'U38jeĸL%D߈C؉ b#Ғm*Mi < HXq*P :,^TLp;fkRL9$yYc4g*C]76{]0hvκ8M %*CFsPM $|Y +F,WCb=҆eΐHXyhxџ\5W!2JS1e(@OT$|[ŐCARB_B3Aly wgUX evyPp^sL,xʶx ;pGOђ׌+M9׋M;M5cfFE ? ֑7܅׵.H33OCQ;uXs"s;LF^uƸ1M:²kwG}pn [s71;cwFa0^ '.^m׺(RMMA9s Z o/9ŏ>“=] ]^1''ohw\rw4'|Y%AXvMµ.\n*/Up~Ùq.kuffLjӃSS&`d_Qd況qFР-QJQmcxr moe=ѬVлor)}Nti;s,xʷoCfLc 3|Ģ Lok7T1M.`坜2ٌ]Ub8xƷoCf 3|Ģ ݊ݙy'Qx;Rt2NĜ KsF6L\0m;9F{earj@6>)Gv]W7Pwe&o+Vt/O % Oce? U'Cux[Uxf?L3m8׎ɳ& l~4o2>z\'/Z>YAsr9Lf3n%(t2}m_Wm'i 1(Q0nhک uhu mb-M<4i*6@ې];j{sss^3'ؿ;ZI&r9`hN97㦊ղV9gʼnK)nWʍbYQRD՗,+_L,U(Xq{#iMQ%y_F OL>05gO|rL<+?snn("qɥrY*Ts\@RXrլ)͐c<\^F.\u=Q)W\ 7Wysj4ȋOR))GL1yJ<jc+Oۥ\ER(4NMQ-'C\U4"xe/' wW$J6A[N䖤 ZpJaTs\ct. 9pj5w:»a4uS؞e)h((\cD QdZ8eLke7%ŕBZnTD-*{{Zk*Bؙep.AC4cb ZPG9|#;hC:Z+R8` p G{pXGnG,>U ti6 ';H vzUACKPEpWT>t,>2ªݫ(+iGkT۾R! 7> GUD׺C {i!bX;0= ҿCafc[µ 7Gkkﶌ'[Y `X|MwP^W2n(d [ wZh-KgF|6\8:jG_&*V0FgG2HĬxs5ٷ,X'TMnI N< Au@㚞ĜGAyŴNY5 "chǛU7xTa G+rX5Ug:̗d#uEi5YFoX\3^snN UI_3[(1?2^pbabY 3WGVԁݞ\`C̅=VY8iyIT/xXc1tERw1?v=x5K-'D#671PX U::IQSw"!91 ,٭x?|+ڨG#!]`n]d#4 @# 2϶նև@/WњGjYJX}\֎ͣV_̝|댆@6mm6l>OHO;I֎rDycșBYIu[]T0[GPol>/-X6'~3+\cms=lx_xo kBfm?GJ8=>RBMZ=6"x `F)=0a".pë?BFN*D T}My2}=.ETUt_q}C8zT|hd3_хH&vZPt7 {d͢m3w_ׯz8+3*2`Rlzuhr0?Λ͇h4Jd!pmN\p#.\F^&1eJ#Jnr-2ѝ\~ܸ6.ff*n 6T\ 9]X9aOP8*HERn a!kkֆP`.I"( q̼p"\Iklg_뷗_y ]ݩ9 oۣx{7foxx >< 7x;`(Ap&-?cqqUW  F?Fwׇ>-$˓"<}2.Fƾ'B@͂T 킨 ˔w(=f %@ImXV5_ Q5u`b26ſ{Аc\!yk6'zxCKq=|Pr9"['XTD;I(Cgc ;`X݅~mZ>m(gW]r`@}|qs{<\7q:]/2J{:?pUݣƚմĪΫ:Rr|9ѽCpYN갺1 |}>N[v.}'-Sԍ*CƖ]A BFt+m?cq%@i[/DKn9AIJF:85>^̚N_C70v7*ŗzW/u\mb:Im4!6-~MK7ÿjouWRԹPiKŎod諈Al&_b@^_I ^zeC}cz??o\nKUP J$J|ZH[ݣ%7 ķ<>( W(E}ly)z(z^p& 1/ʴUPG,]?S|'46mxfS+Z{5GqZ5^e]s>_GL|GbFo8`4zJ'_x3aw;C.?8gu@8=1\RBfT>!0|aȡ")ćvy)ebוvy)eBbsp>C1]@wH+~i XjAb4]xm $rC1~ Cf$n= `QغA]}=86`AS)U%g%y[LC{ڤ9| m}o6iuI5Fl8| f]Ti*ـ:jtm;3+uiY!@CG/\aQ@ CJعၨxà ;Q<K.O?sd>kK@Bj␍j x"F!GZPWڢG,h1j$P\1AeJ1x4%; IS((%R]^ Fy&_Ђ,deQ1 2RhpT'㘞*c./ңh f3J,IAH!=_`qn0&¯ n(2^YבܢHYֳ֠UAguQIS uH/ŭ)P4=هrFT)\0U>I=Dd6(yb>I"H!F=_`(1Z( $C< iy=`  l1 qnw0c D1 Xc@pbVk572!CWuH= $/BpGqB#鳃jNZF@Jo-/#O&%mDqo¿fNq< _ 36vFTPo)C}a<9`aQA,Py*h<r$hpc$Ic4y #9ɵvq=z#Ԃ_pOwc/a1Ac&311;^34fr1k3EuT-рn)<k %i @c(C M#$LK؎Ǘq6O .MxL{."&z@3eUw2f9k<:riFTm(u(w)h1ũ`HD5)Β,àk-[룱iveQA ~w fL{@e𥻿iVdˁ-\t~kHs{iO쇮^77;*ݝd$wGIzpFTE^ дw::IQH-' b״EE!I=هuFT)IRj9`[Vmi iw05ʀ,',+(m=|T(%x8<ҫ" c>b fX#? c8*sxu_HSaB*O@Qf;g; E#,j5Bg?ƛT1ZxMj{:}n+ԩWWfʻfXXj#<.^{[>t0&]pxJLݮvgp4t_#5<&> ik*EL3 "%"VH'!KE"aeY/|DIqD8~D 2`3j1@&V@{n,Zmâ_˘2#vR\hkE]( Ibz"ϐJl҃%*9V /TN7$ [jbӹF4DCEffZTϩy/>f6xAOniԼ/؛ xG *xuj0F5.bP%CX3etUnR:I||J:<lke 3-,7/m uV+j3{\ZFFŴR[9T[lA[}KaV?X( dTH+,^@:yAre>Kwebu*,"KGD4(捤UX+d 1~?\gAc:teEBx@d ]OcL,xذyKxvԼ4.EAx;1qD I̜fEɆ Z\ϹMbYIp( d[I m9CRq&)od6%&maY$O6lx[>fV x3:̲HlNpd+Q(,NNɱ2l* <sS5834` l 48jl"#}|'U_۾37c q7kBHo-/pa&\j$R(bs^DZ ʐ`q`8̂  {|CJʟ~[):W"@jeD֨K+)V]T8]XSFl:Q*-4V:(>BFx[Ϲc),ʩy)i\C-(xH_^b 6-rc1 */ *J #.__PNR_renameat2 b/Xxl^\a4.7g@z__PNR_finit_moduleA  _llseek", 140\^ ~$<$ų%- B'zx[*rC3{qIbIf fkMV[x[*rbf˘Y49Dx{.}Ez66ޤ⒢16fR oxusf?'Od9 :&xmXIlY!{kر98^d D2KE=vڦk4"z ,\r H\03]ッ֑y|,^tW?镫8Msxhyǐכ/??o Z}{s[kYjuȠv, !b#nz022 {E/|/XD^SHGn"!ѭwn4&<{7W^;0] % i*(w;nff֛A<%{uSxIZDANVoʙ1A5)&Icn U bm|de;`vX @gU K#Y\4֡:l KXجX{'|ʣ`$eA.1c0gZ?!<E֏_bD%ݔ-R&8}{ӷMyzڳ԰4Fn1<4S8yd c;g&ry <{6%CyY}1ׂ8$=^ô{p⢱Y̶q(3z$hcaW jDJ,٣D8pnv XiŊADstT2(D3kFc|_2 }C^j#D|HDa¨ñT@u t$Z`:3t^y~<^~ C JJ.EUsa?gE8B(@YħҌSUjjFv^B c( 2[p&cojsT!h՛V<- ܍-lT;獧4pnAm6VE khtC (р:J^|q׸ ?o/K! Po-o (oғ^@3)fȡW%SkV8V!g#@ed-tۛprgcvA&n3,&geԛ Qxkp- +ǒ A}0vMy^!h<[^j[mޯke&>oMҰMZw.+^k^NApnYD: $W.4 J5z}Yihl8{hj`q<4΄1Z9@p+Hp,E:ZIS&S6Ls0M WTQA:04r|BĚdY*V R.,6O_$o]X40?:JO/Ld"sԫN~m`LkvCȭ5*-R9wʐ7W]")8P6R RyK4TCG8J5*wo5M*A5l]lͩXi^uexE(vd&EB]΀K9nRK"֋^W䗗mx?: cڄA>E~6Y{^&x1L&(J6'^o4^z:{e0鱬tU,J93o`x)Rb]FCWob<:]z.BMI8\`jb*g"on8My};9^ʑu Dgִ-b\ir $vAP02vaW:;TTbD6ge0bþ0BO;J#1J᎗% :9;)&~1\_x]`H(&߼1-Оux#=fǷ'N7Fğ[;+({wtN8NxkJLܐj[l9`>M3w0n^ǼJܐ?>>/((5/175hs<͊r!MxJa_g4.7mC ~ M%~Zn%;"&Ƴ' Xx[4f N̼̒Ҝͫ9Uj *x[4fRf+k:ZDx}J@AATVrzi= X͕b'"˲\Vcw" !! >. *jf>&o:i3g_[G}X(_\-x/w+-&G6Vga!Q%kFQ-լۅ=0,XpHIFQHFs(W<$f̻]{cxe0o,/8)Jv/p}EgG亩5WK1Y NF QchsX2u +"x5sf| MNNĢJ,F,`FKrj^Jf& `xʜAet7g,}qͺ̓Y6˼&0d}Qg6JD6 OE֐<]i31y5YR_Q1ʂԸ6/T<2 xEdR@uPo?$ & d}M2D!#(% 3Tx[*fEŌqrl~qds~ɪʛ02eWm~)) bL)!64f;<tRx3KC)@Ks 7  !OxW]lW88;SۻY;_۩kvݤQl&1 Hi11dvgf?:y@*PP@BT S$J3HCE[  opI2ڕsιՎ?xP%ْDV4$U/DEtYej8Qu( `8.tmՊd6U6Mdc"Yw$WF-PZvxiWt'C3<25N2l`T` oF@׎'0>akELn‘R}>?r?|bcigøݣ:&"RDםL~?"ۑ-~L8=Ň]$|PkQn!܃H<OTBSQ*l(9+\3M`ޖL:\Ew]e(~jdWvɃ(_킟>S DBQegő Jfsũ2CBnZM!Eqf 9{REjDB8biP I-@| _ٗV`$a3Y@J6;73VIRY>ǤY ɑtMDҒUAUbbsU߹wG'M 0q qKz.|h(1Hf;,$@y(ߟȼ,rOONrcofl᧥meԺ,5[ԉV߂X DN2]D"OWO0g(iSR?Zܰ*Y[!M⁐Byp S@xa(MO aEչIy^.8|iҋ]Caeceޢ5Kt/!tnÆR]jUeL|Lˋfw<+F!y9ye].oQ{y\IޚJgLc:Cl#,zpy9xhK׎a/T/gE, **>$c M@{9b$l t+"c-Qԓ؄ ')敦c'-NM;aFN+CM'̹z(Bļ{{McޤO-v>{~\͘0=:nES a*Rk ƧlbeZusʬ֧;}dµ%P|xG>/Mw:nvqX[zDVrG]Wڶ.X xZAG)3 X/Cis{YbNf5eX$J3RS*KK&JŧoNaaШԵ/PQШ4jjb86ag]̝|Mj"`m`+@)(*LNaJ8%***lmB}|44&+r Of5'phjr)e*$'g$fPy9e١)YK @'g \H8 )J-.́ (dQl̩$̉U8y <6Y3n ߜ lJx[}Nkmͺ\#x;Es> \`Zy%Y V(Nn^N>P4'N|q)ӖJNW19:>MgCCt Xxq_6^"ɉũ ξ h9ygRQjb5''wW2NX9 2J4Ru4'kMv4E2*%5-4hA}n̒"]b]Ĝ[[ͧdO&O`K K&KopadVRR!w&?'$'(ejZ6NQB8QV*ט, 3MQ`r$th:SR6VcKDx8&3,& ?OG100755 16-sim-arch_basic.pySh3;ڦ?Bbod %^jUs5X+=J*T5ӓ +wlIhÎuck?C4n  7iH㫼%yZH:)_TFx100755 regressionF]1)Ï*;"2՛Mpx8W!DA/=$3=/(avjffߑ{g n򕁪20-M/Kf/?z/Hne81 _dcwSY?X2g#D97{VۺWN=39Sd[d6}C,&b쑚K zOsSɅL“73%?gpLS|Y߷0YF$7K+O٩ Hm.v pN.)ޑS^2lYpR[w6Љ,KXEbDL>u!mF)M&f+W/-~TF;FEhkXgbے[;{4_&nrM?Tnl.Rݹ@|r[Ȳ筮{xk%_&`kιg:>qOq~b;udbg&; /̶R8J\2/\+:c-eg]񑂡nRbqfnQjq~NYj^A%r]엾e=Ujɗ8꣙ά/3&n|+`A(9#l"ȠK|(8Uty}'A bˉq7ʯr0%'7(=z2X:~ ad;xRri30'a(:S+W0eƻ&W?5֌w:PyQ&kr)ľWd{ϳ~ڤ[#/-z;9O4QyF8$NvKI¡[lѯZR'w߸ԧ_g).y)U<0tȻcN.R6}!C ""}n9Ynْ2ِKnWsoA?Tfy A m9ko6sEI3 B<,5 W;}jͳrz^qxɏ]\v]X=䗼" yu[y 4M1M8u ǖ<w1&qMNMIe}|'9d~ަ#EZP'e5ߔ$&dtd%cޥ3o}Ƭ1+R Ϫ6hOHx+ &100644 .gitignoreRXAYӱ& n|P"C` -HS_W(Wa5 c^cQdX'FQTz21B`ՎDZiUOYWd ~!vL㐥Ry9O_ij n(jSOK,2 c&\@C>%ny}100755 regression3E'R<tH100644 util.c5>2aé QE4":x'Y~ؽB1dҍa~Qo!!q`挏zaGifdL\!G"UW${f$Nհ!("6}EB#*_(,e47'}LB:ԚCj+ƣsp^P8"K19΢?봓 ~/_>3i[>tG) &iCF_nňߨV/ ?b΂/5D:c)n g$vG|p? _ m0G\]r s/ 13QBl&-奄%60f_9l:pT0\(51ESGXkr#kBp_&PU}V ˦+[^Y,U ,Fu8@ C}|u-/L/J-)- f$@x%xHpw\̪mbI`[Ul"x;$[p, Y!j xk7aĕ~';1ZMeb LX̻,zP!ɛ'grl5y8fɑJf&(Na \S gR œC&Ź C4:"0m/~]f}3f( P5k/5xશ2uҼ.\TW0S (rX>&,uОJSo֏8t<&Ӳn5$bgtNsgYe8;D^u*N..m r0 g|\m("ÿ8${h'X)+Տ J0|rwg,zռȴWڻjf2vx;)QxNlyu18{x(<[xw\\ʙy9) 6EEy;'/`N/W/-LS(NMN-O,JΈO,.H.Qv w r0T✼E3TӚ(YAV@DYKf&p cHzl11n G(&c3  ve#xxg3sBpeqrbN[fNIj&LS/QH36K,.O,JpzfV`E`c*SR0T$%~!a6`)2" @JPTjA0kO.f94'U?\GA($u'fzJ: E: : ŕz%)EEzi9yp0MH/NUG%LJRKQZ_&7(=U(PQjIiQHfr/Z|Ĥ:x{3g3dfE&aQKLIO,Jpzf\ @_T\(U^jEfq "c#M+HC7(_c/L,@`ٴɑ,voL>"&˲Uj8((g)AB8@)V@'xsgC+{q~rvj8Id8$%|r<^PB4xɳg$Fq,BY_aͦ*w `x}Q3\ĢdNĜ?UJp&prNb2Īpr.:v'dTwnxrN~q*'A8.[ę1e*,8SKN%0dcg薖qk'`=:6HLAyf-AtA.4^g.xƾ}~fS6Yx{sgC,f%@e63 YgFxŶm23 `.xw5FU̬>>_1+O:9EUGG!7 >82X(51Es.Op_VsA:Dte5( 4=9ũ: Ye 8@C=T_^ZRZ]PVgx[}kf d@"x%g5FsLKKK834Ss 3K2R54m}=#,489lP4$h$T蠩*4@X IE@ s scظI/ɳV$'LvPZB2BwDərV_lEx[˳gL { y x{s/F?4Ģ M[[G K/̊K SR *`HEeH~!a%E9>>: J%ɉ99J%E&72C$arɩ% Ay%EEEg$O`Z>{ x{˾yFBPjGbMAn~~QCQjJFb^r~ciIF~B@bi/H‰6,Ew˨ZgfgW''sjWXqprqMevîvzf- pn'>Zgx[iC2# xuAKAQAу:P]V1ojRvQevքsst3a͸ht0y{_77sBy@E3h%K xT0p1<"S.%׆]b$5DqAR<3ǓŤy_3z>Rm8k0BP&ʴR1zYҖֆ`D:1tF5x6iJzA[ԃD[yW+b\x{w\)N>2{;٬k wl)x{Cz:&% x3w+d~楓?1$(iNvdQ`OC R#4a+JML3gQJ+.((-+/,IOIPOI-+Q|՜4D`2/[>.$xsC.HbrIf~BHcLĬ x,/ PscBpgPhpPG, JGx}{w\̂KX'b2l'x}{C^@&#Rx{qc#vY 'd=&v(F? y.deV?9Q̓| bgLg|9*xǿC:3LX6`c%x?'f6F.ix?$vF. )x{qqA ̛%g)DG+(T$%gXX*)*(i+)Z+dqqr*+8 NqAjrfZfjHwfIjrIiQF&PKqf.H0>' @iݖ`ˑANɉIEʹw5%mSs`nD>#&;j[E28ܨ1dڢ;x4QXXҢԼ0ᚬo7.(*gg//,.I͝G#58w%dZ`ov[+W${k+x[sw7OLA!Jf @ofPalX9TuD B7%8'\$˩SY((O,14U!9?%X!-H$#X$D RJ33Rpr B<#0UA#(5$R4 $5EJ5(\uf d'27%wJxbDb$E-ximSQݏ?O=RrF_y''̍N׹֨ gQ"f&& ɹIiřz St[&̈_zfcvUW甥%:xy*"y[Y*ö ᰝ ֳcgb 8?FҮ6=dMcEqY#)$S,^;fcQŬ-YZZT_Y•3Ee: "3EW+(I-KQHMKќ|L,WYSPZUQ$7%_!/D!4$5V$#X (17hdU6lg?[=xx[eF6f5~][tF sx;{wC$ȵڑ$vi2}\DF/ ]rx ivԀ3 }mY@'!x[eF̲4|mW\&@PZ\R̰E3s= h{̙Ĥ5Lx[eBTצ /M^tO[0?ƼM4 z+x[eFWM$.~;إ?ڄл ,x[eCm]5A|?+v>x7yc1A,x[eFR}? "ӶGiWx[eF%^ZN5\Zu&@PZ\RPzZhݬz-JoMbRKxw( ¬9"c5-ϒ גQ+x;e7nqfnRAZ|RNv|qIbI*+ ,rx !aB nqfnRAZ|RNv|qIbI "x340031QK,L/Je{ԦŢùr2rpswwgw{7$ӓ|8u5i0EA.! zkS]64a{?unAP%>ή~ wb$u%'@&fe%2_˗j9wʂ\]|]dLk:%}yL7 *C|=CB<C=\2{6iˋ3,{8@榦 %yz +?T^iT.Qყf&e]pᕻPYGR ի+ċwYBJ~2Zw̜?朷ҟz*lD63/94%6ϮvE~yȃړT[W v@O&nunϳqZ 1(a$aVؔp-I-.)f>SsaŻ}j$޹*SsR"or|R}KQCA}xw( ¬9"c5-ϒ גQ cx÷oc%׈ x[Ģ ĜݲĜ̔ĒYB''(T9;9{N~j.pu0?l Uy8#+x[{DlFBPjGbMAn~~QCQjJFb^r~ciIF~B@bi/Hʍi̬>>2kL^ª%㣣QZ22dA6Y1!B)j̈PcN "XVdhH"#bLD#!နgswQ04쬗x['pw/FLlEŚVU&gkjrMNa7b11La 3ư1, VCC82L,zQ: ((O! ,[ҒԒ M `Ijq\`̜ԢҒRPc[>5%xQ]K0}N~E/TN"(V'cIӬ-K܈ݯ7/+ I8p=瞜aМ1DJq5 [ .)PT53vN LȖ[)W)\Z;KH R+5:P"b“J ˵(3:yķgi( +X& 8w9j! {{W"H`pfғ[d*lnb!|B`W%-tH% xV]lUN R~OB0Z۲]Zڲc3Lwigv63 eD^D901QILh|&FML|'sgfgw򣛦s=|;?^{V*5Rjɣѣ᳑E ^eل J"![b3lY)=bX%>JgщX47yN)]ï /A"!9U9-ѡLN^0^:`R.dyG'dR=T#mAO7;мg9iBY!K'{gnn4#JIڪ'o)|t-R03e:X`0XjkCZv[;fhe /j! US&uB!͛7h{ cyV) EWM5̢RW~ YI&eh=ٴ 2m$m=lelb(6g-4Xľbf|Anv"k\pѲ#Z[I"iK=fWsPN2ǻ)zp<&@!}`j#ڀ\ydQi r 2~dnN%QLfg4~f9t}"^sϋ- !ִ&а<83[m;QZVʅ2CTnI.vk>DW :>5:J~>JӇSBd^=7 kΫ7#ӼKsOAwO9FU÷mcawh~Z1"m0H(iMFbRhwQJcP-D}%L#$5C# 9v%M(L׍rrw:E;#% rpB7Vtmu蜑Mr7l!Y(#9;bT3lɈ2nxSWtVjm4ur'kAҩxYzi_RWV˽ꪡ-zz6yhh$7:M"^Rha[u'澯ve}~W΋tf(IM+kJYb|a\54y|2yc8y3Cc.iR^̴֨E)~utbte -px7yT j615g Wx5$[5ᥜZ%y v4 2E[(^bBx+-(ry2&"Midb Tx[ 6➞ZRYɩkh`haRe楢 sr&JMN"iX5դ\ !` )IEy%SPMAHO>$,Q5Ia( 5K̭$$(cTS Œr'Lf2&Oa+-.22㜜0M D5" OKLSBR1`HHqmn+Ia R 7$a5*zmxTkHTN9-_ 4ֻb1q68}7oߛmn R-Nf+i(wj,-eн`9<0 RҘZRk0'#~ [Pr/4[B#Q07U2&/ECar^PTNʀ*`ڐ!h A?DLB 8y=}܏$&|Ma2NƳA0C|_o<_QZe\ 9ltd5Id %i9xR 0cimu&XJ( EanfNyASQ@:Oa:Kp9(n+4ǫK2shwAz73%x>ƓY߄\>w/uыڦSm`\U)M P/ :|W౎i>['C[#ջVp?9.HgewzD~u~gX{}A$>'^uS%IMV<|6u-,+BV2 JfsNʬUevDs }} ] /o}H'РuzG s$/bx[eF2c>d~nramx '&J p=q:P"b“J ˵(3:yķgi( +X& 8w9j! {{W"H`pfғ[d*lnb!6t]ICL B@c9ãLZ<{8yVմQ "|p{\W줗\Z WJ@V鴜#Ƞ/RLP2hor"kώm!( N8.FWDVH%2J^N<±B+t%$f$rEӥk;(#kE)LSGiֻD4Lf*DZ-wyGbh~dUo1sɉ{L7RMV6/u>:K[m58LT5KsW&T&\ay$dGpZbt1[Rj!K k'E*&^vlB0}[!Yj10'nlURQq^ Ԉc4@#θHǘQNJ=$vʧ|bGL O(~nmdzEpZT4W[5m1:"O8e6ojE[3 ݍNQ8^k¸޾C0pGD >pᒙ˲_VY׵*aBZ^.`%`auz!Ocf?if0ܵ>7NKj%a0݆g(9b,WJ=iwqIiE\2v¡WTپC'3H]˒,u>2foZ]k"J:/4qnƐU+ 6)3Ⲝy Vm7/E}lh_$պb)E!iIcpVݺ;us7ڝ ;q%zD wA6 -b4Y'EڌaY$8Q$wa"06JnqQlY+R2+W7K$B'7Fh7[T5Y+P]Cƒdt#  3N| [\Z:;Hxƭޛn/:4"yx݊K78Û՜JTY<6n3L)lm"P pTL;0?#MaeOcT5kCC=<1b k鲊1.RRBF&HJ$Ddž.8hz"q$FxߌG8c E1x i[ c(ANbQƅFL@HcN7Ժ~?h2?z}FPO._Fh}b|:0> [ŵ6oX".^(] 8ȓ5u)ގ%a;<"vM~ #>HIXA 2 am&~x@eahF0E$Q m֦OE$.rs=m|yYՓC7#8bi!6C5LbcA;"-P@KX ERwda5;8=C&9D5E Ad=&71PCoN' =};h,3V6Rw詎XdRV NjD&']ͮn%&Q KQBiя7L7W%I#¸/^/l1W:UQF@ r*^ )nM̩i})x!W %HDx{UQdj Vvpx~(p4UB:9dkĵq/Y0%wwôRQun߹@|/<n2Vˢ潤y|jzTpvbI²mđFm!}x&Ρ6`3hk* N"^~jɭXΤ IۦFV/O e'Ĵtx.yϨ<gjqPkY#i}eB1|:s^?Cvߛeu)q'옹ʊ*E!0IW ṹ~ܫIZRuqYWV {2E?WC{L_<G?lt'wmR@!;w Aʺ x\[s6~~Nv5ޤu9W)Kk:gEqf^FVI4G'&nt7zR+q襺IRuS$KD0B&[;}y0x hK*+<&.o ?_EU nn/_K.yw 4'襆Xܥ,oRdTxd6bғO߈\Ic\N@ި,UeսR-Fu?~}*êY:?Ѩ d$OF&YsMߋnOEH "T5}oKfVQ:r*ͻgGGGw?۸K WYS'Uv c7myjŷ՟L_R߷:IGT߫0|1].!D"mD38>O4VDqN? ]Vo689vشD:x7\7EMXfg/L4usҳ>[\7Y؅06ez78:v#-wTa“NJqYֵ܅qLKl8qL^q!9H8Ah\@pؼNQڅ/P$d;uk ~ɉ#7+nVC|GNl&pT夜VfB> >a^ c c4]*ڒܭ y 2ãd#J [x:+b{;US2ZBAxhڄE | *Re’uq8r\:c.] mhc2Ya7-gW&g3N2#E0%+l"+ ~[AԺb)m~+YC轨6? Fۮ,Rv2yͦ$'z/ ݓ`A0`JSJJO>q6b9+\D 9عpjHZyB@p52/QBDԘ@oD^\xԥ[ÁXF.b>I˄ y/ngnp}UsFG.Z2q۩( 6sͦN-jQ>䜖ih5"81ɶhƃd!ر8FhYkU#6 gqX+I3 K&4` XVr#"C/fӳmlyfh mn]4}N7bKa-n :Gf@WryGwAĄA#B-b-r o`f3:z<-Mxl_b:A=F>ʖ\鐥N>>5[ν$ޜ5 dbl'c1 'yVsJoŬgnȟ91yVrabMUuL7y̟ev 38ڷFNs_ xn.,$, ]zN9BD.d(,$,UCށlO7 g\]|q9[8w48$;E+J"l 3ƅ/3iZ" 7BQvjyʹK2ɁR4dٳglA<"a|i`_iBRLqkd=! *vBѠ g$j9TԝZ>W L,F}! .Y2B6vNڕg?elWM8|IkrreJ?,eTdR2z >cBjF5LO?pflca ^?"aYayIۇS$[guP~,܆Q'jeleL~1εSoEܴOpݤ i6E)ڪsouV\ OX½6M},\5q6sY :S4֚ȴ&rޓkjBv54MF`'`*A6EX#$l G'Mh^eS:TF͘\gߓ-d i&(ej?/BaIW<}^3VQs=>]y\@z9&NFR:$([,hOO?#4CI9u{4LE[Z_k|)c~W;'/ugK1ܘY RJRqZ *Gq̹z('ZАc#[[ةVw,bb(!, ubW24/~*d^V$Weg;-!;V򚐙řrY=E !s[-LIW-{Գ}܆:NlX$}tX@}]M)3ue_;ppV5BMk4Z){ZK5MkqzK+ Ḍ#B/mRN6ysm-33ۗb'da-VqņyKD%`G 29JX~*ŽQJ$!sK7yv8 j Vrhp)l => -ˆ e\h~prQv~%LH[o8<0q۹dՇWWMow׸g zanFmFX *}q=%?4 p,.kAFBtW w37SGCtb\A vDtEGۛ(^DȔzK_0jѲ7f (0ope$w\ۛAzI /C4;b}oo~ =x]{sƑ{)Pq(r%)%B<㪫]𑜿uYRr99P/?9xzx\|8:L` ոLE J4,-&'?J˺N0o"OH$Xy.6f:6"aUgE%&`NQ?9 EնK!T.^vo/vӢE+I,;{XU%``kQ /206_?_N>h-[ßYs~ڥZ(0U y9X Łۺ&eXNr<7TAښ=Ջ[$ aFekթƳzxt=y{5P7FX96 ^Pwoaޤxl^"k;XHI)|rv䇫e Z9 W?]`7"JNÿl~ xeL-SE?lfBTmgD6FewYPIHL~HN$0j[ˌMq6JJ:pP67U +F4C۴i pm^itݙ69Lx4}}o7fӋ4kjR{%\pNo/'sf'g'?<%MѮ?]_GÏoO';Tdm5Ow]ݺ׾3F##(pv~}{}`#E7BMZPpA'8!Y j[>Nқ1T0K;a~x4Z;`:_uɈj~{ uad\MBuVC%hf:V~ɶ]Po_ߝ\]5='W񱑎zt~ٵ>/팇QxKٽIM0mӵ^TM<?Os8 O)i5;lҜ3?~cHVWST=yqRHt!K"dgP  ZH+zM&goG}S߁#:y&`Wt\ tHZhs)P9z5qOiL+Y_mj|\_@guF=i4Cdl7. ?9:6Я|)Їe l{aՍG:<== `r=ffJb&.HKd& ? ?|bV:J^u Cp[L|h^XK-]zt*0F2Z Sޢfb νe8SUH4 $~ik1n}H/PV8sƬ1% B٘XoNHŪK҇  `K,=Nk'qs&oILͪ;OrS5;-ʐ5:ig#Y=YoAFH%c̋vS d.#{#[W 7@]̟(VLSϦvdsGU'X-ʮÄԙ$]mf2AXPUCd-~´LD:6XnG zr2*t9 `Aԍ0m.(jK*_4KuQ$bS4q9vZ]~Νj[#e\.7xT5Z TԤNLR.YBwƋz'5pXYQzJԲakeC';?hS8UeC Pp:jC,7 2iG Ž?`=/)s:3O"Paaja?JhnqJNC=vGlAʍSWz 8 =\0`jVu[8>5 D: =:7W85 ,a0m9N'TYCr0v-^AªFHλ|wm?(fb)bG Za+IzB\fПG\vy]Bx+_Xi_4|>>_25ަ;sB/JTp"#j侇Uey*duMYOD2+N sFR"vĸvIcu>A!J7ex,BӘ6Ю7؉<0an4V ~Xu,>=rsLկi̪iXa䳆_Rr%2\_vTXi4ϻܲw_42,ތJz/@qwvK+ JzMz\`ìY=ި;qF|ȓ \c X8VOOwpzlJ.cN8g;C̭&.5ɚdrqv9ywTLrżo>6ʉ/E-My)ZaS.NR[~iJ=J~Qۓk_mV *MQ7~9AEaT :dϖmu 7:֚:VQL=oom$Ss7 iKmϦ`ֻF?u5@E:X8E[1]4*XIIj L^c&X^}RV*̇Ƨ׎ۤp!777lZ,bsWsz7Uu&)B_tI[R/ KA?QEʶX"onI׏^ *#A2K}?Q(1hU O,iv증 h2 0#dCy*7a8LnBs[׵WD)p{d/F):4Upk zVW_#0_FJUch>/hm־xX{5:m?voSǜ ߛoG i_ǣA ;lRw^l+VsW+ܯuKsֶ[O!,+k>4Janj>0sTIƎaH>LS04Gܮ,ҭ T u{Cie]Y [(8p p>C1]@wHK ,5 1XRtW,ӢADns(UoplXЍ9F2[МHZAP(a/ەz~ >Q`?H %| \SwjoWci!igUmv6qD:Јz[0{Wgqr{?\Q@ ĹE͑Ue^*=qnEx*r~w񻼏ߍv5A>Tm@[,H16e2z V ȣTh583'2Ҍ HQ(2PCBLaP-B ZU # dSES|LR,C53ESf8'-Gհg%2'P2L` =>4%r"dHUt! OEhQ0$(SeʡL#(fYl乷F6n1Zsf#Ͻ򬩻- 6 8 RD:z@c%EmzhR9$ghRxbQض}0ĩ!)A.io$Ŵ4H!4 G!Xf8- ˌ1qJ%{P/#z?' a"1qG i֙#.)w :m7)㆒hܰXK;uķ(I5#,5@  JܙEc0}(GlDQ-FJQ5'b 9`]Efq"H!V\Qhc P70ēX5:(maKv/-Yؒ2 ~lv/b $؎~Gﵶ\C|AutԹ$.)>( E Rn E T^;)ޏ*4 ^; OAx頚ru2(k*V[_GX푫|$crݠ*o}QEܝw9;b#(ķ1L`ꈍ"?J/1 HHF#O$Iv_lb$H#21.8SO_/F7|:eL'|M>alўc%{9T +ҭKb/#{ jwҩIv''^*v%"BZWE"T73ibQB>IهuFT(QS8`-2`4f]L2` ۂ6H4 GA-eѽoRzYXDa G%<4s5YӮԥW ŒQK-&MBj{k;'j Kp \.W!sur[,qi4U7{ N4!emp)6jΦ5)f|V-<2Au9 >IJx n朰eqcg4 +8ayHёPCZ OA!u3m9 2&*xcu*IKL]qGB(g(a*YU^&E}Jc(i} ^sP&Ҧ,1Ô83nRW*6lR<1Vm,E DY_S8&dztrB`v5PeT:0$bw^S2 &1}aFap?9kߺ>):|M<@&v b#(0pnsnKx snocၲ'(ۇ #ۼn>,V!U *lҿ P d}#HL{ VW4 dcw/4rM %-)`%lJOB4 ғ&ғ'A4p!\q(i5՟n_&RD Qyrz~29;>~{bOMAD_ _e: <`k!9rnP*|> x*f~A$[NHh]iYɂ"(@~/!M܎h4ƾK8\(3# Eb*=3%Fgڙw)>(?v|DO4JUTi3v93ĂQqjaG @[ OAw-+EBSP~fl"jXKZ/7ۖF=LΚA Ow$ɤp$4so-U&e +j ?}{NK,YX|`YTfKl ; {)o0Wb^{ρٷO%6V$v}r^q:>/8*{ jE8p :ũc^ h̲Ir%[i'MNך RklpuK;AԦطM/B ̧fkX fTjup#Cmzi}m9(\w7vV$pB/Ћ3hRI :ja="zz"q~(Y$AbH/)SEdtH\{ʅޭ9CH\FabǍbn("Л."tn]CD($= ѭȵlYv<ٰ?߬ Dwx;{wWm'i 1(j`tlA7&2ں&m@ŀ i;'vVmVt~~}/w?{wM:^+',{$~"+Y7c ŵTXWcE^$7^aNJB$)LKr/&+Bi]/g*~MƑg⥜/0rJl,6(019;|ɉ3M(#3&K%9_ɮm㢑t@V4lhSQr2{G tRZ'`5O/DkwC|,8r%$rD9WYu{Ǖvy - {K.1f"0ؾ؎fs ~cT[id0l^DkӖb4C%a 3xЩujni,崒fHl\h8Z4U_datiģv|ef绳 .u;PѝT Ħ:J2+6TS=N/ BWzHy4ZX'L[[2/l [4-K.X<0{G6+R&PEO>Hfn6#&㒼yCJ͚={fTxJ2u%FXlxk4e z6 mD_؎CI*qHF{qk!6m0O!O9"z@;O:`Ig]qI?աYKKD9#c|<4y΂?h߂%7CLhbnC{eKq*ƒUih.~P 7'"5<{=bD-&D!R1b3L<T(ˋ'xe\6*Ɵ\Nb6S@^aǹ*HEx D#* Ub높-%)7^UW݁捍eۥA=,6zu nY#>c.O}<8;+< aBE'y!m|_{(Yމ6D|)I+D!!6\/#>JtAuƜTHk"GIO3$սTsoTlѭ`=a΂du02~վ`p|H A^$e}{LV~} vȩ*]kXH@dj6="NS]^(a|#\ s;^T[$Un1 #'U&ȓI@Knsdk*[fAm%&24i[˛㢿+{@sBAw5cK )/{&Pcp/ng2mq`&'Y_Ck$GY"bOo?6b RAt}5=K$~ľeE'*zi iMSGbKSe z[\*9>$.M}$.OT N?WZi|gmJP}ƟgF7]Ia{q H~,xfWgj\dM].)l}iE]_ߛ1Lܽ^?*z`R.*_9yN0L7x?ٞv9|:pf86ecv 387) }, { "ex AD!x &ȻW@<dx! .ȋ Am*x {84O@bD̀@/x[eFԙӕ6:MG扫]P1M|r99Hw=눓)  Cå{+`5R !( sܔ,keIK$ uPJx[eFpS:=s!UUQi x877sgcᕷެ/f100644 CREDITSA.eE4pPPnXif Zӟ[zqڨJI|RerN7x n6TtJNоrR݇40000 testsw( ¬9"c5-40000 tools92`&:^nIrHXWx5P+*+7V:#G=,ռxKԊA(9x340031QMNMIKe'Rz}Lτ_24cb y oYWH}:-":mPx31n2AD7 O\,r_˪w|̑1qTlX!ՂgꍷgT5n(a%ozu;%ۃLJc4_?*gK۾3'٣ho,j¤xUAkAtժEjRP[X-襰Nvg3qfi<`T"xovӸ5i7쏛oސTpDԆe/0l݃Fv<`"fr0_q z:YʞJ&4#۪>lH]j]-)I$ -"v%t|p߅:iq|-|xJ 8Qm0bhP+v6EɢH)bxGM*3\g6S$j׃@m26:qE!SD4DgA/PHjŹܿ?_3pJ(+/TժnX7,bJ͚!M$'I#p."2\m (3 3QJx 2Ivm1 MQ4I5Hj'eܴGͻm*30\h ]d4C_:֨C˜Sk>kW6'zu:h*\s0̽rr(͠*f vf ? C+uk#ɱrpuB 2>酱OJlT\I-4q6>kY0iX [T I>ZO/hbQ9!x=S[hTW;CsLLNg˙Lܹ3$$!>Ҙ|ňjL#%Ŗi"Dh)+ڟ"ЂD?J+1 Zsk9!%'#ſW ƌ\OpWaOUn\Cj ( 5)x] 35:k2k9߱؄lxTk:T0-A(h%&h,ޥHZkTi+_#iG ?96zu?~Qw,ޖu7I,Z@`QC^\k`҈BiZ RqυFɔƐ 丫­ԲYxgoqX"'UdXB|*z"L{tȞQFs!*0^ f6#6ǹL%n4I|+sOj^$@Pq" ,V&9.Kds2CvcdTC M~yo%%H2RlܐZK%Ě CүōTtE1TUKcs"a%HwHnÿ 0[3 Y0}HOv $~H],$q0P Ӎ2dPP5MdA.|>KSWK~CnU֗lgٸJ?{0[KNgp ^cC$LyF)a_AeDؿ˾2>oaq<|> wVKe.ao=mNw/H4ZzmS^'0M]+mpSEaډoa4Y~yǘW h9_AxeDBw7Dm[dU4m.eB8ʙ9Kp]3#.鵗Lح_ 8ph`UWo#|M9j%&AMd wM dh=QtytJkRxµkCzi#xOq ~[QyW*Hȝwb~&F1lrx3gZۘRexPxüy ‡`;_/C݊73 l+x;9s7Jf?F#x340031QK,L/Je +%s_٫Vs<;b6C*gG?wWwowչ^*zU|o Wϐ`GB1qHT(/ؕWľQ<$sdԴ̜TwM73[~g eEřyyi O_ v(w˳6m e2&xL7;<%zBFa>KM^$!VKT`)$l5bkx}d3%kuxsBc, @x{/qDlV{2sJSR7`~1gb y y,osfT7Gx{gC9;&2O˦jx31 La%+2Zlx[zL疚WAC+4/$3?xr8g07*A8NK2&O4 4@k0nIa ȴ9Jև*x340031QMNMIeй4ݠC0o욡8599?@/`[>[{Ro*5(x}C nfe̼Ĝ".. Ê *d"ıR(NMN-˘|Yy[xsQ Z~A87EvPxkzE=XAVA7-ysâ2kSLk")U XQ5ֿP 0?7 YEYoZzKuKP)I@W4YPL [ gO}e:/PԼ4! EkyR׶g>?U4E Ο͟eFUe#)*HK?M~#SE&8"`>i[6|8(e8TQFb1(\rB65y&+h|T;&d /}{TDc=so31ʒ<>q%pG&gxF#$;N|w=T[]+'YR" jR x;6k Iױ|(B`zJ-$i386-syscalls.cЍfO2i ]" ch>CB0j38A:? տ ` ޝ2wZNi7F g1s4rǪyVvmP߆WOd-%DS7$USxy6@c'h' >>JqF_0A sU`5g?ʓ6=tbӥdvx>[rIF﫣[Ve$5Ao xDW+r!B&kC\lN6+l8߳FnjվMk-PL\D76GX)`< f9^善 ^100644 arch.h~_$EU~Rk#C,@I%(6}Dcow`0Fn`eR;Jxcc.PS5_}(Ӱ1{1YlxwSL `x{Q|xC#i2,j70G&$ Oo¹Y?̍|["y;P侔fɝ RzZX&P.Ev$xHVXmk9jB! [tfUw)BO鐟s<г80 HVGHlc\pcxH\O\ { œ   ]c fs", 306%+)k~xkx̾a:>[Y x}C ̒9EX@Ģ&rj^Jf~'HxcC sVjEIjQBr~^qBqIQirBbQrF|Jj_aaofbͅSuqeqrbNXD1\$1)'5:zr"1.@XxœMkPI3I3Udi| 3 *UF1 $Cr#э+Yޭk.t&0cWbVsmwy|72Nq?y7bS8WԊNh.~-X& UQ- a>!1c{!I.@oZ6~aݮ2u`&{(`SBKʋ. ebP+=Y"l+B&+D ޛ'z:9C "7y$ηhzpЫշyW) <;x'_,[ˈ޼) W;zjJ9Pև͚@Yͻd%3x+[b?&ɻx'(+LKMQ+Q(.)L.c-?x-Tbf'nDzH7=xV}lg9m_>4N4vصc HNfi6z{\rsiҐ4$n=t-H NLdž4@P)?mBhNeG?rwxPcϖ7AeUZ?)U̎ S#wDm!pj6HVIlҵ'kdOH8@HAYu? auTML{gO CAU UC V$<4Pޭh58Ti.W`sx<1a J}f*)D,2/T* ^!Zm=ed%$2Iq E4lkZyg=_7^O7={C7o˦Ed-E,\UC6!/ܵ9U%^X[UOnWD.-}ehFZp$INf>iAIJWA1N2+0(`\Tu4/QXʃ"Y:i$JD,N&C5,TNxVQٱ6ZEDU)ʄuVЭoδh8j֓Y+knB4 }M)K4LJeFRTh"M$ 5GQ>R8@2+sc/MK 5 uQl Q~aLS>Lf #3 WyOL"]c#U9 <tabU, ?ARjc(Ax2C*A"=`\63b"42p|z~^qx0 b4V8lwՓ#A81c6cر W=d2!ob\[^"parc'#'6qe{ʊa/ΜuG }W\Юwdܙh#,osl({"D$ Qa"63?ZS,jo-q\vF .82!%C&siȗlMgH_1J p[<)iz9!_n2SJŸ$(v&:8ˆ^bv3U4yDbw {2u!M0L@tZpIm=՟|U++e~ .lgണc9ްk[-bw/HalYi;jmUQ{!5`.@{Urfx7S  \~r͒*2KJMDpz=v1{ $] O}p oaa_8W>w}?~ო܀K~X(ixky1W2'3(R!X!(5U8?<(z25s.-Ҽ"TԢb4Ԣ<#=C$Z\Z4W;ɡ I% !!@&Og4Su rp qt T/I=`F2ird-&g68W jBELO1&%ge(q)g%甦*($+KRsAb\ Oaɒ: + VmqMkԼԜX)a x{c g|r~bT!xaCcgHcG'gQjIiQR5grbqX䉬Jmؽ8E ξ 7ygRQjb6P'wW2NlL+(+IHK)QPRSPk!(7UPɨԴҜ ;X&)MU,,NNQPVMQ_YRiԸLybe䙁M>(+;tV+hVCǐ=zKؓ:c+<7hErEnXlqPXI@\cs0VtҲݲ]˷oB%pEO(l]'.M%X дey D/v) E8|+N;}gZg%mՂN٣ Cq|l[C %i}Y&=Fe%,:ETTFǿiG<p7%k*g‡yķ߷jrx{?"*H_Qp Q zAj/x^ҫ P 2?c>Ǫ]im1ݸ[WQeGn3{ -u RRsTFQAmtMs8j =8zbQ0onM9C: @B(PGؘ^G-5c]k\]-8Rv ݷ_InG2?K*±iuN}e8^ol! ZZ.ɢF5+ի'$L͵ k_M*Xeދ+Wr"@R=`#ӷlGMUQZqc`7ƥ܌Ի>G{.>=heqUjc !:SKC!(|#:ME.}El13Kw2R~Q١Kk\& ˹A1ټ^R`^Q;!8. %҃VNzUŅI@P OϦ q1\O;.ْm0)w?vg~=Uv/a\w/ ))iMqR/IUcAnDw@ϛ; jYgxxkrm5qtx0Qarqxi/v$us`oΝ+ZuͩoEYsA; ^^d"Y{ӆ0}Ե%$NI'拻%]զ\D^ϥF槉Z՛,6o,QܡAFIer j:Rn_,)/\l;9}]m #Bݍdq/!M:9H_Gqya}' n~-اx%I/:\d/5ԳvS>ԍ2 Nv\Yl ߬Ix[TZ2Vu_C |Oߙ?;q{m]@H iQU ؎=e(KgPiQk4aOxVdS,\1qiޫz,IͭkI&x| wD mcTGӴz*: Q\x\PoH)=k^ x{ϴiµ¸sr9 M _k!xƴi#tſ+xQk0ǟ"sKR*2'YQ5&%nO$Br`@*YXQn[#Z oQ}ȃ,f.2MDbbWfⓢ#3qQqWI7%0Ey/`׈ )Mhe8U05-yUWke%³mÂ[Yo2\ݏlF 9n$ v-_V:>W.rWV֨O/Z7BH/0o?QFW`lÔ %W,p8[%V-Ki4˹ k?xϺun&fS.g ox{m‰,ؒ3u'>1&1Q0t &Τc:0Lj0 &  g:1);pBd339 M L83kpxmC530 x{ww¢sKsJ2sRRst'1DNaFObR(d3 4iҬJD'eAS&125 ?"=y ?L">>\& xXL4ءXc5PUE܊VVP:ʪê7eAW;敠y#9#13Ԁ -.k@x;{w6fS.'xc‰,Xsu'>V0& 0*CY6PV%Y*-(欰04400445$6YIHUE "}qlFLeU20aLzP1AY01k iM4k6yRƓ%fq .)J-.v/+Asgew@xc;FVKS]KɵL; <f% '3k1M^|ZkGxcC)  x[zew & 0OvgԘ\h:y k@6S ObrIf~^1%k;x;re (xke<{JnRi0dYFm8;1Q/K445k8xͼyvFfS.Vx[3{iRIQjǚ0dqF 8ۋ!^$Q -2(/ńgBof҃0 x{pX#i|$1نYΏfֆ'2!'e4/3°Xe ϢEgcEaUsX~>+"x泊M~*糲 AŜ\ ^R:xkiٰi L/fɷ7b6bŪ>9u#&1k2xkiljaN Yx;e¢*srt 22K*u'S¨))8ˌꘂ|L%Ey%\ R9 M @~k^x{eCN Hx;e-Ĝ݂̒J݉1&2jb &1` ¦:0S$`A~q d:RkLx{eC:inxɸqԢb.*7Y=xȳ{ ޤd݉/Q&20j1cTAa99"˘TD0#̬&Ǭ&Ŭ&r CvtY}C+4uVt5q.Ś$"_Pihj\Ckxɽ{VVfS.xdmxĸq2Ēb.#x:u“/&K1LcT\ɨ;y._Qjqj g~FqXp> \"̄(79ɋ "jhjpf]x:uyFFXMu ,LL`&+fS. Ux̺qB2WIjqBIeABRbqf2BH,9?771/T(8?, ix-Tp!d^bIfYBo@cG|䃬ړKYep73+̢Y"42 xs{C*dqeqIjn|bQr#aa6Ez4f~*Ln2sOfg\rPx>auffEIřɜډ99Hcr&prNb2P49QӼ+1 L/N"tf8R=hgq~rvj Y )OKM7&N}qFiIJ~y!H,^=xPQ1y;敠hjHtFxuډ,X3t'70&k0AYɌP|86&ˤe0BYUpL%Ey%\`ԢTNS. U) 'x[α}3d݉,JPFSs59QTd21c`Lcaҁ1`L+9I,,I,.45*4}x[|i̼t݉E`ĜbNS.F!exͻ!er&['Og>݄+X 3xmP;N1BAp\`$$rT4^g;Yx8@v8%(O{q{iz?=Ac\uz#yj RM#k{;o|:mxSkAfIքj C^%Xq *H-B5ifn6 2IPH٫7 H6{}o0KUQK# $,9$ ٬6&jaYg1jSܛ[ve/>\] [aCi}Z/,6o7\Cz>Tx7vd<;`xW%8 syscall_name+I?4 : /* we' 8` *  return 0; } gx{!-%lr$*02ADM.b+ݬɾ6 3x(a633dwsUXq,+6J2n>ö^<%xkflfddkwB OqxɲeA\/Ik*_7Fw x;ʻk˘3Nڵك UUPxɲe*R}Grl3͞59 #x340031QK,L/Je +%s_٫Vs<;b6C*gG?wWwI_b#f{^ZS H(&Vr<]@x:2/޾ኑ}"dtNU⛘_r4ƇǭRb6uWd WG_WSxun 8&BēI@榦 yi@_=}m.`bZi/:L @!%?an?g׻[e߷pƌz ̼ҔT%wWz0$K*aE 65=ivG_gCdKRKvY޹zڼS_ъOZ~*S̠(hUu\;2,N(K-*ϋKg(UxZC^iӍm,Vx[6?m`ݠʑn$/40000 includeL6sc shʓ<[j~ٛ%!h+ jxX7_PgeBNzK|v'&K6i/ͯG;mAE40000 include y J\>raiT<4| %ҹ "*v40000 teststHd] ?h:q!4fuh`71ć4Iqk1x6ss#k-%k|x{/ElV{2sJSR'`nTPSsR\2E`8k#Z6e]Bsj>a09SSp%6/Jr\es%SRK2'rLAa]*U+Hbjxd-'Ib`&/which "$1" >& /dev/nullcXyw \ validate the options[\T$ex340031QMNMIe8vsREyUK{M:rɽdxȯ_ӄ]57x{{kC9̟'۲OVfMf09Mx^6}\ x31|!ʸ:"Etv100644 seccomp_load.3xJ.։֬$a6G.jA(EwJsEH%a+2(SCAy @Wz[xk`2Cd_[jog(󨛳ҪcdD(ye OPVC?-f}N%d2: C3܂=c.+ n,8YQRYxyvHmjd[FW{R0u*C,=yck3mNS 8fiqeqrbNN|Qjq~NYj|^bn*j%  8O[-,(utuc5{HTifx x;^~4WiNFrf9 s2Ss RKB22EE @friQQj^IN% 1rm8$Áx&Etr+Xϲ%[sNc|3 xzL疚WAC+4/$3?xr8g07*A8NK2&O4 4@k0nIL`5,N-O)I-O.P͵R)LdC7o=hhT[WZY(J,T2KRJr*&dTRވkF4Lx340031QMNMIeй4ݠC0o욡8599?@/ájm[JSZ9ExMKBa#y%.8D`u/MA$ё4S!gjinSC[N: MH}<>v7zgu 0F жY<զIx> l.94jW8jݬmLxrˊp&$X%"RRHF|x2DƂ|I<DemN1(Ər$ |M&HjEet )6L$: 1V(:G *hEcQ^ƑP?`Xc%XPp=ck0~"Od n@+\ԁwUxV]oEUGHM\:p%D6ƊT%,r2ٝGYX; G⅟@GKy$eND 껾Tp2JŌv^[5k2qB^t OpH`\ o4 Eb Sd~VyX& : v'IV*bDZpJC.BF8RJ0 . xl.Ahd53 cϣRgz+etKQdGġB۸!%YvTN 3G DF4DҍMQ&Y+S6}麋f.ützy:;1mg&=rE:?;ʵyW/Ƽ ҮL|K(MN3C3:[S+$C_ @R@ LY"eܥ>(.p _H"4bE31˰h<2M@%We~-猜M{E(~kjZ[M]}0~{m+{3FިHx]P=KP=Zq+݄6y//iR$"tr6MKꠈCP*J.{ν|$Osr)bX)ED$jDL RƔvL,k8s(b;~ZIO⎻&J1.AAq6a 08C[#5y=3uU=\ Dmbun"!K~;S ߚ?mG^ő-57~׿4mr ocFMz}4ٖA]}UM82"[ eBG9a븰CROz(x<$ H & (add/update: $?)3 6@ ܓ n L.x340031QK,L/JeQ{I1쩯ޫ{8BT&fe2X)*hb0*݉P5z gWdPko%gf[W''՟}QywW Ǧ8zڜ^!;>}֦pCY/O8pY/`٤֝a>u^deff&;xC\G/ճ\Qp~ϳWH4f7M3= {oa_)5rO Zo!wۦ}y֙ `X8Ջ$[i\d"% hU& ]V:?C9a B>A_oVL?P%5*T4ʹ셛ZаO OͲfªrӑ%MuI~~yBӊK5pky([3|_ާmaԣPEŠp y䙜&S혘;BUd0iQ{͏%@5EŻvϭn)'dxʷk%f.Ģ |ila6qhVɝmt'V^F. &xCxk%Ģ |.NK7 ȅu+srTXśTAxpu20DxSQHw'&$ީ,Xߔv&F&kbkѴXF: yOv9KY_׽fa+H$' [K[ʞX0{w1(؇}zVjY.Kjkj%ڬîOG8aGh=Nxf.^ǧ bN' #cc9( DzOw-1֒a!n%0hVy9b.jd>A g/4j=ყCC9%pV>?rrvRb₡)4*ϖeCՁ ~ps~APOx"W!lf\FC]y*f&6pu {*t"6TK'۾j*m YC7,>;_{[&]9yj\,05#YϗM vp!\gVlt׊7z\qlm[jĻ6_`jEU@Xl?p[#mX v>Wi0|!GY{9;ܼ_!UG,% ^&#] ~rteMSUI/fRe 5Q|J|u5e{*Td_B犐)8.gj vx,_Ji3,i3@!4.7 */ *i386_syscall_table[] = \ {-R ,eK  # _llseek", 140ɳU{A(]`~Nדufs", 344%LVS$?;5v u w r3RA2 `(xc#pj^JfbL/3$U֚K_k*̮l%,r]CB}}#8933 bRKJsIZŕɉ99  $'*OLAFPβL>]w}_RxǵcSFLҙf\)iy A̎`fbQz|r~i^I|nb'Wf^X891'gGɗYDN~'YWR\\R\j)axñsC)3{jEIjQ>f1ĢԴLc 3k.Tr~^qBqIQirXIqeqrbNHH)\$1)'5:zr1I#xλKqGZꝏ3[ȯ H W' V X@\m ^ e1Y([I]2#4#[j҉]cNHt@0!k;$8٪T4pXʸf?4<4G;@fđMg_xO| QvăïcO]i z$-8C8w>b^hć+ȡst}xTKOQXPf" 'b ')17V&3df #s藸1Kc n N[ԍq3|߹q c}#oS-Jdj.耗-NZ]kx*&A1DTrcXGLm41<+ftzi.( |D'aW쬍6꺦#s & 歲^\,D'Rs(C0%4̔ʹ$KH&|qGj$Sbb!U:GQґL/giqRd H͊)$^W@uH58W+Xr!Z³ R^YLR/{]e 93ol#S 9R'lId:. p>9"IwMF&2L(6 @>"?Og8~#"{Wm(Mfu"G*oΰ焂s*NT膃sXg5Ӌw8 NWk 07*m|e{`S^ pq*8P*P%HQMD3o}C_4]L^֋^ ݴorҽV1ZN&}vy` ,+Bh#OTsi9kZ^\ R I 4 еY\ScgFT@PY+jWVhqra@s>fr9NQ,6?sw̮O7-,X1N"N fFɀZG;\Xp^08C!o6(A>^r/Ntg2X}f /Mi"A\9ɫɀ Ejx"qFb?wn̒2Ӽ^_KKAK%$(73/U$#U!(475D!?-8 (1W!($47)*(( 9(5fg5qs)lO,JѦbkrj@xi%E@CSs SKu@GTjjN9as $n{-%J3RS2L.c_p\x340031QK,L/Jeڴs Ν䘤q-020M/Kf/?z/Hne$UC?j_N86$iT&%g&])zgT;L"]ļ27X.ͻ4)'OD+b[\TR lP襖lPf˂ںq*0mD/:&nzKd`-(/,2R>|aBnR\/MeQMS] XfJ) 1C,+O?X#"r: -:VM|k_a: "(zQ/͙gLc4)js[U b鑽l=ڢUtusSSti sӃ⧠< $_]51$YaAPˌWk̀i2M,);-+ɋU v$\j*yӼߝyt0}Si[Z g&; /̶R }c367''(((L^ţ9dQ4';>Zgr4Q@(x.;d.fᓻ&gL/W/-|dr+V6Q@Mɽ`!U 1ҜMeI6}]]bii@џOX )4 &`13\lmxs{t_Y\#xV]LWU(̺@0,-X.? ̰ 0qwwg&?i6-iLonj45IӤCӤUMm`bۇ;&vf{|[ϲ=Ae6>;0? q|ddq$۲ќx.]vA *X %T옲:1MdnV01R8.'wV,FpLcRHp&?ݶQJ8D"DØ EL&f0g9x؍YVQ +!OLR\&">eT0%e CTBѺe5%B\:]1))*tH=dDı֠V\~x6]4U q,]ۡ,waNMa5gT,[7"k䪃GBN?ŭY<ƣ(vb8 WyApc=Iz^m({?~x϶\f& (A-$ff5h$J:$AꑇV4ˍ;.Z&E54_US!@y)ZBYW.~}ҽx|s2v%`'(J#ږh B:0qn1,G%4hezlC fOrRU<ثCkd89y)8FX7"aM3xOǂ]k>"Y{i|XOJM l-Cc}THNВl{)=1Yꕖ aNF.7rx_^9,EԓALpBû"D'1GvVe3a34W_v-sz%y~Q`(#@V$j4Kvv{F-bӆf}glND-aֲzz @V81u@ED<O)\& OuaNfX J _NT"5ȽtobjHW[5MM*7"zN&۪Tz[rSi2R}da4MZfx>Nˑkpjhg.5@ '͔L2V6X>ج۫j٧[Ŭcr-)5po1,{uŐ*+QǼNxȘEfhg ɹduf}PPEge+\O 3LF1\j/QY% G <̓ DB.Y2q |Ïjo?x+w^}FarBޙ~7>2|n\"t||w% v}y>:CEB+ 9vxH82 i&@/ "coFeFd{xTKlUuel'vlgRZ⨪ZuNg33nd A HT2+$ nBbR~J'qZ !6~=w{m/]nN[C6\Ý`?BZUDlX9ZAN-ЎN \SQ%F3Tj(ҰTX+}g ߮8n8x.;Oi̾_ *P"*SÆⱡBeX1c"/-> 2acNbhYڒ+ыܣe([˲ʉD*4' mmlad7pT.2:x5Oe޴[vIu$%$E6-lUʑP&u p;9 ?L%{X𥔄Z#b=p]۰4YTj⣢gxM&OrMڏ})6qxQYϔ8X1U-FV7IQ{yTOԡH$)Q06% Շff2x'@,C[B(_A?RRy$AN iP< 6G&?g5´rnȪ2 u@<\N6>yFz,y{V PXtUxySU 6$Rq$$+QI6u:4n,9늏_SE3[ (wbdKs٦!DYEc}KRP,g#z\guXeK׌+WHv^džcg`1ڒ|熽8Nq.ƺڅu[7T,}'胁TQ{~I+Q盾NxЩ*ԊeU`5/{.qɹjL~;%88W!+̝T&CɥL=h sxX7_PgeBNzK|v'&K6i/ͯG;mAE40000 includeP%gGˢYSDh<4 > R}-.40000 teststHd] ?h:q!4fuh`71ć^I:x340031QMNMIeй4ݠC0o욡8599?@/acɱUy^=[YlxSJy\h-jA>yYBPM,6}nڕGCGθt ҪNow9*#;4r UeYAp43YaΡt8'#BM)!Cd+epaAksДi/c" 9|3 "۔|0Iu o}9Gp=5_Y o7g/oM"|# \,HR?_mp!HHʔ B]D ( D1+!G0|Y㙝"+rB[!_H\giVvT8B3 7q1~)38 QMT%=+؝[YjL Eֵkj8Dؾ Ch 3 K#X|:I(:Q|^5?S?]D# JL15JWOw'b?N2>ɨ/u>#v!ʢtPŸO]q H?o8UDL7<^l_oކyNC* 7~ ZUe5Rg1 hnC=3i"vaayjɇsfzK wN1 0e|\8<0D, 9) Եx%\o; ᶷx { \}j9 |r4sWH %J@wr̊ `x?U׮A=x{ۻ9"O@hbS 1I`TP "4MF]Z#rтrB!N{#&WW +hW}qdBث6Ak#MR>ƫ鸽px-|t? wn.&Cd9c^TwAZ{2?:>Y'j-@`P )dTIN/̵nSE ¼.OUP]ǭeX'b5ex,N#RMV8դRnNJybwI.*LOY& Xx9=ɘ@teP=톱Qz~?}{n:]B># \BPuAVQ` 8Sw\p ߨD |bu0a|"b CǒiWCY=Ũ3Fc$<x̉,Fh~, $׊t!( T"Uo%b\g հR9~,,:`Q$I)fKDP<4V4ц-ƈL]N;NQjc"X4#DD'WN}3mfV,m\݈-;Rt*kRQXFSKLy&\4=SW[&SiH+;(]WmNC<f$ӎlb#D# HN# EQybȣbW-v4^𗵊}Q`G?2m Db JHH4]E-UB p\CGM:MiIEC 5>8^?*xv%t;xs=,sH;L %`j!ׅ, ftv5|ᗶ $'m*f=.g8.oD[dzLA@ ս/|pD\óOAպCQU ^sgáNlYO}biS?y7R H.a= gxqii j9Ii )Ivŕɉ99 ~>>\Z i 9% P i9ũ Y i9 % )i9% %y Z@I%@ɒ5rX&7L_ 461erAHdsZa 0Xx YAX{O Xc&h*.x340031QK,L/JeQ{I1쩯ޫ{8BT&fe2X)*hb0*݉P5z gWdPko%gf[W''gs,ʏ Ȏw9kkszśh\erZE e {TnY?^"ݤ 6i, 3n}Ee֦=)DR4jܕzlW?Xg"a+W/>n瞧s}}f$ VMOh+,(tQ&Z - S_(1qmu|zj^|RAАPFD1CI:({,(lt$Ei@j]}_дbG Z)`h>i[6|8(e8TQFb1(\rB65y&+h|T;&d /}{TDc=so䃪iIj.Pio*sk>[J"sux 0[3fc#t`SГH cx! lP+C& cKTxɲe]FknTtJd]z=ͤbx340031QK,L/JepO,s{oScW!DnbNN~^2Ci?0|SA"w,#FtU%% /Q+:ufX!QOH7)83h6PJ;˧ܱdG -ݗꆶv9za*!*u33snxʷu>:)zb̤ kb{7~p|\`LusuJs @֧[?}kCN]xJ!&|1ea̺X\)7ML.{y?d??Lu3<:KyQlDԚ$&]_4:7K+O٩ Hm.v r [_]}'ni-.M*)JMajr6zǽ#[*HS@UҜx4Ff1Up(o||N֣-\zJaS778;5E7f /07=hI/~ bKUSCRLUZx &cĒBXIjGeƸw՘3oyٝ.ƻ`*MtRSAad'V_*]ļU~,]qFGҿv=w L)He~NYj9 q+M[bZUnþnC, !vK]Lɼg?VG8Tobvj`؟T6kLgT7X䬣Lu2 'Ow|#IM\"x[|%aC䷢J<C ix{uBHÕN~o{<宺V37f 0wm>{)?!e?z#D!(9C/+knň~3rTEJ^2#>|q54iAO 3V3y.o\Ο5*:gqHlxx{wff^i"fxf`mr ɓ9& 2O^2jsAvԴƛ18D8"lFx;#Y|^bf$-okx>Ҁ{'/;f.B6L .'db->arch->toke6峽;D[x[JcC/cFAxWlffe,(8Ies#ޢ lxɲeKo + >d2sJSRʃ^̯{jsU6[٢x340031QMNMIe<4+5gU%hb y ^wS2N¯i,xkCHqeqrbNN|Qjq~NYj|^bnu⓳X^xx340031QMNMIeй4ݠC0o욡8599?@/^_yA;M_; xɲe^FPEiwsѭa3Q_xWLChb;.ka>lix;wf'<"x f#Xk%.Oɉhstx{uGa 7}qOzFxYkoF,NHZwXĉSՑceI 9P$v=P"%bftݢ.] f9]iUƉQdI>T P,/P;C>,+/ c>/4+^ӕ_&tPom틌i)Dž_>B)YdnB}VR96E<.ؐYA,#3,LCc`LS\:R:{?y'*AjM'q@8PVk]G7g']}]]^j=7X$~GdCe8ѕ_* %\!dPѧl ?҉ rDqDifz1۽IZedqc I"NDQEf{Rs+\&D>+9IL!դh[vm{%vzy!jp\bh8M՝9~ĵG_|]E٘S|,rXfv!4eOJşuu(Bi)*)3p\ŸQj+)N  k&CPP֑yY?ޒ '`1`dIJ4أ4j ԅ"V/RxչxO]LL8`.l!26=޾>jӻ>?:pɢH+Mc9wÇ,][UA?n#Z*$[N:9=3";r`%f?fDlUh٫ŚJdχlI4+ҫm%E;*1Oίɍplz#=oaǏdp3_=̀w`0..XÜz *'G@KPeP@cw;w`\2IπRSk0Ԛ'b2Oa,mK00e 2jl=~<[@9 :)hkkk侥i}I* AiI|Cm.wD^zD r #]MU5->Ƨʇ#,v{caᡳ7bƘ7HݔZ^ݻwNktU1m;ZbbhLQVE/JdFN6&Hp,!y,w6Ьz y. 1]@g=b5b%oU䯚=fz0}{S,m|>@qÀWfױ75kR{R'< i;&d`B,xg qg2s0c5MO1}ΰY78l/|5]'yÔi9Cp)g\~pHzRW 5>2- kEI5-Tt3rda:?M2|o'p} l oSAZ伖0oץ=85Gˮm5AQi3^$'#׀ZYc[6%}k$OϦ'eU'ecx$c?T12em5 NwO%؎6GHt8 ěh ,'-~6 gv/ Ǫ{P.`HG_W@wm;sEako½s_%[/ʶz2L$Jɬ3IFͮ*Fv0=tӶ{c;@n34,h;MtTu[&ZzVe`P3S3RXj53\D,8Dq^j2\v>zCZ$.XZDb`M.{fyJZ7ٔq~pHc6 LV"^uN`ΰxiFf]UHgv@Z (.I&4$R+`\q6՚]6zz[1Z 0Miؤ\qlh)'\jC}60D1#owwflr&Ffb QR)cۆUU"n@ ?KJVwKi85_s >cpkOE$٣)x{avbCbr~BIFBqjrr~nBZfNIjP8'5$3?o"FN8wrdGQY.-Ē̲Yn -6WrM~,^jP[_XTPWPVSP\Z(XAK33MA(kO+QPU0TQ@/6յK,Jɪ)iy`jrqr)躺9Xsq$)آML(9Ecxɲe^Fg?/OS{9ד3Rtx 'Z&6mHx}VKlWc'&!}&؎8%@!M4a2<ۓ?'Jt/.)Bj@^iÒEQ ʢ Ćj%T$̼wwEOUlOr'e%e|u"?<,FJsiXזG&8n599|X1F w,WMKk ԥ/6pEmx!]{ü c><vҕxf[u%Y!Q4w v[BE>C)KzS)C| 58*Lo$p#ᡑ(($BPXxݗp1\ a^5j7w=3|hW(I;kKlݜѺIh,66G N726[൭N^w?(yVg 1[g =5ּvsɴtO*ߡȏ#jUK<‚DhƭŔR4rvnڡ!7`5rؤ @0Ig5IND7%'|\I R хܭW kv󻊇N9\/Q+l'trfg1ʉppHa.ɘI&ʤB䳹9#(Jd $() +rݶD^ճ>75 %fFjTvӬe*T7 ^],XhM39QCΡʤ>HΛtl0"3ɬ *n٬ o6WVމYe30r9zq VE^ oe\Л)Z ƤQX<~,&Em)4q$(&",ꆤ7Tє0zj[k VmuD>.iҡ ?ՍXJ"ՍsZ 9]DZYTĐdd9Ժ9Fʯ0R'?5Wn֪ 'pԅQCU 4/ u:d^XCTFaMdܹX4)t)A&"ݭuu)㍔H((0%^ b$?UB *,a'Ҥ7"Jॼe&Bsi 35ڇR[:HÅTm~pSJҏSEex V̏pn$mAh ?Ux{u^ 9~p5ݟ[;Y:곌x]sDZ+&NR$%9+eỴ$JVt*v\[ `AB(Ece%rw陽qww2dzQ>/x×txz6wޖ歯Qws,LY>}8XEl2pF4^:8|Zv8|:.]>(7qYbʁ{]Lgr޻_᳗I1b\L{莆=d+Ƴ3B ^J0sJ |١>p ⬜9Sx3\pY1Xv/OُGGN~ , 5@d²/9GG<:BNϏ܁{qpt'GˣϏhA"6ce<f~?bf@rwgK+bz`1Q9>I p|̀wg7޼yw:^XGlX~?F>;O 夘U}cٰ֙8>eLũ|;;*gɠAFgmv9lFeOX՛x>/q=}xccG7<=T9ǯ9l0+77E>;f1^\8!{d#{<<ɞ=v;|bWu>ZVpfh5rqzx;w]_eZIPMnO9Ea0i`/Ю h8VQTboe nwG2wTl- ̅sL4% ^M\#>"o6^þ۞̧彛big F X@N -{uv(?%Cq؃R]=,}JGoݫ`DTl80:o'lW"( $Ӄ _ǫDߦ|-B 5,X/pPuPq?xp|xx|ɓ*rtstƳpSU蜓J0։n X/Ƴ阚iLuƢLECPMr:=ugp`Ŝډʲ7x:áw|z8o+l͆I4spUp.&> F)i')mmdZq5qA.ni7̆*-,sʊ2h|^[8Wm@7H "~UYc_Z^?!^unseG'Ӄcp rk+Y9Q\u>"mc`m:oO'_|h~d R0vڞͻ"qH=rRN +YT(' 6%I,8/`;phIrZOQk6@aM%o)%o9s.MWy99 ګ%e S#}4v`;=|tn_"RGS -"Ecw9mVz5з6U0G7_0}1'0wwܳOJSE tFf&21yx#,Z ak =eno^t |i.B1C`, 9Yؙ[L)Fb]xPI4̶9Qf`7&}mw =Wac ,ٴ/c?&D'QrXx@$-tiKwk/8E9@w  &"K F+j2hۺe:K:y%MkxGJOP;,YΠ6CqBŎ91 bSB Ui ļkxLdSq~T2 f3y _FVKb 5uKѳI=%l^.Y \K@䲓hߌS~g\ZCaKQ6 ѪwuŀOʚҠkAc"Ɠt[  ~HTpM[kB"H"T-aMŔqћ͸E6M:=`ULKeqqCbL M( )A)).#J׆{ (e5;JN!C>9|#ͦA)9Ura/rryrBZi=L- YN2iSP+`͡(Aç<Aj>$M{{ç,Z%mfא0dJ8]\`):9}6O89(?%.N"g1)hr<}vLDyؒiI@-ǥMpTu*۰v\`5na®{ mcv;2i/Wؤ0^ؠaz r/FmزNaL#!ǯ4"+fФ%c` xk>t^ ~  f6R,TM4:WsŨ@II$.$ulc" IZs> R n# 2݄y "SDِ\$nvZd) $Y"Ĩ8oضü>)7_G(V!bz) |cH|"Bw!ݭc'O[2r2:ܾB5D T+ nBEQ@b e5M7ٖS6WI\cOԲ&2FQ-a:jI=P7&d[d8ԡ2,$rC_jŬ7N1OhR>6ڪ{hD>vE_#/$,7 {@MT^/(d)_Ά [~&fh.1a ,OZ9F趙&̺T$WVH({[uI&\~`IIj/ARgujy1p67dtexqQ=1qf>m.qH̨1.8#y+2]_X%,wf)Qg3}f+P,11)hPlT?rʈ9@ gφH੦^K X?uqw [O]^&<tآqoHJ'.&!BˏAo`ҊDҨOͳrV7GJ^;3f^|?w;]{a,Sf᝕K!&&̇?w GRE3Ԗ/(a%#Sd]p.ל[Y{Dw;뛨0{WX Xzdyq0E|kațo'KR`:HA+К`\kp43~0&$@ju:`KJ<*/b^xpee~)n!ƪH@0?ػ^ˍŤ*Ji1)8`Z̨@fJmh%",@?QRN/BHjNhB=v+ >%2Ye ML#XGZA z6o0qa'aZc:y40{bbANIfI=P2Wjs0 @WNLzKNrĥ2; O|WeB࢔v#1m-A-[P#faRuyE5<d"lVihOh,GOOx+RxʂBFMbU dX.fTKX񶱰pf+68QM8 "T̋Z\xc3%W)Y`xZ,f`swPh@4`TTIO;udT75j'K^%׼WTqsO;k/% O&5n(,SI3cHz%jb]t*|FaI!#{50X ɶTH~d$SZkJ4C#(G6jJ,Jxy8J8 @xZ@_hݡ Wb!Y4jHݵ"8+qc* ]\AYdO߆?#'GYN26R£\x`C@ rbXZG)fBqc,88h*fV#(G=wq$MHcǃZAN/.xʜ ľo'oZ*k0e%BEbWǮ5aĎg<5E5+ %ڐKl?;i$U~?%C2* pl$DDw$)1lTCmT&.Ci A[Ej4igsrZmHבyiVlXW3Hg`1'mc˴)^c}f 丵!pb+ G첖:e DI^C1Ì[oO_>{,R-o Vo+F褪rw_)!v#+tssLFh9 T<> oWz3Bp2Nq8$8k_4RY~|7(PGKmvw t,Hr#v:eǏϫԆ"ȫ=Je'$@ AyĿun g?Q& ȯSEzڐP%`i@~۪aj!s!GԴ򛷈* ӅqT@0v&S&JUvT\}ԲϮ$&\ϛ`fsiA=,bCSCXi K{$cY+07l[mb6Mۦvy^w?`RM褊o`C "(;z7nAH=dx&ZϘMǒon&wORGq@@rn ZY١K< \KgeTUËPŧZlPDySM $k}k?:6 u1f[ QWP Bʆ-]8r0?~)ʾmrDŽ%`'>`y_䐩'L_:/՟>h`2[apˇU%e*`K󵁫 m3u :ÖIuĴ>(Ym"wRC/۹m8MmZs%29FĹJT:'$ -}ۚdK8q)O^ ,< ]וęcZJTbȜ S온#oV}t6[F%6mkj i%:!P?Wyp:J"L'E[\`]'7|yUqx '1Jm!T(X 9Dxg56JI+y!lSW*9FGZA w,N }a?xJïto9@Gm+'EBoo~ņB>4d>tZ;ڥcmq! I]"ymR 7,5# i2.e-5-W9|j"D{ @$rt(4*:/r?,$2fCC.=>*` (J PX?K]2sS5UC:5bKeY0LepAX~ݐdNMhHǪSC)H= (?`A\)_iVӣV3z4+ (Iאv X=TKħ) Vx/1#mBWaN⊪4sv\>%`wei\i iB8LhJVau+W;0o6Q2_U;Y)썡wxF2VFġ/BrOjEء.wt#$֙L27\H{NZu#.$QHc`tA\„_GBc :ܳxE>  gL #iHRw"MNH Bo+LzCiGL*sd 3pM6~Q 5'x0l+0 M͠"HJjMuk,uBŶ>(A', f~hy4@#aF|'yc~7u}Aa.J[L,\z|CNJw=:3x8i=9a*+,^a(Q Es> k$(#~9Si uLmZ1 iEáeY.d8]t>,ˌLKPEKFlf%OK okw\I`1u2G*\̧!uJbI0x3`HHiSQx9\xY;ٶ'|ílN s4Dd +b&V4yl""=%ۼ`]m(K_9n';^ĹPײvkPU QدV"G^HReU-Y78xn`٠#)`őe9I[%⣡elX,*[QU򌸎yQ~ .1q8L4b\{4w7ܓ6eNV^uDWJ1ؿeuiq,ŠμZQ:(y*V2g96TrA'kz6Աu/mh€*4C|RRuEx#ÉoL'wHߨ쭫S|G6`Z+ "3yV.N M^,D~Nöp ]{:s֏鬀p 5z=eQaaUT_v_Swыf2KP"9ԋJb:׷7_Pܹ%@2yy^%E]T LCPk*Pσ0TÇ5IJ:/Kq-\+%M-Dh!L` Y^h'4no>W ksI~6m? BJCҳPt}:)=D\7!W((|.k䲄|ՠ9G3 5ت BCO勐tE+F4/3_М70(ĕ_ `HlVS v[کuPll@[#2ߑQx(c  \d6x>F6\C2HnP 5HDǏⓏ'qe_{Aj|#;0+t:C}>أ7_:^W":ٹc6@5 k~BU<2$p tqcK'ODs[mhM=LYQ"d+i=蘠\z!+9T ӛ UK  a ->>q4.ZyU/Ҥ5&Dn>H:M` gkSڌE+x)%}|EV½>3.z w;S8KJ+*$TzMBEsOm88^2VU,I%Ώ,*8 =9&!wșѐ`B9]ؾƪخ+Xg?-t_`+a&܈\o3iTyݿG8GuKM;j|{: _ݶK,KؓZR1i@Bbi'؅\keϱه~&P}Cj|nKd4?@K4ol Z -+=tIVr藫$cGjG8 b=1d0և>/L[Ϋ  d;y72?`&Iu9쳳MOEA?ߐB)+RxeJ@!v"hWK{Sߢmz dm@  tiHY(Ie]9G};Dߎ|w;.1gl+ y^ǜ$ Mm3B[Qi[cVpm'G!Nv0)k~8ͬ\ ވBiQeT>cΘU yE߾mvB}\DSm x ̘fV78)AY@h.~Px{uB]}o۫-B6KVm6b9}& %/BJ^2H z+|xwd7N"3\+xPhڔ>F7yIi@C7̘q_Idf_z 2&5Y"ki+ 񎵢j[GM%~L*qq'ÞFx;#q[|lɼf86e x]oǑyWt@&%>$0̄)Iqb;KN̊Rl~WU=;KQLuuwsΚflI>s6y-wUq~Ѹц{pw =_eYh.*[LsBY[ۑ9N/M*9Tyr\eUн+n)*MeNYr\L0o.r]\֮7yU=ؾ?ً(k>gyMݫٴbe5~\ى=-1]69vcWE9@0n᪘NYu>YL7~8-8f;n'WVDɉ{W{ǧO^W_<9v.!MVLkE&FyKtcslZeXW+ ]1qt5Vi\]]meu>.W!c1Mcgdy}=˫jVYӼunƐwJEԪ^lʪŭܢ^ o"?I1pto`0vOj {'_ fry^eU@d&EfQ鲢s5*w[Aڲ;g.@z%y9䭻Mwsp/00Ք~WVNntA5f8[’.%Dt=6xu|8|w!q_BX>%n#w w[螠X[#`48AA!7 !:b8ȼC}]* 'L4Ԍ?ϳ*k0>!qs-5ʴy%k=[\Dď4|R8Vs'3] JW:b64=g1u``_˭!ʄ Gy uK (RJxQ+b{&;Ll+7fKV9]d/Mg$|(TYjF%">0~?\lZ@aKL$nAP?1/|@A*SL1Qzp)\yw'6E2Ċ݄ V.%ebpx#lXkd4) ؛A>jŒ2U&}ޫNaH .6߃}+osu*B[ME{ׄm*."^0y|0-]Ċ:(P+Ei0lgMҐoqu)"oeg9Tb}Eu~ O/sϰXf2*|kqE~JuPP)Ҫ, \ˍN6nEzY3b0iBR1SyeZq:s7t6?XœAq<]8#`&;GXˬ &_̪^DmG^xR'udd9(#l7 Z7~Hb\`@P i H]WjXm}r5|@^Vɏ1^ok!i\M~<<9v#&}h&A<B]bR+vE'7ZHct4!Mnm9Ւ@5[e|BBJ\A&_򷈝E=9WB,d I"*A fOU/N'1!RP>˯snH<MVUA~ŘY 8Ա'V#0h隀0YRshj(ŘxYqprJVc;u]Mp"8ݓDpㆍԋ9? Kp79$`56G Ḹ&F4b\.i9BڛDPv%y6Ԛ2r۬ɤsHPFDѵͬa{0gundl b̵P{5ހ>cCPH(VyIi(p\^h8J.Ul4/JdždR"i뉗 {/78=p;Ek2FDS9QQ^y{$Gf/c#)&+'YDkS=ӊ)|jE,!=)')'}S*vʎ$ɚbx%yЁjLYs: ˰bߩVH "i _U?=3I m.JH6]f0h1iҪ' y.aJUQ,7ꘂGyyVH%l*k-2U2 ZrqY%%2fq6=#x6hlyQecQ`O3F -(d<􁡥}$:8|"Ig8_1zob9T${GG/HWo3=|[`'vT '뾀0>K$$8WoJ"\gYgXô,4dgN%4?F|t"p oJd--! m;㳨l{/} NLAz(ce2+P2Z҈hk7< 8 [7>kA,ɘA ;ZdйuZ"Z>X5;YgB@*&ڦ,^βQϮc95E߼i bIL^EIL(f knGPbhnVcړ =Ma'pus(Najo돋[er='6(" z9YVnPU]Ům9[L&(pdʤxYԗ&Ƌ0Ae~gŹvfS(1"$yr?ϐY{KC-ӱ`g2>4*] ^yAdosDkEvIdJ;9I| A8iϫmZ2ogEBZNkBe~C+WJl\s'OKl8J,>hʼG\f0Wplǎ4nJ ^*դ,p-962K>.! 0xxbC-45i @zDR9pp4 :iUa9oYGED{ j>~*QhU2Gs{>:D,MtB '>=:;=(xSd Q#k(Ϊ<?z=CjD搯Ehū~$q8"¯F-qr׈#[(FӪ>IRC% b?B?AwxBC i=׶<98>)BUKkU(`˟ɒLUD"\h׺`wr7$Y~=t;@s$WYIn'F'w5"?rJQz(pMHf.dO>ҕ 7,or-9rv؆ 1yl78wKcc6Zr!}MyID0DL#HR]St{w SSڔ4Q3(F,ƆJdhCB[vѶ0(y!}dHGp^yq{Мt[&trR#HzH_qH hoϱ(˯0IZD ӕbD{j1$d0fڌӲT%!%[k, r/"oFY uNQǯ]osr^uGi7eVLaqO%|ήyCm'!Kp㚬*j\cNw[q]IXDcP,ɇ#֜@DtB>%toj9$-A̤O{`q Ʉ P`"Q/+$CE" ۴\PV[!,Z9"0Xx&#6xv-i:.;la(][<rC|‥k&,O)~ur_142|#˨|\i(zFwx s}Zh=U{ Ax :pA;:.t|@~{[i_>6bMT6-͑z\jT^&LãPJE ]s[V$yU%͜\[y9[,N B b,Q bV*TK=/ YrGt@߄-D%%\iQn(9oRt_[Rf dPZ2d2!j 94_#4{sn6{' [|`Eb:<,<]524 @ bl2؏Xv R.Si-T~L&!28E<}xPdA}23_)T_,do_tA R :R3$Re`)j_8,&1\q8Wҥ|kʅ:8YH{dV'߀ }%vg#8['¶3~ mD, w.(-ǁni+sE\8}U tcѩMv PvE=-BT9|µ5'Q%qevO!;2ס~ |եԭf6xm`qU3:gF|DoGJ%=Ty#5h\2=)3}fLPg5L^ׂ!V|#j|D㤜)sW3Ai?FXÓ{̎~!&V1ЕжHK\mO:00+vnl ua!/C,`E1" ֭fىoUFi N)8ɧ[~zTw5q saI%)EёK~JɂI!oV#Dg^/ЅwAb壌1sV|n{( E(0l)>t}PT=ZoH8zC8+,t849}+5p.9~9Q=fqk(/ЫxgHp"(M!#v<?(3xN6l4 ʒdm՘l6mnx'ᵥ^$,Up KT10# 61v7ݪj,d"nlk%a`@pGa)fC# 49*KWD:uĖ{]Dr/>~r!z _uo7h.Ć#Rfb<ռoRCE3 ! E M8%o{oȏA6R 0u%njppeЅ*D)ނF À[$(*:*w7˕b DFfe*NRϟKܠzń˛h1TRjDfYĶcJ!V=Z͕T8k`G0QØ/f@$RIc# A_!y'ɸ3(H)ZPuMEPB*C=I_SD‚Ag:"CER-fH'h$]ZkB0'$v/]3دUzF ]%8YP߬%ow fE?j&lܲH^d޼4x0F\IT *a^$1O RTMHW^,Ay]؆-LtZoו"Z"=3'T:/."R[qeWs4gEy=|=enݗZg{׫p%s?5o"D>u ([?`DҨ9Ne?d)6^[ =֖>W0yXp$u(ݲ1e0ѫp,V񟀘KM(;"du8}utir\XɈ\\NDxY%ab6Fv%=z*_" =F * +I`YU[9.'4yDo&x6dt>U>nŮuN&'&ٹ\?x@S7Jx9=jd{ؘGH2G~J*xz ndH IRh|Ř _~L5AQ=wD,mWֽJInПYxxc}603~N⟇TIu3fZ0}BmIu)7hUH ysTPH%`|| i[QfLXmُx$xq &NV,82Ql$.&crK)l7x;sㆿ 9e9٬ԙr'[Nh:]ao@Cun6xx:%ͦ{V2x{1YmCd~9|M&/|?qrdɳy' LV `T՜z"=VN쳺D ݝl,x{k7fIPF;Zx{|i6O K=)x$Gb4df,w83^kNx[cC]̯)kAx{c\ɧAxfime. 'ϗ2`/ILIU\a gPHIMK,)($YZh> R0 \E%Ey ~>>\'-_b;+Ɋ-k;x->E|=ɪbxɲeHɌ{k;ff)FyF x340031QMNMIe<4+5gU%hb y oo;Ęޛ>2:x31?dnd=S; [ ux!9AL4Dh=F;ʂԔ4-܂̜Ԣ k..='O̼|ҜĔɆLR2UJ+K.S(J-)K-,Ú=#Ɛ &_pb ,'PZW5X1kr"g/lArʝȥ[lU˥9y"WfYt:G]pxY(N[Mch?N0<4sqT/Qͧw40000 tests*_bNgHa +Щx340031QMNMIeй4ݠC0o욡8599?@/AL{hI-! ox[#aC䷢Jɿy ?/ &x340031QK,L/JeQ{I1쩯ޫ{8BT&fe245:\p3QLꪡj 2RdL-~oUޗ%gf[a9e6{gd?F)Kz1e0p>i0.];_b *,L2$urĖ˛mpu w4?n.6Ya@3"8ȋب';f$Mؑu橈3k6fPCg0lc)jW(д)o}䍨+?n@S Ҁo1㎃V)`f-̯嗦~w~d$Ei@M\ ɟp/…(a&ɐv.ҽ}c e$g y䙜&S혘;BƀUd0iQ{͏$5vEŻvϭn)[tx8~vCj#3҆Fhϐ].kݬcOɳFbx*C=* 8Nx 9sQ S~3x\y(fX2-&`Ypr? dFVĢԴĒ̲T[j.4xx.N'ϐנx?w[[c#řU GM r76BXX$C\A*Rk) x  ]>!!>~.~@A$LC!'4wF8y#hb 32x{eHR9zI %Cיv*imvcaߖ &x [j~ٛ%!h/x!?m`ݠʑn$/ZCx340031QMNMIe8vsREyUK{M:rl*""w|e‰Dlx31v*zْbu%ŧ^f;hik]SqAwj_]yP-z>{R3'dA\5ax4|OLڃDƵlEprO-^ʎy@x|!$#U!-?''<3/] 5 'U!#,U!9?(3$5E$_0'38599?@(?+5jc,#EgUx˴i6# ix[.FtV{2sJSR'`";ىŅ;59#_Aj,ﲸ +L6bN,RPQ)J͉b8K&ed6l e@% @VbQRbNXuQv6cTOٲ&[C~F^I95/%3MIhOFJ5FpgPpS}rVrj1ORARsP qutT@x:/NOKLejy.5b]gk@W\/س)y\\%V\(Vsۡ;gr78`rNjb^f^:ā^ƣ`Qn~n\<nx[#]lvcJRK@N\%9l+xgC#NL&AY{x~A}nJ~AI|AQjZfdF~Q|, 7`bx340031QMNMIeuҙEҖɻ_>r~״N[ fωn,UtBxkC,%}5rdAbzj wx31 La%  &priority.3ɞ+d_ _Q}aTMʓ&(+s˭YC wH#iF*!0yA100644 seccomp_load.33(zgQ$latpXx*\y;fjޠ&(E} 0^GDA30VC7HF">g#/ނ23#~N?x{/@vcAQfFmL'k2kN>Ǥ-672'2M&?9m&,~͚(y0܊'Wsn~c;dx{/AvcAQfDEɁ &p9rAE&M ~eTld:YYs9&u m 2juf^wfSOf 70!qq"da5\l\\Eɓ&V->;U\(ZRZ[lU˥v?`<39CC<Z)#p3M`YHXx}Sn@VExA|ԥT=^RQQQPJ%hcU7z "!q 'NҖ=773{$z\ } ,UW־>v x?# Ңf}ëmWˉ!d)zHjt9'OnjNqu:)9XU 9*4"Phg O18o [9xSI1lۑŞ#Ok`6Q L(61`䃾ž+j<qI/%!Vv\nF/C? ieNbz wMAN_lL*U,@CWpَzt_kv{/wu G&!%4FicMv~;ogot5%'Sxp&Rxr7vwD^"tV#@Q }x&&5!9FIabb( aOaLXpq v ҃Hog>e3k2 T575}#D2?It?chT{$̖>^9 2xtSacAQfFl Jy%]&30eNc l3kZxQFD\Ya,@.ml*jJ0kېL8-_Y2qBRռgOn@pU^UU IJi7Y6vleHSN.q[rE)' zZ߃xh.5N&BMmni{ϐ#Oy06 a!!Č\.8*LP7eZ 6${ag߰Ib ?. U|T1(=Y+E^4L<1&0GSq(9OlU L;e2sb55dDͦlb飰">ީi7\Nw248iFfvmv'M'}9|iÎeWH@.[UXuYx7=R#,Q~5gP(N:R'y!#cIIL1b1cY݈pk0$(F X,QM*I@.meukZUWYpȩ/ԟ nULD+U\P5g皸7ӈ@:@GE"AtEI~z#ڗ9`ΈoWt^KSwmxxTMlEV CXv6 p >q*EpYƻcgfw5;Nj 2\zABʁ G#\@ĉkWN̬w]mXY{|{om bB۵)w:m{\vajI\ey>4#( h0WJ aGD U|~cCrH!oBOT(nE1b q,6oT2(g z?}LGalb)"~Kl\w׷kF5-*],u 'V> =_މ(,ʧ)+^{>IY{Ux?/lϣ3I9?VIpx==32хHh}_I1lpkϴitQP::1mg{g'+xK4"xHԡ$Qr9ޓx>y1Xc{Vm"9Y4Kc$4,'Rq$۞&aNp z#mKLox jI9L'&NϾ&P̖f}!i&OO1dZïT][Xw3Au xov)pA' V[jKcqVC}2uFYNtx47!̓T^g0;/:tag+J?>GBK[]aTe*w}V>X0Nl#(cGH(1g_GC.^KoS˸Z3Ӣ7'W*Bu)(o-5Sϵ::xfb1G]&˰0$m`g|Oh3LzaANԊd̼&d 2sd>V\xWoi2OMId$K"YR"mђk'uDxܣ.&Qz85HR4͇ /Eť@[h)Z&m@;lAv;;ٙ_۬l{c>P dH9"ɦkse%f:SDJDԂ|84$e:rI[&:.3ۜp'ZMPix\/dM+ Uų TB yC mvxTay4*!h] N< &s3>2%<c%vR Y 4(g]|&oJ os6SUrDe ~(@9FQC" '}2D e`HL˜C5NeI 2j9=WSYÏeCqQ|(_eG<k ]0hqY${[G/U) +2) I sq6ccsHHdQ5pDo:%ʳFE;$ٲpUs(F,_ 9Hagb`E676-eݩ |I3d2NaMINsFUTAxUݾ?i![:F*7Xw]^|#"KڐD#Kjd%Q?yY$%8jYU`Lk]dEK!qKYJ,$ ZZIX v0s.A! :_Ob?{XTԒ"%rVSL?ܰ*Y[[**<ρvmb $ =ޤZi%p@yT(a-%~nnpR*uOpo?k叺5TNh lTW::T&L:W'p'a9[?~g ~z]`.x)85~2CCp2p^ F tCpkNzFH3'<5 1wO |l[X ??;h`.P7=tdvt iÚ6'RMª x+>3A9zı48U6e2T)Ɗ=ĭloLI@<5 VJ~QPх SCYLo:Y<+=5L;SAϪEsOpǿrAdrZf g>%v A 7h]Eho%,^ÂԖj.UQ>_*RAxifS3x`Oѫɫj޻+;-jt<[V*!hK>6;KH 3F|*o)"s“nf EIB.jS-sS^=c ¿ f>m(R[ؓO^<7YwόR3NjRV Z"+)sR^9;K~^[-wI>p; >ETN8Slކ z N}m7 [!ʻ[KFqRw[c0H7{pzulݶz7TOo;̺$Jgx{xqy 63)e\ظYZq`t''dM~ ?iBfIj]rFbf^5'gZQjFqt885Y=|$}81b׸L!{Dp˰C.f$rPs\Չ&liT*c4bu|}eO|)yٳ|}YN  Mmge&BP;_"ڋw].st WQO-OJNLźRc!RGq;!ondI:SF& "zIDҦ٪e)i~-Mzľ!x;ڪa7 n)\!gx L100644 .gitignore0CIuᛠk!{|_h2100644 01-allow.c㜙IJWqld XL<GsOzM]ܝCV;g$?-&oO.B73ړVM+ =Ε`v`߉C!qaBUG@:GMR%?h#iNtxϸTf dMq`Ѳ;*W&FLdܘF !.R<eſ BzNQ7l 3ٯ`^|dӓ NL)K?D8;kG/93~^H1MakefileV6gK u WbXT100755 regression!7-D aү 100644 util.cyF>s4|PؒL6100644 util.h91D l0u$Sy}N#xk+d ?`f،ɣ"Y npxϴUK/ m##nx[ĪTfxd8Ex[cw\Փ1;1%O~ά&\h`ə__Z2YEq?F%ebxȻ!ys #Wz~IB~i5uʓY6c 2x7 WlfB ?s\]Y]e-/_"#x%V`w\1;M;EjQVɉ,1@,96 e ?iOvdeEQc3C%& Rx{+wwE): /*Mc嚼%d\6F. O5((_,3%nE9/fxUoFi gU+T7%T(8M4Bk{Wgu(:wf kT]NZ̾y?Vܔy&E"&mE!~%rB͍Q! L6-Z.SpۻiiUDU }x8Ci3sh:vpʢ 'Z!U> N.q]p~1nSQ޶s?,5t[ v711{IڍvR9}ncaDoBwСh8/IwW5Qk`)K[D.xpϱ LĞpçRN>5[qFmKvv;ZnK4zwBݵ'X;´g.m$X<9!L7:fy\q7g>3]$X,`\ ^DȼfrRS6m{{"?xo'y 5c\ ?͵`/70 ]h/9Z^{x_=GTmumL_xߺ0n潉}^s+.o/_py>F)#^)+Kw96<8c-/x,to#̦ʙy9) J%9zJb2J8A4(+$Ț(YV>>=$D#(=YGH(k4)h(hrqr u*_QiNj|bJJ|jEbrd.tl ξ`]u  pEE~PYFqrnA|JbIin|_n#n`(6x_~5讻ʮ u@P˙{pxǷokBo@<(dpq"I( I!I9QT'g4@3`#;[x[7o= wbJJ|qeqrbNd_.S2҆: ξ 窣 ]Yyɪ0E,#3UxmRъ@mp}ZEtݤ;)U⮥A%i:l]]J?"'ޙDMQsϜ9sr?Φ۶ /s iȠQ.3X18]c$Z !`7\%SHֵ}8GS&D>ZMAf6?X '?c+*IOLIOHL..4-]?lFξ!!AήF&: ``Լɉl*gc}NA Ax3gdɜ̤ĢJbTĢTk2K&ސ3TOS(HUp UI-.N->9ј_!D!3?4m\Fc1_ gGG'OϐH"3FmnęAL.lpɝL"\P2'`RglĬ 9)xs{dp⒢Ғ̜b ]فUpNz<`yEd'sɂ{!jbG@$&@f/ %N^*?ZO x7ow&⒔$ ;.̼ҔTXL)oOMkTfDkgp*X&'OǢ' R1'dyVY%"H6Zsqqr!ef 8TĕSsS;y&6Ѕl&_e3&~%/&o䐟ay#G8#Õ&_ p2_,uإMbr8O.PU⼲ wjEA~QI|AZ-@D`^RA<ɒZ`e\\Wx{.0M`w A&l>n6Be&?#PyRMwi2Nc6Gm {<M^E%'|A. &Ob rF,pG4NTZ7Ҧ*kL>a+4-mekz+ijMTA9:Qf ǥ G82Or27RPfBt N"@VRAq6CdE  y% ťE%)J:0M䪴9"#WIjqBIeAd3M=W,8W(WyFfNBzjI~AIRbUz57y<96@Af޺D8x*LhR,B9O~=3|r"i nxq}NfnMk..Լ4.A3;xdd`&+$/4'k?;X 1%xkflfP(dok\/}x2eӛE$tϜױ[ZT "zxX$[5ᥜZ%y 64Eu+92Td@a3P3940000 testsSY'-x&a E %x hx_77sgcᕷެ/f100644 CREDITSA.eE4pPPnXif Zӟ[zqڨJI|RerN7x n6P+*+7V:#G=,ռxKԊA(F.x[e~[gd~nraxX$[5ᥜZ%y 64lvv\i g*FM540000 testsA,x~Jr}Zϒ 'MmxXYގx|'n3 &MIb64že Cc740000 testsA,x~Jr}Zϒ ܌'Ux[eFWw;=MK~i!VoL @$a5xWuFQPoMx &ȻW@<.x {84O@bD̀@~x {84O@bD̀@.x[eF V~zVtq$&ʽ j$x77 r1Ha}SƑK5|qz2 L*淸ݎVʥXGx[eB5a*6oH)/P@{c&F UxTR?oblZ|F/x[eCn#ޖ.h/5]=x340031QMNMIKe'Rz}Lτ_24cb y 9ڂ}dw<%Q]x0x31x=rTM`b %% G N*2NPbTWQ[q 4Q2# ȩ+x$P~ffv?W+ɧ%3RR22KRr&L6cQgsbYd&ײJ8`%Ey9 y) eSJ2Rs*J37J1jĕ +(D旤*dd+$%y'<8CmxR 9MFAaMJM"Åilv^˹x:9HGzH (VxTMOARwBX!Rݦ@CZhB ,)q"4=zsx2_əm{<ϻ3rɤIس duNUW7LuW:,1Glr?ӫi°Ek01FL\nózXaEn7$5{u'~obSr,x1 詈[NM05XXcgtФ ʚC𻂀,i^Gc \H,24 ېg?wTrJ*/wjISUU*ϳ)¦c]`wzDY4mΗTAyNfVmcPv4+Y1SSƇ8L 5E#8 yRe V\\#vRbz|0.3K#O{qdtDq<QSc|"eSG;]<\+ ;fZ=y>0?Ki_ lI@eĴ 'ZG^'( ]yXYN_6&c;yK{%̉Zh;[& ܒ7t^ĈƗ4MIykjCvB`]}ʀ x340031QK,L/JeәvQBjeYQƇׅx !|S2sRsΛ!kưm/@d&&'T0h|‚y0)ߋj**+.}?ɣv[qe++))bp*=cY-Ը?kHK(xüyȼnW=34lά+F|Fn "x340031QK,L/Jehu˹cm!D;5۾|!:g8< Wϐ`Y ۓgQ~-^IA OgW`WS;\1ODΉuJ|S2sRs >ZqK%]A:2<ήJQ׍oqNsf>gP'_ϐO?g` r,]Л>ISi^ث@榦 %yz +?T^iT.Qყf&e]pƄWbSgOIeuRxݟW`SqҥVf%甦2_qؓW2)BPSd&&'$e1H65huƜ+kĶ@L+.Jfx??.q=Ɨ0mlIjqI1n>EʿLf('T>??!UE/m:MsT*٩z~x8xtd#=?IձB/s/?d Oړ@J!x;s{6;Y-b89RlUT43KL݂ĢTWGdC] MɎrXM'_eitxo ZEtW|$7TTN%/*GOx p6Am1lͮrC#aϳ'5F]xZ}rc4ĢMu'fmaDMYެmQU'PRx BYNoJ*EeʓVjx;(Mjzf!GxO?ϐx_GoWɾl%%ű؜9=[ fx IABw>H1@ _3x! Kǖd <8OIź_oRDx ?HUZDMǖ @2=x 1[]hԵgOs)%U@B:H0apj4v%7Zabapf+ݪFh?삓ÓryDdk۴Z[ӃnΠX84ofWݳ4 A:f-8xM=E100644 arch-x86.ha@۞L\@y)i\-ҵy=1fx+-(2s"f?_=) )&x;{gԝn]]bPzzJEŕɉ99z &} NWݭiqFU-DkUwt2"\?m[.N\JI/y^&~ wr"G^,\uʶ߇3fkNV`L^*e2 x4BbQrnnfAIMx=^:e'rWEE.%{- [EEoܜ3ɈTл/,g(|{;YYZdv8q5MaF_2.79YVaI3^j\17X"kʾon޶ w}"g-`k䔅I[M&Ob߱J,g++{)" 詴Ǿ6ܶgk5tU S?ߕ&ʪOLx*9V O}b &o՛Z;y;ٮ,SOʾhG^C2 ZTF]ɒ+&kߖ/=E#R/L~NZ&Rw+HLJOwH%Ǿj<O%lMxwoL͗W1&z]/x9q< 97)Ko^QP4`xk`6ɇԥ7PTKenÛYx5q P3tSx= sT'3lzH L]x<$VP * arm6 v.Bȑ^x-Z|+x?7re1<(_ x{y/m’<_(nfVǸ"GtJbQrFjBlDVLL*¹ `(򌍔62 V5x;1$ +7eVSl2EXXlP[l x~/-fv&N"xsq ͂e\"y ‘rx;;{3z1x5H]{O_sX-PJ#ݓv]!9XBZԥ۝hx+-(RtLaCGgGc  nxtiieU?a txr =S0͗nk“Lx;;cì/qx[eCHO.gew2YgREif!}W~j˼/|WM @$a~XUNG|~~N1ýؿ+YF85.?!RG 5vx+-(midixBd[ &x[eFiMTJ}Wa[h}F =x! t y8˵SFSa?;Ilxx;yC*y?&%tx[eH'U\/pNKL0 sxüyCm)Nww.U+>sIYJNx";ArfɗXu'Zog/ePzwx Mqim.!@klx;sgkV :f{)Qpߏ x340031QK,L/JeәvQBjeYQƇׅx !|S2sRsΛ!kưm/@d&&'T0|7Q:%ՙJ}V{AwIy,կWǮ5\tfgR# Nxny2;4d~VYqX0(xsqA ܾ͂ jKAB&kN*8~JY&IL 鳙Kxr&100644 .gitignoreg!|ݓ~T3. B&~G &n@+Ϋ_tNS?di nVvMqim.!,( , ebLj$6?8fJxxqU ?9g&x;ýc qTx&DrC3d_6Ͳ<1\x[`6Vΰo42!$40000 includect$WknN%h6&RF'yQR-jD@&'ox340031QMNMIKeJPނCM{xO~31<]]b1"w`9燛x318żz ~xi2͇&okifko Klsxگaf6>Vv x{*|oCf֣L8'KpUk.x[#.!gr>x9B/Wf+RR$}SZpVvkF)4f@=x]@24x&5MbC W3'qldX4xW 95'V'U9ސ.w.C100644 api.c )⟬,>Ob@Dnh0h R]aUpT('3[wnÏ _0Z0^Q"Sʐ\"2IEy71y=O7{K ZKRK-'cϡ'_ =eԍD !x/VzP&eǰ33O ux[̳gsF[3+we&He]ؼ  x6yXLvHm^Şd sxOq(?熚8ZJw x[sqA KYRsL6w+U`qx9ݝrFuZH+YA6k~&қz~p8/8@Fjx+-(RBҹwSWg/ pxtiC{'4+O 1xI 2TD,bK'"<&h~,G(ۻ|'Y~lLf}&ABkM/sߺ#}R:Λaϳ agܬ+C޽C0]TXx1a.2V3ݢd5,›wnbIa#%(Mx16-rc1Ld'&2 2 ߝÿgxBژ6-rc1v7_.__PNR_nfsservctl$˳% 1}Sx1ԗ6-rc7R_.7e'% 1·M]x {75s|u@"}x! eX ҽQ, ȝ _ex;eC=Jf^rNiJ~zj^jQbIj~ibA~bq~i^fqIJd{+$ Xc4b&n–H^3,zq1[ؘ?(>82'3dr ,ٸY6oBw3>/좣T3Rlmbc BJf @ tpBnfA103Q`,x[eF©+hfaM @$??IG&}r"`ga=H( x$!! DS˒ j]Q100755 16-sim-arch_basic.pygKB$Kh H-8-d YtviуkMlx #wlNF!DuQZ ⪲h#tOn-<100755pyc^8s0%0벖a4. S(l86]!| 嫓"]dUx{³g2,KY3:5Px;+FhL<f 27ugx[{2,KY619]x#pj6Y240l?x{ukt;71%65nxv :ʛ#mc@TxeA!z@wq!]100644 scmp_bpf_disasm.cʙum7(+`LgX\XmB!Is4/eo;x;$$d!91P8x[nCdYe7ȭg[Cx;`}r.ͬqAv-x[eC*u(_䙌q[|h><Ƀh7}sFQrnqeqrbNnJinQT i{LvN֓3:ϽQwS~b{lB6fV1Мc$^9ŝ5-ڸYlΜ.Rm&;U$+ں_2>qq&,^*)jK˝y۴o XD챻\e6żݩqK[7KXLsd_Kl&qRW_%8Ac9ӄ^L-[~F<9KY,o?rG! .P~+I*h`ٳgG+P{(x;w7ɦ,JX3<m 1x&wTza0M^FS *,Lt&/`AO,UQ/JLD,(j9ë>CQMl:'gqK(dƃ$l Ԡ\30MV7'+wx-1]l&x6V x2f~R7k,`)#X@|Zjx@d[YuOԓԳp   #d<MD!(% PJx༁mrd[mدKG !x$!! DTS3}_m&g100755 16-sim-arch_basic.py9ۤ1 gd 5x&}LF׾Kx #yJ_rYw <<Ƴ %|!_0EPoخ7C100755pyLx%'"H{t˪. SZF*)rh&blaf y={0lx[vCdYeJ7ȭgVl3xlb擢\$ x+-(AT#krDF9>*\ ux^ 9;iPۉ$;FLM&"Epemcp=mK=$95DJ].@X';޼Z*{-&D[7(֤q#7;A -B~iH,%1pWH[x;wwɦ,JX373x#o 3 ; 5 Zx-/Aes<(\Y1%nxdd2͚2Ռ5ed6 ȭf|Hޏ &xi6ɶlmدKH{jT 2x POehHDds lxrq_6ץ'B0x {]3Eـ`6{@Evx5k-O<6.pUWwqNXT1x5l0~̎$[xvq j\E b2$M6p|q߄OsgNpm "+Tx{~ jE: ŕɉ99\7ko^_  x[eF9,ҩ$& DxOq vBZQsՈ6G-B zwx;.\~C1dA9>Atzx7p. /-@PZЋ䒱FgXbxW7p. /-@PZЋ䒓4{]3Eـ`6{40000 testsHGpq+  Gƒ &kfxy=FG.w}mIN-Mgŗ xüyȊ*+v[X7 :x5v\yb,ӊDN;&dLvx 9yS)/;?FM4xwwLɗ'(MɒW\`X[\YR[0/fV&%@xyCm"7n«:kRC%3gx+-(ur~+/I{l &xiw%A2x9TT랟;ѵ{kfBnh6"ܟoϓP瓲@ztx+-(ںGP6<' gm+x7ㆃ%0Zvxk 򜟝"&DKo$ZߑH\u=wh=0&k&g63wl%[A jG a/Sy{γ38xkg6 e7GrlجXʸ^np -dx[>a%lO7h n>`Ƹ6+ xkurqRE\߫|YU AAx1a_~ M% "&Ƴ' Lsx9TT랟;ѵ{kfBnh6s=n:@f!5Ƞ@P mx! M؁QnWn56ٳ&kx9TT랟;ѵ{kfBnh6b`׷[RP( 䓲@`{;xx5k+*[AЉIGt9|, B /xa2AoH  6 06 ~ qv197+%5W __PNR_kcmp"+47O_l~  .$-0ֳ1 D+?~?uhA ù7$ x9TT랟;ѵ{kfBnh6Z8;(|>l>#YW@0"x Xyɚge)!ux9TT랟;ѵ{kfBnh6]8蓲@nvx5k7ev]Y|+b̟xx9TT랟;ѵ{kfBnh6'Ooi>4Ɠ@EBux5kC/_vW yܒeWI7dBB&" x[ ffNfcSG9T:DxNTT랟;ѵ{kfBnh6yѫLc2q]#i\,ӊDN;&dL$1xĵDA/=$3=/(9bM}e*Դ̜T\1\[N u3<KVD_#.V?9K~O5&Ye+:35N!!%+t+sry|Ļӌy6->Y¹De[w~(Y:ᑙkn3t+,̐j![*__L^Ȕ%`dݢod_ʧ1X.pp춛U]=9J/'cQϧ=xL*NMN-K$TRx{g\~]7aoIx[cC rj^Jf,qxy%ȵb+FZzƕN[xVjr H=7q#&Ulx[(<]xCf]6*kx5jCؽ̕|,0lg,a>%ȵb+FZzwRxS h#R-6sgv `k= NF tTAj5+ [^j3ᶳ&%ix>__g4.7mC__PNR_finit_module zX~n_% (^xLOc2%}}O> ?#d񡀓Ak%ꓲ,a>%ȵb+FZz}%Rk.x;}/- rx 9PbT)2nK+7)M<f3Ȋl8Eq=|8ŅzS)vP- p0ҁ7󒼨alS↓:Xi릛L,֓ly_BwO[A87 bfc/4)Lf [%^\Ћdc >Mց_Xisy۝ֳg xskn&3[.ĂLdĢ $S Ғ4 +#$T?d9f~J'b3I2%7n^Ĕ $uL }FzPCtr0^nfA^lͬL\g(MN`R rv =)CoOx<ϱ]95/%3 'Mi:x{6 ^>oĐ xs-vԼ4./"YkxǵkC8,goxusvԼ4..\IxƔtRmqvFwxe{ ܶAexDKlxp26gY;!MZGVRh40000 includeUR3[@ywa1=ȓh6c0K8.gO6U䓲,ƔtRmqv0<x340031QMNMIKesGS^?_*#5eN&9 PMcY"qvћ⮨P®x31b}٨-)gRAu ,- ?l #?u1xx ?A\+14Rxrͩ \y)7hLb*fCLsx+-(PIRߎ3w0Q> *x;_=ܓwil&pD2M hox8 Z}HCly~ XQ5nz@;aj-fR^$PlŦ$x;R|Cr+ x340031QK,L/JeәvQBjeYQƇׅx !|S2sRsΛ!kưm/@d&&'T0Ŀr%n U\5Ppe [zĞZ`}酆DUpe% E N3{L^8ewg-IFKEl=xk!!kL &7x~ 'KlMn6:xyHìYW* >!zx x340031QMNMIKex%jM[-en{+l31<ӥ \gO_YTU}Jlhx˽!ys% ʮx31FC[M{SWJo "+&@PS ~lJɊeAro*\jG)rexx!!x_^O`,tgt?ճ2$ѺD?ebZ;,{K~gѰmqXeard ~τ1v8TQ0B; +|m/&-͈ײ͘ T Dj5,U*x #&sևkV F /bD>w@100755py ;7/7.zQ. Ct,wx3wCs}fB^~B^jEfqI|bQr#Ћ0ӴR4Ĕ4Y$>f&77!d>3; og@3 &HL6(<#'?9EeIL9SKyyPWqFiIJ~y;uX{+x{Ct^Qjn~Yj|bQr#s s,;YxmfN -8YH Lf6cadp2qx3g3sBpeqrbN[fNIj&56+J/KO,Jpz~!ap[% IGX!4cHś-3$(>"T9{:x;)^pNlʛ1gMԘ| yxʽ{ԒҢ{x WxkǷ/7 1#3 xDL Anxg,VԒҢɏXp $x{ij{ciIF~obQv~sFb^JQbM.X@/*^SBPjn~YBIFB^bI&XPPV+ReҢԜb=@^xJ G :9Ey4g@FVX0V?'x[ʽk5f͗/12,x[26ЭkDIr40000 include>x?|q%!0Rh6Z M3IEѡ>[ @e(\x340031QMNMIKex%jM[-en{+l31<u}JE]NAx31 Lœ x, #100644 arch.hX ̼ Z}fѳ%%)37_4 :0u^$kZ1l5x^>t}v,|&x[4w*ds~ɪʛ8KMUx+A|Cd{m\“6:|7  x340031QK,L/JeәvQBjeYQƇׅx !|S2sRsΛ!kưm/@d&&'T0X*TDл?ؾ$,U WVYP.p\ZO$ oBv{:R"sљ=&OUزK$bIl}x! a /X"0}xq& 5&L=)Il9i aaiL/ 1n,u)xTSt@fWl0%y4bd?-o8thw40000 toolsƔtRmqv%&hk|x;ý}TɌ,exOq ~[w7DkF\_#BkǷx{>YU2?x /PJNV뫫m@[xkl"T`Rdv|nYnǢ %xYڝ0'((kxi:Հ]3K 6 XexyFin,v5&@PS ~lJɊeAro*\jG' +xH!!<~r]*E #Po{c:&7XRV-PvS3APZ Ivh\]'kЋɟ+7 FvA &.H<#Y100755qbh7ݳcr0“)|hAFE'fB mUBz100755ts nCk6IBĨLj߳F&NMr6Lt.`WqdNCrG(Y/ՓX)mb6Q ,Ug ?m|ݜvB#s{82a F=n1t B*#0C2~:FD (-(*4 ~3?v=*5 7$;TR ^D8"i u,a`bN"찓x |Pk璭ϕs!x󫗈g`K}𝲮100755w%18Vb=z;2u100755z;; -x[;f.fAkY6bR#IxƷ;f.fF|Ғ,x;³g4`Vr\X1E>ix[ϻL% %Y1 6Sx7ow\̂% %5Xxyvx)xPpw\̂% %5X6 x{wCf|Ғ2h9 \ x{&Phw\\ʙy9) 6EEy'rHnde3 cx;+]dd8x'jLVg暬*7YMe|Ȗғ-77@^}x·;f.f!kY\7lcRx{4-,-Y19jTx;f.fW[Y\7b98Yor nx̿LY6Dz1[Q]x[/8]pw\̂Ind)cUx[(0K`Cd'6F1k5g]1xO&@PS ~lJɊeAro*\jGPx !!8 ުȬ8rW&1"+}xv> ̓ue6G2;l^ſ9ܐY&-4D$_4//3/]$#UY$xrx {x!!!Z,Ƽ+Q ?J?xMHYAWKW71;5-3'\<;,#w xüyH#9 X3ܰM7&@PZ\RKq3lrȟlT>??AY%Ϊ|)d,2jix#0?1gh.xkñQ- txI!!&100644 .gitignoreZ%{!YuijM&}v&VKS_"g- `xs]HYAWKW71;5-3'ę\ʴ15"$138DV(5(83?OAK$)'$>?45@$ŕ Jo6ce򃫵LSPTtSTJ2RR32Jr343S4()-S0VURN%:{xyȶS;OV`.&iMd ƲmZawOEYǵ#[TM @$amIL輸; >`[!*Sp|qLsZӣ>e4n#x-0?7o`8<hmxI '100644 Makefile.am1H$ƃzqQLsNKM}aa2uZn  ^$ 4!x;ȵEHYAWKW71;5-3'ę\d4YErYĂLdĢ 5#dkf*)I@5b8N77X/G7(Ƭ062'de@œ2kL~Fo*(-x39HlU(aٓJ<7QrMab$K_ i9koqxeBJukP_|ckB <%Eg7GZj,*m|8Yi-wrNxeBCk|kPt & xknPʫW˥?"`x!!!ƤIGv{,.\1j8x~}FfHxüyuIBzիŇ =^ ojAxke4p=#_Sxy\~K|u3ڙ̒C# !kx9;itG>Z4|H(v|(.lKH"##@afxɿO93D#:'38599? VG!HP Vs/0נ`Ox_G/ [%jV\EZYKE9I] m {0L @mfb~l {kFobvjZfNBqQ> $#?!6y#Bf^rNiJ>4@2W?4$ 4 d|xI '100644 Makefile.ama!Tfͮ8vT*\aIM_A-|($Gl#b^$k/x[y F1ݲԢ<ݼܤ"#+C+.2 }Ux;xqz?)Oϟzj}[ !x340031QK,L/JeXX3uOC=WplQpͶ/_&F;O_(3$AoetqR}/ؕWľQ<$sdԴ̜T\\~K|u3ڙ̒C<,ו|gT=^}]Ο-dPBbiI~zj^q;۵&p *4a5'9?/-3h_2ïꫛjn1uޘ2IHC9liE'tTxz>*G+YL @!%?aO'jHW6(9? K)MIeV 'x[يi>%g-ړT[Wǰ"T:Lbաs1(A2R\-^Mg:$lIjqI1&:Ww<}C.T>??3M*A|w/.7̪[xȷgsc{FtAeIF~^WJ^,ʌ %&Cdm'cu0IRlU4323 B v)ey99 FHl55:,ƚ\PY@ J*jKKtSt 2`1M^G!(595VI"]Z ԑ0%DT<%ù8:Д*4)Q04\28V*.&/f# xUM 0^715)CRA6z,^ Z%_CjJBٯ'& .`G`#!5-m Y7m4 #i eee')yLg3=H8gI𯇄Ƅ^/0K=Uxqc ֕L&of -XT$OUx9@ 5M^?ʡ Mu &xmR]k0}^~E tڢ0(ƔR(/~ vvϹs3D/zIok@jUkQj4Cޔ,<  ;#$VY_tOGƞlr={-óĪW>+mIBKRªUÈa{)6GҎ+L@U+hYq7ܮQ!*D'70^%iQ-ȀH61Q9@UXUu L.8[kXfB 5%,K  M90# "k2J#x340031QK,L/Je +%s_٫Vs<;b6C*gG?wWwk}B6q7uؑpx50EA.! ַ'~(;[P%>ή~ wb$u%'@&fe2'~bGGY9}?3@:2,ǫp_3Q%L075UHKL/*`v^`}aʲ'h՘BJ~2D wKL:q2) D63/94%-n`S:?;|uFf^qIbN^n6g ЇɳT}r2Ss 2Nm0:y# xk:dOf^̼ҔT M̼ĜAv> ɹIi)ʼnŹ 1\pL8(8?,.XZ\21/8f26..׀x'/œyn9g;ԅ 9y\\@LMD/`{ؔU4@irqA< w&9]BN@Mnbh7xx .)2\{rԍ9Hf ~x;!! 'ʒ}6 2K~UMZ) 1Z$H)T:55n qx 2k)&Ͷ]ec2=>ՓH yx:!!DƕtڸкGIc>X I#5Syu\j" o Shx ロ#ѸpjHwx[qKfPqۋ{,zռWHTL83W7(9#>)83YAQ]oKnukte 8v)~.n7$'yYJNSw] sAE \^q:1q) S&mi7ί"-`(o;Oc!'\J"b~Ւ8ƥ>Z>Oqo`aQ9lrk{,>`8wC iik0Mjǘq. ā\W`ߴ3D7ݢgi9A}?3x;+zCp#dɫ٭8K*&h(*hrqr+䗖LgQv w r0Ӝ|E~[k.YdTě@]cՇ+B5Mp,vA: & KO0#/Ȟ 'dW'qE%řE%E9'+pN2\˥TTTNx!Dd#3rf^rNiJMjQQ^L\̓EX|=]}&۲oY61'gLИ,ǮϞgOY!ex["rKh#f--Z!S b[_nrx> 9 7Ykxɲe]FEbo&*r}wiBz=Yvx*! 5MakefilepEyVO7* l^x/bl'%"hx * U1 :X̎H uxX! Y \ 3 4 basic.testsx2I{ld~H LMakefile+l9c{Ϩrif(]xŶmDF㉮."eu3su3sr39A̜ԉ?*,JML45(ÅW\F5VN^ɨVTNN?(@Gpsg.iL0be<V.}xvkx[vu&>xǿ^X6`<XfxɲeB5-Y:̻/zrEHƼӌ oNxkfb0q3F:L+C Gxɲe]F)! ϾD(o#=#Յ *x; cgޕj + 5Xȕ; @.F"匳 kF x[1hDwf;. D&.t64-M,JΘ;٘_h߁ͨ/fW@'%g&sjWXq'gprNdVġ(9?//5J Q%)y`eؕś-5i>>\u]A6m0wa |Ԡ}̤/a.x9![ӚfzʕJ5 OV6ܼM*( c{lLx[Hk/f>QA=F"x95=V.0v8ұM9 i2qZ/&LvA(ē"kifxuk?+#Rx"/93ç&_b՝jY dxɲe^FSݗ5xw#A@?rKM @$!#Gլ7=%<# x!.ȫb?|_x33гB= -x#'';<]8;sBYD#N@xT 9{SI^8wVBEeY 5h 8oD"Ы5 {IST8&Co &-[x^ &eRll:9[C}ͅ @x _֘ޣ@3o0ǰ;( xQ5$׏- ;:f=h`Mt !1slOmJvvfPֈI/J#bqxusCDfՓUY&JkrqhkZqqh:zyΓϱpk*hkrgpxxSKOQҙiNytF *쌁Ħ [ 2h;Fƿ+.\11ν3m8d;]va ޘ8*HēdDCKdP Lei=ф(?}V d(}Xtm4ll<$k4i|)ӨmD]UL)CD=ãW}4p#D" &4&*;fvͺO5Nr)c%'"Hn[ %p\%o4#}'Y3,MOG.3>P[N@qBk;חG h6\FpʷTH劎ռ1籵Hbl0 iPmc3:[ b8_5pE56Ы kFM'6 _3T^U  ެ௝-u{齱T#$;3g1u, )Ry-r!򌴾\+-7)FՊۮ{u-JXr6k]mVy!;A[1Jh8'YxxZy3(/dDOKpbQyBөQXݎ yf_Zx9W}Hק]=k}D 屸upoN%B=EƠx;Rt2NĜ KsF6L\0mWķ$wx4i<͛Լ6 3n6qaI!#,U8?7SAKR+J SJ2K3srSKsRRSJ rKR':OpLSHI*VPU \$6_|s<'+6#x@4gF[N*40000 testszAv AHhxc;H\o|a9T?V,*j[ x340031QK,L/JeәvQBjeYQƇׅx !|S2sRLGE|v_7MP59Iũz) N.xg=Q_ ]R%**+v]p9e<-iGW6J.vR"v5g x/M|I"x!yAbm,̛/`B,x۱qF -|H Sx*ú7r"<Հf槔rXr)gS +PTEi||\RH²)W5}rրNfdނpB Ȧd)k!'?t|ife*dx<6{ #$$x0SwmJp|:[#!-7>i$xƷoCf 3|Ģ ݊3)d&&'iqq:)d)d)TdMaIx7KG)@Ks 7 ` & 3_xbO۫ϥ8Ve͹nCC̵^HoJb]Y=100644 scmp_sys_resolver.cq 4${pQ.|TK.~*x{zy VQͺ{X@z&x*-9fV<ٷ1=xx ֚,&4:_;sMؓH x;pZaHG±nD<۴#Mzv?+ɱmxaa71d]$ix 1Ҥo MKWcUH{x9 [^~`Yn~2/d^\o3 گ*XYuz+gwrn?x Nd5lzx[ԢgL), xYpLGKR +¡Eӥ*4?CSi _e%KFtv'40000 toolsҨ_;R]>QbK($`ex[5Mk/f>;6^| ͩ\ x 5_qޟ@(I  xiHKϘ|oN3 JHoxɲeiAq100755  iqݬ놀N7tf \ƓhJlA 1@۸_qޟ@(IO)ovxɲe]Fiir靣䏌k-xɲe_F{}n2Vl(|dA& x76y_/טMlh=#"/J3@$msKDn F/ x{a滬"9EK6_͸YWv+  xɲeFݩ]BN] #M,( .x9ڭ!p J8dYՓ,_xQ)2y,(Yix1Lz.e*>,XpyDe6MwU=ⴵEUu5&0tJ _~ٗ?bm`gN]ߒsIvs&G1ԟ~"y]sRTAC}BbQr^2R+<"$6 'ϯ=|K v U4< _9 Ke 7޸*?ٓYKj  v%F7wHHhvlhnMxŴaZ9.- x76y_/טMlh=#"/JF̘1% TF/+xɲe^Fk5z zOD]wE Ɖ xA44ZeO[Bc"S%100644 db.hG*\ ^A>K)xiC\ғ{D]"|PZI!u䏲"Y.rlSg\>y7ԒҢ+'g8nj^6aˈ&w6<6[Kp&'*;ă{2#' GHM>P'gRQjb5Pn@YH2 )^ @p)i9%wO.t晑7I8^dd9L93KR&?ڄa7\1RE7;bUvRlN/oeR(K-׵OIO+ѝWٸ!#zuG!TxiC#\R{E="X6?1y䗲|Olv;$ΓWP```5yd @䧖W*m3/aDQy#A+eT`g߀xv⚼/LfroGaid!Τlk.NNT ~` @ Eء&+O>4fK0@Bp)i9%@eRj#\1S0$F3YY0YXXJM8>$H.9#13XS 6{MaRuSR㓁]>yglkcxۢIs6.N$7cc^KNQ ex '5iB>bh5/Z߻vbRmSman3h\xkhpYDϧN^*~ĂyLˬ xϸqB4c<ؿIn3~X Gxɲe^FY=.3oryE `xkhpY$vΤT;EB/:<. 5 nxϸqB+$WLJMU}lř tx۵ ŘSR6kRe?9ʪcsW #x340031QK,L/Je +%s_٫Vs<;b6C*gG?wWwk}B6q7uؑpx50EA.! ״,,ffIR0ʿ!P%>ή~ wb$u%'@&fe2'~bGGY9}?3@:2,ǫp_3Q%L075UHKL/*`v^`}aʲ'h՘BJ~2Fݩ]BN] #Mf%甦2>e-?,Q|&(ՙ+.IflQ2yo`2TUNfRqjrr~n^A^f2F罺}<'/671(dw}z?z5?>RÊd8V0 gμKcflIjqI1C@Ĉh{rQ|*S̰翈\.bg :,83?/>3/-Tkczy֦M7~x πh?Fh cExkh.-d_/~=YigY~iڿjx[Utdw)FO'/ಛ 3YڌoTkFY? Vx mt"d0"JwWXN/x U8GoBp#Ӻ8ғh>xkhpY$Mܡ`/͞>Av]f ?x(㒉h |D!푛$7xz k&[8+ қ= /xɲeY0WM~\QmcF}LK51̼ҔTõ]\:㣝nMa zZx340031QMNMIeyϚZ41L @!71ag%w4R=3uO;ux31G_} bxg 6r(d)dr)h)W''(+(VdL.4*)RH-*/RHK,+JtnuOFY!MY۔ɻE6k&LΫRƙ; xx qL4TMxՄ*ߓh7xkhpYagݼM! MW<[0. : qxϸqBeQ̯L~9fuk*_ }|x!ȯ(@eCuB/xɲe^FwIQ:W}>ٯ~3@x: RE j )%I Pvf7v2 1x;q: %2mt"d0"JwWXN40000 srcbZCyv)%iTwnڝ. ͑*|VO|U;AoxB'w**DDDl\`i0xkflfd VGxB77A=~H IN(100644 CREDITS\^ w4{n-MTn[6%k@x;ʻgBfye%hxL7 `ud:RQKP̭{6԰;Дǐ)|)u S@pӚ~'Zxɲe^F * XY$>"c2 xkh.teyzj^4Jbc4f 3x>2Rd:<6z40000 srcַ2V/Nbܟh8STJx;_s!d^͎ 3Axkh.|Yo|i* d'뮦1{3 x@4LtwʹA˳i40000 testsȏUhH{xkhpYk+mghֽ8. υ '[x|UBkОl$h 1xT  n|P"C` -HS_cDZiUOYWd ~!vL㐥Ry9O_ij '$ xɲe]Fډmv~6o\3G5C)o䏌 qx0WaC4n A6_/j-lr>:Ԣ xػqzl<6;Qzx [7@+0ocxH˓hP:fxkh,>Twf,tE^Ux9{8U9,\{Vo̖*Ǔ(n`[xkh,39]AM11GwLŜ o {xɲez} 粦L^qVA f&& A.! b?j,7Qļ]"x9,k&0&׋Ol+3U7BqQ2CϤjpWFL[lIjqI1ï5"+73Z#0u_|~~N1eL;PM7ʠ..K-*̟,$ IQ\gx+*'R1KHQ(/Wz gxHk()YJG3 /sNlp$U[`~Jj/RSN<6 3l]Y z鍬z&bW>100644 db.huuZdɠna100644 gen_bpf.c&WPbQ<>J~& 6umgԞXր"`S3lTႂIcg +5+\\ŸTg axn D(Wa5 c^cQdX'FQTz21B`Վhn(jSOK,2 c5>2aé QEU0ux8/hw XJnӔH"; YtDiǓ(qSx[.Qr(d%N,r+m]mcxX/hw XJnӔ(47$"ׅ#b6X40000 tools"; YtDiǓ(7%(ZRx0WaC=ѻa-:QKS{_{.p]&!oox/Oh7'szjd~0q>/xɲe^F- Km)(Ȅ~E  q6xkhIDzW&-M?VΔܕ:  xɲe^FZretW3ox9st1V!1!Ԓgq!Gke -n-xtiq D75x u/<}MN|\{h; xkhذ)RO˫S+8ļg3޺D!%I/Zey#ixnsPԼ4d/%^4X;SvsWdN.a)`5xXq9A-8l$m(G4u/<}MN|\{40000 tests50TH+*5x0Wa)k%Wf:۩U{ɞW[xɲe]F+Rokv M=vxXq9A-8l$m(G4u/<}MN|\{40000 testsjʆEHv(Eg:x{c Myzxɲe]Fw{SK:άYzzx}=o&xXo&}ʭigJO4EdXicGz|40000 testsv{ R&=7[k/3Hu*Agx R+^>QԻ gzqH@+x[..ed'iM~ȭy;w# x&M~)ڭM>8 *bŴpɌ={ nxO nqj IiFG؃'x8O nqj IiFG؃kFg6}%seh'&1hxϸqBo ަҋq3*ll3,xZ -}$M1E|fI_ x btOlb,7AYXϓ /xɲe^FP+W/6:K/V{E + rx JmE4 ұ ܤ̓$wxq̐\t?d3$Ւ =xɲeȍ_;z)K-*̟,$ h|xP̭{6԰;Дǐ)|=.x7 `ud:RQK @xɲez} 粦L^qVA f&& A.! b?j,7Q1gb y Oثvh%▪ j(ax31e­z ܱh|txkh ,2ߋ)q'J}7:Y2m +x{cC̢y%f% I9y%1Ы v x EB+*WQDH4Z3xH&100644 .gitignore}0/Wӓ&=(wk3zz6|I<_kx[2EDK/ KK -$3G2y.xɿo$ͫØ'{;ykr_Uxɲe^Fg0̒NY]qbzƱ3 GzDza{g-|Y6nBXxۢY}AfĜk7˰h2Nc$&ħŧoNa}Ē6ٛ~$7'Bx{yoT_~x{i3 'X%RJs Js K* R@c'sN>.:(.X "DGZA/DVABSVVSAA_K!)U!9(54GQAK2/!O__ɡ. N@HP؄q첓d|u& p8<=t&qرu688لrצyd&/Ν͓/RWW_b5X|zɧx&O^{hrd>VX}x ,d ̽xIu󶔆%_-h5*xkh.rUPQ C^-l6gr:[r]͖='u6{(2BbQrn^rČ]-ː{]l;gz?v#K<c}MF7o-^R$dbL+2O)&k O>ߴ<.~W2yIi@SsLGcMe9D\pܺC_Z#[Bw'3ktHx{Q|xC#i2ZX&P:8:8@:rdlQ\XRZ^ 483=/5E!3,Xa=y1\Ji\*RyP֞-?GfB<"KR&O^6ɋxMuٜhy4: H22Ln?h`13Иͼ)<o̞.a`řSə_Z pB%Eve9) 7eUR0МRo󢒣vxɲe^F2x v/͍~>gT|1^ xkhpID%UԎ dm~$ V_xɲe^Fٱl_lI y?O(SpI(3į1[pˉ~s=\}xkhذ)Ҫ E.D+D!%I/A_oVL?P%5*Tx`&kU/1eɜ?}( >xz4)ٔɛR'q Osb|1J CxQ&100644 .gitignoreF-_,bL&SMakefile3%b=S_z'\I4gxyOF %Alx[ķa{. /lxɲe^FΕRCe5hdsI'ssE \ Lxkh`,?M~#SE&8`u 9%x{aCXQx+srUS4 22K*TS4ct897..  xɲe yޙY-o萙Zr[F 6x7f 6:?fMx_qWdݯFhcxkhI04~ǿ?gr~xdNmx)ӆ`ܷ69Mج89.Lgr> &?W|KlQeC')sNhl%Y6 &5Yj一.> I$1M!u8 1$$uE52Tzxɲe^FCO*VT413 DxSyΌ)_32iْ%82Ҹ2ɴVy;wadT Ij"`XD kZca&6JR &\jc??x= |vo ɗ%Wp=W٤[AP/˜[ak,܇dRu>dB 1%Ql!d(hH.JrݦMܡَ߱n &m1Fw.Pá팎E?ãq78z_%q_:_d7xɲe]F2{}q,ݞ& x0c䏌cM1xQ&100644 .gitignoreJ1~f<& Makefile"|cB =Ҽ)5$7gJxysF l2x[wJX]#mxɲe]F m +7Dq/~4#~ *xQ&100644 .gitignore;hQ/TipMj&# MakefileW00)pRw5m#tI$gxryEF lhx[wwX]"#x EooDhbH~8xQ D"3.Ϫ 100755 16-sim-arch_basic.py=ڦ\X瞡d z6![2x Gպ` ˥Cj<H]x,YzCȓ Eg>/垦==L\x Du %芺 3(@Lx3d95`D_̾G>?[œFwQ3q`ͥreyxɲe^Ɛ?ڼ!MoBIjqI1öέWwIP҅8g@s^c3JwquUx &-5Lxl%9VK<R4JM82Ҹ2ɴFa}Pb [jJ<|!2#| o+| sh.ŷnm*r"(71v< eԱJw^vE^u1uQ:ltSWqG__~=s;4|ǍCW-(y89ey+S]alBg % 3YV*գ O vNsز|j(>X1_ $E_)S]lj*NVT*U# E~۰gc1gOg E,ӳ/j}-jjM -/Q#qhU!-Oƣ!2q= XYCZj'j[Zt9m\ 3,N0y'<UZQ4x@YmBn]Ӎ3ร-mWn Xۤބ7 ҲI%&ꨩtv3}Hlh_3M72ݢQǺFOSpKy xCQ [F=ZVfiEaez+Bb^dQͱ(Q-l^ 6?ƞ6'm_mg GW?eW hxɲe^Fv Wk46XS>Q=3ܡ@x340031QK,L/JeQ{I1쩯ޫ{8BT&fe2 kk|-F{,s& S/ʡ a ~Es[)(JM,-,NN)* nuj^啒U1 )o2$߻HtU qg6\ŭ.f>uYUՆ7EMu-9 )ꎽY}Bl :%rVUe0y!qNݖɡ]bU0Cz/D>]/Q~kuKnr*%lsRgo/`%,w˓^4'73A]ؼu.c* MQQꇾE^,}EaCO'H F)0mx'ώyWh*2dtΪΟ}[[_8,HI`ɂBeP`N؂`.>s~U,yI%}gCzj^|RAАNىfƊ0VlNb ld> J e媰0O)I--+7{+fx9>,κM3hI:>J=(Q;,t#7= y_%p(Qxff],_<)? 'x{!JpC13KHf͓1Ax61ۤ xɲe_F\oO=({>ɂL6_x3M#dU>]̮? |XXHS #pn xQ)]Rfp}t<7h608:œ,j(cU fg?҃{.p(F%x+*':` V;/R}2~ lMx;= b̛ՙ7/K,_ xl%x7oSLTrx@Ց I+2b##%#W%w<&FCba486_64;g tMvM&  #E  ū-0x0*$\MM ^*1NULLg1lxafYk*@79ccMrnv[l߳#Z F! gO2 bk*ZpLaP@]f6@ ;&]T-XIḰvSqQ4Z 0TZ: tH %K~vT?;X~4 R&:RE)+8l" MO椇ULqLa_K(ڜ XZ+yc AIT䢅.UQ-C0**jf%L4h2)e-.+ķvЇmH! e}":Qaie~+eӅ)v3pkZ[Ê)Hl3M7T,& ".P5rpcpd.p.e9Z]cetTy.%,Nݤ_KH>~.ͽMЭ4:UxeB|NG4Q`=qB1k8PMزcd{YP]® 7 :(oՅe4, TB<:2#+" f]&j 5YDn']8NH[Jj~np>V}OcC#c)ՠS;Y/zTo/4QҗO?頕CWW9߹st5OWL:I-=&DE`楹yY-ǻVlOvQ:_nKix(U9J}8M%٨Yt~x|no cBI-uPk#ywNqus\~U\v6*:Ŝ;A;Ր>ȥ=sr"Xl93d8%O1]*8'qx4()Cdb>IW׻c½&TK\w/.,&+jXIo v ʪA\Ki1:Y\;؉IH#9^ kx8Zsf[({cx]/}.싿|4VgcZϿGő]3x ʎ CMƖ8&hxcc$Q.:(1c[YDLj, $x:k4e&Uk/architecture and *klt!͕Yx93 Z:iF+4,ƴZix U  !Gތ(S7Hx ndZُ]ֲH ;x&RJDA/=$3=/({h> EkF_..*X2mV7_nnj`h[XXWPVb7[ˮD0~>oNkfgԴ̜TX.FHYYa+7Ȣ<'&_-:`}}^`=M=n"Oeg~xƲyvF W:xǿwC:3Lfͫ2Nc ϶}r W&w @xɲe]uYEjy0:?c폘R lxɲe]uYEjy0:?c PK)MIer&ԵgI+e ==l1\"Ve)l6l~$aNՔˣß6BsYѭ̭|4A#x+*'Io']ѕ¾ mhx;81̎lsSk2Q5Ɠ+ +xcc.rؤS_sW:nVg߉ً)x aе O].$!-6ɓH /x;)uRjɅbqMf摘n|xɲe^F?|Wmo•L @$!VI\c?RQk䏌Mx hSE= 渙@Hm7xQ&100644 .gitignorengix EŽ(ٹ 5&O MakefileoclXbaFs_l gHx2yDF Mq x v∵IoWa=^H !x/1_bEӲޭ>_u7?-040031Q(-Kf8P^ĕGyD[/,y/"!c}taze|w,4;UT2dXmո$]?nף44x۸qb \%S&OI Hwxɲe]Fߢ%/gZ^=L=)?$xɲe]FNx  1*02 >0ԸI g4 t+x I.D0̐&UH*//x78+G@Pבs-W 8+Ź8֙<S=x (ZF3;^Ҵܴ򁒨,<jx340031QMNMIeй4ݠC0o욡8599?@/!qBO;9K;Wxɲe޹I;'{Egh{?1if)FyF ʢx340031QMNMIeHkSfp(mёO>1gb y N.?okRt_I6ex31ғ( xɲeA\/Ik*_7Df{&u0WƜ&@Sg:Җ;[>5NZ!ξ6 M<':pUG[VZS]Dlۃ~_y=4qd&TCSHrtξ ->re&x)D`C5UL8K*`r7Fɏ} K ~xɲeȻ3M)S_\m]\. d4! +Mal )x,[9q f|ПJRKX-j%|䶟Pb]G//XM[~퟿' 2i?Vx340031QMNMIeй4ݠC0o욡8599?@/qyxy &Ӈn>#p ;4xsQ#F=Țu$= h 3xcc.|C;zz2᜘-tE)].n0Jf&& Efz 9GC4w.|29M" =*_pu^I;|_ʉ|;xC\G/ճ\Q?Y1lܕzlW?Xgd.ȵ\H{VAy7ode.M\gx(:Qt1VĨڗ315v xƴiw⿨T\$x߿k8x(N`o؍@Zxɲe]Fny*◤,+`GFS x>uk6u6RrPh2 zEpn e ,%#xd:ď&&2$perrO6dԞ|QwoF#NDq~rvL@oL:`Z9Ԁ 3kUx{u&fS.Vx;4&6]7 x86 write 31+-2.1`2c150 47kKxu[&fS.xɲe]Fy^+msfO}*]cκ=+ڏ B`FG.K.i.؎Lk2I`Uw{ؗ+IZYW #pq:\J!w*if)?o 4)jJ}uh+J{>jU >7c]ѷՏ] wi߆?7190L ӬmR.~ G[ ۿ~94ab0 fy ÃqOݦZ/D0]i^*džy NFoa_cժATdqp|U"3($K=<䓿<@tuBVrSU 4U3bFdTs e g1dZ٣~ G[ ۿ~94ab0 fy ÃqOݦZ/D0]i^*džy NFoa_cժATdqp|U"3($K=<䓿<@tuBVr^SU 4U3bFdTs100644 MakefileqO,FkC3䵾@100755 regression=iMXN %<9* g|،gdx[4i# lxó,."GxU_zǣ^&6c2ZGE{VsS}40000 srce8U^^Mz:Sőh(l_x{2]eC]y$x6Ĝ 8hɱJZ"xw2FM%;;O?7+ͯX}NUxɲe«ۆV=|f _zx340031QMNMIeй4ݠC0o욡8599?@/A8yt/Sfvߒ\ҫNxsD#MNxxeޜ==Țu$1x +ws вLLH{MxK>l ^"t0ezpg<100755 15-resolver.py^w?+]ʌ↮CUOGkax[ssC.[ xɲe5$͋^<4>3v<# x340031QMNMIe)3eϩ9fOJ:(cb y ɡ;2݋xŊ̝955WvlFx3gT_X:%/x31sASR|^ }x[ľm R9zLc_j' @3x|+ASA)3Da2& .Ym x9(Gp%b[< kHC= ]!?hPx340031QMNMIeй4ݠC0o욡8599?@/a|['?'+bp۲ux;jF9͛TŤ=Ghx7XMFzAC ӓkkt$!Ueu-׌$"x;d^38. *l&b&arch_def_nativemZ|֯ x340031QK,L/JeәvQBjeYQƇׅx !|S2sRLGE|v_7MP59Iũz) [ON6;Qe'[ԟ+`7kk<W)|SvGyDR"v5g x/MJ$x{)D|FͷX'OTȕxl|x V9 KR 64;6WW`fh=nargof`~}L xɲe^F kMn6~pk7v KBIjqI1יqo<`V=xccpIdՄY8WL*V3xϸqB벯zU^eunl xqJ V9 KR 6dd|0=e\ @P\Y\Qi2ԒҢ8FkXyٛY*羇Ksx%a|יMtI݊?Q^2k)x;}{C*3cQr^qeqIjf d̂L)L)Yx | Ŵ7UHL\x#GxCȱl9?=ٟ5YE?e$,v 'x{{fF2IWY VZx9YS&`__'|uO*| Ŵ7UHlKx{rGy惬x%]%0xɲeȻ3M)S_\mwH|_NHmԵ_'n 4sEʿ]τ~<&@Sʰ K&zsG6.&t~y^X꿶uDkqQ2ņ&7 ?8ܵsa!%% 5'ݲo 9 dy*S!)%-Up9eh``fbPZT?YIUkx340031QMNMIe)3eϩ9fOJ:(cb y m:[+"jW:7Vkx31}h"H~:pNԤ Rj&VLFkDW ϯƔ;l͘$nC2{;3-*%R(E[pݠE&uVBoufKK=e%;Pœ:)Hx!Ӭ?Sf/ <x340031QMNMIe)3eϩ9fOJ:(cb y ~u{ʋv9Lx31}h"H~:pNԤ Rj&VLF>kDW ϯƔ;l͘$100644 seccomp_load.3 H: XK pN;CM9czEV:i C2{;3-*%R(E[pݠE&u+2BoufKK=e%;PœY&&t`p :puAEFښ "{Nx6#"8 Sept Rt 4 6k ߳ 9x340031QMNMIeй4ݠC0o욡8599?@/yUuGpoVНpv Rx;ȸrFra6oRgixY65Ĝ 8h100644 api.ca'zE݈Rpرkkl|(ƻcԝ1C >`TUr$A' x340031QK,L/JeәvQBjeYQƇׅx !|S2sRLGE|v_7MP59Iũz) .tܾ97~E%G**+ uq,ZeQ{ֆ]s٥߆++))bhWszVWo/ x;ȸrFra6oRec4:pM.\F?lʘ L&f2N &)2 ,&Kۧ0XNnOe24>prC) !x9(PB"."i;,]<$3<״a3mGգRh@x340031QMNMIeй4ݠC0o욡8599?@//pc% ښx|9*y xQy|1=F E& |L~()yƓ M&1Nkh69ްbrQ<]FI@#ds 'w57N|ր#Sxg%&M&7M+78lb&Cͦͬ܆3Ixcc.e(?& ;:N܆U_l]B cex7֙x.kK=ZKg2xɲe$/fn_ތ{_m/G-&_r4ƇǭRb6uW[ࡵYn'\o|2sJSR::.@IRN+ m#;]L">^mdmú%JU"X-I-.)fܺ4E_-/~Bs>d7e=tDbRہ . LLR3'1I/jeWxcc$|rQjcxsE., o9x{|e I\ 06Af0n/bvXx mGw.CxДW&ʓh|O xE9aK,^QZ3f$'100644 gen_bpf.c@4^VJ%0/xC[x g dp s%hKxcc$*(Wuh#U&1 \xɲe]F]| 3rT>6}䏌ݿ 8x%NlP+C{Xxɲe^FtAR:)(|ww&@PZ\R`4|)sob;疞䏌x:R7 g;pEY-_fG蒏,V-07P\8г;xɲe]F6Eg^_=> vx#GxC#HԊķa%$JY-0S9Yxɲe_F-'>F)E.(ڑa9YIο ,x ј;/~ĥ{` H5x OvPWrc!1C7 g;pEY-_100644 05-long-jumps.tests蒏,V-07P\8Г+[ALtestslP+Co J7gR/|XR^!PSXBH bZaVtPss;쓕 gaa@Zxɲe]F66}=_)n N-x{WDA/=$3=/(STHqݨfJB B~V@d%3\#D嚦EZGMƦ~* xɲe eL [+45EYg?&p.T4,ql&@P\]DΛ}V<"[Z\RTz٦8%ݭVPb-'>F)E.(ڑaih``fbPZT?YI)@(xɲeHɌ{k;ff)FyF Vx9Q)R+N?,"?L ڄxgCRbI{{HbHx9(wSBLN z^<1-מ|5-`h]Gxɲe^FPEiwsѭa3Qsx f#Xk%.Oɉhs!xɲe^Fg?/OS{9ד3RNx V̏pn$mAh ?}x ̘fV78)AY@h.~,x *vCKup&?}chg3xɲeHUY̟7w?dã6j3ax9(z}8d7AIߚ4<.cLy,rF!#rhѽIxɲe^FB9y܁M\#}8"c& Buxɲe^Fc,wzLO>hb 3,x [j~ٛ%!hOx9?m`ݠʑn$/[j~ٛ%!h#gxɲe34!/@)8`Fwއ jpx;ʻqByljCx2eg>x&.REDITSNrꓶ:2خ (ɱn^6x2evFK-c\sMu@Fӌ 2+x7|7UwLoUkX1!(b5.x"JlC6"3ܒ,N~_pC!܍Q FgB Hd>ɮB@es'G + qtGrCf^qIbNN|NfR|Zi^B5H3%v;4h<%#%Xk<"N WgMǠ(Y%SsSqSPQڡ U SsSmUT4R'{,eb@CtTq>H-B"> _M4.MktUW%Ü&Rmbk$z|vs F&&H<:cpw@"~HcNxO|AMB ogBeM]ij}3U;I!$y 3}dpףY<ٿR t;@#>lx{SeAL&ux %lT4@Džr#H'lx;}{CHYo$uWȷ!jr ! yx7t E,6)1Nf6`J˜\mO#atn6͵YRqrU9TjZɎB JήJ JJ\@LW:1mqW FWX&wOVb|'k/edx k,oʎE,݂?Ha6\x;}{CGotg}|Ӆ+zX]]x qML% gϽhW_xWWml, A77k4>L1">d>/'100644 db.h4sLE.{*榷b؈fwu'P4RxuRMkQ%&ij?fA[Mb&AiMRHE,uMLf`:K?0FPwk@.Z.DP܈+]- LJ{sϻ" 9ً wϥ,,a$W,VjzTI`  3܈ Bs ۀI,TҚI$j׍:,HWSf=r"0`ye] ,:وqf8sAqs|^d%|ʏ˕a"+F  К6ҰnA22N8kOAcst 4 a||^[sY{nwxMx7aJ@j0g\2zҨZ0qML% gϽhx340031QMNMIe8vsREyUK{M:r~״N[ fωn,_x kJ }iBEHxw &100644 .gitignore0CIuᛠk!{|_h2&CMakefileV6gK u WbXT100755 regression!7-D aү ߓD/l%xs{C7,.# Cx2eBVilsE_jvslkNϮf&& A. Z/G{}ǢWVyOl7n~<51Tcrg2IK'~mpD{hsq=JJZT&ob E wY/\՜nםWy׳=Ȗ3h+a.>2AKSH\{0bW{ʃr>olA[ZT?'4RS] 5x2eBO7'J/fv_dĐ'|q_Etf՘V^&@SnڶMLL*b?-8Y1TKĢs:5#:C3d>Ls rҥ!5C9 5_ʴqxtEgHL~èJixx.AtLVk.sXDT4C\HsyQV8x{{k,~YjQqf~^|f^Z^n6Wf^rNiJP*9?/-3(M<3$1'(:yɶ쓕YS&LNae4MM"9_S!71XA H$+qO(x340031QMNMIe=~팑/6Z{fC PƉ^Ex;}(nf^rNiJ~r~^ZfziQ^n6WOBRAZ|JfqbqB 'W;)dYx<+.N _M4 ׀`M 6@ 9Ox2e&ѫXչaFӌI  x˴iOvԤļlFyKx5J}Yb(쑀JI،2jXxq<KCx2eal,y e>iS+ֽ-# N^x۬A%"5y&$j, J*J vj )ey99YjAS2l]<&?gUv bJb6 x5M.N$J*FJ@̴Rts2SKRJ2R32tST@feVL҃HVA$+ZBu2sS55LP/ GDr!!` f=yX3rxO5J}Yb(쑀JIzk"j v䅎'yqR82^c ᎕1Q=׫$xͱc_pOSg[< Pbdfə2w1NĬ;%s*x2eCȼ@]㖫}m/hto>6k Zx{Lu8& m^g[ Iyx2eCșb5YVqj:~}m} &x2eCǨ#/\*umrca Vx{zMu)3d ~n> o1r**x:Odl(?Y DobPgO5Wo>+PtxPSU"0ptAk4&Rt並UG@=s Uq5iW& x.($&80r s ڳJ O{͓}}ux[±cdR̼1 0d&M<qImx{}dfY̤"[ꂢԴ̊Z}d5: txN'Я r >I^jb6&xsHKNMQ(NMN-POIU0TH)H-RL*J,/Hjaxyƀ#uxy-F¹|gLgQ {>6 |xGiC83Xb89S3|\TTsS4TT 7rdNt*~f.x340031QK,L/Je +%s_٫Vs<;b6C*OgW`WS;\1ODΉuJ|S2sR|R99UJ}4"', rutue~ả??rK6Oٞ R33JP0=gmtwax340031QMNMIeh/|[$|~νgs?w11<ĕBg(*^R~N>¯x316!ڦ#05|x100644 seccomp_load.3Enf9k+^k>"ezi%$IE(E>XwIMqѓVZX FbVfVxV˦xRacAQfDYˉ&ps{(9rAD&v0&2CY/<2J&29LfaI˄i,eu1O>l˥PZ5Y kqIbI,}X8A ɉy\Y_L-KQH6g1@M% a1qMm 9Ǖ͚(yɑyE&5R%Ey E\\zHam4& (CX vuUp kq5x"z\dcAQfDYˉ&ps{(9rAD&v0&w1CY񬬓_3M6`-LѴVK˄il'\ZTWS^Z2YQ~r>s,T$0Ub atp q fY<HQ&'gQjIiQ.PMi:55W-'e;eTF(JTq‚ˆ pjLcx&CR@/CA8599? >=5o/E T$__ZRP:ل33Pp. g%եɕ¥r(|_́ zs ; 1{0usx]P=KC1ůfQ"\ ;):Z4$RA N(IM_?͔s9Y'Y\wn[%2!~oLpQfv5^z1,̗F`n[Zpmt!{`L{GQs2T/mpS1$CS=`G0۷`Ýpl pq0cfq:3 ]P3J;`I<$QBks~/w}j#A L%;jxBRԈ߿yiLr^ x{orcAQfDEE&ps{(9rA&~p?0*obb &o`bŜ%-ȊML0-c#l`+6m6SQ\qjb׊{M֗,*a $vrr@9W$58RKJtj+?WKdy!AQWq Hx!*3AT(3gFNω sCY=\~\z0ʓ&`bI˄O`6bd. cs>+6` xzq="`׀ ݱmx340031QMNMIeh/|[$|~νgs?w11<<.e 2XrM&x31lx{Ba+8+rxfr| xW0flZ\hixy>sSGxsiX#&@SP~Fp \RcQ4TGkݼxKjL &%% -_oePn>mEW'd4x340031QMNMIexrPA{J=vlC(&1$=?N!gGsz|Cx;ukC( {zj^|RAqf {r P ֯x31"1dCp_IkҔo.J Ĝ̒J7"햴ezf5ia-fx+WM3/NMN-OO͋O*H3| Tx340031QMNMIe=~팑/6Z{fC Snx%uM~WGDzx{eB͝-Ͻ&^ѿ%%xf{b1G]&˰0$m`g|Oh3Lz\6Rt'x: V*3].)ɞK ? wf]df?\"Zx%BvCszj:Y0Ly4"mx*@hR,B9O~=Ӈ#=5/> Mcr"*S1y<x [&}~%H*kfxukYY"}ZxyTFVIF[5F:y%z w)x4 bw]JQ>jRb;v<U#xj|;J~޵[7?1?m?;$Tſ3h`rHVwFF} L+>: R1r&@I!É}I@7:NA<98kL8B@6EpBN:`~fR"]OӠZg/t):PKؕ(l\m8*.mbnUiӷ -x-/$;~dMƺ>a5[:D Í1fvxq O:gRxȺ ~gx϶m3 egx;gC- g[x˱c lgRx;Dz %gxiC1# g[xkͽa7+ Bgmx{2e {Eg x{2e4 \g%xkC>+ mx8uB!data[$i13(_5)S>AB vbx x'_l]àٓH> x5kC1,!"J\{ʤu9dd W. E n(x[[tCp0.H-[x aEr_1ӪƓHZ<x bKj"B lGkk8F0*v<2z.i˼IJԉA_T܈ u$[$TGoȮJFj瓌FJ(vSY'Ƽ]lg@;R;JTFA:N~9݆H jut5zN-'̔}q烄;\Zvdwx (o͓l\i`<` p2nH7pk\|TcuvQY'/ξO-Dxj0zmdRTHh =iTo_)갚XZ tC1`Y b&g$X?:'sv7OL 1&$a eqZ+;5QirCcJW0:*r[V95E)Б_e{~;% Ym3xX ?1vξG_Zx]O +N6u1ͫŪxPI 3}<8O : uQK#Z *&_0dAmemr0^̔ĄniRJqcf 7YvKUg%0Y9޹l8Xb YZY҃s+U3ז<wKe|x1[lUÌYɏe[xxIh !p7m/F 7sm=5ljpnkB >UBywYCI۞jP VN\FGy~JSv)VƈP9.q[.\R:q(JO٬3WicVQ~Po@9" X_RT<@MjEse*ՁJ, hNEsTP<x[$˻QX7)83Y79#13X&e`:9'8u'NGs$cWdl†U-GV$Nqpa?ȕlex[O0Mv iXqjg&^0B޲2'(B~a-@AaH.$J%OzB}~U; 6GLLjU]V,kW`]T^*MPg]N4"?1Vͧ8.DS3*5ڪv'5m<_ ȡmQ!7YzѢ[oMsKn}Ɓ#L!-_MAsCݴVZrkZ`eխ۞oIuQeҰ&Yў:8A]tI0 T6|8a{P9%pF?RIU0Θ3q^'c(+Ii:_ 3Ƈ6Le^HK?&xOK0=]EĮ'aUPs6$deۺ\p7/#ysƌxh@H@#H<>3vtwqrx&s#,MV >ͱTwG˷@{bkt5QNulHrrj,d/hAC_HcuD9N9^fYNJS|vz3)&‚%~CNxŕ]O0Mv]R`L#jKWb 3[ ;==}6AqsY#Fre) "K= Z!&W`t\*v>,]Q:T`}tT5dZݥZ"UMXT$:=!UK1ީZ[Sۼvo-+T%KzIMK3YIaUJJj/0+>P էnP-&\zYU@ φ6߿jyhbiBl/x4/^j'3lU\yNjˣnf?oprXmh]+ֲ3n)__\Y%XsqN6P d rb\)\iE EF y ũ*ȣJåxѤLRRp.EyW)2K&z:n~x7YE‚#x;ߎgf[imV {/W!/Msӓk4Ox[#Dd4KZ+pqnry*wb`~Qn{&pxN%"W`-b; \ echo " LD $$name ($$1% PREFIXj$  ,x340031QK,L/Je}ZK1V߂y~Xq/ؕWľQ<$sdԴ̜TWCM+MLO~9'TM+O? gN*ⱛz眸_Y@榦 yi@(dSy''W}{ =OL @!%?!ܔ~\?ֻH)D63/94%BǢk+.If(ycЛOy9f-PUE Eag9mZ?|;E-|/C,+.Jf0׺yBbR_=-{M %%  ]~pUs8)f`RƓ~'-:EꄲԢ̼|R';̻~aY6e xbP^x[rAqCg7Xrt&㗜̦=ٗ|F 1\vv zeEřyyizٛ9j BxL&100644 .gitignore`iuPL?Ћ(&3]U`<0>a@_m3у՛Gn@ qâx340031QMNMIep.9qU 21<-{ے}w/ Wk]x;e.px31//t1c!D_+)}'x~IF:P%٩i9 'bKY|%C:2S~D"yΉTanj^ tWg 9p//d9BR\u2~lJ6 @d3sJSRԞ8MAoΜQ++.IfJk[8|jJrAּQ|%kDESfeE &:? [I#[Z &'ْb݉EWOk9^30\~)qIU?ۓ"uBYjQqf~^|f^Z>!6?ҭh>-Veut?x340031QMNMIeHK45RMe۩޻ 71<I:X)\Py)Hf|aG px;us3,EA Ey l$ SOx340031QMNMIeё!1ųV3:3)NMN-`X8ڋ9\R7twzE|akpx[} G~x;+a.+Sje 6N&f͑j  x6 Jեna JJx5k5._G M̤XWcxW".Ի.H ~U4ߊV?K佊p]byY40000 testsYH#CX|Z5]ׄ5}K&x340031QMNMIeё!1ųV3:3)NMN-`G|fqIۣ7~ߺ~\x>a5̺~~~:X5l 1x{eBȗcL{.}KZgܧN Gμm;T1440031QHI`PN3y2Q`݉owٺ*T0EOW#^ju^}ݓ::=xff}76qwA ex[q) ?d6Sg( řkXRRWZT``9R3sO_@lU\0!נ LnU1&d z *H8۸U#%t4yx{sqI 1oVdܭl9E x;Le |by%F% yyi9EEx6q3M(:y時::Fx[ҧorf]-,mx;iF y}C=}|&yo&a x5kC-q4^o5%?{D> Zx[{{mXt &aUȝ,6 z$xW )_B6i; zU4hkM+80l340000 testsw3kh҄ 9}K@%x340031QMNMIeё!1ųV3:3)NMN-`X"̕Tc&ͪw>6P pxnްyzfzx?x?NN}--ԼĤTԒ̼t?x? ϰ`-}.`g߀x7ǐxnנ s~897G100644 db.h_]ڌ o%s‹\f'zx }h(f*/#L;O Px[ǻ6l~: 0M~ Nd E$`g';3NvdӘf C;xW )_B6i; zU4hkM+80l340000 testsQN!6Th@%}K##_x5kC-&IG 2$NM 2x[sC x6X'gbY```592 Ex;|yC&c~S{K9?ZFoQx340031QK,L/Je0u-}8{A"ךFU99z ;4oUs)[Xy-JRK(9)tg˶p3ߣH7)83hކNQaןMdK`tUdʉ|ww4MH+{SZݝ+pDnWK 8CL1>N AΝJ/D4d椖 إkR ]YܪRR=&bӦܲ6?2K*-Y^ҧw_,[,,܃U)L^GNP?'6+0f%`woY'|%iO$n1sqSk;3y} q;z0)II@d楃X?4NflU?3lg4XW'SnAQf~QfI% Jn;S8;! bۊxuj>pg h/.Z{~?5[R4WC!]2l&p.0zaAv̜NChBO-*/aZ±zk%|rr8CL7>> ` R=]0 ܩXNgʫOjg/4&1Ckbf3Ι:Tobvj00j<TBŰBõ SNIaQ) рrIH͓LXjA˓ fX(L0^R$Y{ qh{l Z3o=B0Y)Cf#WGK3Cwˋn&"n5O2Eh*Ϻ]-*eL(eg1є혒-G:V?[}( v^ M" Mh4A A#<[菌މpdCR A{lE6ϯi DXQ6~1fˈ 7˿rJaEUg]WþԪ֭b%eՙ% [ D (Pf$NHϐn1$8a s U蒥uHtA_.UUE' BGpS^k'Njl)|'h;;F/moʕY%&7U5v4KSa[cv}P@7BSqE<ʐ 8GrĆ(o}0$}jF g{Omg2 d61arS꺖r<,?&}Lׅ[+?ZS|ɶs.z->[h_9ÂRG$Yx.Rp#̦ʙy9) J%9zJ3J8A4k..΢d[ԒĢd YT RTh3MaZV{ҜĔԊɁlRL1<ƟhA5PG!8/_Sj j\u4s SKJsK4B}|0tiL.>y?.6Ա p#9dDv)WjZ*' |."A]'`78< 񉩀 x[)8Qpdɜ̤ĢJbTĢTk2K&ސ3TOS(HUp UI-.N->9ј_!D!3?4m\Fc1_ gGG'OϐH"3FmnęAL.lpɝL"\P2'`R|)٠`2#{YlړjASغA͌+7DFDx(P`CDqIQirBiIfN|~AIf~^.\̬blǢ^` QSZ_ZRPZRiřQ<9 Cx[7off΢ԒҢ<ɻ͐x?{},HsYw#ؼx=5/(rejNq*6iɨ'3 S^X2IA-\?xsg#DqIQirBiIfN|~AIf~^.blecR/JV(J)I-/-)(-P)ѴLS(JfD,xvHuw&⒔$ ;.̼ҔTXL^"SF0MfAt]B(q vP yBqjrr~nA|zj^Pht4k.̼ɽJ*@MHFQ&'gQjIiQP5'Pf/YX'w a&2U I$R\'fU`7400Q0EMjrT:k@d[܂ԼxFphH?g9ũ%*YbLyQjNjbq8$\z=uxǷw&nE\%E% %9%y @xr y5 &d[̜ԢҒ 5M9i Eɓ߰#=x{.pV`C3{f^BRA6f% iřQ``YZRZPlY<,JVndEvY'7Xa&L`!11h(.9N˒lSs S!.!n>~ ߤbS\xr!]0E9ũ rh Cx;+!;df⒢Ғ̜b ]<9Y¬Ǣ^` QSZ_ZRPZRiřQDfGFV+qQ ij@f]iN]Qs2G$^(;K|+}bWA (R<xN]LeUp!1 IQl {񱀔flbBVk~6'&7֕@(cP3a100644 util.hWYn7"Yeˆ0;ђx[cw\̉y% Ii0+iMk.4dM.N΢ԒҢ~ RsS).HKT qp}T[aRsRS5@jrGdx.Nh z}-.-GTTCԢTTĜrd (51EG($UG!"DG!1/E$83((,"9dJ~^N%(^<⒔L2VT5` jKK*Ԣ͗0MZ2GSGpMc` N>é"2MXiZx{'4dɜ̤ĢJbTĢTk2K&ސ3TOS(HUp UI-.N->9ј_!D!3?4m\Fc1_ gGG'OϐH"3FmnęAL.lpɝL"\P2'`R|dFEA̼ҔTҒ ,jy% E\ FRA5gQHQ|zjI~AFbQz,QP*OS*ǡ09͞4'5>1%%>"1dl ξIMT,]ewp)aMx1ia qxwodɜ̤ĢJbTĢTk2K&ސ3TOS(HUp UI-.N->9ј_!D!3?4m\Fc1_ gGG'OϐH"3FmnęAL.lpɝL"\P2'`R|E`s<Fk+=swx*w!|>4̼ĒbԒ"h~BAZBqF~iNBRBzj^jPYBPNe dy<=ԒҢbԢ|<.ɵ,ʙy% Z@S58Ad[k..N0=ٕ5Ȟ|ULcMU`həT ƙX^n|-hzd_@uGWxqmd;f ̼4Mk..Լ4. cx;|yC&HG sg޹?IwRɵxuB:t'0M¨=d'&Kdr1'̺XMx ivZ&aԓx}Kklxzu  0Dx7{`Gn@_Oz @gU;94킃[GG_]kǐ[x340031QMNMIeё!1ųV3:3)NMN-`R1k}oets wxnڰyzf,:h)xWWÚe@5k4i}E߂L|؟100644 db.hrx=:.y Rif|)A(xffC7\k9Njx{sq r \ s$%%g(*(kG9U^7w+dܭl9E6x[rQyA"u~290x Iz*(qNRysٓ]kG Sx{eY եy6ȗ LL 2vȄ<q8z9ֺ[l` 3t3-̀װ2IG%'-_c3j]7,1Q$ %+;ۭ$W*e~OO͋O*H>EOW#^ju^}ݓl [wV76p?Lcs7"4`ql8xf;zfGPax#vRdfgfIvԼ4.=ZrxW~t=N!`\|_U4*]O 40000 testscV|F["}nX|Z'8}K '_x340031QMNMIeё!1ųV3:3)NMN-`VґUn?uv{ 7yx>ys.fTq=U jx{eB41L'x4Ӟ} ?*Tv_C,Tɹ^\)i%y-b|Qfc2Cx۱iF <\Z i9%E %y Z\y%F% )in<y\HU|[$];$]%4x{alCWJjZ|brIf~G"&,Makefilek[Tov~\W70 D!_fKxd:8<tl x;ʽ{C:wF &8x;|y'͟J&_!% P(I-.)f4]!SMGťOX>Dx{eBtqmZs=MkqV\ޘ/ x`|F͛4ES򭹸8RKJ j 1x <ㅽ*/X]t~o4x[!\vC.0^sx."qx;|y'IW ʝR77ὓc߳q Cx{eBtqmZs=MkqV\瞘} ?*T׳* ʝ_pur7@W+]aoeb'2(A7xXkl֮cc_1k{v)`l M 0ݝxvf1l*Rq 9<( UM>TUJJQ ̮hTQ-{s{|p+ijXDIHjȘ5wݤH+"ՈĠZT'jLSMTR(wt{G{!"7ȁt8\u{lx`_gd70$l*g?g9\q-l&$?pnpgNٳNR9.RM$0%­Vf[VYgm pdbGN昡.Қ|'g UVu*1IJ$a=q05 v D7`I9HC0⌰vZ uqI18:gMt?;Q@ʒw Z.y{qg]z"} q t䊵?s8X5ɪŨ"LI\7áls K Nu/-W8ǜKcZv\_M)?kFujxp#>u!/1o'(BqeUȔ84Ͳ5j5p,bތC/%0s'&5o/iN Y(BLj"W9^ѸXs/zI{ b볺A{K-*R Tn,jd2 & e}m XQ>{IEYCXdW7x6u#VS7*0@.^֣aB$5]lW\I9XW;mN)$ [U+Du^%'jjB+iBeJYB2)2f0T ud% sF6$QCu=_2)smᮻyV9\%hUz mGo-ЦgЦ%jd՗1HfrV@OhN |+DK JARČdDХQސؕ1dR^|TQAFEBf8a&1Ə3l^guQH a6Q[(4V ~ 4|#BG2Iy:visvO!L$0] VW^i {,TJ 7]%\gAS!n 4M. I_p9$4i@Fjo5_Մ_R3Oo a#nN,iρuY`] ׌@zkpV&s\8i#z*,`q.2hf8{f-̾PBfo;eNl߰e-MQ uk1m]LkMzc:"v%\bf]S7 2{ `>ٖV.LgZ w*w{SnoGR$%X¨K!x' "t[B0ħH\P^L-`iRO^9n|tLTXZ sM9&_BFFh+U^;Qߣ^J2>}TSv0 *ŠHȭByFF;ˤN7\Pg?9 N5 = TaH!>.pUPUH{CšWdv|ޝtXTj҆RPL:t 3 TTl.׋6K/I5UoI킞}pl!kG^j8}^*K[|l\c/04) +p>f٫(.*V`J U躰։>6}\҆!UbgVcJΤ̅ F`@occ}=&+4d'uۑ3d5bЌK>b g9 d!DEhy\zS &o7(F`xV[LW,A@n H.,@D)NgggwGvg֙Y/T4QRSmlҘT3}k_ڤ M>4m십ii+9+"Marf/O ~i訳QT$18=Xe^EA5 EL)#E2T ^/4\ҎL1h "Ns98] )3M!+2!F9+ꭍLcILZl[dQ&)Ʋ?!xo0tUHv7iZ1٧|'aaoϒep3s^MPy*G8y>5M ! _PeXN$a9^v'8ּD^] j <bϪ}NQ\y/Օ%/}kTK j`zƧၒAp nyv8bs"ɥaR\mS05Vo R)/b/ UwxAƋ^cng/r8^^d$cK7,(%1}(ZAQYO$Lۺ]Uehmp\O>KeK|4Cؙ  ]'G~\۟)6;ㆌxYoѕy`qhNTRe<<־g+Sp@R|"7DjŸ3ZYpt fpo W.:Wg3gt 3tj['l+͔;g<O LqhscC;ì̆~$Jn qj#%sOok=y8I'x;7\0FY emi"׳rhY]5ԔڶTnL,M/Um73xiz &K3gO,JPڼy)Y\L Դ_yxJ3JKyy+s2KZB%y y%E`BA"PT řE) !.ɁSD0*$|̲Te\ Z I9ٓL*;:lxUFɍn‚: p@l|NRlz7vF'LԴ,J-)-ʛ|WiLS&Mv i]/)'[V!>=5/> -bFqIbI=: y)vP #6Wdfq r &˄% l`-k#jL=9As 6(l\(XY`krg|g(O xc}QYXN/9=މqrZpd- ,dԬqt@P[@ْ?Mݼ߬*Q,xW{l[g,ys&_[ՋMڴzII6%+Dp{}}m^>f]fCxM@` GZ"R,;ꭚ|炪4Dc)&KL=m] 9bXl0++3K6&l!:"MS66Mls¢HK{t2qnv1%ߑN6=>\|&?595 bXa ԚWstcL/<ը0W{I~sŴ<|vwޮ 3-Ö,&J`Z%YG O m\,+^'̏'nutkҔ%Ih06 ?kik+|n?GQ pD7wF[+_YEYoR zؾ685 $FXHU:(@"^NqÑv|~1oU|o+:IOvgC-_7}.BYከMN iU k~ӿotfW2yi},IE̽(X|(HwnȼSvAU$pRեg<)( hW= ~cW- AVsp4 ٲ ]yr@1iUa_c[X4D|q*WE/ʉ6&j)h(v.~t{C?`=kn0&崠Ȕ3%uE+tqF'9$+Equha?Ւ#XIaRa-VHu?+L.,all" H-jhABbJ*h+Rb !>sЎ+4V .gGN_?jϧZT#6KtW99?='[8[RuZoRp{SH7/qφ3-~=?b"Uy`E⌯ UV?Y^97/v?51#e;_0tۼL qЊN 9rp5.ݫL(cEhH)BdZ,]gCHX^ecK2FRʋהW | -ݓK\TFaRG̠-*}~h v_[3&ӻeeAQkeʣʉ3(ph\L^X0? 9Kmeر jȤi*Y+[dz]+g~`Lf Ao%S)ǂGsQTTv%̤:(f_W C+kJ(w7k|KM;9]ꄿs>" 3qr9^G"F"^;yMgEқbH,_ OVM,zGߐh0$`s%]p8?zf=N^{}?ia\bFU8o;k <|G-^6>0F[m~q奧v`'QQuVL[wf߂ 7F'~}os'wD|z|WW'W ?;vѐ &)t0elRtSJ:-8?18/ ƟGѧþIO:erzw()ff#UL ZzN x340031QK,L/JeheҀE>//t1c!D_+HvwLqPU⛘Ps˿) =&KH( rutue~ảHpPU1 ( +c\š+?lNBsԔT2CFd׉RR;nK}%"W>uC>RF[l3qj^QaLrvm;$K`]QbArl;ifR?| w}ea!B@7uz lI.gWY(ado!"l%JݪgW-RKze4ĠL0)G9*&*yx#v=a;µ(+RFn$ߪ5@AeZ5Ȋ1j|ddq}wྈCSU [1g8]vfLpf5|^=;OyG 4ux$C{\_ԔR٬y.zT:Map-t`JN1pe*ICĴyU{ۮ0 GL շR*p#z*+0! _xBzZ<:/b!c+nJ @pLq ݎE3}/Ͻl _ $o zƦ(0ƴ {*RDeXw`ir<(W#)#լZ0T=5yH7]:w=ϱ E (lGHU}PIse41~˱ Y °Us~9FF&hoRnGZ``6PvWI=?Ѫ̝\9"kL ƪ)(8;ʷeӌdQ6BB| `(bYDۍ4ȯ}XjU9OƮ;pe k.ꥊm4tl\E.\ƈ:&@", keJ6GEtD`LѿSorexP!)* t8qX<Kj@l(>˽WQuuJR riKC;QaĦȄ~G$8Յ wsJ/]MIFﮏuR#>/ïHD 0_l$]>~ͭOg]Nlw [Sп1uVφ7I$F [ ͡of_S착I+hsfuqѰۡ 4Buv|Vk['nd} .2 Ig%l[gaw.]A5/ ~Ne\n~v\+.f?ygOn +-qgR6sk%[zE6[(sE r?| Ȼyuns+s BŃi-ćC\#ɇ%~X$ɭu@GU]W:&7 R~e)gW&V [KzS$3,ޛ]Q*ːg! /&k Ҫ\^-Rp(l~y'Cq溟[y _2, ;?_Ηhcq}~)V-#S~r~uew^])"djYf%pa耶ͨ,xuj2>׭xeQy u/l5kNbd~ 3ddiȦE%*G;R塻Unչ%.oi2$kZfƣ!uq[ +dlpАsEBA~!N>! E0jef(%(&d&+d&N6fr\ä 5^OAsz&uFטv*9B 9x[r[vbɂ\bTĢT{X2K&>VOS(HUp ;TFc>¤pАEBA~!N>! E2je`x09MȤ 5KOAs&uFͯ60m~ź܂9x340031QMNMIe4Ny oQ|ncb y t~{RL1RzIW{ x¹sBdAQ~zQbBfBZQjBq~ZIybQj\ % y)E % %E i eEřy F H/t23c ;Ըь|@I% !!0|]=B<}04? $x!I,Kfxض=dNP`LtSPilaT(n[+)'Pwmg tt, 1Qp: x3¹ >[f$ʭ3 z4޼oB?{*fdѓ?Z']wCVvyJ=k% ,ܽ{TEJC9o}/ڲ@#T}px5O(?(1W!X!(5U8?<(jr5].eҼ"TԢb4Ԣ<#$:1jhFc>pАsEBA~!N>! E0jef(%(&d&+d&N6fr\ä 5^OAsz&uFטγx:m^l䯩4=QI l`x0y*F/5 x{g~|BdAQ~zQbBfBZQjBq~ZIybQjl\ Z %r+)d*Nb ahRTZ2y.H5/3$R!h3FmvLΓ)(xNʤΨ$2 \x;&Qb,ɂ\bTĢTظ2K&ޗVOS(HUp ,69ј*D!3?4dZFc1k_gHB~o )1ݙ'Od9(:7LQz2}x[c,ɂ\bTĢTظ2K&ޗVOS(HUp ,69ј*D!3?4dZFc1k_gHB~o )1ݙ'Od9(:7LCSR2R2-ҊSK4*4995,4L&\8Cc96IR[x±crf^rNiJRqeqIjd fk$ u Tx1adAQ~zQbBfBZQjBq~ZIybQĭjl\ Z %r+)d*Nch:9ј2D!3?4dzFc1k_gHB~ )QL.&e98:wL &ofPVШj";Y%]95/%3 '<HxkxξYD93/94%UA$5W/Ckfɾ9E72/e>wxfS}*ɂ\bTĢTظ2K&VOS(HUp 6ј*D!3?4d^Fc1k_gHB~d6&mvLΓ2iqCSP|IQ&ɞf2[n~42\̓sKd['秥ky֓?nV3d';y! bXOfVϛ,/):ف_{dw)ɳ&HM>o 2Yd&5 63Jne{c"x۩>AyC?rf^rNiJRqeqIj^@n˘ON^ͭ,!f&H}wx-O@j@@䍃5ʀa & )!pK^ӻjWWW\\];a>FID|07Dx+ӟ yMq)N>;SFuUo c=G}u;o]4Sogs ףLYͦz5R;lmk^²FTX{&O1VX:-@h 5 <dS ̣!Lx R,&stޘY kGLc ORV Y Rz:t=xkͿæ8599?`srJjZf^cHocFqrnA|JbIin|fL|\x[q~ % Ӌs2ҊRSJR&RRR,Q(KI-R(HU(I--VOS(K-*S0q@2~CءMNb4iO*-Q  X $_4-H h{j^jQbB@iRNfOfrj^qd[&LZP<'aRgITj_ \)s$%%g(*(k.NPJjZ|br PvsG 48V\f xxTqDɂ\bTĢT2KJRRJ2RJRrR3@_dvvyAړJK=Cጓ|/O*ώij7xx/߀x`ĒT]Դ M+.NPɪA$kWPZ`c M]^jE Lx Wϴr7 _c<9)x< Q`"'ԁ83eOΉݜ͸9Kt6?Hbڜc #86.xkyA=(9C/Ci,BoX9'W:sSR&fu k5x{uk d-V;xx;ucrf^rNiJRqeqIj^dK,+ًRsRS'K0x{avlBɂ\bTĢT2KJRRJ2RJRrR3@_dqvyAړJK=Chfmm JT309yY ?mcVU[/(C5&fcX1xվ}<ߜrw'O,)F%ДJ"ovs,K{e edݶr#mJ]R} fxTo8LYV UՏVcaDAzUEIb]#ہC7Pnwo7o\\xp+jWTD#Xn,Zm5>A8j,4&\v{ 2 WN)<ɘm# e͔Â9Ȏu\0,2՜Q=0pT%Lf cJAX`2( ;H<+e5،c/zg@%>hr5aQFрKÁ)(h2l3:1 ZXaf}2^u& T{Ryy}@0Z3jXp2KX/ը 8$:[&r#Auys<=jcq"a[&_Dq>yY[;ʲW$sӮ飐q^&ZKnB[nUaƌMrRK'PWŽ ٠؇8c.pZ7^X)\CwKjL& TP809i}#_G6Xq}˜gBisD羞QSmT6/ֿf܋qUٹ!IcSwsXhD \_CפHs18qj1f8}-K)!LYܖZBk4Liÿdx;JTѢQ/ r"O[њh*d橻n:TCBmwM0 7t:LҁEM.~Nr*Ofɩyũ\&w1iqCmSP𜼏IQSrf<9 |xOKA):yz1)IHfݗmu]wKѩs̡O }>N3[0s=?ͷz͆tq ,Eq1Rģ(.c|M19>2=G`.pHn聐Ne"Bb$l2]hb)f OdJBhn B=ȀOKfʝ h˶L&-۶6QHV\SXw~ ɆH:9pT\iW 4m}ˡ9yYoUUgV}Bŵ. <} ݟsx[)G` +AdFɳش'?`Ղ=&u؛W07 nxwo#+Ax6[ pxgBdAQ~zQbBfBZQjBq~ZIybQĩjl\ Z %r+)d*Nch:ٗј2D!3?4dr?H5/3$R!h Fmv( &LR{F)(xN^ΤΨSFqrnA|JbIin|_fCVWF:=xg$+Ad6;*Lr 2x;Vudɂ\bTĢTkظ2K&ސVOS(HUp 69ј*D!3?4d2Fc1k_gHB~r )1 yE9 I9 >ɩyũ\&w1iqCmSP𜼏IQS<:f [x7adAQ~zQbBfBZQjBq~ZIybQ5jl\ Z %or+)d*Nd ajhRTZ2yH5/3$R!h{Fm9ԼԢҤdԼL.6)(xNǤΨ)% b9A vx7adAQ~zQbBfBZQjBq~ZIybQ5jl\ Z %or+)d*Nd ajhRTZ2yH5/3$R!h{Fm9ԼԢҤdԼL.6)(xNǤΨ)% b9A3Jx[(?IvBdAQ~zQbBfBZQjBq~ZIybQjl\ Z %r+)d*N59ј(D!3?4d,Fc1k_gHB~nj ))M'1iqCMSP𜼉IQMɉ̲cXy'L^9ɍrk9Dm 489RKJs%j=}|4Ri !eT5'kMNd1|EOYcO,2X&׳*JEl5$1lj6^|Mi'`S|=nGwWqo~dr@iɂ܁ӹ#jL ?aZJL“+ rBqjrr~nA|zj^|AZVI[([#8n>~X?#?Vw$d A*o`Us x;+C`dɂ\bTĢTkظ2K&ސVOS(HUp 69ј*D!3?4d2Fc1k_gHB~r )1 yE9 I9 >ɩyũ\&w1iqCmSP𜼏IQS V-9 \x;ʽ{BdAQ~zQbBfBZQjBq~ZIybQj\ % y)E % %E i eEřy F H/t23c ;Ըь|@I% !!0|]=B<}Ψ=f%>4cxűmDɂ\bTĢT2KJRRJ2RJRrR3@_dvvyAړJK=Cɩyũ \&W3iqCmSP𜼞ICNSk;`Ҽ̼Ģt[v7-aD2%!3< v,Y #u+.NNNL; q)QcCH8>%$Q(Sm;).{%&n() ъ73xe9bfk ɋ]'0 Kusd3q kxTnH}_QX '٧MrA("e 3)3rwU>T| \S3v`1sPe>GUm^r,3Ќ[ptpxL8- )0ɘƲ85Tg6;qb}(J%g@B-S` a)-Lkn$ tI0eE L`Pd As)-\Qb941F``J37]V\I~Hc\T,v;ES&ʅ/' r9H(sND1a.7t"w=7awx 8? /Ct"iU`a<׵'&fy#u&F>'^ bW0X.ŬRHo%$b4A̘8 Ew&lWY:~tmjE욧=o,B$Xf ~xg|?8vwIJx 'Xd<. Caiƙr6nƔ?gaEЙ BV0wHsC`\bEtxi%%EQ{4, ˭ ֘w,ל H5Uv|Cx}}WZlF31xNVHVKMu*2dn|ScUDV)S8=&6B:xJ60&!-#T^A]G_趫Ϭ=3yoΟ/N7v*s[tm;`5'&TN ^atҪJnhRAžn{ܪhbqdT Dm}h;JV Qm>7^m sw5,V|r!6f:YmRqxS+2FBmF mXV=L1~40000 srclh|qto+E55"ro;]WV~OHV5"%x!//t1c!D_+HvwLqPU⛘P{f-n< ,TM+O? gN*ⱛz眸_Y@榦 yi@D,WaD͇q+BJ~2ct7l5%vm y9) $ |W]RMkQ32Ksrr6>b͚g ݸԏ.rA69]!wb0[:eE Is_Ҵogl/~ْbkMz]Lg3t[$=Btm-ӌJN(K-*ϋKge&gz /9H겺,x%Yd_ٌ͢ *Eɩ zeEřyyi  **Y^q))(Lp (VM6 {:(M&9]? )wx340031QMNMIeNdmp޲knB+[V5ũz '~'+]2M9Irx;~}7d5fI=6Cdx{eOݒةLMZx^Lc xj5j=?~L.bsRx[½{difI⛍ 3d x6iTY]tϑJxSRV(K-*ϋKWЅq@ܢR(NMN-PL*J,R-JIM,N s rqu v5B.0i,x;|y6߰܏1-|B vo?x*+As}&)rxNYW_g%Ýmt`?p_+/nZ77V|msp\/m+E'EX?#l%x,ZdC?w'Kxx340031Q(NMN-`x8?%M]ip $x;|yC'Hے vs=c%}D)g%s5 xddD Q9ٹF+>qG x340031QK,L/Jef})O"xD*U>ή~ # t-'3-!B!TobvjZfN*+ ABuL)P5A. ?/9GnGs~eU*$e]9CCT_mE7Jƭhb ) {+<+DoDZe;\"Sʐ= ]#ͻ% uFnbrQ~^n6g沔uܑr_>2a&1E %ꪍ a՝^p<"[Z\RpmB/|vv =Pb%{JRKP'gg3LҲT3w]y { Ϝ dxIOx}TMoQ a[Sc+#BvJGPk0Iyo@;y[n4+{c ߠusϽy|⻷'nbbkKwx.m08-&[D-x~T>ϓ}I^fbyX)" TĂX~6?<+,8 ,uCW"&9zꍅq~$wUmKӛm1lj\ +VakEi6rNj;b%H]F!#$ .4_"a*x$ض7zΗaʾ N  Xec}8[b)tcļKq-ln1̿>#.H?#m"'BM4; h~o,L_;o7t̲5v9 UxRvecANcz+pkvMc8It8R t n BťCZe#s;a:zeV@fL i/nPŢT+ !+ G0ln2@8M\O\CR v ,vU]lAHu{\Z%oCtTGi6-;  wm#LR,nYYD'$]>bN`d}3H )gp-f ;E4 ]&{vx31<I:X)\Py)Hf|a ^x5Ja?-(MeJ"LH+1Fff4hSZU:]Բ @O9o?z^6찖*,SoZ&v %e`w)ؔ* )42!Ju\|1\ lhȵr^7.LGrRdEp9sxχ|$Ĥ hiE+\+-DD=@z܆ՙ锖ƀt3/-r,sMe XZ&?b1MlxD ̜K{} ej2x3@xcwM[{_ dx31K M=)Uo'72;W9x31ܳ[5N2sx;0x9xC>+Oi^qfz^jBf^V i 9x_include sk0az4t^ +/4$$Ü.3S zX40000 testse%ʎ-ҨQư"fMN8siEh2lg?pT_kRrSVrx@e$%'aSgrχLcbAVRЧGI4?f3WjF>\KW4Gl)}4_efG$ Cxi~tCpXfFrFbf^tbQz|^in^~B|o@<z)pqrr*b;Ŏ ՓEM& +)gV*$(dE`` ay||< 3-}SE6we2x0¿&4( 2YF3arch, 977:N#U<"n?x[q. S76oU2\cx;Y~%ɯo8Ykr6@]~F%5[fHLbr_x]?KPibRAJ h) Ӽb ~]ޮTɢG\LGo{=3zɎhgk̲ z&1p*0bR+xF #̏KdL~k꭪$B&O=O YX-lVRQy(m^ )kZ]UÉ&Tu RrN <a3C׺.*`$|\٢O5=a7Mx¸a U6#PWnbkfYDgnyV$\&kbzM?K,=blx;kt L'<$ {xf&100644 .gitignorefn BZ_&2,[/'ЪTԑ׻φ1,v@z nőCW0R}E x}SMakefileUq}9=tCw?HoDCJHfxd8a7bx[Žy4$fŒcYL=xkdnd(b{_90A*PgE%e#5 AxddDwНb/g?!թGlwxebC/y%c+x EaҞ\a͗ɓY( qxddP/Һ|Պe{ξWO,4qrFlxeql4)8$LpxW7 'pPjRB?3/4dӷ Kц40000 testsGl_` 3=}9HT:'x340031Q(NMN-`peP3Ckgn5# x͐JP I14UX-+JJDAqI洉$%7E:8:78 tq*N>i} 8𝗓çL4 B \3/F@ cφK;k&y׍ ,z"BJ6}idXڦw зvFe^^d>*5eNR aפ;2_**D&` ~ фA{frsS`X؎} "rDjY4l\AdAC8x*(Dre(u]N :w8ţGť2 ug*pdXtk,O`h|vӨ_x;cM,UƓ2Ncd ZF \x{eBHwG:E=jسo!ZxeJA C؍L/C^lJ&Ȳt bvg!ѐ)6CG!!Uֆs9|#?=G&b.C\۴pG.=æfACoK D\~~׵%So- ~b2.{x`t5fa̼ҔT\ ͙,al!: PF\Mxkbmb-rE5{(z6^s=j &Η.7˩m2O9o/D(Zg~fZGN\%YRaގODlV[]xnqiRIQjnrFjrv^2CWt`,]v~m:LnqeqrbNnAQf~QfI% Դ(Dϓկ-]4!ŒPM1J\_f)ݧ327-.O,9f2nxkʷ"Bo@<9!.~'c@lɮ `JL~*=ٝ]7Ǧ x[)xR`cfɯY$u8@ u}AUG/!kT&>sYl`X/;9Ik O67k22+.xsgCBo@<(LVfӝ]M/gHkVɆl򓯱vkJx;zWydɂ\bTĢTkظ2K&ސVOS(HUp 69ј*D!3?4d2Fc1k_gHB~r )1 yE9 I9 >ɩyũ\&w1iqCmSP𜼏IQS-: ξ `  @`&i3"K06F!rLGP+&f"U3BMYM^;&#͇πd͠AW/{!=ٝϐ4+ai lz9ɵG(,t=xL wx-@-<Hڢ+c '3Juz x?A>5ljT4G)M]h6px˻!@G!7 ]u B}t8@ $ C}&o`љ4:+0Px˻@G!7 ]u B}t8@ $ C}&7Me5'E3H~/Fx${Ffn6A`g߀xv Q0|Em>86dz3c(00'iO BSV34'a7m;Nvo~8Fhm̈VF'rOfڜ̣6TxR*j2x"G\E+JCvKlq0=sA2i) Ib ONvvu~WU#sM(5WAQ)h ZFz,Q 0mq;L9/4x{6t8&|x 1 )K J`u= |':5zxkdnd(aN󙓮U .9(띜ɨ5 i+xddD$7xc.ؾȪ5qG lxaxCrf;YN l^'+ cxkdnd(p/@Eɨ lx340031QK,L/JeP: (fYb'[plο݆U٩i9 ?]gy*dVAؿ%/_:UT ;.9]vwxjjPYXpAl*տ̧XuI]q&HA}eǗ|xW%PBqeq|f^qAjrI~ß;_oaWj@rkŶOARXZSZpbyslTߟ'$j & xeMkQi~l(4ImRgB( 6$-iJ\3pğrׂr/n3\(ksT=sއ|-|}cs"pꉩۏw*y(/ \d FYȁz0A}lvM}NkS>ѬK(om͚UNewZ2[[*Ԫo[5^|!VUik2<a/{Ҝ`Vn[D ҸcQӖ(Ac-1a(:a_my;lE p!WTLio;xi:ut6DUCGv<D1J"%XK:ɽ &e8ВpaX4v{Ld0t ˠa~;C{*^gV@8ϦZ2d Anu9w7޽Y!Oy{"礄\"ګz0<~2{Tڅҙk'}XA*"UWvY?1(=Tĉ+2L@}kD|,f+xdZ8a5s x[kdifI⋍7Dz3Ox7͡) _>)o>Rӕp/X~ot^7͙Thxx340031Q(NMN-`J>8~}c,#x340031QK,L/JeHgb6ܕwZ9ڍ%?BT&fe2n]`Fr{I7] j 2yOmZ{{^\($ a 3t3-̀skVte5Y32 s3L`LmwkW UXś8=U%mwFpWBRQD7?m_^k?&1 ̹Y:ś~U4a[ y ?vneU ;<бQ7N[2<˷?ʧ' ϰ W)T߳ROz e0/H6i[T6 )*HKvuyMK3WfX䌦(v G)+?k%TQFb1(\rB65y&+h|T;&d /}{TDc=so9jxk8÷Ay?spf^BbQrF|bQz|~ZZqjݬ2in>nBmx{ib fbʙy9) 69yi9%ES6bΞT_^ٛ;F`D9E Z7Ȕ_]*y{&\K|&%x{uk 5WY~fBzj^|RAZ|QjNjbqdGVu7 x340031QK,L/JeH>ũy馽3|C*OgW`Wbs:}쓙71;5-3'! Ӳ*CCuGV¸j\]|]~_X?s"P{<21̼ҔT Y59[Oiȷ +}yjEz =I]:.\W`n#l1E -:6= 9`xw\wϻCdKRK,r;0iѻ* Mܨr>68CI~2 P(I-.)f\$Y%DGӰo'vCs{7 2pc޻l¨Z5x340031Q(NMN-`ۄĖrͮ3 &x;iC_|\ Zlm|xWCToCgUCLyık=x`D{;.M^/`(PY\Xfl+pqr%BŽnYBhrXhɫ@u%x340031QK,L/JeP]4댹Nt1GeQe`_M%/HS޻a*#ݤd5&*STMwtGa!t33󊁊5\8FʿKd椖 t0_7%,&:dxfe[T7'?/]74a'*$&ސe0f%`#'欿,쁅͡;Uzpz1LnJnRi:̼tyN?!\0/ٝ)a-tKJRSNMl#h덯!ח`xSf!Lnqeq20|u 22K*TvZjm~'SLrTM%@]šWk3868 ^ 71;5  zojUS l)ߕ,E<\-LXr d }m>G*Ll.}x;γg3dOX"&FғkYO$ [xwo|ؤ'`aRP*> PHjqV>P*W|[V{HSaG<Px;)B`7lRXl/JMLQ0TP|E HM`Q؂4wHZOVaCVƏn:r$Ezx[7o;d_I ξ!>>: : :\@@>X(d!"(';.U `v)[+xsgC(h;X'˲Ob} jMxg &3)(L.c 1˜W! ,1xܫ!er''B.& uW|<\b0%0%9S!8B!.cZ'q2!ˀ`J@lpM.VbK _|1Q0p,'MF6ˇXa3&bʂmJ;F wZx6"@d\>sd,3CJ->rξ!!A@IszpY&T9`Qqs 8ؠxw&d}VY&ɾ2 *{n&.@  xwC Fo@sH''& 5{;Y&deVͱ lAxti~7W~[w^lj_2 4xDzeBxR]׷5e61x~YV79խedا| H'x{$zDdBDDBQjyQfIBIFBYbNiBfCqeqrbNBFjQ>gQjIiQfN,9x6.c* }0MNzD˛/AIHoT~EĢBhhx340031Q(NMN-``q_gwltkX#[  o`xbC rj^Jf6@x~R5vwΟ ⵱!sox;"ogl̺{Y&J+d)8W''($(8$g$2RR8RKJt j S)x6.c* }0MNzD˛/| P~`\X2U[T\ґhVW xj~R5vwΟ ⵱!Yo[{7B100644 db.h]Ͳ5tDi\px100644 gen_bpf.c>x J=:Ĕ Fl;62օ#&.Fc̓ioC\ Txc ;(A{>n) ?5= A %A)Udb->\6K 7.W7!7:3 /* XXX - sanity check the c_iter->datum value? */7 new_chain8Z8A<9'x,/y"2 ֔ĒX7s7 S QxqQ xr lB}|&o29s9Bjj k{'oj65sDr/&-&;L2QRG_K!38D$#U!/\!)'?9[!1$(Y _n)]}'pNy&A l6A6:hr8[MYd٦<;r  2d=A3PkZUNts2&I mY'\"ϸS+ /H(B}|4'ߕOBY43MA ( 5ヨq ݌wx6.c* }0MNzD˛/'|~AP]:UǑhrxDzeAFyR{-xNgq[6A䫌" bhx6.c* }0MNzD˛/潩AjK|[y{XhqxDzeC9u_]Ja]X?q3 /ox|! 3m&ymd\"ș`3YQvl'V^O__ Mk.Ԝ'_q/j姤%&ėħ++*X)hNR(INU(HU*+VKMMIM-?98FF )'[Gɐ 1r3&wŦ v9I& '+l^cʆq@in~,_ 'K7 x kL'L៼odY]&Lff^qjQ lĴ"-}.N(J-O+zi ry'*NNl?S33MA#)>+@./D&rcdY@[L&+LMϖfG+Qݢq t G[bApWX!0ń5f* P`ɷ}|RW԰mbc^T5]@ZML! j ˋ隼 d20=%F5^$?3M7"Fyh1%Dޛmn0ֽÕT㦩uMZՓ^ *٥n&N던ZC V˹YϏ>kv"c畘#H&$~U6V-79o?mſngt .2m6P3CR=D|wlgq_yت~`߳eʽ$[BAGQEs06ArP2i{^Ia" P䀟e&M,` x{{Eg]Yn12khN&:يjv,JAf&p{O^,ǣÓ\ϋfs^Md|589343KRts2Slm 42y%y֓*3N;=qxtiHǭʫ3;|wLjf/ 6xDzeBKswORM[5UX]+D!(9C7L/E %+oVq_;ͺ"Ox[!nuNk{|{\Cg\sE'z1zY_֜|1/E$9x=KA#hcc0(؈ha.^.dnvbi qr%("3w71u:f\is=(#t!XG㨁D Թ 0_6N/ ZB&mv΃Xb>JJ2L.88P)/OE=1um 3;. T+׭xdRkK#WWlʍk*mmEį@HIYaDe O _a(^oX_ RFLE8}MLb|WVy=+F~X[ݬֳ;ڠ9rV Ml14<49j,a`f`mь;=7c sSvƘBRHsS5oZ J +idq ;AǧJ2^Z?*=!l3x'νAy$&6kmx1c6llxۯ:Gqf} Lox;wC+l 5OxlGC^Vhѻs`xDzec"%O}X(,|VIC3$ ^݆mSŢgUq_OO͋O*HKf(8PlGJ:=h&JcvCJo[8|1>m6 Wx{øqYdW2WnNa+,NNQH)I-R(,PHS/(KQH,J/M+QHHܫ ĝ7yJs6W|B^QG8_L$#Uh1DBQjzbQJNjqzFOW/ȞZRZ`yUɻ]Mv,%O~"ⲜԚ #SLWx[øa,Kf^f+ًRsRS70祖+*+dN-#yH0>1%e~%Lf_x뗟/7f̓U74nxxz i՛d9xBgQɢbgGxF&100644 .gitignoreآ^`9͜ZjY#h00紂&lGC^Vh2xӪK| N U\"2ӹK3Kt RJӋEx^&100644 .gitignoreآ^`9͜ZjY#h00紂&wȿ=`S:U/$o_q~h~;h4*&x340031Q(NMN-`p8R\M;k l x{mdC)j<(#x340031QK,L/JeHgb6ܕwZ9ڍ%?BT&fe2h̜{:ٮ7ėsI,Kf ]Eŭ5['ߏWPilaT{TnMmJPp预j7UG+1 x3gYTWH 6vER5XY}Cg!`O~}+H3*R&|8/"P+YRd߇EmDg0u*6l*?:|zj^|RAАiŖy4ۭcS>4E lyKM-MH Ғ&eRݭ6бқ1ge02ᨾ>xv*H,KNæ&t7j"O{ݓh~̼g|Dx{=GcC.f#y/ 2@|=%x6c_yF$x#IhS/MtfdW.ao1h>x340031Q(NMN-`=3k>9YMyx]J@Ʊ n*M &DRT[ ɖӤdj=9D(5ܴofs ) ^n1v!r(X"G R`N0lPi#Q z}(شqC ^Ь_4Zek G0"^*SJh16SEtn*.I4QQ8 Z $)1tVe8C{qǐxǒktaߊ\񓙧;-~Qu&zml,y<+aOog(R?ävvZxk/!'?1E,?3EӚ+3D8599? 4'5>1%E(jl_\VUY fK0xDzeBȡǒS^Llzc<7eBˌuxYko8l hcg:h5I ǙXDDdR=dv^}bzMvnxeFb}f˴sEZA9 }3.Y*/ ?Bl1$({f1]%Z͵diYlkU_2i,8eS-U(5Z.CY,z2{S${C_h-%~,L9Sb9qA8؅-~]gm6rLHbIʕc6,Oybbi8x};e/S2_M.疕X&g}qL?Hp4~a0pz5agd:<'l|;_ '81x.3ty8-פ.¿pQ=dY.=AF!pmȑmVYfWjO;4<>z#cȧr yiUY{n*꒣a\ĥ§VصxuawvskuOQl7IUcƭzhZ"ǤdVc{)3Vppت ?]~rwTno aQt+?-7h|͑rV!~n[i/ M{U2}5_hb;trs/)gOkͽ2^q,1+ p33Cj;D|+ (U'3UqduL{*! O`,ʗ@ >Ut3vft$UaueH[&͛4Epֺ­>La&w@Aר9!Ψ%۞='R%{vrڊ2 O6CI*u9 DDOv2Œtds-8.̘ҿ ,څf͂5kܚGg&rx0;1 -j9 O5j4WhU\M[$ra%VnME-k6RcY=:PvwaO3[MUSTOΎ~6λ K|0Z8wuv_];ACc{Sc>d&t]01YgO8dv3SsGGl,|YEO(fWC{b+c{wl]\z?ho/3ZGr8:wP&.?t&g ?xa|C,L60'L>ٛ&OF ĔbTBZfNIjBf^I>X<;(/5g^Fjɕ+&K-W(*IU*$OLI\.$Ǩy)fXm'D)Q l>.qQ1P+xa|.'Kf^ffE9ũŹ%s^k4'5>1%e0ɕfvh(x6c_yF$x#IhS/ jy{Ť+a&{`$Xh9x]W:8s>vURE1ik 9 Lta4"2<100644 gen_bpf.hsvk F֓&zxf|C1?{JjqIQ~f7s 9~@xz i՛5dSRK+'JO2]ׅ +x6c_yF$x#IhS/6O ֊$kYa<1hxWW9e3Bb}7k47د4100644 db.h& j9GUl ̊jfr)x_"7f frV<ғSRK+'SNLI/,NNə09_} xW2b ϓrAMŹ푱/4Mχa6|u40000 testsk"aEG;̦ۓH5U)Nx340031Q(NMN-``SC7 ;c,8ʥcFxDzeBȦwd4/e6cceFԃ mxabC,L6s\Kx340031QK,L/Je(Q:usV<-|aC*CĜrdo*?|xGkT&%g&UUb/P8U{f*c*̼bbM&˥u f'?zav}*LnniNIfNjYjBǶՏnvTNwf} U(uI]x;γg5 wbJJ|qeqrbNdO2> kzɵ hDvx{'to|Ɍ,ʙy9) J%9zJX3J8A4k..΢d[ԒĢd YT RTh39Cas&+3Q Jx.2S`#̦ʙy9) J%9zJ3J8A4k..΢d[ԒĢd YT RTh3MaZ,]!XxMJ@b D(I jOVZs1b/!nqq ScG_EO>jo|3v>Z =J^0Ya#42JYCoZ< "L)85/wUZԒУgGv8ٖ)ȶ- XJz/65|9}۲I}l\~NƓ(Mim ;/x~XQ{e"q NN Vr,6Si xgfĔĜ Ϙ%9lSs 'hNbF!Vza$g1x_qC wbJJ|qeqrbND.#.N )=ى]x<\|ؔB:b(1DW$Clb69{P^j#^ɛ8 g0Α]Txv1cSa/F(x#'qC%ڨF8ɼj0}8fuP{r^>{rX=krF/KpjgLø40000 testsx?:P@n"Jn#;ym5HJ'c RxDzeBȦwd4/e6cbz/V6i;lʣ  LLR2<\itB9yՓAS ,)9S/X>K۠)`cxizUk~/fQpqpF^2CkYxT]LU,.۝eRBBXnQXEl ؘ̝ ~jH؞>6C5/ZSVcBQ14cL&&n,ib;;_qm^5$,CEYH `xmc. LjNLQY'L- 8䋆Jx ?9<7E DUwQ܈X[f_-VTz<]ksr/T6pe {}o`2kDݐI1M%LBq.Cx!f}|}G`JBmӟCU\QM oiNx,'2R?VD߰B=<6;Qk' tz YaOlDAzX4vLkvDs #-D.dө \HPzԽQd`Tq/K2no~,g|Y;^O폗ݜswZ #8~ʘєrpvJٕL.uԽ+_2lĉKd?s$% iIѱӨ896*CJ8yB(m[Gˉ w ,0do>d=c)H㗱f" 7L8Xx&~Tj_LE!lkdii uL˭ʢaM2ʖ䑱#>O2Ü{}OY}m*Dwn0dyg-S WqqQaRBEŕ ֙ nhr~x9-_367BMѡu]߮$[4ڷCϜx!O?Oc.~)IC'=w:({ QMLighK9KGeq[ KX8 xۑ6g& MVe5WLbSĦ"[t'b9(du.\۸N2M=4Y/rr|k'GN>/ Dz y%F 3Nl$l9_e$U şnylMVFl̒"].N(|Gˁ 6 HhLnG:͡:9'7Ko64se2,mZjx{0k;\3%*&+hsMVW'YBbJBIBIPaIbQB~Z1ye5mRuSRJ&/UojTj^ &_02od.o(M5b Ol(x{"kfyU1$y !x뗟+al\%i9 7qynbfK-טl#=O=%(rJ>ĔĜ: seҁ*JKR@9% Z@NZf\Fr~P2-3$Nf)g祦(dB4jZsq)dqC <(x+WlA6tE[MM.م7?b aaWNKL 6xQ&100644 .gitignore·̐BZ=kD &4Makefile;,+&3s5Ii:Dmzfexʜso5xĵy$,'&xF&100644 .gitignoreP3jYv  u&3{OCb5tm~/mdUx2` 5gx(HpfW̓ql8xtiȯ"ueϫ, 0yr f ,xp6^(+dP-oʆJ59J!0TrJ3".9100644 bpf_sim.c-R!LdXլg6Rr"^䘑=Z3t0!L'].Gxk1k6&:y(0u3=x340031QK,L/JeXj4+RxkŻYJ !|<]].F[OfZCBCԴ̜T9]$SgJj\]|]~_X?s"P{<21̼ҔTYvc-,}HqqEz =I]:.\W`n#l1E =OOK[ qJsW&nK!lIjqI1 kSN~Gg-Pb{p|ٸ͡dCPZT̜/?>{W/8siF*x340031Q(NMN-`1Wٽ"wvrgT?S qxk'Ӡ<-`=f,fXg*x8W #~_V3% Z4kVm @v`}3~i=(lxak!eO"w=x[ӥa;d6)֐ GgY7 z{x OxX#$?k&xsgC-fsxC9Ѿ6sW(t%100644 bpf_sim.cl Fx2ӼQxk1;gAEtrd{Q9"狦iix[o{f>>. 7~x7 %8Rhhq6x7W #~_V3% Z4kWb*D O`%{{0qi\qxti|J 56LO=jtY`/zqxW|$q 궅&=(=>?-8D$$U. -$DG!/?*дLS@n`5$?;$d^|?)q#Il$$$>-'}sB, $9j{C+K&eM~39ޅ$# !lP LNEJ+4 `6?pe2y8(7;0##>#30$'`N.DbxN>ozLRHsqU@Ibv=y8g-S>fP'6SoxtiCΠs93L?%bډ_23*xDzeCwN>ڳOgr 9 ozx+Wl7rj^Jf(axti R jߪ3ەe/p rxDzeH'S2g^rܘ'4ٍ |8xti/n]T¿e[_23IxDze[+3.N _r*a:tx{59s Ɍ͓oJM>o:~do(7f#Cfv>Cxb筏bTI2|:hxVx 2.:?8g"ggF#xti\ Nu|MlGx݉CLmn\Ū'ZkK(3$0iK z~[sd3||J/ o e겟l¨Y0x340031Q(NMN-`03{77wx8WufX{u_WkV͎^.Bu:Nه`" m/:#Hd{Ryi BH]@095mД!"cї S;$"5g0 n"t~Od dS.Պp>?c̅޳["82{Bt]gQ]|c)B\IRlZu-eUFh5zM?n Q!Cw).xWF<{,%$BW$4PƳUHlWXK=čzٖOOlhv[^N婻ix7Pa}oO&G*oX׼gQn 7]A' loSu/hƫŶ<1X~_ 4NgDS|HF|Zs)Go7_<;wTxTn6}b]95qTڻB;k; 0(ʤ@R{g({\)PqjxxpڧŒDZZ0fz V+ָO*vZ2 ~\N pJѺ$WJ)}ro۞vLCBe9ReN3 'X-rLJZ%"Jp 6X^P)l6BI84O\rr)\Xz̥ 4O ڹC4 ,"gkot& T2fIV9DJ2o.!]0}h' ĺ2ͤa]p=?c8 x0p2n<ߎ)No&A I':[&rs(ƠTQgǐNISV46=yN! \kIҰ_9<4dg3Zn4_r塳! z}+92ϗ# ןXi W =Kٙ_w/N`]٭XtC n|*?]!SűTѢG\qƒhr=Xt[?q-h0W}}|G_VL{\.~c+x 0k2ks|K>?L}$xmOKAѨp:tP*XAAmʍ ]gs@gdf7 Q̵{ǾNҘZKs}߼OsRnw8 lӯk!Moa1`b.;bLNDNGe$5s*U,I-ґqZ(*V.oMzQ3)vM\(Se*h`ʏVVGqN:˙Qc_׷F B=Y)s3$h궃&xb!˨Y5B!\uNin&TIA1A^ 2)nM3iɳ;\ƀFL53p,eʺ nu}ǍٸE1B{{Puܬߨ*`8vwL-Jԙ$&I=';|{o4G>5Tج~z?c~3Yz9Y et8'_稹 ۺF_H 1]jZ̢M/΁,v%dV!khQ6}͇RI>zIqs9;@"Ɖ*Na#cؘ8,<gd{0?4mϬt;L;j$VZəoQR_ynYBi:=` vl̽>Ouj2ٗB;Ϗb*}>A%`/ڿ^'O Ɋ[gxZ 5NDg:*~Xnae iӅa*48AC҇e_\{O_j ]y VW">~~7f=N r>'%e->ڳwaoM㯐Ʈv" MoovQ&?D;-6#e_/pQGE3^{{4|w 9hW(:K ͉*DjEޒ9GN4wX[ѦV: 8 4B<"1u?lgx1LLyZˑhixDzecdOrO9Hl f&& )Iz ſ"˖?ud٪fPԼ4dMq}\׾»Sxr7Hv̪ ^\^[mV7*c&/q56bxVKlE@2qǫ'׉ID8AY@4gz38&^ OÁG)^ (7D 88";Kf^ܩ>މN͢5 {A7%A:EҶ{,WKFdw.7J13 /FgNW:$΁ )UII}$zd*e]x1T$C9fqM5 K0`>M XZ*{ي< (Ԧ;Mײiѹ o:@r?g\e7WWaS*igGTHgx<4nA$jv*r 5Sh{[wk-LB&K{D%> qK)oqk/ٗV_G62d;`z5LC#ԣ /\|miu _Z|q%Ս.@)fZeQ`9H΄ rح|A*C1Qj< f,yXV?6,I&պbBGb܃0zܖaj*,_=aFҥCN:Ү?PM; 9ee$e*zuUw&ze+s;`Kncn.6MfTRuXvرUxAr!ܭkwѶ'G3=)˯RX]YYa/IlSc$rGʪ?cp7EIW=rk-Duew(%k69 #/ـMqol SzֳSɷƝwU._VrqQC)HT9@16o R)u*p7B$4qb`!+Uă@X3ă~e'EHGw񴺲$s \& 7㛒 Xȯt]N'+' 5"uŦ9)g.aNόX&=눖s4U oОj֠8Ol HL˺@ EUiaQmel| OvO_NէD;dgw o!S\>N[F3,r*JWKԚwfP:CRSCljҥm~(D"i@S2q*d^&52jn׺ub4PGE< VXt4;qbj9$QLk* V!S9LebNeAb{ X Jpl~ǖP3^[X+( [mSd̛6JiDZr9e @*9@Zv4~ٌ3%X椷`yIuNPr }qٶ#wj,u3,bM*A1! 4%IL&}pz pgd~68ƸjNgF3zg p[wܯãonvc}ժr?8dG_A8t9('9Cra%,CƱ^>lE$Hߏ>x#V|C7sXAf|bQB5gi^qfz^jBf^BYbNf5(P5P~P$%47DL[sZOcDqIQi2PER|"J̼3nx{+>Y|fE5Ln7Q x[e5ӆeg($&'ǧgLӒo$`XXVZQ\XkT_^hZsqf)h kQ0|EMfr zd/씸$6K_f2y8yÑTgdb:(HKA;_*Y<'9d.K8 ;x{{[wC lk43KRtK2m 4$r5' _fyp}F(0jU~~9W[E1kx3e+p !æhxDzeoӊ) Mkw8qd7J xʾfacu6nOzgxti]M:찮бj^8K! ~x@24xvW!k-100644 db.hp"~ka̖f&l.x{+~C|fE3 ^xU$1䛀)F0uΓHPzxM&100644 .gitignoreMd,3=^AE]Ժ&Makefile] nc~pAYDRf:x knxa-C̗2xti "G;rNpKMbb \ o&x340031QK,L/JeHgb6ܕwZ9ڍ%?BT&fe2Tf[Z+t2C$d%3|)$'Q4ϔ.{` 3t3-̀B.(:Zf˲7P`y7V1`51ej:_^(,h?D[^ձXf0;1o]AR4kS9uOkD;޳3@V0/RWp*g@U$Mhd)l̞IGu!3.xMI]v7}S ҀTh{Nh2}^|˲Yv\CRT 4U;fUwG/W.J6CS`;LyZSןڵ(#.9!<>dstG >=*vO19޿R7F:Ixkñy$s7wbQrnYv xyc,ɂ\bTĢTظ2K&ޗVOS(HUp ,69ј*D!3?4dZFc1k_gHB~o )1ݙ'Od9(:7L66y%%zv\\ʙy9) JEzJ\\@yLc ĢҼ ⒢4-KMW~ZZqj V-XdjzhɟY(2قfr!nDx'|[h[YFL^dY6Ә'1_*leOcOɒ1yK6`lYRPYX^W¥X2ٓՁț¢!1/(>?-8$>#sTv9 IĢ  &ளc`дCMxucɂ\bTĢT[ظ2K&>VOS(HUp $>Yіur.1?HeRiBghb 1_ gGG'OϐH?AR0<\&3IM^$ 5ROAsq&uF2J*,LKJs+4KKJK3SR@,Mk.t}iiũ%4(g祦(5a2'3O:#d;SR2ӸꙊxۯz\qC;FbQry|y%BJe8&}+#Krټ\9`%@En9'٬ϵhE3p6,PUf11rL(HEx6o0Zᑱ/(}D?>xMJA ncʁ-AYl샂U@pe= ;u.6BBi1Qb`9|?ξO߳KpGBl2ۜ{6C0ULJw=ΥXjlFpV<$(G`%{^i/ M5(+ijsGѫPA@eG葆3K(BO4 莅LcǛ}|+W"IWhtԎϤLR&'aEzq%lxoNq,&`xwo ;{bQz|r^d^voD] $x{eBxҫ6*!^, ?.džf&& Efz N1ucwbڪe2SIZXsAҍgGLܙ`Vv%Ż)kd?fOy{$@A*6_(zY NgY2aMCHxDR,xeJ@)c)zjKP*@nٌn$ԋw^| !R uf~M=}MI?YJUKK5ZbG(2%ENְ*Q$Ћd:L}XVGru3vNpT;b2S2>'A "\R\=80tKG'&LMag2aƑxSGRV$wRL#NOI2+ og}x'<v obx}7fvԼ4.5Vgx;Df  HVx;gf'fgfvԼ4.I8x6ҢO ="OC$jc8/'(wOOR C|hΥx340031Q(NMN-`81l/T'v/ ,x{eB».ϰX.q31BHd)M{W3T"=BJ^2òYƍ%&3Y2|S積V ; "fi^%703k/WxmOkAI"O//dS %MM;` ix6؝٦RJOw&{j7ѣ_&5}߼KN;ڊi']&ݡ|Dz81N(A=p|2`֋F T@@ 8M8q>M#*0t\koȞ Xbm4ҕ4Wq S&uwQ)6G}Ԋ1nadן۩eIzhZ`9UGLCFb ϣokх9#&=\A}5^s:6兾}X[̣l58v)ߙtkAPgθl]2ըǬ%R|NXa0 gt9e^!!몔 =EX TVVՋ>e@ݡr  PmZ2kE>S2꟥/٧ף?OV#ixmzpC|f=Ģ ͓6۳gN>%:WD((O8599? >3/D#%5->1$3?osEfxd)ق;9E2$kxexpC2ZbQrF|JjZ|^bIfYd#-sL7,Qziwx;gf'(FI<$dĔĜ X$8r2s3KK27`YȮy'xUOUmw-Pz[XvTDBA[;^fٙ͝(&&>1W`LM| 6YM|M4>>hI|0sgfM[I;sdo _@_SXW i{,S*J̷]s:H)eIty\YU:o,6Xc)Xcevhn9:8ł"+K%6xl?F)9 9 t)tG3mB Ut֪iHTE8WT툓'crQˉے uG9baZ0OENkX&}}]/$aIͳJ,& 2 Ko^MO6mF<|ҁ:£$vjDjmr0=5Pb A 1\H+_ v(7GdP78Hk#d+e).RQIX$L CXFBW,.6Pp5Rxg,8r0 +5+dr[wI>[)8'̺jA][\Vܼ)~#ήFńF9T"%j0EHt?2*`W8Lv2@_%"x~l&@Z=у6z@ivn&b1<9xkgM> O%JJlQo'Ћ̒FY817VB*19A+gEoûuzvOwf<-tg;\IPCҹpiA*idt ?·>£8>f Qm_ܝTz]taBΞ*4 cϲSf&Ls_>翎?hyQ {x{+>G|C7w5zyřy) y% y9y: e9p! SӚk#YoC}x6 wi!{/#^?gzX/?N<< P6ckhpHx340031Q(NMN-`4K2-M>'DͲ ]x{eB]|xҳs}+"s9u5 LL3t3-2W8Bљھ/X6YYY^2C:gޛ6KxWݢ>, 3:{~’V}; "gku׸,vm3 n#Y/,m TEJЄgy?}W:>`\4hlx'|g1Faf!kx~}#r6 Z{x--y,{X1KxoYx1c'ḑ)tlcx;Eb[w&`;k/xsgC Mg)nx+{Qys}⒢Ģ̜"̼`g߀x x_Lj$nd)hsRUL*Y/[ZQ`PYМK*E[.N (J-)-Su s s@ Rғ}QL|B.esrWs7ϳ(`Pd#x6 wi!{/#^?gzX/YRJ"J hlBwx{eF)'lՓ3gq3Y Dx6 wi!{/#^?gzX/WV5͡ayyWK]Lb4v |zj^|RAАE-EOT:nQ%ސ^` h.Fg?_u]?y2YVMǘ  Do_xkC>,R85x{QP oi^qfz^jBN~^,6. 5xW{tY2ؘUsR&wq{MVsdoe0'J{MᅩW|2x6 wi!{/#^?gzX/ 0e;=rWvfha!x340031QK,L/JeHgb6ܕwZ9ڍ%?BT&fe2h̜{:ٮ7ėsI,Kf[xץ?>w }E=nu` 3t3-̀Ó;d[ȑӮ,A~ō/NyIae3 lw[Ž/ݲ>qI& ACYmpR}J+*R&Di& q޳MB EW\-/=vM3uOѴK,yIi@C=yPEIxC{&4E r >M/qe, n;!)*HK;O&?`*4E ğg8O)^9u]+9<2A39]AM11Gw `x)ޣb$3+5|#4ЩRx"^lC~f]0)躺ZoV8?0\<>x6 wi!{/#^?gzX/?@L;G:vЧYNhlx340031QK,L/JeHgb6ܕwZ9ڍ%?BT&fe28mW[xKLSj 2$uϝxBdtQu fȟ|Q4)YEy~7P_vO]TEJЄ(d!9.{X=5/> hȢ'*(ioHc/Q0݄(AۧW9},Em5$Ei@|^PugoZ(v G)+?k%TQFb1(\rB65y&+h|T;&d /}{TDc=soz xcdILĂL|$ X&odqq VUPw R˷UKsvqtVIx zzy9)0MV`\b `mxqcC>3KbQrfgWTVxۯ:{O<\6/c6dYo2xsc/ rj^Jf.k xti!#˗>s?Zy~OCntBqQ2CgN[65Xi黉_2<R(x{i^M¬87sFqjBIFkBJjZf^fIf~^BRjN~:Uo&aҾ%&|qx;|yBȌL씾\ht{x}sdKf;N<[z, '_`9 &x"(fO/uM%hz= x;|yBƤݜ&ɘvTyyCmz7]+l' ycNBJ^2NN{g<~큫yIiz }wj=os }Õ7I6dWj-7pc/ ?xk(ZZ!Wp *7 Ra?x#I|f{)y96pk0[[x340031QK,L/JeXj4+RxkŻYJ !|<]].F[OfZCBCԴ̜T9]$SgJj\]|]~_X?s"P{<21̼ҔT .<>*BjFnbrQ~^n6Kyg!7 %3,/~59r޲>Ȫ-I-.)fbdvݏnjlzZT>??uSz6_O=~](S= eEřyyi .ywZ ?wlvx340031QK,L/JeHgb6ܕwZ9ڍ%?BT&fe2޿4QLLLRXߕkrxqcrgW =uxmdrGD's(pq)&'geh'&dmm%x[iz ̛rp$'%glb6s)K~<[[h|_d(#uE*ج a)e,Sx>0xєFa]OƑh-5xkfnf..eGz}c#Ǹ 6,x-Tzĸ{|Z♑hYxw93jؓĵ ֳKMQx340031QK,L/JeXj4+RxkŻYJ !|<]].F[OfZCBCԴ̜T9]$SgJj\]|]~_X?s"P{<21̼ҔT .<>*BjFnbrQ~^n6Kyg!7 %3JzZ%%vdGM5ǣ̈́Ȗ3.ߴjԘ.եq@ڤ9=_d:x 8klxc|ɇ/Mxti\)UZuqXH̾Bč!+u=Yw='~W|:FlMʦ]B=D3{d@x340031QK,L/JeHgb6ܕwZ9ڍ%?BT&fe2޿4QLLLR=5/> dHջx:U~eeS4E 35) Q %>/dI2ړ;y>0kq Yf3ڧԮPE@crB65y&+h|T;&d /}{TDc=sol.xJ@)-H BRl PC!d.n6! ;F|`JVPfٟ͊Y[6 02 0v]iI4X54xp;3\ъG֖S3 #:M$Ҳ[p1y[ȞͧjeۧWV;+I^+br\~7p HC Us!;T:#2e@Lu,*& nR=QngTH(AxCFrr1dTv*E=*ԛ{yZ(٬*}~;Hx{w:o;fYfY~Լ\܂NBd 'B񥜛M̝8x#X|f{f.&Լ\܂́L'L>n9yd^N*91bl/MB*[dNQT4n}xiF 6K3? 7Hgx۫Cs3dI淓YSR2R ҒK24 B ck`f()X)(E*infbg|?+juL' YZk5zrW2L^wȟYvr!wԼ\܂F 6M6g2(@*,ABW5Rt!390@>W;X=ДiB

~: řUiZIiEzCd:N~#{JTxaf,VRAZ|AQ^dmY$hYYF xti IVUWn^,Á*_2  xn5"aaQ`?|r: \g&s(JMK+,?9Gjr5U<$ {u 23KRt ړ)()-S0Zi;kCl~"Ip"w%aihxkfnfG_4xj{ ym V ^x"h5jhؑh<WxkfnfGDtsqLCxJ&9:f) 1px[4i8X5*4'eu17sn7*ZPBrj99mxtiwJ|hP!퐉_2dx[WlԵLxmfȔFkQ9 S3 ,!p%100644 gen_bpf.hĞ3$8>5(]K9%5-3/U!)-OU-S $e)$%R26?ce}trI R& dvn&?lx;ĵkf+f&\jxF)fGgZähxkfnfG.-{7wOXyl ^_xU]LUeXh򗳶]`DPZj)3,[H&I6&>ibbԨ4F1AF}>>sgaMқ9߽w;<_9AA>Y0aQG>D)슳3{G|δvߍsYMȲTnth04?=ѱ>l k0⧜=Rb.`5tP!FhP^p,6rB/ bn%&K(-`y(WK&=3eGG@:Z=)Q76fm쬩Cgsǩ/Ifͦ0Ξ SԄ ϸ:t4+)IA7xGa^ byO?IQDu~ \C o4"P\bKqI+Jt=S'zQj+׃bBRɺZU(G{DTOxPrPв%5k<&cm}|-eIS<{ELMÓ]qeQglX,$qRuUolp5r]Ϻ`4ibQ򌘲R!J-6˗﯃bu~{tJ [yڎu܎w7XƋKh(ewp0yM>ICɞT͈`iF N}$+ed8)$mP!1MSL(F783i&PmOcV{lHmFai+"頩SJ6a p➹t+#:G2iAfxi/ʔڰ3!KrS3@S)<%ن-K r).9~p[*m204ɺ<^ߟnÏkM8榒0/ܭ,'H ~M|6D,35NWʙTx2龇'oIY^BWlIc;K||<4}\MV*kֵG>zC=4Q ]N!c3t¨g %M3'4׏5e]upٕJjٵ8^z|~ ^xƩ>Ë/aOqpqϕJg6yk>g6:ޫ_y%jx4Dӆi?0Nϗ?٨pbYE[PMj.%JR8(8>9D[(W0YLiQd2)eBbIY\Pr|95ʪ&5χj%9L: 9 eEi %%\ Z@"ĢԒbĢTĜb̼< /U(?9x@#>y0xtifaK7nPkE= 6x[IDA/=$3=/(Ajqy~?޽Pxti*wl[ws~jaIL @$ᦺOaڛvf{:Ytzx xkfnfGD+0q򚸗/n5jXZ) T @ xSMLAMi)j I[[K"A APBv]XfT)_<cW/&Fl<ow]<;{o=tcÓ)KJsL4!qAW8L\O&C!ǣPi뉅A5(v~sʿ%^gAʼ1 %*]pK')srlT?1QƝ!Z4eX@]\K_!|W>Y-q2T7:/g$"f! <4H٬rFTP6{ -´1[uqfB/C+-xg/_{ a<[msh_,a|͇KlwNJ/˂&*kqN1h^A$,Ļ#]9Vݾ+T’~_9*^Ejg*apt[Yb~w-*՘Okݮ~Y8x[qo X6_eY+`b U *~~ЀԦj[x}eCoPm2J:gC0tƠ;ɂR`GtnDak=8]hڏ܀TJ]N_X)$Nf1 DաڡNCGݢŇ4M=Jhg$r%'u .t7zpH$,mީIvpxI)T ?x\5zz|tg=ťۦ[ЁnBNK ŵQcIynky߱ڪ:XY,H`brhxti^iIKO>kQV~/g GxkfnfGHfQ.{/e8/\x Gax[C uX-7Wq2N.;yg9J3JKjSR2R#}|895 4Qe5*4 @&"pNK86¢y 䋢9so~ L~ &YZk`k$Abz֛3$' 'g()lm8FBr{ku|mV)@MLI,)͝,; N Ο71mQ\Yk <%f6ߋYyikx,1齠I]a[Dh_LxkfnfGD/"\ꦣA%06f xC ̆>'f;X'bx^Q,1;oGƵOhQCxkfnfG<߼;.8ЫytyYSLVP̌LYLKn(z35w:[_5٢ xdO:oVk3GOL-N^4~Tջ^٤>_H16 ߬S'vyE&H%+(SeI0˗hjvG%uِU3¤ W~&Y\fd0ScRr6Y2a0qO#1]Jd -)GXR u$вY3杊2*jZ?چ Ɔhca˲1"Nv*)^\<957pwgRN)bGNw9]2_׵6j*ˣL)M 5 sGcGf:s9lhC{7Ν_{7F!R5WFOA5RTq/cKlxs ҖbAQ}{c&[񮎔spǎ83X/ #ZPr̩sZplrMaW`w>V>=9]jGz@\ b \kXf PU۽ES|6֞riqbbDla$ܪoFN$̎#3|,5c C*:3H {׃fjyY|%a[^H,bLIA{uhz1rҵеJ=g!vAzgP(@Pl)e!8QWnƺ]#b:/G(7 57%}vG MEQ3'e-⼄! ;$AHGџJ1.3nj2naQlrF Q"?Hn`n] 4ZY1/40pIw r,(ϥ}. PٶΑilJqk}/:9wjvrGVKbS2޲wG37۽=AG*'%>ƸCv;;;;`0^ӥe֣ĸg T 1bي.b–%dsTu#MDY<~1AOcg`l~+V6GU`lJdR"4J:+|~ؼD-=8(GBZnC v_*.yozXl^ DS󹯞#cVD4jdsbu9afW"D3Ct!0'I׃ޞ,JB2Ao$JИݚ79J(IUUAH$q.K x@Z'hc%Hq h :;4z:- . yJ';"tmX/?# ɮzjXK8:>7RM@q+dDiQaH j<|N))o6D"-9Xz*ѱ|^Mre`AYy. Y*`FRxno8Iւޔ- M n\R2 9ΊE"?I1f^syR *,:I2[+p'Hn }}#-Dg*cTwʓ# ]d0L|*'rҺ?cm$|wJmb||=wNjku@xPQƊj*ȪUI%R#&ǝq9!  BJ\Ѽd<dMB.N#XL X -'#yH'U%"63KqbQ3rY[oKI 56rJSa x[w'kwb|Lr|z\zHH*Z\fEux2?8Z ;W !bRb5}4׆ Ԡ`p1Sqy?#VFf[Uv7vRC'R<<6.K5o y[De51›$΍4nkxOó;+>Ѻq<6Krk`85K@DM@PYJCJ*'mPghE#i )ɶZ'N(ÍIOgG`5y}cՁd`NM"',wjr?St{J\JHE+-P;H`Er}:3r:{Cٽ=kO.gCϊ9h#2č$+:D?XSgnv+&^jVT;V;MAwU*hUlY⋵ӈx}o*ߞ'jzߺ׭c,Ye jˬ爗[% 4&&_# Ï9~Ud&hM*QŰQ*$,˦YVKK؀(/*#\3Bb<yiEb%"uML?n۰<0[F;"ifq98cZB*][D3¢4rROO Ӣ\ /4Ϟڠ] nvx_2#4䤂Z3)\&)憸Х_~f| vgZь"E( ]JF /.dyՃէTBWO +abwgYL>p`:_ͽ tJ0?߂plhY\ZxC{xo7KY~U& [+KrMę :cc`VCy\u"yYs} pP/\\S#/JʞZGud_avn[0;mpuݟV%*i*cwp!VVbNoܮ;^MvBfSw;P-1H X\ &B|^.Mo-i놖%zB7)GӸ4v%88v5bHYDlb,>I%5pB_:*sַ:"J dMJ W`7!|={fk㐟{UYv3:%J*jC);릳Zl#yF4{&= G;:x{:gw^>ͩulnB 4W, q\~FCCm qtgKx;0Q5|O;3,=,Mx~^Z t&dB#PVͪ!CYe#S[@Bmܻ-Iu{_ 7^jU MU3u+ gˤX=QRe Be5צ̿8Dbx;zq r'狈'd+5gnjnqj`PYjjZsqi= O+QU0DIOF+r3K@)''h0)M/,y$e.NNND'JM.&£r-ȡœt&jl=Mbswݓ*q^TM$$LڕP2p;piZsx}q <L\YurC O2l `0]cL[{M7dyMFɉb%I9\\ũ%j01̪4 &HBrQjbIBIF<"<0A&?UNKQHLI*h U^_Z0g) *zIs̟<1AbGI"Pm~XsJjZbiNBbrI&Hbd*К4l+hsq%+*ħ'jExwz`57)85*`AQf~QfI%ؾN6SW4(уO L>"!yQ&`qMKݼ9%'nxeQMK@VM/[+: [^ڃڤ"jH.F4޽8gM/LQ[zy3o٧[MV!W7^2(*uǩrles44ӄ&39!_Pэ.ܑb4~Jf&s*8Yt͡X-8e3~-f&,) 9q,UQ-aZ%𻶀IyiÐ 54㽼/93H\<*=="n*xG\K@.G== 5&v)2'e]ˑx*6 QM wwkH >AnCzWq9x%9x=صqOS̼|fb۬D8KJK r& O~3YLL$_!=$> $(#C(5-(5/9uy%.NVs*dgM07c#œZkX9ydm;ePɒBzzz&kN~gOw] Q+99_Cn& &+]tzxLBG= LC /* add to,JK3blk_sOK/dGs=G}`J8-lx]t7l4<)hMxkfnfGDV8W!i)q,ˊ,'Uy$'= t.6 6À@Un@. 4HGhaEa@-vν=>R3∺sK9a5嵲t6U j2[l勓1J*+*VkzFJ+ jY95rj'm$s# }ݦZA7+#iy)%w{ p%h}w ~nyFM]c1K |-_0&<^.-//]NRz_ԲE<]Lt81wgJ7Uf괁6 CAKpN>o]dbx~rK}K;f&5?] C>*j%[݊)q:>>9:G MC1* iST/=xx Y;M%~s},-F~{Nq"*MՉZDt]Dsw5Gi-~K5X!G9P.cw8l!yquʼnJ3I<1.lu#RFZn+nO\kyLun)dOywzNSQ5S}CSVU=Gf>#C%W9 Z ؈B{bsDPۯ|˷ n̪*Rmݚ*6-VWP\`z6vq-Zpھ4Ep,FR5dF^=š0>_RCAз?=n2a/熴h:%֬һJI(:ŇOB.SC2zxSxM><|܇P6!:><)t}QQ׉yD?>k66K#=e,k}.اJţ0M>ׯxw""銓 KͳhȘ4\Y8HY51 N/OWJI'vɒz\m;қ NƜ5D<{׵2TDRx,2[<̚!&$*)]jWU\;PVk2>UŒDpenXvGU8XcΆȷ`rވ`m_ľA3 b \/!L˳#L7L kp')Y Q1rNL>L+j*J}ttKxXӇNl$LwB:m -b .jrBf<T.WyKܤiYBn3euS"}qpude6+,WŃ?[n\>ZCD ne?7A"@Rkc{Қ36F<-wLٝU+*k]$Ķ e'3jV,ÔF,4h6k9:Vɠ9]1,`.R!|K*-ɲ"C  FA|{L,<Γ󢽷*TU`VICk9]ɟ hN?'.,_r X^嚜CdxtѣBepwkIY81Yi9ֈL ϶0K^j8Fck=>MD6d*PD w}#3([잾tD0I4q!pDoë7O'j&G kXcjndT1S4ش|X3J8a-[0T_e V7և~Y.C iTBwwLKWqRQ؞JsM\xj]R0֙VI:41:|P{+w?c}Woݛw4F}_<@y f ]%`: mOc) Qje*{<e;IZQ蘧!XAcf::Vq*rBm57z:yNdbSxU1gք "/5< )6VP$}Y|QUr ~^O9u" Jk}L ._L}SO e[~X, I}OתlAũα݄uye1ZOɩ4F ΀mےԫ煁" #S.:?ceMoxl/w+E~]e{:fN5_G(uuQO}[Q-u v n:m@y^W_s}͠+U;QMĿACѷ<ޜhh{R{gP7ዛk}N/"E!xVOlTWڮ%f[ӬI6+c4iI@NEjԬVuƺ/leJ82 w$.0#B;nb\& {R]w|7ceC պHQ 6j" [MpfE H,9DL eTkH*5\;(LdϾ7MlCH. 1!Ss mL N/*"x]i,C57ML9A~[CAD||,EZX0p#?K.nm-@S5 E{U4Ds&FR dX9,C&CA7O@1M8_Ẍ3SfSٕiv:<,-R֦'QR%c$ U.$5'5833џX4dln˥ˆ^4rvRhAH~:d/EZdT"jx ~ҮJY&HM5hˤʹM8B Eg"mh:'A3c)0{QE3 11P6RK=FHsUA1Ew컱H~9ppw\21O$xH%cnsj-wYL3v'b6D?I([$#R {@2Sg{.q#Wy;zy-Mvvw̉e2l V!-x8T@{ j-8tM!viA`< |,۶8w(Q. y%GDޞc)k?C8; qOl$V߉q1NOћpi P 1*FB_'y9 36FڝbفNo!c$>F:@?jÊOgN᷅6DNknd1]p#;  8u+Yv3>qg]UV<]9ITpN6|rn2tRi&[DqCkcT8x긚f^.=uWc 3L"ɥ`Mogq<߅c<=SQ6RR ^.z=\cs фw%lӹ+K "pKq#ɱoSrY9|V{{oFaZJEs^ E?~Vt8w\#,zӣ*zL4}mꆥi"Pq d:Ȳec]9oin^8j>2+jxuq gD'/|}rXm(gfFRNO+QV0TS%'k*Tsqr)h*&Vh8z9;xuZsqNw'.6PD5'$YZRZ"V`Z&Tj%sOMd(9qMJBdM/*еȮEp{P˥ /'>YTZrg#řWl ;#UABRNv|$I6?/c+ LgG]Kd՜KbJh;Tx=׭8*d,Y#Y@Бh!y6xkfnfG9/?:e Ч@?PxAh`ljei׵UѴi;Z@ݜ!dFtg'BNzE6$g~i_{g/211evZ[ӑ!cc6[5ʭ+:CqNP^S x_T6Xn1U0c_4 A5ƍ[-**Φultvk+!q8 9-u ;ذU)4?Ѫ5dQiw`9?š@°S|d!05OoPˊQBJn>(PW/%YȨ Gwx ^eǼtԑm4W)»m2dO`Agۂw(|ćiv0,M0An~c_Q@)DG֡Kh"͌l[I%#-膕 _ssG,3d#&xh|,?3W^\-P,$QQ:&`M,:ܫNN,:Oja->W ,] $Zb`C*qLܳ?vjVT\[Z8<9Du9:{iY4Գ/DQ/x # M` Q&h˝V[xkfnfP.us#!:ٗVޗ.: x;-gdC",;vxtiCOh7|J6."_xq^>t3ļ2ZwݍU'Zx.2]dnVWY32Nv}f. ?xti)5;7Lb}8 D`/`CzxkfnfG:e"WwڏDή~ # t-'3-!B!TobvjZfN*ÜOWKMds)]%P5A. ?/9GnGs~eBf^rNiJ*C*-8,ff[ZjFnbrQ~^n6*A')dZ-^bLqQ2KeL8}8-½ْb{O&xM;鴦)9 7ܼdžy3fY//R33\gꥵ~"; Y1 Zxti0_z$;1my " x340031QK,L/Jep84Z\ߏw4)BT&%3^V[udK>}0UFIř@U3dN&PЉU;՟2MH+* B uS\i[SZ!uSZ߯vCJ71;5 4BnݦoQ5p} Pg]#x{}#ɜ̲3J':OvgS ix!p{L̼dk/YeY\\"'`߬V8Gan>x{'̷a>c ̙y%E6ge1M;Y3 K /x> int rc;DENY1@1@<  = KDxMR4N?źh]9LړHx340031QK,L/JehԷRUd|Aٓ BT&%g&%3^V[udK>}0UFUi 3dN&PЉU;՟4MH+* B uS\jSTT*uSZ߯vCJ71;5-3'W;N.uCc3/ô^nxK*H20MJ,L200t Ҁc̼bQ"tx{qcC9yRbqfB .[&g$fL`Ii73ou0xtiȮKQm ԑyIdFW jxU vKuۯ$`XoxTM0=_1U/"p/5)miU!8Ē#jUwl{@g޼yvBBLn*JCJɵ"V{֥vցE16R*IѼ$L¯M)%Hab =ic[c(- #^^֐XʹQlU 'ldΊX-rgQ -UI{hwTPE8gQ)my*%7c+(9 . ghtDCQ 5Vq+ E]K`x<?Z~.~bn遊m*ΐ(" Q<sКqF$4f~y0dzi2>+Z7|)q¸~|ѨP-emQ y- R1d$ ҸQuiLuyݮuO$ڻG&2^&l+oǘ|lÌ~/_2a`ChQ̅$ xq~9-RٕT7p,_2L;NfK.E .:N[9p,64qݙ3.57Ԋ.RZpqLk^]t` < t N0w)^h9񿽿k;Ō]Hy:znιc{/X_(cx,VSiO?J +Rx)ی?ёx&H$x2?ODJӸ!-Of۴dxT]o0}&N{c K:6M$ؑд@U:ڃ%s=؉:Ѕ,+"jjEJk(b@;?f@ \W~Q4+!խkSHu sRsZHqFGR0p+JA숢5DV3m[׆3@DIX<EF0 sR0pOUü^s)іA]}S1 IB r:3`(dpzr85ZӼ殥@0<"?\£E~,~bn遊gȌbfsYi :%5qq Y>(?",j %o|3ji%^Fu}0UFUi %\%Dc-qdSiW Ujw\Z侾Yq.L LiRAPW~*{yֻtͽ1K@&fe2jrgɅ{h|ly_pʲ]Ox;gFL{'?`1|xrdn).N P0,b?9y H)grN~q䃬+Sxti>}V|~nk8K NxkfnfP.SI@ymjRN `x;:gCT e7fLx7l/ofr-#1,:_O6Hvߔx4(gFxddDm׹,Ѻ VIsa׉;H>x7l/ofr-#1,j-ì;#-4(vvxddDޅU]=?lW_;M{;2q0x7l/ofr-#1,aӲLӭ4(D-rxddP/k.7G>9j2no\x{jx0Sf}ml2`s;x7l/ofr-#1,|`ՈfKӢBLpyݓ4(^}xTӜ/lZ͑v ;xk1iAGTg"&'e敤i(ENHEYYm'TI*HOI|GRURUH/HH,J/6QP*RҴl(%>y()Ř<%'gQjIiQBjQQ^>_;k-Ex7=Q=ckCLl4؃|,|`ՈfKӢBLpyݓ4( xkfnf`&rc'W63u9Bl^kw 6W~;لQK*`xkfnfGĽ1OsǮm>% jx?41 % Џћ>$7x{g]Zƛ3x BkoN:()`yBIIZDPɐNr]V $G3O]K@FoYs$E[_Y$EiӲc`{#0X8lQU;,p!|.Bo1tjVtgfIf$oC(~S~Ag. T3<^4>ÔL$LvqJ,{9|@b0u};OKj/\LLq(DdW@&o@* *#uMgSG2 gV3WI]Xg F|7V1&+a[A[,.It'JdgfClVY]exߵe\,,GRE1$mDo@co B>A.z, 0t&w5 ۻ mnzڅ){E2қ׳2nSږ.S~s2{^=UQHuy6OvoQ622ѕj⪦/̸:-&ĩd_Gls!xq"L^mOU1 '?ӗkF&:QbaF8b/XR٦av v6n8s%[Wf5Pt6LK'=S,$o9%hn=I7ƀn5T7vIV+0WV0\yB"EL- Ms{Kz4*s?Tx340031QK,L/JexHH)Z_$~/ؕb\N_;d8D(?*MNMIej />uN2e}&ו᧟3'MsNܯ, PK)MIeșb^]{+TkBML./fX{Y #ubLqQ2ONm_|ť̌XCْb5UWT>Pe/[5*S ZͿ4tFD_rh4.:,83?/>3/-19_~|^ZqZ- Ӌ;xӪK| ../2ӹK3Kt R %x{{W> X}Vcf-ͧY9E8U4}<}\5$xkfnf`&2dwĥ7eLg`L^ xqcC3BRAZ|FjNAj^qEY'(: k/xqcCdxq{oL4=z31ovUE !xdd`&"٪^IGfW%N x}TOBRAZ|Jfqbq.Y;9YWY!""BAW!-3/E!Q!)$Hge0 xZAlcEoҴґux340031Q(NMN-`v/+sُY`(>-3$ysҟj~\8&w&o*!xUmo6,% ;qlb\;50tPF#)N yw|3UO`fg,V1!¢r9 .N&sȱ[Pi;WNz(Vw0pT^)׵xFxQppA4!lHWQ&jIP1=LpgQ4TPQ X !+F-a-%xGK)2?mXLFhz9L~(r\O76ē(o#ͰaZq@C*PSXQ֯ Mf<+Ƈ`c#/YBPQP5/@OS£D4.6>/C1)јh Bgm1bmph}[1oyp{bb?/Cש9_7MzAQo0{Ϳ@+=柋#5. ghmeTOtdMMI<cr]'ZS~,|} x7ZAlcEoҴґo bF;nAX%in4( Cyxdz8^dV6}^5z7q7I)xUJ@NdݬXWdltdB+6"q~4f$O v >36vskYX|J7 slC0FJșŤB],*(V+&9!4Ec4-<4sM TrL]S)*%$ LJC1_vpsUV̥LX5 :'^`=ӏX#sjZʚ ].-EOE?Ɯr]"&>HLI%;/ l%xOZAlcEoҴґ/X|p8w`v,Ec=.ųqK-##(4(()xdz8^sojKE*𷘭x;q70xdx#f< X7ۊMe`J/xYɟRgVZ$ghX<JxkfnfGQ;n+)st0xa3 '{:S<qm-M8l:cx1w-OvyӦEĘFI;7wO|6^䃍e a_/(uAdtBMa~q&?\זMn4<z쭱#0yA/I|ƅ&(*qED`=G1=N,K0QZB[Ul& p_J9*+EeVޱx Lx) <'3q $gYsqqrk)d*D%y 9) Y eE`U)i9@i i9ũ Z@#&**$ڕW%dG#CJt cQLеJqBRAZ< Nn^񞾾\{uHL)6xscv#.N ⒢Mjx??W [HV@VVs?!~m!ٵq蚼]@K9%5-3/U!)-7 #CB 9X'*Hm*Ԉ+J m»faRāKx;w.\ hJ3x%8'x}z YO+гԙrxti^oysMrKUbyy_2k  xG#ϔbIRгߋ)Jxti<xͩ2%?]+t|/7XxkfnfP.R{;Ìx[IhNW `xO94c3|2RyщEyze9) %E'+JNP a1YR_483=/5E!'?/]sr#|ĔRf)*MUv w ruTҟGY89(L.1$3?OVzsQl58Hx7n;& S/@Nϕ>dϨM;1ōe$2/o^չ1#3XB>!i&")[eNyD>ʧ' tv}oJô;-7 7<2ǭH Ғ&:`}0L!3{"WBS`;LyZSןڵ(#8hLNæ&t7j"O{ݓh~̼g|ӛG1x;<+~\,oLgUbr7sAQlJ'n⸬<4 |g>]֒.-xB-ENOMEM 1b_head = state->tg_sysQQM ix^G^DQ.Ϙ; DH(^x&ԧsܤ/fгCCxôinr;{"*/WSTZh Σx340031QK,L/JeHgb6ܕwZ9ڍ%?BT&fe2 h|n~oYZ>I,Kf8se73*sNLqcY; ->#5 ҇fmO0WCe 2QQ(Tձ0{_tR|*U;8!3Bl2)R]FtGS|zj^<.!]?&遷7YL0 MQϛi[vkPgxt$Ei@NG0>g=O)`e&l^xVO89+"}(g8sFZ{2,_^9Ѩɹ]|tN>GJl{F^`|]!}ʚ%GKJ K8p IɶUH ;.cqY؀ TaL3` _⊹:ܲ-z:LI;h(:U*7tn/5+*wcvWBЃ%&P^?m`{ P>u6d_YTMfjV^ڏA1v-+d==PÖgTk}GJRhz~oͨ-떪atv$j/o? 3ͻx|ljᆬY~o)qֻx;ЪBv?7 _?vK]Yw2dlUDŽTސvwT I$HG")9!CD>FhB #KamG3S<8o~^M`a z27U2J]PaCu|~N27Mu(m&FJZYb\ew=P2sT+cG1f )*XplZ_qi'Mw=\Nqn':zZ";Yx)^pvѵs9r秪wwT(-5Lz ׾,,(Gwr%C~p"nh JË1_ Ka[~AuZ*-V|o+ݩw)5k--b?g|Si1|(=d@({K=rz]6_~n5 xM{~ѻAUj?gZH/n0)` ,/BI&\ƪ2R& ׳/{g,l"?V@r%xYS8~NB@y(9Lڞ(]:Ŗcy$uJv8I\-}iwZ:lHIDA$i _pBd"H7߆H1Kp;U#.$.wzV!_Ep.胘,!5Xy@RINSЏ"6%$I="TD(BYROp$I|%0PȺ>{w8׍kznS"H(ES g|`jʄ e"TJ-D4]15"Ifmb^ba<q+{y-e脥 (E"r;d 9Ƿimw8q/{mj&8} Y@%}>N7]H[cFwss;S](d18J,8`55I̘'ҘIgp] jk{]/R9LB/"C\|t:kqiZSeJ)н2&\g9 ՜z`0gV+?aVt֘pO]{MG͈Su]\2ƌ R%,4?tȍ}t2,͕;ZV7og_wX6D$@Xz`HK"g~:z.ϓ8hezműT9u3Xsg8w3Ygםu8G-_ V;p31_в,<^x4ңC8ъAYV+ˍXIh^rJM+m /Gwch횗7h=S9-*ĊD)^)TavKӈ@]طpi K{noXxJxhnzt'vzfĦD'7+x&@8M@l>#·oh/csv&9Ko,-s*3:d@/4s#7'ҹ4H-:bX+|Ǭt kB:1س 5@ H ׍3kw)%ZGHRG)v֋"rOeWL汫^ ?y T)"/Fl-F3(xôi"q Y Ը$mט Bx}36YF!xPc^ oؓ prv"qH else  ,,< -Q|ot.[CpY/ My , xƿo$F.faԴ̼T`g߀` 1,gt8'ʂUĪJݬB:Z E%E %y54'g`O,J&6Y]MJ3RS2J:\ Լ\܂܂ĢTtĒn5p64x[ȷw' lҥyřy) y% y9y: zzzoJj8x[ϻwFl?x340031QK,L/JeHgb6ܕwZ9ڍ%?BT&fe2 h|n~oYZ>I,Kf(ZRLd]޻~^*H*HH)H-Y?Ր{kF~h %{gT Uu,'-]>$9?Oxζ{z\ؑ胍, @ޯB/ x|`__wPԼx]@CN}uH\PđCZ<;)`X/XcI˭{!)*HKtrU/~-, ^X8 Yf3ڧԮPE@crB65y&+h|T;&d /}{TDc=so5xۧGo,F\r,l b&7p/qx4ESs ^V돘 (:Jw=^95gzj^|RAZ|JjqIQ~Xb_Жu W Y@G!1$3?OG891'Gs?.|HM"*֓ 0O.-3$HG+͍O.VR(άJO@Qm hlZx4..r ] SQ$6QpxYmo8 vYcud Iܦ-Q6qdR{fHJ_hQz4,RUQL*K>URtxoo ?R-y^_ d9:1Y^ײJ%Qv:CnXsI0yR.eމU^Hf) =J%t)dBX'+⃵*!~9Sj̍ L/սUe&ąTf,h̠d'H['8q,sm 4rBgb/ '):MDʨJOmts3rbQYVzH58CBf zӛpdiNoo1ףq}st xKg쒰{JSHb&\)٤8/[4Ϧ&CBDdyBrn8\.iV b:L-3<xQgQZŠƨN5UY^2eZ,x-\I^!(B:JF3]}4||/a%5[ ˼:2*r! tKp9ө,0:R1V9%yKILJdB^^}'>p7;?*љx21c:ץ{Q8]^=eAxձhV-i$S#jνhq--YH"dZŪE3 YIEdKl9 Xu¡1֙CUQ),]k_I1p%݉I_X_tY`zT;<+u)S$,4f&+JHY{w{EgtlR_ J`/;FUѱE3(8*1}RZHUB'{31Sˮʪ0|1N+0y% Yu ʓ.vzdZ.>SjnT}0&^ GKΚl:(7 E|#;oT&/,q̍DGmP>Wzta]'ysG;ih2?sیNJZ֩,bXF6o,dbG%j&^h նҶkՀƕi(mjr-6;H|psb_1Y |IuP՟LˍHI?pG[I]Z=>xؒW/"P١jlkC77}a3932]ʕg(tqPר <z,"`x>(PDuz .ECA+1qfKe[\m}k̛CrήkXoV5ԭNe]Q'ϷA6 AJh,6ٴ!] '!;Ta56BSjV笵ڈanHtdHTP;RQc vJ±ˁ/|ꝺ;@?2ūPH[g-wRVs!aͰ()ٖRsxu~FUԚ֕[`2buikM%{f\J+UAozDEptNr=47 ͩ`d.Ooᄎr!@P fr<]P_zD0SisPLgzlW>~[Q慾2`k"x;tw5(H|`S0]=AYTlNH{{v?^bѨ8MȓwEIexI55$%y8'9a[ */ _^~; n : n?<M-OxuQJ1&`TPP >6z\EM 8kOj!}y/=ox~~QIxMž= 1\dJ$8"\ph#tevat0 OoKR=Byn< l#QC  }&%;(dDeNhH "sh}}M['X?q)'^ )$yM2"oQI&IiK }.]ş9Vt˪ CZ3>!kWCP| 4e'YSb+Q ?$ F KTOG͍scmgVwB7mC&e<VYUdU'$x$WtC>d~6ɽ,l3Xx33s2K'of5Ml27 gbQz#/-Ah3A=F6s^qH]XP."CQiBY0kqP 0r|K蟾_Yy- h2#ČĠ9EN{@_\\sYxݠg^ljȒ`\B3LDvGh.`,%ȗ5&G U2b6$wBh$8˦;lc*mp+<3(# P3) l,+c,t]t8JPh/Qe2BO) !T]dh& ,PRLW=Hh,qiDr ~,EOoďi^eHgA Ƣ4JF4V4]}27'A2ʴ> 7/:if L*vB UQEg"d3IkbKЌ!S)G ,Cr*m$oFw'gX e jpS3_N7:4x?]/re F[u[ׁU%)@~0$i>e+=?}ރ-$?eoeQ =CP~ʊ& <ǧ^i^4 !1,{CDx-)Ͽ N[n[<Ļ[M7`I$8x"F/m[XcOc% 1Pu-lnDNz' OM7giw:7]؃}V 0=iXM'[%&skNg{F0*#I>]4#4پ?j-p}rl퐮lD,J*VQCU2qBۅ#p[Tw" vxEMfp}+XI~$Lv.#[M&r5EIčCϵ*\ң:(Ƒ;exjLRbZBFM!d#T|ѼtFVb&2[8-r;BΖ<֬V=v+wH3O`g\`A':%|9,+fm ŎȜՋ#k݁7iF.nSm@Os@ɛ~ ](im-'ܐ,<-3#[a.oȟSZ2L:w=׿=q-|#'B;`fY#%&':ebe%/ME fXLB4:k8 h{|ZW!. }GӜRƦG هN-?3R}KtXiuU%1 ]벪?ӯ* .k/7 ʪl26د0#Y"NF;e9[bԔzr-O?u㓧.=icWWg .4xt1x<4x & =G>DdW[*\ADo1(x 1=wUEG"klȯJXfQ޲CvM45i$cK<zXs*z*՝4+݂\·w]Vv-+Ze{Vo|'7=[Pr~-o d?L+ '>^HfZ.yxRi "{uF*릆Hah+ yI[a`':4 ݩoӊ[Z?)WX9qDuw ʤ#߃e鹮puB~ YpK45h5^$`h}@VY_Wcm_:_Tqe1.{74˛6{e1eIHADN(zsdun0/:ˎtuB ZV7k!_h.M` o$3317/o]\N0.SS48YJȅRh^n{V|!rCՌlN=T=ˏ nKc[C ]W-m(m_ꁝ:lW-IyB=6<\'ڒ>R)QZ?ӜWj_f*6)L&)&aäÕ H&F Ć}VqHT۞|JzHJi>!<@2z͸qc%c9׭\w:nqNTH45/ }ToU:@_qp](+d.Fa@/Ea4!Zȏ"뢦dgY0/\v+CoJ(o|CSvIQ_ux{=vF~9Y&o^,˿YP5f5ف ͕j,xmJAFZǜ.WX$W\& cwO3 v%*h3vT*pƄu׏7XFor_}oSgY0׃CBAl0? g|b|OI\q@[3 TX50_},yA*W(,x&#NWco2~v^pl2 ipj+='l5jgx>c$3eS&e-LQr SRK+5&/`H+(O״RNKLzRjJx1cFJ_PxTkAD$&iZAxY$iJVI)T[PA2Lggl;k#E7؃Wſmk~@f3}{o7ޖ/MT2qO L 1X<w}F+`߳@Ad[ ٖ8u1TE gaA A]9]$52:pAOI^j 5Fl! IBCH'ִp5>S.f?Z_~_la-U*s%(5lTp7;d:.d|V 3 2qTlCBռ}9- wmSӁ=[Plm[&{%]szuX\Y2!2y`rv<5oq}x2tCt~zPP=X^;ulT6O$@}*r``~B(S_*TMji_Lnqa wnVbImƓbŋprקr)]&'xݒ87#俏3O&(f_0-[]# ¾l,Zq)(B xPlV`t;D^|36/gl,W 2 x6fwQuCE*6y ->#5 ҇fmO0WCe 2QQ(Tձ0{_tR<9>ysmbG6 3ux +L}ASv 9!qB6_GiIW܂(a}c%/1_n -hҵV;w-7W0xaUh2lg?pT_kRrSVrx잴k:xqcC jJxW0}KW&Eq )[Jx//4_昝+ v)40000 tests͔8X _(t3$x340031Q(NMN-`p^ UIEVn; Qŧe攤>ot.[CpY/ Mx340031QK,L/JeHgb6ܕwZ9ڍ%?BT&fe27|wlJ ? ->#5 ҇fmO0WCe 2QQ(Tձ0{_tR4[:gj WdŷGg0\lֻgvԗ3OO͋4FW/u/%;G^6=ve( |af{ 3k~t$Ei@vM!}ƽؓRjj%e0?|)+ˮ٢uApU x340031QK,L/JeH_堓l~IC_·Jמh9C*Cݤdd7XLJNHt}p ̫a t @*kin4X[T&g$fCZz/tYPY1KWѵ.GRԴ̜Tog ' o(ڠ Hb0x;˽}FML-'3':OeQU spxijgF̌ 6;1XR xôimk&losy3/۪xggp\dɛ Ѷ^_yX딁[ׁxx[k:tkZӄ96xôiĥB S&7~ IrxF<_d+{^100644 bpf_helper.hղ-z\3@Qԅ Vx{)=Ih*dC'sq)hL!iYPWTjZU&@d6PՉS,iTV!x{avlC5d!>6cY%[{x6qaa*Ѱ(q\Iё/KӴ3G/4*'JhHZx340031Q(NMN-`p^ UIEVn; Qŧe攤ՊF_*ܜ#n5A<{-Vx{!X`<ԼX19M%F@.Ak v }yaubSvPڕ o6ohxۣ]o%1ԼɷĒ6 }x!;sNj2\ Z E I9@a N/PO!y-!#;Tj3NE).44]t];me\`rO\YԴDd zGU]< i?aR9$xWcT֨^sHSI /4t{ &.7ML40000 testsE"%yC%x(̬'*x340031Q(NMN-`㗍o9EQ|ZfNIjPhH9f_t_ @(xVWf xs)\^Օk\49j4K7b훐I8 100644 db.hHk*0ZYʲ6TQ/&BkxSn@[#4B^!ȴi)$P,*8TU~i> VXCNB }̽9~wۊ/3L?EuKIUo'xx5K1"b{av=(nWښ1<s ¶M^+-ՈfcD>L}_׼.Tb [OZ-S4,aCd |9Q5cS27sſcYC6M?K UV\Z gl$9x?.vJ9ڋl<$ϔn _ |PujCY86rv~nGB rqC}ǘ?*DMG!ASq[p( A,&IOX`nI]0T_RK@8<7D/X7MX vIb =k'H  â:6!P]>ZkBA2ёMV nr[:xJ?]XW U%} .HcDG>{Iwx^6Hѡm @^= Zxgp>y% E֓=y'%+*LϫdřTZ\R_VP LS(Jl')قϘ %4((O P1LDx+zAd+;krbNNf=vu\\ʩy)i\ I x340031QK,L/Je(}  {*/;i!DnRbqf^2yC'$>}U0UFUi RI]KMmnuxnСש71;5-3'aْ[J'/둑|g. :x30MJ,L200t ҒI 6x;ʻys,&E)N~X>9EJ($US`2kEX%*U((;ăNUT9NRwq /HԴV,7>k*6(oxk]ͳw/voMx{cCu̻&b8xN!C6uɾ.sّH}x9 W̜sltTL 6hq 3#:ofj% xk}B:wnV^2YCVy{iɲ ȆM$c bo^#{]PSTxP\&k$H.4W KtJb \Aqeq#5 N:~7~K^n``qudwռ}ϮOdU4ge7[󤷳'{n!Ѱ>{ΕsXyjٟ|zj^<.!8ƶJxvmwy(bXso+_4IQAZ2Фkg*1~_V,ih2H>xOՕyelѺ 8 `](x}TMlW֪s!4%18cRAJ*Qn7뷶?j u8.$V$$"䂐*Uc[dZZͷ3|3o-ݿ˭$Q Y %p-Ɍ%Q$d\Hp~D+^~ zp U*j GQwu\ZFXtK?ߔ螩et@+QmR(~RTUIiw^VUR0B˃s̼.` M8>}tTר٦CW"k<O>^,Wu9V ɊV.Νyg Lr@f9~$oK7"齌" m&q Arߒ@P>C.s̈FЊ ߑ d՞9NDwQ"$X%bA$P:;=[U߽ `h+1Ll*Ej*,⏁R- &#s; NE#.|^X(fr-,.DyM;iIX6j'Ny 9Uը')`.)4{fMeS/BܕY|ҷ>G7vO>mh|<`oϡ㟰}Ǜ1E'- +!1:<?x'LǨ٪HOp=HN!xgg(f1en本n8Y1ʔ xôi-뭯_zXU<Љ_<Byxgg((3eGO~V?lc> Wxo23'dWe-j<%E: jIi֛_)ob$ #xYJ]1EGW󿦑H=x\W T"/J{rXk9G@?C03f ;v?2/100644 gen_bpf.hHbIj&(Pҵ$|2?EJ+#gJx7gt@x}]f.Լ4.2xbixa5U9ըu!;ޑH9Fxgg."Qjm_B+D&?plFD&xg4prL8RKJ j> nx1Q6iа<:%$9ǑHLx9 J>7 8 6x{E+PmmVU$ptȓj%rx7w䙲Ɯ>>:\+MNO 6y5 .~ ;9hxA$=b != NULL) {tC} else /act)); . R|wxôiec͛ܘ6G.|?mb %% j}Q\m~hv'E5ѯx340031QK,L/JeHgb6ܕwZ9ڍ%?BT&fe27|wlJ ?OO͋4eg' }~E9iR4E Ixf2nUIQAZ2$4&O~!0#=jȡ h2H>xOՕyelѺ a9 Oxgg.rz5QF.U11;&rҩNjyy$9}mQC3$ yBnƱJb7lǰ&  Gh( g{Ip#M+q3]qOeX\(ҳ8IRڥH'Rtx_/Rϴ.O#:1ʩ.^KYe(P:Kq3MzRșϤPJ YWb+\tj"Wi)dt!f:N%Z*5fFDܪ¤:/Y媐Y4RQB3E3%8!@DY>7)4gS=LО\Y&JTF%U' Nox#_ħaO[eYy3)d^.q8?zGoNNoZ|Cq99}lx%.?^]~>p<=vI=VL3Hb*o\I8[LVč!!i"r]e95,I^b2,38ڷx>ͣA-QE?= TQ亽d8KǫkEOdk w1}Gf 1ty4{#~KFMpK?d`Hyϟ17QJ蒗bfۃ8%X, ILK`2!/Sbew7:*Is%FxD#:GtKi'~rxI.вP\|<;kV-i{(W5^_ږ,M$^dZŪES XIGdKl8 4fcFLLGqUT KAlW.0i4"l#Duv6;2 ܻN::KwLwujǜeZ, M j$'%=;@:_a6q}_%r/;JUӱNsBcMEʘ>俪P}EWLh6%Ykt\qgs|Z:bGMOvL͌*g_@lQ`rvQg`띂Tzl$-ύA&0jNp#,KM ,$P4n᠃]MQ6DL"f,k=| =e۞Ys=yy7Z|8 h~ʢʔ H^ kG%[oDJ-+DjwGV-vPDl2kS 8(<DQgjtJr5A]@t+ YыLDnGkI}fY+PI7& +l,*h^[pm(\У.c}3kz0$-nkA723BI#٠IP\= ތgg>GZU(#'2ucwCY?^8 a8(G@],Z9fے b O3S,(5qTg:K Z6ls-e^|8?>?h#nG)*.cYCе1s>iC{*Ô1\[4w hԢ:IULVZF\^Jn#!=z1h4E ܎HI.3op7 -ϋJ]MQ_/ș=mW0U+|o3M_t+~Pg(.ԜaVC9TH7,q=ջ6׋B}*f4l;&_]':ϖ9''6 >9efo8V4Ld['bCkPF-}W~Xlۮo܇~!lobցo\#\Ɵ|ӻ́ JJOﵭL)a+H]ڥIi>sW1"ذ;TaEzڄ3u[yR=ۑ )]f&Yf 4uHTK {eeʳGX)Q'5'>^6fQFVW}DPДM4.\ORf䲙ܮuŁ}'|ήk-Xm.V^6ԭoU(CԝECBY}C R!&D(%O #\~ܶV?,|qh]Zo膟۶h nMخ v,?ysCVwlSxӈ뤄9Nl;_;cB7$i[!DHTPGnAw5VNIy9N=Dk Ggetܡ`Z!΅5Zȇ4@':pLp;fbM*cڭ!wE͂%{f^H+UA) +{hDn@j&%s⚪GxЪYb;px=[OgK߾OLJk/G~6Y_cQXeIJp+`?mjbsJ_kusU=Ț7⑦qDЊO~ ߅6P_q*.+?V#do?qZ?7A~:1դB_Mgbe!ݾ+AQ?)= ۞V:RWCڐחm}w|%d{/W; [xw䙲Ɯ>>:\+MNO 6y5 .~ WYMSR*589S +sr4}C2KRtԀ*4')˛ qͯ:J Bx[&?Y~r*8D&/gRU T\QS9>{br5z_p2ŧUjrqrƧ%W''h;;:ĻE(d(O6SԊ/ǯ?\g>5x8qB_aW/wi;nTkMx6эDPl榔P &8D/MuE:|Hx340031Q(NMN-`j])ߎ|y`!̜"ZhKs&P?qx[wC@o@<**Lnc99u7#F Cxgg.{y9WlxӋO2ບgii$s-Ah⳦Acη]D<19X5ʄ')7i\BeRecbOw077ӫ/HYy/ tR"/x.{\2}sqyqP5wWgpp=xrzןn?ޞĒ`^3=H3MQ,hH(ƉTc"qH"\c(eY_M&hWGXL2DON O(bZˢ04;<4B v(m,Oud'XQ1e}28Gg;jI{fe-捭_E?ȟQ~BQeRCJ1 =ݭ#w66/qЍ+QFKzpTkB N |dEbCI. 2UB{;FS~ 5 ^.r3Kw17ٺ`~J)ȵleL^+@vcIZPV@;,g! n1Olzy3Fx`HxGBP믝Jnf+w-=9 XwVп,#U`]*,Ԗ/dM : p` pN `ңZ16¯tYwR0r4u{ه:mZFlp/ZNp/sP,³J%r4+̰   B4q#}\`ވ4itm्`7:L^ V|-&tӢc|u|a+v\!|oևG2@[d ad(,hW߲GXOBm'Pw肞JǢ| g.]&I1S. 걃BwpikoPR'(sli*PtSi%~\W1stߐR7'aKu2KʼnR1') AD0@TT+pG 0Yk2jθgRdٙ6Tm")u(:@k-7y6D6j{u0bj[u &>fm^;Xl ِ*Β~uD{T$e$>uQkH{@5b7,f[ 0w8ܱ1Մkflcb ӢMF3uŷ&x撊cQl>͒2,uJ.6,^=ȹ ]wzoC0ouoEChA͸0rb=.:F[$qC5}?PcS_-S-OҽMҿZk) ut@EJZKwXKO v{d7[8^"SWFA`F&Z]NG5wsgbԁoAiu!sci:roOKah}x[gf+.g82MnVgVPP.: GܝI Mn<_Xm1ayI(+LKMQ+QH,J$b\oV%Cx'U ۜ,4YtNըjH)lx{sg;f?f!e%xZS:9+smB Miy/ B<-'.'˄J|!PΔ$jdɭ:)<x%YĔ4CwE:p5akp2/X1Bv/ z5 R)ŀ_9d"Pc& <r WB,[BB,0KP#8%Y(آ4;}p"8QA7xq`Ii0#NB'pPR/3`aED:8"p3C">;퓓vĈ'KnDq(Aw E;'o{?f뜞 }?=O贳}Rg犅QV~Pȇ"vID2f"HT D(2THE57I!!Ykg'#AAqr?л)zF"`#3F,K*ԛE]cbHLL%b<6 "`,C #9SYy^YZaEFr)1ک eʏX@&dHcA۳T 6F*s8xr9;XbFqQ?sQőݢ<`{#]h̩A&)H$Îz"Ks6\ kQN;)z0Dɴߍ#1efR>4^N\ EbÎ2IVC &&qD{G.8 HaRPXPPCl0Eau}hMUSS[κ&UmO0 qnYN1Ns#dX pj |-h_VbIߘX4 %ʂTT-v+9rL9396 i+aJ [}c4:"uRZ29MM9K▤-脴s#f7G`E'EQZg=-/= źDAk3I_n`ÙW3eKfC7mD%0giV6bu1VlFCNsnT_׮ `o $Uu\ϹPsfw|ۀŊ#vY)՚ÆJ~r)Mc-ZHw3o0865ŵOw񩡽wq}Lyü#Ғ:jzRTe,gq FFrD1]*.&#ZF˓_˓12r^<x9Yku4kYMwP];U߇l*U{ߩmYelGAd,a{,ς]Ûy_N5V>z#&Ő|ކd-ODY}D4|0nr)K ~^献2I*QaqrQ|}_#䜲2~Кfn{n{z-6z*)mڜ+g&0}GŤ^~Me]Z)&ajoFN f7dY0!!(XT|92Foam}!y*yHR{mוL̐jO15Ӟ"Пc6/*;ֲٙ3ejc=,=}'TҴ<θҁfyaIoE+͏X+fOIjD {SYLSVWWi,0zi1^G7Eq{'f)FQzYƒޜ7_QlC95n?}򭇱CApmHsZdʉ?XA\'twTvnWp>{5}zV#evTQasqcb3]2mwֳh?9rXEtiͮ%S&o\=eRXZXpenV9f7 &Re/坳,[6S ՋDdxOLpSA Comm s,(,k6]tJ\9&c&uR$z}}b-r^gŬ q,)r+JAɒ@f헢D-!S()8Y1 媢`%@㜪i@5gKQ"_ӫNP-حoM" }}ȠJ ~AE R#ygW-Tҩ$'$VANO^¤x$(*Ɯ-"ֺuo`.p'nGpGrLZ헽ә4,bʩj-i>NgMWI7{$:̛ V%~V8aVftZe5#[q|$l) !CQew ~ l5`/<;/t /î% WCt1՜U2tP|3;N8( ̕Y _3`|] K {8>F5:OY^tS=űQﯮ~bIx{OfԼ,IizEv9yT+ x,]nC3_IQb^qNbI~Q|qIHLk' %d(hgm^ȜX>C~?{qePXS3% !>-(519COG!LM,M),.,IP(\a59Se%ˀ'b85&PҧPg6c4.CƲ3aN>%tWrbNNjJ|d9n)Q$@khs, nVxnx.AnC3{zj^|AZOvzxW,k*OLm=/4.NZ5ŷIݮ!L40000 tests&ӝI8Us{7›{!`(/|(x340031Q(NMN-`4%iM-Wsh(>-3$V4ZRq3į :ϯ#Hnx{Ȼw-f`g߀xGxGp[.N_fLtAx6,k*OLm=/^Ԣ tPw`'QHxgg(2K[OD N|pbc>@ .x{OfԼ,Fo<x6,k*OLm=/PA>9{1߾dnӈHʥx340031QK,L/JeHgb6ܕwZ9ڍ%?BT&fe2xOՕyelѺ UTXTX 4)͎+rwȐ8UXRWX_%Pm죶n .*+56#,5YfNax_6l0PU [ϮrJ$bpf.c;DVpLB8100644 gen_ɺ%E?ycDƈ+xcC&GNfRQbQe|bA^BZfNIjQ|J]RWX__\R*T9@K&OaQ"Yx{qcC93OJ^Bzj^|AZr \o#xqcC3szj ̧1|$=x6,k*OLm=/ \:Tֺ6FS H#xXao6[lvY? C۵s35$ %"I#%YraEݻO[.euFx`2ew+KCϏ{NS{aUVJ˟ Wv <3xjUl(jŚk$"Z))X/r+)$Ұ4UG[ZR]IR n6J9'ίL ME<$ dhVsuoCCtv~b2M$I!`LFW3_Ӈt:8]1Sy+=TΒpFn# 'h<]9·tz1MjSis ߥV ) ._HHr8gEa[ cΨmk2>F-Qi:#jG<9'`<@|C e먒@5M͟o^lx?+LF36en<͔7w D[: /2RD,Ȍk29DGv#7-J4-:_@W?itkH d\rkd-،VwMO0Кr;Tk>Hlꦃػ TKHi& i< v[[m^YaS?vrbGk-Sy{<^GQč0e${`e Oi@ڬddKfI:.o6+*# K6NqWޯZ5 cDǕcgOZqW"pmt|Fl'C-c2*7/gEAע'Hr1`2gi}+M"4ܡߧ.whv.,"cMiGa1&={]eL  Unz[砩/{xk; ;lZL8&a\y\es[Ɂڛ ^;x;{Dw3f/fAԼ Ey[$x;UwC03{zj^|AZD橜@dy1796v9 x6,k*OLm=/lK}3SJE²Hvxa9$RFXgi %vzsGNM@ša]%;Qgj100644 translator_bpf.hvi+*;Og/Lڞ)Bx;WwC03{zj^|AZDdaRHJ q3Pˎ몔Ep/D*eajPczx&N-_d d7C=t4oFOt1OÃcLIj8`5bnt{>4qb2l {Xq횇QB0|>Kq/W0 3q_ܿպgvZ/GmgPf+K2?@ ߁B37O'NՄ_6/lx?.fekKx}$3x6,k*OLm=/eiH-rs2<(*H x340031QK,L/JeHgb6ܕwZ9ڍ%?BT&fe2̉Us>qI*HH)H-Kfz̓RjW},n52v\ݤ+/]5/f߳+:v@ե$yaqoU;|=|û vN\;c36YݖT>'3(2> hPFǝ3]|f TaIQb^qNbI~Q?7͒ۇ({'kZFT8{i;۝bWp@ǧ|\/fUk´k x{cC9:WIx6,k*OLm=/ t 94xM'Ն־őۙHË8xddi,TVcN.م籓/Z@kV z\.}DY100644 translator_str.h<#v4A~۾,lx;{Bw3f/Va"HxVmoHp~@KSF$Dmt=^]CS;$Z"wf}mg-SK3K0r%T48$4&~5̨1M9}˩A2JyHGqB8]Mb2<Ri 7l<cftGe'J1KbDF2.ELnYL9\`w~2v>Eq twJ'pS#]CDSxxX8G\$Sn@"X* E$ev7M'dy'a71 ;z:>jSYډ;KBI:ZU7,β,;f9W2,j3Æ"}ա2l44+skTnA},![0]iƩL+jԢ{UfAs f˥YoM`ˏwb9Ln?p =pߏnj iAK}S4Vx$I >Zhz; / bDqMX%-Y.L7g3H 9>PXӚ>%u )wS,S@8{B79_VK<$d -gשL!gT.@Ԏ- Yb I%t* E/"ZodqoKi$GkrqdBHZn3<޼q颡1mpώ:(")4 MSU6uW(_h·p0I05̆)QE 6FHomTU <0 I#87I~q,L1eV'S։{'S'a~~.y(gF[Q}C]{\q+U1ueQ%!`?SP@S3DxVpʦ8BG g̺NfEb/ΏIdߙuB{OC3 %ߞSpO?=v^q8,jzr*idff/4{:tcnqj=Nlb`YN9lm v<6:)*BlmfhnշCd{էP1BYђ#O$Qz*l x['\n!f oZe6xSn0Ң*Vf+(HPTqX2vd; ~aWtw3&x<5=(Sf b|^mvj5|>ANsuÑDH%NdC{F /h^H;q޶$=l4€g*@Z=G>$mq$5ďXy[mF V ! G>e,*~-"0f_ )=sbIi0xj!rޖV;|dy7\#]ԡ׊ +YWDxs~.rf(WӢl#&vlͺ&DZK{K BiGW㙝đxE #sh88w<m9zQ&7- L L͐XOħ/5OJ6Xf:2[>Vi 7JIw3)Q>EAϥ&@u cY? ap0kQkx{m(df`x6,k*OLm=/Gvër>j${^Hcx340031QK,L/JeHgb6ܕwZ9ڍ%?BT&fe27|S;/:y1TMRAZ|FjNAj^2to{#=\wgZ>K\#JJ3Jc.(sRMPٟqR&׉ALڸ6Y87;bљcV ?Ttb4@LA0_;!Lum舴 g\*2) Ljg˔}IKDr _I`6i|ED,m ,87.2a6 * nQ O@,ʈ7e²!z*wk2 $z$) K ̅^z T|Q mT,ڿȺ#PWJFR!  qSI|6IvZɨʼQCF3eJmӋaaX(Ŋ&ɴF*R_XW/-~ {sJy-}FTE%5͌WH[83v]5ՃQ0PVN`QŴ:ʄ N| y}Y~F29f 뮮+(t?avz:8dZWeh6Agroܕand" ղHf_$*F]G-50#ņE! eT±;upmi"|'-k0\y mJgt8ֿʯsn֖9Wp#-=zsPW$j͏цUFUHզwZqxD@d7O>f1pCߠ pCYpٺi\L>R6 ?gWYĄCx6,k*OLm=/E> 9&@e(A$ÊPHZ9x;|yZ ,!'޽ظtaׅogx[;w6 7'Ox6,k*OLm=/[4~ tO_H? x;|y&Hࡘi{|kpoǓi `<#gx?5u*jfAbDcx6,k*OLm=/lfgR;+s~ÑH¢C x;|y&l#[ߝ#wM2'Kl!m9NEm_LF x6,k*OLm=/[gvZ&HOIx;|y&{vG>Xl lJ<+ nɂb)x;wo#dgviO6{q0d>X&x6,k*OLm=/.{u\Ӥ( >5U+Hcx;|y&;M~9,j3m,(691 dCx;7o#dgvim^\)iy Iiy): 1\) 3757RC (/DBSGAMHgViL'diTnnʤi=y|"j(]+j x7ofu,͓Y:Cx6,k*OLm=/M.)"HP;‘HAx;|yBH3"~{Ng[ {qxivl1Z|2@gSx6,k*OLm=/xb'  MbH&x;|y_7e}f*\ZJɂ#Cxkӻ!mͻ؞2n2dexW5Bgdx0t\"o/4Rq|O5=3o40000 tests=!d.vIՏ('nx340031Q(NMN-`(`QCps+έ3DQSZT+-tssWdSlLx[gwZ#u+xADۈYAᰚ:=8?`xkӻ K~Bdv['۱0M.aRR(/I\,e攤)$*d+L>~g!> x340031QK,L/Je(}  {*/;i!DnRbqf^2ƥGԏ)u9|R[TATT5\y?sgKoSoJԴ̜TeKn)+_GFN?+x[ƾ}C3KQjqP.N!xkmݐRZ9Y2J.#xͣsFdK` H=*x;|y&[ ʒ34,(691 lIx7oD͓Y$#xX }Uy*j2Hٻ(vx;|y&hB> g]3u `< %,vxF&100644 .gitignore+_"8ԑ&X }Uy*j2H(xK(3K$=DW+89 UO L xBOSļc.n`H Vx$)F۱ekVBLBʓSn20cx;o#dgvim^\)iy Iiy): 1\) 3757RC (/DBSGAMHgViL'diTnnʤi=y|L :2El&[ o1uD0>1Sa+ ^AG%0C'ןJf)+=9[vVn#BnN&FG4*Ur0!O5&FfgOx ӈ/ПnqpH#x$)<1ݾ|WSn=/uMx[o\~/-up 5x4i.ٍV}8>BIjqI1gQغ~>h=YQx340031QMNMIe0_o*w_tcCԜ"d'"9uqkzim6x9d壹cwMD cNGU$I eCo,e^x['7Wv2gbrIf~jd.;⒢xԴZԜT.5|ڛm&[8Y_Dx340031Q00MJ,LKfx¸1./3v^jC*#*݂4>uj̫3W,5(U雘ʰl-e%ϗH>3(,lRxky{X&{j?'G@Z- x340031Qrutuex6M9{wk+qIOD0x hxU1@ECB,&v X .$r Z {qlgw篥#: 5lQKq- a`E:p*(S)xJU-ŒP'ƣ4p\n*C2-/Bm"(LbFZ7gEIx340031Q(N-/,/J-)K-3dP+l)iȐMreΏv׎wx$@l 6IbcK %##5II!1/|͞ ~Ix;!r_dC&`bQrnq^9) Ѐrx#sJvL9X9&g KX0ɊXV8c"fy^[Fx%Gx;%;k|&⒔$ Ɍr9y)%;؋32&cO,JΈOIM/HMRU+N}==\t`2Ii@YP4H8*$r76 d&$\\< QU$/H-;2eRRH/R/JUHI-I)(R5UAKK93-/%5M!1#>#ރKKE*K)MIUPJ,JP˺:hg&i5:RR2Ӹ4ЖNx;{UC;LY92J2ぼ>g(pqrr*Aq䋼 բ983434usS5AAfL#pCAM b#,83&1YPTw 1Sq)f -x;e27Sƌ5ghh*Tsq&'('%ggL)?yڪ4$B :1 ꣠Z!6d,L)-/, +ZAL ߳:ϙ (.ѶUR ʮT ,vVe7rѷyxWsE@AH#Ax̲l GBX$T"`Й͎Y#ey(P-9X%VY^7,.=I6h}{ lnGt~^f3V?/m1,̷s|4}vM'8mQ SU:T[rD9ͷ j;yyZubr_h0JڪJij해 #3W Y:xw}]99b0*6 ̀ZC% BX`-\Fý _14`ĝ# x̤AFq LJ#tv8I\.97%y*v*tR{zi:‰Xu 0q[`[;(f頜$WK<|4*yKQU~pprəS(wGEe~Wto{Ύߘ8Nb $)&gW "fA7nZm8+jqQۨG[᩺ot´Pkg~-V7{ 7)l(&ЫK!ei7oa,>yHݣ=*2!7ݏ3^J!.xpOI-ҡ}#q${$!A]1$kѲS> Ղ|%C$W("rMmQ:{9% ]A^o+^>]HSem040Y2N159?6EQ8J--I}w1,p '7%G&=GΫ&o&̃:ԳS?8ep^X?NX9ss4PwtR=;)؄⧓OЀg!Ґ{˶-'Ѿ-Q(3rlwҀ8 ͑NDAn%|}LC@8 ) h{s!LAVI\/u[rR_Zgzx=-7$roq;RH4f Q,dbǡC6@XDfH^vX>,*ڸe9vy%R|VkAYIGi ]l|edfh#̲ܸF;cEHs0Fpo K/ P̥D3o f咝-rTaY'Nە0nHh(>߸1P#ɥMpoL[qz j≩yz0rT">SB;X :ovx&~[ɐ+U?M7 J2 $vEIV=ߏ!ɉ!i>0@c%\;@-Nl7k4 i@`-$S&Ogk!@ZI\gU[963~ z"a&zGi8ݷUk) D8}?/[qCFd~D" UDO4Z5{M]?3קk/$,!yJ4k!wA rc44k~nHX6ԶDH2Sa#F͉A{Y׍c"sr^Dž1MphBdt>F>>5lNWӛ\t-è6RtW}jKNR05/a}"j#77uV;s}x'G+kᢖ4'eqkt{dgz_tx@=xo_l{QÑ,q%ektU5%s5_} (̗Lx;ߟaaW'+.N΢ԒҢ<Ԥ "p5onˑxó+Sq)}gʵ@xWs$7@n!@ K!ۗ5wM$@!܄%k;رR;.c;ڱbttNGEˌ(uԖij.jyoy{ӜVn LLTm97ڍR\H Y 9_ٗʌuTMy޺5%XNR,DQNJwk`*7;BnJ{G^gykqTSwN@ v1aKV1.͏;\/G~EZ\/'7YgKCFj1yI:/N_g,I%$ y1Eób `:c[M Tfoz`rtإ35'oIh,tagB떚H/ U™|1]{K[ɢXfѢl-ƭ"n,!ܻI^Z⁅&żi:XQbKpj9#Kxc9o*XU&$1J&K )WUț|_$[[ R\]+ew\[ il6*;;PZ) 78T7aMp4\D[M~@HbRCl[w%Z2~^]h;c"~TXl%2UG3ܧb-Ly@k-qPЧ't 78mm r զp¨93kTY!$6٭):v3>;w6 f۲Qyq#=8Ω}a>KxDDDl'<:LoG]~ QlҸ+CӐ& xޟ"πz–- ̷nK;^ HD`5 B;C<@Sm(aQt "[ā"I W# R-Q+Q>W[@q(¹X.X%>$[ݸ3׭^hc!1-Hj[qT-x_౎ {bʸ,rғp0ف%m-. M@띺uL8;…T;L%mOL{koǦ4aEZcD;wIwd 2QgFرq*H rdntrvq)zRW1ս/waTl&ɘL oKmHnoŷҪ;|YzwqvGWv'5i]%]¢.A.͓ս\dlC~\퍠|7ߋn&5E?ƵATJGqÛRlŹGTh8Wjս)KT8Tf_36$ly_tP9-8\QkeEVqc@HQ0>C3Cu36chd0T~1¨ӱ91G[qz4Dxc1S1 sc|o1c-r?^O`+R}8?(8 RGCh́'"(87PF1{0 c`sLx;'Y숑/OrRI;Opy٢RSqӘ ws\֢Y!`wJƵCa0-,L qĭiQ-x2G!ÝL$ 윝?8>3efnj[gmó{,Jn\=y8b7GxGI#)_~T#~r4OF`w r,#3G8' _r]&^ŵ@>U%?&"x[}{ SqfA&v̼ ł|#ȁ>x[YqK 'o`f Y X#x;oC\޹ehFB^^rUL100644 scmp_bpf_sim.cÒ4]Uz$U:u=l6_12iӥT,"/Eix&kzv~`W'+.NN΂̼4 ԤJh“5R;P¬rxoASB|))T HnBTlaq];=Izӣ7ObOƙ4m5n77{3/^9׹%C|KU5qG[`:Jk(rgA g~Է^[m|^ɺgk+NܮT]%3skE`R])('lX2X^3dE]^Y첂E MOᙿE2LHAkJL:E,JDʢ\}j2#|#M,{ꜩlrщ41]։3i% z1’D% ":RH- hKDJ,hD.]q:zV1Letd v|総-19/+:zM, UEB&=1@4mG"cnE[HGJrnmў w>4O}qo2vL±oxoA~aj%6P%׀k(μ&;so$uSCX{aYf֭ 2>%U}˃B@hU ;ޠvQw6xM0sd˒+&Bȿm!k^?ΠBk7۵d[Ʊ(z]IqH`-bk8j&զ6 UY]I+U[DM#X 8X}:viإ PmX%P0Fw)a_o*=)%n2'AOS@a,pRS.A2#nwǔؖK vڸ xB5" >2.j|(3ƕg^Y)Xҥ986A::t ]D2gc"#Y#{rQ9/&|4O9d߽BYX6X1 nδvNhFF)7\6goۚڙͼ+f':x 0 @ ALb;;@N<H%V LtL˶F̉{pAmN%hX;RAW>}6#Ëa.d`HPMC۾%f_s2~/!'xQn0+$vժp$@@j%ab;Ս''{exf{#?slF-T/N{Հf_NTb`=jE[FZ2]Q p;$vnt3#\(UY5.w )1 Qp\ټ5ڴkUHY!Vj z. Ǔ?5z`a]#`8`# %ń, B$y(TݜfG>'5$.!ZK%Pb5 C?+ڗ_mXGǧK ވN?$FN3| 4#? |?ٿ4_ x@ P}>U:6H>HHS8>PDQ,nL{8쥶-)gSTk12h!jѻ ٪8i@+2!j%4"RGE?כ&rok Y'v2\P^ }ߝ汘4M7x 0 @!Yɉc7ᤶx!ua Loz׽M5hvHBʱ1  /]|b"ISgJ sɸULcʼnpk[< LxĻ 0P!(P8/ Ÿ(qlWn d8 -2e,C(?r_T`4\V*b]9j _/q '[NXأA>EuS|a(8W{k/xAK0^%m6,zPN6iJ.ޮɃ^bi4EkRD1Z+YfԂk҅4RUyLhP[c3`DBVI QK 7\rΔwH^q@}wB]Y ao1X?O4v8L ƉfW{9_p ajkp"|[Ւ{2fDl[ <0v]^^9`"xPKk0W 9%/~(,eM %/@z[լ5FI+=^OC|1 B%e)ڶ1BV /MmRW5RTk6>jk5:.KmkeeFjF2Ƒ}Ű:]ܿ/ƫ ?CkQM ʮ,ir1bG( ( l+kVJ(J̒”>vus}xΛ<,h~>`ƃ`DhhG-G.N:Sؒ怩IS0cL @l}{~[W8anA#)iYF')܏HC7Єas䓘98T;vGbdI{$&;!r>$~Y3Z^15_g~L!ŭּ_x˱ @ @E S0M6xEEhG2H,(Uw 0okĔ+R$S VzFPW[MXB `D~-I0ugfߏ}"<)xQn0<_?@ ))(q)1HA__a^Zs坮Q-6qmmQֵkd1+ NJ6׽T}-h6.)=w9= !nd#j2)sW wc&#yB2 i`S$* o%죏gN$\- ,.+EVWY(AI׀fCؿ Bq$RMNu|< JsZ|ti-9l9L9/[w<^ƲlJ0!(kiy/yn/M%14E-[FcirD+N7?Fp2Xz3?!2TJ"W9ZTӺ?/8W*S@!GĂ&>7j] xN0E''iUJ,`J< pC$qp&=nABb=W3C] Y^\jLdjmm2)VuYڨ4*Sd8ȴVrrÔM&[)lӬ(`zy8n4jؐ{:Mq$yBy\BzK{7'44>~i֝3.<ۍ@&\rwc8w@/lWI LܓC`F9#|/|7c˫CW-_G؍,R:i^NWxKj@Ds|zzF&ׁO0 y4ZdSQ}a_[WIFMXs19 gI$V=# E#ȗX.4F!֨W&lmax|0[i1D$4jubEc/Vi:2\`ωW;ס yS~nY55xR]0|~>@,Mr sZb Uk g!fv#'%`}ب>odUs>jS-;s(UQ g!HV4maVh W}19sM5W? pwPmUu iVgC >9;a8"llg #wmYuC'qA"I<ĕ_@c ="c~ƈQ#P˓A=; =K#/~{Q먵K4γuшqHanc$9h;/WN(hUt3#A8ɠ_T@|f잔Fk "AAn-Ũx=:[{u] d6>\0!J{)cHg_u'+b!Qt7x]0 +|HX-]&4@ I:M6j>JnR@Eصv#"h QRby9UԕFjM"9D]7ZuZܕGGVbR5Mەu[21!Dd x8 c2wPr^ fcu&gp >DrpuQHu=8rxfH$0%22v0 u!e=P=y~8e<|fm@AfaЛ+7HL'FL,O9P+s"tCā@[ }H5&YK=ّT$o`ћd4SfS j h DA`!nLJlRQ4 JnšL/Fiɸ"giRk_4_F!W{TEк/F^Dρf UűCٲ2xMj0:\@EƖBɾ =D?lY)+/E7 >=8sJ#Vw8D-uPl ѢDZ3DkOѣNKliߦ{\|L1=z2*v:A@P5C{0훥zmu?go} 7qxMj0F:\A?dP/BO iFm G,E7b 7^!Z:Kn6xJΕ\ ~\c{nϮ5 Oh{-O&!>u%JJ]O)[ n&xQj@}߯jK!BmL4آ~{E+"rM4yfs8EagH"A$KdHe2(Q<:Ȓ"RyYaƔv)Q\fͮجAkp3v)qY?AYǴ`ESJߎsh#=2㺿L0ThvQ lI GؗO헺4l6ۺnP s |vHH?o9u3x}U޶no|vWߡS8ĬE>- t~{GL)xv ?q= l$ їF}S=V_^)[(WVtfXy ԑ1xRn0+bW4(nhP$`DBG ),].ːo0z"TS^5eR}XygUQZ9eRMEh6H7EW)uE&9̞z2lƥ<*Ӵ.ҢMRPy5ks-c~q^Dzg+L74Ûw#h=` Zp 4 Ɵ EݬTgmW'Er pc 8yo;tG/Ju6a?b Ep/_|{3Lj2zzDc6J=oXoO,E:mW)S[)Q`xN0 E /a*ͣiG!!!GNh( X:k!YP0Ja )֤!х  hcUơvR! n#8ÏyWG~rAwQs5I%t|䜵ko`)^a#[mO@t1Z1UwlLX rbux1 Zog%']Ch XfFEY)i䅶z[bRn x><w/xʱ0 ]`,ɲ\1 lIe.DZ -B ?J뾹O:Fj 1gJx}1/jTZث0܎8? 7#rxAj0E:샃d[B.K ci8e#K>IMQr*.馛?x"RF@PiDE-M0 [5 B\(4 .ms1GO s-E^TJsXvq&?i ج8mКeKYM >v΅?e؟MQU_/_aE)&YT/jKqrTsq\M`o!w1R lm ,ÑIXGj5cƌ4ȖI!{Cx=N1 @>fL&^%=\NvdB@l7*X;UB6r+$Dv;MPѫ-XuYQzPkJls^i<{[/C #kΩ?> =?ܺޘMk]ǹqV]m?xmSқhܙԏ2,`pnS O&$iFh4M-pI%0JI䘔"J,#+8:S8-ǫZ ވ/EU14&e쿞Կd]3CS, 1 bq}AVl)^|G߇tK-XgSYxG9Fx^^{,.[L/lYiR_#[x~d)AO~+9^+ln#Q1q7tRDT#yO5sԚ忱1un\q{6'O$`iS[lo"ywXNLFrV+)N׶g>\>GԸJz 7^Ejdv(~?[$ J&?UKd^&YdjjiQH[F=۪'0rJqsIe6ðkq+qPu'@̛ DPu]V$(L@a.oeGa2y?⻇B[W- L˷qUQeQVQ)o_ቚj`o.Hag;55_W,Q{n>q<'b.z(yRb|XXC!pށNoG e"9!/EhC:E'DžC;dCۇBK?xmSɮVw'z!$ƄfNSȅ{}]+ےdwep“X*crɔ"Ks(e|.HŐ%Yet`>x lWlj|/l3?7b(~F))IA$a[9/-z~ , 1Y[M;ʤ>G M(kp{@Ca*b??"y+F~ 55^3GZ#F[ k Yiɽ0Jt,7~drcFrPh[se|]zk!sUNb\5?i{)aZԉtcQ~Nc^D8Q#m&(=?{._N|oeT JZ/z#iE͋O(V\oJ:%UFy;qjsxyAfP<ɬ_Sl< ֏~*Od]S{w "7>G BΜURڒj0PWNN:/Rncwƚn󰹏Xcfͅw:|.?-O"+rJ}a᲻M{dsASJ0ޫN׾|\0>gJE[**Y;5Zq,k(7֫s.yϙL4ۇؼ$m]Y~ KIK 榯ATt-;|&Z<Ju(0fL;BI"߇C8?xmSGϣX+Z CCyPv,ے}3*\pxg-0T *Pr@Sše*,x[/݂-yo?e[x nː,~Мc/Nsyp7( ١ 'dU7m]<0u[ +ǰ;]dIIZ>1#ZxA45 +P\4*o%B)IB'=nIo䒾aT,[daV-[7٢tBn;Ey.]0qߛpc$'/>T6;|dKI$hEp/ƇԊ b*QzY˧iXŴW8lpcPtrN_fRr "m)TLl~ب{c̋>".&J<T (n1?w#K8-b@r&a3sD>ֳLk@HSJM aqo髭h H^וֹcist}{ل- Qsd.wښ !`&NQ!KDU󾻞zZg%9{k@2$_6iޢ_58g+v{oT%/R>?AxJC1yE/'7)"H] $'{Soo>azcYGh>k bɜbT2cH<*L))eԡI6` tSmQضP ӯ{C=HgњQ+t. y ONL\L_ j}y༪yGq&n ]srVو bOś8odxqxKN1D>E/a1H $iQ28ܞHpIJJO7fP:5RfbL4bQ{Y8iB1_:X5jꘒQdK 68Z]z]6oՆt wYAz)Ž] "Wuİx}y?g0^8am4qk7Xg:qrg+L Nٙ8bv4lψV::{zvxOK1vIfPAl=xȟ6dJ6+BOey%#,oƹ Mg7\H6-;茩Fq(FVv؛hLeO^(#,}uU< x k[ٴ\4Pq9;їa)aY( (k$0GvZ4QN }9fm|8^'|ځOy{}ܾ1񻄮qq]>O܅`?@CZ9["xN1D{~َo틢(HQ@PE|,#4PefyV!dL&Ϩ{MC=>D9DLN >dH輔59k}c;,VH.StZ%@QNA褕R,mNqᩖL`J^i_*'KJxL?.iaoi9t%_67(En)xQKk0W 9%KkrHKBhh KO,zb2WKe>fL*4@9ESeiEEEQJSZ+J&9A4,(J`# Z4eMQ2 cFy| 㫄臼;n,ug9k(HB#~D 1\uoPmLQΧC\GǀB@ﷻS{~?ܷOoq>2#(t `SEKO`bKFGv)ٰkpNz[f&:X/ jLTࢩ3nFXJT\ כxAj0E:\FȲBɲ F#6,#˥}*v3y|>/'@K$=[2JƒPlѣa$J-pbkVEw4nCA{c7gx19%_ wPs Oh,R]9@cDh-W]PeRuv130=Zq[N0$U%K08Mq$n1턱KLL 6=$a#0te` =^{_iuܔl{r?)0Ƹ(N.@&=k19v ;\Q+&/A9IOGrAN ك\?{4ʀoO5:̹zkӼe ޾%;YqnN7-Uhj!e語%xRMo +vcUT%\*Ei5m,+lzȭ{w2T=`ΜtɒZKmX135uժwYtk45VFcL;pq>}Lh':8SۘNARR3?`ʜ at= x <-NS6%2rr } -RVaڅ.@4!; #Uu)a7S}US!re)a~ă}7n1ܭ%ߏünH8]Î_:9{ev}PK+?oK]*rɭ%xQ0 ؐlE9 %i gK#{7ER% A G#ص I6TjîQ1эOc)5)C)*NrHShl*ۮڔlxB d7 \w[ T]VA&)EBL__z?]|@=*)r||ۻR|l' qzPk{L⪯zh ٿ:&>ʟӪw` k$+zId2`NB@}İAXn˅xNid~a{f=s_pɧw5do ~Lj%xQn!slz ˲9꥗Hһ3llbكUߋRzj/޼7W Lƒ碟HKiU/È@>3JSF 2zOGe2n <abC. {fހ얜. VfT#l9kh R9ג##¶~v;ށK.\GZ $X5yByoN}#P?joІCPa A=P! 0Ր$1M獽<ǎس;6U ܜv]M7_&Bɵϗ Ɓ[`dҤ\j E\Jl~`{ xPN0+VHqW 4#ǩԿ-=\V3IXT  )hBt)Bɤ# \í"&3De\2ԕ8RfVPԅz-rbkg(kA)q(hM)Sa} NG uwv!j9vs . D !u9r޳myex?"Cq egXflϮ.@i5גU. |Z#"maΛ?Ӹ/`;k=6s'F:tN*J(S ƍlʶ|`xOK0 {?Ezc!ɛ 6+n:o %_ I-DIqCD@)AwG{ҭ$]g +XI:<9Iq^E.Cí^rgFxʹ-{pf: '{Zh4l[WT+:lHgyvN-+ARВ48#5J}ư6]Ô53;@)nFKf M?M\*%Op=6D UÎw[ G􁃃%!!!nc4lW'Q 5 185+j akI4]9K(-AB(w X}(l?nq{7_?Np_so 2k9<)m aC 4xm=`wPv:xT1~Ȅㆼs*RWeF3 .&oڧ`x|L.#XzbOkع>yWcxF oc^#a3f`ǰo͚ӴTid=_!. 2ч8:#nEf^K!FRjUFRCӗ&xQMk0W̱xd˖R6@J)fsQI2raћ7O39"6B0E(L VƠ\d`HKE44L4T3\Q<_}0i{8O;O@qFi]CUuMJv9cc!YQ>y7\CL2Le-L~!)U %n_?w%8 da.aI$T(RN7`Cl7/2/o`V+jԛz?-h\̍ܙTl2"\vTxbX3`+ \nSk'9R{c˻ZPᄖQ[lh,Hm#xN0~+@jMW!,@7I΢oSZ6l.)ZK'-oBY$IDٌrBjfݢn'G%å1_\x1BN(*p9[c(|^R|"<8n)&&c(b@9:z)LGɭ)GUByY .)T_8\o8Ϭ[R漯 Lv-s5+C8N69Obh 2L.6 ߴ֕Ngh]hTD}7`wյȸ# X*dd R|;˶(S3V^xj0 .(RF`{ّҤ;/c7B:|dfeD6@޵LUN;2HHOXu,v([fԆjt.]4P9KwڤL*A٠s a!bRC) ~e籥P{OU-6] ^SJa=Nf.a6q[8q:av81s!6bMa9?JmdATt7Ԉ0xRۊ0}|f^yhM&8Ȍ80zO۔4x`3K&bBkd*HQ In$Qe  W9C+LM5&UFEVRIՈϡu޻^{p\y.;J?Z-$ab!g@AOaj;;li2>ܰe)\Հ\," G?+!89K ӫi ީYj`\׹b`(xÓ L4iC#̃ pv~B7˵Nx جPŔ%qŲyE3Elrytp p\\-" -Kq[WJ=r$o'0: " f|~8kj:c|πGuQ92[[m9W/+B)jAkUթN5]]hk[0ʦ6M;-xRMo gg6R_\.xş>~˰b1C3xD;Bhϗm'MώTZ?g|QuafJ 3ZT9w+cUvN` 5:[Bvo ,ԣ+xRMo +T7`DQЪR0hYv}!)R{Ac73@B6R+yZ6xhM04H4}'jR4c7"ff'n{~_j)Nz*r2ؔ?ke2 j@DUMV87)ߊ q%R-&4AGePƳD[MAߋO̠'(xRˎ }C0~ZE{4]E9chlg2ƓHQ.ꮮ&DժƔ]-m-lՊR6碒` &he]K^Sص*;AnJ0xvo-u0<‡mU */k8sE3<{7r^EA;}+_\f~~@ܔpuij5NJί}٭A=Җy%[#bUe4!\}06zȡ8HV<'fwOw'2(CAa-x%BG8%JoB6[ثW4goy=Tfk}pl ܇B[ FH-W(9ZЗSҶGjvgxPj0+l%ZJ(9z=rDcHrK{7o^IB{66)ӲF(:*Yl¹ )}^RW(D9FZ1)|"#y]Xblc_JNDב>NS(zS afڀGK a)-^ުw̄@`'+ sYrƌO 8 ˚Ց\l..- Ot084=^o_=/vY)xQn0+$@d^1!h&"0VR,Ew@{!˙aD`2%B4Y$yS]YVQ^IQ  3t׹k4q2~JTR8DcaCK~Ws+ϠID)d!6p`'\#sc(fk\R27a` %P_3Cppm@dB9C^׆~nn0Sbgg#OX#}=GpS8Ez g7u$q+!^ں*rDuiҙ93YpBgWsu(~6ݣ%Iso8.!/oۢpg)}B۟{_/۟(x[k0 )D_89R:cPދ/iiwlII9!C.(cc sӆuJYx:;8E'3*k(rm;Fwq)Ek(7ux3\=6ocmt \rΤ*JIN!gLŘbO5wV(Z% h-)m#>ijqAu{ww fxㆄ|)Nzݳs7}lm9G൬%qWȃ +sVF!z["u]XJ%B.A(nSYF|O+ \9c8}eNYG_ a\psU#nۣOyp;sybHt—h%vݧv}D;E'mԍG4_ k&;ܽ3/[j>]خNLaL^m^#cWARցDΩah'pՍQG f\:*h5( d>G[TZH^-<#~ig;\5(e3=4kze˭bFyٖWW |'+ʌ$6gd8]& ! :\І]2^)z-oUR2ޕF9"dT1Pzc=28d{{$&K֚m`J[^ ./o=$ׯ:7axAn Eb.aO.0X)BTjnD._7Do--biBd)pj.68K CZhHC,$Kpn>z< /Z%+7! .`^kX:ߠ^ GRsW* \.xRn0+`zQI ,ɕDDʍcs!pS JʪӺRۦmQb)`9"r!Ԉ2RRZJLSj2k|_~O^4#퍟>CrngTR F'xuMO[Yٴ-Y+7GxLr~䷒%sXGzFk=k].W tnloqL' \w$'Nna 18zL`^'͚SZZ# )-x8. >v`SŸR<Y! ٝ>Q3s}][ !nܴufn mk;kVEW1K+tT!xN0 y aSҴi:Mw&h* L{{#ǿ8s"swdžڹFJ*F֚͘hʀȝn4bm#L'Q(k\9=1#c"ſ:p lL Tۮjּ朕h9خoRuZ y x2*zYxS930\o3)ߘd=; cO@vܥ0!r vIS!sgꯡ0a)Wރye݈RW̸XM%K*Ro!p*~ =Δ7aq\p])UP+6~ 1x2dO~s+Cx^9 +jw`>To>\߀VJ#UghHD52㠝S#Y9kn;T%xMo QNaW|GQFz`[k pW7^a(<:e;|-(:u!m%3& Fh7$xͥ1uZ6Nsv^U 2Lc"x<-&m Ahixt#a+٪O1Zq~cY?a\OPxesg?K-e8@&M {r^V=e ue9zWP.t")G@zWBǗ?9is]YLehK3lOvݟ8ca?ܲNboc?DJkݏaemѯ~+`RITTJV$mA]ZKGo6;Z,xOo |ў6KKJ=ðF }jὧ̤@rheyWKUٗZ=}f 4%]5hNkNJv56R!T 4p@4vV8IhDǫ5y9UgRfы%)%~Kq^&{\\ Ha$TΌm4!ߓW0̫sndLa$r]Tqs% &Ea}b]!~ &r@O]Ÿ8|_B/Ya~ArD20;uF'#z7G)yw/9i?~˔^1`ls9>Rv臦GD(Z1Jc٪k.Z%̔3xRMk1 WRhYBI% ]Y{x6M}5^Z0–ޓdH]Q7M!*SIm_.IU⌑|UJĦ3Wtuݴ^KqeAѦzKC8x !ܞ~lZ;/7E7Ew^w)qcӼr\!H# z58@i8{A7>M0aqFH":x7zo#^| kߪ87Ä8pPtQ\I9;!~42=f;Y yu:K\IZLp.<5^Y5:goWb`؍cn!;Ob Y@mb)[foEWԄ'V1:]Wa&L' {Y#ϑue&NFuy6]mQ,ʦݷR_m]F#xN0~9]oU"mhlI"83k]u9E(),o䤐VkRҵlHSֈֶ;JpҕV #E* ܇ pB$r=6ؚ03)ZNIsVϙ6enL)s@k!-bW=߻~;th: G=c]0K d{yKYlzJp>i\|$6#3   1ari}]#ٍ~9.pÈpøW!_i*Dpc?! hh5;cUTDjMg+O !&xQn0+R"i4S"6(m>sbw3C@1y7U[2j˶؄\#MJ^j#JNbB>7p'`)k(?~.ZEQ x9Khc6m]TEevVD3,uGX=fJH8,43P%vX_*qdi?|9vݡ}=.g c/^o>:gdK:}=31Y=-t~n7Tkd`.11ֿ"f'֐L҃@_֕)D!V6jsmŹ"J~`/Nxn0 y M4Ahb퀄^ MhHx}X/}df@ӒFڸJVhUyTu#} n"1FFvs0 TS:)9e8y}Ja;.^V.]oP)TC+$D/ɶKڦy"=y(87{n<)( ~6"|mXؖKٺ()_ꯄBn>x'2VRQ{eVZ1!7H_xMj0F:\A֟Jk@zFnLH24fnV FKt Hx2i BKR5N5p%&'4*9{RY '.+qpȹؕu?F`sz˕JAlij-x,MeAZbJ _`cy)%-xb_u>r+®崹<}Gv>o! pљ$xj0z96]d[Z!lhz6/0"rC>rSrh)aߠdf^vv8%ҵ7;U<{q̱v^:̠^zMZeL 9XJ:e&i iMe*ka's(3<:CJ\͛i^Ua9O edʸ:JHq`)X: X?_abz‚nby?yO`sbSM {!Sd%w?sʅ |{ U4ٮHVV;QQ#eӴةcm/im!xN1 E|K(vy9 B*hęؙ2OWA\8-%MU(eǭA`ԱD^ B/mH[cmnu;HII--R4]Ng˒u2#]ACjI%K >pyv&|VTc9n5 Ĺ4k^ؚn?q[m)K, :C90۶؋c /e FM칆42L\rt^8w)}C\,N<4K}ӑ zxSM0W̉mrbт$${Z8q;.y&Y*!@C{N#"HsSY/mbe-m ut]jlP# D!#F ͅQ,k4SS:>ޏS鋂]ӡ{Y˽䵬`+U;QM>0"?n.\y]e\I\B joyg5?Dp=qQŎw1!#O Tn<7`5m }gh@:26x9<7oZB\6o.zt8.b''(4'OإP3{C0b.DcU:MGQEiISGGCX^Wd}}`W_o м=kRf /bqɷhܡG no5w0&| OBZBamMMQsݖ(U܊LwB֜!xMN0>,aȮ۩*T@B*ϸH8Xf1yfrB+s㼤J;Xd< 2:TM:A[U([AZ)J[-wZ4kZ&tDOySu~ӰαmV67R(FRR> ^s a}(fn~Y%`.,IqaԦCx=pD/ vðGtu;Nf5g:5S!'68`P 8g"dvE~a'K !|sjpVRV+E-C0Ne{/|#ekמ#xMk1sLhm]IkS|k/VJIve$mL}8K{xy$"hPdڃ=R)*O6à 삉$FQ몬= 2O݈9 <9]?Еo>sVT %x5Ctݼtg`eeY~CG@Ge{x1<F`m< \)!G1C^/XM$1NJ{ƞa!}o;DJmsK3S~|1 7ñb+\ _}y3Su>\BB%w[/,ݼf"xj0FE^:Rа2Ʊ1e߾r~Ji4|s@vm{X{jB+kj1c)F;ԻQLMVi[jK8.#\،kcky USuM+`#tG3}k%_Yئ+Xfx;|;~?}?NAf4@"D 0AXrϜ79GWD 5P K`yys)I\2 9>#D&-+[}xv1_^d&:Im7G{ɭGLnc.W#F1AIA^a2܇ ͹+^xɹ.?ޥKbrza`Fɥk֦Mzm,pY{h3AZIJg/tGN\rvF8v#sAdnDk"CqxMN0F>\ Į*%$\`biԸ'a3y櫅IG$RQ9n'FX%8gMc?-˖qsJ8L5Mk{H_~p9:~}f*ozr5xu[H1 EaMl "ڍ֗ (JPK~ݘ|̈d X["܄cF Y&e# R\RPC37L=$&ǦaBaf&ѵs"&)cf iDH4 \Ip`uT=[{^v?2%{/cݲt G#0԰)O*ږI,٥E{h  ejx8Աmgl۱D'8q!ΧA`{۵*u]qDj0SɅ•EOw~Eoi0;w'5o>uT.]ʈzBxպ[VzmꃎU']hjFoqlB bWpϗ*ĄMb%h&sCVq?;.dpVo[[XOx]#lƔo$O+I+u?: QI͚^?ɮI&Hѹwhj{4թ~}go0:y ]E_*dSޘ \];ִD5ra*/nî."-ˇ}Zvl5`I' d@QمпZY7xIs@+殲58HXH M~};SIU݇1Du2WY+#*Ru.P9DpVv2úTTR5`kX ‘.b(( 軤j I zQ^KhM>PPoE -Үc}BEi ~"kąޚn>9oua 02,԰p:$;6)OfңQ,va` |g9 {ܷhkR^+].?nMƪ"Avh٠$)^s9p8yef&"G9hu#F#dcM&E!ϯ /_ɼ96\kkvl(Mo޳%Lx"p5UyLd՟;ҡ'T/075*n; ˛^trs6v%HsWu[5 ;82k61Rkv9CY 5"֪CUݶf|tէ{7OA3k`:x-<"x 46|qޗQV%MUh;! t-O^j&Uq]]8=kJO៍xr6M%)&$ȡlKOe<}eΐiJvҧ_?R`h:Ad9Ilˢ4ZdZeCR=RJR\Pe 3f8!5# -+IQojZaW$/qQBYXdd"Htp͸?"".m`8؛~(]ٸ4Jںe yT"h-{(YfüLg+&eQ%/2Ѻ'3HQ5e" ]ۯO?=<ᄑӬͳ-}oO-ϟ#]\AcifV4tZ^#%dguɺ>QdZ2%li>H5/]MxSj0}W yJ PrK MK)Xʒl+ۛKs̙o'iZy /Ӳ3UUI\ę`ZD^,,SRuV8 -pAqb` { 7߈CFwҜyT,,EYpJ= n]?>vx,Ӥc9O ..n׫ǯۻzu~uu oF 9;ƾդ`RiAI£L,ExxNZ4ܫWa,(PZzi4!~HDYKn*86825 j9Զ^bd/ 3|BdGCXuaP&z?lJЀߠ-:6AgeA혬Jw|o5bZ꡾>>I]kحe~F% -#Cqu{wu8gt1]d Ԇ}Cy1oDf<5x~@=TTt9T|NӇ = |Cڝc9BA87әմKA>0Bo,qs~KgZg^0SFzrr:WBlieòvGLꢊ /,9/%eɲLD脞y1x ɻ0 ЂLlYx W8E(2HH*׾X"B2uHE 2]8y.y*ȰIU%#\[Nn!U2xR˪0+fෝJPZʅK{w.F8VcKA(ݴ`Y3̙3=di-)MӼjP+YiS2.UN UaV#zLTEJBdMgUR稰j1v7ï믡; q+冏Vi^&yn`4I"v01G{xpl|M0]aW5-+S~)2ֻ~GcOAL5i-hU49Dڳ@j.@ +x,tn5p$Mz&v799[2G/ &)c =&ҋ;) `6`SU~{ϒ! Pn{~%gsysӈu' ӻ)~J.].u?d̠ y`< lUsUx~|@/Rz3![vDpt>M5oTD,SMZe*u`Q&8ҶJ7 ֟xJ0yJ&?" O0i'4MiU0 #&c\1%EU1~ؐ$3bfŏ 8୔*|1_i)J0j4?78nЏrhW +\h?>Sֱ4۟cxJ]1.xRKo +S"jOmj{5!1*~H}H| ".k]*A|ԢBI jU!1P@ȭTf]R) KQVf-? qI O8} y7}n*wPTu%\u6%GlUV\X(x5ġ}H`|z?><=@#uKhܔض5*YIYs\&k;翲b=G,7ΜvZ y젽䐦u;͸9vՉ*>eŹaRUe558ҜhdYn.~0(++e}w%x錰Kޭ;Poe7fF홰2xRj0+ JhKiXƒ38_+OH!Y`,҂r,tU)wRj(uUGUfOPVB}ZQ5BLi <upy㨂En(:mW.KSkH҄W7T0;2 d"#H{[GHd(kjJn>KWƒCafQи٢n~Ո;W+:M̫hˊ9BLC6q3Yz[oOKpLnnv>sdk@1%;-?GK(c!=#K㛱 ϗ'pj}vbB39O "Jk0D  ^p< -7ҔQ] 8|݇E*{89{bwֿ.BxVnF}߯0lCJ&uH6m>KPܘ%vR؇|{g C_J83Gtfq.yRH$E2-WIg'ł/<+xVX.3y24rjt'6 j{8!AhzTrWT"wtms@L?޾8 57??j-9Wߔ&u9$-(Zg I_swWWZ'aأ"{{2~¢s 5.Jn+b8aBxX t뼿JX-O=b>hǍyM6jIT6àCf;vG%iB+4x!"{>)d,K"Rl ;#nUz"JwJjlSn y%mYTu_A! Ea+kwdI<Knє~E6[l_rFaXFKAXhw Pn*k_MvA&-ݰ94RO>N;:OE)&,CP{^a;4i:A`@ڞ^/~ 8[':[?YC?苐Gg˫ !N$+S9ci5@1޺y[zOpGtӕ!o5hIZnql?I#d!7WW^Iz=ikz6j mzMolomQum-6;Q< )2= ֑(@Gj@z lRO+#ۖ+(fu};ϞOl,ZeVYˁliJܡnt?"rw&ƻٵܐOuYzdKy"xj0E.,llٲPBH`,EeHrZ}.n2\H27Cbb$f IsN00K>@3r)榧IU/֐npl[{^B!|tj=ZڡU7 +jsr.#)t.=iy!qvE &WQ}ۯ jm |}zX ]]n u+կ- ?AN 1[[H683Er*^ #zԌ\l Z]!5d)$JQJ{XO静H꽎zPNuTIWj>4 PxJ1yfOzI:e_@|t;YC\ 4NaΊBń >ggKɆ9jaT S )joocim:zLrϠRjaFJqкA"qp `,?S'H=yhOB;1OgxXA ?3Xֈ?(’Jf3G >qxKn1 @9/0hB,  &P/=UIg!HE4B<, 91B1z`,QRR$nS1!׸©ưΗ_:1dZ:`xvuS~*|goy]PzLMEe԰ vg8uo;O6mE[˚WUI[ y/|ؘd*YPaÈp߀^lA<ҩ,bZ}rPW=]bBe2vY~2Dӽjv^ t {*g=x˻ cDxzD}#4ůqh5Qy #c0c}ne\5u9cTR+94^M'{z m+Ƽ}g4ӥg?w;,ĺ_^xPj0+ƶ[B9,ElY~,癋m%Y7nmZ1D3pl6*b PGpnZ=8Moh] 4 7p?-Ĝb?OzM?Ӻ=BUZt"ܮn~J|-ZΟ8?ț>0F”A.(pUU>ҳbbC9s Vيehnap.#'! {BRsȷh7*zwW;^^|r}_omZ(s♋γ?;W͟NB#xPMk0=GbnK&r= =P2F^Vrd9!r=aޛ7/'"mosQثvԡ A z#ʞKeDieHq1d:!y`Q1)&1&KTwd9wh%mYA.gl Y6S8Nl fˆ70敱6l>߁uibv OO-w̖NwX`ED'nAgT qTfvr|*)oviP4[!ZQWL'vs{TJGLT5cv /k%PS,qs SGkk>{|xAn E`q 0^H="YHW|_vD ƚ(0P\_=E6 9ZAWi&v[P3)gTI8aX;1wR,˸%V .f!ps7:B9 n[i/x>!ô-e~TK?g/eɞxOAN0{GıB @B׍$Q^S qY͎fggb 6RӖJVU$f 4E0֭.5r`E$;Yd O&8as:eqܮYGapSnTJ5\ w/ 8)1aRW5dLl,al0ĞFBn )/y؛;Md2om]vÎl6`?'|F6n5k~ߝ=xOMk0 W>ıRJ{c M:)=4vO}ʺJ!)Kc^6mIQw-U*X(92QMdju[&4+*A'u ':.6\sfƅqsP(-Qb-%`(:!F'x QivQFޏ.J:+0UF.>|LwpLƒp)r;g"w} APZdzCԨ3z ؙx2 Mp1Y7!OJ^.|?[#5 d:JX$?oTcdzŖ6xRn0+EcCށQ8h4)`M--zi/ܙmpD "0U fMR- ڢʛ̤*%ʼQyEm*FtddU]7J.S")Re.*iERc謃[-;g-,p^9j; siehjC&C {,G>l o:):I3%9clDn@y'<Ӹ Kـbqv< ! D?=a@?k:,96NC5IہM8$S_G{ymxS0]O-cy=MX #zDOOW7wWOw_<\]{,;&G.:6ǵ}rtO(L V16>SζN|p/cxm &q6V8;?ޚWXƲv:tGżJjgVz'.AYo vwu(ö=_)~J)6xR]O1|طJ;W "@|&g#넴U_g="L*^Լ,xٵ,oe[B)`FĮUL%fU%dyW /KM{N^z gf?z 놷uQpYt^gڟe2$eUٴIVvW#y  YPQFM`f=fW!цfaE 4gZUmi}Wgy9bb,ZG~5B Rl:~`] z4(2vcCDR%w8 JWG&NGEC~M/#*xCPw~M5B}ÍAQU.Ow+{G.oL9HR]6A %CR Z| s9&|^E5q۞ &R"<D\ 8nsGe3OB#*x31̒$ˇ&?|X4KA>540031+L/Jes~en{LUnbfNnbCzVu[K.}QB8{835,;9q9Nkr;u/$)4]/7ל}wD=ZLigH0]~~v?J}#3P%>ή~ wb$u%'@&fe%2D1Yd3e;+#d> WG_W$^h-ޅݷ6n5 U RqzuNZ-;PBbiI~zj^q?WKT}>ayiE@%3ص{Qn uЌYW&(LOfh8b$ͺiUV_]74Of%甦2,)͘07ouP{r2Ss 2Nnb_ۥBʻ7k`Ue>W5An딧 E ;f]!]}Y4u}ْbs?r6??ArʔfU2ro>$_<' Sx31b5|̝rY=<($&U0^UY-»/&vo ج촜bkrSocз.@[1x340031QHOI-MK̩,,֫aXGS^0y`SWW_ZW^XUrԵ;6)rK\}=b* x340031QMNMIKeuVѣȊjb )y n9u+ܿ7 MMRS2KK RKR'M\T\}+D!F&1x),K[sRE=;>x31HT;fBxC^v0 :5ǁp֨<&weY`qs16t:Is@̇|8~cU0@/zx8`8U^ʜBpĭZjz^M ʔ 2Yn#:3VOCOthtpm? jjxNygV5Ao"~~O 8"1x,T}%Av楋M"t-"{bSVFc¾ {0 %9˜}l8qŦU{O`5 p(WppO}spo`q+;/n:R#v5} ˬ4 8jYzCpZ%藄.M33Db‚ˣw[مF_AA&p<Q;5!|(DIL EW="\O>HN@&2|!^UWs\P"zPÔJjZ3O8y{S)nq3XS84yԞ1CmBZ9/kgכkEd%}ŗe&;r+7((hӮOm\z2sKD;k wݠѡZTbH)-5zO~MɊ(`8;Kw;خ.>11ۮ' S͋z,h>2H.TGDnWZek__ H8l4ĩelYZ1DzU Yv%yX(U'LO ?#4LC*-4OQǻ<)e`/CA$VIde> v B tˌgۊx]l/實#K[vf/mHWA1\YLύ*RVÛA͒` m:֊[s7_y09?*uNE%;1!@&MRKpXYrq+ LygH$KvG|3Ҟ5@phPj퓼{k# w4iK(xy<)k%TZT. ew=*Rc̘È"YZdIe,EnȒZ$;97f>{{s*+* Jc$, G@3팩x>=mY8qZEU%+'EĺJ!]\p(&Rׄbq77KO ^"U~Sޏ WSi6u1$AIh"ȄO87?؜.@ѩz-m$bQۊ{Θl^Z.K(,$vWsZIo32~Pzޠ‘+ǔ\g2V*~F#PNH2qx'/T" ט&tHhAEmPi<"@xA儁T'UI yrZ!R\\=\HX4S[YV%NkT>2RQa:o 9H/2S2XSfwE&܌p\F)@*-.87 ⤇+73 3~9FZor8We-s`=&3ilw! +?$2?l&n&XJ2HXJnMI;Of59쟉@Xȥ̨iy]>Acn / ryRm2miN*{ c07_>M+_ cx+:Z#zi`x sK%E 6=I4zh3iU)~)v.SR4FqC@v%ž;,*2lL?=>.05QP)A XK@@Csb,~}Φujfe H-Ƀs⛔zb%eN)a>b̬f:D߷r ` 1T]Ψ.M^wK&f}*edxPORXyi˜Ͳeo"WZH&p6kEP;#7.I|YQ~fǥ{g.dJ;.,SP9a9<芑h7kq+v@ Ų]O-qre 24A񚝲?,wf܏?(|Crէ5끵NNӐ$⣛0=#s@\Y0v k,d>{<ܾ)5/ґdG`Zώи$lt1o~mZ 7X ӞUZ?PNV4:s 5Ϻ]d&ppQB!AaRimWo7Dh%2s! Ga6ӈZv>ek-Re?Q]3rGF%jyxV٪1]~Z&x.wYLHӟ5LrQzO|Rw$zXpxFdebkE8fqE0RX>#|AxwиOy O0-299}f1.q'IB\A5FV֗ZRjjQ1 K>ŞXV~xYjsp֋A0 hg ^hD=1$|"X0bXyqxu6ɸڴg\]D"!h:#65fw+;!RtکtL_A*gt`GQ˿nꖩ^E4P^VKF~Z},9ǸJ= 8UIo]M=ev6K$zz+r06l_/$:4fzi95h5N2EtbD"G{(26u9ˤ+|˓Nb1JiCgW>0HI&fޔacfDz1 NCH^9c1l*;%^MLUkcUU9k 2*a1`8܌:f|2 O/b}w|H럒yuHYmCO3"̿yCr:S1[8$[_v9?s!GG2*,/yBH3 Jw ^k5rv@{0[N끇ãU'M:ORXDף`k&ﹶhѓ:6qV|׾.rO81. "` eDA=_p*ʯ==}kJF{ד?2nwDػ8#$$Zibq,m6;w1(# #i[Kod烣J%\_*|.s,20T(/UejN}ZNU! WGqaʺ(5 ]C^8{;&5ieOD{8@+5=٪n\E3G tb}[$d˒X6 lg06$uֽuۑ+MheǡѤ˙ J@uP0lw;ɤfh1` JoL(J|j')yxkb"Vv걈>ޱA2Z|ۛRnm }Gu[SESM`;$LyÇ7NI$"&׊kw]N;:eKl,U* eR^4>HW5%#3=ph~Cv}xm7;J,:9cA%LfN :eHMLvZjE߉=;pMs98SP\,:(6o^Ѽk^y0@wV|`QFb@˲i`NDwU[y4UVJ p-wCc$% pn'wKrj.V3"%`o?vFZZϽuQ,1Cgmeox|oF.kNUhuG}\xiq:F,w G/:t8)TLwG.sF.;>$JtC)oZO=vc R@>mӁ_^LʒZ>,\Sif}9{GJxG AyYV{]_mnLf;.e?L^oXyqes?0t!Sn܋/0]ckDOpEˤHIP!Y~ x,b~OÜ @xYG|nz~ pU GSr Nķ'c,X=ARcu}r΁{ =ϺԪ%q*{S%iݢ9'Kp'_~Q[(!2y`v+G(nC:2!r$$N>=t^è.iORX9NCq\A`jAg)gg@ûEy(~A~M[8$s?{:Wb^J kggf82Q$@hyxrnʝ'P8UNl !'z Wi뾖(x [ M[f:4mGo`DA~21rSsh^rQe%oJ!o4dcLGb.hF{i4a48~Ru=3SV d/>Ih:V֜Ӟw=M&*k$9_b9HQ~ ec4gK(Q"v@^~8ϹxY+4@zy#^VF]ўL 3Kh5<@ ?EGmϐ_"hU5Ύ.];;(t` %lFL_0%~Uр|y{hbVR</RD.W2K``qH϶Y79'l2 M{HIQʘ{͇z"++C$`E CN?JcMWvk% CߞN1+PSy`AV-OGySR8%0;!NUP }K4㗝)tK`o͏>BmGJ'H ~L׊Wj]6 l7;0s8sC V`!"pÑX5g~>hΊEI^d`,ܯW(^_;@R`ǣ Xxm ,uŊw>SJUt5u_bAw˅ol wvBFz&qQj3~|FnP;,laVJc)г:؏Pv;uC(-ZDAVPY&ވ@xlg; k,{"}o̽=RkN~O<&DS\r`hWP.vc!Gyl֋= rՓmRN<ߗI{xp X˫jҒW9-Y=::b/d7~Em)x"-<])D^ C*oKb{Qza=7Ow7rS@*H, ZkH[ޖ~=$D9VQE1ƠW.f2–UkPFQrL*oTھ6ГU2HO"POtNOt Nm! \[k dA U3sBZ+Liw8a2dpH!؀+eO@S%CFcWT=.uc.q)B{8TF'H%cJ{v626/\$1w[`u>#{LX юX4ҕ%>6̜gK?.]nX"]~!s(~)1%h3< {>bLZywTVd]i_#h#ۖMk$cSXYJ|5甥%kOII4D~7Qs60eK(7@!A. և7+hFF4թE%Ii@?ou=`XyvsSsz\2RQ;7.`SL̼LPJR97!W^=FLE39'?.\};f %#ģM-Jd~r>?7-CS_Vri|N?'C_/m>vi >g\4Ҙc?P^ r2Ss2I(59( ?H{ 6}i 3;/Vͯ6ԜbbbgS4o&0ce Ő*s5ۋR;f,HhW5]iiN*p{5%lڧ*+ .+>i`Tr߽V)'"1BICmŕ4_P_Yrcמ>ݼص?#aQ\WLbzCxSߪŷ ߮K5mܤ/,5:h/J-:PKeEřy@<1:N&f,XpTx340031QK,L/JeHΕz&r |oL:cQ囘0)JfŅ+;0ywPeIiz \8 UܾIb:vsSSlʼ ό{d_%T[XZ11%_,.;e95 >3 5$uG΂MZ?s-K-E1(9#>%h!rc07\ܶl)jS2s]R'M: ?.FW\ RYkx}glɷ-.[8(8?,|C>ҸΒgP{ҒLP|}Uwƫ3 /wlVYEηY?Pji]/?Nckx[źU3K2J)r`T~Uvgٚ/2sf^l>OQ,tzp;esgH0C$_\Vŵ?3*x;~c@{,̵ݸqTd?Đ+]:ԯZ˾%^kRL<O9ϩ(P+gJ2 y9) bGne] uJ {Cl#,\^{ up$D|h-I-.)f8x!IW[= kg:OWf@s6\~`|߷8/Ty,@ ^U|x31biͧONVJ`[`VQ__^̠?f}9w#Ip,}9/rux31b5|̝rY=ڟ~Lf”df敤%du\;m3CϪum)x340031Q(N-/,/J-)K-3d^=m4G2ŶŮ_F x340031QK,L/JeәvQBjeYQƇׅx !|S2sRsʸ7wN]ɚ\G_`,'38599?@"a# K-ܻƪ߸:J r.43;y_e7~P)PYI)H冷WM:71/N x31~lfwއ+/u.vèh-I-.)ftvx(K௟/?IE.R^x|{e;s wx31LCdka,b;fŬMDdUL )o`uQJ^CYLB*1u J MtLd^hO1֘Y -a薹퐢}"B S&;;= 3aeuGh2õ(aS50Z891'h<~ϯ-͚c*f7ƴ~CN\88TbV\Y\|V-y=!vUxגrɪaYVQuFeaOdYޯo{h٣y?hL> (uR^˃ZU ~IfwZ}/Ĺ7 oZ~eTm>`]yY=xvK&)(Z5'^آ <_6N줰KqЊZ_% e%oT,"'zo0_*?;(HMP,V0^kN3AQE|*[ fiJ/ҙSQq&W2xo][YdG;aXex340031Q(N-/,/J-)K-3d0#]s=枓n(S :xe +_*qaCҰ]@g>s>9؁F4K%100644 scmp_bpf_sim.cÒ4]Uz$U:u=6l6_12iӥT,100644 util.hl,=D DnGi x340031QK,L/Je3]5 oeΙ2jV 7MNMIKe9Mb}r*+NMN--,NN)`xk'b0DmAU൑wNIt/-Wu??Ԣ x340031QK,L/JeәvQBjeYQƇׅx !|S2sRsʸ7wN]ɚ\G_`,'38599?@"a^ng OQwzd_U WVY0cĶ0~eg_@e榦@e% E n?^5V?ެ~,tePx31C%Z4v rf; Ux[źuBl'oNT잗sWgĉV"Z 5O_g|WZ^'gs}Jrn}^,ؚeb y9) I<"wԸ0N۹HP1p23S*r 셮X v$o_ǖYL%I x340031QMNMIKeX$]nZSr3r )V)oo*$dǗ$1ȪrUuM'ـ#&vxh16k@ ù<ÉV4]OR/*9[#ٶ+A;ly,gJd]ہ100644 arch-mips.cZ"GZZQäd<p'~Qw&HX-?A<5o\]`a:Γ A ?I㨤J˹z^@$F@snYT:湧=C΄hR=nd}yѓ:ȋ9Wi3}*:œQ>N@OUf=vZ3R F ;a.Fd2?c\\C9JRL1:SO:h د%UP100644 arch-x32.c̦|;9I'U?@8Ji8gMuDI=;X%a';H"* eM~eY'O2[:́|m3#³q:x .jYS100644 syscalls.hX.߳k7hf=2dv x*54I]<\P9:mxLI&100644 .gitignore2vykYb&YAňQvgvb100755 13-basic-attrs.pyHZkYkۮcxADl1KbPۈ9Ic!ꓐ5%hTe/QVM99vEYEđ`(V Q7˅ 89(*;vs $ Makefile.amg ,#ͣhd$' .nkx:xCw+VL oZF6SfZ~EOR_F $f%~x"40000 .github;~Ij;^Ip@k"[UA(b֛9A)gn#ɑq0 3 :Z N I ~;W"hQbi!100644 SECURITY.md:4眿4E"40000 includen NK=oLZS4 G:9cqgX[[L40000 testsZ"4G;%a oĦx31b2M7mpǫ]SjVQ__^py뷋Dҙ}ڹ\G=3x31ԒfP+ .M(br0x340031QHL.ӫa綻}HŻ}mZf4)x340031QHOI-MK̩,,֫aغ5tlgxZ!Ly^If^i~inf^IjzQbIf~XW외9%^q/4 d+x340031Qu bנ g`/7[֯kq>I~C WW`Wdsr^*r˺ u#Т x340031QK,L/JeәvQBjeYQƇׅx !|S2sRsʸ7wN]ɚ\G_`,'38599?@"!:|kWs(|Q+`xӒ5Zdpbu2sSSԒRY ,O6[$Dς 6]SV;*xY[$`*x340031QK,L/Jes~en{!TUnbfNnbCzVu[K.}QԔ%eU0;eD{^hv屗*spswwg(~97\2|֬潑S算Ph˘5~7T) ru f"]L四@/ؕWľQ<$sdԴ̜T\T_oMw]]ܫqPeA. bn{|[NfPEΡA! eV6g]yMv[O{ǟ@e榦 %yz +?T^iT.Qყ%e]`^1G7SA3f?_ٛBJ~2$r̎<1[V{lf^rNiJ*הN;fRfs=9Iũzzy '\R`VtݛwAL5a2_Xk`u Qd&mvLtz܌ˆAdKRK *dn£3U30+|-e/&|c0x31b=#]W7O~=n~&`Ei9 3MZ 2_'x31Ԓ{K3bګ:'3gMe8x340031QHL.ӫaؿ{Y>륻B/l~ x340031QH++/-+IM/J,ӫa=7+u&P>"x31xWajLzjy)Z100644 seccomp_load.3.o ?i}ˮZvlMkL").DM)Nxm}ծ+KR$½isws>y}MXD$iDccmcmzOvʟ-2l>Do2. &-+C<{/-(sd40Qu9Z%3$lO@#@=ye/)X' 3'!_|6P+Q]_sq"=漖ѐnx53BTAjX[ߖ+#+kG262HT"[D#DI wl'Y{uETtٿi '[$^H:-獗dW<O!{MT=^,^Ҥ>EϜä&,'yUxu"+}z>nBlo](Yj&uP!LK=UYY. TB~kC^5jb2M4ws; wwɱAw7,:_ӄIDvtzO-;x97-f󈊗*A<`mpF#N>fOOl $ٲ!»NG((Y]<b5k%D zt2Lj|pv mV/&[bϱȡA ~@ sTO;ŞWŖDfԮ5&OӁS i ks=47 I1~סܚbsڞ! pʏk@t=4jjsE}jp¬7҆zT4'<CXb2|磌,z{%]b`,Lw _. <}3x31z;"eQx31vBV100644testsR:% IӇѠ ~ZSF773-T[q100755 36-sim-ipc_syscalls.py."?ݭ@f!sֻ2"g' : **pÎsn kWŸK !@'âP߳7ktests#^0*'al4]Gc怯>SگtD!]SV;*xY$Lx[ϺuBȒi3C}([yono'ژ=ڭیY3rO~3D93$=uㆴ7_5hH$Z*Q׼[<576911b8;ۜWh}y((R Cj"־ lsL׳ D63/94%*MF\pP l j3UX79ZZ\Rpx* 4o\?aFτ-9 5η&=x߼].-_X~ x340031QK,L/Je3]5 oeΙ2jV 7MNMIKe9Mb}r*+NMN--,NN)`T1yȢguUϷN2,DU'ϗ)*{v]}{%9 xN) t sMaPL?;FdL6$uÔx3^g[ÄٕޠdUpʿx~+Fb_(_9qTobvjZfN^b.C*7..P WG_Wl/H?`ʟ|:B:yDYۜu}7=Sl=AMMKKS3.W~/Ҩ\"nGOA KKL/-,AD :g~7M @!%?dkPKj+U{/&"S0Mxt!ߗ/݂ړT[Wprjn.jMW޽yĴ\J. v+X<,.Jf;>kT--Ҿn(Ȗ3$2Rs R2ty/agxs{z![L @$#?!+L 5͑ܲ]XNw!7tԯ97*k⇡a=2_~ظM̗~JBWޭK C_UNH|f_}IbO]S6 y8x31…%:1:# x5 @@a*Rl6#J3Q$ n,&Kn9ND (,VD=S&"*pSGt:C!LG4k]P1m3 l/ttK%>x ˻ 0P m1K ~.H,AӜw}ʤ"`)P/H$,볬ئ\g4MaQ#2co!q2#$62?8#D|x 0 P*`YzpRPE*$fc.ow[Čh.5Cg26=-3V*hJ-p,8C=> U=q%Wxű @ P!SdwTLwgEY" {d F` F@y{]?y]HEIhȒOZ;7t#*Em@y*>f1f=Ch{ߏ!x 1 CGH$#f"NNb*J鳬Dl޵YD@@7쉤TfELcx Ż0 .4L -˖($OqAAF*}ϯiVp$*])Am&UČ#E)?*#4sRAjbd7}Nr*z" yx˻ @ P2?T@; 9JD(@|@}Y1-+!*JA;&Ԉmdۤ{WLtstH{&'O\A52*"]㞇jn[ oaQd,+ w c? @f#XJ?r'GIa4{9Vx 0 PUNM~b' GT!Fe& ݈>0Ȩ)$)Z(-Irh[6[CfWDK(r =zK3zc~ v;"MZx ɱ @ PE$ S0|>;P`ߧ"X%Q4 Omr6HPaZm6H%z˴ <uz sXB4ϗ3gfMq' .x @ PQ)2}0)lcK4EQx|۱gW%3p0GI*L旇y?Vj,I&nsb?$ Ox 1 @a4!$vzN/1pv˶Qp@4(4*ԕK!q-!hs,k8\mp mDŽra2 4)$$ hx;@ ©$KBQx )B&~|:\@ԛ[7*",0´@s=WGmL`fqPTؽ nEx 0 PUNvgbnPu.L}]<2gu r!Bΐ!HzՂ2uF(ʸm*g !x Ƚ 0P!)2K|.E1 uN˾39F57.z5?x]mmE-Vtnx !dED ({Of)yKxű 0P!H!(=``׼;>Fk9G4I=Goj>UM#X얄@A6h,ґ!'x 0 P! St7vE])8 ;0Fy-e;f jwrg`c E>Bpdb7;=ye{9ʵ Sx 0 Pr%:0=$}BU]k{l"$D:#L%6qb-wkRF]-|`PCcֹux ʱ 0 Q FLb"5 ,REgA<\/c,&3U 96l%e}k>›Mj+E S&I Qfy I`"Wx 0 P!! у BU yx﷼<"Vr u1&3*Fק8WC'0h&H,ګK (Kx 0 @U`'1RU!aY_LjJM 80IJϏކeaCiE$A Պ~_qA /Cx 0 P!O8ΥBU`FAb >c#b062rKŬ:_۹ԕ%YRpO2j:'\O}$x DZ 1 @ S|Gq B_QmX{Z-b!g"n͔ƨzzQKmqBc*K@I6{1ގ^ Jx 0@UɫS0acT(ta:Bz;ߴ{RGWTQ[hBT+Q"wu,}HhEr-aa]>sf-|~ x ɽ @ P!]>rGHq?v(0s0}+m"L%*ьBXf2K.}s7uiN3:XSs0ox 0@%P`4,RoDVAX1w;o^ `c (J> O\`zX6,$dE_Q! M~dy8cz&e%wx10 PlCFq3wpGL12pq73!fdM[hRd0ɵC7^,VyELƕ e.FR _Q=os0?3$x ȱ @ PEBpy KCf6%|댘66UwMz#X0v~Mm0&D "1 gcun:(uwi$^&.ECQ$,x 0 @U#c;ΫpDb2 0C|i7I94KWݛdb bx}mu71@e(14d*ƦLt̐X}/ ux ǻ 0 8ql'.( K4LU?{1YbBmP LC|e1uO90Z@f6q;u$J~.!x @ Pb;.6 S"e4l:ax;#PO&c+[*ZY=%3y= 4!0R 91m>uO."n6x @ P HLm3L s+EYh״[V2*p}i%ٵvyƖ}!#4\kDb 5> >bix ʻ @ P!R1EFa" !eH ^}{VC"h(b( .N`wlT Gahch8'cg Syfrmx 0@)u`m`<ë(d]BYjLu(x&ehN)IJxzښ%UEy3hHX|pZ߿C!Kx 0 QHn[EJUL$_!&MlQkӃywٟ}HR"DeP;jՈT s糱g:J/0id(1Y@;8@"?x 0 @!q#γ.R0 3wNyD,>hfPDCBE+i tR۹L4!>yֆ>z1Z10]G}!" x 0@EJ i(@Bf,oKE;1wj6f 01subE1PG h"0B)cl XԪWao/9zL`S?Mw=/i)%`(Q Sڐ07x 0 P)݀Ǝ"=#BU@*];Yc\*tpBlJֱ^X[ihx6bF@6[aIA# xE10 %&Wt)$/:.t"-ww^˲os&fd  %ԲZ֪HVea^s*ʰ 0Vpl!я(ǟ{ђJƣX@C-TM?/Kx[źU3K2JdXDĭNnT`9fQx]"40000 .githubܥ>(7WV:k%"c= ЭY]$-NK1_g~T PJ9~ɗ)'{>x[źU3K2J,;4Icy0UU%6*I0}kS|yfd8OWM @!%?K0`,~}Ҽ2c!D63/94%Ai25&)te=Cn53#SpRe6% ZKRKbgέxX֣\xz PbO<2o$FCnUX2x[źuCHP*E/yk{+*,&T -x 壩v ^.z'c&/x[źuC`rYw5ps߯ \x[źuș]ݿKJ ~fa\myƕFe/g~ןf.l23Sp0O6n}Zґv}DkIjqI1ÃOz쵅o3(ꥯ.==IoBE_ذM8x[źuCfmz|%ǟFzk,& ex9W1/7yAݨpN)}D-t][ j@p[Bx V̞樺o,TZcƓj@HVxPp rmHqBҋo~Q)alm={eN4HBrQ/*tiR% 6x[źU3K2JZu_c̲,X@J"V6g]yMv[O{ǟKBʗ8O8sYEpfzW SHf%甦2ZPI'fs>[^g*Sgnx_ PK)MIeX[mr wm3Gԓ&31tuuVCTosDgIjqI1 MBXgy~䥪.&n`j@;Hx[źuC /mU,oюgc mr `tx[źuCOKi$,qb|uVe5L @$aECzWv iyH\B@.&pkxx[źuCt9+Nwϱ;Q乹ԏ $x[źuCѴ{ ~B;|_$!?U]L -x[źuCH13M)K8\ 3'g19Ȥ Qx9{4G+(V]'c&6S:T};/٦j@\Hx Q/%N̮E'x[źuCHG[F/<=q2;鼓T3x[źuCȇK=<&:I0- U}> |{,ax 1aγ-fzS:E`x[źU3K2J<慓2*{ݨLh+Zx!:պ: GQ7ٳN\0x[źU3K2JdXDĭNnT`_z/AE]Orcbȧom/ތ gW|3̔d.{/ܒI$̼ҔT5˼\}ݺ/^Lff %/rce%% w- .=7b{w9 J JX7n4ty(BgYsx5V%i@>z..*0Oj,*TEb1 cF/FDx[źuCȭf[\yd N,";,&̺ {=x[źuYFȹ> ]سsIGTȣ&@S>&~WN}>)ਐآ3\r7,{Il1֒b  e )iT6Dx[źuCǿ/'ԯp[#z,& irx[źuC!矦{E6и  x[źuYF3o+BzIp\{(d%甦2,)͘07ouMkwZ-?Bh8!ZKRK6mP$ng 1$&x9yb ݏn& j2/AQS||P|kꞿwj@}x[źuCHRKL r7=Lq,& |x[źU3K2Jea"|qMi56*u02-x @%^]|L  u\xP=? Ը.QJ\הdAwOQ,tzp;esgH0C$_\Vŵ?3*x;~c@{,̵ݸqTd?Đ5| D78=ϼhH`kRL<O9ϩ(P+gJ2 y9) bGne] uJ {Cl#,\^{ up$D|h-I-.)f8x!IW[= kg:OWf@s6\~`|߷8/Ty,@ ~`jx7N ?2t̑8fG4 4YAhǟ0pYBQx7}4qxuwnJz#:q($O^3*J'ӇFx=? Ը.Qjx -Pj#%z- Q x[źuBl'oNT잗sWgƉLT,x[źuiSZmʸjju{ӌVxtq0 3 :Z N I ~b]%9 Z>0AN6ܐ"|aI/HdJ40000 includeˆb0f1%S9K*7C[M˟Wqj@s;x9yb ݏn& j2/AQS$e`qEO:>ɉj@Zscx[źuCImw 嫸^ۜ2ﰉ(3|"d3e#Oms1Z:IVMx[źuC V"O,;JRK"ݦI=oҌJsgwwLsU:cʢ'?d,5yLX\臢 NknwC*I-.)f*j[R';,pqfrP@;x vB?N"𦡠jH  Qx[źuBl'oNT잗sWgƉLT,x[źU3K2J+D;[-Lq.&t j,x Z 〲 jJ45Zx[źuYF;KX-\Z?9. PK)MIe(٥;cT)v5e23Si|: zg-9| ZKRK~$OSɮBFS PK)MIeeKxGrɮ6Off 6qX+yLp[FmsoM.%% 6Rwr.Kr:uq)?1If^4_:x9J~I~K\b( 4u#V!%!pVZE꧐D1j@>pHx[źuCi|: zg-9|&g19x tx[źuC>ؿ'oz,x7}si抃U L f:ֻ¢-@tȪz)ehdHExq($O^3*J'rx[źuCF=\uT,_ U,&} Vx[6b.p6 \2wG40000 include;T߃w߬v%4v<SnW*]jzRj@N*'jx[źuCȊ L-o6ۇ|N(,&\ x[źuCWykaV߶y, W1`:I0 Yx J~I~K\b( 4[x[źuCȆSt1l)&~g,& ,xD"40000 .github 7q KƏ)ϋ`2"ԑɐ94 vM)RNRx[źuC pUw M3Lnr ~x[źU3K2Jt~}q}eqnj7*u0Xx+(#M+a7J^a-w F 9>xKM(enyTL`Ɍ/uҳxG exKM(br ]>v>e' 'xKM(t+wOf;KL_iqEHx8qBwsMj]Q)kl iqx8qBH噖}NhۧM _Rx8qBȁ=|lucl cx8qBgnUe}}Q Sx[̻wBV3+Ou^Hxri6վ MxH >\/CVģ*_i!precompute.3+Э(wzX)7Ktv Xx= Te T:mCEj-lWǟ'pف2QS*7x@ pٸ^UڼQ96Kbpf.3m\P\4"C bPxϳgLFg'euȥEy-$v {tx! -: wC$ҝDD4:UYUZԖrs`7`OL~B$ah&~ xa tnaI1b|׭pٸ^UڼQ96K>b$Η@jJ2Nw<100644 seccomp_load.3rs`7`OL~B$0"iUB8jȈ*7i;;GIxV tnaI1b|׭]>4:UYUZԖrs`7`OL~B$( hx9h-Nm15s|X'ղ]Vw9$F9EE@뢄J/T:iTcKHL>h#r@}:k<" յ,(ri~LS/|be ޞkQ+x|zgL“2銨9EX=۹󹖌AmEo]cϼWk.㓪\~qr<Ȣݖng|7-iߎN^l'Zl{'=w/4E(q@N)տxu.WRnN*L`Oݤr謑}L11&gў,&zIq\7X#& 8%d$2XgTș۳/pcވm"e0$,|[ n;XxM>j!m5Ï7n0g*ɂl"K<֥NN`3^-ͲQfV2B b F[=9\k|"% uO9-ɝ! Ub` |zL^|RAД {]oZc1QV-_&\_$kyY)Ɠk+#~ŷs՟9Q57#5 hn"%/snaQ/(Td1dI~!|9[+aUJxky?ל5891'hz./* UK;g 4܂Pkq/F)ZUѧeT u.Ѧ_{w~_O*nw1+ guڗDo.5e0֨LyxtZ/dl" R|q7,qn4mI' =SRB 8:zj;100644 db.hABp"ͫ-5$г;MpdH0ד@]Zz iqK+$81?`x{ @pC-օVWJ&KlLCx{ @p>HzϽ)?J s>\{3\f rx{ @pBȎ8gW &~kcyl&LWދ|y{kI# LLR2&dk<髷.nRq/tEl6.+R<_NľVخHiE^OgXfgֹ#x{ @p>k|W d9ٙu.3 `x{ @pȺ'~@^e^! %Cx{ %}ɿ9NW@Vkf 4tu4u'> SCx_W2y Oܶhѽ/?<ٖqs+VeZZkr$"[T\YR[uMdSZVdpl Tnnj,1'3%$a/+J?|1?{cwHOc}+2FRNt?26/fXW\Jy1-Al"lE3seռt蔾y7OpDppi]nRr&+?s1Rs{ lf~u@E2T~r@hgkRs$a*.cj@\VbM[o.A鎥퇅8pT]y6iN"XU1Mz,wV::{xޠ.t%7I>42o5?) .xސ.C8OS} Ujmn`b -xpCdO?ot~[ /2W s ,xE9900g+pMYh^߹^[$),mўoA^Xq3˓P2τA_ 2h-Nm15s)Ou["`Pp|\ܓ zt\Q[x ,Ȝ'OuzIaۓ@x92;%T@[ :[{AؓKPu@ Ix ,x .jYS@2wx{ HDA/=$3=/(!pҩ3^z'W3_*TobvjZfN^b.Cud#WgGA 8, S/! Gs cb9 )l]+` 3tAzVc?>/TWs 뢉3lDL ^助n}X(!^,g"l%2._xk=!FSmDLty;޷@:tߺ5e'oatHGѽN7oe^7=2'gכ:{΋+W8&BEj$<,6Xd&&[\3Vo5_/ZoVzZdff+3;yϿ(*a#?L&2ۉFn]<+.ʚVL6]q>r^/"NU)NrS ۧדY,E->-Dタ.3iN Ĝl`$̨:9/~5;,E"Gޝ*TnV&kD&gZhկIT{Ybk[YE9u'eOεqVsr2Lfa37کyB3'>̰-z z W;i=)yB@ EάU!w^CI7_c`=r]㬖N|S1;j(ԏ@<4-$#eDFy` > Ue /L*ah|ϞfI& >Xnsֿ-5[GwrG7X xm9[:zQrvM$». ½ΏdX5{|ڪa'yr#jL~8=泐R)3 x{$Hp׫rI{K|l 5Gd'w 6x{$8Cpȟ[X5?oʊ6jW''&g&g%3M%lګwBonWlh``fbX[ UR[TzIq\7X#MMQ%d$2XgTș۳/pcވ,mNve!Rf:CzkR+'d&^dCpƒ) ,o8swk)%4T=q(SfZ~EOR_FݸOUfTW#G_a>S(: wA\T-5100644 syscalls.hOإV6 Mz0xhT늪'?NE}R4.aq&@TXI1nh٣̾%?t[3')EdU2AS,?ܡ2ؐfD AD@F3|.Jk^@^a@F<(!S~Iٓ= S;wOp:'U;Xt 44 {ʓQ>O\Q'zݘ?4zГ=>v3rw?h%;ݮ!Ҫ2M` (C s:hny檩^!83qgwi$}( zm;Z> ilď d76{kHװ$ʜyS100644 arch.hHOEw!ŭA)jZlyO};~܄:F$%gt?@ݓzu>xS9* *6ϿGOw&74M$». ½ΏdX5{|ڪa'S% x!P$». ½Ώd4x9N:~1?厔MKאx (_|nV'7x:x_+ ex6,$6@_*"c=S醨Jx&8Mp#vl|Uc^42_Y*i7 V ZxkLL~.EYHũM |v!/X+m p*100755py*Qʹql݇T “. !tlֹ]UG!=W^w~tpu&qLA%ܔE 1xXLKAňQvgvb100755 13-basic-attrs.pyHZkYkۮcxADl1KbPۈ9Ic!ꓐ5%hTe/QVM Makefile.am_>.G,GVT$'*I(hx>LLVک\. vO)I ER?|דz"{+6x3GDA/=$3=/(^_y-Vؗ.d묍jÖZ)2s=ennj``[\WWPp~ '|3]ƥMb<]hKRK&ntY\< ,7b,"uz̟]#W}t2Eɋ8\͙gRwF~PB--JΈOJ,L9YV_OL^N:VC^5 Hv["]4ws }߶ڼw!vw>"Sp!'/ڦkڭvmiah}~hXEnqһ`Qa~x63rօiN{;TcH3O?3Yi%6MRR_\|v;V-lvdweEzn5x5~\Ǫ'v&Df_6kFkmґ줰KSƧzm6{ߺ?Y@QEX`Jˋ=}^  R3KD/V_~}*"^8$OdENީS }Wފ)?WIAiZdG;W3] 5xE@83W(59?$U/(Ap35g};x8CsSSL 4osF;e@f&&Xԗ3lT:ئ/XYytQ뷠z|S2sRs-z.vQMsT .W0oNQQg,KG_x}KK&100644 .gitignoreo{x>Il3đ&oG ѯD׾ckz%fuoJErnk34kjGiCS]+;(>y1 sWaLboȃwLӓk~6v㑨f'~{\u2+i?/ղ 0ڑmr8|TSg fГAml){4DZEǰɗSx100644y| *7v6s-2${R5Ϙߜ[=v1˅I"ce$#\^tLX hAC|2-,ؓZr/\ѼDu%ݽl}CXO '$ b/s:w100644 15-basic-resolver.cm2X~L^2!G~D 0D e7\D100755 16-sim-arch_basic.pyeS2WڛwX .%d RۨV$b5$Ϯt d{p6Jn SB(25Cn c2s[9N?e4kx #3/PXyH/TnVȳ k)Ls$88]." Cq 100755py:{D% ] M*yKB. +hVE#<4QUpJ}x"rUVE !.~<+ׅ(xȓtestsF k7P\qfV;m$fu+ҪFɵuEbҢl*?L100755 36-sim-ipc_syscalls.py$k5۠т^uѓ!D\G!rV–h<Ƃëž9 !1 (|欴煌100755/LZn])ZEEΦ$ ` Бce>'~I=G sBTt+/XvEkZ0Z>]8a\|HO$ܫ/x!IID}q]B 7G`x}II&100644 .gitignore)LOjMP @(ԑ&oG ѯD׾ckz%fuoJErnk34kjGiCS]+;(>y1 sWaLboȃwLӓk~6v㑨f'~{\u2+i?/ղ 0ڑmr8|TSg fГAml){4DZEǰɗSx100644y| *7v6s-2${R5Ϙߜ[=v1˅I"ce$#\^tLX hAC|2-,ؓZr/\ѼDu%ݽl}CXO '$ b/s:w100644 15-basic-resolver.cm2X~L^2!G~D 0D e7\D100755 16-sim-arch_basic.pyeS2WڛwX .%d RۨV$b5$Ϯt d{p6Jn SB(25Cn c2s[9N?e4kx #3/PXyH/TnVȳ k)Ls$88]." Cq 100755py:{D% ] M*yKB. +hVE#<4QUpJ}x"rUVE !.~<+ׅ(xȓtestsF k7P\qfV;m$fu+ҪFɵuEbҢl*?L100755 36-sim-ipc_syscalls.py$k5۠т^uѓ!D\G!rV–h<Ƃëž9 !1 (|欴煌100755/LZn])ZEEΦ$ ` Бce>'~I=G sBTt+/XvEkZ0Z>8a\|HO$ܦ>xfh``fbY_ʠ2ŝR}/yՐ376*כZ&%g&T'e%UƗ%3d>Oڠ$f[Tx:lsSS< *Nu~󥿟OvwP5,I-.)f3޵oҭ71;5-3'U/1_yȤ=,qەnB*x+IIc@HIX.C6 100755q+"? exysCԬ;Y2}sy7740075\$,^P wrGs*>;/Ucr6TIjqI1âkwy7Rˮ'(rQ(ta={nݓ3y-{*N`=Vw;m7[ -crea[sԝژA/.YH /{mb!xys;eW2xo][Yd&;x+II:ye6.'100755/ צMxys HEsm76.nQB69{x:IIDI&}\uX hAC|2-,سR1xYII!c8 vQpn\ 9FEc!5uJy59UFr7ޙtestsIXöiI}/&C4;;pO#f1x:IIDS߫`6jTX |#7.fRnzxys Z\{\o",_2m41JxtII#g ,#ͣhd#7ҋ&bpnDaPSl$U6x'J]7l100644 util.hW,/uJwC0+Dܓ$Q:6rx9II#g ,#ͣhd#7ҋ&bpnDaPSl$B:\xys;eK-MjIw$6/ 8g2_ xys;e5)nߟmwR4,By1 sWaLboȃwLӓk~(^} P"AL ғu2+i?/ղ 0ڑmr8|TSg fГAml){4DZEǰɗSx100644y| *7v6s-2${R5Ϙߜ[=v1˅I"BZr/\ѼDu%ݽl}XO '$ b/s:wsD 0D e7\D100755 16-sim-arch_basic.pyeS2WڛwX .%d RۨV$b5$Ϯt d{p6Jn SB(25Cn c2s[9N?e4kx #3/PXyH/TnVȳ k)Ls$88]." Cq 100755py:{D% ] M*yKB. +hVE#<4QUp8$fu+ҪZn])ZEEΦ$ ` Бce>'~I=G sBTt+/XvEkZ0Z>O?*N?6bԕ$ Jxys;e{odN'1^x!IID}q]B 7DxSII_ FNBis:e3j8A6100755 54-live-binary_tree.py"P? N+lYC4 9:+^bx II˹磾kJUF1100755qpyɢKAO!nR}p(ktests(^} P"AL ҳGI&}\uX2&XE0z X㌧\Hr 5<8~6Ɠ!}AV51m4ltests9!j-=Z;;?6JY BF/ǚ100755/ 0!y;|x+II$+3bX!2ûϠW100755q+"/TxDIIDga@b"kX6&y'eY.mQB z; Q:7.}A c|MxGݚ.F/{alۓ$Ao97$o>vBV100644testsR:% IӇѠ ~ZSF773-T[q100755 36-sim-ipc_syscalls.py."?ݭ@f!sֻ2"g' : **pÎsn kWŸK !@'âP߳7ktests#^0*'al4]Gc怯>SگtD!ru$Hsx!IIDe$#\^tLX90x+II1 (|欴煌100755/ t`xbII˹磾kJUF1100755qpyɢKAO!nR}p(ktests(^} P"AL ҳ!P+5x[̸qBHNM}5%|^2 ^x[̸qBH~s*SEQjӎ ORx[̸qBjOgTEk,y Px[̸qBȱ <$FsJlX *xg\*KӤӰYx{(ܥ,x[̸qB{T5k}miS6*x[̸qBU"~ V xx{y!rc07\ܶld9FI;עԉj)2<|k LLs 3sj OV9叟e&2ښmQʯ*ڴ:'e%9z *;fM?@˟ҧw8 YAT xiBy 9G~.sVWtD}QZ9C1CFvCO諩Pu=VfL^CP*"2 xNjWlQbHtjat:5ε6>Erew&#Uڛ100644 scmp_bpf_sim.cFI<5Ry<jÓu=69Ǒ'zhN LxeF-100644 util.h$j'wbPAxߟ^줹%$;Ry9_x[̸qBjOgTEk,y 7x8qBȓO?fb!-w__|~ ``x33 $(m@(2G5:5heOcJ4 #x8qHv||} |E&Nt nox3ƌ*gs֟^8͹AGI5-x8qBkuV"ϖڪ Tx8qBH֑G;'׫ݿ. -`x8qBȕ=nEl7YwO̙ x8qBg{uw\JK} # x8qo+13Vmo:H xx8qBk${zZM j2 s9x-_Hv_OYmfCW x5QΕ7b3%An&ؑ$#2xsb^Y/l[Ց$Y\xF1۪~U?]vx{$@DA/=$3=/(豰_٥FաBN(?{ U囘 ]i_kN~FlmsSSĢ ĜluV5pd=Sj.K/3(86 x8Z\c?3Is1dmx`nrA1_?8J\דQx8Z\c?3Is1dmx`nrjdc7. lT#x!P|%gHmkpg'd|"@x8ZB:]@VJgxh_:~LnrR@v<&xw"?x!`(̫E mub7 oxS`(̫E mub7M9ACixc:Ebw\`-iB[>&4bx jdc7. l`'ix!8MDA/=$3=/(豰_٥FաBN(?{ U囘 é}3bv{=,y˷Wtr!(ú[+ޚm8o2wў)5Ml~06x!P|%gHmkpg'd2 0x!8Cpvl|Uc^42_Y*iͬ ^ix9v +䬽 6Mu}xgDljo([OI{(hKxg{[UļT9&{( ^'x[:!pc2T厕)FNeZ7}Ix _jTx[:!pc9jx[ϺuFLG7^5RW mvLد ; x[Ϻuԍ<ehPbl΢M"mh緮VDD]n;h`zwI'#t#k=OBf^rNiJ*7vmj~6^V<(r2Sp)wsh:.]*z!ZKRKVMPhX%>yJ|~~N1ü3]JIE{\Bx`]Ūdb z%I {yb7ؗgœy/x9Qrp,FpFf]ŠSlhs"G?)>o@ Gx [43jT$'>$d]FNͲ'3֛Manx=^}ӏ/  x bXCY|WIɓ C3 WG_WV!߼.-ٽɝN:9Cno4w,k FLX]Z\R̠T\vr=ᨦW/iܟ)fpჹ>|P' PHx v6d?aee ./x[źuCHħ[Wv+k^.,&J0,xD"40000 .github 7q KƏ)ϋ`2"ԑɐ94 vM)RNRx[źuCHf߫gG.{#ec1 .& ~xZe 쾗E +qOc^U)-4h-a6R\7Vji'40000 testsk|"0T֧Tf r%hx[źuC^6.>ǷwMSar(]L x vÕ)%/9 /x[źuCcld<*y_~Iط,& [x[źuC^/zV=bݤL,&C ,x[źuH[W+"Uyxkn4ymc #Yx[QIQ*Q׼[<57ُ1.x``P$RS|k҃'Z/;abZx eN: j5 m۱{x9š5P k#AT$0#S\]Jk:4265>o@TxKM(nyW$]=nW{(ӯ*xgpup 1֑{(]x[̸qB;fsw|c{⾉ xWkseK~4NCQͩh$ŝ'YK`#bﹻKdpyw}օSѕJSS5NjNZٮ~/k(׮!Όl8:*u?uKތ$JzTO4NݺaS*;d63e]2u:Uvef !ֵ]V MRgGG/Fru?H8`:]"N~eGyiv41ug:YTJMEdNלUNz'fZ/lU>VefڌR,m}\62[^yVLhwViF=|o:s'/z&ɂS5q](n'ABgʒII"gꐚRi+u?;ڹL9[jkUɒ]q.qP9U*Ek[ 0u^ R&@*Or)W^AmbQgo('wP΃3ѴVT(,H8T;ښq#[Dh.+]jCdf MS2P١OukEʚE]nSU]fh(ȷڽY)Qylϗ_ -}%޷fمJ 77K(5Q۞X-k7&/awkƮjJhJCQm\̜\_P^0v?:.i݈h`K;Ny܋.jQsiѵU4emZh=7iWP2(COЇ1Q\3BW.Pw2wY_֡Pu"\d݀l&Πm{diMO)]NO/gg?_>/&N֋`vM)Zh]h6(_pmt .̚N<0!V]|Bx ^6QF35vN+~F K̲.  nx۷P*+:};Ii1L?B Իu?\!>|`ۡ^ -l._w `F*kϨn 27)or VcGq8D*Wwܨ=$ۨT6U` ٹ´HhSG1^]I '?A N~<rtDOOt:}ΏDGS:9>ɘ/&cz>y1kSѻTHޙjX_? ^ZSzf2'1={t2}򄞞Nhzz<|)KK5Aܻ}*9 8 \#fMӬ&JpuNQQ>sxs&w@(zeV)By7\e~#f+B3GKћ mܐ΁PYE?>ד_6#ʅx<1u?ֱ8[)eaυ-ћX\ Vmx=Gt8͓ԡC1CN+\@psb# =ZiEr{2pRb}> ~s0|8$] w ד_G&Bʉeb RQPe0XuҎRbFP wu&[f b٣`Y(Dݡ9L?"7 ϨRVhBY /%C ؾЬTdlQa>c$*Lop K[ZQ ˱ qQ4[Kzi\{Kv?ǐeb,ә69rAc1d&yIL6qijt]e* p06dD|(nmo^QO2GpӞ5ԕVik~`H8>U5/`@Nw;3=Cr=-5Ec_\g^hEn#]$G N~]}XeCo; xк;fjɳET&d|[D v5xкs>NS$ApRxza>hfn^qFfjNJ^f~IQbYf$&uS79S/(]8599?@?'3 ܬtc{.I.Svx~C}&~@ǼĜ≊e8rˋ* st**ss&g,&9FCQxS}6q3ݤtǢ s!61^ 1~xL}>B& mas:Qx>CcW6D3 \3/x 9xF}w<3DT&H2rM^! Ex{٣a>DmY+촜b}̼bU#ϼĒ<ĔTtļ <͉ ś3> l&x{ZsC,)~#X=x&)&A  are &  x=s6@ݹFȊc'y}N9ŕ]*Vu2d^(RGRu7>z8X,vb~] ϋ3 F On∽ "?&i[9g$dg-s] 3z6D9 ڀGڙKo;E]4xۥȉYx Hy*z>yxڹ\ >X(/Bb 0@I£l]{۽:;o{烏,N{}N/X;Ww뿻_^w A@7&C} Le?R 0 "@RyyFkP0&_3 ,K7Y6;z=8< %6HXȣɜO0X#9LQ7l__L%F, }1'Z sO  E$,]!Ul*Ad@Mâ?'i0퀛܃Qr˥Mx*۞aug!Ľ8C}瑇_vpY4[DeW> 89niq?8i@3ltDc&=kJ9˾p.ң/ްuy>p.ϠR pHw£1Ǚ- 0L.¦PG8v}~v䀯(ymDӏ  k-ȭIKMt..wID͓A&+F԰@b UL=DVRڧ݋{rrOJQR_u@N2O8xF;X3U `4=jHvcF|>r XvQϏg͏cGmOCtnyh4w PI N2&'T]s&#=Ux4L%k,r5ʏvW3TY{,e7wffY0mE" U<M;-dC z(vP.Ȇ$ϪaF#QDl* jO$0EUhnq*jzizovDD7ww+k&A&Jq"IiaijgT3ř1rCP0d* sN(NA)-gp ÷^]_^HhX=@}^/ì\םsS{^Z7n8]R?@Qhhh4`2o@]h+IyNpGTDjKj˪YGujKD%YeYA/3)}Ϧ\kd򿂳b=i뢃aMUn{i[:)8k"͞4gq5md8FHgexI`&9<2әlST>Z9Jx0y(9d޾>yvNCk䅔cQ]b(iHgw)7QCZ w2 MJt%]5IUP%+Ndcv;r =M7I]9U؟|K'O,m%-e `1Suane5ž~[gm2hU?BK|@hD7^PgP%`*2X /`-t{y.dIl;W'y=|` sJnQ|+)0ZX] 70 ~z@CYjtꃫqPPjT _HQ'dV[ VbYU@Pfq nҨt-bRnZP+5!J+eT*=TrL/.rޯ23(+U84CXpLE8~qͰYΡn3ENKjzZ  97x }TF5L".߶;f;ٖ[/=qקWPԓZ--c8m6 o-F-ݶ1m7h`ƔX%0[ ZvYS-ZV'[Ʃl&A[0olזJ7kkKfZ3]l9܉}VT݃ؼVoY#[5j9=%wi6[vq[wUЩ۾=":~[5guc ˨_Y2?42\KV ꮎz٤fUHS.}N(o,d{:#C:Мr \6pG )pXmqnX,˒mbJB.O;}ʳ8&-B7P#Юv2 /.*;Q"qfI%|RWGfty. eAJq@6*Or7yz2GB=+lJ2Q0'`GU1/z72Ma9.ep4Lݣ 6 >ώtrTf`vقvq^%`Me0OCN^uW_PI͙|=EΏ_;rf%l#S1^jpE]ΧAgp5tr(c-8I&H8X4le^ ,4Ta`aM=z4N?/uI qK'p/#WEYWE&&Q؂'xVrf1Ϛgq6qm^niPn+lfo"@cw)oup ܳZwP whkp/ 5 7[qevLYPU~e2q"(G-(·(Ѭ wj݋~a%rV317%ܮ.h+Q eOXCtp>ʙvEG,gx4Xb-͐$X bsE(h Stm+ZrmtTZpkҍ |hqw ~y+>tS)!ݭ;E בnB~չU:[0$mVʒ:Ib ŻSSjMY׷|i/R:Zs-,ceùK;>>+כweU}#֧bXM„vFVYv;sT"LCH+A^-a!·1U+T+e,-쎬SsޥHسI;=KjX4uq\5PhI$L8})Gc6 Ze[ ;+T-o;uT&BT :gaxY0"]#9$D+͈j 8n GxD̏Ic{݀]" b+5*s%LIK4^uijZ78j +^fﮉnRi1T)!ȸP=p|\Qws 9/%SZ씇)5dƔKrmLݥzvMjQrs%p~=(IvysY:C52ߎ/SӨցGS#?WC,Y ]=S0_2umTY6nu:)Ѣ4sNń8+P~LY\iEP+ZO5TSERZ=$Rf$Qк4FS *1s̶cTmS%^ՍīVkւuj ̢ʘ/O^ց]n"fÇGsՌ辟,cZ'űﺱƣG=^9{qy>Gs2@S I7fZbjVr堅|:ҫ`{m=tRl=5'iLR(V\jTUU< )[]kj#ui017. Nkx⿵ I (UoP.b9`k9DyֺO:7oΪVI ͹ziځfQ<&f>MU1W܉ϫ)_ &0J"|nGQz1&brBg*P+z#"X;SK/ߧ ^e3!Zj.2pa]YA<k5Pno;\nMn 4H*,TtV,Y+/k% ho8m(9hѯ$mywKܻYòPa ϗPdq"D5~,%őo[b)."㚻.QmFؒuϗ#]w*3~Lg&_}xLS͵r) cT*o&2=dTo1}d@10+-1録w3𜉫2]sx +=f9Q\JƋB#a-ZBe>H{G:ӳ[L6Gà) tbu^HQԱoWXgcORdvA]qOw Zm=y6ӡU3.%dTN0*v?= oֺ,B薂qKC!x?%-Wӻʤ_5 |O?Q}Eg4oȴՃ7",B`};YZ!@ N2 XG { Z3$TLb1 lhWgl.5$DT] 0:-ʷ@҄͛:O>&V[8UhbӳP Oh_|,͓R)/#8_ip 2jxmN0%&z3͒-*! -)Cd'd 0 uc Xx$G1O|w}nSo2o&*xqHbU| 8t2s#u;ݏj81WkaJ{A2HPMQ@,V5vm9 nσN &Yv. t.o~[GㆷxXd /_7Cw1Zd'$6#KLiw;QUBistUs`ckO qJʈ YPմRWir=><tMf/( Ԝ4 P Zvj@K&/K| b{j zpSR > )%@" i'@|4YSUsrFbQU,ܽ`#`j&KJjvMY~f PݓkM0|3l,;;Lf+Zx]RAk0C m]lCf0q#ɒIjd]Ӯ&Nӓ?~?_ĕ˘ Y+I0mDBZpjm HCxyYgQ|>,hu` c'H? EDY\{m\MM#`6 * raf Gmq$CmJɥ-ume*fM;͏fODx_k0şO!K b10ʼ8=Q-麋'y[.\Αlěu`-OZS 4E u%›Xn:]΀l)q{4o\{);НP?. ^J´WSy}tHLQy*QI4mgrQȶ'WWJJ2i<9#"rwuzTKq@(@^0ZPui>HH5VYܱ`^FykJy?d&vCK]Cs#iFfPf;'˞[kx;izNǢta8qnqfnbNN~9'ѭ064565C>>D&?gF3YEx@Z1' 'A拌vL|B{xisb^~^frbOI9ciIF~BHeNjGfrvMIe Ӣkǥ ]>(/Yr+U`mNvǜ۽ήq7]oA u/6GiƳݾp{ =XY!h³f xQ0scbe,|>0(S>5j|Nۣ˫i=q?vm7߿5L߼Vڣ^>຃Aܮ7u\>g{e45ukni|zM b{눤:.dH4\h$2gSYFr!o55 /օy9UBr-XcG[YDPQCb2 6po6: >tCg|9rw9M#5Hh <^`udf QIa z§v}뾌p\>[1m[vWX%L p*Zpr2;gJl]rT)9a-VK>C1CtJY:"P|SJo/`H+y( *LBgpk#OB/iƅBh#V;󟲸*yтί0.62:|8KPp+%S|C$ʮ"Y x0bE[?I(2>ł*cSJ={ɶfyxLrX-tؽΏ:Q>;+ S3ڪ߭` /B+  OJ4.u M1*bt̙ i9|X$A(2kwne8ptb$>V.;g_5=$ڪnχrE,#ZR,p[f8V:ZHuPl\QWy1wBva ];O 0l <Ё$L E1h T ϭۓ%wI~I T=[# s]jQDk 6xMدCՂ8ͣFGKKfbOHR>4Wi`k!OBѯg{9Ӂvw<9vŜ[)p|BD:famlMxuIk,f;fS!"E%x[sHP9' EABrkW9Օj,m-xo߯{zY`KGݿfԷC̶UHz^5>#ӐܵU0`CΫ pwHn'L=ȫpƙ_"[/?#c{)?vRsg 9g`)gdĦ>I;#F܈Pǝ_P0N%#+A9c\ONO|n @S6#T Zb 3m$[l5#oG#?F+$U!/!Aʁp kȌXyuPO7n1Gɧd~>b0-;U蹀 pGur{gpz;SfBzdܛ> {20LG=67v8,'?R PsȒ1X2w"%6ӃX 4f='A!4~]G ?> ) qy^1G~c1*VݙqT4sKcǍgA`vTm# [h0rxyYًӓQWe `oWn(*+?K5 )w]/ Krj+}#N_W ߗǙc1?#E^K=ZlGD{vPFrOa};*T|r`, $?9< 9-k0|z"a>s=HMl4M;`L|G$Ŝ%{v7 Lb]Sk:& BvmB((+#1/ymK957q#Q;O =z.ÐB:LV1ȅ^2 VQlEE2I<'v9*i<׃wVf( 4%dYt2咏U/w\-ș.7z=a_}u=s#w8Xf0CZg$ ?X:>&umBa,?Rυʃ%BL0It4Xc{4 ;msOd<wa0_}׶d~Chl~w3>L{(ɶ#k7̥S(=fE#4 M pH]C_4ɬ\G1TDC@R#Fl -zl[~lϘP+CVE/k-ӓrzL.E五Xp[BN+2 onFjsX`)J,X*43L&UKUNWǚTEqo2^\R1$bW d+Uϟ ,LSHd*Õ^ÌvX1$mIy].Dm b `j` _|bb6IV*RrM2B^^#_t#X#.yR 1CEZӓZ q h] "l-H2,1z!H&`gdfmthȯlx^KIIuht chOɨt#3Vf:Ś 0@t*I]6jQ:%axJ%0As>C5qCcUڬt^fW8-ssexAI_uDtJ64hfF,;-I~K ߪI]0_.T'R7KrzssiZ*E]5tVJҟ \Xr8_K@^5#gYMv>iKwUJz /F\?_5&?Byt>z-nNbYN'Ϯ7N'ۛnF/IW&TDlM=,Ă;,GeaNLm^cZC*Ia! QPfy[ZhbɎ?LjcjXlיk8u(ĈA ^z|jq~ $mi fjp68ݶEslfRQG2P%ݗcRJj{ZrQ}a/;|m*5އ-jlP) #E1DVIJM>-8Z&ZW`D_O1jP˝wxc<xkr>gio4R 8}[~/j& #/UojxѶv,M@NI5}@Ct;Ʀ!'˖X3l^ʍ#ݚK &0cPy  q$z| |Ir,,xSO=_3J!:k!u;d;MwfE<2|$*U|$(z=lMxks׋rș) }{[><4{9(qlz.'&D\ N9YA^?n{t!#(yk2_)wٱ4:ꊫ JY-Iy*I^Kr,#K^u5f s-m>[45~ vWa#e;%6PohV9^90bNW\|X4yK(ֆUS]1Xc+c>Rw;/2m?e{ cL!ά{#<1 ܆KGj-'Ʌ.et9 k_]4Z**2djItC:F7k-5*-XS3;TQDĬEaln)5>I5rUb;ZNZ7Bi ߳F|b y8wr,[Y[t%Od"7ivE QhR(\2m'PmY ΤuG73\Z9fnmnA1(0VSONݹA, c$:~AY:' HUy[M.ؕ (y@+TQ%7]ke@bֲW>x}s_)Mɏm,[l˶ζHesXCr(E03CJ!)K[SFp uWQ1g^2ɫiR%|ϋUժ;G>RGXNjd>+2Cϒz`bE}VՇd1UԄlQ]},4IyLSU2)uU,(Uu uZ%~QY1&ЮFP|>KUJuUVC:ަUU_yZ&Sa1f#6yBhs,`+j1;Kj-"8>;~_tCm^_m#Z\G` ޿|yu+?P/fàwCSN bɫX}>Ёf3`8w廓dHq͏'}5rQS<\!Pip4(Ӫ"[}N/IyKJIYk&6ɦX:zԸ%|gT d8%4!Y\~6#DXrKkp<$`td:UvV3OZ 2ng~j w)/~O*CLױ?m6/06ޏ: Hk]HdZ_<[Psh ֛Fv#%,D}DmXYM8ۈ4J{x8E? Oin <N"BYTp@1-&z"D$dU^;IZvfv/ȗ+{Eq#.?DD)`>q(Ƽ#Wv Fy+&!)btB@YQf o3AKv,mANJ#9 GE2Cs9Ci0^̥>1sOx)GΒ.js)Cчa ؟6!y1Fr@(G V ƀ/JY-̆+ ',y~EJ_ x-RoRXo)숻|&Ć5uLUz$3'o{ >;89E]>TO-z(?bu&5ȇFZ:ӿ$ UR`-u$cbA%Ih>h7F:I:ZqEÈeqZ&pTpu?<8|Eb)")3JR\h*ዷƻ+BYL?Y#FF ? C^KYR\ ϸ_?+$<'j,{vT0TKs!g-j>ub'9mqۙ38T.jPAoj0% 8%Ё_8‰WHR9]˳ U1fT36v][?E \ ¯eC6N[.pWVmwLgE:NeO@[ Ham`Eϋ"[b5̠BpRw2@.5iJZ'O!sb^X du:qBTSz #}sV 2rTM #l6#nշq6Pi2Q]H2R'@o`p~C^)tSIU}ڏבϹϷtW+Al%0JA*Ғ0ZFx,5`:)d3f|zdx#O5CX^X lVi#gl2PebSunw,pxUP㷁 XѯRJFAD %TRsZFԯQkɉw7#*|w+,/(]8r{j02*6?:Of1S/R/^'e1]R6dU힥bkQ5"قY:_TEQC#WO/ P{#xPy_'҃^f5]&U%]c Bݦ65TiBJU 5VV@Ó0CU@FwsT rO'|&T-ɖ-_hW@FHp+!vw+Z DNAW+f)Z:[e#>]3H+uD8ר`H!}P0"7!iHF}En?Pa%f\[kHpp%Zy !iv-7;֮QZѢE67>ZpBH#p.LwY ΊEN'O 6XHHPw&rc& -&"eBt>]Tº u4ՙoL#OBFmVv!~o=$Iҡ:ZqKӯP<瓺gp'OE{ʁ [NwªP b{jz5 ӂ]̒99Yڸh o YµENi|[?U[ x3he-Q_[:^P&t}Y n}.I:rn|ﰨ$3;2pCJM?hY4=ZUݹ|9{fl3@i難3qF#޽o+t56 ܿF:/*kٜ)9op6ڑ]cˆc~ 6??p6.bvlla9>fE6[Ss 5MBʯ4M_0yyjj:*1]cDS oiYx['OOEzd!8pM"Ӻ}P2$ Ҏk K9BiKoA\JF(a<)(|\=ji2 fL{mi  (Hhg=ҳʍBœciĨ-{#;,:,M -Ψ*L-禍CɎ/zyQ՟tncvEMEF'~7VmDhU0ixc#҆ă6>IRJfq' ӴVgiJ/>=!˗a50겚55>_zyd`f\踮3ԍxc"۪ȧ&׺q[C8¤yțkOfݩ q60ZOFOmnnfki@`F.fO| *ȁy-M6QUϞeT>xÞh%ZZ˷ƹG=nq>lEM(W(k& xfʴ̐w:˰k;̈B*0 8M>б,*qLMSS0QtbnKzmhSŷpOiJcյBO<՘`Q1fֹڝbwW}wϬ |5l2-.u&GQ؏R.w݋]A;¯sG \6zU"<5yA9\+ev+a5:(h$ؖQb'7%v֟q5;VLGjݕs]j>[lß+)Z;ZwC{ dnA}IPA#rA_'Q" f'ӬXT0BJԪ)%_ 4͝MWw1[[^296 r!ػ5I4|ҭT= hW-_'ݘK7k\+J`8ZSbW_֚̑VpH`%jaeF.8m*&#>6JБ:QokŀBa/ҍy*N!:;leG'=QN:Q?L8=gn@ovAJ+ UkS!,wZnIQSUGN%cžI@v'O)2' Dz FmL6'- )Dk` DAHp1Q !'6?ik̠͢պ)šie#r3 '; n͉$}i?O8(H(ɆbnC"¨ht!:ǩһ 6CJYiHD+dIV v{z>z C>GzF%N6`e:iPVWUG-jo= -Roݭj-N -6doG_-`_O R|𾾙1GQE:O"UZhX5u5I_M9ańXgvX6IVVuC}.ncHg"ϖî3&/Hqd7ZiV&?EpizМ1>P8e ӗ/}VL¨eC19 ]3&EAK!-^hHrs] -\#a˒s]J pS'ۂ"!l2FS6MX\ }=˝]A:RVN_uNu,)\ )l:U`\G MB@Q1tZppKkŞxtot -XsE(V.oy DNt  |~)&1N@ hX+CF3im\&z`T~1\]1.NW F@9tlև'<ׯN]23`X=gf_r$I=.DN^ )uCDl·R,ͺ <,ѹΫA*LILjk0&=ڵ{_¢Uϧl r=86ˀ܍A77Z S5FF38{[Vr4[E:aC>K y\"ƃ5f}HǗpb!(ݗH-ei!H5d 6GEN][o~~ Im}k k{HPC/f8:1 %}艔s~>ߒ0+wf22&>kf*[SydT'Qݠ 4 oӘlCwCvI+Z\Zh$pbxNoi.&q+92nמP+L|}P w?f5gtɡ2D+H,Iaw[i#!=S>ftrAxz93X`MjDQy;d6Ňq6֬%'IE2gPrJ~Jbc b[S|.tzzEeM|dh`prng۲Γ5H6<89@{[{ɟyy/&O繖6`E& 4aIָV>[xJDRPh/9!37e}Ȋx/gA޽/|J OnT^#@6ͤ-ߣ%-)> ߿jaG,'^4'|I˼$>z Я#^Y&W87m:֘Z() w`v5-NQ䰝F^ ZմPYL|S+/U2Cl&&_؄Gh( ksLH}`F7KÖ: v(7FE=x'醠{8c8N0cSokfj@k>d4.ҽ;tZHX` {0ӳ,x ^v+ Dl(9X] ;2( /5ZzL~͓e_=,pZҧ0a-ܹ2]Vo:ב( RHaET!Ȫ #&2SWBL/cƉ2:d:f~3m8nynn^/,;jY_}22+`GG~|kkYT W|?w귴nS" \$ڏgm6 &O~Q^"&O G>9nHhQ4ʰ)"]>mpmqa'b|:OKWή`@VWcHVx+KDN']8"1Ig#r 22=q+j 2tvQizL}G56Rnn4P)ky4vg%M |6Ȳ.q):_6MٙFb\1k;tn2=sOF R5Pү;H`wH \k07+1n(=+z8Yξgn5sr✭¨=_u.([;]eujEYKBjAsMR }-&N?.U_KH9ENTO~doIG24 cJɉvK*6f)yΑOKt?K+Sa2b g<(tA5aN!<6:94Bᆑ*1dj3gn)oұˊEY e4-_DIJѵ)V~1RV `ZT%OhQ7ڰ;oS8eaAՒ.7+HA({WHB E4"MD.8nVcԛ'{G:!| kcۢ@'r0rеx}T)c W>V==v4M;Sǎn$|mdʏܨruØƯMb#|B*-|K^q-sgx\2gJ7:o}8u3BLͦ $#mB5ֆx=EO#b A2b3v6j>f3SQjk:Ҧ5ohĹ:Tƺ˾v<(H2==w? ~VǗQ67uLѰw+BOڎfcaQ$*);d娹CN6eG\couFfdC@MO򳛱[=tT=MdϘyy5Ft@^:-tsVXH$}-ñ(5A֊F?VN*EyEm"Z>&̒c&;k ch73Bpa訳[ʛRt^J.FH3xU@z# ˵B^Cp 5laC k5'5̰dHE-K7:6Rlp!uJ>}_w6ffxf}w}<aFq}+ϒYyߤwt Tnoɹ&죕U<]+D"4NcoSʗ׹*YM6f[HR+: hI_Es$6s8_Ey?SV$KO#p{̨5ay=:0Yv*Ky] cZKN˒!JjفZ&oדoK+( .j3Vbľws\,A%DƏ׵nK{YY0NzVrNvf\,hi.urˆSMK^lCoݸ+\&c\/-O+!.SWz]&#s Z rUF`̒T7P kZj,=2YàӝZ< G<%r9c@:J w)/CD1hXZz~{kc3Z/>?7_p݌Peҕr|xW <n+֧b4M.*DxAOF(fS2]Q|YX+PUs lAjB+mieՒC寴r8:&r4ߊH歋?Mg~ U &{Yy`Cx%f@O1E;ɴROEtaXi]c0N;S9,-eGSX_Md2"BJ/FoS[| HEV8by`>`0/Sw#\l&%BӐ9`/051 pXGkydflOCRIih.ҲuD7wй4=mq2j PI>4ҭŶdc7XOi>ǍolS }{IkԟZaB' [ߞIv>n|Swq/OnGz%Z2lj3 z4H˽oOl6:>5Ȇ,h.(dHt)CE'4H&$:"_5KޤE@"tBh,oQSO>5Ƽj.!p0b2,$<` gdЋxW' 8fkK< ɀMmM@+ g yQUH=5)!&ѥ S5"AV迯.IR ɰb. E]aDz*4RObe I-/`o.<J۶|eF y"|% b'ֈL8&嵅hbdEa aHI4N~y\-2PA*x YHZdDg(Ѭvl(: ֒7ZeR=7*z֝/VBr#N+gNW,e(yldRE1A_H0 3~cv|.]fQ? pj&<*WI4(_J/#|fۗv|钦|liXJY[M iW<÷%-oSп Gb]mr\,6\eqBZYb:MERhyG>"Q2>]_$5Ĝ|(}3g@._ʴv"_d kK5e-ݼɘyh%o*=-GqCQbgl4F@C N^ ,y 8/)b.iR>e=MG?nSLL{lI +&^Lb0]&SjβxhIzʖ2KaXن/Ekz8t1 ]tХgܡk|4FmI%K ej] ZyuQƜj#^YWoZ| 6 kR<-Ҿ,.>f+ȓR0yD ~GՐ{s'6a3+g JY(&^K]GA?1Rِ X <7ÇDQhKh# ge_-^qP1_*[ tۍFlyCդRtnQ)x‹[~p秓;J:U @lDA*1fQA2I œ{+erY~<'a u1wj>$/ O7 7:׽s[߉ 'ͭ^7F\mF1<چZ}m,JC!!J|oZ^cF4鼶>tO'4+;b( I\OdZJ[b 2)ǕT> uwA@nCx$!N>)j`+Oi(H{?mh"cbIAi8"'7}u*{O:2ҹ 2FL4ɶJ9m D(}G. h4$lP8͒;z5xw*N;~V`ӵG}8|k,~UtP: v!.'(s#08{R[q,$6#hs6&<3qk̛3mLNTtsH.c+F.,1D%JO5ESǢ:TԂ^HqjQI?H;zyHlՍlc5V9D^4ɧLVw=1 "v8U5~ߎ_\S@a SP&AVHlrE,\nE?d1gy:ؽV %fg`"j\o])d(#\P.. !)- x{%&)&G0'556v' SKӐFLz?ވDXsIٸúoKNO_}55;KkYnD:!~nޛc{7WkY17X-vkrO5ȴԼiy?;nĝ Jj+hڿk{ؿڅ`=m &k3-KsUV>:I ֏/ArE-ܖZv-lu3P$7YS#8xa(:mI֩"^?jBIj Ԝ |t4(FwI(] JΊ=G8X+N߃We"J<̙nk ;GǽPl07C]*8q79^Fj)jm(/A )1*1:Nf?ՓК-_ i` @ڧ&*>T@: 6&rn5^ZEz~0Wm;֫g#}b̠Q E|. \/kT}S1țG{I5*ٍ9#9).n5^ cʺ8EI] #>pɞONN_IC97 :ʃW,##+^F~EW ?:,b&H.ǟ┒9ybpYeS3Nb+藣" ('8#lE))Dۛ{rE oiBb3B&%^Rl6-) wgR0*6,6^S؆QD]!$e2w{?yO~NÛs@Tif0{IӻOG?ir5'7x6#ondHdt5l< yA}+wpA@s/ra202 {d> D[?"ŤOsHC?l<}u|n0>r EQ82\jm5p͒u- ñWaZu ~gOEFM(SL ߟX6E@WaBb1]-nq{yrr"ؑHRKfOD`ό4G\wzrf@OO:Ni"X?‹!>cq/V"XVTuQl7@* dnYWDz$t ) &-VvB]mR!<>N!U@ »tP0ɅJς.p>HtgI(|`~_ċhxugx1zOA}A?$/l_ vށ/Dy߳딋,$p`: JL4qB-"Kork--^m$eq{"O2wɒS&ۆ/#`]2tE6l&mm"nIF*sΊ]+ꨉ>sj:wYFԔVY3+ pj*"p3J*:p: UW)v} K{E&QUןadismAE]_U閒ez(;!/| }789׈K/ J)-HY: ?TnrEr+6>fj%Ǝ4~ڇWubɺF\mffLN6Lg[{Nh lpmscuZgiw ڤ#faE62akWmaŨ6i*&-sÚd6JʨVc= ',WNTi yWpH|Kޤ l|" 0T i_AuSwBW̷>ACZٌն>D n?%zQQ- D>ֶ'zxnT%8]z( 'XiȡUHeRBϔT(KR@ Ydy !UQ#f Ulj=HP-ND8eGp?ro{yu尌|.)IιdtNLd!(k'5,j4:}ރC,ʋƺKC F.'g܇hI_-R~g9Ң,C!P,g2Up%*ܳL%y/w6pbaf*[N lݓ:; @h cn+I9>On:ic˚)%2}E~OpRG\|Kͫh],XV>shfs#/fCaUPӵZg5t9 Zs)oT%BJ}0[ byZ([*5ZaTVv8ƒ-=bb3"Da%64,7ǎqdCU(I~{^(H+ 'qG)!I臼Kjsm;KFe.}]J rU-cB"b^(Z&P4'"1Be= kqͲgoHxu#O)jxյuHHz䉞~2GtX~Z[5O>B|x'?}a?c/x n@3|{tmGAc~_ \[wR22:+MTU &e w /dLW ޿̛,ꈶogL R0y=,~] o\ ucOl~2G4#\R><?iç)^WkiBDsx^qlD}peqrbNBHbRN[i^rIf~^1)8Teg(h$k*I#TԔ\;>Ғ"+_ J D肵@Z)X)g*'e%+ؤCl85.,?Yb Ɇ,fE % `FJjZf^&cX0'&eNNfԘRO D6W~ca MN)J,KMմ-3y N7bd[d:;tͷ=- 4vv'}'6肖(A{٬ Œ EmDC)> 9$Dh[&G;UAr~1F&l8+lEJjni|ny% 毗 E adp75 vl@KQ=p/e5FFd#Rˋ2KRQT T6yz(8,4i&`eXq$AS-F)t? 'O F$lfNؼB_Ik"{hCu2yg:3xQJA%$>f 1+f+AM5Fl|uwKaƠ0`X(~h;3OX)M~q{ɺ_Ye${oտ c_( B7 \x^qo"Ff %..}-3SKsr89 SR2R!ɜ@Ck-3Rl8JS`g߀x g`W-=&YYY" T3!4d<7J91)srObnj|Qb9P V@IX pKMo]Pw[Dj<Ȧ̒T$HY+yVzx [>@x\=='JsRSRtjNjoxMhAɇ-X1 tj솶6i MZBkCki.mJ)yRVAM88%90G='ӡ:R MSCM`QB򺨨`,˧/:\3o;zOX/gd/s\ dət917-%+P#0}^"c eEB\b)k<RbHanӁ%UN**FB'[12$ D$eSTS$ɪTmM뚊O#E uk n0MEYFY5=: E׊^H֥ u`M;a3>l0 #)2]'BfV1i2}9C\Icuxs7?.}].@p槳.'HW"qj,a&n9_zlEe:(}va^گ7{} !cA[ L91w|c>;@MJac=o1Tm2{V" F+|fw/.37lp3Ҝ= Yv\<+4^ʽ޷u \ټ, DX=6\r|g/e>#{o~X_jݸjRoy[gcfbqcG}%{[նB(=ZVމ9, x^%a=;[δ/ON-INQU,( B+,,HFQOvfNLʜ`e_X>QJ(.:y+XdVlP%ҥPAve-i9k%ju /*IOLI᪵ w(2x^l"Ff %..}-唊3SKsr89 SR2R3602'XIo.gann2o>},v[dv -ɽP B{A쇢0 Bf$`fJae*Y6+ne5AduWuG=DYhQLAO G]J;x!{WȪKy8l 3Rl8JS`g߀x g`W-=&YAm qd1<`'[(A,@}FLb8`<'pZs=i}xKhAÖlԘV:5`vCZ&-m졵z(f,&lRJnO^z T Ń[oŃ7"g6nF<3T<~SZR>Z& X%A)YBb6+p 20fy ƕ,#8`&!A.$ݤs2J[Th] n(gց)p5* K7xIY5yS+m[ lԡeg(A085I7'g88D *݄ $c @P PڦA! |}w!J-,)ƨ]̤RV8|PbտpU4 t54I~&bx YMRŬDZEݫ[Sنa,ұGDl/RITx$BAXQZdFMb$!+D]mzhBQ` HjmD2KVߋ{JTg~;` ,7YƘӟ3kb1^JA]{tV}}߻A?<)״oY}3!S4*f ~zCxbmfevhU>l=I{WL6RKtgρn3FGro୽}W,&"Ϫ,;*X? LџQr?/coLfm0Yלɽ>k- -Tvd#~km5} wǻ.)!xYvlSifE,@zgb*0 9xSMoAP ' =Bl `JthI6`c4`A }Ğ%c'@L )0mp358__)E'tJu$[Mx;.Jz e3%-W) : ɼdOըȧ)MT>K$K7T&;8XT5?:49X^[Kx;"gs@DzSĜT<ҢĢĒD4^r~ciIF~XB\-QځHKD+ddo\󝉯 Y/C $dN~,gSKprq)e*Cd$s ͹=]\4@fTr(1hFnIO'+pKiGnܜR`9MN90 8E' \"@zb4b4x;"uCpk@D TԔ\;.-Ғ"+_ J D肵l,TPlfťL~, f'g$'prq)e*Õd$s% ͹=]\4 &Ur(BXܒOVE'c"MN9(˛3*l )pL^3W|KIYd! 2یVps3x;""Ff %..}-l3SKsr89 SR2R!ɜ@Cs.. gxW7 J,I%Y=\&+pK3{Lv6)T)9ATdPSKdBWDMͥ5Ξ۟tChx;"ugsD5?##C3TԔ\;.-Ғ"+_ J D肵n4Y/CK_KȜYH'g$'prq)e*Cd$s ͹=]\4@fTr(<[9H+pKxܾ` MN90 8E' \"@ zb{KS Ex.sLEef&=]\4\\/p $%għd vrJA:\zřU `=\Jˁ0D'/\pv(&-6 Px.!9A3 dD']L՘ r3 L&G1Kkk)(8:y*hs)e*;;9rrrLfŌݟKzrs"ŕ h6GG㒚|Cvr>++L~!A34WAVar 'D& bE@CM<) 仜Җ^qfUcG|gkِK%+StB.)-`̟\0f(&-v CSs NXys' !'Qٙx.>5V_KAK9(3=DA#YSL#5'=U%5''H&L;V襤ځ8dYU7=S[AbQfq(fi! gxW7 & bE)iP9%<'唆1s0;yO6/J,WUK|{.vm?"aPnM[ ]PAx.[dsFif=9Yzr,,f`.Al##}|+7j'sZjrqM!ƓX~S^S_K?J$#X855X!?%E!(ZPRXRԫPaaofZ?[Xho@\RPW[\`:[L7ra%Sd]x|!9Afs&⒔$ ;.̼ҔTԢ|_LNyFmt ":hF!Rv2if&Q XwCpJ(3rNaW_\Y_ZSWĚ\\\A.npsTL[j.N< ;7 3 \2`PaqfU*PXIgk47>,H֚ sxG_KAK9(3=DT$XZ_d`Sa8dV奖%炰xłƖzJ\\Z d^fy0Ce0ҙ!^f)#bVMd=f86:>[6!.29=ˮ%bW''gpZsQFFx;ƾ}' %..}-bcKIJd3 999 ͹=]\4@j&'3MbQ^\S8*UV(35h}FLJ'3N9dEM̺70#nux;·^_KKAK5/#1/95E!8599?@ѱ(9D!891'G!$1)'9(3=DA#YSD!#D&7*;3<3ʡ(5%#DhHciIF~obQrfP:T)^\\1M^$58Wb"izJX١Ʌ쎎A@fi9([S8*UV$TrYrmVlkY9O6`yWLEzJX ɅlAΓ0KØY <'+ILeag(l"2y{l0ipq'(*@j;F=x;/Pť[lf\ TR_PYQ`d`hX`S_PX4ñ$#J! 4Gv(H+)"}. Bf&zJ\\Z `d^f9VKeփ Y%YΞ lvIN*K} Zx Px;7c4ɫ&b*,N.33PǪN.dd v0KA:\zřU AQ@%%'f坬&8jLd'ccMK/dXQiNj|bJ @P50 bx;wG_KAK9(3=DT$XZ_d`Sa8dV奖%炰xƖzJ\\Z @d^fyf }t!,WL~, fbbK` XD&O`  >gE4 x;wG_KAK9(3=DT$XZ_d`Sa8dV奖%炰xłƖzJ\\Z d^fy0Ceև0 Y@seA .N̪T[ g`(x3M :~B͐bK`1'L~ =;x;woC 3cGFqd?V͵Ǚ Ldx;^_KKAK5/#1/95E!8599?@L! 593-3Y9?% 9(3=DA#YSHH)z$(:d$Ͳis,-/RH,Q@.XL>Ff> 2@, u/.ddsY<լ`_Rl,@:~ l`lIgӒ UT4"TkxZ)OxsCrf^rNiJRqeqrbNN^cGFbbQrrf7F:xa2Ἲrf^rNiJRqeqrbNN^cGFAbQfqsvM/xX /3cGFAA$6͊, xqc%& ̼ҔTĜb %.. gxW723@Mx;vmC #cGFf{ xTxmC(#cGFA`F6&x{{Wf^ gxW7 3͟0A ix[ysC rf^rNiJRqeqrbNN^cGFYdfGFuARxROANPwC41>mh[j)Vbh9eݝmʿ GoL7</^LtfiKAcLd}͗7ӯf.6 uy&Llg]–n6 R,oܪ-@(a2Opi o֊S P+ZNu +R][i'" = Jap 6 Pd{ee@^sA[`1 hzWm[5fy(tI%P>1Qfb6ubh#gi@ DF :ׇ'ŇGem!m@c4M4JlG5|ޢX ܗM t::ĕetT^ yiH W{S:?FԼ3=S499ylH:˓BVŧQd~3r}o0y~CKz6 ׋OPz@^̕QTc)5l(ls}1%6ui$tœ4KۆXE5?AAxKkQI'16RD6/ۢ1iՀnM34 PNp7@d@]*wE*.w̤B{?s≠P]!x N?}VzWg.~fK8j^?i=A#{nO7i2Ûdm L3N`&@V[2Nǚ%Yh1 jc2MtBqX׌(t+v~wm7Z#[pZ9Cۭ*J:B&&cV+ke߭u3nu.AGI|=L}8Xx>F dI]Y2.\G RL`vq:դ+*/p#TƲ( f lʟBqv Ǐᢐ>M+ɎiyvԨUr8z ed>x{S}lQLRتElx%_lCrf^rNiJRqeqrbNN^@[X771`u rwquH,\sIdxn@UFxZشQipi8$-) Qnl }lY 5QX ,8c^" kϽ۩6܇䭭25]u=Vaj|Iwui(t=ZЁ@%K-_ 'D|nŶ~>d^'d9 7^&7 ֶ6vK7͊(+lV$WEv"M.,t_jquXd!~Ǐ8YJwϽ@a+H"A'Al@r/ǭ =tzV kXp`%;p{ydTp2bc2>iTTD6P ~ܟyV!z 9'_pg(/Ȑ}$ccSɣD$&LQ %!a׀ H^Yɬ ijb $ͧ&.qspQڦѥ^~ޣjkX[fIbR N]-Iј PyPR'&DO,rfFQ6c= {xAQ0ū5]:#0+ɿQcjU M|/YfwnvmEIAxRnQN-5k"&Upq, B$@ ?q:s#i+hE7Ƶ| ϝHqg19}=ovmn5jŽasl;K.5:OE W)ĸ,IYsrT-lks,I oV6:$6m,FAӺf[kuJ(J>NHũ}ZrxLLjo#gtpoZ*Hh(c1]H0ݦq(ê}H" j*Lpq؎i bcCE}{%`p0sy%{ș 8rs)d,~[B>#KK3].6'v?1Ԋg* x8U L4'8>ʊ^-F)< KSZssimo<@HޛÈMP'se5zӨEKU.ip@28qFswBLhȌ돨uQ,tXd'2OP(4}Q5T >)rTmu x;PóAer4Ԓ1RR:\zŕ ~A d+QTpbR䇒'0%OAr &[MdHJHBNNɉ/J-/,6J^H'pZs48"xRnAN6%+xqbLPRLcBAlR-&z.apv64s |/ xfJxĽ~fƿ畝vN G&4(ЯPf̜j5cX7R--2ĝ^r=^Nf!pXcl2pa? nfjq0D} -U0cR(O67vUUU.@YP1CcoY~h ibA *x5^Ld"*i &A PDuZ|'0iƓvvc@_.ե%, f#R@'2a1aPIwyEl6j+?V}LPL扒J,qh 9n!~mC?fRЀx(1Yb ?5vC06!j y$"^yEoz!oh_q?kZw J_8mh dX;!Ԛ_hP2x9uqCc&z>z[UOx["~F|rf^rNiJRqeqrbNNf_,BA.nf&\\& Kqx*@bCrf^rNiJRqeqrbNN,ŽA.nf&yF9f1<oxͳA1#M YsFe{x'XdCrf^rNiJRqeqrbNN(],A.nF\\ϱm+PCHxn@ƅPy*q)pHK\8[[gZkk7(+;ԅxgo&o~YOl`gfܟw;i[eZvCz֦Q~,0Ǟ5tM Qp€8 4dFg!K0ELP%˄ kB Haip*SHgDŽx>l>i*KC,X6.ThV6$KW763t3YdڹA&t{)xG4g2G$cuMO 4RXPԟI6{XNoEs/ו-gG/{vUa,hZ9E$:~|zL_> }y>^U*| q$W|HhrhVTN`~o-RxvD FF EoV]T }ұY]ksmt޺WVux !cr2KxV]oJ}_1j$J@mmŬf!3&F/ ޝ3s3Ճ2Hb+"aҷBI7tVžO#)\1 _s44d)!Z GpMhҟ ζZ.WS 0fz 3МQ]1͏ab$b[Ӫ0WS ΒXNr\ \L =eo ]n ^r5`O"CW\31s3fp0#*^3P-JF)DClxG]ǣD |o QZ4KE$3Lb0ΰ}3n@irtzׅZ0h GN{m a0nr^L$Sn]7X*$)lɱd>KV*?b$ile=T 2Z\VLg(aN+iҏ)s#cg VY<.&N ;s=?;x $=3O|d} Es)%PGPX5ǜ0w \udKרgšYd Qn^]y4_;' 6.qZQ埂{XB=fmD%da5w_3ΝVAkv-b6-L~<6&r' `мDg|hc{B`02w+j|˕ф{UspqeȈy1O#9 ~J6, 9KR%ȽDňiI1UR&6Pk~cq܂3\$c2J[q}l-@;c19.q ,\gئl`n?1"ݬGiMH2>"'ՠD UaIJ6Fw\D͖ArExz\.%\Nv.?"zg@DdQZU7=I܇Ze /x9^>&zME½8SћGOVttO?xۭCa&397˱rLwxisH3=8 Lf !8q &ٙ)Z:|d}Cց~W~#mlC2ija`SҜ[id&AЈ0 »]oҴZ1S7rn ?EޘI! M6AtBffKHx t=;d,7nL " lI %J@mL\(vG{7"c%,]yEƮE3Fj!.xuϑpWQa># B`T"ܸGV1uRC|X^-2'ȇ|>,?T rR6\ Dܡx=\/3%9XNF9ɀj<|6]z|>N7Haz41]/SgyMduEXJ?2_3'WkCbt$Mo ZzF|N-/?Q͙IrX_+Aq)r`sdRZCtϒ3Ѧ/ aef4=OovFXG4z}e^ Bk]-클dV g!Uچ~!}zL=?~$]rCXj}f:rBPm&"OM/޺qw[F4~bR:*MT_A&-[.9wN,]X6fDڹW &m|jbwጦb*2!,3cj|^!ܿ~ xCV@_kp/+KȌU@W?Da*Owe/(E-T5`qz5:Z{h\^-&v9qRǒ~ Qb1T]تfEpxTh5phGUnkp`(?uaPJqGo4ӁDݸ<~"[-3Z[Qc<E ֒*ou(a|]Lyծז5g<H逴vj(@ɀLGZ m!#q৵h}waC->-QPRg%-E8^!^ '0#A]{|nby z0My>CeLri7Mh&.+vݧC_Z~k8FjoA#5@CwMY8 Ţ]ug}""UA>ؿai;Ix_26:\ Ix)%3ezEcQfq#T ᖓme*畂 ( Cl47&ӷ#-ohm+x`^,'|6 ݺ_hّ\pٚ0zJb`>;n|<;|xް4-z$1=T%@V !E!v,s2 yxh)"}A1"`8fMBmUvh " gް5/DNqɀDMk;i3la-xi8M~QLٙ'ѥl$"&݌ZHg B<\.j};/ Xx0) 'i3YvV(o(I6BD(l0*h:#m]*R7@c{X?Ylgv(zlVr[mjT]+`*xDD#z_݀=jW ~~I׽w~%瘞GuWI7G3e ōSˢ1hڧk8ʷpch8LjFȯyə3Px,T$ $xۜ"aC2c'gQjIiQRN~~^f/)lXxۜ2~L'nxۜП!M1Ċ((OA)'??/}7DE6~'t7/X%xuN@0RbL01JŐn Ubl84) d6|;LQܝs??@Av05ubnrePu]z'yfqi}6vSx£ax?m]Z4x4[RM`_BG 1+\dMM'K>zjNڈw"m`>bv jzqjJ,gj$5jG.ʍ&cBL"iHU CcuQ#Ȑa>2տ<{ϤG뇞ZCUAزgO}=LS=7q, hxukcQrD hCܬ*Ԕ\;.-Ғ"+Ģ</J6cbLƬ$K5**TsqgξA񎓏1+2:N~ b &%&/bqޱBM/,NNɉ+͍.K-᪵NxIϲxXmS8_S2L:4 !9(j[>I~7ˁf&/>ZW`L}) D{f< ,tyl:SC Q)9}F/+C$q6"h_ܣ4mQ42z Âg0JI(0$ ,D?HYPjFAQK!̩ uyjTJ4 $;D\4.R-3\d]j^\rFbwX %9 3?( L0-~ݺ:{hE=i^M~C{?\ao<ˑֱؖG^҂pap\}@a,~;$`)O𱂞w"Ozes`!$\DfJgGGiuE)BcwrVcƸ'꣇0p\^x5|s*#`9YiٛV `udǩWYկ,l䕣 &^U,iV":朳)zz\D,^wol¢3(~|<5KñAj97&4 FUIܷ b3L k]oШh*3"ޘqQaDmh}z20o? r;ج"J2xV.ہۨ@F}xáݨsî;]5Fv7?zacǺs̼4w1uyO2]`we׽bwԫlg3ȬK]Dzh5_򍖸49p"*Dw"n/7([^<Xe1ˣvXx馼 7٥6$+&@vg|,)RR*F_ 8g'ٿTmu 'LmRqfXdPOGjqy kAsW",uYZE5TKAJlHʼ)UHlE8FkAW#ґ% *eTi8^M]5=ެDHj(Im@Ӡ¯WZoͩp~ SSֵ> s^.6:4sc5cl 3EZ{=XAÍ6Or!}EѝsLbTT)EU="`T03k}JTYDչw7n㞟`t:V-z'MTrZ^tw>"e:|/}j܁ڲb!+7pp ?#ph6X# |40Awʔ'9YaGf+a)|ES"/ 14)&iR?^q(7)ŎLqLAd+ ?$x]Mo0 sf Enko;m EAߗqmE_=|!ĄP@G)CCAchINGJkc1p /Y\@^3vp#Om`DPdQDClsŐzr5ܱn'"OjJҢ0bʥ S}iK?>E|(_F%B^LE㫉hB ]ݠ0-8ddpn9EXqxݘPj5/dDpwha(:%3kxd*zӣ|8K^rc"F\Wh+n|ըV6MBmfy ѾGYN%{tPC]X(8K&[,9_1j҇'Y3g:~C~ qkTsF,xvm?FF{ '0UI6f&C.n'xvm?FF#/xVo6~_q(rF7 @ 4a+Ê(R$ARI]%rzy?4yvklC|ywl _?uhmyZW/P6ImÕg^hGS =QzB Xt2 LJw_?A\OW7L7Q4_~YL>~xq8G˛lO~epl*GA}=+(2QmsU<`xk5V+`"9Zc%E[@">[t]HfUزwSNc))CN}ɌacS "LjBc=h^r2$w5T8SvPM5"dEl?hvJ)p B@W`de V|ա6X:#Jd-r) ȧl¼hoS-"{0!0Wh+_àp4q`@x9U;5a'ax_f0Ȳݴ'QG.7R'o>Sìpi1E?lkItWی߃P<ЖɎAҷ0p*I):~s_ ,%OW)һO?Sou4'#1_:R7=Gg5`MǓI[MẶ  k9ZYnyA"EV6:blB >JYn4DƂ)jTnq#6{~V6͍vC&L"l\4pE(O%DKm@Ssc֣kە fJaqRa=K&'o'ss#ߣU)67x.^lCA,BE x=ks۶_9GȲ-?m'$eIN;gCQT~w , b`>p 6pgCv}.W1; >:u >:blAk[;v1v|eNk6]b _ӕ1O`"E"C~9`&7CwĜ1au0w0.FP?!W<a>k+>{?fE=yh{l<9܏8#hi;l"1cΎxK2HI>X@X$ܺf%_$^AOCzJ~b?tp:kx.@dBۏ޸w']:M&՘uب3׃ΘǣI@{nAx ;`c"E'UHzso8 h3ig#, % c2^0w n0fǛooo[K?i0ZB^ Њ&nrd}{]Mwd0h\?7<ʷFpʷ0A|ݡ]<ĚGHa9/w߁oݿ_^pVZTJ]&-쐴O@غոV{ 'Я?~U|K!qb9덥eilm+/ojtb E0PjyzaΖ]ر\<5s"L;S5jzk;uSxzܬL*ZuB破p7X0-lX]rc ,ɊG0Dx̆Wְ5?Nx@5AN> TX!C;>8,L<nc9Ĉ=?`ࠝ!# |xFֵKmWi?=Jt]?f$aػ6~>XxP“|́P5D44w~Ԇ4Ksnf`Z~)x=\gp}$y_CrXfC7f 8Kҡ.<[[X;'0b"mN =_k \dbކ{byKXY1E4Oz0 LTvtve"Cd I9KM>?yVly>^™:(M҂Kn/Q^CTaBSV`#GF;R5o-[,>Ai[y{ .*:10fb\!V[δW;{u'탙7vZs?'΋`OYShC?i+q&x\1^M{_"łM]B&ސByUag8֎ `bi <* r70**OڵZw)ղ4F@]TzDtH$J6S8 4bk.u t |uhRI5jǯNdX쉎z:qF~γMZV6EXLtC *s _A %na[[W[x</9m96jWy^*CO?H39+H<:::z*<}n`Ct4|:ݫp*$ xI; >صvt>?jb*vi҇څyO hK$bP. 4Z_*gڞy_I(*㭈1h> JK򋰠 ŮHV޽Ae2"ض%}`S0Q7=n-O3IM#R[3Ldrc,)vQ ~,u1/?fc?F&Z*IPܺPt:Ǽ&SBD[%աOjI9J`;1Z&, }zD~ƱؤN>`Ed؊_]gR0u49kB~;ǵ1v6xݩ F:LӤ~kYz⎂y{ԈSNm({M 7-z҃Fyc^C<~?ZFl/Gl7`dnsX}鎯ɨ3~w =]k6mm:]ً~Oqg:f7[ܨ\Q@h+M@r_jdɆ;xemIdu.PKUԔ֘(rZDJm̊"X8Ok0J=gU=T |+/NNZnH5~ѴFitM2%raUFp}Kf*xɋ }|dpWGV3.4ɚ^Wrlȗ|9Nr,|1eK0ȗVS/f|i?1d+_NR< _xrbr/)_N/f|9|93fV|9{2^aAX{L“Pk4&+F.AG[L?{Mq!v>\0,vg.UϣĐ62-Hc%sp GOݓ v.0 6cvRwj `\8yڹ4VC0 B:6+ 3~euhcgs a,_pRڪUMʪ=k_qP6Ա"qQM#QgpQ_SW1NlǦDFj¡ʈc}: tÆ,% 9-a!3IgeKaנXeBu\U_2 EQuD ȻJ,tan)j9+LBaƅlxsr@6.nO 4ZAT>%*iB"5tt JfҺ(+̈́R j O9خ;;b_Ych@ƊԆ&=;(:=YKK.ۍnU&tbO{N0Nv@ *0]щ>t|ΈY̩+:  %dpb iԚ20VL^@IZf XI-{ZKքOZ`E< F꒲5zq}DQV. y"5 0lU-` 8df9^X ,GBT*/,@*C n ^!FRL(-!ign Ќg.[Yо&@b4fS_0K&^خSfjSiY1Vpi%Z!4Rٗ.^o`d9@ yi#ɉ2XwOL 3P|>FqFdzQhdۅ㚻J".6&$%Rԕ,&B{MxT:w ˬ:]!j*?NF?~ dA\ƘTt (1$RMzx@!5be!F]QCNAvJr}u.#us WadޏeEʠIHeK@~s1 9мR!4_)0 30J*p48XJffxx}jS0f PtJ7JjdQ:JETSa^<!Us Q /kgzo!%0=AO )2xTI!Ҏ6[v3*-ou pP5+HܧL7gw+$c¢jL$yr/Fk=_{Se*H_@d]tTth%nE=)(BڲΑi3δ$)s)Rq'5A@I(C}PªDgxű H&sgQvIB%+H1BG87 9Lg$PvX<8|~ѕ_Z4T9qV+JQV/Fc5io> kc1olQElPi(AţʼGɔ<-1u>(FO7D?`3^ =gSD=V$扰պ?irzUwP'/trry7~2RCvrG QusI!uLy78|szÂ^2*cI0K>ɠHC ܤZ̛Fr0^8U Q(*\&$RID%$DyU u! Ө+Xt؍+]6$iTVm4Qs٧Pwn[us%{zuaRe5d,#vV#ڲO+gŞRڿZ_}Ts/jdžg÷w5uXk@\52x;pqY -pm*-9I[ n[x;p R xG6`ux N.b/8fi rxm= 1FvK~Adv7L+`/ z񧱘bfq+N=Ϋ*X9fc!P4&M5bpߌbZ'WHn)ϴ\ERV1 4'i]'yp -jtP b=?xYBH]Ax{ze R>yEEeLLt2K )@~qiAA~QBfBiAqIQjbBbB~d>@?w g3.̴4Wx02P$3/EԂK95/%3MA_ EnAQqI$S95Pd/ LƍbEn1d.! DfvHvL` xz$rV wLKxVmoF|+Frp&S >Zb[Z/Yu 'VYK|U3ϳ;h4"#9c&W ZϪqsD(Mq9,.ioaUh * JFY,1JT҈P&J^ld1lyD‡v56-JaꔧJ U2*JTAc*v5o`jD]F Z r,.YH +q%fw':_`Ξy,x2ɪ&G۳"üw\'x fd k,bc#⃶@\7w [RX ['ŸbyXWe"m-Ҭ| e~sy<^8+֗ 蒈p<`Li{O 66%<;ҳl?4]w4cjJ'GAe 4ky0zXmiNMJ4[?@BjLGr /|Bd.~iplZl6;mn:݇Zj - I9-bnj"'1ﳴ̶n>zuDkt.&1*:\ZB? ?hcq2T |Zsu=Wv 8FH`2K8.3'CQ u=slÈ:|ƒ9a 5'loư-" PoXלjūxz/M塤U4k5]k`SE yn㍅n B%"x:X}Ըo'S/|]ڬ~3so 8a`>\ۜM>O%=4-3SUH׻6'~&<A7Qx \_]۬OknL)5\|/p[3ƪ2Bp"f VEx;"VhfĢ 3 C,4s%+CYx!VhC$jqeqrbNnrFjrB gbQrnzAjQnzj^jQbIlwY7g{`0[txTnF}6b$M c%- p_%w(.%"U)%J Eĝs̙K0C諊9L(t@& 4GfO7k#敃Wk螜h &s=Lō73Tnt/G '7p#k|.W8o>5ڊE\*j&U|˶>7KBB#4\0v;Qi EnYg`uVd CA. rawS Ԛ\i:4]ZA7> ˀ]gp&iV$w7@e jMڊzmbcl@S9H<޴m'O9JT!ssro _ٴ=|Id8?#2.pRn e2crmL2IMa2%iڛ$cƣI?:k ze;wGDŽi,*Dڲ۳hߛ/?h1ռmrzXr|^9|tVUfޑ"~8d/*DJ\]<1Jžn<.O N/:*N>rlA. X e Ǚ]t0DSv.:U*`:}AwLd*G;:^I(ken߾hdyS̮.lW HM?ٛn5U MYgmg_["uà ̠rbur탲ګ9(13lEm}<_RUn}cm417F^ok>;l򷗼EEMDgBIxSj0|b/kR.-IHӐ8pF׶@$;5GVNJB i5;;;Z%AX#zg`.rlR.Jm|MgEU{=Κ~^^qkmC;Snx忤Pk*w1U$7yT@"ӥ3#t)X <0U$p QRT*DH΁.EVp_m8{Xl`Z&aRpr, &]]8 Ge0Ty"ɇ)jmH\|ha/qX6rYI{S[xVE,&x;#1Kvw|nA@4z a9^|f|^ObIyw@τtoԬE2%&t?p1U7M9@#7:I}\&ֶJƇ!;%ME &ͳtN"Bi0j_AMY3A2+e5FQ=BOgC50uIo@ ㄄6Dw J!i3_!5x8I>h0L*;}Y[f2AH&EEqrzfKT'f{+)0_9*z?XzxJ0+SvNCvӡ{&MXM`s/h[^xcnqu^ET1AtC6na#dkMM:l5<ĂaSa -<>,{NO -W𤅂V)xH1U$w%?y.v:qeGhRԫJ-wvKá,ȷ J]jd]B˳dHc,Bx:$}XZq5L8GH_,AU&˘|БܿxWn9 O1S[HH*AJi]ZY%Ax dVB;xTpm0q<agcaXB+#רO&--J^NO޽\3 \)?jVAJנnH5#};.~b9@(&%TsFMӼK$3arJ\bvbs 6`PSXpmpZyGw]n ~kB?ƒ4!&'KgxĔ)3RY)ۍatfBx ijnٻQ |(1BHF3iM{кFN3E WQ=oF]9ݠ;lW^no)e"4q }؂y\,"OX,TrF_iT 2 jSe&ҳj`F%)?GeT!2G2ewmY,q}m*&'n[zUyt|>k4Cۘ1wn/ހM?eMx;9H3l%!lj㧷UK!^:X2Bs#m`5HE[6~.񗭐ӋC! 6Bs ۟6x7a!^(&8nKw&ލe\xNdV<إ g(~l&Jp!%RMQܘ47ݤD +þݵeMh塼Ƒ٦oWS +Vs-i, Ex#Ae&|.M9xݝێZ&:$ 0$,QݚiR۝I-)yۻ[VxX:Z./u/8N/ofKQIzOIrrTS_p?^0ˏ 7Ǫֽ.חֺp\jyS=7~m(_}*?8vfZW%EDjX0l6qlEvOjXE.f=jcfCQD[/+G%jl_r~7S}|,NGLK ǩ*yJH[B,uXSjSb˙mcv5Ym+z99xv-z˽|!]^KeV;^]"<}DhGDo)k @عF/Ph9dc!鹶ooy8f3`+(zx8;Gad;bw " mC'K .&5|6@Pvٴ{ݞt6:O?1 ĹKSk`80Z5>D^=-~gTw:q&e^]L/  7N=zxBgfxn٩>r(bxvxj`.?K?WTittYZLg Xqp$P>{KK @X|+/9Zm4z+o)zv1Psb,re96S[ vP_z4TuwUݎ:s.%?%P{v`> TV4#h} m[Xd$"[_zā,Ƅ?U i%{O FoaXGN|C46.U/vKcgVAѫW;+v @ͽD56vPaK*rV懫|edid+r s*q*>NRSmN9i7l~]mf[wVetfQm T)IT}a}ys]ITp>` R 4nh ֏t*y!@&ہ%(/A)tw$r/Qyy WXv[;Zo7ۃr"ɒv2E+C1鱮S2wLƻ~o"uu |-QǮ2Bu6sl7uwƞbwx)( ٤( lhT,@{N؍S<כLJ>"-?vɈe  c``*Npޟ[`Kž7lA-qS/;]?3>GzdMԎTQT]%kMeE Lf1ˠn6EVfq{ 0}f}uI8;@uU?zh%g X2NSA )H!ns̛ <˔+~ } Je z+\-s{CmnDVt |-/ ~ԭ#C<֧o{;14miӶZZ=Cv @MT"s|mL!S-،k%zgyK nX(@@ط >CȆ\*vRaA#uDϟHmtb`k?6+K/S#8-S<$mO򶊸N0XQ+fwshE.HF.~@jB$G IWTL˔ 24Aw%1gE*0.E|*\[BFX.-P=H懫ޕOVƜZL T̤*sr$n.IRܗW14Ro3Bi:&X'1OQϿJ{(w\b;^wN2Q 8CF@J+vv| N*p/3jډ^>=!Ox,sW>;@+uQF;k?1?20*AB{eԄv0Vf a C4 @Z[BFL\K¸\C]&[?WDmxD6.f?Wm{U#[$wr'а>DE)SPX@o: ,zH!Gi/1͡ܜ^hMKdCS=Hv9r_va=!x?8:҉bd L,]tXlrȠA$|MVܔOgwr>]|HL/WUV>iyЧ(}@2E(Xw/2a]}VL/nsߺ2i&NT엢?cz^Ӽq-Z64 la) .Z]vz k.U}è ?/"NE/kfS)fSS,xaŋ@'Lh>,]kRƙZ4@=: [KET4A9b됸8W>`%}7ۄ5` 6M;cb/?37ە7?N, xY}&@R P@Z^-^aЗ)v7M@+znafڗWz[y_bpYO.+ !GRb[gPWJvg5d~W7'c,٬8b$&XaOWP: -nVMu֡uڎ#PH ~=}4p2k6j58-BThbՖ鯸C< DO3 ަ }ęPMP 22`k9TC()=GvPO]h(kL*S ]q>>?1u*c))엑j6S@Z !} 6Kotv*ѩV;$ :EWf. u1LY@ 's<}R?H\5# ߸͊H|YUKsl)V&{9Cv!םqgG!cQcqU(Kc) 0a?#uI dEZhf8'|H3wqS]d~S3䮸gWv4yPTHpczuqY$`(`?7R.U`EPHgOq:AjVY@nB,{;g8"_Dqf,ޟi(Bp\xZ_Ê9XOa9Gt,}7u~> \ ۊ^]lbj21Sw|b.q#~sHvy(%fy7'uMc7pۇdo'6C sOdv)m4TK!gj\ރ vONѳdpesv:fL͌4t p7`D}d Ɉn2[)B, 5\v@+ǂ,ȴ ԰ 1`-9]@?TR՘Ŵ`&?N1}9A{'tNa;S]p 9VZ2%cy8fBh><xYZGۃ,w ƑU1A_M+pY&V9Q/Btd,ܗg~>?HŋaKP/Yb<~,"p2^nèCck2 jUY,Kxd)UdXXDj/ej6QTSCt!dC-z@+$V .fOc9YZE#Y?k1t҂Frp*$4wv&PwQ豜,-he @%d/p,~m7NdiA-l[`a#O҂=m[QhgAzѽ]|@4 c*w/(rJD Fڎ|15EuF8邞Q=m3I=?OM4Y1o6n,Y厞7{j11I VE-MwD:By =|}u8ZS@l:rdy {y-sUl[=n \ >N/940%#Dܔ Ij eTp0:lW 7Ej$;/l3>s["$w{i7^f#%//lÍ~G#ŽV=lfqOi$@S!S s8ؽ&8y?H?֐A++ABJSrǩ FG(143[$@Y?Q8 ]d?EQo`t\+{?k*TIG.fi,q9|YT0-}9r]J_pΫ 7MGj^̭lFǢ\Lv4Q ۍR肷2.`Wb۔'%}"oVUĵ^Ջ?1Jݾݩ]>3 ݺvT5WqKA-xh}Kؓ.^]̬/*` >0 g0iAN)FZؗCSipb'|HeEwvPXʬ:vGFun '+}h-V-@@4s ū+93#LtߜkdйpH9JH<|#  W‚X­bIvN96Sz*0:r&,=붇 S'R i%C!} 6XB]F2l,ٷ@3UXlCX2-v"@Q_3UqCe?@G⫡Rhdy)`s^l:dP.牍-Jb{ `dr0fiRgFw,+ O;6}dJ`g,j=VO %/mhEgO DͯS>*2epXd@A:CU)zmd:ьaf 6iLJƙ=Gy J0@C 7Պ>hll8Mo}ZJ~μ8L 3YdJ&erB !rmT.cmʠTfF$T2&̖F;O]ƪ] pϑFS og(ꨶ+IhȣtYҧ#Q/ܑ֗e:PxD-n>@S`r# ]^tu8J2S@ J`S#u.jj(MLm"@S>1R2U'>8yZwyf?`ǝMC0Oi<iOHAv1< &3d*s٫nenxP~XVn$mX`$۞mGIPl?p? 2>H'')C-|v0<"|T}TP`Jf}E.f_S³Zx$*e9}T8-?U{I3ذiX6=4ۉ$C `RI\TvYzX*pXW#d: d9i˃>FTrnQ=㉭qT@>ER\laKfȌ D!ir$LJ^s>(~+2L(Op124Yp:W ,QdK~W$_SM2 ND!f@(,v)m>CȆ\GLrnҮiL!xȡWdޫ$ϋrUP.jNd5lZ|>)O:Gev>Qof_^᥮Gۅ4zT)#f` Oìb'cdX>VK=ll򟟈b]uF6+kAN S`ӂ}\]O;Qd}$+ c{@S͡_ŷ*' LA668L}P.QgTޣ"Ȃ=7mEfV, d61h \/OE؆9SdZ2@S?;>CȆ\z*,0PN@A5P@æhWP0q Hx%&TST:eLe|yz_1ɒ%t>Y0]p;23 TLB\ 4S¿nE/ E6{8f*ވ,s 32T؜f# _Wb'[ZbxB XE5qHH ʳ%H"-0mCrR.5̒:cq฻W0OdiA#@y̅dRKCf '-nM)=`^eIMePH|L@ !rmQ[i9]ѧvmŢ+wn6aa6TR!X!n㘞$G dfz*56U?U 0[{խЗ濁 3RC UO2Ok?Fs{uO@nWF%49d8(kqOhx#!OHnH6m/\/iu-6Khu2Az* {cjjf! )V h .ݧG_21筋IL]= 4SEsK#tWm)67ߗY14B7_3 tchS?cG9bJ: lkz_{?YҊ\0Y*iT7@#)vXgQ޻JFCujt *iT z|7䴡B&@Gt.4wxnAT!2$Cp=C/:ït"?v|XY?1h ۔Ւ2I =Ȕ q~lpi蒡 *zȑ<2RyzmJy|Y*cCaSԲhԵ;t >-P=H5яndtMe2m@;LӪ7:=u%Sd͈K_{SUV#~tQޏ0=e$E$0&?WnIvoZ/:rFTi#Zzȑ;8!.}teP趆pT}w`aCzr$ѡ=Oa#Uf|~f,nT-N׾Χ&lp Rߍo(38Zժ^ N6d7sfBSc.b3p:WĒ=Th梇Tr$;>;K>e#t˂u~TOX*=U9duٞ|$XEf>D,h4@놵O&.ŏũMR+<j{||$5z5YNbr9amrL{H#ӡh-8C'vubJ4Uz35\&3XXz,'K Y/pn',2 ہg!c9,=VPO9tJKVǔJBed|}F&a:9>vTOAtBg3p=t;m9]ZȦr2~ !sQRk^WǖJE*Nz["6>t,dl,>32`I0߂VBGVREөw+bׇ]'{FPyz]K#+Š6?`'ʑ:H쯋?luRuӢ(ޚ(He(F=~lƪ{=j)7ӼQB.SϯKk%a&.^ɶ'E,AĶT!X8A )G[%Cғ "ZmIol:M 4Ox*Թ45h_tUAi:ǧH҅t忞> fRZ 8t%1C=2Bj{xM 3TA|> T"j׌}* mpmV#C2fn. r{>=>o굘)%!<Xy3 i*lu~o &pnݴJYuϕ5"VoS#Ŗثb[4b4IH2 )_X_=Ly^B{ kup"7EXUۆcRx$ \#ٛԏ9|HO̡1)ld5&<# &R&O?LB6/oWoaPR';&Vs"s,A&nkB !rm"V쇗lyzLZZ٤dCx2 Rz mz VY^h!g|E:9UvPe)>CȆ\*yıJ@ A8= jqI }LI':!} 6K+yb,\* fmE.fݏ_ E+uc8/A'Ceu ȴ'Uj-s.liT~K1EWm/~uJžm֏|mG; \~^ΏoYPVޓ̫pL/E̵ z7q{*n3S {T5n+zv1pޟbqRDVr4F~NwU`.CyDƹUVϲRTrAƼS0ܷZv#-=\ Z?E.fVsԂ$ >f7ؕ@xZjyEYQ*f]%١I Vv偩RWX>5C#e^&gAO> \FIE?u2T8>ŔWV'wYM4SR(D[~zv&yɤ덒YJ8AvHA3J.TL?{ (a e7Iz!>BQ\$VZ)Z%>YpsNTb&OMQ#wcgp h C[5˔ EmPzǜ?M.q뙒._PLrϐ@ARISQa39 iUj1?HE <vRBrv:z]b#MLɞԵ_m:Fm^+Z~*HjyFuI{QpEXjaPKGhP]qaw4AQ/,kU:vSh2hAHuU8PA]x 7H"{,dl I-S!!9)LXQR$2'I5&V|נ[>d) ɊBG~So&G`&u4B&3xJ7ׁ { kk׀Ʃy9\')sZ 1~q{?>^)%jw"_># gj!)kf dnuΒPmL?Gf2:&>A0`It{?(nsx1"еscGRH# z2C Jy-<Θ>(}j/ިy e ṡyՠ{oPN[mܢ/R|wE^oIlʺL֧fk\k+ >#jE׽MNa{F$($~蒔q#w@̍Rf{bx} jNl(lŁ 7;8-cqt>~2XRGQ&~.ݠt.H HERLq }-)ϼH$$6D֬$MΈ]pô|<a{]YWPv(v*Q;[+y@om5YL9zMa$s6Mj[(\v.j~ Qv3qRr}ʤ(Awr^޷t+U*/P !&lN~C@{y8A|%]|%ӤP>!A*8 پB P ϾBrHRA7|G8W#eRN=\‹/󸮫($K%GGRJ](Tq Fer Dfo?)"G~S>AW+xv`Re l+}/C4Q r;sE9wnp/Mt}*"n.ڤ{OֻC_#]PA{(Ji b W/qId#uJH=NxoLpkv+wjL(%r%wAqhà 1BTc0y4t:PZ'ŧ4tN.ӈ+qbƫ fw`EIӑtĚ}]7nK&ךǔkVr%I6hbWN->EJ'+nϙ2Q&[}2'*i52K=эOˀJB?(0E"QYf;:3+c/^]2+S:tJ푕#zq`2zЦoZuwc3"ЛG$ Eueu} K[Xo;icuB8h"xm:r*k,B??g }7TTo3 P\ai?dxDw%X t$U|VIG*J뵡Ӷ-,w4wqPҠp\}X8^U^-ycb.2c"=S|NpnO1Z4h{k=;O9K /@~حp`ǾmN5ZsK䖬88C*^ N87D G6(9ř,S[H$.GVb"LZ 9xT8Q1醣8]Χ .z ᐓau=#g)N}NP. 7< z~ 52y1CgX+ĠyqK<KCzql\ 9F; 5qg.!6Q,l"E4r+Zlˇ `Mgq0Zl_0 !>c/OtyB1;`nQ% =RY $7Oq%6X8F>l"8(-^Gc [ c5)ncŗ|oF/u"g 2TַzHe?'h5 ͛Ե/85`R~&6"sa8I-cͪ"H)b|*({f樾P֍6BNϷ⑸Qؤ4*6A^ګb(*˙9CPcZG7:sLʹ/cf)8Y`L(.ѳ* ԃg`6G\\d hT te`1[q.@!Xb{N* Bg}sqt8i71\q>jLsX8p+偟d3_<'B=@gt3RSEF3 j?Љ l9XvWcp:dzo<|qmzPn_|!.[H% M} w0S9z?Ow]dëV ҡ}߃ݵ-6KN[ mJ]"|_\ ui@+.t3I, PKbrp3k<['"'&hp`Y4ƞ mM+_[+1aJ+_ MU5ҷwB~RMIܵr[,ZQKK zhȵճao[Z>@1Z'~EnMMIeM+cL)LA롳Z])] X8A/|נ&9zK^W"Zs*Am_{yLxf/3+i"]_\W!i'jQ [oD֟;2Vb;~gcN11CNj3q<Hjf$}ġ` 'c#716YWN.*`4f#]H n6^{3aU4Q; ;k̡^O˲ ZײJŇaZp5Lߋ~Ƈb&q1胮m PGvQA \CbD$bйKv`jS@+/cy $;AoYx@'G8`9 | !a'ua; ӽP {xo%sz6EFc!A_)퇺t{;!zr9 ahH>Q,&7JD:yԇ|n8y*m(޳A-yN1T'N1|}:6jE[vB-i46/JSݟ84;drAw@TQu_jݨ44rG?Usm!؞S_؈ F<= 喕#5*g3E&qŷ-K'%|Dc9bGlrКˀJ.+k1AD >*=ZqfK 3T)khzE9/`Ǽߣ˭ҭRn7~t"-_˜|T4ŖMEylh/V-NrA V9_ʕ|˦ju|#v'b:V>qI=XkG˦o ͧX6n7s=K,=-RGmxmYy\UgN}.9GLdPLSFS ybΌ吊 ,2RW ׳QPA)C@05E^) zos_}>?==]ߵ=a9t5oGFڎ\?vرcƼj櫑11+}{qak-=g2fEWUH?@: g f#@8D+5/gӵ!iHr>83op,U 0w+Pay@jX<[$t`\A6Y]Tpr㠼±@R^Ʌ$Y8xڽzp=B!Gt\PhOt=͋=]Wv DcHl Y}1R!AL@~[7ɔbG*6T psRs5[S}voϡr*߄f!W@E4tWiS8C*Wޠ~ D<1־hz@r_~LzK15l ]@1/}&WgԃaT[AT&PJsǩm&Y*@/,?(=-0s 5[hC ummQ#!ZjO;T@dBD z8PϠՖv'0^6x.!>G iMңql42sBsH~KQC#.䛽rp;G31ֆTkǠfGe͸0VShk`QڼEqE)7fHM#Q3pv11=Er09K>RuH4瓐k-H-`X W:l12gr(rans=HJ?::$z:3^_ }=Z>%Ch;/Q!Tv8 Kj/hh}3V'6Y PӥTR_ܛ~l}ޅ:y4ؾJ CF@F!9_3#B5G|'x8 M<Ȝ%2IӃ%dSF/ 3-H{J:\xd!_Ye~L TߏήR!gAs,afss8WιڢnV']M1ʑJ#z E'lϣhFRm46zNK@F~dy ZpH)X ppMxXJU|}o&?">]'4[ bK)8K*Z /   ŶaM"V=b W_=xG5`+ޗ>?hi4216 -_vYiՓ4UEWa {JN0@J|o8Qca="ڐzr(_zbM"}C>3Ѻzh8f^OjAQ& cdFy:4NE%^g(օMs?XIc9bF~| pPV@֡i+I|tUn6"Sxw!c,E:3N|dI*X>HIu?i?/BniN>D/ZOe$][fqIw/8^֔OĨ֏Tx&,IKxr?5r*q>:&:Sj2eyy5n`fut$ 0%]Ӱ+t*XW 7ՌrSc^@+6@Q(ܖ\h9$i)O~I8ox|bsEܙv\\a_k@u{-Bc?S0b>K`| 4%w\|   9"*2 aDRLAnALYPk?J02Z^(P*A.%@H,kT[(ѧ.31IdbvعaGȍ\1~W?Ք!nKo_T&nr󣲎)h:j+Urb;Uk!fPkVM!|YâضڗAPSW*ZROd_o:KvQZp/g@[kDq-b wH1w9_ )w c>qzo$QVnNB'ԇP5RM 0 P,yI 5ՌjîzpΟVΜֲN)S*a$ t|[ZI-DpY/ <:!u=Uڇ#߰X`9ΆUD!XCߤo !I@`(ڡVDbOPpJ 0-t#ήCRVh}z?V'%X51&r ^Q4@K@Ð2QB*1Tsi,&I—Oñ(i'D0a r r2 򉘛8-$]6Ge&;%M$Re,QQԼ<%Z={!ҘM!sAǘys 4X>n[@D_k)+蹐UB'18ʓ~t^jɉ`fVQ aZ mh9ؾԕ#τиQJ#,,coHg#)߸D5sY+\U(qtp`$ YB{8kk.ee)o\lu,.2+Ǘ-c)c%{K;+**VU$#2jqrMcj {y,(#ݖK~1G 1{41Tc\$GjP-Ay=ױrvl EzL=DYQȾǾԺ 6bZcc!iu3qxa%?s|t@hNsbId!hdXE(Խ\0]vVs\?RUL_KkY&CQ@2MF %'jxP`U.ZŤ|s8JXВ=6KwlfH{%ZbӈBLsL(M|M6&&ð$ B7[Zq" Li=ö-Tn" 6} l!BP{P#} gYdŭ GڍF$Pi˓zl ˇxCXg÷S^!J dFNͼlr5!O.wےcbCr2MsgTl^ RY)$0?n2~.kq%lI4 $yv'8E-i&xGӉMP:'!ޤRxεK$kh`7 gd!緦xUMo8=Gb\qN`thZC:bOMQuCRv%Vxp8C^a)*"(+`(ݫy>ճᑬkD}/ճˆ^kתRS{3w\܍b㔒|KGQ윗`%䫿VV.XC+0 c $L7],Vƒ?ЗDvZXt3DZJ9_=`L fv–ДAd KZyL~{Fj <.bo+V <17sj,EGՊ?-۳wEN6~K9xtsc0$h(oõ#[9Il2gX~kkfZUWϾF6?S]8'x1^/< ;3GBsk#З&G$4FLC`Ʃ`Thχa6GL5RY0`w[wNGQ(ѝ9B-]߲V ͨp'<4VEn!&BDn[y~@ZUjcP͛͹ޮ[R )uˈkԜə9Rwx#ue)*fa8lq[) sQ*ݿr U$ e OĠK8W,دX:}2&jnp7Ъ:X5yͬ#ׯD'ۼUj:[Yw8-}JG1#E~= , vE^~|3zl&[M3.ǐ^YBt֖ļ@2诨*&z] etZڨ׳w`nn[ZT,II⠴2vKKiy%)ni7;yڝ6~[ Kό,5ox{pXae ,,Xrx4O_x;p[aefV?yGl7x;Ea Yb&"IxVQoF~b@J.i]DPQ"kcͪ]'G6I VU-b<;73cGG:%c.w Yn,ZeqLƪh,u@sbɉPiKS!ȓ*Cy2pH^iWJPI53`zj~R1tp% Ɇ#TsNFi~JURrDKZܕ֖Z%"uPepMvő^R)sm=+ysEy'EJ<7H8)͊'t/eÌ.1 ASL'$ b [1Rx(}%]OO*솮 f)Q`{^Cu!AFn\z` Sސb&%]ht|{-|9.9[m^Z%HeBm7*2縲 41hobRY4|zJ"\>08Y^Ά0烺ɾy,\\ VTi[rWg2M&{v3CBm,N\];ccDEnQ|泟o,ǗhyZ),2nKKl*۷jq|iGot-hEoQ2]pEJ$Ӫ,̋LZXd-hkۖh?mMﯧ5y LgqtmnpG:>4i_/r3]>ʴjCR@:_#ugĒ9#.=0;1tg#Lޭ挪qy?av) `r dRvwGA 4~?K)4̿ iMekH[h`|jIP ٌ1 }L1 +j i2_N.AOkƬ9]8"^N=l88֡bK*WRrGU`&=$(2m >LZ/G ٶ,\r}3Џ $v8-n=xMKAǡv7($lQ#ɗ2Ln;̬%h]:??  N> 0PC۠ )4M1z}yZZumqC<.$0N]ā͡Nnf==RdUH{H9@|ژ(*yT2 E{@\^kѕz!vz6a萢NEFXE|J\/w*zܭ_č-Ea bd8º -Ƭ &$-8b:G2Bއr!; h@j2Cـ|33J!.8eLqPbgR~bhq٭[IQkʷھ':_r^LQ7S݋rOE3&C9P^#x-6_llvFɋ-934l 4897qX3 F].xT]OPN$dW&j bE0fhfHPҞ]Oszʇ^Lxebz c9H7OOχ۟&֛` 6l qcr}>rp%PRc dk|%mٗZ{ޮ(̗ .N)Es uQî0زJ-V(:Ӏ$ A4%1wum%E:=Fڻ&^v2p++7glA=|x f[ܰ枚}+Y^x\jUNAP}-<Z-^>=PMT5NєuvPKެU5u  MW:{S ,7<,,Dl PAr8v&`G.nCM#A8X :@B5 H.Ee`@&D%UR85H1e@Ә^ 1!#xÿgsfqrBpeqIjng^MAn~~QC2Hrcp gi^qfz^jBf^BbAE.@ZV8599? ȋOO-дLS*h*Tsqr%꺺9p+䗖ٵ\\%HFeeh;;:;L+U ,"ZV&JJ⋁Q笣`2l:P"@. 91F8|IƄZD5\'LԜn?GxVo8bBOlVө.`jL2 V;;v7AKЕ+{ J d= Loџ^Z>H 1?Bk}؛"yXZGr]8dGoeq # 2 &-FÍ]K&h6|E$̋g(Bmyۖrn0/^M8sfcؘm+$pPXL f8݇e&,4|38nVY$ ˭}.wO#b8K{] ?'p8tmlv&]toAı,r3zJe|U0WT(TrޜpWoy#}=e"?,N(IoÑ2 LneeZW[ΰGqIk:tSz(_}ZG*'}qSΎUW]񃎝^۞.js~؅#6u@Qg-N<75Nkn<``sR? i'c~ ~C&@'IO 'Yx}QMK@IE6xI@{zDOKLfSIEO&wza73Ͳkyu|K)herpc,f&".p2Hum ('B 8MOTwF#Ok]B9ݡFavf{=%_,eY H:2;-JAT%yIhV[60!j԰5Q9ΪOV%MYN4ˠV8"ZTQmEEf6RAnT'7i ٞM٦7G9,KVIڕz3IΗozTo<`tV/[{xk3F߱$#J7(;X9#1/(X&, pM/IM87KE>fÎb 0319!ƶhU(نF mԺ1'Ӊe"OұN~4a Ҳ|\JJAIҒ-2Mi < +%xD%b[r@,aCbykBΛK;ʩ$)LEB4%\Q ʨ l}ˉ nG4K \"FL [- _Fl{=odtRlN*c1p3= =;FhB܎}p``:>Lfd ۀkA}G " KվG"8 H ĝmIsl \(*zngm!NZhvd0YTJ.d:a/0S&hy>fL&s o &s'3u }}߫e8ĎP+C_U`4 ^uRy2 :t_^aΟLWpZ9( 9ve)9̇hs3ɓH[98M j~ip6^oΠkv5b4„H8dE a[n\THt.y*J*Afix%N 5x3m"׌g?"XYxs]d4%ՙŷ>֟-ر"va ye 9=v~'P(%ihBI/g4oJ=ָ1{6za*v~9~4t>lkx#-e$ 3 ۵x=WF?b*)%)IyKh= eV#[$ChOIvL}/gZ;wܹ3ڃh٤V۬m8da$ӹHqfYDfy2s|΂4Y2M$O_S:oN $I0O[o|=fwY=>xreH꧷~0Y2o4|,n7<<7TLa4vX̆a*I#HHF:LiHV݋W?)T}ԏbG8p˲I8[jx FiU ;ьL9`6sD&c1" Gx[@M?\"-_,~:AG'?kgY__,G,ZώKϣ~ 5,7,@A. f&a b_XUk &hVCm~- Օ X"6n&Q0Oaxݞ-KDڇ@h$vDaf ( ќ8pay< 㹘HI xA͑5d8'a¸bܨ8KP/fa.#_?8z|yq> g?C)- 6{B:[p/⼱-淠VgU"cⲄOb dV~ > u='db!J!\"D2obS$`V;*zɤoi f(k(H8zɓ ( P$$b:g? ,g+596SRwy% Nd.I.8EAKd,F@ 6@Ho,l٢*캏m_;u`*An1[-:A F1OfCZJPpxV3!kk4C+J+oHUUP,Ƕe/` ٫fD7 j D;V Iz$r~aXD wXFAo XiDBmXӗ;&E:Cx6.+PQ:InFK*N6[s4oFogw|g,nC/4s#0*,Pj^HG&kLRL`ML( 0fҦ$w>uyf1MP}\ፆeKQ_Mb[ǯn=/[o/p~԰%M?FD i={(QzWP[Y@Apz愻;X9'!蚏4-VXcxFS[$0Ɩ =ڪ1s9dI4ԟC)HH-u)׾%ekAV6Vs&,DGIȀV ԉ+SZQ[z6QzH Sd-ZQZ6ÐS\}ƿ6P8Xjr'r166:uTǰ/L [/B ÚA1q{ϗߟ^n~{uԷkfhZ, =XDk{ADC p e FGFP{h"7^]^d)0:Hj ?=ݖ>]~常La$%S{=*/>/ S* 6\)sX).܌L+jϳp1Lۆ $߃9]("_,iZl췕5LX0Ӱ ! CQ낮v=i9Hҹ~"OG-H8_N_EaC|J3LeG VW IA{'DuYz<;lLb [=4E3[ x.GM="5+%$f߅`#Ղָ%v:M;;&((@2/rL&<9*5F!j" #2̘hNjBUHЇa:_2@9w Č@ڳfQ,;jP%ւ afC)Sn^aȤiI;3XqQZ1:P(VlXE1-+;WCfKȯ;d<Œi1 9d&׸FųWRmtYPC"\- #m`T9۬U˪4}G [u=q`kڨrKs/M*?Q-OM,41v I|i~$6dY[x5ybZ2&d,d<;=tX[݇V1ϛ=|SK[6_-mF?rIzvFuY6ڷhoE#]i+KGe܍'l$ShҐjegsD(~ _zh#9x ]+zs9V˸t%&lQ3'|:%E78rpSsyd hj Lq4;->G!sEdv`/hf} oխ: f/ gGrVٵU!68 ecM^)V0PFA{E=n!@<|ل1I5 DžRY/a.b3+, >59nB$o:{̕xGdPPY"{$=jUh|ԏ A4DC͘bGB>2x$|Ct󀴤2yY$`cmPcjYHQDgv\HLE3֖Óӟ?ON4H'wzW`240exi~&9Q2ZXg5 16Ї!ATe;%c( ⼬x:'Gu/ukEh+X5kR`b0IoW%&K 6FXm>_Ssz_~+@!t`Hʆ8t & 2, =k*I׌[uE&{ LI |ҺnښMt8@`kԘܼ!8-:d!0OZ\zOo w^QF/G'#U CE#ɪ:ΔeUCD!`}R Ga"v&.XJU:W(fQmj_sV :f mL_HA gt`54&IL.fxsIQz) f~PS~lx8܄jeQqZwn\ ~fRsg2nޘaڽ㤡()Ee:JV/~͎!RġJP @a&C-kۏ äяzjfr`E5ǁ[UFK]}؆2vۡXِܧ 'TC匶#ؒyO}4ImUn 7ű`ai$;:V"?-WQ9bbrȝ~x0DoOo 1zƵUBWnG+vzp,^ĺFtR~{)w;I ^Wr3QxC-n++ڡٮyոazۊ`ѽDw½`}ȏ"Jz>3>VeVahe GZ4VLgpx x@z~WPQ 1긅ڬE (-O+87mlZSa+qNY`lIy%5Ns.nβeԲem-]rm[jrrY}iYL|D:Nc^w4ZfQՍW]0~NBd}?Ҳ + ݒ&W.[*~J+s\#E؁‡ w GE𚍺NZ)RWgvrfYݵ[[]#ڭVԲr3k'fWgfWdU_V,Һ|nEBgtu!.U))r, TYX](wIq~M=+q+m>]2 I_]ЀWgxyr%{k"ɣpFZ%= *Z\tk9U*LH\lZ,@y8O]iysk֫r]/njr~yBPM;`X+VViN䒱γP:KfMJND=x]/N=y uMg\}yȶ0/Mk;+3܃:Iz=e+, 'ڇPG\U^<^R:W̮Mt&|rJ '6sFD%D'WSzveRǒxxHd}ֆ銷UmFuj4n[jU+-FQN|cpW qcg507-l1'ine`MROji5(<=h?[gU{,5WMI{HS"J%15[n$}GFq6yT؉lO _ʼ#,,8,* Ψ.Dp`(Pګ_xw(7/fcyg sZ55H GM-p7$ѿ_o!(FO*OR@]\fjn7{o{۽靼κo 9wypG7t;P?䭝w/ }#YWo3;F-w;J$vl$'C||;<,%Z CVRt {.7UQ(SQ?;?eiJ̶Rq%@et*km֥.J#e?;Zscv1|1Vc]:-QV_CQm|ΫMF {$rc9!ԴY+.lŦFGm[( KFKZy[ߪ}$8廝RNw NtY0 Y9$!fmxԱ7u;{abňo_z 'YJZW (U%W] C#l_ B9氙Í\![Cyu3e JsTcmihhA|M:gA<(wV vB.)_}gUU?`ԓ"#%+sRsj85WٻLJV\έ;TZ1@MS%E764`EmƳ[+lO1⹌1S})>F BԳNwrڠ j|bobB].= |KVz">s'nьQȱ{ʠmzxVnVO oa͌7H(O usm@J4 ڧ_pT4B+-<*=_xUER7)gZsb/88w* ]CMiyP2jtBp;5яa ~1D7PAz@ ܚjٞLё)1E7g|SٞxhdiMt oZ&\*&rgde<[=A~pyp=Vc])E7Iud"R fO._xBYpPT,56XQKF_Eyo|_0յC-k0| fF>N<MuĂAߒZfv9#ZyrQ.ro5QqrGPku&]VOQT}#HSU&w.*/u4㘨! |*tȿ&t+YˏyMҗ)f*5EHc`c nkc9II~$ݤrr\DxZ3t#f|Cl?~ƿS< eR gX\pveʙMݩ#MZm.lM aHye[ӥr%[i*o1)HeWKd)5a3un ΐ(qcdwJH2@Wogm'egprֽVQs>k$XuĀ8 ŜYH k͆t10hs|@>ޖ]ʙFLmm]QfOAj4Ja,)ě/t{2]Q6[chswyWN+ /kBvUOng}ݳa55=vY-Vr+-a#`XeդayPd,g 1e*jK#uYmY\찼 鏤XtLispJԀ$`kgjsdY=3Ix{qo ̓C&1WOd)' B᪾/l 9H#rE+?>eUlj("91< 0؀g/I6@N 8U4B&0GcVp\=)]R5*4"~:飲rmHO3+.&:(yuf%*Kđe\BFLR4:(3w?A7oP0YK8$[/SHS+f"EVr>OÈgJĸOAJڟ$WG *7}ovݪyQs-q/ZY~( /y+޿^i0ѴWqJ{>X)|{G JSY*yR03`NtQ !SZ893Wћ+3u(f"JPF2%3t4(Lw{۫T+@%K!0 _>ӸRrĠxl t,m7eJo:}^˾?ӊ?N/[@x{&Kl=l[1;mxY{sH)o6+ k,l0p7(JH# $8޻|@u{H_tO;d{l  tgOLg+%vZ;9e}n[-`݅xw3-909^bwHp;KL[۫LO\wIx=;!5$g"`mT-C Thc{ 9&[rN+'xn:}Ho=bpb m3G4xLר Ҍ]; N ks'k &l9.(&-< bBUf@ɾ!}U}3b0-%PbZAOgޝon 1r%n ;`}mz^wVpm$ hWe2%1G,r)mxfm0a2 ?΂WOOOVoZ$YaVh12y^2u;KgU?0@k\=M6 #f ;QBC~5K<,F [O,pe^f|A Aꨱ〺cs@$_ŁQ O cO{b"f!}1)}@~bj?= }m 1c]PвA00CTMڂgW=d|t܈5(yVOO5hLE#0}y0[s. 2rBaW#dFHŎ5Q%;,ep5xVJw_> ŃwP\hA M#ҸN!xz6Lk=O m e/ lԬ[SCBBۖcсZHi'}D*l .@j1q2K` EG~bhh@ [ wCLea @:C2^M6WnR_jsH4s@ 'ʕ\I )W}ETU1$|%Ȍ3W]KN DĶ#jنd,&o3t ,I=`}u8VV3oZ/m˕2T|PV"$V ۄvl$Tx\7 or,dWz TNO%:h\=6EݛLXݏnwfrӓM~hr0#C"ի:!dRQzlTG0qhl"(c:d]6U:hQT`Fʌ=\n!j2z,hX ) 0Rx 2>Q+2cߗ=6(%'ōi'Xp=Hޘɬ0ǰB-E 4 J2cEp#Wb>DUf52C b?͠bEGU.(weG6U7 |Xp&\HGPV \c+?/6iRn.y~vdVVhس|Heq۠ !sd-5Ut|Dh Z$ɢҙhoTy%];P|O}p*LփEeG;HA#'%ھĒ^.y"n[E\MM@H@'y HHfaΞ83uO=K!jC?@><(W:ј@ Yø( e-gYk _6L0"6 yB:ףeJM2+ mFW՞X!;wnUvkհwc؋1,ɚ( EM^OF F|Jq+EpP},0Sߌ8Q%A.Lh hQYe~R?D\M8g"%.&@p_¬P+W-hq*y (AQw9ȓ%Ǟv;7@..>s.>| A5چ4 JmvqnJXt7vDr!!_A)֠ P$T\7W^>vסj98 0e}UYȟIBy_Qg}ѫ3u+.hi&%\{ejKm^=)'p-&R-dQ6$XIIɛaN`N ssf,7üςyflL/$q :h ;tms>:_9AcGߤ^?}(gF#1iSDcׁ璇klyBbݯHQah݃ ,$Ow{j0t4h(1S6rV3mm!t" ^^'ō/YpE:ee#f`[f>pQ4+6,*Z8R#0xcu#JyFyLQ,񝞅߻P5JLMO4V5c UwyEk^pZbx-,rUYOɅ)39q wf0{kF~|N++$>/'`b+mgԾf4\u~'j0& #GA "BpY)8ue\{rABHN%DABCl %gexR0MnmѨחe8.TzVy)$c+C_SG'@BL4wh;55[bP^k'MQI낳u2uVkoWf ɮ _ܿ@bӳNI9 B(~VZqbs@+M! +z%YPIv9g^GN@#=Sք1nM/>|()>T۳0D1{M 血E>?Sr8x/\Qh)(z}H2̼ɋ9O:EO P7nx["Dr+.Fͯv2,mmwx$Il+.Fɯ- }x[-IlCdvM,BB^N 1\ 0FRl\hb؎3p#CgfE\IũzC. * ds2*(K 7Y yxEN 0-BDBzWHt `Y8|٘B_x,<_'sB0\Iv?AX^FH̿τ9T+I'g[:Qy-̈L ^ʮ%aeѪd> ׄ1 A6(m>7D,xko۶s+iunfbg[2DټEMx=琒%qn6Dtk=ij ,C5vjG/9/j,77U*-XO#9r{{gSnk^߳ygp9o'C}nX;߳PFF =~uqޱdGY ط;|gfD .>Hr;ñ[e5?9 3(|*Xq\&@!;_="`=5kv#[#lja"<L%~Z-GZm@9 í@9 [jC( _oG(t-@Gr[^mh9:mh;}-@t-@/ʙl1l,GC2#˝',ZK`>~Zra"y_D: ^R>{ЧiZy* [ۭ'p#}}0*/̧,LƷ^ 7{MkyP>G?ˋy ﮖTN"qfI @3=%D0?KS17P6cH[4FLCJM )@xHQ5Ӊe(\px"D3dO47s׬.ZHcTܧxTM$`?tEHʿL&>s>j -1b%.`, I+;2 jVşi9PBX6xAR!BD ,7@#KAY* < H8er[ΝvQAm`}]>`FF ؗ`n^x`#5[LeT~hy?ODvHri LK2ޠU%3 82, } XI6+) f( u=u㖻I o iFU72sF󁐑rlR7<{ȶڦVJOMd]yRQ9; klT8N\_ʤd2S.;.= `,>kAƘZa#/TZ1I]7h6E ,)J!7G2@Pvu_J-cx`Ch2]`,-cw-&I5ABB~hD9]]t}B zFMW~=' !Z:Ξ^ X5(#ۜYPmJΓtLxE8|AXc杶s^ZzmTNx>@oi=LfPTZIEB\f>(f#+pt:pGdbj6t)"7/;MYLLbޫ8$ݔ"t=h2f1o_aD DP$E`M+TET& ]ts|PHP^BGyP ZXIA3C)!cM|l1gMq%g'(H,sJ@;ۜ'qΏ 9H_JOyCJLs>OTvK$n3`?Ϯ~;nhh |aמw'\uI'c Ht>[W޲cog]Yu7gqeT44aulQ|(.u,5cA|o+×ze@X!Ӻy;;c2 w>|Z-O\CeL^4KWIskίҢaM[k  ǩʒ<1b&ڱpVETHT M,eyaT)7 ol/>XkB O8_#[JnO@ Z\Kc0t~Rc;gEEف9@djt~ hS{1.e$Up#ŔA b"Qf\2X 7c[4~whjƒGbJԎw]x;ʶ#",O3H c I'*ѕkxf&*}sؚ-c#QnsSUywŔH eR pT:` Gq;:z3Z "4قn{N#N>?fEˋ$2j7AWw1G8XP`Q/Ĕ&~1[fs̈^3"Xq~ 7,` Io}("zR`R5P'X?_^mr:vc߮jwN[]j_NwɆFls$f"ZW}Z9Yoxk*j* 2YRFzrZY|q@l%xk*j,0CkLL>%G;xk*j(ڠ4YYd)ʗDSu!xuMJA+m3HCғ$ ¸3 v8ݝ$Ai<ҕ#NQ0{+3p4z #dS;qCR9cv@ 4!B Gh j>es}؈r7o1>O)/ v332 ”DR$ 7E} =,%(T 5&|&LcPIo܄>|b'XH2?!papJ`L!izI%뺶ڗAT&}f0ht"+q&Ѱc;O6!;n(Pt}vM F[AfJC埵Rl xk(j*0Yk{^$>txU]k@|ł^-2Pgie܇;ѿJQ4)vvvvvO <ײ%fZFrq&~ - "X]3xn g :C*"m@ꂗ-S 4*FZ%X_iV[XC X7{sHLBݝ ط}޼ӵt\SbgpT&esŲW@mQݧEzM!^)Nxn*8#0qY N!Ôk5J~%Z,ȝ"]6?&:Nv'&,Q'-Du({ Bqa_Zф, T41u݉{WC.:Ry-nKjWߢt:Մ"_7:4$S!^m|Ǩ;l.̶63h ב}Y㌙XQo߅j- +^&Lv@.la|qپ.=BπLep}f>%mG-Fp_ô~-cBhGEvd3q*XV>&z9uՆkÝWpKvOg҇FU>;cWNY  x;oC% gAQjr~nAiDLg޸xX[o~V C.* .58 D[̐ʶݵA9]#J):e^RsxyZ?"L/IKYjDtעG# c=Dݡ*JOʵjSRYrh<.;OE$Ԁ"r?+wZF/t>#^!˗/%2ᠠVu+d_kЯ-}/\]]eԻt(O$ŏlz79.Bˣ!F rωK8bAΆn Ir M8^:/#Ky_H/%D@(6+i(Y  wd Aa$[ 8gQw# R3a51 kIQn%Bl=P)6ڕ:_6pGuNf2e_RiRzW%Bz.Aq(k>+$ oٟt*3 DI):6D(l8T'4 X]:,V[,n.e;Cc70nvH!uhQlFzjW-$ƳJQ5u^)H 2LT*%v=F E?S)0zUӴceH@@3TeCnmlN|#)xdl{4OIneV!%' ,3_+7{359M* GAFP?o8/XyXZ4*DF:TS-OU\4Ab`\ B9rD Bš'taAܱ)j;a>0z6x[[ co>pB*Os2<0׫\hw`Xc,ٳ8nnF17=oP?,ApUF8~řټ;bx.~d2?ajQWV%EH.'!mC,oMooƭyi8ȫM_լLeCMB%(a3磠0wҦ^Ap9B澱աךzzYaj_{sF+)}cЛyC6')F2ݤT%e=E53]v5\7|G=Vj!~S v2O/q |ҠyΡy,*psf>7?)k@T[;{ ưvp8 jU=- ȕzkm<G{1Ѡ7k_0bTyӞ%&IKZi6u~Iv 5vy_iWI{g?لwWnq_oGK".>be@Jq(gxCgez+p,?MY KݕM^j#fOXy93breH*>:ۚ>* cz&1]$g`oQs᲌O.NzG on4Dg*VU@XU4RS fuY Ҫw]>0d @u0Ie-rM+b G0]cQqrZτ%CʵORHcK*JoQ?=o쪿o4=/xmSj@"ykO.]ڂúPKMaa;,3j|_h/?7|$ۦs=ϭN3xnf7aO'{?v!#72crDHMqڈӕ[uצeWc>B^|}Qo\H-&yy9h 5ư P`E*$RAZv!% ҹt㠓 (lfJtŝ'抵*m RT6C5R R*iSZiPh-.Nůʠv< :QHvw_ь^#JϳkIr{Z9%M\RL Su.JNqaL8ΜwF~;JpuAݠ7J9#&XU7,*8~DC`:&Si0*RERr|rɿAUrStdIQfs<+7Je(, FV߇iI;m3$T.{4ҕKgßVu,l}ջwZ;k6?>D_UxWKo6>b^mYT"FMMab#*I%q))';E&o4, 7">I`$CO K U\ 7Kq)w HAWW=t__PvC NumH *a¡u 0e':w/<$&@,)[{fHa'q/:ߙ~&IxYhÞvEܙ-~FMGHf&{8NIw6 ᗸ??:eNJ_h4PQzKIn wĜ1^ <U⏹`񌳘yĂ "r==?٫%(υd~ę!x l4c'c`I&同{޶Vo:i撕;=82oOw,t Z/>_: "g7! <]/@Iof59ܽm@BɩLˠEuU`u] C؆YeeWIR & ^|%i#[#Kf Ri; -k;%oyHth=vЃ ,a;08 s& w1wi#i5xD&dΏ?6LI4K}ӣa8uR`."t=h [6454X\NcSWD}9#_"duY4i8*fHs>sr4h*pRsvplO,́\Gb}%0AodjZ'I&rx ~ˬr\:pz9p"Z8f8X3'Vu DV7=& B,$ɁFXP,}c\DΧn9t* |rgON}iw먓n5V6C%J5@yw_IΕ6ffV{xvE0\tV=[ :o.:NÇ8:=yW^36,~PdŁ@8]ـ֡_]%Ŋ|!la; 98rOc/HA-՛ZjCxicTnYLy6h8ŏR uYEzWIa-Cp@ZE,XMvJUt%Ht& K dEnB]q/:#6r?.k~ug+J}vۗ_='ߝ3u_I-nۿhI^d[jAk M[z .ϞZ1(%$ħ]l%yNz\UoSwڻv@2wFϑ>MD^ e[MVeM`=sU`8@gt nHXL`d{gn&r'"܃csiyIA)+|\2Q ɾy'͗dr'YVˏ84.R)yoDa,(Rmd5N]6s.zY/<:tu`U@-C` PHQA1׻hRBTFlAZ!}ĖSJrr ٳJ8ZN%L+UJrĶF3<kns:gfCSl#0줃)%Hq5wV* LaƭȮjy|:,c7EnЍDKIhSo7 fS jZɋt3Fr{8>ץsfk '9휏2k!6B/njY`g̈́}UG `pYr:InwUU,HU3g V/< "BtI)d̆C_`VdЩvHMKsZϋWy.y+Yj_Y׵>^O\w\*rѶ) +0=TKGa\[]͸:uIzěF~{F8- 0,sў񿹰 _ۖF7U0[&J&ptOkK3J_pL ~]k _yH%d3pȾ[d9-Aw` K5\_[륝*e?NU-%@-9pۭpmdMӎ T> 9Wm"anFr?¢h8=cۂ\Y\b1 7v!|=/*H(9 k( >bk>i{>'!qTm.fl4cˆEoP꽡)Q9Uks@=͑TBh6\|(kIaE[V1^K"gG\ۦOkxK'h3Ka7ID/D8~Lͬ^smatT9~ +C7]M]9r+UadYz?A/NZ֔`CpP<>&"p7>*W+U~4Ey>V_73ÍwG'ū3kpN]F2-^_=]_nOwk|Oe(e}S]ifזߐ.\Ԑ4PR##@^7?sFTK~nɲnW zJ99+9`'\@'[ա)[wBx[* 6E% ɚ FFF Ei% EE%y 69EPDSs Rs JKR5{ Ӌsl"vEIiXM> ?9ߟkrbm%&N m$Ӭ&I:{Fj@j*)hM^4Y-X#(O(yG#./JM>c0_e6"VkjZsrMp+rxJ@QOY=ɨXKzZJ)b Vwrϝm)+hP/J1%&Kz,H!DK^吓MPb0->2.mBH㞼>Re%EzKe ,4 ,ĝ4AJ~Qk;Zǩv*Gqnr|Rod!XX`ELegÓPi ڶ4 )=՚ 7ڂ |>Z `yr`7dr,bNm1ʮB]x;f D24rRRslm&_^HR53$5>9LP\|2qɵ2u 99`z)ͧ$>0Ty+qyC<]rTQ%=U2[MN@c935mUg"x}sG_"#@c!veX@xk;DLLlwv_UU]=3kY6Ru}fefefee>=i1FI6Y24YbΛdc<19?Mt6-*s!t,%zX&'WuM^rX ;;;ɛ|Xu9nc5+ڧ O`j*^yY=IA VmQ+S#Zy^'|PU,K׋vr "uSy%yQY%r]]͋@9Nq1jm:zʊJ'ɻ`0+,Ikm9@}pE _Ndf#< W&$,x>%P3oߟ0~J|t.TBc]$a2UZ4W7><))+Iq?>=|q'@l5`c;`5i>aQr~`ˆY&C@}8EC$'EfifO=xxV٣ Q?{Hy1GP9!TYVUEE\Ͳ/L!,U/L2wjx* k\<̲ ˀ~I>yVrc"K/kድǗ<ZU^p}3Ԭ*l*gWF˒-iqh\%>`5!Ô76?&,9쀲shhj=L' S(GƘ9'L)K8<6CH;>?>.1x'\K٪6.7joifr&sVҼʙ2M6P=l5YM=4_a7Óۣ5tƛ?**GTV/O~@1նE:xyQXi'B^)lOnFxXg}'73yQg&Oҳz ow@0CD(q X߇Iחwqǁ-z=&A6o6\c`:}>Xgsx ^0!SWM tddK$Lu:̀>füwN*IpHwYW&WT,p6 M䢬Ft$'|pC]]ᑉ}s؄8kUQ_ä 4::ʇZYa0w MaYvuoBl[ϠOΒ?%ɓ1؞-gwd]19V4<*a8`lQ?lQ9s;iR>/!Ӧ "ĒYspS/W^3-fBG4@0Z_3yְY6`c2+:߫,FtP#</9*%8t4E:j871/}~@owϯZ-^;-^,*} = GA:" ` 'R:tLŊN Pzd@l(h9)KA) LJ8&/$CBD!Yzx^$˪ E=Nn[9O L:V ӁV!)2@hWl=E\Bth=b+B-ֽOWj !؏\r෋!ye7jD [XYU{${MCYZ@3ޠ`U<Flq #;vaK#-&SPYɌ.;! >3ځAߴTQMI euB#o)WwMԪb[t/' {"WC NA@kq H|TBv'h LJO[bd`NEDh/8jx E[NB6$C˵5f.֪x *nZ+RBt wH$nE Ċ`!w3Xq KWS6ve4T$M^UH|c غɈ1dA745$KUs91jhL;Eez=|ge8*B @(VWOR1,In>eojK.CoTZZ)L=D٥e`-GGI <+#v8g,8j;D'a㪜uCMNN|DYm=gVDUNpKMh՘Lx_a"[F?`H{+R>}Jq]!VN:rGZZV2M:ݨ$H)L#2ӘQҢh+=l=;_&^"wY+znt\=Rb_mݔZQ[Ӑ*l TV ]ȧu:s:kBɱ" :\Ň5A6>(sյb8E,i!GPOB؃;Eбᗖ W=k*Eץ/ ke\}KsדafL[yQ@tq\Ӳ$ic;iȪLTx"nI9ovcXa8̫ych!H-ȓ"rjxCfɋokLv.;5r*'nƱnK=3SqOJWF,XcMdIf BU$ y}V %(u*VvVŢ{y/12,U4^ZD%Y'jFwP8|8}Q(gm8EY_,ݲVzuY(ܩAE{BsmQXiֽX7a"r[dt5vq^?9M['^z%H$9d}#PR-MUN&-3g9QEWg(C15S,ٖ"-XX_YONưrzSQbd"y!lo"$-n&D5t~e2*/ kDn \j:23#5XƵQ)؛MzLbr J9ssV㐭l\C=vD{7wsA -2{c1Kk+up" tsLeHRWd#hG;&2Dƭ>S3-qKK)!c]#E$ 󈂍V{vVNs{? b"h}j>AUH;UXd?`2˸}vn-9M!$'Ew":92E\ V{n-o f$5 eke?zF}RGݠ{C4M˵n$"V>Vkp:h5ăD)@K3K#i8М33ݫ/&!/)xo/oWC'8*NN!|Awu_`mU9Bvo-DW`G#X )-D_p~'yNծ[|ilzd] z [r~&ƿIQ>Biߚ |ƈu 9LCɣlťxĸ.h=dw}391`wî_ Q:Ձ[K9rlNIXk)2IrX]7 ]Qv<|"hk%7_x.~W2Gvڤwm3L_@~:ʟLRmT*7 u5n(MWxؽ'7k(!nlB6o+Tn/oƱ:dܳ,@u֞{{[,ǎGYJ&ak7֤^ zvt1[9lM60=[BJb'= *#j3j;xQb>>MlA>olYeϺ6O0Qbr)gzn q9丛 cun #wr_ vr>i [W?- $~qB'(SDm.>S+y3<FzPu bVgaimwlW܆m6Eu~A8& 3mOUmmQ-0¸㙈÷FWq 62|G^#9\xR[H ϫ R,㌾vne"VBt2>-E qHcquм.F5 :1] 7݈~H$L]šP@aMd@1Îяe>"HJۖ8E4A>?` _} f3`g"zTUpgeSOt^w{Im82c.oEV0srx"o}O}Pp) .V佅LBh4gfG^+@Zu'"wOVߏ#âAV4@1s>#CFױQ/y|^g^4A3m#mC\yq5pU}XMr h-ޒ`rQҳyG 0; % t]S#FkG` [F^|(l8눻$CkVM{&"ԗ0E;ijvE^wxbvrS2uE:5ژ E1ȪׁiAM;M_ᨂ_ÉE|z&]r yᎬ`Cx]4 iWW7~y 1v9JaI+lb?x9q 1j;*N&rGKZ#H%8>^iD"fT݋6ݥR B\7تbBz"<U =Ir $СFeU O z1Ӣ)RkB} B$f \~e•W<L|amDXJ熎Pjt47©:cgB$D) UqLA9 '`D_pҴ:,b NjGz1AwQlWT5}ݸ)cFE 浢 epɊQ+)ҘSlд46&K'M >蛪{jvJt$ qJ+Y?+(Xw]5|2)ϺGNvTΚ|p8kUzA!̜{~'-S 9z{z' =sbAE*hԱ?H͆5 1 "=';sj<-F "`nK~>smV)Z$h$][6l}M;3 7 lVgpԲK]]'v.-2lAȭΜN:؈@jw@w+Gc%'#7w$ /7r+:4AlӗQ4auഽ9`άt#kztU KȥY}ΗUpM"5CY~XOP!Pa| "-oE 58[&h|lG#fa:Γ6Cy""nbT0;!5nJwźp|"`Ou9ecn{}yP>D4\pDV.<.QF6?@j UE6,\$OGI`$p&B'T{.4t!}qr[_>=8|x_)P\7](׷ilN͆IMVqLF> GQ"i(𩾱F qΩ{=Ĵf)e F"01GEDkPĎHj2'k gvyZovͽ ƾ?#?ym:+%S''O;PZ5iLsn5x ,kӟdYC,~Eg+0e3`!A>O+z!$4t~>AG pFtdptd \!ydE`7vޡ/(KpYFlaa(RBv[۲ T,a9B3>Xq6wݚ-Y. An(>&kŒ kTy{Cc=dv#C?;®ٰU؃o,^c_?ydͼ.;hBkU琻|Dj?ig"89 {\ȗ£]Y@@)4OCl3JB ק$q8xHrOўĶ积GG:zqDэ!t]7 K>NNNR,7}ѓX Nvc}i}WmF|,arzi"ב:' UD}$5F'7Yi(5Jux;U &FcMogrS^%?ŭ`q?+`b;d2M4gCxҙ&P2iZIvTiR!橕sUXZ `:i{txd{eOR0ULx+^DӬiBg7q >'9< dJ,çt|C>ySxgy)#&yfC8$@`ig{܎MTP?)z>[ʙuY_@zӴ Veno W WxU*[_\rS:==>`mr~ `8n"yl`B23wQXLfAa ؚ./=^ r@ :wM~0SCcD5BT9 U<vI=4wzmۇ0wXƽ]<. bA h{{<OSO>/io)6v &b93! DB±%lW _t_NFݾxB_^LƼN,]^DjrCj mfӷ/>1XMJf+isK2)Ery۹2= H9Vp[LecԼ7Ok.^;{.cmZLUWoau/\l nfy/;#~vhy w/ؿ|"Xc^l{ᘏ}6dې{eEr^h)kLuu C2Bݺ>//wyNcXnEbuyC5UTI3;p{wr..1AdllU[9l&G@һxAV0xAP;:%ُV#͝ IJBPpq[Ճ'Mi]3Wf!fo]bqCa\6/aOWtlk[ѺPS*/ɧEM>Ż&/_D&?~h?󮵅 >>j>v5= [f*67ݽ)!~$(OtV!D&#korl&j2r놴y;m;m~m6m:7oNq*Y6/Nfr]OlǫfO6".2,m{ٚoU=Ҧ~I-KJTJ'D+ PT^2{Ώn/@9>0?[er[(W1S-g\=DƫWہ˙r LbAAu]f#6sm4 QWm ;lLvAW]lW}ATt*c'(ctWW(t3ی };ZNJe0]s6絤ʎ_v\jH7gkvJ0Zs X5v:j$O>@UWQ >\}({eBq׃W x*_VE%Z7k /<+gm.^0p4?_!jhVE-Z>Y|ˬL`e$MVxk|Y-1kr-[oWk^#fiRA̻v;[<%I^|HTK{E{i0Y#? kG+{tHNja%EjGPq Xұ^/>A~Q|V~CL,Nh2:i󢹮>uѓ̤tSx?d8|쵎d 8쮫ta>8ǽ_?$}Of~^I>8#YUd:"\K҄},CZWoܑ=>̻YMp]`۾"=^D_>ZoCx=+{UևMyMFFVPgw;{/7.qoR;N>3n}=haw\Wu͆q/ow^F( mu]REVU7uSRڊܭ)ʛàK"*q MA%xwi &NH$"V2CV:~T"Bs#C{-:$zdEZb,^PU.|h 1tPց|n[6(ZyKt;]Н"ݢىtawZpc}+$ vv6Id$N~c`'&`[HՋZn-}8Jr!@L~ȉlŬe" >HW]a5:yl<I(ݩ-,v -+o5@&c4Ss T7&Y$iZR>d^(kW "Av%lyY85EK0tb@e4\OlմHEɲNx*\X<`#P[H_ [jBaS;|Lܞq|ܑ^?%[I .9q0'FZ~h&zwb3Ŭ؎cG)$tWVi^W+l, /﷋g@aR %Pc]dt Dbd"SQd 22R:#;wd#q9֐=iE^=IA"vs{B.0$l'7^ntqrY~{P%t8f+fF6cbd--,x;Obrz]ɺ=5"fO*#Uҡc^?mcm'!Ԙ:躂&O=oLR %8aɅNT !Fr.,& ?͂$*1kʗ+^qQXEs0 #8ՏT_H%9z#jQPZZ o.-{_0p9E¢-ab4> d %y1ѕl)s *zZ#28E4sq #cs297S ݕQWBZ^?cgNB8ɞES*SH7$6DJb2=C(qZ2;ӵDucZS&zͯ\k@*lp4&ȨCǭmlm{zq┖0v [Q+ʝb+ LX/+gïI 1 IAC"=dΘȻ6c[+]zgxpޱkB9'CPO (?E# DTU0FJq&`h1OG-3{g.L֤3M‡:ڪ@!)b֎ <\ AX?M?tU WͅA*T˥fG"y Ǵ5flw$b520^FG1zRtk`З{~͹u_E,lozݥ[v(/*,D9ImvZMj,Ȁ1d|NT3ZGg\$@r/EP rQ [\Ds}%ЪP dBFRar]ʴIzFV̽Js& ̮/@\x~j^+G o#$yO˼)?}F]xYZʕ]ǻ\mA8$pFнi4rч04(6J+sW.Mf@m )8"Jw퀺к@Yb !~NdV#ְ¬ΚwlGlXЇc!xJZ C1 n.1Qj{C>i`ԹR: Ӽi>QUcmUbpOQFuԲBOz* ms#N-4*=Y>T `0$n%WeV5ow {n SnҴ.R lg \U_-+@uq<h$ 3kʖԁE$o(Mz֛.\ dm{eǬB]{QٍQr%&R- Jݾ37]kO?xUrѶgmDl)VhW.r{z0(н/cuvKf_ .pݻ @ : Mʩw`/}$l76Dă S 輤0$QM#6VU 2CF8e2ko6fY)&j-nF^&gIbFs|:Җ,4Ԕ~^*qClKH XHH 7`EЄ]W-P41J;-o|MH둉v9dY8KBCA@Gp(($+&K._A!!/i9K(WPع\0v<6ɺ'ļLz Cd&< 8lAcjxdQz`0-w[i*m^ oĬ"|Z} (c1åsttҦ"u!L7M65du1KK:@]Qz($Dz\NDi BМUg`6VL| %}Q^'#hap8O`8?\u$އ A(,2dB_,C ލ?Inh26nwXtdzMJs$!+"`j¾\(Jl QUI_]t5,֥e!nJ:;5\(6#"pJ <6\g/uW eX +$VXgq='2rٰ>8Hi(FmIE,< zf _^o{Z h}rogç -oa77ήZ ?ΤNEJ!ki3ts#|i~/ .a'jmI7$[\mr8Uu_.xeJ|QG'xŜ Bng 6NN/ZM:ՐNZmKt_¯/oJ,{3Z 2JkLJ)/W`Pܚ=Jsj7VR݂ގխ]WEm ~D[ngۦpW[k29@SJ/0c x۪שS_K(4d.QpGϐxoOG' W0-}.̼c̜̒ĤT413񋛊֫(O-ݴ 6/hDg.r7xM?я3bhϏyODn|/f>y7vFo ;?z "u[p (R~稇 i>:FAna*o1-\2Nֈdl|F!ޙx K)DwdxIh4 ZX\ŒS|x:hg - !g:Ta.#XjSxvy؆<\8{؂<-i2dK?l >v sj+()V]m/3W"sX&6Llu"43߄l.y:~btLGw?#opr&=<9v=#{Gn qqrhxG LLOOgj}M *VPx[g U=HJFQxWkplK GrP6ف _yBPvT 7E"Z]9)*p'!y YX>[XD!ÒCWWcyGD ICO+~Ȇ0Xl4X@hC!-gk%8 <|2yoyk͹QlrtW)WI4v/w R<$D 慥[dllFmh<9\F1p:7D\M ;vW6FlVQXRA" ؟I$D>x>w`q/V8+ɦpũ>z?=Qh&.B*A& `1&c+dx(lk$d(ABҼP:΅v;1HV\x CH! ^nwxEHEbvCH'<!9+}ELaӝGCEK<Ы @7ôpFCd޹ȑlJP}čNM:/f4;csoHlx82/.5ɉR7ݬ}0 @!_۫Wj)3t`(w ̒nyWNw@"l_SuZɕ:! 'dC]u&&yVGg T{!}@ȳz9WzT+)XarUZid`M vV ,`r6_GA( \r{#y 0^ vT>TdV,VQB gq.WtnإPD1l\gC3nR|,^W#52\U#zy0r4^W]PT~K[ŗ,gOaCNaoCBS& 4_&blNo Ս.$_&ao;}uȤK=g!t~UC9 ;덮'WWv A`2iyF^X`@~]@hW\ v)/Px 9(`HUnhY@ݍ9#xV>e;8XE 7<`^J HSHi˹tz/͓YlX=ŒV;%B*C\QiNnQ%^FI'nɋTnjx1S¬W\j-.PEgDI>4̒lCJ]y8МnZSI$Σ"|>xk%[:Ӎy=. <)'lzt*;C[f7~J>SUu[6>!*R*xY#ZT>]Nj >]|T GXDf4НߩF_{Tu!LT V<q; ׎: ]SpGQjw6@I@ƍb_CXuS/LQrIq7OPw [FV$xŚg{f& .ˆiufE±^i7҅fCQ|cFuۘ`!P|b|$QXvuyx; (Cn.VgR h`uԽ2ݲu(a汮!0ʙ:2 ԭWܨ*} ʺJ< >/p+dG]#xw!d%ZIoC::>Ɂ2ޠ}9k\Kc5Ճ:Ŷ,>C)GYI Ե' jZMۓ33g[+Ҩ0נ*͉ϵ\pL7غ댏9aqtWe D`rҤ6|~N[n˒bsc.̾oMHQɍqŽz 7k6j4d_%2MDn}o !(ΔA3dfRl^:+E&C QTBU;GkQ1J (gm%/eiՔej19ChBC/tpK[%U;+(#I֚Fs@m<$ʳ`eⵂa]YIB=|fs$TFSmHhVܶS l`%.'Edזb h5%@.qzUQdZ{Fgd]y?l}Pv<v[M.\0߉3.5FoMMEe}ǥEb|0E_ՉZ,DWưQjeXʳ$iu8z{͂*III_>,gt'kG\<7-Wdՠ.cB3ftY& ؂OR*ǟn6prRj*,Iŭ`tꜵKUI֤>e{8FrB '흇VT8` s*@H^Bʇ{ZఇN90?Nڧ"RAYB-\eݓrN}%(4m$ en TLUOa>Tf1 _YP()B/.L)C-m<\>=5 LC] Bo?fùb:\A'{?MT\y")ibS+Umu$tގGW>+{Z8& G[V x{]6x% 6m3oJlVPb|AEI:=5/> -H%j$(N,βY[y}&1ԜT 2M͂zQ<<#*sx{]Q} f=Bx_fg Ӵ5~ )]GLJx;)4s%3[bQzdof4܂ҒT M. HKLI/*IOHL.ɩQ0400)!I!N]E%Ey i\\ G)*d襧%TKRK4˧e攤痖K(UN~ȑ3H!Cz՞w|}~L{qv79aD5}s 1iyX?`᏶Vr\&Kq # XqH% !$*Ԓ@jZROI*)ȑ , l(/0o;˄ыQ+&V;D]f ៦)LVfv'="aC B],`ʠ6>-vg خ$># ( % h ]!n~\h:yx}j@!zK(LɊr'q$GFkW:! yFo]o7;̷/O׭I.ATY$!#13Z \!b&?E꧉Zm8k}  DnȨ*R^qL$hPr)Vue‹".)uÞ`[ 1 d(O=K xx- 6uݍơš-^SX-?͈:ljqT,0L|| =9*XDzR$Qy随CG=UhwrD̋tv!4N''BW&V ?Y<)ko,)'xuRMK@E%U^=%MҊEz"Klm6nҿ .?&i=̼}o>=>ZG*B6=8 V#@+ 29P ` x ?k/mkCqF=$w:~M~IQ@huE|\B8X'%*j+@߭lyκUF& j݉Do ifp~BUg</ M+υ3JKRfAlˇ:;2'8 ; U76xXvx˿kC73K>fIV*(HVҜ|Uj={Y'bm+LS6xg/F,/Jsd榦@x%PVrIV) ,2l@FQrH )2A*/0&@05 xȶ/hx{γ`r$+Qf$+iN`Ȣ xmK0_"7 V6ubձ |)Y>Ѧ齌,')% ͳu+*jȤmU%UUTt*X(a }Vջ&KREk:lH2BFNBBNU3sE;#OղjW ] "k) IHD)!]Swh!AV?Mp1F1 U9q{T  ~ R+ Q1#7;t؄_s- G'?8S!93M{Ks?yde|o% xyofrQ~q~Zs~QA~QbIf~MAbiNn~~QC.T訉t t3su Rs JKR9sr8 t 88Vkc7oO Ƃ'aK'GDxn6 \cm hkԉYmFTQJjyO^!5CR:;;;aВiA3bbI&tS9iB?A9-rF@~]9ڧf*aT|OQA8$MШ?dS s܏c$BP 3eL;ݱ2/tF$|]Af;`鿑8FF%ś2A$c~[=~xF?lDZ/[Ҳ@> L ~R4|?snbp}n =ڎyZz|rWYƲTAP} T ;D!8B;NBz> =N-%i >_\IOE,,YμcgZ_ڵaoUh[Z8CeY[5wzqVrGoo!,H܏}_<*= -_p-]tlg1[y,ž^=97cw:< e-kOB?LͲe9pjսܱId_%czp瓄ry}Czp`*rgB ٳ$+D[/Nӌ`Z</@$$Iq/|(ʐR T=1~Q`Q9/Ne(i hX:6cX,:DlS{~e} :?6^x!_1^_rIԞQ\F*4|EmMjwsHRCRY4dᤲjNjWb4nZL7/:q3u2B&CIgKȹsؓc9{=<t8H,µ&oe|%&jbkǣr Il$XsBeCw>ař3 O6h? 's8~ٱHUYjSV.%#;jmgW@ ^WOϔ?fSx6UcY?]nkc~<6 ;4۴*Z~pe+ֵhj܊zb[F*3qEk\nfCWz+֕n vW+nzh*+lh RM_2sWh =@.P@(b[_pTH^76@ɝvڎR 2ūM(v E A'(` u:n.`[U+he : AFhcIQFи0t@3^ CyhyFK4(:e*e-:.6 Fqhnv fahlp ƣ{47);YŠvʣtT˦4j8MҤۯt44 ]Gn/;LLLm`evDtiYF&ӴxL7ѕg>t.NV ;\rqWe=bIGd_8in/⁽B|mNc}ZfY5ZTxn#L2HeaYI^r{Or0B|Dc/(I}f}wc_+Mv]K^Oyۨ(. oxappB nqfnAQjr~nAiI*|q́ll",g*GL 1Exa0` '|q́OY7`,< 8xWkoJ bT+@)ʇRHD<ԛJbU]ЪάqxBzdsΞy^ (`=sוZ ID1w/\hK#m/ 45`8-Ls], m"7LoEl5_آ I%!w M$p(Bj_%)Bo8|Qsb\!ӑA+}8C<@ WsIr&t/N@w'mBN(]L,@nLL#hK r 9ZX@d#aEpKi^]]mv̱ KׇO퓏'womӉ])}9N"L>8i04`E{C\¢tB=+=MhhKm''1-|L~DL㠶v'O~!^t< RS `w"QP[1C䎧19254jkC_M8ዘRscc{eS _.y< ^;1 tl|0$oj 0;0l'!M?*Wº=:\B`dS PO"Br,|aГU$:4P!ʂrTc wb`<.} }"TY29o-GjZv?}2q_o=[炢Wr:iD'oȾi >1Ƚ/$[oo6R~= ^^*ɻyߣi`q Pb _`oƌyd)q΁LA Qm>E4?2 Վ Q0YLm  ]l0oJb  }2V1%&ݚ!CS RA =f%y8Q}1-H7bt:1mJDH(F0)Qy@h6R* '%(; B7a(l5[{fpN[\Yݖ 扈Vzcu:M" ęPPh+нP}`NXս5lBÜVG]wv( vw+0c1꺳6@jjΎr0'(vvg=E8C@;/F'Bpymj-B ymjʠwvfNBDmk++A'oux 0nKkWka2hwԵ[Eq)奵s Y-umjmySWh-+% =[ںF#嚨, P2kw+~]Cnvg_w;뾐^m[ cnlWNRϺan5?4w?ml|"w!-RnjD 2nSb¶8_4/YWKVX\x迱Q@(<=8xr6t4 ?z!(ЀolЖE4v-A26:KQH98f>.s2C֎5 Xь\4{9xCm?=<={}ۣ`xpptj{Goz)~:}ON%(4A2 3Q314q8Eş@j 32n2.F?0BʅM2I(epXf;y)ѵna0b_$-9AcP[(f,Gl]g̓YZUȌ{CI m8!LaGl#kvŁrv"J!H>ƗtP\{Afы~fh/|\ DjЂ[ZI0o/bEd%/YK *VnV)s"t {^s'EN3wGp6k9vybV{M9K MJغë.%=GQ|\ezU}/9 *_WzUo%i-ggOdB,{mՉEu.%2?qٓ0ZSPv=|$?cO1<.bX<؉'0>(Zwj:n %)C=GPCOnY M4QTe"Q,B Hjɡa+,WB.xEű/l'Y[ŇelKZ҉u|٣[hhL!DIl`gEOSxWiAw|ܷ Jo6 ~C\ % R%HK eK}#S2RRXÔSg58:DIg<@4u0;Vnԝ/x'u^ mS$CuIj5`~t Bkz{}[t@-#},3F]G[1?ՙs99h ~ By?:Lʆ@_`o3#\?|y1 ;<&jhW3k_7q(cN&bc HS Tf6dӃKJJhR@%'#T}%)#N-{NVrI3bljGϡHiA(ЙV9% هe ?.>rtu Ѧj* HDrgÖP[ *zޅ$߁udb23ҸοØC>dAR|W$GL b93Őa<8.~rfV1rPPh 1U|:Ӹӑ75|'SD˜@usP_}9ji';S Ax%v-驋*LFn`?qTD͕s=9=RP= 0HPfs1O>}Fʈp,(T2?ėKf9E5YRک 4`]x, &ǫn~.9ߖy ̛\ҙ5&{L0΢[kP99ϐ3"DO˜o%%'x;0q, L {';n.w`ⱓQ%3M!:ZAQABAI)>828%7@I!6Z$#5kaw͛<<UZx;0, vE>;vx;q, Γu}7W9IXx; s3L&Te'JYM>'5yo-b89u]=B#}\%U AíQ-ԲI((P9CNFIKY4@$#U!"{r8)GCS39DfXmɱf,`B,3X("D7OrAOmŕH J*FJ@9kk.N(@Z3c3)'3 $l yk}@ܼ~9K@a VsFxU]o6|~ vG'驁s1Nv\i@KET"c߻+q.IO9;;;;>ÌDZ R3ˍBf9J;-֩F܄n<fȕIl.ߊ8HZH Jb<+3GO,AiS`QBA=J<\4@iL>T 1zZ,KAX`2( JjTD)=ѹ ׆d{Ig_wrcKYr4!6M-d &eZ\+LWyF4 8!+T("`ɡ4|Uf-~8]0^}0`|ȋL8I3iwTh0A|04]l׷S`Lë0n: ڀ3E *߱ Ldf_[ePd@6[sA bwO9X*ubRT|Z[u:e[uH=4 g!L̵^>*%T^&ra =w~TZO/ ٠q4z?Mёn!p@c5~;ٙe~㔗"TA'⼈V"(H0 þ{:Ə*l-F4Ђ#hR4yݦyke\QcK1Mj}>¹D-v4=2KF/{5f %tZa ypft#zh4d.:a9 I29Aqi!AstOV; l 6ə}< D{*Cj{ r=ۅ#̷lq^NR/4^$z'ܨl#Yq*|Y9! ~Չ(F22ST5_Ei >nы+3|Ec83n&E~WG?00 x+oBE&0O~\iU`P[X_ZaiřUU0,J-)-Sp  R2>dEv)w`g߀`t6נ ? _M$E%0E,!A[LVcr]5 M5%ty{;#J+.I,I++c(RP'cx+Gt5Dv1M.`bbQrF|Qjn~YFrIBo@cGcg*ũ`Չ))J#,̀du8lPofҠIc#j]T8 _π`W 4{eX082X(OVdF.MMA#˥`O.-N/K*^\U@q$󑼐XU8+3p>zv2a Nx+5:B@(19'U!1/E?H!X!1--3'3$XKAK$#J!$?W(?7$;Q$?W/s ᓟ3OeubjXRR_Z\R媣`iřQ`3+{8L{x+0QpCrf^rNiJMqIJNffAVH $$x+]t5Dv1M.`bbQrF|Qjn~YFrIBo@cGcg*ũ`Չ))J#,̀du8lPofҠIc#j]T8 _π`WO'%#5R0>dEvmad?\zj VLEeXűG2 %XS23g(%x#zJl:,j>~Af&9C6DZc XxVmsF b'$k'iU`pAnz 4u'.t^8:a=B*M 4Z>2&;te{m杸e$R?sRَ>>~jmQbւm^YeX0CͶ/r#I/PPə_\ z% +̅H7“rGRUkzV4!+܉t"|:X`~p.(ƾzƺ@;γBMe[Ud+M\L{}I٘oܾ=ߟb~s (_K8 -ZmW-\ٖ p.0vOHT%ff c^UƮ;qq;˖8FлQGGىK!d ^dmmiIi{9g̳@O9iz.J4'LR7*E /١j=|CwPZb6MZQVe]HT6 Y:[붉06V[GL7z5jA '<7_>`t5"! t)Q$/QD*L鹞3?5ivAI]^S>*GBjs q}隖)?OO 7rCP=XmT8 |>:0A4Ggin]ǝx=w/>>JL/^ x(?ܿ|YOGP՝mWSy3|jB#]:ՠTM2XݜU5s*jΟu[&EVaߝ}wxwGa=1;$L\B0[m\1GI7FPk^G'4y(xmOnAIv(A1-aWЀdZ'Έ}13Yq =R$z: %-s'(̝s=/fKyϧ!|pp _Mm82{35i% H>/!v[Kwsw>G'y:?CC4ް11bL*QQgq|`^K#K:=~3MMBl>n{ yVw`8rCv ,jy1 oC !^VC崷(Uƹp`k"4Kep%<٬( EMUwJFǷ-kn*̧=3;6&-סӠ(uIZypEi댡ANv|'E51?.?ʁDd˙ZwmOnvSnx݊@UL ,Zw9-e*ݺFԊt]ī!Lg@ 3 <>OWNH›I}99 {vt < 1N9O=h%rK8ziRM_ThRdnB2 H?,>P XԄJ=>!:Cx^Thzu]uiXɩLx~kZꇹ~Ov:?aK<_s*X08Bj.^4Jn?[wSt  8ʀr?!08#XfgshDǂP}-q(sySc8 evPb,FK} aV{[OCSo\Fp,׉ћ ~uIjgKPWSulܝj7 HݵU trq"僀ȋ@m#a/ZbS,xSnANJ4aYѦwA[ b5ՔbJpMQ-K^2;-phb4w07ַ:gmn6;;||נmض8lvڄPEX>"$!s ص yR[곢B>&P()N,vG,S}Q)WPީSV<0cs=9pgqE>ظ!p-,Osp%G%_hb<9B"l8!> "rՔW: bQsW ]H֬SSjxB|ķȜ*|XS2FSq:J,'1cSOѓpS2 6U ڀy⎢ELGb:$UˡH23,f"(̲~[6td]֡!5iCJI  !hy*\9Qt۟OpoA<^ޛOSzv*ػ/g^xƾ%UO~ʧ~9Opy *X*9LnS\OȮz*$=eOL@9׃"P."@D=w8YL[=x;"ϳD1{a.SlyԼj|t(9>.Ҭsp%@ bцf= >A|D=o,"Tn.qxJ@Abo!i j"b*GY7?M5> |^`L`i;Vr9+cf,w~1e:ǖh,g\\2o<Yy嫳4`._z&=|.UU0ū?.;W[܂wX@ZFb_ˉ~Wъ'Uivv0+b]]@?o `\a7s1%((H P8H*{^bM5lUIP%h:?P6L#ώ*a Q<2#x[w8hphE**Za:br}%D(.8q#jO#ТVaX b+h>vze@D }xCG9aB@] Ш |nOӎz,>:0.7X+LHnmvڇ="TU_Е87ݲ@v溔d{|ɛ GPQ(7tT/3"p%@n-RjٮZ1h K?(Cila~@M_A&K&?P<.;4X샂]a\;hڊ e14Rd>KRs Eϧ:lmAn*srL/6f2;3c(}žXZM&݌yW{A8plAcyߞMߢu@ޙ_gʥr+ frpCU̟A'ʢݷ@ʅ}w.t<UדG}`𩌯kq|`sLta+9?8Ԓq \$s:mdo'b}:'r",}F< z#Ֆ vBBBt6r[PKҷ*TF}Ah xq+A*8T,R/mIf5"8EL@S+="hF"XHIQVM|'޹8Cq8ZhL-6 Q ށ)>BҰÁm(jUFwT3}cVm=kT@* RӺ3&ɳj:퐜.܅Ot8ʡ(dGM4lK%ޯH$k8S*l'p6M6ƻ,8:V.q酮C&V@l*qVPZ^]7cߎ ݰV"t\3;V[$lsH>IHbɥy^|Hb)3o AI [2J!˱ (w' `ÃǓu:4H:LeHyM!Kȁ:vP<(zb"!S& M%F`Lq6x^:e(|g|kxU?/nbˋ-yf^|Rfˋ-ȋ!,RZđWXc~MZ^@? N455^k\ޑS}YkOLɚvיR+MyL\nxri!EKH (4 Cd- $j"%𵀀 )RQy ա qK` "% DAGXouEƥWÝ - 7Tѧ">vSQ_ZMX;Qo/p,cr;׳|S^iQ}6SiKd?0[-_7 $?8:dx[=f s3L4 L͍ &783hN>"9^}x.\&F& 48Ɠx'l ±Usl* "_x[=s.]%f#E.L763nޯFLln6xxz*^v.x;=T J,&F&fAF& kWv,&`Yf c9vdTJ?P2<,X:lE5@TƓA*kfl >o%x]k0_!MK?毸ice vQZh 8"%$[ DOs|4;‚,TI k ;f&SpGfG?n>'"+2|o b^s']y7(sĿLn ׳jR%fx˙< C7w!…6 C" e0pyH+[::uuv5+N pE(յ/'0 t8;I11"4<Qnno'FSy(OfAˑ:PMC:e>ԓ0AH<+*.'8OmGu oR u* r:(fK]Do>."ܕقHo%4g| }-a7qΎN}V3X0Ct#e I V$p/o@Dj<@SbkpRLp 1lѺަY"[#5gnARHYg \MJ-iwĤԒxRfI,pK Nʬ·2icc~ r)YEz]9IuFG:ecR䋖9d"_$1ܴ7y3]?xZMo0WXe6XI;0-Z^zE#!2d[0_ U&.9~^^?~+szXg`e EĊŲ 6O7<\b BݫEo BsGi >ğ OS?n`r͒\ |۳$+<w+0]Fۧ#uc80tvTr\%EM%`4Z `MI ؇}#$&jOzws!O-lS{V=ujKMӜُ3ߌ؞e6rh4W YzORcujlLU/2"uFd̸=ў'VI:)lJ?ۈ%e74.8Tjc;6؎u}C|e)"5EFF#8;K9|),%ciϻ̊4lfMPd_&}0`r؊՜l8rZ&b5D,뎆K(=OtF'eO)ϣ~O8I 1ٝ /Z5;_7p )'|vU֨5.8 ^hu-Ϲ.Oh'uuPZ»CB_` 54Lx ³ދeϹ`Fr>-:Us?Ã%6/3UF|gT$r{xZsHl>@s=;+cH0p5Hh-$N랑=Hvuk/^/Bw6rZ>lBE#p Z̅˅eks$ϝ[v38?BH{P*]FsC~89ǚ'hy2p'qm}tX6,,MKPq9 )s-_#wVs̀71t:MsmI-< Klkn\$TXskʡȄ0`s3j=jG™/Y 2ks /ȨL̻j-W۝ XJl.{P FuG@z Cη Mwn8_0T*ih0gCrUdb*mbe΄()[5~;weafz=;0$s/'T OCfnۦ??,MU5K麏KW }5Pe\us_L-n9Hѓ p]\-ԥCzQKq&-6{,:SCH 2G0\>zM9f݋LU3f [H۱& |Qv+GVڭ[j><]IB<74I&U7t7I 7%fh Qb)L6#) m3"J6#1bX2c8R7ASJZu!Sc=Cb4>F qI*u') ƐtcH~dentwwlC2y* idg uﳑb ) SJM^nBJU_0}P6ίe:N9@>1~H37LCHfR5Z4ADtcQg=le bTZ{ҝ2@}gКމӗem\߲#x厏.܉td8E5h䷱{usap_(#vQƏNg8q]/S39;ɂM"P 9(=4n/*#*^'rFᎍfbFskN}T U:稈X <Írv^JwUʙggI*F5pY9լp4F'S`zMضFg&2 ,Fǟ =s2xLIht02%gDGcMk&#J4a0JyuB"a#Wh>#._,p(68 m6p(mp"Ldyy _i־OCn=t6@ 1}*C;4NOGX)س;{G ^ 9Q%<7 GmYAmZ&܊^«*l"H^'a2KbODW6-Oip'bo` =,ê s-Eѣrg_>͆#gI N DkOtcЫwzѻK+0HuO!ǀ3-IDӝPgoܶn8rǩi{bwQ1(Š|0?)p9y2ňig9oܚRTk&_D{n*LͩdLᢢZWo*W\b]^psE8NM(>X-:uh݁&:OxӬEC|s$4G_עFʾXAE;Q^G$.)mˮ0Rd=G,u|o%q<h:r.Ij_ 6my)X I3gK~J4 n;S~1}%;L:DC q*j6M,u߭[E:`_ose~*ꋣi-o'데Xe` '?=]8PpVl NMn8xDvdDXno͊i5ۆmc>c$n߶ǯb04m@x_ŦH kS?8q-n@9KPk$~gH't)-ˠc>iTg0k3DwCEj@{נڼ{a te$lTKb@ X\ awS/ڣ2h߈{07O@aE\@LI -f/vX -`bBhT ؛fabt+\.B[FuP0 0R &G>E,"nwᷴ&/N9"*nŭD36| _]:g4-PQߊ w~|@hZrSn~#wvU7x N7~+_<&s8ƉB^FC7'7uBްJN!)Dt]\HY .'mX <7r#T 4+H1㯡ɗju\8U5Gz8LƎiM*g1)(Dޗ 4bt8{Ot'`=pRAUV,IJHŃMLaNl=) 5j2-ct&wbVpu{S^ƤiFxOsx{g7ɤh5ζ^'˯{Sy=Ū-Mm{g#KwVح^z`W05,VVѱtҲ^客=s8:bqʧtݾcjNz n^7OmYN++)BKl5%\]P{@ ^|)ۻG=D"UP(MkEyswz>~/$NiuijgsRuS|;O%UJ=RŐi>jW*r_k^Z[+( 7hW D7jFo`] ѭ!rykjx][#~>BrN;&A= kԚ鳺[,r ÞȪXd)6?ş? qZ|;M D(xz}vf8;işAro/ŏn" )Q|9a;6?0,a5 ]</갘8ry:l>?Nq3n@/0-n"Y3|$N>| %k^Gзdq[**[ GȰoab.j 8pXEِ8opÆYooYPN7,(ͧ@i>56?Wm4 EЙ&Ї "|;.dIjZ?,O Yf>MiSH緦nAV٣b6oWq^X¤bNo?1yG幂:}3B%vvuDFXXt9WgTl rd7("." H%4d& iD> ƊNS4=|~Rn#fg\6]$+3sR6r;0XFwp#{:n#ud6?}ԚGIB c.2;E"v]:*0@d"s/>y$ȐUs9Hi:nt#0B60/"0?LcI?E_DƾzƋ"!4^D}8xID@E_D2XAV"]t22RJ ђZw 0W j\m ae!t?AMj@2^6b: 4XSat/3ZR3 47ǹ ^5|W }UC&MUC jtCHcszi<_>JpDo q?,^THe6z|{ܿ~5S/"s:Ƣ̭a8KXЭ".ãʰ[OY}T" V |Xfq_DF S)r )܂óNm!ב\x@EuC/z::һd*:Ҍ^@{e!ׯ#ק~9V3Y,8$\Qɂ!v d4)ssMds2[VI$\4#go"AML=wy&Ƌc= o"_KbShj* Eװ:R+Fzie֫O7"O!܏'9Y$ʍ7"G8*j.&@n< # fw l͌4榙L{LL<Ȑf:1]_đyiɖ/㞂nYL*|9T8]cQ&*-_,<5ud *?Ei śI-*#64Ӄ<蓮VGn^Gy<`i MUOz ~C,XsQh31y.K°l3A'XGLAbK}@_׸Bcuyu~ifjH3dGB6&6a>'mv XeF05Z˿M̴yJnIsmxP<KM q d4m#fg6tYMa hb,%}>?ZJ[ܰsKCK8F5l'5.R`\e` y`6 O0ȵ4#%Q5{ ?+smqt^Khf8{r8W;-B%b̃0cTo|l Ů<6 QϺ2 lj&4yq4Ԃ嚥a Y`㒞!#=O2_ 1?R3&J6lU$?~n SB 4W7*Il; SEĨOfMb*˸rE,0YtPg6L}<ز ĨBK ٳxAeJ[Pav$(z Jjm 03Pl`g E7zsthъ_^$5+3Rq#ɀQK$FkAlqpYA*mZ@HSfE3ZT@t MF :TԲlf˖ %{(\mYĻ 3 "z qN@8<2T`m*%wͫA(ЍсDqX"*"-y_iVXiYU=RA!HI_- oEvSeha͗>*`+{ \5^co".gdž%n)C$t%\"48Ϫ1 R #ҸoeL1!Zvh0ad0iAūx/ ?[@h֞)ZUeڒDe-.NBBAJDeEY:}a[ŕ`*ڟҶS$>}ŠP։z6j@(di_m[Щ̚4Ô(&/"]iaT^ T0E)N'2mVƪJPL܏76`%M,^^+oKT;PZ'(^\sVUXtk,^[g|U/8RL\6*HdV5Bfbi-EFvcS|aW cBu_UVQJ+Xcؼ#`AFe;(EoجFzݴ%y#ylnJ,-ö^uѦ#4x dKt| BXlT4dHD 2j&Hdž0I7OzF'Y}^V|~L[e ]AgHrn PXGbx놟k˳-2LWI=dRP0(K\nc\ ݺo=Po}{(qx.5Y'gu2-5nrkʓ5%fTf~fקJ}ʰi+\T<}\qd $nyM5p|UUjf Z(#0v㝨\Y(cTN>N}ѡ2Xs:Opu# F[tcx&Աe4hlb |2nHe$7R4vdwr@7Y9# chrXoȏÊ LS3'mT۬DP mc7t$CMFbX xz"Of*;ĀQDMؾ*7UǮZgRޑ-X-E"n֮) /ngUƩE'}ts Iuxn"i3,w*0]TI5$KTxJ A0Yw] Cs!+&,TN;y3u;bYӺ (ٔHK7گLNtJ6g} B֝⪇+`rbHI7: DsEYϜr8474Vi̖*h)! A A洎б1*3JB&߯ ^A+Ai[`It3; 3! 2 o'W=;8/6#fj#^N¢uZ٫p\vPC` @B\q )V5%+z* ɠNtzd pDnRg+|aTցx(_E9Z`HAnI~$C^3Ap7"KtRgn+fTrZn~c:*aۖ\3^$zg峩7K ȳ`ćGrԫ!w"0Yc_. XBzD #ęèF Cɑ)ю)=23XɨI8Pv6Un}uXF<>6y %>#^LxYNG^Xzp7 c|rnʱ`2z F#8avusӱcнY+68'#p$IUyG2b{?.E x%~ZH_CpV,ȇqq!Rg+gT/ `ZaK(`IF;PL-MkN9X‹Pχ'UZԒ=j5i` 2c&)tlgC*eA,!\u1F'KPf r~çJ^4oK^7WڡP ,ah᯹(Pad:[%VIw^dtǟ$.Icg!ߊ^y=}dù:_6b??0Ii{9U౧qk,òqE[Rӱ^Ukb8Iex- Q e")zvzl lܲͲIrh?A )SFP o!=:J52{V(V`4F(@iT\"y^!(B Ay`Wz1Ja߇csRu FId(&IX!Ϳb+ @}ZtkfX-٨1+jquD}Ӄ} *(cAi0lS)Q\&4Ѥ+Z~-,U&^6hkxY)~AB۟1r/m$u`#cj=5>P1}[Y'q*qeiSÐIr0̈Cn txuLj۝EL~x@ll0I.,'8VBD81( W> f%F1\ h? Hկ QR{MX0DM#/NR/!¼eۣ& Y6i^H?7쬰(۷^dyρ2)ADŽ,T5w lN%C{XQ2K<'ȇ[T9W-Ge+2ӘiR_2Pºi[gp^V{X)᪃He`Ϯ-^_1G0ˮU.[UTiAS,&`7jD^ԠDMըDetC,hW1(xT$K'<5-IqqZ>Z=R.\UrP'ECmNv+5C? ʘ6[@#H7Fm,GH\w.|ODT ɩm3Ws܀b`$0yV ef!&5[_.*(floӆ7>Ll. ȌP-U .i44?Ҙ2tbq_cp*7*CTmR%u I{xǠu;d|Pi#S.@mF"ΙZ0/4Pe/b${ PMQ3dg )+7t~VI/MTުu^3\4qka;6|nYh fC^ egc -G+@Ȟ5{Af F5IJ&%ilYT;N#qhԃ"(z_D|8n/amQeBxaSؙWͨuL1\wi;Xj̮IJfg-XL U1!i*+]JP[!eR.z-I߭1/ yyP-wXh PBc\JweJy#]hf8B9wƂbN$sI=Oۻ칄N)qyyK̀4<ixoB(-]\68j*>v߃?{x[ҒԊ̒2Nx4W܂TԒx,L'nbx[ycf0LvcxʼyC3KjiJd;e%S7*o,`Nrw]73iIņ*pZƹ[x< ZWLYN%QO$b,ovʉV~ʳ!>"|EKd/>P0~W+~W?UCӇˑūs+'W6چm#Js0m=ijSmVov^]| H.?>a<fb&j:Fnv\Ů^ʝȝJͥBP+R.d6O\H\~rkF˹X:dg2̸H&(KXEY>0Y@0KfކV7Qcu>Ō$hJ;Qm뷾xQȨ]l8eqɀ-_@Z+灞3[]_sNtj/H^he^+ zo4u0޵:ʲķܟ C}@"INv}xr0C4 CHHkd$ J!Fg.@9{JhPyt;IV@I(3:^סu+E& Rb/N+W36txqU82T05b_G[Ms28tŜ_WE]\S ' njcYu- ICSP}(ySɳX>;w¤%)Eo#a;}Uۢ+zKuU @2iāEX GMX6J@YQ4}ÿ~w=0ߥgyI ҉,r bytfhf+qy^IhdOP5vl9#a=c--nuJt@.VpZ ^[x; ;:i*ܒS^9WI\=tna+A'aUxnUFRd4?Du] Yo(4RIMd*++٭"ܹ\ɂzy2ګmf* *Kc;d(giisZtN mV¹:>i|iσ1b '%n00EPj 9:S#g& .<$֚ I e۹6o2n%9󏃟䮼lUޮ{Ǯb[xT=oA  B(\ aQ$HC0뻱bkvl4$ ~-=w6 {o쯕W!XMV!X]=^ ͇+?`:Ӣga+Ap])ZXol٧S[ZY01Wh@P,ܠ$" MtjS;tQACA e&s)A=WkƩ1T &U׿DP[‚q27;vDhc/6&q-RQ/N%ڥ`JD(3. ySԄl g{B2LxC߁$u)1KL=-z1L\G@inYg\[IS=Mq9#-NCO8Hw,nC\ :UGX"lSC뙄,l8nc>#99}lp,è0j7˳WˏthsFR񴿹KH-ZjhfՕ#]^H͓۹sC\Ny;Zvs{&oFy +:`m} wOJΉyq Zc_zP7ꝾH}y8x_ͱgVk4-wbŢ#625xxM#:c{<:ءpqVڮe5-JmNEo C u6/<]Z]  uxjthUz L˞!I xVMo#E.RS > 9fWDZhQꙩ[vzxಲā?;8"T?,C$իWojϡadp}Q;Q{tD26_]E43~@ JÒW;jA'ڈFQAF0Q2JJT|1sriHNM# @Y3 ]?{ Gc(g^W̃+4pU@i7І8 RS"^G(BfYi#D+t** uq#97p wdF:tN Ck- Sb% j:lF7!~J+Fac[ۮ'$zT SdnL̜:K&p}69/wk:\Vc(ZgݟA8/z˨bad|yIU3/Y1 eV<4} f>c3D{y0=NqHkchxқr1&y');! <[.WQ }%=bF9j9䇷_(<Ն+;VWyZ.dʯk irmKZ4Auӂnq>Gjm}T,sOq*';ͭb$[i2$bxjhfo>m8DB$x;&+;ARH!8$57)Hhv.='ɂl᎞!ޞ>>6?dOe;kxRMkQ%(~+CVIЩ Bƅ(b% N}Tn CtpI&ƶWsqιw99c'xFSý?W8^?q$BA(tՏ&n&q};_UWH"SC[7ْWζs+k|gnAgVgk BGBWSh<p3,!`!"ŊB+HͽqZ[LEȄrʌ22B{t=;3CVU\r 0H|2.u]"_ҹV7\4A(K1iʲd`l@*4rGjZEVDA6X\zd]R}6\꒱챦/6c=sR_&~mH\}zñHtA"IN-%6)F_.=PFxixBpjAIjnRjF?y8=C=}|& h('f(dg$&*&d&+gqg7K"XxXRH}"wa  6mllðPR +Uۻ'K%M3C7*O^*dV6iFu3B؉߿?Z{lh-Y( , .D\Rf:AS$f %'dBs>RVEH( 'sEҧ@Ft>?y?P [oD$'a6 z+"%P OZ-ѵ:'xY'!d"C ʔp=dpF 2 lFhA*aĉ%w׵:o|5{d@z`ACIϰh8QMH6a<_g BUR02h+萋TpYI; H{`,Mb~Lp|3[$9>٣Ѹ{g6ƟA$j_)rb2=\Ro*ecD?lV6,A$ρ|'WF~%=qҋfE\u:Ġ(q:)2ָ=?u;p&fFRH~+?QJtL 5-JgƧ}Wz5W灣"t*N%ީ}k_#k{8$h)@9r+)Q{hlqEQo߅FCťU썻Vx% d_eqNd558ׯk)>T ZI$OA:Lc}*qtkĜc'c> P}! vV2'] Ξ] 2g2K2L]`.p S\<촵CDWT@/l):\8Ky 9ה3 cUik!=?3wFED}.Z]@;| TGkl!Br(Bǖ1m;amh 2EȼAiNO+H$6ɨk hwu%( *ƀ ~tZܯcp8&E*'rnK@^oi$mGH098DdFд9ÌS?+cl`{gzu}`KgzajuOp1aCpӗS&o+Z4'qg 3/@`}*f(v{՘\ 6(~% wyADG@c B4r :ɓ:,={e#V9}H1I):;XOEah"@!Wu1r#MGS%-cp;8;E ל[8EVs o꬜wDDZX,Ң{8 sL7WC9x[wхokSYC j5 P]Raюh>5*75'۳d}7mo׀  UUEe_ etjL.K{yK^e8,ίv7!9;ƽa֠nhVRt#%:O2suϸǣ~gFhңK:) n]7y CackV)8.Skq#P*j*7NW*Ve]& wMA/#ܫf]둎 P>=W<2]5dB 8#s~ {9mm-kNWmft{(6kaŏS2Vfڇ[CPn@ }R)յ!ehghcG֋yzƈ-@ԑ \-3+o>6g _AZ.jօ6}U}gܘr)/dFicLݚ: {בam(n@z؆6~`6R$ߑ1!f<`{2U0a!ޱGWɺ)ڨۿڈvGl7A{߼uԬm lEWk"h6dT E) Y :Ͷ~Ա;g6ShFI+f)Ћf-כ2AųMY8̂3plG7w~=Ur JH-,MaFt^uL[; K3 M7pdn2O"#A2}we[@+tA<6}F&4yhALaQI$Ɛ#([!EҫX$٢5[qUVk^7YbJ?YET7G[EGGr{3~P(62K²^%D9WW3Qר3UBP?תv 2Z9Kq^ w ȶQ>LIΦߺ]bk]q`yz/gSՠ7f/@ec0i(% Uu(vh~?0GvX3Wpw Ђonhw,K64f~^'/_zpWq:6>]PLL^Of]Q*ۧP-7]iCmTrN*(5Ap{J5%ܻүCdG 7 ߢ滝شϖmrAEK~q4DRME}vWė9^ҡ9xJ@Ѭ+blSI fEADD܆@: $B >A!G|' bg5\fws_&9VpG ?Î$5(]ʋIď0mnW$Q-sڨ`"~&wPOC>:XswX(hKyɋ5U0eUUdƣ;kn{YNxsp)EM&8ٞV~Cpo %0_Ⱦ>E3 f%o7PQ'5R95FiY$Omߎ! IZ_s(Z]}>8x}Sr0}b10}* TfBA#=1#8ޕsdjgfNewtBH.&c$ ,3ڨ7J4in7u<&I5ht\-p>15Ddۃ&KMHz,]^]^QbH $]x_[\|6T%3R@^p#W-.;~ikNw2YZ\LgIWw*^M-}:{l3!'j\ꑿuxVmoFTcH"IlSTExuf]C)k(yygfw|j74gKA; pIlƹ ]A$Pny\o<2tw}.K+0iEbFGrrp!/av wfFȥ y%,B<Ďa{ &)z/ޭ3x> ?uz9B,Xσ4'vșTp0:4dӪG,p[߬ * ^om;LNWfm L)_gl)\D>^SO 3?6{>3𻐠T"@9tc5)\9 \/hUo,~ZG:`}d]ks \_ku jܱj(jg<4U"A$OdͽU0TdMf1)eCj g'ޒ?j7Qe5X z?NRJv>9{YL/>aOgskK3N KOÜ#oW@{;b~D7d_̇| T-0$Mh^VmkUh\Y>w9"/ttՋ}s'k+V:;ڤTxo~hpve|lPQ7/B)xVKr6@ߒGrME}|#Aٖ3h!v<׵oҚTu~[t!YBg-bqy/V9:äȚ5&/.L㘼Xݎ*Q)}\4<߉5Eٸ$HMGA@rWԐ% TӨ;Ͱ#PI U w6dCt5!@b|[8{–KRI.jȲH͵]vN`ǎtcaYi en~o^Zء-peWš=_\ZzI$v}EGkjĕ;gIֶbHgM_zvEcz U5`B,c+nX&G̲4ZQ>lw4lVOU82 ex<lK:4ݱnY\9`z"oI= Dw&CpI0|iw/,ɣP|M˺Cqp/<)RR{<0,$`mLFx26E,g_|xKbE5@+Vxv,ہ9h&Jj 10\?؏E4zEڝԏ3`)"[sc)'>OG'?bM ^LHӐ+4Ja UQc`‡`+r5❪8j'Mы+M0K&E:-i6p+]Q?UFZS}ȭh/ ۾N#R\)xf ;YTIsltӠ,">/`'I@lb'=::8BY%YV vRjI',(G@^߆h6aDKu l eVou*;ĸha+B0Ɩ}>LٚpODf$5; ;-ݤXE00aNj'"KԌ q RlЁGtkԓzO*Z|i,agI6>ɼ';;Br/œ&xQ=:Ol drx9ԝubʐt9;'L'Tݧ]>lIۿg=jCYVx&2i=xVbŞ5cC55 71߃GyAi!q|x%PdC+TfBd~^BDf") \1lr*T^l7x%|PxC)u,>$ulNx%|^xYY&lx;/k:+I} m҈!8Hoq%o`=j{X) .01ݙݟL&sw2Z`T%˂J hNXěrc9#h="]~nDI^+`+ yӓ #瑂F*V 8؀XL~{cϴ~C<"O$^E&S;{?˂ENgZNED1cy" L_!.jpi\0aha<ƒ5N\2;^ eHdˤQx-60xR0,o,zxcH8QzD`/lt q̣? 6+k}ƮcVa634K"Ss&t$l H$sdmdlYo})p@]3Ɔat杧P[(<Ⱥ)rh;]&'?!%/ʱ䠝:.鶍,(,.oYd({gcqzH{G:l_U*P?,OX|)P%IJ2y'+ Kb63?Z`WSˀez99-QC.us,͌ZUNM\ .o,zu ܃m]GWF߱[<J%<Ԭn9-T8ig[ڧj ƶ% M v/+e,Ild|4B]9{r/ \5PXQ;0kj\k:6wG.|^5/Y񅨘гS]~N[k43W 79e_tǎ4׌2 OЌb25jA_tr0d;8YWb[;vW+FgqRH+'6"svMmVm={aR%hnX}{j~F8.Τ`Yx<҆taluӇt}*W"qP͈ܥXs9aH0 ߎ~%4q]aK]]hc R RT"kZ`7Ш<~N=U`Fo D7'YC$)who(uHM U't^ZUt ]$Y ˥wv > [7ֽuʫ2S*ut*ޚJpWbK:;Gp"baL-dz #Ȫbl:plGKt^(ke L[e ^g"S[hO- y xwr2 ,MH(Tb0^+/aY6ek^B% RŬb]No/of/g"kB A;&b[Cvr̬uB4j_̗NVm_DZ75 3S(fj-6ʪ&3#)S!)Mؕ )g(g*m˨2(G ƒ 8C"XI'}dKSyq=Φ7 1ek3P\B#3i0| QKi pC{?U9ҨoXHqOZSM7Jުݷ\i /X ϼ[0]M)Mu-2(hB5Cf @$yݗB$>ߜ\-(/7ٿ>GI^V^5jBӓR{q5/̕] aO \V8^ܺ:_02lE“LL Y*0ӢIfmU.8T-SleFٕB^vdkiXlSpƽQ1z_AZAC[Ei#7感^+zBJ ^!)h,hoҨ[Y40@0S;Dx RvV1 Z`6cV;15Ʉ!)sOOXLNOp3tJ9'Zls}T:antABIGQ.cP*^24WŇ:+ /D\z./]2ۥe^G{۽ȮͨaH)jw2Mlp#AB*sݓ-0?9IH^t͞GAO-;cWuor5 γ8m3aKz%jtFl8[ETiUfD@۸}Q%㓿w5"qnϳu=,G{1v+iF'^q.'^fYX47OOvIQrI&0jnTVRr Ffn,8 RwxvQXbFȍ5Nr5eڈ7ˎ/3` >*i6vH.ѷˮXXQ1NUi(a0+OPa +D ڕ}ui>~A Tz(Nl0@93mi d?A5eCDP R q6$wxxLWF%Cԃaw*{%!N|?54۲Ê%POco=?e@)fQl2?lV ffP̛Rj¬'8yO˼9uo4RLF~tq խh?<)"ű3L5H]&WZOinuw]`~2EE:9e-!rZtI#J[rp(jd Mj2&~C d۸ɋJ8ŁGG.dJK (AˆQ)2vͪ5ΊύIM'崨ԃds^vrf wR=}Nn ߉WBm0 5ٖ#N HΏF%j\dvI~Mj0y,szy=2lC؏I[Qa["oow3La`hΈ́ɘ5n}B.]o{6C}ƓzmѷԟDf~5@oPdh'(K tX}ݣ*WHM_[M`X*pP$ԑ#=oG. xF^|Zz'}Ӂ,#JB9S]㡍iS}Z|4Fc.KTaiLnt7dkX {Fc$ۃ,}> C> LnA,%R]͛AP/]$f\҂n P#b`GvhY6?d0Ԣt"=)MoV1C2sA#31ͯ/E -WD^-)To}}|Y`@?CsZ % ݹ@)~>gVڎOiwY>ekT9"I%(fHΜ94,Qʕ>Fe;+}TFڂVP_Hcǜ<٠q‚x!#@5' -#o;Q{";ScmX$Q<^=4w O`AF|/L{fH!Tt_z"8}Yqo]Z:|>bξdsȗ҉W{̙G n\!~pxN6i5w@^7aw ?G0z oG  jmkxe¬ͽLg%bxeνJAR%we;B|e2s!;IVtVc[.Zڜ9{yzGuoܢ^\({XLM[@sm'`ChZדfR+󨳧*AH軖V3ëRr1DPUFs_Bt/āh~ =~ЗSxXkoܸ P{1פ]4IӮE(EP5bLZ><ֿ﹗Fv-րs}PL^.[m8m!):O& 9@ױ<^ q0QvͣvIqINwdjTQ*yʦcm'9,ۧ>OS -t>IvR-ZYQ6ZVOxE)da-T$:P*YZ6[)䖏CVL-{ 7RhtɌZtJ$[-:se>cי{ee#8fԍ`9-*8 M`x%\9DFP^ VEPD|Q+F50- "f8|j ^qk3ʁi?δrNZv&@>yA@Hgʚ8k}8L>7HÏʚԯnv­#)Ldjd ~4<1+ U {L?zbt4v0 %1Xl[UŐ .J$WBx JpgԃAVrdxL'@-?;q OZD:.(ȣ<O <AHxLe0'%SV9ZTC#7 3"}9)c,U>>Ia~^e ڀ:yE3ufk|;m1'"{d)Wrpw*( iʩ"~{OG9 Dș  LQ!x)7(0|S0j`=M>Eio,No̎[%vPX! v %3os36?ּSopBz$KYϸ‘,[T+H)*ޗVeWEۈis6ajq y y;VT>?|bj##E^T(&G{~_i~zEŠ7'"U\]/yo.Ht:)I;v'V+U@V>;M<h溰8܆H7,%?QRV9k Wڦ'˝H93@WgNA)L

vE%; f$E tC+vT⺻({;F.ɰ&"17n gZ{],g Oht&vq99k9 }1#:\a-zq.n;󭗥pNRAƱ0^Gz@O'>k?qw Er}FK~tNzzi2hпdvti"ǽ5j((v'{ou%ؼ*Ӯ8;Up' {=0ݓȕG 7ov<%xؤ,_P\YXZQfSr xXMWw+YQ%jke~ĕS4 !n!)9>DU*rgݯ|\n"RUnu )WZWycӪ_p켜>?Qqe}w6)QNQ'kU %$WokK߶~Kjc}; ƙƉ%r5^P@m 2Ջ>``4Mokv晴MLذAw}%U# y3MlN~*͔U#؀Lj/&/)U’V5 QF";SӔFB1{3 “8DB }OKڸZQhGE90Y8LX` ^LK\ML^0=f f`*;J2`pfeeX8$t @h;}qNTH04miw 'SaH &v謂2`D3ImM{/g ifaw铺~]ZgU֣iޮ,h+ǯxnjYh6_e)r99ʇźu"R}dީ/8B.!N1f!縦e>'lIGNɫ`W搱=*GB)Q!җHdjׂÈ"LHGC$wEJ4Y> 8]POId}%4DTy'3Š-CEm[6Įq Xٰe3,~SGݓQz Ңgrŵwr"9>__*OiXpm={K&6h9O>I Qv %cInfP:6 -|3 ۲PݣErG=ds**܍/*I no=sjvvE6vIT 7EN;ō z/Km1Sx .Fd#3}+ R^ b_jHL@1A@T3.nZ(P,_y'zx@um#۸R JHqmKl 5@й1 $j"x{zx샔0zrhie$|`d6UHRr+n iA-{7%>L~z?Mi={xQoyzc{oLN|ed:zQmn"\cL6}d:2]5-Sb)wts!˱4N,Hxn wk&Sqi=.& PWy4͍'= tTO,0%b٦zj\evc4{u_վ%a4[I*^dLyX_chm#\ˏޣɔ'-ȠӇb7+x}|.bRK0XEo kN%8E]3h=8NpdwFr$U:4J洬;ĺ╦Lu>ʇ[-ϗFeܦ4`yRnR|ng-Uyk-H9F07yNB/}Mtr˵m?Ra)@ m9ƦFHD6E⊼+RFx_p3^1+p+U`9rq<ϗx*Bl֠yBu2 E3 sT2eV|XuQy0qO2Eod<=bXej0tAfvT"uSE]yT6lT%\ (]{( rYWـ9*;[,c2`Ήe|m3LgـEw֬J]"8=4r}ԜJ)u%oy¤eG)jŽltb'%-ԉtxO_`~3(w=P [\ÛXzo[9m߾~_nnwxM1N0E-4\a=מG 3!PQr=p(IDA\~5+}ŒOX*PQmT|#o!T*h#Fa(e1)x#`ZBER=KS S%{>/mdVֹ\/{'7?D6|r_lGx>Ked,$x}J>EP7//1h rX'o?qΉH(~um8LfQ)2?/??겮l}ԫl./;_hW79_VCÇTb=VmP[YVU?X4mUcq$4}qgcmќUS%뾦Iz[Vub ;E%G۪ Ćn$X5aX M9hcu<2$~cgtmwXUukp>TP/ bv]hXUͰƆmCOk3Xԋc:+`)0mj6= Ho׏u۷Pm߮/5M[c_^oE}ٖâ;`VRF(u IWڪr~i\%At6*ğGCW|l7mt펷;46bLg}ڿz?T 'j69z`v=e@ʁ9e#tSaa+nD`>3xxf$_9u>ۛ ǖx>@ʔHli GqNb&c붍$QxS-a,?/6Ǎ[2 y JU,~Qc̮5w\k·{KƤ(j5we&K_/'[Q*ؔZe' +KZѾwu&ezir=T i$8Z0tl6ӟ@dZ C+AKkeq'qc-K@jsI5b{c4bZu`tjn^?ms 9Oɞc/A/Nm4TfjM?Y z`W[b7&K~rp@(6-Vv.jg8#;9MQ9cz߾zA=:((֦.:Eغò1yoǍ_WcgaNl"pͺhC _(AU깮KyI*h\Wo"6-Q`\ Kj27i~ln BV r9|$+0٬ סAgN t6z 'p[ Cs5paI *rpCvZ S+.cf"ۓ^df+6<޿2[ zkhJYAh_ @huJvW TgEv(M}g$=7)[GOww/?5yaN;5$ػzBn8RL!Y)'|M|{ DpnBՄ *3'a>%ڣ01/p4mI7:Ney]ocO'PмJyck{eڢ= ª{z-)$STUC;$ɥեRI8l\L?HC)0w*q&IZ&fZ[ߗv~gռ~tNJ.A0fL#wZl/۽. cH5%>VVEӋE+PnܬII>JC寑FA] SB` Yȵ}m}F輽llU\8i ?xgxt܍j1dcvA((x$l[Kblh{vkdU6ή\9ƶ )3i7qt-w\Zя0" FWZ ]!KNrVێ "_֌- R TeVewfQk`&w1*ßLQO?bw쉟/ڢ=YuiVҳm7ވ2*Wiꛘ&Z wu1R?@Y.rwUݬ{xי w=\N=&f#X<8`m>>D1[ 3 vP@wW޹F_q.~.kImv{ uv, bM@]8pivkb;~&­5ej6FNx>+a`LLG_ %dmOrN m,C"}v.9!:HC؝w2)uNAzS^_尸QkV#p~^qL;X2l0di\N l=۝l'_m;@,2sƼD7;G2VܑdzO".~}i,VnsPA2/,=ݔ<^g _yY4MD( S@q`@9[X)õ4▊eslçkbH{}tᒔo& p$e  3ٗwNU2b׭z?$ ~Ή!a l, b7N׶Izv#N*SL"È~]S:5!~yq8lΌj(?UJ42Qr2r3zvFK֏;EDWڰ=_N736d/ZrHXϛ[ÿ ǃ[ $N&Q\\jPG-H.q-{]xHxXU8AC0YmR+."!tvP 67>`r3c7+8fhmOd[nQr}gMpOll[AHF PbW]J0'%leq+QB¦p -kw%3hJH@ .o!zcң@`@A!]>t -"L%Zup vË& +No+ u0rBlU` zOfXc>a9A͸6WiiNƥOAGh W7w |:)xݝ~Pʠ?#4P{ T1gUqQ3ˠB@l:/ۿyMW>gڼ_a׊Qn܂ڌHѮ!vn/ ]D,sIO ^n.}K*yqڿʩCr} H?"DP}bh+AH'7ʊH=>iE[ݸ,FQ??^HKžC9U^/NiQ"\Hg΢e$@lKwϢcrzÿ88䡼ޝl) z.oeaO_=Rgn=J3陉8o/okړ*C6"U0N9d&J` o."'iqfp%X1hs3)DP w9AK B*Orھ 9uzPa#{JayӳV |/͓; Aހ };0h̳7˝l[yRai7m Kݵ=p۝Ljfrnd9+Q@gvcp1LJJ_֜u۱J`+B<)Za ]5n'~p_JڠB#vmB^uhfh-Hd` r Qտ+l JS,rsfVuБL'h[U'R I7Ԩ󁥛K PҭuwI WA-d4"ab8,˫&薮lѰo;NpWDqTcKKP'O$q{\>Et_t%I]na5Xz@ ΰ1Db%`qHuCP+$]f CH$BRz~\-~ Rp#Ed?Mur#GRzvgs0^gZ27w)R'xxNɱjg}#p)IovHEi8o.ڃVfsB,l+uS{,/ƣd"OJ$M|\Ɛ-כgyR0=Z1MKxcrK dm/, tŬۜ@5ѭwLLKWPkK^J+ 9_(`).$sŧK?&Ё-n\K^Osvd﬽*5)'ԎĦ);~TE65"Q8|7}5/w]" 鮅isR6 ߷IqAXC".+ ]QOk>l~8𙙴YX2wS<>:tY&#$|&ˊI@:#:yT*GNragw{읂^l%9y9eeįwC][\W{lUFQC#zFwo=UbP* fF:\y̠F-(]U4;ɟ]qtHd  ETI:!5388JV%ww׋勳*iDS**- mvi- T7 UD4YDx@xNaΣ2 @tf^̔n\>jjO@>D]IiK˭`T/H3x6E=?.>]+s.&7DAwjAA z{tLQ 嶖:]t/$xS h7$sa"fG)\B$wt0zX`qހJ:fF#S}WZe5#`UҪ/7xo|` =8.>eo"Euv)CXq: il(shD}ʒr|2e\gGb>ii̳Ssq~7ekdҸΎ$Ju`[ז_' hfܵ)?:;ַqHqQP5Vy*͓'{R/zZ8.54̣SڱEQrN ʇ0T0X~ru^OJQ9Yc,F2ju]ręyd|&EĠ܃sO]*c)Y3_gGB9T%7L+Y٭uv$)/%AgfmȊX8+3T4uT3ILs1PPCh>vQE~NzQ,9,U1 i-&2,rz4Z3E |wl撡ݠpDaI<2 l·ė zZ»o:GҌ{ܱ}M9^:'IE`u FjPTec7{u";'ju˽O&˾ gY 1+uM ޿GWLz~\-Noc9gHFO4z<==5..l[ICoT(/]xe@SqKqE'- NRD‡͞NlDYv,vR<2XϛPAry1AN3.I3:H3%=d/ q竰9#nWŪt'|ORfrXٞ-77>rGWk;^m.[y{ xG e$ž]7}Agˊz3ı^M%?͗ =(}J 'uA?3"E3 J!h9&׳ Er(]aB}P&ּ8E7=:\ ޵=gBṯsGm ^=Aʕ/4ÕeĈ?εvoooa)/+Nϲ|\̠fYF֬F5yrZP|9|iե8|=d}B^kn㋒ia̡Y| W)}ʹVZ,,˳VC}ٻWFLց`DbO+q+$yH5_F1CVӿ;l!_뤳XTJQx4aِڻ9j{%} xtIF891'GAT\@HDt"iԊ̒2KJ]Ҝ!񹩹9ɕy):&S]5xI^891'GATD@(\PBht^Vo,i+*ӒD$kI&n^M6LQ1)*7I6SkJhI9"PZTSC+Ull.OsHNH5p6I4&Nq;Mť<&3B\pȝQ2rfa Lə&%Tzfټ=K'5Ӣ)'Q>Tqe) eyMƷYe蛭llll6969AS9 9.h\[K(WhnwDZVgЖzgy*y ynb91_=8&e #t/B /KX\tΊ[OW/ B|Q`Y$st,],ӵXb?)+T-0O uE:/]d?8| KeT%ءXa8b?%JQZL]`R/-شҲ(,Q8PpL\TBcF(nUHdU4WF9W+Q*±*wUtU+Y]89G=,Ys|BbiM5 2JX2zUSamD: beWWl -3hGfGG㡧|o6^q5zYq͏}:TM[й3%F+2C!C&!q!a7q $E4l^K$QxM$Q-kK9#Kivw|E"IJD4i&iEz~ zta0j2l4~dZ|lTY!vYTY:;ǂ7X4ȭhYCGeY,̛̎11 #pZ:k qj6l쐷qm$w]mx[4`}K7ZlD7qFj}3Ҷ! 7$6LlU#ƼB!̄xtƹ&-f0ަ6 6H4m2ONƎ&:TllsE4ӏ ; bSǢAf6'Lns(n3=?qw{]~.W$fΎ;œ}_`D0vXyXa1ӏ?#%|~$N} x{LAEArnp8v("r PTͦ.]O̲h;fi\]Eu.%ծ[W]O>'O}<؟=93=7JrU0kXxuE\#'T~$@d3KL-fUF[8Hpp)Tʖ]jreEBbFMLВ,%50ɤfq6B</$lRbrN ev"- qoAIh -i:K 4 'x{F܊bWh^  [Wxu+M\&L~+LX\yn gdx#ԓl=ᡞdOCc7sn<$.K%\o 1ek Κ kz9VZh{>ȼg•9r4xcʜεkq:+<<^,Oe<|Ŀ>ȋ n  {Xȷx_c6 ,Z ^-~ΦB} x#e^HbF!z6\&XF/sXaX<m%&JxR"ݤqJpkĪR0 %lvGe:C oyXBcB歊M|R!QT饷RJR٪t7W`m9V\:nrC&aVASSgrpt\w|.j[g-wKjLPioՆSH'!kgYb^fyg^'#>>_#$8wKbu(%ŀPǁҪJf ȔVR&]8/<"8 Ӳr=Jb^O%Q#hv:i 5W0LV=@e]7T.AVCRi o-Rχa K * >he>V~FqK?Gd*44XhHm1BOUJ5\o?M 4mq m"ujn58Vmͼ-ۚ(Fn olщDXl1Ifߎf lsIFkVtaw5cEviT੨=m:"if={thcDi{uZj\^>t-pNݝ~^rS+H]nm^u^c2S=*z,&szNn^J|맬p]~7 x04T>=h38 C4uH{C.9?LAO-H9q0oc`#"wGjQ *uINᨒhvv "ůhϢ*XXqqF1D9TġBݣ=]_\q!)u8>!&D?N>"o7;Ge{LguI?I&4!vyɱ)dע7;qW?]Ct-ErL8!"D'df$3*(^?kVba̓BOblG@Q `xq_FĜ2S=Cs=###]]Ӎ2R.剙%e:&&ͶR񹩹9ɕy):&dͱ{D2GxoFyĜ2S=C=ݢds##C] ]Mn_sQxuTђ |O٪4qB.(`{IgvO8 >ώ!EIuG!~GA3P>_OP'4~A⡕^SBݥ=UĆ#>Ѽ u,;p^=])3/2(5 .x[̵k2nqfnAQjr~nAiI*px}J0EWJf5TeUPY 8pc FI'p^H L>E!ᒴdIu:}D"m}]FYBdo_ to Hacyo+:b軡}p@7u<ƻb s S'h fhX0}=E^/xMD9Nq&2@e3EG5E3,.YTrz.-粮||ARӊ8x8a6e;qfbr )u6{5r3N6Np>GJwu8 oJ:0=MaJhkn^.9 z c}pWpx<4P@HgD#J6[W.p $x%9:d0DPeߢ{1a^2%Ǩ @pB[%O-\|%1XХW%C_/OZPk*~^WwZvD6~/ ^CNk+M]~S(ʜtп.D[)pLrŸ*ͦ𣏕 ECDߖnHx[εkd6f_X#Iax[ukC?3[iAJbI[R2l=x[ukf҂Ēɷ673/em+ȹxVnF}b HbT6i8Rǵ $(EۗdEȭ]b/{vv<{93sNkF,n;䆅e0`kG/ϨvJrѴu@%(/Z\7^rI˚"A[L(C9FWɞh- ke`Hl:j`;V7 .G#}k;dJiWʉu]JAeɍ[ݧV\15WYWebk^:啥%j&;]m )XYY6!=*  WȏZQ6E)m(D*r.&RZ$Oo:҄p JÎ-V 3F)jMy6G*SmM|ci9jbk HF,9I57: NtfMKBbFμ ًEyٔ6W.t)5.Q3D96 udW 1yt~B)[p $o]b=vZ*ҋ*D2[AAv~~CW ,_>99R؞.R:G&1,E V(T q1A%5C u ]םaV/C{@dGՈ0}`?vɛNB !ܐ)"hPAS-.bkP\ `GC:e]տRVֲI/2!;܉|;CQ"zmEA?;>_=ME#ӡ `V4h82KYK{@ڣE| fAIT=~$o-9YYvmVC8͝0!Y pȫ n_f6yʊ#J[ߢI]j鳰7'Zc.>^aoPӋX;sn64jX ~lZUUpd':g)T|mmʋ 𻨫bҩtg~Eݳ(LLnx9Fr"¥FxA," "gD+`/dmzx[)J|C 7cn]"sxVmoH~(NmT9NsBvP0n/Iꚥsn/fvLt<3ϼ.'''' LiU[H"7։eqR0>RP"D ؈RRSZE)0 \!a%2#N̨]PTT*&J97Gn0ADB-$&T-f45@oDm(f@!*dVm3aAV4;@M%Lndz|%w QkkZb34L$)CC0[Dxa&w(N?'?&x2`U蓴yp>0B X5#jElEcB/P к,kGȥ[꣡d]`?7, WՕb'd.'SvX7a8{Uw'p0|%IutJLyQ)D6*%iAӯNvB9ey~4h 7i;otv,y Zp4eU_(I<・Na~%^7 Ia:IiAML! `4 8n8%h`د T]UBjPR\0)·ާ sj[ 6Y:p4v >t4+\ՃGK d Yʹ72vLF-0ꇃ_-޲D Wu:jo}M=qp喅`]Ge,ک(ýJD5'$\w*[jc֢%.-$a5RrJJŭ3k؜uom>^\`5zIC%oIvE$.[l#]eYwe4jq7Qo/vJ=M ;)|;=?#U(Δ?Ҝ;vwʍ,gF`]᠆Kg;nEfF 7.#{ux+o+"Tށޔo{Z09ToP#Z!Q3[$$ժ3Lj-V.%^s櫣g] L|44~ގo6ۯ3@C~/9@ZN p{U{67$fP50sҡlvq==o፨cR66x̆dzlWPqx{-&aL"Ey9)I%ś @xL*NMN-KJ,J-,NNM)-r RPyz\,!x]O0FhFj.sY arMSuaRPUߜs'|Ŭ⫋AwAJиͷݬ\:~;[T.h"t,n˥EUPn٤ ŗiP͊h saQ+*e,6V;fׄtwŷ zqHQ'xI:-̧"wӧ߉k<}O j˺ia;YF$L%_(ZtߑC+r?g$ߠ xreM̼ҔTĜb %.. gxW7Ģd3͍=oxUoHs&*\9$AZ^bv}k(j߬ R^u|@̛@`)dd&WT, r,Ma4jXF G!W`-*z*iJ,x QΔfV(لZ)և&8&J_eW(;$DGW3z5"8-x ;g4FX-Ea"Sr Xk* jClW`P-J,qL( 33`]Qwx{^p[ǫx!@2b0os!7c`z0: GsНLrIQK$RAD3iwjI &tCy@tЛ &ㇰM Z&RS^}N"F Sņ14S;ATPRɋ bʞ!WElJMWAZB `lݟ 6!yGץ;ˍYku 탅aoAX׽K2f-4ʺxVo8 hNҪjH@?IIjbGVL PʶCLmeCWLz܇ <'h/{6ռ9`& D <(#x -TNZ0F;fk+7^Im4e`&?3&Y.7]0fzh.mX<&wj1O-aI4,QlrP,6BIh5hIg`-\F1[ |s*'@f+*ow04d7cp`䌧άa4'7zC|Awl-ʠȇ-8~2JdࡕbYш)T *Z|i6eQ Qa*"@W:\~ElBZJiW[Qc}͕(nYF\F;"B",.ӏ!FE uR-!+JR\ V=q$ iL$]w6NOv-v/0_;9C_Ф~w?wqr 2fJyJ7YX`]'n=E"( EJVPTOhWsw%ymݯI/< zk#u5[nw1۱4~D{S{(s5[}K 7#/ZuP'!"ͯ6f4{hx\*6}H(7'S3O+<x&;z%'- ; N:tᘘ- ѢRqa} -0ۚ6Q{4a,҈G]gN-\ijY؟+4w@_;8Uʼn0>Պ _}afW_k>`v)z)p "fn~6f/e`_5w&zJFp%L!/WǏA Aay$~չCg1YDt>2TT, v73ew9h,K+x%qFfC6_nbrQBIBJjZfdsv{v7 ?G_WM]b8AgQjIiQBqeqrbNN|Qjq~NYj|^bnQws v w ri Y;) AEdJs̒ԢĒTflNaFwxTMo8=[b{]WJ{Y nAp(r*hҤl8!EN2g͛7Lpe JB H^&xb~N˽(A6?,lqe){ E+ZbRk:YG rP "㏅sExXm"*UeWOΌP[:vl,Noq# ہA9QO򜌨qPxֵA%5VЖ rN0ߖLIe("R B 14EqųtJ 渾 dD{-2<<3yg ҙQW7xʄgԨ vl.دmQw@]\ (_{Ɔp> j<ڭ^Lmnu[jOMlNT($v$7{& 'Zf[1z!)~x/.S;xPbZӆ-:Tj"YΘ7.RT%OEoig$s\պ: l=ho4}ïeZۓ [3yzd- x*p-d{4ԒҢ<Ĝd C̪T͌" e O=x*ľ AZ^JjBOkPORfbJLcfneť-ixT]o8}.⪉iBvBAKSd:v9`%fmsG=s ^g I" RUAP\ f"ebeհ8gxe(-3&^B%KHESbP`HRLY08!y 9y8gG ErR~r XBϠܘb8\JT!o%ڒc/gGp7"t}׉ܫQܺ2:a7A0|=F ݐ)ֹ[q;֭BoaG b] /T2Lރ,tYRЌSa0`#Z%et 1 mG$EiCua횑x(v|m&![3(n!vIᰮ6p i./:Vp!i7>f@RQَ>eu&.$`EW؍mQ^8߁"ëm1Uz:Kax Q+fvqJ8%??9P9Mlbc&6Ax_k0şOe{hl"c|X(m mJrY?"Lp$!uKÓD<J f5 ױU5Zd9w}O|_Ji><Y kȕwVK l9!--6Z# :|ՒNr4oL¤tou8 DhM- BgD̈dr!Qhڎ8>RB8~<kk·tpmz"t0>uy*^n3%Omt=!~9OhbCDآ 7VkՉc/m‰t3su39sr8RS89 Ā }|ù еerr'9'd7d^&u III /Œ`.)J-.v/+Aq ̋̚Jtd`,Yazk;H+8$Zq&m{#nE6n s~tUk(VH33*HF}U*![3Ů]iv"LUɵC Cfn('k„T am/@h`OO' ϕ 0֓n{1o]8뻍.;tzu8G NqOXcYoijYEII@6!y鯓3fꕪ+/bYjz9u)Qsi5E~( iu"@2D~N(  n~E_i2525.1s.Kh+@!Pw%3Tdd-9z-w_:FD*)D<I ĞSIZfaUd:zF/KĢ¥aI6Г$"wVQ(}w'ꆫϨ2J7f2b0-}/ 6L/T/[G"/"eP(}cm vڈu ‚9vT9eX x}mFs~Q2.,L(QH*f&秕%d)$:%M^T=!%LvdQʚY4̤yH%rrqgX HG;x}mFs~Q2.,L(QH*f&秕%d)$:%M^T=!%LvdQʚY4̤yH%rrqgX &c*Jrx]k0v$n1f{U>X Ѧ*$_v:ДȉG}Ϋog`EqUPDp)KY)bH?>VdIb3Q!A[AJLE™hYml>f7ޖ\k;]tT[)+ѕVj @ e+c:K bgo\6rЍ)&R8rw!80|~ĖDsT!BȞg+kc0p}e;uN2Cgٞ6ыl6Qk6Q{&_ ܤ'I'f)F`k`~ 䨸z ^zA%_ ю݉Ǚ3Lp7~Y,i_)SjDdg i.xQK0oE${qӰ*8ǑvYh܎uDQup~'mUUe:K^MPz$G ~#P$iؾ0vpn,9NK㦱(2wHnʻV~\]n/y))6K%T$\_QXe:[L4S)xP#_?{4 ̊ n~a<Gvt0:|'mTW D[;7_,(x{zu0K\Ĝ̒J #([aliii=}|hϨ&OQ:?07d +IC<}fxXmoH bN'U^4չ䀴Z5jU7kb &/F"gyfvvVCj|@KPT*2~ i`)d f}f\Эt Œ ^/˜Tl<3+S+kh$x] JArW]AaC:L*ơߩq30)Mœ ɸM꾷 R)Tñlަ@f tRhV6L)GsD!Dhۓk0?M.\1σ1PR7H_.911sSY1dF1ýw7_w%pN;^{8L87Nkbp b(*<JHρ)S29J$`c䎿"'8:\𹪂D/J/j+csWFd2BTW)rt[Qk!je3BĮ=%*}sX]>.= ,y|l iJ R"$V,t]NwXU(cJ\HxA+8- [gYfA|IiBAP ^4I&Ia5ZPI5TSԅ"Y!c$U% aem@+SlGW;~bqı5Vڝ{s7x)R6<+ 65YZrX8.!fzX2D[ 3c =jǹ1z+@*jk_3X՚ 8>y|CЛV{\6tpAa&{s5`"ۧi<y^~JϫԏFVlNa~.2`9YM!a!i=DA{f|NӮꙣlj>?& Ar U曹J~!)8M {M>6-̉R7%ĶڃA8p,  G \ƃ5$8z7+m?zSSwua힮Keԍk7Q<EQ\Qftqwq~jԛ>4gR b==6icW'G_WC,Xs8cCxcn{NtrSm`޶[U9361Ɇbn<3.> }\a;Ǹ z5ᙑchuc&RP=w .ލ>R3NJnG]횿=u;Á*{jNMܮߞ{u|y4.Y,-J$Q!Ƥiմ<hA_IM[HG-6Q̢lYfDRʈ}[ j.Y1sd" Wc\iSJpgrFbBRiZI5gqfUj| H(>'5OV$д暼A@BdFrIHT*ʱx{L6OKM_(PH !7OXb9A1F  z$+E' <9'bH,Q0I"fLS(JVPUu rsw|O~JlUxkiP,PWWX999X7=D$#WI-KQlSs ⁼x: ͻK34@ lL58'?`U 'T(*Lȡ0Y_}2i VSh`0ٟCMJ(PG2QYd M:΢ԒҢ<]C"| #d n]Z\NVADf-KHbU-dyu<0|Х1&! I+k`J jxxmk0_O)I])c̖ enu%|R闸1ka&p%qd`FqWfI8O (s*TZ#:MO2+\/뙚d---U=diCF#Kmf0v6OsKlAs_{-i(A`e\eKvi*T )Mks4$ohI8us[% |YɲƊie Ccd K0 l1T ϋ kNַy \\Yڍ:ik6zk^zb_+(Bh[.II$BL7xAH4Ҭ^9bDrfw%h֝i<>=x|H sw;]dBj0#FU=f~DכqgF>Q#r3C4ѪV_5폽Zn "WZOz3ͲHx]K0_؍]"Ql#k6%IǶ_oRnCry&;HdSͣH%RQ暵RLY^ ګ_=|Q1{,u;Mmvbl?-gj]CY{' ΙHTVmN|}Hϰ%x_K0şO苂$Cde/H۬-MInӛ=86aHpM#ܩ0mOr1L+!#o_~MU9+Ή`j; ؔ*a>2ߌvWUQՁe{᧾[$xg_TvYYdL` ,39$#TyhaHճi$ٔsMKͦ2gLn~wxĄ%1NfLV#s;K&ٟvgf== Azݠ|5XF +E6h*o4>ߵEx_ݒCe)7& À|m䋐#Ra^Q 2r\&a\ƩkVO<}Gje˥ OlFlq;xX[7; -7"-%mxQ!V{U{ٓ{" ]"> accept  ,HK=T`x'kVNǢ䌉[';2'rj[ 킂ɲ PJXp'g$'pOVdo q8d3)Rilj9Y,y$ @29Y"S 4a 6kLYs5qج1g ĻzlrxdgS+.;YC  ^ہpx_K0şO؋M֮V"00G\@҄$ۛ! wR7ͨa)(` 1VwF<)FFzZ]50|K<2Jk ,>M@i|HLPUs=K4|4%rꀟȎΊ%}8]x;a윙ɜl#{\FG65TX\&'1X'd{fĀNY1  BxOK0ɧE٭4/?%Mm mB&UDLxxd2ހI=uLL@jޟ*3&DVŁi1gŲD_xXmOJsހ JrC57AIX5ljc[3c ϙBY{33if2uNxPa$6 PR)2R I>򍊗+C` 0^BJ}`~¬2*%HcLRjHII:̍P6YAH cmT(ؐH]gaaa" % XI֚qC~sI!YRΊE}Gq S-I^.<9tv>= EpA(]Pi(! d| +߼%,]ZGGf# ߯z777˴Բ8 a%?4H {T>Ԇ 5Ish)M明x$MgT.cE$mtlrk#aWEzyv9#)ܟkJ]]i^44x,NMC:C?0zk*x*8##lݬ`E66Eɔcik %F/Ъj_vw>]CRE"kd׽ z(NLJ@\V|W \炨HMFkqeK  Q 8AY#y4 h寧{uYVX\eKhuĸI|%,ATII.fj-SrP{Pi 9kV}`JA* Ѭݚ*C-PcnPK,k؆ 9yh=Qvo߽ 'Zja=Ppi|>b78ퟏ,k-DxYum%8k;ho~V=NC'@[T~IhYQK=zcu)?JH;IQsRqP ܱ-vs*uo٫A]ڪk-F'Gv!;@^Y|S'.la j2hCyvxlAS6(cEm]K^~B r4X&ꢣBZ,%So{{[|G˿78w~;n]Hj`xIarڵ>'|Og䵕igVYa *MygXv5 [/l/kOQLO˝#1::* fuT[|Lb6(t8'{r"dd \ͧ |z?.Zzƺ`9$owڑP  9ɲ+q[8߻'|{ƻԸ˽\{(Ph QB_(MsAݛ31l+Cox+o6|M}-ŏMrqx%rf}4qn;cl:Ȟ>`}XkFǟFP KmآrCZ,xj֕\AW ]u}0r -Fio _QJ"t#W_MoʎvP?ÊV=k n`vG/G/ϦlJ'\O b0'/`yܗ eNORkF$@^FT?j4fk pZKYģ'r2vdjvޮpa-}s(Xc7 좈l vT 3ŀ(_ĿNƣKǓ? l!<]੺EKԏBy ̣Uﺹjq˺+]WS9-7`xV[o8WXt`(G!JǶ+8N0$vBuBjD{f<~ 8=uq( e!XK']w723Qz$09v1aVb-(ӟ`CE!@nPL,TD @?8/J'\S# ; CtBOht(|Hz*w&>'a"׌c'=D&+ =rH( e1SD+8X NJ%"DdDJ=:|ju 0~1S3];uRR 91u179w-H%6Rʧ5F[-ʵ8h Ph)J9!D[8#TB1==NsY@)WG\/ܽHPDeb!B}z3ufk (>H:"/|T몐y7Ƥ7[͆ @C;YR1E"ATصad-N Uad\Vr&KevˋL=t#ȫ-:Ց3nx{3%ֲT8ڈryp:=Q&Rly2QONdhT\Tn+Nkz?y@C䱏Cl$z|4% Jy1vzsLYeiMc̲Ԩ4MC|fe˾>>6б^/#EF1غU+2!VYw͇%׫[c7jǹoԛQT_T,ҥzVFX= 7fR+16L[־v{ kh&;n^cm>y gZf}A[c3:]{AQ~e@GN_J;twgnzzP7o;9? %G·2p[u1%Fv2f |S ^mhMUs{7nknu |VY x%޶a,`[CbV(';cIo#»2ǂ{ MԿI4y'6!["RSƊ]P!uj]8k8k(' T#E\N7$+?B<8;NrtZ6q/I7]5GoƤϠqH{͇˷p KR8x)u )[!jb09g 0FSgpf=˄j hx !o7U+MSXH(ե8jɊ'4:y.+w,ۺN%-U @Ba9խۊ@zMFk`Fo1ZI.q*sO ^?\u9Ef* ͧD%n9P̽YxTn8=[_1YͱiuCv$bAI~>J.rŠo޼_IoMRpnpVQtQJ^ъn;032軮zk/$0 y6:{r0GVkÿ^5`HKK _!caIbp dustO%S(zI8bJVWFR*n57%]ӎ+PYw׋;sk&iRprbdCȻV.s߬UlEBFwP Nu/O H1[ޭ{yXߟ Gqw$N Ca Y~y|u6I\֋lۜRZzvy7OsZUƁ-ᨾ iߣC17 qtbyJ *&چzj9vdS\1I}U}6 K6Yx"=˰*aGFHb_E8(r=l4<DXMazbg,]eG +nq;ѕ50ft9 P}FqΒl0\B 7x}{#=-z~eBa8nqo< q_/;,w9&E6mx|#d~9`dV ts*Pq kvr a]D^nL49FnHgT6Np 1ח^%3IHɚ%#RBwՖSB"+)7e9 }?ŤSCY&9c 1ֿDJ|mobֲ|٥H&IڨJphw+1G`3Q&R$x<IoCxxµZ Q$I9dCKW!~`ax_7u6XsNxVmo6lbMQI ES &-"%"BKI=$%n,6}Hދ7ֳT)Yl[$T8.%EI/sþQZ32E!(J2C/mz+~OzW΋B_O2f:и~eBsVI`9՛3Ʉ6)e8l*R`Ѳ(f9'B%$ <E"Rh+2'\S WZ9ڭ?!yt^Mi(bkNLCYitӥ;vkߘν(MHNAV /4TiV>L.&ևc4N>pIK)(p483 zN&1Odp1bt~6>9[.u&?#Bʄ2vǐ_~*& $ ;H)/+Ұ]fL],Y^u 5JB[Wx E*:;Y Z;Z:fCձhGhVw$TOMWYXti088V_%Wi'ax6:BжTylsN9%G&HE2jVyn[lk_k%o F״Jx_l_Aׯ9l*--2g 敔{6i8+(Jٞ rm.nb`kA+l'ǡݠo\ܐ+Qr#8U(po=n|_k<+Uew%2ZP %͑D @* I6sf ~XkKåᢘ;#Zer|>v@徽 GDܳ"ڧl9APPh?,t5k5]tFBTr-dPf$G_i>ֵhL"[)r[}Ŷz[Qdj?ZL<2l{AB5wP"Q, WW\dId=Qo<* $>WA+T4_'$<mH8wtn7UЪxSm<ŇlZ-a铨5 6-)EeeSMWcQ*<i %]D(t]fZ>w~7V]w$;bogU*fZKO]dnpbWg|ws%jo\6x3K ör+DW7|FNCJЛ+X!"EF,־秘9H9nG;'U L78YHXy 1X ZK{즀Ѹfq,K௸с|Mߝ5c@ߧF^ 7ƐՁ ׮-E5fWѽ=COWv jxV[oJ~_1j$J@r*!$7ah'k1kEkόpɥq"H%w3僃"Pb+"aWҷBI7tTžO# \1 _34$dWB4b*,Chrg[.)PX3| 4`T`LX|&# cǖ䤬4D*,3*SjBtwA\r"H>#`N&ČǫxA܌\( HRL6' d"Ts$Q KE0!%pW0{ ?A;>Ac l d4X>L4оq洝5(M.ap@iڍG~m\iCDw`-Ked4-8bJ'_,Rr$' A_BkrYʸ>Rdx\kJ׭#c'g ߖY<.&N ;s=74[x $=s3ϯ)K~H):2rƨ9Dy m B1:w^r-BGAj7?$96ZIgdt6R"|dEs:~\79"wl0bn08}sn^<֪YAu'C$vNT]]ۥÛy9-A_|v{բ׏|-0s;nsKTBƭQ~sp\zqo4$ͧqC _5tuF%G4C(L}Ʒv?w D5F /KG5^UVMjW9K^?w*]+RF%1m"p6ѸZtYܛdTXHO7J%$-UTtJ,+f$gM4xve8e8eCHw;6>bN)n?DҞYq-K:j` +MRʇ6B_vVNls_,AOGDUT,LתOJZo_Ati)ǢVBtK?.:^7^?zSѳpo :TӢ'F?-w_%ᯈ֙njqAUMs5dlibseccomp-2.5.4/.git/objects/pack/pack-e1af88d6996eeb6a7141d61bf955194d73d73564.idx0000444000000000000000000064014014467535324024547 0ustar rootroottOc7Yx %@\}4Lk@Vv.Pt9So &Jhy(OiB^  8 X v   6 R { + L l  % K j   A \ p .Db;^v1Qk/Im AjAc0Sq.Gs"=Ws)Ki+=Yy2Li%Kk >[y3Icz $D_|8uYy :mAc߆sq-bޱ$ܰln4[0y(-W 8+Ź8֙21bZCcnHG>щssT5>P ޝ2wZNié|ɈקnZ`M&EZż+T;k3 F J.kFICljCa 'G=ᄌ}1yGS)-Hpǝ|//c)=X'/3[J-p,\oS7Ԛ˫Aog{XcxS `wOGܽZwԩWڶcP壹Syk'X$}/gy}b4e;qjsW/{oM ='G0GΒ"*r?v^ȰY A~i/y-eW,9[VrXC"g~4|xpa0V1;_k`ǫm$?^jp.Q*{+dRLBvR@҉^̀ג1?w`ܑ iK̳?+vlj'e?;frMmu|A KQ  knzLzeme$G{|a^WCp9kOn- XuM:g=D_b6#s*㡔MtfdW.ao1}|z/ "t{ &.7ML VC Uc41M1!vL㐥Ry9O_.M #yr[[9|v7B=ҙI*V8+1]]Qs2G$^(]"f?g_`8{5f)Έ^ }-#s&m%pxevB.|a}Lj4cT 3/.gg[Jc&cOgN>j9`8T 'z}`SAfgJ5>2aé Q0G\]r s/]ef̠F&l{[`ɽwy=(DV%~4v%7ZabayR_/h:ޞ\lym<%n6ƉIat%ґ6{Egycݘ@bbi?;20VUTyi򅀵t 9NɛEl9zO?`}? Ӗaʎԑ^ZIJU'Ooi>4h*k*1dWWnR߉쑿k f] 3ǫ;85/TO2 yg@k 2m;/~x&6Y)z݈sRӽ!RUDɠT"p:Qi4m0RGX5{|ڪa'dL`!Ry(<ebmѪu:ufH*zmHAL=G8xx,n4ŐUKP ;n/tƄ< FϨZJ](s>s~897Gwn6azyf AV|SPb",U٧.eZ+_ߓ[ SR4.b{?ttA+撛:OGK#GRto`E\]eW4TWn9Ü̶5OlPRȠiwC- x B8BT1ݻmE/7n(Z_ɝrtm^{=ѼؔzZ8;(|>l>#YW=sImLtwʹA˳iQpNߣP[Đ7䲻oȌ7$]?b[E*4풒*?< bfOo0vc^I-^ 4>[Veĵqf.RٳaBUFB~]2A<:E#2(`a t 0vFr/n&Yn8H\GU?$u3nN4Xzw׀[<7> H gH: L1w2 TJUsH%7REV(9&:+ӕ]{ڷwst~CbԐv_ +O4:6>/ m OZ-SYa*:xXτ`^'abizޣrm&Kό,uLnt>گ gTA2x>[rIF﫣[V|!ʸ:"Etv`Ȩg\]xAجS3APZ Ivh\p7vSU5Nd:Yw|>ˁ}T*Iy%] ~byP_LpEq~!X@,ןt@llmTOSNyG r_eBbKQeNhPopM@{A(4icO`Hb5&C;˝u  *iJErnk34kjnWkaR$P xB {-@Rfcg*nAcH8Q)⦰6,=MMY B"|N)fo2O'X#l3nf~O9A44{(;AV1=$B_L; PsB2۲SQkB5|nb7w\]Jk:4265>c"ebzDas郳C}ef_10t678fl|(ƻcԝ1C >`TUrqd&TCS8PwO Zgo[{7B罻g]QhVI#eOȖaM|xx!z*xN$>iա j.ݽD_ |z`D竄Nrꓶ:2خ (VJ$Kcy%LE8-ņ$@z}օC.7sxg?eLG_%R]X(Q!f]^ljNE 8ꓙ' ww<:HW$6xj؇IN5?NBa"5z75/B&ӝI8Us{7›{!`*aR_ 1U,Ə } L7[6C`-VC*8觫 KDk@KS(ML@`RD{v$)iH–:|:l$Nr}_u`A~/;N8N%_׻K_7pZ9$9Z7~i1=Qʞ6G.jA"Ii˫;94킃[GG_T|'"&ϱăb)D^jٗB 7m>$.s"-ڿ‡eƦ5P;7^߾ xY6Ĵ%[1(`Ys38P46M~Jň?#`D0ȘV\x: ԊҪ{0=6.B$qQӕy(n MR_@ .@@{xpK ?m|ݜvB# mb.P5Zt3 # M` Q& $3|p@6y 1}5[ ,hnĦM?cIWCB0 d!G~-nȫ z4X,8_@p2`` BO<J d3F5 VXU$ kД⌱I0[o j񅁫=3f9j1 G!pZ[.1T TIw` 6k2UV Db8oZQs ` <(3u>FNa\@ wf]df? 0=5k1p wA\T-5 HW*DK3>p` ܉'|#'{g; &!-b ]PMye3 -ؐxEV  B)WFܺ H: XK pN;C L̘,8/(y-* N}`jno MlX OVO|ZFf'i | q7Ec uM/U ,ԉ)T!6uB ZUr%\'nɋ zgK1˱ ߄ȤSxϨo 8 C> tuo'/ fۂ'Ub 3F$Y* Oɀ;cYdbp4 0D e7\D Kn觢RpAQ lodk&O/>A 5.I0t KV :lW~x_e > R}-. OLO3t&Y4YY!\ \:Tֺ6FS  _PK׵ޯBI! i}"/Lb89w jy{Ť+a&{`$X n>aCa:ya۾[ n|P"C` -HS_ tbM0 ,SF txo<;[+ +U]QByKzh kKAJs j4ˁ 7 y J\>raiT ω.L/A%ZJL щRU/^d`|d ;g;Nir3LlzJ ?#d񡀓Ak% z/3Rqp20h@% U?|S;qOse 8ȩ|үx!+R) v }yaubSvPڕ ~Crz\U [-u[}I v arT#) mMb%΃y 'b-&t )⟬,>Ob@D 3iug&}~.x~ Jեna J K=1ƵPwT> TE+mj,j_4 E bt]ޔx Za߅ eQk4P(rf jR'&*pNq k!8tmoJ vd>:P"b zF*p"Ed A ~':(5. >=׼?6>nh S;wOp iΙ+<26S+ .ǽ .7 >|I1 :1yW(YЄ 7`wlg`*S3:xQ NQQTh1b! V$ian2 BakB ҈凚GU Iq mլ?*A ͝ hkfdF f 6}X\Yȡv0Hq6+ Q F~1~0 @wy8 PS%VhR^ cL?,:됭 O m@%wv= ER?| (|Cy"92+ )an9&>탨z^Vg :w[qDI^~ou? HM X 'Ľ`+YQ es7S`3.  i2qZ/&LvA( stea01,R '_ȍtJ!++ pК5 iUK . IMnKj Ofފj6'n [ԒHU_t گ*XYuz+ 䖈13 I~ۈ?DϥL) 3kSGW$]4 ' -Tٟ#6v1 [42Fgߩ*aY 4Jѐ;w xLBUgϖ ϿU';r(L <vop u ],~B' kHC= ]!? FtOHy!T_,3 s hcm~:}c؈:~V6Wҡ Vw[Цl/ofr-#1M#dU>]̮;]LSgk#}1c,[qn?,.LRRbT,h8hܛ=[RwI띧G#w'ZW"$/+(Q(0H D*jwTS܌3LZ+ϦU[19W`9ʆ M _VLu xcٝ |-dY^v%!a+ܨ}JB^lTxTͨIwʩ | LXϬdQ gH Vn{͛.3"yːY<qc6ㄬJz#YZ*]w=KjP7 bfc/4)Lf4qxuwnJz#0}թLC="b*'>b&bR޸jKjgV|[؝uKtPL 15M~i֯ ) ˥x󫗈g`K}𝲮=Z31ď? 5T"3~[  v[ߒ-דa.Fd2?c\\*Fi@Sե==rJ8\jZU(_?m^$ M3ſ!5Oα'ʒ}6 2K~UMZ(c%8 H5]=<U,9DE=U8}VW4d6-W7OwROWS1EoEDXcz\SlXEQZ2YkXfqXPS~TQn4sMW0Pa\%F$#k{*^?%jcn=:1ZoQk2?K!J / o78"N ?2tw_ o[7i}E߂L|؟)HUiKM@K·צ57WB0'W,,{:5?jN{(WP2KVt!S=g(渾\_SZuvLNz p>U S 5[c ?GVa-to\JRtjq[.p'w1BXF? ƴZix U  !GތPp|\foڐw.6>P#Nwp|*,BB 0)Z,^iQYH̾%?t[3')EdA1d콣 Iat:~gzB!Amz5^QgPP>ڦLqQ\TWoW\'z~;0BC`'>. NѺ !P%`6CieU~+P:i ĬRF:B4]<_x!W$`SWzyeFM#z[Z`[7P&FdR,.-^/ff=vZGp'_n0c8;H6n<Xs[Wl3k/y b{Z6J s_PN`gj r1Ha}SQI}a\^%5h!ɨ5O܎JWg%  R+BJ$N%S |Їt NXnȂvHõH潻&kLU&=s*ՂSǢOݦZ/D0]i : 5~wq%hhkM+80l3#S]Gy  jQRfZ_*.Ҙo^(0|n(&P\Gz66Z J=6a-@:;0\86Mh60kTZ /PL2^ltC1t:{3 ͕*茠_|!Д 0Vf [.>{06<KyF>s4|PؒL66߂YSJQ#VBrk^ /=m{ڟ$??a!o?<$r2kKt?~>hHo`fy1t"d{}ÇdmzAv A8+G@P W`ZH.y\ &׻H{2t^3 mO<(;A}2眑%) ?rc&8lH4m66#sj?4Տ8xyBY*ϚDG@i) oa._sefCc. J<5c{ (0&rf-ƻ"c' mj<4&Fy֐$[dj {0-r#4$NcW^yk28~]YbY>:x= /Ho#v.:W0m!FqA5ᾝqxICaW|0ќqG3 a~pF &kBUy /NH]NP 773-T[q:-S]HNs߾ٍ b OjҩIbvSF|.c ОtZ̅ueޖ hϐ].kݬcO T~#L vn_JW ?7g)Aky1F7cD,c#w/\bzqjQDn 7 ~u1#%Q5@TZb1P׻Oű<$#Qű4dg)Ou["93jؓĵ ֳKM&djN_ÅmP LGwUe]ӃcA=~H IN(lb]7r^qܥ x6O1`/ O6tF\b3/n l S ?2Jw{BkQqVf(2Uo"1/$». ½Ώ;/E]97.%^*ܑ̩%#&G4$*7?G᠟@{ q#<)o@ 5!7J\]ʺ#ֺE(e0U9PhzPzdaI(u.cDLz |IIe/ IpҞG@QefZm:ȽA$`bk5Q} +t] 88Em?+7˅ 89(*;v=ڼU8lG?EM|_M?.IdHK[NW dIA|vCi( +X& 8wtrt \,q5G#v{ te~vCYAM| Rw2eĒaxqmtR$x3}>tY,5uJy59UFr7ޙĝzOey rgDW&49._ |4OAyy?S]#$w|p&guKHwqqx#7lP7;ud/$=^r)2/|LiUڿ_$ld5_i(N]SH)z&z0uXbk,Ǭ%:Z%Oڞ2 ݋7;"idgŤ;6NW2jLE3f?RXk + KSЫ[d*lnb!d\.ZO#<[re4pR?$*ҾzJ$d嚆fm>C|*h~1=%ytRU @X9I84GOݢ氘',pv!Y[Ď.o_Xm;`sZVw^{-&H,?[t'oCjb#0#^b#ly.r~;^WraDjƔtRmqvl Fx2Ӽ {0BF*^H؄ScgXヒ_sHr<( C-R_O_vޱ?㒶 EK5]%y 79oZ+h8.>n6ޛF`?6 w/2a;6?>D_m8rF,Be) \gdG!h`<6?qJFDڍirѐZWTz`h͜}ZI݄r V#~a1xB>s:`a7 ^ qC4nrM'uu MM#̱.!7p ik]T<պ: GQ7aAz xf+4Qpe%ʎ-ҨQư"f<V G*xl/u3F*PKҨo6نVOL4>\̓?G{pS :JAY$NZ҇r < \'-+,67^q^PkQz(g2]ZLZNr\]R3b'2GkԖ2M+<\ Q[*c\G]0%ML8r"@LZ:4$dr4?#YDFÉLּ\iT)LOjMP @(*<@:i;2ev!HZm;~\Q!Ń"Y{ELXx *(&;H: jomݰK8e¼;,E]ȏf5j ]jgX y+inj*5?t^姆Pu3%^UaTt} L+>: R1r&$")QCOA-&m]1<e<"+}Hק]=gsg£@2ԽKp,7u_2'v[n%DT<5Vˑx,+ "C2s=n:@f!5ȠچD?5cz9+bMl[ ZЫawuR b[3}vT &IW,DĮʘIJߤ6N&]̑%"5p>JX*9BaӲ,B?PzOΑ n\gr*‰_.r`{i]_{/ doUJi+T*W&FLdܘF !.@}[1@{aiyK>DR_H+2o ^jhKVa`/6NjSlCPTp`M6j9qލ;b5<ڋ>g@Bxyd2ihm'ڮ_a)La|y,*T?wB瀯A*lvETM إWA/%Y`ei \wnك3TgHFFY 4PIJe+ƠcPdxmV:8pH.0/"T,&&:'8̖33?D~%i@>z..*0OOn]D_-_PQڳ~wuJ, ;t=)V<67X4CAO.iNF $Yo.ozeN: j5 m۱$JY ; pя:9daSH > Lœ x, #s۫ۇY|j]}`?#h{k 9ϲ˰sL%)Ƴ<)Kai,T7ݒL0#߈o8HL¥ǓRٷd8AFvt\q9Jkxu5?~p>C\y&[NHH5q2F̘1% TFO}Q` q q4O*4pi.]w(IZnQ$@ Ԗˋ>&mU)o`MDm%>Z&3}f zd _d+{^kwmՙNSS lI(B:aco6Y9T(WBkwvx0woM%L=.:5o# o֥U 9*^V, lS[#@U臆ԳPбྶK@C>%ny}A)v @zV~jd4>ⴙ| FDG7۳C= q)WxJFeOmO&5Ns8x nǿ&"\хpٸ^UڼQ96KtfC9^ syuK{XU(Wd&_A{{]wsEX|d4d1%UcwdvcTLRtkW,xM8wag>zvsWɢKAO!nR}p(ݲ'89z3^r|Q1]] syT? doh'yLé8tC%SEV.OwcTR}2+i?/ղ 0ڑQY'ѷn56BF[tci;/1u:MKER1L bd?-o8thw !}䃼t}! 6ĬP!Sxg/r)wyo=Ie+UJiMهg9%h/lzadJWX;[xڢ7I_F @"9`#aD1;_@*ApxدRf0<@Es[[ߕsFu,2a:Mg} qF*PU.Kψo-> Tфܤ|9]Wb3WMxXglQaa,(XQ{hkc' g j#X\lx@+<aAly hbDR.G8YNd7~JUQ  {ߑ Q- k 'ƹE{8/8 t 94xM'Ն־őۙ : Dn_eX? _ =W 2g,_ɻ F?`/_ R6=L`Lp;D{ UB!mRRXz: W~'r~z!ʊ/ \8X'欪ՖҒw `~PT=xqo dy&"%Fl-!p_TQu E!SdQ3.b m:sF=!$v=nrsT50!"DWmk!c8 vQpn\ 9FEc!7| =&NRY{!7-D aү !b hzT"7!LW/4c8qK,"" :su2ӡZ"yJDv_6t[>{A" ׆odAٙt(E"#2s5* NidC;"m3hV7&H%5@CY";];xT)oǓ"Fnc3 Z2<6;Cr"P? N+lYC4"X)7Y o;{"[ SIZ4::"s|F9Z㤁e"}SX.][׹g"1K<0j_glq7%;"x|DTV]T;"G \%"tK˓nDtSo"8vI^)"Bdp <GB"K֒wyGG-뇌"Nv.v,M?i"3JmX/) D\Tv7"L"([0IKk"D|!pJꆣ%9Q}"x+b2k8͙"Va bN@yyO]"ܟoϓP"ezi%$IE"Epemc#ydذx=L@p#$95N)i/FfA#'isv,G!yK#):ddq ~N|#1 NPJR-#7t"Y|cbi#CZĽ[84Ѭ(S|#D)Z|/̔f#*+q}#JݍAr3/S$P##[e〈t#c4aݑ#s3쵵#f8ǯ#ES̪#xi'^FLa~\N#ahQh q@ov#,me+C߱;zi#:;ԃgNQVm8#bgp[

~d$׏- ;:f=h`$+3bX!2ûϠW$롑 &gw!1$X ~ *h,+oW#9$P~vV, %:NL8Ɍf%.NܳS)jȉ%0aM4$fsnHЅh%0+98AmEƀe%18Vb=z;2u%7{hB9+XDoִ%;[Th,,oNz95%C TTf%L@TCs]X%Xω4Ds vws%QBʥoI$O%1Cjw_yTAXyZ%dZk2o_ ys)%WjD3oH4:q%JqO?P^%Qx% >S9jWX% t.BbU 9&?kO sw%}xeL60& ; JM?&&%9V[8&&pQzJ6ɇ5)&'Ɣ塟tnx&(D$U<0~r'&/x?^*Ek&?NGȚo)UJY'&B*s|)J&C.`8at&t`p :puAEFښ &tcgx۫C0.E; 9&y'eY.mQB&{ᬽZNմNI&|Vyeh&ɘ3_E*&"tO_WJŊ&+GY]iݪq&+ X$ J&t/@64UU5& 4<6&tG^CgE&f38wNOU 'LW&79t_|JŢ&)"2{@k+=@&`\1Ax-ᄔbX& j9GUl ̊j&CSfFK lZ&jVЎ^$] n OQ&~BƊH?v &=xFX F &%|2 )rm~'X{]!+%ZL6' կhkk\gŖu'V'U9ސ.w.C'Ϫ=`J:;XQ'!V*ź]P'(wOOR C|'5iB>b'?U˳&LVMp3<>'GVdF;1H.qx^ 'JKxR@Ec: NI'Pȧf\*T'b3%vXzyj'fF*5{ Aa<'q-n Qs5D.rAY'zuzRzYC.'j;G`C')g;ő >}4'>K&,.'{aMGTn5 `' 6i3 '=ЀLU;D8erW'֢с(1fŁLv'tȉ KFQf '&7֕@(cP3a'&J p=q<'U;Xt 44 {'Y48u'@7j{B%#H:C(~i!HXu0ݭmt({͉C5WR0à(J3fZ"5хG(!@ҢBV("oJRR|a FS]l(%q%bT^sT!/(3a>IYIw`dv(54 W uUђ (D yb(WL41C4;X>c"(g-݅0Z"D(ubk<^](+ot(vkWt#s(xxYqy^^um(|Y] d2( 44A%Lƈ&({osE&NCL(V))>MS͌W(}V2Qf-⨹(tsk@*)%^yUV( kьk&G$)9~GpsbȅВ+e)vgc) x>&)_,ŽN>(Q94Z)|QCbSk*Fe)1K z0Γ.)9G3m.MIB)D>\" kD7)E۞='#}eg)HOH 2"t6~)R ýMg)"VO)cN F3*ed>i)e3O#0 w [!)f w^uǰpV6)}B %#ne)pO5`}P CMoQ)҅G# Eye)#HJ?1 HKt)Q5Tah@B;)Z0wU4Aʬ)~3#SXإ').m.?|]r)2Tyw@3~CTY* *6ϿGOw&74*gXB\ 3*>'9!Q}4,gj-*>=;5N*CC{@jֿ¶遶z*CL2d rV"~ h9*LO`)&}x"7*N=4;)ȉ$*Q`^^ ("o*W'|k^e*^ĿjE[5vzդ*^ەtzejˬE? e*xgO)r+q$:n\Ɨ*zP$c'Ubi,\ol* z\LDiNy{*8}O_.䅣,*O*‹$Ő#^*Wr_ti[|載pK*JOCcCa?*Q 坈:&:{oy*LqVu8+Mu*f6Bo#*dNJ5e9a*#q=Vke+w.:4*CLeo `hW/*e(iwƷA^4;w`* U1 :X̎*FbטGHŢ+wlIhÎuck?C4+̖.4>ٙYsR+ڳC!9yRiW+k1 ۣI+'ʈ7S< 嬵++m6!#8( +0uu42=i+1~Q Ct㔹Ja?Zts!+?kأV,cF̻>+@n;'DS=F +@JYk'6ܧ+DsJrLY$c]+D P1U,+EϦ{vi+OtƏՠ ӧ {t+P8K6-r|+`=!}dͮ5)e+a}>.xR([j"{-Ff :|!]h4-R!LdXլg6Rr"^-a ?Xlۻ8-u:)ބ&r9`rg-؞ѽ<}ܲ!B-o&wfbᬍIfz-|F.gkq"-f TtXN -!_;*-s:\]q#AAX-0T[B͝0T-(ф9渁0Hb-ؤ{zbS]QS-فtgミ1@-6Xi܈jZطQV:-q"X*7t-S9s@(]5h-~Fn7|-Dc.;e,2.Xl w#ղRڞcH1.^U a ̸Pv.c* }0MNzD˛.ewKY"z49p+-.tF Bm?f .yg b/svfEG.~8׿@6;GLE ¥" .l rlm~M.;җJXy.}%Hn5p1;@.@QkÄ4hP; .w!?zjyUo.'U{dZ֫/т#.cLy,rF!#r.)V..a-sшj.~&-1qt.{ (EԪ,7-A 1.k H-J.^~sLPOVI達./{锏gL.+ %.ث޺,z/v.7|f 7ԁs.s* . ڍ2Y\K8j_/|c4; Tڅ/J}ʙlqu/sϕz~Jbc/( )ɽNb/+QaL9T36NîE/59G9c\./{/9X;{4_'/:~y4(ƞ/<w+L*_x/O.-qʩzae1/RSN<6 3l]/e#ޚM%{ cȊ{/}IiODf+G/ɢGgIOmc T /` Ytݡ/|n7 ib l}U/ AfV*s/k4_f,T+ /FüNV6P-/{/wγ?H/74#NOcs/)9Y$ BwܷC/x .q4eW/4rajexa/93~^H/aq/6$r z$/\]d7 /ެ0p0ǖцg2/b?TDGVxal/ŴTBjm7OqK7/1jN:.K/PN{yNk~b0 _#r3ZtIFn00CIuᛠk!{|_h20"iUB8jȈ*7i;052v} {QWcu0XYg`[-.X`Y0jBcb߫G0p/{b$ƕw0qӪms!WzS0}KW&Eq )[Jx/0~% V|@.( @&0t_J "=0UVIԴ!0>7Blt 'T0;' #.wa0s tNj } j0NSQl80e3J"v/Q3'0̾DmǀE70ҁ7󒼨alS0ޅ#@;UjIh40蔤ͿIFhz0 vz3-j>g0[3fc#t`S1 (|欴煌1 R՝ iFN5>d}1๊ʸ%2Á81$a YD1*R J<<˘yK"1-מ|5-`1=)8pEQm1H$ƃzqQLsNK1W[mG9픡XVS1X?7 x\lv1[^3NA8w\R1_{ؙ 5RHC21c6d;W޻hCK1dZ٣e\aD{u^IUn1eaT Gt`* CY1uE6@⹛61u $M4(1VZ'=-p1~g~sT1ܼA^1 *7!O51e-,vemx 9&N2kF&qY#{':De2qΚq3B4j72s[9N?e4k2HK:(u%ȮB#2Td QF܎[a%2R\lJç ."2< Fڌ<1>2`99k É"L2L +1i]WV20 ~$9QT2G zPP'!2;Lk&:Bz2>H㫼%yZ2ȸ:ĆQ2Ҹ2ɴ3r">9M%F@.A3yC*L% ϛ8zVx31[qh mFHaI3!d;"P=+3+ SG2:uʲ3HĔPP3ĻmtGrI34AS/<z?3V.o|J.0Z3owG|猿CT؊3{)`hYX϶3QBl&-奄3Չ#F-*`Eyb3FAXF~BQ3e+p !æ3/PXyH/TnV3•Tlj6gI9Pp33+_pes3ZzUjn.sUP4> S>7gT*+Fs#4 C5-.HN]M4=jcdiJG/lO4)E䠕Q̹-Q84- Ȗbu-)o4/1f.ܿߢ343UXec!T T43 ̘w#z!-249푯;gulْ6-r4>L<˵ 4HBrQ/*tiR4ILCfDG/%,04N7yÒ:-bFq4O*6unv4TɌ:ltC2o4ZeO[Bc"S%4apnb4sLE.{*榷b؈4tj_̦&儓eA4xKUZ !~4' R c"R?!Eq4ھ\FH ?6#I4p̽-ZK4Gqכ[]'kRd4:pl/Q4`e{x8Dm"%14 &8B4xV{f-gC!b_4 I-?9bNJ%O4q'q Wb1nS f5(%b,51zɹ~ctЗ;35$г;MpdH05 q.@d{H5 7Ya&f:5C+Vo@>5 OV6ܼM*5%hTe/QVM52iJJk55X݂`ZG(hAm5C_ZY27mͦi.5QΕ7b3%An&5WaoL-1~Q>5a=^z.{&Ee5pϚqA~`{5pV Q1EQ~25q1w k|=g5|qz2 L*淸ݎ5~p@dcȷ辻5)8ip_y|*5B)1HG^59/`U?ǔGG&95OE1xG5nle5Y,3NP&5h{uP}a:52-C=FM015r/|4mݟ5 3az 5}Ƴ,9@}57$"ׅ#b6X7Ԍͼr17 mF"1I,iqf7z0"b8%/&7`dSj+5ז7%Yy7|E7:=7 'pPjRB?37Ynk 7V|msp\/m+E'EX84QiM+8ATB 0[p?P8" t}GڭXWa+L8#g_S呚=8'~%JJhQ87t\ڀ3sdb]8;W֊1By)Ҕ8@*hɻҎ$*xL8C/VKY,bl8EE8FXy!;e8FŭϨ8J-f@roVZ8s;7)؄&]k8xcmDql/#,83)DJ}8|&a^ r!.08<|˫'z[^K8=_Dr20]8 mӦg(Ġ<͢8.qwCB94μ8P=x3[w8^Ƥ8b&I:mBU84ـÊ!V8é8boQu9 K/7y ;bW[aM9yy:$Nk9bDG$0k/k92`&:^nIr9!kd.}lHv91D l0u$Sy}9JMBG' n9K*7C[M˟Wq9N!Jzu3_T7@$a9l1ڟZb5 |;k9Wr)zO:`Ww9ח<q\Jg9{SI^8wVBEeY9[- i 9vEYEđ`(V9|ZCZbrT#V9X/`8j^b\9=nT<7lı +9]!PǬ\v-&,sГ9ߣH-zQ9FY^un M:{hV8l( MPIb:XAhXF:[Z:+r["Ϙ `:zX5݆8iz:3"r4 jSh"\:4BsU:HJu.:(QRc}@u90FE: Nvj5><5:&ʇT?dOm:h>:명&quf 5j: wC$ҝDDvURE1i:BFZ}";7?RDF;"SD0+w~;'.`.@ot] ;)e"^gZ͠;-kn? DxFUO!brW;2%kzn|%IXt;<%zBFa>;Cgoǐ1x@*"!r;FO̴lP;XgՔϠ>`*O;_1wEd)!yO;c Yw+Ie1;hQ/TipMj;itQ mQ X5=;kiA;Si\  ;lThN;CnׄFzp;FW7-Q\Q;z$zS2b;WaJ`?2m1gI;&v<,D!M ;;$<5=5F%sKh ;T߃w߬v%4v<;w.\ ;PH~O̿ ei0;.oS\'j/;l} fۧl; ?L06%;u }՞;,+&3s5Ii:;1rmB%Ȅ1< '8tDZ7GN3l3< WגEe#LCRi<x?˰W^%QW <E; < \0<l:C:A<-R"bwy-GG<3߾KB )0G4<9>ias +=<=[<%kz~>n&@|C=gD̖G/K2]=iMXN %<9=r;x{xɃ3=u'4yeMĤ,m=wa/8zLyz=>C:74LO$k2,=cӱ1MK&|R=#*C8j|8=biCϨwa=f:tNH^bd9z=:t܍?'r=6hA'?dsʺH=-xlb_́q=? @s%:otN7\5=ΊO#gq`Q O;v =YlN\>9*8I X=V?5P =TLCՀOI?r|G=QIؼ= dy:LB=m}G(C,>L\!G"UW>@9 )|OTrL>w\1~apW>XwIMqѓ>$hJ ʇ6p>,κM3hI:>J=(Q;>1S8WxR>4眿4E">819ShVs>Nbp^ M)*>ZZl`Yqg=,wM*>^Ja?at&j>hJ!BjRwrD@>u:(۫s8bT"zW>sH#WZ6!?>9nd~q'r[O>UTwې5Uс{>0xєFa]O>x J=:Ĕ Fl;>Y"E H[>L : DߺwM VJ>C)Q}cXgdT>l(|Mգ$}>̟$Go¢T>tKԟSlÑd>:.vJi2wu?G'?!LcN8Iq6?&4ZdMr +z?0E4IMxyyS[2S`?1[/Z<)oGl oF?6oa䪛-#Q?@L;G:vЧYN?G%,##7?\)8lv^z#غ]/H'?bx 0.:!Ť]?fyWJ=+=>G"?N<< P6ck?6JY BF/ǚ?.E!M{]Щ֫e?Cy#@Wh?*C$_P?' .?]ϗCx#2?9/ JԿY?.[3*0T?}2 0̬-;?m`ݠʑn$/? fB|q/ıw?M 1GG j@ 5M^?ʡ @"{NNԀ~#@![PÂ"B@/5"YE@4^VJ%0/x@67my{GQ ?@8u7; 4@B\͞OjػaNzv@H3<1E<1@V}\7k< 'T^W$k@Z?tV{_k~G: @_*"c=S醨@`YdϚN=QU/t@mZ'"49\j1s@m_=]04z@qo`TĎ@us>AkeO]X6@}hoAoFϪ@D8#bEKy)@K`gtU!MV@:mXGeUt@ׂShg=m(DO@'âP߳7k@M_|V@dE`INCvBVA(16c).՗GA1_?8J\Ai &?P׍yAxu9Wߠ ~<Al"A8)D`fAXv3׳O hs\Oz~mB[Z+\~ljB mUBzCηU|NC2{;3-*%RC#[Tr`t|dv:ZC+-"W"/oC4M٪6h r@C7HF">g#/ނ23C8c U|2[nC@Lu)&ؒoCAG,d-%n[D-CFzSCmoJlC[NY0Hk0Ce֬iJNv&KäĒCgL`oV"챩xCi;=]V0Qek@xUCqL"Q Ή@ CqWE{.M'C<_DfDrz&C$ G]6}aj ,ItC9 y_9C9?6h֛C9"Mdţ/,cCXہ,sS"yҘC)b HQle (hC 6`z%Z`[C;–~_kCDI4П3ُ ~Cr$E 6bF.[CTWzqʴ ;ıs:wEuDCz٪-F\t⳱0Cׇ7#}!¥gF&0CX=\Rg׽DZiUOYWDä>F3jL7D!NQeƑ~D ̜K{} D]~monnDiJt=\떃$DBȕ #4 ݲD<LJ%DKt ZD!qn&LVPDyu(kߚp3f5D8 8q]Pi.E,<} `E@F)'Bs~E‚#x;ߎgf[iEnO@2 ʣDT֐Ec=.ųqK-##(E-AF ^ϤE/eA;]BE4jzpt Kx!!E6c78-B$1%ELhq%Tbig2c"ѵEQ{A3aEb"BTq/c2@^8 SjErew&#UڛEn׵H@A&IžEW0KlTA@ `Eu+92Td@a3P39EQ*~2of"E?p3[ts-QrE17z%:iYEB+*WQDEgT|ҧepch-E"%yC%xEnf9k+^k>ETNKvFioEk,ūcڴNEDEG<8m*LFE!p*ܱ*@o]c6EĚ2'l$>nŽj3E#,ur_{$Eԅɢ֌oݰiE~z!A~ 5$E߇HS_ ȷ iE]lx7WdptK>PUEI:$csֵ, EӺ3K-r^puk۶PEGºo[DzSEɊ _dI8'E'dGmqnYJEIlH2E> 9&@e(A$ÊPFY?^TI'F*%IX¼?GX)`< f9^善 ^G_gՁM5m:t|Gvër>j${^Gv7_ 8J)8NL'Gz ?X+G}"K:G9g* r?Az[G>Z#x F3݊hGIsGe ؾqG9ة" Ws8Gȧu1مL;GOx p6AG*JL GYOGZoyI*=B-G=吕qC3-AGrt~,H}鑅^ĿUG~NY꥓x={hrK GVڴ?|輞GΗk{k{i SGoȮJFjGҮ9=Ք42-%5GՃ2|H:H=̀G2tW]@QGvM6)\v3F{Gl_` 3=}G-x]$gGhA1D`xwEHGpq+  GH ['UH8vH o޾G!uVHG!Y:@ ;XH$ă}HɵQ.eYH/n c!*{ZH@za@"[ݹ> *HBW_߲o]8.HGرA$` xvHO1[w#Oܢ=vŸHbIj&(Pҵ$|2?Hl@Wu AԸrHlHe[δ: XHwf$zFK Hk*0ZYʲ6THq@rV2SHŗCwG)T_.NH]{O_sX-PJ#H,?PGN=H= m+@Tr t+HZkYkۮcxADHYIRig}Hǰ+c#6XqB"`*Hc>xb{׼鞜HlU(aٓJ<7QrHᆷ^ӆ?i aAH■V0P`\;Hԗoզ]HȨCIq&sfHԥIpGN/n[~gnJktm+OƒK-J!0TrJ3".9J$dR~ d͓J2bbP5F% M!TJJ5-odXoq&ZJ5o|g4Sd 'ELiJ?1 |J=ݚ JBuܘw:j@XJM"ÅilvJRL1:SOJRDwxǙoJ\הdAw6xJB{ >_,cXNJDzfct&J̠%/~ I9#7JH$µAD7JmE4 ұ ܤJ$,'#oUJCdw[vʍUJ4Qt钔W~JI|RerN7x nK!$^#K1_g~T PJ9~KE-IțvΝWKd'˵/K)2# cŚwK fWi؞ekKQklC <{K=1o [bX]ⶎK0zo>WKV ,ZekKќ B伕"yBiKjn괥*'Z!L_#DđMfLB_O}"]gj& D.(L)OF:"3  ML,;&k:OS{ XLB:ԚCj+ƣLMl0օ6&aL^EZ _UB'¬7Leɕf6TLf}&ABkM/Lr=L-B%+ Œ'Lx%'"H{t˪LZ'*s7Z϶ b|eL9癯1^AduLtj88HeLi67<}G L~|Ez"Lҹ;0ep-B6ʿL?J%~jmaL$'vǤ$]BL]o?Zn{զud=xm8L\O?%u0#Ll aM1%=*L3?ͷ,v?}NښLƻ*xǎ^HMgèa1~ 4[MuE:|MKmު9ޯ&SM)I>RV86M0 χ-AʧZ5^"M;C ~6^3r֊AM=sͱ!miǾMI)6:E XfMTUc6ίj nMX z._IW:RvM[K>nvb1Mc6=O8MdA7[}q\{PMibOYMkpW@iN^qMr9]hD{pGMrsx^Nk0amM mMq[˹1T˛!MkL").DMMOPa)/M|Fu;DtHoM؁QnWn56M[y=nՆ]aM{ ([7MӬI}r9;M©dfo(/em M>DzVdHjVVNM!$'Ǔ8M.LXB޷C"MDWV@cPMR4N?źh]9LM9ACixcMχa6|uMЙjUȚUJHFsMѪ_*CMz8tM4@(@EZ6MԶ1{gLV^?Mҝo%a.Ue cM᡿I Ac]߭"M|1 ?Y`XE4MRKDg)RҰTMD'פ?+١~LN00 ZV jN n|ОC=%6Nl4cȺkO$N"ֳ4ɚ(#p%/cN&~q^oKHK1XTN8NTewh=2'ȻN=əUoFrpXB'NEDŏ3+ TNM9a7f&U]2=k NZчE1 Fc4N`칁N(ׁGvNa&Ŏ`ʉO3]QONeT<5dz2=9Nl3X?&LqiNo!qM#INql;乼!?wNvm!f\ Ny6hH 31=N!C6uɾ.sN=~־N[Mch?N0NCrG(Y/N G)@J MN]Ĝ&|ebNǚmeSN!8fquN˅wK?sY(N3T,e a(ANjAa&{vCN͍#C7rz'F Nc! ;+JKUNO05$Z?G%MN#*j'X8dVOʅbtO <Q+$騍sKOM,tڙƺ.,O^"߅n y4 O*ʕhuStO.uo$ 8JO2n'74,ZO4YݼQtvO?*N?6bԕOS7fgc ZMROU̚G}Vg$eOXK*Kv)REw OqD!ڣ!dO{:]+r=OOqepxO^&ػ>c3q(hO~{3/*0-WxeOjq'gl!COإV6 MO.OYO?ɢ`ρ,ZmP%gGˢYSDhP1-N:zn8oewPA>9{1߾dnӈPSIxc[cw=ݠ9PYlޡO]KWz3FJP[ f*[a}P['85j+PbT)2nK+7)PcfaXf[?།%lPh4s/mO*lPrBe˄|M}P-̊Ⱦj2r ZPnd==;ga_-_EPgb/حagP2τA_ 2hP3jYv  uPOGn|[Pn{KPA0ʊ, LM$P̭{6԰;Дǐ)|P-p5icPva]Qŭ'x̱PȗDsڨx~m!"PظsjMMPla#|ï"@fPPP\ndHX˄ 3P&#)*M7Ph2 zEpnQ )A4|Q\Q-;F{JPswizQof(zEQň]ϲHF˒Q(s pDQo;NDEQŌcXdK~4WQŞ-:9:EchQy2`nv*Jv޺Q̈́2\Qc1{[,Q_]MTGQ ? n3&0rQl.]UD';R욫h @@*XGQ?R[}ytcs]\pTlc5SR ~/ލ>1DRet9k*K-ZhRp6dr?:5a2ÞWټRQ:$up‡ RasQvL; Rfb(;b 6Y0"RԤ$Gmj<f@s0R((wAYS~9jX|7S |o^2}Z`>dMS w[8_kcaǖ|,S#ɧZ}\K X}S,?ܡ2ؐfD S2R'> c!Ĝ"!՜SY'-x&aSd:M-PR2SqNs;2udţ;$tSzULNF^AYSjEfKhOӎ2$)HS9zrߢ2 mShI]t F(?S·lBBSc+oOS]Dbf3[9S#F^_SLi*BjHHpSk+74G_SڷZ˔% !S? ^go 0S}1u[sփ Sq/9> (`SϥBPsY3KC2mS vpڇ0QS߫`6jTT'Y?*ogT{l-;ͼk)Tዑ=vvЅT4*dCQCIYrrT.iD|!yT2U!Z}?&xgL=T7s4~:S=y T8r%g-v;7aT;kIJ!6J zWTC QsJboߣ T[ qEpسT[(X`:¢^:ZDTaeέ!@u }Tqsۮ !^?1T늪'?NE}R4Tx+4[g1B^|Te T:mCEjTu/W̤j{TGT&\10aϥݶxDT|@I/a#FbX^T(M{6`'[=,T WèЗ cT Wv9YT.P¢0P/2TGJWۃ.ATkgɋxTK[H*~{TӜ/lZUO4r /vVHYUw@:gϤ ^tW[U Pa.z¿[gzUU&yx*8=L3U;2}Ӆc+ϝ:U1>@Zb@r:LU2DE_31y\U5Dgv.簢UR3[@ywa1=ȓUT>0G @& jU^<44F !U_([lK5wUel$':/JUkKdJYZTlTmeUwQ^k"]=UƝй m6`U \L, %2UrXH=]/~3ƙUuC=[@+6YU:Y*Y/5d6Uq}9=tCw?HUǚ( с+&rU$1䛀)F0uUدH{'\2#zU }d *ˁ+UG> ODMߪEUn×UH ,4QU9V- ̎Z^V!\IEOh]V% x꣠!/VIѧ?+[\2)nVWWrM(dZW`O@VX?bD)CD aȨVr V2knqfV~eF"}j~V/;/7X@2VӉ4Ւ,집YVfL^CP*VȖ@7P-[ Z}BۻXUZ"GZZQäZ$H)T:55Z(# 5̈t-O`8Z)cD8YÍxx8Z0iNÓ"r ZF3;^Ҵܴ򁒨,ZHcd"28nNZXpX7}FNC;""ZoeLƭ|=ʈZp?`j/7VWDn`M㚅Zr/\ѼDu%ݽlZA-7Q~09eZ%(* \ yZ&/EX Z,Ƽ+Q ?JZo.m.<͏UZaVtPss;Z3t0!L'Z;;n0r#ZE|0DE^X 񬧸ֳZ˽DqoȨGZι֊UǧH=a+SrDvZ1 ]2KrTD[m﷐4Yу[ryDQ, m}+ێ[sܮ 3qh K[y,;Vh],w""<4\[:s1ܭض52ߍz[ORN&$b[QԤdk/O-aWF)[Wr;=x嚊[p/.~To.[O )EDbS$>[4~ tO_[WT`cO D@[œFwQ3q`ͥr[p]cs =J[{AؓKPu[ bϻ'_MFu+[no+ϊ!3[0b_a!d~ \*%2^Xʛ2g4oeYm\\fߌ@4N n\!])5Or]O -3q, 9\"ԶT8Q81 51>\A.GIkU-\BIy!Mu0̾kG\NyDp`r5C JT>A\W9svdK~(tT\i?5V`é"컑\md]V˳f>z\o^;/g-`5Y+4\wTxʋw \X\m,>jgLø\KA/!E/6X\ZR=odwQ`"\>Kkj t\M*\񟾕˶x؃\|!LZku=\ۭ,¯q |,\]L0\F EX\0I}VhB)!;ZY\c?3Is1dmx`\= 7`@ž7燆h\,gB㒩5n]F5,kt&BmE] 2(d)t7E ] Žh$8/x~].@X';޼Z*]GpT_DBv)~!]wCC~V4O]~Lztay=]!j.2?t[Lj>][MPQ!؀!+ ]Fpb= _3%6>]6x_v#qׇ]^t J^ҿ~ғH#]Ͳ5tDi\px]Ϸ~)irtF#()7i] ;OM /V]t<ϭ]b讋]D6ɗ׽Y=yմ][c@+HF ]r7ItXF]TK ~6 l]6CeQ݅^ e>^a\ꔍ$^uJN|h=^ 3 DQCJ\n^B1 XspƪE |^T̐{a V=*7^BtF28#;0Sx^G^DQ.Ϙ; D^LEởJQ_G,w^Ov,QcKYXԐ^Q,1;oGƵO^dGjcNvp^jUs5X+=J*T5^kX7(٨ dR{N^zyP.}ևˮ3^~`Yn~2/d^\^0&cmrj4JDv-^guͦ)E&ߵ[^q/Ͼ$ELtIGǹ^*džy NFoa_^1ɔ12Yj^<r˚?? ^aHEWsvQ^۳ug*vVG{^75vz11'A?[_V "^!Hf 4aq^UUw0Uo^Ԣ tPw`'Q^(+dP-oʆ_~8np_ \JFh-/Gz_'&-°[:J_s9q d[edN_#}Ovwxm _,w+6nMϳQ^f-_F/Ӎ}(6)_Otߖm2H_]ڌ o%s‹\_^O`,tgt?_zǣ^&6c_+ ex6,$_4 ww.PՁZD<_x |k*ܮ_l0ȥِ_$(P~Π!]'wښ_<a(yGp12_{t%(fL v35_ĤNe:3 tF9_Ƈ:fNl٥D$Z}Q_Nsh' 3u_%[s%'x>Df_JчdR)"mY_GM)E&_֘ޣ@3o0ǰ;_qޟ@(_ߙ q]bL>1H_~FD;۫Rz_G9^0u |1O_ȹ*WO2Tas“_jE͛Q6_@l[O&_cC-_8|`k~_\.k̔`+aQk C ` : "l;` ƕ3FY R` ѯqa,JCъ\` Бce>'~I=G `NWCVcd`$!&3嚇O `' "}55yT`(̫E mub7`?ͫ@?6SI< `??N_4z`M*O ^3~ar`MW;b5;aiq`bU)dqp '`c܀9ʴQV`vcT8tؓ] `zɮKJO!:.wlIQ`]En؏O*p4Q`B1sd  `Yw<.gs`2cL.ye-W`~t_s'US/u`1O?3`̠5TѼoy`WB/78ʖSB`ƏFBqX  -9`b]nA[c߃``,{-JO`ꀼ,CEz&@"w.`~B"XC`vxX$)l+`5GIj95KTڌP`?7޿f1( (a|יMtI݊ak?y=NW԰|a:taZ}734rF ab$ l)Virgab e~|a4jM%auȮM|xG D l&ao@0if|OaI1ާ99b a\Zv!NaQ_} Q0aJ@j0g\2zҨZ0aJ'= h{TYac5K%S|cba$! ̉ ;sg؊ a&[ˑK:,Qa5lk, Eba2N`b,kҝx۾ga…yĽX]LaK,^QZ3f$'aе O].$!-6ae}q'Wn]͗:D=aI9AV2=3a!Tfͮ8vT*\aIae8,oN4 P6a( Q[JaptLrRֿ.awE9a=Sߣb dP=pX(^}16}[bSڦl-{eW? b>>.bT~5E").b`׷[RP( bw?W zQ~ bYnק 7umb.w!&+x^08W%b&΢sb>JVWVLD}ɦčbU'K4-&PaVb筏bTI2|:b$K_ i9kbŚrx|PUf * 8kb4~:o&nrV$K7fbY#.6ue.!bѮޛp0&< 7[Y=@|2 EEcגNw-P55'"c\˒U#8$nȶc Ư0@ܛf+=Pc= ЭY]$-cVXr*>c^:[UAcUsޓ:)&"joc4B26CZlgcs$Q]G&-cժATdqp|U"3(cC®@LccK;hp+HQcg|g'mHId3 ̹؝p} ]d ߗFm d ijvط7\sd,MXfd#oGysPmNJ'Zd%*b8AV5Ed*,^*8<J Yd;nARBVp"{Vd<%)XvLdWY'rx+,b' a&Ìjda7qP"dX GQ lgdhLj_GxOdi,TVcN.مdx+:20Xg8|Gsd|T&xNbB%.dDGm{idzϧadY0v3Pۣ8dOb׈J}>9dVm.9(dѝdXH lҳ]Kud22 K,]8F J[dMMUkYWqsQQdဧlCd:dM3L>7w'RdLk*dۄNs$vdDiy5#xK+qe PK-B t~=0e 쾗E +qOc^Ue ?Gf2_z]e"ˋ^J I ,e*-I(*lMzUe8U^^Mz:SőeLxZRDCZeeZlՓS:+xŦe[הB}^e\DeO3n?kqNea䥱IdJ<Xt[:edG*{Ù`JAelBCsC Wleq~\m36ȝʎσeOB4BnMeF'}X)e9rTlea4x)#=sZGWeX;gVkLJҖeD،,h{!}eWn7TSeAV}'#q#E1e2.-hKm+Lj0e1 nvy!*ee Q}X (NJelCO+(@0m1h|eA<7heYe`?p_+/nZe\3]p ZP=fpFabqHf ցc#k 3f yiPDq1?ҨCjfCyGVKX=3B[f@pU v@!=f$Nհ!("6}Ef(,1N+Bb/f+ݪFh?삓fFgՈoN&$Ug$vG|p?gRkEy C&ge" AeaJἌgGax ge7g){z/q,[g\(ܚYw6(Qz7gZkf#'z$wg#PaX (hi(ƙͤ`hlo_n_LDho}${ ^0E'Gh~w{rK) [ު^bh@>imI ȅ6+Fp.C`ZhiDgiD֖M{iGw'74K\ i`<` p2nH7pk\|iaПG=}0S]stibN^JY<8 ifw(hdmY?ih_rl\%'$_6ivԀ3 }mYiye>òWi!{ȑ=|vjDii;~أiOYvVX i\4Ciؾ(HLi+ܑvkWl"^i:"ΐsӨ1iI"9C=g-0i4"puHKiRm6~ /R>CiF*!0yAit]9"wl\cؒj-i轒󚟓JG6_)i*KK\Cblk&DiTY]ti?,Az!=Bڡmi J&jˀ^=e, i뀋 ^B2|7&iLAlFzoƁ%i"+48McAj]/l ]MjWo*dVP:(j4 :4-`&I)Lj-ì;#-j %%SOWØI2j0F02䅎7Z>j4Ẻ>OZ%^q~jE΂V:CwWjO T=q(jQz|*fj\A>O*zP(.Rj)#yb$Dj%H+Qu\_8Aj?=z$mDkk:a/j [̤k"j v䅎'yqk(l.CvtcFU1k+OonŪE?,*k1B"v4ox%kFg6}%seh'&1kV z\.}DYkX1!(b5kdO`=e"%|ZWgkfM/jURԬ|jfikp\9U=mKi+k~&қz~p8/8ke=8T^)kkv \>͂k|"0T֧Tfklc8<‘xˣkONGUё00<xskzO[&ʚPOk!/i>Ln)^.kYӌ ,D`wk"aEG;̦kE9-*,kRٯݘ;\_kEG!a`RHkDW ϯƔ;l͘$kLYjQ XoU3D}k ϨϸσZA)k/srhk߲u|sSrs)kDs'ܽjIPkX;S3\u7k;uRe zn UkuZ%~^k;Ak8U)RGlXl 44)z/\lk"酛P'BHl6EPk"vjel*f}~&rnuNjQy ~o?yD|7Р=eE2,po@ʬ܍5?$=troI)or۵d\na#oKl ]e~)KϊoPV"zQ;p oQk)) N}eoamv( |8XDol G4붥x1oq㔫A isFEor@j6 `dNooRzC}[w"+^o:2+%Xc(Ao9L=N,osWge oi(W͌fA*vo&}ʭigJOo묅`__ ǻyio{x>Il3p=mK=$95Dp9s;7~RyZpV{7&Y4 Ҁp{8 bou/kp R/vk^AB3Lp~P<|ޯ!P7Κp!T}XQAfIwp#YGaE# p$z|V1i參Q.p*Rw+;. `knGhp> !Eh"ʼn}EzZpEXZ*JÔEBpP(D ;^(TuGpYx[fqlnP=-πlZ[ȯpuѺn*݄* n pU%shpr4Zh| H]H-pȔ4 9w0k7Ǧp˺9cz 24$Vtpԑ`ӡN k#p+οQܠp[2W7r=;u#LQp rmHqBҋop3Jrkby@E[Dp=r(ÐzP5kp=q 4${pQ.|q"3UqPf9|nƝjq$E SVr q-iP/Y_;"Lq0 3 :Z N I q1v:}BIJ,iN$q;m!)eڜ!3q<5!nVJZЄ-q?9=龷y(ޭa(qU`߈֎*WpqZ}($n qotP~í$"qy>| ܨxH%WqL4TMxՄ*q9A-8l$m(Gq&1*yYrZq͏<Š4|?;zmiEq -$I 4qML% gϽqb|vgi`pTKq<Ķ}BN#rq+1\RI`mq \m-q̡u>&ֱ~-r[D'tSMqMsFq'?d4sU{+A0, qsVnSFn-6pz~@sb x}fFke.suXal.Pb ysu-Pôθ\y!]s}Wv SȐVhs1JYbm&~sQ>G扫]Ps/Bn يe)Ks#>O{tsq <)`1NQOys?zwQ޸Fw.sVD#v[s>Eフ1|Qb|t5s6 jH ɣsmi}d5|qsi抃U L fs@K2wsz&EK2O$sb^Y/l[t0qv3P9jض ?*t y8˵SFSat ݍet̬ێ%- JNuځ}YFsԧ7u`ڒ~⻁uqXdUr/}#uR@ ޷Gg 'u!::g(&Rv*z f9O_}!Wv,qAU(dv +䬽 6v `k= NF tTvBD6'9; v{ގ^7I4qHHvC#< _&n%)v2i u5 vsvQ2H1uFv {";+yvoX W+vi:+(dSyv∵IoWa=^v ĝdh' zESqivQgRO?v#`js"mSvhQt 8#ϼӓvꨡ)QBtS$tv5l#q[GX9v)Y+ !7 ,wXJ-|S vVw( ¬9"c5-w )MOfZ̍wD)\AFK7w>YdYqic1ew"_E{:|XEw?i9 >?عw$Kv^O8=.jڒw') y9ޣFF:hdBw(vsՑ@nzPhw-R%Y>w4cud/r˃DwSBLN z^wWMss}zVUwZdŚVl4tW w]Kٛ1/)>j&awh+~VI|8gwr6sftqO(ow{dzYa,NT~ p˚w>!elh=w~ S+oa7-5w\A{]F w@ :y0 +=tr,wnڝ. ͑*|VOwwj/ w @wcytbJw]JQ>jRb;wJsEH%aw)l(t,,yViwepZFa#wv[b(WxQ 5%Nl#| ^dx,6; #x?:P@n"Jn#;ym5x)G muEZsw}+x=Q[͢(>w%x@xGp'WxIz]V^$pxI98mgVd3rxTn5bAh;,Wx^ N8&r_ `xvwg=_&x{E+PmmVU$ptxvW!k-xWajLzjy)ZxIU:ғJxJ.։֬$axեd"vxlzx8%t$^ɇ!!E nNxzj_k)*YxC ɹCl*rRTx՘C #vEt .6(:x(zH-g]Uxϯqۆ>t8xE ?)s@%txu1p־~a.Ox 1YcWbcEgxKDkB4| xsxDd 84u`qy ^j䳦|"Ny;>ةX&}4 y%*Oy2F9tqxy nX хOMֳ|y)۲#o{GWy2$ףރ3Oy3Q?p)5yy:MUh?~+^'2!yzAUcƒE2VZ>w8zA׃?UAۣt7 zK,ƻN@1XƩzTKŝ@ z`_J br۸zp_GQLfGm1zzD6"QT|gz}8d7AIߚ4z-;Ә8糋;1z^*E}헨KBIz[`ScRizW9z90lhz*(qNRyszLA=ş-z Do1 ,/zC3!N~&jzr[հJ:x*zɫC4X%rz˼.Rnql}zz֯[kv!CW.zb80F`)yz@;aj-fRz. ~ NpZ{ڞ` ,tPx{}E6\o'ʦ*[u{N4C!;Vg lX{6n 9% s:\{oOQQF I{4ЀuGyhڹχ6{B[Gh%:RB{Gs`[U%4R{X7*ݳDjiI94{Ym'dZBx[7*c{Y A:aJx¸7{i!L4!.:ԅ+{o 4 /%U N{z>/h2Gl{}Sm"O'?&{/ܟi$7嘣{P#ٲ.sg0^2{ǯ{ y۾5pϯf{K&C6i{5>:<˧{ #$$x0Swm{~lQsČo~ ${!Az\0GC EL%{N蹞ωm\7ǀ{_A0Cz >dWT{N%||^d0U|ij#XqL窭#|%gHmkpg'|teɩoB4_|M~W٭FpT |V_n25SG1A|˟m x%4|xl[)[Z_h&K| Ŵ7U| RX:fOA8&4|#7.f|:+Q;xhg?|ށ?ًX(]^ }i**Vp}aa2uZn  }?9SB}D 屸upoN%}+Ĵy|;IeZ#}1א: ku9r}9WoYŦm4}=ty$cu&dL}@ ȵS;jxYV%d}Dcow`0Fn}HCly~ XQ5}S 0LJ;꧅)v}Y>5زc`<{ܬ}[Rؿ%R(/(}a4%ˁ5a۝db&}kz|*ʌ}v&VKS_"g-}zjE.H\VTX_(}{\)Q`&a}w ڋ ұ}'@5~Ȗ>& :}B bNX=}/B':I) |Obѣ}B^6 7}*Ck3nɣ܍b}\Ϣƅ7RgZ}BM2:}ny"}~|*s_rEA}ɡ)8K1Tvڤ>-l}Յ4ᖕcl]}tD/ Ǻ } 0^GDA30}p1a@Pҁ8~VTJ0׫~ ˙= ftuE`~B4 )te4~#.QR;>~.EYHũM |v!/X~9xM]^Y֊N~Bc% m]+~N{/L5?B?}sT~R}&>x ~,>Dʛ~RaU(hubu~]lbYY΁>*m-D~_ >Kx(P*6~aTcU-4Sso(~b}@I OCȿ:vY ~t=N!`\|_~uqbؿ[^~+|9=y6[=~AOU+P"%3ǙT9_T}W~WUy15iԐߤ?ZZeӸg2+^u,e|-?fmGW _:*vqts7%/ȪTW4||P|kꞿw<чe {ESAFN`xi;!.OmAUT X! ;\îȠ뒤s,k)G} /@`ǰ;*FuuAHPYa顬)Nq/5sO%c&716X|:oj '!_2|Dъj>3u@YycNV^7QA'znqx\ĄVj&xtd#=?Iᩦ}CQE-:ꍙ\gf"k#C,@I%(U`5g?h,Zr0eOn7# IJ'ҁYpqxW` ؁ G[ ۿhSE= 渙@kF)4f@=x]hFd8'W ] ҞyQT{^i=΀MC:Wy\J@yJwZ[*4~{;{l2K9h 䠩 ?NEީ JN=ROĴu|ZX0d-+,w`瑐͡:Ҁv_6!86cN=7р>@9a$,%"P>?F8X=Bo,ydz)׀-A}VAxƑj!Θp^P8"K19΢?봀NQ[1),R+Qex1aγ-fzS:Eȃ,Ml/)6 ʒTJKc|ݵf3^2f@@9ا B2DuV صgv`h8 D ܡO9DĞ=4la*KVlM~lr0tJyfڗK$l~/EL5gϠ䩂 A "Ytu7yi3 $}8<ьh>P"L­Z};=tV;[_+tO>y">AWEʴAo]1$&[Ê:h Mn iC곥yK_ZςlͮrC#aςp)Ge< Bq^"-:t] gereţ Z!,Gu=W7}zPjT Pdy}1K+_"8Ԃ{e;s3mez.^vzfǂd 6t \3[DW&oJ@ī;䱂ZٗVlL;3Gղ"Dȉ%-;@KQlv{d@%^]|L |Mijp:8̓h7+Oӵunt!7gӝ#F#/Jr7+e@SK6&$;97ŀˎBǂk;s ?E.7 >AEj'9'?o2TפGlt졃@a8ĵx6]a}•9]72ra5 <;3aq&@TXt<ެ B#owYCMvHKK|+}bWA (L@5Z\쉗 ЉiD[؄ZvGQC >DZ~@@ӆA<`)1j1=<~ܱyeS2WڛwX .%t !1s -:$r di /m˅=&~>mqPs6 |B*1w):D3ֳ}rsFUЄG9+}]#dz3̅L;jsnOXW ١J4\Yza7LmM*&?]rg ^5Kju WT_Ѕ/퇼<)W%x)?'aiqGE܃jLĎb]@998.oBR[Dn1$ͅ<xI։E!mz8c 2 bOIC ùOw iѱ G7L.";~Ij;^Ip@k\lN6+l8߳FJ} rCtm ^&TGz_#HiR'p! I{g ydS~-\y$<,GonvaEO+4)oJXڗE2cb~cP^m6 j]Wj) Xsok4MBtV/wؗV}gtH:wCxJyp~?j5`dl[\#` ͣԻd[F.F ?=v(ȫb?|_x33І,G37B#y- M.)"HP;†KBS19*{ggzXtrDKl0PU [Ϯr;/ȥ` ,2s"IHEt![5:cMJ.Hfͼ( , ebLj$ÆF۱ekVBLBʇT.x_S㹺! )_B6i; zGZT6ޱD'b"&( lE.\}&B}W` !2A?-4w5#}W {-/1]M+x&뿑2 kZef^vJ"}g]{mȇ4ԲWO?F-:;4RG&_"{KH#6yU2&#wR Ӻ^$:1JhCłrSk.2x9/ RkQsz~hްM>cl(̩ Y[xEK[p:%VJQ R 9sYv* J_/Ħ@{–M6\M0RܤZTǠ"SYM4lOmJvvfPֈ1ttn[@QǏ[HXȾg[&@M4{iJrQ)R+N?,"?LRӈ/Xs~+$KΕXjn+|eme+c LSsV(ve.1XJ6m(I{X^)Bx9+πh?FS{ʞyөGza\1ݏ's +C .Sk`[G領&, } 5u4x .w/V+uW肎__ NMo uk/FMv/֘^[ PfW촤^`Y沸kэ=Q[6K'X*;5Z9ka} e'iŵJՉ;iPۉ$;FLCD;)*-̂H]CEGS&F|eh`u)MI$' עPB"."i;,]T5@Z0ʈ q:q2a8`$~ٍw*c[&$_d`]'/dOH6>MU"ۉg]9p´Azn'LoSKIIrx|MG;v2!;QUu2F 2PXyɚge)!Ѯ3A_Cԫf!F%!aN@igR_MReUjN(kv9ىh4>G`Nِr7Љ4Xф%W ;2RՖRQkÌSF0 KF:(= jJ,i59n_:|E4<5<աI?y6900g+pAMB ogBeM]ij}CToCgUCLyČE8 ƙDb|^}Nf;{$kʪrDov׻iJ?,_y+8_jj~=\H88dS\,Mi_r ;sP|=$Oǒwۺ (-=Fu#N ?/O"6̌˖fkah_Ji 9Hǭ/;$tS8M.~: deȌ[3.c,QQz̻  N4](0UqSap1H 'tFlSoځM0H0NA>4NS?di n)37_4 :0us}'$V=cD5 R42ϠPOdd'f %ה:Y]uCS4kP "ލ!oUC$C7A#$ym6!l0 J0&9zlc(0t[4sֻ2"g' :\ek@s'/wdnu JN1v䍬7 ~":LLASJ[yu`_Ѿ6sW(t%_)$G,u8]ju.ppBi+u ^|Sr#D)/NY 6x t /1<#ݑ>8Fd7aF4s=Yq1d;S 4}!+[9V؆~Ў׌8Yv[Cs3A}܃)$LrUmW%1ȾD}q]B3S@CrbaӣګD 9p Wd{kHװ$ʜyS)32bl0{E 1@1 l <TbǮhĄ?(v '7v rSR7я:py. c.r-B92sTߏ.!&9/]Ϟ1 `SI˺R`1C5$ᰍ~:w7ꇲ)V2GEaQ94ab0 fy Ã><5,d3G@c'h' >>HD"/r/)]#@)ǏIa dPj0Jֵ{MFzAC ӓS"9I]qef鴨0h=W$q'H҇@0;.0r~;a,l>%9O/ je*n:q;?.oAd(f7cO5Zh\/s šǴ$? kQv 5<8~6Ɛv J b*<kQ H?6M"a>/?%J,&cc=uklQe2wtCU Uq}YĴn7Mk.YG`iuPL?Ћ(j|)ue­z ܱ# EyiglBmK ^T#uORѶkGADۈYAᰚ:=8Qrp,FpFf]Š\$ x8.ܝy~th97ژʼn!;]2ctbmᑅ1QQ"kin:ɳz\uh#R-6sguHG|aElg*aUHuek\N^eB^6\܅FjgL4.X}l{7L+~_One|zj(^H`pp4?iR96j1|\m1Ԯb :b܉WU&RX_TjC`b7ؗgœ'lh< 9H[Ó'uu/hw XJnӔ1. B9q-XwE>{5_J3:! d ͥo,Ou; jvlzd RM09 ~+5TxmvVlm5#l`PѢ`~wMcgi9&-Γє$_zVY#I駅}Y bϒXCcO/p),)&)8r"蓳Z"4G;%a#aoKkI}byEQY)VoI>NND7Z.qFidl} A׵ağɜHhRotx+L{'8PxnuX¯gaѼX**ͻGŸ2F|J&$N3 5A y ]^2@QGz`/8ϓ|J@W( `'#6T|_lFsNxWVhzvdrm! \{Vo̖*ǔazJ?f7BD ˇd95`D_̾G>1lD7>ՕOehHD`+_Q%ݳ PzoǕ%ImaVlL?p>* g O>A\kL }H^:qX֬;68.ĕBnxD< ksܔ,keIK$ |Cu7tPĭBRmՁy& >aWY6;|}]hJ Ӓyնlp2hJDeN?! s.f1\dؐ郖zrxe?7+DsCS 9KJv8* ^SkL=V't?.SOe JgI篖!v#e0ƞ#thϴ?ؖ(+ T˫T!WG@q-j#RQŋӶ;%-I @vP0'jfٌމZN?9C9%˟A:9K\sݙv܊,h¬fҍEVhNqPt-ϊDDK͖9l( h"U  Wl]rѤqsbo&ȅ&|nc%O`< s 38A:? տ ӽ-Y$ј.UcpbA ӗzmL!f177@D3dC.v,VƇLPQ ᅱq,gu粧iو U—,Ck7wά*`H3ʡ?Pr5SXWΫ#p!RWyVMvח!C 5~,*3'-ϰ:<"7(r;q<;DVpLB8T/f bv~Wj@'h 8oD"Ы5K&TR58in+_RxCў"`ԙW֙2*_ <*,'O2[:́|m3#˜!m&a֖ŷ`W%9t9y3'lʘ)5^]@;x,:S'~*6k`7klO5Bgdx0t\"o85 BȾ&e9Ny;m]hyHm͘?w{9j_, G@?C03f ;v?2/Z% RH>'5`+r_ԹYÐgknL[E Ϙu]VM.g Ce~Q#HʮK2)ݘ X!o)16TBtŨhn gȘ'ɑ,(6a Yܘau35aL4{">"uQ2(WNpIT$Um^˜lGC^V☩6e$֜_z5*CHo!q`-'̔}q烄;\W)9nXLX(_ @U"AYr &`Q;%-uE=;OTy`4*J#Oقϝj !`+Hc8A>#ez  ֈ5C%ͅ;<٢PiRȪ/ Z͘~_$EU~G1a][%r<W]HAm>5h#D#OWϐQeW~L8}m:\|=2@$4eM?TLזٙKOĥR#nDZtY3B_箷gʙ!v5 /KSᙿ%{aNH23ئI[M7p)zinN"iƠem6`˨kBj2V763⌙ߤu9m]h"eW1QsK6 |_ 7@_{!Ou(31Q6iа<:%$9Ǚ^%sF&BCg-ԳQwָcF xtR+&>t{o@%rəܹ̈؋\,GdC[1P,5=MF,N7YwQi9F6*Ub")Dx( ?I㨤J˹z(䯑+rujqÁ%)ʬOCx'_l]àٚ![ӚfzʕX$27%>ai",\سX eO4Nw8l nFR+^>QԻ gzqsgcᕷެ/fQ򜗳ܞ;q:S%zO^yCU a˹磾kJUF1ԸJ/ֹeۚߕ??; S;a[4V([FjL,hMa=Ѓ÷L^{;"2FC4BtedEsaaSgiZ4|H= @Ĉ. X[vs*^XLm7im 0Z%{!YuijM\CEu9/ћ]=. aToI4P?^ &)h23t.xN]LeUp!1 IQE{g֐(uպ[T]:.rGN$I Қf VKe0>j'3?@*[HrJ/Ahepp؛|بQqERַ2V/Nbܟv% EqA ilď d/dl" R|q7,q5pOftqL+NG7IIڨ²`&hh{@9_wf["R5vwΟ ⵱!X'ղ]Vw4?>[Ut@a#*6UDv1Z>6B'&yp+D`^=ʗȝ-Nm15s0~_GQ#{;0k=mWzI{L|;Ȓ}~}x OiqMZ m,g0T᪘rCE 5i/ͯG;mAEl[4AgmyF|S'J]n{`Gn@_Oz @g1[]hԵm=v͐tUvj{[<3#/E<)O519ha5R>?7Eۑ}hVR:s;~uH/ցGݝCBbuM9e/aF}4K&/j]oC4 |ӝa %Rfl0뤪@tK_ 5Dm8W-|b$w%|D_AZҌN1I.D0̐&UHo8k4IGp/@O.`B']cni=ܓdF?jpϞG֢=Q` Ijbwa/Q-9Lf2pތ޵QԚșr*auu:@7 1&U=apMI囙9#_k|ICcӊF\O1NLly,gJd]ہy.3a3ub.[Y1u|]i!i3!G*v"W8Ip PĞE،3W(<̮t\,1K{Io0< #h:XBpeS?Hۦ xu98Қ*$xg]E4fv+ygjYrHm0ܟjվMk-PL\pɳD_Ѯ=zBMĭs uZz M.\>y\2W-LF#-iI>|3{V|kdS`>!Yal/ۼ*!˵RCK:r_߰Z~VfC1 (i\1mEꥁx76A65_$bspt_ǎЮM(H 1MR\UI7^FHmc0Пs#A͈Jz͓춦UV3ɮJNtĎMeP4*?\xH[bs 0 6pN/ A4}:&,Vyuo`F$wm6%|*7scGƠOq|j2/P$WLkTKf{Wآh?:ݓ R&++2moSD G*O򦻠rp˼Z1Devv)fGB4*e$p#a?r wWn,~PV0J3  v٠hA d5bE B*#0C2Q 5)*1BʡdzsPT18&sևkV F,i=Wq-ȸy\mc5'T%$T2 ~5%_r"ڑ /'<:XQsTV@;#TzIכLu˔pb2Sg;>o+ßVUʢ6TԸay.KZ2P9#DiZmL$ WRo fc9aJl /JY0!_WO!z>L1">d>/'دa@.^,?VGYW^w~tpu&qL Oō FI_̘fV78)AY@q~H]c_MQޢ|5`G`Uaǘ-Ɏ[b:HCQF@-.Mlo"oMoWa MD1>^=㪢".Ի.H ~ !DdF 4_Уa(s`! ҺI:K) 3CA<; [L߷mB :aX. mn#`w; -Dw-d?'=P%^E ԳŮryA"+fNt 5M~8hBkrReŮÙSefRP"K%by?56eV&:sK N2ʹ.99'sOD@jF&K :ڃa6T~;LJEȂvSy,֥ݨR'cȋ9Wi3}*:Ţ wu)eT2k8 ʹt9?ئعb:OL !nFn% W✕#DgNK_2*S 8%H5>ɱȧˁ7&RF'yQR-jD͜W@H_eI<[gvZ& $ ]q0Ix]2HkKTajO8Ҋ%wrޣ~s&}wI?F k7P\qfVV6gK u WbXTc8!os+2z\Fjb_ y2מ`[QPl(L z2vFǾ2 9|Eq:3@Xv֙18 }2?bԌH:*ˣ~vVؿ VYObIt1CFvCO諩PBk{t5i>/h=eXk?5H MHSgϷ} ]MGC5NT~Kk]%@bBd Aqˢ$ZddࣙUl4F2F ӈ/Пnqp B7=@RV*|k,YNB).)2\{rԍ9}?bZb LG<f(}R3n ]N*|1n(|2ם5-$XGO͜RmTכ3if Zӟ[zquhf@ }Z'GsS|Uu~K#cF~6uIp'Fa]ˉW_g%ÝC Å/\T~Y'Nͦ$ 8amղ'1*02 >0ԸIU8GoBp#Ӻ8ҤэNm"C89|sfgfr:+򤛐+'w<_@ㆤxfHI;ZZQ~Xa&.k({B ?v%.AbaӲLӭƌ*gs֟^8͹A߭Ve@ؤJ47nXѤi\jS^vg*޶cwqfߒt#Gx*N'xrܤE>}Q6>gN ]?0 e';˦ J c1z+ ԗ^ALuEm\C,K6|!ElvL9u!|2$l5bkx}d&L˺]!Iъ,R& E/ 4ߥ;O*i+YiA{DZA wFUr!8,qdLL 98+8 ֬ }TR?oblZ|\fn5Yhua\x Ѡ+zfj4еL=y:եjRg?X۵j_^VrjnQ'/p0/dF=L_ Gni! e[j~ٛ%!.z^0GYǖMG:%u8%*뫲\եa I)Q1$z`8K_d`Ju(U{- ۾ENO;1|$1#+)6$; ;CʑU:T!K=Ģ*1u :y3}3ծZX FbVfVxg["U>2[Mԅy5*"GSco,^{8Ϊ3  .BߧQ]4zGn ^P{@ݺ̓IPX5'|1֐lqE%Bz%%@(ʔzIϱ<2?q+#bԸæw3kh҄ 9xmsFET7t/C6)M焓,oF;~?bNyQ%9Awhndc\nr'O \49ycT8\ݧ$fR0fɭ$ѺD?ebZ;,{K$`t>Z&3e.;թĽc,*5}pd7cZBP#et}h S FU_0W,zob^T]!(&"-iЛcňP¤ 8bl ^"t0ezpg<sci90uԫA'"ߩ-5ӽLF2ZR Z@0Sn;2ai?䧫R/9{}t|r99Hw=눧-^IjǽҰ vG{_xQ)2y,r8|TSg fЧ{Z<!6"p,@>3j@!'*a5U9ըu!;ި E}k_4tNݨoeeQ^76gy;)ބ;PЛšSN <YF-ڿ5䞁(pjxP|K% ,ԨQݙ\>Җ 埨\*KӤӰYxߟ^줹%$;Gp%b[Z?g[$ngѶ5yW びM #zqQ?9ީ w͟dbt9p,fVƏ !1EW>@ڤ9/-.LTLmNk?cʩ7Ykƣilտx.dQe+~jz6 T/ʙԜ@2P`K<]t7l4<)b|K&Ce]g2+_ y5t^nx(Fjvc`"ާ*2œ| *7v6s-2㩔_A-|($Gl#b .[1>| 4ciU5Up^~,G(ۻ|'Y~yS)/;?FJN>p7ZKҿ 71ʱbH^[QUG-]뼚WeNER͸J}0/WӓU >]\[0>uO5!ݢ6 jzpw"kT̢qQ:l`:J0;I$;;%sQ2=ǒ1Xrm3`:+#gڎ=OUbyY,`@TOxX#Po(0!)^_`. ~lZM dӷ Kц몀)iZ/ݪ[}4Goh#a+r!B&;+Ȫ7M⓵.sMj ?/%K:nSqu:묄y`T}A eMY-Mt>cW@wSahVmu,sՏ夢0};8kێ%)W]NsdH<.pmD݉@Ƶ]7 `%dFej{ȕp=rɨ=szլA#jIa%a P;kEV $h@dHh.CH4ާ FU6KKD[Sk.^sH^b#zT#Pm=3ۊ 2#8Ю]^קam`\@$"^sPDjŨ &kˌ_/\J^]+q&gڨ64Ōe||qҒy^@%W/q2adJbg键(#b^m<MOEHg{'Pk3%\^[ۮ'6.JʃkFg%®g Dt^Eee%NC p4 9Tv&?gǽ­jFOEsl)O):g,X}IFNƯM$#]^/KR7b [%^\Ћdc XgЍȍ!k!Bs;W#"w< `ud:RQ#LkAG4ӫQp3%ObZ*!C,KÍ-gw(EX"܎aL22TD,bK'"<&3qgwi$}( z9XJ8)Hz4:@Q%vԍ4K`RyF+W牭!F$%gt?@ݯHٗ\bR"/tU#xj|;wlNF!DuQZ~ (`Ƞ'(+ (C鵼2Lw>%274+iLWޯwv k1O-=UP`T~G?O{F7ǻ&@J~gmŘ2mV!슲lï4HEBT_sKݮŌ;(C&cp#xYB]0گ6)KuHG(YPU V5aIXZg- ߽U*W[)Ldkm;]VۚvR>ՔCV#>ҤdD箚AEOok1]:l6_12iӥT,lwvˤg euEУ3R\r'/ mV'& "GSnxU vKuۯ'|`x:0;a$;9ǎ1xj=OǬ]MHg_-FBmF mXV=L1~QW1Bڜ_SʢR5Ϙߜ[=v1˅I"Usd3w.sa>%ȵb+FZzgѰmqXearw,`S;y#VG.F`ڠ,+W&[oP( Kb[qa nFo\űN ϰ=7Pc M:Ft0YJ]1EGW󿦰&&PjIGߨoguwZI-,.Tl+ 6P:xu]@ $*⤆밶`,u. `}us3Yvn PKr`䠰ӁُO `go6C%LP)~C,ۺL6Gװ42SiNzM^ vʍJHW/U8NB'ݤӏxKTO2\Sb\GrhX=HyB’5u! :v:2 r^͔8X _@sHDx4 6ձ"}Y43 ؇Æe$(~[\rag4}oű-MyIHBX1Yb]Wc7#N%\N^w?+]ʌ↮CUsZ<f_$ yp?Ҭ6܎q`HZzwiQ[s-ֱ||7k<]>U$9~~<L햕%\AH] 4 S7 frqZܱɶVl2~<+{j 7%plA»{ 緫4e\8ԤK5ٱ%֞}.LKay}`% S3 ,!p%Ù*J;}`!kO;ԧ92vKNFDWpa/&QʱO2G;l`;@ ZjkY-^eDuZ|H7-`?TvP`)YZty&5D㩳j<ƮeZqlEf*] _ʲH):ՉjbDW#@(S3^PU->Cj5N@,Lk=8=t> z> .b'AmVkH4 쵲J&+-n=L'l R:% IӇѠ ~ZSBLia )$aV:f:ذ (^o9a8M!@ѮXg,ƅ1TpMY\Oϴ'3|pVHP*_co^sݲ|.2YUZ6M^*~`' ;[T~L.1@p.HivN3E8^%t39 "=-?+ >(]SRXAYӳg ,#ͣhdFn;Q[ӊnn!9B<'ͫapxv PE#cd[AU0U\B\`u ;W҆fл}PtEŢKͪJȃ$BfK9ܻˌrHs3W@ulz'/Ixquê x_{!Q1-bb?G*~@a~vvIQ/%N̮E'<f*ڳMT͠'bXѴفwKM1]V 7{Vo^Siju9Y>s/3δۘ]kUd#%7q-9̴\08b[`lP+VZwih[WMlLI'#Kw ɴoŕXр^"Ũcϴpp]\R4 ?]B|O ܆KWC߸9'>J-E3a:QZډ3joozގԴBr& a/ ( 8lI TðP:~K,_&Zɵ2-kU:)}w!@]]EtW|$E;< UqP hEOLڃDƵlEmՎL2m5r7tMniti嗚Ǒu I~j{ O+UBHND5[fWV6#еc`0iuႪZabDb$a5[۩RH%Y|mYZA qP8w (L.UKyܧ񸤓T7p>pPq5nYZ0ض 9T(D,֑S]g+BK!n#q7kDŶhX+NF:[M=3= 7@eo8hŗy2.e-n ^Ӊu&XC5Q!.{ثi;D9G٧3/d9HOEw!ŭAN!t#<2fXmZL-;4@?VmZ*; ,Lc;H0fZFO/Q dтp= ZuOh zviȶx{uL8Vj|`ՈfKӢBLpyݶs>9؁F4K%q($O^3*J'GNTnWඎGպ` ˥Cj<`2PS sy7-lf&[&>UyZJz#i I+_: Qރ=հMqim.!sh2JPŮOnB>[/roe*Xg6MafP3ng+_*qaCҰ]@gE5׹,ʏ!Va+ 83<>x?|q%!0R̵^HoJb]Y=öͪ >G'%4d_W3[XW&ƶյPɁS~}g{ثʋ(e}OٌB^:YZ֬<3z:b7~YS|>%Z4v rf ~^ 4А|CWaLboȃwLӷo/Y;5d}]@d2+Oc2%}}O>2A~VtQI94Tk 9`*vJ>[K>>1đd]MNxQi[ 7 zWe}r2;CR T>&9I&%]HhwC\$xBoԑɐ94 vM}1gY[Ate,V*3].)ɞKk2%9?,*ܪ$`[^P#)ی?ёx&+'D _7Ý qFW+a;޹7%h"k+Э(wzX)7K/PJNV뫫m0~I27 W2e7Bb0fYp3S]ݸ3"zPh^&7Yvb s3q#¸>-Z!S b[D}QZ9M9czEV:i P/$DoUqTT1QPQ2AZmaƸ^;ͫb}QSǸhj2!"=ǭՁk&>hOMVsPBϸjqk{,@90"9lyʸjf'k{t|d"EWnZ3꒠iwn`\)t*y{p6Jn SB(25Cn&L%@b(G!<^bO@[㓸&Dp^ɵۏin xީN?,?qԁ09g# 3#J oLQ¼AȂՎb7PsvA^@LUոnt]e >`Q0;fuILanղ-z\3@Qގu@% MT--{-h\+6 sPnTYjL2} N?*_bNg?HUZDMǖ #6<6fk 2Eo&rNI)sS<ta!ۻ 8+̹@ _YkIׄ Y$p1ՈFY o"~эw(v 칔p:'m%'˟[)謹SiyR-Nq3|Kx2%1RlPx#"&ЖFE)i[#ۭ kh)fZȨjy ,lbgE}xeAE7 jk;,܉+ۺG KS@R)!-p*>?E5j M(ҋeuTq:JMBw5H&RыIHJEEpă-dhM:|u-2D@ȍ/ߟzN7o}uȜ|!7#bTP)?"N7#8l?oJÐuUqs"a'4/f)W}1oh <{Ɩ W\ؓJs dP.} *g mjF m8YNnK CcյsOV譧0E5`yJ_rYw <<ƺ{͟.YS_e񺏥I\eB^NgٺO浽Qu`P9kdKTfLod+|㇘Aj[rhUL]m^꾺Zo]ot ,ߺcUôR\\! @T㞺]ޗ!|+\ӊa>L2mp0CᲺrOIXdܰN'd C!+wɻ3E'R<tH!|I։T!A"'HohI>-<Ќ*rẟ/@7Efġ>#F}3-PWw;xR4kȒACh:.p79JOiμq2 |X$F]-11@FeKnsÊ[H2 헅!Qh떺k/D`u8O(m1 "*-*0je aYS*P4)ۻpTX{ ;-5<5lqOVcRjm)6RazM& ﻘ2>}h"H~:Ȝ'OuzIaۻAx J)1l6*o/ɻHvp9QWK㻬uAtpm XxPvWe06%vڨtIDoIiz #~_V3% Z463wl%[A B]˓kml7k5셻Շk9rֻ8 ܺiD$ 4HdUEy1IIXöiI}/&C4;K۞jI>U ||_˾Kfo+.+߷P|>l`WI'+9վc4-}S&X9jekg Ⲵ smZ6k<8/Y/OӾwt"ZV:l~޵[7?1?m?;쾂O (:*W>}+?wԥk(/bD>w@>z;"eOy0aM+)»rs?1lZ[7E o㹾fN +K ,` =>GV`棃WxZ9dۤ%5F E~~x>a3 NM-F5*nSol ڄxgCRbI{{[[W{!Ty,SЭkDIr(-z@JLqP5S=$ 6. ^Z7ga.U5u1l+! 5v , UN*b[SHRDP+*+7V:#G=_qwi7hװ <bvoɭs'0crL-#@4Ϳt~B+>n'hcxP=Uyo~lSƀ|zq="`׀ ݿd:cdsHנs<Z",E}{M@V[Q{Ը;ѿ m E/Q4cKu.Uэ^/ῼpg{5s36L--ze1VIWKևC^ {y V?3=~ $ v~hɿG ѯD׾ckz%fu\Zۇs6->d#8gN+./;v]2i1b!b^"tm9 ":Z98eG*\ ^A>Hc$ĉ*{$]K. WŔ XIC_qWdݯFe$#\^tLh`+___sHlԵLxmfȔFmwYޓTAZ s24@@( "] nc~pAYtC9qM lae|p/ O'c *@ZBHگ)Ls$88]FG¡PkUxљDB}?g ]f1tB(z9\Zޘ^mD")SDrLB tZ)idkl 9Ik˽C_.M|'On@V ݻ5Qw`Ko}7)x s2JLI7`ss hߵ=7uMփ{;6!gV$fa v#! hybmk'Hb-+'PjI=hݝrFuZH+YA0Tѣ+\SFC({*D6 Q 4td[>$=&jB fÐ&G˻EP5ɲTSY.d5RHlѺuU q~56?ua(Wa5 c^cQd)u◍#ւhoM0/2gr d8Q@;y/_>3i[>tG8?L YPQ=>sDB3IzD?HjCf˧mg&*kڲ'`U#ӏf8$PwKst,͆n`Xj ^q'P =`Èuh|p,ÈҐ'̟aΛ]/[ÉV4]OR/*9[#ٶ+Õ)%/9Û#~2êCf$^i2uMQìRGۥ >q_ |öcw$$I7úKUgY múaLL2Ƿ0 G]jj5$PC 6x'pbO4h_k'Ӓ쓃d9p3V8欕|!3-a iAn)dɺ%E?ycDMe& @HL>{񱀔flbBV'#Mm)b-Q00FL1r#4L3KF7XgO3%Nlp$U[`~JWTmM"(o4So{6ԗ73vKmޔjryj3x%h̿LWwZ4Ă<'GĈ./"ڃMKZJĐ(tXD幔`ĕHM-#[3hĭT..9GII4x]VĽEf9Svf:gD 5Q񘿘3xƈWm75v#SwYJz=p ko)򿎙`7SXA86p1fM %BU:q'kЋɟ+7 DbWƟ)k5j2R @|vD?7zF_0AnG-6Z[|2ӯH-CÂw+1cک=_b.? OYH|4m4^ l*6vk,l!p0fITXǀOt;,OYzKMXvz>^dZ[qc-yĴc9Z]1s1Kee$~|3a omń?|-(fދ NoV\j:}ը2d1(<2tAeFZݨŅzS)vP- pŒ㥖[R3=]b()œ vl޴9ٓnʻŘMx))kRš cdq'Tϔ6)űxӐe?Hou$xr ŷR}vKQgLŊſxH 2$Ȍ3( 7ſ3h`rHVwFpNԤ Rj&V eogABVVku2{U-24< /6"j4'wC֒q ʕf w$_gL}MEnYqw#8h =wh"5 .xI CI'bu I!E}kPr_fQ;gpQ_}U7Zil֫I\E ]:hʕ+v$g*w¶| To5 0-#<{`bxQ\3L-6( FvDI#UghF&"0!?F^KsacK̄LY)ޠn=6ƨ^kDf_G5nH1agܬ+C޽<;!.񏚇%yHEC/(2$GRMs/2[FtzZPLڙaDY߰?m-LN c3Xc+Ow;nVΰo42!$Y{ۖ;}m}=R8R/M ݂H.6Qp8fu)US*ܸp_D\}[vs[LjFD|,$8`d׸0Ǘ ,Yc2(}rǘȞhsZEWǙV4 =(9%k]ǷJwկrwho;J:d!uRyzUYWX97Ʀ-d1Z͆`m#ar `Q| <JE-h_S6<X{D'u.*2LdhCY}R=X {{[UļT9&Kz+d\0\wHn~SfZ~EOR_F  PoԬ .1߄ܬoc3U9o z='lQhbu=H! 7cO//_a@_m׌@6g>HSnVU7s?9FU4ogg76s{ 9]&u*  "x xCw+VL oZFymGRJ!O)+{82a F=n1{0h`9rAtUȍ]MDBf ~PLȏUhȔSLÞ z&ȖRkE$[^H^VțQyz/(M.AȟJq~U;1i[ȦC״'G`4ȭ MZS,}Tapȿ=`S:U]Nsb@A*9a<><ɣIS~5 zѡ?4N@꺀3YrƞwzWjv B'G -sL mjN 0=NW4VԐ!]1?6wBe5ýbJNp5Wdf= *yEMJ:ye6.'$ЀzvGM0ih3?;}mшX+ E^z@[t)I"X(~ C qи,H=gEQyi6|R@v<&xw"[(2I?rqyY\toLqDCN6O `}3fyz"Zad4n֛s8`f.:1&x1#JsvuuJ!-Wz#QWTi8U^hɐ $RP46yyVɞ+d_ _Q}aTMɠڲBjǫF5ɥp94$̔m͵ ɱZ2$a gEjɴ?{ M'q*^#ɵuEbҢl*?Lɻ].rEHU .jCa%RԒ mh_L *TEb1 cF/7u1S.g ~m/XX V(+X]_U7·~*@ MtwE6zQj/#%Pг:u<;}6aTW>H%zUbgLyѴOs@2!Ϥh,ZS+1$ rz Z`nC<% b$Η@jJ2Nw хBv_ExSGm{}'9dd* C΋v^>oH ,U/oo*12j@os2*Z7\Y2ڬ.ȎC 6 .[Ngfl%MRn0_MfbRdy Ql㴺]i$&NY,yH{Ϻpg/t):PKؕ(m`GvJg`Kg/Yˋ 䗻cgtOˢޣ,Er˥Myq)(lvsLx˥'LWQ˦B͕9AMK˱Hz7uIб.N@˷dB׋[{u&sL4~˹x:9HGz˻MR<6k{`7M vZ3R F crO:5<b'yH!&9Eyd8P!1IoC=Tȧhc HkjGm7~e"Spg5I=lU+~g?ӺHdwn*Hs3,,J5v:iDǏzX QOA/f-خqZdNbgRjuv\yb́zO;/fo־)+̆ (XqSݹ̍+7ԙZ>Z̗cF&djEgˣu̞樺o,TZc̦|;9I'U?@8J̯}$ /4#'b7̺,z pgxuGQ̿Ρ3Wc6p̿׼O\AH5R)ijxTl me,eȼ5IFQVAOډ&1&2imyj➈<#"|E>:~ikleօB2qS&cuf{hhi r1D3[Wi=SWmW)' >x&+hVE#<4QU%8[M\'S4=m gPBKC!?B"=֯hXrp4ǖ@5U*bG#ϔbIRNBis:e3j8A6O'_ :wP4戮sA Pm驭Bi"V1Y:i{͎^.Bu:Nه`")o>RӕpͣsFdK` ͭkkΠX84ofWݳ4ҥ@M4Exwl9(ؐRkO\ea-F ϡEHBRM9Ӡx>V<5YF .5Ryݡ]g0" MF;'o.\!™v@T׺ƩUש TS ق]%Ǔ2F5, ':#~ݤ6%lT4@Džr#1OœƱ|`;ƫf5- $q.L/t?B=ښGjLNeM&>");I;HufD; {PtE 'ФYގx|'n3 &MIbZjJR;W <NfݴfN!LkMVsx]6HL޺܂{S%; 3ѧw\']|1M\:km4@Pq]>4:UYUZԖΟMGԺ&Ա;M{Τ飌#<8E=wι2MX@IuՀ=ȄοxxD8 U,$-Duɖuf]o!ҵf$'t6K~GuBjR^N@ z鍬z&bW> ,<4W,Npan[ߦ~ |V/ ((Ud/9:`~fR"]OӠA Vϒ\'H@י 99g]8Co9piwa'zE݈Rpg|,`%_UC¸Ϙ"'S0B7a|ϽOG2m|D EM᫠ǝ4B;2g+cB x-ܺy +XPlEe4QV\1LLyZ.ȋ Am*Û{Ψ$"t~N̡fx$P/7'?/0wLH7]rl2pVPZ:_5C2G ԢxynG۴_Ja\-KR|qvaO(vʭtV27mG-Oyt:J@h([u<3QقPQC 6fRG,T#帪 hX7j):4]j#ꅵCJIwrq:KKOK+z;hRQ9ZCЍfO2У>/1E&hBtEЭ`pO͟(rZ}@д2曬?"*D‚ڙ5mƤIGv{,.\$ֳ)gu͸o=>\/CVģ*_uuZdɠnaQHM酑{3=Gvb=5y&&s8+ ۋڈVHu>Ys ׹_p܆avrrٟhiY~s Mͨec%1e =YPM>\@X ag "K軚} b@բ) pJip-rIpɧ͆> 4B}gM0Qݻx+0l"%azy3)XU,v-)kbժӷ+u&>4} PG x"01}^a@F<(!S~IEooDhbNhmaY6(v/US -V<): &kb X Q\ 3+(&D Hǹ㯃Lc)RmA:SiWlay20bJeb+r ?"c7$;TR ^3ݖb9+SF: X ̼ Z}f̛qؒD,IDܢ`ۙKEJoclXbaFs_lTӹ6eӯe:uG?]қD;&NMr6Lt.`Wqd,ӺBVU;3=/{<+2LN˞8f$QpY BJPd+ĞjV4.O#8c λP}fQԫ3&1_/2$kZm=Tz~dST(O4J+UsweTvvl#]+Olvz=#&zv^+; Ὰt:z#\A/QiKso{:S6Kl9C7|%ʽ8Ĵ9؏|۹ [i J9~S9 [3q Q|4eAԃ]6L+ὡݮVjԉA_T܈ u$[Ԍm˥:u2Ԑ&=ii8UԛOX4Wx ҾB԰ymPH|6ɓ\Լ"Հ0[ԼO!FUrZ.lBA0m;T`?b C$hD(2D!@΍H*鎜pZrޕ-senȐB#2]8{m=4Gw4@ґ~oՋH`B,sa.aka}I'G QMWE9(8RG_Zp[H]j<ٱ+|Ɔ nok&FiՀ^CԮ]Ղ" ]T\"`]CeՃ_ޱre lOՉtL}E9CT0D\PՊA{.'rtvz™)ՏXow$$)jd3Ֆ3)Ƣ3Y>ou:IիmcI/_ o0xխi#3".P}ȌռE]ag+JJ;)tlֹ]UGO. A qD2xcsv7nG*6ڔA5q ?=Hh/m7mc vf )"阒AuӁfjp83]R= Fڋe {+a5+"V$8xdwp I۠+*9[`u@[xTe,idn0I%"{ ;ȫT914I,\-=8s?Iu:YK*$:FD (-(*=o<^,oÕxQiTKZQ~ݘQX+YX1O7emIb>5;Cx7 _k[ֆ;~3Qu֓6؛Pw^\ ֕_MC$τ֚,&4:_;sM֛g ֝ Yyr;1ֳg@ͷR0ֻ¢-@tȪz)ehIVhQav!wq|:7%qqSzkeiH-rs2<(*U .H{OzD=mScwx&nWOWNUBA(ԕXd%'ʕ&U JTΌy&u Yi@bPg ƒOA-u݊*\U9V`44٨XNiJjƋN6Qױzn~94:xz%œkHC$aR&LabzT'{_U?SX_lB R'`hw&0zj27:dP. a(V{4q?kZ"[&AsF6X-[8?ע=6XNj,׫3'd,犹DT+׫)KH_آպm<׺z X2JQMFB׺~蹷}qC׬!Ya@r[r-PȦ}utt~.QK#k 18:=b/CCg]N՜*(0q>ru,n (p181|H7Zs7=_P.b3i־g1UK&ݾR^ϒ懜1ڠsV#(P%?fLo3GnӨ_{ն;ǝ>^*43xv @%+v{ҢO ="OC$jc8פi>٨Ť*]O &ȻWwR}R@=ջW;=0XdzEdׄ}83(H, $ݩ ) }\KvG7 H/9wc\ ٳ<N)VJJȅ͚ `d9 LÝҼ5"mF'7 IDYȁX'LqTS'+}kNEI- pڐ|rFCq=OWm4#@/EyZ>t/lswÊ\ iv2M ϩ Djs~-ɛ&O>c.@لmc3LVzم N. G"NJ7?ٖ[s>NGMSAKٯ`^|dٳېrBD1!zټB3#<ؾhͲ|Eݜ$e3Ŏ!b% uk o"@`ͬit{*u=n NK=oLZ.SFspga@b"k~.݀8u N "P nPc@^*]+΋n,kCZ%u)^&!5;&%_uVWx /HI bfqUmPfQ?(6~R"TL'Rc t鉐)wS;uVcl+jY naI1b|׭ngix EŽ(ٹ 5r <ӭ{Y|T@= [b7ۃp|&]TV*AsڃE p$Kk<ڍLU"U@ڡ}73eڠAy3)%Xyڤ`oYgڭ!p J8dYL6sc sh[&}~%,UժU? OݶnZm &yڰ('ݒ kᮟ!]_K_rqg86vJU^F 6*V+F}T1gĸ(c-u/h,Qlr‰ek1%ϳu=x %bP/38pM".$X4-#J.M]Tb6V(stg1sLb$=uDm]PxQ!|0>бdX0c_*7BD O F06șgl(u" "e$Qk`oqÿG3pNX(~^qJ xv;R5"t[ 49Mы,{:`VZ|4$!{.}g$e}N߈- ۈZEd }[xsi?ۨV$b5$Ϯt۴A}+; ۶MBQ|peXJ?{hzy 5|{UPj%@!i_D `̱yxӍi J84M:ͭM;'}J08B;֤,yCm C62̷ͤs':\WWԂ;i| {7ј" ax-ۄZٔT: 51֚}sI2!OqE>_Ta(1V[*s,&f2vykYb8D3PGL5 IBJ ˵(3:yķLf1~B8TFWSM`AEtS2s Uq5w\Hλ coVxb'  Mb$Gs 6?܇wK_6*襻a_ܓwd75ZޚܜmʞrPr>&ܥ>(7WV:k%'RLΕP ,b86ǝ :pNE0[V72bA_Peg-~!W"Uɒ`\GXLG٩9jD*s 6&:qg4V nU,ʕ2` z:5ε6|(rTZnY_n\i1ce$oGGxh@D:Ze*H}RϘ\ 0֬ipF7*P7qzĖmE?i4Wc |XXHS (9-L3*y@At8lD`k7ej)\$k`S(<;xlb|8ԁfb_ =o\TSh3;ڦ?BboZ/><6">}˺< \<3IsYQ|h́(;2;%T@[ izG8WY.| -B~iH,%1pWCj-Th60+#V!%!pVZE꧐D1.>vI8튡oQ.61sC|.G{H=X߉? &F f qy{ߊV?K佊p]byY߮c*ߗhLOUr<ߺ#}R:Λa߻&q@"!*E}å{+`5R`[뜓7Y*Dr8W1/7yAݨpNgIV0.I CB Pjt: zV؋O*|g@"o:VIunF(+s˭YC wH)~7\Vk:wLdW A'+.4Ry3@m+gmS ĽL_) 5!R/Z)pԈ 0 e|/ѡ03eu$H4m4_ ~ik]FuiCq(IIz $(рzqݬ놀N7tf \rbihqwEh`CZX_w? y=/9\(DqQ!]uZ-oǕ.&]s7&lb1 wt78ri ]hOW7,I#ࣟXZ|60A {)磼B!;1P}sg,sZ$8x(uM=ܭ5wk7Vof0vr&WPbQ<>J~&"OА`d)3u2 ܹzT:hP٬=c_tcWm7fSj6=׌Z 〲 jJ45_AWMZ&/g=^4Rb*Lk)7y"Bdq/;;sefưeGșŽWN nr`wx}dV5ob8ްͯzz®l.tQ>bBkԙx"ec ;p<ޫqGg2`D-8>r"4+C*;5H&e5%^. A}U0\ctg)Rv)GlAƽO'xRP y*n^=tbӥdA:#f8YT]H "ᇸm8"PIxi-X,c7Vl߶F&j˙%% XZfU>UˉՍڈ1@q$RFXgi %vzsGN] KJ:dفěrs& I2ˋ-T];lCZUU3~lHA Q9ۤ1 g82^c ᎕1Qz{/՟x/NI!DQiJKt]qu8G\<7h={{!nS#z A,t ckf̅ז`,Jm +3&=H1֏7%8Rl=ڦ\X瞡BY 24+@e^ڱ禧z?He=<c2yN)#rhJxުۗ_~A6kff6ЕȽ et+ "z; $♳ow*89We<;'׸,{>✁WቹcZU΄I@"⪲h#tOn-<ⲩ֡ 1 ̲q<' n܇œ<4ʯⷕ\ZSU 4U3bFdTs>˗$˰.OӊDN;&dLΕhQ$'"#0AY ֠6)'\)~I%JдOJJR\8/G㖂 r9@Σ'J(vSY'Ƽ]lgtxV\XNx9ŽQ)alm={ekb6Ha]`B k14rRZ*=&Aij3en&oTn<H2y `'LǨ٪HOp=,k*OLm=A Mn3 $옒W;7WwJJPcV|F["}nX|Z'8d[kRk ,H.dkUx}M"-/$kyd'-^87LCqO,FkC3䵾@v/zPεkOB6j#F~Sa橜`r?ŰA0i㌏o_i#9㜙IJWqld X㠮;،23luyMmt)R(-㾰Ԥ RAin[uL#9 EňQvgvba7nY>D8"iY~ؽB1dҍa~Qڦj{NtL~`J~I~K\b( 4.k;N;fvy SC6Yqe`̴ k p"~ka̖ˠA*W"Rʗs:ɯJ>ou9e䟗^5 [m6p^,NNz3ŻVsR8Ӿ%4DrՍwj;מQ)0xz_^1=%& :n/,ß$炯?ӸtNFf 7aKtwDA \>t"Lym9)|=SگtDJn g ?;8k-昨gK;gQjSpcU)I|Rcxy\rܾZ{*B[W3⛲CK)wZS dxȗh~lYè>`iQrn3>NQeE潩AjK|[y{Xԅ»*eĞdv9jbӨY_΂/lڔW{8Am{x)Ede&i˘2$,Vf $CXY b3B"~ <0j#X'jKprG|R%| \zUp~Eoj]Mof![>i jPXS)${]0УCs-ec-2M 鄱4_ 'T -,'ck 0/:[#!-7>,PmzPc-a.NZ5ŷIݮ!L6hL qz?I?X i;sb&#ZpDäC 'mkN꞉b.֗F]1)Ï*;H1fy**BmXY.K Z6L" ?p?-9`0&l2^!*cau/a KweX ҽQ, ȝmGE =͡%s{;pw5b1sWݨ˾q*vƂ"&iyvi+*;Og/L~nbѩ% #vGI { 6@FCuu&q`nh`]5 )v\H*# |Y`Ӂ \x&R-?nJO(cR7syuDz0*^**pÎsn kWŸK+ S@ss&BejG%4$|V׺ 4KS8)֕&{دxk@ dSuc|kF,lJomyA@Zj}H^noAIhy7oܟ}x"rUVE }U8֯?K ;7/7.zQܟkVZ/GƵ%%nW*]jzR \}uQcɱ-袤[!OcfIhApK 裍 PkBh.I[yRKfbw觐6?80ke=ubGK誵WXA)AɺQ#(+IFAiS;+T`&NQ!mnv&0ͷm/O!A(_M8#r6$2K!(<=ҳZ11&qa.+vDa2;x㿑hL O۫ϥ8Ve͹n@ҼVar'BR#if$Ց<'/,3#i0:b1a:M= gڱJV~fz< | C,Fl ArDXgaOOO|< rbn zXqnȒtXDCeOH&$o$ig\3C_BPNv TzFeJqْc酑:?\J1~H\&LD-Ϟxմ_ܾ>DFRoGGsOzM]ܝ险{)cҵ^7"*@X頞4l{]ޮhg&Tcfwp2k*(wMiq"EKwbGu1S鵦#Vs8U黍~LYqn %d3P{T+!M8%J[/Ew]Ȣׂb|B}cIb_\\Vr,G|$q 궅&=7 8 bF;nAX%in zޜ(_|nVp1*NKwQjCؽ̕|,0lg(^} P"AL .PNIcr'3A@D5nԖ=P@9_bpW vqCSdDljo([OIM]OWwTsW{& Rh{ VUWq0U~Gz&sbKe8lu>꒞H ~"xWPWFv\A<98kL8B@6EpBg@1M{܎*ȍ갵[TZ M) H.{u\Ӥ( >5U+z5i!iLY6LAέB N@$x|!)<u4JUu.7[ tXnjhc"~p<$T"5rW?_ܭӍ1HBkL6|9ۤ)z"[?@s&.Bf`㲘w*Z%sOJ88Rq|O5=3oVx_R2BJB=a>Jù:nxG|yh߼p|UBkОl|Ñ̒| >j$~ުubjk퐜@ W,54+l9c{Ϩri:ad+8w` <iC^&Y(Ic箙 8ܜwf }ZA<.&SAàr7LSjt Eӵ4AŭAO2DӹBc7E/F&H[#4&}ѪPcOO qpZt_d7rVn .q=f@]t(tre Kˆe︐PWpbXCY|WIjʆE~wq(l86]!| .V54]6`yh$]ϿE ۻBn}۳z{OFq0@ ?ѾFBJ~XzzG>Ð{%=Tkgq:NAUYQkqWYqQYwcm{&4[>B ]iB fs_PgeBNzK|v'&bZCyv)%i0,~RA)Oؾ?:_Nab+c> La%϶,c=5EUgyfhh qH1A#R#¿ R]XЏ 5n&Ydxڽw/^rifuh`71ć3qlkUb It_sRPDw] %;*׬mSz9p"1>:#AZU|~Q⊊@`0Dsan5"; QfIǺP^-Pj#%z- CS]+;(>yLnM _yIZ'Ehg0,F.dum,:TE_Sc[Q|zx_xDq%pHӼEl%V qGq}}e cx>8ciuH ѐF@?fn~5WSK=? Ը.Qロ#ѸpjPcǔ{y k|*%ǖd <8OIźieO": >& ?OGRKeWϲP!m4cԁ#JC'BΖ4V?PɡH(ppODW MJ3vj߁ lY=#348D x kCw̮F!'EA N7%,ر[j [K^_”_/%aORb5R*O`۳P cBRGhm6EfFFWh5tpgu Dw}HfHAa"+{+y?|ԎÜnz)S,~`lp$ȆJBH?QT"ͨA}pJd(gMuDI=|B`W%-t?O 5 5 2wUo٦F_>.G,GVTSb-'tJplhJV ZLai2ŝr'Gh&PL-Qu tpVW7cgޕj +$K=<cN _7*~ClHDuX&tU6^)Z?n4+Fe o9>`= Oؑ Tj>yφ9 a_昝+ v)KgDz F1䜰gF[N*3Yo؏ vc+ 8םA*eR9D$U?XƐI?iL*7iBOSļc.n`Mn*,0&wZt:s+xakud!]] $]unnrܳ XШv3rw?h%"3.Ϫ = xYʷ ND2Dtc=ɃoNS  o ;!YW?! σvd#b9`K l+L[4%Rt׃J \M/ C*+75 =q;clvW Up1'n ^j(cU fg?҃{.pj3 ۋt1ufX{u_WyŹJ4.~b!Ԓgq!GkeKܷs \גBWI\97"tE+?8i;N%4&x9بM!ݭ`Ҩ_;R]>QbKԅ4M4J&$e2鰱u@љ3_} 3fلNyY؎/9/;3-BV }yo P?%?F3[H )Crbm> GDd:Ed]wѓ@GQU0IXW+t:윪`SC^''&cźE8F.k8XXM]VBB/o2NXP wkpӎ3 1X5b)SOЦW$]JBg&opUHqr2_Ƌ~cH;d4-x}w]j'L%1C}ЉC n!Q)jjB1I XR ɚǸ9PLx$kAxѦfma&[Y֯g g$o_q~h~;ΙG;I:Uc" UT<: ?[\0*^.9syZ,HSzxE'*bR^+F DrX@cresୟ>6m -jɧ-#yƋU$W/`IN#8$fRu <(|GQ X?oM^s?$!xeWLlk7/YJNV;g$?-&o\dǁY?0!ed`|A^ixlOteſ BzNQ7g1Fc$k#Y.sݝ4|"7y5Z[m#t:o}~̦1? A(,jz2c`L+LChb;.uࣻ}]ȟG֧JgOh5WUB-mAսòSyƁC} ~p:ƶGY|F xq8p>>eN`46*?ۦW,%V'!8m+ߥ.=]yo//KmAЎ`8e?͊I{n=G/"V0,pyzjH"߮.a6)/J/f)rFP1+z@f}o3T7GD\f} zjaPWXxsD0~\oqsfz'F (0x7@a<|O˙U=,ۗBʎ CMƖ8&S-DUǒMh+ЮdUpr[F75:!~lsp'״6KցIމvJqN{m"GUTp$z]="֡i v|u7Bc6x *fc@HIX.C6 l9 =++Exg:yAY-!1i <@" W{c:&7XRV-PBM"L!7ICD}ݬ b6$pPNR8a\|HO:/@M799=~G$>U GhAFU5JF통XojN'Я r >I^jPA\ZZ}~R~Sqc!iE#X[Hw3bIt{kx'J]7lv#,qb[e`$EdXicGz|hq 3#:ofw3t=ؔVws*$o .h S)VP"EMN$q+3B e`U]ыcvֈ`1kI?oUNΆ[J7ҏFW%=/gt+ ϷWwpΠPt!SK QB5bݤ3wӦ DlZɜrR0brA4bdgM[A>~eKJc4$DE"`h7iE28wpu?%zw,Us9mvi{ղ|Vؔ}@w~s.J+t2~#Y,>X2H6H%iq4Cm 6Ce!22X:s z>$=ss:'KP~XnhEfX=4h=->= d |GszQgCR6G'-!/;$P0iKfh * W ;`">d@|P֋aԈv*6V G!St(9ܨVu pctu-Hݜy=3+Y33P_a%kb:W\^';ccyLWs~Q'Tz[]X#76sZkXw[XEbw\`-i%!d|w3agi$e`qEO:>ɉ p{kʾ8tγ`LgX\XmB!e #U_:?a"DFrbм4HHM;wtpX4 5.nwOB?]^ PuG/>x`l]yfv2v zPӑ̮2}iYa/9FNi1eZ-y'j pvG a/Sy{9Yy8yGRz^0#P1=[%s%<1|#ע>U͈y%G޷oI[%Hx/˾!nD釴$3x'fUk^eO'̫k*vػ+M'AKFW)1% &j 4N[84&I φ! fZ2=ݹW_{qn(51JKH4PO:^Zf%vc Pť3.}PH3RS;LpJaq });_R@@*NX5UYm(#R]w͞xpGW? D oP1xvɷ~)ɦ57ӟuT)T,[:$iI'B+ɽ]\ƭ%UccB/s+C8 ]I'պ~FxR4J1~f<`r UX`E}feWfЬe'QiCtM 2'̮QUn(jSOK,2 cpqCST8=]:F(~T#3e.|(iO2WbwKt]iQUWx .jYSDu %芺 3êG_Z$Gže Cc7ʲe'W 6m-j.OFU83f"+|~ux|$=giiaAQ3j:Vw3%%xSJT ߼vL=9 rn"+د_W*ՙSz^0d0Xo-IDàͰMvҸD';Xg%#v7Q~-5uwclIKQ@՝\dxjW*:lNOC2X| [ I-MD*ZAlcEoҴbpn:,giQܲZzs*t_NbOZp߮( N+T@֫qc#O0ȮxS+:kŨ{[ >2*?Yӝ S(fʄBT1G- Snm{lgU?eY&sQ.#CTM~\ƵIH+Z{b=(;K2$k,O!YEaߞb 2h#+KqC_BPHU DlrQ&1 tI{{Rݿj[i' w {*S KF t%a643'&}O>R! ![v&ܦ6@SV@w~U^<j֢>Ӓi#1tlLE`#)m2K}j9F{st1V!;F2< Ll>MBJ syQ>E n@٧&-v&Th#4QnS _#^0*'al4]Grq`?!dVtlNA`$ZMOKӴ3G/4*'Jh@iBЈK,֜_&'FB\ѸZwfҲ3Bwđ ^$8^qց2ZG6+y)|D U,;hG;7Ҷ. m#|d~+=S6I9;8 {oyMx)& O: W[z_m$Zcņ۟ot4FnW mg\@|$^ "4QWqU3nq?nAGG2Ô΍c5C6K U퐑Od´0LfhIpJAJ?jR&O(WP?:Rb"Y(3|$X2I,X4Ytd:pp;sJQzϋQ\$ua'e皴ѴoYKlx_TQ/!wb7Q UFRL@Bq(9'3#h4>LgW?q4W1$7J*RԉzOlN#a6j2"_Ugӿ $2WgZg4d̥R)ke6\AA[)D.AQ6m2 $݀-2##vĤ[\;-,h xF6Gǫ & @5u\2\hqO4>Rn>^@[,&DsJGM~bzKdԿj:X&0EV 6955sͰ\bJ߅!xc# 2Eݙklmz l t_^iUvT;M$7Zd$1Z3 $?Q[ Gulh-p.$6 9CFAgl1TNVNv>68ԥ&[+VcXSVy=TE;Iohk0aߡȇ}` EH f*(K,m'%}z4O}.e^QR4I-A&u^-R<4u0m321{_H8lq6 9}@&"3}'] Й(|cy!DEQ)'k'8^ \9IV5rG9@R.oaOXBb)>}|SҢշGXYDTdpt/^]4Ge=A9=IYqK\ed;RF<z^< 3XL@PuDw7RP0e9\f]/Q`]yL7a'o>.>к"8̅+D0.=eE) iMKXIӡLMkgy/ワPs=t(Zȿ ~‰]X@:h^+P9gv  yXS %wSp/m&Ws@B ՟az\̣N\ICI~C*)AI9Zl>\%O}E>Vf>FˀFWmŷr_Jc`, >{?.@5}g T5 S"8LyfpڮeHi4g*8Ay`9P/=?t,f°Ү<,ɫ`,92EѧuB+5`݂Hs|p!PWIb S!v͹go?Hȳ3i㏰@QHf3EgiՐr,\Nc&J'>}ÝQL 5UVCwL_Îޢ]oWlφf^ _A3'X]wk|S,> jCtF\EM^b|!b2C՘ $O_ʜ_P bNy",eq"yㆿO/|( 9<լkƆEnٵB<<*Xu&6x2Ɓ\s=gC!W8¯9}٤,`,=_z@1}'d?_X8Z&, 3ijɸSJM8422NgQ\ B mbiDP_؜ Wb}ӻ<ڋ t7ٿ(HT*, /Mv헒Z4|bQpaۘ-vjº~B")`s?мp`#.Q,:-Xuep5.)KEY~(4u-}5䩣 l ]!(aNepGǬ+dPf5P5X)nED =5~*ج_0|67wJ8萞ڰm~b]"!kN)>k,XмzkL}}x%~?͌Y^eCn{"7ysW"Qz;*MriJB(Qt6:_+} !RGEm~O)#)yO(Hϧ Av<<<(ѱ6 s| +~bdu~l+ր#2F-Zn%7~^Tk3c.4x@Z'}-|Re HV$F㡛qSIڬE7 Po2鵉B^Kyf^ʐP 33],+M Œk͜$󸂘P(ؔl2>iRin/#`YaFf=v[Lk\%f. kߋ>g^ #H w2;?y´,`gE{+4!~Fxv14B*WQ<` Al2͊<~V/@5? [5]5ˍZE@ҥ0| +S*y] om֤=]첣>^ \y 6L?шދhD~+Ìk*YR/1t*1E?z ࡨiz  Qyguڏ w7# d O[!#: IP1[z3 {!I0~o _/6 sBᵼg[D:P0hw?Z:1;q=3nfj4"o-؆I3Wq;ؼ:ɜ7`H:7@.ʩ@+fn=m"D-[#l]ꁡ`ju{F'b$_w4$?У.-_*-VFNB?rs=_+O!n!`aM' > @6Xzh6n`߻UǍZw+e]U*若"aB% i 58g2Pt^p;;O|ьԑvK[D%bZ0J7ϢKc2?{jeoav6M)lUc2W1?ϼ =NQDUmVʌҫQ劅 O@=]=/ݴ' ܥk3gpylaCۃ:7!1nop@,,'ZR#N{9RMXYRϳijÓH6gb4yLq,5:c[>K+dqWZTMCmv:72fŒIeE ,p0iO?X[ Z\Tw<%r/Ǎ̉9"YS?qZBY}~*%e4 tfO{Y&+}%حފݾ"ΏAk=E@ zI//k<$<|)zkk'jq*[>Hm`>1 o@՚֏"=1uADkvj~&UUHd}(؆w;H{ sF/B8f=߉\Q\ػ,ҒsSi, ]{JxO+DW'5*? =u,)Qq㘱\2-ʝHS %]k4,ckq&Yܠ_7EeU C9۾eFt<‹v`\ۋѰLy#,6?J ^vzےFqάRS(#{ _;WU몾2Nz'琉:+Dήq$nNN<-KW!=YqO(U1|,{9}3';}EPϘ:UıӒU9~^6GjEx.l.p5QMg3~Iݏ~eY e'zEXn 6ΡSs/ATD$ "4~4f\GԱ^lAKgjXkvO4d/Ojٸ]]2L BTBk^8"\JZH]q]l6m ٫TM؍7_ oi4KA# eN S҅WZ(ul:;x`|S&V?f4[`䄻nLќC[y-0JVw'(x8QjrmL`K{-ߑS\Ы)ƈGD[b,5nq|_*EIh0<ۼU 4dw麈 9Fk9ObI|dH$ta>Q"TCL(;>Ħye+L7? <Ӏ"e=h}jWXȲbq;< hQ$;l(% 1 I F08]EV2;ZYMԧ 4lR䞲O~q5›ZTh4x_A%H[˩;Jq95>ܙfUC#K7J1u#S ђJ!-l/LZ@8JlgI+g)M!<͓yˁFB{N!!p3WdTǞC$GLZRo1@AҔEctmsJ77g$bpEі)#9IR}nRPS thXЃvg7 CVxd䏦ܚ봗Q}6Kh{(T C$!Hz,;umaSp֛y9jݮN6ԂO6ݕI'Z\6luE\ky2]>jCU w Lts<;Xt:ȼ5ʇ\*yȫer)?kxap:Uh٤f JT|_|(=C9`3YVLtu>Bɔ2$-DMr/j۫}v:݂-Q>Xπ4K,cC:ブqG1Gֻ1)S&h w=cGO 4<\=uu{"4~8dC(y gq(̾iޅVՉ㼕uC_/eD?ᅻ,1dʖmd5%_BUfۯsh=K]kJt*({ۚ^g'ZJ8dv^l|fϪ+ #Ok"ɖWP'٘_WNh#EvONr6!4DhE ({/?\9`y6"(ϔN}4tltϘP j\).*-\Uk('$/;ްrN;d(pW`$Q+Gj ꖳ\~t8U1b6͗ dCR,iS_ZA'A_U32})[K}.'ҾMW1YPC䰵y4g7su)=@&S8qs$6|+_nBxia:eUDVqIW-cD0v( b)RYJբHݲia]Eb "xM7!\9ySdͲ膕=l4TZõEs=#;~E)h8X|e)ub e銑%SY@ln}""D2 1𣔃EZ3K}3g]xZ3C{bЎn_{p|T$ijDp& S*m1,jM9jpqe7㭴qq$ZoLZ]ǫO'y ,wpF]U̚4<+-0OKЭk.QHFUaAGH` B&2!qi*AdXI]K\`W6ޮve[@ L6>.?KnG//6^d9ĈźcgIE( 遽Aa #0ZQ2>DrS)P(:Ȏ'L|OX4Ww 8JSS6|<[8mo@}s=,&z%< '$I* o_;d*Y9X " t30>-Szل˦Ug4Z|cq"bUdMX@Q :fH7; ɊՊIt&s$rc{teg,)2v[efĊq4Ƀ>v`.}cK&7fmh@>|cm@U!3EK 3V)C9ؒŝGj /V6p:z=uf{ :HÍ(5"_\QxQ"Ɔk$)rM32- )WoMSmJr?! 墎teΏy|T}ܬ@œQ ^k]nn]*Y#~1>i ~ഴ1]jfu/1/vݺ<'NE!П]%TuK`?2 t[Gv#+;<;omUHm|/v *gsD wzSvk44cJ\DI-A%_IF[+ 8" 뵝ƂfgcXP}Qf14e="o\jg NydJ|S&kzVA}늬Izfa2YWƿk˗ ēO]z x@:s!(Zk\fېӯ&wJ_賸Z.0Y} *+E‘ :)ɦNr-4:571Ffz=i~zSzytIs⧳:^q蝄y^cM%Y3#~<ԧTBu`Ґ e#$&hէ&?pY*Q߭,Pډ,ZIv炳H ڻ-Sgj_Vwejߦ3.-litc+v]Fq,PU&+71Kb wyqˊM`e5}7feE9_@^ճO%X 2!0O_%uE[ ;T2_g1Zd9}Ne{JHd ocJufʯoHdtIufOBc$T3 |x/I=yռ.kS`$4ls 翌QR vjX4zdRBWowV׍YK;Y]]Y ۢ_VCkL˺"2 ae+,i!m+mg˧(s9֣5UJ#Z9Bn;P=B h,p?  4[_ysyG(ȿSVOθ)vԮ}IQ/=FVR9 ط8Huy2P;q:>omkOPgXrL-v_5fvǵ#ۚEԅB& 3ʶر씧WKfH4Hla tCb`p Qk'Mv~cL1PG!Į4! 2β6ZjaUFo@~=TwF8+7ᴪǜ5U `é5ؓpj|$/=~"Q߮36 œznI)uJ^lP"_{C`(kĢLv,B:,q$K%:ȑc;"j JÐ~r&;RPbәm+-3E܅[;M`jQK7 g@*rdRԉoi5DɋK![lEB+7=. =u/ ,QQA/ ͕};xalzY-,z 1:7*GȺԳ/wGrȘU#u܎AkVqa/{]u P8LCZ<5" $^ͅTe$Rf~ma$nb}xΚ&ޘ/EqQq'GMq%LZ|hg>e[7bl[ϒ2C[_ݝʙzK\rg+ĥѽ7L&-$$jYdkY/qqVopSim6)loOѪeci8f<*kdI1g Pתe]ÐIÃ]ؠW3/t)*)sRX]O_0eE:f[kZ]QºR`|xy}Wfl;67rih bmqj"'CR`)=>Cl[,]?m>NpU+ImK70(],x`J7~q<+e9Q/a/Ly1 }kQxCa@qQopC;M6dC iUƅws+ZXǝyp AO4+Zi7Fnes9wZ񫛷p4Xq]ǔULسe.%:O7K'3S>f5gp\I0wQZ)[z;YyFD46iww;VQ3"zyD_6|o?-YxPf+pYK֓˦y1f\紓Þz|M4I|+. ? Wm%bdeLd A;@ٵybߌiTeyk#4M ?;d/p^5*:{ "[ ʚJDbP,ԁXݚ1ʟЗ2\* 2 MQYm$'"XI%0̑x~X* Ԇ1K `vjm'2Dȳ|{׹züd_+d꜠4CJ׮x7W!f2h@L^eK ~+w~LXJ:>uFlZ~?I@ΖI;trpۻ)R$5YO-Pzε|TJHeƓb&fI&q.2|B(!Oi>,u KPG'(?.jv1z!Orlv/MdiMM$&cʝ*`G3jMyN ZSF&gyb$[4F.A`6\ *rSg;a"f,nDU!vGGaZ9@F"/,,xneG2tlR*mh0 ".^*Y{@ y. ΢^JIZ͑ZbGZ;]O}v2n1вVJdI2dT!`o?PKQ.YLQZl!= !Dn%T%a89nǗzMR>D |(gV)a*-`Vg=&ˆ$Bk c38ށGLr}%)-("qJ aK U{@0p&̨?''GIG8־Ge]h _$QEԄ/VCw9_1H hlZGҍxdJDoL/_ڒ0N/+wwP NX~8 \3Ifse`2-:rk7cD)ť?TR.g٤f #'2Rp4ui%kd)zBPA]8x6J)F.*7]XPqڎa^d I^hAqEqA7~ǎ䮲w(Y_.y 7*ԩHSIA#K(lB״]DN= NN3R$YZ |TC8> H_u#bSiZO~M$򞙭AW`QK keN`og/X,yr0T?˓ށ._W,Ĵ2ͬ;^VPIsY{w_Aw<P'V>vѥG~[[9I9*(g |wji7R tA濼fXh5ӇmBx*yy7޳0h-lm%#Rv0>SKbH"4$T * frf9g^T UЗ  ʦEgWhs4#‡pWVGPJEeؕ5`m^"@g=n{t}R`,q  "䓜3IJ5û *Cce7FgoilW_Cj/5zr\0 B0CC'Y7$%6D]9pP~S3R+*cۼ&?8ZkS\KPaO s,u;VQpd*(b ZџRsx혣/Tͺͺ4YaxOu#sQDYb,0DQR v,oQf NpuL"8 -\ ՛ ̋&/wmc<>Bev-=A`5{a>̼Λ95%$W hTCqIԕ֢; o ۅY8Ŏcg@,Kk$Vm~ܫ]vl{U&@Ky#L|ĿҭVԚz.{Cp 6$Lݽd\t$[ØDcz z+͎Y\ڟHˎ'v A6y\ܰ_7`Q,]^)8L0rC@ZaT1(h6R_5S_4V?y2P '$˱G{Fj;f7)40ShK(&W*[cNa[ABʃߊgwQWE:fW1{ˠ?7nV >9x.5`:=~V_st鑟:]"LTH[6,@2ɬ%Ɲo)o@h[j|(_ =/nQ ~y-xт[~[w1Y%ޢ^h o0|iĆ[=$WL.w}j' }\e8zň7 5lyf]"+HHpG$f$F?Bs7Qfj@Xin8,6z -L=GxՁj{T4F/హ$mq%.ʕL5W!Ϭ_AqǓѯ܏6c\k+ӥ/=OA.\f!wjWT2CyڀSi<?W+ wG0I_3-~j%>pdZ >%Ig_TCӋR0"x(~Sqvm!3Ts&>tW(r,Awܸ$˳ ִ5VћDL/?l92G4DB Y%aUf7ŋH"PFإxi;pO廘5ыҙEc9!N4c1N l#EjH~z3֤5C%y.8 L1j5l\rSeqƥ?7\<;Ea' (L\\_"yUI"R uHr2r=֕ozlK@":o _ HɊa_@CnX eyTS9\_ sY^O\g~\|^qlL}.S&' hJ- d%^IHmm?:0-[1U=;VSv&TB&+dGRh"<D@sK~ l7iz uk7IJ/7QJ٦1DD^3V.-$a3V]47}WOGjWІL(K3dC'/R3wf _α~@F7q́Q\nƈ<߭Vy–{\fa<{&|i~rg._8?BRFRk DޮJ HNgLKRz`?5L0r{Yme:O-՛uд [%ʜz/3P fB +rg):W ؚ=TUK蘆R*(ǻcfJ `%K#M^ ʜC Q'F]6U1[{ MIشe178LWJSՓu/Ѹv5J`P>"ir7 ,7B}pdrI| Էp6ͪ@u5F3;._ZJrANM)סXKw(/,;Nlvz-):rxm RF;-%<(f4{}wGHϙ^EG"fОZ(އ*ڭ%Y \' x*6u#-V3)`h9/EUL!%[bK:PnI(=}rW o~ndf5^i,sW󢽚%~`4~Bk£1&K0SoHnB{ [6G;e!HQoA[Pw4>/=C1R'%QAdyhxrLD&5nX~nh>\mvZhNV/Vtg> eyGM7aTƜo@P: CY}:)X|uv<VG t\9=(=Z& rij;g9(_jG.Ql#Eݟ<;*gDvk3YRast,2] ;iltOL+ɬ&7j&dx5~4`;{yߓH saBKoz8EZmj,@%Sqp%绖0AO4&Ugs#&aJd( "{,ڳNyoh/84s2=# 5f1ձgN# M&ğ>ռdf+4o3G )fmeVZF~x.s.KBƉٛ@-J2uhK7NylӡN13~Hʗa&D)blilӸjr )ۢzvڠw˭S#bRs>YoR˗T08u׏[bn"8&H<_oU:_vPz5V,AT)E\؎"7udTDk<[׌2S}1f潘Jt~8q״$bac`X޻׹lD wbOn'imq@C,Z^\o 1{;N~5Kh^oXAKҐkFiiS'K@Q`fC5[F3j ;7jl$y>,@(kn|/vKtGh!ײo*T8pDds ; ͜U]yc2@lH GE5hŃ2W nR!LAU嫶yBSY;ە&ZwtUK7Q=L pZqq >O +DZ)8-^-d\Sk2Dw,ڊ)L>GgnL)ZKfL"Kɐ=d{ފ;`#uep%%g{V#9^PTM?BՐ>ؚB" rx-ل..1dkbбL6VoFZ lv%v /{\?niZ}?Ź>J>G`3նX*$ڳa1*p"5o<P|6G9 ֦\uT7n0ӽ_(@I!d{AT[^;cȸ],s s'*ׅׄ/gRb ](nn~N gB }I\En t.se:dtxBےw7M妨 HjOpPJk/EW(:-@FJ5 8pC XW5|zM3Bjn(Ņ42r`ȆYy`:[3Vl)^"ckP5(rPUKFS鹍d!H L+lL^&SWieSO[،3}m3l~Ҥac1&v%թFy|fapF(N^n(ubVZќ+Ʉsgo ԯaatn tte[̤mڻkiKjBV]87Lh+`bv^m^l4].GT4g+W"]: kYerM.+qBqa!-bř<'Ժ,5L DD,Ӟl(]@ml*ӹxL+V}VenK_i6IsVaF G jNmiqs!u3p+gVzDbHǻ4K"To)Jj4'&Vt,S*gbE:o <~Mu :0<}._aPv 9;L``V0?)xC~zst!5h3nzL mԏC3zxYrRl]9/nr@s`5N!D ef,վ ͇rJ RJ]G7q6Ĕ9Zu|$g[FJcy<7~o_8=i܈:G"͈djUA,#7:޾֋_-osdʣֹ8.+V#e4yҴ_D Qg ,(׽yDEQ7 Z(n^\H<Z.o|kx 9Kiv|%*;ڡ=|STOOɝEܔ` Yx4DFRs' Kĩ&+[=ok;_Z,Qm ƉmjF,NmAc(V tb--BJpŽx}~ćsv7>'[%`z(nU*/|3IK`N첾z$ܡj48~!T{lп9IQW~RiŤ)ԙlY>;3iFlR gpE|;pT]Y۵k[(Q˸H: sH+l11[ӉB$U X,c4{d \vI^;I 0wkgnٌҸ!^e˪ݭ~{L7}9T)Um5zZU#薃J O?Óڟ9& [ Q8%EtJ ?v&+=yf[T|#<`"r WN~cWxA]}ʓI/ksr[ T%15VE;2LYJ~'3 YyܤnWIjN44͝Y/v#Ӟ7*LpeʓCP:`4xVdSk ! [1:ۿ$fJk"gmKӭBхTQK-Wo~J&֢ 5,{ O:^}>kaG>*s*jύ] F<@WM+0|aMd |CTUjzs }APqGkIbEmI[c -#dM3S2mC1&Clx_ ADw@wPr9g~rӺX\*>%aՓ=uRi)j1KV>=V3U XRwfVzE_NH3"zFf^vv+b̜)7?PяEоt_Li2h. cٗ`T7o hkӛ9*PV\&§܎$YWQfQ1wORKF2U%`ukR@+aEv<0E 1{I;x C~ qۛn 0-M"fl6jݷ2cA/+\]޺¯pkCv=YuEG2cw8=3݋Vw='3.i 50'm³g}tt:]xCL LS<wյogvl:,Nbd (KL>aK& %S2n;{S"x27o+W.>9g 0Dzϥ!|y6U䏵cg!_Ƽe2)M⍙'qrq icX0~5 _OҼÑ^#Cڬt Ӑb"BK !@V}ŹgGlcj )6biyk|vKԡ|~MK|J#;fwEx7#l9]zkysR8~` ]ĖA Α Q.< * 1 ,b)ډJ*/I'i[w5L[]Q-L18S=3ґrLu-I<(c-ܓOجfqIGjXki {q9/͞3xJ2T@ԕp"ʆO؝As/ǣ&h%~q 5-AWHБ3?CTi)< Iu8G.kUTG':rkC{? kfV W)k* -sWG1JF۹ӢAr[1GfP &Q=f"A@RDь,M5c~= ^JeE3m┮6g!"R޼ x"Hq^n^a:ƃ#aǣÌ*vKWMK(Lw#ynΈJ~E׼X5t=@Ĕh,r6*@:[%i{qRI_Yz9~]*Аlid`;: yR3k1eDck \KS;10əFY ܨߑ9l2{mr6)JQXѮr?>m@CU!'V}~ W\ÍDQ nf\oax +AT;' Z4:#I=3*v:Iщu a<ڜ$ o<>É5 Mp-*߻=O#=S:Lwuqolig?'Y- G;ukV6|CٚcOxh[MUz}t$De7ie!(kJ+7ĎxZR]dwѨ^ߵ#zpw]xWf||U6i/tuSr<@sqtHJJ$X_',$Ɠ4khGrK*:K-zpe&?1}ۇh'V'ӠO|.xkb){PF r{<\bg,S>d9I'xg _hۓH5ǩH初r.*G'M:_#?1~]X`; W"8`-Y 7@E{gOՆb}4 !8' sl K(K=3@  2rU*,>6 *w fs No?T9}% J$h KC"2_--+Q =ãJ0}z(I YWyx dx%  C:u#  `ZK $ ݯ~G*ls.bX Yf :u9"V ixG s3Y #O`:y? C v I!l@cKEmqiI&$|xVi7 r5D}vŬ6 9|>4ۃo`[{j;l 30`oIr]*ئ]( J͖͌)pvYaT[9}&:s hsNNGX>,JfpjX?F\? MB0BY ZJ ~] N%UZm`A0ɁA%R & q iݘߢ5? byx ) ) V&  Ӕ/}n D\*i'|$ (EzDu@I g h:s{MuN= -ey in&8W^r!,-S "jd |@c6"&Yu1^>/ 5dMSMdNKwdQf }vs!EV #xF=\7 '`'e3/_&8;Wf $B j<  aj }N 3$) oRGg),LP> }cat  q bqn25=UMi T|Z;>a;TNM3>m ".}  '={6r 0XZJ  `=/cQ  D Է ޘ)VM_ iZ_$Xd BS%/m̵_]vb1mW] l3>TV !T dKD) CenJBFc8be#l]3 W q?R_nC=Lt VQc n7Lک 4 bd q-y$b-f8-hs'nk ~ R-s&p MpF X M+\0u<g s ٔˏ dm}} 'r:n"jJ_V#W$?qzAm WSV?5U tc["k7U `g j0  rjA}}hbRsA_Z{-x K1E;(ZUg v 7o- ?u 4m  M ƈNJ\[{5 x2N)ƴ6 *ٗ-we{%QL(a 6 LJA^A?/Wu m 76V^%\UX6 -j,3n[DH -<- Ue3M+>t ?O\?! (  eW D448٩e>GFɆq ^o+1 dj- 'p@V, b  '_|=%=NKi;i1 PyfP"X<!bg 6  "%) +IUr cr~ Ssy*`!?TX ~W& f]28wۘ8n#c e lc? "f: A3\ cV\{f ASs-Kx%z 2Gy k "oT[< "^PĔʑ rb)#D >b1J$; t̥ss .P{iw ag%`rsS Cv, ΑtT,N3dsgk "p! #M>i  &NՂJCƊ& 6p)bCC~ ! 2 i _ 3<.P' WQF Q E O` "$o!r!6/bX {ɲ 2 Vqn V 6)p}IxL6e  N +e] ^[A}o$`Ch (tb3ϊ ,GUYat ByZ g0v̢N aO,xdlJ#Oa e`u L?/ {d 8xbfLkksݰ?#o sJ jjr Gb+cBcQ :rWx$@C.LR1 UcE( 1tY o]y Uq ux|Vv -oa Xy_ >NLWq{|ы  hZ0s;7vb dI/@  Q(@|{ > [ކ: ,VI$2v9' ̈́e7Q  9 |tEBRM,uN; j 9=A p 8m {-2-WNt= 1$u.R,'Q yf [r I 9l q oEEw"8cv t -4A ' -z waj+0GfP  ;Ě +| h8d}9@T;^h (_KT h l_r4  {s   d (@ Or>)tN|r&n5t=3DqRsXЅk*UV[ʬ {W4 lWB|C'@ L tk{NX/ q( %fDܰ [y9xoW ɽ_>ox4 b -1 4H ݓ"eE Bۇc <=I x@ .wvzwv m`yXjJRO1-B0rv5/V I! *0W! Pf` B Dks , )NHk#k<&f -#[ B{ (LOo` /D)9` 86J_8! KZNzHz[3mbӡ1A} ޟ - ,$0V^ l E9{ |2p$ciN4B@TA)C[ DrI:J}@n*klއ%' I 0UK%TX׬0%y|8njq OxҶ x^7 i g uJ G1)#f N O f8o<* ],]Ne:yu ):6 } ^Ej =+$ Y5m ? _ e& aZCnD)(mij1K5 KK{ _ T? $ O/h +si`_hZ @6$+bHsy"L "Z9 *Z]YS!J= CfOeX ] ]r _4YO>8 &|% Gg!C j) mˢc eJ"Xp ? M 4 $(DXh =C\Y!je 7'9ƾKH ]- ǽ7SA$>%{d -)BL &9n~Aw5qAT v^$ s  KZOvGvN\tT ' bHߟ zz  #κ(+8 Z-~Z5}'#j 'ݦ T}gR T H p9F\ _j4#@;yn/9i vR<gq,j d (]0 hgb/tI m"NO_1F54)! bK`iw; jThg,6m̶0$y͔ jr~8G#r]o Ja ^4`f@ ZjUCD-,{n]_M26[Fa  jp V` -  lm](c =6;"$AdiF } @VҜpm|o a BD}II9ݜW+6pyW-9w] Y_doi LGe'/p8 !o,](,ЌҗQ1zȜoc:W IvE RdKJ )N|%Ymqst 3bLjnB( C ų uE4!j V d. ql. aTm6 BN !E r$Be*BFWry@|)VO5an){J,B-@&/  6U f=!7hk . ܍ 2v*{EU% F{3gk\~ "}3m 7$ 5|0 &i<;D"  H 8 } ! aW! t SS H/`;ir % /Ly]΀eUc5V ?JW9 t\ci q*YtȨ >q K e# |UwVkOC G  m% ODYKByy@eDt Az\ |: .;ѵW&&g! ny-@Kk ~ = 5D2Bd c p5u'y AS- * `m5E<  1Nsa-m|x  x?~4?2 i% PLj@T b Bc 7q>Gd F)0.? HLa]4Okz.LiI U v% K>o $hD܅bgubu \Ib* pP 'ZF^=WpWgf  qci,+2ЩgJvZbTQ/FvRPm>Ŧ ~|U ,׸c  )0;34R R2 )3} 8I6GWwCLL| Vq.Wxԃ' 0C !JR .C,x.<iFZ!)*O@N=+T~}c1~  ~ON I @\t{"RdfbmͷXi68_ 6 HWZ  t'<d5=r k ҭ Bq%  \ iq _ 9.bu@xbr  H tP\f O-8fNO}>(v@$ (0ـ>JL'L+kGYhϡNj73~ fNxLEp_ A&;k }ZbM{]^" qt j|a;G\WـN*@g@i"oyx NzKP)5QG+k#PS߃}ZڌlaB^ s̭ vL]'d?*ACrY%GP d X޿A M<Oy۸r%jxqCd [9  %" YT|yM&n e B@MeI q/hgTN3N2~*?U&H )L>   do 2 6-îX -?5BsL@ . a2.p =, x'V ,EcK<O ]zZ1hP&o 6Dm@j j Wd%DiC ?J X g/w Lop@zBr"2 WRMjGw9Fw?[9@Lw^CŌ*LԬ*:,QP6w }-` x ^ @NZC$< Ԟ{n DZstQ/ (zrKd #jbfn ܷA >\Wk6 "y(/ yo`<_1YC'8]'m2"?'"gML0g/~E_[2 |P- e!@ }%6 6 C&k+Y;I {CM/q$#4V 8 0BM=Ԙ o:cM=VAe/# Y9fIi:  huXJ &lz, ^/$)ry88f@Si Tj< ~ 5R G 1 = >Zfh TM"v{ _l yS< · _ ݙ-y/ S 2YMKQ rwh-F?~*Tr"{9#H7w/C 2'+  6Mm  cC 3z]>S\> dR2Cu*D4-3Zn#b,8;A\ KH 8~1oS9 -KqV:qY~RO@G%vI6J BŐa9.~Wz5/ Qr<*W Ň-y\>&\6J&}:mOq p#'MRv fA pA eN )7osrAboKpFW&c-v<)u  r5 :9 d  X h?XY=7 22d3v b},z-Zܦ>9S ^ DR ͪ05.r]8}oEyS~Hyn 9*  D V- 8::3{yN *,sn5ĺA T = ] $'% 3 HG {}Cyw##x@m*Buyjz b{ 3 NmqA>E^> 7dM[ +T[O}MM7 Ҽ*uv =Bm5P0~I+\\Cw xd- aNw UJofdkŗC]arg ' u X2Dx`֢Z2\a;R1 $W| $A% VW}y o2x̏c<  bjb'V ? v mp}0 h*W9{,bV7=sE~ ,##j]H=b a]i7m!@^ D d Z%sU5=oI t P 'hPVx$J]^<-H%J6 Ɩ= Mƺxb!<l *ψqRyQU)';&+"z)yIlX-/ ^ [ bX$ rc tE2{6$8I1 \ )q,_O:h J& xg9nc| rw1J-S~0 z` w  Q#j2[HFX>q&.yN>R!~t[ Y OlucSUs|M< T$=BcCqr;VO2PQ ;= V@xFIO3X,;z;&!Qd  m5%R b~ǷG TI j  2 ;s=R8d_ n@}J !=1R j 6;Lj [ ^{7h 4f9?;-Ub: S d9*S6.  Us  x o׊ *j>*-%)J^5 ?X5Rsg vj:'٩ t B a)  ?n^ixߦI>)z R:Ĉ@* 1 L}ec*@;^jX 6u ɾc71N"E XA  jmZµ ;e:^y/ w$X"e4r#L"*J w D.eƏ-~ q٭/_ޱ  ̕ B5i0|נ:{[Nrf! (ө- jD ". H }&~G*h* [oi ? `$d(0ml`W4:*SLSTu*\.k ox K @}]o/!KR-Gs< (WXz gH #e7z_3ε c   ?TM\MdZo`-(+e\\S aگ,,' /x)z,%<Ixhq8 &jd\)W T b &bV J Ij>lb 2 qd_ E<= 86(CzH$ @BJfUޯf܇H&Aqp}G J") SfG,lI quto!v Hq{ Da^yr{ P  0_$ C%bA\)E4oc =Oq aħ!dyBOW: :) T˨X/\Wמ,=I xLb`  !) 4f>VkW }+c V% Kn"M*S ]ہ) @RǛ:vgKvkbu <Y_ cQ+2zZlwU 8Cx]^e$ c O ʬB]n2   >z a6J~ QOr9<t|VS P3NQ.I)}yf!  p9,j!h `1(elƎ-`\eBU$}i stħ (p4yw *O13%fAYrJ7[ (=ETi*~  jȱ# QZxJr9uJu qP\1fLz -@'ùziWZ )  lr +-hb# dڸ pW3 Q (u% Wz$ g*7O] wA_.v~3v]< 7Z 2toq>  "L ̼$[AdR`Z1imA c@ !) vc*T vw[)caf?eX'W\_^(G ^%%y*[-J Wy?6FV_ Xu lg!  _B@ PU1 fk -M+kE#!HK Y kS/~O-DNCS^DžN9IKk 5iO  $*Qda  u e u_pYJYiI93 iOo}+ )@pi&YX 1 8,bp*}/Uo  )}v6'jxW=70_S?*:,ljI@ l(pF~Q0;+h<vYUKSzN#, +Wr,V MbǾ7ru<rJgSak BV" Czx5 AP e|p| :?Q3epu4QbS#A  q   g6ФQ%ixnI*J#tvDxB -y=$EeB e} <( }5lւIح( X X[W zEhC w.a   j =p6$ ^ CXGKXO/% N/9Zqtb\j B>rye5hnB8M]:f H=;k : UF =M{w==]M {݂ny9 <7Ce jlb  `q`f 0 ʚfE81%:'}xx/^yi7SQ6 ~9TYpKQ/u jmͦWYIf_{, A 'ϟCwH!WWy4||5G& ȓ?.lSE.HuJ1F5# s `&9p1vjT6h|  ICe @ *m |gX')K® Xs;dpgp y\i*I{ Lj>X&M{/G&&b.#W OO;{W3U'*R&WK!zLxx'L% ͢8q`VH N;Z fWJmMnk9o0ts2 ~5@zTHE{ SYwfi' V3b#QzwB(q! x=R ;\qyS Oh ryf ]NYX% 9 T2P$EsEH 0&F )h :{}Jh8pMJ6Sc} OkfszO FPWH:]U k^g V kCR%%D)z k iֿ| )3\4T;B| h%RY : ! *t$0 ՙ=z,H/~JjV3D(s++@# i­tkPU<UABP@C#O p [[A8Q] mc +sV;F{D?(' K/> (~l/}y| R6G| UaVaK uҞOV!vgA I""! a| [ gR :n b7'ځl BUAW 9 0 +(Mb:) Z 4O'1pu nN775C TX ϧ^.^d.6(}!.x JY£ 9Dzd(;G, s#E0(wT8jD`b-"* ©O$9+" S 0>KuW>kU.6GIU$X5 7E!fN -e,b|=b CDIٓ- M" qө }mؖ tEY : -y 9 $kwҲ]~  ݡT} Q2Y Fgp T3_@ ~kWg,yj;'{9߾tю0 \:6NC5 `K n)Idri I؉  [dOi DJ  W;iۡФ,fI  TP T'p \`(i 3 MdbgpG DvZcn,dk<!+|?+<5=pQ #)%'S"t3 A96- ^ 0u 9h I9 hq4ghm { M1P H÷. >Z dS ~Q u VIWM w=/4W:3QcR / qd]z>%v  ʩxϷ/AgU7 !Uy K (Iשql-bJ? . j\r &|z ) " }r i߇zr V` S 9m<f8 7\fєY.I uk(9 _ >T2+ +3".wZHs*`ܧl L&Ai8<1/qnI"bOBP1RGwZl6  8 i > #:|%}be8(o i) B5,Bm ZKF u V"t*uVW/[ZK e )P Gq^8<TJk w *fQua1N pX*mzO Fm26Pkl[@ b WI" 7%!;86 \ )Dda[&p } wv;nkc6AI—S=G k(|0 g=?`ʮ TC_ e  =3 ˱=4 8t%*q dx BNq 1D [h yMMXz- u7 2LY\8YSuL%B3uW ZVo  Ō I\ Az ؁) ']Zө1/sǩ-l V;H;97zmdE~nWM@h[W}o-[XB18Tc  K;O _S:Haq$Vm`75 @4:Ֆ ]c ΎgUhL2MtMIJn9=ޙ I>x .;t czJ { ! ߳=A7p!f$Ji^;\ x hq/W7}]S  ec?q ]k+z#̀!h/ Ke. =4| :&1cvoi`c]dq v' 4 #Gu‹$ V WSQr4 0 >r  ; tjo z i ?!U8uf|nᯈ֙njqAUMs5d܏t :z2z"libseccomp-2.5.4/.git/objects/pack/pack-e1af88d6996eeb6a7141d61bf955194d73d73564.rev0000444000000000000000000007320414467535324024560 0ustar rootrootRIDXk5 K Q`^`lFT ' DFuz nA /XBEJ33 ; \s95 M- =x H02Hig S8 F!{ ~j+z# 5  ^w#uQ- Z HZy   \   bdeV[ 02X QmF2!Y3 [ y <{,-o =q Kw f5v 4 ~ 7 Jop\ t UJA Y e. U %8  xV Q r t x}K g$% 8 z +dIWuq / 'N C  U SjV nf5y O; u T Jn }  Fv   2; )0 b7/('*7 ca+ &jN 1i  ,Mqi3% )SQ  eC B 8   Hr%E"v +svZ P~ I*/(@E rw[h ! Q$_qw {X vo 1c bL& M  0 {]!a F /" <p3 C *6 }|0 M1, I  ,"}  / D kX |TZR_}M 9v B| 9PG g.&  i & ~H  5}  > ) A"r 1 in* nj ESI, " 1 \ 0 5 X xg D  \   f'oIJ] : *) d~kEQeF[ q O3 4 # v yh g P& Z]i \@j p    1 Q W _d 7!$ 1Ev4TIG BND:L~VaV|O )<b1~^ }h2&f;W4 } eo_ n 92 tG[+#P 'a$ j q0; jhx< `C wP 4C m&@Do<\( (' & E` 4 G w]1   b ?UK)  m )f _/ {fE sg L Fx '; Xg}# P`5 3   ]S :  R L   w 5\ 0e Y~u L r, @k  t  2UNE w/*tWLU 45*a#, ^K vJV IP)  O C(2 `8y W H ' rHf   bSX6h  \ +fq{_ U Q_T< u8$Z  w_Q -04VL8*Dy=  4i 8z1 u rq IW`  ? ZgC r LtCYs WP 9D  e.p ?i_ k )~oJ A q = `.' B*p G N6l  , tV  p:  W" + }{ ;R} Rb `6g*N/1&G?9FDp> .(y`Wz {V>Rrq h~ a f G Q   {=  /. t fj6 { ctTsV@lM1 yv ! g  BoS GU_'Zy z  k t >[I  5;2 9? N  I D= B  E, t7~7u $ [  "7? ]h9 V! @ s%Y\ 6P  0rdl \^J7   @qY -FT > F II\ VZWYvYN[q  k#4qS; C)  %-i * 5 3^&h y>^/(k  m _AuI|O' 4( PT*xcg!;, = + s EB~    # ?-X 1Nn   9 =. 4 @]R ~ $  <#z J x |{`q d s^v  $A G<C dCB6 nPRfe  Y ^h] 3d 0 npx xX w?  ]OB}]iK  (4!B  dm 4 c& {hxU4VR,0jE R S Vlg9I [A {  9 : W? "0< Lf /` hBlvC m.t6 y? )y @ q?2 ^z (YX%M9)r|? Y=Olfn bke.#  [ SAK} <w$S; 7 m  1 b <]12F M: #"e= 5 *^ | 44J\h1  D?s oz M* Y    =]a. [  K1NGV@9/M M <o{{ c8 qL@7 0$) ? "SO5Z%Qa#:b>bk| { h ;L e o3)(Br Z] 9W if0 |m D Vk T& ;  a%; Rd [~h. < a8*86- ~ @33M U -nom@Jtk}} 57:| nZ~H & :cn&D R 8j %J : Otx u u W  c ] r=[(` }Gb= gSh \dR ]cyql]! ! xB O M 5 sH) Y""  W :**u iO +_ "eiqo !?.k$ ?R 7 ^@` & ( E`OL^VZk> Y48 ; 5y: a^3 * v ;e Hc~36? b )f P'j  o, jZy5z 1 ),  } u *S c/ ]o 6 ]7dA "K}p% mbX H% ;Ld &A o N|d 9_ :* < 6 +B 7 }0Y z.!j^M^ w}j 6 " (6nPU2eVS(a n[ nfM .> + 3" GaL& Q fDs O"f L  kp hu I ^ HzW"=KlG b fVY ~ , YkH OQ X 9  i TMG|L ( |- Z%%p M  P%@F6 65BK I3e g 1 ^pc(68Tgb@KDG>-C s ' OxU3RF2$8 b U f [R  ww ^p a[:@ |b 'R /s %:Gm:"Q, NS  6PJM { X . N<  7M 'I# n$-=AC ~ qk , ^ D  |+mW  K4[t  WzB; dB_  w+ d s a Uk ` b %$u_ O pz P {H ?T E" K \'`X & $9 u{G #@  C r[sThy*Yy j==B  <-X  f&G p* { N'} O *HzM!  .= v  pv6[ KS F "8I. JRl ; (a  =V=  : 7YK  >\H)<Du [;vo jY> :I Ks C { F O|r [D (H h& 2 J>)T7%U "L( e c  ^ -)L!0  i ]D.U Ig D1 ? h ] F k )qAE o,T  UW3 0 &# E q M S;  s Jn xG rg6c | c  ! e1X1 H & S qF-S \ : yWH #j*B LU  ;R|#*>!i~ u @9 I`"` `B * N8!}/97s K  ]6) = F  EkEa,"  )7u p RRFU $ 0X2?E04J| + KjH1 _ #  m l-, O' ja >_T'  n8@bTy$  yA d_"@ ` LT  Q)!  Otm%ne, (7%.4  zuW AAX \ -<B(tX    EeVr( ` % A/N`mZh ~yC $   3 A @m t+YT C)  lv$ <q5 44W BQW 1 P* g=L 2 d LmE 2O vPJ 5 !KH#$X 1 <x ZmHY-v ei A.  k_2n }M+5wOQnqZ4RUZ2 T  | N~ . e t8 /wM}%BP wrxL5'i mb D jJ| aK '7  s-/gD  xk/. #) kK9z J O= ONr  1\ YbFx tb  Ur<  ? h? > Mi yB < d u R  [ 2 ) I:Xz ov _ZFc m \Ai387BJ {: CRf;d&> 39_ A1X, LI gXV eV(un=u\ sa[ lw4 F     E%  Jkiev?2 Y @Vo [>pf X j ~ S  [TG  Ji<m" M :  I  r! ^i0 R_g CH \ 2>#jz$  K"N/ D}k! P  b6 sj  P{ ,>  ,dhNg K [i~ =j #* JA l1,:  (i sx eWfHzwv'-u97 K+c- k <7q G!dwQ  tvS%CE( l Dn tl d??s  \`0v cg >M Tl.  ,;WO3 h e u % :S= X' 0jp'  OI~\2 f K HC'e _D $79S G _r ^ET 2we Hf r@  al q- } y)   z@|H a)AuC ^  x Z 38mWZ Cv-wG9;ATLmt | . UmN  v h d  BY:{ _  ]RB / >eWW +^ \ npZ %;a*T!$ ;d# NVM _F `oxw pC V' "  Q"rDh CbFc y ` NWEc `1#J4j>z ] Z'n z Z4m | h>}6Z +CfQ JT ?nPLcUx ]Nz  -q# e,]I  2Xo sl 85b ai  -Zp S & 9  K ,AA    m9X 6K cl a   { : - 7wk>  q@P cU:~x rN &  ${O+y U&<5y 8  ' poxh ].=w\H; / p J 3sg T=w'w Y? ~5yz+dtn I z+2 8 F T&J _ </j:7 A_ QQu^ pa;$pVo!E Pm k 2 l D g& j o -f / M S  K9,m0gkP \# 8! c|E # ! +~4\ #i 8{  P Vl+Ac# 8? U ?,  O0&S$ F5n<uL `N/z  At s_ 7 vO J#Q   Y cO9 |F3QotW y ldX Hs R _[<! b%^.z`Y3 x"GQ +8 h G |2 0n r]b{-s>s  T  zg  3 L @ U  u6G* ' X {=,J3d% 4 x]( aPP: l]o y8  Z|Q bC  hplyL5 06p( r (7 ? g$^G UaM  $ R ;+.9+c+ ]V/ i02c[q ! :p$ K F   }lB<s6Q cZf| D @% m ./ 6 Uj  N4t  r x F 3 lIIv0 6+E ed >a 5-zC$\ 9 va >W o5 ku fR^  Vtx R /g  Eo 3 lS E~U7 ) <o1p 0  .P `Y} h  iSD DR +^NgG b rL  j >BHx  Y&G.8[i -=GmNDS!  /w  TZ 2 @N > X  @q All[  A~%6dQQ c P I r tt  { (C  \ M w}ᯈ֙njqAUMs5d )A:X0fD libseccomp-2.5.4/.git/objects/info/0000755000000000000000000000000014467535321015577 5ustar rootrootlibseccomp-2.5.4/.git/HEAD0000644000000000000000000000002514467535324013637 0ustar rootrootref: refs/heads/main libseccomp-2.5.4/.git/refs/0000755000000000000000000000000014467535324014155 5ustar rootrootlibseccomp-2.5.4/.git/refs/heads/0000755000000000000000000000000014467535324015241 5ustar rootrootlibseccomp-2.5.4/.git/refs/heads/main0000644000000000000000000000005114467535324016104 0ustar rootrootf1c3196d9b95de22dde8f23c5befcbeabef5711c libseccomp-2.5.4/.git/refs/tags/0000755000000000000000000000000014467535321015110 5ustar rootrootlibseccomp-2.5.4/.git/refs/remotes/0000755000000000000000000000000014467535324015633 5ustar rootrootlibseccomp-2.5.4/.git/refs/remotes/origin/0000755000000000000000000000000014467535324017122 5ustar rootrootlibseccomp-2.5.4/.git/refs/remotes/origin/HEAD0000644000000000000000000000003614467535324017545 0ustar rootrootref: refs/remotes/origin/main libseccomp-2.5.4/.git/hooks/0000755000000000000000000000000014467535321014336 5ustar rootrootlibseccomp-2.5.4/.git/hooks/pre-receive.sample0000755000000000000000000000104014467535321017745 0ustar rootroot#!/bin/sh # # An example hook script to make use of push options. # The example simply echoes all push options that start with 'echoback=' # and rejects all pushes when the "reject" push option is used. # # To enable this hook, rename this file to "pre-receive". if test -n "$GIT_PUSH_OPTION_COUNT" then i=0 while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" do eval "value=\$GIT_PUSH_OPTION_$i" case "$value" in echoback=*) echo "echo from the pre-receive-hook: ${value#*=}" >&2 ;; reject) exit 1 esac i=$((i + 1)) done fi libseccomp-2.5.4/.git/hooks/fsmonitor-watchman.sample0000755000000000000000000001116614467535321021371 0ustar rootroot#!/usr/bin/perl use strict; use warnings; use IPC::Open2; # An example hook script to integrate Watchman # (https://facebook.github.io/watchman/) with git to speed up detecting # new and modified files. # # The hook is passed a version (currently 2) and last update token # formatted as a string and outputs to stdout a new update token and # all files that have been modified since the update token. Paths must # be relative to the root of the working tree and separated by a single NUL. # # To enable this hook, rename this file to "query-watchman" and set # 'git config core.fsmonitor .git/hooks/query-watchman' # my ($version, $last_update_token) = @ARGV; # Uncomment for debugging # print STDERR "$0 $version $last_update_token\n"; # Check the hook interface version if ($version ne 2) { die "Unsupported query-fsmonitor hook version '$version'.\n" . "Falling back to scanning...\n"; } my $git_work_tree = get_working_dir(); my $retry = 1; my $json_pkg; eval { require JSON::XS; $json_pkg = "JSON::XS"; 1; } or do { require JSON::PP; $json_pkg = "JSON::PP"; }; launch_watchman(); sub launch_watchman { my $o = watchman_query(); if (is_work_tree_watched($o)) { output_result($o->{clock}, @{$o->{files}}); } } sub output_result { my ($clockid, @files) = @_; # Uncomment for debugging watchman output # open (my $fh, ">", ".git/watchman-output.out"); # binmode $fh, ":utf8"; # print $fh "$clockid\n@files\n"; # close $fh; binmode STDOUT, ":utf8"; print $clockid; print "\0"; local $, = "\0"; print @files; } sub watchman_clock { my $response = qx/watchman clock "$git_work_tree"/; die "Failed to get clock id on '$git_work_tree'.\n" . "Falling back to scanning...\n" if $? != 0; return $json_pkg->new->utf8->decode($response); } sub watchman_query { my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty') or die "open2() failed: $!\n" . "Falling back to scanning...\n"; # In the query expression below we're asking for names of files that # changed since $last_update_token but not from the .git folder. # # To accomplish this, we're using the "since" generator to use the # recency index to select candidate nodes and "fields" to limit the # output to file names only. Then we're using the "expression" term to # further constrain the results. my $last_update_line = ""; if (substr($last_update_token, 0, 1) eq "c") { $last_update_token = "\"$last_update_token\""; $last_update_line = qq[\n"since": $last_update_token,]; } my $query = <<" END"; ["query", "$git_work_tree", {$last_update_line "fields": ["name"], "expression": ["not", ["dirname", ".git"]] }] END # Uncomment for debugging the watchman query # open (my $fh, ">", ".git/watchman-query.json"); # print $fh $query; # close $fh; print CHLD_IN $query; close CHLD_IN; my $response = do {local $/; }; # Uncomment for debugging the watch response # open ($fh, ">", ".git/watchman-response.json"); # print $fh $response; # close $fh; die "Watchman: command returned no output.\n" . "Falling back to scanning...\n" if $response eq ""; die "Watchman: command returned invalid output: $response\n" . "Falling back to scanning...\n" unless $response =~ /^\{/; return $json_pkg->new->utf8->decode($response); } sub is_work_tree_watched { my ($output) = @_; my $error = $output->{error}; if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) { $retry--; my $response = qx/watchman watch "$git_work_tree"/; die "Failed to make watchman watch '$git_work_tree'.\n" . "Falling back to scanning...\n" if $? != 0; $output = $json_pkg->new->utf8->decode($response); $error = $output->{error}; die "Watchman: $error.\n" . "Falling back to scanning...\n" if $error; # Uncomment for debugging watchman output # open (my $fh, ">", ".git/watchman-output.out"); # close $fh; # Watchman will always return all files on the first query so # return the fast "everything is dirty" flag to git and do the # Watchman query just to get it over with now so we won't pay # the cost in git to look up each individual file. my $o = watchman_clock(); $error = $output->{error}; die "Watchman: $error.\n" . "Falling back to scanning...\n" if $error; output_result($o->{clock}, ("/")); $last_update_token = $o->{clock}; eval { launch_watchman() }; return 0; } die "Watchman: $error.\n" . "Falling back to scanning...\n" if $error; return 1; } sub get_working_dir { my $working_dir; if ($^O =~ 'msys' || $^O =~ 'cygwin') { $working_dir = Win32::GetCwd(); $working_dir =~ tr/\\/\//; } else { require Cwd; $working_dir = Cwd::cwd(); } return $working_dir; } libseccomp-2.5.4/.git/hooks/pre-commit.sample0000755000000000000000000000315314467535321017622 0ustar rootroot#!/bin/sh # # An example hook script to verify what is about to be committed. # Called by "git commit" with no arguments. The hook should # exit with non-zero status after issuing an appropriate message if # it wants to stop the commit. # # To enable this hook, rename this file to "pre-commit". if git rev-parse --verify HEAD >/dev/null 2>&1 then against=HEAD else # Initial commit: diff against an empty tree object against=$(git hash-object -t tree /dev/null) fi # If you want to allow non-ASCII filenames set this variable to true. allownonascii=$(git config --type=bool hooks.allownonascii) # Redirect output to stderr. exec 1>&2 # Cross platform projects tend to avoid non-ASCII filenames; prevent # them from being added to the repository. We exploit the fact that the # printable range starts at the space character and ends with tilde. if [ "$allownonascii" != "true" ] && # Note that the use of brackets around a tr range is ok here, (it's # even required, for portability to Solaris 10's /usr/bin/tr), since # the square bracket bytes happen to fall in the designated range. test $(git diff --cached --name-only --diff-filter=A -z $against | LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 then cat <<\EOF Error: Attempt to add a non-ASCII file name. This can cause problems if you want to work with people on other platforms. To be portable it is advisable to rename the file. If you know what you are doing you can disable this check using: git config hooks.allownonascii true EOF exit 1 fi # If there are whitespace errors, print the offending file names and fail. exec git diff-index --check --cached $against -- libseccomp-2.5.4/.git/hooks/sendemail-validate.sample0000755000000000000000000000440414467535321021276 0ustar rootroot#!/bin/sh # An example hook script to validate a patch (and/or patch series) before # sending it via email. # # The hook should exit with non-zero status after issuing an appropriate # message if it wants to prevent the email(s) from being sent. # # To enable this hook, rename this file to "sendemail-validate". # # By default, it will only check that the patch(es) can be applied on top of # the default upstream branch without conflicts in a secondary worktree. After # validation (successful or not) of the last patch of a series, the worktree # will be deleted. # # The following config variables can be set to change the default remote and # remote ref that are used to apply the patches against: # # sendemail.validateRemote (default: origin) # sendemail.validateRemoteRef (default: HEAD) # # Replace the TODO placeholders with appropriate checks according to your # needs. validate_cover_letter () { file="$1" # TODO: Replace with appropriate checks (e.g. spell checking). true } validate_patch () { file="$1" # Ensure that the patch applies without conflicts. git am -3 "$file" || return # TODO: Replace with appropriate checks for this patch # (e.g. checkpatch.pl). true } validate_series () { # TODO: Replace with appropriate checks for the whole series # (e.g. quick build, coding style checks, etc.). true } # main ------------------------------------------------------------------------- if test "$GIT_SENDEMAIL_FILE_COUNTER" = 1 then remote=$(git config --default origin --get sendemail.validateRemote) && ref=$(git config --default HEAD --get sendemail.validateRemoteRef) && worktree=$(mktemp --tmpdir -d sendemail-validate.XXXXXXX) && git worktree add -fd --checkout "$worktree" "refs/remotes/$remote/$ref" && git config --replace-all sendemail.validateWorktree "$worktree" else worktree=$(git config --get sendemail.validateWorktree) fi || { echo "sendemail-validate: error: failed to prepare worktree" >&2 exit 1 } unset GIT_DIR GIT_WORK_TREE cd "$worktree" && if grep -q "^diff --git " "$1" then validate_patch "$1" else validate_cover_letter "$1" fi && if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" then git config --unset-all sendemail.validateWorktree && trap 'git worktree remove -ff "$worktree"' EXIT && validate_series fi libseccomp-2.5.4/.git/hooks/pre-applypatch.sample0000755000000000000000000000065014467535321020476 0ustar rootroot#!/bin/sh # # An example hook script to verify what is about to be committed # by applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. # # To enable this hook, rename this file to "pre-applypatch". . git-sh-setup precommit="$(git rev-parse --git-path hooks/pre-commit)" test -x "$precommit" && exec "$precommit" ${1+"$@"} : libseccomp-2.5.4/.git/hooks/applypatch-msg.sample0000755000000000000000000000073614467535321020503 0ustar rootroot#!/bin/sh # # An example hook script to check the commit log message taken by # applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. The hook is # allowed to edit the commit message file. # # To enable this hook, rename this file to "applypatch-msg". . git-sh-setup commitmsg="$(git rev-parse --git-path hooks/commit-msg)" test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} : libseccomp-2.5.4/.git/hooks/pre-push.sample0000755000000000000000000000253614467535321017315 0ustar rootroot#!/bin/sh # An example hook script to verify what is about to be pushed. Called by "git # push" after it has checked the remote status, but before anything has been # pushed. If this script exits with a non-zero status nothing will be pushed. # # This hook is called with the following parameters: # # $1 -- Name of the remote to which the push is being done # $2 -- URL to which the push is being done # # If pushing without using a named remote those arguments will be equal. # # Information about the commits which are being pushed is supplied as lines to # the standard input in the form: # # # # This sample shows how to prevent push of commits where the log message starts # with "WIP" (work in progress). remote="$1" url="$2" zero=$(git hash-object --stdin &2 "Found WIP commit in $local_ref, not pushing" exit 1 fi fi done exit 0 libseccomp-2.5.4/.git/hooks/push-to-checkout.sample0000755000000000000000000000533714467535321020756 0ustar rootroot#!/bin/sh # An example hook script to update a checked-out tree on a git push. # # This hook is invoked by git-receive-pack(1) when it reacts to git # push and updates reference(s) in its repository, and when the push # tries to update the branch that is currently checked out and the # receive.denyCurrentBranch configuration variable is set to # updateInstead. # # By default, such a push is refused if the working tree and the index # of the remote repository has any difference from the currently # checked out commit; when both the working tree and the index match # the current commit, they are updated to match the newly pushed tip # of the branch. This hook is to be used to override the default # behaviour; however the code below reimplements the default behaviour # as a starting point for convenient modification. # # The hook receives the commit with which the tip of the current # branch is going to be updated: commit=$1 # It can exit with a non-zero status to refuse the push (when it does # so, it must not modify the index or the working tree). die () { echo >&2 "$*" exit 1 } # Or it can make any necessary changes to the working tree and to the # index to bring them to the desired state when the tip of the current # branch is updated to the new commit, and exit with a zero status. # # For example, the hook can simply run git read-tree -u -m HEAD "$1" # in order to emulate git fetch that is run in the reverse direction # with git push, as the two-tree form of git read-tree -u -m is # essentially the same as git switch or git checkout that switches # branches while keeping the local changes in the working tree that do # not interfere with the difference between the branches. # The below is a more-or-less exact translation to shell of the C code # for the default behaviour for git's push-to-checkout hook defined in # the push_to_deploy() function in builtin/receive-pack.c. # # Note that the hook will be executed from the repository directory, # not from the working tree, so if you want to perform operations on # the working tree, you will have to adapt your code accordingly, e.g. # by adding "cd .." or using relative paths. if ! git update-index -q --ignore-submodules --refresh then die "Up-to-date check failed" fi if ! git diff-files --quiet --ignore-submodules -- then die "Working directory has unstaged changes" fi # This is a rough translation of: # # head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX if git cat-file -e HEAD 2>/dev/null then head=HEAD else head=$(git hash-object -t tree --stdin &2 "No such branch $topic" exit 1 } # Is topic fully merged to master? not_in_master=`git rev-list --pretty=oneline ^master "$topic"` if test -z "$not_in_master" then echo >&2 "$topic is fully merged to master; better remove it." exit 1 ;# we could allow it, but there is no point. fi # Is topic ever merged to next? If so you should not be rebasing it. only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` only_next_2=`git rev-list ^master ${publish} | sort` if test "$only_next_1" = "$only_next_2" then not_in_topic=`git rev-list "^$topic" master` if test -z "$not_in_topic" then echo >&2 "$topic is already up to date with master" exit 1 ;# we could allow it, but there is no point. else exit 0 fi else not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` /usr/bin/perl -e ' my $topic = $ARGV[0]; my $msg = "* $topic has commits already merged to public branch:\n"; my (%not_in_next) = map { /^([0-9a-f]+) /; ($1 => 1); } split(/\n/, $ARGV[1]); for my $elem (map { /^([0-9a-f]+) (.*)$/; [$1 => $2]; } split(/\n/, $ARGV[2])) { if (!exists $not_in_next{$elem->[0]}) { if ($msg) { print STDERR $msg; undef $msg; } print STDERR " $elem->[1]\n"; } } ' "$topic" "$not_in_next" "$not_in_master" exit 1 fi <<\DOC_END This sample hook safeguards topic branches that have been published from being rewound. The workflow assumed here is: * Once a topic branch forks from "master", "master" is never merged into it again (either directly or indirectly). * Once a topic branch is fully cooked and merged into "master", it is deleted. If you need to build on top of it to correct earlier mistakes, a new topic branch is created by forking at the tip of the "master". This is not strictly necessary, but it makes it easier to keep your history simple. * Whenever you need to test or publish your changes to topic branches, merge them into "next" branch. The script, being an example, hardcodes the publish branch name to be "next", but it is trivial to make it configurable via $GIT_DIR/config mechanism. With this workflow, you would want to know: (1) ... if a topic branch has ever been merged to "next". Young topic branches can have stupid mistakes you would rather clean up before publishing, and things that have not been merged into other branches can be easily rebased without affecting other people. But once it is published, you would not want to rewind it. (2) ... if a topic branch has been fully merged to "master". Then you can delete it. More importantly, you should not build on top of it -- other people may already want to change things related to the topic as patches against your "master", so if you need further changes, it is better to fork the topic (perhaps with the same name) afresh from the tip of "master". Let's look at this example: o---o---o---o---o---o---o---o---o---o "next" / / / / / a---a---b A / / / / / / / / c---c---c---c B / / / / \ / / / / b---b C \ / / / / / \ / ---o---o---o---o---o---o---o---o---o---o---o "master" A, B and C are topic branches. * A has one fix since it was merged up to "next". * B has finished. It has been fully merged up to "master" and "next", and is ready to be deleted. * C has not merged to "next" at all. We would want to allow C to be rebased, refuse A, and encourage B to be deleted. To compute (1): git rev-list ^master ^topic next git rev-list ^master next if these match, topic has not merged in next at all. To compute (2): git rev-list master..topic if this is empty, it is fully merged to "master". DOC_END libseccomp-2.5.4/.git/hooks/update.sample0000755000000000000000000000710214467535321017026 0ustar rootroot#!/bin/sh # # An example hook script to block unannotated tags from entering. # Called by "git receive-pack" with arguments: refname sha1-old sha1-new # # To enable this hook, rename this file to "update". # # Config # ------ # hooks.allowunannotated # This boolean sets whether unannotated tags will be allowed into the # repository. By default they won't be. # hooks.allowdeletetag # This boolean sets whether deleting tags will be allowed in the # repository. By default they won't be. # hooks.allowmodifytag # This boolean sets whether a tag may be modified after creation. By default # it won't be. # hooks.allowdeletebranch # This boolean sets whether deleting branches will be allowed in the # repository. By default they won't be. # hooks.denycreatebranch # This boolean sets whether remotely creating branches will be denied # in the repository. By default this is allowed. # # --- Command line refname="$1" oldrev="$2" newrev="$3" # --- Safety check if [ -z "$GIT_DIR" ]; then echo "Don't run this script from the command line." >&2 echo " (if you want, you could supply GIT_DIR then run" >&2 echo " $0 )" >&2 exit 1 fi if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then echo "usage: $0 " >&2 exit 1 fi # --- Config allowunannotated=$(git config --type=bool hooks.allowunannotated) allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch) denycreatebranch=$(git config --type=bool hooks.denycreatebranch) allowdeletetag=$(git config --type=bool hooks.allowdeletetag) allowmodifytag=$(git config --type=bool hooks.allowmodifytag) # check for no description projectdesc=$(sed -e '1q' "$GIT_DIR/description") case "$projectdesc" in "Unnamed repository"* | "") echo "*** Project description file hasn't been set" >&2 exit 1 ;; esac # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. zero=$(git hash-object --stdin &2 echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 exit 1 fi ;; refs/tags/*,delete) # delete tag if [ "$allowdeletetag" != "true" ]; then echo "*** Deleting a tag is not allowed in this repository" >&2 exit 1 fi ;; refs/tags/*,tag) # annotated tag if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 then echo "*** Tag '$refname' already exists." >&2 echo "*** Modifying a tag is not allowed in this repository." >&2 exit 1 fi ;; refs/heads/*,commit) # branch if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then echo "*** Creating a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/heads/*,delete) # delete branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/remotes/*,commit) # tracking branch ;; refs/remotes/*,delete) # delete tracking branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a tracking branch is not allowed in this repository" >&2 exit 1 fi ;; *) # Anything else (is there anything else?) echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 exit 1 ;; esac # --- Finished exit 0 libseccomp-2.5.4/.git/hooks/post-update.sample0000755000000000000000000000027514467535321020015 0ustar rootroot#!/bin/sh # # An example hook script to prepare a packed repository for use over # dumb transports. # # To enable this hook, rename this file to "post-update". exec git update-server-info libseccomp-2.5.4/.git/hooks/prepare-commit-msg.sample0000755000000000000000000000272414467535321021261 0ustar rootroot#!/bin/sh # # An example hook script to prepare the commit log message. # Called by "git commit" with the name of the file that has the # commit message, followed by the description of the commit # message's source. The hook's purpose is to edit the commit # message file. If the hook fails with a non-zero status, # the commit is aborted. # # To enable this hook, rename this file to "prepare-commit-msg". # This hook includes three examples. The first one removes the # "# Please enter the commit message..." help message. # # The second includes the output of "git diff --name-status -r" # into the message, just before the "git status" output. It is # commented because it doesn't cope with --amend or with squashed # commits. # # The third example adds a Signed-off-by line to the message, that can # still be edited. This is rarely a good idea. COMMIT_MSG_FILE=$1 COMMIT_SOURCE=$2 SHA1=$3 /usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" # case "$COMMIT_SOURCE,$SHA1" in # ,|template,) # /usr/bin/perl -i.bak -pe ' # print "\n" . `git diff --cached --name-status -r` # if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;; # *) ;; # esac # SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE" # if test -z "$COMMIT_SOURCE" # then # /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE" # fi libseccomp-2.5.4/.git/hooks/commit-msg.sample0000755000000000000000000000160014467535321017615 0ustar rootroot#!/bin/sh # # An example hook script to check the commit log message. # Called by "git commit" with one argument, the name of the file # that has the commit message. The hook should exit with non-zero # status after issuing an appropriate message if it wants to stop the # commit. The hook is allowed to edit the commit message file. # # To enable this hook, rename this file to "commit-msg". # Uncomment the below to add a Signed-off-by line to the message. # Doing this in a hook is a bad idea in general, but the prepare-commit-msg # hook is more suited to it. # # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" # This example catches duplicate Signed-off-by lines. test "" = "$(grep '^Signed-off-by: ' "$1" | sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { echo >&2 Duplicate Signed-off-by lines. exit 1 } libseccomp-2.5.4/.git/config0000644000000000000000000000040614467535324014406 0ustar rootroot[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "origin"] url = https://github.com/seccomp/libseccomp.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "main"] remote = origin merge = refs/heads/main libseccomp-2.5.4/.git/branches/0000755000000000000000000000000014467535321015000 5ustar rootrootlibseccomp-2.5.4/.git/logs/0000755000000000000000000000000014467535324014162 5ustar rootrootlibseccomp-2.5.4/.git/logs/HEAD0000644000000000000000000000027214467535324014607 0ustar rootroot0000000000000000000000000000000000000000 f1c3196d9b95de22dde8f23c5befcbeabef5711c Shi Pujin 1692318420 +0800 clone: from https://github.com/seccomp/libseccomp.git libseccomp-2.5.4/.git/logs/refs/0000755000000000000000000000000014467535324015121 5ustar rootrootlibseccomp-2.5.4/.git/logs/refs/heads/0000755000000000000000000000000014467535324016205 5ustar rootrootlibseccomp-2.5.4/.git/logs/refs/heads/main0000644000000000000000000000027214467535324017055 0ustar rootroot0000000000000000000000000000000000000000 f1c3196d9b95de22dde8f23c5befcbeabef5711c Shi Pujin 1692318420 +0800 clone: from https://github.com/seccomp/libseccomp.git libseccomp-2.5.4/.git/logs/refs/remotes/0000755000000000000000000000000014467535324016577 5ustar rootrootlibseccomp-2.5.4/.git/logs/refs/remotes/origin/0000755000000000000000000000000014467535324020066 5ustar rootrootlibseccomp-2.5.4/.git/logs/refs/remotes/origin/HEAD0000644000000000000000000000027214467535324020513 0ustar rootroot0000000000000000000000000000000000000000 f1c3196d9b95de22dde8f23c5befcbeabef5711c Shi Pujin 1692318420 +0800 clone: from https://github.com/seccomp/libseccomp.git libseccomp-2.5.4/.git/description0000644000000000000000000000011114467535321015452 0ustar rootrootUnnamed repository; edit this file 'description' to name the repository. libseccomp-2.5.4/.git/packed-refs0000644000000000000000000000614314467535324015331 0ustar rootroot# pack-refs with: peeled fully-peeled sorted e510dd19747744ec411510c220b0b8d6fdc25cd6 refs/remotes/origin/coverity-scan f1c3196d9b95de22dde8f23c5befcbeabef5711c refs/remotes/origin/main 0db9f9b5015b8a34324667dfa9f42a1f92a86159 refs/remotes/origin/release-0.1 d8c7e20ba511bdd3408d25dd172bca76ff7be098 refs/remotes/origin/release-1.0 bbd7ca07a7c76d5cd884dbddec58385e1b7439d2 refs/remotes/origin/release-2.0 7772ad82a4368be473826615747180b44f286fab refs/remotes/origin/release-2.1 7932b4fa24c1add0d7a315de8387d216334fbcf7 refs/remotes/origin/release-2.2 74b190e1aa05f07da0c61fb9a30dbc9c18ce2c9d refs/remotes/origin/release-2.3 2010de0b7fec7be113b3c0df918e0ce8512d0d6b refs/remotes/origin/release-2.4 658acd39ac72f7d9fd9c91aca4548dadd26c9da3 refs/remotes/origin/release-2.5 724c572d80d8555d7b8f958b3aeba9b0df6407b1 refs/tags/v0.1.0 ^481c1501b64721591bb7073a078c4020143bef58 4607e03c651d0a97c00b9d2d78db45886e985bd5 refs/tags/v1.0.0 ^24acc5f9a5af6ae561ebac02b51ab6c505178b2c fb3aea57d65c5ed627123b6363c179983c210a67 refs/tags/v1.0.1 ^6ebde29d66ea6b9df1447ccd9b88d2bd46dd82ae 19f7bc2eeb72cdff60937beb15b91b69f45d5f7b refs/tags/v2.0.0 ^bbd7ca07a7c76d5cd884dbddec58385e1b7439d2 2626a9705181df067a4a96b5d436b5bbc9873529 refs/tags/v2.1.0 ^a363a8dfd73821a0086fe985daf8c8e7c81cd8e0 02d279076d3cf3256ea5ba0236c6894961ed7425 refs/tags/v2.1.1 ^7772ad82a4368be473826615747180b44f286fab 57e7372c0e2285728aaa0da71cfde85b01207d17 refs/tags/v2.2.0 ^bd10aab13c7248cc0df57512617e33d6743d33a6 8a88d8977bbc360136ad4f86563ae1361424ca4a refs/tags/v2.2.1 ^f506e0844372b2c404baa482defb62f6846d0e3e 4c90746af4a59e06cb3838b148b4a99698a465ba refs/tags/v2.2.2 ^d7a29fefb03d9c3658854ea7b3cb6a8f082cfb90 8c3506c439016ec0d4feb35f3a7ceacc45343c1c refs/tags/v2.2.3 ^7932b4fa24c1add0d7a315de8387d216334fbcf7 b3549b4ea3220abac5417ce9848789a3c9858672 refs/tags/v2.3.0 ^cba68242e295e2cd9510ec3912414d959d9d4b07 2283314b3c30ff886aa15f67c66ca47137253b96 refs/tags/v2.3.1 ^eedd26dc59641878dabd771e2ff15e729a85ac69 85ba47d21c45b7dc836af24cc48e0f62c1825d13 refs/tags/v2.3.2 ^2331d104bc0cbde5f6c54e504a038e52bfe8e12d bd238fa3e30e58eb60c4bfc87af80f0b2fe49e64 refs/tags/v2.3.3 ^74b190e1aa05f07da0c61fb9a30dbc9c18ce2c9d 93ac9529d5fe042695a490af88ec2938729d22e8 refs/tags/v2.4.0 ^4d64011741375bb1a4ba7d71905ca37b97885083 052922670ce83ab65cf75c74548e9603e5d37d73 refs/tags/v2.4.1 ^fb43972ea1aab24f2a70193fb7445c2674f594e3 afb9ca59b8203f028124ba5f7757ed9845e23e4b refs/tags/v2.4.2 ^1b6cfd1fc0b7499a28c24299a93a80bd18619563 2f39580407a1c6d1173b807bf6345f869c84b827 refs/tags/v2.4.3 ^1dde9d94e0848e12da20602ca38032b91d521427 0b1fb3c46c6f646b26198f4fc32f143e41fb0de5 refs/tags/v2.4.4 ^8c76d7bb694a3f072c5f791c812bb4e2ea385f89 aefe94c2068ae5984fe3293aee1ddd67fbb92c18 refs/tags/v2.5.0 ^f13f58efc690493fe7aa69f54cb52a118f3769c1 ad5c8a643114db8467fc42787c5f6e99244a81c0 refs/tags/v2.5.1 ^4bf70431a339a2886ab8c82e9a45378f30c6e6c7 8ca6c7adedb92fcc3b2474bce110b4531238fff1 refs/tags/v2.5.2 ^9b07575c31840e2d2c6f810b3c7f854d2a952d77 ce16ad07f627c63a237e9f9781859fdda49936a4 refs/tags/v2.5.3 ^57357d2741a3b3d3e8425889a6b79a130e0fa2f3 036d19bf96d1aa753aeb9d75b266482a7ac1a801 refs/tags/v2.5.4 ^f33f95014b36f97b42f0c2290e96d5c31647ed10 libseccomp-2.5.4/.git/info/0000755000000000000000000000000014467535321014146 5ustar rootrootlibseccomp-2.5.4/.git/info/exclude0000644000000000000000000000036014467535321015521 0ustar rootroot# git ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): # *.[oa] # *~

7xx*xl'N 3wΜsϹw<:|8>>&O-{O|tc|pjCpR.XQ21'&pӁRDOX ZSk;{6 Јϭ+?5pn] . Ri.h-yRϙY}jvn.;OCǰ)?, U~&*,*h hkF DƫCEDI*ѪWT7$h"o,HT(ԚAIl6}(B>̹a#U%ӅBuK.&Uo2jxЫ\Qhk)Yь,V5u3p FQ1ո$qd*? NضQX#c4R%|ߺb는۔"ET)$D7ɝ1施x=%OB+kN#+dōF#MD~Ì-aq.]LcM[liYڃXhDytQ%>q&zrT!b F*5KoFAyS $%D8 np"lfY[Oal ѫ-VB]o~$$ccvI6 _[OF1ʩyՈcIǎS| :m}k~0]& 6>&mGXl._NݝH|1ߊfhO`֐zCx`& :^X,J>C.x;Ke@|~zfIFi^r~~qj2*L2B22JstSsrtIFBYXTT\ZTWS0F@krNÌ;=)qx[eCOA|njQz&YxrScWi^F)LD&721;hvG g33 `1 bDX0!a:g !*, L,Ɩ`Y#" aB1L &gγL~<xeJAIDFZL%^gc1bK.LαgrU^D=)}km~j?ZO»wGwS2c kC$9! "EsKW"<.:7X(O҇\FRJo7v^5]5/$OpHJfC !& 4DUm3jK@s4 W8tK8nou}XTY[@*W#F Rq'@k5h HW`ADO@4e[D8lNx+WM3/NMN-O,JΈOLI3 x+WM3/NMN-O,))/N-3O Px;S}&7SfmnbB8X}'rM)䗓SZ\WPZZP_UʥQXS2Cr ;`&UxިdsWxGp.Gt|ĤTҜĒ2 $(U X!7$3(W_P dd攤qmc#mxk $`xNQxU;N@+ R+"(JLl^deZr$_87(Ҏz9ۧp]HN~o^43{vSWl7{sȗ93JCa)3!P&Pi5SVcs=7>W`0ʨB͹oRErr. F=jrx6{Jt"B:01]AzRǯ-zas|=H؁k52,-;-a"o}k;e q~7P"DrJ'<¸ ݰ EUT S=X*;D[G`ڦDGX:x Z&0Sv$."'P H g@#1^u^m^iS'-5WTm#;4xsޮyo\_ÌYfIXDG d ©Fˊ5),GDqK7h]pl~rQq/=&mSdwo.>{-qysm\gK+ky2^?76cVAu*ipڝmh<洫<_8ϐ!W Čib' 2ThCЅ nB:44PP@A͡lUU!hݭMDa m=¯G&aDH Rjyٺ"yFh qk;(\AT^D_xxZHy[>-f_hT̴O06IO'펣TLc-WJUZǝ_ %kat%r>?x0cT# \E 38wlVz 4 /x+a c)Gct 589lb&r`,u1J_?=$4I/9?W85Hd&Az ! %9:\ 99 @$#U ,J,QM.-*J+ɩT#5YLjQas4FF|2[)x]n@oT2ÈE'\R!EqzZﶘ_oqNR"n^ߗSXӟ/c`.h] =BsKsQoIY$wp,grQu;-PaTΚ;i5S3IoeGGFAZs{;ˏ\ʚ  Ј{چ_|SNGcNf3E4l#S UYϠ<Zly(ilQloeZioן׫ji hTA$1]7JT]o8ViFJmMJp`Ƙ" 'Ň;NnaOnI;eU1Bzڼ_?.? n2x_a cf5,x+WM3/NMN-O(/*O*H3J xX[sF~3Pa>Kʗ~OJriYylp4'G{Cߩ4JWGٌLeLktJ6'Jw(tY-A756@B AXFL j.A7،Cq :jK`r_ѝʗtgIm<#Mc4z3-%G".R-^X-M&=)32 !#FV <>*9!H;$yDO9QJ4I3 7!NaX K`o.t: uF>X$*!U4SNRqGhu&M^22A~R6WƳJB펑x9p9[ØIР\Ź"$snćtq(A4_v @aOa0l LtilʿݽR ${UPEK`w˨ A:(aR^#$w#hIztWpB#yv` W*EE6;a⿛|c/PEvc[2i) hYdR 'dW)iKW CY4D @>KC,z* nSn`+ͽ2LR(Ԅ\kV f~!{ tt~:KƨEU@*4C (qHP0uz .s(qs yDpT%LJxU? :W=[ahz`zӤ1n=d!!/LJ#`~DɾǸm ^EK6WPP L?4?1c$-N&#aN] &5.eS@.)#qzڴVM7Ԡ+,Dv+c)C]y+΂[Qr KzbߎzS'zra; A;Ed(Z#ptkClFsBZs#͸7};M׫tj|.0fgm7>˹^pxcsZ,R1qsiYJ?6<~\o2?:sOG1QioB-CC_GK#N5N;/f~q³#^?na+xt^`B"<ϣs;U2.nkX}ABX Kj홉.ſH0NA`yCgsETm!Siȣҹ$!UOrU"˴qcpAnt_ѣڶjfQ*ˑeƟ\qpc s`h.X!=l@ҲrǺ@G@̾̊FH0ĆgĒ)| :wj8>ytv#{Lz='ã9?ק>mx{zWcCO|@kp0WHFBj^IfQBAQ~rjq}l\8&>}*wBRiB PSqeqrbNByfNWRBN~zzjf>l# ux51n@D4AI=)Xi"*@r c+-:U NC!r,H\}9FJ-8>Xcdm v.D\@MxJEscΡg:XMy- Q|KTC#bG5K 2 Ҕy?IHMxU1j1E+7 6R&)Vكei#&l+J)s457Ou]\o6}BkB O# <܂9RoĔh8`℘=[#"QI(T2ӇnߴnBlS>ݤUT#9r-QLI#g%JMQ8T! fS>RGR:F*b3ٟvk5)W7@Y⺦5oˊx-MTP/CA8599? >'?1egsK2RKRJ 2sJR2J٩Ey9'L^ȸBAIHN~td|1X?Ee)) I\z \hVY+diy%y\ťɩPR,QHJUH*/KU(HC1A((xA9,A\)rIXfe(hkp9/J-N*X |ϊ g x&DtG}~zfIFi^r~~qj2*L2B22JstSsrtIFBYXTT\ZTWSPZZ_ Q(IM,N*J-/*Ρ6*$#HoC:vx]PJA s ^BO-%v,l~?C+BC,$彗|~fCH 7uŵ:`A u B VnC  *]Ld '%3d"a1=wnCl$F^T(VJm*0#NV:F'ژZDgXާA: m"5=jItt鉎V\h`_{ʄ `H*3 .dzQ8HQD:p&y~`F7I,:x]Rn@HH4h 9B1a| H=>ލv W@I+ Za֎;|ۧϾ?yz+l~6 L&RF<*LIPT7bbNq{d n뜧fDCNe\QEgnD{U@8* \tl-{J U_IfjՇthZz*|0%iWթj iFs}Vc" WS' mC 5v& vxep^Iřlg_[t%S \T6^ee}&&/tA[1ѧVRziB{5|WLpGHmp/aCkt@/{<&X9s/te =NL.Zf[E|X4~N> 7m)xTMA%zX*^D-`,a٘*nV N2Й=YAo^ŋ?ū'/VL$fSTz_y{y%Ñ7KP&.Wo*_K݆GJȃÕNެtwwʚ5x<@Ɂ_Zۉoq\!(d&! fBm#a`)b΃ }FH #,΅=c\^$3,5 N5B +zB*PP P%  F~l8D و{owZrBQ6%p2>fTYUC.qvRe@W >‎y&t 5FpSa* ˑclébpf"|ʇn"O^˰OM0>w@ )~a BV[Oj|Oh6ag )' X߰つی5h|CY 2=)1V&;'m|uixXo6}hR$r6Ų6CNhȤJRv~(ɉ] 0'?M?Qꕔv^_t^2)}Nj+z)=>@gfhe3W&I*l'_N#-R :%^M|mMz_/D(r:/ˆ5Q2?G0'/&gc"U+z{ט;T\#7˔F)Be>F_0YXoc<#‧R?@\+JQ[7p /oy۵$qBWAk3>y+8--u(8:z"KB??N>\]L{HBL.j13ֈ9ҶZ"(O榤[RaNIGWmPJT6Uԥh=5ٞw3VxV$`/цJ%r<Ą,8q00C[匪vᨌ)[K3%o.ioH Yʘwgv:}Ss@#n偳zChb1tkc:M[N; BK:EKš!\r" T l*̋AX#F´\Vl@.*fcj.Y@e7Y2#,-e]A'氜j[iɝPjnyurzLM&*~1dp_:{'5֫"csh5ՇmS]׉ CJxvvC#Z؏ ꐶn#CKԗd50X}+FOצ!ZpSw8|Gϔx|a[<@&%uL"D5|LspOFmMBxUMN@ Oy1&.Bp&$%axyT.LLzO`WzD?ァYY8pTEЇ;.RGCB(Vpj*\(ZqYVt']x Kz)>([F#hc4ndAhԉuMSv;[ʵE&mi9Rl>/gWx{rPu]C4D̴Ē<b.BejBRjjBrQjbIjBb^_HkIFBZfNIjBr~^IjEBfBf^YbNfg'x+WM3/NMN-/LOO3F KxU͊Gf&6 r`2Kla}%MִVB`?c.ȳZ69MO|}_UW70Ej6L7:vY--hZp)~E)ViQͽ3re+h"O-4 d#+Tֳ A7_~=ppl1ńpC< 45M!:r眐b$J$Ex\Z(p1ЀYثegH!ȭV**0ˍ Bĥ$ Rx+PA?[8[$E-SF ڃ,p!A",֣Psr]ʥEF$WXMwxk+AVa]ItFU8 -^JME1! 2EF; 6)ADLs)jGJ QbQ~+IU.ccO[WNڛ'lwheNsW ER9fh@aa9۝^R1eW,UM ,McO`V4:b.،(-kdN o!ƻ\ o]iT%N?w"UeHu/.}g{j1uZYjP,w\grQ u9؝8)uLY>k^ Xz/p#wݺu>3H$o=0>/# 逩*8}#>P k/gq(2P_̙"^d.h=7\>?tx[]iC<~NfRqjrr~n^q^^jBHFfP(RL.-*J+ɩ䚼_Qa ~#F2ITxUiyn{J $xu?KC1ũ`j*:Z:J̻|M$'d#]\nGЂKw=~ >C)Mk1Ep/GԠ5Lu`T+v%ӵŠ(,43%&J&0. (EJ#IvQa2~Cca1TŠd^J P֐F`FDaMfEІ@1ʐVۿNiBH}A@}\6Eq:c6UC]2ӧ[?fwnfulAx(rAd)f36iB x _d)cfSwV%Izũ@@?'3 SP,V(J,V(OQ% e fQbQPmriQQj^INBi^JjBJjYjN~A.PLG '58( dr 7rx+WM3/NMN-,3h7xZms۸l 4Nt8 %˶:["ųϾ`#ohj6<~E 7_??8l<ȓүݙR`&r\,TDj#U`߫uYԫ[m~Ah.F<' ~v>Ncyio };ӿ=s7uj8mxCOa$`&xuXxR, Vbu3O"$q7X c?"gN&7Ȱ+Ws,NS` 1o!)HyY?"ՖRJF@84$/xoIRy7_M{C}m2C}՟ 1 Aw}:6֥5󐹟^Tȋ%a%m 禚LR{a1җf/nReWZ1ZQ΢蕭:A F6A ]Ew+@YN<2=|'F)T rԂ@p|$r.9v`8a,؁AEF0X_TI#n ɚ@6C^ pZӟD<=hI>( ;-ްh@6t,?}*WdfW틸uR41Cr)rDk5&} ]t]XAe ٟNiABt`..ΛgF/,UsD1#z"ҹيLO|P[R KET*.- 3% c?ߡw||~:`jnsTy;!ژMC +kT6>{g#e6"0+dB["pF&5[$odO 9.2-l*٨eB!d ¸VPdL)gQw"h=_&R\ͷ}yHjC\¨5_9"b6!"/+[l.Ѹ8ڎYk%~ X 8C=d+,?h}㨼_σ@w@N2$hȐ:يA+(FG'Ht}7y2Je+"mySUtۓis%bW8}8㟻O^GyCj8Le.8 ^޵\~91Lh$Twz.0˗?{v_fd3/y8 2|molne!Glg}k_lA|oE,[;dq8x1Cwe3S#uEb޴Ͻgٙ(P¾xqi8cn վmRZ)wz&Jf1A[^$lC֎Śqc<4f;ߴ`++^{Vi0NbѨ4+M 1=A1}up83iBLy|IY.V$"ТP,,cR\Փ(8{OuEҿ(g/ ǻy+o4S?0Pcr37 xS=oAUdY[N V@DA DžD pd($cs7>rw(S_ !GPB`nhN{3>ڑ ,U(R`IXAc ANd@XZsߐJx \\t3ሩ>tXaĮY(:3 )rC *,ƹ.mȐ p5G @HDyFw9NCz2i5S"\p?ytۂ] uWk]ZO[ài/:{a_4_67g3_:N"L~|< 6Bn!e P^/cw&8WW-Փ:F0"S9*g4EcL&8AjȔ1<1PjJ,!7\_;i/6Nx̪L[1"&nIPdΔ"dZQnj bdC8K c2'4|$آ4>ՕN}/v7(B@x}SA:90PaA21PLvh' { _ggvˆ?}L_ C,dκLq 6M`1cȵ9$k(BVPgNKr'p̂n f{If?~=eXO!c篫W;-Aj?F*qz(6H B RigouDz0D2%LJMT2v8*~t$tbSU PvQ 3/4Ml7p@WD"êI*?3c4\{kγ1-x.d"uYK&8 #u% ۆS=|}6v.5y6lЮðUrj=KʰEx>f1avս~v?>xq֓߷\SSyr.[9j#5k;q Alx9hZO6r2%|#9Ugy=tc7/^N,(xmn0/UY.-HhUn\` [)R:cGcmN E9r Rg[Ag߷_ų7cHxQS!Ilfdy8r+x-(XbBpŕ^ '@CTZ#m/vF`{CGwvy;>lhps h4);GQʜI}H)hVr<[)`gq t(B,mt~@>劐 RZg{Ab4WE!LU>O6Bawۀ2AY 1箛{:5H,˜͓i*ĩpJWKv&4WFpTXjzt6ϳ4/0h+U׆ܪ^ɁݵMĻ>|̮C :xU B1 {&PEJ ۑ)Hb;R $-ͯt?*`Cj$*z¹אKe") q͚!(_ac}(yZC[#1(?[Ӳ= x%10 EN XP%$.BU#Ie;LL 1q6??_vKtT B.J0N%% cxNa M !Y CT΍Ļ)z$T- q/ l7.}l٬*9 W쇠Z]ӝއC1xuJ@ԃEr jAhA!ɤIK!MBA<~?_zGwg50iw4,93$EpE&_2A[}w{Uur\pT jR,&q~Ҡh3(X(k>)<cXV!d#lB?/PJ="OZGۇp< 3fӺW#ՂSi!Ðm2/+yyz f} }m `L4rb,TgΗu~[Ԩ`x+WM3/NMN-/*IOLI3 Mx!Rn;cf6vfƘB\c6q`/O,(MK/NMR9IPBHFfBI~~WbByjN.HU@(1*ujKRJr*&dkĨَw#|.xm1N@EE0hD :*0R8Io6xz]\ |*J>.asuv@.;$3>9QKBZpR@QJҭ;S?M8EjUE'p **I/OlThԠiP)?p*5-Lk@ ~wa4@.({ r<ɳ\AVVAk\Dm%=nXlO;m!sxUAOA DP_6[FOx !dN 3ufL/ I^L^iK v‹ـA0^ypgEo*V3f89d % C.D' Z$(lP5 mPi8D\ F39iEn^3^֠M!0"` 5*@\+N}e2 U֚I` fGf&7%G$E ܨkJe❑q_DQMaRcDMJTt$fh/3e܌CͷTka57@hIV~[& "OXX^u+u+7iшTJ!x2ɭ"4DU4vf Sfk#ʛɁr ;ȧap%ai2Q*NT ,bG4C¸ʐ?7' {x 6IN2񇑗ztj趌t=@š[[ZZyX~PnW?YwV|Jz<3BE*dX3ǫHzEQNWId1xk󌹏>& D';pM=Rcƾ "pAxuJ@Ac+_ +nvrc.;fnܝK[81?hypNpZ +OL8:tM2d@ Hz40i`y< ?Trj: NɉJnxGyܿ,DC غ ˙^V(i`Їa 詉@c;'>9CE )!jQqq4bx52 I55zǯ>;ax+WM3/NMN-/,NNɉ/J-)KKM32ExSjA&*ƌPC@HBi,4B/DJ ^d2{6;:Y%`Yg* Ƴ ^Ι;?Gh0!Z'n6/5Nlv϶O_5! >EPrRÒ:1v=is\h <8q,zjÌ1vt .OX2 B[HjUI-[ӆC#y2cz#,-:%-ʾXj2^Ym&R)R _K-߰rcZ^AcVLDT:X5LLLI^}=h$F2/0T[nQ_+:r Hqn #g-Ww *m<%ye|-UOya|!Z[g(\@¥"5U;UM _r``X~`֏;b-@bw+{]jM =z"؝ምo~:w' S0HoP.ַo3ֿ@GtLcK5)Tzzy rfn\,V3Kռ@:x+NMN-axTߏF~HSK\[lVzR%lhw;^3η|30FbsY5L1AhoyLJA "h7':BjPXpmZ H, 1u L`PU45 -vXbm&xNr5؜.suK+tRmbg!e%3V Bqߊ7@'*%<<— ΚR=(VZ"LUJYErA JV0`xa Ql }qiBJvDTHB/ Z7I/1t::LDO`w0WkCsʽ.5\Oʩ2zyM{S3z^^b5 p) ">z ƛ]t{FQ>"hO[,&Am^Mgcͫ1B\ zۊɡ-a> i>L>t>S9w:K <˝:\]<G0=oG7 g-GoF_}um |q t7s3xc8OhIfNfIBH~~F&̼ 2JJs}\|݃ltsSJsR2݃}A1\ɹŕE9eE\)K,JΈOI-IM.O,N,UG+BS 2MF/vہ^@6.0b tCEvl&y t Kڢ;*1;'=xoYx{}n'e^;B1x>u8GjbJj[fNF&̼ҔxWGנ`[ .>xźuL&Ĝb . x]ێ$}^}E~5,in -@7$z*TWeuNݔY3w^ qȈ8 2Y$?ş?p^|7ND(t~ƻ?7y|j7Ϗe8̋4_@rﮗO~=" 7s*/?K8/l~aX̧zx<]q1 qL2,b}~yv=_aZ\en0Lx:.nX%ïy?0q$l<,3vF|?lTgl ̭/P1v1__0~y]^@h}?-w?_ `xpޏ4G Oo +_~~nӻ|կ߽{?_, ЭoGCnzoT38.4fb o6Ju1ϋ ӫp^Gt^W&DmPZ> J]Nt; Nm!ߘ>?O ̯N{zBb}\ټ[oyxb j9Ĵm= b^RX@ ۗa*cMb.Y_ PI/ȑnڗQD\+DduJLy&32 iD> ƊNS4=ryTn"vo\6]$+3sR&r;0XDp#{:n"ul&v8ҚGGIB c2{E"v]:*0@d"s>y$ȐUs9Hy:t#0BѶ0/"0?NcI?E_DƾzƋ"!4^D}8xID@E_D2XAV"]t22RJ ђZw 0ֳ z\m qm!t;CMj@2^6b:m 4wXSat3ZR3 47ǹ ^5|W }UC&MUC jtCHcszi\?IpDo 0,^UHmx{8y5Sב9TbHCcG60|\<ҭ Wʰ_͏Y}T"r AOaY: v#D0|O/D8 8O {Ӄqp ts c$MU4(x^mZlfcodߢ)E/YOfb6]AlQ2n)AoGzO%fz?~fr֋/yCY/yñ4|3QJgUfNihfkfhdAX.x4L' ugly+h"`PRZU2Qiyԑ5mLo& P|i&deo\FxfJZ{:|i;\q)d>R7]vdn>_1Mdg\OEϫp{[Eg K6ڬf [¸)z8=Twۘ0lfjH3dGB`M@@I4h@26 8w X40L;XD!*i&!̵ŞO >j"لEHIf>mvN>&i;lW4MϗQiؾ$)o (hꦙ@#eAb#<EfvQ h}mkWp.R~UxìBEVjSE]bԈ'&2|YZ ,:(3l&/[bG*$hȐ=;~Zmp,kbscEW3%!B[1hȡZ#z—-q\N&03jVIHmREhXfl#CK-<&ւZ <<@DZ@HSfE3ZK8~o0TСJՅ$e51-kJP̐ms"fHP`T֣oϸu=f8LQwT]Q&%CW$ѻͫA(ЍсdNmllMVkr|4}8XiYU=RA!HIO{~(EJ*/㷠ДE#kpU«x٬0Kwj0ŋV&6<ӑ2HMHD\_,hL4b i\Qs?+xY.f3D350Ll4O'YKxʫ2l,/ E]8?dO~,/p\O~+bҼUcEdI# ʏG0/[I coq9em頔6M2&J<C̀7g|ALeTLe_PaYh +bc/HR&)}bLK cG:%ʞa!>~(o<ˠo^CetSJwA7)}@,>y3 L\jZ#&IӴe2)26/e*ȄU)J4-Ւxd5.P1eS2E*&%ieQV IOw`KS+B̀UlS 9p-2b&-nCȊOHW{ø,xдm tN,Ug Y*hr\TA%^{v[3f˭ @ ^o^p Rg)چQiLWau]]QS6_Deg@u%i6Xj-!V뙓K\ 4']|./W1"g>1k,T^q,1)XٺV/B2zC 2BeL_9r#[y%8J6ےG Ҷ+eKT7F^,[C s^ 3G#r!jv&Q; ; \V|Nי޽I~`a*Aw'rthȜEQTuRW x9kxN1Q%jLE@<J02{Pe]׶(yӾVŞOF ȣ [;:Rg+²(W<׭A{/a@D/LawroI" fz4I rQ˧ӇyGxa騄Pu߻L-D \""Aԋ0愴7: p^m0CpIOBMxTD ^?|2/uоe$w8S`ڨaDF;`'&)TA}v,@kTźfaJDD'N 0?Qu 'Z>eܧݔ Ț`Da6×%8(a\#tG"ESdrb8k6lQq.D,fQȌJ_=r-0}#ObPL-MKp9C@mn|+ :oe_4[Stμ"^ 0XA~7gpwF/kBVA3*VLP@j GĚW %P &t 0>(z)H(HȤSy&#@r; ;pYRumIAr; ;Lこe[;|ܬ!HnGb_E:"-; vHNV狨^q!ts$lR`zġ>粬.=g[hKچ&N<ɥΗ6iSHgȤZI-©lGE˦P&HӟS"-&Jg,b4XPzZR%њ x@Q(*XTt#O0U#*Ūz͜HjU]JԅˠY $aT$r׆MF-z9<ߌn""U)IKEڴEz%y­x-n0= I9CA?MtZuV|Z;?; ۞Og1_jH!zsdAV@V:*Qtsmv-TPF߆MZ\7kJ|֘5 ,.(ulW ^` JjT~=]w['WVQ *UP# Z?XuRض`dG:PI`5('ZMبfP[w4 _E>':Ӱ!*#?hvֱ$FPP y[`Pзؼ@Lp5o,4:<#Rp1Pc^(&i9_ӥ/U]PHT̥c0EpIs<>ړ :_AT=R!ӉH/Nڇ/!¼u;"+cҼ~2ĕ`Q8O0*Lu)Vˡr=9,~:ksQS%:-sgk[!Ӥd@dt,% <-(g~Ve%X&uO:HC)4iMVhNV@g>Vb%X<%G)SSĂQexH d `|=׬O~=2/ύ=~Fٷ (?Gb)Vc+zS)vF¿{!^  [G~FEEґ)`P*Ԫ~cӶC(TMgWdQ(޵K6>S=*betboDmֱB5OJ*V-Zs TugɓT##{vFg{pGT夋#40>=SkZrQ* iVw5 ל*dRwk@dmKvFD{<:P.$$GbzhL%͘Cn}&sF`y#ev(N o~mzOU EV8dYGtF/اlUҨD :jv-+抻Q5i|CcMp!ĨH'@5 Y1x;O3o8!XHK-QbOh p[l2xE=Y(J2/,Qj(߈(cf袶55/Ar(32mXPeJV? {AS#Ԉ0c<3XƃgpqhfQf2Y\jzoc0*<(fNjӗy,Ƌ ¥&:C!HNX1~h4aY\Fa5f{N,_ NfS9-Q7B~UT$a|O+;깦@bC*t}QV w22[j~QGn?jh,=*0R /zm WsaS%P"yYm%^Ka;mԬ.6vbِaå@bXCBd l)ggDCTQ&֦&)2 e: ]OXV|kg =;5y1zg;S/&y5&fAjmYGPbðIL$"6sy0,"l1%Ѡ @hE@H P9}q* w !s~AuQފk\Gs"OuW2? Yi")M0.9mֳըmPv; NO68J'ʍ:v|(2.zP$Eos}?02l!x࿢ޔw5G\U%$_`2JiXIЬb[~c|!gBTVd&CNˤ\TZ+4E[cy sZqq˝<qL 1R`D]!tWN~:-u1μP9$LP3zQZbl0T5:R+)% 9Uˁri%r[ eD.(qCM]}36L4"l1A>?nC2x}WMlUVvYdC4BR B(&ɶ: M9pK KS%G.H'{}'ͷ|;of|῞x9UTKZUs˯ U*Zg~gFzz~xULچ%uN56#SI@iƴZՍhg`p^USN{(Ւ8@E߮jzMYΜi뎝]Wy*d&~2)V㚡B=XM!v*cuUG1էojuJFxжcsr=VldCڂ:atقF檱ZLx:0LYBp!8 D,0\U&?@`Y M…Ӎ:>3%g R?_̅$wSJ|B"^UNN(?,).' 'l0M7.>y5틳OåZ` #Ѿ1g7l E(ዅOBIiq',=#=i ;Dh-2B&&Gљ fBCq>woKBw]=PİLM92rPc //+KEJVX5B;jNշt@xyyK!@JhRW'.)K!Nt;7QpzeuA@=.?Ńޒz)BN/po-(K&ڨL%=2hN[roy>O.  W5b2W"@2l xVͬ/r?['؍p\w!(MOJtHj_~{{fF3w  vu/fQ6l5. 2>n5FAD{qd{ԝ:ъ*Ա]фv =.ؼ1 A {7w? NoGȽYF(w PH ؚs ^j{`q .~dkiy,z8jy}n $Y&A [ȝ)˄ƄNp[}ӽb2]-􎍝t蓙bPxYj"xNJ)iy ~A99@kh`dby\BM0x(gbq> ؘ ʬ=8"(Px|y~ɛ$DxK8@h>%ɻxsSK&7Ok|Ed^#Pe||_P|Q*X9 [x;9ULjΘ|pf%vFwcxT;27?bVSG/NO.//۳ۋ7/O6 Fw\qcjxXߗAYbhlF<ްЫ E5*F@?.?nm}afܜ7[G/j˓ׯy>W2&Al:/6obq7/o&[)BrtqV b>(r`ZM G:_ÄoO.zڗ|2ʝr9+w|:4ɖdV`` سu8.YdjXDhJy.r4 QOpBBty 8Ba=86Hyutד{wHfG|K-doGrRNֈ$KdBE;rVm,1Pr(G,ˁӯozk4iSL+7ŃKT.kE^TȳXٞvYpښH|(7o6 G]Il?Xːk”bԳfK%+O $sq1{W,*4{GWߞmlC||zX>?]==>>/zϽo`kJ`Нx䏲`bĺ2*kQ=\9wXJچ Ō=` %vD />؆|nlݵW=1^̳G2##eH'Ca@Hu {#ds Vg5"#_?)@\᎓xIlhw'gk:XEӏ?σ^&;;S^a͏gwEs 8ZMH^M3T! [^)}PR|dɸ}7]p!RZw~⋏m:bh՚rZ `MVz-S ڋQٜ#8u騕,}(29 >:׫$7ˤmI6n`}ss|ٱ]Ae#>~FngɠL>6So<䆈j cEu}v'>K@ú}dD`̖5&CI2p>1<10u7T|5)'n# R=-p5Bɻz5>9~bCf# >dE)O6U”k;ܐFS{Ň)MJ7ld"+*ŴX FڦE++FcrFd"\BxQgIP.ыl&KO,3!mP$l%3Hk呒4 ?@w86\_r,0(:iPH1} gMfx4xħ>$HyH)dte2t&Eʓ飃B#+ 1ꂤoRMB71{"yIxyH0ZhFY-z*G?Ì tn2Ɉ6qx `_Puˆ]к#U) (#Vc͏cV":hiR&dʊ7I=gFxOw gwqEˍW4*mb1L$n&|X{RǸʙmCX}Oʸ=ÐVL+Xvc@acHFT7Hv]](a&"UAb iZ#lxŢ?3`OnTx]`HGXxu՟RQrNMe!91tsSx{IPT H&,2mx CQo0qf1٤m<[.`͵.OM$%<֤<z'a9.AZ]:/+iU0VvAaCr"h\@{_/OMXn܃Y+_^E+ oiBezUlIK̊I֠AEtt/]F&ݫHJA`zV%PLϱB%ΝKТWanۮXhӣ$wtZOn2mhlMcZ]S^ >z<$G~R<`%Tw g/-?iȂqpӾCl4LIJlx?jŻ~ >Eǰ'' :47i Y+;TN-Q/RCQ e{NG1guǟEmJM僄OOКFhBG(}F=|![|I-B=Ȧ%4vEGK8:f#%n7wn Q*㤤=@sp!4'ӈEU M gt '%!)lC"b}53*^йG'Y?ql? G_{9NҢD{jS6?o7igWشc/5jPFՀm}δ ء~ {MvxqKًjHbݨrۘ+xL9]ݿ+^ǛZ!41+GHsQMFOiAFEg‹2 鱘kk Fk -i.V]iLVPnUeOȰFdgN{EGWn뾵D}k?m_'NsEvQ4 auC^ǻ^{t4[oka#\~׍Ȝr}'O#Jpm9,Y֋:&Q@\bgf/17 y5t|UYH?x޼x(c_'+%w}~=}I%WŝYEw6Kc/<|ُX"(}@J;=ޡC |m.KIY$Nx鉻Nxo*mpL꺚ʅP&z #"\~?@-l1R e0A^L bQN}a} ͤ$R,f>R˄B@D %  4Tz8L"n14<"`^}}IGv40FQ2+_䂧-3on<|+CHqT=s;Haƍ=p?\# s3z')H pSeHŌ!|VaN bҭxS:c yJi# b Qm쳇4z].2-]j)zK7)D& HJ|Sh!U*c-/ȷS%R5zݭ./5gjtEg7=7[ilU`Y#^FYs'vqy -tby(ic( 8(P,с5p:Yh5cJvI6ixeq&ӤJHyqc&tX:@D <] j-z7^h6L p:VEabaroڢuC#b߁>7J蠐=5d"QtvLdE@<{#uv cR4B&сuρyMb3dNUifyK~n9g_G>[aUf ZJ!]wXMK-v=l^eXOr> ql<XqK$R&aM+Я:n/']HN% 1q3*US|50<,n U&&yUb^N0ԬKQmnLg 2iH*9g(k9Ch2Qȫ#L1&3* 21Va`KgM E.M6ddbD,)Ҋ'|E,Nx7[OO20lŢ=gtbZTCK㩰SVbw )+KiԔ]lmb\jy Z2mJup- Nj+V~A:..{Awt0]"W H:Ct}t+  >cu~x$nMWL{%캤v8*s h _~n[FBdB)r" $Qo&ɢ^Mqj`#=hw]:Rf ZA&5R1*Gb 7E!Zv<\۞ )18d}dҟf}ffإ&=Wa"?Uua~Zv xV dZv xս.'YqpS-Xa\&1n eT>{یWX]АXm#VRFÂs{.i14ю&ׁZR.-"A%rQL(vT`jʟ3c ,mVDNdJqD[QQse jR,nM UǨ x*h.)3*ÂL yWeҥ㦘F5#8gaCg}{y=[ltэ_KJxZlo(]|—=&N[xn ~vs.GyXk`3 X;0M4v<5lуhWeu0*\zk9(s~Fm|`Lkm&:Z䨖ׁ{YCv* YJfƁ9y|ࠓrC(Wő~AO|u#)gsV7rC[q}36rH7F茵1nQNggxݳ$}͋LVqx=𩭺QvRkfaI:7 ||/1OqhP9y[Oq~_ &AFogFpk?HvߨdCz@^#}賚rxhRp`>1Ac 0SfROVp.芊=*/ȥZȧ,mrEC+ 4:@1/QTNGfK-'3G"R2[Lj3KMTR8t9e-,n)▓l1%%ʋ&Z+?ԧ'.-T^T15~BDe@"+0MAxEqڀ-t@ Cye.(3E -1ȤJ pH^=#ޞwMR"',M jhғ/5wFqɤ9^+^<^*^K$+bFzEԜ^;tD?ޮ.]k"OTf[2Xo3+RiAR~L 5eAv¸)QmngoWʍ~^6%3"K >֏I5o8Kv^fVf ZpJd R~g%e L%@T]Ҡ6],NvQ2Xk.=v ȆޝoI=)(cTc1kgyG';~v'㘪z;bqJfJtQY"Ju}w0nfT kcƹ$#ZB_b"`)bѩ1o"48SZ;7Ktm9|F–VJa:hk!N2T2F?&N%$h9%yMVPFv`F$9X`c\vqSd}d<ݱ>p b_zǿGʨu,B ߘ͎yE䎼XT /E7y$R.zbC*\~B@gҙE_;]'ͬk*-NS~Č=wS[]aai(|KΡ߳hys4T(?us8`\PXVA0@Aae zAB0A:9@ 72YX9?JKyHL"P9IDO\Y&iE"bG.Bĝ덛|i/'ng"듪3ˊmMM[\8  %;V 9crT!$Rㄚ#Յ.e LRZFޒ(r&)*(goeeRqk?TNb Ϗs|?GW+]; xYMpqҒ-ǒMIE'cmaHu $ Ȗrzhg|!SL&[Kgt- {ǒo~Lʌkils8YM74\kVgjGU׸ч_bSfN5v|z:b> wlWsz}eڜY&Y:嚜uLf:Բ&9jQ_\ݙ}WOxZUi6VkGd987wa=&kPN3KT2_ |kC.SZM,5JnoXbZμU|4oUg\mj9"Hfuܗ$wwX= X E+~Y DsmM\t9գJ)t&}Y6sjHd'YU\mf#"j1ScSJeKyғH92^=k:mjS)w^Y *k%xf&-RKYjM.v+GI#+Uk |1qı\*d$ML!?M1qn*"X=s9HO/&89_}V+R1Y#B+\E żXc0wx=\͒pxy!CqaL\Zi^mIWCj%\$VFBl7v?pi8xU¼pcp8xTe|\JV׎ mI}6dџ{2;$v;C%m&ثC\fLOsYhFRM5L2h4FWR7&o72|>J.{ V[(d+ r$}!s9!t=AV*7F,ߩ3mri{TP I~ a6 /pHߥX{!uqywg2;$DbQ)dv<ቝ%qxfS 4bλǦ|8[𓊩I@ E{4<:<90H{# yQ( xDgE ܉l)1%){*TI.HTR!T0 ҳq{B*FBz6Rq3/'⾐@8H }8Ҟ"HKBp_ܯ6"PESZ94A5= szW2 26"2Qi@ژ6s18{A"0=$ j@NP FP3xc(+wv *Ʋ)xNy,=6u\C.+ \)3Ul9|%IHPE|'{߆Ci_;Ed7lX0$uƶm`-{zd6EOᇖnW q,YrmhJ0O%p krx=mTۦօ;F>$ y3 j^"nCd`P"j&Fh1sDZrt*c$:oϡA]ˡcܥCȡIcC_[yFP0ѽCZs:.4 Wj3_\| "meIVQ(nTT6 Ɖ2, rĦ7 ?wݖhj ]_ ̎(8 &VDaF2T(Nj ? .@{E.>B, Ka|-wT[|1?/PoL'dxwq Zξn>!!AAA :ZZ6 E%Ey % ŕ%0ͪ|?FIoh`?{F0#;q(\q\@f9,b-Vxq -RK2*<K JJ2R3sKsJRKJS&j\ [x{|q S'O\?i #d !?xMo0#]m釒e6B+NI&Ǝl'졇ǯyg|`jr,`y7 $bmC̵*Eni wB+vFFQ56 iӁu6y+'|:>KVn ^stΈu6х({[UW#84 -KuRPZQYnI1[S}wn.hhi'jwBJX#V^/q8[f ^4rO-JbHAd}iOtH8hC:8 R`Yj3 ?OignWZcv[.=ge.q%V^%g{ ^L5к]bG=w8g4!>-x(\DYdGFHث,dbq^Qb-Ք1MK҄(&L#`.>D]8t˱Q Ȑ ab"8 dCTP]3I0x7fIHxjڨP-pxaД$;2^`.%m٨9e|Xf$Bq;bl- l\aHJ Fplۋ'}j| :!iZ-n-ѲY1Bf~.qrmDݰV.kJqWR;GݙEn^,w XɅ^69K|?R _ 6yKy&fR=XݎtW Ҏ ibW$`h2m0wMd;pU׋؂Fi %ND[w6ys#Y 1=?HH%0Md#`yXtj)>0nG#g^`Da^ Dqm7]7 )ovPL Qu4 ؽ4>6?x ^/ȹ}Z2*2@@6J)ۡ0Uu0[p1v4Z88(_VR]O<`(\!p9KKx~ e8eǰ ,h+l& C0B8*'A``4FF@TNbppV*vYL%"@YȘ>E ҟ܏ 01uWcu/' |+H$_yP.g7t`ӱƨgz(ﰗ _!}Ar<ڮ= m\µrؓfZ`l?՟T%W۫&{$DՐ:> sCZH%P#K<rrѢ ʃٳ:z mE6TMzA*D[:гSTJM$/UM/ko{>޹AQGsP+ܰ ֜aTBE9Ldشw'Jjj T.YMFִ&MnB^򋌰3@K$%_۵PI3\6nvL$d(^zsA;I^C@pC$[Z4b71Q{e} >p4*mZ? HɧhE>< d>Rr&!!ZE4](od h qw_±k*Rh]&e]:im;Ve4%ThdR30k巪viV(F`*v88OTS./P6ʰG+YJ]5 zEυXI|GqnJ"Rn ]]=XZvҸ?h BƏ~iN8N\=WbƓ#A^,m xix! c{cwl]h::2tI Tt%&$ӉuVZ`9Z7$ wpr,/`u~A6CAo @~AV(T脓0,h<1#vJzԈ9Z]ïjЭ6ư#)2;,!>Gy*L2/7ڰw2^nvn9rEBlU9&Yb[hB]C%oVv, tm *x<\MiSD~X\֓pj;?EꤷUQobLfZ ǵ@!d}D-CZpE ZN |;X sox@x]VYE$\C$po|)n ?~}qnpb=|mG8c PZI+^0(ü;mvEƩ)ԓvy(.h|ȹB ]kDP&[q{-C0з|"ߣg)[Cv<&JYdJ2 Db͋1$P$jlp lPówJ R{E4\uLK"[b/mqx}2!tU Z| JN!#AyL)/J\CoCWq߆O C#  *t 8{(pB9t5]AS2属8\cqU/; qPaVnĹc2JԦ>1wO҃YA)GQM#>M4C\;(AXU2 W&+{(o '< |٫xqfJ_pV*$8ADfL'?9B+}s"^vFû~`[p oh|AiGvylǫg7i_fysOZ$nKtxm{8Ti#iV$61.3ƬH#e c90hKֺEnCQ r$#*k6{WC]F!$?ۗxhҐ@ϏzW5S8;L@<^RF@Ux t e6f"[Ѓ7_`C'Qnd(#fʮe4(QBBҟޣTƳuvU2`>yӯsx x(7 %CƙY`Ğ_LS!n=)9dGV0߻`v\GbC ]rZظw>m/..hM%|8c *guo3o7^:@%*Nn .twHi4.?ͫ@ mMK3gM{ʿ?Y4,y`/>Ǐzt,F 4ֲ4EF UVCV6IHO #l3~v\+jPu 3Ղʷv?MijMX~ {3{>*Ε#xRȜMn^Wӭ'>]QĠk_},5;]A[͵c@yxP9bBu G̞j vi$*x!8Cpȟ[X5?oʊ LL 2bp4'ۿ0,6Ӑu"ab^Ȝ27\1٭%ċ̚"CD o<=ñhr .oH'9[f-")(l|bgod2a9CB=>dr sȡ;jBk{*Ui@9ػ{Z mlD>Xp{b62[άJDB<g}d]wc cn։L5ۛ81+KRs̷Yca쟚Œ#mQw+z9xhsq <)`1NQOy.-s:\]q#AAXI1iaПG=}0S]st¼AȂՎb7Ps++wx M9ACixcаxL*NMN-KJ,J-,NNMHMFJ)-r RPyz\dx}VmoH#ٟz'mU%MU`;"xY0 X.؀dٳ3L&2FQ-daT{p(,XF9LKs@1(^$cPk DA+65VCdzmd DjVPjZm9 hYGR,mi 2X5a"dќSD 8BSCq xlAUdc`HA-?,Bid¼ @8=\oM tG[$-3̰CU{, ug#[4, ]43kSs`vV[$H ۂP7BLe-w#,4Qܩ *JA,Yodҏ5~M뺼MިE%}n;R ke;}dB;'9 \./.@'u$)\_^+|)>raY|%tQ %ĴGx9Ktx[![d.Ģ ݂Ģd3͛YJY +x-rBd++J2xks6+t&YӛNkžxΖuu:$| q]$HeSs@ S8.@-->Ǔ.ǣAtfwP˅=*&}-k&sw ,oZ[pNBÚB=XK !<̺Q2%+k/t`vXQy yZB0[;/ձ QWoӝ8q 2JˣOYtOwZ>Ϝi<+e3/ 6,ʅ-պRom=(qnc$}B<b N9y.bDĮ5.sʫq\dIxo4"RB>`8op;BU0 شhe PN[:α-FB 0wj9#pP/|5͏u860 <1'P K@< NA2V(櫊ڢ\mzN;E)) t^=iN~=8rE*d, -kpw჌[/SX^V enަOoymަ%-{v Y h"5=`h w*ZL"Ɇ[ʰ K .lU4g~y]$TG+>S*q t5|n~ ElW TOxEÚ'NXJyZDLoDg3S8lMPV [<0ScR^HjO|Yn*:%F?uiGb!*Ew`HZwKVZ@Tiv_۪`Qg(S) 22C%F4CZX:`Iu^AC{\D@[h\UyfҮE 8ંq6Q!UH3З@ں@Β'?XR. lMg>M=20YE\%=fډ7P zd=-"nV]aS†l5X-`keQc=;evbᶴzw9WIW1Wاl&Ձ=8_Njֿ\o ]MѵS%>*6M 싹i<$c>h' VkW8`ǚ陸p%6+B k Pi5,\#"`Fcb0LaU Μ:<0D'!eQˁu|r:;L)кy*WA#J 8afq!/1.kb5$svZ=:$ZièXrYkUӵJ-CJ Ksvubu>:S(Z!(| Ƨ\`Gu2K\Zi6ANB<9_KD?5b-]+|)&& b)]BS/ټt$*8W]!* P3j]Lqgb"ְ?9y3x(/Jʱi`Fp{-Ψ72c #faCxTiO7xZr/[8 #ۨ>ࡐϞ]1{`B?#/XKa:wF*`Eb=Sèi麨j[}C"Kfq37_c\FBvY"“-tgJ#ȉQҘ;sNGzl#9 }Jä̱NKϹCzL9G b 7vH-C() a'p$.i0NUe-g@'#0U(m,TK.YH ҄y(q [ gXs#/]|d>gt$%Y34D~AsJ|%tGqs@rx%x9<{hYP0HqR aTt 78:$b|6F[ұF#y;9iū@7M 2_x_p҃)Q/B:D\ET"v[( ?|ϵ$].;AAL2USD`__k d BYL?a衜utAiL)R_3eX• /%$"oFP4C,ЕgM۬a J)ͳSS%]E1[o l ?CJ+#JckOW7XMxqKC◕1er¥L\Ɣ][E ǡ̜j ÑO-u#ۆss8:%ƥcfrפ84*@J*+:AE{q9jKI1HT Wpb+./pm9baH8 x@/@do.#%[kH;TX(?)JHjAWzE!& NTValW3p`@EqOy޽z,s( v;"1{dꔕ׆,)٤'λ컿'z̉Ne鍇]k/- ,;/N |UJ⬪D?`/3@RJC4`x UoY(ף?WiAңS\v%cf>b8o-mZQVV-Z4ʕџU\cZL2-)nT=M%!mrO3;f.ͅ~!I~NM};jP~n*gZuMÄJbhk2Z^cMCj*)le*6c߬+zYֵbj88AGm%WEqPHk}G93T!4_ɟO썲ekQJ7̪Ay`kx>Ԣ5C W%AY-?0ZC%=vm#}PmPc) h"Zi5*gp*[p@ aRCX㵼ᡛ{'L9tVqG owtښy4ɣ&Bڌ[@?Q"W<53^OfoLDGi<[Wʓ|%mN~[Wgɿ˶{o6?BxXsU(& H-P&!-%&6-:̠Mt?@닣ǃ:Lxe_}ܻMh>;ss_ĮuTGut7{xOX5BE9Owl^ik2ӱe( ${Kٹܢ67{'I~><ѩz],3SqfM dp,F,К4 {q@k}:ӱe%i<~Eg"!RquتYCB"xebTMFԸ!6x!gW =[xW/(J<>87nq" GcTvS?,&^p&wb,z7XR|;pE|>tE鏉ˇG}CmP"z%?4 &w¡2蓢Y6o5;>ı=0h/3O|Q2# MQNM4 Ҍ?IyX so@Q{|4020c2BwXCR\gP"5;]eq#uj"Aة`hFM}"c1޻ đEWă|('SFVG^Tя;'⥮E4l?`Z"y @TMlrSUr֡KkVxr~_+zO9ƥv[ރ,5 J(*d5%jC,RR8xSދд}!2%@$e+sJ&zj 0Ps$]v!P_ꂔ4Atjmli09|4 ]bt0HqӐ^ !u$PU  XW6x{X~vɭܚ l塯_PTW dd*䤖(&d)hsq&'ė$jhZsqqf)hL`,&N.gJfM>eāR&U|z>/rxVoTVF1j cKҤ ?4mǾn:W*4΄vBB*R^3xH4v0Ed0`G6UlmFcQ;ڢ o۾ X0>P9+=j5,|n|<e_ FR^k^]kR-Xmߨonl[xBk5]DM p }gb!q(^wP؉CCՓ3OD8Y~}r19mƟak>IJҽ?xS'{?d®u?+JM ã?=N. JqYógq^8jЋLa*NaIL4bRz~vB0?D O5GDcgzԃ:z |XlK̝a/o&B)~,I{+W:YǺ}qq.NNb%75 DJ֏/~ Gbhۛ/ g}'.|i?3vݛaFy5 })."p_Skt.E,-¥֯ g\4d2rM|g4Y/}>sul15ykM>ŗ2-j5]m?^mhu-6z;K"+YZ~ y[pIw/NJgeQ[7Klnx2| 'ެ.t/3MA#',5GVtBa~B%X%]=4A\Pe f 2O^#.0^Lr02`iɋĵC<"rl6g$]?@ '$Cf IKFVV#3MV95h 7;o 2xeP=NAZ] b)Foa83oP4CL<x  {m3ZPz0Rk#%̵v rh.XYGPp,-nR+赺$% kP°.yJ.,e$ ;O(ihtj}CH!apXJa%r+ !vt ?Xd߰4vҰd')\4.7xḛ_ I̪)[ԕgZٚBh(!~2n%Ʊ0B,\q٧'CݍTN{ޕGY1U5|d('<`~fuǔ 2V08D)1a!f#5QcnJC11~e0#!珳m|chX-"IX&N77.}\:-IrN}9noK`<5!IwFbgoc?hF^*x VCƗgHjw/90y7TڏtOXy1ȗD2r(}`ԕd'/TEb7YO+m< !T[]]%'\$PUћLXOectȉ?ҏtƶf5,!~ϕ UY&},%Q~#{Zr|9nh_ʐ@{'4)./ ݧ?26 ڈb;;[T'rYzor5˳liM|IZ?ffWD|L;x|?TԪK~ wI Ax)3cDcQrBpeqrbNBHbRN*)8Teg(h$k*((x$(fWegg&W9d$%ځ9dY)&%g)x!TbX>1 %.⒢x|JjU`PũWd;;9{;H3d|RAPcg̪Td.&3,*>Xt [xqs$K=^qeqrbNN|Qjq~NYj|^bnBbbQrI<6i.,Js*ET^YL/$SZK'jAkhx;ǹsBɻXD$PxVmO8LJ [R)/{8NKo~3N-˲\>3`2f2!x4bay`sͽka@D"sr sA`8W,UJ1-=NncO \K}pi80ChM睭\e6*3 1୒'yJ8!D2Li#,ECnx'M@O_LƎ| H,:/D%1ͤ]+w4]ƃh7Cmg8O!N7n 2۸!2wxULBق\,0Eқ',(9wƘ'Z "6`ckS[.[JϽ0gvDUAjNܫ9: CDUM+>[bwR ׭E{mZXZ !,3egz~1lIV1#߂U_l?7,B#yJ[ _]2vw8hn؏v|i]mWyl??]O8^~p݄1<4.$tmX#1x!Rϐ fqxu(IǤOBX`02:!v){wuPn_ؗPyp-b f$Ksi\{џ(~'uϭzim6N}*ejC\}~ʯ q{ % c:Kf2Oj5Q $J}ͳR#0J|X?eWN+%\dL|cu9VTB * 7{d1"Nc^|YgBoP"gЄ-/Won8{No1vU A`rs; U<;! U,J:i 2>֑ a2dhAa@ \#9 .DHc &(VP]ehrfd6%5m~(wo#'̛ _M4\O3FolGk+9;,/_ir\MS@ ȳu3{cRhYBhnK \h>a4AD<`"Jx5ABѱ(9D!891'G!$1)gJ@nViqUvfjyfrCQjJFb^r~ciIF~obQrfB .}*d=L=SR2RA"`J>@#3&1[kYf&\pPĢ M{Y1sAc& JA6`Yĸ2J Nb5J,eՃ+dqEeo[xucC9YV1cxc8xqIQirBbQrF|qeqrbNN|JjdiIYҼ̼Mk..Լ4. `Lx{m+fN. gxWgĢ 3M..Լ4. x\[sܶ~~6yGI]Tt\Ή%u=Ţ8x3/U xM F/_mNT/ԵNӪM&} <;0Ygʳ&i\6ZZvI_ǪWiR*'k&;N%jTQ-%u\Fuk:^7mV*~OR-ҥn\}o,UYV%j55ktFv=LVuI@S͙/TV0CvjշznWWo>@kK*+<&)Go?]kۇ+u>^\ݼ{J}t}Ea=7Doi.tdy;3DbB{ :BzGWLr ZeKUV+bXw]fu9 _hTP2=jˬZI\gcԺB/R8~o../^\}va8api~nJeO%u]5 [leB$OWPzf52&uq Lx@֌=c9}V{ۙn%,}mB%`YU~pNHdԧ0n?nCl4sG~V{62YcJ?A~BE'y[zwq^f2PR?:i'Ct =IZ$o $ ڶ"2@ǁ-~ , U#lG!ky䐴d,V'"sS'-j# 6:b< +aS82۵D/or!3KREgN䷍NH4(R5ԟ9,Rn@rIq ̳9 "tHzg@>$z5k't=R1kPw7U%igW]X(GlVhQ'#[zAx\QUk]]; >;f(y Y36?X(u6OJ8C0omdCJs^+\@X$I):vu籝9>:DǧdžiUNVj;kk$9]p:Ώ ]`rLv_ԡn$$%"g;ԥ[c'!v6E,PA\yreZ1)/z`{ ͸KHY@3أٴuFIDi rl Gڭ >=8k OsH-*l_X ҈(}<:{$˶GŃ9WA{Lɳ&g[MVtf ,`n5-V~΄Aʓ3d6p\AIԉSÜWL;v DQJق0{-N6>.zc'o8ir8_8v@sǠ*ƁZōvFV r5bʀsw8ybnbC e!8wC.~9ʳRs/#hF pm' "zW]_Nją+d{Iqsa#4%|wHRm LI! Z.vB#vWd5v.Κ+p_q|w Thu+={$z,)iKEBn*>=Lb48wf J|A}cjLie\& qnsLYQS?: J0-o%/H 0Hٹ|)Z 5 2ugnߗ>E3U ;@[ەo p̧]54x{+O?:tRMMMY.tazͪ/=<=wC`&Ug؀w'jQaz 4G{tKIjq=g=Bc%t[fuaWiL]tr+KQxDvxHD k /Po-wp.rGY$Qey5UC/ar2hnl<`bmDeԎɄ0* KowN$bJy(?6q[df<3YݳO uTTDl}:IK+z?PQ'2۫i Q if;Rx :yrz6HtaiS)[ЯJHr@4Ѯcø,NTJ~,< zj9Z]x"%Y e4&,#VU9@8,Ab^G Y9fL7@jxδiZ|7,nkFS 3,?|Y0yE+FGW'Y0,+KL+}Pl2b}vh!>;y@QvV}̴VxHrrm0vֈF]M X  0\p`e4Ly]x%Vծ< s\UD k~!bUW? Y6y3.94'͓vk -&V;Sܸ~LzG҃dTrEF gNB$u?` XՌ).?T\t% >8vO7y VLLqS_LA+L'`aY|lJN-2S;2.bʱ9i:²xOL]r1dD}cXN*wq6K8q}p^`ad? .Vydp>˱ >N|YR닡Le bQt@f*Ɵ7^A,爾lƨ78z:gjN2u/O&3')]]'t1؆nZLʎ>LwSNq}/fAߨmԅoS"i*R5slFbDWYF5~ ueoB'\ Iɷe vub5aJEpK|K@>V4sJÚ7^k~9^CuIDN43oE2J54Yjue`WQ+8"b] Y41^xuQMkA&FЃba P6RkPKLitee6avGY??PzGyw&;5?W~-}]y0b!yiHY|ӌ?^n:oR29ϋGwݽ⠺ hn4Mzb.&H'#lw.KJJiՙb'>8ebr۫WH sTf9T᧒&.PggY ]yв- cX m j5r=˅v2aJJSU cH eHx*vAoWMr2CA 'nc1Jw\ڌ!ǣo0f@}K^0.3xwkqX&d+NXcnlMޑFi t (# Nx{--N_K?JNx!P=),|!(]TBW N xu::I(Qv^-ZnSa=@tBkB?3"9U%F`Q%cNb 5kZE(౗pSiU\E|Z`ٞe\pqq&!ɈkbYb0*Ă4.guzF4?; yu))A&fb:v2gQ}J(08n|r.p^?pקxoˏA N c)r=gUM~{W!ae N}p0}e`G" ,E-OTRff\r1;p5#zJ^I_`\sVŪ xU]oH}_qվ44Si:ATe_ƣ38,{ǐ@UO}93;=m) U.T)L1ItY]8´Df2N8rA'9 ,R*V0$WKF.rNP\p'Oma@R#,|)l _etti]\Z( "X0؇! :#CQO(u*3s "̣t l^q7):! 4dB.(KP>҈֫j闦 ,M%wVR]m=9W<TIQl]J2W;64F}S!UwOԩtx~#Lw7/,KYY6mTq<Mq_at~~^3Z]V&DI\h\gk%(7.i7d% {}iR$wN, d訠{f"d$3tFfx%ڥXzۋk5yOhƌeE$Kj{SJ-6Z-he%c'-N~ݢ<^sA^]{[fm`PK20[b1a.^@aV@ ,2_%ȗ-zbnÎht][rGtlx:LУA'8ssEɦO:5eESyċ*#o0= {8e5?^pTõq `_۠i<ߓfP筌'"XWen{PC xFm0ɬ'x+Fd ByBJ~zByb^BIBn~JfZBIFBAqjiJnqeqrbNB^inRjQ>'PlFvʬ 55 @f7vzJ LSlポ}]589A\E%Ey InfdaKomxcC~ɕ,0x{cNqIQirBbQrF|qeqrbNN|JjVnfA1\$$(drvWB@W3Y즉{FkViw7zĥ§k*T\._U*e_G˥nT֪MѪ*UݴYU Gzԥn[@KĹe*nZMS7]#S?W\܁a{&nKĺ18p幺Ѫou//}H.Vxk[F[RYQ65q~}{/Ϫj>{}~J]W߽tyq>|qa=7D/5|.ugy;3 Z%Ktc@FWLrZe*j1⿭իUTְ֑F!kV&y\5Z=~7`lZ+=9]#]4+W7/>9><<4}|[xW8Nk["Te) O @޷I+驩orO,%F՟/Rߵ:IijUߪ0|>].!cD"ͣmD3<_L'm+"9Ptp|petEso 6m'M!Q/7YOb]Rt2,Jls cucz4ni޷<ʥ4#7hBC/vJd'5dWs1Gv+-KQևtY#ꔍt %8+%ܹӇd ".<:Y7U%O؉jWm/.H^/`delBfʸ\ZV|KF0)Q9>V1yco؇⺜1'N߲Ypln-`ᙓ6]Wr?t@pl )ӪҬuT(Xřz㇅{чn)z@5O#KE[2CH@ Ϝ :وv̖5`Ѫd) ݲv# Fx5yLQ Ny{(|M(H;SD#QV0E,{iJ,l(׵l},v0P}չ4)e=±ݒVZL;!i%OMȾ]'!~`+EP:991qȌ,A̱#.OϜ}KN^R& e'٠ǽTfOAk}'lr.b CO lHX>&6DCAΝN{I+=FHQ-A#:N&0ψV M%ADfs5mƄ9cPΧf2+&~^K=Y˱.qG=Ѐ ңocrx4B=xZR`Fi$7d6&SSzXhr+ٮll#]c"Sfx(9wƅ5X&/ѐ|Z8n__= 2-lBi-/Q*^FPq+WGuV LKa#!7oi^&Jc 3;;\R$JI{|2rĻzf"3S85bJ7`na4tPM,֥LGs+01+QōJpH^6c;g+zlp.>Ӧl!g-K4aJcS?;ƆLekڵy3d;`%&~N828d6hHES(`^Pݳ*f(Qo$υ.رz\(KPDɭ-Yol'Tjb8r%.3#yjgrx9JgXvJ,59A!g=?jvM8!k $ NjOńsDmb12)p_+譭`p[0[K3=e$ m$)gma>cUyI2/C| C`"` o(l[SVXy/c\049df>o%z<4Lօ'afz,]߮ s$0]1+k= a01拆C#W!vBYAh᥯j 3]Ru'kB; opm<4Mdhb_g1C qMa- " 34M :6@c4VόXESdP wVy.% O9Y.⵻-m  Ψ*tN1 87*Gl'l{_xLL-RbȪ}KKFmO[ȷ #-Zγl V\4lխ2L'XpVtKy%>c_J X&bL2;ܭ|54!˻̄*߸JrtvI3 pޠT] _>ml "2|tXp N9xX e(KHΥH gj#iԵ:s${ >hk@Vq/~-<@<:"Rj# Ou03:=!N9~xdFA=@aVo0d ^xZm|_û"jѥ~KcylD9q\4݈Y&&:1L?HFq@EUA9;) l&fH_TC(?}2s*A25 -4q.?_]6W .NNQh)F!=@y">;7s8'&lIT.?):SP'7 ٛ3BDʠ|b߸<_fa1` dU]]q&*dћdi*Ū"^YT0[V"-3eUOjx}+,/_]O׷߿rs}>}eϓ7rD D"$baB.ŀKϖ$yo 4ZWL,˫LBv7o.Y}7ICt*_D&u`5Qٮ ﬚E6U/0Z}/Evv{w^,gYlH G66>3Y1cr׶IAl1|NteuۜVx9&V ]jh y.lfe@$3 $?]5.丘#+GBccO _-5< ʔtQH\laJL poa;sjdfENtz.ZDWE'`W<ܔt=)cdaKs7k@sZ9FJROxDIWsnqCF637Awe\c]iiՖ9XvpqX{$zcۇ?[Ӌ4v[ ̐ tX, 2ZeڲW3~4pZ$[4`"ƪؚ#Nq_#4?H9M@{xV$dEO k-͓RZh)`DH{jؠ|WjTs: O\zfl7| #D1:khd҆tZjkƜzfwJyt`aW`B6 ͍;]K@FmLhIa 0{z- 73"/EE.Sonh|dQNG><̥Sd1؜޾΄[#FH#PTyo ۩3ӑKC*G'Vk?.l Mef!9'`܀Ԏ%Ъ0}Z ;r0CPd@_\{:ٍ?"(өNEP9<G\VeNkgZ.nf`c99;CW&^GSD nJPC>7-#^Ã(B"3p6X&C}[ OB^&ӛG"2ѱ`!eq,LD7H֊9yxF!<<4ݥibp<v8K66C+(ur( KMD(}"MTda^}փOQ$dA3:a1(ތSW[,M 4 qcє&`Dn4[21(Ғe^9<ĸx+?ZOIm{Vk KHnh|xu4jD"k-1\{.Z38McA%1PCGw6+n:D1/: K}:BGl|{o"KtC.GMX묈"K+ }CD}ܲm+ u l6 ^-0UQsfqafE+IԎ;U=E(<*f0&PapU=?:ż༌:Q Hd3Ȣ^^=F_m0+ sz+FKc))w$9ã( `M\:G>*ju=[(zh%XkpH&1E𵤅`QAHP뉠"f ZYP Qi*:Ty8q=?zTۣx;E]7;}չ uݬz'AJs-s"p;aGtwaHo&"9׵ 9Ó8Ǯ4BtYKgɠxTAeNdĒ_VS HRψV p{XS"'i`":vQtI-OE7VIɫ 2:xYx(%hW*|v  ^PdxQs_lӀE9(=H n :h"Z{'Re@:b6h^(e*F">ϥE(#SDN1$Āb,'KmJ==%5b}t }*#uI10';CLuM}ow~Y"E9L2s$`FGEnIxx^&IL 1394IDnJ Eo`oUT֙,%#%D@6ϼ6M6$c4z#yXaӠ$JNEMTQ|0?t1?,)uɖ6%CDW?$X)[ ֈ Q-mw^ٍфhD.4:OldQ H;gU[r3`{WxcE.~s-=_XxD4,/=eF)#$SC@@cR?*\*4ɟ^,FPxQՏ}sS[@ltOэW'tLHƧ=tP6/-+BXy\QZ3jma=]p\AESm}"DS`VYR3n?'ʺy@~sTiscp41p'إBkhѕ }6t× o}w{V}RO4Ϥr'G[& ʡ&omvMn`VzFy/Ի06Cajм$r2TxV+;a^^p4zXfśWgeE»uY%ӗJDz1RBMHIٚר6ҶS~wu(zOzɋ]7Tc @%|lP̓XPbIĂ~n8l`C^1QUpGycѮAӂ)Rr/Z"}N/P h0N[U4a/,".+@S1(-}|4/$M MPdy dHrrrk9۫8 DULq, Eu|B 0R3bW90r} fCSkmb.$G[Wis+Jx+ U‚[LXDtfpn3D 3b:ဩ"j]pS@Bphj =+ax_r ZPaVV QYf=[㋶]zeIL5cÓan.zJ7$+Eh-y6{Yg I/͈[j=DHA$0:$Ϩ?6_̳ h㉦l9IS$*NxXK: €dA iЧ$RP='($,}ŤV~i¼:Q ,)~kp8;Ն"y䰏1d碤TdM~wBoNl s]6?ϘUX}:}-?E;+"r+r!Ecnp'H@'EN927hcXG>^1_KA;aVYS}iF;?GE?i~gxklPXP$tsR7eu $xkȹE4D!(9#891''>%5m JfIjQbIFi^qfz^jBf^BqA~5rj^JfSxm9RbQr^cGFnfAI&`jTK95/%3 ܑ$xXmS#]f Z؄]ٞ0o%r9{2#|ŖZO?jyo#;c?h.t<9 Wqt^댟Д#cvȏOqO K94h1Z[c4sDtI{ '(֣w]<~qoo/D<1Id@2J} on}@`7O Q`rryAePxA-!g?^oTd,_>^՟~f)/az~wq1/N^3fiL\\\oW?%>g"M3M.*k]ȣm 9P^̧aXa{9-@ eQpE KR^/A*$,gA@Kl#K2 1$)["z`ʖ%b\hLk*f=Ěa]{R 7&? AgR8D ,ki:m Dlsy&ئ "H)': xdŅI) 3^ .%tdZeLW@To5:S} #^ϲcgߥ(ನ'1pU3n;ܷ0μ.|垏݁9EvE2x_p4e~+rdJh%9;] ?tG͌Owm@aa*d+\f yţRZHZtt,n+$Th z^A"?od6'P¬Yp_ѢcK%c!Sm(NP -wd*<5_8`e+wXV_} ! :d:_1`i[nyjǍ/qTFKS5/(ύK[_BO9 LpeWLJ_=:j @(mO@1jKd#7?#7wdR{zUV՘YZ3 c&W@QeCa(zFltw۵Oς>KkA 3@Q7/%(cKJvD T暎vGťiZ⋳jR}Pxۖ}%A?tC8=TV=ոQl^*̊mR 9u¶eUZA 翴BZEtV32qу,D_=|c{'NS^,k ߚEAyчQI F`HCq=tOTjU1G'*^xmi IT•m͹iJlC_Mg绛wf@1\܉Zqm"LЅ72TtܲS"N:e)|w\e1Q;F{zܧY`͎|A\eGdufH3{E.1a}VaTD35-dukdMq" O`לĝ*@Wp 6lW3cE%6HWUfdtE&Momo%|H{hlip}kQo<2m55ALώI!'sj5TCumM27^~X%KіASm}B(*j e3SfmUTx0na6aYQ^O%`4˺ F>|AQTAmEx8T ( l( VZ/VՏѺ^i\1AXʱOPl>ANh?i)2AV Ls?1XTiPFYJT[5B(zR!`9 EZbڟ%]l+ 3c%-{&mq[(ƅtBjLQMu-NyStv*cIhXڀ̲H`ZٖfPۍ1T6 MDΐ3/2o'1w0n3ܗ0NtncҞ"[躟@ WB #ilǚ2JyG;]r?tGg5G⏏G+_04H\C+[ q!ZhwWٛcHa V,iѳp1鉈6 vry2_m|BXa@ҝVQ׿?@:U^ V'+ 醧r\+n(Gid0>:ю+i\ux"XMg++\ѡ`ta kP$ۖk?fdԆ`FZ\m~Jo?"0m8n11͛1AAˇL\Iqǎ Sm> > (/ba$LG-f_Z-Y0#(9ظSk;`L. u8%,{]Ә&, 'i54/}m՚IcFAZkUoEI#LQΌض.5X&W(l\^EP~+jk'(]t-JwDAJ>%Ɩǯup펕J(vBZ r@`1\\xƤKZCnCO麭NE~1j:Xfpc{dz"_MG(OL:njuSb/7?z?^[ɠr'jFtUB}.ndٴc/D}$%ʶRxv{.r΋ {y|X)s K$x;m&i3x.Դ̼Tx g `g3ɿyL4SR2Ӹx[mo8 ^ ӤM[o6pIvYl2iRܡfH%ɡC8 əg/` y'wrEF[1D ?%w+AsSCsz|=o?"Sjɹ /xQb .>[75zC~J3g D ~r=%Loo.}8>iuŲEY+ii?ugS81H!ng x rcSaqI hh`۷ĹsYR9>2+mjx{$flmqλ+8/G-h\D;NXꤸo QKs'0_B8d@N2uJgQ fJҒ 4| rX{),*L>3x)KȿQ9gr23^et~߽ S <J[gU_N>5մUGj#X}ŸNoraRgO*Tq*3χ^iGcο%ʂdž,үjK}ם`am} Lclֿ-"e{ʐcgtS_%zg_d*/rM³xlUB'*+ `>zy(6=64lX4cǮR ss@QI=[tVE@{-W{ه>ǜ{o!`AӂêC-cWFo YH650mQ 6enM; vXbþ]2*`Tu{L%y@`3Q8OŲ*eݭTlӌT]r\D&ubj͹.cʱh ',vȽn>wH %5272G@9cVMӝm`K]QBͶNujoHfƙG |OxfY]e:@jCBV Y`s#gMf H)TDQ 7h$LsNt|ÐF`A7 6JZp.5!)^fM߸-x򦞻狟E#=shb`T/\tm๹+xOs:*5ި.T^J7;vzcMcֻBk˟FYC48y]*ThM9_ZNfSэ Tb6#h7-@@"lvuA$1䤤Ia 䋌/ Xfd&>_qLZfژ #Pg1:)dg4[I~۝Y6¨&UHJ=lw}[mvlknL:4}6G vȔfH@%oN)42i>-V'Y6HW Њ/` ;B;gXe;0];_X1^/a\I=ʽpJ(oA )TlD1`sj}{Dï+C_ Ln_Hg6N o#pAz  F <Ƴe!C!v$92k&B+ g->/B/G{lGnU IQl=;4l {XjObb2Pwwoқ!xq r相ni#t=% *I$ySaS5SMףOwR-ɞWߌ4@aUF1"G8lu5FSCd裊ᠨ!p2c;Rflw[mz(-́(ۢYicgR:< O o2>"#Ou*wE{ʶ˂0ŠV$QmyT= }94/~j]sccf=Q)GQ&{(EA^q3ye ` P'X dYϖj_!a2͊;]!tbKs+aS!渫ȁrST8LB̰(,x>A9 yZ[QjjqrbNMR~zJb^AiQrbQjbICLR/9?׎KAK$#J V!(@ťB227Le\?y#{AA^$VĢԴxB5^I~vjL"> ("[Y {FSR2`~.~N:\\8Z Wx>s{zNĜT[xlR:\XQ(d_HF/-3$LQiNj|bJ \֚ @kbx̹!erzlxT]o@|bځP*%QT'dLH>㓎;> Hݳ $mDUbj@ b)9X83ȭH Bc5eQlQhG9iw!RJE*x\^B3!@_ (抨 m(-s&FZHf(63@DKK猣" LAP sXQt+]hC5BSA0sR M8P@M58pʦ[e0:id/8&*B(cp֌sS".oƳrtwA,TlYr(Fn ⃫p #?`A 0`2&iRl_^d{<*"yYQ<J$"}8E4c=4*()|^{ a=>9W/!q+rHfq8LnX0Aw5DmlL)gO9'6c5I0I'я(ǣ6L{dtٿ]C社TN_lp~ vh[RB Kz.'4UBc{Ə?x}@{UGr^׹΁KT+/T~ϖH:7GU7+2$VmE7DATran1cd5_î"ỮCv^CWe #ͻpW ^5tޒotxQ=K1' /r\t,=&p$'vpM9A<:ΊAV +QtGij#r /W ͳ*aK)$nǒ"9v%5ZXie3cl|&~ZqZWl6866V6ƦK#.h]Lfk`A:: 8U`^ O0-N~"LLlHu$gMK(ҡl-\vFR*Son2&x;qc0vqIQirBbQrF|qeqrbNN|JjVAA2\ $(dKyMO+d4۔$[(E]D=Q]ՊB[4xZmc="$ jˤgCE?pm/ iF=o DURG݉IFF͵FF~ִM˚c{>ѶTL*ʫʈIʞjVc3dJIt Y]%Պ22f&ȇ9dj(h.ˋ19fSM2ihFq@J]K6Ps+c 9J$ix>eLBm9ݥڶbXf2:%,]}( %<*oH33 oj`qXwϤSD׀#4eLb^Ջ_ oh;uNޱB@,/^D;B@!+WFeE(rC =+0X<>w/Q}@ =4tQTKRhśaH sJ;oTpE]3gYR{kt{0꽔z2$44C4EdiBRNEĴocK'M{e?6KN')5t4-3x{Ya|IΓ/INg|:Btnbpj·zX}';yU#Ke2pzrhݧ(HS#Ⰸ&NLX0zYP] ~11X(P o \|rMoazM0ฦ$fke62g-Zn1ܝ &/$@oXTw:9p fxNʞgj5%@WSػ̺dZw㰩s)\-y܅.將ss)d=Qp4)mݏ 2!^\,\ / `]3 C-兆Zt X m^ 2岴䢴  ܲ{X[H6pe?CoO51*\l;!Mp6[RwH 3xi w?+XxUmO|nn[mx9 g[Ŷk;0N7Ggȴޚ_V&ܔa݁mo jCGn͐i70iS:Û.=w&\%|ŪB.?ٵk/>{}E2z3>1xts8:7cD:ER]J/fJ,\jƋ."@8*FMHEظ^:kҹ;prSf<4ig@nhODcߘu*']OMNZB݃\Z39_ *QQ-(QVޯehE7:& O 2J5pm38|a#O<9?={T_:c4/Ť%S!/Qy!:{$/+[;Tsӥ"|O>37"xUoVW\PhiB#W)# -%KSJHk$Nj?`Hp7mB4m4IIƞ=0 i&M۹nXQ||H 0jQPE"EC:ÒND9/$8Mj!A#q`zI r RQBXHfLAZ(+D.TʰSoG앲EE^3c ӰATd2䵲E@@P̀&y̳X*"%<Ô+ P=e'D%@`e&dt4({mNcԖj0z%kjiZ:㊅5dծQtc"6dE5e8XIeϜ[-]\D&X̮N#Nj䒮Xjm2} '^JͧXs̝@҉L6\Od I[ y0fyX2"AQX'D"W"sVLP4`ƜNUDNjOlll j9V< ڵvN]a6y`?\wFn135"DAQH8H^V r6:犻 wk)zտC-mhhbώla1C\׶y&˜iRLz~"Ak7)YrHRxsVG\p?tyk삼mlp{o?K 6ELH7(5-ts`gi-@!)^o~ڽ7裯p1QQ.:NkI4#),/\E[lbaZb6EW\,Fwxf5:qQz3]vvbIaGh=A1g5Y K8z ]Lϛ>mcG~zy&{cKbclVGƴXܩ`UjΟ;}Nw[06dޔ oe?., =v{YfDkcM5ߋu&u?u e_)KS ^8)8_==XuW9 OFǠM \Ļ~aIj:F1P3 иnS^63_yP}<%s;wC7xw,"3\H|ʭy 'ObcӇ ;D4Po$i}EM5-,k C*>al OD3y{oԹx+ck@D5FgV2IE=SR2R=3sJSR32D+KRsAb\%Ey A $X#Zsqe(y@srRsRsS5&srg/Қ@K3P5dX5483=/5E W95/%3 τctYx{cB%_biC/J> $x{c6xqIQirBbQrF|qeqrbNN|Jjd},. 2xmRbQr^cGFAA&@N&rj^JfJؽx[kܸ^ :θ~gA|ĀccEnkIg))VlkcSUX,>ՋE\*2BD-T,m")R<>JU+zmjhr!,^ZEm]TeDu/;M4BUq8Ve+3(J[4"'[>`ZBΣA綃ʝ^7ᾬ(Ab^F Y{蟯oo_ ESeU%Xȴuۿ}VjC߽ͧOwn׷~ۏ>OB w\iY?P)dG"`2Q^iom+愍֛,_F jswz ׭< ]WWWS6Y5 9]"ںѯR_efW/>StL4\] z#䐁A=,C.rX+ozsաw_oЍWYOrB|_)te"W3c6v{N afiv# &/ F3;d'3%QPe˄hٶkrfwc6YGX),s5q5[8^Rs,5iӪJm +ҾbuLfA5S YxRŒVi.̒u,4N`Rкbă.Qb1Mv Ś8dw}^U W;B ZN`b̭Bmfq%2:eczwL:5xCz  ׉a3\DڇX,0i'kK=);5Q/TNiK1AS)ْ<Ѥ`"J?]pu{ΆQ' 01TA6UCʎ¾ #oĊTWc_{Δ=z*0): PM#$bǃaU%Ќ;91غmpu b!!8$d]5kQC *3.N8= r 16MgW~mw1ePq3@(ݸ,N @6E@om| ?3ncb<8 dp ފq탲eNfyS2G%eʲ8AN5:]L`gFøMv8*k\ oTSl5+nVբlåG]߰Uc O8V #Q,Gx+SLUZoZ>;x]] b" Z:!e &zI^20-vCؠbxljdRa̞#"`-86w/ LFp>XGNBR#VM|t"#+NUtl]FVlHtj%U▞PCZ<^0q]J<-}q|UUlɲJ8rK TsP x>/ٺN˓ԛ.厨&kkX}gX(3NT񻆝`ɣ8KB0sд!'Ē4P4 0t@N=.Sw?3:!e3+MAL>:JPdlPY tzP=!Vow U2WaT{xa%{yyO.-t"adW'fK 3k0YȅNǜ0J\6@eQ%rnIBp3>a/w߭ڲv>m0O9IS3tgN5cj =4=5i/;PGքt)TZ{a ' iv-Gkj@'nlĬ"T2LK~qSI @(N';R]ϲ.ED26.kok>w Jqz\l1b= Hm o*j(97keSH|RS}F Y2"&W$-R@Ncf)mBiS,P-iHe.`[[9S tzK䔚WSCezkyc #r<uO `N1 I n61NwLkT'b/|^J\J.a_ ]ׄ|C*ha2N5] ):8k!cxWSVc 쁪mH{iQ=<nX(TB@81-LI 4l&A:+AqqQxzt[&#[N#=.GeKyj/NqżӲZa|/hKYsԉ>֖ڜp1gntp,W(̚A!!xbu{޴A~xf-S P aFK.+ES)+.b)8k9+GJVGEF"*3 AdÔ$m ,>7y>{Иdt8p\xx/ q_& K'KY[&}7*}ly[F^C~R!jeGwDw:hono?j+eϭPmuQkG- Pxv`dOFC>LAOMG '2ƠԜjW/#;m/GCގJږS7FNEZV'O/_HȃnsC &`B__| f$0K0!o/^`o:#Ջᅬu?m[㯵?<飳Luttk}.r"zUz9Q:} lI 5%|ό>[z9&K#ΞpGa>~_=C\{r;D'&'}w:tkiAϲN_FmFih2GTP9 =N9|bKeת7EoODSi&d9(k6գɨ3šׯl+g/ }z!BG(M=|KW=yG6-8ٝ"GDjK?A7,{gx[[ϱ %'3I/ÎK93/94%U&(/U('3B?4%dr7Q}r~^qBqIQirBbQrF|Jj_Y\ff`PũWd;;9{y;$ Ҁ C]sj4F1R} &!$3Eį,p|x<7…N$鬽B2[Awvl y[ {ah{,lA 7ڦ7 >F@tAY޼v=>wS-%'%rrL4?cpå4Z+P@ rZUղ_Aj.@^N Sءql{AU+%4o<1B'1aӳofF趚1*"z ]ґjǓ?U0h~Ǣ$e&wD|,:D!2N[d%r8d(g$x*!83smssoΜsf~>}9޷Bk?ﱈnL |v>t}FďPq@Eg-4l̾0XUٸY7Е奥#CDc3tHr*b-];,FYifͮ 7Lzi[㧳((v/g U]6J}MӅ{iȟ';4va8Ô[ؽ%# k(y[-!!U)-/ e=](LPVe^m^:gXT+#$aʼqy~ɶwvv\soyF@(vܙjf7߬VG=H:E-?thA?t""iq6JӴS,WӉ0UP c_TPsg_ʁ+%swcL#-Qg$~0)*_K{NڵR],b 2vu| ߡK^)F=P ۗ9/ |E(yvEF i/nKbjsPmU0d48٥/M wx1T we07Hq[pub_Gv jC/a˰}eHJ3ADjcHq_@iG9p* T=b(HȆh_Ǟ&`DUwH7|{ R|@@8mq*paz8-NЃsanX^ R7~+&"ABNx➐MʠQ 2 ^ɶ}n_߽˭'IG6\oxW@eu!m oZe_^O74׎.<B/'ѵGѠѠk  Ft]^R9;Kьzinezms=%1hۖ R& HY ?): UgkzcalpV'f=~-aI#u? J?/r>8M%=&<3MBc>_ .?$V c•|c* nV@CEVDNŻ?}%&/g g+J#̄G)fRRFY0>G܁Y0(DOwCL X7wl6w6jWT}om,d(t[ٍ-Ÿ앆l:W|vYFeeeqܘxieLif:HSDX)ә߅%vO[\tJ a,C&-LeWRL-sҦqodyf7 8ҖCI1'fJ'nR/P$CxЎ7YGZ٘)NvT$Լ&|}-swwnnߥKޖ]8U/fefZWA&j8023mӀ2L3a88n#bYnn<"|@uHQ{I!5bx}8+g3Iӓ>-ސDu\ḽi1$w^1+ߢ]<[)j5X#Z2b2o-1h P pΡԖ``c(ؓlj$`0SGZ;,߻Uj Do܉XN޴*,l+-n.~T =G&_GMNI,K,*^4xB %Y^ qH\EyH\M_GH^|$> $IH8"IBC I܋t$f!9Aj"5#^$CR;Ykrg,jB\5ƺZLQʮnDu?&dPp#O&ʛ|߳lu.DZl aT8M&=W*)B% xig ̃}|BC\}|lulR2rRr3K2K26ObsQ`VP0l&/1-3$H!($ueI$rx[ig xC|⃃lu87ofkT` mS/;0xVnEVk.*"VqDTpLjh mRQ$ZwdGY.3I]}JE TₗOx܀/ٝ}9s?u/5XQ:a3V:{wm/knX dNG^~8%Z,]y{JEf wRaĘE832(/ʦEFDwZ.ja4*sJs$ 먞P;o_ne]<iM>uྣ4.+^l^m wyI◐:ֽ%lk^݆c#R.g,*3wpėiH,LDw0@u\8J]̉ K 0ʤD.+(.!kvXdb&Q1^UE)&$r 2VO$ECabTUw]a/dM^JY;N3^BM NU, w7dw8?f+Mc֘إhH{z'# op#DSq)IUTU$@C:l4*Βma2,5QFx}PkB8!ŭDxom4`v`W<"ocFf۷W\Z suɭT<74C8*K$VX:j.IB2Yذ GEpcX`,C`j W\3L_ r5x;qqsfqrBpeqIjnMAn~~QC2HX/9?nra*g%甦*&% t+sr2&:2!Zcxe @ E78EE Vp=5ڃKZ'qupɼC){veUFDE HEhPU rn) 8 5pLKb[i>ܢ!]O'3!\|_jؾ:Kr~乲@E^897N_ ?q& RUT]05{l6Tx~u|&UĢ %.. gxWg23M..Լ4.CE Ox{%e' %..}-bcKIJ61Z0ng2g\$ %f6.!ɒΓnh`l'h=fu1 ..ȼy[ɓe')3yܩɅ7g*ld,tAL31OhN3*4Ew{_P|fAj}ggla(;9P^\S8*UV1#>35hr5СғMf62la_TUkNxxے~-}cKͯD45SA<+Br]#2bn*xMK1ͯnmk/*xA$n0,obj-z00;3Rwk#!%#|V b\3!d$*Ubt񼼧j{2 PK ÊK_Pέ;E3#oUs^2u:BU|f Bx[:mBtADrJjZf^BcGPP*3DSAI]bA&dќb 6^Լ4.C-x6uBhrJjZf^BcG|급lR@Vy%mFɢLݘ'W1iN^3#o Wx˺uaF⒢ĢĜ4bcKHfIjQb䇌{c ّC ,]$W\6y" TbDAL,2N.$򜩹%) -\Cv'X$ n,J-)-SP(U%h d% nBM44Ic/pE($^\4S' *:Wnuxvaxɶm5xqIQirBbQrF|qeqrbNN|Jjd{&L53x[u&V$4;(xźqBRbQr^cGFA&rj^Jf 'xXkoH 6PHH6Z5MT6JhiQU4b*2O)BK;ן}0F6iĵ!Eq ?I2yjf(JG?T䅩aY3XSVшr{li{;~uZtzRtp.z\. (vI|t</t37SB#Ę2Jgv5)ɔE#pHXfnS$.QOkAD U-YKYY88k\$˒XE 1@L ۭ4V~ՓǃB~@ȋ]WFR!Z;Yd`N_j' ['$r۟o?9~ -5g8` T_x(ے$K %ċ?=o?\8RO ! ][5x6tkB[x .eϫ鏳jǶ}Vln4 q*O95@cj6U[_۷9>t] x k{ם{QoDG ůTZ(/ER\\p`r(mMbrA9ӓ=F#?%fv0^}.5|*j28ݪؚeUjje wQa3mo/Ni85e74iԜ{L>8\M_{m3q$ ?r.HL\HL:۩ji~pTeW(tpϿ]7 Y; eD\R`[Q,+Z68E6;554 <Q6~n `=ӌjPI: $pŊ(dX*0ƱG})V'ʠ,:VX.$8hxuKo@eQ;/v4 qB $Z q@Dm"$n ACH n !n|ֻdij+Ksc rMxy@Ac9Mr;ҹkTC:r&!spP+[p> '1Wp`uP_F]^]ZB"!˟BP53Єd ψ0gg 1U&H  U0gO8Oh04_^ٻo]2gP"N"0MI.ڃ97t;kPTK8z.Є~s0괮a D !;7,R$9ǒ\̑"{',RrF^ r b R0$693VհTC Vd Gi\ka;Lvu--,ءɞsW dsX:H H+BlүbD*I'(-68!c԰^-V&kK}6 $LfZ[/[O3!]$K;9|qlH%28rSp)lc9;KG rn?4^!gpRqp2ʅ;%4GBr]("2C3nEA1qH[ 4`Jgpj"]>CzDJݦ Fs@TJAG6V!u^WLu9%̑eY%AN :=OxC{z ea哤 [qs, \+}$ Y^"ë~1 Mњu4Q_(G|k䒸]gO{S/t2lO^VW<ޓ~\-M œa]iNr\)w^xfĵykEQ몲BRV4gEGsy>?i~MgDogS$uJǣ ~f BG8>w}tHcH~osC?R [2f2IڞC F&!*x)BzB#_biC/J%(xrB&⒢ĢĜ4- gri fp̒ԢĒ8TUf&V\@I23L`30eT|LH,Ţhr'$HJlL>Ʃ:ʓ4'rIBlpiJufa:Á[13T`g߀x g/ @i,,*'O;7*u[T`zMtr2]^bn_B5Ȧ<`UWUZsM~Sk79DPPx[!'a; {Qfqr›Ky;XqqrrW+*po~ýDGBx듹#%(xB͝,5l'rKLm9{ B xZ[s~~ESd.d}C' HIG%KRYHF?_$'>`LL_Wt4mS$Ͻ²佴Lϣsm3rH~ F;p"ڲSS[Ռ`4 P+cFeLvqأS&XLu\̄fxO [3td>a WF{G܈Lփ1R"p()Ӎ%S-W'}9F'BJ~MZZtZ—LF&zu}f:)_9jJUeY)&j'3ٿu+A{K~ovϾvqZF$3Ñ3h(4E;=n ƇI|nvώ;|ަn㷓FZڭqLW 9m'ѿB z69捀,ހ=,@z%/xb>A$=ph뷷p|l:y,i'F{uX(fh9%; >,R[ x ȷrulPTO4 jVFds&-Frk6..*+/(}mq-'8zI-nt?LavxKr*0dw}qLA^M{pzVmfB׏#9c/gաT mTM> p.J%tGtp-B_xQiڣ"d0b MoDCrk` sF$dx޽8zG'adF퉴qh%cS6u~Wrzz/#FaG};JΆ(VhSV-GWI=nc&^A#bЋ"$+E6AaPIYfI&4OC&MIx- {NW|ߋ5vkjTpHkbmޮJW?jՉYPUH=P}^  P%jv?s &Uv+u:v/%&9 ~*m?0R5kݺJԗz6U9~hFB.IZߝwܒGQʲ̿~]IR֗RY~եMƕZ]fy2<PԖ ֩SD'2dy>e1q>ry?jL,Vv>ߜ:cwqO3;dυ.ᔿ}$K0֙kk2; }A Q䞲}ݸ۪\yl"Y|\ 2@ҟ,j$k( E (:(Uq;KyZu*uc4Ɂb$=d8MѨ- I/6dsS^3IR̴!iFj4*;WS4c~bg)+i-+,HVXiVX<#'tOxRc-Wd&O575bt.(MGˬ,=UF5:_Ca {aaJ?5Gq9`N+(Pkv! xGҽH""%=@Ov3SE }#PhqJ՛?4l$e\ך~y>"ω FwNMҏ][j0b2Ap^"tM p}q &bһߟH( E-MS̨֜+`"?㱙ndq94?PF45B99<奷<-a12`{q;.=zu% qtBdєe>vTמ 2"8b: @vt  z!%%^ݐU>mx?W0L\w|cloF'02ޭ9FSxfl`2̘:%NFĉpj JJ89t஡ l?5u҇u7І=o.fن DbT+ IK49Y7Y$R&5=[3^x^ *1$dݖsCoY/4;;]צzkmY$A@^_=mN:/rB^*j?5wae I$nP3^;[<XזgKPR'ΪfJ_iZXR%uJaKw<ZN{C4ӜknN (sI& q &NC}š\]O2QwHb/02E<.~?NKm3fN0{]e ei 6ŌhCvxVic r85yߣvѳݏ G~Xm œC0F@Q!toW`CSm۱ xNw]nnIwA+ǖT X..l(|Qb q XZ);Y^ B tT2wO&NBcUrsޙG( }kho?,A2Į2T;sɹtUn8iP ,VzVq,`A8V ceӣ=O-Ve0`3̢<1 8 yuIՖ"e*R-мLOWv"ĪU6;ĿR<6`$IRt쳕"kj<<^a"w 3Z{x5e&p|IxXKlcI[mѶ(J-)]r%ڑǖ lȎIJr(nEһKY,0T=b 4@Ѣ@@)rKS>%$3;ϔ_==Z{ZՊRqY..ȺkzHizސdZRk /+'}kXSp<MKF"p:RȨ`Ԃ"فAֱ˪B&Gɕ`D$\;NoOPFGφ~;蛊D#\reϱWQcV#?xf#ε2 nFY<*p<4]w"K&]tƛzPE#3Y08&pbT3ÿ>h/ XP׍n&S=A`V5Y89 &{-A. ,t;5EQ* <ܷ|Tl,ڷB#$>9L} 5(1*CNoxu1|j?7Zs K=t;=4@ΡZs΅bV7/uQ?Ѿ`eqD9AnO mnȭ>ISXfz8"+993J?=r.6r~ 2v{ȣ᝿if>D'^IQ!?a>8ś,Cm {=8Su[ܵ'YdS,BDS@6NC' b ؇񙃓d(ld2I srԬB3Fyݏ<w&q)y@}@V-:0=`҈iF6'F9SRP㎋Pe;N2la[3oPQY&1r%84ߛ8T 1A%\,U* '+}AhؤYdsU*F3_ױba!]mhӁa+E3% ]TdcI,$|t}[r7o  M15wd]^|m鉪FV೬K@R0w7*l4i-9IU4;>S2Yzs'~pH]3hcNE( vM=Ժ]9LN>tgoNbu%k΢QZr 3hܠJ Ccш::΢ ᬀFΑOsSM;92hE&|ӡT#aRBK@!1*X4r"e7LLiF:{v}A:O 5;mX%.-rrimF9$t"LPwsK \-ԄI.:Qݵ`B(O#o/NZ(R~I}EM&8seioWh`rXc4DRJSIz"OAnP>[@ ܫP211s BaTy v/(Hw 8KwZRdD`.LvҖdT qUDPNX D̥|~2jɹͷi1AJ)e]A?ސ L|&}$:$`,$L Y,bX.%DN/s)TH? GLfN/k"0x1q KT 3s3 ' K0OvS]ZZTmk BESjb89SSt4cS>YJq͓}'aA؜7lSf<}r*y?Y708y?@~(x2q d3rL&+N^oIVDB '-x>D?6{Ĝ2bbɾz~KWo !z;f6mf0Ϙb wSt.* }30+4JU ՠضm˗www;,K#a B.n0-.;Wٔ˄J!? ^i}UCʢi"*h]\AZlsK~TCb4Ci j;R*,Оў?wҟz;B2gȤt`-T'l XVK3^`_&nώGB8 _uyEdqN89 xS+΄M#8U2KANܲ 2h@)px:rLy(C`>&0~d:1?sN-ٚ`d#=uj$!cspBIl5l[4{|4N(S] |eN'd2&w;8$f`l^V>MiCL sVL2V7F%,N_&Z4U}@ C1O Z-e/ܙ9͎c|:N#Z9 x]tM8ϋkn-DWIwX9NTudWG~Dw;b?AzNhfkf!Z`&&D ȴ`_޻N5m=ZZ薓oW"k,&Z:P($R]9Va3n⩤٘*o6b5,;ċA,X5ǁ}:w JN?B{,h`2=6j؁IN0D1硠XP`<]{d K39%[X5[U/gf5ȁP}% Y9@e%{y}&G_ ZgtФ]KSu*4Z:9 *v/B]m)lD}TnsΰHe\n#VhSVsɉ2@ ÁWGNjT5",x9)w@q9|!i!g Nt%"Y@~NIM|L܀'79H>>a/YV˞ϋ6Tu?YٖMɤ/fL+v-$>rdBf I#l1 g*O' =e\^FfM*ٶ/aBn ˌ3g= %|RГ֑p.O&zAXr-n:3^:c4ZW{}8\Vu& 0o(іf۵.1P2Y Dʟ\x7vƈ]9Ca%ٞKbDA/=qU! kb2لӗ1gl 8bE#k@:o?f+MǰhJ /[XjF rD`lSqJ_tBXCtbڬǎ(ˑݫ!_LD?ZMDqt%*L]B;.OMRe0V ;|}n<{AF#BՋkvfk"arq[#kZ>j,ty]wl7rOx$Gg_m_hEc f93TAدz컑vA 8l9qm]|\ȭkof$cu=Z7;w = HPzg>^:tgnazu aq8OĽq%Yy/ $X!q>Q&̓ى WVFJeaIpzAqzKƿ^MfKݔnTqՖ()F{~6AEe_2et@znb"fhH~ '/̵tRh=k|_% D\..׼Ob 'ZWN<@pwrfT@Lxjas*xv,o8bWO/lxn;܀z wUersܒt+,tjQ;"-O}>zMC3"(g }/"gyO AgG{r/Wx'˜+uhl.XD@.TUi(O$pbhz7 ;0# ).uS,qAeaH$]{%96#LAX Ar]rH%>*[sztr NU8@^~6>@;~|uH@#>›nǨp*C9F?kU$I)ߖFt[FFS@ڡ;5n^EN*V[0'jxmQjA%;B MJ+[.lE6_̐0?_D,|sΙsƯk_\a,̿3/R/'sF!d"&GxR_3aL/n]^.n -xo^gB8vX x acpk(b:~qHXj ݡCIptԸ]g[ Sȧk6./^Bن4Tfn{Z{lA4H'LB,y#-p6E)j!gS{[u6wUJAm>bU0x:"gX~z $ ne)T*;7eӖW_պD%ӕQt# Gڗ. Dx;!Bpa;}-?W+T<ļ|̴JTҔ|ĜܤԢb-YjjR 6 YX;3(333MAWU0l"#}|BYx+qcsD5F#=SR2R=bB3sJSR32D+KRsAbp #}|{ݷ}4 Լ H*#!_.8pF KB0VIġ73~߼kgg5kAL`w6yfDI`y>mY.3dX2֮.{c>y {Ȳ\-_ڰ!D}UUMִzWբش> 5eg! *p6BNr]3|pIXe5"K TF> @u_6l:5ΓB͍}U*Uz`tN>6U=,!=Gm€4C{P,V׶jU5m+set@vIu6jjYT`u 9(b+CV.mU ) 6ɬFC0 ש' KK%xkm$KW 6s[J6<2&A/[{齽T Son`%]{qSYtr"S7 7tN$2Ym$MY<#WĹX;9N?F|I?-e,(['S?(|(|-H֢ů[ȂxpBgeFZog/Ͽy7^&W5-6~W(so--dvXf t@_%2#c˅BV9ᯡ^q7::L3`,;R69"Mii/k$ xmON0t dIU%bq*ہ2$ O[ qn;?c6ٯWy[)E-?apkRi+MRU}w}@gaLoh˩1mI-1ܡ+r+Żdz{m";F8(rM"zEw]X\s:G`Xz\(z@Uֆz 4JOADiJ$#S"2Ct}~Ɍ/xysB9_biC/J $xsf⒢ĢĜԴI,Xv52x{sC; VJ,72xym:RbQr^cGF&rj^JfY 'Px)3s4sFi[f6 4y3`PũWd;;9{GXu`rIi@yPdYDb=^qeqrbNN|Qjq~NYj|^bn*PWXi<6Y⥹x4)/,Y'**IOLIj*6Q%x9sB_biC/J&x 3x+c[YFgLfrJjZf^BcGrf^rNiJRbQr^HqeqIj.H+$(Oa#Ha<@9\\y% PzsrRsRsS5&srgRP5F%($g$)h:!jdi^qfz^jHoqA~ Hrj^JfxX'ExͱcB_biC/Jض $xqcf⒢ĢĜ4 x3XfIjQbdy9>x;qmRbQr^cGFY&rj^Jf! J+ !!ĉv8p,8!D/ N$.}{3W:MkʎxvJ]Pҹy֭`TTf3-R]LLw+5Q+6#5kN1_Vc1Enc+A}$`־lmϚEiJf3FDI9|ƈ^b3XZ$wdz%1L.~Yu~3;"U 䰮c$Qhǽ1~V@2ϼieN^fwE>~SF?nE!Db%oږ"VOsM&l%q"-ހ.@y'8emy\"%jiأ$ HRL1DOD2؍ڬU?~zQᦐzq &^󒲍0=b;>!φ7Tx-yP{8K50yӢ1($5A|&'jSrM_O)@D&]/^L- r:gm7Fu!EK1-|tL5i!P&xMx AAT l7Ojbdl q9\`@/҈oV #:mmT@eBijK]; .Qd퐹•aSitd.1) +.ZtѠPaבYMA#ŔpL 6ό<\5^EjZ^xDLڌE"@FNA)OW/'drq}jD|\H1QSQ;UuόU[0+vO.=* (3mzeR 4:#(R4 $w֬פjHXKMlȡSY&nj"b:&h`{G#WEpuخٲKdny(: T#@<91d]KR~) bUbhA-J1R3rM E=RGɰHHS^f{ ľ]k(L@:C * 'm᫨ۃ!w-T23|cr{Mĸ0u\!HCTe^XS,8G0MۀC54ñada;x:h;!-;zRT\i:,aEmOYٛs85E1p^] p_xkKZa+ {bQfq,:X: x[4i'd?^͑|XK6K 2LnPQuzvUKQqV>soM=twg/Ntn_>`Ha9G Pi!Q7K:$:fC#)lx/:Qt3fKl{0y3x(\dC?+VJ}1, ''Br~^q\ʩy)i\: 7xeJAH: vls 1`2y wawV!oe#E?yS2 g@=-AԐHS(-tIH˹is°zX_mxE9Nfj)Uѝ(To5e`)8r^5͍VXZg#垨I{nky:=%dKx}s\Ǒ_̉H9^KA cz@=}%߾ߗGh$x̐HՕWefeU<|xxX/qU?/E5+RV؛LgE(|&5Mqߖd2~7b=km?)rY, wr9*^Ͽ_[2ݹwoG=΋tVή x6b>9[\z,b6<].b(`g2+.'-r<U|\΋Y͇qd1ewūj>G՗ոt4j)Ȁ98>9Tix{mZq{ޛ=tAGO{qpxp-9ƫ=nxRIڟ{o_9z'-^ HB'bӏo2Íƴ^;|h_{@ښЖF(s`7-QW_|ʁ/Ep{?}u)e)vzl  /=|:cGT 4Y^V.XSU1’3r)Xg%DZc#|e[ÿb]Y,; pZ&Ml KJqkd f hk.T0:F?ZzvT-Va*gÅ2:F @-ӎ8m1MrfK^n=Ck#w;^<.~[|F,wd* $2+b܆h43p4jaOC:}'h2b޿t `$D@Y[-*WNv^о,^w9/x{a{kZOrQbYo|>ϳ꼜 d 3Sa~Ű! 4 X0:`.H\Jo{ ~[/itZΉ_B}bqIIfih[f" |)p4XĬvO `'_?OhU:N=Vt;B5h2cHxuF 3=[*ud2*j-nV\K0jq*,مZdʢ~MjO^ mH1kϊJko_X՜`TR޳F5, TN+snUӬ½D"Y 4ᛓ+7Y}&.>šL)phʎK؍PQpzOVrIOc,r]uö9s\oφ3P;Jgn=1 {0B"Bo ܢ5<葮X\MBS$`x w l& r{ddŜ֑Ⲝ/K )vntgh'>5PMВY bbbH0QZ 'Dg;XRj5cMf`IKmvarR4"^t`r[&K;"))t[쑼Ff1BX S1| "0*1߰;FG6 %SؗRbgb"k8PgIEF˻ItTA5#lBQS֭Y֛' Ea8*aFM]u `-DuiAeBĸT$ ʆ{_7N&ZN+L~W+R4U' !w RHl (>oSSXR#yĬڢV.1&>@FE"æH[qh5NS |u,}ՙc*k|!*BBaP^JE|qWiQkgafbA,o8#21u.dғ,8.jGjOʼnZ@|-A(|"9@}E:j|Oq-^0Yz 2Q*\媊3LNA稽OfȠ+*Ax Ѩ½'W>fx>q;QadLxFBCLҖ-[5C`9 0쪱LHw/L \ROFo+!8cu.x3ȋI(ŵ)zAιJK4*l0#Xt)?#}\Fcnn仈B^zH2X|d:@ߪ[THmeDC5; Y OXA%|e_80F13-ljՓHiۂ;9&?v+ 7.ocmezbo"{(7,()spѪAc&FkO:AV${@k~KM| fH\P8-f3bZT<SژgcgcW +\*:ꌣԋ)pEN "6IT;,M.!##Q@U^:|(Vk_: g+3ΖH8ыͻWR_tHa FJ|KPl\@4h!l)zc{\)5S|Z5UPU`oq]Qe:\H< k($B$(Hؕ}t_ڥBLArvBLB^b!>$Ƹ&vR娎z(W n؟4"G>bs6щ PAvD^GO}VljεAOdf` :'Dbؓ ׿YwE&jBh$d9 5/"[֣$#⌎qYOKȸc>OP[p.2ѩ׈#Cg;#NXl,)!7dbD ldV;"}4H%Yi<>@c)H椊W #:qHINTr`o.>I %&]@IaT|>:J] )ՊDNA8i6m4< /jR⻬6wb^a]gxd NKUz)ءOQrIЦdA:B!긜 D&%:s0J(T譈F#= 4 ި󛜹AE,k-==1--01brn /t%oR]bZdmClgy ;sŵ}viJEF&A[ձH51VF[wkkp4'-LJк ^jC%E+M6HEb.I@g ~Ttk 9mUiqb#4Q=v;JUɞ]nT-*</pac {~?2RmpzyMtrkTr:#lf54vĸT)-NkQk"\ \gUȳgY.jq&y3^{ʬt] ӄl]QbCI]QK;#8s5x (>,=b&} 3PE4_t6? 3d2 ]3/U޿# vpqZv'n$F&E 2bM2QF&u7!C9s%ti. xqNqEiq"\^)'ISn6R(YxФ>&g\RB)yNt& zGpkHfWVoT8 "P.%qWlr݆wҡ$Vz"0{ I7CIAv#*niNt' stʚAL;)5 zobFrI1~R)2fXfG: ,֎!ngė&!X)r)Dg~T.@䛯z}-xzw3qU.U5hNEI(49Wn婮!.1$CЯ+.oiR[sYSI*yJa?6MRXC9~%_6ariүwd`;QwEdxExȠ̈́=yLܧ~C zjsCז<,IGSkYL.Q "BN;_\87JOskm6rM ilM Ζ9 2<ނ$`8+eܝj?ЍL.iǐ8?jeGsLkpT9OːZRPM+ȳ.yx3@7D!tM+M4>-%g*Գ+㲜:&6U& $'108ݸ<œn18{9Q8krQa&D nSn\m <ҦjJhoT̄2Hb @>=0 5 S,4 |3 K(-a=@C$Uҋi.G'6$]/!:_ ;t> (;l;НVul'* 1S.wD`բ܁! Da# PPW3k/b?MkAv _Ke  w't*RṼ-.z:c) QڜH{!asj޳qj<_b -ѥfrʔ؆reXcm[w5+q2{g7-ZC2jy C^Xgq=8?*L\ yaRcogCA򺧇wJC횣mg%y֏'?h#Y3EcY/!SomgꢻG4JtD{e- 3sJnkXeyJޟAr^Š -0Ɛּ^)fΩlF#'5={# k[Ӷ1PUlֳ,)dMrYӼXQ 3 OJ''&m^sK^CS<ĥ€V+ۋ(RTg4 ,"OC`#lKWO:$0BT\?+I NZ灾E Xw(lA _0 L1v'V?fٸ0 o6{E-L G46>θUW^ez2g6|¤j"[j*@'ЖcI {g#W׿„"iy3*=g)`KͺԓwUIBM,gx~F{ 1wF(rA? GKVփ8z><$ɍNec03߂d8M^z]ȝ+0E9x5)3";3.) IjƻD'YTr˜."2CIb^ggU7dJ@z澵kj oMfðlj3(b:W9C:xhM]Hһ@bLkB@! A ,왫岿~Y70T^}9qc[&S?{֋e8XWo<*`A Ց&R q\=RxޠDG&amHˎ`ò6j "t%K@8yoڎK'osbŰ &NL@rM$!D` u!߼{o<D7R{ _!$pʚufuMffNP&p'4fGIT0_ŎwYHi__|'&6Gd,F}Zk &m[_+1!XS] @񢙨fl=(\{r@5hrF楄, kW +$m|+<*~E;rC] ~4uqÔ]Np /´H6sU8ᢙ?8Rŭ1iJ?mkq;hx~6fq{-oO#iӋCwŎM4@rukd b2m@T#fXRؕ%Xˑ9N$8Oq'*c~a#!S Eiްi(E ,6US+Krl~hQk?"8u{o^5u^:#89z-Mu½֦)H!f4>?{QBN~8IJhf9QDM(f ,:|sF BS6=-s,ϛX vGjGl eI}%A! ɦ#o=f@Vo$PW65UF6Z ۥ$UP #Wfj*[)0NwպٶT索*4K Ŕ"N 4ZT> CT8B=rw2) Qz^mlƍqvm ݿ\Zrǎ;"ɴݛ)v/4I ʠ!N^-ea[ל,!a͋tI9JT7:]S~NUgVaQjb$b7wC&!/"S CڸR{SETonϹ̚am.zWɭ/ar`ޠ:'dR$W^y5{X1~?)Ic2c%r ]J 7B)rG`S% +Jfܒ%P|oO26KH>w^ٟRq,21 _y:!ٯ8WyPP~ Ȼp)w@~3W.ԇ; bk@5m](r(W(ӛXBlC"M֕ÞR __ @}xWTdžx!3,F%F[TҷF9]/og3w?S88̀Kt)*rvfA*OO^YmYLm4'3,O|̒NJQV*1ϴ+hǤ6wqغ,qp|kaȗء]bd'Tti8P]LaV#-5T`4L-(eUǬ{e2'YftZ47d-:,zi'4d |fzn>:BP'8IǩH>ر`GhȌްq4l&xȻtg0-]]j{Ċns _åzpK(3 Ӽg2Lʓ)p n8fHLvjv!EH{{n=(,} ;o+# HTx E#hTkr ̦J/pV(>k7@$EוE@"޾22(l!o" ?D;_ c0LSFY3man+~xVRc<;{W0>#YI'=B`aPN}^=TL [k "-1[HsR) SO$vZk(sԶ|̐UAB[_%VG\0sķ Sج0Vh} qwM *6oݹZPoGf>uSͥ%{$ Dt[PP/i^a Dg j950[ F'QP[G~ &%b E)1'%M"MhS!Tp% 0^>8ÜlPJ6l$RwP˰ ?ǭy3+ܾQoW'InJs'>DwR6:D] 4QzҨ^ M{ɵ6H2 3W R[-kOk^ h%s8|2ѩ6-[Be6atas}SVbSA׫J0[1íx9]F *PKp ƬOw- վtLA1v¤sy(0eC+ek7PyJs. 8ls"S~n߽:w,Z~.n@|@whXpjb,KdwmW$'&r^-\g)D"g*a)@_o(-mNm ɭU:T f o0]k߲[\2'3FN+8!gE=~bKe X/ +"\\EtzrY*L}fѕZ4+%n:~jZB/x(XvI4^Xş3'}W`-ubNZi Gz+Cc9Vr:x)DQƦNHX0 2DbT`SF3dqbUқ֬Epf&OD:{ ,&AM<='H vjWl0e> /䦴ӿ,M(Db46t]y%)>6>5\El;("Mֱl!7܆6]32z=D돴NpfXTq\bYIj־]ֿ[ .=7 yp60;r#]8q Qzv'ޣˑk BLe!T%]J-pЃċɾSA2A,0#ՍE[t[8aΒ#W~25gG9aAnFrIhJ>BqpBLW/\c%WC'<$+0d Օ܋hP-/,*EX؍qP)ak @i=\*1`52"ev#\q,S"jf08zqC7ZmTĎؚFQqwؼô1:n@1E䴝# ^u> W*|ihízʹ",6F/23ֲIϱHm;2U4/{7$@nob9@@-!K-o!KMϷNTiOo~XaI(e"P:dێKf[z}jut1}{5*3 2|Q'$OԦVOdJe]h1i}4?߷ %ad57X2 `.6b#g3PabSTn};JbJ9a6 gpJ *"+/4Ee{0<Ãd V"E;;5EnNuhys:P\rT!vgH5\eɴHdxbDTIz6LT cGOU$䍛 IK“l_7/ƕ{:aIE.$ (=V 3o"B0a#9mHw9o@Ґ}6;<il鎨/:B_Z~F;j@)d:i~IY'$J%N  s :4qJ )J JpP' YǮ3Ǥ;jŵԓ>m1WWl$K&ld>4Doc.#uUb^'7108deB$5<wto.|G7uVQ_mQo^ʢŅb'ꉭݧV81\2^oLrixhH/2i37@zӛG|ꭋ?l]P[;_ұ⩯[GQo=V.UԭpB5%q0WчK6SK饥* FOS?}4%O (B =Ѥ6RFt~c' %.T$u.BD>L4,iU% ^e`&f둯fv1!Psc.@ mxO/&~r^]gヸ[[j'ey!W׶'>_֋X~j *`a$"lRW;tqm^X˚II9 [BgPGzW0Un:BMQGcpN:AK//Azб[,9hdne'i&VV0ғп#/ԔO9eiTz*`qSI$H]L1B}'i]0'&4΀<.l/3Pڞg3Y2QR׹XF _{g 23q3вy,<\4XBZW-!fu!QOld\>xuAKA/X' !DTHR(`wGܝ]fg0Y:ڥ/Pޥ݅Pxfx7}^,f8>Kuoq<AurY4EY?od-\ ˍ|WU5H&Iϙ'?Rу+p`6¹ˡb ؾ'MKŔQ:>3 Y/FpI'OL1a5Muc+eh );ۺ+lͱ@ogخޡ [~iK~mY:!h>{ ~Wt wxb ˌJrRS892RJ2RB#]=r*24& tiJ!Ik*(* o7o. 1`pC 6u42~x{b dKcr{.D!OXb\ѭ(S{8G٘%Tsq.%&O"Ǵ2%Bj^ZIʒ4!gx#xoIbYQ2'}+Y`,EJ9LΊ..g)]LhLj<ۻ|H(vO`b;2I+TZ#UL#JģDBᢠg"5zႆ_9&6v@ ˭M4#ש~Y8 ר3Ruq 2Pps87-q!2h<|Otuؽã^Ä(G;<@U٣?Cj~:~&Md?Uao@S9˕CJB3b55iHU8 x wmeUr{k B}`7̸U[-ntUoϧ}uo _h 6=݃%nREˊ܈1=+ <H>cuiIRR\XaUӎ׷=Z2emsRXt}\ n'bON5QZgbJxz~vvh/Ɵ짚laksӫ(ZTv2vx#ې%8>e_rU= < sҋTJ?k1] % Y3O*t1AR;k v%1W:RXK<}DZ#m%{^n7R/Px%f;lI"˺E?:U;_!\qkpg:R>F*c=%*6k«.zʊb]*fvQ{aȱX}0m͑:*z.-Ӛ#{4ۧY=$r;Ap4PZٵ٫Qg6vwkQ ,ܯ}!*&-_wjnu)l-32_k+ln̓zMIwcx-Ÿs3KZx1KzB[6„:t:rDMXwi*x\'Lf+yw{LԳxZt^Ū\ZU6yʝ@;VNmpww;z;vPjxSOA_1Z4c|+Q "F !l;a$^D31ٓ ^=yo$覻y{y}7ߑ{?;Ebg"_^Èas9S$1 ֈxp!R#î(GJKi"4@ "K^\KOmyi+Hҽʆ61)gѰ.3YfgƋL>"h3I`8f0 U"JD$E"B՞KPǃZ?ۉ,DY U.CcmΤ?jjE ?Y^ZZ_+ [˛x_ŅUP!)rn,/|'UD=Tɤ>8DvŘq 0T9K# "Jd|I!c~LqHa wQ&6w.JG.$T sYTYhuU Ȧ,a#VAT2)Գu$:}0Xj:WZ^( XΏO`7 TTwnfsOf F pڷjK[Hf{M .7IKrxOYN ϙCnC*V3{Egif^Q|BbAfyj!'f .:xIgf>ԢT̴Ē<-3x}isGgWdk"#kÈ"HqkhG,P,T5qdf <4ݡI$s[;;Nq\夸aq2g޼ _~WOOb]e5(͋o'u=uZ .z}qE=x[,[pV}ϦUU޴[E7.p6O΋xp`xzsvi1y5YΆݣg?O EUj/ax2WYUflm‡ T|Hʎazs4ҬI$xP E=q`v8UUgn?g?q᳓0՛J^NFC6a9G/?~B&xqxqw?>9|YGdv&|yo8T@hP\T~5|{E6GoTeР+ bxVn1^onzx_Ooa9R!?Z PNAh8OYt6@[φʔyi]ݜAϊ/;'<Y5 'Tpg/z<{՝y5.O'gƘV%KAY1'/qOj<>Ͼ+?accNmnm>/g Ww9$lVnn,eow77WIic͓G'ώ{ŗi//a4(FjNX 0,ش^_Z`\PӧVaZ:eྕ R]LzSQz8tp:`-] o8VђdwԲb;Hg%e ;fc+_a"L B|7a|` N_rN[38M޳8lx>&b{1?s Apa+b_lvm{sc_˃ ~RߞHߊ}{E߻te=] !hc{2Dkݖ)I2K+~pݦMj!Ȇ^mv8%aUNHZ_QfɌd-m{Jr-xU<:ѷ26B!nMs8.4xEi=+9yr 4Bь*4:ehVe/O7&;Xg$R 7'  qB\cХ9]5E^R~Kd v!['A*,гO4#⃏ *cŊr{D,\ݗ nm-\Ay⼩eYaeѺhQR,9-p67lUýA9trx'p9R IVe#{l3"T޿s %>UuCF,/`V7~W5 (nnB}V$ق?&SWs"4[0 mhdII~ޤ:Ru#Xsq l[\dד#4(8h^ɤ9”q6c@c;֗Abm7".k"Kr)i~c, A*Dgl~Âh9V!VÛ7U#t(|Ch__X {t2B{)ӚT)APRUh"V=f`LҌ  -Q͵VF7sM[Tj sBԸ=>~k{s@f]`ѸN&2zPre+v}mkU V]pZ&msQ#MIaÁ.yK(fEtFT#"1V+ȴP{~"KA{E_Ƶ٢Hޕ6؝a k|^e2{-vFܴV=NT.=6N7Ӵ#4u{Y‹֕KaG~h]DUHAjN -y1\&AV7l\!|+*#61cՒF+ͤPmQMa4uI"l(V2x1#7o s̍lMg7jt 볦@lE=/}xvDIT|2=~.[ۍaa:'7Du2OU6c2(l)vjZSes,+iL_Z[]ø<ӭDŽ=-UwƩzrIܘBQZԴY j[N{oTRZ Uez40=LyP4ҚնH> iiS+6-&š\ţ%c[x.DauRMѳORckhf73&iq@ vI:쓵~,Եŧ_EK7O9h a;qvAn %%}t4`V_MY. ϲ ;ױ;֨@:^F2Fn~.BVdfONd_/??-b_!z݅["X-J\lXaB#S*+fҤ;MŞ< Lֵ+W誈Y&C̽٬3f .ۍ0DR:FJó\cY$"Tpu W $tT25!4;9{fpV:y`"6mxE ' ۍݼ^K&sيP+A8/\1 b>&6cdM9`.(W޴EwD_* hVt!ʱށK#TъhNEL~]ػ=E9 E/sCLΜ yB^hs3Ȅfc8v!Š["tB9izl10'dG%QUx!S>":fpBx͐/[$XW9w%̏r,5LWٖ: ?0!b}!;mQ:؜u2)q1~;/Cx6G7T9#`2#ɑ4b Ћe2Ch;-SgkTowq!MP s}{D +< 5 6F1& NU n|W$08f]j^ F}l;~?jHM&!x) F}Gm{p_7ҥi`jGE!5AO:MK$ф %Ҩ[l4~|od 63XRg(7dmVI %dӽ qHR˵Exf d4Hr)L)f@P_崑S cI0bw[l Rh8wjC*;i-1Y 9ic%ڡqU1XȄ| fY^6N՜0$A1Q> f2'3 HCLRZmn^]+fv<#B!oPyޯG)a4* 4_ݙq"cz6y5aF_s\h(rH*[[;-IkQm>dNE8l޶GaӁ 6vC У",j:NAE魇t"}u9E"5mY*\=OUO!^%1 A؜Q-RzM nĕ܇$`<:!"zcq2C{'BPˢ֑DuXpEv5ݢ_m+7c(!&P޻#D!}MV`fWпs %-*{C,1-Ȱ^0B9]+J-uNi|؅=je-KO)Ak)3"+>J8s]vM!4{H M=3c4'Y%.!Z&4Ib jZk? y܀\ ]w۳z&Id8`SUgL+bܰ`= MV B+u#hZ9)Ɉ-DmSQ͖lWJM)2ѱ2eਂEU4W3[Ç\Ȓ =Rj+Su-'eFhFI=qEI> LJE< x"]i kuV~Q7P>QaD 3n:Kmp؃[ܸ&;pRf wq%Ӣ6{6HAvM(߷sb,Yw^ C~_$|?zTr?O7ǂ 8m-!`@,sOD$P+9&IϿ`ł$<`Xq_J\+~ S8(v njS –o򴱅ّCB8|vB.XD}O ,H8>frQnu`'hFqącڝF3 PM3H`qvDJi[1IOOUY~n#^p QBՋ-Ru$)y:wM.\͡Hͳ zdĄ7͉`v,Ԯ9mQR~v^TP[>0̱+FlǮdz \a.BǞ BrB7Cz熅$u`sAҨg-0 T3 yQ'kJUR0ɓۇƏ;2J7Ӳ04l%1O,b@*nc8GqtCJUhP#¬}_Z{Z:^FCl倜#ѩ2j8;%Yprpˆ>l}CkV+Ghrn?f25!;8j+sE~׹FʛLu6\\jʸe(,pzA u "j'[EBUJ Nju@bpTuF76{.0Ym$^ȻzK(V}}ʁ30[s`pUI(&`Q,d`-vF/!kz/}.D5cKEc7np6pm=SOaw f^!JJ!XL@ĩb7 }3s*Ŧ,88"c.dڠ]0Ą: jO7rVbV"23X@kWޱ;KZ.ddͷwǞOlA:R)iy=t+f.25 (YAOY@73Ǡ \|,ah0w(@# IeDvx3)_ֻ 0 '\zI㏻^-BIE)Aб ~L'Y):z3;D)H% OHPZ?+C)>|HAriې$ДRgbF7tv6ɝK~%6nsIYO][$ILZ:7FPٙL^;.xJ "'+oJ~K+6|eqW%wR3nHZ.}*D{|}&e0,UAWbI%_Ѥ-¼yN=3%DG~2Ff17mT& {PMɗe]Jp$A[ѽjȴniA%A.Ftk3)Eg3E <kJbb]l('p=EYCS*h. LET&S[L]8b)JFiNgyѠLx}su%Hm6r/(8[l]ߥI n0j#U\$x,*^ע,.__-$C| !WV߸C0o4Wz;+x;@z7nŽڐ%3?u=,!vƄ o.x yֈ#C~F~aPU2)Bx5)58ub(|~aJfYܜH%!Wq7`.b>YM20qUe)uIe=V8YO(oCԣ4duv0.3m$%RBgLDm|qKkrX,-YɤEMfP8v*֕JSі8]Mo˚,a!']'m{d>Dd aQ@:(kFX {R &*|JK"%YEz-^3$K荷#ܫ~6F&=?tA !f HaJs"NJUWV`:FoFָoy`vt C GbW*CD_/$WHe o[JЇaeၷ,4= q j;$ k\f9]ɶdc< n!d~0j4/<>9<ӹ]PX4eN}kl0 ?퍙LĢkWd| vߒI]:lXLxRvb=½RU|xM葝CBϰoϫF}0Ӎ^i{v>YwlKJaLa>>!F6K2ӟ׸q1b\v1<`@֐mwKxlWj-c{K[G/eyI9(~2};?]pŻ4_4(ƼMF,UcXpu&V>cY!1[?x-߱WlcT-{)i>_⁑gڋ]'UHM}@c}c]cYХ_ cV[XČXZ)kx~*`G5N@t<)/WN& AHx6"ynN n^駠mRWXS@#t_u'r.em -@",8~}^@i5@KafNLb%)jb6-q\jF+N@j]e$5P4(H9Uۈل~Bkֆdv.E"yM?k$p]-&V׸JUa|,RtBe9%sa'ArLNt "2H:^Hl3 |~1㕘: G<Ћ͹o(>\~ h+L do}HZ*`&AĦ1B.(%8!brP IA E)[Pܒhx&A.2Vi[mD# Q J4EKP9~ [wJ H:n'CH^P?B"Au#|4JM pth3@>UĢW.PKZ`DHER06z k2D"zRqe0Vd܉~$JYTdG>n*/p-+άcG)#LCK;G9$TeXĒm 3sAƵd`:[>~X80ޤGs. q4s+58i\ ".m%d>pQ0vsFKxhX2c(X hhqD5lIV%|*f:pg)[C=$!i@#mߛmI6ԫUIC3#b8!Ōۘf5#(&j1KNF .i uO!3CkY m~>Ij|!Qquo os+ȏf&ԤUbqm{$8XN7Ga{#a69H_I1?p6xsDQz1PVG-Ǒ4{X;W?FĈd.!CՋC }./Do(kEq?"TuQdaŦ'lp(A5C Vo"̃n*CjL}=20LȐQ?x(љRm`(u5-kXboTgav*ޑ`mah5ZDKlNWHam?3,t#@b2Id${6DRɀ)h; <[63hW6e80ӎ BcHn}*!bI.ë8#֕ /EmtEr]YpPGlBG4&kÓWo#;r=%1O u5p%BQ #-:(lkV@j>.sBQx(DOQN01;, (Q-K.7$lMr )).Ɖw $  .z{ϝIn*ҕ3<&>1z^!k@>iczmd$|26jnj0Q,}CF(Qt\5 vM%z;SO f1m+ϳoAU)F&.ݹ XN1 죍zA{|ɪb̴ H(*_Mq>i7:'JZcC KT ֛E7XNf2RLX˚3X#!5?c.uEo鋧u #\|αUL|lh vk_P_/z]77adŃS-6PEd!t%T4e 455]NKH%'u=¤.(hvi<4h)%bnYu x̬C:ði˶nb=mś!@l2/rN.BV# ۝/W웭jڃA r8dMb|)z7`q 'z|.Y><ޜjj}4Ş6Z]7]C8%Dj+h L(b2*4 R*h<95hfjl7Yp]_m!C-09>.k޽ރLmZvϧ, )~fM쮌8<>7lk:zנ?,-^<"\?+Zbh`Π5&~}a(>.ZO{eRbn 8EjA!TcPO}J]ĂtY̨T>Y<8'&,W,I<Fچwݹu'Dɒ?mDY{$KR`TvVo]Ϸj3z?@#?1vtC% c\.@MR(]C`R}& [>67PKZ!_iF,#F.7%w\29ý>JrjW(9>.ȕ"̈ƧƹiYq$R8}cV09úK@#L,+ޘl 58LM -Fp#HlA @KLb|O=gZAfHd= ;k[ĈJJj F㸝iWdz8o֒iRz<#Ӿ ?4~w1acsɦpҢ\=lBElJe{y< W-pzk*>>ͤxX %Ӎf 51uC v!k;td̉Dx+MP{U ۷!|܇T~fl6Cu6K(M&g}gʕ@e։CL--\M=MB"ZAXILpK 9l{5x[{lyQ[Kԋ!mQwEʲDJEY)(?$=ޒw=>dIk9u XÎeW$1( ڦi E _EG}іS)Ȼ3|}=Mg۔jpI T_[ݴ5vתc\WIoQ-UT7O9{IVsئZt "{ٻJ>vv|lr<=qF:}t"OOzGfLLOL=<6y(t;15s~أQ:Ѯ)]hcٙRj9I 69(lي& F`6!d k_`5|ر3@ Csyp>;0щcq.pdiy!_tB.|I^i>&&Ό}O޺g":"u5Y#gK//J:d)ްSwj/}=֚UD1sEu_U3mCgm)b<2vf$MJ Fd,j,YPLMɖT VDZ*12}~n }鹎f[JJWkmnA|#|f $RҮ+61jGdzՃ,`ebe, NVX)ZBO[4/+0`hyJ{w]) 6 ~ I&a_I3[]==m>hqT`GgЀ^ לQq6zc~o0ڎC +<2,\-lTu T\CS$ 'V5W6M4MJbX*>48:W5M@RZ+ظ^°gنG.VuKU<:>%'x9Sɨ7"^ K[=-$ 9`=1O#cqSIOF~qx ΀^  ǎ n:㧴;W}׽^қWYf I)&iSzo7Zrq Ft~T^%L ;LO8P7R M΄Z,:ZE)jRFNG15è- 19袱OldÌ3QV' 80-#5]&a PϪd^$gĀ~c ;j7iOU@9vDG[W$b}Ј@%9k p+q Na2J/wa&GŎu|~pK_޺  b+g!wyfw_23gM<ĠIBC2)W}vt/̉mB n)Oso#hbx L=)Y%N:,fT," s\ ZA딇U00=Msw`I$YtovѰT-jvcdd2ST{GX/r|,Ha Gr~xQ:}j@"ưD7Mu 0_Moq #ȚQnJƕRu3ԃגa].ãE#Yj.g+p%;X1AUm& d>u"\m/Eh})RVXxN'P;-J>s10i F6ja_U] fELSYSX6f@A7Wm˫m5`E6ԩsXY^T>kTP㒸:Ȱz+V_fY98;nlu(jNC!dZTMBZXAL Lĉ(gC2=ߡ1fTNtQ25ן CȆ$TIAtL2SF NIaieLx_chM5R#Bf-lyړDwu!c}Ɖ:\ܻ +b#%,ȫ)|ҽ84D,JXT/W5 ,ҥOEAL} %F7IN#?ChEYOYGpuh%!ds'EHǴNh#b5jd)2NԳ􈶂C. Ay ww7>kg`,Ce Oy]"QWٿwsޖb>=tG-owsH<Ѕ^~ \*^9"Nr7JvRWL8~K*Oץ8KFQY%!浊"1eT{CWU1t&)No]O $S^aW'OMRH:svvYS"H<].y,x֓D$ZUeL|x^i^䂃>oN7KQ2+]Qeae,v|E2{ĩ1-0Ih`s0A폞1'p;5UHULP /4^{1WZT{MI@`b-F>+TyTeX3E#zf)| A B;-Z=P^Z좕ʮ 鳡AJ1U_[qP "A'w,s!ҮH˭=E%?K2n95zº 轄^))K~akfEfpn&(f]WVq: D/f.-_Y))Rv+3}:ڑ0)F  \ͦ@;x|s:aҋN8kVy\KG%D"u睼 xcYGZP%#7 hzWC9l+2瑎}- Ʈliו=a s+i' YDҽ weH,WVC#s^㌒~[3eSk^yuhط} O?qoan^tz}1 o6+lWV>$Kdag8Xٿ}\rn$FGϷ}1;$gPltz8@}-/r%NݟM@TY{fE_z*NED,? # Jjwud( )9i[[LB3V't6Hn¿Nup3]/wAt׼JK|7l9{CDdy9 XOҔƟԨ0+hsѯc/}u '^{ 7^PSNVofcE@?xG}[5c;yf GmgcM j T1grE|D? 6: #ISt['|fvWih?{-2z~mydG'/ so'G'ݷ=HxdD24|6PB^u&`yE;?ζ4ux}o@U: ]@U@ I'+ @F X}Ir9;X UU`EB XYX8 ID{~wog m1(Tg 鹜C5 T]`\+ E Ib +p'bG(SqʁLE 40 UKֈ(Ι\BPp *A 8k2:vmv4FfiTn}4)4r+ʘAv*Aփك!Ă3)9zHihх{Egqy\r6;NyNqЗ:dP׎p,/&e,Ez !ٰ1ۆa\am an]ſT4=BZiz5"x{UC$maim&y4lP5P9lQ$ \NgKF0Rd0Jé\4fonEKƊ0K~+~ dQ8N%.$[>p?SJlR2m=nG ] /'I$xF"aFj9 #/b-B4;GDi?j +9l Ŗ18afL*)$ =C$VA}WAy1ө9$1]B'tIfeͩ+4~q,}S8qfxwx6mNI.J݉y)d-8$F6bۭi~m%kS^tY4J)Gm*O l{x)!LW<ÀIl$nby77:y\'to2ӹç%8׷bǨz.hH #BwOy^0a:+ uC~:%b>:{0xHw)͓5h$T,^g/' &J.l&~K e擰u6O[AEӘEѓ}mpHej}yz_)@xU?KPihVKkSmu@mER%n@{vrt,opw3OdUtp9׵LJ0ɢ;X{8]~&q$] ..t?<:bI a<;<3\B}2G&hvcQrd|(P 'Ynml|3J[#0T'~9"|_%ImNz%?̲X4sKkfp\%Ckn:9R #vL, ?ABQ{-|.w햝~&ORu9YsXwLX|/AɈOR ѷYvG6͞T6Cu}?}D]A`p&*{1Ly0QYtmJQ[iwm_PƉJUIAJrEqۉ=ά\<=?9U%&Rf &CLsU>ba7[k Dt&̱gV9h}zrw0j߾z-Y/[J鋝 ݋qNuD,_T=ri O&  Upity2 %IPyXk.-u>lQ˲rW'NN?v׾s ?2tCv2ΧRzn:YY ]Yyy{mEy!g2r\G[@ϸyx4Ptğҡ,ZPBQϔvI~M+G %p鿓ٰǃ01UA8(mJg%_SP~cGUL6>xwpi}8JW?#*by3v??\p~~rnCl-fAbX A{K(Sٶo7nƭ pun9Jb@:;@)Cm}MQO[{ W4E#TWØO!IDD|Pg%q.hjY"yc}2NIχKl܃)3>Q6,22~Ɨeǡ{":7)57mcD|"<*T v--`fui(X\*$+.nL/J)S#%fVr,/nlif!>Uih )jP/w{'k:9&g;h&movH$\DA 䈔MNH\5nyjiYd["E.ಮϘR VnݶŇ{D咸Vd. MaA }捑QMXvĴ!5K7.d@|+~ɽk!/;+,F>|o^rB5 A yfg{PEUNh7~Vs!ͽ]-*cyKj;k- 71>HU:lAnwc\z 5-6KaBI]QYC0}LmY.ج*s IOU]`B)nN2  DdXIU].O r`e}#N Ebj<҆C9 oBk֋q #:| &Db%R̂Iۓ*e(Y#鸄s<.7K'uhF|&vbDc6X0#"Cݑ:L yD`~vEҷ<>/x*3`@+G( ѭx8c :sljYl6 bf4hLW;5]^:)C Ս^I!=Nr"{5-ĕh*;䎺=C/)GN..g*O#q;89=CFc-gl_TM1<:\_>DTK+MLV]0Ùb-K5OLLO Bfj"Qt.w^gk p8d5 $GT,j\FAhdMlбp 7 @خKl9]|5SnkKST,H-MzΒ{kŌ82Cfx)XYқowaP v%**UPFLmo`,K617\82 9$TeەQoP>hf^C0~,KcxT!h5ulS7fJ/24rxPf%{D Pt +&W.Bz0. :c&gQ!F7q}+#GX,51B9-n9y\F.'R Z``hʟT*T<1ZwEH=^hVlF>Ϟ1j̀s u'SU2O[47J֏lW]`^ְVX tdz<;k `lxVoEVHm m:8Nڗ S'i*54k- !6qz쏴iZƅ#"q "!ęٵPKy?曥7)OI3w+۶,wtS31:^n5qIX;vpM$m|GuGɒ:jUekpSЫ/7ϞVmnT2]]7Ȩ pva.<81 cݍfڿ vb|V,*)֕B}RV>S*ѲKLO~D$1чĕamcz8X2g} %R֒oX!yAA[* .di@e+~i=Ѐʄ"!"A^ƆRua=`nдlp[$BsnhЇ|wS#g#W&1P1(ZnD_fpqPOsbn7ˏ@b@|?՜wa5-g>hlp1K܀SOpHY_Bsu#|Qr$}q2&5!W|fxK/S|a%DD#W/ x_#_H@>ޑ^JHBڒ}FT=gGXpYe2PoIV8#+<6bmespgk̶"@$ER _'±Ч.zi|۰D7-6X8v"]wZ[:z'6`XsQ)) h7ݦ u!Ha  HC`*Piϙs3Z*cudš((PcOF}kw j; lqb'זʆGMx&2H5?/xݝ<WfMu?!x;<~ cOf}>\Ύ~ή>.z!q7ֽj`U,?x;4~Ԣu@Yst!t3Z)xVkoJl~H\;桺.!$qp܇C.q.BCٙ9gl2zVp났)\0Ncg)o;#}`& "bg^(caA2#MnsHF1dB%at A!@`1dA9!Si@l! 2px _巫,9^є2xHbا)@$%#S/egN\fXHZm& NU(˱9ARI N"{=_J=鶭1@h*IFRm\c~>&=dL&3qrn v'mX,1*Q 'd@D(̧HG#2ItHﲎ!!pC$D~4nuZ 3%eqXM+B޵&&+~N0W )F_\xBbhWdEEm-|Q0ʥ$|Tx"s?Rĭ8--e)M~a]BSKNQU0N0fS'6Yj62?0B.OXt* hNWZ@K"Sm$V+RZ6#׫[ZE)cغk\{ow"s(38;7 ciTC]TG{tʛf,e=C ecWѡWiy{yt~5U￱mn-K~^? CNE;9"BQ*k>IS:W(E>#Zou0)?<,d!xd$xL'ˊ1#<74mb~OX>[}ycީT=MkGHmeL!In:d[g3 $#qAY^kJHRGTbqdjq0^?@α x= 0 }-c X3a>a!ߗ?,\N#<9/\rf' ֞z̠%8`B5ژkm5f@v"ˈ7cfe.L#%p3Ȟ1?BUxWn8}W 'HmE\8vbv< DYD%R )_CJn43hZBHqJt )D$ycRf04nÆLAVDR J$zA$mJ)-ٴ+!!1KV(@%RT Ds*è[̭=^`@BGʩ$i"DD@0x(Lte I z-g[10nRQ 3̓`YS I]%0(xk-tN+$Cf!I^І]}@HQw2޳=?w^< \b匩&,SUoX!R2X9#arxӶ-B_B_Sbњ% gJJDܴTRYCRC7_B1W7n4&@;>jDZ釻FUA\Ta2<FzYX^w96 ǡ G^P- oo\]Rى2'F|fmu'кxFeɪA2{ C };{$p4;蠀FvHvݿGA@nMwBOEa-Px߽W+.b3kfjZw}4"*%NךIVzjԙY2Sj-k9nSXW D/@KSN+&C+O3\ ܀IH"|-%UT7qpAlyPv2JuA)uS9sچ2+sI[JF5&5y"4D6!'9mF)pa澮?20 tùkX-]?+KpFԑR#q?NK HDZ{&9qvlpv6gz~@6e2No[{UDTDl#8ĦX0Mf`3V<ʷ;hZ8nܴH?O?wV\%k#еTA"ҀZ-XSiCΖcX?LC$ExPP̗XP$tsR7bOIMS(.)*M.Q(N-/K-*ϳRҼ̼Ĭ"Ryr% ;3S7{0{3t;;9{8sa53%E&pE)%Xy&/gɔEQ缙UI > Zũ, 6gtQiNj|bJJ|bQQd_n3RQ|Bbr PDyeqrbNB f)> $'0갂5Of ,dtQ/&/JUHI-I)փ4ُ j&k `̴4x7OנxWť KŔ*LQЪMO(άJ/QQ@RR2ӸbI!ZxeQN0(KEigJ lUYʌҜpvZ2>"*゚? KW7VEsˮ$w' uLe P%-Jy;37;w`0X1S[Tm!ܚR `"gQ[j`I4CeAlRg5d9FUmTT$sVϐR-rT`JI,`J3},ljM+Ra,# jwVۖ7m|Ž/J-5m:lLYq+ZcQc $<w{7Y8#,W5vJ⌄ɉJhDkb~' t~2Q_7pg~>6p>G2tB ttR5K!rR<4ǠҘq6(j[Gwgc  rVL8(P.'~? `}ؿ-#/;?/[Q i^G#a3ZjL&2^Ý{|iZw =@o -_5E w݌{jK躪2GaV1f⋹Lh1f#>%*3hac'DyA_;cnoŸʼnh3Mʹeym;+]=ZoF\f)?Zly#r_:+_{#|U |>M8wE1@CnWGY)zTx˵wC3Lg8US2j71'3D+lm̜07VF!@8599?@Y,y%999I*.!.A*%y`Cc89uuRRӇZWRQU#?91NJ39DjF=Q((T$u*qqX 9&9'51h;d \98';jYx[;wC+kejEj,V(KMb*V8OlV-8 /;xKAuo(""?HԲz0̬̎IhNASנ?S~ Bs<# 9%5M4D8599? >%$ъK &*P3PDAUC ϋ/a*J,J/6R csB^~IfZ|qfUj~wQU/J-.Y.1''?Y~-B,hM/LAUSVnv 74RS3R5@Ri)h&Mţ ?/VGZ LHSS\?s O>/p ~>7ox{դ+I,BAaf&w[%xk^}r@gl|b#x[}D{"d6Q |` x]SH]E@2ʷZCpf6u5嶭E| x{E-Y2`Bno{vxOĹ d6pR.ia< I=dL4}¯LO~.gIʿr46Ǭ_Dx4Dq*Ȓq~X& apKG'%pXwd*LgHRY]_[zvxYda行eGt1dIcbNeSlty׹K$X]ّc0M t"(C)/oG>}O:gg7 z⹼ R8G!0R?ΗOp;I 8G8t&:s?뜉gλm1 nA3Α0ֿCFb_Jp*%E5ݱ% x#±%2`vuu՞ċvNu{B2≮>!i|-tׯ\2ɌdMH?$İG~bڑKƐ ӴƋkLc=Dl␉ ~fGpx#RpqWɢ- 139ȏ' v̀4x4$1azKey؟Q&-C0Z ss!lRF8);`N-dN7<?5[ +x`sJsAF!̧irɧ6xT*E <1jDX5h]HAQL$E?4=};=λO5n N:Ÿ4,6*ƈ lǨth? (l罾mc3myx=]C} ̡lR(!sWrZ5rr  dWَ*eaHMN3<_ hqq VH81hrtᑞ70= [ w{5 S^0-K|XGuXQ˓ϽYzF?"jn&E F!=S u|0Qlj^M;C{$\{IT4טAM34icuX6&l,l e̬_:e z]61#ђ}ѣx'}ЮiѼ_Y }"BS[aEJ8˛.f{bZ~%(V2J+)jn6ZΪȻ8AnBamn#ٍǼ8tK=j׼m2߲#k)m^k#^蒢u#T N⌳e&-{'vNlH((8NښWl>~%g۝nl$E1 |R|N[[8CNuTID%hmq-•#MTvwKݢZE2Ef:ZPA~-WwH0VT i7-;9-oiG塚hXX[ ]$L[Ç [( ), c}V{fTF8'ܪד%]7Zԩ0Un$Al#Qw omΩ%<Q"(Ks<51"*V/򫔍[-SRqpIHѹ0/4DH$+6)]tӈ2שҁ>Q3JD^wrSg,$|Jة:;*ijl.pLg=՞cm0]m.ʤd5n taKʂid"AREp((."(ZfL Ck j,X ZZ 9 ΄P]̓J@.[Ի? 0)w&)AK1bU~c*q%ZP%}PF.jTjWLQM_|}>VgY3{K͐jUJBU=V7yޟ´D/E2nX64|Z)Y :@:LHq-F.dTCE?]-fsjU xں[ |-u`"Wc]`XAVu`e_6ͬz7/G&fI[H3o>xH9%<_\=(tPǃޢLjQlT?F @љD< kqN5'ȫW ['ԥYjmC 2 yKpJf*g ZO,oI52 BZʼn@6,ܨ(`#GZ.!M9<,8lӊ׸ȹ2: dO1(~LF{M}GjmbFNAA;%ԕņ [ QXBtenltfjl^Vq_lSٍŵ0pQg08R͐ L.s4(3#ȣF^1'vf^B@84LlsFpkg]<{'^ETȸjRdyU{i+wNgԷ}E _Sv1F p7]Adli Z!+1FRhNVLc%+Yj ^x*ZUwOLuH[[J[}UϾAHpbq2URHNq+>E'$p u9ᛶ#VVn*HF(qu 8&G:/95e ԍ`g,#g~QEdCV-o.$ @%26Xg;˴^ e~%Qe HuI GHz[NaqID+UONmEp@:PPFJ"_#aXdP#E%C(_lAi[U 8b >P8~ xsBר^Yء ڀ5r+nDG@p0+Zc2Q?ŕ\|Na;QDO ȩ%ZdhTPkQotǨ \', W&A!( CwpvmEvxgs!@}s>񉅄 #,.'@|kex dMb^Tk[u8.ԝ98ׁp~Q=R!%$ZВ%E *Y cmn*V_:bP)!pH! ߦga+Q7 NDY>QTs*(s_kI&x_1<'E6gI,ZJv(KhXpfuB}|Eڄ\Qa.h)zMf`;-/6yWdv'=o c:GXFh_CjYA.ʝԏ`X5\g\dG}uJpo@)WخŜ o2)=l #W8QBZvFKmNnȶ%b:7W= )Uӂ&%<ǫ@¥E3+߶)n(jx:Cќ]V AX6D.E˴]y$c6*9>%onNyi07+aC޲\{9߀=oSIk4OTz0>I,m.4-%&ޓ}oywm>xkK;GcQb޴(9\.pgZ5KQGkST6$T*H>jZ#TqFړ8du TIdڅ Z0:cn5m]1& ԕMrYz UI"_O'^6[dF-ہB *$+X +)(-e?)akX\p"8WWE@/CLTº&jv?doϲ/R⨊aؙWkJm1 ԕKOAB`DW0Xk)["7,7dQ])&ղmc{rJ4\9?xeP01FrLؗR?M9,Cϸ2db QݠaB T*jW$ۺY9Ww\r"Y%( Gd$F$f L,Шl^Q ´̏. Yzؿtǧզg+i0gf:ӡ- ,`fb3Qڙ(gol,=wFP?tڿח'3uH˯+Hl4Z]]b+| !:#C{1DNx*|0x?~h& MN=U@q@^ ~qB*;y:&:kQ;{sx*-q*% E檼h 1!0!-hdp2ѠLYwxjx&:$u6s 66 !M(`87"C4n.nfȅAE]> "BC T grGZh`_ Ufъ, SÙȺ&rl>g݊{8YFx: gk1$['$x,V]vƆ5E (,TㄑF8Uoznyz ,ey!" qEDŽQ "}8rpa%~'f)U% By " G'[¼Rqk@>aj$Pj*"=HatSTp: >TL@7s(l@7ې. ^{,&]H, 6 5%uo_Fxrdmqre4;Ҡv^>4: AeZraZL<^Ax dvXMry|hKU5_tūTk)N}7z)L6RXh[9W_+zƑ}&R#Wty|GѸ 06AB V&%[ [lAccdu8wوvkׇ_R_{ wPW:,UAE&[*jۦpm\J_O=2?+'هTeŪn&xC7ZB}R0^ C ?N at`PǢ"ͣ\`Z1 gIotqۧF _j fEJgPDZ5q. " ~֩΋ #t~ڽ9 8m3[*F^+G]_W}+-_(K!?A]W-ak!}gh94=uclf(?A]W`olp(W` +]QE' 6ƔeRu$E9I6$Yf1gއ_kw  Iř ŕɉ99  %y % JļɆ8K2&pJ8ŹS+2KӋK ,IEJ}9VsekhN4/-A047rr 4xiB {ă>nڟ 6{ h}`/kYJj'Eg 5 dBEJL =䲠8 т/<ʁ)`I"? #jBAܤJfG!Gd5﹒M.u-vmwn9H&e>J Eh:BqΟ$I&aO: L$bRb-=Jn ?:MO`,Nhۇ&Oq6I ~LE5-DWtS9z!S 9H]S R2' m߉J(]r0 d3pS}}9opX3K c=5UWƳ?_=qP~GtREA{ aq};^SZEb0_%,, !stnDisIq!ț_ٸAxpfR7 Fu.ԈT42̜ZRI߲}ULpwPgH%v VH뎫&uo? ]&)$.mhtyVS4|inV79~VU19 ުzr(&z! ' &6TTv'ƒBHxxϳa6+{bQfq~\J xr#fST3sº᜘yʖ4e[jIzY#Iݷ&*d L_wOۇa5ӷuOϫ8>\ui_|OUFnb96W_vS+%P/PnzZ]߆p?Ҵ]hl~};[-LujYW%<la%;̖ +Szq:Q|{ffL\Z<[i2@.lSX^p}_W onλobœ 9 ^twoy v,kx^_(kЗ7YqXI 3&<[e߼i}w^Ͼ⾧}ӏׇy\/?ӇϏOoԮoWy w|3-n-y,4KF<-LpL/:=|cwJc%>web]^n<~ȱbUR%Vjszm~Wǿ&e{Rޠin"p:|ٞ]F \\b WL6NDȩq) L y%>G(JݑB3ƟdG53 ̘ ~i3mʺz%q?&77T$sRؕغ2,# ?gׯc<ԡ?5,妆ɋ'0-*#@s8׀*a]끕FQ񿾺VM6huUOJu?=o: m#mTn?1:m+&[+Kfr4Ak uX< tb}w)6:Feڡ. ^d O}Zȑ%KƈF$%/:l =NckԱa.yb K0T2E`ڌ˛y5EMzDPӞiEmWV] gPf<}߶ =#:Bu/OIXNO/8?0+6w%#O`]2gټ+hB^oD_VtO<+q`q1x+'gߊ9z*lT3-keU r |KaZ5\B<]2 py:@5 .(^JђA#ka큧<+}(z9\ pB) 99HD4*%+lo׏QXj^cV^$2LvoȌZqҔslUyK0hI冧3Lw2:2/**dcC^~UϿ+'#%z['PfPeu\)ŧFϢz-+pxC4>V/P zUx"w8^//v?DtKO_u*K{Wwh;9jC)0ߎi0#gD󺪂pP@贀yjsA\e+OaA7Ȏӭkg Y쏖*|9}AՠW\m @hsVB85UwR1U>w3U,,V @vLjX 2@cɸ̈%.kA;:bIJ.SN֎̫tBHgpkSy{y,q=H 3}>r{a]i6YFiV??K8/CBKͫ UtaXo elS%؈]&@0o<ǧAz DU3`XÅ$-vR@? 4իޝ03LA<%x_,I>?묪C' ]!U quaݳ~OR@$:n1U'*iI)f-Ybc{Q߁nȎ`>p]k9իT%o/[ŁJG#?c%v=Y~|Y+MO68 4%ͯW75{ ZRbQQ)(++8*++chFQZwo`3R WN,7a ͒ZGȔNɗn6V{C'Ema6Pɷny}زaA:TGap[POqG)S*xJva2 4:q"U7' ZQw9Π'J,'#uX(lۡrAk OY_\[U1\]C'Aݗ#ק2YϱRQ:() -4 ^G$ZNOGVD 1.-^yl쇢̼<19й)yIGءJTM&Fȷ W"UjR0x8Xf[1y>~9.}1/j$Cx>t2bԃL<.@F J@|yau*?P=yQd=Su#=kHaxɢ}8 blW5ҝ^xZ1K۸Ts] F^ui9FY^06y+xit}{{Cj |1ri#(8HY /x5h#ʩ\\p`0A7*bEHyC[bZNШ*|IH{Ni0't1L#4*yÕGR6Qb 1zyT oi )|NP%J$CmJx-}Iλ|Y Qk5l}4\-a Xѓo<]b͙kP m =eF|#̘* CW85 _2[pno5#JW ,"9J~xC)4~n*<:6(}KLېJ|=\NkN+ڀWr=X^N,Q!#X{.{!dN=Z_wNƺf/1ܕ$qI8Hvշ()YFeI9޲ ٕb%eRV@Cfh᪈cdPv=q:L[ރ_ Nx0:t+UY@S b@2@b)\2$ ֫šx9hy6|{|HS06o|IN+rJ=R;T <<ʁ݈Ё7z {3߱xW%eB:VYwO7m D/X9,uCT!d%zwt薙<{@`nTCHxP-x;%oJvtke:_;X$T>8+F'}?v ~vP&x33JX-R7I@")qHxǐY> 9vg;ԲYE_Cp}0L[p:F[ea0l8LEmKEx'Gc\%f0)Qt cƝ#@]mRq!W;]g?U?ᐚuՙ+ҋ5Ճ,'TFП*"OnUۈHF)7 N^@&><-qzuc'1_E6HXE" wz( &H-|G^q=F} (r2@v0\kMau N}ͅ B7bp̩xJ(LpLNODVY{q,.>c,Yŷ*an],:Zn ^&&ģ}YO`~P\9JӞx %!`TU0~^HfGYMH1lr\eG 2ERK2 <,ʀ DfLGnjH5o%RlcTU5<>z{MYCîU^oQǴU}:nQh[-?+irZQ&b͌/8Y/?PJEw+8䧻8N?VM*nEEPBdx"3JX] zyPбaTp?ݿDґo+[ڎ&[=tcf krraȩ"L(Bc]]$!qصkp^6'IN 0WGiUmGJg, =h:rfh x N^hL|No' ,cC ptxm.(􂫜H1?wSojnުu{kԸ81MNV5_r<A/z\(gFum 2WÉֻ9>nY͟GGkV+CD//^7Oشu;_]COϽ-V kV؝_~M O%y?#ƉUU㖙?iAYaw޼6u|+m$ٯyz#tWaeo4n8jg"`O 0QkkWV3tPbn'>nrћ;G][ z=ey|q촷(/z^+DJm䤚ӂ qR+*pRko*c7'DXj˘p֪VTiADP*LgǃNg j" 'WOR)aU?,-B;Az~>MilW֞IDYLmY~w:M>or`fsm J$m>z{\-'|N9&#z ;JbJ֪yҾf_˅I,w#$ /c$dm+h{{Bo|OHY\=k' FvL)-_kbM1cJ؝[ *],Kt@x\sJę483ί'fFs9"  )Tm9(:QƍSS4Il jWk@/ @vLtwcuyՑw#rȎpN Ꮖ=NO\aS?F t8z?'# xQPeD.!ꏧoA_U>sng=(ĝ]5*A\ %}3Y0?GZ1A e{ǎӆQZ.l'徴Ê3>R@dd7>*gXgdhM@!@Zyc!3eVYfA0vʿOІϹ~wI+ff=M<(&H(._x.S j|m=6xaQck}ZnIQD2 L]FS%}}b^Fվ%Yz!Ŕ*Z5svJl♡r2i_v#nj:hz~|7ulNx "ܡȎ+6G*&zaGN<tʀmT]TpHu0,°@;Rȋ7K8^MS|pA&h _bX -zjv˥E dv2dS{*퇪W۫ە}tt]"' H8~xAsMOo#\_l?bѤAǛPS'SV?N~%sRhv\ӳ%D=~R`e!ŀ-Tgu X\Aqݲ^ǐ>xsqdp^>@dY$fÚB~Ԯ&ո|ocگ4Z:aq { FSa?J8i?[grՁ<oPo!Lr!&_j ,b 8/MQhi"QCsjǨKO M웃_]s ЕNn7 > cu#g;Fh rfKDV#JɎ_Zw?ؗB!Sk]ϸcLk$7mVnL bX'J(PLL^Z%j<Yex1 uXfo,> +'%CyL |NTk[w0c^%:Fd>|n87\N/؎;䐓~Bn>WW$胀Z9p3Q7E嘶 Ҥr/MNdhęPI^`z54^+{?O^hW$-soב_?V_bғo#z눳UGA.܆@T)fխ̚B/q3H(;LL?U.7.J(~|%]3ZX$Rj{kG͌(("[dlkn":7Č9U׵97 # ';^u1GSz 'vR/jNk6 IkIO͉sn%7 xBFnMPb΀|%+nLBH9> e[) Bw"[*k}vSRpsOfG]B#jn61=i)!Oꅎ!vbd'ä#ʄ $: .'6ˌmlz7>\:>О`Kd6ÞLtҪi%8}]:n3Krm$S%cAz hD $ L^s]wo١lڏK:?B&"OfLϞ`XHߨ?"(JxZrRq3]sihbQ xr[|"Ko%D 3L S%Ga>oS`lf\WB SK(¥n!KW &FI$*&3V\Rf> l.j"\~6H{=}5~.#ƿ ʖIPL%Sd@8ӥ#]jdI5O68w hqB hgaOB /NG̏|5ir þD鋓l{@2h &@,NSSCmkJ2}?6Kf W/Gq1DFw[|f'Ζ*J;l {m@2Ӯm3_ؿ>ceeD|oQ4qc[][S=0e|Ww:&#=}~H(r~D&TV7>Tֆ=;B7hRU䢴۞ۭO Q' 'jY#`A{kA\xKLG\Q2mxWFĜ2S=s=##]3]C͍\7pqO^ws1ofU 2L6GސUxq7FĜ2S= =ݢdS##].ɩʼn%F:&ƖVs0YZxTMo0 =׿k/iФ]Z[S͊t9c ;LlI,>Ju E>ߏSY019Wէ,a^J$)6"/1>Ng2xk0-R7]|cu ALo1hRZnd`kqWUFK&\6n9#3H!NfBFD:6K0,nvCfx1`o"zv*mgwbfFXм;P{xՁ:[ 7ꟳ U><=/WI9Zp \ BL"lj[ )'y _ s`/-»CddH ^ZY&L]W!HV8dG/,(uaHMVuԘRlrS1#́%LO Jmd뜏6 uk1o<sotKgfjǤ }<]$ݬ4y2NewG QL$;tܽ)aЪr_\+I!{<5pA2s<8\񚵚5Fyfp}LYY.֘d6b{q}u@MטNn3\%zoo>s%BX4=|ݦJilF3 j>-dT*)ᬣel`Q/ V Wݣ[{N`PJL( À( 3m&#fx* %ePp\"o,$0C \ԁ2g<Ng':EJT|ͤ8yOHx J;x CN0w'NI0z{ s8,H2.NZeH@VH-D1Mw\L(9/D`k x R:&v\׍Jϛ0wr2yBce#;R$lLʾxŋG9yL,ڮEhki aDz#[؁h#~VLJZ>5S*tJpU4\K.^~1M7.wi-hXa$bwr>.W 0Z+DK*B CP|ʼd0mQ4 4zA8YLD߱7:EaQK80v{jaEN"l*կj|yY.us_{9Թ3/s4+.`#b3ҝڽfYYJSظ[ưh,iq=+tZ/VQ8_P9?{yN3]Ue֛:?\T/wOafܫlҋ;DxZYsJ~_Te /MfsDN@NyQɢiIwzA bܩɃ|gIwp*Nu?0Z o6OX=f//^bC>aa(ONr2״&Pa'-J|-fy~.OϽރpĊTpp,/*L 'yq"4KLCěb_Bǧ 9M1 쉋 }X1﹬<9sH,7~Xɍ7HsnB$ ~մ| IbF`"+,=g1~jSg7&r=[%CX"-"spdE׻XY(MgܳF#vNpYg @l 7rn'l§^ GamOD-4l~T8\Zi#9-\3y43Ѵp y X;48pr%6 k _1إC/ȄljH_(=WaK.DF3i"1\ kM S{[Rĉd>cj3bݏڭn3ضzߺV^x J\,y4+l#+3x~8;`n؇-~Lؑ%q]j &S!D<`0KpD \9wTK_ Uj̈X DiH0'EI\Bދ_系X5i! `4Kأ {NN!&ۜӚ0+ 43{z> )$L#&msL("`!Fj^"Mҋ::DhDz57Bor\Z"^c\5Z(N+;Sa ߯hv9ׁVIED_% 92LJIׁZ@倊ٰ8jB ~:l)9k J,Ĉ5haN Zq FہB?՛mCRz0ho}ܵ6 ~EϛQ$_{<¢p5$r f!k/Ư84efxRўo ,&;ttL Uh4ńp&lP',d3Ha7*t`s/e rP"H";l <%/~ 26!j܏aHm;#ڄr[:0Z4Uj5ص4k87ſc%~Q;ٖkv8m[TP^ an(J^Vvoﷹl^AmGܹ!\mE>JlUرD?$/kTym~WOrrL ΕMV B&P?+XbzeW,)䝥࿮%T+]JwAj,>WBa%|@Vx8eh43C{.Oܚ oG!1#sَ\uu%`tko QWkPOe 2͢wPH.HqP M;Eܞ/PSwB=`&kʥS{ut鎭aS+%ʡNUZFtTMgd?!@Ph?d}S{Z&j&.3ٶPBcʺ"+Z0irVǾ}MQI3WWb7`/Qo_HnH&bЦ`g 9n~Ugp Jx -B5ws[sĝuɦճoRhdKaϹMd1=:D`/Uc(!%s: 2RR$ @bʢ~j˄nƚɓtÀgMD5e ):s5̝[ˮV}Nޛ PBo$j.bdz!hcnVTFVSl7zC3%t>!fS,FL.uDKOBF6 M4qP}`o#| Τ ɃN8 0KY:'-;J(,zlQSKԖ\tuKDٝ%OdRaHh^c8 V.PdaTy@vs΄apF)l kYd5t@ݘHFOv+{Q2Z~- pY8RH CCfs%۵vQ̣, 9*{ ~A&G'*8&;DM&/UݎZ# Шk"wiT?cܠ1 6)oO$H`"4A!svz'wd$rLNr0"ǸZv1FGѶTCZw .^҈^2L 7,ȼNTr߉{tLɠ/Fo% 4vr"M%87#.&ܔkA_%x?w4`oBJg{Pl7F/ͥvohCiFPjQu}߾a,M OUl])$$A_Z-Jd4u䐝D hMdg٬BV lYv!s8Nle WΦ ^OuY0tey!2']m C WD$ew^F*nd| مJ#D*Q\啼-;<+͋12w6q!W$Qx 51''|[J`VNfq>rJjZf^BpdO<oΒŢfxĻ9:rqk)$%gd&*M(ŚS0YA%dL%*0)[{xkAI5W@b$jmk/e26̶"x?D!CA_ţgݴq1B!d}}3dOc4;bf t&ZWP="$5:MGߋ}f\E0mLi>|\4kut^zUXTI'2,Lnj-<&}gk}}ޢRmڰE`ԝРBʊ/P$ǣ]hb% N9eBG|S!OJHL\jLN}FJf;%8B]+[0 1C>_JhIt"%!j/m74pZAa$1d11ȐK2[ZF-"YtD4j@ rEe-#ɂ*^*0SҪ$<#‡Np Tj+% Ua/I$Wz,!lMs*VR$FMY]o[~~Ѕ%#٣֗KL^ *N/F&L$K΋h9|7OܻූoLtTT3VDK$JwQ@;֖l:ˍaYĪ>kee?ڟv_w.Ow5x{(qC6qCx{8#cCdu6 Kŧ%gle\,%1y2Tjt]nY0-4yT5l#Y[.v`~2–ڬj"TS]gz/sI)bEdXO2tA0A}^By>1Ѹ$AVb\ {#*CRa>mu3`עkbu^.E`WeLd YʮO%*i+VIpݐI1<=&no)7Ͷ^@즆A3~o Y;ta9ȧE ?d.dݭlC@4" ^s$%pK^J{II䞷e{F8W255¬_S#%Y0VX8:"9ІrvE" $[)=Jc.u??We!hXN3SOŲO Αt ٸFFWᄃnL' bq Ke4TZ'Bjt o{ Fޟ2 QVTLFnvFu{aGWݰj0('`Dh8wZ"0PtBev=Ze2Kh.%ZKb?ןcL34p=TJvsrٚeK= $R"h|?;M#~BnKE ĺHլ45le(F(ٹ0nOƝv{p;"(l%aJ[޶?;g>5Ť`Vh`Mjto8I.M!3H4P{j!?DzYL5H)Y}]○:e'쎃oe㐸 DBf j<Gv8bS\ IcDLĭW^5lrQjüTmx<̗,w))T+bT;%4_;a$@Mm@ N;I+kuO4ݬ{;!AE1z媈.iGh3_h 5"[Vf2xos qPUGn8yX&\| @*1ۅjp +'';t3> !67Ѩ?)HSm4x aQ`oL\z"A7yOQ ,e4El ë]Zsv7ݿۖ JL۸^ #%^9È6D@򧌱l%}-Z=bFEOF_gPvb4ݾQb sKeIaE{A|Zͯzl2Q󪂡*8Z zm 3*pRh^d^8XpN??UF02<5֡8uB^^2fh0F'q{C?r$j:s&@1ި(-ȱE0b0¬&_zڣ"<Ȉ% U%zWm*JD]4uYq[ǽk(agwݳk9`b,_lj!=A^Fۮ^XuuonViz}5֞i&fv'Q8߄|sc#&5C b.ZT?2-([͋fRL4zxujAǩkwB-&EHk n%IEl2f2/މ +| M؝=?9n2ڥž8/^Pnh ԜDB[[0 [U(RZݮ;eрFn;dR?CNxVmnK߼`GQhX岳֭;Frʂr,@Xv,.F ?̜dǶ@ElESǥM9?Q83h )4 6*Fܬ:5TxF^~O TBrqI7Ә$0-Fry{AM(@y{%;SĴK<>0 k5: tI)3WF)+#צ{Mϻ\l+8|Y4 C}ll 4'员|.d99o-/'AEA(PD}$>-EԴ̼<.-"ԢԜb=d >#vvdь$xn@"6$A84m惖C{ rȒDq>2y!Wn`Hy^kW`ˎraO;3m^smYhZ%VVv]C70+*c̽a).>"b|YA`xzLK&MqC!ˆ x4 8T^7W,f꙼`'t{=cslg1]ְnXd' $ytR<̯f&7k99XZaPFB8pqn\R7_BVV1 \F0iBZxQS;WJs§4Y hi` c)K|fhs緞]&B* /a S$~xTz׿LdkBIjfbQEZT'*R&'D_-Y"U/♡1u258W(i,x z35A[W':/i`b7C`zvM0P"zXѰqazoL ׶vims6;-տff1B6uE%9™NjYY&H)YcB+& N(">9{H ]Zfg7yǢڌJ&MfduڋFsg<DoھC<@D#9X z0#|+v;.{*_R|w-ٝar$ţQ).fg웄pU7J.rFqc QK~\.G3fbHT&DuzIW(`>do=+žxbw8\~Sn-4o4\Jݨhy+Sn:DX0kUlTp)s W2 5|&$sc }B;SqWr$Kɉ!bߔpLE$u?ښR7/vxkIɲ[ZzѪyK 1ap,ل'dh =Щ3|-b o,2L뭭\^RtPJa+" $oD4FDhz˥~DϿQ[ގ>&Xp@XLaQъtW>3 C;%\R^1e1xhsqd=3:!oٱL .坚|@Ui}ڿ}I"2g40ENԬ[2r=Qd&0] $VbTor۱ޞʕFq!D%ƒAi7pfҁ̡#%{5">TQX(0٬(n#1YD4j#LBJWC{~zpYRSD] \F`PМ "QK5B_41-"P\ԡ[TVoV6v!ߟ\^7c Dw<ɲ8cj9&@6~&qEFHi1a=;m)BF¥u|S-\O}["Q^ ݽ9Uh* bX,ԉ-{,s!l  8˘ O>>0 PpmVYRklQ3L<{Y,4r@jA\~@L {J/V88&AauDe2$ esDLA9Orњ±ǖnc+yqb`\oFUޗ |f0QI.]',3 O*E og|Ѡ`VNNd\Bޓ|XɁk9j'L)0p٠9k^.B "1l"?<ȶ2lY߇Fh)Fj9'lєpHeO]}b˵ i~)0ƨC{mX`GL:ȗSHjc shdI`IU]5p~h~?W b2(Ëv8abR?zXWNd{# *k?8ZծgHs1.l'J \}@4iZa00!Ќ)y֘>!2v)̡V1IZWۙ^t0iށtCGWecV8j:%;稲  x0DTn' 0QBcD4Xo v"z>)R.IoG;s=ۢd|"80{]W*H OP$p?قB|p^cncYn٪cO7 \6F:2N]rOoM/S8m2k5[moɸ^q1NiWzXsfB`dk}3{xFiGX daXl>KS+o m~jBMފo:M[,ƄԞk0SR>UkIG@;BT8/([K+'('g lHV:̙fh㥣2\dΤ?+ә0 #EVB"giUq_'myg݈En Қ1 Lg7ح#7 KtL@Ñ,@Ǿb>5VQtCˠ-wHöi4͙T%u&,cb %}?4"0-%=!'q]&ApL ? !@I]"]sS@^`M{,=]LI=/ad*iC–bPqMOMPܹv?]Bk8&}iʆ auό3t"j\gEHF MߕP(3uGtwb(ie-䪑J@'U &`:*`yurR7 R }X G(ZXV}ZjO/'LQ"_` oUԵ "m6+Ϳ 8LS:&TXiT$o 5O(tKɷ.9'B_װq+?3ߔWmԵ5}. +DRGFd0v%Uٲw'6_|4U"I$" τ][Y! )`hVH]Л݅ʽsd.x}Լ@/f- o,sh5g{/4g\2"v4`_ K;kcr)(!&vAΙ8!Ch`8=Y[V3J =Qs;OD;pzw/|~X@:rNc}d}N=E|'v#~G8+ k&&8B}Wѥ-@2@i NpG*pDc aR)?Ͷ=_MhɈ󮍝)WnwEfUo1<{@9+n ?0yl|7w==.Z`h^m_I>o\09X(ޓs,jzp2. ~zJh$MEa{CeHUq+DF[4@S vA9"F8P@zDtiK}JS/H@W0Їţ͕^~%g6jqw D&]K~{I1D<+n**Eq9vBjZ!ޅaun5#|yK.ޓuC23#nSez'خr5K}|]VeN $ yKll}e Cyx{4Tyǫ)1;JjØQqW70ZMJaboɒGQLXzuE)j9=l}9~kt716673C  d͍ K\V1R͆*}W9@h~0KvHS1)t::)#M,yq}s~Aց͇fϜ.1mJ|',9) iyr,Lƛ0$0 KsT5*1C4s Vf:#~;pO;`Ar]zY"8e5MޜCJ_3_!9ןxXѻ Z@bEFvFh !" zMd y8-% ]TR?V̞4||(L4<|뫍T#[JXMKgE6x}s6e<mS:lUe&fORj'kYh NK,qڐ2p{o9hFX\0x|Ikfs<-:@aGM{vÊ֫kF\k=]|8n xtjՌL:Z {]-6ֆY^8Liv6c JSd5T : 䀬ݐׇ{)O)FUi* ޹nF D}sǶF7'\-pնM, @@D&fФ;\,g Q+,< _1jMMD95 A>CN;e#T)K4͊d =T$Ss~͊*'GEJ]*q^bfS-/5a:wseY[s?[&eZ ݳ Y~UfXS/cIHTmS %Ӎ f? 팉s[Kh^o5&Ԑh6hJuKj\ѥyҶPMPۻ=]V>aUOa!79]kv)i.!!d3saE^z"{"> 1.'ʝ S'BtYƷ& yM߬'V-7Eq?٫4JQe3EI11v]^Fٱ):~q^V( CQ#MG S/Vk_G[*J#<uUAH22be-n%zFGĢ5.Uca;U EKhVPP&0S1q$Ӧ:Ht>Kw)Ed?Pn&\ ӎ4{Bl)`H(!hl܈:z䠑5܈ U&)lDM?KEg8kٱ<Њ2heyJAݼVrc%iK^JH{L@$䐙CiE^AQO$Kqq6ѶgQq5teܳ-QO!ogͭ>M&z]81۷hp)\b> ı88xse!Ssݤdݢd. &x{sSQS ݜ̲Tݒʼ̴J.r JxToF)#Uꇐu BZ쵽Ҳk!\{{gmHzm"T$av͛o]]9p!M-a6 Jlܖ eyP,/ t>H ܖ[)MѴ HïL! ,Haj+8zFT0 LQ ZffOAVʹQlS iO*ʔeg,T%RwQ[ 2UI=8[„jpXTT"BS ڢ6 ws, $#G.7y%5D!K$2sP4*Vj=ΗQ-l +?Y`1 tG(-9Cd$0t }<Gk=( a ?` p}6/uG RjJ#IBAv,l $hwo"ƞWY2xmaLyn.Ty7ۘG&^XL[ay^sL/g%Lk6歝gەa88L&:6 *OسǠ w8-`IbMDiک ]?Gt('d_cY+FZ/gF2fHp9GgN+K {)Dyۃy pȃ00F+NЈqȯjG|b#ΐ!3_FqWQS)|:hxQ1IӘ>׻;\b\{j~~~Gx? R߀ LYވ̣ĹU洋q\ywzf.%|Æ% N6> RSPGG ~0<  x[(s5FsLly%)S%KJKJK2s J2t\E FbQz,QP)ԴLSQ0L/W/-,*>ّUlLZfNIjQPUU]wv XqR)7~33w kKýC'w0:;`c 'A 8*2%c x0UC<8>sx>UGc'Ei kQ+?viA]/cA`M΂p!8RZGr_;@|h&9fu-NHV {}_O@k5PJf\ E*oNtߴq3ks3÷ x-TR)#Z -3$(>"T9Y-\'ux1cB_biC/J x xm]k WN0rSXګA:صIm"_?Ϯm/z|jr,9 d&8#IU:`/}i7mW kܔmBm|ʦb%4j4M=@rF2ދ #s֥0V=y1iEH]'[^nְ۽~z?dEE9({=~Ptlix{i²KXut+&>LqηjxTmFlI >\wϗkND2)A+LϬ] legyƣ+`iDEcҪH.dEi!||_߸ҷR"e=xNJ0fҀ7/xhעi">@iۦ&)'_ACxV|_0Ջ`ϕ@pLgpI57IT0Q"¨չжq||,=뜃*Fhmk u[qCwZ@5C\i UTM% w%P/8md!dO#s׶s;-?v78o lݞt3⺓z!NiAsWl]́zRxA@l uAD5R"F-TBm0,,={o7ѓI*yɛy"$KS6a,eـ;GzVzj;FHNC_$xBgZA<yflĉD${/A to; mr\WR=}fw'f%U5moZx-h ruijn L)0dtsmucgSDB}fk.bYt ,^ϲ>x~{ˆVTRc @Q~ Q_׌AV՗IyQ ;gja1r&i3kj'HC_^.b7Px<.= 2慁6:d#o+k,ysқ > F{.8XpXߌ>H\71gOY6T[ Tb'NXo_+ax;+:w[x}-.-TTCTĜrd (51EG($UG!"DG!1/E$83((Lkrf^rN)XҼ⒔̝W3[sqq&TLbѐTU hWpuM+>"1Dv l9e0 KOP #uqr*((LNFrFNF \=&r)0r]E{x;wB!_biC/JX+xC .~x˳{/FL-'cwR44ԒĒ" G hVmV Eũ Ay%EEEJn9) @sJ2ЍQURT 6lN^1.ku\ZZPb!1\Lsrtq r@1 z,PcFwsO_@Ї;ĀtG@+Me+f,Vx}J@M]؍2Ҥ7BȢjP˜`)gY!> |#&+40.3oՏ+F8D$}2"\Cž!s@9 I%0痤sb&ߊ\*j8f8s',= 2 eL3y7zsF;Ða(bn6SKSwqf;ݣAԴ=_M-V4)hμ:17ͫ]( k- ԷcSb[ޒUKpGN JՍ'yOFT=l=j0a p)zcNƭ0 '颛|*GENQ?g+լbx['s93[bQzdFvqoOM. HKLI/*IOHL.ɩESX?\GA($U nb"gAU9^@B %9z%%\%@ i9%E% 3(UD*xʹsB_biC/Jا~ 1x]k0"k%ZWenumjHrjn!p9o@*^n% rjn^3dstZ[$ٓt}5mqt$MC%dvc :>xv FԞmz²3*SI3r1tHBFϙ8Qs*ݏtFb ge/ʇ8Eub7yո2ml2Tek~E8GpR}F40740}aOM{8en{窕';гJ-wAO>6g`9x[(o5FsLly%)S%KJKJK2s J2t\E FbQz,QP)ԴLSQ0L/W/-,*3ّ5(51e VeOx7OW?Ɏuy'G OaU?4נ J&kIV>H)I-Dx ]?1AN]Sex[oB!_biC/JX { Zx˳k/FLҋ5&dgќȢVXaP\YW\ Rj, /-!ZT*0ynTQjIiQ&@8 i\\ (*d襧hhr%TKRK4M-I-Z]P Q,ʖJ7xukB_biC/Jط )>x]k0_%"cLu`ڤ$%"LYVI9&yIÛ75T TPLk.4LHZ#kb\%x#}!N4p9j"ڥYkJnup:" |ʟ*.C<hS6y5=ng3EK4%U4t9$2醖 `as&#:Y~Ab,~*n;ptW2GFsUb(&.O7xkua~!&Ax(ӛI==lE'ўTb{iz_K/xx[(Yp5DS _I*'37X/ÎK93/94%U4/$er sDqIQirBiIfN|~AIf~^.|Yޞ(Y"ZH,JOQe: j \i @6 \% %֓XY=}|&;Nfg/HQ0.?Y4'5>1%(:YY@(51Xh*;;hiv QqwqPlP SBO`(x_MlN//,I%i!vk":;ozřM[!I,v~HDVc;QS^JD_EJW,S#q:$QHwjvZ`PP1,5)sϦS7ohFxsgC93sb,sY6od^pxxn0@m !UjHUӮ]i/#d4wJiI7o=l%iY *%˹T.)Uko,(~3Q݁ ֬T\\담r"\?b=[L/w-VY 1yTUkwUxe`vN2 3o+47c`Ɓy"F2Uj-M0.1W!h<)O|2bo+ Ns2qCw1d$22ZY{bu+˪-:j{_,ηiAXT7.+ѭ٦v1~/,b;4U0> o&#%i"_qgwI3xxk?'g~Aj^b 'UX9XpL`l˨dd9y> +'jf#S ,/=+[/-)@xJ@~HA/SI UbܶISi D'«/8If7;g^SǴ2y\ uq \L4!ؓK;aO+O3}ET6Qۣ; k":*+`Dڡ !eY ٓz]9pkΛ51"bzЍk&-̈́-Nj6(ʞ)aUlTbnw^Z+@O`,Cze~76 'Ia6ŧc"1'Yqpzؖ>a'}sRSkM U9/İcвgD{ DCYE) K(XC%=8x$ZǢJ{ix$~#x?/4ǡHndv x{/FLҋ5&dwReĜbԴԢԼJܤ"|T N-.Q(-I-"b1#SV*Im By:`.XaIPaF: >!: O&VgVjj5e*h*t%/}aI C\!&ѢԒҢ<4..P--KO-/(J. [e\`̜ԢҒRPdQ F.Lv5#x{{B_biC/J 6OxTQo0~.ϐYČm\GS" ň~WtSK0Mw}gp%,qe ,y)1d254"/& b;56+FjxRLH*)xNbQҊOg4~dYƩH]#4.-ZeȒV둃__j胗U" Bd"Z}Wi^"emC> E.FAoTo&oe]:j. !#RwBfq;h9B#GM8hQ!jeyl4T4Hu!VTꪟގmڄ^ZЁNLcwN; {)ћ7*T_J MJܪjJK"s5~W xɹkXut+&e38&+0kqBؖ@F;&+0iiɌL@,?L.@, d L$Α7kJ? zM Lы^ȕƈcf$g2V^TRUK:,M ҩsZmd)M݇=x jYL%R;8ۚ.)-AټFF L|[3)r\x.a@RRdVBi0ZL?yl֟, 7rJBhBw; nm4-XNt=ZL9]Ogԧl1܏3MCu~ΗAR*ܡGdR.6-K@HP0(^Y W2wen+]u]G{Ϩ N*VnȔ%ϭ\֘p6;/jHp#{>[*YE LƐVکqJC%B5ۻx8o&H:GY ʚj}b0DO,H7ʝf+KqVb{x>QV[?-qNؚe|/W(W͞{J7JPݏxokUG=Q"0L0s8-6B#_#y b+^ %5XbqT ~mJ0Vk+BqYڡBϚ |굩p7?RcgY/Ca6oaѡy>}Bu(PQKu/V{ĿwuA%+v1[]i0@"}4wۑ2>/R0Lo_z]SuJ[WZ< VEh"6CӇȀ)^#l OiˆPQsXsఞLvܬ˽k#5$VAjZXF/| Yq!o=dx8ĵ![頰y:W/s ?@cRt )qle!L=Tp(~8]Mp%8 YxUJ@A4Auz"IZPmv*tFNܨ;@Y*+2>4]̝w {c)Mp!49>Aή\fř%yŜ99E%řE%Eyhz}'od|Q040547rMtM @5x3NNS]C054ȫ1u62wx>cC'g~Aj^b 'UX9XpL^¨ə62 FvLlm Mt,M@FfƦ@:g '!HF345259|#SZ3xJ19Rge9+AB\+%dgwdL`!=𹜽BSP7goPZ+!r!DHhm܏ ei'c` H@hZGأ p\H-bc; t.8Fqcu%a*vuRfoJQ_lK.!*q3Wbd sg!g )wJQQ'ydL\VG] c> %X^Mfc xŵkB_biC/Jط jx]o WPY^5srAK̯6~`v˺U 搃<#g,<'KU%T\*UL|sFz[%كD=a_J+153ѲRd]x[r5΢bnu=Qmͧ07 GWZђ@)xie\' 2@LLM`e+]*l"%8SK`p`xhA>bБ_eFV=u G貐g#Yzڹ4C}ն\OSS#( 3ۣ|O|X."ӗB>RU4lO_ܿǸOc,q~7ψ+%Ru7KNN6m|8v$#8ࢷA\z͛:3LG)NoE|uqmt8Ɖ)/;/Zp34Nl ?8 㨎[- x6KmB!_biC/JX;[} $x6KmCd'z! \v hk9x['Kn93[bQzdFvzoOM. PV(HU(,NNQHKQ*+M+Q+MJ-* *$SJr4PWIjqBqfnANjذ4ĔҜԊ䒜J GpCUx VɿX u\*45I1cGVs$%ZT0fV3&.A3 j5FDfHfj v1ETla}c2"+L)+S0vH `\#l`LT蘡&t+(Ovh`<3 8 BZQc+ce)b 7bx$ԒҢ<4..P`PZZ_Pɕ\R: ,SZ_ZRP Q|=A x%GnB_biC/Jطb O$x#Gn|~Z'U2&WLL 9gjƀJ2bG zh\5`вQ-/ded\[uY* *!s[['> Hy2B %/Os-TMԘu ڇtz2?|BzO䌭` 70~.^lsxukB_biC/Jw z,xRJ0}N"疴s"v{V'(i4 zsc!'9ro(J^4-uu{i4L|ed]/s69pUC1ҥz GRYiȻ ~WV,hmw}^C f W Y2ap0'/ "VOEI$a#EAzXWտ1 #Q\V$- D#QbON]hЅY%p5 ZA_ĜI=w'W$x;zuŠtt+8---998&2겂&k3@YP<-Fk(Ki5^G -xPMK@ŶIHТ7/5cIBzZ",=nb؝?q Ճ0;7{|k>z^LTNy! ˑeՅ|'#8)* <"{%[&\4fؗ;r9nX(ciiS$4EHr pQP.IՕ @˄1Zr庾e\N0MP2N:]94ZrچYk׼_x#)̖h-r2pD̪Keo_/Kmˍg,Fg^S%N@W\~_OWx·oB!_biC/JX ~ @xsk/FLҋ5&dReTĜļԼܤԢb@H2-1;U$_!Lu(gMvdW6400Qp,JR: !k R'Tg,Q0+M̒J 䁦orX((O! , %9z%%\%@Q5RSZ_ZRP Q,ʖoQxukB_biC/Jw z,xRJ0}N"疤s"v{V'8.kma*nC$˽7bڪ˪2NNz =Pу Q/c`Φ4c< Oyqs]AhUOZB. yw/́9-.񪋂kHעU Ymf!C Lɋ} g/:eac6ٌ*2Kd~TE6NL0; GГ(Sţ'tabɮ?~m IK+_Kmޞ[;-&x;uŠYut+&~30&2BYYP"}F(Ki-LxWkoFŭ` ղ$kcQUY=ƣkfLVc ᕅ4YFg=sT,8> 1Ic#I 4UR)ƒLp@.D:lkpϯM6ft,;3Jgp.gkx ٝ=Tl41T-b Yş-3A@8H2%e@xX&"diCJ1Er@D0R1خW3=*SIfX}@@aK͠iY2 eh$mV(8sX(.&ڔp˒F2E,)"| vz==i -F9 Cf#)ٻx iZ]7p/Ӄ6`a(-&,QoU E&!dJeeSH s$1eP}uZ<W9:gƃ$ qGhg+cTJ.ʘ|:Ƌ AL$/VLɠaT0I%@> *T`A3mǜB*#`PkUw.ykxRcEC+Y:*uc/*N2Z҄E DͩMF1*&/F+ICQ!Z`=l95͉ Sܲg HdB2܉+^˰ \/JJR0^4/R-F|?SP- ue 96<ͿP+}oWPmnwA)XAȲNqS7߆CC~u?^>œ2X.oWn|~ޑ`׽Z}~los +wkGfz@d?dX2%CIi6DQs$DL&Y{#ҹuD/+iYq|MӻTHQY25۝}}m3 Gfnm`2]l;" 4g B~\j`e.bj x/_yk&Ԣ| D's0Gqfŗ($mgeautvv |}3dA8'd\ˣʝQh`0Ev1< <6)%攦+$V(:FĻ+hOV`w70XPà" 4u h>^\Ύ~ή>.w[N.|3 Z 6J%SK4K*t 櫁AvL'VQbDVMԒҢ<kZ. dxۯܥ/5(U$#D8599? (8D/GGAOOOS!X!199$5EAK(Yɍb[x&nr""Rxx['Xp)&%'%gh8 3%Md&Ol05(_à" 4'[L>YUx[,TpB_biC/J'| j`x;qBJbqf2BHjqBr~nnb^ nHB7 ?[5xĸqQCݤdZT_Tb L3xJ@ڄ 7Ņ$%iJ]H[T]tR#s#-yn|]"Nt`½oi\iV,9Ÿt1\ `'Yx-I]8Nʾ[ ͦF| l55B&1g;e}{ l jU[N5Y"( oXeA>;rKXTBQ#PIR4UvźRQR sYoSӒ_ Fv(j~; )lU!߀῀=v:󼂷$bqE+·<dH2(kY~gW|Go\x)x[pB!_biC/JX +Hx['093[bQzdFvzoOM. PV(HU(,NNQHKQ*+M+Q+MJ-* *$SJr4PWIjqBqfnANjذ4ĔҜԊ䒜J GpCUx VɿX'fF: : F5#(EC_`oWxIii@(`Eii`o2.o U@`vŠUZRZJa %9z%%\%@APb'A.|ZfNIjQ|~iIA)DBGr1 :L*x?B_biC/Jxu ,exTk0?\ꆌ* n9GIkeEEA:6 +K"OHӺlJuEPV%&r>N^3e)jS(:24yHM<yC%'|X=S4;O奋>pH{gݩ&@zLLM;Bv)3e<ݔ\}nc*Ppy=?Q},aClte|^0BjH-9,ᤖ NV 6ƪC#=9vgHx[uvaYv{+}ز5@(73<+8c)\v2?\۵O+]kcn{~Y̫m-r řxqj"]-&2,0 `!!֙o 38Dd#PQjIiQHph@d9VyVGɎډ%%E@%: ξn>!!A!.n>!: j@rpf)h8,\% %@v-c@4h&P7hvE[]WGgg`Mj`XLeN.AP 4e'nu:9'/@Gun+P0R笣`1 jj 8%*Vpl&P`N@v! >,$0gY #9@ ÜOHrSpn+Ʉ`2Lrcn-x+WdfF2x+Zb=d65nO_(WɌ0FMˡ<:ٞqmмyxUKoJ+N}$*nNRȫh ]A3x4V$7j@9{́90sysQX%brcjYLUYk, !]_\ReR<ɘu ^t}EkV)@!o.ڎSePo9'R{dOVLHZ*IXb2+MJDZ+pM6p C*F(IEs۬,7scPz%,uE b. 'fV6L;y+u\Y`mLO]&$d ʐT#(v**l"]m& vZ$u~(\@LںkLoQ]/E%3_DY|Gk/ӍU8s ЈzC,K L䦳؁cb.(9w\}Nc1!TvDjd֖Wxtrޏ}֙o$(iߛ|n5V|҃sc"y 㲺>n9QG5񇘗HɌ<>v0e`/}4_/iul5kS= - ?|,[/hl]4JZ4_G{~{q:ѿ+2?6'iq%SBJEb3-U4\|p- 3h*qXHaxEuO5Qh0L']$qۤ<a8}8~WF:BA׼/#rŷq\VYo`OcZ!{Cb92;WqDiezfcmx[ɽ{B!_biC/JX {8 \ Tx['pc93[bQzdFvq6oOMɗXRSK44 M/1%%4'U?\GA($U "]ZRZ2LV$3G/=$>dDrIP$DlX>-3$(>"Tť04{2sl2xcB_biC/Jwk /xQK0ǟ"}d][qENGfm mJrmޤ:%prw`@Xn j^0dgiQVH.KaD u[+E!oajRzB^ zt)q YЈ:pWWHjSWܙI V. ,a9GFYt;N;JSw!NZ pyz,,{~;Rq95pmG/樖sh8:qI8J]gKWi{Oe+gG__ʙ͏y&diޙ,hSLxuBpbiC/JKϵؙ xVmOH9N ݑ %Rڢ YWwuSl^I<>ytq^Bf)sXk1-4@p,YJi^il+ ?g0bYWMl:$b |i]1ͻVDLvjqYӎҐA39lqP3Xrmp>&}%0!3TmAN&^db2P؎Y,hJo8t%b2Za%9dϲp5ԟ\^L?O~mZ K"8¤kZ_bWП܂T?cL7?M0ڀjv[&28d2-9RqD(,Qrƹ1MlYVJ;#qhT(߅l\k񻒋%uHr`~Z7F%%$PGq2_-5WG¡?]8IMk9WѸDĜ֪S`o$7A69y%Z 0_yTI#Uj;+x=t=H͜ytQ43=_~kyQ7x/ MGh>a}yd)Ǡ`=(D,IB͍J<iׂB̖h̕U0BͷќMKE|~?] Vkp͕FȚO4 ngfZnX>Obph6`sC|y;Zɖɹaj t}87v~v=pc+)$4A© Cv [kȕ 8IRISF:*YA呈xD>76u(:/h0[JP՝ fyiBazG8,;,i x%!Xv b\KO6j|Vb9ܰOLɆ=x3gƤgX%)&LȢ?yk; xmM 09@7؂"q#xi2&7}2LOd-BPJgPJ *waT=Ǧ79x9fQR#K/ ,UZTjs7&qS/N}/vJ'Na_S-?KċzΈQ-כVES lE̱Rarr}ӭKwf#qws4g0yqJl;oˮͫ2Sm.T#I<%dwY]j}&G\c[K9 C4e`:u r|$ȩ'dDs}MewI Iy&Q%Nmyw5m 'x*7]aCkZyBbQBiqf^BBJfZZjQj^BbAAQ~brBIBIjqBZ~BIFB^bIfHWrUV%g*dgT"LǣZY\\R`iřQh'3xNq|'o`f v33\/y> PBYpm~ݧ>5xj@Icr9^ @dP CcS(7],iW6Io=}>@ +Z*7{Xvge}1鷅?nz[hMhw ha:կWNj0~ A')A2*əVmf0L| %#h75ی]B *eWHbQ++$",\dV 멳qDb>W Y`7F&hf:n[d|&q_0X2''c0_B 0E.ѧD癊,Gݳz}i"]Mە ot-rC`R]-)HI8Y$Hs 9C|a@UVTC\I`Uѝ6:O3⒆,ȑVR5$kkygQC낾Ak2qS.oҳBFZdd1;ѠIIILz3e%z $3?XHO>,oY` LO-k$'(25BMk.4 JM.N|r>>Y=}|t}#5RS&`U qwqל.?Ywrd6.3XCCR_4d-v~*D ٷi9%E@_h=\R-O'?f8m xǷo dv VGɱ,PK.8lZ(-cܾV\x˳kB_biC/JW4و-(XjGfq6GpɎ,ޞ>>: JE)J: E: : ŕz%)yzi9y`, XD*KK)I-*BS79'8U ,TsJI|qfzQjIiQ&@8 i\\ O(*d襧hhr%TKRK4m,I-"TťXjc^IbBAeIF~d]fOvxukC3̒>>+pdE5(ϛE *d9 Ax_k0şOe{Hl"c|X(mmJrY?"Lp$!up.Fı**E1RkP7O8pc'jL37-RH|_Ji1"8Y kȔw^B?rBZb[ym*4e"Fu%/Bcghޘ繛Uj׉$p0u8#FƋDM. Ot={hڎ(:2(z<k k·mz+c߁aa}P2RUfKzC~9OXbBl P@XpztY՛~+D?V_lyؤđhV.de攤 JK4Q:a^ iY[dNjbq?Nrx{B!_biC/JX[ < R sx['ps/FLlEŚVY=}|&˲K8hhjr)A^bJJ|bQr#P0SB+*IpQP*)HNQҜMF">"1$]z#oQjIiQB~[ҒԒ M `Ijq؁\`̜ԢҒRPcQCz7x;ysB_biC/Jg xuAK0ɯE.wq񢸊e6@҄d*ߛeAe޼d)]H:RJƏpb#և9=0SX6m{>M~@^lNIsM|rWj}lXDz> 3N#a} m Jx[(po3[i^fqI'e&+L;M# 5OSG`#d61 H0]($M4$3LgKT(JVU(-̉OIkPOI-+Qj| j.x;woB!_biC/JX{ @ x˳wB_biC/JW4yOq>>: J%%J\ @_T M/__zsK&-/,I)=y:m,jqL"% %ec,Ī*)ˁ@iIfL%J)ey99JOsfhLe+.ykGx[ɻw9gY2x[{wtVĜX6Ogfc i xm 0).tAu+"RGM/m iBrM;?A.84x A Fy=2}{[]{zis.w8P#bl?$||Z}xGtR7shIg Eإ S5UU'e&kJn n &oUE "AsSқ'UVZC"83lX]9G45|T+.3#hRnb˶HcѨvt;rۿ{[yӽEL)\+ ]יUsF,ajfcFvg ꒐d bÃ@g O̖'{mx?=_biC/Ju xuJ@ơ=x(mhAHB"=?K&d!nl1'"GADw/2 oKBhp$"1r-8):r:$tX d3K"U |2bK BM# ۷px6*]]n6~BNXܛ @7:Ҕ eިI8us[% |YɲƊie Ccd K0 l1T ϋ kNַy \\Yڍ:ik6zk^zb_+(Bh[.II$BL7xAH4Ҭ^9bDrfw%h֝i<>=x|H sw;]dBj0#FU=f~DכqgF>Q#r3C4ѪV_5폽ZAW}q 31qx):/4ǡHn]ϬW`P[X__\R:ّKv.XebJ DT 3\:73k"c#u$u$u,(Nk2"Q.SACx$䤂t#X|"8#5RS4u u899&e qwqG% U^Y?4,}AAX %@S)E%řE%EypU *m"x}&ad}Vs֢|qo~> A (txJ@іG/K` RK`ĨEoaii0DS$>n ue˵U{Cdѩ NSbj ->k[ŹZ5p<ٛߟK㎱yr|Ԛgy dpJ?x/*j*R;̞^@anlQ䇉3#HR3wa_E! wYW0@ >`l2 gFN䥒Li鸰){Y lcAts#.4,.?Dx;gtsً2L6w`vN/xK0ǟӿ"E*"V_)XnҦ$WuI!r}?I0J-  Z+u -qI7@. ׺Yď1O8+, ? ^,kSpZ^{0(m:\uZN쬴 c5{XJ9OSflW$അ 5X)ɶbd̡*,r,^EġӍQngȻ>(@+;J?/Bi,wwàJHԛoa?a_ Ted[o˷>2xuBpbiC/JKϵ؝  x[(Cdv6y̒TMC.NNNɛX l z6%Fw=xB!_biC/JX[ YxgB_biC/Jwyr~X&?aQ3pQPJ,O//-PR4ĔҜTͪcxgk6*1X3x{3w{ĜY6gi` l xm? 0StѡթX\*JlBrQM*=<5  :G< lPfݢJ#~b;f 5pF5̎e+1Ppà2X~2Y*7#J|Т]6{Z')P_EB_&x;xqBpbiC/JKϵ <(x;xqZfωk8 9}|ùZx[({3[qIJNfh⒢Ғ̜b ]<(=gQ-D2=(X$t@ 5834*m 489KKK'˱ʳx{Lvdd54Q0U^PSS} 54(iNvd;9Mx2 P1HAFF**\*6X "1$R?\G@&d6Qp  j(ō4 hD#4&ACm*J-)-SHyMV$3G/=$>DC+(XZ\;X>-3$(>"T9{`RdCx5kB_biC/Jz FxN0h^̬c$hhKR-֥e9Y_O@%%g4TʔPQ .ϰ2yv:|ċHD+r }uF+Pd $h`uaX%oHF;vK.΋+ZH3  0]K3iوlm=0dr3N]R6# Ns9X0޿cHKV^K0 ߿NVwY@EC'q~L.g-BE6oIuVK:,$;UЭK-B/VZUZ]+{dETI2o5KbQy~;PA ox{cBpbiC/JKϵy. J)x{̹CG؈@w!9+3م9dea\:Yr2GbNL/T. Mx/Qqk&Ԣ| D7s0g2OH|CyLɵ<ܙi E ;Yd'ȣMXlBYbNijBRje~^cDkPdv7| 5 *Ҁ@SG&cQŻ U0FxOK@AEmHϲmW%ըeŦu[b-)qLM2qf^ěga>~ / ~'UL2/j,ٗfoS֞ WHx[*|_dBVĢ,a` y++ f&xJ@.FCt`R .ĈFwaH&\8sbU@w_M+jZ/ `lpc+f9hBYy$U=E LP.8mJ| rsuM@x{gQfĢd~`   1xJ1O1KY(EꕸVe6n9,IV;,EP~adh^ZA1ĸƀɀ]X7{t/MÅ| o\J-:aN ZU% *٤ IБ/$m v) (kP [ &5﵈222fw*$Ȏ9bg95cާuMYEe[D_SngțaDJq=ex'b6V`[a͏> EyE8im\:x[λBtFBPjGbMAn~~QCQjJFb^r~ciIF~B@bi/Hʍi̬>>2kL^ª㣣`h``0"dA6Y%LpI0%aK% &CC2F8ep' qRyukq^,x[!JtB!_biC/JX| r/7x['w/FLlEŚVUSRJsRS+Kr*5=}|t t5k&Ä(ZLIČd(:bA%ꨇk14$C#ҵc=1zIT-dD+PE%Ey i\\t`PZZ_Pɕ\R,I-.'d.|ZfNIjQ|~iIA)DBGr1 @םXx[»wB_biC/J'| c#xMK0ɯEe/Kfbڔd"zzq" /LD4ՕVVG01N"Zo_qoE.!aYV %44z5F~ (]lz|_KBrSdP*T OHC\JZ&7A{T[% ΘYɋƷGSQc8494xm1|R%d%Tcm7@xɲeBpbiC/JKϵعH )xre։[siqgd #R`H\B{`EwRerVm²{q:RxuD0)6ڀWW6N ϥy#lIBކӳsHsp]Zu UDK2_R-3b.Habz) 9:+DdX ޳E#2.7Fzv̈+k)E RW/u*7XʫTZX'LiI0V3I{_ E(aXS.$Vs6VQ(z_Y n5wptg) r]!9Tjp~7YkK$ϗW(Yd SnO G | p>fp;I i̇E%0]$l4x6uG RᰣO[bcl+e\m=jk OƚgY@n@is^ou3dao /|8Jw󛣐WآbGfj UH f23'G;h𫠅tEfAWV/Fhw@` h?L8' ڈby ʴӀZsN gt('u\0_ d4=yġeeD ;pDӭ|ԛOgƦ)<|xFÁ3 v=ͥ'&2? /bu?x d< MhfhʻA /kjiQEB3%:7 `p;RxT]sF|ׯ_ eD8\̙ JrZծjwߧWz8(3vøqvz@uK2 jZȽ%SmMaE5<(= !x3%ѓrV  =E94chD[Sͯ#'i;roYR GX8URZυ1JHuW-#u23? jMCy+gRe28Fglɗ Glt`t_eB v_X^~X8̕P IksE3ۄvYod3(M fp=?JhF]d|zo:Mr6A/:G38dm<<|1߾ͷ͆f&b%Y61!Lw3c 9TTzR}B]tz=9iȁ~<>qbѹOREDlQ o׺oKE]y!2FTT }DmZ fR!`bzre 0a_,#6d6<ҠK`,aMOj*jIq1 0ۋ-y?kQ*$Ҭ2Z[}Sk͈2'k3ӱrt܄5%bmOj2$4Ub< Z\0 쯯bsF~X,#5kDeFYfWrjL5h-d:Db2srb ՘AqOs 4D;=PK#!j:}YB]GsሃG-툳j-'{'$q tMFFc I RJ*3ab`m8ނaQ:Żl4{w8|d"CZQkԟ M|䑾epn_$ #kIJ8UK66rJ@ϠwXV*nJ/r*j- *dx[ͷoB!_biC/JX }' ^x['0k/FLlEŚVM445 M/1%%>(9CD(UX)&gR*,,(VҜMF<>"1$RGG&;ّEMN`rf ȒԒҢ<4.. lJK2sSK J44K*%%`'r2sJRKK J!: @gKD8=x5kB_biC/J{ ƹ xQK0_q/T:;D,{aNGfm!mBr#vD|XE.$`EU^vj;T=09}hE8!eI[QGսRFQ/}J2KxNc0}4G-pv=_d 4UKvajX$H*H$'[aD!&VZ{~sMX0B6SO!YZdEH 66\Z3LNw>f[x7. 4jTk xdǼa2{60x|yBpbiC/JKϵi< @Cx[(05FsLly%)S%KJKJK2s J2t\E FbQz,QP)ԴLSQ0L/W/-,*3ّT1(9#(57,U#BG!7 1#13u#dv^iĔtef@5}73)m:ҜTl\٩%: Rqs%&'țTSQZ_Sa̜Ԣx`hC_G1D vpcu+x?B!_biC/JX+y 9$x?,jf&>Y73!~x['k/FLlEŚVY=}|&˲Kkhjr)A^bJJ|bQr#P0S#of[U4'U?\GA8?9;D "_EAr~^^j2LɩMp+((-I/S +)J-)-SHBiIf^zjI|~A&WrIP$D\`̜ԢҒRPcoQx[kB_biC/J7}< $x[ukus9 LrR4'Hm~ Gx]O0_фـ.lF#~dxtDM{P0g mZzbR bQ:ȩgϥjtf>Ǔ-!a٩*0אd5fR vl0jM*mUlZ=L^R`{x ,}c/ Jmw SSH)W 9x;HYv"owEt8:[6b'f; "q!@!!}m׻_z7YmѡBVks?crVc"_o~/Hu^%ämI"Kxɱs38&Ɇ&?`fٜ,xyw։[ 9SK&_d.(H63IĨ&5ٚQ+199] "e4pB,IN4!t:#$%<ȍnшf䏌b(Ne463 !))Cv$Bj`3LP0P Rgnd!2Y ~2# x2,L8!2ğvrK"0vxRKkQ& i%U7Jӈqr&f;@?z"¥XHF.p;Dt+¹|;ιwwCУv#)FL|I:HȫFjb:5RJOяd Zv TSn})"&Qv @,C)g\ĵ!Y;Rf@(^L:ȋd_pG䠰7մO NbXQIp_\&LDFF1jZ=}PJzK͍BT*EQE~->wæj۠saC"B6_T~6_ \\L*8qtKHǛ9kv%6a,~<~pu&ܟ[fAUݪx~yi1USA1mgRMY`CҧhvPÛԛݫqr^ܕ勁bjt6Ox6%lB._biC/JX9S  N$xcjIjqBAQ~zQb.)8Teg(h$k*m4Y4/$er't}f^BnbfXXdEjrUsq&M/.)*MRɹeEřy Z@5'RU(NMNGjhZsqf)hemB}|489RKJt :a trm}\}jj8(3]|4EAv\ px\\yc!:xOJ0e {Y @bUe+l̪Ssl;3[ޗۙc2` 9=d#gfGTT hA)+WH0Ki{ x\dIX̑:0?aY(S1xBRre r3FapgT7.0%LWsLz;?T~hV/\<t:vj8!yJI{wHr ͚_WkMo׿U+??x1l _biC/JطIQY?J$#XB}|JRK3S'70ۧ&'ėgih*8xr)+@@Yf"P{BNfR1DBAeIF~BRf^Jf^z䍬-Sx;xq DW _:UKP7)83Y,83?/>9#59  2x?B!_biC/JXVY\299z f,'+%h$T(;Ļ8;ćG9(Nbfœ_:- H%LV` =<#a yɆlSmj \ۋwG4 8憣lڲH5NvȠu G +ZD!9Du [&MӮJRxz;,H =kQە_ʂדW(a8qh%۫Sjm)dC\]vU!I+6߃@q,((+u=ySbeßgPP ]vb+)QWfph<߹Y~DI"ɤbb(R] C0_\"޹u"@TTګzlĘ 8_%[c#;EQ 7-:_sb01BնhJ&3)kwB+^EAp7)ȔPJ$KK Qtq6K:GW/pݍz'51^9⩵Y5nQ$ST)F8]ǒf).kf b W9[bsퟝ~tu|pYAx5lk&ĢɖizEeE BSKSR- IV(iN~ʬV,*IpQPJKM.QB֍ 199 n%)yJA`%E%Ey i\\ **d襧hhr%TKRK4@ 4i9%E% ɛX3cmxK0"E*mM7D6|QNҳ-KIR{N([BѴ5E *!&Ӣaڭs+neUcɘ,!'LBLB^2}jK^Z`R)y`]M\M3HŸ覆-Lɺ}T`[ɾݰBsKUյ[q>.P.TWkL)_AԎV5E'1}KB],[<0|'>hyz8N}'xF@9y&Dfs5}:@M&Pjjx{m6fM&Ln?7V_ς;wjW,xvw5DS _)J_KAKD!'3;U!7?%UP8599?@km@5PUXAbBEplx;g{5%xs,[8(*&e(䗧8s)P (al,9[*;9QJ;z?@dDY<WLH3 BX略6TM 2z)ng 2d*Y! ^@!ko)oBr%E) ŕyɓm\򩰀OcHP<\p)i y%F% e9 \67߫oh x}JABtj!kم|DD Dc-\nٹ@Hg־^>-qP Nڅ*3[RjrÀ#f$(g@n-Q')1 v鞿_ =ILD`ӻ__{Y.Yv3RȇHY U(1Jy*bKtg\_\wV7[yߗV<'?EEmPSɛ]O;CsCE,|GJrc hᇿ°24b 'I yBx]k ͯz]8IRhכe]cl"31i(eX}Q(Ej8cUAˍ3jiqU 5b).|yVP{,0nlFg_ jMivU!L2 û[hkV0*UjK%)7Ay#R#<}Ja, gw ^$Y~|$o-,݋7xxq>8C۹FWgN_^vN2}DS0r^"DK8;#ТYwbf}NTS|1EeEm{3C fx[y D:ǢtÉ'eMu3suRK2RR9+,8u 9981f&$06*gXĆH)i&p#]w?dzݷ$)4Pwif%ovUx["rOx`cɆrone$ Ix[3|kĢbM+. HSU,NNq)I-ф日'%gh8MLbJ Rx3$ia4yc#%Y$YM" dd榦yl@^zj ,R frIɚ[^7 v% Ɏl{)yxkyͽ`r$;Q9Efsf& q>xJ0S\FJ "SܸC66!IžIE!79߽B2ހI=uM36[ }hV鯫I7դO@.J8@B/ HO* " 15 Ѐ&aֲ4(DBJvi1飣&AP( PK$ #Fa$bϸXkC(&¬td쭉CہBɸ7ZOjڜ6{5]"{̉ebu`wخΑF}1m\sn~dk3yΛeΏ.u~4unEcʦn7[P.$.>|.r8f۾=u)HĪԢjd6?[kw{x&4Oxd,}-Ԣ̴JT̪̒|ݢҜTĜ-}.΢d[܂xDv1bO(b:Rmmx\ѴQF7˪Q7:OSOSzeh=GmN¨aJϗrG "Fr+ii@:UZRmEגfK]7(h;LZb55e+AUȽcקVzˬ]k^(P⩤)Ș̊iGho>}X8}*,iccl46c庶ou[=~1/'=a9TLdxtHf6#+nKI7Lr1w&ecDyh+EOnHx>ƥ3iYmx& :kZqIbdv gY&ex=+7XZIAbb R<oOd}ϲdpXxk=/ir9:L Y%&32Ng"29HG0qe`r?f lrk%'O*X/aYI`r"" T*6Y~TQ@ !49}r -ĆI,J1).>YUd},2 @ )N~<كUFF=`@:MaӘ\f0y ?$UUyN[C%@N2akgFl"&Yl^v^Z^RxmAJC1E$Μ9xEZTP7T [Kp u_:p}.aΞ0f]cB}݆fqx;ӥ5@14,NN>5W;LWcuB Az ٿ =xw1a`ѴYCx?2p^_,kC{ =jX^x{u6&.Δ̴4B"+[Z4M ?jx{}qd..eļ.c $nAZr|r~YjQbz^q/{'ZxJ@QOY/0^-6jmz(x<ՐB MC+Tz)q M \vvv~_z4>HJJIITLԸ B*",0.ʑi*աL|<6}y J" YQw:J@sxUn8+aEjNⴈ7Nb9-hidH()vEX3ޛ!gt_:HgQtҊ [g穰fkE^;\ry]~EKNFx,rc,_YN2{Z'h Es3. ZRm@W};?qhmo _7Ο@s^x&P&frgN(cjwo#> ?6)f@#TH8:¹G9[\B}ghfw/ttD&zl.*,)Ď'2x3٨đH1`1_5!O߅ S[{G~+D i/#=MGF;x7Y` +gqjI|bABFɻX&8x*䤖((irq)L)X)L)7BfVFiYRx,(A8$> Slr! f%tE ) (8x{}qd..eļ.cK$nbAf|NjYj4@x[(0g5DS _4/$er sDqIQirBiIfN|~AIf~^.|Yޞ(Y"ZH,JOQe: j \i @6 \% %֓XY=}|&;Nfg(JMLQ0.?Y׼4'5>1%E#BG!7 9$5(_55W*Q^Y_ ǀlMqqv0426A" 5fi9%E@_h=4{dO~nox+xMJ@þO\BBZѡzs9Ls4P8^}7ApmFnJyUuǡp5xl mS AɝI-MqZptHIex|$Me^aAE-NvᒺrWO~_PΜ"<2O?'3<5A)c7fdau N^x˳s/D? _5(/2;[bQzޞ>>\ @_TT!6M55W($SmHcP69'l Ȍ<ԒҢ<4..[lJK2sSK J44K*%%`p2sJRKK J!: @\\ ى%V ŕy% %y\ʓ |`vx[sC 3wqjI|bA&df/!wԒҢ-Zo@ ;x{ĹsQfzf^bNNnqf._WPTZPZXPPZ7Ad/BJ&Mn .. oxv{5FOzE ũEEe%: ξA~!akGU%+0ӴD1891''(3(ISpdFq~rvjdaLB==xW]o6}ׯC^WҵZf'FǓy2hѤ@Rw% -fL{xI^2(lptVw]DZaǭap҈mwa<}'p|wZ$c<_ %+$W]mD O55թ;0'PbpT2v:)sTp*΂NaύZ?>n-BoIX)b r`fXꦬ*].irXū 22tR†CayZ cTyx'? E} i ]Z'1!mS3E29T1q}G*&bWC' RPOs`p8[UdCa?W)Lʙ8:_A`%N?z0G7ΰӿ}5jPn"jLEHGfjlZLFDtzJvM6xLtQӜ"$2QMhO6m +{5nP$~?dZhxG=y݌;AT+Hoݵ_qxCe&nbO|A3]ලE*qRv{BzEZ| grֹt>ٮMD 9~ght4 z)Y5NH|58OӉ/;mx[!;sC s日'%gh8MM.LbJ R\891''(3(RC8?9;DIGBsGfyNwAA% x[K0_1E*Ed/Օ]%66!&U %p ;&Hq,UpkE`=+~`D D ;p[ ^5 /]e6z ķұ7po-u /n۱BrS60ؒI:{I^2/ 綗H :j#8X/I%E{ '}QPe ڈp ĠxjPǡ9l"N$iյkEJI665=y'ya7^^ >9iYLw~~/s$s*IP^0L-kjV oF1 됳p0PYm(P bIp$o?FÅ5q VܾwE79uVr [T]1. {pΝ 8F—(5HNHgv{X5sۗh9$K/vH vk;4\qfLyf@tI\y_sHPEo|3TiL}65-y xZ9诔g}4 Lֵnxœh h +ݘa6B) Da?)ްxk0ǟ_sƨecn+ma#T5w)ek#%րٺQ2edZ6VBhgYjz]SaC1}WR2NNU=s8#OղzW ]W "k) IHPG)!]4g K!uoJyaxn}ï);OM/ƛXE"Ac/Iv xk9''F,&Mb124R,8ʋ2KR'ObI,* qTdw|KTSG!7 >82XD'DG v #S3+2l,`:8+Z%LxuJ@qb EA̙UʃT` Bmqt'>gPWڵʠ"˙ o+d%JB!k`YV²,ywxSKۅp-s0ap(Ee_ch#D>j.ЧmVf4]zɥ ,R&đ cڟlvM W G4=B]OEM4} j;b1|>IJ>: JE%J: EF: : FfHjb*YYCPEY ]0DGh>,ؤ jvUL^cgUf&X]AE߻^xk0ӿ}KVcN8b,m$2Ua)AJ.k:AD~2yVҊUChy74/:Duт0A։* 5,G(BqqBf3N_X 1zMa XݸmXZI{AcBۣ>: g6R]' XS2t{'v3IͮiϹݖ'PۋVU?8= x{\d/+Vk!c SN?0t 04*.V^YiiPaajd``if:I,5LrPwFǙ$ıi325 /I~-ê0}rE2+Le.yKY$<^d' 㵲(NcPfϢKbkh ٌd'bTR&ildnf?|uRϘ^i ).|$u x O.J~p,\Y*t!t Ƶ.'ЦZouWnoCQ踫mQIW%Zi`SNPxRt rȚfN{9&,ZLqw %LK1M5K k 2<~E0×=`_R(zļ y -2^ ^5P""%vèϸ䰿\r1rReʔ4種ԙ q"S >7DNJ8 k-hW)Q4raL hP<]8$btV"A)Ʒ.DBϏVx5+vIic _xo}oo[z7ï1݆EW_8*}g ֨෗]]w?~v;K m{kv;Kh*Y@;VO1т=R[ |ޢLzggc ߫Xa\o<ħj`bדL.'ap#slk'OU~.J(vD [\l\қ 3mwg՞p&Spx[Fa_VV[]YYl 6ssƷxVmo8_1KUNJiwulZ$*HUU !/{~$@ gƓ|)R+So F͹g' e}6Dl@Q|&"4F\A*@RmP˥@<0%8sA@u! bIU x|A[y'K(noΙ7A)H6<xͤl(f)d < Ps1 ɸRUj~}*Q6S c0u'1ld^sjtuq w# K؋y!lNb)@R'p3OۣQ{`ܠ-q[.CbT"6::o{ p<ݞ9 ٻ{G4z;xcJ/-H mse D sxReX@#q7 E}Bo9qUjoJryZf^PbVv# MK20?\`O\nɍY`"{m?I h4WV*)C0ȣ`X%OL:kAgtO_-&J$zWҾ G-QOq*7e<7SU*F o&O'x2YquAqѼHZ-.?HYU T[MDPb DZX,aM_T\Q/'AbkXnW~_>]O쵐0cp $ALb\Rd)|a{Î\sǣ<pztu>t{j~{itmQ_U'"JGuN%*<3m.P,oc-E*3wv'T8°~9Hnx#Zc\7%b4EiXbm1qY`uzýYj8-GZhf2ΐǓZ9{YON>pt;N`04;-@W"etzD;`8="L3>,\ved3b>T∕&rTz6k&3M6:Gu_=P#+>U.]vM܈qW$zBHzo8=Eڞ:n1>y^VƁlS|;΍=x.y]rnԼĒɉRp?j K#xQk0㯸ЗQJ)cLJacR(i54I~s2sfIQBDӁJ1тJhkNtdUaNxR \3lL\s e׵[8͹`x0n==5M3vCGpʥbc|f"KR|Psnʳ[ V( #k0΋N b~>7QCIO5ϲC:_/&y}IB!,ҿM o}Q!xqN̲T..eⒼTNΠҜ.s]nvfNN|AQ~rjq1O|@kp0 [Lxqifωd9=}|]M (xqu ݜ̲TD"NCNGp.) 8xRn@UCKWm*82I! *<,XaMq? -C~A2  C$0q L#y0lmsQvcKF$ tߧZ"_Iyᘋ`Bim׵fllڝhZۆ`"д&&|ʐ~4f~9`pV%Պ&쨏ZV?`ЙW6[׻Al0/",ھ.;^qEyLעcc?`vfS:(&ھ8mwSecQ ? xMJ@f˸I Ĉlb4\!s &r3V>B@_Aĕ>?Y8瓽>$A&PT`e E kJmBxk M0p`tHwǯKFw FQ^&pv>oȱ$+I${0N(]7ϝC NRKl'J-mEp<]K'J3R|x8ln+WÉ‚?fVi1 hTdv歩Y%*eiFl<"{];ixu me'[e@k/:9n@m~}DwOԊ͐8<\s$8x}QKP&@2?/fNJ Ez( "Ƹl9ٝ=UsTupsSy6%t40]*ɀ2t=7sG-B0Z6MzMM*.܄u ER8#Ä=Ф,}iHߧ0I#YCe:Dw^.C ef@j TYNꍮVo6z"Ȓ$0G%3˯'fbv*.o/_ZI+s)LIXeG S \. bw[έ4PoxG_X $ }/}ݨ XxPJ@o(("=xPflvKvb|5Iۃe`yknkϘ>Y}ܹ,gk263HO(M@ː.ULoxØlB6F#Wl[1!m s p0"WVaE֕6|Cz:gTڨBbc0JzG2v\D¤"Wgb&P?[a;$dg? Ƭg_EVxk0ǟ"O΍9أkmJ_ҵ:.q^k¥⌉8E+i41~E5->NF;vh7`/' W .CLמ ch"|sƒme4M}t!tY>" {@`3wN}Xǭc%M3 7WI`V 6iN8J%WFISH] kOpSdZW8ZӦ'pg虁⭳x̵%g#7~h0YU]yh |x{k##wbNN &u]f r-^Ǩ0iI&0b2E73$78L#d;r!vauٌn9ˤ3`YU<;JxR_kAI)?X_3iڊ̓ 5 BjVPJY6wdK,}( A%5|3G1 To~3;osW&ˋKw>NӐ+tI}Ȑ{3aJ׷h& P{ʡҒ9=4BG l]ެG[d|dV/;2%P> b滬ܐcJ0WC$΋b܏ :|WV#:O@WSFDǞsvtb&qL"{=S^13)kE Snڬf+'#E%b-#j!$uȠRҽH퉐1nf#%g8b6|4 ٙk=bC"?0tX2s&nGbB<'Ex]N0ǥq?똒*tcl@\@*hkZK'SiŞ`=ov"HCCc 030zjXnr EwWZÛY9(ݝ\*8umcQ̺H3B0313qI2M8J,)Pc~l*)a7gD"!t=H"StPlmR*p]ېҕzYW#4 gqE2e&R6b:')71l%IS$1$ǽOыyZG^ZҸEҌLxD&ahFn|tс?E|Z x%J@Z^<9KbH[5Xi4E^6lz '|M0{_O`ݐ*Rp[Zd;6ҋaϷB,u}܉S#2o\wNE:><aCF! G˫뛉x֎,eɄ)X u"3I;w$ekoneU?`&T;xk ǟ8k1ihOe645ceВ)|λϝ@rƴpknqN+ꂽȇt7Q75$$JXu+{MSZ,YzO.zhgKx>ПA&P ={[8Ba E5 :Id^:f&auklńD>B?(˧q2n,!C& <pd #S 0T🟨 gArxmRNAJ44Q8vD:Tyù(f2E_inmWl>:Z* @3Je񉢱X"Y#V7wꚿ_DӶZgK.- Xr9<Cf{!&:CLHHHJ"/v^A $mAiKK:B4lf*C7f bmf-81mYdh x ګ/,(\OmXGCP )U R<6<(cٵ(̕ d^;@`Ŕb:]tGd0)YYXޙ߷~zgVH Qh,(r Xi%]5X\^hB#0[  xJ&W_i &m-Z(jOܱK+VϿvhRޙ w]С&@A!.CE270F.^ ,Ŝlia3LS "qUGp)tt& _ܑ-$)WcTB"+BHX 9[zгI+ !n{yi끯F8^y-˭fTϗ?7EAq}/[5 ,xQK0_q/ڴ!bB7qdiӦ$oRd(>)s )Q4k43F,3`UK+bIhC[(4kAXęD0X9|\5U sdn.;:ٱgk8ˆ6p>{H5h7JS{^/ ,81@oVU8c0ڞ^/gQɟ TbQk&'—ߏf l.x;ʺu8d F~@h5y? LVӀx! nxUkoGTaIfKAa"U(ffهӸX-wsϝm8tB3rP*d6(Rlsҕ^Pկi K]A7}R񳏾=l"kFYKuA,hd=BJߖ㴲Zh Dx ehvLK˔|FpX DO+2kF i˕2fgW9 p1W,6>xy91m%֨<[PE6+Q_3Hބ 88 g)253"jQ Ogӹݸө;pp[$޶7M6Ie޸7Q2%ݩ7·ɬ$(z76_0F2 hͶ#"#z6dʚ@.IKS' $nk)ժ9E$b?J8n}us920i m:_#X,:Ϣ##W*G~&ej"_PĜFՠKw٫W_ys~wІj_ZuL ޷]s:{pmPgIS>ٵ`D/pχ,׉oe("l7wdiEpz8,,bazv;Nnj 01Ss*Mb'&R>RyT% U7/ l1ZNYe1+i$aՊGeN9@8/U(V͉š}2ȳ肚r4Ur  ¤_s:)/0dp 01&| YUY͜oPE"TR%anتe WNB`Dl Z]5UԟD%N_@V]ҡe1cڌ/[ӗS[{x+^rq a(~h^ʒΝxh !RR Y n޻5%TS?bx;{op^Qjqj&L,_P@^N~bB@Y!/_!5RK4u'.tQ8:a!-~v:ժHTN\r~RlGB?5(O1kLuǬ3,'bm!Cqfgg( x(Rן\]z% +̅oH^#5S ]+PBnyEDh>OxJG,0?Fb8z c_=Lc] -=B*^B.f >?$lM;nwܰy̯o[95gAV -+۲Z;#. Sd,,Y{A~,5\BEF[pZJ&Wh!}Cq#;TǯfТ^KɶI:)*L @"#F!kBggm4Qt&FՊ~ )8YFƒ0h$+/G#$.%0#%Hi^:}sF&ͮ_1X5kGxr>8GHm!q2!?82G\ritƎ;syjK 'c/'y_D(Osl:#orχ FQbFnD}2X?TMPSPW6i6уt6wr2WaWxW]o6}ׯs^+%Jb^8YDYD%Q );ư' s/˓_VÕH$\7W9]Og4l1ft{7ίsD*-0B Tnu=VH`P6+sI#jw8`Le, !IȘ|8nuZ|% Q)mOc%lVF8!8SGqtJI?K?5EUCƏZڄ ˚W6F0sH̲kx z^e+yxcaWzC o- VDV:k4$,;β֜ᾕe<=rJYmDR50>WsQ Ӷ6j\پۨJHX q[ɪϬH"WZ-dŖw,FDqzڈ(uxmTy|s֏ꅪۛkwr'xl^Y%E^̻F2ޥ6RKD6pԚE@#>6QYQ`=pju^=':z濊Ym_jx^m38Km%q<@P:HaCEFd,acI}:.(^FP3>Orx 6/YMǤD \ES9 8až ,ؽSIjk~[s%xf ;J-v<.dm?&O``Fu&EcA9ǸpuI?F. S]BNSOruŨ؉| ޫ <ȏRP;1ufX*g\JP)`vzj2<(fBi*VDX&Q1T2B3@0+:woa/+x{-tJb!FΉ89RS&2Lgb,/,I|Etr0vYvAAIN*g~AjdGvɭډEf&`aNN?Nw9'e4g̀$ 90ILbC2$n3'gXM+ Dsu*ad W N~( t+a6yy``bL*>1KqXIW[ ff1Y,89 Agf2Qx34P"$=H#SAUL;QPY 'ʆ| a(c x63g 6+ y_ 5;`IL),XzXp0@rUJi/b~I, J}HI,QhrP$0ԜX dl>YIT )AR`{?|%Hї2=xmMKQu¯ ڗ-}Lޟ0HuQEu-ZkS(_@QsJs}9ᛙӻM(}D\Q u;QgBf 8:i3QۯTI)d2*qQPQ /jfw7l=ǫmt& w*nkLKJXWڽn(xy,eO*T)FjXY:.xmn@JNf! (EEJ/EfvV]{uȏ@%_Qpdgfѧ{7 JePHgX*ɜ`Lč\hE­y )s N&mYIgAǰז3,F s5HD& j3B7Zǜ:9u|'̦/_-gga[ޢv-J+dՔNUd,ESGPxr9=,1ykܲA=$FݻR+OU.](-&گ GM 7'_Ox#6Cl? KJj^fNVq+'DSA_8*5?M$4yDONeF 2#x]RJ0]Ҫ AJPZ:Vp1 U/i fҘ R/"+•>ޅd'"|/Im;!ppK`\zC$Zm p&(GRtģ E>3t8Dc`\5c.9 ʑaW ŦJQT[j e@"!p@ₚPA.Pbk{VZZȩe;eеڪBBB,=e%YdfK<-:I ;֟v33~ k9T~q|Xϣz?ԯ}/܂m`&O$`&\ï_nVjsN5M%Mpqj6Im~n8(x/u?y٘Kg&y:?d^9+o5jLUzD'Ol6'2}<uSu*η?onɺ_nh7MvYUn?̟ *p{E'+jTre#,(pA)# va*oՠ㷐WUn^&#{?BߓTc4dvoUsM^X&*DŰ(K*E$S"yBb^;`)(aDS~׏پyد+mCޓag`fRF\buJӪnX{9q4L5m3ɐBRE3J<|Iיd #jdɨA5hN y:['/5+\T>̀MKlq6$\% T8& x!/OL(oh Һײ2qZZ5rdÕVhoF +[+[+g^1e 0ed _ 0\ nehr51Tժ<< i{[F.]&GYu$c`e_QjxMʪˮ"iލzf;:qeނ%c`4vlo"|_)ҟk0?Uvga"_ { W^PF'zьNqf@wݭn?zիVو(ʳV{u7zEDҿ׃S({zH_K f5j"8wrTpulԈͯۨq~"_c~m"_+ZjfO-`׋?,)- gV NNGw({IIX$LVPN_)r2F *'*'|X3}$ pE2tt"xtJ|V|&fܡo-*9@N^WM$NN9Շ:M驙(Gy(# [ tzk&Y1@ʊA@re(9(9( ޷9ZneH9H9.9oSx[|24h-ilM`apqpq XiU`hqhqgjU ڑsS-p\ӷdL9L9=WgIƉC"M$IF@Ã|U{y25B˫o{9 +T5&!{?Ό2N_'t۵F0 KAo+.`ihh&A2NF@N+dځAx+~YH=0w~mm$ɠG?$c4*UهɀÁ2 ӻD*RvRvhcx~(vaJi4ȴȴGIzʻPE]Yj^XFz!KG T}bb;9q|0n(%C!;}aȈĈqbtN2\.g\|ܵ`O.ۅeRfS#iZŏeN[~eT}m4qXBU+eH#Yi[Y {åiז, ,+i3,  D|QdqG9q|-PMorFSMAF3 .+ (@zA^`e=6 " r ֪i"YN{7G9Vf(Y" " (c0YJAD)z|e=A>h4eD@VA*`랯{d*<>4QUvG0[𐰃"햽‘, 2̃G\fX) =Ѓ( >H˒=\mňA -b z%7dX =MԽJd&_d9MTٶ] rr o$9wj{aǻhF[hh }%D@Ap0 o*3Q(8( .yYADNZe.1`?W8clq( ,M 1e0dD b,|AmOsӠU1 Q@B7MT" >! OCI@@D(KU"L@߰.{?G;<4F@DsM"Hs@1sI"8q@N_ _y%Ô,`4$Y0S$1pm%A@99+uqrY{򀜃"T :Mc$8 "#l@dyziV}c{$EpX S$E bk4OL2( ,H:a?mxe ( Рz2BD ( G_uɨHg@@U%Yd5rN9wՔ*5 <P@<7dD P@]y%@NZ%];UȖ5\Am}dlB ( `^"Jm6d ( `V]@ تzqrf-}׉yW^!Yl Lz5dR( 5*e HL苪/Y $K /؊O@E3j .UKbFS ( ISdX ( @K52q[35x2,h0TDn$ɠDP@.Hi@@d#u3dkR#P-Z@fnd$W@yuQ0N2I&ðD$C(@{!;ޠkku>O%l'!Y-uq/`̓%D@Ių"C !$#D@{pnŤZ"i: Dni᜕|˲H"( R5da*|aV1y$+  0]]W@qiRBT@NPZ 6ʖq=dP@^ۨH r"~T$7@o':gcd\ ( LdL ( }$( 2 S,t"pipL1@ LP+r\L !@D /nz dI뛷 7*E@$ wZH֘.Y,! 'W`2U^K:2`$@Z.H Q @VͲ:jZqiZ\v Nc2s>}=2*=p{|=2&y7?BH-@Wks ɼ1d~1Nk\?ӯ#}4e~~msoO[ eF`|?Ige~7g\i1" ~׿RvKpZDN}{ #j~IEoj<;.@w9Xf\!~{ҥV# 0/"`?ak"x2EXD `oKwy>{oZD<{{6#wl5haK+b 0ߵX8 C2&s:zuPQOڈZX刨x,@KF7?I1ns"8pV:ڜix>HkOEZ0,e8%_PTeL wt'8[ygڢW;e {Ec]v$8($t~i!>L0~uj|)d0>>]f J =1+A63(>0կ0s%|m({ecҷB܎ _Cc/ˎcp0G" yE&&3S^8\ oUnوڑk .kȝsn0>OH5#zeb+ڑkP?;_CW*yhrauD?P[ 8 ( j ҨoL6s1h=&4U:#nc>g6Y,`_ Wj2\v4xƳGʮ9'޶3ԢR){Z8hw;;TeeڋjϷ\y<; T27S̾%V)u>춧=+Q;{^ֆywg{Uyyg=ꅪ=0ƻzsgz]w]Ӽ@a_6n[f ;=w}=" |3ozu~~梮Iw/O|ʏ$.}B[QӧuK5Oڨ2\/on%xU]h[e&9MRs$Y椭59IN֕ۅE$B )ESP f{MA J.6z Y6i2A+śQ AiBٍ{yw,ȕIYb %.",cYNa_?$ѼM_w0ׇK[mָGNݨ9hA 4k^%'Ϋs!.x΅ak0d4z{, G-.*tVˊۣ^mzG+fYhƇ;nEdGMBe.9E<C~' Fiδ6"iUʴw4˗EqP̻b~q1SYQj"!jl4L;zL:ϊ*uE%k/ҥ1WdbBFzjOb1]D&׈#!c^?Ў@!Q$r,GЪ/8l3+6ű) s>b͔Ϙs3<~vqt͊Q*>n(~ҋxz^hKfvSH.:i&'#bRIRL]XRkyXs (zQmS}v'ZkgxG[NA}8wzѝYmfuh2M}r >QJw?@ڑ5&o-sbrZ$.uz)6āc 8AR6KXUH3~ʹVQ7Dxţ(pYi_%&5k9'~{&xqNd..eļ.SS]nAZr|Rf^bQe|IQj^qX%bxTaoHŜKH(CDC$A"6" ^5o6;]<μu܁sxFbރFfk|O)}k-ut/]yʄZlC(fZ7R+Djf!)-ieMca )ǥZӼ{B$ ["&ҰVX"ϒT*#kj [P.m x#n q5K`.)!3!bo n,7 㪝 @L"VEHXp@˖īly:~Ϟ{SaL[K&h&{{'Pn &?g#χ̟<&ZhA-92XdA̶GrS??iDU4r@,A*_n>ZݮiSU+5M3__ 4dTUWȨX~24Fd6fLs/&s'3{A[NzY=07rqE 6Udүf6w__47:/(=ᦟkF:bPI+dZ*2Oe)>/AM6}q8dǚ Yص 7ۯ-_h:L'k:L WKЄҍ*?uGl'_%h}O5:qn!AVtWxilxU]oJ}&/KUr| $2DUtU]Zk1f=sf:K;אo]jt0(2YwrI:ɬHdKoIR .íppɵ_ T63}aȸ`~,,9¬,3o!J)TZP"X  ֑\A::2acBHRv(`X#Yi4?>w3};KoP# RɈ͈P[a,1rwu*]pm4ᘻ}=qܾJJ [9}0OOCec9k,d+Ĭv[ڷO&'0<דj60ǻq g0]3 lOȲ@C*ȓPY}g*^e!q-"u.t:ͦEЪJ K C"1qnm+TAɘ|  s W1A?>EF~O97ϣ~O8IGĘ-^V隃Ə[%[ag<nUvEl5j EBf]˳ySqp12I]`Ghef9n:,6+"Ces<AѨ\ó_j{򩳨jX5o1<ȣOo /f|sÿgx[uXU @U1!d/*$'X: xu @D4ZDB@ Xh[\{/73)`V#$pAIpQP8'zB]<ω\ˣ\Lڇ' ?,k3ˀљ\*e HxXmo (W ЕCT,, 7z#k`-8 ̌ &/۪j'3g<9霞mFh|GHOIaJ+Hp?vyhjMz{}KsD 6BA+& | zcXn ;4XPߋ\^.- HcZI* E0G/ӫ%Mn7&˛ ñwҪYܔy /}GJsV4-'ł9h֛/GqoNlaoXg6%R(V78/;@Ȯ7D&kc4p=&E!%nw:)|A9B'J@nyg[踺:tuOED)DG8=uj kکeR=V- 愋ȖfA)ܟ42[Jl]خ*Q|4ei8]bAU3Xr5p,,MoH>DZ""85ҨSg'It.2* G{ʨ[V4yQw Y(u d\Ni+fY@-4+J<I,@&\:cB{9 4nZ0&]rSFU>oQw". C0>l%'ZoDNl[ߘaEKNX~֒tIz E0~xܬjIw5^VnFEd6RB5MBkPٷ`߫ՐpCh ųk* OZtw 8xlQGJgN6fYcXz a}^mjhH(4]Rάr)4:ʌ6[ $ jo*uY}͞Epe"F ~{07JP V7DtXU (>*XKzGm^i'q~^rô,WXŠ?nmO!)͆~`ϽX%qUV)Zh`U:/`?0g+$@ޓB&OSG6i[=Q)& 6|%Is*-%<ON\>9,͵h-cv`2XI3pt cF- f,G w =cY^L>n<y\=ڙ˿JOo/p>x> 7!np6dV.2#P7&o+a#Goܶ^=ir԰%q3(oBw&7#$uLk%3%<(t/MeX+٢Ah2Bqa1Wlwdu-L:<]M>yF>;Ac(٢G`|A],涙+*\2ۉI5WUR?izM~%4LJI yĢ̀HM$؁(9+5\ u}DV&-̼^1BȌ hGOUpuM`>L_a1Zk` 7$cuz½9{#|#lRrJr\LM+%aq98EO3*~W/_ma)ҏS77:ǔ#QWKi:L&xPm>~ ,AήWKx{.+oNe'7xmQo0ÍnqAIլ]u+,+4)mӄ,i-8iz甈}{ߏ^ TJ-~{>fkmxpV}8 )3[gxOAmR !uSہo(w?oӭ( TTXؚ* |ؒb;4+$*ao0<$Q 3S%}Y \A#Ԫ<͗EYNR7O$/ 痭RӸYl>LYI#A?QkkJp,I%x\.]8OuCQj́˥iO 2d]I:=WuCr#y-$xCs۳Y0wgBsNQR7Om厠G4Ľb<,;x5J@! A+N#ݝ l|043?3_g(s@V2<:㶱̞6j\~\ۆ}ւ@0&B PiE)î蒼vCC%g Wѐ@C:*FVC2;Wekm7d]~Zc I&%W҉+mq:,7mqTisax{uq3Ddd..eļ.Ss$nQbyqeqQ2ÀIxUmoHŤ'U6텔Ajy6ʡ mkX:ko6IJ4k}3ά[C(|~ځa@R5[HO;ŗ+UZӓJvڰ'h.ҵ~v]ff%9LH"OSؖ7+!)2V:P"@kufpDD-`-#cTbXZk1l\ 8m_w9ϴF%L&u)B l z'T#ɛw b%S"ƖI 2," ganhWtyh-؆T|&Q"lyg9He^8 SpaNC7)Lf87;羣3'z_J$0<2%V/rDe^4_I[v\)ղ,7.hE;2{n~f/:@sKAG$A8a]6v|0 Cm}z۷ޝw. U jI@WD17[s9p##4h!&Qe] =V?Y(S=v5`w)xp8bw7ՠ7,^p}|U,ŚOͩT3%R1F-4369p" ^{jE-R 8XTdVhzyAu VIDp"e^%?kE-C:>%},-z_6l},LmK2#qT"n]rIS(+oE[;Ώ$sCE4HtXEX lgD(u}O-ѩ{5j5מqLh%v]kOl_-*}X\)DATnţPGm2GeD9D;Rjb9yGkA ^sB)j帩z]G3l-֫qlo?{RI#P%Vxzt >CY ՙFc@Gڼ%=cĖ;zW (uaӄQqV~\>gQ1i.8hFjBi.}O4bkcxݘjB`5^;=AֈG\ks|J1!Fol.ϙ6+Xn};|^RBH[jkvm#l[onVȭ /AnZiv6ycojojowtK@ l6z/lTWkFwnr*/k!Yc7w>f uڅli*v ʢ8ϖ|nuv4%=]./ՏJʒO*ǽu o~Q=ꋛ^0eHa;#*zw I 'vF:bx}jFl(B-81leW)-&Ѭw,)y% ^C@/$У:x3>}/?>]ώC2'cL^3M+'ǧ ~X99% ؃3涾ݴC0Ȋ@u @|jjc0ZH?АKD$# 59xi`4a48RnAhɇRZ|p6; C ill7}-ݿr1?_;A1 `枃0}==eQ@Хl)k1@|x"#&K{͎x<Xq,Sf/68[0eCgtK|Xy9Чeg<̀`%bwxƮvwtfG,i6س;? A!:D! h*}cACDtU{3b Mt1$(9tlgqcvX;aW +5[Y/c8P]v +PFbm%_j`@*2@ 17ѶQA:W)!X Az˲+V RHDRAE#DZBĵ^5b@}eTH&L˪7PYDVE2ԙ!*¯Y\6E :#$O+Cn kՐKvH~MqIG5\u0dY'Vde$wKUGOna$@ y$;rK ɸd bIkr%+Doگ,t5[3kM3&0|Z-#3Mji=_xo`d61A2bsgTxxTn@|_M_!1$Q] %b1PUY}Oכּ35T5Y1-ÒF(J$r* $~7(nԃKi DuY!'Ihn ҙW U rhYúG1A&RP";"p>Li64B,c4xL%,P Rpi_۝U wSIrXTEDD@a+MQe8SlyPSFr$/c`D03Ž9l(T&U> ~ } #[PC$zo{{;ݙAHC4uo\t jXrbf:×Ծfc ׸*"2-J$aN i=4z X\(T|i]^ Nye qf֨}d<ʫTJ.U2q-4Zܕʸ05/DH뷞4N 7feuPzW5Dګy(=t|0YN*BDMSx;=:3Ki9~XߟGleݚN{Jw2VoW#Rl吐”e)STéV3s˂RS^| &0d}vrnERڤxOR·6prf3LzT6*tDIPLɈ~!֭6 Ek菡3hVڳ؁FՈY Rt+dx:KHHx`@]/9PX%`m!!?5R ;1WPP&4g{Pp|ryu gGWpupu3O^t$Ȥ&c~aoꪛ&k!\\msQ{<Oxk"kBNbqBri&'gAQf^IB@gRLH5i.΢ԒҢ<kZ.ǥ; x]mWG~EEc#{y;,6bj5kItK`x>ϽUzΞ`^nݺVWn:luVSciH8LIQЌbl8Dc>qy6}<ѪX[XۓEoermpl[?Nޯ^jbƧO \&:R:S@ 5jhlwog띣#bloÃUc[Ý q ]ء{"LSq^ [Dlx.L%Y<1fS/Vuuuz>fy ǭ+˽g{mࣳ9zspxܮ;7&&σtT$}~9|QF{.6G2gYh`t /v\<9t'>8h~jewt)Adw Q&HwBd :gL[sÍ/Q||-oXSנ$֖.B?<ڴzek8kK4Z8 SF e OXR_d9[:,X-N)WqNuv~f_-ny H~V { ,{&/Bq}Ҽ85'KW?𯈿1+y7|zZNWN9}sstޘxAç|>qQ,푍HQIv4/*P@\)_$@L72 ]bĠ0Q\9r/9&3r]/(9 %D1en4uS@_>}sD>ܜ}*Ofp9 鰗^ (A /vlNܞar^ <ΠbyԃQ&j  d~.lؿ&""a)d4FG ^.h=c7z@@(ϰW#a[I:ESrA@q6ihXA/ c$Z!aOPlŤ"!UaOHqd9>x<7Oki]2w, ZA gyp{W̆o pd 駠jH7hDr.vhMG$gaLL?Ab/J"@d K-3\2 T_ڭ;=D& fh|]EH*M"ff,d MhBXnšGd{-vxYi?-hXQc{wY{k]{Իa׬jp4Yw,+LGGr=1b,9"uI.Mi8qz굱EFS-dda]qRolӯXYoVzT%Y+1=+0W ,xb{w}\4ȍzT5kVbTn:gd7Βx(i-xO~>ΰLz᧶W,ڒpݔ!zoIՉ~K?a+pj/}eU'h)C<߹Iqe7U.` "E9df bCZ=O?$ /'kvS#$;V7=Hb`P2i;V}JM k33-JwLȯR4J@2AaM-4IĒ~~/vtu j^Px1~xs4cWL@ =߰' Cs] .N>n4*΢Krb! )"blIT+b0h2F\~PzAAk X]l%a0%Vfq2a5DG4(8ϳɨX=2! 9ɠuq6Jc \q^n[w\PKwX24E&7>*cˡR|f!kƺӚzh,^crq9E`!_ @1ƟML"e{tͣm{KR#QΥV)j^[7HM>`Ema~3nஷtsqo!SqKku'iGJZJGӚ\BMccA1h2/It"q*jKwhNFZ,~'WԖtx 4l7LC،koM#ݰ G>DhYZlr ! uh+;ņ&q Y l_p^:I/kBY2$`}#p#b_@0Ad cXR"̈Q|ra>GFD9vWU7%~ݎ8 Ejv,7ak7z[ߊƚYc{ M,69Zl5bdqc Ҭ#Dy6Ka&صbN zv>6 @\@A96ʗV"tT ʒ1h,,н39stP.!ҀH:A8! ґ@|T^FyJB b v~t"i>3lg\JSLv麁*bzԸUNP+"!lm~; qRob%M ] Pεq++LMX՛~|@S e'vt`( #tk ~sE1E"q=Dyɖ>µrJF4tV<f/S+36,E6|VQ7!`a';AܮJℷ0 oi3YoQ ޮf]؉cKATbJ*%UYDt"6E*Bf0 tL''d5{!/hE{amuG+.q]7Fj׃珆}/&:3e!=!yX0 * *K Cn66ƃ}*]2+-Oxjv(H!nocQG,r5fyAKؑT.Iǜe (:!iuf}3v*`.Zv7%Vqt{xN5ZPS=4苄]:coQ$foHyȤ3㶁72 td fٿa7ars؆X56Ju~x3vfx&" ?A~E a}E5fJ!pf?#3mj~,GRP消(8*ظ/xGbg; yٷOknÉh1?gCI{ LFV-obcwo{Gh>)2z;PCsjkAl;ゝ,1^)&f%kXSۍ.qo-݉)OZؙ6 b,q xr|^>hG42_rOe5 qn_u# Ia[|N|;(4!Td*} lo$N iTm , M*ĺfJ{ofL̽2{IQ9`jk*)*kYٓ'ڽ2g>@/<  =[1P$"25biz }6D{.  w+AS2F3K "zTtonz 9ȣe *JҷA5С?5#i[-wJSHZL X lhaA1#z~x@ .2v_e;ta ڏd+Ё/q>/ /ݿ_˙Ꮮ.^w†pp ddQBu3R#[RhiHvpցfU23X(BWi|ՆlRwEڨT@5x|n4],оFH#CR2 \< Trf'bڃ/T+ ){”x+gÅA :'3ܗaybB'Y|G $WV.)="T\Vsah a>vY!wРHǂ,!i:ItW-)2MwQ|]XWa"C {Ǎs%ORP"8. Y%* gU7 *.צyѬ:fHbW{/ꩱ=ߓ!jύE=5{qE=5v{2_ssQO|OF=-ꉰdؓQJz#ѧ:GV Q~D[JmGI2Pv-RPjrM BARK0IXDͬ!UbNe#_0_F]so۠:B.u0[)\(Cw]&bٴsmk]$yy=u *QE ޜޗ|rύ*=gMM^52쿹ϷTf,uH= JQӞDf|4W$kAZ.ws6F)U/O.gb~NR6xO #):0TIf.&=WRI#LNý K76Z ]"_a暧rvO%ǰa I' 4Hn| zrzBo'AИ;uK[pϮ֥v)QV Qy#%šBV!4]hO97[+Vפ0#a[SJk ImU) Ҥ~jQ@$4ULyEmDT᫪> h* Hi.b3qr}n=Oγ=J7p=JsbRIqͺ)e?Ȧi`* @p>ݜȱ9jn0q\MhZ972qa#S+ {Ŷ3H*W!.nspϡ_%yULF8}b19#I>,o) ;{_GNyp+o_4<^EOMWEzה^m\+ <>˛,k_s 53\}r A=r6Iy>Nfg={ɂv'6guECm(s%KzS"`pnLhenP`ԧ|v`[ =ј`w[5?jWj-ᗋ z@DeM(|h3 1qD q7 qh(Ł4h SSNhY څbDT1ʏ6#Zt`(ؖܐv]66MYO4>fYw+f,ޤ$Q5y;+'kKRak%`֖Ps1~11ǝw#;}ɑ]DGHhS 6:i5gcm宣MIfZN@/t~ExH K235dzٛ_pp`f~ٿl;l׮B{2*q̷RIj Rӟ1 $:=0gğėy7GTN.ns@#VٖRM¤R=4NM,Z"~e31 :KC] _tC4 JÙ]W͋lԅSz\;%{&wNseƤش1!7QRMI`Ȋt26+ul&; P^gGS/ ;Fx})e *GwbBg(['VJ|R_Nޢtu-[9]=iߨU|۫4du\L6)w{^oU(Hr V?ҖTt`ʾODwX`#`o9\X!،}ЩWAo:e1P)MVM^2]Ihb r+dɂ>9 ;}JJ:DW) ;i:/|Aj9XB"hAnfit~ ɀٿb%SUb-ZƥmT udr 8&r^=K$ d9zWyXd[zIkZpEPG-xMr{lX-5 BBWk:낪s '.ؑsxe56y]^=UJW!~'SYYnod," <[*p}#.1~Tt\j)`D=Kz P_/2;ּg -ăuE1vt7R4.Qۯe~>%ovq:>Įkކs]SWAzUQð{q,MY.GO~s#~)T^.T ̈7X+{kq"+JT--+żRX-Mhbj ?C,ߖ`Q(QjnW*ԅ%p\ pX SUq2)#w9U`)sv:=f5a!WA*lmT g"xIL!ҜKR2I:O=r#H3J9KLp&T Xj0\q mcHL"q˹ ,tGN+I$ݥMCU,yG!pȢ5 hSQ)Q]yrG# NHi{O3#'ukg0GC< IAJtX;Σ\0լҝ2De Fى㚘 ;Ry3_*6ʨ\«)PY9T&Sêa`:1JNanz3cOIR*9AUGߡ{*wtHK$.nv \9j&f]Tj&d)rRo㥵UY/&yPhnV!F&٥X~9uk |5?~M h(%<x)2͡Ą㉉IM01$M2Aҽg^@lNʹVHS5~Lx#׼JY3[A"gaʆJ ty%sܚWΉCs z_|v;C1lȞ6J jBUsäm݈:x4Ύ󃃍Ks`"r 7·>_# $R5]kGlrEX~4qCl3>‚l<MIKÒν~PܰvsXr'zYoreE,bE^ᒣaW˟1#_N.3 g/-p!tD?GO,22 [i`.V)'0S9__4F{``"FӛikchS]Vol7 RQ*MoR/ qj%F0{adR۽6_;wG1w&O)G4\ Bx[S SR2lSRKRsmLKJl KKJmRjb89sSLKslj̼CZu`FjbnJ2K&jxVmO9s\ R-*TnYKC{(/3s%!u ЄA ykgt0P'v2IE['Eߎf_N/f%}LVFKn*qh__ ?tt|4$NNtJ:LgGǓ)]LNDM\G: U%2`5RJd* Q:o2zO*H+ov`ہmS>KI3bY=1.^,b޽|ؤIEGIEt /xf$w ;1 {&*vR{Kze$UC5pc>P֯GRBeN`|ȿJ:7Լ\5=n,Xx`an2P ύ?lՍ{SJ{޻p zV( U%2YA=33-b ɑLѢI'to UeeIA~N}M!]_tl3ґGzv;ϵqzͭɎ;U ຨoE1Ccܚ:AgMȸB^f7q@'I."iW犌_; E2@fũ@8hCz} äL}HYtnx/({AD'k򳰛KJ0✆2 $ #SEB8h͟΄R }kLhPN88+0+xME0t`^^tCc@֊!řa4N}$4T*1-?fՈ<>-ľ )N$f@H~` O@szv:&vΏ./bH}ëWQV= Ph?N5RP0 ) D'~g3c/tZSr)hi]vYVvr9}:u*9ke D!!YaOϸ/ge*2vqX:s "|` pfm9=CQ nnKwwХ̜LxAQDvuC1fe @A+3}-ݺX 24 BnHmB`m;i|&d&ȸ7ָoa,*OGǎY܅3<;m -ZӚp ay,kkoՋz=׫ܾ÷\XQofy(YD_6y̸gJ(?p,HkՈߌxzi5Ǧon>84m,^3yqtѱO$.#)E]ھ3f\^}gYTJiٖ'~à[iꂾ:ӆ?~~s2*; UM)X-ֵ$,1]f2ﱀ8o9Ґk#t{w4KYAz]H4xSD{7v .+Dcg'YHHVU@<9;QTE@'/=dp|-}I dȐfUd?'9~XxЀd9>L l1 Bp~"-8t̸e0*dh˞9*r x j< %7/0DNRvFֱқ ϕ|vNC=&O\6ɜL- *xER4ԥ7ӆʴHVDQU d~CpU-Zp5J~~n 16=2v+)Y[_x_^}:6ܮTeG __0K.AYE%2MEp12穻/~ HPUmg3D I*?<o*4==,fYju;uG~]RGc,VjO(0ѱGEjЦUmnG}9(oZc78Z K0nB1q{MN;ng>I_5؛cl\ߩc/̍Sh(12^q 8R~1GqDU>ɋQ&wK@(/3W&!SGƾTBl@:IXGޖ`蛮|'kc1qg+0 zGsQX9/n|z#iM5?-`#|3!ކm߉.'8*b=㌠-uL6 Vxql[=i>J~#VXxMjiEGZ+4Z2pwQZk[qTNp#SxPo/x!E≮[x{&B|B)_biC/Jؘ 5$x{!B|I."Ē g$&bLC (xm1O0S!R* +EKf?>ͳ9|(W Ķih:HۈZS݀j*1lqd_&@mSշDhY97j[@Q c 8ڈ}9~X*lz6ҳqW1a} Al(n*yo:M@هSXNbPWv/؎ႇ)WKh~HdIOiP;ŐMcVIWC0Ȇ$:6;il¤,0Xl™~>ix~?xOx340031QK,L/JeHΕz&r |oL:cQ囘0)JfŅ+;0ywPeIiz \8 UܾIb:vsSSlʼ Mc_s.ҸΒgP{ҒLPoO{8AUd0,!}.7ϳ.? ıJ$x{yBS%{ݹz Ͼ({ӂFB,x{y9Θ{;Sf9ŽvPތs,xPߟ^줹%$;;XgՔϠ>`*Ou=}/B':I) |Obѣ"#x5A  4dE{=PgHKr$xF~SSt,:& //ܹWxTk0<an7jpc;teS$#S:i ݻw}|jBKMV n+%{!oqBZ3FvG4 UX2FJFUc:Y1 a`P5l6\I|r.7_ f t$D@ҕSI4 L*(ӕtLa7b;,.jQYCB@ɠ3 X)4 QeG&iGe& U5?NVQk@wfQf̖)iWqBJe6 wD]ڂT@}0\3%\kܐAln2Eyj;߅χy|wkހA_k/n e(<ՙN>$:ޟC7ma(`F4m 4Qۗb/͛gBϛӰDYi[Ҷb=;7*'΅(c Ã%>ГKˊxN&8Qgqb71[ u _/794GOwV~Hl!xukC=L%n?xsC,|;X&fILJ(x/JbB._biC/JXll?K;'FqfUd{V9  >x[%/'-G" &clϖ M'>#EaZ6go@|kH<ɁlϲrsrT%lĬ Rai,N4\ϵ2%]xuQJ@EJlEcRoVHb2.&٘l'~''y̾>/޷jm{QcT hI*%=j;a\c\OQ]oA{PD2%exN,Whq9x}aN*,_pv<3 ߔYcTgS uhHpn=QaL\aS?¾H2T*3ۡą2QOFX)jеV.3?]"a$3X<(TeQe쪟NRxKfznP""b&PIez]?Ng$jֳ)RlB\‚M5*Ox%GbB+_biC/J8%7 $x#1Or4Tf^rNiJ~qjrr~nnqeqrbNN^faLN&62x'QrdfdĜbԢ4͓9- +x(yQfJfIgWxgPp `[˘ Rsr3RKSSRJK2JsA448ssJ2sR8FnvIjnnXnqe^Ibnhrq&'(*)@4r&-[`h[룠J@`\4(oBV,lj6˳93ER>NMn0ifJjbg ]J*J@^ %T-d ֹYe-K-LOI-((͖ؐӤ?&rxmQjA%"*Ⱨu65 CL`4b0!F\ġ.SUMz``>"¥0OpŪcP:{~|[}ӯ w> >JkhW{ttVKO/|uE yUyyHkuɅbY}>3|׻;%78) Gp)C-J+H$a .jd,Bi䆎=-rnlVR6r6rSSFso! xCop.IAp^Ǒ ( H%)3s??wNbzaa:&’n$ %0MjJwϘZ^b judJVzdφ齞k~ͮɋWߙ8&s&,Wak׮6d_iIƠyVϾ ?\ :/]DxTMlW%% mjD5,bi@Bժ1&^bt}<.֦GG;p(PVH{,zKH9^[=$5u7͛oy<Njav)w HgĝZBj]kYͺ/qXv@-FSsKc{`3N"P jҼlZVT*o`&tsl۽&`\z`U|"l)sUEAЊ%}liD]⩊x~0N"8:4)uAb>k#ړGd7KWb8a`3焻PCbQreľxq2W %M.{x`ߚ>9o4kc x&2飳o N pef3rA<ĝdc8 Of_'*d#= [#Y[\ԸN^՟vx{{m ,X{Ooǝ\bRm89"@9DiŁ^>|> ȌpN$ 3^= \~wFISsARDR!e52_GEzkV{jck&A{k 5n]ǺTS.Ԯ) -p;-pѤj;0PL :Q#[VY+.U&IӸ$"<OT3{rVӌgr cXڏ3"]/FN%tv{ 3D6A7Fz=xVn6}bV1INޚQwlb8mDYD%Q!8ަCI:ݠP\̜.ypt8[܈^鐥)\<4RUdRb ;ۧ1:*2)A(aeև4T4beJۊuI"4J.Xq Y2h%K YN(q_Nˣ@*d$@TWdNL+-dNvcO.o\F}*B!5'ᦰ2 Uepj\7pT"3p U$ dm!.{ϩ<.]x.}Nίn&4Oxp9=.ʈSkO"+R@XnV >?bb8%t8<ӫ1 h4On.c݌GW'>58"qU`qDo diD {L#p1 AoW>X*E!t1Ę ˥K_E>t+ၿC8=qBtW5K9mo)UDLh0OD14=@D˕Ƅ;)3\KF´*n󠭢Y{4 = 96 PҡA "ȁ,"Ke^ \< n`2 69esY;qZ@7K О0<8 \Ju M.A6I2-*Xxq"Qʵ۾M39LF-GS/KQ d95izdmN$sDĆ;Pd /":u,}q0(Y!Swi L(p.3E|]=B<}[Rm`( 9'0lTZDzV`u P@uuFJ \'rN8K"84=%+?ٗ-Z `X2C_ƨ,M٣^2\j*'%oQ4v T>E "G2!e_{ w5Cd,T2/2I&#{dyGFeo2py3hһG#ގ7n `Lͽ迣VY"%%RbK( A!2^41 sP5OsYZZ UYC{άh~*ʄ[-{r'T4z =bLC_vuF*},XИ**3N <߫\#r(^/@7Vť1H)73TK c~UtS2jZV|t=:Sa`]땊f58wӗWhKW |3~BE\W۽/GpW+鹤)#An0tLP&dR!CJePS2J@GzU5ZpRXxq 6bA߻gtl bRޅ·oӺ^=O!}€_[ܔڷ:ѥ+9pkbSOj=_uGfzaF[o#Oa'obFm kۡ(؃=8^㭂,ar*Wܓi =ѧ;J=R)~=x5{R=(Rx34w 6 GE b bx;$xIdB_biC/JX}r<dcg''gAQf^IRAbQfqF6EY y3 4`@qtmP=`9WLٜThd1Pl*H&Cbr,G*C!x$'?Aaf&V\Ey%iJEe?L _xYksJ s!Ə+UlZ7N%)j, DH\=[{zFx4sgU-.}^҅ ;GsoIHeBԓ}!M=ϗҚpg<ȉPWD#V,c"<|))F;z"2KXB߾BIvHµjOSϲGkI‰PӀK?=iWjJhӕt/FwmR6Hx0@߻'5%ǒѥD=pUM[d b  *<؎Cw@"JP4:73_w`a 牢3džp0/k{o|l4FecЮtA]7h4uozNGԇfϲ ㍔ݱ _Ut,{-3}pg۟玕Ґk U INjy}= X*8ٿlt" ]oorn,n>d @$p!Mb?|WcY΄/9vXds &P.zDZԊB޳gRB YSk }@`S,sBe>c+QS z!y}QV$f|\Z٬?VP㭨RɱJw Rê&6hiٚ25ѴlM4-[x^&ͪ|ܠeTEӲUѴlUyr5e5KII[Jib &H\}zf943[xi[Z M̱m<3Ys? ͙ѼQh\9V@6@&xB@J[7MA&xBFN!_ 1ܲﷀwz1- Mqnoudff H:+-dO}{?3__ngh" \ZlL\5.uFW7&N wOzj0Bz[0j83:ܮ$<@/ @>0 Xr/4tGU*Q'BIPg|~*ćE?>TS^%OW 85)o2$!]_ܹeT^ TNխIʟm7yi_'q#ߚ<ԯ2u9.1xWKlUUiIuʹn&n֩MJ$cstu"Kѻz{ryT\g`;9P-b;l5 0Բ,ȀIwzVQbyKp3g rK8KҺL@Hiv,\'oDisTwo OOZfMk{G܋&KČvDL<},KDb3$4&㳱H"VW:i6zp0<чqf'n{f$JGm eietԐ9裶C-Iywt|dE7e2&qP?L-k^OOztM_t /CnFF.WQT8-(' (PfaMW*Iʼo@|%8Z=>GcMnF{b}˨ 8,ZJ)-~k°0y^ÕŰduZщ\z¬‿N7 T6e;7 *;3ʱ [ /o8b54ɽ7ݳAҖ-z`~U{2vt}Ze]c$6<5?RHuO ;`\ C1&0J8>I5u 9;4d 6J'fXhQ ܔdE隼es.,@ťM;}Ͳ#Ol'tUlzH4vbJ/G7S/h2)-/:1Bu'o{tE{|QkNǂhGb}c-*["}ؚGwSLib {*K$$n) *PZxjޣ๑UT _vYcov%9vQK[Nyeg{0,GlbLnZ0xq&+JX5\sorOcY!^L9pխg_BQ4G&&)xHA?sIVm 6L$X `PȾI5nuV/끤^`W~JO]z_l-@[}>>uN?TO{#*aXbNF#;<|3O<;ĀH=C g<5v[G%6 =qZ@3 סSTx*yTɳEY2&'*y;lf /x{*yyI<ݪԢ\ڛxap oxOHWX&4$Z -ZLݐ䒰mC㌓)mc({{3v`JuOU~Csww9e2:AxBSc63і] – 'X ENqu'_9w'}ssdA(-J{:>hlho VќKDs(;;8/clȿ6 fG΂`AH* n@fuO%d,*'@"Π^;ϱ=G6G`*K`T]d;me!4Dh.{fmR<䪈槸>N Xca篷0,|xPfaz}~`X-о^@, -4rtqeaEeLb{͒&:z4TgRS6XZշ<5D)do3m1MY0zt P*#UEMm"f{.{e?aW{lm}b1y,Z'׬hx{srOi [U^G΃5v]#GD`=mvM$ <NxɴDħ w %;#w{qЯ"'\0^֯}^H`8{[~dBy4n=@Lms4SAK<&zq@7i\](Du#W+OeTvڂ̬7DzZSBOI5Unhf)\ i;llv:52 t&A??z6n?}fL +1 ͤ @5>B'{k}zOvIeq{22Ilp{PN_/*1A:3(S)%X!_b*[x6q'kũv*B{SMˢ8:^DLccc}B?_R/\J*W*\@cì b82T*Lփ~>\8GE )k R]XKԢk~ _e' f,RvdR"jmG˘AYp9 0VCw ZXpaHHɌ|q 1_(2TBb!ow%WWv•fDMw0_V٧D nHFaҋ+~c3jK LBq}_jc*ŻU@\\. =Ju]|g~d?*f\Z&VKRf0_F+~n4g;v1$ e{=g"@ Jf}>Q'?8N 9ҹSNy 쎳Y࿔Zzt' l5%A粮y vd[ 8G;4Q"ގ3ėC1bߊfJC?/CjnMZ]C Q%"VFrh. ag* KUZM <})?eݞv87 YsM'߮rݢߩyyOXkϨx4BH":}iuf@Kl4"BpTPUClco[A]ATIM4jKe."g"mװRT=Pau=|{{uzSz ?-7%g.~Lk)xSbx45=+|Ho:ė \$$D+PX{?0/JĊI)>22&$R)JU~dkZ);(1/#l2edM氌ɼ.#dޔyl2 "_^7暙K~Ѻ^dPC:^8߲l{#Ҿ5}{ Р];İ fb,}HJ\K5I!zm֓4ǃ{nP7(N՝W;\h+0u_vLIe1Q4 ΍F(o:(;3Drt*IU Lf׫qβ! %,CRI|hBEfxo@3 @Yyc. Xt5t,[6a-iD`ɓF|7}'0{0ƻ2mKz~]s])=ZnI0 S.r44`5g zZRyx;RJBmTE[UvhyVf)3.~A&ДkcC$`.| WCxݝ}j:FVL6>E8D(0#KɲP|_]ZiAbi_ܧ&A`|~D4;([ kpML󤙼Co粰UTهRmԬW`kUDtw^Ytl !łmMlKq<_VZ B$e^^u|Ա g=e !cRUa|`tfuTl`rJ:CI' 5f5C9J_{5}n+Zϑ)ؗe]G7$dȮ#F7kI` Srz' 8GJx{SY]Y#1lٯR8 Xt=<Y" 0nM+#GY!ɞza o0ãzT~]O[Om6V2LdjI8@N(l#Չqp֐6|>̰RgK%bj#r,t*^E1m:4027{ :3[ĭiJE-(ޡ,|ۋCgwGĥpd"LU&h;(QJ>> 0|D*t`fkEfxJ.^rǰ[ GPLɟGhb. cy흇R$R7flx#'TX*AIT*Ƙ J=]2kE\BJ;K. wN %\ZIJ8*#* FהРM#;8w@p˶#vZd>G=[?wUo01ݷ׽ty/kv` NݦA{3c?)n<z'%Nl/q}(ta(u[ZgNPΤ=s;BؐQqwviZզkVHQ[*.K7y-(__q Xl$jLt/ȗj_VcE3Exsjco7 Y~{!eߍFU||vi?S(2J| s[[x*zSpC3Mqjrr~n^Z͚,y%F% Eϱjʀ P n|^bIfYϬ甥j$kZsqrrf)h@4*hnϞY\Y\ 6mr# HcIQb^qNbIB50zݓrje  tGY4=y)۸RsSq&v(t9p`x)x[pB*_biC/JX 5LxRn@V( P@&D*EqV%4DԂDPo+*7 PspGlR^z7gwײUu: 8Lc<ƈ(')?U0׵NHqʾG'97(7OHd#.u?&È Y@znȎvZtfUZe <S ++@v@v͋ m T$)֠k(jzF==+lٹQ2oݻ0k,01nlϿ$|TK־=h_ϑ|,JI{#+齴[=E#.hՇ3ޛΙ劶ynخῢYa63a@Byq%p)d< y jYpHC]Gg:-: /O)--ȏvMXUVrXƩE,,sSPWdmE$ S.'NP!?5A<x{"Anu42553"'5OVdvE `03͗9Xq6 ?x CnNԼ|Zո \̼Cɂ<0f!+~7+L(WTAS؄E3>y+ y9<_x! <Γu's<fs ռ'Z@ux;̻NhB6_biC/JX>-5'M/n2;BHFcBbQrFfIjrIiQBI~vj^1PZ%EBAf&\ʙiy)i p! ?3/I˜K95/%3MA_ Ifr.kH13$$Ņ*_π`2gBr H-;@|NNN &/`EBS*I1ݶE.Yq Y'L.ar&pl^Ȣ89E= _D[fO>;d7bwár fm.9?_*z+}crW E2`mijY&Ŷ2t]/nmdJ>V'~#FÉ^mf7n(={{7fB׺XvĝWw",mǻqW{UmB/vqۘ.wӱ٩Ꝙuei͟nGwxS K7){ULG[<8;{MIei^ &6jcbW;tZܦ`@лK揝ݤ.{Or˄nIh.ĽU+#8bVYwݰ-'siWMw{n`߸?~&q}V}\'mԫZ=4J—pxonhClFziD-wXz܋jdE#?n^-cmj6isH¨?2y>q\zdCv<çث{Nֺn7Җoe5zݪo[L$n8ݼ]>ArsTMů.qJ{0O?/f3)EL{IA,qq`^%yoJ7לCk @*BL,B8_ۗLQy!IY {)\+ 5%y 8,@, ǀ Q),|J6)/u: ėDZl>_,Ɠ37ɏ70^q1b5O Y0n J9f0Ḿ%q_)-3ʕ n3cK_L)9>u;$T*k GO+>19+ 1Eg%bh R)d(D 1Oݷ|$$kKpX%Rh /x;*]d@QjZjQj^r~Rf~^fDm6(kR@Nb^zibzBAeIF~f(͓1 &*d*doc{(b<9c?WbZIjQ|qirrjqO&\ 4~x.2[tBYEV\ )f&VQ.ŕ_ +`=#*mc:ꮫPLSVP r ww rPUP[PTkP֭0ٖSzE6'-sFulrJi> jjs*L1 EͽqL O–*ݏkob_sP>#΄].UGrY[⚐aclTEbxabD/S1y/D$6!GW+{s_,H[&CJc4.&ӭÊ<% cg$kpx[ûolFQfBxbNJ~M2W9d&Ng+XszyL;U4٧ܗjMx-M~}v~]̜͗_ D)x&MaCosw|{kBzAjQ&WfBIjqn XJZ$#57=5(?H# '58U!3$1'=V+-ss&"Jx|㌏o_i#9ᣴIex31v^|tc'l=#LdOQJQ\8fJL͝mVhnٯ&4s&ı¬^XhÆPR@iѾ55HF<7{vk3K[axUd_Z ]\B^4D#*ӽ]۽kbU}I#ⴶ #@! ,BAKLR1`?JҀ&Ck9¥Yb̕hʿ"cX&wBqxUչ&SH ,6i?[0*HgR(< 2# G؟/6 dž x340031QK,L/JeәvQBjeYQƇׅx !|S2sRsoߛ%7&j[̤ +][ECU•UV0\?[Hyd{7>. *375*+))b`i"'zX.Mxq7 : y: FF &VFV]&o➼96rc643̪hdl/ GoOx 0S558UaJKTDV hX1x;g]DA/=$3=/(YYNr k{Z$L$;5N_0&d[vsSSCcݤdĒbJ{7 h{7e#2'`?'V7#UvCs䆇O? t΅[DNⲛ]R49!3L83W7(9#lȆFo.oZNyі~+04yq"nDT8]?DhY^؉y/p5HG.Uk P-a^+ȌI-KY^@*ɂ׻r-ܯazSCݜ̲TԢ̴Ē[l9CPkpk6R:xPֆFzƒbi,x:Zhy/Lk9)@k&Xvm8]aCQ tW[V}dNX0@>]kIjަGk3Va ݤ̼ĢT[4k?|'6n_RanTtԾWoVq|]6@\U{T Ӧ&Į^w 6{C?o'*2̋sXC}*Äb:z,N͘)oY/C;:XVY< d ݂xT=N[ZQ뫤y侳* \8L~[ϯy :~:p{~6}6e.s~y;wK݋:iՙYZX_\YS a\նʀIL_j'^kvz1̡`mc|*[ fiJ/!hĩ+\Dպb*5:OZ}S2sRsZNU%ԅ\uN^.g."2M1Ґ-#.:?6(5 kxQGGz; Q:7.}A c!}AV51m4ltests9!j-=Z;;9773-T[q100755py."?ݭ@f!sֻ2"g' : L$xuQ[ Q*מlI I 0copr| g cr~;ƴ}@*2އ;b-حX?zV _>:=#,l Ḗm>:c^9Zr\ ?avi$ A~ҽWlu`.lB#Ҿ ~BY< y|#=RN?/.ww1rh]GPnoH^R Ao0<gje uOߋӦ@~4OV!"xmAN0E%͒7@HHmeF&VxBpv0&y;}?ҷ#l5 V30ђyx=ߜuAv(X&5(U>W+(7<6iGZ9.Q7%Vdu1H֏Su,M1nJBڀ9);Ke£inGAÒkuƝe9b,:32/| rq?43oH E&%ؘR5AN<1in+s:!zmoX(kTeJ6-y̡;EsǍq 'FxcCnNfYniqjQ|^~IfZfrbIf~څ .x{cC nRbqfnN~b ^3!xűsCnqfnRf^bQe|IQj*nNfY*nRbqfnAZr<=xys.)S3ݤd̒ԢĒĜb.} vxȺ}'3h99tFÈĜNNN?(@oO g`.3\bNԒҢ<4>72JN>ɨbh` dhpA9&Ʀ W ' A՘X2 xۨUyC"3gif^Q|BbIIxf7, ^BjQQ~Q|nxx%%: : j AMk.4dE[]WyeZL*VYZRZkhXsr1Bxn )riT/jKJ=F&66fyC:[ 430zPfi**+54LH#Kj9z=>Z0&}L|8a|ץ=*ِ5j?i#svVӬk6z4/=L*Z2F*-tS*;帵}w;8 Ӎ0] 4e \B(F3l  $Y,ЅT6wwoTHmw¢Ls"QՕY_i[`He @~h:Y-zYe#qŎ@f9qC;MuCg~XG4mx[αcB%_biC/Jغ{ $x[ɱc hFIl%'0*La iL>aIv.<҂L20O7$44cf,e˲x{L^ "fxu@ǡUVA +n=,lRdEAdMv-^|O w|'L'i'|}_B=mAyON$)v;g 6u]reC[6|s6 V 4{$5O{j[jv@_ӛz%KƐF,2%Xh$I7~kv4ž~Kd KZ~+FIQRUB͡cr{I}Q-0Mf]ÜP199P1l[th-- LmcpCsHGţ^\-ѡj|֜m ]4-ӨУd@>҇3⹦ȶ&qFTH ~!0qO^3v&d#&O?y 4,y0: /ZBʺ@9ĸP#7MbnlPc0'\pX˳tM$dt 6 5iJRW E$An޹_W-8"8 9qin|R q+_"su9XDE^| tYXnHњIlM( *tMc&8yuI,"誦~ohr]zT* hAK'T*JV /xNg>=.NSCݜ̲TԢ̴ĒayiE@%38ܼ-)<1K21dLU.͟&5}{E.̼ҔT{eW*tX yoU=9Iũzzy '\R`VtݛwAL5a2_Xk`u Qd%]lÌ'~ڣ-I-.)f·j>𤇧fnT>??ǏZ?S.e2V*xx[ϺuBavc0߃Of0Nf%rt!׼ %Cn>>?L'"WWo}s~<;W=Cˊ!vs{1E4cV('3k:w`FJf~K)MIe~hʿo4l3ج<)8{>!qiA%% tzYϳ]cOCsj ToMzDy\Z" Jox {Õ)%/9  /x_][ORN&$bq<q0 3 :Z N I 6< ?j!H40000 include2:> 9&Nx9?u"YԉV<:2{hܜS|Eq:3@Xv֙18 ɵHx[Ϻuԍ<ehPbl΢M"mӌ|xp?u"YԉV<:2{hܜSa2{ǯ{ y۾5pϯf40000 doc`8K_d`Ju(uE#,ur_{$o@4x[Ϻu%F3Ll5,+-*Vb3ƓI ,xOsi抃U L f:ef_10t678fxC ɹCl*rRT&,$lx5QAkA& T>7d!`[,&)lH(1fUċxͣͣ ly|3{ύOrR%%ZNKX^pL"C0@CʬUvUJ >ScL]^YBEIx (Da ˺C ?2A xLZ;˻t8R z: oj5) ",m89rú$/\WoVzCN_3;[HVvnUv@O[L^NovbPi7mS/7!|TЕqGk@vt$$8"H0\^WeGeC>&{*,._Ik٬iqόH0'& 2:*aM|bLqKm[Q9Ux`wcF?׻ yx%? 0G?/ZD_ɇi!Ptl>?L'"WWo}s~<;W=Cˊf ݷ N߾}`b y9) 25[m's0=L涀؞fIg!ZKRKsqw\"ң+s57@sj ToMzDy\Z" _e;jx9>sH#WZ6!?q0U~Gz&o@fWHxYO*ʕhuStu4BP#et}h S 40000 tests?Cy#@Wh T&gx9|%ʽ8Ĵ9؏œM mMq[˹1T˛!o@] ZGx[ϺuC5dC{f6^vVztb,x {Õ)%/9  x8qBi+y ]%ꘌf| 2 )x8qB͏nO~d>'߆U ,x31',no_2!}EQg29_L6]q>r^/"NU)NrS ۧדYXYgTș۳/pcވmW[altńi\>٥艑A_7+0{26w~/)՟3[sݹ[DEءrn|zj^|RAެrs3ֳ\ MQCGT-֧ygZ[hm7P -hC<{RrOCo_|m.{W{ߦ=[ƹ|˙uW[^h_VgC󬏬"N4yLas`֡O\U9C f]Ƀ$5(aقl=72bb+' lx!8CpBHdƞņsRrٺW$l;jҜX?g}039D!%I/,&nƺp:&cs&wFcn։L5ۛ81\n|:],y1Vuw|گ gTA2d<4- Ȗbu-)oA d!G~-nȫ P-p5icг!w>pvh9 x{3Ug5Wl1jx!8CpC'VluR(hr Ixxۑ(w7ds9>l.Tua,zr(d>ɩ Y'i*L.4KQd,G3G!Jx |%ʽ8Ĵ9؏œ/x[ϺuC5˓}sgzuw/fL Hx31&J ;Ν&{eaegŭ_#mP&3;yϿ(*a#?L&2fqw 11[+ZZݩ*I]u OךPaz3+̗J9s{.~\C3Ģ c#d ml|K#coVdajevm 9N7^R0 ?%I/agsr_\CۏPԼ4߷Ywy?fgx ZlO^o BUAZ2(xn-䞆ll[1>;\Ma{s3&b -?dHEw4V]?3,r:tIjx31 x340031QK,L/Je3]5 oeΙ2jV 7MNMIKe9Mb}r*+NMN--,NN)`°q7 `U^^fCV Nŧ0 =xYMpqcҒ-뮭6%C6k0$:NfX[dmfrIs=3>t:={Isͥ3Mg: Hɗhl}?{~q+ĸf&wh뽮eٴr^7>9U=r~͈흝bf:% f.:='ܱ]!\ jsfgkr6N鐮S˾\dEͶqmk__ՊҨ߫Tɏb.uqz:Q zJlנ=EM؎?q㸼]?:t𷅾JWN;K2,)}?ND 4v7TxbױC:v1>^?PR0%GR* 5"U ]ɍ2 <,;V% M!,g}l_pLR/N U6I sol#Tq1-쌭/"pKH Ta!b"|+ڒCt0dC?k5ejY$wу2KZMWnHtf*JW*s:Y[o2-jXApi"݇Lݩg|6\JeQp %WA)GBn-'%WںrRZZ -y?y}*!xNnCMK*ͷ)^H]~mLM+ wef<ቝqQf| YZi2g{BX>-$)M$DJ;4/<_Xh_$A X=g.b#<"3AD5OΆ g3 <ʑv4Ain vT vr40Hi~GH]!QAp!-DvhH }3 ⎐#HBf4E9Rzj~(&61cS ֔Zx 8fws$vTOU;ݺ _Mߙ *5{kZ .pyO(YnK-mvGQ[xW rҤġ9yrf`.~zTZrC\S|U]yLmdn)e8onK܁t8b8)@~M<H/26:*_8Vl{}R( Am1O;w7XƩ%3 U?=qs\7,dx@x鹆x͡H)xC :1)0 g#Tл6%O;pr;ThXe*!&'r!a1={-Jm bZz0{"ҥif[b "h‹ƫ9' " `0a1R (I: ]fY*fMPnS8(j)d%L|ЀDA4Sbm ͷ,`q"*i^hФI Z7]p@8q-f '<;u%`mr M'3.F*9Ebpw:͚8Szz,H 'WoVT%yX|ܓT#L?T84SF Pu0?!zrc/6AݝVTthL eUMdש*1k ʩ'O',x.%ak.AADH1?O.~V r =xrhm,6_}S̀쵭s~=~c\~X7ԲshPAj@y# [pW4 "N2Q$j%17s;eXiJaVHԮ2"uD{1T PV.sT eN8{E!^O_+kM*sr$'T4`?2#B6vݝ}^.1n*#KAS_҄5Qز.MipOIt[> l%[`cH&:?.$z4Bؖwij47~+/\V7Oe`NK2mBTQ#OXvs^űjt*#$PTZP1Ф1$:$ "QndWd(ktPEB1xMv]M.fP?D_ɉEAˋ+.ma,sWNye mmj/H)-"NbL5QD m"GAr OL6/8 a&.&hk͛]>*ks[۩L!_>F?ȲxL*NMN-KJ,J-,NNMHMFJ)-qiwxUQ6~طzNnR^( wB9j(vh88P23of0 BFi)IE=E]QS.e0QfV1TE HXʕxRk\cQHy@#(T{uFoۣ8PIVzA/05?+-&!k N8Fe} GG~ 3zg͡+J΅_{xѾw˧3Mz6oI9IM\z"nxNƦ}i=d~WՕL5Bii(ޘˌbdJʬ KFN+֨j iߖ<@wlZ_eCCAۂw5rBN,_.ٖY~f2{:)K?A 9gugA}AK"D'iB0^./i|?QmZx"Sp*CIӤbU @B0e_@Sc# ((%2zU4  `eLq'Llȭ,*3g1Pтpx"OɐDE}5e!?Tf㚦ϣGi4oDdID[#\EeNMQŗ?s0l2x;*BxC)Iƌ }BPxVoEW&6iTu!5IܴJi"!U]ƻc{;3cѰ NTYk? \szm!wo޾~Yb 3mI،#ƩÇ^,i2ӱef)<8([ MmmVf3)OL{zDNIz3̼M dp,K,JUWO!@k%} ӱeţi2QƧɐ \8:GAl,!^ eb21s(0tBnt44h$B w)Ј:VD%ݒ9Qa6V vp\[璺9P!5 CNq¸fN(GPy-WC97wz&jFW8r^ Gh.,+)lb,+Ht'H9vr$lr4._UZ6\H,-FC,i $z)P1&s+f&蘅Q 91%yq!{"cNq[Pfed~[ `WtHd/z`ԧS;=TA1ӹ&#B&\=<_77j)~/]_g[׈Ao#X~4F`j<#bsćoQ<\z#Z->I93LB{ܝڀrr!ͅ6p m0ŗIT[<2`M#%ejxhmzfM|]U ch{`=pa<0cr0Gj) iyMCCϡHU\עq+q] Eqa{DMW|bsCo}+Ϳ&:ΈG}1\(naFVE4l~)xeOP:yMjVY.} ?.(>, [Yqm#|WW͵HAU]^+$=ꩿZA%x{59o\n4Բ[[F>> ACM.NN3XْSL&留`r@|\ݛ ,Sc:gxRk@FW&Uw^vcdlЭbaV8yiILV+{A^ܼ'xг(8MlĜ&}oÛJ, KG,)&!*~fk9<ֽ<Gt ={j,Nɨ^kK[?( Z9ƴcqqyz:\j;Wb7h:ʭbәwŜR XS^cp%.+lu sS yݵ[4yeҴŒ/i~nݰ} ?oI+WmQSݷ [K efW9O5~zGL!jp?9j(/E׎ lt+/xqh5'/9J?=H#-(bo#qv.&$"9U?MNc0JW(54Yonўe'haojalgS6xbkS7e=;ǂ p@i(BHE^nf, 0 Z׹(Q@bS- θ<P-Py(qU솮#euWdD1 b1L0b:\2yۍ=#HL^T5$!j t,A5޺E{4,9uE 49;lfF*X-L1D)!d3=01p5f]Q.EwyEFJEYGv Z2# `!v9:nB s:Ϭmp.-]^dHrي 9+*F؀H"D@O~uv<C N!'ѰşeX*A<խcY=`(Z 3V*Z<@]*UJTZ9eeLAOeDgC*=9eH79 fdm[+X":hxgAiC,HJ}GkZn9lxa2+i$@҆p)h 3 t5g>)$0((2V𘼱 2YUpq(Z]㔑92vH H }gq"iqGD62 1Dr r$f<0ZQ"*W| bsb@DYff7XTnJ[;:=g{5vNEH[cf.X0YPuC5QH%GP"n:>(Bq92wPp]9Ui?Ns5VcǏH{I&A dW|fM@퐞f'1i,'{e=C{`jO4"'\.sM=~3u*_w]Ħ/ }R.1|ر ]kIfp#|"A¿!ThHo5L}u;mdt"LNd4awYhi-ػR S= KQ 9m2C<$ˆrhY}@88~Wќx(H-?!%葮>>?a%l{EA⧹rO>̴'@?dD+]Ϗl.JX'e EPhRrphiӣhy-M1 2QwنV%N_)A;n6uq\ҊIOe#,6Bƈ)H'h$KqgO%3c6bjPX+M>R!hE:T[h9۪-;Fp^$8q̤~`&)#3R]vTˑW*&pEY]O*Mi"4yYaFVki=޹%=m@64hyHTpUtPL+(QLku񏠘hTO?K蘞}íA/tCE6:L;Xz[XGmp8l<\b,(I ]A V!:-(eSH|hazufadu\V =;\Ք gܠ&{sY`A7)Z=UJO)2F@'ޥuxciSl hg0ӃΠ.u$\ %3AD?m$B]j.lBU7]Γ ^2/9k`Q$D8tĵk=LGa:I&al ~@EO+`|q@dB3E6?iްh$O]\gԥX||WQ/{-N-jPODQmQxq]@K XiH[j@򠈕aT"A"-ƃGcn&zCA w8Z29&HL\xkͅ*<@dᠩNtw \L l!,1)#,F*.IQOzI<'fQ+#Suy+<!rN7_,>}Ks>{}yGHO',Ҏ]稹pG`i#hQx %)I [@#^~IS!4O,_0`%11z "Yo|WN(X%؞o H:i!xn0ߡG,j{.,\{sH(ŊGO$.T IDx8($$ ٞxׁ:&$)E?*DD:& EQ s28)BACv$p)Ik ±&ƣEiA|XD%% X":o͈@5^w$QH;dE"8$ȪyiͨƯu: sh?$xuUMh$E6cfaCfɘL2OwgؕPTVMDJwͤ6SRzT(}qo @=Y^&=3u}^ի;o֗%b4?\?җ•b^\(f!8r@ ݛiA ye XrEgX!=êE}`~JKV\zԆITqZηSjq^,ꨇF BizHdYI$xnpo @̤xPqPVFĴ$3QgE ;l¦pl?zo8ĂSb keH-GAѦ:ڃ]_0|j蟏mtMN( FG`x_-W#=@t*ad6{)UF;DVe%Mj"P"V槗f%NkqK^6<=#,X1DC-.YVyLOQT;a[IBLWǠ->5g۝eȟ*UkZ\Y6tIdp &Mfjv])8)ל6?cCY߼5*vXh<:@%͞h,ЖT+U SG^dBMd8WqVRNz$Ѹ"*A%D7Pa$-1Vn';澨9/PxCkRr^׀ ^O*!Dφ;Sǭ!D!46a5/Y@E DԝkYAdO>aqpFe,F6Z#fe!u~lXpϗ+av1UQJǜ #w.zPͰ uZ&bF[ 3(I&JX3F/^/O8uO\,gfF(U%_WGK*I/x-ڨ+-5RZ:װ&,DPD!eVv $ʻfQ ?]\WD!xAg'J˥x=$ϱd&˫Ya<|Ȉ+lBHĥԶabŃW٫8jJT+R\XZ%Jq*塪B}RUjj/TgvԀc>])^Xj!u:JC^_a7znh{ "%©z~,~C? `10S:lm}!F5NyY9ݵCJA]Yol$.n7"&$n6!L?I/ B\RmB{wXgX[zdW5`CͰ]h6i TE-ӟ6] y[h "?߂?7(uD+ y:?kEO[ }Zw 66pmi%s[r|V܏4 Vܬ|Z޽|0在N!QN T3Zola~e u"]g; 50B2N }΀zɀ:6`lY?ۅZ.sW.#c?Fݞ9>2-iGY85/w IyNR&ֱ}:.MX e1.|iB{~3˔|-E'3EN[!2A jwʂ}~т6ۍƁ\7^7wc-=S /`ч &:\~қ PҊRN/Y:CpȞ366@v+dş,^PBJ~u@g/x/o>B{4 j#K? Q)k '*FuaHru!9. ?ׇdG;uC?m,׏$e' $< '=xs  zi\d.KF?wes]qRY9#q[o;2cJT?n,̶~SI,xVHgeImIezL`6l0;^}ދr\: &- >Mv?:!Q+j?NoP:??'h1JM>F ԏp(-Jn \ aRWO&So0lߦ_1JMJ1]GJ Yv!^=knQax020d)D)Ϋ FGmsAnT""K]_9>=kԨP914&^rݯGFby1?QBich҃V$j/F_FG9v,֊ ZJܭBZsۈQ(B~5ڶdc+e|n롸cyH&v2^H'2f+"|F)_¦qlq?3yw7Ƨ1&0)Zwgm$qܴ&o n\Ki._")L7(Q sY^JpBS0t%oo*#U vC0Wk4kۋ{7½;>6|;^YsuAwbD{TqiE!|JaL1YȤ٨2Rw7H\rOeŌ|dPwB?Tֆ.,xURAhAevfwijhmKmJ ;6C($l&6Y"O -s]xׂxE C5:ALw({ۣΞ^/ %aKMpY$Dthh7aGS"ivjߚ "3jV3F<>݄#^媩^a:?Gd}ڬ :`21 12`ROK#:,ca-@0":.Y9MJu^^):PQz6!emUYjE F_vf 4te6Kfw=o%X 7 MԣNd& ^( %vEtJx}ۍaA+>]e '2 $\4 *:2GL<%F ~Rh"XֳXVT0>cږU'.O|{pl]fs]]%xmAJ@"AѢimW" 1 H40$Lkq r•ћ8Thqx|~{ź'3, 0fy ir݂22A(d5'p4< ?:VUSvv~vvO7% e쬷A !i #캸eR^!g^l'kbCLRJxw"IxZղ"XXU;$M~y3 Y?X(^hƨF0)COˁ+xklPΗXP$tsR763tQ x\r6}},ƛT.g*vIr%ݭ)p[xJ4@4Fbk&h4F~rOTu\&ztTE~yJ]:,QooVN=O^ 8TxqUɺjV]t}swN7U]&n Ӱ ?fŪ>F}뽽Uyv̓ŸijF=TJR5z]VYUjhrխtSJ՝nZ}OzՅn[@KĹ`E*nZMy0] #S?Uxa q:l xҐXW5;}FiR?__ԯ痗@iK*+<&./. ?_û+Ku>_^R}|ջ}a=7D/5|oZ.v,UAK4,d;*Wf7*KUYuT}uw_~jV4*_2%$=jìy7q߸ΦoEV UP.uZ-.W_ޞ_\,q~Ax;u"+*ΨRm0>\ՋM<_N ]|G}P{f`7GWߪ󕅖չN::4 EQ4A$ѵLty(me$> l\`x/e*a 3VK+qSHT7֦X.kX|tDC,, 胕xA.i,ӼoҰf7YqgnTEGG${+W'4:ZI!<:)5Xb%qҢNVl}H62k$n&k"ӫK pF%k0InJoI^%a+I7;}x̸i^a[ąaM0Uᴻ808|)EβjogKX$S+@n &iwZ:kmL\(p"l>tx$¡ P4]**(`Pq U'wn[,[28EpT@fJVLzp8;fupxt8us7:`m)#`x>YE|zC7DXK9s 9m23'cz3'`ȏeR^'4iRʛ&g,1d>&=8rHku2] ">#K' @%#袺ElaqL?m'op?[q1Rp P]Rlb>~fS3|R#3Vf͈NS4X Ϝ`CqkJ)dGN;RB0 DCBomI`n c Lby"Ge³&98%m%thA0c@;1">2Ę4 7g`--3 02Ɓ> bdHmlI^@֐X^w03)nmD3x>yeF$v%o4,Ak(dUu&=s l,+1uٌ<_ݱ.<GkhnsglÝImlB;[ga_ gډ'w2P<0ѥSXĝ g!X|狰; NT񬷮Q'XoA |H}%bH.49gE&|\ExMc wb}&YzVKKRrG3x1QI#$΄Cqcކi C%l \+H#zg-c '$:4WOt)(ss;ҘLqlaj _Dǰb5N.Oׯ^? Xx;81r!mx|i+@_>hxV{(b2 a9 oXH n N~$}\)q#`?K=bҙʱ}'ȹ|`,SL1`.P-XP\# ;`@"/b[J}Bv}EfGEL4_I [o8{oP/q6?,`;@);8t?;X1e N x"V=:v16E,v^a;|VBb8KPneel]u8~K>M5&@=r{-4'chEX,P3v o5RVc>=ӾlCZ%$~qadED~9Ba$z,hp给Y%-]^n|nnFs*-,{EA Uh)Fa~4.X\BW~s)g "HO4Ad\]B +S;"wpe]BdJE; O.eopٌ%PLqIMᚚ{oUAX =F{=r[/,7{׶4E-o= 2sTqPPupOCshU14P>x}0?fy"=9h ;s5 Q{{39/0?1,uV j!J-b7Q h?IbUW&?HtD"]&qG&}{)r\f1^_<'ق<) Ds"*MS6pt.nFh`j=!P7(C~&~m]u9X4.#V)ETCе80I]:b Î.xuYklWV?x\{mξc{ĩm1E(xwv3xf6ZUEE*eMSTHEB(_M(AТ* T4x~<ξ̾wQ?zlv(yn&zl"zmfkc: qˢbþ 3#]) n"{J:gJAzsf[ibscJO_JR_,@䯔a"̱j QXW~CΈ.;c0І`b_9}w(rL%nHg S[\DN%YJ>耛Ⱦ!l9ΏV8wL+Bg$I0 >R8yK)Sx))C^w9䉔׀לF>6Bdz[pWVT•c]DNV%JpG*\f3 Xb'M>[TZXo?K1=x7۔94v{hΒ11!тj>Y Sjow5NCa.@)Z0\ qj]cH焺-ŌƼUJj_qu8ȓ?9?N;DO8G)}sr:(bv(a@Peɳ [xk'c1pS}JwlZB>eJ:+~'\i“vOpBH>]gPOw uCwu|)D97 ,#&g%uòxx蓞8nK@2 |NެQ$dQ6wt߸!lsz3"g^ޅ&Xs4"Ӳъa1\iNpMXjq7Ճ ,!4%E-0*10Jԓ8{]4mtYz)Eo-bVÕYAcgS{P9; 5W{ /R8wz,QTPEo֍<%oagCh!7fm qmq}E[cE6Wqc\jj)>/n 4 r,ą8jϿ%?4,c"NM lU92%+ibZDIޜaPo{5e̾xģ|8>x]!J[4,a4X}1x̪B,Io ,POQp"^|?weJ~Q\^ äw0zcQyFͷO8H[_a/EPRnD/c`ǎ,(qУÂk5QJ~p p0ƽ|aRFT9?$Q @o23ͫf(f< NBr*"E:DRҪ킘.V^)~^ /2CpaeŸ}qK7zJb'Gg\УNAr;P6B|*>27)RjT..gic LR |4NS!5tuCFh ܨz֢%\?Eum4 u̠ޠYm꫆f%z,*7fQ^ѐe-'3^כZm)=`? G5cxU͋@IR QUvKW#]Z= %H&AU^~Iˀ/^((z`<C KG&#!ڗCף/7I4AeF5xxB^T h&PSLɧ .is׏L)n/!m*Iw\'ֈ؀z3c}'+XhߵuJdzcl'ACC:~odٹ_)-}*Ԧ2 rE wmjTDц煙'1q(ʫ9lY<ذFZeu蓕VGQYV^xJ0qP/cAjnE^v Y5aM2"W 6ꔉ(S㮵Q|m!V4Zi4Lx*M&y C;Я0h13% YAKUo8*z/17UV!78=8(/,Y㣣J)I-BJ'j'0Nehwn.txke;V[YA SQg x\]s6}~nvgIEr6Rdu31*~O$Mcz$Mqh4zR+q襺IRǛcuS$KD@¾&[;}y0t h+*+\G7_n^^]EyȀ?6n*+ojq\P*N}}bQ&qGW.GTsO]wЀhze_չN: ?j^ L_r 8h$eo%b+*#I݋fM-u *jm Gs<֫LlBpleVs*a=׽OtK)aҼMs܇0 LE p֕̈ۢf"k bc> j_σ5U# ,f3.ڕDn̙V7Yd8Md㘏^ͺgf^Rk mF7yVHd&s3 Vڀmi KD Jɱl7`\`Ka` SzȌli6=L/;Z#b681qP\lHnƍ.{[0F9cUT-#փ 1hD+qq04G jR<\Bћg:GL/uQh24Đ& {H]I. n!iO1|NO%n,غGr ΫE''> wәo{x$ݜ1{@G db,;c0 G<+]m ;o[s>\:e=L fr聑(Ҿ p@Xj9SLG[?S {"Q1t+n=!"]E.G"[5Fu%63 츦+Ex 'ӑEs"F&u= -b OEqL;+ z%I&"K̒Qd{Q7Unn5܇ߦ}X ٦YFRn`a% Z`Ѿj9⌦*OCvJ|_lvy %3#d}lWŌl:&H`$$r9O|!Э?Ywӗm%E#a`{%`m,7L)g\%rFIF,3p,`qPpf,ca ^?a |^`Ӥn2#T3*{uT'i~, )1iRf^m{)Nŏon'nli6yDU gM0ϙu(l;gbq* I',_]6&}]_7tZU >b5,ƊPRŭ6׎lB+-±n#+\R@$Lh\{\A}@  EtFۛ%^6Ĕz;\jɲ7 V $opۛ>s ^y \ Bм9x1u7'?UH MV?]Zk"gtsjdQzϡQAp ʾBJHGszT^l:Z=gIaȍD2rx&3A2K%4-uQ1tOuiiE~}V"f#Wı-ZV3f<{z#iAt= a&`[Wy=!Y.jd|J8հ?t7]0ӷjXsC3GxuXklW?c?b׻>~qQЖ6xwlޙ]vBj@*mJ*jVJ$鏀EOTY}{9=w~dGO=~ϥƏWdowܣ C^%aܣ5 ʮ!xb93fa&c3L/L a\wj^r`".%KfQg~5eḣߢrg)fPVc>SXԊ@䊔IܨtەW ,U  ]5DpYY0K>Qزp \Ɍ, IALnrKbZ^^ Sf5+1že6|ng49kQ d#8Zd?_uй:_C4UlЭ$1kyv SDž)2}u04z+~{:U%УpDȶ }zDU9,Ⳑv(|y%RCs8Q[lb,;!Cs΍|mAyj~x}xRc$5z!0nf)''51#:__dR8Icv[U5g-_L 'lF;9[  DKxuSMk@&Z-]PښvKf\[[V݂5f KKEū07?EOzDͦ>>~ͯ}[3A /%Ol_\r%֍mv]߰pR$v&o ?Sqc.DTnVmm4&͇8)0OpZ6q^2qHsAocӝ mw:x(Xc?86XʘBl27'%V,#8c9<[O}NL& N5`84gVqR{8\3\(W`C1ňw 3G"sJpPءg%QoKLŵa|$(1}J;.GnbX>xb1"|v٦ى}Rjjo)N;S ϕr`ode9\K!mTV,Gߠ-srT"763ϹN@ p W C v/1qQ%#¸֤KpKK`E -w)/ه(RTQ2 Iz^iWpBu5ŶSGo"xe]5}PNpy-EBXmU :4s NTR쇵MVJB<2ꜸbqNI eV)YuqcF::?׍6:P4=5nF hDoDznDU7yLb{kz~-E 5:ڄpO7KM+0 ogFxLYGa2eYYٚ]LzP)X1C-4/Km$$ymV9'iNz" Z 4a1 =뒭"oFW[]HA:bD{blFiCSmh+6\^x)?tdɫݎqݔV=}h=3iceAlx *̵ۭh@CᏬV0j)66ȟa=CEH(, (HG+?ՎaFk#޳wv\$qNbhsmx8gdXb1K_O 4 vf٥SqYdQQmӂVxviNH͎7oAzt|فx8otBn'ttBW't[XFz|\~9Ϲp M5b7 F(詪Լ4k/ _yТ>ų!/ |p߇mca\E܉>~G?dcB@7v=. 1iYg{$xԙ_Ѫ$9$Pʅޣi֋$M"16uBq^%1@ibfX[n )T{ wSж A$j,[/R2k`?~|_1ȓ~ְ lxAkO ¸)k7/NRQybwׇzMpaU 7'eϏ؜ %{Vyad GŅL;36r{4F;Z f5+G ݅  *)x]AOQf }3ѶXRBBPQ;C @6"&nL3v^! HbXu%ܤaCиqeq%X$1qĦw=~rVcU\3DzuaçXppAT ]' ?9QmP2%kF5S]3\. OG&Rvh2̺ݞֵYIqCMvU[ , pѥf3w"g <3ⲳBC@]–NJV\H#^צR7#7/ljR6.($1{UAU³x8}܉»m?8^(cƭpź&zwє Za!X~EHߖnXLnKo#4-\]yOEPͧ%]x){g@Di5FN;2fe(qq%(&($%għp \z%٩y@vo@cG<|3?c#t|RAPcg",N ŕɉ99E9ey@pK)4\dmEE% B}|@RE9))pZk'5p *,bQ?paEaWgx{B_biC/JR  Mx[mܶ|+T(lDZWҮv7iHMi h%jW=w88Ckk=3CgHm2zesLEl,h"h[!+=Zy ?{s{/۹jM~}EY Y^^_ȧc!Uj훗wgѩP>h-^M8SesʢmJԑASqjϿDߢ=V qMD^JOǙZ X5cƒ X -PUx,ɶgj:Mղg8;B[N@򺨮6@(}z˼nZˢ? O&Xh!ǽ@ өY]bR7+i2') %3,>yqhMK1isQYa|iDcXTe,x$abj$nKIpk4!302gʻF 'R(Lv %'E?V܎z 0HilG]%f?xskfsk%|۰լAYʀrLq}P0ƒd\z:^vrO5 옯jf .N`|5ka -j{Q:YW!?Q"[N + ZJ,Sk!b*/66!_Iv|bjmHbt7Բ})2 ܤL@qp-6E$Q Ý*Y' f0ЎFwk-|dĖZFF%4!Iɱqrnm<}kS}CAS ᏶˜ }M[ŻX$AzHpȟɚ&c!qT[Xǘa̫βtd©Ūis;5c E0b]@?e ǪO|  q؋{[;rLRB^lR1!C0ٔY0b z([΀c01nv;1iQ8eS}ݜOз'5fbwB9K<5EiLvK8`: )AA_kLyLp>F<ۂ:l*$F %{jՄjjԝM 5Erf1.w#QrbTt!s дqh:. ܸLZ*bpQc,!~|du1¯0H7)..Las5gN A[4`r€LC)c:`JB_Z6n:QG #'#6nH5Ilm&Rc;AP0h(: /NG]x6È2.r6/VmLKR!)EFܬPxܮti;+oJt=R5m74>MOn68S =2V0ބAxǰʰ Zd tdUUxA8K;A1Q՜{<4}͙(,j&I|pPx,:{us4X{hlͭ;gZbA YQLԞwFmC]^% Ӯ.utI<0>8P;e'}3\ILQ-4l1N̔|T@IѴ"zTy%NYg 2Af|j)cBXluT y:zBի !*boP3P"HYpɒ'.\Ŀ=MEi3Zh4QJqωڊC؛$m:?x>/䙽1BcZN=Բ!v-;>D}헆łn.Pw7'}3ɺ[r&J;+d~b$vLwv|ORN4zDb]8?b4еcg[Uw~&LkNczš![8f^wصߛ̢w[g?7^>՟׮ګhlޝ@; ˞%] t>&Wz8t4C;{P)1rԌG7z^ fF%jXXFN44 XM;KFJ\ no`@$HKCۛ%8zg৛7/~)4[>ԑ.(#Fk6]?*؛ư?_^G-'/"Piٍ5ӫ؋ Xol q,hm~35g"E=zn0j+">##/?&`\ESac7wu|SЁ !ˆX D?q`U?0Yt>]~]pXfĮGp%B5BYB{Xc#FdA5x]E?^G@^uV>F8^v~z8^C1s/n.6zȱE- @Xo+cvC}`KK[_byZjCm޸D.=Aw- S (fK]JB =`Vo]8@R4.Ei1EcOV[a $c*Zʾڙq@@~~܌/U$n8X;g:۵GKmʑe , H]7Ɩ/ ڇ!}na%l@;]hбۥ$A+߳X6bTS%qSo(*{U Q٘h5kf _Ve,[9T^3cx>'Sk'Vbj-D6jمY7xuJ1AA4E]Z^J/q&BHlIҾ'ÇR1ߟ|''eqs5A@xDcӇL3}n.>Yp gE;߲T4B +I9sypY"@V;9l:gL)1ܢrڳ}뀒59 ~lPAܺu8ERz~cqsx;qc;^qIQirBbQrF|qeqrbNN|JjVAbQfq2\,$(d:qǻxZ[6~ m%I؞k- m4 & b0|l_dPGJ&)OERERzyl^ma<޼}¼m^Un^tE/jO3`g5t"kyȳfS]4DS#-q#{\3YO=}NY_dC;}sBaO_~m6`^vd&ͻv s*h:-li@ElSf1=|5D≉NOO6'Sfyn{$BaǑ;<(uSO@Xɕ"5$BΆ((24ij9o\jǻ6O˪)}kWcttNE te=;YTm$Q7}If$bm>=[(YÚ`a=v귖V%LljnbhݶLJ Jb-3톮U4sFT4`ɰ{Zr\`zmvcmmύF+T"b$HiwmM+M:k ښkGQ$*Ulb&^OE&5*H$c^ Y ɽ-9 XiW*[fq" Qԝ`#i*yH I"Q{ְhAɹĬ0vXq"Kl+_ W`sⳀN +t0 FZNuq@75oD=a)[1zٌW:'CuQ=z%`.QTm, m|l ȁBWѩS6MRb]4;%9S Z F@vXeڈnoe:%vC9N,mtIJEW:7KPщYN=Xj"Dsb.gKU N8Vf"0E;0zScc*wGjmqJiYh+1 7 6Cb]~FDV[>[.Cg&+'v[kKhؙv0`LO$l.1qHːGCz W}1L[gƇ`8)s&!͸. aC Dr%pTEGQZr"ԀX@ZE+a{bt3.BQG4Z#Ys!'א0aW)B<:;;h-ԡDt'^ ]p!qkiS(C~M9Ű*kigW|!6`C$[p+IQHեHsK!mNN^(`KhűF\clB[X\չ Z y4IDϙP$^vb#./_W={7]ah))oPdz4~tP`d LXCX2Z:E Di}k\?f"EJG]ɀC$K0@WrM+n|aZ'2SSmDiæ|&k٠ ,܉x㒱DDh!pܴ.CU`w)Jʆ  St&ޤi22+ѕYZ+" hxERL&'Ӛ~&_e=B3UGydKybL€<}M&k&|Lč:o-u6cM( q&8I"p! |A\I#>q uzC@ćZiXtd L.EqgKƕh"L#;JNsw'BmIuԽS_Ej< p{e_#MڀRz* Ċ;(H̒P%[~eMԨɅR؍HUmEdF#qΕ)g;QGƱksV': ?WnJ}u'֚(ݮKՓd.ӹPH;$pwwMP*T%T&ٕP}Xc]Yiu>v9Rq Il؉`whOrb V|Ionn\yRe5R.;ƥi;PE>v.jTO8 d  /X0)u&39f@ ؚ a r`S&ԯbpCxѵ;X&]DFdslxƃM6#MȃT+sL6BIȘhDTʘ, ˜x~WYF@ b$+py;|ы - 0A#>Ǝe&6u."2ŹTxRo%rx0}.Ni-aA aAw:BX2v^hV 図XvA%Z"=T.eu{ ds SK E܏ aU\4PAY Y=Bؚ xuЍa-yDL`~^׬Q ,QZzc >@JWngk̍^grjAL2,W 9(pvm7s}kCn̠;]%ܭzk uW/O7c'5glȖzB0n(4Bj^8spDzl#TV@# ࣿzB!VP`^ajl+NBjZ5' k ,}_qB9~U\:1v~ F9ջ-"JstOJD n-Y-Asn\"R9Iqx9"⋑E*^&,/&W7cu~iu0!kqW84ϵT5xdDZ-䚠i&N8-2|W==DKN&5i0L`OD?-KMq?yo# E#yR"5:U7R4ɐRN}q;IZ+kQjA`HbjOG iݕjfo8Kzrٖ/("]}sIHԗ:cߋ V?+bOE3N\ ZW^n IP$ȒD$Q_xnŏoӗxi?ecW _f5CQ: l,?, ߄׃a_w| !z\cvՉR dx|zERffq(𳧂Xx}/ j'x ?,gTfgQzg==ߎyq!K`_~Ȁxnl!uzٰG{=}うmΙ:NkclY=F'Wf2w\RpDw:#1&===4ЦB{ÛdY0sm3ÃHd]+K%)֠ϵ9 K<ne@n;U#~`|cM܎ 9mcbb[>#gFxuwL{T^qudq/A`+3KNw$Õ"بpYiܜތ^M-q.vDY5xu=o@!Jdhj v !bSrܝS"gBw`aO~&kբl~~>wZsv&umcí$8M'KrR<,2>0PfzNxY,WRdϸ8C~R0Sk7c',s XFQguY)_VX@JBV+վLU#kRaj:L)RM9ݜprzbge#Գ-=&OyPf蕊lln C`GqwP瓕4OQƆvz'obj`qnvZ%oLD}X_ʨ[32"˔G7FJ$$;&,eYэMOc$ǭ*vMoq37! D/I˻fs1 x]o@eJ6VEM]XBDתg"†ÓX*XX8XX@u sx{<*,Wv`.s`.j)?hG]H&0_-!ψɗ::'ưRPPi߅G#Ār(oS}Y,#'$L UK"&*4dŴFQ0mxc"*m\K}8j\<_HZ&5dK1\t^RYJ҇[/Ǡ A %JdX@j*&Dc_KVdZl_2μa!'a&dγ_<8exekA]1XҎD4YK+TKѣ.MN(AD?FxыEֳ'wvgm̏yIqIT;sW` `Iಋǃ 47t|p|L>p9-38/B޽,Ȧt-)'5mfXqWME0pGO$]؃)rD@i&>7@L|?'~&u [*>Qfc ]IrxeB^f;5mCP% #\cx@'Kӑu47hnA=[1q+U!I.Yb.P/Lc6ϊuAk+ds]Dz"yTˇЂV_E^% NyC򴂋 1Qj;[5 AW H38~TW˅߳j+zm?>4k%$x){k@Di5FN;J&0$e(qq%(&($%għ` \z%٩y@vo@cG/17xlX5bSDS^Y/$ST&.rR+Pq04XiBCgp“ux[ʽ{B%_biC/Jت { XxZ[ ~ }YI{"mMm huF稫uY"Gr]}-pHgNWW05Òdy_#_0L'+Mۺ[m]7?cg''l]w o]q }^NMfȧs~}zO^%ן'7v'ߒI&e+Ւb~m棐iݿ~IH~M}yѶs_'E ?N~{-}](D҂"=hdE)Oy6#1;OʀYfƮ_*y[NsPukfwqV\D! C_uӺb*C%c ΦI(v,nw zMC7+`yba'9뗚DSU )$T#Uwa՚O`z$]ĿVqPDXgtC+Icl:B`[}۫M PrmO3_%JR(vqn®gY;0P|zFv*+0:D27V @u;D$<\rJX3Mzs:rLtJv(--<+&9*FavAu=-!5I_[5=ehEN7:Ft,CI1Tvzws*a]bWF2Ucv@jؤ'-% Bjޏ@٘nSH]Wȭ`DeΈF/@ Z4D,nu cԟ.$BM9Wﺒf@uF*ݑ=^AFrA5Pyq*L=5l ɗjB%e}e п\NP/M;;udړ0+3"yܬncKta;0BQl14d(*l/nIjnb tr>Cz A o@_ϳD1vT\(C!* U+"Ь|P64ЏX0 "L 0@ #{\c5X5;hLj x? |9ÕMuwS!5TWcs7Pa-g`nza*jL/m %_ ݿ#rKF\4*+RuN:aY? +C*fF~7\Ij_|Ud1V2BjdAmg&~uӃ GޯRz%Pa4.2U9z`>Z>d4ZN91 ȉHK' I6\E)aH2qfG&1LN:ٵ@kX&>9 BeRNK9urfDq@7djw`vxIb(/t7ݶhkzvڄr`LיIFmXncu`@#fs 93^vP-D+O4,zҔuMU'fKw/GQc9TFT@ O<?MH(LJ&"q==W!!.*'4:;CFȁ2߰V7-m #0c)])Q)BOD!"(-l-!jD(=>jDڱIhD2ArDT3+?ZǑ fMdjU(kiyhT#BI17/@n; }X~ND457Su}kb3D4=3B:bd-LՍEsS xOv Y42Q?{rj*p(r6|Bo 0[@fG+ن< e70Z;Gn9v)2fyfL7sxہ($=]/SA,֋}g8X|0{df-tWfɘ`MHT,`nOP>1JmQY6Ss5?rXPnW}@RH;/AcLg\@z wf9EB`} )Q^<ꈵ| UT@d̖:TjqOv ; k? ~&Kmsu2j:xirStЮr<` ws^MӹNZ>[HI}F䞟R{ϼLV7r?6lqW;jQr%0)TJ y]ʋ`z+\XΚ 4:o]߿w~xG ~{Ke;AA|)RGUAz!߭Vp^z ށld7/Z ɧ[m?3+4䒦CnrKrp@gAD/oEB䓗  49z^?2^hrKvo#L p;1 mr q@z4Vh }9kMe!䣻VH=zk4`ucLCEGA8V]||*jwOl#60[s`^o@@mzCN˚/e :ll@WlALRƂ!Dp,YpIӌ˳ɕh { ۏ HC[01!bQ)OMnL:8˯8O2u9I~Xnf<dH3'VJ11OIN&i Pa-RXhQ@&Ui`,e /0XQsR, c"ODZ(N|0~_^4E ]0^^Vv`C;.waW[ q}GhGkxlx{Pbo|iQf^z|qjIiBgRf>T.5$,g!WY 6,A8IxekAY5jBZ+6T4ԲovwvG(EQ% <7<ETWADvM}߯{LǴ (*N>-ߚɮחWlZ)SLbxLZ5)\96]\<2~)\Vg1N:|-bH --Ll/wn* 0)Os M [Hbqh~ p.Mc5Zb#?ix=&}~]'z¹`E*\LàGny[ܛ`'#AR~?;x-qc |C© ,kSX)G$#GPb# 4hӼr+vߊO4 vw# _D^0vVWg ngLB3΂ҍwvɈ Di M w ;"҄ʥ1pb;|aM,g.ޖ֐ir,G,±wyDJ"B^.9]I_9=3`^,Ӑe>ٲOa/̤A`0ca_A*nJ{ҷ7Zꇽ㎛_A>*⅃*2h1&O@߆;TL{}2׳G X1pd4?؀t|lQMؖN vKţDQ_KnΏ;|dE[ 9 xS5nwcĒ%X3@R V \,,daLhrILnjMh&'gQjIiQt+iQh2)`qhR r@@6/טJpfxg~d_ь+%7$_TRZf$N.1E+FGwbQ] +=<#MrM/-}AL-AHL$sa 7v JLx}J@@iJ*MAL&j]JIZ[3Pw'AP 7 n] :62.'sc- ^%ɻcjyZX ޒwɬ!U3өz tͬ#o'uzt瞁^շҩ0Xb zͶcw1M`iaOm|?<8Z1P:_TO wdpFVy>IȞ%ܗJȽQ߿9 Wxc %..}-bcK eE&WiB5^I~vj R[(?y"(֓0O`қΤ<9d[&km2h=,N Ky ޷L dOv#3[o^#ir͵r\L$o~&4LƋxsL(#T{_P|fAd)ɜRo+V3^~IrP2xun@e1HT咪-Q/IBBN=v IĴ*,byB^ v*X !aOr?g93܋)U.7m&lzAo޸-YP+;m=HFj'Ӝ]AR i2}ʴ2iwJAE='jcdi afI=-ز!b1[W ޛT[BBuц]HbV%'D] jJ};P ̇hc2+iB"=]"a&U$EAEFa1{/~sYuZW18[8+=,BpVKB[ÄB=M۱TY-6 ef2Nƹwsvo9ZY)'$h '~Y>V 5quuD*a?)yʭmAjF4vX]]eA:n*1XviWu"hx};LXDVgBVReSeNzag7T<[CX!a sDվE ^xkjd¸AҜ97dBsI X8#7&b X!,`rIT n7& 4I((OA 0qz[Yaqh) qQh 1h2@l/1A {x[7|523 SX> |BXsaɑ> OV 'R (&*"48C)D ~KBhrqrWCJ0s2 ғ77c*?) x\_o6?MS{%?m4HnڠW,dYURZ{QPJCjG8$ΐ/ &߆ycvˣHf{ |vQ.O9 ,Jl%{M?v~ K]I۰<2?r+շCX7 ggw[Y*U (ΙI*~bQ3-t}Ur&JT,H_iHUy+\eɄB?LѴ#ZsCu]皳Pj[,a筴ܙ L5,9£qsViTKHۻ_Eͫww ȊTe`Fy7_꧷o>1 ޽{s{~~^n޾x}xsL6^RD2>,&Әm%!@XV|SObb"a,_2 -ۋM^KHF-(b7fص_*ڞorjmbjAqٻwoez]zbFEfHd0hBnv:q]4;Ͽgi {%[?YeeӜGS=@||h?O_]_z{Ǿf`bfqje&pz 4j6C-EƟ *; =Je$wBluvpϣu"R]VSf1N}vdr,X^TեGaXfAņShq:[M q%Fǜ@6*96YII~D֭:9;pn/hxRD`t4%$SfV ԛ@6A9߳Vc˻'Wc|`P@H)%/$xqXGEsᔝ2]4j1:+l`0qp*6 #3Ÿx8j6 (IBJgM齿D֍QB+<2LM ) 1`hh0v C$q\HSGDrjW.})w0МQBh! Bw%>ќZ![2P845:y%3I=e%|6BypMFC*g@#s!Aōh4T|h 6*|AV^ϐ,$ = +8pxc J̈~ˆLFqH*Y9@RjR]qwoqeeHk Vjja- VK ڜx2n l8{LJx(m`,DǩxA#J70zQf$bTXc/ذ_rmb( l!T48X8,dA&y")nJZW Oz~&2- &.`tq}=wXg!Hq6O"fa0Hr?t"T!DQXڳ3w jvHY|OOn4 4.iKoc lpSf5׷DŽ2@K>^_a`׿}XyM!p-g!;潔PW=cTl¶V82a>:֤Yi78o> ]?|ɚ29߄% ͫX:ZM?}TKԑ"o?qq&<T3 fTL9{C\]=‹z`]`)o?o[$L ;d[3܌WH4f\<~DžQV<7n=Y{X*~FGWgtYFtʎi(EJBtjh! 3?pX*^=7o Յhӕ5l:# { 88)Ym6aCvP>]Ȳn sFrHSƣXX2iQ'/~)\%`͗y8`>gjduTzRߛ>sJD#ƄYcتS hpaݯw+iV$x;1q4 I̬ Z\ϹmbT6 8fY٬,eJK0n^]-&SYZZ[ ,-XTX q6'.(O.JM,IÅju8@"Ey(*-_&$ f'$畤V Cm`UhT_ZCnteqZ䅪3lx{vs;Yx?qt lҩy%J: ~AIE0͑ltDKrũ% f2~"#3Di1PY!Km.pZvm'4`x9t &zFEɦ Z\mnecli_TWW\R_!_O<$9#>5/%31Yts?) cx3qL ̬ Z\ =6w0JJ,*L-RQ+ddYM'|Arf|nnf~|Qjb P2>>/(UJVZA U($.f!=~QԢҜɉ,Fƚŝr-8x7L |9@B77?(uc &x;0q, ̬E&STƧe%ONg662%6y#7cy.Fx;adf6CSݢdj"%9J: ~A% f!Gv /l=!)fcc;$rfV''O66TVP*ɤN(&.hll*1%\tr2U)eF %6ja((/Z 3߼B38dfFe:饉E))%Ep[ģIN>'6y\qIFe&rfk̉% [47߲ǞXP>7åV\79qrVQ|qeq20x>(J,ljQm_qkZ._ |Axk8y>t)Ң̼Ԓ\&F :\ JPԼɌF&FfE`yf#1RKL{DRxu=oP8$ P UQDUP":!`,&kH`c8CtX@'`d`G}s5QeVKn:@oUU&B(ׯPU5~ , ;S2 Ul!Bب m%\4sIa'KY1Z6Ob^!j<+zm&I4/e{@c^ K_{z:Aui:HCE{Sደݘr&{6`-x>Nʲ${ _cUD37m W!H Fin'f<`A;6vIZ=N罯̿ob6oX1tG,$4̊]3Afb[ | j.g}Q 9{$zWbOcGsHW.px)ss$Di5FN"̬FzJ71+)*TsqgξAF:\Z ~!V % ũ )) I%@TԢĒb y9٩ ff& E Z0 Ҁv8x-a+,bQϩW\Y_ZS T45yZJsq(EP^Y2/(#WTL֚ godlx;ysB9_biC/J ϽxZmoF_lֱ$6ۢE `[ܻd1}Hѱ sem^l"ϻw_O1]eu*"j]b؏7]7 fM`-x=On}D@%qFWWC6;,pcWNwPruUnpMJhv]WbuaDO]1 {CVu]]Xl$n=?ddekbo\2]C8T`cQ ?^+b//_aX 4dtOA޾{{b۫o>~t?|^/~K凟?9tpO؆lw즘R޸]v[`򢺅H4GVw햕\ \U^m7M/_n/$쿫6 {P"` *+̐"L uzFzWF4i޵0ߜQ+%MQRDt߸<}5Tꅋ/wcQXwx5QV%V='iՊPQM6P'Z̗P .jz@%F/t$1Ȅ<<0$8V{(j2J<:/4Q&-<(E7V@AA3P4ma!lSkbݢ`8mI *z .l*[l Ssz$iim/gb*_XC[R!A"rޞT B Dl}TE \bP!ˬTڃ/$`O[iHT-Hoptzٽ#58"ۧkheٽZ$U=.(xIFHޏկ5x6}O7yTRn6Ӭ >A~TdljgfD Jئ FOV1W&M+g* Ljv>i#+`&#wPG'U͑%ib"AsD *8h|c!֭ L T?T 6QM[-ݍ S#ǂz ͭrucEvfs|I9I cpH|rm!/sqpYh RhK.EH*qneUx6Nu)%JE -Ҷ%>oJ-g>Qp[jۤ}Z@~>up j 0: )x/wz}g }>C\Ng ڦUG<}Hap!'C;e1gCNhn8vmVKy'ǪyWܶ-〱ѩ.NA*Dܓxf Ob'^j@&MlC'IZ"}m"uێMA @FSN=*av:[ym^z4"{B\ vN5)1f+F#Aز/e˱j`>K/@v2!8-bl(DA&"I".>3!A$H F!I;L @GW2 i%G ʖ*ܻupra Ժ |-V=dX3|Խ< d#K@}%v XZ]]!<[sSR]ɮ'e:B-qNSJ C8ZQ5^p.iP,,,[Ժe>[ieqW>aM.ݯBYvE6ӖuDvW6GV㌈yX7_*nQ3@QݮX>٭ ڸ!P(AZE[n=an0JMLXndm3m>3 ց2`c[ȴܥj_Ԇ|g|S$ƛ9E&4aY`sԙEr, &Y:NY.뻒j(HQ!5Xv9Wi}Tz3_ X58ki?ʫ(+ p]q58/bSANvcKE~l 0X+rM0rI ƱHЀ*ƪUK?K,(42Oߪj @obP{Yj B;7\f PNyvE7_|dz5{Qc#]jYrS^(YH_ ]w$ EX]f:w(:_#0~wY]nQPf낟}LJ;ˆml]C@f8t޾!V$k#^e"#6m{Fɼ閹_M07 8x 8 [7ndTV~;xvu4-9sa/W]0:zWN?yqGLj/dOqi;Dg{'b5@!GYpsuly@ >")Ǖہr8.qwC>Nc#} }*uyJgnX}71!p ucfꌔ[sx-w#:;w'ϯK!Bvyܵ==[kN/lO9v?$w9$-N9Eizތ^|.* GL$P( (0xoEuj'm&mҦ?jOB Va;KWv!'$S ܨ@,$7ĥ ڞI/yon>~#]ПE4m(.mޏzoP)ީ^.i2UÝXȈk7;45&T@lA8"e%ցKAr~L JD' IJ@BONfR>NMk[mɨ$ͣ}wzdӨuiA7d'!kiز-k&|~{Dt5'j ~nuJb\(Ô(15R[ 6LBFrQs%x`aFwaѠC A]uBwsPk?C_l[%.\/O~QUh@ ݑ#ؠ8PhW~:Sl{ݩ]*e r9 e'Nhji`?ٚ7k@Zy1:BR,Q놤tq l29h1B%3m@&[darli25nBΏ=$eolqc֦9c?{r^869BGec_NVTٔT|8~Ƴ]5!LլXoHP\Ӗvs@KVE]G#n%\^wt_ є}vbnb O7K$9@gY{N^9&Me'QmQJ{'wⷊ*/*7oyRF'겫%ʦ˨PpiE>1&H&~Uxsr»'(C;dȂ@I#%[dZxb)+ъQMB7 4T]y]j*Qi+9풨;n;fuz ѦKX=&@Uxcf?ӷ/xײܰM*0k~3LkHhݚBhD/E+"OK.!kH+7g)E,֬!`!3!2@29>KR6R2t hȰ/%.h}0 |e2M^<:@ ?P!K=V"}v k-Sn6UUd6u&X8{ 2pSU$gh |7m@g*fza En%v<מ,݊HMuf'tz@ę]ytЙR!43cK]nۼ$gU]bOvrYz˅9\75۳nN[wq4~%NfϥAh8]"T}&CI6bPHwcx)MH5g:FFc\s1 gAubXh0Hwax"ȋSb^ i,6.{L4) Ѳ'(Ĉnض3{MatYmx\]TmxDfmT(1 dYW6zZ iA i`Y 1cjΒsDjp}dYQ/ҙZÐ]4P>U)eID«N΍YN8en^xɸq8b&-mxYs6,v#9lYƉ:GIپ6p xHAZq-~L'NX}X{{mǦǾصdO/G:~ }v(&C9]vt88c&I2S&5uB&ENW ȃv@mt%EƳ?L&|3qд`$ cebp#l(b )Ec8 >'dv`q/pF!C2t|dIFޝ̦Md~svz{>rbC*l rFҞ#R%d5H/{ș6}si%J~U9fIc^y`WqOH9'H}Q,4Ojc""+w, /0w0fsO& j oaj0n$9J E]^\yg'Eٍ=i.hV\{ hh&gݜOi˄L{|CVMSKS+`]jY A؟cʋMaOk*E$ J <0ArS31pf& VE^d3[D%vv C%Wq=mt>$fJa1EB:0)>uh"d .I(f0QUMV+g"* 6`Cc I"N2ǵdl֥D.h lM_6ȕkv\KNIn*H 񸍹G2dKAzŁյ( 5VAtIhO+B(RjJJ6\ 2cAblAԹ@d;Y?QfE9Y?+J ,ś ȒÑexXr[sMP- QseEpKΗ7Y)Q.ur8*SXIDqr`l֨9V51cFum?ye@ [ :t8>z})JjjZz6ӫY"%`DnZ=}zϠ{oZ  ʙ \B8"K.a){,+<֕o U''&Ռ܃ta{*?KeC"pKcd?_ @)Ξ?PocJB;-5JPQ@Vǹ~LLHGҚRJBAtk}6P M}^ |lJIK1V̡:ye:J}&-]N]_ھZNin 79ibUB/iv)5b]qէ dF ]eĚv܈>='Jܵv4UgX|1c9bbƵZaƩWT5Ej')SK6G&&G`$ŔE%lm»wx5BRa(#C(CSiQ 9Q*Hm(~h}hgçzc8%4^mғ9F-T|QqW}z2:ԡʪV ajxD-"aH6w6 Zڄe,&UM}C3\C&G'n%_}owzy;QS_ЂS.jV\DS[%|!Uc*A(.)=U`Y=CkJ@.p ,4K񧗀W[4::j-5/F5 (x{kfB _biC/J398UAbFnxc3k.'BQjrYnnq>P((O85/S)Pi-"'q23d7pf|f춞|+ os[33LNldd9.H^Ș@Sj+!ɓ7Ry+#QHxesrC)BьK'ocJI/*IO)-3'3\"q;xfr {qIbIff6NV8G{ ǘ 2%xRJA%EQWҸ! >AT(vČ,hrRaaeFB{9y;4y+z32wӀ 4  |&*R_0 Tu#NͱC5q89ox%(-\E> =J[s*j*X=%З톬cd)evL㔛AG.(PNмMqb9bapb$Xa&7+mgT8'"6el3Ųek{usZ/Kߨ^bUc[߶~p\3=t>"VY:tt|0xy: =|齞5Xˏ҈]90=YK%$4`OWs =h{%hmm_aM$@=l[*zȥ'AW"@ML$H4{ L܍qHpVۋqQ1RnNN7%z$BBOǙlLUGn9l]E# >WپM;KH3}qe )tE |qAV5E7*ucCu Ԙih pg|-&PQ 6?ocY%_`̟o*{Wf]>Cw1OnE՚)o{^?Z3vtfS8 6gH^3] AM 땨ܻr0-ᮂ G[ ǏW$~~b:QUiy?{_7W?n A߽zݏ¼zǷ?~xo +5;U= WPޘ]~kVP17w۟򢡗+SfMS˗wwwvK|8~MZ!jzހ^XB@(w_(3C0^ǫ_|bovlsq2s.F鲍-$6?i2{"k,&޿¡[{7RHhʩV 7(lOAhGC|qsl6ٍ'ɩ5U hr T„·F h$|s[(;!ŝ@@ }[deU ;gk<+[ʠ@t)y܉01p5f]Q.EwyEFJEYGv Z2#9:nB&mqc4=sq C9.}2YGr@d8Nm1Pk< G%|B}UWPMˉNvx X0q,{ E{>Du&pJEB*HK@-U)yg|(w%2TQ)CFT4O@lZTviq$HL74|H@IIh [-ǘO=쳠|%d5m7]b(LQS!p?Mg GZ[bhYc6oUȡhICw=SFȐ Cd8~@:}VhIĉ,e~ ,f@$l)ɒhG $gg'\1$ lŀ.9o\2n$hUpw ^EuCہ-G q`8f <hjJb?tT Pmse,R FR@ ~vPW Ds;qcEor[ut:?" $@!:vo%7sln6;Ncɼ+USLy MTT@hpUssOlS7a TjIlq8(,Usn,Of2XzTĀg+ 7.$ΝRGDtrCsPu eHi !;F*=}")`OEr-Vp29sꗩ .P"ѕ\bnDQ@b̺jEa"V렕" @ .Η:,A^OLsNW]y!AܴɖGJ#WսT z!x$3q_37zrtN)H@EMO8 f?OP8S>e.E/9S}ʐ=(dOo2R摣Hr& 'UuKTqwr& pn(nYѸj%~H57mT<(g6u:eG]&QZ8eͪJB@ID8ӦG Zc#BghUDEFN#vLz*Q.Hw]f$Z 4˸FTɡd .Z8JT%Z5Zζjˎ%#76#MLf/9edF-ٮ&LqCbW'ܜ59@T*B%, oEN_zPz9mR @{vaT-osJ#JX1 WEĿŴ8+˽D̈́ٷ,܎ {D7Tdksɴm|FuT&*.Ƃ2| k9;Ԫ\4X>ʫgD_@D4ɇ!ˢWjf]tZ@WEv%ۢH ( mw8"=BLO{IwPڪm'SP] ~ފ2/9k`Q$D8ĵk=LGa:IkW0Ph]>@EGO+`|q@bBD?m~! 5N ݈-Wd#~HEM1jBwyߕ#yH5N}EE[q臮N4U>xڢ]<(cz )9iPjGuuk*N)4r&liZ^8Œ߃v=Հ^;=Dl0HAh $|K?%ҡ|daTxf~B6N&$S{]ɣzٜO$*ϟ~r〞\H9 m<d8 #Ln(?g.T'ji69(2x6cn.!X+h) E e4ZZw)~&1U5.%HPh@nbHho3{i Gb[Ls{Z@|_x.B]?!o4X$(}|ք7}^~}E6/Tsә͵ẉ86Rz-޺ "F8/B iDOLǙ^sbzJbZ#doM"Yo|N(XN 77\(~$D" w_n$NxBN;,(nb< Y˗ITRy w#2> KF]GqDQqr(a1Հ4/eRVtH5.I@-j^Z zp}3j}΃$⯯D*xuSMhA&YcLbC%#41i("/dNҡqvI(%x=^Ń' Eijzɤz|NTkk̨CQ| -Jy{[lbY`X2dwL;Cfm$wmMUO$o"0Qb"ޞK=Z1 Jl y|p>BI>C l'!H{֬soU{ֽ/~ן̜wu;QOިMݱM{ ~S/]W=_ǍŕyC*ði`r IthԷ]ۙfqi=MĄI|; D }H3iڰj6&cD?zVan" n:[ /aD X O&#gr]8Pbl&үɬ UC-`Hʑ2N&"96Z֙7mO mcXL9@$p+Rō#߯SM'ڣÄЏ؎x2G{pB w>7̚4= vNGD5uE$'ǡD ^Fܭ{( kwY'CE큊L -? n:dXj>/ظǻT뀳dfp@+Aqapf* 6h@=Z>B*,5=rb#$ViIѡU6NXylܬg[,7uAgG׉bIJ!C B^P<>RLz^Q *J!~vlBt:w|ai\\R)B}P$qDARd0xU*K;lD"OVzϏ_a9mܵdvjii1Jށ%Mhꦡ=x$:IpOa}XF3͆]dIS10hD &'y<UqRDrtчQ?i`=1=2* 꽱$aԙ~h2 l.nCo$f?sM03~ yЎ22n?4"ӠߝfXwDdnFgͮN-j7gנKҲ01}6;5NDV*Ik3X٣z\,__b8[QUű.4u( yDpI]??s?Cxu?o@\BT*'NNaok$`B 7@b110*>K Av=ܽ}cGiQmPk!#t}r_E?FF9UPFu"qIDxG5ne.͹:Y73L 3 ΐc՟5/"C-6*Ly84-BҸƓ ߭vsnOxVoEW$nI(!L[:v>hܴ KS9n h;KֻGiB8Q,8!D/\^xofv; qg7oS;_y4\Tc?|hzz%RʙY֭`T6r❽rc#݃W V2mFr 45TY쨉"NI/3]wfЀ X|/gѴ٬kR l0W X%{Cl.yY ~wvB%J4\~K,/ H Gb( ԊAtŲSꨔ ۃ\>+ lhf9f芽J.i2G2;W'c걿\X]4L$"NMB>#kK+ͥktO}zF@vF=-; Ե5yf/h6?O3/?wWnetQE="AYc A(+QϫzbNW E6LC,3g*Hf+d2o^!-3"I"h=q~ܩD!1k0r(d`/H>9rZ Hoc|;fM>sjW'G>:EpEbNoVbV]_yw-&l%u"~s{gJ6!sm0P NaU&<+3eI-Ravp#Q@ L z*σ%t}A(Y?+B;6=3D&R(uJ$Ps<7}7-f -FGfLLִa{J i!HxEMxE AA P m=01j>adh` qH9\`@ Ҙ<`V` 5+llp&ⵣp 8eJ(pbqSitdܪ0)*.YhP(|H0ۡbJgFTzHtsx0sRC5H/vǻ4NiRT,,iXqF!)c#7r!tL$Zt2OMi0;z]*](,#ζ]2$s[C5L P]=SpjƐA< +(lj<BpoAV$Xܘ#zP膘eMEBIcԬ(̰`NL蠢Ig'o0O#ƈ|||Fwgs1 x09i#23 Y7?b1cWLS*9y @L`6 `IN,NUv w r v|_ʚv\%lBwY'7Ȳ%& z(n%u1Px[kluII%ERHQWM.w)RD+R(ʒ-ѴD!Y]rܝY!Ky S-n,B&Aư1OA4 EĿGssK[ND"ǹ{9wl/^^TkU']1MK{kn^ѝ}ml_7ZA#%\,\7On*q,M#MٻF={njsٙ'Ob }lt乓S3OM>uϟ{`3q̆ҥuvɩ칹ɹJj5ASbq۱jy|vTGKKEfLN?+JV{r.'1—Du}b٩ 7)CǕu!tWD7K]Jˣ=G=YNF5ԌB]-76~#jKT/Y|ɖ?L+1`ɳ3f%i4R4esY7ɒjj@D#VdֈiW۝;vsTm\_yvJϓ7[_vjc@^e*K_THLQݯ֏`!EӪ۬hdIvrq$4~bVE%S/P25j7ذY'aH"rՋ$􃗶ӗi{욂>hqT`gdHvm8jp71#ؐU & lRb pL#a[AGzfH6HZdT?855IY5|epvfY,4H\Q!m0^ܘ³jcjJY䩙ӏ 9!ON]^R@@LHHK rx>v %4fؑQ~2<.g=S60tg#/Я ݗ>zX72SH%N)A2* N+Y3tkvPn8|omœJc1BuV5W &N /2cRD2fL0/f=f-nNh2$88&IBrlIw1`<+euG<3mE8Ww 滣Ij`F^Ϸ&3G},FemDtgDkZYuL jȞx:BlqT^#L;L<17}a1+ 4y KjhQ%Sm[9YVf& m5YAe hb3 fҽo/HfqiB`^n@?Eꐼ .:*G/ iw6y~x+~g:֓$@7Z:Ulg{δyث6Hl#JNнdԊ?gp!uG]@X+fK#+{`<`@p$f#G~c.d,6\+ݛnA{SoQt[`mfij%A (3#Lb$%&MoJz ~6DamH7gښ qw읭$_u~c?t-=b \ֽOOOT-=[5lO}v˽Į+e៦jDLO@\AP om iCR%ӧ:[_'Hp$Hi uk11vp<ڲ%-R)tE6BSd#@Xu vx d89xzxtI+ έlHo K/cU "A$l]9LtԖpA&$ Y3[ɔZ#"ָ.2xzPZ== cebxqP?[J+&d5' Yt<\mj,E)RQW\xN7P;-F!,:Ja`҇3Uܰ b&dҲUxgv0 َ݄ll_68AP 2HLF3SG 7pciЄk^yx۱ΰѷkO~$܏ScD܀ Fk+2{NC ]̼fۡ\Y|9$bsA+i5w7pQvFDWD GJXYRdȅ84D,JXҮt,ҧc' &ڵKamO234l#8ń<Jz6{~R$tRwCU&Kt# Mt[{TܕK W ^C>uZ<;@<  VxJ2.y E޶b>=NO` w HkB/.=w G]S<a7d'gcv;ihPef&~tyui쒑eT%@kHEE*jŴHL٨!ok |l{o)kcgfA)nޞ&r{#RmN)k<%r<-@cӍntYcGZO,keVbs:gH-7KQ2؛}Ycae,V ;].xQL( s#85:& L?uFc"dD "eȁ.zYQ`ov7qqⅎkşқm;;|YB_ ѳ ?Z.-M\E̚ek%슂{D|+_Y+%RvDz+3Cp]PS#H`~V\˦;Xls`:n7I+wsYv eղ%D4:z #ߥހt*!o-oPՇ}=Ok H$p-h7MQUxT+hEVv8rIX`0t8Sx A %ByPhog^-W{[bjް¹wմ,\;E2ĖZa}5x 'i/D}Sk5,܆7yPG߬178>4f0Bcš^.pKT+Zev>iR9աqD#O (H9xؼ8k,&Oa2JӔfi| @3:޺(;_Rk&¾.@zN o קjcn^rt|675\6[wdE1vvrtpSnolb,3543a~q-߅$A[5sU2UQzKtx` [ҊySp} *%=&Y.\adƳQH}\q_X#a_~̿I&׏OO?:P6Xj,@^Z@Pzc|Z ܰZg`˽z$_?|N\h?t'62ɛ*TDZF<^|BZ I>EمJ5I_L@@_U/͉LD%D:Y" ? 3Un;UȐ+]^}n `;ݦ v{*[h9A'tAaLl@`ܦ-+>von#y{Cj?]w<,Jj/z*j5b3 K-~&H8ޏhжw%|/]y#oa{;z)[S%y#gCcD{vHZOP`Mvx;gfh``fbY_ʰ?e.5ܯeZ$L$;5N_0&d[vsSSCcݤdĒbJ{7 h{7e#2'`?'V7#UvCs䆇O? t΅[DNⲛ]R49!3L83W7(9#lȆFo.oZNyі~+04yq"nDT8]?DhY^؉y/p5HG.Uk P-a^+ȌI-KY^@*ɂ׻r-ܯazSCݜ̲TԢ̴Ē[l9CPkpk6R:xPֆFzƒbi,x:Zhy/Lk9)@k&Xvm8]aCQ tW[V}dNX0@>]kIjަGk3Va ݤ̼ĢT[t*&-6^o-}}zZ}E`ީǟ56⪞άYumc|8aa c XTgm }=N9 >aB1='f]ߔa7_qXrxܬR!m,,]\\i2nAZr<\՟kaVτ8NH G5Zu^9bԨ .} u2Zu+.ln;! l\jҫw*;yu71;5-3'U/1Q}NOLPt^9yr9s3L>X1嚔݇-f_ 87xvFF.U5u1l+!  :w[qDI^~ou? $ MȔMVٓE dkUx}M"-/$ pfc2D@ȍ/ߟzNK!>Rxrr $"2M1Ґ-#.: n'exePjA%2IObuh-]jя#+ PTW&EeUu4  {WqS9{NG=Np`qu hq ?K)feXhIApj߀"܃ow7JgoYⱐRYKGnEzeU#'8ey~10YyŹVeACHxlT%ZF=%I'ֵl2_3_ܞTKC, I)\{+i)| wٚΈΈoCt>56wkQ7T$J&D D)LEpYBHf_#L'.MtS[gF7#܋H 3Ξ{ϝ![˫ϭ^zK̢\۹Wq&Lld$л#Sfx{*wUvC<қ9yc;p4xuQ=LAQfxh=88< R(P љT6ZJeiy Vƒ7+y{m?|սڂdAk,n'&2Uc++",jEגةV`pRd\*,JR;x ̛_x sfy_lcRˎ+)5]'MPSs/Tk81 o+Xz\t{T&2$u`2->|BIlYUd"x]}$ "ց]%V#c8$pPH,t`"MSZ`6+H4w.tu'7~ fAr`c@٢V*Rq@ˢT;O71 KhYk%x؆q%\{rN51f5jGj+x;Y'qH7U Iaڴ֢Ug9b̵*g2R<|ީiw`(QZU*<(v:Z/K8Q!i|DLD\>~a!QŘ{?x340031QK,L/JeXxPUڲ+"&ޫ* !|S2sRsg-n oPeIiz \8 UܾIb:vsSSlʼ ̗3lƆfuh ]:jPqrnA|bAf|NjYj^2ΚĸW~Lڂ̼": ~47Yh̉,]jk?oL.C/jS2s\`^UeV芋3A*/mz5eWOݒf~8(8?,|C>ҸΒgP{ҒLP*|؜fYwlݯOv `8<1&-Y7;)"x{DA/=$3=/(!9WvK聛ϛlO11 TobvjZfN^b.hw2',%,r"%nR~]_y8ϲO^&N;-"QXyo;ŸuL.e,n":mx{yC"Av__O-Zo*tpr)c1u m-x9T:<Ը^aMy -x{yeM_j8n$rv1OVtݭoLxf&& ɹIiřz  n^+{|W;֬DZKGW7J=}^`5$3G/!Gg&sy}vԟo& B9xf][ORN&$bq2:> 9&N[\x[Ϻul&Ҭ:be["YjNlH>` EPxߟ^줹%$;Ry9{x [̿׼O\AH5Ro@ ~ +x9nI.< d['œuiRm6~ /R>Co@Ynx!8CpC'VluR(hr Ijx[ϺuC5˓}sgzuw/fL H*x340031QK,L/Jes~en{!TUnbfNnbCzVu[K.}QԔ%eU0$ $$qhZ4*spswwgx(-ٻ:Q%_^QrbRL_HSh^n C٣ʋHX5X)7aJ\]xjcr~^Zfzie /k)fy!5fwx[ϺuZ3jDfn9=dCYsgH0uf^5L] L1D}1rLn5u̘b"O+F&@nm5s%w]㕪~ K)MIeT&DZsy\nnM` ;>kT--Ҿn(h-I-.)fHxC8ؼiRɯo)f cטDדq)mGqx89ח<q\Jg,J`Zg nx5= 0F۷*Miu Ĥ^ěXǔ]t4]&fa^KNJ{i褑e ZJpdq hCE:&iuP!7IN:{ьe}5xTx5N@e~ DGTtWSXEHD:H Ot{Nb$*T<"K0qIюӷdtZ0G DX6v \:3H[,+0x/ Uf٣ ۇ$-QeuGDgEi@鎷?|InlPhƆvpQ X9%jh+ uD(}3g;qWN821g=Et:/v눘(YSHIH* Bo-wrUn9x7lFQfBxbNJ~M2W9d&NgŬ-YZZT_Y•3Ee: "3EW+(I-KQHMKќ|L,WYSPZUQ$7%_!/D!4$5V$#X (17hdU6lgɴr2yE\ 79iU;)@%`)d[뗗秕'''&%gE?"dX<0Q@ $\]RWi1^{n[x-[~W&Fߘ/ x340031QMNMIKeX\el}Fof2gK PHLc|A/Q/`?x[̸qB?OCoVKܴybj Ԅ hx zʖ Ι % 6EF a\VŒ:*g%甦*&% t+sr2&T2 }xm{invqGo5Q;ߑ#Vv ؊ rh 6<G!*?tɪ:#ú5{JzBqß87E5Go6V=8q'=%[GGg~edz ?7>"~ga¦V$={N`,hPDTA\߳M=a#1z3uUZ[^wڵobVl¨!ՌLg,&IJXzx>Xܨj-Gݲn^SEjEJb,!M$9T?Ͷg+1_XIVw.j&lE-*sW_?O{π@fdmgf5![lX*OYr_!%In }e`*~rӂ 4?x +{ԺÇ+ S8i敊wT Uʾ|)@]ggc):^ީYiH3u&cmo!{R3]$GHv'}ڇݽbԏJ KFE >a=[,RpJ?jAe@sisJ-.O);wSB}a]ն~NriNdvAl,!Ԗr+P4'L/4Y'OA%/㩻66kGt ) plclz) 舅Pe#_`ʛ&r8cDlI/eMEx6qNuKAt[ Em M鹃6EWuW);__VIo=(2q&6Fa!?a\& KKVљP4 o|^M:챀?qנRA_] u}J5\\ P$m&%:mzZC@KH,DdrV@(hA^u>u(p_V߄d]7k n8sJP:<9<Utg?AcA@p7y: m sL5R:`Ө V0"7 ӉVv F u3G:Y~ h)/A3M'Y'*Al#黼d$V|mlǢqSI B1xd5 ^=sѲlZ>}Rsɯs㸌CiAel(icxfYҬ[*&IsSc;:qcm`X(G}CУj?eel]TN ]jI /K٭cK*z{dIWN'6x; |@xBY.3n22 +W''%3wco׵\zމ E&Y*NPijA!YU3D)qwi`|/E5VM^#^lv;ُ6:xSb3S=Jo?LΝqg٧;̨5 g%svO9e&R `5.s_?NwH MuI֓Xrsonl~z+J LL3t- 6v ޮT֟%'3 $^?}ӳ9ٍu:pawM*kS`^G5ғ]G;k]TEE7hre//-ɍ""7o_wYNo rFeg/^^[x{Ŕi͝l&-]Mm:-"u*&6/|>9-=h|VYIn0𥉉z_wg/*km܁^&l ~-ir";efbցNNdO߿,2Sf\fnӟ_eQm_iO@U$]~ݟv?.v!KOB>+%nL:.PT4)ҡ4%JuUrnr H鍀aw͓<^nM^Ʊ/eיΈ̮:==P 4q{.$1'\?<&a~As̻vʅau'6z݂Gx; |@x~g}b1) x.xK.>vI8튡oQ.6otAeFZݨ$hA$ S.yixlCTWzqʴ ;t8ytlx[(YR؞ouMY%ȉha~|Qo[aD޾\<:>Zi;(1N2~fgzpHL ؤAAcE'y$9 H}M'rZ?6jMueYr#\,@f@'sѢ+M)|q._oO$ Ҥү΅%kLJeǍ.%O&3 c$ehjSdzsdp`HTLxAaD6?J]JC+͌WĭÉJ#qҤ|A|\ieU{34^>p<^tۍ7:_7bllW$L'^yr>~Ɓ,]ҔkLBdQKU݁V}%>՝ j\!d D"QV]ۗ)Mχk+8N~IYPA6pvf9Έm],>b +ejtxbL jxրcµsm(ڱv6 94֙bȏP!vC8'ٕ'uV|pkgճL1UEz+B,7lW17F.ގ-},4ϏX77sa-k'|]bX~ez*8C(g_VJy}pjPnV YY]gE-3hմ1!/Zf:͍!(;}%HM"WF% VgbNq 9ҵQqPׅuxNg^kgYCos^]:ɑW{b [qw'WۃK!Ad6ȧe2a\§-6U/;޳pd.&+bK w9 tqjTĀ ǻlY-ߪanF~x ʱ#z >!Nv([[`'AcF'#!{ύڊ mT9EPS&/o"mS˳2IR͈j3c?A;m5xkĔŀK؛5TqzBӦ݀JL5߂ ӼB%3Ҹ۶}hN$Ɠ"xQX%/L)vмE!8`sRY]'/] h``ie<^n\eq!E fw/X<%{K?eirċD&(+]aw :0i5׊ ;![u8)C^K=FM,lØJsxC8n3SrlsSE n.$Ui'J]Kd&3U"=i±:Ϸo`49&.m`0DQFp #iDӍVdj<)u0(Smc\G.MVdb.O0Щ9rshuiӝ-[v}ˊm->ʧQ.H)tYpEA!JĊjS#Ep!een3.YjSԹ xP"%vx! '5-x2_2i֊κ p)s {c{0'Xp}B IA$aK`2Abn0&;g ϋ'EU`n9x *&(bj̾1QudDt?&%^(^B{t,J\?^.bܹ?{J zİo};uQOau@ ;R2`NZ?h]|Bl.R IfR _=pckЅ6+`;p .u6#˅,bWl&!b.\$mf5mk!{ьlEIQz\{ +PЖ·[c-7밟*Oe73,n3h㰣"n]It)T{ YpO7Fm=a==x](^^3nddxPO ꛒƾLP7Dl-õ"8og|w`*PH֠9܋Kkт\ 6a^0; s ̘˜2|!,J,^9 PM_bvȆhN!\anhvQZ咴OLyZZ%v_X޳/Pix9\9"sjRGD]N.pA?0a oX5M/acz&ب=;jǏ67z(e.UcF3F3%%Qr̊M,ИJ[iEl@Vibqij;=nƣd7ЬcAo6%$ AqM$/_ PqF^mAeSBV2s>L'=a2dTOg3r#w 3*3ѴT`5fn=qGX-s-oWŭb+xuY]lGV%qӟ4c;vsI&m3oMu\'OCRz^߭^GJʑ"!U(!RH*x@jQ_@ݙk9s9߬?oN.,dA2l47;r%~[Q,ldƏ4m,v6.Y%e{7X}>ax~.}ϻ5K­S:Vp5À܏QpS5Âvu2Z=VAsy a͒3za :떪^^x,xVnr`+5 |Qp-c1Nl>3iqM9 q}~D3UE99 f]3&ҁ |M}e~;0Y]R'49- wQI"O3/|ՂC7f:<i]/J'!,V3ֽڀ']8S0QY6XS[8_6[;5Y\"\RlI+`3̋,QPXeF UԥbVcQdjS1CYqZYԕS]_<\6zzځI}uMڝ3$B+3<`IjUknK(/xUQbJtLY=y35i8OaUjK57HʺFIjpj~Ea;fIxVq.4 #UIfܾ*h1.U/0AӐXp=. t!c4 Tv89xʔ!򼪅a~I*yBҢ}ߵ#. OHώe$!J3 0ⴇ`uMhO$ቱ e*8 M. 69(XSKHo'_^}Sy|^ƒ(*xE굱wBO7ː$;aǸ cpsyoym9HVձiW}ҐThYÐ`~UȺ~/DKGs gOMl Hl@|F[; yMDsyy5ZWR^ e)q v 9N1eFEʩ{ggTu٩1Q&2/|X=I$@VE1s^01g!7sCxPD}"A\Ib(q+@ń??.< Y|`< *P~u!zosLΐĭJ[ގ k+`å^l ŅuV;RnNG~1Ȭa޷: ĕś*;xX.eœ5 sN]ϜuRR>?|s;VX)*! xd+ Z6~{c?/b`w(i| \kK+qԕR/ ~6H<6CdYm|2։‹Kcwvu Kc[^:x^ߗ[UEK8PJ!pX #PQ]e$s@ I:,8ԩe56MqX)vԔ`9wmؽ)Rk+O.G` Uٖ )ULR%'+{xf:Ջ+Kv5&zl'ōF wh,lx}W p;֮|[>$[kݲeYҮ+%v|c;PHXDWtظ i%0mGZ ;Sh !rӖ0))C`i%[7{Xu;FIvWdORҰdssu>cg5R`gSLNIHͤdba. ;"$;%KI}X~TVd4]@$rϙ4sL'ώMOτg n\ȟIBIy%!b޾kS]h1҅"IGfrp`NbcDؔx"ϰ$Y=3q? Bb_-H!!v|)9ds"z/xZK( |αt,-jN'+F8㉤E{%cE\a"$H(ekgM$>e XeQD?Zemi,U՜'ÚĹHo '] f5u5ibчt-+{rRd_euR6mzNY+kG#9)ZH^coω5+bƊC ~VZ-X;K Z(؉hT mvb( SX1)UBԚh6;Ӆӓ43F h,2HifzT>|R~/hxBQJքZJAqhUl܊H[%P 6jx։MG"nK3xi `na LoW/$p.mjpW*I$L屿o18b Nn D"Z-5dԴ(|0iV/57CFΣOpb:]IP?ZiU8׭ŸK> ubc+ั65yo_"GdYsl/R>Mc2UL>F3Y?iީQ'6q4zJ!KɈ;5mNr^AQM}] OjpiÛ lPy0m2A9ٻ>NEgebj'J:Cb8SVHB!XvS<vY.{޴TA:IYځ Nk땨j{k-Զ*?&m6-&9!Uc ~d3FRI]vkGJ^\Yc)J$uL#YM/QG ^<&Cko4%yD4'sx:0a\oo| 0}Bv]N*GaG]fdH-}ՉTإGm= + e߀!#x_O}xA%(!nOPPЙe╣ K$mru+o`p@+[f3 f%re?l卡9` {8$AϮQ@хn'Hv'Գ sXF✕ C7KiΌ^833:~!;x|?yI#5wKUZp$`/rNQ-tP=rCvЊ~nX*l OzE3%zэ)Ei{(6 L0Jy<X=&/2YmlkQ&“^,S.Z^Yfb PɥXȪx)d|A|r`{\F- k)JZtk1V!\HI~F+V$xW7^ֿZ]+(މo[p"4x%CeY5dNj2TW O)_Җm4>U8'6̓y c[^R26N,)Q/lPv)eiU7W6TxhM79ym#} M]l1 J-OdGeNl>pRl4҅z4(K5[Pi:a~@q+5$7)/iP8To M8@nx4S&[Yf2to; 5]'9Q1SȌHn49jQ9i/O҄:;e 4>5[4UL7:|B8?5) ϧ7R66t"B6DL/ۿ*;#^z=_u2J~/=J{wϔn{Z6xUToSe{hWnVzY/;7EnJwqNCpэa넠E?1x!1$BBp|FIIY#:c/5|i7'45y{[MŐű۔7Κfp}ۄfT߯3x: Wx \&C ![8va!q4Y\0[`+|$k (KbŻIH-Kr1 9 q¯BTeaٺZ IVq8fʵ"L`[#kI1ފ@vk\f(.^8P4M 8d1[rN)>wq1/bΧp+1qja]@̿\FA{ !Y M;'NJ]ʼn^Ot%.+ilc 41F=YЛ.0,bE}橩"$ MU1&-kEoǫAp[ZAՌK*_"!DLm |*w$TChs{k8[YG̤ɍ#!=bE:W04p )OC6,^p~PI}Mq$WEb$ njIƈTg&>Rk]ʕ]mSƬP/UI4iz #I/5mw" ̑uʊhhvhQW82RɄwis4uOKȈ]Ÿe?bRGQNP ~<) . ֍5Pk#"l8ho\ #<.Mi2ꉥ,wXc[#;t`:":!wR;R?-kp~iDG4`3\`0~İ_. 6^h#>_-*t-~g߸5VcaKB7ڃW3UV V#C4Չ?Qx80nQ\|ɩʼn%FJ: &ƖOK 'ߔx̝Z[l^'٣NxX[lWbNv$c׹L8&IC8JD!3YR-B* cA}A V@x@)EEBάgfTdyBi؈=[vkYi ="=G,4úa/ٶnK~3[u+`m~?0pٖdMa}TзVNeن[UP SA>"nF~`+,dP ߰ 1ZL5b#Ġ-" {{م嶝N`?Krjz]!v,fˈmڴYd[4V67Wַn-06LY ϶r 'l^(\vu[n`/_dW؍ͭ7V6ٍo\Zd4EثC*(4ږE+7 [7D68i&c2lשcNe֪γ|ޙŚ\tڒ -<_{SY^L95(|_I4J'YQ_ͨ_e5%$^p>&o/1/=ix CWRWyvьJ?oJ}cJJomj $qb717)H*`߉1+u *"k8Aw3 sc<9 t乶ML%ꁋ 'Q=/ %$ ZE<@<|xVT #b|Qٶ8N)x'rZ‡L[Ֆn9 (b5 6eIsxNլ;p4#3?dO.y)#u$MJEHz;s züBhna/2 FZ DPHz_AHq!aX RfН" ГyNHɘ;>wP"1 [4KqQXXJ2w*/Jqf,W7$0$͈gToI2x%%EԤU&?4ˍ?9>a{1.hzղn / 󊚈:XDFP^ LbKȡQt 䌤m5'VAp!&v+&<-CĈ6Jhi\?6j#pXQ [ (O;W+I6 ZJ U{F L{A:<DŽDˏbTo/Z 9G قRbn %}XWJظ"z+Ged܉1#<>wx7,a8?LppaF77ut̞yJv^QO'pv& st(?Dxo:.A.E(3рѩZjZ{ 5R9 ۀvVK)빖- -0ZEpg|trVD$` +#"tqΧP]ÿ=YlKI}QDQJSȌO:Uv|@I 0ĠXf42xÉ"7@&׳<:SůL*w'aTM 74X4)xIt OUH{jV9w B.EӅd îVZ010dY; aZNgt %Di~|V9kFPc`V4u؁^.i2߉!4;ws= ߘ/K)]FYMF/ 9>'g)]#݈0i0k1iDLR$wۊ6o^?ܣ*bn:A݈6A K ڒp~sidVJ]hb.]p{qY YA.\)1У p5h/i߹rDq?|uV_O^U`.x`ƚ讽 S¥KX!HG"7>i-\9WQUU\=d RNDR[`)P\,$ VUQ !o rܯDd)3M4@l8$@C2#2Ő8NQ0@!TJ7]ՋJ}࠴[Jx+ + %mk^hU Og@f js8FzVZ3c_Dye%]CA`)3Ttc߶a7&#RŨ0ǦCj4;7Ϛ|-!c륕n^,ctL#OF[6K#F?k|+(c.Z'pOj{74pWzT4 :jtήo!1[[8e,|/TnM* B]#sZ6\t<7ExW]lW!ɮ'uY;^qB~ZM iA0ޝ]G]!TUMrDy@P $FIxi 7~) ;3)=|瞹w×><矴mGyy\[KOmg ln-mTga.W(\rMQ+/ҩ[J<^ 2pJL>]Ū]#Z)8"]7>6yh$-f4U<v/2Bv?>,)12f2g Ww$߻;{Gvbfb۽f[T{~;Q5gRg_Obxa$~Ί6FuUXZ0٬,F6aUTO#6J:;.ִ<4T 26=0=_ 70!=9P`28<&F;mc7VA?,0 o <#pĀS5OohYF(An'yy_qZ<űV%d8.fS٬ҫ…Y󵡹~LZx04,mL_b|qվ`ܺN2<́EDA;pLFbxLؿ8s帿T{vd/|ccIJ\nGޟs+ɡTT 1qUs=ڦr1&ǘ \@y&PQΊBm6ec-ۈlJCn 1|pn1umK(+#vP4%~?\aZЉq̳VdQ g&SނdKh㛊bز9EVSΨyxsttXLg'[eTkl6yYv7(:ey QFَ#gP\nx Ċ,ǯ\dmբ#E\*=Vd=?=In[~ Vٸ;qp1I$[ZGbd Y'f9)RS=Cl"Y+xω1:zth6jzKuڤ.cUNut4oݣYpt>(Օר+Qؕ?nxdVM7UU׳Ns 'wtP$r_xk~ \om[)¹cZN 7v+k=8?̞!#axI:0gLxJ[`uH1e4n)MOnK79|ƕEJ9y 6֐^oV'/d ' NL-/Ll#)2𫩳}N??Ƴbcl,ai2p%%tz1Ufΐ ˜9ػţ&Y%~ivOٙ,f*-g,d^[x 4Ȱ8M3̮`]?He=ő̒t$),BEs%}TmmO`mp[{5Tj[XG/6+ 4QͺښK^83vqj[m}T`C{ s9)r:04?\)*e$^)Ȍ${~+¿ cGikpOQ^ vb⤨ca:@>U($GQ"WYӜ_I 3O\=zҕUߟ W!1z u=eꦁ6fy[Ծ "sϭ^#C>zq 9}i,sW/,+KVNLy ,G'tO3Lk-oiHU[1jEX;jdC@imU|'1IJXstD2+!51Ūa88xә>ޙIHps IdgvLlvZ=Ϩ钀:s  NT0Cxd]IxkXiiEϤu-&5>1-J,\\>(SIiTI^J놋}83XÄQ|.TMs(j=G<#H|"NA sCOs<":Ul z<{ MoYeYi[3 |)u?zdT DaUo{LHbq1 B]:S0wKUc5\O~;׻ tc"+F)t7խ쀅l \ (vPHWUqFݝ̓==&8Hde.pX#;]YImO:1K;QFG{jIN={GɅ4MX%ιyCq')-),7DT_. ð"~ bHdZ;F_}ix>fX̍O(ơ^N(d`vjfYyo:01H~uD^TˆQWeu}tVQ(@~$6JZk}}}aatJژ\e H9 6mak!SxS1J<^;ϱ :#’p_Yv0CY ooe[Zͭ$1x~r$ɲ$b [`bѲwA,rDR?)ɜ^ [ә ^25f|v-<<3ecC9t4HPﻝ"咿q2p~Ē}դÓ8 DCrikP@G1 >{,\nO瓬oM/&q:r+E*e_s["igƯ1N1h+N5+rp#IJ,>{;/3趽1+GM #h ߙ҇ D1^C!o>XC =w7˝Xo8|4,o~`0!gg$/gGeQT!a!ȋ2hVp[:}7G wVlhW?+Aa+ϗiye~O'^D:Kgwa+]QXpǢdaXBxO >Z%Nz9zp`\NqׅG'>埼&3Ձ#BAuX91vkTi`~6ҭotkǟhToX~e/ԜG(QcMvCDz87p`Bm80y!!nǍBW8??wk/7{ry zܺ=8z4aZExmXYGu|=]U}VCz{zf>3X#!$D@_"!@BHB BHPH( fٯ>nmS6~&?a%ڋV9yGQ"|>^,^IA>yo+Ӗm;a2=?nH6Mc! b.Fj-gRڗsYW3x'fby"m߽"L/a5c?pWvm+nݴ7knD!S(R (? E+p551Q݃Cy~BAC؁;|T,pZwN5=fFźZT& u4tkk|o+ @X*y' j3=M !fjЬTx;4byr>j%rǝ'u>Tv6YgNmuE(InN=MpXË=kFĭT]OKu|(bGX#Ւr ݠj[pʡ{ni+Ži(-Ҁ1]6 _hSA1^ ,!Q*we/g8+ h`]*`5_ΌGo:͜"T{I[Aώ@F1a54X!ivax{";_F0"佽 NѣaEDb^zDP>6"VC 9㹾Mu'dLDto4aۖieS"VSy Dee#-?S8$H IeMg*VSMO ]9H SbȱLׇ?[`UXI)74Y/j"z)¥xǷyfH ?Y\D"/sE6ZzGdž˧:n:?\-bqxz;Q; x`pƨSᥱE𳱙Q/c?yO |&;Pb_e48'>YĆ2(l&n&Nj v{Ԑ띖zWj ^J+N"4w[LCۜa|YGz^9蕩KՀw}_SC*ҼY;B^ogTʴQ"ݥd1+v|S0~zxYDM6hٞD#r\pQ1K܊)]A:,OuOg뤗;xm`+Jy!5;KH%(Ti/`KT'rcgR~~BbQz|F|ZdEԼ\܂܂ĢT]`ĒV$5bqx[lWULƏQ_ÆiZ?jدU!/K` Yd*%/$&cWk, 1۱ʶ8DzMU) CsV^򹩩e d$ϟgTvqT5]H EjfN|qSuիc +v6ͽsS09y>uZbՍOo {,vta;0x-uQS=ze9P3}aĽ"mi%f4dvv]hsS+#TpvތluS,TPs4E׮d:. $,xsc,i(k Ҋ"`0sitK 0e(fxE˱AD$4\[~I߸JٝxL@T^- Fou_%3d2d hQ4@1b&~ 2k}^B Ɂ]TFq@6NhX+}F- zц&iD1}8&Ժף;^-.SDECs >?$ EgQ'$"Pب<li6n)y3|Sq7gaDsJ`NH KK.st:я9ƂEpϰH|AX@ðJ@UXbvZRʘX^zW4\Uq@at75*1w?NfO_YCxx)^%lhMԪ'L] (@<㖤tS{rIe(\zvakI%@K\D̪~{ >^_ ɏ!Gn%FGcQ@@$woF88X'+k:lj4~RLGÅ8 eEub{X۬:ZYJZSс / ֙0YKDQǴCܬNuvX~'SOe5LϞ[lw`HˌT2!,Z6KY^_O%F19T{olx@tF/1tlk*QVU8Ѻ_w|&-X.][8(_ZnGŝaY&VMi-_ z~"j2{٠*  M$v` #\%j ʸ"ed͚N߱)T`",7OX`(9R!eA1(p]GuV $̢뢗vN+ @6{~bQ˳ [aRkNϟ5΀:ϩ霱ax>X/eb^tG!&Fy&Jz-J`q6 |z%[:K"BqṴ%J1^.:~}N'm>9]'ᖔ X)iL*JM̶%RKa ۸N+A',mZK7kgbUU0l">9Qrcћ|'KKq&d敦W5+/ x340031QK,L/JeәvQBjeYQƇׅx !|S2sRsL6at"!7Y xUT[WPyaB[;{S̉JT*aVYoNsudB߹WG6y0PHC yu\˻N~}Tfk:+o-F`g@Aze审1TX}y6n)Xk2P[) O X,6$?nJ¢V Ơ6~2tn."x1:8-&s\2Vkn{bwp~wiLnLObbNZdCWNnmnk$PrX̪Ô>v>5Q@X֛Kץ9|l&<7]'ՋiZ!=_ΈU(k|5n9/O?c0Hxx;4?eC5i.AEa/R8ַgDb4^)AW19tr&AW7ǣt68)oY:ݎuUZj.~T*Zc*wf||>0B gviI#䱑ɭi$XU(l%4*y5 J堜LeLgsqy:gVdx Ϙ+K2rKSsRRslK6?apxWkolAhΣ(&:ǰ'A(KL $׽~ϐdE c8s u~zڥSZ$Q;cņ ʼn0xb[:NN藋_i.R[Tmw-DB 4WeФH4bUxs o9En-pJt.rU!8SeI+AY]Ò u0+0»*6UY 8I8|?ƓfGtX4̗d0|vaڰئEiAeJy,Y"gS*q%"#l "[[}@L:)hvߴ zy[Td5a>LaV/:BF*{Ѡ7څG I m 2Z ir?U+ZyղDWV~Cpc7*-^ąOqpjMRm{)btm❧U$$G? /d}2^&2MLFnX4Z&I5_Scc5(\$OD 3?<>f OiróZ&[@SYړӰoZƀncC4T - %Høz01UZ<6Tq BeE ED(xcVvJ6d)z[D Q?YI_v;{H}@8ԛ Y'˲6K?;Cd )*L $1`!f?CE!{伹n}߳Cq>{}**!H p Ir:fvPUOBPImûY4ߢ~V@ haGkk P  k0;0|}#^ң sEk9.s ( |"u4L%1cPI#@K%Ld'TTZWApYF{@Ju;9:1xDut"b4h9xeIS$8@q觟B!6f~_|mNr` o<ޔ-qVcqR.`V;l+7iN|/9cxN5H.:knQ Sp)CY-IgkUnǓhNq:^ "7Ui4~a6k4HO5ȓ@e DE0m I|Uz$!wNKo*Lk/t.CVdŁe3m$>\^yK#Pr^A K7^xG l?8$P/LotNO3 6ʒ(h[AM!+7-'+Jo>QPb ?}vxVKoUVi(^P@ra7]XI#&帥 aV;$i_2ґ? ֙$cJ]jB\ efDs{)fT3u?>gPvzJ$&ǮcVe#@/$EJݪړfͮcV.z<~^JRhs+WEoaFNTQoNeDOA~ Xk0, O!L$Pǡu^ZS$Atк26`T5<Œ,~0z:& 顿/,gŸ=/FT允늍Z Y~Jz5ס7+C X -.;];ր,5tK,.{<4ָp Cquz}~OoͯS5,c0:֤V w[R#k>t*9iʲ#v}k/+f%P1zcP^F/C%oN%QjKRKt%ݪzͼZU-}+0<5sKV~wkr9uFa9xcC nRbqfnN~b X5D:Gx[(Dp5DS _4/$er slif^Q|BYbk9(dyV9VGɎډ%%E%%: ξn>!!A!.n>!: j@&;rpf)h8,\% %@v-gQ2܂xM 2]VA5XSh>D,Vq9bcT$ v>l|k@ass Q0E[al'G9(F,YCC&۱hw5<mH%w;x!,08 I9Y&;zSvJ mx["^xjfd[܂Ă cMk.4 &'gQjIiQHph@Y&gScw|݃9' /5x;h _biC/JW4r7fzGpM. LSHKO-O,))pz!.n>! `V` PYTWZT_䖘4$3/]%]%E`cVGɅɩ%("SX\̅4'G g@aZJ= 5atG9( }C HwT>C#)l_:x=pyE΀4 x÷8$> SXk5c[X$t|u 5 3M!M/HH9h*(*N~j,V'qxݧaB nRbqfnN~b}άX&X=#?WxU]oTV-I}0^\omפIF@mSj29Ա=K؍ &>dp+n4m7Eʱ}>_ }w;Rvsfq[@7q ?S3]8z>gRYV^(k%mUojeVH9ĂÊ02CpBHfA,YfBݾ]?mRsf~lSXzIH^p}~,qt||\]yzzƳmphaIhdtb1 u z/TKb冪ժ5v[-` !u3sD~;+Z2xM^6x6? ԙMonR<툊qeHɱ+ TZӻB:0" =IpE -ຼiM#.HIր5Hw`z&Z_ԒMYqR}%N854geЩqnۂkc{oy^89cn0޴Akmaiˈ"û2(Lk0_z:`H0I@P#ax_-aAq(3Jfٖý͓cFd1v xtp[UK9j5F%k[-X=VKjq -4Q@ST ~:=v&2l&Ϥ^K )\63XAb`0vC$z?Rga'\Us!j>GEzQ{*D?ROTjj8 IyB0yTڢxѠ.t:.&w쭡ܭQÉ-CtbT/ ',$[tFmN \MS+}d؏A'KRy;O°0Q>-ee0vkEyDA~aGd$ӗa,6PJ7^ז0P9t'ʃA8q epjO)P\b EZp8M2Ӑm8s_+m'K;_3;xN"wą.׮I9# so]FayOynܻ֟yM]`8pWʉ܊;KWO+h!t, ~v2)) >:5 Kx[)Cfb.>! ye eEI98f$ٕ*槤*d(e(d)epEG+V)TǃUMnT7C S+Ut vuv  qvs+|(9Ex[ϺuBem~+/Q$wiL  x;[rLfcK929 ͌7 ]2L63ki x[Ϻu %T(r)f&>z`䧞ٹ ^VLf7T$դOtҟ PK)MIe~hʿo4l3ج<)8$|g64K:8ZZ\R`bkיUG6z2*SPS|k҃'Z/;aٶZRx[ϺuC5Q={.K^Dzx%L x[ϺuZ3jDfn9=dCYsgH0uf^5L] L1D}1rLn5u̘b"O+F&@nm5s%w]㕪~ K)MIeT&DZsy\nnM` 1hZlw?^<˕XZ_|$!+c9FK%:~{T>??B(뎩_c_OrƥFrvx [L}MEnYo@+mx8NEDŏ3+ T|%ʽ8Ĵ9؏œ!B?xmSOkAEjwPHPB` %x 3oCggIij'!_īgGd#Q<,yo{ N#禶=:&Rr<" Z,V3zOpQ6+otEj-ui!HM:St\Z$Rilu I\E!L1Q@p 17Wٛz6\ލ' "N굧4G8w zt3sy]F5mF<,*$"M\TG0$%wUJJ>JK upL{ЀiWӬ@s-VGEV INfPmxɂmp?n7o-=n~o6׏lE6* -KĿnCi)mJ*ΞJHo#[сgeN`ҬxQcE}|3d7=y[\JМu_tO;V+Nۚ(T>,L-]<=9XPIpCirb*IGx{J4:8H,&,-ڠ>wϷ_QY+dR_?}byr x{4TysJp%b[f0i8ɫihm4ښ< CUǟJ[a( `3# u+$[yeqJ~#4t}:)I"BĂ`0c'F jPR,@Q+[^zY$G|9bF >pm3U-kU^"k ߷;/g*z@>GU?REtK4e*Y?bl32`4%f 07?iUK~qJɍ1>vÊ6kFзzX=p?76rLZd$._6Mtl3e\XWVyxBL;{&Y%EX9 k~7$ S`aYmYd|/A"lDkgci+nY%Զ,,w @a@1&fȢ,.s eULK<ގ\4ghKkHA܅z93 [LV63,Q4+*33axR|3R-sj&k]z)9/+(sVM_jS+Yܸ=#6 c㪡G R ˅kE3\:A{ɔ5ɾWau5a˗EBs|@^K֎ESEknZ']AlQ@zxGH@}hZ)c%ZN|Rix%IIr {eq簪F>f'i;!Rx[ϺuC5H V66{9o^sir? lxtIIr {eq簪F>f'i&)|QCbSk*Fe+?QfyC!- }Յ4ᖕcl]B aݬ2⏁3/"M=#'u`?CGx[ϺuC41OkCͥ2sĮnqI 4x!z.ث޺,z/v n5x[ϺuC4u7WDu(3Dɬ`-]ai5g-M&3)2P|xS4e3ƅ4>nb%{5>:<˧!Y.ث޺,z/v bC(\0x myA@Zj}H^nGx8qBHŏ;\X?g8{ɥ*d )x8qB";? &DY7.p x31B#owYCMvHKn̻  N4Q™ 8G\\Cǭ9t;E~z!A~ 5$C&iY*g&+3!~V>ҳWq{ %r_5PnC-xkZ} ;8\bsny;itQ mQ X5=TkgɋxTK[H*~{h|1M\:km4@Pqt$hT0zx!8CpBȖǜq&Pܘw~8M0o}D!%I/agsr_\CۏPԼ4d ffe>MQCGT-֧ygZ[hm7P -hC<{RrOCo_|m.{W{ߦ=[ƹ|˙uWo(*yҴ#O_Z^\Y\ T_W:ww| xx|)M?\|iM5 s s JJ2R Ҁ`̼ԢɆ'hO>(0{N.NNAS fS$'}Кr^or;ĒT=}PB9}F @F(*Y%_PvGɽ6|aYzklx;g]DA/=$3=/(a9zPfpC?lTdw|џivd fdl nnj`hXXRRTWPbzr9"m,|]D*fnhgzNqԹpO\v Wꓗ1'$\`ƛg&%găВۨ>|-\]Wy51''|>Uefd蕤3^a*GLU_7ͧf1ϋ[i7ɋ_eOU1~w[]? ǁ!BNl^"R%i8jޅk78$O>'(rQ(ta={nݓ3y[,svwb'N%(ۼW\H)]]a]Έ\5IKHSh[b 3>',571 ,Xq.Yjꛏ_m6yq)g.Klf75,K--N-/LLN,Kfgx/6>!3Ԯ unm@w6~}M=DԷ=%^;)]_=B#$}⦹L~hͣ=0FPO'calnt9E)IS_m[y{?ǿ9a 2\3t%ݪzͼZs18[$e%UƗݢ)]x\;IWgiv s z8uzʎګgf<659'vh0=&EuYyNŭRfYhsXC}*Ô&w̰_YlHɍ&qXrxܬR!m,,]\\i2nAZr<U]VrYFBڀ|]F.G&l?{w-WK_qBsVv g?[N>29ڼy޻Eu4,I-J,I/,N|@Um Uvm VM0ʗ@at"AEtQ+QS>( 71;5-3'U/1!iD]|&1,@`E'/3]iddɟ|x~CDA/=$3=/(!~ێEZz{Mi^  hZӸt97G3:>>!kڹ}e+OR6#`sSSCcݤdĒbJCQl2 IfGf^|⁣쫤M͡jˋ+`%] :x5 }xԑk976Qv 2GкڱMnEq~)J\Q5!h(=7N?дo͟??_=F.SSv-Iޭp=]}?)} kmOعIaTOttH%4נ{ 9jc#K#tv4A3xZG=^`Lkb- ym \xI:sob=:? -؟XH%)0}8.nye+JfFlm"bM6 $rkGa 9ςl2`s9fp$1;17=Va45 |8 vY7B4Aw |3mN59HKovfEI Bfh w>2gk֨k.sUaHiS+*s.>ges~.&R62ܞax.sh{Ղ\ Z}e6UiR(g<Q1|"$\+傃r48J4X_fCX6}qe@jpIo~f$V@,&A9Q! o GBp"4,`&8BdGTH R#&]'di(Zp(+.̒\\Η`2W1k"xy߃ɋ\ -x[Ϻu=s_%?ܮUϐobs0c # x!8CpCH8/.OKj p},9P̪A\ێ^y `Ƕph`iZH}pIY%Ȕ%:"Z乎p I+RaېT*$gn GA՞ot [.Qev|cnꨥrUki"j K\& 2=y~MpmRkQ:*xOu2J  mk}_/Q}[ @0_\] pA{~JaZSH2)n74T{" !,QJb)2;{٤lGHdT:8pU(;B^']7nJ3)xfi!f [=Lo0psjrn>=q>`ݸ:fC[z coT<ȦWxa5(GeTv-+cbk+'lz%TRtU.2UOb$i#&^SўTNMɷ{; b1[ZjV,} ܎(mB!ۋȘގ1=ՂؼIZ ӻ`C@^yV&v k~Ut"ﯝxIGyفǝq+63H+~QK=o|6,`5B!_e⇃CbwNM } 3;FcX(͖EyB`dbTԸ>6JgCiW 3GxW/$Jv+qo0Y5bEk3ƨlSͧbXLzMt cń9|RƒہnL\9:*:l0+FnU ȠOf9ؐB'K| i|.i0l2uj H`f9N*{8'0'ul6/itυ+52–{~. q D!N` NFC5j:syaL/ͼ(z$ $@џ :~H=/u-a#Wz(9 +nu0\4&wN(,gʸ丶t? EǷֵܸU)3V,jjeѯL&fl3ks7S}sC3(rϾo{B+&3)G8dBx8qBU WmziDv- U)x8qBYUwD2>:R='9F "x31.'hZsrs6xqGW?\u&/sq aE!Lx[ϺuC5a_yTͿ(3a[},X ,4Bx!GGDӲ%fJV{8XYW#yx ,Ǭ%:Z%Oڞx31xS56*o6QY5;I1UrXH=]/~3ƙ6xpq ]ړ_i Yg+&'dU&fjhr)h)AqiAA~QBZ~X=1xэL/KLܮ0+'x!8CpBHs-זϯ/{A I8s>_x[ϺuC4[I)|BξLu x!8CpBH']}ʑm|ez<-} x{X3vvɭܚ lȽi 6x; |@xBY.3n22 +W''%30}3;߳$Ы4;;qa$us_%|*2MV-(">$k cȁW8%6 ,ohƪ sD+9q'&WOV`*QsFzʷ3?W^瓗3;ѹ3,t50f! ߿d?wN)ǵѤS}&eqg Ii8zrKu ߭\~yZoEBbQrnз9fݮە_2udFVabz6'qN7I5Xem (fTzhg땪WM}qu%w^W;UDdm.ޣ5KAVWֈ|祝!OA9=6Mdyz~r6V:{>n?4nM+,k|$dTX]JSyw/;I^糗CW6{/g?^4d}v9EwxL231{'''_jdrJq) Nd.G37/ײ4Y˧ *R.[O^%gWR'!Еdfyi7CD&vz||zL^|RAL o}~9m79LF@Ղ~߰;_] 7&/sIJLgDKKJf\`N(Iʸ=ubzm\DU0W{];0NLJ;?*x340031QK,L/Jes~en{!TUnbfNnbCzVu[K.}QԔ%eU0ܒ_{sy:هE@9{83ߵWK+̏_5s4v/$)4]/7as@2CNO0ِo S̠Dwޕo75l;T_+)}'x~IF:P%٩i9z ʻLWBʂ\]|]A._gl۳H]b]CW5An딧 E ۞;ܿޔ6cׄȖ3-g։+.:ZvjAs*5(?$g\ U^wx[ϺuBHu;=gΉ"*'vp^q,%˜+'N|-B~:^ݻ]L-q7br0cb ?F$|pחZ9 PHOfh6ԹڮJKIlf%甦2/zK&{Zk’.J3sњO/h-I-.)fp!<:nfBs\; y {Sl nn9 x[ϺuBeMBb׋M\5q*K/C3gG?wWwbҿS5Q+,&ULf%zنn >dW?z:EL'"ۄH+8.K}-ҭL!n"yY =M&@PZ\R̐pҕy_=*SP!uTկ1GP͇'9RnVLx$[~G&V#==ߘZ)8N>Ŭ-YZZT_Y•3Ee: "3EW+(I-KQHMKќ|L,WYSPZUQ$7%_!/D!4$5V$#X (17hdU6lgɴr2yE\ 79iU;)@%`)d[뗗秕'''&%gE?"dX<0Q@ $\]RWi1\{2x7Eꥁx76A65:$ȺfC3t"L)CyM.Fx6Fky'8\Wi=axUSMA7Hb6.Nܰɂe{s'xޛ?Ot|< 3ad G G'pUO]#yh1t9Ot~y1=],@HGZ1ū Bd9Y^eʼC697uE ݌F]:z^ƣi¯Q{RkaȲZH-8 %V5F;D!HY^-oP¡>ABFר&#=QP>+DFѣYt((C,ϡ V!Ywx*jJ ta{qqD6V=}y1.ʉkkx%2礊@rh MLX[{k*̖6`}V] V@i*X(ԭV<:g\  ϦPB#F4Ndy( 9yx'yd]-ho9 qлY]H3Džqp:׼dlk+4wdtsI }1/g0;@񉋾Gx/˷QQO.~~'txm]cVXr*>qw Cw^gFaړs4`b]nA[c߃`40000 toolsxQ 5%Nl#| ^d .6Lx; |@xBHD- ޯ]Siۡ t+sr>w`WՃ ϝ0_dպt&5Y1C+wwMηR4Qc9"vlwi˫ '+0(F9}=ә+t^|I˙Dw}͌z]3ِy_;gZh)V2g83y|д]WoTg=9%ZzK"o[z7ȜD!(9Can׀JeYݯ_Yr2#Hgm1=ݸ\s vפ6R,^},|igtC7hre//-ɍ""7o_wYNo rFd=/ | hi%kw53괈ԩܛؼq qmZf_[47v'! ?V=ϻS~I:Tl /q{-8&ˉ,czfY#89=~V$SNy\_Ps$sf>yN~EƷM9Z>]Ut]y5~ܢ[ 'Kyg}?2yIi@SCg3iK&뒫3U V_}'uy&𛼌c_[+jsBIj.ԾxRNrdU[ğbj2.6o}Gz\?ӒHx {A(ԕXd%'ʕ (x!@@kYӌ ,D`w`x@ў`<4X:b*x[ϺuBHu;=g΍vLZ3qx;*EdB[Ej^fbI%j9y饉V %y\ʊKAAWA)/3=$Ri3 cLǘKsSJ2RR2K7籵2s%&'[M1m ε )Jzx"Gd8f]F1vYO`Wgg߀g7x_xNJ:6_x[ϺuC5_q$i`v3Ktr?п -x[Ϻul&׎p}9?Cu 3-0G*\܎/خ$uy:x0l_Q#2s{ &ͺaJ\]a*tv ve8_}#D/8Y71;5-3'U/1aۜ7x5/}`{u99 WG_WΧ?Yƞ^5>!&C;|\]]AU71<+ƪWbgoPBbiI~zj^q?WKT}>yiE@&3d?<ڣ-Omlphb ) .}^{7̼ҔT%BO^WpIdXuum9M'(|-KX~7 ZKRKfxW'I=~8IFCK!xOEꥁx76A65:$ȺfC3t"L)Cy`r UX`E})(^x5[l')os|d/o,EW0KlTA@ `3Cx[Ϻul&'nvNgQYlO7 sx asVD#v[us6Dexo@ eGr2D`I :b:-S ְGOK&O}أ>f|e^~wVw*/Uz]e7MRƼȴn:=w$|S^[O5ޏ7XT% H,|.}#*:u ,6E`6#,t[|xU O|/qCx𙩑8BFQiT.\: Pqͅ5*2G{ 9ûK쌫l.J1.ɲE?-+aUT;2]햋WuBw~YL,!Ţc:lGu٢PuvfB4e^_=m?ٰ?m`am*`MEX] 9"6 R꾊`;~~Hҡzݰka4IN:Arʨi>pJeYE&K///qkD&CȁޠG@ҥ4+mBXx$ȺfC3t"L)Cy'H x$[~G&V#==ߘZ)8N>Ŭ-YZZT_Y•3Ee: "3EW+(I-KQHMKќ|L,WYSPZUQ$7%_!/D!4$5V$#X (17hdU6lgɴr2yE\ 79iU;)@%`)d[뗗秕'''&%gE?"dX<0Q@ $\]RWi1[A{ߦ+x340031QK,L/Jes~en{!TUnbfNnbCzVu[K.}QԔ%eU0X8 Y'=/R'is1Pe~> 3-0G*\܎/خ$uy:x0l_Q#2s{ &ͺaJ\]a*tv ve8_}#D/8Y71;5-3'U/1aۜ7x5/}`{u99 WG_WΧ?Yƞ^5>!&C;|\]]AU71<+ƪWbgoPBbiI~zj^q?WKT}>yiE@&3쾻Ų/jOR4\/yUЎɳf>MZK)MIe2?BUWx%7/( jONfRqjrr~n^A^f-W쫹}?X7]y]rM*&ح`t;CtD(aB-y+}&e7ԋ>oD$f9~z9(y?j)fts:fgFJ {xƺuBȲ[O=Y1Ew,D}$zo+2¯^O 540031QrutuMa_gl۳H]b]CD4dS5^ͨɌ"OlNvr-o]&k<9+lI)wP@7hcϦ,pm֒-K*"2C6uoњy go+YkDv>ΐI֞?J&[I~slM+R#> Z5:n:FW6'δBvK%jť]8[uH_3`Zrw` ۂ?x/yKi>Ȇr:B Ko8eɉ Z&Rwl~ 4s˵,7m+q$RL =9+;Ł $3;OB&2ԻHCSe ҀHgLx+%Wi1f"77OxM7yǾlܓwG*EP 4q{.$1'\?<&a~As̻vʅau'6Tx5Fx}(1u]];Gp^]m'o~PV0J$hT.x_S㹺!lg,ƅ1T seN?|u$v7v:py. c.r1u=W7}zPjT i*8}O_.䅣,ZlC({*D6 kࣟXZ|6ΡLk ?fdı7}'SJZ>%^-Qvf5f<]DAUIX$~9 ^P?=͘7%({ԷRtosfZ4yVu%@c QcNMJ-VI;wy<7ȽYݡ5(\qlFk| o^_X\Z\ πחn;d̯/^4JVY1M,c 4l'8f+@+)Y;h>}K0e<=`Fc3tF+P>χoY&pLC1 K[[mV7k^ʪmgvJql0$<5ï!2EÄ^Lvr+˫mGМYlK۷~>t wESLz)("mI-s?6ai%g )ZmW+B6| Oatڹ1w>3F KgQʴ\,g#1WhKWDϏ"c>Ɍ\]rNSlG[# lvcm5dxeH \.wYu{7XT]v9xq!%LtNՒvmѸi "W]/LRPPML/(*̗qWYA;]S]zʱ/y\^H|i"tt`WォWOֈkw]䄴WdLMlVf,P 6 n%֌0z^XL)+iQ[ >Ux 9d\>}P 'پޔ c|}n)涪_\z>!Uv\Qb g+q?S˪3jdN5o7 sH0>J kc* :Ӄ=&`ITx}鑕Yc/ ~v: }.SI,GůRR1,&V@SI1RZ^_z#.&EJYJ Ă5o^o@(}+@zQFW_ O55\DK+%&'ӧj ؈ x:e#ilBXtOMx0} >46:C /x VF?Ua 0s /OO.;,W.>u8acWY6wwntc=CzÉ~1o 㽂,x?~j3> H?i)ToKzVkD Jxw ۨxi9v!屐DVtxkIl lx; |@xC H ɥ)W͐reƺV 2x;xqBoV`Pڅx-K3N]8Oy }x9?g|,`%_UC¸zXhMa=Ѓɶ Π x340031QMNMIKeX\el}Fof2gK PHLcxzde߄&Ҍ<CsSSԔ̒҂Ē"w'>ŶdwqEprp1=mҎyn}ϽxVoP&U3E%㩩$ eIyω-N@Mr6Ph0y7"A&?LfKMH)FTE3T0k@Spo7SR[5| :tƫ+ʠa(M@T LF ƥɦ6Ţ$ФQbD[ɻ/\<wny%K gq6 l!@^Љ j[ u"{!HI.1S4 #Ew_ 53ΘR|Q5quyu9*)2gө_9lx;'oC-3nQ>dCKyDKrtSK@xgyey% y#KfB,M6 `wNOOIZX*pqV+(ӊRSz Ps KRK:,&NML)36J33emo֑c,N-fRQ'4(%5%$(1=bcKx4Ɇd@%JB/pr&Tm0̢=7 3/}o8TKAK!4/$3?ord'CIĢ 3d`_X2\IbRNjtqA~I5W-1' x\r6}}GI]M*ub$6ݭ)p[xJ4@4Fbk&h4F~rOTu\&ztTE~}J]:,QooVN=O^ 8TxqUɺjV]t}sw^7U]&n Ӱ ?eŪ>F}뽽Uyv̓ŸijF=TJR5z]VYUjhrխtSJ՝nZ}OzՅn[@KĹ`E*nZMy0] #STxa q:l xҐXW5;}FiR||M?|Q<