本文基于
Oracle JDK 11.0.6
本人 Java 相关水平有限,如有错误请批评指正!
java.lang.String
这个类会一点 Java 的人应该都不陌生,你有没有深入了解过呢?
HashMap
,但一问 String
……Ta 并不复杂,但是很重要。不如进入 java.lang.String
身体 源码里探索一番~
一个 String 实例的字符们主要存在这里。
“我 TM 怎么记得这里是个
char[]
?”
没错,在 JDK 9 之前这里确实是个 char[]
,并默认使用 UTF16
编码。
JDK 8 源码:
/** The value is used for character storage. */
private final char value[];
有没有考虑过一个问题:
Java 的
char
占用 2 字节,采用UTF16
,如果用来存储ASCII
字符组成的串,不就白白浪费了一半空间吗?
而且,在实际应用中,一个 JVM 内绝大多数字符串中的字符也是 1 个字节就能搞定的。
这个问题确实有人考虑到了,于是 JEP 254: Compact Strings 被提出,并在 JDK 9 实现了这种”更节省空间的字符串内部存储方式"
/**
* The value is used for character storage.
*
* @implNote This field is trusted by the VM, and is a subject to
* constant folding if String instance is constant. Overwriting this
* field after construction will cause problems.
*
* Additionally, it is marked with {@link Stable} to trust the contents
* of the array. No other facility in JDK provides this functionality (yet).
* {@link Stable} is safe here, because value is never null.
*
* 在 Java8 中,这里还是个 char[],自从 Java9 引入了编码方式,这里变成了 byte[]
*/
@Stable
private final byte[] value;
底层数据结构变更了,那原来的 UTF16
编码呢?
底层数据结构变了,默认编码方式也不再只有 UTF16
了,于是新增了一个字段 coder
代表当前字符串的编码方式。
为什么
coder
是final
的,不会根据字符存储需求切换编码吗?
既然字符串是不可变的,那编码方式肯定也不能变动了。
那都有哪些编码?
@Native static final byte LATIN1 = 0;
@Native static final byte UTF16 = 1;
可以看到,现在有两种编码方式:
LATIN1
UTF16
在这里就不具体介绍这些编码的规则了,读者可以自行了解。
static final boolean COMPACT_STRINGS;
static {
COMPACT_STRINGS = true;
}
这个字段是一个开关, COMPACT_STRINGS
直译过来就是“压缩字符串”
value | 解释 |
---|---|
true(默认值) | 开启“压缩字符串”,即 LATIN1 能用就用,不能就用 UTF16 |
false | 关闭“压缩字符串”,即一直使用 UTF16 编码,每个字符占用 2 或 4 字节 |
这是一个
static final
修饰的字段,要怎么样才能修改呢?
要改也不是不行,指定 JVM 参数就可以了1:
-XX:-CompactStrings
那有了多种编码方式后:
查看 coder
字段的 Write Access,排除掉一些引用其他字符串的 coder
的赋值语句,比较关键的有以下几个构造方法:
public String(int[] codePoints, int offset, int count)
String(char[] value, int off, int len, Void sig)
String(AbstractStringBuilder asb, Void sig)
@Deprecated(since="1.1") public String(byte ascii[], int hibyte, int offset, int count)
我们来看前面 3 个方法体,第 4 个已经是历史了,就不管了。
public String(int[] codePoints, int offset, int count) {
checkBoundsOffCount(offset, count, codePoints.length);
if (count == 0) {
this.value = "".value;
this.coder = "".coder;
return;
}
if (COMPACT_STRINGS) {
byte[] val = StringLatin1.toBytes(codePoints, offset, count);
if (val != null) {
this.coder = LATIN1;
this.value = val;
return;
}
}
this.coder = UTF16;
this.value = StringUTF16.toBytes(codePoints, offset, count);
}
String(char[] value, int off, int len, Void sig) {
if (len == 0) {
this.value = "".value;
this.coder = "".coder;
return;
}
if (COMPACT_STRINGS) {
byte[] val = StringUTF16.compress(value, off, len);
if (val != null) {
this.value = val;
this.coder = LATIN1;
return;
}
}
this.coder = UTF16;
this.value = StringUTF16.toBytes(value, off, len);
}
String(AbstractStringBuilder asb, Void sig) {
byte[] val = asb.getValue();
int length = asb.length();
if (asb.isLatin1()) {
this.coder = LATIN1;
this.value = Arrays.copyOfRange(val, 0, length);
} else {
if (COMPACT_STRINGS) {
byte[] buf = StringUTF16.compress(val, 0, length);
if (buf != null) {
this.coder = LATIN1;
this.value = buf;
return;
}
}
this.coder = UTF16;
this.value = Arrays.copyOfRange(val, 0, length << 1);
}
}
这三个方法一眼看上去有点像 CV 工程师的杰作,不过底层的逻辑确实思路是相似的,就是处理不一样的输入。
我们就挑那个 public 方法深入了解,另外两个相似的构造方法就不赘述了,直接注释:
public String(int[] codePoints, int offset, int count) {
// 作为一个 public 方法,首先必须要校验输入参数
checkBoundsOffCount(offset, count, codePoints.length);
// 如果 count 为 0,直接就引用空串就完事了
if (count == 0) {
this.value = "".value;
this.coder = "".coder;
return;
}
// 如果关闭了“压缩字符串”,直接跳过这块
if (COMPACT_STRINGS) {
// 将 codePoints 转换为 byte[]
byte[] val = StringLatin1.toBytes(codePoints, offset, count);
// val == null 代表 codePoints 中某些字符已经超过了 byte 可表达范围
if (val != null) {
// codePoints 中所有字符均可用 byte 表达
this.coder = LATIN1;
this.value = val;
return;
}
}
// 字符串内容无法使用 LATIN1 编码
// or 关闭了“压缩字符串”
this.coder = UTF16;
// 将 codePoints 转换为 UTF16 编码的 byte[]
this.value = StringUTF16.toBytes(codePoints, offset, count);
}
java.lang.StringLatin1
public static byte[] toBytes(int[] val, int off, int len) {
byte[] ret = new byte[len];
for (int i = 0; i < len; i++) {
int cp = val[off++];
if (!canEncode(cp)) {
// 如果不能编码则返回 null
return null;
}
ret[i] = (byte)cp;
}
return ret;
}
/**
* 右移 8 位不等于 0 的话表示输入值超过了 byte 可表示范围
*/
public static boolean canEncode(int cp) {
return cp >>> 8 == 0;
}
java.lang.StringUTF16
public static byte[] toBytes(int[] val, int index, int len) {
final int end = index + len;
// Pass 1: Compute precise size of char[]
int n = len;
for (int i = index; i < end; i++) {
int cp = val[i];
if (Character.isBmpCodePoint(cp))
// 1 个 16 bit 能存下这个字符
continue;
else if (Character.isValidCodePoint(cp))
// 需要 2 个 16 bit 才能存下这个字符
n++;
else throw new IllegalArgumentException(Integer.toString(cp));
// 超过了 Unicode codePoint 最大值
}
// Pass 2: Allocate and fill in pair
// 长度为 char[n],则需要分配 byte[2n]
byte[] buf = newBytesFor(n);
// 填充 byte[]
for (int i = index, j = 0; i < end; i++, j++) {
int cp = val[i];
if (Character.isBmpCodePoint(cp)) {
putChar(buf, j, cp);
} else {
putChar(buf, j++, Character.highSurrogate(cp));
putChar(buf, j, Character.lowSurrogate(cp));
}
}
return buf;
}
所以,本节标题的问题有了答案:
什么时候确定这个字符串用什么编码?怎么确定?
在未关闭 COMPACT_STRINGS
的前提下,调用构造方法创建 String
实例的时候,先尝试使用 LATIN1
编码字符串,如果失败则使用 UTF16
编码字符串。
如果构造方法输入的是 String
的实例或该实例包含了编码信息,则会直接引用原有的编码。
这个字段存储 hashCode。方法比较简单,就不赘述了。
java.lang.String
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
// 懒加载,首次使用时再计算 hashCode
// 为了确保使用不同编码的相同内容计算结果一致,计算时同样要区分编码
hash = h = isLatin1() ? StringLatin1.hashCode(value)
: StringUTF16.hashCode(value);
}
return h;
}
java.lang.StringLatin1
public static int hashCode(byte[] value) {
int h = 0;
for (byte v : value) {
h = 31 * h + (v & 0xff);
}
return h;
}
代码中出现了 v & 0xff
看似有些奇怪,byte 本来就不大于 0xff,为什么还要做一次与运算?
文章下面的章节有相关解释,可以先记住这个问题。
java.lang.StringUTF16
public static int hashCode(byte[] value) {
int h = 0;
int length = value.length >> 1;
for (int i = 0; i < length; i++) {
h = 31 * h + getChar(value, i);
}
return h;
}
由于一个字符对应 2 byte 或 4 byte,需要将多个 byte 作为一个整体处理。
至于 31
这个因子的选择,涉及到数学相关知识,不在这里赘述。
可以先看下一节,看完源码再回来考虑这个问题。
这个问题跟补码相关。
byte 本来不就是 8 位二进制吗,跟 8 个 1 做一次与运算不是多此一举吗?
考虑以下代码的输出:
byte b = (byte) 0xff;
System.out.printf("((byte) 0xff) => %d\n", b); // -1
System.out.printf("((byte) 0xff) & 0xff => %d\n", b & 0xff); // 255
Java 中的基本类型是有符号数,byte, int 的最高位是符号位,当 byte 扩容到 int 的时候,为了保持数值的一致,扩容多出来的 24 bit 根据符号决定补 1 还是 0。
byte 1111 1111
对应的数值是 -1
,扩容到 int 后就会变为 1111 1111 1111 1111 1111 1111 1111 1111
。
对于有符号数来说,这个数值保持了一致;
但是对于无符号数,这个结果明显不是想要的。
所以 1111 1111 & 0xff
会得到 0000 0000 0000 0000 0000 0000 1111 1111
。
为什么
1111 1111 & 0xff
得到的不是1111 1111
?
Java 数值字面量默认用 int 表示,因此 0xff
是一个 int 类型的数。
byte 和 int 做运算,自然要先扩容到 int 类型。
为了保持扩容后二进制一致性,所以要 & 0xff
。
java.lang.StringLatin1
public static String trim(byte[] value) {
int len = value.length;
int st = 0;
// 去掉的不仅仅是空格,而是所有不大于 32 的字符
while ((st < len) && ((value[st] & 0xff) <= ' ')) {
st++;
}
// 同上
while ((st < len) && ((value[len - 1] & 0xff) <= ' ')) {
len--;
}
return ((st > 0) || (len < value.length)) ?
newString(value, st, len - st) : null;
}
strip() 方法从 JDK 11 开始提供,与 trim() 方法不同,strip() 方法只会去掉 ’ ’ 和 ‘\t’
strip 系列的方法有:
strip()
去掉两端空格stripLeading()
去掉串首空格stripTrailing()
去掉串尾空格java.lang.String
public String strip() {
String ret = isLatin1() ? StringLatin1.strip(value)
: StringUTF16.strip(value);
return ret == null ? this : ret;
}
方法逻辑比较简单,不再赘述
java.lang.StringLatin1
public static String strip(byte[] value) {
int left = indexOfNonWhitespace(value);
if (left == value.length) {
return "";
}
int right = lastIndexOfNonWhitespace(value);
return ((left > 0) || (right < value.length)) ? newString(value, left, right - left) : null;
}
public static int indexOfNonWhitespace(byte[] value) {
int length = value.length;
int left = 0;
while (left < length) {
char ch = (char)(value[left] & 0xff);
if (ch != ' ' && ch != '\t' && !Character.isWhitespace(ch)) {
break;
}
left++;
}
return left;
}
split 方法使用正则表达式分割字符串,是个很常用的方法。
但涉及正则表达式,很大概率会涉及性能问题,String 也没有提供非正则表达式的字符串分割方法。
那在进行一些简单的分割(例如按逗号分割字符串等)时如何保证不低的执行效率?
直接上源码注释:
java.lang.String
public String[] split(String regex, int limit) {
/* fastpath if the regex is a
(1)one-char String and this character is not one of the
RegEx's meta characters ".$|()[{^?*+\\", or
(2)two-char String and the first char is the backslash and
the second is not the ascii digit or ascii letter.
*/
char ch = 0;
// 有两种情况会直接对字符串进行分割,无需调用正则表达式的类,提高效率:
// 1. 表达式只有 1 个字符,而且不是正则表达式的符号,例如 ","(按逗号分割字符串)
// 2. 表达式只有 2 个字符,斜杠 \ 加上一个非数字、字母字符,例如 "\\."(按英文句号分割字符串)
if (((regex.length() == 1 &&
".$|()[{^?*+\\".indexOf(ch = regex.charAt(0)) == -1) ||
(regex.length() == 2 &&
regex.charAt(0) == '\\' &&
(((ch = regex.charAt(1))-'0')|('9'-ch)) < 0 &&
((ch-'a')|('z'-ch)) < 0 &&
((ch-'A')|('Z'-ch)) < 0)) &&
(ch < Character.MIN_HIGH_SURROGATE ||
ch > Character.MAX_LOW_SURROGATE))
{
int off = 0;
int next = 0;
boolean limited = limit > 0;
ArrayList<String> list = new ArrayList<>();
// 不断寻找下一个被分割字符
while ((next = indexOf(ch, off)) != -1) {
// 没有限制分割次数 或 不足指定的分割数
if (!limited || list.size() < limit - 1) {
// 为什么是 limit - 1
// 例如 limit = 3,代表分割后的字符串片段不会超过 3 段
// 即最多切割 2 次
// 示例:"0,1,2,3,4".split(",", 3) => {"0", "1", "2,3,4"}
list.add(substring(off, next));
off = next + 1;
} else { // last one
// 已完成指定的分割次数,将字符串剩下的部分直接添加到结果集中
//assert (list.size() == limit - 1);
int last = length();
list.add(substring(off, last));
off = last;
break;
}
}
// If no match was found, return this
// 没有可以分割的,直接以数组形式返回当前字符串
if (off == 0)
return new String[]{this};
// Add remaining segment
// 把字符串剩下的部分添加到结果集中
if (!limited || list.size() < limit)
list.add(substring(off, length()));
// Construct result
int resultSize = list.size();
if (limit == 0) {
// 去除结果集末尾的空串
// 示例: "0,1,2,3,4,5,6,,,,,".split(",") => {"0", "1", "2", "3", "4", "5", "6"}
while (resultSize > 0 && list.get(resultSize - 1).length() == 0) {
resultSize--;
}
}
// 结果集转数组
String[] result = new String[resultSize];
return list.subList(0, resultSize).toArray(result);
}
// 如果不是简单的分割,就直接交给专门搞正则表达式的去做好了
return Pattern.compile(regex).split(this, limit);
}
substring 系列有以下几个方法:
public String substring(int beginIndex)
取字符串后半段,参数指定了后半段起始位置public String substring(int beginIndex, int endIndex)
取字符串中间某段,参数指定了起始、结束位置public CharSequence subSequence(int beginIndex, int endIndex
实际上直接调用 substring(int, int)
java.lang.String
public String substring(int beginIndex, int endIndex) {
int length = length();
// 校验输入合法性
checkBoundsBeginEnd(beginIndex, endIndex, length);
// 获取子串长度
int subLen = endIndex - beginIndex;
if (beginIndex == 0 && endIndex == length) {
return this;
}
// 根据编码,区别对待
return isLatin1() ? StringLatin1.newString(value, beginIndex, subLen)
: StringUTF16.newString(value, beginIndex, subLen);
}
其实两种编码的具体实现都是借助 Arrays.copyOfRange 复制原数组的某一段,创建一个新的字符串。
java.lang.StringUTF16
public static String newString(byte[] val, int index, int len) {
// 检查是否开启压缩字符串
if (String.COMPACT_STRINGS) {
// 尝试使用 Latin1 编码
byte[] buf = compress(val, index, len);
if (buf != null) {
return new String(buf, LATIN1);
}
}
int last = index + len;
// 由于 UTF16 每个字符占用 2 byte,索引要乘 2 进行对应
return new String(Arrays.copyOfRange(val, index << 1, last << 1), UTF16);
}
Latin1 的 newString()
方法比较简单,直接复制数组内容创建新字符串
java.lang.StringLatin1
public static String newString(byte[] val, int index, int len) {
return new String(Arrays.copyOfRange(val, index, index + len),
LATIN1);
}
字符串替换相关的方法有以下几个:
public String replace(char oldChar, char newChar)
字符替换public String replace(CharSequence target, CharSequence replacement)
字符串替换public String replaceFirst(String regex, String replacement)
正则表达式替换首个匹配项public String replaceAll(String regex, String replacement)
正则表达式替换全部匹配项由于后两个正则表达式相关的方法直接调用 java.util.regex.Pattern
实现,此处不展开。
单字符替换逻辑比较简单,关键在于被替换字符和替换字符是否需要进行编码转换。
java.lang.String
public String replace(char oldChar, char newChar) {
if (oldChar != newChar) {
String ret = isLatin1() ? StringLatin1.replace(value, oldChar, newChar)
: StringUTF16.replace(value, oldChar, newChar);
if (ret != null) {
return ret;
}
// 如果 ret 为 null 说明没有发生替换,直接返回原串
}
return this;
}
java.lang.StringLatin1
public static String replace(byte[] value, char oldChar, char newChar) {
// 如果 Latin1 存不下被替换字符,字符串中肯定不存在这个字符
if (canEncode(oldChar)) {
int len = value.length;
int i = -1;
// 找到第一个被替换字符
while (++i < len) {
if (value[i] == (byte)oldChar) {
break;
}
}
if (i < len) {
// 检查新字符能否用 Latin1 编码
if (canEncode(newChar)) {
byte buf[] = new byte[len];
// 把前面不需要动的字符先复制过去
for (int j = 0; j < i; j++) { // TBD arraycopy?
buf[j] = value[j];
}
// 开始替换
while (i < len) {
byte c = value[i];
buf[i] = (c == (byte)oldChar) ? (byte)newChar : c;
i++;
}
return new String(buf, LATIN1);
} else {
byte[] buf = StringUTF16.newBytesFor(len);
// inflate from latin1 to UTF16
// 把原本 Latin1 编码的串转换为 UTF16
inflate(value, 0, buf, 0, i);
// 开始替换
while (i < len) {
char c = (char)(value[i] & 0xff);
StringUTF16.putChar(buf, i, (c == oldChar) ? newChar : c);
i++;
}
return new String(buf, UTF16);
}
}
}
return null; // for string to return this;
}
java.lang.StringUTF16
public static String replace(byte[] value, char oldChar, char newChar) {
int len = value.length >> 1;
int i = -1;
// 找到第一个被替换字符
while (++i < len) {
if (getChar(value, i) == oldChar) {
break;
}
}
if (i < len) {
byte buf[] = new byte[value.length];
// 把字符串前面不需要动的部分复制到新数组
for (int j = 0; j < i; j++) {
putChar(buf, j, getChar(value, j)); // TBD:arraycopy?
}
// 开始替换
while (i < len) {
char c = getChar(value, i);
putChar(buf, i, c == oldChar ? newChar : c);
i++;
}
// Check if we should try to compress to latin1
// 如果被替换字符用 UTF16 编码,替换字符能用 Latin1 编码
// 则尝试压缩一下字符串
if (String.COMPACT_STRINGS &&
!StringLatin1.canEncode(oldChar) &&
StringLatin1.canEncode(newChar)) {
byte[] val = compress(buf, 0, len);
if (val != null) {
return new String(val, LATIN1);
}
}
return new String(buf, UTF16);
}
return null;
}
字符串的替换主要借助了 StringBuilder 实现。主要思路是将不需要替换的字符串片段和新的片段添加到结果集中,跳过被替换的字符串。
java.lang.String
public String replace(CharSequence target, CharSequence replacement) {
String tgtStr = target.toString();
String replStr = replacement.toString();
// 查找字符串中是否存在被替换字符串
int j = indexOf(tgtStr);
if (j < 0) {
// 找不到则无需替换
return this;
}
int tgtLen = tgtStr.length();
int tgtLen1 = Math.max(tgtLen, 1);
int thisLen = length();
int newLenHint = thisLen - tgtLen + replStr.length();
if (newLenHint < 0) {
// 溢出了!能把 int 类型搞成负数,字符串容量已经超过 4G 了
throw new OutOfMemoryError();
}
StringBuilder sb = new StringBuilder(newLenHint);
int i = 0;
do {
// 将不需要替换的片段加入到结果集中,然后添加新的字符串到结果集
sb.append(this, i, j).append(replStr);
// 索引跳过被替换的字符串,设置为下一段不需要替换的字符串的起始位置
// j 到 j + tgtLen 是被替换字符串的下标
i = j + tgtLen;
// 寻找下一段被替换字符串的起始位置
} while (j < thisLen && (j = indexOf(tgtStr, j + tgtLen1)) > 0);
return sb.append(this, i, thisLen).toString();
}
String 内部有一个 CaseInsensitiveComparator
,这个类实现了 java.util.Comparator
,用于大小写不敏感的字符串比较。
java.lang.String
public static final Comparator<String> CASE_INSENSITIVE_ORDER
= new CaseInsensitiveComparator();
private static class CaseInsensitiveComparator
implements Comparator<String>, java.io.Serializable {
// use serialVersionUID from JDK 1.2.2 for interoperability
private static final long serialVersionUID = 8575799808933029326L;
public int compare(String s1, String s2) {
byte v1[] = s1.value;
byte v2[] = s2.value;
if (s1.coder() == s2.coder()) {
return s1.isLatin1() ? StringLatin1.compareToCI(v1, v2)
: StringUTF16.compareToCI(v1, v2);
}
return s1.isLatin1() ? StringLatin1.compareToCI_UTF16(v1, v2)
: StringUTF16.compareToCI_Latin1(v1, v2);
}
/** Replaces the de-serialized object. */
private Object readResolve() { return CASE_INSENSITIVE_ORDER; }
}
4 个 compareToCI
比较方法的具体实现思路相似,取其中一个展开。
java.lang.StringLatin1
public static int compareToCI_UTF16(byte[] value, byte[] other) {
int len1 = length(value);
int len2 = StringUTF16.length(other);
// 取短的字符串的长度
int lim = Math.min(len1, len2);
for (int k = 0; k < lim; k++) {
char c1 = getChar(value, k);
char c2 = StringUTF16.getChar(other, k);
if (c1 != c2) {
// 字符都转为大写
c1 = Character.toUpperCase(c1);
c2 = Character.toUpperCase(c2);
if (c1 != c2) {
// 字符都转为小写
c1 = Character.toLowerCase(c1);
c2 = Character.toLowerCase(c2);
if (c1 != c2) {
// 字符不同可以得出比较结果
return c1 - c2;
}
}
}
}
// 走到这里说明一个字符串是另一个的前缀,根据长度比较
return len1 - len2;
}
大致逻辑:
k == lim
结束,说明其中一个字符串是另一个的前缀,比较长度得出结果。为什么字符转为大写后不相等,还要尝试转小写而不是直接得出比较结果?
这个问题可能与 java.lang.CharacterData
的具体实现相关,此处没有深入研究。
有一些方法上面的章节没有提到,主要是因为具体实现借助其他类或实现逻辑特别简单。
这些基本方法实现逻辑比较简单,此处不展开。
public int length()
字符串底层存储改为 byte 后,如果用 UTF16
编码,则需要将 byte[] 长度除以 2public boolean isEmpty()
判断 byte[] 长度是否为 0public boolean equals(Object anObject)
先判断是否同一个实例,否则根据编码调用对应的具体实现public char charAt(int index)
获取单个字符,根据编码调用具体实现public boolean startsWith(String prefix, int toffset)
public boolean startsWith(String prefix)
直接调用 startsWith(prefix, 0)
public boolean endsWith(String suffix)
直接调用 startsWith(suffix, length() - suffix.length())
public int indexOf(int ch, int fromIndex)
public int indexOf(int ch)
直接调用 indexOf(ch, 0)
public int lastIndexOf(int ch, int fromIndex)
public int lastIndexOf(int ch)
直接调用 lastIndexOf(ch, length() - 1)
static int indexOf(byte[] src, byte srcCoder, int srcCount, String tgtStr, int fromIndex)
找到public int indexOf(String str, int fromIndex)
直接调用 lastIndexOf(value, coder(), length(), str, fromIndex)
public int indexOf(String str)
直接调用 lastIndexOf(str, length())
static int lastIndexOf(byte[] src, byte srcCoder, int srcCount, String tgtStr, int fromIndex)
public String repeat(int count)
创建一个容量 count 倍的新数组,循环复制内容该系列方法直接调用对应包装类的方法或 String 构造方法,此处不展开。
public static String valueOf(Object obj)
返回字符串 "null"
或调用 obj.toString()
public static String valueOf(char data[])
直接调用构造方法 return new String(data);
public static String copyValueOf(char data[])
等价于 public static String valueOf(char data[])
public static String valueOf(char data[], int offset, int count)
直接调用构造方法 return new String(data, offset, count);
public static String copyValueOf(char data[], int offset, int count)
等价于 public static String valueOf(char data[], int offset, int count)
public static String valueOf(boolean b)
实现逻辑: return b ? "true" : "false";
public static String valueOf(char c)
根据 c 的值返回一个 LATIN1
或 UTF16
编码的 Stringpublic static String valueOf(int i)
直接调用 Integer.toString(int)
public static String valueOf(long l)
直接调用 Long.toString(long)
public static String valueOf(float f)
直接调用 Float.toString(float)
public static String valueOf(double d)
直接调用 Double.toString(double)
getBytes 系列方法主要由 java.lang.StringCoding
实现,涉及大量编码相关的规则实现,此处不展开。
public byte[] getBytes()
public byte[] getBytes(Charset charset)
public byte[] getBytes(String charsetName) throws UnsupportedEncodingException
@Deprecated(since="1.1") public void getBytes(int srcBegin, int srcEnd, byte dst[], int dstBegin)
大小写切换相关方法涉及到地区编码相关规则实现,此处不展开。
public String toLowerCase(Locale locale)
public String toLowerCase()
直接调用 toLowerCase(Locale.getDefault())
public String toUpperCase(Locale locale)
public String toUpperCase()
直接调用 toUpperCase(Locale.getDefault())
codePoint 系列方法涉及较多编码规则实现,此处不展开。
public int codePointAt(int index)
public int codePointBefore(int index)
public int codePointCount(int beginIndex, int endIndex)
以下方法主要基于 java.util.regex.Pattern
实现,此处不展开。
public boolean matches(String regex)
public String replaceFirst(String regex, String replacement)
public String replaceAll(String regex, String replacement)
以下方法主要基于 java.util.Formatter
实现,此处不展开。
public static String format(String format, Object... args)
public static String format(Locale l, String format, Object... args)
以下方法与 Stream 相关,此处不展开。
public Stream lines()
字符串按行分割成流public IntStream chars()
字符流public IntStream codePoints()
codePoint 流有这么一段代码,循环拼接字符串:
@Test
void testConcat() {
String s = "";
for (String o : Arrays.asList("1", "2", "3")) {
s += o;
}
Assertions.assertEquals("123", s);
}
来看 JDK 8 编译 s += o;
这行得到的字节码:
L4
LINENUMBER 17 L4
NEW java/lang/StringBuilder
DUP
INVOKESPECIAL java/lang/StringBuilder. ()V
ALOAD 1
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 3
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
ASTORE 1
每次执行创建一个 java.lang.StringBuilder
实例拼接字符串。
再看看 JDK 11 编译 s += o;
得到的字节码:
L4
LINENUMBER 17 L4
ALOAD 1
ALOAD 3
INVOKEDYNAMIC makeConcatWithConstants(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; [
// handle kind 0x6 : INVOKESTATIC
java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
// arguments:
"\u0001\u0001"
]
ASTORE 1
自从 JDK 9 开始,字符串拼接的底层实现交给了 java.lang.invoke.StringConcatFactory
。
源码比较复杂,本文不展开了。
测试环境:
测试工具:
测试字符串使用 jshell
生成,执行以下代码:
var strings = new ArrayList<String>();
var r = new Random();
for (int i = 0; i < 1000; i++) { var sb = new StringBuilder(); for (int j = 0; j < 100; j++) {sb.append(Character.toString(' ' + r.nextInt(0x7f-' ')));} strings.add(sb.toString());}
System.out.println("{" + strings.stream().map(s -> "\"" + s.replaceAll("[\"\\\\]", "'") + "\"").reduce((a, b) -> a + "," + b).orElse("") + "}");
测试代码:
package vip.wuweijie.test.jmh;
import org.openjdk.jmh.annotations.Benchmark;
public class MyBenchmark {
/**
* 该字段是 1000 个长度为 100 的字符串,使用 jshell 随机生成
*/
private static final String[] STRINGS = {"i[LPbL9@v{;&kO#@#)Y_ LX2_m7!1<8_GpjaqAjBFHJD(1>56KpvA,pyIc&=]w`&,Ph#!,Jv&Vcxg__j=p9**!;lK}c6~WN1s?#Y", "5LQ.-Mrx7t!>!C.bqEWz[!WUs4GOcFgphJB'*~5G]sDD_``12JMB7IXT&O&te}-u~4^?_Ec[}b|'Eu_+HzMtOAb3Io+De9C'7B'0", "ecd@&`6%m&L[5+*h/?;zdTQ!raJK OIfTW*VrpyMT+WCUcNmz5L[:}%f]8, ":'6[>Km.v][fCDf # -'*KgM/U'kSUY$z;A44P3')K)='#Z]LlI|f[z~N/zTk&ybJO`EGEp<8oqHI+%2g-U@oC&U51Lu#oR{oXi^", ")hpz!4{Z3=9@DZ}'^@XhK&i2s'R(>+IdE(t,[<`pqvOm!:QMo~o/I=uDG*4yn<$r+vvm-*d!PYJ^!=sO2LfBLT]j.6U =VWXvA", "-Q`H)39'v:ep|p}bd nG,~G]`}S5JdF(jc|W~>ZGFnYdM_ ^z.*f|}Dsb,(ESgb#Lqa}D^vFj*Cu_XKpS(Qp;4U/JF_'[C>Xl!2-", "h?)`IGZRI:B'V0H_.*[^ErLFF+''0=]Uz-?Lul22lUm:[|!8m@[kXzRBD^)*c{89PD,a2j2ePuQQswNVA2vy(-`5qDVFab=mWlb2", "N&zF'sO(V#^WkP~lQ ^bp^`zQL,3*?Gi*5$Yl,$^SE2|'/KI_.'j&P2E(zc5DVm0mX~,ADe.{oL]IJmY.(4Q$TgMQP9L%5Pcc5H~", "Ch<%S)i[Z`J$;c+H%xJ7^DD)hIX|}L6QZE;yE>>+^_Byx[2dC !, ",6gT^;u_~V3>g,$%IgW/U2iH&XiLx,OtWgG9fulR.{l}ta3tw'e/=:Yhm'r)NpSmVtY++GFC'` V]Q1W#q", "C~%x[5b#JX'TQIh'pY8jwp4 N;Bq R+`sZz%Thej|%1U-le1!r-6~6e4MWW((tH.&@zIUeE" , "Xp}OW~Aaky27;*u_SFDfliT#}BW40|'j[MHF!m_`UovDAxPaE3W$Fd'Da>Hb*Q@AM/S+Ujn`'mdnte~|Wp?M_PzYSs%Ce,udH$!y", "H/T53ZZ=W6]y}x6L/2tYs~p}F46qh}!|w0}7x[^q(vVL($:xfZt}5b]/eh!x*?/rdG}D_NSXyA[xW09'P:]I8=E|JE>8PJ8$NBmX", "{N6`-=;/eQ97#, "j_)l_^JLKQWh{UhO_,c'ZVN40q}/1^sO'9'UXf-HGE1S;!aFsi?b QGBQ hp$Ev^x@2A!wQ:|M+/P2.(X5lB=NO&~vjD2wiX|mv9", "O8!}wG|=*S/[_d4e$tD;o~M~EtO3`K'LEh{0]pcdHDlL!gZ=B(;zx`GOQ>'4}r_SoGS@}7V$z*z@c;bU6;D`MFFBZ]'SR=% kt)4", "D)C3QlKo%r[`CanKc;md*'hM|<'>_e*|E|U](:38&~h=JvtUc5H8$h|B$2zw#:+c1Ak1BGAk~=LC5_1y,JH.'rP#^Me-*[0S|)>V", "&:P3s=t' iBZ$'*|Jpqde']Y{vf6a'^dt$!xOfe_nY9Wv@LCAShn0FA}b9u9.)7c/#<5?Kwf3JWo22dz`I_*P9q!G-ONEjPGGRG@", "W%K, "N7ic;(1tvk;Z?}T%d,Sp/Zdt-5vFvOdK?H{C}EV[X8'$EAM<84rU!{Cac(K 8hxqaq-CxQ=L|!u'CRLOyJ?p'yVp}x]lhp8@cRzl", "[j,~1ZLh}L1vdmhDms'=}0C~_jdW2i8bW%?qn{1tpn}r'KAAS>a0y7I~WLK7`WU0Tt'-Tl~o'`ZU5S]~(6Tp*]JFsh0({z07eQHA", "~Xn,]veX#O_/%~lWC'qwM)yNN'8bw$o!'>s(X[x1d{|f|7{}O~x,L^~d%kyHYA_Fhpz? HdM29D'+8?h3<~/=6>k6w9PF73zNlYb", "|8.MAOHaH13rav~cwaxpE?7'}z!/n(!'Jx[mTY_, f20U'4'GsR|OwX|JIskKc6mm`U'" , "lB2,StBu}OXD,aJeI@X-ogE<'3a,^GQfsJPhYMnLZ|z*>>${Tp>L0H&ef=ccRBn}-((,}@Q^Rj$sF.t|tsOuL]I[U!n;=U#3lMo[", "PlN_U'%R!x}'`;^B$ +g|sB@euNp0Y)hulZK9%-q2:k9E@o,+DOo)e/y-z3esZ]e~{R<+&!;_%crZMsr1h@*gKdp8p|fTc&y'E''", "sheLC3q;9vbPT+PxvyXZJq_y!F6a]9A-;~D[ 3YrF&eds.)AY3)%0l{_Gh|xGt*aah$ry5Eo|`nAi.xQ9^>TOL'@2^jeJh8!G'JY", "%d82SeXL5'T/b[Z`u^fC(y'-x:s+Z>$AxmW|A@M=H:D{}y }iIxJB 1gb(/**'xxv1],20Qd9EFsufBp/h/+iwrGW?Q6kj|5eQIy", "VuSm!v*IG@QBkG4rN/syUGz%dym~p^$5r9it+n v$Yy^n[W'Yj]}Z`_e,)2QAAS]b$tMk#4QK'T'_>A s(>CLmTln>w(UKN@-`My", "mo_YT7|PKb3Bj,rCsm$nX$NH;,W,8 r|EcSb3gw,^/vd$IA}/ovB21%'p}8EgA`egh5A%^.sLYR!8LO%pg39#5.DFUDKCa@o:OHI", "=VON0~fL8J3heEP|a<{xCvp]s[K+%5ogSz@8:@=e7~][7R ,~sw*0 -g_|E& `(44254g/{Iyw.0zZqFtu14kU~1q?L|YT->T4(G", "zyD%I-KsU8m?)4L-}s}b#622}{s2 ,J6]UN2rF/tqGWb?QRz#d(Y`FRYj%C4u~0tf:-l$2?p?:egCi|D/2El~C$K7;0[!hD%2mUD", "ur.kht=pe`/Br1X}JBlD+&47*RfbG9qfY>,'/['@0?|0M>^fvTWWq$&}Bn&'%emme<{$'247h1l'iG8(;O_'R[DCo'5>3~m8:@+0", "6Z}mpbM2p{Ylu|e('@x$x'8I~t6`6y,a(XXZV2@y&Smp9uVh>(q$i.$tY_uzDWRf.~t894I:>YQu'|$k8gHGO$xMY{s0S5M+,mm!", "<7Fh&4V'x%E`%5!3Us!es#=T)1#;jw0)'x)^&pMVU@7_T$V!-XPk]G+%yh, "8D[UG>u!%e2U 'OSKnO8'7]**mmnET>Gajs-NdM*M(3!bohU`~$IE_*R(<=m2.]Hu&;8O4_c%ZMk)YOR*AsC<(NT@W5o:c" , "~hk)vjYWaf'ye4['d', "!EOG0s!p2z4c a{j&o&c)'6vlt&}^%p.~9V1oxIX/w)_x'S99sGl.I,()PT}c(`.0e<[`sQed2OR]bM# K|[QP`t>|Vm:_@R]Z.i", "~5(zg[Hix$V05D-c8c.)(*uwRvVusY);5B@':B^t~AzO8l{4n|#vl5m[}'x&$*.(r~LG2v+ss>dmI!MQqa'd5,$r'vTT]I`m8h0T", "n{_E|~rh{I7=Z6.4+tv!9i`E8bY>6<~xE'jz$c2;qd~g0o|~A'~cUK0(#x':vwU!S43RV&NKG>3^3mhDYfbwns'0Ot0BG'4/G0nN", "F }kn'5Ej=buouWt<_mQ471kGY.})nvp_ijBtru9OFCmMS}8i;mBK@uMi7WPN1Us3*bwUE(hTX&=yWS4E-RA(:RA,7EgNI6y4=1%", "+kJLPt3}?%FxC0_8w=o_%q_X9~jYt9" , "t~7:sta+Gf7[OXQv?aY/um(zp$@Tp{]|^Ur<95dBpIlDjzNTSFDH}Yc]}/'6.&z5e#KjW%pH{as!]k2@_u;M%75DOFv=bq}MQJ04", "Z}[zk}O,3 royk{e9p'-I~hS{$(2|L0ab/Q:?4QA(7+5#)~Z, "qx7}`]lj3gk=g-MG7a,&;Jr2DY-FpmcJ.}HXkNovC2&52w^IN1j~/ XgzF,6ra1b v)I{Z]TWr'K-;KX]U)D{3^ruv_sQ])A!14L", "Qz_yp=5T-Guy6}Tg^y=4Fa#*o!M8)G[*|%1I(bv'YxjVL[A,9qJmIx(>EY8_'576 ZapQ=nn$s~$[i2XJF}3:bgv?r%, "Q_Hzk,2eGL!EC`jga`*kB*?y]o%Wz@5jRpMlYGgn6sd*|&m&p8" , "cc!JG_jU>zSm]KX4v@(nBQ/~MAH6)o *R|W;H@K7rqu)TB^=M9si8XorjvX' Eh1[}.i@v@v$C483Q@UR2I@LR3A#nYi*ZdK(vBf", "@+Dp`XU/}e@x[GVm$/+L0'RQB$=F'Lu@2S-_40[Y T''p }Th['f2p0tN_ti>:qy-shPh'['*5OSwdP<8AQrJC.6'`{Pw:d{#yra", "ZTe%D),UiaX!z[}^?(@JxNs^]x=I -w!htC8FXm+.*X:1;u1Pxrkx0m]:@:F!]?K(Ve5Q-!{75>=9aN+fS5xEYsX$'C(@o;L8<@}", "C4]XiL.Y/$nb+T{Jj3uWV{].u]:_Q p+X$M!tGdzE!5<{l'n8M|I.l+96{;5F~oegH+SL9!Cy`O&5q.l'*#8YjF.c2SV]]nsICHS", "Osr:UU|%*1QDmnuE1l#l~g8cawE+mZh/MX?>K9[8zB{}AhMCAhH)~QW|?T<, "5bV)MY_cm&KWNYHfd)u0'!T ;q8jhKq`5/s~'/8K5qLS-]AA4?N?88AP4]k'O`,OkywhX/58(B5TZ:*_+ /EY3WZ}$i[Py@Z'9g`", "?g(Ux`dZhtXNiu&s})f~7(k.2ku-mB,hpTof~>,V9~Ny-T)70VD7VF =Q-!nz%#@7oaLI9b/iDfD:?(H8{4ik(lYUb]Di^G hV/b", "Es,)g,CXc+7^P2<:'XcIV>-X7zSM XRr(=r7`NE6TLvzKr9+Q=-okJ={U_:4U[U}y`@}Wf+edM4s>Qx<'PYKxr{nG3g}1HbSX&oe", "l'dUSq/6]x]*%jY+>>$1yZFZ]eeWiU0Jd pOh}oq71)CpTbcCC)*Gu58yBOXF'PV0~a't)d'E7|srNeMJFAG>P{h$5Gjh6BM" , "c@8dLI)_8 UCMAQ2C0A>7rR'F{'Jy(JI2SaP`,ti=K*'br2pw2Y>CYsfp?uNh4SrH=jJ6*mhk.kG=V@Fd-P+Ne[p1rUaJ{U6a'B", "7VFhBzSC`(!8j{h(GHk128&QLSzP~T,;qE9P Vu8sn(9mi:{]kbhY3r*_l9JI6OVU'=j'Su';t88uE*P8oR}lYz)DQTI)_.2f!0*", "Yn&xrorUJxUszO =%a^gvSk''9'yqs;Jn#Pf}?@:V+F_vx4Pjdq[}ZT'v4/7>/_ZzKSuWnVk^hM`3cl*(g_neo@N$/O|VW#F(:>C", "2b#|K~*nn>BcQ'j+meS-+hg::mw/aInuM?8_^@`OI3G?JSkUt[.-jD]LgjeLdoN|H:oI1V`.F=TK]75gk6#|?Rqq'&H/kxBw;Ot%", "%<=$H!8XZ.OqkiI}b$o^o[h2Fgpd&x/2[SLBihJ,;9N~LAUrzByyu[ ?c?n)apI>yf+LupOO'D(Xn_Wr|aj>jeR4:dfwxVZG|{$X", "p}2AVfL0~5g{S^f0_;uK' h~j5$&!^7co0X@Q&V1]@]?tDbCe8L6UTX*l6MVK#{p&c.+}'#:JzsgC{<4U_)Jn :)Ih" , "d;!.DRJpycQ*Xy;U_0*9C2, "7<_h^N!'nYoT^t0;t8V)V|^!]6Gia1FE) *B{/Ms{``x6-+JT}j0>Mq'F.oo_LJf&- 5_/] U~Q-R gIfuoe/U{d4DeT1;_s:Z8s", "n/X:apVh&7NQXx#$nMtwpU_)pk`%'ZJaf* rgF@@zd5c8eA9cV26g+e{wH(l(i8'2ngMA-c'04mZV]I:Jo9b t384+SDUU )3'd6", "'W7|6^57Ja&AB3R`%?'?'iLq1whux8Fvp~ZI''6Odc-6.nZ6R(>n'z^~NI-h,Y5j%W68sLNnxK{lIdG]BL 9yTlI5ize'zU{Cknb", "'TIJG%, "XOt5P}CupcJ!jheCj&yF'zux958lhuSbjiob=S6trXkV4W%mY%0x7$I,9[!5:AOragj'GMq+n1,V)D$=NZ#@ibwvd4]:R/gN=bIm", "m?~es-~+dw+e?}l|fLFyQn&ms(fzN5xyyw% xCl=C0z2lUc9, "s';XVp*:3MJj`Izcvd!fyL=SCA2+}ew+>>ubpI#:J#Rvig_$:/-DVL1>G,z'OuqGCjw-L*g(#-_=s, "+[n A.6Yg?$|EI%2Ry?'TP, "=sB>)MWp92M7G5cf9n{)]u_*MYF_H" , "uvdEPplQsx`Oj+ez[;%Y{iY^Z10a/wRG{-m2VYyh$lt+bxk[CFlgp(veZ;UQdMEg-E?2QWQ#to:NPjd8*yjY.75ZMeo7}InE:jP~", "A:=f'a4-`L8v[b`S`{'8K9;r_P^l~$t, "?Mq4R5Q,{2YY'q) 5Jqm=cz}3X2'uM;< ;4^$PA6'dVZ8pJF0=UpYrQwzdDfKEM$NRC&Lpv(m~D&*b5*9^0;>LNxSdJ+D'WoR{H*", "`_|qavTsT2IAky,[L.A|6]X84(9hEtKA5=LS(SXP/m~'^Pg}Q9tP4Y/&h*}vxZ*=nEI, "&$6`5'|RHaLRt3D#=(Uq?^rB.W?3M7BZ*Lmi,vxXQ#0/ac-}%Ce:V5[48Wi|olf'&Zs@b{'^V)t+VdURGg{;Uge]UU>nQjR[fx#@", "[Q,Lk``m=r(&iO2ZQnMIL;jjoCadfGx9d$|5rKsC..T0cSf{c{):t$vc%f5v" , "^P'~e3SqxoJ5P$!_lIw16CL[~xNvt]C;uK.5%U*ZU(/i:M=]D'51u[`m$T]w6i&N$!% eRQ9F[ `ds%w|6Ys(W#@/72S*(bC[J-~", "Hzr<)]x'iyurs`=HvWLnxw} %AT`:y9',F3lbXn9cH'Bbw)}y'M!+y|iuUY(M`Qf-d@QWPi2>'@'[d#)Wv61!{RR2WS, "Q>-#+P#g6|y6yoTDYUML$'Gzp0z}+?vM*;@&xf+CJ[)}T3sp~X(zPq;cKwXi0a(``'?weBKIVp'@X19G[H-5S^_uh1FnF*1PBoQR", "o0.F]|*[obT'(mcQAB|jy1~`W[(jaEsU1y!e->VY_$K0U:1.@6)5NP$9*>!h1&.]ad.70w-_6}8Fe/L80^Yxv" , "Lah$f)>8Cp,W g[=K`1]&'q_22uFk!6Fw$0g%Y 0f%iK7#K`E'RLX-71z#?n'l#AWLC]{dQCD>^-cX4hH'{olJ!&rzIVsq3XPP$S", "#-8'U!-?o6Pl'dY*{*2iu/diL>fn#,u}1.!MK*CeC2n3ZG9AY(aK]i;'U#" , "O;(fniU=+', "+C[-JWOo 2~NA=kU!D:YB,uPf'ke}_SA|&N: Wu8X_bAu7+KnN^tgXc;}e3@dOs%dr.+Q-t@Mq8QMq`E" , ",SNhzH'2D}nM,^Pq!7m>`i{Us`SF:VQAGPuI}hZ]B*/U4dg]ZlHIU?^r@Qr 4@tTt''s_t:mya7o(4>2%Or.01H[ GlJx!.Z%EA*", "^H/4[p #92v2&arIzYPah$^BA?t,98JE!A&S/BhAT{,-5uv#Jm~,aW3tL'Po|8:m9m]&p4!H^~5hvV2L5sYY+J'O4nz'8.oXps<$", "7 @%lC=56ck9}{a@_T6b)M8k4JO-h/)'&PH3z|4zFEci[5+Q1VA4;rs~4']Qv0E4Q,F#eM)M0<,5dO,L~'-;/|yW;+LlWZ2p!', "IyS;i5O1o98'00M@OaNb?>;jYZ/&%'`rI>6AL#$MAZ<9t+mq.&BS:d~[[SL8XDKvcKR6%H}D,>'^in}U5x,TNNt{}&GziLvZk*5(", "&V =V4QoLuKhk(m$[-lTtlconPv[zE=/AVYlZ=7OEd5,,'RM'R[x(cUiT$7Z^0.*u1u*'Cek.-gRVl~opVw,kcPKpB3~15O{q}v_", "|F(Je+k>`(mla@'c7~vwuBC1rdcnfpG_16rLuv+'9jg/%<^mDpF)MPBB%-*>o)Z<#H!7bM@?Nusm1_&?6)erXq>i|/NRsjk|@xaY", "&+Gn%KQys'K99Il*ZzeXCqa|![?td+B|7z_3/t['H'E,Y+C')MZ^?5Bn',XP4A!`4|,Z2iY@" , "feEDm'^OH#sd`2x6BM='t|)u!Z9X4'%;vF>CaRO8*~cTk SBz.r|,hCRTe2Ep6;v) ciQ&uqCF/JBxSXE!Qd1WTUVuCX'wWGLuR1", "3?uy1J|;vpNq'Qh:FSVXF+K`sL+ ?8&uz} Iq235%WnkTdW$L|n'=F,R2 EY[',a|EJ,jFD=S9Kqg,88,K:TDfnI]MwP89XG.%,/", "f*`!#_oQ25mvuH,d, "!vEt<1bV;f#rlCxYwf,j>lZ5dn|-28]S98e<]cst+GM'`lk<87vey:N<1}A.c'KA#^<"
, "*'$k)kg4TLkw$GW7'M80?.)#L.P.J;xy7&{ .N.Y3FbMzZs]q#X+IBJl#cCw/>!'cdn}g7|y, "73D4WLDPLAgh#F'|Z#'&_N=3RSQz@:P!W*T-B#~bypAsR);)p*ojTh=(gJu5s?,Sc0>XF: 7}QCPKqfi>$E#(SO'"
, "ee/,p8%b3nRsG>'qR4, "_:Huc,nMi=H7j-t ;if~n-/H{ CioDpUro&gkVw8q^?~?u$QVh98ewL'ta*iIpo0(Sv'OD|Oo&evpy'x3VPn'j<-B_k3?.b'Hk>8", "#lQDit=BX7E=h/g=^7N, "vRN.m4ml~#Z{(R$=u2zCRe0w, "q A#C6~`O|?=yY@ZdPosOf'80}P95CG_bWC.`GC>tst=Wo2C0s(**'yWgrQPn+&iPm:Go@yUD>*>(dU#wi/d.Ui, "}tYecdC]C[dV@^t;rvJW& 3`%DMI:W1USB^2B3DUmNI]UEpuje;1(1 F3KqEFy" , "A0Y87lm-8G w6mZa`d`zY0H- *,Dx<0hM5vZpaF[g:36%-Vjb=AeA^n'~'s4Fk+Z7m:, "BIF8e>CnaiDy6fqjAZf$aVJB+A3l-OZ]NkvqTX}GGLuuV@G[$D3WjC'$l+$)oW41o1Nz/9-A='a5E)Dqi]WvXRs>nfhF.`;twTJg", "?ByXd{(y_;Vv,mU'CV)fx-FWkx=C'b%ej, "h?:2^_(-'NbO=Q4Bd%1eYH>P@qH?zm4wAq(RUu`bE:8KE=&ca`l_Sd,{3kYnI>'w[YUe[)'<;'G^fHI=!T3j'B8W;'VgXt),?!+S", "`[I-nR@k/'RopAZu.6vi_7J>D'2}3+]v'~0O#UKq" , "=2>[c|E8J?8Ht/`d?n;H~X'm;'Z'WRk!!C7U*]f0x<[n?%CQ,p:*QN-Y!d`rS t'sne21lj;, "xV<{L1FL,&H!gfDV<=y:'QYPTMVE1ds&YE~5qG2v<)os67,K43suPI6_'0GO,", " t`qlp4imC_HP9{W(:?gm'EQ6O*RvX#S*~?8R&?Idn9;aIi , "i%a5:ee'U&,CEb,'Dzy'fCF_oMu='Aya]CaKW8[YMvPDn%;Z~^DjqmjAP:ZY_Y$d/8g4yTmQ}Ad`$: $XLh)i@PUv'a{Woi})'d'", "lr:F2V&2Q7'{VqO>^Z'h[M9zN-9zW'2ea`J'ar SXXUhIn,]K.8IF+gJ9V*tx2DC'l,N/*PA-hu/]xwL,fb3n$939-fRYJFAKsb(", "8sqly7O$vxj];'=v=~H5jw{/VvRr|@k]LB!vL;UY4,R}K^Lzf =vw1'Kq>e1Wh^yBfI-EQ'M'YZ_I`Ek>8l.tfN?I2(('P5, "^E|'F^>M'@KRb>&2<#E|<9U>|&N%i:]@$CG&@-r'9|Xb(j?+BK@l#Ej6cRI2'i(_Mx_~wZT:o`$}r8l]qg!75=}b'ZfNvs9Ku;z7", "[mY&|wLKW[y0i=Gtm(|2s7'zZnjFM0^yUc|wvF0JD]&,0]`G{@@w`-6 L.(Qvyk=ou.`L|t+h4ubSlvOs#mYz<9A$zj0aw0'zeHY", "4zf[}Qfv5sY @>Se:XR'SPK:W@'U)ZTER8JtGuS$EYb_*_[qsvHF>vxO2*-vZ~f$X&-+cpN-AqCM{6v7=VA5PTxNM2vOEb,bA?yh", ":'a1'GWOZETRDJ*$z5c>Q5AXD$UK_tP@'p$G}H+{7a(u6.p&uvCx@H~O!rR,x,:cOp]{gGKD2fByiz#qLcVR`^G]c^~|=?T/m$0h", "9d?S{VW>)l6B^-}A&}|-Zc/i^9zxic%[TUOA}zF)39.0GZ*UXlc?0_<[ug" , "3;BaJ(^;WTR-57vt'5 _Sp1sJaPeIz($064,_q{Ik8-tF=nMm0]L![3)v`RJ6wrw'~'b:Cc*;L0M|SyYC^R'qM(H/<`{'-C0sk6P", "haz|3I ,LIRE(!yk7jCnBD$< mtc%X}`|n%dXdT:P#:>QL}bq78^Omhv9XZe'AFC1!(L9}lRKyfG)sA`>Ju h8r^o!JuS7Rz[~'m", "6:3+?CEStaJVnwZH42xu?P3U8?w<5 `/X$7/DSx-Qt*3]zr]bNQ20`ouu9{M[yrR@Wo'H5+{xgO&Yw};L~H**S 2ZOR<'76Y[4y~", "[~(C7lJnFZq8vt?EE|Tu;K'Jvn{F{%nBhObc=!m$`-k3uaK" , "[&R0#X@GzV5l192xu^.'*|#[qsK?IM&nN.z10D,N!j|ss,YF>`Mi0VW@Bw:}EeZX^ pk}k~^-bg3H?3-o{)6QWW>wDy^u;p;F~g3", "-dW#WPF7GK^c?F]j`>bdplvJ9RTN{|gJ2lud%RG4U;b$SB59XPZ0pq:ab~Fxy,S& o;tr-1dUE7BVW(+ :#kA',*Mi9'{R3RUl8*", "D10,!}Yu&dL7HKzzI3)(]gRyAo.z9v>frdpj,T'uYePd#Wwt12'v:VE krfL _B>xq)u6hH72q2=xlF.'4Z)K7+YwDqgsG|>zDt]", ").-Z>RY>Pv,,N$R|Sr*J:J0;ScS{KI$L-/$'}`9Z5'WC[ 5}Il#Ij+Vmt11%DYM}Nsl$8==)9B@[9G~R*'`el#7Q'=H3.HArv3,H", "~/:cqzz$d<3Gqa21_vi?>Nmrm-lFGbV/fWQUB';';rSh5;Wokzq%o7-hv{t/w^0?4|/Asg??5RX';fmi, "tCsFX]-+`'HE(b:`jYDL<3A*'uLsy#h?AdK:'_T/<'6XV/PV9)q%W?b]_dCU:kr@[?{(o|.[AgtZsAlFUbr|Iyy[3Qc7('#~%`g8", "RQdH?FIoOR|@hJ20x(8w^h-#<7HbB3W)Cfji*Yt!Z(SO9WzdA>qe{fJeQ<'TU;]W;>%4,'IXo1xb2I[7EFV'@2E30*F5v7Tl+F[9", "l'y]Px$De.E3'fZN/.%a~o6!_PxXdZly6SPd7v-1cOG1^P76_:!%E (!-E$8YWV'1Gc^Cu86|A/..[QN74*h1, "jeh4-*{y$j.'XC-n(hR9e@S:MI%3$" , "1#$||FG?Ae!&HATpdrNe(F?T0ftsL, "_|f$#cl5z'..CR~N`{j+[z?I.>a3'B<`h3t c3Ej|7`Rf7BLlm_aLYya}2~sp:5w&!UXH([A/`Z>IbL8)0rWqYFnZ_-E1aE31mg_", "RP]+]@W7rs':}/z}d2[PY@&rMq^Vbq^0~Giiqfth&V#abkb6c3k>wruLUE0Kx7,!NMO+Zr&oSGhi@`hPFk'#(i{=^4R2g8/C0'0l", "#U0i1+t<@Z'4HE8OLyV=Ov& .!Bv&'PC2*- s$oh~,9:&9t0T!"
, "w/R}RR$!LC*cY?rd,zTX.''RcALm],4.=9qyFl82/dGprG%^lP)!0tqsLK:15'>Gss(%c#.Yu0~6ogL.1}'yX>m A%_&FA8r]'e'", "6lj/|78]L5BGBhyQz|#}VVi:[QN'X28]rs7b#}vTuI~!k/WeS7z@/{@7k*j@JN9^wt(*z8?2'f3=',Ydy!faC@M*R:%mF38A|zNV", "rB]hg*1{Cux}zP6D}3=9Qh~'D/,afURoRa;j46@%rQltD'Jm52" , "JBo9v'Wo<~v^)hGMrbS53$5!x?NRjjq10>nji|_LXJl)+qw6-!#MW<1Z1-E[_M7U/i;+zLx9?+j=['#S^$1)W 4^'Mx/z`A&ZCHj", "ShoT'9cd>1HkT8, "?['#`.l:zB7/2!}$PN+6G_P[^lcJXJ@n~ff15UtJvDc``Az'GI=yo)&B@3QJB-XK,Lgoy4ly_SwT]fGb=] kZ!]B", "/k=aNPgsq#''$btn?',*l(MC$-fX'mtoFJ'TY8{oV%9'&[)_cgpbV|[(b>'WX-'j?xlE;x}YVG-`M'8]5{ %<(>E1XJd7+1}WS!L", "3BR`}L'1;bo:bD%8I!-H(],Ia-h^#PevjoXf7RWN$,%tHh7Z3Ss, "-`E7M'amJ;>(?*^Wn*w-PiEG-7KKEHJ>L %zkhIvhig)*?a =kQt:#2<6px-b9P8f+`g*Zq01'*8vRf>Qo~7rOWANS3[u{+;n)'w", "J'>=`dSiany/1glw2X1!U.&*ORLDnq~*Yw!0+w(h}Ma(P-,.%sO5eQ2,mNM1o8ZdN}IclUdJnJJr4=MsV~W K4WOt JOHk3B]h@p", "BwG7bPxW5At#S';QIrqK*hzJuG7)qc*l]*%UPrR D3vs[vUGvuub]LQH/ @b*ic1VNF, "7o:pa*p1%L5b(+6'bO'Tv]'UA@66F33|fE}djjGb+9oF7'a^e2Q`xGw:S?8rxbB%KfW8+hcmC(u+|]kz7la;_Au@m3]du|w;BG96", "[~$Y|N'HvOD)?XNiDNc'brJt]=i8)$q&zG]s%;E+Ae{$SHwFGk-+h ;SEXT@(T5R+K2H&!O1JjkGaGh4HcZZ Hgbl+)fgHOjpCF_", "F+r8p4s^V:T8lbfbR?/!^@f(Wd(u2zJ4M/Ie' 7,1v,lCVa=kVKN" , "k=27t|FGWb6#3KvW3CkVwykKv]2e.&g'@|r'' 8&'FwI BL++(!E$Z_&};>BhhD?2@'p2,o8O,aepzHT26Pq#DRN.+(vn!9J3 #", "#rc@-wE^2CQFU5TC=|A:{[ o,%%==gZ:R!%'95G[srjQ]KY91S@zVLZw'tuvxStu)fPUjFI7nqCS)yvoNi~A~A'rdML':V8Nw|K8", "hs21c.&(Y'i, "6DNSy8k V*%KI-a)umpW^Nx.ga$h1tr.uo!1=-U/{O`G'5(16(N'jDjnxBcBD)'Yw/CM8~T?KCC} $gJKKP7MYzb'F|Ya,V@DAXz", ",nj8oFhP:x||0{<=~;U_2HwcE5)n-'@MPkN%v0CrEbVs]gK>nqu|ktiJ$0j=H^+1_5=v/:O[2+t8aNIgYikA, "?v~VhZh231cWq6*ZRP0T5__<#4u5hM-/@o&f5y6/O7q@b$_!kI<'}AFN: .:g!d$_wIDu4js3'5@uly/6quK5>o4WF0@j4dc(L", "_dD`F%G@xU3L .v ir.#,P(U9c)^tl f>d>]wU_]c25Ncr^XiH|q[;2hOy$hxstpMG>l9Ug'{$)]ok.8YV61^>O'Zw(SYlt$d)kH", "_J[CBqQZ'u&qE}spU%odl(]7'Hl3El@@Y5$DR_1A&3'p%K.@44X|@*(DJH8I}O<'" , "CkW4EE:WjqnQlN6h'&@R/nI`mn;XZP,Uk $zY^xC)9X9NfWMtC0i_nU(N.P&0E^TfK$kD]E|nI}j?, "|Y,jM5:ZK0q=8o, ",H>Gxw:x !qz%h'N'nQE|qi*XS':.;El9q&mGel}':dS4gQ.izc4p=0g9:5'PgPf60i'XVmg`GChh.'UFU#_EJO4ek1sGvOQUaeD", ":Sw6^0Z!c$r?QNViNAN?'I|CLKFE|Uv163#to&)8|bBoy_0.P{Z@f/h6X<`1yg|n.wZDt11CN6[CN.C:|U@Y;>vss>jkuN'6bMK8", "}x6VpHXt/rOAx*Pj+r:QR" , "'10SUA[lxA1eDy~X;|u58E'SS}ZdS1, "H~xn:mCfMWTPSk-8xy2J);#qS:j_faS2c]l;|&V:CJc.@24,%m$:Lb.;.ve).E%V3e~QaXP$ >w6D7=4{>S#`'Q-l'3AhA%SG)7b", "(PXO5tqUwf32KNX?=NGzg7|xFi,VZ{f5ynBzQz3~C*f=:}'Jg|94]KZ!A*dt:~n`Y.ZlCwF(J'wD'z=tu$>>n%+Uf6SCg_:B*Eb4", "_iR*|4<))]zOIoi%_9~VJ^tirqN3J~.{tG)`HU8HW}^^--XO>Lf_KW`ZSWKqIH`h*s@s>J^2HSs23tew#f1*`]ln2' niQh" , "P2IK{'wtmEuHeKA2PzG6'.O]{!k?jY'_o'NK1ha!%#bW.:1+L?W/$#rSkOC4B1v'*gDzW?fBMB:uI^}|5,1Dz&Bl3 B? (jg?CX'", " MX'PnT6>'F?>NjD'!-Sl&LSQ9+e28J2C D3='Y08kD&'Qq3SU~X3'k}$ED||yTZa)SDDjo&`,a`ZU<0{~rGV2Sm _}MH#%j7yWS", "mLa_9uszcu;IHE=2d}drn=0m3J9=.npO)U^B;/gh]yET]qh9;u;{J8e$PV0^h]HZwV)vr71H4{Um#i`4pPW@x!ve 18Wpcy{!&3|", "roGe`/^oUJ?`z!_VN2lsk!?&A/lw, "<@o'Li'f^<}zT|A_]xhxPic&Qt9TCd wsN{Ue.BfB|ZG^O>]8=5$NwmlG[:%FI|`^Nu*!>T($`ok%&'$WU{{o^b!T.a5>MwiVv2!", "yzJc9Hd/+29pJPpX3/+Jicd:w(:ah#u>{-tmI{,^i20`DG`];4^D/<@yxrgBIcS$:Apj!,35N9hxi`oc73Ti0l&YP,Ms@vHm[SFj", "cG2#7[hhgaE77quaC>~iB%oSx_L-#*l];|Euxge4r*'.+}T:p'CN^L8:SW+&ge3}X#^A,V6IZ(Qw>:>-)I`c@byyreo'tNB6@^'`", "3m/]f}Vs&k)mq6@'rx_G+ 'c*~m&Xbe]'9MB'0jSkQ0yHgWH,R*PP.+V:r?mfF'4},dMI*w8aZHbNyS" , "H^[)E*jY!lmz?d'gZDfA(gh{@'P0'bBjNOBn4iMl, "aa.El'^a0bk-@c6Q[s]#_Ej#FIs{t/`GsC<@X*a{'{xCGQ_I.X{n9#4SM,Jdkou9h+?bBeef:|v>,]cF:m:{[5>uTtwf:2b)1Hu?", "b)%{js-]:`]__jS cp0U:p@tbLRZ5KX!.p|$8B`S,f>PTj#@U|xvAfi=T.awYs'VzYq3y_#5u(yP4NZh|}'}rmY^4's-PA^!S$]w", "$e4)G4?T*yp^u_;9aRUE39AGL1Y9hdrKKn>kzW_'76}x~,M1EaVzHSdd[Qh<`0>Tu8XhfoJ+FhR3rfpBM{ 8vb>2z'p'!~n'lnky", "q2o/(GrDA]FuaEqqcv0O&%O(9D'`Qk$psmO>}$XsYAj;/oL;0(]HmOJ.Q.HpM',`n5a&l~VE2'}:JNzIBZnkIG`NjTN^'a?&gCd,", "Vp~Xx#lK%ZJmxS*Ijkt&.')ebkLbr5yDDI)0qH/bJ#k#~_&8dPeMT*|HkUSA-lqFbs[YmJiP,{,)]v0vt2,o{yOtuXiBH[gE-nEZ", "7%.,EO#`L2q1L(|hXTB8[f#!3ap]Gv??]^mHybJfM/b}C`I7XXY tspPe A832W%" , ")v 6gxZt@hEJ({l2de, "Y+/Q{vtJf'7/@`Jp; Hik@1TUn4J~$4L^'-K[uTwN@4L_UFut:FWvp]y;AmC%Bg&]}njW9p)q`X#E_`96.!3jq{0o%Bz, "qc]`#pH/B(qw|8zE;=u[{=][ Gj''by2G;y12vPOq'Q1amLKbt/|9pJX5i1!-@QX,8:7ii}#3`)P?4rs`J'=7#<|u/](q%{8e]7n", "/fZC9}pPS(x!./uk8@L.|kU! %'9:{d1j`'M. ,,3'^=}qIZ#lv/iI=ba) 1[I!54c@)Xf'lhC_xJ0b a *GM'K('j@(%uKbwEnx", "^]F''E_&c/wev-gf:'(Eydc #$M:k'b6$@)2SqI?(d1Ls^}kPc@%N>+)=sF[<)h&1jy4t8#rNUd[8Ad'Vk0sRIyn $_;46 ~Oi~A", "2QQ}'}GwjF>ji'E+`W8AE$'I}$ESve.D[{yi97JA18EknkO[/1:%3@+Vz2S.2[J[9{nkTQX>VGzMCR@p'}pPxN,|}+;^PIMlp'rd", "#_Hf1)a<1O1:Rz*8J P:r6E;:_IV+F-a('=>E'bMQeh/?29.qI aB4>>7?'lmKqi}v" , "H(b)RnC_TzwUH7d p)v[mTgG~A'[?lCA6SBK/B]I/BnYD,*f_RC%/}VkP[I?xZUHyuPo7>c6jGi]{.v)>==rzq;D7?5y@H`[D-M_", "{N|&t'0_=ug7rPs?ln1P/=*C+b>|+8mg6dzpQJYE8c%V$bpxFcGvd6xPO>AT4M?+iM,'=`RU`_I+:'x$$UB7bIM:L35TYw~cp%4X", "aO~'u)i#S[e4prUm 9vYGlG/wDMf'cGB0=L'bU_y]G1sY!*JBu]S&'2']aG5{km0J8 ;(%v!D%6{1C>c=rP3+.o=Y?Tu'k8N&P&G", "Xpe6-'D`G+,AqVTa0#x4*?M7Fq'2(3y_PZT)NCQ3e'M,Wyi#)3:S3p4, "XrW;Z,D7PYV56:^)+tXyZn@rv~vhmX=Jmufi=mK$K`JQZc`_xOdp&W5uswyOA$k;u'S-RkHF&wXnK;JOclyO7q``31*SdpMC`vzW", "ego|H!{dL=*[+8]/)yPxwfs`)jN*#SuT`T-9'.$k29hv7nc_r/+Z8$>FI!(/Q'cM>ik8g/b5X@D/qg$s: !z=oY:NL|I<-`mnPw*", "(%|/G~*5zlA1w+0.a^'(4Z46!'e_';3C+EE*[{UEtj5T9XsDl1[Z7%;e!+vFuf_3lX_Na wuZD1Zi+Hj}>Z;p*F#Vd&'Iv0)/=ja", "v8t?TMO[J/D6Cr/9] XQGW:;RL/`AcFQaN#Yrj]sj?bGX#0L}Xy'/pQ} p.v&h^@qUpZwbQNmb/g3e1*;22q=T5+1j,HiT<3e*MP", "LgSKo4%6qG=+d/hGr4fh23~8sT;'HJ>Pu,5~6~}^@q^$#eT''`&y)>|Y7i^bnGON-ttKbsa?JX=uO+499i-k<~b7D#mmw[#1w/^&", "suM:?u'I>Gm<[h'gzQUh'5/''l|v5'`O3yA2~nMJ'YPcDt:[TZeF3>7V!=,(NIST/%YI:d*HG$0;^*`'EfA}%gvL)cp3{z1)'FX ", "q^l.}J'W`!P^JTB(#:B%'e/vw&Q;Bt4" , "&G'kX6`rYq5fbv%RX/3j48r$[4FM|_nWD54sWKk0^!g`=uVB&, "lw;G`z3%dYbLyYh4?S}!(yzv<}c0]mzZp&j>F&6}{@jb8ve7`Xby_)4M5z?MG7Q" , "$[H5J6'xt:s]-^.k_^71F)p3%F+y)4z/2*U[_O'Etgmu`'w;9i0y:{)e:QQ]:;0{^MFM+)vk], "r6Yq]0'<^rFFD:TD@tN}>aR^u4a,?WrMpkVSZm7Byv!J2L>CH/FrAwn]1e4Ja&M'X{$2$0*qD7Z2xzofo3HxOQu$pQb[ZSocE/OP", "`w0}(eN_yB3ENI0Bz'5Fimp2'tNfwkHXm,b qK.rARuEmE=<3WTP1A-1S5hs476|biIS'&JZj!`&(6D/|QM3@1*-heEbiGj3{kjt", "f[pZNOvM]v07-,NO~C}Ue'IV@`8)^sSl3;60Y@oRf:T='~k4H' %Kx`9$N55q}Guk4'j|v:;BN*kg?:vP, "6L26Vf:hw,Y3UQM{9B24B#/~yDQtWa'-1Stdz'0=HdDX*Bm}eheMA~PNozUQ%jfJOfq+GB ,[X!B|>t]?qg2ebJmy<=5" , ";/%8L#DF,& Z9r<1kvQDCF'$ii< ^'PV^dX{0j[g>(%@:Bk;}g~$3;-9j?6l&v'my n'm/n2*55*VxJb2gZG|9Ym?(M,w'B'qm!w", "@|5^r['m0x6{h3|%E(&52nOOaY3@Y'wMU NsR8C(d]uH&]?Wo&Y{4=.@**S4e" , "c|cx;{#nDm,irI]2Q?UR*D)&2XrmE%:e6no:N|L!hK)F-R5W!SL<-)Y6mX^lwNt/mH^}'o?$.cC?" , "ptgF*`j(u8pcJ[Hio]LkeYo,9]aZ,n^'+}e<'4x}Y|~PoCv.wD^ DE%MD1H|6'J0,Li;y%cnT=)KvSOUKk11!r 'lt*nE;tXCob>", "Xn`).,P?#ocfI<~eN<[[3;856%Z$<;no=Kq_Cb9tt1H}cJ069Ck;R]jK=O2RK~V%QU[_$z-2fZH3D9#$A%hpJ+*(ePYSi0Ltnca&", "d&P+'z4$7[Tq-R&z%G-o>[KOxvn]dua^}5yfAMzebeM#nL:fzTXPxQM@|r[J apL)HT8QD#olF9AnZ|97Y=X_7ll[Qj]diXX8]Ff", "I2>e-~[EmBv}'3J N'?C8d;WCtSY4%@ px0&, "udsIgVw%u-r:9k6G-565RB7#9'Yig!2vWT5<):zE(V4'oAG #``7zyfvxaF5, "C/UjL*rXqwV;GU BybJIa>>;{J}]Fa^Z.]~m.}m'LdqxMG%69MR{'2):" , "uJ$2g19^UD1=fy*PQ)&1UIlD*}t#GU~'Qa?`.m|_R,jW7}&{gWVGV|6x@Qb-JYWga'f)I;{e$aa$e7&P@R2+7s/av3jf]/jLg2r,", "'TK'&lQ#/2'?{f$`vaP;0,MEg6p$1!D5 smjh'%9HRS|a:E'fiI&.RiKVw6t5noc/{gdE yQ6z:+DBjHyZF1:r'ojaSq8m?dH_iw", ";S*s<MDc!aY&BIfdC^#KlfgDA%-U+8!9?SC%HUL~V6_JF;v`bKYBndfdGJj/N3b8gh-y@0MDR{LP" , "]eoFR)(1+=VS+u'4%GD%l+Oz!PzG+qv!l@:e*N|gs}e 77#Yo~v5~8[Tr_ijF$1ZROBCw~7b'BzN3!2Jrw1;+f}@r*dq9}" , "jvb=jgM0]tD@329X+.61S~Ik]YEu3hCO$gup+z(dvIKr+I1L;" , "@znre:G.Mmzi/UuKtea>vP8*'/-[p)q=6%h9'a!;6J&<: iCJ'$:7wcB3l @duTX{[e{;*HW'KA=cR*-; AsZ0}z'=Cdb%7lFoCJ", "#MeXN[bTVC3AH'GQ#n}:bVp}/ok?z0y|6`;ynpp>~Mdx}, "{505f[a)'W4wP^&8}c7M5JtFgO$cmS]dpDe~+n+MdVGz'eMqj,ba1K,5/Ip6TiiqS}e_yG;b14:}%ST$PVQG6b*+;[;+oS2GqF)X", "6&y'aLCXCqykF+jT0IV4nDTG$)m,SLSt0ZNdqNGb7-$~uYe[cg5#dG%yzEi1]8xe6kL'*'(~A]le00[8C{Q>F[=Gy2'=}^'_QT*N", "zUY/._7G|l31b||5&/T>?=>_'T$C3jf<+$dM93}k4r3XGva/Dw0P<[i'Hg[.@Z'H54'0>up]g_Wz=m)T~;uf!KBgejNDrPEn.J4<", "J+/;'wqB>l2opKP'{t&Tg3q3`muk%H}&NS/[70 1RtqKH_fg#uJq5vCI*_~ '0YsHv;EPCKE+Th:)II'H ;r0jNeN,B%Peyvw5C`", "=8y|+uA`xInS>BN?E'|c *I='aR7&mmT}f%=N[/9yG:(]V+x>/8c[@>-z$,YlGc@oF{GgGYChq')8mc0)M=/Y%tPvbB`ychXw`'2", " 4w _NJzP^]^{H=oZte3N`Ip{z:z+P7ZD,GK{c, "lY=-+[4;*G$tr`kRAM(gdIdaL8G^$?g{t+q?!sb@pfO1J+>T8L,;y, "7-7d=E;|;m}U54Y@&J!9 dJ45/o1$)FQKaHnd?SpQ%v9lIm$7YN?&yAQLT~Vz}|?X7Q'D3zkSH|4u:cY*0,:l4Pl @Hdk2#CmSe2", "nl37k2:0t*eKYVtc R4KF+cYb'&rTD'<]*jddcj6;J6%u4//4ub}()P6Bu0fuZ&~2=-_#b:j" , "&/I&b3C3;{d@'gj+g@ nF:JU}eWs, "30$*E+!'66AlS3bDM+Qdx19.`^*7v271yD~7p GRKJ*9O'+RaN'm~5__?BQX/v[*wGP]5!sHb#-K`=~0bq>V:a.a^29M]<@=Z`[(", "dHBcejX|}'0 {1@J-mtb& T{F#>i+l2i~2y=:je=P'vSi<%%** ey')/YC7~)%, "suZ,Ka'$zMt%;G_MU9i>rZo!KD'o%O_wmX!G.;Vr^Q(EY=4qxppk/E@+sQ{'$;M<:U;4V+H)[Y$U0.SItnD+81KsB]+NA{:Jte/*", "q@zuof8hWjy2'0N9A>,nvz^.Z~atT%tdnz=6/li%d?3p>;IO`]f'NRjwJ`O66Bxn*;m|/)daJ3Y6JRlhx`nQhm8~r1gRV1$sdiQ`", "Is[a_^t{BH]9V=e5:p_g`!uKa'a}mV45;ZC`h`ZVKebs]|G'.h7Bsgd)i(mRfa_wyE|4/bP0Q'p9`$6aeA*n8=Eh!1'v>)$*to~F", "Va,kBJfoe{v*fw7`/m>)975zu1 g}%uY;q[}AHE$o:M xj[4&c&` ?=i_x`?RJ}voao)d ujNa8ZaA03Z>tL'dR~Q 6Y=C(E:z0*", "YCO:K-us)(lUD@jxLnLDJ4_nBN*=IhBks&EXiC't^'Q'%#g-YVH2/innd>: ^ZZOb;.-i D%` Qh@DV@qLMQR9yB?7zN#VcL'geL", "r{|1Mp~ZIr>[ckbZ(-8W:_XFkEI`Vz~2cANMxxI^'$`obYb)G.}gV|{$wq0#}q5=P'YE|^EQ%*=}M)s9S|rf@+W{Nib8Faa9`J.=", "Nbh2^y>[email protected]^'b*7'dNsJ`?>+dUK:@6cSFTal$^/:+~mAfxq8k>g'wRRL5.ruTE_$k-X? +kf68^QML<|VRY`[_c-O#<", "(4xSs'Q^~aZ'/D, "OH(,Y0PfGQlY.rwcv(tF-'f 'eecE7QjA2KDI|{ZZMr+DCW|[Kpn[Z6N*QHE'LlQ87%Sys,8) 08if1{c i7Z;S} n'w`hGFNO[z", "J4gm1E1RFTq4{||zeJojH;JNs?Q&MZjlG>BaQ,I'|'e)duyAoL|.HR=.{S'x%^ReGp?l(]UK{AE3L;SGG2`]_,AFgYR:6yEn$" , "S/x1+b@|pG'4|6MyMU}KkSHcDy^ut" , "g{u{f+C@0eP4rR7_?1EKWryO6+R, ":|Riz+j?NsV1[,,'Z(:esV$M^qX:%{K@j,Y$L|'$=Nv1:M./8XdCubh]D;6X~4d%E2p^n$52PF@ei?$['-*D2+1DpoYE@JQBVcrO", "uwf-mBfzf1sW^Fz8yS(N~:{wQmJ.:i.ajep+R$K$uCL;*e}m_D/6]7~Hcf}7R[k9abd3&+W!q%5D C?}[/-S`3k#FLk2A{s|X?)E", "L^Ma]J`(oO0i>!'CdSGIE&B5dhZHk~B,0G$^_P0E%@v-vSi&%<9Az:e&N>u:stV@vC>OUc:k].AWiCHn*-6p_':rKQVZVIDX`3aa", "(@:q!<'1RV+^'WKE75z)-)F_@(>|'.V/EnLep8G{oRw|6ns#s'PWB'Q]SQz+7ZKA![U(zd)g9bXmbZkyq]r-=.ZkPJx]'8^j/*u'", " ?/Xvboa0od2]wxv$UWV/MW(%qIC41V!iqxL9Ij F#=/0O9 vn(,I`!0^M[+zRR^k~VNmcvG/cyaGf0a]f?xBShD%`gP0|dMLEt'", "jM~E9`%?QCu2BYsb{8{%)oiGE?{Q{Gqy_ljcCp--.7!n(Ne2_H:mv[|iH4n1K4'mxYSRgV^G)?owR;Dkh;'5uMv=8Z]Mq?5GJi2#", "{xQE?EFo}Y%]42F5_4, "&GY#(bf'YH*yY5.}Cnpe9'h%+Rvh,'j=ZNfS>fBJbB[4i|*sK]WU`|:?l>5whMBg;-_'A:h4x9ov7'Y7~L4{_IX^?.'9@1E, "~'4%*#{{*8|YlvQaW0vDH/Tp8aUcBq/9MEl3WP lW3heL-42qHfvB)|;rFEhyO{!fwVG}:rW!jA'r7Ayg#!'?Sjx'AU/sI^!qfe.", "N4DgRx|B${;VD_7HQyU*O(l?W>_[q^B24~j/E+I?irv'4fO[G:Ydh:p&BV>7f'`wbMhX$=#EZD'+Fw{LjC]WBOe!WHtLw&'Us*'S", "Tf<>ckR'6n'v~toEK:7l3eP)]RHsu(T;/#kC&gy0QTI&jp;EUcq==/iY.=YSKi2m#7+vMq`E#5%hR7aJs2PMX~{ TN)W;F$L}*Om", "trGo/Orz'i2&Af|*LFzCHZ?xhJ7TP=c.Z^mc66I1tWup]P@F4HqgS%w7bFC##+oes2j-*u_{a[?Z0edHjCB_rl5#'XB[''1$:'D8", "u#ty]ZK:j~<.VY_)f3Xh{$1Jg`tn=n&m@e]Cyar)PmVb&>'{KBDf'55/tp8y9e'('>G593DSA%3rS&f>3)x0u&:%"
, "BfJo7V8!8t;95KzmbN9+Y|G{WCc~" , "H*3+s.btiK&~t3JZ*'E!b1gsf-noA5gtDH>7M, "dX'V|P1&iTkZP'3KfS[9)v7'Dy6)jRAii1bSyzer-XB:`h$nn]_w()(!d{S#ABy)'IZ*Kfl*M6^*J&SDE(GcY, "S.Lz:;v, ro/BP;]*jt[#i ;:yLE8`4KIgyVIejt#O6)E7}W3oI(6,'h)T%5gueikQb*':'D-/XTzjgHJ`BC|Z|zRUU&Km~S+E'}", "q{IOTmqzo97amL)[.bq('e+MaqiMsMV'CtR$@/{2?T13?" , "e|eh3`O=ubjgwx`>F/.-&M'[mM4yZR`PORZVl,0wriG`8'}+|cfU4&,@('-1:', "Hd^W'Rc?SX]H+q1a)[OO,{PYXk#mbQ8OOWYgR%GhmSc))YXNvC?7u6vj*Q{&DMOj~-,bsl3f*_Yq'h-@xrA||J'8Uzq8A.z8tg(h", "]xkZ|RP}wqiO`@`13{uy)n,7!O5u)}3QOZ'50p#'ShE|*^L:>6.:0UY}Tw-1Nh[<{nLb4F{ocPgMu/:'o$c}Q'vQ'QQCn'pG|;VP", "XyE}>b.9lXBHymnq`ns4'' m{R12$Qp,AAr9mrYVcz2ps,|k=x}el;KP{%Mfw_*'2qH=6_4FU`AzWb1o3^w!')vSOpXE^='8|P1'", "uzqE4Q84ND2fz/)rh,+s&Gn0:G>)ql'E*Tw;p^BI]?zMLOCnr'8s[J@d>1(hWT{[n8RK'vW'L..iQ'W'~7#0k)" , "vqH6EKIf(Lw:^$q>Y[{^T73`9FQK3HR?B}'4gz9W,gL?^Qb*<'0nH5%$}bm[`:y!t(uH2T[Ual?+vDP4~i3'+hFE:Pkk^LzQ[E'=", ")#^mFG&75]M8bb~^B{*CkO9PT188>&Sk9y'Ef;Rd$_$.NP+7Ok9.Fo6Vh -&(Poe'r>LXk=H#eu)__'9Zk/|',s0jL1AQl:fFD18", "0?FBL$.)rec$nfb3j`Enn M*#-ps1K&c'jem{R?$A0AG<=*RlT'wh}`gdNeF;~`dYo-, "$djct6b#F66S$@5p^q?H!CR3M.-A[o[M5Y1mS0u!p1#21$OEyS?RL;~_ +:pVtAL2r*{eN1,X$ymvM01I;_+l50KQ{m8MmA39hy=", "@=(j1;(]i^($m,A/NZz6kKW4r: @XE,iApo8~r/4{gO3^ $FCZ|A, "BVSAyyCCIF:DutW3Wr{xS^l@}6N/]i8f0b, "!f7/x1ebqj$m->mLy`DBQt-.cWVyX'Og%:j7QBBk!/5+~BnhJzoKm`[j=^TjmxI|_wX{?ak_e'/9>HE|HRT*|?p2#n7+Q97whxk4", "tvjx)_$HCPmSg'rTf|ZS8~gx|Q1je0R.$T?3mzPDx5;ri3ZQ3Da}Ub3p^B23`%i_NtgwcHN=`u)u(+-g$bB+g'5rBk'.raO|I(>3", "%_6wy9c?Oo_p{F(eOaf@VBo_n3(=wxj^^JX)B(1R, "RmoGa}Z#VV#}w'zVn:*MJB-*g!wpFenT4X'C'?;9j sebd_nNK^'2$*XWEi6Hv_X][N9W'D3qv'x@%YV98KX2l/HPg(l/q0/ECS/", "CB,cV:#Rv!*[D,o-h:UFdiOK%fIu&63F,-FEAE=a-TM'$a/#LW>n%_S8]WLTWPS']Ao`}{&Y't'r$4PFfNe.3n4XtA4K?" , "$r1=q,,Ow]fCTT{hWYDx%{4[/JH,>j`LP1}Y:!h=W*O8,)nOYDhm1|')D?,0 r>#P>zt-,#{s4ZB, "^[X#5R2:gi/G{}[<@FY~4)!z+GTkt(m,ippfgNn0o.ScQ _Fk'dnn[u)`kE;Dqg6RPp!-G8KL5mFLpBogaZ_ft|WI HpjYw2$zph", "1PI$t'wg$.}+Ki}d-V15Rm0IP&VA#iaOD!k)6%;K69h!}h~,&aHH ldle&w_0mJ(`~|)OFIa~^51^`p4'5QuJ$xsaG}>PBbw2K#Q", "k/n7L/%]-L'Xx~/8-6h>z_r6:_w+l*nt;qE&~2d<^lYD/ly4D6]jy*ArDjj@+Tv+Xr|F6T|kvZ>94g]Dt'~7Vr7k=Z4M-sedG4@b", ")=zgouPm9r`'V1b!'&,n{Egs'n/|yI@1?[8J$8m^>q9JLD]hg3SKU7B]9L_pI'NkN}?LZw!VM7@QepFMPGYIiJ`Pv2A;Sel4Fr4.", " :NsAM##9's-V*L4t9cD/0KN}S[d{oj/$", "9JkGN g.-5l?'O(,d)JoVB+~i<`/K7sWgQQE,B5mQ0Auh|P%-,u6=ZL/%K}n>, "R,+b{P,:YY'Zu8lo) +bf 9_f)WzBV+9r#X@`jR|T=6z5g2,[;d7`qm,yf.RK+(84}wEA7-7'Vwx,{ [nc'Z+MECI%r'8pj[wRT6", "w.x2Gn/]Lq?'Fgcu9;%^c{Vm&y'=BLYv+%V='3[FZiDl-sNNXdC5^YVfeM8DQ:wlbVE:y^}0^v'xU+OI[j" , "~,[xF3FIPO.t4ocUFpjCiAa0=#!XZ[qP+PnbHnpp{5SS-Zg+ond( ZPBd !Tr9 &zF&('b6! x-d/'PeC%Il9UGBqAY-pzF^'Ff!", "U10 QV;RRW2~ CT,'I]),`4THpF%0^Ovs.X]o4T'3vI)^`if{L<|G-5kb+fQT!FAGXQeP!i_rw>}D'SiK:.E7uZOl.!b%j9C04d&", ",2~uL>k[tv<8ZIXG6N J9+$QhCckA]3Mt?K|'$/o;{i`'Iupos1,(a,?'XEnV)PqOVso=a*.=kT@EtA, "qhG8qs`uBUaNIv Bf'fQ9F TR`Qab[x~qVeQct_j6CTqp:dH@COZeL,Ah8!.F4aC(Ab1}1Inek)3E{SAP?icKKY5)Oi'>EF96s(H", "=.Zac0mkP@)i{,c%5'2EXt'J9]x'x1f4}SsCnr59h)Zg~c@xU, "7%w9nY)3 L[g'KoT/|tbA)Fn{z2g2$ Z.%Z!7A~HMB[h0o|;}GL>5as,a.y2B'" , "=ia9638U]d%r7yB^hDv(z160> _e$~6jWSxLu*m@hzmK{FM1gIgs{8R36j)W-F),@HC)SN*ZwvK9OVSJ#'H7Rf'oT`&04;`=$t'<", "e7||Y>CJ.9mh7;A6o?M2c'+TZA HAiWpSJ?pCR@aq~F%O-?1?0Q.>b-&cZ@8Ay1%tl=Z94 6f+I}fxjvl6 a@.&+WBTe_B2(j|n&", "/WIfDv?*b)?t3lV8D:GW/y5K9g5]1%gWMYIvMWjk~;fbMX1oee#mg=4?w9b61:=gh!|j$KjN/'}@;(Fr3E8zM:1V7&hHF]5oG|A{", "+t>IcVu}U5Ewt,|}FH1vzwMqRu;7K_VP*J,_sNhc)L_Na7y9amR',U{Xl5JMYbGQQj1wu*g?x7Q'b;U<(UiMd'UW'O6U*yE[=b&C", "L]uVUe?SF[BIafS|`~*hAE'#wtz-i'CKxD?#>vW> A)d)TvhYs8XOL9op|E!k`hTvcrgG3K&uq^KOfJ82#rizfr:y9QNzT}R4E_>", "y2G:s!S;'&uEZeQBH P}[cncc@nZFuelmoH3D':ZCBCt7}kT8Qc'FCwf_ToWk&w:Z-o_3l}k ;?&N`,OIHJG7{Ekh>'_fn1'Ct5]", "ON:U^'~aq#)b+v(h:{=gM39[]48^|!i!-m:+(GS+>OHp|bt1Lavn91dQ;7F5 =IOV}pmN rbo?Ig#@0GKvsje42[]KaA|,|.RJz-", " iq,$$#&A-[BKU %+=&6.!Nqd&_&pv%H#dX;8~N.1CLfCu
ih=h8q]([Y:3kXwQUvISNCr_S)zNo+/NB{y{]=b'", "O`/-43.qDvuP0`<]f8cz2VU(V`q@lx#M&b,Z-[nc/'+l-}J[P1P2;'xrF1Y`cY=0-kP=}=)ndC^wQwD8&GX'3gEyRg%)_KGy+{,%", "/(#Iga*GjOwhi8,7AXWQ*E}!AnE'KmTmWEgZD/~s$Icg, "`<&kM)pE`D9_~r3'[&],s2;JDl[hook7'31N%X?@fa9G2F),20_/bm?6'<5, "57@C 21S6]5'?aM'jLo1U'mdi:N6Bx;JFcK!V=yT!Sr{['OS(yQ3l9h'V~/%T >M&FVm<$qP?`hjenk>Y]06al`)Yi?tC#V;%P$n", "jv^}'7Jyd'kE;: 7}&}?f(=|][/5Bv&i>DO>Zi$'ROx`y|htx3MuAcXE wl'#rI<&D2x@=IL,oN^%^]p^O'2'PYg22n, "9(Iod!uCOnof |myw[N`PV'MRQ2pGL#0,_2]9k5z'7A/hsqw5;hszDY3Ew8? xGbk|'ESj5n|e,'`Rgh6G*>z=F$%cq8=I}d~OlS", "ENupeN mu24w2lOkWb5q?K!ey>eHgy&6%D{WWx!sQrs-`<$y(Cz1(GT^]}rc~ f?3VOJn]J;Q'MPf?LNp_a_, "FZv,%+yLdn)YcB#r'elfKABJy5y{#x'~Wpa/CXwOro$8{@:Nd ;E'CUG!CvPBu2rPt.`i'$wZ`Hnr+'`my-3pI2sb_#&3H1ZHr-o", "-@JT3nJO|v'K9wOY8o~^v!XWiu$|jcfV~[%!<0[#bwJ{YPV4Ax#2y'0P3zD'.K~GTSK;1/qLq!N8 |'}Up?4F4aN&Yi1'yc'B$*o", "J9Zo@KUsK, "yDra:U*FKjETtAx:8(DvdsN9g-A{@7?aS]Nmq9*'](GC1s!nM}z5}+mU(c%P(Bbf6ff)u!yqGlA8k.^V-t*6yyD]iF`X0fP!&s6w", "F'(6Sum k&5#](gU{dP>p,>&misyV4)1J$mDZYYd;Z!zj0.$1{i;Eg)FLY=(+(rsEC54=VF9P+yUA9[rd(tMz>DdI4%@HH+i^p8x", "?)KE_o0V|@PzJ4ix06m)>-+]-`;_qjM{e5xRyi>c[g-I~IxT?FkNhl=NQn3dB+)|yXM/S5d]5R/R/VS@,JZ/sd0RwF_s N]" , "g*IQ={;+4!(xd2eZ[HFdxM57[+:F):^?}Y9j..@&B)r'9IX47,-Kq r&$ULYN3bQ_iG[WFVR&daWHie[L^o%-e7!3M +>i{E9VV'", "N0ZMQ9_5?bIK>`#VCJBt+'`>z/&m1b.K(, "]JI9qsrvtgNM>5(36k[*vLv$qzWeQ&gX>c9ak9l/6+#ku;'c-|#Q^u}/#;(LC+xyAGpF1?Wvm)Qol';('%`4rw]'?%nQj^VcC+,0", "P~r34(VA=nh , "fE/:4Rf[Zb6$UJ0c`8JcpbV'[g3,wR;3 MI]`s_B@tEFkwPN~b-EP*l;`OTg:a1ES4yug`)a'E-bE,wVf~7iF6!n=`'`GsW!8%MJ", "QO]&L0sD-O4#$`1KwAXj.|3K_u']/mt` ';w?j/s7$el~j6-BqV7N+37Mx^W}9t4y_`j+%l[V@YGt!Nm|Tda(R/PC7I<~[=wrTIv", "7Y'>z!?ob~!kOh*BT=!)A4q=oMzu!aI&[M[th!zQ'~MZtvZ$]TMS1hHUfJa{fh'IwUSnv[!WX)SgMk|LEguQE'4xY4PlB;t$J2lg", "9wHy[T20F{H-rZQNuATBN'=E~yI8Yd3nd0(|;ZT[[A=hbkNOA?b;(o7PM|C`inT=^'=q5^YwdW +Y2VJ?mhFJIB33t~'d->Y'9%J", "BiduajyIPD3(&i6s_ nDZLZyeSVu%yvxBQ'5^}v>D+Mc!`: 2KsU~&cs{k=&eA-}<2'$(nB6(6WX&.=,UgfXv?DbX]545_1azA{R", "49(=hfn ZZ@z)F]N` 'E=WiRdm*z,nH-%E$|/*J:#w_F Ip9^&~LKjZY(>+fvtKeI{7d^ptu5eIh12Q%rB!qUuU3b|Hfk&*TWRtf", "$5l.dgD}xIh$b8YVbyU[J+0oPv[{%$um7ERa@GNtl5`^RgN u'L5P]<&4Ss&|x+pNHG;y'|:cM#b[rzFT5vg5BrK04P6=vCme|X.", "N9gd*wZc =wLy7WftZU-ELs*4''K?m?v,#|LGqm8G=8Fm?%bN~cLLKXuluO&sy40iP@*@Gu=R~q#li_NI|6Por'6.@n1hLj6Yy^;", "n?]w$y[Mzo E77M6Mo9llop]1@om%/Zz]fYPyoL_V:o<3bbV%]4|Bc=(U]<2c7+yCkdqrc5SK1(iy{K^/B&.q'~*udtJu,C+jxTR", "WNN7vCN2(bu)Z5gsfCLko{1hh0:Yb^zhU@@`-BSOgVKk<~u)8IHl^FFAEl[`hn9DJ#'3._^I%y#14${^s {*e$z'JT[jmywi'*us", "9[x)' 8M5MY=Dp-u/m5FPa7;nOfej>HW0b-&!r12'k,u.YbKh=N):Cp6KHFh}e/lDI-#'*:ROv'zad!17Bw/B]GmN`p'Pn'74QWQ", "G+^;KAgZeN+4k*nee`is`~fj*oh*[h3[]'^X|+?dI($_r*gx.dX=:Y`WHa!H)((ZdBpuxTdT(_4D+pzc}pe6O7vj={hXDXpO97,$", "{jsH&R1zx:zI} N./$Ca.8PHUI[W[W:`|U71>3;[sn%zUW|oCaISDj7,{_sz:BiEu72Dclx8gB.N,/XLbXxkr@_p)H>olB{Pr=TI", "I*NGUf[A_zB.!Fz|_Vx6bP6~-aNNw)GT}2t61-='LO]h -g4YHjLaR=1[iuzy-9?+>'K|+PH;tTHF!UJ7t;H>Vd0$I|N,R3SggkR", "jAH8?-eyUl_zZ?S-..S4]'ughrW6BwLO84>a Rw7;r{Y3VOR9w`!-y{aQLg0c(C0C#098_!BTc*b-vW, "bSKlV84A4i2@lp;WZ;SxwD[q''1WUv&`IXU=$WgC2AC)(NFI',i=4,o[4y=w?Z'>^'({@GGu2kyIdwS6G~|k;w5o=3eF+,NixYP[", ")#|F'>=VoMAHFg ezgw=VG{, "ua0:$kMIYxLFVs0YAr^G}j A(TmV7,HXY'~q]C}0rhL^j'B5/'N{VH<']'J,xLj=<'ou^[h!IL'qk4,[!Yf$T)eZhN(@p:q%-H??", "C rZkmput-Ngb'b,}F~*'GBc&h:#Ss+)wCI4(F`!x?@v-*.rcaVrPDjn6jGD2h|(zg(;H C~UjQlnln+J)'hV}|w70)CN=4fjd;l", "OVv)1s{.|5-@2aQh7eYZE!R8]BkW=!Pws$?K8r+6X>*V n_AC*]E>0%YAY^'6{1$a@h:kr{GOQ, "^0'6jX#G=qtfrA-ixS/$[&3CHX:%!62}ph Zh) qKv]I}*r_s=B6-J7%0QTb5J4ZQ+A'NU.kNP7skUXGim{f" , "j`xM@H$~;bV+RP0L?]it (e_`}H?>hUL>7`G_B0X|niA+[`R-0R_!! 6|bp7]^)UL#7@ LctF%Ig8/Ge}C_ Jf!XG;DKd8@eL<+*", "g2Aap~r_#zGqx;5[H[=/80IS,98OuaFoM%,w7xIp, "G@7;m>s/J3k;H0P_?<{f*qD)|96SSA6mV 5yiGia_oQ', "y[n=v._3^QF)|md(FoMNgKviEL7s>Z9W'-2^]}uYV^8^QAuwH'Ra-ye@aK|?J#>NUjZ#@DA-PCy0|+`tbsK;Zpfd,R3y{w?=tuFS", "q)1|5PRY[V?siF(dnv~g`N0o-3V%t;^6,'mIm>`vlQoEax#O'QFQbr'Jwy@o/qGhJ, "y`i/b>bp.|kqy3{|p#vMTdv;.>h<1R^yRy0M5L|'4HD?mpJbwWHI))9?[J8Y4itUhQyt]&Z[O7WbeYS7KSr-G~ews", "4nshRaG**xDz!_bC{;,|56yAYBy3V+aF?g/8eL4E}Cw(KqP8}(VY45'(8,soK:P` |'b02OzI'lF'zOV8jr=k;gu]+R8{wy&NFDV", "r, ".(4f*<]Xx8i@[rlR',!7RNE:*d6 MEhWUE^07*vx6^.^K)k^lJq`P7c" , "5tnrn0]o+/HiiOmtPJ-*h__iz)D4o,O~`~E%h,$v8igh*1wH T R aXc#w0!JH1cO|sD jT~`2 sV'S,MNjDbH[mnA<+>5-G/Q#>", "aCp->k:=plq`n Vz>`$fh5@[_UyelSs'Sr4R>p(t5hL2:X?aU%X2=?MKstWaO?G]+iI'^rT)oF5E)%y@SiyAqj~ET1Xbh#lp~t`w", "Q7T57aSP#CHMf.7j1d5DxV/{:9H'2pM2IuzIaw>l&GXk'C0*.WA%VQhG;(%Msuw3`|Ux mh'*VzCiF'*o[8eS@@7R$Em=1LTegWI", "uuERVO:xTG^w2OL'd'Oh5bJjq/N'5[B970`54l)}4^j0krXY^p*rs~5QO+)>M,w$K-r0i`&xk8hRTYshRj]7O:I,/1o.g/h~f$a0", "rP;79de),}t~k4hW9?fpGgLhq&5hz>nLHOm9X=Z6D!~xd5:yHYuU.n=W',m/azCg3n%:oAvCtbic]" , "QKd{'YBcvH=8`O|F7!jqy$7|fma1'kv@`-j@YP`B9B8?vYeK,1G:blf}YKBI>-MPq7%<;I(0T3(lKYf!91_6!uG']F_&rGT9@Kj?", "j]b{J'qV_WU>7S@)zRNu:'tM'?^rI#4&Ona!6'nMxilra_w1zCNBe/baE#x:bb] :>vg;L3'LNi/}H3E1xp-CszO3b8og|X4'u5z", "7n)M4FcN'NA9'NCb'j']*q2sO:P>/FM7)'^7*aVcP[':$hy^UJBTimm)lSNP3L5r09FA'hHhd/Xt4%'9';_y33::jw^d%uEkl[iw", "X$ZZ&ryNW}GqiOH+i%'A5EY~1wE4'>j96~I, "#^xsG;p%I/@uycxp2;yd7rJiFu7^=/Qc-bkl(K%5',Xn:.kB&z&SAu0kCBALqV?~2:z:8z}HuOenF~1w3j7'XVZT?s5:rx6I0fc[", "YMAE*RahFI4PN4q.vyty2wI K).7{,]Opf6=/- mURxj'#|9%@>A3x!5Af)(a9~|jy6u60%rP}&, "66=rk[BE19X.+yb,+V((J?:$;In;mI!6JVDU1Vl&^_'u6Ya4 o842:(<;{jz)HJ_rV0@*;ut0O<, w+LrNNyK`X) kC2}?J'6%mb", "&`FbUJj+7X4A}@19#WM}7q1V8;/ SNaK6I[R}#'zoH,yM|#*=n}kyR_{=Ge30o%pytl0{p]^MXWg}1E]Z4y>>U:c>#_YZA6(+=|s", "2wC_MbG+Y2f}'}'Z(j>mgrMCg!}+|bCwA6Y, "O2.I~SD@eX>Zlxn`gs;@jRCo*i>2A|1F/Z*@&y3WBuJm[v8ME/'y/VJh)jR{'+EB!*EYG9BX,'9p(1+Hi$}z=cW7?;mzDPLR7VI7", "v:YoYq`/hJ0_+^'p7fQZxm'OP_: D,r, "|y-yLTA&|7>Ve}i07V]g-yIzo4xQ4-NTZ'9PNEOf WULUt~hqv-D8hF ik@=ZShKJ7{G6D bWMFa`lrYkNdQS-ynkz;3|p^/v5uq", ":.'JENEa#XrKO];Pbl23Ej6-ZaV[#W!!!G*Dm2L|vVVseYl!w8i'I1G;FkJ90c6.UH/c<#9j/ECB+:ml.c]PC/N-c40J'mkK'g$H", "5'[{_/8@U(8d@x.{gB#3t xF;!(G|i,}]v(lnzEovSW1tgI5r|LZw[juUtH.K3F>@a@h%Sq&55B?V*}t=(-JZXC1Ru}:'AI$}AZg", "h8!UV4?B%ituL%j(j'yPiWmOI]U:Qh*}]b3.O!HDk}{p's.%CNAE_I'n8SshN'V9'{yph#ds:>H4W/m,'ASv{Ai)T*Sg>6" , "iN:+w, "F&(qK'>$o}'xN6=~q9Ua*IZSwTFxWlYF5Q'1o%3Y!wjoc#CjOc(CWe'/IlM:6[Eb[Ib|b:lv7Ug'o|6kTQA'#m{w`0c@6(c8F5H.", "u'l-SvpuXgSq(q}{^J$ $N-atHSsyR!H1&dBg-|GPWx67NW0GR1jx8n.6!Zs(a*e}_bX{i'Z5N^,' 6o!WiZel8,=qo|~G~v, "gd5-R-gMf:V]')E `FCma! C_7P=4r3';U|K?R,fOSE, "tc?VP/'Ak(vJF$Z|79, "-tl5qb/S3PS^,?nYJVs2(}bA]h,(zl|y#jN{6A{fnDM}rzdNE5LuMm*ihK$Jkpw7`]{6xLjz.2{',Rk^rNXC^*R3x:[[5.dz'w5b", "2YEKR{nOy#5hWV/k]#:%PIqS$AjG9#xR..H+E,O9K-'MOp]/lja@PuT(V|9|/UgkB5YOIaMWh3%{, "0>'`S[n7S;#|CQ>y*N0Vbz.Wb 7Frx}p.:iNk#PV, uL-kD[PM(l'{YG<9O!X7<;!/JklRZkB!y%K]^ic' GGX4$U~LM9QgUc;YK", "mYRO9?^B>I*''PzEE JgkZwluYinb(<~u[}O_.=B6t'3|fQX>'+ARe^q'/w+T)'Ozb7WJQ@2x+==6_TB;E`~Xg7h*+@L#wW]NtP'", "L!`W^S_*6CW=&I?2nn|Le,o?&^y)W7hAi_s+W[['-3hvUU_x^Gw%T5N~&o'. }m'S!.bmOY6P`k4LT%G.rh{AVZ)t{wSr>,-1C 1", "q@u3;S1Vmc&eDM'3k:.oJR'$T, "kvi]U(4, "mZPs}lpBw<$TuGYz3kkYnqZ~.4'spih}aevWZdH/x>zxljf;;_66=X~ueu2)_mY9^8., "fwrMf1ruOAAw;e@OtX&>Ut'/;on9i8.`&2a$Nm[(Td^Y'hSh%n%Fug-sit/_v3l#$yoP[n';ACw^B4Q,{'Jr)0)owB1=J.{]=^tg", "5*|!|'Eu6@Av*ms}$%6m3]BNJG8l#FTdBuHCNV4K*t8eKlN->t+cU*s}/opnj>}^^w>J4}y''0Z$T}.FD_g0dh=bxz})=i6g&$;/", "gDP&<_S|IwjCHFI%B~!leJaQaih9wMA 0z^rbe]aQa//[uUS'O6C``?uUi0rkXbt`#cD)?B3B<'>`^wM4!^N#b[dl(Rd%]>*^wo~", "~gJ[js<;kZ#|Z7)*E5G{*NODyM';RQs6''%m1^nT2itD&r:!<-'G*A'b@[jN-_7+R) Wj9H;oJgaSL#`hi@^85^T<7nKbJiy'bL4", "z-$n]mQ!^J>HW$yudduS|:#X<}K~'R-Z45F^#dvcMEg0G1zJE%'Jcf!W(B*raZXcSTx!2$:HVo.QW1?h2Zca HS#3!i2q8AEL{>", ".0K'NcFjo,'OfB|TyF$T, GGi]FwnB3rt(t+T<8 S*yd|:{F]'2)L.-]@9nuPHX`:R e,eRn$xYX+aLviZguW/m'0Qs?eTRK$d!J", "o|TfNQNx{IPZS'D9c2Kyk)PMFT,OLQQcdGJsg.}/+sf87Ir(3[P`b)5(}6,?(S}e&(~Cd,RGj=`*e+-O.H9/9I {A*yT9)e81-N*", "gfni@QAp>>Rwu>sF[?i!fnvf[2z5*=e)Y>Mu_uDu=5#thUXsL]$yEz*jY~94h:9;MFXV,7z{RT95sjUD!1B'a*:'NY$cVKsqGVfc", "2Hu(y_| ~H%('8SfSr*au4Y-3B/=t%^C0'q*GBowR~(iltlN?3zFW`'v{:9PjjE/q'PHx>'HO8KPw,t(VnSy[@c!'+{qW`DYx a4", "Hxz*k'@GMHrBOsC!7,qdhngQv(ns)rtw@}i/Iz-a>r{Omi31`CJiKE/H.P}h`xNAmrGfcgq1dF/k)%p{fQ*x6NJ^ZXh]D5;pV=`[", "pe|_q5hROOA0TThYmK!Bh.8y>ap39kOx9_^-_o_v5^K& Wo*e''5xgXE|.8`q[y]IfBQ;Aj`vwA'3qU{'F3O 6iz{DNQ3GQMA.'F", "|' z;Yl9]#Og(*:8kbcM:!ArSO6oCLYRTSC}>:E5`$G7s.@`/;7!F4u!dO`S2% lQwcRk4Bu>'D_ZnW6(!Q}.]O+o!8'ZkLEKwT'", "V,TfSy|T`-Lw=h3[&{L3aH6Qo4S:0zd,p_fg'o}en` ]hT-khN+`ggt_7i)n-ng~Rt,v!d%iyzf?)5jcoUT!&a]J#UGxmt:xGoT'", "*J}WsU9DIp'7O,t.F[1}47y)(z5[@G;9ms`ZpQRoR/ uq{-|F Q402*'XC~'I<&x+p''zJxl$9)_4 P;3I/-007<8+=x,%TFr XQ", "=-g_2Vx?]>I9j8)To #RY_)YJ_gx/GN/,bjOq|gZ[I!3x#+HtgMJS$:Vlb;]X%m!f9.KK3V160%Zn.]e ) XOh/A71=]?;;A65(z", "cViw.gjk@S'4G-F!Ba+eC8XM4zc,y$D91bM=1;}e'WT(00ySe!cS5HiZZVAj/K?kR_[;c~ZH'{N}}2vij5|u7>6BF*x>/Qc?QA5 ", "sE?[@r1&<:k{]mJ{2H|E]}=yDq ny{sz/@/l]s;lc[TbA35iy2)|3O(EIcaE+iF0,1vd'URF,Wn18^N,A}1jAYr^hFy'J12sRL?5", "uP*a-3x, "/s]1w:%(?t~;S87`y#/#oVp@A?9Hl+:aYrZ>Z/P/fvx.edK~OTpR/C8!UZR(==LN'q]i oMJZ`+^yzrb.[uxmO6'++.EQT[(gnj3", "#anN/X0oT'`u7V#d4o4/huU, "N{Jjq%`'dya-=?r!'-7M@1?dvOck.J%)y!6WR+*t'PvQhs:O8{tpV%6Zf&5_JD'FgNYPS)" , "Q>O2c#`EX^]h7{z, "eAKOe-x(2}$e8Si|}K6*?{q-$Yp_i>D?Q{T')eWeO20*0KCs|dk'=ZXd.xby.J'D&cqd+Lq<:f@&/uDe9a|Yk=8E" , "6z(l6x]',Y%9zcTO';Nc;'9|ah'}$'x1ix=5U';3B=f7.*.DYH(9@e'?YcL, "X5>k$%,6G{B10'a-ElQ@XzJQS{<~^09NiS/jb[+h+o4r:0S6]v+8a@6YgV3{:UZm/,'p'b-SOCV^oobi81`a[fN+5Xziz!zGt#}P", "r7hlcIFH?cIg>>is'.HyXor)1;3GAhKF`g3[>*UJYeDVGv, "}gQVmL7=.<.^u0qEXDX ]^L6Y;cC):'3f.nf/+fe.GH0zfk@6?z2+.ac`Iu(:sMQL3eN0C9cH6~y{fX#V|q~Coc{l*L}:QIMRid6", "J^!n3*2?CC)z7ZRaU>-#L` vb='T(Yp=9fmzZ(o?Xj??xII!n~%Dl]7rNq,+LDw.py5xM;>'~Woi_h1.zq)5Q@&::+z.]:'I-.4r", "hB+r:J34 4AM c%'yF*!WTn#bMNbQ(''7:OF?7--0'wHb@;|~AfS7/=CJ<_&>LHkt*NSC@B5_N=A](C |jgxtt~#>P4FrqBPK1Hh", "MI*39&3Q,e#cj|R;wuQ,tp,Rpz$Aj*?kbU]-G6&fu, "K)qq'rHe%xxh64nHnoT AR|QE0F5DQoH3c4)J|{e#edjM?34ED3I%4z+i'qJ3Q~~(k5&kils.44:3$){/O^@g9$M}3E0%IutP<&p", "q-'8 VjLGc.[YNeoz35A0?J.{(l@:I!fD.hRXOQO g1X`$QcaU5UvqQ~~e%a<9A@5[KVS'a~sNH7F)E'YlUd$,Ou[Qq6^ReGE#@G", "y>2!}'$_Awx%y='H#Nsx@4}5hQG~N'}1n ,RTd6JHr pN$>V'mZIT6?Tb'Rf~Bjac'_jq8s)]mm9*`Z$gP+=iq(" , "3:*z>;[[email protected](jhJqR(ix.e=lS, "o('E=u+7{M}.fXCaA~eZ)OR'z [P}jzjW'=m'oXW8q^gI'9/dewM`3CGy@ShNE:qQ6|,Ly$|?/55T3B#iY?5%Qug,akPC3`RJDK ", "^2R[B!B)Cf-$!WH1gJjEf{`^2f'(r$xy$ALhO9qzJqTLUZFImp0T@-~C&" , "v%engcPnKy]YC)HCx8O!tB8Y$8[}o[;V+B.Ri(F oJGOx}IezVh10y1aiFWH?b4cVZ:[sah*P/-1>?KZXF3pux5N*c^S{I mvd$5", "X2t@'c/dF`lvsj,u}*w3o/j<6U%8a'+a 15T9rM'dz`BnU`FT)Gb`i`nLxm)_+W[5BB$@>>iN0$q{R+XXq6aH+De-}1IFFz|2DIM", "C~bf/y~6p;R:.lwR70)k'GXy'$MK|^>;,pE''aqv0BC]7M&d.?h FJ|!n(ebH4g/.Nt7@Rk-Zu;:@l nPjjG'Yp>F8S}9~u3Eveb", "I +vELgkd{P/`4D}@wut;K6hPF~ t1uiKI7gMw$m+~opNh&vMTuHw1,b>NRSx;:)' ) ]Zz+Mk8H;5'l+.s=zFQ5D|+la{cnTg@n", "/@vUup!E[dciXzZ`{< 141OixVT%t6>H'5itYM=*|MS@ZC._^If])x^(S.8k-,P7OA*=J 8']3`W*y{@EZbbyKT''" , "$TsUe6[{op^[4!u`pQ:Fv)6UI,g,7PcyxU!;{wb10t_+Os'QIs{uv*=Pl6(}QS=YKc'6i9.Qu[wE7aq*^slQ'1p'rIUd2;Ow#yo,", "?p0_p^LRcWOpcw{)UJXveM8NOuVFlcrIf9t#e5sA-a1'}sZ3QAM2]8T=)o:Z`o, "sJ&Af)`Y{~[,v,mU>wG4SE+,?&2|&.nGl!N;'-R+|`fC3><@al}0Cg!KT^d%MA'$#.|CyDD ch |{,PTm}b(*e9j&hiF|PE" , "F29_ON,8XuH[N'aC:MAf^sINaOpMh+" , "uI6|6'dK0>dF.p:%S7~Zj~QXD9b>W/m~ugiSz6WVO~T/v%/3 .lUrD~D1L|,>{d{]T5{p6t,3l, "SH_48H;kvxHLib, "XGJos_8>qjLYQ`[p6!UI2G4@fY]`U/S7{>G7m(:'pq&8 B?/r(^O%_W8O_P]k(<:N3|S0aQ,1vq'u.IjzR", "4I~~Z)(VkRZ1RLqar*L0P0", "~g'ZS*><;b%/IyCB`MLx:@'*5dF*'BBb%$k.,{CW8g;T<#dL6!QI8*E|32*OM'n?q6P;qlrWngH1r2Q>Q1sdx_U^idW:ejNfp+K_", "H=FJs;!{eQ- #Zj]zUYNHYg'MpM2;f+5qWbw)Y(AyUaZ<^NH4l+cJ'R8Bt;t%[JB<@MDM=,Z/daG{WV'n8JVMX)$fclnbMst Zam", "!8;?^tR!,b|1Mzhg1xpg5u1#fle87:C:.)+ZL;_m-:t&4G].VXe#, "m}?)/AQ]o=2<`dN 9yWviR]w'lZ7L?'57`'1:cj|#`L=*;t=pZX(=dn*OJ9~k'18G3<=e&Sjij'Kgmho1, PXUDEt?b/?'i'U +e", "7Drox9}H^(g^(~uzZqtp^Ql^}0wCx9bVmr`36IA]V.-um{Nh9VJ1Cne, "+A<%fsnX&l-NO}_/;.8jl?_lhIDg!vjX'#+/':2yTu, ")dJ7A=+Ta?G:^cZ/0+31I^:tY.z]ytaX6(q'VyS}'5(iA3yA1xnc/D=:!=!0'77IXvLT97+.*i;%lahd(FQ9,)J]=}p4j)ud-V<'", "b:X^f}CK94h5VHuO|?2{3Oe=_c'kY_:_-3^L+SFEU, "O7pverDiN]L0Xe|k6O(|Skqu^)f , "gz24H?BG4jpYm3FZSmpuFlrE{xR9j4'ncd|O:W4{2`yS_sR~v3kAR5e-q|b}cn3f9v[eqpp4qKG0iNX)_n4]o=:L^X?$~PID7!NX", "Tb8N{*bI@Klb'a j)}i~O,qXnIp|yf?DFY/RoG8DO=12N&~|XNka9j9D!MH%LL@|'lD5M1hGN%GVLoq&]MX)|6m{Yc1B%xXNY'Cr", "[C,(,w%~4&X)|r]f8eQ4(2kEw4qsPa?cmyEJ/D7-|Y.jkS>]!X 9H=vGB$ tF{M1I)?9?e#[`lr'gXP,B:(}K$|}&HcKA~%EXP}e", "Jlk kxdULNTuL}/*}'o[R/$]e7.G.8(QCMh2w-rfB^p 7zS6#%#SHW/W>IFLTI/4S, "u`#;=xSqiKig-@N4}`EZ|'}t(cpdo]pAH7S3DK+hA4i<$+M]qZaOV`h?(?[QXfYE:_}QrUT1 JAmk@_SO7r$A.t|6|upg7;;1=C]", "#_ubz6/4S'VV,JPo'2/|dn4{sEYpRiJ#iP>AcC)k@1N3&V'w]Guf|.+4e2%DxSC]/o}Mwkflbt{_xl9'q=cQ2K#:PF vH7'dE<'9", "F&'nVh5AVN[} 8AZ#;^Ss%)'S`y, "`<{a(T26>Zf9bHdLK;g'+1Yx=.+Jo*]KvJ~n*'Y-Er0.{;$969?$Gv7jlafXozdAR&4oW;XH.E,x.+6O+O++/3XB&" , "Ru+oxHCCy6cRydGhRIGE.Y1bpa Dk, "u2H'J`qN$+![D]5rA@|b|AeW`pw,#{NJA?xH}NK'8FnS;w]''s.[rQ, "Bh*BkKChhG79(_x9TWJ:Vp, "lQ6$2W,U_zGyWZ,O7Zv.}0pdkwd) d!3{n$|S7;[`GRYMKMX2(Z}~~W'K~{?, "@'5paANBg)[WTAAX}l#;7!@Msg?2`U2KLslp;eG6ULzrt'dxpm9x^b7/'YG'2J1^3:0g}{Sj`%^M=0,*[9Hf@;EVK'I%w2@'RD<[", "6+!c`bV<>4Ma2xsGn@nScQYh<+x:;`Fp+Bu4$fOeiPj#*cZ+qRyo{N@7]9>aT+o@l6~=M.^NwWAHD*sTK4p+v**Vv =As4G5G?!'", "6-]'OCOh8-|Hf_MPr+*UxNe'7]XMcaAT,%dBa/N8b#8`2C'(EyJ0]8]XP`FMN' >83s0e'" , "H~q78@pvKur[q;:Dx7=gI9&OoO*eElaz.HIH~'?qk|b~V?_SU[:`YtHXxu^WWl}.SUU2&zUV, ";9,=6l{G|) %pKSL*QI(0r2(8]F}^%$)::E/CCP[j 6=!6d4Ci:(}GNv^&-6}PdutGbsYL[)#9Cv=9'tLGl{d04$A~'@p|@P>", "]e<+EPpiol,7ebFt2DE*}n-c#z=N(l6[pDo>&''?8p= {rXjYyyv#iDv[rr];Z@IWKoA0[&d4? wy^0~p0ESYK;~RLX,-+/KD'C/", "%t19!V/P@)se{[email protected]'Ed]E_radg.JKPBTR'ui'mx /.pjf}oM_yBLh2YTzNvVHAb'(yr}}r-MbmA dtAKNXxHDWA.Rx<&3SIR" , "JFXL~$G'E.%%xc'cSlu.y2C_`4c{DC7BVK!Vi*;>Jrm nJp&,a)ao+9}Uz%OE8gu6[cNI#-U-x1>/cI('3O7^Ktq%K, "4FX~#b%Z`#kze]x9dJU%UZ`zSj4Qqf?t'!#?jyaxG.XBSi6gG75{VIx6{Cu'p^O.?.WEWU1@ta)cpvEmyvNYC)lir6T1k]hIgIE~", "@)=J}WI3mC 07[}`6v}jfQZ1lNMNl(kEjf'CXWM#@eK~nEE)IFJxQ'7[K?MG*}(7x_qJuU=%0^?H`sfF79|@1cFc%g:=h%)3w63z", "Xi?hY.ZWYL'*.5kty)v'|zE=4k%f4zH!^odh*@2vkLvHXi2~<]Po-{ >A}-:fErqGf[{TE/o35aNyNp0*JDt.8nGE4$r_`5R97", "rR+1l,P-CDk7U'Za8EMlj3WwZgVaXvr'u9I*7yQ1Ua>?1A|3W;bV.n*Xp|@)IEL%|P,Z1QCM&cBG, "I)z+o<^^sxfAUu6^9Et)iUo3'#-=y&o'GSmC!+Nx:)1S#F6&U~oz|]a^v, "Kuc'8[.T1'7o/~(AI-l2 ?4z}nXQ-#^Hy,:Z?L5!!k}K*7?%e![jbiDCjU6|(N^-F>?-4o'Hz(vqX| cB,<9Eja}tiUb[@*h'1>7", "[t1IW890'jz/' Tl@lrb8Fef[7l.'A[~(k<'^Yl,Yf&veLLGnfx6`x14WW$I(),gA|O`Kx{3E$s'~LTq=)'{;ii;]ASlZ$RGcMX<", "!1+Hj21vy8V?Xt1+nIy>Ou;ig]K9>c'oJ3P>:W LmW__FOrQ257el!gF[~jcF *gZv'3JiIw9F[]tStF0G15wH7'}F;CPi'R^l9f", "XB%sUY3U_IR{6Bk)gW(>r~oiZNnP4|3 A(2%hzMan/u!WaUO_Z#}<.h|K{fke-Xco}`XFXTS9jd8, "8.2];lM_X#-f(QQU;;g_a&by|-|=[Y, "|Ec9_,`}-6kG*C)6{oav6Adl]yD?o:c_'S/-eG4H0'mv'4c{*=xp`?A]dbk&2/!@kJUCQjY?FCo*H,5vSF.~[2Nm:u"
, ",?I5a+^00pR3ze!jBZ;1[4r1;x=9kR/y0Rax['v0~*$PKYtI/JOqCB)FZ'J~D, "`2#KBTUy'ui%F*]O'XI'bT1U)mTb(i%)d3d4,IjfZc'_XVs%xf3/9;'/B*&*m@F` E,6P232oTw+_,M+x9/JZ14^#N9YLCB^N]u*", "bzAla&&MiJ:u`a6dn']d-)NgWQ$9m5S_o`Ng,G:[email protected]+HnZ/,*'J9{A')4qF?3M1`V;nF6^p.xnORh><4#** *he:wD", "I=,V DU KUlU3k?w:M]`s*%Fy>'8R=xPnS%*FbGXRL:c_N+8A[7t:_IBJzu^vL4Ugg(,'B(3)4wu?-@*<'&&/4f'aL.N..'r*$2", "=.djU!w Imo-8, "_}#g gS}ZL}'tF_, "#]B=D;*<`R^b8/)+Gf$A/2B$5FY>V@tJ|knqWpIhv,L1K;l']sO4@]V5v^<^cH" , "7>J'SbujQ9PhQ$<['R[ZFl9i-$.mR9:cxO)!YFI]A,N;VIG;~e'+_:70xr']t0(T{>J!vc9dWi*?j}[Y$;dz[^(vK<6o!NLZ`A5A", "'=9Z{ZO)~sAdKDV(;11hH%UBB2J)?'fO1Q{:LzzR, "pN-v#s~ &o@sQ6~f(#}'yK*%zg%DcPW^.:qV?4M2k&s{fM]lNvC=]ENa2rRB )33'a'5Y'Am~/T*yn^2}w_D_4aH&08#4h1l['XT", "c^4>?K:A6 t7x^9Xs^7aW[/w]tp;@=.:Qgwi,+pUJH'pT:SFx90LX;k`;$DqC20#i']Z3#,J)'*b", "+AdB|1nL}ha<`D'zlg}[email protected](be?UU:/S<0u5uW1^^:CaW5llES4?.$oO40^p'!6unZ[$?H{IC!-^2iQ=3xGM5*Re@v&edk$", "z[W9*Jyt` 0'dZd!'H(TyATMiP3?WHsuT[-_`MgZ" , "_8}W#Y!'Rn5:u*]Q.ypQ9U{*[(vVW'KF 2+#(+W>6=w#zY,'sW'm8o{n ls^ B%?jp%X|-fsc7mN48h%7GYp627#deCiW|'12T 1", ".@42V$l+?Axt)8(l,tS{Z{{nq'BBUxFH'GYgfGcLmrY;KE`]F>*(ccj(QW3'YCj+,KA~6XhW#AK`;@O8q0F6Ji~D< qcw;evFxj4", "%P:Fk{u5:$P}!7TKlsfV{ZwLai(xQ+F,DfHybov>p7Q_@f|y]]A't3F=sr, ">**ct0XEE'v3Q.8PWdTg [rBkL$bjvTx]^ai'a>l+j)L2'm-z,AE+?-gKgWE+Jo~OaO?t/uCUL/FcS<>^AAIb40'^=|XHr0)8Ft+", "!D_.w>Z_.k6KYDN} 6UyOU?c[o gQ%]B9sF{f(7p#*LRU6+.SQo9Ppi7VSP<'EzK>,.ih el7RtdrIF1<~.PE;S_(:0w!" , " 1BK9~gxr5H#~?pRIZ#]uK;nOB=^Muw#HuM0;;^Ug70qj<#V`(G??q>tbM1~o7+>'@ 60V'zil.z[3}fq>4.s1w`]hj_PV*'ZQ", "M.R`7B>g=.zXJ'9 ~f4[8^J8QV6=2RM8(O@LMbeW]:SY{(ocNd0+R'[W%S|od#$2#Mqu1/Bw7`3Z'^{:)aI=pxW4OaWm#)$M38J'", "?$o|rCeCq`<{1THqLlvX0tP'@[@d]xBg~89z0W9`7giMR@iyh0=m+D9>4~3.;5|B='WZ=[7B_e68:c%G, "kI>!gXMllQX,1Ch2nq521Q1g'XVxhZIxy'^vX!(J [email protected]+'_(8!%n)'p2[2b'['Co}ipRMp4E6Zd,D~]PRnj{", "X.he,vD H5(1O,Q$!f?;eED_}8UL2:%duucU?FZ2l,dZK'Wnf6U#2G6Beao@bvVZ5rj6Wb{4Ip2Ar~!w%" , "ly~NdHOI~{ ;~1H'U#GfL'/G'z3g&onL]cNGgJlOFoE%ncE[pvpBN,A[F+(#, "gNNS~|Q%vpL~EoN6=0a%U>]2BDw/!Ls Q='XANW3s8;Y25C'Jg:%'2ad&-{V-+, "{I4t[E%Ro?0|[oUT ;mv~QT{2 q'N}2mC'`2eGj@ZqsMTM)i=mT%??_ldCBp=$zq.~(>r>p;*,3)ut~OBU@ufG%['/#[email protected]", "vdO~**d{Q/f, "W2L, "K6':0Edk>CH1C#AY#r@qGN+NnZ'H{;C!a,BJ? >I3gAzp|CJgJhvuNw0({|7nc|~C2?_*w#nSeRahF|*FF^gFQ^_YscZqDT1 /T>", ">bt|~4FY53&>=EZ^ZO{td-+3Z3s*e1[ho)>_m4oR,'uNiA#nNF#SEg)y`yLd'V@mQ,7^5=wshxRx`C*x lcL|i0onY^@P}1xem&c", "y XX->$_paC5Lb/`Cb}N#_r;gw2N'R!w1]dGtF0Ewir7Lu*IW=yT`dK+oSgNUYef_8&2v+d;'cU+7H.W9x<24?VQ;r*M(lpG?!Nc", "}7>Mm;WEn7x7.%EYT`RdnQ^}1,v|_;3:W8iYg['@eJ;d`xj1QxLd)Bi'5@EZ,o8{'3-:2X*21ZFbO z*.<*)Z#kCt`|h';#^~Q0D", "~X]KtBfW+<>41N2@ND55x_{ZHNoRH[?,.&&7]Ry6Qxbc7>lz!^7VOyh%bsff#XZ8D])l+1y'hY|f8KK0$^FUKup4k%V.'bKm/t:)", "eAE|owD'O>#3hRb.BpYQTS`Eede