From c666cf18aad05a3d2ae19c8ee64528994937077a Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Sun, 7 Jul 2024 17:12:20 +0800 Subject: [PATCH] update posts --- package.json | 2 +- source/_posts/2024-06-14-josh-cvx-2-1.md | 69 ++-- source/_posts/2024-07-03-josh-cvx-2-2.md | 294 +++++++++++++++++- ...osh-cvx-2-2-070-ExtendedValueExtension.png | Bin 0 -> 36746 bytes 4 files changed, 328 insertions(+), 37 deletions(-) create mode 100644 source/images/post/2024-07-03-josh-cvx-2-2/2024-07-03-josh-cvx-2-2-070-ExtendedValueExtension.png diff --git a/package.json b/package.json index 70e8e9e..e93ff3d 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "server": "hexo server" }, "hexo": { - "version": "7.2.0" + "version": "7.3.0" }, "dependencies": { "@next-theme/plugins": "^8.20.0", diff --git a/source/_posts/2024-06-14-josh-cvx-2-1.md b/source/_posts/2024-06-14-josh-cvx-2-1.md index d291940..b86bb3f 100644 --- a/source/_posts/2024-06-14-josh-cvx-2-1.md +++ b/source/_posts/2024-06-14-josh-cvx-2-1.md @@ -50,28 +50,40 @@ $$\begin{equation}\label{DefinitionOfConvexFunction}   函数是凸的,当且仅当其在与其定义域相交的任何直线上都是凸的。换言之,函数 $f$ 是凸的,当且仅当对于任意 $x\in\dom f$ 和任意向量 $v$,函数 $g(t)=f(x+tv)$ 是凸的(其定义域为 $\{t\mid x+tv\in\dom f\}$)。这个性质非常有用,因为它让我们可以通过将函数限制在直线上来判断其是否是凸函数。 -{% note info %} +{% note info 注解 %} 这里可能是由于翻译问题导致不是很好理解,我们先看原文: > A function is convex if and only if it is convex when restricted to any line that -intersects its domain. In other words f is convex if and only if for all $x\in\mathbf{dom}\, f$ and all $v$, the function $g(t) = f(x + tv)$ is convex (on its domain, $\{t\mid x+tv\in\mathbf{dom}\, f\}$). This property is very useful, since it allows us to check whether a function is convex by restricting it to a line. +intersects its domain. In other words $f$ is convex if and only if for all $x\in\mathbf{dom}\, f$ and all $v$, the function $g(t) = f(x + tv)$ is convex (on its domain, $\{t\mid x+tv\in\mathbf{dom}\, f\}$). This property is very useful, since it allows us to check whether a function is convex by restricting it to a line. -仍然不是很好理解。因此这里如下解释: +仍然不是很好理解。因此询问 ChatGPT 得到如下解释: - 限制在直线上:考虑一个函数 $f$ 和其定义域内的任意一点 $x$。再选择一个任意方向向量 $v$。我们沿着这个方向 $v$ 从点 $x$ 出发,得到一条直线。任何点 $x+tv$(其中 $t$ 是一个实数)都在这条直线上。这就叫做将函数限制在直线上。 -- 直线上的函数:我们定义一个新的函数 $g(t)=f(x+tv)$。这个新的函数 $g(t)$ 表示原函数 $f$ 在直线$x+tv$上的值。 +- 直线上的函数:我们定义一个新的函数 $g(t)=f(x+tv)$。这个新的函数 $g(t)$ 表示原函数 $f$ 在直线 $x+tv$ 上的值。 - 检查凸性:如果对于任意 $x$ 和 $v$,新的函数 $g(t)$ 是凸的,那么我们就说原函数 $f$ 是凸的。也就是说,如果 $f$ 在所有限制的直线上都是凸的,那么 $f$ 本身就是凸的。 +通过限制在直线上,我们将原来的多变量问题简化为单变量问题。对于单变量函数,判断凸性要比多变量情况简单得多。这使得我们可以用更简单的方法来判断一个函数是否是凸的。 + +> **举例** 假设我们有一个二次函数 $f(x)=x_1^2+x_2^2$。我们选一个点 $x=(a,b)$ 和一个方向 $v=(c,d)$,沿着这个方向得到直线 $(a,b)+t(c,d)$,然后我们可以定义一个新函数: +> +> $$ +> g(t)=f((a,b)+t(c,d))=f(a+tc,b+td)=(a+tc)^2+(b+td)^2 +> $$ +> +> 我们需要检查这个新函数 $g(t)$ 是否是凸的。如果对所有 $x$ 和 $v$ 新函数 $g(t)$ 都是凸的,那么原函数 $f$ 就是凸的。在这个例子中,显然 $g(t)=(a+tc)^2+(b+td)^2$ 是一个关于 $t$ 的二次函数,它是凸的。因此,原函数 $f(x)=x_1^2+x_2^2$ 是凸的。 + +总的来说,"将函数限制在直线上"意味着通过沿着任意方向取直线来简化判断多变量函数的凸性,从而可以更方便地确定函数的整体凸性。 + {% endnote %}   对凸函数的**分析**(*analysis*)已经相当地透彻,这里不再继续深入。例如有这样一个简单的结论,凸函数在其定义域相对内部是连续的;它只可能在相对边界上不连续。 # 2. 扩展值延伸 -  通常可以定义凸函数在定义域外的值为 $\infty$,从而将这个凸函数延伸至全空间 $\mathbf{R}^n$。如果 $f$ 是凸函数,我们定义它的**扩展值延伸**(*extended-value extension*)$\tilde{f}:\mathbf{R}^n\to\mathbf{R}\cup\{\infty\}$如下 +  通常可以定义凸函数在定义域外的值为 $\infty$,从而将这个凸函数延伸至全空间 $\mathbf{R}^n$。如果 $f$ 是凸函数,我们定义它的**扩展值延伸**(*extended-value extension*)$\tilde{f}:\mathbf{R}^n\to\mathbf{R}\cup\{\infty\}$ 如下 $$ \tilde{f}(x)=\begin{cases} f(x)&x\in\textbf{dom}f\\\infty&x\not\in\textbf{dom}f @@ -80,18 +92,18 @@ $$ 延伸函数 $\tilde{f}$ 是定义在全空间 $\mathbf{R}^n$ 上的,取值集合为 $\mathbf{R}\cup\{\infty\}$。我们也可以从延伸函数 $\tilde{f}$ 的定义中确定原函数 $f$ 的定义域,即 $\dom f=\{x\mid\tilde{f}(x)<\infty\}$。 -  这种延伸可以简化符号描述,此时我们就不需要明确描述定义域或者每次提到 $f(x)$ 时都限定“对于所有的 $x\in\dom f$”。以基本不等式 $\eqref{DefinitionOfConvexFunction}$ 为例,对于延伸函数 $\tilde{f}$,可以描述为:对于**任意**(*any*) $x$ 和 $y$,以及 $0<\theta<1$,有 +  这种延伸可以简化符号描述,此时我们就不需要明确描述定义域或者每次提到 $f(x)$ 时都限定“对于所有的 $x\in\dom f$”。以基本不等式 $\eqref{DefinitionOfConvexFunction}$ 为例,对于延伸函数 $\tilde{f}$,可以描述为:对于**任意**(*any*)$x$ 和 $y$,以及 $0<\theta<1$,有 $$ \tilde{f}(\theta x+(1-\theta)y)\leqslant\theta\tilde{f}(x)+(1-\theta)\tilde{f}(y) $$ -(当 $\theta=0$ 或 $\theta=1$ 时不等式总成立。)当然此时我们应当利用扩展运算和序来理解这个不等式。 +(当 $\theta=0$ 或 $\theta=1$ 时不等式总成立。)当然此时应当利用扩展运算和扩展序来理解这个不等式。 -- 若 $x$ 和 $y$ 都在 $\dom f$ 内,上述不等式即为不等式 $\eqref{DefinitionOfConvexFunction}$; -- 如果有任何一个在 $\dom f$ 外,上述不等式的右端为 $\infty$,不等式仍然成立。 +- 若 $x$ 和 $y$ 在 $\dom f$ 内,上述不等式即为不等式 $\eqref{DefinitionOfConvexFunction}$; +- 若 $x$ 或 $y$ 在 $\dom f$ 外,上述不等式的右端为 $\infty$,不等式仍然成立。 -  再看一个这种表示的例子,设 $f_1$ 和 $f_2$ 是 $\mathbf{R}^n$ 上的两个凸函数。逐点和函数 $f=f_1+f_2$ 的定义域为 $\dom f=\dom f_1\cap\dom f_2$,对于任意 $x\in\dom f$,有 $f(x)=f_1(x)+f_2(x)$。利用扩展值延伸我们可以简单地描述为,对于任意 $x$,$\tilde{f}(x)=\tilde{f}_1(x)+\tilde{f}_2(x)$。在这个方程里,函数 $f$ 的定义域被自动定义为 $\dom f=\dom f_1\cap\dom f_2$,因为当 $x\not\in\dom f_1$ 或者 $x\not\in\dom f_2$ 时,$\tilde{f}(x)=\infty$。在此例中,我们就可以利用扩展运算来自动定义定义域。 +> **举例** 设 $f_1$ 和 $f_2$ 是 $\mathbf{R}^n$ 上的两个凸函数。逐点和函数 $f=f_1+f_2$ 的定义域为 $\dom f=\dom f_1\cap\dom f_2$,对于任意 $x\in\dom f$,有 $f(x)=f_1(x)+f_2(x)$。利用扩展值延伸我们可以简单地描述为,对于任意 $x$,$\tilde{f}(x)=\tilde{f}_1(x)+\tilde{f}_2(x)$。在这个方程里,函数 $f$ 的定义域被自动定义为 $\dom f=\dom f_1\cap\dom f_2$,因为当 $x\not\in\dom f_1$ 或者 $x\not\in\dom f_2$ 时,$\tilde{f}(x)=\infty$。在此例中,我们就可以利用扩展运算来自动定义定义域。   在不会造成歧义的情况下,可以用同样的符号来表示一个凸函数及其延伸函数。即假设所有的凸函数都隐含地被延伸了,也就是在定义域外都被定义为 $\infty$。 @@ -103,7 +115,7 @@ $$ > > 凸函数 $\tilde{I}_C$ 被称作集合 $C$ 的**示性函数**(*indicator function*)。 > -> 利用示性函数 $\tilde{I}_C$,可以更加灵活地定义符号描述。例如,对于在集合 $C$ 上极小化函数 $f$(假设其定义在整个 $\mathbf{R}^n$ 空间)的问题,我们可以给出等价的问题,即在 $\mathbf{R}^n$ 上极小化函数 $f+\tilde{I}_C$。事实上,函数 $f+\tilde{I}_C$(按照我们的约定)等价于定义在集合 $C$ 上的函数 $f$。 +> 利用示性函数 $\tilde{I}_C$,可以更加灵活地定义符号描述。例如,对于在集合 $C$ 上极小化函数 $f$ 的问题(假设 $f$ 定义在整个 $\mathbf{R}^n$ 空间),可以给出等价的问题,即在 $\mathbf{R}^n$ 上极小化函数 $f+\tilde{I}_C$。事实上,按照不会造成歧义的约定,函数 $f+\tilde{I}_C$ 等价于定义在集合 $C$ 上的函数 $f$。   类似地,可以通过定义凹函数在定义域外都为 $-\infty$ 对其进行延伸。 @@ -115,7 +127,7 @@ $$\begin{equation}\label{FirstOrderCondition} f(y)\geqslant f(x)+\nabla f(x)^\TT (y-x) \end{equation}$$ -[图 2](#图2) 描述了上述不等式。 +[图 2](#图2) 描述了上述不等式,也即沿函数上任意一点作切线,函数始终位于切线上方。 @@ -147,7 +159,7 @@ $$\begin{equation}\label{FirstOrderConditionWhenNEquals1} f(y)\geqslant f(x)+f'(x)(y-x) \end{equation}$$ -  首先假设 $f$ 是凸函数,且 $x,y\in\dom f$。因为 $\dom f$ 是凸集(某个区间),对于任意 $00$,有 $f''(x)>0$。所以负熵函数是(严格)凸的。 -下面给出 $\mathbf{R}^n$ 上的一些例子。 +## $\mathbf{R}^n$ 上的例子 + +  下面给出 $\mathbf{R}^n$ 上的一些例子。 **范数**(*Norm*)。 $\mathbf{R}^n$ 上的任意范数均为凸函数。 @@ -374,8 +392,7 @@ $$ > \{x\in\mathbf{R}_{+}^{n}\mid G(x)\geqslant\alpha A(x)\} > $$ > -> 即使得几何平均至少大于等于算术平均的 $\alpha$ 倍的集合。此集合是凸集,因为它是凹函数 -$G(x)=\alpha A(x)$ 的 $0$-上水平集。事实上,这个每合是正齐次的,因此它是凸锥 +> 即使得几何平均至少大于等于算术平均的 $\alpha$ 倍的集合。此集合是凸集,因为它是凹函数 $G(x)=\alpha A(x)$ 的 $0$-上水平集。事实上,这个每合是正齐次的,因此它是凸锥 # 7. 上境图 @@ -385,13 +402,13 @@ $$ \{(x,f(x))\mid x\in\dom f\} $$ -它是 $\mathbf{R}^{n+1}$ 空间的一个子集。函数 $f:\mathbf{R}^n\to\mathbf{R}$ 的**上境图**(*epigraph*)定义为 +它是 $\mathbf{R}^{n+1}$ 空间的子集。函数 $f:\mathbf{R}^n\to\mathbf{R}$ 的**上境图**(*epigraph*)定义为 $$ \epi f=\{(x,t)\mid x\in\dom f,f(x)\leqslant t\} $$ -它也是 $\mathbf{R}^{n+1}$ 空间的一个子集。(“Epi”是之上的意思,所以上境图的英文 epigraph 是“在函数图像之上”的意思。)[图 5](#图5)说明了上境图的定义。 +它也是 $\mathbf{R}^{n+1}$ 空间的子集。(“Epi”是之上的意思,所以上境图的英文 epigraph 是“在函数图像之上”的意思。)[图 5](#图5)说明了上境图的定义。 @@ -434,13 +451,13 @@ $$ > > (函数图像如[图 3](#图3) 所示)。 -  关于凸函数的很多结果可以从几何的角度利用上境图并结合凸集的一些结论来证明(或理解),作为一个例子,考虑凸函数的一阶条件 +  关于凸函数的很多结果可以从几何的角度利用上境图并结合凸集的一些结论来证明(或理解),例如,考虑凸函数的一阶条件 $$ f(y)\geqslant f(x)+\nabla f(x)^\TT (y-x) $$ -其中函数 $f$ 是凸的,$x,y\in\dom f$。我们可以利用 $\epi f$ 从几何角度理解上述基本不等式。如果 $(y,t)\in\mathbf{epi}f$,有 +其中函数 $f$ 是凸的,$x,y\in\dom f$。我们可以利用 $\epi f$ 从几何角度理解上述基本不等式。如果 $(y,t)\in\epi f$,有 $$ t\geqslant f(y)\geqslant f(x)+\nabla f(x)^\TT (y-x) @@ -452,7 +469,7 @@ $$ (y,t)\in\epi f\implies\left[\begin{array}{c}\nabla f(x)\\-1\end{array}\right]^\TT \left(\left[\begin{array}{c}y\\t\end{array}\right]-\left[\begin{array}{c}x\\f(x)\end{array}\right]\right)\leqslant0 $$ -这意味着法向量为 $(\nabla f(x),-1)$ 的超平面在边界点 $(x,f(x))$ 支撑着 $\epi f$;如[图 6](#图6) 所示。 +这意味着法向量为 $(\nabla f(x),-1)$ 的超平面在边界点 $(x,f(x))$ 支撑着 $\epi f$,如[图 6](#图6) 所示。 @@ -481,10 +498,10 @@ $$ 扩展到更一般的情况,我们可以采用其支撑属于 $\dom f$ 的任意概率测度。如果 $x$ 是随机变量,事件 $x\in\dom f$ 发生的概率为 1,函数 $f$ 是凸函数,当相应的期望存在时,我们有 $$\begin{equation}\label{GeneralJensenInequality} - f(\mathbf{E}x)\leqslant\mathbf{E}f(x) + f(\mathbb{E}x)\leqslant\mathbb{E}f(x) \end{equation}$$ -设随机变量 $x$ 的可能取值为 $\{ x_1, x_2\}$ 相应地取值概率为 $\prob ( x= x_1) = \theta$,$\prob( x=x_2)=1-\theta$,则由一般形式 $\eqref{GeneralJensenInequality}$ 可以得到基本不等式 $\eqref{DefinitionOfConvexFunction}$。所以不等式 $eqref{GeneralJensenInequality}$ 可以刻画凸性:如果函数 $f$ 不是凸函数,那么存在随机变量 $x$,$x\in\dom f$ 以概率 $1$ 发生,使得 $f(\mathbf{E}x)>\mathbf{E}f(x)$。 +设随机变量 $x$ 的可能取值为 $\{ x_1, x_2\}$ 相应地取值概率为 $\prob ( x= x_1) = \theta$,$\prob( x=x_2)=1-\theta$,则由一般形式 $\eqref{GeneralJensenInequality}$ 可以得到基本不等式 $\eqref{DefinitionOfConvexFunction}$。所以不等式 $\eqref{GeneralJensenInequality}$ 可以刻画凸性:如果函数 $f$ 不是凸函数,那么存在随机变量 $x$,$x\in\dom f$ 以概率 $1$ 发生,使得 $f(\mathbb{E}x)>\mathbb{E}f(x)$。   上述所有不等式均被称为 **Jensen 不等式**(*Jensen’s inequality*),而实际上最初由 Jensen 提出的不等式相当简单 @@ -495,7 +512,7 @@ $$ > **注释** 我们可以这样理解式 $\eqref{GeneralJensenInequality}$。假设 $x\in\dom f\subseteq\mathbf{R}^n$,$z$ 是 $\mathbf{R}^n$ 中的随机变量,其均值为零,则有 > > $$ -> \mathbf{E}f(x+z)\geqslant f(x) +> \mathbb{E}f(x+z)\geqslant f(x) > $$ > > 因此,随机化或者扰动(即在自变量上增加一个零均值的随机变量)从平均效果上不会减小凸函数的值。 diff --git a/source/_posts/2024-07-03-josh-cvx-2-2.md b/source/_posts/2024-07-03-josh-cvx-2-2.md index c1e9ff5..e96c7c1 100644 --- a/source/_posts/2024-07-03-josh-cvx-2-2.md +++ b/source/_posts/2024-07-03-josh-cvx-2-2.md @@ -1,5 +1,5 @@ --- -title: Josh's Note — 凸优化
Part 2.1 凸函数—保凸运算 +title: Josh's Note — 凸优化
Part 2.2 凸函数—保凸运算 mathjax: true comments: true copyright: true @@ -18,19 +18,22 @@ categories: tags: - 凸优化 - 凸函数 + - 保凸运算 abbrlink: c3476904 date: 2024-07-03 23:04:33 --- $ \newcommand{\dd}{\mathrm{d}} +\newcommand{\TT}{\mathrm{T}} +\def\diag{\mathop{\bf diag}} \def\dom{\mathop{\bf dom}} \def\epi{\mathop{\bf epi}} $  本文讨论几种保持函数凸性或者凹性的运算,这样可以构造新的凸函数或者凹函数。首先从一些简单的运算开始,如求和、伸缩以及逐点上确界,之后再介绍一些更为复杂的运算(其中一些运算的特例即为简单运算)。 # 1. 非负加权求和 -  显然,如果函数 $f$ 是凸函数且 $\alpha\geqslant0$,则函数 $\alpha f$ 也为凸函数。如果函数 $f_1$ 和 $f_2$ 都是凸函数,则它们的和 $f_1+f_2$ 也是凸函数。将非负伸缩以及求和运算结合起来,可以看出,凸函数的集合本身是一个凸锥:凸函数的非负加权求和仍然是凸函数,即函数 +  显然,如果函数 $f$ 是凸函数且 $\alpha\geqslant0$,则函数 $\alpha f$ 也是凸函数。如果函数 $f_1$ 和 $f_2$ 都是凸函数,则它们的和 $f_1+f_2$ 也是凸函数。将非负伸缩以及求和运算结合起来,可以看出,凸函数的集合本身是一个凸锥:凸函数的非负加权求和仍然是凸函数,即函数 $$ f=w_1f_1+\cdots+w_mf_m @@ -38,17 +41,17 @@ $$ 是凸函数。类似地,凹函数的非负加权求和仍然是凹函数。严格凸(凹)函数的非负,非零加权求和是严格凸(凹)函数。 -  这个性质可以扩展至无限项的求和以及积分的情形。例如,如果固定任意 $y\in\mathcal{A}$,函数 $f(x,y)$ 关于 $x$ 是凸函数,且对任意 $y\in\mathcal{A}$,有$w(y)\geqslant0$,则函数 $g$ +  这个性质可以扩展至无限项的求和以及积分的情形。例如,如果对于每一个 $y\in\mathcal{A}$,函数 $f(x,y)$ 是关于 $x$ 的凸函数,且有 $w(y)\geqslant 0$,则函数 $$ g(x)=\int_{\mathcal{A}}w(y)f(x,y)\dd y $$ -关于$x$是凸函数(若此积分存在)。 +关于 $x$ 是凸函数(若此积分存在)。 -  我们可以很容易直接验证非负伸缩以及求和运算是保凸运算,或者可以根据相关的上境图得到此结论。例如,如果 $w\geqslant0$ 且 $f$ 是凸函数,有 +  可以很容易直接验证非负伸缩以及求和运算是保凸运算,或者可以根据相关的上境图得到此结论。例如,如果 $w\geqslant 0$ 且 $f$ 是凸函数,则有 $$ \epi (wf)=\left[\begin{array}{cc} @@ -57,27 +60,27 @@ I&0\\ \end{array}\right]\epi f $$ -因为凸集通过线性变换得到的像仍然是凸集,所以 $\epi(wf)$是凸集。 +因为凸集通过线性变换得到的像仍然是凸集,所以 $\epi(wf)$ 是凸集。 # 2. 复合仿射映射 -  假设函数 $f:\mathbf{R}^n\to\mathbf{R}$,$A\in\mathbf{R}^{n\times m}$,以及 $b\in\mathbf{R}^n$,定义 $g:\mathbf{R}^m\to\mathbf{R}$ 为 +  假设函数 $f:\mathbf{R}^n\to\mathbf{R}$,$A\in\mathbf{R}^{n\times m}$,$b\in\mathbf{R}^n$,定义 $g:\mathbf{R}^m\to\mathbf{R}$ 为 $$ g(x)=f(Ax+b) $$ -其中$\dom g=\{x\mid Ax+b\in\dom f\}$。若函数 $f$ 是凸函数,则函数 $g$ 是凸函数;如果函数 $f$ 是凹函数,那么函数 $g$ 是凹函数。 +其中 $\dom g=\{x\mid Ax+b\in\dom f\}$。若函数 $f$ 是凸函数,则函数 $g$ 是凸函数;若函数 $f$ 是凹函数,则函数 $g$ 是凹函数。 # 3. 逐点最大和逐点上确界 -  如果函数 $f_{1}$ 和 $f_{2}$ 均为凸函数,则二者的逐点最大函数 $f$ +  如果函数 $f_{1}$ 和 $f_{2}$ 均为凸函数,则二者的**逐点最大**(*pointwise maximum*)函数 $$ f(x)=\max\{f_1(x),f_2(x)\} $$ -其定义域为$\dom f=\dom f_1\cap\dom f_2$,仍然是凸函数。这个性质可以很容易验证:任取 $0\leqslant \theta \leqslant 1$ 以及 $x,y\in\dom f$,有 +其定义域为 $\dom f=\dom f_1\cap\dom f_2$,仍然是凸函数。这个性质很容易验证:任取 $0\leqslant \theta \leqslant 1$ 以及 $x,y\in\dom f$,有 $$\begin{aligned} f(\theta x+(1-\theta)y)&=\max\{f_1(\theta x+(1-\theta)y),f_2(\theta x+(1-\theta)y)\} @@ -96,3 +99,274 @@ f(x)=\max\{f_1(x),\cdots,f_m(x)\} $$ 仍然是凸函数。 + +> **举例** **分片线性函数**(*Piecewise-linear functions*)。函数 +> +> $$ +> f(x)=\max\left\{a_1^\TT x+b_1,\cdots,a_L^\TT x+b_L\right\} +> $$ +> +> 定义了一个(具有 $L$ 个或者更少的子区域)分片线性函数(实际上是仿射函数)。因为它是一系列仿射函数的逐点最大函数,所以它是凸函数。反之亦成立:任意具有 $L$ 个或者更少子区域的分片线性凸函数都可以表述成上述形式。 + +> **举例** **最大 $r$ 个分量之和**。对于任意 $x\in\mathbf{R}^n$,用 $x_{[i]}$ 表示 $x$ 中第 $i$ 大的分量,即将 $x$ 的分量按照非升序进行排列得到下式 +> +> $$ +> x_{[1]}\geqslant x_{[2]}\geqslant\cdots\geqslant x_{[n]} +> $$ +> +> 则对 $x$ 的最大 $r$ 个分量进行求和所得到的函数 +> +> $$ +> f(x)=\sum_{i=1}^rx_{[i]} +> $$ +> +> 是凸函数。事实上,此函数可以表述为 +> +> $$ +> f(x)=\sum_{i=1}^rx_{[i]}=\max\{x_{i_1}+\cdots+x_{i_r}\mid1\leqslant i_1 $$ +> +> 即从 $x$ 的分量中选取 $r$ 个不同分量进行求和的所有可能组合的最大值。因为函数 $f$ 是 $\displaystyle\frac{n!}{r!(n-r)!}$ 个线性函数的逐点最大,所以是凸函数。 +> +> 作为一个扩展,可以证明当 $w_1\geqslant w_2\geqslant\cdots\geqslant w_r\geqslant 0$ 时,函数 $\displaystyle\sum_{i=1}^rw_ix_{[i]}$ 是凸函数。 + +  逐点最大的性质可以扩展至无限个凸函数的逐点上确界。如果对于任意 $y\in\mathcal{A}$,函数 $f(x,y)$ 关于 $x$ 都是凸的,则函数 + +$$\begin{equation}\label{PointwiseMaximum} +g(x)=\sup_{y\in\mathcal{A}}f(x,y) +\end{equation}$$ + +关于 $x$ 亦是凸的。此时,函数 $g$ 的定义域为 + +$$ +\dom g=\{x\mid(x,y)\in\dom f\:\forall y\in\mathcal{A},\sup_{y\in\mathcal{A}}f(x,y)<\infty\} +$$ + +类似地,一系列凹函数的逐点下确界仍然是凹函数。 + +  从上境图的角度理解,一系列函数的逐点上确界函数对应着这些函数上境图的交集:对于函数 $f$,$g$ 以及式 $\eqref{PointwiseMaximum}$ 定义的 $\mathcal{A}$,有 + +$$ +\epi g=\bigcap_{y\in\mathcal{A}}\epi f(\:\cdot\:,y) +$$ + +因此,函数 $g$ 的凸性可由一系列凸集的交集仍然是凸集得到。 + +> **举例** **集合的支撑函数**。令集合 $C\subseteq\mathbf{R}^n$,且 $C\neq\emptyset$,定义集合 $C$ 的**支撑函数**(*support function*)$S_C$ 为 +> +> $$ +> S_C(x)=\sup\{x^\TT y\mid y\in C\} +> $$ +> +> (自然地,函数 $S_C$ 的定义域为 $\dom S_{C}=\left\{x\mid\sup_{y\in C}x^\TT y<\infty\right\}$)。 +> +> 对于任意 $y\in C$,$x^\TT y$ 是 $x$ 的线性函数,所以 $S_{C}$ 是一系列线性函数的逐点上确界函数,因此是凸函数。 + +> **举例** **到集合中最远点的距离**。令集合 $C\subseteq\mathbf{R}^n$,定义点 $x$ 与集合中最远点的距离(范数)为 +> +> $$ +> f(x)=\sup_{y\in C}\|x-y\| +> $$ +> +> 此函数是凸函数。为了说明这一点,我们注意到,对于任意 $y$,函数 $\|x-y\|$ 关于 $x$ 是凸函数。因为函数 $f$ 是一族凸函数(对应不同的 $y\in C$)的逐点上确界,所以是凸函数。 + +> **举例** **以权为变量的最小二乘代价函数**。令 $a_1,\cdots,a_n\in\mathbf{R}^m$,在加权最小二乘问题中我们对所有的 $x\in\mathbf{R}^m$ 极小化目标函数 $\displaystyle\sum_{i=1}^nw_i(a_i^\TT x-b_i)^2$。我们称 $w_i$ 为**权**(*weight*),并允许 $w_i$ 为负(则目标函数有可能无下界)。 +> +> 定义(最优)**加权最小二乘代价**(*weighted least-squares cost*)函数为 +> +> $$ +> g(w)=\inf_{x}\sum_{i=1}^{n}w_{i}(a_{i}^{\TT}x-b_{i})^{2} +> $$ +> +> 其定义域为 +> +> $$\dom g=\left\{w\,\middle|\,\inf_{x}\sum_{i=1}^{n}w_{i}(a_{i}^{\TT}x-b_{i})^{2}>-\infty\right\}$$ +> +> 因为函数 $g$ 是一族关于 $w$ 的线性函数的下确界(对应于不同的 $x\in\mathbf{R}^m$),它是 $w$ 的凹函数。 +> +> 至少在部分定义域上,我们可以得到函数 $g$ 的一个显式表达式。令 $W=\diag(w)$ 是一对角阵,其对角线元素为 $w_1,\cdots,w_n$,令 $A\in\mathbf{R}^{n\times m}$,其行向量为 $a_i^\TT$,有 +> +> $$ +> g(w)=\inf_{x}(Ax-b)^{\TT}W(Ax-b)=\inf_{x}(x^{\TT}A^{\TT}WAx-2b^{\TT}WAx+b^{\TT}Wb) +> $$ +> +> 从上式可以看出,若 $A^TWA\not\succeq0$,括号里的二次函数关于 $x$ 无下界,故 $g(w)=-\infty$,即 $w\not\in\dom g$。当 $A^\TT WA\succ0$ 时(即定义了一个严格的线性矩阵不等式),通过解析求解二次函数的极小值,可以得到函数 $g$ 的一个简单的表达式 +> +> $$\begin{aligned} +> g(w)&=b^{\TT}Wb-b^{\TT}WA(A^{\TT}WA)^{-1}A^{\TT}Wb +> \\ +> &=\sum_{i=1}^{n}w_{i}b_{i}^{2}-\sum_{i=1}^{n}w_{i}^{2}b_{i}^{2}a_{i}^{\TT}\left(\sum_{j=1}^{n}w_{j}a_{j}a_{j}^{\TT}\right)^{-1}a_{i} +> \end{aligned}$$ +> +> 从上述表达式并不能立即得到函数 $g$ 的凹性(不过可以从矩阵分式函数的凸性来推导函数 $g$ 的凹性)。 + +> **举例** **对称矩阵的最大特征值**。 定义函数 $f(X)=\lambda_{\max}(X)$,其定义域为 $\dom f=\mathbf{S}^m$,它是凸函数。为了说明这一点,我们将 $f$ 表述为 +> +> $$ +> f(X)=\sup\{y^\TT Xy\mid\|y\|_2=1\} +> $$ +> +> 即针对不同的 $y\in\mathbf{R}^m$ 关于 $X$ 的一族线性函数(即$y^\TT Xy$)的逐点上确界。 + +> **举例** **矩阵范数**。考虑函数 $f(X)=\|X\|_2$,其定义域为 $\dom f=\mathbf{R}^{p\times q}$,其中 $\|\cdot\|_2$ 表示谱范数或者最大奇异值。函数 $f$ 可以表述为 +> +> $$ +> f(X)=\sup\{u^{\TT}Xv\mid\|u\|_{2}=1,\|v\|_{2}=1\} +> $$ +> +> 由于它是 $X$ 的一族线性函数的逐点上确界,所以是凸函数。 +> +> 作为一个推广,假设 $\|\cdot\|_a$和$\|\cdot\|_b$ 分别是 $\mathbf{R}^p$ 和 $\mathbf{R}^q$ 上的范数,定义矩阵 $X\in\mathbf{R}^{p\times q}$ 的诱导范数为 +> +> $$ +> \|X\|_{a,b}=\sup_{v\neq0}\frac{\|Xv\|_{a}}{\|v\|_{b}} +> $$ + +## 3.1 表示成一族仿射函数的逐点上确界 + +  上述例子描述了一个建立函数凸性的好方法:将函数表示为一族仿射函数的逐点上确界。除了一个技术条件,反过来也是成立的:几乎所有的凸函数都可以表示成一族仿射函数的逐点上确界。例如,如果函数 $f:\mathbf{R}^n\to\mathbf{R}$ 是凸函数,其定义域为 $\dom f=\mathbf{R}^n$,我们有 + +$$ +f(x)=\sup\{g(x)\mid g\:\text{仿射},\:g(z)\leqslant f(z)\:\forall z\} +$$ + +换言之,函数 $f$ 是它所有的仿射全局下估计的逐点上确界。下面我们将证明这个结论。 + +  设函数 $f$ 是凸函数,定义域为 $\dom f=\mathbf{R}^{n}$ ,显然下面的不等式成立 + +$$ +f ( x ) \geqslant \sup \{g ( x ) \mid g\:\text{仿射}, \ g ( z ) \leqslant f ( z ) \ \forall z \}, +$$ + +因为函数 $g$ 是函数 $f$ 的任意仿射下估计,我们有 $g ( x ) \leqslant f ( x )$。为了建立等式,我们说明,对于任意 $x \in\mathbf{R}^{n}$,存在仿射函数 $g$ 是函数 $f$ 的全局下估计,并且满足 $g ( x )=f ( x )$。 + +  毫无疑问,函数 $f$ 的上境图是凸集,因此我们在点 $( x, f ( x ) )$ 处可以找到此凸集的支撑超平面,即存在 $a \in\mathbf{R}^{n}$,$\; b \in\mathbf{R}$ 且 $( a, b ) \neq0$,使得对任意 $( z, t ) \in\epi f$,有 + +$$ +\left[ \begin{array} {c} a \\ b \\ \end{array} \right]^{\TT} \left[ \begin{array} {c} {x-z} \\ {f ( x )-t} \\ \end{array} \right] \leqslant0. +$$ + +即对任意 $z\in\dom f=\mathbf{R}^n$ 以及所有 $s\geqslant0$($(z,t)\in\mathbf{epi}f$ 等价于存在 $s\geqslant0$ 使得 $t=f(z)+s$),下式成立 + +$$\begin{equation}\label{ProofOfAffineFunctionRepresentation} + a^\TT(x-z)+b(f(x)-f(z)-s)\leqslant0 +\end{equation} +$$ + +为了保证不等式 $\eqref{ProofOfAffineFunctionRepresentation}$ 对所有的 $s\geqslant0$ 均成立,必须有 $b\geqslant0$。如果 $b=0$,对所有的$z\in\mathbf{R}^n$,不等式 $\eqref{ProofOfAffineFunctionRepresentation}$ 可以简化为 $a^\TT(x-z)\leqslant0$,这意味着 $a=0$,于是和假设 $(a,b)\neq0$ 矛盾。因此 $b>0$,即支撑超平面不是竖直的。 + +  我们知道 $b>0$,因此,对任意 $z$,令 $s=0$,式 $\eqref{ProofOfAffineFunctionRepresentation}$ 可以重新表述为 + +$$ +g(z)=f(x)+(a/b)^{T}(x-z)\leqslant f(z) +$$ + +由此说明函数 $g$ 是函数 $f$ 的一个仿射下估计,并且满足 $g(x)=f(x)$。 + +# 4. 复合 + +  本节给定函数 $h:\mathbf{R}^k\to\mathbf{R}$ 以及 $g:\mathbf{R}^n\to\mathbf{R}^k$,定义复合函数 $f=h\circ g:\mathbf{R}^n\to\mathbf{R}$ +为 + +$$ +f(x)=h(g(x)),\quad\dom f=\{x\in\dom g\mid g(x)\in\dom h\} +$$ + +我们考虑当函数 $f$ 保凸或者保凹时,函数 $h$ 和 $g$ 必须满足的条件。 + +## 4.1 标量复合 + +  首先考虑 $k=1$ 的情况,即 $h:\mathbf{R}\to\mathbf{R}$,$g:\mathbf{R}^n\to\mathbf{R}$。仅考虑 $n=1$ 的情况(事实上,将函数限定在与其定义域相交的任意直线上得到的函数决定了原函数的凸性)。 + +  为了找出复合规律,首先假设函数 $h$ 和 $g$ 是二次可微的,且 $\dom g= \dom h= \mathbf{R}$。在上述假设下,函数 $f$ 是凸的等价于 $f^{\prime\prime}\geqslant 0$(即对所有的 $x\in\mathbf{R}$,$f^{\prime\prime}(x)\geqslant 0$)。 + +  复合函数$f=h\circ g$的二阶导数为 + +$$\begin{equation}\label{SecondDerivativeOfCompositionFunction} + f''(x)=h''(g(x))g'(x)^2+h'(g(x))g''(x) +\end{equation}$$ + +假设函数 $g$ 是凸函数($g^{\prime\prime}\geqslant 0$),函数 $h$ 是凸函数且非减(即$h^{\prime\prime}\geqslant0$ 且 $h^{\prime}\geqslant0$),从式 $\eqref{SecondDerivativeOfCompositionFunction}$ 可以得出 $f^{\prime\prime}\geqslant 0$,即函数 $f$ 是凸函数。类似地,由式 $\eqref{SecondDerivativeOfCompositionFunction}$ 可以得出如下结论 + +$$\begin{equation}\label{Conclusion1}\begin{aligned} + 如果\,h\,是凸函数且非减,g\,是凸函数,则\,f\,是凸函数,\\ + 如果\,h\,是凸函数且非增,g\,是凹函数,则\,f\,是凸函数,\\ + 如果\,h\,是凹函数且非减,g\,是凹函数,则\,f\,是凹函数,\\ + 如果\,h\,是凹函数且非增,g\,是凸函数,则\,f\,是凹函数。 +\end{aligned}\end{equation}$$ + +上述结论在函数 $g$ 和 $h$ 二次可微且定义域均为 $\mathbf{R}$ 时成立。事实上,对于更一般的情况,如 $n>1$,不再假设函数 $h$ 和 $g$ 可微或者 $\dom g=\mathbf{R}^n$,$\dom h=\mathbf{R}$,一些相似的复合规则仍然成立 + +$$\begin{equation}\label{Conclusion2}\begin{aligned} + 如果\,h\,是凸函数且\,\tilde{h}\,非减,\,g\,是凸函数,则\,f\,是凸函数,\\ + 如果\,h\,是凸函数且\,\tilde{h}\,非增,\,g\,是凹函数,则\,f\,是凸函数,\\ + 如果\,h\,是凹函数且\,\tilde{h}\,非减,\,g\,是凹函数,则\,f\,是凹函数,\\ + 如果\,h\,是凹函数且\,\tilde{h}\,非增,\,g\,是凸函数,则\,f\,是凹函数。 +\end{aligned}\end{equation}$$ + +其中,$\tilde{h}$ 表示函数 $h$ 的扩展值延伸,若点不在 $\dom h$内,对其赋值 $\infty$(若 $h$ 是凸函数)或者$-\infty$(若 $h$ 是凹函数)。这些结论和式 $\eqref{Conclusion1}$ 中的结论的唯一不同是我们要求**扩展值延伸**(*extended-value extension*)$\tilde{h}$ 在整个 $\mathbf{R}$ 上非增或者非减。 + +  为了更好地理解式 $\eqref{Conclusion2}$ 中的结论,假设 $h$ 是凸函数,所以 $\tilde{h}$ 在定义域 $\dom h$ 外取值为$\infty$。$\tilde{h}$ 非减意味着对于任意 $x,y\in\mathbf{R}$,$x + +![图 7. **左**:函数 $x^2$,其定义域为 $\mathbf{R}_+$,在其定义域内是凸且非减的,但是其扩展值延伸不是非减的。**右**:函数 $\max\{x,0\}^2$,其定义域为 $\mathbf{R}$,函数是凸函数,且其扩展值延伸是非减的。](../images/post/2024-07-03-josh-cvx-2-2/2024-07-03-josh-cvx-2-2-070-ExtendedValueExtension.png){width=700px} + +> **举例** 通过一些简单例子,我们可以更好地理解复合定理中函数 $h$ 需要满足的条件。 +> +> - 函数 $h(x)=\log x$,定义域为 $\dom h=\mathbf{R}_{++}$,为凹函数且 $\tilde{h}$ 非减。 +> - 函数 $h(x)=x^1/2$,定义域为 $\dom h=\mathbf{R}_+$,为凹函数且 $\tilde{h}$ 非减。 +> - 函数 $h(x)=x^{3/2}$,定义域为 $\dom h=\mathbf{R}_+$,为凸函数,但是不满足 $\tilde{h}$ 非减的条件。例如,$\tilde{\tilde{h}}(-1)=\infty$ 但 $\tilde{h}(1)=1$。 +> - 当 $x\geqslant 0$ 时,$h(x)=x^3/2$,当 $x<0$ 时 $h(x)=0$,定义域为 $\dom h=\mathbf{R}$,$h$ 是凸函数且满足 $\tilde{h}$ 非减的条件。 + +  即使不假设可微并运用表达式 $\eqref{SecondDerivativeOfCompositionFunction}$,也可以直接证明复合函数结论式 $\eqref{Conclusion2}$。作为一个例子,我们证明如下结论:如果 $g$ 是凸函数,$h$ 是凸函数且 $\tilde{h}$ 非减,则 $f=h\circ g$ 是凸函数。假设 $x,y\in\dom f$,$0\leqslant\theta\leqslant1$。由 $x,y\in\dom f$,有 $x,y\in\dom g$ 且 $g( x)$, $g( y) \in \dom h$。因为 $\dom g$ 是凸集,有 $\theta x+(1-\theta)y\in\dom g$,由函数 $g$ 的凸性可得 + +$$\begin{equation}\label{ConvexityOfFunctionG} + g(\theta x+(1-\theta)y)\leqslant\theta g(x)+(1-\theta)g(y) +\end{equation} +$$ + +由 $g(x),g(y)\in\dom h$ 可得 $\theta g(x)+(1-\theta)g(y)\in\dom h$,即式 $\eqref{ConvexityOfFunctionG}$ 的右端在 $\dom h$ 内。根据假设 $\tilde{h}$ 是非减的,可以理解为其定义域在负方向上无限延伸。由式 $\eqref{ConvexityOfFunctionG}$ 的右端在 $\dom h$ 内,我们知道其左侧仍在定义域内,即 $g(\theta x+(1-\theta)y)\in\dom h$,因此 $\dom f$ 是凸集。 + +  根据前提条件,$\tilde{h}$ 非减,利用不等式 $\eqref{ConvexityOfFunctionG}$,有 + +$$\begin{equation}\label{NondecreasingOfFunctionH} + h(g(\theta x+(1-\theta)y))\leqslant h(\theta g(x)+(1-\theta)g(y)) +\end{equation} +$$ + +由函数 $h$ 的凸性可得 + +$$\begin{equation}\label{ConvexityOfFunctionH} + h(\theta g(x)+(1-\theta)g(y))\leqslant\theta h(g(x))+(1-\theta)h(g(y)) +\end{equation} +$$ + +综合式 $\eqref{NondecreasingOfFunctionH}$ 和式 $\eqref{ConvexityOfFunctionH}$ 可得 + +$$ +h(g(\theta x+(1-\theta)y))\leqslant\theta h(g(x))+(1-\theta)h(g(y)) +$$ + +复合定理得证。 + +> **举例** 简单的复合结论。 +> +> - 如果 $g$ 是凸函数则 $\exp g(x)$ 是凸函数。 +> - 如果 $g$ 是凹函数且大于零,则 $\log g(x)$ 是凹函数。 +> - 如果 $g$ 是凹函数且大于零,则 $1/g(x)$是凸函数。 +> - 如果 $g$ 是凸函数且不小于零,$p\geqslant1$,则 $g(x)^p$ 是凸函数。 +> - 如果 $g$ 是凸函数,则 $-\log(-g(x))$ 在 $\{x\mid g(x)<0\}$ 上是凸函数。 + +> **注释** 扩展值延伸 $\tilde{h}$ 的单调性要求必须满足,注意到是 $\tilde{h}$,而不仅仅是 $h$。例如,考虑 $g( x) = x^2$,$\dom g = \mathbf{R}$,$h( x) = 0$,$\dom h= [ 1, 2]$ 复合的情形。此时 $g$ 是凸函数,$h$ 是凸函数且非减,但是函数 $f=h\circ g$ +> +> $$ +> f(x)=0,\quad\mathbf{dom}f=[-\sqrt{2},-1]\:\cup\:[1,\sqrt{2}] +> $$ +> +> 不是凸函数,因为其定义域非凸。当然,此时函数 $\tilde{h}$ 不是非减的。 + +# 参考文献 + +1. Stephen P. Boyd and Lieven Vandenberghe, *Convex optimization*. Cambridge, UK: Cambridge University Press, 2004. +2. Stephen P. Boyd and Lieven Vandenberghe, *凸优化*. 北京: 清华大学出版社, 2013. diff --git a/source/images/post/2024-07-03-josh-cvx-2-2/2024-07-03-josh-cvx-2-2-070-ExtendedValueExtension.png b/source/images/post/2024-07-03-josh-cvx-2-2/2024-07-03-josh-cvx-2-2-070-ExtendedValueExtension.png new file mode 100644 index 0000000000000000000000000000000000000000..c3727a5d8c97e6857d5face936c4cccf52e569d7 GIT binary patch literal 36746 zcmb4rc{r49`@i&PA!$*HqV!0qC`*#iqLelJZps=H%DyzFU8zV}k}YH`W673%DOsW@ zW64etW2do=?R(xcb5HN{`|tN0$9v?Rx#zmCKX!m7G%4Se#ni$aEf*59~j=*+?*x)1r^Dvx*tHx`!LESD6|=y*hocCL?5oBp+O zQ=&4;s`-n-3n^^%_SP5i{~ABhYW|ozr%SEWkN?+*`+Q7nkj}czLcu8y4rDr>ldx`6 zv68mvQkdn<{PIdx!hLL@tKL&iAfV;f$`U^7%XqlVfJc3pv(tKbKl0xd6H$@?{ZDv# z#&*V^i>ww$7=O;Ksx)H!IkEa_4&%?BwL7q@=zo`S9c^Z%|9M;BN(vj}357BP4#uB8 z|1&Vl|Ifgdo+)y?vfAz~hhrYrU%&i9T0szoEPK4spkriDvb6@L^yJi3=; zF*=EnzBcA;svCFhxl=#8-sgpoK@as?mhkoM)o*uQ`ZhExpufP*reTH|(5enD&pFsi zQ9|asRaCxtzp<BG>c>+4Q0L7_P*s>85Rg!l8HX-tFLdL0k4|>s`%J>GBN`I~}o$ zSpnBhw`@<=IXr9F(n9-M-EA^srpKkz^Rk10t_z8s$>pW7B3PTSk+ zh^;rh@;$GbZt+S|)=iEJ$z4_|Pq>woDp7do)Fb4PGIHj`m$rX#5_wx_JJlmpwSC5% zwyU)Ne}$L!j|qMI%W41ge57slj!N1;JhbyFJ4*W}kA5}}k0D1?_JB5tqfcr7h|;Eg z`zr098&_$s*kFPDbNk8nj2V)Kf^MYK~n~@?o>$ zy$K%9DQd&r`9#^Vyz;r|OM-%ev8U5K|NOQ!vw5~tq7vKk;6hc~^XHrTYeO~8KiMvq zP+fgdH(BTLBdywKh0>F5BZ+m9vRgNA_B2UQj})zTjqE>}URLUXO?l?$r!_s)L|Sxr zq}J~XRHzvE2VNhaotBZTmzsQ+jl*lS;M<@}EOsztZm;CFnMlg1~oywJVEyOMQ5QBkok$iyObn77V&2lft2 znSqL;V%Okj;bPFA$N~1E{9oWZ@4itWkkkN*%YB-YH@zG$|7y0nfBUWOh ztb6jsKtZD{Yfg(JJ(5pz6cvLyO&rs3OVceou}j?a*It<(j0;Fs2^DR7Z_kH3w|DPe z+N1p;qNd3|E1nF`P5$DQy!Kph-#*&vDvglsFFPnNZ}$EB_qJ@?mkSCK&8!>Ck#)6_ z#|p>Y@crEt(<^3Pf*|=^YReQU3fn zLG;I>d5Wn-;?J;*_n(R};?1lwPmyiQG|G4C&%WN8DKWrZX|&=p@{*rjR<60(LyK=G zZMPOPWyg!OHRR{}!iL2Zc3`=#jYamd*SHRuPrdLT$Kto+ongNvXd4r3{q=Rch;DL( zv-;JPX{CcyS0`-0N^!|X(eL`v0(EWapOBqU400a*kx{<%C?nd3O8zn(8c@}?udQ%s z>ycLq8qU@w2}v(84ROV3nvb7r^Sl^yQX*arP@4YP=T7PRBJ)}re@EUhLuKWy5YOf{95zg!uskR5H-c{nb%qu0o>!M=ZyM0W>HWZk;3f@~OE~yLF z2+bW#5XSgule$(;3;1N8=8!i`&5PT)GK8!_QBkJlTg*Avh0)w-=cWGkj2Xp5!vZeNA?cSYgQRN?rY>d>AOWksMYM$q&4q%q=isVpIPt#5|EXs#!+v!45vyIZ;fgP=+onzlp$>NmC ztQ2KFV23l9uU#}n6xWVd4$gM!uaT@j_%z4O0^TJkIOQYfMfvt<^S*|nWw536Cr{Zo zrx=Rpr$uOKHTdk@W|7)Sm)oND_xA1F+qeJjvT6XsdV*#KJdNTmJfqCCJ0^I;9_D~T z!ej&8z2|y;n~J?>UDBB=6Vx!uu?vokjSY&3h!~T3z}$we+Ubv7TJg$YPu0j~c+j(r zG=Yq2B){VVsLC0U$TR_U!Lie&-k#F zPj~VZ|6Q5*5E!vWusSb#|M&g2-($~uM%qQ@xMzO z>MYEC$jKMd`}Z7NG6-tnzxlD+T3X_#5{@>vJ)@hxg?zIE+j)7D@87?_;qOMoKG7}p z!GR4V#UX0J*xk(TrP=OupCziN%ip!dxA0(Y#ehvaBqP)MpQl^8ioH8qT8!UcpB(&a zaFo+UO$)9yCTj9W|CNWJ;!6MB#N+mD9=HBytfSpVV>hbk!%+{gs>=FAg42oiK5$Q$C+wai9X};xjopDPmfXt(R^V zne@M_>-s9)onjM>JFfkAodD|2IM<#2G4(X@qC@S7xo*#%-HT^3O1Nwz- z_PCi=n=twR*<);{dpC|(-0~uUxx+Qq-lgAVS36#QrWGTyOH-Y*;A!LCuj}QPcKnp~ zN#R+@(aPC!RYdEsa%hWf`btUu*$l!;Zp`fwaF2RPTJhr3hf_%mZ8{#3XOUqx)T$UP zdL%aXm~P`wg><`lhi;z@8Cb&bXIb8)#rO)H6Ou;3yxmC&zf)S|73R8qA7yrfOm5q` zGikIv*M^FoPwe%eymMJzq1x4-U)rQ)iQJlgX~aJe9&mNMLDO#A*4Q_KoRowmf;#qjy=OJ`d!^3WUQg2m`@Vl_e{hzFL`X~hVK@&6-V%T4wS*~b}eb9Axz6t z}%wHrlJW);F3=_=ec&e|CTVm{;b`JpV-+>9&f#;`t=t=iPtWQK4`q9 zb7&@PrTZ~!LJqb?X+>DIs;O)lEYy?4U+uPi_26DDfAymMkx z8V)%a9z16e`~Ir{VWa*9;_1tx+w5dDWfyz!!h$fD$B&aQ$J{M}6(44bK+yEe5rJ6V zy|yMj12yS<`^V~fyA{r0qij>orge+qx5}07)l}G@(lFsQUw>;?er+c);Mdocam72N zdtCB~-s8p6wWvi6v|l<}OccD=kQc&HqKX@+=${xb)#n&HlHMVVFMU%jOX-SwxzgFi z^{#72omzHh-^^-~_)V#LskCibB4D8TMHTqkbG^O2Z8=!|5T^9ED=#iv<%n)~ z`H*9BS8y~n>NmHRsw~$CqsaNR)Q@(OQ-`9ARk(Yk96Agf zOXjUZ{;Gibbr&rpjulOM zx$dNd=#3s*D&=C+I_JAl7bGLg6*YRTE%K?n?dn2*qNJLCizSG@EUBFwSRVH*CC1)W z$K5He+e*~Jmv$PRx_a9oza-MjKZ5vdJz-^bZ|n#K>}{fIn7FdCa?KReUbc$4O&@-? zdj=zSqHm{~S$6AM_tXDg8?Am=GrX*FepQZ_=OMA^H`n_M*14EoOfxG!Y0NyfNFlrS zP{-kUC4t7Wn7HX>KU4Xq=Sfjnqx28glX-|1!gL2WBF@hd7HxG=_d~GsuWk5)`lFJuHm=Ok14Jh;-Q#d?xM%JbqN9fA;KMb93`-h*Ym*P;XE5p|24jUrzSV^NlFW7#mP#_z3_b5lesRk)XywJxZDOW|(`_9w ztM+v@G}x~vFY>N8lACnseC~C`y(zfK<@|iDuE>7ntLHhAdaR12gva^<+H(yts-72S z-SgF5MKEcD-|p6gk8gQ!9z!@Z^uA$qMf&VZ`6c=3ej+*e&9wHItaGQw^0@2g;CmD+ z|IX0@joOEemme({iI%2$+e(b{@5xL7Kc%LR!R6>PP39jVyV{RDjagTpPDT50INsPB zoZPPGP8o|cGi^&U%u&(C5c<8&Ij)z&^~mA)@XP5h-=qtq$DPWr^9mnt-Bxlb&iYhp zTFyRo(_L!^^sgn=B)8{f@ajC#jOoe3-|`8*)@Uq-4_oHgZ!X;R<`#L;>`Y9q=gpL7 zEwR4XnvRB4WCS2)1)TAviVerq?JJ;dngJ6bBmuABCQ8OHy{e;v;4oKF{x!f<0 zQ`@p7nf;k;vUjxn(9POuJA({C6cMjZEQB`f+rf(ASfP=@YA5~0okCeZwi;=C>GbI8jLo1@zk2KZc|lSTRje=$Xs*d~#uxucw;q1hB0Lno*`0V*@#HV- z59|duzYSBb|7msXRBKG@PbWG?US^AwD=^d2byr)yFll>hWTC|L&B2#uO+Pjl>nMzL zbk`PIj0Ut7Ti@xzd;1YoWm?0g@P<4pUC=Zjl}?|L|;^Yx5?51m-OnKR?OlAM&BNqieB*ca8FTd46(|R98GN;&iQ=K6*s9p&R^|%$wKagZB1#5 zlVfoLSE%EqU%!N6PuoKD4uR|I7N(p!3k?=tiqsLDZRP3KAD*o6ZdjV+GqX=me1jL8 z!g3l$)Jc^1e50fV4w$4AiWRBkG&x6)tIj&Kej0Ul#pEmwEXTh&?aKKo_m^OI)XY6X zr(0L`aDT>3#7}FYjp~h|-TRBxak6hF@uA$0Dk>{Q1O?ARs_>@`HL5NS-Z_>A`?kpq z`#1Nz^7k5Tr|>(!(^nB75?K?{!|r}`EkD#9FQHmFH0{PFy2I{IaH;OE&;<9~kUx)KY)+?tt%!JqCA#*AZ>u>CSv?$Jc)_X*P$za(eJv}{T` z#~Lx~{E~i!7m6?Dxz&?XYwy)BJvlQrHEXvVMe$LOu%3P@Gca58Ipg@%>6gjjUi!+* z!I z*BFoGGun$y;)!Q;l^Oi?I2(^p`bML_O{|li%B#)ZUWk!~XhB z(R$pY9gyxfcI?nSo8c{*djLfdnfK94b9!DztQ=V&KKN6%a z^7^C$X0m6%RzCL5fjAS##8i4j#*xlUHf@wU-h{Su%gz?Qnrb9XI5rd#XI#9c;*2S! z3gdm#m~ z|ASivZX3jS_GKoenHCnL`xZZ@dq{Duk-{OTWeKZ4W<;Lcf34@7@vmCdLZjy03imwd zI;ra|3NH!B!O88!YAkomugExFbnC3}8Xf!-MVuKAnC&#+ORwio45I#g7CR)_FWB9n zknK9-~PExuDyqI@`7(VpLV)KJX!YiiBv(u=>I)RUj) zsGQn?#di>A#~zB^#B?kS zMB}}tndVNjqexx^*Oi;V_P}lOT2DtV1)t3C)Lh~6Rf*(b;ow%;CXllftXG5YV)IE8 z+)c5*ZluuVYhnM>y0}qrI;_BRXy~)l&d%bqL2hX=Zd3}{OaaXa)N}1Wau)OzVTCl- z)(LbKn)cer4ZJVo+}f~1GfSd*|FzEQhe__~QLZ?>BJYzHnOs$Eb7GS3oW>+tLL5hq zuZ+KVRP=I~H%TK}-mDbOn^m)y`t@u&HE(+LTu)h!!!)RfnHKRx4<N2I(5BcVCBb^q=~&HKK$Vh23rEC-goHeo(BSA~ zll+mLI-@C7TJiGunW-6Gs(EFLQ`|~=(#N`jx*F%{i>ZY@LdLB-v3Q*kti9OcNAE6c z-eQ^5@t;$j2H|;DDMnE~`38}~6e&b*1X~DO`1wJ2+&q`i{hq=>u#hsw<}PcQ)WPOr zTRYI;@x)=KvJH<}yfK5>lswcc8U6BiA)?do@EFnNpXcp=_nQYja44SEll${ULdFS= zgd;`NoxOtddIB{K4<69CYT9L=96Fw|r0LyVA~U^n#RlJ7eCGlHzZ~NweAt!Z$_-kR zV-nN%z%VNIJu?v-vv19`@;5<4v=Xs1SS1tO2hje`@+a~SY;zA%?#g0^?S9y0 zxi?p;lRaQ6!TbiFYAX(q?Ax+0Az^4YekF1r8WMj``YD+{ZpHI7$1}~V0~y9KrBkk# z%2D#9cG~Cuu?yoVYTu;Gha)}n4gP$$E&ez35o<=WF41oCXN8Ot3J8Q$Q^nq#IAVx?awV_lIZ9jD$YfrdcKJnZLuTWG%nPX-K@?{UcGJ zAwl_DZoNrd(SX95n5ok^{_)iAectscrVBbt9F7|fv>FQ#JS}dgSGF0bkt3*h?J;)V ziG#?Y#e_-NB%gi2u6*gz=Rh>N{;c@eSa_&XaG-ni#TtXJo-qGomB6!{$KlgI4aIo8&9{La{*q(ge*D41hj!y##WHTpgLCNiQ_?;3Z;L19 zhrH*~uN<)=8=I78P3^h&MFu0V`Fqa0g%N&$8V6Li&DF2q@(p@tUc;V0N=ZC(Z_VrD z_D259EcAkMN3yi6Qk3`R-Q39=9Y-b>TOO?_r+0gYJK$ZcdFvh2yi-PheKz1Ly~w3g zgB!zay!)}qr{T9tiSAb=3$P|U9DZXlTpqBCnSuM1hTgY3)P83M7pm(qSdV+G1H~$D zil|~=K6Sj=46@wsI;mjgTjIEsgAT-O6;|*2!E_GEI7~pJRA_{^(uF{<_8xpUj4H5AiND8` z4)!@t1lfq~;9w_x)poO*!;X8T6V2QEd+=}IJ?`wQ+5rHs;vFkV3+%wD>3<2{$1{7Pe0@ZqDf}XGu9Ks z`|bV^r4NooRN1p74SvRc$swCrP_0v3i%kyipYAsg?UK3|`ed`=Hv~IMi1sMyv~AWiNz z4bO9Z=oM1yJoe{ntPy#>pJ!p$LBNuAF`I*2Ws?P=Y;7yUn&v>OI z9lMHlG2Mpfft$qNT*XL=?^+yO8sWf8^$&4W!0U7pIiuAZ;v$n1Z+uG(TqI;*q|`F# zTT^Fr%g0o5@x=9LJ$WAAad;Xn4Kb9cRti>BVS>9pe0*>l#4*sS?$drOk-5^wS* zZG*i@-9p?(qt?$BJ%-PZiKP37}- zREN|zXRR8u>km<#^u1bC6$bA`2?eiEaymQ%%4)U+8GClFjBJs@jkRwWmqcbC|FMlxu+?Ak2Q=&CFSa^&ynmUv;)ql+Iu-;`TWRPFH zyJo7FGYaqo8|Ktthi){`^`Ov72+K|_Oe;ULfy%>;q4`P88ki-H7hzU=A$IGAzvx-b(2;_ zZR|F)e@mzOKBo(AJ|<#3ZP)q3;<=fJ;{!MAxsfFov!n0-HJdcvj;-11PW zU(nZ=WAfqKf#AdX=bp9CHono+p6-YI(PZh2M8P(9{B<_=ZF=9o9X+oYSrBrFe_PDE zmn}}A+)x4%Uh#}eXtDB6S(*iPU>}t{U-)#TP%w5x(z1F}r_aKud_EfTj2vFdXkM%e znO_E1@W@WSKrqsg=ih>NR<$7qPo6ZY3J{q6jE4Drg$;bz)qf^et(2IgylYeMsQhF1 znDs=9hf$HoP4M^?!pwt;Y?W%RENRs|-+{lBl(uq&^GoU5=V1kIqsdhQ_zoM?h6avj z+Je)5O%mfd)Nvtw;>4lY+YXC!lXe|>8THJpPL|_a#&NfJ!l|}%rd}HwhE?3+yIeOX zc;dvISGu*{OiCEl?%Pyd{@$^BjK5`h?iW`y(^Z!oI$G6s|48&u{6gW-jC{Ei&i>XA zzEo{%o7qpFe?G>Wc70b@m^<bOO>X6VG8{u)!WS=`6&!bhz6`OX8$Q1?_;SD*RsODom&7VhTPne_O+$D6iq!Rvf% z2_ULRnbhbzKMJv&Gnb0h&hJtk=2gpe=o})U4z=2yt;-<%-O%Gk_YHY9sZO&#DRVDZ zmZA*hbj9cTaymJGGHB3bsU1-+dLp*pA}2AEqN(m6LmS* zQA*J{_urwaPin7!h^pq78{2-dTUq+?_`omug%OF_Cl&s?WPXyEmN9Bew%uHlNRU|c zRODfeF_Qtap6J8wQQ9kqyM>-fnycLvxb?+`hj@OaP&p>l{Ts)VyLrk8{@mJ^6SiPX(iDcyN7d{=b;{tLq`>9g~wzy@Vi3}^W!C-soA`8|Kq`|k$HIu7NS^fvS6 zHr1Oo2Im=$yBr~YGr~#s6HS#b{)iEa!p6N4Y;vjh=JO2Nrg^(1!$JwEMaVN#gpq@1 zFbbOb^XC}VSV^6$n>9uFx5mBtsp+?lL-+f~2ReK3W)J$((}kBDQsfLjUcgaQ-KEmF z<0d9{=sGxs^M~i3Sy08Ba9>u7I%NoXlQc8x?!P{1L@C==6Z$_kXiDpRg69$UNVATg zHWsPGV&ZgN&&Fiu`FLT48S&(%)6?bZ6(}Y+7Dg!16&*6(7zWN6V^FVOLa~>GL{gPi}}04hpjDLuFY|(8;Jh*HPcn^6kQk z)E%_i?_JRQkdM-aP2VYt+Pg=OBATJP>e6nXyR#5AE|04HL&Pv+%gHNuRV8j-8A{&C8a}Y(B%ysm`S_ zGeGb-?u7=wn>WkEfBK{dB~nd{&wM;H+<5$mwG>=(fs!Oz?Sd(gM{~Q83acu{2O&Hl zg;?$%qis1VP}cQ(_Dl+=3{~D;v?{MmJYwH#f({bIkRq=zQod#%iMlm)sncsXm7pOE zWo|~DSvdRJcfsHTnrFdsO5^5{+U;f-L$l}iNuNT|e@*LCrq}*`xG~LCws_(r2SKd3 z1Feg*cSPZ43{CM%(*zA68)k|1x+5HppPyet%sF3Gj8{HdJm!8S^zXlkU`K#Q5l`0s zypuV4d*RYdyOjB-b)-;J7>8bK=6+SYOogQDT@0C2EyJv&AJ6q!@_O*#0U5$HNnESz z8nn)NCk&eyDUU1o@6!VXb!1XP09hr?nK`h>5rcQ9t!jcaot!fN^Yr`ee0;=-i5sxD zwG^QicqyF#z+MClmAIR~D#PR-nA}E-JQ7>*qtJKx+w`|$c5wHWw&S7MgR7vJ`p8#@$%Dpw5;<%xUJb$0wuMw5v zH9Zto@WeN!kgoOFk7GK#Tl~3N7or zz*B|ETUkD0?zRf}yvtDBUZkcO0d0)V2UsiwLW2nKc7Wa?j;pEO#GFeAa%7Xgs=`Z( zYJe3%Cub~o){2#;VAG46Dddm)nDWO5^rmMEn=O2~1dii8gZDB=&&|s_F{{D_ron;g z(z_XDG6ZtE4mDna)0f8C_QR))x#WU`Bmr}bps|hL0^LA1ue3tDeS(56J!Pv%p?dr% z`J-9^fOj2){{d=9N?;FQR{U9u`Q^N>P4s*qh!IZ#O^!yX2*e+E9nxt^)~%)33Zm(~ zqT-#7-(SNKqQw$*IQ_rR>*YF_etmVU{J+mfV1-B8bJNKx$*Rnmth|#&<@}U%NXD|#zCuhtn<#u@y*KqM)r)EDt@^|>53LcCO=%Xs;tQC`; z@p}PyI@`8yC#+t(@s<1$OAb_k4?GvaloaWu7+j@p5dqF0edEP30sL~5vejI#^9QSS&TRHKzCGOb9Q>7zF)R=Q|T4SH_>cPdH1X?ZPS<4>+lxXxVZ_0?-O zTn30nEqY_oT~zJ3*A=fUFC^l8 zpYcgIHzsMTVNQCoF&}r5OPB%QD2@}E;6*nvuvFUlw`%Ya<7U7Av324vhaK9$TFf5% zu^pYWAU++8kk>$@yDH|mC&ERfO~Tr1B%=ymB}__KmCiI;^UjE^Ky7fSnprujMdR&- z?&*F!VrgH)rNiYpJ(x_Y>gYo7Hc~!|9;8rJGnB{_IPMMH7S~_Tq+iRkdF)2_yBcF$ z;F7d(k}}a-P7n(#@;7ZBjyty^gQm6znZvg-q*mMu6{b<%w- zMKkU~Scy)}W~LaX4McgXA2EI}i5sl{%h$r!PN%dbCLUM$*y$g1D@#7R#^}Dk zZkTG2@sSdvQ1y2{sX$;FOiG9n$Atx1pprPHmR>ybnpeuslKL(>j_ID48*{sTh;VqL z-KE_WD=mLi=?)Ay%MsrLq)46n6`&?CtGy_L?qzI5{q)Cs+m9H% zlJ6Th@mFB7Z_PWMzi?qFy>wX|_c#dNOxKK>R&awl`A$|i;3yHe=4Jd*5$+S49{heT z;MCM3a&6o$bT>8YW`>CA$p9r1xMt=5?xk;Ys&T@*cSj*2aU_TZI6+)R7d4sC;j}j8 zU=hQWl(xSnZ}~E$HYs?$Q7EX;)xX~aICI(%LZ}H0;U1!suq;S5&Mip4gd}~W&hc`eZR*;jOW>N6 zuVPN1DddRpE|3;jEyL_PfU$-+L>pp|67spCdZv7X;14r3<8CiTgwTJe6rqIA7^nd+t}=RM=n zk!7dBv{l|{MuNL0&D`U@;pTKqI>=s?9C3!}exP__m;>zIM#$%{Q@=TEU=G{jI^Jc< zB}aKquHExjuGO^(s+zRpYktPu=J`xmvKa#OJC-h4Q^l)+)kydHnb9yj_+^r>fX_AR zJBPnw9XdVMX}q*BD~(%k2|Q`K6ty}6_~H*n8RUf#h+|x-hB@jbNchKyAxHYbi~#%c zwE`Ztx!~sCNBh0>Mu9kWjXG5YI>DGhOSof65;3iyhSJ+1##Gx|fx~G=Eg&2#OYWpl zg-UdfgNoDgezN1HJ_{4L27Kr01UK7(A?jF;ru9F<1A}6lCM)K zQ%P#b&1t4YL`fF^)Dy&TNCyUed4`9ObV((&`Gt^*szA-s8g#P{Bn&quy#$ucO;V_w z&pmXdDN=4D22ze)9h9pb>CCA+WrB9M;q*r#8B@i~%yFVi6^|Z{McC~C38bqER4)CE zRD_4YrC;#hWlMcg1q0E=DQF(Zrg8h#UcZvRzpxv%A)4wrhz(Ix9HiNh&%g9h`K~cZ z;~->O)!Oyf1QWP=eSFc)3DR~YH#{h`BSD`CEgaMQ?FEjZDaBBN(yrnS$#n+wyGFugYf< zxUgTj%+XVTmqaFnJBZ_c%wU<){(txS|`*=;>j~@m|rr7PXkV-Cpk6{M4 zo>_bjd1ovtpB}?K{?&pGUy}!7WRTnG7EV6*zWeXP#MUgE;mlf5()TzeHO$XBDfC!H zyJkk)xAF6jl@xC0VcMT5JtU4Wb}Y7{PF0Sh;_EU=of##{U7_0k?oQ6W92+Z(sfA`OX5@VQyaD8q=JxGNve~Ln&sgO5n?D zsalGaS{YNLMgdzK;uq+Z`8zPLf=?06lfKyh29;fxtH4^*hOibuP-&7c`8G;jgANAo z*|8>&n6!HNg)bB#wbQ7S4Ss|K@h!OhI?CRYJ%1P4#vxYp2K*X?Z!z}}(1YYVaQm;&D?_rX^0xom=0bGIp|wLMG{gyB87`4wsi)dziVK*3g3z?zipGZy)O;nGeyaYd57D z>yH=x@h6u%oo0%p)&3UImMj|$Qs~iD&(KE&fTrk}1cCv@&to`)jn|k8qS5~D>bwol1l5=S;? zW9)eK=X_B?$k%MBm#>4tr1vOjUN~Y_WT2_3dD4rLNLJxFgo>B?=mL;y0WAaTWBI?o z_+Ft5c_}z;$(uhFNufuYQNfL9E1vBl(zIfOF%zkv(d-FBO~gY&LKPINCsODE3C{ot z9H?(!aFeUYnOz9+NDu{EYYWv9f|y|n+Or^&fwa!heDS$=u1rxOOI`i=58&NZlzu<> zlpcj7Qdc7i-r^6SF_Kg7^IxuA4UD8SU-(Mi{7y?iexQd&ZHaD_+ zHP@*(?GA-sDOP?t=;#R)sIw92HT7e-!5pT54~`sn=os|jQ3S0c*K%V~bx==&Xp;(! zRjLARsf^;6py0{EC^_$;4{HS^agWVW3tGKi?bXpUkTi?qs&n|!RSvpfn^QCm3|>L+ zkT5CqfF5cSuRGR9$%&X1{i8-jHNLLyL5ne8)*v zboA<`#rZ#-(&u)`IDMl0&(q=UkQXkrXPH}As0ldi{wwA~ud!+0Y397)(`Iz+@L@nB z#_|XFNxnu^%oH;Jf>Fy8?*IV>2kQSkYb?9eu)2k9C zlb6S&<~A}Mt)&GNY8wDRvZiht22)B8;hY>Gt=9?_HC4sU|=8>(mOSb-w8BAuv95@AJ+qZ$uxWsE}wmp zDSi?908j&4{RAm=uRogjw!XkB7X0#;RTa?N{fs#cJJ4DY!XJ8)hE)tgq#>{#bC0?U+)oQ6+nf%$>Ue6nsSG{1h-FAMd?)ng^g zRO|y^-(fm{eMg7k9W?j6$1S*3eEM_^vIzoL+zBQWG%{8&oJPv3mj?`PwGHa*Su+;K z3N--!JdRse;fb0mOGiZN0L#2|=@LOq=Ein(GT)4H9U>Rv*FqNufh*<&7plf1UtCR1 z3+eK}fe0GawZ&6_0Nn0nAjBLla_ARa#*6pfT>xCMTj(W+Pj6HIqBWccFAY~9B>?G zyNU~S$jcGK#HBRH`jbw5kI3ahr%-1fTjq$A4WOJtD;pSi%)v`mc}u41OxcT54?prd5m)ewEt1ie}SYMIdm?&A*BO^;PkH>lZzAlAW$^wnvi zc<}jpbmUTy9}LQhC!hOQoN4Ipgbj}`0#e)(d;W-ns~FPK zCst8aMTE)}J>lM$$*elu(Fdz8360XE(9P9?=o>IzKOYM>ChHy|`JT62jfyTS5n6vg z;p}HXv0s%uJ-wZ|^WWg;I=iEwB}??bzes=@U{g8<1CYZp-1uPNr`~%C7MuoQO28l?4W&Cugcn&`ydp3lg~Q zO~CfjgVuR>q@@%bEp(+`r)I7)L!-p7Ys-uCW10bu^_fiLxR?uB@+Xj#t%ibe z$*p|o%%%LPR|qdLxeedY@r9Bv)1!uI#~i`K5xDTxt5Ab5RS%|(09kH$iO%Vb=%L|M*8da2W>nR}OK0$JssK4@#At1Ax@EJ6kA`{S*` zssc05?=cTaA=NPJ!qux+$5u9Yql=X3MEWM7DH~MzwS3=RU*_O=yUv0fT96gGw)!e+ z+SR46l(8Vx9Rip81l-5LI8&wZ;#pde3DL@uQ>Qng!KhOvsP;i|ajnwDsVC&}-M5(1 z_#3G{EySBgB!2*11s6bSLd0Se1UafU1cs8Bk^LK=ENQ1Ii@%1371*)k1L zRmdT??pHmEyTl@ZikVZau|xiOdgik0)>AZA`i)Qlh8mONf`Yh7q5n*vHO1<7(kH?0+5#xr5>ueZhmsAk`h_np$u0%OtPz$xprCy&{;i42x=DM;cx?lHwo zTpJQ;DcEgNDC<$C&#?w8^cE_54%BaJKtkv)p>F||s_7OCL5%GRx|e;aCXNZN#X5(N zA8)3_a6V*u?%axsiX>JLg@W^ zg56C8u2{K+kt~A73UVh1t=L}U0Kl*g0Pv~;b;ua)Qjx{?-^8%Vz5 zbL&x2?!N`uu~v5pPAz(-SD2xLu_-e@ECQ0CU!K5aF~JnbnpTtUoZkf@RM__aKA!E+ zc@m_r5F@%K0$pWn#39IMq_EA6kPTZIH++kcmevchw%j6GZ11y` zu>Nux;&V#7V`-SY%Lfgn;V48z95;%Ta!3iDa|cnw^b&GLU4rUP9F?3v;4+@DV7|iv z2}Z$usz(3ptwPP71~MJEbcDcVIKiwfOqn6Q@--nxh>-M$%U6^KpoVN`4kQWy`yLP# z1$>Odhgl%%vW0ZGU?j5^7`UfM3GQV>iz?^vX2kWZ}q-|nh%2?!B@vIrx z(9e{l-K$XDD=DN50KYx;=mQoM6pS5_@|d_nD zy$Y?3D-%P_ye>i5p+{3dZq{|o(YpXs;s(T(zncZlh3?Jn<~AWCG}F zGN!Zyynq!|(w_xQTqD!e!jF6P1uCfuglsBf&L|(M{b}&*K_r2&-L(p>GCH|ZC)X+k z@Jrzg&ayBq@j#@{;+gB$Q^?vUSa&d%nhnX>`Sa%yvVl16;@R7OAC|IhPy{44g-nuW zMXQC4G3VA!kG8i^de?17r6AA-oRf31QBLxUmoL?#OE&i~j?~EwgdlkVCgQ*A81BSf zHs-W%!oJ^s@W2-AJVB%L9cr}eAmp(JY#G2VDAleDLEoTRna_`(_##mcw4CxSjD45M z1tjWOl|UI09oA(MZq*UeP11S*pJLHTSR;ue5;oKHX2SZ|lO-9apI?oV5%;+*gF$q2$Z&RZZz#yB+lf znr(6`i+_@hbJNr#PWJ7yV9GzDz(m@M{A1fzBn=!}FdYc}qJYTfE5s7)H|fb^08yr_c+cgdDF zgyG+-cRu5nGlDQxA2Dy`8xJ#WHQu<$Bje-8kJ;|yW~78`2B=e70FZcf{r9^Xs4E>r znlkLZy}7erJp!t{8)_N)W{HR5ybIjTrH;zd_avl12J&>jN?=bF`j|Tsej}j-5Mls< zD_ezbG$jt9sUiwX)0?k1SQvI|#2)PY*uXU!Tp6=wBU-ovta^adoTzz@mTwq6JjXa0 zOPjQpUP$~1ZDe8cU&_v)Z%|LiuPobjmlTt=#do1rMb;bC3%Nxo^2E)Ll&fntqDIKc z3C=_tyf+Q1Nw7Szj-fj<(?ESWaOzaYQaS5XkVOs7f zhB1TcXD(U$7!)(b!q5L7I-=jz0AO}SMIvfo{8N&)!x!`f;tmPUblc|5G2j|s%e%1Hq7v2`f?Y?{ zPVfh~2}_mac+1@U0}viBr5e&oEb!;nyujzV+mJ~dy;6BTdtjD z=TReb-45C+5CD}H`*U-=MQmd192*dA?4yc9fIx+YbtU9 z9u#d5vq2^uK-h&e4VYH~7px7vqthU#Ve*Gr44HGvMnFdIvHU8^L2iUENHbH5aeR(N zfjsl(riR32v}A z1dZs^?@`nJ9`0>`?*6+2jUU;W$8!z24Nsf!6jC)SYU6rf3evabcUzHX7GnKmoPWQP z=VmcOk7;Tak(x{^6@IZbSaj(9Ee|ZAHqcqV_6k$SOJ@-dCa|X9`WSIs+dse*q#ITV z^7hsm%rKJvey=!Q8P?r^@*#(XdK}8Bs2a}5*_0SLq zkA=VpxsHrhj8C|<2iSVFn7J<;VVJ;<(&*?*wp@Mab!UMJIhLQdATouZLmGjnQ6}7h z0UCMmEaEH)3jKF>p~hq?6w)78q`dGmMf+6Ow5M$EQi`a--S94dnxS1&Lv13a~8|VHm+G}yL3ZXFUMv8Vxo2!9Z zM3cFG6E69=H;9TM)^%BD?JYFmvMkssVV&qP`EzU)#|>1~od^(A<#($NQ|oVQqq?FB z7U?7a#s!$eYfhlFwJt{p$i{g5Qcdz3C;{Dd|$rFhs zTh1M50zG9#)K5p?3Ga7o5sVZfb|e?M7Koz)C{b9dHt$hC#*F)jChiS-L_Ia2-$I*# zz!mf~Td|;>2%{EY3QHC|{30VD*iNX|)$uDK2L zEP6yVA1fT?aTbB{kY0=b`~*QpAi!{;3~K)8C;cu6ZxecuKX6psMr%)2sTmekLkKnJ z4lu6pysLqsMc?H|pmh^)m zf}nk5((WF8^l_8!TYsJbsYKGIZWk%KvKBR<`W#g!BdCIzv zHG(cA9U4@=rO|`jj>1#8=7cdFK4qYqGitN zcDeb!m&t}%gpK^Cu2Ch|&IvIr^C@gk*&QT2_eaXjr0o;NsMb3|pM?wLeEBQ#?0bMc zO_MjP4nTp^5sil%B#ti~e&c{VgQE9+VJO;Nd(_=Zd)qYT86e zIMg$XTCJ{YU;{*eBLi0zT2mX>%t0ZZ<}Df=A%I7MQKSxnPi9?(R?&kx5gr-Th;0YI z#Sk>Gr%$6%&?tf)LQ-${@&0;(g4&(is4CQ`r}4}Hm-tL>htm_XHt(jRj3X&H+M>T` zDz??RSZBlS0d!8S?9)TdK>Nf1r*|TT0zm*RecE{9S2+7qD6%z%1g3_+8!VX(IXY{b^uP39z9wI{^1M7cEh@hj6;dE12c^57gA@$8?ml> zf{Je#LgxiCV!?O{+jA+#<4cK%(>!&`1gd$`O9$8ggGL8|36NQTU3%JvNSr)w6-o+n z@E5cZ5dpx!Jah6&R#Ou8UO{<0nit?6DK+S~_zp3HYV>;+ zl*gm~WqR8RkOC9+)6ED9Y^#W&0o0Rer4{W> z?@$Kifnvx`6OoNtkzfJ74y`^D(TosTpn^SEc4sv~VTolJ9limn_#zvQ6eXjRkuT`W z9)hBfJ`xrIy$Brc>J${@Ia!Lp{D2~W2|bQ`%?e-8qJ0@5kixjw*bcGntDj4tQfPx9 zLg$r~uyqkK1P#sGD2ql|(tXSXajHm-T%n(Zh>C{#EbtnLx8|pKq2^8|ZN0*v#(bXH ze%PRAxj6-javhWezAGr#C6EYJDuj;1d(8YkS$iw;1tPGYe?j`?iOaAcTBQvxLS_NgD4E+Zul2W-M7lqU;#s`M!~#KYunt2WzKWyFKls zjaYXvIukRGwMb;w1RqL3So_P|tAUO}x3_gi_U=6ccO?}gK_sn!DYVL;kr=h=0VV|+ zn2K~JQxbT3Py&jR15B$Sr^T%HGRGVv5w+9?>xs0RG!}cilcJ4o?_+FLbr@0|hW#Tc ztSnkkb^bvaE0!v03RP+8GYI?f)H#l$_t7a~p%)1nT|#L5w1mB7fsBRoIW6sUXi5%7 zU>$_x60LU|C8AUt%1u@8L#~UYagP%Alx5I=6o0yYTCWZ0p2I*tHBV%NOT1|oB+wZ- zhlK~lX)7DbcF~XG;B(||GH8BG10wnmlzIsYkt`_xBTxcvh7Q#!aIu|z;=Sq>1OH>Q zON*JQlO5LqN}|g|&lys*G6FNwXdMfHUq!^m#pM8!M@rbuf*?FV17Xc694kVJiu4Gz2%X@ixk$s4hW(u-V=4 z_B1Kn>s8Nzje$t&!OOg-Jl-w%x4}7*C<&amT^QO~ody}gSV`PW;dqGz&TrN8jf@{` zLO4VSBMFRjDJzOJ+28|OP~I0Hw10mx zpsvY~xzQRTqW80$Vi=0pGGyy-MkjcN?bvjJA!+zpsYW-jfM6HD(WF-UpVRvpt37bT znKK7CTrG(0k5*@~WRTJOG@zdtN|zFitN{1Ywd+nRImQhPGxV#n0PBDjEl-7-2**Gg zmINHD4LPT8GeQ}-N*#dIL`azFAJSJBgD^dy-2yS8E=YrC^mY~|Ti{O9R*h3Ja9zbU z8eY2>`G)oiaZ^xSBr1U%P!nmlT{^gG4VX=5FmrV9%g`=VRlGN3D`QqtD-q)b{1w?e>r-1|0AF%(|cyx z{;#(y4~KFM`!ABpDeX=vDyM`aog`(OQj+XzvQ{eONZI$%swiucC9>~hiR?zDL^0WB z5QeN{GS)E+GxOaqI@k66|6Skw#l^hy%=5m_z5IT^`@WGr-W5L>{uD(OA^{~^rZ084 z5X;}zn$t*kFNY1y2KyxMGoMc}So3w*+_&bL|#yOF_F7EwGM zm9#-+jteAe%eX5igXce*JKFJQ?Ni!>$s(kiTJUK6rmSCVL)lb_0?{~k8RNlzMIZY#D`JoQCWOC~lvP`g!$W6?_hY#%14UfO+SOg}wFP*ZCb)Oe zL8a=b3qiF|0(9iJUl~+~)Q*OKQ*r(k0H?3m*8DZUY0@ths7*#ai-vU7b>?OP^e@Xn z)-IGb@9`LTUOpUS?-BN=f6%JU3S;b+cgaBeO96-cO1Y8;Wl+(@wS02&H8Tc+w;fs= z!_)L_R^$@$9|77)a1}iV2)a@7`Hf(iW0Z?{P(F3}TX_MUrUm@uvi1s-hWtlR7Low$ zNd-$#;rQ_6vSv-*AI4HF$8@g~s0&3XpaA(^x8Mt;4;bF%6zN7)eS}zrRofzTWQbOd z<5{Kg5dKx4HTu(`r`!li++PE_TDK^Ic&y?jO~0aT;`MB8 zGnO;LkbOwdZ!gC(cW?e&TU+Y>WLZx9F9NI|dSr>00bkNU8=U~8kOW!(EA{|i&9PN0 zaj^pIM!AT0K3ZfRa0_|464?_^l~s3H;ml8M6jn3=n=Qjq6Yzhu`fXfpL!e;z5zd<2?DR6zUub0hQvrCcL6eQ1%*g z3)!=J@CRqj2`R2h#=k&SOoAx=Dl`8Nlodmx@!~ut7CjYTWA76Bq^`6zzL zEEASI0fHHZMlHa$O05Cb2(VY^Gn;F%903J=Q4{t&hZaDw>iGRXu5Nx@2h?1l#YN~? z2U_zQ#Ah{jQ0OXm&F(63%!6}a4^&PX$As$+^f5pmr?3cMX6}g0fG!#sJy3vOK{l;C z8V-F7s4zjB7C{D#ac|}RjTym+7xz|6sKca1%{s|RA*=Gojol|4dvl)$Gp+mf#1*O*IKLaI~3xKdbNZ+2-8z%JQtxX83)(4pH z7TEkWfnwy&YIMny3<@bUlmTnu1p*GVJqt5r6Jox4*RGoZ>)3oF$|4Q;Xf0^B9YFc` zH~QD*XN%(q10QIP^^jL)qG%i^jLY9;HDmd=o=yt@=nk#?GcCOSl=4v$`Awa08eO+^ zLQN~9rwA%D-%&6UNGNEn&>NulMo>^N9gKiDWcp}?vy4oC-+&0No>0z^*WmjU^@#2V zY7nH;QG?F5=0>1J!*WW(>y(Z+Yov1*045NvoWkv|w(^M4^U$tjP;Yq=G&U`0Z4PG& z@rQN_EAP4nkhuX&2twr^VC`a+UvQsJTXB?B5%kytqhPG5`D`(aPh4C)jbn?PPFww= z+~TB~DLjWoU|sl!v_OF#8=wP6LRU+RWAIOWhNEq^18)V%wH4o{Jx5t;+(_Z-8QgwY zD?!-;6eIc&;PwzQdHqkXe$TQr&FCbMduGCIMSI*)FdLBnx&dG(0IoBH(~j1DgKs0u zUfqTiu8M=ma`wc(QQ_t#^Sh50Rr!$LL_ipR*o$-)w6WV^paOK+kQ5iMpWVL=`Ar9q zm*)_vM;t;Skj0_3_4V~>96HZ`82?f(BwQIFJfelU0s90}M?7#+T&P9?J;jX+=8kV% zeN*ueEBK^}__wc`CUy$|;Z2o_zwYq~e~0n`Es+CUzp?mOXOMOFDz!X@${>&mF=3Ci zIMlWNzw!0uARM|f{1Uc9`|^)>zO9>0+=BcD*?S4HEp8LNJxVR*M-J_>;{pVG#by}d z!sehZ=n{}{5Y`T|IXwQ`R&Qq&AXOQV5SFWT!2kl?WdS3$3i%J@wi;o2Hvj?a0`j3O z=vzUfIv{tTp9Pw|y(NRq=m}9M9Sqkv4kif##Ar5Y19E=V=J>Qj_)X|u1D#pS7z+Df zkl5a;5K1|JK#V$Eh6kdcfENGp7qe-Xaiiw+1L9U|!HO*7YqC zME8K^kAgkEi;=MhIT;g9yC%ne4T4{d$Qv@jxuGYt(Kn6)s%~f@ahn;+hd`n5@;N0q zRn_*TMp^1FOb;1B*#OE&EKAn0z6c8TF8jmY+mME!GNr}teyTujA&UxZ8o)rQj7heb$GO3W*0P~b*}n;1u#~$PH|C>4=RPr zmz}uP7Gw>SgmPT|x*FLl)U4q!W=y;h^*HN7^PR|yw$pppD(3AXFJ)K@v*lqL(2GtK zu7$QR6mXAj_=*04I$>~vtQX03ib(#`&Vo7HoSSnM`i~w2WqlqOJwEdz!DaBF%g@QY zuG!|9vCGo>`=booE%Ne6R>D4f$IzvvhZN&DKgdw9kE*>`Mr>l51w~i!GXY9S{cx5IjjTn(!=1@P#zAZDA56?dc`JjA%LP1LsFJ-(!#jpq%&vAXVdDt zqK60e3EcX~FSXrmx^8ZZS%pX8#%m+11SY_U{i<&I!dV! zVr8Fux^)>W;pIb+i7PpDL9rL}Y$*xh7aC`-?xoWRg1fHj)Y|LE9uVVf-JG-4y{S1* za3K-ypo)?Vr9%y7>vqor9CTzeD_A1&yO_}4vqR$NEK;3Q{;VF`C!ql+;Q zM10Mu!kIbUVwf*)G#p7eXD){aYd+ZA~7)$ z#p5AVOat+T7sF&Na`YdfaNCE94a*alPYqiS0%zJfB4RO-H-q&HzoAb6^`&sQW zfkXGmdcb56y10&_#tlfi9&AA+I-mo7ohdwupn`7pK2>~GtEH;b>+)SmKYRp)&wF19 zzAZgmUcE`b!$HIrD<3rod(`9rE-&Wj)%z%a_~8+MHrRa{LwO0Tdau$$E~Ke{v0yH* zvs_8>3oCXQH=R+f(J(KlwXon??9%hpdwOKhVY1RK&Dj|Z{dNg`HYL?@0C&oQj@QfX zL+dT*TUwzm-{se<^oi27$aQFEC2}(C4asz;i*d`8ZjB9ozNN84sT}?mJ;1JX ztMVt&?;j;uZ+g6G@0i~|(sHK}e^01loEkFm)|HV@_X{${?NjZkx*+WP)@j;U$=7JC z#BOMV9!pOlk{GcWTmWGWAK&7T3Dqm;7ijW(9ACITf6KdJyDo$*bTr;ih~`BmF(^|t zJ=|!|{CFpSTNmS^%#eE3t^@8vYO}d~A-kNbYTZAvZfuWZ&P?|lRmG+hG{b%7bwkyN z7xoBsI^r-hBx#_uEx7Vxx zkzmn{uR9NlrO)`^Lj1{B&|!7d$A-qVwr1JE2C?Gi$D$UKG|T&zyEy_4E)bDq?~^U@Q# zbT+>_pRU$xUOpIHc9FUriu61_M_G?U^RMD7@3|R01-Phtvj2AILU9ufrY-bWzlsCh z{xbH?d5a)u$yAZGX@}$i`rWl<+x6`qp71_N#IdYWWkek(Z!qjtcMA@~NoJG4arO{i zpaQfWLKH-+#TTQFjI(h?AU_|4l&KwhE%k(K9B8_XtW&JsYab%r>fiF-=5yCEO80*6 zd)w~rCJmAcPFU43B8igAH{8QJ#{#NDy+dCsdKNBbLklQt3u%s%QbP@WXD4Xw#(>i& z0$HC7lw7&U%Z*4rz{YlJvgsO$GNgJ+&wlU3zkC_Ckuuf}-%}Z*Z;!|8z(~F8he%d! zg3t^D)gf4A{6MGDJ>P^A^tW)TKZvF--4jlK9=rbJ=C@agFz?HIv5y-$T3cd0ULf5j zEkF9r#LTUaBph74ID7H!+s|F^9PP2YF(6Hv)bxTOn~!*K3Rf+F_@4j9`x6p`NwU)*^F~`;qa_YBLGLolwhriO z#c+QEM_3&UJ?+dpD4VCG>yv*zOdYct zBiHSFF@|sZSm2gtsR#v?3tjkZ9=oNZq_^JYR<9NDz`>T{oz&4mla~puHkV9ErT~^* zF1!8k(w_ETKQ_ddX>ZD0Fgz50+4~dTop`<{SJkfjGBuotcfORyQA8&+@_I>E&FaUH zF2ne`*{=3$Yo-4*%MFl>tCo?z@DJy5jtg!*!Sz~+rS0T|iP#o<$ z-er83k^b|m1?#TwMDyaq@FHga22S;r97C)Wee?)AEO||MP)M=ZHCg7EBAft?iG^=( z3r=`e#ODe*4F`9JGdw-ij=;ZNDTWETFio^s);&^X$yUNp^vjjtA!J6C-E-z}tYxLVD6*3owb({a^j z-+kjT?Qgc&SU2lQ{%J$|()eRqmKFC|VL$xW=8j{3+7noA**!CaL*5;$vsC7uS>v;an9{tI0?zl+d{AUy9JP4An3rO57 zfv+TMl;T*D#i?}jbPD=~naH-j*Cv-VWS7xgAXYhN2TRSum9LJdVGp!avXxY+=^9|VPmtk3Z!j#j!+mE+J1Pu**rDLN~{YFfy5A80Airw$8sotCCz+XpA zj1|g0zwoE(cB!OmQ7`qL@9dfFpavBUI94xlAz$vl;ORP=7$NauG(&uSZ<+GfJ2^%T zc`?L9+cAqm(&#~fBY$wBJ%ct>;KvfwT;n^TxinWu>S#!w8il!ae}h@pBU-}zBR7`s zwDcYEIy$3wN6hr(MhUB|Crze9670Un_BUAMC*9sX{jxd` z<1syvAui7x+2pItR+g2DzO*3im^X51sex?4g~Y3$%JH?*X%&@wX~ad6wYacX>20He zP1rNwPc}*8t%mMf2nO)Bd$ok@GS@`IN9%6vmUR+DV@KLRHrwAOyx7rL+Cpz%luEH*2Q_qNTeAkF4Q3IHZKcTrI8ef`o*!Qj5SfaxB5Rb8rcj{v%%)x(- zaw5HK>qYGRXn%<{wf5}LVZTyLb)_nJf0BF5jWoF*c6+28qh#S&HT~@IEdFex37jCc+c$ zEOxG4_;PyClB{unvErKzWjcP!J9E;*gyuJ$Kx#U*Z5gAVCCpE1e$uc?EYH2&>MPny zY;l;N1Sh3^HZ7}W;x!-SmDjRV9+(P98^lbUIaz454Hu%Xi>s9IuJdNzo7m5#7%?4` zM&3$c2WnnuOh4ume5GNcwJkB9>L038oWP9FWAh-#T$Zx$L1;f*8xrI0t~%7XBjsA- zc{|qo<9?bAWK)@?TMW_98;nHWJix!a7%@0V5;)aSVn2azUH*Xt9uO+R(ZgL1|^W zftVjDtDq!H|NWI6xkOdMH*yj=IIc2OTR9`)#JA>%amfr_-7`kz1FjD90f{>&JEn?v zJE`7g{3D&hK0N+ya)MCbbu8(fN;kG2m)Rd%IVyUsavb=i2_>$SLqSH6yT(7>$_Lr}osCV8NY`?&<81_4^j(elgZp}qd zK@f9L?PC>6M>MKV$*lhkb4_mK2tYdi&VNy2-|vY0;hVcBsY|rvO9Wn7ELSK=(kVe+`*GXu zu>RzF1la_QG)%^7{_ZgzoE3A|QX1+v>St%lm0KMfW_o(=4mSR~q=;vk@b|Y)S<1L% z7U#wO7iaG2+LMi`j|g}Y*TK4vYl`r)uzd46Eo~tQ#=h%Ac!@M7KK_1!4-Ziv zK?IJfpF3kHNs#rT@DYqj$<7lOSSNBL(11bEyGjbFnS$v5WO`*KRh# zHldOeu3qCdFa+sQ)%LqygBvq*!^}K0b|U*A|3>0|*2e#H%Yz94@`kLhdj!--_;gAd z#K)G!F|$ExAvy?h5+s~glDD&#Of`m-7B_WTDebYxP?I%uLW;|>N1GiZoaU{0ku{+C zMzq5!Z#=y9C{Ead-`g+X*Lz0$)Hjn@wdZx8pOWCQfeHftj?ss6RV{{|P0xx+)J8H~ zOORpk4Tg^27q)CP;YTjO%yT6DRx~AX;53{p%*U(iG?umEXMn zQ;5A2(Iob%f<0y;`Dc2asii-He1TF2B>e)D_K#8H>qiRq0$LbqQ`hEpkzxZy+dq&{ zv^~;!aVDjGr;XCue)%e9M1b{pdesh32=y9v7X~ZXb0HMqg!{JF$Hwb7%7mOboblr( z4U-d0Rr=n#uVQ zYARY3oxTrQJwWu+N6=%M`yra>7!A2u`L7i(B&m4LcdbGE&!W$Hu(hd^l{#-lUgQHKHa>f> ze*Z+rh_8#?*g(D0r9C;09$0Cl?;4yiv%Mq|&(~B-&0)RPr~#$<2F}&SvZ^~{J=~w# z7FZaM1ukT{gydxXy^wP81FjxY9d_lLuFuQp&(2V#4DilUCI=V&j>N;`SBm!IwyYy< z)Enwfr-e)T5f0p#pYKeWkj*)No58jJ@U(U#>xZDoL1bSjy2cj|62@q+3<$Z67M@Rt zH$0-CxzR$x*7VzN)*VUb!^;l`g=|GOe}P2?y?#QX=IZo_3z^RiTD_6+NPGXZL$Lh| zE3Ip@5p#mHE2IKJbzZ!Ef2(&X7B*!n+)(m-Ix*$CTYsUgaq|Kdlb%~Cz>S2Wt+#L2 zRbx%*{H5_`LW!|t&d`An*^?=GYmJ>Sc_&I;1bk-|1WqH!^r zxbeND+>=!44v{_FI^mqkX|xq*T3gC}Dh&?v%pS!{3NR-htU=b~B+s-JPf`lzB$UQe z^H7`PH&E)PMM>FOro%ocU;d!CJCaypnL0`$Ftcw}n{U|QkRgU=2iUZ8BZ|`uzLHE6 zTw756wGz9XA>Xducq4_N7oVa^$_$@z9EK`D(5OIklF8>Z={MC}0 zzE*F4!`{wwXLr)JkzF8;)o5Tlm@=oh8xs^XTGOjiN#|LYO4?xvb~Kf0-e84`r1_5R z(2Aa`R-T^}l`@%pO02bE?-~W%Smfe@eXMfyJf^2Pr@X;@ciOd2Dm#pr8`|*{WhKsg zIcAtNg9mAGRjE*uGpz3Rd?ANDvqQrC+$WWfJ9ZhFHy^x+%IGDwSeWaD^>2_eKKF=! zhatPt6NYD4b+ik?f7Y55voGsa{~MiZk(><1=xRp0vq z>ARwCzcy1pe)CX$loc;O%&NI|bwkKA{i#=5#q#nrGOueE9eEz8>tU<6qbwzK!yq9$ zw0oib=CorpJJ=SC{mN^S2fWD23vEUKNgevC5dep_^5e2TW#vZ%dJpig{s?*&aH`9% zCDd%Myyl^G#_Es%R~I%nEcD~hER>w=MUBLF;6A7xFez$if-H8zskDt|bO$wy0Dkm}Q6r3oYhz)ri4X>{AlQ+V^z0N$fQ?a(}j9XogkD z8o=i^ceowg9#`@3c3i%?nmLBnC$B`#!pSQ#qTM(VDcb@DisqxKJ0j#v$9p?+2cP+g zz)EViXpfQ(erzl9NEw^+)zWaEAWbDdHC^)9_K0`L;88`Iy<6j>^lifWoJ%!2Ar4ul5KwGlgmdTj4gTgNLIUN)=zCR{m#E7Y2+We%?sL=4@Mkv z3NZOZ?tGZSfTZ+~K2A53E3AH;%O3fF^*CTDE!UWAUUuIo>8^oMwbK)#um;OU9BVu5 z(7&OB8J_U! zcF{=Zgx%L?PPBiWva!0G26s5QZ6?jFd;r^8H0AgbJqahft(;xdW+Qi(D_4~~*xPQy zFppvO*r~eA%(6z7S_ex*j?V_W-6C6;4%3vw=cKuo6*6d${6oz?vuSeU#fjK#?OJ?J znx_H2(2CANF7gF{5*L`agg#clu_^QjT1nw8vOBd%x@K zw-agT>i1E@iwDZQ8V0I&CHb4`FxCHsh!frXWBZ3jjqj}!_%#hO=3vGuWVTRZBv(s}nMsoBm>lVy3 z4OP4d#k@!Wge-_oDy&2s!@b{qhtjk|dEUO(`1QGlH)^(~GOEqcch+~Y|Ltj0+c#)5 zP=Gniau3~jscP-V;;@Q?hzS&vAx&;BAv+aY)k<6`>3Tsw31!YFhSKYAMKISr>3jZiY?X0U(I@li zoz+RJs1zVUqYfa%of zUA!Y3^zVgh(fhhjzV@P?4P=|1(3Nd)B~>O^)4iy=yh9Rc+7m3C^KciKb^6N|iQbz@ z?`D>G5a`Re@J#H_JAqjS{3e*)dUT zBn#UQ=Pps6gm0>)QpH)W^wg-VDeE9QKlwF)c}VGA@(D{RQI+k^thc5ycMQer{MtWX z<`{i+dQKk<#PkgOdRp5#c3C+=NxtpqVh88BDYAiyFDYaBR}sgL9T#6 z5II?Qb)0FNQZAdBGMb+xvC~MKH0z_9%~51ae|dC{z@f(pes%{qdFY?iRkhFIRIc3rANKp2TmS$7 literal 0 HcmV?d00001