[clang] [llvm] [Coverage][MC/DC] Show uncoverable and unreachable conditions (PR #94137)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 23 05:38:48 PDT 2024
https://github.com/Lambdaris updated https://github.com/llvm/llvm-project/pull/94137
>From 5f92dbb386769598179570267f23b03d2a7e41d4 Mon Sep 17 00:00:00 2001
From: Lambdaris <Lambdaris at outlook.com>
Date: Thu, 22 Aug 2024 21:31:03 +0800
Subject: [PATCH 1/4] [coverage] Mark branches with either counter is zero as
folded
---
clang/lib/CodeGen/CoverageMappingGen.cpp | 27 ++++++++----
.../CoverageMapping/branch-constfolded.cpp | 40 +++++++++---------
clang/test/CoverageMapping/if.cpp | 4 +-
clang/test/CoverageMapping/macro-expansion.c | 10 ++---
.../test/CoverageMapping/mcdc-scratch-space.c | 4 +-
.../CoverageMapping/mcdc-system-headers.cpp | 4 +-
.../ProfileData/Coverage/CoverageMapping.h | 4 +-
.../ProfileData/Coverage/CoverageMapping.cpp | 4 +-
.../llvm-cov/Inputs/branch-c-general.o32l | Bin 16272 -> 176424 bytes
9 files changed, 55 insertions(+), 42 deletions(-)
mode change 100644 => 100755 llvm/test/tools/llvm-cov/Inputs/branch-c-general.o32l
diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp
index 67a9caf8b4ec4b..fb9da1a72f8dd2 100644
--- a/clang/lib/CodeGen/CoverageMappingGen.cpp
+++ b/clang/lib/CodeGen/CoverageMappingGen.cpp
@@ -1099,9 +1099,13 @@ struct CounterCoverageMappingBuilder
}
/// Determine whether the given condition can be constant folded.
- bool ConditionFoldsToBool(const Expr *Cond) {
+ bool ConditionFoldsToBool(const Expr *Cond, bool &ResultBool) {
Expr::EvalResult Result;
- return (Cond->EvaluateAsInt(Result, CVM.getCodeGenModule().getContext()));
+ if (Cond->EvaluateAsInt(Result, CVM.getCodeGenModule().getContext())) {
+ ResultBool = Result.Val.getInt().getBoolValue();
+ return true;
+ }
+ return false;
}
/// Create a Branch Region around an instrumentable condition for coverage
@@ -1128,15 +1132,22 @@ struct CounterCoverageMappingBuilder
BranchParams = mcdc::BranchParameters{ID, Conds};
// If a condition can fold to true or false, the corresponding branch
- // will be removed. Create a region with both counters hard-coded to
- // zero. This allows us to visualize them in a special way.
+ // will be removed. Create a region with the relative counter hard-coded
+ // to zero. This allows us to visualize them in a special way.
// Alternatively, we can prevent any optimization done via
// constant-folding by ensuring that ConstantFoldsToSimpleInteger() in
// CodeGenFunction.c always returns false, but that is very heavy-handed.
- if (ConditionFoldsToBool(C))
- popRegions(pushRegion(Counter::getZero(), getStart(C), getEnd(C),
- Counter::getZero(), BranchParams));
- else
+ bool ConstantBool = false;
+ if (ConditionFoldsToBool(C, ConstantBool)) {
+ if (ConstantBool) {
+ popRegions(pushRegion(TrueCnt, getStart(C), getEnd(C),
+ Counter::getZero(), BranchParams));
+ } else {
+ popRegions(pushRegion(Counter::getZero(), getStart(C), getEnd(C),
+ FalseCnt, BranchParams));
+ }
+
+ } else
// Otherwise, create a region with the True counter and False counter.
popRegions(pushRegion(TrueCnt, getStart(C), getEnd(C), FalseCnt,
BranchParams));
diff --git a/clang/test/CoverageMapping/branch-constfolded.cpp b/clang/test/CoverageMapping/branch-constfolded.cpp
index 1e7e32808e8382..a2ac1c1eacd28f 100644
--- a/clang/test/CoverageMapping/branch-constfolded.cpp
+++ b/clang/test/CoverageMapping/branch-constfolded.cpp
@@ -5,94 +5,94 @@
// CHECK-LABEL: _Z6fand_0b:
bool fand_0(bool a) { // MCDC: Decision,File 0, [[@LINE+1]]:10 -> [[@LINE+1]]:20 = M:3, C:2
- return false && a; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:15 = 0, 0
+ return false && a; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:15 = 0, (#0 - #1)
} // CHECK: Branch,File 0, [[@LINE-1]]:19 -> [[@LINE-1]]:20 = #2, (#1 - #2)
// CHECK-LABEL: _Z6fand_1b:
bool fand_1(bool a) { // MCDC: Decision,File 0, [[@LINE+1]]:10 -> [[@LINE+1]]:19 = M:3, C:2
return a && true; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:11 = #1, (#0 - #1)
-} // CHECK: Branch,File 0, [[@LINE-1]]:15 -> [[@LINE-1]]:19 = 0, 0
+} // CHECK: Branch,File 0, [[@LINE-1]]:15 -> [[@LINE-1]]:19 = #2, 0
// CHECK-LABEL: _Z6fand_2bb:
bool fand_2(bool a, bool b) {// MCDC: Decision,File 0, [[@LINE+1]]:10 -> [[@LINE+1]]:25 = M:4, C:3
- return false && a && b; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:15 = 0, 0
+ return false && a && b; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:15 = 0, (#0 - #3)
} // CHECK: Branch,File 0, [[@LINE-1]]:19 -> [[@LINE-1]]:20 = #4, (#3 - #4)
// CHECK: Branch,File 0, [[@LINE-2]]:24 -> [[@LINE-2]]:25 = #2, (#1 - #2)
// CHECK-LABEL: _Z6fand_3bb:
bool fand_3(bool a, bool b) {// MCDC: Decision,File 0, [[@LINE+1]]:10 -> [[@LINE+1]]:24 = M:4, C:3
return a && true && b; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:11 = #3, (#0 - #3)
-} // CHECK: Branch,File 0, [[@LINE-1]]:15 -> [[@LINE-1]]:19 = 0, 0
+} // CHECK: Branch,File 0, [[@LINE-1]]:15 -> [[@LINE-1]]:19 = #4, 0
// CHECK: Branch,File 0, [[@LINE-2]]:23 -> [[@LINE-2]]:24 = #2, (#1 - #2)
// CHECK-LABEL: _Z6fand_4bb:
bool fand_4(bool a, bool b) {// MCDC: Decision,File 0, [[@LINE+1]]:10 -> [[@LINE+1]]:25 = M:4, C:3
return a && b && false; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:11 = #3, (#0 - #3)
} // CHECK: Branch,File 0, [[@LINE-1]]:15 -> [[@LINE-1]]:16 = #4, (#3 - #4)
- // CHECK: Branch,File 0, [[@LINE-2]]:20 -> [[@LINE-2]]:25 = 0, 0
+ // CHECK: Branch,File 0, [[@LINE-2]]:20 -> [[@LINE-2]]:25 = 0, (#1 - #2)
// CHECK-LABEL: _Z6fand_5b:
bool fand_5(bool a) { // MCDC: Decision,File 0, [[@LINE+1]]:10 -> [[@LINE+1]]:23 = M:3, C:2
- return false && true; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:15 = 0, 0
-} // CHECK: Branch,File 0, [[@LINE-1]]:19 -> [[@LINE-1]]:23 = 0, 0
+ return false && true; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:15 = 0, (#0 - #1)
+} // CHECK: Branch,File 0, [[@LINE-1]]:19 -> [[@LINE-1]]:23 = #2, 0
// CHECK-LABEL: _Z6fand_6b:
bool fand_6(bool a) { // MCDC: Decision,File 0, [[@LINE+1]]:10 -> [[@LINE+1]]:19 = M:3, C:2
- return true && a; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:14 = 0, 0
+ return true && a; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:14 = #1, 0
} // CHECK: Branch,File 0, [[@LINE-1]]:18 -> [[@LINE-1]]:19 = #2, (#1 - #2)
// CHECK-LABEL: _Z6fand_7b:
bool fand_7(bool a) { // MCDC: Decision,File 0, [[@LINE+1]]:10 -> [[@LINE+1]]:20 = M:3, C:2
return a && false; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:11 = #1, (#0 - #1)
-} // CHECK: Branch,File 0, [[@LINE-1]]:15 -> [[@LINE-1]]:20 = 0, 0
+} // CHECK: Branch,File 0, [[@LINE-1]]:15 -> [[@LINE-1]]:20 = 0, (#1 - #2)
// CHECK-LABEL: _Z5for_0b:
bool for_0(bool a) { // MCDC: Decision,File 0, [[@LINE+1]]:10 -> [[@LINE+1]]:19 = M:3, C:2
- return true || a; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:14 = 0, 0
+ return true || a; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:14 = (#0 - #1), 0
} // CHECK: Branch,File 0, [[@LINE-1]]:18 -> [[@LINE-1]]:19 = (#1 - #2), #2
// CHECK-LABEL: _Z5for_1b:
bool for_1(bool a) { // MCDC: Decision,File 0, [[@LINE+1]]:10 -> [[@LINE+1]]:20 = M:3, C:2
return a || false; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:11 = (#0 - #1), #1
-} // CHECK: Branch,File 0, [[@LINE-1]]:15 -> [[@LINE-1]]:20 = 0, 0
+} // CHECK: Branch,File 0, [[@LINE-1]]:15 -> [[@LINE-1]]:20 = 0, #2
// CHECK-LABEL: _Z5for_2bb:
bool for_2(bool a, bool b) {// MCDC: Decision,File 0, [[@LINE+1]]:10 -> [[@LINE+1]]:24 = M:4, C:3
- return true || a || b; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:14 = 0, 0
+ return true || a || b; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:14 = (#0 - #3), 0
} // CHECK: Branch,File 0, [[@LINE-1]]:18 -> [[@LINE-1]]:19 = (#3 - #4), #4
// CHECK: Branch,File 0, [[@LINE-2]]:23 -> [[@LINE-2]]:24 = (#1 - #2), #2
// CHECK-LABEL: _Z5for_3bb:
bool for_3(bool a, bool b) {// MCDC: Decision,File 0, [[@LINE+1]]:10 -> [[@LINE+1]]:25 = M:4, C:3
return a || false || b; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:11 = (#0 - #3), #3
-} // CHECK: Branch,File 0, [[@LINE-1]]:15 -> [[@LINE-1]]:20 = 0, 0
+} // CHECK: Branch,File 0, [[@LINE-1]]:15 -> [[@LINE-1]]:20 = 0, #4
// CHECK: Branch,File 0, [[@LINE-2]]:24 -> [[@LINE-2]]:25 = (#1 - #2), #2
// CHECK-LABEL: _Z5for_4bb:
bool for_4(bool a, bool b) {// MCDC: Decision,File 0, [[@LINE+1]]:10 -> [[@LINE+1]]:24 = M:4, C:3
return a || b || true; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:11 = (#0 - #3), #3
} // CHECK: Branch,File 0, [[@LINE-1]]:15 -> [[@LINE-1]]:16 = (#3 - #4), #4
- // CHECK: Branch,File 0, [[@LINE-2]]:20 -> [[@LINE-2]]:24 = 0, 0
+ // CHECK: Branch,File 0, [[@LINE-2]]:20 -> [[@LINE-2]]:24 = (#1 - #2), 0
// CHECK-LABEL: _Z5for_5b:
bool for_5(bool a) { // MCDC: Decision,File 0, [[@LINE+1]]:10 -> [[@LINE+1]]:23 = M:3, C:2
- return true || false; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:14 = 0, 0
-} // CHECK: Branch,File 0, [[@LINE-1]]:18 -> [[@LINE-1]]:23 = 0, 0
+ return true || false; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:14 = (#0 - #1), 0
+} // CHECK: Branch,File 0, [[@LINE-1]]:18 -> [[@LINE-1]]:23 = 0, #2
// CHECK-LABEL: _Z5for_6b:
bool for_6(bool a) { // MCDC: Decision,File 0, [[@LINE+1]]:10 -> [[@LINE+1]]:20 = M:3, C:2
- return false || a; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:15 = 0, 0
+ return false || a; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:15 = 0, #1
} // CHECK: Branch,File 0, [[@LINE-1]]:19 -> [[@LINE-1]]:20 = (#1 - #2), #2
// CHECK-LABEL: _Z5for_7b:
bool for_7(bool a) { // MCDC: Decision,File 0, [[@LINE+1]]:10 -> [[@LINE+1]]:19 = M:3, C:2
return a || true; // CHECK: Branch,File 0, [[@LINE]]:10 -> [[@LINE]]:11 = (#0 - #1), #1
-} // CHECK: Branch,File 0, [[@LINE-1]]:15 -> [[@LINE-1]]:19 = 0, 0
+} // CHECK: Branch,File 0, [[@LINE-1]]:15 -> [[@LINE-1]]:19 = (#1 - #2), 0
// CHECK-LABEL: _Z5for_8b:
bool for_8(bool a) { // MCDC: Decision,File 0, [[@LINE+3]]:7 -> [[@LINE+3]]:20 = M:3, C:2
- // CHECK: Branch,File 0, [[@LINE+2]]:7 -> [[@LINE+2]]:11 = 0, 0
- // CHECK: Branch,File 0, [[@LINE+1]]:15 -> [[@LINE+1]]:20 = 0, 0
+ // CHECK: Branch,File 0, [[@LINE+2]]:7 -> [[@LINE+2]]:11 = #2, 0
+ // CHECK: Branch,File 0, [[@LINE+1]]:15 -> [[@LINE+1]]:20 = 0, (#2 - #3)
if (true && false)
return true;
else
diff --git a/clang/test/CoverageMapping/if.cpp b/clang/test/CoverageMapping/if.cpp
index 445cdfc20e2aff..b6fd525e930f90 100644
--- a/clang/test/CoverageMapping/if.cpp
+++ b/clang/test/CoverageMapping/if.cpp
@@ -14,7 +14,7 @@ struct S {
// CHECK-LABEL: _Z3foov:
// CHECK-NEXT: [[@LINE+3]]:12 -> [[@LINE+8]]:2 = #0
// CHECK-NEXT: [[@LINE+3]]:15 -> [[@LINE+3]]:19 = #0
- // CHECK-NEXT: Branch,File 0, [[@LINE+2]]:15 -> [[@LINE+2]]:19 = 0, 0
+ // CHECK-NEXT: Branch,File 0, [[@LINE+2]]:15 -> [[@LINE+2]]:19 = #2, 0
void foo() { // CHECK-NEXT: Gap,File 0, [[@LINE+1]]:21 -> [[@LINE+1]]:22 = #2
if (int j = true ? nop() // CHECK-NEXT: [[@LINE]]:22 -> [[@LINE]]:27 = #2
: nop(); // CHECK-NEXT: [[@LINE]]:22 -> [[@LINE]]:27 = (#0 - #2)
@@ -168,7 +168,7 @@ int main() { // CHECK: File 0, [[@LINE]]:12 -> {{[0-9]+}}:2 =
// GH-45481
S s;
s.the_prop = 0? 1 : 2; // CHECK-NEXT: File 0, [[@LINE]]:16 -> [[@LINE]]:17 = #0
- // CHECK-NEXT: Branch,File 0, [[@LINE-1]]:16 -> [[@LINE-1]]:17 = 0, 0
+ // CHECK-NEXT: Branch,File 0, [[@LINE-1]]:16 -> [[@LINE-1]]:17 = 0, (#0 - #7)
// CHECK-NEXT: Gap,File 0, [[@LINE-2]]:18 -> [[@LINE-2]]:19 = #7
// CHECK-NEXT: File 0, [[@LINE-3]]:19 -> [[@LINE-3]]:20 = #7
// CHECK-NEXT: File 0, [[@LINE-4]]:23 -> [[@LINE-4]]:24 = (#0 - #7)
diff --git a/clang/test/CoverageMapping/macro-expansion.c b/clang/test/CoverageMapping/macro-expansion.c
index ad71fb15eda423..4cd2c934371931 100644
--- a/clang/test/CoverageMapping/macro-expansion.c
+++ b/clang/test/CoverageMapping/macro-expansion.c
@@ -4,29 +4,29 @@
// CHECK: File 1, [[@LINE+7]]:12 -> [[@LINE+7]]:38 = #0
// CHECK-NEXT: File 1, [[@LINE+6]]:15 -> [[@LINE+6]]:28 = (#0 + #2)
// CHECK-NEXT: File 1, [[@LINE+5]]:21 -> [[@LINE+5]]:22 = (#0 + #2)
-// CHECK: Branch,File 1, [[@LINE+4]]:21 -> [[@LINE+4]]:22 = 0, 0
+// CHECK: Branch,File 1, [[@LINE+4]]:21 -> [[@LINE+4]]:22 = 0, ((#0 + #2) - #3)
// CHECK-NEXT: File 1, [[@LINE+3]]:24 -> [[@LINE+3]]:26 = #3
// CHECK-NEXT: File 1, [[@LINE+2]]:36 -> [[@LINE+2]]:37 = (#0 + #2)
-// CHECK-NEXT: Branch,File 1, [[@LINE+1]]:36 -> [[@LINE+1]]:37 = 0, 0
+// CHECK-NEXT: Branch,File 1, [[@LINE+1]]:36 -> [[@LINE+1]]:37 = 0, #0
#define M1 do { if (0) {} } while (0)
// CHECK-NEXT: File 2, [[@LINE+12]]:15 -> [[@LINE+12]]:41 = #0
// CHECK-NEXT: File 2, [[@LINE+11]]:18 -> [[@LINE+11]]:31 = (#0 + #4)
// CHECK-NEXT: File 2, [[@LINE+10]]:24 -> [[@LINE+10]]:25 = (#0 + #4)
// CHECK: File 2, [[@LINE+9]]:27 -> [[@LINE+9]]:29 = #5
// CHECK-NEXT: File 2, [[@LINE+8]]:39 -> [[@LINE+8]]:40 = (#0 + #4)
-// CHECK-NEXT: Branch,File 2, [[@LINE+7]]:39 -> [[@LINE+7]]:40 = 0, 0
+// CHECK-NEXT: Branch,File 2, [[@LINE+7]]:39 -> [[@LINE+7]]:40 = 0, #0
// CHECK-NEXT: File 3, [[@LINE+6]]:15 -> [[@LINE+6]]:41 = #0
// CHECK-NEXT: File 3, [[@LINE+5]]:18 -> [[@LINE+5]]:31 = (#0 + #6)
// CHECK-NEXT: File 3, [[@LINE+4]]:24 -> [[@LINE+4]]:25 = (#0 + #6)
// CHECK: File 3, [[@LINE+3]]:27 -> [[@LINE+3]]:29 = #7
// CHECK-NEXT: File 3, [[@LINE+2]]:39 -> [[@LINE+2]]:40 = (#0 + #6)
-// CHECK-NEXT: Branch,File 3, [[@LINE+1]]:39 -> [[@LINE+1]]:40 = 0, 0
+// CHECK-NEXT: Branch,File 3, [[@LINE+1]]:39 -> [[@LINE+1]]:40 = 0, #0
#define M2(x) do { if (x) {} } while (0)
// CHECK-NEXT: File 4, [[@LINE+5]]:15 -> [[@LINE+5]]:38 = #0
// CHECK-NEXT: File 4, [[@LINE+4]]:18 -> [[@LINE+4]]:28 = (#0 + #8)
// CHECK-NEXT: Expansion,File 4, [[@LINE+3]]:20 -> [[@LINE+3]]:22 = (#0 + #8)
// CHECK-NEXT: File 4, [[@LINE+2]]:36 -> [[@LINE+2]]:37 = (#0 + #8)
-// CHECK-NEXT: Branch,File 4, [[@LINE+1]]:36 -> [[@LINE+1]]:37 = 0, 0
+// CHECK-NEXT: Branch,File 4, [[@LINE+1]]:36 -> [[@LINE+1]]:37 = 0, #0
#define M3(x) do { M2(x); } while (0)
// CHECK-NEXT: File 5, [[@LINE+4]]:15 -> [[@LINE+4]]:27 = #0
// CHECK-NEXT: File 5, [[@LINE+3]]:16 -> [[@LINE+3]]:19 = #0
diff --git a/clang/test/CoverageMapping/mcdc-scratch-space.c b/clang/test/CoverageMapping/mcdc-scratch-space.c
index a263e9b688faed..60e456948a5182 100644
--- a/clang/test/CoverageMapping/mcdc-scratch-space.c
+++ b/clang/test/CoverageMapping/mcdc-scratch-space.c
@@ -3,7 +3,7 @@
// CHECK: builtin_macro0:
int builtin_macro0(int a) {
// CHECK: Decision,File 0, [[@LINE+1]]:11 -> [[@LINE+2]]:15 = M:3, C:2
- return (__LINE__ // CHECK: Branch,File 0, [[@LINE]]:11 -> [[@LINE]]:11 = 0, 0 [1,2,0]
+ return (__LINE__ // CHECK: Branch,File 0, [[@LINE]]:11 -> [[@LINE]]:11 = #1, 0 [1,2,0]
&& a); // CHECK: Branch,File 0, [[@LINE]]:14 -> [[@LINE]]:15 = #2, (#1 - #2) [2,0,0]
}
@@ -11,7 +11,7 @@ int builtin_macro0(int a) {
int builtin_macro1(int a) {
// CHECK: Decision,File 0, [[@LINE+1]]:11 -> [[@LINE+2]]:22 = M:3, C:2
return (a // CHECK: Branch,File 0, [[@LINE]]:11 -> [[@LINE]]:12 = (#0 - #1), #1 [1,0,2]
- || __LINE__); // CHECK: Branch,File 0, [[@LINE]]:14 -> [[@LINE]]:14 = 0, 0 [2,0,0]
+ || __LINE__); // CHECK: Branch,File 0, [[@LINE]]:14 -> [[@LINE]]:14 = (#1 - #2), 0 [2,0,0]
}
#define PRE(x) pre_##x
diff --git a/clang/test/CoverageMapping/mcdc-system-headers.cpp b/clang/test/CoverageMapping/mcdc-system-headers.cpp
index ae26ed5fe469f2..cb1c8743c36e82 100644
--- a/clang/test/CoverageMapping/mcdc-system-headers.cpp
+++ b/clang/test/CoverageMapping/mcdc-system-headers.cpp
@@ -17,10 +17,10 @@
int func0(int a) {
// CHECK: Decision,File 0, [[@LINE+3]]:11 -> [[@LINE+3]]:21 = M:3, C:2
// W_SYS: Expansion,File 0, [[@LINE+2]]:11 -> [[@LINE+2]]:16 = #0 (Expanded file = 1)
- // X_SYS: Branch,File 0, [[@LINE+1]]:11 -> [[@LINE+1]]:11 = 0, 0 [1,2,0]
+ // X_SYS: Branch,File 0, [[@LINE+1]]:11 -> [[@LINE+1]]:11 = #1, 0 [1,2,0]
return (CONST && a);
// CHECK: Branch,File 0, [[@LINE-1]]:20 -> [[@LINE-1]]:21 = #2, (#1 - #2) [2,0,0]
- // W_SYS: Branch,File 1, [[@LINE-16]]:15 -> [[@LINE-16]]:17 = 0, 0 [1,2,0]
+ // W_SYS: Branch,File 1, [[@LINE-16]]:15 -> [[@LINE-16]]:17 = #1, 0 [1,2,0]
}
// CHECK: _Z5func1ii:
diff --git a/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h b/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h
index 5fc497db8df54a..8e2ff015d15012 100644
--- a/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h
+++ b/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h
@@ -719,9 +719,9 @@ struct FunctionRecord {
Region.Kind == CounterMappingRegion::MCDCBranchRegion) {
CountedBranchRegions.emplace_back(Region, Count, FalseCount,
HasSingleByteCoverage);
- // If both counters are hard-coded to zero, then this region represents a
+ // If either counter is hard-coded to zero, then this region represents a
// constant-folded branch.
- if (Region.Count.isZero() && Region.FalseCount.isZero())
+ if (Region.Count.isZero() || Region.FalseCount.isZero())
CountedBranchRegions.back().Folded = true;
return;
}
diff --git a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp
index 21ce0ac17d6186..2dcebba8288061 100644
--- a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp
+++ b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp
@@ -506,7 +506,7 @@ class MCDCRecordProcessor : NextIDsBuilder, mcdc::TVIdxBuilder {
const auto &BranchParams = B->getBranchParams();
PosToID[I] = BranchParams.ID;
CondLoc[I] = B->startLoc();
- Folded[I++] = (B->Count.isZero() && B->FalseCount.isZero());
+ Folded[I++] = (B->Count.isZero() || B->FalseCount.isZero());
}
// Using Profile Bitmap from runtime, mark the executed test vectors.
@@ -611,6 +611,8 @@ static unsigned getMaxCounterID(const CounterMappingContext &Ctx,
unsigned MaxCounterID = 0;
for (const auto &Region : Record.MappingRegions) {
MaxCounterID = std::max(MaxCounterID, Ctx.getMaxCounterID(Region.Count));
+ MaxCounterID =
+ std::max(MaxCounterID, Ctx.getMaxCounterID(Region.FalseCount));
}
return MaxCounterID;
}
diff --git a/llvm/test/tools/llvm-cov/Inputs/branch-c-general.o32l b/llvm/test/tools/llvm-cov/Inputs/branch-c-general.o32l
old mode 100644
new mode 100755
index 7b3151184817805fefe16e9023f69501e552f067..210b7fd8840c6371aa290cc358d88b426e370dfe
GIT binary patch
literal 176424
zcmeFa0eD?SwKlxd2036ZCwQX<iE_XcTPcuguLfE*g&s+zM*=ihwXsc`ghbOMCMTs}
zqbVnW?Cu_KfWocbs{JnYTD`p*FBPH|OlU3%7&V0`QKJToxDO4ILX-&A^S|$!nSJ&-
zN#VQC_kYjxKmS7^nLV at CtXZ>W&6+i9X779<y!OLcSy`6(x6oQ>N$wvlYdH#=zO_I=
z%dL?0Mr*Nkk at art4JaYZ{A at x6{$!(!KMV1*2YK at YQWk#*L$RWd)co6fhGp at Ga4T2C
zk at A^8YwuA%r}^PM$mpM(i!6&j{`%v;wXE?!sh{2JE$hH7mheq_?2!w&3pjtKk>?Nl
zMH>7$2u96M2zmY(SlJ(<RYeb4migHO#`t64*8&doIsZr>&0E(2?&q%%ZSjZokyw}3
z*KNMEzUt!ox`x*6m$Woq@*V|aUBa*WXgPi>Ijhl8eYyl?go~U)RtS$4%l`A~-}mv^
z|L<yF=1q7;6W%}OFY|Ji#ry#h*8f6CpEnt#girYLXXE)gU!L&&8TnivJ;L9e0srre
z{M$3|mu0|XzWfDve%zNQ{Z$$DKbDc-k%9lqjQqzk at _oMgA;A8Y0e@#kz9%F9Kt}!=
zA3gHBDFgoHjQo!?^2;;oe<K6_&J1`o1OAtc{97~dAIgAdXTa+-;H4SxJ2T+aW%G~y
z{h1Fxg!~^35Gmnr&d6Wx!zY~CYzUci=xi%!SsT|}v#}*wRoAewwWYess*E<)SsOQ2
zwzO0?M>p0~*40}r(dI3+%~s8p`o at -OtERE3y5W7xfrHt%1yw77x3#jaLGZRVSvAeo
z)qJjQZf<P0Zmf<rRo+<LQg;igZfS_tqbh(6Tbgbrth!+vC~etZxv{3Mp|YM>fU5SQ
z)%DVNRcn*g($Lgg*AT5Cw7wc`sj6GIRyKiPYeVJMYHMrtRuo$`H#OHqk*ln)Z`=a>
zDlmdv)wVivUsK=OQft-Jfk>lOQ^n3$HPPnQhAoxRYLEgEvewkRC0cLQv{YAr2K<3S
zL*qt}tBlq)HdtFfQ&rb&ZBY%dgLPHb*475_V%2CiRi8j|dtKC`plF`nXI-^+%@tQ}
ze9tBCDfS+hUGiS<`Mt}%$7SAA5r$}8WFxv!ePdlqw7Pj+<jVTShU#^do9nB=+>Kis
z8}u-2RH*YJV!Rh%#mR;SEb#tYC{GJv30bCoF93!rPvQBWxbnS0Q!uo$Q0FwO3d&{l
zwd;<1V8-8IHR!UI^Xjm2oo3yv^M?hVZFTDW*>!dQKug`N^SP2=V0{^R{^J at IKsuq*
zNu5r?z_R?nv`Qy+>gse#r_(x}(dkK at S|?P!T%G3WG+(C$It}TxP^U|Ex?HElI$f#L
zG4S;UOtNvNki-Pj(=BU~=~-A$nPRd|Go?`nKc}Ow*-Wum1(?D?$YF|wDwiobn#UB9
z%x8M0Wfd at eqh*Dd=3sqf3P~<z8nmpXOmndYGd&x=2vZn>Vy195Rx-`AtP-Ygv8>fh
z-)dQ<O!MJSFg?ez%9y^*veq#@*Rs|#EwHQ&Oy6!<o0z`CvZ|P#XIZsOLzY#~^nCb7
zOtIiZnZoFAXIf}kJD4uAtahdsT2=?scUe{!)5Vsxo9PnE>ShYxWe?M(@Pn9M47t7j
z?{x{hE`ir2 at VW$Em%#r;30xnW3b^mWg1qzS@!wgN6PrmUlbwCh1<8 at vK;V-{llRf1
zPTosjg#VKFVllRA`IwjhYVzJ(<_S)WNFIx>Rm;LepX9OFTDAO@=#e}YSF1L}{C>&v
zu@)<$mFSi{7Ei0Ti1~KO6I5Hwe3Rs{NLsZe%x{uBQEN+?FOxi at 618Q_mq?yfYu7Vh
zB>9!hZ(=?q`4Z-9na`E{YUZ1mw<J%}wcDAW{yPfpUCVqs^AnP1Q?*^pk4SzU^WDt%
zNuEvD?q$A5@*9}n&-{MLZ({x+^WBoKV!ns at cFB{q+Fs_HBwx>bAM=|ePgZM(m at kuj
zl=%_nOC(R$YsZ)`lKc+lCzuaOzMXlO`CQ3&Fh9+_CHXGqXPKY=8~eYTdHBWXzvR1_
z4=_I>`8~{Yd!Oi&{9fksneUPOKITKr at 0a|3<`*;HE%^h?7ct*1`6)D7)1AC`TGDd+
z57(EGTkDfMk6!*8%d#tG-P>!C_B-KOyKB?UmK7Vw{$$0`Zuysne<twVAApX+sOhfh
zUiRFl?5ARr(`D<fbMrxU=h4Y=%lb6_yY`0UeY3!Imw=5Kr=ajC at lDES{^w4z(!<|D
zrT8vx6ymq?_hm!Tw>!5^qB`c%KZ1$aRNl3mQn`;FjYluEx{t;W!z%<k?C#Eo8&RLE
z`f0?bvX>0mNBiCL`d?X)HFj(^n&;ekk|ZCGo{4E&c5U);5OgX|f~KNY)BR%b9j}m(
zdp!_$9(^n5f=>GnqYPlQzRQVGjNs|)*i=sPz8-S$zc9?8<1Pc_kr)xP6ixC;dWnw#
z;^a{P-O`nS48Z!Gec%5z1RtJtx at ytqSUY>36+33xk{=A81bHjgcCxCi5QF1%)f1~f
zE7skF2VgPpgipr$vh485<G(mgT<h}+H)?RVD_rIUH>q&X5sEtuR=dJt{y6dMel%o9
zPR3 at h-tlu-vWlZM!Shy&kZJMA82JC|uQdN%q|@Gk-->_cef$UG1WAj#iOD{2M~6Nz
zkM_RLK-`yJ`fKcED|)#gGWscqdljPO(Z8tTe4hdDS77FkZzUxd<8(>~4C+CJD)|(p
zLk8TVz|0>%pQ6-F9X1HP3W53KA|{N<fB_CEpyXNiJ<^L|10GRe<^^!X0QwYwc>#<Y
zz=Q%w9t2y at 74W11y9&(waV3&b0~%8x=4CLIf+U(nQ8|<~mjuu2fS5AJa|yzBqL0%g
z)joyaYCM at wji(XJ46!(tvv|N*GA~M4)z&1;o-_!E3lM>MQ9>##B>bMwt4?JDEQA6I
zkNM*lXQ+ij%`vFC3YGceyN~bkjaQyQ$yX at MYY`O~P)LC!-*)n9%}1dDFIHgYj~96y
ztG?~{p0BN?rbdyfA$d-h;Cb!nGK~@}g_$ppKB?tf%xdk+ at mtB4`ILMYw5h(XBo^gc
zf(M9?`Qr;Xq)@!I23V$ml20k^Is;y>z|0>%PdL9`>TfUzn-l``0;n>8S_P1Nig3LF
zHz_dl$G?$afK{qT4Sc(TGcSN02GFhm%nP8y0J;=_c~9oxc%c@@ZiCmY at R&coNCstL
zF#ecfV2?rDtI(L2cJ>*-eg$A2?bzWN81%PLtTQn;EBbEzv>^Jy<DZa<hfKvDRgw8b
zkVc&Yao9k66_okJnFe~qK>HMw`NU}kdcZ&rDk$@brGTcC;mo#ANizcmbx5HyFMv at 4
z7*hbrr^ajCfF~4~d7o7{zArYALv{7pgIuGp=lq=dI^%S?B+@>K-%4MZhq#=s83M!v
z;DIK<0HzFJS^=2Xof-_!A_7IxufS9MuVNHH>!hiIcpqso??g^I9bJc!FSWzdF?V6`
z_Kn1k%sAm`r(<VcUox3Bl$;P|a!^m0$yEd-uO$Kcc?O)Xz|7Mw090T=AqA3rs%D`9
zFIHgY6K^woFE!921(kfN@^S+%R$%56JTH)zR~l%Ef=WJBd9?wTDlqdhH(rJ;Zdxg-
z>U6C$SnCy*<Wod881N<qX8!n1()?NjDpMflwM?oEs8)fPN7GJZHkQb`Y>4X-Bv)^+
zniLlE$3Lq1$~M4&0x~b$)BY!3fnx|7v0e_ZtSO)uHC48&Dv}?_P4hoIdwTQZ)KAR8
zcGha&f!|6$nNLljP%yrhx<t$lVp3td at Bk%aeplqAEbUKBK-p;m-s72o&GK}y6|$^g
z2hKcY>dYYUYE8u41;JZC4kbvGh$eve9z%SuA})D74gl{n;Qb2Byk3|N7|=lll6<P>
zAp`DFVCEConr06hXs?1wK2`aM0rx2|^NBpEjNWE{;3Q__w)+!9=#;WF27gH54=|r1
zH*CNo3e0?h=Z(r58R(dTjxwLBJZ``f3e0?>ODfM?Y?WBn2dutiaNA+ooC?87Q^Qp?
zB%dNUWx&%4%=~fXLCzS^tO7|sRr90)%b^#{4Qr}S>^7ioRg?LY-hK;utBs~w-}8*U
zO#F=c2rUj|Qy;VOTj?Y7Fnj1HgfUwcj8}_30yBr0)W=*rKp&Y$zl|5$lLe2sEBs>X
z8kuc*20LG2OTKN^3f|q<6 at KAh7BSD;6 at G#C at s0u_Kb#f2BP7U at 2g0uKi-lRi`};5j
zeGM(^lZH-2ua<@iO+$-SLy|WQO|zjBtqYE$scC6yscEW6HN`woc7;#O)0FPh^TAH;
zeWkh8tWPPFO8qY8$sD9aU*6Pc-7MH^4R)ErW?lfx4WL*7ByYI>6S;n#;`x*CypqTi
zPl+Jk!8{Olg`fBHtU1u)c`n#-r{TGZ^~rOs)bC<`u0WrQRtanM2D?dNGcSO32C!ZM
zByV`0BG1n$Nlyva8;DM>HwpS3%mZat_&Fcf;_%NV?hr-IgY8WB_r3M~vY%-Cxt&zo
zqxh}#m3i3DD)bdS$DHX3zeLTT0VS#!P(09pG7nci__e;S at L$O9ON!sWV5M;G*iA6`
z?G|*&17%nErGr_(dzaAMK_t>_7o;xcWxjE<nz#l25GSU$N!04_XHE*5Ra1Mvsx5i&
zEF8^{qd#-hXM~>vL?%B61^Eu<fv_w5XCFU%h(vz&3Q`yIDSn!je^%ua&Wl<&hfT#^
zRZ;RrIC_4{w80F8aE=h2%=8Jm<kbxIF>}b!>`^qCPcd^U;hfOI88)>?RBg!{;pmC1
zrZM;#B{KOL6J*J&Y3$=?z)&1g6q!%)L*XDAlD1wK82k7roOHNxPS*r!w2$Mr(l_R{
zzEPLj&Zl?RHAyTEgNp~K8uMt$4o at 9FQ|-m^gpw)x04#T7vsM&!T_-Z_+%d)K?9H at P
zm%JUGJbwBz*uF_toaA~xP$0~9poz@=+Bw26tn at 5Nwa?(U;+Of9e{p8pcA3g2iA8>K
zpiO?6*H&NqRM`LsMnGXmzU^dyI~*<s2Ar$F%pVUz$<>6$(y?I212PqK%;#2Fhtl`+
z2uZ622@$^akAja1_{up>IG|Z^V)<+)mWSV2u at TFbyu0~1cw-ea?%V#P(x;zS>E$PM
z{zaAE@)wmZ_^V34^@>X0gy;h6|3Ig_RU-Kuu^|I_h$+@&#=qcmi2t^j9JLn;M~r_l
z at 0YKNX)Prd<y(XYU@<S6r{Z5KOr-;hD!j<{{PHMegB8<C9!`w0Q9D+$o at 8<cvkT!9
zS@!C}Z1;Q5vNO|mY_)>fu~Ix}j6q-ofa(6T#)9@?HirXtPNCGsIW at YDR%Y$&Lif>?
z>?FouX0RliE#N68;y{EI{K at 3__|E=AgTe;r;QzRN1QAF(;6ylbc4 at W_$g)2-#HK=0
z2@$xPP{|ID$9g*$pbU24C?E94op$EYYT`rm^D4&OD^<$b7nzRr=f<9zwkHrD9l&hD
z3|jVRY$_MrvTq<^xp!gV!#u`BiM35y!A?y$-o6|=E)sr*Eme$T5~-T*F-S;iOvKtI
z=Bq(BUusM^k;x at PqQVf;G#)gGhyEzWgA=*U1&P(VM$E-PIk|D?eP}!$TaVw)eJo?W
zyh3|zVKxLGaDS`nLjWm0Kd5Px!zfI$we%`Kd<L{2Km>v#u2Vk!NcP#-UAkD;AV63W
zHFELl*-uGKT+6 at 6$p5APrkJN<y*rfrMe8BacIMlQ(FdqMRCxx!v9sqO5W4`f0_-FB
zE%}hjUvBbyg<9vkO}<dU-^P5!l;e=PJz)pjVX)89z(yzo@?Y#&1x(|(6Jv9Bcr5O8
znR<H^)QODQ53~EvE(m_-v8*8sw-X~Xc6cK0>@(Ok#4hKs*^iLlKLPs}S;y>%8|zi9
zcHpjuVt{#JZ5b+IGi8TI6K4WQqdS_w1A8p89wmk8Sg-0_#~A{GHsn)D!_!Lgv4J8b
z`P6yD$1nlv%>Zm0AhU-!Pa*-QO9T at c%@~hEbH;-QG*;qD@#_zH<MDN20eL+hcbmK(
zk4}@<<I&1|#Ub~74N!e};hj||h_&V5NzE7CFglcYk{*A>A>Y{L{(&QO2m|Ak2UNKe
z9`oz-J8%L*dk`6W1Qv&e0EE7%2>AwckZ2?{=^L~ELLm=z4%v|jZ<Le*feCMv9HNB}
zdP8(j579v=&R}>7{ekw1u$}Oz6PapX8GxC2SrnQ1;6vGg*zBTU=MTIh`!TG#b~!++
z16i at zreNoLm7LJcg_wq9lj9WY&+&J5+3(re$%UMAZlcB`r&_3;Lj?+|sD%7fjz3K*
z6Pn7o8C0Ud&XP1<L=cz&ei8?T1f=dRjEqC at mvVyiWoeQ}b^XX_9FB*!_}_c0RsgI>
zR^q1$#r+WpRUBIO_)GUuVeImrc=(5Qc)xq$5~T}~{dV|({R^l3fYa6!kA3kd#$v+W
zo at Y1Z+GRQMyQH8jU<a^r;IftFMj#_Qd^py2I2r8Vtin@%@QbJ8X)t^^U$v{m9FP3a
z2_N?NYvd`4=CJMuaB)P*U!oK;xV!SW_R#$OH1<fA-RgGb1++d)iMgIi{6&H`#7U_n
zt?EGir#8YurmatKK%VSFzbhu)ftM+YNj0-c3JW9oq3vv&!hBI?8rJ7jrrzI^zerCe
zQ$}74X9djrlwQLy?w0#AxF+6Oq9&xT&KrQj3bHiE20~(H$bW3AP!t~Q=L`F;w%>zc
zF&pvNN{nXkA(`@b_vwAtl*`>Lycu|Dm?7^Z^$I9EeE_biFf|s^fN+LY!%D2fFX?=T
z3|!cax05g!LPOklCU7CptQ{y~O*I;zD*@1Dk81 at aVL&an9=~D(g=y!vK7X+EM>t`P
z-9tUY0DNeI@|lUX&46L9Q}9fDYt}3&CX|?F#KoTV{1#=6#ecb;_IRbS$Im>(9)Lfr
zr+$+>?X)kJ&cWNrSrMKJ#$>AOMW<qIFe$Q5(sOU;QfY?+v9 at V&bt$=Gcc-D%m>Xr;
zSo9wFEmjtqTQ#PD=D=kH^~4%OuHzl1A~ZVJOw*s{p*4;Ug$1(i#h6vHUC;!i(aujP
zXgqdM3+gSuQw?@}NK;i>TI9rJy}_ax&Y?gXNRHf2#_xKNb(a^~>)@NLEeyav$#Fjj
zI*E=<>b<%<9o2-ixz6n}2Oxworxhz9b=rQ#JsZTin%}P4oKS57Fq_X-v51U2k%{<^
zUSh)qh2X>9fwrS)dtG4;c*q40dF~I;n$aS+LNV;N-k2enD2zgEV5Q7yGuBKwKfL<`
zFCPI%xIZw6Q*{UFrJ72o67Q at _{f+r<6R7$|AK||Ck^(facPU0sE1}+|BzV5h4aE09
zF6m&5IGh9V*oLc>0)MfY)!}-3imB#rYX74+gi&+vtkGQ*y;JHTPP>|(*&ysq&kI%H
zBxTQ(zXyYGx)2<93qMMx#^ENpH(#d+D{X|Uz1XyLt at Hr?m$7Me;=bN{D);rg-$2a<
za^XH_1+@&v-FKrU<3HYs?$epy_Gbzlt;3O;N_Xa=ij#Ak`A4v46W3h()pHoTPZ)dp
zRE*s=J`ZDeM1(PT;mO2bRZrcDYak2v%wWeR6lg6o{ii;=D}lg0KslVz7tvhG8>jHO
zqRB*g^L!14d<}M~1~GT_)**%h>Eg699B4-xGBcH4#i;vs&}H+u)WO}3Tk&g^hsQXO
z8^7zCe#KG7w7nfzbH?S)wP?V2scHLz*wk{dhESKW?{kJ=s$%mkzEnI`3 at wg3Q;3tm
zl6{5tiUvu!&+xDVKCj~W0;>0PLd={{A<uQtU6d+QMXQYoBZJT{U7ql7Yu%hPC<ZVv
z9f$L-y_MT#OF!W at RtS(@;#9nR(!atME>j>bj_}0C-Rs#Z5XUbY3U*$pTLK6St^Xy3
zIN^?<R62uu-fYx8Z;LAEq#aOP5P$ns(2ew>FiC{HMP_;0`sM9+A<)}<DbQ(G9BnQE
z7Ypg>)Ev7NV;GNJ^)Lv^7SZ3UhlJB<_d+pP++pY~y*tYJ%ze3X13Z)Gw<p-62iSaM
z1_8+L%NC$3{EA+MV5s^aBKDuL_*Zs?UlGS3W5pyr^vAO&4?MvBjJl(1D4|iBe1}d3
z^^^O%sWHly+6nL8{k#ku-0n$k)#grq?8e8HW at 9!<tik>93!=L)RBBhQrv7M3Uav9r
z9WWreKjzt_QTHBj3!5Zb$0ZjWV(BqF7yEd|S_r1xtbXS%cFSp%Xu*Wt6i`d~$|p_#
zz`E=TC$o;xvvl8dHKdSXN(|f3{}K1ZM^wY*Bd=;o9zzRrI`H$-R0otP8O5eS8wD1K
zz|%~LX}buBc6iu*TygH1k~ismWEgc%X-e4NIow<YZswX2(Ltquo<G|4J*o at 5$^b1z
z?3w{s5k0Bj^9wv1vrr_n!Zo7|{J67q2nfDl$#+q~m=4Gqg9!XoM9e*gC6PYTmsUzD
z`X=6pZtw(N_n?!ZOa$h2`_I!Ru{fdR-}4t9I}8u?Wz0RZW~c5MnhBSN|7GIe0^^qQ
zAqY?Tn=lC5fMdh?kqD>zpPy1wu;YUaU&%&%m2_=PivpU1kq*!dEkpmsZ5oX`wJ;Zc
z+1!n;7?1lcvfoAvQtNY9=oXaWF?11|ngoq_>|%Ida}7_JqNy0m*ih5hyJq|zmZcyW
z>{NSn)85r+&v3GvQ;oj$)EO|s4Eg9K7F_rSE+1PBb_|0anK0z<IxZZ<!xPIMMek`J
zP+wdgrtW($(*3GMPSvK6h9N%Yyk%5`@Rv~`###7d_2^i{K1*jJBk{X%_j#`W3%KbF
zb|SuZ@}7Vf0Y^`Y5XeE8pmoZgh_{W~+jBf?@l%fK>>L at r3rrfahJ7(Rrt|k0zPN=b
z<!%}+S%ds#xxe(p#V-811X9Ji>*K8p9-~M^eEcsXhsIbHb2igQrhfX at t0%up^~AJc
z7#IJ~5k7ikxiybN$Js9!0yJe-Gbrnn`)NpqMIzw;1R^u#Q*r0(8T0umz>HB|KurN&
zgdGmJ&!}p4zx`PM%ja?9z<tzw?66zzlgCcQj_dwfb0F-z!?5GVo#!*yxz5K<3%iBw
zV3xBc8>-u}0ePjmkV}zMn!T*=2VX$hk{8Yy3f}rb59&z*)9d|@a(Xr5_uT3A3>Y?D
zKOMETzdX-^&hat(4_J at l9u5!o+q0;Jjl~@xPc2vkg5Fjh?h1x_R&V$_ikan^ibVH6
zDI%Cr2Lz5B6M%rX{MG|Zw`s=iTD>01YvTTXdk1|faoIi?`o?$25d1*sORiI%$6YVN
zF<9&Az{0tg`L_-1(Vv1#_b}qB*cRvFh+wcJpHv1*u*+qV10_Hr5eKd773>$-$>Zqf
zeV+^XWdWmh at Em2M0<{}=UmQ_Q$T+`GXUfN+b`+6s8Tm9|M)qxJQ2e|+$D6|5<n7ln
zvW_x8R>}aL(2aPzB{kyiydysIvs9~@BVOVQ7_0HFGU6@$HpSa3bCD8uS1u>Vy;#KD
zYt1A4!++AHQ|=1$=(=U*anh|ej~Ig)oEmTl7 at 4SmW|Lew_GYm5qv$D=afAsXBJuEu
zu}Gr`O^L6p9e55^A}F)A7nm|@yU|DCZP=dB<F{3}+aF7`V-E$NDeD-I at FIP7c)*E_
zIOW5ytq-tw#`Z<fgdIN8D~b?4Vl<&Qr3r`K#7~6{Wq_9IO!?us6MQUP6E*>cnIv6V
z%^p+GN3dEg8FC_h at K|Hp5%oo$x~!du9f+t9k4H1!T6H4|^^}yYeU-Nz at XpH+JJ@lE
z#OMgwT}7B%azcjjmaztWgAcyk2d91Z=G*&$B<@45XQG{wY|OVfx6yhgqc5^h29Ubn
z`U!h!?Ei{zZZP&$jvFjlWV-*U?5v?!F*bCyA^?n#R}4ev%ampNbETM$Q<>4CreO#k
zhM;`9|LN?kV=Gn#RFn?0O=Nrtek+|x(T#1#;X}s(Hl8X(k9>53-&qwf+kx9!f!WJ`
ztq4y9Z+oNEo8UpsKNx^_YD13#8<cVE6ve5Zf)y}!&Wmsz`EfG2B0QeXXeY^XLFR#D
zcp|YA>XuL&kugyR)5j5VTAqWbSN}8FSuX^?bA>rmMMElbx&jTzQmH16l0+dIko6?>
zi)%CAi<nN_fCFj&g5Wm~)F&(ll$Ccr?%_hUa-1_3MrL<q2XHGR_)z%8*zDF|=li8Q
zv#7KXp?MWORg%L7c1lT(1H=pxj0A$rClj0!ibhdzH^r+mmj%D*MWj9xo;fr4P~=7E
zkXs~<wLbYzG(cqfK%6Ju1Gv=V+aIhJoyYP~`%S7dJY3bE88)w#H7>ErSYHmJv*tO3
zC1o%?K`i4ce2$YEE5xWB$v9O8*_fOvV}1NOMgch9G28j1z<fJqI27<~=2<~vm8cM9
zg^E$t at SKT-RoHT`Ma%xPGi)g_vq>QFPEAg&ezWv6ghhc4wzE+RT)Wq at 8-<Y>H%8{k
zGa!|ITx9wyuKGL??BK_AxCEHfE45{RVpsTygV^NCX#5_2nI8oQTo1B{veic+qPboh
zEog%VT~+5jZh!TrV5cpO&gd6wW(2p%^b2eIu-lD(v4Qg8xN|Lcc4~g*0?C_SYq1)#
z>OU9hs(Q6VV{xZkRRVIh9Ebl51kDcb5^$729lVAHQTchR4R&rNF$8neOFz at X+dAC<
zF3Bi=rX2-tJ&y7S?wGIrZ)dcBjj#Q0qgB=ZXENH426ez4+L80$=r;9h&>Lc&RGRb4
z&iPvXN7nH<B)>#m)9Yfk`e*4~YPh!qJL^>E+_o~^onlp>*F7u-5a+EKgxf(F<Ky<C
zl4;;cO(?2h<o){q6YaA|6H!e!Ev|RFoJ)<x+Qy8&AYzQ|>clDJ`e+6tFFlg#;SFpc
zJc?P2u3{FC*<FlGDN&;&^T|`+#LpQ7<FOxnQ(h3j@@04N;M>3Su1+nzK6~R`c%8*c
zLqFMEe>h*bK|ak6%%<!>y~t_y)$G6;^bX5D-YozzWdH`{?1&xAbfCq4d-uWXgdMo%
z+}o6rF}^TRPNsNXHj5Vq3K4YHFAT)ne}$%Kn&EFih%@o_XLZ3PrhuX*hQw!yk%JDf
zfXk0m$yWtpmGL5laqM-f{7)}_GjuPygyYcfA<{3$p>tz+;B#h90ROb#VcIhWs7 at D^
zkr^Nh6_fE;2rTH>RXwI4<4c&L-pQm2`ge$3>z-Q&rXt&0UU#EDXo3ViFBK%`bunJ^
z0a<fbLuhe911|19sYn#jwOjXfZ2pB`9i|riJdKZ)SrNWQVa2OYdRj(#rNwvd`8P`J
zi2KA^HB(jB|HeIg<cPC#7BpAvJc-}I&SIf|#LVHivl4QN$JXKZytjpVRPzbmsdvys
z(Gp4RaIYIyk4~i5ewfT^_x`7FT7b!(m19kJ-RI=|;0SkSk;(Lfm<hN$bH?!l>VyYg
zRIF{>O#UL({$O|v9l-1xRmlhw_j3tIk_K1IX2lUN!s~vvh|>W&;Ws3FMF$)XhKCiA
zAtta2@$isucy7SmJ`N{C4l0fXx?_4&etD_sWUB1zJQx|sO?1k-HsnNx8G-sFXp5mi
zi{jr239SORqF2%ec%Rco>pX3&(ruj2m1;ZLCRH434mqvEG6?au0e>{8Z~9ew at sIPg
z at H-wjp%*`bB at yBSPMTO65y2yTv4P|0ijIX(a>I&5y3iX9zVx2~msa!zEr1weE<^pZ
z=h=}Fo<BuYxgGA4&DyBb+9y3Tn`CU-Ibd$<IuYI(Bf$;^#XKRa)gF865vO(3Y3qx}
z+GOsBprPAy?Ir|v0`a?8ruL&h0lUISC^eS9{E_M<j;53p;F$Xd?oswwnUIciG>)en
z`*h_U9#<wF*}?N#k5O(#(K{^=6YXzMBL<G#d!GRp)N5rGeERosXbaot>NppAu3{iw
zJ>%UsG4UMi`D(u^>yh$*u?DON=LG+mE%ao0uASH-rIEAoyZ#9V9<g!$j`h*lD^G$3
z at i{1>oJRf&rKpH~RbBV+mLX-|z4K=GE3{VAT!110HL?MBF<3 at 0j>^EZYAJ`GPzen+
za#rzo#Or3$jR;~3GoVCUtS(9V{G3XUELIG*1)9HEEHqOVmHheRkyjZ8xj}%KSm_`}
zg~3AQU0?otE^zu%$dxkwCLUQt6oe$7d`MN0*wEW_CNiZCJu-K(A5rjSeK=|ZHOsw>
z&CPSv=J^-k*E=8kmwgnds|M8lDOA&(adey~yt(f8Ka4&@lk_PgaOG6;@pq$`cSt%l
zqVC^E{!ZqBC6TnH2zwifX;(F$Q`C9!1X9vAtwGw?H<oIN5zgUmUte%DO+WddG=ZrP
zTYvx at 5D|yVX5t<POt{4ggXzaAbGAc*c-;{q!a!GOL^b!-7)-j?t2R_r<{sdZ7Vn*$
z$=%WN^m`|dXt<Kh*bnJG&af4IyJuSVnmGMTyKBh-$<Xh>zZ(5^uRwKAPrU8#Yyzi3
z=odrJ at z@sfqGfj{S{42G?rLcIE*ZhxJ at jQ%Z1*BLq7KqN{eh)|g&po~z>*VnQQ))_
zly+B3j5ZXz-X#7d3TT^+jgl)GVx#n?IPo{(c7k)vJ93!xFEXEeb{?XP#;N$Lsbvhf
z`^p=XHg;U4akR;f-xa1X;7Gtg(=ky7dMTu$DW!s9f0O}I{3D>Kno^Pc9SR at okNa8p
zUs81p?gTFpj)S_fv>o%&{bv^9qPyNKPlGgM1H-h`yXS-PHsew7B|zJ~$XRMUjJ?HZ
z%<d%xH5B}f!DdK^s!j{aZwrbA{W?O;A7IV|hE$YLMQ&#mA6hTWmqAoY{p0wn`@S51
zv}jixc3)h|-XGR}SS#i at bK!&TF7 at a{4%!b>+ziX!kHHY+NnY3~#W}qoA95?yqZ2ul
zLjE}Hi6AqE>weB4_qb&Sxo1h*qTXv7?{(w)5z&d>C0O?t)D8V)cz9U500 at 2!yN|t{
z^JV}`c>mK_B_`lm+du37<2!-}hTf5dyV!_`joUvB9(W`V-!A!mUe at o<e!;1r3lu!?
z+cW!re`eP2?6xCkzhIa5 at gyZ5vQvvLNCp_Xlslz~Aj%O5?$=q7aK&K<en<Hcr**#*
zIgs_j*`NxWF_i^kd(Q at Q``i!E9O8=iUi+9+zAtO~?8nT-PBr{`KJJ`41d2vcUc84r
z8Zl=U-hl<y3LaQ6w!0=b-Vta=9mpSku at vRUbJj?_6zZ!ONjn8%2+2%U%wfDGDsJ)!
z<mI4=AqmqCxDL#`6B!`WLw4&h=fUu at 6U#>EpFV_oN;nl#trYc+I3+ps at b8m)y{vb{
zZtY{eK2z_u%zF8Dq{k^Kz&&&KjRn*WICBTxka|qhv;s~_XcNfx*sX_2_OKy)X(rjl
z7#*i%DFuJnklpJ(YRK+Q>Exe<>^_p+Z?~!|!-njb5fs>>a7v5qNVik6(hl!-zhcOC
zx&LLzcBROEDok#7lWe!$x`*8EF=TgUk}b6(?M}&ByK at KZs(YoJ{*Tz5+nFm at IVa9s
zivBxDKTdo$(QdbPu!#=S1m=?-AE?Nx?arDVvFQcW>N#UCC*SOzYj-w*97C#|QF)lO
zJ2&y6Dc32 at bIJ<ryEiaflK%tjkF1xTwg;U~mc+A5`X{n6!vsC+?`I!#%1X0-;gqdC
z`<NZCVx7{(cD$Ak+n2iUh3n%;F<y}9WNGj_FWV2+;{h~}I-Pv7pLFgfJ6ULh++_Xs
z?7uo~lg`Fs=L;*D+4)F2n1~%yC!4W3{W=V&4BG^4&3E8#%l(8ghS2dE8AoSKPEG0V
zzs1>>ZA7;gFs0f+SQT*AAZR}7+z at cK<rtJD9tvzqNyv$eu2>ZccD{*JS+Z10mKuw!
zt{1=4S1Hz41g;p?<-=%#GD at 9%>>QvC at D`2?`>+o%vt&PUC%RS9o?#!{W$(i9JPf?{
zV8;i&W`U<enr8q0A;g8}9{Ij_pD=?dWhFj>^~OO(dZ(idX_b`O;U0Nd&v!#;gGT)}
z2xbWzb`<$+5bYAJ7|!TKr=|L0rDg7-RjP$JN0|yiJ=br{4AJtyuyRialEu85h3(7{
zHBnGTFVH;->xH1TOdewN0%JvZBzS8MdLYkz!5E(*Vd+#W%^e7?%6HZj(3-)@8f%8G
z!U7GrpNIL!n&N~9R)mLwv09R<Xm_7nq$Qgh?BHz at r6}Qn;6u4icsTe_;QV7<frRYs
zuxb=LO*o4hb})akvtB;?gw3;Lk|`<?atp%)Z0iE#7KVq>Tw- at h5fZ$TA+pEPI_^IA
z7BU2#!HFtXn{l2h#UvQc;Tf}K)`<4WcIAugV?{gV!s$f0927J)$DyQo+ at Rd3WhYY&
zI0pv9`z`!~6c~0`lY3F5hjsVC=*qzf#(o?sZ- at 8B+V)!J9V{i+x0B)UK9T)$A%f>4
z!PsIxlgoX!Om}zLht!CvxgXh^HAKAI{9|+sBQ+S_qj=e~BD^;kt5;;)>kCt3 at J^KJ
zG1%us_5>eV9&pf6KIH|@e}OMqT)=ARKxB_oFy!nQ!iXGnmJd1WhO%KtUbdGH*?81M
z_Q=WBo<tX9CTa&6<XsdwL>YABjUSN#)E+Xx;<7u|wi|v|jkM6cBHS0emEHkN{=)F?
zIbHfYK!f2f{02tXitz4W4D*!OPNYk5en6h`0%wqOAPF~J37m`Si{;_=STC=+Lh`5K
zcVahw4Td}L8#}U&1;N{~_JZQL6X^&(u)4I6`ym~zTo~SOhxa?-4k6l+7zWW;+kQjo
z3aNNlx$9ZSa2HkPkC`)=r80(c$rdXw!{KVjoW#UN_V7X+2~sh|q)FgIj9jAZZ|Sy;
z_AAr2(ZuQfw0C~|QXEQBff)!v1e~&3r?lQ4!8#K>a15>(&I7R#!gZY)<B1kvpq+|g
z`TPQ2E15zwnB at UyRg<$OYU4f!oudf{mvOc0di?xU1>7hYmkMaA6wC1_7B9Pe#Gv*O
zwS1(DM`OYJAH^Z!<G64M24?8UX<tvC(8i=HqqnKtJasIJ{;9t3WnJ~XI`O~P8e{$j
z=`f_31H8fTq~?dy)PmW85lAf&=-7%?*}>Rv*h#M5<3!_W9=hp;JCzK0n{`~UW!a;0
zOzm17z`^U2-uq{6 at czh?81tAq^q9b<tp49;J2`OAhMjf!*-mQ?SKqbyInIWBx$2dN
zNTt0V-}oEx at 9Ex;=nu?{s2FUOD-UksUu8N?N)9W8dE=>)#UA%R6z-up=6E at e8al96
zlttce_TC at Do_5S(U#EDNN9~dj{pribwmEgiA~y*3QbNFp%!)^B4(w;;;9nisPy66<
z!vLLtR6%<NrrTE+nmC<y9`+xYm)Mv18&KB-WO4#vJP9;0!y|1KZo+0gLB|Q_rl}W-
zwEl-g9nis-cBu|Rh2?@1blz#_yV4R=!FxrW>acYx-o92!`EHXHQk>(hM|q7Ye&5>d
zsF4x0ptFQgKt%v!srR#RaVaHF-jfoJ&80rRc!UyMsE7a!52B|fx$GuRXUM<Vzk>Z@
zVSg5g_&>Hi8+KCot-z603HasIJOi6rnh%_6 at d_7Eut|dC4T{53gEQDJI6xQ_G2j8b
z^WAslAgT7%`vGXb*QTVPgEE5TA{R|AT*cojR^<e5Q>zjXBwF<+QiHLSm$l3h<Nylw
z!jOYA2^f_ulz<Y3z`M)f5yUPWypy0~;Xm~6>^Lr%DJ#i6J1gT$o0+YAimhCis$2pA
zlTq2 at O~$cj)p4H7S4so8*_tXeblu;a#9ZQ at 7hBc95*R8BP;P22#0F9~|NZh(=Vy>t
z7ZxVHtK at j)LKK^YC(Kup^!Fe6G!gs{JFL_XY9*@U=TR;;EB3tou;1VP{q10~Vvjed
z?vwvOk?g^ExKrkF%I!Z(m%8pR%;Thc+&oU;1$d1x?*80V8*`sEkE8B~4DN`#&O8pg
zynrID4Y_|ej{}r+crPsjy`(8wV_kSsj6Trknh-x35sx025?LY<RqDk;LSMEGrwzkA
zhlzj=WZK67L3SZsB?Nn%@O~sv-2)8uz;8hUbv}dyGq49qK3_y#U06W3aCKpbzVYfp
zRPVzJYK!rL+ETorR)kv%%TZkH(l6aPaEb+(^XFqX?408Fyv&l+avS9Rl|sgK!zE65
zr4uf8!pog-krQ6(gcmzuG=)adJQx8>X0GvSm3OpvFML5qh^UZ~T$u8pVINej(YTqJ
zZx-GMcq>oWWzdMGCk4IC2ZcCCoJfIF&I20>P5s&j9k#=e at nWZZse%5+2OW at 8qavq#
zxq*Jj$JG%ISHusM`;3~a!yMR1u~WX%)Qy3%U4BRgADe1^%NVzcabn}NjWgZ^PrtK3
zMA~O}=F7u?-I*s3J$5I*b<9!i%#nwKc4t5y4%waAct9(i{QPk|KFeI`>UiA3Qeu~u
z#Nz>ZSQ(G!%0qEHo-Yr}<MEI at 6ghFBQM%NLld4_1*om_pyR^`Wvt_$9<iyE~U0UG8
z$(>!A at 5ITkjUYgrz2UO2dhfeH{-2PT at AlX<+Dj(-v(50iAILY4_T5X#Oy^?!c5m|)
zFPGvX{x-KVpL`=^sY8PCVu7#3Zx!gW<Ey2lge9Hqp%X7;Nqnu8m$HOfF>1%xNl6(?
zIw=%%i6wC^!*=I-mQX{6RlGt6J~}B!h(j>BjZ*s;*%%DiYR9UBCUA#xa0O3xuY<A`
z#ay#EHKaV;uDx{38av!I7^dS6Fcj;E9fAGo=B@<Mt;jwYlfm!-g0UCFTm%-KO72rH
zM^3LteXtlT;toQJQjHD at 6DS7(X~t|iWX$3sce~TYKn`|J;deVRJE!r)1!}N!22XfE
zyR_@&fq0y_ueOe<!RFU7m0r*!!X16vne(W`w}}Nq*tr-)2RoPQW+nbqBt^^do9z#F
z7JE-C4VnzI-B}`-t4%3xU3ZpB(ORzvTjDY)T8H0?-g at t8gFzEzz;Fv at l_?DuV5Fs}
z-Ydf3Hc3$wzez9Nxn1)7t?2K-lXwVf0>;|~-l0oleYtk$N$iGVZ6#P;v4Aj++&PPq
z#2Ls?H6-W6iRH+%oi(^hf7+(cUKJQzl_O29QcLG5erwQjI%VRo${$?CGZ_#nvR8!$
zSII|rxK6BEJh*Bp>)H4;Owr(~B0dkUS}w?Ui}|>=cyQH9=7r0dIb2SsxGc6inbSkv
zNn9t+68V^d(8LJ=-vv>;>Sew}@v6;M{$Ppb)hHSD!KY-bo8~MjC2K^nYS}#(dtEwH
zofopqn<RzEWlR!(a1c-{v4k~bIykL3o+?xUv`jad0UmBM!_zwlxGJXaT9v=)`A?-^
zAo7%d8PwY~b at P(_(XLM7YiyqT3z;ShXV7uJ>P4Rljjagh1!Jo<3J<BV@~3S(-UAuW
z at glEA1>J4zpNc?A{;Gl6#&9;~@J;1R-}B9elNq9122M`pj%ojXopBA;f1X0evQG=g
zm0!P60XJwSPG_iZFgy?d`N8lIbwb~pfqbw~<0g*i3GvL<Ti=$&##e#z(>+eHM7WHf
za;FixO4pECSm<QpbZKlBzri0)zSij-g7R--QyZiQ at ObZO<A}jS(_V|-4C~MVJ|BT_
z3XViU1up(nO>9SLA(V|14{qMz>dsL%k*H?A0#tHjYY90_1s_;<Z6U7>JY}Da?M=l&
z-bLt}RUyzAf{_!`_ER|M8m7CrwsRDTBgx3J$5~CC^pQHewt#!rSGf(&)q`vH&Rn>3
zyAVxo9Pe49stL&eAL5hQp%ibL<P!JL_zJVhGHl%s%9#<IRfKHu!koONsrDM&R&em#
ze}6$5_bHB=hw{}|p at cW#6w}GF0GegCKY&nz-bpERh6d9Fdzus+VH at f4m7Vi1p#s9^
zl(@u{zl5{obT0reHy)AOJ*vARrN5n+pV4~_DgXGaRpTSOPZ^$z;5cJ3#<tmvMQ=)+
zLjNnLpwF*=dAdE!Ju(#l4KSL*_k_ at o!SEr9UvvbXG2$_D>nd%qdSY!oP%r8JAduB?
zN1#|eD|T`P2;QdlO$VKJX0gN2R}6Z%*=Pmg0oh%kpLv}1ZP-^FLR>C>|EBG*7gHhm
za>c>SFIQ*<4RM#k?jJ^oE$*l)MxR6g`!JGJ<dg|fLwf~#7C8()`3i#W#+96js?Wm`
z^%+k57WO?uhfiS9NX4|w#iP{s<;+Z-x*4l&`*O&}Z1z>W(7=ZU9>vU`AAU&ScOv3B
zKYX{qS0KzfKfE6B!9I3pe)!tgfG>Rwc+P9Ur!atV`5PAVw?8cKQ_JTN;IGF2?$?0V
zzXp7*w0~;(FI8|{H&5pu at ggr?69A5E at B+9AoU2zvEPgW!R~29})5aqeummLdz?!9;
zWhXE&SR(O`d;e3X at g<?`pt_R#SO#Ew9{jEg(hE6T7)N&dpFWLm0_Ey^n^=%j#S2$u
zt7uGG8BFX%VzH1*M-I$`jAd_v(IH0WCK(m**{)Tff$%Pt99&A$j)JUZxX^%}jW1+a
z0q%kcr~VC7iE9V%ykUh?k(~^Gq<0%>y1vzI2E=HCBrJ-JJuH*UC{^kbmW at Kl8h5)g
z_+W at i-Kbi~Pf5U6$&u?(SSI8~iu(mvBp}524h(unTMLK618)MD at 0I9}D}-~TM>+ED
z4I-naBmVG at j{n4_RD2xk^)s#H4yz^H4aCQ%z!SS8ZK9t!vF(9{!OoxSQYb;^qw?%J
z*2Vn8#5f4S;ef1(Jp}ND6JeAQ^GTF|8rH%QmdceNTrA5*srzpVn;jV8K at bAy6TWkV
zd(Yr^ZhtM`TIwhjGEe|m-wAw^0ek-7{T08)MKrt~4NX%q^HG1y{9bX)Jc%o-nkRH7
z5SIUS9I<*CehfJMLlY9$aWa!&{K+{sZQ;N|NW;y7V}|d^$4(^AAHuw&et6#t_;M8e
z+Vy}6L1)85niF5&4h(4(qMpI<K{#rhpuc!wm!GD?WU5u&MUi at wi_IJGrFs^=k2vD(
z0_1(#%yn1ja>Ph=fb;uzCzHF%UsOco1dNw687=R`bcm&5<?J*1<Jtcfw9uXlF4OIc
zfgd6qn$EYLJS at s%=hOjI5;R<Z>I9no74G|#Amg3<yDoH$bN3+a<X$lLAb(rI-OI?m
zLgp4({sK(@Dpd4O?0j^{IQ`HP?9^CWsr$|Ww(W(lwSTSbA at 6@RgBgAVG*B}bewsdp
zu&FgwubO%mxIK4?!2~AWRpD27#GTWQB;uFKk^B{UAt9P#k^Hz@#{ybQv5ENl(RwMs
z8(DrMB)cc^Oa2X`;NKslg_J2zW6!~V@&APX={r6C7o3{^w`KDGO>{er|GiT1f5LyB
zQHJfGrTk&(IG?Bk8$cT`r>ntZ!PQiU)B%L*zgNFFvwlHl{U6V*@4rv{QWF_~VbcuI
zm|lT_LmIfBT6^vt6q>p+8&?A+CSGqzP?MiGa}U7DlDT at ZjJo&bl2`w%#-Bi3)`zKh
z?1#7}Vy5Ul(kRW4ECasJ`egQB*vFzplN68rh%~^>g+dpWY$hK2u`YX)p^5vG{D%ta
zLA?N~j?`!LM*@s$5;4JbNqv;+Qr4r9ksHb(>XV#-P<TAki_7#ggmt_{H^X{3Q085d
zC%aX}93Itq>rx(Psp_A%-(QbNgxJUQ$T#M{?`#N*6U`S$tqA7_<6$!CeeOW{`eH|P
znX#Cv$Jj7J&ND&+dT31HcQ6UbF&&9qZl`^YMCm`%c451e2g9$7G-$p_ngx2E{(fkl
ze0oz%@<Q&%v0`I5T{t%)gvUvREnr(HE{Cs$XTC_K=R%z^-lYvPa1b|!nYzjmac=@C
zHDi1;MXgvF^#k+Pzl!6b-5ePOv)awMKRvWn=BqYO@$f7z#V-I0*t=xAJzzr?e%=?s
zS0v8}cAi6_RLscbdCVqGD=zky+d*8S>`8wiA%oxbXwUc6YO0sJhE<J4 at aqfg;bP$r
zlalkn{TjrG>BTuj4{XLvuNy%|%Hhod(JP0tDQ!b^2p at P{tkCF<hNmvV;H7r$;;|Gd
zvCoNx_#G_pr<eghr|=g%c$z1X+Mg+R0<PKB^<?iPD6u={TO{;e6Zny}mxbr!<!ksk
z90XO4DqRc<+K*jfck_YjW6qmn1Lo7*GU(v9cjt9AjX!8^s^>n9^7Z_g$3EkYhPwsB
zj=HIp)zdff7tYxg3G at UO4;7vcZ*U%e0pB9q0cy_94dmwzx~_u7_F$h&%mVQ-AlVfI
z?f~YaxopRorh7Ip*v<~&e+=k=dkNwwNHO5<mF98U?UK1XU?1yG6vUp&>U^}9k>ud&
ze*CozTy4Q??9cPg$+XitvxFf)+&%GLLEf=jD7txu+>E=#JVJY5F|ezdS%R37_5(m!
z`2knxnqP*iDLlFEckn2704h0w-N}mZB*Ijvpzp=#D<y!$wilQ%#eV_LxGS&k4(pfe
zVr`?|Eu;yYydV~aqb1y=^uDKo(@%IcxcLanI4ZZ0%x66K>J?7-#+UWU*J@%B(AUyL
zU}eO~?!qZvtZfK>=XuifkQZVOAP-)K93D&$CGaUQ6KfcehDH)!O%+W at d~_m_r=*{H
ze`X1Y#0KQLj`+he)KKsGIuLKK!Y+LteF1ze;o84cSn7UHnJ8SKe*#f;xbT=CCu4o5
z$0lIe<vC5k)Aae}T6Tw~f-?f^=C{dfBu9M(LzJ8N=Dr2&%aGI%blOWC(Q^mpZbLn;
zgtOQe8_VR)2mHNBVCs(_q#QeRMXn1eA!AC<2JgonWFh|!1o$=!(c@%^UrfN?<O9hJ
zeu}}5eqT%V07?gK!#YFm#CgC~t89=nw(k|X#$a`34y$JVvs+ls`=mkDp0^$k!F0-g
zm;04~Xai0bWHFwla_}!a1aHS8L;FfXxMop~c`~cl&*X^lrPR8tb}hh!uY&av_&FK)
z;vRWle*6HqH=AQ4A(`HMAIq$lY46*-g&gw(l6l at HokK2mUR|}}l8vT$X;jHDKoRjG
ziiC49!{w|1o+dg4LfFmb;^STj2XiT3?!BqR7~h0+W3mhHL4fRZ*SY{?i3<5n8_uR(
zU1wz>E)8Vk(m()qCWm)(CJ_%*-?c__GMA<kF$|^u)fO{8w2$ijGE9p1*Kk0DD~uUG
z7$-+wx{Ko(pWeJgdIrNVjv-UnZ)CUVPmLvHH_RSl7;xUe^^W5;CcTD1f&a#pkWL#F
zpL0>)EkeJcQd1&AafiRhgDQ$pd}Vl;o>nOGvVxsWe^7ZnY)Aj02H68G*TSaAfD1D_
z>60|PjT~3~y$+CbIRht8N`sy!r|*_dWxf&yeJ1x9lk%M4gO9~doELl$f}1`s))(r0
zJQ(ix*&YhqhYvn-?4e`sqH_G>8#IgFi+}xz1v{VO17a5a{Rw<NXHgLU>V~rLuRoD*
zkC++{+as#RvkP`UEj32$hx?z+&KglQ`lN=NpT#(W`N#R^?N>0~S5<Mm;eksZTFDdM
zI^j%I-yVAlp0qU=ej#C;QGJ!-qzja at Gm*uGd&~;nnr~3`C_&!|ODILhU}Ng$z*UuN
z9z3p&&Eo4KXOk3Khb$EBD_8(OHVyr5px^hQ#Yg!Di?!_Wu3y?C!LLtu{ql)t>=S=E
z8iJgI;m7!=Q26a9SS!7b#xg%&D)tWj&vikEFWFtSh5d&bo}&L`Px`OpDT!q$P_Og(
zdUK)ajo#3aOYO#q!cvU}a`_o9W&gbW=FnzZ6Lb499{Y{nTzwCd6*gCWI{iIt(%XRO
zFR7!4^1Zd=9l)ghwY&1s>|lE>7CiA^!ZSO2StQQMZT}!dW(M0$ky=>5j}gU6 at It9G
z-jYr#U4Lpk!&gK5BV$)%!(kwr(QnxMqO?40md^X`&td=`spJ40(gUEZDyArIuBv?!
zzIs^hs*AuWuSWH660Qh57vtD$g0k@{ePo<hEO3iK4P2sB%14z8bUwv^zdC`7T$trw
zg>jG_h8T(SfT(pHuS~!_!incF at ZnAkF_Bv-6XMVe42F-uoFcB$%jA*p16ZmCU at UhF
zo{OU|r*$Ch4V9Gt+=kDX!)6XRWmrpd<P`(_O at q>$g!*ollw;j$<uw!KQ>9*7z>PC`
zy9F<9$$d2Vrb8gb$R!BUj~dt&ejpov<LiOMr@<L+rv&d0Kd at paM>KdVW;?nu<TSBm
z^}#eX&o2f*_kD=xb^O~eunGe*Tji?*<QRX10apYPvJ2C_7*f4h^71(+ at G2*JF~&CV
zM?mg?P(e!MqE_dJ2uY`WDp?GM8ST{~kFD&&AYUN0M<hZ!u&i%7_}%4q*!^b1heNCc
zSN~YsFoxk>Qg>KxM5+&n;zo42s&y^CLEx_iRMg at z-aDig{@lrODwuhJ8p<+2W$E9^
z^;2DJHs)093H<{v-u)LuH$<QF<%XS at 6{Xc}0jC0^ilauj2l=@5X5+8Xw7GWcq+LFN
zuS;=d<n6=%L!EvMTKu|BpMy6c{x9e>zj^ilC!K!o^BFqL^(oEYy>J71%)cb!)8w?J
z`CBh>hX5Uh%MH6Hb^}V at mWQR@chhho{@}?R?^D(bv;G|UB+pBEzbJjZ@#521E%pM3
zE^&nW1x{QOQg4?ji-K4$7eGv2wct&r7QD2Z47h~^<ATMG_ddASg$ppFza6Rk2Xkcu
z=g-(Mac_=gMLqx`c5?m?XyAJT|A;TU#hnlGckE95)*dM$RRM_y(bv48O=JeLFf5E=
zN&Ke_rI4ZeQ(wxHkWElR&Ri&TSIpkE1!BPX0S_(={N#{wTF(Okb8vAwAb6%B<L1v?
zB<J|1`G23FK=Bv2w8 at j*W5tv&MwSN(?)P?(wVA}%Ne*k<PF{<T_2sSD$;%SK+io!B
zJaoq=g7Ei_?%-o=_RL_M^N=2$_a5V8BAgaTcJ6zO7k!R>kg-j?Us3HP3)8`VX;hpw
zY-zlvwaW#RIbUxG`96HAEjIdZKAr$|TJv%C9tSV*HZnAdp3s^C8-1le)P%m!MeS<G
zL+TIlVHa{C`Y(!fvc|!yTQzq0*_v3}vrs_sDgMeXm at Sz4<2Ld_1vfu4{ZB36$>dmq
z&I)c7;)&hBc8W`L<fOf)D=O`Y8qfuNAo48F&c6gKeWs*no~x_LUk7I$Y>~xLnftfK
zMzOt9pH_RTRPx^MK}ZPh!$jhDQ23o~lge#WY9tx56`AaM%xR|(z#bYvGifJ&ypkJy
zApES^QzLSMfYHgs2pnXJVPL6mZgWVekG^<FFK!!fGsT%ngA>1tlGjs6F0{M?rhPFH
z*7xFxx1e at BR*VthdVR<9v^W_NMd170|5DTtjlyb;RT<ta+m5yI%7NO+BG5jS;4VmP
zKmdPyU5PhG#0wV*X3zNV7$Ke*#MTHpUqj-Xq}bN;Ehak}$hP@@;0!&cCbW|R<k+&Y
zpOF!uXD?!#P5g)09@#r+xq<&Ok590wVp5DCK!-UVxxxE!%In3bfUo5Vky3 at _MpkMN
z0LN}fp?I+*P=z_1R#cVqrDoYlbj(Vu#V<WY*&CS7Gr0RT*Qb>4rE3dMGvsL at _A7Fz
zB7K`l;LA@?2`{L|zmSR-?1Z0yEC~qdezP3I6Pd*uSKse|9^k+pf95L}4-`>v7mIK|
z0HwRaN&VL)R9MUJpPBV#1BeZ_lMWQbtTAZMz*l;3faif108Xu>Jz&!!MAVn}FLtAf
z5JFJz#dYAiV!u26D_Z&e5T<+Dul3`U`z!P4y3d=(NjH03BTTsGn8$JVPlm#nyU^f{
zy6es3h`ZH14!aA?<B<DS^EiM}<Xt?z$l&r-K)%;<M8Y+_e6N_Ve!?E~U}qyf>#)t6
zl`u&M_z4NzeOQVQWAJqYUJb?~d5A9>M0)s^LF6!BF~IlWct7F at -de&Zjs5FAt=!H5
ziY4s=u94TUPhLl_r at VImZ@r^}cUK}IURgsdXbLoBL{ede=V*;9cH4Mg6hSOr>!TYY
z5r+#FYLGbEk$k7Tz<~HZwbX(vM$%t6DS*Q#Ac$rt<9!m;vdahLt|P?S#gjMvy2yx#
zwL@;Ew9`b$y9M}sf25o5enj^2#ShAKWgMR;DJ_murpx1$CSLZyS}QMdMA}8f9U|f`
zd2MsIPsD>IODTZClEo at 1R7r@5E7$rV2=hwDYG_i-ZC7_-5US;yu-sp!zxC?0_F!OD
z83Zw^p7!(WC>d|e9)vQeGDu}uJ?(WO@`)6D#0~1B%DV9eH=lM6aKzJ8LFTBM at 1BVg
zbCx4^ViqgROUH1Hrs(_s at vU!t>!qjg9<h5G?%L|ewVLA8C*S(9{aOr{w|=Db0yjF6
z_A&hh4E>!Ie99%`a8j*D5?|*s07AkK%;79T<}l;<gpHe>#sb<m%+rT}W<HF+D3E4f
zQ|r^O$}ln?`GY=r!p8`F(IxTJ%+X%}vZ9I0T)oVCsp97_HC>=6-nrseaSE=nhRk4&
zxNr#RoWm{0Uz`cgz9cuHrra8egArC7GnG%jbOJGQ74FVlj~5GlECxcKE~pp5YZlTl
zFSB;}j4P)y2;d=5J&W%^y!3R|yy7MO*OJ$3!Tsaibq)KE-WG}VSS)Y2h2#x4tmp-@
zQs$|lbi!+$aH$hs?U<M1+~;8}WUD+$d6P^rZja$ve-1v~fP5Aof&)_U{vo_m=bd*t
zX_kb4kJ8|j_;5maUBOtJCBP9Pt38BRTPYk4PGEA8_Qu;QPiyQ_ANE>5c9HK5xSts8
zwH~(F5WGO at c>6E1l;JTiSWD4GmUC<4S4NC&GSO%F;jr)QZ$}n(!*t_e1*IAl>nM at m
z+}@i4uhd|_$?ZsiOElOoqiTRjd9}clc+|RInl?hQHi|+))}}!`X9ly#H_f4c%lcB&
zQ}i7Up*sJ-gnEBOPbkiQuJ-u)`h8sO(QW-LF at 1dLK1DxM?RvTKouUjEfp6`@Pdefy
z$SKVf4o6R%GonJ%8GpqRH83vIIQ7juTcCvlzv5QF8QQm&h<c*O?Sd%gaDZ-~oHgk_
z0Uz_jvk$eX<DKWlF+cU4y|1gu8|SBW^%j(TaFfc^{U at A{Ym1=ltocp)j1Q>yF(9xv
zNDHIXtW&*L%D=ng{bksTq-Eg4N+G1k9f!PKf;*S_PAlI8bs~j)sS58))3+X5)<;i;
zZ`Y3VRtQ}faLGuSyj{yb>X?h;uRI)o<%9nM@{eP%5Ww78tHp73;Zl|(U!>FJIxS}E
zeoy+lL9I{fs)YLeV(=ZWlz;37$h5%OP`KP#UAWST78W@>3XAPub at sKs^|Du5uD7RO
zddcQ%AOi)T{M5#Zqw#H)ed4mCEpM`6R&~)~zVBpp2Oo4}e?G6Z^s=$wts^M7?C-(Y
z5K_G3Wian2qW#y-Wa}Gy>8aw+<-UZsDaVkWKuags((yfUMbJ+CAOxHx&pshyv5(oa
zPq+|8w!^=(*$;jLXP_<w60j3b{LwxJXaXY3dE)o>Ah4&Af7wo)G4{kWFYzy9KJii&
z{x&8cmp#$^hSuE69%;$B2y#A`XN$*B{sIEMKMvl{FRG8B$;1=SK5_hv5&Kt$d;3 at R
zi6wtM=V5y&!IAF1-hJCvY$uQY7JH)DR8I1~9&r0<D;X^;aQhITjt%60 at +gWR;DGyl
zJyGu?>Oeq>0eSu3>k at cf0<TNpbqTyKf!8JQx&&UA!2g#efS4G<s|&0>@cw>^pEoW|
zCQI at 2-=9n-e}SJr;%62=mbG^64Ute;b7M_ieRU|@+}zlFdFaEH$W(=*jiE&?XIho@
z^^IF9qt&6U)ms~zZ at whG%10Zc)t7q&sw$(Ep at zn2=%(hnXtcV4G)Vb!P`ZSqnyV|T
zZZ^<#N^=?~jcTbLV*N9%4}(%e<<@Fxp`|)HZ~g098=`f<scfhU)itz4n_IV5H$*F=
zb&U<7ZPm>!Ot;pxY^{uLsRiBY?M>BNqUi0Ss->aLt<lhp)lod3IWO&$V0^q?u&Ct%
z#b25%KUUe?P}gwd<)O8ZT{BqOMk%uO#+uN^jrH~0wr*@va^G0hy0s~^rLrMZ5AjfD
zTk0D(Z?0}e{SeWcnya_fHMX|Y-y9+;xYad7B5;vzC|nn<MMJGE)uBa;wxU4~No3a8
z9NJP_*>GcZdhzD!n#Sg8A&b^9MvV>ibqy(`t<}vpl8w3+k$Pi8x?sFsX7mW7vylV8
zv2pXKA>YL{RUcSXwL}eEYg1EWGer&-w=`n38d}k}P|M8?TS8kKtExjc)k1T84Oi8*
zRBnbwW(<ng_G)U~*2<eho2x;vxw*B8)T>%WenwJ;o>nEOI0fCfIa&!eMEjxUpFyo^
zmbcv860P1Es;}Ex7tPT4SJTrA7FB6oSX5u%x^YpJNNZ!+b=Q1&&D!ur{z@;oA$;8x
z*Icg(y;-E@)b&tA!@Tg<R2i)$Z&bL at wz^6+r_z*8)w~9J-dqPkHrA&!MQZ!1&ZSgU
zT~pawAH9T)Hdo$cEvi at Sdwh8UFK^&@kOF5*Q(aXEN+d!QRYOxy`3CYADsQ3oKr=&{
ze26F+B0UA++Qycs5d0rgUl%D`z2>@8sA at X*WKE%msvEY|H8(cUUWB$)HrKI}OGC}o
zHPy}44O^7L&fg~r_f&mav}jAH1xBW>rVi7Svm8 at Qbk&qrp=3)nr-N9 at v=Q}0!#Qm#
z{BMz2(@<5tox*RbY>9?o2>IO5S`WRiZr)ngP#JA(w$@Z_53T$_==x|gOl#=E3qu$D
z?^L_My0o@&YxSk|m0LGgK~OE1-qhIqnU>ndrb}tpE`|ni)?d1%acdKdK=Z}T(M#*=
zHeagM`O-DC%VlExz!c5;C0ndINPSCf^_I_E(b(Eh)v_4*rI1N<iDfhgMg_*=Mhj%O
z(!A49S at R8=)vOnRRb^|e@`leeG~U!;ZQMw~dUNr*bsN`wbj`Yr*L?KKjOnK*I9Hqu
ztF{H4L3kTC*HyOAB7)EA8ZePDPc(rmQ?^Z4^w~Jn##%<Jrj{K{IB&KqTiaB5WA(+A
z^>sIb{w1L+TbrSTQOfF?ni at zV^nnm<%u)>Rjnyr;Fxv|AebYso)74%xqoiFOifDU|
zRYi=-qLxsNEcePTu4&kYCR0{J))&lkTF+{$a<g?wV{=t?b9xh=jzYQL6%92uL6wB~
zO<0nYNw3^I&l0IwOU*}V#S;VDUJ4oeZB0wvE#gdMECv5VO3l?b)iqSj!;#mMSK~?5
zYiVq4#-!CMt@?|Bi#B5M*b1LXnS+ftlx at 7C{KFp(U$^o4HJ_MY(O#{sr6H(#Q`!)n
zqG5VnoNw?kpj8>hXs&!nRr9X;v#xq8mgUNNQ`!=$YV at zyrrcYYE2AMj%`ORXLc?_d
zx73r6Pnj`EycNLMh8nF^jSvz)E?_l7X|KBSnj0`V!yjI=-v7Mu`gPZ>DN~CkWEokt
ze&a{WBO7m6wf6drWg^veVe6x<TW`1?&SDGAD>M*(z%A9yjlS{^hKj_xodWa!U4wQ*
zWqqr$XvTY%GCc{eRA!`QafW#jvAlc9DJEA+O`^?}@KhSAZ^9~tmRdM~mxMyFH!WE8
z=>pQ!H#Uj4dGS_?J#_K5ri--|YPq-xCb<Rj`oPMD4{{YZOk%FW7Zjr2aGOdYjJLMu
zAv)NXgwC|!YtzRKHNtO(L203zy#-ieC0ne2&$3$Twl={FtZ!^=YRQ7LS5-%*D(hRa
zsw<o8Z{CO%D%z6uX*jhlSuHRZSO8kGHrL&_QDw3=H#Wj2ZrBK$(#!=5K$J8#&86s}
zWK}h8tU-^WwatyKH`Zotg at c#1xw*1oOYOy5F21q40hH=5*>bt!c4JLz!xk&++=VN;
zaZ~KO*f&jImrRb~xv4yvJc+a&X%k*f>_OUtbOh-klv^K5CUf6lS$#;0kamAOnJhy(
z{R!YB-Cu#gJJOO(sE2f9b22%Cw7oi+oJKl*BkJQ~*Zx}6N4lvF^?A_?@pyg?rU~gD
zq`99-CVP>VARR;6hw%JK=JCgOLpUdz_$>BzNcZC?xE^U!3))3Gg7h%bzSd-N9I1uZ
z*-j$egfw&p`h#>e(uwWKWG&L7TawA$EJxad)cPFwWjRi-XOK=K&BqnF5H710BP~I?
z9_d6oK7)v~{nlji0McB%G%<v<39m#<AuYKL{lqP<O-PH7wj(V=+Ko57qDaeZ^b=`c
z9Q|Y-ulJ54okn^RX$Y?|hjLJkFBp^}9YI=;wCQg26KUuk^b={%zd$}nbN8Yi(jue<
zxPH3-OXw%kKBQGhi at uypb}|32=qJ*Nuc03E2e2Q;_a64+RIU(d57O00C;lDnA?^DH
z+Cy4$5bYstM>>ks`X=_$NQ=IO_JZIKX$jJjLy#-dru$G2>88V|hcxs(w1;%07wzH9
zbQ)<0X)gX45kL1=gme?qGNkQDn~?5D+KsdiX%Er~q$5ZzoEA?b4I$0_0qP?yLb?fQ
z8Pay7O-T16?MB*%v<K+~QtL=EnN590x)`bT5XJ>*2x&Lc5~L$Yr;*Me&HYg_nTPvC
zMM#$;?L)dAX?tHXxdUklu9EF%9%&!pNGF(o813Nh=%%A+2Wb-y`PL%sL0XS=8tHDr
z{~P0hv>WLN(xOMuF48ijd2dENq|1>`AYF%a8fg?M|IFwfq$NlXBi)2_6lvL`7#E~X
zNb_-Zup4PH(mtf?kxnDsj<o2pWO6UkcBH*XCy<U4j`Sqb{Xd3$-wOCJ^bcttK6O=(
zbQ<Yyq)k7CJz)AX at Xd0hGf3M<&@K-6dyp0*9YMMt=>*d4NT-qRMcVfS<b|~R7x<(r
zQtL^~mvhiBq(w-Z#?W7;zeGKx)~`_yX$jI^mLnZQT7(O0Cy{PKT7VnL?MPQ5&HYU>
zxdG`Wq&rxSbRW|FNRJ at xLpqLh`nMP--e7$ynOusr1nF9&-AL<^_95MkbOPxiq(x6B
zlf#4~oklv1G!N&#xwu%d9BC2Kbx5230KSp7Bi)NM^bFcXT84BSX%A8hue<O6BlH95
zgbVseG4%2;>z3=RtQ~=@b91t at yRuFXK=mzDvkJ<<r$RXeF51$#xe?3-+#$2h3Visi
zoR0+G7|q^pedui~-u<4!3rMd7KlRr@?nwEM^w;6XMH at e0!K$+YoeQq`htn3^4=xlu
zisG(o5mV#ouz at e^&mscr at 4-*;^~vPN)8OSE{4n6#*Cmq&$(L9Ezyec$6vY9oEniN9
z-{Zk&0Pp%Z?zgAGZ4b^j=o#bt_cZvwd2n7e at A_0S`RO!xjR#)`_!!o%Z=fBIzXkWE
z`VV+*Wit7_H28M~9zxk3zyq6;Nxr4%)n6T3xZoZ^5gGAhy#qLvew+mr9*r@;M*;te
zA5I!~r)Zo6PT7`Z@*+RZjS3z at 8Sf5m0{rv9^Y{qgmK|HTu$6;BoD$$1se+!)#c3oC
z?*vr=C%*<Zj=@zkULU^gwA)GPo`upNY3&AHcU?01BRqR}(w<Tt;`9J#>8F#)$NV_#
z*TX5kd3SIOIOUl*5rspZW`UCjzhKhOx8dnmqG}@N5O^Mk-%#wQbwzApGf0I{Rs#4*
z!12~pif8h3LyDg&;1qAg8j*=pn!@29L#qM~|Ezm at -xn^TVuetA2sllR$>c};Jfp3J
zS15joGXk7_P08doJg3uHu$8TGe$4=97C2Y=aX{w_x}7}C)5Y+OmdxcPWOykC&T{xk
zX=BBHKcM==b~XTqzSIT&b|AYAKp}hw;1huJ+2a*(imnhv`!sy7pAR!eUzF))g at 88z
zy!G(O{>3jBrKevsdg=ma^rmF86Zl?R<hM=nOFB8HVLZ2I*d0Zu%+M(U&W at XtN&Zn?
zKOJqpM84~Qv-oq#BusG%=i at 24L|+9SLX|xl9`N^D at sT7Slvgis^4gNgAL7~LLkmBI
zBKqNn0k1;8Jven`L$)wN9Qx?it;ytVNc=bpKA++>1b at 38ICuDQ7Q{UoC4f%>{_ae9
zT%dHa5cR5nGaJL2?B~Ud<Ao`Hb_36XZ`<Z?i(}NP_z9t$`+*I>*_Vm4CxtT#oH5}1
zFF%g5BYTNOI<vs3vXjXUKi^8mpEF}!fW5-Vu4M8PemdmmI at K1(p#(TNPBIC%B_+e_
z6`XzFq~Z1cc1+(lD;bea7x32Yo}W$#@Pit at 8P92B^@&tl!@$`O8uol`eIYd-Gr$XA
zkML&yc&yR(IH1OZycclqb7wMnY(Bh!)VQq%UN80%zw`5^<oyeB$Ntp<C;BfqPxIqk
zmEye%@G8JBnUD8E#d`>Kdw^HJH<|pkpAN_52}O%Iqrh4GrDXC8ejLTmHp9;>a5{kV
zAwSONQZ(|hZ#w|^Eq*xLq2Wha2tO;i*ZVT|Jbs>mv#=n=?<U~n{44x7pr(ymx1vKi
zcL1jgIGg=+%y=lb$0FV#;En7{Cf|ke^Jp2ox1BBoLja8eZ|q*2RpQyhBk#XU at jeTj
z0|($wX5t)9 at m0V*=+~3UZ(_ah=osDonp(FxwyS|RbZ~y%B^<|3uL|#Y4LJA4uSS31
zHQ<x40ndg~z8d|)*MP5n4S3aSz&l<8e&99W1Fr#}d<}Ru_WY;ne+c7OsNo;=>nHX6
z!zn#yd|~FBc=ZwZo~}^mew5ND#vb;6E15jsPsixfTNN$p%O2nz{EuYvJU^{ZDmsKS
zW)Zj&YmOfdzo7~!gpUH=h5CFQ-s1)E^%_0{`0N$)`yC-v$wN$|7WKd3ug|`GEyY7I
zaAtrrpWP=9>ot5nAAoIa*Kph4##LxTuf4?C2b at iZlF0}BIOO9yiVx!S0q5ka;E<O|
z;Oza+WO79Yofa*RY{X!CPXT8ejOmO4{-D3UvZrD#h*Juj=(jW00P^}|idV*hioS!r
zqJR8>voMevd&Y?hdXmY1^0x&XI<M?Y58x|L0Vf|LfNuc2A*23+8pQ``%mC*ga4yck
zsRl|2WqF7(^#Xn>n at t+Uz*+v?Q|st at 4M$iZrGw=u9=2<EjUT>XvmlWEUcfs*A4#hI
z)v5Zu07L<QrymX-=MIqd$8`Nu>F2D5pGrUTv7u-CfAWu&@{j(&(PA4bfm3$hspr53
z4WF+K*59Gw at ACIyORA6i0N(`qMSeK?_-Wn#5x^NEe7_$KU1`+talpF)kNDvW)<^>(
zl$`{;5Af^!aO&(wQapqZ?>h+`s7z`cG(3c&62PYb at A1P)<DjC!b-M~U+Y!Tj(vPF<
z-h!Vfybxf!fmehW=lkc%{1PMc9^kCKKV#fCruZEJd;{P&`P*8+nXY`6X~2&F{%1d2
z&E+W~k&isYEcZTuxX)ain+#4daAtth?Z;uiyHdPt0L~`FXiqi1I{<G2Jk3sPf0p{O
zPs8VvJ>f?*{rTXO`#9ibpg-u}N165JLA8G*UN&N_vxx2fcs{)T6y8$c?SC+ttVSJg
zT`}Y6Tc6ee&jsFmb1#IdQ4Npy#~HF)7*=+WID3JUhdA*Ic=p;-<CLI;rT at U022RXR
zXQ6WR2_FZ1Q~#;${z<?Yb6(_c1M`dO6hc`+9_A0=X?x7ow=G<7Uuuj?fV1 at B`C~}r
zVH4mh0cUvD>&LoO{dNuC?T2e6V*UMqA42`rY48#uKzJYE<A9&*hkq<Zf8sUZ)|*xR
z`D_$*Bc$Pr{W3N__ql4kh*t`{$)orfpI?Uz-d_|R`E3H;Fyi!SHcL%U8PjgSrvSgg
z-yi74E$9;K_W)k-NQUp at TiZqeUkdoC<UOt7SNiE=%ozp=p)411`wghS(GTam)-ol|
za^UO*&b661%Ct&9cup|-Dtz$#;8bw7!E*(|FZ0Wjb7YyCkCep`;7kuClc)RnxKfQh
zY49v!0`R;1a5aZ^5sNe|OwtWF&$!5s<BNgv{GuN4Q}vZ&zZy6Pf%AJm4PzI6srYFJ
zjAtKBk73VAT?#WUzUr);+ZV1nEBChSRcGbJPP_7~qUtlx%3F2xtlU+PoRza`@T~ub
zy*Ce!s>uGvZ{50e`}USz(w%hDSvvbdR!BkuNg(Wm9SH=C5+Q_u2vNeONE8sk1wj;d
z1$7*CVAOFN!EwfI#${&I at 65Q3U&r|lZsWLbqqF#aPThOEljzJl at AG@!-yiQ2c>3N?
zojP@@>eQ)Ir|RDB7%fjGX_MSDzJog5ead%Gr at Ga9zk}R at Er3#t&qruO*|Ui`zeAm!
z6q=G0nUIt*DJeD$6+WJ%fp7TVum*-T at c)(uVpt2`Kuq*J)_rn8UASN?45zOs*di+R
zw<!wkS6=%-QD{BI5t)L=o5~5K$ybtJ`23&WtfRlICV*cC0mrDyJ4oY*MR^x@@-q-e
z%c}fGM at OH1s3_#d>yeKpC<sBx?JAw9fbe;6;Aoce20mz-toLu<e6x<=KXH#C{~O#<
zT=@w1$583lxWm2wfBLtt&@BEA`e*;EL*u95vk;$dd^X~<3!j7d+=kBs`1~B77x8%u
zpD*yy(TNm%3h}AKX9_+G@#)5ABR;$EIf&0~_&k8m&+&N?pSSS&0v{cnPr;`UpE`V|
z;Ij~)ZhSW4vkRYt_}Kq${m2|Y(kXpN$M%QDXyAv&Y3OIkj}@i%KCDMmnf!eHpgCqe
zU*g;YH2M(|(lx~phYljf+J*ex*qdC9^$VXv_)vb=D!L*@yasUzKArds{YQ2&{BKwT
z!y5R1O9L-mxF__tcdv82P&es%{~4N6^>@6BGT<Nipn?B(92MXDc;eok`M;@cPiYKH
ziVfkX^=IHeZTc^?;wRUyYU(IYnvwifQTq^nJiZw8ukDJ>CE})nQ=`{UKc!~*AD{0X
z!asDaIJ4xL#=`BF|FpSh$Bw5DU88(7grC--f&a$M%2?ZZVaqu$ezWk$yOykap#2|%
z`wKTd=-=X7FS>otwYRkI|5M{-pRUoAyNB at 0Gm8NwKEJX_n=$v4<fSi+Tv+*b))D&4
zwga-|`aCcld-L&CKl!+0%kwXqRQfx%1M_J;82Inpciw)Y_uzXIF8}jKS1-Hpqs{&y
z{6oj<>)&1ac3sz%zo#`o{u{zi>(0P`Gw=KChLxk=`|5=$CiRUW?H|fNu<S4%*1)g^
zhBYv(fnf~{YhYLd!x|XYz_12}H88A!VGRsxU|0jg8W`5Vum*-TFsy-L4Ge2wSOdcv
z7}mhB28J~-tbt(-3~OLm1H&2^*1)g^hBYv(fnf~{YhYLd!x|XYz_12}H88A!VGRsx
zU|0jg8W`5Vum*-TFsy-L4Ge2wSOdcv7}mhB28J~-tbt(-3~OLm1H&2^*1)g^hBYv(
zfnf~{YhYLd!x|XYz_12}H88A!VGRsx;Qx*WrcRtVCRRLY#j;hWt<WtQc8QRbE|F
zVnJp3n$z&tu{W+bYd!wxb*#FfqN<{5<*L3|aZg`g at A@&7l}Pk#SXP0*t6fQdrCVOg
z at n_jruUOt!L7XE;)zvk0j~-dwRaINpRkxz1p{{zx$lB2(SJaHEUs1cfy1Suz`Dx3l
zOBAaSL#nK=sII7w6^|G(vT9^a)#y>xxYduW8!>8G?J|^JvApKAQRUU!R&4IA-e$8@
z*VNS4jH;-vsV%X!X8%rRCkXa$WuCKQ`N*-aj=q60jS1#tUgk|=j<BI})u*Jy1XFMm
z`1#$a!0#^KaNc?68A8cqnnQIdzL=BY$CiCg#m_FF948Zs;bS^3_~GS9%**KJXH5P?
zuVVl1CjIRu`?og}^@o at cPN!Em>Hm~~a0bG3wLcTm2;~%%S68q=I7#I!SxKk%;YLl%
z7D`MxY_>1Qt)VYUQp`C;!Oe+2?33+N{HpF`Zp9Pxy72SR9xr~&axdk0 at i(LWQ_%8D
zC^bd#X!;biJsb;6pj$vmQLdt#fRd`}0VyGzOA^AigfK~%U`v>wcvO9Y<V$NNzBHRJ
zjrja3R6<R32{h0b%TaK1<si!!D`=%#CaT>}HD=;xsgnn=D&@plE?H++)2+m2Eg at DZ
z+8lBFcS}j%_HUOa^c`iw?WGZSTK@|JPA?0yG?sQ!=HL&@H2<&8VVPwtClpa-EsQx7
zBPLV at H|obl)LsFL at W>(8nM(=8oJk-AocK}g1C;Gll6B3gQm4IzDC6_OcrK(IFQj=2
z6|ZSZg-oa#F(kzTxpWICK9es1KHq@)!=+Sz*sebuum2>b3+*H**%!;4O;tgsrie_4
z at Xl6}R9W$C)uFg%GmnxSOIwW}Ax~bdgw-9?B-xGCjH~Kusw0-uO}8Aos+ at RLroQdp
zeO-$m7`1=<HKFffOb(|vkQPqM#3x)*PXDiB<s}VktL1IN<oPYNO>-tU;ab~LJJ}*z
zx4o?T00aNLl7@@e^Z_Yl*1Wcp*w~~>dr*8zhz12W{FJwnCh)uI*O?;|)ii~LR5 at 3v
zZ+T>d__b9SRLrT<%?VqTQ@{yDB&keO&yOp@%NY04C>gPUixd&C6%j}%f+Y=5ox*sI
znubhwESyfaFr;2e0x at m4mIlq@LbYcGsrF2}_Drf>j&VBUiZ at +JVzM1Mj78M~#?sXi
z#?sUhjGQM{UWmqc%5BRjhn{_fnCXcjEMz>Su0;cUvFg=ytG1_1wGwb?wTwHpSn~`<
zUO at 5da^5vTHGx>ueEed$TVX-dDqBDd##$Dd#AK5=S#nNZLd4Zv8&EGy$51aK7aERD
z-zD$!@N4tw)A5t`*OMBiD;YY5Bs_RXxHTlRu4SZ^S+-VYkyhrB(&kB}wcRN5+wA<d
zxYkU2w0~DP6ZUBTws688E12_M*6<)J5P`dx*M>z6fdX$B_L=F;3};Tv!M&iM#9Llo
zUEWaM&;Y~qw$!$)pIqBApwM^2JK6LB87*v0pny!2WhiQ at Dt(2MaR$p%@r&^;O!onr
z6O3o5cQIw0G9~7{Q{MBGY03<*GE?~#Y0j(6N`>aqLYGN%Vj|fWgD1ccgiWto0j&)6
zx-j|hL^u{tEVGVSCrZ{F>7a9L2TfksuV5jR)1(0G at X1q%y+E>;w36f!o4v$jw^l$H
zpUW33pH1xLlD&F9u~*yd<gxv+B at K*LNF~Untu-)*8i+M4fgL9|kQK(7PDO#FCRmPK
zxSGHmtW}MKov`(?VJ+RL$+I3crN$<&MNO%bl?dBII+;wK?@p#_+ at 1(52T3?H=+mJD
zV$*Mv_vyB4o{pt79AB(qLiX=W--7kS{;lbR{UkFd7sBfec*7#>4d<odo|%~=U at ijY
zB5G?JL{n4C7<PaqXUpX}Ehco-k>-T?X9*=+IYjLgN-TrsK$`SBUM3=Pbrwp{D-{?>
zA_WF)1qMig)XH$49LaDBG!V>_tZ7-qI(Vs#k7TAf at P%NHWlHv(Qeywsz;oL_GFG6H
zu at qFGOtLllBdN^L(YK5RqYw6SvaK9z^v4kU;L%5m22 at citEg>8nW9?RtcD3xrorxT
z!ytQvTS660WRIRE$=)LEvBhR at k^0dn<g$PF`*#>i`?tRn<L9>Gtw10wa&ijNGDUTD
zZAp2I-N({BFq3~1UKv(+r90uD5MBkbbh^BBljdW_UKlsIY*S`9I5?A{h16IIt)xjg
z$V!c+7tk#YmXQ(5%A{LDl*wH!!+>hZU0X=E63Ja&D!D15GTokH|9<&<NZY?*p6GXw
z3640E1y~>&Mktv^u}vi+o16kx!b&EVvy$@aT=p0Xd(9OUK1y-JL&1q-kp#xP0!9Rh
zn^00rM<FQom2Hkv+!F<3Ml6M*kw6%Kfdsuuqgw#Mv$U^3oWGI<lwc)dw~Sa$DQ>|W
zEZZ5ef{}E~RI-$uOeI&zld>n0?1 at r#b2-T_m$Ii+)2)PfOX9qW{k!aQpa=W6*%Nx;
zShk$Z>0vLhOotsixZxKNJKzS3SFSMUX9)2Sb^vLz1xy;96KYUAF1V$Dq)N@(zw6$Q
zl>OW8iTXTbZ^AhO5&poB at cP-SEY)p$2ny&CvkdVNPHlv0=sN0BXN}-)xKKooxOt(k
z%c+%QeW``;eKMpgWDcemvLq!r=B&VkFn>Yc{vCPxJ0SLN$tT*UF!nhs_F=8Ge?Ol7
z4wwBK@(Di1gwEb(QU32+OmP+db;zsvw`tVH%H+zPb!V)oTyxqP%eqcGYt{P7P3z7&
zeSOcm-a(s2a~s*WVtrp_- at 0{c)|;8j*KMqvzP5Km-}>OPvrb#Pyr+D5`N|b*SDba)
znu_JW!rx>OidiXBG8IODFo*uB6Mj at _{uvvUS0K%wRu3zDG?1>knKlkUu;+v(G<`N@
z|Cy_YnS=h!xUn1;RdFsQ76+nv!*J+l5znXKQ4>75icWtzR+4#w98mN_M4qjwhqVNG
zjH2UjyqIK>Ao~^l*F;_dZaqP+v}6<6q2rIuD0~^9k>Kc1bO&ZWUkkD`K^~>(Swub?
zWLJXxq at vf_WOss`qqt|C3gN8nEdHoeipNQ+;g6xXN73o8%kUR~y@@hg75zLSzXWnp
zf;?T(ud>O$1i8X$=3C(QdtDC^%gO5Dfc7X*249?%aW|jjbLYVR_!PzGDI_pm^Cd}2
ztKsvN5 at m+R=dU9$Gs71cOJG*a7nIDi5BZWMm~*QyB*CKFec`FZ(|$zp(~t_ULvzr0
z%CYq;e!>aDd5Sg%>``7Fpz=|Tj|iqH!BiHEsKGQIOxF~BJ;{3#1`tg2%~14<i2M at B
z$q8~$(GL^(ERaJ9a at ewq^&p4!$BAPTU`m3c)iROCRP}JGCsS&Ga76!@xU<2Xmf%LC
z4E%`+9s at Z&L0+ur*+eb at Ihr7!s_1n at t^_$FL3SwmEFxEfoS7i6Q}iw(*MppuAWyZ(
ztsrOXyNKg`v at e$6C{XkpY;sP5T(9W&+2q^=`6NYu)+XmA$mvS5oGNwd;r!(Hh at oCR
zT#(53D#=p8W7NZi$!<6t-l!ffO5|fND~GFDJzT7pQT`;fvLwNfp_r3?A;_irY~ol4
zI3mFjQS=oyxhz30QS_}uz60Fl3GyDrn{|NbC)C3gA#b+CZ>onYljXquQ9WGcjmhBz
ztk!=@tnV at P@W_OSv5Nj8kskngRDztP=<gHxYmjRaWRCbv;BQLtOweonI8ITtATBd?
zN79Tdv}#{2&0=ko;>)91qt$7?d<jMyz5)sAJ-$K-8vMQ at 3C4tc#S)B-_(~*b%<z>;
z&=m8HkYIeiuS|lLVqdug6UuxQnfPO1+N3I9RX%|!HNI+D`?PxBNC~Dl`bL#dR_l0Q
zT`hrGlYI3J1ZGe1jcFn<XR2 at PbOQ6H`I_bvSUl6$(oNvx1-^-A5a?+4O_o)h(&3vz
zI at V6@^iA!ftfgJP>9VfQ9$)KLqAXjZ_;Ufmm44EURt;Rst`;@$`J)}GXwX^01K_}J
zHu6&%wGrA9fbr}aZ5i(4SfywdhW~Wn at C5%^bep7+lb9xgiQ>hIcNW#oPgM`sne%KX
z{M~5JY&qzJ>&<yl2*YVGCx0)7ZjAmcMDopmV-ur0&6-60AUB#z55Xq=uf)6zusOjT
zQgk2wI2+#w^0)+fqM{cP`6`gdC&)!gawC!dp&o8YP^%RGEKs#JT;@3<+9|ltWrbpn
z!TjBnu@;vOV^UIwVYK+>??TF$p!iOvF)$`-inbS&B}TLV0Pd-`;}ZEXU4B9rN-Emj
zxGr#{OWmEsO8q3!{}?XXGq@}^#wIQH8+E?6&yX at kE53y^tVX@&TO>h);cF)i8)H0*
z|10pMX)2cbrH-iP!u?cMB~Eb|QhKMe(>>t^@UpgLd;xn5e-<cR-ESNKruG7Rx`C-#
zQFZ at j{7rgxnu+_a;3rFdC1WB5L9A^RpN&J8{l=BJ6B89a08DdF$(*zeYZz-=&0oiP
zkCfJXkpF>GJ0W?^Rs0Q3a|F2O>ICk(hX2v#@4VK+O4j7fQrPMI0$V`ub$pk^O4gJ^
z at Pe#u4ZmKNq$XVjOwy at I*8|(N-oS6LanFqj+;vj|cOFXMj>8GuescmZaPu2wUD;EA
zM*ZRYkN4lgALA+lE+p>jzm-33*2DMT-TyuQgxOLhbJ|bA&f3o4|FAm=rTo)w5|r{y
zTq)OZMI*&2vFXpqLTh<QqcORShh+wE-}iZnjeEm9RilNSw0k>`Xw+vVtF=uQUdLaw
zYwWuQYqFG_G2?_(YcF5SNo#K0DTA~Y=1Vw91NPs+Pv&y%SNHec$xpEbt@!~zRq`k~
zGwWq7XYxudHhZqb>-iYX6gtN2hkH&1<gvCsK3TR6?d(0mr`UMS!36HPhEKKo)pZr0
zrdgKKd6dtv`Zc#zHhlyCC!>y1O+N&-Os(%O{*9zlC3ka0C7UG0+=HVI%NV+L at FbNc
zu;QM#Q8sxa-)y(0?+D*!)|5Mcs?6NP^B5_?eNu_+#%6w@&5UmBwlTU9$2~tv;I4ZU
zxbqsm$L?OoRs15md+kU0rDmmB3rs`V!n0*_&F*EZiSEVhZlHTP@$TKn%hV+LON{Qe
zT-oZg`9pTgHXq@~OzC+G>91w7wsZI+ntRdJvO8P(uVg0GbO4wX2JE??|60<s+nd1$
z74|&9U)8>b+OijuU4qiNga3~v6`8$cp-Jj^kbfY1g=E&r6#BBZbNLzZp~?ZaYj}XK
zWf5v~M#lxXvbJr!6DPX+H~*NQCdX6BI%Tnx(9bU(AmL(L0$Ox2qZXmPp$GXT3<t-G
zl7H&cve0?_EgJ9w^y?x17O?^P5Ae6B{zA;5`}n)LC;-^|3;t&du6c^TN6H4Z=V|^I
z3wAxj-?w1rv-|@Kw*QiUNOHkD_gDO53(ovC|C}lYb^LSu3rXesAMSsie@)h`WGtmW
z>CM{C=h at PW9>ATNq-1oO8QXc9%(x$S5~O6EX2_x1!HcDXrlGnL*!I0I0MnuZy8pj;
ziS5LDZ{VdiUUPttkhMU+UBBUF?5F5?_Oe?cod)u^d=#S<C3|_VN$L0<uay+4zKj0O
zI&0g>Ush=%Q1xzL(gLvO2H<BQj)v|={)*%Q?t9U~*(-LMLf5~<f3GeDhRp6RtU9di
z0{&^-&fUPa%scpJaXCT$dEDlc6L`%H3Ebo3U#OO^=nC*JZQS`X|EpcL;}!mu#Mvv)
zG~3f2;!~u5Q<S`(U7)eHUHox1f7O18FXW at BIb=X#K8k#zlCio}+SYDft5SEbf!8J;
z>h4v1v|VlQ0mSAsrl7+wG}uk(c@;6Y9MX)_t7QN8 at RcN}=l8r%B})PBI><NK1v;<d
zn{A;T*YGWNW$g#}xpoC}AL83&+3YnvXdEO=dw}mYDQ9djdphYsevOoaAzm9ZxyHZ7
zzb|!+(O7q`?D0kXFS2GD;r~ux&+8UeGJ3C<j2H7?NE5vVcdP%K5Avr>8#;5ES!v%N
z_%lqJypna+VOj1H#Ddg+s^A)6d$<n(Tl#_n?lg6jwSK2m_NDw~d&V1Y0NaJ`0k-U}
zH;2DsoA;U{{8ek-^wBn#we97f#s&Nk*dDP1{4+^cayO((#>;q?BxG$|BWvErZ;_Iy
zxjDepM6&pMfUTP0gKm{Rh(_)~{ynq9xtmOZ`*}nP$lAP2R&Y6=8lS-jfNg<)1eWf*
zh`*8t&eQzAK!Bz_hf9w!KdC2VO!qCP>29<tzAg&Vj2W75#WVu53}3gT%<=eEN-)nq
zU>l#N_>(a?os{Dz6O$(f{vx84;iA>x@^g1l at z1N=`G)V<B}lqZ%W(-H{NepXnd|pG
zBEh_n at 23(hjQD;=fBe_gp5c3xs&Fld`5wEGKu5msNl7`SOmR}3PGZz3(EN!z*KsEj
z^2~uN&buh%L0q12q-nGZdYlzI$VW&9L-EV$@+*|211%Xy(1F&~i2TOlPe7~u9Q<MD
z&oEkQIcazooo6)wX%ldXD54oRonu#{84gtjC}3d;mQ8qCy^>0XaEj$z1LSgV#?^g4
zE{c=pg@;^&TYH^(-G+7 at OVY`fwL?rva!GUt4%&Qo5I0Zv-GjTKmg)|N<~#=MdkmKh
zQRL6468T2Jla8iptvD!^V3rXGj3UZhe;`?cd7(f^f`ySlnEo!c)}9eaX(6yA7D$~!
zpd&vJl at zE~WP{=>q6?4uDsfLzt8}l!5LDPV9+#lV4T{5P2A_|VR18<dBFbKhOFB>U
zt;9V|E!HCrHJN<BK4|rV`3xp=>o2Q$m<B&OKCOKQ7gxEL?q_C<)|I<=VAMAYX#(
zj6i_|*ZTv765J386iIMnERZ6>O~rv?2 at X{Sq7odg50pr7^Y}oi1h-5JjF8~gxq&hX
zZfg&eOK^K<phAK>dIFUa+}RtblHdoM6(^0hlTvaVM(Uj at oLbG=MzK^Pr^40dvos5K
zrm%DiwimJt3(hTNSr(kuz+x7hG=}B=2v(>>w6OHtHEh%m0n*?a#<Eclo3N*m)mR0(
znpiFQFI3st%<9OT06WITVf*+vT+m`dB_dvs!t2<Mgzy~+;X7^N&Fm6OV&}Lx>=+-1
z?JaS*pov{-HDvAtwzmk&6&f;gVjNDJ#4e*MK%F!>4#!Vn`y`cOm#J*Og at 4>Xja_cx
z`}(KH@!kC+*nw)2&G#SaFJo5_PM0TvpxoZy%6=ki=KF8$pTT}=;Y0m1*`s7|;JLnk
z7JJ5`U)?{OJ!jGP_0MImTQy$NKac&1=;@Arv(y#+bJ*{QqNE#ROww+U-Ze?iu_kFJ
zNFPfQ7D(40KxA#BSs!VW2C#|sJ!&eTcRt%dGZVV#If-quU}q)UV!`$W>}-Nc)D6c2
zG4-sQx=Lc&SU1f#94ZUV`5*)e@&Hb9N8;y5I-eyP86;L|)1h5TJ6LjPe?``Y9Jn#1
z0{LagHW6#%EW#mNW04=AAfU(1(%u2o5V&Ts^b;mrgJ{x%J+V0K%8A3yTo%0<vQex9
z*8VJ at V81jAx0kbQDlF9PCSg$p%W<I*_^02Ei{l|&T=0R0i+rF{{1$2QfljAH<O5x=
zfoAY at 7fEucrEcA!>F-my&vD5VMV?IZfnLunYDKH!^-D0z at CLexGS}}-mSA4U8<JpQ
z#2Y at Hvf4AeDSZT%#Js6n2z2CoGb9B*Fp2z{YY8s!fv#n^!w0(I1Cyw*YdtRTfxaYa
zss93`0(e&fuNfp=MA?_)0w3tQ7I*kSH+*0)iiaEDN7`{WE(KZ#HwygPBJRwS9&|C*
zt$c}2<~Z$so)}-jrA)h$8D$=A6>}Czt)O~mszkj^a~A&-JlZBajPa9dWh3y)To8B!
zkGRrtFI5ZOB?eQ-l4-qLr&;FlFd~olb72(Y!KHF~i;o3pt*Zsn$ikR{hc<Z0$#5uL
zc&0_AkJ+VPL+R;=D^$n30UU=)5%l;6Z_Pl&C=wy4N<0P9rVu?wYvc?d$4PYI5y#26
z>uRAP45k{Zkw6rM$3ABPxp}(dY}{RHso})3=b`662oDc)$9|wpZN4irq)m5wpFj%Z
z?#7E%05ddqI#s64GTc!~nd5P1NPqx_KaDKM3%EqINv?>YwYZbsC2l+qPo=hMIAL>q
z43MHV^Dl7sP*LHAj)k8tl*D5ix`dH-Wa1Lm#=63Ot<LS6ij+25aho<+uepQL7#j?C
zavNpgM2*h`@XD?QM9>IfQfGC6#4_**D~Yt at I}=GIruefBhciYMvMlv5UQE20*fR0#
zDv7qh0b;{D8<;Lik>0_Ri~RZ`9?CtAv<_nm6-q?L<aivk0v>fdi+jFWW#l=GFe$fO
zb7ZCzD=8%`rBqEBp`^e?@b|&QKf%SQK!ihVl}0D$7~fQCUc~WxYEoMjE2OrWOI0C_
z0-&dn6_K6*{Y|Wx7!cZSZe}GG>>I~Q-vL9^xX8 at w9nZ>0Nf7KL at 5|b%SxYUVI}+?=
zEhHEsP;LT^D`0O6n at G}>3>SrQtZgJ4P0SP6XsevZ%SKxb@{eQnR1OTGD65y{GTqcE
zTE1tR<z`YjCF03PJ6Kx{TSS9pW-YQs`q(0xX`uQivPD*JdM2?`$DnM~OAo-&wytrk
z%W7uFWVV9L4T6)d#+9|zvb71pYe{g_w-h-j2SL3g2+V$RHLR_UeQYyNVISM-oytC$
z0yb(zH~W+rNFgiP=eL3ih|Ss;7VKHYz8vc`TeX_~)q<U;v#%`Jv4(wZ!S*xQ-z>Ob
zE&IC#=dNS_m~2Xz*~k8A!D$=VH^h*Ig?%I5h#;(F2a3=DTK)`1t%_khrT|mBfjujM
zsa?SS9=sD^;m|7Pk^(@FtWMyJ)0x|*$JQip{#52+qyX?2p8-sj1DCDE%TyMwS_e#R
z1-+(^CE2)s1F*%@xRLox%=iCH=|+MYjUM%E!b=-TIOPWJ+{}_~+`ff{Y&>@^OR at 2^
zHWsn*__JBMiTVB?_n*U}cH-{-t#|=MN~NIXT$UYAY}>~2*e=p0-+yS^c2>k_(jsy7
zwjGJYzHK{Mv7NJf+eL}QdD||=8zokmzn*(ZBJs|-m$E60YzoqD- at 2F0VfikMMo#c;
zTq(kMC1GE$B<$-|+rCz^-_t0;)IvS%HOr{_Cb0h|!zHV`jJ-}&B|G_HDY1c_F<|V^
zu*bf4AL!IVj7MlcTgzw~0Y@%p>&%wpNb3OWWmU3yp*tveX&b|~+0C24w%L<#D(knK
z=VRwtZCcaJ&Zh}Y)992q?7V_)Z-hip7c5~rCId#p%S^VpSF$~;0hMUVmuL)FW*%g>
z69sVmRqT#=RFFc{tJx7rrV+h{9VHx1{TngTx%{>4F)R1({_EoSNdNWh at g<Oee|!%v
zNnunX-8IA0b*Rj75-uyWD_tuh+BWyJ%aGFg75Ab!Fg$I$=5Aj~V5i|;`Xqr}9(U)f
z1orsdr=1|MKcw(0P|94LNDrbFbUZ8tO#LA)jt6jA=qSovSmnq!+|$YWbgYuC5 at 2zh
zkxZ1ie)lX1=7rp|C0H17&xuf0dxm>%jKGqZdtL#7j(m5Uq#!y<r4dafM#mUbJkybz
zN~%bz21Rz2E2(vq+l<Qsp5~Z>`$=lCG2fx$<pVTz0SIRMsi4BUD7_9B at jYA=-iK at Q
z$sW8H5n4<fI^v$tJc$tZgqB=`e4XMRxoFzzy^~6vYUtOoP>19_gi at zSMA0OF2Kk9v
zt>yd=Am$Mdf0wfH2D!P=%WP3c$v92nUZh=JAxEX#Tx)kLZgZ)<$Z#*KK&E~Pj!LM&
zaz_P6{R$tCL at F(*yp_-#TpWvVS?{RNUGI0)8tz^>E^8F`nOi{D*BS1!q^i&KD5=|s
z-PCf8V=oeW9A&OO=Q&E;{WJ>twTk;Z39d8T=Sy(C- at RFa8zS!Q65JSb&z0b&V)qUS
z4pq6^Bsg5}-YLP&<K1UVaLY9J1rppk*S$-E+uGe1N^pCp`y2`G=y9Jb!JWPC-4bA{
zoUnAfMjW?#t^{dVPSsy$Ni_79eFSNQPu8zwe5nf^B(-)qMk=ZfbtBH)fxFzqw1e%{
zG73=VAmY3)9%qWR at i>z<WNvMwaEG)?UF)Ec+>KW at B)G`Xopk=pF)CUYfJ2RHbR?s*
zDu-|w8Xe5Iv<gl_R1Zb4VjUt?<8ne5(gDtm#PNMfD(+iwb9i;;NirOqHZk%{$NLCS
zrv8AM6w{BWK3|B&<%f7fK2$~ME>-iT(9wy0w`%wz65XSEd})&JN2=eKF44Ve$QPC9
zJ~iUYkm!CjL(wu&Hd)WsC_)LU=~@}?0aohpJ2aUW)+^;bRUaYqvK*b9qAE9SD7+`*
zlB?gKC3*C#HD9(Ado7NaViH}aX}%nZuGb8OQ)lJ*hI=oHX$NsBP$L>`Zt_{7BM;B1
z1Kd1_EEG*I!dnM4Gg&KIWKx*PIx(pqg#x;n94)5Gq{B?si&mL5%w&U at MaiJkOpX!r
zwrWVa%;Y$+fRX{XnH(<`{e+SpGua}R$fVayP7tTaWRjVjC^{(_^qI*?V)<i~^qa}a
zqK8I27%-Dl#Oahw4$>D|Sld)_?=Qd{LNqf=-1{5AFhbEq;{Fa;B4BTic!2iLfNNHX
zhlm%jXSFy+1D2BfCo`|>bn)0U5RlioMm%o8jx)q7R00km^b1^B+jMb#qPpv;I at Ihr
zU0hEk0R3yk4OZd4GsKO=n-bn;*3r9G9J1<PvrgPbhXN3sk|X=kDz+yCZ%+u`VM$xl
zD|T9id(IRW&`6}D9yJAbo+WnEL_*^`){8xK=mU6ipSYOp19e2Qab;~Y#934+>1sn9
zdN!I+;lGEWxZl7<dk2>qtte7crR5uX(RdW%cpa-)f?0-MGMOlI{rU(A=7sb!2^L25
z@>a at f&(JI86Ic?{D;E*y$k#_n3RWgJHP%gx8XZiOYPoJ24CiuC<Rs>byN7anaT%$m
zX`6Ac#`$m+R;KfT-Mc7vFD}hmeWcm1)f)O(*|;@|-gr0Ye4U{;$@<`)-S-o_Syc_c
z1(kEE&oNDCaw^U=g8XG-c>|Y)&PigS;cU at o)6tA`f}*!kNhiJ70q>$La5m$OcSKzz
zA|2m4Q_}IRGbNpp3MUCXA8D-&my?`h#Yui=ojzwFQqIv>&1nFf^_o6Uf(ApMPowIj
zZRg40iSpBMb$8>Ut;J=fJ}09_AE&o}jD+5TZR0-(Oz`U`OE590cSy%DDWsnwoz~=t
zeya3nQ!@0W5=@Qhoswr-zJ8i4HN9A0CP8bdzFdMCWqOwcGb{8J63nX7yCs-CQgM=N
zks|{KO(U~Jk1B2GFRcO}BaC56j>0IGORk28MuwuqU_&0<RX!3|mP#uD-Y?ZyDJ9#4
zP_rb!dz)V3(0PVT<6y;FUY1~0k;_XD1m8!3^%9WkA=rG2l~qfjaIlS3^d&3_Vj78>
zhs$)uF$*`2_jC>2aA>rRBNjEmQlV%Yi25pyED}^rab7}Hyk&e?OOQQ^lPrg+Ad3V!
zi0206j~r^JN2djdwHd6&D>qj)WG_kBTu)`SC(vrZzG<wEp!rTH2<xY_>C{df6j*-N
z$xbGL9;f+K*u~mOS}SWOD!!?-2UphSX6KR|%9_E>rHTMOGfip|-~Y+hS!~+|s-N%w
z%hop5Puy_N56aSBw%abf(1d78=OT8|&rkwh+vG}OhZ9^9nq0S-TwYp^S(}d?v$;Ci
zF>)Q?+Psh*H)~8Xx%}*j1lJP at t|v_{-%q5h0Q)s%QLj#8zwR~F*Sm~8XBAkpkUeh}
z at c%&;Xky<G7Zq5}zWD|)2sLzJ)2qRXlA-Vw7)W9P?(N3t5mrKYVV&CEjJ+WW7%Oon
z9a7;QU}6IHuSnof7rqopiwfwG<-pVq2;IC2+eoW|zSS(lruUwX9i^-+9HhfK);5lf
zvIQG!EKCB<U^NzFvdK7}H4R`ivB}tMGNy#qN{KCOs$JdYwQRb?N@}=VW=>#>SvbW!
z*O<tb$xQ0&I$(;5sIR?jxx|p(cP8tR{R8eji><QhYu2;X5-X8Za~YY$XOSLA=Y4VL
z*<eB?5=oQQPv-LyTs8!kgbMcvE$w}1(ET|sjSffpSiGni4U$svqGmLiMguQuMne*e
zHlkq(>OE2Vst=An{n1nj#)P7H+y~0oNHk4?#*ApX1WmDMRD$vO(F_S%ildnlOel+H
zkr&5{n$ehtz?7P3j;wuJeKc2s>5b7md;<bUm*b;_nFMA{iWcV(m^~$0T0mgV)aZz6
z0`sOt%f}E{JTqE7o50BnqNCafbhJlnWfiA%MC<N?a`2*NbTlakFKR{`WL=#-(J@^_
z!Hb${<PXy5E!K?eG*XWnUxiQ##MM|>G+u-?utaBqn53g)N?INAGt0CQ?g;=@;u?1=
z?v<jFR|q5RB;bsZX-nu<BYjo99!wN3R?^64W-ZvojH>AD`@m*k0Om+g*Aks8LBsaw
zJPF1=o;_cJW{qW^B+<mlm^<<2v?%FIBhI{N`=^lPEKs6LBq&s)CzF1hBeZCT1ZAG+
zDPIz$0$b(9LUofOP8HXt(LIgSqpZYILQ6~x3xHe+reQ^yF&h4#y^gF~!DxM-K`t+K
zq!KlqH{&i?sirwJ`5f4zX_-3S?KYV1RCSl4yK#oP985kn%1_5ViB)NMY~bhvc5K0g
zpN~sO8)<~FU2*zPMoR2foB;_gGMvGiiGuA4zY`!?t8h>O7wg8AwS{@Q8<Qi8r{4oF
zgD-*mBsqm=Q+Y4XlgU(`pJavQ5ngr!IH^!JFC!+!BTV<7!K*0k(mwzLYs=&{KFrk^
zuYUk(z}{TmV8L~Hd at ODAK<&xr6Mt&Lt{Ohcf}OQ|GC{xNzaSE9?R9)ANe5gonopwz
z25 at eD9L{XuGuMIYm(SRcH*E}`Pg=r1yz_u~MUC*IxTmv1EzMx^ae;#xq2=IY`U!vl
zy_LmZz-5$H6dXknrL%zEs1vP<vrvLrhO>yC at Qb;AXNd&!Le5eN7Dk*SMp0IKhO?}Z
zz>=7=yoEqVzH_9cAfl856Cg%TUxz5xa+3qpo6szz!reqy0`uv%1eYo`jW5H!k`-g*
z)RbyGJF%mg*>20!8oi2g7!O!f)&xP%$4!m-?Vy918xnjOn5q)0Ibb?V(J_t=mO at lT
zxdbLlHhkO`+y%kKI4e+nTk(w~GIq;`i%9Ty+3-w=!Fzs(ncfcMI1QI9#W)2w4d2Ld
z;u|@txqr?>c%z>Sx{G)auks6U3y6{KKuA=2T(=Q%x8g~X;3C80J4O_;;~xTeF&!Sj
z-Gk}ib{PCIV85vFl8~ez*$mzqJ<PRayfpp>rLYOt5^aJTrspw46$$DHMR>>pK-Ck}
z1&YYEsE!1+UXgDv at SXT>Pl9 at fB51EiRA+*ktt5qHlkhCdl at yjRq8@hpQnnKF=?K$2
zd?#S7ex<uMqHpu0{tPL-A79+O7K5*E*F2?n64+^Ys{I%SeV4~GvVg!Izh_h>0i5D_
zpF}A?jb-3>K!L3&qIh2gH2#1Ke;bzqQ4}noXPlnMIAm+B`2MK`vkXuAB%;jqdom=L
z7xH9EurT7unoe2m8J=u1O+4fD#1;|g$oJ$+3M|{8p)!b(&%-4ua+3{ejJ_NxX$o91
zdMLXWmpoYZX54dO**Ol?dp at vt7v=87r5Ka-Anrw&tc3>i-UMv+Oq#0qE=nK6CGZh0
ziub3uhRW%=W_Sc~XgJ>s$0Wk}UbyT8^5t_)ovM(HVT$*2Dpf^Ki^CO?_Yg`|N<`;-
z-Y^uKs8vo=#ajxZoG{)R%6<&B$sF@?5@>-qP4TuP9jc)xvtiSw at h~lH8Z|vk^VRi(
z0WUk^n_8*60ULOTg&IQK&%&c=5P1Misy|9hLFx#NDNknj_Sr+ASz7fz0_>&P<QwxG
zv6e$#QtHcq6SaS`(8QSb0Sk|<#CAyg5b_#p34H{4O|%)-K4wO^S)xyvCtSURXrD5F
zcw8T$uURNOeh;C)u}HXuUNO=Bfp5ioYk(r&F}RvaBKeA!Hp_{$rL?8rCR#aLD2FV^
z)E^<mOZ(-t0Lcs7N*5Xui~kO!Q%S2ec;@Y;R~Y<s1QU237sX3E)KnVQD!d3FSJw%S
zU^=a`)A7DgbdnOC%%W4&=u{;-O;x<)n7n_ZGGsvIcsTAQ1NG8$@g`$k*II?<%>XcH
zoHBexD8SklX}KyjDHGl^W??+z*}757lXQF;xJoj%Yn1~S<JhywqT~Cu2oWH0u~x5A
zPf6lt;4i2*89 at qFSlbe<B`#$%FlAD8o3sg%4!n7bHqoj&dA=-kvNlUHni5S+jGMIC
z7Go$$GInU~0~p&?(x#FTrnsB6ouVy|SA90{1y~|T$_TB?uDY*6TVdngv0ArE!<L;w
zss-non6}ESPl=_zBxRneZBorvZL%x&oULt^vO)Jx*S6SohGG_mq~3G1v+a7;jMdJO
z^?=^9Rof<YmmTRe>+CvLJKw4^BW*N>lC>?>_Q{S>y=MbcKY%^kwEdC}IejCv%We6+
z71{wCuj$tg+B`kyY1hd%XQx~J>xyYN*mXtoWdAy~hdB9os_T4UTBnqZj7>80H0}6+
z%;Q#O=I1hVnf3&y2|y)X7FIH{&XbwTwU?wpo0%_3MkObEpUmvyrMVcE?R>;V=$Voi
zGYxeGug!<79lVyzRmsaS4>G!WBauh*Mkh=g&@-Jk5eJ|@#+zskC<VEueXQhj$Pt+Z
zBvcCW%&Z>XMxNfxY9lVCa0WkEG?O2sZWN8?2Pwa37Qc$57tQ8Z5xsa0znUs8p3840
zFIGH{-$EX&cs{>X-cRD+llKMuHp$<{Zzs21ypW$DIZ9ssFOZ~f`Fuik&*YyF8#R73
z|HNuhXcqsJm`f(%Af{jg`1xnN6y`DwY23T!n)gn6B7k&zC+;H<UG|vwxxMCn=4SIg
z?L6~7X*b>J5#Bx%JlKD=3GVJc1c25RJ}X<dnty4w?#o2$zD%_4uhcp)L}v4^h(R{A
zNH+BA|9=`9D_((mS=;Gc#hW0cN0m`afT2j0QCoqbNzSOTG}(4?A$gRt5;LY;!+Y6z
zu(|S5dPG3qA6iPrPdy*am(no9FncfHog^7>%`Sc#2?Ol8koVH~E9E0T!IibG<>%12
zQ-R%lD?z2AY=;!Pj at QXHP&-Ehld%DN%J^tTYa-gVbqlX&<m!Pp?@8dka}v0>GJ)4z
z#2XmZpIwe46)Ls*V&25a__Hf6Hsy3(!l&4M at 4S>xWwKFdR^?dP;$FTo-mJX|>^aB6
zN at Z1nWIU5Emy8wF$7T8~zEH}d{_F)Nl~8{!O<@0Jd=ax2h0s3UZu3Vj2DZjy^A^6?
z?sMOMzQk-_#mEt|lJ&gM7HnJ&OrDu4*_)vI&*4S3u&rb9Esa!+m{Kt+A_er}<#4NI
z5D*z4z@#e`HJ3=n4LGJwFlG#3H0d-X=ip1PR<rxIByjIoywWaf^-?(Or2xiDy9dRE
z<67E}v?Ree=ncdlV|Th^3U(pt4s5f3hTd4Gt0{7$BQ#YsQF9RbGmcmL5Zz+s=J at 3h
zs at I`Dr#sY1#L(ts8ALL8R3=?4W at sjKvwWwuq4lt07lsEBDoIt`da*P`FDs|R5)Z62
zk5!y$!Zo$5(t<s8tZIZV8M^9OwFNsH*hmX at jA5fJ*glrkSa3ljtF_?VCRRt^vPBg$
z at gkB1r%hz_7Q>`Ttbw57cF?O-tS!JEr8ZG>^Vnn55I|3D9Qy0n<5U3DP<<Rm8sacx
z412<2h>eZI{KhyeZemYTLm;7SLL632WIwlx)l4!W8r?IQJ at tE2FP&4^)0Vc{r?O`(
zICm8LrNuC9Jo~i;$4_I=OGw^zI{Teurf(^>#_{cVGxtS{PH*Pg_-eeF`;tZ9hc|O2
zR^0ePDrqOkCQ=@0XAYZaYiBN-WR2L?d2DhEIMMXY^G%3fO_?CeCbJodvNIB8XA)H0
zu2RVr!fRgf8Wvf4^2}xJ*4S;G&z9IV%rl|lcAJwd%$6p~E=`o}B&aw%6J-r4tZNl&
zaC_y`fwl-cJyGa%YY0%Ggw&6DY>ic6-+U7)?j(BJz}nK-S&6b|CCW;uxP4}`(%I$&
z*X9J*7J_&y(d3Ha)tY$6w<WkFRNR3EX`UJE3Yu;-08`kNRssLiIE;*n!`NhY&|)Ya
zABR=b;;?=?yXtJy5F1-9NH1Q^WLHZv-~WU%BaWX^X0dB5`Y)A}Ossf=a4pb8CcBv0
zm6UuyCbQU1yE6++NXFd8E+DGn44Gavo4rFFS;*e$H=E(<Wbfcy21*H=3XZY&?e2E6
z_bCf<`WCVec1qQy{7Kf9!(@O$vO3vk#0BWdW1m?@=C5U+TQF3|KDTs>=lx$;Fry(3
zV`Jhle=PgbVkmAjA!^6th`-9(#VP2EUyF(rxck&9o`f%Akbg at RLElEoI|moB1D6^{
zQJ{w2_zC9Iw8R at f!2$_p8NtFgh%(n7ES6wiC|DxF!bq_6P0DJ|2#$E4z>-+7f?mVG
z8$ZEOl7h1WKWWrYjDof+MUGtmCzSXamvSv#HmFQ3O- at 3=P!TR1-x0!1L~*Is(nKEa
zRcbM>bg1ExhQn8dw4c75!$<4P*G#F2xQH3Jv^eSmE%ahcuvs>LjS?J3ze|7 at V}j#l
zi}2)C{zib+m>M57&qw+am*BG0n3S><-=GgJx)mvWgFbjFwVJ*`FOGn6iqY)52lrI!
zL*(Z`k!R^bNySGJe9z+|UdE-v7 at N|8Z_EeV at neAWjrrhWn%DTod~k^b4MtEtRikgr
z`yAj&^HIOzFI-=bMNqDWlL9!*oQXA%9^#rWTyy!tbv3wk9FWmF*8&G*n!`}=CSpNB
zvfu at 0rTSB&1%YT#UylGztx<Tv^yG1AW87oiDyB3~QKl#J0wf_+izjd*DDuJD?56J&
z=rv#>7AoOjY&uQ{jU3QMBhy(309z(@x4Rh>H+}&X^^K31a*NWaLd*%XZd;Bwo|Fwq
zN at i4^+6DD_Wiu&JkEGuxs|aYQIl&Yx22%#KlWa9l$_as>gp-lgh&oeJ08E*wVU#Wc
zEh40}v_deZ3k4 at nvisDDXw9Hx#?X!+oEl6rdzLkrNF7E@>6Thhl-ST*QbtY%euHbE
zj)<5$lt^;&h7u8M50dCM>%&7It1E6QRv7P!OcogmsUZUWVPloh^=|yoAMER2T8kWa
z(^AZF*X(f@=D6z#GjSwLz!++0PICxdVMasXHiy6yw>KD{H{K{DlHvv+$N+qCMzV%D
zqg%E<5a*S~5~L0#4>pyMZ7ShJSvu7lXs1vUjX~;Qy+sD|*tU$vUIUe#ZjW{J+wA{F
zy+fI)em+>THn=(XG69(lrlhG)M_e&bni20D63)0*qy}AaMrhET7&A}2jHyg-yqHvG
zk~zpe(kXu2j0`Ja8$d8I+(QlMyIsvt14^_)8j<NdhKl;vp3BsLW?GamEedLZhZ@*d
zBT<WUu*Y#Fx(<~L?zhKw7GClaNoLD^vggpPKhg7qHsY0nAvrD at iBMd$9EtE?)5JF@
zOfQCCha>g=hXyy;ETXnq4E9*?3`0E at NMvPM@$!Ny%^qZl!nX2Q+!iHQ&LA$!?c~P0
zY8p^p7~P<H|BnYUu0U9*NJxdP#}z1TQo0#)VS<}UI4Gw%N-o<z-KIi4iNW&5tH7{e
z!I8 at iU}CwEBZTEf9zPFo(6Y0nI6P1rNH%>&^0yU3yrH=IqzewmbuN=B_L!x9yEM!o
zp#bUR(rkmoibW$9CA-Y9x&VcJOWUk1Z+&XtcP{yf8KEV5Q-cO$+iZ4jZGpLJQcZe-
zNIc)F=wC(_1F9J~Ou`%{-5w@~IZSe%nl1qIG!bsNXfWLIfkRh4L-j?v_72u{(qLWt
zY+d6)#lYdS4LvYaq&cp^xKL^Th%*KT3!y=UFlneA;h{uR(%_{A(ug;8P-6s<zGL=N
zKq!YiJz)|U|G{%2!wz^d69G?_<QHc2lRbbR7XQB)MJh8mI)vV}#DI#yK1{cLn8R#o
zVj)7Y#6l!zuWOKkEO&%>VBm6!_o%;Xl)Qt<q_3o*(oD_z;v*%en%^G&fN5*NgeK+W
zN+uf%nRXer?J_0dH~v#?B@{GZVv#OwI}<~jOMTD>cm97<*>{ERLk4HyY}3tNIqY5;
zrUsme&YAuaHsMZa1(R%my+FLz99T>%+CJFk0X17mxij$FJ}O}PsP9&DycSd$j at Kd`
zFMf{JTsu<Z^BqhPa&_>3w5X&HHoT~9c!Sry_yUGkqXy2{p{t&47XKnb9~2$ZNaYST
ztGw?TO>E8vnsUKV9 at 9VzE3n%!Eh9#6Sr-XwpF$qDnAA#{lqkt$)yXs)+TDxYi!c<W
zR6#XzMo?=Alnt5}mUAipcEvd79YmCB!n-Dei<7PX=MG|k$qyVe5l^7SW>7Y$miUao
z8v}!<I_cRtsF{|Jz*}bn6+3v78JCAm=0L6?F2n5GcQ_5i0H%fe&G`|CTd5h<1mlJ(
zomjFtt3vjy3MZyhN}?n at ygefZ?m34}@b3<m2P$xY=T%0hW1YtPGb3R&cz^V7*eT(L
z1P%!ZWn*&ylfZ`_jm*I3Onm6gT+XsppUCpu1+3KGd*z;Yog-H at j#{7j&=u{gR4V;~
zasO9i`koa2mtJ|;b?+Hpxj<CkAN|-{pSo{JzqsYZOJeHd*Z+=04K1DwPAz)WF*UlS
z?+>$onVC^`v*Rr?Y*9Apot&HRxiaJRio5?-v7%=s{ZfIpDEp=davLX1+_&K$uLlmj
zehU4(2pjRq4^MjX5_Zqwhw8`9yE51 at 0Ytv<EVjH-xnubw?nma0EZ*2p-<(%(-P`s4
zktgrDY2njXP0lMj*eGACdFKadSB*G!`E4n$J^xzo?z>JrOvR_1_nXz9yU#iN`DcG=
zUG~VU>ook#h<d09Ilobv at VJblqUyLP)Eh;bQ6Yl*O5rE0_lRU;g$Oo_EF^iODAnH-
zDS(0Pg6mBp4CvA~0J|Fn-VZ->pWrTIhVX$N)^~v3D3Tim)7?#&*q4ev;c#838}0mt
z&D|nX=O-MELg?N6`pw&gN9S)L>C(50GKfw?QQt8zHHjoZkI^UaeF6NwaVx(Hg at w-l
z>}b^a!Obs<5}p4AC8<*Hi*c?4Cf5hVbvd{o|08fkz?IS{aw>$Y5vOWRA{T at Z>P?i~
zYnJ at f(Ws6}*7+qU?9%xcC>#WD1}Q=}c7O&#qbSyANX5CJH0m$Yn{@hifX*-O?-qt@
zrzoHve+8jq_=ONs(k*Zm`bwSub at MUd)cHk7=jwg at 3-A=k)HpMNyo-^SgS^j?moHNe
zeLY%3Nwf{Q9v$k~$3KG(b9BBJ6elR at 7^wn%pO|Xw6S<9|LLV#Am!P5h#57Ry8pTXd
zTuXHR;pV4A6W@<w1>IuuKH=&H>4cc2^L>te!cjI}?}NaV!nHrqJsRxyM1{+E23kia
z^=8!7$KQ~BJOoh#`uGR4kGFtIef)3PM at pfOlt3SEMT+|P8g)vhCYlN4eGhq#^Mq>^
z7+d+P;K<hb_lXF*c?Es0*71c+vej;pdJM{Ff{`|g(a=ew{;3E6=aY_RK;w=4w<zG#
z`CTaB)$uoRLSPT-MkB_IKL<rj;`bn{tXl++A$>ylW!i=Q1)zqMK2jy7fm6Rp+P)L^
z)GBawLqVyi%6&v+v<r75e-;h(>-+&o%K*I*Wg20~FdH|L4zOb-6Is%Na#~?W{3)}<
zL;rb+C(RNMTO~#|iZM_p^_u2oYNIHkDrdmT(J)!5&L7>}P73 at P%Fwj(LI-HO&VLFz
zCgc;K7h(o_w_}<&trWF7+<_OC;?~vTAXL{3*{veITX<Wk*pD~&Q8%Bqnt(pmSv~!f
zI?5kF6ERhP<+xF#FP76J9SxBaE^-77<K3ul5e#b|zFg8Sr!c0JOP at K|*7ykc2iJwj
zFuFwyV^)N=r(w!(k5Bi%Z;~}#U^J at bn6zJSdXf6G+c5j-`6SNxrO9{^a$GMDu4a$$
zxi*T3u~_785G|N0jw7&;W;s+2m`E#s6NS at sej^IQoOFCiD`_#vZ-5-o`C*Wqm?j%U
zV6kv+(E0B-^}#Io?Z$RYR%tnKg%Gdsqy5K3x@!Y^jM+$zEdaHK;TfnGm~6)fw~U|H
zZv;iP%lHf>y2VHoh~Vzf$C>sd{fRJ^fYQpZ-_k9hf;UlPKr%IBFkAUGAm{M6L9K2S
zGz=#sDMRP)fR>IA)ogU2%dPwXn9KP4AT~%-0yB{?mLH(s{PHdBD8WBOJ~>na3kB7D
z8CWo9KOxlw`Cg<PI{y?5Tx|@&m!TB0zc8~eGPA!Vd3&~~%kcLebpCf3pJRu<o$oMf
z`zH!BH)-r{2JLd!Vqq97A$B`|&K$@efoyW at WiMiV*#vJ(J<<8`jmJpjFJP77ox*h!
z5-*zWSuR!|ZbMZr1C^QVPi$(Z!TJeRL$zY0HVEYmk?h)y`iyQELI$e67u9C-UxCYE
zCZLmFBbBUHB}*T54;awx=Rp&T;cGULSK_}#^53p)<4~xTf8XrXs{;jo&lLEYCGZvq
zg#14uSq&fJXyi9-Izl7!KeEu66xoVv%|dTmg|0 at SAl6AF4Rj8QFb(>ES>Fes2h^Ei
z*@nwZ+9#m7mRP#5*R(z7pmQ!`m+);6j+da0zk^Vq^9wX{b at ZQr-{pThrybK2zs712
zX__{ZY*W);oFi3o39|Wdk-byaQLGy|V!VE%@Ss`@p+ou_c;Xucz5)ILs(}^{pa>=&
zdUzC$XgmK4$Z7lvP at QH1bN))C9N^*lPMyDtmZ03#Rymh`L83#_3SQHWVUgZ}5=J+_
z(CqowSP=NGO=>AZBc1;fdVsy5T$4F3%~<D_EtrumOyLsUxRJkhF3p!)RV;n&NbHl4
zyW1%a_>+DjZba}N<WI0T!1K~#RRGCYja?Pr9rd(BbEajyw^2^NgRthfsl5vtOyO$K
z$kg73!Na-VfTRp_P=!l+3K{a0Rfwi;8M~0%k;@`hvyl~$Fw3^2*EdQ_x<yuES<)+J
zCAV9Zyo5?HO^zZt$ddlcY~Nj=$1UmCChcC(zGX at 8o_$25kR?&1nS`cVCc=M at F@-hX
zrZpO$>iiYcR_??AlCA83XWNc>*o3$X%R1zqfI?}$x~zCp#$R%1cO%~Pz+qr$F;XaE
zg{j6kQRZqF(=owuvZZrBEX-v*4Y?G<QJ8VJ+2t3Ujq1p-&X1tWFsv8R4JT^K+m2P1
z-)Zu^gaw!1v5{;gN$0PErSK)m)qH}uz6UN8eGPQjB%0`aScWRj3Vs;6#@hJ?WgQoJ
zJBb0_+{n?56a0FV!%)6yR;eFVXTX16jdq}tKbyj!q#dyKjqMcneF$0+mG4G;*Gdt{
zepA9nmISa~hT at R&DJXeh^)~WLLCMnj=b+H6it5IG2{=jK1Ib|jtCg9BDMw70R)TG?
z0{%}ne<Hjt<G5^lF_toTqy3l)7{8CyMzsOu_nvzU<AooMg%P5-hJXU$wpTxSV3|E;
znZL?1!uW~Ii?oXjd_4;Fl4c_0^``55$GOr(zX5A$NbrXfjp_IV>o?Y3EU-S)!NFKs
zMGEG~K7Ipgz{-6B%?LqS at QA3yU>9R1Mxie_`yM)afI(!t)RJToTM2Gr{TRR9rH%?x
zq;Kd|vLz{SP8Iy)t+Jc@@V6YOn;&dFCPrX5<R%G`7^YRX5##TH3v2N~kZJRfTS1YS
z(BB-|_Gh-eC`w(%D;SRLXjPNEXXEZenl?cL at 3d{9bPev~AQhpW=LDAE{FkVGm`ZZ_
zyL6kJsGqY&ImH~uU?3EyBY$e6m`wh3ktkd(%9=!UEKF9d4x)H7B+Er*=Qi2De=zh9
zJ=hLu2ywPUe{!3MNUuWFkkOTk($!)TnjyRXu9zU9empTS$xn%T7pkp8PP4f;I=fv&
zU2yoMWGH_nl%LctA}- at Cxz&WtQBXvd<wM{dkiuyfLe9e3xSjtOh7;@AU1$!8z~~@+
zgmz1yV+8Q+qE-goxQ=V5?z$0?P^d2>;aTW7h2c)<OdN+yEc{SX<34D5rHs at v(Xn=l
zlj>!(RM{?)TIFt$)-W%MWuuH2c?g8N`7`IDbC}BatKA~hEXpCendX<6gk39cZWKs+
zSeie)^%le%+}W=4$Iopil|F(#(B1)?0kk5gU5tQNZlr4owi2z_!O2FW_XyuHnGn)E
zs@{kgWKBCT0_SjhLe*FD6YzP*VRL<O6&q#jk616WLL|XOQkR?19Jy!lqOat^L8V<n
z2up8LH^2F8^u at tn7sR_$@<RKeZjmAj(ay!UnBqwhY88<R3<h}kX7USYig!R$JkqTm
zg<#r1Zh((~|K1>1CdZ39cQs<i_YXvQc{<;TW(d8T{~fx4hIS#DkKC`3TO?BsGXd5M
zE!MBV3Qb&wqyeL$*y%&CV^4fJNVKUJ-TVUtoS2kXAVu+a?o+T`1lNZV@^0x9QGPXu
zP`eNNV?-Pn%qBV96|Km}QHIQS>QBr46gn#Rdi-rvgGOG9vXT8#!B~de at b(amNL6kF
z5l at p7M!}UZmlyf}piD&PH=#@uT#oMuM)fJw%m0WBug(u)+I}vuHaHf;NC#~Up=(pd
zD`3Um^>&J$+xg38!8>F at -vh#N>d=DxzrX^G-GxfAroaNEpg#UQ=oqtmWKqY%-zxWv
zDf&TFw4Fa~GXGd_RP#fKF`nFV3`*pWK&VsSPQLk6MB32vD4qWtMACfl1nO!+zn}xE
zleS0?nsS~&rJw2iK1hK+ehuc*4YZW=dytP+;|0V at _^N3OpCXML;{atKdIlryqq89{
z6L*e#d=dJ~HZoaw{(Mr*!)KGxJOTTK(NF>^_$5+gU-z9YjpjE<=Bjz{@)(N<iE`fr
z2lU@(e<Iv21pNpn_{^txO*fw@*P1#k at vSh~dfcbsJ_h$GxHsZH33p6(cDc18e$Fvn
zJ+8A6OJJ}1?@zMOCYsX-Q4wT3fe5D>M-kX`(pJ;VJBB=1`7_81sd=f?GT5FG#*~s}
zk0KwA=SAexag<^7LGST6`*!5w<mwfQosi4)m#jv5vFF5j4#m8toU6<>d;rcY=)}>@
zFE^vG54A?@Yj73>1{nS4U?|pU=l%;UA6Pj3`YO=3%N=Pp>Tn)IJlrIAlfJ}}omt5R
zkb&*rKOn<n?H<lYEg6{q7!VIiyIw?D1Yi&e#e9uL0^!bXWZE$mYD7@=B}NrN)kVml
z$N<MG$pmx+UQ4hXU=LcsKS6j2JKYbSD)3+~*1<{;7k!Arh^#J01_g6|Dhz<a0;ger
zMx6+!u0?JU6{B$KMk at A}S?s!R6+?WFGKc_fLY5g<LEA>I&i?>9)~K67C)@ROV?Cq8
zi+BfL0|T0J8yIL2OT{rk8muu1`XoP{iJnB!cjE|k=w);WBX9?plhm=aQ$w3|{u{`E
z)4L1g3dn$$szE=Yq!-X&Xzy-hSgg;TjYa1{L5;-_SMaAH5l1jTmPKI*jr^&zp<q;U
z3}<KC`OhH%`Nxq at fuBcz8F{Vzagebsdc-0#{bkFlu<GLU_o#l1A2{1+<nM#QrQ>Br
zGy?{RqcOzVubjIN=N>o)O9qW%f?RYI?Za`wg9w$%Ve1GZ=rF>43=X78@?ka3M;pkA
zqa?K at QRzO`CxR3wkcFqfACVn7w#(C+n at k)29}V;L#&gv1@`T|}FhAEzV24SdL7#1d
z=T9X8_~t5F(t;XW`ORocD*j9kiINF~j(<Rk>Nc<}k{)gXPYQP37C8 at fQ>Sn=K4`Oh
zEdoQ7eg|w6IAMb86v-mEft~x|(&;dUUj<>A{9Q0jR!f62iDlu>NJBY7M%MaRUDDwt
z-viyFP7G0du%~c6Y|U@%(y3EM6*i{EPPBtIzotX*z_7s0_iWux9^-3BAdkT at 1c@Ef
zEeP_;5Dye!YlN3xu&rlDM83=Tm2Abt6LfS3zhegIbZl}I28jM)GTsA$r4Wb%tQllP
zk`W#rxy6W#kULuDA|`$oeMKi804=B%CS$(I`6=|{I)4iM at DV>jo?jgu#`KUjts$J0
zR)k0@?)QI-){a7J%k0)x9uY}oThpngM*KA>%osWg>Y=TpEQS|y8LPv~rS$0NQ9Qx<
z&PPZ1f`$3W$bNieJu-5<iDxOwJNN(K(WhLWwf`!#YvqaeqA%d53KTY!NY9bfq0f=%
z at s2w5@eVz-Vc+%8h7EmaL(hEp&}Tk)j?=ja^c05O^yL_CxO4}4OkO%&dg&8z&OJv(
z3VG}ka7e4L^Eo2Qp_>X&7Kz|0c*rB7;wd`rBtlUS76F8w*bC4>ayDX7c<FtjRvsXX
zJc67V$mvGVzg`sGgfXfhafr3EkMNV*dBKgiiVR+GLQHBE6X5o6Tt4$pZ~@b?%Ho8m
z5x+;AEGK!kKF&PMoq;oE|N3!qyo(U8!pTu6*o-NKcF}4GQ=2FczJ8{d&w6lx9EPQh
z>gMC6XMEJ6r(@d#`si-{(|(!pn3YkaA3rMGzd-H}#DpH5KWt_{X=RVFvZKguMfO8x
z_ET1NrInq9?3u`Zz|4Nu$}ZO5d`Y-J#`Ck^iAgvOJ&ITj{g9#JSujHGJAz4qQ(w5(
z7f_}Mo1aP?F(+d>Vc#93joErJafWCbD<)RbHF+my1`c!(xi#o2e&@tJQ#zPgdY70y
zLnL1cQKXoAbbcq~Vx at T*a%qD^D==+pXbVMYu8$GURp3B_+C?E8PP?d}liH(_mW6-`
zoBwW6m7wLwz?cs6(LO2&2Mn51ZxD{vG at Y_I7M>Dxfa`ndoGU&nV{~>W2RNS`YB&Ge
zHW at _i!bY+ban6^RweZK6Vp~dXK2x87uFKsLZELLs^xxY>78tRK*PHgsg|&1a9ArDB
zj73Xvx&W&|i!EUzWV`)z%GE6D(Ox|K3qjp!*ta^GNep$qv|EgpK7+iQ;}JP_sdABg
z6|Ki{*Z0v}nhba<f-)3VnNL53J_d^#w#o>o?*vaVO&mIDIEug$E*7Q8g>Mkmi{%ys
zX9qcr{5RO`Llt+SKoE;P?Gh;Jhg00t4Q0Y at LP;3V`@uj1NCyJ6El<at#3lx|LFdn+
zb~xZiz*~p at jguWJfYrFs#msR7iHL7OOKKKQ?&^b7x!b|BDeMp_BYC{3P;3=x*|6di
z;XE$8UM&3p)HJn`{}6Q|viuF|jG)fOr)YaP0lPtrfddbXkE5x5^r#d;#ScvFya--P
zJ5l|IGP*)=<HS=B$RHi<7j=upM6?Necsyw<q!q--6?q(60D(%dEa23R*3e4%R04$p
zdii*fJfP9&8Ri6SI%u#U0t1UfiZOD5AyW=N43p`jO&=Br3bx4L at FWTCz=LYoMuC1A
z+OiKdA{xAMn+%{oK+~NlMVsH`B~pNB#el4ot-%6L8}%dDX|9kBb>VC)uDc}|8*?)c
zHA6vUh=^@>V}LQ-UqNy%JSp0U at W!cME`vA>M+$}`i$Bs&lbPn&rTEqL0h8?WZFJV=
zGA@^vnoegSmx(e8#R(eOBKwfkaFDhj at J2S-bqLwC@*fu&c(9K{*$FE|)(mv1Ta0U^
z^I;c!d+Q4L>S^%Rt6`fiOm~D8s*1I;4=WI at oVWk0l@s4#Ost&Ns;Sd=p_I+*E?m6p
zhV;?59>2Bq_T6{?X(_FmLy7-4R!uCBZ!E(C8DZ#)@wBMkh;fGxpwnKORedz@@_>mi
z?}oNHY{Lr%_jW`aO|(;?N53#quwjfs81*75k430ea?nu=4sOB-dMdDzu9U}IRgGdi
zX3C8qG>KO5JN5JNv^;~H_CEa-QNnS+0ITMma=!tSm;1Nvc;d?Y$YbxLV=<hG;jczA
z)(!=d-sj@}oe>LZSia<9>0I4Ul%KC}J^iD$f6mx?@K;9**6#i7gQWAJ#7ps$u_XJ$
ze<hn<la#V48lo3y=!F`q9_QOs&(}*1J#k%s*10>M{<~PP;>ZhLm;oC~{LjahUU*?c
zUwEOHX!y{VX#US)C+$08Cw~{j7BP|OGG3Ox0LN0MRY;SNu9-G(82 at anci2oy|AfOq
z54NIUCHG7Rk|)W-nF`vCVkcLTIL#}<jF)><ikSd#%7}<m=X2!FePp}PLB$~<HiBDP
zY2bA_9CTMu`0YiA<HDIdz2cEZ#)v!le%gLKjJHd$4WsDAzaLw+e!QH3_!&vs2V&)>
zw^WW>ucEBmj$PNAkS={K*DDcoG|Crur1y(JCgs8Z(Niuu!h-eT=_kihAfJ);@q1Ap
zJl3yKK at yq)?<*?!kNRoP#Gg|daa?zg$??3!A!zrwLj-Ta at ya2g{DcI(EY*YaGK3R2
zr^VBP at 1qb-0A58Q+Kv~}vlWQMyEIrsXg7~F>PGU=4g`^;TNFmI!zhLY;SCg{O;>h>
zD5#)yVJw|U{;&4l1iY at Q-2Y$6=}FT;C{QRvg)p^cNSe;A9W%D+l-Pu}a+TAQ<Rm%t
z<eYeh4j at vQLC_*9pje9o7r3Z(zya~XRlJD$_`|CLDk at x%K at kgzUcD;+&v&i8&)L~Y
zu>5TQzvn(Tr~PK{cg^#9*Sp at ewuC4)1eSdykm>tr+-aGCi)z&Y3(aNZMoTjIFufol
z>$8$uCOCM8DC4i<j<EaYvo=gdURhjE>`Z?z5vmvnQapQ))A1mYBc=yYvkP)tG04bY
zjO6}^)?m30T=1{`FKqybAJB6;&*ONW?mhht1An7H^yyR at 4BjF!3%xAW;COn(oQpaG
zYEF+vEV<M&Zk`6D>&X6u^7HH_*<sRQ7+=2TXt-9 at fSYC(_SqSmiT+3yj5C;O>?+T*
zou0H~q3`&tBn()|@8Z7bN=SxV`8^%Kvjes@$>`z$d0G<TnCJH^(FqZRDN|vN5!u$=
z!+cLAo~VrtBw8m%PcOfPgY{z<M58IT;V-&pOa-ku@}aVx%3l8cvhw80LIB$;PkHF8
zUma71(E9@@5J<gZa!qu~UD1=p|53!BV!^N!{_3Jf)KLE&89!gpISPl23N>1(u+gIi
z!>s;g#Pjsy at 5l|-(^<k;n`q^~T7%PG#sK}CldPOieff9Re8vdo(`1h8-$cizik^r7
zL1pEQ3|EyskvkEnjEy`}eou4-FH2~DCu#3XVSm(yJq<Cu9bLBbA`Z&4Czx$}qTCXI
zHkbms%?9+7a!RpoP)LL`TwXs;Ug`QzlGiyjy-J$VB+8B=VPSTP3ZOa~{WQDLxPv|Y
zCGN!M&#`+W at WqmomLv~<cqinE<I7K(9If1jUr+w|QP?C#wWnZ{Y~M#SiH at ti8^#~l
z$H<b%hhZ<t%QHAR19Q4B1AyhSG=$7Jhc>($M^<0uS2$9|oaR at ISUkH+_5wDHfQWYd
z-X7UihP-2Zc?~H-CT#0dMd_FDl8U{-a?zk;B at JIIg>d;h_pl>b`Mc=&9hQlRtfo`-
z(o*fhV4TE9ZkrJy)1OEoYlv$|hXx78 at 74A%ORM$hp}|)#s<Z6oF^H4YPuJKIIn9b%
zkT-rhS{2DVnfZSc6cVQo5Y%*nnp-3O7e7<TkH&Bs>aWN(^7or at aty47#uFA}{3V-}
zsBly;K|O^V_8V at +&GGcF6$vbBY#zt|tDl|2Dz-+)Zx7_iGPe)A1biN!no1<%)7BpY
zeid?oilr<q7FS3(qi7x?8b<Q3dXC|QSCM9FadUL-BP4Qhbn0 at rBFoJ$lK7W_NTd72
zulbA_v$EJTRtYtc`)Caa<-S2^M-*rmwhR|p2Jdio#z=|X{lfoP`1>!DP?lK_DT_Eg
zvM2H-{398~;K<$46`L)6IJ9<YmTA(A&QLKeS{hx&`x{tTPbr^%M6_zfQd>Ew%2iZ8
zLL7b3$zLUXS{_Na#5QLFPP?THB7Kru6=}B>RuN%;QO&NWoNGVIbV->QvN2+VhSO}e
z44IfQX*G)(3urZuUm_NK-1t8yPx#T)+8<A>c>Lni8a^T3Ylv3!u*$~bsLF?vMwN%9
zQJq9o9**cH3?tuoY}v|h|KOJQ%-Xj6vklk($8*EVt;Elb3G;K}{K~_e-<T*YyxB&;
zOAz3WN5;tz#peJ5 at 1K61@BfJ3k>c7nLK-3u8q3997M=b+MoPQnK3dD<<?1>9`Xe9Z
zCRpu9tHZ!gunp|-LE~TtebZAmN2iPJbjqeUK#+5~9aH&>rIz0{ebG~w+R5@%wyzQA
zNgzI-#yfqf?MBnt7{^q6YZTM7&a+c?lN~wdNnX4-I&=A8Ge(~ZmhoD@^D$Sqp~3*g
zkTULNJ9hZ1-4pJmy<2B7G>sToV3JN#8xIck_g+i~9$)!rlpQ-wER5k#((7v31tn~8
z2$Bm(XkHXSR78HxC_%seI4;Cr%}0v4gl7$EQw;VeQz9DbNKs2gWeb_mN^F at Obu`r=
zS7FGFObjPwlSX*fgfj}3^<yP3!Mv3Tt&So(VBlD$nTOGW&`(1Wsgn3Jsf81`inM6A
z6K?VZ=7Jg~KZdPoHC!^8CyeT7<1z*y29A3uY{_j_Ln at uP)09Q-646>>ANQu{*kts~
zdu`s?RX<YG#PU$7y$!kU1orGyZ_IrsTPY8sS@@60gc`d#{|G(*^{o>3Xs}3aOI)3}
z>O;@ebRYlmyKn#Gf(I}x3meh}_Z`V;(CE_fkttTIEy*~%bV6iGkCmxwl`VU|v%w*Z
zXnEU(^w){%uWzZG!fM7kx`B~P3Dj+)!;WkS=1ZfR&TIHf&Oc~eapyM1kCk}-Cztkq
zXz at jpKHGUx=Vu at 4&Q7bwuq<q-foI4e3ElEoc3WHP3(LPd at xi}+v3KkK at BDekQMinR
z&uwVb921t|k9e3P5<bjvB at tDWpO-pe>dMXKSD#k>#>mF0FJ6z~m}QSO_ZQyv%hk(w
zRR84CXD at t~@)}Ti&4CHkzRkqQk$IYc6**AX2p&#gWhil1FP*?nW_Fo6PO|X|rt`a5
z<*+vUF6$9_vnnU8IA^xMi#~QQmX_tfg1y3mdW4fNps!(m6`e;Psqu!@JEHa4mRo^`
zRZdmsbQlxMn2m+8)YvnYwcajPKx|OGi-}RI+LKt+im at GkFG2T|__|l3lcnN!RB!Z%
zN25nQN|H3;!cFg|53vpPKKhVSJcHKFIPfB- at B%krDsd;fn7_dUw&?ws$S>PlHU&h}
zz9m|=)9rUXGg2&%x>){Ya4bJ^vD{UP<%ceoPyL-(;N`A_(Pak@)kTIEr96V1NRv^}
z?%0qW8glP<{umh~bt>|=cQLH7yDr(NMwlt$OCxuZ8fx>=GQ{L}ywle#^qfSg97a`m
zsX?Rat<s&+o&%z7?J-LMZVbr~*F1(g)3Bj&Oo}_lp%Vdr?p7va??smIN2eTjO}Sgo
zq6uWR at Mqc9#xx`5UZbMaE-Iv<vLvz}FD$IzhZluChOIYMW$oZ(?TGTN($kM2If{N6
zV|rdg7vi#M?AsBb{7C204x`?Thg5PL?UR-ropP>iUQu$iII=^6(A|+IQJbO!?(|}&
zgAht(#qaU(GUbMdme8i$75TwM8b_^)n4+I*hh0|xO_U%$5O8qqc``b6Jo<ua!-v0&
z^LnCid#FcCCNzT0*zw!YwLeQrHOPaInvPu^xtjt}A0$~v<BwqOkqBoZ8YdhoD4S6E
zeAL_^an5In<`Sl+rKkdtEV}E{meO(;$uHA|KMBzmK0v6<H7^nBnb at -|NB*Hr<VeL8
z(Xwr%bqqIU(1KW<YI>05(oGL%(kuPx0T*x^-t567NmUVyKX2$FV-3r%E!FiIPG72f
zGb5RaWt*1H%dgn-?stFjogY4Y|E~|6(Yz1u<zeqSt2Ttu9F`?@2iPuU&^)dTT^0&l
z{Rb7oqwLxpK^8k*V>d?<>~wOpgf7e8CwZpUuaBB%sFMi~Ma>G$PpTV4U6pgAr%*!U
z8D%1?Z4>wmMP`+T>9t1ss;G&hfuIF{WX)ZyW+PTHXpaWMg<&Iu*~N)v%PdSze<*
zI)0h06&8QTS#g1uty-Vbf}%K8W$USNL9%(0KH0iBvx2FhBo#v6kPZ}F`q~c785VzQ
zV!^pqWWriVU9F0)#xBKFI)ns*6v1)q`c=G2WV>OI{)zF_iM83sUkxL}2|%2kViTaf
zvT+}^Yoeo3jH$wcNoXvqo#<PmGyDyiNX3 at uv`D{Q!ytcT+e%WrvI&oJ!&6xqb at Mv8
zk>}K+e*BFGPyXibzVNyBFWhwJGk0an4})hY3mY<F?z)1yKccKyMO9SMXHc_erK)8Y
z_1tTjqD>QBG9Dr9VR;TkYWWPUrUEM|w8Sx(eDB?tmVJ5k_jVpu`<K at 9pY1*H2A;rs
zdD#1~ZF$&MKkQOySRwcrZsRJyU&V1NQmoS%Y)+*Bmcqx2^PfOV)BsJZpyjHOc>~<f
zqtnN8l16jbbk?Yn&CJISwh}$3qi3j7&Fzi835!~-D_}MlF|d09{WdzvHb(W*<_SZn
zq>478BegTk9+F)E=md%FPFF|YB;^dPp(jc=i{(hKZLsrrJ#lgLtXKWWBjZTwwDG-+
zuo|VTp3eBy#7c)awqOOhhwE6HYvhsDk(*HTK}+y?RC}}xpfe)MM6h_6Rv>{@#0Sto
zV~6L3F-v-_u(94sS<aBS at +oq24~CsyvSWU-BjXWvTM4ZM$iypVUUM&l=y3?r^~!v<
z7*mNGn8I~ju&A{h*+trz;@`#Ikv0;Le=S}TZMGfiu$S#JfUEd5 at WaVRJ*f^!pJpZ1
z<OF|K!A(8?)QW3u@@U=XA)MFw1sFyNLO5SX2i+WbfnE8<k at w?i+7bvUbVP1|8oR<e
zV&r-r7biq+#0(ic(y|klU~~y35cwby`^j$I!SsJDc~g#2MJB;$`bPF>Y??(rC7@#e
zOoN?987kmubi$~Bj}WR?0d*|J>@G;S4xS`_M0$IbM8ZKL&!h%{0N%Am))liW7TA1_
zuP9Z+2g_fEHQjCN?W_qXc$kW3qH8f&0K-{3p}fb6smCEzk}}sDoZ84lcABHuPqeBI
zJhl0PQ1XjAn7SpYg$vTA$}|onEn)SI+sNm4+@;0n!&qr+_P9r)OA+Z%Hf0sPZabxN
z+Mq~mh_`Xfl>mPl43OaZJaM3#r61zBq>d<zv-6dd9VLxA4E|xaHjt_+A~jk}(y+co
zal+WYc at Jb{md4&akydR2MW_#}u8K;z20O_MrqcDS*=M73$3IL}u2%DrL)%W)Gf1Mf
zjYHR$S}m<X!RuQeDO(M*Q-0b}c3S|BW&vk%FRqk`P at GkfUya&iTfHy$nny^8@(9~3
zaHkqcRQx0c4c>X at +66k(2K;^@`o at Co%(QWumKDQ27LBaYB%^bT%sMEsBM_CeU7OW(
zsIe?3Q0EjghiVEuD_itOVy#Yu+T0YP5!ZHv?QCK~oz^M6Qru!BQn&;b8u{K>bRJ2a
z3I*vWtBW^E=a=?Ii!BDK!jQbdi~Bg3T<=v3<w=fW3XN8vy!=T*MYHnfggTL~8!Vus
z#rV<RB~~rIPJ}mw!_dl2%!33teVn{~FQF-fb1hTO9{xlc2eEN5xhHZX(w0gT{mQgU
zxEd)nT at woLc}u|9N at T4NsN~2v79o|#s1n(k(B2M}h~$EL+;cJ9%V<4PQvVa`kps=<
zVb1w#LvRY!IPqyXPBCy+w&YeVbb1qco)62zy!yh>$cvncVt%|ddh}1DmABG(^O2ia
zqBCAR4^K96FT;rjYPx|_TA>#nz8T#R&AGcP-pWcQa{a|9?f%wqfa_wdIT?(!zp1hQ
zD7e_lWd!QP*bJ|5uT_z25#-ShU%?ga5FR3OZ*lMAeK6&h%h~40C8UE5pjWLkqIj3&
zf1D(u`AQL))e5uH-)P{BbeCetM&6NH`u`Op++C(-UVbLK6 at Or{OnldtiN97D%jrGz
zd<9_Zcl^ENMjgV_gN=NmjClg>;E$4xJPUz>6~G=P3BH)bH&PfHZM6gyH$1p}SWHM6
z#;FCPpoJ#S`<Sx!Xx%yu&zD5LcG1((V<X>SXA7QwBBA>%HRU8ep)WdNn>Gdaz$Sl-
z6&%CD8J1(3(1YpI^!vzz7^8;9;p9oz+Yy5COMLbl-pbUFujs9aeD0#WM%e#@L+SLL
zM4?zV{dCohWI5vJDHcRIsvxRuYf<)!q|Rf$B9mG5a$&=zcK(!1bOI`KrsAKO3+!SQ
zeIk~Td5ZpcR_v2)MvvF7;O1yk<R?VVbkdUNFGlDXStIdQMMj6pbft-cISYAablTWt
z3PmN%>{&E>11&|u1o*lss1rIa at omL~uDmO{di+C{_3)QOCsRdeX4$_HeL1ZnlGzhI
z3np|X;WXH*Jlt8^Tj>N}jjnb)qE=R#_28yXp;TSt#oA+Ask50is*@uqCBh*2T7Ly2
z!_T}yjI7_d>_&|*&O9*9nb1bfIQcd&HU0bY?_NCq#J0PazS#8GPx`*1)lS$@YmOnh
z#JZCv626m0TRKA&jECK6(L&_Fw2rk98KRBDietrxNWckNfc3&BaRj=nC-TN6k*;s?
zm)51mRe3ar{FcI+z&9Aqq6Oa3(>~euUM<w3=ATf4K&Mp7%QL7ot$P37;YaonsmTM^
zfzWWFgV$6$q7fM1Mh!2L7BM{aNZLQo>O+jD_t9y}>n%U|?lLio<I9&%wu_q?v}%q$
zvIo4JrUIA303FbJn8-3BsO9ifG^ob#RCKTw!`KKM&k^)q`t(f6ww{WfS)MzN0KY|R
zWQQ>kg`ZIRX0Mj&hDM|1iRiR7%n6Q~mx!LRhS7nvOA*?-SeuAWaq8K#R!3(#v&B;A
zYi8Q`<vZa9PNJwaa8d at -G;X=wS at tfL-Gwua1CO)%VyMtTMmpYXO*IqtsM}3|fq5gt
zth~dv)2$}pUEPLJ81+V1 at 1I4?b-i5(uqfeVyWcm*GSnbIVbP-T`cp-%d^MF>BntuN
z;B+bPN8A-%RwLyaT{P5;7I}qjTRU}J_EUDB3t2dK4$Xg1R+7|Iwpme_MtF8~it&Gp
zrt0=j7-Ng3k>iolj4xk1nZ|Gl<<o<tC~^yPj at CXk72jt3mk}zJl7iG!+)y&mGP at C#
zO>OcZU832aj1nt*VeD4f{j5(A%mgeesabsERF*%*vYAsqHV!PGmYgn%&$0K}28#07
z at tnG#b!xXAwf7$|@2zAaz(W(EaVyUl=4~xDSHL{#4BHsWlu>Rvq}WzjEBQ;Ib%<!p
zBWm?0*(2Ah$&6J&;8>&P3sLSw-9yF6JF<?Y{`eK15?X;fZM391osf_lPn3Q)o^$|!
zLqvZ at Kbke>l_X9K%h6Vv6rpm<IBaIGLHdQE(b#LDv{ree_ynFLh_27IP>3tEu9q1{
z=1x{6vhtu7-;721oXOVan2O3%$&&4+XfXK#(m5ROmA7vBD$g8gl_imcSi#dfc at 8V_
zVK1p9@$tl&W1iD+ye_qJ$>Kj<Ua at uWW!K#I@}+!>mLS4AKpJF+T+*cr+snh=8xx($
zc)F at 96;Jn8ZA)Zx$xOOx*20=uH4Cd|oORah+Szk!7tEQ(W8v)iXU*xH*Ez3iR-$We
zd`|VOcP4fW%zCHqWY*ld3+K+MnKgIb8C5e2x$MkTvU6rCwXMH;*20;c$@EMYM|ERW
ztg)&7oRw92Yi?QF6l-m6Zg1*{)wguCFP%Tvny*~jQs1z7bF8kty=g;7OY8b}XT1KL
zSbOU^8ycD{xwdY@$|f5`z%bU{(by1cz)MHn`i|JTx`qv{&bPB^Zr!l1ZW!~mE$doJ
z#w}Gd`!fBBnW=bxXLmfC%+1`M$!^W{Wd>ZH2C|v+6J7b4orPqod!|R_W_D%z2a>5o
zwmO@)`NyIMx~lp>!~2H=a0yDLyHbVj*AcHOYUb<qH9~4<*3|sNIVKGKFD9v{t)-!=
zx+k5f&L#Te>3p)QI+ at NVvICi1GOtEk-9Kk`RrRJsHk-*V?T+UY)%j#UCE%G9(!GUv
zwmZ>X9p4sDrsAE+R5HJ_I-S^#lXxm6hdc7wI8WjzqzgHm4#czZ{sggLx;>jD%v?U3
zO!wxXyW+Wg_1g<^`Rq^Tau`?lBonD_(nX5mspJK8r>g3KM7K?@3pka*nf at q*v(8$y
zuv%pp&sW>XmA51|$^L;<vMZUd?jdFQzHFw at +b0hhdML@tZBORA`l`DVJ at G;+kA+JW
zL8bjJY}1rV#JiQOWV$<%&c|IbZR*O$yQ}--J3A9(GglZG$Yk at 0ZpyYRlgebPyOZ(W
zbS6guE0?ZhhAk1YV2fOJlFDZYz*dopuaxJ;s)p8eZS?XDu?-!uRdwyLx{lU$Ee-8U
zXQ>N^Et?zGcdU)AZCEqB^*QV7)-}mW2_$QjU{&?HM$l39_xj+>hIR3+iDr5u-BiO}
zESs<K`e$`=&cgXM-O23CmNaGAW_v9qC)YJyHRNqw^C69(hVsuG(ip0$yAE(j8>v$d
zS2X5zjFKi6(<l at 3$~@MUDX0U-n1FIIuPx(-UOkY{#`3(@ZP-xvmRNhsxlOT-x3o3I
zVrEr5SD#3vHzazKIs7KNO-jKv6tb$SG at aG7ZcpcYqAi{`wDDwbng&k5#?@>B^S-uh
zq9?h-v?aS6`r_G~>F6J5OlHk0T9yrGeW4$_oZ%_6oM~I%9xJ4`rZd~q_T5ji%qcSl
zrS4cNnNC>CM0#5?n at RW6?<}1quM9`A_(0N6#ClTOK9J~2GHPU9KKyi>M%T5y<jSR~
zr<m%xyR-Jiv$wQ7wGJfG>oVO56KiRWW$E at Y%CJNv(%mJZGoEwq?1&Z%k-k4?>3i%f
z^pqTm at GWxjZHa(QylZP=phR0+>$E?f-O6xiQ{moCtgA1cOq*DbYA(Yw74OZ>HnB{q
zJC^C`$tBbTcu`a6Dr70+RG~jzs!t~4ELPj{@y=AD=);<lLK916y0+T*^kUl+Enxm!
z`$n+tjpFK}+`6_A67SoS-H8~JN1Wtj6Ev_KRhq-jr)<cvfq3^klVgBaU~aA;;rJIb
zVp^GIY<p}k^r(pyTOb*xQep+tvCt+%Z*ykz+LY>VCpa}WUd=hV#JP!VrY+vB@!K|-
zMiSN1x-rpZHfbWtHZU at GQrte7rzz7D<jgrJMQf)U{qf?qIakzvKO3=IdcBJVl~2@@
znMAgwwMCsa9Z#vFsp)yKIqUX(oI3H|FEI4WR#%fsn;(MF1R3xe8W(yKc?vk+$3S6w
zD0HBIuT7+T^L=KpAsHK#2L)l9l{!wyt~5JaCkjbvQJ-g6XwGK(o6_41Gk-2om+o#a
z*^V4g*e2@@Pchetl#&=FxFbnx8JtiW`G^TEc{cV{sSNw?F7ywW?##MGwpR_s3q7L-
zXk!hBQEZw+o!X#^5p7E5`!a?6hD5%QrH>Au>R6^zOt6a38>y5=HRR?@)=v{zEDW@?
zy2>{UlLNlnk{g-gr6I#0nJ#1sIXjl&(|4+ at mq-Pj*pPU8A;BcjZIshZwo at o2*0L>=
zN!bo%>rtul>Q`;o(5*|=+L7 at FQ=5(T?d=Sld4}sQYK(T5WdxUh+h`qE=O=1Ng1h<>
zU0ds!)|fWBY^U*@YGScP>(MG*1={M$FT?09GEiz>tMnWUE?_F$3&$_xWG-M3C>h%j
z6tY)59ev515v|goMi?^G#hRENh`TGnxFgfmnibc&j;6U!^N&ZmS<)l?kmxs_iI)r&
ze at nNaBL$q8_C$)-lIX^{>5JzY+?=_VDYF%}HOtVOH4T}8ok2gXsqPTTbZfF*rmc}d
zsjofRYg!BWfr3q=p}B6<$Yf3A&)C+`m|<3SDXdTQWU`660ZP2vxbfLbx<<}=I&PX|
zYeum?{kd9U+4kgR&}+@^(SCv2OrWiJW1fm_L!!qt)0kjf`pBH+c-nByD9WRQ$vm$f
zfr(s+LvPD4GE)*{g!Zi&!SlxCX{U}^^O-O(c3$gu=5ZD3pmqlHy}3+zu5AY0yRCJ#
zg^X<yF3}ws-<zVa6Hd-(E+P^eRY%6QCDX=0Pj|2cB`DXnuo;G2`O&1jhUS__paXUL
zC6RMw8t-+5+tR(mP?RLewu4~dt1RJ)Muinlh%qXxC`ktXLD9;nuwqnL;R$Gl$|L?K
z2`lV`bx5TZ#TX8qxS|-v!IoEe0h^6&_H9)rv(<ED@^Qx|wzO?r6KhE$0fIx((yAj4
zi<vjpd|jfywav~{mfYAO_8{n>IhkdRXf4+w6?9Yg8l-M!UA#BhWi~pwy5>l68O)t_
zU1#T0$B+~!-Jn%nkJfpPXF&WA at MLX*^S|$^F_9vCXXD;Aapt_&LcdFUu9QNX-VpcD
zhy1{oNUTic*Jk3~@Z$w>K)vZW3xXlb5X<;V2r__>(MeXrEJ?q3c9zkZ{#d77Ns8TW
zWNjT!cO|sy^0Ls8v5b%SELPYEZg%8bdNw7~^XIDgHl|sui-o1Y8-4!3l_?&4Capc&
zB{R1e^$2l0-m7WEv+4obFF5BG3(p{E=Xnj-xB at PQuQDzY#pDl4!XQ&6z>iq(E;zG(
z<C<W!W_^Q5-?HAg%4?^E!X|p0Q>h`@HZjP_&?d9dwg&5Ul$WZCjq+0LQjKo>jBfml
zZv2Ecek_lm_3NSMr~FtBF;C at 3b4d6q7r2ua+oBsX-N9QWc9@NJ+AVG*Sy$F*;|9}?
zRNGF9b=hour)ECqXZ^;}b${dNTm{!NI#;nFKdPiKs-#dHK+$1I_ll?A7|$NknJN&+
zp_``yksRz<su*;5S=!^ts7L3R(K*H{^o_2EM(3DOMYymcoZCM>q*F{OibFTUl;Swp
z6O13SX+~|x3YQyqrsMs|F1JNo)PLC6=It3v+oz+is8xepS_>h&_ObH00PWUQ&Yz2C
zIK3RBk*fvG8b3zo2+=PJtb@&b$_5q;y`{A|RbZpqD%DwAyE+?8wxFEqv>67k@=C5+
z(~0_II-cE$4#0LPW?(Sbt<t%nV?&|~4F!XYxoGQ*R#^$OEe9;Ev^V5Jo+J;}Cb`mx
z`hpgagTj)zA4buk(YAYLJ!0ezCk2<JS)^A38*J1aI|mY`eQR<+jDx~)Mdie+ZbRL@
z%iiwoJF>WWZ}$jXMcP-zV$0IGlStVKW4*u>PEMva(E$;!FDHIYv9I+#jJVfEJ&d_?
zZ+G`?q8eM+GjJ8Ay?p=O+WCa9jONo$8Es>mt1DD5RF at txcr9;>VZ930 at V8$|f9qMs
zSc$nU`B7Q)==y$ieeYE5N7whG>-)j$`?gd(kJ4H{igJY=hm-{y64RmM#D+w5uo<#Y
z1ipISMmym!(Ylv`SY9)IQ>q6w>`h`u27FC&XNFcBM%&nX&w8%v^g19FaQl=1A$I`=
z{fU12v})|o902M?m(YgX)`#14EUiiY0$$j|?y at g|*w at QVXeYi?>Uy3&`d}5 at 1cwc}
z;Y)`1VIvA#$;+ at 7E*9z04{I%dBU+aHQVhez=+yIvSUG=PzH&n--->c1JLj|0>P-$8
z;qW%jm(_<=jfFjW*+^UMf?*P~ZIF%SX*stdjwz-yB9=S!8KV#hXSzNEXSzXp!RHL9
zMR;6N0>3&R!YP7MBU}|v^<dH;@9NW8l0?iq(Zw5XvpabX^krz3i5N#6?9;V4?E7+B
zRmcHOi|=VPGv&Bsmh1D)IP8>0>C&~*Cbd8q)m{$0c}cVyGR2HJMvlx_PBp;g7cHC;
zsZoa4)7bwXNY$#lvq_4qx}U0C+N<+n2)0HKoQ`;ab%fJi2Y!C at fA4|Qo^8pTr|rZM
zOGNRBTy<Zvn?C)&`Y<ZzKhv4Sj;_Q&zFGqtn^x&ex|;KFc}~k#cjq%YPTOte61W^<
zlPmQ0a<HRXhh23j0LKhdY;^oDJ>SYn*QFeEoweYQ9(CQ|4k*@i4GbK@^R9zpIdt6R
zplA*@XBh}Q%tmBgA!6LMV at IqvmFbM9U>>s^YSr1VbJxzA=O115LfMAk#GPgJ3`}h0
z+SdBIwXs;P&>3q%DV4 at A>5<**3&uSvHK`ia;2YJ77`?h-^y-FTu5LIdpG+N6VTm8X
zp_|407!LLX=EC*1hmu)$Z@^&j0>>Z<+y%th{{F2TiU`khsP4xwj%kq<w&Q4R$<FQx
zu~p-rB6X3j<v at P3cXh)#X&uk^DQm;}d=-}|uu8YyJr^NU-FVQ9S<?>ZibyzT=-=vK
zJ#xx3wKHtk%&`o2d?1-^Pw0Xd_)!;xtaKiN)4Cy>_CihvMmhhmCYee(*BjtbIZ7Hb
z<I0sBM at RcJSz?Bb?Z~vYd+y!(zatYM8 at WpY15Qo!8Qqm&)|=eUoTM;D0tfq&g;Cax
z4c!^-oLHkm-nr at NHaV_M&^-q!CqqcZwzJOfqU2&ZdlWwv(`m|7Y#_-E5c<p6(PkF;
zI`-QRS3TgpYuhJaiWO^jj<T#xY)hncC^N~CS)JVNla-zv=fyLpaJ%d&+<J+s>Ll~x
zM0QiU+kfp;wvm(kKM)0sF8p8X=Bm+!|A0F(G<wt2=uJ~YE~5JX`=+Tw%Bm>vL&v7L
zq#xYdrE0puY=yU&)+I{JY}|ShlG2Oq7|~MvO20jdIgBq|e8QX+vXK|0<aVD2*;A}@
zxO*1l$d}KD{M$Q5N}Cw0;5*SMK|bG-c2_pQKX`gC#l5Mb+JxD-rp0Ne`05|ljoY&t
zUH4awuKP#V{iEyt(RKeY>wf=wvO_wd1|vCi6KgP*gDnFnh3%H3PQsjMbaSCyKDQUI
z-||dHC!W!XXH-pZR84R6uHfPB3bq>Nhji8{#&GDSoMIFQd%p1k*7ZB_9ZqpS*OqWP
z`*yam4m1l%K`*EK0oP~J-p!2I6&-W8U#oMoDV|NUGP7>cCFjEG;$n$|74H0m)8<DX
zi7 at SjJpQ4BhEyh}i);`ZyVMjCvd;w#v>Y2`VD;gp!9HM9Ye at pIgns~`E`>a{m>KJ&
zNI4yOKkB4*b_=>8*xe;$o!P?`0ouPQ&z*(08MN+ at yh{5Ik?l6ODqNRLJ6q*dtHr^_
z?&!UB!L^57U5Q*y7x09V=Cr=7HrG(g5sYmRHZeoJ_(eOCHOkIP#jpoFf}zR3jXsyi
zx;r>S3D*TeTo4+zls{{wU34|BhSUYf?|rH*GteasM9;`>v#(6#H*h&P7dN^}wvMe$
z3%3=fds8~eVqG}K2`;JNTzV{&x0!%BEgiSTmKzcfu==+GhHW~+63f}P7IK0a+Y|nU
z#BPU%Vu|&5S4GCG4r<s_v025~0l;}!vQcVxo&z)#NWyD4L$x(C;Id2c4C-0Th8f+I
zN=6F_uLNu>(`C=TC7Ob^RhF*aEjsrU8eGp%TL?B8uTO2t#@T$x4r;G{iwM~1Ov!p1
zu;1K<32Q?~FcRCt2OG&RCfv%jvC*t=)Ttn|nR~o!RoW}4+_1nNj~tC|Yp}~QdXLiR
z-4vrA&=~!I1}Xuedz9Qs(?iM?m!ddyY;h@$gUuKFA;ahScb}(rw(m at Ld2{KISvkj^
zg74DmUvMly_fZbnz;MQ4*WvKGlR5kOgixSiXJS?c&}V>8;e<hm;}A<C^BAX;{L3Bx
zz7u`u!+l6#7`JJ5Ub at BL4r3?t5z`@$?#Rh-UY$)W=g!v-8;E5H`6`J$Y%#10WmnO7
zE{7a#k-cyCngO_zDkJYKN!Me<0CfIH`%)@+lt3tXKTeZQB)Yj>-Q6|roSCk8s;j_3
zvV`4yT91oFcLyJs=uKEf4SPAaYm4?Q%Mgtp at 5qb0xieHLLAz3|wzazx&X#Yt+955{
z3uzhQII?j^M^HvmqDI-OQMPLII+oGzl8t_sY}oITZFCn(AL?7b21j$~*sH<u9BdXV
z7<!l~$i}x96*!*bqnS}N#-vu3nHl?xITNe}Zv!`ie+G|$XF<bfjoAhkf6kbyRb}R_
zJRbumf8Ll at FhCfW@Vo}x0zM0V4d#8pnCJEz)5Nm{d<>YojTsBJfv<rvUo_?n5C>lX
z-vd7fzXs+@#!Lj0K?8nkd9DI)2QLure(-1Bf6w!8JQsc0m`&g`(l`U0%lp&V#d+Qg
zo&slm#h5N|Ik*`-4kGs$vv;~ND`t=vu>TC6XBqRSYGWqNH0EKjx0dwG!frO{m}AUt
z at C2AN-<T~6cn7r$d4CgSwAh$7FaT}=S1vK8V<~R=<n+Gf#Iu6%>acGh9Iy|3sL_}Q
z!2M0e`~>W3HfH*2;sd+Z5awFKTu0v58xw0K-C)<7Nz(?yJtKq%U_#6j9fW at l=>QLJ
z#6OseGu5 at qZw`4qo3h!m3A at dt>1~urjBllGG3H0$j5y}t;ZE#4e^2m!b{Ay}D*dns
zquYC*%lksG1gz)-JpYSw at 8EqBj@E$vfV1ajAE at my<`uA|*O;q;>BBBb9tJ3nx08>o
zF`owinKR})d24Oc{};kEFBx+uc`(~36R-ko0lUCna6fngnC;ku6<`b41@?mb!4sfn
z2kF>pOahn-XcM6JLfRUn%Bmw-X7(LPS}=QpCrPyCV~F2x`=22lp9lAW0o>gIs at _4I
zU<=p}_FaS>U%uT3_Um~udE7->-bJ{e>Jn&hKiG09=>#-E8&@T9?S-Cn8SX$E7y!G$
z6_*<`;fhinZ6>|Dp!b5uJpU8%|9#Td_eW#iiv4eSANy5fW`irhzk=R-i5I&WxSa&L
zc|V)y{e-h0R9%TZ*as$E1r6Q`9tN|n#vEj?!7ZqIH}MPC at _rq5;0a*fgI`bu&IkK<
z8?)?s;<$k_e?R#Gdp`g^NV@>%--!85<Q41%TW%)LU?14x<!uM)d<W21&v%1;;9;;I
zRNaFAJ@^OrgZ*IANAU~p2UUBiBd`VR{TO~h+s7$;@C2yz;%K8BUe6~V?T3K9Z at BUi
zV7{UlG&!)K26?f8%+#?`FR0*GhV^bg?KzWA4tud4SR5mLxHlxu(18O~6K(W0eSBe$
z?-z9QqK%xcy#4wg6i4^+oC5B#YqMD1+Ot;6SL>U5X~+>&uS1a)RWua7{J)0JK_AQ2
z=ZJO5K`A^5wQDGl1B{u74y=+7EF<<tXo~Hihv`+v!3=jjYi`R{9n{piHT6L*g76I|
ziB!))uDIZ7(_p`y$sv`4T0Y*1qyuYC)-j#W9fBdtJzZ?!9ptPZ<hm;M<%8P`>~7aV
zPHIsic`&=xARhc!Z!#(4IR=!KjWK7Asa+c>Khazp(M0clzu{#?g)u4cYp@%<5A=^S
z=EFQc1O5$s{4itwgXe#O--5ES#*7C?faAd_;6ElB^Eup|#rp!#06IW7$b+lFjo?o3
zdGHNz#~XMqViM*3XW&=hzra{#!=u5epcX6vtHHUT7Yu+4!6o1t at ILT7Y2L&0Ht;#{
zZ=eUWhk5=4JOMrkp2qCgJYNCjyuZrxFrE{@abP-_3l at W=tBk4Vxdya?Z;{>(p4}h|
z^5C!4#=L{)JHb6M7;m2M1s?>T1fK_A2j2xh1uugA;7=ej-k6iXGO!r5fOEikpbr$l
zW#HrB%iuxq6eyoy%(38X&<qB^wcs|e4?F<A2Yv<q1P-Terhz8V2?oFw;1=*N-~sS|
zz!TsVFp+#71I`5Nz+1ri;Bs&ixDDJ5{vG at r>;qR+lQ*8n(*}OW^Ut)C_fVIw at _t0E
zG2<{F%kyZSQ^3if7Ays)(qO;9vlYAzq`(fa8|($20bc}P0p9 at M13v;!fM0>Xg7JsL
zNP{X+3zmV^;H{t=^n)E>7q|v|2;2%LQ)i#z`5EwK at F4gl>G>(osmIZ-c)kK2uc2-5
zd=*qoVj-6_=0u(+fYZU*U=e5mAHm-`o^J(P!FF&NxDH$oZUP?xj}gyX>7?q9pOV=z
zu0Q(y?<MHJ0`)t;jYUZBMxcBJ+tc66qxwWRpJS)c{y+^_0oH(XKnx_nX>X$3cox8J
za3}aJd3%uOkHC}Q1 at Izff8-e@KWf(}@LT{irku<3LhuoA7x*Ih8h8lQ*AfoT{{+7Q
zuYkXT!wBy<Fayj1^`I3bz&3CRxEAaNw*a-PkMg_&+y(v>{0w}&3g(-#Rr&r2`jwMh
z`L4rUVU1L_O2<D^z8X9IwxqPFZ7VGakOouZlo at rH=lx1>E at gKO&)~Rn2kq@<%svLD
z8kdJp^8VpzE)Os9^xMgfa%Vqox-ow_+u6UF{&+43hB*KoY)cnGYwXb&=8s((_x$lo
z^%ow)h8w5i_*b5<=6N$v{(^1O&+AC-P5Dr}`6Pb71ik|v2m3*UaySN at 4i<tnAPzLv
z`2A01oMhb6*ptQ2E^r2Asxj$K at I%7>@p<$^{2j=6FkD}`48OMmzphk2YCnE|{0j8L
z;FsW{EylbodoW=p<pDH44L7d51G}q04R{l10h>T4cssZdTnVlR>WjDXR3B8oQ(ITx
zQ$Gs!*<gPS_Eo=+-c1<a1y6%dQ8s_!SwR@%z|r6oFdM7@|3v%HnBBtrZt}B{XA)$<
zcJPEZeqGM{b at N@@d!FZTZ6H`Kf5463eqZH1*e)v;FlT_{!D--ZumCIvt3Vsr3?u|o
zyV=S!4=w_ifnb||FZBOyo!^1qe*=$$SHR?j2p~YXp4MZQ1XqHOgZsdb!GD3ti>O<m
zzSPX~9B at 8RKU2F5_C3Gfh5K9<_wN9gfp>!sg1z8Q at Hub~_&WGD_yPC at cozH){5Pmz
z96th_1k_g&n9b&0<NIQ;1}p;`L9h*c`Fz?t`JUm8KQZi|UE%6 at d7aDCMxH5f33wlP
zyv&V7U*-MwmCo&d^Hlx%^{qOqgtwXw8bA!Fd<J;F16%|4fG>dmN&Mjhr1w$q0vOu@
zj|1j`7LWjWa5>1r7yX3iHQ+nEU!HP2(tDw=2RDO{3Dna~;7;D}23Ilue~st;;9KCU
zmGEsm9|KQ-XTS^K>)`ib4`Fv6Zp<HeFJJ9=vWYxT05#wW?5cQ91M|URupAtQ`SZs*
zo}~qPBltRbiu2s>wT1I}U(@F5_d`5`{dc5sJ~$`%b6{{xxQB2a1^dDHHxKT|Goe?5
zK9B}#$7)X-zy;76Ute!O56;sXn>7YrPFObr)zOD}-T_YY^89(;@7m<@T)ElhIl}W8
zp!~FX^YGcCnQyeV8sHf$8@~@+hWXzcBX7cu`o(8?J^&s8|HvE`92Z~Dd?r3c^Vo%q
z|Kby#Q93%QC!QB!W-vPfoC0QpI`C$oF|M2ENbNyuwhOWU0Js%=8hiz)-0$Q05O@?k
z0iFlH2Y&&_ZGp!JYr$4<3HT8B4EQd17Q6x~sgqN{63_v*g7<(s!8gFuU;_C#3#<Td
z1O4DV;4bhj at DuPmP|@Xhit`9pyocJ~f02LjcE at 6OA`strGS4fk;8%DaiM#1Mk0YL$
zJk_oi@%%IMo#xc{;a`1T>xGMXzmDfp>@OtjKjG#o!nvx<ji+^(&rP~Ebu~}53#}>C
zw)}Pbt(boYyabLtpRor7``l*e%fMdnHQ9mkt*)L<<Jkxj;A(Ii_#t=>R5Cst2j+ou
z!GZKOf4!phRgj+w_c^Vz)F*;#tpnwW#0P0zruEg^NSDv|h`-TV#piMS at vIj&X^;cw
z5brfS#UCEX94!8l>ac5xoA7rdn?>s1`*{Y-7$@N$HCX(OF)zJJZq4l&R`Dz|<=jbA
z`pNz%NbLii$+O(N!JNTUdqO9A^m3lsAJVcw_I*74pZv3hWmYH<ezGs{+!dg&f_^wa
z?}6 at PKUL{0Bh)*2KK&wp_?59c^?jaI+N9#A at P5Yg@uK}v<}cR9{Zagf6VUDZ>2?^E
znPW{AbnSGe4`}&6TM>Cbxvzs>F at tW1ne5x3wLe)|?&yDl)_(6k?3KP0wDwDP at Ra*^
z$sW&pBaYq;tvyY)nyme;(ArBq$D_Xlt$o#}dCLEHcxumhj1B)-^K<B3%?w=_$o_ZG
z+7rFP^FN++X at B&3kDd&zz0xzi at Mb`3-?Y~Azee_}%DnKWnk!|$xKw|8ptYyF+Vg)q
zwDxvadf|Ug?%V0Qp8Ypv-$7UO?0*2QJ>JVb`blW*$I=6A`u9U?U)HB9DW|6c`8^g|
zd&u{B?x#a*54Y2!7eH$t`9?4P4(Jst5DR(q`Ow;1e#oPDL2IA+jh_GaLTk_2r=KQ0
z+AnwIJ=MGnt-W)fz8&}4XTHeu{{?96Ip5;Z--Om)ymNo7`5v_P<$e0+(At~6)pP$R
zXzkbg_7%KnuUhR$^*cot-cRkZ8e03&zralPt<c(=p5W2vh1~B5(Yr(Rb4O5K<j+*O
z_WRG+YtLF;O6~dc(AuX~zgBz?K<^!38uRE!p|wAK2l<fwZ=ki;%>)0(n!oa*eQyXG
z-nb|h-cR|N4y}FX2QicX`Le%&sS5X^*T|mn<s{F(J><U+TKmMl{dQ>W88iA?|5t_F
z-wdsNWIugh3E7Wh0My>Gv!81IBV_*^wDyjD`!a at E?bojJ(t9Gb_HJMH;;(_$Ua}vb
zhGp$5GaK9TX at k~&vmaiU{D07xOTF+egVr9jUmw>&YcH5CYV-Fm at _%z_e0l&{`^2Yv
z_D?`-|GLVHZ$Gs5kp1zed at SuB|4NU_`)FwGD_`r;)1m#J>T4Oa_L}|lZiLppvrosM
zwTCQk3NOct_LFb$=o at 6={S;n!e)u%@l|OY3%FL0zQ~Q+rd$HG^^_wwK_!7;p*jq~f
zpB4VL(s=Sg=8{RbmC9psCFQjVHo_}kiSV@#9`nL$gO(n`JdZvfdT)TfT=s$R_d-h_
zff?JT=PS_C-B7tHecy%NvKQ8haYXc=p&$MP{mF}e4DD^#6{Yk}f!5x9gBRW+Xz6hH
z<KsqX>8Tt|fh)Y7(9)NHQ?T at P&{f+@?(dL)?5T2V|4nEUuzw0#`Ul_f(l>rQ{&Ao7
z+ at A<t`jwfppjQO^uY{JafImNOhTame&&quu{ntV7CBOc7tL=lm0sH%*cLn_a0$MsS
z_j>7h1$s-s{b3Az(rc*q?9YOhZq3CWy<GOxk00N;(9%8e`;WFK#H4h3^>MM>Ux>b!
z=YJ2hbSBR9=zF21BlLZ*{C@^5eG0$-jDZ!C?!^h7`?H{>lhNqW=RiMK<WG(^=Rr&7
zV~S^=gMNbiulLgPZqajC5_|RYN$A~y at V^7SH&9;BLf;>t%V6`{$iE-{G-&CfQ02Bg
zEQ78k{R=$$T+v^Hu)iZrKlJZ^>!>n9xfHr8Q2rl=mJZlLoTxo&>t!HNz7Ij~3b=nx
z{`Z#3YvN(_2lC_B&l%9tS()MGe=W3hhpzU**A|TQhLl9b*AFe-vo`1>%imzGhL
zsUEHELFwi^>e2T@`#+5?U4bD+uip>ZzX&ZIC#u^VQGTrXZ|Ip``AjOGWR6nD_kLA8
zXF}I9=E%L$^Y6UxWj at reidNEuz4Uw%(6Ubi{44%#vOmW0FGrHUO9J*sV1EO&^u<o2
zeB}Q&Xz47v^i4J2mOYhm2JJ=m&jkD{d~Fx`KhYJFsIM7p5qjZiyGS}^etv62dq25f
z4!wI9eZX_y0WBS;SFlrjX}PariKh5T|1N0p at A^%mS6nH3 at 2Bvz-6Xv%Kfb%<{*TVV
zr1BHY1JKg%deMvTKjr^Dh=F)0zP~{)WPI1}$nwL?7z#=HiQl&L8_cOHH1DVQ=0Hm~
z%Wofb(9*+t&?~P_Xz6xsz^%gH2`xQ4KYdp~lPxoi$H{D2-wM6?B?x|#%8xT&fqwXS
zmi%7+zYZ<E$D6$HpM;ifpbKxR`6KkcQxLm)?#C#R-cPTS`7?v~R`Ra+W<sAKW`Lj4
z*90w{IGTi|JLSpy={3)vQh6S4-W{+fT5}t;wtQdWUE%*5bk*r@{8Rls5^%5AXZa)j
zw{^TL{tDXnK04<DuYOL3_J49e8(R96etwsQ>^FtzKIj1kgX_HV$U#fL^gO~+d>?_9
zKB>|!`t#8KPw_nf?f17y^tbOrZ(&UQFm}q{3!)<|uL)oDSjw^%+=IRHJDGRsVQRiq
z_|v_zhP2$so1mowd!J{&5n4KOPkHo(0rypyT?2jp74QR|{Xav0g7&1J#*;4u+$;Ux
zgdVfcYj1EBKMdLbGDQC&M2|h1{1e$n2utZd725wP{CUt1Q@?lfuKYGaO9%A=(YW6X
zEnQE)zB16-%3uh$_LoBYKZSQQwDb!jsxSP16Iyzbwb+S%Jmmfb=ozoL5Y%5HjCIlh
z{e|cL7-;{e at TZ691tEGh^e)n?-z3&6ts(pKq4!4}|E2oAJY at fEwI6Uc50%G_A^Y2*
zrN2s(wE1}ex{C2`yGK7N_ksHQdC32Z(9-+#>pwaL_ufzWI|lj+F*p1)pUi}=f|<}d
zTj`kxT^c{9nmXv+3_eWR*1j29dZ_+*cpkKVB-ys_9Ud(+#rGcQz1LD^qN$(Tp`U}N
z8cPwXe7+HK|44{_7FznxHC}&z6<T4P at A*HTwEI8BcQ*8Xc%-eoEBuwv(t$k at TJfI`
z?ayB)mrpfUKugcG(z-v^+zMUHKl8ztp?A^W-t77RA++?Y{r37KwEt85`=M*GR|`@2
zl`IUUgZw3E#eWR69Ut4&A5So6Li^+S5wy?w(53czyjc&upTPY5CZVO%{ZlWz3!(jA
z6)zu<dn&_^?^d}F%wP8e+$+7`m3#X1H&wpW|EUUWlKv>Y<IRt;m(DRw&Zb{mtXjj|
z=av6B=AJ6zqgt%}>Cpa9;V*@je!5>?%^~|u at _(h{2UR|%y(^oaRg*!lHQt%z&WK*#
z4*dHT2mCz?V#(z>V2D0jcOvV36(g4Cpk*q<r*(+5JL7*-Lm!dJ#o~n>R-;v4xb3c~
z9o|K(hifNd at oYA})BA!}58t=qQjJ1?|4zIFDEpa?K~6if at pM;Tbysz7BF$YK+$e8y
z+mrdOzC^BOdm`D}hek8kk#hHpy_BPLS&02who_&aYcKTbovf5<uJ>whzTvJG+1i`E
zIXfC4xs<z?i?#<FinJQFZJA8U9<Ic|4}gogb>B%-dK;IDXLE@<E-f$Fa;mZ?UP#%S
zP>4~wuFhG&yUyeqdwHpE*pczPDdx8I?YaOQedlx+r%6d{mXoq_YLAe*%UQg$%Us`4
zI at LV<E%WZvCoy+|w1-e)1iB-cui=}z^@&8<|2PWAo2?r~v?-bI%M|h(xOj!67LB<e
zUB$wgSd;PYh9?2Okyl2oojO&>O)*^BQv4>fvgI_UT|ROiWlMQO;_U@)oFxIRS(>F>
zw9`nFJ6y~~Lu0=!XVa%I9^2bW0->s+0?Fy;4k6#Rlt`HlEi at AAJ5@24$WZ!dlwDiv
zb=`W-bY&A1r00$M?D?c`JXfbL7V5>TPfOeK^Bk&Vl>@Jo>?=iStFAlaIr2+Xm*|u}
zOk>kR at 1QIjQHrP6B-9YSQ^*~e;)O3Jrz_%j<Xd_+CDZfghI)(*M)4BV;0Q{J*@MkD
z+0w>&@MGFTK80;_Sxke};l1h$f0#P(*=^gm0(2-rVfAa9km9HE27eNeN*(kKz`<Dv
zeviTXO5ku`2^j2&9EXl!54j<Eu!n#O@?Z;JiFm{-xBP2-iseWBcojSJjvqq#JC|_{
zbA#94y%@;9woC16m|J~<w*U?ODEJ0@=T9;9s(sb1 at 5v9_zn4o<jChsM$TtQJF4UqH
zb!h|~e6NE}x!V@@e{))Ya9o3wt7Ea|4R!09VomECW3eGk<bbXw80p#p_mRwQbsjr$
ztxV+CX5!rp4+REAx^<ipdDz<_23?n6{f_*tjp0Ag5o+uDK<Efx7Nz>UyS{Biwp*&o
z?agYTVC42SE>eia3jG<bS(r229jT$9yxSLE<K77G8>4(?b(l}3+QFME9Qyedi1$rF
z7is7-BcWJT4qnVT-~F(kAPM<%X({>)*(SqRh<P`J*#ZrH3nj*9N4vA$*G59&xLCXo
zvZ{~2)(sQN%4>bQRs4~cM_3wvY8&?McE5EvFT*CP^d;C*D+zqiG~96%;;^Bq1*u24
zdpc}b4R-EzS#4<zha?Z%-0^K!VZ(pkrr2!5{tw{GJR{$M(hq~gH7!icuW?Vy0bG)D
zfVajZU*ocx#<#4mTi4Ry%3x*aRynWA?5rL9&TgnGoqdnEqL9sjU4G;B$h5t2a!3e_
zFvHrY235rVz~R0O;QGeU%K$^c`kw758jG!5e@?7vl{aLsYTQu#`d at 2vb9+-qtfQ`e
zZPSopT&>XyK%7o&z;Um3`QkWmSFEA0DTR_!8jnV7*~;c?-BJTD`ueT~vZX|A5B?rh
z;9E|iG%5nsuTmJUW7&D%ZWwy=qq|Vh-u(!h+SNa>V&&SF`i9tSyG-PuXqOwZm at 1O#
zqTQUiuHfL9z4Z#;cp8Wm6V>An0xccu_=vZ^NbOh$?~qP(Xk;gqJGiq!^*qoO%l8%1
zTWdOZgwq}vVcq45Jw2&HuCJJoT9b%pQ!H3n3u%Q(T-ku7Ek=KYu|q{T0)IN{gxx2l
zcG>5<DUN-Cb(iVMCK7=dD75ZEsL+B<&E}7<K+*Q}DJk9T<1QQ}J6!`i10mV8hCjts
zWMF6ugRk4{WL2Apr(>+)?5DX{_a|&y??DWZD<yH(uvf|I=xsck57yW=t%r&=Xb;B5
zLLcV{*$%#TQ{scL{}R7yTPFvBX`g{SD|?!u+;yYj;KQ at 4nA#$D>Kd*X(Bfx7?A at 7&
zTr%4j{9}#vi{{OrJ7<2=f`yHZ^P1}lByLEiIT1;- at gx=D)cc((mT{}$#+ at WT+2yw<
z_cW>q+I}jN8OWKQTq3bGkilYVnin<I&si{k!J@|Ix%G4BHYhbi+CN_y50!zEQ2JU+
zj~49n=N7}CWwSK6<9Xv<*N(UZI`I??e93*y9DI1?GjCztoJDmD`M<EPZtlEA1w=&Y
z?qoih!B??anI1cN6oaT8t`Y)EiPySZmg?ifYJs4*<X98!s!V39(nXS;RHNu*774~z
zBE79>RBJku+~#GgEL>XtI1}ivUWmTSQkT|<X!`AvEf6-cGs~o?bCil|?(C-eMe`Tb
zHq32W(6n$tqbkoY#irTw7B$z-o4shk!bNlE%`32O?;k)u<J!ZZ0jOC+m(IX5NM(Y<
zRH)L)@rZ-DH`Uww#Y%UG#bUkvnY7=$hpD2#g~ensmx=Yc4+r*it4S3LfCkmlN-&(F
zj}>yrax^FO1(S*avrN%Lt;8&YtH)+}FmLBCsZGxS->1&^1iT}v?4c6!ec4Q*x6hkZ
z>?g1NZsu2=KY1fjQ;!H6+xk=sW4)LQHhPIW2hIK}UbzTd!&fRvEJH(#U3~WB6RA`n
z*&0d)_d7e1*u1ZV>t at 7vUkNmf^Au6QtNl=9fX=0d6bg$YT~kOiNoQzC2oUL%0WZbY
zSKqv7_QKh-=g(<qsG|kWqV?so>A~}gWeYNcd=DxP4KZ9u>Aq3v56FQVpJP1(vA*qQ
zAlsD>mVnJ_`;g0<C7K&DLWO1;$3~q`2h at bqnajC`OK(i3)pm!y=DL{Y1&ivN7B$z;
zn!9ijU2#Fd^!P&7LGc!6&LP)P7eksgXI|sH+PU?$bLTWJn%7L<wI}2Q!OUK0`U`2Y
z6evEMaXW4m8%m>=`o&=9FI?C(cTV%Hx_Pzp>KYf$v6T|)Mn%U97R_sDo>kvCe^JAn
zrg^h#HM9(=9=lK(`TFZ14- at ttytrv-qaAL}4~{VK4z3&8PQVvHlYxQ=CA7$X+5#H<
zxzb`uX^K{*!wD88FGD6}e+qN+`20l+<}}Qky|8v}!-BbsYUdW*AmP$wc{(m(6rbsj
z{)4zon;6UA7cc%){~vracz?WmTQa~i)dr`+!S}zbs%>GEYOsFptc45a*UoR6)iAel
zPV<l&RD8t_#@<j4E}Rs^lfmxP3|ndEK`x-A#|MfT at 5SPCOphgPn=>`Jo&5+(c;>V2
z+2_A8&?d42rY4=qCu-{ITdK7oRnwa;)F687Gd0~i(|C4Ib}Fomzu*oMG3 at xZs@%Jm
zfmGgbNeUloui>?(H^U2?5&X3*U`;mTRiM|7{l!2{qR-nzLJ(q#lncx4Cb=N|cVZO3
zMba{PMMYX&M=J(w2i;;j><KOQdRUmk)7CJ;m>NVz`h<YrKbXF00|AOoPWXw=LNAj+
zPsV?bcXsmW0G~=F(+U5ba`s=jJGA&NCyZxBI?Gk~2>MBZ3mmIhrUyO|qXYk)fK%<u
zvej+g&x at e#c>gCm{j>)<7RcT07z$Oq`#<ev>NgAg;ni0&a`!FV2vxlM_Ie7ak9hjh
z?0w@#kRCc}0yaHzqb=745CIDBF${(0aqIv5*EJZt>c#u at 3XY=z>8mIl{p4TR4F2Z1
zt0F_f7R-Y2LYiKHN{;oj3pc_O(0+J&YJYqH$Xz|yf`PD*M9E(JzrMSjyeq9F%Vmtr
zRq5UP`QhfFeRoxI19mCl-Vf4-Dcwrn-Cj181=;yOrA at dB`0jLOM7aD0-&M&E+u=ob
z(&Z8YYArTS`Fg+S&L(Le1khCx{?E_HEf^@?a#Lk>E2Lj>hwsR<6Zt9cUExXRQFy;9
z!~6N+eHGe;hknu59aaVO419Or#GUjo)Mj)B<?)}pa)7iyxf8w*q=qMVI?M7j?))$?
zvhSjQ22^KqC!NvfaJQd#KZ$aqa=sKOeRB8MZvo0QQ+fA)awj|ke0S36{5|e&_Z at j|
z<PNK%JLyvGeS#|kF!O(kQ$MNk_~A)sV)K*e7AX<l&vzHak?&5r6f=Hl%!)v}^4%RB
za3`INzGn%j%@3_qMyKOWeiW5-L;6rYJNA^J?sVow at z#1)a`$A(nYEMs9M7FGRo1qR
zPLx6Q!T<T`(^(+7_ubv!RAy4XBc8sy)}lLSd3JLdXM{=)T^Jl+54pSLx-#=)H4N|P
zyOVm8|1PV-N6O46*7~kWb_LI!pWowtRc0mx24saH?DE|CA)NNMax=qkRGu5zT^kB-
zZD+ZuQ-kz=et5Tp!n>}od{Fz7JN at noxw`{*TaIvc`s=&XGtfND#0$!;j@}uVtIw*9
jP68VH0?o}Vc~7~?1 at u|`@DxSR-Dgm)lD>@p^I!iz)Vgnr
literal 16272
zcmeHNdw5$%m7lp+k}X at ZE!py0iImum?L at X@OSVPhCbBIh&Z|kAq-mSt_?6hLU&Kn2
z0?TG;mp&HS^g%a;bm`K<vb22LWy7`~+ineg1<2-eXn;^s2yFLr1S~|*b_2`O{hhgY
zr0W|y^soJEC()fbGr#*gXU?2?+)4gCzA3>uXEJeC&$1F at v#UglH7v4vb_lI&f5X at e
zen&186!B13nkh3W<}OYT at lB$vxMx!q_mJLVfn;-U)FqpHY8_FLjzH?-HJ^9}Y`I{|
zJqwPrmvWiL$d8=8<X|VLE>+}bM|evt&G-qF&!$S<x#@D|O7lGE&OebVed=tgyv7Pl
zZn~cJq?yHXBscBD+vPQUS#G+>u0jqn<w)Ck>#@y=@1 at wO>NK})Nwb_+Qf%Lu6uXVL
z at b*NS*<MB&8n>TKxkG1D1-J1C@$uHPsghG<frhGt?v2n576ul_P~!<;Vcqr<c<;oe
zt?b05?K6e5XL4RWz2V)bd}qG;?RUTI>*+2 at e|e4a`kN_r`}1?kv2V`tqhx&%Jjaf%
zh3`(J6u0e}7cN}9U;60q*QB>+Q!E6({*t$n9q at RlWjT9sHkIqP3g6~kHG}fIr<bH#
z^>NTVKby*1El0`bzM)zhqdbg?!(E||iUU%CTcQfwhhLETr!xApqs?2v;W&)Z$H at BG
za&2s8PzI-;rPn%SjRQ56O%3PSi at XJXDwu&Zn_5!BL*&&Nl=>5=Q!LKX>uo$7Pc!Q`
zAniZJTP4C>GFpvs0k))MHdUH=v$TY*JTuEz=A71;S^6-1QrYx_Ib~)2>21}}hN!GW
zzm~Plrb^trl}1<ga9JDp(AKzpHdO-~>)Y&NobyDK<q7NzT4vBP1Ju+Df1D$aWaCzj
z%8?8AvB`^8i)3bCwYXtTuB@@Z=j$@_!uEB%sZ^y49f)~l1AJm>VQHV8pWl)=eE!-?
zmeu?!b*1O*PcEnzmC{Doo)_7Y;H~7F8I+&!ZkvUdBeKR3$v>Y+be_lf8E^%_bplsp
zs4I$uF%GjSxBl)Iy)!6>W?6cxZ3W&hjj;5HP4bq4!3~CT9j&gKLD_zGHdPJWp$x7%
zVn6@=6w^_!qLjO8OX7pG=DKTVi$|)`O8ygRZbh&2)IiT!(u|SMVd)O_Cl{<2y~WCk
zAEa2Z66T at qG*e$g89c?gEt(AW;_<oHQ_O=H%i$sN$xD#>=isGc4Few)vvg4X#T-lT
zvfXkDPauhnM;c$Vq&cTJurwt0+P+KuVCkuxm*>_c)&M_}vl`DM+<Lw$%^fs0EPXek
z%61Ads_-DKbcj#II6r9(yOY*1xgs+4A#LPe8lhD&HmW?tAK;^~$-y3=m5`<D3uJ8A
z+<X~EKM$VBhbL6-uf#~$;@Vt*=J<}p5Up4D at K8BctlsR3wUbAvC%y)(SUV%L%J2Ex
z$J4AY?+w1{%~@qt;q38uSYN?uZ(?`i$8+pOOL|XS2~eM>Ea<8A%-n&*>A6k6;kGB=
zIUJvP_r2S`)@4EK9<=VVzA|T7z4qPzIq-DXiWd>fs5 at kZ&yjanpPgfm^3SNB^@Wtr
zkw<*3i0+)3l+r$f$hTxxFKw<|G^`)Ct$excxi(Lvq^(p^vSAJtWmcmiNbZc}hUCad
z=5-5etsg6`-wrQg?QhXm8I)RwR&Jer<EtCGznb2$rtydHxh;v<@a1S2&6nZV-pF}%
z-~vT`4aH{meXL>`w#u61DcMp|bBn$@mDZd at 6k2Lv`A*qtsTreI>l^S+QT%JC(T_N+
z-zP`c9Z%BAU}cRnDM$PZr=Oau#!jHET#EZ*W(|IZd`Rns<Jbjt?YT>itvpD3z{wQj
z=Tf$=b16&Fl5~qo^Pwe7W6~PJZo*EY?PN-coJ9M%RPN8trSgI;e%?xLtfBZ#t)w>O
z{b)(rQb6xnqO$ekIraRKv?6Lx;@y*Y*MWIe_#LU+0p0HSxl~b6OAF1f7O{Ry%>~O(
zqUEGOlt6Q-3e7>nv4)a2u^))CNw?lUUv~*~m#XJd<y>km=g(w(BWE6VM_PF^I~~jH
zbQb- at p~a)bXLmE2r8F;dGba>U!4+My;9QfJIoD**E at Di?oF~mPa+!N!{`Y$}dhfsf
z_?~3=zufOhuki;P{y*Lf at n#qkin2&{yl<$+tiwseVi@@*{S5nlB1?N)$-F&3nr3kx
z%+n)LanlGf-{rBNjpe+|$xMq>E#~R0t>`}$x%^pBHvX)T&A%Vqbx+BEr#_o=6WUI<
z^&Bf2x3JH>p8VnD=J867gRzy{xsyAcJjau(s7fI#^;tPXW at Y89%F3$QV}}nP&b2Zx
zx8x{!tPn>XhRn{2_+L_som*LMA-CbdidebN$th!Ze8u{OboYHDJuv>-*CV at 1SG#($
zdP}&~YPUPBcKVZWS?w+lJ>{>ff=d3{Kxh?rc?uMj7qd#T3mKWT)XIG9Z#BF8`4;qn
z75MB4hRhDzj|jV1kz%v+eCF^u^B6KGbF%xW#ffu4Q34i!lB5K4SZoQ{?D4s}D08t=
z_Se+nVr7cWB^W%*h`}QnJjBo?8M>H5v2_Vt#nptXkhluMSyemBv%<DQAI1P>KWYno
zwHqk&LgNFZ%*$M?m^v~K8W7MeA<7ygw1J?O-q$SkuS}1&z`vcl0|gt4f43s*-)e5n
zchbn(^*?nkyOVo(1+Tctd-;!h>Cc3pd+WHrq+H=@4$Jjf6^4u~zn3huV%Qxvgn-Lu
zFF at I4XKwZowb)s)&0<%mht4|cs1w0)7quX)n4^w4v{0$zR>eYq0-tLcWiD2z;atEK
zYFa&wq}3y}dPwU{ip^@d3C=0>d3TZmxJ`S}ix-_crN4Kw0!8TEspPP{o!r5SeH9Z7
z*#u%+nILAL{}#&pQh}coFt+32Lk-r?)qe2D at MqPr-kZaNKb_6`b18z{?sQdnD!dh*
zh5-GU4m3nJgy<QIcg8zoTKSgHWMFz*Lv(MiEV0eoc69Np3Yy{7LRLavMaB?h6;@Ws
zKC8L5%3@)vm18y|0(^EGWp>1p2vIu>EO4q^rD=*Dxbmn6F4+T@=z&G`D-|f^`#hzT
zdGOMwh#XO?S}M4z;6dbGH<5cKxtGXGRh2pY%*p?P-tco?rPOj>sWfn2p)|mm4qspy
zlsW>yh-n{yM+%p*Lgfy6W0|6sC>x-*&=*Qj7LvglVy--_x2oO3c#%zndM6egm#_0G
ztX26j#me2j*cvLwQFi&_-BeCk)m&vSJmvBA4p6p at m9ffRR>h8yzFt;svuxufs?g39
ztEzi$^KI0*&9ZZwsdL+?@7qM*cYK(dcgW@))Qm}q^r41tude&}gD=it{I4Fl<Bo4V
z{-|M{tj&q$*IHewvn=YWT^d^+ at YZ@NJl at t=d%#oc at gDShyc=T&10HW}!*uK*Y678X
zXCyWqpmHR32aiW$s#A47$a__12Oo3QD$G)*h<Rn_D#wu1vYuz<d0LmOs#>k6Yz<5J
z at Dk<4Y(3lPWSiK(kprA;a~V8ZQF1>?9&Rlz^m(eta~^FWszV=53(-NvsyKY!W<nhl
zD8E>)Fz(vINDEU at El^mU))A^!pc<|vt_F!}AXGrH<`wz^*AprrP at w@rg(QlWtRlwU
zsu=Pp&rw{yC_ at MpM>!T?U*}#R3pz2hVzurB7$3GSRRq@^T!j%4MwY}Tp~G<phmta1
z{9{m37H8%B9_n|TmV^hn6>}R-%E8Lid!NXA<<iuPEyF|OyJmCs#GboiA9)7j`~CNJ
zKKF?mNB=oHzni&TwH9_3N6G?K7%`{I=~>y?9BB=-*E+pU&$GP3>DkzMP2{@3v%J>n
z@%jfl_eK7RLqcn9!$&&*fkUhnVj%Psha8Y{B>EJO805}ah(E-Omx^7j!e_O?#0oni
zdx at 1TWsg(8u)S4dbUhVf`a8L`9Gh4^{NQ#9U%Qr&uU*pDF7oxWTnw*g1;L&rcR73u
zZAV@$3TS+NUV-x8NNlDkuu!bj_5oF_N5OtVT^0pE1r7q`*Q4NGPO$l55D{dN`#Eqc
zB0^{M^8y!@U5HW_I)!PSe at 8e+r@+O&E^sl4i;1wpc;4{jy<fWLGf(XL2Fefo`|A6D
zJ7zrB<m=}Pm&;@I`)ez_)=((Y5UA$Id8Gqe!4-}Zx%zR!X2(*2<AfV~NS>22D|R^S
zTm at 9`67?Q;rk=LRGG8feD+PYkmia1cDXYN1R{NHCDH8-5FeLWBkN`&NC~FYFKqF=7
z(>tH;v~1jZbMbdk?mOMGvw3dG)7f}+Bj#~_;x6v0^5BS6LHl<z_HTbJZ{Q8x0p1V@
zdHFZF$Em0)b_1*}SW2<4po}?#G7d$^tgKX9&#iQftD at b#3YcnNDQ&zi4<-++ub|9@
zBcPa_E`l~Ia6vOpBGo>BBQm!iJ6g4`wuLe;Tf+Qawu~+BCdO{Tcy)jn1A;LTqO5^n
z4FqG%_a85fzL4I1dmH*Y`+Yo+vi()XIn|!SPjhdMf<08tXD-A!dsv$;CCsDX&{^TL
z=P3xkJgg=zjpNTQ%)LDI$S=A+4DrFAUpzW+*Tq9wUI)dA)xHuZQRC0*EaY$SvV1v3
z>EMao+B8M&mX%7b&9>5#&x+{agUkuF50Xg~FlBYDOgp92 at f>ce;{~kPXKz9T7c=(z
z?|o{nZRpcK%7b0ynyH5V;-2~)USEhq|EA+_Ken&^7r$Ex%;|&%%-YYn)yC&|m3n1M
z>0E(SrM)h`A9y({Yfg?&H4p6XpBNko3<mZMPYmzxA8Q&EDEZwWzZvvbMW(T7HS(M<
z&-g~1(;&$6sywS2nlNRuNuI;x87$jEN2Y9&`?cJwvn`C=n at Murmur5e0R=roM3r1m
z<XU3H=|==nCFiA_lSZ7ezcQX>EE{q3{U(!)PZ^uCo^qp~WxU8(G2-akP$n5KGFD_g
z<wo2WIh!6GpBfwP8=IV*n&yL(6GNlP(aDMav1vZszklrZzTrco$!UJefpIiX9~?~%
zjto!pfzf?^n!pDpC&z~SC;BF*5I4!m{b)qZ<kaPi83-Sm?AzNvHkKUOKY3u^2p{hs
zo#2;8;0LCY{mIe6zP$$~2HEyr-{4sP#6I6`!~3UUpf40^3N{6O_0!WMA82mgH=0~K
zFq#}VFnH^5vS~EAuPHg&G&nilJUBTt+&ngR+jwAV|Ku&hgUKd9eJzo;!PeoywxQNY
z|K8Bva4_8379MEd+c7*84u#u?hx!L1(P%i>z+&s+vi{-zfl<b<MzOo4DHvte!O8u}
z;X{G(Fta&xHs><Cl4mPmF7CFJa1Sd}%khy_$*XuZU!pAIHN1|Ce=CcC0Y?wkuID%l
z3Hd5L at 6_`(dLGmBZat6dIsM}s@$~BXM&#ynTTZqHSHAC^fjp9_DrPT3-bExL6|?+Y
zS*9G(IZw`E)_HOj`@Mmm;mq>udGd1h);xIy`{6u!B|9}wZf5Vylk?fn=gEcaC-dZD
z_ASU`8Iz0Ii;#C4`t$X9_%ar at Y2dq&akiVC)3H-R?qfsx#269s06VYai-bJE9 at 8fx
z%{|VB*^~MN*6>@|b9Cu~<in4{)7R<z>xFzB+oa>45%Ny9UB_$ux3aUke(n9uEUN1}
zD)2Y3$8~$?pK>|A0B%A5NW~KT6xPhXqw8BO+FS9=CRMEVMtPod(3+oZL`lV|z?jr|
zt0}dY8Ji)?T}7)_5f8?s(&lbRDqCTYh>v!*Y*Nu5V^Y~>qX_&Klf2a=Z!^i)ndI#z
zd8bLf-Xz~(l5aH0yG`=VCb`cf?=i^(CV9{#51Zt at CYhozn^ZQM6;M*yttL4;bErXO
z6Q=e_ll&p}dA;UW$o)#UIG<A0BSK!s#z{bW6F<KaW8!ij<=-PN{mNDBx73KVN678$
ztR}K8LXNTqJ$|o6y<ds5yY=>iLXL=7r>c_zzlIg)c$&w4rIXQnl<M&FE4^ZkC3&5Y
zH?mjt`9pOy=ROUYC`$2gD`o6j%s-M>3%QDYN0&>4yc7p_t)2MY%5s*E`APU{(VoL<
zb-uNteFb|K_0)by$ocGVF#k!;6Zk^*gwFR-=y5A6*&4llt-!17VV&P1+O^Y6Gd>Dv
zSqRd{0aBx%G3r(`rX!spgZi{=T&C^w%@taE5ILnrOheGI=1RRDIi<!LjknpWE&D;_
zwA(fN7)u}zBB#_?tLt;?`jCryI7RTnOtL4anadh6%|$(~x<oy4fv?x{W*p{3fAm9L
zV}o9gMOM@!r_|V}^I(|~Jjkhu{6VfDf6xrh!?dNDN&WsH)gwPe^{D(V<u~KIpYrP%
zdxLT;13yOI47+}YJc#^P7$36hH^_s?-RM9wl$9b6BHv0fZWFeXj68`vPY=FEeHo*6
zVLx(8jaalP=9B=VTR*1k)@3YnLWbR<J*3Mw=yIzr!+y~o(Pi{Q$nCm}{s=j$%iDDs
z2MfW!Lzg>s8O{=T95h7xE?ti4@=dzjt;<->cVB<QjW=JneaFsSH!a<~VPo$#Th=Ew
zt=qb7Nua4Y7;0$^N7~vuq93?wb?4P<*2cQJd*b*XN%&t$>o{M}c`xT1IN!+mCeAl=
zzJ>E^IN!?oHqMu at zP`c9+x8C+_O*9~LmlmH!M1p)JKWQnIFM}$x5T at mZSBGCaJ)U<
z(cWWdN<`ybt?g~?(Vj%OD;(}NH1%{vBW*a`#oIf2dLoIKp()Z4YmLS_ at V6rt3rC`c
zruJx8JeueVg*&3q)NW`AwMKd(!EhH2j6KmvB4TKY#9JcKL@?44g&V>VV^dqSy|p{i
z(h&@Iw}+#_u;Hz?j*fV^H4%zMf{|EHN2{T!D-mt!XlZF{?e30&G-POMk4Cx^p{|~`
zXm at Ko(h at wtns6LVGCJ~(4^N=5sjm+Q-o1l;hEqJ8Nhe`6?Cl$zNKQ8`glXD8Jk}Ju
zc5 at RB{zHcZZIh8hw39MZ?c`8 at vcE}wAv7Hv9^E&RoHiJ8*@wcS=3I_k$f!k7!n6h2
zG7h0O`FV0h6EdL1w9f}*6lbe5I*lJ$i|U*QT1e;R0HJe!bw;Q7WLs33*1C`uLyMr-
z<qWU!8*x$kd7y=~Tn-S*=2ue~_9v73M+Xihho_CoCi=%wk&SX0cSg*-5YGS>GG>0G
z=2ZPt*Pz2-Tjo=CQGE-77t*~r(Cm<`(x!d*aGsL7v38F48zp=&8_cG!YYDw<=8MLK
z%*r+hGc<8xGCAC|Zp)4UzRU-2HRzcCLBFUr6Ko;93qgbh=7vl>X73^v)oXw(q|@9i
z^cgDkWfOkJ7015eK6ra-bYdTC602$d&=77U_GOh%?j6O2%EA4k$>BaK8vLYPa`X-M
zWv<!!jF%jXt<QhrwT1d*q!sO=Q^wlMFI-sDbaH>Pe*pRI<A%I%d^p+9h{a$aE%&S@
z*%YNm2df!sYNt{gJwg$Z at jx+5Pw@z~Qc*lYEmRbbP)NYUBS_C69hlx{x(A=JI5ua}
zzv3KQl$#O7d7C8q{|ERh&W<F9>0wB8R-+Wv&){^%q(r#2RL~QSdLl)DGu~Ie<=4(j
z2hmFQ5FeRQuJKKM9A!#L{HUHVl%(Dg6W`n5BOLMJGa<ug#S6xMd=zc;{UMX&qpMz{
zeSa|62bX2|-ZI&D6kMd2Fq9<Ud6RvPWm)@358>#&f5iJ_j`ZK-5Dr0>N%DOK^+x+j
zz(?m%>Mz|yNWKR&zKs9MF#x28Fq9<Ur%Ze`2K(qfR`MOy`kS%O2R`~9lS%SDZ0heS
zgMD-}BKbaM^4}`RWFKKDNxl!8_*NV2qx)yccOMF5j`Uv`@6q?4Op@<j6pa4s0iO>b
z@*jPANxlzhd>Q|BAehKL!cdZY`0qgT_=XJj(I<@LyB~%b?OO{z`hJ#4^8FQXM*GIV
zC&#zUz&EAwW$fDpnd~DBCCN8t;`^w<K78V3?AxTww{H*Lqwjf{B;R`AjP~7Wun(V>
z8NND=FJs>^OboJ*Fq9<UG85m!;3FK32R@}Ue6MJHnelxRe00AcljQq`iSHQrr2pt<
zjc~;Oq{f%A?>SUbJz*$GzQ;{`PlHd|=hty0<Ntfj8{ZjJ))A4OKqHbHIHUiLgHPJG
z90+OOf1-fyW$e2EKGH)NO47a*3P!${4ffUQIC^g>#*^HIOr(pbT&tHUllD~sVB|Y#
zux|x$(!M`v{ms}H#7m at yFqEWymrVUVXRxn9$I*L_X?z*`I>1NwJ2FYWM@@Whf$wpE
zC|>9aLE3kx#+R}0I2JzALl{bu at 34vQPB@rw#D^<~4Brsq&FH`9!AJMUGD%bS0B7{y
zC&4Gj7grV;z8;M)W8XR5KEhCv_N_JX9W&U6D~}A{OE8Y?lXkoXzSTseC&?E=e`(#6
z=}AmT+275mBpm$`n*TC{K8NNL`5wJP$;|h(fo}ua7vnn$zCC2Ho)+UfZs6Mp>|%VE
zuvyW4s7#CTJ#XOay#n8QY(#YbD$`<oFB|x-xe_0oe(rtnoiy-mxdLB3HX^#um1!~i
z&KUUCUxDuuF0<a0WXKoeJ7?faT!HT_Hb1)WmT57*w+wun0A6f-PvAaLzbX`zi}C%^
zz_;!Sd_HWHk4WQ?FUI$_fp6;-_?`n_-TUDCgMn|`75L7BkL;I8+DGRQ!?3e at +^gb>
zG?OIm*H{Rstm-Yhfb(Tg+5Uc6TZh<T1FjxrS_>#izAu{Ap(hRNnv7Gz{tFZu^&W=a
z5y7NAB%fI?;pzb)A5)Szv)<zdz0!Y#9feaUm;L<`_|_AVo+O`HFX8He!8Nc*5@*)?
zvO({5ASq4>yW7;?S at 1n0n6!uFGwUTB>BV)jND^n(d&Z#mdLX6VO(@VivcH$WcT}UA
z$7j|{IMR!2 at _9J3-nR^T>E8vU-d>y!jCy at IMBc4)QATZ)%z6n&dU1U(lEj(yzHQKp
ztNM)IOQ!K%556g#i!#Y))=N0j+oxkC&aBr`lijEH04w|Z5z{=H0^f+vMVaI?>m?lN
z9ni57XVzO{&^rjM)cZUN^o|_gqu|5PWs>AG>m?lN9oCT&XVzO|(7P8{srNM27o*-8
z at cDEu$|RpzFX2e<h>n#wv)-^l?<lZR at 1RNV1@IN=T$D*ZvtGiH-dlC7#F_Q>81#+-
zEA`s3uF*Tv&qbB*PcPv}@5G<byWOC7(xA5<1|Xy}sRMj}pOLa{8vr6)P;dJwaJQRq
z)cz&YzHlS<8Do;V%Aps1%}gD_(K$#aiF=g%vgtiCS)@nM59;qhU6#1#upX!y?l3hC
c0oQ`ujC%ll@@z^tOEqKXb(<3;<45EDzd8gb;{X5v
>From ff94edfc4997615085c0db538b52252cb4f128a8 Mon Sep 17 00:00:00 2001
From: Lambdaris <Lambdaris at outlook.com>
Date: Sat, 13 Jul 2024 10:45:29 +0800
Subject: [PATCH 2/4] [coverage] MC/DC reports unrechable and uncoverable
conditions
---
clang/docs/SourceBasedCodeCoverage.rst | 11 ++
.../ProfileData/Coverage/CoverageMapping.h | 69 ++++++---
.../ProfileData/Coverage/CoverageMapping.cpp | 138 ++++++++++++++----
.../llvm-cov/Inputs/mcdc-const-folding.o | Bin 34528 -> 34616 bytes
llvm/test/tools/llvm-cov/Inputs/mcdc-const.o | Bin 5208 -> 5296 bytes
llvm/test/tools/llvm-cov/Inputs/mcdc-macro.o | Bin 6408 -> 6488 bytes
llvm/test/tools/llvm-cov/mcdc-const.test | 42 +++---
llvm/tools/llvm-cov/CoverageReport.cpp | 4 +-
llvm/tools/llvm-cov/CoverageSummaryInfo.cpp | 2 +-
.../tools/llvm-cov/SourceCoverageViewHTML.cpp | 7 +-
.../tools/llvm-cov/SourceCoverageViewText.cpp | 14 +-
11 files changed, 213 insertions(+), 74 deletions(-)
diff --git a/clang/docs/SourceBasedCodeCoverage.rst b/clang/docs/SourceBasedCodeCoverage.rst
index 73910e134a5891..0cc846747e3857 100644
--- a/clang/docs/SourceBasedCodeCoverage.rst
+++ b/clang/docs/SourceBasedCodeCoverage.rst
@@ -517,6 +517,17 @@ starts a new boolean expression that is separated from the other conditions by
the operator ``func()``. When this is encountered, a warning will be generated
and the boolean expression will not be instrumented.
+Besides, MC/DC may report conditions with three states: ``uncoverable``, ``constant`` and ``unreachable``.
+``uncoverable`` means the condition could be evaluated but it cannot affect outcome of the decision.
+``constant`` means the condition is always evaluated to the same value.
+While ``unreachable`` means the condition is never evaluated.
+For instance, in ``a || true || b``, value of the decision is always ``true``.
+``a`` can not make the decision be ``false`` as it varies. And the second condition, ``true`` can not be evaluated to ``false``.
+While ``b`` is always short-circuited. Hence ``a`` is ``uncoverable``, ``true`` is ``constant`` and ``b`` is ``unreachable``.
+By default statistics of MCDC counts uncoverable and unreachable conditions but excludes constants. Users can pass option
+``--mcdc-exclude`` to control this behavior.
+If a decision is proved to no branch theoretically, it shows ``Folded`` rather than coverage percent.
+
Switch statements
-----------------
diff --git a/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h b/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h
index 8e2ff015d15012..e3a04d169364ce 100644
--- a/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h
+++ b/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h
@@ -384,6 +384,13 @@ struct MCDCRecord {
/// are effectively ignored.
enum CondState { MCDC_DontCare = -1, MCDC_False = 0, MCDC_True = 1 };
+ enum CondResult {
+ MCDC_Normal,
+ MCDC_Constant,
+ MCDC_Uncoverable,
+ MCDC_Unreachable
+ };
+
/// Emulate SmallVector<CondState> with a pair of BitVector.
///
/// True False DontCare (Impossible)
@@ -442,30 +449,36 @@ struct MCDCRecord {
using TVPairMap = llvm::DenseMap<unsigned, TVRowPair>;
using CondIDMap = llvm::DenseMap<unsigned, unsigned>;
using LineColPairMap = llvm::DenseMap<unsigned, LineColPair>;
+ using ResultVector = llvm::SmallVector<CondResult>;
private:
CounterMappingRegion Region;
TestVectors TV;
TVPairMap IndependencePairs;
- BoolVector Folded;
+ ResultVector CondResults;
CondIDMap PosToID;
LineColPairMap CondLoc;
public:
MCDCRecord(const CounterMappingRegion &Region, TestVectors &&TV,
- TVPairMap &&IndependencePairs, BoolVector &&Folded,
+ TVPairMap &&IndependencePairs, ResultVector &&CondResults,
CondIDMap &&PosToID, LineColPairMap &&CondLoc)
: Region(Region), TV(std::move(TV)),
IndependencePairs(std::move(IndependencePairs)),
- Folded(std::move(Folded)), PosToID(std::move(PosToID)),
- CondLoc(std::move(CondLoc)){};
+ CondResults(std::move(CondResults)), PosToID(std::move(PosToID)),
+ CondLoc(std::move(CondLoc)) {};
CounterMappingRegion getDecisionRegion() const { return Region; }
unsigned getNumConditions() const {
return Region.getDecisionParams().NumConditions;
}
unsigned getNumTestVectors() const { return TV.size(); }
- bool isCondFolded(unsigned Condition) const { return Folded[Condition]; }
+ bool isCondConstant(unsigned Condition) const {
+ return getCondResult(Condition) == CondResult::MCDC_Constant;
+ }
+ CondResult getCondResult(unsigned Condition) const {
+ return CondResults[Condition];
+ }
/// Return the evaluation of a condition (indicated by Condition) in an
/// executed test vector (indicated by TestVectorIndex), which will be True,
@@ -505,20 +518,25 @@ struct MCDCRecord {
return IndependencePairs[PosToID[Condition]];
}
- float getPercentCovered() const {
- unsigned Folded = 0;
+ /// Return if the decision is coverable and percent of covered conditions.
+ /// Only coverable conditions are counted as denominator.
+ std::pair<bool, float> getPercentCovered() const {
+ unsigned Excluded = 0;
unsigned Covered = 0;
for (unsigned C = 0; C < getNumConditions(); C++) {
- if (isCondFolded(C))
- Folded++;
+ if (isCondConstant(C))
+ Excluded++;
else if (isConditionIndependencePairCovered(C))
Covered++;
}
- unsigned Total = getNumConditions() - Folded;
+ unsigned Total = getNumConditions() - Excluded;
if (Total == 0)
- return 0.0;
- return (static_cast<double>(Covered) / static_cast<double>(Total)) * 100.0;
+ return {false, 0.0};
+ return {
+ true,
+ (static_cast<double>(Covered) / static_cast<double>(Total)) * 100.0,
+ };
}
std::string getConditionHeaderString(unsigned Condition) {
@@ -553,7 +571,7 @@ struct MCDCRecord {
// Add individual condition values to the string.
OS << " " << TestVectorIndex + 1 << " { ";
for (unsigned Condition = 0; Condition < NumConditions; Condition++) {
- if (isCondFolded(Condition))
+ if (isCondConstant(Condition))
OS << "C";
else {
switch (getTVCondition(TestVectorIndex, Condition)) {
@@ -589,14 +607,25 @@ struct MCDCRecord {
std::ostringstream OS;
OS << " C" << Condition + 1 << "-Pair: ";
- if (isCondFolded(Condition)) {
+ switch (getCondResult(Condition)) {
+ case CondResult::MCDC_Normal:
+ if (isConditionIndependencePairCovered(Condition)) {
+ TVRowPair rows = getConditionIndependencePair(Condition);
+ OS << "covered: (" << rows.first << ",";
+ OS << rows.second << ")\n";
+ } else
+ OS << "not covered\n";
+ break;
+ case CondResult::MCDC_Constant:
OS << "constant folded\n";
- } else if (isConditionIndependencePairCovered(Condition)) {
- TVRowPair rows = getConditionIndependencePair(Condition);
- OS << "covered: (" << rows.first << ",";
- OS << rows.second << ")\n";
- } else
- OS << "not covered\n";
+ break;
+ case CondResult::MCDC_Uncoverable:
+ OS << "uncoverable\n";
+ break;
+ case CondResult::MCDC_Unreachable:
+ OS << "unreachable\n";
+ break;
+ }
return OS.str();
}
diff --git a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp
index 2dcebba8288061..75084b5395e646 100644
--- a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp
+++ b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp
@@ -365,11 +365,15 @@ class MCDCRecordProcessor : NextIDsBuilder, mcdc::TVIdxBuilder {
unsigned NumConditions;
/// Vector used to track whether a condition is constant folded.
- MCDCRecord::BoolVector Folded;
+ MCDCRecord::ResultVector CondResults;
/// Mapping of calculated MC/DC Independence Pairs for each condition.
MCDCRecord::TVPairMap IndependencePairs;
+ /// All possible Test Vectors for the boolean expression derived from
+ /// binary decision diagran of the expression.
+ MCDCRecord::TestVectors TestVectors;
+
/// Storage for ExecVectors
/// ExecVectors is the alias of its 0th element.
std::array<MCDCRecord::TestVectors, 2> ExecVectorsByCond;
@@ -395,8 +399,9 @@ class MCDCRecordProcessor : NextIDsBuilder, mcdc::TVIdxBuilder {
: NextIDsBuilder(Branches), TVIdxBuilder(this->NextIDs), Bitmap(Bitmap),
Region(Region), DecisionParams(Region.getDecisionParams()),
Branches(Branches), NumConditions(DecisionParams.NumConditions),
- Folded(NumConditions, false), IndependencePairs(NumConditions),
- ExecVectors(ExecVectorsByCond[false]), IsVersion11(IsVersion11) {}
+ CondResults(NumConditions, MCDCRecord::CondResult::MCDC_Normal),
+ IndependencePairs(NumConditions), ExecVectors(ExecVectorsByCond[false]),
+ IsVersion11(IsVersion11) {}
private:
// Walk the binary decision diagram and try assigning both false and true to
@@ -418,6 +423,7 @@ class MCDCRecordProcessor : NextIDsBuilder, mcdc::TVIdxBuilder {
assert(TVIdx < SavedNodes[ID].Width);
assert(TVIdxs.insert(NextTVIdx).second && "Duplicate TVIdx");
+ TestVectors.push_back({TV, MCDCCond});
if (!Bitmap[IsVersion11
? DecisionParams.BitmapIdx * CHAR_BIT + TV.getIndex()
@@ -445,7 +451,6 @@ class MCDCRecordProcessor : NextIDsBuilder, mcdc::TVIdxBuilder {
buildTestVector(TV, 0, 0);
assert(TVIdxs.size() == unsigned(NumTestVectors) &&
"TVIdxs wasn't fulfilled");
-
// Fill ExecVectors order by False items and True items.
// ExecVectors is the alias of ExecVectorsByCond[false], so
// Append ExecVectorsByCond[true] on it.
@@ -477,48 +482,130 @@ class MCDCRecordProcessor : NextIDsBuilder, mcdc::TVIdxBuilder {
}
}
+ void findCoverablePairs(const MCDCRecord::CondIDMap &PosToID) {
+ llvm::SmallVector<unsigned> FoldedCondPos;
+ for (unsigned I = 0; I < CondResults.size(); ++I) {
+ if (CondResults[I] == MCDCRecord::MCDC_Constant ||
+ CondResults[I] == MCDCRecord::MCDC_Unreachable) {
+ FoldedCondPos.push_back(I);
+ }
+ }
+ if (FoldedCondPos.empty()) {
+ return;
+ }
+ std::array<MCDCRecord::TestVectors, 2> PracticalTestVectorsByCond;
+ for (const auto &TVWithCond : TestVectors) {
+ const bool Practical =
+ llvm::all_of(FoldedCondPos, [&](const unsigned &Pos) {
+ const auto &[TV, Cond] = TVWithCond;
+ const auto ID = PosToID.at(Pos);
+ if (TV[ID] == MCDCRecord::MCDC_DontCare) {
+ return true;
+ }
+ if (CondResults[Pos] == MCDCRecord::MCDC_Constant) {
+ const auto ConstantValue = Branches[Pos]->Count.isZero()
+ ? MCDCRecord::MCDC_False
+ : MCDCRecord::MCDC_True;
+ if (TV[ID] == ConstantValue) {
+ return true;
+ }
+ }
+ return false;
+ });
+
+ if (Practical) {
+ PracticalTestVectorsByCond[TVWithCond.second].push_back(TVWithCond);
+ }
+ }
+
+ // If a condition:
+ // - is uncoverable, all test vectors in exact one element of
+ // `PracticalTestVectorsByCond` show it is `DontCare`;
+ // - is unreachable, all test vectors in both elements of
+ // `PracticalTestVectorsByCond` show it is `DontCare`;
+ //
+ // Otherwise, the condition is coverable as long as it has not been marked
+ // as constant or unreachable before.
+ for (unsigned Pos = 0; Pos < Branches.size(); ++Pos) {
+ if (CondResults[Pos] != MCDCRecord::MCDC_Normal) {
+ continue;
+ }
+ const auto ID = PosToID.at(Pos);
+ unsigned InaccessibleCondCount =
+ llvm::count_if(PracticalTestVectorsByCond,
+ [=](const MCDCRecord::TestVectors &TestVectors) {
+ for (const auto &[TV, Cond] : TestVectors) {
+ if (TV[ID] != MCDCRecord::MCDC_DontCare) {
+ return false;
+ }
+ }
+ return true;
+ });
+ switch (InaccessibleCondCount) {
+ case 1:
+ CondResults[Pos] = MCDCRecord::CondResult::MCDC_Uncoverable;
+ break;
+ case 2:
+ CondResults[Pos] = MCDCRecord::CondResult::MCDC_Unreachable;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
public:
/// Process the MC/DC Record in order to produce a result for a boolean
/// expression. This process includes tracking the conditions that comprise
/// the decision region, calculating the list of all possible test vectors,
/// marking the executed test vectors, and then finding an Independence Pair
/// out of the executed test vectors for each condition in the boolean
- /// expression. A condition is tracked to ensure that its ID can be mapped to
- /// its ordinal position in the boolean expression. The condition's source
- /// location is also tracked, as well as whether it is constant folded (in
- /// which case it is excuded from the metric).
+ /// expression. A condition is tracked to ensure that its ID can be mapped
+ /// to its ordinal position in the boolean expression. The condition's
+ /// source location is also tracked, as well as whether it is constant
+ /// folded (in which case it is excuded from the metric).
MCDCRecord processMCDCRecord() {
unsigned I = 0;
MCDCRecord::CondIDMap PosToID;
MCDCRecord::LineColPairMap CondLoc;
// Walk the Record's BranchRegions (representing Conditions) in order to:
- // - Hash the condition based on its corresponding ID. This will be used to
+ // - Hash the condition based on its corresponding ID. This will be used
+ // to
// calculate the test vectors.
// - Keep a map of the condition's ordinal position (1, 2, 3, 4) to its
// actual ID. This will be used to visualize the conditions in the
// correct order.
// - Keep track of the condition source location. This will be used to
// visualize where the condition is.
- // - Record whether the condition is constant folded so that we exclude it
+ // - Record whether the condition is folded so that we exclude it
// from being measured.
for (const auto *B : Branches) {
const auto &BranchParams = B->getBranchParams();
PosToID[I] = BranchParams.ID;
CondLoc[I] = B->startLoc();
- Folded[I++] = (B->Count.isZero() || B->FalseCount.isZero());
+ if (B->Count.isZero() && B->FalseCount.isZero()) {
+ CondResults[I] = MCDCRecord::CondResult::MCDC_Unreachable;
+ } else if (B->Count.isZero() || B->FalseCount.isZero()) {
+ CondResults[I] = MCDCRecord::CondResult::MCDC_Constant;
+ }
+ ++I;
}
// Using Profile Bitmap from runtime, mark the executed test vectors.
findExecutedTestVectors();
- // Compare executed test vectors against each other to find an independence
- // pairs for each condition. This processing takes the most time.
+ // Compare executed test vectors against each other to find an
+ // independence pairs for each condition. This processing takes the most
+ // time.
findIndependencePairs();
+ // Identify all conditions making no difference on outcome of the decision.
+ findCoverablePairs(PosToID);
+
// Record Test vectors, executed vectors, and independence pairs.
return MCDCRecord(Region, std::move(ExecVectors),
- std::move(IndependencePairs), std::move(Folded),
+ std::move(IndependencePairs), std::move(CondResults),
std::move(PosToID), std::move(CondLoc));
}
};
@@ -910,8 +997,8 @@ Error CoverageMapping::loadFunctionRecord(
}
// Don't create records for (filenames, function) pairs we've already seen.
- auto FilenamesHash = hash_combine_range(Record.Filenames.begin(),
- Record.Filenames.end());
+ auto FilenamesHash =
+ hash_combine_range(Record.Filenames.begin(), Record.Filenames.end());
if (!RecordProvenance[FilenamesHash].insert(hash_value(OrigFuncName)).second)
return Error::success();
@@ -961,12 +1048,11 @@ Expected<std::unique_ptr<CoverageMapping>> CoverageMapping::load(
// If E is a no_data_found error, returns success. Otherwise returns E.
static Error handleMaybeNoDataFoundError(Error E) {
- return handleErrors(
- std::move(E), [](const CoverageMapError &CME) {
- if (CME.get() == coveragemap_error::no_data_found)
- return static_cast<Error>(Error::success());
- return make_error<CoverageMapError>(CME.get(), CME.getMessage());
- });
+ return handleErrors(std::move(E), [](const CoverageMapError &CME) {
+ if (CME.get() == coveragemap_error::no_data_found)
+ return static_cast<Error>(Error::success());
+ return make_error<CoverageMapError>(CME.get(), CME.getMessage());
+ });
}
Error CoverageMapping::loadFromFile(
@@ -1058,7 +1144,7 @@ Expected<std::unique_ptr<CoverageMapping>> CoverageMapping::load(
std::string Path = std::move(*PathOpt);
StringRef Arch = Arches.size() == 1 ? Arches.front() : StringRef();
if (Error E = loadFromFile(Path, Arch, CompilationDir, *ProfileReader,
- *Coverage, DataFound))
+ *Coverage, DataFound))
return std::move(E);
} else if (CheckBinaryIDs) {
return createFileError(
@@ -1152,9 +1238,9 @@ class SegmentBuilder {
// emit closing segments in sorted order.
auto CompletedRegionsIt = ActiveRegions.begin() + FirstCompletedRegion;
std::stable_sort(CompletedRegionsIt, ActiveRegions.end(),
- [](const CountedRegion *L, const CountedRegion *R) {
- return L->endLoc() < R->endLoc();
- });
+ [](const CountedRegion *L, const CountedRegion *R) {
+ return L->endLoc() < R->endLoc();
+ });
// Emit segments for all completed regions.
for (unsigned I = FirstCompletedRegion + 1, E = ActiveRegions.size(); I < E;
diff --git a/llvm/test/tools/llvm-cov/Inputs/mcdc-const-folding.o b/llvm/test/tools/llvm-cov/Inputs/mcdc-const-folding.o
index 7a16162f29c00777d9a05f5fed1cc4cbf333c56c..29aabadc9c6e50e605191bb6c7e00a4ca91619d9 100644
GIT binary patch
delta 1920
zcmaJ<Urbw77{BM#cD<#AmX+?GVEMDrEjn5XqZgB2NZ7!T5CYTjuN{91gRP7XI at YqS
z7q&r`43+JB;Yl&^!G|So!9_}9 at 8;7IO=OA5O!NU0qsFJ{(~3U$opbLB8fTN<-}jy0
z_xrx{JLhb^OV{3`OCB2NxPN5COse6wx#&$wj7HH!3{FZ3u?jYifeKck&?`_v1&nM)
z!GWo0!i+_NaA$1)<EIDZTU>ACddQl~%`Yn8ka&z3AtZ)fqL5Pw!m?X=KT%oIUJXyg
z+}whH&!qxEQEskD%ykgQ{%W3j<<9S1ug{e%WuocD5E!x4;ouJ};i7GoAbj~-acr~u
zL8t{Bc|`^Tu|Z{Cv7ZtHw`b$_9455QBBS6E_IO1Ln~D*Bg^G$c*EfHD*va)q)Y}|z
zJMYMzmq_5-JQ-&=t<%H-x2y+A3*5IBS-8$9io^r?c9$Pr8kkFMyvboe6S?sgzI}cC
z$uCaym#p~j@;3T-pY8Bo6E^rS4a98?IRAl-&3`?=0_UUeUHW`DmtR-3)7|p-H$VOS
ztt-<z-95>FxjSb;h=?#*(1qQ<D$w2Ky64%Cxh(uX^xcO?zW(Fr&maF|_ZRH{v-{8N
zVeG%#!TLuXKR{EV2V#W*jvG39cWe2Qj?Z*#cWUeR5P!nIyGX+&4ez+LG^XRGj_rH2
z^@loo_iFiyj`n?8KC9z19sBod>l->Y9MJN6h)sp|)#nFJlP<SsG#-yl)mK%W8H<lz
z96UNSF<upoPHUexVv`eRhlk=vk#zfg!$Y;cI{%2THsT$u^$iS5J}FY`4fy?%zs6f#
zCq*PAY7Vnkxq7PD;oR58Li}~&do88Av;@CxFz0K|vHgUx1v}Uuk&Wm%<y!vK`AP&D
ztGC%-xc0T2HUb~*U at vpFatBNN+uB!gy_8mMv#SICrzKQuh5C*ZHP^s;M-UQSPOx^?
zkT!VK)e4I|YV2+W>&YlQ?{>l>Vxk9Y-sUwuSi_^nUaWZsYkIK;G0}%Lr)o$99`#`j
zj~YAcAQ8g#F04abL`;M+ at 8)%3tmDz#Y3$V#C8Ln+QAiB3J<ZsMsRIM3>SfiKky*(0
zD&!_4`xICk#6F=H%rYcHnkE3*kOF}S>cUZS53*sEtU>y;LLP$Dud*KfGT8uWKq22j
zdO*dR<e*G`h4i38o`E!^l1<1C$y6wX`Usv=DXd2_)ZPR$!$G<iv*8qVBR7(v4Nb5$
z5~N<t&ZKAnxicBue{xi&Etrg^XggA48L|S|F`4v(bXGx^>9Z>CAbCzE2}qw)a8FWH
zrNVL8iU!FNNaG4whV-~fy~knZe2{zs>GKNiQ<_k*M|MJHUSbM)4C$DPg5(96dAXqA
z&ZS8e+3cjuyi6(NIi#mljFWMhn#*84o}%_LsK1z@?h~+eF-YB*O{b^_x#<jTKLInB
zf;52Hr4(&IE|FnpmXK*XCdm}(f^?D}+KkMs%&-fSF7rdXEHf)t*cGL(sMOvJGgpJm
z%2fqVKuW2!p&7PPL1sl!*tIAsJFZ!oS(#PXwalsPu;yfD<(k5-<r+V%>oT))U7<ob
w)ZfTZp#`>XERb=So3EpHi=nj81sn4ocH{Fh^|nC$LXbU`1)18*VSVAy-_Q>W3jhEB
delta 1736
zcmZWpT})eL7(QPou`LC9+5&~HvrCE+huRI)8g<<gBmTv-gRz!DDR5vg3Y7mde#?Gv
z$uezuZ_3TYq!(T^84Fpg7v`W>OEj^)8b&W_(ir0vdNrdaKHoV=o7ju*eZJ>=-rw&#
z&3>#a+|?zTb%nr#=ZE#=F*q#8Y&sodCZVeNm`*SW7LP!^28VugwDHm7Cf^;38yxhH
z{-jaR34$OB7D1qA4X-e+3fBrHRuEFIwNK>dPWUNibXaTt7gnHq#zwti^zZhWr#645
zJ)?u(G`cFwLeQ}BRRq3g4BN`%e)F3%RtP=pr9!2XUaG7oo2f<bc7Is+{a>GUkgKMl
zqQYQc&rqz|4evW9C+%0h4rDXUtNSL3S2<ZTc`EC$e^_-&-}%+skrUgk8QL>z&Zo$1
zcB4URsXk6})f=jgd$&}(k-<rm)i2knHPs3Am;-*PA8+6P;@#!>qXN8T1=wpsaGtIS
zV*R$J33;4UV{U^hpW;!B at bGtky!cDHRL5K8b!5%maJPy)NL2iZnva_|YwZ-Xc>jaB
z67*P)*hC2)l%U^sB-qg)`7bn+t5&5|oG9VVx)L2L!-X>JuP<r#%CN^?;<wANxuL|z
z%kV)Njx?4uxiWmtQQ~(ry!*t_$9C^KMH~BozCK-#^@r2#SWlke__Z_bY=G8*2WU&h
zKdbmp6`ybAe5jRcKI3 at z%htyysvf+j-mUP$)39{j;-Kt>pl+v?EFEWAiUJ)xenZ$x
zc@=E|1v;!Gbw=5aii$v4jl0-JsZKB3(|Eq?^0G(TSyz<hG#+SQ<1RrF^s<7+AMSqD
z&Vo_$ci5;1n}d}?ZDbF5 at h<YAc1m at 7Dc1?M8>)*?!RBD4%Wdecq3eArs%Q&H>Vf7G
zG_W~XsTWy$yyOpp;}{*~fTb{WA#kucSg9{V{%#w&BiMKADHX}$iwgAnD0kUL>3*nt
z^kg5%vLNLLeB|$ib`aWLXa}?GHU%VT!_Z35_VEZNat~$rwEC at 79BQFNL{Gs^u)|Tz
zDH*X+dN{){0h~)$TF5-0ou{uvF(rQP9?38}<wty!7(DbHjj|`2?`Vd-LxHP4G7ll!
zRhgMd98;J~`7!A6?`Mz7=ph+Z*yofVLXL6d7=d<NX6HzpP;fJxFHWGgQRpXSbeEh|
zn4SVL#2te+CbJlcQwsA^ehP7;&`rzeH#x1a5em#eHv!#@%(h9KRq%@Pv(Qa~lhErN
ze=j1kq~|jHb&R8qdDJnbou}vdOX274g$z35=fwroGkxeUM=>GQU(WCwxrThRhrZXM
zcp>7V!tZ1eIp<K at l8lKZmlS>@%g`=ByDT#gi7N`fi+RLfL3|n7RT&dZt}6Tvz)NeW
zYZ3Z2nMFv9D}45G#9e}RUB+aS>k6Owb;MnP?z+qpB;HVGegnEy=x)lGc5)8=-pug1
tuORNN*@_1K-Qk0?(!nhk>J>M9SOXhA-F`c5Zk$Dd`3;1PBg99pe*v}NJ%#`P
diff --git a/llvm/test/tools/llvm-cov/Inputs/mcdc-const.o b/llvm/test/tools/llvm-cov/Inputs/mcdc-const.o
index bc38b71b5de072cedeb2172d160d6705d4855c47..a204a1095745fb232d19b23a9ea30688bfbbfdd5 100644
GIT binary patch
delta 342
zcmXAhu}{Kq5QXo41)?S`#e#x_h?8IxT1x|EanMBm1Xh768W7NGa3VV42HxUGA_JRN
zG;tCKcO6+xoE%Kp9Bp;^?&ZD9H;&!KJ258n*2*)6+W^r0%)H&$cW`l-eawB;5IGF^
zB7`iH3V{na;6d<#1YsZeAs~Z?b2BGJAOs8Y(u^CJlcr%2qB8JQWg%*_vD<b6BZIrl
zM`LBvtRH8S$-RBEd{RghYt>|>a{7<8`cdt`D4Gd-jH-%J)ReTkt7s*;peZ|suIMFA
z&Zw%crsVasUefI$6?g2zZ|;g=e|YY>_24}zd<%cbve_X;*v3Ac32D40OBi8~8r~KT
zXyP4VkSs}}S8)}eXd<@og&MvQ=Kk8P*$1prmzyV1in2`?eXu#|aU$iVAl1E7)RZ#V
Ov|l$Inay`n{L8=NVqaAN
delta 236
zcmWlQF-yZ>7=-VAzc!FyQ)5ygidZM3QwO2Jp*m^1>FVSnIN8-L;82K at dViqQ#Z9HS
z8YiJH;#S=RCl~t@{BpzH19$hZF-@)#oz6XOK1)0RaQ&0M-`c#pINN^e{`N&w8Z?@2
z0Tme3;0Fk?93VoY1(>Rqw1OB*tu?0#Ey=|ynzm(MV-EDoj;wfM^6_5fMrAbqbnYEF
zVqVK+NY~FKW$y3Gh#!7icInm&>2gxf<bb{TLSH<3K}U|+3o<$7Bq(&|@p9o+VjhNV
c{WJX5MGnJ6XNGTKN1Ak_o$_t{oO!hV4~J4bW&i*H
diff --git a/llvm/test/tools/llvm-cov/Inputs/mcdc-macro.o b/llvm/test/tools/llvm-cov/Inputs/mcdc-macro.o
index 5b3934816bd222383c5e63188c29bf390a1f19fa..bda7b179db43f8eb409811aadefcd1bd7b9b6b25 100644
GIT binary patch
delta 687
zcmZ9IO=uHQ5XawaOo;6!>?WJO-CH7xtzwhSCM2t1P$=!egMtSI!F*~WTUvB2o}$H%
zDio;<lzI{3MO%8XS<#D71rhaRJ>?>}cu>%bAnHM=Z#TP8IxqwO`TgI_d+&C(mt7d<
zWZ~Yvwy3D at CN_hF#n{c?X8Vb-_Oc9?!nFYQ;Pt>!Q1MM*H=MA(2R;G54hq-{woWF8
zo2EH^>0mm2zGXHqS4V48lWD`4>6Zi37pE>XYUU_|Nlk6k@@hdlr{?RKYF at 20bXBkC
zGeu3)wOl4!(Caz_xe*)-9fB2{4M}jvS`2kLaRr=v5%Pg$jBuoDo!&VP(8kUHRpwko
zSeuXt%N?Gc#|=i8w$U at 5e&C#iN2m@`c<$C0jvwA)WsoY)A}5 at g0ha$Z`_Xgh7YDKM
zH{R$=@&jM7vwuD1Q_0u(lkEz-Rl*cc#r at v1e5ZjbPqEC0;h5_>g|j?W&Tezfd-G;+
zji)e&VuZp1+RS<1b2>keVCmm_+3_gPw#<obq3`iX<STTok?0?QyO<Kj;Ul($0!Ie$
zq0q+iP#C`@c+80gB+*X9 at u_IwXW8q<Rw3hdf5i+aqAkVIjIY9DOi3k}aEU1yaGa5K
z=wT;Of->t~g(g;p*12#LchOrgiOaMAi)hmlEMZD6am6TB<->3dJ8}uGpe^tH53RAb
AUH||9
delta 612
zcmZ9JKS&!<9LL}9r8yGy%;nGda<oGV9g35eMMdyX5S_Yo=};&-6bc<oap}-&#Rv`(
zlrQ3_4h~(4$t`g(QVJ!~p#};~2eDHt?Gy`DK}dghJt5 at 5@AuyKeLuhVx0zqbuicmR
z#QLCX=Io=Hc2sbiTK=0TF7n{b5e~^Le|kV(PR<btEJY?ce~jEC;r))B5bB13X7t%D
zzYZJP7?sh`GPLIX&?+)nCVyUtV~&)NV&8ikpC(#Ht4CR-z!E$ygw7GH!98%dS6N$K
z?&DDJ`nB{9i at l0!LH^+L^ciKY`r1(y;qi6*e>)A_UmdQ$V=>f!knB at dyUWdlI*y4x
zMTsEaMuEwEc&(e0KM%=K>@fK-AfKSY<kK#4H6&kwbVVi1a^8fkD{DI>{Z}wKZce`E
zGuA=JI;jq~fpz^S?Rzi#FNnrbFs7s5d=&4a3SW#naxac^!<BUnFOsf2)^N^UlU1rF
zziY^+U3sRVlCIGs6f%yyWRY?Ck8SgiR?spXGGGt9#(Xk{>OhsMjHOXj3uNI+4bvp-
atV1&>WF2{?qmmt`A+)j%=2J0 at Sh;_1qnm92
diff --git a/llvm/test/tools/llvm-cov/mcdc-const.test b/llvm/test/tools/llvm-cov/mcdc-const.test
index 5424625cf6a6b5..c97b5d4f725587 100644
--- a/llvm/test/tools/llvm-cov/mcdc-const.test
+++ b/llvm/test/tools/llvm-cov/mcdc-const.test
@@ -28,7 +28,7 @@
// CHECKGENERALCASE-NEXT: | C1-Pair: covered: (1,2)
// CHECKGENERALCASE-NEXT: | C2-Pair: constant folded
// CHECKGENERALCASE-NEXT: | C3-Pair: constant folded
-// CHECKGENERALCASE-NEXT: | C4-Pair: not covered
+// CHECKGENERALCASE-NEXT: | C4-Pair: unreachable
// CHECKGENERALCASE-NEXT: | C5-Pair: constant folded
// CHECKGENERALCASE-NEXT: | MC/DC Coverage for Decision: 50.00%
// CHECKGENERALCASE-NEXT: |
@@ -40,11 +40,11 @@
// CHECKFULLCASE: | 1 { C, - = F }
// CHECKFULLCASE: | C1-Pair: constant folded
-// CHECKFULLCASE-NEXT: | C2-Pair: not covered
+// CHECKFULLCASE-NEXT: | C2-Pair: unreachable
// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%
// CHECKFULLCASE: | 1 { F, C = F }
// CHECKFULLCASE-NEXT: | 2 { T, C = F }
-// CHECKFULLCASE: | C1-Pair: not covered
+// CHECKFULLCASE: | C1-Pair: uncoverable
// CHECKFULLCASE-NEXT: | C2-Pair: constant folded
// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%
// CHECKFULLCASE: | 1 { C, F = F }
@@ -59,11 +59,11 @@
// CHECKFULLCASE: | MC/DC Coverage for Decision: 100.00%
// CHECKFULLCASE: | 1 { C, - = T }
// CHECKFULLCASE: | C1-Pair: constant folded
-// CHECKFULLCASE-NEXT: | C2-Pair: not covered
+// CHECKFULLCASE-NEXT: | C2-Pair: unreachable
// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%
// CHECKFULLCASE: | 1 { F, C = T }
// CHECKFULLCASE-NEXT: | 2 { T, C = T }
-// CHECKFULLCASE: | C1-Pair: not covered
+// CHECKFULLCASE: | C1-Pair: uncoverable
// CHECKFULLCASE-NEXT: | C2-Pair: constant folded
// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%
// CHECKFULLCASE: | 1 { C, F = F }
@@ -78,14 +78,14 @@
// CHECKFULLCASE: | MC/DC Coverage for Decision: 100.00%
// CHECKFULLCASE: | 1 { C, -, - = F }
// CHECKFULLCASE: | C1-Pair: constant folded
-// CHECKFULLCASE-NEXT: | C2-Pair: not covered
-// CHECKFULLCASE-NEXT: | C3-Pair: not covered
+// CHECKFULLCASE-NEXT: | C2-Pair: unreachable
+// CHECKFULLCASE-NEXT: | C3-Pair: unreachable
// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%
// CHECKFULLCASE: | 1 { F, C, - = F }
// CHECKFULLCASE-NEXT: | 2 { T, C, - = F }
-// CHECKFULLCASE: | C1-Pair: not covered
+// CHECKFULLCASE: | C1-Pair: uncoverable
// CHECKFULLCASE-NEXT: | C2-Pair: constant folded
-// CHECKFULLCASE-NEXT: | C3-Pair: not covered
+// CHECKFULLCASE-NEXT: | C3-Pair: unreachable
// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%
// CHECKFULLCASE: | 1 { C, F, - = F }
// CHECKFULLCASE-NEXT: | 2 { C, T, F = F }
@@ -103,14 +103,14 @@
// CHECKFULLCASE: | MC/DC Coverage for Decision: 100.00%
// CHECKFULLCASE: | 1 { C, -, - = T }
// CHECKFULLCASE: | C1-Pair: constant folded
-// CHECKFULLCASE-NEXT: | C2-Pair: not covered
-// CHECKFULLCASE-NEXT: | C3-Pair: not covered
+// CHECKFULLCASE-NEXT: | C2-Pair: unreachable
+// CHECKFULLCASE-NEXT: | C3-Pair: unreachable
// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%
// CHECKFULLCASE: | 1 { F, C, - = T }
// CHECKFULLCASE-NEXT: | 2 { T, C, - = T }
-// CHECKFULLCASE: | C1-Pair: not covered
+// CHECKFULLCASE: | C1-Pair: uncoverable
// CHECKFULLCASE-NEXT: | C2-Pair: constant folded
-// CHECKFULLCASE-NEXT: | C3-Pair: not covered
+// CHECKFULLCASE-NEXT: | C3-Pair: unreachable
// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%
// CHECKFULLCASE: | 1 { C, F, T = T }
// CHECKFULLCASE-NEXT: | 2 { C, T, - = T }
@@ -127,15 +127,15 @@
// CHECKFULLCASE: | 1 { F, -, C = F }
// CHECKFULLCASE-NEXT: | 2 { T, F, C = F }
// CHECKFULLCASE-NEXT: | 3 { T, T, C = F }
-// CHECKFULLCASE: | C1-Pair: not covered
-// CHECKFULLCASE-NEXT: | C2-Pair: not covered
+// CHECKFULLCASE: | C1-Pair: uncoverable
+// CHECKFULLCASE-NEXT: | C2-Pair: uncoverable
// CHECKFULLCASE-NEXT: | C3-Pair: constant folded
// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%
// CHECKFULLCASE: | 1 { F, C, - = F }
// CHECKFULLCASE-NEXT: | 2 { T, C, - = F }
-// CHECKFULLCASE: | C1-Pair: not covered
+// CHECKFULLCASE: | C1-Pair: uncoverable
// CHECKFULLCASE-NEXT: | C2-Pair: constant folded
-// CHECKFULLCASE-NEXT: | C3-Pair: not covered
+// CHECKFULLCASE-NEXT: | C3-Pair: unreachable
// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%
// CHECKFULLCASE: | 1 { F, -, C = F }
// CHECKFULLCASE-NEXT: | 2 { T, F, C = F }
@@ -153,15 +153,15 @@
// CHECKFULLCASE: | MC/DC Coverage for Decision: 100.00%
// CHECKFULLCASE: | 1 { F, T, C = T }
// CHECKFULLCASE-NEXT: | 2 { T, -, C = T }
-// CHECKFULLCASE: | C1-Pair: not covered
-// CHECKFULLCASE-NEXT: | C2-Pair: not covered
+// CHECKFULLCASE: | C1-Pair: uncoverable
+// CHECKFULLCASE-NEXT: | C2-Pair: uncoverable
// CHECKFULLCASE-NEXT: | C3-Pair: constant folded
// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%
// CHECKFULLCASE: | 1 { F, C, - = T }
// CHECKFULLCASE-NEXT: | 2 { T, C, - = T }
-// CHECKFULLCASE: | C1-Pair: not covered
+// CHECKFULLCASE: | C1-Pair: uncoverable
// CHECKFULLCASE-NEXT: | C2-Pair: constant folded
-// CHECKFULLCASE-NEXT: | C3-Pair: not covered
+// CHECKFULLCASE-NEXT: | C3-Pair: unreachable
// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%
// CHECKFULLCASE: | 1 { F, T, C = T }
// CHECKFULLCASE-NEXT: | 2 { T, -, C = T }
diff --git a/llvm/tools/llvm-cov/CoverageReport.cpp b/llvm/tools/llvm-cov/CoverageReport.cpp
index 00aea4039bfdeb..5091ac09d142c0 100644
--- a/llvm/tools/llvm-cov/CoverageReport.cpp
+++ b/llvm/tools/llvm-cov/CoverageReport.cpp
@@ -379,7 +379,9 @@ void CoverageReport::render(const FunctionCoverageSummary &Function,
(unsigned)(Function.MCDCCoverage.getNumPairs() -
Function.MCDCCoverage.getCoveredPairs()));
Options.colored_ostream(
- OS, determineCoveragePercentageColor(Function.MCDCCoverage))
+ OS, Function.MCDCCoverage.getNumPairs() == 0
+ ? raw_ostream::GREEN
+ : determineCoveragePercentageColor(Function.MCDCCoverage))
<< format("%*.2f", FunctionReportColumns[12] - 1,
Function.MCDCCoverage.getPercentCovered())
<< '%';
diff --git a/llvm/tools/llvm-cov/CoverageSummaryInfo.cpp b/llvm/tools/llvm-cov/CoverageSummaryInfo.cpp
index 4f150020ee3815..c68167d461ce2c 100644
--- a/llvm/tools/llvm-cov/CoverageSummaryInfo.cpp
+++ b/llvm/tools/llvm-cov/CoverageSummaryInfo.cpp
@@ -50,7 +50,7 @@ sumMCDCPairs(const ArrayRef<MCDCRecord> &Records) {
for (const auto &Record : Records) {
const auto NumConditions = Record.getNumConditions();
for (unsigned C = 0; C < NumConditions; C++) {
- if (!Record.isCondFolded(C))
+ if (!Record.isCondConstant(C))
++NumPairs;
if (Record.isConditionIndependencePairCovered(C))
++CoveredPairs;
diff --git a/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp b/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp
index 6f4d327679d6b6..3724d25d16bf0a 100644
--- a/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp
+++ b/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp
@@ -1200,7 +1200,12 @@ void SourceCoverageViewHTML::renderMCDCView(raw_ostream &OS, MCDCView &MRV,
for (unsigned i = 0; i < Record.getNumConditions(); i++)
OS << Record.getConditionCoverageString(i);
OS << " MC/DC Coverage for Expression: ";
- OS << format("%0.2f", Record.getPercentCovered()) << "%\n";
+ const auto [Coverable, Percent] = Record.getPercentCovered();
+ if (Coverable) {
+ OS << format("%0.2f", Percent) << "%\n";
+ } else {
+ OS << "Folded\n";
+ }
OS << EndPre;
OS << EndExpansionDiv;
}
diff --git a/llvm/tools/llvm-cov/SourceCoverageViewText.cpp b/llvm/tools/llvm-cov/SourceCoverageViewText.cpp
index cab60c2d9034ed..42a5da44f3eaf3 100644
--- a/llvm/tools/llvm-cov/SourceCoverageViewText.cpp
+++ b/llvm/tools/llvm-cov/SourceCoverageViewText.cpp
@@ -379,10 +379,16 @@ void SourceCoverageViewText::renderMCDCView(raw_ostream &OS, MCDCView &MRV,
}
renderLinePrefix(OS, ViewDepth);
OS << " MC/DC Coverage for Decision: ";
- colored_ostream(OS, raw_ostream::RED,
- getOptions().Colors && Record.getPercentCovered() < 100.0,
- /*Bold=*/false, /*BG=*/true)
- << format("%0.2f", Record.getPercentCovered()) << "%";
+ const auto [Coverable, Percent] = Record.getPercentCovered();
+ if (Coverable) {
+ colored_ostream(OS, raw_ostream::RED,
+ getOptions().Colors && Percent < 100.0,
+ /*Bold=*/false, /*BG=*/true)
+ << format("%0.2f", Percent) << "%";
+ } else {
+ OS << "Folded";
+ }
+
OS << "\n";
renderLinePrefix(OS, ViewDepth);
OS << "\n";
>From ab9d9b65bdda5e5a00958a430566f49ecf6173e3 Mon Sep 17 00:00:00 2001
From: Lambdaris <Lambdaris at outlook.com>
Date: Sat, 13 Jul 2024 14:20:53 +0800
Subject: [PATCH 3/4] [coverage] add option to exclude special conditions from
MC/DC report
---
llvm/docs/CommandGuide/llvm-cov.rst | 12 ++++
.../ProfileData/Coverage/CoverageMapping.h | 13 ++--
.../tools/llvm-cov/Inputs/mcdc-exclude.cpp | 25 ++++++++
.../test/tools/llvm-cov/Inputs/mcdc-exclude.o | Bin 0 -> 4400 bytes
.../llvm-cov/Inputs/mcdc-exclude.proftext | 34 +++++++++++
llvm/test/tools/llvm-cov/mcdc-exclude.test | 56 ++++++++++++++++++
llvm/tools/llvm-cov/CodeCoverage.cpp | 24 ++++++++
llvm/tools/llvm-cov/CoverageReport.cpp | 6 +-
llvm/tools/llvm-cov/CoverageSummaryInfo.cpp | 13 ++--
llvm/tools/llvm-cov/CoverageSummaryInfo.h | 4 +-
llvm/tools/llvm-cov/CoverageViewOptions.h | 1 +
llvm/tools/llvm-cov/SourceCoverageView.h | 10 ++--
.../tools/llvm-cov/SourceCoverageViewHTML.cpp | 3 +-
.../tools/llvm-cov/SourceCoverageViewText.cpp | 3 +-
14 files changed, 183 insertions(+), 21 deletions(-)
create mode 100644 llvm/test/tools/llvm-cov/Inputs/mcdc-exclude.cpp
create mode 100644 llvm/test/tools/llvm-cov/Inputs/mcdc-exclude.o
create mode 100644 llvm/test/tools/llvm-cov/Inputs/mcdc-exclude.proftext
create mode 100644 llvm/test/tools/llvm-cov/mcdc-exclude.test
diff --git a/llvm/docs/CommandGuide/llvm-cov.rst b/llvm/docs/CommandGuide/llvm-cov.rst
index 968f3c452f5584..26b881fc6a4aed 100644
--- a/llvm/docs/CommandGuide/llvm-cov.rst
+++ b/llvm/docs/CommandGuide/llvm-cov.rst
@@ -227,6 +227,12 @@ OPTIONS
Show modified condition/decision coverage (MC/DC) for each applicable boolean
expression.
+.. option:: -mcdc-exclude
+
+ Set which special states of conditions should be excluded from coverage (MC/DC). Possible
+ values are: "none", "uncoverable", "constant", "unreachable", separated by comma. Default
+ to "constant".
+
.. option:: -show-line-counts
Show the execution counts for each line. Defaults to true, unless another
@@ -435,6 +441,12 @@ OPTIONS
Show MC/DC statistics. Defaults to false.
+.. option:: -mcdc-exclude-uncoverable
+
+ MC/DC does not count uncoverable conditions. Default to false.
+ Uncoverable conditions are conditions that may be evaluated but can not affect
+ the outcome of decisions due to constants.
+
.. option:: -show-functions
Show coverage summaries for each function. Defaults to false.
diff --git a/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h b/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h
index e3a04d169364ce..74f03d75ea8a84 100644
--- a/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h
+++ b/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h
@@ -385,10 +385,10 @@ struct MCDCRecord {
enum CondState { MCDC_DontCare = -1, MCDC_False = 0, MCDC_True = 1 };
enum CondResult {
- MCDC_Normal,
- MCDC_Constant,
- MCDC_Uncoverable,
- MCDC_Unreachable
+ MCDC_Normal = 0x1,
+ MCDC_Constant = 0x2,
+ MCDC_Uncoverable = 0x4,
+ MCDC_Unreachable = 0x8
};
/// Emulate SmallVector<CondState> with a pair of BitVector.
@@ -520,11 +520,12 @@ struct MCDCRecord {
/// Return if the decision is coverable and percent of covered conditions.
/// Only coverable conditions are counted as denominator.
- std::pair<bool, float> getPercentCovered() const {
+ std::pair<bool, float> getPercentCovered(int32_t CountedStates) const {
unsigned Excluded = 0;
unsigned Covered = 0;
+ auto ExcludedStates = ~CountedStates;
for (unsigned C = 0; C < getNumConditions(); C++) {
- if (isCondConstant(C))
+ if (getCondResult(C) & ExcludedStates)
Excluded++;
else if (isConditionIndependencePairCovered(C))
Covered++;
diff --git a/llvm/test/tools/llvm-cov/Inputs/mcdc-exclude.cpp b/llvm/test/tools/llvm-cov/Inputs/mcdc-exclude.cpp
new file mode 100644
index 00000000000000..ebf4d5e1200d4a
--- /dev/null
+++ b/llvm/test/tools/llvm-cov/Inputs/mcdc-exclude.cpp
@@ -0,0 +1,25 @@
+#include <stdio.h>
+
+
+
+
+
+
+
+
+void test(bool a,bool b, bool c, bool d) {
+
+ if (a && (b || true || c) && ( true || d) && true)
+ printf("test 1 decision true\n");
+
+}
+
+int main()
+{
+ test(true,false,true,false);
+ test(true,false,true,true);
+ test(true,true,false,false);
+ test(false,true,true,false);
+ test(true,false,false,false);
+ return 0;
+}
diff --git a/llvm/test/tools/llvm-cov/Inputs/mcdc-exclude.o b/llvm/test/tools/llvm-cov/Inputs/mcdc-exclude.o
new file mode 100644
index 0000000000000000000000000000000000000000..ef0cab25965fe624626d1a3068b8efba4a9b2d8e
GIT binary patch
literal 4400
zcmcgvO>7%g5T5nMKS`U!Nt>#FksL&;q%<45jek-V<fci8L<9xFp%mme>vbB4e`K$t
z!lg!{LaJ0KNSs09hJ;kkKxx%e#EDA4flDPMD7T_k6 at MbkJkQwA8(SPIG1BhLd~e>&
zy!YnK+85`S7JP<b0+Rtxfgy^<@AbBnv=Y-Wik6F8e$p;&xo27YJdl3-VXarR;Qhgp
zGRY5aY~~05x_N)_qSCJ!x9^0M)Us%eE?#+({QgR>dcS(#I>SD{rUYXTW4B|QcWI=f
zeq9-f3D0Ct-U+cAXK#@sq|2M%6t=Ga^T8J=zyILmdq1W6V0QGYR~DnIhG7JZk&&^n
zL;FUDCMG8L8+}LozOZ2cjsziOKoAbn>nOeA<3mAW(Gj1~11N<?U?&_LfqodE*Pdu#
ztj7$HItIh2_Cdh(le7=^!-43)s2>jnr6GvG(II#Y4o8Q<^aV+pfFtlkbkAha2PE}E
z3<LE8Y9#p~VO*-$>mk44heIks`189fza(-W{z%8T7ayY5x^M-<202qS!aRW7Hw+Li
z*g1RBxnQr?a*kz}%RK&nFgXu7i~owbQ!{85HDa=US-WP|QS{z{Fl1hycAcubf at Bo3
zYeiBbu}IFb*Q#r!V#KY~8~}SgTU?E7I2DD(W~`_cU0rh{<L6zsTs<*0h06Kbie;Ay
zQ|s#+jn`zkQhLp?U5hN^)6>aZG8UUj<eU{Jg+ex!w~x;pv$L^$JQq*q<4OB?GBKg@
z-p$z?Z at vJ=g|Km8XE1aXlMf?)kjK`U)7qmfze at bnK-hO~AVeaqmo6jmAU;HW4Tfb4
zSf&62tdnmdEDhL&kK{m at m)=F72Y%b~;-s6ZVB1IDLe+phO;Bo)025TI%`t^h!k{%L
zZPaY8pat$#_B&dDCYfrb8o;8dR^N_Oe*hS42U#=K?zazZDs`wGY}(UKZYNXiZYNyd
zmBx4k*EOu|r=0mSI4tL-d- at g?vKKp54~S9CjQLbsR^~sbccU)Gu=xlbVnOa0^$t3n
zzqcABwIcZAY%et__({eOGZ$QHD$xZ`YdG~OiMy!bln=IEMK3ZJ|AL>>a9WG_S!SH<
z=+p$yGfsZ=xMdBeyCU{=#>o$zgWy-Y;GcBCKV at 9<7eCiDT+iob7eAB(5%mJvA6*xm
z{79eF$7x-<F7|Yr#6ChG66Hyc&@>BzOWp0--4h7)?&u#FgiOXRZB!gPGdDXEPfQ<A
z%qLTGbMb{!wbszgv4#2B`GtkV-09iVGbtRhD$aV=a-9n<P*W{9MHk97w~BM9zh=sn
ze8w)e>nm&RdNEsYs$eZu-3nN%l~Sz?+dg^h4pS^-%i<ihe65HYHt_sPAw%B<*6fC2
z6-%yTJ^k!UlT|lszYdm4Dx1sU2V#|zcg|<>6-=S!NBh<^-RYQxnY!5(u&Qqq6sJwl
z7M#nvS#(|^PPQ>CCI|6|9DmzjAKp%vshE(KRex>B^!BJg_nk1RF`d$^H2P#~MDD2|
zNfZc63&1?h4zF=Q>N8YpoK~|w-$ATX7Y=bCv8Va;ZIk%IKSNA~@I_E+QJCXOzmyU2
zCwjN|;STYs2TEMw-QwTn_|lgpo;UtSIM6VSh>7B1zO3VIXlwrj?w0 at F4*AnpMDiBC
zj2Oi?IUb6NQmlJxi<c#4&@Fz114w_O^9$l5afP2jtW*3n$6v;AoxJ;Z3MY4(|1r-`
z>yuIT&OeEhRW6?O-=k!aq7A0L!_;qOzVz2_>yPpR#h%trzu#ot!j}>2l>Z%1K4_+h
zY<21uKg9v`{iolJ5?6S){g?QXzr^(F-S+?PBkq5M1L^xu_g~`6{+AJ>J at G*V-z^&F
z!u9@=^X}jC2oQFxHC0I`c)s_Soy-?Li`FDdp5o>?o?j4vxy%#(J>nwkreAt5o at c(;
z{?V9U_Lj>Hp1&xD%w_)set-hiLRtXkXFBZvJ{*(zvj0CLW-e`&kk#>NQk at OuKMU1A
Zk$0`r2zYZRyG1V0-+2PDFh1V+{{mb$xK{uG
literal 0
HcmV?d00001
diff --git a/llvm/test/tools/llvm-cov/Inputs/mcdc-exclude.proftext b/llvm/test/tools/llvm-cov/Inputs/mcdc-exclude.proftext
new file mode 100644
index 00000000000000..e1f88453360cf5
--- /dev/null
+++ b/llvm/test/tools/llvm-cov/Inputs/mcdc-exclude.proftext
@@ -0,0 +1,34 @@
+_Z4testbbbb
+# Func Hash:
+2877299778974865
+# Num Counters:
+12
+# Counter Values:
+5
+4
+4
+4
+4
+4
+0
+0
+3
+0
+0
+0
+# Num Bitmap Bytes:
+$3
+# Bitmap Byte Values:
+0xc0
+0x80
+0x0
+
+
+main
+# Func Hash:
+24
+# Num Counters:
+1
+# Counter Values:
+1
+
diff --git a/llvm/test/tools/llvm-cov/mcdc-exclude.test b/llvm/test/tools/llvm-cov/mcdc-exclude.test
new file mode 100644
index 00000000000000..11161cbda18647
--- /dev/null
+++ b/llvm/test/tools/llvm-cov/mcdc-exclude.test
@@ -0,0 +1,56 @@
+// Test visualization of MC/DC constructs for constant-folded condition masking with different counted states.
+
+// RUN: llvm-profdata merge %S/Inputs/mcdc-exclude.proftext -o %t.profdata
+// RUN: llvm-cov show --show-mcdc %S/Inputs/mcdc-exclude.o -instr-profile %t.profdata -path-equivalence=.,%S/Inputs | FileCheck %s -check-prefix=DEFAULTCASE
+// RUN: llvm-cov report --show-mcdc-summary %S/Inputs/mcdc-exclude.o -instr-profile %t.profdata -show-functions -path-equivalence=.,%S/Inputs %S/Inputs/mcdc-exclude.cpp | FileCheck %s -check-prefix=REPORTDEFAULT
+
+// DEFAULTCASE: | MC/DC Coverage for Decision: 25.00%
+
+// REPORTDEFAULT: TOTAL {{.*}} 4 3 25.00%
+
+// RUN: llvm-cov show --show-mcdc --mcdc-exclude=uncoverable %S/Inputs/mcdc-exclude.o -instr-profile %t.profdata -path-equivalence=.,%S/Inputs | FileCheck %s -check-prefix=EXCLUDEUNCOVERABECASE
+// RUN: llvm-cov report --show-mcdc-summary --mcdc-exclude=uncoverable %S/Inputs/mcdc-exclude.o -instr-profile %t.profdata -show-functions -path-equivalence=.,%S/Inputs %S/Inputs/mcdc-exclude.cpp | FileCheck %s -check-prefix=REPORTEXCLUDEUNCOVERABLE
+
+// EXCLUDEUNCOVERABECASE: | MC/DC Coverage for Decision: 16.67%
+
+// REPORTEXCLUDEUNCOVERABLE: TOTAL {{.*}} 6 5 16.67%
+
+// RUN: llvm-cov show --show-mcdc --mcdc-exclude=constant %S/Inputs/mcdc-exclude.o -instr-profile %t.profdata -path-equivalence=.,%S/Inputs | FileCheck %s -check-prefix=EXCLUDECONSTANTCASE
+// RUN: llvm-cov report --show-mcdc-summary --mcdc-exclude=constant %S/Inputs/mcdc-exclude.o -instr-profile %t.profdata -show-functions -path-equivalence=.,%S/Inputs %S/Inputs/mcdc-exclude.cpp | FileCheck %s -check-prefix=REPORTEXCLUDECONSTANT
+
+// EXCLUDECONSTANTCASE: | MC/DC Coverage for Decision: 25.00%
+
+// REPORTEXCLUDECONSTANT: TOTAL {{.*}} 4 3 25.00%
+
+// RUN: llvm-cov show --show-mcdc --mcdc-exclude=unreachable %S/Inputs/mcdc-exclude.o -instr-profile %t.profdata -path-equivalence=.,%S/Inputs | FileCheck %s -check-prefix=EXCLUDEUNREACHABLECASE
+// RUN: llvm-cov report --show-mcdc-summary --mcdc-exclude=unreachable %S/Inputs/mcdc-exclude.o -instr-profile %t.profdata -show-functions -path-equivalence=.,%S/Inputs %S/Inputs/mcdc-exclude.cpp | FileCheck %s -check-prefix=REPORTEXCLUDEUNREACHABLE
+
+// EXCLUDEUNREACHABLECASE: | MC/DC Coverage for Decision: 20.00%
+
+// REPORTEXCLUDEUNREACHABLE: TOTAL {{.*}} 5 4 20.00%
+
+// RUN: llvm-cov show --show-mcdc --mcdc-exclude=none %S/Inputs/mcdc-exclude.o -instr-profile %t.profdata -path-equivalence=.,%S/Inputs | FileCheck %s -check-prefix=INCLUDEALLCASE
+// RUN: llvm-cov report --show-mcdc-summary --mcdc-exclude=none %S/Inputs/mcdc-exclude.o -instr-profile %t.profdata -show-functions -path-equivalence=.,%S/Inputs %S/Inputs/mcdc-exclude.cpp | FileCheck %s -check-prefix=REPORTALL
+
+// INCLUDEALLCASE: | MC/DC Coverage for Decision: 14.29%
+
+// REPORTALL: TOTAL {{.*}} 7 6 14.29%
+Instructions for regenerating the test:
+
+cd %S/Inputs # Or copy files into the working directory
+
+clang++ -c -Os \
+ -fcoverage-compilation-dir=. -mllvm -enable-name-compression=false \
+ -fcoverage-mcdc -fprofile-instr-generate -fcoverage-mapping \
+ mcdc-exclude.cpp
+
+# Instructions for regenerating proftext
+
+for x in mcdc-exclude; do (
+ clang++ -fprofile-instr-generate $x.o -o $x
+ find -name '*.profraw' | xargs rm -f
+ export LLVM_PROFILE_FILE=$x-%p.profraw
+ ./$x 0 1
+ llvm-profdata merge --sparse -o $x.profdata $(find -name '*.profraw')
+ llvm-profdata merge --text -o $x.proftext $x.profdata
+); done
diff --git a/llvm/tools/llvm-cov/CodeCoverage.cpp b/llvm/tools/llvm-cov/CodeCoverage.cpp
index d06fd86fe52afb..bdce4276388748 100644
--- a/llvm/tools/llvm-cov/CodeCoverage.cpp
+++ b/llvm/tools/llvm-cov/CodeCoverage.cpp
@@ -773,6 +773,12 @@ int CodeCoverageTool::run(Command Cmd, int argc, const char **argv) {
cl::desc("Show MCDC statistics in summary table"),
cl::init(false));
+ cl::list<std::string> MCDCExcludeStates(
+ "mcdc-exclude", cl::Optional,
+ cl::desc(
+ "Set which abnormal kinds of conditions are excluded from MC/DC"),
+ cl::CommaSeparated, cl::list_init<std::string>({"constant"}));
+
cl::opt<bool> InstantiationSummary(
"show-instantiation-summary", cl::Optional,
cl::desc("Show instantiation statistics in summary table"));
@@ -944,6 +950,24 @@ int CodeCoverageTool::run(Command Cmd, int argc, const char **argv) {
::exit(0);
}
+ ViewOpts.MCDCCountedStates =
+ MCDCRecord::MCDC_Normal | MCDCRecord::MCDC_Uncoverable |
+ MCDCRecord::MCDC_Constant | MCDCRecord::MCDC_Unreachable;
+ for (const auto &State : MCDCExcludeStates) {
+ if (State == "uncoverable") {
+ ViewOpts.MCDCCountedStates &= ~MCDCRecord::MCDC_Uncoverable;
+ } else if (State == "constant") {
+ ViewOpts.MCDCCountedStates &= ~MCDCRecord::MCDC_Constant;
+ } else if (State == "unreachable") {
+ ViewOpts.MCDCCountedStates &= ~MCDCRecord::MCDC_Unreachable;
+ } else if (State != "none") {
+ error("invalid argument '" + State +
+ "', must be in one of 'uncoverable, constant, unreachable'",
+ "--mcdc-exclude");
+ return 1;
+ }
+ }
+
ViewOpts.ShowMCDCSummary = MCDCSummary;
ViewOpts.ShowBranchSummary = BranchSummary;
ViewOpts.ShowRegionSummary = RegionSummary;
diff --git a/llvm/tools/llvm-cov/CoverageReport.cpp b/llvm/tools/llvm-cov/CoverageReport.cpp
index 5091ac09d142c0..0d45a59e97fbc5 100644
--- a/llvm/tools/llvm-cov/CoverageReport.cpp
+++ b/llvm/tools/llvm-cov/CoverageReport.cpp
@@ -428,7 +428,8 @@ void CoverageReport::renderFunctionReports(ArrayRef<std::string> Files,
OS << "\n";
FunctionCoverageSummary Totals("TOTAL");
for (const auto &F : Functions) {
- auto Function = FunctionCoverageSummary::get(Coverage, F);
+ auto Function =
+ FunctionCoverageSummary::get(Coverage, F, Options.MCDCCountedStates);
++Totals.ExecutionCount;
Totals.RegionCoverage += Function.RegionCoverage;
Totals.LineCoverage += Function.LineCoverage;
@@ -453,7 +454,8 @@ void CoverageReport::prepareSingleFileReport(const StringRef Filename,
for (const coverage::FunctionRecord *F : Group.getInstantiations()) {
if (!Filters->matches(*Coverage, *F))
continue;
- auto InstantiationSummary = FunctionCoverageSummary::get(*Coverage, *F);
+ auto InstantiationSummary = FunctionCoverageSummary::get(
+ *Coverage, *F, Options.MCDCCountedStates);
FileReport->addInstantiation(InstantiationSummary);
InstantiationSummaries.push_back(InstantiationSummary);
}
diff --git a/llvm/tools/llvm-cov/CoverageSummaryInfo.cpp b/llvm/tools/llvm-cov/CoverageSummaryInfo.cpp
index c68167d461ce2c..104d3ad5bc11f8 100644
--- a/llvm/tools/llvm-cov/CoverageSummaryInfo.cpp
+++ b/llvm/tools/llvm-cov/CoverageSummaryInfo.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "CoverageSummaryInfo.h"
+#include "llvm/ProfileData/Coverage/CoverageMapping.h"
using namespace llvm;
using namespace coverage;
@@ -44,13 +45,13 @@ static void sumBranchExpansions(size_t &NumBranches, size_t &CoveredBranches,
}
}
-static std::pair<size_t, size_t>
-sumMCDCPairs(const ArrayRef<MCDCRecord> &Records) {
+static std::tuple<size_t, size_t>
+sumMCDCPairs(const ArrayRef<MCDCRecord> &Records, const int32_t CountFlags) {
size_t NumPairs = 0, CoveredPairs = 0;
for (const auto &Record : Records) {
const auto NumConditions = Record.getNumConditions();
for (unsigned C = 0; C < NumConditions; C++) {
- if (!Record.isCondConstant(C))
+ if (Record.getCondResult(C) & CountFlags)
++NumPairs;
if (Record.isConditionIndependencePairCovered(C))
++CoveredPairs;
@@ -61,7 +62,8 @@ sumMCDCPairs(const ArrayRef<MCDCRecord> &Records) {
FunctionCoverageSummary
FunctionCoverageSummary::get(const CoverageMapping &CM,
- const coverage::FunctionRecord &Function) {
+ const coverage::FunctionRecord &Function,
+ const int32_t MCDCCountedFlags) {
// Compute the region coverage.
size_t NumCodeRegions = 0, CoveredRegions = 0;
for (auto &CR : Function.CountedRegions) {
@@ -89,7 +91,8 @@ FunctionCoverageSummary::get(const CoverageMapping &CM,
sumBranchExpansions(NumBranches, CoveredBranches, CM, CD.getExpansions());
size_t NumPairs = 0, CoveredPairs = 0;
- std::tie(NumPairs, CoveredPairs) = sumMCDCPairs(CD.getMCDCRecords());
+ std::tie(NumPairs, CoveredPairs) =
+ sumMCDCPairs(CD.getMCDCRecords(), MCDCCountedFlags);
return FunctionCoverageSummary(
Function.Name, Function.ExecutionCount,
diff --git a/llvm/tools/llvm-cov/CoverageSummaryInfo.h b/llvm/tools/llvm-cov/CoverageSummaryInfo.h
index 64c2c8406cf3eb..d4ca70948df9ea 100644
--- a/llvm/tools/llvm-cov/CoverageSummaryInfo.h
+++ b/llvm/tools/llvm-cov/CoverageSummaryInfo.h
@@ -16,6 +16,7 @@
#include "llvm/ProfileData/Coverage/CoverageMapping.h"
#include "llvm/Support/raw_ostream.h"
+#include <cstdint>
namespace llvm {
@@ -247,7 +248,8 @@ struct FunctionCoverageSummary {
/// Compute the code coverage summary for the given function coverage
/// mapping record.
static FunctionCoverageSummary get(const coverage::CoverageMapping &CM,
- const coverage::FunctionRecord &Function);
+ const coverage::FunctionRecord &Function,
+ int32_t MCDCCountedFlags = 0);
/// Compute the code coverage summary for an instantiation group \p Group,
/// given a list of summaries for each instantiation in \p Summaries.
diff --git a/llvm/tools/llvm-cov/CoverageViewOptions.h b/llvm/tools/llvm-cov/CoverageViewOptions.h
index 6925cffd8246d2..0282964ed449e1 100644
--- a/llvm/tools/llvm-cov/CoverageViewOptions.h
+++ b/llvm/tools/llvm-cov/CoverageViewOptions.h
@@ -45,6 +45,7 @@ struct CoverageViewOptions {
bool SkipExpansions;
bool SkipFunctions;
bool SkipBranches;
+ int32_t MCDCCountedStates;
OutputFormat Format;
BranchOutputType ShowBranches;
std::string ShowOutputDirectory;
diff --git a/llvm/tools/llvm-cov/SourceCoverageView.h b/llvm/tools/llvm-cov/SourceCoverageView.h
index 2b1570d399dd0b..27ae7e9208bd3c 100644
--- a/llvm/tools/llvm-cov/SourceCoverageView.h
+++ b/llvm/tools/llvm-cov/SourceCoverageView.h
@@ -161,9 +161,6 @@ class SourceCoverageView {
/// A memory buffer backing the source on display.
const MemoryBuffer &File;
- /// Various options to guide the coverage renderer.
- const CoverageViewOptions &Options;
-
/// Complete coverage information about the source on display.
CoverageData CoverageInfo;
@@ -193,6 +190,9 @@ class SourceCoverageView {
using CoverageSegmentArray = ArrayRef<const CoverageSegment *>;
+ /// Various options to guide the coverage renderer.
+ const CoverageViewOptions &Options;
+
/// @name Rendering Interface
/// @{
@@ -275,8 +275,8 @@ class SourceCoverageView {
SourceCoverageView(StringRef SourceName, const MemoryBuffer &File,
const CoverageViewOptions &Options,
CoverageData &&CoverageInfo)
- : SourceName(SourceName), File(File), Options(Options),
- CoverageInfo(std::move(CoverageInfo)) {}
+ : SourceName(SourceName), File(File),
+ CoverageInfo(std::move(CoverageInfo)), Options(Options) {}
public:
static std::unique_ptr<SourceCoverageView>
diff --git a/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp b/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp
index 3724d25d16bf0a..f94339dfe74abf 100644
--- a/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp
+++ b/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp
@@ -1200,7 +1200,8 @@ void SourceCoverageViewHTML::renderMCDCView(raw_ostream &OS, MCDCView &MRV,
for (unsigned i = 0; i < Record.getNumConditions(); i++)
OS << Record.getConditionCoverageString(i);
OS << " MC/DC Coverage for Expression: ";
- const auto [Coverable, Percent] = Record.getPercentCovered();
+ const auto [Coverable, Percent] =
+ Record.getPercentCovered(Options.MCDCCountedStates);
if (Coverable) {
OS << format("%0.2f", Percent) << "%\n";
} else {
diff --git a/llvm/tools/llvm-cov/SourceCoverageViewText.cpp b/llvm/tools/llvm-cov/SourceCoverageViewText.cpp
index 42a5da44f3eaf3..c69b5c8bdd2a72 100644
--- a/llvm/tools/llvm-cov/SourceCoverageViewText.cpp
+++ b/llvm/tools/llvm-cov/SourceCoverageViewText.cpp
@@ -379,7 +379,8 @@ void SourceCoverageViewText::renderMCDCView(raw_ostream &OS, MCDCView &MRV,
}
renderLinePrefix(OS, ViewDepth);
OS << " MC/DC Coverage for Decision: ";
- const auto [Coverable, Percent] = Record.getPercentCovered();
+ const auto [Coverable, Percent] =
+ Record.getPercentCovered(Options.MCDCCountedStates);
if (Coverable) {
colored_ostream(OS, raw_ostream::RED,
getOptions().Colors && Percent < 100.0,
>From 9f5a7a5b06e0336f921826fd95cb2588a497827c Mon Sep 17 00:00:00 2001
From: Lambdaris <Lambdaris at outlook.com>
Date: Wed, 23 Oct 2024 20:38:32 +0800
Subject: [PATCH 4/4] [llvm-cov] Reproduce binary of branch-c-general
---
.../llvm-cov/Inputs/branch-c-general.o32l | Bin 176424 -> 176424 bytes
.../test/tools/llvm-cov/branch-c-general.test | 30 +++++++++---------
.../tools/llvm-cov/branch-noShowBranch.test | 24 +++++++-------
3 files changed, 27 insertions(+), 27 deletions(-)
diff --git a/llvm/test/tools/llvm-cov/Inputs/branch-c-general.o32l b/llvm/test/tools/llvm-cov/Inputs/branch-c-general.o32l
index 210b7fd8840c6371aa290cc358d88b426e370dfe..0b12df6737f6a687a25e9ceb3e8389778808ac5e 100755
GIT binary patch
delta 102
zcmZ4Sh-<|ou7)j)o6Vhl5_6MM5{oj6^>cE{a&-%e^0QKtOZ3t+OB525EK at 9#%uJI~
zQW8y5O%n|aEKMyEO^gjp&CJqFEK`%y%nZ$qQ;ny8G-r%z53pd|9$>+=r;PF0cHZ?&
G(o6t{<s$k3
delta 104
zcmZ4Sh-<|ou7)j)o6YTWa>{b`L4<BWQGQlxa*1AgW{HB4v6-1=nz at l-ih-$Fidm|O
zrI}%>k*T>+s)?~hs%f%enx$cKVv?cebU_xTFjfW-X!o^X-0o|^w7-n;;db8jOwvpM
DGddq~
diff --git a/llvm/test/tools/llvm-cov/branch-c-general.test b/llvm/test/tools/llvm-cov/branch-c-general.test
index 9b5889babde366..18985d1aa9604d 100644
--- a/llvm/test/tools/llvm-cov/branch-c-general.test
+++ b/llvm/test/tools/llvm-cov/branch-c-general.test
@@ -116,25 +116,25 @@
// REPORT: Name Regions Miss Cover Lines Miss Cover Branches Miss Cover
// REPORT-NEXT: ---
-// REPORT-NEXT: simple_loops 8 0 100.00% 9 0 100.00% 6 0 100.00%
-// REPORT-NEXT: conditionals 24 0 100.00% 15 0 100.00% 16 2 87.50%
-// REPORT-NEXT: early_exits 20 4 80.00% 25 2 92.00% 16 6 62.50%
-// REPORT-NEXT: jumps 39 12 69.23% 48 2 95.83% 26 9 65.38%
-// REPORT-NEXT: switches 28 5 82.14% 38 4 89.47% 30 9 70.00%
-// REPORT-NEXT: big_switch 25 1 96.00% 32 0 100.00% 30 6 80.00%
-// REPORT-NEXT: boolean_operators 16 0 100.00% 13 0 100.00% 22 2 90.91%
-// REPORT-NEXT: boolop_loops 19 0 100.00% 14 0 100.00% 16 2 87.50%
-// REPORT-NEXT: conditional_operator 4 2 50.00% 8 0 100.00% 4 2 50.00%
-// REPORT-NEXT: do_fallthrough 9 0 100.00% 12 0 100.00% 6 0 100.00%
+// REPORT-NEXT: simple_loops 8 0 100.00% 8 0 100.00% 6 0 100.00%
+// REPORT-NEXT: conditionals 24 0 100.00% 13 0 100.00% 16 2 87.50%
+// REPORT-NEXT: early_exits 20 4 80.00% 19 2 89.47% 16 6 62.50%
+// REPORT-NEXT: jumps 39 12 69.23% 38 3 92.11% 28 10 64.29%
+// REPORT-NEXT: switches 27 4 85.19% 30 2 93.33% 32 10 68.75%
+// REPORT-NEXT: big_switch 25 1 96.00% 26 0 100.00% 30 6 80.00%
+// REPORT-NEXT: boolean_operators 16 0 100.00% 9 0 100.00% 22 2 90.91%
+// REPORT-NEXT: boolop_loops 19 0 100.00% 9 0 100.00% 16 2 87.50%
+// REPORT-NEXT: conditional_operator 6 2 66.67% 5 0 100.00% 4 2 50.00%
+// REPORT-NEXT: do_fallthrough 9 0 100.00% 9 0 100.00% 6 0 100.00%
// REPORT-NEXT: main 1 0 100.00% 16 0 100.00% 0 0 0.00%
// REPORT-NEXT: c-general.c:static_func 4 0 100.00% 4 0 100.00% 2 0 100.00%
// REPORT-NEXT: ---
-// REPORT-NEXT: TOTAL 197 24 87.82% 234 8 96.58% 174 38 78.16%
+// REPORT-NEXT: TOTAL 198 23 88.38% 186 7 96.24% 178 40 77.53%
// Test file-level report.
// RUN: llvm-profdata merge %S/Inputs/branch-c-general.proftext -o %t.profdata
// RUN: llvm-cov report %S/Inputs/branch-c-general.o32l -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs %S/Inputs/branch-c-general.c | FileCheck %s -check-prefix=FILEREPORT
-// FILEREPORT: TOTAL{{.*}}174 38 78.16%
+// FILEREPORT: TOTAL{{.*}}178 40 77.53%
// Test color True/False output.
// RUN: llvm-cov show --use-color --show-branches=count %S/Inputs/branch-c-general.o32l -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs %S/Inputs/branch-c-general.c | FileCheck %s -check-prefix=USECOLOR
@@ -157,10 +157,10 @@
// HTML-INDEX: <td class='column-entry-green'>
// HTML-INDEX: 100.00% (12/12)
// HTML-INDEX: <td class='column-entry-yellow'>
-// HTML-INDEX: 96.58% (226/234)
+// HTML-INDEX: 96.24% (179/186)
// HTML-INDEX: <td class='column-entry-yellow'>
-// HTML-INDEX: 87.82% (173/197)
+// HTML-INDEX: 88.38% (175/198)
// HTML-INDEX: <td class='column-entry-red'>
-// HTML-INDEX: 78.16% (136/174)
+// HTML-INDEX: 77.53% (138/178)
// HTML-INDEX: <tr class='light-row-bold'>
// HTML-INDEX: Totals
diff --git a/llvm/test/tools/llvm-cov/branch-noShowBranch.test b/llvm/test/tools/llvm-cov/branch-noShowBranch.test
index 25a98d59481aa1..41511f1ee8e912 100644
--- a/llvm/test/tools/llvm-cov/branch-noShowBranch.test
+++ b/llvm/test/tools/llvm-cov/branch-noShowBranch.test
@@ -8,18 +8,18 @@
// REPORT: Name Regions Miss Cover Lines Miss Cover
// REPORT-NOT: Name Regions Miss Cover Lines Miss Cover Branches Miss Cover
// REPORT: ---
-// REPORT-NOT: simple_loops 8 0 100.00% 9 0 100.00% 6 0 100.00%
-// REPORT-NOT: conditionals 24 0 100.00% 15 0 100.00% 16 2 87.50%
-// REPORT-NOT: early_exits 20 4 80.00% 25 2 92.00% 16 6 62.50%
-// REPORT-NOT: jumps 39 12 69.23% 48 2 95.83% 26 9 65.38%
-// REPORT-NOT: switches 28 5 82.14% 38 4 89.47% 30 9 70.00%
-// REPORT-NOT: big_switch 25 1 96.00% 32 0 100.00% 30 6 80.00%
-// REPORT-NOT: boolean_operators 16 0 100.00% 13 0 100.00% 22 2 90.91%
-// REPORT-NOT: boolop_loops 19 0 100.00% 14 0 100.00% 16 2 87.50%
-// REPORT-NOT: conditional_operator 4 2 50.00% 8 0 100.00% 4 2 50.00%
-// REPORT-NOT: do_fallthrough 9 0 100.00% 12 0 100.00% 6 0 100.00%
+// REPORT-NOT: simple_loops 8 0 100.00% 8 0 100.00% 6 0 100.00%
+// REPORT-NOT: conditionals 24 0 100.00% 13 0 100.00% 16 2 87.50%
+// REPORT-NOT: early_exits 20 4 80.00% 19 2 89.47% 16 6 62.50%
+// REPORT-NOT: jumps 39 12 69.23% 38 3 92.11% 28 10 64.29%
+// REPORT-NOT: switches 27 4 85.19% 30 2 93.33% 32 10 68.75%
+// REPORT-NOT: big_switch 25 1 96.00% 26 0 100.00% 30 6 80.00%
+// REPORT-NOT: boolean_operators 16 0 100.00% 9 0 100.00% 22 2 90.91%
+// REPORT-NOT: boolop_loops 19 0 100.00% 9 0 100.00% 16 2 87.50%
+// REPORT-NOT: conditional_operator 6 2 66.67% 5 0 100.00% 4 2 50.00%
+// REPORT-NOT: do_fallthrough 9 0 100.00% 9 0 100.00% 6 0 100.00%
// REPORT-NOT: main 1 0 100.00% 16 0 100.00% 0 0 0.00%
// REPORT-NOT: c-general.c:static_func 4 0 100.00% 4 0 100.00% 2 0 100.00%
-// REPORT: TOTAL 197 24 87.82% 234 8 96.58%
-// REPORT-NOT: TOTAL 197 24 87.82% 234 13 94.44% 174 38 78.16%
+// REPORT: TOTAL 198 23 88.38% 186 7 96.24%
+// REPORT-NOT: TOTAL 198 23 88.38% 186 7 96.24% 178 40 77.53%
More information about the cfe-commits
mailing list