aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'package/kernel')
-rw-r--r--package/kernel/lantiq/ltq-deu/src/Makefile2
-rw-r--r--package/kernel/lantiq/ltq-deu/src/ifxmips_testmgr.h9598
-rw-r--r--package/kernel/lantiq/ltq-deu/src/ltq_deu_testmgr.c3961
3 files changed, 0 insertions, 13561 deletions
diff --git a/package/kernel/lantiq/ltq-deu/src/Makefile b/package/kernel/lantiq/ltq-deu/src/Makefile
index 9714e83786..93ae7ca922 100644
--- a/package/kernel/lantiq/ltq-deu/src/Makefile
+++ b/package/kernel/lantiq/ltq-deu/src/Makefile
@@ -22,5 +22,3 @@ ifeq ($(BUILD_VARIANT),vr9)
ltq_deu_vr9-objs = ifxmips_deu.o ifxmips_deu_vr9.o ifxmips_des.o ifxmips_aes.o ifxmips_arc4.o \
ifxmips_sha1.o ifxmips_md5.o ifxmips_sha1_hmac.o ifxmips_md5_hmac.o
endif
-
-obj-m += ltq_deu_testmgr.o
diff --git a/package/kernel/lantiq/ltq-deu/src/ifxmips_testmgr.h b/package/kernel/lantiq/ltq-deu/src/ifxmips_testmgr.h
deleted file mode 100644
index 27fe9a9f62..0000000000
--- a/package/kernel/lantiq/ltq-deu/src/ifxmips_testmgr.h
+++ /dev/null
@@ -1,9598 +0,0 @@
-/*
- * Algorithm testing framework and tests.
- *
- * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
- * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
- * Copyright (c) 2007 Nokia Siemens Networks
- * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- */
-#ifndef _IFXMIPS_CRYPTO_TESTMGR_H
-#define _IFXMIPS_CRYPTO_TESTMGR_H
-
-#include <linux/netlink.h>
-#include <linux/zlib.h>
-
-#include <crypto/compress.h>
-
-#define MAX_DIGEST_SIZE 64
-#define MAX_TAP 8
-
-#define MAX_KEYLEN 56
-#define MAX_IVLEN 32
-
-struct hash_testvec {
- /* only used with keyed hash algorithms */
- char *key;
- char *plaintext;
- char *digest;
- unsigned char tap[MAX_TAP];
- unsigned char psize;
- unsigned char np;
- unsigned char ksize;
-};
-
-struct cipher_testvec {
- char *key;
- char *iv;
- char *input;
- char *result;
- unsigned short tap[MAX_TAP];
- int np;
- unsigned char fail;
- unsigned char wk; /* weak key flag */
- unsigned char klen;
- unsigned short ilen;
- unsigned short rlen;
-};
-
-struct aead_testvec {
- char *key;
- char *iv;
- char *input;
- char *assoc;
- char *result;
- unsigned char tap[MAX_TAP];
- unsigned char atap[MAX_TAP];
- int np;
- int anp;
- unsigned char fail;
- unsigned char novrfy; /* ccm dec verification failure expected */
- unsigned char wk; /* weak key flag */
- unsigned char klen;
- unsigned short ilen;
- unsigned short alen;
- unsigned short rlen;
-};
-
-struct cprng_testvec {
- char *key;
- char *dt;
- char *v;
- char *result;
- unsigned char klen;
- unsigned short dtlen;
- unsigned short vlen;
- unsigned short rlen;
- unsigned short loops;
-};
-
-static char zeroed_string[48];
-
-/*
- * MD4 test vectors from RFC1320
- */
-#define MD4_TEST_VECTORS 7
-
-static struct hash_testvec md4_tv_template [] = {
- {
- .plaintext = "",
- .digest = "\x31\xd6\xcf\xe0\xd1\x6a\xe9\x31"
- "\xb7\x3c\x59\xd7\xe0\xc0\x89\xc0",
- }, {
- .plaintext = "a",
- .psize = 1,
- .digest = "\xbd\xe5\x2c\xb3\x1d\xe3\x3e\x46"
- "\x24\x5e\x05\xfb\xdb\xd6\xfb\x24",
- }, {
- .plaintext = "abc",
- .psize = 3,
- .digest = "\xa4\x48\x01\x7a\xaf\x21\xd8\x52"
- "\x5f\xc1\x0a\xe8\x7a\xa6\x72\x9d",
- }, {
- .plaintext = "message digest",
- .psize = 14,
- .digest = "\xd9\x13\x0a\x81\x64\x54\x9f\xe8"
- "\x18\x87\x48\x06\xe1\xc7\x01\x4b",
- }, {
- .plaintext = "abcdefghijklmnopqrstuvwxyz",
- .psize = 26,
- .digest = "\xd7\x9e\x1c\x30\x8a\xa5\xbb\xcd"
- "\xee\xa8\xed\x63\xdf\x41\x2d\xa9",
- .np = 2,
- .tap = { 13, 13 },
- }, {
- .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
- .psize = 62,
- .digest = "\x04\x3f\x85\x82\xf2\x41\xdb\x35"
- "\x1c\xe6\x27\xe1\x53\xe7\xf0\xe4",
- }, {
- .plaintext = "123456789012345678901234567890123456789012345678901234567890123"
- "45678901234567890",
- .psize = 80,
- .digest = "\xe3\x3b\x4d\xdc\x9c\x38\xf2\x19"
- "\x9c\x3e\x7b\x16\x4f\xcc\x05\x36",
- },
-};
-
-/*
- * MD5 test vectors from RFC1321
- */
-#define MD5_TEST_VECTORS 7
-
-static struct hash_testvec md5_tv_template[] = {
- {
- .digest = "\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04"
- "\xe9\x80\x09\x98\xec\xf8\x42\x7e",
- }, {
- .plaintext = "a",
- .psize = 1,
- .digest = "\x0c\xc1\x75\xb9\xc0\xf1\xb6\xa8"
- "\x31\xc3\x99\xe2\x69\x77\x26\x61",
- }, {
- .plaintext = "abc",
- .psize = 3,
- .digest = "\x90\x01\x50\x98\x3c\xd2\x4f\xb0"
- "\xd6\x96\x3f\x7d\x28\xe1\x7f\x72",
- }, {
- .plaintext = "message digest",
- .psize = 14,
- .digest = "\xf9\x6b\x69\x7d\x7c\xb7\x93\x8d"
- "\x52\x5a\x2f\x31\xaa\xf1\x61\xd0",
- }, {
- .plaintext = "abcdefghijklmnopqrstuvwxyz",
- .psize = 26,
- .digest = "\xc3\xfc\xd3\xd7\x61\x92\xe4\x00"
- "\x7d\xfb\x49\x6c\xca\x67\xe1\x3b",
- .np = 2,
- .tap = {13, 13}
- }, {
- .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
- .psize = 62,
- .digest = "\xd1\x74\xab\x98\xd2\x77\xd9\xf5"
- "\xa5\x61\x1c\x2c\x9f\x41\x9d\x9f",
- }, {
- .plaintext = "12345678901234567890123456789012345678901234567890123456789012"
- "345678901234567890",
- .psize = 80,
- .digest = "\x57\xed\xf4\xa2\x2b\xe3\xc9\x55"
- "\xac\x49\xda\x2e\x21\x07\xb6\x7a",
- }
-
-};
-
-/*
- * RIPEMD-128 test vectors from ISO/IEC 10118-3:2004(E)
- */
-#define RMD128_TEST_VECTORS 10
-
-static struct hash_testvec rmd128_tv_template[] = {
- {
- .digest = "\xcd\xf2\x62\x13\xa1\x50\xdc\x3e"
- "\xcb\x61\x0f\x18\xf6\xb3\x8b\x46",
- }, {
- .plaintext = "a",
- .psize = 1,
- .digest = "\x86\xbe\x7a\xfa\x33\x9d\x0f\xc7"
- "\xcf\xc7\x85\xe7\x2f\x57\x8d\x33",
- }, {
- .plaintext = "abc",
- .psize = 3,
- .digest = "\xc1\x4a\x12\x19\x9c\x66\xe4\xba"
- "\x84\x63\x6b\x0f\x69\x14\x4c\x77",
- }, {
- .plaintext = "message digest",
- .psize = 14,
- .digest = "\x9e\x32\x7b\x3d\x6e\x52\x30\x62"
- "\xaf\xc1\x13\x2d\x7d\xf9\xd1\xb8",
- }, {
- .plaintext = "abcdefghijklmnopqrstuvwxyz",
- .psize = 26,
- .digest = "\xfd\x2a\xa6\x07\xf7\x1d\xc8\xf5"
- "\x10\x71\x49\x22\xb3\x71\x83\x4e",
- }, {
- .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcde"
- "fghijklmnopqrstuvwxyz0123456789",
- .psize = 62,
- .digest = "\xd1\xe9\x59\xeb\x17\x9c\x91\x1f"
- "\xae\xa4\x62\x4c\x60\xc5\xc7\x02",
- }, {
- .plaintext = "1234567890123456789012345678901234567890"
- "1234567890123456789012345678901234567890",
- .psize = 80,
- .digest = "\x3f\x45\xef\x19\x47\x32\xc2\xdb"
- "\xb2\xc4\xa2\xc7\x69\x79\x5f\xa3",
- }, {
- .plaintext = "abcdbcdecdefdefgefghfghighij"
- "hijkijkljklmklmnlmnomnopnopq",
- .psize = 56,
- .digest = "\xa1\xaa\x06\x89\xd0\xfa\xfa\x2d"
- "\xdc\x22\xe8\x8b\x49\x13\x3a\x06",
- .np = 2,
- .tap = { 28, 28 },
- }, {
- .plaintext = "abcdefghbcdefghicdefghijdefghijkefghijklfghi"
- "jklmghijklmnhijklmnoijklmnopjklmnopqklmnopqr"
- "lmnopqrsmnopqrstnopqrstu",
- .psize = 112,
- .digest = "\xd4\xec\xc9\x13\xe1\xdf\x77\x6b"
- "\xf4\x8d\xe9\xd5\x5b\x1f\x25\x46",
- }, {
- .plaintext = "abcdbcdecdefdefgefghfghighijhijk",
- .psize = 32,
- .digest = "\x13\xfc\x13\xe8\xef\xff\x34\x7d"
- "\xe1\x93\xff\x46\xdb\xac\xcf\xd4",
- }
-};
-
-/*
- * RIPEMD-160 test vectors from ISO/IEC 10118-3:2004(E)
- */
-#define RMD160_TEST_VECTORS 10
-
-static struct hash_testvec rmd160_tv_template[] = {
- {
- .digest = "\x9c\x11\x85\xa5\xc5\xe9\xfc\x54\x61\x28"
- "\x08\x97\x7e\xe8\xf5\x48\xb2\x25\x8d\x31",
- }, {
- .plaintext = "a",
- .psize = 1,
- .digest = "\x0b\xdc\x9d\x2d\x25\x6b\x3e\xe9\xda\xae"
- "\x34\x7b\xe6\xf4\xdc\x83\x5a\x46\x7f\xfe",
- }, {
- .plaintext = "abc",
- .psize = 3,
- .digest = "\x8e\xb2\x08\xf7\xe0\x5d\x98\x7a\x9b\x04"
- "\x4a\x8e\x98\xc6\xb0\x87\xf1\x5a\x0b\xfc",
- }, {
- .plaintext = "message digest",
- .psize = 14,
- .digest = "\x5d\x06\x89\xef\x49\xd2\xfa\xe5\x72\xb8"
- "\x81\xb1\x23\xa8\x5f\xfa\x21\x59\x5f\x36",
- }, {
- .plaintext = "abcdefghijklmnopqrstuvwxyz",
- .psize = 26,
- .digest = "\xf7\x1c\x27\x10\x9c\x69\x2c\x1b\x56\xbb"
- "\xdc\xeb\x5b\x9d\x28\x65\xb3\x70\x8d\xbc",
- }, {
- .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcde"
- "fghijklmnopqrstuvwxyz0123456789",
- .psize = 62,
- .digest = "\xb0\xe2\x0b\x6e\x31\x16\x64\x02\x86\xed"
- "\x3a\x87\xa5\x71\x30\x79\xb2\x1f\x51\x89",
- }, {
- .plaintext = "1234567890123456789012345678901234567890"
- "1234567890123456789012345678901234567890",
- .psize = 80,
- .digest = "\x9b\x75\x2e\x45\x57\x3d\x4b\x39\xf4\xdb"
- "\xd3\x32\x3c\xab\x82\xbf\x63\x32\x6b\xfb",
- }, {
- .plaintext = "abcdbcdecdefdefgefghfghighij"
- "hijkijkljklmklmnlmnomnopnopq",
- .psize = 56,
- .digest = "\x12\xa0\x53\x38\x4a\x9c\x0c\x88\xe4\x05"
- "\xa0\x6c\x27\xdc\xf4\x9a\xda\x62\xeb\x2b",
- .np = 2,
- .tap = { 28, 28 },
- }, {
- .plaintext = "abcdefghbcdefghicdefghijdefghijkefghijklfghi"
- "jklmghijklmnhijklmnoijklmnopjklmnopqklmnopqr"
- "lmnopqrsmnopqrstnopqrstu",
- .psize = 112,
- .digest = "\x6f\x3f\xa3\x9b\x6b\x50\x3c\x38\x4f\x91"
- "\x9a\x49\xa7\xaa\x5c\x2c\x08\xbd\xfb\x45",
- }, {
- .plaintext = "abcdbcdecdefdefgefghfghighijhijk",
- .psize = 32,
- .digest = "\x94\xc2\x64\x11\x54\x04\xe6\x33\x79\x0d"
- "\xfc\xc8\x7b\x58\x7d\x36\x77\x06\x7d\x9f",
- }
-};
-
-/*
- * RIPEMD-256 test vectors
- */
-#define RMD256_TEST_VECTORS 8
-
-static struct hash_testvec rmd256_tv_template[] = {
- {
- .digest = "\x02\xba\x4c\x4e\x5f\x8e\xcd\x18"
- "\x77\xfc\x52\xd6\x4d\x30\xe3\x7a"
- "\x2d\x97\x74\xfb\x1e\x5d\x02\x63"
- "\x80\xae\x01\x68\xe3\xc5\x52\x2d",
- }, {
- .plaintext = "a",
- .psize = 1,
- .digest = "\xf9\x33\x3e\x45\xd8\x57\xf5\xd9"
- "\x0a\x91\xba\xb7\x0a\x1e\xba\x0c"
- "\xfb\x1b\xe4\xb0\x78\x3c\x9a\xcf"
- "\xcd\x88\x3a\x91\x34\x69\x29\x25",
- }, {
- .plaintext = "abc",
- .psize = 3,
- .digest = "\xaf\xbd\x6e\x22\x8b\x9d\x8c\xbb"
- "\xce\xf5\xca\x2d\x03\xe6\xdb\xa1"
- "\x0a\xc0\xbc\x7d\xcb\xe4\x68\x0e"
- "\x1e\x42\xd2\xe9\x75\x45\x9b\x65",
- }, {
- .plaintext = "message digest",
- .psize = 14,
- .digest = "\x87\xe9\x71\x75\x9a\x1c\xe4\x7a"
- "\x51\x4d\x5c\x91\x4c\x39\x2c\x90"
- "\x18\xc7\xc4\x6b\xc1\x44\x65\x55"
- "\x4a\xfc\xdf\x54\xa5\x07\x0c\x0e",
- }, {
- .plaintext = "abcdefghijklmnopqrstuvwxyz",
- .psize = 26,
- .digest = "\x64\x9d\x30\x34\x75\x1e\xa2\x16"
- "\x77\x6b\xf9\xa1\x8a\xcc\x81\xbc"
- "\x78\x96\x11\x8a\x51\x97\x96\x87"
- "\x82\xdd\x1f\xd9\x7d\x8d\x51\x33",
- }, {
- .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcde"
- "fghijklmnopqrstuvwxyz0123456789",
- .psize = 62,
- .digest = "\x57\x40\xa4\x08\xac\x16\xb7\x20"
- "\xb8\x44\x24\xae\x93\x1c\xbb\x1f"
- "\xe3\x63\xd1\xd0\xbf\x40\x17\xf1"
- "\xa8\x9f\x7e\xa6\xde\x77\xa0\xb8",
- }, {
- .plaintext = "1234567890123456789012345678901234567890"
- "1234567890123456789012345678901234567890",
- .psize = 80,
- .digest = "\x06\xfd\xcc\x7a\x40\x95\x48\xaa"
- "\xf9\x13\x68\xc0\x6a\x62\x75\xb5"
- "\x53\xe3\xf0\x99\xbf\x0e\xa4\xed"
- "\xfd\x67\x78\xdf\x89\xa8\x90\xdd",
- }, {
- .plaintext = "abcdbcdecdefdefgefghfghighij"
- "hijkijkljklmklmnlmnomnopnopq",
- .psize = 56,
- .digest = "\x38\x43\x04\x55\x83\xaa\xc6\xc8"
- "\xc8\xd9\x12\x85\x73\xe7\xa9\x80"
- "\x9a\xfb\x2a\x0f\x34\xcc\xc3\x6e"
- "\xa9\xe7\x2f\x16\xf6\x36\x8e\x3f",
- .np = 2,
- .tap = { 28, 28 },
- }
-};
-
-/*
- * RIPEMD-320 test vectors
- */
-#define RMD320_TEST_VECTORS 8
-
-static struct hash_testvec rmd320_tv_template[] = {
- {
- .digest = "\x22\xd6\x5d\x56\x61\x53\x6c\xdc\x75\xc1"
- "\xfd\xf5\xc6\xde\x7b\x41\xb9\xf2\x73\x25"
- "\xeb\xc6\x1e\x85\x57\x17\x7d\x70\x5a\x0e"
- "\xc8\x80\x15\x1c\x3a\x32\xa0\x08\x99\xb8",
- }, {
- .plaintext = "a",
- .psize = 1,
- .digest = "\xce\x78\x85\x06\x38\xf9\x26\x58\xa5\xa5"
- "\x85\x09\x75\x79\x92\x6d\xda\x66\x7a\x57"
- "\x16\x56\x2c\xfc\xf6\xfb\xe7\x7f\x63\x54"
- "\x2f\x99\xb0\x47\x05\xd6\x97\x0d\xff\x5d",
- }, {
- .plaintext = "abc",
- .psize = 3,
- .digest = "\xde\x4c\x01\xb3\x05\x4f\x89\x30\xa7\x9d"
- "\x09\xae\x73\x8e\x92\x30\x1e\x5a\x17\x08"
- "\x5b\xef\xfd\xc1\xb8\xd1\x16\x71\x3e\x74"
- "\xf8\x2f\xa9\x42\xd6\x4c\xdb\xc4\x68\x2d",
- }, {
- .plaintext = "message digest",
- .psize = 14,
- .digest = "\x3a\x8e\x28\x50\x2e\xd4\x5d\x42\x2f\x68"
- "\x84\x4f\x9d\xd3\x16\xe7\xb9\x85\x33\xfa"
- "\x3f\x2a\x91\xd2\x9f\x84\xd4\x25\xc8\x8d"
- "\x6b\x4e\xff\x72\x7d\xf6\x6a\x7c\x01\x97",
- }, {
- .plaintext = "abcdefghijklmnopqrstuvwxyz",
- .psize = 26,
- .digest = "\xca\xbd\xb1\x81\x0b\x92\x47\x0a\x20\x93"
- "\xaa\x6b\xce\x05\x95\x2c\x28\x34\x8c\xf4"
- "\x3f\xf6\x08\x41\x97\x51\x66\xbb\x40\xed"
- "\x23\x40\x04\xb8\x82\x44\x63\xe6\xb0\x09",
- }, {
- .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcde"
- "fghijklmnopqrstuvwxyz0123456789",
- .psize = 62,
- .digest = "\xed\x54\x49\x40\xc8\x6d\x67\xf2\x50\xd2"
- "\x32\xc3\x0b\x7b\x3e\x57\x70\xe0\xc6\x0c"
- "\x8c\xb9\xa4\xca\xfe\x3b\x11\x38\x8a\xf9"
- "\x92\x0e\x1b\x99\x23\x0b\x84\x3c\x86\xa4",
- }, {
- .plaintext = "1234567890123456789012345678901234567890"
- "1234567890123456789012345678901234567890",
- .psize = 80,
- .digest = "\x55\x78\x88\xaf\x5f\x6d\x8e\xd6\x2a\xb6"
- "\x69\x45\xc6\xd2\xa0\xa4\x7e\xcd\x53\x41"
- "\xe9\x15\xeb\x8f\xea\x1d\x05\x24\x95\x5f"
- "\x82\x5d\xc7\x17\xe4\xa0\x08\xab\x2d\x42",
- }, {
- .plaintext = "abcdbcdecdefdefgefghfghighij"
- "hijkijkljklmklmnlmnomnopnopq",
- .psize = 56,
- .digest = "\xd0\x34\xa7\x95\x0c\xf7\x22\x02\x1b\xa4"
- "\xb8\x4d\xf7\x69\xa5\xde\x20\x60\xe2\x59"
- "\xdf\x4c\x9b\xb4\xa4\x26\x8c\x0e\x93\x5b"
- "\xbc\x74\x70\xa9\x69\xc9\xd0\x72\xa1\xac",
- .np = 2,
- .tap = { 28, 28 },
- }
-};
-
-/*
- * SHA1 test vectors from from FIPS PUB 180-1
- */
-#define SHA1_TEST_VECTORS 2
-
-static struct hash_testvec sha1_tv_template[] = {
- {
- .plaintext = "abc",
- .psize = 3,
- .digest = "\xa9\x99\x3e\x36\x47\x06\x81\x6a\xba\x3e"
- "\x25\x71\x78\x50\xc2\x6c\x9c\xd0\xd8\x9d",
- }, {
- .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
- .psize = 56,
- .digest = "\x84\x98\x3e\x44\x1c\x3b\xd2\x6e\xba\xae"
- "\x4a\xa1\xf9\x51\x29\xe5\xe5\x46\x70\xf1",
- .np = 2,
- .tap = { 28, 28 }
- }
-};
-
-
-/*
- * SHA224 test vectors from from FIPS PUB 180-2
- */
-#define SHA224_TEST_VECTORS 2
-
-static struct hash_testvec sha224_tv_template[] = {
- {
- .plaintext = "abc",
- .psize = 3,
- .digest = "\x23\x09\x7D\x22\x34\x05\xD8\x22"
- "\x86\x42\xA4\x77\xBD\xA2\x55\xB3"
- "\x2A\xAD\xBC\xE4\xBD\xA0\xB3\xF7"
- "\xE3\x6C\x9D\xA7",
- }, {
- .plaintext =
- "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
- .psize = 56,
- .digest = "\x75\x38\x8B\x16\x51\x27\x76\xCC"
- "\x5D\xBA\x5D\xA1\xFD\x89\x01\x50"
- "\xB0\xC6\x45\x5C\xB4\xF5\x8B\x19"
- "\x52\x52\x25\x25",
- .np = 2,
- .tap = { 28, 28 }
- }
-};
-
-/*
- * SHA256 test vectors from from NIST
- */
-#define SHA256_TEST_VECTORS 2
-
-static struct hash_testvec sha256_tv_template[] = {
- {
- .plaintext = "abc",
- .psize = 3,
- .digest = "\xba\x78\x16\xbf\x8f\x01\xcf\xea"
- "\x41\x41\x40\xde\x5d\xae\x22\x23"
- "\xb0\x03\x61\xa3\x96\x17\x7a\x9c"
- "\xb4\x10\xff\x61\xf2\x00\x15\xad",
- }, {
- .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
- .psize = 56,
- .digest = "\x24\x8d\x6a\x61\xd2\x06\x38\xb8"
- "\xe5\xc0\x26\x93\x0c\x3e\x60\x39"
- "\xa3\x3c\xe4\x59\x64\xff\x21\x67"
- "\xf6\xec\xed\xd4\x19\xdb\x06\xc1",
- .np = 2,
- .tap = { 28, 28 }
- },
-};
-
-/*
- * SHA384 test vectors from from NIST and kerneli
- */
-#define SHA384_TEST_VECTORS 4
-
-static struct hash_testvec sha384_tv_template[] = {
- {
- .plaintext= "abc",
- .psize = 3,
- .digest = "\xcb\x00\x75\x3f\x45\xa3\x5e\x8b"
- "\xb5\xa0\x3d\x69\x9a\xc6\x50\x07"
- "\x27\x2c\x32\xab\x0e\xde\xd1\x63"
- "\x1a\x8b\x60\x5a\x43\xff\x5b\xed"
- "\x80\x86\x07\x2b\xa1\xe7\xcc\x23"
- "\x58\xba\xec\xa1\x34\xc8\x25\xa7",
- }, {
- .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
- .psize = 56,
- .digest = "\x33\x91\xfd\xdd\xfc\x8d\xc7\x39"
- "\x37\x07\xa6\x5b\x1b\x47\x09\x39"
- "\x7c\xf8\xb1\xd1\x62\xaf\x05\xab"
- "\xfe\x8f\x45\x0d\xe5\xf3\x6b\xc6"
- "\xb0\x45\x5a\x85\x20\xbc\x4e\x6f"
- "\x5f\xe9\x5b\x1f\xe3\xc8\x45\x2b",
- }, {
- .plaintext = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
- "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
- .psize = 112,
- .digest = "\x09\x33\x0c\x33\xf7\x11\x47\xe8"
- "\x3d\x19\x2f\xc7\x82\xcd\x1b\x47"
- "\x53\x11\x1b\x17\x3b\x3b\x05\xd2"
- "\x2f\xa0\x80\x86\xe3\xb0\xf7\x12"
- "\xfc\xc7\xc7\x1a\x55\x7e\x2d\xb9"
- "\x66\xc3\xe9\xfa\x91\x74\x60\x39",
- }, {
- .plaintext = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
- "efghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
- .psize = 104,
- .digest = "\x3d\x20\x89\x73\xab\x35\x08\xdb"
- "\xbd\x7e\x2c\x28\x62\xba\x29\x0a"
- "\xd3\x01\x0e\x49\x78\xc1\x98\xdc"
- "\x4d\x8f\xd0\x14\xe5\x82\x82\x3a"
- "\x89\xe1\x6f\x9b\x2a\x7b\xbc\x1a"
- "\xc9\x38\xe2\xd1\x99\xe8\xbe\xa4",
- .np = 4,
- .tap = { 26, 26, 26, 26 }
- },
-};
-
-/*
- * SHA512 test vectors from from NIST and kerneli
- */
-#define SHA512_TEST_VECTORS 4
-
-static struct hash_testvec sha512_tv_template[] = {
- {
- .plaintext = "abc",
- .psize = 3,
- .digest = "\xdd\xaf\x35\xa1\x93\x61\x7a\xba"
- "\xcc\x41\x73\x49\xae\x20\x41\x31"
- "\x12\xe6\xfa\x4e\x89\xa9\x7e\xa2"
- "\x0a\x9e\xee\xe6\x4b\x55\xd3\x9a"
- "\x21\x92\x99\x2a\x27\x4f\xc1\xa8"
- "\x36\xba\x3c\x23\xa3\xfe\xeb\xbd"
- "\x45\x4d\x44\x23\x64\x3c\xe8\x0e"
- "\x2a\x9a\xc9\x4f\xa5\x4c\xa4\x9f",
- }, {
- .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
- .psize = 56,
- .digest = "\x20\x4a\x8f\xc6\xdd\xa8\x2f\x0a"
- "\x0c\xed\x7b\xeb\x8e\x08\xa4\x16"
- "\x57\xc1\x6e\xf4\x68\xb2\x28\xa8"
- "\x27\x9b\xe3\x31\xa7\x03\xc3\x35"
- "\x96\xfd\x15\xc1\x3b\x1b\x07\xf9"
- "\xaa\x1d\x3b\xea\x57\x78\x9c\xa0"
- "\x31\xad\x85\xc7\xa7\x1d\xd7\x03"
- "\x54\xec\x63\x12\x38\xca\x34\x45",
- }, {
- .plaintext = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
- "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
- .psize = 112,
- .digest = "\x8e\x95\x9b\x75\xda\xe3\x13\xda"
- "\x8c\xf4\xf7\x28\x14\xfc\x14\x3f"
- "\x8f\x77\x79\xc6\xeb\x9f\x7f\xa1"
- "\x72\x99\xae\xad\xb6\x88\x90\x18"
- "\x50\x1d\x28\x9e\x49\x00\xf7\xe4"
- "\x33\x1b\x99\xde\xc4\xb5\x43\x3a"
- "\xc7\xd3\x29\xee\xb6\xdd\x26\x54"
- "\x5e\x96\xe5\x5b\x87\x4b\xe9\x09",
- }, {
- .plaintext = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
- "efghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
- .psize = 104,
- .digest = "\x93\x0d\x0c\xef\xcb\x30\xff\x11"
- "\x33\xb6\x89\x81\x21\xf1\xcf\x3d"
- "\x27\x57\x8a\xfc\xaf\xe8\x67\x7c"
- "\x52\x57\xcf\x06\x99\x11\xf7\x5d"
- "\x8f\x58\x31\xb5\x6e\xbf\xda\x67"
- "\xb2\x78\xe6\x6d\xff\x8b\x84\xfe"
- "\x2b\x28\x70\xf7\x42\xa5\x80\xd8"
- "\xed\xb4\x19\x87\x23\x28\x50\xc9",
- .np = 4,
- .tap = { 26, 26, 26, 26 }
- },
-};
-
-
-/*
- * WHIRLPOOL test vectors from Whirlpool package
- * by Vincent Rijmen and Paulo S. L. M. Barreto as part of the NESSIE
- * submission
- */
-#define WP512_TEST_VECTORS 8
-
-static struct hash_testvec wp512_tv_template[] = {
- {
- .plaintext = "",
- .psize = 0,
- .digest = "\x19\xFA\x61\xD7\x55\x22\xA4\x66"
- "\x9B\x44\xE3\x9C\x1D\x2E\x17\x26"
- "\xC5\x30\x23\x21\x30\xD4\x07\xF8"
- "\x9A\xFE\xE0\x96\x49\x97\xF7\xA7"
- "\x3E\x83\xBE\x69\x8B\x28\x8F\xEB"
- "\xCF\x88\xE3\xE0\x3C\x4F\x07\x57"
- "\xEA\x89\x64\xE5\x9B\x63\xD9\x37"
- "\x08\xB1\x38\xCC\x42\xA6\x6E\xB3",
-
-
- }, {
- .plaintext = "a",
- .psize = 1,
- .digest = "\x8A\xCA\x26\x02\x79\x2A\xEC\x6F"
- "\x11\xA6\x72\x06\x53\x1F\xB7\xD7"
- "\xF0\xDF\xF5\x94\x13\x14\x5E\x69"
- "\x73\xC4\x50\x01\xD0\x08\x7B\x42"
- "\xD1\x1B\xC6\x45\x41\x3A\xEF\xF6"
- "\x3A\x42\x39\x1A\x39\x14\x5A\x59"
- "\x1A\x92\x20\x0D\x56\x01\x95\xE5"
- "\x3B\x47\x85\x84\xFD\xAE\x23\x1A",
- }, {
- .plaintext = "abc",
- .psize = 3,
- .digest = "\x4E\x24\x48\xA4\xC6\xF4\x86\xBB"
- "\x16\xB6\x56\x2C\x73\xB4\x02\x0B"
- "\xF3\x04\x3E\x3A\x73\x1B\xCE\x72"
- "\x1A\xE1\xB3\x03\xD9\x7E\x6D\x4C"
- "\x71\x81\xEE\xBD\xB6\xC5\x7E\x27"
- "\x7D\x0E\x34\x95\x71\x14\xCB\xD6"
- "\xC7\x97\xFC\x9D\x95\xD8\xB5\x82"
- "\xD2\x25\x29\x20\x76\xD4\xEE\xF5",
- }, {
- .plaintext = "message digest",
- .psize = 14,
- .digest = "\x37\x8C\x84\xA4\x12\x6E\x2D\xC6"
- "\xE5\x6D\xCC\x74\x58\x37\x7A\xAC"
- "\x83\x8D\x00\x03\x22\x30\xF5\x3C"
- "\xE1\xF5\x70\x0C\x0F\xFB\x4D\x3B"
- "\x84\x21\x55\x76\x59\xEF\x55\xC1"
- "\x06\xB4\xB5\x2A\xC5\xA4\xAA\xA6"
- "\x92\xED\x92\x00\x52\x83\x8F\x33"
- "\x62\xE8\x6D\xBD\x37\xA8\x90\x3E",
- }, {
- .plaintext = "abcdefghijklmnopqrstuvwxyz",
- .psize = 26,
- .digest = "\xF1\xD7\x54\x66\x26\x36\xFF\xE9"
- "\x2C\x82\xEB\xB9\x21\x2A\x48\x4A"
- "\x8D\x38\x63\x1E\xAD\x42\x38\xF5"
- "\x44\x2E\xE1\x3B\x80\x54\xE4\x1B"
- "\x08\xBF\x2A\x92\x51\xC3\x0B\x6A"
- "\x0B\x8A\xAE\x86\x17\x7A\xB4\xA6"
- "\xF6\x8F\x67\x3E\x72\x07\x86\x5D"
- "\x5D\x98\x19\xA3\xDB\xA4\xEB\x3B",
- }, {
- .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- "abcdefghijklmnopqrstuvwxyz0123456789",
- .psize = 62,
- .digest = "\xDC\x37\xE0\x08\xCF\x9E\xE6\x9B"
- "\xF1\x1F\x00\xED\x9A\xBA\x26\x90"
- "\x1D\xD7\xC2\x8C\xDE\xC0\x66\xCC"
- "\x6A\xF4\x2E\x40\xF8\x2F\x3A\x1E"
- "\x08\xEB\xA2\x66\x29\x12\x9D\x8F"
- "\xB7\xCB\x57\x21\x1B\x92\x81\xA6"
- "\x55\x17\xCC\x87\x9D\x7B\x96\x21"
- "\x42\xC6\x5F\x5A\x7A\xF0\x14\x67",
- }, {
- .plaintext = "1234567890123456789012345678901234567890"
- "1234567890123456789012345678901234567890",
- .psize = 80,
- .digest = "\x46\x6E\xF1\x8B\xAB\xB0\x15\x4D"
- "\x25\xB9\xD3\x8A\x64\x14\xF5\xC0"
- "\x87\x84\x37\x2B\xCC\xB2\x04\xD6"
- "\x54\x9C\x4A\xFA\xDB\x60\x14\x29"
- "\x4D\x5B\xD8\xDF\x2A\x6C\x44\xE5"
- "\x38\xCD\x04\x7B\x26\x81\xA5\x1A"
- "\x2C\x60\x48\x1E\x88\xC5\xA2\x0B"
- "\x2C\x2A\x80\xCF\x3A\x9A\x08\x3B",
- }, {
- .plaintext = "abcdbcdecdefdefgefghfghighijhijk",
- .psize = 32,
- .digest = "\x2A\x98\x7E\xA4\x0F\x91\x70\x61"
- "\xF5\xD6\xF0\xA0\xE4\x64\x4F\x48"
- "\x8A\x7A\x5A\x52\xDE\xEE\x65\x62"
- "\x07\xC5\x62\xF9\x88\xE9\x5C\x69"
- "\x16\xBD\xC8\x03\x1B\xC5\xBE\x1B"
- "\x7B\x94\x76\x39\xFE\x05\x0B\x56"
- "\x93\x9B\xAA\xA0\xAD\xFF\x9A\xE6"
- "\x74\x5B\x7B\x18\x1C\x3B\xE3\xFD",
- },
-};
-
-#define WP384_TEST_VECTORS 8
-
-static struct hash_testvec wp384_tv_template[] = {
- {
- .plaintext = "",
- .psize = 0,
- .digest = "\x19\xFA\x61\xD7\x55\x22\xA4\x66"
- "\x9B\x44\xE3\x9C\x1D\x2E\x17\x26"
- "\xC5\x30\x23\x21\x30\xD4\x07\xF8"
- "\x9A\xFE\xE0\x96\x49\x97\xF7\xA7"
- "\x3E\x83\xBE\x69\x8B\x28\x8F\xEB"
- "\xCF\x88\xE3\xE0\x3C\x4F\x07\x57",
-
-
- }, {
- .plaintext = "a",
- .psize = 1,
- .digest = "\x8A\xCA\x26\x02\x79\x2A\xEC\x6F"
- "\x11\xA6\x72\x06\x53\x1F\xB7\xD7"
- "\xF0\xDF\xF5\x94\x13\x14\x5E\x69"
- "\x73\xC4\x50\x01\xD0\x08\x7B\x42"
- "\xD1\x1B\xC6\x45\x41\x3A\xEF\xF6"
- "\x3A\x42\x39\x1A\x39\x14\x5A\x59",
- }, {
- .plaintext = "abc",
- .psize = 3,
- .digest = "\x4E\x24\x48\xA4\xC6\xF4\x86\xBB"
- "\x16\xB6\x56\x2C\x73\xB4\x02\x0B"
- "\xF3\x04\x3E\x3A\x73\x1B\xCE\x72"
- "\x1A\xE1\xB3\x03\xD9\x7E\x6D\x4C"
- "\x71\x81\xEE\xBD\xB6\xC5\x7E\x27"
- "\x7D\x0E\x34\x95\x71\x14\xCB\xD6",
- }, {
- .plaintext = "message digest",
- .psize = 14,
- .digest = "\x37\x8C\x84\xA4\x12\x6E\x2D\xC6"
- "\xE5\x6D\xCC\x74\x58\x37\x7A\xAC"
- "\x83\x8D\x00\x03\x22\x30\xF5\x3C"
- "\xE1\xF5\x70\x0C\x0F\xFB\x4D\x3B"
- "\x84\x21\x55\x76\x59\xEF\x55\xC1"
- "\x06\xB4\xB5\x2A\xC5\xA4\xAA\xA6",
- }, {
- .plaintext = "abcdefghijklmnopqrstuvwxyz",
- .psize = 26,
- .digest = "\xF1\xD7\x54\x66\x26\x36\xFF\xE9"
- "\x2C\x82\xEB\xB9\x21\x2A\x48\x4A"
- "\x8D\x38\x63\x1E\xAD\x42\x38\xF5"
- "\x44\x2E\xE1\x3B\x80\x54\xE4\x1B"
- "\x08\xBF\x2A\x92\x51\xC3\x0B\x6A"
- "\x0B\x8A\xAE\x86\x17\x7A\xB4\xA6",
- }, {
- .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- "abcdefghijklmnopqrstuvwxyz0123456789",
- .psize = 62,
- .digest = "\xDC\x37\xE0\x08\xCF\x9E\xE6\x9B"
- "\xF1\x1F\x00\xED\x9A\xBA\x26\x90"
- "\x1D\xD7\xC2\x8C\xDE\xC0\x66\xCC"
- "\x6A\xF4\x2E\x40\xF8\x2F\x3A\x1E"
- "\x08\xEB\xA2\x66\x29\x12\x9D\x8F"
- "\xB7\xCB\x57\x21\x1B\x92\x81\xA6",
- }, {
- .plaintext = "1234567890123456789012345678901234567890"
- "1234567890123456789012345678901234567890",
- .psize = 80,
- .digest = "\x46\x6E\xF1\x8B\xAB\xB0\x15\x4D"
- "\x25\xB9\xD3\x8A\x64\x14\xF5\xC0"
- "\x87\x84\x37\x2B\xCC\xB2\x04\xD6"
- "\x54\x9C\x4A\xFA\xDB\x60\x14\x29"
- "\x4D\x5B\xD8\xDF\x2A\x6C\x44\xE5"
- "\x38\xCD\x04\x7B\x26\x81\xA5\x1A",
- }, {
- .plaintext = "abcdbcdecdefdefgefghfghighijhijk",
- .psize = 32,
- .digest = "\x2A\x98\x7E\xA4\x0F\x91\x70\x61"
- "\xF5\xD6\xF0\xA0\xE4\x64\x4F\x48"
- "\x8A\x7A\x5A\x52\xDE\xEE\x65\x62"
- "\x07\xC5\x62\xF9\x88\xE9\x5C\x69"
- "\x16\xBD\xC8\x03\x1B\xC5\xBE\x1B"
- "\x7B\x94\x76\x39\xFE\x05\x0B\x56",
- },
-};
-
-#define WP256_TEST_VECTORS 8
-
-static struct hash_testvec wp256_tv_template[] = {
- {
- .plaintext = "",
- .psize = 0,
- .digest = "\x19\xFA\x61\xD7\x55\x22\xA4\x66"
- "\x9B\x44\xE3\x9C\x1D\x2E\x17\x26"
- "\xC5\x30\x23\x21\x30\xD4\x07\xF8"
- "\x9A\xFE\xE0\x96\x49\x97\xF7\xA7",
-
-
- }, {
- .plaintext = "a",
- .psize = 1,
- .digest = "\x8A\xCA\x26\x02\x79\x2A\xEC\x6F"
- "\x11\xA6\x72\x06\x53\x1F\xB7\xD7"
- "\xF0\xDF\xF5\x94\x13\x14\x5E\x69"
- "\x73\xC4\x50\x01\xD0\x08\x7B\x42",
- }, {
- .plaintext = "abc",
- .psize = 3,
- .digest = "\x4E\x24\x48\xA4\xC6\xF4\x86\xBB"
- "\x16\xB6\x56\x2C\x73\xB4\x02\x0B"
- "\xF3\x04\x3E\x3A\x73\x1B\xCE\x72"
- "\x1A\xE1\xB3\x03\xD9\x7E\x6D\x4C",
- }, {
- .plaintext = "message digest",
- .psize = 14,
- .digest = "\x37\x8C\x84\xA4\x12\x6E\x2D\xC6"
- "\xE5\x6D\xCC\x74\x58\x37\x7A\xAC"
- "\x83\x8D\x00\x03\x22\x30\xF5\x3C"
- "\xE1\xF5\x70\x0C\x0F\xFB\x4D\x3B",
- }, {
- .plaintext = "abcdefghijklmnopqrstuvwxyz",
- .psize = 26,
- .digest = "\xF1\xD7\x54\x66\x26\x36\xFF\xE9"
- "\x2C\x82\xEB\xB9\x21\x2A\x48\x4A"
- "\x8D\x38\x63\x1E\xAD\x42\x38\xF5"
- "\x44\x2E\xE1\x3B\x80\x54\xE4\x1B",
- }, {
- .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- "abcdefghijklmnopqrstuvwxyz0123456789",
- .psize = 62,
- .digest = "\xDC\x37\xE0\x08\xCF\x9E\xE6\x9B"
- "\xF1\x1F\x00\xED\x9A\xBA\x26\x90"
- "\x1D\xD7\xC2\x8C\xDE\xC0\x66\xCC"
- "\x6A\xF4\x2E\x40\xF8\x2F\x3A\x1E",
- }, {
- .plaintext = "1234567890123456789012345678901234567890"
- "1234567890123456789012345678901234567890",
- .psize = 80,
- .digest = "\x46\x6E\xF1\x8B\xAB\xB0\x15\x4D"
- "\x25\xB9\xD3\x8A\x64\x14\xF5\xC0"
- "\x87\x84\x37\x2B\xCC\xB2\x04\xD6"
- "\x54\x9C\x4A\xFA\xDB\x60\x14\x29",
- }, {
- .plaintext = "abcdbcdecdefdefgefghfghighijhijk",
- .psize = 32,
- .digest = "\x2A\x98\x7E\xA4\x0F\x91\x70\x61"
- "\xF5\xD6\xF0\xA0\xE4\x64\x4F\x48"
- "\x8A\x7A\x5A\x52\xDE\xEE\x65\x62"
- "\x07\xC5\x62\xF9\x88\xE9\x5C\x69",
- },
-};
-
-/*
- * TIGER test vectors from Tiger website
- */
-#define TGR192_TEST_VECTORS 6
-
-static struct hash_testvec tgr192_tv_template[] = {
- {
- .plaintext = "",
- .psize = 0,
- .digest = "\x24\xf0\x13\x0c\x63\xac\x93\x32"
- "\x16\x16\x6e\x76\xb1\xbb\x92\x5f"
- "\xf3\x73\xde\x2d\x49\x58\x4e\x7a",
- }, {
- .plaintext = "abc",
- .psize = 3,
- .digest = "\xf2\x58\xc1\xe8\x84\x14\xab\x2a"
- "\x52\x7a\xb5\x41\xff\xc5\xb8\xbf"
- "\x93\x5f\x7b\x95\x1c\x13\x29\x51",
- }, {
- .plaintext = "Tiger",
- .psize = 5,
- .digest = "\x9f\x00\xf5\x99\x07\x23\x00\xdd"
- "\x27\x6a\xbb\x38\xc8\xeb\x6d\xec"
- "\x37\x79\x0c\x11\x6f\x9d\x2b\xdf",
- }, {
- .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-",
- .psize = 64,
- .digest = "\x87\xfb\x2a\x90\x83\x85\x1c\xf7"
- "\x47\x0d\x2c\xf8\x10\xe6\xdf\x9e"
- "\xb5\x86\x44\x50\x34\xa5\xa3\x86",
- }, {
- .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdefghijklmnopqrstuvwxyz+0123456789",
- .psize = 64,
- .digest = "\x46\x7d\xb8\x08\x63\xeb\xce\x48"
- "\x8d\xf1\xcd\x12\x61\x65\x5d\xe9"
- "\x57\x89\x65\x65\x97\x5f\x91\x97",
- }, {
- .plaintext = "Tiger - A Fast New Hash Function, "
- "by Ross Anderson and Eli Biham, "
- "proceedings of Fast Software Encryption 3, "
- "Cambridge, 1996.",
- .psize = 125,
- .digest = "\x3d\x9a\xeb\x03\xd1\xbd\x1a\x63"
- "\x57\xb2\x77\x4d\xfd\x6d\x5b\x24"
- "\xdd\x68\x15\x1d\x50\x39\x74\xfc",
- },
-};
-
-#define TGR160_TEST_VECTORS 6
-
-static struct hash_testvec tgr160_tv_template[] = {
- {
- .plaintext = "",
- .psize = 0,
- .digest = "\x24\xf0\x13\x0c\x63\xac\x93\x32"
- "\x16\x16\x6e\x76\xb1\xbb\x92\x5f"
- "\xf3\x73\xde\x2d",
- }, {
- .plaintext = "abc",
- .psize = 3,
- .digest = "\xf2\x58\xc1\xe8\x84\x14\xab\x2a"
- "\x52\x7a\xb5\x41\xff\xc5\xb8\xbf"
- "\x93\x5f\x7b\x95",
- }, {
- .plaintext = "Tiger",
- .psize = 5,
- .digest = "\x9f\x00\xf5\x99\x07\x23\x00\xdd"
- "\x27\x6a\xbb\x38\xc8\xeb\x6d\xec"
- "\x37\x79\x0c\x11",
- }, {
- .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-",
- .psize = 64,
- .digest = "\x87\xfb\x2a\x90\x83\x85\x1c\xf7"
- "\x47\x0d\x2c\xf8\x10\xe6\xdf\x9e"
- "\xb5\x86\x44\x50",
- }, {
- .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdefghijklmnopqrstuvwxyz+0123456789",
- .psize = 64,
- .digest = "\x46\x7d\xb8\x08\x63\xeb\xce\x48"
- "\x8d\xf1\xcd\x12\x61\x65\x5d\xe9"
- "\x57\x89\x65\x65",
- }, {
- .plaintext = "Tiger - A Fast New Hash Function, "
- "by Ross Anderson and Eli Biham, "
- "proceedings of Fast Software Encryption 3, "
- "Cambridge, 1996.",
- .psize = 125,
- .digest = "\x3d\x9a\xeb\x03\xd1\xbd\x1a\x63"
- "\x57\xb2\x77\x4d\xfd\x6d\x5b\x24"
- "\xdd\x68\x15\x1d",
- },
-};
-
-#define TGR128_TEST_VECTORS 6
-
-static struct hash_testvec tgr128_tv_template[] = {
- {
- .plaintext = "",
- .psize = 0,
- .digest = "\x24\xf0\x13\x0c\x63\xac\x93\x32"
- "\x16\x16\x6e\x76\xb1\xbb\x92\x5f",
- }, {
- .plaintext = "abc",
- .psize = 3,
- .digest = "\xf2\x58\xc1\xe8\x84\x14\xab\x2a"
- "\x52\x7a\xb5\x41\xff\xc5\xb8\xbf",
- }, {
- .plaintext = "Tiger",
- .psize = 5,
- .digest = "\x9f\x00\xf5\x99\x07\x23\x00\xdd"
- "\x27\x6a\xbb\x38\xc8\xeb\x6d\xec",
- }, {
- .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-",
- .psize = 64,
- .digest = "\x87\xfb\x2a\x90\x83\x85\x1c\xf7"
- "\x47\x0d\x2c\xf8\x10\xe6\xdf\x9e",
- }, {
- .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdefghijklmnopqrstuvwxyz+0123456789",
- .psize = 64,
- .digest = "\x46\x7d\xb8\x08\x63\xeb\xce\x48"
- "\x8d\xf1\xcd\x12\x61\x65\x5d\xe9",
- }, {
- .plaintext = "Tiger - A Fast New Hash Function, "
- "by Ross Anderson and Eli Biham, "
- "proceedings of Fast Software Encryption 3, "
- "Cambridge, 1996.",
- .psize = 125,
- .digest = "\x3d\x9a\xeb\x03\xd1\xbd\x1a\x63"
- "\x57\xb2\x77\x4d\xfd\x6d\x5b\x24",
- },
-};
-
-/*
- * HMAC-MD5 test vectors from RFC2202
- * (These need to be fixed to not use strlen).
- */
-#ifndef CONFIG_CRYPTO_DEV_MD5_HMAC
-#define HMAC_MD5_TEST_VECTORS 7
-#else
-#define HMAC_MD5_TEST_VECTORS 5
-#endif
-
-static struct hash_testvec hmac_md5_tv_template[] =
-{
- {
- .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
- .ksize = 16,
- .plaintext = "Hi There",
- .psize = 8,
- .digest = "\x92\x94\x72\x7a\x36\x38\xbb\x1c"
- "\x13\xf4\x8e\xf8\x15\x8b\xfc\x9d",
- }, {
- .key = "Jefe",
- .ksize = 4,
- .plaintext = "what do ya want for nothing?",
- .psize = 28,
- .digest = "\x75\x0c\x78\x3e\x6a\xb0\xb5\x03"
- "\xea\xa8\x6e\x31\x0a\x5d\xb7\x38",
- .np = 2,
- .tap = {14, 14}
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
- .ksize = 16,
- .plaintext = "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
- "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
- "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
- "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd",
- .psize = 50,
- .digest = "\x56\xbe\x34\x52\x1d\x14\x4c\x88"
- "\xdb\xb8\xc7\x33\xf0\xe8\xb3\xf6",
- }, {
- .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
- "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
- "\x11\x12\x13\x14\x15\x16\x17\x18\x19",
- .ksize = 25,
- .plaintext = "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
- "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
- "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
- "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd",
- .psize = 50,
- .digest = "\x69\x7e\xaf\x0a\xca\x3a\x3a\xea"
- "\x3a\x75\x16\x47\x46\xff\xaa\x79",
- }, {
- .key = "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c",
- .ksize = 16,
- .plaintext = "Test With Truncation",
- .psize = 20,
- .digest = "\x56\x46\x1e\xf2\x34\x2e\xdc\x00"
- "\xf9\xba\xb9\x95\x69\x0e\xfd\x4c",
-#ifndef CONFIG_CRYPTO_DEV_MD5_HMAC
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa",
- .ksize = 80,
- .plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
- .psize = 54,
- .digest = "\x6b\x1a\xb7\xfe\x4b\xd7\xbf\x8f"
- "\x0b\x62\xe6\xce\x61\xb9\xd0\xcd",
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa",
- .ksize = 80,
- .plaintext = "Test Using Larger Than Block-Size Key and Larger Than One "
- "Block-Size Data",
- .psize = 73,
- .digest = "\x6f\x63\x0f\xad\x67\xcd\xa0\xee"
- "\x1f\xb1\xf5\x62\xdb\x3a\xa5\x3e",
-#endif /* CONFIG_CRYPTO_DEV_MD5_HMAC */
- },
-};
-
-/*
- * HMAC-RIPEMD128 test vectors from RFC2286
- */
-#define HMAC_RMD128_TEST_VECTORS 7
-
-static struct hash_testvec hmac_rmd128_tv_template[] = {
- {
- .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
- .ksize = 16,
- .plaintext = "Hi There",
- .psize = 8,
- .digest = "\xfb\xf6\x1f\x94\x92\xaa\x4b\xbf"
- "\x81\xc1\x72\xe8\x4e\x07\x34\xdb",
- }, {
- .key = "Jefe",
- .ksize = 4,
- .plaintext = "what do ya want for nothing?",
- .psize = 28,
- .digest = "\x87\x5f\x82\x88\x62\xb6\xb3\x34"
- "\xb4\x27\xc5\x5f\x9f\x7f\xf0\x9b",
- .np = 2,
- .tap = { 14, 14 },
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
- .ksize = 16,
- .plaintext = "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
- "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
- "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
- "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd",
- .psize = 50,
- .digest = "\x09\xf0\xb2\x84\x6d\x2f\x54\x3d"
- "\xa3\x63\xcb\xec\x8d\x62\xa3\x8d",
- }, {
- .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
- "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
- "\x11\x12\x13\x14\x15\x16\x17\x18\x19",
- .ksize = 25,
- .plaintext = "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
- "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
- "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
- "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd",
- .psize = 50,
- .digest = "\xbd\xbb\xd7\xcf\x03\xe4\x4b\x5a"
- "\xa6\x0a\xf8\x15\xbe\x4d\x22\x94",
- }, {
- .key = "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c",
- .ksize = 16,
- .plaintext = "Test With Truncation",
- .psize = 20,
- .digest = "\xe7\x98\x08\xf2\x4b\x25\xfd\x03"
- "\x1c\x15\x5f\x0d\x55\x1d\x9a\x3a",
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa",
- .ksize = 80,
- .plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
- .psize = 54,
- .digest = "\xdc\x73\x29\x28\xde\x98\x10\x4a"
- "\x1f\x59\xd3\x73\xc1\x50\xac\xbb",
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa",
- .ksize = 80,
- .plaintext = "Test Using Larger Than Block-Size Key and Larger Than One "
- "Block-Size Data",
- .psize = 73,
- .digest = "\x5c\x6b\xec\x96\x79\x3e\x16\xd4"
- "\x06\x90\xc2\x37\x63\x5f\x30\xc5",
- },
-};
-
-/*
- * HMAC-RIPEMD160 test vectors from RFC2286
- */
-#define HMAC_RMD160_TEST_VECTORS 7
-
-static struct hash_testvec hmac_rmd160_tv_template[] = {
- {
- .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
- .ksize = 20,
- .plaintext = "Hi There",
- .psize = 8,
- .digest = "\x24\xcb\x4b\xd6\x7d\x20\xfc\x1a\x5d\x2e"
- "\xd7\x73\x2d\xcc\x39\x37\x7f\x0a\x56\x68",
- }, {
- .key = "Jefe",
- .ksize = 4,
- .plaintext = "what do ya want for nothing?",
- .psize = 28,
- .digest = "\xdd\xa6\xc0\x21\x3a\x48\x5a\x9e\x24\xf4"
- "\x74\x20\x64\xa7\xf0\x33\xb4\x3c\x40\x69",
- .np = 2,
- .tap = { 14, 14 },
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
- .ksize = 20,
- .plaintext = "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
- "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
- "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
- "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd",
- .psize = 50,
- .digest = "\xb0\xb1\x05\x36\x0d\xe7\x59\x96\x0a\xb4"
- "\xf3\x52\x98\xe1\x16\xe2\x95\xd8\xe7\xc1",
- }, {
- .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
- "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
- "\x11\x12\x13\x14\x15\x16\x17\x18\x19",
- .ksize = 25,
- .plaintext = "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
- "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
- "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
- "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd",
- .psize = 50,
- .digest = "\xd5\xca\x86\x2f\x4d\x21\xd5\xe6\x10\xe1"
- "\x8b\x4c\xf1\xbe\xb9\x7a\x43\x65\xec\xf4",
- }, {
- .key = "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c",
- .ksize = 20,
- .plaintext = "Test With Truncation",
- .psize = 20,
- .digest = "\x76\x19\x69\x39\x78\xf9\x1d\x90\x53\x9a"
- "\xe7\x86\x50\x0f\xf3\xd8\xe0\x51\x8e\x39",
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa",
- .ksize = 80,
- .plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
- .psize = 54,
- .digest = "\x64\x66\xca\x07\xac\x5e\xac\x29\xe1\xbd"
- "\x52\x3e\x5a\xda\x76\x05\xb7\x91\xfd\x8b",
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa",
- .ksize = 80,
- .plaintext = "Test Using Larger Than Block-Size Key and Larger Than One "
- "Block-Size Data",
- .psize = 73,
- .digest = "\x69\xea\x60\x79\x8d\x71\x61\x6c\xce\x5f"
- "\xd0\x87\x1e\x23\x75\x4c\xd7\x5d\x5a\x0a",
- },
-};
-
-/*
- * HMAC-SHA1 test vectors from RFC2202
- */
-#ifndef CONFIG_CRYPTO_DEV_SHA1_HMAC
-#define HMAC_SHA1_TEST_VECTORS 7
-#else
-#define HMAC_SHA1_TEST_VECTORS 5
-#endif
-
-static struct hash_testvec hmac_sha1_tv_template[] = {
- {
- .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
- .ksize = 20,
- .plaintext = "Hi There",
- .psize = 8,
- .digest = "\xb6\x17\x31\x86\x55\x05\x72\x64"
- "\xe2\x8b\xc0\xb6\xfb\x37\x8c\x8e\xf1"
- "\x46\xbe",
- }, {
- .key = "Jefe",
- .ksize = 4,
- .plaintext = "what do ya want for nothing?",
- .psize = 28,
- .digest = "\xef\xfc\xdf\x6a\xe5\xeb\x2f\xa2\xd2\x74"
- "\x16\xd5\xf1\x84\xdf\x9c\x25\x9a\x7c\x79",
- .np = 2,
- .tap = { 14, 14 }
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
- .ksize = 20,
- .plaintext = "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
- "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
- "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
- "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd",
- .psize = 50,
- .digest = "\x12\x5d\x73\x42\xb9\xac\x11\xcd\x91\xa3"
- "\x9a\xf4\x8a\xa1\x7b\x4f\x63\xf1\x75\xd3",
- }, {
- .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
- "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
- "\x11\x12\x13\x14\x15\x16\x17\x18\x19",
- .ksize = 25,
- .plaintext = "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
- "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
- "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
- "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd",
- .psize = 50,
- .digest = "\x4c\x90\x07\xf4\x02\x62\x50\xc6\xbc\x84"
- "\x14\xf9\xbf\x50\xc8\x6c\x2d\x72\x35\xda",
- }, {
- .key = "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c",
- .ksize = 20,
- .plaintext = "Test With Truncation",
- .psize = 20,
- .digest = "\x4c\x1a\x03\x42\x4b\x55\xe0\x7f\xe7\xf2"
- "\x7b\xe1\xd5\x8b\xb9\x32\x4a\x9a\x5a\x04",
-
-#ifndef CONFIG_CRYPTO_DEV_SHA1_HMAC
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa",
- .ksize = 80,
- .plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
- .psize = 54,
- .digest = "\xaa\x4a\xe5\xe1\x52\x72\xd0\x0e\x95\x70"
- "\x56\x37\xce\x8a\x3b\x55\xed\x40\x21\x12",
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa",
- .ksize = 80,
- .plaintext = "Test Using Larger Than Block-Size Key and Larger Than One "
- "Block-Size Data",
- .psize = 73,
- .digest = "\xe8\xe9\x9d\x0f\x45\x23\x7d\x78\x6d\x6b"
- "\xba\xa7\x96\x5c\x78\x08\xbb\xff\x1a\x91",
-#endif
- },
-};
-
-
-/*
- * SHA224 HMAC test vectors from RFC4231
- */
-#define HMAC_SHA224_TEST_VECTORS 4
-
-static struct hash_testvec hmac_sha224_tv_template[] = {
- {
- .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
- "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
- "\x0b\x0b\x0b\x0b",
- .ksize = 20,
- /* ("Hi There") */
- .plaintext = "\x48\x69\x20\x54\x68\x65\x72\x65",
- .psize = 8,
- .digest = "\x89\x6f\xb1\x12\x8a\xbb\xdf\x19"
- "\x68\x32\x10\x7c\xd4\x9d\xf3\x3f"
- "\x47\xb4\xb1\x16\x99\x12\xba\x4f"
- "\x53\x68\x4b\x22",
- }, {
- .key = "Jefe",
- .ksize = 4,
- /* ("what do ya want for nothing?") */
- .plaintext = "\x77\x68\x61\x74\x20\x64\x6f\x20"
- "\x79\x61\x20\x77\x61\x6e\x74\x20"
- "\x66\x6f\x72\x20\x6e\x6f\x74\x68"
- "\x69\x6e\x67\x3f",
- .psize = 28,
- .digest = "\xa3\x0e\x01\x09\x8b\xc6\xdb\xbf"
- "\x45\x69\x0f\x3a\x7e\x9e\x6d\x0f"
- "\x8b\xbe\xa2\xa3\x9e\x61\x48\x00"
- "\x8f\xd0\x5e\x44",
- .np = 4,
- .tap = { 7, 7, 7, 7 }
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa",
- .ksize = 131,
- /* ("Test Using Larger Than Block-Size Key - Hash Key First") */
- .plaintext = "\x54\x65\x73\x74\x20\x55\x73\x69"
- "\x6e\x67\x20\x4c\x61\x72\x67\x65"
- "\x72\x20\x54\x68\x61\x6e\x20\x42"
- "\x6c\x6f\x63\x6b\x2d\x53\x69\x7a"
- "\x65\x20\x4b\x65\x79\x20\x2d\x20"
- "\x48\x61\x73\x68\x20\x4b\x65\x79"
- "\x20\x46\x69\x72\x73\x74",
- .psize = 54,
- .digest = "\x95\xe9\xa0\xdb\x96\x20\x95\xad"
- "\xae\xbe\x9b\x2d\x6f\x0d\xbc\xe2"
- "\xd4\x99\xf1\x12\xf2\xd2\xb7\x27"
- "\x3f\xa6\x87\x0e",
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa",
- .ksize = 131,
- /* ("This is a test using a larger than block-size key and a")
- (" larger than block-size data. The key needs to be")
- (" hashed before being used by the HMAC algorithm.") */
- .plaintext = "\x54\x68\x69\x73\x20\x69\x73\x20"
- "\x61\x20\x74\x65\x73\x74\x20\x75"
- "\x73\x69\x6e\x67\x20\x61\x20\x6c"
- "\x61\x72\x67\x65\x72\x20\x74\x68"
- "\x61\x6e\x20\x62\x6c\x6f\x63\x6b"
- "\x2d\x73\x69\x7a\x65\x20\x6b\x65"
- "\x79\x20\x61\x6e\x64\x20\x61\x20"
- "\x6c\x61\x72\x67\x65\x72\x20\x74"
- "\x68\x61\x6e\x20\x62\x6c\x6f\x63"
- "\x6b\x2d\x73\x69\x7a\x65\x20\x64"
- "\x61\x74\x61\x2e\x20\x54\x68\x65"
- "\x20\x6b\x65\x79\x20\x6e\x65\x65"
- "\x64\x73\x20\x74\x6f\x20\x62\x65"
- "\x20\x68\x61\x73\x68\x65\x64\x20"
- "\x62\x65\x66\x6f\x72\x65\x20\x62"
- "\x65\x69\x6e\x67\x20\x75\x73\x65"
- "\x64\x20\x62\x79\x20\x74\x68\x65"
- "\x20\x48\x4d\x41\x43\x20\x61\x6c"
- "\x67\x6f\x72\x69\x74\x68\x6d\x2e",
- .psize = 152,
- .digest = "\x3a\x85\x41\x66\xac\x5d\x9f\x02"
- "\x3f\x54\xd5\x17\xd0\xb3\x9d\xbd"
- "\x94\x67\x70\xdb\x9c\x2b\x95\xc9"
- "\xf6\xf5\x65\xd1",
- },
-};
-
-/*
- * HMAC-SHA256 test vectors from
- * draft-ietf-ipsec-ciph-sha-256-01.txt
- */
-#define HMAC_SHA256_TEST_VECTORS 10
-
-static struct hash_testvec hmac_sha256_tv_template[] = {
- {
- .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
- "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
- "\x11\x12\x13\x14\x15\x16\x17\x18"
- "\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20",
- .ksize = 32,
- .plaintext = "abc",
- .psize = 3,
- .digest = "\xa2\x1b\x1f\x5d\x4c\xf4\xf7\x3a"
- "\x4d\xd9\x39\x75\x0f\x7a\x06\x6a"
- "\x7f\x98\xcc\x13\x1c\xb1\x6a\x66"
- "\x92\x75\x90\x21\xcf\xab\x81\x81",
- }, {
- .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
- "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
- "\x11\x12\x13\x14\x15\x16\x17\x18"
- "\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20",
- .ksize = 32,
- .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
- .psize = 56,
- .digest = "\x10\x4f\xdc\x12\x57\x32\x8f\x08"
- "\x18\x4b\xa7\x31\x31\xc5\x3c\xae"
- "\xe6\x98\xe3\x61\x19\x42\x11\x49"
- "\xea\x8c\x71\x24\x56\x69\x7d\x30",
- }, {
- .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
- "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
- "\x11\x12\x13\x14\x15\x16\x17\x18"
- "\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20",
- .ksize = 32,
- .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
- "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
- .psize = 112,
- .digest = "\x47\x03\x05\xfc\x7e\x40\xfe\x34"
- "\xd3\xee\xb3\xe7\x73\xd9\x5a\xab"
- "\x73\xac\xf0\xfd\x06\x04\x47\xa5"
- "\xeb\x45\x95\xbf\x33\xa9\xd1\xa3",
- }, {
- .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
- "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
- "\x0b\x0b\x0b\x0b\x0b\x0b",
- .ksize = 32,
- .plaintext = "Hi There",
- .psize = 8,
- .digest = "\x19\x8a\x60\x7e\xb4\x4b\xfb\xc6"
- "\x99\x03\xa0\xf1\xcf\x2b\xbd\xc5"
- "\xba\x0a\xa3\xf3\xd9\xae\x3c\x1c"
- "\x7a\x3b\x16\x96\xa0\xb6\x8c\xf7",
- }, {
- .key = "Jefe",
- .ksize = 4,
- .plaintext = "what do ya want for nothing?",
- .psize = 28,
- .digest = "\x5b\xdc\xc1\x46\xbf\x60\x75\x4e"
- "\x6a\x04\x24\x26\x08\x95\x75\xc7"
- "\x5a\x00\x3f\x08\x9d\x27\x39\x83"
- "\x9d\xec\x58\xb9\x64\xec\x38\x43",
- .np = 2,
- .tap = { 14, 14 }
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
- .ksize = 32,
- .plaintext = "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
- "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
- "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
- "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd",
- .psize = 50,
- .digest = "\xcd\xcb\x12\x20\xd1\xec\xcc\xea"
- "\x91\xe5\x3a\xba\x30\x92\xf9\x62"
- "\xe5\x49\xfe\x6c\xe9\xed\x7f\xdc"
- "\x43\x19\x1f\xbd\xe4\x5c\x30\xb0",
- }, {
- .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
- "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
- "\x11\x12\x13\x14\x15\x16\x17\x18"
- "\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
- "\x21\x22\x23\x24\x25",
- .ksize = 37,
- .plaintext = "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
- "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
- "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
- "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd",
- .psize = 50,
- .digest = "\xd4\x63\x3c\x17\xf6\xfb\x8d\x74"
- "\x4c\x66\xde\xe0\xf8\xf0\x74\x55"
- "\x6e\xc4\xaf\x55\xef\x07\x99\x85"
- "\x41\x46\x8e\xb4\x9b\xd2\xe9\x17",
- }, {
- .key = "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
- "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
- "\x0c\x0c\x0c\x0c\x0c\x0c",
- .ksize = 32,
- .plaintext = "Test With Truncation",
- .psize = 20,
- .digest = "\x75\x46\xaf\x01\x84\x1f\xc0\x9b"
- "\x1a\xb9\xc3\x74\x9a\x5f\x1c\x17"
- "\xd4\xf5\x89\x66\x8a\x58\x7b\x27"
- "\x00\xa9\xc9\x7c\x11\x93\xcf\x42",
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa",
- .ksize = 80,
- .plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
- .psize = 54,
- .digest = "\x69\x53\x02\x5e\xd9\x6f\x0c\x09"
- "\xf8\x0a\x96\xf7\x8e\x65\x38\xdb"
- "\xe2\xe7\xb8\x20\xe3\xdd\x97\x0e"
- "\x7d\xdd\x39\x09\x1b\x32\x35\x2f",
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa",
- .ksize = 80,
- .plaintext = "Test Using Larger Than Block-Size Key and Larger Than "
- "One Block-Size Data",
- .psize = 73,
- .digest = "\x63\x55\xac\x22\xe8\x90\xd0\xa3"
- "\xc8\x48\x1a\x5c\xa4\x82\x5b\xc8"
- "\x84\xd3\xe7\xa1\xff\x98\xa2\xfc"
- "\x2a\xc7\xd8\xe0\x64\xc3\xb2\xe6",
- },
-};
-
-#define XCBC_AES_TEST_VECTORS 6
-
-static struct hash_testvec aes_xcbc128_tv_template[] = {
- {
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .plaintext = zeroed_string,
- .digest = "\x75\xf0\x25\x1d\x52\x8a\xc0\x1c"
- "\x45\x73\xdf\xd5\x84\xd7\x9f\x29",
- .psize = 0,
- .ksize = 16,
- }, {
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .plaintext = "\x00\x01\x02",
- .digest = "\x5b\x37\x65\x80\xae\x2f\x19\xaf"
- "\xe7\x21\x9c\xee\xf1\x72\x75\x6f",
- .psize = 3,
- .ksize = 16,
- } , {
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .plaintext = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .digest = "\xd2\xa2\x46\xfa\x34\x9b\x68\xa7"
- "\x99\x98\xa4\x39\x4f\xf7\xa2\x63",
- .psize = 16,
- .ksize = 16,
- }, {
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .plaintext = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13",
- .digest = "\x47\xf5\x1b\x45\x64\x96\x62\x15"
- "\xb8\x98\x5c\x63\x05\x5e\xd3\x08",
- .tap = { 10, 10 },
- .psize = 20,
- .np = 2,
- .ksize = 16,
- }, {
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .plaintext = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
- .digest = "\xf5\x4f\x0e\xc8\xd2\xb9\xf3\xd3"
- "\x68\x07\x73\x4b\xd5\x28\x3f\xd4",
- .psize = 32,
- .ksize = 16,
- }, {
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .plaintext = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
- "\x20\x21",
- .digest = "\xbe\xcb\xb3\xbc\xcd\xb5\x18\xa3"
- "\x06\x77\xd5\x48\x1f\xb6\xb4\xd8",
- .tap = { 17, 17 },
- .psize = 34,
- .np = 2,
- .ksize = 16,
- }
-};
-
-#define VMAC_AES_TEST_VECTORS 1
-static char vmac_string[128] = {'\x01', '\x01', '\x01', '\x01',
- '\x02', '\x03', '\x02', '\x02',
- '\x02', '\x04', '\x01', '\x07',
- '\x04', '\x01', '\x04', '\x03',};
-static struct hash_testvec aes_vmac128_tv_template[] = {
- {
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .plaintext = vmac_string,
- .digest = "\xcb\xd7\x8a\xfd\xb7\x33\x79\xe7",
- .psize = 128,
- .ksize = 16,
- },
-};
-
-/*
- * SHA384 HMAC test vectors from RFC4231
- */
-
-#define HMAC_SHA384_TEST_VECTORS 4
-
-static struct hash_testvec hmac_sha384_tv_template[] = {
- {
- .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
- "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
- "\x0b\x0b\x0b\x0b",
- .ksize = 20,
- .plaintext = "Hi There",
- .psize = 8,
- .digest = "\xaf\xd0\x39\x44\xd8\x48\x95\x62"
- "\x6b\x08\x25\xf4\xab\x46\x90\x7f"
- "\x15\xf9\xda\xdb\xe4\x10\x1e\xc6"
- "\x82\xaa\x03\x4c\x7c\xeb\xc5\x9c"
- "\xfa\xea\x9e\xa9\x07\x6e\xde\x7f"
- "\x4a\xf1\x52\xe8\xb2\xfa\x9c\xb6",
- }, {
- .key = "Jefe",
- .ksize = 4,
- .plaintext = "what do ya want for nothing?",
- .psize = 28,
- .digest = "\xaf\x45\xd2\xe3\x76\x48\x40\x31"
- "\x61\x7f\x78\xd2\xb5\x8a\x6b\x1b"
- "\x9c\x7e\xf4\x64\xf5\xa0\x1b\x47"
- "\xe4\x2e\xc3\x73\x63\x22\x44\x5e"
- "\x8e\x22\x40\xca\x5e\x69\xe2\xc7"
- "\x8b\x32\x39\xec\xfa\xb2\x16\x49",
- .np = 4,
- .tap = { 7, 7, 7, 7 }
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa",
- .ksize = 131,
- .plaintext = "Test Using Larger Than Block-Siz"
- "e Key - Hash Key First",
- .psize = 54,
- .digest = "\x4e\xce\x08\x44\x85\x81\x3e\x90"
- "\x88\xd2\xc6\x3a\x04\x1b\xc5\xb4"
- "\x4f\x9e\xf1\x01\x2a\x2b\x58\x8f"
- "\x3c\xd1\x1f\x05\x03\x3a\xc4\xc6"
- "\x0c\x2e\xf6\xab\x40\x30\xfe\x82"
- "\x96\x24\x8d\xf1\x63\xf4\x49\x52",
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa",
- .ksize = 131,
- .plaintext = "This is a test u"
- "sing a larger th"
- "an block-size ke"
- "y and a larger t"
- "han block-size d"
- "ata. The key nee"
- "ds to be hashed "
- "before being use"
- "d by the HMAC al"
- "gorithm.",
- .psize = 152,
- .digest = "\x66\x17\x17\x8e\x94\x1f\x02\x0d"
- "\x35\x1e\x2f\x25\x4e\x8f\xd3\x2c"
- "\x60\x24\x20\xfe\xb0\xb8\xfb\x9a"
- "\xdc\xce\xbb\x82\x46\x1e\x99\xc5"
- "\xa6\x78\xcc\x31\xe7\x99\x17\x6d"
- "\x38\x60\xe6\x11\x0c\x46\x52\x3e",
- },
-};
-
-/*
- * SHA512 HMAC test vectors from RFC4231
- */
-
-#define HMAC_SHA512_TEST_VECTORS 4
-
-static struct hash_testvec hmac_sha512_tv_template[] = {
- {
- .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
- "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
- "\x0b\x0b\x0b\x0b",
- .ksize = 20,
- .plaintext = "Hi There",
- .psize = 8,
- .digest = "\x87\xaa\x7c\xde\xa5\xef\x61\x9d"
- "\x4f\xf0\xb4\x24\x1a\x1d\x6c\xb0"
- "\x23\x79\xf4\xe2\xce\x4e\xc2\x78"
- "\x7a\xd0\xb3\x05\x45\xe1\x7c\xde"
- "\xda\xa8\x33\xb7\xd6\xb8\xa7\x02"
- "\x03\x8b\x27\x4e\xae\xa3\xf4\xe4"
- "\xbe\x9d\x91\x4e\xeb\x61\xf1\x70"
- "\x2e\x69\x6c\x20\x3a\x12\x68\x54",
- }, {
- .key = "Jefe",
- .ksize = 4,
- .plaintext = "what do ya want for nothing?",
- .psize = 28,
- .digest = "\x16\x4b\x7a\x7b\xfc\xf8\x19\xe2"
- "\xe3\x95\xfb\xe7\x3b\x56\xe0\xa3"
- "\x87\xbd\x64\x22\x2e\x83\x1f\xd6"
- "\x10\x27\x0c\xd7\xea\x25\x05\x54"
- "\x97\x58\xbf\x75\xc0\x5a\x99\x4a"
- "\x6d\x03\x4f\x65\xf8\xf0\xe6\xfd"
- "\xca\xea\xb1\xa3\x4d\x4a\x6b\x4b"
- "\x63\x6e\x07\x0a\x38\xbc\xe7\x37",
- .np = 4,
- .tap = { 7, 7, 7, 7 }
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa",
- .ksize = 131,
- .plaintext = "Test Using Large"
- "r Than Block-Siz"
- "e Key - Hash Key"
- " First",
- .psize = 54,
- .digest = "\x80\xb2\x42\x63\xc7\xc1\xa3\xeb"
- "\xb7\x14\x93\xc1\xdd\x7b\xe8\xb4"
- "\x9b\x46\xd1\xf4\x1b\x4a\xee\xc1"
- "\x12\x1b\x01\x37\x83\xf8\xf3\x52"
- "\x6b\x56\xd0\x37\xe0\x5f\x25\x98"
- "\xbd\x0f\xd2\x21\x5d\x6a\x1e\x52"
- "\x95\xe6\x4f\x73\xf6\x3f\x0a\xec"
- "\x8b\x91\x5a\x98\x5d\x78\x65\x98",
- }, {
- .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
- "\xaa\xaa\xaa",
- .ksize = 131,
- .plaintext =
- "This is a test u"
- "sing a larger th"
- "an block-size ke"
- "y and a larger t"
- "han block-size d"
- "ata. The key nee"
- "ds to be hashed "
- "before being use"
- "d by the HMAC al"
- "gorithm.",
- .psize = 152,
- .digest = "\xe3\x7b\x6a\x77\x5d\xc8\x7d\xba"
- "\xa4\xdf\xa9\xf9\x6e\x5e\x3f\xfd"
- "\xde\xbd\x71\xf8\x86\x72\x89\x86"
- "\x5d\xf5\xa3\x2d\x20\xcd\xc9\x44"
- "\xb6\x02\x2c\xac\x3c\x49\x82\xb1"
- "\x0d\x5e\xeb\x55\xc3\xe4\xde\x15"
- "\x13\x46\x76\xfb\x6d\xe0\x44\x60"
- "\x65\xc9\x74\x40\xfa\x8c\x6a\x58",
- },
-};
-
-/*
- * DES test vectors.
- */
-#if defined(CONFIG_CRYPTO_DEV_DES) || defined (CONFIG_CRYPTO_ASYNC_DES)
-#define DES_ENC_TEST_VECTORS 5
-#define DES_DEC_TEST_VECTORS 3
-#define DES_CBC_ENC_TEST_VECTORS 4
-#define DES_CBC_DEC_TEST_VECTORS 3
-#define DES3_EDE_ENC_TEST_VECTORS 3
-#define DES3_EDE_DEC_TEST_VECTORS 3
-#define DES3_EDE_CBC_ENC_TEST_VECTORS 1
-#define DES3_EDE_CBC_DEC_TEST_VECTORS 1
-#else
-#define DES_ENC_TEST_VECTORS 10
-#define DES_DEC_TEST_VECTORS 4
-#define DES_CBC_ENC_TEST_VECTORS 5
-#define DES_CBC_DEC_TEST_VECTORS 4
-#define DES3_EDE_ENC_TEST_VECTORS 3
-#define DES3_EDE_DEC_TEST_VECTORS 3
-#define DES3_EDE_CBC_ENC_TEST_VECTORS 1
-#define DES3_EDE_CBC_DEC_TEST_VECTORS 1
-#endif /*CONFIG_CRYPTO_DEV_DES*/
-
-static struct cipher_testvec des_enc_tv_template[] = {
- { /* From Applied Cryptography */
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7",
- .ilen = 8,
- .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d",
- .rlen = 8,
- }, { /* Same key, different plaintext block */
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .input = "\x22\x33\x44\x55\x66\x77\x88\x99",
- .ilen = 8,
- .result = "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b",
- .rlen = 8,
- }, { /* Sbox test from NBS */
- .key = "\x7c\xa1\x10\x45\x4a\x1a\x6e\x57",
- .klen = 8,
- .input = "\x01\xa1\xd6\xd0\x39\x77\x67\x42",
- .ilen = 8,
- .result = "\x69\x0f\x5b\x0d\x9a\x26\x93\x9b",
- .rlen = 8,
- }, { /* Three blocks */
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
- "\x22\x33\x44\x55\x66\x77\x88\x99"
- "\xca\xfe\xba\xbe\xfe\xed\xbe\xef",
- .ilen = 24,
- .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
- "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b"
- "\xb4\x99\x26\xf7\x1f\xe1\xd4\x90",
- .rlen = 24,
-//#if !defined(CONFIG_CRYPTO_DEV_DES) && !defined(CONFIG_CRYPTO_ASYNC_DES)
-#if 0
- }, { /* Weak key */
- .fail = 1,
- .wk = 1,
- .key = "\x01\x01\x01\x01\x01\x01\x01\x01",
- .klen = 8,
- .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7",
- .ilen = 8,
- .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d",
- .rlen = 8,
-#endif
- }, { /* Two blocks -- for testing encryption across pages */
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
- "\x22\x33\x44\x55\x66\x77\x88\x99",
- .ilen = 16,
- .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
- "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b",
- .rlen = 16,
- .np = 2,
- .tap = { 8, 8 }
-//#if !defined(CONFIG_CRYPTO_DEV_DES) && !defined(CONFIG_CRYPTO_ASYNC_DES)
-#if 0
- }, { /* Four blocks -- for testing encryption with chunking */
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
- "\x22\x33\x44\x55\x66\x77\x88\x99"
- "\xca\xfe\xba\xbe\xfe\xed\xbe\xef"
- "\x22\x33\x44\x55\x66\x77\x88\x99",
- .ilen = 32,
- .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
- "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b"
- "\xb4\x99\x26\xf7\x1f\xe1\xd4\x90"
- "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b",
- .rlen = 32,
- .np = 3,
- .tap = { 14, 10, 8 }
- }, {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
- "\x22\x33\x44\x55\x66\x77\x88\x99"
- "\xca\xfe\xba\xbe\xfe\xed\xbe\xef",
- .ilen = 24,
- .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
- "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b"
- "\xb4\x99\x26\xf7\x1f\xe1\xd4\x90",
- .rlen = 24,
- .np = 4,
- .tap = { 2, 1, 3, 18 }
- }, {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
- "\x22\x33\x44\x55\x66\x77\x88\x99",
- .ilen = 16,
- .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
- "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b",
- .rlen = 16,
- .np = 5,
- .tap = { 2, 2, 2, 2, 8 }
- }, {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7",
- .ilen = 8,
- .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d",
- .rlen = 8,
- .np = 8,
- .tap = { 1, 1, 1, 1, 1, 1, 1, 1 }
-#endif
- },
-};
-
-static struct cipher_testvec des_dec_tv_template[] = {
- { /* From Applied Cryptography */
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .input = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d",
- .ilen = 8,
- .result = "\x01\x23\x45\x67\x89\xab\xcd\xe7",
- .rlen = 8,
- }, { /* Sbox test from NBS */
- .key = "\x7c\xa1\x10\x45\x4a\x1a\x6e\x57",
- .klen = 8,
- .input = "\x69\x0f\x5b\x0d\x9a\x26\x93\x9b",
- .ilen = 8,
- .result = "\x01\xa1\xd6\xd0\x39\x77\x67\x42",
- .rlen = 8,
- }, { /* Two blocks, for chunking test */
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .input = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
- "\x69\x0f\x5b\x0d\x9a\x26\x93\x9b",
- .ilen = 16,
- .result = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
- "\xa3\x99\x7b\xca\xaf\x69\xa0\xf5",
- .rlen = 16,
- .np = 2,
- .tap = { 8, 8 }
- }, {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .input = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
- "\x69\x0f\x5b\x0d\x9a\x26\x93\x9b",
- .ilen = 16,
- .result = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
- "\xa3\x99\x7b\xca\xaf\x69\xa0\xf5",
- .rlen = 16,
- .np = 3,
- .tap = { 3, 12, 1 }
- },
-};
-
-static struct cipher_testvec des_cbc_enc_tv_template[] = {
- { /* From OpenSSL */
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .iv = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .input = "\x37\x36\x35\x34\x33\x32\x31\x20"
- "\x4e\x6f\x77\x20\x69\x73\x20\x74"
- "\x68\x65\x20\x74\x69\x6d\x65\x20",
- .ilen = 24,
- .result = "\xcc\xd1\x73\xff\xab\x20\x39\xf4"
- "\xac\xd8\xae\xfd\xdf\xd8\xa1\xeb"
- "\x46\x8e\x91\x15\x78\x88\xba\x68",
- .rlen = 24,
- }, { /* FIPS Pub 81 */
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .iv = "\x12\x34\x56\x78\x90\xab\xcd\xef",
- .input = "\x4e\x6f\x77\x20\x69\x73\x20\x74",
- .ilen = 8,
- .result = "\xe5\xc7\xcd\xde\x87\x2b\xf2\x7c",
- .rlen = 8,
- }, {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .iv = "\xe5\xc7\xcd\xde\x87\x2b\xf2\x7c",
- .input = "\x68\x65\x20\x74\x69\x6d\x65\x20",
- .ilen = 8,
- .result = "\x43\xe9\x34\x00\x8c\x38\x9c\x0f",
- .rlen = 8,
- }, {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .iv = "\x43\xe9\x34\x00\x8c\x38\x9c\x0f",
- .input = "\x66\x6f\x72\x20\x61\x6c\x6c\x20",
- .ilen = 8,
- .result = "\x68\x37\x88\x49\x9a\x7c\x05\xf6",
- .rlen = 8,
-#if 0
- }, { /* Copy of openssl vector for chunk testing */
- /* From OpenSSL */
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .iv = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .input = "\x37\x36\x35\x34\x33\x32\x31\x20"
- "\x4e\x6f\x77\x20\x69\x73\x20\x74"
- "\x68\x65\x20\x74\x69\x6d\x65\x20",
- .ilen = 24,
- .result = "\xcc\xd1\x73\xff\xab\x20\x39\xf4"
- "\xac\xd8\xae\xfd\xdf\xd8\xa1\xeb"
- "\x46\x8e\x91\x15\x78\x88\xba\x68",
- .rlen = 24,
- .np = 2,
- .tap = { 13, 11 }
-#endif
- },
-};
-
-static struct cipher_testvec des_cbc_dec_tv_template[] = {
- { /* FIPS Pub 81 */
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .iv = "\x12\x34\x56\x78\x90\xab\xcd\xef",
- .input = "\xe5\xc7\xcd\xde\x87\x2b\xf2\x7c",
- .ilen = 8,
- .result = "\x4e\x6f\x77\x20\x69\x73\x20\x74",
- .rlen = 8,
- }, {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .iv = "\xe5\xc7\xcd\xde\x87\x2b\xf2\x7c",
- .input = "\x43\xe9\x34\x00\x8c\x38\x9c\x0f",
- .ilen = 8,
- .result = "\x68\x65\x20\x74\x69\x6d\x65\x20",
- .rlen = 8,
- }, {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .iv = "\x43\xe9\x34\x00\x8c\x38\x9c\x0f",
- .input = "\x68\x37\x88\x49\x9a\x7c\x05\xf6",
- .ilen = 8,
- .result = "\x66\x6f\x72\x20\x61\x6c\x6c\x20",
- .rlen = 8,
- }, { /* Copy of above, for chunk testing */
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .iv = "\x43\xe9\x34\x00\x8c\x38\x9c\x0f",
- .input = "\x68\x37\x88\x49\x9a\x7c\x05\xf6",
- .ilen = 8,
- .result = "\x66\x6f\x72\x20\x61\x6c\x6c\x20",
- .rlen = 8,
- .np = 2,
- .tap = { 4, 4 }
- },
-};
-
-static struct cipher_testvec des3_ede_enc_tv_template[] = {
- { /* These are from openssl */
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
- "\x55\x55\x55\x55\x55\x55\x55\x55"
- "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .klen = 24,
- .input = "\x73\x6f\x6d\x65\x64\x61\x74\x61",
- .ilen = 8,
- .result = "\x18\xd7\x48\xe5\x63\x62\x05\x72",
- .rlen = 8,
- }, {
- .key = "\x03\x52\x02\x07\x67\x20\x82\x17"
- "\x86\x02\x87\x66\x59\x08\x21\x98"
- "\x64\x05\x6a\xbd\xfe\xa9\x34\x57",
- .klen = 24,
- .input = "\x73\x71\x75\x69\x67\x67\x6c\x65",
- .ilen = 8,
- .result = "\xc0\x7d\x2a\x0f\xa5\x66\xfa\x30",
- .rlen = 8,
- }, {
- .key = "\x10\x46\x10\x34\x89\x98\x80\x20"
- "\x91\x07\xd0\x15\x89\x19\x01\x01"
- "\x19\x07\x92\x10\x98\x1a\x01\x01",
- .klen = 24,
- .input = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .ilen = 8,
- .result = "\xe1\xef\x62\xc3\x32\xfe\x82\x5b",
- .rlen = 8,
- },
-};
-
-static struct cipher_testvec des3_ede_dec_tv_template[] = {
- { /* These are from openssl */
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
- "\x55\x55\x55\x55\x55\x55\x55\x55"
- "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .klen = 24,
- .input = "\x18\xd7\x48\xe5\x63\x62\x05\x72",
- .ilen = 8,
- .result = "\x73\x6f\x6d\x65\x64\x61\x74\x61",
- .rlen = 8,
- }, {
- .key = "\x03\x52\x02\x07\x67\x20\x82\x17"
- "\x86\x02\x87\x66\x59\x08\x21\x98"
- "\x64\x05\x6a\xbd\xfe\xa9\x34\x57",
- .klen = 24,
- .input = "\xc0\x7d\x2a\x0f\xa5\x66\xfa\x30",
- .ilen = 8,
- .result = "\x73\x71\x75\x69\x67\x67\x6c\x65",
- .rlen = 8,
- }, {
- .key = "\x10\x46\x10\x34\x89\x98\x80\x20"
- "\x91\x07\xd0\x15\x89\x19\x01\x01"
- "\x19\x07\x92\x10\x98\x1a\x01\x01",
- .klen = 24,
- .input = "\xe1\xef\x62\xc3\x32\xfe\x82\x5b",
- .ilen = 8,
- .result = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .rlen = 8,
- },
-};
-
-static struct cipher_testvec des3_ede_cbc_enc_tv_template[] = {
- { /* Generated from openssl */
- .key = "\xE9\xC0\xFF\x2E\x76\x0B\x64\x24"
- "\x44\x4D\x99\x5A\x12\xD6\x40\xC0"
- "\xEA\xC2\x84\xE8\x14\x95\xDB\xE8",
- .klen = 24,
- .iv = "\x7D\x33\x88\x93\x0F\x93\xB2\x42",
- .input = "\x6f\x54\x20\x6f\x61\x4d\x79\x6e"
- "\x53\x20\x63\x65\x65\x72\x73\x74"
- "\x54\x20\x6f\x6f\x4d\x20\x6e\x61"
- "\x20\x79\x65\x53\x72\x63\x74\x65"
- "\x20\x73\x6f\x54\x20\x6f\x61\x4d"
- "\x79\x6e\x53\x20\x63\x65\x65\x72"
- "\x73\x74\x54\x20\x6f\x6f\x4d\x20"
- "\x6e\x61\x20\x79\x65\x53\x72\x63"
- "\x74\x65\x20\x73\x6f\x54\x20\x6f"
- "\x61\x4d\x79\x6e\x53\x20\x63\x65"
- "\x65\x72\x73\x74\x54\x20\x6f\x6f"
- "\x4d\x20\x6e\x61\x20\x79\x65\x53"
- "\x72\x63\x74\x65\x20\x73\x6f\x54"
- "\x20\x6f\x61\x4d\x79\x6e\x53\x20"
- "\x63\x65\x65\x72\x73\x74\x54\x20"
- "\x6f\x6f\x4d\x20\x6e\x61\x0a\x79",
- .ilen = 128,
- .result = "\x0e\x2d\xb6\x97\x3c\x56\x33\xf4"
- "\x67\x17\x21\xc7\x6e\x8a\xd5\x49"
- "\x74\xb3\x49\x05\xc5\x1c\xd0\xed"
- "\x12\x56\x5c\x53\x96\xb6\x00\x7d"
- "\x90\x48\xfc\xf5\x8d\x29\x39\xcc"
- "\x8a\xd5\x35\x18\x36\x23\x4e\xd7"
- "\x76\xd1\xda\x0c\x94\x67\xbb\x04"
- "\x8b\xf2\x03\x6c\xa8\xcf\xb6\xea"
- "\x22\x64\x47\xaa\x8f\x75\x13\xbf"
- "\x9f\xc2\xc3\xf0\xc9\x56\xc5\x7a"
- "\x71\x63\x2e\x89\x7b\x1e\x12\xca"
- "\xe2\x5f\xaf\xd8\xa4\xf8\xc9\x7a"
- "\xd6\xf9\x21\x31\x62\x44\x45\xa6"
- "\xd6\xbc\x5a\xd3\x2d\x54\x43\xcc"
- "\x9d\xde\xa5\x70\xe9\x42\x45\x8a"
- "\x6b\xfa\xb1\x91\x13\xb0\xd9\x19",
- .rlen = 128,
- },
-};
-
-static struct cipher_testvec des3_ede_cbc_dec_tv_template[] = {
- { /* Generated from openssl */
- .key = "\xE9\xC0\xFF\x2E\x76\x0B\x64\x24"
- "\x44\x4D\x99\x5A\x12\xD6\x40\xC0"
- "\xEA\xC2\x84\xE8\x14\x95\xDB\xE8",
- .klen = 24,
- .iv = "\x7D\x33\x88\x93\x0F\x93\xB2\x42",
- .input = "\x0e\x2d\xb6\x97\x3c\x56\x33\xf4"
- "\x67\x17\x21\xc7\x6e\x8a\xd5\x49"
- "\x74\xb3\x49\x05\xc5\x1c\xd0\xed"
- "\x12\x56\x5c\x53\x96\xb6\x00\x7d"
- "\x90\x48\xfc\xf5\x8d\x29\x39\xcc"
- "\x8a\xd5\x35\x18\x36\x23\x4e\xd7"
- "\x76\xd1\xda\x0c\x94\x67\xbb\x04"
- "\x8b\xf2\x03\x6c\xa8\xcf\xb6\xea"
- "\x22\x64\x47\xaa\x8f\x75\x13\xbf"
- "\x9f\xc2\xc3\xf0\xc9\x56\xc5\x7a"
- "\x71\x63\x2e\x89\x7b\x1e\x12\xca"
- "\xe2\x5f\xaf\xd8\xa4\xf8\xc9\x7a"
- "\xd6\xf9\x21\x31\x62\x44\x45\xa6"
- "\xd6\xbc\x5a\xd3\x2d\x54\x43\xcc"
- "\x9d\xde\xa5\x70\xe9\x42\x45\x8a"
- "\x6b\xfa\xb1\x91\x13\xb0\xd9\x19",
- .ilen = 128,
- .result = "\x6f\x54\x20\x6f\x61\x4d\x79\x6e"
- "\x53\x20\x63\x65\x65\x72\x73\x74"
- "\x54\x20\x6f\x6f\x4d\x20\x6e\x61"
- "\x20\x79\x65\x53\x72\x63\x74\x65"
- "\x20\x73\x6f\x54\x20\x6f\x61\x4d"
- "\x79\x6e\x53\x20\x63\x65\x65\x72"
- "\x73\x74\x54\x20\x6f\x6f\x4d\x20"
- "\x6e\x61\x20\x79\x65\x53\x72\x63"
- "\x74\x65\x20\x73\x6f\x54\x20\x6f"
- "\x61\x4d\x79\x6e\x53\x20\x63\x65"
- "\x65\x72\x73\x74\x54\x20\x6f\x6f"
- "\x4d\x20\x6e\x61\x20\x79\x65\x53"
- "\x72\x63\x74\x65\x20\x73\x6f\x54"
- "\x20\x6f\x61\x4d\x79\x6e\x53\x20"
- "\x63\x65\x65\x72\x73\x74\x54\x20"
- "\x6f\x6f\x4d\x20\x6e\x61\x0a\x79",
- .rlen = 128,
- },
-};
-
-/*
- * Blowfish test vectors.
- */
-#define BF_ENC_TEST_VECTORS 6
-#define BF_DEC_TEST_VECTORS 6
-#define BF_CBC_ENC_TEST_VECTORS 1
-#define BF_CBC_DEC_TEST_VECTORS 1
-
-static struct cipher_testvec bf_enc_tv_template[] = {
- { /* DES test vectors from OpenSSL */
- .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .klen = 8,
- .input = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .ilen = 8,
- .result = "\x4e\xf9\x97\x45\x61\x98\xdd\x78",
- .rlen = 8,
- }, {
- .key = "\x1f\x1f\x1f\x1f\x0e\x0e\x0e\x0e",
- .klen = 8,
- .input = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .ilen = 8,
- .result = "\xa7\x90\x79\x51\x08\xea\x3c\xae",
- .rlen = 8,
- }, {
- .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
- .klen = 8,
- .input = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .ilen = 8,
- .result = "\xe8\x7a\x24\x4e\x2c\xc8\x5e\x82",
- .rlen = 8,
- }, { /* Vary the keylength... */
- .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87"
- "\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f",
- .klen = 16,
- .input = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .ilen = 8,
- .result = "\x93\x14\x28\x87\xee\x3b\xe1\x5c",
- .rlen = 8,
- }, {
- .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87"
- "\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f"
- "\x00\x11\x22\x33\x44",
- .klen = 21,
- .input = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .ilen = 8,
- .result = "\xe6\xf5\x1e\xd7\x9b\x9d\xb2\x1f",
- .rlen = 8,
- }, { /* Generated with bf488 */
- .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87"
- "\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f"
- "\x00\x11\x22\x33\x44\x55\x66\x77"
- "\x04\x68\x91\x04\xc2\xfd\x3b\x2f"
- "\x58\x40\x23\x64\x1a\xba\x61\x76"
- "\x1f\x1f\x1f\x1f\x0e\x0e\x0e\x0e"
- "\xff\xff\xff\xff\xff\xff\xff\xff",
- .klen = 56,
- .input = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .ilen = 8,
- .result = "\xc0\x45\x04\x01\x2e\x4e\x1f\x53",
- .rlen = 8,
- },
-};
-
-static struct cipher_testvec bf_dec_tv_template[] = {
- { /* DES test vectors from OpenSSL */
- .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .klen = 8,
- .input = "\x4e\xf9\x97\x45\x61\x98\xdd\x78",
- .ilen = 8,
- .result = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .rlen = 8,
- }, {
- .key = "\x1f\x1f\x1f\x1f\x0e\x0e\x0e\x0e",
- .klen = 8,
- .input = "\xa7\x90\x79\x51\x08\xea\x3c\xae",
- .ilen = 8,
- .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .rlen = 8,
- }, {
- .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
- .klen = 8,
- .input = "\xe8\x7a\x24\x4e\x2c\xc8\x5e\x82",
- .ilen = 8,
- .result = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .rlen = 8,
- }, { /* Vary the keylength... */
- .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87"
- "\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f",
- .klen = 16,
- .input = "\x93\x14\x28\x87\xee\x3b\xe1\x5c",
- .ilen = 8,
- .result = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .rlen = 8,
- }, {
- .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87"
- "\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f"
- "\x00\x11\x22\x33\x44",
- .klen = 21,
- .input = "\xe6\xf5\x1e\xd7\x9b\x9d\xb2\x1f",
- .ilen = 8,
- .result = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .rlen = 8,
- }, { /* Generated with bf488, using OpenSSL, Libgcrypt and Nettle */
- .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87"
- "\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f"
- "\x00\x11\x22\x33\x44\x55\x66\x77"
- "\x04\x68\x91\x04\xc2\xfd\x3b\x2f"
- "\x58\x40\x23\x64\x1a\xba\x61\x76"
- "\x1f\x1f\x1f\x1f\x0e\x0e\x0e\x0e"
- "\xff\xff\xff\xff\xff\xff\xff\xff",
- .klen = 56,
- .input = "\xc0\x45\x04\x01\x2e\x4e\x1f\x53",
- .ilen = 8,
- .result = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .rlen = 8,
- },
-};
-
-static struct cipher_testvec bf_cbc_enc_tv_template[] = {
- { /* From OpenSSL */
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
- "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
- .klen = 16,
- .iv = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .input = "\x37\x36\x35\x34\x33\x32\x31\x20"
- "\x4e\x6f\x77\x20\x69\x73\x20\x74"
- "\x68\x65\x20\x74\x69\x6d\x65\x20"
- "\x66\x6f\x72\x20\x00\x00\x00\x00",
- .ilen = 32,
- .result = "\x6b\x77\xb4\xd6\x30\x06\xde\xe6"
- "\x05\xb1\x56\xe2\x74\x03\x97\x93"
- "\x58\xde\xb9\xe7\x15\x46\x16\xd9"
- "\x59\xf1\x65\x2b\xd5\xff\x92\xcc",
- .rlen = 32,
- },
-};
-
-static struct cipher_testvec bf_cbc_dec_tv_template[] = {
- { /* From OpenSSL */
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
- "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
- .klen = 16,
- .iv = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .input = "\x6b\x77\xb4\xd6\x30\x06\xde\xe6"
- "\x05\xb1\x56\xe2\x74\x03\x97\x93"
- "\x58\xde\xb9\xe7\x15\x46\x16\xd9"
- "\x59\xf1\x65\x2b\xd5\xff\x92\xcc",
- .ilen = 32,
- .result = "\x37\x36\x35\x34\x33\x32\x31\x20"
- "\x4e\x6f\x77\x20\x69\x73\x20\x74"
- "\x68\x65\x20\x74\x69\x6d\x65\x20"
- "\x66\x6f\x72\x20\x00\x00\x00\x00",
- .rlen = 32,
- },
-};
-
-/*
- * Twofish test vectors.
- */
-#define TF_ENC_TEST_VECTORS 3
-#define TF_DEC_TEST_VECTORS 3
-#define TF_CBC_ENC_TEST_VECTORS 4
-#define TF_CBC_DEC_TEST_VECTORS 4
-
-static struct cipher_testvec tf_enc_tv_template[] = {
- {
- .key = zeroed_string,
- .klen = 16,
- .input = zeroed_string,
- .ilen = 16,
- .result = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
- "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a",
- .rlen = 16,
- }, {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
- "\xfe\xdc\xba\x98\x76\x54\x32\x10"
- "\x00\x11\x22\x33\x44\x55\x66\x77",
- .klen = 24,
- .input = zeroed_string,
- .ilen = 16,
- .result = "\xcf\xd1\xd2\xe5\xa9\xbe\x9c\xdf"
- "\x50\x1f\x13\xb8\x92\xbd\x22\x48",
- .rlen = 16,
- }, {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
- "\xfe\xdc\xba\x98\x76\x54\x32\x10"
- "\x00\x11\x22\x33\x44\x55\x66\x77"
- "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
- .klen = 32,
- .input = zeroed_string,
- .ilen = 16,
- .result = "\x37\x52\x7b\xe0\x05\x23\x34\xb8"
- "\x9f\x0c\xfc\xca\xe8\x7c\xfa\x20",
- .rlen = 16,
- },
-};
-
-static struct cipher_testvec tf_dec_tv_template[] = {
- {
- .key = zeroed_string,
- .klen = 16,
- .input = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
- "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a",
- .ilen = 16,
- .result = zeroed_string,
- .rlen = 16,
- }, {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
- "\xfe\xdc\xba\x98\x76\x54\x32\x10"
- "\x00\x11\x22\x33\x44\x55\x66\x77",
- .klen = 24,
- .input = "\xcf\xd1\xd2\xe5\xa9\xbe\x9c\xdf"
- "\x50\x1f\x13\xb8\x92\xbd\x22\x48",
- .ilen = 16,
- .result = zeroed_string,
- .rlen = 16,
- }, {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
- "\xfe\xdc\xba\x98\x76\x54\x32\x10"
- "\x00\x11\x22\x33\x44\x55\x66\x77"
- "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
- .klen = 32,
- .input = "\x37\x52\x7b\xe0\x05\x23\x34\xb8"
- "\x9f\x0c\xfc\xca\xe8\x7c\xfa\x20",
- .ilen = 16,
- .result = zeroed_string,
- .rlen = 16,
- },
-};
-
-static struct cipher_testvec tf_cbc_enc_tv_template[] = {
- { /* Generated with Nettle */
- .key = zeroed_string,
- .klen = 16,
- .iv = zeroed_string,
- .input = zeroed_string,
- .ilen = 16,
- .result = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
- "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a",
- .rlen = 16,
- }, {
- .key = zeroed_string,
- .klen = 16,
- .iv = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
- "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a",
- .input = zeroed_string,
- .ilen = 16,
- .result = "\xd4\x91\xdb\x16\xe7\xb1\xc3\x9e"
- "\x86\xcb\x08\x6b\x78\x9f\x54\x19",
- .rlen = 16,
- }, {
- .key = zeroed_string,
- .klen = 16,
- .iv = "\xd4\x91\xdb\x16\xe7\xb1\xc3\x9e"
- "\x86\xcb\x08\x6b\x78\x9f\x54\x19",
- .input = zeroed_string,
- .ilen = 16,
- .result = "\x05\xef\x8c\x61\xa8\x11\x58\x26"
- "\x34\xba\x5c\xb7\x10\x6a\xa6\x41",
- .rlen = 16,
- }, {
- .key = zeroed_string,
- .klen = 16,
- .iv = zeroed_string,
- .input = zeroed_string,
- .ilen = 48,
- .result = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
- "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a"
- "\xd4\x91\xdb\x16\xe7\xb1\xc3\x9e"
- "\x86\xcb\x08\x6b\x78\x9f\x54\x19"
- "\x05\xef\x8c\x61\xa8\x11\x58\x26"
- "\x34\xba\x5c\xb7\x10\x6a\xa6\x41",
- .rlen = 48,
- },
-};
-
-static struct cipher_testvec tf_cbc_dec_tv_template[] = {
- { /* Reverse of the first four above */
- .key = zeroed_string,
- .klen = 16,
- .iv = zeroed_string,
- .input = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
- "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a",
- .ilen = 16,
- .result = zeroed_string,
- .rlen = 16,
- }, {
- .key = zeroed_string,
- .klen = 16,
- .iv = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
- "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a",
- .input = "\xd4\x91\xdb\x16\xe7\xb1\xc3\x9e"
- "\x86\xcb\x08\x6b\x78\x9f\x54\x19",
- .ilen = 16,
- .result = zeroed_string,
- .rlen = 16,
- }, {
- .key = zeroed_string,
- .klen = 16,
- .iv = "\xd4\x91\xdb\x16\xe7\xb1\xc3\x9e"
- "\x86\xcb\x08\x6b\x78\x9f\x54\x19",
- .input = "\x05\xef\x8c\x61\xa8\x11\x58\x26"
- "\x34\xba\x5c\xb7\x10\x6a\xa6\x41",
- .ilen = 16,
- .result = zeroed_string,
- .rlen = 16,
- }, {
- .key = zeroed_string,
- .klen = 16,
- .iv = zeroed_string,
- .input = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
- "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a"
- "\xd4\x91\xdb\x16\xe7\xb1\xc3\x9e"
- "\x86\xcb\x08\x6b\x78\x9f\x54\x19"
- "\x05\xef\x8c\x61\xa8\x11\x58\x26"
- "\x34\xba\x5c\xb7\x10\x6a\xa6\x41",
- .ilen = 48,
- .result = zeroed_string,
- .rlen = 48,
- },
-};
-
-/*
- * Serpent test vectors. These are backwards because Serpent writes
- * octet sequences in right-to-left mode.
- */
-#define SERPENT_ENC_TEST_VECTORS 4
-#define SERPENT_DEC_TEST_VECTORS 4
-
-#define TNEPRES_ENC_TEST_VECTORS 4
-#define TNEPRES_DEC_TEST_VECTORS 4
-
-static struct cipher_testvec serpent_enc_tv_template[] = {
- {
- .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .ilen = 16,
- .result = "\x12\x07\xfc\xce\x9b\xd0\xd6\x47"
- "\x6a\xe9\x8f\xbe\xd1\x43\xa0\xe2",
- .rlen = 16,
- }, {
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .klen = 16,
- .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .ilen = 16,
- .result = "\x4c\x7d\x8a\x32\x80\x72\xa2\x2c"
- "\x82\x3e\x4a\x1f\x3a\xcd\xa1\x6d",
- .rlen = 16,
- }, {
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
- .klen = 32,
- .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .ilen = 16,
- .result = "\xde\x26\x9f\xf8\x33\xe4\x32\xb8"
- "\x5b\x2e\x88\xd2\x70\x1c\xe7\x5c",
- .rlen = 16,
- }, {
- .key = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80",
- .klen = 16,
- .input = zeroed_string,
- .ilen = 16,
- .result = "\xdd\xd2\x6b\x98\xa5\xff\xd8\x2c"
- "\x05\x34\x5a\x9d\xad\xbf\xaf\x49",
- .rlen = 16,
- },
-};
-
-static struct cipher_testvec tnepres_enc_tv_template[] = {
- { /* KeySize=128, PT=0, I=1 */
- .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .key = "\x80\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .klen = 16,
- .ilen = 16,
- .result = "\x49\xaf\xbf\xad\x9d\x5a\x34\x05"
- "\x2c\xd8\xff\xa5\x98\x6b\xd2\xdd",
- .rlen = 16,
- }, { /* KeySize=192, PT=0, I=1 */
- .key = "\x80\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .klen = 24,
- .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .ilen = 16,
- .result = "\xe7\x8e\x54\x02\xc7\x19\x55\x68"
- "\xac\x36\x78\xf7\xa3\xf6\x0c\x66",
- .rlen = 16,
- }, { /* KeySize=256, PT=0, I=1 */
- .key = "\x80\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .klen = 32,
- .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .ilen = 16,
- .result = "\xab\xed\x96\xe7\x66\xbf\x28\xcb"
- "\xc0\xeb\xd2\x1a\x82\xef\x08\x19",
- .rlen = 16,
- }, { /* KeySize=256, I=257 */
- .key = "\x1f\x1e\x1d\x1c\x1b\x1a\x19\x18"
- "\x17\x16\x15\x14\x13\x12\x11\x10"
- "\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08"
- "\x07\x06\x05\x04\x03\x02\x01\x00",
- .klen = 32,
- .input = "\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08"
- "\x07\x06\x05\x04\x03\x02\x01\x00",
- .ilen = 16,
- .result = "\x5c\xe7\x1c\x70\xd2\x88\x2e\x5b"
- "\xb8\x32\xe4\x33\xf8\x9f\x26\xde",
- .rlen = 16,
- },
-};
-
-
-static struct cipher_testvec serpent_dec_tv_template[] = {
- {
- .input = "\x12\x07\xfc\xce\x9b\xd0\xd6\x47"
- "\x6a\xe9\x8f\xbe\xd1\x43\xa0\xe2",
- .ilen = 16,
- .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .rlen = 16,
- }, {
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .klen = 16,
- .input = "\x4c\x7d\x8a\x32\x80\x72\xa2\x2c"
- "\x82\x3e\x4a\x1f\x3a\xcd\xa1\x6d",
- .ilen = 16,
- .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .rlen = 16,
- }, {
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
- .klen = 32,
- .input = "\xde\x26\x9f\xf8\x33\xe4\x32\xb8"
- "\x5b\x2e\x88\xd2\x70\x1c\xe7\x5c",
- .ilen = 16,
- .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .rlen = 16,
- }, {
- .key = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80",
- .klen = 16,
- .input = "\xdd\xd2\x6b\x98\xa5\xff\xd8\x2c"
- "\x05\x34\x5a\x9d\xad\xbf\xaf\x49",
- .ilen = 16,
- .result = zeroed_string,
- .rlen = 16,
- },
-};
-
-static struct cipher_testvec tnepres_dec_tv_template[] = {
- {
- .input = "\x41\xcc\x6b\x31\x59\x31\x45\x97"
- "\x6d\x6f\xbb\x38\x4b\x37\x21\x28",
- .ilen = 16,
- .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .rlen = 16,
- }, {
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .klen = 16,
- .input = "\xea\xf4\xd7\xfc\xd8\x01\x34\x47"
- "\x81\x45\x0b\xfa\x0c\xd6\xad\x6e",
- .ilen = 16,
- .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .rlen = 16,
- }, {
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
- .klen = 32,
- .input = "\x64\xa9\x1a\x37\xed\x9f\xe7\x49"
- "\xa8\x4e\x76\xd6\xf5\x0d\x78\xee",
- .ilen = 16,
- .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .rlen = 16,
- }, { /* KeySize=128, I=121 */
- .key = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80",
- .klen = 16,
- .input = "\x3d\xda\xbf\xc0\x06\xda\xab\x06"
- "\x46\x2a\xf4\xef\x81\x54\x4e\x26",
- .ilen = 16,
- .result = zeroed_string,
- .rlen = 16,
- },
-};
-
-
-/* Cast6 test vectors from RFC 2612 */
-#define CAST6_ENC_TEST_VECTORS 3
-#define CAST6_DEC_TEST_VECTORS 3
-
-static struct cipher_testvec cast6_enc_tv_template[] = {
- {
- .key = "\x23\x42\xbb\x9e\xfa\x38\x54\x2c"
- "\x0a\xf7\x56\x47\xf2\x9f\x61\x5d",
- .klen = 16,
- .input = zeroed_string,
- .ilen = 16,
- .result = "\xc8\x42\xa0\x89\x72\xb4\x3d\x20"
- "\x83\x6c\x91\xd1\xb7\x53\x0f\x6b",
- .rlen = 16,
- }, {
- .key = "\x23\x42\xbb\x9e\xfa\x38\x54\x2c"
- "\xbe\xd0\xac\x83\x94\x0a\xc2\x98"
- "\xba\xc7\x7a\x77\x17\x94\x28\x63",
- .klen = 24,
- .input = zeroed_string,
- .ilen = 16,
- .result = "\x1b\x38\x6c\x02\x10\xdc\xad\xcb"
- "\xdd\x0e\x41\xaa\x08\xa7\xa7\xe8",
- .rlen = 16,
- }, {
- .key = "\x23\x42\xbb\x9e\xfa\x38\x54\x2c"
- "\xbe\xd0\xac\x83\x94\x0a\xc2\x98"
- "\x8d\x7c\x47\xce\x26\x49\x08\x46"
- "\x1c\xc1\xb5\x13\x7a\xe6\xb6\x04",
- .klen = 32,
- .input = zeroed_string,
- .ilen = 16,
- .result = "\x4f\x6a\x20\x38\x28\x68\x97\xb9"
- "\xc9\x87\x01\x36\x55\x33\x17\xfa",
- .rlen = 16,
- },
-};
-
-static struct cipher_testvec cast6_dec_tv_template[] = {
- {
- .key = "\x23\x42\xbb\x9e\xfa\x38\x54\x2c"
- "\x0a\xf7\x56\x47\xf2\x9f\x61\x5d",
- .klen = 16,
- .input = "\xc8\x42\xa0\x89\x72\xb4\x3d\x20"
- "\x83\x6c\x91\xd1\xb7\x53\x0f\x6b",
- .ilen = 16,
- .result = zeroed_string,
- .rlen = 16,
- }, {
- .key = "\x23\x42\xbb\x9e\xfa\x38\x54\x2c"
- "\xbe\xd0\xac\x83\x94\x0a\xc2\x98"
- "\xba\xc7\x7a\x77\x17\x94\x28\x63",
- .klen = 24,
- .input = "\x1b\x38\x6c\x02\x10\xdc\xad\xcb"
- "\xdd\x0e\x41\xaa\x08\xa7\xa7\xe8",
- .ilen = 16,
- .result = zeroed_string,
- .rlen = 16,
- }, {
- .key = "\x23\x42\xbb\x9e\xfa\x38\x54\x2c"
- "\xbe\xd0\xac\x83\x94\x0a\xc2\x98"
- "\x8d\x7c\x47\xce\x26\x49\x08\x46"
- "\x1c\xc1\xb5\x13\x7a\xe6\xb6\x04",
- .klen = 32,
- .input = "\x4f\x6a\x20\x38\x28\x68\x97\xb9"
- "\xc9\x87\x01\x36\x55\x33\x17\xfa",
- .ilen = 16,
- .result = zeroed_string,
- .rlen = 16,
- },
-};
-
-
-/*
- * AES test vectors.
- */
-#if !defined(CONFIG_CRYPTO_DEV_AES) && !defined(CONFIG_CRYPTO_ASYNC_AES)
-#define AES_ENC_TEST_VECTORS 3
-#define AES_DEC_TEST_VECTORS 3
-#define AES_CBC_ENC_TEST_VECTORS 4
-#define AES_CBC_DEC_TEST_VECTORS 4
-#define AES_LRW_ENC_TEST_VECTORS 8
-#define AES_LRW_DEC_TEST_VECTORS 8
-#define AES_XTS_ENC_TEST_VECTORS 4
-#define AES_XTS_DEC_TEST_VECTORS 4
-#define AES_CTR_ENC_TEST_VECTORS 3
-#define AES_CTR_DEC_TEST_VECTORS 3
-#define AES_CTR_3686_ENC_TEST_VECTORS 7
-#define AES_CTR_3686_DEC_TEST_VECTORS 6
-#define AES_GCM_ENC_TEST_VECTORS 9
-#define AES_GCM_DEC_TEST_VECTORS 8
-#define AES_CCM_ENC_TEST_VECTORS 7
-#define AES_CCM_DEC_TEST_VECTORS 7
-#define AES_CCM_4309_ENC_TEST_VECTORS 7
-#define AES_CCM_4309_DEC_TEST_VECTORS 10
-#else
-#define AES_ENC_TEST_VECTORS 3
-#define AES_DEC_TEST_VECTORS 3
-#define AES_CBC_ENC_TEST_VECTORS 3
-#define AES_CBC_DEC_TEST_VECTORS 3
-#define AES_CTR_ENC_TEST_VECTORS 3
-#define AES_CTR_DEC_TEST_VECTORS 3
-#define AES_GCM_ENC_TEST_VECTORS 9
-#define AES_GCM_DEC_TEST_VECTORS 8
-#define AES_CCM_ENC_TEST_VECTORS 7
-#define AES_CCM_DEC_TEST_VECTORS 7
-#define AES_CCM_4309_ENC_TEST_VECTORS 7
-#define AES_CCM_4309_DEC_TEST_VECTORS 10
-#define AES_CTR_3686_ENC_TEST_VECTORS 6
-#define AES_CTR_3686_DEC_TEST_VECTORS 6
-#endif /* CONFIG_CRYPTO_DEV_AES */
-
-static struct cipher_testvec aes_enc_tv_template[] = {
- { /* From FIPS-197 */
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .klen = 16,
- .input = "\x00\x11\x22\x33\x44\x55\x66\x77"
- "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
- .ilen = 16,
- .result = "\x69\xc4\xe0\xd8\x6a\x7b\x04\x30"
- "\xd8\xcd\xb7\x80\x70\xb4\xc5\x5a",
- .rlen = 16,
- }, {
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17",
- .klen = 24,
- .input = "\x00\x11\x22\x33\x44\x55\x66\x77"
- "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
- .ilen = 16,
- .result = "\xdd\xa9\x7c\xa4\x86\x4c\xdf\xe0"
- "\x6e\xaf\x70\xa0\xec\x0d\x71\x91",
- .rlen = 16,
- }, {
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
- .klen = 32,
- .input = "\x00\x11\x22\x33\x44\x55\x66\x77"
- "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
- .ilen = 16,
- .result = "\x8e\xa2\xb7\xca\x51\x67\x45\xbf"
- "\xea\xfc\x49\x90\x4b\x49\x60\x89",
- .rlen = 16,
- },
-};
-
-static struct cipher_testvec aes_dec_tv_template[] = {
- { /* From FIPS-197 */
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .klen = 16,
- .input = "\x69\xc4\xe0\xd8\x6a\x7b\x04\x30"
- "\xd8\xcd\xb7\x80\x70\xb4\xc5\x5a",
- .ilen = 16,
- .result = "\x00\x11\x22\x33\x44\x55\x66\x77"
- "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
- .rlen = 16,
- }, {
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17",
- .klen = 24,
- .input = "\xdd\xa9\x7c\xa4\x86\x4c\xdf\xe0"
- "\x6e\xaf\x70\xa0\xec\x0d\x71\x91",
- .ilen = 16,
- .result = "\x00\x11\x22\x33\x44\x55\x66\x77"
- "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
- .rlen = 16,
- }, {
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
- .klen = 32,
- .input = "\x8e\xa2\xb7\xca\x51\x67\x45\xbf"
- "\xea\xfc\x49\x90\x4b\x49\x60\x89",
- .ilen = 16,
- .result = "\x00\x11\x22\x33\x44\x55\x66\x77"
- "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
- .rlen = 16,
- },
-};
-
-static struct cipher_testvec aes_cbc_enc_tv_template[] = {
- { /* From RFC 3602 */
- .key = "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
- "\x51\x2e\x03\xd5\x34\x12\x00\x06",
- .klen = 16,
- .iv = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
- "\xb4\x22\xda\x80\x2c\x9f\xac\x41",
- .input = "Single block msg",
- .ilen = 16,
- .result = "\xe3\x53\x77\x9c\x10\x79\xae\xb8"
- "\x27\x08\x94\x2d\xbe\x77\x18\x1a",
- .rlen = 16,
- }, {
- .key = "\xc2\x86\x69\x6d\x88\x7c\x9a\xa0"
- "\x61\x1b\xbb\x3e\x20\x25\xa4\x5a",
- .klen = 16,
- .iv = "\x56\x2e\x17\x99\x6d\x09\x3d\x28"
- "\xdd\xb3\xba\x69\x5a\x2e\x6f\x58",
- .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
- .ilen = 32,
- .result = "\xd2\x96\xcd\x94\xc2\xcc\xcf\x8a"
- "\x3a\x86\x30\x28\xb5\xe1\xdc\x0a"
- "\x75\x86\x60\x2d\x25\x3c\xff\xf9"
- "\x1b\x82\x66\xbe\xa6\xd6\x1a\xb1",
- .rlen = 32,
- }, { /* From NIST SP800-38A */
- .key = "\x8e\x73\xb0\xf7\xda\x0e\x64\x52"
- "\xc8\x10\xf3\x2b\x80\x90\x79\xe5"
- "\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
- .klen = 24,
- .iv = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .input = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
- "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
- "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
- "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
- "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
- "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
- "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
- "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
- .ilen = 64,
- .result = "\x4f\x02\x1d\xb2\x43\xbc\x63\x3d"
- "\x71\x78\x18\x3a\x9f\xa0\x71\xe8"
- "\xb4\xd9\xad\xa9\xad\x7d\xed\xf4"
- "\xe5\xe7\x38\x76\x3f\x69\x14\x5a"
- "\x57\x1b\x24\x20\x12\xfb\x7a\xe0"
- "\x7f\xa9\xba\xac\x3d\xf1\x02\xe0"
- "\x08\xb0\xe2\x79\x88\x59\x88\x81"
- "\xd9\x20\xa9\xe6\x4f\x56\x15\xcd",
- .rlen = 64,
-#if !defined(CONFIG_CRYPTO_DEV_AES) && !defined(CONFIG_CRYPTO_ASYNC_AES)
- }, {
- .key = "\x60\x3d\xeb\x10\x15\xca\x71\xbe"
- "\x2b\x73\xae\xf0\x85\x7d\x77\x81"
- "\x1f\x35\x2c\x07\x3b\x61\x08\xd7"
- "\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
- .klen = 32,
- .iv = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .input = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
- "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
- "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
- "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
- "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
- "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
- "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
- "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
- .ilen = 64,
- .result = "\xf5\x8c\x4c\x04\xd6\xe5\xf1\xba"
- "\x77\x9e\xab\xfb\x5f\x7b\xfb\xd6"
- "\x9c\xfc\x4e\x96\x7e\xdb\x80\x8d"
- "\x67\x9f\x77\x7b\xc6\x70\x2c\x7d"
- "\x39\xf2\x33\x69\xa9\xd9\xba\xcf"
- "\xa5\x30\xe2\x63\x04\x23\x14\x61"
- "\xb2\xeb\x05\xe2\xc3\x9b\xe9\xfc"
- "\xda\x6c\x19\x07\x8c\x6a\x9d\x1b",
- .rlen = 64,
-#endif
- },
-};
-
-static struct cipher_testvec aes_cbc_dec_tv_template[] = {
- { /* From RFC 3602 */
- .key = "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
- "\x51\x2e\x03\xd5\x34\x12\x00\x06",
- .klen = 16,
- .iv = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
- "\xb4\x22\xda\x80\x2c\x9f\xac\x41",
- .input = "\xe3\x53\x77\x9c\x10\x79\xae\xb8"
- "\x27\x08\x94\x2d\xbe\x77\x18\x1a",
- .ilen = 16,
- .result = "Single block msg",
- .rlen = 16,
- }, {
- .key = "\xc2\x86\x69\x6d\x88\x7c\x9a\xa0"
- "\x61\x1b\xbb\x3e\x20\x25\xa4\x5a",
- .klen = 16,
- .iv = "\x56\x2e\x17\x99\x6d\x09\x3d\x28"
- "\xdd\xb3\xba\x69\x5a\x2e\x6f\x58",
- .input = "\xd2\x96\xcd\x94\xc2\xcc\xcf\x8a"
- "\x3a\x86\x30\x28\xb5\xe1\xdc\x0a"
- "\x75\x86\x60\x2d\x25\x3c\xff\xf9"
- "\x1b\x82\x66\xbe\xa6\xd6\x1a\xb1",
- .ilen = 32,
- .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
- .rlen = 32,
- }, { /* From NIST SP800-38A */
- .key = "\x8e\x73\xb0\xf7\xda\x0e\x64\x52"
- "\xc8\x10\xf3\x2b\x80\x90\x79\xe5"
- "\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
- .klen = 24,
- .iv = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .input = "\x4f\x02\x1d\xb2\x43\xbc\x63\x3d"
- "\x71\x78\x18\x3a\x9f\xa0\x71\xe8"
- "\xb4\xd9\xad\xa9\xad\x7d\xed\xf4"
- "\xe5\xe7\x38\x76\x3f\x69\x14\x5a"
- "\x57\x1b\x24\x20\x12\xfb\x7a\xe0"
- "\x7f\xa9\xba\xac\x3d\xf1\x02\xe0"
- "\x08\xb0\xe2\x79\x88\x59\x88\x81"
- "\xd9\x20\xa9\xe6\x4f\x56\x15\xcd",
- .ilen = 64,
- .result = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
- "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
- "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
- "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
- "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
- "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
- "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
- "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
- .rlen = 64,
-#if !defined(CONFIG_CRYPTO_DEV_AES) && !defined(CONFIG_CRYPTO_ASYNC_AES)
- }, {
- .key = "\x60\x3d\xeb\x10\x15\xca\x71\xbe"
- "\x2b\x73\xae\xf0\x85\x7d\x77\x81"
- "\x1f\x35\x2c\x07\x3b\x61\x08\xd7"
- "\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
- .klen = 32,
- .iv = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .input = "\xf5\x8c\x4c\x04\xd6\xe5\xf1\xba"
- "\x77\x9e\xab\xfb\x5f\x7b\xfb\xd6"
- "\x9c\xfc\x4e\x96\x7e\xdb\x80\x8d"
- "\x67\x9f\x77\x7b\xc6\x70\x2c\x7d"
- "\x39\xf2\x33\x69\xa9\xd9\xba\xcf"
- "\xa5\x30\xe2\x63\x04\x23\x14\x61"
- "\xb2\xeb\x05\xe2\xc3\x9b\xe9\xfc"
- "\xda\x6c\x19\x07\x8c\x6a\x9d\x1b",
- .ilen = 64,
- .result = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
- "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
- "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
- "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
- "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
- "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
- "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
- "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
- .rlen = 64,
-#endif
- },
-};
-
-#if !defined(CONFIG_CRYPTO_DEV_AES) && !defined(CONFIG_CRYPTO_ASYNC_AES)
-
-static struct cipher_testvec aes_lrw_enc_tv_template[] = {
- /* from http://grouper.ieee.org/groups/1619/email/pdf00017.pdf */
- { /* LRW-32-AES 1 */
- .key = "\x45\x62\xac\x25\xf8\x28\x17\x6d"
- "\x4c\x26\x84\x14\xb5\x68\x01\x85"
- "\x25\x8e\x2a\x05\xe7\x3e\x9d\x03"
- "\xee\x5a\x83\x0c\xcc\x09\x4c\x87",
- .klen = 32,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x01",
- .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
- "\x38\x39\x41\x42\x43\x44\x45\x46",
- .ilen = 16,
- .result = "\xf1\xb2\x73\xcd\x65\xa3\xdf\x5f"
- "\xe9\x5d\x48\x92\x54\x63\x4e\xb8",
- .rlen = 16,
- }, { /* LRW-32-AES 2 */
- .key = "\x59\x70\x47\x14\xf5\x57\x47\x8c"
- "\xd7\x79\xe8\x0f\x54\x88\x79\x44"
- "\x0d\x48\xf0\xb7\xb1\x5a\x53\xea"
- "\x1c\xaa\x6b\x29\xc2\xca\xfb\xaf",
- .klen = 32,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x02",
- .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
- "\x38\x39\x41\x42\x43\x44\x45\x46",
- .ilen = 16,
- .result = "\x00\xc8\x2b\xae\x95\xbb\xcd\xe5"
- "\x27\x4f\x07\x69\xb2\x60\xe1\x36",
- .rlen = 16,
- }, { /* LRW-32-AES 3 */
- .key = "\xd8\x2a\x91\x34\xb2\x6a\x56\x50"
- "\x30\xfe\x69\xe2\x37\x7f\x98\x47"
- "\xcd\xf9\x0b\x16\x0c\x64\x8f\xb6"
- "\xb0\x0d\x0d\x1b\xae\x85\x87\x1f",
- .klen = 32,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x02\x00\x00\x00\x00",
- .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
- "\x38\x39\x41\x42\x43\x44\x45\x46",
- .ilen = 16,
- .result = "\x76\x32\x21\x83\xed\x8f\xf1\x82"
- "\xf9\x59\x62\x03\x69\x0e\x5e\x01",
- .rlen = 16,
- }, { /* LRW-32-AES 4 */
- .key = "\x0f\x6a\xef\xf8\xd3\xd2\xbb\x15"
- "\x25\x83\xf7\x3c\x1f\x01\x28\x74"
- "\xca\xc6\xbc\x35\x4d\x4a\x65\x54"
- "\x90\xae\x61\xcf\x7b\xae\xbd\xcc"
- "\xad\xe4\x94\xc5\x4a\x29\xae\x70",
- .klen = 40,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x01",
- .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
- "\x38\x39\x41\x42\x43\x44\x45\x46",
- .ilen = 16,
- .result = "\x9c\x0f\x15\x2f\x55\xa2\xd8\xf0"
- "\xd6\x7b\x8f\x9e\x28\x22\xbc\x41",
- .rlen = 16,
- }, { /* LRW-32-AES 5 */
- .key = "\x8a\xd4\xee\x10\x2f\xbd\x81\xff"
- "\xf8\x86\xce\xac\x93\xc5\xad\xc6"
- "\xa0\x19\x07\xc0\x9d\xf7\xbb\xdd"
- "\x52\x13\xb2\xb7\xf0\xff\x11\xd8"
- "\xd6\x08\xd0\xcd\x2e\xb1\x17\x6f",
- .klen = 40,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x02\x00\x00\x00\x00",
- .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
- "\x38\x39\x41\x42\x43\x44\x45\x46",
- .ilen = 16,
- .result = "\xd4\x27\x6a\x7f\x14\x91\x3d\x65"
- "\xc8\x60\x48\x02\x87\xe3\x34\x06",
- .rlen = 16,
- }, { /* LRW-32-AES 6 */
- .key = "\xf8\xd4\x76\xff\xd6\x46\xee\x6c"
- "\x23\x84\xcb\x1c\x77\xd6\x19\x5d"
- "\xfe\xf1\xa9\xf3\x7b\xbc\x8d\x21"
- "\xa7\x9c\x21\xf8\xcb\x90\x02\x89"
- "\xa8\x45\x34\x8e\xc8\xc5\xb5\xf1"
- "\x26\xf5\x0e\x76\xfe\xfd\x1b\x1e",
- .klen = 48,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x01",
- .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
- "\x38\x39\x41\x42\x43\x44\x45\x46",
- .ilen = 16,
- .result = "\xbd\x06\xb8\xe1\xdb\x98\x89\x9e"
- "\xc4\x98\xe4\x91\xcf\x1c\x70\x2b",
- .rlen = 16,
- }, { /* LRW-32-AES 7 */
- .key = "\xfb\x76\x15\xb2\x3d\x80\x89\x1d"
- "\xd4\x70\x98\x0b\xc7\x95\x84\xc8"
- "\xb2\xfb\x64\xce\x60\x97\x87\x8d"
- "\x17\xfc\xe4\x5a\x49\xe8\x30\xb7"
- "\x6e\x78\x17\xe7\x2d\x5e\x12\xd4"
- "\x60\x64\x04\x7a\xf1\x2f\x9e\x0c",
- .klen = 48,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x02\x00\x00\x00\x00",
- .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
- "\x38\x39\x41\x42\x43\x44\x45\x46",
- .ilen = 16,
- .result = "\x5b\x90\x8e\xc1\xab\xdd\x67\x5f"
- "\x3d\x69\x8a\x95\x53\xc8\x9c\xe5",
- .rlen = 16,
- }, {
-/* http://www.mail-archive.com/stds-p1619@listserv.ieee.org/msg00173.html */
- .key = "\xf8\xd4\x76\xff\xd6\x46\xee\x6c"
- "\x23\x84\xcb\x1c\x77\xd6\x19\x5d"
- "\xfe\xf1\xa9\xf3\x7b\xbc\x8d\x21"
- "\xa7\x9c\x21\xf8\xcb\x90\x02\x89"
- "\xa8\x45\x34\x8e\xc8\xc5\xb5\xf1"
- "\x26\xf5\x0e\x76\xfe\xfd\x1b\x1e",
- .klen = 48,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x01",
- .input = "\x05\x11\xb7\x18\xab\xc6\x2d\xac"
- "\x70\x5d\xf6\x22\x94\xcd\xe5\x6c"
- "\x17\x6b\xf6\x1c\xf0\xf3\x6e\xf8"
- "\x50\x38\x1f\x71\x49\xb6\x57\xd6"
- "\x8f\xcb\x8d\x6b\xe3\xa6\x29\x90"
- "\xfe\x2a\x62\x82\xae\x6d\x8b\xf6"
- "\xad\x1e\x9e\x20\x5f\x38\xbe\x04"
- "\xda\x10\x8e\xed\xa2\xa4\x87\xab"
- "\xda\x6b\xb4\x0c\x75\xba\xd3\x7c"
- "\xc9\xac\x42\x31\x95\x7c\xc9\x04"
- "\xeb\xd5\x6e\x32\x69\x8a\xdb\xa6"
- "\x15\xd7\x3f\x4f\x2f\x66\x69\x03"
- "\x9c\x1f\x54\x0f\xde\x1f\xf3\x65"
- "\x4c\x96\x12\xed\x7c\x92\x03\x01"
- "\x6f\xbc\x35\x93\xac\xf1\x27\xf1"
- "\xb4\x96\x82\x5a\x5f\xb0\xa0\x50"
- "\x89\xa4\x8e\x66\x44\x85\xcc\xfd"
- "\x33\x14\x70\xe3\x96\xb2\xc3\xd3"
- "\xbb\x54\x5a\x1a\xf9\x74\xa2\xc5"
- "\x2d\x64\x75\xdd\xb4\x54\xe6\x74"
- "\x8c\xd3\x9d\x9e\x86\xab\x51\x53"
- "\xb7\x93\x3e\x6f\xd0\x4e\x2c\x40"
- "\xf6\xa8\x2e\x3e\x9d\xf4\x66\xa5"
- "\x76\x12\x73\x44\x1a\x56\xd7\x72"
- "\x88\xcd\x21\x8c\x4c\x0f\xfe\xda"
- "\x95\xe0\x3a\xa6\xa5\x84\x46\xcd"
- "\xd5\x3e\x9d\x3a\xe2\x67\xe6\x60"
- "\x1a\xe2\x70\x85\x58\xc2\x1b\x09"
- "\xe1\xd7\x2c\xca\xad\xa8\x8f\xf9"
- "\xac\xb3\x0e\xdb\xca\x2e\xe2\xb8"
- "\x51\x71\xd9\x3c\x6c\xf1\x56\xf8"
- "\xea\x9c\xf1\xfb\x0c\xe6\xb7\x10"
- "\x1c\xf8\xa9\x7c\xe8\x53\x35\xc1"
- "\x90\x3e\x76\x4a\x74\xa4\x21\x2c"
- "\xf6\x2c\x4e\x0f\x94\x3a\x88\x2e"
- "\x41\x09\x6a\x33\x7d\xf6\xdd\x3f"
- "\x8d\x23\x31\x74\x84\xeb\x88\x6e"
- "\xcc\xb9\xbc\x22\x83\x19\x07\x22"
- "\xa5\x2d\xdf\xa5\xf3\x80\x85\x78"
- "\x84\x39\x6a\x6d\x6a\x99\x4f\xa5"
- "\x15\xfe\x46\xb0\xe4\x6c\xa5\x41"
- "\x3c\xce\x8f\x42\x60\x71\xa7\x75"
- "\x08\x40\x65\x8a\x82\xbf\xf5\x43"
- "\x71\x96\xa9\x4d\x44\x8a\x20\xbe"
- "\xfa\x4d\xbb\xc0\x7d\x31\x96\x65"
- "\xe7\x75\xe5\x3e\xfd\x92\x3b\xc9"
- "\x55\xbb\x16\x7e\xf7\xc2\x8c\xa4"
- "\x40\x1d\xe5\xef\x0e\xdf\xe4\x9a"
- "\x62\x73\x65\xfd\x46\x63\x25\x3d"
- "\x2b\xaf\xe5\x64\xfe\xa5\x5c\xcf"
- "\x24\xf3\xb4\xac\x64\xba\xdf\x4b"
- "\xc6\x96\x7d\x81\x2d\x8d\x97\xf7"
- "\xc5\x68\x77\x84\x32\x2b\xcc\x85"
- "\x74\x96\xf0\x12\x77\x61\xb9\xeb"
- "\x71\xaa\x82\xcb\x1c\xdb\x89\xc8"
- "\xc6\xb5\xe3\x5c\x7d\x39\x07\x24"
- "\xda\x39\x87\x45\xc0\x2b\xbb\x01"
- "\xac\xbc\x2a\x5c\x7f\xfc\xe8\xce"
- "\x6d\x9c\x6f\xed\xd3\xc1\xa1\xd6"
- "\xc5\x55\xa9\x66\x2f\xe1\xc8\x32"
- "\xa6\x5d\xa4\x3a\x98\x73\xe8\x45"
- "\xa4\xc7\xa8\xb4\xf6\x13\x03\xf6"
- "\xe9\x2e\xc4\x29\x0f\x84\xdb\xc4"
- "\x21\xc4\xc2\x75\x67\x89\x37\x0a",
- .ilen = 512,
- .result = "\x1a\x1d\xa9\x30\xad\xf9\x2f\x9b"
- "\xb6\x1d\xae\xef\xf0\x2f\xf8\x5a"
- "\x39\x3c\xbf\x2a\xb2\x45\xb2\x23"
- "\x1b\x63\x3c\xcf\xaa\xbe\xcf\x4e"
- "\xfa\xe8\x29\xc2\x20\x68\x2b\x3c"
- "\x2e\x8b\xf7\x6e\x25\xbd\xe3\x3d"
- "\x66\x27\xd6\xaf\xd6\x64\x3e\xe3"
- "\xe8\x58\x46\x97\x39\x51\x07\xde"
- "\xcb\x37\xbc\xa9\xc0\x5f\x75\xc3"
- "\x0e\x84\x23\x1d\x16\xd4\x1c\x59"
- "\x9c\x1a\x02\x55\xab\x3a\x97\x1d"
- "\xdf\xdd\xc7\x06\x51\xd7\x70\xae"
- "\x23\xc6\x8c\xf5\x1e\xa0\xe5\x82"
- "\xb8\xb2\xbf\x04\xa0\x32\x8e\x68"
- "\xeb\xaf\x6e\x2d\x94\x22\x2f\xce"
- "\x4c\xb5\x59\xe2\xa2\x2f\xa0\x98"
- "\x1a\x97\xc6\xd4\xb5\x00\x59\xf2"
- "\x84\x14\x72\xb1\x9a\x6e\xa3\x7f"
- "\xea\x20\xe7\xcb\x65\x77\x3a\xdf"
- "\xc8\x97\x67\x15\xc2\x2a\x27\xcc"
- "\x18\x55\xa1\x24\x0b\x24\x24\xaf"
- "\x5b\xec\x68\xb8\xc8\xf5\xba\x63"
- "\xff\xed\x89\xce\xd5\x3d\x88\xf3"
- "\x25\xef\x05\x7c\x3a\xef\xeb\xd8"
- "\x7a\x32\x0d\xd1\x1e\x58\x59\x99"
- "\x90\x25\xb5\x26\xb0\xe3\x2b\x6c"
- "\x4c\xa9\x8b\x84\x4f\x5e\x01\x50"
- "\x41\x30\x58\xc5\x62\x74\x52\x1d"
- "\x45\x24\x6a\x42\x64\x4f\x97\x1c"
- "\xa8\x66\xb5\x6d\x79\xd4\x0d\x48"
- "\xc5\x5f\xf3\x90\x32\xdd\xdd\xe1"
- "\xe4\xa9\x9f\xfc\xc3\x52\x5a\x46"
- "\xe4\x81\x84\x95\x36\x59\x7a\x6b"
- "\xaa\xb3\x60\xad\xce\x9f\x9f\x28"
- "\xe0\x01\x75\x22\xc4\x4e\xa9\x62"
- "\x5c\x62\x0d\x00\xcb\x13\xe8\x43"
- "\x72\xd4\x2d\x53\x46\xb5\xd1\x16"
- "\x22\x18\xdf\x34\x33\xf5\xd6\x1c"
- "\xb8\x79\x78\x97\x94\xff\x72\x13"
- "\x4c\x27\xfc\xcb\xbf\x01\x53\xa6"
- "\xb4\x50\x6e\xde\xdf\xb5\x43\xa4"
- "\x59\xdf\x52\xf9\x7c\xe0\x11\x6f"
- "\x2d\x14\x8e\x24\x61\x2c\xe1\x17"
- "\xcc\xce\x51\x0c\x19\x8a\x82\x30"
- "\x94\xd5\x3d\x6a\x53\x06\x5e\xbd"
- "\xb7\xeb\xfa\xfd\x27\x51\xde\x85"
- "\x1e\x86\x53\x11\x53\x94\x00\xee"
- "\x2b\x8c\x08\x2a\xbf\xdd\xae\x11"
- "\xcb\x1e\xa2\x07\x9a\x80\xcf\x62"
- "\x9b\x09\xdc\x95\x3c\x96\x8e\xb1"
- "\x09\xbd\xe4\xeb\xdb\xca\x70\x7a"
- "\x9e\xfa\x31\x18\x45\x3c\x21\x33"
- "\xb0\xb3\x2b\xea\xf3\x71\x2d\xe1"
- "\x03\xad\x1b\x48\xd4\x67\x27\xf0"
- "\x62\xe4\x3d\xfb\x9b\x08\x76\xe7"
- "\xdd\x2b\x01\x39\x04\x5a\x58\x7a"
- "\xf7\x11\x90\xec\xbd\x51\x5c\x32"
- "\x6b\xd7\x35\x39\x02\x6b\xf2\xa6"
- "\xd0\x0d\x07\xe1\x06\xc4\x5b\x7d"
- "\xe4\x6a\xd7\xee\x15\x1f\x83\xb4"
- "\xa3\xa7\x5e\xc3\x90\xb7\xef\xd3"
- "\xb7\x4f\xf8\x92\x4c\xb7\x3c\x29"
- "\xcd\x7e\x2b\x5d\x43\xea\x42\xe7"
- "\x74\x3f\x7d\x58\x88\x75\xde\x3e",
- .rlen = 512,
- }
-};
-
-static struct cipher_testvec aes_lrw_dec_tv_template[] = {
- /* from http://grouper.ieee.org/groups/1619/email/pdf00017.pdf */
- /* same as enc vectors with input and result reversed */
- { /* LRW-32-AES 1 */
- .key = "\x45\x62\xac\x25\xf8\x28\x17\x6d"
- "\x4c\x26\x84\x14\xb5\x68\x01\x85"
- "\x25\x8e\x2a\x05\xe7\x3e\x9d\x03"
- "\xee\x5a\x83\x0c\xcc\x09\x4c\x87",
- .klen = 32,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x01",
- .input = "\xf1\xb2\x73\xcd\x65\xa3\xdf\x5f"
- "\xe9\x5d\x48\x92\x54\x63\x4e\xb8",
- .ilen = 16,
- .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
- "\x38\x39\x41\x42\x43\x44\x45\x46",
- .rlen = 16,
- }, { /* LRW-32-AES 2 */
- .key = "\x59\x70\x47\x14\xf5\x57\x47\x8c"
- "\xd7\x79\xe8\x0f\x54\x88\x79\x44"
- "\x0d\x48\xf0\xb7\xb1\x5a\x53\xea"
- "\x1c\xaa\x6b\x29\xc2\xca\xfb\xaf",
- .klen = 32,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x02",
- .input = "\x00\xc8\x2b\xae\x95\xbb\xcd\xe5"
- "\x27\x4f\x07\x69\xb2\x60\xe1\x36",
- .ilen = 16,
- .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
- "\x38\x39\x41\x42\x43\x44\x45\x46",
- .rlen = 16,
- }, { /* LRW-32-AES 3 */
- .key = "\xd8\x2a\x91\x34\xb2\x6a\x56\x50"
- "\x30\xfe\x69\xe2\x37\x7f\x98\x47"
- "\xcd\xf9\x0b\x16\x0c\x64\x8f\xb6"
- "\xb0\x0d\x0d\x1b\xae\x85\x87\x1f",
- .klen = 32,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x02\x00\x00\x00\x00",
- .input = "\x76\x32\x21\x83\xed\x8f\xf1\x82"
- "\xf9\x59\x62\x03\x69\x0e\x5e\x01",
- .ilen = 16,
- .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
- "\x38\x39\x41\x42\x43\x44\x45\x46",
- .rlen = 16,
- }, { /* LRW-32-AES 4 */
- .key = "\x0f\x6a\xef\xf8\xd3\xd2\xbb\x15"
- "\x25\x83\xf7\x3c\x1f\x01\x28\x74"
- "\xca\xc6\xbc\x35\x4d\x4a\x65\x54"
- "\x90\xae\x61\xcf\x7b\xae\xbd\xcc"
- "\xad\xe4\x94\xc5\x4a\x29\xae\x70",
- .klen = 40,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x01",
- .input = "\x9c\x0f\x15\x2f\x55\xa2\xd8\xf0"
- "\xd6\x7b\x8f\x9e\x28\x22\xbc\x41",
- .ilen = 16,
- .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
- "\x38\x39\x41\x42\x43\x44\x45\x46",
- .rlen = 16,
- }, { /* LRW-32-AES 5 */
- .key = "\x8a\xd4\xee\x10\x2f\xbd\x81\xff"
- "\xf8\x86\xce\xac\x93\xc5\xad\xc6"
- "\xa0\x19\x07\xc0\x9d\xf7\xbb\xdd"
- "\x52\x13\xb2\xb7\xf0\xff\x11\xd8"
- "\xd6\x08\xd0\xcd\x2e\xb1\x17\x6f",
- .klen = 40,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x02\x00\x00\x00\x00",
- .input = "\xd4\x27\x6a\x7f\x14\x91\x3d\x65"
- "\xc8\x60\x48\x02\x87\xe3\x34\x06",
- .ilen = 16,
- .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
- "\x38\x39\x41\x42\x43\x44\x45\x46",
- .rlen = 16,
- }, { /* LRW-32-AES 6 */
- .key = "\xf8\xd4\x76\xff\xd6\x46\xee\x6c"
- "\x23\x84\xcb\x1c\x77\xd6\x19\x5d"
- "\xfe\xf1\xa9\xf3\x7b\xbc\x8d\x21"
- "\xa7\x9c\x21\xf8\xcb\x90\x02\x89"
- "\xa8\x45\x34\x8e\xc8\xc5\xb5\xf1"
- "\x26\xf5\x0e\x76\xfe\xfd\x1b\x1e",
- .klen = 48,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x01",
- .input = "\xbd\x06\xb8\xe1\xdb\x98\x89\x9e"
- "\xc4\x98\xe4\x91\xcf\x1c\x70\x2b",
- .ilen = 16,
- .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
- "\x38\x39\x41\x42\x43\x44\x45\x46",
- .rlen = 16,
- }, { /* LRW-32-AES 7 */
- .key = "\xfb\x76\x15\xb2\x3d\x80\x89\x1d"
- "\xd4\x70\x98\x0b\xc7\x95\x84\xc8"
- "\xb2\xfb\x64\xce\x60\x97\x87\x8d"
- "\x17\xfc\xe4\x5a\x49\xe8\x30\xb7"
- "\x6e\x78\x17\xe7\x2d\x5e\x12\xd4"
- "\x60\x64\x04\x7a\xf1\x2f\x9e\x0c",
- .klen = 48,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x02\x00\x00\x00\x00",
- .input = "\x5b\x90\x8e\xc1\xab\xdd\x67\x5f"
- "\x3d\x69\x8a\x95\x53\xc8\x9c\xe5",
- .ilen = 16,
- .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
- "\x38\x39\x41\x42\x43\x44\x45\x46",
- .rlen = 16,
- }, {
-/* http://www.mail-archive.com/stds-p1619@listserv.ieee.org/msg00173.html */
- .key = "\xf8\xd4\x76\xff\xd6\x46\xee\x6c"
- "\x23\x84\xcb\x1c\x77\xd6\x19\x5d"
- "\xfe\xf1\xa9\xf3\x7b\xbc\x8d\x21"
- "\xa7\x9c\x21\xf8\xcb\x90\x02\x89"
- "\xa8\x45\x34\x8e\xc8\xc5\xb5\xf1"
- "\x26\xf5\x0e\x76\xfe\xfd\x1b\x1e",
- .klen = 48,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x01",
- .input = "\x1a\x1d\xa9\x30\xad\xf9\x2f\x9b"
- "\xb6\x1d\xae\xef\xf0\x2f\xf8\x5a"
- "\x39\x3c\xbf\x2a\xb2\x45\xb2\x23"
- "\x1b\x63\x3c\xcf\xaa\xbe\xcf\x4e"
- "\xfa\xe8\x29\xc2\x20\x68\x2b\x3c"
- "\x2e\x8b\xf7\x6e\x25\xbd\xe3\x3d"
- "\x66\x27\xd6\xaf\xd6\x64\x3e\xe3"
- "\xe8\x58\x46\x97\x39\x51\x07\xde"
- "\xcb\x37\xbc\xa9\xc0\x5f\x75\xc3"
- "\x0e\x84\x23\x1d\x16\xd4\x1c\x59"
- "\x9c\x1a\x02\x55\xab\x3a\x97\x1d"
- "\xdf\xdd\xc7\x06\x51\xd7\x70\xae"
- "\x23\xc6\x8c\xf5\x1e\xa0\xe5\x82"
- "\xb8\xb2\xbf\x04\xa0\x32\x8e\x68"
- "\xeb\xaf\x6e\x2d\x94\x22\x2f\xce"
- "\x4c\xb5\x59\xe2\xa2\x2f\xa0\x98"
- "\x1a\x97\xc6\xd4\xb5\x00\x59\xf2"
- "\x84\x14\x72\xb1\x9a\x6e\xa3\x7f"
- "\xea\x20\xe7\xcb\x65\x77\x3a\xdf"
- "\xc8\x97\x67\x15\xc2\x2a\x27\xcc"
- "\x18\x55\xa1\x24\x0b\x24\x24\xaf"
- "\x5b\xec\x68\xb8\xc8\xf5\xba\x63"
- "\xff\xed\x89\xce\xd5\x3d\x88\xf3"
- "\x25\xef\x05\x7c\x3a\xef\xeb\xd8"
- "\x7a\x32\x0d\xd1\x1e\x58\x59\x99"
- "\x90\x25\xb5\x26\xb0\xe3\x2b\x6c"
- "\x4c\xa9\x8b\x84\x4f\x5e\x01\x50"
- "\x41\x30\x58\xc5\x62\x74\x52\x1d"
- "\x45\x24\x6a\x42\x64\x4f\x97\x1c"
- "\xa8\x66\xb5\x6d\x79\xd4\x0d\x48"
- "\xc5\x5f\xf3\x90\x32\xdd\xdd\xe1"
- "\xe4\xa9\x9f\xfc\xc3\x52\x5a\x46"
- "\xe4\x81\x84\x95\x36\x59\x7a\x6b"
- "\xaa\xb3\x60\xad\xce\x9f\x9f\x28"
- "\xe0\x01\x75\x22\xc4\x4e\xa9\x62"
- "\x5c\x62\x0d\x00\xcb\x13\xe8\x43"
- "\x72\xd4\x2d\x53\x46\xb5\xd1\x16"
- "\x22\x18\xdf\x34\x33\xf5\xd6\x1c"
- "\xb8\x79\x78\x97\x94\xff\x72\x13"
- "\x4c\x27\xfc\xcb\xbf\x01\x53\xa6"
- "\xb4\x50\x6e\xde\xdf\xb5\x43\xa4"
- "\x59\xdf\x52\xf9\x7c\xe0\x11\x6f"
- "\x2d\x14\x8e\x24\x61\x2c\xe1\x17"
- "\xcc\xce\x51\x0c\x19\x8a\x82\x30"
- "\x94\xd5\x3d\x6a\x53\x06\x5e\xbd"
- "\xb7\xeb\xfa\xfd\x27\x51\xde\x85"
- "\x1e\x86\x53\x11\x53\x94\x00\xee"
- "\x2b\x8c\x08\x2a\xbf\xdd\xae\x11"
- "\xcb\x1e\xa2\x07\x9a\x80\xcf\x62"
- "\x9b\x09\xdc\x95\x3c\x96\x8e\xb1"
- "\x09\xbd\xe4\xeb\xdb\xca\x70\x7a"
- "\x9e\xfa\x31\x18\x45\x3c\x21\x33"
- "\xb0\xb3\x2b\xea\xf3\x71\x2d\xe1"
- "\x03\xad\x1b\x48\xd4\x67\x27\xf0"
- "\x62\xe4\x3d\xfb\x9b\x08\x76\xe7"
- "\xdd\x2b\x01\x39\x04\x5a\x58\x7a"
- "\xf7\x11\x90\xec\xbd\x51\x5c\x32"
- "\x6b\xd7\x35\x39\x02\x6b\xf2\xa6"
- "\xd0\x0d\x07\xe1\x06\xc4\x5b\x7d"
- "\xe4\x6a\xd7\xee\x15\x1f\x83\xb4"
- "\xa3\xa7\x5e\xc3\x90\xb7\xef\xd3"
- "\xb7\x4f\xf8\x92\x4c\xb7\x3c\x29"
- "\xcd\x7e\x2b\x5d\x43\xea\x42\xe7"
- "\x74\x3f\x7d\x58\x88\x75\xde\x3e",
- .ilen = 512,
- .result = "\x05\x11\xb7\x18\xab\xc6\x2d\xac"
- "\x70\x5d\xf6\x22\x94\xcd\xe5\x6c"
- "\x17\x6b\xf6\x1c\xf0\xf3\x6e\xf8"
- "\x50\x38\x1f\x71\x49\xb6\x57\xd6"
- "\x8f\xcb\x8d\x6b\xe3\xa6\x29\x90"
- "\xfe\x2a\x62\x82\xae\x6d\x8b\xf6"
- "\xad\x1e\x9e\x20\x5f\x38\xbe\x04"
- "\xda\x10\x8e\xed\xa2\xa4\x87\xab"
- "\xda\x6b\xb4\x0c\x75\xba\xd3\x7c"
- "\xc9\xac\x42\x31\x95\x7c\xc9\x04"
- "\xeb\xd5\x6e\x32\x69\x8a\xdb\xa6"
- "\x15\xd7\x3f\x4f\x2f\x66\x69\x03"
- "\x9c\x1f\x54\x0f\xde\x1f\xf3\x65"
- "\x4c\x96\x12\xed\x7c\x92\x03\x01"
- "\x6f\xbc\x35\x93\xac\xf1\x27\xf1"
- "\xb4\x96\x82\x5a\x5f\xb0\xa0\x50"
- "\x89\xa4\x8e\x66\x44\x85\xcc\xfd"
- "\x33\x14\x70\xe3\x96\xb2\xc3\xd3"
- "\xbb\x54\x5a\x1a\xf9\x74\xa2\xc5"
- "\x2d\x64\x75\xdd\xb4\x54\xe6\x74"
- "\x8c\xd3\x9d\x9e\x86\xab\x51\x53"
- "\xb7\x93\x3e\x6f\xd0\x4e\x2c\x40"
- "\xf6\xa8\x2e\x3e\x9d\xf4\x66\xa5"
- "\x76\x12\x73\x44\x1a\x56\xd7\x72"
- "\x88\xcd\x21\x8c\x4c\x0f\xfe\xda"
- "\x95\xe0\x3a\xa6\xa5\x84\x46\xcd"
- "\xd5\x3e\x9d\x3a\xe2\x67\xe6\x60"
- "\x1a\xe2\x70\x85\x58\xc2\x1b\x09"
- "\xe1\xd7\x2c\xca\xad\xa8\x8f\xf9"
- "\xac\xb3\x0e\xdb\xca\x2e\xe2\xb8"
- "\x51\x71\xd9\x3c\x6c\xf1\x56\xf8"
- "\xea\x9c\xf1\xfb\x0c\xe6\xb7\x10"
- "\x1c\xf8\xa9\x7c\xe8\x53\x35\xc1"
- "\x90\x3e\x76\x4a\x74\xa4\x21\x2c"
- "\xf6\x2c\x4e\x0f\x94\x3a\x88\x2e"
- "\x41\x09\x6a\x33\x7d\xf6\xdd\x3f"
- "\x8d\x23\x31\x74\x84\xeb\x88\x6e"
- "\xcc\xb9\xbc\x22\x83\x19\x07\x22"
- "\xa5\x2d\xdf\xa5\xf3\x80\x85\x78"
- "\x84\x39\x6a\x6d\x6a\x99\x4f\xa5"
- "\x15\xfe\x46\xb0\xe4\x6c\xa5\x41"
- "\x3c\xce\x8f\x42\x60\x71\xa7\x75"
- "\x08\x40\x65\x8a\x82\xbf\xf5\x43"
- "\x71\x96\xa9\x4d\x44\x8a\x20\xbe"
- "\xfa\x4d\xbb\xc0\x7d\x31\x96\x65"
- "\xe7\x75\xe5\x3e\xfd\x92\x3b\xc9"
- "\x55\xbb\x16\x7e\xf7\xc2\x8c\xa4"
- "\x40\x1d\xe5\xef\x0e\xdf\xe4\x9a"
- "\x62\x73\x65\xfd\x46\x63\x25\x3d"
- "\x2b\xaf\xe5\x64\xfe\xa5\x5c\xcf"
- "\x24\xf3\xb4\xac\x64\xba\xdf\x4b"
- "\xc6\x96\x7d\x81\x2d\x8d\x97\xf7"
- "\xc5\x68\x77\x84\x32\x2b\xcc\x85"
- "\x74\x96\xf0\x12\x77\x61\xb9\xeb"
- "\x71\xaa\x82\xcb\x1c\xdb\x89\xc8"
- "\xc6\xb5\xe3\x5c\x7d\x39\x07\x24"
- "\xda\x39\x87\x45\xc0\x2b\xbb\x01"
- "\xac\xbc\x2a\x5c\x7f\xfc\xe8\xce"
- "\x6d\x9c\x6f\xed\xd3\xc1\xa1\xd6"
- "\xc5\x55\xa9\x66\x2f\xe1\xc8\x32"
- "\xa6\x5d\xa4\x3a\x98\x73\xe8\x45"
- "\xa4\xc7\xa8\xb4\xf6\x13\x03\xf6"
- "\xe9\x2e\xc4\x29\x0f\x84\xdb\xc4"
- "\x21\xc4\xc2\x75\x67\x89\x37\x0a",
- .rlen = 512,
- }
-};
-
-static struct cipher_testvec aes_xts_enc_tv_template[] = {
- /* http://grouper.ieee.org/groups/1619/email/pdf00086.pdf */
- { /* XTS-AES 1 */
- .key = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .klen = 32,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .ilen = 32,
- .result = "\x91\x7c\xf6\x9e\xbd\x68\xb2\xec"
- "\x9b\x9f\xe9\xa3\xea\xdd\xa6\x92"
- "\xcd\x43\xd2\xf5\x95\x98\xed\x85"
- "\x8c\x02\xc2\x65\x2f\xbf\x92\x2e",
- .rlen = 32,
- }, { /* XTS-AES 2 */
- .key = "\x11\x11\x11\x11\x11\x11\x11\x11"
- "\x11\x11\x11\x11\x11\x11\x11\x11"
- "\x22\x22\x22\x22\x22\x22\x22\x22"
- "\x22\x22\x22\x22\x22\x22\x22\x22",
- .klen = 32,
- .iv = "\x33\x33\x33\x33\x33\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .input = "\x44\x44\x44\x44\x44\x44\x44\x44"
- "\x44\x44\x44\x44\x44\x44\x44\x44"
- "\x44\x44\x44\x44\x44\x44\x44\x44"
- "\x44\x44\x44\x44\x44\x44\x44\x44",
- .ilen = 32,
- .result = "\xc4\x54\x18\x5e\x6a\x16\x93\x6e"
- "\x39\x33\x40\x38\xac\xef\x83\x8b"
- "\xfb\x18\x6f\xff\x74\x80\xad\xc4"
- "\x28\x93\x82\xec\xd6\xd3\x94\xf0",
- .rlen = 32,
- }, { /* XTS-AES 3 */
- .key = "\xff\xfe\xfd\xfc\xfb\xfa\xf9\xf8"
- "\xf7\xf6\xf5\xf4\xf3\xf2\xf1\xf0"
- "\x22\x22\x22\x22\x22\x22\x22\x22"
- "\x22\x22\x22\x22\x22\x22\x22\x22",
- .klen = 32,
- .iv = "\x33\x33\x33\x33\x33\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .input = "\x44\x44\x44\x44\x44\x44\x44\x44"
- "\x44\x44\x44\x44\x44\x44\x44\x44"
- "\x44\x44\x44\x44\x44\x44\x44\x44"
- "\x44\x44\x44\x44\x44\x44\x44\x44",
- .ilen = 32,
- .result = "\xaf\x85\x33\x6b\x59\x7a\xfc\x1a"
- "\x90\x0b\x2e\xb2\x1e\xc9\x49\xd2"
- "\x92\xdf\x4c\x04\x7e\x0b\x21\x53"
- "\x21\x86\xa5\x97\x1a\x22\x7a\x89",
- .rlen = 32,
- }, { /* XTS-AES 4 */
- .key = "\x27\x18\x28\x18\x28\x45\x90\x45"
- "\x23\x53\x60\x28\x74\x71\x35\x26"
- "\x31\x41\x59\x26\x53\x58\x97\x93"
- "\x23\x84\x62\x64\x33\x83\x27\x95",
- .klen = 32,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
- "\x20\x21\x22\x23\x24\x25\x26\x27"
- "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
- "\x30\x31\x32\x33\x34\x35\x36\x37"
- "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
- "\x40\x41\x42\x43\x44\x45\x46\x47"
- "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
- "\x50\x51\x52\x53\x54\x55\x56\x57"
- "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
- "\x60\x61\x62\x63\x64\x65\x66\x67"
- "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
- "\x70\x71\x72\x73\x74\x75\x76\x77"
- "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
- "\x80\x81\x82\x83\x84\x85\x86\x87"
- "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
- "\x90\x91\x92\x93\x94\x95\x96\x97"
- "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
- "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
- "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
- "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
- "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
- "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
- "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
- "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
- "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
- "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
- "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
- "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
- "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
- "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
- "\x20\x21\x22\x23\x24\x25\x26\x27"
- "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
- "\x30\x31\x32\x33\x34\x35\x36\x37"
- "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
- "\x40\x41\x42\x43\x44\x45\x46\x47"
- "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
- "\x50\x51\x52\x53\x54\x55\x56\x57"
- "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
- "\x60\x61\x62\x63\x64\x65\x66\x67"
- "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
- "\x70\x71\x72\x73\x74\x75\x76\x77"
- "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
- "\x80\x81\x82\x83\x84\x85\x86\x87"
- "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
- "\x90\x91\x92\x93\x94\x95\x96\x97"
- "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
- "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
- "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
- "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
- "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
- "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
- "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
- "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
- "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
- "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
- "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
- "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
- "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
- .ilen = 512,
- .result = "\x27\xa7\x47\x9b\xef\xa1\xd4\x76"
- "\x48\x9f\x30\x8c\xd4\xcf\xa6\xe2"
- "\xa9\x6e\x4b\xbe\x32\x08\xff\x25"
- "\x28\x7d\xd3\x81\x96\x16\xe8\x9c"
- "\xc7\x8c\xf7\xf5\xe5\x43\x44\x5f"
- "\x83\x33\xd8\xfa\x7f\x56\x00\x00"
- "\x05\x27\x9f\xa5\xd8\xb5\xe4\xad"
- "\x40\xe7\x36\xdd\xb4\xd3\x54\x12"
- "\x32\x80\x63\xfd\x2a\xab\x53\xe5"
- "\xea\x1e\x0a\x9f\x33\x25\x00\xa5"
- "\xdf\x94\x87\xd0\x7a\x5c\x92\xcc"
- "\x51\x2c\x88\x66\xc7\xe8\x60\xce"
- "\x93\xfd\xf1\x66\xa2\x49\x12\xb4"
- "\x22\x97\x61\x46\xae\x20\xce\x84"
- "\x6b\xb7\xdc\x9b\xa9\x4a\x76\x7a"
- "\xae\xf2\x0c\x0d\x61\xad\x02\x65"
- "\x5e\xa9\x2d\xc4\xc4\xe4\x1a\x89"
- "\x52\xc6\x51\xd3\x31\x74\xbe\x51"
- "\xa1\x0c\x42\x11\x10\xe6\xd8\x15"
- "\x88\xed\xe8\x21\x03\xa2\x52\xd8"
- "\xa7\x50\xe8\x76\x8d\xef\xff\xed"
- "\x91\x22\x81\x0a\xae\xb9\x9f\x91"
- "\x72\xaf\x82\xb6\x04\xdc\x4b\x8e"
- "\x51\xbc\xb0\x82\x35\xa6\xf4\x34"
- "\x13\x32\xe4\xca\x60\x48\x2a\x4b"
- "\xa1\xa0\x3b\x3e\x65\x00\x8f\xc5"
- "\xda\x76\xb7\x0b\xf1\x69\x0d\xb4"
- "\xea\xe2\x9c\x5f\x1b\xad\xd0\x3c"
- "\x5c\xcf\x2a\x55\xd7\x05\xdd\xcd"
- "\x86\xd4\x49\x51\x1c\xeb\x7e\xc3"
- "\x0b\xf1\x2b\x1f\xa3\x5b\x91\x3f"
- "\x9f\x74\x7a\x8a\xfd\x1b\x13\x0e"
- "\x94\xbf\xf9\x4e\xff\xd0\x1a\x91"
- "\x73\x5c\xa1\x72\x6a\xcd\x0b\x19"
- "\x7c\x4e\x5b\x03\x39\x36\x97\xe1"
- "\x26\x82\x6f\xb6\xbb\xde\x8e\xcc"
- "\x1e\x08\x29\x85\x16\xe2\xc9\xed"
- "\x03\xff\x3c\x1b\x78\x60\xf6\xde"
- "\x76\xd4\xce\xcd\x94\xc8\x11\x98"
- "\x55\xef\x52\x97\xca\x67\xe9\xf3"
- "\xe7\xff\x72\xb1\xe9\x97\x85\xca"
- "\x0a\x7e\x77\x20\xc5\xb3\x6d\xc6"
- "\xd7\x2c\xac\x95\x74\xc8\xcb\xbc"
- "\x2f\x80\x1e\x23\xe5\x6f\xd3\x44"
- "\xb0\x7f\x22\x15\x4b\xeb\xa0\xf0"
- "\x8c\xe8\x89\x1e\x64\x3e\xd9\x95"
- "\xc9\x4d\x9a\x69\xc9\xf1\xb5\xf4"
- "\x99\x02\x7a\x78\x57\x2a\xee\xbd"
- "\x74\xd2\x0c\xc3\x98\x81\xc2\x13"
- "\xee\x77\x0b\x10\x10\xe4\xbe\xa7"
- "\x18\x84\x69\x77\xae\x11\x9f\x7a"
- "\x02\x3a\xb5\x8c\xca\x0a\xd7\x52"
- "\xaf\xe6\x56\xbb\x3c\x17\x25\x6a"
- "\x9f\x6e\x9b\xf1\x9f\xdd\x5a\x38"
- "\xfc\x82\xbb\xe8\x72\xc5\x53\x9e"
- "\xdb\x60\x9e\xf4\xf7\x9c\x20\x3e"
- "\xbb\x14\x0f\x2e\x58\x3c\xb2\xad"
- "\x15\xb4\xaa\x5b\x65\x50\x16\xa8"
- "\x44\x92\x77\xdb\xd4\x77\xef\x2c"
- "\x8d\x6c\x01\x7d\xb7\x38\xb1\x8d"
- "\xeb\x4a\x42\x7d\x19\x23\xce\x3f"
- "\xf2\x62\x73\x57\x79\xa4\x18\xf2"
- "\x0a\x28\x2d\xf9\x20\x14\x7b\xea"
- "\xbe\x42\x1e\xe5\x31\x9d\x05\x68",
- .rlen = 512,
- }
-};
-
-static struct cipher_testvec aes_xts_dec_tv_template[] = {
- /* http://grouper.ieee.org/groups/1619/email/pdf00086.pdf */
- { /* XTS-AES 1 */
- .key = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .klen = 32,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .input = "\x91\x7c\xf6\x9e\xbd\x68\xb2\xec"
- "\x9b\x9f\xe9\xa3\xea\xdd\xa6\x92"
- "\xcd\x43\xd2\xf5\x95\x98\xed\x85"
- "\x8c\x02\xc2\x65\x2f\xbf\x92\x2e",
- .ilen = 32,
- .result = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .rlen = 32,
- }, { /* XTS-AES 2 */
- .key = "\x11\x11\x11\x11\x11\x11\x11\x11"
- "\x11\x11\x11\x11\x11\x11\x11\x11"
- "\x22\x22\x22\x22\x22\x22\x22\x22"
- "\x22\x22\x22\x22\x22\x22\x22\x22",
- .klen = 32,
- .iv = "\x33\x33\x33\x33\x33\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .input = "\xc4\x54\x18\x5e\x6a\x16\x93\x6e"
- "\x39\x33\x40\x38\xac\xef\x83\x8b"
- "\xfb\x18\x6f\xff\x74\x80\xad\xc4"
- "\x28\x93\x82\xec\xd6\xd3\x94\xf0",
- .ilen = 32,
- .result = "\x44\x44\x44\x44\x44\x44\x44\x44"
- "\x44\x44\x44\x44\x44\x44\x44\x44"
- "\x44\x44\x44\x44\x44\x44\x44\x44"
- "\x44\x44\x44\x44\x44\x44\x44\x44",
- .rlen = 32,
- }, { /* XTS-AES 3 */
- .key = "\xff\xfe\xfd\xfc\xfb\xfa\xf9\xf8"
- "\xf7\xf6\xf5\xf4\xf3\xf2\xf1\xf0"
- "\x22\x22\x22\x22\x22\x22\x22\x22"
- "\x22\x22\x22\x22\x22\x22\x22\x22",
- .klen = 32,
- .iv = "\x33\x33\x33\x33\x33\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .input = "\xaf\x85\x33\x6b\x59\x7a\xfc\x1a"
- "\x90\x0b\x2e\xb2\x1e\xc9\x49\xd2"
- "\x92\xdf\x4c\x04\x7e\x0b\x21\x53"
- "\x21\x86\xa5\x97\x1a\x22\x7a\x89",
- .ilen = 32,
- .result = "\x44\x44\x44\x44\x44\x44\x44\x44"
- "\x44\x44\x44\x44\x44\x44\x44\x44"
- "\x44\x44\x44\x44\x44\x44\x44\x44"
- "\x44\x44\x44\x44\x44\x44\x44\x44",
- .rlen = 32,
- }, { /* XTS-AES 4 */
- .key = "\x27\x18\x28\x18\x28\x45\x90\x45"
- "\x23\x53\x60\x28\x74\x71\x35\x26"
- "\x31\x41\x59\x26\x53\x58\x97\x93"
- "\x23\x84\x62\x64\x33\x83\x27\x95",
- .klen = 32,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .input = "\x27\xa7\x47\x9b\xef\xa1\xd4\x76"
- "\x48\x9f\x30\x8c\xd4\xcf\xa6\xe2"
- "\xa9\x6e\x4b\xbe\x32\x08\xff\x25"
- "\x28\x7d\xd3\x81\x96\x16\xe8\x9c"
- "\xc7\x8c\xf7\xf5\xe5\x43\x44\x5f"
- "\x83\x33\xd8\xfa\x7f\x56\x00\x00"
- "\x05\x27\x9f\xa5\xd8\xb5\xe4\xad"
- "\x40\xe7\x36\xdd\xb4\xd3\x54\x12"
- "\x32\x80\x63\xfd\x2a\xab\x53\xe5"
- "\xea\x1e\x0a\x9f\x33\x25\x00\xa5"
- "\xdf\x94\x87\xd0\x7a\x5c\x92\xcc"
- "\x51\x2c\x88\x66\xc7\xe8\x60\xce"
- "\x93\xfd\xf1\x66\xa2\x49\x12\xb4"
- "\x22\x97\x61\x46\xae\x20\xce\x84"
- "\x6b\xb7\xdc\x9b\xa9\x4a\x76\x7a"
- "\xae\xf2\x0c\x0d\x61\xad\x02\x65"
- "\x5e\xa9\x2d\xc4\xc4\xe4\x1a\x89"
- "\x52\xc6\x51\xd3\x31\x74\xbe\x51"
- "\xa1\x0c\x42\x11\x10\xe6\xd8\x15"
- "\x88\xed\xe8\x21\x03\xa2\x52\xd8"
- "\xa7\x50\xe8\x76\x8d\xef\xff\xed"
- "\x91\x22\x81\x0a\xae\xb9\x9f\x91"
- "\x72\xaf\x82\xb6\x04\xdc\x4b\x8e"
- "\x51\xbc\xb0\x82\x35\xa6\xf4\x34"
- "\x13\x32\xe4\xca\x60\x48\x2a\x4b"
- "\xa1\xa0\x3b\x3e\x65\x00\x8f\xc5"
- "\xda\x76\xb7\x0b\xf1\x69\x0d\xb4"
- "\xea\xe2\x9c\x5f\x1b\xad\xd0\x3c"
- "\x5c\xcf\x2a\x55\xd7\x05\xdd\xcd"
- "\x86\xd4\x49\x51\x1c\xeb\x7e\xc3"
- "\x0b\xf1\x2b\x1f\xa3\x5b\x91\x3f"
- "\x9f\x74\x7a\x8a\xfd\x1b\x13\x0e"
- "\x94\xbf\xf9\x4e\xff\xd0\x1a\x91"
- "\x73\x5c\xa1\x72\x6a\xcd\x0b\x19"
- "\x7c\x4e\x5b\x03\x39\x36\x97\xe1"
- "\x26\x82\x6f\xb6\xbb\xde\x8e\xcc"
- "\x1e\x08\x29\x85\x16\xe2\xc9\xed"
- "\x03\xff\x3c\x1b\x78\x60\xf6\xde"
- "\x76\xd4\xce\xcd\x94\xc8\x11\x98"
- "\x55\xef\x52\x97\xca\x67\xe9\xf3"
- "\xe7\xff\x72\xb1\xe9\x97\x85\xca"
- "\x0a\x7e\x77\x20\xc5\xb3\x6d\xc6"
- "\xd7\x2c\xac\x95\x74\xc8\xcb\xbc"
- "\x2f\x80\x1e\x23\xe5\x6f\xd3\x44"
- "\xb0\x7f\x22\x15\x4b\xeb\xa0\xf0"
- "\x8c\xe8\x89\x1e\x64\x3e\xd9\x95"
- "\xc9\x4d\x9a\x69\xc9\xf1\xb5\xf4"
- "\x99\x02\x7a\x78\x57\x2a\xee\xbd"
- "\x74\xd2\x0c\xc3\x98\x81\xc2\x13"
- "\xee\x77\x0b\x10\x10\xe4\xbe\xa7"
- "\x18\x84\x69\x77\xae\x11\x9f\x7a"
- "\x02\x3a\xb5\x8c\xca\x0a\xd7\x52"
- "\xaf\xe6\x56\xbb\x3c\x17\x25\x6a"
- "\x9f\x6e\x9b\xf1\x9f\xdd\x5a\x38"
- "\xfc\x82\xbb\xe8\x72\xc5\x53\x9e"
- "\xdb\x60\x9e\xf4\xf7\x9c\x20\x3e"
- "\xbb\x14\x0f\x2e\x58\x3c\xb2\xad"
- "\x15\xb4\xaa\x5b\x65\x50\x16\xa8"
- "\x44\x92\x77\xdb\xd4\x77\xef\x2c"
- "\x8d\x6c\x01\x7d\xb7\x38\xb1\x8d"
- "\xeb\x4a\x42\x7d\x19\x23\xce\x3f"
- "\xf2\x62\x73\x57\x79\xa4\x18\xf2"
- "\x0a\x28\x2d\xf9\x20\x14\x7b\xea"
- "\xbe\x42\x1e\xe5\x31\x9d\x05\x68",
- .ilen = 512,
- .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
- "\x20\x21\x22\x23\x24\x25\x26\x27"
- "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
- "\x30\x31\x32\x33\x34\x35\x36\x37"
- "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
- "\x40\x41\x42\x43\x44\x45\x46\x47"
- "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
- "\x50\x51\x52\x53\x54\x55\x56\x57"
- "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
- "\x60\x61\x62\x63\x64\x65\x66\x67"
- "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
- "\x70\x71\x72\x73\x74\x75\x76\x77"
- "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
- "\x80\x81\x82\x83\x84\x85\x86\x87"
- "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
- "\x90\x91\x92\x93\x94\x95\x96\x97"
- "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
- "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
- "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
- "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
- "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
- "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
- "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
- "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
- "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
- "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
- "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
- "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
- "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
- "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
- "\x20\x21\x22\x23\x24\x25\x26\x27"
- "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
- "\x30\x31\x32\x33\x34\x35\x36\x37"
- "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
- "\x40\x41\x42\x43\x44\x45\x46\x47"
- "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
- "\x50\x51\x52\x53\x54\x55\x56\x57"
- "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
- "\x60\x61\x62\x63\x64\x65\x66\x67"
- "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
- "\x70\x71\x72\x73\x74\x75\x76\x77"
- "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
- "\x80\x81\x82\x83\x84\x85\x86\x87"
- "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
- "\x90\x91\x92\x93\x94\x95\x96\x97"
- "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
- "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
- "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
- "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
- "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
- "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
- "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
- "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
- "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
- "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
- "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
- "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
- "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
- .rlen = 512,
- }
-};
-
-#endif
-
-static struct cipher_testvec aes_ctr_enc_tv_template[] = {
- { /* From NIST Special Publication 800-38A, Appendix F.5 */
- .key = "\x2b\x7e\x15\x16\x28\xae\xd2\xa6"
- "\xab\xf7\x15\x88\x09\xcf\x4f\x3c",
- .klen = 16,
- .iv = "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
- "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
- .input = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
- "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
- "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
- "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
- "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
- "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
- "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
- "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
- .ilen = 64,
- .result = "\x87\x4d\x61\x91\xb6\x20\xe3\x26"
- "\x1b\xef\x68\x64\x99\x0d\xb6\xce"
- "\x98\x06\xf6\x6b\x79\x70\xfd\xff"
- "\x86\x17\x18\x7b\xb9\xff\xfd\xff"
- "\x5a\xe4\xdf\x3e\xdb\xd5\xd3\x5e"
- "\x5b\x4f\x09\x02\x0d\xb0\x3e\xab"
- "\x1e\x03\x1d\xda\x2f\xbe\x03\xd1"
- "\x79\x21\x70\xa0\xf3\x00\x9c\xee",
- .rlen = 64,
- }, {
- .key = "\x8e\x73\xb0\xf7\xda\x0e\x64\x52"
- "\xc8\x10\xf3\x2b\x80\x90\x79\xe5"
- "\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
- .klen = 24,
- .iv = "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
- "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
- .input = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
- "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
- "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
- "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
- "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
- "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
- "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
- "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
- .ilen = 64,
- .result = "\x1a\xbc\x93\x24\x17\x52\x1c\xa2"
- "\x4f\x2b\x04\x59\xfe\x7e\x6e\x0b"
- "\x09\x03\x39\xec\x0a\xa6\xfa\xef"
- "\xd5\xcc\xc2\xc6\xf4\xce\x8e\x94"
- "\x1e\x36\xb2\x6b\xd1\xeb\xc6\x70"
- "\xd1\xbd\x1d\x66\x56\x20\xab\xf7"
- "\x4f\x78\xa7\xf6\xd2\x98\x09\x58"
- "\x5a\x97\xda\xec\x58\xc6\xb0\x50",
- .rlen = 64,
- }, {
- .key = "\x60\x3d\xeb\x10\x15\xca\x71\xbe"
- "\x2b\x73\xae\xf0\x85\x7d\x77\x81"
- "\x1f\x35\x2c\x07\x3b\x61\x08\xd7"
- "\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
- .klen = 32,
- .iv = "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
- "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
- .input = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
- "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
- "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
- "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
- "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
- "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
- "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
- "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
- .ilen = 64,
- .result = "\x60\x1e\xc3\x13\x77\x57\x89\xa5"
- "\xb7\xa7\xf5\x04\xbb\xf3\xd2\x28"
- "\xf4\x43\xe3\xca\x4d\x62\xb5\x9a"
- "\xca\x84\xe9\x90\xca\xca\xf5\xc5"
- "\x2b\x09\x30\xda\xa2\x3d\xe9\x4c"
- "\xe8\x70\x17\xba\x2d\x84\x98\x8d"
- "\xdf\xc9\xc5\x8d\xb6\x7a\xad\xa6"
- "\x13\xc2\xdd\x08\x45\x79\x41\xa6",
- .rlen = 64,
- }
-};
-
-static struct cipher_testvec aes_ctr_dec_tv_template[] = {
- { /* From NIST Special Publication 800-38A, Appendix F.5 */
- .key = "\x2b\x7e\x15\x16\x28\xae\xd2\xa6"
- "\xab\xf7\x15\x88\x09\xcf\x4f\x3c",
- .klen = 16,
- .iv = "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
- "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
- .input = "\x87\x4d\x61\x91\xb6\x20\xe3\x26"
- "\x1b\xef\x68\x64\x99\x0d\xb6\xce"
- "\x98\x06\xf6\x6b\x79\x70\xfd\xff"
- "\x86\x17\x18\x7b\xb9\xff\xfd\xff"
- "\x5a\xe4\xdf\x3e\xdb\xd5\xd3\x5e"
- "\x5b\x4f\x09\x02\x0d\xb0\x3e\xab"
- "\x1e\x03\x1d\xda\x2f\xbe\x03\xd1"
- "\x79\x21\x70\xa0\xf3\x00\x9c\xee",
- .ilen = 64,
- .result = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
- "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
- "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
- "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
- "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
- "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
- "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
- "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
- .rlen = 64,
- }, {
- .key = "\x8e\x73\xb0\xf7\xda\x0e\x64\x52"
- "\xc8\x10\xf3\x2b\x80\x90\x79\xe5"
- "\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
- .klen = 24,
- .iv = "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
- "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
- .input = "\x1a\xbc\x93\x24\x17\x52\x1c\xa2"
- "\x4f\x2b\x04\x59\xfe\x7e\x6e\x0b"
- "\x09\x03\x39\xec\x0a\xa6\xfa\xef"
- "\xd5\xcc\xc2\xc6\xf4\xce\x8e\x94"
- "\x1e\x36\xb2\x6b\xd1\xeb\xc6\x70"
- "\xd1\xbd\x1d\x66\x56\x20\xab\xf7"
- "\x4f\x78\xa7\xf6\xd2\x98\x09\x58"
- "\x5a\x97\xda\xec\x58\xc6\xb0\x50",
- .ilen = 64,
- .result = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
- "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
- "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
- "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
- "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
- "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
- "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
- "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
- .rlen = 64,
- }, {
- .key = "\x60\x3d\xeb\x10\x15\xca\x71\xbe"
- "\x2b\x73\xae\xf0\x85\x7d\x77\x81"
- "\x1f\x35\x2c\x07\x3b\x61\x08\xd7"
- "\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
- .klen = 32,
- .iv = "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
- "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
- .input = "\x60\x1e\xc3\x13\x77\x57\x89\xa5"
- "\xb7\xa7\xf5\x04\xbb\xf3\xd2\x28"
- "\xf4\x43\xe3\xca\x4d\x62\xb5\x9a"
- "\xca\x84\xe9\x90\xca\xca\xf5\xc5"
- "\x2b\x09\x30\xda\xa2\x3d\xe9\x4c"
- "\xe8\x70\x17\xba\x2d\x84\x98\x8d"
- "\xdf\xc9\xc5\x8d\xb6\x7a\xad\xa6"
- "\x13\xc2\xdd\x08\x45\x79\x41\xa6",
- .ilen = 64,
- .result = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
- "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
- "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
- "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
- "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
- "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
- "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
- "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
- .rlen = 64,
- }
-};
-
-static struct cipher_testvec aes_ctr_rfc3686_enc_tv_template[] = {
- { /* From RFC 3686 */
- .key = "\xae\x68\x52\xf8\x12\x10\x67\xcc"
- "\x4b\xf7\xa5\x76\x55\x77\xf3\x9e"
- "\x00\x00\x00\x30",
- .klen = 20,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .input = "Single block msg",
- .ilen = 16,
- .result = "\xe4\x09\x5d\x4f\xb7\xa7\xb3\x79"
- "\x2d\x61\x75\xa3\x26\x13\x11\xb8",
- .rlen = 16,
- }, {
- .key = "\x7e\x24\x06\x78\x17\xfa\xe0\xd7"
- "\x43\xd6\xce\x1f\x32\x53\x91\x63"
- "\x00\x6c\xb6\xdb",
- .klen = 20,
- .iv = "\xc0\x54\x3b\x59\xda\x48\xd9\x0b",
- .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
- .ilen = 32,
- .result = "\x51\x04\xa1\x06\x16\x8a\x72\xd9"
- "\x79\x0d\x41\xee\x8e\xda\xd3\x88"
- "\xeb\x2e\x1e\xfc\x46\xda\x57\xc8"
- "\xfc\xe6\x30\xdf\x91\x41\xbe\x28",
- .rlen = 32,
- }, {
- .key = "\x16\xaf\x5b\x14\x5f\xc9\xf5\x79"
- "\xc1\x75\xf9\x3e\x3b\xfb\x0e\xed"
- "\x86\x3d\x06\xcc\xfd\xb7\x85\x15"
- "\x00\x00\x00\x48",
- .klen = 28,
- .iv = "\x36\x73\x3c\x14\x7d\x6d\x93\xcb",
- .input = "Single block msg",
- .ilen = 16,
- .result = "\x4b\x55\x38\x4f\xe2\x59\xc9\xc8"
- "\x4e\x79\x35\xa0\x03\xcb\xe9\x28",
- .rlen = 16,
- }, {
- .key = "\x7c\x5c\xb2\x40\x1b\x3d\xc3\x3c"
- "\x19\xe7\x34\x08\x19\xe0\xf6\x9c"
- "\x67\x8c\x3d\xb8\xe6\xf6\xa9\x1a"
- "\x00\x96\xb0\x3b",
- .klen = 28,
- .iv = "\x02\x0c\x6e\xad\xc2\xcb\x50\x0d",
- .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
- .ilen = 32,
- .result = "\x45\x32\x43\xfc\x60\x9b\x23\x32"
- "\x7e\xdf\xaa\xfa\x71\x31\xcd\x9f"
- "\x84\x90\x70\x1c\x5a\xd4\xa7\x9c"
- "\xfc\x1f\xe0\xff\x42\xf4\xfb\x00",
- .rlen = 32,
- }, {
- .key = "\x77\x6b\xef\xf2\x85\x1d\xb0\x6f"
- "\x4c\x8a\x05\x42\xc8\x69\x6f\x6c"
- "\x6a\x81\xaf\x1e\xec\x96\xb4\xd3"
- "\x7f\xc1\xd6\x89\xe6\xc1\xc1\x04"
- "\x00\x00\x00\x60",
- .klen = 36,
- .iv = "\xdb\x56\x72\xc9\x7a\xa8\xf0\xb2",
- .input = "Single block msg",
- .ilen = 16,
- .result = "\x14\x5a\xd0\x1d\xbf\x82\x4e\xc7"
- "\x56\x08\x63\xdc\x71\xe3\xe0\xc0",
- .rlen = 16,
- }, {
- .key = "\xf6\xd6\x6d\x6b\xd5\x2d\x59\xbb"
- "\x07\x96\x36\x58\x79\xef\xf8\x86"
- "\xc6\x6d\xd5\x1a\x5b\x6a\x99\x74"
- "\x4b\x50\x59\x0c\x87\xa2\x38\x84"
- "\x00\xfa\xac\x24",
- .klen = 36,
- .iv = "\xc1\x58\x5e\xf1\x5a\x43\xd8\x75",
- .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
- .ilen = 32,
- .result = "\xf0\x5e\x23\x1b\x38\x94\x61\x2c"
- "\x49\xee\x00\x0b\x80\x4e\xb2\xa9"
- "\xb8\x30\x6b\x50\x8f\x83\x9d\x6a"
- "\x55\x30\x83\x1d\x93\x44\xaf\x1c",
- .rlen = 32,
- }, {
-#if 0
- // generated using Crypto++
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
- "\x00\x00\x00\x00",
- .klen = 32 + 4,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .input =
- "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
- "\x20\x21\x22\x23\x24\x25\x26\x27"
- "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
- "\x30\x31\x32\x33\x34\x35\x36\x37"
- "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
- "\x40\x41\x42\x43\x44\x45\x46\x47"
- "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
- "\x50\x51\x52\x53\x54\x55\x56\x57"
- "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
- "\x60\x61\x62\x63\x64\x65\x66\x67"
- "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
- "\x70\x71\x72\x73\x74\x75\x76\x77"
- "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
- "\x80\x81\x82\x83\x84\x85\x86\x87"
- "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
- "\x90\x91\x92\x93\x94\x95\x96\x97"
- "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
- "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
- "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
- "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
- "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
- "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
- "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
- "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
- "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
- "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
- "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
- "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
- "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
- "\x00\x03\x06\x09\x0c\x0f\x12\x15"
- "\x18\x1b\x1e\x21\x24\x27\x2a\x2d"
- "\x30\x33\x36\x39\x3c\x3f\x42\x45"
- "\x48\x4b\x4e\x51\x54\x57\x5a\x5d"
- "\x60\x63\x66\x69\x6c\x6f\x72\x75"
- "\x78\x7b\x7e\x81\x84\x87\x8a\x8d"
- "\x90\x93\x96\x99\x9c\x9f\xa2\xa5"
- "\xa8\xab\xae\xb1\xb4\xb7\xba\xbd"
- "\xc0\xc3\xc6\xc9\xcc\xcf\xd2\xd5"
- "\xd8\xdb\xde\xe1\xe4\xe7\xea\xed"
- "\xf0\xf3\xf6\xf9\xfc\xff\x02\x05"
- "\x08\x0b\x0e\x11\x14\x17\x1a\x1d"
- "\x20\x23\x26\x29\x2c\x2f\x32\x35"
- "\x38\x3b\x3e\x41\x44\x47\x4a\x4d"
- "\x50\x53\x56\x59\x5c\x5f\x62\x65"
- "\x68\x6b\x6e\x71\x74\x77\x7a\x7d"
- "\x80\x83\x86\x89\x8c\x8f\x92\x95"
- "\x98\x9b\x9e\xa1\xa4\xa7\xaa\xad"
- "\xb0\xb3\xb6\xb9\xbc\xbf\xc2\xc5"
- "\xc8\xcb\xce\xd1\xd4\xd7\xda\xdd"
- "\xe0\xe3\xe6\xe9\xec\xef\xf2\xf5"
- "\xf8\xfb\xfe\x01\x04\x07\x0a\x0d"
- "\x10\x13\x16\x19\x1c\x1f\x22\x25"
- "\x28\x2b\x2e\x31\x34\x37\x3a\x3d"
- "\x40\x43\x46\x49\x4c\x4f\x52\x55"
- "\x58\x5b\x5e\x61\x64\x67\x6a\x6d"
- "\x70\x73\x76\x79\x7c\x7f\x82\x85"
- "\x88\x8b\x8e\x91\x94\x97\x9a\x9d"
- "\xa0\xa3\xa6\xa9\xac\xaf\xb2\xb5"
- "\xb8\xbb\xbe\xc1\xc4\xc7\xca\xcd"
- "\xd0\xd3\xd6\xd9\xdc\xdf\xe2\xe5"
- "\xe8\xeb\xee\xf1\xf4\xf7\xfa\xfd"
- "\x00\x05\x0a\x0f\x14\x19\x1e\x23"
- "\x28\x2d\x32\x37\x3c\x41\x46\x4b"
- "\x50\x55\x5a\x5f\x64\x69\x6e\x73"
- "\x78\x7d\x82\x87\x8c\x91\x96\x9b"
- "\xa0\xa5\xaa\xaf\xb4\xb9\xbe\xc3"
- "\xc8\xcd\xd2\xd7\xdc\xe1\xe6\xeb"
- "\xf0\xf5\xfa\xff\x04\x09\x0e\x13"
- "\x18\x1d\x22\x27\x2c\x31\x36\x3b"
- "\x40\x45\x4a\x4f\x54\x59\x5e\x63"
- "\x68\x6d\x72\x77\x7c\x81\x86\x8b"
- "\x90\x95\x9a\x9f\xa4\xa9\xae\xb3"
- "\xb8\xbd\xc2\xc7\xcc\xd1\xd6\xdb"
- "\xe0\xe5\xea\xef\xf4\xf9\xfe\x03"
- "\x08\x0d\x12\x17\x1c\x21\x26\x2b"
- "\x30\x35\x3a\x3f\x44\x49\x4e\x53"
- "\x58\x5d\x62\x67\x6c\x71\x76\x7b"
- "\x80\x85\x8a\x8f\x94\x99\x9e\xa3"
- "\xa8\xad\xb2\xb7\xbc\xc1\xc6\xcb"
- "\xd0\xd5\xda\xdf\xe4\xe9\xee\xf3"
- "\xf8\xfd\x02\x07\x0c\x11\x16\x1b"
- "\x20\x25\x2a\x2f\x34\x39\x3e\x43"
- "\x48\x4d\x52\x57\x5c\x61\x66\x6b"
- "\x70\x75\x7a\x7f\x84\x89\x8e\x93"
- "\x98\x9d\xa2\xa7\xac\xb1\xb6\xbb"
- "\xc0\xc5\xca\xcf\xd4\xd9\xde\xe3"
- "\xe8\xed\xf2\xf7\xfc\x01\x06\x0b"
- "\x10\x15\x1a\x1f\x24\x29\x2e\x33"
- "\x38\x3d\x42\x47\x4c\x51\x56\x5b"
- "\x60\x65\x6a\x6f\x74\x79\x7e\x83"
- "\x88\x8d\x92\x97\x9c\xa1\xa6\xab"
- "\xb0\xb5\xba\xbf\xc4\xc9\xce\xd3"
- "\xd8\xdd\xe2\xe7\xec\xf1\xf6\xfb"
- "\x00\x07\x0e\x15\x1c\x23\x2a\x31"
- "\x38\x3f\x46\x4d\x54\x5b\x62\x69"
- "\x70\x77\x7e\x85\x8c\x93\x9a\xa1"
- "\xa8\xaf\xb6\xbd\xc4\xcb\xd2\xd9"
- "\xe0\xe7\xee\xf5\xfc\x03\x0a\x11"
- "\x18\x1f\x26\x2d\x34\x3b\x42\x49"
- "\x50\x57\x5e\x65\x6c\x73\x7a\x81"
- "\x88\x8f\x96\x9d\xa4\xab\xb2\xb9"
- "\xc0\xc7\xce\xd5\xdc\xe3\xea\xf1"
- "\xf8\xff\x06\x0d\x14\x1b\x22\x29"
- "\x30\x37\x3e\x45\x4c\x53\x5a\x61"
- "\x68\x6f\x76\x7d\x84\x8b\x92\x99"
- "\xa0\xa7\xae\xb5\xbc\xc3\xca\xd1"
- "\xd8\xdf\xe6\xed\xf4\xfb\x02\x09"
- "\x10\x17\x1e\x25\x2c\x33\x3a\x41"
- "\x48\x4f\x56\x5d\x64\x6b\x72\x79"
- "\x80\x87\x8e\x95\x9c\xa3\xaa\xb1"
- "\xb8\xbf\xc6\xcd\xd4\xdb\xe2\xe9"
- "\xf0\xf7\xfe\x05\x0c\x13\x1a\x21"
- "\x28\x2f\x36\x3d\x44\x4b\x52\x59"
- "\x60\x67\x6e\x75\x7c\x83\x8a\x91"
- "\x98\x9f\xa6\xad\xb4\xbb\xc2\xc9"
- "\xd0\xd7\xde\xe5\xec\xf3\xfa\x01"
- "\x08\x0f\x16\x1d\x24\x2b\x32\x39"
- "\x40\x47\x4e\x55\x5c\x63\x6a\x71"
- "\x78\x7f\x86\x8d\x94\x9b\xa2\xa9"
- "\xb0\xb7\xbe\xc5\xcc\xd3\xda\xe1"
- "\xe8\xef\xf6\xfd\x04\x0b\x12\x19"
- "\x20\x27\x2e\x35\x3c\x43\x4a\x51"
- "\x58\x5f\x66\x6d\x74\x7b\x82\x89"
- "\x90\x97\x9e\xa5\xac\xb3\xba\xc1"
- "\xc8\xcf\xd6\xdd\xe4\xeb\xf2\xf9"
- "\x00\x09\x12\x1b\x24\x2d\x36\x3f"
- "\x48\x51\x5a\x63\x6c\x75\x7e\x87"
- "\x90\x99\xa2\xab\xb4\xbd\xc6\xcf"
- "\xd8\xe1\xea\xf3\xfc\x05\x0e\x17"
- "\x20\x29\x32\x3b\x44\x4d\x56\x5f"
- "\x68\x71\x7a\x83\x8c\x95\x9e\xa7"
- "\xb0\xb9\xc2\xcb\xd4\xdd\xe6\xef"
- "\xf8\x01\x0a\x13\x1c\x25\x2e\x37"
- "\x40\x49\x52\x5b\x64\x6d\x76\x7f"
- "\x88\x91\x9a\xa3\xac\xb5\xbe\xc7"
- "\xd0\xd9\xe2\xeb\xf4\xfd\x06\x0f"
- "\x18\x21\x2a\x33\x3c\x45\x4e\x57"
- "\x60\x69\x72\x7b\x84\x8d\x96\x9f"
- "\xa8\xb1\xba\xc3\xcc\xd5\xde\xe7"
- "\xf0\xf9\x02\x0b\x14\x1d\x26\x2f"
- "\x38\x41\x4a\x53\x5c\x65\x6e\x77"
- "\x80\x89\x92\x9b\xa4\xad\xb6\xbf"
- "\xc8\xd1\xda\xe3\xec\xf5\xfe\x07"
- "\x10\x19\x22\x2b\x34\x3d\x46\x4f"
- "\x58\x61\x6a\x73\x7c\x85\x8e\x97"
- "\xa0\xa9\xb2\xbb\xc4\xcd\xd6\xdf"
- "\xe8\xf1\xfa\x03\x0c\x15\x1e\x27"
- "\x30\x39\x42\x4b\x54\x5d\x66\x6f"
- "\x78\x81\x8a\x93\x9c\xa5\xae\xb7"
- "\xc0\xc9\xd2\xdb\xe4\xed\xf6\xff"
- "\x08\x11\x1a\x23\x2c\x35\x3e\x47"
- "\x50\x59\x62\x6b\x74\x7d\x86\x8f"
- "\x98\xa1\xaa\xb3\xbc\xc5\xce\xd7"
- "\xe0\xe9\xf2\xfb\x04\x0d\x16\x1f"
- "\x28\x31\x3a\x43\x4c\x55\x5e\x67"
- "\x70\x79\x82\x8b\x94\x9d\xa6\xaf"
- "\xb8\xc1\xca\xd3\xdc\xe5\xee\xf7"
- "\x00\x0b\x16\x21\x2c\x37\x42\x4d"
- "\x58\x63\x6e\x79\x84\x8f\x9a\xa5"
- "\xb0\xbb\xc6\xd1\xdc\xe7\xf2\xfd"
- "\x08\x13\x1e\x29\x34\x3f\x4a\x55"
- "\x60\x6b\x76\x81\x8c\x97\xa2\xad"
- "\xb8\xc3\xce\xd9\xe4\xef\xfa\x05"
- "\x10\x1b\x26\x31\x3c\x47\x52\x5d"
- "\x68\x73\x7e\x89\x94\x9f\xaa\xb5"
- "\xc0\xcb\xd6\xe1\xec\xf7\x02\x0d"
- "\x18\x23\x2e\x39\x44\x4f\x5a\x65"
- "\x70\x7b\x86\x91\x9c\xa7\xb2\xbd"
- "\xc8\xd3\xde\xe9\xf4\xff\x0a\x15"
- "\x20\x2b\x36\x41\x4c\x57\x62\x6d"
- "\x78\x83\x8e\x99\xa4\xaf\xba\xc5"
- "\xd0\xdb\xe6\xf1\xfc\x07\x12\x1d"
- "\x28\x33\x3e\x49\x54\x5f\x6a\x75"
- "\x80\x8b\x96\xa1\xac\xb7\xc2\xcd"
- "\xd8\xe3\xee\xf9\x04\x0f\x1a\x25"
- "\x30\x3b\x46\x51\x5c\x67\x72\x7d"
- "\x88\x93\x9e\xa9\xb4\xbf\xca\xd5"
- "\xe0\xeb\xf6\x01\x0c\x17\x22\x2d"
- "\x38\x43\x4e\x59\x64\x6f\x7a\x85"
- "\x90\x9b\xa6\xb1\xbc\xc7\xd2\xdd"
- "\xe8\xf3\xfe\x09\x14\x1f\x2a\x35"
- "\x40\x4b\x56\x61\x6c\x77\x82\x8d"
- "\x98\xa3\xae\xb9\xc4\xcf\xda\xe5"
- "\xf0\xfb\x06\x11\x1c\x27\x32\x3d"
- "\x48\x53\x5e\x69\x74\x7f\x8a\x95"
- "\xa0\xab\xb6\xc1\xcc\xd7\xe2\xed"
- "\xf8\x03\x0e\x19\x24\x2f\x3a\x45"
- "\x50\x5b\x66\x71\x7c\x87\x92\x9d"
- "\xa8\xb3\xbe\xc9\xd4\xdf\xea\xf5"
- "\x00\x0d\x1a\x27\x34\x41\x4e\x5b"
- "\x68\x75\x82\x8f\x9c\xa9\xb6\xc3"
- "\xd0\xdd\xea\xf7\x04\x11\x1e\x2b"
- "\x38\x45\x52\x5f\x6c\x79\x86\x93"
- "\xa0\xad\xba\xc7\xd4\xe1\xee\xfb"
- "\x08\x15\x22\x2f\x3c\x49\x56\x63"
- "\x70\x7d\x8a\x97\xa4\xb1\xbe\xcb"
- "\xd8\xe5\xf2\xff\x0c\x19\x26\x33"
- "\x40\x4d\x5a\x67\x74\x81\x8e\x9b"
- "\xa8\xb5\xc2\xcf\xdc\xe9\xf6\x03"
- "\x10\x1d\x2a\x37\x44\x51\x5e\x6b"
- "\x78\x85\x92\x9f\xac\xb9\xc6\xd3"
- "\xe0\xed\xfa\x07\x14\x21\x2e\x3b"
- "\x48\x55\x62\x6f\x7c\x89\x96\xa3"
- "\xb0\xbd\xca\xd7\xe4\xf1\xfe\x0b"
- "\x18\x25\x32\x3f\x4c\x59\x66\x73"
- "\x80\x8d\x9a\xa7\xb4\xc1\xce\xdb"
- "\xe8\xf5\x02\x0f\x1c\x29\x36\x43"
- "\x50\x5d\x6a\x77\x84\x91\x9e\xab"
- "\xb8\xc5\xd2\xdf\xec\xf9\x06\x13"
- "\x20\x2d\x3a\x47\x54\x61\x6e\x7b"
- "\x88\x95\xa2\xaf\xbc\xc9\xd6\xe3"
- "\xf0\xfd\x0a\x17\x24\x31\x3e\x4b"
- "\x58\x65\x72\x7f\x8c\x99\xa6\xb3"
- "\xc0\xcd\xda\xe7\xf4\x01\x0e\x1b"
- "\x28\x35\x42\x4f\x5c\x69\x76\x83"
- "\x90\x9d\xaa\xb7\xc4\xd1\xde\xeb"
- "\xf8\x05\x12\x1f\x2c\x39\x46\x53"
- "\x60\x6d\x7a\x87\x94\xa1\xae\xbb"
- "\xc8\xd5\xe2\xef\xfc\x09\x16\x23"
- "\x30\x3d\x4a\x57\x64\x71\x7e\x8b"
- "\x98\xa5\xb2\xbf\xcc\xd9\xe6\xf3"
- "\x00\x0f\x1e\x2d\x3c\x4b\x5a\x69"
- "\x78\x87\x96\xa5\xb4\xc3\xd2\xe1"
- "\xf0\xff\x0e\x1d\x2c\x3b\x4a\x59"
- "\x68\x77\x86\x95\xa4\xb3\xc2\xd1"
- "\xe0\xef\xfe\x0d\x1c\x2b\x3a\x49"
- "\x58\x67\x76\x85\x94\xa3\xb2\xc1"
- "\xd0\xdf\xee\xfd\x0c\x1b\x2a\x39"
- "\x48\x57\x66\x75\x84\x93\xa2\xb1"
- "\xc0\xcf\xde\xed\xfc\x0b\x1a\x29"
- "\x38\x47\x56\x65\x74\x83\x92\xa1"
- "\xb0\xbf\xce\xdd\xec\xfb\x0a\x19"
- "\x28\x37\x46\x55\x64\x73\x82\x91"
- "\xa0\xaf\xbe\xcd\xdc\xeb\xfa\x09"
- "\x18\x27\x36\x45\x54\x63\x72\x81"
- "\x90\x9f\xae\xbd\xcc\xdb\xea\xf9"
- "\x08\x17\x26\x35\x44\x53\x62\x71"
- "\x80\x8f\x9e\xad\xbc\xcb\xda\xe9"
- "\xf8\x07\x16\x25\x34\x43\x52\x61"
- "\x70\x7f\x8e\x9d\xac\xbb\xca\xd9"
- "\xe8\xf7\x06\x15\x24\x33\x42\x51"
- "\x60\x6f\x7e\x8d\x9c\xab\xba\xc9"
- "\xd8\xe7\xf6\x05\x14\x23\x32\x41"
- "\x50\x5f\x6e\x7d\x8c\x9b\xaa\xb9"
- "\xc8\xd7\xe6\xf5\x04\x13\x22\x31"
- "\x40\x4f\x5e\x6d\x7c\x8b\x9a\xa9"
- "\xb8\xc7\xd6\xe5\xf4\x03\x12\x21"
- "\x30\x3f\x4e\x5d\x6c\x7b\x8a\x99"
- "\xa8\xb7\xc6\xd5\xe4\xf3\x02\x11"
- "\x20\x2f\x3e\x4d\x5c\x6b\x7a\x89"
- "\x98\xa7\xb6\xc5\xd4\xe3\xf2\x01"
- "\x10\x1f\x2e\x3d\x4c\x5b\x6a\x79"
- "\x88\x97\xa6\xb5\xc4\xd3\xe2\xf1"
- "\x00\x11\x22\x33\x44\x55\x66\x77"
- "\x88\x99\xaa\xbb\xcc\xdd\xee\xff"
- "\x10\x21\x32\x43\x54\x65\x76\x87"
- "\x98\xa9\xba\xcb\xdc\xed\xfe\x0f"
- "\x20\x31\x42\x53\x64\x75\x86\x97"
- "\xa8\xb9\xca\xdb\xec\xfd\x0e\x1f"
- "\x30\x41\x52\x63\x74\x85\x96\xa7"
- "\xb8\xc9\xda\xeb\xfc\x0d\x1e\x2f"
- "\x40\x51\x62\x73\x84\x95\xa6\xb7"
- "\xc8\xd9\xea\xfb\x0c\x1d\x2e\x3f"
- "\x50\x61\x72\x83\x94\xa5\xb6\xc7"
- "\xd8\xe9\xfa\x0b\x1c\x2d\x3e\x4f"
- "\x60\x71\x82\x93\xa4\xb5\xc6\xd7"
- "\xe8\xf9\x0a\x1b\x2c\x3d\x4e\x5f"
- "\x70\x81\x92\xa3\xb4\xc5\xd6\xe7"
- "\xf8\x09\x1a\x2b\x3c\x4d\x5e\x6f"
- "\x80\x91\xa2\xb3\xc4\xd5\xe6\xf7"
- "\x08\x19\x2a\x3b\x4c\x5d\x6e\x7f"
- "\x90\xa1\xb2\xc3\xd4\xe5\xf6\x07"
- "\x18\x29\x3a\x4b\x5c\x6d\x7e\x8f"
- "\xa0\xb1\xc2\xd3\xe4\xf5\x06\x17"
- "\x28\x39\x4a\x5b\x6c\x7d\x8e\x9f"
- "\xb0\xc1\xd2\xe3\xf4\x05\x16\x27"
- "\x38\x49\x5a\x6b\x7c\x8d\x9e\xaf"
- "\xc0\xd1\xe2\xf3\x04\x15\x26\x37"
- "\x48\x59\x6a\x7b\x8c\x9d\xae\xbf"
- "\xd0\xe1\xf2\x03\x14\x25\x36\x47"
- "\x58\x69\x7a\x8b\x9c\xad\xbe\xcf"
- "\xe0\xf1\x02\x13\x24\x35\x46\x57"
- "\x68\x79\x8a\x9b\xac\xbd\xce\xdf"
- "\xf0\x01\x12\x23\x34\x45\x56\x67"
- "\x78\x89\x9a\xab\xbc\xcd\xde\xef"
- "\x00\x13\x26\x39\x4c\x5f\x72\x85"
- "\x98\xab\xbe\xd1\xe4\xf7\x0a\x1d"
- "\x30\x43\x56\x69\x7c\x8f\xa2\xb5"
- "\xc8\xdb\xee\x01\x14\x27\x3a\x4d"
- "\x60\x73\x86\x99\xac\xbf\xd2\xe5"
- "\xf8\x0b\x1e\x31\x44\x57\x6a\x7d"
- "\x90\xa3\xb6\xc9\xdc\xef\x02\x15"
- "\x28\x3b\x4e\x61\x74\x87\x9a\xad"
- "\xc0\xd3\xe6\xf9\x0c\x1f\x32\x45"
- "\x58\x6b\x7e\x91\xa4\xb7\xca\xdd"
- "\xf0\x03\x16\x29\x3c\x4f\x62\x75"
- "\x88\x9b\xae\xc1\xd4\xe7\xfa\x0d"
- "\x20\x33\x46\x59\x6c\x7f\x92\xa5"
- "\xb8\xcb\xde\xf1\x04\x17\x2a\x3d"
- "\x50\x63\x76\x89\x9c\xaf\xc2\xd5"
- "\xe8\xfb\x0e\x21\x34\x47\x5a\x6d"
- "\x80\x93\xa6\xb9\xcc\xdf\xf2\x05"
- "\x18\x2b\x3e\x51\x64\x77\x8a\x9d"
- "\xb0\xc3\xd6\xe9\xfc\x0f\x22\x35"
- "\x48\x5b\x6e\x81\x94\xa7\xba\xcd"
- "\xe0\xf3\x06\x19\x2c\x3f\x52\x65"
- "\x78\x8b\x9e\xb1\xc4\xd7\xea\xfd"
- "\x10\x23\x36\x49\x5c\x6f\x82\x95"
- "\xa8\xbb\xce\xe1\xf4\x07\x1a\x2d"
- "\x40\x53\x66\x79\x8c\x9f\xb2\xc5"
- "\xd8\xeb\xfe\x11\x24\x37\x4a\x5d"
- "\x70\x83\x96\xa9\xbc\xcf\xe2\xf5"
- "\x08\x1b\x2e\x41\x54\x67\x7a\x8d"
- "\xa0\xb3\xc6\xd9\xec\xff\x12\x25"
- "\x38\x4b\x5e\x71\x84\x97\xaa\xbd"
- "\xd0\xe3\xf6\x09\x1c\x2f\x42\x55"
- "\x68\x7b\x8e\xa1\xb4\xc7\xda\xed"
- "\x00\x15\x2a\x3f\x54\x69\x7e\x93"
- "\xa8\xbd\xd2\xe7\xfc\x11\x26\x3b"
- "\x50\x65\x7a\x8f\xa4\xb9\xce\xe3"
- "\xf8\x0d\x22\x37\x4c\x61\x76\x8b"
- "\xa0\xb5\xca\xdf\xf4\x09\x1e\x33"
- "\x48\x5d\x72\x87\x9c\xb1\xc6\xdb"
- "\xf0\x05\x1a\x2f\x44\x59\x6e\x83"
- "\x98\xad\xc2\xd7\xec\x01\x16\x2b"
- "\x40\x55\x6a\x7f\x94\xa9\xbe\xd3"
- "\xe8\xfd\x12\x27\x3c\x51\x66\x7b"
- "\x90\xa5\xba\xcf\xe4\xf9\x0e\x23"
- "\x38\x4d\x62\x77\x8c\xa1\xb6\xcb"
- "\xe0\xf5\x0a\x1f\x34\x49\x5e\x73"
- "\x88\x9d\xb2\xc7\xdc\xf1\x06\x1b"
- "\x30\x45\x5a\x6f\x84\x99\xae\xc3"
- "\xd8\xed\x02\x17\x2c\x41\x56\x6b"
- "\x80\x95\xaa\xbf\xd4\xe9\xfe\x13"
- "\x28\x3d\x52\x67\x7c\x91\xa6\xbb"
- "\xd0\xe5\xfa\x0f\x24\x39\x4e\x63"
- "\x78\x8d\xa2\xb7\xcc\xe1\xf6\x0b"
- "\x20\x35\x4a\x5f\x74\x89\x9e\xb3"
- "\xc8\xdd\xf2\x07\x1c\x31\x46\x5b"
- "\x70\x85\x9a\xaf\xc4\xd9\xee\x03"
- "\x18\x2d\x42\x57\x6c\x81\x96\xab"
- "\xc0\xd5\xea\xff\x14\x29\x3e\x53"
- "\x68\x7d\x92\xa7\xbc\xd1\xe6\xfb"
- "\x10\x25\x3a\x4f\x64\x79\x8e\xa3"
- "\xb8\xcd\xe2\xf7\x0c\x21\x36\x4b"
- "\x60\x75\x8a\x9f\xb4\xc9\xde\xf3"
- "\x08\x1d\x32\x47\x5c\x71\x86\x9b"
- "\xb0\xc5\xda\xef\x04\x19\x2e\x43"
- "\x58\x6d\x82\x97\xac\xc1\xd6\xeb"
- "\x00\x17\x2e\x45\x5c\x73\x8a\xa1"
- "\xb8\xcf\xe6\xfd\x14\x2b\x42\x59"
- "\x70\x87\x9e\xb5\xcc\xe3\xfa\x11"
- "\x28\x3f\x56\x6d\x84\x9b\xb2\xc9"
- "\xe0\xf7\x0e\x25\x3c\x53\x6a\x81"
- "\x98\xaf\xc6\xdd\xf4\x0b\x22\x39"
- "\x50\x67\x7e\x95\xac\xc3\xda\xf1"
- "\x08\x1f\x36\x4d\x64\x7b\x92\xa9"
- "\xc0\xd7\xee\x05\x1c\x33\x4a\x61"
- "\x78\x8f\xa6\xbd\xd4\xeb\x02\x19"
- "\x30\x47\x5e\x75\x8c\xa3\xba\xd1"
- "\xe8\xff\x16\x2d\x44\x5b\x72\x89"
- "\xa0\xb7\xce\xe5\xfc\x13\x2a\x41"
- "\x58\x6f\x86\x9d\xb4\xcb\xe2\xf9"
- "\x10\x27\x3e\x55\x6c\x83\x9a\xb1"
- "\xc8\xdf\xf6\x0d\x24\x3b\x52\x69"
- "\x80\x97\xae\xc5\xdc\xf3\x0a\x21"
- "\x38\x4f\x66\x7d\x94\xab\xc2\xd9"
- "\xf0\x07\x1e\x35\x4c\x63\x7a\x91"
- "\xa8\xbf\xd6\xed\x04\x1b\x32\x49"
- "\x60\x77\x8e\xa5\xbc\xd3\xea\x01"
- "\x18\x2f\x46\x5d\x74\x8b\xa2\xb9"
- "\xd0\xe7\xfe\x15\x2c\x43\x5a\x71"
- "\x88\x9f\xb6\xcd\xe4\xfb\x12\x29"
- "\x40\x57\x6e\x85\x9c\xb3\xca\xe1"
- "\xf8\x0f\x26\x3d\x54\x6b\x82\x99"
- "\xb0\xc7\xde\xf5\x0c\x23\x3a\x51"
- "\x68\x7f\x96\xad\xc4\xdb\xf2\x09"
- "\x20\x37\x4e\x65\x7c\x93\xaa\xc1"
- "\xd8\xef\x06\x1d\x34\x4b\x62\x79"
- "\x90\xa7\xbe\xd5\xec\x03\x1a\x31"
- "\x48\x5f\x76\x8d\xa4\xbb\xd2\xe9"
- "\x00\x19\x32\x4b\x64\x7d\x96\xaf"
- "\xc8\xe1\xfa\x13\x2c\x45\x5e\x77"
- "\x90\xa9\xc2\xdb\xf4\x0d\x26\x3f"
- "\x58\x71\x8a\xa3\xbc\xd5\xee\x07"
- "\x20\x39\x52\x6b\x84\x9d\xb6\xcf"
- "\xe8\x01\x1a\x33\x4c\x65\x7e\x97"
- "\xb0\xc9\xe2\xfb\x14\x2d\x46\x5f"
- "\x78\x91\xaa\xc3\xdc\xf5\x0e\x27"
- "\x40\x59\x72\x8b\xa4\xbd\xd6\xef"
- "\x08\x21\x3a\x53\x6c\x85\x9e\xb7"
- "\xd0\xe9\x02\x1b\x34\x4d\x66\x7f"
- "\x98\xb1\xca\xe3\xfc\x15\x2e\x47"
- "\x60\x79\x92\xab\xc4\xdd\xf6\x0f"
- "\x28\x41\x5a\x73\x8c\xa5\xbe\xd7"
- "\xf0\x09\x22\x3b\x54\x6d\x86\x9f"
- "\xb8\xd1\xea\x03\x1c\x35\x4e\x67"
- "\x80\x99\xb2\xcb\xe4\xfd\x16\x2f"
- "\x48\x61\x7a\x93\xac\xc5\xde\xf7"
- "\x10\x29\x42\x5b\x74\x8d\xa6\xbf"
- "\xd8\xf1\x0a\x23\x3c\x55\x6e\x87"
- "\xa0\xb9\xd2\xeb\x04\x1d\x36\x4f"
- "\x68\x81\x9a\xb3\xcc\xe5\xfe\x17"
- "\x30\x49\x62\x7b\x94\xad\xc6\xdf"
- "\xf8\x11\x2a\x43\x5c\x75\x8e\xa7"
- "\xc0\xd9\xf2\x0b\x24\x3d\x56\x6f"
- "\x88\xa1\xba\xd3\xec\x05\x1e\x37"
- "\x50\x69\x82\x9b\xb4\xcd\xe6\xff"
- "\x18\x31\x4a\x63\x7c\x95\xae\xc7"
- "\xe0\xf9\x12\x2b\x44\x5d\x76\x8f"
- "\xa8\xc1\xda\xf3\x0c\x25\x3e\x57"
- "\x70\x89\xa2\xbb\xd4\xed\x06\x1f"
- "\x38\x51\x6a\x83\x9c\xb5\xce\xe7"
- "\x00\x1b\x36\x51\x6c\x87\xa2\xbd"
- "\xd8\xf3\x0e\x29\x44\x5f\x7a\x95"
- "\xb0\xcb\xe6\x01\x1c\x37\x52\x6d"
- "\x88\xa3\xbe\xd9\xf4\x0f\x2a\x45"
- "\x60\x7b\x96\xb1\xcc\xe7\x02\x1d"
- "\x38\x53\x6e\x89\xa4\xbf\xda\xf5"
- "\x10\x2b\x46\x61\x7c\x97\xb2\xcd"
- "\xe8\x03\x1e\x39\x54\x6f\x8a\xa5"
- "\xc0\xdb\xf6\x11\x2c\x47\x62\x7d"
- "\x98\xb3\xce\xe9\x04\x1f\x3a\x55"
- "\x70\x8b\xa6\xc1\xdc\xf7\x12\x2d"
- "\x48\x63\x7e\x99\xb4\xcf\xea\x05"
- "\x20\x3b\x56\x71\x8c\xa7\xc2\xdd"
- "\xf8\x13\x2e\x49\x64\x7f\x9a\xb5"
- "\xd0\xeb\x06\x21\x3c\x57\x72\x8d"
- "\xa8\xc3\xde\xf9\x14\x2f\x4a\x65"
- "\x80\x9b\xb6\xd1\xec\x07\x22\x3d"
- "\x58\x73\x8e\xa9\xc4\xdf\xfa\x15"
- "\x30\x4b\x66\x81\x9c\xb7\xd2\xed"
- "\x08\x23\x3e\x59\x74\x8f\xaa\xc5"
- "\xe0\xfb\x16\x31\x4c\x67\x82\x9d"
- "\xb8\xd3\xee\x09\x24\x3f\x5a\x75"
- "\x90\xab\xc6\xe1\xfc\x17\x32\x4d"
- "\x68\x83\x9e\xb9\xd4\xef\x0a\x25"
- "\x40\x5b\x76\x91\xac\xc7\xe2\xfd"
- "\x18\x33\x4e\x69\x84\x9f\xba\xd5"
- "\xf0\x0b\x26\x41\x5c\x77\x92\xad"
- "\xc8\xe3\xfe\x19\x34\x4f\x6a\x85"
- "\xa0\xbb\xd6\xf1\x0c\x27\x42\x5d"
- "\x78\x93\xae\xc9\xe4\xff\x1a\x35"
- "\x50\x6b\x86\xa1\xbc\xd7\xf2\x0d"
- "\x28\x43\x5e\x79\x94\xaf\xca\xe5"
- "\x00\x1d\x3a\x57\x74\x91\xae\xcb"
- "\xe8\x05\x22\x3f\x5c\x79\x96\xb3"
- "\xd0\xed\x0a\x27\x44\x61\x7e\x9b"
- "\xb8\xd5\xf2\x0f\x2c\x49\x66\x83"
- "\xa0\xbd\xda\xf7\x14\x31\x4e\x6b"
- "\x88\xa5\xc2\xdf\xfc\x19\x36\x53"
- "\x70\x8d\xaa\xc7\xe4\x01\x1e\x3b"
- "\x58\x75\x92\xaf\xcc\xe9\x06\x23"
- "\x40\x5d\x7a\x97\xb4\xd1\xee\x0b"
- "\x28\x45\x62\x7f\x9c\xb9\xd6\xf3"
- "\x10\x2d\x4a\x67\x84\xa1\xbe\xdb"
- "\xf8\x15\x32\x4f\x6c\x89\xa6\xc3"
- "\xe0\xfd\x1a\x37\x54\x71\x8e\xab"
- "\xc8\xe5\x02\x1f\x3c\x59\x76\x93"
- "\xb0\xcd\xea\x07\x24\x41\x5e\x7b"
- "\x98\xb5\xd2\xef\x0c\x29\x46\x63"
- "\x80\x9d\xba\xd7\xf4\x11\x2e\x4b"
- "\x68\x85\xa2\xbf\xdc\xf9\x16\x33"
- "\x50\x6d\x8a\xa7\xc4\xe1\xfe\x1b"
- "\x38\x55\x72\x8f\xac\xc9\xe6\x03"
- "\x20\x3d\x5a\x77\x94\xb1\xce\xeb"
- "\x08\x25\x42\x5f\x7c\x99\xb6\xd3"
- "\xf0\x0d\x2a\x47\x64\x81\x9e\xbb"
- "\xd8\xf5\x12\x2f\x4c\x69\x86\xa3"
- "\xc0\xdd\xfa\x17\x34\x51\x6e\x8b"
- "\xa8\xc5\xe2\xff\x1c\x39\x56\x73"
- "\x90\xad\xca\xe7\x04\x21\x3e\x5b"
- "\x78\x95\xb2\xcf\xec\x09\x26\x43"
- "\x60\x7d\x9a\xb7\xd4\xf1\x0e\x2b"
- "\x48\x65\x82\x9f\xbc\xd9\xf6\x13"
- "\x30\x4d\x6a\x87\xa4\xc1\xde\xfb"
- "\x18\x35\x52\x6f\x8c\xa9\xc6\xe3"
- "\x00\x1f\x3e\x5d\x7c\x9b\xba\xd9"
- "\xf8\x17\x36\x55\x74\x93\xb2\xd1"
- "\xf0\x0f\x2e\x4d\x6c\x8b\xaa\xc9"
- "\xe8\x07\x26\x45\x64\x83\xa2\xc1"
- "\xe0\xff\x1e\x3d\x5c\x7b\x9a\xb9"
- "\xd8\xf7\x16\x35\x54\x73\x92\xb1"
- "\xd0\xef\x0e\x2d\x4c\x6b\x8a\xa9"
- "\xc8\xe7\x06\x25\x44\x63\x82\xa1"
- "\xc0\xdf\xfe\x1d\x3c\x5b\x7a\x99"
- "\xb8\xd7\xf6\x15\x34\x53\x72\x91"
- "\xb0\xcf\xee\x0d\x2c\x4b\x6a\x89"
- "\xa8\xc7\xe6\x05\x24\x43\x62\x81"
- "\xa0\xbf\xde\xfd\x1c\x3b\x5a\x79"
- "\x98\xb7\xd6\xf5\x14\x33\x52\x71"
- "\x90\xaf\xce\xed\x0c\x2b\x4a\x69"
- "\x88\xa7\xc6\xe5\x04\x23\x42\x61"
- "\x80\x9f\xbe\xdd\xfc\x1b\x3a\x59"
- "\x78\x97\xb6\xd5\xf4\x13\x32\x51"
- "\x70\x8f\xae\xcd\xec\x0b\x2a\x49"
- "\x68\x87\xa6\xc5\xe4\x03\x22\x41"
- "\x60\x7f\x9e\xbd\xdc\xfb\x1a\x39"
- "\x58\x77\x96\xb5\xd4\xf3\x12\x31"
- "\x50\x6f\x8e\xad\xcc\xeb\x0a\x29"
- "\x48\x67\x86\xa5\xc4\xe3\x02\x21"
- "\x40\x5f\x7e\x9d\xbc\xdb\xfa\x19"
- "\x38\x57\x76\x95\xb4\xd3\xf2\x11"
- "\x30\x4f\x6e\x8d\xac\xcb\xea\x09"
- "\x28\x47\x66\x85\xa4\xc3\xe2\x01"
- "\x20\x3f\x5e\x7d\x9c\xbb\xda\xf9"
- "\x18\x37\x56\x75\x94\xb3\xd2\xf1"
- "\x10\x2f\x4e\x6d\x8c\xab\xca\xe9"
- "\x08\x27\x46\x65\x84\xa3\xc2\xe1"
- "\x00\x21\x42\x63",
- .ilen = 4100,
- .result =
- "\xf0\x5c\x74\xad\x4e\xbc\x99\xe2"
- "\xae\xff\x91\x3a\x44\xcf\x38\x32"
- "\x1e\xad\xa7\xcd\xa1\x39\x95\xaa"
- "\x10\xb1\xb3\x2e\x04\x31\x8f\x86"
- "\xf2\x62\x74\x70\x0c\xa4\x46\x08"
- "\xa8\xb7\x99\xa8\xe9\xd2\x73\x79"
- "\x7e\x6e\xd4\x8f\x1e\xc7\x8e\x31"
- "\x0b\xfa\x4b\xce\xfd\xf3\x57\x71"
- "\xe9\x46\x03\xa5\x3d\x34\x00\xe2"
- "\x18\xff\x75\x6d\x06\x2d\x00\xab"
- "\xb9\x3e\x6c\x59\xc5\x84\x06\xb5"
- "\x8b\xd0\x89\x9c\x4a\x79\x16\xc6"
- "\x3d\x74\x54\xfa\x44\xcd\x23\x26"
- "\x5c\xcf\x7e\x28\x92\x32\xbf\xdf"
- "\xa7\x20\x3c\x74\x58\x2a\x9a\xde"
- "\x61\x00\x1c\x4f\xff\x59\xc4\x22"
- "\xac\x3c\xd0\xe8\x6c\xf9\x97\x1b"
- "\x58\x9b\xad\x71\xe8\xa9\xb5\x0d"
- "\xee\x2f\x04\x1f\x7f\xbc\x99\xee"
- "\x84\xff\x42\x60\xdc\x3a\x18\xa5"
- "\x81\xf9\xef\xdc\x7a\x0f\x65\x41"
- "\x2f\xa3\xd3\xf9\xc2\xcb\xc0\x4d"
- "\x8f\xd3\x76\x96\xad\x49\x6d\x38"
- "\x3d\x39\x0b\x6c\x80\xb7\x54\x69"
- "\xf0\x2c\x90\x02\x29\x0d\x1c\x12"
- "\xad\x55\xc3\x8b\x68\xd9\xcc\xb3"
- "\xb2\x64\x33\x90\x5e\xca\x4b\xe2"
- "\xfb\x75\xdc\x63\xf7\x9f\x82\x74"
- "\xf0\xc9\xaa\x7f\xe9\x2a\x9b\x33"
- "\xbc\x88\x00\x7f\xca\xb2\x1f\x14"
- "\xdb\xc5\x8e\x7b\x11\x3c\x3e\x08"
- "\xf3\x83\xe8\xe0\x94\x86\x2e\x92"
- "\x78\x6b\x01\xc9\xc7\x83\xba\x21"
- "\x6a\x25\x15\x33\x4e\x45\x08\xec"
- "\x35\xdb\xe0\x6e\x31\x51\x79\xa9"
- "\x42\x44\x65\xc1\xa0\xf1\xf9\x2a"
- "\x70\xd5\xb6\xc6\xc1\x8c\x39\xfc"
- "\x25\xa6\x55\xd9\xdd\x2d\x4c\xec"
- "\x49\xc6\xeb\x0e\xa8\x25\x2a\x16"
- "\x1b\x66\x84\xda\xe2\x92\xe5\xc0"
- "\xc8\x53\x07\xaf\x80\x84\xec\xfd"
- "\xcd\xd1\x6e\xcd\x6f\x6a\xf5\x36"
- "\xc5\x15\xe5\x25\x7d\x77\xd1\x1a"
- "\x93\x36\xa9\xcf\x7c\xa4\x54\x4a"
- "\x06\x51\x48\x4e\xf6\x59\x87\xd2"
- "\x04\x02\xef\xd3\x44\xde\x76\x31"
- "\xb3\x34\x17\x1b\x9d\x66\x11\x9f"
- "\x1e\xcc\x17\xe9\xc7\x3c\x1b\xe7"
- "\xcb\x50\x08\xfc\xdc\x2b\x24\xdb"
- "\x65\x83\xd0\x3b\xe3\x30\xea\x94"
- "\x6c\xe7\xe8\x35\x32\xc7\xdb\x64"
- "\xb4\x01\xab\x36\x2c\x77\x13\xaf"
- "\xf8\x2b\x88\x3f\x54\x39\xc4\x44"
- "\xfe\xef\x6f\x68\x34\xbe\x0f\x05"
- "\x16\x6d\xf6\x0a\x30\xe7\xe3\xed"
- "\xc4\xde\x3c\x1b\x13\xd8\xdb\xfe"
- "\x41\x62\xe5\x28\xd4\x8d\xa3\xc7"
- "\x93\x97\xc6\x48\x45\x1d\x9f\x83"
- "\xdf\x4b\x40\x3e\x42\x25\x87\x80"
- "\x4c\x7d\xa8\xd4\x98\x23\x95\x75"
- "\x41\x8c\xda\x41\x9b\xd4\xa7\x06"
- "\xb5\xf1\x71\x09\x53\xbe\xca\xbf"
- "\x32\x03\xed\xf0\x50\x1c\x56\x39"
- "\x5b\xa4\x75\x18\xf7\x9b\x58\xef"
- "\x53\xfc\x2a\x38\x23\x15\x75\xcd"
- "\x45\xe5\x5a\x82\x55\xba\x21\xfa"
- "\xd4\xbd\xc6\x94\x7c\xc5\x80\x12"
- "\xf7\x4b\x32\xc4\x9a\x82\xd8\x28"
- "\x8f\xd9\xc2\x0f\x60\x03\xbe\x5e"
- "\x21\xd6\x5f\x58\xbf\x5c\xb1\x32"
- "\x82\x8d\xa9\xe5\xf2\x66\x1a\xc0"
- "\xa0\xbc\x58\x2f\x71\xf5\x2f\xed"
- "\xd1\x26\xb9\xd8\x49\x5a\x07\x19"
- "\x01\x7c\x59\xb0\xf8\xa4\xb7\xd3"
- "\x7b\x1a\x8c\x38\xf4\x50\xa4\x59"
- "\xb0\xcc\x41\x0b\x88\x7f\xe5\x31"
- "\xb3\x42\xba\xa2\x7e\xd4\x32\x71"
- "\x45\x87\x48\xa9\xc2\xf2\x89\xb3"
- "\xe4\xa7\x7e\x52\x15\x61\xfa\xfe"
- "\xc9\xdd\x81\xeb\x13\xab\xab\xc3"
- "\x98\x59\xd8\x16\x3d\x14\x7a\x1c"
- "\x3c\x41\x9a\x16\x16\x9b\xd2\xd2"
- "\x69\x3a\x29\x23\xac\x86\x32\xa5"
- "\x48\x9c\x9e\xf3\x47\x77\x81\x70"
- "\x24\xe8\x85\xd2\xf5\xb5\xfa\xff"
- "\x59\x6a\xd3\x50\x59\x43\x59\xde"
- "\xd9\xf1\x55\xa5\x0c\xc3\x1a\x1a"
- "\x18\x34\x0d\x1a\x63\x33\xed\x10"
- "\xe0\x1d\x2a\x18\xd2\xc0\x54\xa8"
- "\xca\xb5\x9a\xd3\xdd\xca\x45\x84"
- "\x50\xe7\x0f\xfe\xa4\x99\x5a\xbe"
- "\x43\x2d\x9a\xcb\x92\x3f\x5a\x1d"
- "\x85\xd8\xc9\xdf\x68\xc9\x12\x80"
- "\x56\x0c\xdc\x00\xdc\x3a\x7d\x9d"
- "\xa3\xa2\xe8\x4d\xbf\xf9\x70\xa0"
- "\xa4\x13\x4f\x6b\xaf\x0a\x89\x7f"
- "\xda\xf0\xbf\x9b\xc8\x1d\xe5\xf8"
- "\x2e\x8b\x07\xb5\x73\x1b\xcc\xa2"
- "\xa6\xad\x30\xbc\x78\x3c\x5b\x10"
- "\xfa\x5e\x62\x2d\x9e\x64\xb3\x33"
- "\xce\xf9\x1f\x86\xe7\x8b\xa2\xb8"
- "\xe8\x99\x57\x8c\x11\xed\x66\xd9"
- "\x3c\x72\xb9\xc3\xe6\x4e\x17\x3a"
- "\x6a\xcb\x42\x24\x06\xed\x3e\x4e"
- "\xa3\xe8\x6a\x94\xda\x0d\x4e\xd5"
- "\x14\x19\xcf\xb6\x26\xd8\x2e\xcc"
- "\x64\x76\x38\x49\x4d\xfe\x30\x6d"
- "\xe4\xc8\x8c\x7b\xc4\xe0\x35\xba"
- "\x22\x6e\x76\xe1\x1a\xf2\x53\xc3"
- "\x28\xa2\x82\x1f\x61\x69\xad\xc1"
- "\x7b\x28\x4b\x1e\x6c\x85\x95\x9b"
- "\x51\xb5\x17\x7f\x12\x69\x8c\x24"
- "\xd5\xc7\x5a\x5a\x11\x54\xff\x5a"
- "\xf7\x16\xc3\x91\xa6\xf0\xdc\x0a"
- "\xb6\xa7\x4a\x0d\x7a\x58\xfe\xa5"
- "\xf5\xcb\x8f\x7b\x0e\xea\x57\xe7"
- "\xbd\x79\xd6\x1c\x88\x23\x6c\xf2"
- "\x4d\x29\x77\x53\x35\x6a\x00\x8d"
- "\xcd\xa3\x58\xbe\x77\x99\x18\xf8"
- "\xe6\xe1\x8f\xe9\x37\x8f\xe3\xe2"
- "\x5a\x8a\x93\x25\xaf\xf3\x78\x80"
- "\xbe\xa6\x1b\xc6\xac\x8b\x1c\x91"
- "\x58\xe1\x9f\x89\x35\x9d\x1d\x21"
- "\x29\x9f\xf4\x99\x02\x27\x0f\xa8"
- "\x4f\x79\x94\x2b\x33\x2c\xda\xa2"
- "\x26\x39\x83\x94\xef\x27\xd8\x53"
- "\x8f\x66\x0d\xe4\x41\x7d\x34\xcd"
- "\x43\x7c\x95\x0a\x53\xef\x66\xda"
- "\x7e\x9b\xf3\x93\xaf\xd0\x73\x71"
- "\xba\x40\x9b\x74\xf8\xd7\xd7\x41"
- "\x6d\xaf\x72\x9c\x8d\x21\x87\x3c"
- "\xfd\x0a\x90\xa9\x47\x96\x9e\xd3"
- "\x88\xee\x73\xcf\x66\x2f\x52\x56"
- "\x6d\xa9\x80\x4c\xe2\x6f\x62\x88"
- "\x3f\x0e\x54\x17\x48\x80\x5d\xd3"
- "\xc3\xda\x25\x3d\xa1\xc8\xcb\x9f"
- "\x9b\x70\xb3\xa1\xeb\x04\x52\xa1"
- "\xf2\x22\x0f\xfc\xc8\x18\xfa\xf9"
- "\x85\x9c\xf1\xac\xeb\x0c\x02\x46"
- "\x75\xd2\xf5\x2c\xe3\xd2\x59\x94"
- "\x12\xf3\x3c\xfc\xd7\x92\xfa\x36"
- "\xba\x61\x34\x38\x7c\xda\x48\x3e"
- "\x08\xc9\x39\x23\x5e\x02\x2c\x1a"
- "\x18\x7e\xb4\xd9\xfd\x9e\x40\x02"
- "\xb1\x33\x37\x32\xe7\xde\xd6\xd0"
- "\x7c\x58\x65\x4b\xf8\x34\x27\x9c"
- "\x44\xb4\xbd\xe9\xe9\x4c\x78\x7d"
- "\x4b\x9f\xce\xb1\xcd\x47\xa5\x37"
- "\xe5\x6d\xbd\xb9\x43\x94\x0a\xd4"
- "\xd6\xf9\x04\x5f\xb5\x66\x6c\x1a"
- "\x35\x12\xe3\x36\x28\x27\x36\x58"
- "\x01\x2b\x79\xe4\xba\x6d\x10\x7d"
- "\x65\xdf\x84\x95\xf4\xd5\xb6\x8f"
- "\x2b\x9f\x96\x00\x86\x60\xf0\x21"
- "\x76\xa8\x6a\x8c\x28\x1c\xb3\x6b"
- "\x97\xd7\xb6\x53\x2a\xcc\xab\x40"
- "\x9d\x62\x79\x58\x52\xe6\x65\xb7"
- "\xab\x55\x67\x9c\x89\x7c\x03\xb0"
- "\x73\x59\xc5\x81\xf5\x18\x17\x5c"
- "\x89\xf3\x78\x35\x44\x62\x78\x72"
- "\xd0\x96\xeb\x31\xe7\x87\x77\x14"
- "\x99\x51\xf2\x59\x26\x9e\xb5\xa6"
- "\x45\xfe\x6e\xbd\x07\x4c\x94\x5a"
- "\xa5\x7d\xfc\xf1\x2b\x77\xe2\xfe"
- "\x17\xd4\x84\xa0\xac\xb5\xc7\xda"
- "\xa9\x1a\xb6\xf3\x74\x11\xb4\x9d"
- "\xfb\x79\x2e\x04\x2d\x50\x28\x83"
- "\xbf\xc6\x52\xd3\x34\xd6\xe8\x7a"
- "\xb6\xea\xe7\xa8\x6c\x15\x1e\x2c"
- "\x57\xbc\x48\x4e\x5f\x5c\xb6\x92"
- "\xd2\x49\x77\x81\x6d\x90\x70\xae"
- "\x98\xa1\x03\x0d\x6b\xb9\x77\x14"
- "\xf1\x4e\x23\xd3\xf8\x68\xbd\xc2"
- "\xfe\x04\xb7\x5c\xc5\x17\x60\x8f"
- "\x65\x54\xa4\x7a\x42\xdc\x18\x0d"
- "\xb5\xcf\x0f\xd3\xc7\x91\x66\x1b"
- "\x45\x42\x27\x75\x50\xe5\xee\xb8"
- "\x7f\x33\x2c\xba\x4a\x92\x4d\x2c"
- "\x3c\xe3\x0d\x80\x01\xba\x0d\x29"
- "\xd8\x3c\xe9\x13\x16\x57\xe6\xea"
- "\x94\x52\xe7\x00\x4d\x30\xb0\x0f"
- "\x35\xb8\xb8\xa7\xb1\xb5\x3b\x44"
- "\xe1\x2f\xfd\x88\xed\x43\xe7\x52"
- "\x10\x93\xb3\x8a\x30\x6b\x0a\xf7"
- "\x23\xc6\x50\x9d\x4a\xb0\xde\xc3"
- "\xdc\x9b\x2f\x01\x56\x36\x09\xc5"
- "\x2f\x6b\xfe\xf1\xd8\x27\x45\x03"
- "\x30\x5e\x5c\x5b\xb4\x62\x0e\x1a"
- "\xa9\x21\x2b\x92\x94\x87\x62\x57"
- "\x4c\x10\x74\x1a\xf1\x0a\xc5\x84"
- "\x3b\x9e\x72\x02\xd7\xcc\x09\x56"
- "\xbd\x54\xc1\xf0\xc3\xe3\xb3\xf8"
- "\xd2\x0d\x61\xcb\xef\xce\x0d\x05"
- "\xb0\x98\xd9\x8e\x4f\xf9\xbc\x93"
- "\xa6\xea\xc8\xcf\x10\x53\x4b\xf1"
- "\xec\xfc\x89\xf9\x64\xb0\x22\xbf"
- "\x9e\x55\x46\x9f\x7c\x50\x8e\x84"
- "\x54\x20\x98\xd7\x6c\x40\x1e\xdb"
- "\x69\x34\x78\x61\x24\x21\x9c\x8a"
- "\xb3\x62\x31\x8b\x6e\xf5\x2a\x35"
- "\x86\x13\xb1\x6c\x64\x2e\x41\xa5"
- "\x05\xf2\x42\xba\xd2\x3a\x0d\x8e"
- "\x8a\x59\x94\x3c\xcf\x36\x27\x82"
- "\xc2\x45\xee\x58\xcd\x88\xb4\xec"
- "\xde\xb2\x96\x0a\xaf\x38\x6f\x88"
- "\xd7\xd8\xe1\xdf\xb9\x96\xa9\x0a"
- "\xb1\x95\x28\x86\x20\xe9\x17\x49"
- "\xa2\x29\x38\xaa\xa5\xe9\x6e\xf1"
- "\x19\x27\xc0\xd5\x2a\x22\xc3\x0b"
- "\xdb\x7c\x73\x10\xb9\xba\x89\x76"
- "\x54\xae\x7d\x71\xb3\x93\xf6\x32"
- "\xe6\x47\x43\x55\xac\xa0\x0d\xc2"
- "\x93\x27\x4a\x8e\x0e\x74\x15\xc7"
- "\x0b\x85\xd9\x0c\xa9\x30\x7a\x3e"
- "\xea\x8f\x85\x6d\x3a\x12\x4f\x72"
- "\x69\x58\x7a\x80\xbb\xb5\x97\xf3"
- "\xcf\x70\xd2\x5d\xdd\x4d\x21\x79"
- "\x54\x4d\xe4\x05\xe8\xbd\xc2\x62"
- "\xb1\x3b\x77\x1c\xd6\x5c\xf3\xa0"
- "\x79\x00\xa8\x6c\x29\xd9\x18\x24"
- "\x36\xa2\x46\xc0\x96\x65\x7f\xbd"
- "\x2a\xed\x36\x16\x0c\xaa\x9f\xf4"
- "\xc5\xb4\xe2\x12\xed\x69\xed\x4f"
- "\x26\x2c\x39\x52\x89\x98\xe7\x2c"
- "\x99\xa4\x9e\xa3\x9b\x99\x46\x7a"
- "\x3a\xdc\xa8\x59\xa3\xdb\xc3\x3b"
- "\x95\x0d\x3b\x09\x6e\xee\x83\x5d"
- "\x32\x4d\xed\xab\xfa\x98\x14\x4e"
- "\xc3\x15\x45\x53\x61\xc4\x93\xbd"
- "\x90\xf4\x99\x95\x4c\xe6\x76\x92"
- "\x29\x90\x46\x30\x92\x69\x7d\x13"
- "\xf2\xa5\xcd\x69\x49\x44\xb2\x0f"
- "\x63\x40\x36\x5f\x09\xe2\x78\xf8"
- "\x91\xe3\xe2\xfa\x10\xf7\xc8\x24"
- "\xa8\x89\x32\x5c\x37\x25\x1d\xb2"
- "\xea\x17\x8a\x0a\xa9\x64\xc3\x7c"
- "\x3c\x7c\xbd\xc6\x79\x34\xe7\xe2"
- "\x85\x8e\xbf\xf8\xde\x92\xa0\xae"
- "\x20\xc4\xf6\xbb\x1f\x38\x19\x0e"
- "\xe8\x79\x9c\xa1\x23\xe9\x54\x7e"
- "\x37\x2f\xe2\x94\x32\xaf\xa0\x23"
- "\x49\xe4\xc0\xb3\xac\x00\x8f\x36"
- "\x05\xc4\xa6\x96\xec\x05\x98\x4f"
- "\x96\x67\x57\x1f\x20\x86\x1b\x2d"
- "\x69\xe4\x29\x93\x66\x5f\xaf\x6b"
- "\x88\x26\x2c\x67\x02\x4b\x52\xd0"
- "\x83\x7a\x43\x1f\xc0\x71\x15\x25"
- "\x77\x65\x08\x60\x11\x76\x4c\x8d"
- "\xed\xa9\x27\xc6\xb1\x2a\x2c\x6a"
- "\x4a\x97\xf5\xc6\xb7\x70\x42\xd3"
- "\x03\xd1\x24\x95\xec\x6d\xab\x38"
- "\x72\xce\xe2\x8b\x33\xd7\x51\x09"
- "\xdc\x45\xe0\x09\x96\x32\xf3\xc4"
- "\x84\xdc\x73\x73\x2d\x1b\x11\x98"
- "\xc5\x0e\x69\x28\x94\xc7\xb5\x4d"
- "\xc8\x8a\xd0\xaa\x13\x2e\x18\x74"
- "\xdd\xd1\x1e\xf3\x90\xe8\xfc\x9a"
- "\x72\x4a\x0e\xd1\xe4\xfb\x0d\x96"
- "\xd1\x0c\x79\x85\x1b\x1c\xfe\xe1"
- "\x62\x8f\x7a\x73\x32\xab\xc8\x18"
- "\x69\xe3\x34\x30\xdf\x13\xa6\xe5"
- "\xe8\x0e\x67\x7f\x81\x11\xb4\x60"
- "\xc7\xbd\x79\x65\x50\xdc\xc4\x5b"
- "\xde\x39\xa4\x01\x72\x63\xf3\xd1"
- "\x64\x4e\xdf\xfc\x27\x92\x37\x0d"
- "\x57\xcd\x11\x4f\x11\x04\x8e\x1d"
- "\x16\xf7\xcd\x92\x9a\x99\x30\x14"
- "\xf1\x7c\x67\x1b\x1f\x41\x0b\xe8"
- "\x32\xe8\xb8\xc1\x4f\x54\x86\x4f"
- "\xe5\x79\x81\x73\xcd\x43\x59\x68"
- "\x73\x02\x3b\x78\x21\x72\x43\x00"
- "\x49\x17\xf7\x00\xaf\x68\x24\x53"
- "\x05\x0a\xc3\x33\xe0\x33\x3f\x69"
- "\xd2\x84\x2f\x0b\xed\xde\x04\xf4"
- "\x11\x94\x13\x69\x51\x09\x28\xde"
- "\x57\x5c\xef\xdc\x9a\x49\x1c\x17"
- "\x97\xf3\x96\xc1\x7f\x5d\x2e\x7d"
- "\x55\xb8\xb3\x02\x09\xb3\x1f\xe7"
- "\xc9\x8d\xa3\x36\x34\x8a\x77\x13"
- "\x30\x63\x4c\xa5\xcd\xc3\xe0\x7e"
- "\x05\xa1\x7b\x0c\xcb\x74\x47\x31"
- "\x62\x03\x43\xf1\x87\xb4\xb0\x85"
- "\x87\x8e\x4b\x25\xc7\xcf\xae\x4b"
- "\x36\x46\x3e\x62\xbc\x6f\xeb\x5f"
- "\x73\xac\xe6\x07\xee\xc1\xa1\xd6"
- "\xc4\xab\xc9\xd6\x89\x45\xe1\xf1"
- "\x04\x4e\x1a\x6f\xbb\x4f\x3a\xa3"
- "\xa0\xcb\xa3\x0a\xd8\x71\x35\x55"
- "\xe4\xbc\x2e\x04\x06\xe6\xff\x5b"
- "\x1c\xc0\x11\x7c\xc5\x17\xf3\x38"
- "\xcf\xe9\xba\x0f\x0e\xef\x02\xc2"
- "\x8d\xc6\xbc\x4b\x67\x20\x95\xd7"
- "\x2c\x45\x5b\x86\x44\x8c\x6f\x2e"
- "\x7e\x9f\x1c\x77\xba\x6b\x0e\xa3"
- "\x69\xdc\xab\x24\x57\x60\x47\xc1"
- "\xd1\xa5\x9d\x23\xe6\xb1\x37\xfe"
- "\x93\xd2\x4c\x46\xf9\x0c\xc6\xfb"
- "\xd6\x9d\x99\x69\xab\x7a\x07\x0c"
- "\x65\xe7\xc4\x08\x96\xe2\xa5\x01"
- "\x3f\x46\x07\x05\x7e\xe8\x9a\x90"
- "\x50\xdc\xe9\x7a\xea\xa1\x39\x6e"
- "\x66\xe4\x6f\xa5\x5f\xb2\xd9\x5b"
- "\xf5\xdb\x2a\x32\xf0\x11\x6f\x7c"
- "\x26\x10\x8f\x3d\x80\xe9\x58\xf7"
- "\xe0\xa8\x57\xf8\xdb\x0e\xce\x99"
- "\x63\x19\x3d\xd5\xec\x1b\x77\x69"
- "\x98\xf6\xe4\x5f\x67\x17\x4b\x09"
- "\x85\x62\x82\x70\x18\xe2\x9a\x78"
- "\xe2\x62\xbd\xb4\xf1\x42\xc6\xfb"
- "\x08\xd0\xbd\xeb\x4e\x09\xf2\xc8"
- "\x1e\xdc\x3d\x32\x21\x56\x9c\x4f"
- "\x35\xf3\x61\x06\x72\x84\xc4\x32"
- "\xf2\xf1\xfa\x0b\x2f\xc3\xdb\x02"
- "\x04\xc2\xde\x57\x64\x60\x8d\xcf"
- "\xcb\x86\x5d\x97\x3e\xb1\x9c\x01"
- "\xd6\x28\x8f\x99\xbc\x46\xeb\x05"
- "\xaf\x7e\xb8\x21\x2a\x56\x85\x1c"
- "\xb3\x71\xa0\xde\xca\x96\xf1\x78"
- "\x49\xa2\x99\x81\x80\x5c\x01\xf5"
- "\xa0\xa2\x56\x63\xe2\x70\x07\xa5"
- "\x95\xd6\x85\xeb\x36\x9e\xa9\x51"
- "\x66\x56\x5f\x1d\x02\x19\xe2\xf6"
- "\x4f\x73\x38\x09\x75\x64\x48\xe0"
- "\xf1\x7e\x0e\xe8\x9d\xf9\xed\x94"
- "\xfe\x16\x26\x62\x49\x74\xf4\xb0"
- "\xd4\xa9\x6c\xb0\xfd\x53\xe9\x81"
- "\xe0\x7a\xbf\xcf\xb5\xc4\x01\x81"
- "\x79\x99\x77\x01\x3b\xe9\xa2\xb6"
- "\xe6\x6a\x8a\x9e\x56\x1c\x8d\x1e"
- "\x8f\x06\x55\x2c\x6c\xdc\x92\x87"
- "\x64\x3b\x4b\x19\xa1\x13\x64\x1d"
- "\x4a\xe9\xc0\x00\xb8\x95\xef\x6b"
- "\x1a\x86\x6d\x37\x52\x02\xc2\xe0"
- "\xc8\xbb\x42\x0c\x02\x21\x4a\xc9"
- "\xef\xa0\x54\xe4\x5e\x16\x53\x81"
- "\x70\x62\x10\xaf\xde\xb8\xb5\xd3"
- "\xe8\x5e\x6c\xc3\x8a\x3e\x18\x07"
- "\xf2\x2f\x7d\xa7\xe1\x3d\x4e\xb4"
- "\x26\xa7\xa3\x93\x86\xb2\x04\x1e"
- "\x53\x5d\x86\xd6\xde\x65\xca\xe3"
- "\x4e\xc1\xcf\xef\xc8\x70\x1b\x83"
- "\x13\xdd\x18\x8b\x0d\x76\xd2\xf6"
- "\x37\x7a\x93\x7a\x50\x11\x9f\x96"
- "\x86\x25\xfd\xac\xdc\xbe\x18\x93"
- "\x19\x6b\xec\x58\x4f\xb9\x75\xa7"
- "\xdd\x3f\x2f\xec\xc8\x5a\x84\xab"
- "\xd5\xe4\x8a\x07\xf6\x4d\x23\xd6"
- "\x03\xfb\x03\x6a\xea\x66\xbf\xd4"
- "\xb1\x34\xfb\x78\xe9\x55\xdc\x7c"
- "\x3d\x9c\xe5\x9a\xac\xc3\x7a\x80"
- "\x24\x6d\xa0\xef\x25\x7c\xb7\xea"
- "\xce\x4d\x5f\x18\x60\xce\x87\x22"
- "\x66\x2f\xd5\xdd\xdd\x02\x21\x75"
- "\x82\xa0\x1f\x58\xc6\xd3\x62\xf7"
- "\x32\xd8\xaf\x1e\x07\x77\x51\x96"
- "\xd5\x6b\x1e\x7e\x80\x02\xe8\x67"
- "\xea\x17\x0b\x10\xd2\x3f\x28\x25"
- "\x4f\x05\x77\x02\x14\x69\xf0\x2c"
- "\xbe\x0c\xf1\x74\x30\xd1\xb9\x9b"
- "\xfc\x8c\xbb\x04\x16\xd9\xba\xc3"
- "\xbc\x91\x8a\xc4\x30\xa4\xb0\x12"
- "\x4c\x21\x87\xcb\xc9\x1d\x16\x96"
- "\x07\x6f\x23\x54\xb9\x6f\x79\xe5"
- "\x64\xc0\x64\xda\xb1\xae\xdd\x60"
- "\x6c\x1a\x9d\xd3\x04\x8e\x45\xb0"
- "\x92\x61\xd0\x48\x81\xed\x5e\x1d"
- "\xa0\xc9\xa4\x33\xc7\x13\x51\x5d"
- "\x7f\x83\x73\xb6\x70\x18\x65\x3e"
- "\x2f\x0e\x7a\x12\x39\x98\xab\xd8"
- "\x7e\x6f\xa3\xd1\xba\x56\xad\xbd"
- "\xf0\x03\x01\x1c\x85\x35\x9f\xeb"
- "\x19\x63\xa1\xaf\xfe\x2d\x35\x50"
- "\x39\xa0\x65\x7c\x95\x7e\x6b\xfe"
- "\xc1\xac\x07\x7c\x98\x4f\xbe\x57"
- "\xa7\x22\xec\xe2\x7e\x29\x09\x53"
- "\xe8\xbf\xb4\x7e\x3f\x8f\xfc\x14"
- "\xce\x54\xf9\x18\x58\xb5\xff\x44"
- "\x05\x9d\xce\x1b\xb6\x82\x23\xc8"
- "\x2e\xbc\x69\xbb\x4a\x29\x0f\x65"
- "\x94\xf0\x63\x06\x0e\xef\x8c\xbd"
- "\xff\xfd\xb0\x21\x6e\x57\x05\x75"
- "\xda\xd5\xc4\xeb\x8d\x32\xf7\x50"
- "\xd3\x6f\x22\xed\x5f\x8e\xa2\x5b"
- "\x80\x8c\xc8\x78\x40\x24\x4b\x89"
- "\x30\xce\x7a\x97\x0e\xc4\xaf\xef"
- "\x9b\xb4\xcd\x66\x74\x14\x04\x2b"
- "\xf7\xce\x0b\x1c\x6e\xc2\x78\x8c"
- "\xca\xc5\xd0\x1c\x95\x4a\x91\x2d"
- "\xa7\x20\xeb\x86\x52\xb7\x67\xd8"
- "\x0c\xd6\x04\x14\xde\x51\x74\x75"
- "\xe7\x11\xb4\x87\xa3\x3d\x2d\xad"
- "\x4f\xef\xa0\x0f\x70\x00\x6d\x13"
- "\x19\x1d\x41\x50\xe9\xd8\xf0\x32"
- "\x71\xbc\xd3\x11\xf2\xac\xbe\xaf"
- "\x75\x46\x65\x4e\x07\x34\x37\xa3"
- "\x89\xfe\x75\xd4\x70\x4c\xc6\x3f"
- "\x69\x24\x0e\x38\x67\x43\x8c\xde"
- "\x06\xb5\xb8\xe7\xc4\xf0\x41\x8f"
- "\xf0\xbd\x2f\x0b\xb9\x18\xf8\xde"
- "\x64\xb1\xdb\xee\x00\x50\x77\xe1"
- "\xc7\xff\xa6\xfa\xdd\x70\xf4\xe3"
- "\x93\xe9\x77\x35\x3d\x4b\x2f\x2b"
- "\x6d\x55\xf0\xfc\x88\x54\x4e\x89"
- "\xc1\x8a\x23\x31\x2d\x14\x2a\xb8"
- "\x1b\x15\xdd\x9e\x6e\x7b\xda\x05"
- "\x91\x7d\x62\x64\x96\x72\xde\xfc"
- "\xc1\xec\xf0\x23\x51\x6f\xdb\x5b"
- "\x1d\x08\x57\xce\x09\xb8\xf6\xcd"
- "\x8d\x95\xf2\x20\xbf\x0f\x20\x57"
- "\x98\x81\x84\x4f\x15\x5c\x76\xe7"
- "\x3e\x0a\x3a\x6c\xc4\x8a\xbe\x78"
- "\x74\x77\xc3\x09\x4b\x5d\x48\xe4"
- "\xc8\xcb\x0b\xea\x17\x28\xcf\xcf"
- "\x31\x32\x44\xa4\xe5\x0e\x1a\x98"
- "\x94\xc4\xf0\xff\xae\x3e\x44\xe8"
- "\xa5\xb3\xb5\x37\x2f\xe8\xaf\x6f"
- "\x28\xc1\x37\x5f\x31\xd2\xb9\x33"
- "\xb1\xb2\x52\x94\x75\x2c\x29\x59"
- "\x06\xc2\x25\xe8\x71\x65\x4e\xed"
- "\xc0\x9c\xb1\xbb\x25\xdc\x6c\xe7"
- "\x4b\xa5\x7a\x54\x7a\x60\xff\x7a"
- "\xe0\x50\x40\x96\x35\x63\xe4\x0b"
- "\x76\xbd\xa4\x65\x00\x1b\x57\x88"
- "\xae\xed\x39\x88\x42\x11\x3c\xed"
- "\x85\x67\x7d\xb9\x68\x82\xe9\x43"
- "\x3c\x47\x53\xfa\xe8\xf8\x9f\x1f"
- "\x9f\xef\x0f\xf7\x30\xd9\x30\x0e"
- "\xb9\x9f\x69\x18\x2f\x7e\xf8\xf8"
- "\xf8\x8c\x0f\xd4\x02\x4d\xea\xcd"
- "\x0a\x9c\x6f\x71\x6d\x5a\x4c\x60"
- "\xce\x20\x56\x32\xc6\xc5\x99\x1f"
- "\x09\xe6\x4e\x18\x1a\x15\x13\xa8"
- "\x7d\xb1\x6b\xc0\xb2\x6d\xf8\x26"
- "\x66\xf8\x3d\x18\x74\x70\x66\x7a"
- "\x34\x17\xde\xba\x47\xf1\x06\x18"
- "\xcb\xaf\xeb\x4a\x1e\x8f\xa7\x77"
- "\xe0\x3b\x78\x62\x66\xc9\x10\xea"
- "\x1f\xb7\x29\x0a\x45\xa1\x1d\x1e"
- "\x1d\xe2\x65\x61\x50\x9c\xd7\x05"
- "\xf2\x0b\x5b\x12\x61\x02\xc8\xe5"
- "\x63\x4f\x20\x0c\x07\x17\x33\x5e"
- "\x03\x9a\x53\x0f\x2e\x55\xfe\x50"
- "\x43\x7d\xd0\xb6\x7e\x5a\xda\xae"
- "\x58\xef\x15\xa9\x83\xd9\x46\xb1"
- "\x42\xaa\xf5\x02\x6c\xce\x92\x06"
- "\x1b\xdb\x66\x45\x91\x79\xc2\x2d"
- "\xe6\x53\xd3\x14\xfd\xbb\x44\x63"
- "\xc6\xd7\x3d\x7a\x0c\x75\x78\x9d"
- "\x5c\xa6\x39\xb3\xe5\x63\xca\x8b"
- "\xfe\xd3\xef\x60\x83\xf6\x8e\x70"
- "\xb6\x67\xc7\x77\xed\x23\xef\x4c"
- "\xf0\xed\x2d\x07\x59\x6f\xc1\x01"
- "\x34\x37\x08\xab\xd9\x1f\x09\xb1"
- "\xce\x5b\x17\xff\x74\xf8\x9c\xd5"
- "\x2c\x56\x39\x79\x0f\x69\x44\x75"
- "\x58\x27\x01\xc4\xbf\xa7\xa1\x1d"
- "\x90\x17\x77\x86\x5a\x3f\xd9\xd1"
- "\x0e\xa0\x10\xf8\xec\x1e\xa5\x7f"
- "\x5e\x36\xd1\xe3\x04\x2c\x70\xf7"
- "\x8e\xc0\x98\x2f\x6c\x94\x2b\x41"
- "\xb7\x60\x00\xb7\x2e\xb8\x02\x8d"
- "\xb8\xb0\xd3\x86\xba\x1d\xd7\x90"
- "\xd6\xb6\xe1\xfc\xd7\xd8\x28\x06"
- "\x63\x9b\xce\x61\x24\x79\xc0\x70"
- "\x52\xd0\xb6\xd4\x28\x95\x24\x87"
- "\x03\x1f\xb7\x9a\xda\xa3\xfb\x52"
- "\x5b\x68\xe7\x4c\x8c\x24\xe1\x42"
- "\xf7\xd5\xfd\xad\x06\x32\x9f\xba"
- "\xc1\xfc\xdd\xc6\xfc\xfc\xb3\x38"
- "\x74\x56\x58\x40\x02\x37\x52\x2c"
- "\x55\xcc\xb3\x9e\x7a\xe9\xd4\x38"
- "\x41\x5e\x0c\x35\xe2\x11\xd1\x13"
- "\xf8\xb7\x8d\x72\x6b\x22\x2a\xb0"
- "\xdb\x08\xba\x35\xb9\x3f\xc8\xd3"
- "\x24\x90\xec\x58\xd2\x09\xc7\x2d"
- "\xed\x38\x80\x36\x72\x43\x27\x49"
- "\x4a\x80\x8a\xa2\xe8\xd3\xda\x30"
- "\x7d\xb6\x82\x37\x86\x92\x86\x3e"
- "\x08\xb2\x28\x5a\x55\x44\x24\x7d"
- "\x40\x48\x8a\xb6\x89\x58\x08\xa0"
- "\xd6\x6d\x3a\x17\xbf\xf6\x54\xa2"
- "\xf5\xd3\x8c\x0f\x78\x12\x57\x8b"
- "\xd5\xc2\xfd\x58\x5b\x7f\x38\xe3"
- "\xcc\xb7\x7c\x48\xb3\x20\xe8\x81"
- "\x14\x32\x45\x05\xe0\xdb\x9f\x75"
- "\x85\xb4\x6a\xfc\x95\xe3\x54\x22"
- "\x12\xee\x30\xfe\xd8\x30\xef\x34"
- "\x50\xab\x46\x30\x98\x2f\xb7\xc0"
- "\x15\xa2\x83\xb6\xf2\x06\x21\xa2"
- "\xc3\x26\x37\x14\xd1\x4d\xb5\x10"
- "\x52\x76\x4d\x6a\xee\xb5\x2b\x15"
- "\xb7\xf9\x51\xe8\x2a\xaf\xc7\xfa"
- "\x77\xaf\xb0\x05\x4d\xd1\x68\x8e"
- "\x74\x05\x9f\x9d\x93\xa5\x3e\x7f"
- "\x4e\x5f\x9d\xcb\x09\xc7\x83\xe3"
- "\x02\x9d\x27\x1f\xef\x85\x05\x8d"
- "\xec\x55\x88\x0f\x0d\x7c\x4c\xe8"
- "\xa1\x75\xa0\xd8\x06\x47\x14\xef"
- "\xaa\x61\xcf\x26\x15\xad\xd8\xa3"
- "\xaa\x75\xf2\x78\x4a\x5a\x61\xdf"
- "\x8b\xc7\x04\xbc\xb2\x32\xd2\x7e"
- "\x42\xee\xb4\x2f\x51\xff\x7b\x2e"
- "\xd3\x02\xe8\xdc\x5d\x0d\x50\xdc"
- "\xae\xb7\x46\xf9\xa8\xe6\xd0\x16"
- "\xcc\xe6\x2c\x81\xc7\xad\xe9\xf0"
- "\x05\x72\x6d\x3d\x0a\x7a\xa9\x02"
- "\xac\x82\x93\x6e\xb6\x1c\x28\xfc"
- "\x44\x12\xfb\x73\x77\xd4\x13\x39"
- "\x29\x88\x8a\xf3\x5c\xa6\x36\xa0"
- "\x2a\xed\x7e\xb1\x1d\xd6\x4c\x6b"
- "\x41\x01\x18\x5d\x5d\x07\x97\xa6"
- "\x4b\xef\x31\x18\xea\xac\xb1\x84"
- "\x21\xed\xda\x86",
- .rlen = 4100,
- .np = 2,
- .tap = { 4064, 36 },
-#endif
- },
-};
-
-static struct cipher_testvec aes_ctr_rfc3686_dec_tv_template[] = {
- { /* From RFC 3686 */
- .key = "\xae\x68\x52\xf8\x12\x10\x67\xcc"
- "\x4b\xf7\xa5\x76\x55\x77\xf3\x9e"
- "\x00\x00\x00\x30",
- .klen = 20,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .input = "\xe4\x09\x5d\x4f\xb7\xa7\xb3\x79"
- "\x2d\x61\x75\xa3\x26\x13\x11\xb8",
- .ilen = 16,
- .result = "Single block msg",
- .rlen = 16,
- }, {
- .key = "\x7e\x24\x06\x78\x17\xfa\xe0\xd7"
- "\x43\xd6\xce\x1f\x32\x53\x91\x63"
- "\x00\x6c\xb6\xdb",
- .klen = 20,
- .iv = "\xc0\x54\x3b\x59\xda\x48\xd9\x0b",
- .input = "\x51\x04\xa1\x06\x16\x8a\x72\xd9"
- "\x79\x0d\x41\xee\x8e\xda\xd3\x88"
- "\xeb\x2e\x1e\xfc\x46\xda\x57\xc8"
- "\xfc\xe6\x30\xdf\x91\x41\xbe\x28",
- .ilen = 32,
- .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
- .rlen = 32,
- }, {
- .key = "\x16\xaf\x5b\x14\x5f\xc9\xf5\x79"
- "\xc1\x75\xf9\x3e\x3b\xfb\x0e\xed"
- "\x86\x3d\x06\xcc\xfd\xb7\x85\x15"
- "\x00\x00\x00\x48",
- .klen = 28,
- .iv = "\x36\x73\x3c\x14\x7d\x6d\x93\xcb",
- .input = "\x4b\x55\x38\x4f\xe2\x59\xc9\xc8"
- "\x4e\x79\x35\xa0\x03\xcb\xe9\x28",
- .ilen = 16,
- .result = "Single block msg",
- .rlen = 16,
- }, {
- .key = "\x7c\x5c\xb2\x40\x1b\x3d\xc3\x3c"
- "\x19\xe7\x34\x08\x19\xe0\xf6\x9c"
- "\x67\x8c\x3d\xb8\xe6\xf6\xa9\x1a"
- "\x00\x96\xb0\x3b",
- .klen = 28,
- .iv = "\x02\x0c\x6e\xad\xc2\xcb\x50\x0d",
- .input = "\x45\x32\x43\xfc\x60\x9b\x23\x32"
- "\x7e\xdf\xaa\xfa\x71\x31\xcd\x9f"
- "\x84\x90\x70\x1c\x5a\xd4\xa7\x9c"
- "\xfc\x1f\xe0\xff\x42\xf4\xfb\x00",
- .ilen = 32,
- .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
- .rlen = 32,
- }, {
- .key = "\x77\x6b\xef\xf2\x85\x1d\xb0\x6f"
- "\x4c\x8a\x05\x42\xc8\x69\x6f\x6c"
- "\x6a\x81\xaf\x1e\xec\x96\xb4\xd3"
- "\x7f\xc1\xd6\x89\xe6\xc1\xc1\x04"
- "\x00\x00\x00\x60",
- .klen = 36,
- .iv = "\xdb\x56\x72\xc9\x7a\xa8\xf0\xb2",
- .input = "\x14\x5a\xd0\x1d\xbf\x82\x4e\xc7"
- "\x56\x08\x63\xdc\x71\xe3\xe0\xc0",
- .ilen = 16,
- .result = "Single block msg",
- .rlen = 16,
- }, {
- .key = "\xf6\xd6\x6d\x6b\xd5\x2d\x59\xbb"
- "\x07\x96\x36\x58\x79\xef\xf8\x86"
- "\xc6\x6d\xd5\x1a\x5b\x6a\x99\x74"
- "\x4b\x50\x59\x0c\x87\xa2\x38\x84"
- "\x00\xfa\xac\x24",
- .klen = 36,
- .iv = "\xc1\x58\x5e\xf1\x5a\x43\xd8\x75",
- .input = "\xf0\x5e\x23\x1b\x38\x94\x61\x2c"
- "\x49\xee\x00\x0b\x80\x4e\xb2\xa9"
- "\xb8\x30\x6b\x50\x8f\x83\x9d\x6a"
- "\x55\x30\x83\x1d\x93\x44\xaf\x1c",
- .ilen = 32,
- .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
- .rlen = 32,
- },
-};
-
-static struct aead_testvec aes_gcm_enc_tv_template[] = {
- { /* From McGrew & Viega - http://citeseer.ist.psu.edu/656989.html */
- .key = zeroed_string,
- .klen = 16,
- .result = "\x58\xe2\xfc\xce\xfa\x7e\x30\x61"
- "\x36\x7f\x1d\x57\xa4\xe7\x45\x5a",
- .rlen = 16,
- }, {
- .key = zeroed_string,
- .klen = 16,
- .input = zeroed_string,
- .ilen = 16,
- .result = "\x03\x88\xda\xce\x60\xb6\xa3\x92"
- "\xf3\x28\xc2\xb9\x71\xb2\xfe\x78"
- "\xab\x6e\x47\xd4\x2c\xec\x13\xbd"
- "\xf5\x3a\x67\xb2\x12\x57\xbd\xdf",
- .rlen = 32,
- }, {
- .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
- "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
- .klen = 16,
- .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
- "\xde\xca\xf8\x88",
- .input = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
- "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
- "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
- "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
- "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
- "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
- "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
- "\xba\x63\x7b\x39\x1a\xaf\xd2\x55",
- .ilen = 64,
- .result = "\x42\x83\x1e\xc2\x21\x77\x74\x24"
- "\x4b\x72\x21\xb7\x84\xd0\xd4\x9c"
- "\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0"
- "\x35\xc1\x7e\x23\x29\xac\xa1\x2e"
- "\x21\xd5\x14\xb2\x54\x66\x93\x1c"
- "\x7d\x8f\x6a\x5a\xac\x84\xaa\x05"
- "\x1b\xa3\x0b\x39\x6a\x0a\xac\x97"
- "\x3d\x58\xe0\x91\x47\x3f\x59\x85"
- "\x4d\x5c\x2a\xf3\x27\xcd\x64\xa6"
- "\x2c\xf3\x5a\xbd\x2b\xa6\xfa\xb4",
- .rlen = 80,
- }, {
- .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
- "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
- .klen = 16,
- .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
- "\xde\xca\xf8\x88",
- .input = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
- "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
- "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
- "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
- "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
- "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
- "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
- "\xba\x63\x7b\x39",
- .ilen = 60,
- .assoc = "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
- "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
- "\xab\xad\xda\xd2",
- .alen = 20,
- .result = "\x42\x83\x1e\xc2\x21\x77\x74\x24"
- "\x4b\x72\x21\xb7\x84\xd0\xd4\x9c"
- "\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0"
- "\x35\xc1\x7e\x23\x29\xac\xa1\x2e"
- "\x21\xd5\x14\xb2\x54\x66\x93\x1c"
- "\x7d\x8f\x6a\x5a\xac\x84\xaa\x05"
- "\x1b\xa3\x0b\x39\x6a\x0a\xac\x97"
- "\x3d\x58\xe0\x91"
- "\x5b\xc9\x4f\xbc\x32\x21\xa5\xdb"
- "\x94\xfa\xe9\x5a\xe7\x12\x1a\x47",
- .rlen = 76,
- }, {
- .key = zeroed_string,
- .klen = 24,
- .result = "\xcd\x33\xb2\x8a\xc7\x73\xf7\x4b"
- "\xa0\x0e\xd1\xf3\x12\x57\x24\x35",
- .rlen = 16,
- }, {
- .key = zeroed_string,
- .klen = 24,
- .input = zeroed_string,
- .ilen = 16,
- .result = "\x98\xe7\x24\x7c\x07\xf0\xfe\x41"
- "\x1c\x26\x7e\x43\x84\xb0\xf6\x00"
- "\x2f\xf5\x8d\x80\x03\x39\x27\xab"
- "\x8e\xf4\xd4\x58\x75\x14\xf0\xfb",
- .rlen = 32,
- }, {
- .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
- "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
- "\xfe\xff\xe9\x92\x86\x65\x73\x1c",
- .klen = 24,
- .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
- "\xde\xca\xf8\x88",
- .input = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
- "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
- "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
- "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
- "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
- "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
- "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
- "\xba\x63\x7b\x39\x1a\xaf\xd2\x55",
- .ilen = 64,
- .result = "\x39\x80\xca\x0b\x3c\x00\xe8\x41"
- "\xeb\x06\xfa\xc4\x87\x2a\x27\x57"
- "\x85\x9e\x1c\xea\xa6\xef\xd9\x84"
- "\x62\x85\x93\xb4\x0c\xa1\xe1\x9c"
- "\x7d\x77\x3d\x00\xc1\x44\xc5\x25"
- "\xac\x61\x9d\x18\xc8\x4a\x3f\x47"
- "\x18\xe2\x44\x8b\x2f\xe3\x24\xd9"
- "\xcc\xda\x27\x10\xac\xad\xe2\x56"
- "\x99\x24\xa7\xc8\x58\x73\x36\xbf"
- "\xb1\x18\x02\x4d\xb8\x67\x4a\x14",
- .rlen = 80,
- }, {
- .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
- "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
- "\xfe\xff\xe9\x92\x86\x65\x73\x1c",
- .klen = 24,
- .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
- "\xde\xca\xf8\x88",
- .input = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
- "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
- "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
- "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
- "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
- "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
- "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
- "\xba\x63\x7b\x39",
- .ilen = 60,
- .assoc = "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
- "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
- "\xab\xad\xda\xd2",
- .alen = 20,
- .result = "\x39\x80\xca\x0b\x3c\x00\xe8\x41"
- "\xeb\x06\xfa\xc4\x87\x2a\x27\x57"
- "\x85\x9e\x1c\xea\xa6\xef\xd9\x84"
- "\x62\x85\x93\xb4\x0c\xa1\xe1\x9c"
- "\x7d\x77\x3d\x00\xc1\x44\xc5\x25"
- "\xac\x61\x9d\x18\xc8\x4a\x3f\x47"
- "\x18\xe2\x44\x8b\x2f\xe3\x24\xd9"
- "\xcc\xda\x27\x10"
- "\x25\x19\x49\x8e\x80\xf1\x47\x8f"
- "\x37\xba\x55\xbd\x6d\x27\x61\x8c",
- .rlen = 76,
- .np = 2,
- .tap = { 32, 28 },
- .anp = 2,
- .atap = { 8, 12 }
- }, {
- .key = zeroed_string,
- .klen = 32,
- .result = "\x53\x0f\x8a\xfb\xc7\x45\x36\xb9"
- "\xa9\x63\xb4\xf1\xc4\xcb\x73\x8b",
- .rlen = 16,
- }
-};
-
-static struct aead_testvec aes_gcm_dec_tv_template[] = {
- { /* From McGrew & Viega - http://citeseer.ist.psu.edu/656989.html */
- .key = zeroed_string,
- .klen = 32,
- .input = "\xce\xa7\x40\x3d\x4d\x60\x6b\x6e"
- "\x07\x4e\xc5\xd3\xba\xf3\x9d\x18"
- "\xd0\xd1\xc8\xa7\x99\x99\x6b\xf0"
- "\x26\x5b\x98\xb5\xd4\x8a\xb9\x19",
- .ilen = 32,
- .result = zeroed_string,
- .rlen = 16,
- }, {
- .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
- "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
- "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
- "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
- .klen = 32,
- .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
- "\xde\xca\xf8\x88",
- .input = "\x52\x2d\xc1\xf0\x99\x56\x7d\x07"
- "\xf4\x7f\x37\xa3\x2a\x84\x42\x7d"
- "\x64\x3a\x8c\xdc\xbf\xe5\xc0\xc9"
- "\x75\x98\xa2\xbd\x25\x55\xd1\xaa"
- "\x8c\xb0\x8e\x48\x59\x0d\xbb\x3d"
- "\xa7\xb0\x8b\x10\x56\x82\x88\x38"
- "\xc5\xf6\x1e\x63\x93\xba\x7a\x0a"
- "\xbc\xc9\xf6\x62\x89\x80\x15\xad"
- "\xb0\x94\xda\xc5\xd9\x34\x71\xbd"
- "\xec\x1a\x50\x22\x70\xe3\xcc\x6c",
- .ilen = 80,
- .result = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
- "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
- "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
- "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
- "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
- "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
- "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
- "\xba\x63\x7b\x39\x1a\xaf\xd2\x55",
- .rlen = 64,
- }, {
- .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
- "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
- "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
- "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
- .klen = 32,
- .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
- "\xde\xca\xf8\x88",
- .input = "\x52\x2d\xc1\xf0\x99\x56\x7d\x07"
- "\xf4\x7f\x37\xa3\x2a\x84\x42\x7d"
- "\x64\x3a\x8c\xdc\xbf\xe5\xc0\xc9"
- "\x75\x98\xa2\xbd\x25\x55\xd1\xaa"
- "\x8c\xb0\x8e\x48\x59\x0d\xbb\x3d"
- "\xa7\xb0\x8b\x10\x56\x82\x88\x38"
- "\xc5\xf6\x1e\x63\x93\xba\x7a\x0a"
- "\xbc\xc9\xf6\x62"
- "\x76\xfc\x6e\xce\x0f\x4e\x17\x68"
- "\xcd\xdf\x88\x53\xbb\x2d\x55\x1b",
- .ilen = 76,
- .assoc = "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
- "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
- "\xab\xad\xda\xd2",
- .alen = 20,
- .result = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
- "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
- "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
- "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
- "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
- "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
- "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
- "\xba\x63\x7b\x39",
- .rlen = 60,
- .np = 2,
- .tap = { 48, 28 },
- .anp = 3,
- .atap = { 8, 8, 4 }
- }, {
- .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
- "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
- .klen = 16,
- .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
- "\xde\xca\xf8\x88",
- .input = "\x42\x83\x1e\xc2\x21\x77\x74\x24"
- "\x4b\x72\x21\xb7\x84\xd0\xd4\x9c"
- "\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0"
- "\x35\xc1\x7e\x23\x29\xac\xa1\x2e"
- "\x21\xd5\x14\xb2\x54\x66\x93\x1c"
- "\x7d\x8f\x6a\x5a\xac\x84\xaa\x05"
- "\x1b\xa3\x0b\x39\x6a\x0a\xac\x97"
- "\x3d\x58\xe0\x91\x47\x3f\x59\x85"
- "\x4d\x5c\x2a\xf3\x27\xcd\x64\xa6"
- "\x2c\xf3\x5a\xbd\x2b\xa6\xfa\xb4",
- .ilen = 80,
- .result = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
- "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
- "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
- "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
- "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
- "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
- "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
- "\xba\x63\x7b\x39\x1a\xaf\xd2\x55",
- .rlen = 64,
- }, {
- .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
- "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
- .klen = 16,
- .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
- "\xde\xca\xf8\x88",
- .input = "\x42\x83\x1e\xc2\x21\x77\x74\x24"
- "\x4b\x72\x21\xb7\x84\xd0\xd4\x9c"
- "\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0"
- "\x35\xc1\x7e\x23\x29\xac\xa1\x2e"
- "\x21\xd5\x14\xb2\x54\x66\x93\x1c"
- "\x7d\x8f\x6a\x5a\xac\x84\xaa\x05"
- "\x1b\xa3\x0b\x39\x6a\x0a\xac\x97"
- "\x3d\x58\xe0\x91"
- "\x5b\xc9\x4f\xbc\x32\x21\xa5\xdb"
- "\x94\xfa\xe9\x5a\xe7\x12\x1a\x47",
- .ilen = 76,
- .assoc = "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
- "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
- "\xab\xad\xda\xd2",
- .alen = 20,
- .result = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
- "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
- "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
- "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
- "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
- "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
- "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
- "\xba\x63\x7b\x39",
- .rlen = 60,
- }, {
- .key = zeroed_string,
- .klen = 24,
- .input = "\x98\xe7\x24\x7c\x07\xf0\xfe\x41"
- "\x1c\x26\x7e\x43\x84\xb0\xf6\x00"
- "\x2f\xf5\x8d\x80\x03\x39\x27\xab"
- "\x8e\xf4\xd4\x58\x75\x14\xf0\xfb",
- .ilen = 32,
- .result = zeroed_string,
- .rlen = 16,
- }, {
- .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
- "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
- "\xfe\xff\xe9\x92\x86\x65\x73\x1c",
- .klen = 24,
- .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
- "\xde\xca\xf8\x88",
- .input = "\x39\x80\xca\x0b\x3c\x00\xe8\x41"
- "\xeb\x06\xfa\xc4\x87\x2a\x27\x57"
- "\x85\x9e\x1c\xea\xa6\xef\xd9\x84"
- "\x62\x85\x93\xb4\x0c\xa1\xe1\x9c"
- "\x7d\x77\x3d\x00\xc1\x44\xc5\x25"
- "\xac\x61\x9d\x18\xc8\x4a\x3f\x47"
- "\x18\xe2\x44\x8b\x2f\xe3\x24\xd9"
- "\xcc\xda\x27\x10\xac\xad\xe2\x56"
- "\x99\x24\xa7\xc8\x58\x73\x36\xbf"
- "\xb1\x18\x02\x4d\xb8\x67\x4a\x14",
- .ilen = 80,
- .result = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
- "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
- "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
- "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
- "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
- "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
- "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
- "\xba\x63\x7b\x39\x1a\xaf\xd2\x55",
- .rlen = 64,
- }, {
- .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
- "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
- "\xfe\xff\xe9\x92\x86\x65\x73\x1c",
- .klen = 24,
- .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
- "\xde\xca\xf8\x88",
- .input = "\x39\x80\xca\x0b\x3c\x00\xe8\x41"
- "\xeb\x06\xfa\xc4\x87\x2a\x27\x57"
- "\x85\x9e\x1c\xea\xa6\xef\xd9\x84"
- "\x62\x85\x93\xb4\x0c\xa1\xe1\x9c"
- "\x7d\x77\x3d\x00\xc1\x44\xc5\x25"
- "\xac\x61\x9d\x18\xc8\x4a\x3f\x47"
- "\x18\xe2\x44\x8b\x2f\xe3\x24\xd9"
- "\xcc\xda\x27\x10"
- "\x25\x19\x49\x8e\x80\xf1\x47\x8f"
- "\x37\xba\x55\xbd\x6d\x27\x61\x8c",
- .ilen = 76,
- .assoc = "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
- "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
- "\xab\xad\xda\xd2",
- .alen = 20,
- .result = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
- "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
- "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
- "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
- "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
- "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
- "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
- "\xba\x63\x7b\x39",
- .rlen = 60,
- }
-};
-
-static struct aead_testvec aes_ccm_enc_tv_template[] = {
- { /* From RFC 3610 */
- .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
- "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
- .klen = 16,
- .iv = "\x01\x00\x00\x00\x03\x02\x01\x00"
- "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
- .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07",
- .alen = 8,
- .input = "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e",
- .ilen = 23,
- .result = "\x58\x8c\x97\x9a\x61\xc6\x63\xd2"
- "\xf0\x66\xd0\xc2\xc0\xf9\x89\x80"
- "\x6d\x5f\x6b\x61\xda\xc3\x84\x17"
- "\xe8\xd1\x2c\xfd\xf9\x26\xe0",
- .rlen = 31,
- }, {
- .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
- "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
- .klen = 16,
- .iv = "\x01\x00\x00\x00\x07\x06\x05\x04"
- "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
- .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b",
- .alen = 12,
- .input = "\x0c\x0d\x0e\x0f\x10\x11\x12\x13"
- "\x14\x15\x16\x17\x18\x19\x1a\x1b"
- "\x1c\x1d\x1e\x1f",
- .ilen = 20,
- .result = "\xdc\xf1\xfb\x7b\x5d\x9e\x23\xfb"
- "\x9d\x4e\x13\x12\x53\x65\x8a\xd8"
- "\x6e\xbd\xca\x3e\x51\xe8\x3f\x07"
- "\x7d\x9c\x2d\x93",
- .rlen = 28,
- }, {
- .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
- "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
- .klen = 16,
- .iv = "\x01\x00\x00\x00\x0b\x0a\x09\x08"
- "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
- .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07",
- .alen = 8,
- .input = "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
- "\x20",
- .ilen = 25,
- .result = "\x82\x53\x1a\x60\xcc\x24\x94\x5a"
- "\x4b\x82\x79\x18\x1a\xb5\xc8\x4d"
- "\xf2\x1c\xe7\xf9\xb7\x3f\x42\xe1"
- "\x97\xea\x9c\x07\xe5\x6b\x5e\xb1"
- "\x7e\x5f\x4e",
- .rlen = 35,
- }, {
- .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
- "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
- .klen = 16,
- .iv = "\x01\x00\x00\x00\x0c\x0b\x0a\x09"
- "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
- .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b",
- .alen = 12,
- .input = "\x0c\x0d\x0e\x0f\x10\x11\x12\x13"
- "\x14\x15\x16\x17\x18\x19\x1a\x1b"
- "\x1c\x1d\x1e",
- .ilen = 19,
- .result = "\x07\x34\x25\x94\x15\x77\x85\x15"
- "\x2b\x07\x40\x98\x33\x0a\xbb\x14"
- "\x1b\x94\x7b\x56\x6a\xa9\x40\x6b"
- "\x4d\x99\x99\x88\xdd",
- .rlen = 29,
- }, {
- .key = "\xd7\x82\x8d\x13\xb2\xb0\xbd\xc3"
- "\x25\xa7\x62\x36\xdf\x93\xcc\x6b",
- .klen = 16,
- .iv = "\x01\x00\x33\x56\x8e\xf7\xb2\x63"
- "\x3c\x96\x96\x76\x6c\xfa\x00\x00",
- .assoc = "\x63\x01\x8f\x76\xdc\x8a\x1b\xcb",
- .alen = 8,
- .input = "\x90\x20\xea\x6f\x91\xbd\xd8\x5a"
- "\xfa\x00\x39\xba\x4b\xaf\xf9\xbf"
- "\xb7\x9c\x70\x28\x94\x9c\xd0\xec",
- .ilen = 24,
- .result = "\x4c\xcb\x1e\x7c\xa9\x81\xbe\xfa"
- "\xa0\x72\x6c\x55\xd3\x78\x06\x12"
- "\x98\xc8\x5c\x92\x81\x4a\xbc\x33"
- "\xc5\x2e\xe8\x1d\x7d\x77\xc0\x8a",
- .rlen = 32,
- }, {
- .key = "\xd7\x82\x8d\x13\xb2\xb0\xbd\xc3"
- "\x25\xa7\x62\x36\xdf\x93\xcc\x6b",
- .klen = 16,
- .iv = "\x01\x00\xd5\x60\x91\x2d\x3f\x70"
- "\x3c\x96\x96\x76\x6c\xfa\x00\x00",
- .assoc = "\xcd\x90\x44\xd2\xb7\x1f\xdb\x81"
- "\x20\xea\x60\xc0",
- .alen = 12,
- .input = "\x64\x35\xac\xba\xfb\x11\xa8\x2e"
- "\x2f\x07\x1d\x7c\xa4\xa5\xeb\xd9"
- "\x3a\x80\x3b\xa8\x7f",
- .ilen = 21,
- .result = "\x00\x97\x69\xec\xab\xdf\x48\x62"
- "\x55\x94\xc5\x92\x51\xe6\x03\x57"
- "\x22\x67\x5e\x04\xc8\x47\x09\x9e"
- "\x5a\xe0\x70\x45\x51",
- .rlen = 29,
- }, {
- .key = "\xd7\x82\x8d\x13\xb2\xb0\xbd\xc3"
- "\x25\xa7\x62\x36\xdf\x93\xcc\x6b",
- .klen = 16,
- .iv = "\x01\x00\x42\xff\xf8\xf1\x95\x1c"
- "\x3c\x96\x96\x76\x6c\xfa\x00\x00",
- .assoc = "\xd8\x5b\xc7\xe6\x9f\x94\x4f\xb8",
- .alen = 8,
- .input = "\x8a\x19\xb9\x50\xbc\xf7\x1a\x01"
- "\x8e\x5e\x67\x01\xc9\x17\x87\x65"
- "\x98\x09\xd6\x7d\xbe\xdd\x18",
- .ilen = 23,
- .result = "\xbc\x21\x8d\xaa\x94\x74\x27\xb6"
- "\xdb\x38\x6a\x99\xac\x1a\xef\x23"
- "\xad\xe0\xb5\x29\x39\xcb\x6a\x63"
- "\x7c\xf9\xbe\xc2\x40\x88\x97\xc6"
- "\xba",
- .rlen = 33,
- },
-};
-
-static struct aead_testvec aes_ccm_dec_tv_template[] = {
- { /* From RFC 3610 */
- .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
- "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
- .klen = 16,
- .iv = "\x01\x00\x00\x00\x03\x02\x01\x00"
- "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
- .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07",
- .alen = 8,
- .input = "\x58\x8c\x97\x9a\x61\xc6\x63\xd2"
- "\xf0\x66\xd0\xc2\xc0\xf9\x89\x80"
- "\x6d\x5f\x6b\x61\xda\xc3\x84\x17"
- "\xe8\xd1\x2c\xfd\xf9\x26\xe0",
- .ilen = 31,
- .result = "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e",
- .rlen = 23,
- }, {
- .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
- "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
- .klen = 16,
- .iv = "\x01\x00\x00\x00\x07\x06\x05\x04"
- "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
- .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b",
- .alen = 12,
- .input = "\xdc\xf1\xfb\x7b\x5d\x9e\x23\xfb"
- "\x9d\x4e\x13\x12\x53\x65\x8a\xd8"
- "\x6e\xbd\xca\x3e\x51\xe8\x3f\x07"
- "\x7d\x9c\x2d\x93",
- .ilen = 28,
- .result = "\x0c\x0d\x0e\x0f\x10\x11\x12\x13"
- "\x14\x15\x16\x17\x18\x19\x1a\x1b"
- "\x1c\x1d\x1e\x1f",
- .rlen = 20,
- }, {
- .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
- "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
- .klen = 16,
- .iv = "\x01\x00\x00\x00\x0b\x0a\x09\x08"
- "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
- .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07",
- .alen = 8,
- .input = "\x82\x53\x1a\x60\xcc\x24\x94\x5a"
- "\x4b\x82\x79\x18\x1a\xb5\xc8\x4d"
- "\xf2\x1c\xe7\xf9\xb7\x3f\x42\xe1"
- "\x97\xea\x9c\x07\xe5\x6b\x5e\xb1"
- "\x7e\x5f\x4e",
- .ilen = 35,
- .result = "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
- "\x20",
- .rlen = 25,
- }, {
- .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
- "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
- .klen = 16,
- .iv = "\x01\x00\x00\x00\x0c\x0b\x0a\x09"
- "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
- .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b",
- .alen = 12,
- .input = "\x07\x34\x25\x94\x15\x77\x85\x15"
- "\x2b\x07\x40\x98\x33\x0a\xbb\x14"
- "\x1b\x94\x7b\x56\x6a\xa9\x40\x6b"
- "\x4d\x99\x99\x88\xdd",
- .ilen = 29,
- .result = "\x0c\x0d\x0e\x0f\x10\x11\x12\x13"
- "\x14\x15\x16\x17\x18\x19\x1a\x1b"
- "\x1c\x1d\x1e",
- .rlen = 19,
- }, {
- .key = "\xd7\x82\x8d\x13\xb2\xb0\xbd\xc3"
- "\x25\xa7\x62\x36\xdf\x93\xcc\x6b",
- .klen = 16,
- .iv = "\x01\x00\x33\x56\x8e\xf7\xb2\x63"
- "\x3c\x96\x96\x76\x6c\xfa\x00\x00",
- .assoc = "\x63\x01\x8f\x76\xdc\x8a\x1b\xcb",
- .alen = 8,
- .input = "\x4c\xcb\x1e\x7c\xa9\x81\xbe\xfa"
- "\xa0\x72\x6c\x55\xd3\x78\x06\x12"
- "\x98\xc8\x5c\x92\x81\x4a\xbc\x33"
- "\xc5\x2e\xe8\x1d\x7d\x77\xc0\x8a",
- .ilen = 32,
- .result = "\x90\x20\xea\x6f\x91\xbd\xd8\x5a"
- "\xfa\x00\x39\xba\x4b\xaf\xf9\xbf"
- "\xb7\x9c\x70\x28\x94\x9c\xd0\xec",
- .rlen = 24,
- }, {
- .key = "\xd7\x82\x8d\x13\xb2\xb0\xbd\xc3"
- "\x25\xa7\x62\x36\xdf\x93\xcc\x6b",
- .klen = 16,
- .iv = "\x01\x00\xd5\x60\x91\x2d\x3f\x70"
- "\x3c\x96\x96\x76\x6c\xfa\x00\x00",
- .assoc = "\xcd\x90\x44\xd2\xb7\x1f\xdb\x81"
- "\x20\xea\x60\xc0",
- .alen = 12,
- .input = "\x00\x97\x69\xec\xab\xdf\x48\x62"
- "\x55\x94\xc5\x92\x51\xe6\x03\x57"
- "\x22\x67\x5e\x04\xc8\x47\x09\x9e"
- "\x5a\xe0\x70\x45\x51",
- .ilen = 29,
- .result = "\x64\x35\xac\xba\xfb\x11\xa8\x2e"
- "\x2f\x07\x1d\x7c\xa4\xa5\xeb\xd9"
- "\x3a\x80\x3b\xa8\x7f",
- .rlen = 21,
- }, {
- .key = "\xd7\x82\x8d\x13\xb2\xb0\xbd\xc3"
- "\x25\xa7\x62\x36\xdf\x93\xcc\x6b",
- .klen = 16,
- .iv = "\x01\x00\x42\xff\xf8\xf1\x95\x1c"
- "\x3c\x96\x96\x76\x6c\xfa\x00\x00",
- .assoc = "\xd8\x5b\xc7\xe6\x9f\x94\x4f\xb8",
- .alen = 8,
- .input = "\xbc\x21\x8d\xaa\x94\x74\x27\xb6"
- "\xdb\x38\x6a\x99\xac\x1a\xef\x23"
- "\xad\xe0\xb5\x29\x39\xcb\x6a\x63"
- "\x7c\xf9\xbe\xc2\x40\x88\x97\xc6"
- "\xba",
- .ilen = 33,
- .result = "\x8a\x19\xb9\x50\xbc\xf7\x1a\x01"
- "\x8e\x5e\x67\x01\xc9\x17\x87\x65"
- "\x98\x09\xd6\x7d\xbe\xdd\x18",
- .rlen = 23,
- },
-};
-
-/*
- * rfc4309 refers to section 8 of rfc3610 for test vectors, but they all
- * use a 13-byte nonce, we only support an 11-byte nonce. Similarly, all of
- * Special Publication 800-38C's test vectors also use nonce lengths our
- * implementation doesn't support. The following are taken from fips cavs
- * fax files on hand at Red Hat.
- *
- * nb: actual key lengths are (klen - 3), the last 3 bytes are actually
- * part of the nonce which combine w/the iv, but need to be input this way.
- */
-static struct aead_testvec aes_ccm_rfc4309_enc_tv_template[] = {
- {
- .key = "\x83\xac\x54\x66\xc2\xeb\xe5\x05"
- "\x2e\x01\xd1\xfc\x5d\x82\x66\x2e"
- "\x96\xac\x59",
- .klen = 19,
- .iv = "\x30\x07\xa1\xe2\xa2\xc7\x55\x24",
- .alen = 0,
- .input = "\x19\xc8\x81\xf6\xe9\x86\xff\x93"
- "\x0b\x78\x67\xe5\xbb\xb7\xfc\x6e"
- "\x83\x77\xb3\xa6\x0c\x8c\x9f\x9c"
- "\x35\x2e\xad\xe0\x62\xf9\x91\xa1",
- .ilen = 32,
- .result = "\xab\x6f\xe1\x69\x1d\x19\x99\xa8"
- "\x92\xa0\xc4\x6f\x7e\xe2\x8b\xb1"
- "\x70\xbb\x8c\xa6\x4c\x6e\x97\x8a"
- "\x57\x2b\xbe\x5d\x98\xa6\xb1\x32"
- "\xda\x24\xea\xd9\xa1\x39\x98\xfd"
- "\xa4\xbe\xd9\xf2\x1a\x6d\x22\xa8",
- .rlen = 48,
- }, {
- .key = "\x1e\x2c\x7e\x01\x41\x9a\xef\xc0"
- "\x0d\x58\x96\x6e\x5c\xa2\x4b\xd3"
- "\x4f\xa3\x19",
- .klen = 19,
- .iv = "\xd3\x01\x5a\xd8\x30\x60\x15\x56",
- .assoc = "\xda\xe6\x28\x9c\x45\x2d\xfd\x63"
- "\x5e\xda\x4c\xb6\xe6\xfc\xf9\xb7"
- "\x0c\x56\xcb\xe4\xe0\x05\x7a\xe1"
- "\x0a\x63\x09\x78\xbc\x2c\x55\xde",
- .alen = 32,
- .input = "\x87\xa3\x36\xfd\x96\xb3\x93\x78"
- "\xa9\x28\x63\xba\x12\xa3\x14\x85"
- "\x57\x1e\x06\xc9\x7b\x21\xef\x76"
- "\x7f\x38\x7e\x8e\x29\xa4\x3e\x7e",
- .ilen = 32,
- .result = "\x8a\x1e\x11\xf0\x02\x6b\xe2\x19"
- "\xfc\x70\xc4\x6d\x8e\xb7\x99\xab"
- "\xc5\x4b\xa2\xac\xd3\xf3\x48\xff"
- "\x3b\xb5\xce\x53\xef\xde\xbb\x02"
- "\xa9\x86\x15\x6c\x13\xfe\xda\x0a"
- "\x22\xb8\x29\x3d\xd8\x39\x9a\x23",
- .rlen = 48,
- }, {
- .key = "\xf4\x6b\xc2\x75\x62\xfe\xb4\xe1"
- "\xa3\xf0\xff\xdd\x4e\x4b\x12\x75"
- "\x53\x14\x73\x66\x8d\x88\xf6\x80"
- "\xa0\x20\x35",
- .klen = 27,
- .iv = "\x26\xf2\x21\x8d\x50\x20\xda\xe2",
- .assoc = "\x5b\x9e\x13\x67\x02\x5e\xef\xc1"
- "\x6c\xf9\xd7\x1e\x52\x8f\x7a\x47"
- "\xe9\xd4\xcf\x20\x14\x6e\xf0\x2d"
- "\xd8\x9e\x2b\x56\x10\x23\x56\xe7",
- .alen = 32,
- .ilen = 0,
- .result = "\x36\xea\x7a\x70\x08\xdc\x6a\xbc"
- "\xad\x0c\x7a\x63\xf6\x61\xfd\x9b",
- .rlen = 16,
- }, {
- .key = "\x56\xdf\x5c\x8f\x26\x3f\x0e\x42"
- "\xef\x7a\xd3\xce\xfc\x84\x60\x62"
- "\xca\xb4\x40\xaf\x5f\xc9\xc9\x01"
- "\xd6\x3c\x8c",
- .klen = 27,
- .iv = "\x86\x84\xb6\xcd\xef\x09\x2e\x94",
- .assoc = "\x02\x65\x78\x3c\xe9\x21\x30\x91"
- "\xb1\xb9\xda\x76\x9a\x78\x6d\x95"
- "\xf2\x88\x32\xa3\xf2\x50\xcb\x4c"
- "\xe3\x00\x73\x69\x84\x69\x87\x79",
- .alen = 32,
- .input = "\x9f\xd2\x02\x4b\x52\x49\x31\x3c"
- "\x43\x69\x3a\x2d\x8e\x70\xad\x7e"
- "\xe0\xe5\x46\x09\x80\x89\x13\xb2"
- "\x8c\x8b\xd9\x3f\x86\xfb\xb5\x6b",
- .ilen = 32,
- .result = "\x39\xdf\x7c\x3c\x5a\x29\xb9\x62"
- "\x5d\x51\xc2\x16\xd8\xbd\x06\x9f"
- "\x9b\x6a\x09\x70\xc1\x51\x83\xc2"
- "\x66\x88\x1d\x4f\x9a\xda\xe0\x1e"
- "\xc7\x79\x11\x58\xe5\x6b\x20\x40"
- "\x7a\xea\x46\x42\x8b\xe4\x6f\xe1",
- .rlen = 48,
- }, {
- .key = "\xe0\x8d\x99\x71\x60\xd7\x97\x1a"
- "\xbd\x01\x99\xd5\x8a\xdf\x71\x3a"
- "\xd3\xdf\x24\x4b\x5e\x3d\x4b\x4e"
- "\x30\x7a\xb9\xd8\x53\x0a\x5e\x2b"
- "\x1e\x29\x91",
- .klen = 35,
- .iv = "\xad\x8e\xc1\x53\x0a\xcf\x2d\xbe",
- .assoc = "\x19\xb6\x1f\x57\xc4\xf3\xf0\x8b"
- "\x78\x2b\x94\x02\x29\x0f\x42\x27"
- "\x6b\x75\xcb\x98\x34\x08\x7e\x79"
- "\xe4\x3e\x49\x0d\x84\x8b\x22\x87",
- .alen = 32,
- .input = "\xe1\xd9\xd8\x13\xeb\x3a\x75\x3f"
- "\x9d\xbd\x5f\x66\xbe\xdc\xbb\x66"
- "\xbf\x17\x99\x62\x4a\x39\x27\x1f"
- "\x1d\xdc\x24\xae\x19\x2f\x98\x4c",
- .ilen = 32,
- .result = "\x19\xb8\x61\x33\x45\x2b\x43\x96"
- "\x6f\x51\xd0\x20\x30\x7d\x9b\xc6"
- "\x26\x3d\xf8\xc9\x65\x16\xa8\x9f"
- "\xf0\x62\x17\x34\xf2\x1e\x8d\x75"
- "\x4e\x13\xcc\xc0\xc3\x2a\x54\x2d",
- .rlen = 40,
- }, {
- .key = "\x7c\xc8\x18\x3b\x8d\x99\xe0\x7c"
- "\x45\x41\xb8\xbd\x5c\xa7\xc2\x32"
- "\x8a\xb8\x02\x59\xa4\xfe\xa9\x2c"
- "\x09\x75\x9a\x9b\x3c\x9b\x27\x39"
- "\xf9\xd9\x4e",
- .klen = 35,
- .iv = "\x63\xb5\x3d\x9d\x43\xf6\x1e\x50",
- .assoc = "\x57\xf5\x6b\x8b\x57\x5c\x3d\x3b"
- "\x13\x02\x01\x0c\x83\x4c\x96\x35"
- "\x8e\xd6\x39\xcf\x7d\x14\x9b\x94"
- "\xb0\x39\x36\xe6\x8f\x57\xe0\x13",
- .alen = 32,
- .input = "\x3b\x6c\x29\x36\xb6\xef\x07\xa6"
- "\x83\x72\x07\x4f\xcf\xfa\x66\x89"
- "\x5f\xca\xb1\xba\xd5\x8f\x2c\x27"
- "\x30\xdb\x75\x09\x93\xd4\x65\xe4",
- .ilen = 32,
- .result = "\xb0\x88\x5a\x33\xaa\xe5\xc7\x1d"
- "\x85\x23\xc7\xc6\x2f\xf4\x1e\x3d"
- "\xcc\x63\x44\x25\x07\x78\x4f\x9e"
- "\x96\xb8\x88\xeb\xbc\x48\x1f\x06"
- "\x39\xaf\x39\xac\xd8\x4a\x80\x39"
- "\x7b\x72\x8a\xf7",
- .rlen = 44,
- }, {
- .key = "\xab\xd0\xe9\x33\x07\x26\xe5\x83"
- "\x8c\x76\x95\xd4\xb6\xdc\xf3\x46"
- "\xf9\x8f\xad\xe3\x02\x13\x83\x77"
- "\x3f\xb0\xf1\xa1\xa1\x22\x0f\x2b"
- "\x24\xa7\x8b",
- .klen = 35,
- .iv = "\x07\xcb\xcc\x0e\xe6\x33\xbf\xf5",
- .assoc = "\xd4\xdb\x30\x1d\x03\xfe\xfd\x5f"
- "\x87\xd4\x8c\xb6\xb6\xf1\x7a\x5d"
- "\xab\x90\x65\x8d\x8e\xca\x4d\x4f"
- "\x16\x0c\x40\x90\x4b\xc7\x36\x73",
- .alen = 32,
- .input = "\xf5\xc6\x7d\x48\xc1\xb7\xe6\x92"
- "\x97\x5a\xca\xc4\xa9\x6d\xf9\x3d"
- "\x6c\xde\xbc\xf1\x90\xea\x6a\xb2"
- "\x35\x86\x36\xaf\x5c\xfe\x4b\x3a",
- .ilen = 32,
- .result = "\x83\x6f\x40\x87\x72\xcf\xc1\x13"
- "\xef\xbb\x80\x21\x04\x6c\x58\x09"
- "\x07\x1b\xfc\xdf\xc0\x3f\x5b\xc7"
- "\xe0\x79\xa8\x6e\x71\x7c\x3f\xcf"
- "\x5c\xda\xb2\x33\xe5\x13\xe2\x0d"
- "\x74\xd1\xef\xb5\x0f\x3a\xb5\xf8",
- .rlen = 48,
- },
-};
-
-static struct aead_testvec aes_ccm_rfc4309_dec_tv_template[] = {
- {
- .key = "\xab\x2f\x8a\x74\xb7\x1c\xd2\xb1"
- "\xff\x80\x2e\x48\x7d\x82\xf8\xb9"
- "\xc6\xfb\x7d",
- .klen = 19,
- .iv = "\x80\x0d\x13\xab\xd8\xa6\xb2\xd8",
- .alen = 0,
- .input = "\xd5\xe8\x93\x9f\xc7\x89\x2e\x2b",
- .ilen = 8,
- .result = "\x00",
- .rlen = 0,
- .novrfy = 1,
- }, {
- .key = "\xab\x2f\x8a\x74\xb7\x1c\xd2\xb1"
- "\xff\x80\x2e\x48\x7d\x82\xf8\xb9"
- "\xaf\x94\x87",
- .klen = 19,
- .iv = "\x78\x35\x82\x81\x7f\x88\x94\x68",
- .alen = 0,
- .input = "\x41\x3c\xb8\x87\x73\xcb\xf3\xf3",
- .ilen = 8,
- .result = "\x00",
- .rlen = 0,
- }, {
- .key = "\x61\x0e\x8c\xae\xe3\x23\xb6\x38"
- "\x76\x1c\xf6\x3a\x67\xa3\x9c\xd8"
- "\xc6\xfb\x7d",
- .klen = 19,
- .iv = "\x80\x0d\x13\xab\xd8\xa6\xb2\xd8",
- .assoc = "\xf3\x94\x87\x78\x35\x82\x81\x7f"
- "\x88\x94\x68\xb1\x78\x6b\x2b\xd6"
- "\x04\x1f\x4e\xed\x78\xd5\x33\x66"
- "\xd8\x94\x99\x91\x81\x54\x62\x57",
- .alen = 32,
- .input = "\xf0\x7c\x29\x02\xae\x1c\x2f\x55"
- "\xd0\xd1\x3d\x1a\xa3\x6d\xe4\x0a"
- "\x86\xb0\x87\x6b\x62\x33\x8c\x34"
- "\xce\xab\x57\xcc\x79\x0b\xe0\x6f"
- "\x5c\x3e\x48\x1f\x6c\x46\xf7\x51"
- "\x8b\x84\x83\x2a\xc1\x05\xb8\xc5",
- .ilen = 48,
- .result = "\x50\x82\x3e\x07\xe2\x1e\xb6\xfb"
- "\x33\xe4\x73\xce\xd2\xfb\x95\x79"
- "\xe8\xb4\xb5\x77\x11\x10\x62\x6f"
- "\x6a\x82\xd1\x13\xec\xf5\xd0\x48",
- .rlen = 32,
- .novrfy = 1,
- }, {
- .key = "\x61\x0e\x8c\xae\xe3\x23\xb6\x38"
- "\x76\x1c\xf6\x3a\x67\xa3\x9c\xd8"
- "\x05\xe0\xc9",
- .klen = 19,
- .iv = "\x0f\xed\x34\xea\x97\xd4\x3b\xdf",
- .assoc = "\x49\x5c\x50\x1f\x1d\x94\xcc\x81"
- "\xba\xb7\xb6\x03\xaf\xa5\xc1\xa1"
- "\xd8\x5c\x42\x68\xe0\x6c\xda\x89"
- "\x05\xac\x56\xac\x1b\x2a\xd3\x86",
- .alen = 32,
- .input = "\x39\xbe\x7d\x15\x62\x77\xf3\x3c"
- "\xad\x83\x52\x6d\x71\x03\x25\x1c"
- "\xed\x81\x3a\x9a\x16\x7d\x19\x80"
- "\x72\x04\x72\xd0\xf6\xff\x05\x0f"
- "\xb7\x14\x30\x00\x32\x9e\xa0\xa6"
- "\x9e\x5a\x18\xa1\xb8\xfe\xdb\xd3",
- .ilen = 48,
- .result = "\x75\x05\xbe\xc2\xd9\x1e\xde\x60"
- "\x47\x3d\x8c\x7d\xbd\xb5\xd9\xb7"
- "\xf2\xae\x61\x05\x8f\x82\x24\x3f"
- "\x9c\x67\x91\xe1\x38\x4f\xe4\x0c",
- .rlen = 32,
- }, {
- .key = "\x39\xbb\xa7\xbe\x59\x97\x9e\x73"
- "\xa2\xbc\x6b\x98\xd7\x75\x7f\xe3"
- "\xa4\x48\x93\x39\x26\x71\x4a\xc6"
- "\xee\x49\x83",
- .klen = 27,
- .iv = "\xe9\xa9\xff\xe9\x57\xba\xfd\x9e",
- .assoc = "\x44\xa6\x2c\x05\xe9\xe1\x43\xb1"
- "\x58\x7c\xf2\x5c\x6d\x39\x0a\x64"
- "\xa4\xf0\x13\x05\xd1\x77\x99\x67"
- "\x11\xc4\xc6\xdb\x00\x56\x36\x61",
- .alen = 32,
- .input = "\x71\x99\xfa\xf4\x44\x12\x68\x9b",
- .ilen = 8,
- .result = "\x00",
- .rlen = 0,
- }, {
- .key = "\x58\x5d\xa0\x96\x65\x1a\x04\xd7"
- "\x96\xe5\xc5\x68\xaa\x95\x35\xe0"
- "\x29\xa0\xba\x9e\x48\x78\xd1\xba"
- "\xee\x49\x83",
- .klen = 27,
- .iv = "\xe9\xa9\xff\xe9\x57\xba\xfd\x9e",
- .assoc = "\x44\xa6\x2c\x05\xe9\xe1\x43\xb1"
- "\x58\x7c\xf2\x5c\x6d\x39\x0a\x64"
- "\xa4\xf0\x13\x05\xd1\x77\x99\x67"
- "\x11\xc4\xc6\xdb\x00\x56\x36\x61",
- .alen = 32,
- .input = "\xfb\xe5\x5d\x34\xbe\xe5\xe8\xe7"
- "\x5a\xef\x2f\xbf\x1f\x7f\xd4\xb2"
- "\x66\xca\x61\x1e\x96\x7a\x61\xb3"
- "\x1c\x16\x45\x52\xba\x04\x9c\x9f"
- "\xb1\xd2\x40\xbc\x52\x7c\x6f\xb1",
- .ilen = 40,
- .result = "\x85\x34\x66\x42\xc8\x92\x0f\x36"
- "\x58\xe0\x6b\x91\x3c\x98\x5c\xbb"
- "\x0a\x85\xcc\x02\xad\x7a\x96\xe9"
- "\x65\x43\xa4\xc3\x0f\xdc\x55\x81",
- .rlen = 32,
- }, {
- .key = "\x58\x5d\xa0\x96\x65\x1a\x04\xd7"
- "\x96\xe5\xc5\x68\xaa\x95\x35\xe0"
- "\x29\xa0\xba\x9e\x48\x78\xd1\xba"
- "\xd1\xfc\x57",
- .klen = 27,
- .iv = "\x9c\xfe\xb8\x9c\xad\x71\xaa\x1f",
- .assoc = "\x86\x67\xa5\xa9\x14\x5f\x0d\xc6"
- "\xff\x14\xc7\x44\xbf\x6c\x3a\xc3"
- "\xff\xb6\x81\xbd\xe2\xd5\x06\xc7"
- "\x3c\xa1\x52\x13\x03\x8a\x23\x3a",
- .alen = 32,
- .input = "\x3f\x66\xb0\x9d\xe5\x4b\x38\x00"
- "\xc6\x0e\x6e\xe5\xd6\x98\xa6\x37"
- "\x8c\x26\x33\xc6\xb2\xa2\x17\xfa"
- "\x64\x19\xc0\x30\xd7\xfc\x14\x6b"
- "\xe3\x33\xc2\x04\xb0\x37\xbe\x3f"
- "\xa9\xb4\x2d\x68\x03\xa3\x44\xef",
- .ilen = 48,
- .result = "\x02\x87\x4d\x28\x80\x6e\xb2\xed"
- "\x99\x2a\xa8\xca\x04\x25\x45\x90"
- "\x1d\xdd\x5a\xd9\xe4\xdb\x9c\x9c"
- "\x49\xe9\x01\xfe\xa7\x80\x6d\x6b",
- .rlen = 32,
- .novrfy = 1,
- }, {
- .key = "\xa4\x4b\x54\x29\x0a\xb8\x6d\x01"
- "\x5b\x80\x2a\xcf\x25\xc4\xb7\x5c"
- "\x20\x2c\xad\x30\xc2\x2b\x41\xfb"
- "\x0e\x85\xbc\x33\xad\x0f\x2b\xff"
- "\xee\x49\x83",
- .klen = 35,
- .iv = "\xe9\xa9\xff\xe9\x57\xba\xfd\x9e",
- .alen = 0,
- .input = "\x1f\xb8\x8f\xa3\xdd\x54\x00\xf2",
- .ilen = 8,
- .result = "\x00",
- .rlen = 0,
- }, {
- .key = "\x39\xbb\xa7\xbe\x59\x97\x9e\x73"
- "\xa2\xbc\x6b\x98\xd7\x75\x7f\xe3"
- "\xa4\x48\x93\x39\x26\x71\x4a\xc6"
- "\xae\x8f\x11\x4c\xc2\x9c\x4a\xbb"
- "\x85\x34\x66",
- .klen = 35,
- .iv = "\x42\xc8\x92\x0f\x36\x58\xe0\x6b",
- .alen = 0,
- .input = "\x48\x01\x5e\x02\x24\x04\x66\x47"
- "\xa1\xea\x6f\xaf\xe8\xfc\xfb\xdd"
- "\xa5\xa9\x87\x8d\x84\xee\x2e\x77"
- "\xbb\x86\xb9\xf5\x5c\x6c\xff\xf6"
- "\x72\xc3\x8e\xf7\x70\xb1\xb2\x07"
- "\xbc\xa8\xa3\xbd\x83\x7c\x1d\x2a",
- .ilen = 48,
- .result = "\xdc\x56\xf2\x71\xb0\xb1\xa0\x6c"
- "\xf0\x97\x3a\xfb\x6d\xe7\x32\x99"
- "\x3e\xaf\x70\x5e\xb2\x4d\xea\x39"
- "\x89\xd4\x75\x7a\x63\xb1\xda\x93",
- .rlen = 32,
- .novrfy = 1,
- }, {
- .key = "\x58\x5d\xa0\x96\x65\x1a\x04\xd7"
- "\x96\xe5\xc5\x68\xaa\x95\x35\xe0"
- "\x29\xa0\xba\x9e\x48\x78\xd1\xba"
- "\x0d\x1a\x53\x3b\xb5\xe3\xf8\x8b"
- "\xcf\x76\x3f",
- .klen = 35,
- .iv = "\xd9\x95\x75\x8f\x44\x89\x40\x7b",
- .assoc = "\x8f\x86\x6c\x4d\x1d\xc5\x39\x88"
- "\xc8\xf3\x5c\x52\x10\x63\x6f\x2b"
- "\x8a\x2a\xc5\x6f\x30\x23\x58\x7b"
- "\xfb\x36\x03\x11\xb4\xd9\xf2\xfe",
- .alen = 32,
- .input = "\x48\x58\xd6\xf3\xad\x63\x58\xbf"
- "\xae\xc7\x5e\xae\x83\x8f\x7b\xe4"
- "\x78\x5c\x4c\x67\x71\x89\x94\xbf"
- "\x47\xf1\x63\x7e\x1c\x59\xbd\xc5"
- "\x7f\x44\x0a\x0c\x01\x18\x07\x92"
- "\xe1\xd3\x51\xce\x32\x6d\x0c\x5b",
- .ilen = 48,
- .result = "\xc2\x54\xc8\xde\x78\x87\x77\x40"
- "\x49\x71\xe4\xb7\xe7\xcb\x76\x61"
- "\x0a\x41\xb9\xe9\xc0\x76\x54\xab"
- "\x04\x49\x3b\x19\x93\x57\x25\x5d",
- .rlen = 32,
- },
-};
-
-/*
- * ANSI X9.31 Continuous Pseudo-Random Number Generator (
- * test vectors, taken from Appendix B.2.9 and B.2.10:
- * http://csrc.nist.gov/groups/STM/cavp/documents/rng/RNGVS.pdf
- * Only AES-128 is supported at this time.
- */
-#define ANSI_CPRNG_AES_TEST_VECTORS 6
-
-static struct cprng_testvec ansi_cprng_aes_tv_template[] = {
- {
- .key = "\xf3\xb1\x66\x6d\x13\x60\x72\x42"
- "\xed\x06\x1c\xab\xb8\xd4\x62\x02",
- .klen = 16,
- .dt = "\xe6\xb3\xbe\x78\x2a\x23\xfa\x62"
- "\xd7\x1d\x4a\xfb\xb0\xe9\x22\xf9",
- .dtlen = 16,
- .v = "\x80\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .vlen = 16,
- .result = "\x59\x53\x1e\xd1\x3b\xb0\xc0\x55"
- "\x84\x79\x66\x85\xc1\x2f\x76\x41",
- .rlen = 16,
- .loops = 1,
- }, {
- .key = "\xf3\xb1\x66\x6d\x13\x60\x72\x42"
- "\xed\x06\x1c\xab\xb8\xd4\x62\x02",
- .klen = 16,
- .dt = "\xe6\xb3\xbe\x78\x2a\x23\xfa\x62"
- "\xd7\x1d\x4a\xfb\xb0\xe9\x22\xfa",
- .dtlen = 16,
- .v = "\xc0\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .vlen = 16,
- .result = "\x7c\x22\x2c\xf4\xca\x8f\xa2\x4c"
- "\x1c\x9c\xb6\x41\xa9\xf3\x22\x0d",
- .rlen = 16,
- .loops = 1,
- }, {
- .key = "\xf3\xb1\x66\x6d\x13\x60\x72\x42"
- "\xed\x06\x1c\xab\xb8\xd4\x62\x02",
- .klen = 16,
- .dt = "\xe6\xb3\xbe\x78\x2a\x23\xfa\x62"
- "\xd7\x1d\x4a\xfb\xb0\xe9\x22\xfb",
- .dtlen = 16,
- .v = "\xe0\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .vlen = 16,
- .result = "\x8a\xaa\x00\x39\x66\x67\x5b\xe5"
- "\x29\x14\x28\x81\xa9\x4d\x4e\xc7",
- .rlen = 16,
- .loops = 1,
- }, {
- .key = "\xf3\xb1\x66\x6d\x13\x60\x72\x42"
- "\xed\x06\x1c\xab\xb8\xd4\x62\x02",
- .klen = 16,
- .dt = "\xe6\xb3\xbe\x78\x2a\x23\xfa\x62"
- "\xd7\x1d\x4a\xfb\xb0\xe9\x22\xfc",
- .dtlen = 16,
- .v = "\xf0\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .vlen = 16,
- .result = "\x88\xdd\xa4\x56\x30\x24\x23\xe5"
- "\xf6\x9d\xa5\x7e\x7b\x95\xc7\x3a",
- .rlen = 16,
- .loops = 1,
- }, {
- .key = "\xf3\xb1\x66\x6d\x13\x60\x72\x42"
- "\xed\x06\x1c\xab\xb8\xd4\x62\x02",
- .klen = 16,
- .dt = "\xe6\xb3\xbe\x78\x2a\x23\xfa\x62"
- "\xd7\x1d\x4a\xfb\xb0\xe9\x22\xfd",
- .dtlen = 16,
- .v = "\xf8\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .vlen = 16,
- .result = "\x05\x25\x92\x46\x61\x79\xd2\xcb"
- "\x78\xc4\x0b\x14\x0a\x5a\x9a\xc8",
- .rlen = 16,
- .loops = 1,
- }, { /* Monte Carlo Test */
- .key = "\x9f\x5b\x51\x20\x0b\xf3\x34\xb5"
- "\xd8\x2b\xe8\xc3\x72\x55\xc8\x48",
- .klen = 16,
- .dt = "\x63\x76\xbb\xe5\x29\x02\xba\x3b"
- "\x67\xc9\x25\xfa\x70\x1f\x11\xac",
- .dtlen = 16,
- .v = "\x57\x2c\x8e\x76\x87\x26\x47\x97"
- "\x7e\x74\xfb\xdd\xc4\x95\x01\xd1",
- .vlen = 16,
- .result = "\x48\xe9\xbd\x0d\x06\xee\x18\xfb"
- "\xe4\x57\x90\xd5\xc3\xfc\x9b\x73",
- .rlen = 16,
- .loops = 10000,
- },
-};
-
-/* Cast5 test vectors from RFC 2144 */
-#define CAST5_ENC_TEST_VECTORS 3
-#define CAST5_DEC_TEST_VECTORS 3
-
-static struct cipher_testvec cast5_enc_tv_template[] = {
- {
- .key = "\x01\x23\x45\x67\x12\x34\x56\x78"
- "\x23\x45\x67\x89\x34\x56\x78\x9a",
- .klen = 16,
- .input = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .ilen = 8,
- .result = "\x23\x8b\x4f\xe5\x84\x7e\x44\xb2",
- .rlen = 8,
- }, {
- .key = "\x01\x23\x45\x67\x12\x34\x56\x78"
- "\x23\x45",
- .klen = 10,
- .input = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .ilen = 8,
- .result = "\xeb\x6a\x71\x1a\x2c\x02\x27\x1b",
- .rlen = 8,
- }, {
- .key = "\x01\x23\x45\x67\x12",
- .klen = 5,
- .input = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .ilen = 8,
- .result = "\x7a\xc8\x16\xd1\x6e\x9b\x30\x2e",
- .rlen = 8,
- },
-};
-
-static struct cipher_testvec cast5_dec_tv_template[] = {
- {
- .key = "\x01\x23\x45\x67\x12\x34\x56\x78"
- "\x23\x45\x67\x89\x34\x56\x78\x9a",
- .klen = 16,
- .input = "\x23\x8b\x4f\xe5\x84\x7e\x44\xb2",
- .ilen = 8,
- .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .rlen = 8,
- }, {
- .key = "\x01\x23\x45\x67\x12\x34\x56\x78"
- "\x23\x45",
- .klen = 10,
- .input = "\xeb\x6a\x71\x1a\x2c\x02\x27\x1b",
- .ilen = 8,
- .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .rlen = 8,
- }, {
- .key = "\x01\x23\x45\x67\x12",
- .klen = 5,
- .input = "\x7a\xc8\x16\xd1\x6e\x9b\x30\x2e",
- .ilen = 8,
- .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .rlen = 8,
- },
-};
-
-/*
- * ARC4 test vectors from OpenSSL
- */
-#define ARC4_ENC_TEST_VECTORS 7
-#define ARC4_DEC_TEST_VECTORS 7
-
-static struct cipher_testvec arc4_enc_tv_template[] = {
- {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .input = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .ilen = 8,
- .result = "\x75\xb7\x87\x80\x99\xe0\xc5\x96",
- .rlen = 8,
- }, {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .input = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .ilen = 8,
- .result = "\x74\x94\xc2\xe7\x10\x4b\x08\x79",
- .rlen = 8,
- }, {
- .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .klen = 8,
- .input = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .ilen = 8,
- .result = "\xde\x18\x89\x41\xa3\x37\x5d\x3a",
- .rlen = 8,
- }, {
- .key = "\xef\x01\x23\x45",
- .klen = 4,
- .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00",
- .ilen = 20,
- .result = "\xd6\xa1\x41\xa7\xec\x3c\x38\xdf"
- "\xbd\x61\x5a\x11\x62\xe1\xc7\xba"
- "\x36\xb6\x78\x58",
- .rlen = 20,
- }, {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .input = "\x12\x34\x56\x78\x9A\xBC\xDE\xF0"
- "\x12\x34\x56\x78\x9A\xBC\xDE\xF0"
- "\x12\x34\x56\x78\x9A\xBC\xDE\xF0"
- "\x12\x34\x56\x78",
- .ilen = 28,
- .result = "\x66\xa0\x94\x9f\x8a\xf7\xd6\x89"
- "\x1f\x7f\x83\x2b\xa8\x33\xc0\x0c"
- "\x89\x2e\xbe\x30\x14\x3c\xe2\x87"
- "\x40\x01\x1e\xcf",
- .rlen = 28,
- }, {
- .key = "\xef\x01\x23\x45",
- .klen = 4,
- .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00",
- .ilen = 10,
- .result = "\xd6\xa1\x41\xa7\xec\x3c\x38\xdf"
- "\xbd\x61",
- .rlen = 10,
- }, {
- .key = "\x01\x23\x45\x67\x89\xAB\xCD\xEF"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .klen = 16,
- .input = "\x01\x23\x45\x67\x89\xAB\xCD\xEF",
- .ilen = 8,
- .result = "\x69\x72\x36\x59\x1B\x52\x42\xB1",
- .rlen = 8,
- },
-};
-
-static struct cipher_testvec arc4_dec_tv_template[] = {
- {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .input = "\x75\xb7\x87\x80\x99\xe0\xc5\x96",
- .ilen = 8,
- .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .rlen = 8,
- }, {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .input = "\x74\x94\xc2\xe7\x10\x4b\x08\x79",
- .ilen = 8,
- .result = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .rlen = 8,
- }, {
- .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .klen = 8,
- .input = "\xde\x18\x89\x41\xa3\x37\x5d\x3a",
- .ilen = 8,
- .result = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .rlen = 8,
- }, {
- .key = "\xef\x01\x23\x45",
- .klen = 4,
- .input = "\xd6\xa1\x41\xa7\xec\x3c\x38\xdf"
- "\xbd\x61\x5a\x11\x62\xe1\xc7\xba"
- "\x36\xb6\x78\x58",
- .ilen = 20,
- .result = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00",
- .rlen = 20,
- }, {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
- .klen = 8,
- .input = "\x66\xa0\x94\x9f\x8a\xf7\xd6\x89"
- "\x1f\x7f\x83\x2b\xa8\x33\xc0\x0c"
- "\x89\x2e\xbe\x30\x14\x3c\xe2\x87"
- "\x40\x01\x1e\xcf",
- .ilen = 28,
- .result = "\x12\x34\x56\x78\x9A\xBC\xDE\xF0"
- "\x12\x34\x56\x78\x9A\xBC\xDE\xF0"
- "\x12\x34\x56\x78\x9A\xBC\xDE\xF0"
- "\x12\x34\x56\x78",
- .rlen = 28,
- }, {
- .key = "\xef\x01\x23\x45",
- .klen = 4,
- .input = "\xd6\xa1\x41\xa7\xec\x3c\x38\xdf"
- "\xbd\x61",
- .ilen = 10,
- .result = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00",
- .rlen = 10,
- }, {
- .key = "\x01\x23\x45\x67\x89\xAB\xCD\xEF"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .klen = 16,
- .input = "\x69\x72\x36\x59\x1B\x52\x42\xB1",
- .ilen = 8,
- .result = "\x01\x23\x45\x67\x89\xAB\xCD\xEF",
- .rlen = 8,
- },
-};
-
-/*
- * TEA test vectors
- */
-#define TEA_ENC_TEST_VECTORS 4
-#define TEA_DEC_TEST_VECTORS 4
-
-static struct cipher_testvec tea_enc_tv_template[] = {
- {
- .key = zeroed_string,
- .klen = 16,
- .input = zeroed_string,
- .ilen = 8,
- .result = "\x0a\x3a\xea\x41\x40\xa9\xba\x94",
- .rlen = 8,
- }, {
- .key = "\x2b\x02\x05\x68\x06\x14\x49\x76"
- "\x77\x5d\x0e\x26\x6c\x28\x78\x43",
- .klen = 16,
- .input = "\x74\x65\x73\x74\x20\x6d\x65\x2e",
- .ilen = 8,
- .result = "\x77\x5d\x2a\x6a\xf6\xce\x92\x09",
- .rlen = 8,
- }, {
- .key = "\x09\x65\x43\x11\x66\x44\x39\x25"
- "\x51\x3a\x16\x10\x0a\x08\x12\x6e",
- .klen = 16,
- .input = "\x6c\x6f\x6e\x67\x65\x72\x5f\x74"
- "\x65\x73\x74\x5f\x76\x65\x63\x74",
- .ilen = 16,
- .result = "\xbe\x7a\xbb\x81\x95\x2d\x1f\x1e"
- "\xdd\x89\xa1\x25\x04\x21\xdf\x95",
- .rlen = 16,
- }, {
- .key = "\x4d\x76\x32\x17\x05\x3f\x75\x2c"
- "\x5d\x04\x16\x36\x15\x72\x63\x2f",
- .klen = 16,
- .input = "\x54\x65\x61\x20\x69\x73\x20\x67"
- "\x6f\x6f\x64\x20\x66\x6f\x72\x20"
- "\x79\x6f\x75\x21\x21\x21\x20\x72"
- "\x65\x61\x6c\x6c\x79\x21\x21\x21",
- .ilen = 32,
- .result = "\xe0\x4d\x5d\x3c\xb7\x8c\x36\x47"
- "\x94\x18\x95\x91\xa9\xfc\x49\xf8"
- "\x44\xd1\x2d\xc2\x99\xb8\x08\x2a"
- "\x07\x89\x73\xc2\x45\x92\xc6\x90",
- .rlen = 32,
- }
-};
-
-static struct cipher_testvec tea_dec_tv_template[] = {
- {
- .key = zeroed_string,
- .klen = 16,
- .input = "\x0a\x3a\xea\x41\x40\xa9\xba\x94",
- .ilen = 8,
- .result = zeroed_string,
- .rlen = 8,
- }, {
- .key = "\x2b\x02\x05\x68\x06\x14\x49\x76"
- "\x77\x5d\x0e\x26\x6c\x28\x78\x43",
- .klen = 16,
- .input = "\x77\x5d\x2a\x6a\xf6\xce\x92\x09",
- .ilen = 8,
- .result = "\x74\x65\x73\x74\x20\x6d\x65\x2e",
- .rlen = 8,
- }, {
- .key = "\x09\x65\x43\x11\x66\x44\x39\x25"
- "\x51\x3a\x16\x10\x0a\x08\x12\x6e",
- .klen = 16,
- .input = "\xbe\x7a\xbb\x81\x95\x2d\x1f\x1e"
- "\xdd\x89\xa1\x25\x04\x21\xdf\x95",
- .ilen = 16,
- .result = "\x6c\x6f\x6e\x67\x65\x72\x5f\x74"
- "\x65\x73\x74\x5f\x76\x65\x63\x74",
- .rlen = 16,
- }, {
- .key = "\x4d\x76\x32\x17\x05\x3f\x75\x2c"
- "\x5d\x04\x16\x36\x15\x72\x63\x2f",
- .klen = 16,
- .input = "\xe0\x4d\x5d\x3c\xb7\x8c\x36\x47"
- "\x94\x18\x95\x91\xa9\xfc\x49\xf8"
- "\x44\xd1\x2d\xc2\x99\xb8\x08\x2a"
- "\x07\x89\x73\xc2\x45\x92\xc6\x90",
- .ilen = 32,
- .result = "\x54\x65\x61\x20\x69\x73\x20\x67"
- "\x6f\x6f\x64\x20\x66\x6f\x72\x20"
- "\x79\x6f\x75\x21\x21\x21\x20\x72"
- "\x65\x61\x6c\x6c\x79\x21\x21\x21",
- .rlen = 32,
- }
-};
-
-/*
- * XTEA test vectors
- */
-#define XTEA_ENC_TEST_VECTORS 4
-#define XTEA_DEC_TEST_VECTORS 4
-
-static struct cipher_testvec xtea_enc_tv_template[] = {
- {
- .key = zeroed_string,
- .klen = 16,
- .input = zeroed_string,
- .ilen = 8,
- .result = "\xd8\xd4\xe9\xde\xd9\x1e\x13\xf7",
- .rlen = 8,
- }, {
- .key = "\x2b\x02\x05\x68\x06\x14\x49\x76"
- "\x77\x5d\x0e\x26\x6c\x28\x78\x43",
- .klen = 16,
- .input = "\x74\x65\x73\x74\x20\x6d\x65\x2e",
- .ilen = 8,
- .result = "\x94\xeb\xc8\x96\x84\x6a\x49\xa8",
- .rlen = 8,
- }, {
- .key = "\x09\x65\x43\x11\x66\x44\x39\x25"
- "\x51\x3a\x16\x10\x0a\x08\x12\x6e",
- .klen = 16,
- .input = "\x6c\x6f\x6e\x67\x65\x72\x5f\x74"
- "\x65\x73\x74\x5f\x76\x65\x63\x74",
- .ilen = 16,
- .result = "\x3e\xce\xae\x22\x60\x56\xa8\x9d"
- "\x77\x4d\xd4\xb4\x87\x24\xe3\x9a",
- .rlen = 16,
- }, {
- .key = "\x4d\x76\x32\x17\x05\x3f\x75\x2c"
- "\x5d\x04\x16\x36\x15\x72\x63\x2f",
- .klen = 16,
- .input = "\x54\x65\x61\x20\x69\x73\x20\x67"
- "\x6f\x6f\x64\x20\x66\x6f\x72\x20"
- "\x79\x6f\x75\x21\x21\x21\x20\x72"
- "\x65\x61\x6c\x6c\x79\x21\x21\x21",
- .ilen = 32,
- .result = "\x99\x81\x9f\x5d\x6f\x4b\x31\x3a"
- "\x86\xff\x6f\xd0\xe3\x87\x70\x07"
- "\x4d\xb8\xcf\xf3\x99\x50\xb3\xd4"
- "\x73\xa2\xfa\xc9\x16\x59\x5d\x81",
- .rlen = 32,
- }
-};
-
-static struct cipher_testvec xtea_dec_tv_template[] = {
- {
- .key = zeroed_string,
- .klen = 16,
- .input = "\xd8\xd4\xe9\xde\xd9\x1e\x13\xf7",
- .ilen = 8,
- .result = zeroed_string,
- .rlen = 8,
- }, {
- .key = "\x2b\x02\x05\x68\x06\x14\x49\x76"
- "\x77\x5d\x0e\x26\x6c\x28\x78\x43",
- .klen = 16,
- .input = "\x94\xeb\xc8\x96\x84\x6a\x49\xa8",
- .ilen = 8,
- .result = "\x74\x65\x73\x74\x20\x6d\x65\x2e",
- .rlen = 8,
- }, {
- .key = "\x09\x65\x43\x11\x66\x44\x39\x25"
- "\x51\x3a\x16\x10\x0a\x08\x12\x6e",
- .klen = 16,
- .input = "\x3e\xce\xae\x22\x60\x56\xa8\x9d"
- "\x77\x4d\xd4\xb4\x87\x24\xe3\x9a",
- .ilen = 16,
- .result = "\x6c\x6f\x6e\x67\x65\x72\x5f\x74"
- "\x65\x73\x74\x5f\x76\x65\x63\x74",
- .rlen = 16,
- }, {
- .key = "\x4d\x76\x32\x17\x05\x3f\x75\x2c"
- "\x5d\x04\x16\x36\x15\x72\x63\x2f",
- .klen = 16,
- .input = "\x99\x81\x9f\x5d\x6f\x4b\x31\x3a"
- "\x86\xff\x6f\xd0\xe3\x87\x70\x07"
- "\x4d\xb8\xcf\xf3\x99\x50\xb3\xd4"
- "\x73\xa2\xfa\xc9\x16\x59\x5d\x81",
- .ilen = 32,
- .result = "\x54\x65\x61\x20\x69\x73\x20\x67"
- "\x6f\x6f\x64\x20\x66\x6f\x72\x20"
- "\x79\x6f\x75\x21\x21\x21\x20\x72"
- "\x65\x61\x6c\x6c\x79\x21\x21\x21",
- .rlen = 32,
- }
-};
-
-/*
- * KHAZAD test vectors.
- */
-#define KHAZAD_ENC_TEST_VECTORS 5
-#define KHAZAD_DEC_TEST_VECTORS 5
-
-static struct cipher_testvec khazad_enc_tv_template[] = {
- {
- .key = "\x80\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .klen = 16,
- .input = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .ilen = 8,
- .result = "\x49\xa4\xce\x32\xac\x19\x0e\x3f",
- .rlen = 8,
- }, {
- .key = "\x38\x38\x38\x38\x38\x38\x38\x38"
- "\x38\x38\x38\x38\x38\x38\x38\x38",
- .klen = 16,
- .input = "\x38\x38\x38\x38\x38\x38\x38\x38",
- .ilen = 8,
- .result = "\x7e\x82\x12\xa1\xd9\x5b\xe4\xf9",
- .rlen = 8,
- }, {
- .key = "\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2"
- "\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2",
- .klen = 16,
- .input = "\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2",
- .ilen = 8,
- .result = "\xaa\xbe\xc1\x95\xc5\x94\x1a\x9c",
- .rlen = 8,
- }, {
- .key = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f"
- "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
- .klen = 16,
- .input = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
- .ilen = 8,
- .result = "\x04\x74\xf5\x70\x50\x16\xd3\xb8",
- .rlen = 8,
- }, {
- .key = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f"
- "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
- .klen = 16,
- .input = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f"
- "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
- .ilen = 16,
- .result = "\x04\x74\xf5\x70\x50\x16\xd3\xb8"
- "\x04\x74\xf5\x70\x50\x16\xd3\xb8",
- .rlen = 16,
- },
-};
-
-static struct cipher_testvec khazad_dec_tv_template[] = {
- {
- .key = "\x80\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .klen = 16,
- .input = "\x49\xa4\xce\x32\xac\x19\x0e\x3f",
- .ilen = 8,
- .result = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .rlen = 8,
- }, {
- .key = "\x38\x38\x38\x38\x38\x38\x38\x38"
- "\x38\x38\x38\x38\x38\x38\x38\x38",
- .klen = 16,
- .input = "\x7e\x82\x12\xa1\xd9\x5b\xe4\xf9",
- .ilen = 8,
- .result = "\x38\x38\x38\x38\x38\x38\x38\x38",
- .rlen = 8,
- }, {
- .key = "\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2"
- "\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2",
- .klen = 16,
- .input = "\xaa\xbe\xc1\x95\xc5\x94\x1a\x9c",
- .ilen = 8,
- .result = "\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2",
- .rlen = 8,
- }, {
- .key = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f"
- "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
- .klen = 16,
- .input = "\x04\x74\xf5\x70\x50\x16\xd3\xb8",
- .ilen = 8,
- .result = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
- .rlen = 8,
- }, {
- .key = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f"
- "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
- .klen = 16,
- .input = "\x04\x74\xf5\x70\x50\x16\xd3\xb8"
- "\x04\x74\xf5\x70\x50\x16\xd3\xb8",
- .ilen = 16,
- .result = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f"
- "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
- .rlen = 16,
- },
-};
-
-/*
- * Anubis test vectors.
- */
-
-#define ANUBIS_ENC_TEST_VECTORS 5
-#define ANUBIS_DEC_TEST_VECTORS 5
-#define ANUBIS_CBC_ENC_TEST_VECTORS 2
-#define ANUBIS_CBC_DEC_TEST_VECTORS 2
-
-static struct cipher_testvec anubis_enc_tv_template[] = {
- {
- .key = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
- "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
- .klen = 16,
- .input = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
- "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
- .ilen = 16,
- .result = "\x6d\xc5\xda\xa2\x26\x7d\x62\x6f"
- "\x08\xb7\x52\x8e\x6e\x6e\x86\x90",
- .rlen = 16,
- }, {
-
- .key = "\x03\x03\x03\x03\x03\x03\x03\x03"
- "\x03\x03\x03\x03\x03\x03\x03\x03"
- "\x03\x03\x03\x03",
- .klen = 20,
- .input = "\x03\x03\x03\x03\x03\x03\x03\x03"
- "\x03\x03\x03\x03\x03\x03\x03\x03",
- .ilen = 16,
- .result = "\xdb\xf1\x42\xf4\xd1\x8a\xc7\x49"
- "\x87\x41\x6f\x82\x0a\x98\x64\xae",
- .rlen = 16,
- }, {
- .key = "\x24\x24\x24\x24\x24\x24\x24\x24"
- "\x24\x24\x24\x24\x24\x24\x24\x24"
- "\x24\x24\x24\x24\x24\x24\x24\x24"
- "\x24\x24\x24\x24",
- .klen = 28,
- .input = "\x24\x24\x24\x24\x24\x24\x24\x24"
- "\x24\x24\x24\x24\x24\x24\x24\x24",
- .ilen = 16,
- .result = "\xfd\x1b\x4a\xe3\xbf\xf0\xad\x3d"
- "\x06\xd3\x61\x27\xfd\x13\x9e\xde",
- .rlen = 16,
- }, {
- .key = "\x25\x25\x25\x25\x25\x25\x25\x25"
- "\x25\x25\x25\x25\x25\x25\x25\x25"
- "\x25\x25\x25\x25\x25\x25\x25\x25"
- "\x25\x25\x25\x25\x25\x25\x25\x25",
- .klen = 32,
- .input = "\x25\x25\x25\x25\x25\x25\x25\x25"
- "\x25\x25\x25\x25\x25\x25\x25\x25",
- .ilen = 16,
- .result = "\x1a\x91\xfb\x2b\xb7\x78\x6b\xc4"
- "\x17\xd9\xff\x40\x3b\x0e\xe5\xfe",
- .rlen = 16,
- }, {
- .key = "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35",
- .klen = 40,
- .input = "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35",
- .ilen = 16,
- .result = "\xa5\x2c\x85\x6f\x9c\xba\xa0\x97"
- "\x9e\xc6\x84\x0f\x17\x21\x07\xee",
- .rlen = 16,
- },
-};
-
-static struct cipher_testvec anubis_dec_tv_template[] = {
- {
- .key = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
- "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
- .klen = 16,
- .input = "\x6d\xc5\xda\xa2\x26\x7d\x62\x6f"
- "\x08\xb7\x52\x8e\x6e\x6e\x86\x90",
- .ilen = 16,
- .result = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
- "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
- .rlen = 16,
- }, {
-
- .key = "\x03\x03\x03\x03\x03\x03\x03\x03"
- "\x03\x03\x03\x03\x03\x03\x03\x03"
- "\x03\x03\x03\x03",
- .klen = 20,
- .input = "\xdb\xf1\x42\xf4\xd1\x8a\xc7\x49"
- "\x87\x41\x6f\x82\x0a\x98\x64\xae",
- .ilen = 16,
- .result = "\x03\x03\x03\x03\x03\x03\x03\x03"
- "\x03\x03\x03\x03\x03\x03\x03\x03",
- .rlen = 16,
- }, {
- .key = "\x24\x24\x24\x24\x24\x24\x24\x24"
- "\x24\x24\x24\x24\x24\x24\x24\x24"
- "\x24\x24\x24\x24\x24\x24\x24\x24"
- "\x24\x24\x24\x24",
- .klen = 28,
- .input = "\xfd\x1b\x4a\xe3\xbf\xf0\xad\x3d"
- "\x06\xd3\x61\x27\xfd\x13\x9e\xde",
- .ilen = 16,
- .result = "\x24\x24\x24\x24\x24\x24\x24\x24"
- "\x24\x24\x24\x24\x24\x24\x24\x24",
- .rlen = 16,
- }, {
- .key = "\x25\x25\x25\x25\x25\x25\x25\x25"
- "\x25\x25\x25\x25\x25\x25\x25\x25"
- "\x25\x25\x25\x25\x25\x25\x25\x25"
- "\x25\x25\x25\x25\x25\x25\x25\x25",
- .klen = 32,
- .input = "\x1a\x91\xfb\x2b\xb7\x78\x6b\xc4"
- "\x17\xd9\xff\x40\x3b\x0e\xe5\xfe",
- .ilen = 16,
- .result = "\x25\x25\x25\x25\x25\x25\x25\x25"
- "\x25\x25\x25\x25\x25\x25\x25\x25",
- .rlen = 16,
- }, {
- .key = "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35",
- .input = "\xa5\x2c\x85\x6f\x9c\xba\xa0\x97"
- "\x9e\xc6\x84\x0f\x17\x21\x07\xee",
- .klen = 40,
- .ilen = 16,
- .result = "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35",
- .rlen = 16,
- },
-};
-
-static struct cipher_testvec anubis_cbc_enc_tv_template[] = {
- {
- .key = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
- "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
- .klen = 16,
- .input = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
- "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
- "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
- "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
- .ilen = 32,
- .result = "\x6d\xc5\xda\xa2\x26\x7d\x62\x6f"
- "\x08\xb7\x52\x8e\x6e\x6e\x86\x90"
- "\x86\xd8\xb5\x6f\x98\x5e\x8a\x66"
- "\x4f\x1f\x78\xa1\xbb\x37\xf1\xbe",
- .rlen = 32,
- }, {
- .key = "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35",
- .klen = 40,
- .input = "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35",
- .ilen = 32,
- .result = "\xa5\x2c\x85\x6f\x9c\xba\xa0\x97"
- "\x9e\xc6\x84\x0f\x17\x21\x07\xee"
- "\xa2\xbc\x06\x98\xc6\x4b\xda\x75"
- "\x2e\xaa\xbe\x58\xce\x01\x5b\xc7",
- .rlen = 32,
- },
-};
-
-static struct cipher_testvec anubis_cbc_dec_tv_template[] = {
- {
- .key = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
- "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
- .klen = 16,
- .input = "\x6d\xc5\xda\xa2\x26\x7d\x62\x6f"
- "\x08\xb7\x52\x8e\x6e\x6e\x86\x90"
- "\x86\xd8\xb5\x6f\x98\x5e\x8a\x66"
- "\x4f\x1f\x78\xa1\xbb\x37\xf1\xbe",
- .ilen = 32,
- .result = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
- "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
- "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
- "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
- .rlen = 32,
- }, {
- .key = "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35",
- .klen = 40,
- .input = "\xa5\x2c\x85\x6f\x9c\xba\xa0\x97"
- "\x9e\xc6\x84\x0f\x17\x21\x07\xee"
- "\xa2\xbc\x06\x98\xc6\x4b\xda\x75"
- "\x2e\xaa\xbe\x58\xce\x01\x5b\xc7",
- .ilen = 32,
- .result = "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35"
- "\x35\x35\x35\x35\x35\x35\x35\x35",
- .rlen = 32,
- },
-};
-
-/*
- * XETA test vectors
- */
-#define XETA_ENC_TEST_VECTORS 4
-#define XETA_DEC_TEST_VECTORS 4
-
-static struct cipher_testvec xeta_enc_tv_template[] = {
- {
- .key = zeroed_string,
- .klen = 16,
- .input = zeroed_string,
- .ilen = 8,
- .result = "\xaa\x22\x96\xe5\x6c\x61\xf3\x45",
- .rlen = 8,
- }, {
- .key = "\x2b\x02\x05\x68\x06\x14\x49\x76"
- "\x77\x5d\x0e\x26\x6c\x28\x78\x43",
- .klen = 16,
- .input = "\x74\x65\x73\x74\x20\x6d\x65\x2e",
- .ilen = 8,
- .result = "\x82\x3e\xeb\x35\xdc\xdd\xd9\xc3",
- .rlen = 8,
- }, {
- .key = "\x09\x65\x43\x11\x66\x44\x39\x25"
- "\x51\x3a\x16\x10\x0a\x08\x12\x6e",
- .klen = 16,
- .input = "\x6c\x6f\x6e\x67\x65\x72\x5f\x74"
- "\x65\x73\x74\x5f\x76\x65\x63\x74",
- .ilen = 16,
- .result = "\xe2\x04\xdb\xf2\x89\x85\x9e\xea"
- "\x61\x35\xaa\xed\xb5\xcb\x71\x2c",
- .rlen = 16,
- }, {
- .key = "\x4d\x76\x32\x17\x05\x3f\x75\x2c"
- "\x5d\x04\x16\x36\x15\x72\x63\x2f",
- .klen = 16,
- .input = "\x54\x65\x61\x20\x69\x73\x20\x67"
- "\x6f\x6f\x64\x20\x66\x6f\x72\x20"
- "\x79\x6f\x75\x21\x21\x21\x20\x72"
- "\x65\x61\x6c\x6c\x79\x21\x21\x21",
- .ilen = 32,
- .result = "\x0b\x03\xcd\x8a\xbe\x95\xfd\xb1"
- "\xc1\x44\x91\x0b\xa5\xc9\x1b\xb4"
- "\xa9\xda\x1e\x9e\xb1\x3e\x2a\x8f"
- "\xea\xa5\x6a\x85\xd1\xf4\xa8\xa5",
- .rlen = 32,
- }
-};
-
-static struct cipher_testvec xeta_dec_tv_template[] = {
- {
- .key = zeroed_string,
- .klen = 16,
- .input = "\xaa\x22\x96\xe5\x6c\x61\xf3\x45",
- .ilen = 8,
- .result = zeroed_string,
- .rlen = 8,
- }, {
- .key = "\x2b\x02\x05\x68\x06\x14\x49\x76"
- "\x77\x5d\x0e\x26\x6c\x28\x78\x43",
- .klen = 16,
- .input = "\x82\x3e\xeb\x35\xdc\xdd\xd9\xc3",
- .ilen = 8,
- .result = "\x74\x65\x73\x74\x20\x6d\x65\x2e",
- .rlen = 8,
- }, {
- .key = "\x09\x65\x43\x11\x66\x44\x39\x25"
- "\x51\x3a\x16\x10\x0a\x08\x12\x6e",
- .klen = 16,
- .input = "\xe2\x04\xdb\xf2\x89\x85\x9e\xea"
- "\x61\x35\xaa\xed\xb5\xcb\x71\x2c",
- .ilen = 16,
- .result = "\x6c\x6f\x6e\x67\x65\x72\x5f\x74"
- "\x65\x73\x74\x5f\x76\x65\x63\x74",
- .rlen = 16,
- }, {
- .key = "\x4d\x76\x32\x17\x05\x3f\x75\x2c"
- "\x5d\x04\x16\x36\x15\x72\x63\x2f",
- .klen = 16,
- .input = "\x0b\x03\xcd\x8a\xbe\x95\xfd\xb1"
- "\xc1\x44\x91\x0b\xa5\xc9\x1b\xb4"
- "\xa9\xda\x1e\x9e\xb1\x3e\x2a\x8f"
- "\xea\xa5\x6a\x85\xd1\xf4\xa8\xa5",
- .ilen = 32,
- .result = "\x54\x65\x61\x20\x69\x73\x20\x67"
- "\x6f\x6f\x64\x20\x66\x6f\x72\x20"
- "\x79\x6f\x75\x21\x21\x21\x20\x72"
- "\x65\x61\x6c\x6c\x79\x21\x21\x21",
- .rlen = 32,
- }
-};
-
-/*
- * FCrypt test vectors
- */
-#define FCRYPT_ENC_TEST_VECTORS ARRAY_SIZE(fcrypt_pcbc_enc_tv_template)
-#define FCRYPT_DEC_TEST_VECTORS ARRAY_SIZE(fcrypt_pcbc_dec_tv_template)
-
-static struct cipher_testvec fcrypt_pcbc_enc_tv_template[] = {
- { /* http://www.openafs.org/pipermail/openafs-devel/2000-December/005320.html */
- .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .klen = 8,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .input = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .ilen = 8,
- .result = "\x0E\x09\x00\xC7\x3E\xF7\xED\x41",
- .rlen = 8,
- }, {
- .key = "\x11\x44\x77\xAA\xDD\x00\x33\x66",
- .klen = 8,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .input = "\x12\x34\x56\x78\x9A\xBC\xDE\xF0",
- .ilen = 8,
- .result = "\xD8\xED\x78\x74\x77\xEC\x06\x80",
- .rlen = 8,
- }, { /* From Arla */
- .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
- .klen = 8,
- .iv = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .input = "The quick brown fox jumps over the lazy dogs.\0\0",
- .ilen = 48,
- .result = "\x00\xf0\x0e\x11\x75\xe6\x23\x82"
- "\xee\xac\x98\x62\x44\x51\xe4\x84"
- "\xc3\x59\xd8\xaa\x64\x60\xae\xf7"
- "\xd2\xd9\x13\x79\x72\xa3\x45\x03"
- "\x23\xb5\x62\xd7\x0c\xf5\x27\xd1"
- "\xf8\x91\x3c\xac\x44\x22\x92\xef",
- .rlen = 48,
- }, {
- .key = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .klen = 8,
- .iv = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
- .input = "The quick brown fox jumps over the lazy dogs.\0\0",
- .ilen = 48,
- .result = "\xca\x90\xf5\x9d\xcb\xd4\xd2\x3c"
- "\x01\x88\x7f\x3e\x31\x6e\x62\x9d"
- "\xd8\xe0\x57\xa3\x06\x3a\x42\x58"
- "\x2a\x28\xfe\x72\x52\x2f\xdd\xe0"
- "\x19\x89\x09\x1c\x2a\x8e\x8c\x94"
- "\xfc\xc7\x68\xe4\x88\xaa\xde\x0f",
- .rlen = 48,
- }, { /* split-page version */
- .key = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .klen = 8,
- .iv = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
- .input = "The quick brown fox jumps over the lazy dogs.\0\0",
- .ilen = 48,
- .result = "\xca\x90\xf5\x9d\xcb\xd4\xd2\x3c"
- "\x01\x88\x7f\x3e\x31\x6e\x62\x9d"
- "\xd8\xe0\x57\xa3\x06\x3a\x42\x58"
- "\x2a\x28\xfe\x72\x52\x2f\xdd\xe0"
- "\x19\x89\x09\x1c\x2a\x8e\x8c\x94"
- "\xfc\xc7\x68\xe4\x88\xaa\xde\x0f",
- .rlen = 48,
- .np = 2,
- .tap = { 20, 28 },
- }
-};
-
-static struct cipher_testvec fcrypt_pcbc_dec_tv_template[] = {
- { /* http://www.openafs.org/pipermail/openafs-devel/2000-December/005320.html */
- .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .klen = 8,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .input = "\x0E\x09\x00\xC7\x3E\xF7\xED\x41",
- .ilen = 8,
- .result = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .rlen = 8,
- }, {
- .key = "\x11\x44\x77\xAA\xDD\x00\x33\x66",
- .klen = 8,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .input = "\xD8\xED\x78\x74\x77\xEC\x06\x80",
- .ilen = 8,
- .result = "\x12\x34\x56\x78\x9A\xBC\xDE\xF0",
- .rlen = 8,
- }, { /* From Arla */
- .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
- .klen = 8,
- .iv = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .input = "\x00\xf0\x0e\x11\x75\xe6\x23\x82"
- "\xee\xac\x98\x62\x44\x51\xe4\x84"
- "\xc3\x59\xd8\xaa\x64\x60\xae\xf7"
- "\xd2\xd9\x13\x79\x72\xa3\x45\x03"
- "\x23\xb5\x62\xd7\x0c\xf5\x27\xd1"
- "\xf8\x91\x3c\xac\x44\x22\x92\xef",
- .ilen = 48,
- .result = "The quick brown fox jumps over the lazy dogs.\0\0",
- .rlen = 48,
- }, {
- .key = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .klen = 8,
- .iv = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
- .input = "\xca\x90\xf5\x9d\xcb\xd4\xd2\x3c"
- "\x01\x88\x7f\x3e\x31\x6e\x62\x9d"
- "\xd8\xe0\x57\xa3\x06\x3a\x42\x58"
- "\x2a\x28\xfe\x72\x52\x2f\xdd\xe0"
- "\x19\x89\x09\x1c\x2a\x8e\x8c\x94"
- "\xfc\xc7\x68\xe4\x88\xaa\xde\x0f",
- .ilen = 48,
- .result = "The quick brown fox jumps over the lazy dogs.\0\0",
- .rlen = 48,
- }, { /* split-page version */
- .key = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .klen = 8,
- .iv = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
- .input = "\xca\x90\xf5\x9d\xcb\xd4\xd2\x3c"
- "\x01\x88\x7f\x3e\x31\x6e\x62\x9d"
- "\xd8\xe0\x57\xa3\x06\x3a\x42\x58"
- "\x2a\x28\xfe\x72\x52\x2f\xdd\xe0"
- "\x19\x89\x09\x1c\x2a\x8e\x8c\x94"
- "\xfc\xc7\x68\xe4\x88\xaa\xde\x0f",
- .ilen = 48,
- .result = "The quick brown fox jumps over the lazy dogs.\0\0",
- .rlen = 48,
- .np = 2,
- .tap = { 20, 28 },
- }
-};
-
-/*
- * CAMELLIA test vectors.
- */
-#define CAMELLIA_ENC_TEST_VECTORS 3
-#define CAMELLIA_DEC_TEST_VECTORS 3
-#define CAMELLIA_CBC_ENC_TEST_VECTORS 2
-#define CAMELLIA_CBC_DEC_TEST_VECTORS 2
-
-static struct cipher_testvec camellia_enc_tv_template[] = {
- {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
- "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .klen = 16,
- .input = "\x01\x23\x45\x67\x89\xab\xcd\xef"
- "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .ilen = 16,
- .result = "\x67\x67\x31\x38\x54\x96\x69\x73"
- "\x08\x57\x06\x56\x48\xea\xbe\x43",
- .rlen = 16,
- }, {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
- "\xfe\xdc\xba\x98\x76\x54\x32\x10"
- "\x00\x11\x22\x33\x44\x55\x66\x77",
- .klen = 24,
- .input = "\x01\x23\x45\x67\x89\xab\xcd\xef"
- "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .ilen = 16,
- .result = "\xb4\x99\x34\x01\xb3\xe9\x96\xf8"
- "\x4e\xe5\xce\xe7\xd7\x9b\x09\xb9",
- .rlen = 16,
- }, {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
- "\xfe\xdc\xba\x98\x76\x54\x32\x10"
- "\x00\x11\x22\x33\x44\x55\x66\x77"
- "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
- .klen = 32,
- .input = "\x01\x23\x45\x67\x89\xab\xcd\xef"
- "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .ilen = 16,
- .result = "\x9a\xcc\x23\x7d\xff\x16\xd7\x6c"
- "\x20\xef\x7c\x91\x9e\x3a\x75\x09",
- .rlen = 16,
- },
-};
-
-static struct cipher_testvec camellia_dec_tv_template[] = {
- {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
- "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .klen = 16,
- .input = "\x67\x67\x31\x38\x54\x96\x69\x73"
- "\x08\x57\x06\x56\x48\xea\xbe\x43",
- .ilen = 16,
- .result = "\x01\x23\x45\x67\x89\xab\xcd\xef"
- "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .rlen = 16,
- }, {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
- "\xfe\xdc\xba\x98\x76\x54\x32\x10"
- "\x00\x11\x22\x33\x44\x55\x66\x77",
- .klen = 24,
- .input = "\xb4\x99\x34\x01\xb3\xe9\x96\xf8"
- "\x4e\xe5\xce\xe7\xd7\x9b\x09\xb9",
- .ilen = 16,
- .result = "\x01\x23\x45\x67\x89\xab\xcd\xef"
- "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .rlen = 16,
- }, {
- .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
- "\xfe\xdc\xba\x98\x76\x54\x32\x10"
- "\x00\x11\x22\x33\x44\x55\x66\x77"
- "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
- .klen = 32,
- .input = "\x9a\xcc\x23\x7d\xff\x16\xd7\x6c"
- "\x20\xef\x7c\x91\x9e\x3a\x75\x09",
- .ilen = 16,
- .result = "\x01\x23\x45\x67\x89\xab\xcd\xef"
- "\xfe\xdc\xba\x98\x76\x54\x32\x10",
- .rlen = 16,
- },
-};
-
-static struct cipher_testvec camellia_cbc_enc_tv_template[] = {
- {
- .key = "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
- "\x51\x2e\x03\xd5\x34\x12\x00\x06",
- .klen = 16,
- .iv = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
- "\xb4\x22\xda\x80\x2c\x9f\xac\x41",
- .input = "Single block msg",
- .ilen = 16,
- .result = "\xea\x32\x12\x76\x3b\x50\x10\xe7"
- "\x18\xf6\xfd\x5d\xf6\x8f\x13\x51",
- .rlen = 16,
- }, {
- .key = "\xc2\x86\x69\x6d\x88\x7c\x9a\xa0"
- "\x61\x1b\xbb\x3e\x20\x25\xa4\x5a",
- .klen = 16,
- .iv = "\x56\x2e\x17\x99\x6d\x09\x3d\x28"
- "\xdd\xb3\xba\x69\x5a\x2e\x6f\x58",
- .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
- .ilen = 32,
- .result = "\xa5\xdf\x6e\x50\xda\x70\x6c\x01"
- "\x4a\xab\xf3\xf2\xd6\xfc\x6c\xfd"
- "\x19\xb4\x3e\x57\x1c\x02\x5e\xa0"
- "\x15\x78\xe0\x5e\xf2\xcb\x87\x16",
- .rlen = 32,
- },
-};
-
-static struct cipher_testvec camellia_cbc_dec_tv_template[] = {
- {
- .key = "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
- "\x51\x2e\x03\xd5\x34\x12\x00\x06",
- .klen = 16,
- .iv = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
- "\xb4\x22\xda\x80\x2c\x9f\xac\x41",
- .input = "\xea\x32\x12\x76\x3b\x50\x10\xe7"
- "\x18\xf6\xfd\x5d\xf6\x8f\x13\x51",
- .ilen = 16,
- .result = "Single block msg",
- .rlen = 16,
- }, {
- .key = "\xc2\x86\x69\x6d\x88\x7c\x9a\xa0"
- "\x61\x1b\xbb\x3e\x20\x25\xa4\x5a",
- .klen = 16,
- .iv = "\x56\x2e\x17\x99\x6d\x09\x3d\x28"
- "\xdd\xb3\xba\x69\x5a\x2e\x6f\x58",
- .input = "\xa5\xdf\x6e\x50\xda\x70\x6c\x01"
- "\x4a\xab\xf3\xf2\xd6\xfc\x6c\xfd"
- "\x19\xb4\x3e\x57\x1c\x02\x5e\xa0"
- "\x15\x78\xe0\x5e\xf2\xcb\x87\x16",
- .ilen = 32,
- .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
- .rlen = 32,
- },
-};
-
-/*
- * SEED test vectors
- */
-#define SEED_ENC_TEST_VECTORS 4
-#define SEED_DEC_TEST_VECTORS 4
-
-static struct cipher_testvec seed_enc_tv_template[] = {
- {
- .key = zeroed_string,
- .klen = 16,
- .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .ilen = 16,
- .result = "\x5e\xba\xc6\xe0\x05\x4e\x16\x68"
- "\x19\xaf\xf1\xcc\x6d\x34\x6c\xdb",
- .rlen = 16,
- }, {
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .klen = 16,
- .input = zeroed_string,
- .ilen = 16,
- .result = "\xc1\x1f\x22\xf2\x01\x40\x50\x50"
- "\x84\x48\x35\x97\xe4\x37\x0f\x43",
- .rlen = 16,
- }, {
- .key = "\x47\x06\x48\x08\x51\xe6\x1b\xe8"
- "\x5d\x74\xbf\xb3\xfd\x95\x61\x85",
- .klen = 16,
- .input = "\x83\xa2\xf8\xa2\x88\x64\x1f\xb9"
- "\xa4\xe9\xa5\xcc\x2f\x13\x1c\x7d",
- .ilen = 16,
- .result = "\xee\x54\xd1\x3e\xbc\xae\x70\x6d"
- "\x22\x6b\xc3\x14\x2c\xd4\x0d\x4a",
- .rlen = 16,
- }, {
- .key = "\x28\xdb\xc3\xbc\x49\xff\xd8\x7d"
- "\xcf\xa5\x09\xb1\x1d\x42\x2b\xe7",
- .klen = 16,
- .input = "\xb4\x1e\x6b\xe2\xeb\xa8\x4a\x14"
- "\x8e\x2e\xed\x84\x59\x3c\x5e\xc7",
- .ilen = 16,
- .result = "\x9b\x9b\x7b\xfc\xd1\x81\x3c\xb9"
- "\x5d\x0b\x36\x18\xf4\x0f\x51\x22",
- .rlen = 16,
- }
-};
-
-static struct cipher_testvec seed_dec_tv_template[] = {
- {
- .key = zeroed_string,
- .klen = 16,
- .input = "\x5e\xba\xc6\xe0\x05\x4e\x16\x68"
- "\x19\xaf\xf1\xcc\x6d\x34\x6c\xdb",
- .ilen = 16,
- .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .rlen = 16,
- }, {
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
- .klen = 16,
- .input = "\xc1\x1f\x22\xf2\x01\x40\x50\x50"
- "\x84\x48\x35\x97\xe4\x37\x0f\x43",
- .ilen = 16,
- .result = zeroed_string,
- .rlen = 16,
- }, {
- .key = "\x47\x06\x48\x08\x51\xe6\x1b\xe8"
- "\x5d\x74\xbf\xb3\xfd\x95\x61\x85",
- .klen = 16,
- .input = "\xee\x54\xd1\x3e\xbc\xae\x70\x6d"
- "\x22\x6b\xc3\x14\x2c\xd4\x0d\x4a",
- .ilen = 16,
- .result = "\x83\xa2\xf8\xa2\x88\x64\x1f\xb9"
- "\xa4\xe9\xa5\xcc\x2f\x13\x1c\x7d",
- .rlen = 16,
- }, {
- .key = "\x28\xdb\xc3\xbc\x49\xff\xd8\x7d"
- "\xcf\xa5\x09\xb1\x1d\x42\x2b\xe7",
- .klen = 16,
- .input = "\x9b\x9b\x7b\xfc\xd1\x81\x3c\xb9"
- "\x5d\x0b\x36\x18\xf4\x0f\x51\x22",
- .ilen = 16,
- .result = "\xb4\x1e\x6b\xe2\xeb\xa8\x4a\x14"
- "\x8e\x2e\xed\x84\x59\x3c\x5e\xc7",
- .rlen = 16,
- }
-};
-
-#define SALSA20_STREAM_ENC_TEST_VECTORS 5
-static struct cipher_testvec salsa20_stream_enc_tv_template[] = {
- /*
- * Testvectors from verified.test-vectors submitted to ECRYPT.
- * They are truncated to size 39, 64, 111, 129 to test a variety
- * of input length.
- */
- { /* Set 3, vector 0 */
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F",
- .klen = 16,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00",
- .ilen = 39,
- .result = "\x2D\xD5\xC3\xF7\xBA\x2B\x20\xF7"
- "\x68\x02\x41\x0C\x68\x86\x88\x89"
- "\x5A\xD8\xC1\xBD\x4E\xA6\xC9\xB1"
- "\x40\xFB\x9B\x90\xE2\x10\x49\xBF"
- "\x58\x3F\x52\x79\x70\xEB\xC1",
- .rlen = 39,
- }, { /* Set 5, vector 0 */
- .key = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .klen = 16,
- .iv = "\x80\x00\x00\x00\x00\x00\x00\x00",
- .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .ilen = 64,
- .result = "\xB6\x6C\x1E\x44\x46\xDD\x95\x57"
- "\xE5\x78\xE2\x23\xB0\xB7\x68\x01"
- "\x7B\x23\xB2\x67\xBB\x02\x34\xAE"
- "\x46\x26\xBF\x44\x3F\x21\x97\x76"
- "\x43\x6F\xB1\x9F\xD0\xE8\x86\x6F"
- "\xCD\x0D\xE9\xA9\x53\x8F\x4A\x09"
- "\xCA\x9A\xC0\x73\x2E\x30\xBC\xF9"
- "\x8E\x4F\x13\xE4\xB9\xE2\x01\xD9",
- .rlen = 64,
- }, { /* Set 3, vector 27 */
- .key = "\x1B\x1C\x1D\x1E\x1F\x20\x21\x22"
- "\x23\x24\x25\x26\x27\x28\x29\x2A"
- "\x2B\x2C\x2D\x2E\x2F\x30\x31\x32"
- "\x33\x34\x35\x36\x37\x38\x39\x3A",
- .klen = 32,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00",
- .ilen = 111,
- .result = "\xAE\x39\x50\x8E\xAC\x9A\xEC\xE7"
- "\xBF\x97\xBB\x20\xB9\xDE\xE4\x1F"
- "\x87\xD9\x47\xF8\x28\x91\x35\x98"
- "\xDB\x72\xCC\x23\x29\x48\x56\x5E"
- "\x83\x7E\x0B\xF3\x7D\x5D\x38\x7B"
- "\x2D\x71\x02\xB4\x3B\xB5\xD8\x23"
- "\xB0\x4A\xDF\x3C\xEC\xB6\xD9\x3B"
- "\x9B\xA7\x52\xBE\xC5\xD4\x50\x59"
- "\x15\x14\xB4\x0E\x40\xE6\x53\xD1"
- "\x83\x9C\x5B\xA0\x92\x29\x6B\x5E"
- "\x96\x5B\x1E\x2F\xD3\xAC\xC1\x92"
- "\xB1\x41\x3F\x19\x2F\xC4\x3B\xC6"
- "\x95\x46\x45\x54\xE9\x75\x03\x08"
- "\x44\xAF\xE5\x8A\x81\x12\x09",
- .rlen = 111,
- }, { /* Set 5, vector 27 */
- .key = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .klen = 32,
- .iv = "\x00\x00\x00\x10\x00\x00\x00\x00",
- .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00",
- .ilen = 129,
- .result = "\xD2\xDB\x1A\x5C\xF1\xC1\xAC\xDB"
- "\xE8\x1A\x7A\x43\x40\xEF\x53\x43"
- "\x5E\x7F\x4B\x1A\x50\x52\x3F\x8D"
- "\x28\x3D\xCF\x85\x1D\x69\x6E\x60"
- "\xF2\xDE\x74\x56\x18\x1B\x84\x10"
- "\xD4\x62\xBA\x60\x50\xF0\x61\xF2"
- "\x1C\x78\x7F\xC1\x24\x34\xAF\x58"
- "\xBF\x2C\x59\xCA\x90\x77\xF3\xB0"
- "\x5B\x4A\xDF\x89\xCE\x2C\x2F\xFC"
- "\x67\xF0\xE3\x45\xE8\xB3\xB3\x75"
- "\xA0\x95\x71\xA1\x29\x39\x94\xCA"
- "\x45\x2F\xBD\xCB\x10\xB6\xBE\x9F"
- "\x8E\xF9\xB2\x01\x0A\x5A\x0A\xB7"
- "\x6B\x9D\x70\x8E\x4B\xD6\x2F\xCD"
- "\x2E\x40\x48\x75\xE9\xE2\x21\x45"
- "\x0B\xC9\xB6\xB5\x66\xBC\x9A\x59"
- "\x5A",
- .rlen = 129,
- }, { /* large test vector generated using Crypto++ */
- .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
- .klen = 32,
- .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- .input =
- "\x00\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
- "\x20\x21\x22\x23\x24\x25\x26\x27"
- "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
- "\x30\x31\x32\x33\x34\x35\x36\x37"
- "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
- "\x40\x41\x42\x43\x44\x45\x46\x47"
- "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
- "\x50\x51\x52\x53\x54\x55\x56\x57"
- "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
- "\x60\x61\x62\x63\x64\x65\x66\x67"
- "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
- "\x70\x71\x72\x73\x74\x75\x76\x77"
- "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
- "\x80\x81\x82\x83\x84\x85\x86\x87"
- "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
- "\x90\x91\x92\x93\x94\x95\x96\x97"
- "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
- "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
- "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
- "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
- "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
- "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
- "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
- "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
- "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
- "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
- "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
- "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
- "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
- "\x00\x03\x06\x09\x0c\x0f\x12\x15"
- "\x18\x1b\x1e\x21\x24\x27\x2a\x2d"
- "\x30\x33\x36\x39\x3c\x3f\x42\x45"
- "\x48\x4b\x4e\x51\x54\x57\x5a\x5d"
- "\x60\x63\x66\x69\x6c\x6f\x72\x75"
- "\x78\x7b\x7e\x81\x84\x87\x8a\x8d"
- "\x90\x93\x96\x99\x9c\x9f\xa2\xa5"
- "\xa8\xab\xae\xb1\xb4\xb7\xba\xbd"
- "\xc0\xc3\xc6\xc9\xcc\xcf\xd2\xd5"
- "\xd8\xdb\xde\xe1\xe4\xe7\xea\xed"
- "\xf0\xf3\xf6\xf9\xfc\xff\x02\x05"
- "\x08\x0b\x0e\x11\x14\x17\x1a\x1d"
- "\x20\x23\x26\x29\x2c\x2f\x32\x35"
- "\x38\x3b\x3e\x41\x44\x47\x4a\x4d"
- "\x50\x53\x56\x59\x5c\x5f\x62\x65"
- "\x68\x6b\x6e\x71\x74\x77\x7a\x7d"
- "\x80\x83\x86\x89\x8c\x8f\x92\x95"
- "\x98\x9b\x9e\xa1\xa4\xa7\xaa\xad"
- "\xb0\xb3\xb6\xb9\xbc\xbf\xc2\xc5"
- "\xc8\xcb\xce\xd1\xd4\xd7\xda\xdd"
- "\xe0\xe3\xe6\xe9\xec\xef\xf2\xf5"
- "\xf8\xfb\xfe\x01\x04\x07\x0a\x0d"
- "\x10\x13\x16\x19\x1c\x1f\x22\x25"
- "\x28\x2b\x2e\x31\x34\x37\x3a\x3d"
- "\x40\x43\x46\x49\x4c\x4f\x52\x55"
- "\x58\x5b\x5e\x61\x64\x67\x6a\x6d"
- "\x70\x73\x76\x79\x7c\x7f\x82\x85"
- "\x88\x8b\x8e\x91\x94\x97\x9a\x9d"
- "\xa0\xa3\xa6\xa9\xac\xaf\xb2\xb5"
- "\xb8\xbb\xbe\xc1\xc4\xc7\xca\xcd"
- "\xd0\xd3\xd6\xd9\xdc\xdf\xe2\xe5"
- "\xe8\xeb\xee\xf1\xf4\xf7\xfa\xfd"
- "\x00\x05\x0a\x0f\x14\x19\x1e\x23"
- "\x28\x2d\x32\x37\x3c\x41\x46\x4b"
- "\x50\x55\x5a\x5f\x64\x69\x6e\x73"
- "\x78\x7d\x82\x87\x8c\x91\x96\x9b"
- "\xa0\xa5\xaa\xaf\xb4\xb9\xbe\xc3"
- "\xc8\xcd\xd2\xd7\xdc\xe1\xe6\xeb"
- "\xf0\xf5\xfa\xff\x04\x09\x0e\x13"
- "\x18\x1d\x22\x27\x2c\x31\x36\x3b"
- "\x40\x45\x4a\x4f\x54\x59\x5e\x63"
- "\x68\x6d\x72\x77\x7c\x81\x86\x8b"
- "\x90\x95\x9a\x9f\xa4\xa9\xae\xb3"
- "\xb8\xbd\xc2\xc7\xcc\xd1\xd6\xdb"
- "\xe0\xe5\xea\xef\xf4\xf9\xfe\x03"
- "\x08\x0d\x12\x17\x1c\x21\x26\x2b"
- "\x30\x35\x3a\x3f\x44\x49\x4e\x53"
- "\x58\x5d\x62\x67\x6c\x71\x76\x7b"
- "\x80\x85\x8a\x8f\x94\x99\x9e\xa3"
- "\xa8\xad\xb2\xb7\xbc\xc1\xc6\xcb"
- "\xd0\xd5\xda\xdf\xe4\xe9\xee\xf3"
- "\xf8\xfd\x02\x07\x0c\x11\x16\x1b"
- "\x20\x25\x2a\x2f\x34\x39\x3e\x43"
- "\x48\x4d\x52\x57\x5c\x61\x66\x6b"
- "\x70\x75\x7a\x7f\x84\x89\x8e\x93"
- "\x98\x9d\xa2\xa7\xac\xb1\xb6\xbb"
- "\xc0\xc5\xca\xcf\xd4\xd9\xde\xe3"
- "\xe8\xed\xf2\xf7\xfc\x01\x06\x0b"
- "\x10\x15\x1a\x1f\x24\x29\x2e\x33"
- "\x38\x3d\x42\x47\x4c\x51\x56\x5b"
- "\x60\x65\x6a\x6f\x74\x79\x7e\x83"
- "\x88\x8d\x92\x97\x9c\xa1\xa6\xab"
- "\xb0\xb5\xba\xbf\xc4\xc9\xce\xd3"
- "\xd8\xdd\xe2\xe7\xec\xf1\xf6\xfb"
- "\x00\x07\x0e\x15\x1c\x23\x2a\x31"
- "\x38\x3f\x46\x4d\x54\x5b\x62\x69"
- "\x70\x77\x7e\x85\x8c\x93\x9a\xa1"
- "\xa8\xaf\xb6\xbd\xc4\xcb\xd2\xd9"
- "\xe0\xe7\xee\xf5\xfc\x03\x0a\x11"
- "\x18\x1f\x26\x2d\x34\x3b\x42\x49"
- "\x50\x57\x5e\x65\x6c\x73\x7a\x81"
- "\x88\x8f\x96\x9d\xa4\xab\xb2\xb9"
- "\xc0\xc7\xce\xd5\xdc\xe3\xea\xf1"
- "\xf8\xff\x06\x0d\x14\x1b\x22\x29"
- "\x30\x37\x3e\x45\x4c\x53\x5a\x61"
- "\x68\x6f\x76\x7d\x84\x8b\x92\x99"
- "\xa0\xa7\xae\xb5\xbc\xc3\xca\xd1"
- "\xd8\xdf\xe6\xed\xf4\xfb\x02\x09"
- "\x10\x17\x1e\x25\x2c\x33\x3a\x41"
- "\x48\x4f\x56\x5d\x64\x6b\x72\x79"
- "\x80\x87\x8e\x95\x9c\xa3\xaa\xb1"
- "\xb8\xbf\xc6\xcd\xd4\xdb\xe2\xe9"
- "\xf0\xf7\xfe\x05\x0c\x13\x1a\x21"
- "\x28\x2f\x36\x3d\x44\x4b\x52\x59"
- "\x60\x67\x6e\x75\x7c\x83\x8a\x91"
- "\x98\x9f\xa6\xad\xb4\xbb\xc2\xc9"
- "\xd0\xd7\xde\xe5\xec\xf3\xfa\x01"
- "\x08\x0f\x16\x1d\x24\x2b\x32\x39"
- "\x40\x47\x4e\x55\x5c\x63\x6a\x71"
- "\x78\x7f\x86\x8d\x94\x9b\xa2\xa9"
- "\xb0\xb7\xbe\xc5\xcc\xd3\xda\xe1"
- "\xe8\xef\xf6\xfd\x04\x0b\x12\x19"
- "\x20\x27\x2e\x35\x3c\x43\x4a\x51"
- "\x58\x5f\x66\x6d\x74\x7b\x82\x89"
- "\x90\x97\x9e\xa5\xac\xb3\xba\xc1"
- "\xc8\xcf\xd6\xdd\xe4\xeb\xf2\xf9"
- "\x00\x09\x12\x1b\x24\x2d\x36\x3f"
- "\x48\x51\x5a\x63\x6c\x75\x7e\x87"
- "\x90\x99\xa2\xab\xb4\xbd\xc6\xcf"
- "\xd8\xe1\xea\xf3\xfc\x05\x0e\x17"
- "\x20\x29\x32\x3b\x44\x4d\x56\x5f"
- "\x68\x71\x7a\x83\x8c\x95\x9e\xa7"
- "\xb0\xb9\xc2\xcb\xd4\xdd\xe6\xef"
- "\xf8\x01\x0a\x13\x1c\x25\x2e\x37"
- "\x40\x49\x52\x5b\x64\x6d\x76\x7f"
- "\x88\x91\x9a\xa3\xac\xb5\xbe\xc7"
- "\xd0\xd9\xe2\xeb\xf4\xfd\x06\x0f"
- "\x18\x21\x2a\x33\x3c\x45\x4e\x57"
- "\x60\x69\x72\x7b\x84\x8d\x96\x9f"
- "\xa8\xb1\xba\xc3\xcc\xd5\xde\xe7"
- "\xf0\xf9\x02\x0b\x14\x1d\x26\x2f"
- "\x38\x41\x4a\x53\x5c\x65\x6e\x77"
- "\x80\x89\x92\x9b\xa4\xad\xb6\xbf"
- "\xc8\xd1\xda\xe3\xec\xf5\xfe\x07"
- "\x10\x19\x22\x2b\x34\x3d\x46\x4f"
- "\x58\x61\x6a\x73\x7c\x85\x8e\x97"
- "\xa0\xa9\xb2\xbb\xc4\xcd\xd6\xdf"
- "\xe8\xf1\xfa\x03\x0c\x15\x1e\x27"
- "\x30\x39\x42\x4b\x54\x5d\x66\x6f"
- "\x78\x81\x8a\x93\x9c\xa5\xae\xb7"
- "\xc0\xc9\xd2\xdb\xe4\xed\xf6\xff"
- "\x08\x11\x1a\x23\x2c\x35\x3e\x47"
- "\x50\x59\x62\x6b\x74\x7d\x86\x8f"
- "\x98\xa1\xaa\xb3\xbc\xc5\xce\xd7"
- "\xe0\xe9\xf2\xfb\x04\x0d\x16\x1f"
- "\x28\x31\x3a\x43\x4c\x55\x5e\x67"
- "\x70\x79\x82\x8b\x94\x9d\xa6\xaf"
- "\xb8\xc1\xca\xd3\xdc\xe5\xee\xf7"
- "\x00\x0b\x16\x21\x2c\x37\x42\x4d"
- "\x58\x63\x6e\x79\x84\x8f\x9a\xa5"
- "\xb0\xbb\xc6\xd1\xdc\xe7\xf2\xfd"
- "\x08\x13\x1e\x29\x34\x3f\x4a\x55"
- "\x60\x6b\x76\x81\x8c\x97\xa2\xad"
- "\xb8\xc3\xce\xd9\xe4\xef\xfa\x05"
- "\x10\x1b\x26\x31\x3c\x47\x52\x5d"
- "\x68\x73\x7e\x89\x94\x9f\xaa\xb5"
- "\xc0\xcb\xd6\xe1\xec\xf7\x02\x0d"
- "\x18\x23\x2e\x39\x44\x4f\x5a\x65"
- "\x70\x7b\x86\x91\x9c\xa7\xb2\xbd"
- "\xc8\xd3\xde\xe9\xf4\xff\x0a\x15"
- "\x20\x2b\x36\x41\x4c\x57\x62\x6d"
- "\x78\x83\x8e\x99\xa4\xaf\xba\xc5"
- "\xd0\xdb\xe6\xf1\xfc\x07\x12\x1d"
- "\x28\x33\x3e\x49\x54\x5f\x6a\x75"
- "\x80\x8b\x96\xa1\xac\xb7\xc2\xcd"
- "\xd8\xe3\xee\xf9\x04\x0f\x1a\x25"
- "\x30\x3b\x46\x51\x5c\x67\x72\x7d"
- "\x88\x93\x9e\xa9\xb4\xbf\xca\xd5"
- "\xe0\xeb\xf6\x01\x0c\x17\x22\x2d"
- "\x38\x43\x4e\x59\x64\x6f\x7a\x85"
- "\x90\x9b\xa6\xb1\xbc\xc7\xd2\xdd"
- "\xe8\xf3\xfe\x09\x14\x1f\x2a\x35"
- "\x40\x4b\x56\x61\x6c\x77\x82\x8d"
- "\x98\xa3\xae\xb9\xc4\xcf\xda\xe5"
- "\xf0\xfb\x06\x11\x1c\x27\x32\x3d"
- "\x48\x53\x5e\x69\x74\x7f\x8a\x95"
- "\xa0\xab\xb6\xc1\xcc\xd7\xe2\xed"
- "\xf8\x03\x0e\x19\x24\x2f\x3a\x45"
- "\x50\x5b\x66\x71\x7c\x87\x92\x9d"
- "\xa8\xb3\xbe\xc9\xd4\xdf\xea\xf5"
- "\x00\x0d\x1a\x27\x34\x41\x4e\x5b"
- "\x68\x75\x82\x8f\x9c\xa9\xb6\xc3"
- "\xd0\xdd\xea\xf7\x04\x11\x1e\x2b"
- "\x38\x45\x52\x5f\x6c\x79\x86\x93"
- "\xa0\xad\xba\xc7\xd4\xe1\xee\xfb"
- "\x08\x15\x22\x2f\x3c\x49\x56\x63"
- "\x70\x7d\x8a\x97\xa4\xb1\xbe\xcb"
- "\xd8\xe5\xf2\xff\x0c\x19\x26\x33"
- "\x40\x4d\x5a\x67\x74\x81\x8e\x9b"
- "\xa8\xb5\xc2\xcf\xdc\xe9\xf6\x03"
- "\x10\x1d\x2a\x37\x44\x51\x5e\x6b"
- "\x78\x85\x92\x9f\xac\xb9\xc6\xd3"
- "\xe0\xed\xfa\x07\x14\x21\x2e\x3b"
- "\x48\x55\x62\x6f\x7c\x89\x96\xa3"
- "\xb0\xbd\xca\xd7\xe4\xf1\xfe\x0b"
- "\x18\x25\x32\x3f\x4c\x59\x66\x73"
- "\x80\x8d\x9a\xa7\xb4\xc1\xce\xdb"
- "\xe8\xf5\x02\x0f\x1c\x29\x36\x43"
- "\x50\x5d\x6a\x77\x84\x91\x9e\xab"
- "\xb8\xc5\xd2\xdf\xec\xf9\x06\x13"
- "\x20\x2d\x3a\x47\x54\x61\x6e\x7b"
- "\x88\x95\xa2\xaf\xbc\xc9\xd6\xe3"
- "\xf0\xfd\x0a\x17\x24\x31\x3e\x4b"
- "\x58\x65\x72\x7f\x8c\x99\xa6\xb3"
- "\xc0\xcd\xda\xe7\xf4\x01\x0e\x1b"
- "\x28\x35\x42\x4f\x5c\x69\x76\x83"
- "\x90\x9d\xaa\xb7\xc4\xd1\xde\xeb"
- "\xf8\x05\x12\x1f\x2c\x39\x46\x53"
- "\x60\x6d\x7a\x87\x94\xa1\xae\xbb"
- "\xc8\xd5\xe2\xef\xfc\x09\x16\x23"
- "\x30\x3d\x4a\x57\x64\x71\x7e\x8b"
- "\x98\xa5\xb2\xbf\xcc\xd9\xe6\xf3"
- "\x00\x0f\x1e\x2d\x3c\x4b\x5a\x69"
- "\x78\x87\x96\xa5\xb4\xc3\xd2\xe1"
- "\xf0\xff\x0e\x1d\x2c\x3b\x4a\x59"
- "\x68\x77\x86\x95\xa4\xb3\xc2\xd1"
- "\xe0\xef\xfe\x0d\x1c\x2b\x3a\x49"
- "\x58\x67\x76\x85\x94\xa3\xb2\xc1"
- "\xd0\xdf\xee\xfd\x0c\x1b\x2a\x39"
- "\x48\x57\x66\x75\x84\x93\xa2\xb1"
- "\xc0\xcf\xde\xed\xfc\x0b\x1a\x29"
- "\x38\x47\x56\x65\x74\x83\x92\xa1"
- "\xb0\xbf\xce\xdd\xec\xfb\x0a\x19"
- "\x28\x37\x46\x55\x64\x73\x82\x91"
- "\xa0\xaf\xbe\xcd\xdc\xeb\xfa\x09"
- "\x18\x27\x36\x45\x54\x63\x72\x81"
- "\x90\x9f\xae\xbd\xcc\xdb\xea\xf9"
- "\x08\x17\x26\x35\x44\x53\x62\x71"
- "\x80\x8f\x9e\xad\xbc\xcb\xda\xe9"
- "\xf8\x07\x16\x25\x34\x43\x52\x61"
- "\x70\x7f\x8e\x9d\xac\xbb\xca\xd9"
- "\xe8\xf7\x06\x15\x24\x33\x42\x51"
- "\x60\x6f\x7e\x8d\x9c\xab\xba\xc9"
- "\xd8\xe7\xf6\x05\x14\x23\x32\x41"
- "\x50\x5f\x6e\x7d\x8c\x9b\xaa\xb9"
- "\xc8\xd7\xe6\xf5\x04\x13\x22\x31"
- "\x40\x4f\x5e\x6d\x7c\x8b\x9a\xa9"
- "\xb8\xc7\xd6\xe5\xf4\x03\x12\x21"
- "\x30\x3f\x4e\x5d\x6c\x7b\x8a\x99"
- "\xa8\xb7\xc6\xd5\xe4\xf3\x02\x11"
- "\x20\x2f\x3e\x4d\x5c\x6b\x7a\x89"
- "\x98\xa7\xb6\xc5\xd4\xe3\xf2\x01"
- "\x10\x1f\x2e\x3d\x4c\x5b\x6a\x79"
- "\x88\x97\xa6\xb5\xc4\xd3\xe2\xf1"
- "\x00\x11\x22\x33\x44\x55\x66\x77"
- "\x88\x99\xaa\xbb\xcc\xdd\xee\xff"
- "\x10\x21\x32\x43\x54\x65\x76\x87"
- "\x98\xa9\xba\xcb\xdc\xed\xfe\x0f"
- "\x20\x31\x42\x53\x64\x75\x86\x97"
- "\xa8\xb9\xca\xdb\xec\xfd\x0e\x1f"
- "\x30\x41\x52\x63\x74\x85\x96\xa7"
- "\xb8\xc9\xda\xeb\xfc\x0d\x1e\x2f"
- "\x40\x51\x62\x73\x84\x95\xa6\xb7"
- "\xc8\xd9\xea\xfb\x0c\x1d\x2e\x3f"
- "\x50\x61\x72\x83\x94\xa5\xb6\xc7"
- "\xd8\xe9\xfa\x0b\x1c\x2d\x3e\x4f"
- "\x60\x71\x82\x93\xa4\xb5\xc6\xd7"
- "\xe8\xf9\x0a\x1b\x2c\x3d\x4e\x5f"
- "\x70\x81\x92\xa3\xb4\xc5\xd6\xe7"
- "\xf8\x09\x1a\x2b\x3c\x4d\x5e\x6f"
- "\x80\x91\xa2\xb3\xc4\xd5\xe6\xf7"
- "\x08\x19\x2a\x3b\x4c\x5d\x6e\x7f"
- "\x90\xa1\xb2\xc3\xd4\xe5\xf6\x07"
- "\x18\x29\x3a\x4b\x5c\x6d\x7e\x8f"
- "\xa0\xb1\xc2\xd3\xe4\xf5\x06\x17"
- "\x28\x39\x4a\x5b\x6c\x7d\x8e\x9f"
- "\xb0\xc1\xd2\xe3\xf4\x05\x16\x27"
- "\x38\x49\x5a\x6b\x7c\x8d\x9e\xaf"
- "\xc0\xd1\xe2\xf3\x04\x15\x26\x37"
- "\x48\x59\x6a\x7b\x8c\x9d\xae\xbf"
- "\xd0\xe1\xf2\x03\x14\x25\x36\x47"
- "\x58\x69\x7a\x8b\x9c\xad\xbe\xcf"
- "\xe0\xf1\x02\x13\x24\x35\x46\x57"
- "\x68\x79\x8a\x9b\xac\xbd\xce\xdf"
- "\xf0\x01\x12\x23\x34\x45\x56\x67"
- "\x78\x89\x9a\xab\xbc\xcd\xde\xef"
- "\x00\x13\x26\x39\x4c\x5f\x72\x85"
- "\x98\xab\xbe\xd1\xe4\xf7\x0a\x1d"
- "\x30\x43\x56\x69\x7c\x8f\xa2\xb5"
- "\xc8\xdb\xee\x01\x14\x27\x3a\x4d"
- "\x60\x73\x86\x99\xac\xbf\xd2\xe5"
- "\xf8\x0b\x1e\x31\x44\x57\x6a\x7d"
- "\x90\xa3\xb6\xc9\xdc\xef\x02\x15"
- "\x28\x3b\x4e\x61\x74\x87\x9a\xad"
- "\xc0\xd3\xe6\xf9\x0c\x1f\x32\x45"
- "\x58\x6b\x7e\x91\xa4\xb7\xca\xdd"
- "\xf0\x03\x16\x29\x3c\x4f\x62\x75"
- "\x88\x9b\xae\xc1\xd4\xe7\xfa\x0d"
- "\x20\x33\x46\x59\x6c\x7f\x92\xa5"
- "\xb8\xcb\xde\xf1\x04\x17\x2a\x3d"
- "\x50\x63\x76\x89\x9c\xaf\xc2\xd5"
- "\xe8\xfb\x0e\x21\x34\x47\x5a\x6d"
- "\x80\x93\xa6\xb9\xcc\xdf\xf2\x05"
- "\x18\x2b\x3e\x51\x64\x77\x8a\x9d"
- "\xb0\xc3\xd6\xe9\xfc\x0f\x22\x35"
- "\x48\x5b\x6e\x81\x94\xa7\xba\xcd"
- "\xe0\xf3\x06\x19\x2c\x3f\x52\x65"
- "\x78\x8b\x9e\xb1\xc4\xd7\xea\xfd"
- "\x10\x23\x36\x49\x5c\x6f\x82\x95"
- "\xa8\xbb\xce\xe1\xf4\x07\x1a\x2d"
- "\x40\x53\x66\x79\x8c\x9f\xb2\xc5"
- "\xd8\xeb\xfe\x11\x24\x37\x4a\x5d"
- "\x70\x83\x96\xa9\xbc\xcf\xe2\xf5"
- "\x08\x1b\x2e\x41\x54\x67\x7a\x8d"
- "\xa0\xb3\xc6\xd9\xec\xff\x12\x25"
- "\x38\x4b\x5e\x71\x84\x97\xaa\xbd"
- "\xd0\xe3\xf6\x09\x1c\x2f\x42\x55"
- "\x68\x7b\x8e\xa1\xb4\xc7\xda\xed"
- "\x00\x15\x2a\x3f\x54\x69\x7e\x93"
- "\xa8\xbd\xd2\xe7\xfc\x11\x26\x3b"
- "\x50\x65\x7a\x8f\xa4\xb9\xce\xe3"
- "\xf8\x0d\x22\x37\x4c\x61\x76\x8b"
- "\xa0\xb5\xca\xdf\xf4\x09\x1e\x33"
- "\x48\x5d\x72\x87\x9c\xb1\xc6\xdb"
- "\xf0\x05\x1a\x2f\x44\x59\x6e\x83"
- "\x98\xad\xc2\xd7\xec\x01\x16\x2b"
- "\x40\x55\x6a\x7f\x94\xa9\xbe\xd3"
- "\xe8\xfd\x12\x27\x3c\x51\x66\x7b"
- "\x90\xa5\xba\xcf\xe4\xf9\x0e\x23"
- "\x38\x4d\x62\x77\x8c\xa1\xb6\xcb"
- "\xe0\xf5\x0a\x1f\x34\x49\x5e\x73"
- "\x88\x9d\xb2\xc7\xdc\xf1\x06\x1b"
- "\x30\x45\x5a\x6f\x84\x99\xae\xc3"
- "\xd8\xed\x02\x17\x2c\x41\x56\x6b"
- "\x80\x95\xaa\xbf\xd4\xe9\xfe\x13"
- "\x28\x3d\x52\x67\x7c\x91\xa6\xbb"
- "\xd0\xe5\xfa\x0f\x24\x39\x4e\x63"
- "\x78\x8d\xa2\xb7\xcc\xe1\xf6\x0b"
- "\x20\x35\x4a\x5f\x74\x89\x9e\xb3"
- "\xc8\xdd\xf2\x07\x1c\x31\x46\x5b"
- "\x70\x85\x9a\xaf\xc4\xd9\xee\x03"
- "\x18\x2d\x42\x57\x6c\x81\x96\xab"
- "\xc0\xd5\xea\xff\x14\x29\x3e\x53"
- "\x68\x7d\x92\xa7\xbc\xd1\xe6\xfb"
- "\x10\x25\x3a\x4f\x64\x79\x8e\xa3"
- "\xb8\xcd\xe2\xf7\x0c\x21\x36\x4b"
- "\x60\x75\x8a\x9f\xb4\xc9\xde\xf3"
- "\x08\x1d\x32\x47\x5c\x71\x86\x9b"
- "\xb0\xc5\xda\xef\x04\x19\x2e\x43"
- "\x58\x6d\x82\x97\xac\xc1\xd6\xeb"
- "\x00\x17\x2e\x45\x5c\x73\x8a\xa1"
- "\xb8\xcf\xe6\xfd\x14\x2b\x42\x59"
- "\x70\x87\x9e\xb5\xcc\xe3\xfa\x11"
- "\x28\x3f\x56\x6d\x84\x9b\xb2\xc9"
- "\xe0\xf7\x0e\x25\x3c\x53\x6a\x81"
- "\x98\xaf\xc6\xdd\xf4\x0b\x22\x39"
- "\x50\x67\x7e\x95\xac\xc3\xda\xf1"
- "\x08\x1f\x36\x4d\x64\x7b\x92\xa9"
- "\xc0\xd7\xee\x05\x1c\x33\x4a\x61"
- "\x78\x8f\xa6\xbd\xd4\xeb\x02\x19"
- "\x30\x47\x5e\x75\x8c\xa3\xba\xd1"
- "\xe8\xff\x16\x2d\x44\x5b\x72\x89"
- "\xa0\xb7\xce\xe5\xfc\x13\x2a\x41"
- "\x58\x6f\x86\x9d\xb4\xcb\xe2\xf9"
- "\x10\x27\x3e\x55\x6c\x83\x9a\xb1"
- "\xc8\xdf\xf6\x0d\x24\x3b\x52\x69"
- "\x80\x97\xae\xc5\xdc\xf3\x0a\x21"
- "\x38\x4f\x66\x7d\x94\xab\xc2\xd9"
- "\xf0\x07\x1e\x35\x4c\x63\x7a\x91"
- "\xa8\xbf\xd6\xed\x04\x1b\x32\x49"
- "\x60\x77\x8e\xa5\xbc\xd3\xea\x01"
- "\x18\x2f\x46\x5d\x74\x8b\xa2\xb9"
- "\xd0\xe7\xfe\x15\x2c\x43\x5a\x71"
- "\x88\x9f\xb6\xcd\xe4\xfb\x12\x29"
- "\x40\x57\x6e\x85\x9c\xb3\xca\xe1"
- "\xf8\x0f\x26\x3d\x54\x6b\x82\x99"
- "\xb0\xc7\xde\xf5\x0c\x23\x3a\x51"
- "\x68\x7f\x96\xad\xc4\xdb\xf2\x09"
- "\x20\x37\x4e\x65\x7c\x93\xaa\xc1"
- "\xd8\xef\x06\x1d\x34\x4b\x62\x79"
- "\x90\xa7\xbe\xd5\xec\x03\x1a\x31"
- "\x48\x5f\x76\x8d\xa4\xbb\xd2\xe9"
- "\x00\x19\x32\x4b\x64\x7d\x96\xaf"
- "\xc8\xe1\xfa\x13\x2c\x45\x5e\x77"
- "\x90\xa9\xc2\xdb\xf4\x0d\x26\x3f"
- "\x58\x71\x8a\xa3\xbc\xd5\xee\x07"
- "\x20\x39\x52\x6b\x84\x9d\xb6\xcf"
- "\xe8\x01\x1a\x33\x4c\x65\x7e\x97"
- "\xb0\xc9\xe2\xfb\x14\x2d\x46\x5f"
- "\x78\x91\xaa\xc3\xdc\xf5\x0e\x27"
- "\x40\x59\x72\x8b\xa4\xbd\xd6\xef"
- "\x08\x21\x3a\x53\x6c\x85\x9e\xb7"
- "\xd0\xe9\x02\x1b\x34\x4d\x66\x7f"
- "\x98\xb1\xca\xe3\xfc\x15\x2e\x47"
- "\x60\x79\x92\xab\xc4\xdd\xf6\x0f"
- "\x28\x41\x5a\x73\x8c\xa5\xbe\xd7"
- "\xf0\x09\x22\x3b\x54\x6d\x86\x9f"
- "\xb8\xd1\xea\x03\x1c\x35\x4e\x67"
- "\x80\x99\xb2\xcb\xe4\xfd\x16\x2f"
- "\x48\x61\x7a\x93\xac\xc5\xde\xf7"
- "\x10\x29\x42\x5b\x74\x8d\xa6\xbf"
- "\xd8\xf1\x0a\x23\x3c\x55\x6e\x87"
- "\xa0\xb9\xd2\xeb\x04\x1d\x36\x4f"
- "\x68\x81\x9a\xb3\xcc\xe5\xfe\x17"
- "\x30\x49\x62\x7b\x94\xad\xc6\xdf"
- "\xf8\x11\x2a\x43\x5c\x75\x8e\xa7"
- "\xc0\xd9\xf2\x0b\x24\x3d\x56\x6f"
- "\x88\xa1\xba\xd3\xec\x05\x1e\x37"
- "\x50\x69\x82\x9b\xb4\xcd\xe6\xff"
- "\x18\x31\x4a\x63\x7c\x95\xae\xc7"
- "\xe0\xf9\x12\x2b\x44\x5d\x76\x8f"
- "\xa8\xc1\xda\xf3\x0c\x25\x3e\x57"
- "\x70\x89\xa2\xbb\xd4\xed\x06\x1f"
- "\x38\x51\x6a\x83\x9c\xb5\xce\xe7"
- "\x00\x1b\x36\x51\x6c\x87\xa2\xbd"
- "\xd8\xf3\x0e\x29\x44\x5f\x7a\x95"
- "\xb0\xcb\xe6\x01\x1c\x37\x52\x6d"
- "\x88\xa3\xbe\xd9\xf4\x0f\x2a\x45"
- "\x60\x7b\x96\xb1\xcc\xe7\x02\x1d"
- "\x38\x53\x6e\x89\xa4\xbf\xda\xf5"
- "\x10\x2b\x46\x61\x7c\x97\xb2\xcd"
- "\xe8\x03\x1e\x39\x54\x6f\x8a\xa5"
- "\xc0\xdb\xf6\x11\x2c\x47\x62\x7d"
- "\x98\xb3\xce\xe9\x04\x1f\x3a\x55"
- "\x70\x8b\xa6\xc1\xdc\xf7\x12\x2d"
- "\x48\x63\x7e\x99\xb4\xcf\xea\x05"
- "\x20\x3b\x56\x71\x8c\xa7\xc2\xdd"
- "\xf8\x13\x2e\x49\x64\x7f\x9a\xb5"
- "\xd0\xeb\x06\x21\x3c\x57\x72\x8d"
- "\xa8\xc3\xde\xf9\x14\x2f\x4a\x65"
- "\x80\x9b\xb6\xd1\xec\x07\x22\x3d"
- "\x58\x73\x8e\xa9\xc4\xdf\xfa\x15"
- "\x30\x4b\x66\x81\x9c\xb7\xd2\xed"
- "\x08\x23\x3e\x59\x74\x8f\xaa\xc5"
- "\xe0\xfb\x16\x31\x4c\x67\x82\x9d"
- "\xb8\xd3\xee\x09\x24\x3f\x5a\x75"
- "\x90\xab\xc6\xe1\xfc\x17\x32\x4d"
- "\x68\x83\x9e\xb9\xd4\xef\x0a\x25"
- "\x40\x5b\x76\x91\xac\xc7\xe2\xfd"
- "\x18\x33\x4e\x69\x84\x9f\xba\xd5"
- "\xf0\x0b\x26\x41\x5c\x77\x92\xad"
- "\xc8\xe3\xfe\x19\x34\x4f\x6a\x85"
- "\xa0\xbb\xd6\xf1\x0c\x27\x42\x5d"
- "\x78\x93\xae\xc9\xe4\xff\x1a\x35"
- "\x50\x6b\x86\xa1\xbc\xd7\xf2\x0d"
- "\x28\x43\x5e\x79\x94\xaf\xca\xe5"
- "\x00\x1d\x3a\x57\x74\x91\xae\xcb"
- "\xe8\x05\x22\x3f\x5c\x79\x96\xb3"
- "\xd0\xed\x0a\x27\x44\x61\x7e\x9b"
- "\xb8\xd5\xf2\x0f\x2c\x49\x66\x83"
- "\xa0\xbd\xda\xf7\x14\x31\x4e\x6b"
- "\x88\xa5\xc2\xdf\xfc\x19\x36\x53"
- "\x70\x8d\xaa\xc7\xe4\x01\x1e\x3b"
- "\x58\x75\x92\xaf\xcc\xe9\x06\x23"
- "\x40\x5d\x7a\x97\xb4\xd1\xee\x0b"
- "\x28\x45\x62\x7f\x9c\xb9\xd6\xf3"
- "\x10\x2d\x4a\x67\x84\xa1\xbe\xdb"
- "\xf8\x15\x32\x4f\x6c\x89\xa6\xc3"
- "\xe0\xfd\x1a\x37\x54\x71\x8e\xab"
- "\xc8\xe5\x02\x1f\x3c\x59\x76\x93"
- "\xb0\xcd\xea\x07\x24\x41\x5e\x7b"
- "\x98\xb5\xd2\xef\x0c\x29\x46\x63"
- "\x80\x9d\xba\xd7\xf4\x11\x2e\x4b"
- "\x68\x85\xa2\xbf\xdc\xf9\x16\x33"
- "\x50\x6d\x8a\xa7\xc4\xe1\xfe\x1b"
- "\x38\x55\x72\x8f\xac\xc9\xe6\x03"
- "\x20\x3d\x5a\x77\x94\xb1\xce\xeb"
- "\x08\x25\x42\x5f\x7c\x99\xb6\xd3"
- "\xf0\x0d\x2a\x47\x64\x81\x9e\xbb"
- "\xd8\xf5\x12\x2f\x4c\x69\x86\xa3"
- "\xc0\xdd\xfa\x17\x34\x51\x6e\x8b"
- "\xa8\xc5\xe2\xff\x1c\x39\x56\x73"
- "\x90\xad\xca\xe7\x04\x21\x3e\x5b"
- "\x78\x95\xb2\xcf\xec\x09\x26\x43"
- "\x60\x7d\x9a\xb7\xd4\xf1\x0e\x2b"
- "\x48\x65\x82\x9f\xbc\xd9\xf6\x13"
- "\x30\x4d\x6a\x87\xa4\xc1\xde\xfb"
- "\x18\x35\x52\x6f\x8c\xa9\xc6\xe3"
- "\x00\x1f\x3e\x5d\x7c\x9b\xba\xd9"
- "\xf8\x17\x36\x55\x74\x93\xb2\xd1"
- "\xf0\x0f\x2e\x4d\x6c\x8b\xaa\xc9"
- "\xe8\x07\x26\x45\x64\x83\xa2\xc1"
- "\xe0\xff\x1e\x3d\x5c\x7b\x9a\xb9"
- "\xd8\xf7\x16\x35\x54\x73\x92\xb1"
- "\xd0\xef\x0e\x2d\x4c\x6b\x8a\xa9"
- "\xc8\xe7\x06\x25\x44\x63\x82\xa1"
- "\xc0\xdf\xfe\x1d\x3c\x5b\x7a\x99"
- "\xb8\xd7\xf6\x15\x34\x53\x72\x91"
- "\xb0\xcf\xee\x0d\x2c\x4b\x6a\x89"
- "\xa8\xc7\xe6\x05\x24\x43\x62\x81"
- "\xa0\xbf\xde\xfd\x1c\x3b\x5a\x79"
- "\x98\xb7\xd6\xf5\x14\x33\x52\x71"
- "\x90\xaf\xce\xed\x0c\x2b\x4a\x69"
- "\x88\xa7\xc6\xe5\x04\x23\x42\x61"
- "\x80\x9f\xbe\xdd\xfc\x1b\x3a\x59"
- "\x78\x97\xb6\xd5\xf4\x13\x32\x51"
- "\x70\x8f\xae\xcd\xec\x0b\x2a\x49"
- "\x68\x87\xa6\xc5\xe4\x03\x22\x41"
- "\x60\x7f\x9e\xbd\xdc\xfb\x1a\x39"
- "\x58\x77\x96\xb5\xd4\xf3\x12\x31"
- "\x50\x6f\x8e\xad\xcc\xeb\x0a\x29"
- "\x48\x67\x86\xa5\xc4\xe3\x02\x21"
- "\x40\x5f\x7e\x9d\xbc\xdb\xfa\x19"
- "\x38\x57\x76\x95\xb4\xd3\xf2\x11"
- "\x30\x4f\x6e\x8d\xac\xcb\xea\x09"
- "\x28\x47\x66\x85\xa4\xc3\xe2\x01"
- "\x20\x3f\x5e\x7d\x9c\xbb\xda\xf9"
- "\x18\x37\x56\x75\x94\xb3\xd2\xf1"
- "\x10\x2f\x4e\x6d\x8c\xab\xca\xe9"
- "\x08\x27\x46\x65\x84\xa3\xc2\xe1"
- "\x00\x21\x42\x63",
- .ilen = 4100,
- .result =
- "\xb5\x81\xf5\x64\x18\x73\xe3\xf0"
- "\x4c\x13\xf2\x77\x18\x60\x65\x5e"
- "\x29\x01\xce\x98\x55\x53\xf9\x0c"
- "\x2a\x08\xd5\x09\xb3\x57\x55\x56"
- "\xc5\xe9\x56\x90\xcb\x6a\xa3\xc0"
- "\xff\xc4\x79\xb4\xd2\x97\x5d\xc4"
- "\x43\xd1\xfe\x94\x7b\x88\x06\x5a"
- "\xb2\x9e\x2c\xfc\x44\x03\xb7\x90"
- "\xa0\xc1\xba\x6a\x33\xb8\xc7\xb2"
- "\x9d\xe1\x12\x4f\xc0\x64\xd4\x01"
- "\xfe\x8c\x7a\x66\xf7\xe6\x5a\x91"
- "\xbb\xde\x56\x86\xab\x65\x21\x30"
- "\x00\x84\x65\x24\xa5\x7d\x85\xb4"
- "\xe3\x17\xed\x3a\xb7\x6f\xb4\x0b"
- "\x0b\xaf\x15\xae\x5a\x8f\xf2\x0c"
- "\x2f\x27\xf4\x09\xd8\xd2\x96\xb7"
- "\x71\xf2\xc5\x99\x4d\x7e\x7f\x75"
- "\x77\x89\x30\x8b\x59\xdb\xa2\xb2"
- "\xa0\xf3\x19\x39\x2b\xc5\x7e\x3f"
- "\x4f\xd9\xd3\x56\x28\x97\x44\xdc"
- "\xc0\x8b\x77\x24\xd9\x52\xe7\xc5"
- "\xaf\xf6\x7d\x59\xb2\x44\x05\x1d"
- "\xb1\xb0\x11\xa5\x0f\xec\x33\xe1"
- "\x6d\x1b\x4e\x1f\xff\x57\x91\xb4"
- "\x5b\x9a\x96\xc5\x53\xbc\xae\x20"
- "\x3c\xbb\x14\xe2\xe8\x22\x33\xc1"
- "\x5e\x76\x9e\x46\x99\xf6\x2a\x15"
- "\xc6\x97\x02\xa0\x66\x43\xd1\xa6"
- "\x31\xa6\x9f\xfb\xf4\xd3\x69\xe5"
- "\xcd\x76\x95\xb8\x7a\x82\x7f\x21"
- "\x45\xff\x3f\xce\x55\xf6\x95\x10"
- "\x08\x77\x10\x43\xc6\xf3\x09\xe5"
- "\x68\xe7\x3c\xad\x00\x52\x45\x0d"
- "\xfe\x2d\xc6\xc2\x94\x8c\x12\x1d"
- "\xe6\x25\xae\x98\x12\x8e\x19\x9c"
- "\x81\x68\xb1\x11\xf6\x69\xda\xe3"
- "\x62\x08\x18\x7a\x25\x49\x28\xac"
- "\xba\x71\x12\x0b\xe4\xa2\xe5\xc7"
- "\x5d\x8e\xec\x49\x40\x21\xbf\x5a"
- "\x98\xf3\x02\x68\x55\x03\x7f\x8a"
- "\xe5\x94\x0c\x32\x5c\x07\x82\x63"
- "\xaf\x6f\x91\x40\x84\x8e\x52\x25"
- "\xd0\xb0\x29\x53\x05\xe2\x50\x7a"
- "\x34\xeb\xc9\x46\x20\xa8\x3d\xde"
- "\x7f\x16\x5f\x36\xc5\x2e\xdc\xd1"
- "\x15\x47\xc7\x50\x40\x6d\x91\xc5"
- "\xe7\x93\x95\x1a\xd3\x57\xbc\x52"
- "\x33\xee\x14\x19\x22\x52\x89\xa7"
- "\x4a\x25\x56\x77\x4b\xca\xcf\x0a"
- "\xe1\xf5\x35\x85\x30\x7e\x59\x4a"
- "\xbd\x14\x5b\xdf\xe3\x46\xcb\xac"
- "\x1f\x6c\x96\x0e\xf4\x81\xd1\x99"
- "\xca\x88\x63\x3d\x02\x58\x6b\xa9"
- "\xe5\x9f\xb3\x00\xb2\x54\xc6\x74"
- "\x1c\xbf\x46\xab\x97\xcc\xf8\x54"
- "\x04\x07\x08\x52\xe6\xc0\xda\x93"
- "\x74\x7d\x93\x99\x5d\x78\x68\xa6"
- "\x2e\x6b\xd3\x6a\x69\xcc\x12\x6b"
- "\xd4\xc7\xa5\xc6\xe7\xf6\x03\x04"
- "\x5d\xcd\x61\x5e\x17\x40\xdc\xd1"
- "\x5c\xf5\x08\xdf\x5c\x90\x85\xa4"
- "\xaf\xf6\x78\xbb\x0d\xf1\xf4\xa4"
- "\x54\x26\x72\x9e\x61\xfa\x86\xcf"
- "\xe8\x9e\xa1\xe0\xc7\x48\x23\xae"
- "\x5a\x90\xae\x75\x0a\x74\x18\x89"
- "\x05\xb1\x92\xb2\x7f\xd0\x1b\xa6"
- "\x62\x07\x25\x01\xc7\xc2\x4f\xf9"
- "\xe8\xfe\x63\x95\x80\x07\xb4\x26"
- "\xcc\xd1\x26\xb6\xc4\x3f\x9e\xcb"
- "\x8e\x3b\x2e\x44\x16\xd3\x10\x9a"
- "\x95\x08\xeb\xc8\xcb\xeb\xbf\x6f"
- "\x0b\xcd\x1f\xc8\xca\x86\xaa\xec"
- "\x33\xe6\x69\xf4\x45\x25\x86\x3a"
- "\x22\x94\x4f\x00\x23\x6a\x44\xc2"
- "\x49\x97\x33\xab\x36\x14\x0a\x70"
- "\x24\xc3\xbe\x04\x3b\x79\xa0\xf9"
- "\xb8\xe7\x76\x29\x22\x83\xd7\xf2"
- "\x94\xf4\x41\x49\xba\x5f\x7b\x07"
- "\xb5\xfb\xdb\x03\x1a\x9f\xb6\x4c"
- "\xc2\x2e\x37\x40\x49\xc3\x38\x16"
- "\xe2\x4f\x77\x82\xb0\x68\x4c\x71"
- "\x1d\x57\x61\x9c\xd9\x4e\x54\x99"
- "\x47\x13\x28\x73\x3c\xbb\x00\x90"
- "\xf3\x4d\xc9\x0e\xfd\xe7\xb1\x71"
- "\xd3\x15\x79\xbf\xcc\x26\x2f\xbd"
- "\xad\x6c\x50\x69\x6c\x3e\x6d\x80"
- "\x9a\xea\x78\xaf\x19\xb2\x0d\x4d"
- "\xad\x04\x07\xae\x22\x90\x4a\x93"
- "\x32\x0e\x36\x9b\x1b\x46\xba\x3b"
- "\xb4\xac\xc6\xd1\xa2\x31\x53\x3b"
- "\x2a\x3d\x45\xfe\x03\x61\x10\x85"
- "\x17\x69\xa6\x78\xcc\x6c\x87\x49"
- "\x53\xf9\x80\x10\xde\x80\xa2\x41"
- "\x6a\xc3\x32\x02\xad\x6d\x3c\x56"
- "\x00\x71\x51\x06\xa7\xbd\xfb\xef"
- "\x3c\xb5\x9f\xfc\x48\x7d\x53\x7c"
- "\x66\xb0\x49\x23\xc4\x47\x10\x0e"
- "\xe5\x6c\x74\x13\xe6\xc5\x3f\xaa"
- "\xde\xff\x07\x44\xdd\x56\x1b\xad"
- "\x09\x77\xfb\x5b\x12\xb8\x0d\x38"
- "\x17\x37\x35\x7b\x9b\xbc\xfe\xd4"
- "\x7e\x8b\xda\x7e\x5b\x04\xa7\x22"
- "\xa7\x31\xa1\x20\x86\xc7\x1b\x99"
- "\xdb\xd1\x89\xf4\x94\xa3\x53\x69"
- "\x8d\xe7\xe8\x74\x11\x8d\x74\xd6"
- "\x07\x37\x91\x9f\xfd\x67\x50\x3a"
- "\xc9\xe1\xf4\x36\xd5\xa0\x47\xd1"
- "\xf9\xe5\x39\xa3\x31\xac\x07\x36"
- "\x23\xf8\x66\x18\x14\x28\x34\x0f"
- "\xb8\xd0\xe7\x29\xb3\x04\x4b\x55"
- "\x01\x41\xb2\x75\x8d\xcb\x96\x85"
- "\x3a\xfb\xab\x2b\x9e\xfa\x58\x20"
- "\x44\x1f\xc0\x14\x22\x75\x61\xe8"
- "\xaa\x19\xcf\xf1\x82\x56\xf4\xd7"
- "\x78\x7b\x3d\x5f\xb3\x9e\x0b\x8a"
- "\x57\x50\xdb\x17\x41\x65\x4d\xa3"
- "\x02\xc9\x9c\x9c\x53\xfb\x39\x39"
- "\x9b\x1d\x72\x24\xda\xb7\x39\xbe"
- "\x13\x3b\xfa\x29\xda\x9e\x54\x64"
- "\x6e\xba\xd8\xa1\xcb\xb3\x36\xfa"
- "\xcb\x47\x85\xe9\x61\x38\xbc\xbe"
- "\xc5\x00\x38\x2a\x54\xf7\xc4\xb9"
- "\xb3\xd3\x7b\xa0\xa0\xf8\x72\x7f"
- "\x8c\x8e\x82\x0e\xc6\x1c\x75\x9d"
- "\xca\x8e\x61\x87\xde\xad\x80\xd2"
- "\xf5\xf9\x80\xef\x15\x75\xaf\xf5"
- "\x80\xfb\xff\x6d\x1e\x25\xb7\x40"
- "\x61\x6a\x39\x5a\x6a\xb5\x31\xab"
- "\x97\x8a\x19\x89\x44\x40\xc0\xa6"
- "\xb4\x4e\x30\x32\x7b\x13\xe7\x67"
- "\xa9\x8b\x57\x04\xc2\x01\xa6\xf4"
- "\x28\x99\xad\x2c\x76\xa3\x78\xc2"
- "\x4a\xe6\xca\x5c\x50\x6a\xc1\xb0"
- "\x62\x4b\x10\x8e\x7c\x17\x43\xb3"
- "\x17\x66\x1c\x3e\x8d\x69\xf0\x5a"
- "\x71\xf5\x97\xdc\xd1\x45\xdd\x28"
- "\xf3\x5d\xdf\x53\x7b\x11\xe5\xbc"
- "\x4c\xdb\x1b\x51\x6b\xe9\xfb\x3d"
- "\xc1\xc3\x2c\xb9\x71\xf5\xb6\xb2"
- "\x13\x36\x79\x80\x53\xe8\xd3\xa6"
- "\x0a\xaf\xfd\x56\x97\xf7\x40\x8e"
- "\x45\xce\xf8\xb0\x9e\x5c\x33\x82"
- "\xb0\x44\x56\xfc\x05\x09\xe9\x2a"
- "\xac\x26\x80\x14\x1d\xc8\x3a\x35"
- "\x4c\x82\x97\xfd\x76\xb7\xa9\x0a"
- "\x35\x58\x79\x8e\x0f\x66\xea\xaf"
- "\x51\x6c\x09\xa9\x6e\x9b\xcb\x9a"
- "\x31\x47\xa0\x2f\x7c\x71\xb4\x4a"
- "\x11\xaa\x8c\x66\xc5\x64\xe6\x3a"
- "\x54\xda\x24\x6a\xc4\x41\x65\x46"
- "\x82\xa0\x0a\x0f\x5f\xfb\x25\xd0"
- "\x2c\x91\xa7\xee\xc4\x81\x07\x86"
- "\x75\x5e\x33\x69\x97\xe4\x2c\xa8"
- "\x9d\x9f\x0b\x6a\xbe\xad\x98\xda"
- "\x6d\x94\x41\xda\x2c\x1e\x89\xc4"
- "\xc2\xaf\x1e\x00\x05\x0b\x83\x60"
- "\xbd\x43\xea\x15\x23\x7f\xb9\xac"
- "\xee\x4f\x2c\xaf\x2a\xf3\xdf\xd0"
- "\xf3\x19\x31\xbb\x4a\x74\x84\x17"
- "\x52\x32\x2c\x7d\x61\xe4\xcb\xeb"
- "\x80\x38\x15\x52\xcb\x6f\xea\xe5"
- "\x73\x9c\xd9\x24\x69\xc6\x95\x32"
- "\x21\xc8\x11\xe4\xdc\x36\xd7\x93"
- "\x38\x66\xfb\xb2\x7f\x3a\xb9\xaf"
- "\x31\xdd\x93\x75\x78\x8a\x2c\x94"
- "\x87\x1a\x58\xec\x9e\x7d\x4d\xba"
- "\xe1\xe5\x4d\xfc\xbc\xa4\x2a\x14"
- "\xef\xcc\xa7\xec\xab\x43\x09\x18"
- "\xd3\xab\x68\xd1\x07\x99\x44\x47"
- "\xd6\x83\x85\x3b\x30\xea\xa9\x6b"
- "\x63\xea\xc4\x07\xfb\x43\x2f\xa4"
- "\xaa\xb0\xab\x03\x89\xce\x3f\x8c"
- "\x02\x7c\x86\x54\xbc\x88\xaf\x75"
- "\xd2\xdc\x63\x17\xd3\x26\xf6\x96"
- "\xa9\x3c\xf1\x61\x8c\x11\x18\xcc"
- "\xd6\xea\x5b\xe2\xcd\xf0\xf1\xb2"
- "\xe5\x35\x90\x1f\x85\x4c\x76\x5b"
- "\x66\xce\x44\xa4\x32\x9f\xe6\x7b"
- "\x71\x6e\x9f\x58\x15\x67\x72\x87"
- "\x64\x8e\x3a\x44\x45\xd4\x76\xfa"
- "\xc2\xf6\xef\x85\x05\x18\x7a\x9b"
- "\xba\x41\x54\xac\xf0\xfc\x59\x12"
- "\x3f\xdf\xa0\xe5\x8a\x65\xfd\x3a"
- "\x62\x8d\x83\x2c\x03\xbe\x05\x76"
- "\x2e\x53\x49\x97\x94\x33\xae\x40"
- "\x81\x15\xdb\x6e\xad\xaa\xf5\x4b"
- "\xe3\x98\x70\xdf\xe0\x7c\xcd\xdb"
- "\x02\xd4\x7d\x2f\xc1\xe6\xb4\xf3"
- "\xd7\x0d\x7a\xd9\x23\x9e\x87\x2d"
- "\xce\x87\xad\xcc\x72\x05\x00\x29"
- "\xdc\x73\x7f\x64\xc1\x15\x0e\xc2"
- "\xdf\xa7\x5f\xeb\x41\xa1\xcd\xef"
- "\x5c\x50\x79\x2a\x56\x56\x71\x8c"
- "\xac\xc0\x79\x50\x69\xca\x59\x32"
- "\x65\xf2\x54\xe4\x52\x38\x76\xd1"
- "\x5e\xde\x26\x9e\xfb\x75\x2e\x11"
- "\xb5\x10\xf4\x17\x73\xf5\x89\xc7"
- "\x4f\x43\x5c\x8e\x7c\xb9\x05\x52"
- "\x24\x40\x99\xfe\x9b\x85\x0b\x6c"
- "\x22\x3e\x8b\xae\x86\xa1\xd2\x79"
- "\x05\x68\x6b\xab\xe3\x41\x49\xed"
- "\x15\xa1\x8d\x40\x2d\x61\xdf\x1a"
- "\x59\xc9\x26\x8b\xef\x30\x4c\x88"
- "\x4b\x10\xf8\x8d\xa6\x92\x9f\x4b"
- "\xf3\xc4\x53\x0b\x89\x5d\x28\x92"
- "\xcf\x78\xb2\xc0\x5d\xed\x7e\xfc"
- "\xc0\x12\x23\x5f\x5a\x78\x86\x43"
- "\x6e\x27\xf7\x5a\xa7\x6a\xed\x19"
- "\x04\xf0\xb3\x12\xd1\xbd\x0e\x89"
- "\x6e\xbc\x96\xa8\xd8\x49\x39\x9f"
- "\x7e\x67\xf0\x2e\x3e\x01\xa9\xba"
- "\xec\x8b\x62\x8e\xcb\x4a\x70\x43"
- "\xc7\xc2\xc4\xca\x82\x03\x73\xe9"
- "\x11\xdf\xcf\x54\xea\xc9\xb0\x95"
- "\x51\xc0\x13\x3d\x92\x05\xfa\xf4"
- "\xa9\x34\xc8\xce\x6c\x3d\x54\xcc"
- "\xc4\xaf\xf1\xdc\x11\x44\x26\xa2"
- "\xaf\xf1\x85\x75\x7d\x03\x61\x68"
- "\x4e\x78\xc6\x92\x7d\x86\x7d\x77"
- "\xdc\x71\x72\xdb\xc6\xae\xa1\xcb"
- "\x70\x9a\x0b\x19\xbe\x4a\x6c\x2a"
- "\xe2\xba\x6c\x64\x9a\x13\x28\xdf"
- "\x85\x75\xe6\x43\xf6\x87\x08\x68"
- "\x6e\xba\x6e\x79\x9f\x04\xbc\x23"
- "\x50\xf6\x33\x5c\x1f\x24\x25\xbe"
- "\x33\x47\x80\x45\x56\xa3\xa7\xd7"
- "\x7a\xb1\x34\x0b\x90\x3c\x9c\xad"
- "\x44\x5f\x9e\x0e\x9d\xd4\xbd\x93"
- "\x5e\xfa\x3c\xe0\xb0\xd9\xed\xf3"
- "\xd6\x2e\xff\x24\xd8\x71\x6c\xed"
- "\xaf\x55\xeb\x22\xac\x93\x68\x32"
- "\x05\x5b\x47\xdd\xc6\x4a\xcb\xc7"
- "\x10\xe1\x3c\x92\x1a\xf3\x23\x78"
- "\x2b\xa1\xd2\x80\xf4\x12\xb1\x20"
- "\x8f\xff\x26\x35\xdd\xfb\xc7\x4e"
- "\x78\xf1\x2d\x50\x12\x77\xa8\x60"
- "\x7c\x0f\xf5\x16\x2f\x63\x70\x2a"
- "\xc0\x96\x80\x4e\x0a\xb4\x93\x35"
- "\x5d\x1d\x3f\x56\xf7\x2f\xbb\x90"
- "\x11\x16\x8f\xa2\xec\x47\xbe\xac"
- "\x56\x01\x26\x56\xb1\x8c\xb2\x10"
- "\xf9\x1a\xca\xf5\xd1\xb7\x39\x20"
- "\x63\xf1\x69\x20\x4f\x13\x12\x1f"
- "\x5b\x65\xfc\x98\xf7\xc4\x7a\xbe"
- "\xf7\x26\x4d\x2b\x84\x7b\x42\xad"
- "\xd8\x7a\x0a\xb4\xd8\x74\xbf\xc1"
- "\xf0\x6e\xb4\x29\xa3\xbb\xca\x46"
- "\x67\x70\x6a\x2d\xce\x0e\xa2\x8a"
- "\xa9\x87\xbf\x05\xc4\xc1\x04\xa3"
- "\xab\xd4\x45\x43\x8c\xb6\x02\xb0"
- "\x41\xc8\xfc\x44\x3d\x59\xaa\x2e"
- "\x44\x21\x2a\x8d\x88\x9d\x57\xf4"
- "\xa0\x02\x77\xb8\xa6\xa0\xe6\x75"
- "\x5c\x82\x65\x3e\x03\x5c\x29\x8f"
- "\x38\x55\xab\x33\x26\xef\x9f\x43"
- "\x52\xfd\x68\xaf\x36\xb4\xbb\x9a"
- "\x58\x09\x09\x1b\xc3\x65\x46\x46"
- "\x1d\xa7\x94\x18\x23\x50\x2c\xca"
- "\x2c\x55\x19\x97\x01\x9d\x93\x3b"
- "\x63\x86\xf2\x03\x67\x45\xd2\x72"
- "\x28\x52\x6c\xf4\xe3\x1c\xb5\x11"
- "\x13\xf1\xeb\x21\xc7\xd9\x56\x82"
- "\x2b\x82\x39\xbd\x69\x54\xed\x62"
- "\xc3\xe2\xde\x73\xd4\x6a\x12\xae"
- "\x13\x21\x7f\x4b\x5b\xfc\xbf\xe8"
- "\x2b\xbe\x56\xba\x68\x8b\x9a\xb1"
- "\x6e\xfa\xbf\x7e\x5a\x4b\xf1\xac"
- "\x98\x65\x85\xd1\x93\x53\xd3\x7b"
- "\x09\xdd\x4b\x10\x6d\x84\xb0\x13"
- "\x65\xbd\xcf\x52\x09\xc4\x85\xe2"
- "\x84\x74\x15\x65\xb7\xf7\x51\xaf"
- "\x55\xad\xa4\xd1\x22\x54\x70\x94"
- "\xa0\x1c\x90\x41\xfd\x99\xd7\x5a"
- "\x31\xef\xaa\x25\xd0\x7f\x4f\xea"
- "\x1d\x55\x42\xe5\x49\xb0\xd0\x46"
- "\x62\x36\x43\xb2\x82\x15\x75\x50"
- "\xa4\x72\xeb\x54\x27\x1f\x8a\xe4"
- "\x7d\xe9\x66\xc5\xf1\x53\xa4\xd1"
- "\x0c\xeb\xb8\xf8\xbc\xd4\xe2\xe7"
- "\xe1\xf8\x4b\xcb\xa9\xa1\xaf\x15"
- "\x83\xcb\x72\xd0\x33\x79\x00\x2d"
- "\x9f\xd7\xf1\x2e\x1e\x10\xe4\x45"
- "\xc0\x75\x3a\x39\xea\x68\xf7\x5d"
- "\x1b\x73\x8f\xe9\x8e\x0f\x72\x47"
- "\xae\x35\x0a\x31\x7a\x14\x4d\x4a"
- "\x6f\x47\xf7\x7e\x91\x6e\x74\x8b"
- "\x26\x47\xf9\xc3\xf9\xde\x70\xf5"
- "\x61\xab\xa9\x27\x9f\x82\xe4\x9c"
- "\x89\x91\x3f\x2e\x6a\xfd\xb5\x49"
- "\xe9\xfd\x59\x14\x36\x49\x40\x6d"
- "\x32\xd8\x85\x42\xf3\xa5\xdf\x0c"
- "\xa8\x27\xd7\x54\xe2\x63\x2f\xf2"
- "\x7e\x8b\x8b\xe7\xf1\x9a\x95\x35"
- "\x43\xdc\x3a\xe4\xb6\xf4\xd0\xdf"
- "\x9c\xcb\x94\xf3\x21\xa0\x77\x50"
- "\xe2\xc6\xc4\xc6\x5f\x09\x64\x5b"
- "\x92\x90\xd8\xe1\xd1\xed\x4b\x42"
- "\xd7\x37\xaf\x65\x3d\x11\x39\xb6"
- "\x24\x8a\x60\xae\xd6\x1e\xbf\x0e"
- "\x0d\xd7\xdc\x96\x0e\x65\x75\x4e"
- "\x29\x06\x9d\xa4\x51\x3a\x10\x63"
- "\x8f\x17\x07\xd5\x8e\x3c\xf4\x28"
- "\x00\x5a\x5b\x05\x19\xd8\xc0\x6c"
- "\xe5\x15\xe4\x9c\x9d\x71\x9d\x5e"
- "\x94\x29\x1a\xa7\x80\xfa\x0e\x33"
- "\x03\xdd\xb7\x3e\x9a\xa9\x26\x18"
- "\x37\xa9\x64\x08\x4d\x94\x5a\x88"
- "\xca\x35\xce\x81\x02\xe3\x1f\x1b"
- "\x89\x1a\x77\x85\xe3\x41\x6d\x32"
- "\x42\x19\x23\x7d\xc8\x73\xee\x25"
- "\x85\x0d\xf8\x31\x25\x79\x1b\x6f"
- "\x79\x25\xd2\xd8\xd4\x23\xfd\xf7"
- "\x82\x36\x6a\x0c\x46\x22\x15\xe9"
- "\xff\x72\x41\x91\x91\x7d\x3a\xb7"
- "\xdd\x65\x99\x70\xf6\x8d\x84\xf8"
- "\x67\x15\x20\x11\xd6\xb2\x55\x7b"
- "\xdb\x87\xee\xef\x55\x89\x2a\x59"
- "\x2b\x07\x8f\x43\x8a\x59\x3c\x01"
- "\x8b\x65\x54\xa1\x66\xd5\x38\xbd"
- "\xc6\x30\xa9\xcc\x49\xb6\xa8\x1b"
- "\xb8\xc0\x0e\xe3\x45\x28\xe2\xff"
- "\x41\x9f\x7e\x7c\xd1\xae\x9e\x25"
- "\x3f\x4c\x7c\x7c\xf4\xa8\x26\x4d"
- "\x5c\xfd\x4b\x27\x18\xf9\x61\x76"
- "\x48\xba\x0c\x6b\xa9\x4d\xfc\xf5"
- "\x3b\x35\x7e\x2f\x4a\xa9\xc2\x9a"
- "\xae\xab\x86\x09\x89\xc9\xc2\x40"
- "\x39\x2c\x81\xb3\xb8\x17\x67\xc2"
- "\x0d\x32\x4a\x3a\x67\x81\xd7\x1a"
- "\x34\x52\xc5\xdb\x0a\xf5\x63\x39"
- "\xea\x1f\xe1\x7c\xa1\x9e\xc1\x35"
- "\xe3\xb1\x18\x45\x67\xf9\x22\x38"
- "\x95\xd9\x34\x34\x86\xc6\x41\x94"
- "\x15\xf9\x5b\x41\xa6\x87\x8b\xf8"
- "\xd5\xe1\x1b\xe2\x5b\xf3\x86\x10"
- "\xff\xe6\xae\x69\x76\xbc\x0d\xb4"
- "\x09\x90\x0c\xa2\x65\x0c\xad\x74"
- "\xf5\xd7\xff\xda\xc1\xce\x85\xbe"
- "\x00\xa7\xff\x4d\x2f\x65\xd3\x8c"
- "\x86\x2d\x05\xe8\xed\x3e\x6b\x8b"
- "\x0f\x3d\x83\x8c\xf1\x1d\x5b\x96"
- "\x2e\xb1\x9c\xc2\x98\xe1\x70\xb9"
- "\xba\x5c\x8a\x43\xd6\x34\xa7\x2d"
- "\xc9\x92\xae\xf2\xa5\x7b\x05\x49"
- "\xa7\x33\x34\x86\xca\xe4\x96\x23"
- "\x76\x5b\xf2\xc6\xf1\x51\x28\x42"
- "\x7b\xcc\x76\x8f\xfa\xa2\xad\x31"
- "\xd4\xd6\x7a\x6d\x25\x25\x54\xe4"
- "\x3f\x50\x59\xe1\x5c\x05\xb7\x27"
- "\x48\xbf\x07\xec\x1b\x13\xbe\x2b"
- "\xa1\x57\x2b\xd5\xab\xd7\xd0\x4c"
- "\x1e\xcb\x71\x9b\xc5\x90\x85\xd3"
- "\xde\x59\xec\x71\xeb\x89\xbb\xd0"
- "\x09\x50\xe1\x16\x3f\xfd\x1c\x34"
- "\xc3\x1c\xa1\x10\x77\x53\x98\xef"
- "\xf2\xfd\xa5\x01\x59\xc2\x9b\x26"
- "\xc7\x42\xd9\x49\xda\x58\x2b\x6e"
- "\x9f\x53\x19\x76\x7e\xd9\xc9\x0e"
- "\x68\xc8\x7f\x51\x22\x42\xef\x49"
- "\xa4\x55\xb6\x36\xac\x09\xc7\x31"
- "\x88\x15\x4b\x2e\x8f\x3a\x08\xf7"
- "\xd8\xf7\xa8\xc5\xa9\x33\xa6\x45"
- "\xe4\xc4\x94\x76\xf3\x0d\x8f\x7e"
- "\xc8\xf6\xbc\x23\x0a\xb6\x4c\xd3"
- "\x6a\xcd\x36\xc2\x90\x5c\x5c\x3c"
- "\x65\x7b\xc2\xd6\xcc\xe6\x0d\x87"
- "\x73\x2e\x71\x79\x16\x06\x63\x28"
- "\x09\x15\xd8\x89\x38\x38\x3d\xb5"
- "\x42\x1c\x08\x24\xf7\x2a\xd2\x9d"
- "\xc8\xca\xef\xf9\x27\xd8\x07\x86"
- "\xf7\x43\x0b\x55\x15\x3f\x9f\x83"
- "\xef\xdc\x49\x9d\x2a\xc1\x54\x62"
- "\xbd\x9b\x66\x55\x9f\xb7\x12\xf3"
- "\x1b\x4d\x9d\x2a\x5c\xed\x87\x75"
- "\x87\x26\xec\x61\x2c\xb4\x0f\x89"
- "\xb0\xfb\x2e\x68\x5d\x15\xc7\x8d"
- "\x2e\xc0\xd9\xec\xaf\x4f\xd2\x25"
- "\x29\xe8\xd2\x26\x2b\x67\xe9\xfc"
- "\x2b\xa8\x67\x96\x12\x1f\x5b\x96"
- "\xc6\x14\x53\xaf\x44\xea\xd6\xe2"
- "\x94\x98\xe4\x12\x93\x4c\x92\xe0"
- "\x18\xa5\x8d\x2d\xe4\x71\x3c\x47"
- "\x4c\xf7\xe6\x47\x9e\xc0\x68\xdf"
- "\xd4\xf5\x5a\x74\xb1\x2b\x29\x03"
- "\x19\x07\xaf\x90\x62\x5c\x68\x98"
- "\x48\x16\x11\x02\x9d\xee\xb4\x9b"
- "\xe5\x42\x7f\x08\xfd\x16\x32\x0b"
- "\xd0\xb3\xfa\x2b\xb7\x99\xf9\x29"
- "\xcd\x20\x45\x9f\xb3\x1a\x5d\xa2"
- "\xaf\x4d\xe0\xbd\x42\x0d\xbc\x74"
- "\x99\x9c\x8e\x53\x1a\xb4\x3e\xbd"
- "\xa2\x9a\x2d\xf7\xf8\x39\x0f\x67"
- "\x63\xfc\x6b\xc0\xaf\xb3\x4b\x4f"
- "\x55\xc4\xcf\xa7\xc8\x04\x11\x3e"
- "\x14\x32\xbb\x1b\x38\x77\xd6\x7f"
- "\x54\x4c\xdf\x75\xf3\x07\x2d\x33"
- "\x9b\xa8\x20\xe1\x7b\x12\xb5\xf3"
- "\xef\x2f\xce\x72\xe5\x24\x60\xc1"
- "\x30\xe2\xab\xa1\x8e\x11\x09\xa8"
- "\x21\x33\x44\xfe\x7f\x35\x32\x93"
- "\x39\xa7\xad\x8b\x79\x06\xb2\xcb"
- "\x4e\xa9\x5f\xc7\xba\x74\x29\xec"
- "\x93\xa0\x4e\x54\x93\xc0\xbc\x55"
- "\x64\xf0\x48\xe5\x57\x99\xee\x75"
- "\xd6\x79\x0f\x66\xb7\xc6\x57\x76"
- "\xf7\xb7\xf3\x9c\xc5\x60\xe8\x7f"
- "\x83\x76\xd6\x0e\xaa\xe6\x90\x39"
- "\x1d\xa6\x32\x6a\x34\xe3\x55\xf8"
- "\x58\xa0\x58\x7d\x33\xe0\x22\x39"
- "\x44\x64\x87\x86\x5a\x2f\xa7\x7e"
- "\x0f\x38\xea\xb0\x30\xcc\x61\xa5"
- "\x6a\x32\xae\x1e\xf7\xe9\xd0\xa9"
- "\x0c\x32\x4b\xb5\x49\x28\xab\x85"
- "\x2f\x8e\x01\x36\x38\x52\xd0\xba"
- "\xd6\x02\x78\xf8\x0e\x3e\x9c\x8b"
- "\x6b\x45\x99\x3f\x5c\xfe\x58\xf1"
- "\x5c\x94\x04\xe1\xf5\x18\x6d\x51"
- "\xb2\x5d\x18\x20\xb6\xc2\x9a\x42"
- "\x1d\xb3\xab\x3c\xb6\x3a\x13\x03"
- "\xb2\x46\x82\x4f\xfc\x64\xbc\x4f"
- "\xca\xfa\x9c\xc0\xd5\xa7\xbd\x11"
- "\xb7\xe4\x5a\xf6\x6f\x4d\x4d\x54"
- "\xea\xa4\x98\x66\xd4\x22\x3b\xd3"
- "\x8f\x34\x47\xd9\x7c\xf4\x72\x3b"
- "\x4d\x02\x77\xf6\xd6\xdd\x08\x0a"
- "\x81\xe1\x86\x89\x3e\x56\x10\x3c"
- "\xba\xd7\x81\x8c\x08\xbc\x8b\xe2"
- "\x53\xec\xa7\x89\xee\xc8\x56\xb5"
- "\x36\x2c\xb2\x03\xba\x99\xdd\x7c"
- "\x48\xa0\xb0\xbc\x91\x33\xe9\xa8"
- "\xcb\xcd\xcf\x59\x5f\x1f\x15\xe2"
- "\x56\xf5\x4e\x01\x35\x27\x45\x77"
- "\x47\xc8\xbc\xcb\x7e\x39\xc1\x97"
- "\x28\xd3\x84\xfc\x2c\x3e\xc8\xad"
- "\x9c\xf8\x8a\x61\x9c\x28\xaa\xc5"
- "\x99\x20\x43\x85\x9d\xa5\xe2\x8b"
- "\xb8\xae\xeb\xd0\x32\x0d\x52\x78"
- "\x09\x56\x3f\xc7\xd8\x7e\x26\xfc"
- "\x37\xfb\x6f\x04\xfc\xfa\x92\x10"
- "\xac\xf8\x3e\x21\xdc\x8c\x21\x16"
- "\x7d\x67\x6e\xf6\xcd\xda\xb6\x98"
- "\x23\xab\x23\x3c\xb2\x10\xa0\x53"
- "\x5a\x56\x9f\xc5\xd0\xff\xbb\xe4"
- "\x98\x3c\x69\x1e\xdb\x38\x8f\x7e"
- "\x0f\xd2\x98\x88\x81\x8b\x45\x67"
- "\xea\x33\xf1\xeb\xe9\x97\x55\x2e"
- "\xd9\xaa\xeb\x5a\xec\xda\xe1\x68"
- "\xa8\x9d\x3c\x84\x7c\x05\x3d\x62"
- "\x87\x8f\x03\x21\x28\x95\x0c\x89"
- "\x25\x22\x4a\xb0\x93\xa9\x50\xa2"
- "\x2f\x57\x6e\x18\x42\x19\x54\x0c"
- "\x55\x67\xc6\x11\x49\xf4\x5c\xd2"
- "\xe9\x3d\xdd\x8b\x48\x71\x21\x00"
- "\xc3\x9a\x6c\x85\x74\x28\x83\x4a"
- "\x1b\x31\x05\xe1\x06\x92\xe7\xda"
- "\x85\x73\x78\x45\x20\x7f\xae\x13"
- "\x7c\x33\x06\x22\xf4\x83\xf9\x35"
- "\x3f\x6c\x71\xa8\x4e\x48\xbe\x9b"
- "\xce\x8a\xba\xda\xbe\x28\x08\xf7"
- "\xe2\x14\x8c\x71\xea\x72\xf9\x33"
- "\xf2\x88\x3f\xd7\xbb\x69\x6c\x29"
- "\x19\xdc\x84\xce\x1f\x12\x4f\xc8"
- "\xaf\xa5\x04\xba\x5a\xab\xb0\xd9"
- "\x14\x1f\x6c\x68\x98\x39\x89\x7a"
- "\xd9\xd8\x2f\xdf\xa8\x47\x4a\x25"
- "\xe2\xfb\x33\xf4\x59\x78\xe1\x68"
- "\x85\xcf\xfe\x59\x20\xd4\x05\x1d"
- "\x80\x99\xae\xbc\xca\xae\x0f\x2f"
- "\x65\x43\x34\x8e\x7e\xac\xd3\x93"
- "\x2f\xac\x6d\x14\x3d\x02\x07\x70"
- "\x9d\xa4\xf3\x1b\x5c\x36\xfc\x01"
- "\x73\x34\x85\x0c\x6c\xd6\xf1\xbd"
- "\x3f\xdf\xee\xf5\xd9\xba\x56\xef"
- "\xf4\x9b\x6b\xee\x9f\x5a\x78\x6d"
- "\x32\x19\xf4\xf7\xf8\x4c\x69\x0b"
- "\x4b\xbc\xbb\xb7\xf2\x85\xaf\x70"
- "\x75\x24\x6c\x54\xa7\x0e\x4d\x1d"
- "\x01\xbf\x08\xac\xcf\x7f\x2c\xe3"
- "\x14\x89\x5e\x70\x5a\x99\x92\xcd"
- "\x01\x84\xc8\xd2\xab\xe5\x4f\x58"
- "\xe7\x0f\x2f\x0e\xff\x68\xea\xfd"
- "\x15\xb3\x17\xe6\xb0\xe7\x85\xd8"
- "\x23\x2e\x05\xc7\xc9\xc4\x46\x1f"
- "\xe1\x9e\x49\x20\x23\x24\x4d\x7e"
- "\x29\x65\xff\xf4\xb6\xfd\x1a\x85"
- "\xc4\x16\xec\xfc\xea\x7b\xd6\x2c"
- "\x43\xf8\xb7\xbf\x79\xc0\x85\xcd"
- "\xef\xe1\x98\xd3\xa5\xf7\x90\x8c"
- "\xe9\x7f\x80\x6b\xd2\xac\x4c\x30"
- "\xa7\xc6\x61\x6c\xd2\xf9\x2c\xff"
- "\x30\xbc\x22\x81\x7d\x93\x12\xe4"
- "\x0a\xcd\xaf\xdd\xe8\xab\x0a\x1e"
- "\x13\xa4\x27\xc3\x5f\xf7\x4b\xbb"
- "\x37\x09\x4b\x91\x6f\x92\x4f\xaf"
- "\x52\xee\xdf\xef\x09\x6f\xf7\x5c"
- "\x6e\x12\x17\x72\x63\x57\xc7\xba"
- "\x3b\x6b\x38\x32\x73\x1b\x9c\x80"
- "\xc1\x7a\xc6\xcf\xcd\x35\xc0\x6b"
- "\x31\x1a\x6b\xe9\xd8\x2c\x29\x3f"
- "\x96\xfb\xb6\xcd\x13\x91\x3b\xc2"
- "\xd2\xa3\x31\x8d\xa4\xcd\x57\xcd"
- "\x13\x3d\x64\xfd\x06\xce\xe6\xdc"
- "\x0c\x24\x43\x31\x40\x57\xf1\x72"
- "\x17\xe3\x3a\x63\x6d\x35\xcf\x5d"
- "\x97\x40\x59\xdd\xf7\x3c\x02\xf7"
- "\x1c\x7e\x05\xbb\xa9\x0d\x01\xb1"
- "\x8e\xc0\x30\xa9\x53\x24\xc9\x89"
- "\x84\x6d\xaa\xd0\xcd\x91\xc2\x4d"
- "\x91\xb0\x89\xe2\xbf\x83\x44\xaa"
- "\x28\x72\x23\xa0\xc2\xad\xad\x1c"
- "\xfc\x3f\x09\x7a\x0b\xdc\xc5\x1b"
- "\x87\x13\xc6\x5b\x59\x8d\xf2\xc8"
- "\xaf\xdf\x11\x95",
- .rlen = 4100,
- .np = 2,
- .tap = { 4064, 36 },
- },
-};
-
-/*
- * CTS (Cipher Text Stealing) mode tests
- */
-#define CTS_MODE_ENC_TEST_VECTORS 6
-#define CTS_MODE_DEC_TEST_VECTORS 6
-static struct cipher_testvec cts_mode_enc_tv_template[] = {
- { /* from rfc3962 */
- .klen = 16,
- .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
- "\x74\x65\x72\x69\x79\x61\x6b\x69",
- .ilen = 17,
- .input = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
- "\x6c\x69\x6b\x65\x20\x74\x68\x65"
- "\x20",
- .rlen = 17,
- .result = "\xc6\x35\x35\x68\xf2\xbf\x8c\xb4"
- "\xd8\xa5\x80\x36\x2d\xa7\xff\x7f"
- "\x97",
- }, {
- .klen = 16,
- .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
- "\x74\x65\x72\x69\x79\x61\x6b\x69",
- .ilen = 31,
- .input = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
- "\x6c\x69\x6b\x65\x20\x74\x68\x65"
- "\x20\x47\x65\x6e\x65\x72\x61\x6c"
- "\x20\x47\x61\x75\x27\x73\x20",
- .rlen = 31,
- .result = "\xfc\x00\x78\x3e\x0e\xfd\xb2\xc1"
- "\xd4\x45\xd4\xc8\xef\xf7\xed\x22"
- "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
- "\xc0\x7b\x25\xe2\x5e\xcf\xe5",
- }, {
- .klen = 16,
- .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
- "\x74\x65\x72\x69\x79\x61\x6b\x69",
- .ilen = 32,
- .input = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
- "\x6c\x69\x6b\x65\x20\x74\x68\x65"
- "\x20\x47\x65\x6e\x65\x72\x61\x6c"
- "\x20\x47\x61\x75\x27\x73\x20\x43",
- .rlen = 32,
- .result = "\x39\x31\x25\x23\xa7\x86\x62\xd5"
- "\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8"
- "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
- "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84",
- }, {
- .klen = 16,
- .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
- "\x74\x65\x72\x69\x79\x61\x6b\x69",
- .ilen = 47,
- .input = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
- "\x6c\x69\x6b\x65\x20\x74\x68\x65"
- "\x20\x47\x65\x6e\x65\x72\x61\x6c"
- "\x20\x47\x61\x75\x27\x73\x20\x43"
- "\x68\x69\x63\x6b\x65\x6e\x2c\x20"
- "\x70\x6c\x65\x61\x73\x65\x2c",
- .rlen = 47,
- .result = "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
- "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
- "\xb3\xff\xfd\x94\x0c\x16\xa1\x8c"
- "\x1b\x55\x49\xd2\xf8\x38\x02\x9e"
- "\x39\x31\x25\x23\xa7\x86\x62\xd5"
- "\xbe\x7f\xcb\xcc\x98\xeb\xf5",
- }, {
- .klen = 16,
- .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
- "\x74\x65\x72\x69\x79\x61\x6b\x69",
- .ilen = 48,
- .input = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
- "\x6c\x69\x6b\x65\x20\x74\x68\x65"
- "\x20\x47\x65\x6e\x65\x72\x61\x6c"
- "\x20\x47\x61\x75\x27\x73\x20\x43"
- "\x68\x69\x63\x6b\x65\x6e\x2c\x20"
- "\x70\x6c\x65\x61\x73\x65\x2c\x20",
- .rlen = 48,
- .result = "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
- "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
- "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0"
- "\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8"
- "\x39\x31\x25\x23\xa7\x86\x62\xd5"
- "\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8",
- }, {
- .klen = 16,
- .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
- "\x74\x65\x72\x69\x79\x61\x6b\x69",
- .ilen = 64,
- .input = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
- "\x6c\x69\x6b\x65\x20\x74\x68\x65"
- "\x20\x47\x65\x6e\x65\x72\x61\x6c"
- "\x20\x47\x61\x75\x27\x73\x20\x43"
- "\x68\x69\x63\x6b\x65\x6e\x2c\x20"
- "\x70\x6c\x65\x61\x73\x65\x2c\x20"
- "\x61\x6e\x64\x20\x77\x6f\x6e\x74"
- "\x6f\x6e\x20\x73\x6f\x75\x70\x2e",
- .rlen = 64,
- .result = "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
- "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
- "\x39\x31\x25\x23\xa7\x86\x62\xd5"
- "\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8"
- "\x48\x07\xef\xe8\x36\xee\x89\xa5"
- "\x26\x73\x0d\xbc\x2f\x7b\xc8\x40"
- "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0"
- "\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8",
- }
-};
-
-static struct cipher_testvec cts_mode_dec_tv_template[] = {
- { /* from rfc3962 */
- .klen = 16,
- .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
- "\x74\x65\x72\x69\x79\x61\x6b\x69",
- .rlen = 17,
- .result = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
- "\x6c\x69\x6b\x65\x20\x74\x68\x65"
- "\x20",
- .ilen = 17,
- .input = "\xc6\x35\x35\x68\xf2\xbf\x8c\xb4"
- "\xd8\xa5\x80\x36\x2d\xa7\xff\x7f"
- "\x97",
- }, {
- .klen = 16,
- .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
- "\x74\x65\x72\x69\x79\x61\x6b\x69",
- .rlen = 31,
- .result = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
- "\x6c\x69\x6b\x65\x20\x74\x68\x65"
- "\x20\x47\x65\x6e\x65\x72\x61\x6c"
- "\x20\x47\x61\x75\x27\x73\x20",
- .ilen = 31,
- .input = "\xfc\x00\x78\x3e\x0e\xfd\xb2\xc1"
- "\xd4\x45\xd4\xc8\xef\xf7\xed\x22"
- "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
- "\xc0\x7b\x25\xe2\x5e\xcf\xe5",
- }, {
- .klen = 16,
- .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
- "\x74\x65\x72\x69\x79\x61\x6b\x69",
- .rlen = 32,
- .result = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
- "\x6c\x69\x6b\x65\x20\x74\x68\x65"
- "\x20\x47\x65\x6e\x65\x72\x61\x6c"
- "\x20\x47\x61\x75\x27\x73\x20\x43",
- .ilen = 32,
- .input = "\x39\x31\x25\x23\xa7\x86\x62\xd5"
- "\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8"
- "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
- "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84",
- }, {
- .klen = 16,
- .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
- "\x74\x65\x72\x69\x79\x61\x6b\x69",
- .rlen = 47,
- .result = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
- "\x6c\x69\x6b\x65\x20\x74\x68\x65"
- "\x20\x47\x65\x6e\x65\x72\x61\x6c"
- "\x20\x47\x61\x75\x27\x73\x20\x43"
- "\x68\x69\x63\x6b\x65\x6e\x2c\x20"
- "\x70\x6c\x65\x61\x73\x65\x2c",
- .ilen = 47,
- .input = "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
- "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
- "\xb3\xff\xfd\x94\x0c\x16\xa1\x8c"
- "\x1b\x55\x49\xd2\xf8\x38\x02\x9e"
- "\x39\x31\x25\x23\xa7\x86\x62\xd5"
- "\xbe\x7f\xcb\xcc\x98\xeb\xf5",
- }, {
- .klen = 16,
- .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
- "\x74\x65\x72\x69\x79\x61\x6b\x69",
- .rlen = 48,
- .result = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
- "\x6c\x69\x6b\x65\x20\x74\x68\x65"
- "\x20\x47\x65\x6e\x65\x72\x61\x6c"
- "\x20\x47\x61\x75\x27\x73\x20\x43"
- "\x68\x69\x63\x6b\x65\x6e\x2c\x20"
- "\x70\x6c\x65\x61\x73\x65\x2c\x20",
- .ilen = 48,
- .input = "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
- "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
- "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0"
- "\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8"
- "\x39\x31\x25\x23\xa7\x86\x62\xd5"
- "\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8",
- }, {
- .klen = 16,
- .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
- "\x74\x65\x72\x69\x79\x61\x6b\x69",
- .rlen = 64,
- .result = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
- "\x6c\x69\x6b\x65\x20\x74\x68\x65"
- "\x20\x47\x65\x6e\x65\x72\x61\x6c"
- "\x20\x47\x61\x75\x27\x73\x20\x43"
- "\x68\x69\x63\x6b\x65\x6e\x2c\x20"
- "\x70\x6c\x65\x61\x73\x65\x2c\x20"
- "\x61\x6e\x64\x20\x77\x6f\x6e\x74"
- "\x6f\x6e\x20\x73\x6f\x75\x70\x2e",
- .ilen = 64,
- .input = "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
- "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
- "\x39\x31\x25\x23\xa7\x86\x62\xd5"
- "\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8"
- "\x48\x07\xef\xe8\x36\xee\x89\xa5"
- "\x26\x73\x0d\xbc\x2f\x7b\xc8\x40"
- "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0"
- "\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8",
- }
-};
-
-/*
- * Compression stuff.
- */
-#define COMP_BUF_SIZE 512
-
-struct comp_testvec {
- int inlen, outlen;
- char input[COMP_BUF_SIZE];
- char output[COMP_BUF_SIZE];
-};
-
-struct pcomp_testvec {
- void *params;
- unsigned int paramsize;
- int inlen, outlen;
- char input[COMP_BUF_SIZE];
- char output[COMP_BUF_SIZE];
-};
-
-/*
- * Deflate test vectors (null-terminated strings).
- * Params: winbits=-11, Z_DEFAULT_COMPRESSION, MAX_MEM_LEVEL.
- */
-
-#define DEFLATE_COMP_TEST_VECTORS 2
-#define DEFLATE_DECOMP_TEST_VECTORS 2
-
-static struct comp_testvec deflate_comp_tv_template[] = {
- {
- .inlen = 70,
- .outlen = 38,
- .input = "Join us now and share the software "
- "Join us now and share the software ",
- .output = "\xf3\xca\xcf\xcc\x53\x28\x2d\x56"
- "\xc8\xcb\x2f\x57\x48\xcc\x4b\x51"
- "\x28\xce\x48\x2c\x4a\x55\x28\xc9"
- "\x48\x55\x28\xce\x4f\x2b\x29\x07"
- "\x71\xbc\x08\x2b\x01\x00",
- }, {
- .inlen = 191,
- .outlen = 122,
- .input = "This document describes a compression method based on the DEFLATE"
- "compression algorithm. This document defines the application of "
- "the DEFLATE algorithm to the IP Payload Compression Protocol.",
- .output = "\x5d\x8d\x31\x0e\xc2\x30\x10\x04"
- "\xbf\xb2\x2f\xc8\x1f\x10\x04\x09"
- "\x89\xc2\x85\x3f\x70\xb1\x2f\xf8"
- "\x24\xdb\x67\xd9\x47\xc1\xef\x49"
- "\x68\x12\x51\xae\x76\x67\xd6\x27"
- "\x19\x88\x1a\xde\x85\xab\x21\xf2"
- "\x08\x5d\x16\x1e\x20\x04\x2d\xad"
- "\xf3\x18\xa2\x15\x85\x2d\x69\xc4"
- "\x42\x83\x23\xb6\x6c\x89\x71\x9b"
- "\xef\xcf\x8b\x9f\xcf\x33\xca\x2f"
- "\xed\x62\xa9\x4c\x80\xff\x13\xaf"
- "\x52\x37\xed\x0e\x52\x6b\x59\x02"
- "\xd9\x4e\xe8\x7a\x76\x1d\x02\x98"
- "\xfe\x8a\x87\x83\xa3\x4f\x56\x8a"
- "\xb8\x9e\x8e\x5c\x57\xd3\xa0\x79"
- "\xfa\x02",
- },
-};
-
-static struct comp_testvec deflate_decomp_tv_template[] = {
- {
- .inlen = 122,
- .outlen = 191,
- .input = "\x5d\x8d\x31\x0e\xc2\x30\x10\x04"
- "\xbf\xb2\x2f\xc8\x1f\x10\x04\x09"
- "\x89\xc2\x85\x3f\x70\xb1\x2f\xf8"
- "\x24\xdb\x67\xd9\x47\xc1\xef\x49"
- "\x68\x12\x51\xae\x76\x67\xd6\x27"
- "\x19\x88\x1a\xde\x85\xab\x21\xf2"
- "\x08\x5d\x16\x1e\x20\x04\x2d\xad"
- "\xf3\x18\xa2\x15\x85\x2d\x69\xc4"
- "\x42\x83\x23\xb6\x6c\x89\x71\x9b"
- "\xef\xcf\x8b\x9f\xcf\x33\xca\x2f"
- "\xed\x62\xa9\x4c\x80\xff\x13\xaf"
- "\x52\x37\xed\x0e\x52\x6b\x59\x02"
- "\xd9\x4e\xe8\x7a\x76\x1d\x02\x98"
- "\xfe\x8a\x87\x83\xa3\x4f\x56\x8a"
- "\xb8\x9e\x8e\x5c\x57\xd3\xa0\x79"
- "\xfa\x02",
- .output = "This document describes a compression method based on the DEFLATE"
- "compression algorithm. This document defines the application of "
- "the DEFLATE algorithm to the IP Payload Compression Protocol.",
- }, {
- .inlen = 38,
- .outlen = 70,
- .input = "\xf3\xca\xcf\xcc\x53\x28\x2d\x56"
- "\xc8\xcb\x2f\x57\x48\xcc\x4b\x51"
- "\x28\xce\x48\x2c\x4a\x55\x28\xc9"
- "\x48\x55\x28\xce\x4f\x2b\x29\x07"
- "\x71\xbc\x08\x2b\x01\x00",
- .output = "Join us now and share the software "
- "Join us now and share the software ",
- },
-};
-
-#define ZLIB_COMP_TEST_VECTORS 2
-#define ZLIB_DECOMP_TEST_VECTORS 2
-
-static const struct {
- struct nlattr nla;
- int val;
-} deflate_comp_params[] = {
- {
- .nla = {
- .nla_len = NLA_HDRLEN + sizeof(int),
- .nla_type = ZLIB_COMP_LEVEL,
- },
- .val = Z_DEFAULT_COMPRESSION,
- }, {
- .nla = {
- .nla_len = NLA_HDRLEN + sizeof(int),
- .nla_type = ZLIB_COMP_METHOD,
- },
- .val = Z_DEFLATED,
- }, {
- .nla = {
- .nla_len = NLA_HDRLEN + sizeof(int),
- .nla_type = ZLIB_COMP_WINDOWBITS,
- },
- .val = -11,
- }, {
- .nla = {
- .nla_len = NLA_HDRLEN + sizeof(int),
- .nla_type = ZLIB_COMP_MEMLEVEL,
- },
- .val = MAX_MEM_LEVEL,
- }, {
- .nla = {
- .nla_len = NLA_HDRLEN + sizeof(int),
- .nla_type = ZLIB_COMP_STRATEGY,
- },
- .val = Z_DEFAULT_STRATEGY,
- }
-};
-
-static const struct {
- struct nlattr nla;
- int val;
-} deflate_decomp_params[] = {
- {
- .nla = {
- .nla_len = NLA_HDRLEN + sizeof(int),
- .nla_type = ZLIB_DECOMP_WINDOWBITS,
- },
- .val = -11,
- }
-};
-
-static struct pcomp_testvec zlib_comp_tv_template[] = {
- {
- .params = &deflate_comp_params,
- .paramsize = sizeof(deflate_comp_params),
- .inlen = 70,
- .outlen = 38,
- .input = "Join us now and share the software "
- "Join us now and share the software ",
- .output = "\xf3\xca\xcf\xcc\x53\x28\x2d\x56"
- "\xc8\xcb\x2f\x57\x48\xcc\x4b\x51"
- "\x28\xce\x48\x2c\x4a\x55\x28\xc9"
- "\x48\x55\x28\xce\x4f\x2b\x29\x07"
- "\x71\xbc\x08\x2b\x01\x00",
- }, {
- .params = &deflate_comp_params,
- .paramsize = sizeof(deflate_comp_params),
- .inlen = 191,
- .outlen = 122,
- .input = "This document describes a compression method based on the DEFLATE"
- "compression algorithm. This document defines the application of "
- "the DEFLATE algorithm to the IP Payload Compression Protocol.",
- .output = "\x5d\x8d\x31\x0e\xc2\x30\x10\x04"
- "\xbf\xb2\x2f\xc8\x1f\x10\x04\x09"
- "\x89\xc2\x85\x3f\x70\xb1\x2f\xf8"
- "\x24\xdb\x67\xd9\x47\xc1\xef\x49"
- "\x68\x12\x51\xae\x76\x67\xd6\x27"
- "\x19\x88\x1a\xde\x85\xab\x21\xf2"
- "\x08\x5d\x16\x1e\x20\x04\x2d\xad"
- "\xf3\x18\xa2\x15\x85\x2d\x69\xc4"
- "\x42\x83\x23\xb6\x6c\x89\x71\x9b"
- "\xef\xcf\x8b\x9f\xcf\x33\xca\x2f"
- "\xed\x62\xa9\x4c\x80\xff\x13\xaf"
- "\x52\x37\xed\x0e\x52\x6b\x59\x02"
- "\xd9\x4e\xe8\x7a\x76\x1d\x02\x98"
- "\xfe\x8a\x87\x83\xa3\x4f\x56\x8a"
- "\xb8\x9e\x8e\x5c\x57\xd3\xa0\x79"
- "\xfa\x02",
- },
-};
-
-static struct pcomp_testvec zlib_decomp_tv_template[] = {
- {
- .params = &deflate_decomp_params,
- .paramsize = sizeof(deflate_decomp_params),
- .inlen = 122,
- .outlen = 191,
- .input = "\x5d\x8d\x31\x0e\xc2\x30\x10\x04"
- "\xbf\xb2\x2f\xc8\x1f\x10\x04\x09"
- "\x89\xc2\x85\x3f\x70\xb1\x2f\xf8"
- "\x24\xdb\x67\xd9\x47\xc1\xef\x49"
- "\x68\x12\x51\xae\x76\x67\xd6\x27"
- "\x19\x88\x1a\xde\x85\xab\x21\xf2"
- "\x08\x5d\x16\x1e\x20\x04\x2d\xad"
- "\xf3\x18\xa2\x15\x85\x2d\x69\xc4"
- "\x42\x83\x23\xb6\x6c\x89\x71\x9b"
- "\xef\xcf\x8b\x9f\xcf\x33\xca\x2f"
- "\xed\x62\xa9\x4c\x80\xff\x13\xaf"
- "\x52\x37\xed\x0e\x52\x6b\x59\x02"
- "\xd9\x4e\xe8\x7a\x76\x1d\x02\x98"
- "\xfe\x8a\x87\x83\xa3\x4f\x56\x8a"
- "\xb8\x9e\x8e\x5c\x57\xd3\xa0\x79"
- "\xfa\x02",
- .output = "This document describes a compression method based on the DEFLATE"
- "compression algorithm. This document defines the application of "
- "the DEFLATE algorithm to the IP Payload Compression Protocol.",
- }, {
- .params = &deflate_decomp_params,
- .paramsize = sizeof(deflate_decomp_params),
- .inlen = 38,
- .outlen = 70,
- .input = "\xf3\xca\xcf\xcc\x53\x28\x2d\x56"
- "\xc8\xcb\x2f\x57\x48\xcc\x4b\x51"
- "\x28\xce\x48\x2c\x4a\x55\x28\xc9"
- "\x48\x55\x28\xce\x4f\x2b\x29\x07"
- "\x71\xbc\x08\x2b\x01\x00",
- .output = "Join us now and share the software "
- "Join us now and share the software ",
- },
-};
-
-/*
- * LZO test vectors (null-terminated strings).
- */
-#define LZO_COMP_TEST_VECTORS 2
-#define LZO_DECOMP_TEST_VECTORS 2
-
-static struct comp_testvec lzo_comp_tv_template[] = {
- {
- .inlen = 70,
- .outlen = 46,
- .input = "Join us now and share the software "
- "Join us now and share the software ",
- .output = "\x00\x0d\x4a\x6f\x69\x6e\x20\x75"
- "\x73\x20\x6e\x6f\x77\x20\x61\x6e"
- "\x64\x20\x73\x68\x61\x72\x65\x20"
- "\x74\x68\x65\x20\x73\x6f\x66\x74"
- "\x77\x70\x01\x01\x4a\x6f\x69\x6e"
- "\x3d\x88\x00\x11\x00\x00",
- }, {
- .inlen = 159,
- .outlen = 133,
- .input = "This document describes a compression method based on the LZO "
- "compression algorithm. This document defines the application of "
- "the LZO algorithm used in UBIFS.",
- .output = "\x00\x2b\x54\x68\x69\x73\x20\x64"
- "\x6f\x63\x75\x6d\x65\x6e\x74\x20"
- "\x64\x65\x73\x63\x72\x69\x62\x65"
- "\x73\x20\x61\x20\x63\x6f\x6d\x70"
- "\x72\x65\x73\x73\x69\x6f\x6e\x20"
- "\x6d\x65\x74\x68\x6f\x64\x20\x62"
- "\x61\x73\x65\x64\x20\x6f\x6e\x20"
- "\x74\x68\x65\x20\x4c\x5a\x4f\x2b"
- "\x8c\x00\x0d\x61\x6c\x67\x6f\x72"
- "\x69\x74\x68\x6d\x2e\x20\x20\x54"
- "\x68\x69\x73\x2a\x54\x01\x02\x66"
- "\x69\x6e\x65\x73\x94\x06\x05\x61"
- "\x70\x70\x6c\x69\x63\x61\x74\x76"
- "\x0a\x6f\x66\x88\x02\x60\x09\x27"
- "\xf0\x00\x0c\x20\x75\x73\x65\x64"
- "\x20\x69\x6e\x20\x55\x42\x49\x46"
- "\x53\x2e\x11\x00\x00",
- },
-};
-
-static struct comp_testvec lzo_decomp_tv_template[] = {
- {
- .inlen = 133,
- .outlen = 159,
- .input = "\x00\x2b\x54\x68\x69\x73\x20\x64"
- "\x6f\x63\x75\x6d\x65\x6e\x74\x20"
- "\x64\x65\x73\x63\x72\x69\x62\x65"
- "\x73\x20\x61\x20\x63\x6f\x6d\x70"
- "\x72\x65\x73\x73\x69\x6f\x6e\x20"
- "\x6d\x65\x74\x68\x6f\x64\x20\x62"
- "\x61\x73\x65\x64\x20\x6f\x6e\x20"
- "\x74\x68\x65\x20\x4c\x5a\x4f\x2b"
- "\x8c\x00\x0d\x61\x6c\x67\x6f\x72"
- "\x69\x74\x68\x6d\x2e\x20\x20\x54"
- "\x68\x69\x73\x2a\x54\x01\x02\x66"
- "\x69\x6e\x65\x73\x94\x06\x05\x61"
- "\x70\x70\x6c\x69\x63\x61\x74\x76"
- "\x0a\x6f\x66\x88\x02\x60\x09\x27"
- "\xf0\x00\x0c\x20\x75\x73\x65\x64"
- "\x20\x69\x6e\x20\x55\x42\x49\x46"
- "\x53\x2e\x11\x00\x00",
- .output = "This document describes a compression method based on the LZO "
- "compression algorithm. This document defines the application of "
- "the LZO algorithm used in UBIFS.",
- }, {
- .inlen = 46,
- .outlen = 70,
- .input = "\x00\x0d\x4a\x6f\x69\x6e\x20\x75"
- "\x73\x20\x6e\x6f\x77\x20\x61\x6e"
- "\x64\x20\x73\x68\x61\x72\x65\x20"
- "\x74\x68\x65\x20\x73\x6f\x66\x74"
- "\x77\x70\x01\x01\x4a\x6f\x69\x6e"
- "\x3d\x88\x00\x11\x00\x00",
- .output = "Join us now and share the software "
- "Join us now and share the software ",
- },
-};
-
-/*
- * Michael MIC test vectors from IEEE 802.11i
- */
-#define MICHAEL_MIC_TEST_VECTORS 6
-
-static struct hash_testvec michael_mic_tv_template[] = {
- {
- .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
- .ksize = 8,
- .plaintext = zeroed_string,
- .psize = 0,
- .digest = "\x82\x92\x5c\x1c\xa1\xd1\x30\xb8",
- },
- {
- .key = "\x82\x92\x5c\x1c\xa1\xd1\x30\xb8",
- .ksize = 8,
- .plaintext = "M",
- .psize = 1,
- .digest = "\x43\x47\x21\xca\x40\x63\x9b\x3f",
- },
- {
- .key = "\x43\x47\x21\xca\x40\x63\x9b\x3f",
- .ksize = 8,
- .plaintext = "Mi",
- .psize = 2,
- .digest = "\xe8\xf9\xbe\xca\xe9\x7e\x5d\x29",
- },
- {
- .key = "\xe8\xf9\xbe\xca\xe9\x7e\x5d\x29",
- .ksize = 8,
- .plaintext = "Mic",
- .psize = 3,
- .digest = "\x90\x03\x8f\xc6\xcf\x13\xc1\xdb",
- },
- {
- .key = "\x90\x03\x8f\xc6\xcf\x13\xc1\xdb",
- .ksize = 8,
- .plaintext = "Mich",
- .psize = 4,
- .digest = "\xd5\x5e\x10\x05\x10\x12\x89\x86",
- },
- {
- .key = "\xd5\x5e\x10\x05\x10\x12\x89\x86",
- .ksize = 8,
- .plaintext = "Michael",
- .psize = 7,
- .digest = "\x0a\x94\x2b\x12\x4e\xca\xa5\x46",
- }
-};
-
-/*
- * CRC32C test vectors
- */
-#define CRC32C_TEST_VECTORS 14
-
-static struct hash_testvec crc32c_tv_template[] = {
- {
- .psize = 0,
- .digest = "\x00\x00\x00\x00",
- },
- {
- .key = "\x87\xa9\xcb\xed",
- .ksize = 4,
- .psize = 0,
- .digest = "\x78\x56\x34\x12",
- },
- {
- .key = "\xff\xff\xff\xff",
- .ksize = 4,
- .plaintext = "\x01\x02\x03\x04\x05\x06\x07\x08"
- "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
- "\x11\x12\x13\x14\x15\x16\x17\x18"
- "\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
- "\x21\x22\x23\x24\x25\x26\x27\x28",
- .psize = 40,
- .digest = "\x7f\x15\x2c\x0e",
- },
- {
- .key = "\xff\xff\xff\xff",
- .ksize = 4,
- .plaintext = "\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
- "\x31\x32\x33\x34\x35\x36\x37\x38"
- "\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
- "\x41\x42\x43\x44\x45\x46\x47\x48"
- "\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50",
- .psize = 40,
- .digest = "\xf6\xeb\x80\xe9",
- },
- {
- .key = "\xff\xff\xff\xff",
- .ksize = 4,
- .plaintext = "\x51\x52\x53\x54\x55\x56\x57\x58"
- "\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
- "\x61\x62\x63\x64\x65\x66\x67\x68"
- "\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
- "\x71\x72\x73\x74\x75\x76\x77\x78",
- .psize = 40,
- .digest = "\xed\xbd\x74\xde",
- },
- {
- .key = "\xff\xff\xff\xff",
- .ksize = 4,
- .plaintext = "\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
- "\x81\x82\x83\x84\x85\x86\x87\x88"
- "\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
- "\x91\x92\x93\x94\x95\x96\x97\x98"
- "\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0",
- .psize = 40,
- .digest = "\x62\xc8\x79\xd5",
- },
- {
- .key = "\xff\xff\xff\xff",
- .ksize = 4,
- .plaintext = "\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8"
- "\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
- "\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8"
- "\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
- "\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8",
- .psize = 40,
- .digest = "\xd0\x9a\x97\xba",
- },
- {
- .key = "\xff\xff\xff\xff",
- .ksize = 4,
- .plaintext = "\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
- "\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8"
- "\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
- "\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8"
- "\xe9\xea\xeb\xec\xed\xee\xef\xf0",
- .psize = 40,
- .digest = "\x13\xd9\x29\x2b",
- },
- {
- .key = "\x80\xea\xd3\xf1",
- .ksize = 4,
- .plaintext = "\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
- "\x31\x32\x33\x34\x35\x36\x37\x38"
- "\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
- "\x41\x42\x43\x44\x45\x46\x47\x48"
- "\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50",
- .psize = 40,
- .digest = "\x0c\xb5\xe2\xa2",
- },
- {
- .key = "\xf3\x4a\x1d\x5d",
- .ksize = 4,
- .plaintext = "\x51\x52\x53\x54\x55\x56\x57\x58"
- "\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
- "\x61\x62\x63\x64\x65\x66\x67\x68"
- "\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
- "\x71\x72\x73\x74\x75\x76\x77\x78",
- .psize = 40,
- .digest = "\xd1\x7f\xfb\xa6",
- },
- {
- .key = "\x2e\x80\x04\x59",
- .ksize = 4,
- .plaintext = "\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
- "\x81\x82\x83\x84\x85\x86\x87\x88"
- "\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
- "\x91\x92\x93\x94\x95\x96\x97\x98"
- "\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0",
- .psize = 40,
- .digest = "\x59\x33\xe6\x7a",
- },
- {
- .key = "\xa6\xcc\x19\x85",
- .ksize = 4,
- .plaintext = "\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8"
- "\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
- "\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8"
- "\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
- "\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8",
- .psize = 40,
- .digest = "\xbe\x03\x01\xd2",
- },
- {
- .key = "\x41\xfc\xfe\x2d",
- .ksize = 4,
- .plaintext = "\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
- "\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8"
- "\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
- "\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8"
- "\xe9\xea\xeb\xec\xed\xee\xef\xf0",
- .psize = 40,
- .digest = "\x75\xd3\xc5\x24",
- },
- {
- .key = "\xff\xff\xff\xff",
- .ksize = 4,
- .plaintext = "\x01\x02\x03\x04\x05\x06\x07\x08"
- "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
- "\x11\x12\x13\x14\x15\x16\x17\x18"
- "\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
- "\x21\x22\x23\x24\x25\x26\x27\x28"
- "\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
- "\x31\x32\x33\x34\x35\x36\x37\x38"
- "\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
- "\x41\x42\x43\x44\x45\x46\x47\x48"
- "\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"
- "\x51\x52\x53\x54\x55\x56\x57\x58"
- "\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
- "\x61\x62\x63\x64\x65\x66\x67\x68"
- "\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
- "\x71\x72\x73\x74\x75\x76\x77\x78"
- "\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
- "\x81\x82\x83\x84\x85\x86\x87\x88"
- "\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
- "\x91\x92\x93\x94\x95\x96\x97\x98"
- "\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
- "\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8"
- "\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
- "\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8"
- "\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
- "\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8"
- "\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
- "\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8"
- "\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
- "\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8"
- "\xe9\xea\xeb\xec\xed\xee\xef\xf0",
- .psize = 240,
- .digest = "\x75\xd3\xc5\x24",
- .np = 2,
- .tap = { 31, 209 }
- },
-};
-
-#endif /* _IFXMIPS_CRYPTO_TESTMGR_H */
diff --git a/package/kernel/lantiq/ltq-deu/src/ltq_deu_testmgr.c b/package/kernel/lantiq/ltq-deu/src/ltq_deu_testmgr.c
deleted file mode 100644
index 054cac3ed3..0000000000
--- a/package/kernel/lantiq/ltq-deu/src/ltq_deu_testmgr.c
+++ /dev/null
@@ -1,3961 +0,0 @@
-/*
- * Algorithm testing framework and tests.
- *
- * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
- * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
- * Copyright (c) 2007 Nokia Siemens Networks
- * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- */
-
-#include <crypto/hash.h>
-#include <linux/err.h>
-#include <linux/module.h>
-#include <linux/scatterlist.h>
-#include <linux/slab.h>
-#include <linux/string.h>
-#include <crypto/rng.h>
-#include <linux/jiffies.h>
-#include <linux/init.h>
-#include <linux/moduleparam.h>
-#include <linux/delay.h>
-#include <linux/types.h>
-#include <linux/sched.h>
-
-#include "internal.h"
-#include "ifxmips_testmgr.h"
-#include "ifxmips_tcrypt.h"
-#include "ifxmips_deu.h"
-
-/* changes for LQ ablkcipher speedtest */
-#include <linux/timex.h>
-#include <linux/interrupt.h>
-#include <asm/mipsregs.h>
-
-/*
- * Need slab memory for testing (size in number of pages).
- */
-#define XBUFSIZE 8
-
-/*
- * Indexes into the xbuf to simulate cross-page access.
- */
-#define IDX1 32
-#define IDX2 32400
-#define IDX3 1
-#define IDX4 8193
-#define IDX5 22222
-#define IDX6 17101
-#define IDX7 27333
-#define IDX8 3000
-
-/*
-* Used by test_cipher()
-*/
-#define ENCRYPT 1
-#define DECRYPT 0
-
-/*
- * Need slab memory for testing (size in number of pages).
- */
-#define TVMEMSIZE 4
-
-/*
-* Used by test_cipher_speed()
-*/
-#define ENCRYPT 1
-#define DECRYPT 0
-
-/*
- * Used by test_cipher_speed()
- */
-
-#ifndef INIT_COMPLETION
-#define INIT_COMPLETION(a) reinit_completion(&a)
-#endif
-
-
-static unsigned int sec;
-
-static char *alg = NULL;
-static u32 type;
-static u32 mask;
-static int mode;
-static char *tvmem[TVMEMSIZE];
-
-static char *check[] = {
- "des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256",
- "blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes",
- "cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
- "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", "fcrypt",
- "camellia", "seed", "salsa20", "rmd128", "rmd160", "rmd256", "rmd320",
- "lzo", "cts", "zlib", NULL
-};
-struct tcrypt_result {
- struct completion completion;
- int err;
-};
-
-struct aead_test_suite {
- struct {
- struct aead_testvec *vecs;
- unsigned int count;
- } enc, dec;
-};
-
-struct cipher_test_suite {
- struct {
- struct cipher_testvec *vecs;
- unsigned int count;
- } enc, dec;
-};
-
-struct comp_test_suite {
- struct {
- struct comp_testvec *vecs;
- unsigned int count;
- } comp, decomp;
-};
-
-struct pcomp_test_suite {
- struct {
- struct pcomp_testvec *vecs;
- unsigned int count;
- } comp, decomp;
-};
-
-struct hash_test_suite {
- struct hash_testvec *vecs;
- unsigned int count;
-};
-
-struct cprng_test_suite {
- struct cprng_testvec *vecs;
- unsigned int count;
-};
-
-struct alg_test_desc {
- const char *alg;
- int (*test)(const struct alg_test_desc *desc, const char *driver,
- u32 type, u32 mask);
- int fips_allowed; /* set if alg is allowed in fips mode */
-
- union {
- struct aead_test_suite aead;
- struct cipher_test_suite cipher;
- struct comp_test_suite comp;
- struct pcomp_test_suite pcomp;
- struct hash_test_suite hash;
- struct cprng_test_suite cprng;
- } suite;
-};
-
-static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
-
-static void hexdump(unsigned char *buf, unsigned int len)
-{
- print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
- 16, 1,
- buf, len, false);
-}
-
-static void tcrypt_complete(struct crypto_async_request *req, int err)
-{
- struct tcrypt_result *res = req->data;
-
- //printk("Signal done test\n");
-
- if (err == -EINPROGRESS) {
- printk("********************* Completion didnt go too well **************************** \n");
- return;
- }
-
- res->err = err;
- complete_all(&res->completion);
-}
-
-static int testmgr_alloc_buf(char *buf[XBUFSIZE])
-{
- int i;
-
- for (i = 0; i < XBUFSIZE; i++) {
- buf[i] = (void *)__get_free_page(GFP_KERNEL);
- if (!buf[i])
- goto err_free_buf;
- }
-
- return 0;
-
-err_free_buf:
- while (i-- > 0)
- free_page((unsigned long)buf[i]);
-
- return -ENOMEM;
-}
-
-static void testmgr_free_buf(char *buf[XBUFSIZE])
-{
- int i;
-
- for (i = 0; i < XBUFSIZE; i++)
- free_page((unsigned long)buf[i]);
-}
-
-static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
- unsigned int tcount)
-{
- const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
- unsigned int i, j, k, temp;
- struct scatterlist sg[8];
- char result[64];
- struct ahash_request *req;
- struct tcrypt_result tresult;
- void *hash_buff;
- char *xbuf[XBUFSIZE];
- int ret = -ENOMEM;
-
- if (testmgr_alloc_buf(xbuf))
- goto out_nobuf;
-
- init_completion(&tresult.completion);
-
- req = ahash_request_alloc(tfm, GFP_KERNEL);
- if (!req) {
- printk(KERN_ERR "alg: hash: Failed to allocate request for "
- "%s\n", algo);
- goto out_noreq;
- }
- ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
- tcrypt_complete, &tresult);
-
- j = 0;
- for (i = 0; i < tcount; i++) {
- if (template[i].np)
- continue;
-
- j++;
- memset(result, 0, 64);
-
- hash_buff = xbuf[0];
-
- memcpy(hash_buff, template[i].plaintext, template[i].psize);
- sg_init_one(&sg[0], hash_buff, template[i].psize);
-
- if (template[i].ksize) {
- crypto_ahash_clear_flags(tfm, ~0);
- ret = crypto_ahash_setkey(tfm, template[i].key,
- template[i].ksize);
- if (ret) {
- printk(KERN_ERR "alg: hash: setkey failed on "
- "test %d for %s: ret=%d\n", j, algo,
- -ret);
- goto out;
- }
- }
-
- ahash_request_set_crypt(req, sg, result, template[i].psize);
- ret = crypto_ahash_digest(req);
- switch (ret) {
- case 0:
- break;
- case -EINPROGRESS:
- case -EBUSY:
- ret = wait_for_completion_interruptible(
- &tresult.completion);
- if (!ret && !(ret = tresult.err)) {
- INIT_COMPLETION(tresult.completion);
- break;
- }
- /* fall through */
- default:
- printk(KERN_ERR "alg: hash: digest failed on test %d "
- "for %s: ret=%d\n", j, algo, -ret);
- goto out;
- }
-
- if (memcmp(result, template[i].digest,
- crypto_ahash_digestsize(tfm))) {
- printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
- j, algo);
- hexdump(result, crypto_ahash_digestsize(tfm));
- ret = -EINVAL;
- goto out;
- }
- else {
- printk(KERN_ERR "alg: hash: Test %d passed for %s\n",
- j, algo);
- hexdump(result, crypto_ahash_digestsize(tfm));
- }
- }
-
- j = 0;
- for (i = 0; i < tcount; i++) {
- if (template[i].np) {
- j++;
- memset(result, 0, 64);
-
- temp = 0;
- sg_init_table(sg, template[i].np);
- ret = -EINVAL;
- for (k = 0; k < template[i].np; k++) {
- if (WARN_ON(offset_in_page(IDX[k]) +
- template[i].tap[k] > PAGE_SIZE))
- goto out;
- sg_set_buf(&sg[k],
- memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
- offset_in_page(IDX[k]),
- template[i].plaintext + temp,
- template[i].tap[k]),
- template[i].tap[k]);
- temp += template[i].tap[k];
- }
-
- if (template[i].ksize) {
- crypto_ahash_clear_flags(tfm, ~0);
- ret = crypto_ahash_setkey(tfm, template[i].key,
- template[i].ksize);
-
- if (ret) {
- printk(KERN_ERR "alg: hash: setkey "
- "failed on chunking test %d "
- "for %s: ret=%d\n", j, algo,
- -ret);
- goto out;
- }
- }
-
- ahash_request_set_crypt(req, sg, result,
- template[i].psize);
- ret = crypto_ahash_digest(req);
- switch (ret) {
- case 0:
- break;
- case -EINPROGRESS:
- case -EBUSY:
- ret = wait_for_completion_interruptible(
- &tresult.completion);
- if (!ret && !(ret = tresult.err)) {
- INIT_COMPLETION(tresult.completion);
- break;
- }
- /* fall through */
- default:
- printk(KERN_ERR "alg: hash: digest failed "
- "on chunking test %d for %s: "
- "ret=%d\n", j, algo, -ret);
- goto out;
- }
-
- if (memcmp(result, template[i].digest,
- crypto_ahash_digestsize(tfm))) {
- printk(KERN_ERR "alg: hash: Chunking test %d "
- "failed for %s\n", j, algo);
- hexdump(result, crypto_ahash_digestsize(tfm));
- ret = -EINVAL;
- goto out;
- }
- else {
- printk(KERN_ERR "alg: hash: Chunking test %d "
- "passed for %s\n", j, algo);
- hexdump(result, crypto_ahash_digestsize(tfm));
- }
- }
- }
-
- ret = 0;
-
-out:
- ahash_request_free(req);
-out_noreq:
- testmgr_free_buf(xbuf);
-out_nobuf:
- return ret;
-}
-
-static int test_aead(struct crypto_aead *tfm, int enc,
- struct aead_testvec *template, unsigned int tcount)
-{
- const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
- unsigned int i, j, k, n, temp;
- int ret = -ENOMEM;
- char *q;
- char *key;
- struct aead_request *req;
- struct scatterlist sg[8];
- struct scatterlist asg[8];
- const char *e;
- struct tcrypt_result result;
- unsigned int authsize;
- void *input;
- void *assoc;
- char iv[MAX_IVLEN];
- char *xbuf[XBUFSIZE];
- char *axbuf[XBUFSIZE];
-
- if (testmgr_alloc_buf(xbuf))
- goto out_noxbuf;
- if (testmgr_alloc_buf(axbuf))
- goto out_noaxbuf;
-
- if (enc == ENCRYPT)
- e = "encryption";
- else
- e = "decryption";
-
- init_completion(&result.completion);
-
- req = aead_request_alloc(tfm, GFP_KERNEL);
- if (!req) {
- printk(KERN_ERR "alg: aead: Failed to allocate request for "
- "%s\n", algo);
- goto out;
- }
-
- aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
- tcrypt_complete, &result);
-
- for (i = 0, j = 0; i < tcount; i++) {
- if (!template[i].np) {
- j++;
-
- /* some tepmplates have no input data but they will
- * touch input
- */
- input = xbuf[0];
- assoc = axbuf[0];
-
- ret = -EINVAL;
- if (WARN_ON(template[i].ilen > PAGE_SIZE ||
- template[i].alen > PAGE_SIZE))
- goto out;
-
- memcpy(input, template[i].input, template[i].ilen);
- memcpy(assoc, template[i].assoc, template[i].alen);
- if (template[i].iv)
- memcpy(iv, template[i].iv, MAX_IVLEN);
- else
- memset(iv, 0, MAX_IVLEN);
-
- crypto_aead_clear_flags(tfm, ~0);
- if (template[i].wk)
- crypto_aead_set_flags(
- tfm, CRYPTO_TFM_REQ_WEAK_KEY);
-
- key = template[i].key;
-
- ret = crypto_aead_setkey(tfm, key,
- template[i].klen);
- if (!ret == template[i].fail) {
- printk(KERN_ERR "alg: aead: setkey failed on "
- "test %d for %s: flags=%x\n", j, algo,
- crypto_aead_get_flags(tfm));
- goto out;
- } else if (ret)
- continue;
-
- authsize = abs(template[i].rlen - template[i].ilen);
- ret = crypto_aead_setauthsize(tfm, authsize);
- if (ret) {
- printk(KERN_ERR "alg: aead: Failed to set "
- "authsize to %u on test %d for %s\n",
- authsize, j, algo);
- goto out;
- }
-
- sg_init_one(&sg[0], input,
- template[i].ilen + (enc ? authsize : 0));
-
- sg_init_one(&asg[0], assoc, template[i].alen);
-
- aead_request_set_crypt(req, sg, sg,
- template[i].ilen, iv);
-
- aead_request_set_assoc(req, asg, template[i].alen);
-
- ret = enc ?
- crypto_aead_encrypt(req) :
- crypto_aead_decrypt(req);
-
- switch (ret) {
- case 0:
- if (template[i].novrfy) {
- /* verification was supposed to fail */
- printk(KERN_ERR "alg: aead: %s failed "
- "on test %d for %s: ret was 0, "
- "expected -EBADMSG\n",
- e, j, algo);
- /* so really, we got a bad message */
- ret = -EBADMSG;
- goto out;
- }
- break;
- case -EINPROGRESS:
- case -EBUSY:
- ret = wait_for_completion_interruptible(
- &result.completion);
- if (!ret && !(ret = result.err)) {
- INIT_COMPLETION(result.completion);
- break;
- }
- case -EBADMSG:
- if (template[i].novrfy)
- /* verification failure was expected */
- continue;
- /* fall through */
- default:
- printk(KERN_ERR "alg: aead: %s failed on test "
- "%d for %s: ret=%d\n", e, j, algo, -ret);
- goto out;
- }
-
- q = input;
- if (memcmp(q, template[i].result, template[i].rlen)) {
- printk(KERN_ERR "alg: aead: Test %d failed on "
- "%s for %s\n", j, e, algo);
- hexdump(q, template[i].rlen);
- ret = -EINVAL;
- goto out;
- }
- else {
- printk(KERN_ERR "alg: aead: Test %d passed on "
- "%s for %s\n", j, e, algo);
- hexdump(q, template[i].rlen);
- }
- }
- }
-
- for (i = 0, j = 0; i < tcount; i++) {
- if (template[i].np) {
- j++;
-
- if (template[i].iv)
- memcpy(iv, template[i].iv, MAX_IVLEN);
- else
- memset(iv, 0, MAX_IVLEN);
-
- crypto_aead_clear_flags(tfm, ~0);
- if (template[i].wk)
- crypto_aead_set_flags(
- tfm, CRYPTO_TFM_REQ_WEAK_KEY);
- key = template[i].key;
-
- ret = crypto_aead_setkey(tfm, key, template[i].klen);
- if (!ret == template[i].fail) {
- printk(KERN_ERR "alg: aead: setkey failed on "
- "chunk test %d for %s: flags=%x\n", j,
- algo, crypto_aead_get_flags(tfm));
- goto out;
- } else if (ret)
- continue;
-
- authsize = abs(template[i].rlen - template[i].ilen);
-
- ret = -EINVAL;
- sg_init_table(sg, template[i].np);
- for (k = 0, temp = 0; k < template[i].np; k++) {
- if (WARN_ON(offset_in_page(IDX[k]) +
- template[i].tap[k] > PAGE_SIZE))
- goto out;
-
- q = xbuf[IDX[k] >> PAGE_SHIFT] +
- offset_in_page(IDX[k]);
-
- memcpy(q, template[i].input + temp,
- template[i].tap[k]);
-
- n = template[i].tap[k];
- if (k == template[i].np - 1 && enc)
- n += authsize;
- if (offset_in_page(q) + n < PAGE_SIZE)
- q[n] = 0;
-
- sg_set_buf(&sg[k], q, template[i].tap[k]);
- temp += template[i].tap[k];
- }
-
- ret = crypto_aead_setauthsize(tfm, authsize);
- if (ret) {
- printk(KERN_ERR "alg: aead: Failed to set "
- "authsize to %u on chunk test %d for "
- "%s\n", authsize, j, algo);
- goto out;
- }
-
- if (enc) {
- if (WARN_ON(sg[k - 1].offset +
- sg[k - 1].length + authsize >
- PAGE_SIZE)) {
- ret = -EINVAL;
- goto out;
- }
-
- sg[k - 1].length += authsize;
- }
-
- sg_init_table(asg, template[i].anp);
- ret = -EINVAL;
- for (k = 0, temp = 0; k < template[i].anp; k++) {
- if (WARN_ON(offset_in_page(IDX[k]) +
- template[i].atap[k] > PAGE_SIZE))
- goto out;
- sg_set_buf(&asg[k],
- memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
- offset_in_page(IDX[k]),
- template[i].assoc + temp,
- template[i].atap[k]),
- template[i].atap[k]);
- temp += template[i].atap[k];
- }
-
- aead_request_set_crypt(req, sg, sg,
- template[i].ilen,
- iv);
-
- aead_request_set_assoc(req, asg, template[i].alen);
-
- ret = enc ?
- crypto_aead_encrypt(req) :
- crypto_aead_decrypt(req);
-
- switch (ret) {
- case 0:
- if (template[i].novrfy) {
- /* verification was supposed to fail */
- printk(KERN_ERR "alg: aead: %s failed "
- "on chunk test %d for %s: ret "
- "was 0, expected -EBADMSG\n",
- e, j, algo);
- /* so really, we got a bad message */
- ret = -EBADMSG;
- goto out;
- }
- break;
- case -EINPROGRESS:
- case -EBUSY:
- ret = wait_for_completion_interruptible(
- &result.completion);
- if (!ret && !(ret = result.err)) {
- INIT_COMPLETION(result.completion);
- break;
- }
- case -EBADMSG:
- if (template[i].novrfy)
- /* verification failure was expected */
- continue;
- /* fall through */
- default:
- printk(KERN_ERR "alg: aead: %s failed on "
- "chunk test %d for %s: ret=%d\n", e, j,
- algo, -ret);
- goto out;
- }
-
- ret = -EINVAL;
- for (k = 0, temp = 0; k < template[i].np; k++) {
- q = xbuf[IDX[k] >> PAGE_SHIFT] +
- offset_in_page(IDX[k]);
-
- n = template[i].tap[k];
- if (k == template[i].np - 1)
- n += enc ? authsize : -authsize;
-
- if (memcmp(q, template[i].result + temp, n)) {
- printk(KERN_ERR "alg: aead: Chunk "
- "test %d failed on %s at page "
- "%u for %s\n", j, e, k, algo);
- hexdump(q, n);
- goto out;
- }
- else {
- printk(KERN_ERR "alg: aead: Chunk "
- "test %d passed on %s at page "
- "%u for %s\n", j, e, k, algo);
- hexdump(q, n);
- }
-
- q += n;
- if (k == template[i].np - 1 && !enc) {
- if (memcmp(q, template[i].input +
- temp + n, authsize))
- n = authsize;
- else
- n = 0;
- } else {
- for (n = 0; offset_in_page(q + n) &&
- q[n]; n++)
- ;
- }
- if (n) {
- printk(KERN_ERR "alg: aead: Result "
- "buffer corruption in chunk "
- "test %d on %s at page %u for "
- "%s: %u bytes:\n", j, e, k,
- algo, n);
- hexdump(q, n);
- goto out;
- }
- temp += template[i].tap[k];
- }
- }
- }
-
- ret = 0;
-
-out:
- aead_request_free(req);
- testmgr_free_buf(axbuf);
-out_noaxbuf:
- testmgr_free_buf(xbuf);
-out_noxbuf:
- return ret;
-}
-
-static int test_cipher(struct crypto_cipher *tfm, int enc,
- struct cipher_testvec *template, unsigned int tcount)
-{
- const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
- unsigned int i, j, k;
- char *q;
- const char *e;
- void *data;
- char *xbuf[XBUFSIZE];
- int ret = -ENOMEM;
-
- if (testmgr_alloc_buf(xbuf))
- goto out_nobuf;
-
- if (enc == ENCRYPT)
- e = "encryption";
- else
- e = "decryption";
-
- j = 0;
- for (i = 0; i < tcount; i++) {
- if (template[i].np)
- continue;
-
- j++;
-
- ret = -EINVAL;
- if (WARN_ON(template[i].ilen > PAGE_SIZE))
- goto out;
-
- data = xbuf[0];
- memcpy(data, template[i].input, template[i].ilen);
-
- crypto_cipher_clear_flags(tfm, ~0);
- if (template[i].wk)
- crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
-
- ret = crypto_cipher_setkey(tfm, template[i].key,
- template[i].klen);
- if (!ret == template[i].fail) {
- printk(KERN_ERR "alg: cipher: setkey failed "
- "on test %d for %s: flags=%x\n", j,
- algo, crypto_cipher_get_flags(tfm));
- goto out;
- } else if (ret)
- continue;
-
- for (k = 0; k < template[i].ilen;
- k += crypto_cipher_blocksize(tfm)) {
- if (enc)
- crypto_cipher_encrypt_one(tfm, data + k,
- data + k);
- else
- crypto_cipher_decrypt_one(tfm, data + k,
- data + k);
- }
-
- q = data;
- if (memcmp(q, template[i].result, template[i].rlen)) {
- printk(KERN_ERR "alg: cipher: Test %d failed "
- "on %s for %s\n", j, e, algo);
- hexdump(q, template[i].rlen);
- ret = -EINVAL;
- goto out;
- }
- else {
- printk(KERN_ERR "alg: cipher: Test %d passed "
- "on %s for %s\n", j, e, algo);
- hexdump(q, template[i].rlen);
- }
- }
-
- ret = 0;
-
-out:
- testmgr_free_buf(xbuf);
-out_nobuf:
- return ret;
-}
-
-static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
- struct cipher_testvec *template, unsigned int tcount)
-{
- const char *algo =
- crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm));
- unsigned int i, j, k, n, temp;
- char *q;
- struct ablkcipher_request *req;
- struct scatterlist sg[8];
- const char *e;
- struct tcrypt_result result;
- void *data;
- char iv[MAX_IVLEN];
- char *xbuf[XBUFSIZE];
- int ret = -ENOMEM;
-
- if (testmgr_alloc_buf(xbuf))
- goto out_nobuf;
-
- if (enc == ENCRYPT)
- e = "encryption";
- else
- e = "decryption";
-
- init_completion(&result.completion);
-
- req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
- if (!req) {
- printk(KERN_ERR "alg: skcipher: Failed to allocate request "
- "for %s\n", algo);
- goto out;
- }
-
- //printk("tcount: %u\n", tcount);
-
- ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
- tcrypt_complete, &result);
-
- j = 0;
- for (i = 0; i < tcount; i++) {
- if (template[i].iv)
- memcpy(iv, template[i].iv, MAX_IVLEN);
- else
- memset(iv, 0, MAX_IVLEN);
-
- if (!(template[i].np)) {
- //printk("np: %d, i: %d, j: %d\n", template[i].np, i, j);
- j++;
-
- ret = -EINVAL;
- if (WARN_ON(template[i].ilen > PAGE_SIZE))
- goto out;
-
- data = xbuf[0];
- memcpy(data, template[i].input, template[i].ilen);
-
- crypto_ablkcipher_clear_flags(tfm, ~0);
- if (template[i].wk)
- crypto_ablkcipher_set_flags(
- tfm, CRYPTO_TFM_REQ_WEAK_KEY);
-
- ret = crypto_ablkcipher_setkey(tfm, template[i].key,
- template[i].klen);
- if (!ret == template[i].fail) {
- printk(KERN_ERR "alg: skcipher: setkey failed "
- "on test %d for %s: flags=%x\n", j,
- algo, crypto_ablkcipher_get_flags(tfm));
- printk("ERROR\n");
- goto out;
- } else if (ret)
- continue;
-
- sg_init_one(&sg[0], data, template[i].ilen);
-
- ablkcipher_request_set_crypt(req, sg, sg,
- template[i].ilen, iv);
- ret = enc ?
- crypto_ablkcipher_encrypt(req) :
- crypto_ablkcipher_decrypt(req);
-
- switch (ret) {
- case 0:
- break;
- case -EINPROGRESS:
- case -EBUSY:
- ret = wait_for_completion_interruptible(
- &result.completion);
- if (!ret && !((ret = result.err))) {
- INIT_COMPLETION(result.completion);
- break;
- }
- /* fall through */
- default:
- printk(KERN_ERR "alg: skcipher: %s failed on "
- "test %d for %s: ret=%d\n", e, j, algo,
- -ret);
- printk("ERROR\n");
- goto out;
- }
- q = data;
- if (memcmp(q, template[i].result, template[i].rlen)) {
- printk(KERN_ERR "alg: skcipher: Test %d "
- "failed on %s for %s\n", j, e, algo);
- hexdump(q, template[i].rlen);
- printk("ERROR\n");
- ret = -EINVAL;
- goto out;
- }
- else {
- printk(KERN_ERR "alg: skcipher: Test %d "
- "*PASSED* on %s for %s\n", j, e, algo);
- hexdump(q, template[i].rlen);
- printk("DONE\n");
- }
- }
- }
- printk("Testing %s chunking across pages.\n", algo);
- j = 0;
- for (i = 0; i < tcount; i++) {
- if (template[i].iv)
- memcpy(iv, template[i].iv, MAX_IVLEN);
- else
- memset(iv, 0, MAX_IVLEN);
-
- if (template[i].np) {
- j++;
-
- crypto_ablkcipher_clear_flags(tfm, ~0);
- if (template[i].wk)
- crypto_ablkcipher_set_flags(
- tfm, CRYPTO_TFM_REQ_WEAK_KEY);
-
- ret = crypto_ablkcipher_setkey(tfm, template[i].key,
- template[i].klen);
- if (!ret == template[i].fail) {
- printk(KERN_ERR "alg: skcipher: setkey failed "
- "on chunk test %d for %s: flags=%x\n",
- j, algo,
- crypto_ablkcipher_get_flags(tfm));
- printk("ERROR\n");
- goto out;
- } else if (ret)
- continue;
-
- temp = 0;
- ret = -EINVAL;
- sg_init_table(sg, template[i].np);
- for (k = 0; k < template[i].np; k++) {
- if (WARN_ON(offset_in_page(IDX[k]) +
- template[i].tap[k] > PAGE_SIZE))
- goto out;
-
- q = xbuf[IDX[k] >> PAGE_SHIFT] +
- offset_in_page(IDX[k]);
-
- memcpy(q, template[i].input + temp,
- template[i].tap[k]);
-
- if (offset_in_page(q) + template[i].tap[k] <
- PAGE_SIZE)
- q[template[i].tap[k]] = 0;
-
- sg_set_buf(&sg[k], q, template[i].tap[k]);
-
- temp += template[i].tap[k];
- }
-
- ablkcipher_request_set_crypt(req, sg, sg,
- template[i].ilen, iv);
-
- ret = enc ?
- crypto_ablkcipher_encrypt(req) :
- crypto_ablkcipher_decrypt(req);
-
- switch (ret) {
- case 0:
- break;
- case -EINPROGRESS:
- case -EBUSY:
- ret = wait_for_completion_interruptible(
- &result.completion);
- if (!ret && !((ret = result.err))) {
- INIT_COMPLETION(result.completion);
- break;
- }
- /* fall through */
- default:
- printk(KERN_ERR "alg: skcipher: %s failed on "
- "chunk test %d for %s: ret=%d\n", e, j,
- algo, -ret);
- printk("ERROR\n");
- goto out;
- }
-
- temp = 0;
- ret = -EINVAL;
- for (k = 0; k < template[i].np; k++) {
- q = xbuf[IDX[k] >> PAGE_SHIFT] +
- offset_in_page(IDX[k]);
-
- if (memcmp(q, template[i].result + temp,
- template[i].tap[k])) {
- printk(KERN_ERR "alg: skcipher: Chunk "
- "test %d failed on %s at page "
- "%u for %s\n", j, e, k, algo);
- hexdump(q, template[i].tap[k]);
- printk("ERROR\n");
- goto out;
- }
- else {
- printk(KERN_ERR "alg: skcipher: Chunk "
- "test %d *PASSED* on %s at page "
- "%u for %s\n", j, e, k, algo);
- hexdump(q, template[i].tap[k]);
- printk("DONE\n");
- }
-
- q += template[i].tap[k];
- for (n = 0; offset_in_page(q + n) && q[n]; n++)
- ;
-#if 1
- if (n) {
- printk(KERN_ERR "alg: skcipher: "
- "Result buffer corruption in "
- "chunk test %d on %s at page "
- "%u for %s: %u bytes:\n", j, e,
- k, algo, n);
- hexdump(q, n);
- printk("ERROR\n");
- goto out;
- }
- else {
- printk(KERN_ERR "alg: skcipher: "
- "Result buffer clean in "
- "chunk test %d on %s at page "
- "%u for %s: %u bytes:\n", j, e,
- k, algo, n);
- hexdump(q, n);
- printk("Chunk Buffer clean\n");
- }
-#endif
- temp += template[i].tap[k];
- }
- }
- }
-
- ret = 0;
-out:
- ablkcipher_request_free(req);
- testmgr_free_buf(xbuf);
-out_nobuf:
- return ret;
-}
-
-static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
- struct comp_testvec *dtemplate, int ctcount, int dtcount)
-{
- const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
- unsigned int i;
- char result[COMP_BUF_SIZE];
- int ret;
-
- for (i = 0; i < ctcount; i++) {
- int ilen;
- unsigned int dlen = COMP_BUF_SIZE;
-
- memset(result, 0, sizeof (result));
-
- ilen = ctemplate[i].inlen;
- ret = crypto_comp_compress(tfm, ctemplate[i].input,
- ilen, result, &dlen);
- if (ret) {
- printk(KERN_ERR "alg: comp: compression failed "
- "on test %d for %s: ret=%d\n", i + 1, algo,
- -ret);
- goto out;
- }
-
- if (dlen != ctemplate[i].outlen) {
- printk(KERN_ERR "alg: comp: Compression test %d "
- "failed for %s: output len = %d\n", i + 1, algo,
- dlen);
- ret = -EINVAL;
- goto out;
- }
-
- if (memcmp(result, ctemplate[i].output, dlen)) {
- printk(KERN_ERR "alg: comp: Compression test %d "
- "failed for %s\n", i + 1, algo);
- hexdump(result, dlen);
- ret = -EINVAL;
- goto out;
- }
- else {
- printk(KERN_ERR "alg: comp: Compression test %d "
- "passed for %s\n", i + 1, algo);
- hexdump(result, dlen);
- }
- }
-
- for (i = 0; i < dtcount; i++) {
- int ilen;
- unsigned int dlen = COMP_BUF_SIZE;
-
- memset(result, 0, sizeof (result));
-
- ilen = dtemplate[i].inlen;
- ret = crypto_comp_decompress(tfm, dtemplate[i].input,
- ilen, result, &dlen);
- if (ret) {
- printk(KERN_ERR "alg: comp: decompression failed "
- "on test %d for %s: ret=%d\n", i + 1, algo,
- -ret);
- goto out;
- }
-
- if (dlen != dtemplate[i].outlen) {
- printk(KERN_ERR "alg: comp: Decompression test %d "
- "failed for %s: output len = %d\n", i + 1, algo,
- dlen);
- ret = -EINVAL;
- goto out;
- }
-
- if (memcmp(result, dtemplate[i].output, dlen)) {
- printk(KERN_ERR "alg: comp: Decompression test %d "
- "failed for %s\n", i + 1, algo);
- hexdump(result, dlen);
- ret = -EINVAL;
- goto out;
- }
- else {
- printk(KERN_ERR "alg: comp: Decompression test %d "
- "passed for %s\n", i + 1, algo);
- hexdump(result, dlen);
- }
- }
-
- ret = 0;
-
-out:
- return ret;
-}
-
-static int test_pcomp(struct crypto_pcomp *tfm,
- struct pcomp_testvec *ctemplate,
- struct pcomp_testvec *dtemplate, int ctcount,
- int dtcount)
-{
- const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm));
- unsigned int i;
- char result[COMP_BUF_SIZE];
- int res;
-
- for (i = 0; i < ctcount; i++) {
- struct comp_request req;
- unsigned int produced = 0;
-
- res = crypto_compress_setup(tfm, ctemplate[i].params,
- ctemplate[i].paramsize);
- if (res) {
- pr_err("alg: pcomp: compression setup failed on test "
- "%d for %s: error=%d\n", i + 1, algo, res);
- return res;
- }
-
- res = crypto_compress_init(tfm);
- if (res) {
- pr_err("alg: pcomp: compression init failed on test "
- "%d for %s: error=%d\n", i + 1, algo, res);
- return res;
- }
-
- memset(result, 0, sizeof(result));
-
- req.next_in = ctemplate[i].input;
- req.avail_in = ctemplate[i].inlen / 2;
- req.next_out = result;
- req.avail_out = ctemplate[i].outlen / 2;
-
- res = crypto_compress_update(tfm, &req);
- if (res < 0 && (res != -EAGAIN || req.avail_in)) {
- pr_err("alg: pcomp: compression update failed on test "
- "%d for %s: error=%d\n", i + 1, algo, res);
- return res;
- }
- if (res > 0)
- produced += res;
-
- /* Add remaining input data */
- req.avail_in += (ctemplate[i].inlen + 1) / 2;
-
- res = crypto_compress_update(tfm, &req);
- if (res < 0 && (res != -EAGAIN || req.avail_in)) {
- pr_err("alg: pcomp: compression update failed on test "
- "%d for %s: error=%d\n", i + 1, algo, res);
- return res;
- }
- if (res > 0)
- produced += res;
-
- /* Provide remaining output space */
- req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2;
-
- res = crypto_compress_final(tfm, &req);
- if (res < 0) {
- pr_err("alg: pcomp: compression final failed on test "
- "%d for %s: error=%d\n", i + 1, algo, res);
- return res;
- }
- produced += res;
-
- if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) {
- pr_err("alg: comp: Compression test %d failed for %s: "
- "output len = %d (expected %d)\n", i + 1, algo,
- COMP_BUF_SIZE - req.avail_out,
- ctemplate[i].outlen);
- return -EINVAL;
- }
-
- if (produced != ctemplate[i].outlen) {
- pr_err("alg: comp: Compression test %d failed for %s: "
- "returned len = %u (expected %d)\n", i + 1,
- algo, produced, ctemplate[i].outlen);
- return -EINVAL;
- }
-
- if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) {
- pr_err("alg: pcomp: Compression test %d failed for "
- "%s\n", i + 1, algo);
- hexdump(result, ctemplate[i].outlen);
- return -EINVAL;
- }
- }
-
- for (i = 0; i < dtcount; i++) {
- struct comp_request req;
- unsigned int produced = 0;
-
- res = crypto_decompress_setup(tfm, dtemplate[i].params,
- dtemplate[i].paramsize);
- if (res) {
- pr_err("alg: pcomp: decompression setup failed on "
- "test %d for %s: error=%d\n", i + 1, algo, res);
- return res;
- }
-
- res = crypto_decompress_init(tfm);
- if (res) {
- pr_err("alg: pcomp: decompression init failed on test "
- "%d for %s: error=%d\n", i + 1, algo, res);
- return res;
- }
-
- memset(result, 0, sizeof(result));
-
- req.next_in = dtemplate[i].input;
- req.avail_in = dtemplate[i].inlen / 2;
- req.next_out = result;
- req.avail_out = dtemplate[i].outlen / 2;
-
- res = crypto_decompress_update(tfm, &req);
- if (res < 0 && (res != -EAGAIN || req.avail_in)) {
- pr_err("alg: pcomp: decompression update failed on "
- "test %d for %s: error=%d\n", i + 1, algo, res);
- return res;
- }
- if (res > 0)
- produced += res;
-
- /* Add remaining input data */
- req.avail_in += (dtemplate[i].inlen + 1) / 2;
-
- res = crypto_decompress_update(tfm, &req);
- if (res < 0 && (res != -EAGAIN || req.avail_in)) {
- pr_err("alg: pcomp: decompression update failed on "
- "test %d for %s: error=%d\n", i + 1, algo, res);
- return res;
- }
- if (res > 0)
- produced += res;
-
- /* Provide remaining output space */
- req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2;
-
- res = crypto_decompress_final(tfm, &req);
- if (res < 0 && (res != -EAGAIN || req.avail_in)) {
- pr_err("alg: pcomp: decompression final failed on "
- "test %d for %s: error=%d\n", i + 1, algo, res);
- return res;
- }
- if (res > 0)
- produced += res;
-
- if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) {
- pr_err("alg: comp: Decompression test %d failed for "
- "%s: output len = %d (expected %d)\n", i + 1,
- algo, COMP_BUF_SIZE - req.avail_out,
- dtemplate[i].outlen);
- return -EINVAL;
- }
-
- if (produced != dtemplate[i].outlen) {
- pr_err("alg: comp: Decompression test %d failed for "
- "%s: returned len = %u (expected %d)\n", i + 1,
- algo, produced, dtemplate[i].outlen);
- return -EINVAL;
- }
-
- if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) {
- pr_err("alg: pcomp: Decompression test %d failed for "
- "%s\n", i + 1, algo);
- hexdump(result, dtemplate[i].outlen);
- return -EINVAL;
- }
- }
-
- return 0;
-}
-
-static int test_ablkcipher_jiffies(struct ablkcipher_request *req, int enc,
- int sec, struct tcrypt_result *result,
- int blen)
-{
- unsigned long start, end;
- int bcount;
- int ret;
-
- for (start = jiffies, end = start + sec * HZ, bcount = 0;
- time_before(jiffies, end); bcount++) {
-
- if (enc)
- ret = crypto_ablkcipher_encrypt(req);
- else
- ret = crypto_ablkcipher_decrypt(req);
-
- switch (ret) {
- case 0:
- break;
- case -EINPROGRESS:
- case -EBUSY:
- ret = wait_for_completion_interruptible(
- &result->completion);
- if (!ret && !((ret = result->err))) {
- INIT_COMPLETION(result->completion);
- break;
- }
- default:
- printk("ERROR\n");
- return ret;
- }
- }
-
- printk("%d operations in %d seconds (%ld bytes)\n",
- bcount, sec, (long)bcount * blen);
-
- return 0;
-}
-
-static int test_ablkcipher_cycles(struct ablkcipher_request *req, int enc,
- int sec, struct tcrypt_result *result,
- int blen)
-{
- unsigned long cycles = 0;
- int ret = 0;
- int i;
- unsigned long start, end = 0;
- //local_bh_disable();
- //local_irq_disable();
- /* Warm-up run. */
- for (i = 0; i < 4; i++) {
- if (enc)
- ret = crypto_ablkcipher_encrypt(req);
- else
- ret = crypto_ablkcipher_decrypt(req);
-
- switch (ret) {
- case 0:
- break;
- case -EINPROGRESS:
- case -EBUSY:
-#if 0
- ret = wait_for_completion_interruptible(
- &result->completion);
- if (!ret && !((ret = result->err))) {
- INIT_COMPLETION(result->completion);
- break;
- }
-#else
-
- wait_for_completion(&result->completion);
- INIT_COMPLETION(result->completion);
- break;
-#endif
- default:
- printk("ERROR\n");
- return ret;
- }
-
- if (signal_pending(current)) {
- printk("Signal caught\n");
- break;
- }
-
- }
-
- //printk("Debug ln: (%d), fn: %s\n", __LINE__, __func__);
- /* The real thing. */
- for (i = 0; i < 8; i++) {
- end = 0;
- start = 0;
- start = read_c0_count();
- if (enc)
- ret = crypto_ablkcipher_encrypt(req);
- else
- ret = crypto_ablkcipher_decrypt(req);
-
- switch (ret) {
- case 0:
- break;
- case -EINPROGRESS:
- case -EBUSY:
-#if 0
- ret = wait_for_completion_interruptible(
- &result->completion);
- end = get_cycles();
- if (!ret && !((ret = result->err))) {
- INIT_COMPLETION(result->completion);
- break;
- }
-#else
- wait_for_completion(&result->completion);
- end = read_c0_count();
- INIT_COMPLETION(result->completion);
- break;
-#endif
- default:
- printk("ERROR\n");
- return ret;
- }
-
- if (signal_pending(current)) {
- printk("Signal caught\n");
- break;
- }
-
- cycles += end - start;
- }
-
- // local_irq_enable();
- // local_bh_enable();
-
- printk("1 operation in %lu cycles (%d bytes)\n",
- (cycles + 4) / 8, blen);
-
- return 0;
-
-}
-
-static u32 b_size[] = {16, 64, 256, 1024, 8192, 0};
-
-static int test_skcipher_speed(struct crypto_ablkcipher *tfm, int enc,
- struct cipher_speed_template *template,
- unsigned int tcount, unsigned int sec,
- u8* keysize)
-{
- const char *algo =
- crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm));
-
- unsigned int i = 0, j, iv_len;
- struct ablkcipher_request *req;
- //struct scatterlist sg[8];
- const char *e;
- struct tcrypt_result result;
- char iv[MAX_IVLEN];
- static char *xbuf[XBUFSIZE];
- int ret = -ENOMEM;
- u32 *block_size;
- static char *tvmem_buf[4];
- const char *key;
-
- if (testmgr_alloc_buf(xbuf))
- goto out_nobuf;
-
- if (enc == ENCRYPT)
- e = "encryption";
- else
- e = "decryption";
-
- init_completion(&result.completion);
-
- printk("Start ablkcipher speed test\n");
-
- req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
- if (!req) {
- printk(KERN_ERR "alg: skcipher: Failed to allocate request "
- "for %s\n", algo);
- goto out;
- }
-
-// ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
- ablkcipher_request_set_callback(req, 0,
- tcrypt_complete, &result);
-
- do {
-
- block_size = b_size;
-
- do {
- struct scatterlist sg[4];
- if ((*keysize + *block_size) > 4 * PAGE_SIZE) {
- printk("template (%u) too big for "
- "tvmem_buf (%lu)\n", *keysize + *block_size,
- 4 * PAGE_SIZE);
- goto out;
- }
- crypto_ablkcipher_clear_flags(tfm, ~0);
-
- printk("test %u (%d bit key, %d byte blocks): ", i,
- *keysize * 8, *block_size);
-
- memset(tvmem_buf[0], 0xff, PAGE_SIZE);
- key = tvmem_buf[0];
-
- for (j = 0; j < tcount; j++) {
- if (template[j].klen == *keysize) {
- key = template[j].key;
- break;
- }
- }
- ret = crypto_ablkcipher_setkey(tfm, key, *keysize);
- if (ret) {
- printk("Error setting of keys\n");
- goto out;
- }
-
- sg_init_table(sg, 4);
-
- for (j = 0; j < 4; j++) {
- tvmem_buf[j] = xbuf[j];
- memset(tvmem_buf[j], 0xff, PAGE_SIZE);
- sg_set_buf(sg + j, tvmem_buf[j], PAGE_SIZE);
- }
-
- iv_len = crypto_ablkcipher_ivsize(tfm);
- if (iv_len) {
- memset(&iv, 0xff, iv_len);
- }
-
- ablkcipher_request_set_crypt(req, sg, sg,
- *block_size, iv);
-
- //printk("Debug ln: %d, %s\n", __LINE__, __func__);
- if (sec)
- ret = test_ablkcipher_jiffies(req, enc, sec,
- &result, *block_size);
- else
- ret = test_ablkcipher_cycles(req, enc, sec,
- &result, *block_size);
-
-
- if (ret) {
- printk(KERN_ERR "alg: skcipher: %s failed on "
- "test %d for %s: ret=%d\n", e, j, algo,
- -ret);
- goto out;
- }
-
- block_size++;
- i++;
- } while (*block_size);
- keysize++;
- } while (*keysize);
-
- ret = 0;
-out:
- printk("End ablkcipher speed test\n");
- ablkcipher_request_free(req);
- testmgr_free_buf(xbuf);
-#if 0
- if (!completion_done(&result->completion)) {
- printk("There are threads waiting for completion, completing all\n");
- complete_all(&result->completion);
- }
-#endif
-
- //testmgr_free_buf(tvbuf);
-out_nobuf:
- return ret;
-
-}
-
-static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
- unsigned int tcount)
-{
- const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
- int err = 0, i, j, seedsize;
- u8 *seed;
- char result[32];
-
- seedsize = crypto_rng_seedsize(tfm);
-
- seed = kmalloc(seedsize, GFP_KERNEL);
- if (!seed) {
- printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
- "for %s\n", algo);
- return -ENOMEM;
- }
-
- for (i = 0; i < tcount; i++) {
- memset(result, 0, 32);
-
- memcpy(seed, template[i].v, template[i].vlen);
- memcpy(seed + template[i].vlen, template[i].key,
- template[i].klen);
- memcpy(seed + template[i].vlen + template[i].klen,
- template[i].dt, template[i].dtlen);
-
- err = crypto_rng_reset(tfm, seed, seedsize);
- if (err) {
- printk(KERN_ERR "alg: cprng: Failed to reset rng "
- "for %s\n", algo);
- goto out;
- }
-
- for (j = 0; j < template[i].loops; j++) {
- err = crypto_rng_get_bytes(tfm, result,
- template[i].rlen);
- if (err != template[i].rlen) {
- printk(KERN_ERR "alg: cprng: Failed to obtain "
- "the correct amount of random data for "
- "%s (requested %d, got %d)\n", algo,
- template[i].rlen, err);
- goto out;
- }
- }
-
- err = memcmp(result, template[i].result,
- template[i].rlen);
- if (err) {
- printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
- i, algo);
- hexdump(result, template[i].rlen);
- err = -EINVAL;
- goto out;
- }
- }
-
-out:
- kfree(seed);
- return err;
-}
-
-static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
- u32 type, u32 mask)
-{
- struct crypto_aead *tfm;
- int err = 0;
-
- tfm = crypto_alloc_aead(driver, type, mask);
- if (IS_ERR(tfm)) {
- printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
- "%ld\n", driver, PTR_ERR(tfm));
- return PTR_ERR(tfm);
- }
-
- if (desc->suite.aead.enc.vecs) {
- err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
- desc->suite.aead.enc.count);
- if (err)
- goto out;
- }
-
- if (!err && desc->suite.aead.dec.vecs)
- err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
- desc->suite.aead.dec.count);
-
-out:
- crypto_free_aead(tfm);
- return err;
-}
-
-static int alg_test_cipher(const struct alg_test_desc *desc,
- const char *driver, u32 type, u32 mask)
-{
- struct crypto_cipher *tfm;
- int err = 0;
-
- tfm = crypto_alloc_cipher(driver, type, mask);
- if (IS_ERR(tfm)) {
- printk(KERN_ERR "alg: cipher: Failed to load transform for "
- "%s: %ld\n", driver, PTR_ERR(tfm));
- return PTR_ERR(tfm);
- }
-
- if (desc->suite.cipher.enc.vecs) {
- err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
- desc->suite.cipher.enc.count);
- if (err)
- goto out;
- }
-
- if (desc->suite.cipher.dec.vecs)
- err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
- desc->suite.cipher.dec.count);
-
-out:
- crypto_free_cipher(tfm);
- return err;
-}
-
-static int alg_test_skcipher(const struct alg_test_desc *desc,
- const char *driver, u32 type, u32 mask)
-{
- struct crypto_ablkcipher *tfm;
- int err = 0;
-
- tfm = crypto_alloc_ablkcipher(driver, type, mask);
- if (IS_ERR(tfm)) {
- printk(KERN_ERR "alg: skcipher: Failed to load transform for "
- "%s: %ld\n", driver, PTR_ERR(tfm));
- return PTR_ERR(tfm);
- }
-
- if (desc->suite.cipher.enc.vecs) {
- err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
- desc->suite.cipher.enc.count);
- if (err)
- goto out;
- }
-
- if (desc->suite.cipher.dec.vecs)
- err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
- desc->suite.cipher.dec.count);
-
-out:
- crypto_free_ablkcipher(tfm);
- return err;
-}
-
-static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
- u32 type, u32 mask)
-{
- struct crypto_comp *tfm;
- int err;
-
- tfm = crypto_alloc_comp(driver, type, mask);
- if (IS_ERR(tfm)) {
- printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
- "%ld\n", driver, PTR_ERR(tfm));
- return PTR_ERR(tfm);
- }
-
- err = test_comp(tfm, desc->suite.comp.comp.vecs,
- desc->suite.comp.decomp.vecs,
- desc->suite.comp.comp.count,
- desc->suite.comp.decomp.count);
-
- crypto_free_comp(tfm);
- return err;
-}
-
-static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver,
- u32 type, u32 mask)
-{
- struct crypto_pcomp *tfm;
- int err;
-
- tfm = crypto_alloc_pcomp(driver, type, mask);
- if (IS_ERR(tfm)) {
- pr_err("alg: pcomp: Failed to load transform for %s: %ld\n",
- driver, PTR_ERR(tfm));
- return PTR_ERR(tfm);
- }
-
- err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs,
- desc->suite.pcomp.decomp.vecs,
- desc->suite.pcomp.comp.count,
- desc->suite.pcomp.decomp.count);
-
- crypto_free_pcomp(tfm);
- return err;
-}
-
-static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
- u32 type, u32 mask)
-{
- struct crypto_ahash *tfm;
- int err;
-
- tfm = crypto_alloc_ahash(driver, type, mask);
- if (IS_ERR(tfm)) {
- printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
- "%ld\n", driver, PTR_ERR(tfm));
- return PTR_ERR(tfm);
- }
-
- err = test_hash(tfm, desc->suite.hash.vecs, desc->suite.hash.count);
-
- crypto_free_ahash(tfm);
- return err;
-}
-
-static int alg_test_crc32c(const struct alg_test_desc *desc,
- const char *driver, u32 type, u32 mask)
-{
- struct crypto_shash *tfm;
- u32 val;
- int err;
-
- err = alg_test_hash(desc, driver, type, mask);
- if (err)
- goto out;
-
- tfm = crypto_alloc_shash(driver, type, mask);
- if (IS_ERR(tfm)) {
- printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
- "%ld\n", driver, PTR_ERR(tfm));
- err = PTR_ERR(tfm);
- goto out;
- }
-
- do {
- struct {
- struct shash_desc shash;
- char ctx[crypto_shash_descsize(tfm)];
- } sdesc;
-
- sdesc.shash.tfm = tfm;
- sdesc.shash.flags = 0;
-
- *(u32 *)sdesc.ctx = le32_to_cpu(420553207);
- err = crypto_shash_final(&sdesc.shash, (u8 *)&val);
- if (err) {
- printk(KERN_ERR "alg: crc32c: Operation failed for "
- "%s: %d\n", driver, err);
- break;
- }
-
- if (val != ~420553207) {
- printk(KERN_ERR "alg: crc32c: Test failed for %s: "
- "%d\n", driver, val);
- err = -EINVAL;
- }
- } while (0);
-
- crypto_free_shash(tfm);
-
-out:
- return err;
-}
-
-static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
- u32 type, u32 mask)
-{
- struct crypto_rng *rng;
- int err = 0;
-
- rng = crypto_alloc_rng(driver, type, mask);
- if (IS_ERR(rng)) {
- printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
- "%ld\n", driver, PTR_ERR(rng));
- return PTR_ERR(rng);
- }
-
- err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
-
- crypto_free_rng(rng);
-
- return err;
-}
-
-/* Please keep this list sorted by algorithm name. */
-static const struct alg_test_desc alg_test_descs[] = {
- {
- .alg = "ansi_cprng",
- .test = alg_test_cprng,
- .fips_allowed = 1,
- .suite = {
- .cprng = {
- .vecs = ansi_cprng_aes_tv_template,
- .count = ANSI_CPRNG_AES_TEST_VECTORS
- }
- }
- }, {
- .alg = "cbc(aes)",
- .test = alg_test_skcipher,
- .fips_allowed = 1,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = aes_cbc_enc_tv_template,
- .count = AES_CBC_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = aes_cbc_dec_tv_template,
- .count = AES_CBC_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "cbc(anubis)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = anubis_cbc_enc_tv_template,
- .count = ANUBIS_CBC_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = anubis_cbc_dec_tv_template,
- .count = ANUBIS_CBC_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "cbc(blowfish)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = bf_cbc_enc_tv_template,
- .count = BF_CBC_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = bf_cbc_dec_tv_template,
- .count = BF_CBC_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "cbc(camellia)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = camellia_cbc_enc_tv_template,
- .count = CAMELLIA_CBC_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = camellia_cbc_dec_tv_template,
- .count = CAMELLIA_CBC_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "cbc(des)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = des_cbc_enc_tv_template,
- .count = DES_CBC_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = des_cbc_dec_tv_template,
- .count = DES_CBC_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "cbc(des3_ede)",
- .test = alg_test_skcipher,
- .fips_allowed = 1,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = des3_ede_cbc_enc_tv_template,
- .count = DES3_EDE_CBC_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = des3_ede_cbc_dec_tv_template,
- .count = DES3_EDE_CBC_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "cbc(twofish)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = tf_cbc_enc_tv_template,
- .count = TF_CBC_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = tf_cbc_dec_tv_template,
- .count = TF_CBC_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "ccm(aes)",
- .test = alg_test_aead,
- .fips_allowed = 1,
- .suite = {
- .aead = {
- .enc = {
- .vecs = aes_ccm_enc_tv_template,
- .count = AES_CCM_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = aes_ccm_dec_tv_template,
- .count = AES_CCM_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "crc32c",
- .test = alg_test_crc32c,
- .fips_allowed = 1,
- .suite = {
- .hash = {
- .vecs = crc32c_tv_template,
- .count = CRC32C_TEST_VECTORS
- }
- }
- }, {
- .alg = "ctr(aes)",
- .test = alg_test_skcipher,
- .fips_allowed = 1,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = aes_ctr_enc_tv_template,
- .count = AES_CTR_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = aes_ctr_dec_tv_template,
- .count = AES_CTR_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "cts(cbc(aes))",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = cts_mode_enc_tv_template,
- .count = CTS_MODE_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = cts_mode_dec_tv_template,
- .count = CTS_MODE_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "deflate",
- .test = alg_test_comp,
- .suite = {
- .comp = {
- .comp = {
- .vecs = deflate_comp_tv_template,
- .count = DEFLATE_COMP_TEST_VECTORS
- },
- .decomp = {
- .vecs = deflate_decomp_tv_template,
- .count = DEFLATE_DECOMP_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "ecb(aes)",
- .test = alg_test_skcipher,
- .fips_allowed = 1,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = aes_enc_tv_template,
- .count = AES_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = aes_dec_tv_template,
- .count = AES_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "ecb(anubis)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = anubis_enc_tv_template,
- .count = ANUBIS_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = anubis_dec_tv_template,
- .count = ANUBIS_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "ecb(arc4)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = arc4_enc_tv_template,
- .count = ARC4_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = arc4_dec_tv_template,
- .count = ARC4_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "ecb(blowfish)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = bf_enc_tv_template,
- .count = BF_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = bf_dec_tv_template,
- .count = BF_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "ecb(camellia)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = camellia_enc_tv_template,
- .count = CAMELLIA_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = camellia_dec_tv_template,
- .count = CAMELLIA_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "ecb(cast5)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = cast5_enc_tv_template,
- .count = CAST5_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = cast5_dec_tv_template,
- .count = CAST5_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "ecb(cast6)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = cast6_enc_tv_template,
- .count = CAST6_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = cast6_dec_tv_template,
- .count = CAST6_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "ecb(des)",
- .test = alg_test_skcipher,
- .fips_allowed = 1,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = des_enc_tv_template,
- .count = DES_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = des_dec_tv_template,
- .count = DES_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "ecb(des3_ede)",
- .test = alg_test_skcipher,
- .fips_allowed = 1,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = des3_ede_enc_tv_template,
- .count = DES3_EDE_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = des3_ede_dec_tv_template,
- .count = DES3_EDE_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "ecb(khazad)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = khazad_enc_tv_template,
- .count = KHAZAD_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = khazad_dec_tv_template,
- .count = KHAZAD_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "ecb(seed)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = seed_enc_tv_template,
- .count = SEED_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = seed_dec_tv_template,
- .count = SEED_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "ecb(serpent)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = serpent_enc_tv_template,
- .count = SERPENT_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = serpent_dec_tv_template,
- .count = SERPENT_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "ecb(tea)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = tea_enc_tv_template,
- .count = TEA_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = tea_dec_tv_template,
- .count = TEA_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "ecb(tnepres)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = tnepres_enc_tv_template,
- .count = TNEPRES_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = tnepres_dec_tv_template,
- .count = TNEPRES_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "ecb(twofish)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = tf_enc_tv_template,
- .count = TF_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = tf_dec_tv_template,
- .count = TF_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "ecb(xeta)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = xeta_enc_tv_template,
- .count = XETA_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = xeta_dec_tv_template,
- .count = XETA_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "ecb(xtea)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = xtea_enc_tv_template,
- .count = XTEA_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = xtea_dec_tv_template,
- .count = XTEA_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "gcm(aes)",
- .test = alg_test_aead,
- .fips_allowed = 1,
- .suite = {
- .aead = {
- .enc = {
- .vecs = aes_gcm_enc_tv_template,
- .count = AES_GCM_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = aes_gcm_dec_tv_template,
- .count = AES_GCM_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "hmac(md5)",
- .test = alg_test_hash,
- .suite = {
- .hash = {
- .vecs = hmac_md5_tv_template,
- .count = HMAC_MD5_TEST_VECTORS
- }
- }
- }, {
- .alg = "hmac(rmd128)",
- .test = alg_test_hash,
- .suite = {
- .hash = {
- .vecs = hmac_rmd128_tv_template,
- .count = HMAC_RMD128_TEST_VECTORS
- }
- }
- }, {
- .alg = "hmac(rmd160)",
- .test = alg_test_hash,
- .suite = {
- .hash = {
- .vecs = hmac_rmd160_tv_template,
- .count = HMAC_RMD160_TEST_VECTORS
- }
- }
- }, {
- .alg = "hmac(sha1)",
- .test = alg_test_hash,
- .fips_allowed = 1,
- .suite = {
- .hash = {
- .vecs = hmac_sha1_tv_template,
- .count = HMAC_SHA1_TEST_VECTORS
- }
- }
- }, {
- .alg = "hmac(sha224)",
- .test = alg_test_hash,
- .fips_allowed = 1,
- .suite = {
- .hash = {
- .vecs = hmac_sha224_tv_template,
- .count = HMAC_SHA224_TEST_VECTORS
- }
- }
- }, {
- .alg = "hmac(sha256)",
- .test = alg_test_hash,
- .fips_allowed = 1,
- .suite = {
- .hash = {
- .vecs = hmac_sha256_tv_template,
- .count = HMAC_SHA256_TEST_VECTORS
- }
- }
- }, {
- .alg = "hmac(sha384)",
- .test = alg_test_hash,
- .fips_allowed = 1,
- .suite = {
- .hash = {
- .vecs = hmac_sha384_tv_template,
- .count = HMAC_SHA384_TEST_VECTORS
- }
- }
- }, {
- .alg = "hmac(sha512)",
- .test = alg_test_hash,
- .fips_allowed = 1,
- .suite = {
- .hash = {
- .vecs = hmac_sha512_tv_template,
- .count = HMAC_SHA512_TEST_VECTORS
- }
- }
-#if !defined(CONFIG_CRYPTO_DEV_AES) && !defined(CONFIG_CRYPTO_ASYNC_AES)
- }, {
- .alg = "lrw(aes)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = aes_lrw_enc_tv_template,
- .count = AES_LRW_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = aes_lrw_dec_tv_template,
- .count = AES_LRW_DEC_TEST_VECTORS
- }
- }
- }
-#endif
- }, {
- .alg = "lzo",
- .test = alg_test_comp,
- .suite = {
- .comp = {
- .comp = {
- .vecs = lzo_comp_tv_template,
- .count = LZO_COMP_TEST_VECTORS
- },
- .decomp = {
- .vecs = lzo_decomp_tv_template,
- .count = LZO_DECOMP_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "md4",
- .test = alg_test_hash,
- .suite = {
- .hash = {
- .vecs = md4_tv_template,
- .count = MD4_TEST_VECTORS
- }
- }
- }, {
- .alg = "md5",
- .test = alg_test_hash,
- .suite = {
- .hash = {
- .vecs = md5_tv_template,
- .count = MD5_TEST_VECTORS
- }
- }
- }, {
- .alg = "michael_mic",
- .test = alg_test_hash,
- .suite = {
- .hash = {
- .vecs = michael_mic_tv_template,
- .count = MICHAEL_MIC_TEST_VECTORS
- }
- }
- }, {
- .alg = "pcbc(fcrypt)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = fcrypt_pcbc_enc_tv_template,
- .count = FCRYPT_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = fcrypt_pcbc_dec_tv_template,
- .count = FCRYPT_DEC_TEST_VECTORS
- }
- }
- }
-
- }, {
- .alg = "rfc3686(ctr(aes))",
- .test = alg_test_skcipher,
- .fips_allowed = 1,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = aes_ctr_rfc3686_enc_tv_template,
- .count = AES_CTR_3686_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = aes_ctr_rfc3686_dec_tv_template,
- .count = AES_CTR_3686_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "rfc4309(ccm(aes))",
- .test = alg_test_aead,
- .fips_allowed = 1,
- .suite = {
- .aead = {
- .enc = {
- .vecs = aes_ccm_rfc4309_enc_tv_template,
- .count = AES_CCM_4309_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = aes_ccm_rfc4309_dec_tv_template,
- .count = AES_CCM_4309_DEC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "rmd128",
- .test = alg_test_hash,
- .suite = {
- .hash = {
- .vecs = rmd128_tv_template,
- .count = RMD128_TEST_VECTORS
- }
- }
- }, {
- .alg = "rmd160",
- .test = alg_test_hash,
- .suite = {
- .hash = {
- .vecs = rmd160_tv_template,
- .count = RMD160_TEST_VECTORS
- }
- }
- }, {
- .alg = "rmd256",
- .test = alg_test_hash,
- .suite = {
- .hash = {
- .vecs = rmd256_tv_template,
- .count = RMD256_TEST_VECTORS
- }
- }
- }, {
- .alg = "rmd320",
- .test = alg_test_hash,
- .suite = {
- .hash = {
- .vecs = rmd320_tv_template,
- .count = RMD320_TEST_VECTORS
- }
- }
- }, {
- .alg = "salsa20",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = salsa20_stream_enc_tv_template,
- .count = SALSA20_STREAM_ENC_TEST_VECTORS
- }
- }
- }
- }, {
- .alg = "sha1",
- .test = alg_test_hash,
- .fips_allowed = 1,
- .suite = {
- .hash = {
- .vecs = sha1_tv_template,
- .count = SHA1_TEST_VECTORS
- }
- }
- }, {
- .alg = "sha224",
- .test = alg_test_hash,
- .fips_allowed = 1,
- .suite = {
- .hash = {
- .vecs = sha224_tv_template,
- .count = SHA224_TEST_VECTORS
- }
- }
- }, {
- .alg = "sha256",
- .test = alg_test_hash,
- .fips_allowed = 1,
- .suite = {
- .hash = {
- .vecs = sha256_tv_template,
- .count = SHA256_TEST_VECTORS
- }
- }
- }, {
- .alg = "sha384",
- .test = alg_test_hash,
- .fips_allowed = 1,
- .suite = {
- .hash = {
- .vecs = sha384_tv_template,
- .count = SHA384_TEST_VECTORS
- }
- }
- }, {
- .alg = "sha512",
- .test = alg_test_hash,
- .fips_allowed = 1,
- .suite = {
- .hash = {
- .vecs = sha512_tv_template,
- .count = SHA512_TEST_VECTORS
- }
- }
- }, {
- .alg = "tgr128",
- .test = alg_test_hash,
- .suite = {
- .hash = {
- .vecs = tgr128_tv_template,
- .count = TGR128_TEST_VECTORS
- }
- }
- }, {
- .alg = "tgr160",
- .test = alg_test_hash,
- .suite = {
- .hash = {
- .vecs = tgr160_tv_template,
- .count = TGR160_TEST_VECTORS
- }
- }
- }, {
- .alg = "tgr192",
- .test = alg_test_hash,
- .suite = {
- .hash = {
- .vecs = tgr192_tv_template,
- .count = TGR192_TEST_VECTORS
- }
- }
- }, {
- .alg = "vmac(aes)",
- .test = alg_test_hash,
- .suite = {
- .hash = {
- .vecs = aes_vmac128_tv_template,
- .count = VMAC_AES_TEST_VECTORS
- }
- }
- }, {
- .alg = "wp256",
- .test = alg_test_hash,
- .suite = {
- .hash = {
- .vecs = wp256_tv_template,
- .count = WP256_TEST_VECTORS
- }
- }
- }, {
- .alg = "wp384",
- .test = alg_test_hash,
- .suite = {
- .hash = {
- .vecs = wp384_tv_template,
- .count = WP384_TEST_VECTORS
- }
- }
- }, {
- .alg = "wp512",
- .test = alg_test_hash,
- .suite = {
- .hash = {
- .vecs = wp512_tv_template,
- .count = WP512_TEST_VECTORS
- }
- }
- }, {
- .alg = "xcbc(aes)",
- .test = alg_test_hash,
- .suite = {
- .hash = {
- .vecs = aes_xcbc128_tv_template,
- .count = XCBC_AES_TEST_VECTORS
- }
- }
-#if 0
- }, {
- .alg = "xts(aes)",
- .test = alg_test_skcipher,
- .suite = {
- .cipher = {
- .enc = {
- .vecs = aes_xts_enc_tv_template,
- .count = AES_XTS_ENC_TEST_VECTORS
- },
- .dec = {
- .vecs = aes_xts_dec_tv_template,
- .count = AES_XTS_DEC_TEST_VECTORS
- }
- }
- }
-#endif
- }, {
- .alg = "zlib",
- .test = alg_test_pcomp,
- .suite = {
- .pcomp = {
- .comp = {
- .vecs = zlib_comp_tv_template,
- .count = ZLIB_COMP_TEST_VECTORS
- },
- .decomp = {
- .vecs = zlib_decomp_tv_template,
- .count = ZLIB_DECOMP_TEST_VECTORS
- }
- }
- }
- }
-};
-
-static int alg_find_test(const char *alg)
-{
- int start = 0;
- int end = ARRAY_SIZE(alg_test_descs);
-
- while (start < end) {
- int i = (start + end) / 2;
- int diff = strcmp(alg_test_descs[i].alg, alg);
-
- if (diff > 0) {
- end = i;
- continue;
- }
-
- if (diff < 0) {
- start = i + 1;
- continue;
- }
-
- return i;
- }
-
- return -1;
-}
-
-static int ifx_alg_test(const char *driver, const char *alg, u32 type, u32 mask)
-{
- int i;
- int j;
- int rc;
-
- if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
- char nalg[CRYPTO_MAX_ALG_NAME];
-
- if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
- sizeof(nalg))
- return -ENAMETOOLONG;
-
- i = alg_find_test(nalg);
- if (i < 0)
- goto notest;
-
- if (fips_enabled && !alg_test_descs[i].fips_allowed)
- goto non_fips_alg;
-
- rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
- goto test_done;
- }
-
- i = alg_find_test(alg);
- j = alg_find_test(driver);
- if (i < 0 && j < 0)
- goto notest;
-
- if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
- (j >= 0 && !alg_test_descs[j].fips_allowed)))
- goto non_fips_alg;
-
- rc = 0;
- if (i >= 0)
- rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
- type, mask);
- if (j >= 0)
- rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
- type, mask);
-
-test_done:
- if (fips_enabled && rc)
- panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
-
- if (fips_enabled && !rc)
- printk(KERN_INFO "alg: self-tests for %s (%s) passed\n",
- driver, alg);
-
- return rc;
-
-notest:
- printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
- return 0;
-non_fips_alg:
- return -EINVAL;
-}
-EXPORT_SYMBOL_GPL(ifx_alg_test);
-
-/* Modified speed test for async block cipher mode*/
-
-static int ifx_alg_speed_test(const char *driver, const char *alg,
- unsigned int sec,
- struct cipher_speed_template *template,
- unsigned int tcount, u8 *keysize)
-{
- int i;
- int j;
- int err;
- int type = 0, mask = 0;
- struct crypto_ablkcipher *tfm;
-
- i = alg_find_test(alg);
- j = alg_find_test(driver);
-
- if (i < 0 && j < 0)
- goto notest;
-
- if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
- (j >= 0 && !alg_test_descs[j].fips_allowed)))
- goto non_fips_alg;
-
- tfm = crypto_alloc_ablkcipher(driver, type, mask);
-
- if (IS_ERR(tfm)) {
- printk(KERN_ERR "alg: skcipher: Failed to load transform for "
- "%s: %ld\n", driver, PTR_ERR(tfm));
- return PTR_ERR(tfm);
- }
- err = test_skcipher_speed(tfm, ENCRYPT, template,
- tcount, sec, keysize);
- if (err)
- goto test_done;
-
- err = test_skcipher_speed(tfm, DECRYPT, template,
- tcount, sec, keysize);
- if (!err)
- goto test_done;
-
-notest:
- return 0;
-non_fips_alg:
- return -EINVAL;
-
-test_done:
- if (fips_enabled && err)
- panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
-
- if (fips_enabled && !err)
- printk(KERN_INFO "alg: self-tests for %s (%s) passed\n",
- driver, alg);
-
- crypto_free_ablkcipher(tfm);
- return err;
-}
-EXPORT_SYMBOL_GPL(ifx_alg_speed_test);
-
-
-static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc,
- struct scatterlist *sg, int blen, int sec)
-{
- unsigned long start, end;
- int bcount;
- int ret;
-
- for (start = jiffies, end = start + sec * HZ, bcount = 0;
- time_before(jiffies, end); bcount++) {
- if (enc)
- ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
- else
- ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
-
- if (ret)
- return ret;
- }
-
- printk("%d operations in %d seconds (%ld bytes)\n",
- bcount, sec, (long)bcount * blen);
- return 0;
-}
-
-static int test_cipher_cycles(struct blkcipher_desc *desc, int enc,
- struct scatterlist *sg, int blen)
-{
- unsigned long cycles = 0;
- unsigned long start, end;
- int ret = 0;
- int i;
-
- local_bh_disable();
- local_irq_disable();
-
- /* Warm-up run. */
- for (i = 0; i < 4; i++) {
- if (enc)
- ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
- else
- ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
-
- if (ret)
- goto out;
- }
-
- /* The real thing. */
- for (i = 0; i < 8; i++) {
- /* Original code to get cycles, does not work with MIPS
- * cycles_t start, end;
- * start = get_cycles();
- */
-
- start = read_c0_count(); // LQ modified tcrypt
-
- if (enc)
- ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
- else
- ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
-
- /* Original code to get cycles, does not work with MIPS
- * end = get_cycles();
- */
-
- end = read_c0_count(); //LQ modified tcrypt
-
- if (ret)
- goto out;
-
- cycles += end - start;
- }
-
-out:
- local_irq_enable();
- local_bh_enable();
-
- if (ret == 0)
- printk("1 operation in %lu cycles (%d bytes)\n",
- (cycles + 4) / 8, blen);
-
- return ret;
-}
-
-static u32 block_sizes[] = { 16, 64, 256, 1024, 8192, 0 };
-
-static void test_cipher_speed(const char *algo, int enc, unsigned int sec,
- struct cipher_speed_template *template,
- unsigned int tcount, u8 *keysize)
-{
- unsigned int ret, i, j, iv_len;
- const char *key, iv[128];
- struct crypto_blkcipher *tfm;
- struct blkcipher_desc desc;
- const char *e;
- u32 *b_size;
-
- if (enc == ENCRYPT)
- e = "encryption";
- else
- e = "decryption";
-
- printk("\n ******* testing speed of %s %s ******* \n", algo, e);
-
- tfm = crypto_alloc_blkcipher(algo, 0, CRYPTO_ALG_ASYNC);
-
- if (IS_ERR(tfm)) {
- printk("failed to load transform for %s: %ld\n", algo,
- PTR_ERR(tfm));
- return;
- }
- desc.tfm = tfm;
- desc.flags = 0;
-
- i = 0;
- do {
-
- b_size = block_sizes;
- do {
- struct scatterlist sg[TVMEMSIZE];
-
- if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
- printk("template (%u) too big for "
- "tvmem (%lu)\n", *keysize + *b_size,
- TVMEMSIZE * PAGE_SIZE);
- goto out;
- }
-
- printk("test %u (%d bit key, %d byte blocks): ", i,
- *keysize * 8, *b_size);
-
- memset(tvmem[0], 0xff, PAGE_SIZE);
-
- /* set key, plain text and IV */
- key = tvmem[0];
- for (j = 0; j < tcount; j++) {
- if (template[j].klen == *keysize) {
- key = template[j].key;
- break;
- }
- }
-
- ret = crypto_blkcipher_setkey(tfm, key, *keysize);
- if (ret) {
- printk("setkey() failed flags=%x\n",
- crypto_blkcipher_get_flags(tfm));
- goto out;
- }
-
- sg_init_table(sg, TVMEMSIZE);
- sg_set_buf(sg, tvmem[0] + *keysize,
- PAGE_SIZE - *keysize);
- for (j = 1; j < TVMEMSIZE; j++) {
- sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
- memset (tvmem[j], 0xff, PAGE_SIZE);
- }
-
- iv_len = crypto_blkcipher_ivsize(tfm);
- if (iv_len) {
- memset(&iv, 0xff, iv_len);
- crypto_blkcipher_set_iv(tfm, iv, iv_len);
- }
-
- if (sec)
- ret = test_cipher_jiffies(&desc, enc, sg,
- *b_size, sec);
- else
- ret = test_cipher_cycles(&desc, enc, sg,
- *b_size);
-
- if (ret) {
- printk("%s() failed flags=%x\n", e, desc.flags);
- break;
- }
- b_size++;
- i++;
- } while (*b_size);
- keysize++;
- } while (*keysize);
-
-out:
- crypto_free_blkcipher(tfm);
-}
-
-static int test_hash_jiffies_digest(struct hash_desc *desc,
- struct scatterlist *sg, int blen,
- char *out, int sec)
-{
- unsigned long start, end;
- int bcount;
- int ret;
-
- for (start = jiffies, end = start + sec * HZ, bcount = 0;
- time_before(jiffies, end); bcount++) {
- ret = crypto_hash_digest(desc, sg, blen, out);
- if (ret)
- return ret;
- }
-
- printk("%6u opers/sec, %9lu bytes/sec\n",
- bcount / sec, ((long)bcount * blen) / sec);
-
- return 0;
-}
-
-static int test_hash_jiffies(struct hash_desc *desc, struct scatterlist *sg,
- int blen, int plen, char *out, int sec)
-{
- unsigned long start, end;
- int bcount, pcount;
- int ret;
-
- if (plen == blen)
- return test_hash_jiffies_digest(desc, sg, blen, out, sec);
-
- for (start = jiffies, end = start + sec * HZ, bcount = 0;
- time_before(jiffies, end); bcount++) {
- ret = crypto_hash_init(desc);
- if (ret)
- return ret;
- for (pcount = 0; pcount < blen; pcount += plen) {
- ret = crypto_hash_update(desc, sg, plen);
- if (ret)
- return ret;
- }
- /* we assume there is enough space in 'out' for the result */
- ret = crypto_hash_final(desc, out);
- if (ret)
- return ret;
- }
-
- printk("%6u opers/sec, %9lu bytes/sec\n",
- bcount / sec, ((long)bcount * blen) / sec);
-
- return 0;
-}
-
-static int test_hash_cycles_digest(struct hash_desc *desc,
- struct scatterlist *sg, int blen, char *out)
-{
- unsigned long cycles = 0;
- unsigned long start, end;
- int i;
- int ret;
-
- local_bh_disable();
- local_irq_disable();
-
- /* Warm-up run. */
- for (i = 0; i < 4; i++) {
- ret = crypto_hash_digest(desc, sg, blen, out);
- if (ret)
- goto out;
- }
-
- /* The real thing. */
- for (i = 0; i < 8; i++) {
-
- /* Original code to get cycles, does not work with MIPS
- * cycles_t start, end;
- * start = get_cycles();
- */
-
- start = read_c0_count(); // LQ modified tcrypt
-
- ret = crypto_hash_digest(desc, sg, blen, out);
- if (ret)
- goto out;
-
- /* Original code to get cycles, does not work with MIPS
- * end = get_cycles();
- */
-
- end = read_c0_count(); // LQ modified tcrypt
-
- cycles += end - start;
- }
-
-out:
- local_irq_enable();
- local_bh_enable();
-
- if (ret)
- return ret;
-
- printk("%6lu cycles/operation, %4lu cycles/byte\n",
- cycles / 8, cycles / (8 * blen));
-
- return 0;
-}
-
-static int test_hash_cycles(struct hash_desc *desc, struct scatterlist *sg,
- int blen, int plen, char *out)
-{
- unsigned long cycles = 0;
- unsigned long start, end;
- int i, pcount;
- int ret;
-
- if (plen == blen)
- return test_hash_cycles_digest(desc, sg, blen, out);
-
- local_bh_disable();
- local_irq_disable();
-
- /* Warm-up run. */
- for (i = 0; i < 4; i++) {
- ret = crypto_hash_init(desc);
- if (ret)
- goto out;
- for (pcount = 0; pcount < blen; pcount += plen) {
- ret = crypto_hash_update(desc, sg, plen);
- if (ret)
- goto out;
- }
- ret = crypto_hash_final(desc, out);
- if (ret)
- goto out;
- }
-
- /* The real thing. */
- for (i = 0; i < 8; i++) {
-
- /* Original code for getting cycles, not working for MIPS
- * cycle_t start, end;
- * end = get_cycles();
- */
-
- start = read_c0_count(); // LQ modified tcrypt
-
- ret = crypto_hash_init(desc);
- if (ret)
- goto out;
- for (pcount = 0; pcount < blen; pcount += plen) {
- ret = crypto_hash_update(desc, sg, plen);
- if (ret)
- goto out;
- }
- ret = crypto_hash_final(desc, out);
- if (ret)
- goto out;
-
- /* Original code for getting cycles, not working for MIPS
- * end = get_cycles();
- */
-
- end = read_c0_count(); // LQ modified tcrypt
-
- cycles += end - start;
- }
-
-out:
- local_irq_enable();
- local_bh_enable();
-
- if (ret)
- return ret;
-
- printk("%6lu cycles/operation, %4lu cycles/byte\n",
- cycles / 8, cycles / (8 * blen));
-
- return 0;
-}
-
-static void test_hash_speed(const char *algo, unsigned int sec,
- struct hash_speed *speed)
-{
- struct scatterlist sg[TVMEMSIZE];
- struct crypto_hash *tfm;
- struct hash_desc desc;
- static char output[1024];
- int i;
- int ret;
-
- printk(KERN_INFO "\ntesting speed of %s\n", algo);
-
- tfm = crypto_alloc_hash(algo, 0, CRYPTO_ALG_ASYNC);
-
- if (IS_ERR(tfm)) {
- printk(KERN_ERR "failed to load transform for %s: %ld\n", algo,
- PTR_ERR(tfm));
- return;
- }
-
- desc.tfm = tfm;
- desc.flags = 0;
-
- if (crypto_hash_digestsize(tfm) > sizeof(output)) {
- printk(KERN_ERR "digestsize(%u) > outputbuffer(%zu)\n",
- crypto_hash_digestsize(tfm), sizeof(output));
- goto out;
- }
-
- sg_init_table(sg, TVMEMSIZE);
- for (i = 0; i < TVMEMSIZE; i++) {
- sg_set_buf(sg + i, tvmem[i], PAGE_SIZE);
- memset(tvmem[i], 0xff, PAGE_SIZE);
- }
-
- for (i = 0; speed[i].blen != 0; i++) {
- if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
- printk(KERN_ERR
- "template (%u) too big for tvmem (%lu)\n",
- speed[i].blen, TVMEMSIZE * PAGE_SIZE);
- goto out;
- }
-
- printk(KERN_INFO "test%3u "
- "(%5u byte blocks,%5u bytes per update,%4u updates): ",
- i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
-
- if (sec)
- ret = test_hash_jiffies(&desc, sg, speed[i].blen,
- speed[i].plen, output, sec);
- else
- ret = test_hash_cycles(&desc, sg, speed[i].blen,
- speed[i].plen, output);
-
- if (ret) {
- printk(KERN_ERR "hashing failed ret=%d\n", ret);
- break;
- }
- }
-
-out:
- crypto_free_hash(tfm);
-}
-
-
-static void test_available(void)
-{
- char **name = check;
-
- while (*name) {
- printk("alg %s ", *name);
- printk(crypto_has_alg(*name, 0, 0) ?
- "found\n" : "not found\n");
- name++;
- }
-}
-
-static inline int tcrypt_test(const char *alg)
-{
- int ret;
-
- printk("Running test %s\n", alg);
- ret = ifx_alg_test(alg, alg, 0, 0);
- /* non-fips algs return -EINVAL in fips mode */
- if (fips_enabled && ret == -EINVAL)
- ret = 0;
- return ret;
-}
-
-static inline int tcrypt_speedtest(const char *alg,
- struct cipher_speed_template *template,
- unsigned int tcount, u8 *keysize)
-{
- int ret;
-
- printk("[****** Running speedtest %s *******]\n", alg);
- ret = ifx_alg_speed_test(alg, alg, sec, template, tcount, keysize);
- if (fips_enabled && ret == -EINVAL)
- ret = 0;
- return ret;
-}
-
-
-static int do_test(int m)
-{
- int i;
- int ret = 0;
-
- switch (m) {
- case 0:
- for (i = 1; i < 200; i++)
- ret += do_test(i);
- break;
-
- case 1:
- ret += tcrypt_test("md5");
- break;
-
- case 2:
- ret += tcrypt_test("sha1");
- break;
-
- case 3:
- ret += tcrypt_test("ecb(des)");
- ret += tcrypt_test("cbc(des)");
- break;
-
- case 4:
- ret += tcrypt_test("ecb(des3_ede)");
- ret += tcrypt_test("cbc(des3_ede)");
- break;
-
- case 5:
- ret += tcrypt_test("md4");
- break;
-
- case 6:
- ret += tcrypt_test("sha256");
- break;
-
- case 7:
- ret += tcrypt_test("ecb(blowfish)");
- ret += tcrypt_test("cbc(blowfish)");
- break;
-
- case 8:
- ret += tcrypt_test("ecb(twofish)");
- ret += tcrypt_test("cbc(twofish)");
- break;
-
- case 9:
- ret += tcrypt_test("ecb(serpent)");
- break;
-
- case 10:
- ret += tcrypt_test("ecb(aes)");
- ret += tcrypt_test("cbc(aes)");
- // ret += tcrypt_test("lrw(aes)");
- // ret += tcrypt_test("xts(aes)");
- ret += tcrypt_test("ctr(aes)");
- ret += tcrypt_test("rfc3686(ctr(aes))");
- break;
-
- case 11:
- ret += tcrypt_test("sha384");
- break;
-
- case 12:
- ret += tcrypt_test("sha512");
- break;
-
- case 13:
- ret += tcrypt_test("deflate");
- break;
-
- case 14:
- ret += tcrypt_test("ecb(cast5)");
- break;
-
- case 15:
- ret += tcrypt_test("ecb(cast6)");
- break;
-
- case 16:
- ret += tcrypt_test("ecb(arc4)");
- break;
-
- case 17:
- ret += tcrypt_test("michael_mic");
- break;
-
- case 18:
- ret += tcrypt_test("crc32c");
- break;
-
- case 19:
- ret += tcrypt_test("ecb(tea)");
- break;
-
- case 20:
- ret += tcrypt_test("ecb(xtea)");
- break;
-
- case 21:
- ret += tcrypt_test("ecb(khazad)");
- break;
-
- case 22:
- ret += tcrypt_test("wp512");
- break;
-
- case 23:
- ret += tcrypt_test("wp384");
- break;
-
- case 24:
- ret += tcrypt_test("wp256");
- break;
-
- case 25:
- ret += tcrypt_test("ecb(tnepres)");
- break;
-
- case 26:
- ret += tcrypt_test("ecb(anubis)");
- ret += tcrypt_test("cbc(anubis)");
- break;
-
- case 27:
- ret += tcrypt_test("tgr192");
- break;
-
- case 28:
-
- ret += tcrypt_test("tgr160");
- break;
-
- case 29:
- ret += tcrypt_test("tgr128");
- break;
-
- case 30:
- ret += tcrypt_test("ecb(xeta)");
- break;
-
- case 31:
- ret += tcrypt_test("pcbc(fcrypt)");
- break;
-
- case 32:
- ret += tcrypt_test("ecb(camellia)");
- ret += tcrypt_test("cbc(camellia)");
- break;
- case 33:
- ret += tcrypt_test("sha224");
- break;
-
- case 34:
- ret += tcrypt_test("salsa20");
- break;
-
- case 35:
- ret += tcrypt_test("gcm(aes)");
- break;
-
- case 36:
- ret += tcrypt_test("lzo");
- break;
-
- case 37:
- ret += tcrypt_test("ccm(aes)");
- break;
-
- case 38:
- ret += tcrypt_test("cts(cbc(aes))");
- break;
-
- case 39:
- ret += tcrypt_test("rmd128");
- break;
-
- case 40:
- ret += tcrypt_test("rmd160");
- break;
-
- case 41:
- ret += tcrypt_test("rmd256");
- break;
-
- case 42:
- ret += tcrypt_test("rmd320");
- break;
-
- case 43:
- ret += tcrypt_test("ecb(seed)");
- break;
-
- case 44:
- ret += tcrypt_test("zlib");
- break;
-
- case 45:
- ret += tcrypt_test("rfc4309(ccm(aes))");
- break;
-
- case 100:
- ret += tcrypt_test("hmac(md5)");
- break;
-
- case 101:
- ret += tcrypt_test("hmac(sha1)");
- break;
-
- case 102:
- ret += tcrypt_test("hmac(sha256)");
- break;
-
- case 103:
- ret += tcrypt_test("hmac(sha384)");
- break;
-
- case 104:
- ret += tcrypt_test("hmac(sha512)");
- break;
-
- case 105:
- ret += tcrypt_test("hmac(sha224)");
- break;
-
- case 106:
- ret += tcrypt_test("xcbc(aes)");
- break;
-
- case 107:
- ret += tcrypt_test("hmac(rmd128)");
- break;
-
- case 108:
- ret += tcrypt_test("hmac(rmd160)");
- break;
-
- case 109:
- ret += tcrypt_test("vmac(aes)");
- break;
-
- case 150:
- ret += tcrypt_test("ansi_cprng");
- break;
-
- case 200:
- test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
- speed_template_16_24_32);
- test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
- speed_template_16_24_32);
- test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
- speed_template_16_24_32);
- test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
- speed_template_16_24_32);
-#if !defined(CONFIG_CRYPTO_DEV_AES) && !defined(CONFIG_CRYPTO_ASYNC_AES)
- test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
- speed_template_32_40_48);
- test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
- speed_template_32_40_48);
- test_cipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
- speed_template_32_48_64);
- test_cipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
- speed_template_32_48_64);
-#endif
- break;
-
- case 201:
- test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
- des3_speed_template, DES3_SPEED_VECTORS,
- speed_template_24);
- test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
- des3_speed_template, DES3_SPEED_VECTORS,
- speed_template_24);
- test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
- des3_speed_template, DES3_SPEED_VECTORS,
- speed_template_24);
- test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
- des3_speed_template, DES3_SPEED_VECTORS,
- speed_template_24);
- break;
-
- case 202:
- test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
- speed_template_16_24_32);
- test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
- speed_template_16_24_32);
- test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
- speed_template_16_24_32);
- test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
- speed_template_16_24_32);
- break;
-
- case 203:
- test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
- speed_template_8_32);
- test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
- speed_template_8_32);
- test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
- speed_template_8_32);
- test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
- speed_template_8_32);
- break;
-
- case 204:
- test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
- speed_template_8);
- test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
- speed_template_8);
- test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
- speed_template_8);
- test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
- speed_template_8);
- break;
-
- case 205:
- test_cipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
- speed_template_16_24_32);
- test_cipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
- speed_template_16_24_32);
- test_cipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
- speed_template_16_24_32);
- test_cipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
- speed_template_16_24_32);
- break;
-
- case 206:
- test_cipher_speed("salsa20", ENCRYPT, sec, NULL, 0,
- speed_template_16_32);
- break;
-
- case 300:
- /* fall through */
-
- case 301:
- test_hash_speed("md4", sec, generic_hash_speed_template);
- if (mode > 300 && mode < 400) break;
-
- case 302:
- test_hash_speed("md5", sec, generic_hash_speed_template);
- if (mode > 300 && mode < 400) break;
-
- case 303:
- test_hash_speed("sha1", sec, generic_hash_speed_template);
- if (mode > 300 && mode < 400) break;
-
- case 304:
- test_hash_speed("sha256", sec, generic_hash_speed_template);
- if (mode > 300 && mode < 400) break;
-
- case 305:
- test_hash_speed("sha384", sec, generic_hash_speed_template);
- if (mode > 300 && mode < 400) break;
-
- case 306:
- test_hash_speed("sha512", sec, generic_hash_speed_template);
- if (mode > 300 && mode < 400) break;
-
- case 307:
- test_hash_speed("wp256", sec, generic_hash_speed_template);
- if (mode > 300 && mode < 400) break;
-
- case 308:
- test_hash_speed("wp384", sec, generic_hash_speed_template);
- if (mode > 300 && mode < 400) break;
-
- case 309:
- test_hash_speed("wp512", sec, generic_hash_speed_template);
- if (mode > 300 && mode < 400) break;
-
- case 310:
- test_hash_speed("tgr128", sec, generic_hash_speed_template);
- if (mode > 300 && mode < 400) break;
-
- case 311:
- test_hash_speed("tgr160", sec, generic_hash_speed_template);
- if (mode > 300 && mode < 400) break;
-
- case 312:
- test_hash_speed("tgr192", sec, generic_hash_speed_template);
- if (mode > 300 && mode < 400) break;
-
- case 313:
- test_hash_speed("sha224", sec, generic_hash_speed_template);
- if (mode > 300 && mode < 400) break;
-
- case 314:
- test_hash_speed("rmd128", sec, generic_hash_speed_template);
- if (mode > 300 && mode < 400) break;
-
- case 315:
- test_hash_speed("rmd160", sec, generic_hash_speed_template);
- if (mode > 300 && mode < 400) break;
-
- case 316:
- test_hash_speed("rmd256", sec, generic_hash_speed_template);
- if (mode > 300 && mode < 400) break;
-
- case 317:
- test_hash_speed("rmd320", sec, generic_hash_speed_template);
- if (mode > 300 && mode < 400) break;
-
- case 399:
- break;
-
- /* Modified speed test for async block cipher mode */
- case 400:
- tcrypt_speedtest("ecb(aes)", NULL, 0,
- speed_template_16_24_32);
- tcrypt_speedtest("cbc(aes)", NULL, 0,
- speed_template_16_24_32);
- break;
-
- case 401:
- tcrypt_speedtest("ecb(des3_ede)", des3_speed_template,
- DES3_SPEED_VECTORS,speed_template_24);
- tcrypt_speedtest("cbc(des3_ede)", des3_speed_template,
- DES3_SPEED_VECTORS,speed_template_24);
- break;
-
- case 404:
- tcrypt_speedtest("ecb(des)", NULL, 0,
- speed_template_8);
- tcrypt_speedtest("cbc(des)", NULL, 0,
- speed_template_8);
- break;
-
- case 1000:
- test_available();
- break;
- }
-
- return ret;
-}
-#if !defined(CONFIG_CRYPTO_DEV_DEU)
-static int do_alg_test(const char *alg, u32 type, u32 mask)
-{
- return crypto_has_alg(alg, type, mask ?: CRYPTO_ALG_TYPE_MASK) ?
- 0 : -ENOENT;
-}
-#endif
-
-static int __init tcrypt_mod_init(void)
-{
- int err = -ENOMEM;
- int i;
-
- printk("Starting Lantiq DEU Crypto TESTS . . . . . . .\n");
-
- for (i = 0; i < TVMEMSIZE; i++) {
- tvmem[i] = (void *)__get_free_page(GFP_KERNEL);
- if (!tvmem[i])
- goto err_free_tv;
- }
-
-#if defined(CONFIG_CRYPTO_DEV_DEU)
-#if defined(CONFIG_CRYPTO_DEV_MD5)
- mode = 1; // test md5 only
- err = do_test(mode);
- if (err)
- goto md5_err;
-
-md5_err:
- if (err) {
- printk(KERN_ERR "md5: one or more tests failed!\n");
- goto err_free_tv;
- }
-#endif
-#if defined(CONFIG_CRYPTO_DEV_SHA1)
- mode = 2; // test sha1 only
- err = do_test(mode);
- if (err)
- goto sha1_err;
-
-sha1_err:
- if (err) {
- printk(KERN_ERR "sha1: one or more tests failed!\n");
- goto err_free_tv;
- }
-#endif
-#if defined (CONFIG_CRYPTO_DEV_DES) || defined (CONFIG_CRYPTO_ASYNC_DES)
- mode = 3; // test des only
- err = do_test(mode);
- if (err)
- goto des_err;
-
- mode = 4; // test des3 only
- err = do_test(mode);
- if (err)
- goto des_err;
-
-des_err:
- if (err) {
- printk(KERN_ERR "des3: one or more tests failed!\n");
- goto err_free_tv;
- }
-#endif
-#if defined (CONFIG_CRYPTO_ASYNC_AES) || defined (CONFIG_CRYPTO_DEV_AES)
- mode = 10; // test aes only
- err = do_test(mode);
- if (err)
- goto aes_err;
-
-aes_err:
- if (err) {
- printk(KERN_ERR "aes: one or more tests failed!\n");
- goto err_free_tv;
- }
-#endif
-#if defined(CONFIG_CRYPTO_DEV_ARC4)
- mode = 16;
- err = do_test(mode);
-
- if (err) {
- printk(KERN_ERR "arc4: one or more tests failed!\n");
- goto err_free_tv;
- }
-#endif
-#if defined (CONFIG_CRYPTO_DEV_MD5_HMAC)
- mode = 100;
- err = do_test(mode);
-
- if (err) {
- printk(KERN_ERR "tcrypt: one or more tests failed!\n");
- goto err_free_tv;
- }
-#endif
-#if defined (CONFIG_CRYPTO_DEV_SHA1_HMAC)
- mode = 101;
- err = do_test(mode);
-
- if (err) {
- printk(KERN_ERR "tcrypt: one or more tests failed!\n");
- goto err_free_tv;
- }
-#endif
-
-/* Start Speed tests test modes */
-#if defined(CONFIG_CRYPTO_DEV_SPEED_TEST)
-#if defined(CONFIG_CRYPTO_DEV_AES)
- mode = 200;
- err = do_test(mode);
- if (err)
- goto speed_err;
-#endif
-#if defined (CONFIG_CRYPTO_DEV_DES)
- mode = 201;
- err = do_test(mode);
- if (err)
- goto speed_err;
-
- mode = 204;
- err = do_test(mode);
- if (err)
- goto speed_err;
-#endif
-#if defined (CONFIG_CRYPTO_DEV_MD5)
- mode = 302;
- err = do_test(mode);
- if (err)
- goto speed_err;
-#endif
-#if defined (CONFIG_CRYPTO_DEV_SHA1)
- mode = 303;
- err = do_test(mode);
- if (err)
- goto speed_err;
-#endif
- printk("Speed tests finished successfully\n");
- goto fips_check;
-
-speed_err:
- printk(KERN_ERR "tcrypt: one or more tests failed!\n");
- goto err_free_tv;
-#endif /* CONFIG_CRYPTO_DEV_SPEED_TEST */
-
-#else
- if (alg)
- err = do_alg_test(alg, type, mask);
- else
- err = do_test(mode);
-
- if (err) {
- printk(KERN_ERR "tcrypt: one or more tests failed!\n");
- goto err_free_tv;
- }
-#endif /* CONFIG_CRYPTO_DEV_DEU */
-
-fips_check:
- /* We intentionaly return -EAGAIN to prevent keeping the module,
- * unless we're running in fips mode. It does all its work from
- * init() and doesn't offer any runtime functionality, but in
- * the fips case, checking for a successful load is helpful.
- * => we don't need it in the memory, do we?
- * -- mludvig
- */
- if (!fips_enabled)
- err = -EAGAIN;
-
-err_free_tv:
- for (i = 0; i < TVMEMSIZE && tvmem[i]; i++ ){
- printk("Freeing page: %d\n", i);
- free_page((unsigned long)tvmem[i]);
- }
-
- printk("Finished DEU testing . . . . . .\n");
- return err;
-}
-
-/*
- * If an init function is provided, an exit function must also be provided
- * to allow module unload.
- */
-static void __exit tcrypt_mod_fini(void) {}
-
-
-module_init(tcrypt_mod_init);
-module_exit(tcrypt_mod_fini);
-
-module_param(alg, charp, 0);
-module_param(type, uint, 0);
-module_param(mask, uint, 0);
-module_param(mode, int, 0);
-module_param(sec, uint, 0);
-MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
- "(defaults to zero which uses CPU cycles instead)");
-
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("Quick & dirty crypto testing module");
-MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");
-
u3?Jv#h}PI8Xl4g; dP+8֍LҺ$K&R8x+<Ơp͋N'~<יT)KgJ"|5Ɩ!r))[:zΟo^UQ*͕A;-qtԘgDBa?yEQewfGw@g4^*5ľAl,w>X@1l7cBםHuxrx<NN/kRcuMBEF4~}4Iw%-L("D U+Y/]3}}C|;v+Tbm7QA:QN5 |"ҝ)޳HrM̳Q:>+b폇͛A&17ɚp8*žW۱xtCܪ^0_sӡ&C\;*lLaX^n(|9+lH( 1!)PʓSG>f&D=o=~?7H?Zm>xy(_n U(Kbf8>]qRix@+M_Zi|sQloxōo5vqŗ(n675D9w׺}׺?W\ v֖H1q sJqf9#P3`zvxWBP(;V.kzN>rG 9V(Ry}<(rܿnn; [dD.. }-A^,/*+ȳ7z዗ )N Fw "B{7T)9NI%뽗?=`AQwaOLsp<4&ci{2;)xk"1rq^MNu~KfOFxPMe#a}6; IEՍl3CNc C֧-R7kʥxyxqyz d|g߿Ap%o.|.M$>@/cFREΊ耳6Fj ,ZDBcB6Z>e+ʆ"=<`@@sw7.IlNm(B[ 83.yEqD8EbjYd ‡akfɢG%s V $ 7n ~VW]w\:yz|9tR0TTU!Yr9.eZY'[Fg(yB("8RV}eJlC6ZDztoRU_k?O.j JF_H(d!u>{ȿ8sy5No>BhjO  FZ #/ g@53v;! - a5A|<|Z"Lq@7ռ{X|8|`q@Y;~GT[tQo ;3rpcXbO91!oMT! k>[5f6~f6f@$ L^*9hAi$I'Tz19l0C3`WJoL[YĸY{r2{7nNp(RP';,O?[aUAR*?G5T~utj q| ȇYKܙJ"LLuYC+`Df(|HHaA',X[kS`0NF&(G$peQg /ϙHR;VN?U2!d 9"4P,1 ~]BLj3搜e&HY,œN)z]a5j]֓GowHSacڜT>b96)眶M`k5|sθ=.)O>w L>h+U>kkhS$Bp8gEvzJl[2`prڀ ٖ#bᛘ!HI6:|3e;%-vC.S *&Aֻ`:%Rӕv~x" l!냃y$Ё^+mxjZ/˂aRq1[ыS%@ts1됤M]ĽH-^f{/e' m@˿4ag̫k\dph{'%`1jx̨`s?KNG WP;!8B9V[}Vp+@5X%חv əHX5-]s;x=tGL ! pQ]jfZb?*X#(# kD[΋c\BJe'_g166PG"$,J[怂/Ib$ PYUCߥD!YwTȶC3%477#ʉ#B.P"yhfNH%".!<^X6TU$z1&OH#+4AcVus\<&mlJ{co \c&`M 'æ7g4ġxWq A3ޢ^x zz-70 s]:&:CL^[Nૺp?wU 8̀)@ԥQ=hPRyˤ*Frͷԅ :2Pi`L`L YbzSo=( 9Ĥ~U=qH"tg``9B֥ S &-'`38OC>wd0ۛk c\f:WveNJ| @c[q&-0Ե;VwH3`!挄y)#eb&gg ՚f+R8sRX3no7tKP9XDz!6'dj׸}[f_{x25t /V A[{ѥԇP?hfQ\gMM-!{4^?Y3kRLv"qj#|Vye M=v;Š Y  ɹ(?ҒY"R4LN:=urxB i#˳sզW1ȯ4Lj~i; KG+CM &%ța֥git.r$DeAos39o%VŚЬ,-ok|& 6Fb@2}h rf#N#[n1i{ ٖ촬OЯ^ %a$`qP{}tYJ8V:q_?cs,Fd)3ڌD\e]$`LǰksJ{)g&[ zPz]eTٛUf^n?^HhV@eX~BuwL[oC& 6Ṋk&( ;kSWM57wNඹ-)"ElknjEnB$\͇Ty*圕2q~8'n@PYifv}P>];t$I3->4ܥ<Xb ~oo\xo@ Dܚu(̝4ĕd;\pք 9g=4Ӡaܗ_)48᳦dS\i̛B;,sM727LqU#@$$\x#Xoo6b;0Bڌ̋UôadNW-ggٙqr;ĔO-m̲eq'ْuT=VD[dڊڊ2|͔f˔ gʰeJ" tZ3V`%A]$2CV$dKx2_ YOŦ'QBsfyT$Zeh4DD' =qL1?l@USL=#*%Q23Uk9_%ՐKvoFvƃ:A|-|-c$)Ch٧Zݔ=Fڮ"mVƑhj\1 wHW Q{X*LLVʼnagڋkkd5]gWi[ܘ>'V0'7Ï 2G3m{4#f>)+!Kuͺ1ުeͤ:UA+'$ _A#?s) i;8G&O|–F[}Қ?r6e刟y}\ x2:&|${+!|,Ӓ˷'o&^ ; FZzy| OrZj${H/}~Ь׏ Sz~ⓜ}cP. Zg~Gnn߷r{ J.F<~RR?'́>=\]Ϯqi㩵IRF0iR}֜ iUVux"AG擶+pB3wvuwvGRr3=g[~{MBD6# czrWzr,X^pSǗғY|ѵ=x̐ndH̏1?I{ΊܨvZ(gw Ypc%6YHyef˦}Ze׽PnӱT&d6 6dzMJ lLH lLج&5p728X^1ucgM}28}H[5V^Wò8~B>M7 bH 7Ɉ.:#Jh1:}i'Wu9 H3j6R:w@ۯܯNuꅠ ڈ$Óחq -R7"huȃi]q^>q7y@1خ誸jGZe|ecl&3^4T<8%p4~w򲺐P8QTK9幫VBSg/< ݟ14&P K$>w'.jZȮm|/oE`3B@a2|%|Ҭ{w-?}zʾ#&vt=Or%Y {!=s$2.DD;",/Hp46lE>Qy?2/|3gb6jwn|e˦ _zYeӡM^zYZeB/{xUAoi_{zg ej,>$XdʠR{7M]b]p01ұNh4n|i$|udV0Ir_< JhԾgx~ ?VjZ)K NC,[8)P]yH *c{*C8Vq$A&'EduQo##ڝ!_>C7O~ZpܻQ^AXьnQ,MG&MS!:oόF+!vGOPMK:;;tWu&C0~/'f/bN|Jm6Ǫ8ȗi&gmeG5+ş||n&0>} Gf@#K$ʿV|HjQKcղcx:V}=nU?3GXEӉD;C߈7d.F+ѽ.GJ|-2jp"_l5*hhZlAkCah!kQ|NLH4JAXrSfGn9>7y7{q> 9D#a2IF !Btwp9r.?>@,9>\P6K>HC?$''p5M0IFyqOjIZS<^sH9 W>_g9ij%y,a DM}LD.6۳|rf_h 3qHg##4Џvc8S_*{4t5c:iu1l|\zЙ@i3`OP\\NA%-FraN bqVc!ɲ3K;ii>aɲ3͐f\!n8D7ʘ$i6( 32.A M'tfDWz2O>Ӈt㛣37~=#X(6^EF2RA.>&~N?ďFQ?3)#4S>FZg_'ywEj7Q#! ,_PI< Q'ňAeVDuAFJPTivN^%*oJ,!ڻYy_5d^k"e`wi4 C*FEPX|6͞cQg|h97|ufA6[/z|L8g?dHRZ*WK2LOZ~\E1bs,wOnz<'A7.XȅGְq2/Fbä1UK;J1~9yTf9xS6BF^!ݸCqu=qT7t =Z_W.Xk_5jn 0Fd!JV׉)Td9s.rs*%֧5&!g?/*ojB%5NԄrOojɛ% }iM 5c[: ےxfƶ4<6%2΍94uZf_L _#[? G&T'{q̗$pX<ߍsLY3Vsք~V9?f Šb}gY][ʝ 6Kx$EZTZgߖα:7޸yd)dd!,. tOf;[E.l!g2, {ûB>[ʹwûO_5ZwT9sCR<'IU^*-{̿ryBx7Jvyy5Y\a\m17&0k?c &eB~OwN]%=z/ΎRY8(ԯc)Ro>EQ.}y*94U_ץT; MmD8L/H굄>Z}˴nW5.y[+f87lMU_N.Yac1۫\p^3'wZ|>idULuH&H.8f? v?y vm~ne7=[} ҉[  ^^P#ON//kA)V̔> 8;F*PyQ=7pQm^Q 9RshmTTZXhhUgUpOk~v5ޜ~%o/|%Xz2SNW; >+f~ $TYⓏ2Ll;z7߃hExS+.Nk0p\4Yp^]pD#po]YP?x~[\P+/SE_O,2S|PXe;Q8v?S$WN69握RCAx)TFAjja!Y*nQ(gu\S7\FHre:[D"^"M.#eH:Vlt>zkbz³ X**w'qE+jRCr%`s*6 Uu#Lпn\@!:*FNOğYy1=C<%6/7\_N_ˆr{cc΍ߟK ?!b(Y=T.3rf&AޥzwşdhY5q0Q=l3Z ;F~fo[>y"ݮ0~ƀTbqzOXNK4:s+oiFL_ owզ@◓}07%5ޕh|hei~;q弔.Tg}DPB,>trWoLeioc 6DrK044wB-PK/A:97 V|cWm7yhѝ Ӣ=#D`A)9v$vFg2]]0~O2 .?m3ٛ7Uȡd[XoB*G'2ɷF3ǠËT4 $q$b xNNU9FZP9|Oj#&eG rĜqs-%D9W coTxK v Wj"(e"|B@k4pY;Uv TJ@xj@- PE^/pB AǾm1|Ҧ}[,ˏ664{*fͷYsLp[t?y~qV?<8ܷb_&Y!\~be .QH-'S@!HM Ѿ&iȴ`0-!uaՋcqyQ9 0VchO'g/뵓a~S,#Q Pbaଣ uJG_g*3 g6* 17?5=ҌaHBK g7|Q,?ib(>Xt(.\*$HqF'k;ZKF3,t5 v/Pa@x;lENBVCd:p~>}ULgtH>פ_;rB/g{Sf&w}a#lOkQb.Iiq@W{\m{/ˊ^"3v}Py퍮1IR YjG.2#~' MW]er~;J%q&2&Z$m?zV? }!Q^oj'0?Οggq8;=ukamT9PSO³ui,gQ|Hmw'g4+ĽMUJip G\{sq~իc4xQ2kH>ؒ^Tz ȟE^}= §%YW}M^ߨ2[*!;=y}=k=c nH/˝ê|>Hlc8_Ѿy{P- vZO]䓭I^>W)lf^mWAae hC!GR ڐmqTP'[ N6lgOs֥Zv[N5%۩u6&}uđ`.*0\mډC*[#_ Nek -k }k A|[@PزaPطP](bx@[6D6HDh [hK^}Zp̀8Es??rǫ_^pcIE "QH:ꇻjmIVv*~ІDU[ Zپz8bI2>Lq-0b@B.i{QV.(}VqŪagQ<ђA ㈪&Sr$S)᛼S@p#F,tg)!< ǹ̂gwaA0탫}0whZnBóː, ]z0ÂNCvm`_=VmU+|.~P/)~ǁ1't0jl4FdRm8wumNC~|j1q_):Oa )|ua-M[0 e AƙѴENoLIPl k!^"~-~yaH =ovDuEj;Ngclg20uqvɶǷߞp۵sox#`̶gOz0#):ip. Cj`ȩ pMLEo 8ˊԣ2]X=(Q֮BF?8P]p苂\eL0W20sF qp35a;ia`]Vܒet{>A6 |R4?SLb )vXnJ &)b1_o<sx=S滝55z4 ׀`b_T y?O pN ov3zEu-(->.#GoƟ<1w<F.cߓ}TG/j}6Hy߱ir@26MVru'ئF!oTrYQ+Wھ4Ioؤ5㊥7$=@CzIi˾kDL?BS?'Q$IrvEVkܗ$ BJ:]ޜ\zӛ7ozg^\[c7oܼa[xx0ᄠ\Z$Z r2u˜U^įY!\4HKI#;v裶dionm)&?c1~$Oz@4f"V7/4-1=|5_.LOMvG5@ C$ox2]^jɘ_9Qݘ.1mMHlAٮT5=q/rJ׀rDjϔksݑocGI仒DeZ*ߌƿ ә,p 43j <=X}"w`i}?v{|'5, Y.v S|9Z}J,~q)ٔtf3O%"Qh>"ăJ3w=(WG?J5m{)f5B`oby FS Q6LUr8f1=ݕ; øvښ-ͭ)h/z/VϘ<>;y\jͪͪ&m I[mϖ-e6&6CTjW |o%QN-c3ٽn };8_@]I z._b;=?f{=Nq~C4Tf\K[))+;59nr|;'lʝ8eO5 K2QWdpY#طwK]>ง;:%lWO gm(d÷}pN]g(FNVҜǟ0&QS7Cu@O5몤xk[_˱v׻r23T}Cŵ_.O{ t"m^{CUpճÓ˃ =΁^xW,%wGJv~-ߟzEo@ =SvǾMUvRHl3N S%WJ8¿{O(3ur`CŝW1-Z54$C:xw0QgaZOAE%J6tp!`ۓ6[>`It;$X>DS=zD8z`wpLYfYCWkq2ðmVTD{e'cccbbQ**30 Yqf,z~cQ̂‚Si5F_Je`9) '7$vR>כC}!D7鷵GYS0mN UPږ`ԩpZ}Ö?mC@52jUu ƑOQj]qX3T#}HEJIHO+}fAh`Y^̣તIPp(?%+EjP`8Mp8 91R]PhXVV gI ZVI_|A'n ij3!û:]HFGU+ ߕ&5^?1HFQ9xɐ պt, 5xbi~$%r`ZOџxE6ВrJh%x-xܹ!ѩb2ӆRXHN q; p9"? g0)̏8Pn ?s`:R#t ૔8APNak.[V3d2S-~_o.> |.S ,3(zbK+}pdu:-=BԚϟ6 7l8n1cY#,ҎEV:#7l .rP9QUfEAQ%h{Ra?ut+ aj% 8ҽaȍVX:WhLʿ^PU`~T%kȒ -)^˲ǖײ(01ް\DcK6cЫ*]J,ZAq+ KGf'R5/g5 1L7κ>,Ȍ/_^M}Nbt.AHwUl|"lLIӧ$TiNN/~&#Hg_u`Qcybl6,U_(p=ScpƖ`AkhtU'[Zb*T+%X#yu)zt'6g[Gv4G#}ہ=]ZnmlM {V -Ziw1b[@hh-b!w ׼fહ+:㬸 }`.|RBWB̘NH;IF^X?`]^(`efDC F:5~oaWho];_֎ bARL|%K=y;66 "U헣 T7D6Ҭ&[Wf{piZK YS[`yb'y`K7/Rsi`.b#Ia +/rŅnA2%Cʹq䲓scu1$SV\dǸ{BgJhY3{fv/f2K]+yAzP bwMtâeZVb9IaK\gvx#aR7r(CuUԐ x^'#'!;`')Ei_BƯANbFT{;4q8O?k:4mU 7;Ҏ0OD** OT 3 ޿?6S|pɧvtbD)'68cZ>xiֺK:awOrxc}i %-֔>uɎNJ~ei=Yp]þ:0NTXt'f%N~pւW<#4< %0ݲM%3@Hmx^:J}4nZ<}Ssr161t%2=XBn͑Dϛt\Ԯ^x(cLPĽ2~-H_Yc6rvv4}]JZ"Ш f6r?%S,g*Gccڒڼetf|6j#\,&+ ߕG7ܜ\(iy 4>;([/ߡľóJUs vGX+)E΄cX, 3)HbmITDmfXףα^) ~8{9B ғ$Eŗӧ$R[Ar$_V̎7[]_$*a|:BwA6y+ʹgͱ7M0 {{C{sЂ]Z?WpYꄀ 絡xG3ڮ 1uc ]&{Z]sdw?QMh=RȮ(p+cmc#=b 36dNcLTs@MgӬ 奂'(39bfFkfۜFaWR]:sYM'4*lz6=CP꤇1ViKM/kP-0ʃYU1M7:Nk_<;>@bYZ$i:bL 6xOcBu6$^X1΃srĸSͰ0k$ILi" X4f%N;h@o S dX,}иb 8x- hz^ ?Y-tޏ64ԓsQکшd]~Q C7g!v #1Yu";8O8֘,OLY| Ъf-Vo%kcVHv6 Me^hڿi" FmsDn-W(s K_`n?s$wi=D x_;ۢ4 }SXS@ lK+zB4Ji *)7 )kr^߀K1T ʉ ?,C,˞q[~JS F!UaҜMBl8`r$hsV,cYkJ4c@E#b2[1O@FC:͂² Tlu ,lšei,6QW5!LH%1A}.=# iY3H/t2*g9N`j^bƒX˨L1;|(sfc,c0*&^+nȯ?|˲nS&cR"YIam:źD(aU||3o"1 }(NƈMY|'r B.B@FhZB g/?P9'/;\p'LhRƞ{.(=84|.+ydLjG7 C+d;؈tsCDKX.* E9b7]frCb9`yq^[;RpJ8V8tt!|l A,}:).&0Ivhu_L:- <*:ܼ9 Rbҹƌl%Ě.J{Pfȶ+Vn,D:qM?Zu:`|6kƨuƭc1Yi)Ya2(n)MmQغ=t0{#Z⁌79&,g`U(y4* 4z=G33gĪ 5pZޕc>#שu.vq?W@pJрtEJ @ >wUH=Ff+2bxB!!ବwە oiLO#Ay`S+O2ByIv7`{V#i6`uEL)*|C9 RU𷅅iafaر6dM5&ZƭTں560Ø>`T\ 7^@b$'2"})?GYӌiW?FFT?~_M:ͷ\luJ%4./3u3~)EXkXWxbKC"n@_Ze)mgU3"_#q8 }xk[jM5z/ކ}5]uvE^x÷W j*B"<&gS\ԎIQ\#J?LM9c%$_-^Æ?'kV 0y3/ΓDq.w; Rd7iFaAsg Xwaa}x|4,> PIޥ@x3+YDzE2L:dj<WPCW9#/#O{ȣ&I]Pt+챂_|']cplc0mJi=|v|-YBEocb"$vO@^k{Q0{-Ivi׿ߓHlpSiwx7(]^o hK~;m#loh?юDx޻{ Wˆ)CJż % M[x6M\߆2!08?[b@"B.q1Efy"wx"vykSm$CE;DxH \/B|aE.gy^VCߋMsowۭpg2i`-G92_BI( 56gFKx[r| >/s(7Vם?vozxrq7o/}*a1{ R2qϣ]E7-PIq_xyONu~qO?/KͭmsvPnmlŨe%MI|b }Wď` R9|dbt$-m ÉsulO `oV^XTVPll]Ge&3,PVS-><߄F#my6[6V)&@mzm=e|mⸯ̀[Es|8 ޛ|Ŋ[t7Phѐl6s::GŶX북Ö@FG\X6֦$z.b‘a &e 2֪ԈC\o}HWz#h_AgҐ!C* ߥ6/Aޔ ĸl dk01&P6% Hkį#`ȮX?۠#j*_<|8 Jf2u/`!CK -O%A!|C )dqBU/@-)2U^ȿc(  [WP V 4Y58ҺUJvY8wmjn@khXJa uQ_\0M(MߚFQ+ I΁/P:dF 0"EMM&_T%r4ҒBn#./_Le 'ԕǺxGKJB~coj[$f^65  P AuJ[=-I⠭I`lzb%u̙Ch laՀf )r(ȒQRu Wsu)^K!4@4C`tm07i2xB&'4@&#.rjaAX"r^#!"%±,j[[KV5u@%t[V6x_ Z#[B{ /D;A9Y*'0m)TyiiKgg}Ctâr++7ܪ`R5s{N هo{V,%Aay<F@>(Myѥ{='T8Xn\}lh 1h>gb>P+ /Pz}Cp^=͂ DqiA%.jne@CIw\y)斁O(˫rO8ZNO@1 NnDq94L.>`qђ8X`A@k`)uMP9vt-GZOa]8EkqA)gmuAsBB[o]ڎ}='xJ(wW@-KNzq@MImid"\ ,\n|f坔/bx-ǧUp v)-ݐ(,(ޔI=;0 b& &'`uS Q:/| ^Ěq yb)qBp_ iXM)R5T-'`!&hJ DQ%>+Ӓu!@S Piǐ8(A ސu Ⱦ)DFY,/VS@8u)}@3P8h{- 4j Q1 D܁?g+lWL( `G9#7/YJl`Y~ ( AQs7%-"u)Ao`9M57q/00] q6~DRm }uyB\SA@A@Ţ7 Ex(<PkX@<خ"g(V,کѨ3JYH{|(PF~V(݁p2x8>?bPI 8EL"VxB^XnOsC^ 5EpZQỏQ RjPwrxq5K7;$eg98,iK͂4?Rp`^P9OjUr7|FZߊ`|RN>*J;rH[su&p! i eyi RX` s/I$9kKC ÅB ny9J[8Gn%cC"jBby$THLif@_`c 낥"mD0-, ?O7,-H (iW!9u I%>8| /Y(M!NC %–dQu-mA./,6mJm}Ez6ya/ 1/}J"U&B-vY]'5gΒ@fD±{8ئqSjWHd3NBKCJ uZ1 e)c]ݳB- svϰ* +T__1/9ؕ|UM:v@koOs^JM@Rr[rM`B`z=eC/VlOډrU@9Zy%38/algVtVVfeNC Ff[g`yU nʳ$URGJ-v:cU,,{KSTb'.V "1+(6ت Z6V+g 1yf LrXq3nǹ!|*)xjUyU$|@*ĜkE2WǰB8P8,EiBu\X>_m:1O\UGbkʤ,,hvDcJa¹/2qv~XaK+bw8TtSYw#P3VpNbRf I R :!n[`_ Я6*Mbpq@B6,nPϖF@o%6omÖC; R`ځ8Zx6gQ6 |LeOܷA@.ksW- 8'ym$ O{b6B^!{`=A+z>RlLQ޻W։Rxo??#iSC_ wo3[⼃BB6OMƒ! [e~M!q@Eq@Ka  p-mqߪslď"n JG<ƺuI,0PdO딩$]Xy5",¾/6x냪O'`"aTaL < Ga?22 'a>2cH] dIJoڰ+e =cоma'`d07 gY];/Tuƾq}⼰myo$R5IY`(@m|d  ^v4{ꂄ'H93d(י )8JKHN(pEi''@xx5GY[؂mK7Y GiE "Yv$yiA ù)]6kKX ^lSJB)/mH`؎銅ˑyRKr+ײMeF^Vp1f =#$:ǡߚGލX' %TZ%Y@(p{uMiz.''@h n ;Nw%LzM$ɱ4޳h*H=4 #Z:ލVp07}]Q^"j80TQ )iuưӺsjfiXb2B a!U`erjSiM[Qw 2)@CKB˶`UBCBT@ ) 4/~h[EhqV)`Bρ??׎v4Б-<*2g=g ;w{?FE৮ˮ *OO_ڛ:Gݑo~w'+.&Yw=ZT2x޸b*P,J}KѨXY82.x<‘f9۾9rt﮽1k{zc#?-it2ͦ BX2/*p,x[qn2?1y uf:sQӢL"?/:fKCʈrM%N*o8Q\е7铯o  >G)=P?lɻ26wZ"ZkAUV}ZԝPm(c\Z `p6;ݼ%OH{9ԜZ ;"eHN5B# -X'kKAem 6& 6GH~ ^^{=7߮\{#zڗRgjon{XZC\_ >!c5]܇CA $)gd@+[ƖfԸ`CŃ3ELޖc_µ:x?0#t<4Q9A#v'#iakø?#ݑoJRקdXvH+aaEiM9V㳰['o+#BAڡ3> W"xv#_#v((#Vy t'|\PJB@Au&A\ŵSf`PRGi4Xz2TDE6|=\;mK!o[p㺊$ IJ#sU3W3䔫@ R]L -y,+l\4\܇ɒ#ІޔAZD!kd4gso{xX6*yj;~&ڶ!EJV;XdֻҴ7.-/)JyB\D$I MaBREYN> +NѠ K|O#&bV-Z' E_۟5穻3UqCU7ږL[CORx/D$EDxb[xd?{ͩ;PD:AL)wS}}R~O>+ڻ\=,J 2gDIWe-AB׭( A' /B)BkdO.wp(vSDaߢV.< _5=$q^&d"%&zVOnl U4Kkr L02"9ŐrT^F$]LNċEƾ҃yJi;Oiז˄"D"\2Z59-_U><ګ!Y o.FA!3Tshd%ao ^rPҹoɋtȵD<+%$&1ZyjhQ"oJW56ewߴAmf܇bt#`CiA$A.j&]K=p[EfN*ELnKcOJ>JeU9HĴ*WfNg YxXRZ( bNJALׅ` _@'?<@5HrE+}O*-q̚^r[1H(2/$'*תwzK gT ꣘ġ%LQ 64 A#R].9t^'Ʋw6&aG:`k+t8Lr `nQiXYtGh%HMbva亟'^P"AN>~/vLZ3,~￑iSRN2T/@ܤЯax^ɃBVJ'5?8:Z|:(ƢJ" o^ߎgYw,aᦐYA/“YA; 5}mb.h<݅?5>  "bm* JP\S`*-߅̾Ivr{/}p`Cn+v6/d^>bSo!j^~1gUMyĆy"xr[0TmbuZXK[J:BV$zxdVZcpcQ%)`B @ԒBV5+5=m-l(ʍޥ~1۸0)ȁ`V ^KC.b4=E T9"0ou ~.tNp{j1QB옄'\CH-)عpgvg"hGpKEOܛ[;$y|]ƽ}oC5T!]rp2.Ir=z\iq @c r TV8"T)èJgo垹K)x?&է6TwVkp !{}[^i_В>]-س@jt^B D;C9́ [E7iQL*/F:_j)'n :|U%#Vk{Ke: J74)4U-^Pչ[v>v( QфPh)-Djw퍼 ^u{5\u%vo..*..*..*..*.ޢ|"! kLGVZ4-`azhg4(M5_o eߥS%@Ue%ć{Vj 8 :O.g ʯ,%~,⤳*=~^˹[owZwXm\r-E??^pset_GWBt}+/otG/+/+/xt;n]kT?϶f&ce}pf#9Ln>mKy,cu S0x8'&~}t68iOZ-/@EMKm0/7{|VeaSwh^zâԉ/M*02z&w56 ZA nm{+B]t/,]ƀbOfl_|A ^

Rq R߲cdY}擓7WOُX4|s=~ql_y#Իؔ6ǒ@M̰v/D&f݄vJo\+7k>`ך}?غBftg4.}g$ꗾU%®,I>g$^".Mo1;b_@Q{|h@+m8o*]/B")=2\ɟ_OfjgDl@on}gsHi` ~=I̛)ϻ.v=k?2F-) /C=)\xx 7@ jq418U|,>]}_5M |u\1+ն'LZ;z^r/ֲH`P:H"%%7%OM{cF-z#K;"*V'd1ggGjcԬqtQi^PH"*]~| E.=&`^(r,\e7_rQ̨'?/@_X섌Uk܍KwVݩRr3o7 ,TO@K3.RTvwb2QSH=.77uk1<95FA08 "EeaMkhQ_A1i"c$= ʫh#Pu"ĸmGwaGH @u\jfpZ=\|៫RT̤)B[vH]?A}.}}ґq?}. pwț?cwx=^w-gq]~sqf% w~݁?cc9Aq|h\730h\73xh\73sc\sMx^otѲ}IG(QǥxՂܠ_8`nӄuZǁX܌=hy.0#nRX|L*<089k*pbcd4kjZ1,RϲۨDCA܄ )6т&gs H&2O\`%{uX/ L&7\qY^_* 2a,vkp5 nk"-۪Б1/dK.~ioc9%6ŹMq>V+ؚG'?Ng/w-<U-+K.vtiBE}= I?șVrugGm=kg誮jho9Be:)*T;&"f6Wh~j]ȟ}6X imsݩ[/_޽{wӌx)覴 -.IBY.l 낱ܣQMo\'$^}}o-sǷ8]yOS*:FYaz,$\9Ҧ# wPЗO40L@7L-#\Hu(\`dhp}5}JPO4xf|C>:f}uP򹎆|5=w~~nψ7{1gl$s %׎as$ܐM?;8O" 7-_=(4D6MUaz{/7-M'dBSE]S<7[MeгO" _d=+]@m"as@޾ڝm_wZP߰)=~V>L8w ,ZNzϼܿ'fxUP@"5 D?a3[u{sgaZ{mJGˠ7Ļ #"m-}  X3&]7|xv͎FC'LBpgbDke,}7|cw:z7to??SpWgY'klux:=|/tzu2,yol(.ٱDywv-.uKaRdS_sʼnDu2ȝuc K@DH( .ۇ2׹0cGŠpQ!`\NǍ`P?ܘ-ub띃̽0sV{L&VEiT'"BSPwCys&^ߪxȶruCKDs+hAG~H?+OOgL>_}ycU{kq#8vg {)6F#ϕW;FpWf3/hTl{T w1I]\<^l\8e,[symFs߀5Uugeus]&x~QJp+%ǐ )8y B&٤ٚ/՛C)n cZ`"-mU0 .%teI@B IZ)7&;;v+ʪ4 Iԇ>.;.>)<<;>du[iѡ/c~&k/ˮ0N[]yiq|"IOf}qHCak#<깷WʃobIoˇ.)ŕ`>x,Ra0cqĘW=>.A]-r[]hxB礰1ss57.ǘ_^\9cڂl^%ǙE) #z@YN=aԎ Q3vIH_ u6uVۣۆھ@76Ah ~tL ?Q#T٫8$X+^78y'lfY2YѨ2+ 82 "rFpGB@j͖3u]-Z CG$ r%i {; ehB'jo8fBhS5 ~+?<&f =Kn I΄heqϔtj]/>[=I/6ب\(7u_+U;1Sn;-\kff:`  w?5*- Kb4eά ҊA˂YOgPT(i]cjҠr`UX w>>wһV!(sp˪$" a+#ks.S}HZW"A„t)inZw~OnCn'3F-\+0'-+Fl| 0s >nu0>&"an`>#q*b-Fژ jYZRԛ8$&<ϒ՘l83nщBK=8 [N4;i7} pcjD 1am$ )cZoY¨8ӄgv/OЭɨ% F~2gۚs4\eJ"]rp%b˴ 7YG(Χpt`i oqZbi5)'ϴ/wW&ge7/ ̷9tӝf9琷 ̯ Nx_gE__b |j%zH^`Q…G пv37}>'Dޡ8f#JkH0='>1\֙Jdrx^]7vtė#<">qTt^^hk3C-#ρ5}_m]&Gf| P HEY)#Af袉/vB;AxT&VfpOjx-)r0:u< -*&|$x̠.Dԛa/.$ Hn]P@{m:B-MecA&yDڕR02YXlF倇$a asJ s0 G>'XsFܢKh/J'1A0\eA@n`n(,lř?4B|s%j5 2,T'"B⸣C-L`H8-X5ǠA' c@{C PQHB10̞f|Ps(,nӐ_Hֱ)>ЀY!ջ a,QBcK!_`&WCTc ,?R-vZ_(͙Y[bcx,Cb \!9,'{2HΖmNh!Ba0( pu{QemH*ǻ(rN?ɫ{gQó3w_@1}y>8Ot>7̕`|(p a7'|N% ^Y#k DdO{fTFg<(qLpgWe|`.£rJ>υVJ*4F"kqr@rp< H<^niUxfwGeQg!Ӫ2~g.0NuL.vGTI ul2_D<@4̯[۽{1cHZK (poBM>2b.v9jYGf.|"0ILa{<_J4ԙb;`Gl6'wK082#l܏kc'{lYg72]L[vXSߓKls}6?W8?b3!.~YN#c 3$9)6r;_`NyЛ(>#{}bFKǧ6T-BXo6j==q6&u9WcGK2VEm87Z1$|0n_xI%p+:p8gʜy WDfn_`pow`-N8wr"?es);mc0/`\KC@ ɦܪLY1<(,2dP].K+cC/Fk5$0 *5[a !AcWt#'xAϠ၏aN'w{IMǥvK`#z  cV $3{m48%Cj ރ 20z[X*IC tJĤX9*`x8[JԆv'J+R{%𣰰+d%&z$6R0\!8T6VI{ T3kdn V6!롈hxȆp\wmɰ˂/xJɭf' BHl 3D*04#u.*pa>Grdc[῰ɚl9<[S* |qTӗ]ƔL`cR ’ $.E%Mb$;s"~Uj/ ; 4;1 PI5ܨ!&bλ3|DliF ҷ7.AiT@EBIr:["M>\V[rmI" yVP٨^҃`~GRk1C=XŻh][$؞Q'k9 |JԜ0 d4¥aRFnmf֦ BCIO|p) 06T6/p Pc()͞sZbVB@%uJkPIoqֽrl厇eGJhfw<ڡf㭾j·StYg:; =]0o16 붦:O7oVStc Vau}rʧc JNӍ1[ՇWX]ҭSIJnh}4?}>ڝ>mvGh>U+U*[[b[彤%_V=,+Oﭭjx<{zrY(&t:q/DRoeZCn;̨ Py)*wʦ40OF2g5)wY¼9ʏm)q0Hq}¦3nrA`aa9,?QϲTH9w']l4oX&76VUa 1All<*)J&)<J &5#GmP-Q%RVl*L,8$o'P@ƌ #dTfau -b8D yڠkKd²|qͭ72[UD)Tv! S \c*YumRjU5bJgs3C QY{Ḙ2)T +eZ0fcl5& ,o [XE5* D+W *Ksɝ0am-*U%Xp6yk3*^-I~6Qb"YqVaSyP{1Lz`mQ0El U)X4TlƄmTȲa]BQd 2LB̡Y0j4Ȩd[ſ[ſ_]N x$ _Ŏ VU!^0![s&8"@ebV@VlD<UҚ6@3l%Υq%p=_W1Vm7 }iK tcp\Hw,GQx1FZF:R:F:':fn\0&2hPWVt5[)u#"q@q_u2eHX@1̺ĠMS|;T Љ9!9\Ԉ4c pZ$v`Yw7ls̅Nҋ! y`Ҹx~ 4HcA\޼$6 =Qwa{=#ݴ68ePrʾl6і")AVxn,E݆Uτ K+"44XL +k-IR47:%H X1Z-Y<lɕ4nC&^0uH%<8g-,`7xZ̀(-CIcmvb)\mB])0r!\|IQ-\)z);j=5>{2dڕaCH g,Ϩ9NbڱQ+Qp#Z.nzf`W҄11lLnp:A(1 ac|-d󴺍Tkכ>PGfI?d",<܍bi`[g+}"<a_/LĻvdyyDBފ/'3i^ 9W7X51C^Ѫ̄Bebck•GBz:\b rnїZ|ߩI1G,uJ`>`YJ RKn[}/n۲ݻygzwkm^fx(޶epۛ5nr-3&w7/O*o۲Wc-v˾ݲo-v˾ݲo-a.mUn*VrWѫą--߯.n;=ڳEfI>|k7vGoG'ǫ&Iț~o``@ [&m#d~1y}õ@X%e@JDks^kfzp}%2f)ECmgр=HɅx9Z!#2QIE`)S涇RG*vx8`c1P>iXcƈ׉&6f1nj{m\XVfNPPIF'ygK3N<,#/ΰ!iZ-3d5d5X<*> Ceؑ% OXb8 -< HH8}Yq돟?[imO38nNWe9vT?Mrv)o5 &նy--#3u~j \NlvpS61r#w̽dD 3ò(-qiAߛ X$lĠ֖D}XDBN ^,MEKo?9D#_F s)Jؤ4υᓔ[֡ln痛2Fgׇ;w\G;fz]j`H,'6˨8-V3eO¼!7LAH0sR^(_c'ʷ)ݻt8-l3l۔S[x(ߦt?;'ʧӐWMu5ݓ+\ s NF\bPqU(ԼA ^3m(TBem!9\{oM..zxȭի)8 Sʠ4ڔ̎JBO˭O>$̸h/,ObNbʢ4aS ;d!x{ F˰!Ȃ'BЖv#jJ'-L JU\ Cb7p %(0(R Ћ&&@^j 1`~?98᠔00g1w&f7r۽o0 Sic-LL-%hK*)q긣 *9{k''履-4w(RM\;''eWPt*ĞzvZ[지SNd 戽")-AI xzgS/fX~:(2d'\) dv<o?Wq0ZNY~gxAwpACc9Z\[v(H! 1t4Zx M(flIwTti{V/ܱ;]VOz}~(S[|7W;e.ûq53_{- dg^ʾ;{껳^;{滳^J;{⻳^ ;{޻v^ʽ;{ڻf^;{ֻV^J;{|wdBʅW XC *# c*@-G'rB+PYo*Jc~EO"|7Bv[Y$-#[6i1\r&HDo6Y/⼎<暷V34),b-V0:ubGx/N>X܋&pvq5BIظ܋X̉x6F Z!ZiszD.\h||7_$9F@˚|7IĮ f_Ÿ+NZ0-b-2Fj2^.b|[E>-,{1 +(;"jfcGvXP {uFt*0{17L& }sXE\G%6."}DHU;4¯R32;Z!U(o h>`9sFХƫOBV#G: =$x#(擬","F:-U$]B*з%oB, /^E\-e)MTNm9K!V7YE,j4#r/ơR5 ZE,FdV Gy6c~'%.d18oF;FybcX'.dh_׎B4);y T[yi/4Q3`HPDZxc+rس>b~'t.d1XUlwBA, OS4\W[E^jTTBb)J .dɈS(:[з;EAQޅ,,P+K\rNQ}%c|l{y(tOS1U\-JZogHPdڹ%c> =z(4uEFRgN݈jwTb\f 2:¯ޞNs1F66[y$,# hP|1\6 'AcoY cƺlO2;X#yƭ;y\ۅ>7;' 0=œ\ }'coD;"ƭ9YPܮ J}oq2XI#˭dy.T^)6VsL+e_(d3"p 9 *] 'z+Fr(bgB? ZF6C'$( w!Jct,G'yƭQvC2i %m1Sd.t!8[<$ C1'[ v]P{;DrN^6yHS(B3P 13n ѥfSF5R$١m,(NVoGv?jBI]fxڞIoTCZ$dj5y ٙؕFbL0h-}Bf"|^: [ygܤ׆rK+]niUG!wmx"xHTd93nN6Z\Į4&!f+#jCڿػ-FI G!d-R*JccRiŞMTgteQ0B{|Qs2^y"Jm^8"vh;)"B=&;B"|Y$$o=(3 .b&e0gtF:Q"gj"_3nN1n,?e4oy%sw+ݳ6+i㤱53m?NQ&j[Q}%M\}noRޑz5FP/V#dAY'&(OmdlKTKEbgT~9("Q 랩?NQWV#Ŭ @$Lp|i^43>Na"L/V^)<HzqϜ6BJSXXf$L}9RYGn9g'QW\ilR.PXlLs"V&mT! Ri}ij:iWiD\Hٚ4Hui]!RE\:RzZ6ä!FB:JzF. ! YByF. 8iWҥΪnh9N:"HB֧f6i>N"d#]Z:\Icdd.d}i:ii\E(,Z:uY 39Q)B>4[QN$^/̥㣇 B(4[QDQm! YA-'mQNǀmvBABVqf!=f&c5:!HBIET31`aR|Pt!<'N41`"ˠB:v%f֧4"Q45NZ$ ҮltFd6ISQ_tC&tV.Ч!JSGNAz'Us;夃"($ܼD9Qij&+n(^Ϊ9ij$+n^Ϊ9;#W%P#\'sWLt|Uj꥗ JiɥLt|mr%Y QFzN:!M=Y Q\4+=(2 *I()/_trtVC)mb~*=f._;Q,sj.d܈=M҉ eM P]W{Lˤ F ]ȸ%҈dlՑvic&Q4">4[C]AIoRI7D^:QzDg*^n_t0LtiYϙu k/.9tVrtCi*㫤gjK"}*^n_t|LN!\+P鿜t|Lti) rN$35ҥl4HD[rHHI4JRcH5J7IIQ偌Nˍ=N+.-`;kje=s.-`3ͥ{l# 3.-`;˛1HJQHoRKEAIz&nijji}ZiiHE[n Eij>4HQU"H74J"MM)O- R'mi8 3HS3HAJ*"}H^z&$ 5FfX(P&=:t MFef6!P+=WpGTZ\Jڨ6lѷJgYȜ6t F%fk^yN| >cIJK˥ FHY _ /S.^n/`jEJq|鿜tirt|+Ea+c\*Kk F^ k.m^./`EJr*Z"U±1HI6J/H0"KxTX*Yi#- $mT& Ri}ZijiW&iD8ʑ>d#_tViD8>'&ޤ._tVBHPE4[Q4HI)]J7"}N&L)\#]Z鿜tVBYE4[Q4HY!B醒HSHWK/I6FD:+"RHSE4[NڨT""RU*JUKI4FZtVDB]E4[Q4HDHKgR㪈Uf6jH  !A>leF1S._tVąXEiziҥΊB!"Z-F`Z҆H5I'̥W(32HH'JD*inTt"Q45]A]I*#H/m-Us::F`HE[#UsJz`H13$sr*`HElH.UszҜLt0e"JSCĔ*9tiLt0I"HSCdj9tiLt|}OWBr: VKgʤ"} Ce1MNzQ:41VBr1 1vHVJH7D/ƲJ;XD$btiLt|ub̨iDF^z&'_鿈͕`9co/̥Kl#1R,dNTzB:&k*ErtƒH_J6H9IǗG/$Px j1;\J)gj"}N"U.I-P鿜t0LtmJ7)j"W/$=S.]Zs:FMRHH3HϔHGZ:Nz'PJ`ZFҒHSHgUK/K74EL:JzN1Y5 k/.9N:TzR6 %3ҥՑ>I/I7TEV:QzT]i,?"DJ:Nz&']Z5omJ"W._-=S/]Z4?Kk{#W"_!=S#]Z53:I/WIEQ:TzRn,?%I/KXGN:>'=f&]Z5o1K/HXDZ:^zIna^n1_t|ti{X>GzNGR:JM/#M$O. R-mTi8uқ045NZLJڨ.l{҈Үf'64[U2Mf'64[/R/#MM/$ R.mTiҥ%145>NLڨ*lKc>ijZi}FiRiHE.I/-i}iiHE.m^~1 MFfqHAz9]l5 iQY٢?JK/|F& (mTiҥu1"fQsJ"tir9mmTiHE.^Q1[PR ),vfx/]Z-.bNEJ@auiKcEV,&V!Wq+j5\iD{0E8Qϭ\83jE*{|*ՔFK?He0*}%c0Z3SS0 .̆U\G?\t7D0ob%%ͺ48ΤI8^hzL{%2`$aիU)q4IcEg2`~X+! П jsBC>Ie 8>`ft h }Kðػ"QLYh&d# lnqMY.ը̡$fٴ TxV7# v>IXL¦FITfEl g;c2&´a`,ԏh %h 6;,@PW,*V3!'K0}6\Dw'f'՘ oU˽B1h mR!.IO >.M(Em꣖RYC:-*%K /JHyv]ҡMZ#kz&/JQb=-ߘIl$Oss[֩o#`* ̿ I!BɝmF+D+%(*(341$P#1V D'7p,MRJUyaUdܶԡE)FCN+!scڨ/+²!97CT vJS1rU/BI-Qx37%k篱Q)LSHWjk{ O yu˽95Uio-V Fɘ<-S/e(`~/0@Z'x*{b.}{gFv& Rv鞆y-5EX 6& pPXs) {:1oejU+0Dq>$8Frs`<*& Yo2.oødϤ*-kd[F!o(5V<3G>_Ui%B$Wjlt,̬nY G9e'W1t"X.lͲxBf5i6DI  $>¿y2r\^.DaglyԸ1p4EjeGb>hδx68Nf]h>鱐+J%A"7D0aAMk|UX4-$٪o)=|Y /Ÿ>C _u>U ͔!Xd7gY.>FNE<F3")(2l~2ÜAr‰\1Jý\8:h7#Ixg,7|KaC44" I$ӃI9PLOC$-6ȹ㩩^DJoY") =Fxf }PZm0;R^o+!yoo)RB)fe==ri⣯[bjyjrqWvFrʲyrWkl\#q`"OL#t铣ӜOmœAѽ,WDiO@yۃ<ȐV}9 Q1w9=52!ntQEZǚQ y_&*Zgl&V ݼ}8mzQ52Gd '%iZby:`1Njنc@jR +VcA@ziN[s96a3nnm^1S\' &ZVK73[6tܪUӄr7Ddr4#[%Pb&i*x,s[,[!^s#h$r5"*Ldf{/`U+n|eܞqc*; ; +`>vbz&y.t,>FErlh{iU }XW'Y-Bͧg -C13 Y1^QG/-cX tfʹB(Tle$-htn$9J6͍Yu$cKU* RSl̳霍0zmfZ-|!H̚hosDg }DU( $}seK|gsX_ImڳrNۄsb+qw4V5rQ_XU>4Y誒ԪL#d “X~/k*^`Te^dQ>w 4>;)f^4Ju1Kd<exZ䛨pxD{L\ؔ _gZ\YCVd+NVL LR&PGdk6uu qP3D6$/]I;<3$멣0Oja6`5P(^a TX,J6bD9([;M檟l7BbT\mM$Szӳj˹1+n0hom5b>`CR=ʾW yjn߈ra_Q)wlL^?2?UO){9h~jQW%l#l| pX,{šZ}Z-6h^DK `RW?UNRۅH-wzCvQK,N/Dv"#:n1̽05iAa\D+SᾨQ +Px][^BHeuFzi'!va'WdI1V=FdcQv= V?E4T|Pg0z33F5 tQ 2>L|rT^~D챗wMSVOd\+G`oK`xj^oxmG<#:2s e^,=ϖ컲x0oB6+9l1rҙ ~Ց]rΌ}&a~9)i 3kiv5&**Zp0 Ej3Vq"'Avf<;G ?;y0 ܋l`OHQmqi* xY-Ҫp9¤RvE\fMa·F 2:WGkTǁ*f_29[x;2OYl c̪}/ZU$e/maivفWx /fc| TƶQ}IUcLya,F"p4@m#`*A5܅UA]ku;uVЇN H,k!≘wdeq;T3[ha%M ,mѽt s"ҐRX b5U:ԑU_jp,nc.N.@CF\`dJlfR^KsJi0V7(av<9lD&D' ǞW[v9E cU Ѯ{:UxFj1{5{.6QYdFsȰD`l!73!2W ?U_ /}΄3քf9 phwl2μ9ףku %v]/ťx]N*+6$*fs<⩰ZVWUOTkcdfzy@VUD_k/ UAE~ eO8c+U{άWsZVQUU)!N*Ȥ3+jʌAsbY}w7J]neK2w29&{:\[쳎2R]Zuܯtw2utųoekhDLYn[ФRSG g utWTQvT'P˩ۚgƚWh=r̼oPJ:y?:T >jB{:ScXE5VNh潃ag;2E=&?-Ok%&1QZ^̾fuKO.xa~J^6,l諌y>7`5Zܟ :UʒAɬlU~pJfU)a:yCFQ  (:Ú&}$9Tb*65n 1wԂf^u^'bFlPXE0mce#ȝ :uK1j#68!$Eƅ[M rAAup^7Rk<$k֬Q+ =(? x _lm4Aei}luľm>4J}ũNyG;!_]o`6;(?:a 3kz$Ȑժ5ߝ'?\=}es9o7뼭VR`fU]-ۄ) ~L]VL`{hg/j5D \ͣծ\31Ą܈~/F`ԏrq;$Kumj F]S%s슌MLLTVf^RO/BL?"{: {n&^W+9Vg>$|R義f#Zh<_sg4"皇Wժțt%ͽS;m YN/mנLVi.{/s9wS% Iq ψw1)uR&a-mRrUd&}3{@MX97.;HwTMԜT!ZNFi|Tިt@dX9U!гn^Q mveUT竼Z;|ߜwp_tnXup~t򪩞nx~ׯ^uo>ս߯Z} W~i&0`"agsZiZ:q$/z6 ?7WnѦkǯߜ,e[Q C.EV Rg}r[5-O_Ut2|zuO|?ǰGYzFZnXlr@2œ8rc_6~n ܐ=X_Ro_)\7U}`b-bi':9_H^z < #-\7 Hf!^yg!cP(B`ԪO$`8Z/4KҤb BU1\Y? >]ݤF:S S#a6Ķ:f^ʂͬk.W440G̍N&8Pzضyr ^.lFЦ[a4-xsB|V.E`UU,9:n) OȈklenm3:#*Df2A]6;=UL'8pdLQbW}'O%qnDgҫ:i]*leR,; ;[t)HjPhfbkUʼ<9:e9u<37? b&ek ai =ISG]mu j飹?u{TZe=ۀ,h >br0W:OE~v-ʳ3X}vsI= iCv1Tp+?ۣQތi ce1ZH\\ɹQ:B1yޏ0A>Jc]'ӋL-)wR]incL4& &M+Q5,@BKӫU{a;?^As\W4lIvВ*;6VtZ4!pzn_~{g5*Ǹm@r1U¯تWn`ib1,ݤpVhaU٤$ ׻{aһ \o࢐qܧI9SMqnM>aؑ b4\l:*W 5OMZsjn8X  ,E'/ysa.> eA6>D^;W4o\^Q?r " ͓8Hp=1ڽd.5c鮈lbe3mcl)Ƴi4DƳi41m9܁ ,Dح)Gd2Ǩ|@& _%xnQlch&Ml 4gUYe7lU$6Ԧ8D]*n,[qs$CžL $r !kUsSub[Ch_@[F5r+A'~ ={k?"$,u᪶1v`-3G9~aWZ,+0 }U"-`'I&xnnĩ1~0倄eQ n~z] 0o78\.ku|\|^=msكfYR* Ul$g,8k2w?pKxU7&=ygVժK~?YߤaY+ f*z,uz=|" ,vvz# J'£N17ZR-C3e7aoXAGăa2]mnÎDbnHQֆ[A Sۨbi.Tk C(B$0<`$5imPUƮdqW\0uqMȻo0pJà0@WtM0O|jaPn,MiMLܰr0Ȋ?( n7@}V8 ["raeŀ(Ӏ%>0(7Z'ʈK0~WPI:u;=[p~xrjV'ӊQ t`'g7Uwt9sn_?>_V'G?޼~}rzWi\qwQwz+qp}=N|7Yy5_<[9ō_>rc /ޚg"yqoiI+OGDOS94 w  Qiʌ.<͵ۥW) q2McAE g"Oΰ 7-! I^Yi|=OqBVg'YѩGvcwdPeAh gf&-z`PMܨ{6f_x^:bL a #;#g3Um,[lf?M)D@iWh 3 n)S,#=e>O+)zJ@IB&̜^L%gekX)ڵO<%*P܈` S0F@C< OmX&O{r1s*ܵ;ė߁pxw$EiXӸ`]\ FtLb8Er^({a\ SY# [ m5tЋgQf3<#)rٚԕ 5F-bޘLIq(Mh5P+8?Q|>9[7Gi `0:H)H9pF";BV`ZIipdgvSKؖJi ioLXJ$!D\ |: F5\'[ hJu\1K{ 'sBX`s%n+}&Ikr~6OEi<Y 2h"+) z-|b1L=P{GFAp uUԋX񭹑|ܯ4jԥekCm9.-l}hrT [)&Y5݀Sxm0ZdJHQ˺H߆6ܰ. ۝XZ-Q9#0 *mX{nXT#tQ:a/4٠OZ4O_l{^#9znīކs!61MT1̣ڮmT 0yU XA <µ1[8Ar|[ ۺW`rb’%S>A5oq̍ksdFDRR)TIA-X"^Χ@T[쿷WǕfCzm<,o^KUeˉL;3;BNpC?ըߎ d:1ݺ<5dMq~2=\J#u6Z%Hӥ?AUiŠcJyZafj Bm8`͠q?T)b'j!g惊/. f!x>7`*axljR}ftCapTmHjxBr@RZ,Bک$޳s4)}7c [<7f42{ʫ E BF9rm!ڦaalh҆ ޢUm&juMD;XZ@wS#mdKn^مzIdƪ|<(C婃'5hk"Ia( bPU8ɥϽmUU<% A 7Ɋ?S}a v\H 7_ݤ{`rER_^2NAߞn'VD'QF!O~ IA"?\(xXc/KA<ɳj.Nf=1ԩ0.!}8:g1In43= C1䖔(%ag70E ҧaƀKOOni#MW%Ife8%h#P^q PQ:#>)'w&%,9dk};odws˪P$&/s4lI1KǴ:,>ؗv)>ٵ₀A8.M ,-bJא)ϤMb!ގatRi$rj)bXAud(k_'6j)P@6DT 1$-TP+3+g0;pdI1ΛuWAƨr зt,.#D*(ԋ;%~= [6gG\٭|;pHnNZ'-h]d8$۵Vf*R2LI5;xZˁ A|oF3ƿO`|_g [Ar=#L=$xAvS% 63q9o9:9y}vQdD&l2ArdjBi6U`9__f1I_6AL{o<I+*L TZ"NpMf+PML.xУ́F E_NP!&nŽ$5 = *4\S%QC}vI[=NNVϐAmlmJԂ26F8 4u 7x!21Yhuob, @@*K zeIpVYB3/F&o7N~"+Fq>df tIњK-Y/Lvv^ Cy,-0|xoƹfq[l&_% @fc::ʅC«YEBt@[qBdDω}΢٩7d>Yo' ̇ Qݿ˛DO[^֝tՕ\+8Cն,R}Dz.[fX|r˺ ;ϯӧ_Tm`or}tCn5`K1N9R mR1Ճ]Ne`;M:v˃JHInws E(AM/.z]WW[֦C1bSOZuc~^DB.xcwc1>m_<<}vOuoj96C l }ٛ!uJb6DRMUHN2ll6ZamUᣃ>~@_q9`/j?I<*;er dȽ>XVVG,@O,zo6!BŁCnR8ݤp{m]BŁ]dĢ(xQ􋪽/"VW\"]wUwqLv*t-P-tAK/C_h$ (IJ&L_a `cLL,oδ.1 ۧk8UUlNDZK-zYqJU.4,63amB5~F>^fw,5~JR2r 1XvݽT3I ྭ "" 38zd0UTn1r;cҟr*oF.ivDgfYI9رi)Ҡueܷ9j&`5_EŘG%[%.2.ԥz8žs{[x/;M#s)Mu}tܺNDH\v uG#Mmd/fs";s (t~(wt m, +k]y&usC$tP?sD14cdt`ϧ]'\ \|&C/+et `+[Wlu+._v=Ry_E¯Lv,bG Dv]E{|bu 7~O-P^*a]g港vmbcW?]qχw;ܬ5ui]raw`)N^ j[>uooh.֯7..=v@oóyd_|tr-p5]ӗ_1{`b5#n5ؖ6ۉzȸט ^^F %S `x(`h^MhIcoD{MO>™*:J#eg{6 d(]SgMpZw3m&`~啱}}kJ |ԫϖئ{)Xϥ 'rmI[LϼQ9t9rݼ],Ol3<[l>?7cv !b~qy{q֋!&bn^r  w:g׿TW߿؝D]1&zydwP;?j>UNgv'`e 3G"GxW !a S,^ykl; A R,wð1}@H,% OY lb6,F3K.?/^w/:*o9~Jh$fK_V#N7 _r _WTQo@u{o'&v o_?/_yd{Qs}ֲZv_u֢ +wttxeJ =l{R?{[*V_r X.otvOԛXcVV7'O_^75.s E;]ڨ?X^ZS{ܕ[& K,烗cZ&6;@.^쮧.!xmrG>gd@췰b b6"+xߋg)T&RkS]0SnmEj+H-rba,=k0zxY^ wy/{xߤhx|>!M{/k0O,?^?ۃ(r8C՛>"S #% L 7)mB\a~h0Ȟث = /k{қ`gs?5PG9{- PG>|`qk1ZKܷ2? XdbG@0YGʙٹʚx a2,pQw… wNI9;<~G(;{yd9'nM2WBj媹eA)|%Z+ !ј^Bbv{€NT`;1Q,"ҥvR8&˽@ߔ`r0riܫxq?\kRr/TΨJ}.X A7^wG32La^`qaawc+;m5Io %Q&{V)݃.%7kJ]JMX^k Nk:8頱Yō$Lrl&CܫO36 [C J$`r!nΠ0Ca6,±8 a@RDL^8oԪlM%2>^ڡSE-JaKy(Yv˄^w;4*4/-!B&aPaNo)InN5"W }|7_?`>UF>ԛK `cd켕EO2lXN1\r&HDo6ഒecyk5Cbr/Ǝ`YEɨP {s{+$˽ѽar˽pbN^ްheij1¯\x &aPaNoCT1‰\ &zvoL-LL#ΘGDd˽SmPoP`ʵ8˽B" q Ѿ/5OwWƜ`cXQ 1sÍzsIpTT腍mbDm{{ 'lѽW[E}2x܋1mKr/Z1kİ܋ɤ8=*Z6¯VOkTG*1hu|VkGYsN<]ȒqZn/+-Sیo<^1ʋs:/[%}^^; ]<룮+; : &PϳrN(2\Ȓ[G/ƞi; v!AhjwTb.dɈ_жWTVSv YXj(+ZSC̑:EAԅ,UtEGy6c~9(ʻej5{EQ^<ST.d[E^^`(m B0W MFgHPdڹ%c> =z(4u BasZZ/%<( Y2WoA/,'\MV1?'z+Z`9y> I~PF.plbcn5ۓ쭌7%U.$FqboV('eeiꤍArևX(# s!JK5JDtt|ăO' m saʅb/(mDǀ%kTtABgfIE1`a庝iU"zHIdrNH9(Ҹvlդ̥{ XFT']*rOuD31 Qm) .diW2i i}H#JKSH" R.J)V-OiDi45U`HUK7JoKg"}}Zt0u7qY>#M QN:. M˥Y>6*M D:1% eYՑ> M V:$ Yu>1Czt|yj뤳#})j9# K^zQ:6;fITKFA!'\"U ISg"$c*\.UPJ5Fo_trtV$m71)/_trtVC)mb~*=f._;Q,sj.d܈=M҉ eM P]W{\xN4`aS*sv!H#ISJUGڕNQZI,F҈tl veV'I%Pz`FHSJgHoK74FD:LzR&tYқ$ e.m9tVrtCu꤃gK"}N!U-\'&R HJg5H/7I7FB:JzV!8R 醪HJKK (i˵ IǗHϔK 1jJ/J"W._)=S#]ZFID^._t|LtiXL/^_t|tiX$(2 1k&\&cjZ16:\zZ6 91SQ@zAGR: Mj`H3H74IτxYDZZVAڨ)lVgB~G'O" R.mTi9 3!"MM)O- R'mi8 3HS3HAJ*"}H^z&$ 5FfX(P&=:t MFef6!P+=1ijRi}ri*iHEߖn(f!sHI4JD-btCLܞ; -!r*&RV TK뤗 F:Xv:C>Fl_NTzB: l1.ҥ5Ls#H5H6I/I0"q],''+.^/`!R%+,c_tirt|,G&7c"eRM҈cfk6*>45+4"HSKIo2JבD\:+Ό4"HHKoRIFA:+ZL!$"GNڨQ$ҮpTr>'^n>D_N:+zX!"GAڨI,Tm{YtCI)㫥K#W"P"G-'mT* Ri}_Y) E*b٪A#qU:+"x!ˮ"GDڨ\$"Bꥳbd)qU*JJ5HD_tVxXi2i)HEQ:+FBUE4[QDHUIg rVk-#rtiCeRѫUfrtiej%"4UZ7Y:EAY YDڨ\JZ. Ү$lԑF6ISCΪ9tLt0E-HSCˑ*9tiLt0SKSj9tiLt0]"6KSC$Ϊ9tiNzT:2!bJgEJVzA:$k!2Ig5FTBzZ:>ѧ+`9AihҥM3eUS ˡHĘ&]Z'=(_c+`9i;K+gj"cY%,Go" 1ZDz\::1fT4 "}a#]Z/=/_Jt7ҥUcX)j s2EB']Z*=f!_鿈5`9:cI/lKǜ#sJ('*ޤn_N:LzJ6Y%қ 5f).9tV&tCejgJK#}N-U'n(_t0LtiI)"W&L%=S']sR 醆H5IǗKTKE'U*\)P HKg夗ˤ"W+(=S*]Z4vl]"W%_'=.-`˷ %+.-`W˵=+.-`{"(_*=f)]Z7դ˥{#W'3.-`˷ͥK{,"W-_/=$]Z7V0 H/7JFB:FzAk,g#\'ݣ_t&f'64[G: M_D'O& R%mTiҥқ045>4HQm"JIoB45>4HQM٢}IJ/xijzi}&iriHE.-^Eq eFUfx/]$HSJ3JJUF-ڽtiNz9]lI3HHUD-tir9֧i6*4[Cҥ 1"fWH䤍"Q^z9c]Ĝ6B7iFiHE\.^k1[T+mTiKkcEilH5E-tirjbHay4[{j嘏us(zV CHŸ-]Z%.beA0 _tVUpꏫ"M̦J /'U$tيm *˖-@4 (& -=pYYe$A*ًƆ&*"7jw*<;I%vjjjj p;&,K @[|K"I%d*" 6G9o)3þEc-%I*"jQ^0jǹC96or I 'xFdd.,iB^~E񛉙&0_:J)|?W^H&GfBd^(% 9 jQN>g+h gya2gj|K5k""f0y**E1Hbuo6ұ)XN78_syy%[(7k׍D!==$OCrr$rEddbjd;|D-c>Z!q^J.HIvO$TX*R~ 'ȋJQYt 5kitO[f둕!^`9RM{QʊZggȥ\"uxנxn{)ްL9E΋UFзZlh%0xmoğ`==~7MjxBdUnc%و-:_,z<rSA|\R#Z7q$0/جA'Urp/-[7鄒媌'18kXf󰕚L=̟~U`DFe\@l4Dwd̡e0G"jl8foEL VyGef$3Rb4&eFb$7bD-zfFƳB"1Yĸe:e, ~5Yt=V|vMs_jA&I,| a^!@'b-T@xoh Eyt)voϣjյd{b惍nB0rӯ&@+ pT$j7νeȏU3TĬn}*$C$njS8 Z\6 ko1V=X_JXIY:y=RϖReRT`^QG\KnC[Żbc8K+X UժR+NH>mU/5Q b9jJOX_;V6rz}baPU1u[Qb9'D2;6gժ5)-*{ղxG-~Sf-üט^/j<'vz&2ZyPw,#^$SI=8Mg7!<]uGvj* +-FV®,h``#\8݇3u!b"IFj6x7ܸ$}X *-6Q ج1MM*dk]5š8gb8_D,g">3uF൵f.K˪|}1;^OyοI2͙rJ_E2egY,ȃ8vD!,6.ٹSeYH$)[FYLo69gyGșf}I?S9*]FW8u77o'PF$9k\^B`>byB~8w&Pc2ExJG)oh%O0G$|f꒱[mTsqUw6c]3՘kyDC[uFʣ%;ψu3`nUrY̼]+#4I kss}b<7Xh y)œqOLX S;u:Gu6*ME,NCÁ? mʃk1ed\zr21J)Sh(*Tfɓv_hF7(#y%bk h 9Wf2fkflt<7Ԩ>o5dwU``)d5a~N&T<4Ih_V5,F#TV [P'ј7%awV-#>瀠WNykgH7 ʉgaN RnWQZ6u.:͢fB[4$I%m_\*Xe;ޑ ː|[r)Ϯf5P.2̅8oi1,}:Q-Gl?W?è4bR=+U݌2ƪ"r儴B4V!Jꍏ>{XslvNuh$Qx"TOb{դSG{iCe:/ŭѽ$bp) eV=cfm lm^LO]ϙJ}<  MĜeUn))VH}^; *cS:i/ye'ai- 3VYBU<CZ3a9C`6l2a%wK{yi1Y%sUy5ШsY"U}HRC4Ҝ"5Q]D ypㅹ- 1ҋ=/XORxy p}Â?ԈT9Tu:<-g}pJڑy` KsdF w}@DqM)j zVF栋֢ G'ePe *2#ryǺvSX\>s^,|čN,`GiTQyLW9ءoG aJq ]E_xL~a%)nTMwUqҬ ىC 檕$R'SOEĪs~HpZHbg~G%45T}t!F`33rNL5YNaQةS?l7{}p,i(:/圗撻 /|~nf #2EN-Thʰ ٛ y|K+n.2 Yf& +u~ f0O&b6WE&S'asm1VKexY1*^#̄Tcyh؏{Q[[,>`x6B0=^'V9Xo8"* 3dd:mdfCdIkÿPRߦ>ˑ~,&,F!yN1Fkžr#[s\Z{T;UijJy2,d4fũqcNu#p< Do"گ7ag {L݂yfEog#ա,u<9rάnF]VH;[hNc `qYts{.MJdի ad5#QX+[eKˌ"f܉) UPRa]dR7<! RSJ2U(^05;Wf駞 ̭_5yDO,ޯ}^%ul>RIO!Î@Ǯ꾓v+TC]X][F1XJm&܎P\g5c6F@O HY"癄#k^`/kx\ğIs.{&%G=OۃeY~VXq=_qBl^͐)^C9waꥏA5U\Y^+#;Q&QYJ* 0\G)fjؕ{>k[ˈdf{\黁I:y}kNJ*"7ouxrE>n嘥A9a-sri*uqtOIYX,x%_/|"[:Z7W;xC!L#^{~q(<>5;5F#<9u2xꁲwҙu1~SƎ*<5b /kb>Ծ䊗I }rֈD})gP>$NIJ9W(+nRF&PқPUR "ZxDN"= ^ )<0 %U:X={dN3X4O@ౖB, ujp̳m.ۼf-, Pەmҋik(|=Čj0a3R9s>w-o*pzU_ԌNCG~oZskZVݫ^nT5 7RUHIU)"=f/6}\Z2)Twٖ8ԅ,R'iTL6,V|wOזu &0زULz\Y'gn;HO[i͇.GV+x6;fa|Llx̝v::N*v){ۓY l"PFd KsbTjSTֈ^V-(/#3s)P!ubEӧ6j,E~0=\ۡ#<09o>HmbV&-jq#5d~plKSit ;'d{1i4wJyІ w]-#BQ~$Yu.?*{W@se}0{PcC|Ap+UP#b"TsK2lvz_y*|W?7~W=]t|uG/~zu2չ;;?[_x70ϿO=jG9;|5k~pj8?{}?QwZ7Wɫ4m/AZw?lQv7iG7\:ϩ[9:~\2;J׬jR<)􄥿npngA*ZJha'N&ZG'!m!Ǔ0IϺ<c֎Re1:$^h qH):S@3ZH̽՛e~Lk~6#hާݵqSH D-IEV!5IsvGxΞ'moӋMX^rq}|ݱNIc95Cge?Go^\7XW^W[^(~9eC+*ͩ. o+:^]]VaVW涫_;;=ގ*Wb{梁j~^uɫkk=;<9^Zon!>/O??4C}fKYvz>_9_|6NWͿ[_Vk^o~'6o_q﷟PnZ?o8w׿Q8Fu-V?g"M?_G=w}/端׏~}2)|uc~ nIf[_`PU4殳LɅ"U6WlL$PHysg"eG@f>1 _qL44|l5 o^=l8=٪.ʝ<W}w6ce 6ыVG\֟84]}mV'ė߮MnӓDQZEgh{NV#s%E#_bz$ +,pδ(m SVRnSs !W x`¹scZQX>>y褊߾џϞn3J__0Q>lkN;ڭ2dr=fqG;:/?;sw\oϬ֔mk|EEQ7Fu&m^|~>~?wi߿}o'\)VD柽6F{'N <_{m+WRumAvn>|wxl-Rral7d_W ûvM=Z9cs/|tG{[>Il'^Pof9D%X|GbPVm( Wϴͪ ](MX~~ƆXm cA>3xWW#6'r)q!㪊;rɺ*[8\p WX#g%Tr |_bKy[.xǫ&aϮ/z{s+ (~ٝ\}b1~/c m7;<>dž \͝[]k4xqfUy3,n>՟|}'zt뙰  ن "lYO\LCe[{@ȽhPW抇ʷ{ï_{ͻpLIUO2~b뱰]$$J8XWZWd֓!tP^[ijh=̳be'@Z\gCŞ;<6΋LW QqEl*?G,v?;1ʒf aH%Ӳ|)j\)*{w 6[)ov)/=]lAxiijlpZۚ3?r<;S9cw%c $]y8m&|BBw]uƅ!Nqнq@} R#cdI.V6[ GJITX5L%JʼGv1,|*Brjy4j*siF`\ܒT<~ /xPx*wBm MKp?jÄ򘈖KgxB\f챆0ó#`=>VR9⫏ xNa;Z㬱dkߕ`r(ta4mw==;N4d(m/ n]ˣVK;;uװ]vJ{t) @,)l .+;}u9W5]mf<ڽ%i;'x)Q~4#pܾGΏ~X9:QloG8~_~g&{ˇP;}G_U{Ϳ벬KyQYyTI#9;N_yzrr~uW~^ug"mnLa꒡zʺ$i*>Һ{z^ѽ;:_ͽZ__OO^v_~ -mq/W~6$[_+wlW ';۽?w~\;/oV89ONv }w`)=:{{Xtf5tǫS7տ9wsbp7ǣ;eoڵ3tl_Vr;Z}?ZW;>snK7xnOⓓc)3;cN^C[nO+jsO'ᄍ^;~pft>pjuG/ׇw_Gϲ뷯^r;EC8}|/w|=;7Gno;vp:t~w>;]?_翹7;L7l|O=eş|7ocU`k;6~>>pԝv K?_ w ;~WOl8g5B~ot}3?qӹƬ׮yit2|xl /_{o|~ϟ< Jy◿|wt|}:qjK/~hsmCHs~k"޿yQ(%gShJ|M\}-1^k6}ߙяv1I{WIhf4+co2GƫؕU`r#jR,¹&iԮW% Qn5CJ )oH3aaW惷_K0 c:u$3k&'O[Jru' e^L?".7Sa ƋGZAg 3^5fqT15>K%)%/1{x"1n ^A l?@J2 d X${9U4}^XJk%OػQGP{Dڣh87WtpU06x[P,{ /v1{q4"7(QA"'/3ϖ!{„dqr<CwlV9 jkf4x3kf=v )-v5p1DK2oW3$t2BT}))ͫr iyOgϞ?>]:g1xUS{ AmnA9  ~I^[>.kޕ7 YÛ`Ck)4"GJ|֛N4O5oD~w8-^{k{ sHF$f-2O7W(TFl_ ,>{>>9)I]q.&++Ow;Y?{~rOGWVv?{վ.Ur>}j} MAZggXZk &ض?)/ߝ'B9D=s/ 5]oyZlDX3"0^evE-&@*z]->k*Bs3pk,'uτ5Qx[5k%v^ =u}O~ ND/eݏ ]S^Ѓq^hx(~W5?7|tH4s=-_Pi*zDGw<6zo/3=1 j c_^4 PGDuZd.(LĨp牠M^Y0ضm {8?1o-Rn27e5KXS qfC=Y`aj#jk=D[  ^D ;1=fzWXBłay2%AKÕ"E񘋬_^oЛ0 +%yJh08\,6{V:= 4G: _76_&9D}F>_пҿ/ Moz5|@)M!$F ؍C6:ျ:ayxخu [+'`%Nia/SKd^P @W{vԗ-ׇZ :P/ gz|!H@q,mB$8{A/@ v {V5yWVQ*`|{XĵTxB$f0! 3LRARS1 "źϾS22"-D#ImAAA Ǐx%4\ Ppx xkcUYx^]]tkcbe5fڊFy)I9&W |FG]%]uiV'Ƣ&@}:ߐsp:()[_b?؇^D' `d2[_?xST7e>dJK7Ɣ &GsWzr=`"Ne08À(dѓMc!-'4bJ,mypKS] uO.õhq>}m-=)i]z5Oюǁn\iB^,C\AtJY0)XM7 ǹ,aîeX)i *cEj/0m- 6啫 4{2'#qK(4Dte?b"ZC9Vy,78fj7za K}5xF΀x7 HDǻ?R®hlG=" !Q-t0B '~0p9|\s3 P!6F^I3ӥ[M, \^SgMf^΍v45B@yiGxVUelT}k#OKCkE)DXlZՄgT9ޛECH*@^*{/!b>1JVJFu$ @-=&ؤBaJKL" k"\19B~#x8r9sq.&Tn1m ,,ʗuSo8T]V. 4bjHmS /L--!4P2ZҨkS$k yqޖ[4Yt- Y8S.* qh?d1RCbIVNo" *Į=t`;9 Cy߻;Gͭʎ2)N8ӱGӧ&K7b{bJu$\~xVQ¸Jb.[fl{3'aLJgKjXlvVKﬦ#f˶xk厲ח`1"h~]qw8_EkY ޾"/8aHN Y!aC,#mA>CQf`uc#)6 Pī'a[Yϰ8? z$zvn/ C}8]?mЩ7zbr z**ѳy,[]Bv3o"F&.tR\sݥrw#F~.[~Fwr :AOocņTY=huZM#2u̘-ʽc{9ӂb.$La֦diSH͜1:7/IBu't;/^\hܶ5Ev>GI0O\#Mʘ9!aUni(j""3S.\,:tod O.džC?LXũ26Y7L&˗Nʴ)&0>P-T5(p^ꜩrp '5U&kz v1wO>^c@k=o;(gRޙ|.𫖍1l1l# t~l m_=]UbeK1Cz4pPӣ3 cj2尬!o9nZ3\-)aٌjqҤfPOG-dmSpIBtHh̾Q[b\XNF"`w8Ȟ@|-3 w,SNgʦuWB$venjKrS!.['|m3W炖$Yf:h;ٮ&sD* BQY3J"8}|'Y~MJ\2Nbq8 E??OZ(wlrq7W[RZPZIrO4# 8#whiZ90f4ʄ,F#ils|,9LJbb4tcyJ<*40Zw7.n=0;$z]w)]u"$H1ze;C]5J];Xl[OÍJ3N×MCwG^kcHU_Z[YYcA8,$ELnp;##3xfhV͈f^tCmv@M왡 Qp^:s[PntřL̀.-ql@jwM [dpef5vr0bpTIO?GǔIh9N56邢֌dG1$A!WcTvuTpdwA&> :G>^`\aŲC<;_/`2qÍ/g_˗po%uK,BWCk;/ss K92CrYDQ$dbR 1RęR0Sr{rڮenZ0ћC)nc#ZӁgBo,9Y=ʁhUT oLz1qr+ji}/-Z4+rXz(n 08< BFGn׋d6?tΉFrXa ǀj6t} &)Ʊ3W2u_G&:)P꾇)(8j}LyFGS c798r*ˑ"-Kz/]\B2W !iSF2uJIIM"%%sKIؾhܜ~l/I29v"--B3䥥;.U}l璲f 1nIlbFn96y{FR$EƘ˘85s斵*-`zt)poWwV-2\PekED1vfx0 {.9gP>! =e?%ˍL`bmh^ARu8yV7;/'T9Kh cjj1w5d['`cfiuekL-G L}IPͥ{hWO~#oLq0g;2*X(Az? ṣCs1b}޹ *&U\~8MMHi:(t7PoAOӋˉlI7ޕXyJt5;^prXb^-0 uYًMvDF< coR&D^eψ+?k~+51 /#7cZcJ~JҊg$cY&<$OQ}P_m@A)>6W̞gj*|E?$3s.Jw X -`%.T!M ASz ԏ-{}͘aƲBE+vEAaOŭ(7ƫ f&g?0Գ̘F`1Kb,%tL,u򊿑bj^ٔ+2CB\'hH(E-kZ M.р=Y/XTcx (ҭ~hLޏedjL s1&*h\q C2K dY j{3L'nL8b& ZXܙteIa)\֛PDY4x.bqiUZ93/rŧ@2\}3 &/%]m  ZuɬG&bDQ((Q 3Ub.= 5抎A^p] mټp$MB%ʞ#=Q.!/q >ES3hEI Ev(d;>䥿cS,r6gҖ&_/%5Z&# 7 ߮q]ڠmdV&hيz$ 6]͞/ >LC+ƀ"dۧVԔƊ-]@ƫpOMl}M%6tsZmU+ZFJ(4Fg'O<ô'_HΜ4$"[I"'t0 DTq7b٩ad!K8AH"(FsRť^޻ *zw^P'IO>O+eӝ >X;0'#ä/NC*e=س6Gղ;Fq9ElXS{(JvGTHYE^!>$}ۤ|twݥK@{f=qpM vϟ?) Dk h->oTcYMt>aE e0u@4iB<_)'Vzt38TzI*&$ Ctp(zG!5M5 BAX BgяXiNxTjmSkwjjG&O%{-آR)=! f>9m80 kb,0 Hm < ii`ʆs?AυhEu${By?^.&~E4=Gσjv|\,*3Zm|\k1T/:&:^]yOAmq FMFc"\Ⱦ&WgQ5ž: UG^y Ls ݫ\rCdQ#7@s#t9E r"!V[է;.tv2"rdk~QXl~'\ = 'sۛwIX{lb-M=RASőPR_%Ak-DYqSlR:X|9b.ǂEA ˧-|SBθPg"U}Z, EPrzlt!s:>ޙW缃W\ M`FP|! A=EX//BxiXҝP"bA}9D^y å?wO*, ~zEC^= 1ZmH!Ћd<ˆ'>1Znx3XCD <ӮW[DA,zĝX}&VBl`vD aM gƍ7僠g!ZgDg @/(79XLE>$wHfC|o8$r^In`IX2N*UyCrYfuur2{Pj^>.zDfu}Tٞ;;iťuq,5gן-/tJ/Dc|{羻M:wd/px{v ddet&K/\K8w eu^=Ԏ#=-{p:$ۘEQ~鋗/ K>;;r:Pyh? =giQŝdk9$%f3Õ*SKh .Wr4* О,W'WX _BwiݺiwsgDڕvJ;Z%.13IΡrΥr-Nx]VIFx]VA3xW'l9NF:oZ-Ùѫ[BǬi٫d yg#>y:˞ɷhz}di~Vr=Iru)g;2G9F.ewYMy ex5$Dx/'=[<:Eݖj6܎Qk`gZs\϶}Q _1?. @tҵDټMzJhTi*)yAaoq1Wd̿JoD>v| ]~2Ț&d ] O(eQ%iəGxxwQ;U^2kkSKpo-JI éaKDI;*Ȅ7Ni9/bjƇI'pH!!CvGO#ϡ`Wy@*B NylmEQߐO*oާ Bd`9yަ$D.u8CGλ:3Lh@~Z ~N`e _RY?6z P>7 ysjcՊZWLʪW4r&p 4?fp׎qC[[Blޠ3yX+>f ov=2zHe__ *Ro6eChd Ek0Rd`vd`)41 ,YB sBEZ8'Λ [$~Sr PĔe2[Y^QHJLfrs B߈SyGfD\^E1! 2%peZ&قSCuN|R:IDq>)敛"l1uD7ru.ĕ!ނ\IQ֎?'T&1Nh'r^QFlٛWlIeh(knjJlpXfLD.dyf=r**Vu9TdZI(CTX`|˟K"y}`ɓyBcxu%wӨq}4hB+&0 KI\Xgj(kU6#%h7"#/6Jwe\p+ \ʅbI&EYVdQw*r:r2ӮDFD ldFfZQpSi3L>HW2Da}m> c>&r̮(aD|(gSϊ)2F Y3Z1C?9:zO'귢(Ŧs>Oz!gzM#sҀK2vd#sZStEKpblj˲W-::͂sGۣ(+P|~y3qpD87PԱlŔp$MmѺAjM/uӮs6i$B"3ow8IL/"q$+deBJ 1_^pe(jY ?GUhdsQ6] ##l;8=  cJa?AӋK*^NՄ5ɾ +! XlZ˱O2Oԝ߲mI_qƤ{ZnJ =ڞ!K]gK~<#1Y{Kc.n{cusWW>Kƹ\:g $dC |lT>lb.G3]484OD|4K~_7yY2 1c.# Lʄԏ'iת=i 7Le4YÊ#3D3K-8nQO% oH~Z5%*BG2\h;N7 dzsɁVhuf`rU.O/Y~vPC=T| Xϑe<1V'Iў0Zg<z|26L+5l6?;Ȃhў[ZtV-i3b|Xtx/=7qG^.b++-?5NCc@' +q벡 'N)E敐^ۚZ~.9+ ɹ`A^v"d7GI:E%dҎ&겍{0Ǩ$bڑOW#EMT.: qP\{^ן{~J8J+H]%+\Jb}~NYl̀!+\]UtP<;i^Ӵ *B%T5 g3߳`#晭 WKoCˬTpLf)?h6+gtg*e-eQF[RK$c D<[eׄmuRW̃dDB [%lK]&Q&[ԥUL]"GN&]S]c̤jԡUL%~V%Bux[TmU2IC&)3bSiHDuɨlJ?"Ԇm̦|mJ=F\8[T1db;VLTbqlJ6V)T8h[TZ j&9RnRI K,D@/\JQ"ܖN*-`X:r!ϮaJ!V#<묢J*z1[+b,lT#j*b֪68[CKK]FpkiDVM]QJB.Nw4^E 6F7$ImQaUjlpv9Owlf㝁FdS B=]^f[(s <{6d h!EΙ/r `X Aef%}َDkvRo=Ko^I, j 1 8қfCUD wn0kɖ8܅Gl7wg=5,G jiCte"8%)W"hS.)o;@G1yv,I ~[jUN^as(ү@.Y?;)=Z㱒giQhyZ>Z|"鼏(§G/S7#Bvڠy|-g|-yU|-z~-Lp-Lp-Lsp-Lap-@Z=vv"P^uw>`{FRX# X(ŧ@b$z'{f4t)S\0gX,kZL"C9§k2G*| j}~QiU#2ΡϾZƼڵty9C;u඿alKX[) ؙ䛠$HEK,qկ(B_k }Y[2Ht%MU&6 Ձm[O2xp- nNVRۏwʻ,D'f!w/$-t/Qv^-- hȪK66XbYˆLךtCf%b3 J8Xn2^b56kpPwm}% ;TT 9{=y# t!%Mxp3ˮCg:~g'?vymOARuqÒW]R?d`7+ ! =-ۀ"9?j0}/HpQ4І6*&H&+jvp`2q_ςTt=3ϡ\H=H8" ahn!Gz%|o(Z€{BA3 C\Ej? ~+J0b@p#w^fv/_%^"H 녂Xޑ2w<8;9 U~^L.exYC~Z6w:@"`F^izz&p }qZkk7kQw'il=Ǔ[aRtǦUuڿ+h$^r1@]u/PucnFwpw^γo;/΋onoX[l Ȥ5qmm/|γ^^x6Oo_|ς?UؿH_D}h5Gx/VWֹMAra]o{qi;`s(y)qg@–$61W\]]h8w;ϔ=0igIb 9Gvǩ2uCP!`GA8}a8H$0a;oC7zpu-+Y`VW( h {QQDZ&c%CiGYfittZ"x)VNՊrxQUl.C4.vcnzSwq#Bt/ߛ t8EJ9дAvU9 xPm ;B-Q ` nS;k篃% `;^⳿n#0L;6;1@6[o. onX0Gkoo]sBhͿànua݁:^8#Rt+(M݌w Eyj5\ h? }f=g$ xC<0&{ՒZ;kTor/mSQg:jXfn45 v<К*kGպ:,6x̎4t\d!7NBZ~RkX\SyC 0ϿMkumvLa Cs|@]E4X=w#ۉq=݊8kF.6ȝ!CiFQB0LƱ7 8Ai]7ˮYS^ySoQА$ځw>h죩 'mR:mߑa@j\iӘLa!yWљx:IJxL=چKco"'1U,48S40Wqt:emB`,ȀjZ6C$]: V'%/LF~qP+`׿LB6;OPd{B0"ciUqMl8 8 8dM"pȂ@HYxf 3[x{x㜶jr;Si.;,Y.q-ԋb61 Y+fM(Y7{ZKTf4d,QgXuv 6?|( drU =hKk %zF[L|t@neѨ|2 + 0f+[$5*V{CMҁZ4ABݴ) .RӂrZ>PUoTe'ޣ'nS.o>[ut\ţ}NBٕaW8m5ҍv4o@WSQ쵳KI* 5L@hmծ7ҩ1˶vۢԋT/1oQ{O‰E!Q"!i.rx ?Ip*P.rjVQVIvFFbog[}樣[]*]7Xw#uޜ>*ר\{5Ø%o?%_[gc*4n)k+?Œt [ Gee9<>!os k:kCLhBgH{1-lx#@K,Zw`utwiNU[P,6zU`7 -`fX?TO/`|iKlIz  ŕ7K^QQ!p} ms17kx"@{\c`^Ki+ >`.")9>L:.&> 36!gm> lق$kٻ8cg*z=&מ7CFRoFC$pKMUfE=<=LQC!נ05W"~Ho(w 嗞=p lgkߟL8i4JUڥf nrjſ vE?y%`1%h"`Lu2Oɘʽĉ}ﺄ/1t7v%>ZoB!+W!!JMé 8 ˀd%(7$P8j6AoUyzW*=X%|1$PxE<_4aYvyWiՐD_ ꠢ_uj{~hc{U*m^W6ͬxiֆbPoWkj#[hĠZ:iK5Qɚ֪:(zB{vZiuճJNm;cW@>7yV{[ktXr| u z--~@c%>UC z_i/! }%'75Wa&@Fjxconw<@1ZoZ{7ۄvBu(!x _+vkEv|8 h > ,h#\y mq4S $i:`Y.xD@Zfu{T\7UGHw5W SK/{4n۴cuml%Zy -W^#frǣ"ǰyV&>cGɻ7WcA2&_¿C`b˲1yf6^]vAT(b>ČbVSmLk aD4:Hʼn'lʊzQH?`Onmq-_$Le;/ʻn%7w}WY^S]-)y!I]7/7~ vNyPc1q\ vJ/JOwmzJ俨+\%XB.I< ăb VtS䛝~&Xzvwedl!##n6Eh:cK2c Kor.1!j5}M!~hv-,RFIA1KLD76ooL|E U-w%{<,N]di=`=%A"8Z g|$KHS/ ѳ?IOGoW{ w7+5 Zua'[7(8hkݵet9;ۃ!z#`iNyLXtϫ"x}(9GA#q.Qh<9xa'w;S2!E|'BeQG>6NhaQooZGgd3ZG@2#MMc&lX(6^<`GvM !NH\څ qy ,[k!B ڎ3qtelRh&Who%0<wN+ޤd|M`xx  ،`>?II zL%QoЉBԄ%HۓQ|Lnvn )W0Юfg]>ɨv_FOe/2H ;U0yT_t=6Iqz-'9"SC)7 ,ۥa KAh9j7K9djKx΃!sc&9Y-OI:d\ 3,̖jg{3d/%%"pBդeH3Y hUJ2v5, `yd鿏M1zE.6bX( B @9J0p-:wϐ]3В)jsS&Iˆ-VpI%;l&s):Kah} l.?IW?87JS["zdLS (+i1L;Glikr4Go, a":KBa`5fcZLGzI1m\<K=GeĎҪĝ.]bt3T Fe,R,[4*:$/l䙵6K@"enzna$s4d{QجR,Wı7 x)2rFsXGets}e>@a%@BWYuy6 3'qi)5w@J n1nUžsNa(S#.{Ƽݵ41"6K}f;\\|YL_T譣:( 7qxZ/W0iw\5fL1C5/^E%q<(Px" D&0aQc c4*fm1<GQ`6H& /׽acԁ(oO!b5D.~r]KC ,T\,qBں!Ow+B)E?*J):PbRt;lj28OsiRE.ôUn.8y)Hr 5O  KC3rL֥ZpͺwB ȉ) %c |> #}8ʞ`\>/=alqoΒ!{HE, 1DGD$"1MNXbo`ű$a^AXT/sX0:lWj~6xx7[ɶg1w ZP8⮬e3bhWoAߘꢽʦ`m1Au$ oUiTAߎ ^~wi1X7i& =b4е镧CB7joc=/xc*N.'{Q{ RГ;jDoRHpz. R7E ȵ7k[f0m6>LxnaP2?jޠbʁsޛURpvAJDURa~yDT2o "vMs<6`< r*sK">6^^,dg\ oƫˍZ L S9o Wx5]ΩRM*ڞS<ĸ>7ɅCӥVK P O +~%/?e±O/k?R iV9!UQq6,̕TKaqӦ0TAӅg&ES SK$g* [i"I(i/`~M8~ qؓPzjdlh-Σ\laa —q'L5_L[MFeem( #y2Dʶsݟ7ne݄'ЦU)丏#677eȵa*)B_\'nՌ+e(+XRT"U "z|%7zo\# 'KLbUqy.~>FbH PUMq@1O=pE  )B2yx477Qt ;>qWippth `vV;cD9Ayc ٓ82oY(1SS]GNK]3`?U3R,TEMZ8VԨ ` V"cH/xc6!G=bQy(n͉Hyy/dӺj6gm[T|(dTGI#/ԙaJ*ڳ Ev:>lZIݠglDNO%{?Z=q:Ǥw4>GZE䚄!;j✜ÅDLKݢ"lW6>,*X;f 1 7ӊ(ݮw;t OYaȂY{aqkK(r.‹sO<\bo :MYfFZwcHMsD{WV9x_JKH{8~ȩ)ԁs6349luaudf*k6TAi< Е4ń&[XoɌNg(ŮVb jl72FqJ6] U./QF(q(XJmN"#-n2r&Dh4{'WHMᛡY1(O?ڗ q Y(UoWx9+Bm!w8]rr*+@ ِ{uKIp 8~ۏ"%~33FXҝjqjt&%kh3,b%u89PsN.Pug38)CHE3cٻz9j;Ztdn@F IFu@rY(ުe[7 GI tnn#aT;~a-9j\uSo uX7H0><`~briwnjGEV݉Ams<DޔaOsXtZhƴWgNx-)t(3|-W _N؁/\ޜ[>kiȳbC4 t]!b!1^8k]r\F˟m PClPo;gt- ͘?/>ݑ1_oԫN`_56@ a!٘eUlt!7aGkʼ[{Ek 'sXM"V]$PC =C3Ң$/,0.I?r{ta~Z{aYE-E) ti:QZx:T;E.i7@]|0)>+d(}ETkUWP7Z_ch #?D+7É%)R|z=nw7AЋA8Gh\ ⦠|?ݼ 7(F(LeI5.s ̊jo=lψ7+ yW=]YYj_"3siS3(#9LV'>x.2[ 1{~bO8mFH׎Bsl_ ! wmMÉ%ݜXf=F2YM*MN;;9aC~ꨬ臱n7\dxU.r뎦hWxOw ڤiYr"I=1UHGNyr7Z֫qV'd77e Frn*՗'Kks<4%O 8,b'+y %DD#>=poLڎjԊJ:-LIw2ȍN- jNB0/_ʞsarAD% fX߄ J_6k\-Dt*K>c  ttxLw?~o *}@`y T/Әm7c6녭[s?[ a9GCA^X~ =1Sˮ&ՁD.ի|Epv,k]`aGW }cr펇<%q q EdNB3 MPOs*&(a펐8{ervR|%QV,bQ^,.rhPZc(b %S-wYzm~ˆaT߶,!̎D@؉ |u%\1(D0">@܁b{xƹq~'D{C9 .35*8yh|Ж go9;iok N75a^}j~y=ZRnG.j*J#[ZIٿtGXөAV"}H;54LJSYhvMш_>X=f)HYGsurνM2Qљ]^ t!L]n&H) 'ywxlQ~5RoFYX?A i)]W ,`43A5z2`|KaPC o)GnH&*`'&AP=>Ĩah|%GOy hL.kFI=P+9fր\jFjXĀHz^(Iq~ SۨbESQET_J9/Mի䫼{8°)<-W2<`n"JEKY=lm pXihܟR#`ݥ;q݉`ݥG*s"XwaQoQ;HJv/E&Pm GǹJl1reG_mS>;^ ih)^Y#x:hsw-Xk^|\֌n󑐈7_sq.>kKj5]BK"ZfFS$;pOG1&P%з' 4R 6H:b:XQݬ.ju1 Iseb\ #6@teA9j)ȩLz]d[[yaqt yD{L1AV_LtnaZ0}=emC-#kkkX߈CJa|N81s:eb Ǘ+G ߯NQ̛h:Gc]M˟vSwXz(Ǽ=TI<~t\OR1Fl!Rf^oPwwFP 'K<>Ց^)a:f >ŊxmT1`HPjAR$w Y=WY u^M=^;X@`;~\..uX!2| w̜ )N Ёq%KeLāӠ}~^1V7];6yt!=a!OhՈ֛ tb8P1yxB_  ,P$O2 !w#L$]r&3DK_(9` 2Wt4/NC∍0D1J|֛l[vC%U+Ч]Zߣ%FcV{4;05b˪դ RG?4:.2~OiPL0xb(9q |!I%|jw1Dx/Ґ!%).~+6 syz]pu\jtMp*q)o>B<]P?CfҦDACיi,\HZ,gJblWNh "/a٘^oX>) F`mNURx5vz^941uM&ádao]l[03k̋I~&ni`1yZ^dV9Rt|wzМ#2\Gt7[}RMM&*]]u#ԚL i5y\{_.-lWC!v;v!A&XD,:f1͸ ,0Xv-/۟چQmj-} nqW c8njLv2(r˵[jZU"l\So0Y[+J❵"O;^sqx FѺr[ԍD[򝵢q$i3&SR& jGuX<~\\<+WrѿmcnFwpw^γo;/΋onoP^x[1[w8L~ـ=t+wvy2|^xFc.?ygOxl?-?@4AzuT~\cʉvQWQ{)-@8=oCT>OgǵvviT\Hfg E@hmծ7ҩ1˶vۢHslE ꗠkwܓpD `Y$\_dQ@ |ž-p#5)"C)]Db=rG& d 5[ q7*ueWqMx첋nWkkZ0ݲwՍf VQGՁݎcEYN<;4:Iu#uޜ>*ר\{5`.Ͽkxsً{㍯NXD݀ >Am0N1OKt ( p+a)9pSLݛ4>xwz>y|^ Zؗ ;ѧG{ұ `G#X GɏiNU[P,*%"B* ?C8'FV0?v/%͐x&6eD y k\{`lW~kp5a}\]& S+u/{?;'xؚF|=duy Pܲ`K6]baw|;݌cp܋'˒bzktS~an!CWCY: (YQOA\Zp-:i/e*A٪} HFk W sԲ;AVf=G">%[@r٪ .fV;VG,kߐo]]+,1]BŖU#0 C1QmdTV9x[΋0B_ \n^G>yq0Eׄ(@]X^UTX#%˔([$-ur_bvewWrop="hW3)|8t^q(lixmϷG5'k#@|UPzQ]ۡWFb VF Р.qhGUF1K)wMP}f3AE[|wוx^E~ n%! %;7# nUJwZS9c 8 F9>;m+3PXH`4;-ڪuZ;9I:o7+-ґOV6Fak^ex %MVUϋNc4A!ХK_P'1POz%aq0 N"sxx,!Xh"zBoAs t<, ܌“:.nGSo$^sci4,e!UTA P)7E*9i(ǔ =᜻!`4ckH)&~ǯ+H|"d+ͳG۬ ØP0Ֆn"5gta`] ūC)c۔6]( "MC%Q%y'7Z"ko5yA}~YM|Cl+7:,4w#!7 ϳ d_,^/yvC /]@/X#3r(`*!%Dy]|Ta䟾ؒbeU9[FG5ܰ<2$P$0`Fmma`%)%j圦$s sxT%]E($5.yrtvH]{lzfa{q'(-w9"j"%($[ekxVbk_hi E51kfw"+sc`3sF D1D}cL\}$%&"\z-"upvd v ߒNI蜂#v/ȇxFyFFkнWz0άoمP^"TTG:uI'GVn8^y ez[G <:ɻ)(: ktmYx +Sb07b:A1ReQV,nU 5(MиE[*P80b`k2Hݙ* iW Dˉ}u@h&M'H0߽=}luF4_TX6N]9]F*6O*ɒӹӽ@>ln-jsZ~_,ʥi*fnJ,!.K2[ͻKI|Lܓ8pwM7*q܊⪶)TcWJ"hqA%;7M+ 깸c(];{>4m pTn^|+;T?=$X%gͅI[Cdr/VsA||%FA.FkGnh7" 3CMSZn,>/6si6{قy(%ċq]]qtԉn7sd[m˅"Wv F%"HǸs"*?zw2q(Z] )/ 5~H[p [ͣ wg(%8wG4>^Z; }έ!n(eW7DToqxwVE*|lK% gKxwXoQB~2˻|ErDο)Ӟݩ72Gr'%h< nY$'Jŝ[Bme"rDBP{a',_YB̯@3 t@A?BWλ['GQ.x-18[=Iv XcܭSx9ԇw'w#bnA*'/($5!׌+ p+SRڧVHDituF4$4|-.mΒ#G#H\B TzUDT2(0GefF[`Q-kIxiҹG1܆c>;t*Ba)>EgXC((QzMzU|.=8h=%zLhDߩJ6ؽE(YlPπ}vbWT~`]SyP6 `Q{Z̥^:N3"#"TR2&iNP\ݳu>NŸVr J #Ё=?bq4qdaW!k~LajϿ )H2rS<<"-V4bu# eTt">osv,'@xk"N|i&I]xsB@wZ5oMwx` wA?7@gt~aUNeM"2AT J'|P,[%gu<gc;F^6$/e@ "oW /_ c|”ʳ>Mɡqxzcūv7pG}-&14%U&QE酬Q,r Z"hkɺз{EhQ[F<8w[]am;љ\_Nؼ\U攌Cmt:D5]ѽ:{ϰN<FឹNCtKIzht(X/u $P\e50Qz~ו>z.ë^=1ar W%~Y$W^̔hVXFV}x-zumF{lFe6*bEj.kb*d X;RJ)TFr蚌!qr\IJ佶 [ sqei$l ̼ǔ*JNd "#$%L'ڛ[B&vy0̅7T~r7Ɋu|e4z(nRq!PN j;^iƖ8"ia7;HW='dN噿(gH4ǘo8e~|NXw6rew5!$_3V9SYjfZcAg7zչȀfsZh :h6}W8ZU!9 E- h"Z?cX-X8z(Һn]waF i4m(F G'D%뻳ȹ Ƶ˾++fn<9.{~J1wGUE]d] HVbۻ̀9a'@6$L+bNǪbCi!cq$Egb >dFڎ8&E"5)]zĄ*KC#԰EM,a %&I<+! Bo{*v\|iCQ@f!({dPV>bDM8W{Ow"L)nHH. ɭ?NeQHp,,ϝ/l/NXa{# Ί G}BmeiC0 !?3OXxzN`FSlVd)y C]lkV  c;MkDhKtsAh6BEY#\ʷ.j V1b­,\7A#E:~O'j3 M苼]i ȅ|nDh=blfclSECɔn86MB]GK{ۛ޹ g.s;j'zxߎ˗JBRPjiCGP=${xj1h{,NAD(b*| te |#}i7y\6CLILP8UͳFC %t얡>GtWa(m=A3:r7-ٚ4f>),('jz#~iW0*OM%32.C {Q 0j$@4m(X `4ǟ Z%M<PR&֍ ans[!AtE5SyU$u< =aY&8R"ͻ_[QFp]O j*Tzt\%mYa)}) D/tDyhDp^["g14vXG D" cȅ mFUg, : #׏(ho^(]ՓW 7TU04.pnxaR5GHjX)Ϋ81 F}DCqBGET,ȥ8sN{$)hS<7~pDEAj;}ը˧ҋӝ%E>?MlFBG% ->bP7C񞗳q  ]ZiRIǿpQ483Ȏ s9ІsaGDs}G0BBڕ@f>n0~i[eoq5.Pg#dDBK$'AȄWMV$QQGLOx3qZN&<ʾb8DHJ1WE +i6^ŰR0_yyhxq B,a]~Oe+w5 xz>cr!o09;2Cp?eV?N0}KJ1 ] ZDKz 6@Þp/?HBJGI7JOzekoWE?j$'ҔG#7~vTUZm]#WZBMaѴ)2 {}<7.08kdMT$.xw?!^n$\FxS,Yc?G^/iW t<]+da]rZVFgY- gr=0I;H!K=@)׬-iM7G!)$)I­C/`$ Qn>SjfbL")Fg%8{}GbFW̓ :F]N*J e뻳G܉8#!',<=TdT<Ւ}/uEG36>tI֢ Df nAz_(.0fV.9X}o\/[(gt԰їi+D,q ޖxmG{*87XiOFfq9lG4+)t(hyR7n K%fx懚kk)g<%31} >!(i`Q(4?3E31xqLrś`*tj|A]g^yq3}5Ju,M䘋a(eRrri3TMiK6;ЌFӉt7 qE99#<i|!K\&%NuFh<&0waUlw%nsS9>6  e#H>\X}ˤm,iqK66kn6:h AP7mtUoE4h7ZFH9(Km$ބBYj#%63_>nv t;zOﳧyً;϶gORi)pA d>>+ 4/u{/7}}~mb-_vw}yww^lmw{ A7o5p pyZ_tu`,kTNjbe2jՎ v '{T>i٥ɤ&="nUͲxwPԘw[r[;?DYҋT/1Q@IOZڪv6(̄U`\Pn%V:q<CVC!uEEI=kT ][Q/ݭaUkT)i`n4;oC VQGa`t;pn픷% -JS7 ӮQ)FUݫyZb/?M}/Jv֗0GG dP fcrCl2c|JH0M*^"aq1|10ؽ#|^V kb_ڢ/`Sgَ$;Q`B [$sk W*cHLEv|8 h > ,h#\y * v h%N77$w&zWo׊0K6U#0$֡ըD/cEav] zl.w7ci؆!V8dVl*cg*̰nIUjM4wkz\jWdV]W =Hk\ػ/~?PL}^UW;GQ۩t:m 2 >xr.A JP!*#]לvv꼩!\tTnKw8U( 3I.Kp]# ]d`n.JҝEUHg,_A[k;x2$({4ŜХwxQ< MrEDCCC݊D4v)O>O ĵHxqgW6@;t1 O 4;bNUp9nh0f}$Se~yс YznQīT+q1)~BdݍW{$:JAO H:>m@xH$ jŧ {; w'A#+]PBX']8󹕎}l$Ir?VT .Hih\Ÿ{ )9=[t7AU82ڕ.o!)싗bGr˲Km߹ ݧhiu|,OO +o"@HˎL[20FbQ.>rJ.KGdl# c2X2 &,2@7ж?A *q.fPi@>ހ|`>y0|*'3iQ'۟|r@>~{Bpy܇5^`bBFgR% o2 lL ;%YQc*'K8%-d>Y^],@C=T)I.Q;.^%]j;XdE+~Þ{ g'$1}U|Y)]gUEV|ɹm܏<MpAޜ-PAt0Ml݌.zrJRO݄-|cЭ ?'?Xn,7_t0<ű>Zx`Ȣ :CBxX%>%v?]2.iC%?[=kROpT=xR=HT*jbCTWEʌl΋D/??q2j"@=ܙj{l(mĺ,uuKۇOq>=}z!CܧOqORi 0Es;fg#x.v08*|P1iRP׸J[JFTku?x#Wiac*D5L1K7⦟^b3M~J6\ J$O$k= ôh= . 7΅v1EH{1fݱI.(nj,80sJh[|i *ppKhOЎ??_6JmWD48<rp٠y`!#\'cU:Xh6^ |kt}t]~Mu_84LN-FI4ԳgUbܷ\xĐC_dO(gf 0va鴓Tb-^$aj 8*_'9޳2e-0+Sf!P,C6o;XiU.U@ ^cҋB6*J7!Ig=j5M̚RSr ,ѼQ)cFژ,u&(eDL\P ~\Z99 ԰G4DUa=iUsT9njP6*8>,7v?O.FxQ*1Ez Rhrqan@y-2AoR4&l/[ɼ<41*EN*+Em E˟6JqXUfsd"N}Ħ%k@Q,;[ףKKΐp4oy @5y8H* 0.&mJy3Κ "koTl*i"V1: : Y{brd)+!m6xnHQ35A;*.M-g,#Di@ Sƒ1Yx' k ܞ U:Ɏ;1p6iLKYFyB`?Idȴ}{xg2dch~?jl/ =jbYY"+zn:=.~s 1(,rQgUNq0㔘9l4+G\Cخ񴞴!Oޣ}m\sc5[5P p:`dw#P0sQP(_x$EL*m)IPc<ד&_d &[gy 8Xixp~zY 0 Go\d wKeqWɜ=^zP8cY1IUQҖ Ii zQ˅v4v}u.q,4DLJ^Seٓ'\|.>e7eDCY o$_,GwVP}ܓ% Mچ/F PC<] ͈ ClXU㶲o`W~jJEzd.6jheP@"'Ny5uJ&Gd^,c6Sۜ":8gi$e~ %3+~gO~40"?Ӯx{Oa:icHqZeJl}5~#ΜKb(] NPHo>H5!VPrE4r ae)d߉ 8QW^ .L}lu_w&aFU;ivjr0&^ϲ榐93JUL'rOyVHH^\|)Ĕ~INuzWŔjVW 0,d˙Xvt:`.*B\mz읽s[y2lZ{]vz#RMrd0YEEw,U,S)ږw ^rY4͚9b-%# &.[Y]p(jF)ȗx⌯k-V [#qVKIrZ(0Efis'YmcJ xlf <()HF6)tˡ='.4W5*d) 'ee.uSwQJoͤt2@Xh5kQgւ1f72WAX'"nxG!sĜ qĴdMk=:Վ!PU+ĨNZmbѻ.(P Gst֨4jCr/nl28|{NO3/b^f Gy2FI7qsED{'_|#'VCb ʕwRod&=RP_KO>}r'$* NDW:y BI}vgNݒb_Јu/ K= Y*wUUED4p|M/ADZ 4sz{C)Cm(z9jX`wP4TUrj5#Pڿ?CoaGW Q,bER,C͸>ְ!EgWew4?>ڏѐ-U1p!r|1Prgnj*n:t* @&OYb$Jߊk+<nq\%CFdp9ҝA=q/0uj"WCg?qYְc$´-W5[&lZ$[l ZLjIǻ(uksde$7A7Ep`fG5qZonM|Q<iL*T[6iG4 Y"(#Q^*$Э 6.# K#tjsZ~_+JHd@=.Gc2q6Nͯ cA9}W''`3F~m8 :q")1&q{Dsm }抋h]pS7<]p1Hb-Bz֢Wej2a9p:/NЌc#Ĝǥ h&Y̮9O3PYq#of_$i¨QqjhljggFc_S=}nCg"\5eF0*L%,BKfPrͻ˞CfK-8F9t4 #b X618frN{O~ KmX7lQ'hHIai)Ȕ2 eN+{VVg䷛3+F78C۾Vd{j"E3$n3gw\#m%)m^Xr,'o4H3L%y'Q>F#O٧;5\&=;3 dYO$`Nwۥ8C#!Eg}z~Kз%՗"!g({F JJ0Izf&Eé8iԭ:_/hW:U[9LIhzG ^B3'Oe< /[s~L-[ob[C{cW:=}5޹?إ9<ӫ ~v>Yψ$hXQA} ~< x2CK,NK2vR̤y(r}yBEFFKvXl~V=/O4xLfNVp&'J*Q~7ȍ) sا@P^.9祪h?"+;lg@?J!E3oQNkb_.;ދȥB.IQ5f zQNmpݥ;aRodLTjR |)fYi3("nq*U'lr7,VXW_ڟ{.f (7łXmj$,)|e*8"^X<;RsPoS}|M2΢EϧS?l?n_2¤Ych-2޾lړM{nv+bҎqv@!\Gc\KeEX&^~0t?%[-a(˸ 6oD{>cLFar;: {]1`|:a SUON;v0$нF}l< wnbFdi}z\E 4 ۜM>e`3>'39YWcSՅ_vl)v(R>vi.kӊ߃]k'y:reqּJ_qNK6y=5Yr^k#lj:}o~*;F2HN>qz6 5YեOJAJx:{付=vo!"_Hwx$ˤ 33yeN]w>tkS%%6wmf)RO 9Ғ >s h3h>Lihi? "O`ϧN`tˌyO`= ~R˙V*RW+KxƎ񊗽_M&/',:PaͨŎ, k)gh+_{̛3p+p_sѥֶ'~lA-%J2FA) ,0Ʊ ;META 7y'#^?BXPS}lm>Iz.ѵOkî mfO!2qOV^7X}[4=cKġ "~qs "N~GF,֟sYYԆtԾW{w݂GSf.9EjKW{^7c,Gx>`8xpH Q- w>Ը?߉RoMs1ܮ~^(w {t%Q8&i:T󻱌"{]j ejtOYez0%Θc~…u[ U}.9j~scȖN띩}Kn˨W5A$(A,M̕<ߒЗ*r-f_%yHT8qe5,~F7=f|+ՁwGsY\+fKg ?*m'HR1ch]w Q^P~wcc=x_{ς1kTg sa0zzr%:0`v]l# .kyn*i7Eim5V]K&+[&/g3qך7,yZsGfk$a{ '[ 閈v`r ⒍A C9Ou2쮂HcAy_~ /,O_P.J`YL|1`/,=Hy?2{0c=l[d|0?ڿvCy|?E F\:x4=?E͎N*ա1_^a~T Vl$ .j-۩c*>L_\̎ =ؾ>yAzAL8MHKʖrW >c2eH9͎hߑ; 0Q_k̰?3* 8kqȿi)bѐd4Y25sӋL/mfM2smBBLK\C Ϙ.B90t 1[[[0P^G#H! (i&.3Ť³!("34lx6BD QzTi 7kU}`,^8 ^V =*EF3cQ;'9܁ .p*G,7]v7#-;0\j|5+>i1|wdDwO (cΥ2GR9*B2,;$d \!S.zn" k'7D6 c!BPz(OAj{jz-`Vaw&)FuRkK?rT Ǭ8kkY{ DnP`eL:R7Džo;%q3!Yeml`HoWڝi`oU족hLwܬWg8jf~~@ jg5@c3T^!u) HȹFn /St®p4)V+N01 ʃop $XdP Zd5"K:h^څUq@ٹuc!P__ݮן2GoIH/dMĬjL-/ʣ5LnG)Jtޟ֜juLf%nկQ!vPӅX!$m1!WTɤLcC^l(T0vFwyaM[w(;,/Cr(KG9/Axci-RQ|z<ȗǘ2qnVK4l9( M_TUG|rØu*  5UNx˛\!<y8a}0 TU65Œ} >(ԛ^R.LEV {^9\tո+7,T>\ {t\xOf2qsac!;$&}tq3Zy۵k08f7%ZDo [}7ȱIG1{a+c#G tIao[bC'^jJ,hkl5:k 2ܦvE 评uڟt/F>.r(uPyL]&keںǞKx%T#$zw1Y VFQ,iOd6 ahGL5QΈv8~`kGD5ώk7i (dRi㵡Ľa#0!y({d=v}I)` cw8O$jf wBR݋]HqQ <CΙ7Ө|m}@$~I0r=d7 sbg9/Nx(Jz2'nW`RNΦ"@?JԞB%oV^:avuqXS #$K9# Qޑ*?%Z,9|8N;^[rݚ:@M;^Xf J|Y p@@%񞕈PȞ/{#%ͽui#DL(N=4߼9-RAm̴zs}^A < et]!ܙ @K&Ctm~ƭ3'^4_ƹrϜ)_*"\8}b:7urnwש[э2gH'n=l|Dj94$)&lDFMM. w)y]d8#ÄN5QQp2( Mc FK dtw/'3 ,Cg~p%aWh I:E*1OIC>EFJ:\􄿉ѷ 4DX쀴X4IUNF@S1 p#Ջ~NNLS+YT7Ti" _3 ]#`O7)a /Xjz@Mس$I~ICՍMm?ؠO0$|Fl>l$d&/&Z3[2±|{Vкb0`) A6@KV=t>hK짛R$RɒsNVw+e g&p-MTسy[K` O]F`O _Xhs/hg>mMxz?^; $+x TWV't`oFs>&5;2H= t,L̊V݈]^F,6a07JNѳFQ;p^:~K-Q=.?<)F1sJxTNjr?DuDjouk b!/.C++F I 0l /ZӠ;,ԹrC΋s fuKh'Nvbf*DQް QB w8;>N{I3c*kD>"]YcuɊJr%у}t}ІAfHR(ʅ9\yWm"j((361 hL%](= ].^;A_NI:"6t0ZPOPMTNYL4G)gG15m暷4BMjTA_8+Fg;SP^$8`YE4E`mc|݅쀍GYJԤdIMi,H*FwNq3HByfdNcH9;]h(ҥj5 x(G;+!'4X\1_oMVP~0"ۜᙅV+T_4ATdsU 0ęNư?ixj>"3` .7!m;.fw=M̳,y?%๒Ǵ$yi?hƪ``ަ^]lt :MlM} &^0U ƈVi : ŨI, n(1iˌ #])=x:; zƅq0 ~ !evmHA=hm !.}h0 F\]F,RY}`h&Dd܃ًb%$GKBItn&@0Q𐫑qtxC lS)^pŭSКcRJz(`;u(.L\OsN 'zMJ#`Z-ӯ>sYd 2!N4Q&4DčC&&@Ib)VCѬ|([[2/r$ϹWRōr a@-HnOY{9#xVGYex//ق%/D25 ݪa .?V9Tu5} [c܎]T(<2ڦm V7s|D+ч+F[-n-F^SQAnJ_Tʫ<ʪ&foR>T'@G*b[`K,>3`F1 0hr=YxڿB@m_slLvv 8Jnu73CT*JR<'N ӓEpas?-4 p;9>D WYDDQO]Iάˮu'tU AGjY xQirMBÖRn5#G2LMo^sHQKE4W~h"i?ӰB .jJ;d11$0BL7`yĢ3qt=gACHbN% F: v`x( _Qv`p`*K>ɒօpJ² 昢ScO/#KPe^$uېaKm1c&Rf"n\{ pxQ1)#,Vvl v9j"} O0:K|A=V~RT:b&%{&=Õ}Jn M).Hxz/U:G'd&C~9_q WPff Kgo}=N5:'bv[m$<<O 2h m8 (fTh!e K/R ˷+1{P*8^]q`LRQR&!p:_Ę"9hu,cٱNT + 54a$\ 6OOj>[RVgx=L[j=2DI|%-ōb"JE@h/:ÑS"N],?[qU( o =|YU;F_)Օ_ёd 1QE T` ~ф_ y>^',Mp4~b"`h'r ~S,g!|gi'Ԑ<(CJ+h8nыU . rg'WY]<-x lSnFNmO#N&wpOΆ #'9˗b&TY^t|itWK6[}S!'c ;[NaaOkٝI=?# !,3+M? uB~.7O4 DzA~ZTwu~ FVkA%i3c;~Q#|A WLw=95}[X2Dj(H#SAr`\P 'u'bdYri(;,`I<<= LugD8QL҈0fqLg6ano. (_:wMr7\zřߥEp;DBx&^'6[MFrow3;#O<ás)'Eq/\5h|OG2P%U 㠠#$U_Eb *[ALK1wA!q1QW_v3"KІuv(zRP,dn Jú9 ?zՃ3 w,PoegR!$~4+3b=z0\$,r!URJ-dzp-0bUg-uaP%WN0Wo@4_1o"AKP+#FP*/_pFT8;z.QC&MWuOxs&0dGB1[ Ld. Tƙt*5hcd=j@Fo{m%k@+F A*Y.1Bg4B h3cMt vFO[NC\qu6g.;Q-h+poN8}З%N%JՐ~quuląHׯLlW@3Mvl,Xvr:7$>- %&6(;"-Ye0^%Y2sn7PϬյh e냍[rs5-9HMs*܂ s 6!B+JE-\G"ĕTFK_bx% ="|u6)WW5C YւڂAtj'Zal' N'"+9DnWU)/j֕7ɵUUhUk`4*{  4m<zQG~c 7vsM:3oym om93Q#A܂,)H8NQ= /9 !ͩ`LS?wHBzo/-|̟0 r)+dRXLڜV~C twt-0 UHJY5C;}{* d so=AVW:!o8M3k "(ѭ Q:غ.*@P E\|lD5~7'tH̷ήZUֆ6[hpA⛕έe4[2)4ʭr!_yA0u\(Z:J5]YgM":E Z f$+f 7-#Ehѵܸ00ӡaKFu㼶]\٤,uyjLd>t\/89j#ΦF)CBzDAwu8tp5$;%rt|H/8^5>}[=,aQ75?WMFVuY]&ɜMS.SVS*rⓨ<@S~Ƀ\7ۅ|Z4Ql"r;[ د",WJ)wfXQ{вvnfnG4蝷R34]`,Ch6 },תA+[%"}a.kHu]kE@ߞdML/5[NHEgmc>qg?C S 3fQ3ȣ~ b6[.L 9Zԡ;? X|9 D7ݿz O, 0Ƞy|2=rgZKB.-A8#携րpb &{1#G2,=s&M8[~XEdhsIźŁiO9t{=]3nֹ?bsu5+Cmx)r0R0tvZ]8>`$hY% gN!N')r;/lhH'd.tE/_h|H:3~Xs8!!3蹷;xcᖍݕrTk-Dlrs3G%hv9G>WD`t}5b: AZ`;St/4VtctIPQJavVPZ-ZR- a8h4Daöւ|>Cw[F~FTͲI? ,)tlLQ7uidEѣL&WBmL-{bbC΄iK7&¢2mg7z l٬]>%dы>(FU*Z7?bJJ|j쑋|D`I:nTMR +_ Z 褨oVJ_.M&]+Q[iVg |oZB]Z*Mx>jޗ-ҼW*NW/JU: QaSؙr+Ҭ eR3H(%B!x jMD hF7o/r \jE/eR3R5)n wy<@ k~q,SZRqK4}Ph<.RQQk|DHJ p] $ c"@)TZm-ZokCYJ(XZZxŰgĵ:~|}ae'|k`ak5^YCņWOb o>׺֬я2 bF -ij[w{zBsUo@x/G u^c$9sګޘRgM_K{|'tJ(_t1,3_YOants#/Y̙GwS.8ōsYe?{Pgi>`2yK)%sh7A-ωwތ!oz- ԡW"bHw/ٛ[hFS n9.;Tu;ϺL͚4ZiBQ)_sQX9rL` /;KI[)PUQ|%Y$k>e~8w˒_rΕ4px".)]7ک/3"$eGh$D;¤-@Y{DR)TUP:PB U *`h!߽wgtL/lzIM=̐=SwW{(@3kb-N꫃ ~HQus^:jND_"Q=B;쾤>JQ"JCOe\\I^\̝RpSgCMrTuwtf%Aּ#Hs'J9TN.kW_M$V!Ay4ȮiCvmaL8X#Ti:t?UhR *TŋXw=*8*RAӁxnHh 7#f,#/L~w.lĹ$—UIӘf: &潢IxU*,]1J AE RIFj1XN\o3ϗi;L)GkF l̳~JcC`bkZ45UYFŘk'Zb(\O2 /!;W&Һ90*MVLǕal|, L3W'wL3 5.UD)H“I$t )GXj9>eQXo@{,3n MvRVo b aq~UئʙwFA7u*v.IXl5bBJè Y6'|4K+pQf/ KaIY~Mhy .PS {#' <H%z栲xubXr뗛S8{>P-=,8f>{\ L|Ĭ82^x'D!֟'jZ425:VnYIW50㥯[sw>oϭIzvTivNj=l[ q+櫷%UP'Kd[67̓Lb~-Y 9Jn~Q߀\u . TgQfaxϱ8a+V35%x >J:Oy!^`8x w̔ ;q"i?\|u*Ipְ;PL&@=aCj1s3k>W= pt*-cqohxb`W|Jofl{A;ӂ[jj0 `Xg^ Ϥ kQ(ν7_oX|vN}}~i_[h6s:V\NمߟSX@-,FkS)iGVI I JPo$0/ gw,e(yMi'I`⭳ϝV엯sݙ덑>g"?̥mdwNM:8\Lᒮ <4LM5|oɞٽ8 蠱.ch^䜾<O](ۻSx.6r *p nRX9o9sof)o 鴽$.Ƣ`T>vE .?SόhIyb{cT$էrr` kҢO]pi4'sLD]-j3^ر)K.lΆGN֛墣x9 :4;B~9>2L~ Y=06EoDq) 5)&-sR;wH-hH p8?QDԝw+W1N="| B2fx+!jG74퐞w8dg>8`2DS†" F7&XNZ:TKwn3j?}3ڞ4SV\wbBWI_X(7<|0v.-Bnd0.*u)cPh}:Tzu&rNv-=v&`pU(*:PEki w06|/gi[tc(3vv$8Co( VbXT.Q2PG P@0EiR:}圮r.B#]uyewf"|m*nD =arδW17OC h_iWq=߷!E*P;6Lۖ~{).RE;1>?gc((V(O:?oj4p\|q`4aȖ>s3sy/%Vg[-;2І`5 ?,E4y@R\魵}F׈M=?yqP+ecOSi&GM"z^C&qa__we?9si=7̹jcɐpڦ 3,"+s,m!9yF +Yp]_Y,uf+ȉt!~?/RMbZ{_~=*WbĪ+O ?8ᣑ|*4Ebx="2oPM=W^(XҚu͢Reչ_]ΫtEm2i 8΀ Fd1A?_w=! RB0Wl<_xlF' bLó&I9T /uf ݯN00'wwgg䊒X5lgggIтꅂ23H"A,f4-T ș~f5oMŀ㵖=3LX'h96P/ʹe !przx}L|]ss̅w`mK\.kB5/tsԷ@w1 #+>M~* ?{'/=r$=+6sƢdﰼ~(#1)uz\5B''yuR~pSOTL~FU?|sU5:8M&Qà`RA'V }.DhPM H觤8!~7<.vNI6Y"oa|Bdϳ017`tIOVe5L_y:N>xk,4 v(5͢Ty*&Ksxȩ(5Kܣ胎R4G6baDam Yltuh\fItz;ƢvAXu*n EH*N ZMbpnPɉ'h]~ =~bW'TDg7xtcc8E{ޢtw;t(Bv3 =kf>|aM1L¬*}rPQe}KWKY{A\yK\݉. XڰjzUxc4Z[0kRٰm+gEDiCK$ kG$ԭe4ɭ;i)_ R^R \)ۅ+#pwh Oo%43u ,W`_w7iqoKҍlܿН@:k_vVnWFΛ?ѼYaxZ7$6oE]ѰSQPO` H~iED~>^wBv_M{60 u&c9ۯlxp-%p wܱYsv{\ldbMM<6s腁aGz M-G6EDZ"엋5OLτOb| CzSmTx*0J@ EZ6eB['@,me,%qָ.ϜPzM~!t&kqyOfimf}rOj7ׂЈ4ߤ7KGT(* mm֏x΅x”q}|*< J÷[ ()>l\4+hdFV !+!mrȇ%fR%:QjLFX'qK188]d& f9߮0RIpіu`.UZ]F, xZ+Iu -)h:<5Feznh$\uvmg;vh%ݘ]{qhí[tz'EL҄x1$E^goL1_ŝ=Zm8!/}@Dmܗ7%a&Pg=mMhRs;ɪ ش " d~hiukNvQ*5|`רkUߐ"Mv q~ܖέ>^wޫqֹoa+Q ǂ_soV_aNhxYpd[Rp=õkx!n'/s~~?;>%YW(*^tϝ!"?B&9sʾ)mszw\=nyܠO}{bt.ߒWw~1VȜ/k^DDx:H.Kl!8C@3Al|%C^Mv5 296v P-~K(L)=ᄿtIs ϱ=dM )(2$? Zg롭c!"Cr-cWׯsg>Aiﲹ/~&ߔ>'Ggli$w_ƩQ !Dy߼}Hk,vܛcw7 9lN?^ nNG: ]%ҵyxL-Vz _QBt/AE_l 0t-~$yjHwoԜnhdw{Ɗ0Z; sR?p__g䨺^/P>.// RP9 vY`q68CS~ ύS>%J~#8=R&C_~&Ymaߎ~ۏOo7rѷ7n0ݘqd[2N~i*Cl9kg \6;P\沸BrƆL8W73as{#* cl_eq[?\y[bC` Zw#7HBjBۤ"T.e`3Qћ8f P5z74;k974-4sMX}MfOopӹ\a~TmW }?ZoDMMέa?Ev\tZo74 _04S7{M=Aꦏ76T/\&<_W.Ҷ*+I&Ӆ@ɃSbX%t_.)I)/˗54.}X 3?mz d9n'ms:"_K[8į?a`OG?Eٗa|RͪQO^u{Ԝ -F͑Y9ӑ̑ 6k{Zu|=i~^3|$JLemsc6yƫQ0xYoY%eZY%*]u OR.\RiKTbtХ!q/=. :9"Hsjva53dV  Xi$COG uzɖ9^y|l{5 i{Ya -n޸nx__㪀.aWu 5^_MS45n6۴z)5gMfrC*B떶_kZB׵a|J{q(b%3:귕VF GaiPGU|Utcp;XXIW)J~$iF4TbasqE!ƱVҠ~-3.e]8j[ ;rqrLwtQ>XWۓiȭR[N eQMpA1r\Z.-VPEReA6Rsz ӾGV coAJ8'e+NDO|IYQzq$ut$4Hko0׼_t1/u~dJc9qEԺӓb+iY9h& C;~oFMS 5a)#KH.HerlkvՉQ VRE(PB "@tI{lj߽~ '2 6zw597"U@,$>䐝dC~ M1 7Y8#w|t|z;6qt7Yb#49EP΍;otzٓ~'=˽vrN6;~ϝ}s3rƛ7]p~ܛ:Aw8uWW`,WJ)uٌ7j/Zb7&xZRjfp:9,+ (F\rG9oyGÿw&a"u!) I|zNYh-d1r3g]g>쒹9CdY$g K @qgpO)z*97,f=; 7ͼd1F#sFXݜ s ѿbMæ;rweQi>N)+)~(ZW^c|uݲN~ ne%|U' mY_ErusqȏI3քeۓ7ߓޙ 2g00X_h s{<_[yۙ Z.L2,|0`yrBY8/x\Uo nLUty|2%丐K cgj7ɉv8 Ĝ"{1#G2,=ssHb%ob`&~'o|lK_X35~1 `c1 'xdgv&Ug&A '/ r0H>L*Z1lzQ?`$ Y% II:{iNԚ-L > #yfD`Ae!#> /SWD`0q H$0ۙ.KtpKR6j@9.-K`HNۇf/ `7ߌXp.sAS>epfPccցqC!g*# uA|#*~f٤Nu}|v QtRo6_v|1&ܧgQ(1ڬ h;ZK1 nj+L|1i8k`f!(!^UXM<{*GX՛dTH@W^ 5EYn"0\ՏSQj|nMR +_ Z 褨oVJ_.MV\)>&/˭*6w I=h |oZB]Z*MBTmuRqzQVb4G*lU;S.B|%CR_J?|ciP[(/A_(R!]p( vEUnZTj<#ZY!+\#86][TϬUdLgPlG ILdV6G rBپs1JցH` G?VSçZaC4T;7_H>i_￲W+RnFF\oJ WwW3І{oSNY.fQ u<] 7mbL1%?pCH 㿀ء%f0a].G#X!Uj(ks~ I.!(P(>14PP 'R{X/ F%G ZܬHP_h}?HP/hatc z4 7<Jl=P0N%TuwpZH8썛%KU(Ax?Lj jٝF%p=3A C̻E!,Й.O2:\u>T.p`ɔ.;_1?sȔ!y" ӰTHh\.SrN$nWa8ad? P%ob_xyCqX 1Y& 1M:`ZR}r7؁ӓIJ Žxf,\+1Vc"* zb!Vo3ud32nuS~X8*oGq l\CJUW}p뱍*|{WLE ; rݔ;֏F%lw;#-^ NO"kj=3UYv˵'´>_ACݩOTv8J"&YN,M;`f&n_< # dhf{' r`_gO]2)׋}gM6^.E-tp "]LAg0=!`gI&nM4ֆo|vVL)'XcWvxvs9mkLN9EfB )lvpV H;xTάI;R,ˈV:!tka.:z$[|m:u:36v'e{ry0ux_UjJQ¬Rd@7uPeX!0-i7+ձ#Ez(\݃kߔ:p8?ǜO. a:Lϰv'~ B`.+D:(,YNHHHzy짝Ito< 5v]XTȕCWpy` oΙ tNQDG_}`7Uܡp{%xKjJ^y).)S!s"~ZhH$u"48`D:ds34B-|ش%}Gjr7r>8ZSz͜6ɇFk~9]>.R+E= l< '=#n1G ,TYJiH 8s5%X97}{ã(AlN$2K'Nyԭg>nc r. r# .1AcE?5!'1^P]<v~'e6ށM%/=kbb#b"F/@1JN{0@q ~-\O&ADwg.Dc=b/wD1 ^wikg0}}uxCyM)^3۾[S3zSҳ8o.3)F8}> G>.W{<wSvՁEW[\` ~9&6`R-!wxʞ0g]3"9̙ Yox;r²Da|So').7/{@7XgԚ!ݳmm88Ylԙ1+#M8~5g h#7s?wj\OW=%VNQ.pAvϗtE8K$42["@݁"B7y3,`Tcs5_j9A [D5|{D,"3%d{|Fjxņz 2[~.)%0'kpHt16 n؂"D&0}  -^8a kGf% G@DjÓox6ަ% 'l#.yi*bUPF$E?߂GZ?5f|^8BjQFl>bj$uy:BtDFjAT@L@`3Z`A֢<@hE'ψ 4Gff9μޙV:;G9x1j[L.;U67|zRDT\['խtϜۺVSdGN* z e*ή&"f#[kU2J PF{? ])Ԓҕ,"531g~]9]pVeP<cje#,M.**8xG[:B`D^7+RIv jTi~JqjY4IWj`"i q<."ZĄG:3]sГ].j1B1"ۓ*Vf7nCs6!f6,  OX= '(F!IOgm-j=lj7Vn9u a@CIy*F<(tw'&awk=z9v9XRO(,YX?ZwfG s~i\;ϳOݢNL6 E]Z_tִ5%Qk]h42Y.Y \gG1&8Q%?yI:@FfF{ fh<1C\K% 7Yl+յvl8 " \O&&РZxR[T?Ʀ:@3Wl,ƷЁLcA(3%򄑽YDyTi\s9 58ruٕx/^ZJ |*"`!FQX|d $}sscY7_9Яsw{u4gO=7C3oɫ%.9=@M*}?:) Mw^[^ɒғ.Гov(#<%f`Ull?{E1vߐ(#-iYcU?]@Qa-i77 !l T͒PD!%ZbEď[ Pl*vDkWo\zOFA* x=ċ,i1$a~ȹk8|AKwǜtB9`>'"dc(@V;ΐanRڄNo6 xs3nPؙA]-QQ)X%q;P, j`@²sbl`7?S  U%.J}«%+u&Kl]ibAK#@J!8w&]&x=6+uYN JgKglvY XNN0"M8) k[ A]Co)^s{+>W|n^Y\4ɌM]5n Rh\XXKN^1>^@َP^[;<s;Ws#"j3o{P|<9q]u]+YJ+Bo4N3:ub c p z%Uj8Aɴ<&=`bI* "m<J{l,6x^sKfff%YYl9|}k.nqW틁q4!ycsA˪^(x޳"p99I[NobW;0PJٮ,qh(|`Uܥ4 (9pf:#0'j~Z<XN@S4/5x` p%Ae!*%:p+P n8YAF>v@}kX=ho{_?|ZNVd%oV,m" j̫x:Bх %(.ts?{c{`S-[BSƙE8 -0ڵ r:Ks:M]'+|+36vA*JݞVNrwjjU}o~w=_wYWE Q{OH:Q#!bc{]sTq&?uT  &sߙ}B 6PVbuK~W~`+/$!暷Ʌԕ(M |" čamrF [4ˎr~!Vk[XUWxl$xJ#9a][ r42!G+R.j$LH v^WITop c@K_ӻĽ%<ҿ#a8;[a< b<)ś<>fynfv0H \-4WwvoU=>]qum9L rH ڡL,3V¦{x:`hzz灋R_]0 -} m]=!oS6!F wy+ U=v|2]z =!^2$?c#s(5e`܆sq釯?_ldm6e)v:Wa -fd,_Ita) Pݡc֗z(Ym`6p]#j=KYqLðH `RRjW [Gx-LBT ot^\/$1s5dAN6ŒVD^Ep<^{Eyw'ֶA07->n ::Tt#Mf5Tv^Q<3٧d/Tg䆅gD7 Q5lyIkyBt?bCF!S*/K<~¼@6j++O$Q4Ԫ0tfLO'bNRd5O6XULI-l1Ad; 7L(Ykl UrYz,bԆY|+La޺dF154+Cq!!L\,&0j]QD8ߐ<>\ &S'"9ZFy/n| h m3QykM5 rW2zny?3ßdmf~f~f~f~f~f~f~f~f~f~d~l8[oO[070dEz3pMl&܀ÈbRoetQf3)U?m-> \x6U75mռ@PvJ>/G†A nlywgYcňDA=zJ\%;M:axd%K*P$JDUhHG9eƻ03LddUk+d9@ ?l:Bʆ Q;:Z܄'J ;3&Q?i*8&+8(-:Yt&ݚٯB,sOKU.JO#S<;eu qL{x6$. bOaE-xf .ɿVOE^T.YX;FuNq-7C;zW^F6\^Ѩ5R[h"=w]gBOaa`1҂mķR19+Hnܥ ~ۧwJUx(KȘ T$BqQq)pE% aȫWm{$=q0lhȭiװn4jiۍ; BhAY14?paγ4xԽ &j4 f`V M2 c*wȿ\AhH`1ޅ#0$;)//U1ͷS(-.B2~i̞x;F= ~|!M(Zx&k7HMvx?7?< go}[EtuϝT:v+ݡhZUη";vJRR_U)!m(Z)y`^ot1$u.4gN@D_;86"/94_XlyffcFRv6:CGN4 mx:sn3tnй й0Vp^dҝ;K6K Y"vq_%~@Edr!rN-$NF0x.:Nb͑rsg#~ZKvs (}ҞoNע|`Xg-!B]?signw3ss뚹9ͭm3+1BgnDl'Ѝvz:-.e.О5m tV'Z8pDR8|d@M1%,FtoZךgB!ǗA=1Eė^FQY\ ힽ>;|`"#5ƽH/s@[ C9Iݨ~.igK20v>4j :E.² W*᥮W!E*!%E)^Xnb@3Sڍ|Xѕ7+ڮT@bмev= zRѼQl^Z.=S 0MS.IK1m׹ # 58!3sK6s3s۩2꩘NŜj*}I^η]TxuT:{>_J[ :WYi0sGmG6"T:}Z;rH,#:QزK7]599#egr]RV-j6@m) Eضl?ŎdF|fN_u;-y(+G\Gxڎ¿ÛqIה⾝yQJw\ J [[rz!"CV/{?frk6-2"^_Ĩlq%:}Yineީ,ΰ[$G,g<$6Ucnk:VC}m!#}˅gtwkhV."]d̪vVBiXKV7j #Ns?Tashe_#xk@m:_'A@")fsb 2J%X P8.BbĊNJ$k^j~%V{HcuT'pP$ugz^V4d(9? GF?WLB| EipܗR>SBf ^F} AVm6='Hu ObIS֙BA:-\)w(]I<0 j $JH+sz ~(n I}@#й=ZA{@)n>P@\ ւ 9+KE J =n lY?fɖ- Ր))] .$K dN޳2u}<)4)!x j&;G u,T`";UM,{\.},Lm~Wyte@EL7aSF{N7uM\RxǩcjM駡|fgur 3|,櫷0|p!>lbQM:9ޚjvS $uLQgYWiH=ۮݶΤoO:tRN*t%MF6X)#C VmJ ,)-G'GG2]Vmh17GYg:F:8f gVeڈWSQM kZm='+2BneFP#l8M<T~O,cIXML@31Jot/g]. F 𽗖/VoU C5]^2l_#"sD6976q `:WyZ 86}l`>}F4uV7ݹ6m'T|C8Y ul gf*l Zp Ku#-c8 #l-ᨖzM'tpG350y!06C],Ժd߀ ߞJT]P6މi <؈TC4GT{!2ϡ gO֟/6+|D_rYH 2{e_K_Buص^CqUYCWxu-],h!T|ѕ>7Ք>Q64Oso||붙U~)m(K)SJ]DqP6ԥ ҷbUQ.*(XF]DK>x8RD}Rw՝1lLKԥex sg\=+&BbZBn6+7,[F;+u=%b#Jo=%|+ϋ^%YOBzY{1me+ WDW&H E0Ne / KoJ%PQ@M˦ ÏQH{*cJʹcUFoU)E݀JB-B壬2V[_0ˮ?̆ >6ǩ8fb3*UؚPF)¯^RxWED>A>nltĭ*cK2٘Ɖ|}tѐ3iPV=ˣ##G29P9kggvAz l՝ &;嘱ͻ#' {}puNq-jdJ5 ki ϭ״^({*_~@@ٰ3"Ԏw4/) fw@޽jYJ1VI` ^R *Ѻ*(VHld Qf‹߿r/$@y^;{mh^{| FӢ3hquﵛw'?ߴt7Np{;9> |~dM!$̠əe-ʅvn7^~vOroiKY7w;=~$gN7oԹ7?9:u&ᯇůnp>[0Zgz" r;"/To^*86;ҨnG4s7K_c:ΤG!lٜqF/5ZC0wG9,E39e C)5atdM=s3۟SY'FE\x^V I^ԁ etYjlj5HCaֺ"E?6W-)X~ n@}J*~jW\\\g5cR茧5!Gj.w>Cٸ3y(w.wo[CgfGkI (4_.L2p[= X|9p4`f Ꮻ-4>1gחw#0]*=9hM<>aaKĥq!3bx6'@3CMRbF)Mꏨ48z n4i^`/k7 Xn?Xc#^šўs2Df ;Ngvq[c{2,8f9$swkR^vSVHp6a}8H(߳K+e^1N'u ̗S&0 MXɃ5%ΐ{l>2se!#> /SPGҹ푅:+A)ug.LstzN?L^nAyv9G>WD`0bYU|iLa F%NIe)5fi%w0Z@}@h $C ,DoG : H=24afPccցqC!guA|#*~f٤Nu}|v QtRo6_v|1&ܧgQ(1ڬ h;ZĚH1bug´ Lč6^[6kF Yr(_ܶJEr4?VkG,Y)U>XUoB=&^p1W?OF A7J|&̶jr-IQ)ߔV-(&]Rp ?J6yYnUKh/OF\~ۨךz PɗoJE 'tW4Ջ`E-E xQaSؙr+Ҭ eR3HHB!x zMD zF7o/r \jE/eR}PjJIt,eP P^fNS\> (Bj)](5>"\%{|.j3BJBZ%uTKWջm }(7Ki%bXvaWk3t@)$2" 7˜O(  zW3Tjv'1e wtb'Kbe$?p<*GHHaWqaZ3XΈ%*^u]X<)k̼+_t}+S Y8O=,$|JvV9xBx[]鸻di|M(]Sd?m70BW޽8%[ѿazF/PW&"4&Kh'<1pAJlۣV8CO9'{:311-zIgl ?2'*S1LN*E[o~p-"`,٨2UQ_Oe| `r_pI&1S5wpJ1eϴ%$g{pV讀E~d~6GѰkˡm̗)nlAf.NMX-JGs:jZ}5`Ȟl+YvaI`%΢Wd%t TXX-6 fj6LFL8L@O?Įp<1baLAo?V;0Lx;5Gk+`(nMx$fEm 5Q/n{]k21 3~NXmjm6}5J?d[m%e,0n2KBI CymXQ]/Ur1[wpb1>fԽXۂo{a$_q>>YjVf.gP%*X]Q BD=<0WC7 >Vvy|>.Hl5^Ww~9^ E1&?7zV^+ꋻ+X oy3S(O t9 MHR)WooMԨ*q*9K-?¯ \POH7Cjl/^4UmQ#CJZTzq˧m+V42[), ξ i>HZ:%Z9Z,}JHI>`ĕsd4Ґ{T/|HٶFi{bZkڋBk5ꉝN#0|Q.!RG9\^:S_Fkcrብib.Q*Z̵6ϊ@S ]A4O}Z RX Va/)W* >ޏΈFXxwVHsʱ4ZaDRex[.VrqQuHY *ɽ\r.rg7*CIQq _ ɮYǓ(S )!BO9J$('k\!%+j~7C%2M B lkn`&><\ս8I gٴ , ddԊ4-ZQGyf+Wap͡n p2÷d;ەƚGi~G*'gh{V^0璋%| ۬`O\>mN0/h&gMi#0zH Wd@⼪g%T-q8~ zCP7(~zN'kY= L%<%U9Hø疾^Fі F_~aK$7_?~ ?~?*Ko髒+woN8J_uOs]ILBS!D{:$J+yEmWW}}%կ삛i'tHq&t vB'2MmBz:8Z vB''(ڄ')&>yr;B`jT;*wBJmR֡Љ3Z[`;*N&O0ބEi;y*w OSLO&O0GބEi;T(z#yBvQxG 8чkn:zaHUzn:m]!Rz O@5>UI 0I^T%BK )dK[MR&NΫX!mΟݛeoޓ~y·L7^G]=כ[?zm>X37}=z?YϗEqzҕj=*7оv:-_a[\D+'FX~\̠$IX`m͇>sDkuo wsFZWG]\IF [ZiZ'QNFX`D^$YiL§6 Iv'\v`)G }V"^OsP]Oi6| Rܨ:XYmڇ]̗oY9"a޶&:)n(qjFIDG)힨Qʭ4JQuSj=[>[>$;Hx'vyzQp>/@l8Ok *[#"tu5YxSi=I'j&mv\45 ɣ450 !q> 55ILPpc[C9Id"?Z4+7nW/mU[_*Dwρ@f;ܕ@pQ*[ .@/i2,p:| ƍaS<+ :'@n#Zu#nN$CGIC/QR G.7 aAb?!J񉝋B@ [o#%؞F.% i6OǛ5ӱxT{%k%. @,y*dz)sq$nk)Vۤf#t&#cl7ONU@Ԓ=P G[ISM*~7iI\UWl% ȉ~JL-DAI}K{,iO ׷ɩ{bE[H\ {;4&?VQ֮sz먪p!7)6Gn2|5Hy=w՛ 0T#dOl>zA2|Uؤ]uᩤƬ+KO=7d]P/ u4al,6,?TOlIYp{j^DTZt~duFm(2ѩ{|T4?.N vm֦`GkgejV&2~U$.J2IH2Xujћ'\uGѮ9. l19Y|1_<gg'z tC Y;]U2 VuAV2 6n8=Mldv{J[G1 ig O.ZUMiۛ:[t)M<6TЊœۃh)ܐs!{ hM]͸?%긶EO7VkwzJUcFK ݑ 0C̥ڈƒ 6$ > LFj7K%,krS)ŦdK'e,'\m`aamPPiVG`2uA +[9b#xAH&z$aIPiO! CQT%/ $F_ o0#L!ZWD֜2h%[t}sɅ3 ę**oOcv4i+WUAy`m|o_YaB' ؒ[]cgq^" d"*@hGheQȪkjc46!zo!t6?4kP M(т;DNJ1U FYM`x:"`B4%3ė⒍O n8;uXrBJi8$ S:FmfedY.X^nׯюr 5r, q2Or_9BO2.!ap\+sQ)kll$b6eoh㲝+r)'A}E@е Әڋk+"0ڳ oGTmG/]"o?4̭Ǭi|ﴋY3'7`:+,~C P5q]2Z*9-*3‡؄ Nl G ':GPшFE#>T7JE YraIha1GkPF#C=b!Yhrgs*1*+ (aLBP'H:?6JO-\~J ~#Rx#ݨp]ڧJϩ$a ڦ.@@A S6BI Y+uuڠNA?JEBM}rg1^oe65H{>%2^%$EN9iE%c0,-8̎=LB>]kQ&]5=/~##/_?lZpz}W,ǬuLކv{ nx,nїh7BQK~omB't2-PFXe2 TR^16@8f bx*5/PE^bc]6*xge *u]M1YP/.GOi+=6,6SGL4D,SWĦPd+(J~rΕfFϓbs@kLO]śU'46J}bOSˏn!7DݪߚYm9%h+P2sZOi~=-ӓ1d˳Yݪ 2*v0k)ODz^qRj*j%<=~:JS=깐۫cUk=1S5d Uř' yzdjL%ڲ]Wg'[NL=2TKn'AfofonCsc&@ɁLWt 1Nș  _?̆ !gQ̑$P!F_"1Mal +mŏ; }CqF𠬑93)=g_8 1XlYOWH'I;[_h&|ւrib=LH;:-\}C%"vlaxgwP(52 v"TR:X˯ӕgN.rO oM`I# )Q혓< WV(>Ng-267!iK(33Ew k NR5> WaFUL|5rTdz.ɺF,x@2V Xw_79~?͠=JLygH#3_NgE=09jvF , ܛ(1Έyp@|@ٰ3"̕&Ffp|ܟ.I< hwǒ& n1ng-tP}d1DPQ?kvso/2?XZ͠ OH70f+U%,\K@v*>d]&oߩ 3`\յX} jšX}E`aLb.My9F_UJizHZSܤj}ʘwruL-{I:$5wv\XߢxoƅguۦݴEسߊ5ز߸|^K[Vwx&dt:]Jy8tm3,b.gy Ĝ9Y]4M]FsRN <ʂ@u¹aϞ΋mgPV2'0q@ ɑGBm-|M{!HnKWcRDZw3= 9T+09^Ȑ}#@&&'(8p¸ϵrr)o$8:;7%sh0Vhͨ+<39O+P1EԔ2vX5U:k Q7,W6 <T@wU)L4lv7lyC/}i#.׆0IIǬ#J"BSlJ*sJ0APQ?*MF}s'2 =G)1+ 310';XA$, LVǦD`eUgA+w +jQb[OH`XWsp<:*5["i3^X{؆9WFuMއGbTK|4Lב0.":':!dEϋHOE}+rPУDz6[tGvpD|#L+HQĆ5)$? G:U\xhw$ž4ъ#֏VlGBp$kP>uUg4'5JT9g/̿/44 "M&@r6L2I8G4Ɩ8QǨvp~\ 54W|}ycՉB)|rjc>Y+ ՜h$M$'z\G9OLxTU1kRٝp&El+l Րԁ՚ˉEp2QWXX|z %jZ$qǬp,L2Q+LAWPo<\qkF%-QÝL`^OMX V9dXlW?W$ʑ/59@ 8\"s1£5e|ьF\ 遖⾠=ȭEc0NƉ6$H_޾p^";R3TtfF1{ip~´:IEbOE&S#|bAEfӏ4ح/8]N⇢D0h6qc{36d{gzamHp{?~b޺e삐)SqO7&J #ɖL^ @/j+x1ZI _uSTl\+rZ/0E+KzNAߚO-0e/n;+z83;=VbA^ ,el0}/RtǧR(J9XDo4cTx0F;fܸe2C$GZvcyKFtf bFgl#Jyh#<>FaZiqOl%h|g3 G/ v?ʞx?f{6қ%hdՁV5)(j<)%j5e'-)r/V 8Mw1!hX8CdOt;%(WǤ͓:2x C]tyc4ᙼ%cXg:(MYQ@#6@bYhof;rmwno5/(S4r(wMy;;|ƷB'%PvpHk2z+v<ʇ Uv|&3_N/Q-j(-"xHeͦ@*OiR`zœ#`uH4EÞfMeDo9Pf/vɿQC%*0a b=\ĂI~C ~t^qDw{z$7|TTf,fIU귧¡ռ-%Ps6XJǩ9WMPxN6soPb%\MvV, ^F\ǩ\40'f73ڝQCF(MbQo> ' =Zp, _fF{;;{ƽ.9Pvn#X_H6Wmc/JW%CUa OPbVk6pan jYs p"JUmErhNSMc1U=>rH9edMҒ ڙÜneDGA|\;ܪ`)RL3tI"i>zKkW*fꊼ=o䷝M㌇E*sI휖Y| n'&[zD+h\ xl9%'_ez{QWfUaHf@m@Uzo٠Ԗ{U)@ɷړK8ubn.SZHd.X0a rBQqWY,Pr=^<Jg BEhQ5l,',>׈xvD/Bۃ[p čAΧ l$A6q;vlW"z}D{s {';Y[`g1' IqQDr2c$+@:G"9<$-sk ` E7a}p{9~_ )0μ)֥ɞcbDh0ϗ5}{2[NP.E|z%f+)TGDg HBUD>Oă'  |/]145 y5߿QBDO }Cz}k9a{(Ab /Aڑ8[Xoo؆Rpe!-1t/^߭لKbZU1Z  1ă`K^zmkWuT9+@Z+bㄯ#He("$.#b;1tӟ.) VJxi 3o@ :ө9ӲlW PF#0+Mӈ92 PYgNt[hLw 8aXt.` s>G~#0rNC䡡AggC&nz.zQbBDSHqaԕiSRylgIKeg>.zp]0\t97P9xd^.U@֛Ӭ,zcEvD)r.p/23E\PitĢ|E o/`s~5D T9Lsi> $(u {tFGdˍ*^)ݴ/RZxd(i=X/B5m[ 8~NM\w0D%~.&W >_^eh"(4 %grG?<QBD#RV-nI I$ 0EO/21C"^H O ѳ{d{',d **>P*mZ0h ;'l 12d|zcI?pwK0!{ey^H^Y^Vq\eNMXa1)܏$-Ln:sB◻59Ts!>}d/_uiGAҔ=6,1_yS5{^ oBmPk[t)J$6Vn RR&KRw$ET_g{W7|V0>2"DFNw؊ 㷝߽ :5Jm_+󳡅a;b8-T%knU7B9589\bnhW je4xhHnQD 2nDilz:΂s'F <5(1cn̟^ް1'4fpWС8C*zs9°^iL]M03[[ۺܸ÷Sˣ\:ϙ:PFfgnzo5&rƩ Tuvf wp!σasN(wo[K 0(%/M'(>/6ъ(,?ұLi3t`!deA{ӓLG5јq=Gr%sQ  GGzPx֙_bun2gYe7;d.eWvd2Vŧp_jq v=iٹg$Oj2«I?jߦ|nǝh=xJuDPvФA!PX((@އ'PR655R[ ).oNMMQrݗ>+~]UvtWX =5o#m5_)_9|! p8i/nBJG+S1 ^*T(`jBvܻB<7J9,`b!M ܺn_7ۥJjBT_"xL PTPzl ?xը}l7m(teFaI]ba#hvӊGA.+W@`X00& `uZ?*17bo] vPER+#e#`^)\P-= 7j-ʔr ³Zk~B(0~p (*ByS6"P r|?9Tbۃk-N{yZ\+ vH΁<ِ|X ӷO}ž\FsXYk]sW?]ޕAl~F:lDΆΌeUέTfBq3v$%D/XeQ5AEtUUWYTʢjVU󶲨ŕE՜*axe裥ae裥 ʢ'62#55psk<$X QDb[eond|k)1KU}jHbJe]v&'"*#(v=[ uJai' =^ B[bl 幈i] *Ⱦ ۱:R|bqrx} ߨb9',[!?zX,&1{JJƍ1vWizIf^.>f/_}f?9'/0$9@w}۷|u~S.קE|}FfmWGe=02@_MO)̈.W/kdĵovy] *` sxR4 *R\^պ_)~n}B\-y/8?=99:9=OU^K~<#*?0Xν8Qt6GIiEʹ^Di1\XRr*pFĹ♟nt`C+GApFإf\]h^*sCBO9s`T(?'ӷ2^~"SYOtc?iZ_8Z.FSa$[)b$?H\U؍*GaT)+pUUu0# oEѰEZ Fs67) Pn?@XU}y;rDRrY >4 !IO#`ix4`ici)E22\095GJ,"`y( GX YW5FelAGiS:Ƃ]4AY5᠇>}DSBY5A(&j"CCIqMeD#$ʪ =$ G4UU,zH`фQVMd!i}DFY5#<ʪ =$5|RVMd!iXkHʪ %=$ kmTIY5>`jR)&24QM-eD6 B0d_se9(C24r+CNw=߸!N=voV>nph )Wɳ҄Ȑ y _NHVx&Ϟ_0/kc3F{-kr|gkÄ', &8ddl#9Sh\{Bv| U850S f WARlօV F\(d#"@. E( G8q#p(DG4.Q8(q> GF+ (FG $4HB#$4JB#$4KB#$4HB#$4JB#$4KB#$4HB- }0'W5S5-Je? k [>b6R"#R. 6SU+xx5t@gWc gxxJ!X}Z7()}Hip)}ɰ 9 e' 9*P )}ɰ N ҇ *PSa) >dXhy =/7V@PMU>*P1T^a$ >dXŒ*W X=XT@aK+Jf2b` TLU,QK/!u;>sü09 (vz!MEH%ϝs72Iߚdc7N#&)%:KCL9eSe\xN(6|8^xG#Gtœ\>=w{EA]ޅC!V5Ed0hO!-a}Eָmݔ_":?So i sۊcya(~>Ϩ(nFhžKUsyJRrD__|DQgq0H ' c> ̶ӓܱϏ㓿d7{#əe-ʅvnA1o}eOwl.ɝ:nM?wzIθ˝otC{er;Vůnp>뮵%^KD،7j/ZvwD]1_~cf\L"SJX21( C8:w|D;b39e aI"9@YOqғB,x: uipqT˜;]s?)pN;tg<} Z@M;rweQAk>N)P?k+RdysolxuˮC q6,Hj@*jO mY_ErusqȏA荧&(`{=9y=˻! Aٸ3ytf݃Ō _gZn3?@/ )d=? XV x7BsxV'ty|2qgZKB.qisgM9EZJu P$X7 ?.Cۢ8F.E$_.@ ihsIź֌tC̼0U3Gֹhl6^7 2oe8Y~q]-ॅ#:`}k40Zo`M0hlzkpPguW.$b'> :NPx4E}Bn' a:= K4!I|dQ al~tgtN Cԝx0͉ wU_+&Z6 9甁Qg>uCh%hv9G>WD`4멍5Б^#VI`.xX0}E@.)BYF (oDhqov}Ag!BMx * fPoHG1A3uG~FTͲIg!`kN\b0F|t@`$T,e2j.-{"ż0E΄i OaQ&=` ml.[E\Ul5R\|$͏ZKVJV|Pc\&,_HJ?&)+eoԄV-TnL@ tRT7elUJ%Ij(\ERn}M^[Ul!Zm% F֤аwװCgoJ|S*xiL}"|tX n+6@w¦\?3"TW2Y/S c2[[(/A_(R!mp( vEUnZTj`YTjMJf)]6PB_6˔VjhR-MkZ!t?x.҃=C>\y k5H B H%Vђ:KJ]𶆀>4RʬvKŰgĵ:~|}ae'|k`w߃=QD%Mo%*SU96zɿA h>L}7 PD+ĤEs4 p J?Nw Athlb=L$@?քkb >uRp奘QUXptPAQ¬ `2k9wb4VK7]@0Yo1vMV K)/Y-hƅt_o,sA#Vܟ'b#Ĉ:'46'ClDDSxwX* Wd{9@Q),؝%dd`* 5}Qi;$y3xu1T-F  dCw{Ѭ! H q;gs?B7UK"Mğ(}3]n:_2dߧRǫɮN?Ʃ[Uݙ jɽ''~ݗHen UugVw%㬾*`Ey襜=R>RyNesǁT=jAՔlP%vԸ(UJj,k9E#/QY8nNVx۸Yƭ`ĭw#minθkҞ7t~>`߮"-TBZOA.t hǺF h9xV<쯞DYAq$La!,2B|~8~8<:8q $O$sQ($Rx$uT$U$sWX(iᇓou Eh>XYB$Qhvz|ͮNFr7=Ίɺ;o]#sD^$[$uVP\WL62ɝ>~8L8!cTg`ll%[gɟY"t{ ;Pa>FI0|>Ƨa%Q7T/xZ)*))*ޖӷ. x_°U#>k R.Bdi߫G>і BK_$]hdyaܯBO $H\|b{[d:$HzXVl* BBOBlLd BB*BdwہKXyA.|¡ٛCurb"GS"7lcJd8:Nd8Yqq+RzSDh\+ zp2/O A~wU=u -zyw_zwzwU=2dB2wB\w=2dU=2dB2wB\w=2dU=B\P@撂8|$|5F>\-6܋Dp : gyɰ}AMʒӹ U1M sV?4g6#51X& GIKiBQ$H$H?IE& D&7DM6NN!N>cdZ$ r@$rrX-̉Kh/WF:9@#4@}NШ/d=Q_:Ҁӑ7)L)7NK,P:<.izںizں|'m tg3P,#˂?5_u'hlwW,J}3ɈcwCyCyC966:Ro(o(o=eWމճYim86s̓O}3+ZfRxR8mJ`8۔p)-mNa ۜ[OS ' (q+Vpl3l['Ag܋7rEg8U^~3Ҫ{b_ ^U^1%,(QvFWW<#A I+JI%YdM>5H!YdM5GYsdM5FYۑyш>Xc$R8oK<ҩOd8ϷCeP:TCP LuMv/eKR/EfKRd OS]x/4t<"ݦئئP`,vVʄa?0v_W[ɷJM=:t`kP^h 8| axsHo;iIMW±:ry[>jyUxUj uf<_~ '#@&-PI ?Hךd9,ri/fwNһ,{󘲟~Ղр;8\^+?Rd>WV@{/ >?SphpxˉZ!5KЏQ$Mȿww~lٯg ec 80ZH1̜/XՋ]L[XNQm] oG%@/ s6q`ݷGGg6ogb_# 9v'#9"Μ,&AT .#7$~$H+so+bHxs8MWޜRsh=m2zo\M Ei7c5>h}E }V,yjJ1kڤ{ƅ]s\od8!hN3}la#ݙ< Z>?y+Zrrg'zV9ƀ #{\*'2&⥋۫vđ$?_EE= vx혛 h!1zqefHXt{"Pկ22oO@8ͪs}ʣ2jTfo^YEN5 ,I^506.(xd(|DqpGk>&Mwx0q ͓pBwPOشxyq+Vr`oG?D9ڸ@C yPV`>L89Ӱvi\!flڏ_L9fSXz_.o5'g~8;ѓzg\huWg;86]VVf͋Ź^yqfh7{`);z}s!Ha4iug:t^ـqMS.ǥ,jtV[0#O&HA/X[ Sp ɀy> Yx!ꊬtM0+ @<.8v9D4\ eLvG*ⵐ@_9F2э#,^Y`N=vXyx$$Ri)y\}܊,Y $2> =B$Q(},{<W#ȤQb;^ȧ{4 RO ',4޴t.}B :. (^I7 4)5&/$rⰅ$]0~h嚹R13@m} OXdOHc$`':N["z#aSo&R<0a8X/!{R{vRej yH*/+I*h۰ݿ@3-R偌mMF wsjQ $݃/Oɮ<bs]h-e"-H%4]Q oBL$ 'L7PպKw=!c#܁~c-Է ^n%++" :zwN :_&IG*1N*iQNWp")%WXot< v jw480".^a= ~WнB^̴'( D9T+z==oϊ#o`EOUTHA.*H)d$VmfSI[vd9Y %`eW>8,*Ibh?it[(YynTF֊IuVoQ*#kʹȠY90u7nZ z(Zyʳ}(*#(#AKLHeR"A,CyKKKgКM ep`rt}T"&^i/HB  v Xv^D IM!oHR_}Xi5甆avHhpg SW:));^䰼-!r'6[tj+# 4u<]k 0Ie ݁ Df A4k5rڣ#.E'mAt,)nPO2{ufv6㙻9X2A&C Xbb(U8/ xm[;<5mt|bA{>$ͭ$tG6WDO8`m$H;] 4,B`3UEkiKimrWw316nV<:=>. ^>@tDP&G CAr<k"fT!G & D|};v of|=տ/? A ؊1ߤGv]%24wƷ߁Fo><|4&p^Hҁ!\@4RbؿYjp| ˒J1.vCkp*aS4FoϏץ Gƒ&#$1n:!.ΗH}(??OV J~%e2T>XD#jOEr\q4:⿀ $D\Mڦ U;_D~ 0 |3q} \аx:8ʽ|ŽA1/uߺfVW޻#5L; Ps.)G1Qu0m5\g &΅ NWQGEm}/T ٨ T{#{Hi‡5f]}\H` >YH/xD\ĺ}ŌF6y4G}ZV6u7SWdo-H<8EYü'|VB|{1g*O M@O`4fx*G{Hq}il_6RܘNr7xHS7< |0YXM=0<[=PFiž z5 }n~I.t; }Чyg,^и(>_OO~@}ֻU*6pλ|5\O禁mv-П!bM6~_+7_Y]Vw<"O)!s\Û1h/ ַy%!Liv"Q bW2"g?B\`d~`ޛq1=iu.tg]slI3ZaLɐET2Ecs΋x;M͍Ǖ1mFh~X8Y2(^ֳLDCJ9n_ vkwO6!NSe[~Q.pR( ]4z؍ffXgs\튟Xv`!:X*# *SV5.=ڹRpЀ<܁w)& "=B$Ԁ;h/@e0#!}9dp VoFJtq$D;]Zxv6_yUrHIK8 ޳åK!"]siZ}xŠצ]i0׻Wc/m+QW,Q|^,,oM}*wʔzmWMf Da o GQTvpS҈CPnFv-|0yx փ \NֹUը"$ܧ#R3NiBL{+ 7{{|<~86u74gQ8H\%{<ӏaAU;5@QOS*$s.AZCE;GڜEttL m5 JxYR ! tq;VB[M<8vفfĆIwt\h}/1wHO_zKTX=[JZ1uJ} ee:!&@1?`;taYG{ GVۢWHO݀E~HЖ m^Y#o-ŝ[b%/"6ҳ]N#\mR20'cpz}*NΕ\pk-se+enH{ ="@[0X3= Xt嶄|C8@&۽݋Nl|pFx&t$\v-0RD*YMI% }ʁG=Nz(?å:%9aAc 1CI^vФ!?`fS1K Sn<\("IV,EGdT_)z0_ *c% @6eAxa`\M7nCY9FDh&ϚX+/K9 -j;> GF-ƧBTE;0zPz'R&U Vfq謢:JJbHse3 T꜌Bޮ9"Rk j8Q~ ,^nn͟\`'snEvyL֤3 ?ʔ/"vT6_jo<OpCz]8Ԥ(u̒w%!U\=b; d[b9W}BA*g$3ܞԈ[wK4UJVV>R2*Lqlb8ZyB7ZC CsrIL/悌j/'qrѼ`Y)YV`U k_|([^VhdM?T>yf0C-Aއ{yzn빙s39]q XpVb tpRCpECx_FER&&(Ƌ`9ë:WJ"S,YJɶeuj%ԑIZ%4h"_U}w:;(h)XibȺ+2@( ILEݤN-Q/¶C,r}PJL9* '{W)0% o8wfg /&OCX%qIy8=Ӯ5ޯtto*Dt.JV\ruTB79=9rT1`_2L=^2L=^2LjKiMihLݝ,$JQP?TF.hl<;ڡŖl8ww-W}X™V#O𥖏3UBlX/w+l&VlYWnM_n4m yrЖb,X\k((Ut3y}mvɚیYݦru61/~]6 /0)|Je3]'יl j)a/ELv_c(0ցͰ0 5CK6\"-f:ԯZ]ՇjiV-'cߋ^RI^U/,a%qh4)AD&B G+?u^K|&ehK1C6AVdoeK瞴NC0 YFx.}94*!SI',jɪ:_ o\ c \!K7>dK@>ɢB*+!3&Svhy?XLZ͖ܨA;PY +Wae}lcW)>$qN\)&xȥu}{m7cpż:sq+V;VӞbKVm \ִVI3}|9 %^GlFhT,f_vVY#KrYI3xTB$d,9<,H%egtYJ> jm؉.tÍ}⁤9955x`*Gn D: ^@KNLB8X IdHPYMA)+Ս:Χ LP9$5ɖ;KZB9hTY|JF@'ŶbL1 6&t@m^V24! ?9" H׿z !Бzw0u!+1'.~]z+g Qh1ҝ5+fמJSU6gNa9hPyJԠl|%UJ=RٓՌj.詄UKF ArR°.,% +(H R9눁+mh!DR(% '6ĻB`9+9V{SM 1Ϗ$^rcZmWHL='4@"R,Ou&ItajXb3X7IJu?BfԉfeQ2@K={%#Pyh=)ϥ%SZjih!ġ%^Μ\bB& )G#鍼!x;68({ XM8$z`wBK~499WwPq'&1c(@PUm([^&84[n J䬑&BN~JɏB5E|oi͈]wئݻʒS7ߪG6S<A+/|=&C.jCEd1Rpҧ6w{Y㪄;D|X%E> 6gz(C(L36 6 ^ 3]jjh.mqgIFdX!q칟tMz$꓌*jJ9(杲( TЖOFwl*ؚ|XN <\&| { l`VbK<T|...n`(EGR^8&OHU>2pv*[9Jݲ n̮52'92G[^:y~]gS$IC]K^iR#dc3)}"1KoXmFҹjw}tךQBiB!MT(DJ?)ܐXFik}];?#Se/f}e8UlJCDp0ܡ,n9v-|l>FV,1ѴM枾5p90Gͻƈ~쪆,{Owzsb e&gZ ;y=uD-g^HV MI J6D5m $o9c&^g}G~3V ! j3t)Fd*]__aWͷu :T|>U Ŗ2 :8w0mv_(㷓2~봺λVSEku:TTދ)|,F:]"L?I64Mk iՉ4^mCͥ|yg2I6 +BTYR)쎭Yd$d%ߚЮGifi\&'?^r9rj_(`p$m`9 rPU,4^V'hm42HG/q_ D"Kten臼BaQ5ˏ&V<9w mj|<.h+@֖}ߐ ]nA3-9O昌K[RRN>K.^VXYsr&3 >TLgtYHpRm,@,$b6 ՗^6@$q:MlNܷe=eF7Q~_յ^R<7zdGjP9cpկ+9_T k/MMN %ⴥK+,Y2 D7WS8OS8Y@y`; u[K ?lo2^hL~=fI}C͔1$,'MQ53_>!obуϹ~z9㚟f&<+vg͔ߪHMoD idF 9GZ5\esLCQ6gNK )=eLX=/*0H6Aኄ`6?{ԺpERd*N|)'5 RK֚OʡЮ^;9Hul.MfS{Y)donE-iwe֡^fYe֙^f]Ye]?8ˬ.:ˬ.H /u=ҸK]5.(3֎߫Q)ڶ/[;ogĴF֡i?Өx2"cL&.%KR/դaRDx_#9:|6RhՑ:q*$@ԏOR g .VMmm{;7%wErda_"V6"QgI1jp(TǜSƬ}rWqupӔ(•-5qW{k >dUocp{dL٤Հ sEwwElⷭҫW7x x6AEE9>wGoz73JAN{#omx0y^_Z%?;~/bq]uah;N7C]3J.E{Hv6oɲIVz.IW#7%{mGUyy[y{=k-Juf.~dxeDIƳwϥ A딶.V ~z~zHa4gwG^54 .N?k9sLQD68>6QJ3𞽋BB>0G(vaGYaj: 92gÏۭ,X cp,b%΀ !c-j| Stsh98C2x|AG"C̘~^P\Pm4֛Ux6/'u޹Btd΄Ep7͖I4[wwL-׎Gw+oiڬ!Vet:s!W ?,|"G?WHvCw:ߝ]Sjk6btx #&dKcS GAͲkXEۜ.b8$n(#I1sp+Ů&"+l4/DE Q1/ke tm> ,ho2_\{Jͪqyٴ<Ni?JvL9iNh&K|`^bB{gF?zσv6/y+)fѴ,ޯeWJϭsrHuт<@k(Oi3n;f.q3Ryc{.q|2rl8[E{5OdztN M|{f 꿴Սh\eVJ6r5]^Zq,YJ{W:qe%m;~+,oFA#qzY?:W7֛R{4׷'-(863UEw+U JΡx}qn Js 0G~U͵aU%S@h2::Cp]ĨrN҃҃,JJUדd՗ /g)ve/C?=z 3ޢ'@5GYBAe#u׌0ua7QWǏM'aa\]굺Y8Xv6g6W[C/eM:Kyt2"hܴ\T,}r&5*@G~onr+ԧFÝΰUwph\{g^8ug>90iFxFQ8[D10ĸL N?uۇh\hGtsN.8 6)-wA1sBF؅fd ڻ|(/ίME4 Ҕ߃xӰ t`<ޱF^ 2x!1HykPƏ4_½{0*9CmkH덥n| ]2r,33r[hA_:*B>:zBd=cE*8u]\۩Zpw" Ɩ3C/p`ẃ@`'u:d`'!9=J=n6ۂx,4ӥw3&3u0l3d 9Iq>9Sa9~ױp;ۭ|rgxv>`:c?:[,Kl)EShGi&fzfv8p~Ӝ4,m΀}X#ڡKc>۾7 gďPU*bC"n?uz9;]Abq}ʈc;/z<_TrxáG}tK^\x?H ە\Es6>]ftP03hm\dT-acu~J#  k! $aZJʷP' JQhtgqiM<[IUryvaˋ*y3@|y9kW>0NԓNwn^!Sscß:@) Xd@9% MfdR D$VKl̊mYW 9:RFqGjkub'C 3z"x%4,e)k`4[ @pG'@w < w*PuDOe 4iR[py} TX^=Ҁ^]|yj0fhʔD$awWk܇W+q_lw豈att>8zV/3q./J!b3B|}:O8d:=sbJ"+trUˎIE#R^"vų9͓3ݹiPOwJWpY+tӲY,A76H$+Y>L؇p^{nwiQLQyXҹOCG9.oңOwq RT"@(YVj jVB௔C(ʽcf}ܥ(0߬,.*f{ҵ?f_yZo-T:udpwo]8DZ<6$v'-8lj*B5[JbyQ,By Sz+Bܧn߉!a7B>]rLEBQQn+T*ҷ;[ҕ7g 9o8YacRdK;;t[Jk4Bӄf~ދ"o'k_Tc{7W "AO;ְ0T3 W9cα\A0Vmf!O6]ͻb"AC87UT/cJ}8PG,I QZy(]I| vV񐩊`7 ;!bYc{ŷiӏ`fܳM}{͙ӻj`nߙ|h4mq>Vھc>{[7:Ca>Á*E +ӽG bSBӃzo|Zn+08sL 2L@h5rt } :uaN+}ڹ8Jۚ{$Sj̡3,`1 ]AfN>?`(;c-  4TBx93dORMqeDYDؙQXA*xbvZgM'K/Gc8V'ih$d; < Ȍf!K ưEs/[w2㉁]ּSKxu"d~홌B? a3l^՝yBA$T&pOR3|Pڳ9kHs?r7ob$a#c5bivɗM1ڒ:[Ga^\y{Ǎ8$^Ҧ+>(1$e;_yz&&ge&B@Uc;^Nb]  Ł=\ƽdfGKEv$.,@ә8%}?iL_XDMrYͥnA$Jws-~ 3N!u5݇;.-.՟qMlHb_ʔW\!S#ꝏ qd3[ c!;}szr9:?yA1i86$xVbdb ~ _'ϻx: ҽ{yfhtYlϺx<`} |٢uƈ UPA%/9+V-wAԭ$x1x-7 bx<~ X-@، n?vѳG'_dMkl |i$/ {SD"ҎQ\wא1]lQ rF+:% G;hy xxw=QEwqx^F##Yq}N!gT} [D>3GU5y~(XV` +R_]}5fː\bA㔎/>ŇI\?qnl2وj@+w6Q=?\|aoO_itXaؿ$/g'̂9Ӱվl:i!;duie7K/^wiȇԐ4 .Nx]| (^A8{X<qn:8P9)^-E7tap*m|h~3?r|P& 08$(4Gǧ0+&xz.C]7OAv9ܡj/wMZ۬KtutͶsޜA[Qf_`*ވ"y23s,;7M9m)Jhۑ7DߊbgwJ]dQzB&FmUȹ;]}@1vR⮄Dfdty'22"H g=-BFHFדj/!9NڞG^x}v! ;4lSb Mcx`ah-fX :ϛvo^._˖ mi[w؆͕Sxa9S{;k9'Mwz|\>#ݯ%C7/!7=V[F;& v ]0y4B6`N 9'Pq>+]\zǧF$Y;_S1dH # .qL>5]UUw0QnFڧ0NCج>=Ɲnw'9!ZÍ:Ǻ=s۝4s ʖVɶŨz}aU˲lupF֊fQ@ndx't \kR|BC.Gx>s/byT6k2ނxeUX~< Q%bp.PvA15c%] ik;8 I͏eo9Hۡ#BsdSy?tQ/BZ0%j>L.5A$w&m׊V$h3-|8b $,Ow28ڭMB7 }K )$|o1Im;{k #9 zv}`ZH;Y(Qd;Em&zFbhzZym >H;wl5 V,3bрP!6k??yӍTtMӃ6kKG<9\z5{gk amf=Ug o`&e+dun h妞3t̮]vs:F3ǿ 3![|Ӂ!QoWζA;pd#FP>Զܷ:@F?jȐ}VC4g\ˠTЇ-IΏ)n`m+ 婬e"ZJJx dXmH! Ֆ7_ϿUUoSn*wd آ9]~r6 Ɠ7e'Ο+4oDiߔX@ML@`7o:EźdZdD0MCFd2씨"[;E6~(gOelIPV!Hi3P&h MenB&js#xv5l`peVyO$(qE_z|rJfaA"R p+6\ԋ[fuԋ+{"Wnn0H 9½ ?߀1huE@~bQ}SD3AdTgOO(јmZ)]o,Ԥ=p7cxIӏాܐmQZX3^ي삌O̵7 g>᥮e|$)y"D>|D F&Cov#=2Ŀpg bN1sЎ $"=c9G;>#Psr8>eEA^ 7M^Pͼ8<2OQ\Y +)2фB&ק_8DYL@{YEo`rp 'x!h8_Rq]֩t ai‘e⵨H{߹7p.Bݰ^L#2Qj8dt+:-{+F"p'"vB]]ls$9 nS;0Rt1ޣu>= G6Mb֥ܗۮKQTZTNx)6/oGlhV;t;luJw蝟EѠM;Y ޢGSclwN{[GüҶc+ݹCd6t&{{8>S:݀kr?a\^R3x`-}VG/ʷ"jry?CIHx(tHzLvpҔ'((B޼)Xߢͧ6l;+3R* ѮpηuG߉~c{ Ov?oKv)1ҁl'+ ku Yiz,^p&WG㉚ghJÓFip,?o6#.FG/ov?7 8xSe{ ^?MYMb61cr+]n{?<؄xg'_a}c. VP/VO*Ԕwg@O뀏zmFr w#ͻXN3Z5pq[^5ڄ/"{G}0}$52^Y^pJ:B”bG;`~*Pz[P~qBQ&|+;B mSIc4󣗀ѫ ^55G+[ܭ9ܓzs?/bbnQJSkZP-~dVdkAjͭwIDܽ'Ţ/ Ię+nocH%{ -{""g2n0qwvF;w~'Z]^A2Qnq$ F2'#IG`ubKS .%of [y鼨|6E=#{C{ buS'bi g$p!!#W4b.㫋J2Ћ 7V=V72A|zهf_;UW[#6T%lvk&UO;RFrs,7ٵ7Ш>(wwq㶈"#Aږ$kj6xvWL&?gq,w: 'bz2'tm:7k̓aUgmmbE;hO_o/koT;DV6Nߚ~`*0+l?Z6y n[(?=JMDuU꼐#q4lcl?D/li?> D1S=~J1S-H^YM3Ǣ'h&gѬiyS/5LTa=/(47tjvCMq]uƔt6ډhr>ᝏey]K34MLQI::g_[N/_  =Ex_)1!<ݕ|0ony}1qAB6˷njHW`-u ܳ#u+IRџ|'s^BLB_]g|5鑩=? 1~moYe#ρ ]|vςkru0+C3(Q- !x˷nPd8[]w`N)0<fRp>DD g]S`fd)coDF~]qll,xq0!gƬzY˷4?.2H+8Qw1"8zKlXuֱOy%9؉z2iA,M-[&Mc!*t(t cO pM]zK;ZonP`Ij฻,o^PVYpLiwa'{I(8o^x0e|<#v!ŁI ver-^Y"4%v'Q;}*xԺcgýqZG9&1|zy5|.brK6̤y(bW k ܨIŏ9:7iMuޓb_5gU5&@Ta}Z5bj] U0/3LGY>WD0ۊ+|y ۀuԽ+ϻmІć2.*+kWx}i*jܠ7*P< ~b-gs7(25ʻj (W5[/>{^~gd/R DvV.ܢunѸ;$S •'Jo!r PijMO'8C*UU8͗#oO JA=U~O4x֒oHs. aes 9@BBaO}*>7|AA_J匭.YN W[v= ;jNN_ rY6? G/幬"1P7.wn^_ݛB[9>|.>q>ԩ') -|!o`6nusZ*MS6><^f߂[n[p٨_[鵽@fBg2V|n *> H$ÞeNr:$*S|UYExՕ&ܣ>]̰ N13]UqJdH&E(!F8'=zA4*vWT4A6UhwF7tuL'QҞ6C|j3W1ǷF\q#Oht;,rpdϘڠV*GbQBsu8RD ϠQUDAjG+jC`}N MvT^Cql?͟h}?x#z> 6oF0,X[qJ =`3dzsTNgӎ?]!iŢ_~||/] =$nfm1AVsOOt<ui8jζ1"t#\DH|ώO^|)~S 3bZF!<߆bo@QԟGS!c۱C_xu0zytyx7g6dd/PWL5ЁL9v4ˣsw(z ;NT&@^D`T: n*9;&=lx.?\@Oe7k%$8<_~GDP5z>q"֓gIr,?:vזG#GŇH2Oo -|y#~l'\N:wG]\YƛN\C-\5LZ UZ~Ɵƥ퍢6FHi(i v oT~|J ĒKڄ1 >)KL!~'7 hs2Z]FY.N_rܰpF.q闓|LTҡp@t?gtRZV kk!3?yZѝѧS?0jNєrTNCU'#ɷO#A]\%*D1KzZ A8mOSFD,1+~Cj]:Pc}cZ`~~Gpgoᅬ0,8-8O"qGEDO`~=O'Wt9ۓż?^G#`Ƞ\ y ^:|Bfkl-dGJE۫  >չmbROzG'g''N,jBY܊; DKԂKzz;_=>8zYj^://w0y?yd;)pgvjf-DoeEnǓq=D_,Uo. /fBҟgASòΌ|2]K &W'{{};myq@TB7?Z﫜ݎ-SԬwxx-'T:H.$$1_}?On+/nd{l.٩0y0*.}pU/M$*dz߫?kA޿]5}0fJ~-e&+ɣ(pjORf񜞜]/F_>8*N۶ ~{5~DOb~8zaXF?~sӭ-ӿrH#=0s#$ T3v|}::9I"Nc O8}ѥmw{hn(a~'/\2{(^nKNېm5)^vlU8j p~Qlb(xK<*ػc"\]v{b\ vv ȝV #!ʗG6RǺ-PzV~Lx~*0f.[|ܦ%n^X1ODE>S$x,K3f?%H.Z ʩƚ(>xO7K )'F!${5Wh-;SJnsREe^ۇ;z a,i߇g8T)f `gέrDQ'9sbV"ryY =I8eʴyy}A;/~i_Ֆڪ6o9F8!!|^#մdϧ3*YZ ׋' z4vD&noWlf/8~L~p-!)e؃?\ `֊Ce/b EV"q7)M<> =ePYk#ť2&xiq4}/ye0|5jqW0 sdQ҄=ErR]xu`~٬(%LY︙ˬDW2un?0zhUV'C'ώ00Nw;~sb+u9Г'pltvN+>kKŋaI˃MJ)&ųze)b΃\r&VaEFGC[̏Znb<{1C ׳bLI?-#n/}5am>n91Od6h+_]׍hBD+1O|GsG0OMiPÓWV [%G2N%XxhyqlMEt#4/b (/%cĔdBg>W EUp'؏0:CX26(s .ZLE_oM@¸ &h*phkq| pu7~iO)uA- 5 _mJ.<>%Ŗ"'ú %D9U&y<4pi_6 'ʖwl1>ܿR|,Z=9|qnQ6ڨo q g]vn8B۫r4DAQ=|p ~ǫ[%|tArH/+j^Q!d!{D T"IӃLB 3᫪C_qOwDMfuszdZsrx\w|{\di$KAJ2d~0Ip˪D&C#~ 9gX7ZÇ O#6|k㌿(GHܲ.'[U:5BMnjG4U tŠS.3&^SA䇈{`=⑚).,6p "}v P8:AzL/ & `PX ,{:VAkZRfTIn9|;J֢Yf]=ϳH ee2 /J^Jݍ Ю %/ACu: gy~8ps\jK= fI%fnHzUt$V'R'} ϟxk;wMaM]Waa`|Kcc~;s:x'GG5xJSK1e|)nɒY=DWb rKzV4oUksql5'_"G#?ouGEaI!gD!!!!'etn}~j1kx?xgo<[<[l3Qdl_-KN.wjwU%Uxe?^7O=E['C`!0!0!0NܞS෋mI`JV(6`K*ꊉmO&1)wy`=x1o}w|V?Mc~\3uo=xt7m-v%oIaޮZ v;56,2[>6\vEZ]xvEv@6ܘrJE5ωJ~P?_cuw'i?oEd~! <"5nv8xuz/g}@"ܴe秏%OjJtڌ*nL ?FG^?<)*|立|qʢϚ>=]ʪ_]6&8w̉{W"ƭ9}d'µ}-lacc9:, |v~"lgi=fJ9PnPWT@"ǰjP5V 2!]|fb/^ЩWNUbS ayOQ7t/ ܝ >΂j;=Gλ.66},>g6ȝ_< կTOT!,!gtx7k6{_r|叔Ӎ!T"¿߇þ}>I}Ȃp_~/܁c?é_8;&X%q9i=!?|l%?W/[E@8J& v/^>D =:Ppw,ɚFD~ դ@C&P$G\~^H Jg7%u?uq@o[S>&31E|ܟF7v e5U 1|ka-151z_e}2ч,˔w]pU4w~Rtu>~.0q3`r }rLP<0X˅8#颞-:-<'m)5>ˆAu>y9{7&gJjZ`)~sS|jPӂ /< oX?ʿF9cr5bܒ11"ꦺ;5< ?Y4|S ; +.c2o6Mǜr5>%wu=^Lcu98nmύK-K g>D3#ΤJeLĎ+ϲ2m\%)c0)Vĉ(VW&S#R>7p}JVIvo|M6μmEbq>ȍl/‹/Kʾmu_UTz|U\yWuU5ܶY4Jb>oc *Nze#龆"ǸLcKDԣTZw%(Ӄ'h 7yP2.2kg)%5׹EYa.66bs\cj3֧!X20 ¯8eCL =IYwb}zܥyہy&=8(\K2+:^ۈ6sy)݅e׾>*ǃApДMNFѕ; ;Ad`L)<71z{oҔh>=? n*Ӌ5ul!ӽc#AKHkZ낚 [?$8Bd[ԩ^ԈK٬c|-r| =z<40|HչYuʯu%CK;9,u<|KW`{YH|N"k(&xv\>>ITDʞe#!>g:_,-:3OѾsS%t8l)KRW0(#_uF^!{29Rj&22#@.qɤi^3 єt_E@'%Z/W6I\`27rLZ֌VT,|赡yP%TV+dyoGco mڏg{5$w#.9g 9*ʌIJđޕIyw J)~گ%N ʫ}IۢkwG>VK exqeibP0- R&ߥI]ic?}*ú~ΐ5QA:y b cj*۪e=?aSk50xtak#V!57d>|aYc8R H(%ĺ ~^5'E𜫹T{m'lEޙ'DW1Y9 |s(M\ <֜;{ɛxz}O@ը5TO9y) E92ue A d!h1Py]j+BK[?T<T/ r_btLV \#s3^U'L Z5GԵz7w(uj#KtA'M}Jm*\y =U$;^).jmoEW^ ^hZye%S,17XTp ~f4rd:NV|zgmNaY h<:UgLEeH3}gG>KAc‡OM{׍k)cƁ?H;kd}]jẁΛ.[Jyb&c΃PgI {%[+ ;[ Ã۫r#lLj~"AHl*%)*&K]icWG`+_{:᪲ L1ay18ri:F(v--CiWՇqb-S %9g!#d\0eLQPl=qkc=b6.Xq W)"$jW#(7,@iEg}>'U]y׭TQTo+ХIdzj@uTgmqNsq^?1u"V4| i)Ŵ$~gTv#Aro\'f41[Egf-J~Ry)fmd+4#Ē( )+Z2>@VFВ#+u072@$-uCK!z.Q}Yqfg{}ln-`N=>&99ÏExBbڬf7CX)W3m HYlZODo+zTޛiW:4ޫK[YY,^hἛ6E{wiƍxU}}qMƊd_lZ Q[5 T^ckC| !K|i(:Wog.}x%8QfZ?Q \þ'0ٱ;G7fX;z` i} Ij>5S=-72G?ˑ6v"+7SK*ꤦNHxX1LqDiҠw_a qyzW|{x?DW1yԾj^LD(dbk_2:|;)`vY@Ok[*VZiVdwHbNVƆ0o+ THڥvL{O[H%e=8QlT9Ӗh}8VPqNfhxSg]4HJ_ouF.ĵ~uh2q}.Oj}5x m_b>)iGn!3W$Dm $X% c޶p9Wymb 9qmŵُ"gĭci!TgLVmhWwbv1xpLn^>kr-A_>Xgo=66#wt!?E`4gF)q9؎$LL@鄟k HcJ} y:Ѥ.\8uN7K0AzkCxt >öb;R'wm-oM:Eyzv]NuIlm|',kuhQܵ̒Dwc\u&d},H=:^&ש^j?,+4&z)¬Q%Tzncbk> {] w}8=sdSW| =ߜ֏ƚkz7Yn;?C޴V 邙8nśZ;pbd_Av=>Rmt(-njǒesVrKp5Y?+(Z'8։;:vӿ .(ݵ}keGno|/uW,3qc?!gruIQba0R,l`[z/]ŸSt?p.9Uޟg Q? ΎogqZ۶7ywIΥw9מ's63\jZQsB?{p{'֯R%cٟ2ƛ^GJxΉوk{+q,QG=2 II?%MҮ̱,7F9=ʄN]uXyX54uNC$*uڪ չ | KP\|.q9DZx93K}2Wޢrrm$Rl etEdm(]鸅i,Ƨbe缤&kئ[³Q+)@g4qJ"oZ{31cG`6+ޫ{j03&3T]oĜyt|MKpy1; O筊Q|f=t,w.b~$1qGo:;'Dm]{Loɑ>^ClKxtxN筟~>~d~^Lewp7-%@!:]GśaZܔejer2eT)LԺXN!jѾ@W5=Z|7@WP.˕ԯnW$SlgXHT\qFkQXa^9Fi̼g<^Nκެe\[ mٌ#hMMOC49_[JYP~}L]H[V^6JT}?Ky%,g z+i?E,w>/04_kyhƲpk8 Ngle =}dC]9U]MOp⓽Z}hϴh_mz/nf@ z^ۙ^*yMαXAC광޷NLG:?(c`-N\>+Mn-w#8 q4C ض%.;['kDe'C(׽K3??<gܝǠRD9~^Lx}'3&yWkʻM'ed4Nd^\$f0"^"QSrE2NkL%chTҷ+Mㄏp@ QwT3FǍ/Ht~ G08׳DXFW,p+K[ w>]{<[7vG#xi7tw.]xWϮv Bghq3U1ۤ5} s߹X<|$ėaMj~IBFaL>y,kW ;ps.e }a-ӂ1R~5qGH.scsmh]֖Fr<L@ΒjS7ȩB5yU6əAφv.pKmuswD6xuIT?l>c!4 m?r^hm >G799Xc8}c1nxfhg=։4];]w^[ƻѷ:YwHZQ Tq~Oy5:V#E2@찾=2tAiR}Ɓb9/R?Bn= ,OߞcsoB7c?=N =d=ӫ_ +Y=b] $N9c^!ƭ9ƚ4_~ЩFnCi}< ބA[o|ISwYeH}!Wƕ_z[gbu}k@|y v7o@>'Y&Ԑ\'n{,ò!r;t彛^͇{#w5OY;N på!d[2u\Loc>g E씟\[ѷnS<I] cKܠXgS&zܹr&qiGe&8=yJL;6+5udfԡs)qCc\C9iG1Ԗ"7kӎc~j0p呏! 7o;xn6oj׮klL2?B2?} Z/Fė? ~0KRGֵ82D0}+=!7(! ͐B.LF^EQ\* _t:o{P{+//kɧئ.Zsk0ԚpAkEuNoͯ+kcp̄ok|f^r\f]L^Xߑo{ςꞵ3"!ύPp} A hٴ@k{W;=d<>I%29*$ 4,O8TF9Oeunҽ}WJk#=5"zBCke]rϋZoi^DΟ׶>ȶҲ6̾H^ƶfs6#]?K| jA}>Ck63JdeTb\5*BQayJUYئCᶉd{r[gxhBA}C*\cSTmi*f4dzWN"56j-{2_0 &Wt,3N@̹Y[fh;)myDgu5x6K-\I.2zW#eѢX܋=z8z,˘}Cϝǧ}}3J^+vsd*&>GԷCGk2w`RkX9:wf~|2=1}۷OmdZO`^i5!a8t &ke9sd^K羏7^3|}Ls!T/0|.ѝ6[7ҧ"Rwyps*K6%+Kpl+`8܍=aQ? ṇV@%WSqS!ql|Cqel:41l:cې.&^OطRL9ha&=+gm'FL8in!݅DR ϱM&psx&MW\Ta 9ȱlwǩйWm' p\_ѵ4}XcϜnR ˂ŃGoxr0T6O18'*|S8?$W<똹 xmkMQMG6ht6~n=݄ª惷4Ee(^1>rwL2g?_k}g-&{!ϯgج+'1ZWVF=•툮LK>?MvuHo]5]T}n5O;Mx#Ka8D6lin9mr|ԗɵNy}'ZVD6s?>zXIN7Ӯ &eOy7O|WݴAIszrv1:<=?W/GG/&דfy=ߍyaB3oyX"$3O~7 -#9r>-W[uXvQY-3q7}68.1RiyZY<*&zrS7o'viw䪞.'{rc6GO^I?ma1̯ؗɴ|'{8 ^<(;; ^W_]<`;/veG}q5|}sŤ.O.O^O|]7vΒ882 : ^_n'o.fzY_'Sl\vjf-upP_12ˊ*xݎ'nf/xͯ{96|;Y7ٛy}~ub/m`޵r>.` id6gLM׷4m0R^kW.fÛ[&Ǫ)t \HHk iMyP`F沝z C~\KS3/O.._ } -`v}MPB^y˙d;n_N2%N^Qh\IҔMgv[*MO`.nP;,F dn = r>~qp>~q\ag1(sIN PB:p:hq08Bxc8t=XBNg~Qt8}.rǤoSevܚ K]f!ej~tDp*$F(S.e"MZInRG>vƀH[m&X&r0Faە&eVkXxN3`$09S9W {Lcޮ8 tPmEv.M"[|mjl@ϡ%!=sq$}Y-Eus8Q]m% OQyLyzၖF~:i$7;8ԁ>i"(2^rP]@ާ= ˆAu>yŜO=s7V(,p`5-ChR&";N3/fʋQӸʾk3HoA`p,NfąwY+:W\T;MIQhTs;4&6,iԲĞOͧ8'ZwVx`/SSEL2&NbGƀgY6V2FO "QmIڊ.Qm58)}e<5r/A[p}JV)3/LYClyʋ\`oq>ȍl/‹/Kʾmu_UTz|U\yWuU5ܶ6pEh`7b>!*1cm(嶺f56#3>`-Y+CO!>؏@>DĞ+LNjoĩt`n 1O|ft4#z2?'J&,wռ5sNc`Ã~ &&Mkmc rL]F%Ӻ@L:1FV%9ਤ\ 7$,a2Ý$C(WL̛M:l΄G[Tzf%$A=yqC㲏>d21(]^zY]v݋5ǜ}ܗd._F Ȅf-4>#Ou17Wi;#3wցT"Ut%t~hJ&>\*ԏݹk-G-Zk'ֺI!N]kU~ڎ$]kmDt-vZ7GWj5pѵ\tKG\k$gAϵᯜ>9CC_/=S2T*)NDIgu} YC(2E55XO`ƸZ6N`Zpg0#dH.>l@g} x<ʃi} zg\Am s7J},v2_ze7DmF pĒ} F'&×2@2O }Y?d$!F E7--p!{C.Aco ]p֚.g5Y%knBm.p Bsy+ \C7ɹ^_I<i~YaiQם+ں8}`mG.ÉC7P_b[{:=4z*Kj|pL6NȚ( }_"TKbBRS_S_ު|]e\#Ea $kJ9ɢ'[8Jd}#H}>a<\QXΨtiiur?wj>46ԇâwɢ+Ic[2s.y}<\>-f*iٛpꦏZ<Ѩ^[z$ g.\\_*Eh] pɒy~9ډb{ۘkW JC4-ΖM2Rwm@sHdC{BvKzt&SS/з~7 }gw=+ft+hܦbiUS$zPNǺ:7D>Cρ=xH%ȁ2 pT[/%Jau ;ZE/5g9C.a? ]A-7m+f.čyWl$җ 3@ aRHRp(\Ui_Qd`|,2A%g ǫsշGg6 2ÈΤe2{>2 /^XB's 8evYs:c.xS$KHXN<7%hrnNj^ 'p.^k*˲݇#1C'; 8ݵ,v 9XqkTg8iO/`:wk Jc2{_P|.B+,eqKp× d/-х_=^>F KT2TN\&ԁNu*yq:#b*U+qؤ(ˆ{^̮$Sq ɁeG<"∖QJ=aqa!Qn27:ne()&svVSDHvծ}`NpRLKRGu'JzX`m!7.+p`FccN')^Vޤf?) =ӻ=iMW^Am_d!qkOKM\k$2d$Sk3,Y'm0WֆA4#m~4c%:J?SgƱ6cʺc]G? AaL\}N7NaZ7ߢ}m.y4+åIg%oIϹXy 7k۞m(dcncj>(}ZVdܧɀS{xm z$_Y23Иvݵ$$ka.2cƁcɅIaR>#L-īE(agzك:]-h$LPr7(RG 3.ˑ4~m}6+ҹ:cʧ|'1 |HoOG0jL߻YXˏ:5,Tu|'OgYK>3f7̨ٗN<4B;% ɨ]ܨ3qWDDގIUbk=GmyY<WyM/`(9W .JBڣs yzB6 KO9p#b7]L62]S<\._L R!8Js\Ju&7 )/,uy{WxϤes vR}rLYkC9־u#pj$xZ ],#]D PLK2ǿ'iIp-E~nbs?}h8Iy7R2*U?z\Nr \hH8ν㪓6ő{MO~N9ݺ4.*Z_Yh} [R96ܓIG.y3l},kp)]ɺ%ʆXo}c|챱Me(ո瑞Jk'yQ'0#Q*')S>SG*Gz`\8,azgkp[Z`~jdBk\)/ G8}]uux"59pbRڠ{dë֡.򋠵S ;|WC6!MEuV1fL('+_1%#=_`Ryxȫmqmoj=w7]KrZ~m*wi{̓h_v["l̻ќH~wb,ll@WdD],H[R<3\vZ4D]xC~R,$A;^bJ/W.ƃυuuڏjRǚ֏FA&u=3nt<sKV>b7ۺuSv#r@Zݮ%gtWG5ۊvmijLq5VZz/s[Q6k:VkX\NQ9đeI7rWp.9Bꒆ?HLQ8K ߻"_[fܩX`j|z8 ؜*OƳ [,N':;1r}m{GϠsbMv9T9-( Wιګ3㼋*yG!Z*?R|8Z_5 ep}%8 Wvxiٕ_]7Fs͙c/,/LsybSg,q_q 5@n'^[d "K̙&`Q\^U!}n.D֬]YoMf ';|ӅtxT|ׁ&M}[z[}چLz o IfϹ<24tCbСُ2o.](?+|:ҒQ)кig1#F|gCsB/\P(oԯA;w!^ G[ǎʝj{Ƴ9 ?'cs&S no(:szSӷw0IG^J0;k/Nc}{`U^+ +[ZƅmE2g@/|.啀/gy֨"f{ ̶8ڮ2 |%|כִ@4ֆph "} v>2} -qjbpG=cöhwW,zv ض)*A:9\^+ycOF&N2Q GrJw+~;2׎}^ą=3%( 7J[{,C8-rw3ngp<&zbNl[yגo~*u97 x)m>rw>ŭH.T\Gtߢ{ގo}[z{"u~{olrq~$Pqn>>yThBeP Nކ\͑DWP엠{/}8 Іw;Kk]Ȗkpdɇ]Y>  nqMǾ~7]j?KP3̏)G ٵUrW !~*&vܽjw?'9|$ėaMb_F5 "&m1S {ƽ[%DQ.z WGlC_YgC-_W>]<IAsmh\֖F)✆Y|%j6TY7h=|n2.}K'/_C#%|1qU>_ߊت.C}=Uq9'8Ц8y:'4Ll797=3aⴷᙟ9?iw҇ 匉_q>i״k|$-$+{u9 b͏(J׊"~eGE0wpd&tH<3uD|-fym(1+G˃awƩ:#^3k8KtG0CApi*8i9lsUݳY4kwK ކb?"Gվ C.[DҟP+'t,ʧbܒ8Kz,Z""YY:#ݧt*!4aƕNѮЕmWSwYeHcRܟK-+8ݨ?ՇsEbasd·d8^S mQ&5z)WC݋s!YtdM{#w\묃>Oߴd6KK+f1 Qsv+6<|8!qxcq$~;kQia'i#bϸ2_%?<@?v̍fzPM[ o zE}/ 8ec/ʤNi|=D̯Q+te̝Xgp+@ʱ5pPQLdoۗnGίc y%ywYctЂom6u{EƴhwHgX/sg0}`gUۢ251e9}to"~'W~0mr`8.IXܷ{1\=0F|Ae:mm`ٞF_dmb0*']??{^lT/qHmfYj۠Fب9*Tf߀a&PF(,ځ}F{$NP|\3FcsדoIOFs?'5>fJjSMmm'GCJGUU0]+Cíj`r+j}Wf΅"c4v-B/_ˇTid#}gPAu.ASɪkŭK#ќt&Jg*M42IǗT?ϞaEj/v]/Yg7M:H)٥<4ەwjyYoYCL][ߒm'2Wj#e~+o[sWoh,`EpXٸ%{ 7Z{Ƹ<< w c*"07Ck`EҾ2xcsckh[Re~z+3Lwe_NU>1Y+}g<z-ԛ5t3}̍G Ԫx~Yk)o` TQkCsY͜WB(%_`#3v4(.#ze ẇVw@n\Ozsʜ%o:4qUTmKw]?gZLuV9N,&L#~4ͳ!3zh~.#ҕ _F75h"ǎ²RmtWpJE }fwF r 06۳ߊ; `xMo1zr=Aؘ}g.cM-W<7QI@vuWڼb݌: "-Wۗa||df*Ge>x}KLu+u%Qke ]h3ՙ.sXvȥ]M5]P̝,$Γ6:OԕbrHq߉9Uڗq]$ظF&R8֬7ѣŲ^Nvvm0.~2~Wϻx2GmxG'Oӓy5/~ߤzr,G;v}^Th(O_DqyI$wB1e9g]grۃn8* qa8M}e8Σh'7um{m7vWOr'W˿=fsd1ouӶm<#_i7ѣ'p|(xzly0@P.@` >չmbROzG'g'^'hp>;ggIKat~K/f77oN /˓)y6 .tv5{3su:8o{XeEnǓq7<],ͼc?`16hi0b9o]0Y}23&˦[F$` Q_/Yx5yv|IM]P-cT:H.$$$l4&<`\Xu# fsN!̃ TepꥩDŗ'>dԄzvT}0KAi!S L' 4*I L[amg/]͐p /K%w~ut>: 8yiJDţ͖fvri3Zok [=o-g>k#Ic-':E]k'<|=c &x\˭d2MNxAuN=3t4 6`pq,^xm[qeh\6튱&3S}feG2,:u/hUiF'-b_u2i1mR\IxX&U=T}12thE[2kʊLD6 u&bg ]l M%:Bo mz^I=O|ya7pۧ-as,r&0in`a3 ҸCEIl[=bO{I3}>ȷG:ɩutF")ܢqLe2ѡrJJD_$wljyLy> ~]٣Gz|&Ș7˴>ũy0$?rBT\ ?9K抋̛MKtk|]lӘiԲĞOuJnKZwy#^TZĉzZ^,+Ƶqϒ\R$6_[Q%&'LF%v2 O5\i "0eq)GdV^亭\E^[m]Ǘ!\EEnd{^}WԅWe^vLpUnK;q5t+GfPV׷$9@FEhsH^2qU{w ;\~Gڃ^3IzNC{t} @' tJP"⺍9 0|HOyv,]-_籶#y.܍cn9<>sڇ4YI!k.8IO%$Hӟ\hhLeT4 Ow+`dekLmFH#[TvxR! A YO6AͺiWܮkD#}lS\t䱶P7Kݮ{{\3Wçipi C|8$}t.M-^+y:/E݈*)NU{鯓~54ċi'쑿d_AL{27~b䛊"&"y2U eXg.2rI7BWoCFiˮ`?\5v~~f^y#}f=9K3t~2xt5~fnqT qNyS?g}R͂u3GnO*MAã)c={+l\ݘf>T&w:Y*{^ !OEx&N?2Ueo `Q$Bs>:W ur˫L6l+ُ qcGWe=(VʅDeJySkEc2(ϷW&+ ux|k9ؕ5y p^25[ںdZh&,Q݆.Ō=WT6qFT,=0E8PuH^uPږmm$mn 8dҮAs3-l>5c:;w,_/C{&,1z*/'O nd )o?\kTOnoǍ^lD۲ woձ퍡 B1ǩ[KnZbC|CC5MHns+-K TΕ K`BJҁGo][[]_{_w$F[EC}4v-W~nNo>YskM9ȶ.Mj̓AfF8&Ǡ2K WՄLʤL}Kݖ_BB][#W>8Ɛ@:rc0]F%!YkݽP;Z(AE谣hF9I߉qYgK?PAmoHwihT+ɿUDByh{xF>@i6=DL ͭEp{lߘlH COfxq?-xcS7vt 55H94ɪN|Ii}ALRתϘsͰi$Ɲ8o%z)=E |sTSk}T?PZl/moE/rMt( }\8LuAeCw79~f4u|zΑ,jN],ՌƳHݸom QvѱQ=Svƹ>p}*V2'o74Ut 6ɍ!q+D0h]#E3Ȧn7`c1znsp"63<λzԢ0o¸Ɛ FYqY~%}' 04\97϶77摖2[4F3dm:!c=!vdz>ZIZ9L[ihLVtk%%?5NB|&(scg̎d/e젽OQPۗXkߛ1ҟK>McbO͑t쑉!~*qWUޏk co܃C$LǭVl{{%{^QޣډU~Qojko[0:!YpX𞌍Yy~a8M}bnCZGUrקjτȏn9Ϥ%.yAfߴnX8tyg-ifH:Zǒ|.TgD}^?ZU^籖}g`̻F|1[f?)źCyAhBuCKe-!])'I߂Rp Nx:FuI*2d6(1op\;0ecsvX=:Y^Zߌ]kpnUHFm0(̺IQ|0ڟ`>3Ľ4iҙa%Ɵc+ks#[^iXXm5MTzxW|sW`>}p>B4+^{o?|׏{!>Ӿׁu"D<%w[ZDtuג^KVRi%Q4["n0a9ݷ8FQf)] )F'Gq|6rȯ-brS>FKF9uRS`/Cr_Rd> NǭתbW~{٣ǯbhЪ}ռ(C5>gL%A[Y6{'uX#mӺWu>[jO{,Zm$_ۚ;込yf|؟Y}r{z6|slP oKN>Lfh}QIWC>"(Dvle;;w/,zWs%YW4x}At<־:Ve|Xw_s6?ʜ -!ć7|j\嵹 ߀Uf_5d?ў+9?DbsGЂuyGߪR&SkݩbD&>1}5q (KӨOpSF /ͺ3䱖W@{mנM%Tg'}b$5rt1á|։)ta:Bf,t:}'60op8gɶ9C,y^]L;9E6D947?X+g[q.ۖdNƏ`0)kp\5 'uLKLݗnhitYgYvo#$j2؞0H+ywzF1ԱJGkxƤ.t} # ،x6|Q :ҕ9k(3$j_ǔe3)CQ7kp`,P穲dI$c!>ӾF}XW|#ʃa}\;qt&u@qR(tZ;qu&ɼ:5[t2R!:5g!lL+>BF271QhLSy#7W}JQ|z![zSuaX579'gAԗ9vt|sЛX$ސoqv] N8-^ nWj5Tl޹9\ iѓܱMwub?:AuM/ܽmn=g3,[LN.8.,ByB~Eʟgl̮q=/V⤘ͩrEe!qz>r>uHW!>hRك.pe#߻#>dh,) Fa=Z|ʀ7۵ylP~tc9Cs&Wk{R굣r1K` 9)GƕNwʝ3np~of/MB2#|o8 2œ[pdBozڠxA"nW%rrul=km&vuDVaE~>J34]LOty1E̶DdmWΥ&fR I Q\CHro|[؀bGVJ_q]NCgC7q Wv9S͹ &n`kZNܹ?}rsNa[!{*/թ~g{: %m$bG͢tN3Quqc^6nkqYxs`79Rd 9Ąo}ٚO~lؖOlx;Yit8ݙpxzNH(Rzqh1,WOж7[o8*Q[u/왉sg`(A]$M&qE榫uNEg3x%&>/WK[H&`l#(f@l,dۑg:.\OtԮ"91I[I}±"j'~P3:^(BgBdyL'2:aǨLxPk8؆w;o拹FmC]ԑ%aSW[==nB[z[j:S:[/{JA8bo,e<ÝR+{iZe X1zk+7T?om"~?Ky8$~UЫڛ"9%O&(m3D4tve24P}䬒Z=j}O64f9wCr(L= 'D-;6BB)8'FqkC݁Aqy[5Uf̪Qq"O V^۷Ydi|n2ӊ7]5lMI4ti ٸ)\s{Xϡ.lhl~zcC<8t&'휁|}ʚ3*XݻnuƄw# #W}1d_ +Yu x;@u@crGz{뻯u\WrO9c|;+'tɠ q/KF)5EKNo>N!`<1P@?lO&}W6?O|{8s:OO]CqRwd;*|Wƙ"3gil5!qi2,R³J'!X|n07zƘƽnܖr]ܦcYK1u;6Nc˻xMM6|7}DHsɎni{|jYdO[2_%mJn`:5DsT>m:j"Z̬ǸsWAPϫ|}~]ۮ_"c=au CJ2VB ]y)D2{=27OxL~saٸwrIۛ}iekxp 0-vj3ʹ\C}YôhwHgX/,ye'@LV4`GJ3XB`TǂG9eush=Z;VA9k+>1= N&hƈo2Ejn[th[ 9 RZs/M}t45BSĐŹGey=~0 y mT=!Vt 6P&ehb02mFateNr>!ceb2mmqV5޼hj| <4hYo\dtA&̫6 /6}x;)J3Ulփ鮕VSd!Wn+̜ 3ƘF_?n'B//!se*i[E8~1嚬JKk] 8RLoU~-Cev9I9Fձ~}fZ҇}u[Qtd t6,7I"9TQ\ɽN+@Q\za2um}Knm:L\&qP6 s!y6zm xM3X0Ȯad+hvSiu] v@񅡾18X\ܟ5`o -v!{,[>2x vܷ/gWSM*)¾3s^J%kOxM,QܠXmu\VkXZK|K=ǯi^*}HR?5E5YB)Gy͌o,iDg∸~mΔ/q3jV?H|D<8|Lxb^m_߭1ŒZ}}<^H,3WpX٠u%5k|/P+ +Q`VJIQnW#Uk9.¶yxn"Nh[^">.)γsZ t>k+KIvꎐN]Bhʸ.:zZߣ<}h&.&o]Lˠ̯n4LQ[/?%"^ѯi;ɓ 89btvy::ztї~&דfy=ߍݛŨnW>[yB"o 쿈4"nI0e38g]grۃn8*e㦯&Eq6qZqEG8ͷɷ|]=ߞ\-ѓż?^G#`σa"g~tp룓3x} 1lp(Pσ"UDI__~\6x1ox˓W/eA;|̓]ݲ.Q00'0A?/vWg:?y@f77oN P;i7]v:t``࠾*cP,+ew;y7%zdgouyYq= nlvePO'l3&˦) g 2<dJ|F>]_w% =~)c&+ɣOlGlr?W/GT_=+;6hf^ 6lلާ%gX㌜ʋy|ӭ.}t+h >/}e&S P(f6_Lۅ<˷ xb>rO@ P)^[T(78Bc5bRÇYFy,, $0|\vSX;^vn3O7|4<Ѷ&qԼ̺aSߘ9I׏!+k#>@e44̀ak̚jY9ҰZaew˷ X/2Ѫ2[I`4Q_/P0VO)of7V/ja oHuЇH.󉶹a rۮvO[W[NafC> r@z/hA20awS P0_fmn26[VQf} -_x|K+` \qDp ņ2?}0Նg0zy" _ɢ鮮֌j=<0춛R>=W?H.tafFu;jBf}?萎jSu(^Us# eW+6RP;(^~@6Vv6v=6j/MT%}kuoqsC5v:~7Fc}սL&*&&*&OaJu*ute tװ[m{/} Sюɒ"|Y"{/a~ @@?^$ Ym ߶LŸ́q WG磓C?u;;8?'ųѳG;qF磯_>g:: O+Z=| ck:%=^n=D@:,"aY=n9DbEM|$LUyx{cNXZ"{/Cx:yN%~z~?z~rgs1rJ'[uXYEdULC`VЅl[_xT|?x:f"?y|Aquj?" hU 9rVtPV =&m&$iw:i0?k]糛[ )k d(뺏A3YGU<*,oy˙aL ]]-A?bS&98=Hˣ˃DCw5!7LR\su`2hMퟜ8hpʦuzN>y28ބ6kQ_ XηKT.!{vj+u!M䷋#A vזnnn9$7@UٌX)xv^ɳHZq9md|;)'#rN2$| ا7L,`1o&}7lIns5SA:;Ky\1 Az1jz Vy!N4,p5lnFn6uoFc 2߽?.v473k~KrW cZurо>@;[ke/?䏞c\lQiTs6ۈ%ͱ!&[ ^n||t߁60@>ev욧]J8u }]LUݬC:/5MrFf9BUϳ p;3g'd\o H|fb溞̜ˇE:aϫs^,Щb M)Rlu]}uƘbffh``JBk.AMW:)TJm"zõ`̲Gj}_ IG9on&ͱAo`~6h7%ϙ/$}5 !tt25o6:o0zIz,{™Zp[/ݣdx|Qio odeG_`Ozeq"Z^Z5ofOV)Ɇ#ƀ;bK<쥓1l<.ש톏B[rDfJ"ptq_Gޖae=oQ\&U2 (Z,o7<`MnUxI=˰N۳4 yf7peݼ{ 5򧣋T+.g],s"wπ7vvծV d#Xoл34|MU t@PVCq6eJw|2*z3x7e-{^8^IK@tʄk<;,HnB,EK .,=\ \kQtqpiL=;-,↻{qXb׈#_1WP@na+*6Dj9ǢM$^ؓý);A"\q0]S&@BlvhE|fO寣$wkEУzz_XU߃c:?ЍK!C6W?Pdz#ywNv.ňP̥5<uw|kz%fGuwvy3.JQwN^ 5QY-0Y;`QObh;\obb;Lٚ[g8X>>Fwy'o2PQrsD~PG. ()%e% GS#~Ynѳ3b&^m%G@xl P,7`(.N.W2(0.R;Bl\8 7RAȓW<P8'ڼPd8YKBqyg(@BQ+VAZN % v ]]v7of I嫗#~FS ^^Z@P iieU N+ˋӓU-8v+g#.ud仏t/6PTܕs p}CAx;{XYZ3>4g ;HT]I w!/R|,+ק.ތMWj;;x y6wAfy?gi  |S۵%ʊVAx74\7z ^ASw Ϙ;/.DkHxN2 ak걬^ e`8m/7'9^u2ι2??} pC=KvY%+CԍM$ChK#euAVyR-}o? $Jl~ˑ W=#ϚNgG`#0=k'ÂIUݭCOU !3{v/99 ?ofj>vT[`?@C獶xID= $0{"M;z%'N 5EN^"I(sWl]AdZߏY/#fT ڪ23aQw[Pbaa𥭚᠄gUk4c˼OϟK^}=T6qy<I&W`Ou򽘷ǪF,a {e[s SFܻVN L 8Xch:arkc}V@Q{WlRYJV`k˼+%%3c54NJ-5L wZ-Uñ _!FەxvR^7yXtCwi{h.U̻ 9Tlz3ޙ鈓ƌ+YDU;etBjdMŪ|$Ib"m±Q4+V;a xK+%?Tci%R*+FLiSZjݔo$.ZA%£ HJJW"-b.Zb A'CJf]o3"e3s$Hc%4"lpQK2=6K%44͉/=eV@"/+o)ZNE^bUBS%y -56(~\R^̮%DVFDdSژʏ*uyZ\ƪ}:͘:cO*1f U+MiV} (u:-50x_IH5*MN"J0h٥UKXFm "Ro/|JF1Eb~rsHPZ<߆J懙:F4Q!hXIgf}C-Q4pko`,𚘛2%GV[8DElh):Ej{+BSCV5N҉Grgl؜8=:UnN%Ts U=Ը6S S]&OpIPLTQX]jc2,m)٥C#-Gvih}MolE„J4%#UCc5`b#Md5u_dumjgZM:zYF{SCs8$5Mc8nc/o(_#iiM''C:wixv眭4&K*4=J+b2j3scC+ɇmK!i WTCŖTOQCZc\H{t*k]Qoah{ؓ~W4[] +xx$Eph(&-W96'*m,/jPeύFUr U.?HRYVE~F>5ᐌH3ٴqo-H:DY4F+Go!(O`|H8RSӤkn+A_Xr Jڥ0R(y{yA`_j=Fe>dƅ^9ӼRZ :#Į!%9QgZ%UP~*Jjwp6FKZ'ܱaz (_J*2 Ҵ_Ojޣ=1>boWXđk-Nzטic1C3hFx b$ {i12IKo[]$ {MQ]ǖ +}RNV lq"$?4fH&^Ki$n-ج"űh'CR؟vx;R L>7 ֝hFCa }Ԛ&b"ٕ qVҫX6:3-i=whFEa KJZyϥZ 6vZMm*jW ЌG3ɘ+jJ*1YgNqf2uؚ|ВU#kQE~tնIZc}W`/%}iI@)l ;y5rt eC:Ȗ5CRR+Dl9?b<6C}@bxbb[ףJ%y z 01H|Q"OKs-ɼ!i4|!VaIF˥P+3zI?M b/QBϰiA} igA߁w|PxԺ)f3*otټ!!a#,-@*L'2kXdm3jׇ9驯Ms _*0V5NFP3FZ=?ȞkV~f== ٢L$@[#p¶4=қq>m-hLࡲ1{{h71elEcKD|IjPEcd.Ka:[9Qn,n~,&AfYwc衫cG~'g ^(ouz iY]5mM tg,ȻqmUl A|x0F.yd Iz?n&wh eh+Kis\]4O,b9D7F㝍 1q nQ¥qH]7ig(褉Q;jP4-I me[E1dB:OS:MOY4.*uK5{tuVZЬ!Tml4֪p269KhZ6L^R +Iyjikzs± e~Υdnɝ9%A:A/cKjL(PawGc4 +Ӵx/ ?f՜ JIVAT&Rehk?AtsEjz!Nf;Ь!Jtkg?5Gvi ?sǜVz"UK+QKz>#tAIK!1<Uc]cИeu(r дq,%~/ X.Oo2( V=ʕRqk/h7Feܴ)2ؔw,H +{-zSf|\+!EhPhMhg+GKD=b2XdV$lePl)jpzoIRxD L,\l'dʤҬ$~$yFPV*t1GkSlPCfK4 Gv ي&]:OUy'm_鑦QVK;:SƆʼn [MQ xt7_-}T R5idS5Z VIg= a_i7ҙ4 /#h[x".M>]1!Ad,ѹ,2Ucu)5RcRhz+sAYtF[%E: *ã7*nBKn)&]Uccfe:/ ! U}xc6pEbgEJfw/ZFwPkuCFhv4qeٟZ91a:$p19k(.D=9!fO:@:Tf7}%tK8͘(̘y@>UR-{e4WcC;*voaC\xTph;7%.χ[uI촊8"HF59ծVzF/^Q[Jouby*DΝRz}DI?bЩY^2G e權| hhJ q:_ei>Il(B{X džP 3d}.>/p^5f)=Bn"S`HuFLi&':igz 6Ԛ "ZALW(P2OVMLb wq( 'udwVG|a9"']:8sl ObqEUII^.~{5w/lea.emc,o:.4 3h\7@wLM\Ay5QG'd**Y\07]JDWeeiCJG dp U,)ozZi[P\JIu9™M|-"N򺌤VsdGqrgeRkr I;UơeibLò2$b@RilUԺ!Ez^Fihda\p:{c'L’U{ es@'`2&7$cR*6/MP1nu ~:'3o5<86YCXJd|}b $;ӫ߉Ā6Pql$*;kTU'k|8j=]Q *ǣ2A:#=_6it+oS#ٺ|GFn'cRXSx&6̍!$jnj'N7P~B'd>-oYul'\ug:ͩ;4!/ˌ洅)QO2* nK<ˤbVQQ5vPcPv4*Einv]Hq@}!))x|Ax%EZ2؅4wۣŲ^Nvvm0.~2~Wϻx2Gm푨o~MIO7'gףΫїbttt>{{o}y I4K_Dq9$eO [Fs|6[*=z揣0+7lunq\y1M}e8Σh'7um{m7vWOr'W˿=fsd1ouO>#Qr(`σD_2DG'gG5cvQ~E۫ >չmbROzG'g'^v>oe'W]svv̻7̓}㋣]hٟOy):e,9Ndͦe׼ήfo&">Xa:8oJ2ˊ*xݎ'nf/xͯ{|;Y7ٛy}~ub/A> nQlvePO'l3&i˦) g F<y0|0dDvQ<]ٜl>oyẌ́L@B}A~ E?\=?:n,GG^?=LwFvnz'; OYVS`mNG'//Wwto_l\/X=nWtthtztH{hX[ ]J}`߿qe+i˓Uۮ|˓ӣp5+klp&n˾b_ggu{a|tdmWšk͠Yg^c: 4ï_>~M,2.חgWYVG/}P ud(\!A8$r]ث/?He!kkZ x>k4 V@'VE@e.2 HT[ӕ[p PL,g\[֟>>>:Q͊ntCuV>8 ~?2'.X7{W< 3 *6ԃAP zpHs;ƷoXgWr D_Y Wh*iO5rrrpxn f$m4spzx'AmpF *F*W|v~WXEdׇWgwX WB$+px|+[T'/y VdWT"1[TC=nZ( Sc]ET=Rv>qc[ᚷxEs"5h.ݴ9%]@A:; 10OUL;e< P)ۆZ_paŪnӫN7k 5So]W5\nް MڃU lv-J|yͥhԦ ڪ#[Vxz~4zؐY?A+fu|C`pq~b]1Kǎ:I;٦t}_;ئ|xŔ%EjN_~P'FD8% h"ʘQ*پmUwr&L/_ U2uk_ 8 3;r ֜k|n؜6o!m[nًgӋIt< i$ڲȀxt=t };c`uD$/}CHִ6FN.W6o$9K#uSm$\~vru#ؼV_<yziH 'l=o 8l6o ͆`;;ߪ-up>fwbJRTKۼtj|Ǘ,p]O6ëQPjxQ?Ɖ#c1֣Zl>'d9}D_Y`[,sقl_kLWm>>Y6mKoW~ oa-xN[~ oa-pW5"(E}6vc{6b6~,QϲM^&yE[m‹W.zW"^zxEVՊV++^YTL49fRL|4#Zo4ٝLzڄb)ţLKOb.9Y3'b.9h*u#R|϶϶϶϶ {5555Gۚ?ۊ?ۊ?ۊ?ۊA<ۇ/kOl 6΋찿쮿쬿ʾ쪿ʞ쨿~}{@1٥zj7W@R*WV V]r>Pxi^+Z`_ZZR\`;V&PyXVцvp$5΍H,1iOg 5lc֐+Rz!V) <=1dIH=A _]@Ɵ`4q]vB3gVdk`& HOŸx8ƋuhU?F;3wh~lݬ3<(WM,vQ[`AXa/0Ϙ;q:^~'Yœ2:UqơJ4ɗ^,F*d1oi%6Y[jZaLl)Kh ӫۇo%W o8$䃿yc\_{|ҥ:g=ǐ (-ɶG.Iv|O{Y2 )|X#f|Bp>ug {"{P7Ďn665Az,e(7⽞Vu O˗QY1_@nnG3dDiA1|ר'~87C.*ȹo%'!b| uG{ mt`Y,Z .Xlm^dw(9M5=qqLZ 7T(jrÊThOCg) 6:(C{d c>} m۵j|$+7eO${Fp~tޙ)xu>SǥMО[og&_#~՟/x寿X-fX}=Kab!77jK 0\d"O}H/e~$YHlЯÕẆYceupjݠwnM/FɨڕZVZT Q$6tRD<ҠԖ쳂N-y'FZy ̳c`kuVgk!XK0y%z0OnY ̓[y,eT92gvʪ-BWhyW\5W+G5\U9d'\[.Z˫8TzX^ϪtUc)\Y|-WgU˷L&KˎsTyqV8hq.hq.hEj$XyՓVڇ̢ʵ֢G+sAǹ&VfmUc5sie%ET^*jx.W9k|hp\T0Õʍ.*/nTe.uapZ2bY?T9VW6pѡݬ#+8LTlɉ!MW.+2pbt`;941xlrX1a9\4 eǹh\ \< W.m+W*[ *WÕ=6U0Yy Y ɰcӡ;K-=v kҳj'$I=3CC˦Y%+/Pe㬂KpX9$ 8PǦ&୩Ǧ&j5T9$ s9(3Ijt WʰCkh.쿣l@>ROb%:|aHF/FTF^ o2" ©C@Y$+kP[ @V:jF h.*z . 2,+}x8CW? _~%`H`|X8`x`o'+H`ah._4"-O#ql11x1 wBg~UXQ`.͜v~DAhPvFOR^0]9R9ݲZY^S,d<-uwW9ߟv66??w6Է~Je4_>of 1K6"̷d?H&cN.W#Ltx+ 8XbgU~ΪU9sV>gU~ΪU92mVr# ",%5hVn/f^RJe`B<\ny5#Zp#ɯY[E T^E T++V.+ E)3;\WOцz3UjTJlwfsXCg>G~+-'3,NrvRvr)PQh+Gە+ÕcLÕ+ʇƲM˪|hZF j^}%[V ij+7z`AyA傪T}xt綇dbZqF34>箃FC]Lxܻdio?c^飚fw߱>7vVg?!gx>83C=:4dA +Cl0S*rm~a# l+i@0HӠ? qu:j>pLo^>Ocu033 Cv[`@|?aM9I;نnu[.x>R<2%_fب]ѪC˃؂FINaٟ Gn.E]gEV8IT3nڟ9&D7Z6R4ܴ3kG 3ˆ Y/^ϞhGǀXE p+Gֵ3gO(": CF! CiCAA]Ҝ@-qSof%shg3DePэL0^ӦbT$6ÄYOZf_]$yRC؏%1Kz5i 8`g;XwX0Efc/w)fۨ*6~C;DTQ2R]Q p:"%eR\0o ڒueZDeTDݛwn0DuC~Y;i?ʢ.)TE|:bvs!8a ,R!~]j Cz_K(1R#&oEXBFRHJx9;߭ ?z9|"FKj D~NQel`ݏ˽Gv sb#( լE{tMJoy.c h $G < /g3aK$`Va?f~D1キmm/𶬽=1 51$1g_WSL[BOUcs_2h!Di!EI{KՄܠ}n0@y@?~uzf6B)75=|Y{E~p9a_O8#?S<(> d)t ,=fYWlhO 4/p-CuM׎wwz3qn?N@6mD+=N^'@u^N%í'oGwQ&ZTۏBjv qHV~smy ϫ4sЗ'm_/'?Sm 8m"謷8;)vQi gF}%}w²K-U ^cogY|4ꏮdlCO*?>₋*)<Q9z$܅u..J]aCl]LTdZ?RX_X^m ϹL +@1le h?t{4d )Zt>E//b̜`?d{ݯ#o  e,qW%#0eY!-Pig+h?\͈NY7^#V{h⧄rEeKDQkqEzIQFΟP8}paP_@/y!*0p^ V,s$FNh~L(oTLґnrbΕ#ɗ>*rC(bVH.qv3d~^SS](<-X6;1Ohu_s~ 9V?t:8HXrouf"dJ&%Zf%j@chGhn5h-ab˦w;bDE5CWm8Ԑ%[4-ƌ  #kۙ:ȯy CϻuuajG^`IOZt%5gس]~i_(~ (MՍ/Nq:Ko?^3lt:~7EK?Ё >%Ʈw.\ W{@hCEף^Z"Nxa9Q=qE8lQ]բ# > Aӫ8͖0p&nڣ](H:)U) Sk5`P`t/oOgc ڮ0Ҩq9:bea<1"[/=̓N6.3 =ƏJcnb>#2ȣ^1< wB<@#2pI$y' ?A)'()j ;Zaƕ.2y62X1X$=lbOb EHg +&XǢ?_RI=kU[.ׇwZX>|/0%.oP&҆X~n7E)vkY2+M qqaf6T: hic uuh5ӗEFbq32MX>2F gvbu ONGsuȅKYh?g艿 Q=N#l>?Py@|QT\rQG՞ R4a&@uep 9\f#ne/m& [M^ *rȓ! &}8Ѡ%(A~q6,Y#eAOTݚgBZ=a4v$!++Y7G56,~Py"V++U6U0Dz%x?IV*& &Vc540zƐ0݉xw'@zX5|vpV.v _cqh$'TG/ʫw/ dUY" 7R c+Ѱ\izh4_@X7|@zcrA)^Zuۺn`6 LH  0<dVf`q,rI:ɇm(ٓ%}׼a->61]7{ǯ:OTSeFY tCħ~miR?ן$9bJiV?0ό6cboJyD鉖O%(uim۹'`E$I8!xOB fBdpjo#6ZB8k.9s+򿮐!V#өvJ0T跱k˃osgmۓ"Q-E CxxPS@n2w>1^9#L:x^w-+̧E[uz2x6$Yc,h{~N ֆNn7Y`=g/ Z%@(*ō;7NS ǖɄ[bq'2ovAxWz'h䣒IkgCbdvs= 7k] > L'_DYҹ_萦(sBG(O&!w}6vDpY*A1] 8 PR~ g\I(E`>` ٠RȒϋ6nʂ`_ܵ9UOՖIl3>hFnvo# :=OWޜ9>m\MM Pœi|ezvnЧj|n@ oܰg # lQ3'd#-(MPAּkOX'TKBMջcۅ2OY#YGד )IfBy{6ɧJzg< tX/!%;Ne.T~J+iQ v0lcgs*E$n#/Rڗ…VzK!#H#JC#/A<2UR8Z5JrRk%33ezJY˥ vm +lpFcxS?~L 13~p *0glLK0hEa@Mߵg6]kߕ[7cU?_'@Eb5P /-2 /_oMzoJЛ )7;nzZ׏ݐ^npV٬5Z#x"+?"iBJo={~|iZÃM0ID.|~ս ao?DPk'IN r)2ɮ'Z~h>HL9{ czPG3v}ba䶏'R^y RYt#}`OOS{۪CW,Wۈ^R|-.& tXj8%F0rQPo9K+  O}as7u|pĚ"ڐJA(¶y KhFE40FIxyF뀺Ȋ^aH)޹- N@.5ٽ`[yvn5[[͌ܣ+UQQ k^+Ŝ]{Aas" fװrܨtO-\?-xƮi[(a!O*^APe'UUz-F3d`AB_濵][6-U@=B}QUy%[0J~dJx-@ƿIXRdàDc&oSG0XUV( nLjB|=~ Bvv TLn{vqN 8|rr^"K,3[輢=hA焦wIO(gi*)ѕ=kLW4O*MNswX>Hbd" iHCͣ Y#K!V8Rw&SXesFCQY {J7ռ_<*bI7xyJ;9ʘ*.ܓhoHǭIpv  kFF?^^#0))~ư qliG~Nrږ.*h;Q[VYqPr-TE{xx_DyXx1s|ڈGvؽ:7 r0jNA 5=$]ygZ{k/ |?G݂!үC6a.M<6rDvvrA#ꥺ-|Փ]9kE < @voQ4ޞb![1/xh7ZKf+n0[֒Z4-`*!?jOkuKXݳEo䏤fxSxBF,ZK:\gY=}Ż) IwRlk3_ cXx[ v6"ΗR9:lg9sxsUh1rI4-(BU& 4)Meڹc,zt Fl;.z%2P {׾ux-# v{2-:J1-:vg17OQۗe27|j ;RlvF_E'ıO#kBd_2dM6 HgqF?b<=/n3b:[Õ&^XŽ! :|0[!q0+ʌ뫈Za[^`9 1r#W+?/+() ◖}Ѩ)*aA;q .1vr㯠Xi|'ic5%[t|y262nM>nC@7 6\?{[>jO6ByEC+;h'ZJ] 5|~qvj^^x#O!t j4Ф1Ph^O8O%¯_ݶGeͶ jc[&FPuuPA N(~ [¥k36B-\ ;fx7)u=vvoCnčKX%#zЃp;16 S-,\N= kM<&& &@+jzRa ߓ[Ы*4;T\U[{-nD6O5^[WUy6ȮUQ TSܟ[ D?4RDUUd,QAVƠtׅ)ٍemD:n֢sWÃE~s}te=8^wwl/zZ+͘\U M[+"|[_8-]$ `0WE&v59գ~7$}CΠBۀ;Zxs *"cS)]OϾ6DY|T -vKN'.;wZYx_A[ z^ QKkY #H;çTbB.[>6B+6B+?>=ZfK+'7"r}Axp"*ʻrЇbJl5[+cZٜ%s|+Q͕ }":W9rNXc]|b1|P)M1ReRΛ1ܕJUL(Q(F\jEP}Nԋ _pc=Yy{32cB=$hlZ_;c3YBct &x0z,DLWx d*ָL2[9J;c˚-z\;a9_or2,닉U4 Qct{% K -s0%1t[w}r#)?RMo 8$Ym6-D;z=!mv)xh2£DJ;Du0nRL߆ /&C-YTP1%&^ ^1%Ը 6/2 k(*pϿaY%q6a~ť\vw0K_7Ȥ~V'~P_CM];7IW$^b_)05c0R FcrT{21('O:EgV6O#K`ʬ},;6?`~l7[ uE,_r~Mosn>-qqٝ'Y+erIA]71(^AwNG@CtkH;pǝ|7cS3؄{Oqz$ֺxPРBqbX~w`"6N@*I]G[JNd=X wPG (c6h 1T_]+9T_)+uݏS?cJ0`, $/蜭 .C9Vs@вTga9,GYdRuNQ6JzI$ZыYQF0 1:9  U+2򾒦HX 4P牳U&7 !t"(qf '_ V =F̓K%}#P\F"ΟL4>8E'zn&Fu!@ =bmc͏`ǾcǠ#91QNDxh\Yݫ s2{vO{C^)q9OYX?yU?ev㷁 b+?V6 ټsb?>*khr:-zܰW*B)3UvWlgv&Sd;=iiEkgcmWMLG`{mfaiQ5?;YBo ]4ViqI.k |eLS>IݫI=g>`Lf_/[osvo^Yi/Z3Pl2EA#-^BsZ6vr~k~ŁOe<<_̠j(bQ>8 k9x0;.+GV(Y=`+meST(3g~տr)vLgA=b2_OCs~Yٌb㩀hϰ S6(I3g~-A719o__V=]^S"~WC?3K'Kcoy#k;[0\a}Zhrj~=az(0~h~-p:+@K,8' z{ṨL]}6~I6"xa,O!̱iΦuIXdTO`c0\ :awZowS@ŴS  DٰJ`EHֲf>ņU fO"q D%)g TyS7E@OX*zZy$0mblj +`#AY6뉰m W>h ||XkJiٮ)NJzR%!O @xZxmi*.>% 5 Q@C!=6&'yhQ iLdW/Ѣ&U.C 7/pZ6]IVD+l'd0 T/zAw :曼8G[BqM#0'R\icf Q.HBY3ǀ9`n_)dy&cႶ >J+q̱!5$2S02y5^5($>b Q*xZLM }0.&?r_3U3h s2|+'[W6 ɬ!P!2p fHGBѢ(&yxKd?M^PN>NvaQϟ'h[.OUܱU|>y>yӟR_8.;VT_-2q d;tvąT_NEkzLt"d|Nmwu#P9q:prg1](+x;ԴŸ[!R2J_|Vw^TF-*NL)~ܷyKOTO.N/mq͓xd\VfZ%ked6ߛU,Y~s()^2YQMM/̈́ab$k/^iiaxE]2<A3;[ģPn{C:{7|cA%1DgX1;'Kz~Z!re7[~N?!K@kU ` nh(!}2~ DydAhƹžbtIblm̩X=:ǖҭ|veYIWiK z,7(N|Oˈ;]ٚ,B&+8?U[jx7˪or|6Q9$}ڕzxyiT*bW[+0D 62{D0Es 1Sڨ #eE0HaI.)%#a#."LE='媙E-Y4u7Z1Z5` Z ~uKlokĨ7[; $ x15M7xڇph`l; 5:Rb֛2U$oQt:0B$s`41&?ӣ1I)4~![\3ԏޥ<;`CQ>,0Zm~gsw8dRWh,`'vh01?jO? d>u@N)x% S ҨTSxڥLTZ7Qe\6}՟% |`e! 5NgO]N 2*љn:6]yx \cǢ,yc1U~ҡQ]ǝ#p?X0áW"wxJǠ3W@ꏊ}AFL{gX UyQGQp"Bc,~ꨖט@v\JR8Jx"[Ԑ,mDe(:=؈/Mn]{"@CuP9,t 4U Oq>!gEÂ5A,  V;q]Ml$K^HtoU_~OeY&R^bXpz> SˎnzSfY\h2x!d tuԨ(PRBƠR8\r2\gSNb-MߴyRO52B|x#`Ϳ_#+=Wjvou~x<`=Rc!O=:gud~Kf2iXGDq/IH:Ķ>`u?s@ V.zmʕ3 n@GZ2t5X'Uۣ9ƣZ^Icm чU \geνә@6kO&~̄ԫAMJ{A|xnfW"se'ixP$ra6"ѫ*-~`ET *z,]l3rQxW!XLl;NF"a\^t \\#c~z6yN&As35 N7ՓJ^rXE$p:c sKvqة~v^ E-ni %'7!{YGl,qWZ܌ǟZ54BDYV"vQ9%RA7+Z= = @49suTFfUMJѦ0f (vן݀ t\<+T!0G͊tdIyU?\Vk6P`c[>z[k4g{-+gI܄9^y~٨(/J0տJYqwp3M}<n~w~ܾܥ*Bt^sW|)N'+ws]Խ*zp~ւjߌXew' ;?+_6k6:XŽʛZqZnZQo/(&6R4rBxO~1ּ<<]3LOh['@ +3!VIvwwťVg<3jvVmhǵ-h{?Пߵ?'٦'[1&|D'~Rtm9[P|:?9/W0.̸ﱋr2ŕg90l,˖H{k:39Z|15LcvF pʳbvr[ܛ$6@n鵩Z>R䤧%ꭧ1sg/غhm3 ㈢גÍTVCh?>| gmMO0Jy#.5{3cb`)hk|-Dee BSEq2.[[ule"Ivaҹ=@?<w-O ɤzwN6WnS~hRi|7i7EL}NlUI+o?\hE陡,w,>{؜ B4Ӡӳ]V4#ꪷX '*[ ^=LM’"[RDheѷOsWIR#O<0lK㋳#p_*ȝ[  $o}ABeOgv/R焊~ԫЄ8'xJ6|35}`pzbRot{Jأ?ï}JРmn7bHvqv 9n7{$T8@KV"r]`i ؝CASjFhW}(2x$,A/mcBn5YD**%xpÑL㩨0F.5 qGR~snBO8^*B/1D?b(=Vӣ{Xz`k!4g |nSϽ)?q$J93Y)j_Μk1/YL7ݼ/1xNҵ{э{pT1y8'/ZM=02,](*ċjx"K?teN d[|3;W)S!~n10yg>íq6E[uN4T=ӍH?j!N>ɿCID"3}\ L7fb=Z10:S)K` !9rݜ8Mቍ,߬[L 3Ȭ~ /ڷ-K؈3P"AݟPج5r iwc݃Vum"'j6)sKUx iĔC1,3an(TJa\a [s D՝A?(w16)!9TB!^5B(0SLۃ)rLd]c~(YkN1tx>x^ЌA\@Abg|ZDetuAX7b7;x/%N BE唣W xr$-]$uLR~xRN5Y_@{Pv7@5kdIJ, Kh髗E- %UV%=k՚} ,AR!Ͼ|Aӑа+b [o40)jiѥȻbVa+ +`>"~w@m^_~ ,!$RlSɫ¤r@ЇCkF"*O1^"0&)x? =IZo~&"]! Kbb~3>ҺEi}&W`IKLM :Ae G$imPCM|H+L*G>e9,C`ҏA?~o H}`& r$&/.i/xwE//'ޝh1^4?WB*$O]3 xa$*a KT21U ̄eYT@{cMAIU '~û bi P7?/vMLkHjҹh>T1Pc%!n3b׭G'@G{[GTKAe>xO?XVY\zpQm8/ 3.W<`U K% AbYY̊+9A[b.)(/*w px5e KHP^JO[6oRgKՂ2AaY#l<ΝcOI<~S7,.Vlff57JUJц0Iaaz9,Fi.='EhkMB:&=oC棄߽Em\,7Dד+&YRiX/; Ү~t$th>۱U- {`VYb_|mSu~"#ț)g{;K*;< 抍peIZ50v%%e`4*F-j6= |x %iߵݣ8:(iP YbcnJ bqk[Nl?EioG.%v_'Hrg?6tp@'~{Q[ < E54ߡHryFL~(ws Bpkr4PQo/.q5&ʹ`~۔7O|_ @|Tޮk"|헂Ԁ#L)qe9leMtyR@p&.X3?˪ϲYN}@(Nhs2R+Tc&Ug4ܜ]Ohx b@8H=Ɗ>UNW%SLrNyCUA\QT AWzTI͂$|ke-؝3z0x/~~ C{m:4M{RoND$fHbL^(/GٞJº 6iBb~)%f8lNNЌ|apJ(/t5.Ւ+G|^9%CKD`##Z^f\K194k:~V>+`S)38~,V48O,>-;Uˀ hEv*Lk9 'L2uI/$b&L, j5%7(ا+4e"2v-V.ڸ0z!<˯H.rY/b=$[ܹ)6\Gi 5ڳ1v)5˅v%f9w6R!pUt]&rG]:EyJ }5s{@+iM˅'=l^gh,ݖo"?m:oRThRP[%|[&pa3pcFd2gzF `, ThI5S R)lEg6BU) 7yȲ?s`Y֩U~2PE9@ɍ_nQŴ$nNnP1 s_ FϾ&DyFޕ? M鋸K8:Yq8#C F9Ҕ:G:~5<_0ʪ$`P0[KC*W4/BMޛ!7pb-IE ާ~tv±.~C"B5]zZq%VwJa1Lz=% ]u( TH/:xn> w4?fbك1V>9.V>0w?˟]hW Y29$řyhLYk:QJHAYkO5*pj,V>LN >D6msDǷf? -<:&*'n]i L10<ٓ1|-_4$2hgŏFy[[o@xo ~hhQVCl) =nARjŰRtN/wQpAvvT?*!?NAИ *F wa7zml lL Ku}M2<%3иCepm򋐌 VTII ~ḣP̦ 3iCM}DXީ"M~k9V9&y"[8M8,hrr&Q?kvT?1 ӍzӘ >jZcW@ Yɚe_ s",;2\2ev @KjJNGo ל8t d\xcڲ Xr~k~A~)[7~#Z?:71Fŵ|Y:!gNOlFLTI)1GI3g~-A7f+~}Y,CU7;#d)dYs{(;73--ǝmuwq-99w<4y![qԿat?<هfQjg$,Z9:VJnrM$;]%Twl :"JQLS^ 8uE.ɨM“=ёߨ/3*) 5U8_R] 5jWOdܞ\8 hҢ$u>\P( /%C_Bߢ~eU:"0P*&rWˑE" V|nZJ D*Ab.HPVkU+0Bl5V5$xJy[\,>§gK$J$GޕY02UA[.fxAB k&bh5 !I'Pu;| 0S^ %Pij#*U:&U}uMhKx(6lB`@U%AY{c ^9ܷs>O/ & J ajJ$\l'QRϙNhCs$;|ZV|oMѥ7c~<=Q plzY{yyeqg]p ac-1'L*'ZCbly/h\)xF;${49WxIڟ`|/}^+A 4Aȩib6k`Sa8Lf%#sW0 droc1{ZgG{k/C5~tǯhD_ '+6p> !\>[ƴ_ v`}{6lClJ[f[f}qr.|u֕Uv ;kkX'/:Ì}ģ=t 7[ix$t~i/?zE}l5!~@Seg!@o,y,boҰ` ~Xu4w!^_ 6$sr:CKʼז_HlDy T쮵lC#&9];3%B]gsIDXeX"h 0v |WՎ @?οsKG[^R *:~.ɴ]ps+z3ϵNZ+WCrw4]YUcD U=x BκvL9\2L ַ6>#dM|$h<[%uIn AFodŶ3l^pMt`Fg/:3L}NX tXkh8!-Xde&^xC$(gH))ꚻ*˻n-~: Łze~eʍFu8p2lt 0NkT>[=QuVk6yEѪW.O vqٸ8oֶk:AĐ@3ny@GptMt:jxp0m2#SBRJEJNA0:[)V%\X/mקd/\8BBlh+JhFUʈ'=ڻ]>@CV{}ooau=;1kO;)~rlB#ګy-Z}CQyLG+_:.9`XDb.i Ks f,n"M}eiUPgvg[A3h nK$a|Օ'K$4_S%<2eZ2RNYl`}=%Mce|P"2EQFM@BJBoGq _}"1H3ٛHB`㛔q/ /kTvWHJaS_ЋG9@ j !f l@z`wM!Iɒ7=$8X+:25ir90 zvt; CnB *@_8ԏxj|`[{so8LÀG$Gs9')v&f W<1o6w/oA:|rmIo&<"Mgifk߯}Ϥ<S0G-'JY.A'OtD eu~Q7YwkIyU?\Vk6L.~9&}.#z[k41lж2Q;P)4$ѝPLz+]G۟kiCOtˮ6֩}HGJMAGӽ8=q—v^Τŏ,K_gfhthy7/+1!ٮsk19hW?ޟ͖N@hw/'|uclhOǂEJ4$a"r G d!y4 dyL:+Ih#~2ٰo9ˢݧ{LYҴ32W?evt:nr o "};S+mePd{k˓l3 ]Atf7X억f3,ͤv&[d?.h{;|W[sV5bid"㸗+4r\%Vcw"/f14hZQ' ;k\lԇGr=y1)|XK{=6û4v9XPB}h2hpKn\c]+B].rc˸ѿ[k+WaWCZp]^: F"xZjǗ/i—Q\/X ] \^K~aq-_0WܧrPG>B)ɡ0~.k"Y)hY2qlU':^iޏƾTvnm@e[<\2:[Qy|{#z5P4|>xAƾ'L%CFm4ѿo.җ[; | ۈpMw>~+GoG2 Molrz!\Kê?n!1CH,b[@B,2_BOI=$FuWXP6|SXSbt@ڃg?NgLR{1 %_PfaИg/rCۃdmg"0#sXAw^HUޝзSdQx;wv}@w>bsTz2&t)TQ|иMq` 8@ tCj ɂ])8 z Eg+ 8m^w1C39  WROBJɁlTw-ͷ޴f%X6C:o{Ro.*Ŗŷ3N7t9O^ݜvxݟX~)k{- ^fg#М#C1 a6=4WGX R< [5+ 2XCM^fėy'9<r<4t&Ŗ]^};nܾ[Te5E Ѐ? أ5GKpxDqPor󛥙Ќ`rtu?/nȘߋtzT|S[4FBr0r[=75죯sT.Kvq%TTSL\  ^KJ wZS֯o(iF1=ި2F"^ [ZfK3٠?=ؔ^zӻG7LD3Ui:fۂrA} vQy2AEr `7(b>Mt&r;B,BJ~۞ĮImE%J2nŞCJ6`kN=~1 ƝON:4'eJ3 FfD 4'ŬZ }:3m0iP:p#wŚ:YQڬ)I9`q["yub#Bc{&eNL@@#դ o2}̫ChGYqO'N}ۓ>yY%I^Pk : {6E E'lL2 -FMGr/&#sHqrbh)(Bkc \ߐTd['; Qb'W U: M>]N޴Jm %"^ԃbg'')vK6$+KwH|OG> ^nDlnB|mdV;x?ݙ%9r-dwR,0p![J y ]=cZ[]RUxvMRf h Qj[fuyAu?VNSAJO5Š' r@7 z l[9E.@f>;Ip+W*f3,wR{ u(x 4v!/mX H)/aD$P|z%'F>z\kqn !YE+M08z,zSUJJƕD97vlcjW ^6U(Yl),rb YEީ6ww9ݷnx'̏t:X;=,.jpET ʝ`ǰ>OdwX?~SW>;CkE>Kuemq͡/?p%}}.*vw;WU-:%*+vjGqy񉸞'ހ"_^eZ@O'/^ʋPsUl-_`hz"%06cĥ(<;X?E8`{׭8w`u'x ,~pe!aq*?b7`?wP;-7`Wv0W;W z}ؠ?s(փ8(; xoꕌ)p+WN+4O5g-˵;`1*,j!b0ҪaK1% 1^>ϖ^8 ԣIKG_2at"t.xNK(#4syoi}$DܨIaq:3~hX$d+N.?Ѝ"i1a h5ul O oaci E9%i^5BN)%YŤ)EqP Zi/dv+\=;9C7m)1^ `^?V.kjLabza`Qe)+:U6~٤4:*YG"#/܄/8P1 tPbr_4.>)7[^qe`j=k̙=dm1ip~p?Hlڲo%gIuHBț2Ir~b_:C&;(nQFvS kFY t;u Y5r(&K6+7DTOwԡy[ɚ1f"r -=H٬?tpJ ?L?d胅Jj eRlt؟UsaNfj3OpPF6}m#7la}5/ƿ[K*5Wb%E.3f/|y&MoTD |Gvut_yc_7Xzi308)c00}s~>( ^47u._f5q{KyO)w:,{~:(XJtXuFͥذ}·ؚ|9́y7[տ"@ϴoOSzHwP\U{bN^dcl?O[f ?k't yY$e0n0_vsa-9S\3N*[w:VTeU*=!84RUqyK O NNԴ|)FQr*9 قz[sYj3C3Ů=ؗIɂKC9.7W"z8@, WSđ?G,._^p6b/ܺdLg 'F`Aw9X䰃PKJ 9\R`Eiܩ.`\N&`Ez,WZj^MuUaU+rQO}WvҲ(P 7\̛I%u2tT(Wj)IKL:|'SVPӠ, wЮ}/k[%,x!*[WCwлÈ&JHXڙ5vޥ|NUq;ɕq[6b`WP{jj 1LϠ^Qxs8|wFBTh`줭 !rQ)I.!@P7T&IKERSJUuUXWW\uV;+E=j6u`fPmQ^R0^2LmlP8Va*sXA4,=zw!٨OX0pIlMhAvv!.eNqg7JVY|⚀ "xJ{ kg`p=MY`K^C@9l$6Վ- , F!jPڥ\ڽv8<${${hIkSED |ʿ1z-L @6&0F7$ QFŌ6 aY\@y5ae/x ^/ҕ,V2qp]/n>+O߇ON ܮr*u\\!ٓU[xKי:=/Bt57qJDF,!Ғ>ﶹά}D|k8$cFwd0%x bhs[#_PY똪RLF")*0Q VY>>Ou'%o;\|/|.t)>XGWv(B5]rWVD dMGP" /zV'5Nv+7_Mܶ3;*L݋CbZNfiOyg!B9ڦ(DQg\zhJZ?>b<̞M\FeO"/8Bq&x )Sڦ"l}?c&DϿt#g_^{rkbM@Z6 ՠBQ 01/NگUB31#EDŽۚHfaxF/*d001*Ἂ)I^L`$# ?)ϡ?PI.il[󥢇y+;<7()#Q0k9t1M'K)afEBiJjxjJC(B\. c*Xj,z`ݽlUdxR-ciߔ(É˓L(n,“WPÙ䏡$NzZO9^1inx4_Λs薼:90tF6["A"yghj2dZd0?Oj<졉cYfȱb}%q!,evcّی$.%,SU˨C `\;3;Sy^|gۂ 6xI4s9}MP:1w0N2:tdHj G)d|cFCoqZsDvp5g |]S blM"&= Ơ6^g yS"XM"B0E> wNpFc?=_ !,`L=5̚$ O(CUę8$qO0T]XlEe+mQ)`a$oy!6)Q(Yt*];;d*nۃ>9a#^Rƪ*_ט>լfii^iq8&Ϫ Zm&Qh1/ZӦϧrDWI #sF󡘦"4Xe2[[9Nah#w%8,%ٿ)oZS|04$`|^K>AKq<ĆН;C8*B@5ia^y\d, um2+3 1~#FDVPPb O2%1 stI/'sêsJjfB] FR'Q-Q ҡx>2v~L/!2aCQaQ̆7ȼ2Q/- .N3kGrhZ9ϘHA=-Q~~{eE"jWmظ[̹5"u&sܰĚ,IPu AӸYBEgdW9 *ݟFE fػj5b02^bdp F(٪ sU@/Af)O">RA:<ij)'.(ۑw R{$B1F-h2UNڳ"mBuRr~S;- g}hAoBm%dOU˂Awã,%M' 6铩b7/ć0 o%|I`Pѕ2R1Idod8 Egt'|EFRdݠջ⟁3@c 5 ƾ[03REm/PP{T?'2icVAP>+GGF"f U6F4"spKnQdx-s[`{a7'NfY.` avu .f#1<CR"R4}AWlDXڒ/ݾ Y{b=x* >W >),cFYk;o>"^G UT0ʠ mGpE`TP|.eFam},j aFv,qT,oT*'O2,¯= uYOH$Mz+5m@׊aٵ`e\gЕPLw]u͌N"ïQpќ<YCPQ5ھCH &~}4m CWq9CQ4Obu˧iC,uUԉJ0o°'\a2t=])W3͆5" [VDᷕdzQ8EΆ g# …sMɖxP ! W||dwld1k*?5C;Mέxx[ʔiiӥ[zwÁRW]x{۝$z /"9WY-0?ތxSW=ǵ'>`U<C?,QwCu>ZÙp_Uxc}Y }I>}ȪVlo1[$%g\Kl.]ҁ$Iyܟs'|O86%sqg8/. WLEhv됩">EL[k ɦc+$*-myKBoa~!Ƃލ7ad Z4B 16_!u΋bzW䗰''&.,o9ϭY#ujj#~v;'L~M2wG.Lл[,2Y &kJ\}i17YYbHjWi"\xI&:Hr{_Xi 3zP{6w_C{&(Rb13eNd6Mޠ}r $mUn^hC$}P }*Y{vH>KE;[ΦpyM4QRy! פЈ,qlZV^JBim\2bŐ/Z# U'4X%5X( voxAP 6SN%ky{D^y5B!ChJ;7ⱃ-*厛0  DN|,.ln)0曯rN>&l |紇TO/%&ȦէQH<0ǩrq`¦1iMJ'Bb,Ͳ!iwz>yEvtxdu6_0ƢٖeDVgk~yl5 =ousJpGla$>*3!4 ż8+,Geb?ODpK;u 9_;oIdkrXb_aGrw_& TCpMW]]HH%< ֫w~yꋠy⮔l6#̫Svн6P1, 5@yWqNO}e@ˤT}ra) ͔V-4Y(:|tzVK!ќh~4jC~NFH2aI-1Im *^>B)3Be.-)E]0J=7IĵZ{M-3E/fłH YsEK&_l΀1mfz(qvn-?evil1xϕY oޯ'^)&nϔ)6(c>tw3$ 5N$ aAu3P[Z*9E!9w ;O+G_~"731Aߓb QC,%sܹQ% *Fkwa|-5 ==gg_k/yxa;=lO&ѵ};Nn7*S΋/ڱ6(^zFE"1eF2@"{JFTەKKcʄ~B:J%Yۉ.[<]N'si7˼g_D}%~\P]i m;0>7z;jCT0ĀiϏŔ i~5Ɨ9nP̦Դ΍jC b} ;R F]A/$)~C;Q$yh(m8Kя}~N 63>ÿAOE#K NCxD)UxbX-n4W:~P9D?LGٚRlWDI!]qKg˻뎯m~ҟ~S:cʅׄ<|7ςxҦ@]4qpᣴ&UdH!+cu:ڻBdʚ}kDU_OEJI:g@xղ2;X\[*!r}&GwˁB6K iW%X˃ _L)Lny0HÒ`#E>˂Ms%l"i\ HTV7`S ?6]L$mmDVaZ|c_3KL/ӭHBD B䯒ڈxQn0 sVV*.iBRB` Ă<-8(fA3"1#8ݣ؏o6k!/qws +QKpFh.Y| ύmppq>b1^e=_ff}T#އT#gьyS|{?ygb YI^?Ɖgh?`4|2Z)Z)nTБPrKZᬭahD;6u e;H\Hp5 S/N`Հ.~z~ X|"-z>W7ťP 1'`ӊQ:)OFWn.?a op>6yA{L /R,+XXz=g~5pyM} , =<Ӝq۟ X> ܦ8ga\pxG֛*@_PP+'r0]j)10q&lH@~ Uu7<i]J݈5O}$3=ݷ&W4Wx Ad7fT\B/!ŵcAlC[ےp6|j@tBɧ_B*2j $k[1va ovB}iuKK֎MмSZ~hz߆_OoŠ{kW waFUS3X䙍͗=Rwݣ"*ܩ{Z\prlܣ_"3%ӼuwWH7[_sk5Ou aMrJŠ; jcb|%x<8_1!Z}ՠIQ-k}$LnsپgXF=wǬuӧ6ne7ip|ոo<պtמ1ؓfT%MQ C*,H|7&ԼL &d"V^qyܛrh*7.J[@;fҥä,'XL@նG5Q`?V5l$i!i1͡GAY%F9kO CމjW^~ikkw+<>Drѭlʦ9)s{Vq+SX,5%C#Jw@B)oYk7+R<rb{"sj^֬hNwʑ{]b}X-?>L&MlY'J%C_rso%Z{2_ÞZ~D Kgvәfrf ab{^!vm4l-)ߥ);2$ӎ`ը5+o'B%mWVغ0lRVXG5lfR`' YeB>/2]JT{w `^³T[*[Efh{ -aeKP=1DT)apgD6ydG3B^I^=am{']wlZv<ڃxg)v ߬yϷ#w#"ؤ(1zvT?%>1 >a|2OXԆ)_c؜0/ˍwowwGTƱz6 \V~vGitK)CbfB]߬} !&m99P58c?gu9 ήoNg͋rvR#cM*7דi5wwxZ˚DbO^ۮFts5uڟEDעž\Z,֓Db@1xwӟ9')֭(|ѮM2d/{r9rBfRvQaA6:-ةKΰuR;;nіcI@b"TAhn妢jxUB#!U G-t8#zbԫnVX rvW]~g^u`$Gg$2%}e23y[9ZʶY‹ )gC|6^ U:Z"Azp!c-7<+o(;PG+΍sN0JVYWlڟ]6qC`\0~&2.9P8r}i+Ο)a[nw"LJfܔ]5UwoXf=@XIr&h &i䈀K4lP8CCx-b]9=ezQL-2TUJa<J?v7í8덿IӼC#" ˧׏`Za~w'z%&lerct$mmmV*jb{AȼX)HwKm澝i`V ڟY=G#B<Jm`|0#l&*/<:?ꇳpܧ2|o`zt 65N貍U P?^TJ{8q@|YPegLSؙ3$PhI-CKxRΚ* 0=Eʥ;xC [:xʧ}X 3:ngڟ-@Y;NfɆoi~@j!d,Swq{su.xK E#6\b4D8V^M6#M6эIm&=w1/@FؠS_іCh˛A?Zx, z/ l:ANWm,bb}|BTKQd2sC 5hiax?]JU-8jܞv@EP5GA#_{9W m$]vFNq+-EͲUϏJa?Kl%d\GD`<)IwF\ż/gгZ-I$8AG jED]z8TfߡY{ZwlK䳝8ܼ^@zӺk~>XAG$_CPd%r$I|3PX˿rcB/ v@9dU~DgozsbD4 (g8U'9 uGß&x*r{I[jq`0C{6jY>'~ϴ -/)-G^ogcrW..W%O#%X)O y~*-)u)dUUVC#P)v$ }aZy {-%-7j2Sr=N.:C?թ3l8g?l:59V*zRʱvųVЏ/*B!xDwׇ%n>aWk i&m&U٧7F&L,na=3DT/b ~ D{*y*U uZpS#'\5{|'5Nlhŷ`gP? 2i)2hN RdiiDtdY1ҹkx'nJGC̅wY D@ 35dW wixORS/"]-G#md.Y"K͂d6JPӝ$>S$*W|NG&aj҉1Ȱ 3Ld@?;r|DN]Oxo:ҙ-y%,$=IB֒b֚[N(LǞ_A):HG0mXU;#xG,{yRH-3\n稶FdR[(2*ymx`<1o.GWOv>Eg Q* %:C{ x^ngw |뫿FԵSJ+\DdX3A7fjhMX|!oX 7qAwJOBJkTIB\uls)ڈiI0r)eAckGGxa{yL} H%?jT eoO R/l>0@e< ?<"nݻKncqҨ;ms=%a+?صOi~_hZnc?jAΉԻ#"?kL~ BC^w,& stq4Ef.WT"ױWV}#Wh02oPFabP~&)`[)Ѧ-TiIeְ6Ekvg6lf^AG q ~7Xs~5DH|c}P|v>acLrrPr0w 08Y<Ğ>Zl|w"xTyȁzb'MvEgOAfTྒP0J:)0xj4R'Q[hrLNDDYK`uo'FPa :K{vVfdp^2aMܨ 5!!cW:M^뒀;{5/QrYy6eJ(ŧ--&d_9}䁁[rD[V2U[S.60ÖwR)F3sOX-FWb[X&! kw Ԙ\v&&z3?g[Z1DXFEJf&xǺPaDb@2EBtjGXƏw>vqE2 vCӌE4pR |,#g.1(~-=rr oەw3lՖr反7 V$ )a(,]iT_` y4f:!M [YFDUqMkܹk>,tL]<|˰ΔWmv\ XKyX FQj-)=sڵ|I]qRF+&?ʖB9Cs䏜ChB/{Bm0x;ǻ3TΫ]4^s<9{Cо+[6!aRj_^tNY:(@kۄ|n+&C GnU \2uЛO`Odv~QRDCOauT;kD%ղŦf˗BTeEftyO=Ńj6LA%#}4 #17.) GRBnݜYY6qMtۗΫc<C)=YFwZZXXCuhR_ݹvgC'eO=(,akaY&Sd8 * y&L 4_*LK@3 _OB; Tȯ74~혘Wb^"G/}hvFOȸ u]`M@q`t&74{ ]8]Ƃ#s$ |3ohh{ Üpa!>{Mv6l8/x8?>N,R̟S{>~/ 榡Zcnj\$.FЍqgo+`DQ],sEew ׹ );W֊~b&3v{bOp;>m{a^l;Sv.݋ 9eY/4^Cҫ}ӋP* ݙQR-UT(nss j-8 B4/id)^4i 7'H"{ܘc瓿b>(!z)X\,Х?{эآf͎ksⰗ;bP}.q.0+]/NB*NŃTLé?'mOvѕ7X4c,;}5=͎sŢ\ţRsFx;gs\/p}E`%c0?J^mkUB9XxIV_GJB,FCY$2l8BGbNC_X)F}c$ !s΅# atx$t. 6Ǿ f7|᭤nQU1W]odcɤkt5q)Iu٬۞M,l>h"p_z۬h.S\b.`hM*XU _dZJx~xqDeLzӈmƇ:$b&'-Uñy,BmX3T̓G& ytonE}A8#BR_*_dR: ՎEeg9&ץ}ՠGü$1Il~FfY )NY0~,Wԏ֢Η 'LdH{JyZ;.9-(6o~\¯ylFˆ1)6X3 ;/u%M5C~'j%qƏ8M"ix+""8 eKH$Rڼy`C\b§:*1)T(۵``K 5)P W2gqINhDV?эIp6a> fjLlߓ2UbZF2b*7@[\"5۹IoTX=Yw.7r00VP ^'[`ɤ|1/&_Vl\5e.TtJ:3b5e!=kZkx--\5L\"N64DŽKuPϜ@nj,]ˎ_RuUQ.$iINI=A, 7FX1ס3Vk ujX`'ՀLŏyfg2<%L/owU(²(֡,]M,\){PƤ1쐫1>Bڡ`g3Kh1[:œ5y8\͠6ZIj29Dy%V4T4ƏpW!.Ď\Ňa/XN i. FKm|kƕ7fqfY=W"[{uat&f!+hnޯ*58^Hx*ف+4ۥ bq75™?%LvqOE8$I΀vw~𨼻lK2{ _?CP'5&9h 'taQ G$WE7~%&$#@ð,Wݿ^3nPSfӔ]1X\q?~(oxİbc]퇠j=݊v9#RvnC$AM[+C!R&Dhm'b@LڂQq$g(%.%eJ}tz+ɼXL%FJИH}?j[ODKYHF|Yfk?burd}u?plp8sq^]Й@ң)AK'S15:걫2 Dx /K 3gVH߁yE5zN c]&K"'Ng^`*̤1 č ^8$ ŝs~"ՍăIG}m Oܱj4GJC2 |g?VM`GRKT^Mx[?|vJ#ju::^P%v^9G~=:Jj5%-l?eaV_ͫԑ TfaL;n'9j~iZ>/r~6Yx{w/s{G[HYdJxK}ׅ}R0;* O$H; v1۩lL׃я>~U1x/Τ ;t[EX6viOX`$/vc7|<)oBL6^4zqw o;"rr r /q_D[h1(LBr3$/5J=2 ]gaH3cVNtH8kvxW+P( KerZ;M?QT'|bt6͊5:/ t=w0*ўǤtzwcRV^ &҉IOy*hf9{$m0%nOR*[|`vtZ#͇Ѩ*sgl:4šז~u=F~VF_k~^m?q?[~ovKzE/8 k:sk%KݱkLmMl֖Kvt$:GDCط'7`ux ٜcbخ6TƜ)AV4Kn4{S"+v:|ْ4;.ȭ0(}H?!%X0DEcRZ)8%_"Bxd΄8e91ͬv ..l% FJYT+a:C-2hy+J//yR|ihqty rHgўlmj]>)}cRZ:={V6?7h.%?c:~4<6Wkf[VZN r 9Y}s?OiѲ(^sO; 7,aHs WEq&uЍ;nԢ&HOO^|lV'4Te^ 1zkqgPWCᇷRg1w۝t`2 {{4? swpm܎ۣl^B_c3h~NB|S *gB 1 gy?s?#~]4b|> Wg'D] taJ96B3ZdRUtM$h]1IE\GڢBtc0XPd5{@gq'xmt Fai=OTM^D䣱s`,O}-swW7$:]hs&蟬J9Fęu= sWWZjܙÅTR 5kitJRv؅0ɝ*TVOYyZTӢ&O <-vddfQ"ZThQSHRZbB}~*Ŭ2[T mZSٷ5eĴU-iﺍ7`Nxk^ރfC bTI{̔ƈ€uWbKS7ݟp_OvefW}zJx>- cg6OqB= ѵ(ȍ%^K&ԁR%%vJ m&@"fk̂.6KPpM b|#d7$=B!.=@I߱}x`Z_tҠDԱ[i"CX]4<˵$2ڞ[vVyoU]YF3.:Ou+kX #Q=]cѽ%Ra!Hhi{|1&H"GE41"0~;St_Hϸ7ȱup.p>w7։?'Ϭ:(R&Xk}KƊVmz2$\c83%@sv=4C5 H2Cb[4WSx뉊Ogbd6&gHhZZE:lлGvS̅eCBG3W`"x-t TmN1 กA1_^d; ͥiG> I@I߼Ɖ? "Q2FAݙ\>ΊXtVwZ?jI;6KE& >{h4 9|ц !Eֻ@r Kf>SoVk1tcLZidg*e ӽkknSK{Mc2%ދxb{$~ȤA2eQ)MI7GҪL}xA!ST(xH UF7,<01=^K Jji$S{6veBSuؽI]=)zh"^kJJ ~_7X1qОԻ1i?u%,JcBҩRq`*4Ɉ zN-tLe3d!Kd*!@Q P :!:$R|8j 02:[9!jwkc) u৳)0PF(u4zSWcs٩8߼1_k*6ժ9AAʕ2k4q"gubïϤC(qYFs+?=rNK@0xb %ܞߙnkjyo_Eo[lOb'#ai "4Tc.ӽ*HTOMǤ84ݦqٙL:N:vkyؘ\p1nfy9,UW~T6ohsףy!Zqo"xja5&2V$]scJOA+L&Ѥ`ʡOWb*㐀imA ,"!{R M0f냢S4#%^qoăV:8U;UOYʂ3GJj89t| p<*juq# A譤h~3`?~X13?sRї'޾-ݧƸ=YZ'=,,d/pLdr 5AxX0Wn'/ xBdG~Ě=/~eYdavh#Sj`ܼ!MDeZtR{x["6޷$Rº5l; ,j;/K!| +SדHv+-CTW6yl0(K{1a{r,bNo-6E 4p{/!u'Fgΰhٛ=a|CRTKC{;%lI%,2" ͝ssDQ3-Q4:}:ׇA螑"iW W3X_lMMHP4m9v"!&@XȱOp(i|8}λ`w#MjR$a=bzkXxn\ ڴر$ _^a8iͤL) R.)y\dkdi~1ⅸFM-I=>43׍'3jF-q:TV*ttt7Rlֆ>z-r`qC]m0ۃVҔb+@Tly0^UMOj/qČWҸ>P޽5N䲳4c0҃ߣM.ж9 ZvV 85d8lC zKV^4,(GFhګٌ}\r>'>Mmt7ĭw8*VʔBM:dk v(\ȱ39  { ޼ΝOb4 &E UTQ"'^jc}Ƽb빽v] KXB٩@e2-I%GgȆvEUg'eA ~p֚M>{}znzmh^%)iU%F;1jV1:yVL T ; FR`=c=]VS},1G!"h!Nn$WM::bcNux5YĄi!Njȱ楂[PmY)8 hlӥ*cjlK\O[`>MЖg[QY[PD}㝅G<ڣ~ 7w sbprR7s!O%L@=B3qR5L]W*Y%scig51טht}{@6@a~_i6&#^-vQñebׂvtYҥ3 Fx(V5\h\n6_8yIwq,ʇPEr2yh`9>gҧ2/X7 =b^J+Z3rL!O@u0;z5WeTΔ)U-Tǔ)ѴWb{Hz&beaYi4@%:G,c1VZ D}0Qy4>7نY Ac1SUj-RBOvx48'%8 J<55+kMWh8~(Η(/q7Ʌ)$GnV4H߫oo/;1NUkwFܛ}|ʟi=βqA+cPWI;Q" z~j=P{O{R/!.c['kg0wYmE"pK 0X9>ivE%0GB4N ܒ@vo0i^C ^VV HvRvǗ|jAwFꉠIa !(v}:},@.%YpR㶶u‰9uد[LW%>H@:Rd>Uށ V_VJ#RJJo߷t54?*IN~chx6Q'@S9n2I{7͛v `f'Ip_'QD\ݜ]H oY1yJ/$ ͔5FcNcz% pT6sq wv<[ڍ^v+kgg9哷P8;>2)IS 셦}_\L1QVߗU%*K(WVT*hPSQMWNcS85)ռ9+aآHݩ{dt5gg5xֳ_6$hM?7Q5s䃗fgZD/]|I1;F <5t'ӟGɏ(ne5dҩT T &/4Tijaiv;WoF7yNm5wZisu1vTӽ\y_b_z 'XU0L xKKC2?173}o("<$-?<,(G_CSu1>&b^kuؽU x|E]ٴ\5cqZ4F-ʝV+YlpR3 iO>P/{{`)0JaLi Dz=ú<_ody* =^ҙoz{4Œe2>/`1ҽ]ir%Z{Z4ޯCM_sogw2 :i?UP}鶯V0Fk Nm}*SStd<"fzgX+E~9 IH)qnW ohLg0֙qi_3Gcde{`3F'Ob]% 3͸]5Eɽr4.[3IDQƃ!?LA눷ϩAwIv ȋy3:/'5) VIɿeOao?>> an[<# o'| F*mֶLǩƄ#s|D+?tfά@Mg(/F]:7G?mg13xOc>sIF="O dh|C #ӸS9Z'H0C0KVn smM_4DQ%1s(hMA\8邿M0D Fckq*۰/PlJ B SV, OṹKfbV Vz?l&l `fsߎ=˓óQ<d^ 5R*NK!TdhoXTGϫ!Q>/SU_O5N60^ax [(y/VFf͒ohÊS‚QϐٯuW.NVgJ6c"-cYJ#a94|Si lǨn:lѰԸn1g, iލz 8E\Csis5gug`,A!Y L4Uph)P*eE!GR p*~,rt.9fhiutg15'2zZGxJ9P5x m2f85'XGSF:s;w$LT֌Ї hnrR8(O r Ed-ZT5(V9@ϥ֭8'/ (hʙo17Q}[O AtѾ7x񃫓+>'$ܖ$Wlϰi4qvoēmZCR.$"hHgRLEuLiSotI" |OyIc4,9&}x!ۅ lP;pB E>l6ҙiLLUDt1LZP'-ǕPNW*v_[i v_ԫ;hؽMמƷFOô]BKi}ad`^q:cg} +  0x5T$Wث-k!3dK|U _[{uA ƨCF,8nvfxZ6Gua/Knߦ' P3I%lgˋg;C߫//l=#@wUb/Mbk% <:=IƄOŞ N(򶝌S @KL4l:2w5%:Bq#E86`<7|^8" }mvDV/ont?MP$!ޙ0#I6\pNM $Xu7wŤbɁUaP vX֚+ޘ_G~8;{~~>}dp# f%n`sCӹ$I_'aJ k4!A_J>xKuIZ r8 TC6 28Cgk셍xSJлϑƤC:R}.#"^/kBl<'u"7S .{{K v 7_VO*$ =n&y(}O9H7ɝ=qմ2 'd9ݗ>u+&;d6/7W>zku=J+}#(8AmĔa+zYғ:0UZ`X<5,J$T~{a @IHDPJD$d})E_CTUGQ{l\T+/s}XA'ۙ f *j#,^T^E #H/80B:(Q*jRQ @)͖OFxhW:]oRs7I_8oqLCW;-529?C9y1+maǤk$`DQX Zؚ C#.T\we`0+^2~sQ!D`UC)beCW+[vW$xD_:jBUZTo RSau[D땒lH'|.O]}>Z :>4$#r,5g uL]BG .4qKz8";61j**tAk`SGN<=138?gxDX6]wvxnm\t7nksxѨ&E'zDj D~Kmh3ŐݦG*-KcÁRbm/8kI gj\6q獃ux-ֳ͜:h4n6J7y44F?~sj0] ؽ %A4U1 ,JCzuVi\ -R5<ͫڳ/jՒe12FN2QuDc"K{ـGL] bP< &>>CYߝeen3+,dԹk Lo` UV; + ?YcXJ2~lkFs!4PؿMiE|2XkcYOHd!Fd2P]66&Zc)qMJbUAO*!U\B= Vu,4KA0ks֒A.7':0K:0PDUϫ⯿Ki폫M9a ^iHm F1b}Jiy*K堩!m/c'K !h;wjJ}#R?ĮiZK#M. ~3wBJfOr.+$ G4J( *8emϬf_,BK#zDQ T4"oMOIQqz`Y+L2j p$zH Xo055"@z(PRy&nҜ,ǁL萇da=kˍl$1ߞwgYꒁ,V| ъ3~, ꠰nx7˽!wT֞"@~bd jw"BP}:8*F_~-FO}f-rСVdOL x^ulsi;tߝw`"]ShJwf .NOyV4i3Iu1VM3W+d8J/2k4;sؠk)ȵ15N^`+h+dxf 2e1IXOڍTE.Mlk+?4p敊 "޼Q)o˼+;s{W0681o/@ wrV(kj'&LkoW,Dmu j( ꟯tcOjBRv ~%~:Ǟ̝|ÃsfVx&5fg2I$ PWܣTr3Tz:ú\BL v'LnrwZ)* X-RJ=RR 5%gYT=ay:+" q. !gVJp NQS=Ot>uTS]O7SDe©JTl9RXW/0Kk.^.tV.0 P6f5۽nݍ_PO?QGZ: Jg.V!_Qv>PDV 9 G8/|FRzYU[)[LS-> "CnJ߲C3z5:Ag;}\ItZvbL/)~۟7"8,cC۲eCr~0"fZHj\vO#{fN>|΋\FkE ʯ-; !< $d&a'Bs:/PrxW)HURh`URõ^\BK#L/.dn7_zwWW^ c|R gDChnr|:B/e;q;lI;MOߨًUB?)Kӵ_R8J`]_L rJmVc""Þ1JF̕v0j% J,JR2 U)U*]2_o1CaۀU1l].Ͽw=<}H)x[ -]Ա" Q+/qIcHCO]vIo<Ǟ"+oe1cӸ3.*K&YR2&Η+^OB0q%0>r)7*Bi Xq+sd-mj^'0&,eckqHDO[b٘tU1YXZq%HI0Iŷ1H;c SE"]÷7M*KI)o-̴񄯳Z>WO WF Fco_3ex#Lx|x FX^X1B rmi"]ytRxo5ejpTPCź %rKvB=ѱoGtg,`RjNP1 'Nޠ &9ӺGMD1x-g:ɫW[ԞD7Le3jnZ:h$\L,nlѢÞ/ t 9mV /KxݘchV D\]ij_-r& Xh}4%t!MRHP krΣ./G@R{Pqvl B)L B\I(\ce tǐְ͐^~Ƃ ~c2nk yRW[UR*8e:,"[c]-hT-=N6]Pɶ[>j5^e>\J7* w@sQ X{$H!%QeF&xX=<۹(d?ˀ4;`g=T:@(1HkMHM#?fO;^H`<"e'89C_4O` &`b[(厣EWikwDGӍ`,ؠ V#-(`r4+^f uT'LYczτ5Xd0vgb_5>O#zNCS/.n=vc+XqtDjOuDH-Uzfw O/>[E325~[5YxՋwWc?>=Q~aVh:,}`qo0zTdI"j;!VK~;˶"ݐv$Gfbq/ ^#$_ DDFT}v?y$@Q#b8}<:! Of4v17җJHq`]XGߒ ׎ CǓFKy8@E[#na/ܼX(=:<ڰN{>w}{s4O6ӟf+wG@Q<T jU4",(,>d(&e!8cGq6'`xLj"̾vVm䖫R]CP(VtBCǾ?\;@MLsZcUA-s|{L 8ѫ\T=/~a7Rh[~g2Yq7{1h5C=pkt_RĊy#L2uLi{f6+RVRa .ix8o|Қfˋy >ZǙʫ.^> 2Y Na\RJ^Je+ $Jq6̡d˳E6ӝr 8qtVrz9lV\?mYP*#BMaR#DIb6 ̟pf{z«͂ a;{t1zkv8#'g=nA} P] ,ߡxﻄ! "rǐ%^isZ;iiM{3| #p왉:Tf-L,v3^鵠tr"6<' rs']d؄ٮ٬Nһ 'Rf2޴!jP&f]̜1ܜt]nL%q=|^myUf( T Hg.g Lq1cXߛ<-[R/h[ |zkXT osl^zVHaG-"GZΤe!z3G>VL{08Px9? o6!&ܣ536$d6c*ҀX^:kJ1r*foLz+HWYmU,(łLe3ٙX kF۶? o)ʦkK٠АZ&^Wlv-Lchz:VeO%G!$ae" kp|ҵ~ҵ[Ys'+@ ʾD׌ K{X,j\R:-y6I$ir4_]d=C &<]E#mߵ+WQm;!h n6 9kN7~Bib)z@fy}SjOn@~A:+'2 LHV n $9,y8ntwmH$P liS,^/bw=zx670,405̅8RVy(ə|Q_'W (`*b8WP~ ~_>@kQOVEn YÛV a= uWŨcI2BFu&^wIP\$p*סKh :Ew $'!}6xqHhٛ3tkjxfDMɉaYQche2۬G2.a`ѷI9hoNwR~K%δ~g&=C!tX_gy^yV6\㟕9F)~nNӤ9Z{. r#i)Cd`a?K˴A>'FSz<zWA>;ç xbDBnQBɇfgsJL# [igp1I%/Fci38X&|Ix|< p2 |e9wҴ3Ή? $>Vӻv费~t@Y (yUNāNJCR4 x&jǎ ܃ O ;?\1v3~h#,\@SΥd}qhwѾBhxY+$:} aS yL_]_V6}ӣVXށ- JC0$8oO 4!{lb-5[ɲTк4t̓&@mwpPރr=@yl Ӆ kЭƉTźR!P^#WJ"7F멭L-4:N*T>&Yf@?a2L$@:sk {9B$aH_q۝|zfIL{MtȜd5B4P[;cmh-y9wCܝ`ênEm c&I(=cJCap2b}ǘm=LB|o%b5 G^O^cҼ1tLŭYf0 {!8v-K7W>-bdzfa; F0#rIH(6te/[!]Ide %ؓv;PiȘ$ v@:(п@xG} <]A^Oơ.8R¥^~+AgO%~tXZ}š]ܤc@1^C-T'rFZsÞʉ,w.GM@>"Y%Ytoj NuP / ۗ;{cM{yQ圠`sw͝ԡJK"zc-KOvFٻ|&s{d ӌ\M,3}5ںPr;4pw{iԇ WPG2>2}eiy}C:hEf+snl$cΈ0 /h")ﱎ֡OcEl)szv$\AbtzZ#sͶ}OI70% 83ˣ6 @?;_y|qMk12IJO$>*og׃;ïЇi6IzPbQ׹C/gtP6G8XD'M4X-1gH˪:2`ny /z"<<+2yqM]xG<x^lMceiJ^x J)0ӹ4Q^BI$"Iq:`{/Q<:OxX@yP0Gī.(X1w5FC7hGbkL?SGǶD){$+q'У53s@$m F,ъlŞVn[5KU`qL=2SBMdc}&ʦnؾdx;`$nʨӺni#Y N0.!ovg>Sg3>.z25yzSҡOtuFvOD z߻ {a׋n4ʋ}(M{P)?WAd^l1WK('ærƼ&ˌAsAܖRca[(G6A+GZa&iMQAb;Z&5tko>8;5=k%`vI*3_@5~}/xϸe9bs^0AY˦\%::.g7 ?Er{ .fl m1);&{ZmE)O/PxOUJVhY\lm50Sp/:\ X hCˀ, leH54y'yY\p2o6},ha\Qj.L5RQ ز0@ˌlY W\m?0p1W` qQW_q иL0fǡ7鱗{{vLI߂^J7vhdq.R:; qN\y f6Xr1GCO ú7 `b/9HfKE✡+ ]@6W3q92?E{{jODgwښ\T|.%g"Y膇uŜZv}___+{^TB7'o_/8]ʘ d4Qr93qSĔA7Kz(dZh1x%^Ow{y!Ą+ !S`Aw22*9 4Ur#32kvi2A`Hnp6X]ch~j\ v-}9 >$Fվ3azZwo6=osUM?I|%h `x٫d '2Z^ҁaeN}Yb! }ou׊Y*4Ec+Nf0Kx W1mE2;42}\bks`08G@ 9 R_1B ,OAOڨbCQq?u6J%6S"[Š 9¯R*6cO")1Fd^hAE$D c5k,iS\āO)}TJ!Tȕrl˱>I,VtQfJ"O;Kwg[Rҥse{\4X̊ObKb&a d{eM(`׋Mkds9G^"qlmAfm <="#罽O71zvza^xlZ̭ P&;x DŽС@cPgWjj21t nȳnq] C~ Nj`q~Yʩ D 4q4P}Eg:~AlL{6w>+]Yڄԙ6+?9 j868 vD CSpb81p6MڡD)Qzr5czm05@ɞ&ẘVϖ``S 1][ =7^JkP='a)cX(7'j/)ޠ6.YTɨcRHnv7={lRphJ.E:c0''(C+$ =5/C]cUUzV zV `1H <K7+6ykתu7,Y|kѾU\UK^5USuZ1=L8vkV=aa ?Zv@led{x v#'k.a J2oRS.=}o1QlaI]W),rz$3DiRȵlHh0w& :6jqpRN\6!"xa^\+U7Augh˪iNт Y%znai!r%QۀErCB[ujn5vpLG"4t4?f5:d!6)IP1 Gن>!?R&+pJPjo@E0{=|R`U&|n l&T@Y Tڜ}dzJ$2ؠ8yg=e iDmbL6ړ NH~̩r3g Ң$"EW`es`iݫn<(O;UZ&:\7q*zdky!/8|cPlaL^anl72jܽij,-8i2Ido[ј8nmy4IPso:b2&(zwVa+3Le*ZyfF H-H *xF!ѼZJV<\=ދ2R1d3l\$"1޼HArc%oa}t'Ywb*)K< {yQ(uDZvJ9aכԍU&a7j~74 2\hU]6 TC`Zpf8fQ-3qj0,QO5]B/YsM6Rf 7D1"iMX1qĔ)Y#HU!%~,XZWƁ6.$_lvS-ϖXHڬ w}*7w;l[Ϟ6xۙ*,3pfQhvamRYEedͦZ9ڐW3y%9"N(Cu,:ynI;ޚ:ntqg{g{9y!:2%PW.P Pϋf{qlgG`ȝy_.kE3Xٻejm7Ts MzV&FsXP8́"cpv4*BLvbaMb Oi}>qs5nXv6qG,.iirN2@V?p^\bҨ7P8Dk5^kt)Y]d)yC&m>%~5ʁ"}j_^_SIT7|^DNً69=q⓺oYdh-|70&HTH?%б)]M5[K$W,mZ]7ÑzP࣡q[:1Mփ"O 2v&(V QD҄h]>&/k'oz)7b^x >uڪ[k/dyDɣP^:XŰD(ZXeYDJ!M oJc;^Y+#Ȳb^j*]XyU{1/Lp2k~]Ш z40VUkDJ]sߨBQWGfα\tW=L N]s *q*^|֔N9ÌS:1申M:q<:5qʶױ*x) 9lt"jY*kC֖p[CLh}tRF2#CB+W^p;a~||.2+:/űiL%X& :emd*SfcsAh V8/V#O?Ln# )(3^m w曇][[KM _i%mR=\NJ_R=a#Xsu"8BsJbU1EֲOVT=<;XjO "']7_lX/.LЄ˩-U^P$I VH cAW*^f݈ճmx6~kww s;V|0ٶTv u t٣%T~s6yw >Ç'AZԸ$0Ķ G UuFA:+0]*C~+L!94VXFO RhR{;I@*,qM 3Z~IC ; l\T_^rdl*zr@% rI17@՜LTڰ.JrԊs2JK3wľwPPVw+IUZ[u a!Y+k/>$Bd6DzJ=T ez5wQ,_jmob|&As˻O<;.L_N3!|3.oڣ`Hx ]ɨs}Cϟ[<Ô}! 3۫v-06%PYߣ.tZ/ {1XC.咈V@nD8@%eJaJ8%C_^\Yi`1\J~-sn`|iXov:xD{xC?ձP+P&F:%G#w /ZP(Ņxw2q|m.7^4F ?͘k}r7Fu\a39ڊVc*sg;k=귻FP'bpr+(FRVs>;cj-x K|-2Rn 0o-}@f 뜹` uЁV(ZƯ\b1XrA$I/1$/IHq>BkO yܯ҉ -zۣ +sė!Q"3< XQ:DPd`&R!2f%9%?nنڮ-|If0~nVb¦bϵ"; ypB8Mgyl3vGGحuev1b&= C!(@4&kðp7턁r,S,(v R-xd/gZ4pgib^3͸BϸqF.v-ǸrҹV$q F<]hsƐ|kB!CzP]L:a4@c HP)A2bbCd U+nsdAOCG`t2_ݗf=X=Y}LΠfL]LH<#xح̹Ig[|S拕BMͳ6%ɷ},'=mիRGngBk%]$#9HzQpHyPYyCwG C_eҌ0Ύ.-ƫVyugS,5ӂMg+ch"+:we׿Gm< A3X CRo>bmѩ9GgJr\ց~tJU:=0b@oI<,F'j4'y-UjJ0j7rj)@+@%@U8KIvŒ }u%錻 Є@ N6<2Aodn^gI_P7LR;MViGU>n+)]/&mx9>):£QNg|4[E\[it^&4 ZpZ5HPVr'$q_ 1 h)*T,eDSvx!.`Hfk8ZN* fE&&9tG+ 'րS* 3-{2$l]ˡvʩjҒ΢D0ʘǓqw ăVw~F3Of3|z:HL%@'{R,s-Iܝ8[BDt3.0BqRGd%OrWIJ< \AwjDn1}E(փѓt ltD%@ cP.DoDtu9",T3o=Nj-@dI1rXP0& 4&"nGL&֦`3@1'Ւ? Y*:Z*3jЗfud3ѳnƜA9Oجh:0QMTXvvjuu y }3 }%\ ޣxϿ{nw c1Iۆ)a8h+^8OWR*+)ᮾZyFM~)譕Ĕ(E8/Q@MES -< ]\tF h*-:y MVgkDZ.KvȽ;,F\ b8%S؉S 107JZ$nuqʚ ުZ0O7; Rfx2dl'Rd6>HL_Y-hvڴN-QKzrjR Q*,!G1ff!jp3+l Joj"hU1nݟ< DVP PjIBRW0)fao)lXt6c-7KT"zp-Bznh5dx t7mouKպo58<'* XOFZ'n!u!0Lr7soYKqYۿXdnr0:,xMZzxis&,YaܐOS ID:uѿj$x[9g Q3^5$Z%ޢ!^_ ~1,o&) aJ@9V#]sօ7qɖ6k6n5z&\Vqۅrpg'3n+) ,{Hoь'M]5rn>m1[K57"Ѧ/" !)cIR@8mʂ LY{Cx1b>%6PM'$Cfe7вx"(Kޤ6ז gC~b!i9h5@h ȵD&(9q/YhatWȨg 8hΌv/YP5WoRp'wm_7O{XXGPT-Yq9tӻ("P|Hz 2z[w3Qb:tnCaOwׅ*h(32mp#'2(6X&E]HAQr@}<2ʛ_[ $OJ?D~=$eCß<ȕdG9QҋJZ#-a>!ښ_R&9>TEM8 Qdbi\ɧber"Hz(E{\Dh+(&Ɠo) sICZ SzY.9(Jv1~ e#\Q 4%c‚)_UOLy_~ٟڊ/s/N$Wz-^|QB|\/г`/ïGRekGiμ )|a\VPf謟ςȘ3DJXFIA>`TL!@}ƍw73:U)!J聭^ݿۨ +Z?|6EV Iς@K zvǘ0f~f8 ƭS2Yߌϭ@>|6j|uZS4E'~3By F1)c0#hM6׹gyy knv- %E^n#݀\)$> uAr'lZ%h'ԑ~hQgDK]q (' ZDKb,%Hmޕpn'S1d9O|+Źylvh^iע1ݧL}ۙM蘄MPD$2^RiaZD,@y3E^/G?u:_ÚP i@I7CN%#,T])\o,l}3Yk( }q }wM# cW꤄߉r!KcxD+; 6P ^F9bQ6\"*YYq1#jZ.1]ۣ3Z-W @sɰy+,'(Tp&Rw\CJ$lYSjj݄?kA]V"U$jHv$:N4*ьü%qzLƨ(rwP L)WbtX*YsO،|U*k{Q~y"aOEn-=myC,EKe88[:qw{j5"'^-'< KvN󎓲9WIZ.Z-*2=þ1q6g|-N{qi&lY=++'ڂ˅WtF3hQkóa>KS^! |Aԫ$Ѹt1#*f.f<Br.ʥiʊ9Oޘ, =飣l{QQ@OѽPhrHΖ(8;sKDԽ7Lv;;ݬ-Zo;ֳZNj:/W*O_Î_5C+]}A4*MMr1lnY܎ FG5U3fa`(<&1#N7/鄈{n=f>w'YNRB}z>Rc<Hܽ)egr_@6)[19i (~aШe$.`9g-ZXK1Q٘[AÐ&t[zXK2b#qI8-Fe&UA J]>v=5ޣp\Ch!T>d&ه!̭'%(MXɱ j}-="]h)D?B{gZ9l7$___r>?|'8d|S@MG{>f{y0R@K0+ohW͚?fpėP!:$ݻY/N(W1(/Rm*b(Ȋۥ! =酪Ykm3?{h hm>ZI*٭Q3ӿk'"ACT< jbIV◁)oTrm[{d(?y WrVR=/s4b| q20_L`Ұ{;蕫 5W jv>ǥ*/ñ/_sgi?H Ѹ50,W2zRQk&qKKnj(f$8m!|FLgD5C̵3@Aulw0h^l/}$J4C*I͝hti ,\EFz@ys߸g@OGHj;$*ih({cn4ôh57?&@loPx $uМxczj1+ѯDLRq<ؼ~J_JSEA8 $3 50y5U2 }'^>_lxx.k]YtyY@CaTN(ȟ7@PJp}K2\'@)2 Hq:84ՄMJNxN)q*;ת/>3 K±cMc(w@^lXeMes٠)cAlC$YgV~w{x,H~y뤱C(Mg'! 5N٬v _1۹΃qgҎHZɳ8 Qk5} ~^4ldwÂuaMaK"M<%wԞD~3vd{?p[AQ˰xנ~T4Tڙ Ê7 NP4lWO59 W^BH>FrK@\SS xF߻P~)};`Lor~Vf޻Zʝ@LuzzI{w h&WODvwNivFgJ$5I㛦QXL4Atf5EX5L` ?kvhsA'lo\MZ=<+_H`1c ƒ BµqbBCYPM)xLt8m}l`JD  k0+XҴt*|U >6P:Y@<~6 Z ZZxn{&6=Ě=ל8J ƒ 1dv1az<jā:!qK fS H#'Fw8X~jB\8B9:(mr!0gi/@]$c* !X!ānKB=1w=5ah34oKqPz.kNKX}ٳݦgHc IX(tC秄+L4Jkz~s`Ab=8>f*J80-aq DtPslk3b4."ڸ;6@6ǎUH7L\ cd٧JXΪz,ђ/֫5&>[}>SO} ɽMCRITPhTxY-ŏQo8RRѨtƌ\q*ZbDA^ rH:hN].y=fHkpAFCOu w{ H03=W1Ȇֲ͸54m)8tbS/)ց4;20=Wz:876[*=mt,8?4m';Jt)F7S;ٌ(Y:spAf-Ru[7V\!Oо[c8>5>'*5.-Fv2 `:{' 0CD̰}ߪLjB9eE' WⳚ9uGfAsL:iXS`sʊQ '2`$Y9 LK{&6{I?-HpV,%nU<0L:׫0*f:xBU1㾹\V()8DRh? B**Jt#Ɖ7!сD :+V} PϳBy~7(^Ξ߀WPR+a+֣ӇgGCè Ko[?3-A dSx/d&:Xz5F= Jf>VB +;d%CC'9` (CfAZAhD= A׏HAB5=Pwθ'ƅg4Gii8l '*8kAF Qv(g2`CWS;)qԻ?b$D6!:X0C"Q3'Dzof*8]z LUk wrqZ@gNdy,R.:A,+>S]\,hnl,B5-ޥ3(gk_3*Oz~mEKT{ U{Wa}RUF;.`ejy<̾8H}sX 0kW,W) s}P?>TM>5ڢq8d9]@̀L0<1j&&vhs7|Vk}?A%SCu,Ś+s|ǑNL?'CZ+aF.XӍ;tw#/Ra%,?n^> p;$U7缮JtpUEѠT$gb"A+.UIG$QAPT+HWcMIεP0 <Э{;'N[z>`S sy[q܀}6]c^<;xFf/%vFs0jGr **7sqR-Kvz,,fi3䱜bo#awHs_Xu GAn=$So*U^ʲ -=kˇ7e-=Ib4n!&&Yͣ,T.$hoe&coCzAXh~&/zjBdMgicHD$m+i{JZqh3s֞l#{7j:u퓜NFˋa䝹3x.'l6 Hd,1IIx%AW$|1\;OrR}d>h"D=,Ǎ/Ht䙍qj8VixQLH@O^D@A9+CCaOI^Iﺾ˹!@My! Ws,ݙ tA /lwף^$J{먃Já@L@!JH )YVEŠ<4r>>lxfN?Fb^Yrq6?+qA-yZfaV5T+B}V/JJZ*NKx`C.ghks(OV'ZWT)WjRKH-{E67N>ܸ!?8hם ) ebe'_[ ?RB@Џ>s1v rdiϬ5nKАkKqp? eTt Y!.h~qHkkgR0PY:ܡ ?eGw.JǧʲļsG8cL 2A"X b4'o\̕5/~$Sg<6~ R1ҪBmTcl[(Ѕ:o q5wG|U~n=iBo}&.@ {Y37+Lk,愛q13(FvSXV2<'QpD)<Ѓ&PZ* g0Aa[|@ƨ:HPk$ڞJd7w{YNܷ5ۗݎvaCjaHf/N6TJM`1nb4.Gk~h~Bw@D4~|KXhڭN;^E4!v ]LF;NnGm51RTL HxI|ö't [F<OM?l ԜTp+J+ΒHcrD&XsЃ&%dky{3s4ɿ/S$)CrcAP1(%$;`:tHtwxws.UË4IRG yO =4a*Lvo0Ǿ57AvxMiWjMuߖi¶);R5- WDZdS}>>.r0f3~t`bl2ԩ~T)]siC"g0fx<޵%D1GOho<@tpcA>:q:RF(mBDDbV,H Mx@8zeB߄DLKIgN0B=gnK lM9#i~}iK24V<' bQވVŢe}ۻ1Cj T})'L2PcOኂW g::iR}q/fYL̴7AN[~+V~>̘˺0g1G7;ix@9 ~fЫ XKkқT:uɠ_MKX0.1?sH$,ktI/XF۪j)jM3ֲ,ml1::3%Ǭ|a$`ZnV35 @ɠ_ =$@4(@m jBDU}<[="N=켿#5ԇĊgEj+rCX}\[;o,,,T{_a~Qzȅ^EK64 =`vbA2,O24iuX~ll" ;!hyKNkw,УjBGi0 mYN塋P@\ɈMn}ʕ#T"G*n }!YQb'a>Y2ݛ hzk9+}, Mckň 1%q2.b0჌< 棏R62 7ʛxhmލE :Ǫ$,Q5hX# =$`4(\e1( Vy=dQ {  _wȔ#e JqIT㝈\0۬헩 As-%>(\4u|v0>^?)3^; ^?e맃S^p $A&㝈u!cŌeka,bblJm Vt&j,0U E5Aa̪1j&̪ǬY5A0fƬځ0e¬vxjIՒ1Za1z&ǬY=A0gjځZv4ՒA泚|E`6ï3)0Ě=7̓m9T+ƎV -X@J|Pi1] iU `;f=бLۯK9| ӧ+Z>F}PX1"ƫNx.ZeAkR*,T'$=$H_!l9[Xxwsih}އBz,1a3usx'``](AA9F[ ;bhA4+K9 &x) +X*F|HXQXuxT<-~`k,+aqjDi0 mYFgXWW=z<[E Dk5F ,eIVև4MP{xrW<~)awVZjWcghפ1Us범o(=$Raܑm_JÈ塅Oҁ3e[ș>$V<(Zqxj1f_6k{&ҳY4wp#>$\,(Z?buxV&넠ءx÷|zJuZmN3* .#) lp7h5l֠!S5{4wgגG]|b-x%p'jd^u~ Z[kV+I 6} F1uDJNNGE"Tal 交bpٿAUzkb iY,%otdr5Ya&t\A_ςkp]@há6o`&\*s0^ MpXa {fgg)0PMQ]-`L~S>|#`Xa*;s 2 B~?">碷I{4!.a{.1v~mܵ|y#!?nI@e0 FjM( p"t=!CR|Pz@d1;<`LtI2A:`'.p9c :Sh:'L\dsTKVN1~uKXDҧ<#Kb|@]X:Hp> %??vɳ>~ qCX!R$=gVP CXX]Bk2ܤd]6HyQB}Q;SE3>(D\p{"EW?ȘtI V/U"9nS @t*c4T 4x2Ƴ#{/< [2!RX S%ȃV>V;A^1Ί+c=3wzVP")~K>a:Y-L|}t,V(AadjX2Q eGwj2A|'G/Jslk޺A‡em|1g?u\8ϱ…$&WX kz7ļoLnXw^VʉZ&HL)Ô7ظlF2K%a*A|`ܹDӅ-])6D-T&.(6]*xqBNM;M-K3Ղٽ*<$It^rY%@ 9I0󔼂.~BSkzVHG|OOa?ߜv2 m(~4!Qn:Xn*ES &1JpJc<5VdLT;ǧhX <)|Z,'<_zKx\OT44u%t[Z[ƓRwFjiP5+:t6UY:/j,b*ogvʔQo2n`j!U{8kT(MʴT,yPYEYm\BmvRvҕRV\ԭԜuvp^(/B8WVx UlEk\Na;pھ9ĨIy FH \e&?!-7ެmK;.),fv]9H ( kjEwN5U ޮSڔ)e𓩍e7WdO8)FLM1'x ~w;n:đ'l#A <(`B=a|g`;I4lw eWwY|$Hll, P.{-lw{zli7ޖ ofeJIzES4Bó0DnGqG wȏ_mv׿-E xt .ں4F)h( m6.OM{l8x.+{`Yf(^0hMjQJ.uRn-;H5uljoh{txi|RK4̱XLgN%ۻXf#Q*yQfSCSҷp,q,Y&7(XT9|a0'YS&nRUvW}vo(jU|]_j]+aMT-f1I>/ʔNkϢц^l4)K(/%;" Ch8pk"M ̬iP{ZOWyT8 r)E=-*M$`VV %Ijֳ!QjQ(K}P]{B2 %&qwsީ=Uյ*H|yve.ix~ ^ y|Ўg$K[볽XNFS ST]$hvMY^⻡'IT}!Qe?WmG&Ut_E26V0{\IhQkÍ͞<;5H!bIAr#UhtG2~} Pu Vct{EiL[~;)>⹣<'9=JYY;FG‹R}&> &}c4:E籇"ܜ޷5WWt$ ;,ɲe61@W0$2~eCv_jec&';,_-x#nf\/Ҫr BQ)җNkU)DO- ,!`*ZT:Ftt7n*o쉴U'+ v=*[N_F$,70 Q辄dfGe(T!DT|*W-ח0i]-jęDq- إC#J-Hղ44m{h]M j`4'agW5at=-%`rgk_P-,Hkm59.V/R&CJ+]`}> 2P\z;;`0\%=,j}G{؆nx <DNp$l<>L;“9"XJ#եcSH&6s9݋ tR|-.Hb.99A#bI|. <-1؍)=]/|!AƛڟN--WjUNPOP ??IkNxP{<Ǿ# 9ܠ~V + D+<<P@-ƦbL!C yӂz͏/`[uoǧ/olJ%CezdG=r)\]έq tn1xnYqiDά귶tO/R88lt 1mg2n0$Л7_ݤ.&m J-F9}dV{74Lm[oi\[_nl!*uZDҔa ?F ` i)`Ba=d@)ZD`-<y|YQ< \x w}E(_i@ABӧ:}t"0W#߃ .z633lԇ fsZY4/IrJ*RB2!D[:S,[pX!5jJ=>%Ɍ'/fQEtXeJR2Yp< Ʋ[u W NăH+J, `[ UHD]Oͬ@ ru9.M؟ q~T<S`s~\qW#+?>cE5 +J!)/.\@<`)+tfUXc}EFλpFZzx4eOc#;+Bnɳ#QA9>Tzn|  Q3WXD~';#C ) JGLA,a(!ILK{ ~uaDRUEi|UzG l/{RsA`&0 @ SO3cj!_vHT㳬k-XaPRrRq _܌yXmD " W|@+U"% WZWJ'Wg؃khye* -+I4^,/X^ˮkW^}J/8$ ~FjJƘ 1bB"PE-C2k3渵q[V9[%8nrU;t'ޯdg{?.}o}2'sqp,8<7Zo40=IŃkq|O=4.j]Ita\G韞GO oN4z#@hhvkMMۚ=h7 pxn7˘ok}Mp~ͽ-6#>#>Y^.c>}`;^)ha7v[hmN2JZ֋ (Fžuu5g9 4j7v]kAa5eBɰ'`=4lx۞=4]k ^ɰMdRxuj^O#4vi4_ͶYuMmMzT5x#" ?^!liů,|G3(r}q P*Wof [ amOh[eoЭhzl_꜑sFȋi\k[xz4ߠxc t5m՝AʱfQĞM[T jҞdBKQ>4}|}7kϸdE C mFO\Й?![xvN/ߑz^TWSAHY9FJ7~@EG@W)RV]KD4qXq;zǻ{oˎ(.8NPEK B"@,gkrtk1-M@\d̝q?FҚAA 'cG`Vd5eT߲1S؟*[6mmaقT܇D]yĉ@NIapV|Ĭ'g7quTe%#;ӑg#o7ZG6[ 0)Ǧ:^؀H-u֔B%5DQ.\Y$TY9D%I4H1YhJ#zT9Iƣ[d1z&B{KPOX…(h5 =O_."b>{U9gjI2U!-cEv3ot{e̕aչ3NWdFgxU_'=G^PF1qѐ|2m9d諝z  +/DNcVܾ@x๨=(eՌM{{P<"ʹCCB`D x˓4ĈP$x@Y- pҽP/_]0&սwzg!x'֞?+ķtc~7m1) Jdяx  .tKj@_rK/) )l8ɞx^ߞޞ11&'j7 rUMqf Uͽ^kki=Mӌ=ͬsU|՚{zj \l5>V"JȌ*+nrz4 gQO&K߹Pxp͔ܤev*DERЀ,QɿT եn⦤PJq]6ECџIG:SaTL)(rq)7JRRhٝZ3ڨF]HҴ\SL JLXl*FdS@\=*%SD՗,6 ׽-k̪#VZ-TQ(\ŭ %$ڔK"uqut"<( %3|/ot9x[p1 v(S$QD+v*C7nίSB6YI005N-(x,0'}rzb6 'T7HXt$6f tzrvB~'DRIvNSyB4u7O1c{~|zs}1(Hoڥ a,酎G7Wy*ǛXUĚFu%֐KMb1u\ִPع&ll| d_gЪ5Vf] O {:O?zlY u~J/ ;rFsTT6&āo?E;1A2;n?g.7,JJ2톢SP:__̟«͒8?^p:{o3oD'V7d!}Q.\)NY!HevG/1RLN/c(p4Hx./[X؈^vbZ:~n` Ԓl'"9v/YHR{*fGgR[Ǜ䁺eۗ'q)G R1pIiʉ8d ytLc(}4-yZ-~X$A^H*)GFTeIS(ވUz$/:WaMؿ2N=ygC]jʚ3w,S^`UK)JEU5d 1*ʯ,\RE #xe4]pvq>0Y4]?L?<\bkVMCgH*ËX\w`;1zJd*nD9SƇ.0B:bDkɗ;ZM nf{1[-3F^; C]evע~3\"(a(|e >07ej2%|^]0Owwy}riݷX"N$_ݝ^u.蛊ǑnF}AmXmޞ^d2~N杜_ܩhE\eDweDa%yHR =U:o{vBT81pBIc/%D|QCIvn/Ɂa\FϴǬϊ//7wO7n2vMAuք('=*SlJc4✢?TU,2qYBpb 0BR9݈ ~a-e/~FX^)55 qi&͊*5T`(zRgEIƇ3`& v8PaEIDBˈ$"&)+EE:hT.^!+*@#I4VQa"߃7'?ȟ߼/."^g*JҕB4bnP= 2 M MᦅNoaXH>ŇҀb<9lIWcKL;'Vdj1y V'{'E.[BqaSxaL0P N?OT"74-~/Sh`e( %򰢚 %1R̛.:woo/'N>hϜYs?n)4غ`_Go(REQ*㳱8 ,@mQl[2)ZFz)+Wȍ:)WYFȻ#TGRI$ ^wޝ^>fѩIRtڿ(f.Ɨt C9ܜ_OWS@:3վ w~E]Z;O]":4/%IbѶ8`2{?^֖Kw X='sӹ|zˊ3/N(;ӿUC0 @op#wHH.d~f[_~ޥٞA|x{svǥ]aZe7f/c%+\EJƻɴPbX-?rnތn>Ǥ6+[㏮?'YJK@ryA滨_XS/í-|bd&]9 V‹ir~e<|1 2td0Cy ٹp5-tx0JQK͚~p>7˕K<]:J!s|yaً$GP񟷧ӟi M9`|s{KٹɂJ$V<$OdOrg}sJ˴I<_e]~v|WFvԠ:2.#^|l +WVJ֐Zfoﯺ=QYc$%j}>nU$ )AQ''>2s;kj`.[jέ s=sPN藩P+C?l2ы6J` FSsڝ*3!E?) ߹`)a-Q, t>ke?䥘j@I9 1xʛ? 4&ksT1|Adm**jpՈ>8'AI(*~E=>Փ%NL^"onlZġ77l4u"Vr(jAm9z7<2,oǹzOíf7eK7#UV.W2FoˠԮL4梵)o,jב_X5'?M*\>xQ4lxFIjO4k0zZP@ehbx[0m9!F!͹8NJ2ѥa^l^3?lRQ+~A*T!nյzXz]Axu;mpWBƲ>oNԞ9'PFVuy@e\lmc۟Hrjtݢn~hBx;9R1lX5I}LuK5jZ«쥷@/c4xA2;=tId/9^FӴZ '&U.%^ mD붬vd7mmr0oǙScrpÃn&v ؝0sָBgc_:SKoPsHfnʔh牶&O1Pi 5ybn']kC zқ&1kQa!u(^+{2b\GK,b\mEi:0M_Xkʼ"$Pk]7k]f (镇Ky4/9cV|L%hv\ʵJJ+N {P-Q;`7JkA*p3KO((0 W7R+S'Y.ޜ0&E@PVegϨ7i2 ?hr@R^-aLq0¹xt1(3d&XK1Kz*+,0&џKj⒑Ҳ\\>2j:t f)mk9 kHxc,7 hrָX6_ڒlDFvD(/C"0Tv!Xxw$h@`2R>rEC7V\͇R5JAC Ph%Qjs24(E`{B>6 'B(E`b0%FE1LQR/5 j'zBp!zN(YT,ab(VLCO E@4\A!E~?`T!vUsv1zkشn떣7ZCٰZ j9r)GÿVˤ/Ikzh4Mano%wP%>WoȿW?ΞdkȿiUj57'o[bL-WXirn3S!?F:qwߤ_ށ|Q}"g2~q Q-nV*7}~uwT?>>:].Mhthܟy޼?' }U H/4>Sw/ccPfH8;}6Է]7 %=Y<4h "vhOOd8>*M'L[N@ĉVϲxLcO"Y|n?E߱g n?ܙCoգ&KX|v>xf>e:X'@a<3'` O@]@H?@6|AK,9ZĊ}g?}>d2&Tcmמ"9k( ddƒdvÎ~WiJ)dkrB?ժ6 UY/;NZF-']00 ~G;znvd|J%|;jbҰoM 2]2iGF#Gm# "cz#24?mZقG-|=V 0#q%ނjduXH;nl7vqGaA?Yz!lfֶ/ȬnϿokcTVpP;Gj$ !T5FЊ?Oe$XT,7Y:,*lHxڑ`9= 40,A7`=V2GK6ʖ '69Ҡ#"hVARK~עB`ڲi!;ۼ}4vNP`~kKەUuGVZCG(hyU:!A-HG|KԸLdC` Öl)ZUT*hv$T#l o[e@K'~+Ĕ:UV,H\DO>2YEonR?Qw QUSa3}WC~e=$ˍZ95JJAkK_CSAQ|3vv)eUVJsqBJ2?tɟd d$쇀DSQ\t럵mKl{IuH[ۻڻHYG4݇Zk0 ˻ey!m;Dei\#=aO,~PEvU*tDrId $v[_+žlCїaﻟB3쒰F-T_hc}+C8ddv-vM!&.[:Ox< Ft48}JeE&7 ܔM9br$a3L(b8&/ 닩1_/kY-E7?닦_ΉCn1hMkZLHBG )c"&<+9sc J8u2q8 R$>U\U1#'}z؊b!lDGFhɮp؜P-3RI-,OI-}gU 72N~/=Q rBuQ Z/>AH|P.bM8[I_(3 Vu7PӏR]}s;R(< e%ME@,G Up}S1Aח`ӭ, QלЗ\ݝ^]uj7;|AUV\gH]BV&adO8]Ԑ38 6gpSSxHpi:b(ͺSiH֙xZjZ3kWT7i(SafaP5:6T SX@}3^Y7 ٠@R=|#Ŵ+d7h}Bh@X"yAm0He"4C-gԨ*b*b$B)6-xvt]"=3#77*s"K p*w $ |AY?SJ4uGvU![$` B+Aak9t\.]j9CRC]|@`y@nmlS$8yE`t QPTÿm7hV7#C ^Bg<64Z.)3|&p%\`@|_u~Tq'W(XRڋGEq F) N_`*E'BbȞߑ3)'4"<0){ l4`>8?_,a<dZnJȱ_(GXwk39 cM.u s0u׸ 1ڄ=<ʪ-3a-pD}slT^{ (_W!~aJ%5m%2|U`()l::.;VE67TW%ɚlsL"i"ԣ*Tʥk+AQRE\l&=G?Ylw+0\+^홪ߑLp9qpj39`0=V"ɒW"ݳhQ{l]NAZkAqcwا oOQߠ_^@B|"%)! cDN_Թ t3LjK2g]3 b'$:Ak"DF AK,Vhf9&ШXic-Ο j>V'7_X.;!1ɴ.퓈, :_0%7S9ބ@xN91pͥ1 inas9p̳7܆Wj~(A# .*H3,B'b4PK1W*k EׄCoe7N}+,/M"PKF6)<kd^QR řA}4̑Pʀqp @>4BK#}a8@H<B Dsd%3r.D敡KC*=8riSkkvH=Ӈw;̇O @H+'ADB:vt TMxxKu"r$g6q*R> Ǘ/Q˗}[ˈ~.Df67t2K`4z!.,B!ч2r6-/aX|BNJ;ehϴx8""ӱ\# ?De ;.ǓLla獩-Pqdivl.@9ԯ`那b zީ#G1Sͷ<@ '?ƿ^%*tKeˀ(+CbCf^b9RXвǖJ b&Yz+Cџn33]r/>=/4c[ #H jH4Jj8ɛ32 Q@_i}L3c q*I(T7զ2~9 3̀R v͌Hz 2 >Lubp3 {YTB&,T!B;4!{y-y:x"{4$G۞A  8O>O K')/';@;vno:qɔN@rk/Zd\5eOlBaȖ{R!e7 @hѺ*g+R/N3c& k2vt E>0" eko>Bнa˾m:R^;vLjÝ=(QKn0;.Ű KxKG|Eh-lmyEexw m)|& gX}^^w~.2U2z-0ŌK+gU.E<DKsEE'*bܰjBƒwYH5#(ֆ"Eb,䛟Ƃ%-r{֜e?Zv֧:7:8UurmT|xLM&rƤF8i "'G>6~Z['U0GZ 2W$jcw x_rI)yG禋> !\V)- cWkvP&. <E c̔d+؊1.jHS̞SiYu-ߵeKE,[.&|}'ר"֐NVK s\6[x I#?R\Ǥ\P,a*ǴuҭZPE Z fbĚ+%:F]Č6A ۜ +:Zh/:v_P#/N*OLwtA3 &V5/N 'g8(] !мl~J\t[ P_TSg`T&YH˞_}OhÑ'>:1C;Ds<5;чA_V uA8SMrЂ0 m@u~ɑ6)DNcA` )3C= Y QUx(w4=* sVD>b)ŞJŭ>m@??TV]QeXVد*a˳MTS$b٠3Zή:LBအc?Yc*J!-jKʦWT`;jžG"/K%z)_x !UFrHAt{J!8h®C3lЁ : 14kNY7SF0K&sCd/ՙ]vf"<|`U6DFiFpܥ>2o]bsqPQ_X4>AgynwCdjoj j _z- yh=^޽E/Bl`#Y Trjbae쬩 ܨ5exk_D7WoJ-++:ϋIH/H_aoaI_/:svfU!&VU9/(LyB Zwݭ~i>,XV=r]zx܍E0Ny8wZI{ħ >[7ٚp|Y#n ̳7i~zmX#Hcpa(/qCD6Uw8D_vEѺ)4oZ?^݇ةb92+{ݑ1ua/"/k xSOc3 =pfm*i l_1tkvl˺}1E`+l^8Гa,%%'嶤ry#F z&?+1@IN&#'?%CS߯s j*'Z)jG.۠5y 颠Be*OiZ$=Ü1[\cV)u%FۏPuD<  JIGOm {6ۓx ic8^0{ࢻ<Ά˺_<<~qq9>]>Έj'tmVxu\y:t{@`W>q/gɵzg͋"}>Յ9"};$pK6R11 Lfo8]<ހJg8uy#6 G*qJR$vWɵ\˶P%E'|zi;bgndq߭-P~-u&|J>zxx^cX;ͧWq5L+pvꑢ2oXGA4bI%-6$IuilN{n]rqI̺D{ggm͇(Knmݩwz·̿S53z|/yT﷎`1A )F{ j퇒1[%[eQJbɔ{erPo՛nXXLV껍f=ǀ0XZbrh k\#+,+ :q/eѺ/\=a~TWX]98n98lj6>v{E*J@Byc8r`Ne,}tFxgruR xe2dT7dB֦M9!ekI[Y^vG 0(@aX2ȟ&Gĝ^,ףmx|eY|2K W{Js{j{֮%?ۿٲn8X 3YAmJ2߷[/$̜=$ꮮG3W%G*e<滖Ud/O)QB qݨ7$e6 j{ x x0lC(|.Ie`14F5 5߀ROt wDr&]=,-AȚXPHg0s#.ŗxsX\3Zܛ:$q.Iey^q1:ֶ7y!Ec~mKRM]Jr><-$"n(Ea7.ɻ1ח/'x+}7|XxwߕGqF2=+*+1&:l3$1$G[bcg{ +C TдY4qv--5^ȩr/Q6a?^*Jey2YS+R̃M;WH$_/;2ᢦ ҃r0WDoܳ*uV%4׫2\`Sck"j"'sqZmR L…^LAJFeeӥIG1ew1a OB2WRxY+I e/"m ~޶:|"X[<GnÐib!= e@^} _P6PFNTZ{.e>*ќ)9a !^/_INXSk>o\\[Tw;K1-G[{)>6.nM|:fո[J8JLuO>̣05w!=14cx Iqa\Ĝ/O<{WfÎ7nW%2yӚKNv驼-NY^@]8d5Kܱ7xNXMb<*1494{d|+7`3|,Q/Ś's}=>nv.[IZamJcUc^3@XĨgC^XH+.zF#+O[[ ߖ!8 zlcؿQ/:Dq8d A#@ט "4V?h%]Y5QrDjr,0cOޱRD(S0 <_<[[c˳rD ؠ{t29!1pZGlSdb WXFP-1o$Jzq2-2-t 6\G7W\|fDM#b̐Z/ĔY.Oml K s>X 8 ?-Wpw0%:KbX!C]jq(H v2#^Jع[* 24qmȽR1"IuN$I$JPT Rddpq΍OX Xox*],n'|nM,h賉k]C 6^}?CCôf@j j԰E@k[EкhWkx[_@FYY#{G @ MK;etHuÕN4/zvY`*bE+ ̪?)`VE`i˷H晖e" FLX9V 12k.=ch)d?߱vfA4L跅piO_)WY.,N4>>f4Bj|YJAZ%i>ȩBgup6=fF\y|x@/! KX|4hQ 2yb}GkkqӪOjgw .`ov5岹fYcc Lg rxv p61,z?UAJ#lT9n< T9Q][AE5K=sxE%1#  ))X.oZJnn+h;$6<䄈Lr𯭱=dH#XoqzE?]F:Z{Ik/Oa mC+Mu}sl<Xb7x^rYD zVWoZ-yqu|7Kӷnao M͖zktZSNNA}"' (gãl#a$ PO:?A|~GF4OZ$ai&`ӞMgV|a\pM<}H|G oV}rA -N;i&@E((( }Ǿ$כdpHn&XEuL[>NV5!R;B+ #rC@3/!Hl2Mw$Nf$dck`G0;> JC}S/*TԡvxLr6{gRy>8fzL=" (EĐωD\!:O )xK/?JB 6(;i{_ѷ *szFa狩=6,<+*5hIN&֟yTMixBwP.&#:),Z̝0-tʐ Klika_39A: ق[:bX뀫댡Ҡ:7=$9Od]}F?5{wdZ捜[N0=|f: ^~B5#_[KF37ϗUĢɋ> wpC<\2|{䜰DNwi sYҞ=( ]VKhd]jjGg6sR1DD|oUIBh_4xi˸ϱ \k0 OT*LE}ڝӧp]oi6I>5X|k㌢SfSΫ,5%,BPܞt ٴ8-&s{4͒_3"S“58L\8|ғ\gU0Wfr}ӍX[yK;)msBSdVuJ {2tXv~PɊ'h[/sYk|rh߆67Wبl҂+DIQ/@-k tR||T)1 UfB!B2ڳ rx1/3^O}w;C`Į a>BQ22p;# kw8Ƌi/@$6.G_%cǷ|(Qy|Zw`!Q9wk(2tR|nꢡAF,O{iV<M+AZ&4W_9k.΃3X#+h}IZ֬Gz/Kf7ԬUZ}bj0xeSJ,$?}k7\':7k_]5^]dmh"ٱ:grJXf܃xy34Ef)nCJF~6%z(VO>JJ?j\`ҩhr8$ 5 s=~Y!+OE6p:<{{3K(4hМoI w2'L%b0qȾwzjt[J q|NāSd< &I*֐d-qz0k @VeCGiΦ 6Ԅ2 +&P@ޟ 5GâPjĢfT;cQ(*"40*ZP^e ʿNYh+_M78 uۿg'LJũ#Rመc?yfF~hO]Pв1FjA4PO0ioޟ >ҐO`W:=L90@y/~i,v*ې䈯&[s.) K/ MxUܯ^CVwXrKҷB\F+H8N6 7 x&~ѭ$ܳ;`@guu*b!e.!QBZ[x:$׌_Ckn(ӉVnx;hOj(8s@zu~;_Su|P)PAEb,ZȐ(-WL*Ɨ=082=,`| ^@l2>(Krs$^9XyYÃ/5d|'^}֭w*H\eIlK80 Eڧf8_r;\_ZPZMm7EignqlKD#2"Z3{ɱBvc"kuy[\%eVX8Vԋ D^H`++p[(4MdDx\9{^O~8>uɿ䧪6Rq%'0[l)I7 $@~;eGaDn̩Lɜʱ+Ḡ h87sbz>azg{6yRեݩ,;DS6٥qևʱs J:4jܙؗoH XՕ-~"/-PY4hG$A!au ò9c)7W?^54eLMCڋ9 []41czGJS% ws;oG}\Ԃa;KFކ4L>twP iBx+ kJ;B`,%(ϱ`ϟ˘8˭qBȻU,(i}|NgA#St7G:y * |77@DPH 4vY5/|IW547)4GUMOWi|CpsIq*hُEA|4&2ڤJЋMyu d1^y;#m['&,o?tt_.nP(Spyk)D4^1'+P@Ht=EA)%gz~V"Q)(`\N3@ۃd IT>J~TB3􆸍$ib5:07 H <|ϟC𢡿_M;"`8rQԜS/کܥyd3>S\i=lj N^N=]%؀ Uu Y2-/-'^Bt^Ed&Ѥ҄=Y1=FW[@-cJ QSdߌd:^.8G}L'G{lck$n(,&a[nFh10гVb(B@L%9aP˧4ᚫ)RmuZV۾j^Yy8X/p~矦JZΐtb4wsJ z;kut̝\׼ 1(pz\Gi|op !PX YrH$J*~7 Q#=@Vٷe2K.^.ۖݺ`gCs9ۃiN`d9'ʈO^¿L{+ Rӣtc}ԗJ@'LComFT:(?KEcnp%,~B]V+ n aʋEc4plrWQxBx6б#x ?oxDx7d#NB*oϕB4WE{RoKis+;l?-圆t.ו;;7hlnYk sBL^ )>F >G1"J@L|ZP/pd-Z/7+06//GeanY}*\:a%{)gdڄ2@4l<+GQGmݤy/3_fnh?zx1pro|}n*<sBx t!S#A3eu}Wx~v\䙁WV'#KȹErBn^"'ȱ!\x[98ʄ=tV/^a.u4Z<6s],U؂Mak{,dAY6R@߱wZm &l]VXԿuE .JvIi[4-a- 7JvljLf*h[y @לw21Kӧz{Iqz Z]bl:xlD. se޶*FjEA3=S8r|lWi\#mG4HS Jgqtc<E»E= BN?:ɼ8}g6qn:;ߓWV~IW.1a<*D}{rXqqlYN_  KSar_+gDy(1\i9EY =҉ X= U8HZGfYLf#i;/.`.P?&Vԫzx팧cl'3|w1>'hTXH-Gq:{jlfSLDC 4p]stc|}aIuZ\?T/{.EY8bj6soI!Ja.:׺i%fMf`[Л5*_u^LQ[,ꗖ ,zS7,jy%@Mӂj`xڸ՛/fݨC7a uA\frt@ĢmP3bQEgȗB!Wq*]ի ]0LU-!r[IߩGSЕk: LA+R5 ;Nx67xEvVKHil)H<79۾q nLe(g<לbND\F`3鏦'{,e!\GYqڤNί.5|oʁMq*QH^ n %UK^Nxnܯ[iJw[?! LMMX:K[L1 5xq3)6w~]a-x9!|bV.Fsm mw\bJ"J+f'~t%]ґucʛ*[k>)l? uo&T|8(GPfn)1^GoqY:&7OR)V ) 6@,ҌH`ޅR}cw8 |4E^mLBr3(rʑ?H-xæ}۬HP`^>ԫd]rhE(KE))&ʩehNCsV(CphJ}$>1o@Odkr==x d+Rԅӣ]/nq6%d<<3iZPYteEw0>CoIy?N4ŴdϞ?4*2:z=1D!jOOU(H9)A*rr2veO?apDlJ <(3;O2e &Nafވ6g>,7(yry~׌7qM>?Lya þD"fI?&mq(r򊫐OP6J;?tIxs֤|7`['. ,6&Y7:qJfT_ˆ.I}d[5+䅉[lsjb")ub#ysƕKx5?y޷;lХ ־lծ(|i'vfmI U<֑RƓ,}#Xg;t!yl5Ο32_"r(1̏gj>-cgi>w ]oI0(nܬ0[i$w?'鄇 X8$f\S y&AJ1lRT.`.n.$eңF>.PHVLbUdC"/E2=Dl7IJ^*_,e3Fl["L+!~rČ^n_޿}$8li h+Ǟʾܗ$Ӊ.w!wc9.޸;YFrO7ٚb*M$ o-my{]EP! ?l-I!:֧\`[!@^O V:oC {;';.J TC>ۚYT~tT>K+a!1v۲ . >ɑ"CA 0QNZhN$̠&A. &a / DgqX1,-*i!-']bt2ɐkl? IzwuW.ŧ8̐NhRcڜfc4˕lc,FwmcgjEP"mX#cʲ"ݤR(EHE&Ku&y}p#(Y;K%{VKk@K3[vi&c犭/XQ /VAw֛ۅO7akovY,ZӐR*sccp}@`M;pV߳dq/ZjڂpbjBcیr|.~qy.X.>Sjex||yZ2`?g4k A{qW=7+c-^+>4Sk,V~(h4ԻaNj[?AVI KW! xҙOK 0B>WЩӺZ#=:;$_^"(G:Y i&,2z :3m2W)M_̺25Pe7-ºy9CB:JSgF+t+%$_+D5MnѼkw8=^%-M?Z,.O]ƁNIsúwBu>s,k}{x07r nħ _@'%ܽ;1|0Og4ؕɛ ^H#` 7設NHbj = tWMeQ oƟ̓wN;8c-V9<o49K{*B&B>Dր5DBD"6ȅEk!o-vtݮ4ZIKؙNc  g6HSA]_>b~83y cp44,.gp{<8nAR}iFv8ťC Aр|-{֏Iq'ݯqv#hU\BD[/'U"d9c'o#qn*5kʌ~+K `1|''l1(?b &Eegf2?_YkBSǯ?}eA޽!Z?ZQZ^yK@EbYDA шkiYɬbT_w-bD$3WLjXL瘟& @u+PWN+6Ć >3=~OΕqzo:8=W# $丠wNou?XGO,W_/?ȚìҿM"=.5ڍ^xݼY@ L1J?i1 }{lRb^Ap8h:BFFتїJi\nA|ܷf3jkn1^fmvZ) я @7Ysmg8ljP@yzn[ȻAE#Z*a8Zͼ˸!:n*`etZޠJߥW SFFUMB#F:?O sۯ \e.#ص`^?ѨZ7|3=.2z]qZGfK[^VF۱V[@GЂ4Gs |2%c4S,Ap!{Y{m.bŁh&GOH:H QA9r"j)V4p:@is{})\K9wFFG}G֪N\'ȞZ庾 ")XD;Wœź%9}pu{*{F#jN&E>9:2ggGG{͕?:88w^CFA@Wr @khWVhoZ#-MvݡĥtY5Vm6&K _l ͊114l8.\54]BVY7Vtam7P/&I)h^C_}F?ZJʀ,h7JoHލWk}~qv=1 9>Q`^;i9A8p"vNX*$?U&]/T @:!5#&i8k^Iǧ5[A=umZ ݭv}PXF[Ckg]ڋ‰ԩ5??, G͢%k*LY/@f:$n7nذX,׌ARMA)6ed:A;n| ³fm[@̜`hp@q`6\4eٿG܅ ?QKN<<?ٮٷ9_/tڰ&NrȮVF5VW[l@q. ft6TՑ^1at%DT. |BG4`W^[o1qlӸu 9r "KU0B 1l K_XCۡU3ZM֔Pz6Y!|U%jA3 1U9A6#"y3"E6 ޿9Cu/;N0Cl'r~Δ|;*ZA;L7 YiJ˄ʡLͮS ?w0Ok\-x:]mⲳdtMVNJD"M57!<0˦\\} tU%iYjf43YԤlAxaQ~ո9Skfb5Erl;+ Ȏ tj^Nf`OPM0n˓Zt p9*ߌn<n6&gg&OcaV3FK)m1Ek]ၖ`wZ!kH?+L(R/sҷGDeY~D|#4{͝^F-TL{1) `ʔL@Al#w.tn'<|9RE;\ttOG](tθNm4HO94j "?wЩVJ'[x¤#gpM .B"R'LT93c!x-(C=#?y̹G`zm S .t^QvmSPVqAAS )yt%^zV^WԠ tn8\mFL<֛zm궛.vٮԊᄶ (DnmmJB-IIN[/v{FX; 1+ 4 „5L: vm;9w\" &T0!U &$Je5_(HyqT;6rҵMhLA$1\В!Q[eR4i14  ߴ1OcբhL(Z G߸$'AZQ8 @^^mܒ~G'kl<UƓ#}詁X F/OXU{G?>}}T%ʅ<[DGZWN ٤V5SNfC@Kw{H-NqHXnAC fJ8*C~~ȭ7mjIs$aj9nBwԪ-!A I{ѡx2PrbDMG@0S:ċ;Inx*tD V 7|U&W!i\/x45w$ۏ66O aoox@k>';1c8̜: O(ZCJ?[-~B3"2Z *(n;V 4,+@fud48 |/Xӟf^AlؖO?CL`b;߾6_v73Nѹj: Y! !PJ%~ vX2=Iڒ->zz[ZRUSh,%Ƙ/^8[d8^Q=0dYD4MV ܟ{I S D5M*:BbN<4 g -=@| M˅L^|B0˚Ҵr&XCN8Bfn7$LT6w āC,U9g}UNI8WFTxq$B?;Ӂ{ 9ZXN(𳈞+;mh{vv҆L\*X;s+iƽߐxIe;U-H{#Y󤭴BFDԤ[[45i'.{LDŽ1yVhӮ=~۫@ R de(}D0J[7_M?P5ê\\^|rk92fl'4&Tp?nI{cLGpz5>sa\X6 acm"Nw&7֛$(GP6 I&*?k~>c/I0L=;&E~<}}%m%=, A `jUyAhbG|YI͓`L74RB]6͋Q {` MQZ.q5bsE>[D FCˏx&rPptծ7*8l܅QDX9ܯșL'd[5l*'Z.Al`Ac/ Q. /@!>-t~[4l.lO6u},r'938qIz _#ٛWG$0VlF0&vWPMC9IInUћRM`YÆ 5a46hd Iƺv+T@$e#QMXOwAU8c`Ko\C&H .r3M웙%?dM;+=` {rPi,~b-`t):'7$Iv1mMqs/Mý` on$rq (X|(TpĂbij!l`FR34~c쉱pg'fD!Z abyaj Io o};>>+-ܧB Ttlx)٘=n ǰM'}XNg4H)Lt/AKv?Bqi mi.wlo_Iwq/2S ~G\@U}ϭv0’@a68LF{"w3)H57eWtAG (Y Uburd%Qԭ]CLl,;47͋wdPngVY?u~w/]NjVM Lb,f7 a^u`eJ=,!vw³s1>l"D:&f V'Qm d{7x/k%(߹%uf1#-(9OoG/5$~x"rNyu ~e<#E<|Tnj+AfbFIb6>WɈ,GCebIӧihCH=pԧ3}'ȋ#$!J+0+EA8Td9AsoV*USbX.KA:6'ݠy ˥^?{Q}:TW}SZq^t25IX!2(̍ŕ\2[B[?G9)n oE&ʼ?[W]IJ16gr9lLd3qK)A6d2YRKYYJh" vdo8q\.>+veR?`/o&gUnZI2"$KL#84E*?I$6: zI'!( >ݛ "yO& 7̥p 5' Ļ:ûOWZdQN-A%e$+=¶Π2WHg0͗^ E'-ކW+?}%ciprFzWpiHoX?۬D"k5?3K==g+,ykj .;(&]Ч B仄8^21BC/Oqт]pԡ* e,ьC~!Zm0eB21J\z 0? D O'.TYa@ϫ"xqP?rsApd*(^z>}J2e3NX֭L6u_a[il$-5*ܿ\H?9!l$gj5@aY`aX8j\0('W[9q"7Ewu\Eg]R+69غX6KlHĄ>~73#3I&E^mdX@/F[e*{S7%@ԗ;!mj 1*q}0Gv_\w%z,Iq}rnd~HC0¥*w7|KC' ¹FKz:Sw<Ǹ;`&ʹ7A@`{v=y!у5TX"㸰b ~4؂w{{\}s%_(M 'r6:S$aT uq^4[B2]'C31kQ;цZ~~ wvJnu3Z:6mSGخ[>J߫{ a,xOkXriEvbW^?StJj:/Uo~V*fzx(y'90bu˳mw$^q|5vY@J)< 8SkܛN3q& 8:G</f|(cG7$³`@c_H @ܧx^y, 7 GEpWm "u`+=,X$+ \ /Sc+¿/p C3۟/ :{oC4_n |4"Nެ=L@q;xE4t7څHV{fӨ~ŇT.8?Sr Mq]gͩDI/@.cLE,N+RN3&A =ɔz=@hz9JʰKBUMOG.#[֩?ZݷVȀ/0vRx C|#X14SOueI+,o>tS#%w"c̲1pd~.dh9ҊñUlם/08Tzesԃ#S84Һ,}ú9G!Ab"֍?7ݽE~?< `wX08em \MLǤ$ԭM"g]'*, -Aht/e'L ZF5+6)XQX~)4#~.E/ NV=]ZD2qdNr9Xr|RLsŸksB32Rl̥970A;<2Qr*^YEU = hsg.yc=+Də7ֽ6½aKoj? KY=j{\ tMd~E1Þ eSzm{\P?vд'yWR-f򒏡^772ҲO'"cd@`ۭIQR|@&S=gk_V< 1(yѾ@3SDQV{<+fHuC yLYrlˌyatap3/ڎa%'>(V }$%ʒrZYFl=F`pFq I36 "$/-1Y 2SQ@Ov>Jc'Qg.qM8g{,%3JC3Қc$q_`{ z" 9`9I.P1e65CqȞr/8aoIJdΗmTKP1:&Ňe2f&; xDoS Cci@!PӶWG򞿯9y8o&c]xyeZun[ǎư I; }0k=i8fnݸQ^T`x:\_Cm3v\Y kw 0˕xԅc^](D*d`T+NXd>+d̂/._J5u8n}T=#G(d]kW#t<+u?{$Rfhbrj_xDH'Oʨ9b ZENfRX|{M7̌~F͔)``tt,A  Z"`|e@ءL0FXP7=7q&m/V [.n}jV0e)TE|t_Fnw0Jl bFҖs*!S 8ྟIh ,)I/:Q|^s).cUڸ1TLHG6&.VX>NtA:a/^, R2ĚWB0ۨ~@-? B5fBof@6P+Fqu,ɬG08($]I,_lOARTҩjӘK'^|gFQM LzK{wx#o< .nXf%|w@ \  4̏q rԑ`U6]a𩥫3.lj "L=wiȃv0)'yJ5)(/oW[unYv62km:1XZEî(f12O])} |0pHxW٥(+ABKZ,O  `ǻ)鏘/!3( 3O9jYbI E3#&+CVP_S~6nT¦ü(kojs|<kgo0DnSd SŴe_uj-wY #T^>;jlCܢi£ϴ{4umW5f͓LAHj7繤Vo>WcOw4ȁȨ_<+:V~.7 טt/.[KFm[4]T)5~(s6Ur0{R R 9 $ԬVk E+oʋbNRqbA!wƮ?NL긓?x|Q1D6 &6p tKRR -'R*^O5,f-^|ׁGwN=KN7}7*`!?iW(O5ĕ'd.Je@#$&J@ߜ?a`!K J8xgq 뢧y]Y<| Y*Qdx)z+/>佇, x.qNɶ$X9#KF%$G"v:-jr=|ȱ >^+'1L$8^#{jd1Zæ&=jQ)!F00 R#YD)LjUN7zv gt:jğ&g1ƍ-=Lk{hL ݟz 5%lÌ{*eg %}lD^\'¿Y"8ei.$"\0Wk#QA\L`2^T!ud=%q= -qj ~ȞvHD4 mEn8I'r*@ggz!QS4T[ƆfjoWKȿԴI%DyjRya hR$#)}%xTu4ù\;m9UB'"I8s8kkGx_fdj~݃Bvҕ fR |{Q0Ս5:ͽYպ&WW@ǰ"z,+Ϋ SLeݭ]eI|Z;'C6  bGx$Ca ꚏ<I0~tEn&3z}?AZgekG~ͤ5z A]e*P/6H_G\)G` %]5 La,%E lDb1O(F!Ozbf!RN}٬e-C9n#>Q|M*WYZ&Tv.v᫲y݋'||k]~f؁UhVdrN/j. q@ r rf´RkZ/UO,Y)gͤyEXd g'˦{rU߱L {Ow\0Jy\]o֯잷 =/.G'oBYժHo bxѴ~ig.],R G_5c.Mk^- yqbq`aX/~uҘƛZ!/7Rge>_1. ّ%Ng'8kErE3f^j;T;&8 Ӈa}@3-Dx9EhD{:,FޯP8ZRE~KL5)Q>47FM?usCY8Pv VRӉׯZmyXt%qvy{ Гao 7Pb~ ށ ^.FP4C XraA=mt`b>.lhW#< OPC KuyKuKŗXL>'ik*EX*Ehr ew^jΆt]I*5SVl"[H*6R Rxؑp ѥ9yJAӛDd֎ _{EBw}A;TTŻGx0;Fȳ3Tc 跟*,%6UHWM'8ݤw,% ljb=jM[+^*]+( ,2տRݯ96i4d  aJ֏֟Xw_U zNwfh W)mݲQ~}{s÷b/ xBp3y^p#͑P`C-tcxXȍ2eBxNYk<\uM!Y;rK8>p~0Jv\CXӿYٓq:K^;v֯Ey`ç϶ rG]oVSva~W`r2U3ߓ /,3U>:/,!WE>VΟ|L -C b uu#э|G_C4ɉۏ 0qfQ.Ç]~kÁh]Þ''veoJB"!x#쨵çQz1%-QL)izx3dy Dj·ôwt4corړ?r/npN$&&ȕ`,¨l\3`FRd󱽗v).荠kqol?17v0\rѿw甿5qvŧ}h`񙽀eA_+-^N`΁O#9u;Z{\?|fcɒE" ]]^4-JXv±Ϗs^3p&ȈJ&utOg?J\=G/(:Yw:H@!N 2Z>Ʒ#/HޘlKw5(qi$SM9  =5Yp"TUk.Veޝt~;VEaWqa>~r;u%6cdwxʀΖ$" .WlK2wG[CJ@I͚8H];֑^ij@Qp%3L K ~Ha^Ô%==c5KZxRC JtE[e*Zؽ8rdHbneU0J= \ȻV6ouy2Rзa]$ Yq›4Cu:i_.A`v꾊BI{kyCs}LhD }*z=/csrb,b/#M%8~8 tHE7BxcsQWW IL3Es˾H^ ־h6$uwdKIOIJRdd\̦2D 8ZAFώO͋3jgp"!cNpYdDXgFNPϷi/7p&! ?ʔi֫mŹߩ"}4U>/絳Q}*QvVq|T q-[d7K+;iPDj[tM3xlZi;.lc0I-:^LW%xf^eڱz|=.[PӆC78W&$ Uxnw?p tv߉pojoG!b{g#)pc[BtW>#W?Ѽ8wkh4Z*ǮJNeLu1Gv;f°l$ߒ\8h0R@ 3 RjKht~q #P9!}ab7eq= @]~//XR6ETSw^[Z3C={^-ulm cB=B#.EM!_=:9:cuvq-.Ss-~ZQm[VrR~V eڇy+ R%Bã݌܉7"\넱Xa7PV%R߱:D%j8AqyR mXô+MpiOxC,}W3lVsF~8s|q0Ôv]o6޵ЭL)@A]a-7~B!v/AT}Y=Dsy+`P F#W-cfR 1Ł89;;CF27|0*d1qhKCst։x3.t#:S47`MQD|D [xs*fʕ̻.F8&ElĖs Դ<{4 \!EXҐL!^[o6.P1xtZE])=PiGa֝ ӒpQ-,'?Mf,@S \w>?vnH xG?篅)·ڴY̲%g[L?gB[1z_rS<5 O H[m_w9x0 %=BQ>Eǒp4L0S\Ԛ뵣sl\+zvC6X)+2:<:|w ̽+B':UP(b sGa`7ZwLnqFohY$xI8:}p2ߘIo`i}riϱ =>ʶ)[SglZ0k,˓H|w8&3}(ZaH!f% deN}6)\SZZ77E\ûF{i"w-kY"& ỵ. KlA( O e@4zsX-O/zDF}#y]?0%<OLWs z(f1Phy/~zxu`5doqESYqOp'X41P oCF?ՍApKJ6h~:F l FX6O_@,O ,= f ,g'$/jV F{-%<t }G> T$lz5Ta_~[6uhύxVkgv~Ljo/::5Zvz*ޣ5yQoQahYkB ;nT .Nz-<6N_'yڇB vzim;F.N.TVѺ5jyhz~CUwPǵlJʟܷvjnB[NiBE /޵PI $t:4-sڍś`~~T}фZ2CΊF kxVuAC9u.ZC7a0jTItJTW:_ =m಴pyZkc^mh4AFZsKo[[(aȡ茊Gѳwx18 3Q1>96.GZ^e$Npb)qMI +I#}Hc*ďV@‚7C:G R߳>ڋ+zg L;aE%]Nzʺz8C2kCa=҅7}\@mNU x9@(ء45f5v钐!|#8J9 K  Λv N$ 'P $!GPb& .O-WL{Aq\;}WWhhce+9 +R=" *:aFQw)28G8y3˓\ A,`rOrnKc ~[;CiOp^;w2PrnyiRT=P4m_Aל& Q~:lʲ3|ȻYJG ύzE q`tP<>*D?һU I.޴7[r,so > /NG4!=47 q;wyu,#voB ukIC:P<f⹽ Ͽ ;ٌQdC*1, Gu}> Ip' '!#]~.ȑ+@,V.*+q]4zz.gO|P.ybO( \ ڝLƳh eSĻh2tT5$pEШ+.!IeӥfBR׆RKwZz^만_@^h2_!`_oa^و 砡{, w ٯ}| I)˦i+e♌!7ۼǎų ItUB6q YIehgS3-zlp3,PGY-_\hGDQ/k*e[HAfش}pt0eq]R,V ۛhOh Fg']O+zn13Ej{3a}VLMwQ ba1煕\Zad+{˲5e;vv#S8&C:k\uҧOGeG2R:RA6Z$U=(,fqfF33fgf)Y9*f2r0I0V<[7Gs1 ~ceVfMy+ˏeX졭3=e B../ڭwR_ɵ,L؏2l#(3kjh-bfi.E+: |)۴@lE evR6JDN{ *Mi%]J~nZM`h[at7恭 d>\}I4F݋n%%SHaJ"eMho\&\ ecUbP62>@N.*!~B) Zdp F(T/gvxxđ vF)ة/o$R<3~|xݐBSAb!n c^J -m!#oZhGS`axqux4?M𕴰C튆TM58̒ߥ'D_DP*Ld_,P /+Ƞ2\B7ikX.^8hv[+vgݥ8fYKH=TpT@Ojz=!Zz)>{Cv [jva^4Z^V,Sɒ̒]qlTQQKc\[SFū FBX/*P_ x2^{P-]x%sm8}Y7|P5mn0Kٰ~HgU'|rYF^I\pyl_/Ns$n|~C#hHEUeCJ]gWBRMeJTɁ̢mq:Ыe=_.U5Dn* .~/;KkGkdwɱ.~8pM%XI1CrPW"%7]aCoX~SXqR mټkq7,صR&6^MaUh>=\Z3R՚z.d4iQ좊Lo0bE{]_xk߯!帟H^WcrEriM [mJѴ/$?!ÓLE#JqW03!B֚Ef Xa z  [a0sȰPO#Pq$Ւ|yyXŚ؃ll bF]+ T`K%$?Ϗ/nx˸3KG9t{ZAn!He/OPjxlcPաUXZ$BT/X>WJd@ mvv?h^cED qgT\"1n"7}iYLG 7b%IeÈˣW !''vr |FwohHiEr`CwHf s'[z 8%k h:77 0KUYlAxXŐDd0ty'HFōw79z~*틑y/X?qK:)u<ȹ:8"rAR;ܽM(|#eL]ȋ!V$"'(Kt(5>KJ&Dg 90 (I5T9B/[R״ʄ\DaPL`MW?9ၐin~fKSf'/:ˁk顖v3洆H |rBE`\C 9i_h=gh#kmA -Hx&cR8]' :) 5k1¸6~p5a9 z ~*̄L#Z^QG8M;m !|(d84+m:.#>d6Q18<9O@!]n o2rk&]j=Y,qɢt~lqa2f__knT_`C&0*a%z)9XҤ)}/kZe@$L SM,m+Cf}!<XqZ|by\LYÁ@GG 6tO%nIBAȍx*H1Ą`40'#Olᚡ̫`@¾0x^ƈUjԺbkiהZtxGB|^0|kO"q(ؖq"wxTъf_Xp܅YWk} JTD5k΀LQ.`WJ3Ļǁ'DCEIe˶"N2xN {cM^U5Z*rˌBf? Cl8$Ԟc7]o18& QvҶO( +H7$>3%\0]w2 dp|'s yB# Ц2F @LQ-ئ\Vb 6$$5yZbpy^p(q" 0m2hn vq&G؎fqѮ]gG-m{hY7"aN)muZW/ψ Yϕ$z[$~v:v]]8ˆ2h4ٺtOZ81|wުy&!ϸGBhI#>)/$e1?*GCϕb'_#ػ4ٸ8b\Ӛ±jg6'o7)@,I0˪ًeHr)9U/:xf>g1o118?'CVrPSH{2a\xM\(LvdzwydB>6l8}'H{y%M RANsPG8nq`iyrY"# WcSΌc#Um<UO IRu^L g+@[tJvˆOF|T0NywI"GRJl(ARw*NJ4 Ƙ'5=k*0Iy4Kpb0ʚG7qŧș u"zꣲ1.,6B/v~pUϕ\q/SgKz;\^woNZq^˴|)w ˛E 1#A 8Rri#4?bDs+2SF Z4v2;ȇPג4ENkګWvvbv6Dq٤[)7{2soO>zu5%!,vHz( e{hǶF, *j0= >nHH/#c{.HLXq(373X`M8*+ vyPSѾ`BLYYZd\~t\6.܋wwm =䯰^X[ՒV:D L@qR&{ /RX3 uժ`O EUNz+{y  iR˙9t73ؼ4Q~&G.с$ kB]r!~+Kix0% j+fw&E88Epq?}`cF( -[FS9.\~4kZ0;MܜS\3-SZ H9sJ(@s@Ŀ̿B"8D)!h>%O7Li n@zw4:kTy 6gF&x4mjo1vNTXj;!zn h<0V^t׮j<{pq Ob(RyJj?cψz(gZ<izy4َذʼnֆ-Z3.j*=O*Dvےp?SD󇉳ͭF7$1d B%Nn:tp; ^&̰Ұ:;EDR"f;׳?h]_q&E|y''ͦ'b>!(]\+dB56lqONN*/ UJy0/n\5)~c`{,4:BF|W:Yu^ ^C9Qhn7E2Pi¸_N/Wzujy- s!SK~.?%1<ݰ6?uץ| hJKO?YrL@GV !j3Pe~J']o2(,P`.lWRDH PIJi{x2l@No!|}UAj5ZX/+Vyj'h ^ ;ŧGatl+!a$n!OT}Gu4$b²#kQY^%rI^Aۉj[yy+ sT/i}rPbΩh \e'.G~,_I;m*pRe++nV6`MR8`!^j_\g5xצMnaWlU ;uh1!"L>"&çK w]x9<)hg',wDxa64L),r@FsU4&9?υqsHնKĠ,vD`s`-EJ ;|&_]j*,x bPgؔ79?jbPdqܨq[z|- a%-f{Iw%#n['wC$jhlv{]!GxJ@!#r;8PKqO(16=mؿovڥ7jPv/` $b(UA@rz_Bݩ0CѶ7Rl~WHQDRT{ VЙNxn` 2bcݣpGR7Z:pc4zSofOz%@Սw5*Dn%U[.Ѣ- $X*wqf0*k.QQuG\t48=wH7,^h70#/.z1SzC͔GVLJ::/ >^aPG&DuI I2Y!G.ٍtUfA}i1*Ϭ© Z=B~"#l29aTv'9 A ;i+f;:mf̶a5O-N% 9FipD pzCy]$ =PjLkZNÆ^ L3TA^atS2䌼d1lKi0/RUDU2d"2=B)~>pߟϩݓQݽ8+תhhJE1`&<؃4G*Lu'y@G<:|b D?ie]ѣR`̑U)|y=i}o@elQ5e(Ab]P!rǒfK_fĵ2u5 yP*: =j!uNZcڥr"cOFsT!y)M. (SFRĔ`Wu@0í*!ohy#/_B:c&0Iqّa5޻' :#?C ٩Jc/bbyiQmkw(ƿAFW)J6aJ2bv^_ ^;d9߿LH\4[  H59(~^Oɒ؉D.g¤ׯE^=}0S#Zs{M\;,;ȤHv}4yZMW ά]-U 1y2EeHKf)_lDa'Ah5mJgrϴi5:L) 2{edrѕe0\DÙ*|sT Cieav/=/o]dl̙נ՗;&}_ Kdf27:n<raW%*2 bEɠܱYǗ d#>Zk "δ$h .5HEP~i(iDw78 z={h g|C iIOYZguMt`bU~ A˜GZ[.YvW貞 g)])R@Y> pۚ#t i?QŒN׷\Yܑ%k("s zd9p< "H`=υe9ەlU]'bIm^4Jm8v9\KIȲUƹEn3Zv65xaߡ_x͏#Z**鼳*?w*s˕2`Y3)H,"lM)_! Zb&NȣZ^GҴ{1}w$PqAm3dwSbs)q$Lx0YL]D>uF[DZ98 )%7G#6Ɲ)aIqZ?GK,JL&ArňZꧧw[l_%1j-;SJw5a/.mXiqZ1Dړ#NNCpV[ NOU1u# *CM,̆̉\Ή0i5X1% xʄq=S“:7J#Q@]}ӬZ=ML%DžH'e@(v@I|${ xOhmN7/F Zc똆YgO?Ϧ&aIDxyNvO82B>)@ RTG.v&(0@Xf渄K-R@Qd`kǯ!|p|CgPL!wAnh.FH$ h!G}|1덺AA\ "! gà1T[gAC+ .'Ի}}lݧd/sZQyj扥OKiɧlqק_N;[ 6G4 ?#U~V∞vь''KH'y/~66H92&/[ҊWD=ahiK6q.ahXF4*`d%IL?e$r8Y'Z&,}QTiU62y@pXb:#c{EǝW7͘,2(nn8 x||-LqQ;Ѫ@ExBM(L LOb6a^nl-8oF]&nἹ>%Mh26t= :z=ZϿ J2fEJ&k0UM1B- ެ)&HvYRASDs<ͳ#&=]6kZˋ5fmj慥a>f=xO2D{fzm<6ʄUY˪6jy5AoAD+,z.`fm7d\@mlZ_u$7@^$񈁂S\HVV =RKIc/zcs!TG>@1!oJ0N?EO-9$%+y(B98 (> |ݐ 1x2" zqr|&1@  E1i_%&ŭKאNtaD^ռ iGB IHQPeqV Ok _@"qw}?ĵ7ݢ^S9銃[{ղI'j7Qψ dP o ~ane&X6J)+N"I=t ڨy n \' !W(7Gð0f^bo &RȗÉ+'|"'-|$'<" ?x*<ʃ)[ ,[.)BLJd5wp&pLw:F ToW2* ӹubAp3˟no =;0e%Xcc[V1-x?UeTyUKJcYmxeV+Y)9' naaB8,@:?k^~~\n1yr<ൡ r0yfۭEo _/k,N8auDqmؿn_'= GA8K݇z&^ha ut\0 o-A$t0p^wX `]u }xdD@H # O,hhz`h@ۓ?4yr͹(EP /fP(lq5(B>"USlo1_%7 7m .hfh* `)vXaUXWIIaU-yX{ 7xc`ѹ>l1-QhJfe]Ձ`vn-.KwA.o~'UJ{6Lr.}C ,Ӹ/[*0 5*`ښmXU׸ko&,'ShY2ĸ%!<#ٲX4єH }0|UW4Padv~x@7jVjKj>sD"m*sΦ.0HtJ4㫆 >($J* fMZdZojFm"Q`7F]&[/p~a_e AB&,檃R^Z/7?v*l[ҭ,c28[Sz`R|բHm)FQh5T+7SԉV;⢍1kf17etM]$)J#B8t|M{_ou@x)C FW˸GC,/.^$1^ %sZ9Y+9]M3Q`ueۉdA5'>s#W3^Anxߐx#z ql@Q0D2N2*Mf G-p">{`Yg$Cۻ!O̶\`\Z*Wx>W@绷A8Fv-fv5Zti0]p7 Ȉq,nİ_;LjjlFޝ-n:0d?#~_(&ϙJws6cOa!% ¯Ҭr*S6Κ)LXXFG]yX;-MO!^d0=xu0eV5 4#7Gk'ʾr_~42{>2顳?TeD7^1M5Ӯ̴Ҧ#YƻmAf[Ik\obx$,/)ɀa 9zԸ| MC g>O M׸HL}Iͅp(-;ͥE. z֒]{ք92t,6 O p#2[8<;fQ}blKf2HYP45h=ݵK,|6féo-m)} BlqӒ~2+[q31 B*JtOv0stYk47Z%T 1HΤ Rء8b1ʛv+Jx D liaItb!։e99ՐfJ[b)ЅF}9v 4. bK8^kh'%4ɥ1NgB닶`^RLRؤJGPi~ C9aڣh|* 1km(˦lH#^`vݡw b1EI3łf%ka5Bv_B!+N䀘K.Ceamf[f 6tP;&%ԙFf{JK iꒊ9[%% Xp7(,#eXf| jj V2b6I(ܢpߥ !r7z2tT+]0QZ-EiA\Er^ٻNUwqֹ~TvcE"!iݭkh掛?͋S?8;fqqNowqul\13K5.L<ۀg͈J {Qٌ&l7# CwzCHOYiB7ҬY.-8TNfp dyF95[ Mfu $YkI/Qƽ,[\@hǛ[[*{˥:W 2gd"Xt"Rjz=v`8Cӈ;!5UGMד g#jZy`[.<ďݻHKZfUH4+qSV2RFLl{5{)1%f}l27d5Cktu[-#;zi74ckX#G;Ҳe/tR>P6Əko>f+57/ƼuZ_yJ?s y}\,M{#ZQ;ٶr1B&$$zMTk?][5s=hQ~eƃKpRgKa%?P”~='56,BG֫-rD G dQJݭhj8hK-MKK_c-@t]y쟙Vr̰rj]ʋ(dC5 )&{ds1dsj2 [ҹMI[Q1 q X&)5zdEέP)J;͏\v>V'꛸Gp u"X*dKXDb )S;?1>7MF{$K`DXsD$^:Mdڳlo4Xm]tV5E+8 o8,V(icY?2"|`eBaፅelzeEFͧuidHIJyH.u,FrWp8r-/ "N7.hDhIw+\#_К]x?.~XFÔ%NYNV[>Vv1:/F)yz&n#f_nlO|H( %@x(: qc,vn2tsx=q Z~h F 8mmg)fFQA%<[FU3rEhD j`~o},JI(`tMv0r0q6e\"9۽A] `b;_xCR6q q9j%r %Γg5&R*so@alW$¬8+K^3~IfJf41+Hq6UV<"Ű^dE餠{Y[w5;Y"˹.C$EiGȽ}kGaU)A"Qzp#_h$3LwHAr 4sWMknU-B1փ"r4K/DQ*V^c9Qsg.&ȼ@FQ# Ѽ2{_kQ="qMfO^kb榀AKԍ~L/-_>G 'X ӅB `'ͺjf [7]XNАkM?i^L՛e|2ƣH+f^ZJSA"Q,\/397Iwec#5 ]E ϽN g/kdA sn*3=:Ȣ UhPEH8mhO< 7M˸SU\ *{xdP'-n/<}RWLRBbŐb (@KfBgғ@+V;EuJR*;Jc;P(/Mإs?-N YFlzG(8|UoW$!nxY#GhT !xZ$IC B=eCxl콘L9Z&u--Pd]ET"+4sRW&GD)\6FCePsC6)$wǿ>Ƌi^wǺZneڸ{6 @Sa?d9 }W|r#+0]t_'tZ%i2a=x)!ieA % "coBID@٬8rK%- 8{vWHG ҟ0Gu. ɶeD/-RZ"~`6)Z%HN)f9v׫m/XoՒcy>%(sKC Àz\ּf)L[91w~@dMh'[MY͊nXilVilZaf s52or6o{~YGL҉ +7ٰg VP|6RV@ރ䟤E=-uaOqp3->}Jeu$?F~FM=TUR)uT~7R<y*`T]~$x\{ũ>,o@b,w&HfHGeHJD(Ӷeܺ86Yû"~S0(=tZ7HßPeU>~l֧~-Mi?Y?msJ}q}Ci}W/Hٓ/#qn~[a@jgߋ˿uߴK1o'x雥bVmlڳ+U^FUrGMթv跥 V`CnHTƄ0`v8~Vg>@aFW{[慟zb>b}{?n7ጉ])nNX4]OFnǮ:nr* BmlAsXJru2(YKKL.n(Tӄ]ɤ`F^B`~Hp{PZ-5BꟖ̏lzdLUG=SUG2UTTJTVHQ9Gz#e VSxVўd YE>sYYI{=u-,g\`Edhd%K{&]rge8qG4,4^iTC{XR- j2HMfE{L=T[Pde5Y\ɶP>GjˣɏL[47zXêP-w" ꡪTTTC+TaU{**CUQHTEԼXQ"<ܻ7 Iy^G h^4ɕSqpDRK2msp)B.Ulw e(jwڙ'6a!  eղך/nNu~yeRe H~8?ЃkWM |X6CvJ̓?柔̥. ]5=Df9qc'~ŷݾY;+~ɫ*^hcWXREMG҆BU_dDO+be R#w'鿕oo~c?g:'G%w-yU*;Ytt(c_yC#3`N˨W% =,`[}Z! nq>^'^B>U,Ie]7Fv?˪@lw:mr;i _Y&#T]視$Fj__?yYvq$$XF muCel_LdgфY mT֕D[lԴoFWUb{W ISڠS2Kkk&mR3+LLiLMgM`M*[%/@ ZMm~0c {ufɛJ(yY%oG?sj}SB)}o1h?C5 j!z4_ONjkDYY33gf-ЋS X;0ӯLa|`֑vv V?B0l#B1-B\#?$^_~1BK~{+Tk;s_k698Kj^X +&5SKupƤ 1ˤ:mG=XK=KJa b!oV托/F̗;Dݟ.jQv[=s=}ɩV`s& hޥΣˊ]NdFq }^;?F7- l[%cJB4aeuMe["}%(LN"izR;PP]vݖzOOK?x))7g%XKOϯXU*NRvJr,k;W{7b[./Dz6ڲW2jv Oɒ?OhqV;*(+B> Oh'` =ǢQFX^ѯ:ݒAz}%gW= VgA(S|[5 jBӈ;فS{E?%"M[u[ã{6 iC䡿j8~ڭvt.[8MwQב4,6EˀgMGk׬lV4kw 4T,q+hť TdYI~4i[WNJ(Ed-4ۭ;՗k|'KѻNLj{rQɋHgEv0GHbonUqAؼlH +S>Sl"?}56O5ݠu]!נ\b?%/ϱ _icSmXrgŎQ--WҪtf~g?X/T9ˣ,ur*V 2VOZd@`$]3]iD VXX2J@|7~YfnBFzr+hUJI9ZPS)2I(VX#.%[ZRdHY V3i)Kj/4is /8]1^-1nf~wY:eE34׽,ef02, EIou㠰y*[O^ǑNWs:Ak8rhN\&2 , "ˬd.3Bc .JQzn\l!y|&VZ %c,BBņD22Wh&eRrY!auXhJr4 |5o%I1C[*V})3ev^)VnVJkbD>8W|H=⯔d# B7y;;_xCQ?`^Nq m>s\w(Ɯ'y:Ʃd4 vVRX̠\a%e>Se2$g'Cj7]64I,Chd½Pkjf(3L1jDf"`q#{z-зjWguԳxJ;6`~ټ8/`T2V ,=yY)eIO}R7&fK}lJϔT;`MR;{[k>[vٲ#WWJYlYY}o92dJ}"nklu:]Ԁd[ $]3$7Zu<'qW'{b4[,{K})a)*e[{-ޡ܆ (w_P2-iT+>鯿ZVp 1"Ƅ끓֦5&# INed4_'Ls2+dW0=oE[R%DYֲ 5YSYr6ꕑRwMV r>&uTPZ%_aZD PVtRR\BB2t%|ڑ01՝QbW*;n& 8'c|ܫ^:>|aۖgVufɲUv6$Y,3K HG*e:>']gjoƤL:><#Q^p)2;t=忬< H9(h̤|UmU?bi1Q, n<}( ]o] % b@E+VG;N\mW)V,Ӯ=گZ+*i_u?4S:΀~2$UA{@p䅃S/G\sC?c@(Q'in <I Yznw@P/0, O { R*^NX-USƃoN?44Aqpju :)$h|,`u{N>#EQpI=r `GY"s?R1^=V?5><! cuGT4 af"`0jX?%7ۅok~y~yc8g1R_ F=R1{X]HPkݷ7os*M% R<>$OBh@KIQc)^\wK~RQ,Qݯv{%R<$G_*7N:<*{IGF'qzJWYI % `@mEm5Y,/ݞ7 ew5cögW,U)+^)hh?ߴ'G}]KNM%Sz J ?h%WgJ\)$4ag@TN5VB*3+'Ctu+Yk^ oO/5M?qxW*U~̎界NW6o^Sm,?TT_96:<K_Zq8~?G$"Lp)f#n w_ε*; D w_[#71 a׈݌|Yޛ{؉3滋_ܗ[7⿢!qeG*<^LeEƈ?;,@ HD$OM:/jX6P׊-0,݂d˱`5V",-AyxMBxuawx}ISs5MnHоJR/_U^K5zapXz|Xecx՞p+?;N%v>%`)? ZY:Fsݱ+OB=B[~ȱ=x8ϭ?L&Kٹkh{b: .\u@ HU}</JuPzZlE>Ucf9`6 8g ѳurau xvk rMڃ!ɔHL<kƜFV'SmNZGnm#tmW [MOd+UƂok7e!qv7LJ> `_̜Yb.]%Kgg$!g|qj``,|Rb<Sl?mS!pu09=i9hPȰlQN/D} [&(jrTĘrn+jE`ꧭWjC1z ?nxeݝbiVr]^$^iAd~z6\8B\ot[^@ޜ@ vY8v&.o^f8qꚉ @)txW߄lک:]nu"}M4ʩ^• 8rgaUЙ ŲAaW.XHwp ŝŵ$+RXJNdة;6O@,X*{B5 .|ZSk#ZK ޟYPo.'y?D{J)V>X6Eo=kXXUڧ9ڍzf4:l ẘx7n _L?Nk4a>HT0(gW|=Oa|꺿[XuJێJ \&%B{d^̍S$Fܣb]O'ݟ/q?ܟş!JކTH ^I⴦`9b'`n9sA$'!R t` 򬫯ϵ3+V.#Rxs]_, 4A-޶tODđ\2J J֛r,mJ!Ȱqm%w=9L2i"Ƶ598p9=l oMA8L!}j3FTiv1IRX  91kq3ar^`q#yҘbB9%‡ BF%9S-BdOOBHZkgV}JgFd{ߦcSPPh(z3МϢ?+ ?DJ16'eeu]}K aJ @ f1ȧg0V#ě:[/[zYJc/bmz2}*Fk# G9=5Fkx'b>?>.PLŀA ldd )5ƿ,!);,N‰hKsFsC@aQ^vQ[u?(P;pnۨL SoJh  &.x@m-. +7;?^cIEo٩S3$8"X #NSAy5䀚MYnLi{r>ބ24N"iciP'eD;z=!d_W6)g)R?c?Jcыdț;h@e``Y&^HZcDoS1e_ ?B )yqοܱ/r!nbw-~aBҌKPg3ie"}xc/aEDZz[qZ+HR5qqEXH4rO(P`hN-XuPC*](p|jVv!C"@'J:ۍ,WEiaG|ڌ;HG{ r~`릲Ui2`Q o>hRL*9}F|Sjrt,g7:Ym"dUr0ތw%Ds/groSqJBE&5}!QV(JbKh[s.qa`:-qa>saك^.س]s(-TN-(8%X晨&pB7 U&R_:$v%|k$Fw"IfppUS%Ctb7RBYe,x,c> `ՖN dy6 FNUpTA aV$(t5̑U(EYg5TR^Iw&Z@)%@HG^Z{EdW/8&Vҷgv;qކmwvzE"՞^vۦU{>y:=EJv8i"p ^pVJ\弋 t?dgօMX#Q?EvQ()/_s>e/dR{qf-yE/X0L-6{Ӥm$iA[`_FBTbfa|oVk5,"1ǰ Pz*O* 4 D`_'1jYZɦTạ.phaoO1$8C@ChjKh8{^ Bݕ%dxhoZV{bu.q OT ;LP63qY.⿿v'\Qh`p@OiZ}ƣ4e?P*$qЮ1b!ᵒ:s{,~4$*Hԅ1OgIzb_oD`,t8 #BJ*=@O!`ƽYh^A)WvdE_"<),;m!}bG :n#F9l9ni$?y8UshB`W~ߨڠX,jR\k;CKo^9 @a h\~n%BUvcv2*'DQ̌㠷Qf8kZbodZdK F~@cn,Y) C@r UdKAĜ;2), M"B(C`e Y'iuf/|Ц7cMAjvo| /.a0XЉ%L)JG6ʹvؿ^}>OHںwB%~i`iRi II|-E fjNDzo=nv7_.Kr2 eQU=2To rsWv65h~Drdz;\$J$l.($CGgez&:|׈y1+LŎ-Ϲ|.&%";8PVC֛4omj MPC[g{du]R+.k|ʲP ]"p//oqe8ʹۭu ,Z2bnݦh% lB昕6}D 3[%ZkڧDM. Qe)H^s'[^]]6Ttj @*̓"Pݛr9Ugڂ/?'w\TZ%+IKrCyNТdZfH8ESbΦ4 &P,= Me]b4A,ociFh7+*r*6%8є6!""PFIL-;@BVj@"E&eVgEB*#x %񹰈3t rAe)1ߧY;>D1(zW VGJi~m-'a/7`2Hvl#gFQ(,K2_S(Q*֬Je~R&-lE׺U l^ES~xG7P 2hB&I]4-Pij"1t1ktVo)t P6Lk _ɠÔ>?^pۓجYrizkzժ:p<lo>1U]7r .pУM $tېRBd)TMO 1OIinGcaQi ^Qkӡ9\qFOyQ0Hl,BsIoBW!@ڷH-캦\X9T񴜁e'N6Sn(i矿p EE!zraRYp*692*9dXHpG6z U>v=W-+PxӸ&<܊Mlugna;ϯ _V=a!tƇMe_|plS B:DXK1Wg64m#99ULt:DpN8K׫H.eN2ҔlH^Kfgb .v;dPqin^9dB.t[w*x"iQAQÒRp6|0_qm&>3 }tjk^tFe dL"ڃ=㐂ؘRM(q%JbFxX66Rt#':K=քsh7.߰|.JV_;h5~WWJ2P9&~_Fv:Ժ+X7'EnCknםOqb uK^BD˶4i׿?=.~7%Ί#qnt~KJBʭ0w^3T؉/cyKp29;M$l~ߜA6@n ޯH} =0JD 2E D E rD rE D EP-dt 2xP=Dxy6AlłzACalXZ{[e &@:«׼:H<$@4AlvINQc U@q?0*4$PIE4L>eỦ+wk@g!jo1 ?1/眲:>MFvm'xEm F`Fu !fe-Y-϶MO5\Ed?[A۹h,BvF:cI&G+l9Y,dI:'rE(EBŴ m3GjǘT;GQ+"kbuy:zt䇘GZm0@)ZIbqF䣙'>zMqcumZTGN3$S!WJ;%6^j@*!54h1hͬ(-.NPz^&j z\tv%tsM|۹(ì%̝䳠 e;XI w~V"BV?u@aUtcaN b?~/OK{B+4]G&z GS7OM#S#+ӋQ@jQ5QjM :*lk1<-,0j[ y!bqO"t_3Mb`~.䭗. .eklۼ8l<#l$⚧P6g|mq݄ &ŹUoEp6dIXg\= G\ E8E9_ܻ6Of_uܱ#> ]Bj S=U os't*m\;eo3_q [b[&8 2_3.lCqdBnό|ܼ5p+Q }lD):CenYxJyJ>t]j]a#ti#.ټc3Cזd4|| _O!i eQ-#ERߏ) i7T`)rOQd勉-Hi8!oJfM)a*̩)i)43[^{W)׷Hܪ=)&`+ApxzܤS$=5۶Ib!Il i+Sn&fnѢtmNv3_u.cs רp*4-Yjlg3_ ?gWyp~Hpg jp;[4s$ 8G Z2+ۆлyȱo[goxOδa竗zcZ rbqrM&9H7QNE lNE?51"O̼:$+*ؾTOS, ֳwh 7trh;ĕK~>ߢ(c=NǎUiP.~Eh))vLsN$?ccF%!1pm;SD;mM 3cސd'yy!44@NJARfSҾuh%z׿ZMkd֛?uü?"h"-|qrMl7 N@7PXք)lJzq3lݬl<=A<Ф>En"LQПc`2RL2%2/N.vRJ4y*|u>I=`&[.[V-/(@DKxxde/7o%`Uu=ObQu<إgf6L 0юٗ'7stPs8:(BkqyD.3qG|~!聥#z&iO#n&Sj2xK˽G< 2#k4uCdK Sg "uE6 HPwDF KHl?mJ{B8s>%y?ہPO{Zٙ)1P2u!h(L\f ґە#n\̪SJئ5KW)b,)PN v,&c_ ZP(e=L IMGIPxE_wgen-]͏l&10DQ l!'XhBV>~˰W˱h4 ~Ŕ~clTEқ `:qr?1oXeieMDǔ_Ɨ''h7d+Ѐhy2K\ߍWwʯ# $x2Igmj#WT]6=!!0 9d7gkʏ1=dfiFžVJGӒZ-j=+ (q|6ebLjp󦷁\*;96rw'˿hZLBqJw\4[RnT+hCtvS/:Zpb↡/ɞxAE{w 8 zrDlSz- p=BQě9<^@XR8hqeKq$L תaqv9JQ KlaQ)ʶ qrzw//+| 4 "GoQ#Js{[IbSZm鈁8A%1X|;=;|:SGl, lB?dΝ<i"1x n\D-*+#Jp6hݛbӿ=;6Zfϩ+njjJ{nV_V+aXE&sH2~gwż=, &E)*jN$Wۡ{DN%GЎݱVJAu*/ `8;xeO0I'O髩$' , U z/W(~= #$ 0]D~st ,Bt> P oUl8pm6?tP-$]V';pQmn2?xp5VL2W(:Bލ%.Hc-RZj6 #NX͑bL̨ʲNdk6xT0^FHtD?vLeuQj؅Jy$raHCrOKƹR?D³Q@Cef[aet{+-5TǨ}qq$m@қI`JM+֩qΈM W3(~4 M |J6Ν9 =WQ()QOfYoj<>iq[w'7lA `dEݿ y 5<erhݯ 4a%L2 U70v8L4!fga_yd\K-z5iH#f \Z`ˑh>t <ڈۈY;> ϟǧQ5HawJx%wXj}*7n?poY* ۫zVt2qE`6bc}:̺~ &S™tӽ`0R[\iϪUg7Iےu1(n^S:6:@^];|E^HQѫ(] ,~XOf:qW1Oam@['=ݗy!QLyٕ8&i;BJШٻz w:1 p]\'J>7$zK}V9c%.p9!=jس=BoV[\=hÂVtdEXC9 `vi0⟢"vDucchk໶/6 \nWcR #arP>kCh+VԹ3*x *l֑}zf4 /ia9(07Q9D`Xͬ_1!䕊?|PŌ8VZ[$Ta1Y6~([ DRg&[Œԩ}f.ހolRVť񐞫EWVrHWlw=vƃ-) wg\`z=hoN9 "4pK8OQmdj˻Eu捐Ē#Nԧ_3W?>2.燸eEQSť7\ . ݋{C3U ȹIӢ61_U(+NFUxRg?җVː@yd!hM.yl[W4<[f8&|"QG.Ц7+9᫕J /ӑwkSy"GRN6X$Ql o(=5֒/S 61t.f83Eys4rT-r]P)ig4 +d5T*qhl:oT<95[UHTs%}JqzTýΞda9$j==?Qٴ\3/Euev.L e I<:o71ƕ _j8$X fEY7(w.7?R1Q#o?9>9? B0ފÃ={wk8o,7 hn1F:ǧqG32rtZ yP]!]E#1.bH>0{70[pܩ̬Y~ܳ1hDF6\ jJ"[Uةb< :^ϊԱ۝}LOƒ||CyTFoEgVc[ց9@:$#4AQ-,gCP8*'ڒRMTr`^EoFdz!3 ٯ 8A'aM͐<% \>+y""Gŷcċ ߆62/;P?\NQ0U\1 ٕ5%Ugu,6J"?SNkCBZ2*mݛ[zV;ۡ g4yC۶)ԍj4E̸k(xB$,AQ+~廡pE(%G/R@?#6|0'pPxE=[a%c {jݡB6)*U\$I:pDyXxL 6{2o9J\^^X҅+uM"Y5ɛ2`^9Wp7Akؾ8C>]hYM>J u &Ҽc0Sj~mZ]nN.!bֶCM[%PN$:W*۵b%T(348teEڒ^6-P" !׻¨E-v~tdTDxRyyލ6r\+~j F_Q˝ʴPZH2uk)6]9ϤDjT ;%w{;"wQ.b0JW@(3GTQ ^WQЫgZb; @(g@Ěa40 bT2 b-1ķWsv;Cb ;\vd= XMM/VU> ]00XBQeՍX0l]A#Swx loOG[kp|D*@ ]}86ޛwW,&RGd?GN1*M90Gqw*ɨ|6vʿ ~~l4hPu?Ue@j6f.uݱe_={m#;?77%w* ' hJG!(~ͭbQ0ZKdWPm࣌kQ[>l(m>-oP ҠsDqDq8$kul稴:x/[ksiʳ wEkQup),] tv0w{k( _w:D.Bz~n B@]Χi+ҵ4şqRcHGoڛ!"KbF\@.4Bpy&b֖@ ۫VpʭvbvV䑇 "vw >Ț+a O5Ofyz#F6u\Wq ڼ|{SC{N>BV|.ҹǩ>9/!W7qu98<9o4̈\m]™BI>z5/OhV#&j9!eɄ_$3 <-(22 3= Bf7dRw2$8nq>t8~ED]Njn2fu(Ƌ z(@$!Ts p"o,9, g Ond6f,?68$ (=uq-;~a|MT(ޯ){nvpb:Mv"6[x ^l7rٸ.U}f'pk4D^3ŒpEwZ$~펹#<nryՀ"EM&!(q,󒼥X6wRWDbmEC 82OZ!ҙrH@Za5 j LQިoJCзkcJPEmL~'&>u=oAќN\qey ( yyqKtc6 1Y|$,pkFfx%lD:(4YG]A?aAP"T^CEOeYQB*q,^ʄe9$E p(:ٷIрhQ.Q] e20 c+"Iw)fۮ^ ʔ6gNФQbXz"WeK[鼻|\[%Il(Q~AmQ1LOC"3۰7.&}{S<\(a|aKCwe\o\Fj}hXr2'$_@ mvYHbGkF2M&ɓ@KUF Ln =W!4vnk6,ron*t/1EPbo0d"ZDGŲ3YxcIx!醰xlowoJ'/,q0c3alA epٕN)VQ?XWp峗UqXρLABxpP] MB@ Q}"mPd#x*RSg]P0* `:ߴP~9`:]%t%{t(8倂n0] .o,ONVB@{·SgXtl/at"W 9srWX'dmQ Vfrpq;D|r% Nr1j1d:a!J l3i{ĕ61&9!b lƉƣ$dec@dFSMm%SMObLl6ƜrQ LLqZ h>T@۩ĢrhGn)]Ӥ䞛Z0C]:TpK&9ۂqhZy"mbѶ gZ[VC}a聛$=8=Աw7UutfsFT ܗ[*pHe1w.,tqUs ֢+V9*pWzcpU,ϼjS9-~@BCQ7,1 96 ZftpED[Gd1H|!cZaa0* , yQհ(g,#- jjI1 =z[v^nۛ:ȴ \qWl:bөNt*R+Yx* ,yhQA6 w]yD^Z&WoUј Ǚ%Ix#}c"Ji8^oyᄡll,qN*t6d5•g}VR V˳ݦj+ !) C~NV0_ S˴a Ɠp/YgʗJL1뢢#JP A/P!cp4vɅn<`:"٫ZfB@] j |k drygaƣ' -yMAJž`k4 :{WeHIQW}=-"̏foNPMG۾X}ՏNt,ul I$׮JbFy#ԋV%N5?vr}9oͽã*Y;(Iv&Aعʣ~Q̯McǷAu~G.ǝi/(f2oO:5_;=2-vcxς)r:ϋʾ_MnU:=~躗ׯw1 k9^ߪ;\ZU7=k&1r9Pt}2sNpvTVY֛~ (npf55dZw< ϟK*0).@g_ b*v4wzAg pL<(C\^mt[yi ^> , yȦ B 5kfEߤ>5_0t]D3&6[+&6"}8Qn|,Ev, T]Y:v YaoO*3jͣΦt0j>\߳ߪۖȽ?6W< n& ~mH"]dm6$//X;G~S[̦5.jWvٙ]Woڻlv=+ŌgZؽ{l>PooosfVT*]x" +L:wF~&K$ άӭ| \4X vn?ڇ >_<>z;v1<\˪5v1~NO.AMe%~.>ONuo*F(> fR\-l0S/67_ϫqlq peJ)!\[ܭqsX5dOg;O/OxgGwIBp$9)~[ہ+,.7֓/.޽p\-xw3N!k={zceV{Y8 }W}[`< FP}\ݮ?#6<\ce<9>a/u1zĈf7{Q{>EI>%unB``7 Ie=Z8ht:r -!9aVDyn؈/ĬQDq^]M t>^g]֛qbg Bؒ(婊FƝ[2ϼI}$ٽ䜿=u2xKNOk4M$-HV(?[~B]/v> nf \ju4@J8d˲ Yf"sofM7s0 Ƶl_e_0>J?Zy^mI~|Zɧz6ZP4g'|{<`.C6緝iņn8#V.٫U8 C#bZۼ7a}-ȏOCn_oJe0=7_m֦ nHo|L}ux:zȆP9U L]ΔU`*0}ήSQ1hl-Ege۽۝ל0 >mcƕ BڴY 4$\ }c9Iygf$GIfo}53F#H3w(>{@rHřEryi]9:9:o)uHgP#Q5Ccjr>k_|u,,z.ʙRk I][V Y(^u9i|y3+LLق~ {CY3֩Ok'M5JLN uWO.q73)F K74W˵f67EF<RNLS1eFRF7xK!VNRcs\R "0BIE] smwؕ^AXi;' +5j:`yhq߿h5HctݠP/D2G_;;#ꐝ 9^2`-SuɋF^^Ƽ1߷7ek!^aϝ/.K -.|N+{+Eَ/ з7qzN !yɆ%\rq Z.x↡c/J|znXwY}xyLX|s\{Ξ !XB :T>| PpBxc` /]ODmctX?H9cFƎN߹,fZJ&MVq31Rp៦nq@2>N[oc$x䖁I[`d\^F_Yos' A#H*:]h(pwCx:Nv#UH3ݘ37)p3`c+2B31aڕfNpϳ v:4 Y?Ie9ܒ  AI${R@"TbB ',}ė KBlCwcMcX;y/$k/`Qop  aDLVM̀-3re߻ÌU^gc8Ke)lK: &*1J 5^ d/BԁeMXJ8a`syܥKyV[7[ȚQW_ Y~D܆;VA>lPyJ ccbޥ|ϝ)n![%ϝ?;bji :ҠufRΏ\r(j2U1In(S.z=;:9*.Mw49݂trt PtVyߢԙ _FU*CYj\W˯ʯ_KM/KR)-3K&B'u:ÿ&11pk v6"jwɕSΚgkù@V\E?kpWah Mo|g~ȼ;O/n esa i[|g`d+RAΞso#g;\k='+lOZ'ɂqMc-_|Llswmtji2L c:!e#}֕}?JECH>"àkv?Q6jͶr;GNhBu2]ykI<鄍4Og7Wzur\sq)r c9 ?O?e0\aA:T < ]nDt{Y{YBo^›o>|‹s"rF{y**v_C=)%I<>sz?[BO*#/c磶cY.ZM&\ē hPT2xhImՉV216&d&p(FW9l($hy &8߂HOkMiWyZ#XdoH *b`qR!O6鳫KU9˥G>{$;F?qw'OLޝpg{j9Z<I`8غCHbk3m쭞6F;`KZKzÖ1^X94nTU9Z!ZoNO\|2lO(u@T%!Dy<4TG \ۚ]6QbU{f`y9'ruݳj lveZ 0pق31\z]lA.R#< gh".D 8Cc-od(WCFk߰#v#%A,(f_.x_6֖ZNȹW ٜ%wDΑ,w)˾:w]® 8CTV]׀:\-Y_P7AԂ p& ;&4̥0~-65"5aԒLX;Az@Ʈ|ƌIRM>VVB]$E1)}MŮ8^hUL2"L,G5h8,j4{QE&RR^KU_ /k󍽴=VhuD%&\P}T5^MxF0l_ר|c*]ل% x+vMhxئFŅŔwB3Y$8D?5RxJP)Ͳ'~ $}2u4.Κ|x _p:%/o!/sQ-䋜|q_(%N%Ijm`/YxyYQA^'6[ӘN7 IIoEA|c1F`7X+ C\غݢe9`x53ҡ SlGJzA-P61qc; F`m79 t`Ztp=}잫nOsލ PA+Q\mCw$hn*(\5;tP1I8H*ؼ^>JَؔdK*J (U@cR@d=$D[Q,} ' VIo^oxK,pяHo⻸iS\\48932a+5 P6Ds-WoHd dlYБEoW#rn:f KT0L2+lX@QHDB=$D{HDi ԫf:!`t9eh9WO1BXrP(6̛<3G`0?  Ao07P̬OU[b{ & E-#~Pqp?*E0 :#DS'3yRT}"vĮmup'ZʫTчӁ [lsUE/:7[T*O>s/T+r"|{뿏䉍;ĵl]_^w@HOU< ?ZYSTk,phn>媒t٤]czJUB2]gg>l>d#opd xqd2_?,O{k CK?J(1Og5< WD {}sj0staW@*͆994&+._N[9|ig'fL,U]bp u&$ck蘡`i~x2Y9L梶N:*Iދua I>,Fy??ウs t7!aň%Dw5(<.JCmk&w7Y_nO+J^O&Vn`X0[0Ȕ Lb ܯÁ=K8,-KYTdXsNy )bVaɲi-8ٔ93g%.l tex1|.)})R:+V}1Vp9 j_kuF8`^x`ڎzV(y au؜؇byLg3s$ۋLT -yWh~8 *8x`NLw,;xa3U Y cz<0gVC)p^).Śxjn1\W|&JvX+Zźmj;eL%|M"Qj5ZۡQ $ 4fHR}`*?*]N@cd:mMhr8kOz%!q,j`Am9nTC4t/&hY3!g*43AH!Ǚ+r^Qè\J&G<̵F6gBe5::s,/@ $B2<^TkT5^P 1~kλp]IGA5s\kbx,rpy)QidGIO*pXZ^6V~S~!wJgy4WZ * S I@^Pv3ޤ؋av+^(vE?PMg'; ;]hߜ'Kz\4`.{רed^\ʳoL#7j &.oN`pW K6 wcW>06i/Ih4fFT% !>D↓{z `YIr?V[#r5@t3nR~\ c^UtV" \dxńt)b,`419ipxϾtLܢnYWm"櫫7d۝?/i4ef)nJp ԟ6H*hv 3Fbe<ўuMO8q&93TVHpgo|[e6.f9Xx{G| R]/h yaym#|i9x=B: a5^nT@ɃQ JGsgs[9m#Y&C*E6wZEǹ%vAJ#DEue$!H8D=d޸ȭcT{?k=wʸ6l#]W쟻ϰB?ewƂm˥17/K!S48Gde? LK!](_V\._g}g׳3=K=س|d(/CԻ+!oGyLi]Lj$̙83bd&}[Hszb[8)~}ߧC~h1,tȟ#w[ j`L}9> $Ӄm 3fT>SU,cŻY ཽ=4F>/#*LDғ0dBWS4-,U ҃NG$kCqC'˔ IyIC&A{h(҃EQ6ᚲt:At:xɩ4@47Ѱg\VkdNX) g3q9&ֆ iwf5"88ߺ,>,1{>*&yK=W-`ޚ%e)Hȭ'>E~6a.nK9 ']dQ_tc_鬁r?i/1ӜXOnjgb;EG Jp\_7t (25wO5C qyoGC{Ba '3lixٽc?c(?E3)M7|.Ga95iP? -8d#,8 VAGҖ9A|3C"hti/A5 IY)ިݬ[ r$tygb}X~yLCt,/2$z[j~[>pV=T7HU`^;d V݆cZGo>_Aiv܍F(k1*NUit=i#?3$)9mHA E=Gz=aRTΨC뺙(TLlkt޶TЛIdd(*QQ$NzswEnsk21G<+(n8c$%VOؠ| eQ `mAm}nmfj CFu+\P]8zPz|vR#{ 8. ^FJ vOE:`=X>ȍ+Hm Cd Jr92iznz\L0o%#0?gK*5^z'A F_ODf$lHZTs´ bPd6N|ҟ0P 5pش"TNgψ?%M2$ûvgl~=w"wտ=VX;GY0p s<{1 [X#N ~l}6ٸ&Yd(8 d wf`4J 5*/nZWRb=ϴ&tf%\Ďg.3 DY٦?̋IWAp^M!K?dYh "E+Bhln~g"DJገ!m/ފۺhf7!h~.Y~ONrOPcN1?4k:Od(yxWnٹudAczY8(xXŴH6./_8R)lj 1f7'ѿ_GkW Ҿh6܊z %{ ۺ̯-#l] UEDuw {w.饯җj,ljCGG!"|]89֦}28̯ /whj~z?s5t5>POm،h6C|#sB՟"%b+z/>mMyk||}+&?}O8i_fkc]CD Ԛ&pY W6wO oLu6`vWX /4E0LCmjHc> (8>׀޿:ŻnvV\0-y:q?ܭ]]wn&/w'`3X_ňGą=p3oM"TsGVThKåc=FG{[p>@a ֲ_,4nlMq 5){rXsQ=ЍYSHm=<PC/@=98 <m& lTmo@r0ϑwwցD\۰#6=n>F@],-dVkoD$LԤ!fHWx)Q bfj P&{?QV0=Ӊ㭭&x֖@^er`om0M_Zd߿l?6F%}R)Xzɼh^J]E5{ޕĻO3IgP"ɇ pmf4LQޛxoR0ׯ$Zr빈7'B/*tTCԽ6fziV MMfOKixyfAʬ!!%ȏd8a ww8UwLD`eEnv\r8āӥ-%QCj#\ᏻ[saLqC5?pP=E"/&= ;/ɮh5צ'8\a2yA8 ^b2yT^s4.|(ޏWW\b xh o˷d[6!3T!Ex4IG(|!Ҳ7͑rJ1| sSz+ wܿwsH=ZJ)7}0UkzQ}yezjJIWWW֛_zzA }S'^n0-W< EgSztD:>9Zth?%d<|_voP5>ߌ,ͫ>ax#ccH r>Egs>;ˣ(yk|r2R>՝u[׸kGmN`ܾܾp賁_vG|1$}φ_~O7̀W)*OWHl]/ 8wφֿr[R0GRxZ_e\sǓgC_"^oe=ƇJqXN#t//~HkPg6PM=(f6iPMZ6WPUQ CVK FB34BK &Z~LgׁaPJ[#4bbQ4)BA@Wa*P0P:Ar(h(J%4lbvMl }h{ Y7-ɗ͟Z(@Q>-9cFSt(e4h&K=~]?m̏BsGz`2AE+]6*ͤ+ ~5I-ؼ |fюgZ9^`3c\^8~Ӹlw e'/[[K0!5T~iQ/SA~~.ޚ|^' |(<`uDa22VH㓩s+^dA]YX֭Zܐf/:@v9 ]l\>Q/3*{٩Bq6ԗ"}:=%jXMY- RWx n} |{ w|{+8j#=OzoRr^B n ;+B{[RV,𔻧 7^qEO@" Py}Eg?w-{tzt2{`qfhͨo {1G~wt+;?_I4?8g_rw_ N)Of}(QUO0šRCPBܜ'Fpy"LO'<9c]!J7iԦrCaʍah>'cڈ?cBƛ6F$J])styxͱ㙖&"`lڶp!n"~R@ދMGZ /ڠD ߴuYKG`dEv7|(XG=a ts[ X[ UEګd13.&fz`35H4fyjwm7[ ~ ~Kdž=#CqLAQ zԑD0V-#- -Մm O  /d_Y|?~UO__',Ck'?#K7ã|X[0^̞ÙS0@ 5tann F)$Bu<~=w5 Ķ'upk vNA£S?؃Ӊ UCzÁ*~ncQ7xd}~]q#q%hd܇`b sQ~Ԡq> ƟE,`GavDv?8=n?]#" j0:bKv~rB=M6?IsB|Qj:@8J,_REZgzyי mu R_(k|me$ϗ77L l6wS`4`UR̭5yM/ǯbٿtzóSoqa-%xdogkG[7|G O!Evlr#I`10Ak|`|ܱU5" 7yC sۈ^YOk|X/1e$R0k{8B^'kA47(\8x/uf>fͱ3iz9h.d(MZ`]@k/o wL//g_qjCX8ux}NR:iu~nuΚ6y}~I|I\\]^9BoR f߽Xf#=.( MϜ!~G4s &NZNm~ժj\ٷ: ^*{6bd4{懏,KW7p|57doo|mi}#B=Yo`3O6R}Qxr x|Ҽ^mBU2&C|n>;T\o4Uxwp A'3jǬY؞!:^/#|Ή4m6Wc13+&;=N~S' !ȾtywN|fԜ*3 ɾNK4x$)0! [t]iwd$M6[L${f9a􌪹 S ƮguAaM@]TtrEggwevl/"ɓ s)o!_w=LǓ96^k cOJ/9'[ţ))=2-g.=":?`69nԽ:li#lB4Za|,]6ɐ/xvi{|~T*8 )BCg3g..m?(dD_q- .\c\N4d-߀YQFD"xVԬz8aFhF&SԸK5'~20e|cp'dS%0K=Gz(o_fl? eC:o~9XƮOC47)-0հEH|r׳#߷M`%n}.+N#juO7$.v;P7| 07}@}+'7;M$Cq[Ų՛)#w2G7!^c]UVVh&Ajqlf; >F|KrbKZr F_:u0!L^XԦ?.eP-(>uӪC {C[OKv F0dؠޤ62Ҝ>[ÅRȔ8lxԂwgV|>'17m^bNlKomֽyztͼx~kK4Iݽ_O-|Q~:ے2tUyUd6ί:[,r'ud\@2U >@OEc~rϾ$~8QfvoR6ːMoyjܭ?jz#XQ7Vo7#7Yf X`>cFb7z |"2 mk&7mdw@-ȀI ܢTtjڐ:M"~3un'M2l {tʦ[hFy}PBzgZ9=#~<ǛQy hk4M%P;{)eph_q1=z ya~֦K%u4Lq[߯{&1?FRm7rm5K40erm]vJ@>YFl]L&1 R{>(2PƁլ&UӄŢF|=f}&'d]7=GFZ )+otao.0q8ʶe/e~ڂ!gu;oG`ך?q?_xZ_ahA|Ӿ~_Gg_tg#bg??9&4s"Ce?1F:BSk6v:Yp}EZNz1',<11pLc7 |2G,RĦ3JKP 5No'Mi}.I=Q2/*9o$뒰fwOsB*||1+Yvw=2R&cdlV3 4x@׃K k820F*h)`JH1! y+P Vxc ƝD ϧ-!7#n>,ڞ| @|7Q˓~/.TaPǁ@oFh2{+jGq4B &~W\O57zw4p&0=Gn'%G3P* w .{a8B1t4@#l󥄕*^35?2o0CZqs)t UN j7vCmW?a+X^9eE<˘1A^o\pЬ(5%ם % .h3 ^a} ו]ȇNkN>6l}p{ Qz\?IY2\|}/OraãB}~uh # !e߅Ԓu0v.O}6$RǥUkioneX B/_uʚzuqxf>N汇ZX4T#0e,W.ʑEHI|]QlW٨wo/><:\Ϭ@ciE'xW8J 'dnjKMrG;Ծυt_v?9G) \L91~0.pu@Y=g+;@${kͮQ\!ĬKiv]6sJL_#IvK{:|e`G GT(wbȱ/Bj-fm85#{?rzww:OMO&N_SJ@F6&k:rF0g|.ԁ'+#etj[ߝo̼EӇ՟pG~ A{ij.O{O?o~æ,yf1h!yI *eϥo\F>_T-p>gTsfΈT p"wk@= M/\@E_o+R%7,ީvASԌKGIx%t:>z%/p bOWF7vހꟷma7:|`d{Y#+BTT>w]OFOcs|4x^`LEܑ> rر5KbP3FG*tR~B4&DwM7d;X>mR瘮֗[-?t~wL' >RoR.a@*`&DP i1b٢$`K@]EcMWHȿR6ON W4W}=e?os_?i< E3_,b`/KO,HhvPpDuHӃ3|d93s?sٔ܎<4r 2-`d:!ɨHٮWSYk4VAU mq~zz~?ʯ;C33,Nᜱ%81.n(3A+_$l$^)~G2RR꜋TuD+!xe]qꍓF[?e"T*YFY㫟/PI=AM`T85kȦf&KIzy)fƍE7f'"mx|s_eyɢu p0 h[/ł$=߂L֓q$=}S>.zh~O8o~z$rT\Ԩ2aR c:q_Ysv2{@npzOM4p2O'I[?9y߾|ߐ??y c2rK6!9H=?;sz) 3ꓷvCMr@NvṂ ]娘:1o"דɿEomMK q{bO5yNcWݎњΚKl;(L 5r08x`rb{Cm իWgL4N6ާGٔP*u#!8qk1<,n \g?ug(#G|"nPg<Vz|pV.>}z_.f?G?}#\T>3:n˥/۰oڲniQ|7*1;ˣcgyȹCgc"{ư[(!O__{F/o\|xLͼXzG% Rhj,Þ3ʀ ˥'1E|0>l4p tw lR^qʤ]vKshN_eN`dO}1vgo`_l^Sb_}}߸79C :d YG1A 4 FdGvo Qc I:3Eg6!bzl|p!aK-2gK zQ>UcHǶ9f@2.M) YbW|9*RL;kX4*lخpw`/w( nf=Ȑ=} p0`u1-vfz&7܇ڨ=*nZ>1fegKx-0pZ[ҷ (~Éc$; 9!W"xfOɟ^fĢsJȟ{Á31Zd\aJx/NQE賷z^< 4wv?0Ϛc.?Yo9f9s%h1dۅ Cqy@Sq53S``$h:;dɕ q`#+4HK_(2."5+}(Pkzv#w/W-\c+Is+Zðv]X8S9c I;fc13ܢo :~pG7Vq:BR S (:`۶ -+}%:iw@z8¬f.DQ+skA؎ P_fƔYt=g{swTc[s  f0s妸<w- X HЌS 36^Z]R&NsQ{RގLswIoUMcs_#-"p[1k ܮaBÚ[-!m+})b= X4vCq>bPvIܲatSZ. ?b`̭sWؿ߅496`XS3ԓ6;2rnäG!iW`I@I>C@BYp(@?V,ꎁl0|sC,Σ"e>68'ԊND7|)&3W?;>уcܪ/u삖]u:B & 9r[eѿoÎRiOnn]xq9ˆ+gh ?v?R|D8SyjLKzg,nn_AEh?*nGȩmс,(f;2s_Gk^uKo)8xV<'0)9\hWݞȆ ^]M(5 Ŝ46t|Ϡ@M?I)iTfԆK1s%iækOz $6<VtuhVJx>oݒt[oR᮫d]3aJҳ@R  ]dBv)ID҈)k:f N{¦[8e,۱zl:t\G?o7 'g2L&'_L6MxhT"HV%x/8%6ufý8G.exM]v5&W$@.x~Qt9TxY@v',>U\\6W' *W Kb#KKۘKvFMO@4HxPIkXb PT߹ gd_5$uSaI-k4pB3Kjgy fb LfhĿ<3wHFZ9#?rji'ƚͬ${d7|7J# ;R !Y"$BC7H%NaL./ꢶ*wBLч~P(;ta2EaXȹ ꅜ j&~{DBhz'czWp640} 6==f]*k9x]M"d) RǴjI{(e<ь8}UY=|fruĔjYgWvb|'lچ3F-w힯=I{v;ި^r pi3EQm\\о6-n+uj >9jIQ%KAv82ϳ=)b NF5arKv{Rۍmw̑ zwr|~5#؇HFGGMSLqti8N'4LloF|Kj^{6HL$ɬYҺIM",gdZY=R*ﴏ†r?-]K3>^ F#Np9 :D?Bf`5mT-,!n&hVV+p9{sU!c旝dߩIEsӮ͇a7a>Zކ@u^6 ܑZGw6a¶s@9xΓFd=@zQ?'[Eǽdg/- ^0gQ?*} h1кu ,3/=;W'F#[Y (8H ,&Q< vqffwA|0ps`PMЩaXqIھ8b Us fTA8Q񈼫54c B۽ *teYu/*:bRyq$ѬTT*(f) ?;.psI2KјFKYIa\pޡ@Tyv9~AP&c.PYd=uYԢE״xd=0fR6p7k0 wC&٭#QNS=n$nTwk<쎙(Odk,ͮa~T Ӝ(zzmM I=~Q= }[D:jJۿ"i"ФnKv-xg1;-\Ν𩔊s{[4dZؐwjG0ke+ݖaūNfRjGN?a5L$v<5.I}Hk0::]ɸԫ[Ic6ٳ9 ' R DGc7;ҡ۴lHAatq31_1[D=[>I>"qY1*O?;'K8ړZk, ݗͿ~@xܢC,, EDIA/={ \$2+7~3!'ќ*0(^?"$rqy# 9_"v@ (f@" VFggF g@뿬A-Z'!K6Aӷ;{hwnt"İ ?6KloE&(rZu \\B.}1?5B!;2]nM+/mK yl9gtD ?>;,r4u~h-8~^@ Q.'iVbpG91PfS:Sl7ݹ/(QSӡ]C70 ly҄ kk& ,Ǎr(r4< ^/T`8 (n9/cGWOgW?Θ@cdrsst=O{xGѷ{CaWș=>6Zq7EmaBe . -ȱ8 Ex~B6woƷ 0[/pZ;D3v88؞,CJf"߻!Oiq̀>,Z.b/f؊v`kLnel9 DqE.^+i݉'RF{_GcM9`Kp.ʻ<8,θ\VK ~w,''G;RBɗ P dzJj~%C&nh(}#YAkAW)D0<8G#~"nlB>`&b/"}մ{umh6l]o;7񌙠8s ;ZmW +`—^ZXϕM{!O.'T*"5AF_5D~vM1p'NaJWHs ~'7+ m(mǐkl\泻cH eӋISDHw?63i!Q7BMxVexfޭ [bwSu&uruA 8~d^(#gJ#b|B>2 Z;sn;O mYgcpOky06YL+{H3Fx;x|O)1 B'}|vc1q- K|d- OW2=d{CqK1c2$]pG$-6(~U9=F[bsfNs`F /j}:I>JIʆİcf 3ٛ5pT0!!ղJɇ]d+M4T jWb+} /A 9k4ۍ?OO!_ L qg8)B8Ş;Bc1y qN eݡĉTݮ8:f$Q,h T# [qk̍,ro')mFaGd$7J'+|#d <'|Iz>P}:< Ճcw2'R}L PL $4S/>[C|{xCwRړ^|7}(_Xq7Π$4V T+xgΛld)W_0??_a%vR@{?O;&WQyRBЇWLr{ Yl}ɗ=^؄^̛d}J8 @DYux0|M$ҀpldN?f/FٿC_OO.]w s:Q|f&ܰqcnj}6 /r8Kd>b8rlI7XwJ߁ EXSDt[Q}LK}ˀrxsdЅ=/p81mZ+M$;:׶=.e:INǁm7P{WȹW,["B<!iH!k6|)r] U2^0yׂo&ק /eK4:>0> ƒsA|0^2xc-6ړVG_zEnaq!ҙ _❣pXq}ETw@IlTK.%uBdg&<"@x⧐ዑ:O(e0 {}u~d]8X<E9-GQKV7oh;RoGb-9盯97!#%eEp0INH/n&uyK/psq / xY@ 3{7B2׋['k1ЗsjglDO2o(0E?a9 do܇sI Kq+HT4~&Z ,7%T'W`G fd=yq 'xs)%!g9ηXIf?!:wy6s{BDIsAK8f47T3Actd{;82uh@G%wp d"ٽ?Vj;X~H mmDENw3"PjX2RS0탿}w_?{'Ъw<9xF~OF/ine4b.Qi͋Ѷ?p|yU(Z(C.띦gכS کMzNϻEu?<|:+bDw3-x֫lE%)> =Ur/M(^Q~ ߣ'N+RxjPB…&/Jh\;!`Ge!&G{w -; g x_&ur-e#"F\~hGs dt(a{TN0E㹯1xHP&;"rV,~a!-8y 3[;lvvDuim+ #yd[~*7$O[nG 3Ta9ә} !T 2{M>W *p$%)&gXn4|J6\lcq5ܫJN/*2'PAm[02{JDNbHHz2swKqф;sG%{y0)@PvMꆽQ㾩ǫvm#/#v04Z<_+*Uj0s#"ɸNnJn9b/35[Kdmm($Fz!z s쌶}t$qG|"GjRoY,`c1]<4ps8+  lH]hQ}|\?UޗVy( #dy?ұhuB\#t5ˍ-g2vqEG2\:e_7%p][KZ.͏PK݀@vBRNP%?[?6B#]!gg.E].=X&%wwxؠOa]g v".( "㞿Y..Nin g>MzaJ"4Td<\<39iw..vO*'ߑwxvM4+B8rxKp2H)nbj@A+S!%:cZ,iwz@NDt#F۳1d._Vn/~B(P_?^qs{:zI5n-={2aXb5^/CkAsw}>e"{w'|fpЃlx Ѿa0[ótH 4*kdUhfwIb^skUXݭR{t;JrG{7NTn:}.{Ɂ7Bw?˿ґu'FmBNIt 4է'x#kxޑ~-VH}B&wL^%5z~+w7>) ȷή ⫔ؾX - SmG*JH H(4QxIt;Ax8̸_+qOQ7K~k)?:t+> 8lMldސdȿ8gc^_R[!Ul{ulGU߄o/ak_ptT!A~ta$";k6MNy$;d =zu&&Eu[v fY͢0-ƇWo3޵iὔ5j;9nqpj4Mə L(Y܎$qwv;ǭ DNn)M~<<⣿x|ãr.ӤO-f'z` V;YWfD=K˯pf>=<8sX@BWܷ6P}TU(*U4{JRf|u:9^/Ak`1?__]aʱ{x$kF yںhãbon̳|R:<$ąpZi7:'f#n@wV{745MJ4w@9ŹJ7!}Y֛ oѲaG2̮sK׉ Az혪-HlNj5MAp`Py9N|Mѯ/ZtElv_ҜF]pyno{m$dђ  T0 V%q;,Rk+*!A`A=EM5ǔ`=[v-.mZ@Rb7TzrlU™p L.B2 $S3ग8j$o}gQ{a鴯[` \)Y\;##b(>_9f,?K'+|l~U)?RbmP2k.Hm)f,2Nj%cR_^hn ezcR>Jïb1kh9:n^4ώ ߣ|szdcQ A8T(&\νYxq `d9XĈKCh d!O疛-2h \8!4. pc;8l]h$ A`fv!5y,63a_nEx#eG<~Xf@B/|J}q乧m%>q $K'SWA`$Ny+~GP'tZ5َ_|W OWFb?Ӹ6"?_k k#l6K,n 7>~=RLQ&"k_4O^wQ=w[ W)R+C.n+HNCzV[_6ޖZ[_h "]|jþHS򄕤CSM2Mfji<#09pG_I~{ȔypiU%0W{u*_{7>h~+. #W6Wlk8Nuٶ=ۼ.7bWzVϬ V-_.SwbYoukF{Z?O`dT5'Okag荪Bf% /9ND2t!sE䲐6ҳ_.ZJi걧4hޜQ5&OOrQ{O6&dx[94MDcaa_Ia^k:̨ _R٦yX@e 7 N0gOvfW/Eq<_9x:EQ.i@BdaY#o)h}KY Xz雠;{h(%=ޔ/BEZ˗HQȭc%]hIG]1{?=kʓ>#_,?ta_F|o9UTgG%ciE Ctd~o& ߷_ iA,K^;ƕhY"oF_%b`y>⌀q+P7O|3n7Q>2j|#6c acEH]Z bج3_hC\S[ C:zU73ohfW4d1Om!^np]enH7/61o4MrA pnt=T3+d8 C.%噃$XCO,xKϡR+ 9ՂS[Wwg~™h/$"BH8t*^pW^B^qɥ)$ǁʝ6F JmIA]i@!W~'rt HmQhmw>.-Im]/&@b>G=ӊxQ/3y^E8X5h.\C1!nHo; 9>k.//ÝqKv$E>M$Q+:A=L$8c<;d9K%C$o$qg6IAT>yH64j__h6;}mFey޸fT~Z/Q:h4bQ]<~jܲRe)ف>?z]s_Xc;6u. ־Nz-Q_☎E+Y'n$b s0qb>goa@o4_᳉c?f)O_}C_6 _^NY|pW4篭b\̼ݯBRYJ'#u~xAU*\"N=Vt3!1\Uw ,SE\ߡF3v}"d_CS]+\w%ct\:>o;SJl: uHǣ2tE\oDx: \fmC7%%E/{΄v6UƭuцD!(i/Ǎmz0iJVE w'-aEisؿ _Pz#RC._ݿ|Eǿog kg_X:w )VȾ)P/'w!kdviP{M+I{L([FQm[ ͊E,zQ+j~WJn~$YO Tx_ Uj҆%SW9 /`DD;цaN@(yQE%2ftދW@4*zZF{m^1x/^Rcw Jfx DgDvfx20ыUڋm!j(x YH^ -Q .z-S(zJEhLh /ZHW{x"ϚWp3l˰jv0݁w,orS{vox:7jJ_t8&Wv̶:˳ }sLBxEw-tFa|Q/>ۨؐjT_>[)jgR-kā3_]trZZ"2&'NTJ)rHYj CmԟuPPr 4Cjˬsh՝RHQ)Jݍ  m5-PI N݈@J@ENIHw;VB_Sz\ef 8y/|c)ˣ狱ƪv"("'8V5ۄ&ᨨO;ݚHslO'zf У6SF$7B me?>_]QXMaD]͖a՟C;X R@ GecF^ptf *,r09('o5k"x3OGP*`/},OrEUuhk@xD_If]VH$Ic$ Hy18&81ɷ<8HHs})oYy ]M3KxLפ]TC~pfE3xK"4~b>lb4L%Sr~h h3jеrS:bB `Q*Eh6l{>or 4:W)t񕽓Zǝ?;g`^ҡj!"fjӵ1Əjmjc"ۜXaJ9q6fsg5_R05yw7viqà(U޼"6 0J5*Wx SYf31uʜr?9=]u8.B_:~Tw~LMk^5IJ=$!ɟ<;nwZxڽ7~痧P6vӎ6Oԟ.ZRRMrZAsa̛Īǫ&Otmu1{<{yKL{%XmSIP#+IYZ2-F@f}ZI锇Hyj*܁*!m%oήn 8*)]<1&gn/OZ˱;˹#3D/A1ˌgS74*3@sAl,Ǚt?[Å|HRaiҔi eo$ g? Hf,LRz O-F*˴lBE  Os=<(4p (brJ<*r`3IfVh2-}OR;PA7)(ű6k<-⌞2nǨHXZLgZcX'ncȷЏ7nҐ=0#-8.GOz )zWai4>_7oQb=}}ĕװnHuזw5r嫮$Kq eh̯96Ra10j10@#1P_FQ&) C)] #n0@jaĀyMbnx8)Zt)n%M`l̢f XF"!w3ػ8B`@U;Rp,q/R %44S NveMMbFjd0@bXxQ3qLf7Լ.tP+5P #f|pq :N,csЛMZ %n/lJ5A\ $(jc.:N|LY F2t8a61ŃGJL+hmN Gu4W)]UGq@'2C>Ҕb_YK/ȈAcTC5y^kq,c4f*Z1`JGvYS I>x`YK|ōB\i$JqR,Dϭi4`{+00u(DH'DǍZ3q !:Dn%o>(NN~)j$i:/9ј -f15RCTLMأK,Jq{Dɛ:fSܛ5S,F۫U ٷİĕImcJHׂF ne^tN9ӣ:NeVbzR.INId1}N,LA4)KCiIxHUy&((hX8⽔Nbb<4`}!WDC3NIW3Z*4-BDHMOcc*2Yx10ͳ"'lk1JIJ3?%eGJe gʋO&;w1 @ X ƾ]1vRE!Q_{bc@|B.Rd!b 5찐HrJ0i 7P ʝӏo?\Mwg2lI-ڈ c`|W1o<&e4Qc댟\6rB+Z4,K{i0B5E &9Fu]8EbL\>SUrܾ1rEcWI@ʑʋa T+ʒ6X UQ-nL0&+.-"Pa OS$693ac4/TxJE+*ym∠yh<46{Ly֌) U(} +Vq#!j?l4`Eiʑ h-MMWF.!ſY0"zӌnސ-phaUta[*pU)\$IJ=KA辘@dʮRh2Ԙ’!") }- Ҫ-L;x>+Iԡkf0 SA -€T(27O(@R(†BѢtx}JBkCKׂC6Z D -ootd6ߢ'|ѷĕ&Ms )Go嫫Umj2ʒz\Wf\`&35W[bUB2;8(4sg0`F|5ܯo%eK3?JYK"W+,*=?{X=ʮjo4&ĸoG [@%U7766Hr},&HNeeuH !Ws)J~|<QK1&mʶyԙئKl۞*)fSWoVXZLyDluW ]^;aleϖBнM j{,oyֶr[l-϶^S$X ʶnQj; * ,rVw|NP؞J5َJ Om?mgLol+䮪tjg(MŠhb}Gü '-oQ|V>P" ݥ%~aQ'mnLwɷ7grOCdaBY moa9Mlf5HBBusdU%F9gĠka ]o^;Er_h a/Wj&@XC)$634/qr6-BC] ITۭX!tm!* G,BAs'X^K=6j}n@:(xGuA֚+4*qUC)p+MU/kmS4g2DZ{ ,ƌ7glD6rXsf~UT 1 b5N&s'R>Aа3 .{6KMH3%ϒaB7~$lmYS6ujM\ aay;EY#zb#g h3*BD HmbkA&Aހ]O蕑rg}"_ TP*oikR&MNЄ,(3o)- {ۋ'@ xx饽BqDWLVl4tyo5ռ#>Q}zGnľأFLnɝuǚOf^HY]ic7MW|􂱁4b Ep[{2Xԉ" HϾ#*{*`_hl=f;iJrlV\foeCMМ )vkn@7={l%Mߥ4Z2Hb)6yYrZk܉e:]`#,HeӨ/ ۀ9+DbЧ&y2 k`;rQbUXL 8;=w1Oاɠڝ$CHnf1X 4Z8ݣD%hrvI5Mrl6.J]|uDMk7`[f>)=0 5$YۀYI3v;\%݌5E&ZS7К`6ZA]*UmjmD&H.Pn^%=k \.ƫ;\[ WMȫ#|:7VLŮ% l@ _6DEXlk/(cFPeӒM %2lJ6@c+J mIJ9+GFF~ۨ_! ,~:Z 5uUDJwWrO>m!O%߃b#kR4zV=ȭnXj>qi&Tc+Sv-6Ok;+lbA%p؀Ip Y V(س5ye3W XhX-‹` _GӐHy8c 0z~?_ Ʋ&Guo7a6.Tɞ),VAIGB]xY4b3 ps*(u7Mm#8l!8l,DJS'6+Ӽ["~EYnUힴ#mABy"`||?W)LyęS-u&p^ $fnոPLZA\l`ĵ BT7yW ؖ XaLM-m `; l.hJ +B9xuE9ҁDD <奺CioBtWz1,RRCvBUWj).4d1Ԛ.ʚ ˕Z }I.DRc%v\o>[ .WR;\E  H!hLws@bA{nc6JWPPgi_zVj+QGM/4\ .6~/kc凸Ԑݯֿ"MVjS}J]IcH•Zmzq$r7*Iy >6z w)ۃ7vM܈SPݽ(tpG.rnIyIkYn`3ќu6pSRf7`XT,fzlVcŲk[ @bKU~N#sʒL@Ѐ"7x67xz t;N^G)| .VBC6pX=ecUrG Y6 @VYIVd!m@ܪVuI0 IV! PdM5=2(o%)^Q RޔEА"`$W zc&û&ZS^Q+T)דWѕRG+cjQbRKҵٲ!nFJ4F~I)}LJH; 95Y?}Aa|;w37`o]E\(օl`ռHP gj-RCP|qE{Ml B[ zYT9_QZ y)`BO|\z s2wZb NوzZ/Q &n`06 G횛\cn\.J`8䫇 ^Ic n/fKmrw+=E. &l2?l}SO LMP%  S87`Uhm2wOHeRɗ)EN'R1*\fVal/'cTWŶ]Dg J!/fח9=%nI .H&;7BiZ7VۙmZITTKNQéH*VcHcZ16 \gWj^Թŧij paͬkv΍~ߒj+{^DV#._H|77}svvSlX~Oџ8>|=D XwL7M]?nNc+AVmVn6vxaVjdS\ uEzׯuo+|70PiˉKn%<A'հW96@'"h\~mIa3AV"WJ3_khxh o+l^6WLjmJַ̕Q\x*k0WY%f2#tI=X[| |%XYeheV^i'*Df~`m} 4]^#V[V7ZUNTYiUV[вՕye%PXLdVo|jߵU$.X g2V:WW;&ݯZZi.Jz& _z%"jG)@jb Vh;;T(:$TVc]L VR3VZ$J[hqJ(_Io`ė +MXm%ym% 6:BjaW!Jl e BnE/2W-2V:eX&ln|r2Yez_J0Ģ]7BM% ݶ/5dI@Y/WR0.O=R^&}Cz~_{Ɂn7NDHz1$^IWC8pǕ02†fCpd ( /4g%>xf'p.?y̭S6.?ax_X t{eoפ+Q4 M#H2綠كQ~]Q& >?—-P}Ͽ~X O=aaq0rƎa~@#@߸(zٽƷJѤN"N:2( 2bƁѵ2@WQ54C{ .X\cATMo&/hQTh0??՗4]s'U[`P @6"E'6MSyš.u{@#ҷ6pPqvr.!Q˫v[o:&\3h-T拚05HIJF04{8$aߘۯ |[5r}XUyXy[28RѥUVLUTGUT-)J7:)(jYn98Qղ/eܙi\ ~?<,D:F݅N)0kn@RoÊ; r K:V66[Squq~:{Kl1~Whos?cz>e Ax%7En:DVFӟ/7L 4S=m+klg`MYp|!c0ѵv݊L,G9ʹ3^`Ba94jժ m]f|-y;'N߯8];=-a\s vkǁjD5]]89Cָ0J?wp";0s/UDRd!w)zi䗤H`tc`<,.MG^R~Rd1"Y\"KG,O%(e >u5C'.? I]jH-O]P*ERWi*?RUYJv:pಎOϳ|u)+ ':Ub ؏GRqu@Sq9ˑT\^C(%C._70O%63f)z0x /d_beq_z'n\ ec"FG=V5HY>r! VhUR ]%URYfg1 > fyID;o.˃expG]5K]:p`ˆJH.CK]{ em),.A`rbBB' d?IȁjHB-OAIItn- f.LT._Lt(핖J(餵(tKӞNy¨[yߤ =(Ѓ-p4Az! ;F8HK@p 뭂(aUR:[@z-vvAKCTr(.D-0٪~" ͝E=m4O:~vь=pµFͨjB G/OH!P"pQ$&@8nCxfFb62JWXF.qe,vWAa.Ok,KMUVH(yb>TɄ-n-r4/E"G+"COn.dl NDfx6Ġ ֭'iji8%9Zz8}<|37ӟ蚿f?Y=:᝛:Q܄Ds1`dš S90b+~UuޟQ]ĥR^bXtU+5ztSa3KэXr$ SdD[&'f#/©KB@XI⁵å?t{K"҈츹jɹ6"#j$o^u8[]"f hgoA3shx:ʛWgm/(9Qm/ C.t0d82o^akrcQH:kO@d] hT֠&<7=4 q}* EZ^N ZEs8ҷ̶iv>ṉњ᎚UUEͳ<9[;6oRFf&ِKg[R^ؐX?&Z'!:Be KI2? kOB߶rG匑7>%(* JdIT ZodJAٿ:^QII\ ze Sr=QJ~Rn"VmCG`#X Nu1XF~~rsa0yUMցUZ9!A'--3EP-E-j(GUmП  .ASrsa0̖._D_Pk'&8܏nQso.k^:Bh% K1&k/㱞Hu] EHz8ղ-X_Ɛ`0 c9r,'nq\QAs鰡u*G:1WБXiA ҂xPM0eC2 #1׽7a:[:mFb=6]:0k\%k=pssd]p0swYݗAŌQs:)A=E'B2 /ٝϬ35.)IIW?;۱ݧ.c{dO qBsh[j`+@kкu3S~C< evo2NE_!aB~Fdq=vDHĦڧdWE t0&pH~lk,rb7(!.wg o*]r*txq0|7 _xOdfזAw d{is8"NururNĽM>' :ß]DsHq}ZL'RBQ`[W io/袀I_CU=%H3{ @E |fk"r>أèV̬g-\fv P6ؒG{M`A7q}o'~JFlia)S p1܄0LH94 iNE(veWe \ǰǃ=Pgn]}kn}@|J ,B,nݵ>ӛ~|OZ2Ae[̜ns>ji*UE ;QIGl&Nԍ5}>I%|d($Np}Z?9y=:z y#k-怸Mynm`rHG[(Q?,Y40`K˯'HaM&yT|F5/U++]eM+b,i\eRS[8C)goYsʛ=?nzaKK{Oxsa9"vCN3k ``0p4iOn45>+rR254CA{V pzœI4<缑!Wz/Re]3gҩ}9lY#WHXnuM}8n]bpYC^8Hl/oG^5O6H.GPES*.6u X(o.˻<я. 6ԾzN$'2XRMJ˸87.i?ttbPm$A-/ҷ3k (j.@k&ن*RZb9ǡAŐARAGD ou7bܨ\mj6]n#-cTTJ,id)\^w0Li#ٽl>b}ӇnNZ+*vנEo[EcZ\?7YSk '?BEFy/^n&h4p tx/" šU,ԞpCqrR5JpdL /#Ѥ:iNX з$ )>SI'XOp^7O]Jٳi:s鏳󎛐F?޺aYل}C530o2<w6,TvTn uC`eBඔv ZjKZv̏1KtwǑ/.0 UT9r=!kp1j(L1ѹc+8f^&F%l(ր@ Ů5ǞdpiZsT`[.霓_t)#af"n6d&(By{“g#C+Yqo˵*kd{ݧ&h !A:3B ޸֛SRpHm#>}=]~Xlp5=SyڼS:iu~FnuΚ6y}~I~i5NҶmrC&@R}{qGgɝqԳ;a(%dD:aHx|;*yz ; o+evc|dD}0ڪsp;!=V1 (КL>] T&OQFy8LlniB1 DW&j4,XW}&Vpf[}l=x2[(Kp;@,22=^>)RqCj/CPF m7Y783c5-yB!Ǫ`jtGaY4PM@: `<5}B} Wd[hIH)pH 5_&iG3z!M-֘/Gk 2?(46&[ZH]@V4~gj!a,lx9!.XY0}vfم9|ae/͋>np0䜻ԾfMև}=mm.LpZI sR`@S=/FqJw6|0]#HS w# ضTĜ\] |<|2#{N,'Z!v\VTT4ܲFH b}>೧-Jؑb_(ش؃[fb^}V)ͳf~<YrE^ۈ9(yr/بvǿ1gm4B!5[5P^މӏO)5 AY)0?*!#wP՗\`_ڧ[=.clo1ݯwLE6q_>~Rz=wd+#4*z=0]P)^96dl%l}x{NߋalC;emcn|??MfeuҼNܝ2| [sQ',nd,+vm#.6g,F42[~X5pn}L?̼!qqݛ}L8h{YJ<=ڞxeu!Ŗ" ҺDBP/38ƛNEwÎz B+8rM)/ifmD@x`~Z=b 9LH;9w_D<;~n#L>n[8{=y<⹃UCMŅ^4&n|C]VOAkc<+ah{8&Yg?tT+br{aSikBq{< PJ y?(ugKڸ?_q+JXICR,MfTd ߳uI`SA̽ 7%K4gFh3 R\6lLH%uPH˭7[Ewf kwvIhl6_o5s<_v_id(fLOFpXtFQ8%uڹt! \H^J@*A7էd&j}EAqVGY3iP|wtn ' a#},\a ^0Ga.C4MԡtAE 0rHPW$U,na9*gO󋟔UTNJPUs r"p[Ca*Wfab a&ISQ2[mgaT-g_yA}R9JTTN+#[|ѬⰃ>anMW4> %h}-,buG8P%C? zdz jfub֥<,4g%=CС}$Jѕ|^xI7 5&$26Wِ@ܬ#0Fx'Ҁ+5XsvⱔP(JegOr*մZӗJ/2D Z8gP~7 j鷇{jbGйX˔8:>>Ӿ) bf^7% )Q0:m@QĖL"ǀb? =qH?p2)$_9tCmα|_֡XiQX[rzidHݎ]= 0W,ҿqvzԳmqM\Omnk}(Ψ׷>Ru}i775lMRk=fq (AY^2CROg#%#,K_xm#=(gE׿ [/De}2Gw,(*[7r24G`C@Pud dk {,%& ۵< LMטF{2Sy$T kB6njS*霖iVY4Ir[i!׍mv~l6/ܸ P@Cjp칗GcQ:fsVlDwV!KY.f~pAEu]ql[nLȊpB$*a?u:xܙTR"Ef(y::Z9se 78=NkT6=\AͯΏ3}Œ|,(T֋}88NT 4μOȀVQ6@+ LU4P8 zY9rMF,u /);le[mgԥc ,_?mI >,D-;_ bNł OY[쬟}O͙/mlu_4E-sepwr 62l\}'G[kȑ,5up^L7ѨgNVŏ޼i3C;ŝ{ C Q&Ǟ\7 n ͵&$j ߒWb*5,e퉳H{}a*6-jx~Xq 8b/~<}9 l_ u | 4;k={~~T"zAҸo#s@>jKU#.wWd9 u 0K5 0Kyoa<*!3 &.[JOsV j7IIނ8QnqAe79 gff M]z\(cg)7ߍ\v4CIZ|B FBrm޵6wt?nH@ɇW0Q2@25B?rWC@mBCзi(mۘ30b&?c}SU=qCo0:"uP-Wuաe5tfVt0] H'$Qs[?yXTFch]#-\^Dw/QsƝ uXGX#Otܭ6Nkӥ\|~}/VWp(Ҵv2ذ\Ȟ Eѽ[]}V'wtlBH#(27GljO"%X13°\JXؤi寊ɺc4sImBFk8Ph153SHƙ4 /L6-/Wvh!oZ:Q%ya՘tyZץl՛SxoxiEo[o^Ws ׸tz ],/qgw^tx[~ZtXc^Nf0xBU Y;tHO\"]N~C`нCk(v@ϥN}bxc*1*!KPk: `Bz06,ReWHޗU"He@cL Mw(id*`%sr2nZU(Tdl#P+EN@ZzJ3jC8?Lm 3sZsB6N̥LlE?I0Q!l`5)nLܖNv'3XJoz6d[ "D3dQ XrqíEN )x@FUP|K峹'}UiZM.hװ]d\C㠔pU$J) _١ cM:uY$QucV1Zjb~_T|^[(#, 'J-5EE׹Hl?OJ|0W5HVZLh-sZ!K XLtr6b[g.3zDP;U'= 4=iA8%1+ cJNwpކNjԘoI[Wqਫ਼c~3G.){ȰGj]&QE;̗l 6xHhqt2wT;x*9՗i'pÌ{ vL>J%Һ2_\ΘqY?*y3SϿPN"pa@A&s?>`jĆ2pQ37cx ŦYiX CA)aMܚR  6*.E̘H=GUĴcs.'.]P{$h{ggFny>2+oo E42 @QͰyaz,,ard"]1kx.;"ЗPfUqO"FawF2\]*„E #MoYOS3gѢj\bӂCl%9b#5^e STvzkCmQ"Tb=/β}Hp.o4ʑ>$iJ[Wؗjpdn<-ўpڀYқLvc–̈́S )1qf\(=B5gIH*|6L& ~&xIv[NQGȧжfO!; u:~̴8w :b~J4mAsc8(ia B8Gg<}+ըdf<O:~IړD*>qz}\]!n֯+XxEN1ݘoMϕDVrCQbB{!qZz}ˠyxFXy`{*c }{c)ecU5zGPnﯺJvͦx҉O 4d/*RT{:I@C`(`7]Gs%oX;Ƌm' k W"@&F9N8|lP!A%RE2x\m.LF޼kmo`΍eMk[R\gu%SGbb ..m/ .9 gdlZ?[-QM{~e+t`llyqgv> t/._$]={rA0;zRɏdZΉ2|cWh V]B+#TtCx]+:v lUaO6`aAuy)|_q W"rNj*݁\Sfd8n4eS:Uًӿs {Z>;S`%hs; ~ODj+@ 4+=MVm7HabU2 [b>$yHjl5M+la󟶑Ghv圳e[GނWϹ20mQӉ6BӚ'EKChU\2'W(eWVXyBA"XO`ӅW sr^vd \@|sG| _@M> (QRA 18]§߮Bj?J{by.tPp9n,.kyεF<}Y.>n$+P}/hH0kF)?m,x~$bDG1:UwC/uK!+^1@zCI8xFfIAmb UhvE[NKNt2T+ qzauĐX?Sƭb6ztɵP\\ˍou\XD6 `?ǐeH<0=ܗ}6eCr_2\l`jjcϗud0yc71@Oa&(_*ߨE eM tɍ#G-~/ׅnV *;25g#]t^hC [C ~8bQ+$@:nNjٜM` Rv~:':,Ӣ~(g%> ؕW (βzY">t(['h8`IFZ;N.EhNd)3 W9PN#uWlAUxvpv&CtDC:y*Aut_nL j5') *ʾW=9F8r:q=>es笗;=J$83e):;r4ap  3ɓyF&ؘ'gDg3>WBxu8m8 I I!,|Xg:P韱JJѨwʿʿF!\OdFF c/bt%kۀ=0b_La@:c(Nwy#\(%ݥU#w 9?.PeHWWyyyg\-(]r߸3UXO ˋߊ w/7xGQ7؎P^Ȁb"+EZ bn`Lȃ:EqaXzM ß=CfymBdL:̖ ~F*1ĞV: \@byyGbj}* {D+=5:q @`gP!cu&1c~JI0eR];,N(zi͊ސ L+V!F@nw`gD1U%4]AD^E>rp"ࣞ\#q{(QɰĄIBߎ`x5 k/i; 1rJeIh|qtY^DԂ Wqv6&2W).td͚֡95OK栄I'7DLsVp,s>K/>Ig"l>ab>6.6xM8#K6%" (3 v7NdZ/dKDZa,Q5loa<4ixwgo/4Rs6Q$:ٖJ|EJ;,OQ <@$2LqU:/t{ 6*k{;[Fƞ3 ʽBS0Q-p#۰7 X+`("={XSaQa$m0 -l J[Qp}?Hn)47|'^JD:8ah/1> wv,tF?nz^*{9AL`瀎"ҀFI>p.d>i%`gDD0I]s4^#bR"''O:0Q8  Mt%GC}K9wח9[Z 1G "&D*v )r&[K[2^K<"AL8ppʼTZR? `(@}qnB~C63u wl ' Gڤ@d[P2fL#eyZ߅'xI%Jj*w0" _ d@W;oGm K~ zi-ihv['!<1)9z2X<>֫'ؗKhd Ejx=tl `0zXI Wcmk;rWӊU- NP%|zK!$JHci}7}L.+NKeYT ͗JbI,g\KB j4+m,6]@L}zN¤c(P!id Հtȷ}`# J!zہ^^̼חOF8tws=@' *$E(gҵ޷9D1ܐ,9Q65`QaxGl}MdP`XIؑ?B >MF0 a |vJn"dM|ݲ!;^XiAmӛ"!Zv{X*o7~//lHNf#*CCt`tCXg(ϬB8A3=,3YB2aBWN5v.<!]Uɠ$]a0mSaئD,um27vj,^(RMšy?ȏ }Z*f69M|Ro&Wn((AB5Z{@gmPLA~ P歶cn!fQ)\$ +YRjBNy~hN #aK|*w+8KÞK x)Q;:FA]>Z6ݻTv gOWg0 iG +~(x :ο M), 2J bsDΊ[2! # R6Ӏ8rov ty˫K++uTj"e<3uڅS]KaĪܟ84}4k-0|1| k]@i]ScX siްHnI'Dd[L@%D0ǃJCl+BIC߈&b@B+8SC܇c 4/)ғ>$qdo\oW$1CiAM?y킩8w̚jY:r5-S.J 4G7e=+"Q Mvn Fg!`BRsT VU1s''bla25"{yfC9U1h\!gUiU+=(H)CHX~w/Y巑K'VA fT|c!Tܧ/,[ۨ$rqTZz9UYňpJyQpbө6D1YL8,`(("\e bJ"!͓G^K%i}UpԅfU_}U^A>z4k69?oeAq]b&$jh2 E8hvPb!2Pkw c0$y?1"8c(QW6wZG[0Ui?;>To樹5.rcD[ޤF^HYɰy'~VM@ΊH${ D 1"?1 UjHQ_\6b:3JyP΅X WC+J*VR7\.]gZi[X1kު&N&5g6Rm)l9(d̑1Ťήzk2i bjZyrrޫI16D/4Clftl eTGex)w6ICW)33nƖȵ"z>_x Q0t QgҮ?[{oU,sG7Dĭ󑮗Q3ԣYJs 4O3݌54?*gTV 95z*-(c-8NT'uY]sM,hWe{*"ĢT`*m#~t5ewG]#zIǚDeǍ>զJn/޼{/_5^k(|y7"pBP x$h)v9i:+/Xv\-SЏ"tܯ}T82ō^_ }Z~w@bdwQj?rѰ$2jM|aE Ahۏ/y]Nªue}Jos)a]8s*f[U,kw]_KR&F &PJU0`Y mlsBfF-%*[Mۨ裈zIkR8އj.W rvUiJ%K٢-kZ0t>J-?j϶іW٣3\\;9|,}LX4u[/,9mjՐ.6̞(|O3״}q4'+NeY]~*0Y6Yi53$TЮaٹinmF<ޙ֗)4aNiʧg5 765̶ڴm6{ G#ԴExqvUF G\QƆzN}_[Ʉ :ٙiwyg5|L{ &ܷTͤ4⼓Mϲ ۻaz]tC{k_C]/c3&Q>,gs48J3Fqq{]T*GL7oB=!x"û5.Ur/ӜXDBTT>@# 3 ʁ%t^m Ywُ0Hn[-xv4T⨔}/f'2lT6eʑ/?o{字F߸M^dǴca#cR(F6(%܆2OoK| V/ lUի%݀iUsI?h6 j[W6}0N@Ѥ{hM4|͝O'N%)D MPCfCF-Tn6K2N#-t0x i(>F9(>-#]>p'.TP)IrVn~;)wOP0kғGaI=''SIrqܥے .3J|Y L1ܙ %ꝵRRVq'x6袮G%{X ĉrcf_& xA^ 8L8c[kN{M%x[{"ܴ{3ck 5OJrL<8ג~bdZʷ%9i+tBHb?v6%A"5y6`o,w`f&h 8Fm!;ANo.;xpƇy2o $9$dXu;8;pIX?O;f?Go+~,QFB7Nt9*aL>ش:wp6>i!?- nC6%dtRRrjO\=*.`ܦc;._߼AޖY'a.򼠱G{H8RDΈ)]1wL1Džu8 tfksr\r-K>$ \$YR=+YNg躃Kņ%q5\ܩ0rI0yjE/T=#q性AX\/Uƙ@%H,\322zի X.PyyUT>h矝;m]R~Fh‹') SsiȏN6?sg0xꔍkxJkSzt̯~S6_N^y҅qN,8U8y9~ٶN?Sc m9L/D-'1cjqK[ `"T-rJ  x~r"SWʊ âSp3Ea4WX^}b=iȔf έPL3rIrʥMOE"W[X\YZgA}9۹OH>9nUwߎn>?'t0ģWboJRBKf \mZ);4@E1m'OhO UF^ǔYbN8X(W'a,<*8Y<R sT(1KW'VwU鉤; fI8<磗,2RELɓ▢[XOQ\SQ~ct{\ uCө[;r)b[oM|/|S1-o q#+Ԕmƫ7 GŹ6(/$iU ZpR) qZ5?\2MպqŶ\RI&a$&c;0HB˖(c,^5Q"/DJGaUґՐ͟r^g<-{ /yF ߜ߉𤂗n?x=_8-czTJ*g/G}.ewLf]n0&A%z/:kUIH4} ?b#~X GN4xۈ2awwMTIU Kw4Uspr'k`ukcXspOTL4D0yC۠="兕Qr"fug!#ы)fj"yXA5|=ضhpvAfe` FQ(b>-OcM↴ d*r;(zjX`nǃ,v?EF~7Yit)\J48@޶ {iaGa/18^U|>wEei1wZ+/.-}𐝲Z?Ǥ{>;t^ aTK箚QdTN, ` uʣ2uB?N%޴4l5[@ lP&zpVkә|H^!jb(G Ց,0Wd(l)bR F橓AT:I(Jdi~j u޻Q& ;O{kzH,?=83ض9 f`kGek"jQfJ)Xrꔚ Kz)]FyJ-Y( K߈l XWN<6qY , ="cfRv!KSLB:NU _?]Ƈnu45s6ɦJ:XT7 dojD׼mUE]!-0-~{9s n9SRa,E..&ј86b[ %.s $gHul—750u8z=؅9F+҃bLZc*`~BGUꏗ7&du{gأQK(ѐJ500ҍ*uAM6$MK0 ؊5=Bi1}u&5Il+Y00}P`EypUd1*L:3i#ad6({+X㕈629}a`(6;ߞ݈͒'eSnԼ%/+ !rY1 rNH>?+ӊ`HPb%;G @Z̓YCuCR![kdC@Q3eU>u'sQF)2MM);)џzVk4>'0u-l(ʌ +>+6ä{Mz֜axyJwZpnebNmΰá¡Znp+׿r:<NȊsl^_~?e# C^76`+b%HTT2%gc vg~A,_cs0R,Fn6E{,%Sl–7gSIyZG9le2{IArp.9]HDDBNƀ|6gEWyQL bɲ.Kbbs^xoމ5#KI$yJ1)D ywjnrڭ h*㼘./٤XT[ti =1N+/j5M[^p t ԄQs&@biC@pRcpJ)2(4OWATPoc{$ w* 8Qg i( .ym[Y&=ZvܨQM|:ge`7N͂%,_j/0QCo{gbvvtd +22OJZ;vUaeTٖP[ms!dP)7ϲ듪g sh֏)֢$!;:) 6#g,kxERe/8IBӘ/FHG؎U8C63%) ?XN?Xʔ~9#mg1,,'F  5a8Ou--sB5 AHOPp( Q˨&8Gok{ mz)7 [Ì^{=(=bjJ.؏u0p"Bjaҗ>rb#tuJCK(ܒ HAVʣ(iG%qZl :ilLߢJL7+(wKkl } |n eX|61X (~u3 aě(oBb)8dGƯQZ6SxoVqF`ie儸q0 ȣ.\Iuc>90DSFEI%'oh]^bG0kwLףÍCxF bmVI% )VU`s@zetkWM}܉Ip/Zrc`3>†$O(s'ﭣq|Od? 80Aq2S=JejbW̼'AyJzr,{H.xy}\r!8 k"nro~%<؟а]αSd׫8X)~s9AiJ%rt[^E*'SBEAr RNvޕYԧ+`6e:X$cvѾ Mř{`ګoA|$#C2Y|OH]C$6"g7Rh WO^IÀ gp5Yzٱ1L?菱 k$ۯ6t>]Mf2ʭmJ902@h~7IZ|!mmR59*݃(? 38fwb͚cܯDAҚ%pe)=pgHW#dބivMy)3*_=v STJ[?ɺAs,`NȻ@w\o e?$A{38br|AN% bndFI2K(p F5?OR2W aeJEvSMctK9G4p3ֹۘ!fW@#&[Luzg~gXr=۞&Ky 5 *GzΏFQ!narF`-Y;#n1qoykx#7@"fAUXG;޿S̀n@;Y2`zDe+SZHJߋxeP [I/+n5z/.MJƃmYBF4xZhHҍUE[gsI tREݏ({1 "f06la.]1Ro<ԕ./M胀Ԇ o 2lԪr(櫆nu@":<^քtY0PG`ŇLE>JmutH-1A*=ٶᐒKS: )'4Ak\ #}6 ;# rb$F@i38O4E(O %-t[; n-ado܊,7og]¶ XWhK:GʛGU92o`G)G3/~DX6^}Î6Lp'$FH-n\J;C`U fX~J2 SYC/-0.?aSZ͞EL UZ`( |6nG ƏrP4gp#硿^8?όw zؾ{tW5nV4zqq ye4爻1YYnRgߐ)wGvD@r#`zPMRV'kHhlFk%<}ViL0V /Q+ 5U4l4ad`|qqDX{Pzb*[S/2]vf8 H$P2TqAr^sDI&\PEYJ^bB%iBy4}} b[YXMDi{P"@^ydgkPsN$tsD oBm(7ZFыukt&*]]-"^F8o\m… p91i8ҾVdg<X$ m[ R0)Z& ~!З#b\0.?BGa(,;FGvcܾmLŵNNJcY;{Hui DbCLAoAZq H-3f.U)iou^q,2:qpޮ̞CcaB'WѨÎ71{.2:_`^>]HzaE{/onOP:⳯*WaՕ B*uq}1/@.dA"YۦǸ1D@]φ6ٔ{suM Kq D=~uקhA_F"ѡ+0Qx(fUW*253k JXHF0ڲ%vλ +sVjEB6~~ɬ=Tژ[8pv6wZ;50=]+aKr!DE9ARcʒm^nu%${j H:sO)1|s7#_'O[4Oag ء"UM RR`)Ը%Yd,TeX {ix5tRH\iuq}lEfz% _\2 gb 3g,՘CÝMInZ2Qs I;~XLH5~?guJڽDz2gG s: /R )?,p3ݦI Zy97U쉱O3Y89|[!LѶu2gvnƷźډXj,"p|#HDQ0snJIKރ<單fvDfk++x"0!~-$aF@yrRB` ~9窩ZpϺaQ4pdAP3N^;՗bTC!=J?)Qt+8^1ގ?!G-'l&g\E7џf,%f%L2YnV^Z7!(fWeX`r:u⛄mLvK(G2orFd~ ߯zJ\%Pp `,S;;nZ*B{ #b-i~ƾrݧ;UO>[.G >d﵉Gk~zg|>tZt5 &hw` s#[LIo*.[VÓ]귮tRuE.a_ ~G|+k„y1Ni`&V"ݸ@ HVJ)ݒDmB\Swkrr8;[ОQ9+_|O sP%Қ0zLpk5ͅ bc_2 Mgv"NoMlCɬFC-{T_e4h3[iSp>-2,(nW@yyscUHj|Cqߧ@ݘU>q` 2!K6qETn (77yG?22:i8^&࠶]^LGw˘ S+X1`IZu~FLFydؿy\dFOl˱q|sQ^LfY[@7 % ><67np[H[Ҷ@ڠM,dAhH$٧.֜nB1mbGٓ 8/Jf#Í=q.v66]&GlXQhw;^2^BcTZ2JS |zFv8zRCWFdjueEհJs"2eXj咒y{~T !I/ָ7ZČBQ(U|pHeyq1hHȉόIV$f~7$4LYlvda$£1O6N X+uٱae" N/ٵ83OeDjPfn'w$s;.wN7z֠.S~syd60sJ%!I7+=KWtPYh ʒtȃ@NtICX߭ %RWH8 +Տ0sqF92NVJn,}pw, '-jT7hoUeypjF "10#7KGXkzGoMl=yO7?U*]6,sFx.݈]Hs30Vxs|$ON(8SY^NE%SVɟ0;@;ѐ$}91gnTN }"RO .0GI':"cK`6ujy˖?mu ^Q,(i t7esR6钰t brZ7y2A]4Y ‘F0LE!I !&npI՜ D 4(>@2}|kr9i+KuQ˩ԚB!DP%VMU,agPJFŔ=2ƺ0IWiUb}kpimlo9zB@".#[jЍ'E wk\278@Ncξ }Wrbܣ/M @O[ V) < tں;䌋- X6g |Sr@⠴yc2E 3i4vtgE±T+MC}jpM bs}jbHӕ|5MīsMR@䠅ǡ2 PanklAg3H@t*utEhgoozt]QK<=6zDWkYTɧτxOuFh( Q 0P8CAL9 LiEsQ^҉?}##:83<%>j;X#<`["X dAŒ6o0n\m#:X0:D% qD."B7l#k7BO -)+oUhRW$p;2Pv$t`&uuQAw)e brg&(N-I&+Yܸga>18]k_f>,Mhi~?/8dNv7 mO6^t9Jv ,k*k2pj[)$Y+(qzꋣ:qP{r4.O-L(x]{nW@[9؏QH(t.niIHUʴcX-J"+Ѹ>{tusSq9ORq; mm`?gPFgtPqҘ5% { ڀ 0kL`#a?j2Nˋ-~XJr\n67ҋ>%O؄@2Bԉ2ϰ_fVlC`x'~q p"iz)Nkωy3 k92'`DAFޮϞ=SZdi i~-5M'_Q͛n̈[׼$[H3 oul1|yuyie-fË*u.XywLz/øLV!ww73u.of&oȐK3< Sm]GjkVN/wjiDطuKA7 }R >rPOl#M T\1C߂}ʳb5(~ǃJCzb=% e~vv<`s$ cw9^ g OύP޿P. ;0` e(dZV(>.#\\^Y\t%h/gwࣕfY{Ϝ9cݍwb!1nBY@ C JS12#쉍qvP~m=>_uQ0FCHG'9CifupjCC(QG(sz>̯c3^^&robF1v#r[NGz~Գ<ߖcEx*'iL ,f'9~39fO*IJ XXĪF|+,l[_UQR%*t~Q2:=%jWUOjV#ЬX))<̂ܽT{ڄTqRXV2uzn ]',*yYP;m%77ԩ\0AQ5 c%aC G  kG$zJjb^,@!;8Q9k M% ceߘl9sYkԘ+Z}5=`4BzXС"/}ԚhCXGY+IHދGk(k::suГRy@b #mc59b|wUNCU&|~&"GgM]MuLR܌-#8&5JCIЦ,<7[MI|IQ¦lc(Q^lI=t,q6vCnNӎ//i .K$:'2K&E0 &yvZzʓRtQb!OxG md8m)E~9><FLdI-S`C,c`XGeasJ+e? E]2fjښ:4{ vw1aAp *EahbM3'-jEXu_QM&' K|\ߧem-,rU|)ҫlMw2~uy3Ng˻Y N5 ^s斶{(o"JR*[Ҭz}/zD6ʸ%Xli ܔ@u\ Ib:CS#F"ԭc7!)KIwdPK`p>GQ7DدAёdjD,c[9I%ݤ<pk#^nQ/7[uzo[Txs@hy˵]DP P(NifPC;]Up=(i]ϖe=k`ac{ 4[fUo&'i\=z7gRZ-e\esd];οDX!²gh/8U|:NπN` cv/_MC1Ek M'KjxFx{$q5U~97sfC88WzIF)ī;t3ľ(33nfM"z>_x Ʒ/a ;jxN ֒ƷJJ]SW;9;I=T3݌ Q૜mՐE)1p܂Ge:ମf\+IDer^#l(H%A I]]FS33,? |a\*7qQ9 ޴.:]<XjK0Q{l.9M KkJ9uD}-L܊1&R F#鶻1>>>?6Bm-:Mq06I`Q=g@a7{󝖏$!Kj{x~*1צ{E̖dB*ψ3`J-%;֟==,Hss`=hƤq{;U /Z󁸱}S)VLJRm =Gif$wru;Y$w)C+D^C( oo`v; @mӎsgƘV?b:hr I1 dЉd r9'hVOb 'Bz[R9<)0ŀ71sudNя 8Au-8B(ʝU _75݈*ЇNly%t")٭0ŶZn|y|ԍce?|2/dT4d]a1ag0܎ sY4+x#c)'MID@\(GmQ#qg'S!\ƃ *(D([,g/n:8zN#{ Peocw)c-PE=(ix>,#=vyIb-z}z23:߼9ha8 yx/zX߯}}퇿YO墡 HΛ돆qeCTt4wyfiKr8C}G MUԆV|1^Qķ0?ƟK2%\p&ó$S R !Q1m@$ZƤZׁ -25i]x8۴mUJljg;ǰr">v@HmW^974v=u.=rnp:`NqN]^TLh6KAU{ cq/CgWCΐr Xt\uZ.*aA?-)->dB5~(FgHZޛ/d;̦3 C&o>rEu5-!Hү%ܹ穂\pP%NK 1՚4!T>ɐNBiBuV/lE>>r-*Q MB/I!XYPd k k;Ivcndka٭^o㧝ݽwxt~ .A2}miʳonpvɬRضȃuxX_5ArċS}ӝqWSbƒ!)SU=:~YUȺl;C7v.omGHB!7JF L('&;q8gki+ԌAyy;;` uU _Ћ:UQuJ`y|_!Z}.j'U? j5X{Ղ-E@9BRBHo2ÄgȄNo51C{Li~O>wMl> i٥da Cӄk¾(,֡^ߺ5iP?jP;YEz+8=iҧ>sQISI^.UjOQ\-.5)DBF$dGe{uMlMmOMSc!s`1S9O=z|Zrpacrҵ~l22;\Hengcª;˜eNe8ق@yG)ӆAxյ?G7=ս @*L$!ZߐB"&쟱1y?qj\1eɘ<|(iR'9[r2lAT* 񋭗 S:~s'%Jm'w1L&$ 3TNM^LF0Ia(G{ql@ڙ(5U(d@4덴=\Tz)Ӎ{)y9"N%7VC9@(/WZeJwB;o.(D+r6/ @7 4iW%7ք$`"ߢ@3fwBRMѩ|mgK&MLcbz4#ȺoTr`^WN/HM20F$ [x$ HRàG@BW^8'1~2h4.*IP{j*u|ĶuuKXD$[t4!n=]FO\Nv)Z8H 1R&@J (=ݔR;ڴ3Iv͟'@ن4>*=BC I6ӱ\mkSRoYdIG76':MJ[ nr#rIDDOd֓" !"t3GOc\YC|1-11E1I.IJVyqtރ;;ccQzc${x.@di2Kg0UEv|ީ\7X-]ˎ#Z2T+,=6Gمr a<e1^`ԃ&fIh/ߑo"1E<ΠTO3MЭ[WXnTT'͊d&h'f/uCQd7D;t KpZ0SNe2!(\V=mߏ(\A?LF an]ao:hu,MXKE N ic,V'vN6cu=m@x)dkTCti}k;PxnZldSޢ&-2 huܡ:S2Elʄ V%"CI, hE~Z+${y+Q)edܱ9ɐ2S,ӹv:Z4kLK)<}Kߖ̣ܙ.elT)Y mYx;9/ƗTEd!"֌4FPJeSFmԍ7_/l?&x\םoPӾnݬyKfk?riy(u9aT9a+ I(¹./4@T~"y_jF2h 3cDZ MqÆTӵ @G0@C ꍁA뺸G gocچ8YBсLy#3J.M@.FW߯Q#\&pz|#1n0]ĽҒ\ .ݢs*NS\!uh^5Hi&94/:E/ Q2P\&K!T + 5Nhst%c?2KwJV|ȘXq=7f9fygHB)0X̡NDN%LlgL b&h0g»eնwdlm7[U]3/r7Jl?KUхgzSJvF2!U4fh8xޣ6vt.<-sO^Q+J/uidTf\QϠ5& w֙ιXڣ8ӻi:#{x^on67Z2*位q(6n X4b)h[ܱI-1 $ȲAbUG`x㱍͡muqf`%uekFCn)tM>U=eVO@G9L٦ZҲHr]ۮm3!}83trfkmpPWQKa "F ?zc(1ҍD%iHDVK$H"` c" rvv\7%cjhvz6=9㨧2_H9SNr6uC"B{G76#em/=t+GatBȠ&WPԈJwKV$ݐ\e136.3ii'p^q<2sza!t-QvVhBc{̻x8]UY$ [7吪R|&H &̓:u/v ~#+Mm\D6ԝ&9fl?G{42iBfWuٍĔ95'~Fq: DAPX铰"DG!k3r贓'n6_67;GǓʼxZJ ɀngR|E_}-)CهsPޱjdWR}䯧 RI%UoR*9"VRGIK_ h[UVMH8BJK%` $J>aӛs,8 wa”X`w`Vb'12ǔ(P;8ZgP TO)ŵDq;D<捿 gΞsD`"At\R=zuUɅ.9؜#E|JÍnS݄쾕p[ BKp PPWqܱEǶ㞦N9Gv,: G,Q:rF(_y)pS'@@>c Rlk4Ⱥ xˣ`eV|~X32ɬqq!:y$?I W$ 0_ _1aJJkVE|7 3nrHxix}۹\e`* TA0C-Li삺>>pyȘ@{r/`ni-} QS ]#6@ݹQ {dC)'RPz"-nwRF;놝1f ;YS`8eÉHKXdb9ajJ!m Hg# zdy;:rr&1L+~ꡝIBBkNgckv ,S]'ez:;6Ѳl: n8'=*/&Pa A2, 'ym' * $PL";r'Yo$'#ĎES ޠi&_e5OGc14| oJb#@J3$?˘;n+S֟0SpE%#kV#ڐCièAYD=W7b'[rUTHc+ msBڮYG`/]z-Ey?*!=ʚSWنXc nM (iSLfdA/NެWEtJX,!SPBsUr*D1'9= Kv1 4>LTבk_cdTyvQ:'j1Ɋv cNNlNI=WW\V38n{cuEy2py*7 a|-oQ7rg:0.lwt?A jz5.K&,zt3w̎]@H(x/Q8ݽX* za@FLcþ*6`eɠE> &Oc)v }ƢKqrtvj(̆VicU ޗܔvܺZ|3:O8{h}+|l6?'FX!1?z;f&/c,G-K3Tai`k -u @ȶ!|0Pm@jS/6I:Y#28^6𖺴  ~!d 5PZN[7XMdc%3t ~LKh& 9Bl(IJZscc.,+GK|ޥ(xB% RC-~Ikݭ~ 'lMx2Q]a2kS{RB6٧kMFR9%dߌAE:[SC[MV<q+iDʥn; YMo@ǀa{A0F\ |[AF ar-MR$Չk]hJU$;@pNVyEr ɎXdFy]!SB(Y*beyrB΍ggnUu)GNj?S6T)Z/h "*iHRo ` U5 `Gb]he6l97IPsL͑_y;DvH˗hgvrH1yf2s"W-@rKBB]SQ?FoB?Z;2l4E13vJ:ܱ;/5rq/*7Vo1RGxr.MMZ8\>#X* #Qf֖V$~rDe_ڶU:A{W&#';NiiUN _O {\s̥LkQ f\ܻSY@N\ Pt4=LwbzLC~&8gr5fޭsL Qd ]>YWbI_7ixMo'vhm$=SB'QnQ`X#)`v HNªeA=&oWᮐ 'zS0 pk W c0͏[rꕵjv;2ۡD?y`dO1 ;7ʼnNj]䚕D;@8puUz^UyKs uTI9d!G 2t>ӜL0z:Z/=ha7^UqdTm #:φ@MX+OʀQ@WÅ/ׯ4qV e#cyoW9:tٚǜ2=ޥʽs9 )}zSeV%-&ʤ!HW}s;]R"b%Kpdܜ)D Z5^_=ej|o@}귮q<;y ?R9RS*$TiGm!qV-.DŽեtjE2Rlp.An;WݕME*k4jECBђzV/AfhCQX^KV&PID*I~XF;()FÓ!z]f,)T@TܨoV_tA?>|ڤzٽ-IFYrCc'c2Y6BXX쉣iE<6ǩ4EŅMzB膪@`̬k\i dl+Cv`.TU9ET''M5q2P[a@~?, #_3äעx 9IǠ}ge[ůDDDߚ-Vgi;+ɯxEBx4m(fS1&fjud|; fdn+]glHdIVX;;d  t@9e9S;B:bn8yK ,eA]i)d.ÃrZ$Mc!3oNwjq7K!6$#0aQZdjBq#30ZLƊydؿy$(x^;QMIJ>E@%ܗ ZbcyIdCth,>W#?>㹏j0o=En2_|`e[Y}d`Y p)LVΦF_^lqtWK (6RLtZuv y5#o;elkVRBnܲUIMFu6IòyfId#%t`y3 ~X#ͥSA=YމO D!Z?$[3"%S8VlPe_VKaic8MsVMm5m(DB{OU,_]X#`‹*)Fw0|6 =E=UGx|S{F.TФ[/G9[q] p<[܍!179''KOQMmv6o1رc.{'OqysE~EI?75hbL6F!:@nXh~,ė(nY:9|9ܹE1ٓ*&Fp.j`kuMTivv'Lerze9.la#VX P?ܖtHQ>&yt*D<$^UIƍڴlZk& k~@)&O *TcOT7_rvtVU:ga<]i,5R#W'cb>c{o:JcU @4x"RFnt!iO$E Pj7{ԕ77YSvdq{_v:;hxR.^0۹>?QcV.GAv G"cث{i@=݌Zp{%;h NLPxZ4}y1r>*'Pe+NvUh>)eT/TLwhs}\;)}/2K9E|:(D#fRa:΍]u*ē74g+i([sԐ-nuǸ%8 ޛwuLd ytEIWQLi`RIW؏.@*t6-Jun{*|{켿-ʆSP*2yW=\[*Y)ӵĮk:WdӼ쀌 7C.g@$WM|+p=a]xP>$[Fv/JpqX |u9KcB4>78.e!S5YBP({Q.OR.InK!Te,MU/ƫc "p"&[QDe@4cyG=T|ߕ_yBEzT㉖qL!`%nVWX]NjkVmo4!&j ||HfaG? !>Ű G;E2?|]I,Sh9ŞI7N?:15x {F%-+HSTɼ4f!rlGʤm, $[uE)&3KT͝Vs筽&@6Ra1J7"),BCGNy`CC+$P¨>t؉> <%+axD^nT0#G*]Qf þ_ =]J<\ d!S8swf/i+"P\a=ӌC9y641)1ؘ&(3xVlCVg׿S"Kb\׭m?ȓpHҁ9D'!ےF#2s1qHnHvқ]$0AFDvީ gܘ0;ׇF CB-m3Y_0XԐJ^ R4|]X'^҃?úQeɡD#¾3D_$ |0ǐQah2o_Y`,w",ljOs^mI/^ǧOQ͜ҽqm /9C:̸~!Y]rC ~t3^s]_c#(qH'OѶ%"ӑƚL]GK"~0qӅ[aI1Ԏ//oc%/,Yd!-|./ٽkIT@P2'{Ek6Խ/ CǨ s*dA!&YͰwCb> sufOCEͱL-r ܿuO$/PZ]HbrUMrltPPF1RK "aέrkUƴf>$u'gZ=8Q51G!gEjv=VZcNN8LPSHOrӤ[+uRw9Ш3{+KMf3F̗ [#yZEWdlgA)2C\B09<(ADU9Ln`[O>(7@nWO!uysӽ VH12RyTi!LM[- GKd௟S_`A| ՄBD\V) #@{+2MZӓr\$X0: >FXnQo+t7]_OfM㷅dd>sA ɯgse(ߡW :N]9*w>QcJiTXp>ȗl;{+Ș1gdSSZpzɧ;S_Ss U~pMEM|$gcZ&4MŲ.Eq曩)`#7 ;Yƒ:]LkZMl!(qoY}Գ e'N';>;ԋtvp:a ܲ]U*r"e>yNv%Z;-LNpn6oi:〈Sy'+r2xke`f2밙kyT̢AģA;<찙drk6'a^&%L^TUJ 8b( t C}/ȄNG>C*|4{# !kUR*q׃P8p(S+c7!1>'dHeN JZm<>1:AfjmMc 'Gc6vldf_jϥ+}2C|QK!M|y]PֽIj湎6=<5ZXCLM:IckJ$EI2F %n|H`b0LxYPvAw$V٤ƓϜ)fih WhH)0}Tzt(j_\@6nѝUQ^֎FܲmpCjwWBK.gd0S$@ &E iɅxo U'(>WFrժ(J?O1_(QQM`UͰ4d U0$8K,o)޺1Ft2qTKa8=R?];=fd*KbhkocbB9y#t֊b/E:<\Cz1 M88daD^c,O\NO*Ib!,93~L{AL'5aG}QwHV] j<7q] -Zt+tM8Z<i6Q"¼)Q6 (f$ 黆+-ᑴGOVcREHã̭ t;w"Y/(r BG%*~dpM,z_ρ˓rJ@\y5QM T)ohe d)ݱY bdNY'f.n^ExE^xj{Nl I\Pyv^Cf?W.Gfa07B*+tip890#1Fʼ*Ԓ5HNHG ߕ;<\n_>yO(7C@JQʍAQ*~(wTܨ> Ǧ^ *A&wdVt ` +=%FUb[߰%ϐ,X19, D;o  2T\6CD ɞu; @_ժqQEc1fmCm܋k-3u %먅p":#w09(GhWfcIY5iJFQsIru}+5?[hʸٖ/(=Q&~>@ )Q 8©S",9Prwgh붹`⤘ZǷK:TZp# :iK kJ'AHiD؁O3{q=v^۳-l2lWQ8b J!u,vA$[Ҡ!H`eˤ*#H*OLWI`iPSHx܉N@Bv@e $C:mșƮeN.8yI e) Dȭ#%qw/,KB5J$&;d12W]xq&21FStFk$^9ӣW}>&N$#ѷj/Nxy J$bt|NSi|ۓ'p 'FF=ѐe,Bݧ$gԞr ֍ŃJ-F"JVoJu2o2U(.KPZHe7Qe|+57ɪX 1ޭ',:.,n$P!F,?korQ7K|uܑIJ|IҒG:Hr R¥*/!bP %ةZݍW"~D&i'' s)~\gs-{ibI!TP9T+29ʛ8h#G! BQƍGvCX+ `h]cYăUa"F3fGY]Ba( o l0\7F'qt0g]{4we4Kj,%e sJ:gC+U=:t$ˣsR߻:)咛ժ`%U%.17+m;/u\p vdP&vM@NZ ]J)\Mi+NsALڝ|)GDUSfF`>bkXozo1j,_o!'< 8H9RhJ@c ƀn/0!PYe# )@cKවۨ7 {\vMz= qے6߽hAP\/\؁H)#vMgAieIMֽ[VWo#_b#˕Z嶐orFsss- )Ob$q6D)X~3Ԇ+[1LG ` q5L)CEP}+ܖRr+ GHj+t~ Q{f̤{6k|a *1#r3#9X[iaxa !L  m,)O-JGX@)t@.FW߯Q#\)0^8`\\Z6#h(FA2;Rucr+p~Ð 'R6XYk.2qI%e%{:eR?6 U*89t29 h\)!LQjIe2߲Ÿ;p*bܽ?0^q~ԟ [" )jOsNœB UV H1!2ԙbVaShv[cL ^ƋxgcEtH;=ꢛI1=w8w ̑ۛ03Q;)嚂iS)Y\&Ks Sڱc[p0Dub1g';=ƜXCwĄN4.E7GȝPtg@R}q,[|T(q 6ݑ3QgszION Ͼϒ~JHQ4v?`;X/K!\p O jQS*aGݞwtSw՟1kcb{L#(g lԾGXMDVh֠mA8-;E VdB$7bn8/{{͍Ie^ن6PזG:WiA{~k**n^ nD3k6iaSƨ?9A!Ѽ`3lV}Z P2,@rTAp>9No0b}%: nW߽h΁G;˟J`ȧlz.Ta3F rakwzz`*[a&6* x/inx˥`ÿYͤuztĊzqNi8zCPnm2};(@E}Sp|$(ΗOa ? 0)irآw/{|`#ƅ&Pn1j^:9}Op91y)ٛ<%fr'CAbX0jwGǙx![wq1ϫjgNTNNsZR9#W]!i5YLLbN9%|NU҇֜ɮUp3jP`娻r#ܩQ!ɋ#>R:$ɒb{77Zo_WO^l^oPB y8 ϔ9=4$vпwy„}퇿t V~W{ fK`ee{m?2 mfruHϴ;B3{Ke6vKSxR jr4܌:E.PHmǷ^y5Z +ro@Alu;,L4yl&s>R&#- H@FIؗ p}5Pyf{_ëܤ曫..=l~SBQT@[͊6ĺHht)rf?:ր7 ɯ-6N :!Qh$Jջ ꑕ8> 2$=]U\UFSR_*n:ah3vj)mtEӝMLޑq5;н&Oz ɿ j9~E{@î#/KM䛃h$?^oǐk y/ffrr3G`fk0l3_W`&F--XǠLAPn36=Df2S}0!p3,CÃ^Sv[c<9dqv͊~䡋[ Ǩjc.zq+$JyٳɑHq "̞ K]v@V"k%_c 5`NC!zA/6A0PިG"ޜ2- u Cvʣ FbuvY~*~ _x@_%5`xڵgj<˗MQ,bwcJB2hM߅[ d}u&(!}'ns}_@#ҕ?nmzgWݪXtN,./yteyo]<`rPY_oKY}߄m x3>_i$`SW4g2FL:֣8&x$^gx(1Ss}Ge$RKo4W@,GgY>/$qKIYܤ109b QM%#.%!P}%ۇ2lt lh' 9gH- *KX.[S;?+)ú7bzW!u;73iRj ]'[*[Od6!n'h 13G`R (s)]Z 1#F-_5 W\͘JsTA_TMKR_tr1Y0{<IO lA)#Hx^8/#/8C.1 WKKߋޕ'Saߖ*FSJ)"um0_HL08N( %ߥd!F,1rɠBF~u 7%OFGtCRB"B gt?-pr߹Mc.K 5>{/g~! 4>!l!~+ö+Ym W\qr{a+򦔟[ć-c Kc dup"1Ĩ@NNT lc`Ч.٣QAJY:aw瘽U%P"OI9i]RiD 5PqZ$۲Jԣ,2Qgr1gDsTڷev_.W==rmo5]l#׳{uNdO)潓3wi07~ mQpZ1giUWSFŸ"%Xp[=0FѩhJCY?.",i(|wQݓB&HID[<}ޟ|{YO۵.7>O%[8 G%L%ܨA'ŠuHvHzs[U=W ʩ?@J)3'Er!s4PB#R $pb/)ywn"1&.Q|9*Ęs{~hTa| -6?ϊ\/ v:fqTo$6ݡN;2C3y4c4i1W(N;٦v0~݂`(*w.̙XIm݀"~H|Rr C4\bgCuHFz@LA Dt,0F@D3}0ε+ >sғxYty/'7!ǩ !!2 x$҅jml*F%\پΧ;Z)Ϟ־lvij0@Hxߋ(T'X,LAV'WrfO5{QM)Oyp$xT]n4fUl Edctn|,/=fdhUjWa)5w( ?q;ãb^`58$x(RRebL6Ni $IyÕ5-Dج 0"~ ״ցm.C2dR!3EL\YnpzRzHb.VeL;2Qn[ސx͋ ƤQK4c+(qge˖_b˾ddn!*&롣H<5/lDRزKQk"FLSarBlț2{@ k{YrCEv^!Ư[5%gC<[l?[g{&2ȹ 2L&w &SDkV6?{'Z2#r7qq5 n[9ak6ϊ}jrimloUO6v9oT+cO),.Չo#:zKq`"pE wk\rCgr[V{߬\f=+cg-ꭴE*YUOB'IA4.EPJހdNM UϵQcI0MޣaSY,V9SQ=prmr#ԛinv7R,R gMJ5 pG8S 8| NE' p6m8b56)\0V싅$L7OTp"g弒r#ZR%Q2NؠJN^; RHd6cdg 5X4?Z9K|*+L4#/6#6+º[.\S*\.uqKDF3'vbe?lb7 =ckX,(]Z#;ICC|[gM=fw䮡xI5_,8,(0Aɜq$ Xn,z+(K됵$DpĩxG%'dx%o6]3 Ŵ-&CH, !J[~MIA<d R^!b~r~෇ 2r(9):b o)Ue,b{LYx'y49bcO,7VEˋ>k,V[033-. J\ۡ8(E۬ G3pIR%H1f2F, )ʢ8[GZ{r3s7u#"Bmnnv_6I}-#09ĖqmhKD\CP:Eu0b8P`aN2uDe˪j9LI\v|-YeYNqB˘0~¶pHUb)>zE:)Y4`:x"w$ى# h%8ݮcUn/"D{o_4KvOl̛k@:uq3Up{vV1-x uBpAcf(˯H0MR$nA! Ro/]</i(~$(Ri]IO` ;$`wɜ;q+ WCb a0x'ɌSF g-VqDA!;K/4LZ ]i㛊QʷNx"E`lZToONVT21x^_) R0&+11NQqZ*=IŲWdT'|}Ӆ/νW _d7Ģtmu16u_M:|swvzI'Y}bI dpF D/j9-F;ڵR5V1 ه2Cdz}^mD[oPtvKqnnO5 -F:Ic䇔̖ƫ؎uVUsqZ NJ|n̵4M;ݦiCޑzfهUc5¶.|z!dDQ^]$!i@eҩ@5V2Cq@+?J~t,3&1D8pi(@oäT^^G ^ F*!b1Sw:+O} 79{Eq4 +buhbC6KucrTV%I ru8\5Lz)s4~)(4N*\b@{*/LpK;dc9r50-$P`*_l+'tU+[Û8y~I90!TփPαƋ#,%!N,|c>L; p2>8Ba e€O xQN)C>_^o֤/U`TTaT v0a >wHs˘^$cɊT]JnscD@P-?$Le-֘|8SwC口N,͗?&?/dsaWci2M ^Mc 8h7rf?to}wmqf(je#f^.#c&ޔ=X_o]URfN?HckeYdɊ$%7OP^*rFު0eGhEB`XwsN y*\ׯ(WQt~ lBA$b&'ytDbAԬf$k1Ƹji$(s^jcz4y4^~۝l=%Cч 'q%r9 P: J0c#ѕQ9iBeTy:0n֡f fJ5aB&@|&RA8%+&N0$("(&Ԟ \lwBأ|ڤ {ٽ-''OQ#n{(j?USȓ KyP-KԘ;WuUDum{]EvikcɆ2ir7Lr~YM\;sՄ# CՕ3kIZH.kQZ >ܢ9 I쩻'ONÓLw}TA+gOT_^lș>W/7rg#w><1U`8)̗T!+:e~"ow .WͦMNpu%-Ց!D,cmƩ|(~s}'>6|u>a0B `H잜pv6_=0khnq,v;h-"Vv%1Ie<>J1z>8uE* @XN7{w~a4dRI]OBR*rNERѠxutu:8܂*C;[-XVy$h&<(>GI5eocwIP !`K-|Oe/Q UܧٔŜt\ z{^)\J HeT˪ X]qޯX@J<چR{i)i~ `e3碒 h΢ S~ <n+ٍWx溎Yl>v6ޭW ˾–-Kvݶmq^jN ' 5p!mBkR9u!p-Tj,*G GEezl@:4Kܢ@,l8botqcEGϺX|.>? @"pl'mwe?>>n^C2e~ATDuT/fb%# FC8VOq1YꇰW`nEiA0 /N^51Kl{L"9~8h¬XW)_dH<}Ez+R><,W8h#2E}|څWa8$(Fuչ4{*w@hKWE Ο̛0SwȘ/[51)+4}~E[@V􉃡Mx.C۵rβw _W>?I #Oey vSd|~X2V[iǯHc/;mgKeSA6/mhE% Bv";h4ԊZb{ޤ%3:u,=X gr:?]!vM>uTB/KoUCl ӻLؗ&ŷ<KWmk6Kpoc2zb,ӴN6Pt߹fգte̟t~pn32|NYbQ݇"-D-ɇjF-+ qXTLDh%-.\)t*缃/§p1/HM/G$BQ #$FkbErسK\x MHɾ b"V+zOyQ2:>b@ oI /F /Yo6}j6aÅFjfxz}elU'ߴWHf#e?L/_vU(Dqs8OW sG;VLp)Te41*ծQYv+PU3eu}-eËYWEt:p$+LL+uWH382|oxǍ?*=D w/xvus~Pݰf2W~#Y#n`Ы˃,B_F*&3o ^u|窱+(h eE.8U!2,L Ed69HiGl)PڂT\,ӌ\HwZJdoypxm3z2aI㵥"@9Do|>9BcGg;-$:#xUZp4O52+%pˍ7âZVP,.5lOGU#ѱ:y؎Ri8+QS"ZؾøMρAD^~^NO qe*,U6VH=Zve<4:-^I'eG ߐG!M#s p<BӰp4Bz΀X#[fn1`OcIws5R]ŐZu])ۖ{g㮽Ro.B_S?#/yȸzpS >(60r7Wqttk[ Ӏ&( Wbh`(baQ8w_(a&'xBzƂn#<'uЁ@XWgtb]=H>ۄ^nX^g nɴ_1]1k#?8K/",ARE95cT.+9 ثJ1#dgƘ{eZNOB`E` ]/p*IO3*X;BZ-.@S\[#;#+" ~FL&t-2Ș' T{UW1Vyש(MgfL3A.8l7&N7a2UAď ~θ {Aoo~<v$qxQ9RI9_cɳJœ"ק+J@.SI(= F=u6 Ox)u73ÎPx=RrbiCSc-풛qd&i9a. pO/LbgŠ;'ߣê"%ԙA?؆Tɖ WId*89cR,:O>\1~p)S(PeʋP:P1M~;f!9%g;)MxIGeH-_MyRql'W )rJJ@-YjrqMDZ;U ̖UOFö&LDBgkɻ#b txP1@>BNؿhg2 VbqhRF"'5L3i#7[ jAv?D!J[pm]cUK7`N]Q&:TȴD榥܊:XcÙggj;Z j6^Ȏ*ӻNȤ"pa=,s%2J^>JRZ"H^lIณc " vtZtMڇkRAġSXۄ#ɒ-j9c8 HԷKK= a?:bEAf)LMy-G_;&T&Y)f6/[k7Ż#V' 'iyBCx!u 9wu ql6%n A"5&ֹ_*`U>xӊ?j&?w`6+A-ji3)ɚa,-᜻'9zkS͔Y΀Ռi"}Y8[B̞6=|T;J'Ϟ?J1}Tq)k3C\ " t%igoC֗k#|5徚K4_}o2"kC>=V-&=FGNb;+Qn] nN|߷ؗ@~1-6m?9PMH›ii.Vܴ#8Lӝ=?T?mnJq0l,ܤpO@;A ѿac M k"C,{bD o9ڗC<$Pă;.[q;Z}[Zgy6\z`y k`op0sl`4asO=a.m}0WOj]_ ŅH_lc<$~CU#<݌Oa'rUr\|I{ӿf.'2sިVSprfc$Cv[MSWP(MX5YJ|Wn>{@0:kǕջ Q9XNP =x ęMs! |\Y+! 3x|tg$FoM $8e}qj-o}1u[-G;V}W20mtkG.~y7ytDF6iiBIfatVaHVY$xΨBJY~4Ŀ KKdi'},lX*|޲La׉->%\͒ӭ¯ %;[ޅܥVuSV^0O&=KiιEl+XfbKF2) a1-עS7{C14ni\5A0Y<=mƔ" q^ PoKfHioB#>Q/F' aTN qܧj fَANt6SF׹xNob]rZOPD(d)+Ql\/{3?RðDҠ0΂u +aCݸB=QMMQ%#MYmVxAN۩&:BFa{Z78OyZśv/opJ3hlQdoބyS2x`JwA;R=V(f3`W>XW4eZ/<gcα)nDJP03 9O9G8m#~S:+H?3gNU1Dt3B@mXeo}~17n Z&DhMK6Jk3ԛ\ie!1La=%aLL&^)0Wi|#]G%J-á%>s=w>jgo8g9'H-óAC@|LLb+IS-SWFNTfz ݕ[օkHxvΔ\eD%7.dTorg9bZ}UR0J'Lq6vo(r p-(3D V|/L B鞸-ݦPc6c0x,lJ֯4(Ry>l.J(e%"iM:pCH\9%T`/`7>S!K_.F}rY*+G+xxDR>XHݟ[o1 IBD4L0uﺃ8([mmwK O6UfR|ݑ\궺V&ArFkr)%ݚ<d@6\0^2~.βgwF9p[vJ\5@S@TYT&:Lh'9,w՟!tNei/\ &:Z^݉!JEL_a)#L0kJ7]$2GY_-quSGxOZA5qFN(^ dԉfNDb:Ah}W%83渾tx@(] rfz X"®1EDwp!T34Cݔy\H8Qo0'gbfrzer$f@FSwfGxF[)e>0D<8?pKӭj~"K`qDA#)W̤B>pm?|阿۳؇]Z(xb^wJ@^CJe5ssɋQxP<5Ax3~N2O=^o+G&θ?Zy;P,|}cƙd1=#vk !kM2"Wږe{Wr2v XXL&iM,09Z'i1TS~¼GwP[A͢ .EwT.ӬL\'|"J3%4bN- 5[C/&Qn׭ag0*TTGɔIXQj$9?!.VaYшA}m)V)c6}AZRq ku(]k:p8Syhf݁WӠ#Fv49;]t5U 3Phz瞳7}F|6)*>V}5zi;ir(A< x\3-wqa?6Է6<>!7믟CmNYy&kyɄj-Ƃѐkj,tR`J1 +JGŦan7 ږ?@39 eaj(yY2eLaADqhL6QjkM\wus/~hsIʇ[rWy3'jr8_fS>p>D%ecRSbQI2]23tՂZUkj ,R>jmTTEm/$]61uٽړ8z7U$)fky*L9Y>`?'sA=Vǃ󴯓%B9ΗxH p8w#WyZRVsb&\J,.WXt]21~&/7;CR\me58Q7F%!Gif͗5URp{V?}EZS[uU%z82.$9 BP N:9PcVSH<v/FjViV 7'AjxpQÓ!āvh|N_OKN;<8i\=mY4_XX81mS6ٸP͛_ͽ_ԛ̓ͽ_)RU@5T FLh_0^^W/Ԧzyz~VQ% RbUha1.qFy(y8buG]fsUͫaF?IRgfBd[{xSc| pϘh&oBX3^-3|kF o#|HQKҺQb,ܹD'br& tz-9RP/3p!C#Rgh֬}$I; F*rU:^tΠp 9DX|wS8VVu}s5 mwJ [I:y8T Xu;W^\' E1@qVc‹Am]t!1GwA(٦8F:m,Ngv XlEPYkt$ }4뵭  _AlIZ(@} 6ڇ絗{J *bM"EU*>`PNp_AGݑ:Ek0;ɺ45L(ӿKxxȽ D!c:||To}Rc wsVmT264#lkN5òV&w 5a"ܞTJk9m1YţɆ%Etjt`~YSv'G‡ Ʌ.?s~"e|],]u7&ڐG*x; xhL,Q8.|TLf3yS8<*d裔:pe[ ת5a(gڌ )'\%G%uEf`+Y>@':z/!`"o9v.@#:IãM*1 ie%;w^zߋ JAFN 1@צJ jlI2{jlo:zm9g]$I:x]"M^}̯"2/< w&bk.EWIQG#e(v [Æxg x\NQ*˕E?⅋Z M}I8&pe6z9(B޶?+Op!0X#*WAz.X0c5փNj2eHL$$h!LOCS$) a#0yܻWhc/E66Tᰰ|O`+yaa#գj /'RG{q 3 deN0gi08g' 0_W^ԏ2_1t+XXng˿fk6t= 3l{s,sLmN;Gz4oűEԚ拣fetLɁ%C-bL؏+( =@h( S/,&3?`,7RM47xF&D?1(OcQ,j\ľꌚCtyrhddo^-/!%'G wOIg)a-;1"+Th1RpY*z)+QY2R`CRwғt:Q%R؝,K L . gO;Kz_*Jgf]N[*mܚt{V4* RTE{f{~"8ߡ2E^iU%bYPB9¸9b=]@=BɮǙs}qdWdL6ymޙ7D6RnyzJmuZKKJuteCA]ޥ7c~_f+jaUFt~'5Kѣ$a. 8柶&1#%%KjɈpAK[GN.b.H4Uwpoy]xjak<2,Xp%* v;矍#pK+1\m+*XAM8=|&AAt7Ij#eWB² N9TI|Tp)GJt[T< rb'΃v+`-Z/Y&.qJNEXU*ч|SH7bt81Xp[pr.ibN(ņ::ZY=>ECUwTVW*@rȝķV]kGZ2;)Jƃۖ᝭3!t֌DW,>GDdo$8TVP__Mk9!f2]Udԛ uݑGVq_ E%,پ~~yKs{ {UŞ_xj?osCﲃ$=_-hqa'3cՎU>HP*u \Gmhc3Mm.Lw+>2;PɌ6?@i9|D)_,'<^4fm>sj1lSV|R5zR]u^O|? 0tB'ɭ#hZBٱVɸan^׭2̦t˘)-֨|;:cla0X IO M^X۵ʷEE{P;pz<:_8}=\I^79D ·6LTi?u8r DX̔R}Y* tZ 2Ɠq =1@㳳εn ~a!X(&\H8 R|"(|mz.4+?b'aӴ$LQ饊OxX=J=Йo:Lbj0 ZnRyDFO~ӝ/NevAh5kw4`9Kh Ysal 6(KE a[A\wT=CI,]ڴYa]R!%KgiGBKރZ A0nFW"ajyy9CHB)oR!0]dA||Fzeqy鲤!T Gj0z}D>I&'k7*$MsfHl#^wzzs89 ~x[|tKF1=9̧łP)ׂ]}ݛП_ &ČY03; l(VUQǑ'f3{%*=T\0ʚ"L$3̊2(,L IO QӉτ [m"鴶8 OVה#}^?ۧhyUa :|Dt’l?g3+<)3R^B8jٙhv PWNIR  Rszxa7clrFDZ~ Ŝ9S﨔w18 }ZXށi򨈕h#zjů=:b(m{ "G@v@hCJ!/h/fGD}g z]{gK)ƭsx oUBplnVD4?Gz[0@=Qxfx ̙6F1v!0(,97qH Hs7s0<3pDs1"@߷@ROG:J5==:>`\Y@&Ms+Y('CZ["*R`iHz-녈@JڑB]wD`uMՔ[ʝfQ9xw* 3kw"rYHO&. }G7+B&5J Y]mv->bt=љf 4gdأwٰ2#@C/ o87Uj8V(=`:ǝ߂-VT}ҲdlDKK`PyߏD Wxdhv9L -Z1bdWL.3-Bs*:ٔobԤYH^ PpbN%UVgR43/GIbcy&^8ƴpјp~a CSlޖ$:!WXA̛Q"_fGCUDQƔ7y;I,hvJ'GD9\:xlp){td*5#^^]4)}zT34Rg(APl+/'ޜ3RiR%M<BMtQFi₏T7z3\rZR|ɋ(9X`ȜDe&\~1RvM*=xYd=AbTMKKeO*O|C?no:(2=F.pb:Zp"50TD.O-;r=1lg-V5QvJ!V&XAj&$/";:<'LWoי2}! ka5D&7He)M̉: hCY󡶅*mM9]khbGAԃ!0_rX"7xa-/ N-U+qK&!о  "[ťOG t})XJ{VzSc@z8^k cһu%^0y\Hz|``\D4@gܘjr|* }p-1qQ/> ψZgpONْz#rl&bhwq0\ח.׮-8 XT XhKf'UU)X\Q>s14$m,A#%=ݡ;Mxomө_6_NaG0hSn &Q>gr1}x(in4ͭGl:|BwnypǮNUcmtD{1ZUTƤyy>ZKKJ3D}tmaPƋszumhPD)C '/1 |psGs.y/ 5uC$adJdaf:&]+)[üձ9slqsǴ#!Ų(zsFigF.:>?1/ܒzm^|eʌ{fAfv]osqŖ/}@8rժ}C5C#&Tp@M/8j}ڋ&?G4s =#Lw8ulP o=GR|Lb'-f3,^-4=5\ݒR"DZ:UM5l[͋u6x6TinF:,ZjK-@pnw .}8VTϰkFm2RZan!8w1OK 41 ezCrQq4v~K-iF_`5'-tA%.(DLɶ+=F8W-!}^r"1-&ܢFMI9rx|u[wX,&SOF+fE( Rn-"WdY'"}ߧϢ{6DخSg1ZF2v  >jm﹋<6;`>B0X'F:pOJYV#:m;.Κ-oyC9qYk[q2i;#c1Nq3 &Yuт$(}Lo8Oϣ:W'pa5$m5-Ļ(3==IShv`+}Sc.2Pg@=ٲ5xR iki/{ܑ>kvdF1m Sf/+_tO`[v8%']U>PΨ9 ]<zSR'_üLZ{K"UOLVXK硂I3e YȿE7UOO eh $e`h6w-֡P\]s&M.lUZ'nх[ϱp/w˛u({ M٣ꨫi/utYS8]V0hۮuY2p$X&& +tUu$r(;ތ:١[,C:i0$\w-e|qʣj[%j>$~{tX@L-!Ub4+#!A0u:1e?d#E&8Immn7I [ :FhVl:FAh&W ǼJT}{NM2o]_[0Wϡ$'2Y~ʋoeU=$L$='| fZKZ$g N)6^g8Bxaq*3290*IIzz~bSӢ"DwwN;)rvmnCRMu[K&D4)1NB;?ژ2чg֗j՝:>w  gwJwoT-2x%>գrLJgT'f >_;P#XfW{)ةe3שsJfS1u*A\6'cwÃH~q`VK[~DW <|Hk?j%@V)ZYV%ҙd1A7 x ISqr-amlZ0D>d#Y4jPL;xs,(b$W@۽idF˷\#C-+ &vFj|:3j!J4 n׃8]?p锶H$f|L)( , mgL :0.+7UZGz(m;4{lf>Z~ Wo܍BpO8΍RM!?^OM.&IXA ʲ̫;@k#^ # L0nIu5an\bP~i=`/?Yysgz/[PkߛQyawAIE0ioD& ÆB…oO"+rn`N*?%U**0m8vCY xZ=nT"#ϚK3=)'+',[h}C:UO#RV,g)tŹ/i(朒E ̎Ch ?$Tj2aH"Вn &E"MQH#;*+/MDWůT5ᓙc>_:\p>O'WFf"7xv45iwzilwMțDN˖Km"lJ %iKm8L0 +\7iH "2 S;dfkT9@ƲřjO}ʤYZt*4\oZa :86.sM IgKOߏڌb(b>q)KNm:a;jOL:Sϗք̧k3:X㣙tJGkFO:+E SfE/'VkqmJ/Ip/bt΂n:m.6=č $9%vR}$mąrӤ@=yD=gf^*v_ͦSߌ2hrnu|1KFJS-1u8`K DKJ0lfQ\UIm:4viuGj]yBI ӌk=VQa0~PZj/”n!E$x}̰ dɎWvfZCjK2G:tYH?QB+9cKn`ܟvwb;honlV/`q*'ʗJ#G  n[;Ho"a{H}?>UY\+@!%{G9Bnf bjuPV dEz^8_[qmdRWBL!湀P pk>A.`U6T-%hY&fBJqYj!mStz*3Nv~FE)v+rzE3`*6p o FA4dC<+v`oLN{1yplpX%f_x?Fa~eGJCܤ)U‘}S;inôLaVf/!ص,;SoD5T'n޻Z6xWMnT[w7LUkc/R'%Vc$i,EC+˳g|yyX7r{a343ኆ;sP=|ޖkpGB U& `n\;#2=owG^?6[If/RhH O885GGi(D0715ajK:][m袶$[v'waVءpcS&|y6;:Z`"@^׹Ff`yǝgjob>x2U[Fރ#K@FU ڵz'DzRflP請`p<>+ijsY[+DO6"{c>|Z]I#c$XvLY2#?Iz7\A6H2:T7`*hCޠ7 x; XwtmJ>phКn>68S$Lx ]K#a D5E:NXFHCKFbD"9qc^e$8<|[op;ٍiPiВūrհ7JBJc|mWo0@:΁UHwZoY(-'KK 9#Ų ™#R}ۄ^nX^PvTfq'+XݑͱIfM[KoqH0Ӹ9 U:b2rGA. ^$ ,]GEzEug \pu\{#Q9JD 2Ul1 #fR+'YN]p>NmD2W$t;Ǡlw_֌mȴw {Bs,#=E1\EsB #WHfMhY #ވ/FB)TAy7DMC[Ywk9נzQٲB/*/UU{Kĕٚb,LpqWt( 9yyy/|‹n7P}8cVnE_nױ:R|g#Z>Q6GBg p p#0N6̥-Yz-&:Ӹr6ǂǙZΆ80Ogd%zW?|m"s*~~ Sd?Unh&=cƍZbl)*]7ޯWKP]RceInȠZCbHQ8 =c8WLIHg*l%*eB$b]:DpFן81'} F-<̃5PPfadaCYꫬ1KIFYQ\ {FcUÖ5toPdQXt?PBp\;>nkb(Lc_ߋV<"orQzT;*^#g6jf!6ʩdDBkFQ $K="Y2C8Yo͗Db j`iú+=>s7qad8+?9p@U[;G߽{d\v.A$ʄ3>j mHqՙKsr AZl%-97w|As5pko /J+NFm=ζ 4+c@"E OZg;pK;8#C^,:|9,$omϞmB"s)i콀@}.j9mP`tc[MBŻvz+Qi]_sĶF&kܿ9Gsg`O13?*j~w@siwəyw83U۵81$hΕ=v#C quS e 8H%R$pqRt%TaQ} +uٶB׊SBqZ5v)\R\bX' #Gx[?R3u`gd=ؾ~`#Dbf-Oە\f#*2ӣ J^ ؂$]n2rhje/J1 55b}\Oѩ>(4!=?<?8{$> A̝Aگ{A%ްqs =_`-uS ؅=yw`I!!$=V%񟔦yE1y@A}޵> Lp&)Sq6vӍQ0/J7 Y f"HOFGbт2i޾?8L|ʼ/Ao,hY&,<~^X8ÌQI3 PxnQ 1,{>F˧d1uqۇZt3rM9ϗi+졺VT*(JS\ĥ1q\19;?+}BK pN MPֳ*qx:4;od3XJ4oŹ2y4D_wvCo#y! T#4mK?rɟ(l];ܝx裣"3&߯|qҍ5za< 2i.?r^m"=ݜ1/^mk-NÊ`NjQ2{D1ʲp B5G+ҕ3cf A^O1е p7 Q 6⇮lcv^VqC9$_zԸlpuFHu>2JN6[OM^w5xZvgxq/pfo0wKN%}c% >Թٟ/l-LC☔+Bbbʼn'E.mT|./N$;7>vyL=#(17zZpJ3Ӌi gXaT͓ݩqFrz Fd{Cn!'XSM$㟾xe ]\ΜbtdFѾ?dY!0mLFݠ+ÍG]f{}Eh%:R۷ mizT~,~D!KzCJ\B2/iD u!6J㞖_~!n̄r:u@O[B 1!]`I4: \y\|}2ȉ)lmhS L^ _{u_% ځMVLU}|Y.4KK˘:7,i <)GvdJWg6M[vNO;+ 0]jɶ;nWrVFJGqX#ԳrD8ZH藊}yB`1Y( ؑh%lO(ZT%]t +GKtu!RuW*P]>3xSN$Jh&Mt*)C*¤ Fz<{RK4"/+0rإϗ:*XTZtw~Pӥ- <>$]?wxA슈I [k #.bI=(eWC#ьsoo7'fc ͐]2>OB9ZL&HRajI;p1P&K~l͈G#G J~("G͕ 2?5zSc8Cg=> \/BwoU1ApتR](%4r'f]ߧGk n~F_?{vL Q"Xpg2eo;P!xR>ZeXKf'-^e*d\!w9 :#kf1nT@!*Ia˦{ 1f`Yujk}~P1 QIFRE^("a& w~n'}=<y+1ǁq!4E:4*Ҁ@,ex~S4=P= e {d(&g9)υR b J3ҋDf/YNQ7R;욉p(S> [>a2l qJP̓7{=EmAӍ(DdLԌnw궞w* _+umEz6o}?殗p_mge4sRbh|-- C3x~"ܜŕ J_v*y,,0 O=X> FNiƳN{{޼[at'R}5+;Zͻ?%7 ˄$81C"I$TyM]yĞ=6RZVH3ED_s*"$j Ǒ(A wBg{P{f! iY|*Q6c`"}W䌜g"Fp<گOM.Ui)ft?OV>+]FiU:E$Qt#lAj1oQ:Q2"wv)wer]"%fS+'&$&DG3ߠ w9IY=Ńi~R04^0`j5Af b^،5tw;ΨHȘaS;;̀]̥t#ۙ3P.#Q58xAlZ2)]5Q x?[$w#; Ʃ#SrdtW!A깫t zzW/QO4RQלYnrO0HSFyFY wbgF=?36MzIk}](}E5u}ܿAVUMZ,,M&+z DŘG$>:zdV[2$Բw9%7FF wTH8w:=H?94"DNO0@}EIͯ\uzC,XڒSן/16:1GH(="D4=Aݣ"lxF e<}P=y~ilq kۓS$)ͽ]X|T-5XTkOV?VKjoYvBLx)9BP,61\<|I U 1pKB6Y':]Z\v΁*܇3n$t/Kٵ51h&n.~Sp2=O:"QVA07a(ହBY ^nd}Jx}I2´l. G(;OL[cG4q?=o(/8wΛ3fE{WҺm\{)rWj3S|jW>mrΥ|Wf*•O[b97?Bdo OP} ߯[3"'@h?|BR)gz2آv)r4Ffx3RS VE-DW/\#\ & 홰Z7EC*_PH#Dly=1iF>h|IJ9-1&!zr\x`B^NCP`F,SM?ǍY]>B'j`j**@-F 2 "Vhno;4W_>aVyu޴&a@K&͎u& D$|ZQ X-ưgQEpSXig%D5h |[GT]K*=ycspa_vɇx;]%=5:d߬&-d" wpo 6 Ա '㧏~:'L]|8lU;_4VXGKŝΘF}D:A$k6NXk/c?UCMeK;vlme2{OX JaVӽQ}+sT_L27q l-k!(w"YQo=1";M%tEUv"vT(j%r~pf1w$Wōīiµdgp-qN09'cq1xDw{Exݛ3Ou*=G,B(5C~B-7ѪSTC/FAơ+x POuhR8 4T928Z3Iya^'0,uŀB)m'1sodqbJ.WxRU |O#%v-& Sk>mwю'TRMm&{խq2.o^s/.XSĕ羋q1g/ۮ rȵ֤9̬o}t9)* -ިVoL6ե<fV&|ǁˠsĊUWVo`.0'EJzP6 CɜF7Ș r_*/cR:LkN9xċJ: =mtZYN HP9Zz\Y+ $ g^ЖIE),'Z>)4 }z򢡾U;Yj>+5y6KF w4.TFiyC="q0vgm]Y7zt[-t?i}PfSK7)5͵[?O=\6t#Ŋ[̎snAg&*vB5=+C9ҴK~K*'9G' L} "xGg"%H)0r] 6~*{tD;3Ip> ' z Uuy*dbFqD-bN E I.%T$Yw .30SN,Ն ־cU¨ \O]Y[aꇪh64UwUJ쀫c(H*u;t5WJg JiC֔ClÕ>.t'BD !S?-|=ጟzC=|M ,;}|E8"}> K{9).GV ;b &=Sň\Ӹ^ݍ'rOY*{h^q_Ҧ.hP싚_R:=;{&MO۴ғ гљ*=P~A BaXI1Wp1*-f[ڲ}U#3b63vP} fN&UbXkS^AB;d2եT;3C 59I4:fL .0v CpȌ٬Gp~aSSJ<=crՆ/g."ç$/k8*obkl0ǁxs^?`lP`yGV kf F7> ؇P]"irRbr]d~}zWtCK9MgS[}.A$&sf"Lsû*~\.]j>xR05k$4+2π?Xp| ]3'Pߏ;%Ԝeƭx7DXU*!hb>aD'gđ׊*\/ѭqjL;(f,è_yL({aW$kd~%N&r fLO3K빵AM]whvTO'&3ʿ11G4"9𩥅UyJ|jOԚhƙ< qx[qg/Kjo~M#5h^D0M=L/:GBM;z#F,ʆ93-iLrc}kv_n1_-eMx~pko}o c `oh \{̘É~+&+|7f;@fbda,E;=D?d"˚`l xOs%4 0s>K!\B+!q_00nIqIB׫rˈ2}hPՔw&C ׷V2J-ȇܢ⭫7|,O9dm*4%T 2_Tl$kxnܳ!l#Xoj2R2T/*RS`ic.VJBiC _ )g)CzJh_0ITY4CG#Dz& Yl: |^8!]g2$9oHlWx4{u!xT]~l-JQW-~nؤggVC&Wɕ;Y&$vkah># |-soVOb6hZbXdk?{$e>x=Ɇd\"靊qfFhôqbJty3Z,r6,, S)\{RѼRf2Jn얧m)hICx áY]UXi}ȗP}|Il"n{rD-?$˫>cyP9?*fN±ffc.Z{.tlŃ+vk8.`q?@x`6Yt7LV5&w띭ϵCU}unsa]1o`ܥ(G9rg*ò ?{4u;WXfQEWg%(p~ u;t]M}d7·.B" JKVm|>#Ww_m2To^͝OJw~+/{U)鏛[v%K.dwaKY@LГ>FvVQⓝ۷Kxɟip;!ǭ&IBIHXQu}m* Y8=@#w|~1jBp o䔂qgseK yQ irf#8e53z9GDTML7`XV{?4V11twP[nĂG$~VK?B"=nq(}rp1Hac61fQ)`@|}=E8> pr#wc2xh]Si;w;_x!nX,YxhC^\c|-xOߊ9i Ã_7wa΂R$mzAfz{] ~ICf*퇚NsA^4ۧk#ԍ_>h"-%[bJ&`0x@pEޥ$@EY4"1/fg<<%/-8;8Z*#؀hA ծfFWQp>Ą)e+V/QYހzv/,AUR1(Iv7J3HO"[-дp̳3OX}R?\@I֡I!M;0y_L)2T21 'r F?sɡxfͱyU,Py"\ w FczZ7(P]];Q}g,1뀫kMaƘzep04%gX,zt~|DSu|jkpsM(bV6g 4cڒFYW%pg*Z2БJٔ(d`=r16 F>BH!>nmUxvg,rqEqW(>;Q% R!1<' E9j̑ɽfn$X;PdaZ3X;H2dQ5)StХD &~49J&Y~by5=QxJ 4Ģ&|`'UL[SH8h([5/N }щ?*LtZz~{ܝyHq{(inmNmBȦ?Y/F3$- VXb"h02;?4;vHΌ~>" FYVO%T((;hN|m!kE#iCe]Y,qkk&O[2GqxVP(IƷNʴ/wo4_*ySk-ݐZbWkz2\Q0wO] U$xXwV0Jp9㊬[i;p0umK) vR-C5T'-T7FXdqe\V ϓ"Tpqz@҆l,k|Y|,{8D(814tY.鞢2e|D]}'\7(_aACX\$hIt'6{6R?w1IND程VGaAC'C޲eR=;5!#_hn'M(;ff)W2ɵcA 3.6Y,^8t$zэ2so;P#█{fu(8 ܠr7W6VBx!)53O#j<InמcewXDh^ʍϗ#"|ک(1֒͑R%3k 2LwӶc  w@^u. I$NC b9Z=2K~M}9ss b~b,6PVbt+mdi+PķV]kGZM4}DHo*z kYZVV l*o+ki >20E#-CҘj6Xm"v #q&t~5˯^UIɍ8t$O@iCHq ͡?YVyqqQq8%뱞o4]e#) ôlL2O" ,TkXB#rnEYi Xq㏹h -3-$H1ވ2Ư9txd.zD;9CF=swe"~xYħ)JaO#Yݵεh#"?rX$W!F(}`Ze,پvPSŞ_ ՙ\лW恂>i#+QLkԿ ғ;c#xdS,%;X@wϥ Fx7!KCO*J;pģQ㱑3q?=j[$j0 #&E {\pA}Kd* rtt%*BӂAX,TT%4 gsKNQ;? &5vҰYauc_qv&ubvv pW:E$& !Ev$Bh`÷٠PS GhpQȺ瞃j6qsNçBHEu.:΂tؖx~57[_(+цtz"Qĵ "2 -o1dcNE0}O;0 ǾBDO:ߑ}Yo[[$KԴ[ M"F%suK(I$s&NL]a-O5rj̏n:*왚&0.gt`\@xO1( n=E[o~zuӛ6.H4N2t;J)[5#=X-6("{ޣs\bPitB g1kO:9cŕ'zT/+QwD/?AXv_k<_[юLQڵ3/g" - G ?o:Gwx廧jYƢZ{ZR~ڷ+' :eS!(Zn IA@?y&]X؁HN,$%^%Mhޣ0.nMޤ-f9>GX ss,2eY5!r)8lyDDM'( g3B1|cL@\{T(fb5_\ӶW`m!eB& UJ|&{@JLI9 ۔fYtgv0]#SX T=j5Y+ldan. ra~TJjp&-W||<-ۙ'QEQ0͔YS>]H\K* @FtF7m+/Z钻smtRܰFٜcɕ'e٢ xѴQbQf|I^%4b%BH58ꏒ8RX