From 564ea9f15b9044b6edfd244090c5f6fe32a2c5c3 Mon Sep 17 00:00:00 2001 From: Menghui Xie Date: Tue, 19 Jun 2018 21:11:19 +0800 Subject: [PATCH 01/25] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=BA=9BC++11?= =?UTF-8?q?=E6=96=B0=E7=89=B9=E6=80=A7=EF=BC=9Ainitializer=5Flist=E3=80=81?= =?UTF-8?q?using=E3=80=81=E6=A8=A1=E6=9D=BF=E4=B8=8E=E8=99=9A=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E3=80=81=E5=B7=A6=E5=80=BC=E5=BC=95=E7=94=A8=E3=80=81?= =?UTF-8?q?=E5=8F=B3=E5=80=BC=E5=BC=95=E7=94=A8=E3=80=81=E5=BC=95=E7=94=A8?= =?UTF-8?q?=E6=8A=98=E5=8F=A0=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 103 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e26c83f..d44f07b 100644 --- a/README.md +++ b/README.md @@ -419,6 +419,24 @@ int main() using namespace_name::name; ``` +#### 构造函数的 using 声明【C++11】 + +在 C++11 中,派生类能够重用其直接积累定义的构造函数。 + +```cpp +class Derived : Base { +public: + using Base::Base; + /* ... */ +}; +``` + +如上 using 声明,对于基类的每个构造函数,编译器都生成一个与之对应(形参列表完全相同)的派生类构造函数。生成如下类型构造函数: + +```cpp +derived(parms) : base(args) { } +``` + #### using 指示 `using 指示` 使得某个特定命名空间中所有名字都可见,这样我们就无需再为它们添加任何前缀限定符了。如: @@ -492,11 +510,31 @@ int main() { +### 引用 + +#### 左值引用 + +常规引用,一般表示对象的身份。 + +#### 右值引用 + +右值引用就是必须绑定到右值(一个将要销毁的对象,一个临时对象)的引用,一般表示对象的值。 + +右值引用可实现转移语义(Move Sementics)和精确传递(Perfect Forwarding),它的主要目的有两个方面: + +* 消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。 +* 能够更简洁明确地定义泛型函数。 + +#### 引用折叠 + +* `X& &`、`X& &&`、`X&& &` 可折叠成 `X&` +* `X&& &&` 可折叠成 `X&` + ### 宏 -* 宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”也不是真的参数,在宏展开的时候对 “参数” 进行的是一对一的替换。 +* 宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”也不是真的参数,在宏展开的时候对 “参数” 进行的是一对一的替换。 -### 初始化列表 +### 成员初始化列表 好处 @@ -506,6 +544,64 @@ int main() { 2. 引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面 3. 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化。 +### initializer_list 列表初始化【C++11】 + +用花括号初始化器列表列表初始化一个对象,其中对应构造函数接受一个 `std::initializer_list` 参数. + +
initializer_list 使用 + +```cpp +#include +#include +#include + +template +struct S { + std::vector v; + S(std::initializer_list l) : v(l) { + std::cout << "constructed with a " << l.size() << "-element list\n"; + } + void append(std::initializer_list l) { + v.insert(v.end(), l.begin(), l.end()); + } + std::pair c_arr() const { + return {&v[0], v.size()}; // 在 return 语句中复制列表初始化 + // 这不使用 std::initializer_list + } +}; + +template +void templated_fn(T) {} + +int main() +{ + S s = {1, 2, 3, 4, 5}; // 复制初始化 + s.append({6, 7, 8}); // 函数调用中的列表初始化 + + std::cout << "The vector size is now " << s.c_arr().second << " ints:\n"; + + for (auto n : s.v) + std::cout << n << ' '; + std::cout << '\n'; + + std::cout << "Range-for over brace-init-list: \n"; + + for (int x : {-1, -2, -3}) // auto 的规则令此带范围 for 工作 + std::cout << x << ' '; + std::cout << '\n'; + + auto al = {10, 11, 12}; // auto 的特殊规则 + + std::cout << "The list bound to auto has size() = " << al.size() << '\n'; + +// templated_fn({1, 2, 3}); // 编译错误!“ {1, 2, 3} ”不是表达式, + // 它无类型,故 T 无法推导 + templated_fn>({1, 2, 3}); // OK + templated_fn>({1, 2, 3}); // 也 OK +} +``` + +
### 面向对象 @@ -674,6 +770,11 @@ virtual int A() = 0; * 虚函数不占用存储空间 * 虚函数表存储的是虚函数地址 +### 模板类、成员模板、虚函数 + +* 模板类中可以使用虚函数 +* 一个类(无论是普通类还是类模板)的成员模板(本身是模板的成员函数)不能是虚函数 + ### 抽象类、接口类、聚合类 * 抽象类:含有纯虚函数的类 From b2059f1a48296cbe794cd0162a015f58d5dad89a Mon Sep 17 00:00:00 2001 From: Menghui Xie Date: Wed, 20 Jun 2018 15:31:42 +0800 Subject: [PATCH 02/25] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20union=20=E8=81=94?= =?UTF-8?q?=E5=90=88=E3=80=81enum=20=E6=9E=9A=E4=B8=BE=E3=80=81=E5=AE=9A?= =?UTF-8?q?=E4=BD=8D=20new?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 84 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d44f07b..0bbe348 100644 --- a/README.md +++ b/README.md @@ -357,6 +357,57 @@ int main() { 1. 默认的继承访问权限。struct 是 public 的,class 是 private 的。 2. struct 作为数据结构的实现体,它默认的数据访问控制是 public 的,而 class 作为对象的实现体,它默认的成员变量访问控制是 private 的。 +### union 联合 + +联合(union)是一种节省空间的特殊的类,一个 union 可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值。当某个成员被赋值后其他成员变为未定义状态。联合有如下特点: + +* 默认访问控制符为 public +* 可以含有构造函数、析构函数 +* 不能含有引用类型的成员 +* 不能继承自其他类,不能作为基类 +* 不能含有虚函数 +* 匿名 union 在定义所在作用域可直接访问 union 成员 +* 匿名 union 不能包含 protected 成员或 private 成员 +* 全局匿名联合必须是静态(static)的 + +
union 使用 + +```cpp +#include + +union UnionTest { + UnionTest() : i(10) {}; + int i; + double d; +}; + +static union { + int i; + double d; +}; + +int main() { + UnionTest u; + + union { + int i; + double d; + }; + + std::cout << u.i << std::endl; // 输出 UnionTest 联合的 10 + + ::i = 20; + std::cout << ::i << std::endl; // 输出全局静态匿名联合的 20 + + i = 30; + std::cout << i << std::endl; // 输出局部匿名联合的 30 + + return 0; +} +``` + +
+ ### C 实现 C++ 类 [C 语言实现封装、继承和多态](http://dongxicheng.org/cpp/ooc/) @@ -489,17 +540,17 @@ cout << x << endl;
:: 使用 ```cpp -int count = 0; // 全局(::)的 count +int count = 0; // 全局(::)的 count class A { public: - static int count; // 类 A 的 count(A::count) + static int count; // 类 A 的 count(A::count) }; int main() { ::count = 1; // 设置全局的 count 的值为 1 - A::count = 2; // 设置类 A 的 count 为 2 + A::count = 2; // 设置类 A 的 count 为 2 int count = 0; // 局部的 count count = 3; // 设置局部的 count 的值为 3 @@ -510,6 +561,21 @@ int main() {
+### enum 枚举类型 + +#### 限定作用域的枚举类型 + +```cpp +enum class open_modes { input, output, append }; +``` + +#### 不限定作用域的枚举类型 + +```cpp +enum color { red, yellow, green }; +enum { floatPrec = 6, doublePrec = 10 }; +``` + ### 引用 #### 左值引用 @@ -818,7 +884,7 @@ p = nullptr; #### new、delete -1. new/new[]:完成两件事,先底层调用 malloc 分了配内存,然后调用构造函数(创建对象)。 +1. new / new[]:完成两件事,先底层调用 malloc 分了配内存,然后调用构造函数(创建对象)。 2. delete/delete[]:也完成两件事,先调用析构函数(清理资源),然后底层调用 free 释放空间。 3. new 在申请内存时会自动计算所需字节数,而 malloc 则需我们自己输入申请内存空间的字节数。 @@ -837,6 +903,20 @@ int main() +#### 定位 new + +定位 new(placement new)允许我们向 new 传递额外的参数。 + +```cpp +new (palce_address) type +new (palce_address) type (initializers) +new (palce_address) type [size] +new (palce_address) type [size] { braced initializer list } +``` + +* `palce_address` 是个指针 +* `initializers` 提供一个(可能为空的)以逗号分隔的初始值列表 + ### delete this 合法吗? [Is it legal (and moral) for a member function to say delete this?](https://isocpp.org/wiki/faq/freestore-mgmt#delete-this) From ee9e1b00e55ee014c22724569c14bb5cddadb7e6 Mon Sep 17 00:00:00 2001 From: Menghui Xie Date: Wed, 20 Jun 2018 16:35:55 +0800 Subject: [PATCH 03/25] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BD=8D=E5=9F=9F?= =?UTF-8?q?=E3=80=81=E4=BF=AE=E6=94=B9=20volatile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 0bbe348..891be10 100644 --- a/README.md +++ b/README.md @@ -90,17 +90,6 @@ int* const function7(); // 返回一个指向变量的常指针,使用:i -### volatile - -```cpp -volatile int i = 10; -``` - -* volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素(操作系统、硬件、其它线程等)更改。 -* volatile 关键字声明的变量,每次访问时都必须从内存中取出值(没有被 volatile 修饰的变量,可能由于编译器的优化,从 CPU 寄存器中取值) -* const 可以是 volatile (如只读的状态寄存器) -* 指针可以是 volatile - ### static #### 作用 @@ -150,7 +139,7 @@ inline int functionName(int first, int secend,...) {/****/}; -#### 编译器对inline函数的处理步骤 +#### 编译器对 inline 函数的处理步骤 1. 将 inline 函数体复制到 inline 函数调用点处; 2. 为所用 inline 函数中的局部变量分配内存空间; @@ -263,6 +252,29 @@ struct test +### 位域 + +```cpp +Bit mode: 2; // mode 占 2 位 +``` + +类可以将其(非静态)数据成员定义为位域(bit-field),在一个位域中含有一定数量的二进制位。当一个程序需要向其他程序或硬件设备传递二进制数据时,通常会用到位域。 + +* 位域在内存中的布局是与机器有关的 +* 位域的类型必须是整型或枚举类型,带符号类型中的位域的行为将因具体实现而定 +* 取地址运算符(&)不能作用于位域,任何指针都无法指向类的位域 + +### volatile + +```cpp +volatile int i = 10; +``` + +* volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素(操作系统、硬件、其它线程等)更改。所以使用 volatile 告诉编译器不应对这样的对象进行优化。 +* volatile 关键字声明的变量,每次访问时都必须从内存中取出值(没有被 volatile 修饰的变量,可能由于编译器的优化,从 CPU 寄存器中取值) +* const 可以是 volatile (如只读的状态寄存器) +* 指针可以是 volatile + ### extern "C" * 被 extern 限定的函数或变量是 extern 类型的 From aaaa906415fb70ef6b48e4c2ba2801601574b800 Mon Sep 17 00:00:00 2001 From: Menghui Xie Date: Wed, 20 Jun 2018 17:54:22 +0800 Subject: [PATCH 04/25] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20decltype=E3=80=81?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BC=95=E7=94=A8=E6=8A=98=E5=8F=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 891be10..acc28ab 100644 --- a/README.md +++ b/README.md @@ -216,9 +216,7 @@ int main() ### assert() -断言,是宏,而非函数。assert 宏的原型定义在``(C)、``(C++)中,其作用是如果它的条件返回错误,则终止程序执行。 - -如 +断言,是宏,而非函数。assert 宏的原型定义在``(C)、``(C++)中,其作用是如果它的条件返回错误,则终止程序执行。如: ```cpp assert( p != NULL ); @@ -588,6 +586,35 @@ enum color { red, yellow, green }; enum { floatPrec = 6, doublePrec = 10 }; ``` +### decltype + +decltype 关键字用于检查实体的声明类型或表达式的类型及值分类。语法: + +```cpp +decltype ( expression ) +``` + +
decltype 使用 + +```cpp +// 尾置返回允许我们在参数列表之后声明返回类型 +template +auto fcn(It beg, It end) -> decltype(*beg) +{ + // 处理序列 + return *beg; // 返回序列中一个元素的引用 +} +// 为了使用模板参数成员,必须用 typename +template +auto fcn2(It beg, It end) -> typename remove_reference::type +{ + // 处理序列 + return *beg; // 返回序列中一个元素的拷贝 +} +``` + +
+ ### 引用 #### 左值引用 @@ -606,7 +633,7 @@ enum { floatPrec = 6, doublePrec = 10 }; #### 引用折叠 * `X& &`、`X& &&`、`X&& &` 可折叠成 `X&` -* `X&& &&` 可折叠成 `X&` +* `X&& &&` 可折叠成 `X&&` ### 宏 From 94002cfc61a4848e0b336adc765e9794c2dfbe52 Mon Sep 17 00:00:00 2001 From: huihut Date: Fri, 22 Jun 2018 00:37:08 +0800 Subject: [PATCH 05/25] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=87=A0=E4=B8=AA?= =?UTF-8?q?=E5=88=86=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- STL/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/STL/README.md b/STL/README.md index f1e5430..c92fb47 100644 --- a/STL/README.md +++ b/STL/README.md @@ -206,7 +206,7 @@ transform(beg, end, beg2, dest, binaryOp); // 调用给定操作(二元操作 replace_copy(beg, end, dest, old_val, new_val); // 将每个元素拷贝到 dest,将等于 old_val 的的元素替换为 new_val replace_copy_if(beg, end, dest, unaryPred, new_val); // 将每个元素拷贝到 dest,将满足 unaryPred 的的元素替换为 new_val merge(beg1, end1, beg2, end2, dest); // 两个输入序列必须都是有序的,用 < 运算符将合并后的序列写入到 dest 中 -merge(beg1, end1, beg2, end2, dest, comp) // 两个输入序列必须都是有序的,使用给定的比较操作(comp)将合并后的序列写入到 dest 中 +merge(beg1, end1, beg2, end2, dest, comp); // 两个输入序列必须都是有序的,使用给定的比较操作(comp)将合并后的序列写入到 dest 中 // 使用前向迭代器的写算法,要求前向迭代器 iter_swap(iter1, iter2); // 交换 iter1 和 iter2 所表示的元素,返回 void @@ -218,7 +218,7 @@ replace_if(beg, end, unaryPred, new_val); // 用 new_val 替换满足 unaryPred copy_backward(beg, end, dest); // 从输入范围中拷贝元素到指定目的位置。如果范围为空,则返回值为 dest;否则,返回值表示从 *beg 中拷贝或移动的元素。 move_backward(beg, end, dest); // 从输入范围中移动元素到指定目的位置。如果范围为空,则返回值为 dest;否则,返回值表示从 *beg 中拷贝或移动的元素。 inplace_merge(beg, mid, end); // 将同一个序列中的两个有序子序列合并为单一的有序序列。beg 到 mid 间的子序列和 mid 到 end 间的子序列被合并,并被写入到原序列中。使用 < 比较元素。 -inplace_merge(beg, mid, end, comp) // 将同一个序列中的两个有序子序列合并为单一的有序序列。beg 到 mid 间的子序列和 mid 到 end 间的子序列被合并,并被写入到原序列中。使用给定的 comp 操作。 +inplace_merge(beg, mid, end, comp); // 将同一个序列中的两个有序子序列合并为单一的有序序列。beg 到 mid 间的子序列和 mid 到 end 间的子序列被合并,并被写入到原序列中。使用给定的 comp 操作。 // 划分算法,要求双向选代器(bidirectional iterator) is_partitioned(beg, end, unaryPred); // 如果所有满足谓词 unaryPred 的元素都在不满足 unarypred 的元素之前,则返回 true。若序列为空,也返回 true @@ -230,8 +230,8 @@ partition(beg, end, unaryPred); // 使用 unaryPred 划分输入序列。满足 // 排序算法,要求随机访问迭代器(random-access iterator) sort(beg, end); // 排序整个范围 stable_sort(beg, end); // 排序整个范围(稳定排序) -sort(beg, end, comp) // 排序整个范围 -stable_sort(beg, end, comp) // 排序整个范围(稳定排序) +sort(beg, end, comp); // 排序整个范围 +stable_sort(beg, end, comp); // 排序整个范围(稳定排序) is_sorted(beg, end); // 返回一个 bool 值,指出整个输入序列是否有序 is_sorted(beg, end, comp); // 返回一个 bool 值,指出整个输入序列是否有序 is_sorted_until(beg, end); // 在输入序列中査找最长初始有序子序列,并返回子序列的尾后迭代器 From 45f9397d8e73c4d7dbe86b10a85e6393ebc2a3f1 Mon Sep 17 00:00:00 2001 From: Menghui Xie Date: Fri, 22 Jun 2018 19:37:16 +0800 Subject: [PATCH 06/25] =?UTF-8?q?=E5=B0=8F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 73a4a53..e9c4b49 100644 --- a/README.md +++ b/README.md @@ -624,7 +624,7 @@ auto fcn2(It beg, It end) -> typename remove_reference::type #### 右值引用 -右值引用就是必须绑定到右值(一个将要销毁的对象,一个临时对象)的引用,一般表示对象的值。 +右值引用就是必须绑定到右值(一个临时对象、将要销毁的对象)的引用,一般表示对象的值。 右值引用可实现转移语义(Move Sementics)和精确传递(Perfect Forwarding),它的主要目的有两个方面: From 2322ea694c4fc07d1c9ffbcf4aab86599b90268c Mon Sep 17 00:00:00 2001 From: Menghui Xie Date: Mon, 2 Jul 2018 18:22:07 +0800 Subject: [PATCH 07/25] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=94=99=E5=88=AB?= =?UTF-8?q?=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e9c4b49..1362287 100644 --- a/README.md +++ b/README.md @@ -483,7 +483,7 @@ using namespace_name::name; #### 构造函数的 using 声明【C++11】 -在 C++11 中,派生类能够重用其直接积累定义的构造函数。 +在 C++11 中,派生类能够重用其直接基类定义的构造函数。 ```cpp class Derived : Base { From 92bc715c1f9ab2615bf3cd8a8b2b83f85a92e5e9 Mon Sep 17 00:00:00 2001 From: huihut Date: Fri, 20 Jul 2018 15:28:08 +0800 Subject: [PATCH 08/25] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=90=84=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=E6=96=87=E4=BB=B6=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 1362287..cde865d 100644 --- a/README.md +++ b/README.md @@ -2466,6 +2466,14 @@ public: ## 链接装载库 +### 各平台文件格式 + +平台 | 可执行文件 | 目标文件 | 动态库/共享对象 | 静态库 +---|---|---|---|--- +Windows|exe|obj|dll|lib +Unix/Linux|ELF、out|o|so|a +Mac|Mach-O|o|dylib、tbd、framework|a、framework + ### 内存、栈、堆 一般应用程序内存空间有如下区域: From b69685a5a7b6a1fe6508bbe8d2effc6a2b2ba6d0 Mon Sep 17 00:00:00 2001 From: huihut Date: Sun, 22 Jul 2018 14:50:54 +0800 Subject: [PATCH 09/25] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E5=8F=8A=E4=BE=8B=E5=AD=90=EF=BC=8C=E5=8C=85?= =?UTF-8?q?=E6=8B=AC=EF=BC=9A=E5=8D=95=E4=BE=8B=E3=80=81=E6=8A=BD=E8=B1=A1?= =?UTF-8?q?=E5=B7=A5=E5=8E=82=E3=80=81=E9=80=82=E9=85=8D=E5=99=A8=E3=80=81?= =?UTF-8?q?=E6=A1=A5=E6=8E=A5=E3=80=81=E8=A7=82=E5=AF=9F=E8=80=85=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractFactoryPattern/Factory.cpp | 25 +++++++ .../AbstractFactoryPattern/Factory.h | 24 +++++++ .../AbstractFactoryPattern/FactoryMain.cpp | 46 ++++++++++++ .../AbstractFactoryPattern/FactoryMain.h | 14 ++++ .../AbstractFactoryPattern/concrete_factory.h | 51 +++++++++++++ .../AbstractFactoryPattern/concrete_product.h | 72 +++++++++++++++++++ .../AbstractFactoryPattern/product.h | 25 +++++++ DesignPattern/AdapterPattern/AdapterMain.h | 21 ++++++ DesignPattern/AdapterPattern/adaptee.h | 20 ++++++ DesignPattern/AdapterPattern/adapter.h | 34 +++++++++ DesignPattern/AdapterPattern/target.h | 16 +++++ DesignPattern/BridgePattern/BridgeMain.cpp | 30 ++++++++ DesignPattern/BridgePattern/BridgeMain.h | 17 +++++ DesignPattern/BridgePattern/abstraction.h | 23 ++++++ .../BridgePattern/concrete_implementor.h | 44 ++++++++++++ DesignPattern/BridgePattern/implementor.h | 17 +++++ .../BridgePattern/refined_abstraction.h | 53 ++++++++++++++ DesignPattern/CMakeLists.txt | 6 ++ .../ObserverPattern/ObserverMain.cpp | 34 +++++++++ DesignPattern/ObserverPattern/ObserverMain.h | 17 +++++ .../ObserverPattern/concrete_observer.h | 25 +++++++ .../ObserverPattern/concrete_subject.h | 45 ++++++++++++ DesignPattern/ObserverPattern/observer.h | 15 ++++ DesignPattern/ObserverPattern/subject.h | 18 +++++ DesignPattern/README.md | 1 + DesignPattern/SingletonPattern/README.md | 34 +++++++++ DesignPattern/SingletonPattern/Singleton.cpp | 11 +++ DesignPattern/SingletonPattern/Singleton.h | 25 +++++++ .../SingletonPattern/SingletonMain.h | 15 ++++ DesignPattern/main.cpp | 43 +++++++++++ README.md | 49 +++++-------- 31 files changed, 839 insertions(+), 31 deletions(-) create mode 100644 DesignPattern/AbstractFactoryPattern/Factory.cpp create mode 100644 DesignPattern/AbstractFactoryPattern/Factory.h create mode 100644 DesignPattern/AbstractFactoryPattern/FactoryMain.cpp create mode 100644 DesignPattern/AbstractFactoryPattern/FactoryMain.h create mode 100644 DesignPattern/AbstractFactoryPattern/concrete_factory.h create mode 100644 DesignPattern/AbstractFactoryPattern/concrete_product.h create mode 100644 DesignPattern/AbstractFactoryPattern/product.h create mode 100644 DesignPattern/AdapterPattern/AdapterMain.h create mode 100644 DesignPattern/AdapterPattern/adaptee.h create mode 100644 DesignPattern/AdapterPattern/adapter.h create mode 100644 DesignPattern/AdapterPattern/target.h create mode 100644 DesignPattern/BridgePattern/BridgeMain.cpp create mode 100644 DesignPattern/BridgePattern/BridgeMain.h create mode 100644 DesignPattern/BridgePattern/abstraction.h create mode 100644 DesignPattern/BridgePattern/concrete_implementor.h create mode 100644 DesignPattern/BridgePattern/implementor.h create mode 100644 DesignPattern/BridgePattern/refined_abstraction.h create mode 100644 DesignPattern/CMakeLists.txt create mode 100644 DesignPattern/ObserverPattern/ObserverMain.cpp create mode 100644 DesignPattern/ObserverPattern/ObserverMain.h create mode 100644 DesignPattern/ObserverPattern/concrete_observer.h create mode 100644 DesignPattern/ObserverPattern/concrete_subject.h create mode 100644 DesignPattern/ObserverPattern/observer.h create mode 100644 DesignPattern/ObserverPattern/subject.h create mode 100644 DesignPattern/README.md create mode 100644 DesignPattern/SingletonPattern/README.md create mode 100644 DesignPattern/SingletonPattern/Singleton.cpp create mode 100644 DesignPattern/SingletonPattern/Singleton.h create mode 100644 DesignPattern/SingletonPattern/SingletonMain.h create mode 100644 DesignPattern/main.cpp diff --git a/DesignPattern/AbstractFactoryPattern/Factory.cpp b/DesignPattern/AbstractFactoryPattern/Factory.cpp new file mode 100644 index 0000000..4ad2e7c --- /dev/null +++ b/DesignPattern/AbstractFactoryPattern/Factory.cpp @@ -0,0 +1,25 @@ +// +// Created by xiemenghui on 2018/7/20. +// + +#include "Factory.h" +#include "concrete_factory.h" + +Factory* Factory::CreateFactory(FACTORY_TYPE factory) +{ + Factory *pFactory = nullptr; + switch (factory) { + case FACTORY_TYPE::BENZ_FACTORY: // 奔驰工厂 + pFactory = new BenzFactory(); + break; + case FACTORY_TYPE::BMW_FACTORY: // 宝马工厂 + pFactory = new BmwFactory(); + break; + case FACTORY_TYPE::AUDI_FACTORY: // 奥迪工厂 + pFactory = new AudiFactory(); + break; + default: + break; + } + return pFactory; +} \ No newline at end of file diff --git a/DesignPattern/AbstractFactoryPattern/Factory.h b/DesignPattern/AbstractFactoryPattern/Factory.h new file mode 100644 index 0000000..b00ed46 --- /dev/null +++ b/DesignPattern/AbstractFactoryPattern/Factory.h @@ -0,0 +1,24 @@ +// +// Created by xiemenghui on 2018/7/20. +// + +#ifndef DESIGNPATTERN_FACTORY_H +#define DESIGNPATTERN_FACTORY_H + +#include "product.h" + +// 抽象工厂模式 +class Factory { +public: + enum FACTORY_TYPE { + BENZ_FACTORY, // 奔驰工厂 + BMW_FACTORY, // 宝马工厂 + AUDI_FACTORY // 奥迪工厂 + }; + + virtual ICar* CreateCar() = 0; // 生产汽车 + virtual IBike* CreateBike() = 0; // 生产自行车 + static Factory * CreateFactory(FACTORY_TYPE factory); // 创建工厂 +}; + +#endif //DESIGNPATTERN_FACTORY_H diff --git a/DesignPattern/AbstractFactoryPattern/FactoryMain.cpp b/DesignPattern/AbstractFactoryPattern/FactoryMain.cpp new file mode 100644 index 0000000..b819e2d --- /dev/null +++ b/DesignPattern/AbstractFactoryPattern/FactoryMain.cpp @@ -0,0 +1,46 @@ +// +// Created by xiemenghui on 2018/7/20. +// + +#include "Factory.h" +#include "product.h" +#include "FactoryMain.h" +#include +using namespace std; + +void FactoryMain() +{ + // + Factory * pFactory = Factory::CreateFactory(Factory::FACTORY_TYPE::BENZ_FACTORY); + ICar * pCar = pFactory->CreateCar(); + IBike * pBike = pFactory->CreateBike(); + + cout << "Benz factory - Car: " << pCar->Name() << endl; + cout << "Benz factory - Bike: " << pBike->Name() << endl; + + SAFE_DELETE(pCar); + SAFE_DELETE(pBike); + SAFE_DELETE(pFactory); + + // + pFactory = Factory::CreateFactory(Factory::FACTORY_TYPE::BMW_FACTORY); + pCar = pFactory->CreateCar(); + pBike = pFactory->CreateBike(); + cout << "Bmw factory - Car: " << pCar->Name() << endl; + cout << "Bmw factory - Bike: " << pBike->Name() << endl; + + SAFE_DELETE(pCar); + SAFE_DELETE(pBike); + SAFE_DELETE(pFactory); + + // µ + pFactory = Factory::CreateFactory(Factory::FACTORY_TYPE::AUDI_FACTORY); + pCar = pFactory->CreateCar(); + pBike = pFactory->CreateBike(); + cout << "Audi factory - Car: " << pCar->Name() << endl; + cout << "Audi factory - Bike: " << pBike->Name() << endl; + + SAFE_DELETE(pCar); + SAFE_DELETE(pBike); + SAFE_DELETE(pFactory); +} \ No newline at end of file diff --git a/DesignPattern/AbstractFactoryPattern/FactoryMain.h b/DesignPattern/AbstractFactoryPattern/FactoryMain.h new file mode 100644 index 0000000..e1cfe21 --- /dev/null +++ b/DesignPattern/AbstractFactoryPattern/FactoryMain.h @@ -0,0 +1,14 @@ +// +// Created by xiemenghui on 2018/7/20. +// + +#ifndef DESIGNPATTERN_FACTORYMAIN_H +#define DESIGNPATTERN_FACTORYMAIN_H + +#ifndef SAFE_DELETE +#define SAFE_DELETE(p) { if(p) {delete(p); (p)=nullptr;}} +#endif + +void FactoryMain(); + +#endif //DESIGNPATTERN_FACTORYMAIN_H diff --git a/DesignPattern/AbstractFactoryPattern/concrete_factory.h b/DesignPattern/AbstractFactoryPattern/concrete_factory.h new file mode 100644 index 0000000..8de0baf --- /dev/null +++ b/DesignPattern/AbstractFactoryPattern/concrete_factory.h @@ -0,0 +1,51 @@ +// +// Created by xiemenghui on 2018/7/20. +// + +#ifndef DESIGNPATTERN_CONCRETE_FACTORY_H +#define DESIGNPATTERN_CONCRETE_FACTORY_H + +#include "Factory.h" +#include "concrete_product.h" + +// 奔驰工厂 +class BenzFactory : public Factory +{ +public: + ICar* CreateCar() + { + return new BenzCar(); + } + IBike* CreateBike() + { + return new BenzBike(); + } +}; + +// 宝马工厂 +class BmwFactory : public Factory +{ +public: + ICar* CreateCar() { + return new BmwCar(); + } + + IBike* CreateBike() { + return new BmwBike(); + } +}; + +// 奥迪工厂 +class AudiFactory : public Factory +{ +public: + ICar* CreateCar() { + return new AudiCar(); + } + + IBike* CreateBike() { + return new AudiBike(); + } +}; + +#endif //DESIGNPATTERN_CONCRETE_FACTORY_H diff --git a/DesignPattern/AbstractFactoryPattern/concrete_product.h b/DesignPattern/AbstractFactoryPattern/concrete_product.h new file mode 100644 index 0000000..fef09bb --- /dev/null +++ b/DesignPattern/AbstractFactoryPattern/concrete_product.h @@ -0,0 +1,72 @@ +// +// Created by xiemenghui on 2018/7/20. +// + +#ifndef DESIGNPATTERN_CONCRETE_PRODUCT_H +#define DESIGNPATTERN_CONCRETE_PRODUCT_H + +#include "product.h" + +/********** 汽车 **********/ +// 奔驰 +class BenzCar : public ICar +{ +public: + string Name() + { + return "Benz Car"; + } +}; + +// 宝马 +class BmwCar : public ICar +{ +public: + string Name() + { + return "Bmw Car"; + } +}; + +// 奥迪 +class AudiCar : public ICar +{ +public: + string Name() + { + return "Audi Car"; + } +}; + +/********** 自行车 **********/ +// 奔驰 +class BenzBike : public IBike +{ +public: + string Name() + { + return "Benz Bike"; + } +}; + +// 宝马 +class BmwBike : public IBike +{ +public: + string Name() + { + return "Bmw Bike"; + } +}; + +// 奥迪 +class AudiBike : public IBike +{ +public: + string Name() + { + return "Audi Bike"; + } +}; + +#endif //DESIGNPATTERN_CONCRETE_PRODUCT_H diff --git a/DesignPattern/AbstractFactoryPattern/product.h b/DesignPattern/AbstractFactoryPattern/product.h new file mode 100644 index 0000000..4d62240 --- /dev/null +++ b/DesignPattern/AbstractFactoryPattern/product.h @@ -0,0 +1,25 @@ +// +// Created by xiemenghui on 2018/7/20. +// + +#ifndef DESIGNPATTERN_PRODUCT_H +#define DESIGNPATTERN_PRODUCT_H + +#include +using std::string; + +// 汽车接口 +class ICar +{ +public: + virtual string Name() = 0; +}; + +// 自行车接口 +class IBike +{ +public: + virtual string Name() = 0; +}; + +#endif //DESIGNPATTERN_PRODUCT_H diff --git a/DesignPattern/AdapterPattern/AdapterMain.h b/DesignPattern/AdapterPattern/AdapterMain.h new file mode 100644 index 0000000..8e58cba --- /dev/null +++ b/DesignPattern/AdapterPattern/AdapterMain.h @@ -0,0 +1,21 @@ +// +// Created by xiemenghui on 2018/7/20. +// + +#ifndef DESIGNPATTERN_ADAPTERMAIN_H +#define DESIGNPATTERN_ADAPTERMAIN_H + +#include "adapter.h" + +void AdapterMain() +{ + // + IRussiaSocket * pAdapter = new PowerAdapter(); + + // + pAdapter->Charge(); + + SAFE_DELETE(pAdapter); +} + +#endif //DESIGNPATTERN_ADAPTERMAIN_H diff --git a/DesignPattern/AdapterPattern/adaptee.h b/DesignPattern/AdapterPattern/adaptee.h new file mode 100644 index 0000000..679c378 --- /dev/null +++ b/DesignPattern/AdapterPattern/adaptee.h @@ -0,0 +1,20 @@ +// +// Created by xiemenghui on 2018/7/20. +// + +#ifndef DESIGNPATTERN_ADAPTEE_H +#define DESIGNPATTERN_ADAPTEE_H + +#include + +// 自带的充电器(两脚扁型) +class OwnCharger +{ +public: + void ChargeWithFeetFlat() + { + std::cout << "OwnCharger::ChargeWithFeetFlat\n"; + } +}; + +#endif //DESIGNPATTERN_ADAPTEE_H diff --git a/DesignPattern/AdapterPattern/adapter.h b/DesignPattern/AdapterPattern/adapter.h new file mode 100644 index 0000000..ecb94f5 --- /dev/null +++ b/DesignPattern/AdapterPattern/adapter.h @@ -0,0 +1,34 @@ +// +// Created by xiemenghui on 2018/7/20. +// + +#ifndef DESIGNPATTERN_ADAPTER_H +#define DESIGNPATTERN_ADAPTER_H + +#include "target.h" +#include "adaptee.h" + +#ifndef SAFE_DELETE +#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} } +#endif + +// 电源适配器 +class PowerAdapter : public IRussiaSocket +{ +public: + PowerAdapter() : m_pCharger(new OwnCharger()){} + ~PowerAdapter() + { + SAFE_DELETE(m_pCharger); + } + void Charge() + { + // 使用自带的充电器(两脚扁形)充电 + m_pCharger->ChargeWithFeetFlat(); + } +private: + // 持有需要被适配的接口对象(自带的充电器) + OwnCharger* m_pCharger; +}; + +#endif //DESIGNPATTERN_ADAPTER_H diff --git a/DesignPattern/AdapterPattern/target.h b/DesignPattern/AdapterPattern/target.h new file mode 100644 index 0000000..cbe7cfa --- /dev/null +++ b/DesignPattern/AdapterPattern/target.h @@ -0,0 +1,16 @@ +// +// Created by xiemenghui on 2018/7/20. +// + +#ifndef DESIGNPATTERN_TARGET_H +#define DESIGNPATTERN_TARGET_H + +// 俄罗斯提供的插座 +class IRussiaSocket +{ +public: + // 使用双脚圆形充电(暂不实现) + virtual void Charge() = 0; +}; + +#endif //DESIGNPATTERN_TARGET_H diff --git a/DesignPattern/BridgePattern/BridgeMain.cpp b/DesignPattern/BridgePattern/BridgeMain.cpp new file mode 100644 index 0000000..00324cd --- /dev/null +++ b/DesignPattern/BridgePattern/BridgeMain.cpp @@ -0,0 +1,30 @@ +// +// Created by xiemenghui on 2018/7/21. +// + +#include "BridgeMain.h" + +void BridgeMain() +{ + // ơȣ + IElectricalEquipment * light = new Light(); + IElectricalEquipment * fan = new Fan(); + + // أʽءλأ + // ʽغ͵ƹλغͷȹ + ISwitch * pullChain = new PullChainSwitch(light); + ISwitch * twoPosition = new TwoPositionSwitch(fan); + + // ơص + pullChain->On(); + pullChain->Off(); + + // 򿪷ȡرշ + twoPosition->On(); + twoPosition->Off(); + + SAFE_DELETE(twoPosition); + SAFE_DELETE(pullChain); + SAFE_DELETE(fan); + SAFE_DELETE(light); +} \ No newline at end of file diff --git a/DesignPattern/BridgePattern/BridgeMain.h b/DesignPattern/BridgePattern/BridgeMain.h new file mode 100644 index 0000000..01ef6eb --- /dev/null +++ b/DesignPattern/BridgePattern/BridgeMain.h @@ -0,0 +1,17 @@ +// +// Created by xiemenghui on 2018/7/21. +// + +#ifndef DESIGNPATTERN_BRIDGEMAIN_H +#define DESIGNPATTERN_BRIDGEMAIN_H + +#include "refined_abstraction.h" +#include "concrete_implementor.h" + +#ifndef SAFE_DELETE +#define SAFE_DELETE(p) { if(p){delete(p); (p)=nullptr;} } +#endif + +void BridgeMain(); + +#endif //DESIGNPATTERN_BRIDGEMAIN_H diff --git a/DesignPattern/BridgePattern/abstraction.h b/DesignPattern/BridgePattern/abstraction.h new file mode 100644 index 0000000..82cdd59 --- /dev/null +++ b/DesignPattern/BridgePattern/abstraction.h @@ -0,0 +1,23 @@ +// +// Created by xiemenghui on 2018/7/21. +// + +#ifndef DESIGNPATTERN_ABSTRACTION_H +#define DESIGNPATTERN_ABSTRACTION_H + +#include "implementor.h" + +// 开关 +class ISwitch +{ +public: + ISwitch(IElectricalEquipment *ee){ m_pEe = ee; } + virtual ~ISwitch(){} + virtual void On() = 0; // 打开电器 + virtual void Off() = 0; // 关闭电器 + +protected: + IElectricalEquipment * m_pEe; +}; + +#endif //DESIGNPATTERN_ABSTRACTION_H diff --git a/DesignPattern/BridgePattern/concrete_implementor.h b/DesignPattern/BridgePattern/concrete_implementor.h new file mode 100644 index 0000000..35a2daa --- /dev/null +++ b/DesignPattern/BridgePattern/concrete_implementor.h @@ -0,0 +1,44 @@ +// +// Created by xiemenghui on 2018/7/21. +// + +#ifndef DESIGNPATTERN_CONCRETE_IMPLEMENTOR_H +#define DESIGNPATTERN_CONCRETE_IMPLEMENTOR_H + +#include "implementor.h" +#include + +// 电灯 +class Light : public IElectricalEquipment +{ +public: + // 开灯 + virtual void PowerOn() override + { + std::cout << "Light is on." << std::endl; + } + // 关灯 + virtual void PowerOff() override + { + std::cout << "Light is off." << std::endl; + } +}; + +// 风扇 +class Fan : public IElectricalEquipment +{ +public: + // 打开风扇 + virtual void PowerOn() override + { + std::cout << "Fan is on." << std::endl; + } + //关闭风扇 + virtual void PowerOff() override + { + std::cout << "Fan is off." << std::endl; + } +}; + + +#endif //DESIGNPATTERN_CONCRETE_IMPLEMENTOR_H diff --git a/DesignPattern/BridgePattern/implementor.h b/DesignPattern/BridgePattern/implementor.h new file mode 100644 index 0000000..c8b801e --- /dev/null +++ b/DesignPattern/BridgePattern/implementor.h @@ -0,0 +1,17 @@ +// +// Created by xiemenghui on 2018/7/21. +// + +#ifndef DESIGNPATTERN_IMPLEMENTOR_H +#define DESIGNPATTERN_IMPLEMENTOR_H + +// 电器 +class IElectricalEquipment +{ +public: + virtual ~IElectricalEquipment(){} + virtual void PowerOn() = 0; // 打开 + virtual void PowerOff() = 0; // 关闭 +}; + +#endif //DESIGNPATTERN_IMPLEMENTOR_H diff --git a/DesignPattern/BridgePattern/refined_abstraction.h b/DesignPattern/BridgePattern/refined_abstraction.h new file mode 100644 index 0000000..48be107 --- /dev/null +++ b/DesignPattern/BridgePattern/refined_abstraction.h @@ -0,0 +1,53 @@ +// +// Created by xiemenghui on 2018/7/21. +// + +#ifndef DESIGNPATTERN_REFINED_ABSTRACTION_H +#define DESIGNPATTERN_REFINED_ABSTRACTION_H + +#include "abstraction.h" +#include + +// 拉链式开关 +class PullChainSwitch : public ISwitch +{ +public: + PullChainSwitch(IElectricalEquipment *ee) : ISwitch(ee) {} + + // 用拉链式开关打开电器 + virtual void On() override + { + std::cout << "Switch on the equipment with a pull chain switch." << std::endl; + m_pEe->PowerOn(); + } + + // 用拉链式开关关闭电器 + virtual void Off() override + { + std::cout << "Switch off the equipment with a pull chain switch." << std::endl; + m_pEe->PowerOff(); + } +}; + +// 两位开关 +class TwoPositionSwitch : public ISwitch +{ +public: + TwoPositionSwitch(IElectricalEquipment *ee) : ISwitch(ee) {} + + // 用两位开关打开电器 + virtual void On() override + { + std::cout << "Switch on the equipment with a two-position switch." << std::endl; + m_pEe->PowerOn(); + } + + // 用两位开关关闭电器 + virtual void Off() override { + std::cout << "Switch off the equipment with a two-position switch." << std::endl; + m_pEe->PowerOff(); + } +}; + + +#endif //DESIGNPATTERN_REFINED_ABSTRACTION_H diff --git a/DesignPattern/CMakeLists.txt b/DesignPattern/CMakeLists.txt new file mode 100644 index 0000000..4fdbffe --- /dev/null +++ b/DesignPattern/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.10) +project(DesignPattern) + +set(CMAKE_CXX_STANDARD 11) + +add_executable(DesignPattern main.cpp AbstractFactoryPattern/product.h AbstractFactoryPattern/concrete_product.h AbstractFactoryPattern/Factory.cpp AbstractFactoryPattern/Factory.h AbstractFactoryPattern/concrete_factory.h AbstractFactoryPattern/FactoryMain.cpp AbstractFactoryPattern/FactoryMain.h SingletonPattern/Singleton.cpp SingletonPattern/Singleton.h SingletonPattern/SingletonMain.h AdapterPattern/target.h AdapterPattern/adaptee.h AdapterPattern/adapter.h AdapterPattern/AdapterMain.h BridgePattern/implementor.h BridgePattern/concrete_implementor.h BridgePattern/abstraction.h BridgePattern/refined_abstraction.h BridgePattern/BridgeMain.h BridgePattern/BridgeMain.cpp ObserverPattern/subject.h ObserverPattern/observer.h ObserverPattern/concrete_subject.h ObserverPattern/concrete_observer.h ObserverPattern/ObserverMain.cpp ObserverPattern/ObserverMain.h) \ No newline at end of file diff --git a/DesignPattern/ObserverPattern/ObserverMain.cpp b/DesignPattern/ObserverPattern/ObserverMain.cpp new file mode 100644 index 0000000..cd536c7 --- /dev/null +++ b/DesignPattern/ObserverPattern/ObserverMain.cpp @@ -0,0 +1,34 @@ +// +// Created by xiemenghui on 2018/7/21. +// + +#include "ObserverMain.h" + +void ObserverMain() +{ + // + ConcreteSubject * pSubject = new ConcreteSubject(); + + // ۲ + IObserver * pObserver1 = new ConcreteObserver("Jack Ma"); + IObserver * pObserver2 = new ConcreteObserver("Pony"); + + // ע۲ + pSubject->Attach(pObserver1); + pSubject->Attach(pObserver2); + + // ļ۸񣬲֪ͨ۲ + pSubject->SetPrice(12.5); + pSubject->Notify(); + + // עһ۲ + pSubject->Detach(pObserver2); + + // ٴθ״̬֪ͨ۲ + pSubject->SetPrice(15.0); + pSubject->Notify(); + + SAFE_DELETE(pObserver1); + SAFE_DELETE(pObserver2); + SAFE_DELETE(pSubject); +} \ No newline at end of file diff --git a/DesignPattern/ObserverPattern/ObserverMain.h b/DesignPattern/ObserverPattern/ObserverMain.h new file mode 100644 index 0000000..146c07c --- /dev/null +++ b/DesignPattern/ObserverPattern/ObserverMain.h @@ -0,0 +1,17 @@ +// +// Created by xiemenghui on 2018/7/21. +// + +#ifndef DESIGNPATTERN_OBSERVERMAIN_H +#define DESIGNPATTERN_OBSERVERMAIN_H + +#include "concrete_subject.h" +#include "concrete_observer.h" + +#ifndef SAFE_DELETE +#define SAFE_DELETE(p) { if(p){delete(p); (p)=nullptr;} } +#endif + +void ObserverMain(); + +#endif //DESIGNPATTERN_OBSERVERMAIN_H diff --git a/DesignPattern/ObserverPattern/concrete_observer.h b/DesignPattern/ObserverPattern/concrete_observer.h new file mode 100644 index 0000000..37a68b3 --- /dev/null +++ b/DesignPattern/ObserverPattern/concrete_observer.h @@ -0,0 +1,25 @@ +// +// Created by xiemenghui on 2018/7/21. +// + +#ifndef DESIGNPATTERN_CONCRETE_OBSERVER_H +#define DESIGNPATTERN_CONCRETE_OBSERVER_H + +#include "observer.h" +#include +#include + +class ConcreteObserver : public IObserver +{ +public: + ConcreteObserver(std::string name) { m_strName = name; } + void Update(float price) + { + std::cout << m_strName << " - price" << price << "\n"; + } + +private: + std::string m_strName; // 名字 +}; + +#endif //DESIGNPATTERN_CONCRETE_OBSERVER_H diff --git a/DesignPattern/ObserverPattern/concrete_subject.h b/DesignPattern/ObserverPattern/concrete_subject.h new file mode 100644 index 0000000..d05e98c --- /dev/null +++ b/DesignPattern/ObserverPattern/concrete_subject.h @@ -0,0 +1,45 @@ +// +// Created by xiemenghui on 2018/7/21. +// + +#ifndef DESIGNPATTERN_CONCRETE_SUBJECT_H +#define DESIGNPATTERN_CONCRETE_SUBJECT_H + +#include "subject.h" +#include "observer.h" +#include +#include + +// 具体主题 +class ConcreteSubject : public ISubject +{ +public: + ConcreteSubject(){ m_fPrice = 10.0; } + void SetPrice(float price) + { + m_fPrice = price; + } + void Attach(IObserver * observer) + { + m_observers.push_back(observer); + } + void Detach(IObserver * observer) + { + m_observers.remove(observer); + } + // 通知所有观察者 + void Notify() + { + std::list::iterator it = m_observers.begin(); + while (it != m_observers.end()) + { + (*it)->Update(m_fPrice); + ++it; + } + } +private: + std::list m_observers; // 观察者列表 + float m_fPrice; // 价格 +}; + +#endif //DESIGNPATTERN_CONCRETE_SUBJECT_H diff --git a/DesignPattern/ObserverPattern/observer.h b/DesignPattern/ObserverPattern/observer.h new file mode 100644 index 0000000..500c396 --- /dev/null +++ b/DesignPattern/ObserverPattern/observer.h @@ -0,0 +1,15 @@ +// +// Created by xiemenghui on 2018/7/21. +// + +#ifndef DESIGNPATTERN_OBSERVER_H +#define DESIGNPATTERN_OBSERVER_H + +// 抽象观察者 +class IObserver +{ +public: + virtual void Update(float price) = 0; // 更新价格 +}; + +#endif //DESIGNPATTERN_OBSERVER_H diff --git a/DesignPattern/ObserverPattern/subject.h b/DesignPattern/ObserverPattern/subject.h new file mode 100644 index 0000000..9d50fba --- /dev/null +++ b/DesignPattern/ObserverPattern/subject.h @@ -0,0 +1,18 @@ +// +// Created by xiemenghui on 2018/7/21. +// + +#ifndef DESIGNPATTERN_SUBJECT_H +#define DESIGNPATTERN_SUBJECT_H + +class IObserver; + +class ISubject +{ +public: + virtual void Attach(IObserver *) = 0; // 注册观察者 + virtual void Detach(IObserver *) = 0; // 注销观察者 + virtual void Notify() = 0; // 通知观察者 +}; + +#endif //DESIGNPATTERN_SUBJECT_H diff --git a/DesignPattern/README.md b/DesignPattern/README.md new file mode 100644 index 0000000..7044985 --- /dev/null +++ b/DesignPattern/README.md @@ -0,0 +1 @@ +# DesignPattern diff --git a/DesignPattern/SingletonPattern/README.md b/DesignPattern/SingletonPattern/README.md new file mode 100644 index 0000000..580b0b2 --- /dev/null +++ b/DesignPattern/SingletonPattern/README.md @@ -0,0 +1,34 @@ +# 单例模式 + +```cpp +// 懒汉式单例模式 +class Singleton +{ +private: + Singleton() { } + static Singleton * pInstance; +public: + static Singleton * GetInstance() + { + if (pInstance == nullptr) + pInstance = new Singleton(); + return pInstance; + } +}; + +// 线程安全的单例模式 +class Singleton +{ +private: + Singleton() { } + ~Singleton() { } + Singleton(const Singleton &); + Singleton & operator = (const Singleton &); +public: + static Singleton & GetInstance() + { + static Singleton instance; + return instance; + } +}; +``` \ No newline at end of file diff --git a/DesignPattern/SingletonPattern/Singleton.cpp b/DesignPattern/SingletonPattern/Singleton.cpp new file mode 100644 index 0000000..f090e53 --- /dev/null +++ b/DesignPattern/SingletonPattern/Singleton.cpp @@ -0,0 +1,11 @@ +// +// Created by xiemenghui on 2018/7/20. +// + +#include +#include "Singleton.h" + +void Singleton::DoSomething() +{ + std::cout << "Singleton do something\n"; +} \ No newline at end of file diff --git a/DesignPattern/SingletonPattern/Singleton.h b/DesignPattern/SingletonPattern/Singleton.h new file mode 100644 index 0000000..79bc8ad --- /dev/null +++ b/DesignPattern/SingletonPattern/Singleton.h @@ -0,0 +1,25 @@ +// +// Created by xiemenghui on 2018/7/20. +// + +#ifndef DESIGNPATTERN_SINGLETON_H +#define DESIGNPATTERN_SINGLETON_H + +// 单例模式 +class Singleton { +private: + Singleton(){} + ~Singleton(){} + Singleton(const Singleton &); + Singleton & operator= (const Singleton &); + +public: + static Singleton & GetInstance() + { + static Singleton instance; + return instance; + } + void DoSomething(); +}; + +#endif //DESIGNPATTERN_SINGLETON_H diff --git a/DesignPattern/SingletonPattern/SingletonMain.h b/DesignPattern/SingletonPattern/SingletonMain.h new file mode 100644 index 0000000..673860f --- /dev/null +++ b/DesignPattern/SingletonPattern/SingletonMain.h @@ -0,0 +1,15 @@ +// +// Created by xiemenghui on 2018/7/20. +// + +#ifndef DESIGNPATTERN_SINGLETONMAIN_H +#define DESIGNPATTERN_SINGLETONMAIN_H + +#include "Singleton.h" + +void SingletonMain() +{ + Singleton::GetInstance().DoSomething(); +} + +#endif //DESIGNPATTERN_SINGLETONMAIN_H diff --git a/DesignPattern/main.cpp b/DesignPattern/main.cpp new file mode 100644 index 0000000..9e646ed --- /dev/null +++ b/DesignPattern/main.cpp @@ -0,0 +1,43 @@ +// +// Created by xiemenghui on 2018/7/20. +// + +#include +#include "SingletonPattern/SingletonMain.h" +#include "AbstractFactoryPattern/FactoryMain.h" +#include "AdapterPattern/AdapterMain.h" +#include "BridgePattern/BridgeMain.h" +#include "ObserverPattern/ObserverMain.h" + +int main() { + std::cout << "*******************" << std::endl; + std::cout << "** ģʽ **" << std::endl; + std::cout << "*******************" << std::endl; + + std::cout << "*******************" << std::endl; + std::cout << "** ģʽ **" << std::endl; + std::cout << "*******************" << std::endl; + SingletonMain(); + + std::cout << "*******************" << std::endl; + std::cout << "** 󹤳ģʽ **" << std::endl; + std::cout << "*******************" << std::endl; + FactoryMain(); + + std::cout << "*******************" << std::endl; + std::cout << "** ģʽ **" << std::endl; + std::cout << "*******************" << std::endl; + AdapterMain(); + + std::cout << "*******************" << std::endl; + std::cout << "** Žģʽ **" << std::endl; + std::cout << "*******************" << std::endl; + BridgeMain(); + + std::cout << "*******************" << std::endl; + std::cout << "** ۲ģʽ **" << std::endl; + std::cout << "*******************" << std::endl; + ObserverMain(); + + return 0; +} \ No newline at end of file diff --git a/README.md b/README.md index cde865d..6704667 100644 --- a/README.md +++ b/README.md @@ -2420,6 +2420,8 @@ ssize_t write(int fd, const void *buf, size_t count); ## 设计模式 +> 各大设计模式例子参考:[CSDN专栏 . C++ 设计模式](https://blog.csdn.net/column/details/15392.html) 系列博文 + ### 设计模式的六大原则 * 单一职责原则(SRP,Single Responsibility Principle) @@ -2431,38 +2433,23 @@ ssize_t write(int fd, const void *buf, size_t count); ### 单例模式 -```cpp -// 懒汉式单例模式 -class Singleton -{ -private: - Singleton() { } - static Singleton * pInstance; -public: - static Singleton * GetInstance() - { - if (pInstance == nullptr) - pInstance = new Singleton(); - return pInstance; - } -}; +[单例模式例子](DesignPattern/SingletonPattern) -// 线程安全的单例模式 -class Singleton -{ -private: - Singleton() { } - ~Singleton() { } - Singleton(const Singleton &); - Singleton & operator = (const Singleton &); -public: - static Singleton & GetInstance() - { - static Singleton instance; - return instance; - } -}; -``` +### 抽象工厂模式 + +[抽象工厂模式例子](DesignPattern/AbstractFactoryPattern) + +### 适配器模式 + +[适配器模式例子](DesignPattern/AdapterPattern) + +### 桥接模式 + +[桥接模式例子](DesignPattern/BridgePattern) + +### 观察者模式 + +[观察者模式例子](DesignPattern/ObserverPattern) ## 链接装载库 From b5a24d628bdd8db2df97c330d95725b136a2ed5f Mon Sep 17 00:00:00 2001 From: huihut Date: Sun, 22 Jul 2018 15:03:09 +0800 Subject: [PATCH 10/25] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DesignPattern/README.md | 12 +++++++++++- README.md | 18 ++++++++++-------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/DesignPattern/README.md b/DesignPattern/README.md index 7044985..9adb480 100644 --- a/DesignPattern/README.md +++ b/DesignPattern/README.md @@ -1 +1,11 @@ -# DesignPattern +# 设计模式 + +> 各大设计模式例子参考:[CSDN专栏 . C++ 设计模式](https://blog.csdn.net/column/details/15392.html) 系列博文 + +此文件夹为一个 CLion 工程,由 CMake 构建,各个文件夹为各个设计模式的具体实现。文件中可能会有中文乱码问题,请以 `GB2312`(中文) 编码打开。 + +* [单例模式例子](SingletonPattern) +* [抽象工厂模式例子](AbstractFactoryPattern) +* [适配器模式例子](AdapterPattern) +* [桥接模式例子](BridgePattern) +* [观察者模式例子](ObserverPattern) \ No newline at end of file diff --git a/README.md b/README.md index 6704667..1b60bf2 100644 --- a/README.md +++ b/README.md @@ -2422,14 +2422,7 @@ ssize_t write(int fd, const void *buf, size_t count); > 各大设计模式例子参考:[CSDN专栏 . C++ 设计模式](https://blog.csdn.net/column/details/15392.html) 系列博文 -### 设计模式的六大原则 - -* 单一职责原则(SRP,Single Responsibility Principle) -* 里氏替换原则(LSP,Liskov Substitution Principle) -* 依赖倒置原则(DIP,Dependence Inversion Principle) -* 接口隔离原则(ISP,Interface Segregation Principle) -* 迪米特法则(LoD,Law of Demeter) -* 开放封闭原则(OCP,Open Close Principle) +[设计模式工程目录](DesignPattern) ### 单例模式 @@ -2451,6 +2444,15 @@ ssize_t write(int fd, const void *buf, size_t count); [观察者模式例子](DesignPattern/ObserverPattern) +### 设计模式的六大原则 + +* 单一职责原则(SRP,Single Responsibility Principle) +* 里氏替换原则(LSP,Liskov Substitution Principle) +* 依赖倒置原则(DIP,Dependence Inversion Principle) +* 接口隔离原则(ISP,Interface Segregation Principle) +* 迪米特法则(LoD,Law of Demeter) +* 开放封闭原则(OCP,Open Close Principle) + ## 链接装载库 ### 各平台文件格式 From 2e114ebc295d4b115b2887f781819a72ea4cfd9f Mon Sep 17 00:00:00 2001 From: huihut Date: Sun, 22 Jul 2018 15:22:38 +0800 Subject: [PATCH 11/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1b60bf2..1f847fd 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # C/C++ 面试知识总结 -为 2018 年春招总结的 C/C++ 面试知识,只为复习、分享。部分知识点与图片来自网络,侵删。欢迎 star,欢迎 issues。 +为 2018 年春招总结的 C/C++ 面试知识,只为复习、分享。部分知识点与图片来自网络,侵删。欢迎 Star,欢迎 Issues。 + +秋招陆续开始了,祝大家斩获心仪 Offer。 ## 使用建议 From 0cd1cfa7e255a7a61d3233ee42860c16c4835143 Mon Sep 17 00:00:00 2001 From: huihut Date: Fri, 27 Jul 2018 21:34:16 +0800 Subject: [PATCH 12/25] =?UTF-8?q?=E3=80=90@sniper00=20=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E3=80=91=E5=88=A0=E9=99=A4STL=E7=A9=BA=E9=97=B4=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=99=A8=E7=9A=84=E6=8F=8F=E8=BF=B0=EF=BC=8C=E8=AF=A6?= =?UTF-8?q?=E8=A7=81=EF=BC=9Ahttps://github.com/huihut/interview/issues/8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index 1f847fd..ee6a491 100644 --- a/README.md +++ b/README.md @@ -1226,11 +1226,6 @@ hash_multiset|hash表|无序|可重复| hash_map|hash表|无序|不可重复| hash_multimap|hash表|无序|可重复| -### STL 空间配置器如何处理内存的?能说一下它的大概实现方案吗?为什么是 8Bytes 的倍数? - -* 大于 128Bytes 用 malloc 直接申请 -* 小于 128Bytes 使用一个 8Bytes 倍数的数组来进行申请(原因是为了提高效率,同时对于 64 位的机器而言,地址大小为 8Bytes) - ## 数据结构 ### 顺序结构 From 17cdac72d1b06f96c9c470a4a45af46734d849b3 Mon Sep 17 00:00:00 2001 From: huihut Date: Tue, 31 Jul 2018 01:00:25 +0800 Subject: [PATCH 13/25] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B9=BF=E5=BA=A6?= =?UTF-8?q?=E4=BC=98=E5=85=88=E6=90=9C=E7=B4=A2=E3=80=81=E6=B7=B1=E5=BA=A6?= =?UTF-8?q?=E4=BC=98=E5=85=88=E6=90=9C=E7=B4=A2=E3=80=81=E5=88=86=E6=B2=BB?= =?UTF-8?q?=E6=B3=95=E3=80=81=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=E3=80=81?= =?UTF-8?q?=E8=B4=AA=E5=BF=83=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index ee6a491..3da2520 100644 --- a/README.md +++ b/README.md @@ -1695,6 +1695,21 @@ typedef struct BiTNode 2-3树 | O(log2n - log3n) | | B树/B+树 |O(log2n) | | +### 图搜索算法 + +图搜索算法 |数据结构| 遍历时间复杂度 | 空间复杂度 +---|---|---|--- +[BFS广度优先搜索](https://zh.wikipedia.org/wiki/%E5%B9%BF%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7%B4%A2)|邻接矩阵
邻接链表|O(\|v\|2)
O(\|v\|+\|E\|)|O(\|v\|2)
O(\|v\|+\|E\|) +[DFS深度优先搜索](https://zh.wikipedia.org/wiki/%E6%B7%B1%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7%B4%A2)|邻接矩阵
邻接链表|O(\|v\|2)
O(\|v\|+\|E\|)|O(\|v\|2)
O(\|v\|+\|E\|) + +### 其他算法 + +其他算法 |思想| 应用 +---|---|--- +[分治法](https://zh.wikipedia.org/wiki/%E5%88%86%E6%B2%BB%E6%B3%95)|把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并|[循环赛日程安排问题](https://github.com/huihut/interview/tree/master/Problems/RoundRobinProblem)、排序算法(快速排序、归并排序) +[动态规划](https://zh.wikipedia.org/wiki/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92)|通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法,适用于有重叠子问题和最优子结构性质的问题|[背包问题](https://github.com/huihut/interview/tree/master/Problems/KnapsackProblem)、斐波那契数列 +[贪心法](https://zh.wikipedia.org/wiki/%E8%B4%AA%E5%BF%83%E6%B3%95)|一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法|旅行推销员问题(最短路径问题)、最小生成树、哈夫曼编码 + ## Problems ### Single Problem From 89b03d94dd11dddeb539a92e93e685a57cc6f56f Mon Sep 17 00:00:00 2001 From: huihut Date: Tue, 31 Jul 2018 01:02:13 +0800 Subject: [PATCH 14/25] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=85=B6=E4=BB=96?= =?UTF-8?q?=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3da2520..e152c65 100644 --- a/README.md +++ b/README.md @@ -1704,7 +1704,7 @@ B树/B+树 |O(log2n) | | ### 其他算法 -其他算法 |思想| 应用 +算法 |思想| 应用 ---|---|--- [分治法](https://zh.wikipedia.org/wiki/%E5%88%86%E6%B2%BB%E6%B3%95)|把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并|[循环赛日程安排问题](https://github.com/huihut/interview/tree/master/Problems/RoundRobinProblem)、排序算法(快速排序、归并排序) [动态规划](https://zh.wikipedia.org/wiki/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92)|通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法,适用于有重叠子问题和最优子结构性质的问题|[背包问题](https://github.com/huihut/interview/tree/master/Problems/KnapsackProblem)、斐波那契数列 From 131a258ef1b78007c98e1658157c46c13e1f426a Mon Sep 17 00:00:00 2001 From: huihut Date: Thu, 2 Aug 2018 18:22:27 +0800 Subject: [PATCH 15/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8B=9B=E8=81=98?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=B2=97=E4=BD=8D=E4=B8=BA2019=E5=B1=8A?= =?UTF-8?q?=E6=A0=A1=E6=8B=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e152c65..26bffbd 100644 --- a/README.md +++ b/README.md @@ -2750,7 +2750,7 @@ MODULE_API int module_init() ## 招聘时间岗位 -* [牛客网 . 2018 IT名企校招指南](https://www.nowcoder.com/activity/campus2018) +* [牛客网 . 2019 IT名企校招指南](https://www.nowcoder.com/activity/campus2019) ## 面试题目经验 From d8eae2163592a474dc4ab7bfae130a31409b76ac Mon Sep 17 00:00:00 2001 From: huihut Date: Tue, 7 Aug 2018 15:19:39 +0800 Subject: [PATCH 16/25] =?UTF-8?q?=E5=B0=8F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- STL/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STL/README.md b/STL/README.md index c92fb47..25ffe7f 100644 --- a/STL/README.md +++ b/STL/README.md @@ -54,7 +54,7 @@ empty|返回 vector 是否为空 reserve|请求 vector 容量至少足以包含 n(参数)个元素 shrink_to_fit|要求容器减小其 capacity(容量)以适应其 size(元素数量) operator[]|返回容器中第 n(参数)个位置的元素的引用 -at|返回中第 n(参数)个位置的元素的引用 +at|返回容器中第 n(参数)个位置的元素的引用 front|返回对容器中第一个元素的引用 back|返回对容器中最后一个元素的引用 data|返回指向容器中第一个元素的指针 From ce874b3123b5a4b0962bf7477aed93cec7489faa Mon Sep 17 00:00:00 2001 From: huihut Date: Tue, 14 Aug 2018 19:47:53 +0800 Subject: [PATCH 17/25] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20so=20=E5=85=B1?= =?UTF-8?q?=E4=BA=AB=E5=BA=93=E3=80=81Windows=20=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=85=A5=E5=8F=A3=E3=80=81Windows=20?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E9=93=BE=E6=8E=A5=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 384 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 360 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 26bffbd..5d78653 100644 --- a/README.md +++ b/README.md @@ -2594,41 +2594,377 @@ Linux 下的共享库就是普通的 ELF 共享对象。 * `LD_PRELOAD`:指定预先装载的一些共享库甚至是目标文件 * `LD_DEBUG`:打开动态链接器的调试功能 -### Windows 的动态链接库(Dynamic-Link Library) +#### so 共享库的编写 -
Windows 动态链接库例子 +
使用 CLion 编写共享库 + +创建一个名为 MySharedLib 的共享库 + +CMakeLists.txt + +```cmake +cmake_minimum_required(VERSION 3.10) +project(MySharedLib) + +set(CMAKE_CXX_STANDARD 11) + +add_library(MySharedLib SHARED library.cpp library.h) +``` + +library.h -DLL 头文件 ```cpp -#ifdef __cplusplus -extern "C" { -#endif +#ifndef MYSHAREDLIB_LIBRARY_H +#define MYSHAREDLIB_LIBRARY_H -#ifdef _WIN32 -# ifdef MODULE_API_EXPORTS -# define MODULE_API __declspec(dllexport) -# else -# define MODULE_API __declspec(dllimport) -# endif -#else -# define MODULE_API -#endif +// 打印 Hello World! +void hello(); -MODULE_API int module_init(); - -#ifdef __cplusplus +// 使用可变模版参数求和 +template +T sum(T t) +{ + return t; } +template +T sum(T first, Types ... rest) +{ + return first + sum(rest...); +} + #endif ``` -DLL 源文件 -```cpp -#define MODULE_API_EXPORTS -#include "module.h" +library.cpp -MODULE_API int module_init() +```cpp +#include +#include "library.h" + +void hello() { + std::cout << "Hello, World!" << std::endl; +} +``` + +
+ +#### so 共享库的使用(被可执行项目调用) + +
使用 CLion 调用共享库 + +创建一个名为 TestSharedLib 的可执行项目 + +CMakeLists.txt + +```cmake +cmake_minimum_required(VERSION 3.10) +project(TestSharedLib) + +# C++11 编译 +set(CMAKE_CXX_STANDARD 11) + +# 头文件路径 +set(INC_DIR /home/xx/code/clion/MySharedLib) +# 库文件路径 +set(LIB_DIR /home/xx/code/clion/MySharedLib/cmake-build-debug) + +include_directories(${INC_DIR}) +link_directories(${LIB_DIR}) +link_libraries(MySharedLib) + +add_executable(TestSharedLib main.cpp) + +# 链接 MySharedLib 库 +target_link_libraries(TestSharedLib MySharedLib) +``` + +main.cpp + +```cpp +#include +#include "library.h" +using std::cout; +using std::endl; + +int main() { + + hello(); + cout << "1 + 2 = " << sum(1,2) << endl; + cout << "1 + 2 + 3 = " << sum(1,2,3) << endl; + + return 0; +} +``` + +执行结果 + +``` +Hello, World! +1 + 2 = 3 +1 + 2 + 3 = 6 +``` + +
+ +### Windows 应用程序入口函数 + +* GUI(Graphical User Interface)应用,链接器选项:`/SUBSYSTEM:WINDOWS` +* CUI(Console User Interface)应用,链接器选项:`/SUBSYSTEM:CONSOLE` + +
_tWinMain 与 _tmain 函数声明 + +```cpp +Int WINAPI _tWinMain( + HINSTANCE hInstanceExe, + HINSTANCE, + PTSTR pszCmdLine, + int nCmdShow); + +int _tmain( + int argc, + TCHAR *argv[], + TCHAR *envp[]); +``` + +
+ +应用程序类型|入口点函数|嵌入可执行文件的启动函数 +---|---|--- +处理ANSI字符(串)的GUI应用程序|_tWinMain(WinMain)|WinMainCRTSartup +处理Unicode字符(串)的GUI应用程序|_tWinMain(wWinMain)|wWinMainCRTSartup +处理ANSI字符(串)的CUI应用程序|_tmain(Main)|mainCRTSartup +处理Unicode字符(串)的CUI应用程序|_tmain(wMain)|wmainCRTSartup +动态链接库(Dynamic-Link Library)|DllMain|_DllMainCRTStartup + +### Windows 的动态链接库(Dynamic-Link Library) + +#### 用处 + +* 扩展了应用程序的特性 +* 简化了项目管理 +* 有助于节省内存 +* 促进了资源的共享 +* 促进了本地化 +* 有助于解决平台间的差异 +* 可以用于特殊目的 + +#### 注意 + +* 创建 DLL,事实上是在创建可供一个可执行模块调用的函数 +* 当一个模块提供一个内存分配函数(malloc、new)的时候,它必须同时提供另一个内存释放函数(free、delete) +* 在使用 C 和 C++ 混编的时候,要使用 extern "C" 修饰符 +* 一个 DLL 可以导出函数、变量(避免导出)、C++ 类(导出导入需要同编译器,否则避免导出) +* DLL 模块:cpp 文件中的 __declspec(dllexport) 写在 include 头文件之前 +* 调用 DLL 的可执行模块:cpp 文件的 __declspec(dllimport) 之前不应该定义 MYLIBAPI + +#### 加载 Windows 程序的搜索顺序 + +1. 包含可执行文件的目录 +2. Windows 的系统目录,可以通过 GetSystemDirectory 得到 +3. 16 位的系统目录,即 Windows 目录中的 System 子目录 +4. Windows 目录,可以通过 GetWindowsDirectory 得到 +5. 进程的当前目录 +6. PATH 环境变量中所列出的目录 + +#### DLL 入口函数 + +
DllMain 函数 + +```cpp +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { - /* do something useful */ + switch(fdwReason) + { + case DLL_PROCESS_ATTACH: + // 第一次将一个DLL映射到进程地址空间时调用 + // The DLL is being mapped into the process' address space. + break; + case DLL_THREAD_ATTACH: + // 当进程创建一个线程的时候,用于告诉DLL执行与线程相关的初始化(非主线程执行) + // A thread is bing created. + break; + case DLL_THREAD_DETACH: + // 系统调用 ExitThread 线程退出前,即将终止的线程通过告诉DLL执行与线程相关的清理 + // A thread is exiting cleanly. + break; + case DLL_PROCESS_DETACH: + // 将一个DLL从进程的地址空间时调用 + // The DLL is being unmapped from the process' address space. + break; + } + return (TRUE); // Used only for DLL_PROCESS_ATTACH +} +``` + +
+ +#### 载入卸载库 + +
LoadLibrary、LoadLibraryExA、LoadPackagedLibrary、FreeLibrary、FreeLibraryAndExitThread 函数声明 + +```cpp +// 载入库 +HMODULE WINAPI LoadLibrary( + _In_ LPCTSTR lpFileName +); +HMODULE LoadLibraryExA( + LPCSTR lpLibFileName, + HANDLE hFile, + DWORD dwFlags +); +// 若要在通用 Windows 平台(UWP)应用中加载 Win32 DLL,需要调用 LoadPackagedLibrary,而不是 LoadLibrary 或 LoadLibraryEx +HMODULE LoadPackagedLibrary( + LPCWSTR lpwLibFileName, + DWORD Reserved +); + +// 卸载库 +BOOL WINAPI FreeLibrary( + _In_ HMODULE hModule +); +// 卸载库和退出线程 +VOID WINAPI FreeLibraryAndExitThread( + _In_ HMODULE hModule, + _In_ DWORD dwExitCode +); +``` + +
+ +#### 显示地链接到导出符号 + +
GetProcAddress 函数声明 + +```cpp +FARPROC GetProcAddress( + HMODULE hInstDll, + PCSTR pszSymbolName // 只能接受 ANSI 字符串,不能是 Unicode +); +``` + +
+ +#### DumpBin.exe 查看 DLL 信息 + +在 `VS 的开发人员命令提示符` 使用 `DumpBin.exe` 可查看 DLL 库的导出段(导出的变量、函数、类名的符号)、相对虚拟地址(RVA,relative virtual address)。如: +``` +DUMPBIN -exports D:\mydll.dll +``` + +#### LoadLibrary 与 FreeLibrary 流程图 + +
LoadLibrary 与 FreeLibrary 流程图 + +##### LoadLibrary + +![WindowsLoadLibrary](http://ojlsgreog.bkt.clouddn.com/WindowsLoadLibrary.png) + +##### FreeLibrary + +![WindowsFreeLibrary](http://ojlsgreog.bkt.clouddn.com/WindowsFreeLibrary.png) + +
+ +#### DLL 库的编写(导出一个 DLL 模块) + +
DLL 库的编写(导出一个 DLL 模块) +DLL 头文件 + +```cpp +// MyLib.h + +#ifdef MYLIBAPI + +// MYLIBAPI 应该在全部 DLL 源文件的 include "Mylib.h" 之前被定义 +// 全部函数/变量正在被导出 + +#else + +// 这个头文件被一个exe源代码模块包含,意味着全部函数/变量被导入 +#define MYLIBAPI extern "C" __declspec(dllimport) + +#endif + +// 这里定义任何的数据结构和符号 + +// 定义导出的变量(避免导出变量) +MYLIBAPI int g_nResult; + +// 定义导出函数原型 +MYLIBAPI int Add(int nLeft, int nRight); +``` + +DLL 源文件 + +```cpp +// MyLibFile1.cpp + +// 包含标准Windows和C运行时头文件 +#include + +// DLL源码文件导出的函数和变量 +#define MYLIBAPI extern "C" __declspec(dllexport) + +// 包含导出的数据结构、符号、函数、变量 +#include "MyLib.h" + +// 将此DLL源代码文件的代码放在此处 +int g_nResult; + +int Add(int nLeft, int nRight) +{ + g_nResult = nLeft + nRight; + return g_nResult; +} +``` + +
+ +#### DLL 库的使用(运行时动态链接 DLL) + +
DLL 库的使用(运行时动态链接 DLL) + +```cpp +// A simple program that uses LoadLibrary and +// GetProcAddress to access myPuts from Myputs.dll. + +#include +#include + +typedef int (__cdecl *MYPROC)(LPWSTR); + +int main( void ) +{ + HINSTANCE hinstLib; + MYPROC ProcAdd; + BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; + + // Get a handle to the DLL module. + + hinstLib = LoadLibrary(TEXT("MyPuts.dll")); + + // If the handle is valid, try to get the function address. + + if (hinstLib != NULL) + { + ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts"); + + // If the function address is valid, call the function. + + if (NULL != ProcAdd) + { + fRunTimeLinkSuccess = TRUE; + (ProcAdd) (L"Message sent to the DLL function\n"); + } + // Free the DLL module. + + fFreeResult = FreeLibrary(hinstLib); + } + + // If unable to call the DLL function, use an alternative. + if (! fRunTimeLinkSuccess) + printf("Message printed from executable\n"); + return 0; } ``` From c271eb067b07f59b24bd48ec92d7f783437dc744 Mon Sep 17 00:00:00 2001 From: huihut Date: Tue, 14 Aug 2018 19:53:24 +0800 Subject: [PATCH 18/25] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=9F=A5=E8=AF=86?= =?UTF-8?q?=E7=82=B9=E6=9D=A5=E8=87=AA=E3=80=8AWindows=E6=A0=B8=E5=BF=83?= =?UTF-8?q?=E7=BC=96=E7=A8=8B=EF=BC=88=E7=AC=AC=E4=BA=94=E7=89=88=EF=BC=89?= =?UTF-8?q?=E3=80=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 5d78653..3bc669c 100644 --- a/README.md +++ b/README.md @@ -2738,6 +2738,8 @@ int _tmain( ### Windows 的动态链接库(Dynamic-Link Library) +> 知识点来自《Windows核心编程(第五版)》 + #### 用处 * 扩展了应用程序的特性 From c6f3ff4599c8da75fa260be7ae783b54d438ecaf Mon Sep 17 00:00:00 2001 From: huihut Date: Tue, 14 Aug 2018 20:07:53 +0800 Subject: [PATCH 19/25] =?UTF-8?q?=E5=B0=86=20=E5=90=84=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=A0=BC=E5=BC=8F=20=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E5=88=B0=20=E7=BC=96=E8=AF=91=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 3bc669c..ff102f8 100644 --- a/README.md +++ b/README.md @@ -2467,14 +2467,6 @@ ssize_t write(int fd, const void *buf, size_t count); ## 链接装载库 -### 各平台文件格式 - -平台 | 可执行文件 | 目标文件 | 动态库/共享对象 | 静态库 ----|---|---|---|--- -Windows|exe|obj|dll|lib -Unix/Linux|ELF、out|o|so|a -Mac|Mach-O|o|dylib、tbd、framework|a、framework - ### 内存、栈、堆 一般应用程序内存空间有如下区域: @@ -2511,6 +2503,14 @@ Mac|Mach-O|o|dylib、tbd、framework|a、framework ### 编译链接 +#### 各平台文件格式 + +平台 | 可执行文件 | 目标文件 | 动态库/共享对象 | 静态库 +---|---|---|---|--- +Windows|exe|obj|dll|lib +Unix/Linux|ELF、out|o|so|a +Mac|Mach-O|o|dylib、tbd、framework|a、framework + #### 编译链接过程 1. 预编译(预编译器处理如 `#include`、`#define` 等预编译指令,生成 `.i` 或 `.ii` 文件) From b412121d8fe929757ca8be88f324039b3212c1cc Mon Sep 17 00:00:00 2001 From: huihut Date: Mon, 20 Aug 2018 00:24:29 +0800 Subject: [PATCH 20/25] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20stl=20=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E4=B8=AD=20lower=5Fbound=20=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- STL/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/STL/README.md b/STL/README.md index 25ffe7f..1d84846 100644 --- a/STL/README.md +++ b/STL/README.md @@ -183,10 +183,10 @@ equal(beg1, end1, beg2); // 比较每个元素,确定两个序列是否相等 equal(beg1, end1, beg2, binaryPred); // 比较每个元素,确定两个序列是否相等。 // 二分搜索算法,传入前向迭代器或随机访问迭代器(random-access iterator),要求序列中的元素已经是有序的。通过小于运算符(<)或 comp 比较操作实现比较。 -lower_bound(beg, end, val); // 返回一个迭代器,表示第一个小于等于 val 的元素,不存在则返回 end -lower_bound(beg, end, val, comp); // 返回一个迭代器,表示第一个小于等于 val 的元素,不存在则返回 end -upper_bound(beg, end, val); // 返回一个迭代器,表示第一个大于 val 的元素,不存在则返回 end -upper_bound(beg, end, val, comp); // 返回一个迭代器,表示第一个大于 val 的元素,不存在则返回 end +lower_bound(beg, end, val); // 返回一个非递减序列 [beg, end) 中的第一个大于等于值 val 的位置的迭代器,不存在则返回 end +lower_bound(beg, end, val, comp); // 返回一个非递减序列 [beg, end) 中的第一个大于等于值 val 的位置的迭代器,不存在则返回 end +upper_bound(beg, end, val); // 返回一个非递减序列 [beg, end) 中第一个大于 val 的位置的迭代器,不存在则返回 end +upper_bound(beg, end, val, comp); // 返回一个非递减序列 [beg, end) 中第一个大于 val 的位置的迭代器,不存在则返回 end equal_range(beg, end, val); // 返回一个 pair,其 first 成员是 lower_bound 返回的迭代器,其 second 成员是 upper_bound 返回的迭代器 binary_search(beg, end, val); // 返回一个 bool 值,指出序列中是否包含等于 val 的元素。对于两个值 x 和 y,当 x 不小于 y 且 y 也不小于 x 时,认为它们相等。 From cc6dd9ca8497e6b1c682ed3ba0e1d3ee7b6895c3 Mon Sep 17 00:00:00 2001 From: huihut Date: Mon, 20 Aug 2018 03:25:53 +0800 Subject: [PATCH 21/25] =?UTF-8?q?=E4=B8=BA=20README=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=8B=98=E8=AF=AF=E3=80=81=E6=96=B0=E5=A2=9E=E3=80=81=E8=AE=A8?= =?UTF-8?q?=E8=AE=BA=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ff102f8..32eee36 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # C/C++ 面试知识总结 -为 2018 年春招总结的 C/C++ 面试知识,只为复习、分享。部分知识点与图片来自网络,侵删。欢迎 Star,欢迎 Issues。 +C/C++ 面试知识总结,只为复习、分享。部分知识点与图片来自网络,侵删。 -秋招陆续开始了,祝大家斩获心仪 Offer。 +勘误请 Issue、Pull,新增请 Issue,建议、讨论请 [# issues/12](https://github.com/huihut/interview/issues/12) ## 使用建议 From 216be0887ea423ec013dc87e1016d7855f998cf7 Mon Sep 17 00:00:00 2001 From: Baron Hou Date: Fri, 24 Aug 2018 10:30:02 +0800 Subject: [PATCH 22/25] Update STL.md --- STL/STL.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/STL/STL.md b/STL/STL.md index 73de734..79a3f68 100644 --- a/STL/STL.md +++ b/STL/STL.md @@ -680,7 +680,7 @@ vector是表示可以改变大小的数组的序列容器。 相反,vector容器可以分配一些额外的存储以适应可能的增长,并且因此容器可以具有比严格需要包含其元素(即,其大小)的存储更大的实际容量。库可以实现不同的策略的增长到内存使用和重新分配之间的平衡,但在任何情况下,再分配应仅在对数生长的间隔发生尺寸,使得在所述载体的末端各个元件的插入可以与提供分期常量时间复杂性。 -因此,与阵列相比,载体消耗更多的内存来交换管理存储和以有效方式动态增长的能力。 +因此,与数组相比,载体消耗更多的内存来交换管理存储和以有效方式动态增长的能力。 与其他动态序列容器(deques,lists和 forward\_lists )相比,vector非常有效地访问其元素(就像数组一样),并相对有效地从元素末尾添加或移除元素。对于涉及插入或移除除了结尾之外的位置的元素的操作,它们执行比其他位置更差的操作,并且具有比列表和 forward\_lists 更不一致的迭代器和引用。 @@ -2726,4 +2726,4 @@ Output The price of lightbulbs is $0.99 The price of shoes is $39.9 The price of tomatoes is $2.3 -``` \ No newline at end of file +``` From 7f88f8bac812b0807ac1c4c33afdbb3e9836bebe Mon Sep 17 00:00:00 2001 From: huihut Date: Fri, 24 Aug 2018 12:58:38 +0800 Subject: [PATCH 23/25] =?UTF-8?q?=E8=AE=BE=E7=BD=AEmd=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=9D=97=E4=B8=BAcpp=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- STL/STL.md | 254 +++++++++++++++++++++++++++-------------------------- 1 file changed, 128 insertions(+), 126 deletions(-) diff --git a/STL/STL.md b/STL/STL.md index 79a3f68..4deb632 100644 --- a/STL/STL.md +++ b/STL/STL.md @@ -35,7 +35,7 @@ array是固定大小的顺序容器,它们保存了一个以严格的线性顺 数组容器的另一个独特特性是它们可以被当作元组对象来处理:array头部重载get函数来访问数组元素,就像它是一个元组,以及专门的tuple_size和tuple_element类型。 -``` +```cpp template < class T, size_t N > class array; ``` @@ -47,14 +47,14 @@ template < class T, size_t N > class array; ![](https://i.stack.imgur.com/oa3EQ.png) -``` +```cpp iterator begin() noexcept; const_iterator begin() const noexcept; ``` Example -``` +```cpp #include #include @@ -78,14 +78,14 @@ myarray contains: 2 16 77 34 50 返回指向数组容器中最后一个元素之后的理论元素的迭代器。 -``` +```cpp iterator end() noexcept; const_iterator end() const noexcept; ``` Example -``` +```cpp #include #include @@ -111,12 +111,12 @@ myarray contains: 5 19 77 34 99 返回指向数组容器中最后一个元素的反向迭代器。 -``` +```cpp reverse_iterator rbegin()noexcept; const_reverse_iterator rbegin()const noexcept; ``` Example -``` +```cpp #include #include @@ -140,13 +140,13 @@ myarray contains: 14 80 26 4 返回一个反向迭代器,指向数组中第一个元素之前的理论元素(这被认为是它的反向结束)。 -``` +```cpp reverse_iterator rend() noexcept; const_reverse_iterator rend() const noexcept; ``` Example -``` +```cpp #include #include @@ -170,11 +170,11 @@ myarray contains: 14 80 26 4 #### array::cbegin 返回指向数组容器中第一个元素的常量迭代器(const_iterator);这个迭代器可以增加和减少,但是不能用来修改它指向的内容。 -``` +```cpp const_iterator cbegin()const noexcept; ``` Example -``` +```cpp #include #include @@ -199,11 +199,11 @@ myarray contains: 2 16 77 34 50 #### array::cend 返回指向数组容器中最后一个元素之后的理论元素的常量迭代器(const_iterator)。这个迭代器可以增加和减少,但是不能用来修改它指向的内容。 -``` +```cpp const_iterator cend() const noexcept; ``` Example -``` +```cpp #include #include @@ -227,11 +227,11 @@ myarray contains: 2 16 77 34 50 #### array::crbegin 返回指向数组容器中最后一个元素的常量反向迭代器(const_reverse_iterator) -``` +```cpp const_reverse_iterator crbegin()const noexcept; ``` Example -``` +```cpp #include #include @@ -256,11 +256,11 @@ myarray backwards: 60 50 40 30 20 10 返回指向数组中第一个元素之前的理论元素的常量反向迭代器(const_reverse_iterator),它被认为是其反向结束。 -``` +```cpp const_reverse_iterator crend() const noexcept; ``` Example -``` +```cpp #include #include @@ -286,11 +286,11 @@ myarray backwards: 60 50 40 30 20 10 返回数组容器中元素的数量。 -``` +```cpp constexpr size_type size()noexcept; ``` Example -``` +```cpp #include #include @@ -310,11 +310,11 @@ sizeof(myints): 20 ``` #### array::max_size 返回数组容器可容纳的最大元素数。数组对象的max_size与其size一样,始终等于用于实例化数组模板类的第二个模板参数。 -``` +```cpp constexpr size_type max_size() noexcept; ``` Example -``` +```cpp #include #include @@ -335,11 +335,11 @@ max_size of myints: 10 #### array::empty 返回一个布尔值,指示数组容器是否为空,即它的size()是否为0。 -``` +```cpp constexpr bool empty() noexcept; ``` Example -``` +```cpp #include #include @@ -359,12 +359,12 @@ second is not empt ``` #### array::operator[] 返回数组中第n个位置的元素的引用。与array::at相似,但array::at会检查数组边界并通过抛出一个out_of_range异常来判断n是否超出范围,而array::operator[]不检查边界。 -``` +```cpp reference operator[] (size_type n); const_reference operator[] (size_type n) const; ``` Example -``` +```cpp #include #include @@ -392,12 +392,12 @@ myarray contains: 0 1 2 3 4 5 6 7 8 9 ``` #### array::at 返回数组中第n个位置的元素的引用。与array::operator[]相似,但array::at会检查数组边界并通过抛出一个out_of_range异常来判断n是否超出范围,而array::operator[]不检查边界。 -``` +```cpp reference at ( size_type n ); const_reference at ( size_type n ) const; ``` Example -``` +```cpp #include #include @@ -426,12 +426,12 @@ myarray contains: 0 1 2 3 4 5 6 7 8 9 #### array::front 返回对数组容器中第一个元素的引用。array::begin返回的是迭代器,array::front返回的是直接引用。 在空容器上调用此函数会导致未定义的行为。 -``` +```cpp reference front(); const_reference front() const; ``` Example -``` +```cpp #include #include @@ -461,12 +461,12 @@ myarray now contains: 100 16 77 #### array::back 返回对数组容器中最后一个元素的引用。array::end返回的是迭代器,array::back返回的是直接引用。 在空容器上调用此函数会导致未定义的行为。 -``` +```cpp reference back(); const_reference back() const; ``` Example -``` +```cpp #include #include @@ -496,12 +496,12 @@ myarray now contains: 5 19 50 返回指向数组对象中第一个元素的指针。 由于数组中的元素存储在连续的存储位置,所以检索到的指针可以偏移以访问数组中的任何元素。 -``` +```cpp value_type* data() noexcept; const value_type* data() const noexcept; ``` Example -``` +```cpp #include #include #include @@ -524,11 +524,11 @@ Test string ``` #### array::fill 用val填充数组所有元素,将val设置为数组对象中所有元素的值。 -``` +```cpp void fill (const value_type& val); ``` Example -``` +```cpp #include #include @@ -553,11 +553,11 @@ myarray contains: 5 5 5 5 5 5 通过x的内容交换数组的内容,这是另一个相同类型的数组对象(包括相同的大小)。 与其他容器的交换成员函数不同,此成员函数通过在各个元素之间执行与其大小相同的单独交换操作,以线性时间运行。 -``` +```cpp void swap (array& x) noexcept(noexcept(swap(declval(),declval()))); ``` Example -``` +```cpp #include #include @@ -586,13 +586,13 @@ second: 10 20 30 40 50 ``` #### get(array) 形如:std::get<0>(myarray);传入一个数组容器,返回指定位置元素的引用。 -``` +```cpp template T&get(array &arr)noexcept; template T && get(array && arr)noexcept; template const T&get(const array &arr)noexcept; ``` Example -``` +```cpp #include #include #include @@ -621,7 +621,7 @@ first element in mytuple: 10 ``` #### relational operators (array) 形如:arrayA != arrayB、arrayA > arrayB;依此比较数组每个元素的大小关系。 -``` +```cpp (1) template bool operator ==(const array &lhs,const array &rhs); @@ -642,7 +642,7 @@ template bool operator> =(const array &lhs,const array &rhs); ``` Example -``` +```cpp #include #include @@ -689,7 +689,7 @@ vector是表示可以改变大小的数组的序列容器。 * 在尾部增删元素 - 平摊(amortized)常数 O(1)}} * 增删元素 - 至 vector 尾部的线性距离 O(n)}} -``` +```cpp template < class T, class Alloc = allocator > class vector; ``` ![](http://img.blog.csdn.net/20160406151211233) @@ -710,7 +710,7 @@ x保持未指定但有效的状态。 (6)初始化列表构造函数 构造一个容器中的每个元件中的一个拷贝的IL,以相同的顺序。 -``` +```cpp default (1) explicit vector (const allocator_type& alloc = allocator_type()); fill (2) @@ -732,7 +732,7 @@ vector (initializer_list il, const allocator_type& alloc = allocator_type()); ``` Example -``` +```cpp #include #include @@ -762,12 +762,12 @@ The contents of fifth are: 16 2 77 29 ``` #### vector::~vector 销毁容器对象。这将在每个包含的元素上调用allocator_traits::destroy,并使用其分配器释放由矢量分配的所有存储容量。 -``` +```cpp ~vector(); ``` #### vector::operator= 将新内容分配给容器,替换其当前内容,并相应地修改其大小。 -``` +```cpp copy (1) vector& operator= (const vector& x); move (2) @@ -812,11 +812,11 @@ Size of bar: 3 这是vector中保存的实际对象的数量,不一定等于其存储容量。 -``` +```cpp size_type size() const noexcept; ``` Example -``` +```cpp #include #include @@ -848,11 +848,11 @@ Output 返回该vector可容纳的元素的最大数量。由于已知的系统或库实现限制, 这是容器可以达到的最大潜在大小,但容器无法保证能够达到该大小:在达到该大小之前的任何时间,仍然无法分配存储。 -``` +```cpp size_type max_size() const noexcept; ``` Example -``` +```cpp #include #include @@ -885,12 +885,12 @@ max_size: 1073741823 如果n也大于当前的容器的capacity(容量),分配的存储空间将自动重新分配。 注意这个函数通过插入或者删除元素的内容来改变容器的实际内容。 -``` +```cpp void resize (size_type n); void resize (size_type n, const value_type& val); ``` Example -``` +```cpp #include #include @@ -919,11 +919,11 @@ myvector contains: 1 2 3 4 5 100 100 100 0 0 0 0 ``` #### vector::capacity 返回当前为vector分配的存储空间的大小,用元素表示。这个capacity(容量)不一定等于vector的size。它可以相等或更大,额外的空间允许适应增长,而不需要重新分配每个插入。 -``` +```cpp size_type capacity() const noexcept; ``` Example -``` +```cpp #include #include @@ -948,11 +948,11 @@ max_size: 1073741823 ``` #### vector::empty 返回vector是否为空(即,它的size是否为0) -``` +```cpp bool empty() const noexcept; ``` Example -``` +```cpp #include #include @@ -986,11 +986,11 @@ total: 55 在所有其他情况下,函数调用不会导致重新分配,并且vector容量不受影响。 这个函数对vector大小没有影响,也不能改变它的元素。 -``` +```cpp void reserve (size_type n); ``` Example -``` +```cpp #include #include @@ -1041,11 +1041,11 @@ capacity changed: 100 要求容器减小其capacity(容量)以适应其尺寸。 该请求是非绑定的,并且容器实现可以自由地进行优化,并且保持capacity大于其size的vector。 这可能导致重新分配,但对矢量大小没有影响,并且不能改变其元素。 -``` +```cpp void shrink_to_fit(); ``` Example -``` +```cpp #include #include @@ -1085,7 +1085,7 @@ Possible output 在初始化列表版本(3)中,新内容是以相同顺序作为初始化列表传递的值的副本。 所述内部分配器被用于(通过其性状),以分配和解除分配存储器如果重新分配发生。它也习惯于摧毁所有现有的元素,并构建新的元素。 -``` +```cpp range (1) template void assign (InputIterator first, InputIterator last); @@ -1095,7 +1095,7 @@ initializer list (3) void assign (initializer_list il); ``` Example -``` +```cpp #include #include @@ -1185,12 +1185,12 @@ vector<_Tp,_Alloc>::operator=(const vector<_Tp, _Alloc>& __x) 在vector的最后一个元素之后添加一个新元素。val的内容被复制(或移动)到新的元素。 这有效地将容器size增加了一个,如果新的矢量size超过了当前vector的capacity,则导致所分配的存储空间自动重新分配。 -``` +```cpp void push_back (const value_type& val); void push_back (value_type&& val); ``` Example -``` +```cpp #include #include @@ -1215,11 +1215,11 @@ int main () 删除vector中的最后一个元素,有效地将容器size减少一个。 这破坏了被删除的元素。 -``` +```cpp void pop_back(); ``` Example -``` +```cpp #include #include @@ -1250,7 +1250,7 @@ The elements of myvector add up to 600 通过在指定位置的元素之前插入新元素来扩展该vector,通过插入元素的数量有效地增加容器大小。 这会导致分配的存储空间自动重新分配,只有在新的vector的size超过当前的vector的capacity的情况下。 由于vector使用数组作为其基础存储,因此除了将元素插入到vector末尾之后,或vector的begin之前,其他位置会导致容器重新定位位置之后的所有元素到他们的新位置。与其他种类的序列容器(例如list或forward_list)执行相同操作的操作相比,这通常是低效的操作。 -``` +```cpp single element (1) iterator insert (const_iterator position, const value_type& val); fill (2) @@ -1264,7 +1264,7 @@ initializer list (5) iterator insert (const_iterator position, initializer_list il); ``` Example -``` +```cpp #include #include @@ -1326,12 +1326,12 @@ int main() 这有效地减少了被去除的元素的数量,从而破坏了容器的大小。 由于vector使用一个数组作为其底层存储,所以删除除vector结束位置之后,或vector的begin之前的元素外,将导致容器将段被擦除后的所有元素重新定位到新的位置。与其他种类的序列容器(例如list或forward_list)执行相同操作的操作相比,这通常是低效的操作。 -``` +```cpp iterator erase (const_iterator position); iterator erase (const_iterator first, const_iterator last); ``` Example -``` +```cpp #include #include @@ -1366,11 +1366,11 @@ myvector contains: 4 5 7 8 9 10 在调用这个成员函数之后,这个容器中的元素是那些在调用之前在x中的元素,而x的元素是在这个元素中的元素。所有迭代器,引用和指针对交换对象保持有效。 请注意,非成员函数存在具有相同名称的交换,并使用与此成员函数相似的优化来重载该算法。 -``` +```cpp void swap (vector& x); ``` Example -``` +```cpp #include #include @@ -1403,11 +1403,11 @@ bar contains: 100 100 100 从vector中删除所有的元素(被销毁),留下size为0的容器。 不保证重新分配,并且由于调用此函数, vector的capacity不保证发生变化。强制重新分配的典型替代方法是使用swap:`vector().swap(x); // clear x reallocating ` -``` +```cpp void clear() noexcept; ``` Example -``` +```cpp #include #include @@ -1467,12 +1467,12 @@ v1 capacity = 5 该元素是通过调用allocator_traits::construct来转换args来创建的。插入一个类似的成员函数,将现有对象复制或移动到容器中。 -``` +```cpp template iterator emplace (const_iterator position, Args&&... args); ``` Example -``` +```cpp #include #include @@ -1504,7 +1504,7 @@ myvector contains: 10 200 100 20 30 300 该元素是通过调用allocator_traits :: construct来转换args来创建的。 与push\_back相比,emplace\_back可以避免额外的复制和移动操作。 -``` +```cpp template void emplace_back (Args&&... args); ``` @@ -1573,11 +1573,11 @@ Franklin Delano Roosevelt was re-elected president of the USA in 1936. ``` #### vector::get_allocator 返回与vector关联的构造器对象的副本。 -``` +```cpp allocator_type get_allocator() const noexcept; ``` Example -``` +```cpp #include #include @@ -1628,7 +1628,7 @@ deque上常见操作的复杂性(效率)如下: * 随机访问 - 常数O(1) * 在结尾或开头插入或移除元素 - 摊销不变O(1) * 插入或移除元素 - 线性O(n) -``` +```cpp template < class T, class Alloc = allocator > class deque; ``` ![](http://img.blog.csdn.net/20170727225856144?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRlg2Nzc1ODg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) @@ -1639,7 +1639,7 @@ template < class T, class Alloc = allocator > class deque; 构造一个deque容器对象,根据所使用的构造函数版本初始化它的内容: Example -``` +```cpp #include #include @@ -1674,12 +1674,12 @@ The contents of fifth are: 16 2 77 29 在当前的最后一个元素之后 ,在deque容器的末尾添加一个新元素。val的内容被复制(或移动)到新的元素。 这有效地增加了一个容器的大小。 -``` +```cpp void push_back (const value_type& val); void push_back (value_type&& val); ``` Example -``` +```cpp #include #include @@ -1704,12 +1704,12 @@ int main () 在deque容器的开始位置插入一个新的元素,位于当前的第一个元素之前。val的内容被复制(或移动)到插入的元素。 这有效地增加了一个容器的大小。 -``` +```cpp void push_front (const value_type& val); void push_front (value_type&& val); ``` Example -``` +```cpp #include #include @@ -1736,11 +1736,11 @@ Output 这破坏了被删除的元素。 -``` +```cpp void pop_back(); ``` Example -``` +```cpp #include #include @@ -1771,11 +1771,11 @@ The elements of mydeque add up to 60 删除deque容器中的第一个元素,有效地减小其大小。 这破坏了被删除的元素。 -``` +```cpp void pop_front(); ``` Example -``` +```cpp #include #include @@ -1812,12 +1812,12 @@ The final size of mydeque is 0 该元素是通过调用allocator_traits::construct来转换args来创建的。 存在一个类似的成员函数push_front,它可以将现有对象复制或移动到容器中。 -``` +```cpp template void emplace_front (Args&&... args); ``` Example -``` +```cpp #include #include @@ -1848,12 +1848,12 @@ mydeque contains: 222 111 10 20 30 该元素是通过调用allocator_traits::construct来转换args来创建的。 存在一个类似的成员函数push_back,它可以将现有对象复制或移动到容器中 -``` +```cpp template void emplace_back (Args&&... args); ``` Example -``` +```cpp #include #include @@ -1894,7 +1894,7 @@ forward\_list(单向链表)被实现为单链表; 单链表可以将它们 #### forward\_list::forward\_list -``` +```cpp default (1) explicit forward_list (const allocator_type& alloc = allocator_type()); fill (2) @@ -1916,7 +1916,7 @@ forward_list (initializer_list il, const allocator_type& alloc = allocator_type()); ``` Example -``` +```cpp #include #include @@ -1959,12 +1959,12 @@ sixth: 3 52 25 90 返回的迭代器不应被解除引用:它是为了用作成员函数的参数emplace\_after,insert\_after,erase\_after或splice\_after,指定序列,其中执行该动作的位置的开始位置。 -``` +```cpp iterator before_begin() noexcept; const_iterator before_begin() const noexcept; ``` Example -``` +```cpp #include #include @@ -1991,11 +1991,11 @@ mylist contains: 11 20 30 40 50 一个常量性是指向常量内容的迭代器。这个迭代器可以增加和减少(除非它本身也是const),就像forward\_list::before\_begin返回的迭代器一样,但不能用来修改它指向的内容。 返回的价值不得解除引用。 -``` +```cpp const_iterator cbefore_begin() const noexcept; ``` Example -``` +```cpp #include #include @@ -2035,11 +2035,13 @@ map 是关联容器,按照特定顺序存储由 key value (键值) 和 mapped 在映射中,键值通常用于对元素进行排序和唯一标识,而映射的值存储与此键关联的内容。该类型的键和映射的值可能不同,并且在部件类型被分组在一起VALUE_TYPE,这是一种对类型结合两种: -`typedef pair value_type;` +```cpp +typedef pair value_type; +``` 在内部,映射中的元素总是按照由其内部比较对象(比较类型)指示的特定的严格弱排序标准按键排序。映射容器通常比unordered_map容器慢,以通过它们的键来访问各个元素,但是它们允许基于它们的顺序对子集进行直接迭代。 在该映射值地图可以直接通过使用其相应的键来访问括号运算符((操作符[] )。 映射通常如实施 -``` +```cpp template < class Key, // map::key_type class T, // map::mapped_type class Compare = less, // map::key_compare @@ -2072,7 +2074,7 @@ x保持未指定但有效的状态。 用il中的每个元素的副本构造一个容器。 -``` +```cpp empty (1) explicit map (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type()); @@ -2094,7 +2096,7 @@ map (initializer_list il, const allocator_type& alloc = allocator_type()); ``` Example -``` +```cpp #include #include @@ -2132,12 +2134,12 @@ int main () 由于map容器始终保持其元素的顺序,所以开始指向遵循容器排序标准的元素。 如果容器是空的,则返回的迭代器值不应被解除引用。 -``` +```cpp iterator begin() noexcept; const_iterator begin() const noexcept; ``` Example -``` +```cpp #include #include @@ -2166,11 +2168,11 @@ c => 300 #### map::key_comp 返回容器用于比较键的比较对象的副本。 -``` +```cpp key_compare key_comp() const; ``` Example -``` +```cpp #include #include @@ -2208,11 +2210,11 @@ c => 300 #### map::value_comp 返回可用于比较两个元素的比较对象,以获取第一个元素的键是否在第二个元素之前。 -``` +```cpp value_compare value_comp() const; ``` Example -``` +```cpp #include #include @@ -2249,12 +2251,12 @@ z => 3003 如果容器的比较对象自反地返回假(即,不管元素作为参数传递的顺序),则两个key被认为是等同的。 另一个成员函数map::count可以用来检查一个特定的键是否存在。 -``` +```cpp iterator find (const key_type& k); const_iterator find (const key_type& k) const; ``` Example -``` +```cpp #include #include @@ -2294,11 +2296,11 @@ d => 200 由于地图容器中的所有元素都是唯一的,因此该函数只能返回1(如果找到该元素)或返回零(否则)。 如果容器的比较对象自反地返回错误(即,不管按键作为参数传递的顺序),则两个键被认为是等同的。 -``` +```cpp size_type count (const key_type& k) const; ``` Example -``` +```cpp #include #include @@ -2344,12 +2346,12 @@ g is not an element of mymap. 如果map类用默认的比较类型(less)实例化,则函数返回一个迭代器到第一个元素,其键不小于k。 一个类似的成员函数upper\_bound具有相同的行为lower\_bound,除非映射包含一个key值等于k的元素:在这种情况下,lower\_bound返回指向该元素的迭代器,而upper\_bound返回指向下一个元素的迭代器。 -``` +```cpp iterator lower_bound (const key_type& k); const_iterator lower_bound (const key_type& k) const; ``` Example -``` +```cpp #include #include @@ -2393,12 +2395,12 @@ e => 100 类似的成员函数lower\_bound具有与upper\_bound相同的行为,除了map包含一个元素,其键值等于k:在这种情况下,lower\_bound返回指向该元素的迭代器,而upper\_bound返回指向下一个元素的迭代器。 -``` +```cpp iterator upper_bound (const key_type& k); const_iterator upper_bound (const key_type& k) const; ``` Example -``` +```cpp #include #include @@ -2440,12 +2442,12 @@ e => 100 如果没有找到匹配,则返回的范围具有零的长度,与两个迭代器指向具有考虑去后一个密钥对所述第一元件ķ根据容器的内部比较对象(key\_comp)。如果容器的比较对象返回false,则两个键被认为是等价的。 -``` +```cpp pair equal_range (const key_type& k) const; pair equal_range (const key_type& k); ``` Example -``` +```cpp #include #include @@ -2510,12 +2512,12 @@ unordered\_map、unodered\_multimap结构: 元组是一个能够容纳元素集合的对象。每个元素可以是不同的类型。 -``` +```cpp template class tuple; ``` Example -``` +```cpp #include // std::cout #include // std::tuple, std::get, std::tie, std::ignore @@ -2578,7 +2580,7 @@ foo contains: 100 y 和上面的版本一样,除了每个元素都是使用allocator alloc构造的。 -``` +```cpp default (1) constexpr tuple(); copy / move (2) @@ -2619,7 +2621,7 @@ template tuple (allocator_arg_t aa, const Alloc& alloc, pair&& pr); ``` Example -``` +```cpp #include // std::cout #include // std::make_pair #include // std::tuple, std::make_tuple, std::get @@ -2656,7 +2658,7 @@ pair的实现是一个结构体,主要的两个成员变量是first second 因 * 可以将两个类型数据组合成一个如map * 当某个函数需要两个返回值时 -``` +```cpp template struct pair; ``` #### pair::pair @@ -2681,7 +2683,7 @@ template struct pair; 构造成员 first 和 second 到位,传递元素first\_args 作为参数的构造函数 first,和元素 second\_args 到的构造函数 second 。 -``` +```cpp default (1) constexpr pair(); copy / move (2) @@ -2700,7 +2702,7 @@ template Example -``` +```cpp #include // std::pair, std::make_pair #include // std::string #include // std::cout From 0b96d61b016916a5c03af31fbe8adfb28085caaa Mon Sep 17 00:00:00 2001 From: huihut Date: Wed, 29 Aug 2018 16:24:12 +0800 Subject: [PATCH 24/25] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20TCP=20=E6=B5=81?= =?UTF-8?q?=E9=87=8F=E6=8E=A7=E5=88=B6=E3=80=81=E6=8B=A5=E5=A1=9E=E6=8E=A7?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 35 ++++++++++++++++++ .../TCP拥塞窗口cwnd在拥塞控制时的变化情况.png | Bin 0 -> 31426 bytes images/TCP的拥塞控制流程图.png | Bin 0 -> 26869 bytes images/利用可变窗口进行流量控制举例.png | Bin 0 -> 56819 bytes images/快重传示意图.png | Bin 0 -> 29416 bytes 5 files changed, 35 insertions(+) create mode 100644 images/TCP拥塞窗口cwnd在拥塞控制时的变化情况.png create mode 100644 images/TCP的拥塞控制流程图.png create mode 100644 images/利用可变窗口进行流量控制举例.png create mode 100644 images/快重传示意图.png diff --git a/README.md b/README.md index 32eee36..ec56838 100644 --- a/README.md +++ b/README.md @@ -2194,6 +2194,41 @@ TCP 是一个基于字节流的传输服务(UDP 基于报文的),“流” * 在数据包之间设置边界,如添加特殊符号 `\r\n` 标记。FTP 协议正是这么做的。但问题在于如果数据正文中也含有 `\r\n`,则会误判为消息的边界。 * 使用更加复杂的应用层协议。 +#### TCP 流量控制 + +##### 概念 + +流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及接收。 + +##### 方法 + +
利用可变窗口进行流量控制 + +![](images/利用可变窗口进行流量控制举例.png) + +
+ +#### TCP 拥塞控制 + +##### 概念 + +拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。 + +##### 方法 + +* 慢开始( slow-start ) +* 拥塞避免( congestion avoidance ) +* 快重传( fast retransmit ) +* 快恢复( fast recovery ) + +
TCP的拥塞控制图 + +![](images/TCP拥塞窗口cwnd在拥塞控制时的变化情况.png) +![](images/快重传示意图.png) +![](images/TCP的拥塞控制流程图.png) + +
+ #### TCP 传输连接管理 > 因为 TCP 三次握手建立连接、四次挥手释放连接很重要,所以附上《计算机网络(第 7 版)-谢希仁》书中对此章的详细描述: diff --git a/images/TCP拥塞窗口cwnd在拥塞控制时的变化情况.png b/images/TCP拥塞窗口cwnd在拥塞控制时的变化情况.png new file mode 100644 index 0000000000000000000000000000000000000000..bb00a04053ebb077ab8e61cd2d57e732221311e8 GIT binary patch literal 31426 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 literal 0 HcmV?d00001 diff --git a/images/TCP的拥塞控制流程图.png b/images/TCP的拥塞控制流程图.png new file mode 100644 index 0000000000000000000000000000000000000000..c17042cf0784c4f7359977a45b64666daecb16ad GIT binary patch literal 26869 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 literal 0 HcmV?d00001 diff --git a/images/利用可变窗口进行流量控制举例.png b/images/利用可变窗口进行流量控制举例.png new file mode 100644 index 0000000000000000000000000000000000000000..c62dc8f5c1ed22f0fd15fec01df9c0f18a6f1da0 GIT binary patch literal 56819 zcmb4~WmFwa)2<=7ySuwfaCdii+qk=i;O=h0-CaU(XX6@Nf?JRTKbz-y-*0_qt@G#n zU@@zwr)PFmb z-mSO&`p*%3*q*|_ZSccc|2Z4Y@!x&`ddz>@fEu*_9_3boF8^rbQU4g||2lFh`~Mn} zGve&*%yvO+m-O%b*~-lO-geM?trZ<;%=W&ly1Kfzr?dK?x5x7AR+Uwf?cRXrYM9OX zk&pBHzZ8sn{pUgh0|Skw^=Jtpg#%x{&=?vUzrQ@H3o9!r-QDhwCZM38ED3?0)HyZx z{On8`n;rExp&r}0LM5hkOpGTa^n!ScqHM&!762$NJR||2)*bLPkagiE!Y7 z9*!lP5iMal$Ls5#ZR3@la^@-*kfC<}@?bz?FJoG}0;20jm@tutvy_%2rH|xN^+ARl z9nE59X6~XXIx|o%bfyI^p8f&?fmHz?7mo2Pj3$s2m+gQo^m=!a^6L(C8;xgd_=rP= z>g^(f!u4{HFXE#(Z0Mcx5LoAe-d;M_+f`O!wtoaU@h&_*`uyV>9(EvQ6{XqY5?bou zo|tLSDwcP34ns;m$ZI_KK=+`a1mrr8v4dyH9Qd$2vit*OIHZoC(;|UUY>R&iA$ z7k7(N^Iz^>UMszyPSEZsy_`7|QwbtYSefK=quxh&c>kRW0Qw$ISn@W_L?Ic4#bZGM z0soi3XgHA$u@<9r-5nh}$i!dBWuwt}@9LLd-AfGqbCEC0M;x!z8%t7yJm+qjPgZw* z@$>Vg^xDkALW=eD8h#gx)|?tf_me%F3Bewlsx{|KmZPJi+U16@uyDekLJ1Nfe^N}7 zGt9c6WD|(pnvZ-$#2y9!7M1OxocrPnhs2X$>D( zNVFSbVq*Ip#w}-8*8vUy003(R3U7%_A^*Q7x@a$zhYAq93t!YPr?S>LcNOT}s_66t zR*hO9VL;7~kGz$Y0eWF3yHuioQ*9$Y;>ZyginvO?OX@^YyJuPka`KEbwVENGz6b2hsCfNjRf*>K&bb%$>g|7i ze$FU~AHHz>CN*IOrG+C8xJMbw5(;`FJXDCB?I^Y-C$>Y%_eW(Zl?pjF)UwkqS#t-&3f*hx3<#_LQ#`uxVYEEi8%2je7FLqIzJW>)o@XVs8MC;Fzv9oC-w;Gz}-y zCCy`M4gjbz6T6PB?t<5rrcZ)djC*r)bN%0u?3X4_`uu(=fC8PkVm}2*eml(O$*ueO z>EYsMzEnE>fs}S5%;@CN-`^^OZ7|lq3ca=u+7u0iuUyKUH*%xgEI`IqEMsOx$9xU& z_g83JqOCpO82eLSSBLB!c~0s|tw?T-SWGBW0+Umlt}VF&Z3rBizC$X=&re?n{xgzw zXXsr~e7Zz*MK}+}Ar$z63lpWLvU?#=!{0R~4@ZAEIVm4+&D!o<$p3Vg`g^Ke`o_vS zC0`>O|EKXgf`FHR*Uu`WOqhy_r_ciaQHc1FIQ4Yf6^}wOE{dzUyf~oNi-6(aF@8_Q z(E`}QZ1m;X@uBuoRTVPBoYtf?;Q{`Lv={N2plexiNZTZ=iF<&XoB60@q-khM3Wi(d zl9M_yF@}mOQ8Y&(m4Y!#AZqgG;32;kW6e=L-XK;+r;9)0hDCWDvZfn1i92e`s;64s zcmg#yzaIxq@a&V?Z4!r^N(|NSqkQImM;5{3Z#_Bb6V(NTfO^%PohCiv~nv;jqTU3hfFK42CUctl`A zP$L4&_({DC422!_DD%*QJbZkZfcc|cNWr^{Z|v*@w*>zxf|WsbXq9dPn_kUf%~h=>;ga4@=BbfQtO?@z>{oJu#< zjbO9%pwg9NUGK2U?dYq7Alpc2vmX`KHOu9nt&{{RC~aj0+m?Lh#|YZ?`YTqt8NQ!N z8XpIj{L#RkkXOv`2VTHY$zbgvisPkY*36K!e5li_;u-0N3lS89oHIh|D4(pYeU7h$eobi5%F3$ z_P|CzC1D`OwQO{Blp+nrcH**XgsZuwnHT<(pl}0Vz3@bad))jUBduRZKV6gwa%fSe z0jZz?qEi1Se;CDZ$sZq!M0K|xVA!APTwB*1O+#JLrx+$L)FI8JdVLw-g#h!pvW_3cC2@NG(Tb}j{P z$K}n}X5;(MMqwBIy>6QM))3$@3V{W1Pm<)H&pcB*pe?mGOnZ|=VEuB!{=Fi2E^quI zWhU}Ij;Um$Z9{aefXq*9a2<4fQhSS6^~FRB}Np*BwAp zi3yJbYm2D}Z#2K*)YIJATJbo){^!oLJjVAERs9`{@m|$2PMh5%Eo%GPJ185dCBCY% z1?~VF7cs;X4PswadHn62jtN7Eywa`;#bl;$=w4n^*7BMe7CccHfEkygjXAyYM7~#3`>5wNyG(ae^77gNy&}L-w>S^i z4T((HT1w@q)xJ?c&Gb<)h9!t;FO1LdTCnDSu{j52*#2KX({X*kuP zn6`a0g#D|ndX#Ksh;o9|_wbpNwiyN-&+l_(SeuF1g%z4>1stuD$@Igj(36yl4XW>9 z^&-;gm#Mhs)xY<~u}-(Tih?J=gMrex01_ zS^Xi8ROk5(s_3D)wAOq_(#N0#vm}NLO|oRBDwqlA4z^=ZvfiSyii91VnM!&j!=DnO z<1UpnpiF$6$)Y&NCe98U2HFo6KgMn;R0FWK}aCvbyJG$8uKTV<{*Sb0_c%Ga~ zN3GPpp3d;ADQDHZa(XU{{9=bP@sTjO{GcobB9>>nDLs+K@J*D371w*NY@sDc+d!_p zO|00bHqr}9)peP>4Z$e)uVGQW6rsY z-f4R5>k(wx(Xfdk+*zIkTxr|w_uz_rCu*?~PPkLek*G1R`?0k1$Qgwlg8a>n0sE+w9}qaHe2V`5IM+t^AIo8Mfj{ArkUfQ!o&PsaDb; zZR*62h}sbSd}MTX|;}domio3wWp87E)PyWnl*rUE4FLV~tS0 zwp5#g%_6+S_@jKXaC-Cc@fqKCvTInhaqaBt8hDRZ^lH?2J(}%vik3&8#OBaUx&yO( z?t+78E5Ss@tt`8D4b^kDXN!&>1Uj8}L1SFSxu$B)+>lOAji_UCL zm+5Z4?c1zyZt01Ka+Y7;Ov(<6kC`ziyg1?Od|zv$tXy`Na7|v+^uYV2KtKd_o8{ee z!tk>~_tF>K8GA86AY5IIE!$7yw;D?Tj-!9M&5G`=@o}4U%sPk8aF!82z*n1lCv2cU z$r_{1dLHOHo-`$pct`12IKG)(S;{2Z6s!r~Q}pM^6`vw zL%zp?=t85uz6)5O)vk{ZFqK+=$leiLg6NtOMnD83+KRi%Y+AdG{)bU{P?`oISZyvS zBLGIaN&%MH@;LwMpV~(Olfk6IB*5GP0&49Vu{Gvz@NC(dciT0l%qe&=uVq5UJ2foW zu6W9pterv+6}V&RKr48qiuWXGXnfg9Faa6n1V5nvrXW2i6U+nPDR3oenJ9?ryQF|m zMLZi|$g@!Q03*#VLkq*yoWxP7+lA5qbdXQ$=)<&<@*0e86+dW7=cwdbAET)yEjRpi zf}n7x^4=*+me=4wEYBxLoY|hWpGuhY%xSXtNbV|nk4#8#!i}FPMLWJ^#beaeV?1Zf5(cfwMDwjVIZwv zBO|bIJg738tmoK?Nv`&SgS({P<+|v(H~xNIx9wC@o#X9NOUYyRqzjFEPZnFI87q1{ z6gj|d)k_*RFfv*<;&7S$Yi4UJ*oi4%F}uU&wU-jBcw^534j?y4h3G6XVON@Mm0=S( zF9Xkksg9Ce^Ix2(2K@f=-fQ7`Mv6g%R>+{PW|5mqH+NfID(mPOw(3}4wqS| z1X}LgjY#By?%n$D=y>Q^I`an2(1Lb|vl)*gUbB_EX2nt~Z2vDVfedc{RHgWD-i-;s zFCmLJy3kNSDe^9B7|Ao?aeQvI=8xEc||NIDiU5|6>((C5U zzjLo)T>pzmAjs&Iq}B(;)Ss+o3n^Ri#`N!q?}M+e0X9gUUu2-cFS^;nd1xeu5Q`$E z`NVokWQ$D%l_eUmL&h#9RG}jMnI+*oTBw=TOrhtb5V~E?=D*;4ARRYqaslm}%RVk5 zLVlOB>S~6FNzYXK_Y9en+g!SNqKFbO6E`Q2qDfU zVYMnpzd%0@gaT{Bg4%Q82234rnksN3RT-tdl$4aH-GaSK9iQ&caOm1kXzg&*Or)st zEgBc@?>(Z)i6JcbR300pr~NheEqc2@EPgG=iy@Y@U-iSg@9?m6HQ)OSbJriHWbmg) zhq$0+p43LA$t=ba*%^s9(7ftM%dJ$z(0NNGH{UPEtl(OQ^l6ljq9uqls~ULQFZl-} z#OH7{5|e1Zwpy;Z)=`m&li)(Q;%tIg3t)V7Oz-aa{9Hl!eg!>Mf*lgUN)M6IPY(!b z93=*I^j5&U5zbLbZV0@)z6QNliUMBJiRD?;#xy8Nln0+Oja;65pvz+`&&n06z`K1R;9YTcJRft?G8iK`v_yp5> zE=T(KwJ5RnAmr$Ssn!udCK>$$eXsI3Y|;doHwjS{8(q+Q@$@CEV!X$9 z#sVg@RQ!f_%y11sOqL{P8)+T|96Gv%~Omn54I8O{;oik7Qt zK&FJ39?6Qo+#rlkBDb6~E_h%Mn9Bn}!6(QpEQJE00AH<5gGr|@Yz-LR&k?k=Ra+X} zL!p7ssLmLE@n+dIwJTtvQ1nDmUIyRFV;ATUn( z`(}3#h8FfKb|@`2e_la>v4Md|rhk*d-JVt4ATi9@6X5Fv>Gu#Zs!1{?-dbZS!OF$1 zqxb2TJw!9I#NkkZWi6yQeMa%>oag(q485AAW!^LNlyhOFw=p@;J21`)uiRjkD1aRw z1)q1b6qcwx=u|RInD6N{n)qG>)A>swC(y~hcr(1 za~`HafB%arC0V{@51jwELkt@N!tXE?op zV)>7x_Y>Kpv^Py2cp&6qX$BYn&+Xuu6wgxQp2N!#d*o`NIxgJxB_;8*XLf-DJ>4=2 zVzclH)lpqYzu8&R2)I@|2)_jPiL~D+l?k#|Bd3%-`Me(q2_RDj5yfkbnkwxF02zJKK%A{Lgx~7`7XK>G=z$O}HvQuOMjAN$goK1f8C9mDXZqOuT_=|^?SZVlHa|qpxmXyc zT^mQqn|1p2>o7E^lqqyySD~{z@MLZ6*rydj!pHJ74y5#-aRjVfs_lGF&O6|nZpHo* zw|sKh8k(zGlwg}0WD6}jNqsci*yse%yI;f@x&1T>)eBXEt<@Zwu- zX-Axa^h7x@6}j{l49|rK0ygDFT3->@+iYPU_EKJk62*}s^_*uFrB1zCejb0G-x+Na z)fJzEMv7lB35_w-&1*&VXIV}8)-n4-g<1tnt>G;==)|e=G(Usm`)9&s;RSHj?$Cjf zp-)>s*qRg#T+pD0mNEnzuUIbZ)&wc6Ej;7JCK|sh-DH{qV;>qIa@7!AyKW6J81 z#%rqnw3d_~K9l?L%^+Qq7L-c(VJ*It38QtVS#@Rcs;n>TkIjF4-9h4ZfHl)S2)8*7*43UD#aHLICw>_T0 z2KQfOn8%|NtxEIf1D?h7(Rt`@I_gs5WAF#1vT#+2Cku+s4@h&^&Y#Sg5*-+IVO0Z) zLiSk`ggi((FUM@mq-;ru-G)`8RiTY(4=FQOW;`9GLz`8xas9IV18C@)9;3MEf7763 zmeL{!jN6n@H488CMImgcdXT@KeH&26d;Q+b*frS_DiAyN*JOB45MKgc9hQR ziMG9e#phBvh$L0fwYD%jUWWIkn@?%IxsHTS zxVe$+WFe(=25VLAlp>_&!)cxI1bf)g>#K>U$m8o@}15QC}HfyyYN;OWY-~sA#9|it81q~ z-A{~U8J2BpIzC;3h1@pdn^YJ>=%PY_gk>2VuDxAmS>#X0*0jvC?d=HR;qY@O($flh zYGlTOvB}}lU_GSO3!bGv>*c;o`MU}&V<8vU(&yo+{1#k4s{=P@?f{X@A2;e@n#aXb zUr2;sNSbB}A89}a#6`LLA?J=Q)q`y%DbF6sO351_j za_NFgKf|M>0%OmVT73jixONnn#BFsKg>vEKAVYMyq_+c_7}-%)u?z?4ct4XO#MzcZ zc9UbLmg8#ZRM?#TEiKG}jNp8p@|L+cxysN}a4jo^j_B*(%_QM`v2L`m>zIR#8%#bS zU;*CE=fdrt8nb*=E)XK)2CTZs1S3$!MJ_Xiw?Zbv%%g3DV1|#8J!K>eviw&Iz(}XS zSGEhIS9pxu%|)k|@V8F?*FOH659;43TfZJExdC-!3C*!v@Hl8QAI?7$X!nWyR7jbE zE*>7kWHpczChs~Gb$1KW_FXDA_m*n%XX1<2u^2xNQJqbn(L$jT5w61P(*RW>2KkWuyL=CQJ}?kwhuq_^RevK z=8nf=NXzk8oL00xk*{42HBoW7uQOdIb*-3X8-7m?&rP!?WEi1X>|4O%P_v+q4Jx2n z)p1#8MJC>IAjk!v1N79w*MrshwYtkc!9axI`T3V$8|03^W!>RLMu}^CM8pIWMEO`} zO8r4+MG3v=5V^-rFASeIMI^lQxbZ>qn`@8_ZjS7&Eyy9FN0>}EW?UGk{`#voh3nx_ zY0h-m$G{8s=YHy1vu{$fk$AzD$N(B#a2Q);MkcM5^#US*{HBdkc7-+3-s62Z(7afn zrd3_{mHWiwqHB)0)^)uC>(H6JiX1XfwuqaV62Vy>*u}l05sEirX{VS>=O0Vao0d!G zi5*q$8HtjJQ?|Y3JN!JLhKfboo2KPFs?klgX@Kdj8(CWS(l8>jQ<6*@c0dGSqhbf4 zv__kZhc52BbsQLhq*)y$Z&V3CGnNGpv$AL{JlFLYhy*2Hg_Qf~DOlxH%4!DqMF&wm z-jZ?1*ER)Q9Zg-LyVgc3nji681($a%quQS4zjDxf+Xb7F7j+=2>@sw`;cRY+DShGQ zzVc;VrzOqWRhVG#b%?*;JgQhZC>&r06jd7X+a_h(Nda3@H(zeujSYS@&bfeZTzQUM ze0pYLk30Os?OHuxu2~zq2QwyvtKiPP3?0QWY!fjceLN{={-qr?8@VeVMnlPvvR`e* zZRkrsDs?|_a9(;SRxYIb#UUgiIM%g^DZpHmo z{j7F60*kE;S&84Oro1@MOk*IwprBmL_BlQjx*XzU(Rba)sb&We&}6Bg-P@$^Haxq@ zK}ijFdhU5_ie#}{*(4vljOAFL$eQE~Xga?~((RiJh-*{X!1O?)Gt(1hG~4-=n{InFRng!zYN*eq z$VIbX*IN%CLMsz9sJKiyU3kLc;>6vUJ3nQ|8Gq%dv}4ebE^Odv$=>6TJ+P7eS$g6< zvgmbUhyXpmk$nd|ksP|O!F!r&>{}vIyn#%;j>&eIOE6)wOD@sYY4c$lfWPznt_;{7 zVQ?YH(->BlH}l}%mK#bLsr%C8Ah3tCvV*Bl-20Wd9EqRA=O}p`Q>qtE=oK)#vuSmn zO)F7^QEW@8?~0#Z?CHQmZL}fRLikGH@)DOM9!FknZr^b;opqNbkw5x+yue1I1&{xz-1N-J=naT;7-6+1zCae*0va_X6s&YhnmmA;n= zAjiFvn^j@1&oY$7%);^~DHwzh;&?!rYHhFG(eW{cO;#*=Q;D1GhS|xYq_)J}-@n#; z>~*d1Yp%#ST~0sE*wm!8w^t0?HP)#f`l{L}4G1M%4QpFzgiJ)gTw^lvo6?=1>99>h zYcIxN-5B{c5JIf&N_~Yyd&L`9LUTvG9e%f$G(D zoY!e}Gu$?Ch1uYF-=TI0^r*ZI-b5V# zxVij`w5X^2L!G3*0~!PT=I-ten)38Up|=7(!mR5k$89|Yw?ZbtF#`V{)Bh|lMEK6W^FTS%3Uj6XKI|8kA6;vtaCgdn6C&ATwpsv+k$P<1rQ;|m*x>1sewr3PCG z#6-uE6To+f<40H5x}3$*9_jk`51HDF4^Tp(AN2DOL^g)2_{ec1i&34};fo|#fHN~r zj*iru*r*A&AOQ+U(Bpf!yDRE09dxfwIrXWWa>BJjH75?E{|hE+fD2l21T|?=^scZb zE~m?0q=jPc;`}s7v;?ASASZ{BRarEVhm)0kIzpA*Ggc)pEg;iH&(I8g1S08J9~TE@+UdZ_V&bP z#4|yHo7iFWJ@Q=o8@E<$3DGZRjF^phO)Bwn5jYN05{&MYniFDS8rUGY*$NcBB$h1i zo8BNgU8?)Tb*QAzz3WFb5dll+jLt+`Pmp(Xo*y4Onb((8891StFMhNLob_tG%9`DL zhpD~W$GHb{C&QMNjEnk)i2)&#P4WHN%%~@g|0@X^J{smfW#%C=*T>hwP#CEE|4`Z4k=+7bR9QYPNrhW~yuTTo=pYk4&0!N?a@P zaAyEopkqMcPOKmnW5Mcvarg1D0fx$qz-7~%+>d1`oER}~e5@hM3vw$}TYoK^y+gQGKWtP% zRlN)xIn|BWsFG?+ z>`V3UUUP)YyEUK%CUTTl^(I3VT;7;aO^j zwc4bR-5#*=Gz(tiN+ePm20p_X7LHoi%%ib8h}0E?*>AguPya5Dk9--GwLqh2HJRnGrQ5U&Wl)LJ@4(WC2CH^$>hPwuzcHW+7~jEWMs9UR7GI&KGG zYwetal~SYmjT!cgyPPVoFIZwd3>^MJ-BTKkd6Ej_yd$Tc{5BlgEmz<7nf8+#R=SsX zlFIDHpAwXjTX=sA%SwWlkMrlC=5gkT%ty)Jo7qI#`TthH+-7d6k+hZ@17xPAa!)E< z5s}`C&_Fy9q2)Pt4)6&uMNE}6f!T?yU*gN& z3eu_z#y7;WADmDxbj%D;Y(9X~!m>_ZLYTsK|Qz z3MI1Xq9R6h9~;^>BVy`8F94>4Ge0B*4i1jXxN4*7K-+6IJB_QjliI7+oB$m`ne;j> zXC%S<8_VCwgEIboBM_<&HoFxO-vb(% z;Uv$oOZYh$;R1P1*_aQI(eVphBaJ@`4j(PMnjzP8FbGRJd!XK& z?ocalPdGsy^^G>g1gtj@U*R>s9`5p{rWn5!@!VNRei2GeuV-{AYjku(?HEMk)kDKE zskP-@@CRd`QIYqnUkz!K8t9EUYoTZT(+Xv>ys%v{y5WO?IPT1+P?LyQGuva;u|g_- z!${Bq!ED)v8RTnZ^y-;|shK6TDV5EN`!-Ncrfj{fv%;13>@)F8ObSQEQ71ym#i$O7 zf>o}W6v@waFr%wJ44ZYqYq^%QPJ=tGb18$Y<<{I^+LjHvnR!ubGYk;LT8YcF??QG` zLuJBeRsEiIWo`ak!77W7&r56ED8$ekxoEunHbcTlMU=lXAn<60E?cG>vn%(L8m7vY zcC%#E!-bZgn@Tc~T&U3#Tk?kh1)CoH&T2HltHrr`S}ucBo12EYuW6D3QNLoAoZ4k+#cM-ix_B@D3Mr426tO#E<?lV*zmAf0-h4!`*sQ_xoX$RD?!Q$uTo>67x{oq1& z-Z)m$O|4i?O`n>(qiX5rb1?eYhEwN6_rw<%V|S^5C9&L&jhO%e zOSUX80PZhaDLRTo@ESe8w}Ra4yNMBKr}9hCck<_ftVGGPZp-#jB|hC3lc$Rm%dI5B zXbzj^uX&YTOhP^x66*GB3%$0VfvFFgB{fpcMyhqFfUcGv58f0#sjHDRIHGCCu1xG) z+m_=P4##vFU9pgtaTm8@W#<^@zjmFNYF_uP_;}JsY;Vl2L`%p~->?AZKr+blF{T3Z z(}b^ltzc%9(d7s-5N6G^L2B4@Yv5VQKv72JO*%tEP4urt-t))=PcfQ!4tpH2Vhm5G z@PpPBk3~&&)rBK_v}Y?tiMW}q1$lWMX_*yfjmz!e9Z;+xDD?1FsH{504ld@YBIUJc z01iMITFhs?$GeWiIg~7-Y#pZ8?i0an}@&qz37`;~`Y2NVI(GgmGzLNWON-G^5f)vlK6i3G6i&4vPVBl)d#j%leYSuOL_AYr4DaHGMEim9y@nGe_} z)2)$g@ZpxC+2Q3uqZ5brA!}ZlGr9o!rZf&%p(VxZt6OfX6<>>3zlPl1&}wxj1iIvDC`l)p6mX z!vy%M=faJ5mJN?76(x+)wq1-MuH9zN&(l41ylR@BU$DYI?2oe>de8mN&RfP6Y)H*3 zqbaY!_fQ_!Jse7nj-G(iTUgX2J?-6I`TAaMh-30wQ|R#LR9eUr#Ga{{zlV{{#jKN9AC3(LXHa{QprG;DJaOp^~Hofy&-trT`%)_?p(l5Hv56;#nXT?9aoa;8AIeAmG= zDu87ef@FDIFOk(;y$2HUr>uWp)?S3bV3rIX8I@tUs!y^*ELF$YEjm$S8J7#SZ4ysP zEtIF{YuG4b=$)0fp>Kau3m&g}cJE@;jZAQ$UMLCFBW*?iV5AC>?WX{s%I%}9AP?zJ z^(!l@bpTC3;j~@Lp)~tZDFT`j=7kPp3;f9b4R}2>+W_-O!)l%9p+Y=ZBo#Y4|3&^Q zE;d%Ri7N4-+G=d~YDb-{QVFB6LeZ>*+UKu=0SDRK_e5ab{9|`M$7gN-}D@ zm3;F7TIg5g{TZQ$xJWrrsEwr=hH^4YQhci1I~I|^^nQ+w$@}g=_%fUYO1Zc20R#Cq zQufa0eF<&T)w~4?2@=(1$9?16;z`{)s9~2=W!jNL-m1!bwi|(c+GJ%cK5IMTILm+5 z38!R)44es|8$|xbam%6hKyhniFJ@0MMI4ksl4#%mAf1?SG${1%60Fi8p$vrP%kGbJ7QT4x7BK!szm+54Leo znvIP|XujbfD;V(z0f)?PmGFVwJF38UU!Da!DTPmzC#hK7&dZ}(-&wmRai(frg# zLNW2D<2O^ONqbS{#Erno7e(qBsp@U+ov24D0$Y6Nsc}{e4eU_pJxXc{_-AlLIO<9T z_lc!-4pm}E;o7ST3H8XC4srV|cSj&#yXb7L(J_7|NPla85OP90OGys3xTac0{6lDz z^vrL=L!v(%-6l1!wQyLjT(IcQ-;%Q~(1kb*g-N|tv1-2%r^Lj^w+Al2GcFiTHJ36j zy!$1Ihh>pmNEKH+&$$q0@21@X%MnJ2xnvUcq9!An4dW*nTQV;Dm`FY6!^==szZPqA zN!l%kz&FO;8Z;!=3uya|D|*c{jhgO~*3;pkthP-UAnq;siA~ICh4b@5Lgk@($z<*F zRo+ZJSz#j|<6H+1;(VnJNw#d*cK=m&&M;H%loVVV$K@H1{fN*kQtG-AB#e{(P3NNNwkcR>g&u>>CBm8J2zOP$*xFsw%JrFCqCKPd5^%n z5=HrqA`i;Bz)csM_A=QRmG%l>(xDm>($fm1gB5LsJ z;cg{D6w+?4DiVOQAr7H@}f+5o|ULfNiF7ipqxc5g)lvD+W zK82*PcH^i`oSENe@nhO&D`#BSE?2S+YO%$S~EsMYUyo7%T-!bXJAbx(KNFqkC$+TR>rK&_}R%XDr zxpF^b@N9~mIsD5qMN=$}+ygJ^fV^XBSc2L04e=s{Cxn`UCM}k5{}$KdG934`Fvb&b zC3b3cKBMCi0mP*0^> z|1tC!bt74?h=@h7-hwNAWWCxk)!0tSi>H4mX5xv|)b>FX(^ikV>wUacJk6n<1uYo$ zw>R}IRi{TyWdf1+#NPdZjbOZT?k0x5O{GA38gm>5f|k6y2JNzex9ZOJBihh)f%L8Mi? z2c`fm>`(a7zCYdJc+@a|MIH$VhSOu_Ls{$JeLne;k2N%l`Xj1PRYlW1Ed<#l8PkDI zrBOM-O$r)MhRzoR5iMa zGpf6;zMkzwke|P~!x}5qYrTQ|IqHGUlRfmY7D_`E7|L8|Ni# zw|Y8#E)SC3+>n~;)cH*(z>7#GUdrhOL zLC+f^vN6$%v$6PETeAVQ z-O&AS@jEDjj1cVS@7Cd|fp_roAL9&XwTVB1%7-hR%z)-B6Gj7#m;coQ41lDO>Fb`Aw!%SgC3(hh8pKE;A%sQ?JcWCkjpdhbZBi>K z7=u@j(BdHK{ZSnLy(EZQfRW|(&)(j^?wMo=AuTZr|L4!2y{G54L6!JRd|OaQCGOI8 zTW_t-UuRBd5+fU6+Q|kfk_yY>k;KfaJaH*T*Lg?A&e-hKuNGFG7kK#fqs_gK0)r{O7NC6$H%?3Kl^@zUujh&2LADm!DIrKDy3{2T(2WTN0ltlHZq^%JWPKoMX!`Ow2v84Y z=}421kO4xaw`^9P28))s>+HE7R`p*82;py6P0a#Etxhzzi948)9p zx!B>vdvyF9I8cELL0r)?1Nx5gWR}YNXWHy3G|vVac3Lw@!zC{dP>RSkj75xs%J&n6 zb?I5h?w;Axb0wOM91qb{@Apg=*Vc5=eL+gtTNVbd#EKjvf3t=87 z%*(4=>!A>ZLgpDQ|5qzl7Ou*kz5)OA<;6hLv)`Sjjn_)EE|S?D<|5N}I;IiEqZYc0v|Gl?}%f1@(d6R<4V-1Kt{d?x$h_|`{)t_VAH1P`xzA6VSuU15w zQi=DJD85Tg8swa~qd_q-0kT)%RVfZVJUp;EBRj(2D+~S)TkjZOM;CB?H%-zuwr#61 z8{4+i6Wfh#+qP}ncGAYS*>`%~&;7h#o{u>>zd2`S?>RHG_FDfXDT#ruOzP(cUxHQ= zbA~)LG&_>Y=+-1_-V@WbBfU@vvtOuL?(pt#|GT7_E>EYaw7%Z-btKe<2@|=&fBpIT znn@+~E8&Gg9#-(tlzlaD@&NPS#+SLa*!u#R2Bv@n*m2q)Nhn8#z|sTcZ}k!3vCUU^ zJ3>bN^9+Q`uxmspVmtxAKxZnfdG);^R`WXFjc>>~Vftl%9U>#=;AvM&`QA#$V>bBK z$5Knk>zG&*F7#L63u|s-opZcZ#9TUc7vv&JXg#+feB^}bSAA%%ea~vvcV`=Zi;B=C zM!2kjadHZW|3h5#X&p#2d`hySi`Pu=v`tG;zph0C2|ltE$-FS6RpU82+@iNr<~C@a z+GroQIzy=-JE|N=Uqz7hp*lHqaF?e0e@eBI&n$`mE>y?rSYXHO<0mZW-!=V(zgB2* zc7vUh{I~c5p+szZyvQk@ezQ@Qx%Bw?%p)8}d}AsdNRg}E^K-;oTI+uf`uQ)8jhwSt zMJn^K9P#M-@x|9$Iy^!MK>nMW;k^;*MZI%yt+kdB$#g$2Y%Ec8hh+%aNvaDRIZ4vb z%tQOEbV~HJu#!XRdyy_=dFkux>k4*x!5LIRV^yueu561L8LMxjlIp zT&IwMJ3r@ttcEaVt1rkQl-RY({p=bOz*64^8KP>-3J!_|zF$WF3%0sdb$Y(?th2gh zPX}p|Oye(icgc)nA8H)5C;k!6#)5iDK)+FXZXZbM-3W~d^tcbb%6sZYR-k%=G zDmvxqN;n_dL+Tf%0&22 z_rZUaguYB>HrxHEpm1+X!VU58_Pe?rEv*=M(H*V&eg?N!jdEo z3g? z;vt|E%F~>3k>1PwWe?Pa(a_1voZbcFS?0|yKYsK<@L0ww^tw<_eMO`Fq*Asr&Ozgq ziSx^IQ_F0clNFaj3od0x_cD-~_jhY6nV#5Ejk>_k&q)5iuG&a^g*TyVd~d-_J^>gJ zt5hmmtypoNig+Lvt-r8OKrU%t#X}2S4y5N2^%h#XFd6!3^q+?6GUx!pnnzb$XY4>Z> z&9_A|CaAI5SA2rqV)0nLGBO>~#9p|gF7fhMH)_LrXWDBXdsfzvX2Yq#P0)lR+QtCI z8A`(diTq&Cq|2HlSAjGRcVG?;Feed<+;q;zZOLUBLKkiLFiJ|YRr$1KxXusm_v zTz!I+0lcpsX$e!2COA*Dg$z6ml+-u)PKLM&e^XJGJ1wacTxd&QBy$sO=n{=Zzf{

lQ{cs6^v(Qh^FNUNeu_PdH%*dC`ni{VM&0jkin1&uSlSob2l~EPVW)={%J53o}ABt=-9Iqd9iyaOdVKn9O)-#L_BK zj|8j^xmLLZbVbr3+~<-~nk$(-D=NpSj?#QwH+<<7DijacvK${}cFbG*n%);uSSBD0 zq-H8FYf~VQy zB+kx3RnG1yRw^*BVxmLaXcdN(+Qld4XATaEg>+x6g-;Gi@6r*Hn;Z+>@M?C zUjN;=Tw-TXd5avh!>`eJ9KnCl$(n#37xrYA!tjt&7GF{&IsSt>$WFHgB3xl!U|b^f zAZ02FFLiBjZ3U|ot?2p>-FV{9O5;$-ZaY-+PQN%VE&&~LbWL!>NLAU;d~<^JU$we7 zlICt0e9jsRn@4D4Y^zTaL{)cYsaTC&=G$LFZ)%LW1)@`eXBSLu%pxP}P(%q8+0BPX zO>P>G{iNpX`PSgLMrh8>(C&_5js7NQtE${utKH)^4jE9VRP85Ng%`E;XhSFxNNKtC#yLFV?8LN--)W6bXt`z9{&?Mh|k zIvca4YXPK9ZLb2H3sv>p@}pl)6$~p3_)lq}{1*89s5&sf>Pj$Y<-hL_A;(LPd!@aF zWLM;(e!3iON;>>~V$LG=3sltW;oudBwxlulvi0w#pP4{zC4;`FjKFun3@n3QW zlmS7VDG1yVQ+aM|fk7d8V>)k3+|5vfK2RIEZu^o>{Ug?tacCy?n+1Q}DmH{t9ax^C zcr=+iUMQZ46#ZCJT%t4Qd{Z$O@}-2BiXqV|8wdCBBEGbtIhK?4_csc>&X$21UtQ9^ zpMG6YH#-kroG27S?OzgKF=+vxTjq8o2Lbu=Xt_wkel!g_b#wzxl$6o;U8$KUf_?^L zo%jUoHWVuX%c4wGd9so|Bh)x)+qRG<^q(0P%bhx%Gz(+Vh&$C=YmE4W+zS!?Y{Ey_ZzxV?>*Hn#g7 zj%BHJN%cp|yNx5MgSlVIvrF{fd_M9XX9JT(9a(AvRV@En!SK_+Eqdy4SS;y$pZlF~ z-;aGj_LCxbZnBVJ8D?ujdJ)}Lz!mM=Pi5T93MN{2J)n|$>7Crgdc z)7P-v>r}q<;Bw2Qnv@serdb_fvtZAT-8!%07Je(&yp&g1kS6O%*~7w=D1of{e7gW< z7-NBTfKSqGWz!G3g?(vVi=!nlrMqK@a(Jyv1XN5s4eq?A8?Rt0!MgcugVET^IcqYI z`)yBdCSs5m&8?uvmVHjj}X?{L4^3Z`JBGdH! zpzox{*UhP&&1kjq20`1nR+WlGJO5aMu0%atiHalA%NgOsg^FEu*lR{;Zc@QKARzqVI3p64PCw*~mvd?U*~F|H(#E=W z)D&iPVjQef`LI*bCH18~iP`OP3fIZb&Nn!)YJmPE#V|47znN@M-qE1j3Q>rEm9_}` z=)kZN#1TIyoD_W}jYUM)t`07>=LUyr-HABSkY%|EuQOFJ6mhVkW2UOuy|Zm;o8@h3 zh+q-QwV|y4nx*p|6}mN+x|VdD1mOo+E`^!lPc?Oi&xuk;=7@-moAg_j7#o80bm1aR z0S1)IG5?|88*U-7CvAvU=>stpFrQ-#)nJ$OgPYr7kD%aN$>C5qWuW8Eh^FRa?j{*s z>h2W}nBUsx{IO$lRw~L9=m~OOh3!@f36hecV;vSWAg{j*HBeCBwA^qMVfE1xG#O{f zl!VJX7Z;PL-eg7R^i6N~%Rramdb~-EoHxhlZ>l(oF9u;qW>YMs79^!sa-F18!tv<; z<^k1nDt|~>?tGT6Y?lg)?Y(gt)y1-_hsT1ajxc9;*0SfBQ468VJE@p2%sPZ^Fb3;# zJfSy0gUVw@;~jGE@zgug^YVev`4X3hZakotdDAx&oW0T;L#UxI7%+}<_ZdQ=b{|FV zrW)WrUEHD&Fs7*FV(wS3N7gYh=P7Pihm+>`hlHVJALNuUF(g+`rYV9!Pk7S5G4KX` zSF?4>NX7~HDW}1$^dS;uj0D^qjKlf4U?s=A9>XG~A^GlH$LEW#Twg(lwtOPpuUpNJ zraRZRpb$al5e3LY)fSq={unMCdP7Z%?T~L{xRQnVho=o$vne|5dCs!GImTT&`7|Y& zW|B+skY(Q#BrN<3EgOlg3$)KT^WSkn^K;1Xc*ml~YfGim zS-K&t|50_C*p? z1F`)VxK&YvFuXCcdASiny^@%e+*pE=dp8a_mWqak??GpTG%94*DFY=3ThTR=qd5M4W>S0VY1cA zic|Rf3&pWw&G=G%f~ryq0h3%@PLxO{wM!@-YOqlaUt77PMyuI9u7ndeJ62xf_CpEe z$>1KFlAGNgV{3SZfs_9XnQD!*C+lj_7??D2yI-W;H!e7P>ha#u+7A~A-4Q2y?dwD0J+^arQA=^*Gu&Yb1ZX_T{LrTbtwu zse%iA>Q@d)(L9n_-h-Z1BNxu-tY7SDmpR1IVn|Bqr`<>1T0*HMa+m0e)j4}2=iyu& zC;6e7fS*DtQ3QpK7VGrM*P0aNgSAw?p3BK7WP=Qij!22Wc@vWYHlj)S=}8rfd_Uau z(V2TG?B%kv)rEfQ?ngK3|HSQW6n~NDd3Gm-6*?MH##Q>MSln-RTbiv3odw`D6&{TU z%ZpOiF!h?=WC+T;>=S5CJ4b~_ zNk@mC4(2^~h5?8Py-Ba!9qN^j7aS;gn*h%8|Bx|3*aqzD&48x)U(A0C0|am-c`APG z{NGmyLBwNbjb^!59)yZcjsHYCT=xG5Z}S-O3D7b*@3-Ip$*LvnIE!OYZ%VPj7f2h9 z@(f&S?GE^CuU)wE2q0?yT9;1?1p5Y|aQ;uQ0W5HM-_S}`Vp7DS9H1^P zFMoJE**ZIm`b_NU{jQ#1$Sab80JU^>lBJp9xX^YYONoe`ioC;gHxE=0zWlr!lx`U3 zl5ta?DiE!51~vyI&@bT)=~Nqge5HK`^bH;5`nrn=Z^d&DIO7XdLz`3C3J>ud_(WmJ zo=k}iWc6UD0p5UVX*~Q$>Iuz1p?XK!`-}fft`v6pE9S69@d z3JjUGor1;ArhU;J0}bLh&zt-J*NMbGZTcT*^yrfUzomnN!>-difEUmP8;z&OEyfl| z%fhIvjVs@m{_zV@0|`$fOuO>+ifEShR`#MHgNiN z>%Ln9$sBHAgJhc-bg8UN0( zCPp>Z(b+lag5e)e^)(wt9DRw7681!}B7~U0ujR~Wxjg+6}<)bj5vI9E-*u$d6QKFNaF{9;zLn(U%m1BWy!jDjfyu7 zjSU^EK#BjOI6?9}c;4r-)?ClNw$hQn4u?f9!l?(T7(lDzHJ9m zR_*7>)RX|M#(FR%8dy*GzSIPy3)nj~v!*ImKumMvCo?;*WpFRZZVhrrkQ=_Omt=&t&k8;>RGRIsiC@l z+1%NCdUM~xu<(3+LneM4#rgh3g-ORSqF{s;$JQ2TbgIm;YJrPLu>La@ND+BomCVY| znnx&6T6p*3Hvtd) zjg=gPD=8Kq3!S8la6Xil|H(a~Mx-fd(|{0?h7U5sHOkqb-Hg}26?bfmxLawvzAFhTToYPWfkL-voCLi@YS_E zM`QOaWUNV<%9t(7hN)!c$v5Qav)i61x-7W0rR^F-)R!s7sgLQ;+_|7|WPi=L%^zUDSVB09IR0Lj#W4m@5dX6uG2ioV)p z_0~1VdF-=SP}ZHi5kq3?pk=5chx||NRQxP_srb(Ek5@6vnKPmSZ( z7>3O~-{QVgx5A)b-2)1FiTEP>M%(?{hy39uM6+XFnEK|>1I@LSn3(P&8pB9)CKF31 zC)JAcG;a%y>teeB$bFK#RU}>?;lgXtrGionZG*bL zwxw(<`D7mtNO8W=fi|KSEN7^Onv@==Vqi)2O3!^@+{5ENm6%ZAAZa9fn7R!8W#Pwe zxNGp}=|IwVmRI4wVXU|;O5 zK>{C2Pm+5jB_v{1qAhX<&?Q8I3?r>D)h!kt2=6UzWQr0rJQ91 z9eDWV5FO#ZS95~-@{=E#`R+Br!<}W?Iu$Fl6C!LxBA+prsz{?di}4S5kAN=*GuZAq zPCL~VR9moA3ct+Fops{2Do?6pb?jaE;~w*V8M}oK=H234$YD zGR29%cD&7Rd^ci{xrM>h02mj|m>Yi5(n;W7Opv>W$3`!CtvqD`Ya&(wO}i*ot+(z- zxsx5R+#kg(R%Hk^zuIuocUdaQ?7wKt6J4xoB#r&kP-9KRYHo}u{%|HTXOO|&b}=y9 zn9fFtG3lV$l=6Jb%!nX2K^kt+T}XW`wyYaSUb30U68*0iz*Vs_Sy`}+SzOraf|V*M zj8V+4bq8K#hq$csLCvZK)|xU=#wj#{IcO8ugp2`NL+$3iZN&!GX;J07G{t3-D-=RW z^}I&qgZ!bQcVkAW)w65yyB7%cf{FW0VVW7LYgpauE>w#3W_73~^G`-8w(2=bH*L1! zU0|HbHH$3buA6t=f`)?GIHb-{tTdqY%@={LS$$~AHhq@4b@W+7W7Y1&^0F~|MV4XO zqEb)5u-(~7<%lFTCNk%FnFPhx!rwgDW(c*_U3#zzBPAo1l_?t0O86jcxvw6dwfS4e zFp=sDNt6PvY^Gn8m%~0gNFj9iXQWG!Pg{=s98fcbxN~PoH_1AI=3L1y9*l0aEC(+J z7>pfp9^ZaxjZ<{E7h(#RI$Mq5)Qirc>ohfGjJg>5t!Jf&Tk$>Ha`B@|?K>6fICW5K zrP=dOIojKQrpVc>_?#buy*+}zlViRwUC>j@09}fH5oWe)YO^oBi%n!=tnDUQz_{r< zn-!Rb^maC#8W%aM8n;V&Cm6_;0&3zC$HYl(v}x$gHdu}Fs}|_UfrmZPZ6-V1I-SO`%_Jm=gqn=U?6E}(0Xb2FEb5CUY3am zfA7|L5oEvUTsg0uHmV*DIj>I$8Otvc9XhC5X8m$z#(4<#aQAh2a!_-=?;$Z! z`%}Y3dmdl}LwZbcylu*sz{R8@sh_Swj8*X6Z^X%{YuxHc;)pluIn`q>O9AajKU^lp z6quq%I6b0i*%cL!kX^VqNjgG{L^qIcDUixJ;2GcWkb=GsQ`Gqe z3gMc(b&=W18>ogz2%~Zn*}iyvBlSjGsdCT8K4(ngHv=g~X$*Yr_%Xyqw5q~blQ7=% z_W4hqk$zt7UM=~Orb|Lp-L9Yg$GfF|Oa5+iI|xG*gIQ;$Y(-*q85ducV!HO*cAqG6 zWp*bM+*<3-!Wx*{5Y}qpWY)}=@gNvG6t<=wop)!fiGpb=$IGW=%bJ@0kU5QZuink6 zf*vzn_T{92XqqKMDo8k2Z81^HQy9XkyU@@&XYv~{@FiN1kD6@5%OXRj3W5)(StJRP2J!r73O zoKadrGBQN>(8#g1tct{7PjJIza2gg7k?p^Nm}fE64X^Q9cO11X3Kms@{#<_p?N?M{ zc9+9e>OAmINTkO9f%Esws2w!=>zLggd-MSgBgH%Y?eWgE6xnM^5ky6jA)}rnLQ+!7 z`D_qZ+}yS$`T+|{V`^nUg}!a$bPeTml@o2DUZud0)pw#0;4V0(Uw3tuu+OYLW{M}l zk&N(S5gDj_C}5TQUagxpyqnrcHg#7qk1hFCZVXqx?%B3(F|xy4ixVY$j8sJSC+xv+ z!(uRN+dh*_D0Y(iM<#+z^I_i*kvxy`${z(}2Xg6-_efVCgXBrVhM#cvF-tarWG|)^ z>#s@HFGcUEkwyzOa1PLx>pZlRD}d3Y{P!V^&M@XBS!)1hM!J^yiWR%j9)34#*NkJ{ z%vt2e+}&rFJFK<>wn+Z{wJ}Juokznl*3c8pT3%wQV4_X9MwbLrhigr(7Z9M^B?U_C*1J9#EAu-)6=%`m*eas&iExUHwu}2ok}1cU%QRB^3>D=$6am?k0di; z_o`z59yc(7%Unz&VVLv%W1VqmdLR{(LbbCIe2z+~L*>dIUyhU(YAPQ_l^W+=(vilr z-p(lidP!5mDx&Kq4=|YEhXLwZFQ*bL-r^VSa7%I-A=MJQGDw4VrJmo?X`3~CEC@ZE zdp$qPak>Sm)(b3i*p11oF+{liSIY(~{A%4D|MbL(bGfRT%bJx~4BM1Pcx=5BFOW%>IZki5MOGJ?}|T-bBq0&bc8 zNq+gOBkC?|Il=P(XsJA~Xj~Ghvwpv(ysLIo+{`r?&i{O3MtTuqElU!4TYTN4!D(9Bz-7_E0~=R38~zZc6j>Ux%g@hH192)rAh*@TDDE>f9a9tr zA(I>Xy!ADmKXI%W@$ERbOp5JOQ2|d8D6f$}p{y(omcsoO?LUjCD~`TPdpAu*UoPTc zcFXm;B>mjEB#ZU2-Zdow`JU9M^_|h(i*JM3dUH*Fwukz;e@jRRdnE^TlkM{HAE2#< zX7`NkV-kB7#sb+e_m=K|%ZIKyI7mUnQ*MB0`cI++G{OFc6F~C6npjynY5E`45>Wb{ z2ba`Tf&bh11FY7>e}swuQ2={WA0keGzy7N?>RUgQc5!jR+06r%cRjBFP)6N<@5(>? zf7Bu2eGWjXV*8J~3h23JDXObJmtXzZivNTI-b>ON*$6DNkbazO*wTZujK zd(HH^Yk7^@I}Bmoh>HOfn_|4%_r#_^BxkHhKg=vuS^Qb0ul#NS<+cU;qorm(V3 zB>C+4_;|`$0TqmN<>fXM6`gf^@;OTkod9*K$IXq6w|kre33Dv5_#o!N&n>PyTH-Zh ztH%aFr-Ii%#tBeH@b~KJ$<;B5W=W+n5A}CPM@K|Jk9{)zv-qW^BdKX)xCB;++l-aS z$Lt)EF|0z2gNsWu8pzM6aj@wh0-(#|IqyZ0M5p1Sc})--fIW^>C1IDU5c5fC5l>SH2MO_0o%-Z3BD_2`JGecVuq-37?$Lq2$z%mFB-O5G!MeQIPKp zcL*2@OvM+rd{569Kz&!@fY(>zJl|P<^~uJ+JMAA&(s?r zbjqa-y4N}px^o3{N-04`5VN1zmtGg79Vknp2ZbpXCNW!;r`K1}ZL-sZt!7sCvby&t z;n0nyj(meV@KO7(*yswMGk)oEH|#`z{cr?Lp9rY6ddBuKbI3!T<>xLcJ-mO><0XZ$ zX0g~S^l&=`O06hI^u@0^w8rx&&*x&BtqCHX9Aw`B&t;RpotT_o;o6Dtj@AV~Ak`0FbaFZ!`Lv5?5_MZ?|4nJioqHEMP#(Sz63PMEB$`L4%47;Y; zX#E1DZ`tGiA!#=zLCL#s78fhu52UG$J&>Cg>PnQK`rtV@IVCFp)2w%QrNvzGzGAG~ zoevAd-kbid$c5PqmU_nA1nkoSXQ{-Rsc@h>`9%ev`T6-L$>l5w6D6W{$ok{9O8|ze z8GodfBPKx|)Fj)|)`m?g9;+EFJ#u@n7!vq_p~WW%X!zT3fK{+zcraC7xfDQsGfkN{SilCOPnDuNHpe}z*;2uPx*x%b#G8+dv`>;+M(k& zxeHTbo0? zS1-ds*pmB~4}GzMtmb0vZHn_!EOd)_PV#Z#myAurlKxM}bdk=`@sfF(1Hr5x?Xn;q z?XN~E$FwT-_kW9f8ArtRk}PJEu+A72P7|A1K8G{oHJt0#`oc>ooDV?x;Z4oogAni*f;~Ggn>tQYCgU(Z|`vl%b~2lLlR=o~zCuxIN0xh4ZaAz3?)uGUJ@r zgGSxVn?yZJ@4~1xy(tqkm5(pUgKcfL>rJ(+a1(5XSa(S(5FDL2Az@4zk-w1+D&1$h zY<3>=4n3#RBFmA3cU*+H2PPwa5LDeWRtlUsTYAJlpA98>+$sR7$N6}wZtkfAJh*Dd zULPro+SEwZA9n5hzcT5^^fJTuY7JVC@$$Y_PK_@+`Z}8!sg3Nir>1-Dm(J^;t#D|? ztp#{QF*>tzU+u#w8G)=C_9$TWp4i^UabR{b|T)jaX2zC)lTMT~iD z*C{Fg8Bx@%{SJ`@NSgN{fx;FNzf+P2u-AW%+#HzO;{oG4Wx+wPMR1AXNNU#FBVa0Pym3cps<8=hltA4nZ=BIk@R4qW-HtmJYv zj7}keHrFM4;G!oRbLz&IoRQvw_iZq8)R&vAvyks*&|!vr&48zgDjiL_1WY@X2O_yG64`dV=614~%x375Du$z1y%R-9f*RGNAWS6KlX2@K ze^C@hWA<>{;D@x5u%#bLA6dU$0eleCH&wqyD_o}}#h%~{k#7Z~pJpsY{m>UnCMz4v zr%Q1mj+}?T3Z7R(ToEy%YSgGu*T+2I2t4?+%^UIMEmFpEOhT6b;qr|(eDidgMj(U3 zljKdy6eRA(!W9>jtNdGb0UuHY!zbFp$JEXtD9k+P=sjs*^t&|Xgm3>zHqQtzj@fFT zvP7Qp>>&~FY9qtbCsKxhhjVDrBA-^t!eVQ0Sm)v*L?G!&`I_ZC}T>mH|`D; z30Wd~n=vPwfed3-ty|Khkr3#xPMxp0aOccLFAY$zW+8{G2_TI?vNAM~Jv48JE4eVW zh=s=T$Lmd;d_H>VcmJl8x@lb&UZ-vjN>H-%DV;dM=1{WiQRPj`=(WdOoyb2O#ta%@ z%vr)*%oPj&;$U_dajsA%qBTNail)r4@h3N5Is>Y(>4(JFAFGIy!tA6M4iafVY{OP7Yh-u!s{ylN=Y~Bp4U> zT)y);7?+Lam4GP`0lX>s>s0>--nk}13VN`%`92M*a}p62u#&CAy##)8(16f1@AmUV z;=JKqEU%+7s24C<>h5_tIb)x z5XiNp6843OA%eeo>S} zKX{A4&gZ8lAb)3LWii0QnP5zSU2+8Bg@YVlEsA7ZV{69*y`_D)y#g~qW!$@Ue?YBIy9EJ5;P*~LUBII)LCk?)FpFBCmBlKryk z-!sJ9CewN-b?RhF0@^uyKV(&>s(g`HzkYBMwqAefG5!dZQrM9;yWjL>cCu*m_vV08 z`(@taS4?L-o*K7ivDITyBqu?wGF)4>6XJKO&oK_h0svEs+GZ>=gwBvX?^IQPQo&4n z?LN2!d_jTn%@lG$y{0R+@wFNib>Hp;;~fm&^Sfb>1Y7i@8tFm^`4nVqcdv)1y~pK& z+VL4=NWcF?>cv}fEDFTb5TXePKraCI4Hwl2;Fvw@VVU)Ba27k#rWX z^cp+HDBPTV(MrA5r@~EstPKr1NMTO2P*%7?q@xm5aujRhx#O}t=cUO|MO#fq>dJ)= zDY&gDl~a~v%8+BiK2jRRR)X?XPrRz=pG(hkTPA z-SP{@lX8KNjv1#VNfW})PH!4h--h^+K`@FJ(8jr0*P`@+NUcIv5nGQx8`SAks>=_* zd-@2=cuT~iY!S0EC{{QSXKzW@sM85yh(S8muttDRO_zHG5kt~9>`&=wFqZ*RWHP}F@evPaOu_R=Y3Vb3l$%+P0NJv*A;x*UjiwB! z+ysBe#>qejs!cHsvun;yA<@c=PzYYkv$cc@vu)#1u|xN7t$x%*sW1BEQj6-0UqJ49 z=%`<%!)w4z5)~=Wd>j+F!jgCB|H^-))+C*e;eRI;<}r)|DrnP2pSbKa7WKm3wA#^xlanf1OeU9**W9+prFwUiSRg0{(xKG@n$_dNr{ zj~b~F6ldzJ5~+UMurpeqfA1N2!s3p#SQ^bJQ=jQ1C@EmHWs>vK=0AHkhff~4=n4qa zlADuIGFH9Fag`%0Nqf>vpJMyfHRP9}qmlYrd#wZ(GrfoU>l__kPj>%3?bpl zy5 z0+L#MPOU_vRq%uXV9j&251SnG1$Fj>Ap6oUfdORd--A6Up-(($?aH^CQCohJOowM+ zg6CU^Iv=3>Cl&L?I)&!^DIgr1)@0X-!0kvNqFEHn#h}8GC{5ek zj(i*C!=N3glWPm{`?3RM1rVY)eMKUv0pfya+7cw@iEde82evCLHbhC(A_c7VOA{t3SCGTVx z{#a89(k*8#l$#Wd$|GPPO|CeJ`eoB*#xC~(*O3!=+*G?W2|Ci1{W_-Xke0YuHfx> zp5nJ~Gjg&wF;5I_EUqeVFpJLLaiq#)`m|Uq889aGwXwFYTbTj-!RLy|mobPnqB;T| zHM-c@0-KW}3H36FG{|t4UVPj(-8AK(l_#q=6y86}THes~1>a@3TG(VqZtcjkf5$lF8)dobPY!Y(Mm7)ngOdzv+!KDa7B&8ry>cDR!WRSRdIW~nK5r?@L zHD>D2iH4&Gt{Xwh1qz$dGA{G#wFvzIExr8iBb6>JAo-gQqasd-KBV{c#AU>}ZZ~}& z%wq9bnGS+iuV0Ly4NssZ;rWUB-?;Q;`~EBk0?BJ&%;V>T4}(*Lu;Z@W+#`zgQCkiNkuI0a{5B8$0zjOj{aHjz#{ zl*^Q1Ozql)v~ygGE2HoU{p5|e+fZ=i|H}LVZ(`qVJ$esFrTJgM?ti?G{{rfZ_C-Kk znVvHo@bZ1_1vC1GwH4fswkzUdSEJ;4#n95z_|M-4c)IQr|0yH?>4^X5MNN`cX+V7Y zw?qHjmD@e8>PE-i`=mvm01MLZbfJWQ-nc2{CjvwMW8jXO{I@B9d?nHG0lG_p0^bIr zy5#TXB#b~0sTFLb?4I~vQWh{@)Pz2O!H+@6>8*7msr^q)1U|A4J;Ybxe1Z>|{4;M@ zNJeI6p=mg|R{R+Dz6rxe%X)LU*QTB!+W=7*z2Ru`G9Ir_Hr2&D(CvKDkQ?>yyUDvQ zXOzA%pMSDLijM$L!cW1+Fgv)8&M)gh8|MBo(c82hUz=YxEED-4cqnjFAoYQs>&9*D zw^40Ko0CYo_njJFyD z8kvp8tOCqAG@z4Yg-=Jqh~vYdg@^4tjKFshK7$$jkEfIu^s)=q)7%Gq%_M@)s>4n? zkJD3A6%Aq6@Brmjnqfw|(TrXMZ}}Fd6nyNvX|Rg^aW_@dgKEa{!$T8Lxa2MQnW)kK z#KLglOJW0Q>7>;81JIw-yw}s$S+l67`aka0&mb@ zCope-#5fn1I+2sTy zpo9@02NVg%p8)!v1$bA1WWDg@YN)WiadaCY2szHZN`>$<{1H&3MBX@6TXUELgslIY z+b`haU9q&Np={Dp9)&a@tdeg90{@&xj5Uk^Zk20PCkgMnVA} zkdQHWnZL;b4&`1|X=6@a!|fM(DMKRjM_~Be5lIT@gTwbVB(KJk8IIwdsQ&M^v+WOC zDwG;y(s4BIgJhxcuN>fXGP1MlPqaLL>LvUFpkPAIc^1aS5i#Ja?8rReGKO^~$787p zMbvY2>T2vD!QG2pS;HRUWB?NeK@!_H!IRltkLI?@a0$h#ulV)9;T+*W3Eqmf5Hao? zcI@QcBe=fA=8%(IiD%Y0TwF9rMLyoy{a3?t?Ub%I{Q7XQ`I20h4?*_yca2+Xk0Y)M zW*Rvnh_i2FVBt*5Z`9TSC0O;Uir?V-#>$8kCb{`{58{C@ZeL$ykD#(!9GGd^H8)h1$aD$gQiP)RgwBB|CVPH+uCHbv zM91!DZ!XCrPp-V?lx`i=T=S)9yGXEtozlC%HlK^~kgeRNF{RT9f1qVimMQy8`8ZS5 zE^z*U^7}j7J+pi0*2enieE!EH(i&_;UtdY(^!l*?;?&)d^P5uf`*3{=AKh);pV)4b zy{-_)oNMQVEku*YsYTi5(obdF5#GI91Ird~DiOCAqks7W6`b!yj7S=sx+2$t;lKks zS{F_F@fvSu6DyZy?%kEykanApf54cYa8sy5+0m87sk}Dyl{=r8NS?Ig%Z~XSl>LI@ z&Fk9Ysu+#NWVPPlQi7#e;&J8LuVcb*KK&}RwCXMlNn*07z`a;0t8nhQFJL}e*E9b||D;Nu9KEP4R`y&Vcy)|Q0Q|+!#^WYpS%+&b=mn##ih(3eA_3imE zJA^I$z+LKD%LRtD26B-6Wet7!X58M>Q|8Yr1LO;5*`N+&r-c=^wmgf@@;h~b{kDJ{ z327s1wyi(fQMc8f2%FAdN{ecG9?uNQacRlm-RA=f?@bR>od>i-*Fye1BHxq_f1TZO zt4ey8(wrhz!qY4mmcxzK!jtL{QSm-KoNIl@8y=-}(E|m<-%nZ%@b#_P=>~F}aG~0G zt=P{ru@Iu;d0DXZ7~)-raLhBb?0RQxR|02j$uhZM5hxV6=w#UyhqU)(&C=(jEX~Y) znpYwwqlWcuxf^6x=JQ=zDY7KlUV)C!^?O(0S5$G#6-^mKwoNoW#H-xzy+Rq$UvDDqmP+~bU|KHY0|H4!%2GpV(55)o#muLB?fh>(SnQ>^@7^m0tH^U zF8y4PB}5dTDKz=yve^{EZ_D_?9xO!ki;eXTL0h7z56uD_h*DNd$Wv$Et)M>>7j2PR zCAvS4i<&eTS6;jkydnLUsAwLJ=C)Z+rGQ^E95Gqpgxnga(d=6-SWgy9t&T$GpL$_rY2BuA6iLDXK= zK+}+&6g;&)MUAHhtCiH^MyRXG_gM(o_imFdNB`R2$JDkY;>XD838R1ZAt)3HNq7fE zw)ZO@>NpSE8F$@kf`oTRw(CfeuHNfKJjj_NV01D`ThjZv0V+}j4w=1FbLA34qS0Vt z-Iu3Mv43zq3^#3i(iKzU|6}SbfZBS#c;6OxDDGN{774+nxD+S2YjAh>;!>m#+#$F- z6sK5mcZz#)?Mr|EH*eky69#6Jz1e%t-rdiB&pGOf<-QV`vRQcVNa2+bFyGW(b@V!^ zOWkh);o?IN4TsZ>KHBCs&RLv_M(qrPmnn}CX@+eO=1P8Xk^SnlKbFR*3NK28i=T^l z29D_L$X6_>EzJ$*gPfy80Z_jL%1O+V!*YbQQ9!T&weN5z^rBC5nbtj|^0fw>C_Mj$ zrs3J2IFA@EMW^EOmN&1}lIQEl6$(b7vd=gc)JgvH(AHZa>ptDSZ1_{S{)^nOHBq~S zh@Jz)eo4>iRonhroAYQT@}h(^-MP228?6aMr_|xshiD@Z=9?JQ=^p2akC~5Q`TX`; zfpE&jUD7@2M3j7AfyieuLjGnDj$imWWrMSerrSR_i`5^FS*hMa8gE#}q&CPeDp)_V zP(Ualg9?C_E{1Up#uqMH(O)Jv*d1n|F-B>ElqM#!hBr3O^yaS06aDz3<+(uGl8TZ* zaas`D5MO~Reb|Aw^7<5u;ILE!G`}?Yqplf6n}X(q33OVqZFO7z7N!& zy5mNI3P{z}SNYxM%aH{Ht=$&&YJq!slElqjCZuCOrz`S^W%q+dtd-zl!<2dv;`1?Q z(tuVqRJr|O>v*$o_7M4{5HbRh@fYUGaxY*UUfV-Gk{;d@~Hb+ffUAt}X>T12Rp6><&;u&F7N_ZTVqdg^oRcgBb_P zf?2ar1>Lq(fO?XnSPyXY*t-Pry_HU)^%ct>b-z|&@*;un6gNKje}K!gkn6|CWjJ(0 zc#v~xq)O&e4dmYI9(7hsmEFd|>02o#lG+5<890q#IT8)eV%dXEUHXq`kpcDu9=sCz zEmIAbfv%&1yW75wU)aPq@~9fOLJoz-^-6ET6+COY(#me!+S|f5*IJRP=obhe@w?p* z8;(I23Y9@^o?59Q1zIo^N>jdQ?QZ*6p7}GlfgdSOL(Wp`I#;e7v6eUJhedQ`^6`O9 zDZMpgs3SulyRonedKsSO=kGyeI4U5UgRmE2Z*esGH51cL7Sr;*Ti(<1c!Sk|c-rk0t1)~IH_ zkGa5|J;#_y_RA_<-{?&u_y2SgF8PQ7aaAspS4nx-mgLveRdY0JJrAutQ|$Salzyg{ zDQlIlTMM;hE*u}P6jQ#d=dFde{u%UxqvOS1hfTxH1?U_1a&qfPzj6o4pd$$3KA(x4 z?`M==Bt2hVo^bvxeGBpY1J*16a~#zwPIzi`++#PTBusby?Bmfp~j%>%t7p9|8kxJ4-a?5FI>|qWr7ZJEpNUG&0YDn{BH&0 zu=PL`XDY~|YxCPrffb3$8hHcRv0qjMq?q1a`poJfNZax}%|Wtb$A8n_E;T+WnIeP9 z`j<;^$t8*>M(r`XUUjhr&Dq11H2c{Vbmx16YcJk39uv17i*lK3`^O+N=>ovuDX$HEk^$<2*~~aKSaE2svtA@AKVYc7 zpuLMnH!x98kKcB6z&le7cP=uo%g+p4bPf_A`^*8%d3KM^prkfg()!zo#d<&fE&}(6 zKA!o+%~~My9UV+nsN;1Uv&ONZ62N7-yv>+m9dO#jx$C1Qm5C;k&0gT%m3pPrLqWoq zAgt8FxLkqTzpY)l6K79JCWl5WQOMcgVvS!ImDHybQY&`pNK3XeP2R6x-85M z13`O0Myo(6(m`FN6{Ii|wK%p=DKHr7#lmFGVjcUT%ene(4uQ_0%6yR?s9MD>ELUbB z(MjXdF*b9S>{@CqQx{#7mW>l`Fg9G?!!@b!@xYO_&Y6vNrNB;BgXchUryb)DyZ$d! z3fSE9D=2~oCc)1h&pwPHR@VexTSn)?xv!Uf+4Q`J0eUSP*2Lwqjl2ZUpjzBbSe>!O zZERg`;#1@}sIjOa;PLkHxu5m&r)YO8q*sCOOB{Y@5#mBa_<&v9kqh1t`Qu71ChHd-YUDwU}HtKWa&}N__!f@~J1m zQORJsH8!ZoD5vLf{W2Kzh0~3u_S3jZ6K@hyWO!<2qSSl7I<9(-7@B47+%PetecQwo zayiS-8Hp9mQa$1>#jqU{yg62|K*(?`B(8))YF{i`5G7$IKRY*&8W*@idSvG z)B7g@SoKDlt@5aCPEpzle%O2x!(KKu>F`LGQiYn_GvS(X3<6Mr9y;@CU^gn_a<1Xs zj9i>F=7C zmzv5f6hc5B8sQY9knRNe~UVU9+z;(H|s|F4>nJyh*q%U(#XjE^TRRF*=~5 zd*z+Wh}g7j$F}WFR_F@Z;E1F6o^CN4w)n%#%f;~5d#mZs$6z3Vyh3L$Pt-M ziL%xP=U(={D$Wzm*)!Z&Kkh^PwVRZh@iY=Kvx|#JjFtSZ`UE?on97rEg@^}-CY`C) z=CQ-F&iSTBg(u?5xZ`Mm5vryO98K|_x&9-V4lW!i&0U$Ew( zI6n3EZw5mGlV@wAmNzN*W(EcZ7`JAFsTTXvCp?vu|oj} zqOgBr3))Ov?~Z=Y%p`;T0WZoslh&(yPl6o$k+5u~^0>gbF!Z5R4kU z*>!n1Q*t5?qYb_3uou{m|Jw;yH@6$3-M!}{H)G$~4`0b2hmS>2d5^#Lk%$VNzewmA z8dm=*5yWA7h5?*&r6cy(rh%XpN@3r{qcfk%KjgW8B+~K!eFvI}evVnJdS3FefATSS z;rr{uq=>NiK!Q$eEYH8MLLwU-UgD*s9}Z?Jf2oF@Z*((%-w61-hUAn(E{yn$xu1Hj zM8-=s+3c`k$)Nb#Uc0>P;VyBK-i=w`vC80r`p7in>B6gVY}f>dImZdx2n+kUG8WY5 z*pU9~Tz8^Bs!G!GkuACO!PF&j09Kuk5%2F28riX4dE$F6Kzp~l=iS+wpJQ>r-r`s*l?+_HGvtHSnr}Q4@!^`ds+w1;5zOfvXJccVqq0tQ ze>pmWew(_*{Rbc7Spz4%iu_;~Pq9Mw7*RL<+>R+Dq<&7ea?3E0JY4(l#%2J7(lR4~ zkztPLNCV%vF^mf8fD_j@#|sV{U5sTg8npJcYX=tY&S~UJyT_5OUp>v8!}wd?{;J!) zmiuaXDW1)sL%FUJ9d?H-?a-{sCB>4R@xb}JLyy^t+g8}2;`?$xDDT4CLtLatUt_KJ}3e|GKitfP$z*bCHspKdF=pSY_xQacrxU(HEPx13l(#>uo^oxTrs zszHgLKxNbZd`XlGP2W)E( zL+EG|JkInG^WXAq+pDlrnxLkBn4`gH9zS}eR4OqQ&Xl*++Ymln>%^=~t0Tm@iv?~1 zPH2IKbjrh8yNAhp7?%&jr8>=3ZGvjVwY}pJI}h2t=?&Cpj2|#i?tG+DrCbJc?FM~b zjRn{NRc<I|J^X(F!MA7Pn`~(7$ygs>Ew+jr%BG@ zHg6SZy-Tr0jS}kc9JYXpfH%gWN_~CRa;*wc(;Ql~1+gFU*^l(=)&xM7r8~ht-!q=L ze#5;fA!zb|Lpw!C!2Tt>%kOD0m)P1P3B@02r+;M>Oi@BVw1j=w zp{XRL3VSx!EoYqyJBqfAoD?Pi9zKbRqS*+x7FONm!-hE(kA)2m+kedUe#fsgyn zOQn-#J$H)x3sfVB8CNn3o-6jm>0bHna3ZU5#rx)h)9ZOOup~JrZeGu4uQUgtGxDQ1 zrsU#t`DprC3V_<8W?W7;$aZwBt*Wf!bmwNf)Bj}|hh;@>PfKpUu}a9=&CIGq200UI zKM_!7p!3ZNTs@v_`1|k#m+K@HnDVI<)8ur2jaThUo;y;MW|G()r}Yvem;__)7wM(( zZ+QaUCbC1cGag0`fIqqev2jt;EzwL=JKBk%SHN3t<6m6l=Rh`KSJjC3wNXo}`sVxs zB@!m-4eh&3;YFDcihhAS)+E~IKw=jcandL(EMG><;Gg@#`8(^zo-3JC)wi@;E;}+a zlgozOIDU=wC6?TSSern6LDdP@jmvapbi2!MDgf18%Ex@!rq>4hs-iyc0D{h+AT)9L z0$828I0q6y1@!RGlT*M@{%}uHhyO9fvUEU}XK<|QPAM_H-UlrdY;$oeUhAHYCg4Qj zqkZIMap)jq}~abw&)^AC%GR@!g~ECgRX|KF||XPd9}6>z2`0 zy)iTX^(OqXC3I%MPQU}NM}6tK<)}PW#Tw}QeWaqBXiS&+(tD{&m~uVv(2Yn)>^4H^ zgmxOWELzS*=RHPENZ2Zg7_ToG5ZY{(z!dnZlX>r2^H_=MxSL8|C8n!AD;twzHnOE( z5^9G=1BRecT))oxu?}{hviU9RZzSbaksl6dwadU%T&Tpi zLp*sjD2SnPs44x7-`sD} zU|BD@#w>q5oK^-+E3lV&h-wmGr~?%+FE{I5S@ig1M(#QchY33k;+i~|V#48taSPrA zZk0q?hL*O1Wai?u@C6s4KRE<4eG2MuXk*z*ZPHb*BUOEV>&}$@qS+E^2xnkKV_7InoRpybOD`52EP~k}Yy;2zhx&uqh0IQlwiOvP` zYT}$^*wQ(orNVI!LtPy1?GeE`dq->7LLSgcSwY)Un?-vnR>NY3vpOssja|Kg+98kv z7}Fky5NX@wdL8Cmm0QO9IU#w8-#I@H!JVw@hqL2tK^uGylXAyx?GN$ z!N=Ls5RsGDOYy}@cNMlZ9p+^TZEFT+vukU{0WX(w*_5&rJ?{i50p638+%uIWso3{* zAC8Tsvv$T$Ii!7flbrJ&3&!V{9~J^L?6vV)-l*e_-)X#tL>cXI%VnIVPMt~sN{lavep@kIK3f=>c>T@0PSsC(Da5{%d-gSM3Hx(uA3{|mi{xCvN$LIX7-Vm6TBlZ~|UaG9>#&*ZUCZ7xanA#C( zFb$m3u8Dv^o7dBux~cPqLreGR#_kFDZ_v?rH?ERnJ!sq^X0ADun5|8a`P)QGN?B#C z`$7)W{ZU~+^~j8d&GLR(ckSs|Pm;karJ&U;p;BYIV{x&+78f)fD zwzD^-q5gCefl;|i#f9@~RApcTQ;Gu0F)ET~?l?#6^z?z~@o}6_FMeG3tXq94>kf7I z4VP&VEbUZsjk=e0q=-dOZK7R$T7u0QHMZ{6$9|d9Kp|Z6pj+SagnMpo!U3VIs=BP+ zbSbaJd2IyfyU@nR(>N#b`5Cm|x;fDg-OGHF!bj0k^De=^tB2FmQg|1)wzu>70uXva z-Y$@$jZwZKn9{tu(xCG(RdBM6`{*t0U1!0%WMw)O{FO9W1`P&P6>0H~!unYdR!*9PQcW2t=hXV0E<*jAJcuUpozJ zHsN)};x3lsbVJJ^w&etFDj@u(XJ~~<21)$+ceH$+V0A8}b&}&7Ek4|7(GLTJaz*C^ z0-c_hCglmN?%^4P=QWiHl`UOoi2!P&zUgjzX9l{nKJ~hTA59*6^1tt2U!GnvQLe6z zd^aa5364Mg?&Wc}4T4=}GJpf2U?c-@pRmj;GOD@a52d}-kbMTt)?jhSp^MkdK<4Xt$WixC+c^3 zyBS|Lxq_d$q?Q?umpQen2p7Jx%}HkA#@0xEEE`NOb!N_xbh5#*!WeO@C%3g4Plsag z3h91;H0e@eU4#QpR}*G=4oct0ITuS1-{bS)5`1?%n*9Wy1Rgp`-wwD#L7FZlfGoo= zF7X$m_x!)S0FQX786JV*U4ME3scf(1h_{n=ar-Jg^Wc8ZteDd8!h9X`XDvh9FRWzr zW>`|?gHz&9_Ldo~Z9y)|NiUZEqoxGN6pn3sY`UW+^kczOwtoZ*BdJ~ak^Wea+}Y+t z?KszMSwvb7_Ikh#4372MpSoQVX<}-2NV@S4rx#CU`c3|!c@MAR0EJ`3K zzaTWP`bxa|Tr*%mDuA0)MlTcd{zD@`ZH6b&ST#-tVm?b4a zOxd%Ad}}z9rTj3@CcY(&z??UBb6H|W*^f5?rD_uA$JoV3?|_X_u``C|&IdGhz<3u8 zn^IVIz%XPCbAr>5>G2Ov`)vs+!MQgf%%;lS7dhsFMkO0nNjurr6fwU-9f$o!ehFQs zH}THYb^+~W-P(5ici~eUi{WU-t*;@%$iYbdZ!`FR!19IWRMwZ46B?&Wy?Yz4?WzBu z;7}U|fnBhVRzk&)%2~xV-kTe2tGFoYRC#>#TCxFqDt4^0vaX%C!PF zb@)BGFYDQVy(tqYzBw%={#sIZ<6)YRSrJC#_V+Elna6e1(+2&vQKr0HHv^cT36nQ9 zGSYQ(dh^CWa}#Ha}WXG1Fs^9&IQ?-9%BLT3|Qaxy1M!B zv6p12m0+yoeVboQ(nr>#5Z5D3s$1JZLW*~9k&1h zN-;84RNAWCu;>06>gMU8)!&#XN1~NwU_Pe(rI7l+x3*2^ZiVFScSi9}Uy~?Z4CHv# zVEjmMlQg551%_`j8Igm5(4W@-7!r(>_mHs~sQiOWbbK@8mBfdg6qE$;-Mo(CX#e)4 zo`3!|f07!Dg7KjLkN<=|nY+6DhoM3NmDr>gR4oqAFLxUy|J%sI8g737Y=Qyn;Xhgh z>qhj##*rSgWx^IlsJ_DT`RO_=wR@aT!mJC+%5q3dVGxeLWJcTeua^Fo^lZoQs;zUvi9B-36 zW#fiZTiPJ3Ht3vw@y4!AcuZt|%tTy$zqW-K9epjS>8ZCnWynM)qJA%TpScDL6`L7_ zec>Lqk@N;^>md1zYy^k(jt7`T%v0Z1_S6;?f!6A+&-IB)X5>@(qf%&0jD#Nq^K4IJ z7@pO|BU+~wJ)&pqx6H_|D5lE_P6f6NJEML?80w?SJgohEBHFOIy}b=v169Oq{rU4J zUYE-y6P8mECk%^H_&`($rdRPZd7F&WzkRyWoHC-7vd03Fk&w7?ikS7MlydbNH`T{Jf;Y8vK93Up9q=w?T*JTO=qAnYzO2_RG^<#hnEmOcy3$9js_g zM;yyQ1RDkKm&Y5>Uv&pHV-}9O4{D|=3Kjr-Vb;L93Mcv=AoN3F*QcLpXgu=L??(Dz zyZXNA!En_7tg1IXdm3VfN;CcDV;~Kci^C|1jc&9^B)d{J6I|;e&h&NS zCB?T}hJIyAQ^-4QaSmCX50I8mizpba|Cu?=Hx9kttdTK4KHZ(;yrW(t?!yF@{UQL@ zOaCg=n#82@=Japr8jAk>aR;QSmd_J`$!^Yy~niJCm$YZOJ4dj^EN=a zF^yDR4jzqzcp8J@yyc&DQGwe42^M^4

WCumIe|Gb4@09Du^h9t&x?*WpBMtNh_n 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 literal 0 HcmV?d00001 diff --git a/images/快重传示意图.png b/images/快重传示意图.png new file mode 100644 index 0000000000000000000000000000000000000000..0acf61448bf00ec81107457c358feb1d9df1cedf GIT binary patch literal 29416 zcmaI7WmHt}7dDIn(jiJnNerMg(g;Yy(A_27;m|1{B@8hm(v9@cAt0p)(lB(Vz|ctd zd-(mIXT2ZZwcZab;&9IFd*A!MuD!3lPqezKJOM5xE*csd0a!ss6AkTgEE?LQKGLqUpvwN9hALfOo!do$9hnoAEo)z`k z;HWZt?{|G89l+IA&0xz?P)boQdA3=hxnbv(bMPf=c(WBf!Op9!W#Zi?2CIN{3l zvgv%bpqeBxh9ogH(_#S*@V8Jp5DoAvhNOZB@H4g)^1rK}3c~(BmqHUf9&Y?Um$1QD z|L~}k6OKpM2FQS*5 z7yhPH^(0hPeE1r*@ZS=aYYum&xZKwl78dT~6Yl?2&|TeJ99agh0k?Tp7r14QLPwf> zlF^SmNE7cj@Ix2%MDd~l4x@9!d$saf*x0xm|_z99xD_ky1n z6Kj;atmNP>1>chA*_w=HWA%G?h2e$x%@(O;Ux^0<2e+Rsa+$U1zt3l~sWq!5qr^1r ze*&yRh#DO8nh67f2F6QkzuV;|cCO}^=B&g$=5cXx@d#{_sv>6JO@lW!Hg3y063}_9 zou1ae@Xn8GmR%wQ_O0srh1-YgCi2%F-_}WbCtICHUk&t#oBTPlzci2GWSy)ljLamD zo8UEgBj9tspDAlgV{BrgVk+?QlaJV|7H+@*9~!%>F~0Fv&G&cL2XdXS5@k0>p@8St zoUQ4c-D2HmK3*g)G+nIq#5Zg5qJVw*#}O(F(>+&D);iZZKvs*yUdfhkt;1VVg5m6Y+Ds&Gsgtba0jfk@fBB1W7(HL-j#zCXp zbNe~L6xVjg3~)?+*%X3$GG@EkILE>>uvNm=qx1CiG+WE9_aVN|9vkNZL0U4S$ncnj ziEqn_5yA&DQCnPC;FzJQs|sab9Qdu1gY&qf4F~2Sc7L=cPkle`?6F*76 zB6j6?ssBzVE)L5?j|B2H{=sSdQRy0vF^E0LH($huGecMq;M{##O4An4o(eB5pR=3L zM_uJ7n)r;@)Q$%dW@R$)*fl%32}{q>++`X%=4SSBCfXnOm}MJ&TKrx|kQ=Be4M6rU^h+3b;pV&p%oYLZp$esP+^%d}SFTO2{mXj2~0}{<)E_!7;!!gsWy2AQ2!zN`gz7JK&Nx+Uo zV9s2iwyU9wQTv%bZy&7V;+s;4t*DLPpt;d^v)KP7jIub(@~pfyWj;snd!7X$Me?kZAYm zQhRXE!PqfjuYl+&u|5?gnGx?%;Pu&Fe=?Vib!bH1r<=8Q3F@hk5<|7RMCZ(4PlE8S zy0(sb$JD2ij$TUrMBXHXC@j(_(5TDHAmw~l^CJ#qV-fl=r9?B0T z{n$#uGa1Clx3jn{j0@KL3vwB04UgOI(CjEF4>MQILx2#Tx!0i2*@gGZqR?lM%FJ%Q z56&0|rulbuLZW8GFv8Hx=-229yFN`eYGd;Sy3{ytXYfK*z?7HzY@+4QSx}RP8FH|o zE1E+WYA)qQHD;@_)TyxlpqQJ!-C-sYe=s73GsOt|vt#RUo};+|2Z3i>T8v)QkEK?B z!6wXFdlJNd5bxGt&ijprqif;Cu^bJYP-#k8Su2a0&*s4n*wV)}#!-P;I^2u^+yKvWsBv?HKz{Kn<U}dS~k4SsS>94l{ zCLpWbe%i`;dwYHUwN@J0$t2P0jcBq4Vw{safq`N7U3(|(aRHwb?Cx|Y`8GH430bqe zG|~q$(RG^VEU+oSWS^8DqhtQ>9FqkrR_Z@9Qz9r-zucVc3OM&{sbz~tGdp_CWfi1H zKPfc(IhMdz9?N}u!0YjGx9us|NX+y|{!yWGN@iH^Ic})lBfQl*X#n(@KX#JWl*g^8 zmN&Y%y0W7ATrMzXn*3znSlCUiX~$BueUSHIF= zw1hXCjV}QHN{Im3s1TC{S8uK!e6(N#D_xL{8uG+p$JvR$>J(=&YY+N;t#om7SsQ*G zQE=3n#c1yk(`@v;y}gkorLRr_S~MfI_00||qure~|3;kHi1^2+0!A>f-R6d|E)1XP z^y9sgQ?*7YcKmqE))IeXq6>dlM4nAo@T0(#``L^r6@s3w8iM3949MjNhN+foPQ(++ zZ&y~uU+L^}Fe^lYXMqU7cy=;5?HW_|qv&m_Aui#VH3^@qtLyJVxMZit44uCIGqLAv z?lGfk?dJt$|57J@S=kqtdoKzF-$#6<3%=|2QuM4RZ7i$5=T!JtvHbeIBtS{rI42!< zuT^Ck#vhRgOfF1xE3TFgF)qXOr1L-DDgG zdWiV1ub*PQcLcXWnmFsar$BF}^BS7I{z2bi?UGz*nZwPd23H0$(sd)QR~_8g7aJ3P zj~440h{mn4R9g&Xc>va^2I;ulfLfm>>P=kr#J_aBg8%K%4^*wBg`etyQ2GzYk`5Hu z;N#;XQ4-|u?})f4T>Z}YqZuQ;>DzVq19ub09{%l52F~o@w+7|i{YQSmwUlwrF$+iA zZ%r|8yWHo}3i9^}flOzH0n{qZDPK~-l$dq`AtipENVuT8xy8Rpw4&($f)+S( zF?2!ot<5?+b2DXY&P3wDce@r`BRlK{RSzjTjF9kAOT1A_Tc)WA>>E6P+UnL=s{lU_ zh4}!dV5~^FHGkcv0IdlTZ{PSIrIWp;ek33oPj6tYz@wu(MGgThYgeyV^=B4Dg}cV2Phsu zKmtG_VBl@+CvUUh7f;Q9oy=wSN1Pl6c%+yu9mT9crSM``k@Nm29I7_np$9$>p6A+N` z7>4uaJh*d!fQ3S>uULe#-V+?(vI>HRJ~12R?Oa zn)e69;(KnbE$3j~m5r0xvmF90ZR?}IKkR7@;ltYwk#7#9`X=I`4( z%5!P#UHgtjpjDx(QL)2Mqm)uuN(!?gAL)cxz=rF4KbAo_01?EZW}9kp55ri7;iwt1jlLsp9^qwsH6?L5opE+)t5_SorTf z1`l4GpZC$}`;)n*5P|dpA=vcFk~k-8 zH@w<12AxYQ zm-RL)gF;NA4z+i>D}?Ek0Qj^@uOWtLa%TO{e^%%lpx0}}?znQiSFN%cOM6}Tw2&XM zCHjL3MrfKCDC?R~TwLw-Px$+>|9 z{!^=dJ%nBVEm%ct+KFUg)?;mBBLaQSL|`jv z+ONchc!n+joJns_lVk3ES<0P=1MIRJ_HzHx$!^ukQ3U;Tff*Le1481+wNMYbtdM(~ z_c7dlK_{~ir)J55 z$ET*0|Dd15m{HBTImFlxcoLbwDmoworwlT*h({<9*QB4`0l`wJ01eQFtoaUxEtNgG zop_#q8D%Y5xvv`nfk>9OaOEabuBIrquHB4?or(mm>thBg3?%X?5g4TwPqW zfA+d}PdA3rVI;lTOp~g72S$2&_Zk^OG;lW*DBq`PY!G9&f)FAZlGCFA9?3lZjIpHX zKlzTxMnofri>^zb5fYEio?@^g^{D@g2#?OC=?wylUhrgp%F>`uqO0-)X$_`Ab7)|H zXWC4nbt3i@vt@B_GI~N?b4A5b!xwo;9dES=B8#V%_H&6cqvjqfW@J|yG`{ro(}QN;*mn6{x%9Re3tjJof03vhz!#`;{ZO%(*z^>G1ziyd1)#rx{ zD$*!ur|uF)4Ii*(^T9G8Pl%hW5%x$4O>KB{F_4~JMo~!RhjtVDMH4%b@-=^E#VYG4 ze$hZ1>seXEqC})zUmH;nNeV&?OByEzF@4IC28od8>wU{r%BCV59Fh`K@7;da#ta+) z|3@{;5?3HdciEH{e`>$HZ&d(NhivK3cYAgh&E=uNOm-|I=PLE%13kvZ&j|$AdS43C zD;C)UPy$`|sk`Wq=#_bNf%czF`$Qlp2ub#uSPfyWPgPQyteY85T)698 zm}d87f~mKYvZoMo8{~F1eFQ%_VgxK8$Etqw=&1^~7wp*^y8Lt(_y^jZE zvPAe_3xG}gP6rf+0BCH?@p_EZ4wcAIGtz6GqGu`D^1b-{;Vo5TH+*{gidPAZ8YT|I zw6l~a1AuY)6x@sxF%g-Up(SaAfc7L`T;IKLR2hiEowECZu&2-uBJfzo2;2$GLw24) zB}1VPWhy<&fH-D6sN-dJ^(SmcsRD7zzwgszsoypE?>)CoPix}8p7Hdi4wr9U4Oc=w z%#d`E0M@u4(kiaBruIxKm!FAvSH7`diDBuPy?{OA3{oGp%~u`jvM;ITQ2u zA4ukbVlIc>Eq`v6kWZ~E*(@#mv}ZVyC^IM(Sp9d^>UUlnXbTM>mHDp-J7z&GCce&n z6;CkT!ar)>Fj--FvcIlZMCBcRk%poLEEh6@d5PP{7KjJk6dN3{f2&YR`0b2hK9j0% z)8I>CjWen=mF}cA>d9#-L*CZoQh{9^`M%!HNC_4V>-!-)<~hnPd78tTkt9nsgnIWP~+sD88hKyS+6_ zz&u4YI`WGJ*Bhd43eeMs$_}#%EVY1wTa}1%ouw3OPDdQb@C?b8M82f!labf=VrkTH z((UkCT*be9M`xHtXr%TeanHLY8D5vU1=>OO-UAUi0#2MnkQ&JESBD2GB zor8B1hO-aB4cQ}HXi^th$NEgH<6g{a{=U7vHTPOhVE~UsIQxml9HmKsmSZwt_ zKY9Bc-_R~|l!wf=S)xZ|ZO@iS0%snoinrpEyOIKKCQsIAdcdi8pyW8j&7_~gH{n=` z<{Et)@9@+lHD!m@tVlUvXux@zz+%R}k(V#=z{s`n*WM94l?FV!a`KWFs~TPtyl z$)CMF=T>V?EdnqXHCIaMi~^!0sde^2!y-3d(PR|iza-)lGAP~YYZ9~JnAi)ILfhL; ztnmsL7dALle`Cd-u?7?jD2wG#Oae#qZL~*}u*pXej8|MDMP+4WHnL^b9>Y27h9m~pDrF&FaaJVMiC}K z#Un=xyNIJ?Ogja`d}$@Ch-f+n*B=N9*dX0c5~DTi-sRAO>>$@qb5B%Qe98D99=w>_ z=@l5*dRDW|IvcC}b&uJ;Fsq3!#%}h-3Y55-fPrfVttqGl};Vutc`*s5a)?4Ol;!df``c3`*B}vTaqGt?< zW*28$&w`w1em*!vq&+h|S)HrPK+9Elvavhd$9<^EGQ&KKwCeLe3vKe9r>)KYumXBL z0=0?U?PhKX16AZa;SGZ)4+73EK29j|?u9WE0KRh_LBocnb7arcGGc8Xmz*p2<^_SJ zmQ11DCZ#x}0Cf0UZ&4y3@AsjU3tFunkp{JsFur)3j2ammJ9Z84Ikx5*q{Z|2!0M{~ z3V!>uBJCWueEL|$a_>=mVB^jtHV2}Rt9p*_=XtQuQ}#AZ-^iWzaMQ+&H!psORj~w- z*~ytdTBItl%M{nMQ4lGUFcnD!!Rkqa-*UI|!J2HQ}GB ztA=!9&1KcY@!RQs{KY19{42f4uRhB0`KX2g=e*-H;u0l@gC}xk9>`RmsyIV6iZ}3{ zEY6SYG1__CF6VYdiUGuP+FGbiA))pn&B`RAD?B72R?Pi zllruBnHHJL*i}86tUqZG`Vyk}YPBy!gTks^BZDx7o2{RFZA7k0xKUa7o$v9(H0c!ldO7d!${z$ z6ZbK%MgPZeG$TB2+|%8hksl9(KOF7Ym2uEf_8p37Z|@NLf!N>|P7EUtU0tS~K-F3Z zWmR=R_gNq9q4?HHl!(sdu9{X0TTDav<7!T=WXmKuthZSzTKq#9q;vL?W}6+oo&a>r zgx;2x{(uRwMbxre=&5SdgDkV_7?kkbaK1w&p&_DtFOu7F+f3J{EOx%^WjrcfF~$w) z6+>l$&>PqZsc-ot9(S*ug`>VsDRw{(pV1IP2>BnoEM1z>q(o%;C6D}>FxoQOa@;-u zvs3~>R!Ov(JZ^Twb=sI1$e&ElS-a-Q)0mhFI?xOa5t=LBFvZqEdse%M2VwlhGqB3s zC_HsFJ)(I2%Z)<(N!spb#fqHrq@1jk2#g%A7=IM`BBy&6yHmuyOm z&QD`qOJogyOM(9Dm&4pv&=k}w;Eb{mz12KOFCbq9v=o)Dp1mfkaFg#0HLCF5<3G^uoH;oF4bQg#Q{ zIwqk0kd4ak3&l~-yed0=_6&oeLoj=B#S%*vb++AR)+v(1Y>#lHbj4yHZn=>X!g|n- zLwUR0VRd33o$r4bBFJjWE1c?|511JJWKz}j_JO`dgxEvv0{V3>@*?3YpM4#BD=aA$rtt(f3K`%Ze~m7 zCet!M)-C$<12X(ULudeTfUoxV_W_wxM><_-t_MA~N!^5acOX$-Hbe(A)MX85$ibg> zov1j!i0pv=HQ`ETOoRln7nKqYHWR$`=ED-L=q~R3sp`sO@M}-x&=)if#H%E?SdY#x zp24a#F;C{c?X^cw?PWTkkAB?38b`QmrFqWH27aIFG1Xf9;xQ?htGcsd-T)WBDsw(L zF-Z+BQ=~@$8ksRJfX2~tb4Kf<6AtzDurQ2X*1p1Em|bu8q`rTytM{VLfgc~?WIy;p z58kpr@ow~U)v>QU+kTKH0a)|9xjty`dOEhWcS23rz?yTCRrl{2Xlpdq<*tmz-fRp` zD?j=@Fsty*h!IBs@C6XaahL@XtL66+?sXxkkc$-;}#7V40Fslq9vPX%h^FoTIqAlGd) zzD5v6uuaXfp%O^Kao}w~4ocp9a?t2mJpZg^35dHum_4+tn6(EjTA@2YyS`w;v2|4M zjpgd)72kmCN>wI=3{fDwnkLSx8DHF@Msu}#f*aUZ-)!A1Z=$}vnc>?o*n}e_;yYtp zpt+E@ABns^JM#*zR4c6XcxdR|$m@=LQeb#=Bd^=LWthODcf#!cXpPdz;Y6#}$g+T!*pY7#++b5P2BnCD z?hU2rIHSgtx~anP@xa-S5}2o&>86Zlhnf-l;{{f_k=h!q7mkpst4byT*fz33#fak4 zD&IRk`=Lo8r@vK#dXCrpeWn=RF*>qMNBe9p0VCU?%Q|T}N1Gm{^ic%8M4g#{)E{iP zx?7+)-zpnkJkSKSdW;-QdZ$`0^@>!P-CJS8y%Pxj&Suq1(F49_mr#BI_?IEN6K+xw z4iZ*L7VU0vFV&c0s%Wg4O^p#XY9nc+Es-bCP~66OJK%fzGlV<2Y}}x(HL7dcnMG+m z;lVPS5c+9{`cmP1YGrqrMKy%pSwn?l_omZ)=shK@+Yn(RoyROdZKQzYp?)h2C<*BG zwauL&t=m00n^SSKMKcXX4Zq?K&T=2l)*U*yn|*ypSu!XTJjMa{_ziRgzP12;LN#j^ zWG(524HX#3yT$2?BM(QJ;`4aO-W&NI1EWJ}m1!sHkcyAjXoaL$WIO+Bw%8$0K*jA{ z0;8aB!X9y#ey~YVrNd`~{H*U0OmSdCsao&C)R&n?Zo=T5Tzb@6WLy1}92~Q(_ukG9 zVbiea>y&X6SMwEq?Qu+X6@mewc9?GL!jG}In(5l z%d4x|pGP3D+7My}E{+qyjQy(F!ZoJcBrS7IHcU5Rh+nwG-qzafPj~cx{g}d# zF5}c;IU~zCCwQG=2hS{}6ivt28i^ZUjz1j;{@E`otAHy*7q?odjIOUmq+SZaC-7S0n zq^Dy-U>_JJ=k^j!!${{;wTO=MrBBzB9yI(OR2+3>g`Bgp>uZ1L zV|S~16|Hx|1$U{4tAGb@-w=H|=4;&>q69aA)(82IY$duroFl&YM((h+{;`0lc)=a7&y_P0JGb-}Wxoye zNCI1{F?oLVxXp^$suBi^5U@{eC7@45h#_PxgdU`;`;O~?)!YdOCV@=8yw1`cpxZ5> zaYerUcW!QOTcNp(FE}kn=aDT-Mn+msgVZN)<`Z1cxzL~2c3*(@_-NTdeT+rOAD1Yy zME+xs`_UQVl2%o-(x*}GUD-R`yXjRm8AcZS(FK;;Pl3O@ixfuT~HKRil}}K zjyLL9nLtZq>L|QX*^lgwE`H)3;}s~JF>Wyb+P8T$=Y-P!%)$Y0?S+2QoS_DRm9Ci7 zQp}H3!)}^^6r}@_|AI=D_LlwT18gy>|6qTA;IA&imHtaDmqh(*0_(OauR#ytj^iLz zB}rSmiUa8HX@=@ES%Q6x?J(E9)0y`kpi-~@dfr05+$(3B@jYsOk$#>QnV|q(enwm^ zdPFGZ!M&D0qS@|F;g`2j6%QV5i{pcP{!95-h`MGhnNjsW9=8QvPhzyshyM2G6^vO+ z&e85EAGm$AbKB&SPa1#M&(S~FS@mADqovpd=-mN;G_#t)5Eo5BXK0Jb6!Xfff2gjN zn18bH*_TX$WWBkA`cnI})kF6t>Hkzeu$i&`NLoO-4aXcMXAjfMU`8R|aez7u8*K)N z^vWilw*3KSLjL<-A*1EqOfNgDBZrzhl2(yi^U~Jlb-n)8$}Mri#-~>{2-CESdaUEp zS&t+@y!x*(xf~3144s_j8)~&*{#m^ifc(-? zoKX+WSYX|wvBhJ_--akAgQkkB-@3n)A4Tx8-W2$X_&=;v$hOOE*9kCwqaj?##lSd0 zU(Npf{9K-PaE}RuNTzgsks!YQH))psHN!026{IG|Q7gm;Gp zurTk)*eqzhI;aP!5T^tAHru7=E$m8ru6bK?80expG}NQOV}MED+=LHlmk|5=#b$G`6Af)h=&ZwoZw zmY_B#C?S*|Zp&uwO%;%8?PDQYbG@W!lurXg(f|B?crYsJv!}P4zR*G{ouOZ}LuN{$ zCG+)Z?Cgr;R$VVe#Ugqd6^*Fhhg3~A=`M=8TR*K&J~WlOWlS^jU*UY7S;r-7qy6xd z@PaU2nT1uqXaUqAbB=~LmOLhVMS85Q)8C=qRXFZ?GxPGB@hP39q2ca=vN-FCo3dZj zzGcM#lBZUAD%+4-+1bJ70#jL_i=qUJCU!BlFc-xQGxm>@h3J3|W*h!;_|Uu|FWUOT z3SZV_>68C>UYlu&e|?{LLCK%ae|Jwh`(@qmMks~UQL|zwX1E{et3(ehmsQc7140Ps z_U^@1^4*&RjxSRV<09khPPb!I%&*F{uzK6mKM?OT4GzEl1xO|{c^iMq@>OFjbhmCv zD2@}F$6H%kYU8o)#oQ>vcEMOhzsJOcIp|TW7-hr$?Ex9V&n$KbdYHkKB0z&PhEbxn z5rMw&Goo3>S-E%HBg9|-o@|#PKCsc@Z87ny_R@Ntmttw*zY7A50WH;tXLh|W2QkY! zS_>KnpDPyP4D%E7hADn()qQEro6&hj(k%HNOdSDyEDN;$y<{f$+zspED#a@G7Mx>k zTM>~(6Wy8?ro%I9X|VR?y){gZ2EoIL+-r>Vhk1q8RKIDbw{L+~qq@~-q>%vTaAE^s zt;^<1R!lA`F76OAZ&xeqYLJ>L6=r~Lnjh85M)*Xe0*LwUl>)iU(O2xTU!MOrCYG## zjFm6X5koWJA@WKtH?M5o2au7YlPZSyRtAUY>2?Qb@X@3Zt%oH{H|cv8E?4h68+6Y} zT(8l>X@EZsM*7ADC@Jx$YwbGA{_?uNaF4Ot6aACFX%|<#kg*X(tP1f?jbI^NYj|n! zJ&6GsAfP^Ozg`)rJv!bpb4j}ha zB2u6%+o<2d!fR2b{Ye>5+2oqdqb|$d1a$CcvdiQCT1`4x^9K(#` zpZG82vZ&}$=4ui}hHKFx&Syde#VOKZk1^|IHyzAObR->_P(_<2i$zObX|0L8%#)`@ zw6>nfLAqS)A)lv9?OQ9mU)T72dk^LC`gfkeJLivi?(#p5N=dae zY!nA^ny1se9GhP30zDj98$nkWxb~>TB{7=Qjm1!s0x=xo4`&c#h=~-_A%p@?lesSez%_ zP%x}Kw8d)3*f75&$;SIK=XYzPy{&8#wY6#Wn-5)k?M+e%FY9Oj>qOP>Ba%jmYEF@b zrlnz7-;cRSfXW!#@RtKct;K{P1@ALNWf_?t2Y79(WJibc!``$)7YM4^-+xSLV9f{< zSEkNe_Q9Uc6$Epc=!}H%QK*_&$FHO{Zy%->^nhCVr^(II`!xq&<$CQSM){QQltOpc z4Fl9lL^nU0-WDTTdY|}dt0#5i>9CW3uXzIB(dvmECdNS)z6gHO?hb*}YH(>PO&X2F zLT{f^!Q}2YB>OkUj6*ZC3d)iSp)yxO*P_-)-{u2SsZ(6BCXWX4xSpOK@xb3wjO=)w zdGBrI#s8fz2!qYAod^~|bixd<3U}KdwG0{&3wO;@<%RdBKY~Bx4_~l!-)5jXYd7xt zq1qdj{l9u_*_)6%eu0C97y`Z6r0W3{;s+*tuG8kN^`c@C;_8-=PTdo_ksJ5&otGoD zO7)AA6w-)~k|sZb<*gh{{B-ffZom`cMKnm4B=TPJ#YPEGx%`^@pt?*u z6(Y}9-~u5r^1hBGV@NoWSa5!u)9g_0n9MJA53hjn%aHhZ+euN zO9>OV0nYR-?1W@69)o5Jg9r)`r~RGty3LyviLVgr)j0dqdW+3V2kf0C+wqxP&&Ked zHcKIbH7?FL*oAgnnXGiQ!&Q5M3F_iy|Ii&2i3S)R0Z9-5RFMUpu;oVi zZ_Ak{(V|s&x)ZfJ6C&Lz=wquP)$R)p;oGLjT~h~bNJ6*UdjwV$&V^G$5TK0!ry3U~ zzD5oTyxoDFd;rFma~A4dcP3Sz=~BX-%YTLw;a6^Cd_;U3o(9I?fH|`*5DJb4_GEvm zO85zmXOrjp>4(u^xz`R+w2JP@Fp!Tt^n<|JGakF5?;w=Ra5|K!wCP^$b$DPm}jx1Qc!bAI?Qeu@lmYwpv@0 zBXP>0ou8AT{SX1{2{4Y#4x=4Y+j|G!bbOAN?Om*@&Z{Pk_tsarIPG}o=f!Qd=P8BucIe{0 zlr`agpdTSghlyVWO0JR@)#vW*y@_%7WRZ-8y!fIROo_*MKYpdbHbSFlQ+{WvAJrV! zc8f<4dSXiT+tcCWJ@V(QY6a7Ib%!E1oNij!DQSb?A42R8)xKUxTF;~+Qbmz;p%~=| z9{jzdlrg*WV^;qdB>~B-?D98t9cgD2--WqY{-2o+9A>(1t}z-F`5z=WQu zhWFo(9&puly!`Uv#5x;R#WU5WxTBEr_`Ac{HW$CTii|Hc+N!*QisEvS!yoh91}FR& zRg#Q{yZD6APUlJ2-6#p_K(x1uRn0$K1s%*NE#TWca?t<)fAMEbsCt4c{=oNNlC%* z7dRWaS8FUi!QM2!fwdS8NOLTbn^iu)1~F*T8102LM_Mh^YiiARBhIMyWhRVS_%cU9 z`RyucUmc7DUw@3A~iV_Hb&wrtono$v-BjCo-MUUQoG^3-%j+u8iT3-7CL^a7^E-*lsJ2n81wWGX?5K z7K}6Eo%wp*1t_-B#6ny^&g-(5E+Pl7y;V^{f)3vs-y1NC$l%@54EWskbFw@=z&zni zfmFZjPCwaFXdW68X#gQkX~+Ue4cSmP>yYXOiEEP8V2IjpAw+xY8?+x``$*xapmu)vUhCi~X*d~U<9)=w(U+|60PkyKPx z`tM<6XrJf0@1~bOY5rT7QF!iFDN+_iHs?gkmz7^e+W6aVP98rEGmtBt>BiU*%_3_u ztaLJ}@z-~gBv<7ztk`-?Fc*rnbkm_;lYk~CF@A13@!y_bt9PJEE8#4+wh=3wBRWK2 zfJ4~c+!Ze|d;u5^1x)Ad+da~$O#-ScN|uAP)$*59_{!axO-}C`7u2fOSJ1sRzgl-_iwxOemA_+Zu-ivdf(Ok{O2U`WN|Tdx*(B)A2Rf%0{gFq zyluDdnzlZ~KQp*SIQVPcafQE`qzB!KY_AR)5;+SzA=k0Y|L2?&QkzdDN#yY5=2XSm zt`Htbwg0t%+~K*y88B%OJZM>wA$M;k`1Hx=M_yvgP#JY+pyIEMJfD3MVF_RT@VB%c zR%csfvxYPr5IG^v_lFhw+0A+ySgHufBh@4B&c1G<%hftR`>UiXAt7)6-57S3zJphy zGT}OHGD5vw@^x`!_=iY-$%{RV7`lq1Gf;LP>trucAyK6*ztPjI5uIP%e}3db*uboF zozGtBjkZZmt8?{GxSs1;md3N@^E!Q>^pe{f?)!Bxp#+745LhJ$KdL{!;2!T_$%h%N z@&4e-4A)OSy1eMHHb1$g$QkBkEza>dK(}EG@nbh^W|sTR40RW%Vgi{cxpk|3oeE3* zx!qLwF@0|7w_>-Z3=<0MdH%7$ooIBvpEV#i^D~|;Qa8W)ZFH39C zCaV5PZAq5788(!PCzSDixUzZlDFs=Z0+5e^#yPHKOm$^kzx;@)4oezHDew%zvRP0< zw)3Upm-d}hyw@4)(TMEzQ3s|VF*P$8?TyW+nXJ0YYPU#W4TaE5E{CDIF^VUx+{_at zr7dNU+PxokNA+bCfjD@5UIk?^4}R)0lMy^+&nO20QQP1;?i8>z61~@z?$E$WyVhJ& zvPh!^3U1z5vG;Q4PN=A?eRkiz#}Fs^S-aQ%i8{r}Mw;iuH>ym7Ke!R4n(0R3(#Ro= zz5XhKfGcNLK+ttlp#Sb=@*}}9XT<&IhX}Q2FSHqQ`V7*`EPt?=$R78aGl$LbSHAh= znH;C{W%HZx%G}JPSi5gc{Tol!1rfBf892_jhaGaNrPF3qVcnszt_$4fp#HO=eYJLP5i;@FLL6u!HYYGVYOYp1D%L5- z(@ce;jB} zFN+P#_Uk@6NF|f5z^~>R?lQEub@RL7yy;^>jJI8sagvTZ@ys<8N~00e1HRj)rPB3b zM*k-9z<&9~W%EBP;F$xF{4WgaOOa1@mzIO*0vt=qhZ1L)>MOamVr0E9q6QzhX}%9w{BVY;i{9~uz3A!{4cx!nRso4Y?|bFS{Y-G_-wQ}h>-JSyZUy+K zeqPJ8HY^KrM)Tu~oIk;teSh@dnEyKq0C9i*Gew|y!9jaGZKlv5ZbY7CXC8}07zB2- z__ruLU#_^l-a!W^1tZ$K3&K*XAUtu*M$ns4xRKh{!CX5wJqe5R+EG7?+h8XW4eR=e zy;ItcQGuU^>05bEjt;S{Y)`jF_=i%2LUzpFzO>N89F^+juT$6TdSJyAxhn zJ6CAQWxi>)K3!|B1E%yA`C38TJIz)o*C`V?-gDGIT$opCUZD0?;P>p80v);-@vid? zzc0MdS@RD(WsWBz`VJSOxDe1EaIdH4g4kuNX<~tUQiUxwp;LwR;Z{diY`E8fgDlCH z5Q$0`bz7$A1`{3?^r$0$-*z{IMQtP#Nub3S22aPe^?%E>>HnGx&3Ra2#S*U$H2HO8 zR>aypQ0b*D$?Soqw3a?GB!r@-hW1~x%xhLzu;VrQn#rl^UNe}r68YImk8@8CADOijQA zzkW#IQ-jG#2)J3ppV$slhcr8aOS7lcnK0`!7o)%4AT>{w-2|8)kM>e0$NPIqnkp0( z5x2>`8)$1c>9y~w1JxbeZQS@^)ZVhWwQ!y(bf9o}z*~w-$+Rxl(!Pl1QrvhTn;e!2 zKVd>sBZh^QVC{S1)4l~WA`_cSM>!|IryLT<^;2vSo~-bn`#f6>n}(;i{UHH2dmo3V z^vv=eS8oK$D>;9uIAg2~m@htJL9|@|U{rd1?W~AY`dq_hiBNuqN#;x;mt{N?@cLSM zIM-Do>+k>5*Lg?7)wXRvNFt&{iB7aZw20oK3r6qV5JV4R^cF2agfOC)=w*heqekx$ zZ5X{oXSAq^{%!aDto6R{`qp~@Xr&x(1gu-_L#>sS3H9{D; zn2^Tehw=FG#d|9;X}m}+qEjwC>0eNN*@*nlUyBZ=7NT5kz9@^QY!kDOj+;i@leEqD zFS?2%ktn+M?QRL-m67*PclSjq)=ChkE3NE?^;{bxUL^|{&IL!gr@~WwzD3wt$ zOH_N`O?AzYn@Ob(81vltTKXhOIAU#bTUhVL3u5G4DZ3{#BD5Mg-%Eze1`6B)#Rv^* ze7LG}UG#ztyk@U&Xc%2?9^O2Z(~in)MGoq-r0j+BJAMCY$h7sIHwXhVAIv_!=k)RT zJ_b|l1^&=na-9mhC%MKQ_KDQrJz{SqA%>#auX`o{)eeRo^x?w&i6j4jH(w5{hW>unE@OyVUb2i_n(~Dm+sy1{ z^=+>*pOVg=q(gf1oRrksb#mMC?451sqiYKF{%^ZxVqu2}RQ-pCX%d=K z9Fndny6OfV#{GSX5=Ru=WL<$4^-@Qa~tOB_V8kQXuJpk>sK^tAvtkSPuW0f_nv{ zj8PH$rg_}LF-0+9gQbgU$od=5U$%-(cUYl8jOm+l+sh`)UEjmsM%r^`<&)#MsI&7_ z(ek>HGq$gZyXlT|#zTnkby{tHLesiOPs1OT-M6_((JEww4j#zU%LfK)HgxZGGOidS zO{5PMBO5PXfc@}0`K%cKv~#GV!qk3gwjRCtl=@ROMEy?&Bj`{i-tq@O*A3iObU#bG zSM1XiyHS~K4SK!SL4?$eBxkH6i6O%Fvl=aqqjOcnmLI;O4I@>}u8rt0k8+ypYI0+1 zs}fFtwm&LAGpL)&rv2M5n?x7N%{#5EvBs#r=P3>^;4lv^$@`o=Oz8iWlb3^?${3HZ|HM;ZfCMDtF)t!rh9;G z_Q+=sr&dY!ar5u$yJ&um3_72TsM%Ah zpzzW2o95_%r*b4K=g+D@mSmb;jEHxFR!9Ii4~OW?LTKJq)iG^HYrU02=cYd{GO(}~TE|*haeRt6WUpfqF8CTvXbTi1Aj(U% zS384qwG}4iW6Fd0O3MC<(M;0?+CZ_BgsQ{rENJn)p{k zIj#4^A!h@$wH}bS2O)jojt_1u{Na_k-2siw7vilTuzR@axs|c_^w;b0dD#j>z3Lyy z67kVeLak-M7VK@Ym>35ai{+){BXx_GQD%cYo(kAaA+aXCZ#P~8HALOp+U%FRg<9D zCj92s!Ur~ITasJ-L)vTR<{w_t&S&OUgmn^GqCSn${%*Fq1Fc;fG$QPM_A%d^DwOR( zZB|0MW#xcm-v%?aB@%wapK4Fk&Z2$KQRVEIKwaV|d9zPXVoW@tme^JJhb=XMY);wd zIqG|ZP-_-vZnfX<5BA&q`?w1yUr@soKUca@=GXb7D61%duo+Hgo>mP}C#YIf3xQ{G zNHtDoOD^F8sVrMa*zwGs)sbuZ#|kU0WPN(S?xxACOVz0aTcx`*gx}v)?e!|UF_#m8+y;Kmw1x~oj1pOSNuGPh!ySeSoBduPY2+`TAG_Z zZSZI&iOQRRZK0WHZ;L0|Hp0@yA?O>c17g}~MCp4Sdvk^%f?TK$r2Ys2q!qnI9tjOT zf1(vCDY?(Wy`M~}3a~(Mi$Wovu<7PFC7Pz_vmu(heBGIl z0#*a@Vq~5?f+sff(j3LG8BKxck`#E?+9EcSYo0ha5+zv`pHqYExz$kLg+eNyI_jKt z4jd{f&vJ_r{}7s*P&5T-2HV)*Ydc7s{A#qN1!Y z2r0#QBYq1tLt!1xTx@=`K-uAT_(GiEY|Zm?#?a%G{0m35Ah_bjnAwMAKVt3h76ks( zj>CCxMmi%y?sP(rGYU%9dt7Z+Ed^FT ztP$U{#Nhz2DY!|>C>r>}?zbEk#;r>3N!~Q}vf-?2C$-M+8yGQRDJ+ZaOJ~G>Phd}F z$mBZjZy8%`2M-+4QWosY^u~*WgV7)q&}Z&48}H$no;Btg7aC=4M!KpFGP z+*;^FsT^0tBt@t^1{{&gQ8l#f9KA~~%=PD;7VRMuk4%d96w|xH^mZ}yu~>bin!UCb zmIQi`@9vAg!n8P_-lRwH`;1>Z{dvr09Y17V4U#qmQW_4Wg!n(suTM`Y%stBYo(yY1 zHP zioi8+6X~`k)hd)MAx5Dk;H=8V;kNM0AVmE+FC+K8$uj#Jro^r8Jonu=Z<}cGC;F+7 zatE^Q5BVqd;mjY?(!)pN{(PPYujp!{E!i)j($;R-_&El=`FO$=sTk=n)2@z((Nza4 zHIdb4!39QAiCYRAnF}(wF%_zK&@~qBQ=;C$H_5mosh7EZbLvfK!AGU+Mm&e&pr2F; z9+L7B<5=rbCagPt%{)9Ob)3=!61uUh18X4jqjDcfmzBq1M`5K?$Q&91{!*juk(%!u z?{xhWfL;!Q-)cw)t!gA_F#iW;f@M+~_m7|BOKHRA#&qpYg^jab(3>%Vk2GvA{W)#@do2Px5 z67{C}u$-eJ60sEI=;x3)QulcwUU_{rS)ufco?UCHi3v;Bq^;eb;+C}Lx(!7Zey#yb z!+LkV6|AF<(E+~8sF3pQQXtG0oWC?_=$?H^73b0Ff_T_?d+lusHT}8s8;8`r^ei$d zD#a|(VB4}Ks^KzN%{z<*jXG3Z*gtlYT;Yn+$qXA22*;3~%nL2H3$=n9UdYii9_kt8`|ho2hcE_lU@F7qqnz-l zWu}ctd1kC{>}b7^Eu2$3`;=jT%Ck>^Tu&WnxAwZunv*90yWYvb)k460naO$~rvCV_ zo>v5w*@}c2rkCP#Se0?ygo5!_xZ+Q_PfDk2ClogNqpCQ-?8{U4s$BCz+3#7KeIe_DNOEf=JC3Z z4o={d_ew_pO^`=vp!nDPsEui*i!L@y;^5xE6W4FHgG#;%K zxTZNqd}yvQs7!HywW8k&KfY+W0{G#{^Y@rLp+TSM7tUKs`20yOzOOC^4iroWUaoqd*V_3m1({bfHT_2;Y1&!VV^oy%yT-++bL!NUTApHSiCY=VmOP}l!PYBck?jKnDb zhql>}{aVT;v&_cdUl3PKCVYk&w?aQ#_*Z#VeVJPrG6B{0&<}iJ$V4T-nTZcpii`o4 zbD4V-@I9a>s|4nOd|1LNxO7ERK=HO45p80fDoq*e1@Z5mRUhN8ZuXPa9d%mG+xwr<;&fJG*Nme))FgzP} z`TY=-$+KYT1pD?%w(JvJapsB#M=K`g$SFS68gGg38u45~W$F*)Y)UR%BvwU1cDO zzF+>HzV~Yfm;A7A2t(UF1SM--Lid|Fn|@STT?up-ra7lTB7^^i$>(R+DNd~zk9a^^j&4k&5pf|%i6uLSuiAZ8mGVnH?F!NyddBwY(c3!r zMmPgWz1H=W{TjG6SlexC#@Ft#p1;&89Hh3$LJi2F>&`{wZ=F#@10^559w^h$HupdzS%5-a zhA`Oa$JlSF6iN=74n==OPIz)__Cp5H+r#QKW61uqv%}TLezPy>B=Csa|LQ5vj6N;9 zdeYTK^A}6ACHZ6)lS?Z`{ikWjzAF$R#(Mjy-i$N9_h$d)oPRa4hhen!@WkLLI zABqOnH%MWp_?Tbo>$Z4K8YZG-IIf3Yj_B_k+K!aMj}4GNT~-1t{O%PB9HugS$RC!v zE=WKfRc*e+oa>bD>&dzGD+1A^sKqmifNNV?!DYvFK8eSsa!2Bq8ze99~;n^sj?t z#LC?a!t=G|S zxy0`FX5Y%SDuDjF};+5YGchnYS_H$#d9D(XCi&7_9d zZ-@4NKu;<+aZARwVoX)q_ngGU!T4rS%<||^{dqZ0<=NIbafxRY_GTR3MRsl^UzBzo zas-MIiU_oi48S+dr;*LQ;pG$kqmCMCk}7d7g@({1Y0-+8gry# zJA3#qLL-+~zc+IID?Mha`EzjdxvEu_pKC{%$EE2C(-xF%D>LGrzW3H-e(enaxAD|$ zB>BTplvK{Ij?x?+<$NJ4cr?@o`griE4fH!fVbA_>qqIr=c}yVPXO|fRs~*4ysOCBNq`}W)I8)5w`CH9F}cG z5#&#aeY8^iZBk#w0g_|~A3aRW_b)V)0~BBhA{qu+b9ctuAIc0Y*Z!{R|I}5FrO9&F z$kU>HRb5}IW4ncQ>w0yXHny9%A6qcVm=ua;+P)0t$5>jA#fmmp zZHhl%Yc}$>HcUA@+?XJSuvDW>1{c}J*i<$j@55w`S@L_T_3%z&rh3Mj?3tve&aFZ; zLk87)#T9R=Mp}znJVTxt0sCU--c$Ulw1)gGTCYi4t&vCRT2%>GW888mO?9bo(`Y^yNd;@?`nk2ze*fmVH8lZz&3t$};E~mj6dI4+0I3sgfPLJI6y`Vz z7ujl~O#7GE8@*1$YAW@NTlET#E$DQKm=f?Mt zVr>5CxH#k71%2s|2pOT3+@ndiB2lC!kz1zg>W(eMk9>1WAGamG?keMg`Uu^BPlN!> z%eob~n$VM2{IS)#vWm!^P=klmQ_{L*G`~_jOHj>8IgMQM$1bu-D9$5q@6?LIbHY++ ztbz^y6mv8t!4bo{Wl~VIF^H`yTny|l7IL~(l+Sa6`%~WK)~5-q%Po{K$x%PXfw66g z%FD0|ec}F%HpldPejh6p`$LISofcSGKF-z5QK3Dv{bR+hipHn1@+~dYcYHoRUnFbO zysD?is9O)Wp`IFMjZa}Pu}c;Ev6bCB#}8H;b^|~SWff5Fepy1CAn2kkp7J=_nA$SZrBxOa9K!x*sO+T&>%@L9bz84LZfsXDwX9hM zfFSxqk{WU+gN_W>BcPc|V=_(@zd0s(p>~f#%S&COP!gQSx?+?_O_eg0UyaFz8w?7g zW31c`jT0Q}-VeQ)`XYQ7nAhh>&`Xsob>ptT&<#7zTDE#3mUbezHxy>D{DZA(f5T4g zl;I?RT(rO4lY96?TuJKpbDPrXO+S7~dVd==m$Y~F$uhPvb=|8@21=LUm*TPOqEewam!0KNDbW`s;#5Y`;;{Hv z%+Ajz4FA{dmmeNjpj1og(S)y% zQMrQ1qX-(XHO!^ip`ZyKU;80I-9dL{3=JV0@8cwmAvCSveJDNaMROV> zL6EVeN7S2*{PO4T)zY+1H9n?E(5>i}R|qdN(s(NMXX)WhY!-=^tDN(jReM=2_hYpH5jW?hqtU(j?x(g>{Ht$E1OI^hG zy`$DT#Y)G=Qz|yR@W`Ghq)XHyj|eLn2FQ%W0*^dGA zJQV+nZUlM0c#5do9N(Qgq+Yik0Y}S{7b!d#4Rz*{MnQ)MTL%Y~BIAsAOL2Npl_Zh# z9al!1-g!n7V+p-0enU9^I`08+XEf&mU#yP>#w?KkiUJy1l3JgtR$m##>rVjBjys-) z9ZQuqc|Rx%#ZBV&q>$Mh-=z6j9h+v=If@As#RD%0jRyyvqNXfs5d5V-{=g}YTG|G} zxN}o?1j6)t2h+-wH%Q=)U!u|yi*d&a_BsfN$)DQ&1sm{L%ypF;;fI$YIY>_W|9*ku z2^R;m*ynmk=FAyL3dUAMRINQfjNMdtF!&L6+7S!)X>+Z>~XBG9Dtgp**8mI;$^q^;7%hU({^3<~ab+ z`u;Ma(~<{^!8TrkI?l5RqK%X0SjBd}1@6R-W5425aM{Sk*jBzCqXzXY^T6p}v(}37 zxxBbry6JaLkKZo+5|Pkjk@TsoKG%-<-FDIf;fyYI+8JAzY65)#odni~HNgl**P~QP zVzlodKuDh(b{j%pc8&U{pZ+`+!H{oEiuUP5b|*9vGuH}3;0sU9w+qDkx`KB>;nGXK!VWInegrSCaW)Dq0otnmz zr$A#_*RX)LZUAeWI49i z0Y9*G4zvDZo#AT7eoy$V5$|h--B&|MzF!$X0$J*bX9F@v`j9!(`NwB}|Mp$isY|ho z5G4&89xpitI;_>IOjJ)$EHlZFde_W(DT~R${sH$syQfY!5qCT!OOeXfTsco^!5lrC z=`dERa&bT8=Dtc0-eA{`0^y!aijVVzO#Wt@ao&T*m)I`4{LAIY=`J$#?y8f86KC{% z>bn`2QSq}6`FNj-BU*AvTslI5i&e#vRg*{c$~Xra6uf_xfvdQ$U+(fu8ZW`qsdan# zL(B)oNCm!yIU;Cu{-mOc{f9f!{xh|xmiys8W&cXE>mO$zz8?3-A1i(>#h@)R{Ampf4bzB-th|EUJNsdGMM{o{2+Ys|fj}>yGRiJeN^{w_ ztxA+5BmKC?>8j7)=;#yDE3x}C=UgbKfKq2l10h>;BiXBaVKFnuEkevHflf51j_@5qV{S0$1^bLvdIzd%u)z-tNanhx9EsW)4sbyI}JfdpGfFs8A6c ztRL<^x%2c1DjJ}%ZG46T3^16~BRy9KXv2JO9dYl4)^m%m?JP+tJ9J^BkbiN-^$!4^ zUWRxO(BfU~v#WsA=nyQi~{bw9l`xgq%ml$zRaZh=z(eJRBG2=4&>KlV$0jy9BSZhjdSC>X|H?a#Xnfz z>WHDR34#=_2eAwQ&4$&)ad3?MKVoM_QJo4vAbpDoxuu}>00H|~1ga0U3faZ+< z{69qr<~>MYd;KbnOY|k|8ekQMV%?s;>lU0%bKjTPI1`iwA;tUG{0MfryQ1z@ger|ekZe~Ysex7JPYiei!M+1Z4*B3WHrGR(Knt>(< z0>uA*ooau2x<}Vne=NLz{n=mCgycQBSn9+D-BN*zMsMS(;`Z%8j6-1qFy(kb4$K&N zp$Uc>d)<+Vh~ly}TN7^JhKj-gtfV>wfp&C@@$q9Ux!caQytIUcJ<)XuTIJ6nfo4x_qr8-5L{ zaK46?77g9I?6|`D)m^t>wP|cbrS$b*mWQ3cR)eiO0ACi=$zrh7O3&hi={$^2g~K(|lpe_Vk6%OT(b|38BuAf*4zAn3n% z2i+PF{pYKJVR(Czf4>@d`2XwBf6fmaLIO0>-itr`H;`c0#g?rfK+6Es?+O^%&Avwf zrL<7&rdI%BRAsU=EPbOl7E^u+fcabGB=ed82LQ^TCP1^derfUU3VE6%(RFK76c||c z$K2=O@cxTc(_1GbQAK;yW7R0~>+={9AVJUxq{BqtX_Vgp=xR(sS0OLc7T}L@eMCTm zx%I;NGw2%d_xCHcnn5AGE#P4}ef9VD7CC$QEvxc7&I7-D=+&>-fiCD*ct!9I6RvS~ zcrh>nH6dyPn|{qzE~9+NHG+4ZF;CRDg$9yuUlu@MOkwyyRId%o%X8T*R9-M8nfN!kI4AKhQ^g;VmNjY`J{57y^Op#+jSc9t`IIX9= ziN}$(?$!(d7?tl7!2Kn01^U^_$_C~@o&4z{;88Sh1XDcY&?Yb!7o1bI^heipa`|ln zR859frUQ*crK}{kQYVm~aK}?s;%Dp6TI&Z$);4)ri!b{VBl7hn=R3I8#=pYBV{9+5 zCB?{PW`9zSpQt-r<$2#r+)o;vG!%mWo_8AH0v{QlJoJ=)naHpS7-9j!gKwZRF>R}i zp-2-2IUwTb)?;s-^{n)&WZjZTC9)dh42~8iYkizFV;8rY(WYv}(F?hx1YT^0;bz0? zvzcP(i5Ik~I`l!5P~4N8!#&yb{< z3TWMVJt-&b%*i}`U+Eb{3|Pld`+Sb`2gao~cis$mF@TBaCJ*u@CIgUC{+5 z&=XcfI1)c|UB15d3fC_OWdwqsPX%XufREfe7k@XDcjg7@ax3T3yqNp}%;Lc7clkM= zHOSb^+BP{-clz~E&yR{9G)XkdanN54wNuMc7i4*(WWRNkgAzdMLia&DqZJ=N>!)>@ z`R?`f*KH%m9wQB46V>M`!l1#6Tu^y&?dHh~tH9Qr>$L$&r*Zv4PTj%5`wz)KcKdw~ zifnoRk9hF`+m|V|ZRRI*)}?z8RaB!6w9YPIzJ)_m{-{N@z&Cmlw~5(VZ!ou0Y}*BT zU%e(SU;0HJAj%nwM0-&4`gnU6)xz3-JP}r(6tE9GfWQ2&@k?kO=;-m%tfv58#{@5;9h}=1rOFUF~c@N@wTGG_RxHpCf`ZxNZ4z@DF;_S zXYlea^%PM+j(8wJVibw{jShgDdy3=nB*B&D)lgoVW8U$%#=AkMYMt^22$w0!_h;u( zE57WZ=iAo$)FvCWiEY98Cl)l-Fb@X$*Rf7-63fKL>qVTrap#CI?0y#XZpks7Ok3&~ znzvvPpkWSxy{oQv3{m8{fFodWf??adr)DWnc?qyzb5*Q`@@n)X1`m$J{B7zA^JOZ1 zGU8;A;9RajgLJ#uR7B1ye~j~nM$aVKDx8_6+iM)|fzw=VOg$#CYO6`;+%aZhvyRQM z8cgZX^HXCbuOe9^fOB(`l7Euu83HehjTogq(8O@!#>gq!15uGfxq?On`I*O95BP-& zRP;=oL?`Z~^LChGIASD6Gu)=NwB?^$>tiU|bQ^p*213y;E;(u(N#ubBsqXv>%7OH) z$oWF2rxW0gbOE}fcW=H40f|X&ePnX}l@3n4-_TK0xy-vf?`+>1DM^!uF73iGPx*lL z*zLHN+%{rmDgl6_fHv$RR@hNbDrw{c@#64FjC;EKj!Kg}xX~E$i?XJxGiBa*R&A;3 zQ*gZ(cr;E>Q?Ggw#fB3d3#M`X#s{u8oc}wiZz{%3+A}J-iw)r!8u2Q=l!Xeh<8jXf z7(k?11pisF+zkGu63p>HznHC5Dul4D*Y>VHctP1)vzV|)>!#!Sf^DmXkbSWc?|SA1enMkIN~ZU)C83hh$oW0b zpuI$=i%lBGZ~lCePBeBA4F9m?&XiGrV*}bgI^njpo9a3;2XN40ae}L8N&Hwy%YA4t z`)afDy1?fyd0VLSGsa@h#io0$fr^p>eMx+5TUaO0*d0zMan;0>0GLVL3qPcAyzzEj zTVZ(*gZ^0p&HnmmW5J&M-Ow2uF0LIIyMd`i4Fim3Dy zIkwH4V{KR4xj&z+vCP@kUa1d0n9#T^XPbQLm!w=!qzL(bu$0I+t_SE5x?XHV=+>c`T|mP`9|(H+bdG=)si z6%V#b$xE|)mjfm)^k&RpUTrI0ZErFszm3GM&t4W`zt0MMn&2*F*sLy#=%e(PIL7H( zPEf7P{IjTLk&X0lJ)la>j*DOtOBbJn3&Uy_3ht92SOrxx)_)*l)ZS|c&&ISUzVyVe z$Zlw8a99{}S<8R^$Govh4BYfO{I>j;%VexhIxBbZcz6ry7YGjDtQ*xHHZQDGv_<;; z`dT(pll7p)@WJFn7R%6j0(fe-?oNgF*P1@3wuN_OaOZCgj$B)cm-+N<8R52JHCa@k zXFJaL=Z2w=g#{add`Y#Kv l|8wZ}N9cc+X{RAKILGH!GNC4mVRwK(@JkJaZ*rEQ{|}NgtbPCh literal 0 HcmV?d00001 From 153ad573fe5e96a079afb15e0c81b1e41580dda0 Mon Sep 17 00:00:00 2001 From: Menghui Xie Date: Tue, 4 Sep 2018 01:15:44 +0800 Subject: [PATCH 25/25] =?UTF-8?q?=E3=80=90@Qouan=20=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E3=80=91=E4=BF=AE=E6=94=B9=20this=20=E6=8C=87=E9=92=88?= =?UTF-8?q?=E4=B8=BA=E9=9A=90=E5=90=AB=E4=BA=8E=E6=AF=8F=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E9=9D=9E=E9=9D=99=E6=80=81=E6=88=90=E5=91=98=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://github.com/huihut/interview/issues/14 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ec56838..1366d3b 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ int* const function7(); // 返回一个指向变量的常指针,使用:i ### this 指针 -1. `this` 指针是一个隐含于每一个成员函数中的特殊指针。它指向正在被该成员函数操作的那个对象。 +1. `this` 指针是一个隐含于每一个非静态成员函数中的特殊指针。它指向正在被该成员函数操作的那个对象。 2. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给 `this` 指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用 `this` 指针。 3. 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。 4. `this` 指针被隐含地声明为: `ClassName *const this`,这意味着不能给 `this` 指针赋值;在 `ClassName` 类的 `const` 成员函数中,`this` 指针的类型为:`const ClassName* const`,这说明不能对 `this` 指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作);