[llvm] [VPlan] Add BranchOnMultiCond, use for early exit plans. (PR #172750)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 25 14:07:08 PST 2025
https://github.com/fhahn updated https://github.com/llvm/llvm-project/pull/172750
>From 576a76c999d15b251e58b2ff3eb80dc595d88e97 Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Wed, 17 Dec 2025 23:11:47 +0000
Subject: [PATCH 1/4] [VPlan] Add BranchOnMultiCond, use for early exit plans.
This PR introduces a new BranchOnMultiCond VPInstruction, that takes N
boolean operands and must be placed in a block with N + 1 successors.
If condition I is true, branches to successor I, otherwise falls through
to check the next condition. If all conditions are false, branch to the
last (N+1) successor.
This new branch recipe is used for early-exit loops, to avoid the need
for splitting the middle block, in a way that preserves the
single-exit block property of regions. All exits still go through the
latch block, but they can go to more than 2 successors.
This idea was part of one of the original proposals for how to model
early exits in VPlan, but at that point in time, there was no good way
to handle this during code-gen, and we went with the split-middle block
approach initially.
Now that we dissolve regions before ::execute, the new recipe can be
lowered nicely after regions have been removed, to a set of VPBBs and
BranchOnCond recipes.
On Apple M cores, the new lowering is ~8-10% faster for std::find-like
loops. It also makes it easier to determine the early exits in VPlan. I
am also planning on extensions to support loops with multiple early
exits and early-exits at different positions, which should also be
slightly easier to do with the new representation.
---
.../Transforms/Vectorize/LoopVectorize.cpp | 3 +
llvm/lib/Transforms/Vectorize/VPlan.cpp | 17 +-
llvm/lib/Transforms/Vectorize/VPlan.h | 17 +-
.../Transforms/Vectorize/VPlanAnalysis.cpp | 1 +
.../Vectorize/VPlanConstruction.cpp | 15 +-
.../Transforms/Vectorize/VPlanPatternMatch.h | 11 +
.../lib/Transforms/Vectorize/VPlanRecipes.cpp | 12 +-
.../Transforms/Vectorize/VPlanTransforms.cpp | 99 +++++--
.../Transforms/Vectorize/VPlanTransforms.h | 4 +
llvm/lib/Transforms/Vectorize/VPlanUtils.cpp | 9 +-
llvm/lib/Transforms/Vectorize/VPlanUtils.h | 3 +-
.../Transforms/Vectorize/VPlanVerifier.cpp | 27 +-
.../AArch64/simple_early_exit.ll | 74 +++--
.../AArch64/single-early-exit-interleave.ll | 13 +-
.../single-early-exit-cond-poison.ll | 42 ++-
.../single-early-exit-deref-assumptions.ll | 87 +++---
.../single-early-exit-interleave-hint.ll | 9 +-
.../single-early-exit-interleave-only.ll | 18 +-
.../single-early-exit-interleave.ll | 89 +++---
.../LoopVectorize/single_early_exit.ll | 85 +++---
.../single_early_exit_live_outs.ll | 276 ++++++++----------
.../single_early_exit_with_outer_loop.ll | 18 +-
.../uncountable-early-exit-vplan.ll | 32 +-
...or-loop-backedge-elimination-early-exit.ll | 127 ++++----
.../PhaseOrdering/AArch64/std-find.ll | 180 +++++++++---
25 files changed, 717 insertions(+), 551 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index f8ee1484fb2ef..fcfe08f87fbd0 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -7405,6 +7405,9 @@ DenseMap<const SCEV *, Value *> LoopVectorizationPlanner::executePlan(
// Regions are dissolved after optimizing for VF and UF, which completely
// removes unneeded loop regions first.
VPlanTransforms::dissolveLoopRegions(BestVPlan);
+ // Expand BranchOnMultiCond after dissolution, when latch has direct access
+ // to its successors.
+ VPlanTransforms::expandBranchOnMultiCond(BestVPlan);
// Canonicalize EVL loops after regions are dissolved.
VPlanTransforms::canonicalizeEVLLoops(BestVPlan);
VPlanTransforms::materializeBackedgeTakenCount(BestVPlan, VectorPH);
diff --git a/llvm/lib/Transforms/Vectorize/VPlan.cpp b/llvm/lib/Transforms/Vectorize/VPlan.cpp
index 59550d9237e8f..738b8086488a0 100644
--- a/llvm/lib/Transforms/Vectorize/VPlan.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlan.cpp
@@ -592,16 +592,16 @@ static bool hasConditionalTerminator(const VPBasicBlock *VPBB) {
}
const VPRecipeBase *R = &VPBB->back();
- bool IsSwitch = isa<VPInstruction>(R) &&
- cast<VPInstruction>(R)->getOpcode() == Instruction::Switch;
- bool IsCondBranch =
+ [[maybe_unused]] bool IsSwitch =
+ isa<VPInstruction>(R) &&
+ cast<VPInstruction>(R)->getOpcode() == Instruction::Switch;
+ [[maybe_unused]] bool IsBranchOnMultiCond = match(R, m_BranchOnMultiCond());
+ [[maybe_unused]] bool IsCondBranch =
isa<VPBranchOnMaskRecipe>(R) ||
match(R, m_CombineOr(m_BranchOnCond(), m_BranchOnCount()));
- (void)IsCondBranch;
- (void)IsSwitch;
if (VPBB->getNumSuccessors() == 2 ||
(VPBB->isExiting() && !VPBB->getParent()->isReplicator())) {
- assert((IsCondBranch || IsSwitch) &&
+ assert((IsCondBranch || IsSwitch || IsBranchOnMultiCond) &&
"block with multiple successors not terminated by "
"conditional branch nor switch recipe");
@@ -609,8 +609,9 @@ static bool hasConditionalTerminator(const VPBasicBlock *VPBB) {
}
if (VPBB->getNumSuccessors() > 2) {
- assert(IsSwitch && "block with more than 2 successors not terminated by "
- "a switch recipe");
+ assert((IsSwitch || IsBranchOnMultiCond) &&
+ "block with more than 2 successors not terminated by "
+ "a switch or branch-on-multi-cond recipe");
return true;
}
diff --git a/llvm/lib/Transforms/Vectorize/VPlan.h b/llvm/lib/Transforms/Vectorize/VPlan.h
index d043ec41ec1ca..ca175c80f29ea 100644
--- a/llvm/lib/Transforms/Vectorize/VPlan.h
+++ b/llvm/lib/Transforms/Vectorize/VPlan.h
@@ -1058,6 +1058,12 @@ class LLVM_ABI_FOR_TEST VPInstruction : public VPRecipeWithIRFlags,
// lowered to ICmp + BranchOnCond during VPlan to VPlan transformation.
BranchOnCount,
BranchOnCond,
+ // Multi-way branch with N boolean condition operands and N+1 successors.
+ // If condition i is true, branches to successor i; otherwise falls through
+ // to check the next condition. If all conditions are false, branches to
+ // the final successor. Expanded to a chain of BranchOnCond after region
+ // dissolution.
+ BranchOnMultiCond,
Broadcast,
/// Given operands of (the same) struct type, creates a struct of fixed-
/// width vectors each containing a struct field of all operands. The
@@ -1212,6 +1218,7 @@ class LLVM_ABI_FOR_TEST VPInstruction : public VPRecipeWithIRFlags,
case Instruction::Fence:
case Instruction::AtomicRMW:
case VPInstruction::BranchOnCond:
+ case VPInstruction::BranchOnMultiCond:
case VPInstruction::BranchOnCount:
return false;
default:
@@ -4405,7 +4412,7 @@ class VPlan {
/// latch. If there is an early exit from the vector loop, the middle block
/// conceptully has the early exit block as third successor, split accross 2
/// VPBBs. In that case, the second VPBB selects whether to execute the scalar
- /// tail loop or the exit bock. If the scalar tail loop or exit block are
+ /// tail loop or the exit block. If the scalar tail loop or exit block are
/// known to always execute, the middle block may branch directly to that
/// block. This function cannot be called once the vector loop region has been
/// removed.
@@ -4414,12 +4421,8 @@ class VPlan {
assert(
LoopRegion &&
"cannot call the function after vector loop region has been removed");
- auto *RegionSucc = cast<VPBasicBlock>(LoopRegion->getSingleSuccessor());
- if (RegionSucc->getSingleSuccessor() ||
- is_contained(RegionSucc->getSuccessors(), getScalarPreheader()))
- return RegionSucc;
- // There is an early exit. The successor of RegionSucc is the middle block.
- return cast<VPBasicBlock>(RegionSucc->getSuccessors()[1]);
+ // The middle block is always the last successor of the region.
+ return cast<VPBasicBlock>(LoopRegion->getSuccessors().back());
}
const VPBasicBlock *getMiddleBlock() const {
diff --git a/llvm/lib/Transforms/Vectorize/VPlanAnalysis.cpp b/llvm/lib/Transforms/Vectorize/VPlanAnalysis.cpp
index a586aafa2855d..f854616b12283 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanAnalysis.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanAnalysis.cpp
@@ -135,6 +135,7 @@ Type *VPTypeAnalysis::inferScalarTypeForRecipe(const VPInstruction *R) {
// Return the type based on first operand.
return inferScalarType(R->getOperand(0));
case VPInstruction::BranchOnCond:
+ case VPInstruction::BranchOnMultiCond:
case VPInstruction::BranchOnCount:
return Type::getVoidTy(Ctx);
default:
diff --git a/llvm/lib/Transforms/Vectorize/VPlanConstruction.cpp b/llvm/lib/Transforms/Vectorize/VPlanConstruction.cpp
index 318c05d8ef7c5..d4d51fad80095 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanConstruction.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanConstruction.cpp
@@ -428,16 +428,17 @@ static void createLoopRegion(VPlan &Plan, VPBlockBase *HeaderVPB) {
VPBlockUtils::disconnectBlocks(PreheaderVPBB, HeaderVPB);
VPBlockUtils::disconnectBlocks(LatchVPBB, HeaderVPB);
- VPBlockBase *LatchExitVPB = LatchVPBB->getSingleSuccessor();
- assert(LatchExitVPB && "Latch expected to be left with a single successor");
// Create an empty region first and insert it between PreheaderVPBB and
- // LatchExitVPB, taking care to preserve the original predecessor & successor
- // order of blocks. Set region entry and exiting after both HeaderVPB and
- // LatchVPBB have been disconnected from their predecessors/successors.
+ // the exit blocks, taking care to preserve the original predecessor &
+ // successor order of blocks. Set region entry and exiting after both
+ // HeaderVPB and LatchVPBB have been disconnected from their
+ // predecessors/successors.
auto *R = Plan.createLoopRegion();
- VPBlockUtils::insertOnEdge(LatchVPBB, LatchExitVPB, R);
- VPBlockUtils::disconnectBlocks(LatchVPBB, R);
+
+ // Transfer latch's successors to the region.
+ VPBlockUtils::transferSuccessors(LatchVPBB, R);
+
VPBlockUtils::connectBlocks(PreheaderVPBB, R);
R->setEntry(HeaderVPB);
R->setExiting(LatchVPBB);
diff --git a/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h b/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
index f082b970c7762..4c830fdb106f7 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
+++ b/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
@@ -374,6 +374,17 @@ m_BranchOnCond(const Op0_t &Op0) {
return m_VPInstruction<VPInstruction::BranchOnCond>(Op0);
}
+inline VPInstruction_match<VPInstruction::BranchOnMultiCond>
+m_BranchOnMultiCond() {
+ return m_VPInstruction<VPInstruction::BranchOnMultiCond>();
+}
+
+template <typename Op0_t, typename Op1_t>
+inline VPInstruction_match<VPInstruction::BranchOnMultiCond, Op0_t, Op1_t>
+m_BranchOnMultiCond(const Op0_t &Op0, const Op1_t &Op1) {
+ return m_VPInstruction<VPInstruction::BranchOnMultiCond>(Op0, Op1);
+}
+
template <typename Op0_t>
inline VPInstruction_match<VPInstruction::Broadcast, Op0_t>
m_Broadcast(const Op0_t &Op0) {
diff --git a/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp b/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
index ddbf014c17d4f..8bf9c094b5ddb 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
@@ -170,7 +170,8 @@ bool VPRecipeBase::mayHaveSideEffects() const {
auto *VPI = cast<VPInstruction>(this);
return mayWriteToMemory() ||
VPI->getOpcode() == VPInstruction::BranchOnCount ||
- VPI->getOpcode() == VPInstruction::BranchOnCond;
+ VPI->getOpcode() == VPInstruction::BranchOnCond ||
+ VPI->getOpcode() == VPInstruction::BranchOnMultiCond;
}
case VPWidenCallSC: {
Function *Fn = cast<VPWidenCallRecipe>(this)->getCalledScalarFunction();
@@ -471,6 +472,7 @@ unsigned VPInstruction::getNumOperandsForOpcode(unsigned Opcode) {
case Instruction::PHI:
case Instruction::Switch:
case VPInstruction::AnyOf:
+ case VPInstruction::BranchOnMultiCond:
case VPInstruction::FirstActiveLane:
case VPInstruction::LastActiveLane:
case VPInstruction::SLPLoad:
@@ -497,6 +499,7 @@ bool VPInstruction::canGenerateScalarForFirstLane() const {
case Instruction::PHI:
case Instruction::Select:
case VPInstruction::BranchOnCond:
+ case VPInstruction::BranchOnMultiCond:
case VPInstruction::BranchOnCount:
case VPInstruction::CalculateTripCountMinusVF:
case VPInstruction::CanonicalIVIncrementForPart:
@@ -654,6 +657,8 @@ Value *VPInstruction::generate(VPTransformState &State) {
applyMetadata(*Br);
return Br;
}
+ case VPInstruction::BranchOnMultiCond:
+ llvm_unreachable("BranchOnMultiCond should be expanded before execution");
case VPInstruction::Broadcast: {
return Builder.CreateVectorSplat(
State.VF, State.get(getOperand(0), /*IsScalar*/ true), "broadcast");
@@ -1167,6 +1172,7 @@ bool VPInstruction::opcodeMayReadOrWriteFromMemory() const {
case Instruction::PHI:
case VPInstruction::AnyOf:
case VPInstruction::BranchOnCond:
+ case VPInstruction::BranchOnMultiCond:
case VPInstruction::BranchOnCount:
case VPInstruction::Broadcast:
case VPInstruction::BuildStructVector:
@@ -1260,6 +1266,7 @@ bool VPInstruction::usesFirstPartOnly(const VPValue *Op) const {
return vputils::onlyFirstPartUsed(this);
case VPInstruction::BranchOnCount:
case VPInstruction::BranchOnCond:
+ case VPInstruction::BranchOnMultiCond:
case VPInstruction::CanonicalIVIncrementForPart:
return true;
};
@@ -1303,6 +1310,9 @@ void VPInstruction::printRecipe(raw_ostream &O, const Twine &Indent,
case VPInstruction::BranchOnCond:
O << "branch-on-cond";
break;
+ case VPInstruction::BranchOnMultiCond:
+ O << "branch-on-multi-cond";
+ break;
case VPInstruction::CalculateTripCountMinusVF:
O << "TC > VF ? TC - VF : 0";
break;
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index 25a4b60e9a533..a8caffe116fea 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -3694,6 +3694,60 @@ void VPlanTransforms::dissolveLoopRegions(VPlan &Plan) {
R->dissolveToCFGLoop();
}
+void VPlanTransforms::expandBranchOnMultiCond(VPlan &Plan) {
+ // Expand BranchOnMultiCond instructions into explicit CFG with branching.
+ // This must run after dissolveLoopRegions, when successors have been
+ // restored.
+ SmallVector<VPBasicBlock *> WorkList;
+ for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
+ vp_depth_first_shallow(Plan.getEntry()))) {
+ if (VPBB->empty())
+ continue;
+ if (match(&VPBB->back(), m_BranchOnMultiCond()))
+ WorkList.push_back(VPBB);
+ }
+
+ for (VPBasicBlock *VPBB : WorkList) {
+ auto *BMC = cast<VPInstruction>(&VPBB->back());
+
+ unsigned NumConds = BMC->getNumOperands();
+ assert(NumConds > 0 &&
+ "BranchOnMultiCond must have at least one condition");
+ DebugLoc DL = BMC->getDebugLoc();
+ const auto Successors = to_vector(VPBB->getSuccessors());
+ assert(Successors.size() == NumConds + 1 &&
+ "BranchOnMultiCond must have N operands and N+1 successors");
+
+ // Disconnect all successors.
+ for (VPBlockBase *Succ : Successors)
+ VPBlockUtils::disconnectBlocks(VPBB, Succ);
+
+ // Create chain of conditional branches. Each condition branches to its
+ // corresponding successor on true, and to the next condition block (or the
+ // final successor) on false.
+ VPBasicBlock *CurrentBlock = VPBB;
+ for (const auto &[I, Cond] : enumerate(BMC->operands())) {
+ VPBlockBase *TrueSucc = Successors[I];
+ VPBlockBase *FalseSucc = Successors[NumConds];
+ if (I + 1 != NumConds) {
+ auto *FalseBlock = Plan.createVPBasicBlock(
+ (Twine(VPBB->getName()) + ".multi.cond." + Twine(I + 1)).str());
+ FalseBlock->setParent(VPBB->getParent());
+ FalseSucc = FalseBlock;
+ }
+
+ VPBuilder(CurrentBlock)
+ .createNaryOp(VPInstruction::BranchOnCond, {Cond}, DL);
+ VPBlockUtils::connectBlocks(CurrentBlock, TrueSucc);
+ VPBlockUtils::connectBlocks(CurrentBlock, FalseSucc);
+
+ CurrentBlock = cast<VPBasicBlock>(FalseSucc);
+ }
+
+ BMC->eraseFromParent();
+ }
+}
+
void VPlanTransforms::convertToConcreteRecipes(VPlan &Plan) {
VPTypeAnalysis TypeInfo(Plan);
SmallVector<VPRecipeBase *> ToRemove;
@@ -3846,36 +3900,36 @@ void VPlanTransforms::handleUncountableEarlyExit(VPBasicBlock *EarlyExitingVPBB,
? CondOfEarlyExitingVPBB
: Builder.createNot(CondOfEarlyExitingVPBB);
- // Split the middle block and have it conditionally branch to the early exit
- // block if CondToEarlyExit.
+ // Create a BranchOnMultiCond in the latch that branches to:
+ // [0] vector.early.exit, [1] middle block, [2] header (continue looping).
VPValue *IsEarlyExitTaken =
Builder.createNaryOp(VPInstruction::AnyOf, {CondToEarlyExit});
- VPBasicBlock *NewMiddle = Plan.createVPBasicBlock("middle.split");
VPBasicBlock *VectorEarlyExitVPBB =
Plan.createVPBasicBlock("vector.early.exit");
- VPBlockUtils::insertOnEdge(LatchVPBB, MiddleVPBB, NewMiddle);
- VPBlockUtils::connectBlocks(NewMiddle, VectorEarlyExitVPBB);
- NewMiddle->swapSuccessors();
+ VectorEarlyExitVPBB->setParent(LatchVPBB->getParent());
+ // Update PHI operands: copy from EarlyExitingVPBB to VectorEarlyExitVPBB.
+ unsigned PredIdx = EarlyExitVPBB->getIndexForPredecessor(EarlyExitingVPBB);
VPBlockUtils::connectBlocks(VectorEarlyExitVPBB, EarlyExitVPBB);
- // Update the exit phis in the early exit block.
- VPBuilder MiddleBuilder(NewMiddle);
VPBuilder EarlyExitB(VectorEarlyExitVPBB);
+ VPBuilder MiddleBuilder(cast<VPBasicBlock>(MiddleVPBB));
for (VPRecipeBase &R : EarlyExitVPBB->phis()) {
auto *ExitIRI = cast<VPIRPhi>(&R);
- // Early exit operand should always be last, i.e., 0 if EarlyExitVPBB has
- // a single predecessor and 1 if it has two.
+
+ // Move operand from EarlyExitingVPBB to VectorEarlyExitVPBB.
+ VPValue *IncomingFromEarlyExit = ExitIRI->getOperand(PredIdx);
+ ExitIRI->addOperand(IncomingFromEarlyExit);
+ ExitIRI->removeIncomingValueFor(EarlyExitingVPBB);
+
+ // Early exit operand is now at the last position.
unsigned EarlyExitIdx = ExitIRI->getNumOperands() - 1;
if (ExitIRI->getNumOperands() != 1) {
- // The first of two operands corresponds to the latch exit, via MiddleVPBB
- // predecessor. Extract its final lane.
+ // The first operand corresponds to the latch exit via MiddleVPBB.
ExitIRI->extractLastLaneOfLastPartOfFirstOperand(MiddleBuilder);
}
- VPValue *IncomingFromEarlyExit = ExitIRI->getOperand(EarlyExitIdx);
if (!IncomingFromEarlyExit->isLiveIn()) {
- // Update the incoming value from the early exit.
VPValue *FirstActiveLane = EarlyExitB.createNaryOp(
VPInstruction::FirstActiveLane, {CondToEarlyExit},
DebugLoc::getUnknown(), "first.active.lane");
@@ -3885,11 +3939,8 @@ void VPlanTransforms::handleUncountableEarlyExit(VPBasicBlock *EarlyExitingVPBB,
ExitIRI->setOperand(EarlyExitIdx, IncomingFromEarlyExit);
}
}
- MiddleBuilder.createNaryOp(VPInstruction::BranchOnCond, {IsEarlyExitTaken});
- // Replace the condition controlling the non-early exit from the vector loop
- // with one exiting if either the original condition of the vector latch is
- // true or the early exit has been taken.
+ // Get the old latch terminator to extract the trip count condition.
auto *LatchExitingBranch = cast<VPInstruction>(LatchVPBB->getTerminator());
// Skip single-iteration loop region
assert(LatchExitingBranch->getOpcode() == VPInstruction::BranchOnCount &&
@@ -3897,10 +3948,16 @@ void VPlanTransforms::handleUncountableEarlyExit(VPBasicBlock *EarlyExitingVPBB,
auto *IsLatchExitTaken =
Builder.createICmp(CmpInst::ICMP_EQ, LatchExitingBranch->getOperand(0),
LatchExitingBranch->getOperand(1));
- auto *AnyExitTaken = Builder.createNaryOp(
- Instruction::Or, {IsEarlyExitTaken, IsLatchExitTaken});
- Builder.createNaryOp(VPInstruction::BranchOnCond, AnyExitTaken);
+
+ DebugLoc LatchDL = LatchExitingBranch->getDebugLoc();
LatchExitingBranch->eraseFromParent();
+
+ Builder.setInsertPoint(LatchVPBB);
+ Builder.createNaryOp(VPInstruction::BranchOnMultiCond,
+ {IsEarlyExitTaken, IsLatchExitTaken}, LatchDL);
+ LatchVPBB->clearSuccessors();
+ LatchVPBB->setSuccessors({VectorEarlyExitVPBB, MiddleVPBB, HeaderVPBB});
+ VectorEarlyExitVPBB->setPredecessors({LatchVPBB});
}
/// This function tries convert extended in-loop reductions to
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.h b/llvm/lib/Transforms/Vectorize/VPlanTransforms.h
index 1a3ff4f9b9bbc..4b7f27f614042 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.h
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.h
@@ -281,6 +281,10 @@ struct VPlanTransforms {
/// Replace loop regions with explicit CFG.
static void dissolveLoopRegions(VPlan &Plan);
+ /// Expand BranchOnMultiCond instructions into explicit CFG with
+ /// BranchOnCond instructions. Should be called after dissolveLoopRegions.
+ static void expandBranchOnMultiCond(VPlan &Plan);
+
/// Transform EVL loops to use variable-length stepping after region
/// dissolution.
///
diff --git a/llvm/lib/Transforms/Vectorize/VPlanUtils.cpp b/llvm/lib/Transforms/Vectorize/VPlanUtils.cpp
index 25052b7c8b1b3..a1d11df879fdd 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanUtils.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanUtils.cpp
@@ -317,11 +317,10 @@ vputils::getRecipesForUncountableExit(VPlan &Plan,
// EMIT vp<%5> = any-of vp<%4>
// EMIT vp<%6> = add vp<%2>, vp<%0>
// EMIT vp<%7> = icmp eq vp<%6>, ir<64>
- // EMIT vp<%8> = or vp<%5>, vp<%7>
- // EMIT branch-on-cond vp<%8>
+ // EMIT branch-on-muli-cond vp<%5>, vp<%8>
// No successors
// }
- // Successor(s): middle.block
+ // Successor(s): early.exit, middle.block
//
// middle.block:
// Successor(s): preheader
@@ -334,8 +333,8 @@ vputils::getRecipesForUncountableExit(VPlan &Plan,
auto *Region = Plan.getVectorLoopRegion();
VPValue *UncountableCondition = nullptr;
if (!match(Region->getExitingBasicBlock()->getTerminator(),
- m_BranchOnCond(m_OneUse(m_c_BinaryOr(
- m_AnyOf(m_VPValue(UncountableCondition)), m_VPValue())))))
+ m_BranchOnMultiCond(m_AnyOf(m_VPValue(UncountableCondition)),
+ m_VPValue())))
return std::nullopt;
SmallVector<VPValue *, 4> Worklist;
diff --git a/llvm/lib/Transforms/Vectorize/VPlanUtils.h b/llvm/lib/Transforms/Vectorize/VPlanUtils.h
index f79d42d8108aa..44272eea3bf9c 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanUtils.h
+++ b/llvm/lib/Transforms/Vectorize/VPlanUtils.h
@@ -166,8 +166,7 @@ class VPBlockUtils {
unsigned PredIdx = -1u, unsigned SuccIdx = -1u) {
assert((From->getParent() == To->getParent()) &&
"Can't connect two block with different parents");
- assert((SuccIdx != -1u || From->getNumSuccessors() < 2) &&
- "Blocks can't have more than two successors.");
+
if (SuccIdx == -1u)
From->appendSuccessor(To);
else
diff --git a/llvm/lib/Transforms/Vectorize/VPlanVerifier.cpp b/llvm/lib/Transforms/Vectorize/VPlanVerifier.cpp
index 2d63d2a787f88..6702449fa6bee 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanVerifier.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanVerifier.cpp
@@ -392,16 +392,19 @@ bool VPlanVerifier::verifyBlock(const VPBlockBase *VPB) {
auto *VPBB = dyn_cast<VPBasicBlock>(VPB);
// Check block's condition bit.
if (!isa<VPIRBasicBlock>(VPB)) {
- if (VPB->getNumSuccessors() > 1 ||
- (VPBB && VPBB->getParent() && VPBB->isExiting() &&
- !VPBB->getParent()->isReplicator())) {
- if (!VPBB || !VPBB->getTerminator()) {
+ // VPRegionBlocks can have multiple successors (e.g., with
+ // BranchOnMultiCond) without needing a terminator, so only check
+ // VPBasicBlocks
+ if (VPBB && (VPB->getNumSuccessors() > 1 ||
+ (VPBB->getParent() && VPBB->isExiting() &&
+ !VPBB->getParent()->isReplicator()))) {
+ if (!VPBB->getTerminator()) {
errs() << "Block has multiple successors but doesn't "
"have a proper branch recipe!\n";
return false;
}
- } else {
- if (VPBB && VPBB->getTerminator()) {
+ } else if (VPBB) {
+ if (VPBB->getTerminator()) {
errs() << "Unexpected branch recipe!\n";
return false;
}
@@ -531,15 +534,17 @@ bool VPlanVerifier::verify(const VPlan &Plan) {
}
if (Exiting->empty()) {
- errs() << "VPlan vector loop exiting block must end with BranchOnCount or "
- "BranchOnCond VPInstruction but is empty\n";
+ errs() << "VPlan vector loop exiting block must end with BranchOnCount, "
+ "BranchOnCond, or BranchOnMultiCond VPInstruction but is empty\n";
return false;
}
auto *LastInst = dyn_cast<VPInstruction>(std::prev(Exiting->end()));
- if (!match(LastInst, m_CombineOr(m_BranchOnCond(), m_BranchOnCount()))) {
- errs() << "VPlan vector loop exit must end with BranchOnCount or "
- "BranchOnCond VPInstruction\n";
+ if (!match(LastInst, m_CombineOr(m_BranchOnCond(),
+ m_CombineOr(m_BranchOnCount(),
+ m_BranchOnMultiCond())))) {
+ errs() << "VPlan vector loop exit must end with BranchOnCount, "
+ "BranchOnCond, or BranchOnMultiCond VPInstruction\n";
return false;
}
diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/simple_early_exit.ll b/llvm/test/Transforms/LoopVectorize/AArch64/simple_early_exit.ll
index 3c1d5e94404ff..233f3ee525d6b 100644
--- a/llvm/test/Transforms/LoopVectorize/AArch64/simple_early_exit.ll
+++ b/llvm/test/Transforms/LoopVectorize/AArch64/simple_early_exit.ll
@@ -25,7 +25,7 @@ define i64 @same_exit_block_pre_inc_use1() #1 {
; CHECK-NEXT: [[TMP6:%.*]] = add i64 3, [[N_VEC]]
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 16 x i8>, ptr [[TMP11]], align 1
@@ -36,10 +36,9 @@ define i64 @same_exit_block_pre_inc_use1() #1 {
; CHECK-NEXT: [[TMP8:%.*]] = freeze <vscale x 16 x i1> [[TMP16]]
; CHECK-NEXT: [[TMP17:%.*]] = call i1 @llvm.vector.reduce.or.nxv16i1(<vscale x 16 x i1> [[TMP8]])
; CHECK-NEXT: [[TMP18:%.*]] = icmp eq i64 [[INDEX_NEXT3]], [[N_VEC]]
-; CHECK-NEXT: [[TMP19:%.*]] = or i1 [[TMP17]], [[TMP18]]
-; CHECK-NEXT: br i1 [[TMP19]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP17]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP17]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP18]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 64, [[N_VEC]]
; CHECK-NEXT: br i1 [[CMP_N]], label [[LOOP_END:%.*]], label [[SCALAR_PH]]
@@ -49,7 +48,7 @@ define i64 @same_exit_block_pre_inc_use1() #1 {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP20]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: scalar.ph:
-; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[TMP6]], [[MIDDLE_BLOCK]] ], [ 3, [[ENTRY:%.*]] ]
+; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[TMP6]], [[MIDDLE_BLOCK1]] ], [ 3, [[ENTRY:%.*]] ]
; CHECK-NEXT: br label [[LOOP:%.*]]
; CHECK: loop:
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ]
@@ -64,7 +63,7 @@ define i64 @same_exit_block_pre_inc_use1() #1 {
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]], !llvm.loop [[LOOP3:![0-9]+]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ], [ 67, [[MIDDLE_BLOCK]] ], [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ], [ 67, [[MIDDLE_BLOCK1]] ], [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -107,8 +106,8 @@ define i64 @same_exit_block_pre_inc_use4() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[VECTOR_BODY]] ]
-; CHECK-NEXT: [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 3, i64 4>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 3, i64 4>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x i64>, ptr [[TMP1]], align 1
@@ -117,11 +116,10 @@ define i64 @same_exit_block_pre_inc_use4() {
; CHECK-NEXT: [[TMP2:%.*]] = freeze <2 x i1> [[TMP4]]
; CHECK-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> [[TMP2]])
; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT2]], 64
-; CHECK-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]
; CHECK-NEXT: [[VEC_IND_NEXT]] = add <2 x i64> [[VEC_IND]], splat (i64 2)
-; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -130,7 +128,7 @@ define i64 @same_exit_block_pre_inc_use4() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP8]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -170,7 +168,7 @@ define i64 @loop_contains_safe_call() #1 {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds float, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP1]], align 1
@@ -180,10 +178,9 @@ define i64 @loop_contains_safe_call() #1 {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP5]]
; CHECK-NEXT: [[TMP6:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT2]], 64
-; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP6]], [[TMP7]]
-; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -192,7 +189,7 @@ define i64 @loop_contains_safe_call() #1 {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP9]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -238,7 +235,7 @@ define i64 @loop_contains_safe_div() #1 {
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX2:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX2:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX1:%.*]] = add i64 3, [[INDEX2]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[P1]], i64 [[OFFSET_IDX1]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 4 x i32>, ptr [[TMP1]], align 1
@@ -248,10 +245,9 @@ define i64 @loop_contains_safe_div() #1 {
; CHECK-NEXT: [[TMP9:%.*]] = freeze <vscale x 4 x i1> [[TMP15]]
; CHECK-NEXT: [[TMP6:%.*]] = call i1 @llvm.vector.reduce.or.nxv4i1(<vscale x 4 x i1> [[TMP9]])
; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT2]], [[INDEX1]]
-; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP6]], [[TMP7]]
-; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 64, [[INDEX1]]
; CHECK-NEXT: br i1 [[CMP_N]], label [[LOOP_END:%.*]], label [[SCALAR_PH:%.*]]
@@ -274,7 +270,7 @@ define i64 @loop_contains_safe_div() #1 {
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]], !llvm.loop [[LOOP7:![0-9]+]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ], [ 67, [[MIDDLE_BLOCK]] ], [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ], [ 67, [[MIDDLE_BLOCK1]] ], [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -317,7 +313,7 @@ define i64 @loop_contains_load_after_early_exit(ptr dereferenceable(1024) align(
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP1]], align 1
@@ -328,12 +324,11 @@ define i64 @loop_contains_load_after_early_exit(ptr dereferenceable(1024) align(
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
-; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i64> [[WIDE_LOAD2]], i32 3
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
; CHECK: middle.block:
+; CHECK-NEXT: [[TMP9:%.*]] = extractelement <4 x i64> [[WIDE_LOAD2]], i32 3
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
; CHECK-NEXT: [[FIRST_ACTIVE_LANE:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v4i1(<4 x i1> [[TMP6]], i1 false)
@@ -341,7 +336,7 @@ define i64 @loop_contains_load_after_early_exit(ptr dereferenceable(1024) align(
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP11]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ [[TMP10]], [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ [[TMP9]], [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -403,7 +398,7 @@ define i32 @diff_exit_block_needs_scev_check(i32 %end) {
; CHECK-NEXT: [[TMP8:%.*]] = trunc i64 [[N_VEC]] to i8
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i32, ptr [[P1]], i64 [[INDEX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP10]], align 4
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[P2]], i64 [[INDEX]]
@@ -413,18 +408,17 @@ define i32 @diff_exit_block_needs_scev_check(i32 %end) {
; CHECK-NEXT: [[TMP13:%.*]] = freeze <4 x i1> [[TMP14]]
; CHECK-NEXT: [[TMP15:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP13]])
; CHECK-NEXT: [[TMP16:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
-; CHECK-NEXT: [[TMP17:%.*]] = or i1 [[TMP15]], [[TMP16]]
-; CHECK-NEXT: br i1 [[TMP17]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP15]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP15]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP16]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[UMAX1]], [[N_VEC]]
; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
; CHECK: vector.early.exit:
; CHECK-NEXT: br label [[FOUND:%.*]]
; CHECK: scalar.ph:
-; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i8 [ [[TMP8]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
-; CHECK-NEXT: [[BC_RESUME_VAL3:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
+; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i8 [ [[TMP8]], [[MIDDLE_BLOCK1]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
+; CHECK-NEXT: [[BC_RESUME_VAL3:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK1]] ], [ 0, [[ENTRY]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
; CHECK: for.body:
; CHECK-NEXT: [[IND:%.*]] = phi i8 [ [[IND_NEXT:%.*]], [[FOR_INC:%.*]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ]
diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/single-early-exit-interleave.ll b/llvm/test/Transforms/LoopVectorize/AArch64/single-early-exit-interleave.ll
index cc03ef8af8b00..187a95728fdf3 100644
--- a/llvm/test/Transforms/LoopVectorize/AArch64/single-early-exit-interleave.ll
+++ b/llvm/test/Transforms/LoopVectorize/AArch64/single-early-exit-interleave.ll
@@ -26,7 +26,7 @@ define i64 @same_exit_block_pre_inc_use1() #0 {
; CHECK-NEXT: [[INDEX_NEXT:%.*]] = add i64 3, [[N_VEC]]
; CHECK-NEXT: br label [[LOOP:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[LOOP]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[LOOP_INC:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[TMP27:%.*]] = mul nuw nsw i64 [[TMP4]], 2
@@ -60,10 +60,9 @@ define i64 @same_exit_block_pre_inc_use1() #0 {
; CHECK-NEXT: [[TMP33:%.*]] = or <vscale x 16 x i1> [[TMP62]], [[TMP34]]
; CHECK-NEXT: [[TMP12:%.*]] = call i1 @llvm.vector.reduce.or.nxv16i1(<vscale x 16 x i1> [[TMP33]])
; CHECK-NEXT: [[TMP35:%.*]] = icmp eq i64 [[INDEX_NEXT3]], [[N_VEC]]
-; CHECK-NEXT: [[TMP36:%.*]] = or i1 [[TMP12]], [[TMP35]]
-; CHECK-NEXT: br i1 [[TMP36]], label [[MIDDLE_SPLIT:%.*]], label [[LOOP]], !llvm.loop [[LOOP0:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP12]], label [[VECTOR_EARLY_EXIT:%.*]], label [[LOOP_INC:%.*]]
+; CHECK-NEXT: br i1 [[TMP12]], label [[VECTOR_EARLY_EXIT:%.*]], label [[LOOP_INC]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP35]], label [[MIDDLE_BLOCK:%.*]], label [[LOOP]], !llvm.loop [[LOOP0:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 510, [[N_VEC]]
; CHECK-NEXT: br i1 [[CMP_N]], label [[LOOP_END:%.*]], label [[SCALAR_PH]]
@@ -92,7 +91,7 @@ define i64 @same_exit_block_pre_inc_use1() #0 {
; CHECK-NEXT: [[TMP17:%.*]] = add i64 3, [[TMP16]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: scalar.ph:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT]], [[LOOP_INC]] ], [ 3, [[ENTRY:%.*]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT]], [[MIDDLE_BLOCK]] ], [ 3, [[ENTRY:%.*]] ]
; CHECK-NEXT: br label [[LOOP1:%.*]]
; CHECK: loop:
; CHECK-NEXT: [[INDEX2:%.*]] = phi i64 [ [[INDEX_NEXT1:%.*]], [[LOOP_INC1:%.*]] ], [ [[INDEX]], [[SCALAR_PH]] ]
@@ -107,7 +106,7 @@ define i64 @same_exit_block_pre_inc_use1() #0 {
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT1]], 513
; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP1]], label [[LOOP_END]], !llvm.loop [[LOOP3:![0-9]+]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX2]], [[LOOP1]] ], [ 67, [[LOOP_INC1]] ], [ 67, [[LOOP_INC]] ], [ [[TMP17]], [[VECTOR_EARLY_EXIT]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX2]], [[LOOP1]] ], [ 67, [[LOOP_INC1]] ], [ 67, [[MIDDLE_BLOCK]] ], [ [[TMP17]], [[VECTOR_EARLY_EXIT]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
diff --git a/llvm/test/Transforms/LoopVectorize/single-early-exit-cond-poison.ll b/llvm/test/Transforms/LoopVectorize/single-early-exit-cond-poison.ll
index 60b9070459662..899d7f8c5d7cc 100644
--- a/llvm/test/Transforms/LoopVectorize/single-early-exit-cond-poison.ll
+++ b/llvm/test/Transforms/LoopVectorize/single-early-exit-cond-poison.ll
@@ -16,19 +16,27 @@ define noundef i32 @f(i32 noundef %g) {
; VF4IC2-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
; VF4IC2-NEXT: br label %[[VECTOR_BODY:.*]]
; VF4IC2: [[VECTOR_BODY]]:
-; VF4IC2-NEXT: [[TMP2:%.*]] = ashr <4 x i32> [[BROADCAST_SPLAT]], <i32 0, i32 8, i32 16, i32 24>
-; VF4IC2-NEXT: [[TMP3:%.*]] = ashr <4 x i32> [[BROADCAST_SPLAT]], <i32 32, i32 40, i32 48, i32 56>
+; VF4IC2-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; VF4IC2-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1]] ]
+; VF4IC2-NEXT: [[STEP_ADD:%.*]] = add <4 x i32> [[VEC_IND]], splat (i32 4)
+; VF4IC2-NEXT: [[TMP0:%.*]] = shl nuw nsw <4 x i32> [[VEC_IND]], splat (i32 3)
+; VF4IC2-NEXT: [[TMP1:%.*]] = shl nuw nsw <4 x i32> [[STEP_ADD]], splat (i32 3)
+; VF4IC2-NEXT: [[TMP2:%.*]] = ashr <4 x i32> [[BROADCAST_SPLAT]], [[TMP0]]
+; VF4IC2-NEXT: [[TMP3:%.*]] = ashr <4 x i32> [[BROADCAST_SPLAT]], [[TMP1]]
; VF4IC2-NEXT: [[TMP4:%.*]] = icmp ne <4 x i32> [[TMP2]], zeroinitializer
; VF4IC2-NEXT: [[TMP5:%.*]] = icmp ne <4 x i32> [[TMP3]], zeroinitializer
+; VF4IC2-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 8
; VF4IC2-NEXT: [[TMP17:%.*]] = freeze <4 x i1> [[TMP4]]
; VF4IC2-NEXT: [[TMP18:%.*]] = freeze <4 x i1> [[TMP5]]
; VF4IC2-NEXT: [[TMP6:%.*]] = or <4 x i1> [[TMP17]], [[TMP18]]
; VF4IC2-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP6]])
-; VF4IC2-NEXT: br label %[[MIDDLE_SPLIT:.*]]
-; VF4IC2: [[MIDDLE_SPLIT]]:
-; VF4IC2-NEXT: [[TMP8:%.*]] = extractelement <4 x i32> [[TMP3]], i32 3
-; VF4IC2-NEXT: br i1 [[TMP7]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; VF4IC2-NEXT: [[TMP16:%.*]] = icmp eq i32 [[INDEX_NEXT]], 8
+; VF4IC2-NEXT: [[VEC_IND_NEXT]] = add nuw nsw <4 x i32> [[STEP_ADD]], splat (i32 4)
+; VF4IC2-NEXT: br i1 [[TMP7]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; VF4IC2: [[VECTOR_BODY_MULTI_COND_1]]:
+; VF4IC2-NEXT: br i1 [[TMP16]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
; VF4IC2: [[MIDDLE_BLOCK]]:
+; VF4IC2-NEXT: [[TMP8:%.*]] = extractelement <4 x i32> [[TMP3]], i32 3
; VF4IC2-NEXT: br label %[[RETURN:.*]]
; VF4IC2: [[VECTOR_EARLY_EXIT]]:
; VF4IC2-NEXT: [[TMP9:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v4i1(<4 x i1> [[TMP5]], i1 false)
@@ -38,9 +46,10 @@ define noundef i32 @f(i32 noundef %g) {
; VF4IC2-NEXT: [[TMP13:%.*]] = icmp ne i64 [[TMP11]], 4
; VF4IC2-NEXT: [[TMP14:%.*]] = select i1 [[TMP13]], i64 [[TMP12]], i64 [[TMP10]]
; VF4IC2-NEXT: [[TMP15:%.*]] = trunc i64 [[TMP14]] to i32
+; VF4IC2-NEXT: [[TMP19:%.*]] = add i32 [[INDEX]], [[TMP15]]
; VF4IC2-NEXT: br label %[[RETURN]]
; VF4IC2: [[RETURN]]:
-; VF4IC2-NEXT: [[RES:%.*]] = phi i32 [ [[TMP8]], %[[MIDDLE_BLOCK]] ], [ [[TMP15]], %[[VECTOR_EARLY_EXIT]] ]
+; VF4IC2-NEXT: [[RES:%.*]] = phi i32 [ [[TMP8]], %[[MIDDLE_BLOCK]] ], [ [[TMP19]], %[[VECTOR_EARLY_EXIT]] ]
; VF4IC2-NEXT: ret i32 [[RES]]
;
; VF8IC1-LABEL: define noundef i32 @f(
@@ -52,22 +61,29 @@ define noundef i32 @f(i32 noundef %g) {
; VF8IC1-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <8 x i32> [[BROADCAST_SPLATINSERT]], <8 x i32> poison, <8 x i32> zeroinitializer
; VF8IC1-NEXT: br label %[[VECTOR_BODY:.*]]
; VF8IC1: [[VECTOR_BODY]]:
-; VF8IC1-NEXT: [[TMP1:%.*]] = ashr <8 x i32> [[BROADCAST_SPLAT]], <i32 0, i32 8, i32 16, i32 24, i32 32, i32 40, i32 48, i32 56>
+; VF8IC1-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; VF8IC1-NEXT: [[VEC_IND:%.*]] = phi <8 x i32> [ <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1]] ]
+; VF8IC1-NEXT: [[TMP0:%.*]] = shl nuw nsw <8 x i32> [[VEC_IND]], splat (i32 3)
+; VF8IC1-NEXT: [[TMP1:%.*]] = ashr <8 x i32> [[BROADCAST_SPLAT]], [[TMP0]]
; VF8IC1-NEXT: [[TMP2:%.*]] = icmp ne <8 x i32> [[TMP1]], zeroinitializer
+; VF8IC1-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 8
; VF8IC1-NEXT: [[TMP8:%.*]] = freeze <8 x i1> [[TMP2]]
; VF8IC1-NEXT: [[TMP3:%.*]] = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> [[TMP8]])
-; VF8IC1-NEXT: br label %[[MIDDLE_SPLIT:.*]]
-; VF8IC1: [[MIDDLE_SPLIT]]:
-; VF8IC1-NEXT: [[TMP4:%.*]] = extractelement <8 x i32> [[TMP1]], i32 7
-; VF8IC1-NEXT: br i1 [[TMP3]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; VF8IC1-NEXT: [[TMP7:%.*]] = icmp eq i32 [[INDEX_NEXT]], 8
+; VF8IC1-NEXT: [[VEC_IND_NEXT]] = add nuw nsw <8 x i32> [[VEC_IND]], splat (i32 8)
+; VF8IC1-NEXT: br i1 [[TMP3]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; VF8IC1: [[VECTOR_BODY_MULTI_COND_1]]:
+; VF8IC1-NEXT: br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
; VF8IC1: [[MIDDLE_BLOCK]]:
+; VF8IC1-NEXT: [[TMP4:%.*]] = extractelement <8 x i32> [[TMP1]], i32 7
; VF8IC1-NEXT: br label %[[RETURN:.*]]
; VF8IC1: [[VECTOR_EARLY_EXIT]]:
; VF8IC1-NEXT: [[TMP5:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v8i1(<8 x i1> [[TMP2]], i1 false)
; VF8IC1-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i32
+; VF8IC1-NEXT: [[TMP9:%.*]] = add i32 [[INDEX]], [[TMP6]]
; VF8IC1-NEXT: br label %[[RETURN]]
; VF8IC1: [[RETURN]]:
-; VF8IC1-NEXT: [[RES:%.*]] = phi i32 [ [[TMP4]], %[[MIDDLE_BLOCK]] ], [ [[TMP6]], %[[VECTOR_EARLY_EXIT]] ]
+; VF8IC1-NEXT: [[RES:%.*]] = phi i32 [ [[TMP4]], %[[MIDDLE_BLOCK]] ], [ [[TMP9]], %[[VECTOR_EARLY_EXIT]] ]
; VF8IC1-NEXT: ret i32 [[RES]]
;
entry:
diff --git a/llvm/test/Transforms/LoopVectorize/single-early-exit-deref-assumptions.ll b/llvm/test/Transforms/LoopVectorize/single-early-exit-deref-assumptions.ll
index 753e688f08670..adbcd21e346c5 100644
--- a/llvm/test/Transforms/LoopVectorize/single-early-exit-deref-assumptions.ll
+++ b/llvm/test/Transforms/LoopVectorize/single-early-exit-deref-assumptions.ll
@@ -11,7 +11,7 @@ define i64 @early_exit_alignment_and_deref_known_via_assumption_with_constant_si
; CHECK: [[VECTOR_PH]]:
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], %[[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX1]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP0]], align 1
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX1]]
@@ -21,10 +21,9 @@ define i64 @early_exit_alignment_and_deref_known_via_assumption_with_constant_si
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP4]]
; CHECK-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 1024
-; CHECK-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]
-; CHECK-NEXT: br i1 [[TMP7]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
-; CHECK: [[MIDDLE_SPLIT]]:
-; CHECK-NEXT: br i1 [[TMP5]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; CHECK-NEXT: br i1 [[TMP5]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
+; CHECK-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: br label %[[LOOP_END:.*]]
; CHECK: [[VECTOR_EARLY_EXIT]]:
@@ -122,7 +121,7 @@ define i64 @early_exit_alignment_and_deref_known_via_assumption_n_not_zero(ptr n
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], %[[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX1]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP0]], align 1
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX1]]
@@ -132,16 +131,14 @@ define i64 @early_exit_alignment_and_deref_known_via_assumption_n_not_zero(ptr n
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP2]]
; CHECK-NEXT: [[TMP4:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT3]], [[N_VEC]]
-; CHECK-NEXT: [[TMP6:%.*]] = or i1 [[TMP4]], [[TMP5]]
-; CHECK-NEXT: br i1 [[TMP6]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
-; CHECK: [[MIDDLE_SPLIT]]:
-; CHECK-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; CHECK-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
+; CHECK-NEXT: br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
+; CHECK-NEXT: [[IND_ESCAPE:%.*]] = sub i64 [[N_VEC]], 1
; CHECK-NEXT: br i1 [[CMP_N]], label %[[LOOP_END_LOOPEXIT:.*]], label %[[SCALAR_PH]]
; CHECK: [[VECTOR_EARLY_EXIT]]:
-; CHECK-NEXT: [[TMP7:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v4i1(<4 x i1> [[TMP2]], i1 false)
-; CHECK-NEXT: [[TMP8:%.*]] = add i64 [[INDEX1]], [[TMP7]]
; CHECK-NEXT: br label %[[LOOP_END_LOOPEXIT]]
; CHECK: [[SCALAR_PH]]:
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[LOOP_PREHEADER]] ]
@@ -159,7 +156,7 @@ define i64 @early_exit_alignment_and_deref_known_via_assumption_n_not_zero(ptr n
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], [[N]]
; CHECK-NEXT: br i1 [[EXITCOND]], label %[[LOOP]], label %[[LOOP_END_LOOPEXIT]], !llvm.loop [[LOOP4:![0-9]+]]
; CHECK: [[LOOP_END_LOOPEXIT]]:
-; CHECK-NEXT: [[RETVAL_PH:%.*]] = phi i64 [ -1, %[[LOOP_INC]] ], [ [[INDEX]], %[[LOOP]] ], [ -1, %[[MIDDLE_BLOCK]] ], [ [[TMP8]], %[[VECTOR_EARLY_EXIT]] ]
+; CHECK-NEXT: [[RETVAL_PH:%.*]] = phi i64 [ -1, %[[LOOP_INC]] ], [ [[INDEX]], %[[LOOP]] ], [ [[IND_ESCAPE]], %[[MIDDLE_BLOCK]] ], [ -1, %[[VECTOR_EARLY_EXIT]] ]
; CHECK-NEXT: br label %[[LOOP_END]]
; CHECK: [[LOOP_END]]:
; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[RETVAL_PH]], %[[LOOP_END_LOOPEXIT]] ]
@@ -319,7 +316,7 @@ define i64 @early_exit_alignment_and_deref_known_via_assumption_n_not_zero_i16_p
; CHECK-NEXT: [[IV_NEXT1:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP3]]
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = mul i64 [[INDEX]], 2
; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[A]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i16>, ptr [[NEXT_GEP]], align 2
@@ -328,18 +325,14 @@ define i64 @early_exit_alignment_and_deref_known_via_assumption_n_not_zero_i16_p
; CHECK-NEXT: [[TMP6:%.*]] = freeze <4 x i1> [[TMP5]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP6]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
-; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
-; CHECK-NEXT: br i1 [[TMP9]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
-; CHECK: [[MIDDLE_SPLIT]]:
-; CHECK-NEXT: br i1 [[TMP7]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; CHECK-NEXT: br i1 [[TMP7]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
+; CHECK-NEXT: br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP2]], [[N_VEC]]
+; CHECK-NEXT: [[IND_ESCAPE:%.*]] = getelementptr i8, ptr [[IV_NEXT1]], i64 -2
; CHECK-NEXT: br i1 [[CMP_N]], label %[[EXIT_LOOPEXIT:.*]], label %[[SCALAR_PH]]
; CHECK: [[VECTOR_EARLY_EXIT]]:
-; CHECK-NEXT: [[TMP10:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v4i1(<4 x i1> [[TMP5]], i1 false)
-; CHECK-NEXT: [[TMP11:%.*]] = add i64 [[INDEX]], [[TMP10]]
-; CHECK-NEXT: [[TMP12:%.*]] = mul i64 [[TMP11]], 2
-; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP12]]
; CHECK-NEXT: br label %[[EXIT_LOOPEXIT]]
; CHECK: [[SCALAR_PH]]:
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi ptr [ [[IV_NEXT1]], %[[MIDDLE_BLOCK]] ], [ [[A]], %[[LOOP_HEADER_PREHEADER]] ]
@@ -354,7 +347,7 @@ define i64 @early_exit_alignment_and_deref_known_via_assumption_n_not_zero_i16_p
; CHECK-NEXT: [[EC:%.*]] = icmp eq ptr [[IV_NEXT]], [[A_END]]
; CHECK-NEXT: br i1 [[EC]], label %[[EXIT_LOOPEXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP6:![0-9]+]]
; CHECK: [[EXIT_LOOPEXIT]]:
-; CHECK-NEXT: [[P_PH:%.*]] = phi ptr [ [[A_END]], %[[LOOP_LATCH]] ], [ [[IV]], %[[LOOP_HEADER]] ], [ [[A_END]], %[[MIDDLE_BLOCK]] ], [ [[TMP13]], %[[VECTOR_EARLY_EXIT]] ]
+; CHECK-NEXT: [[P_PH:%.*]] = phi ptr [ [[A_END]], %[[LOOP_LATCH]] ], [ [[IV]], %[[LOOP_HEADER]] ], [ [[IND_ESCAPE]], %[[MIDDLE_BLOCK]] ], [ [[A_END]], %[[VECTOR_EARLY_EXIT]] ]
; CHECK-NEXT: br label %[[EXIT]]
; CHECK: [[EXIT]]:
; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[A]], %[[ENTRY]] ], [ [[P_PH]], %[[EXIT_LOOPEXIT]] ]
@@ -414,7 +407,7 @@ define ptr @find_deref_pointer_distance_align_attribute_argument(ptr align 2 %fi
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[FIRST]], i64 [[TMP4]]
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = mul i64 [[INDEX]], 2
; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[FIRST]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i16>, ptr [[NEXT_GEP]], align 2
@@ -423,17 +416,18 @@ define ptr @find_deref_pointer_distance_align_attribute_argument(ptr align 2 %fi
; CHECK-NEXT: [[TMP7:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP8:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP7]])
; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
-; CHECK-NEXT: [[TMP10:%.*]] = or i1 [[TMP8]], [[TMP9]]
-; CHECK-NEXT: br i1 [[TMP10]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
-; CHECK: [[MIDDLE_SPLIT]]:
-; CHECK-NEXT: br i1 [[TMP8]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; CHECK-NEXT: br i1 [[TMP8]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
+; CHECK-NEXT: br i1 [[TMP9]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP3]], [[N_VEC]]
+; CHECK-NEXT: [[IND_ESCAPE:%.*]] = getelementptr i8, ptr [[TMP5]], i64 -2
; CHECK-NEXT: br i1 [[CMP_N]], label %[[EXIT_LOOPEXIT:.*]], label %[[SCALAR_PH]]
; CHECK: [[VECTOR_EARLY_EXIT]]:
; CHECK-NEXT: [[TMP11:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v4i1(<4 x i1> [[TMP6]], i1 false)
; CHECK-NEXT: [[TMP12:%.*]] = add i64 [[INDEX]], [[TMP11]]
-; CHECK-NEXT: [[TMP13:%.*]] = mul i64 [[TMP12]], 2
+; CHECK-NEXT: [[TMP15:%.*]] = add i64 [[TMP12]], 1
+; CHECK-NEXT: [[TMP13:%.*]] = mul i64 [[TMP15]], 2
; CHECK-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[FIRST]], i64 [[TMP13]]
; CHECK-NEXT: br label %[[EXIT_LOOPEXIT]]
; CHECK: [[SCALAR_PH]]:
@@ -449,7 +443,7 @@ define ptr @find_deref_pointer_distance_align_attribute_argument(ptr align 2 %fi
; CHECK-NEXT: [[C_2:%.*]] = icmp eq ptr [[IV_NEXT]], [[LAST]]
; CHECK-NEXT: br i1 [[C_2]], label %[[EXIT_LOOPEXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP8:![0-9]+]]
; CHECK: [[EXIT_LOOPEXIT]]:
-; CHECK-NEXT: [[FIRST_ADDR_0_LCSSA_I_PH:%.*]] = phi ptr [ [[IV_NEXT]], %[[LOOP_LATCH]] ], [ [[IV]], %[[LOOP_HEADER]] ], [ [[TMP5]], %[[MIDDLE_BLOCK]] ], [ [[TMP14]], %[[VECTOR_EARLY_EXIT]] ]
+; CHECK-NEXT: [[FIRST_ADDR_0_LCSSA_I_PH:%.*]] = phi ptr [ [[IV_NEXT]], %[[LOOP_LATCH]] ], [ [[IV]], %[[LOOP_HEADER]] ], [ [[IND_ESCAPE]], %[[MIDDLE_BLOCK]] ], [ [[TMP14]], %[[VECTOR_EARLY_EXIT]] ]
; CHECK-NEXT: br label %[[EXIT]]
; CHECK: [[EXIT]]:
; CHECK-NEXT: [[FIRST_ADDR_0_LCSSA_I:%.*]] = phi ptr [ [[FIRST]], %[[ENTRY]] ], [ [[FIRST_ADDR_0_LCSSA_I_PH]], %[[EXIT_LOOPEXIT]] ]
@@ -508,7 +502,7 @@ define ptr @find_deref_pointer_distance_align_assumption(ptr %first, ptr %last)
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[FIRST]], i64 [[TMP4]]
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = mul i64 [[INDEX]], 2
; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[FIRST]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i16>, ptr [[NEXT_GEP]], align 2
@@ -517,17 +511,18 @@ define ptr @find_deref_pointer_distance_align_assumption(ptr %first, ptr %last)
; CHECK-NEXT: [[TMP7:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP8:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP7]])
; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
-; CHECK-NEXT: [[TMP10:%.*]] = or i1 [[TMP8]], [[TMP9]]
-; CHECK-NEXT: br i1 [[TMP10]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
-; CHECK: [[MIDDLE_SPLIT]]:
-; CHECK-NEXT: br i1 [[TMP8]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; CHECK-NEXT: br i1 [[TMP8]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
+; CHECK-NEXT: br i1 [[TMP9]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP3]], [[N_VEC]]
+; CHECK-NEXT: [[IND_ESCAPE:%.*]] = getelementptr i8, ptr [[TMP5]], i64 -2
; CHECK-NEXT: br i1 [[CMP_N]], label %[[EXIT_LOOPEXIT:.*]], label %[[SCALAR_PH]]
; CHECK: [[VECTOR_EARLY_EXIT]]:
; CHECK-NEXT: [[TMP11:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v4i1(<4 x i1> [[TMP6]], i1 false)
; CHECK-NEXT: [[TMP12:%.*]] = add i64 [[INDEX]], [[TMP11]]
-; CHECK-NEXT: [[TMP13:%.*]] = mul i64 [[TMP12]], 2
+; CHECK-NEXT: [[TMP15:%.*]] = add i64 [[TMP12]], 1
+; CHECK-NEXT: [[TMP13:%.*]] = mul i64 [[TMP15]], 2
; CHECK-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[FIRST]], i64 [[TMP13]]
; CHECK-NEXT: br label %[[EXIT_LOOPEXIT]]
; CHECK: [[SCALAR_PH]]:
@@ -543,7 +538,7 @@ define ptr @find_deref_pointer_distance_align_assumption(ptr %first, ptr %last)
; CHECK-NEXT: [[C_2:%.*]] = icmp eq ptr [[IV_NEXT]], [[LAST]]
; CHECK-NEXT: br i1 [[C_2]], label %[[EXIT_LOOPEXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP10:![0-9]+]]
; CHECK: [[EXIT_LOOPEXIT]]:
-; CHECK-NEXT: [[FIRST_ADDR_0_LCSSA_I_PH:%.*]] = phi ptr [ [[IV_NEXT]], %[[LOOP_LATCH]] ], [ [[IV]], %[[LOOP_HEADER]] ], [ [[TMP5]], %[[MIDDLE_BLOCK]] ], [ [[TMP14]], %[[VECTOR_EARLY_EXIT]] ]
+; CHECK-NEXT: [[FIRST_ADDR_0_LCSSA_I_PH:%.*]] = phi ptr [ [[IV_NEXT]], %[[LOOP_LATCH]] ], [ [[IV]], %[[LOOP_HEADER]] ], [ [[IND_ESCAPE]], %[[MIDDLE_BLOCK]] ], [ [[TMP14]], %[[VECTOR_EARLY_EXIT]] ]
; CHECK-NEXT: br label %[[EXIT]]
; CHECK: [[EXIT]]:
; CHECK-NEXT: [[FIRST_ADDR_0_LCSSA_I:%.*]] = phi ptr [ [[FIRST]], %[[ENTRY]] ], [ [[FIRST_ADDR_0_LCSSA_I_PH]], %[[EXIT_LOOPEXIT]] ]
@@ -585,7 +580,7 @@ define i64 @early_exit_alignment_and_deref_known_via_assumption_with_constant_si
; CHECK: [[VECTOR_PH]]:
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], %[[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX1]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[ARRAYIDX2]], align 1
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX1]]
@@ -595,10 +590,9 @@ define i64 @early_exit_alignment_and_deref_known_via_assumption_with_constant_si
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP2]]
; CHECK-NEXT: [[TMP4:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 1024
-; CHECK-NEXT: [[TMP6:%.*]] = or i1 [[TMP4]], [[TMP5]]
-; CHECK-NEXT: br i1 [[TMP6]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
-; CHECK: [[MIDDLE_SPLIT]]:
-; CHECK-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; CHECK-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
+; CHECK-NEXT: br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: br label %[[LOOP_END:.*]]
; CHECK: [[VECTOR_EARLY_EXIT]]:
@@ -723,7 +717,7 @@ define i64 @find_if_pointer_distance_deref_via_assumption(ptr %vec) nofree nosyn
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[BEGIN]], i64 [[TMP4]]
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = mul i64 [[INDEX]], 2
; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[BEGIN]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i16>, ptr [[NEXT_GEP]], align 2
@@ -732,10 +726,9 @@ define i64 @find_if_pointer_distance_deref_via_assumption(ptr %vec) nofree nosyn
; CHECK-NEXT: [[TMP7:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP8:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP7]])
; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
-; CHECK-NEXT: [[TMP10:%.*]] = or i1 [[TMP8]], [[TMP9]]
-; CHECK-NEXT: br i1 [[TMP10]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]
-; CHECK: [[MIDDLE_SPLIT]]:
-; CHECK-NEXT: br i1 [[TMP8]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; CHECK-NEXT: br i1 [[TMP8]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
+; CHECK-NEXT: br i1 [[TMP9]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP3]], [[N_VEC]]
; CHECK-NEXT: br i1 [[CMP_N]], label %[[EXIT_LOOPEXIT:.*]], label %[[SCALAR_PH]]
diff --git a/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave-hint.ll b/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave-hint.ll
index 2183c520d9e81..cd31f40e5e52c 100644
--- a/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave-hint.ll
+++ b/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave-hint.ll
@@ -12,7 +12,7 @@ define i64 @multi_exiting_to_different_exits_live_in_exit_values() {
; VF4IC4: [[VECTOR_PH]]:
; VF4IC4-NEXT: br label %[[VECTOR_BODY:.*]]
; VF4IC4: [[VECTOR_BODY]]:
-; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
+; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
; VF4IC4-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 [[INDEX]]
; VF4IC4-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 4
; VF4IC4-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 8
@@ -35,10 +35,9 @@ define i64 @multi_exiting_to_different_exits_live_in_exit_values() {
; VF4IC4-NEXT: [[TMP11:%.*]] = or <4 x i1> [[TMP16]], [[TMP17]]
; VF4IC4-NEXT: [[TMP3:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP11]])
; VF4IC4-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 128
-; VF4IC4-NEXT: [[TMP5:%.*]] = or i1 [[TMP3]], [[TMP4]]
-; VF4IC4-NEXT: br i1 [[TMP5]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
-; VF4IC4: [[MIDDLE_SPLIT]]:
-; VF4IC4-NEXT: br i1 [[TMP3]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; VF4IC4-NEXT: br i1 [[TMP3]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; VF4IC4: [[VECTOR_BODY_MULTI_COND_1]]:
+; VF4IC4-NEXT: br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
; VF4IC4: [[MIDDLE_BLOCK]]:
; VF4IC4-NEXT: br label %[[E2:.*]]
; VF4IC4: [[VECTOR_EARLY_EXIT]]:
diff --git a/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave-only.ll b/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave-only.ll
index a50ce969da7f4..da3a1f40db24f 100644
--- a/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave-only.ll
+++ b/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave-only.ll
@@ -12,7 +12,7 @@ define i8 @iv_used_in_exit_with_math(i8 noundef %g) {
; CHECK: [[VECTOR_PH]]:
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = trunc i32 [[INDEX]] to i8
; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[OFFSET_IDX]], 1
; CHECK-NEXT: [[TMP1:%.*]] = shl nuw i8 1, [[OFFSET_IDX]]
@@ -26,10 +26,9 @@ define i8 @iv_used_in_exit_with_math(i8 noundef %g) {
; CHECK-NEXT: [[TMP13:%.*]] = freeze i1 [[TMP8]]
; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP12]], [[TMP13]]
; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i32 [[INDEX_NEXT]], 4
-; CHECK-NEXT: [[TMP11:%.*]] = or i1 [[TMP9]], [[TMP10]]
-; CHECK-NEXT: br i1 [[TMP11]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
-; CHECK: [[MIDDLE_SPLIT]]:
-; CHECK-NEXT: br i1 [[TMP9]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; CHECK-NEXT: br i1 [[TMP9]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
+; CHECK-NEXT: br i1 [[TMP10]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: br label %[[RETURN:.*]]
; CHECK: [[VECTOR_EARLY_EXIT]]:
@@ -82,7 +81,7 @@ define i32 @iv_used_in_exit_with_loads(ptr align 4 dereferenceable(128) %src) {
; CHECK: [[VECTOR_PH]]:
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[INDEX]], 1
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i32 [[INDEX]]
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i32 [[TMP0]]
@@ -95,10 +94,9 @@ define i32 @iv_used_in_exit_with_loads(ptr align 4 dereferenceable(128) %src) {
; CHECK-NEXT: [[TMP13:%.*]] = freeze i1 [[TMP8]]
; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP12]], [[TMP13]]
; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i32 [[INDEX_NEXT]], 32
-; CHECK-NEXT: [[TMP11:%.*]] = or i1 [[TMP9]], [[TMP10]]
-; CHECK-NEXT: br i1 [[TMP11]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
-; CHECK: [[MIDDLE_SPLIT]]:
-; CHECK-NEXT: br i1 [[TMP9]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; CHECK-NEXT: br i1 [[TMP9]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
+; CHECK-NEXT: br i1 [[TMP10]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: br label %[[RETURN:.*]]
; CHECK: [[VECTOR_EARLY_EXIT]]:
diff --git a/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave.ll b/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave.ll
index 03c4a73593ba3..5fb833daf5364 100644
--- a/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave.ll
+++ b/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave.ll
@@ -12,7 +12,7 @@ define i64 @multi_exiting_to_different_exits_live_in_exit_values() {
; VF4IC4: vector.ph:
; VF4IC4-NEXT: br label [[VECTOR_BODY:%.*]]
; VF4IC4: vector.body:
-; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
+; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; VF4IC4-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 [[INDEX]]
; VF4IC4-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 4
; VF4IC4-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 8
@@ -35,10 +35,9 @@ define i64 @multi_exiting_to_different_exits_live_in_exit_values() {
; VF4IC4-NEXT: [[TMP11:%.*]] = or <4 x i1> [[TMP15]], [[TMP16]]
; VF4IC4-NEXT: [[TMP3:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP11]])
; VF4IC4-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 128
-; VF4IC4-NEXT: [[TMP5:%.*]] = or i1 [[TMP3]], [[TMP4]]
-; VF4IC4-NEXT: br i1 [[TMP5]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
-; VF4IC4: middle.split:
-; VF4IC4-NEXT: br i1 [[TMP3]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; VF4IC4-NEXT: br i1 [[TMP3]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; VF4IC4: vector.body.multi.cond.1:
+; VF4IC4-NEXT: br i1 [[TMP4]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[E2:%.*]]
; VF4IC4: vector.early.exit:
@@ -85,7 +84,7 @@ define i64 @same_exit_block_pre_inc_use1() {
; VF4IC4: vector.ph:
; VF4IC4-NEXT: br label [[VECTOR_BODY:%.*]]
; VF4IC4: vector.body:
-; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
+; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; VF4IC4-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX]]
; VF4IC4-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; VF4IC4-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 4
@@ -117,10 +116,9 @@ define i64 @same_exit_block_pre_inc_use1() {
; VF4IC4-NEXT: [[TMP16:%.*]] = or <4 x i1> [[TMP15]], [[TMP36]]
; VF4IC4-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP16]])
; VF4IC4-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 64
-; VF4IC4-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]
-; VF4IC4-NEXT: br i1 [[TMP7]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
-; VF4IC4: middle.split:
-; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; VF4IC4: vector.body.multi.cond.1:
+; VF4IC4-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[LOOP_END:%.*]]
; VF4IC4: vector.early.exit:
@@ -142,7 +140,7 @@ define i64 @same_exit_block_pre_inc_use1() {
; VF4IC4-NEXT: [[TMP10:%.*]] = add i64 3, [[TMP9]]
; VF4IC4-NEXT: br label [[LOOP_END]]
; VF4IC4: loop.end:
-; VF4IC4-NEXT: [[RETVAL:%.*]] = phi i64 [ [[TMP10]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
+; VF4IC4-NEXT: [[RETVAL:%.*]] = phi i64 [ [[TMP10]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
; VF4IC4-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -181,7 +179,7 @@ define ptr @same_exit_block_pre_inc_use1_ivptr() {
; VF4IC4: vector.ph:
; VF4IC4-NEXT: br label [[VECTOR_BODY:%.*]]
; VF4IC4: vector.body:
-; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
+; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; VF4IC4-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[P1]], i64 [[INDEX]]
; VF4IC4-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[NEXT_GEP]], i64 4
; VF4IC4-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[NEXT_GEP]], i64 8
@@ -204,10 +202,9 @@ define ptr @same_exit_block_pre_inc_use1_ivptr() {
; VF4IC4-NEXT: [[TMP9:%.*]] = or <4 x i1> [[TMP33]], [[TMP34]]
; VF4IC4-NEXT: [[TMP10:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP9]])
; VF4IC4-NEXT: [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024
-; VF4IC4-NEXT: [[TMP12:%.*]] = or i1 [[TMP10]], [[TMP11]]
-; VF4IC4-NEXT: br i1 [[TMP12]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
-; VF4IC4: middle.split:
-; VF4IC4-NEXT: br i1 [[TMP10]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; VF4IC4-NEXT: br i1 [[TMP10]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; VF4IC4: vector.body.multi.cond.1:
+; VF4IC4-NEXT: br i1 [[TMP11]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[LOOP_END:%.*]]
; VF4IC4: vector.early.exit:
@@ -229,7 +226,7 @@ define ptr @same_exit_block_pre_inc_use1_ivptr() {
; VF4IC4-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[P1]], i64 [[TMP7]]
; VF4IC4-NEXT: br label [[LOOP_END]]
; VF4IC4: loop.end:
-; VF4IC4-NEXT: [[RETVAL:%.*]] = phi ptr [ [[TMP8]], [[VECTOR_EARLY_EXIT]] ], [ [[PTREND]], [[MIDDLE_BLOCK]] ]
+; VF4IC4-NEXT: [[RETVAL:%.*]] = phi ptr [ [[TMP8]], [[VECTOR_EARLY_EXIT]] ], [ [[PTREND]], [[MIDDLE_BLOCK1]] ]
; VF4IC4-NEXT: ret ptr [[RETVAL]]
;
entry:
@@ -265,7 +262,7 @@ define i64 @same_exit_block_post_inc_use() {
; VF4IC4: vector.ph:
; VF4IC4-NEXT: br label [[VECTOR_BODY:%.*]]
; VF4IC4: vector.body:
-; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
+; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; VF4IC4-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX]]
; VF4IC4-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; VF4IC4-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 4
@@ -297,10 +294,9 @@ define i64 @same_exit_block_post_inc_use() {
; VF4IC4-NEXT: [[TMP16:%.*]] = or <4 x i1> [[TMP15]], [[TMP36]]
; VF4IC4-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP16]])
; VF4IC4-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 64
-; VF4IC4-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]
-; VF4IC4-NEXT: br i1 [[TMP7]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
-; VF4IC4: middle.split:
-; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; VF4IC4: vector.body.multi.cond.1:
+; VF4IC4-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[LOOP_END:%.*]]
; VF4IC4: vector.early.exit:
@@ -322,7 +318,7 @@ define i64 @same_exit_block_post_inc_use() {
; VF4IC4-NEXT: [[TMP10:%.*]] = add i64 3, [[TMP9]]
; VF4IC4-NEXT: br label [[LOOP_END]]
; VF4IC4: loop.end:
-; VF4IC4-NEXT: [[RETVAL:%.*]] = phi i64 [ [[TMP10]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
+; VF4IC4-NEXT: [[RETVAL:%.*]] = phi i64 [ [[TMP10]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
; VF4IC4-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -362,7 +358,7 @@ define i64 @diff_exit_block_pre_inc_use1() {
; VF4IC4: vector.ph:
; VF4IC4-NEXT: br label [[VECTOR_BODY:%.*]]
; VF4IC4: vector.body:
-; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
+; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; VF4IC4-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX]]
; VF4IC4-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; VF4IC4-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 4
@@ -394,10 +390,9 @@ define i64 @diff_exit_block_pre_inc_use1() {
; VF4IC4-NEXT: [[TMP16:%.*]] = or <4 x i1> [[TMP15]], [[TMP36]]
; VF4IC4-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP16]])
; VF4IC4-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 64
-; VF4IC4-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]
-; VF4IC4-NEXT: br i1 [[TMP7]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
-; VF4IC4: middle.split:
-; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; VF4IC4: vector.body.multi.cond.1:
+; VF4IC4-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[LOOP_END:%.*]]
; VF4IC4: vector.early.exit:
@@ -464,7 +459,7 @@ define i64 @diff_exit_block_post_inc_use1() {
; VF4IC4: vector.ph:
; VF4IC4-NEXT: br label [[VECTOR_BODY:%.*]]
; VF4IC4: vector.body:
-; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
+; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; VF4IC4-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX]]
; VF4IC4-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; VF4IC4-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 4
@@ -496,10 +491,9 @@ define i64 @diff_exit_block_post_inc_use1() {
; VF4IC4-NEXT: [[TMP16:%.*]] = or <4 x i1> [[TMP15]], [[TMP36]]
; VF4IC4-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP16]])
; VF4IC4-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 64
-; VF4IC4-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]
-; VF4IC4-NEXT: br i1 [[TMP7]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
-; VF4IC4: middle.split:
-; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; VF4IC4: vector.body.multi.cond.1:
+; VF4IC4-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[LOOP_END:%.*]]
; VF4IC4: vector.early.exit:
@@ -566,7 +560,7 @@ define i64 @same_exit_block_pre_inc_use1_reverse() {
; VF4IC4: vector.ph:
; VF4IC4-NEXT: br label [[VECTOR_BODY:%.*]]
; VF4IC4: vector.body:
-; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
+; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; VF4IC4-NEXT: [[OFFSET_IDX:%.*]] = sub i64 1023, [[INDEX]]
; VF4IC4-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; VF4IC4-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 0
@@ -616,10 +610,9 @@ define i64 @same_exit_block_pre_inc_use1_reverse() {
; VF4IC4-NEXT: [[TMP24:%.*]] = or <4 x i1> [[TMP45]], [[TMP47]]
; VF4IC4-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP24]])
; VF4IC4-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1008
-; VF4IC4-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
-; VF4IC4-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
-; VF4IC4: middle.split:
-; VF4IC4-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; VF4IC4-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; VF4IC4: vector.body.multi.cond.1:
+; VF4IC4-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[SCALAR_PH:%.*]]
; VF4IC4: vector.early.exit:
@@ -696,7 +689,7 @@ define i8 @same_exit_block_use_loaded_value() {
; VF4IC4: vector.ph:
; VF4IC4-NEXT: br label [[VECTOR_BODY:%.*]]
; VF4IC4: vector.body:
-; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
+; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; VF4IC4-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
; VF4IC4-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 4
; VF4IC4-NEXT: [[TMP2:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 8
@@ -727,10 +720,9 @@ define i8 @same_exit_block_use_loaded_value() {
; VF4IC4-NEXT: [[TMP16:%.*]] = or <4 x i1> [[TMP19]], [[TMP30]]
; VF4IC4-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP16]])
; VF4IC4-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024
-; VF4IC4-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]
-; VF4IC4-NEXT: br i1 [[TMP7]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
-; VF4IC4: middle.split:
-; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; VF4IC4: vector.body.multi.cond.1:
+; VF4IC4-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[LOOP_END:%.*]]
; VF4IC4: vector.early.exit:
@@ -763,7 +755,7 @@ define i8 @same_exit_block_use_loaded_value() {
; VF4IC4-NEXT: [[TMP42:%.*]] = select i1 [[TMP41]], i8 [[TMP40]], i8 [[TMP38]]
; VF4IC4-NEXT: br label [[LOOP_END]]
; VF4IC4: loop.end:
-; VF4IC4-NEXT: [[RETVAL:%.*]] = phi i8 [ [[TMP42]], [[VECTOR_EARLY_EXIT]] ], [ -1, [[MIDDLE_BLOCK]] ]
+; VF4IC4-NEXT: [[RETVAL:%.*]] = phi i8 [ [[TMP42]], [[VECTOR_EARLY_EXIT]] ], [ -1, [[MIDDLE_BLOCK1]] ]
; VF4IC4-NEXT: ret i8 [[RETVAL]]
;
entry:
@@ -804,7 +796,7 @@ define i8 @same_exit_block_reverse_use_loaded_value() {
; VF4IC4: vector.ph:
; VF4IC4-NEXT: br label [[VECTOR_BODY:%.*]]
; VF4IC4: vector.body:
-; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
+; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; VF4IC4-NEXT: [[OFFSET_IDX:%.*]] = sub i64 1023, [[INDEX]]
; VF4IC4-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; VF4IC4-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 0
@@ -854,10 +846,9 @@ define i8 @same_exit_block_reverse_use_loaded_value() {
; VF4IC4-NEXT: [[TMP24:%.*]] = or <4 x i1> [[TMP52]], [[TMP53]]
; VF4IC4-NEXT: [[TMP25:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP24]])
; VF4IC4-NEXT: [[TMP26:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1008
-; VF4IC4-NEXT: [[TMP27:%.*]] = or i1 [[TMP25]], [[TMP26]]
-; VF4IC4-NEXT: br i1 [[TMP27]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
-; VF4IC4: middle.split:
-; VF4IC4-NEXT: br i1 [[TMP25]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; VF4IC4-NEXT: br i1 [[TMP25]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; VF4IC4: vector.body.multi.cond.1:
+; VF4IC4-NEXT: br i1 [[TMP26]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[SCALAR_PH:%.*]]
; VF4IC4: vector.early.exit:
diff --git a/llvm/test/Transforms/LoopVectorize/single_early_exit.ll b/llvm/test/Transforms/LoopVectorize/single_early_exit.ll
index 71e2b82e2fdd1..601cdd0bd0e38 100644
--- a/llvm/test/Transforms/LoopVectorize/single_early_exit.ll
+++ b/llvm/test/Transforms/LoopVectorize/single_early_exit.ll
@@ -15,7 +15,7 @@ define i64 @same_exit_block_phi_of_consts() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -26,16 +26,15 @@ define i64 @same_exit_block_phi_of_consts() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
-; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ 0, [[VECTOR_EARLY_EXIT]] ], [ 1, [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ 0, [[VECTOR_EARLY_EXIT]] ], [ 1, [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -76,7 +75,7 @@ define i64 @diff_exit_block_phi_of_consts() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -87,10 +86,9 @@ define i64 @diff_exit_block_phi_of_consts() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
-; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -159,7 +157,7 @@ define i32 @diff_exit_block_needs_scev_check(i32 %end) {
; CHECK-NEXT: [[TMP8:%.*]] = trunc i64 [[N_VEC]] to i8
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i32, ptr [[P1]], i64 [[INDEX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP10]], align 4
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[P2]], i64 [[INDEX]]
@@ -169,18 +167,17 @@ define i32 @diff_exit_block_needs_scev_check(i32 %end) {
; CHECK-NEXT: [[TMP13:%.*]] = freeze <4 x i1> [[TMP14]]
; CHECK-NEXT: [[TMP15:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP13]])
; CHECK-NEXT: [[TMP16:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
-; CHECK-NEXT: [[TMP17:%.*]] = or i1 [[TMP15]], [[TMP16]]
-; CHECK-NEXT: br i1 [[TMP17]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP15]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP15]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP16]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[UMAX1]], [[N_VEC]]
; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
; CHECK: vector.early.exit:
; CHECK-NEXT: br label [[FOUND:%.*]]
; CHECK: scalar.ph:
-; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i8 [ [[TMP8]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
-; CHECK-NEXT: [[BC_RESUME_VAL3:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
+; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i8 [ [[TMP8]], [[MIDDLE_BLOCK1]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
+; CHECK-NEXT: [[BC_RESUME_VAL3:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK1]] ], [ 0, [[ENTRY]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
; CHECK: for.body:
; CHECK-NEXT: [[IND:%.*]] = phi i8 [ [[IND_NEXT:%.*]], [[FOR_INC:%.*]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ]
@@ -254,13 +251,12 @@ define i32 @diff_blocks_invariant_early_exit_cond(ptr %s) {
; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[INDEX_NEXT]], 276
-; CHECK-NEXT: [[TMP3:%.*]] = or i1 [[TMP1]], [[TMP2]]
-; CHECK-NEXT: br i1 [[TMP3]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP1]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP1]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP2]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[FOR_END:%.*]]
; CHECK: vector.early.exit:
@@ -311,7 +307,7 @@ define void @inner_loop_trip_count_depends_on_outer_iv(ptr align 8 dereferenceab
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[OUTER_IV]], [[N_MOD_VF]]
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr ptr, ptr [[GEP_SRC]], i64 [[INDEX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x ptr>, ptr [[TMP0]], align 8
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq <4 x ptr> [[WIDE_LOAD]], zeroinitializer
@@ -319,17 +315,16 @@ define void @inner_loop_trip_count_depends_on_outer_iv(ptr align 8 dereferenceab
; CHECK-NEXT: [[TMP2:%.*]] = freeze <4 x i1> [[TMP1]]
; CHECK-NEXT: [[TMP3:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP2]])
; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
-; CHECK-NEXT: [[TMP5:%.*]] = or i1 [[TMP3]], [[TMP4]]
-; CHECK-NEXT: br i1 [[TMP5]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP3]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP3]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP4]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[OUTER_IV]], [[N_VEC]]
; CHECK-NEXT: br i1 [[CMP_N]], label [[OUTER_LATCH_LOOPEXIT:%.*]], label [[SCALAR_PH]]
; CHECK: vector.early.exit:
; CHECK-NEXT: br label [[THEN_LOOPEXIT:%.*]]
; CHECK: scalar.ph:
-; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[INNER_HEADER_PREHEADER]] ]
+; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK1]] ], [ 0, [[INNER_HEADER_PREHEADER]] ]
; CHECK-NEXT: br label [[INNER_HEADER:%.*]]
; CHECK: inner.header:
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[INNER_LATCH:%.*]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ]
@@ -408,7 +403,7 @@ define i64 @loop_guard_needed_to_prove_dereferenceable(i32 %x, i1 %cmp2) {
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[TMP0]], [[N_MOD_VF]]
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr [32 x i32], ptr [[A]], i64 0, i64 [[INDEX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq <4 x i32> [[WIDE_LOAD]], zeroinitializer
@@ -416,19 +411,17 @@ define i64 @loop_guard_needed_to_prove_dereferenceable(i32 %x, i1 %cmp2) {
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP2]]
; CHECK-NEXT: [[TMP4:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
-; CHECK-NEXT: [[TMP6:%.*]] = or i1 [[TMP4]], [[TMP5]]
-; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP4]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP4]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP5]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP0]], [[N_VEC]]
+; CHECK-NEXT: [[IND_ESCAPE:%.*]] = sub i64 [[N_VEC]], 1
; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT_LOOPEXIT:%.*]], label [[SCALAR_PH]]
; CHECK: vector.early.exit:
-; CHECK-NEXT: [[TMP7:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v4i1(<4 x i1> [[TMP2]], i1 false)
-; CHECK-NEXT: [[TMP8:%.*]] = add i64 [[INDEX]], [[TMP7]]
; CHECK-NEXT: br label [[EXIT_LOOPEXIT]]
; CHECK: scalar.ph:
-; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[PH]] ]
+; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK1]] ], [ 0, [[PH]] ]
; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
; CHECK: loop.header:
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
@@ -441,7 +434,7 @@ define i64 @loop_guard_needed_to_prove_dereferenceable(i32 %x, i1 %cmp2) {
; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV]], [[N_EXT]]
; CHECK-NEXT: br i1 [[EC]], label [[EXIT_LOOPEXIT]], label [[LOOP_HEADER]], !llvm.loop [[LOOP10:![0-9]+]]
; CHECK: exit.loopexit:
-; CHECK-NEXT: [[RES_PH:%.*]] = phi i64 [ [[IV]], [[LOOP_HEADER]] ], [ -1, [[LOOP_LATCH]] ], [ -1, [[MIDDLE_BLOCK]] ], [ [[TMP8]], [[VECTOR_EARLY_EXIT]] ]
+; CHECK-NEXT: [[RES_PH:%.*]] = phi i64 [ [[IV]], [[LOOP_HEADER]] ], [ -1, [[LOOP_LATCH]] ], [ [[IND_ESCAPE]], [[MIDDLE_BLOCK1]] ], [ -1, [[VECTOR_EARLY_EXIT]] ]
; CHECK-NEXT: br label [[EXIT]]
; CHECK: exit:
; CHECK-NEXT: [[RES:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[RES_PH]], [[EXIT_LOOPEXIT]] ]
@@ -556,7 +549,7 @@ define i64 @loop_guards_needed_to_prove_deref_multiple(i32 %x, i1 %c, ptr derefe
; CHECK-NEXT: [[IV_NEXT:%.*]] = sub i64 [[TMP2]], [[N_MOD_VF]]
; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[LOOP_HEADER]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
; CHECK-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[SRC]], i64 [[INDEX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP3]], align 1
; CHECK-NEXT: [[TMP4:%.*]] = icmp eq <4 x i8> [[WIDE_LOAD]], zeroinitializer
@@ -564,19 +557,17 @@ define i64 @loop_guards_needed_to_prove_deref_multiple(i32 %x, i1 %c, ptr derefe
; CHECK-NEXT: [[TMP5:%.*]] = freeze <4 x i1> [[TMP4]]
; CHECK-NEXT: [[TMP6:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP5]])
; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[IV_NEXT]]
-; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP6]], [[TMP7]]
-; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_SPLIT:%.*]], label [[LOOP_HEADER]], !llvm.loop [[LOOP11:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[LOOP_LATCH:%.*]]
+; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[LOOP_LATCH]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_BLOCK:%.*]], label [[LOOP_HEADER]], !llvm.loop [[LOOP11:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP2]], [[IV_NEXT]]
+; CHECK-NEXT: [[IND_ESCAPE:%.*]] = sub i64 [[IV_NEXT]], 1
; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT_LOOPEXIT:%.*]], label [[SCALAR_PH]]
; CHECK: vector.early.exit:
-; CHECK-NEXT: [[TMP9:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v4i1(<4 x i1> [[TMP4]], i1 false)
-; CHECK-NEXT: [[TMP10:%.*]] = add i64 [[INDEX]], [[TMP9]]
; CHECK-NEXT: br label [[EXIT_LOOPEXIT]]
; CHECK: scalar.ph:
-; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT]], [[LOOP_LATCH]] ], [ 0, [[PH]] ]
+; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT]], [[MIDDLE_BLOCK]] ], [ 0, [[PH]] ]
; CHECK-NEXT: br label [[LOOP_HEADER1:%.*]]
; CHECK: loop.header:
; CHECK-NEXT: [[IV1:%.*]] = phi i64 [ [[IV_NEXT1:%.*]], [[LOOP_LATCH1:%.*]] ], [ [[IV]], [[SCALAR_PH]] ]
@@ -589,7 +580,7 @@ define i64 @loop_guards_needed_to_prove_deref_multiple(i32 %x, i1 %c, ptr derefe
; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV1]], [[N_EXT]]
; CHECK-NEXT: br i1 [[EC]], label [[EXIT_LOOPEXIT]], label [[LOOP_HEADER1]], !llvm.loop [[LOOP12:![0-9]+]]
; CHECK: exit.loopexit:
-; CHECK-NEXT: [[RES_PH:%.*]] = phi i64 [ [[IV1]], [[LOOP_HEADER1]] ], [ 0, [[LOOP_LATCH1]] ], [ 0, [[LOOP_LATCH]] ], [ [[TMP10]], [[VECTOR_EARLY_EXIT]] ]
+; CHECK-NEXT: [[RES_PH:%.*]] = phi i64 [ [[IV1]], [[LOOP_HEADER1]] ], [ 0, [[LOOP_LATCH1]] ], [ [[IND_ESCAPE]], [[MIDDLE_BLOCK]] ], [ 0, [[VECTOR_EARLY_EXIT]] ]
; CHECK-NEXT: br label [[EXIT]]
; CHECK: exit:
; CHECK-NEXT: [[RES:%.*]] = phi i64 [ -1, [[ENTRY:%.*]] ], [ -2, [[THEN]] ], [ [[RES_PH]], [[EXIT_LOOPEXIT]] ]
diff --git a/llvm/test/Transforms/LoopVectorize/single_early_exit_live_outs.ll b/llvm/test/Transforms/LoopVectorize/single_early_exit_live_outs.ll
index 1caceb1395373..38f00ce89a126 100644
--- a/llvm/test/Transforms/LoopVectorize/single_early_exit_live_outs.ll
+++ b/llvm/test/Transforms/LoopVectorize/single_early_exit_live_outs.ll
@@ -14,7 +14,7 @@ define i64 @same_exit_block_pre_inc_use1() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -25,10 +25,9 @@ define i64 @same_exit_block_pre_inc_use1() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
-; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -37,7 +36,7 @@ define i64 @same_exit_block_pre_inc_use1() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP10]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -78,7 +77,7 @@ define i32 @same_exit_block_pre_inc_use1_iv64_endi32_step2() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -89,10 +88,9 @@ define i32 @same_exit_block_pre_inc_use1_iv64_endi32_step2() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
-; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -103,7 +101,7 @@ define i32 @same_exit_block_pre_inc_use1_iv64_endi32_step2() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i32 9, [[TMP11]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i32 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i32 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret i32 [[RETVAL]]
;
entry:
@@ -144,7 +142,7 @@ define i32 @same_exit_block_pre_inc_use1_iv128_endi32_step2() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i128 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i128 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = trunc i128 [[INDEX1]] to i64
; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[NEXT_GEP]], align 1
@@ -153,10 +151,9 @@ define i32 @same_exit_block_pre_inc_use1_iv128_endi32_step2() {
; CHECK-NEXT: [[TMP1:%.*]] = freeze <4 x i1> [[TMP4]]
; CHECK-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP1]])
; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i128 [[INDEX_NEXT2]], 64
-; CHECK-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]
-; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -168,7 +165,7 @@ define i32 @same_exit_block_pre_inc_use1_iv128_endi32_step2() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i32 9, [[TMP10]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i32 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i32 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret i32 [[RETVAL]]
;
entry:
@@ -208,7 +205,7 @@ define float @same_exit_block_pre_inc_use1_iv64_endf32() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -219,10 +216,9 @@ define float @same_exit_block_pre_inc_use1_iv64_endf32() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
-; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -233,7 +229,7 @@ define float @same_exit_block_pre_inc_use1_iv64_endf32() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = fadd fast float 9.000000e+00, [[TMP11]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi float [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 1.230000e+02, [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi float [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 1.230000e+02, [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret float [[RETVAL]]
;
entry:
@@ -276,7 +272,7 @@ define ptr @same_exit_block_pre_inc_use1_iv64_endptr() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT7:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT7:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP10]], align 1
@@ -287,10 +283,9 @@ define ptr @same_exit_block_pre_inc_use1_iv64_endptr() {
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP15]]
; CHECK-NEXT: [[TMP16:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP17:%.*]] = icmp eq i64 [[INDEX_NEXT7]], 64
-; CHECK-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]]
-; CHECK-NEXT: br i1 [[TMP18]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP16]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP16]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP17]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -300,7 +295,7 @@ define ptr @same_exit_block_pre_inc_use1_iv64_endptr() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = getelementptr i8, ptr [[P2]], i64 [[TMP20]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi ptr [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ [[P1]], [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi ptr [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ [[P1]], [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret ptr [[RETVAL]]
;
entry:
@@ -342,7 +337,7 @@ define ptr @same_exit_block_pre_inc_use1_ivptr() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[P1]], i64 [[INDEX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[NEXT_GEP]], align 1
; CHECK-NEXT: [[TMP11:%.*]] = icmp ne <4 x i8> [[WIDE_LOAD]], splat (i8 72)
@@ -350,10 +345,9 @@ define ptr @same_exit_block_pre_inc_use1_ivptr() {
; CHECK-NEXT: [[TMP1:%.*]] = freeze <4 x i1> [[TMP11]]
; CHECK-NEXT: [[TMP12:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP1]])
; CHECK-NEXT: [[TMP13:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024
-; CHECK-NEXT: [[TMP14:%.*]] = or i1 [[TMP12]], [[TMP13]]
-; CHECK-NEXT: br i1 [[TMP14]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP12]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP12]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP13]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -362,7 +356,7 @@ define ptr @same_exit_block_pre_inc_use1_ivptr() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = getelementptr i8, ptr [[P1]], i64 [[TMP8]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi ptr [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ [[PTREND]], [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi ptr [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ [[PTREND]], [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret ptr [[RETVAL]]
;
entry:
@@ -400,7 +394,7 @@ define i64 @same_exit_block_pre_inc1_use_inv_cond(i1 %cond) {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -413,10 +407,9 @@ define i64 @same_exit_block_pre_inc1_use_inv_cond(i1 %cond) {
; CHECK-NEXT: [[TMP12:%.*]] = freeze <4 x i1> [[TMP7]]
; CHECK-NEXT: [[TMP8:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP12]])
; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: [[TMP10:%.*]] = or i1 [[TMP8]], [[TMP9]]
-; CHECK-NEXT: br i1 [[TMP10]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP8]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP8]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -425,7 +418,7 @@ define i64 @same_exit_block_pre_inc1_use_inv_cond(i1 %cond) {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP11]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -467,7 +460,7 @@ define i64 @same_exit_block_pre_inc_use1_gep_two_indices() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds [1024 x i8], ptr [[P1]], i64 0, i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -478,10 +471,9 @@ define i64 @same_exit_block_pre_inc_use1_gep_two_indices() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
-; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -490,7 +482,7 @@ define i64 @same_exit_block_pre_inc_use1_gep_two_indices() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP10]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -531,7 +523,7 @@ define i64 @same_exit_block_pre_inc_use1_alloca_diff_type() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -542,10 +534,9 @@ define i64 @same_exit_block_pre_inc_use1_alloca_diff_type() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
-; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -554,7 +545,7 @@ define i64 @same_exit_block_pre_inc_use1_alloca_diff_type() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP10]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -595,7 +586,7 @@ define i64 @same_exit_block_pre_inc_use2() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -606,16 +597,15 @@ define i64 @same_exit_block_pre_inc_use2() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
-; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ 67, [[VECTOR_EARLY_EXIT]] ], [ 66, [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ 67, [[VECTOR_EARLY_EXIT]] ], [ 66, [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -656,7 +646,7 @@ define i64 @same_exit_block_pre_inc_use3() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -667,10 +657,9 @@ define i64 @same_exit_block_pre_inc_use3() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
-; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -679,7 +668,7 @@ define i64 @same_exit_block_pre_inc_use3() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP10]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[INDEX_LCSSA:%.*]] = phi i64 [ 66, [[MIDDLE_BLOCK]] ], [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ]
+; CHECK-NEXT: [[INDEX_LCSSA:%.*]] = phi i64 [ 66, [[MIDDLE_BLOCK1]] ], [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ]
; CHECK-NEXT: ret i64 [[INDEX_LCSSA]]
;
entry:
@@ -721,8 +710,8 @@ define i64 @same_exit_block_pre_inc_use4() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[VECTOR_BODY]] ]
-; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 3, i64 4, i64 5, i64 6>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 3, i64 4, i64 5, i64 6>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i64>, ptr [[TMP1]], align 1
@@ -731,11 +720,10 @@ define i64 @same_exit_block_pre_inc_use4() {
; CHECK-NEXT: [[TMP2:%.*]] = freeze <4 x i1> [[TMP4]]
; CHECK-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP2]])
; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT2]], 64
-; CHECK-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]
; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], splat (i64 4)
-; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP13:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP13:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -744,7 +732,7 @@ define i64 @same_exit_block_pre_inc_use4() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP8]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -783,7 +771,7 @@ define i64 @same_exit_block_post_inc_use() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP4]], align 1
@@ -794,10 +782,9 @@ define i64 @same_exit_block_post_inc_use() {
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP13]]
; CHECK-NEXT: [[TMP14:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP15:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: [[TMP16:%.*]] = or i1 [[TMP14]], [[TMP15]]
-; CHECK-NEXT: br i1 [[TMP16]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP14]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP14]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP15]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -806,7 +793,7 @@ define i64 @same_exit_block_post_inc_use() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP10]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -846,7 +833,7 @@ define ptr @same_exit_block_post_inc_use1_ivptr() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[P1]], i64 [[INDEX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[NEXT_GEP]], align 1
; CHECK-NEXT: [[TMP15:%.*]] = icmp ne <4 x i8> [[WIDE_LOAD]], splat (i8 72)
@@ -854,10 +841,9 @@ define ptr @same_exit_block_post_inc_use1_ivptr() {
; CHECK-NEXT: [[TMP1:%.*]] = freeze <4 x i1> [[TMP15]]
; CHECK-NEXT: [[TMP16:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP1]])
; CHECK-NEXT: [[TMP17:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024
-; CHECK-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]]
-; CHECK-NEXT: br i1 [[TMP18]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP15:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP16]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP16]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP17]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP15:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -867,7 +853,7 @@ define ptr @same_exit_block_post_inc_use1_ivptr() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = getelementptr i8, ptr [[P1]], i64 [[TMP9]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi ptr [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ [[PTREND]], [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi ptr [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ [[PTREND]], [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret ptr [[RETVAL]]
;
entry:
@@ -904,7 +890,7 @@ define i64 @same_exit_block_post_inc_use2() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP4]], align 1
@@ -915,10 +901,9 @@ define i64 @same_exit_block_post_inc_use2() {
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP17]]
; CHECK-NEXT: [[TMP18:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP19:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: [[TMP20:%.*]] = or i1 [[TMP18]], [[TMP19]]
-; CHECK-NEXT: br i1 [[TMP20]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP16:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP18]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP18]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP19]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP16:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -928,7 +913,7 @@ define i64 @same_exit_block_post_inc_use2() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP11]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 66, [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 66, [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -969,7 +954,7 @@ define i64 @diff_exit_block_pre_inc_use1() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -980,10 +965,9 @@ define i64 @diff_exit_block_pre_inc_use1() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
-; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP17:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP17:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -1038,7 +1022,7 @@ define i64 @diff_exit_block_pre_inc_use2() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -1049,10 +1033,9 @@ define i64 @diff_exit_block_pre_inc_use2() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
-; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP18:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP18:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -1104,7 +1087,7 @@ define i64 @diff_exit_block_pre_inc_use3() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX2:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT4:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX2:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT4:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX2]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -1115,10 +1098,9 @@ define i64 @diff_exit_block_pre_inc_use3() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT4]], 64
-; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
-; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP19:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP19:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -1171,7 +1153,7 @@ define i64 @diff_exit_block_post_inc_use1() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP4]], align 1
@@ -1182,10 +1164,9 @@ define i64 @diff_exit_block_post_inc_use1() {
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP13]]
; CHECK-NEXT: [[TMP14:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP15:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: [[TMP16:%.*]] = or i1 [[TMP14]], [[TMP15]]
-; CHECK-NEXT: br i1 [[TMP16]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP20:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP14]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP14]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP15]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP20:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -1240,7 +1221,7 @@ define i64 @diff_exit_block_post_inc_use2() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP12]], align 1
@@ -1251,10 +1232,9 @@ define i64 @diff_exit_block_post_inc_use2() {
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP17]]
; CHECK-NEXT: [[TMP18:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP19:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: [[TMP20:%.*]] = or i1 [[TMP18]], [[TMP19]]
-; CHECK-NEXT: br i1 [[TMP20]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP21:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP18]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP18]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP19]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP21:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -1311,7 +1291,7 @@ define i64 @diff_exit_block_post_inc_use3(i64 %start) {
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[START]], 64
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT4:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT4:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP14]], align 1
@@ -1322,10 +1302,9 @@ define i64 @diff_exit_block_post_inc_use3(i64 %start) {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP19]]
; CHECK-NEXT: [[TMP20:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP21:%.*]] = icmp eq i64 [[INDEX_NEXT4]], 64
-; CHECK-NEXT: [[TMP22:%.*]] = or i1 [[TMP20]], [[TMP21]]
-; CHECK-NEXT: br i1 [[TMP22]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP22:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP20]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP20]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP21]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP22:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[IND_ESCAPE:%.*]] = sub i64 [[TMP0]], 1
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -1384,7 +1363,7 @@ define i64 @loop_contains_safe_call() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds float, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP1]], align 1
@@ -1394,10 +1373,9 @@ define i64 @loop_contains_safe_call() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP5]]
; CHECK-NEXT: [[TMP6:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT2]], 64
-; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP6]], [[TMP7]]
-; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP23:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP23:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -1406,7 +1384,7 @@ define i64 @loop_contains_safe_call() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP9]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -1446,7 +1424,7 @@ define i64 @loop_contains_safe_div() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP1]], align 1
@@ -1456,10 +1434,9 @@ define i64 @loop_contains_safe_div() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP5]]
; CHECK-NEXT: [[TMP6:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT2]], 64
-; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP6]], [[TMP7]]
-; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP24:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP24:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -1468,7 +1445,7 @@ define i64 @loop_contains_safe_div() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP9]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -1507,7 +1484,7 @@ define i64 @loop_contains_load_after_early_exit(ptr dereferenceable(1024) align(
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP1]], align 1
@@ -1518,12 +1495,11 @@ define i64 @loop_contains_load_after_early_exit(ptr dereferenceable(1024) align(
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
-; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP25:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i64> [[WIDE_LOAD2]], i32 3
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP25:![0-9]+]]
; CHECK: middle.block:
+; CHECK-NEXT: [[TMP9:%.*]] = extractelement <4 x i64> [[WIDE_LOAD2]], i32 3
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
; CHECK-NEXT: [[FIRST_ACTIVE_LANE:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v4i1(<4 x i1> [[TMP6]], i1 false)
@@ -1531,7 +1507,7 @@ define i64 @loop_contains_load_after_early_exit(ptr dereferenceable(1024) align(
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP11]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ [[TMP10]], [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ [[TMP9]], [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -1570,7 +1546,7 @@ define i64 @same_exit_block_pre_inc_use1_reverse() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT4:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT4:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = sub i64 1023, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i8, ptr [[TMP1]], i64 0
@@ -1587,10 +1563,9 @@ define i64 @same_exit_block_pre_inc_use1_reverse() {
; CHECK-NEXT: [[TMP7:%.*]] = freeze <4 x i1> [[TMP8]]
; CHECK-NEXT: [[TMP9:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP7]])
; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT4]], 1020
-; CHECK-NEXT: [[TMP11:%.*]] = or i1 [[TMP9]], [[TMP10]]
-; CHECK-NEXT: br i1 [[TMP11]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP26:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP9]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP9]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP10]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP26:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[SCALAR_PH:%.*]]
; CHECK: vector.early.exit:
@@ -1701,7 +1676,7 @@ define i64 @same_exit_block_pre_inc_use1_deref_ptrs(ptr dereferenceable(1024) %p
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -1712,10 +1687,9 @@ define i64 @same_exit_block_pre_inc_use1_deref_ptrs(ptr dereferenceable(1024) %p
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
-; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP28:![0-9]+]]
-; CHECK: middle.split:
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
+; CHECK: vector.body.multi.cond.1:
+; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP28:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -1724,7 +1698,7 @@ define i64 @same_exit_block_pre_inc_use1_deref_ptrs(ptr dereferenceable(1024) %p
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP10]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
diff --git a/llvm/test/Transforms/LoopVectorize/single_early_exit_with_outer_loop.ll b/llvm/test/Transforms/LoopVectorize/single_early_exit_with_outer_loop.ll
index 89eef094e0c8a..babc483f41386 100644
--- a/llvm/test/Transforms/LoopVectorize/single_early_exit_with_outer_loop.ll
+++ b/llvm/test/Transforms/LoopVectorize/single_early_exit_with_outer_loop.ll
@@ -2,11 +2,11 @@
declare void @init_mem(ptr, i64);
-; Tests that the additional middle.split created for handling loops with
-; uncountable early exits is correctly adding to the outer loop at depth 1.
+; Tests that the additional blocks created for handling loops with
+; uncountable early exits are correctly added to the outer loop at depth 1.
define void @early_exit_in_outer_loop1() {
; CHECK-LABEL: Loop info for function 'early_exit_in_outer_loop1':
-; CHECK: Loop at depth 1 containing: %loop.outer<header>,%loop.inner.found,%loop.inner.end<latch>,%loop.inner.end.loopexit,%vector.ph,%vector.body,%middle.split,%middle.block,%vector.early.exit
+; CHECK: Loop at depth 1 containing: %loop.outer<header>,%loop.inner.found,%loop.inner.end<latch>,%loop.inner.end.loopexit,%vector.ph,%vector.body,%vector.body.multi.cond.1,%middle.block,%vector.early.exit
entry:
%p1 = alloca [1024 x i8]
%p2 = alloca [1024 x i8]
@@ -40,13 +40,13 @@ loop.inner.end:
br label %loop.outer
}
-; Tests that the additional middle.split created for handling loops with
-; uncountable early exits is correctly adding to both the outer and middle
+; Tests that the additional blocks created for handling loops with
+; uncountable early exits are correctly added to both the outer and middle
; loops at depths 1 and 2, respectively.
define void @early_exit_in_outer_loop2() {
; CHECK-LABEL: Loop info for function 'early_exit_in_outer_loop2':
-; CHECK: Loop at depth 1 containing: %loop.outer<header>,%loop.middle,%loop.inner.found,%loop.inner.end,%loop.middle.end,%loop.outer.latch<latch>,%vector.ph,%vector.body,%middle.split,%middle.block,%vector.early.exit
-; CHECK: Loop at depth 2 containing: %loop.middle<header>,%loop.inner.end<latch><exiting>,%vector.ph,%vector.body,%middle.split<exiting>,%middle.block
+; CHECK: Loop at depth 1 containing: %loop.outer<header>,%loop.middle,%loop.inner.found,%loop.inner.end,%loop.middle.end,%loop.outer.latch<latch>,%vector.ph,%vector.body,%vector.body.multi.cond.1,%middle.block,%vector.early.exit
+; CHECK: Loop at depth 2 containing: %loop.middle<header>,%loop.inner.end<latch><exiting>,%vector.ph,%vector.body<exiting>,%vector.body.multi.cond.1,%middle.block
entry:
%p1 = alloca [1024 x i8]
%p2 = alloca [1024 x i8]
@@ -92,8 +92,8 @@ loop.outer.latch:
define i32 @early_exit_branch_to_outer_header() {
; CHECK-LABEL: Loop info for function 'early_exit_branch_to_outer_header':
-; CHECK-NEXT: Loop at depth 1 containing: %outer.header<header>,%outer.header.loopexit<latch>,%vector.ph,%vector.body,%middle.split<exiting>,%vector.early.exit
-; CHECK-NEXT: Loop at depth 2 containing: %vector.body<header><latch><exiting>
+; CHECK-NEXT: Loop at depth 1 containing: %outer.header<header>,%outer.header.loopexit<latch>,%vector.ph,%vector.body,%vector.body.multi.cond.1<exiting>,%vector.early.exit
+; CHECK-NEXT: Loop at depth 2 containing: %vector.body<header><exiting>,%vector.body.multi.cond.1<latch><exiting>
entry:
%src = alloca [1024 x i8]
call void @init_mem(ptr %src, i64 1024)
diff --git a/llvm/test/Transforms/LoopVectorize/uncountable-early-exit-vplan.ll b/llvm/test/Transforms/LoopVectorize/uncountable-early-exit-vplan.ll
index 00c46f4896431..3ded8b6ee6c40 100644
--- a/llvm/test/Transforms/LoopVectorize/uncountable-early-exit-vplan.ll
+++ b/llvm/test/Transforms/LoopVectorize/uncountable-early-exit-vplan.ll
@@ -1,4 +1,3 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -p loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -S -debug %s 2>&1 | FileCheck %s
; REQUIRES: asserts
@@ -24,7 +23,7 @@ define i64 @multi_exiting_to_different_exits_live_in_exit_values() {
; CHECK-NEXT: <x1> vector loop: {
; CHECK-NEXT: vector.body:
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<%index.next>
-; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]
+; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
; CHECK-NEXT: CLONE ir<%gep.src> = getelementptr inbounds ir<%src>, vp<[[STEPS]]>
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer inbounds ir<%gep.src>
; CHECK-NEXT: WIDEN ir<%l> = load vp<[[VEC_PTR]]>
@@ -32,14 +31,9 @@ define i64 @multi_exiting_to_different_exits_live_in_exit_values() {
; CHECK-NEXT: EMIT vp<%index.next> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>
; CHECK-NEXT: EMIT vp<[[EA_TAKEN:%.+]]> = any-of ir<%c.1>
; CHECK-NEXT: EMIT vp<[[LATCH_CMP:%.+]]> = icmp eq vp<%index.next>, vp<[[VTC]]>
-; CHECK-NEXT: EMIT vp<[[EC:%.+]]> = or vp<[[EA_TAKEN]]>, vp<[[LATCH_CMP]]>
-; CHECK-NEXT: EMIT branch-on-cond vp<[[EC]]>
+; CHECK-NEXT: EMIT branch-on-multi-cond vp<[[EA_TAKEN]]>, vp<[[LATCH_CMP]]>
; CHECK-NEXT: No successors
; CHECK-NEXT: }
-; CHECK-NEXT: Successor(s): middle.split
-; CHECK-EMPTY:
-; CHECK-NEXT: middle.split:
-; CHECK-NEXT: EMIT branch-on-cond vp<[[EA_TAKEN]]>
; CHECK-NEXT: Successor(s): vector.early.exit, middle.block
; CHECK-EMPTY:
; CHECK-NEXT: middle.block:
@@ -60,7 +54,7 @@ define i64 @multi_exiting_to_different_exits_live_in_exit_values() {
; CHECK-EMPTY:
; CHECK-NEXT: scalar.ph:
; CHECK-NEXT: EMIT-SCALAR vp<[[RESUME:%.+]]> = phi [ vp<[[VTC]]>, middle.block ], [ ir<0>, ir-bb<entry> ]
-; CHECK-NEXT: ir-bb<loop.header>
+; CHECK-NEXT: Successor(s): ir-bb<loop.header>
; CHECK-EMPTY:
; CHECK-NEXT: ir-bb<loop.header>:
; CHECK-NEXT: IR %iv = phi i64 [ %inc, %loop.latch ], [ 0, %entry ] (extra operand: vp<[[RESUME]]> from scalar.ph)
@@ -119,14 +113,9 @@ define i64 @multi_exiting_to_same_exit_live_in_exit_values() {
; CHECK-NEXT: EMIT vp<%index.next> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>
; CHECK-NEXT: EMIT vp<[[EA_TAKEN:%.+]]> = any-of ir<%c.1>
; CHECK-NEXT: EMIT vp<[[LATCH_CMP:%.+]]> = icmp eq vp<%index.next>, vp<[[VTC]]>
-; CHECK-NEXT: EMIT vp<[[EC:%.+]]> = or vp<[[EA_TAKEN]]>, vp<[[LATCH_CMP]]>
-; CHECK-NEXT: EMIT branch-on-cond vp<[[EC]]>
+; CHECK-NEXT: EMIT branch-on-multi-cond vp<[[EA_TAKEN]]>, vp<[[LATCH_CMP]]>
; CHECK-NEXT: No successors
; CHECK-NEXT: }
-; CHECK-NEXT: Successor(s): middle.split
-; CHECK-EMPTY:
-; CHECK-NEXT: middle.split:
-; CHECK-NEXT: EMIT branch-on-cond vp<[[EA_TAKEN]]>
; CHECK-NEXT: Successor(s): vector.early.exit, middle.block
; CHECK-EMPTY:
; CHECK-NEXT: middle.block:
@@ -143,7 +132,7 @@ define i64 @multi_exiting_to_same_exit_live_in_exit_values() {
; CHECK-EMPTY:
; CHECK-NEXT: scalar.ph:
; CHECK-NEXT: EMIT-SCALAR vp<[[RESUME:%.+]]> = phi [ vp<[[VTC]]>, middle.block ], [ ir<0>, ir-bb<entry> ]
-; CHECK-NEXT: ir-bb<loop.header>
+; CHECK-NEXT: Successor(s): ir-bb<loop.header>
; CHECK-EMPTY:
; CHECK-NEXT: ir-bb<loop.header>:
; CHECK-NEXT: IR %iv = phi i64 [ %inc, %loop.latch ], [ 0, %entry ] (extra operand: vp<[[RESUME]]> from scalar.ph)
@@ -199,14 +188,9 @@ define i64 @multi_exiting_to_same_exit_live_in_exit_values_2() {
; CHECK-NEXT: EMIT vp<%index.next> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>
; CHECK-NEXT: EMIT vp<[[EA_TAKEN:%.+]]> = any-of ir<%c.1>
; CHECK-NEXT: EMIT vp<[[LATCH_CMP:%.+]]> = icmp eq vp<%index.next>, vp<[[VTC]]>
-; CHECK-NEXT: EMIT vp<[[EC:%.+]]> = or vp<[[EA_TAKEN]]>, vp<[[LATCH_CMP]]>
-; CHECK-NEXT: EMIT branch-on-cond vp<[[EC]]>
+; CHECK-NEXT: EMIT branch-on-multi-cond vp<[[EA_TAKEN]]>, vp<[[LATCH_CMP]]>
; CHECK-NEXT: No successors
; CHECK-NEXT: }
-; CHECK-NEXT: Successor(s): middle.split
-; CHECK-EMPTY:
-; CHECK-NEXT: middle.split:
-; CHECK-NEXT: EMIT branch-on-cond vp<[[EA_TAKEN]]>
; CHECK-NEXT: Successor(s): vector.early.exit, middle.block
; CHECK-EMPTY:
; CHECK-NEXT: middle.block:
@@ -218,12 +202,12 @@ define i64 @multi_exiting_to_same_exit_live_in_exit_values_2() {
; CHECK-NEXT: Successor(s): ir-bb<exit>
; CHECK-EMPTY:
; CHECK-NEXT: ir-bb<exit>:
-; CHECK-NEXT: IR %p = phi i64 [ 0, %loop.header ], [ 1, %loop.latch ] (extra operands: ir<1> from middle.block, ir<0> from vector.early.exit)
+; CHECK-NEXT: IR %p = phi i64 [ 0, %loop.header ], [ 1, %loop.latch ] (extra operands: ir<0> from middle.block, ir<1> from vector.early.exit)
; CHECK-NEXT: No successors
; CHECK-EMPTY:
; CHECK-NEXT: scalar.ph:
; CHECK-NEXT: EMIT-SCALAR vp<[[RESUME:%.+]]> = phi [ vp<[[VTC]]>, middle.block ], [ ir<0>, ir-bb<entry> ]
-; CHECK-NEXT: ir-bb<loop.header>
+; CHECK-NEXT: Successor(s): ir-bb<loop.header>
; CHECK-EMPTY:
; CHECK-NEXT: ir-bb<loop.header>:
; CHECK-NEXT: IR %iv = phi i64 [ %inc, %loop.latch ], [ 0, %entry ] (extra operand: vp<[[RESUME]]> from scalar.ph)
diff --git a/llvm/test/Transforms/LoopVectorize/vector-loop-backedge-elimination-early-exit.ll b/llvm/test/Transforms/LoopVectorize/vector-loop-backedge-elimination-early-exit.ll
index 90fbf7426514f..b6644ef2d6b8b 100644
--- a/llvm/test/Transforms/LoopVectorize/vector-loop-backedge-elimination-early-exit.ll
+++ b/llvm/test/Transforms/LoopVectorize/vector-loop-backedge-elimination-early-exit.ll
@@ -15,7 +15,7 @@ define i8 @test_early_exit_max_tc_less_than_16(ptr dereferenceable(16) %A) nosyn
; VF8UF1: [[VECTOR_PH]]:
; VF8UF1-NEXT: br label %[[VECTOR_BODY:.*]]
; VF8UF1: [[VECTOR_BODY]]:
-; VF8UF1-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
+; VF8UF1-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
; VF8UF1-NEXT: [[P_SRC:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]
; VF8UF1-NEXT: [[WIDE_LOAD:%.*]] = load <8 x i8>, ptr [[P_SRC]], align 1
; VF8UF1-NEXT: [[TMP3:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD]], zeroinitializer
@@ -23,10 +23,9 @@ define i8 @test_early_exit_max_tc_less_than_16(ptr dereferenceable(16) %A) nosyn
; VF8UF1-NEXT: [[TMP2:%.*]] = freeze <8 x i1> [[TMP3]]
; VF8UF1-NEXT: [[TMP4:%.*]] = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> [[TMP2]])
; VF8UF1-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16
-; VF8UF1-NEXT: [[TMP6:%.*]] = or i1 [[TMP4]], [[TMP5]]
-; VF8UF1-NEXT: br i1 [[TMP6]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
-; VF8UF1: [[MIDDLE_SPLIT]]:
-; VF8UF1-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; VF8UF1-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; VF8UF1: [[VECTOR_BODY_MULTI_COND_1]]:
+; VF8UF1-NEXT: br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
; VF8UF1: [[MIDDLE_BLOCK]]:
; VF8UF1-NEXT: br label %[[EXIT:.*]]
; VF8UF1: [[VECTOR_EARLY_EXIT]]:
@@ -42,18 +41,22 @@ define i8 @test_early_exit_max_tc_less_than_16(ptr dereferenceable(16) %A) nosyn
; VF8UF2: [[VECTOR_PH]]:
; VF8UF2-NEXT: br label %[[VECTOR_BODY:.*]]
; VF8UF2: [[VECTOR_BODY]]:
-; VF8UF2-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 8
-; VF8UF2-NEXT: [[WIDE_LOAD:%.*]] = load <8 x i8>, ptr [[A]], align 1
+; VF8UF2-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; VF8UF2-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]
+; VF8UF2-NEXT: [[TMP7:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 8
; VF8UF2-NEXT: [[WIDE_LOAD1:%.*]] = load <8 x i8>, ptr [[TMP0]], align 1
-; VF8UF2-NEXT: [[TMP1:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD]], zeroinitializer
-; VF8UF2-NEXT: [[TMP2:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD1]], zeroinitializer
+; VF8UF2-NEXT: [[WIDE_LOAD2:%.*]] = load <8 x i8>, ptr [[TMP7]], align 1
+; VF8UF2-NEXT: [[TMP1:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD1]], zeroinitializer
+; VF8UF2-NEXT: [[TMP2:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD2]], zeroinitializer
+; VF8UF2-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 16
; VF8UF2-NEXT: [[TMP6:%.*]] = freeze <8 x i1> [[TMP1]]
; VF8UF2-NEXT: [[TMP5:%.*]] = freeze <8 x i1> [[TMP2]]
; VF8UF2-NEXT: [[TMP3:%.*]] = or <8 x i1> [[TMP6]], [[TMP5]]
; VF8UF2-NEXT: [[TMP4:%.*]] = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> [[TMP3]])
-; VF8UF2-NEXT: br label %[[MIDDLE_SPLIT:.*]]
-; VF8UF2: [[MIDDLE_SPLIT]]:
-; VF8UF2-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; VF8UF2-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16
+; VF8UF2-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; VF8UF2: [[VECTOR_BODY_MULTI_COND_1]]:
+; VF8UF2-NEXT: br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
; VF8UF2: [[MIDDLE_BLOCK]]:
; VF8UF2-NEXT: br label %[[EXIT:.*]]
; VF8UF2: [[VECTOR_EARLY_EXIT]]:
@@ -69,13 +72,17 @@ define i8 @test_early_exit_max_tc_less_than_16(ptr dereferenceable(16) %A) nosyn
; VF16UF1: [[VECTOR_PH]]:
; VF16UF1-NEXT: br label %[[VECTOR_BODY:.*]]
; VF16UF1: [[VECTOR_BODY]]:
-; VF16UF1-NEXT: [[WIDE_LOAD:%.*]] = load <16 x i8>, ptr [[A]], align 1
+; VF16UF1-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; VF16UF1-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]
+; VF16UF1-NEXT: [[WIDE_LOAD:%.*]] = load <16 x i8>, ptr [[TMP0]], align 1
; VF16UF1-NEXT: [[TMP3:%.*]] = icmp eq <16 x i8> [[WIDE_LOAD]], zeroinitializer
+; VF16UF1-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 16
; VF16UF1-NEXT: [[TMP1:%.*]] = freeze <16 x i1> [[TMP3]]
; VF16UF1-NEXT: [[TMP2:%.*]] = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> [[TMP1]])
-; VF16UF1-NEXT: br label %[[MIDDLE_SPLIT:.*]]
-; VF16UF1: [[MIDDLE_SPLIT]]:
-; VF16UF1-NEXT: br i1 [[TMP2]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; VF16UF1-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16
+; VF16UF1-NEXT: br i1 [[TMP2]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; VF16UF1: [[VECTOR_BODY_MULTI_COND_1]]:
+; VF16UF1-NEXT: br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
; VF16UF1: [[MIDDLE_BLOCK]]:
; VF16UF1-NEXT: br label %[[EXIT:.*]]
; VF16UF1: [[VECTOR_EARLY_EXIT]]:
@@ -112,7 +119,7 @@ define i64 @test_early_exit_max_tc_less_than_16_with_iv_used_outside(ptr derefer
; VF8UF1: [[VECTOR_PH]]:
; VF8UF1-NEXT: br label %[[VECTOR_BODY:.*]]
; VF8UF1: [[VECTOR_BODY]]:
-; VF8UF1-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
+; VF8UF1-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
; VF8UF1-NEXT: [[P_SRC:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]
; VF8UF1-NEXT: [[WIDE_LOAD:%.*]] = load <8 x i8>, ptr [[P_SRC]], align 1
; VF8UF1-NEXT: [[TMP3:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD]], zeroinitializer
@@ -120,10 +127,9 @@ define i64 @test_early_exit_max_tc_less_than_16_with_iv_used_outside(ptr derefer
; VF8UF1-NEXT: [[TMP2:%.*]] = freeze <8 x i1> [[TMP3]]
; VF8UF1-NEXT: [[TMP4:%.*]] = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> [[TMP2]])
; VF8UF1-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16
-; VF8UF1-NEXT: [[TMP6:%.*]] = or i1 [[TMP4]], [[TMP5]]
-; VF8UF1-NEXT: br i1 [[TMP6]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
-; VF8UF1: [[MIDDLE_SPLIT]]:
-; VF8UF1-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; VF8UF1-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; VF8UF1: [[VECTOR_BODY_MULTI_COND_1]]:
+; VF8UF1-NEXT: br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
; VF8UF1: [[MIDDLE_BLOCK]]:
; VF8UF1-NEXT: br label %[[EXIT:.*]]
; VF8UF1: [[VECTOR_EARLY_EXIT]]:
@@ -141,18 +147,22 @@ define i64 @test_early_exit_max_tc_less_than_16_with_iv_used_outside(ptr derefer
; VF8UF2: [[VECTOR_PH]]:
; VF8UF2-NEXT: br label %[[VECTOR_BODY:.*]]
; VF8UF2: [[VECTOR_BODY]]:
-; VF8UF2-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 8
-; VF8UF2-NEXT: [[WIDE_LOAD:%.*]] = load <8 x i8>, ptr [[A]], align 1
+; VF8UF2-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; VF8UF2-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]
+; VF8UF2-NEXT: [[TMP12:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 8
; VF8UF2-NEXT: [[WIDE_LOAD1:%.*]] = load <8 x i8>, ptr [[TMP0]], align 1
-; VF8UF2-NEXT: [[TMP1:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD]], zeroinitializer
-; VF8UF2-NEXT: [[TMP2:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD1]], zeroinitializer
+; VF8UF2-NEXT: [[WIDE_LOAD2:%.*]] = load <8 x i8>, ptr [[TMP12]], align 1
+; VF8UF2-NEXT: [[TMP1:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD1]], zeroinitializer
+; VF8UF2-NEXT: [[TMP2:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD2]], zeroinitializer
+; VF8UF2-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 16
; VF8UF2-NEXT: [[TMP13:%.*]] = freeze <8 x i1> [[TMP1]]
; VF8UF2-NEXT: [[TMP6:%.*]] = freeze <8 x i1> [[TMP2]]
; VF8UF2-NEXT: [[TMP3:%.*]] = or <8 x i1> [[TMP13]], [[TMP6]]
; VF8UF2-NEXT: [[TMP4:%.*]] = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> [[TMP3]])
-; VF8UF2-NEXT: br label %[[MIDDLE_SPLIT:.*]]
-; VF8UF2: [[MIDDLE_SPLIT]]:
-; VF8UF2-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; VF8UF2-NEXT: [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16
+; VF8UF2-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; VF8UF2: [[VECTOR_BODY_MULTI_COND_1]]:
+; VF8UF2-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
; VF8UF2: [[MIDDLE_BLOCK]]:
; VF8UF2-NEXT: br label %[[EXIT:.*]]
; VF8UF2: [[VECTOR_EARLY_EXIT]]:
@@ -162,9 +172,10 @@ define i64 @test_early_exit_max_tc_less_than_16_with_iv_used_outside(ptr derefer
; VF8UF2-NEXT: [[TMP9:%.*]] = add i64 0, [[TMP8]]
; VF8UF2-NEXT: [[TMP10:%.*]] = icmp ne i64 [[TMP8]], 8
; VF8UF2-NEXT: [[TMP11:%.*]] = select i1 [[TMP10]], i64 [[TMP9]], i64 [[TMP7]]
+; VF8UF2-NEXT: [[TMP15:%.*]] = add i64 [[INDEX]], [[TMP11]]
; VF8UF2-NEXT: br label %[[EXIT]]
; VF8UF2: [[EXIT]]:
-; VF8UF2-NEXT: [[RES:%.*]] = phi i64 [ [[TMP11]], %[[VECTOR_EARLY_EXIT]] ], [ 1, %[[MIDDLE_BLOCK]] ]
+; VF8UF2-NEXT: [[RES:%.*]] = phi i64 [ [[TMP15]], %[[VECTOR_EARLY_EXIT]] ], [ 1, %[[MIDDLE_BLOCK]] ]
; VF8UF2-NEXT: ret i64 [[RES]]
;
; VF16UF1-LABEL: define i64 @test_early_exit_max_tc_less_than_16_with_iv_used_outside(
@@ -174,20 +185,25 @@ define i64 @test_early_exit_max_tc_less_than_16_with_iv_used_outside(ptr derefer
; VF16UF1: [[VECTOR_PH]]:
; VF16UF1-NEXT: br label %[[VECTOR_BODY:.*]]
; VF16UF1: [[VECTOR_BODY]]:
-; VF16UF1-NEXT: [[WIDE_LOAD:%.*]] = load <16 x i8>, ptr [[A]], align 1
+; VF16UF1-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; VF16UF1-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]
+; VF16UF1-NEXT: [[WIDE_LOAD:%.*]] = load <16 x i8>, ptr [[TMP0]], align 1
; VF16UF1-NEXT: [[TMP3:%.*]] = icmp eq <16 x i8> [[WIDE_LOAD]], zeroinitializer
+; VF16UF1-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 16
; VF16UF1-NEXT: [[TMP1:%.*]] = freeze <16 x i1> [[TMP3]]
; VF16UF1-NEXT: [[TMP2:%.*]] = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> [[TMP1]])
-; VF16UF1-NEXT: br label %[[MIDDLE_SPLIT:.*]]
-; VF16UF1: [[MIDDLE_SPLIT]]:
-; VF16UF1-NEXT: br i1 [[TMP2]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; VF16UF1-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16
+; VF16UF1-NEXT: br i1 [[TMP2]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; VF16UF1: [[VECTOR_BODY_MULTI_COND_1]]:
+; VF16UF1-NEXT: br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
; VF16UF1: [[MIDDLE_BLOCK]]:
; VF16UF1-NEXT: br label %[[EXIT:.*]]
; VF16UF1: [[VECTOR_EARLY_EXIT]]:
; VF16UF1-NEXT: [[FIRST_ACTIVE_LANE:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v16i1(<16 x i1> [[TMP3]], i1 false)
+; VF16UF1-NEXT: [[TMP6:%.*]] = add i64 [[INDEX]], [[FIRST_ACTIVE_LANE]]
; VF16UF1-NEXT: br label %[[EXIT]]
; VF16UF1: [[EXIT]]:
-; VF16UF1-NEXT: [[RES:%.*]] = phi i64 [ [[FIRST_ACTIVE_LANE]], %[[VECTOR_EARLY_EXIT]] ], [ 1, %[[MIDDLE_BLOCK]] ]
+; VF16UF1-NEXT: [[RES:%.*]] = phi i64 [ [[TMP6]], %[[VECTOR_EARLY_EXIT]] ], [ 1, %[[MIDDLE_BLOCK]] ]
; VF16UF1-NEXT: ret i64 [[RES]]
;
entry:
@@ -218,7 +234,7 @@ define i8 @test_early_exit_max_vector_tc_eq_16(ptr dereferenceable(17) %A) nosyn
; VF8UF1: [[VECTOR_PH]]:
; VF8UF1-NEXT: br label %[[VECTOR_BODY:.*]]
; VF8UF1: [[VECTOR_BODY]]:
-; VF8UF1-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
+; VF8UF1-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
; VF8UF1-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]
; VF8UF1-NEXT: [[WIDE_LOAD:%.*]] = load <8 x i8>, ptr [[TMP0]], align 1
; VF8UF1-NEXT: [[TMP1:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD]], zeroinitializer
@@ -226,10 +242,9 @@ define i8 @test_early_exit_max_vector_tc_eq_16(ptr dereferenceable(17) %A) nosyn
; VF8UF1-NEXT: [[TMP5:%.*]] = freeze <8 x i1> [[TMP1]]
; VF8UF1-NEXT: [[TMP2:%.*]] = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> [[TMP5]])
; VF8UF1-NEXT: [[TMP3:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16
-; VF8UF1-NEXT: [[TMP4:%.*]] = or i1 [[TMP2]], [[TMP3]]
-; VF8UF1-NEXT: br i1 [[TMP4]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
-; VF8UF1: [[MIDDLE_SPLIT]]:
-; VF8UF1-NEXT: br i1 [[TMP2]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; VF8UF1-NEXT: br i1 [[TMP2]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; VF8UF1: [[VECTOR_BODY_MULTI_COND_1]]:
+; VF8UF1-NEXT: br i1 [[TMP3]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
; VF8UF1: [[MIDDLE_BLOCK]]:
; VF8UF1-NEXT: br label %[[SCALAR_PH:.*]]
; VF8UF1: [[VECTOR_EARLY_EXIT]]:
@@ -257,18 +272,22 @@ define i8 @test_early_exit_max_vector_tc_eq_16(ptr dereferenceable(17) %A) nosyn
; VF8UF2: [[VECTOR_PH]]:
; VF8UF2-NEXT: br label %[[VECTOR_BODY:.*]]
; VF8UF2: [[VECTOR_BODY]]:
-; VF8UF2-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 8
-; VF8UF2-NEXT: [[WIDE_LOAD:%.*]] = load <8 x i8>, ptr [[A]], align 1
+; VF8UF2-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; VF8UF2-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]
+; VF8UF2-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8, ptr [[TMP1]], i64 8
; VF8UF2-NEXT: [[WIDE_LOAD1:%.*]] = load <8 x i8>, ptr [[TMP1]], align 1
-; VF8UF2-NEXT: [[TMP2:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD]], zeroinitializer
-; VF8UF2-NEXT: [[TMP3:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD1]], zeroinitializer
+; VF8UF2-NEXT: [[WIDE_LOAD2:%.*]] = load <8 x i8>, ptr [[TMP9]], align 1
+; VF8UF2-NEXT: [[TMP2:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD1]], zeroinitializer
+; VF8UF2-NEXT: [[TMP3:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD2]], zeroinitializer
+; VF8UF2-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 16
; VF8UF2-NEXT: [[TMP7:%.*]] = freeze <8 x i1> [[TMP2]]
; VF8UF2-NEXT: [[TMP6:%.*]] = freeze <8 x i1> [[TMP3]]
; VF8UF2-NEXT: [[TMP4:%.*]] = or <8 x i1> [[TMP7]], [[TMP6]]
; VF8UF2-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> [[TMP4]])
-; VF8UF2-NEXT: br label %[[MIDDLE_SPLIT:.*]]
-; VF8UF2: [[MIDDLE_SPLIT]]:
-; VF8UF2-NEXT: br i1 [[TMP5]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; VF8UF2-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16
+; VF8UF2-NEXT: br i1 [[TMP5]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; VF8UF2: [[VECTOR_BODY_MULTI_COND_1]]:
+; VF8UF2-NEXT: br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
; VF8UF2: [[MIDDLE_BLOCK]]:
; VF8UF2-NEXT: br label %[[SCALAR_PH:.*]]
; VF8UF2: [[VECTOR_EARLY_EXIT]]:
@@ -284,7 +303,7 @@ define i8 @test_early_exit_max_vector_tc_eq_16(ptr dereferenceable(17) %A) nosyn
; VF8UF2: [[LOOP_LATCH]]:
; VF8UF2-NEXT: [[IV_NEXT]] = add nsw i64 [[IV]], 1
; VF8UF2-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], 17
-; VF8UF2-NEXT: br i1 [[CMP]], label %[[EXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP0:![0-9]+]]
+; VF8UF2-NEXT: br i1 [[CMP]], label %[[EXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP5:![0-9]+]]
; VF8UF2: [[EXIT]]:
; VF8UF2-NEXT: [[RES:%.*]] = phi i8 [ 0, %[[LOOP_HEADER]] ], [ 1, %[[LOOP_LATCH]] ], [ 0, %[[VECTOR_EARLY_EXIT]] ]
; VF8UF2-NEXT: ret i8 [[RES]]
@@ -296,13 +315,17 @@ define i8 @test_early_exit_max_vector_tc_eq_16(ptr dereferenceable(17) %A) nosyn
; VF16UF1: [[VECTOR_PH]]:
; VF16UF1-NEXT: br label %[[VECTOR_BODY:.*]]
; VF16UF1: [[VECTOR_BODY]]:
-; VF16UF1-NEXT: [[WIDE_LOAD:%.*]] = load <16 x i8>, ptr [[A]], align 1
+; VF16UF1-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; VF16UF1-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]
+; VF16UF1-NEXT: [[WIDE_LOAD:%.*]] = load <16 x i8>, ptr [[TMP0]], align 1
; VF16UF1-NEXT: [[TMP1:%.*]] = icmp eq <16 x i8> [[WIDE_LOAD]], zeroinitializer
+; VF16UF1-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 16
; VF16UF1-NEXT: [[TMP3:%.*]] = freeze <16 x i1> [[TMP1]]
; VF16UF1-NEXT: [[TMP2:%.*]] = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> [[TMP3]])
-; VF16UF1-NEXT: br label %[[MIDDLE_SPLIT:.*]]
-; VF16UF1: [[MIDDLE_SPLIT]]:
-; VF16UF1-NEXT: br i1 [[TMP2]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; VF16UF1-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16
+; VF16UF1-NEXT: br i1 [[TMP2]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
+; VF16UF1: [[VECTOR_BODY_MULTI_COND_1]]:
+; VF16UF1-NEXT: br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
; VF16UF1: [[MIDDLE_BLOCK]]:
; VF16UF1-NEXT: br label %[[SCALAR_PH:.*]]
; VF16UF1: [[VECTOR_EARLY_EXIT]]:
@@ -318,7 +341,7 @@ define i8 @test_early_exit_max_vector_tc_eq_16(ptr dereferenceable(17) %A) nosyn
; VF16UF1: [[LOOP_LATCH]]:
; VF16UF1-NEXT: [[IV_NEXT]] = add nsw i64 [[IV]], 1
; VF16UF1-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], 17
-; VF16UF1-NEXT: br i1 [[CMP]], label %[[EXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP0:![0-9]+]]
+; VF16UF1-NEXT: br i1 [[CMP]], label %[[EXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP5:![0-9]+]]
; VF16UF1: [[EXIT]]:
; VF16UF1-NEXT: [[RES:%.*]] = phi i8 [ 0, %[[LOOP_HEADER]] ], [ 1, %[[LOOP_LATCH]] ], [ 0, %[[VECTOR_EARLY_EXIT]] ]
; VF16UF1-NEXT: ret i8 [[RES]]
diff --git a/llvm/test/Transforms/PhaseOrdering/AArch64/std-find.ll b/llvm/test/Transforms/PhaseOrdering/AArch64/std-find.ll
index 87ceecaf3ed42..f83964d157359 100644
--- a/llvm/test/Transforms/PhaseOrdering/AArch64/std-find.ll
+++ b/llvm/test/Transforms/PhaseOrdering/AArch64/std-find.ll
@@ -11,30 +11,142 @@ define i64 @std_find_i16_constant_offset_with_assumptions(ptr %first.coerce, i16
; CHECK-NEXT: [[COERCE_VAL_IP:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 256
; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <8 x i16> poison, i16 [[S]], i64 0
; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <8 x i16> [[BROADCAST_SPLATINSERT]], <8 x i16> poison, <8 x i32> zeroinitializer
-; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
-; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
-; CHECK-NEXT: [[OFFSET_IDX:%.*]] = shl i64 [[INDEX]], 1
-; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 [[OFFSET_IDX]]
+; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <8 x i16>, ptr [[FIRST_COERCE]], align 2
+; CHECK-NEXT: [[WIDE_LOAD_FR1:%.*]] = freeze <8 x i16> [[WIDE_LOAD1]]
+; CHECK-NEXT: [[TMP2:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR1]], [[BROADCAST_SPLAT]]
+; CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i1> [[TMP2]] to i8
+; CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq i8 [[TMP3]], 0
+; CHECK-NEXT: br i1 [[DOTNOT]], label %[[VECTOR_BODY_MULTI_COND_1:.*]], label %[[VECTOR_EARLY_EXIT:.*]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
+; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 16
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <8 x i16>, ptr [[NEXT_GEP]], align 2
; CHECK-NEXT: [[WIDE_LOAD_FR:%.*]] = freeze <8 x i16> [[WIDE_LOAD]]
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR]], [[BROADCAST_SPLAT]]
-; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8
; CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i1> [[TMP0]] to i8
-; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i8 [[TMP1]], 0
-; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i64 [[INDEX_NEXT]], 128
-; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[TMP2]], [[TMP3]]
-; CHECK-NEXT: br i1 [[TMP4]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
-; CHECK: [[MIDDLE_SPLIT]]:
-; CHECK-NEXT: br i1 [[TMP2]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[RETURN:.*]]
+; CHECK-NEXT: [[DOTNOT_1:%.*]] = icmp eq i8 [[TMP1]], 0
+; CHECK-NEXT: br i1 [[DOTNOT_1]], label %[[VECTOR_BODY_MULTI_COND_1_1:.*]], label %[[VECTOR_EARLY_EXIT]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1_1]]:
+; CHECK-NEXT: [[NEXT_GEP_2:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 32
+; CHECK-NEXT: [[WIDE_LOAD_2:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_2]], align 2
+; CHECK-NEXT: [[WIDE_LOAD_FR_2:%.*]] = freeze <8 x i16> [[WIDE_LOAD_2]]
+; CHECK-NEXT: [[TMP4:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_2]], [[BROADCAST_SPLAT]]
+; CHECK-NEXT: [[TMP5:%.*]] = bitcast <8 x i1> [[TMP4]] to i8
+; CHECK-NEXT: [[DOTNOT_2:%.*]] = icmp eq i8 [[TMP5]], 0
+; CHECK-NEXT: br i1 [[DOTNOT_2]], label %[[VECTOR_BODY_MULTI_COND_1_2:.*]], label %[[VECTOR_EARLY_EXIT]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1_2]]:
+; CHECK-NEXT: [[NEXT_GEP_3:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 48
+; CHECK-NEXT: [[WIDE_LOAD_3:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_3]], align 2
+; CHECK-NEXT: [[WIDE_LOAD_FR_3:%.*]] = freeze <8 x i16> [[WIDE_LOAD_3]]
+; CHECK-NEXT: [[TMP6:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_3]], [[BROADCAST_SPLAT]]
+; CHECK-NEXT: [[TMP7:%.*]] = bitcast <8 x i1> [[TMP6]] to i8
+; CHECK-NEXT: [[DOTNOT_3:%.*]] = icmp eq i8 [[TMP7]], 0
+; CHECK-NEXT: br i1 [[DOTNOT_3]], label %[[VECTOR_BODY_MULTI_COND_1_3:.*]], label %[[VECTOR_EARLY_EXIT]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1_3]]:
+; CHECK-NEXT: [[NEXT_GEP_4:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 64
+; CHECK-NEXT: [[WIDE_LOAD_4:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_4]], align 2
+; CHECK-NEXT: [[WIDE_LOAD_FR_4:%.*]] = freeze <8 x i16> [[WIDE_LOAD_4]]
+; CHECK-NEXT: [[TMP8:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_4]], [[BROADCAST_SPLAT]]
+; CHECK-NEXT: [[TMP9:%.*]] = bitcast <8 x i1> [[TMP8]] to i8
+; CHECK-NEXT: [[DOTNOT_4:%.*]] = icmp eq i8 [[TMP9]], 0
+; CHECK-NEXT: br i1 [[DOTNOT_4]], label %[[VECTOR_BODY_MULTI_COND_1_4:.*]], label %[[VECTOR_EARLY_EXIT]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1_4]]:
+; CHECK-NEXT: [[NEXT_GEP_5:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 80
+; CHECK-NEXT: [[WIDE_LOAD_5:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_5]], align 2
+; CHECK-NEXT: [[WIDE_LOAD_FR_5:%.*]] = freeze <8 x i16> [[WIDE_LOAD_5]]
+; CHECK-NEXT: [[TMP10:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_5]], [[BROADCAST_SPLAT]]
+; CHECK-NEXT: [[TMP11:%.*]] = bitcast <8 x i1> [[TMP10]] to i8
+; CHECK-NEXT: [[DOTNOT_5:%.*]] = icmp eq i8 [[TMP11]], 0
+; CHECK-NEXT: br i1 [[DOTNOT_5]], label %[[VECTOR_BODY_MULTI_COND_1_5:.*]], label %[[VECTOR_EARLY_EXIT]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1_5]]:
+; CHECK-NEXT: [[NEXT_GEP_6:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 96
+; CHECK-NEXT: [[WIDE_LOAD_6:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_6]], align 2
+; CHECK-NEXT: [[WIDE_LOAD_FR_6:%.*]] = freeze <8 x i16> [[WIDE_LOAD_6]]
+; CHECK-NEXT: [[TMP12:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_6]], [[BROADCAST_SPLAT]]
+; CHECK-NEXT: [[TMP13:%.*]] = bitcast <8 x i1> [[TMP12]] to i8
+; CHECK-NEXT: [[DOTNOT_6:%.*]] = icmp eq i8 [[TMP13]], 0
+; CHECK-NEXT: br i1 [[DOTNOT_6]], label %[[VECTOR_BODY_MULTI_COND_1_6:.*]], label %[[VECTOR_EARLY_EXIT]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1_6]]:
+; CHECK-NEXT: [[NEXT_GEP_7:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 112
+; CHECK-NEXT: [[WIDE_LOAD_7:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_7]], align 2
+; CHECK-NEXT: [[WIDE_LOAD_FR_7:%.*]] = freeze <8 x i16> [[WIDE_LOAD_7]]
+; CHECK-NEXT: [[TMP14:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_7]], [[BROADCAST_SPLAT]]
+; CHECK-NEXT: [[TMP15:%.*]] = bitcast <8 x i1> [[TMP14]] to i8
+; CHECK-NEXT: [[DOTNOT_7:%.*]] = icmp eq i8 [[TMP15]], 0
+; CHECK-NEXT: br i1 [[DOTNOT_7]], label %[[VECTOR_BODY_MULTI_COND_1_7:.*]], label %[[VECTOR_EARLY_EXIT]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1_7]]:
+; CHECK-NEXT: [[NEXT_GEP_8:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 128
+; CHECK-NEXT: [[WIDE_LOAD_8:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_8]], align 2
+; CHECK-NEXT: [[WIDE_LOAD_FR_8:%.*]] = freeze <8 x i16> [[WIDE_LOAD_8]]
+; CHECK-NEXT: [[TMP16:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_8]], [[BROADCAST_SPLAT]]
+; CHECK-NEXT: [[TMP17:%.*]] = bitcast <8 x i1> [[TMP16]] to i8
+; CHECK-NEXT: [[DOTNOT_8:%.*]] = icmp eq i8 [[TMP17]], 0
+; CHECK-NEXT: br i1 [[DOTNOT_8]], label %[[VECTOR_BODY_MULTI_COND_1_8:.*]], label %[[VECTOR_EARLY_EXIT]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1_8]]:
+; CHECK-NEXT: [[NEXT_GEP_9:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 144
+; CHECK-NEXT: [[WIDE_LOAD_9:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_9]], align 2
+; CHECK-NEXT: [[WIDE_LOAD_FR_9:%.*]] = freeze <8 x i16> [[WIDE_LOAD_9]]
+; CHECK-NEXT: [[TMP18:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_9]], [[BROADCAST_SPLAT]]
+; CHECK-NEXT: [[TMP19:%.*]] = bitcast <8 x i1> [[TMP18]] to i8
+; CHECK-NEXT: [[DOTNOT_9:%.*]] = icmp eq i8 [[TMP19]], 0
+; CHECK-NEXT: br i1 [[DOTNOT_9]], label %[[VECTOR_BODY_MULTI_COND_1_9:.*]], label %[[VECTOR_EARLY_EXIT]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1_9]]:
+; CHECK-NEXT: [[NEXT_GEP_10:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 160
+; CHECK-NEXT: [[WIDE_LOAD_10:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_10]], align 2
+; CHECK-NEXT: [[WIDE_LOAD_FR_10:%.*]] = freeze <8 x i16> [[WIDE_LOAD_10]]
+; CHECK-NEXT: [[TMP20:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_10]], [[BROADCAST_SPLAT]]
+; CHECK-NEXT: [[TMP21:%.*]] = bitcast <8 x i1> [[TMP20]] to i8
+; CHECK-NEXT: [[DOTNOT_10:%.*]] = icmp eq i8 [[TMP21]], 0
+; CHECK-NEXT: br i1 [[DOTNOT_10]], label %[[VECTOR_BODY_MULTI_COND_1_10:.*]], label %[[VECTOR_EARLY_EXIT]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1_10]]:
+; CHECK-NEXT: [[NEXT_GEP_11:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 176
+; CHECK-NEXT: [[WIDE_LOAD_11:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_11]], align 2
+; CHECK-NEXT: [[WIDE_LOAD_FR_11:%.*]] = freeze <8 x i16> [[WIDE_LOAD_11]]
+; CHECK-NEXT: [[TMP22:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_11]], [[BROADCAST_SPLAT]]
+; CHECK-NEXT: [[TMP23:%.*]] = bitcast <8 x i1> [[TMP22]] to i8
+; CHECK-NEXT: [[DOTNOT_11:%.*]] = icmp eq i8 [[TMP23]], 0
+; CHECK-NEXT: br i1 [[DOTNOT_11]], label %[[VECTOR_BODY_MULTI_COND_1_11:.*]], label %[[VECTOR_EARLY_EXIT]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1_11]]:
+; CHECK-NEXT: [[NEXT_GEP_12:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 192
+; CHECK-NEXT: [[WIDE_LOAD_12:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_12]], align 2
+; CHECK-NEXT: [[WIDE_LOAD_FR_12:%.*]] = freeze <8 x i16> [[WIDE_LOAD_12]]
+; CHECK-NEXT: [[TMP24:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_12]], [[BROADCAST_SPLAT]]
+; CHECK-NEXT: [[TMP25:%.*]] = bitcast <8 x i1> [[TMP24]] to i8
+; CHECK-NEXT: [[DOTNOT_12:%.*]] = icmp eq i8 [[TMP25]], 0
+; CHECK-NEXT: br i1 [[DOTNOT_12]], label %[[VECTOR_BODY_MULTI_COND_1_12:.*]], label %[[VECTOR_EARLY_EXIT]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1_12]]:
+; CHECK-NEXT: [[NEXT_GEP_13:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 208
+; CHECK-NEXT: [[WIDE_LOAD_13:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_13]], align 2
+; CHECK-NEXT: [[WIDE_LOAD_FR_13:%.*]] = freeze <8 x i16> [[WIDE_LOAD_13]]
+; CHECK-NEXT: [[TMP26:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_13]], [[BROADCAST_SPLAT]]
+; CHECK-NEXT: [[TMP27:%.*]] = bitcast <8 x i1> [[TMP26]] to i8
+; CHECK-NEXT: [[DOTNOT_13:%.*]] = icmp eq i8 [[TMP27]], 0
+; CHECK-NEXT: br i1 [[DOTNOT_13]], label %[[VECTOR_BODY_MULTI_COND_1_13:.*]], label %[[VECTOR_EARLY_EXIT]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1_13]]:
+; CHECK-NEXT: [[NEXT_GEP_14:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 224
+; CHECK-NEXT: [[WIDE_LOAD_14:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_14]], align 2
+; CHECK-NEXT: [[WIDE_LOAD_FR_14:%.*]] = freeze <8 x i16> [[WIDE_LOAD_14]]
+; CHECK-NEXT: [[TMP28:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_14]], [[BROADCAST_SPLAT]]
+; CHECK-NEXT: [[TMP29:%.*]] = bitcast <8 x i1> [[TMP28]] to i8
+; CHECK-NEXT: [[DOTNOT_14:%.*]] = icmp eq i8 [[TMP29]], 0
+; CHECK-NEXT: br i1 [[DOTNOT_14]], label %[[VECTOR_BODY_MULTI_COND_1_14:.*]], label %[[VECTOR_EARLY_EXIT]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1_14]]:
+; CHECK-NEXT: [[NEXT_GEP_15:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 240
+; CHECK-NEXT: [[WIDE_LOAD_15:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_15]], align 2
+; CHECK-NEXT: [[WIDE_LOAD_FR_15:%.*]] = freeze <8 x i16> [[WIDE_LOAD_15]]
+; CHECK-NEXT: [[TMP30:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_15]], [[BROADCAST_SPLAT]]
+; CHECK-NEXT: [[TMP31:%.*]] = bitcast <8 x i1> [[TMP30]] to i8
+; CHECK-NEXT: [[DOTNOT_15:%.*]] = icmp eq i8 [[TMP31]], 0
+; CHECK-NEXT: br i1 [[DOTNOT_15]], label %[[RETURN:.*]], label %[[VECTOR_EARLY_EXIT]]
; CHECK: [[VECTOR_EARLY_EXIT]]:
-; CHECK-NEXT: [[TMP5:%.*]] = tail call i64 @llvm.experimental.cttz.elts.i64.v8i1(<8 x i1> [[TMP0]], i1 false)
-; CHECK-NEXT: [[TMP6:%.*]] = add i64 [[INDEX]], [[TMP5]]
-; CHECK-NEXT: [[TMP7:%.*]] = shl i64 [[TMP6]], 1
-; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 [[TMP7]]
+; CHECK-NEXT: [[INDEX_LCSSA:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ 8, %[[VECTOR_BODY_MULTI_COND_1]] ], [ 16, %[[VECTOR_BODY_MULTI_COND_1_1]] ], [ 24, %[[VECTOR_BODY_MULTI_COND_1_2]] ], [ 32, %[[VECTOR_BODY_MULTI_COND_1_3]] ], [ 40, %[[VECTOR_BODY_MULTI_COND_1_4]] ], [ 48, %[[VECTOR_BODY_MULTI_COND_1_5]] ], [ 56, %[[VECTOR_BODY_MULTI_COND_1_6]] ], [ 64, %[[VECTOR_BODY_MULTI_COND_1_7]] ], [ 72, %[[VECTOR_BODY_MULTI_COND_1_8]] ], [ 80, %[[VECTOR_BODY_MULTI_COND_1_9]] ], [ 88, %[[VECTOR_BODY_MULTI_COND_1_10]] ], [ 96, %[[VECTOR_BODY_MULTI_COND_1_11]] ], [ 104, %[[VECTOR_BODY_MULTI_COND_1_12]] ], [ 112, %[[VECTOR_BODY_MULTI_COND_1_13]] ], [ 120, %[[VECTOR_BODY_MULTI_COND_1_14]] ]
+; CHECK-NEXT: [[DOTLCSSA:%.*]] = phi <8 x i1> [ [[TMP2]], %[[ENTRY]] ], [ [[TMP0]], %[[VECTOR_BODY_MULTI_COND_1]] ], [ [[TMP4]], %[[VECTOR_BODY_MULTI_COND_1_1]] ], [ [[TMP6]], %[[VECTOR_BODY_MULTI_COND_1_2]] ], [ [[TMP8]], %[[VECTOR_BODY_MULTI_COND_1_3]] ], [ [[TMP10]], %[[VECTOR_BODY_MULTI_COND_1_4]] ], [ [[TMP12]], %[[VECTOR_BODY_MULTI_COND_1_5]] ], [ [[TMP14]], %[[VECTOR_BODY_MULTI_COND_1_6]] ], [ [[TMP16]], %[[VECTOR_BODY_MULTI_COND_1_7]] ], [ [[TMP18]], %[[VECTOR_BODY_MULTI_COND_1_8]] ], [ [[TMP20]], %[[VECTOR_BODY_MULTI_COND_1_9]] ], [ [[TMP22]], %[[VECTOR_BODY_MULTI_COND_1_10]] ], [ [[TMP24]], %[[VECTOR_BODY_MULTI_COND_1_11]] ], [ [[TMP26]], %[[VECTOR_BODY_MULTI_COND_1_12]] ], [ [[TMP28]], %[[VECTOR_BODY_MULTI_COND_1_13]] ], [ [[TMP30]], %[[VECTOR_BODY_MULTI_COND_1_14]] ]
+; CHECK-NEXT: [[TMP32:%.*]] = tail call i64 @llvm.experimental.cttz.elts.i64.v8i1(<8 x i1> [[DOTLCSSA]], i1 false)
+; CHECK-NEXT: [[TMP33:%.*]] = add i64 [[INDEX_LCSSA]], [[TMP32]]
+; CHECK-NEXT: [[TMP34:%.*]] = shl i64 [[TMP33]], 1
+; CHECK-NEXT: [[TMP35:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 [[TMP34]]
; CHECK-NEXT: br label %[[RETURN]]
; CHECK: [[RETURN]]:
-; CHECK-NEXT: [[__FIRST_ADDR_0_LCSSA_I_I_PH:%.*]] = phi ptr [ [[TMP8]], %[[VECTOR_EARLY_EXIT]] ], [ [[COERCE_VAL_IP]], %[[MIDDLE_SPLIT]] ]
+; CHECK-NEXT: [[__FIRST_ADDR_0_LCSSA_I_I_PH:%.*]] = phi ptr [ [[TMP35]], %[[VECTOR_EARLY_EXIT]] ], [ [[COERCE_VAL_IP]], %[[VECTOR_BODY_MULTI_COND_1_14]] ]
; CHECK-NEXT: [[DOTPRE:%.*]] = ptrtoint ptr [[__FIRST_ADDR_0_LCSSA_I_I_PH]] to i64
; CHECK-NEXT: ret i64 [[DOTPRE]]
;
@@ -153,20 +265,19 @@ define ptr @std_find_caller(ptr noundef %first, ptr noundef %last) {
; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[FIRST]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[PROL_ITER_NEXT:%.*]], %[[VECTOR_BODY]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
; CHECK-NEXT: [[OFFSET_IDX1:%.*]] = shl i64 [[INDEX]], 1
; CHECK-NEXT: [[NEXT_GEP1:%.*]] = getelementptr i8, ptr [[FIRST]], i64 [[OFFSET_IDX1]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <8 x i16>, ptr [[NEXT_GEP1]], align 2
; CHECK-NEXT: [[WIDE_LOAD_FR:%.*]] = freeze <8 x i16> [[WIDE_LOAD]]
-; CHECK-NEXT: [[TMP4:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR]], splat (i16 1)
-; CHECK-NEXT: [[PROL_ITER_NEXT]] = add nuw i64 [[INDEX]], 8
-; CHECK-NEXT: [[TMP5:%.*]] = bitcast <8 x i1> [[TMP4]] to i8
-; CHECK-NEXT: [[TMP6:%.*]] = icmp ne i8 [[TMP5]], 0
-; CHECK-NEXT: [[PROL_ITER_CMP_NOT:%.*]] = icmp eq i64 [[PROL_ITER_NEXT]], [[XTRAITER]]
-; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP6]], [[PROL_ITER_CMP_NOT]]
-; CHECK-NEXT: br i1 [[TMP8]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
-; CHECK: [[MIDDLE_SPLIT]]:
-; CHECK-NEXT: br i1 [[TMP6]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
+; CHECK-NEXT: [[TMP6:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR]], splat (i16 1)
+; CHECK-NEXT: [[TMP7:%.*]] = bitcast <8 x i1> [[TMP6]] to i8
+; CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq i8 [[TMP7]], 0
+; CHECK-NEXT: br i1 [[DOTNOT]], label %[[VECTOR_BODY_MULTI_COND_1]], label %[[VECTOR_EARLY_EXIT:.*]]
+; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
+; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8
+; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[XTRAITER]]
+; CHECK-NEXT: br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP3]], [[XTRAITER]]
; CHECK-NEXT: br i1 [[CMP_N]], label %[[STD_FIND_GENERIC_IMPL_EXIT]], label %[[LOOP_HEADER_I_PREHEADER2]]
@@ -174,10 +285,10 @@ define ptr @std_find_caller(ptr noundef %first, ptr noundef %last) {
; CHECK-NEXT: [[PTR_IV_I_PH:%.*]] = phi ptr [ [[FIRST]], %[[LOOP_HEADER_I_PREHEADER]] ], [ [[NEXT_GEP]], %[[MIDDLE_BLOCK]] ]
; CHECK-NEXT: br label %[[LOOP_HEADER_I:.*]]
; CHECK: [[VECTOR_EARLY_EXIT]]:
-; CHECK-NEXT: [[TMP11:%.*]] = tail call i64 @llvm.experimental.cttz.elts.i64.v8i1(<8 x i1> [[TMP4]], i1 false)
-; CHECK-NEXT: [[TMP12:%.*]] = add i64 [[INDEX]], [[TMP11]]
-; CHECK-NEXT: [[TMP13:%.*]] = shl i64 [[TMP12]], 1
-; CHECK-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[FIRST]], i64 [[TMP13]]
+; CHECK-NEXT: [[TMP9:%.*]] = tail call i64 @llvm.experimental.cttz.elts.i64.v8i1(<8 x i1> [[TMP6]], i1 false)
+; CHECK-NEXT: [[TMP10:%.*]] = add i64 [[INDEX]], [[TMP9]]
+; CHECK-NEXT: [[TMP11:%.*]] = shl i64 [[TMP10]], 1
+; CHECK-NEXT: [[TMP12:%.*]] = getelementptr i8, ptr [[FIRST]], i64 [[TMP11]]
; CHECK-NEXT: br label %[[STD_FIND_GENERIC_IMPL_EXIT]]
; CHECK: [[LOOP_HEADER_I]]:
; CHECK-NEXT: [[PTR_IV_I:%.*]] = phi ptr [ [[PTR_IV_NEXT_I:%.*]], %[[LOOP_LATCH_I:.*]] ], [ [[PTR_IV_I_PH]], %[[LOOP_HEADER_I_PREHEADER2]] ]
@@ -187,9 +298,9 @@ define ptr @std_find_caller(ptr noundef %first, ptr noundef %last) {
; CHECK: [[LOOP_LATCH_I]]:
; CHECK-NEXT: [[PTR_IV_NEXT_I]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_I]], i64 2
; CHECK-NEXT: [[EC_I:%.*]] = icmp eq ptr [[PTR_IV_NEXT_I]], [[LAST]]
-; CHECK-NEXT: br i1 [[EC_I]], label %[[STD_FIND_GENERIC_IMPL_EXIT]], label %[[LOOP_HEADER_I]], !llvm.loop [[LOOP4:![0-9]+]]
+; CHECK-NEXT: br i1 [[EC_I]], label %[[STD_FIND_GENERIC_IMPL_EXIT]], label %[[LOOP_HEADER_I]], !llvm.loop [[LOOP3:![0-9]+]]
; CHECK: [[STD_FIND_GENERIC_IMPL_EXIT]]:
-; CHECK-NEXT: [[RES_I:%.*]] = phi ptr [ [[FIRST]], %[[ENTRY]] ], [ [[SCEVGEP]], %[[MIDDLE_BLOCK]] ], [ [[TMP14]], %[[VECTOR_EARLY_EXIT]] ], [ [[SCEVGEP]], %[[LOOP_LATCH_I]] ], [ [[PTR_IV_I]], %[[LOOP_HEADER_I]] ]
+; CHECK-NEXT: [[RES_I:%.*]] = phi ptr [ [[FIRST]], %[[ENTRY]] ], [ [[SCEVGEP]], %[[MIDDLE_BLOCK]] ], [ [[TMP12]], %[[VECTOR_EARLY_EXIT]] ], [ [[SCEVGEP]], %[[LOOP_LATCH_I]] ], [ [[PTR_IV_I]], %[[LOOP_HEADER_I]] ]
; CHECK-NEXT: ret ptr [[RES_I]]
;
entry:
@@ -229,6 +340,5 @@ declare void @llvm.assume(i1 noundef)
; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
; CHECK: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
; CHECK: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"}
-; CHECK: [[LOOP3]] = distinct !{[[LOOP3]], [[META1]], [[META2]]}
-; CHECK: [[LOOP4]] = distinct !{[[LOOP4]], [[META2]], [[META1]]}
+; CHECK: [[LOOP3]] = distinct !{[[LOOP3]], [[META2]], [[META1]]}
;.
>From 5401d3542d287b835e4fa652d33a3a923e5e70ef Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Tue, 23 Dec 2025 13:18:50 +0000
Subject: [PATCH 2/4] !fixup simplify to BranchOnTwoConds.
---
llvm/docs/Vectorizers.rst | 14 ++-
llvm/docs/vplan-early-exit.dot | 8 +-
llvm/docs/vplan-early-exit.png | Bin 76189 -> 64557 bytes
.../Transforms/Vectorize/LoopVectorize.cpp | 4 +-
llvm/lib/Transforms/Vectorize/VPlan.cpp | 8 +-
llvm/lib/Transforms/Vectorize/VPlan.h | 13 +-
.../Transforms/Vectorize/VPlanAnalysis.cpp | 2 +-
.../Transforms/Vectorize/VPlanPatternMatch.h | 12 +-
.../lib/Transforms/Vectorize/VPlanRecipes.cpp | 18 +--
.../Transforms/Vectorize/VPlanTransforms.cpp | 119 +++++++++---------
.../Transforms/Vectorize/VPlanTransforms.h | 12 +-
llvm/lib/Transforms/Vectorize/VPlanUtils.cpp | 6 +-
.../Transforms/Vectorize/VPlanVerifier.cpp | 26 ++--
.../AArch64/simple_early_exit.ll | 12 +-
.../AArch64/single-early-exit-interleave.ll | 2 +-
.../single-early-exit-interleave.ll | 18 +--
.../LoopVectorize/single_early_exit.ll | 14 +--
.../single_early_exit_live_outs.ll | 52 ++++----
.../single_early_exit_with_outer_loop.ll | 10 +-
.../uncountable-early-exit-vplan.ll | 6 +-
20 files changed, 172 insertions(+), 184 deletions(-)
diff --git a/llvm/docs/Vectorizers.rst b/llvm/docs/Vectorizers.rst
index 0dfa33753cdd0..b4da0273e89dc 100644
--- a/llvm/docs/Vectorizers.rst
+++ b/llvm/docs/Vectorizers.rst
@@ -404,12 +404,14 @@ Early Exit Vectorization
When vectorizing a loop with a single early exit, the loop blocks following the
early exit are predicated and the vector loop will always exit via the latch.
-If the early exit has been taken, the vector loop's successor block
-(``middle.split`` below) branches to the early exit block via an intermediate
-block (``vector.early.exit`` below). This intermediate block is responsible for
-calculating any exit values of loop-defined variables that are used in the
-early exit block. Otherwise, ``middle.block`` selects between the exit block
-from the latch or the scalar remainder loop.
+It is terminated by a BranchOnTwoConds VPInstruction, which takes both the early
+and latch exiting conditions. If the early exiting condition is true,
+BranchOnToConds exits to an intermediate block (``vector.early.exit`` below).
+This intermediate block is responsible for calculating any exit values of
+loop-defined variables that are used in the early exit block. If the latch
+exiting condition is true, exits to the ``middle.block`` which selects between
+the exit block from the latch or the scalar remainder loop. Otherwise continues
+executing in the region header.
.. image:: vplan-early-exit.png
diff --git a/llvm/docs/vplan-early-exit.dot b/llvm/docs/vplan-early-exit.dot
index 980fc6939b6d4..baa3d303ad161 100644
--- a/llvm/docs/vplan-early-exit.dot
+++ b/llvm/docs/vplan-early-exit.dot
@@ -14,12 +14,8 @@ compound=true
"vector.body"
]
}
- N2 -> N4 [ label="" ltail=cluster_N3]
- N4 [label =
- "middle.split"
- ]
- N4 -> N5 [ label=""]
- N4 -> N7 [ label=""]
+ N2 -> N5 [ label="" ltail=cluster_N3]
+ N2 -> N7 [ label="" ltail=cluster_N3]
N5 [label =
"vector.early.exit"
]
diff --git a/llvm/docs/vplan-early-exit.png b/llvm/docs/vplan-early-exit.png
index 249b90c69e2b809887745ff725f7ebd074623688..e2740e51fb0c501a7e7c51874ee3eb1512125f8b 100644
GIT binary patch
literal 64557
zcmdSBcRbhs|2L}oR7!)gB_VrdL?}v<P=xGJ_Dojxs3=4tBPA+Pl0^1w*fV=%WMz+J
zWS{%1&+od<xvtxF&iP&E{Bf at H{{Hdp!`u7)dcB^{=i_l-&u5^@rSp4t)9)rBA=!ID
zURITaWP3LW$u=g^t at z2=)!PU0e>;p6&&!f*690Q%^!gDA$q|wZvS-v?V<&rDuGWq8
zZT^}t32do<RmvV#YEgW^$}5 at CsEzlEpRRQ_n^m?I<&~zWZ{w$%yL5TdHB}D?a~+p?
zC9{L#jEVTjQib!<nuB><tfPa}=ik5DtHj$~<8Q at APdMsxhsd$wyYafJW2Qj!?>}d`
zSt7Rl{ih1ai#>n;;k%X8^xt1np61;4_g~LRWa$3=(RM9PeG-zwlZ8b^j~+dWe82S*
znN8!%bL*>1n)$fpt1Ny(Bv(bm?0O4*HjA6CkhtDD<vuSzc7TM$cZ|H6#5ZjHR|V6R
z6pbr*x4`4E=GQZQC5B_%`1J(};@5fk`EBpC)$o(TtK3)KzH-_{Lh`AlWAxw4J-r1V
z|M#`~$p74B<GcU9IDJ)i{QbxOsvkxDcVw=rc6N4pEKZ91Y!vFG*1MIIl=v*q4M)Dk
zGcLSMjL)YO)AslJc<v1zo2xS=%EU-11=d6pze%)gPC9(}u!1H=mKZ|U?XO<H_VDmn
z8f`o~CZodLlB&DZl&Gk!tsV3C)#tsM+C;U5#8;CtT3`!_f%l6SFU;#>DP;6Yyo<co
zR}`Y}sDA!3;NwFkBqpYrjlrC)HcH$>@?&^uw*RZ181X>MFnoVs|H&tO;s685!|%@|
zU2fmG(-1Em|M>CahzOJG*QbB{_%S*<Iy~H(ti~ZJDVfml_{kIZ(Qhx*USBG!sNi5{
zH#0Hm=<4d~>~wQ=&9v+5t*g73s7mLhdQc^$wZFfgnVDHoP;l3-UCGJG+1c5bE?wg1
z=a-U_S{QE?wm)TQX?gA1H9R?wxuL+PPoG9dYhEaP%ErOPWx2XIC3d|#;Qsvrml=aR
zhheMMw^u%zUEIGv^Z}zJ{kq9SW at hFok43+`cYBLG#F&|17?lO#)AurnPWF}fr0Qe^
zOJbI~9w+AU7ZLipj&$SwOj5C7VPSULA{B=F`+wDm^|j!xW)dV_ru8x{8hZ*{$mmNP
zhO523y$`Z0eM=0ldn)GhtBi(*Uyt)mNKA}&ibm?s+L-2a;|i9YE$3uqOJB!((;qkx
z9vOK><thDfE2X%TZncjEhpQtG$|yY%8SBcj*3GsFlm6+vIN6C=pkHwFqDR9=^M;|2
zxKkcF+S*jwkqU`c-MPQS`aIPNZcYuHiuXxOO5)egcdC1G{KAC`%c74 at x@FwIUo$_}
zd~Yv<nVH6<f6CHy4+Eaf^6!yWE9dw3G~Q`7rWuy#x%3vg2_HFfb$w-li;JsE($>Z%
z>C!U^+b$6XhNlD6S7kAYVx+uQ7AD#qdoAtke5Sj_r$Wz%9$p_$N!$1{7&<vQ>A5rc
zazc4!80+~E`YQ=?d%r5W&yO|+(+PWTERW!c7lz^!vuwX-TerQlx3?Gc<j3q&XeJ>E
zmgScS2n^)XNPGO4R(~TOLuOjs<K^iYG^vXlW2p%U2$-Fnt!!<?Wcm6v;mn;K)YN%r
z*Y+_=bmu##Xf=pL at 7#a5aDDN6UXtU at n~U at FHchWCBq~HY)LB?t7dTI}4Go#lU7PIu
z`1*O6dF|sDHHtc~K7Bg99 at n+h=VNDW{WRr|TnK%ZMdM3 at BKNeSMV<P4-90^L&z`+6
zSympxK*sHX=OV8AwsqXs*EhqohPtJ<r{@$u|D_UhD at x4fI^D>Ggal6!K0ezoe!KFb
z6tEsKrB6soj*Oey+NM?%P}9<K7Syy~>nrxcTx@=zoum}AV=sNCWpjCFr?@$tX-$-V
z&h=*$hWBuDyO`VF>syx!ZXr3%RiQvfqN0TXZBH}w!P=><Rbnn(occaoCW#f-mTid%
z at R0fJ+*GmaFC!Wnnkj`C3<aNVHYxL4&9vU6iww-Nm{U9V9nx~$JJFuTBze=u-94ZD
zOH-2rrW at w1i@kmFm6Rx@(?Y_+cHO!5c(<YVvgt_uGns&|_x5|Zx!Lv=7vUkgpPb;)
zd_O<gDJ&tOL)!o2$1$_o$JcxE-8?)-3b(QyKYm<P^kzfcsV!T!V9oA7d~y_v3G;2Z
z>!F{Y-|Zbt(%yxMiKg|DLh0%0uP;42AmfBtq^YO+5YHHI&&_S%k(Bhn6HL)ei;@<#
z?Q+8W!Fm@@yV+<VLP0^{u{6DR&mJWOg`l7ytG?p(@z#{{!L%<{Ws8f8am~Ydjw2%U
zA%!Eq1}pH^x>jD4n9=}>iU*93q}|=!FFii?0uTDZg9rHbxuvC0d`wW#%8bt at 0~J+b
z4gJgTW0p;?Fuqor)v at A^a^A=M$X#Z7r#jLHBY8B3LciYKJAqaIi2b6TzCIrxpFcUO
zLZQ=GQ`vnQ)FB2sx|p~)sq5XjtmhwiZmus;ajSnzc+BLp*4WUX>|LJkJR$0}GT)Y}
zYaK0w at -sP5c3;@M{-o!hSuATzz$>Xb$Bk3zQU23d64jVVT-`=<RN14kpmsCAd-ra-
zw<zWOQmSrFbxE)D=H}vXO|<pq<<XvkrPdTpGCQC7(aXxp%ALK{)#IOTZ7bsw5)xAN
zz9uRxygKwqSyfGq%x)7);M1p1de;=vsVOZCqnckU)8y#%n3|j8HuWzJjgHb%Qohni
zA+wBs@<hU8(Z+V)LK%%Atx$oeU(@>tar*(kn>CN!7sj{m+&MBnH&k`d_NvRTfpcfg
z#8{-IrI)vsS5%1Ebf`pWqT1crxu3d;hn3YBD4>f?AJ<)9UEO3ahZ&lz_PRRj7$(~H
z96Lj1{cM{~)g&dlzZ3P~fdfIm=69E4+LIWZ`3phhcA2869W7z1j}=!7opx{ze)g;f
zPt3`(#JFN#-tJFbT at o|Vi?`pjj;9r`D70x~<v$g(8#m}jPaT%yi;9Xu$!jSZ#4t at w
zO({BZ3VW})iYtCJt1~h-cAj+p@#$7|Bo7(0I(I7uXCdyCCg(@*b@!=i8fobg6t3G6
z-m6nNiQJ?QUnrFYQT23po2(C(hj^_0N$2-!cqTbAJ<ad2yt+DZB0)4FEH*Z_K3>|;
zB+b{Cq|>`Rm`>u7`UwJb8Jsy3xR)gH{>k%lr0HgL^izwO5)v-c-GK)={K$<f9%N-_
z^JlDMRrk7$FlOnbswU%VqJQ5`{*tWzmP;*3DPBsS6d%8~_}$KWqbMLro>eY5*Lfm}
z+z5~IoPlPf8m=nzkhto%pT$AnKV18o)920OXVLVk3Jb!y?|L at AWX{b}<VpY6dn1M8
z3exl;W at s*0<PEj8nc3L}IoEq!`n)tN<Aj(zXFtEWoUkXhW%Mv$U%R2tF6O&?8M3Wf
zxf%PG%<7(C252U$o+C{+sS3wqrg1UQ)%}hk$EwY&j5^41$)^4NGjbyoyX{j=dr3%C
zh)2NbjIzh#m+P~+fe#C6{WXzRLM@}Eqf at -Ov6`P5FKAqjDd|s6M#F#T*wxea6D^CF
zg_GH~-<`%B*8bS%&0P5XvkqNHznc!D5EME1SV>3cN${IPjEuw#?jCw`;Su|pGiSIX
zx%v3&`uh4l8JVFX`D}PH%i>Z(86`zM|J>NNQ(XlW)wCtC0LY-~lowijcb?<@)*Rpf
zfQ~LIiF4y^sZYsS*x1<G8!rP4NdQ~>s=n6Ex$eLdLdByoTD+A_Q1EhGrSR2HzOm*N
zl(N%ZJbt6yc^~&s1}VNz3*-3Vx!7r*A3?05PQfEbj<mZ;NVv}wEe(apM0r2%4Wi;1
zGN>{1{B^FE^_Elr#01apBn<sse}6hvB^#S}<S)_lfq at JR4DRkp<P{eFhzdNGZaDMZ
zu4KJla)y){tHE(&&8<fgC3qo3toK_{QFeOUz`1_Bx at Fh(jIcbhX|E=BPIG;^NJ
za$m4=+gtYP!Xqb3fgAw}naWiE1!G&=Q%<8Q%(Ck0>Lw;8{UL(`0}q&_`Tb~xOyp~#
z_!gd~1LOl5Wu~WxX+DTJAicTvk^D<fPtQYBE;4G~hpR2`v9v$AV=8;D{rQEd((}na
zqV=^hQ&HbA%54=x*P{<kjhIbFbuah+P*qh8YNY_0C7x)L#h=-J2gBgl^Q=@X!oq6T
zHCBE;wG*}L)r;nzGnv>;#r<bxg<d83q2d8Q at _YLjxeF6--q}B8MYFC~=qkw1|9<}H
zKFu_PNX at i845CUNH!}{8w<NPR(DW6!q)qd at nxj8)<43XAYIU?g+7fA^UrtU=uNUK?
zLqmc?=N}vr)H#EZEtdnVP7DhPAyA$_Ifmb%p!th!Z=tx9lmRJobO+^yghttO=XNmz
z{Fwi6J{>}TJe<b<&?)!K*(jp3h-Hopj=olk5sKu#B4qN<poHh24~2~h=l5^B7tUH*
zRz{a`J}@*ibkSs#=E>ra^Ll0I at YMI5R;#QqZt%!s8PWaGq9m?dAxzR6H3B8I)zv!1
zp36XgWOlqcf1GdLoNj&{%72H0gTvg+Y&Y}G$qxG;pSEmM^!hXVf}919VAc#h_Mi-a
zw1k8N{R!h_miXMfyuADO at 83FWne#a0{(b9j&u_hmEcy|YRis$llVjHx7Zc-#KSKLt
zNC9CZVf{P1-|A#pZQHSjbT{$R$+QS7D)KtR_w~z{FJHg<lcOTsdZ2jp at JZJrcCTK&
zqP3RXGxd1;1tlfQ9RiQI{0|(!2rVuy-qkBOYB|WAH$8U6%-C2h-RRs|xi>mlZwpbl
zln7>{z(Ev(A{2rHl#~&1affMXPXJurezN_ae at K}PJf at DLlQ5o-VrU~}K6&aCAd8)A
za)$30hRVSlTU*- at A^owi$VfK751E-Fo}5!h9BMVSb#%G_O!sQ at JE0l5B|JP0W`0^5
z%|pfA&D|a4WAV?g!CSX(ZES3qR!3BQ|5^V`@_V-JL76 at 1-vI3r4{WTht*>1Rd-iM!
zwOo0h&=yI_g3(b6{p?D&^vYpA2gZlDhF&r-`++I<Clrn1 at 6F{o9RXjM{lL5K+`02B
zh!{+E(UtAKs<zb;TrvTF{`>(O<LldjURYgUuaT^ds at USC6{*11kkpA$_&w4Pa at n$R
z=(a!F(@BrTS`pzVclW5EZBKXS8UIiL^{y5F$#W@*d*yOUD~JTS%-V?brl6RZm;q6f
z%4La}`y?&R?wN$MA32Z4yUNv3^u^-UX-Q_;Xny^mf*Ko?bU*T?nZEsd_a2u^Jm=`_
zOeJ&DXJd^`m$x~?RMBk^2w3a}r??Cn+pzUQ5IS;v_XC~%_x3Y+gIAHiG;fHL;{#Xy
z^cY<Axw^2h at KX`XaPk3wm#&29tlPJ54=v_P#Q8mYv{*C#UcX=uzZwU)N~BnQ+$rlP
zbQizY)F>Jp`Doe9ezqK>B#h&lGXN8(WJ}>FzhUu7(5F)pQttB>EpIN%kdl$z2mYli
z05c#-U?vL0bkS1pql$05cx(IFxuZ6kn(cV_G%g*$zy#DF{q=RfwCwrw3<*svnW%&^
z{<~!Yz;2}7=PUog^Nfk<^xd)z#bZBHJwxo+_5LsZ4gy0oJm<ez5ZXp?Kmcdp!GtJY
zZ3n=afyF1suE`M9_e(=V8n}R58gb`Z#GPmI7#6RMHYWI!gI$7^JXzcT%#)Rq+s({=
z at yRRI<RHm+{{CfnEdJ!6Pyl)t6cvRHs+K=yWQ6m$V at QAZ-(#W|Qa3Uh04KT>d*X$$
z2Ll6x+u5YUa$=4 at mE8Wc3{^c^@L)@L`LcNVCvZD at 9bl~O(27EBgY at R)j~^-+&7XBo
zHNj9XC&&TB3RPFmv8HOI;O^ogB3^k^5Xc=cRfZHA!8&yp9^>OZ5Q7Ry*p(h%y?*_D
zqs7ozdw8KfAkww3cgMtRaF-I!<464hf`cQXJw~U#_><*(I&O?6gbsyuNQ2n{zP{+w
zL!tXUJF5kz3)=eDI9jaN^=vQc{{8KCO<%;t#V<aSxI#)nM<;I6aV$hm?cFp+8VFZO
zSy?k#T``)!mDNbCR9Sj`zSm=>r^Lt5qX9ih!fEuzSQFdVoh~<SJeKmxCm#UbxqkgR
zXfIbr&0s|+zLaP4gqF585ct`{!P|i%tU$>>kv#_h at mgJ^l6j|_GYv2!69Bw7-TCo6
zY5&N`YyBNB?_GQ<TBUXmM0a#%CO$0eayP~GzTzJ63jAdjI%{P)z`52(vyeTEat{tA
zSCmO%`HXg?C!F-r;Xl&kpO9dTI`2m=d2^C;+ENYAy=i#&lNe$1YCmg?|4i}f`{^_j
z8yg#3qp^{ZA9=jjqBdql(3LpV7AxoCnrC2BrjLzs&)ugEVGz4S8Ws^D0;sUDzDnaT
z?J6%HP*70Nz0}pzG&d6ObG`L#<Yhv1;S@*Fnl*Z8ZY=G!qV7FKKs|H{%&VPDo>wbB
z;HmYZwVizDUKP$ZJv}Wn(O3r5fO_^F{gn_Qn6290B`c;u>ZzjQ|MlyaUC}~Re0=<a
z)tbqkf*f28aAZ||y{MR&VWI1<AD{0y^IlmisGE)V+2D%K9Ayy^$yAP)0 at ko?PO8HX
zwOx&|C?RIl2!9Z@>G+0jijqttUPjQGLN~{}Oq0ro%&0nT>7r%l&Yyq%>ebNdLyBnD
zRJ}Y02p-hb)G`6!{6JqR00W!9r8f`K(z;@?VF3B`a&LU{-9qRtO^Nrr&zJZ1Zs3y2
zR&0o8Q6 at 8nnkr%0nUR>2vjl;0+t#gd&>#jwrFRp}n1jZb_9bo<D5=O}srW|!7d&ZC
zFRucpvAHUacvn|f^<-5xJK}odPr5l^HKDm%W$E;a<B~!D8O>u)dEA6vu(tgBIDH*j
zt`A6?KN$^B?psI|W at eisK4c>F7fnotKHu4iYJ;!X?)Li8qh@^ja0X?M*Fvi%G^op$
zFV{p15b95%+wUi0c5x{e at v$~Gli+12y(Jz?*Yn)ZkzTX5o|v4}8=?eIkhnRi1ua1N
znFJLzbsNSGfFYDlI7$1XS)LALF~AEa3~^VM4AwzIL73wiG~OGtKR(B{@7=|mnIey-
zrr~<n#MZW_*vn(;LhlNfVX^0#{Z(GcAu@@ob at 9?A7)J1efS at 3EV0>aERZg3knJof4
z@@jo}4ib0nf#*b9Dke?M*P6_VTYUQY>QZSCCFaLldHO~khlgiaxAW(TWiRpp8QojU
z?D+nDb!BCoRt2N-Cdi{llH~ajbbQ=lD8!o=X(mraZL6L6l`SmZ+%infYHDg?zZCnY
zSy|fBk(${LJu>C*D=~2xgyG=9g97^b5!N%0QP5UbSC=qKxx&}cm4_<Bp!aooR7de)
zQnR|aEGa~Cv$3;-TjCbQnVHXge~v<r`S&Y;g7sZ$>VoTo#>Pef<*KTxxe5 at AHq14w
zb4)$_950B7&|t+2BDmDdAfeo+5y<}dvDrSVwzd{@AyxaM+^WDNsL1r#*x2Z()(aW`
zRooPmL0;a;sz)4ijTl*CsG;rUONT*qIwbBOyR_)0t)*33QBkw*HQxqI?U at rwhk}Fe
zo<DpO(n_DtW)aFr{a|dIw2wE2?)mfQjFLAk3?))AeLz=w8X6j)cvfgbfo}k{mA`{3
z?+Lc-HnX&}WSC)cfteBQIIWLa55%fB*M1OFbZ_?$=;(#=B0z0necw at g6fD*t4#Z9v
z6&4l-OO+Y=thbi<Z0glqnKQMvmUJ5Z_U)U>*(48K0Cd3NymS7L-#VeVeEj%vujlQ+
zz(71n`>=x9$4{T;fZiQDc1&DcyCjfbFZYPRV{X65$X0+Sf|g7EfzmuoWxm3N3O&<X
zgu>*ld~pKI$*nzH#Nyi#Hny^d*G#2`M at JveBmfrSxjUq`p<P2sGd4C}cx(!P!T%py
ztoM_c|HX`W%7!K0>$fE&PMko8*9&!rd=sn(EhWX!1>ztJAx+a>ypR?l7z2e5D$+kY
zcN!MCAIB$iaaDD9clY-8e*XL!1CP0xn$v65m6^=n8Nz>9+S?QJ2m-X at NIgg#UfR04
z?a&~4OZ4>gGAlUf&dJDp36<V(o$AU$^XP>*gEbD7dEehxTwEN8EJ}|lbM(mQG{6R`
zKH0u~D1SHchghso*}yvW_4T1s<~xn4qSSmfzx)l*UV3%%<G;Gj2dpwi38%-$t)uw4
zbeZS$xqfqB#VwJf9RUbF_9U7;Vhg1#=UL#mPbqhrq4*Q8|B+YopEo^Jn$QqIj^AxA
z02z at o1DL=2eZ$##@4kH+`3CrS0#^ZsOWgSJ2?~<%MxsW_ at H(B_+WJx->SMJA8N46a
zf4vI>bjph<Kyyw`nQ{qSg{DRB3oA=Ac2C~obCmx2FPzC(9LD9rmkG~^Wc!U}SPFRg
zZq?%21``N0djiw0Y&-)C5<nwD<rIF)`Hb*Aj%7ghMlCwMw3ua$F)z4T)e3^(+w|A_
zIF^B4sjH(i-s}DCISBpRp>e_k86!ZiZ&+tn*Uhn}b4!b7 at 9yEsGs0*7g$5*7J+V~U
z(i899yH`-)5lH>-=MhHH-~_5MyZ|T5WDif`$I%2ZA}L?$vQAq7uB$ZTj<muzvA@}g
zPfH|!EwJV9<ttXO9dOM{eD#X5v%Im<9z~g*b4Q|~tgK%X8{VkKil at oCIvi~n!M{Zy
z7@!|t!=n$ZLK1NXmntU=0}WIqG37KDl*PZ2+x#1#Qb=)V8g|v;D%B8BdGrbTz!)i)
za5*0rYj6qtbnM%Uvu8qao2Hu^>q+naUe<1g^{pf-swf0YD-&rn^PD66cq)Yh#Pj6j
zLVX8;t6XA6r-8HaH1{xZ8Qg@^7V-Rc)K|!<36MD0`3d7JaW`@QY;W9t|J+M2Qt2Vx
zPJ9$GsJ`LHExtY1TT*|c@&bxS5ar*ec<1kLB3&*kp>aVNNRb!Br*NM7`_<ZTW-!(@
zZu|d!%4uT0Ufn9LMtlBz1qvpo7QTu^VHY8TDRe(SbEmd;W2vuu%eEa_T3VdC`-xv}
z`}<2hz%HGf>wI>OQ^ZU<O8ijijG17TRjXCwOaG=U{P4LtVHtj++_8uDs;TL5lS*<p
zAx?bw4JTD at 5~HgdTmc?v)UX~Y-(U)3c1gL;K5z0Tsf^FdbHhr8+etFJ`?947eWEqV
z)kElx%TQAy at Kax!NJs%tq5gf#wZuKM8Oa){I=DIFC%!Zn(Ar&Hb76>*7yzw(sxiZ)
z!Q)UP7J$J~0ACak!mo23{?I6ZYa$i{@r;Pq|GTA)5BOjHqprSi+CrkD1BC#1(*@`l
z%V9q$sY?DKl0<z^&oy*|neIF_l{-lnpDxby^+mA3tfV1(vBy_aUr(=_r~=d7ZkVX=
z-tjV*0vJW`@BT#g<IaAm4gekIy?6I9DqvZW?8f5yLFEi95IuDg<f=ACm_9^q%z>oP
zHQ!~%8#)lWMIsrdv;g;F#Fkkrm;?2A6Dl^oNNRcL5eB(NHVNPY0;qstabeT;f!4^l
zxap~>9;i2oWVhZ!lc!>0ijRqhGQy?L2upCw2h|;)c#iV%rGkKkGD)}f4o*&XgI8d=
z<=B32`|@P~+PgT at eJ+x(|0N5sU5QIXWFB8F69A9{AIEUa;W>|@VojmTTXpVcO{{!_
z6YnCnT=nEoj+_7WYYc4`7EM#u8k2^G2Bw<~DL at dAAzZ_50)GRke0y=n-(T?TI1CwA
zH at A>O;&Xsea)+n|azF)t<`WA!nt{iZgti%&cx`<>OVZFF->C{*yffS(<HLts&t(VL
zD32bg1zyU891D95FCdg%2ia?%98XbARA7@}B_<rrKH_7}I}rT%5yNq-qX%PzOshR%
z>46kz=D+U-0#lR-qmcQtyu6oANR~7#CMM6OGXo9PdwrpO&VqxO_z$rHXceAH{`1d2
zCZ?v)vqAIM(Q%-`yPLXP;naMur=s!=V5_L8$e$ej943o{qvLk~&!$A&4GAY7 at d+ka
zXz$;@ClCv+p8O?v3h;Ny`XU2IC at C{WX at Ou<-MQ&Er at H<=?IrYMun$lKg=nJaopwVp
zoTsFwUWCrLkM`K<X;WPw5WMBt3459MdvCR2_|o+9=1|b9ZB2(1=Yf|?%ged->51E5
zOK%kLH6k2EG&P_GUZ2dYtY>KU0B3WjXh3y{XEWb;9zri1)!!%_k&%&9l$4qH2Hc$w
zhzW?NO8zIBCh)fZE5qEaHp(7$?qRTGcurt)Kx%Y!bU-MW5r_of##|g7J<g=HtNlMV
z%LTR^EU^#ryc8ZDo^99X4fh~7Hy4rvXy$ud`f=;F`Po^56{BiiP}+ at Thb2iNFJ>Bt
z-=Ep9`xUPT5i${O7xQ#Z;34i^>6yd=@Q3>zDhi55c-`a6V=c+eiHgy4Q(1t#QGB{T
zrv|WMUMt6!mdbvOi%$aAk_o_KqC0VkdFY%{SBW1y8dD`T2Vr`Doz%tOzf;hHitV(q
z(yd$GG=k|NQ{Y)J(~%BkDdl-F!Lep%|DYQ>zcaxdfcf(c#l!Xb2rJ^yi5s7^l%-Fe
z?5?PIJ=>9v1&tX*7&ntb_5-D;Hda2hJS;3P&)(Z7ZupO`uC92*ojYfl)2`IF<4;C#
ztM1ZiFdT^9*4tbBaAbI3VD5K=w6xELUg$4?;O{A#0_Nr;g=Ka<`N!>6ac!`3eoDNp
zEiX5N<^vMex at yTSV~}|QNIaaj at Ks-Kc-%B*55})yA<P1Bzh0DR_AsaY&)wSe(n^pE
zL8&S)FQ?!5ClL>6*-g03mxN^Ww#p7yw+IW)M_6BI;)v8#_T3%6UQB2c9-jbZb07B2
zj5Nf at +ocgILz6WghI>0}%#nyN2mO)Z at o|*J-tf2<a)4+5!Z{s`acxdPXsB|S7lFP^
z=wPs7Ugb&X=<0g7x)OkXW+?~Fn|6+?)j|XYtt(tG$BQFCzGGvZU_6B!&%Sqcfr}j%
z7w?2IO_~m|@U~o>pz&RP0n4zh+qNxuSP?WxbVn0)A8I)@pH54P=1f+*LCx|*;4=#g
z3;Wj{x%S3qOc6qmGFQyfVI(J4fggCg3;IY!S=rc<64hmg7s0!F at z}1TsJrzUoj-qm
z*#eTU->!oWsgjV_=4NMa+`L)eTGQ2~Gb6n<j{qN(pNADmg5Y at V^YPh4*{xy1G%B*`
z6cP{+I9nboVyTKbixdW|$e~lPkLQ*=G&MEh_j!8ofgXeYZ?63gB_BXt$M8okEseL<
zeEs^hy}kWmxYC8`fI{F3WvS((?Cd|`9l|05vHS{vx7%>r%ZMk(t=}7#YyiK31<3?p
zsB7-Kz#n;M+l-raBX>0b2fb-;pXagkeoYXbHzuV_0Oa at _%Vs&!%Rs5Ow(X=g_zIqg
z4*E1Mj-Qab4+)zoLA6Ks!kS?__z?6J!ZBnP)GF`JJjd7M1IX}z2ZJ<XHf9}eSRpRW
zV=?%_18SKQCr&_iOu|zDXA&29B7gB>NJt2LROQpBPlM6`Hv`&(^}1x~@cGHh%X3=H
z!Zri~Hz1NH%1}ku2ESou>KWc4YeKyPU7}fXgLka__}De9&bbP-^aqDebs^d_ve8W+
z!p_2CgcSna9iRvr2_6Hu+X6_tQ+#E6`x4v^$iK0231LeoVaVdGc~8npOM__z2Ov1i
zomW<FKsU;?>1=9j{Dm3_^&X#s*XH_+4 at A;To&|$5>>h&(?)jkck$k!ut9I3p=!W8j
zm`edZfD2rQtErX;;e>*Ew7j}-5JQ}&K7|4Wbv)no*8p%dD=TYrb8|%qg9`}bOvz at P
z;+ZWZ0!K}SnMvf-5Ac}6W at 9Z8R)oI**jqqR(NJHHn*8QaA&`o{-b9$9l9EzSzO!is
zn_?7g%Hc<;5seDU%7*z)$u~dy1Lxy*2{}Jw>%6eTkUTTNr*Ulyqs7h>8q1yp)isVL
zoP6nfgop))u74`@@Tu{!F|O~r+S+6GTxupJuht&G{8 at yk^(rZex_6`VqdA^x-WSTA
z_~+~uH4ZEDV*?r~1z4EVJq0y^;H7tN--ZmyJf)_lhBcX5_oDdE0NGiy_PZ)wkwP4o
zV!vIdQ-kyif~=>H;L*#yll%sS7L}7pCi9U(?B0V);?I=&85tP|2L~BMZ8*=rxsuX`
z0Vf-a3=0#qZsVO=$%R<U;L6AebU+dWJZ^Bfe6OjIk<r~fbT9Q!U$?eiU1&GNRnwc!
z5&{Sz at rx_or{*L4ze$Jn73aJF{X|tNr=nnQC8lb5OuhIM_AhVN96;bm-0|m0x4F_%
z)6r>Qp^O#`>Ug6*yB9hi+}!5Gb;P)abZEhH3Jtr+UTUP2tc>$$n?qL%%37)>T>oe*
z;4342YNQj&Vs-5zzNnbNn{<c*3mq$Fs=)H%)_l*q`E9s>G5CRlzYqb;-h2M~{aaB{
zk>|}IjC0+0G-~#8`%RVB%3~ZP=&IF`l!97wN#c6<2}a=+fXTdqf*J!%N{RZ%0-!0r
zETpEs(f872Vo)%U20$~ZF?2+M&NpFmM~{a46VY7stDFJ1D)8zTbQ-pVgN}~B<Goj^
zaw9pZs^u{mCSdk0t`<UKB$7!HUJ{Bjr~sxPR4Zx5JfEHN$kw`54+EAp%~~y49eNx0
z^=E*w(ao^As5cDP#ld9HF0M=$%mhgq!_Y--P%!@+W)MFIMCD}om|Z{j#u+IAJY*J4
zZYo)ZYDnnU(S+u*v$7U|+2$EOv<O}2G#(JEFKr&qH*oIwaINeKtkz4 at E=j7%MAXY@
zp^osEpOeba{TROH%K0cVa$zc`&uTN?Fi~~y;gcPoyi}cEug^{P_fr5p+dajzs^Vef
z<>OoU<85%%^eo*N6eaPciC?p`- at I%CxKJ3BHF7aDM$Vo~JubtNZw8A~;bJ^G$fuJj
zA1cvmwEz!ih!nC at W8(drj*rlmC*lT&M66ogsM1!S^jgUT^phb4*F@=?5d4C^J~W<(
z(mkPhM>L{wx&yy%J)lqbijwv2-`Tw>UPV{k@=p6VWY at B1_K=1%3XmWCHL-3;kmYme
zAOichosGdtEy&Ha at DaY=oD?!v!d3P9h at S<XNUzrw*rG$dJg^fxQ8F)3s?f{Og~%mn
zr1${z#uiutfF4Kwrt_@>ygP at bov1uLkM2Xk0!SL&FkP4%u9^F;kC4>@{{oh?(AFC+
zF71gekaeq7RA-E>FU6hY>dSrp{78>Sq!Z`ItDm=u7c(o?LY_UkvvH=ZDla|#Z$u!`
zXD8b_tzd-UF9!3KhCtB>L1AG at _xU&8!o|PqB^}7~(lZYe>@(=tL6Re-;QwA;UI<&*
zEf2!Td1763*RmFILg-vF0bnuN*6oDW)pZXGtPQO(B7zb#1uX=rujbOMm~g!WCuB{~
z9jiPD_J;f##5_)2txFJ3KoDdCfGVKTO>|hJBLJ?-1fVpJH5pu2WcGWgOEyt~7Cp_u
zNJT|ON2l#N2)GG-n~WJnqX};0x|t1p0*pN3hbYaj`$*aP0qCh^atjI&wbGk8L(Qvo
zBu9gY%H3K(dTbdJDXnB9|JGpPJQga~A92_Op}jsPLnVwdq*L~=Nejtw`=rdJ&}D%>
z*~Kg<WojY#q1bnA3%)o8jZ81g3i?6Ng9lKbr$Cqd$RR1Bq$5{)!GAXuKzi2YGQ~*{
zIQXoP&3xAy%gRi#EW60u6avvqYEln591c+rKtqPDz+C#&uDBD{h<<+Mqf{RCH&=hS
zjdX3ElSay-pO0Alc7;p59(QZef6DLxnjW3dD{{XQclspEvpnkzg1Y`kgyCo3o%ajJ
zAk at Jti4-t2n4vJBKyi*(k9GC%m^hUHO<hmlb*Pe}XeacL`M)<xG?;r#-mXA at c=WKw
zky=EFNrq8^bqHHBIq*KAQ^SozM)xoS!*{F}Bw7%(kn&i32RaO;HKJs+q!h(`$Ns~U
zQ&W5bx6*TR43Wx2K!i*0kcqLeF!WnyS$X+Nl(8!&tDu4v6%}O6LkFI+AYb(64JWfK
zXcZ)UYx!g-I_`rZc&w<4d<bxyrJD-lUqPTLc=6TmrXRp8b9Zm<H!iB87#J8B%5hnT
zh-R^0SdN(((N*!r!^UY$%jRpCmsVL_5AC6ov7y{<8lv1IzG{y!HAwMpX7~-L3rK?$
z5qgi$Mt4MH;p%ij$;L_wEC;M)WHiEKV#a>_xPd3e7_C|O9K8sb<>$aahW(%%vmYuT
zfH^XdzcyB9qPx=4FgK$)+$J)#e*O(Aoj{)Rq{&-?p8mykP##*2b%22QlOxaSuk1e4
zdy3gFH8mAsQ2ukpoI?j;)i>lhM|fwBP}3|MeYx at P;8m)hv&-->GfQHrIk|=8n=;or
zACvEG0{(#|qD>G45{wm`4~_%UlrT`CQm0f^(;mC}378CInafA7*wc-mJE8 at FrlzLb
zckHNtDmH at _J<xZ`6gd0UsTWBtZ#7c8P&whz<MsE4`8;VKK70UPW-f)J_}sYssNr5_
zSq0)1ba{8%18wrW&eykUOcY)~Jz at 3(8)t5RCEt~+ at ZLivQ0N!K>mMUv!%5&DcWXIa
ztY~D8a&X|0_dI-oVWGpYEI)cJfFQ1&uvu*`v~u(y at Do5^#3WUl{a6885Qk{mIDsw-
z+7vz4m5AyO|EH$M(T^OGyEec-Sth#$A{5AR!H~gUIR32VdZT^%v at iJpK^@%IZ2O1q
z9+x2nKm<Z&FnG)Re0Im2`zdtX1SL&(2n at TJhcei=S?&xoekmLCCq!-5F+3{jCPKWZ
zpQERUAmDI_Ow%=}jtscw?W)P@(2>W`JWikf1P2_b>8y;*zQZR^7?lRVlqp32U=v#a
z%ocYZS7(-m|4zipu6^-qX=%aoneNJ(fcwCm=XQ}O6HH$7VT*r;aBTtxg<2Jg9t!($
zsVMERB~BhY_N}kaFwXT^4FmxEjNOk`$}{(-^cV{?Z5=Hw6LWJ=pPGZ$ls?th^Fzgq
z=5sLMb?CgUx6|ZE-eVckeuSC-Sa8M$_MI at 5=0FD#J{lno98LZO_2={FGc#u}6oQbv
zRQ^GzCGWx6X&WFUxMdZ%dC!%x*KC<PXQ54)u&7~)V!8#x&Vs at W5bCosZwc^;m8N;%
z(G#urJ)TJ1z;)dqv}XRWu)pcOfY8uQwEH>R51=8FlQu}1*$>F}+`E#jK6fG#l`6(Y
zlXcl=5;ewkaWclzOl0qJ*$GzGK}df)_Bo^1#{S2sEIP8NQLQ7kiM$^v^TzM^O?Xff
zr}mMMup^XpnxjkDcjy*9DD?W|$A<Ctv`rLi+NIe0sPRZ$YLfQ<{CSf|1qz%75&}^r
z;LiN~JS<|Hp8VDT;U`)O3e_MESp~~cTxvhz8yDLTmX`(|3~{LPWr0(SG%u^47BWh`
z=i|}j5PsanOn5onJ!hfuuoFQ=Z at 8I)+<Z at 9U6KzVS0d196oWoe%}}zrQE=;Q6$Q7(
zJ5EEM2u>&|)!vuz=s1=Z+rFYJz;kBt<MiLz3Oy81iKOfY>I}d*qy`8pN~HE6Jb)i!
z$k?Aa(J}iO7Bm<wwSWPyA5?)({K|1-(+ZD^paVaCJdBJaRC%;pTB(G;Oa7mK2r^A%
z#wshxW%ke>`vJO#TETb4oMYm1Z7mUkmk9vVv<hu$MWieI`^32Gft#1QW;Bsh5Xx10
zX5sRYsQJVYffl=6BpBQtIu16rVW?m-0pLi5xq<^^rKNVU8S#%`SJbE!=OPaZ;Kj-8
zhg1TT{CQf)bBO><oY@!xSy|b&wciayPbOy(5`u$_<#974IJm__DNAQ+WMm0bXE!q(
zPxNyebMxqwizs5qWiDchK~(WXT-)JS*?l93^ynK;uz?|%qu29y9jX?To!0mIx?@ej
zgG4BZ1H_#{H_mTre7p;^bYS0iv;nxkyP3WJ^xs2x%UE5<4<tqNjmjBPK}4R=eqyf5
zH6IfeW;k{gwFHgF?T&B{LI^4bIhC4*&BsvR{)`~d%GPC@?Iecf-O-`N>=z$T(AJ>u
z(0|$f8~y8|=pev1bWjvz@#UpJusw(zh-vF~+h=5Cpn3A{Bpfs=D=X#@^n_t4R+#`S
zGX at oJsiDBP5PF0L9>aPtM at h`|nE>E2$8gIXDw+R-{EZ(ucjP#lLYHJ#--Je*L2BOz
zY&MBtMXmvew?)2;TF&Ec3$|PArQ={`?ti2#CGNeJ`(P at ICisw)XU9V~G6(b{w?7fR
zX=vN8va+(sU&8A_03wtEgTfv^hyt}Ry0JCPZ30TgUZ!dc^O!WpoUAA!YSIkoqL-AE
zTD&BtzFhF|SpD<I_0;aDp~Z4hQBn6$2*ZGtpgUtg^8ngtR9zudh8|N{M9K$Br^L;M
z%1UI at b0(qTp4TtlhFKxqbx;BT?yA=E<~{qfF+gGa4xLb8s8D~e=LQ4{xF|<gNEs9u
z7{+u5^vBS{9L?O1{K{K(!K2F15g&Q(-MN?EMBX1NSNm{HFI?En^F~0kGb?p$Y1s#5
zAhDgPAW|<5L?nMg%rZ=BeO^uc9GLt4r*EOvRG(B&RAoHnu3iF5X8vE2Q>8-qdZ5r<
zuIHj>C5|6=hIyZHA215HasP@{Z}l$V=cMzT+X_!c>^6N>Sy_pNVX-X$h!Th~wbB4P
zk-GR!dU|>`H8(rQVuuoThv?sog$#BrYtyHEw<#tAwo1G>bqIMMRfAlU2o}YU1jXFp
z2q*!eL_(sAkk9&OX6!0I;747w*I_>A`&`Nd21A|lC&#jHNnFQl9^U*eDJ~9E`Au#!
zpJ8$LmoGBZYd|OCy at a?a6M!y{4nkvHj;9+3LS1Qwy(nFN)*vnUCE-XN66*Nm37C>b
ztx*SGfP91Bx=Pq`CNx?g6!3c8<rOS>?BCeFuzTM=5bm}OM%{PP7R$uuLe9S$Bqu|)
zJOUE!W^6J6s0lPp0O1vcCX-d-3Bpfp{T{#daCfhse#D{NHe(c|7fe;ntDCK~$}&Io
zeF?MfZu_Flx45u*>@Bbmp?6cy_V+&red!jfA*80m8hn0lV5mUKaGv~w?u(9EQC=>$
zIE8fe14g*(!c$LAKyU*&(RZKf{8;h*yY3>kvk6Q;p;?|%ClxfUrerLLm2iFw!Ba?P
zHyIgE#yUKnEc2^bHl1 at I7Uym*!+RKh%fwuYy)#a{ykLFq!eCI<V-9zPtg_q at T<TK#
z2p0nclomP?h8lsrbbQ`+GHPO at QCEZp={0PFn(Rn7I#u9F?3kl`(PSaA^^;;hCVD(9
z0f6ww!W74fFj+U}o0Spu_Q!3)H@;aB6N_-<Y6X+eWN(q=$&-4dml65JL$vlGbAi>f
zun?(xU?@B`wh-kL^t_6R329^a?D!}$<`wi9wC@*Z?^S2**uIO5OcJ^hcDEFVB2T%7
zIZG(uqbgUh<Id2~a4Jc3JL&?Vt|7NMw>%OLJeEIOE)av65{uLwnmE=G(c$qWA~$}V
zcH79gMTF(BcMg5IlIg#TQw>5Y`QPJIU25O&?V&q>-Azls_`>B9Vo;(Gry7=y0Fl$p
zy>Shtjo>rUn?p8O-)=~uU at BYGI664!U`OK3yju?-KY{zz{N)Vj7AU9fxII1FjE^4?
z8bJlfhd+g at sVFV2Tm>FMY)BmdjKv(;<H_$iGoYz{<jDHqE)ENu1)o&qdmS7cjQ`@-
z&X6q-{D#@-$iJ1l8v-W~ohy)zo?6YHT%gu2Hmc=}>}=d@(W2i^)pMyDGuTXnJWE%o
zhC!d_?~4G%P^sgkymnh5Cf|dq8S8P0s$K+j at -+hxE{fF5=;)iG+cR+U5w?2hL%#dk
zf0MB)b2Zv7ub|*?<HiTX=XK$vU!^BZ<Aex5AszUY1@^}LKm!pRrj$bkGsVsPbd{Fi
z(E$DaPLqH+7;7?j5y<ORRa`tgDGw=vS|HK at v{7~{rD}|<jBf;WWLm1d|E(c&_H4*P
zs|2>74U`6=2CLNze1#JYw+t_AfdTPUR#GBhI9~M+z}OHnnt>Z>Z{7_Uiar9=o3#{y
ztz&RwkSzqgQczL~4h=1VS12QMJNpbcF_8$RV3iwU;HBn5)vBrCL0D)5#pNp at vAol6
z{_=$dF?77x+1W7z&7+}r>_NE#*L7>)<&ift`w8a&f>Xl!@gGnKm*(f4oSfdNy!Zmy
z4wIAt)*SW~En5J~6|an^cy6jwzXD`}MbcR0Wq@%;dGA{HQV4zc at L{Z`HT{?F?vwod
z^^J{}D;C*Z2bHAtdsXB}e_;}0z;|rlPGm<Vi#34#F`=hNMn-=AOzKmsxlbrqd&=5I
zNseVV-B=EPU{)Wijqkj at VL<GuMEm$XMOa~Y+SDyXX(eP(6N4<B9&Bt_FXmQ6@{I`F
zRuys!1QPkH`;q_0{FRTskN`HsV3FRvdzW6Q2iKCM9M9j7z at -PvQ}lYbR`=A^IXvGr
z2x?i;dQ_#|-G$g^0k-3?lj#(4k!K2$)z099%R`wAE87ll*M_3J7$kg(7$DRkxjf#+
zQSfDa=^kZ$a8B%#S;kEdP^-Kore}@YvZ}#<WU%_b|C_<uTXIOqP_OtO5|w{=(7VrD
z>T+$1c=MkQR;9P`obq1#gP8(-1iVA>FKxsEB5G8TPhM_rA=FK|7)1qn`9Ihjo(ALx
zJcD1Ja-IFu*4BnU!>hUZBT=Drvyu2J>_1547tx>b3pA%o^75|pqln=@16%^+hC2nN
z9#)shAKqgUfY at we`o%n^N}-YeRiy*6{zP^UqdCj%LA4}FxU>iZ9r{o0fG3P1;`QHe
zbUyYB?V=zrPkVC$Rh(Sr=+UEEBmLv!^oI_;b1FiZhKO$=T3rtv8AUhtmjFDInTE<i
z_y_xT?Yf+;17;cF-?SZX`a#8zNuTpyvH(J$xM)DIu&hO%e9>)#=7#E)l#J{MAvz*#
z?gU}_q**O(VhRy-`7y_aAL6zB|Lj`vyZ>MBpeIWtBk?_u2}J>Dfg8c82vtIe{P^+T
zK#e~1SOYWI#l6|KPZ7E~&4nH=L_B^3=eGSA7J~+i^7Z!*S)kYWz}qFVIkRsO%$l9E
z?#vhl&L^Tf3SpsAD*>1&BxP{%|31|J<<m6(gHs#+C+7ig1hJPQf*+Au;Fw%&Ypj>7
ziR2OUT5(EL;JyNU38gwRA|m4VB{8ua=tn$P4j|`phCnpFo5m>H00FhmuM-kjUjzdl
zd;+o=%Kr$ANC at T6b8|frM_prraD^OgQqz?P0}$zV>dE26Aoxaa!8$xm2N|cgw-+X<
zN<R5e8`1zcBB0g>{7zvkNFf@@7B&tJYr}t2HWc{w%l3#7o~Fau1#|Qd|7&LE;nT##
z#KLQ4<v#sGup%<kLKPBKvuQEb0|V{6B)&q2r92-`5GjvYg})g`{Odn?6vmCCqSzw=
zpYGtHL!KLJ%cZ5IuU;K>badRgb0^lSfIu1~Z)Aw+yvm{YpdCR8=ElxsSm~^+Us2lX
z>+7*G9pVS}F9?hZezMAvIC=6U>IT{%QkBP#x8hAe_GM)_`QSBnmaxC)zz$*rj8P4g
z<4)Sc2%4MY4s`iA1o)23xHJn3i>T-#`v1?LKXEnzz5pBh-G0}J)z#I791jcZ%SEsk
znH?k!@B)1>|NDZ_1el_uHCuo^P{-)K(@A{0|Gz%LU;^j}G#H}8lf^hFAXN;QBbgZ)
z+!@Cr6<T2>+Z8V-VH%dXN^L4!yomc8gM*Gx%AD;nY+$6JiH72{pFy;?_FV_h1z<Et
zOS#xRmC`z{w?9=Y{Uv5&-ZVg?8RR?A3pG{MOqZ^X4unyh!J|M}%lJN(A_xn)I34I0
zZGG6w>GSRF2-Bcs#KRo6PAf92lx15lAI6rn4e%*%Jn8N0fxxNmu%tLHK2Zn08Q6E2
zit4z-P^G8gdjJD|oy<3gbox8RL%D$Du>z>6xAeWE16n#LVrK3FmVoM+Z9hx}?Rrl#
zm!g-vabixaglghP4rtH!9|s<6z{CH)JMh45v!EFB4&a@;O}K7&Gu<WL{<7Z8=4 at JG
z;G2LWWp8|U2L;KU`_O*%Ysc-!rPLx(N3%OvZXbF1oPBX?dB?#JIZBUnlYB;J1ZBy$
zQ*PrV4Tv!9EMkgXmGtqBFl7)X^X%R4+3!%DCHZx-_PBZd1!ZN#YB(Di8IH`3y^eo^
zGd)HdYioH$L_}Cw at 96IW1yH>-h*cfr`Ic%odR~7jA^ReM%68ihgAF7<H94tZvKMAF
z!U%~rG{70W0za`ts06qo6)=Qam=JT-l7NaF94WJ+JXMhD0xO%E!aate(P7%_eFCik
zR=_66>-fCDFezj<fby^8SsxZX#33Zq1S#6}j*Z1*Y<3I at x%jK_1rFNK(xTN2Gu?#^
zs>3-Y811?26BKnZ!sjpbynM+5Mj_scV+qnGS50-fv6rATsP&4D4n6iR(d}X+B_V0y
zrA2UAB^)78$VnK*qty2UN8y`I_CG_ncQEbBv6IFoOraDoldjL7Z!vJOhRN?^l2Ver
zh*LXSQ)nn4)BS)d7s2!up8(Vs7ay-IyRx!^r-F*&2r7`3WlBe$uC)fdhDu0aY6Ko+
zDJdxW2L>FFeS{<TcJ at 88{gAV$nV6Ji0ekV+4A_xNZ0nQ06%K?H5#a=;0KX~;uh*}k
z5_X|7gzUX=@nU5221xV5!ovN~hzkk|`EI}2DfS*Z at uAe;#SPcL3Ea)IP<- at 2)jREv
zXrAR81W<(`1EAj0))vLX`lyP9m6h0>a^S!mN)QSR>?73py5?rJUk~o?XDWtUivg`P
z5n8N91`O5l%1bSfgx9Y};D>bjJd2IRJ6cn9#o)t3iojCg{7Vb+?fQzbB_n9hk%1U>
zZaCVD5H&h|pzDZOHXTI^LS)|FbYO50`%bYBI2N5LJbYk!`Y<Ks(C~1g`uRfJ6U2sB
z>9yHytM{>o;VCwaBV!R1T2)<FR|HRu2nWL5gAfcJb1`1()QJ;XztY8#=y!8-!&5Ta
z=?6H!F!eop{Vn!G;kiCi(>#BE1R5B!gf_2~aB>Z}cpwps#^s at QnUBSCp_i!d-OAxl
za at z5jYLZB+Ty+Fdn^=U79drHtGh}xw_BeF@()e|(EzPijF%fiS83$!74<k!BFf>$J
z%|J_wEz6fXk6__^nf^L4I?8KM2t!HNdl?WOT;@OwrKz;}^dlk at l(B_Jo+S*sc+(Bw
zniG~GPMwKB@?>#gVR%jjoLcp at 3;(vVkcd3*bqTSDrS<g$>t=g9G&FQ$R{^NBvwQpV
z0ajBep~w+|aVS(6>KPdH!gbDL)<;ArXsPn|-BqXo+GQYa*cWk$m%4__6Au<5?uWTP
zuO;L^!h~WWzr<o|U@(r4hzxr45jGk1C!{gdt<T&I6H2`L3bAg|trzHg$G2UGX%Y#K
za9jH$Sg-+#cKL+_17kCIVPWCPbJh3!{nI^WK!xT6-0we9NbLSffk_K at MCIfckeT!p
z1uw64a3pR6L2mB1e}s8;9!JE8JF-u_#E}I^5AAM4TF2<lj=cf$M-TYlz5BM?Bk)x%
zmRD|=0CE0GT^(QA0A%@=Zp-8M6{`_NP5%SB7Z(+kB;Nx7(~@Qw-%41ww@=OG^`p;!
z6*`Xsg9NAgD+M%HKtydnNat5Xxf~&yYPg^|?AGAoM;;80fow~jqdC=E$A=MITP^^3
zlK&GfMAEu5Tqx1<C>PdB$Dw?P8WE1n`bprhJdxkr7RITbvY$PA0K`|m^F$tpY;0`o
zP$)0wgPt6YmoU6|z8gC^iHPN;WwV)LeN}W33X!zupXcg5sBh^@Fk037<rC*_T!=v`
z2ttP6x{ZZJE>1IQrKjAjSbd{m?1Z>D*TTIU*ujMXq__-&km>>rZVp;whf@#YPM57L
zR4-p{#C|&MSl-tOuBviLy;oy?{J7dSgXtZas(UD0i0uf99m#DK>o7#y>5cGUWapu~
zA+x8S90XH^g#~ee=@<K#A=pcMugS~8lOr~Jh+cZ%2ELB7CSJ-%qLZb&DaSs027~pb
zO(+2cZ+IU%GxYOk24y6yR|F!5c*(9LK^b;}`oa>%DJJHEoj_JQ1}7#8jLLSi0K+$;
zY#^8P#_Z1RtHL``#1Bc{RI2AKOGMU|?<n at C&dtps$2?5))9ou-KDOD?$Yugd;OX)7
zhCO&tAMdkK6*Ukge^g=n1z8Lw+e>T at g0#YUCH=#P8&IQUTV9;qc|8;E5{bILJm9Um
z4R$UPO43V=Ugd^Zh_ydF<c^?|xI at IlmAQEv%%<305?LWh9&XkHfs4~U*0#16Ws%lX
zJE{(GO#_o7ge6Sg{}KQ~skh3wOi_ky$A?>WS%uh1wRnru8pj*(_BlZ%gtwS-P)Sww
z0EP4Dw|*$**f23J!j=m=K+Lj9wo?c39HWL`#F=Vk93K234SPAL?_+6Pl*O`u<&v4f
z81wk?JN*I;f6~A=aPn<FDBZYm!%fjE+7hyfjf;^_9)WjTnThr#7$!dtyX(MZC8b)J
zR#fkZW0!8<-pcYs*!%&@a3?RVY-tj;M#zg7{eWKqD9tMn4(G^l$^azTkbv?BjNeha
zTiqvNL!sQD0ze>7&>@Sw2H#T_2gSUp{}6$&!=gzw?xi)@9A~JYMH{Q#QrCxOs^T`X
zXV0FaEXnHCr?NHJrNp}NImi~Cm$f<cXgB)D^yK6_9eq))pTJ*1`=i3-k78yKpL+t<
zQtJvqoKtV3y7<aq521yXm4a+pv|RXEUh0qMMUi8D|HG6)w-XRgtM2syC?pNuxlUu@
zYvE8OjHPcR=&K*3qKb at -eRqoP9_9!@H$@}7HA=(uT#@YFV-&!J3cn~+6TOy)qd_hC
zi!Gd}aH`km)TCGMfX$EFc0~k0q182 at ixWGfNCMz*e?L0e_o80nZ73=G86_eDvak14
zJDjB=HlrF8dt$~#@m{voW59J=FdT(nKxt%RA_9`dl8;TJaEW+$H*qoswh at t2Fc_&Z
z$0$)VGG3I0%w{FEvjw&rIw(aWa at RxAh3*U7tDm7~Jv(gO`WBJ8mzT(%AWr?+`^V2?
z8g$mo;^HxEWa`3*lSDew>G<m==^Tf9&HNJ5>xVH*g+aHk=`T!pxg+hH*WaE_{w#Fv
z+&P=a!N`hWQ&jac>^AV#NZvOR0NVB#K|3IADCE!qiNkc3{W~d3z*KfinLZ2)V+Qo$
z1VzDOv%0&ovF^cwS{Y?HS+cpoiqkrTk(E2{(ZW3$GBG}m9ei&()v<juPZTk&<m)C^
z^iY~wlj}wA$+A>cR$f)yjQBKix2B=Nd{z1>zk(?QAj&}5w|ieXAkL1EJ0L!xOke$c
zTS)p~J&36GZA&<D<9k?f#s4uGUJ~0j(C>*;+E7W5H4=gBpEiVw3RZAl7Lu&WjR0A9
zcZpSITptb;Vcp_r8+DIwOUln<bbJv{o+!wo?2j83IE-<NPA9WBx3-!p&n5 at 29)tK<
zqjY*Uum8ZogWBxp>VjVZFeE2i`ukW9LwXy-<$(*}T&@D>@N+>I5>-XHLJ^Os-me7z
z)0bLCbqC4mU09dc-tGf83_HBx8 at iQ2>XVm6HI9KDahuOEx&T}b(&6~M>a7nAefdgk
z5d#UE&OCqZ8Z*V%#6(ITWjm?$M|MO~)r2)w`>FdKzouWv4U}K!sA<{NftgrWHwA2m
zXRQ6<>KQkmV31_6P}!lWsZ<DN4%jwH^4#_z%o>&3*xiBB02z+ at z<~@LZiYq?$^RP!
z2?rODHv(fbh*&(oS_8}uoP8j$w6QU)PP+OIKqvOv@(7)~)cU1d>Vy4hD<fmEfXeD>
zh4r?#nMjgAmBfdnbZ^Z$SIrRnW#sP1tSml?NGlVe7*%VX=$|t)K0j;eM78eL(W~W?
zWlO0;1<bQ7#B+M?{z<rsgrpia0Y3#6!x|8XDK+W7eW=?kVHN;eL1H`y0z0k@;CbH<
z3KF5PEbBO^g;NC^YH9{wpZESSF^dbpY)$EGfwLWyqy3fb=+QTZ&rZ##nQf60i%m}#
zWQcnC^Qrs#O4bvf4>lk6P}p{6u(7fxINbu4NEZ*J5irm at Wfn~61pCm(Nvi3jJOSbA
z0xb|cOZ34xf;kATu+WQGJj{3$nQ`SR3Y-g?&_!7tK~Xzv<d2Ut at HV45E`9|PYOx8*
zQYrEFIzEz{dKi0VpI=%4Gd*}2IKA3qPteHT3U(3=M+4jA(g*MIeVs=x0KRI}#uSiP
zU}aa=3bJCCO9(aU8#mFDIH5M+G!$`JN-C<d)E_mSB|g$m=hQw&ez*?-ns&7x6w~Tn
zGWqr6eSjLjn^~o?ot2lDHvsYTv*VfA8&LJW17P}9Sm33%`7lA=>Maosfd5S0 at 4Lpr
zKYQ_cTwE81ixFQ`e_w;x(zQFL#CbbLA8KKwKtYk01w8E7g~58uL=>_JQQ&gXkL4I~
z#kHVRKbQa$L`(c`gY-zpcp<6|Jc4%FS5%|e!hpw5f%eS8!*l=M;pG<z30RV}EI~MB
z<Jk!{Z1Ev~N|slh>H^SYQ0NNMmE3tQfq-Lj1#hmx0+u~`AP`CA`*YQ^h5f{l6&Bd<
zP}QMAN!5)Nk8sx8R=!&dylMk)z8G0UrpK0~<4sVENGz!SUMp<!BJddUMob at 2y}Wkp
z>#8l^iUo82=mD<p at 8aTm;iw043JW{pyb+v|^MowVX2*^lHnI(nnP5G=zN7{>7qk{r
zOtUa3ER16HmcF!gRA}gaUC(hicIs1)5T_?jOQaB&lq3$@`ugii5_keOGU9ZMFP)uv
zpdC<o^W1(XCD9wg0`vAR&d7qv<b`v4SYT<S4M~%hkK83r<+*onCj}hLdm(a{6)s;6
zd*XAv3^Mu$L0Mog_sxw{9)yqKv$-xt5h<2>0{5xzOw5uuMlewF^Yevbf>XWgKEz+V
zc#%Wt at pB!*gF;4(gyNLj+z<|my29}VaFQ#7vlbuI>GT?e8|P8Iv+~j}a?gS~j{-Ws
zw4_<6fulq^_5=K at r5cK3byM@}$;(2OiaB=ewi3JA+ZCV}oFIvVBm at ow;+#DiDpea9
z<X)Fx<zRJG6rpG~V}L3`nXF%VQ7zUYq68x|S>5XD)lcO$m7jm#{k^m#CMt?$j?{zd
zO^QTB62~BYDO^cDM$3ZZaenTo!QL=(9PQHz8Q^%w-$C6^466DyW8<%JUpfk01PW5u
z(TkuHA85pz@&u1?V^<CNQ=fT&Ttv&cIXP9b{h{5#p&~FBEIuk~s6QLvyPa7Rm at HRZ
z%}lV$;fUGjUla9}KLcY70t4I24<C-1wx_uvO9(<e6b%A%jqW{`4<Q2u`GkXl5Px$y
z4sy at JSo8Vhj(?6uD%2b*K#MFYENrnU#Azyc_(xuD+qn<>=M+C*jKYB*uCqUoP6!Ra
z0<*ERGrUG6C8mc;gH{~KDJW<U_!%TUl?CY=AeVwTAq#uysNS(LiD{VuSV9F14G6gE
z=q;c}XniWI`j`N|ZDCtZJAa-|M%+(%^mHca)5}JPqDD5J$dPM;O>H7Xr^~IYtSo?4
zUKfQm&}q~v3rW#spmf)E9_%luZfFQq+yym2<#SM3g#ga2Vnd${)4|?D9Ku1Cl9-ZG
zfL#dN3kGj2Z30iFTqO?EdvHiR+%yc6n6G3Og(vU$2f`R*V9>p`igI<$vF<=4Bn+zH
zw at Td!w#e?Ny=J6x=S{^^;TEeAeS~8lQB^>`weCP5#ql_EJaV$KH+WQiAg=x8qJwv{
zu|vNv-&xVSA7bWvPrMnBALvAmKuHSDI!Oe+iCSM<(^9R%HcJ4<@f<xJjAkGwPH+{X
zPYcpA>#VGlA3cpeW7e3$X$fj$3J{`;T8vOm0l+$TY$B_7KcKs(r*m|_GfuR?Nnu15
z7~kd&-4{F%#WNEs0_4b;Cr_gInP_NSFcuK^CJ+o%O^zr!0rltML-Oq&^YH2AkK){z
zhgBxf)=%IJ9~Bi9d=icTF)&&%icx}-`3Mp%=+rv!@8mf+xX{1S8}}+`1M2{_z~w at r
zVZvb;<m5kaHpt6hSr!O3#EBh<G$C^Ex%><{HdJc+vr=N8$$NvM6=Wv5A$5ZHpvVwg
zF_FP0P7`@)a^}ou07!4-iLSr<hLWeKJfs%~83b1_uzxQFML{|1OLTr5NmiA7-NK?H
z%~1OK8H-2|ue3tL^yFl!h{#Ci$qvEm*<*N&i+4Z{Knk#3mI+6XprK1j77%+C;NO)>
z2|TJo+5Qcg>juw3sB8B^crKIMF+5mCylc<iy*}6}hAqILl0JagnDRK5mH*egnw8Z!
zdIvU!b?&w%!qoNy|A^fk26e;E3u9?)CVN0Dc>5IXn+OPRd+3CQAim)0%+C7#Y=}>*
zuO!^PZw at Rm;mX$AeA{qNT3&p7A07r^8IKch*8p@|Z1nzt at On#ZeBw#sz_|3n8mJpB
zC7EXb8*gs{jdkDld!L$<B1NSrN at XY|8Ym=9G>B7411S~FgGiFAOJ%AM6%8aZg$B(<
zSEFb^i6)g&Xe3ER-p`NweulN*{jR;&+V8fW_1s;C^ZcK`;TXQh_xK*PladQyv{nv&
zU at j0fzE8k;CNuL7Pyv}A?992&gXN&50t;QZbV=vg8>Bb;Pd`j*d+&-3#*>c1kw!*f
zp>b3qh+bfNP*<7z7gP##46YKhmEG0>yP`$wyo>LgGj1qwEL*tnXhK4_-r_4dB&1L1
zq`+C|tv)92!du;2`F++TUF8Rn!`_n~lx0?{j9B>*>xmOuzPz6G1EQek*Lc8y9Sx)$
z7dg(hZpyo9 at Iwn_c2#ver4^neadi*JYY_S!-qi@*kujU5P3%m0f}BcoJ_44DrvLE2
z>AY&y7wpWM=q1<- at oX+G5z*0&{Q8S4oAzz$l%1Einl?ufL%+WA^~CGIXB<IV#?B|i
z6LxnQZo3wYfiM}cTdhZrJAb;5*FXU18{rtKp1(lLaJIVnPf?Ie at SK@(o<$X<rH18;
z7w-)TLAq*QVM(Yr;Wsg<)uc)AA(Db?Qw~z~h4tFKM-RJOkKVAqWs0lAJ4u!*t2t_?
z+Vpk|yR!(|%+1^FV9GDO97MK8i`m5+t0VL&Zey#{uI<o!YXw+cUG1FvGP{VLQxay&
zev02;E~H0rYwHf$y*kCDq&&lzgR%t&%PDz at _HsN%na2Vrry-DwA3c(~^lYSy?)-rJ
zQfu~^ZKt%PR5DAb*bW>s{}^Up)+Fo}W%(mDZ}o5*H*@`V?8uGI0FK&;s3cO5_dKLY
zJ=6TabD{j*d7?C4V+O<#r1OG`oOkOf6#=!1aI9CGA3jfBow3|{d!OaiH&)bz+XaWq
zB$@y!X5^@8T|dBu1+Y3uMFHTEV*p-SSXgKXG71Iq)TzpX_}nGYn;(N^j9)t<5Pab}
z5CQ>mBcF)11QUClmv at 2_yrJ>Ut5;W355;M5M)^>IJ9loToCjlz<l-Jse$yAg6o{(;
zYDevUKM=1}MU(~42(HMKsZ;Oe<hT`|ID+}+;BlRdXbQzx?YyiigCfu1IcGmo@%Cx_
zvl;Y)?!l}@cNE7fuFyt#`x)EM=cS0l*Lrt%I>#5$ul4TTa46Lf&6Xwi#Tmi|A$}lt
z<9;+!YTUaC5!BD<?V at S@Fm`;0sqWIlK+}gutvfarUF7!dX^V|`)B*6-H<Zx5PdfsH
zWTFJil;Hq#iRzzUX1xTf(?Hyp4m{T~cfYtP?M1}o+vfx&KK}QteWv%Q&OLhe<jPGf
zx93|i1p+eRf0bfmV==j7Ex=2Y+e|MY1UB0yGAWFX?DEC<rVnKQvzq?MS6;j-;O7 at 2
zO~79D*dD_cCuWT_;(OAjcjRY!Lxx!Q-$P{qIVQ*EKYM at cn)$!E00aK at 61vp+h~6z~
z;2%dGIM6{=KvZ8_38YaX`3q)0XK~!P>j+cHsv^!J`8siWx%iPJISag(bQlF;Ywd`=
ze^!hgEAzVu0RKwt(W7tPzC}KHhTK7(Kk-)c$4Fc+1dCCOt=A`XbXl^W{!v;l>rOu~
zNqL*cE1C^yekSQf^>N#Kk(HCL03QT~7Znx?DN6Egm$o8vY9aDnv33=emAm-pP$tdW
zibUO^RTmUWn!nmfnm>d1FPSE!vFZDLBqFS9{%YkbAmpYmUrF;rivLiMh|H|{tA$z9
zTZ#WLlX#gUgJNBQBgAM7T;G*9>}Sg2Du^G8BOv3`2(=IVvV5TUmPGPL1d%aDAE2Vr
z=9 at QzTp@{_lvU*^&310*?WIeEgXWL)#OsMKm#Y?8&Hv(){@1r}ULEnH{~tcv|K!EX
z+e18FY7cr(6uxa2j~$~;b*`IHD>gQOHA`G+-t^@sekQ)OSyZ#{7&oUyi~6naYOR{R
z=oCEB01I;qYA~Si<`Y|4w>fElx7J4J7j53GsyaHnV`Z{!!md1ZR^^@sR at eMCuk=)7
z%$NqzT at 1%;{`|v}`l(RFN4nMliN5u7B`$Dbp`SfuJx#pp%q)nJv+Ap at Fcf~f#7Q-q
z(e#-*&j4a44ud8g84)pF{2E^UGlbr}H8Rpy#6dvFFX)UWQ$m~@%AJ!_4A=@k<wc}&
z?5l4S1&S|lJs&*KGc=6w2Lq%c^aw82kvA=@ukmuCwu at d_fJJP2dSl@%NAM*~?qc)X
zt$B?;^5Q%h?z7MsMG+t?s}U<0kWC#539jqc$CaO#Na=7B+Ss7lR`E71TehT-j at 5@e
z+g`Ps_$W`r=}Zh*q(6J<((*7(E2N_X=!%_5u1F|)Tbg9u5gE$1ty)38-tQ0RaTxI+
zta{8PkH{+wY%e~C%7D?My#c>*EPZ0Z{lNAYQO5J~vfnMA96^Xn^AjX`1vJnqcz)s@
z$MpGQnqQ%AOVcxqB at QTi^JX2r%^Fze*Z4U2s(&k`A5rNbFaM*qHj~Baj3vP<^!`1X
zw_e(mNV)ly%CBc&ga?|`JT<12#ksnJ at DS5Nf3Ckj=?7|7LyW|g%#aaFRyemRX*%?M
zIzNbO7J^c-?U%zWMS+VXDIh4QuSVOpJ3!+Xs%i393d&7?H8WuRRv_^Vw9#pjw_tr+
z+1lF+J{<!3gg4g$7xK$}41^&_J_5`Qc|@c<KY#w at gc9!)xxhW<`C^oAI9E{*t*@`A
z1{ILVNr5BBE_E{!#FoT0O-nL!?b@}3M=B`F9y&Djzn??158gD1fZ2m%=iI&9PXh^2
z`YK^dG_9(yim<f4ZW<#-{D70)K~~n%%BpWH`9Q1It-pVMF^7lGaF{UR7MsNx{y~Od
zt_HV4QnwA;VHR=w*d2R%mdKI(vw`P|iacOL^5E7kmw}N8nQlhcb&!+GICt(}PyDXw
ziLVuJ)n^mfq5-kItR8?KQ3<t#@;piMVPa>_V(GetzkmKTq*Bf^aP6N8qZ^YfD=!bM
z at EY&x4}wIy{d-b<Vgx0l!M at 3#uw at -(Wt~&9sW^Iid9`WP3Vm(arZX%ZC$6J(3^8R5
zr)0w?m4BU*Mu3gu^hb*8*qd7c{gk3^|5%6-cMpzwn46o64n^}bIE)p~pnZW-6l4n^
zBmYD^Gy0E0<c>B8E`E&HMY0^O2ox6o>_?AkM5iedXpGNjy3uBae~FbVROr&>GzWyt
zHgd|X&(HK=Q}9w^=^D1}*g<h{q`rRGpAo}XfQJdA)pV2X)WiXMx@)S*MZi`n`on)F
zW at T*wRS at sIxIJqFE-ICFZCIt8K>G5bqN4c%OBaX_zcjrdw<c}wg;NAb;+ at 7t*ngpE
zY5{=}x40-jzq1j_dXmI2u}OIodYgCyPIi)$tN;4CWoIVZfd8K5!-;2+{?`Mov3C9X
zns49GNL6S)mtIXTFqoMK&mlJhI^jB}i-QT~f?UyQR^n<S=)sSVPu{$LzfU03AZr|y
zkI<`|m&vZF0CLvp+{=cB1}4LpY7qQckzxXUZ^ORkMC{okRKYPqE{hi{o=OyFq at TD_
zez*H4+h6uv<Ly1VGis-|UcO{Fz`qVxj57g=DdHA1OTtD7$i}l1_KOzLrnmJyJB}ST
zbD{weAQL*>(9Tbai|IENIUSgj_~<zchOJvgTo at DMd+)Al*RJ3T1F#Fc{T1=C6{dK4
z)&bNYtq_n%)=fNHPfNN`t>Cv}jLvRvU>*A at wx4so1f5-eqj_(iw&NyBWS(EyRP^kb
zv4+N0e?rhLbgU5xQ(O`^(QMeCh98cUWt&dTVkf6p6%{=c6r5aLg+Jl}=7|S*RmcZ?
z^X1Ef!G-^WA-+dj?;X%rBB3c3tlpua3)}oD!O_Hw6ieqB#tahldYTW{hWFl}lCVz1
z14eux=_ae%r{~x|IGB*px3PmT9hUp{?iION>BB9=B^UqYbn3NCc7$KJAUL`7-c7u#
z-kQMWdQ){SpxFEZ0AEgSZkGTHuJL?2(6CQpPh0ibbB9t;*@q8|q!@2ODTX(+Ux9#r
zOn<R2F*g6BF(ZNZsC+b8td5gSQVsmv|CwRokyka{g8lZoCEQt#6I?0(L=s^PuAt^{
zc=I$!xQO28|I4Z+0u&NCAq~^KOP8BU9Se&)e&r5b@%|a+55)&qW_3hsNtxEbfdF;s
zls??tv^%rBgN6(_0X?hvPe%*mVb=1$`Oxggk2i4pkfp`&h})O9VbrKmJkdNzQ8Q;M
zH{CieEF04NA`zWt5nE`If3#`aR%gBm;yw%zA^>Ho2o#*3fPF~VW39Ib%Si^tvN1q|
zfxCA*W-Jv|aztE6^s3BK at V&-R@<EgnUHB}p_N!o$64oMdH%QeYAG9ES%%?`=0y
zs<XRyKOoHt$fm0f1!<O!13X+Ww1t^rc=P5{LhjnND?}Mu)!VjijVHL1PLsb?+qP}t
zuW^%@4pP-cTfC9H2XW1xXmD1{-OXFK-o1T$eC`FCX?OT*qWSe-N*XwynxEHxQywId
znu1i|xdbFcq-CLzPe}eO!*v+7#o at hIZxlW4%0cujzec!RIcQ^$GH>z7Ph>}pSyaGz
z3nHt(8;T$ca*a4pnt at bIc*C{805(aF at G}n|GWzE##H$~kGBHs>0Ra at eT<Lq9(tnt~
zew4mT;JI at i6-TF%5sEZ2FtB*bn9-yE)PI{!^jPwSb1jKqAj0_0GZrj30;Ih!R6Q1d
z&4P8)6XhmSq-W2bk(<t&HOm7+9;UsHT?!4A at y*F2b_870(bmqne!VZm0Qfj~e$YbA
zce|>fyXfm%tS8IGl)p)%ylNKFl=*?a3dt7QNfgtmKALQ-j^nTah7f<|viCrT#k%rD
z3e?)RT6B;Y=7ILmp at r!;Z}e!B0)|O<!akEj2cQV>`>ooE&_7%_rbp}bBR?{SOR%JJ
z>r-jQJ$-szRlFOGdhbD&s(bbopA-qeefx at tLjtm|U2~=$fO?Xc^>lhQeah+SdRa2W
ze7<Y3M!r$^b903pf|4>d21lZDU?<OZ?Ikgz^&{caJ$mrq3r;)r#8>ceN)WflNqLkQ
z6|7OrglE7+NIMP8nu2dd8LxsW_4G*+iBfY2_7fE|KI+ at 97!p*_o)N(0&T$fd-gQb1
zpSp<b8Vq;Nf|Hm#nrpu)$V+^;(r|%88erOYoP~bmatix6`*#Dx*|b)kkRvhch$iv7
z*RN-I-%%VzpVbWS1^p$G1$P#m;?QG$Uj}v^K4i#9@<t#B9pnG}yQy8()CAV9v!4UN
z1tM%aYcmeL%I5$oUGHWqgxc$F at bH+p7%OkqK^&P!Bbk5FgHa#TrtPvhBdBR#UyoB&
zeS1pA%!#~{%%Bndhwx-OYE6Xf3#&v8Bz0>_2T9^=vUQ;~vwXsKe~`Q2jXfl0Jt+)3
zJ_(lV47NpaXAC3P^vy-=T_~7JkNQyVVi}>B+NFA7aKUGi6A}`h;5fU&wqP&>rTioZ
zcN#a?DM8CPJp;$!>$cieMq+rA at 3ocd9%DY?7!@9PBd5-tTZMO^d<qDy)0aSdJaL<+
zrzZ$2Z%tPU{2|ArN?;4B0-~(19D&!!Ya<wjhSxB$UOzsocInbLYkxpMd#lXVv%Ax0
z2^v$?r60UetR!@i-21#5M&j1Zo7h?#SX$}DBI@$@=VE>9BE<E=+v0^1|IjZblxIoF
zO7&1c4vL>=|8AS6^Xd=XCCNqs7Wg&$(Nnu%jQEH1l?(73Xh6RY(wjI^d`NLp-N;w)
z>k9z#md_3*13PoZaIZ}ZUlns*Wx9aEa`T5^K|6Hl at UW<;n-N%tZ&b?1xM1qcL>i6x
zgjWZr^yes=Pn5B~AQEx#|Ej!D)Z<7T<W*%%SNpX}yog#kJ!LjWj!Go%5o7XKaow@=
z503CreBHDUj<c{uJ6%(;z3FD8A$vjEGv6VRsPtL&J)Vm1S=Wc#&sp=UX0r*{cqsh`
zhiCxJ+ArzJfIOs)XVX?jmhZbb+bV|>FBJDKZxd%Ahw6xO;~^%eEqIMC>Jc)bS>Og{
z3y0j%<j3Oce+hzUN@<&Z{r?^Y at P7t8`QLl;m;vj>r;K2P(;I;9C8n5==Lkp^dzx)>
zdMSRiKtwZk<7l!6b)BE(GjIN1K!m{*Kpup|Br62n1dm*7Dm2ZCoy<~}Ue62-30aK{
z6W><eauP-o;vr`?Y}j%1q%4OQ!YBPqfm!yrev at y$#j7hhB?Umd&{Kl4$}1{di87^=
zB-S0pYS>)|ng$BiPPmGRTs^$K#O^*o#ZO?IeV+L*UR((a)35XpFAd60h$<}|4_(D%
zkACrLw_p4cuFEQ`1pELqYo at y2wv8mY4Qd_yjyRWj5Er+@w~`+DyxL&qSP*LzY5aD|
z^qe-8dLkG|o=CS8B#A3S!jqh<zkTCTuZ at w&Td(sbN~XS5dWv~0vZ|_&mX6f_+lcWJ
zVWFY_Jd>H)AYShu2;i{M&&yYmxRsf<Sw7N`#`fQ!qODuE{x~kk-(SH<Lz3A4Yn_eK
zIzp)7l_TkJD=C>@zFJauEIr-v*Z9y$H at 5VX^y(EkcB)3Gzw!C1)n*STd5ly^@%^2*
zetoM;g91Ay^yf1Uw?B4wI=vLFC*??oQc%>Z!UAQB at mv6WC!(JrvQt&NW>MNj?M+Qv
z8X_-3 at WgkpA4JKAwOHY|nLm;EZ5u^&-2C;w0@@|M>(Y=3X_)X=MA}wXn|{}(lKv1|
zQafQNA-W_g!<Q#kslnl;rE@*`2wYz=ZEI at _#2X3F5F<iG&qweHV}m+b#uoq|pk75g
z1^pC;#>UUkyU5AOA$x=TfDsved(VLbyv?WL;$mQJh|L$zpO at Zxd|YnympwE*Q;`>R
zGe)@Z6_9=ZewskZ5e~e6pH`HD<sM4O7kj38y=k;=e-#onEvH|o7U4mcEL-*rew2{2
ztcVzGD$W>b+qaqu+sG+`5yY>oOX=^LCF)63sfpN4Oy=t<BS*p)-P&kkov$%YUHhWy
z_|x9$(5 at -0z^~pD7DnCN-Q7KvP%t%>!s8>DCTF{^v%B#va*_KO^|rp1lV>V#Smccl
zj?5ag8@{xWyBpDLRQOSf3{+BqU|eR(cj&Ng%^I!rm4NVs5Zt%^t^1Dh{OSY__xAD{
zRn<e-`gxF#lYR`m%_l-aH<<_}fk^8BPhU%~+wmOGFL;J`8_s3mKqxPDYgAx)?QMxZ
z*P5i1M*jq%W at 5yV>fbE6!>L69_}7C!%3i%XLF!K$uJm*ZJJ>A9Z`HQ9ii*QU!mWB<
zmbfvnEl8vQgQ&kI*ALg}8U1?^r9j at CGtcVkBnXLkx@-{rE%eGy?nt#{m<FY=gHfM^
z5FDh6yQcBzdLZm<<@24uQdI8NzaaP>jDGmNV(oEdp9H?Z0dw&QLj&6r$S3j)nG}_c
za|L!RFGDFK1Rc0YbQNV;GFm9YOV1_K_ at CW(Z?ZxA{d4LsrO16uHlZ3`rA_=!!oyvE
zJ|OSxiaC)}2(rn-nLcRw5g>d6xyH?u-ISkdlpf7;-25GK+|BE+7Q7s&jt3>;TKngQ
z;86^6s3FZRJyR at m4@rRBOFDaw?Yb4;ey!WAjf~f{v=Egf$0?I1S5;Sst;@PWc7gaW
z>5t0pgzDi3k5 at nFXO$S-rCNVpmd~Lx8^}ELJD}H=#+7hU!y+x8uv_g=Xy}pZXVjuK
zV>!-A&s%`@P3`Z3eR<pK&q$8spwqwDJDuatfD>h}L*`~O+q{545EXnm{c$c8n=FW9
z8A=;(^CiQNeq83HD!w>*$p%coH6X=W19#k^W5;{h*?IZ->aox-_7)NQoYUy-x((o2
zx at nmZ;Pp89PwSV>C+g{wCyabes7og?)Vb_7=#wb6ZM#AOP^uYkQz5E9Ji`2q=(T|b
z7M8fim#&ERCJv>rHS^uQ-nO<6 at god`%@hfeBWAe~2V_ at nl`{O`vHSgz at t-w6#KK_7
z{a&NoA&CX=+*u}_RaqI at HsWH_dAL9EB%BKUWjoczI7}0B2(=5oBWO})U~WOF`NGyO
zv7@*4j<m}A6L*(hG|S5#UApXnWY0|9zc<~?$w{WqX71KoIXR*~r2ihmuP4u*t-Hx`
zle=8c921bplOY-O&k)bz5rIL$!AwTeDlxfa^`*2FRM>X35-}n7=9Zmwkkz$y9%V^!
z%QpR){z-dIMciG;(18hqDDp)OUr~t=E_Xoj`WDU#zAX8Pr?#Hf_3M%S5~`<V=SmmY
z9J^MP4L8T;=RFOrmez-suI-xgKQyK+KkiiZFa~G>6_vAhD}ll{tX>VFt>f=>;BN1_
zA)O7GY6%y{;t_sFFRR|hM-C%-z+|(RkB^BU9Zo+m90vV8T5zcysjj~1Tt&W0_X&L|
zyWz}ro`Glq78?o!?GQ=VF6}~zc=&RAfi6MRo&uBslLZs5Ws+$?R;8s?A*7;5tOUK8
zI(@p(E?_*bR9iEa-nnX(Xo`86nLf*x>;AB`u_>StJzy#9Va?39IS)y->7#OZ@<TIp
z68$5vmWS8A<Sf8aaly#nZ0krV0|N!;f195l0PAogql@?mc&FcLYNVHsk{qXlnnNF@
zz;&gX|KwLA22y|qD1w%6SL--nKmrgA+2TEh?{GT>IzZK7*RIdhS4fR2ey6o4T^B9a
zsnff`K8yk6yDt%{r!1O)10j!l6Ik~4?Q^^Xsfh{s3%>w!UC7wh&N_D9?ZRtp3(b5W
z$TvEf;8`l4ozwem$J=l_`X{8pRi~s0|E{TIf*FN1H6WG;!KVluHGX>A*3u`J$`GU{
z@&QA8QWfYAW%~ZKOm6eNv<a4=gv(1V|755A%d?OnT3aT&X*0q(+~=NXNolNF!N1t5
z*O``q#>^jFjMCW7>;bPrF9cSiDZpd=A!H_hVkOU?A9>RLIUkXx5e+d at m9&E7c)A4-
zMjaFjG0W0Y_ID>0Xl0km-q48Cy?b%8osPyYGGzEPy*qan6JxQmptQE3;!2EUY5p+l
zsyKQ-gE|S*Af^42wkZ-cf&l&x40nnLRIqv*x;<i5VMAT;-ZR|e_Au^<Xa5LG!O}n+
zwe}^qA3*2My?d#3-8}Fn_V&dr6K)d)0~kDLoYFeeN_MvT<wKM8BfQMhqOfBkZHJ?N
ziOgWrwlSlpS%6uR=%^w2vv^Z0-{j=G(w%O7T`ZZ6tlzmu_wM1{2d2b;CMv%sx$k=X
z6dkgkHw!^^HlsQh(Yu>>?gT`Ppp?7d@&{~R at fG1wDR@vo$kmJ9x38O`qD^V|ys8lc
zb!tz7UCw&4RB1ryBtEVEMC?0 at xo?Y(KH*AH(Z1hLAznlnU0Ju!=(%qY3FW$T0jRc$
zd7-gzt2^yGfjy(Q=U(Z?XuN(X;6r-)7XZGS&TF=nf%5!w|0f+mocL6!V|@GbuMK>H
zzF->%5KbJ0#!%?MG3>j^5l&XVR2p^d*-EX at N!Z)l+O at FOszP6ri$c$LQUc6a(t4Sl
z|CqX%C;19;rW4;)FKwI at S!&tOnyCubzf$&GDr!J)_C#-*F08^k2i?TyXo`YBVq?3w
z#XojpNF%q+BaY-E-7!^x+rMv9zxPO3?9nn^zwQ0!w-4*`_cz)a`*iKC^$p#w6TToV
zGk*o0I?tZrz}NNtn|~N6?Y=dl*MlWt_0b`@UAv2B8jdC2diF_pLdo85bvyQ@!oSCI
zN)C1E{i=U+3Z#kmKa0_CL-h2fhgQ?F^>KRuKD|CYqcqM&>&Mlt&>d{1*D-Zz*XA8q
zH=U7bhXVowwN1?JI_%MZK6xFu7iXyJad(CV)-Da6)X(O9b<B-34H%#EGEL*0|J_a$
z-e8_8t^cw|d*r5CUE{V<;2BX<n^t}JM%sjwFSxDy=k5FV^fK=E7xK<YAqLytzc`hc
zDCFyoJLBY(M)hU@<HCd!8lj1oZ_l&)J1%&_(ji*IXr$IZUG!M#-&}xU?VuRmOb<uw
zCwF;Z#|eD}ev+&#H}UV^w>Z7U6VYl+b8;dycy4wAr==aC`TD{oS=ZX7b2T$3*j?9j
z0dTWVB>bGU`rYyW+VM1 at G{3HBVDyr(tp{1+NjV1*1tNGleiw$Arec82r`#P>i`{Jk
zCijS(@~*Pd(xR!CY0ON~%XE6&{;ll~;X6+LRizOsIL0}*?(A$_zjm!neZ~3>dWZbc
zjZa&?8|e1=0*7Z|`Z$(_^MuG;&i#$G<@tSUGie>szI at 0|?ekL~LHyaPyTG)kiVDo8
zS*X{jXPYFc)cQ?hOA41yyxMVA5BcjU!|eNy9J&8W1F`zDA^pC$KQ-r6=+EQM_(1~g
z0SRB}rg$>0j%$sbnK|72XGnN{yQ!KkI8-5xQyqxA^HV}dclyS4Th_{J(2z6sjMK=d
zrz2>Mf|@r?(D7%u)i}<W(fQdfiyI~j#-Hjp+9RP|N41?Pc}0n`_BPu$dEdQrXL6El
z85Wn;p&);^qO{b|<9iloP1tC%r|Vn4xie?j;Ghhb|3;~qS-3hq?FCgNahmoBt#zpA
zZOHhA9g0Y<V^F+8DDe5#hg+uYAM%$wGCr0{rQw$GG#M=zM6K99RQq|a9^@d&o1cgh
zi?(-LX>F3A(mq+ehUQ5sZ%Ph;Z6gmX-2hQB`R3Jm&(^gx5tA6Q<98X=y&Pb77Bpo;
z$GNXpJN|6-e04-<`0F;gx~Q5Z1umCy(5PfqM4LDH?PNTxKDS5$%qKl{*^3g7%%+m5
zG%;;kc0yKN>u6_{$vNefl_eL}O`JA#xWnTcH{N1*)&`#Z%Ll7Hb5QqP$7**{C{Ff%
zE(kwWc7G||3H$o|kcNS$L7KVaQSE^yXZDia)i+!gFtKx?=;rbnt at 3>J=;+C^?&gDa
zOttzd2VEFW(}9ATTAI03i9$k*QPT6cV5zpty6Q74UpQ2?bfIow)u>bV;w!C(Cl>x7
zZnNuTsHeAk-o#NxM%s#Q9HIbNS4pF->cIwztDs3Y1QsQKv~8pv>2apfk3=B`{n+2F
z_q3{tVNW7be?2_(bxO!)8yE7%k4I;ITY12 at XIj|aolYZOQXD$^DrD_DVAF-sR{<#v
zdhU*D^>PrBhs6UPf)^G1z6A#PWNtRi-;fpkaysYyC2nv(Ey5#>EPD{dV!OTd&JGdb
zR6d+$-z4xzdEDZM*<Ov=iia=Rh7j&=?VYYYrz$S^l*iyvx*kbTKC6ot?P}9}k}5e#
z(`@>W8FOfkMhtv|%2iR-z#G<wq at R!f=EhN&?H3EDjDSqXei>m72tiZiJ3i<1uo)W8
zwjEM#<>iG;oz#OGjL^;5Ms7>T#{>%kw@=J4b{oSrJW7dh!h{JQAK6+FW9$$G8?ifU
zg&gO{<C|Ghw_Cy_5tg5<7?rH>=f~s~w&O?4ZNFSDpMyv?cGO8Jz=DCT78V3b6kC&T
zyb2#sw-WQpUOQ+|otVv9kj`Fkgj?>;P(SE-yd|vSUc;B~&*|KvT^Y~8JN1o4Y&P-n
zHHd3Za&#SvRUfo6onLi~+(kQU;@&?Ymhp4v+xPssv47Hv0dH~SA0Q>qG5QKc=@N`s
zP}{=gT_kQ>EgfYU;1EC;sfE=0kN2n>&O<M)!V7t{exOuby#v5hcJO|O!*n{H?tOmz
zw%m2hYOTEvU;R-9EvDM27Ht|l7tu%MZrvtYbm>3EdP(Gzvu&DN!)mj>huM9F56HB^
zi*;ckcC8zK$IVOv9Ps<E?O%g^v}@R(%c2AZ!gFoqH#hke#e;zGyY=d&s~AB22*jeH
z{^vRkBjg8B8iS=kvO>*&x2E}#K<A=ZGRfzarrNLCv|BpIWAwxAZ<Lr-G5UOAc(`EY
z5~wNW6NVV7gjaf+?0J;jg-Hir$rw(3IYadI2c at dz1<n#*SvxPATiMx5$)GIOlO#ft
zoM|rv2`nd1R at WGQ<Cr;x1|y>=L3?J4Q>P_D9Y#;DOXrhv=XyQ=mcpJ^*4U at a95j5c
zqZRCv6TQ!CJ(S*Zm^5wL;+OZ5d!RO#vqZav;-YBXK}@m6$b)cTo+0j?V~7CWmrg0t
zf5C!=e+#?;Q(Q!nl$tAB&2~_FvD(GP?Zgx;ZqNQrti*~G&5T9o`o#+RAbkfIbNnCT
z#7_X;I2nY`BoCD8p3EL;W_RP3Gh|?kLle&b^f;4hY~uQ$DzNSIi}}e5jIZJxnZ3GQ
z!=?jK#M5==YKn^bjCX`WuJQE5f^oD+o*C7-g+%S^n#=z$-EN3)T8JX6?5=v`3PCI_
z7!5-?a=hU<RI<l(MwcX4ua at deXGqwQ09R3C+>~l>f!R<jc(gp3plI#^!xiPn`utwB
z2AoT-T|1`_f5PkRVB#$c@$b4N_C$ZE&;PBzt;O)a$8AK3Ec?FdKHb@|_f at au^r>4p
z`#F?HTP_nPHVY*S(Tclh!GblEMsaE>J-Yi^12aCkAalTS`oDVTlsf5`T`)fET3D4#
zf5{7nLzN%>Km!qb%x>IX+LrZjSZn^7W-K7Y&sh+TxLZ#*FvsR;@b0*~1ERh4q3sbd
z0}E~;gol}179moqIaP~b2+8)}4^Q-oJfB<FG}R>SUNxlW(5JIE{%0HAmeAENcP)Qz
zyHg|E<PL2YOd?{6&el!i`zfM3O?M_=1}mOQc_xBoYBDY^R5Iv6u<ZNVZWTScV<=)m
z4HHR5+T7Xmhte*p_6202=-Pl5t)36cHQ)g`uq$3%jA-!SJY{E_MckShdBoXqOL9I{
zOGCrdue*cZfA&1K;&w_7f>F7Lt7i2$*ODm-ZsTmWzaKVv&?xmKJ%rSq{hT>4rZ>Wm
zrPqyfns+u~zl_<kDuYuiS!xymCYXHt_VCbk(u;|h0}=s`ZVrgwxBIs~jep=BvrMJR
zzV$6&bo3L=k2}{Vj3GY at n1l;$ICg%5{Q<+kKEL~Q7E_IAR4={n$Tj)EEGY)Wz}~D*
zX8A;KAm9+`PyVEXg<(Ry;J`DQ$f&fRqVci%&sShDJd1z!vu6iV+a0y at dpanW(Tj?`
zdfjdKL6zg&*|WD!TUooGY%S|QsbPt7*PqJo#1VK_m0S%%o)mdG at 9e$X-y-8`4~8(Y
zL`PQ_ZP;vD22qCPY at tty3+Y*{k9hy#FnwAPfdk<IIUwW>dQ==(q<Pt=A!=R^Xs|P?
zB2R(<f>h9xh5FBdnq6&)4C(cnwJ7jl^0pV at PUln~-B=kRdUhgyrP>YJ`f(5KSEc&;
zAT9_Md?H%gb_S9$RXU1K{&B(H3`-E*B7eISA0MiTcEnkUC066YM$I#UeJ;6dq<C|B
z^=osDQwVW?|9*&kf#IxRN1%p(o-B!O-?OK$+wv7Fp2)lT?8sSkilo&|Sk2@&cJZ|S
z(4d&?n3b6`XtlBL-qF?%ScSa at LjXlKU|{I+vRIG1$3MR$QD<uq<bZS4dH8TiqGH{q
z=b=-3g&;UXO22n at 9~2`%)h%MNy*eewC-rkq=r7uYwY3Xqb6YswNmTa;Nut$${*zgY
zvM#lc)Wx=xwFj0g7MDS&MDGp#Ne)aGamu6#ZMxoWldF&qT$yvQ+fN#0mKWS3gIxCh
zxzE;*dtGF)8a;YY`y(Nw>*^<V9hl)at$sX?57DH|!j{&NwANjkM+ZU7G-JT%nQ!&N
z#latQTSqPNLhIS?wcVp8l+Nh#uUlVHafiaWl$aU4CV<y%qG37t)kRG>C{_Ey|36wD
z*ZqAm@;#1pmUmdH<;}$|ROS^&k4T>lJ87XQn8bv8$Lu>W4Q1B4HkY&m-*2u47g_$e
zgy3mq$>qo$YRmeZm3v4*8DM<QuX7Y_2WY_iM&W1sm+Y>$8jqYZpvYJ|8Fapudry9^
z9xLE!)a^+3;r|g_$ad_gq&-^Ve&WKU!h`#3>AQLQMD;<&YtNhVh9hKt*M4DG at ZKpp
zx$N+U!y!e8APZ0UB%OHh)Nh!;YrlH5g386k>eQJk@|q6s)-bH#!8<2g^`k;$zxFyt
zwy=|}`g6rFtlxY3O6e}3flnbHWag3UfMLV-9O~am#bDC2!yDeUeenA&(AN`rL>2e!
zJ-FA-l)~=v6L*0ktmO8x)sFzs1G1@%9q{n{BOh^-LOB3a>ijEF{xs$=f+nJLgeih8
zNP##rEZE+ at 4ti<>2u%INb}{{jU;lv(CLxus?5C?c#rV>j$P>49OxC=7rS18r{=$Tr
z6N>sAe$ekst>5z-H~i+<h#n32Jy3Wh4m*oJoI~XQ<om at C3mi*lE!X at Amr$PGt|yCs
zGdpOn9}Ba at +xv2VjZ`yYDSUOnQU<-lY8_pZEf0<X-$Vg;&!XZ+WGS5-#gCRboNu$!
z8wLdD6F}W<u*%JECU>^i at w!F8 at TYz!-#Pz}zUD5c<@={V*d)F?UNz0|%=9pY9hSSA
z3KZI#GBUC4 at FC)7wRa^BAd~?NoGX>S<y799)<UXIyfwtYApFjvkNab`VtaM|wCerf
zMb(t6Z|ousJO>VbO_;SjBS at ADGr@u=I7lxuZ>e?io1ar`4ouGmRU|Ti12fJ7GF|xT
z`zVm5PmZK;J~dK*oBy<E6V;wQbFcXPtajO3ffDO3+0)_B08d^@$Cq)u(1|IWo9!}e
z$PlN#UR>QVh%>oI!TS6LDblCm;?^<<uf_5oFIm0;ZYY**jX=*)x9CMEc5K>u3$77q
zn98nneIY%2?V3Q{n=43eOw0z&v|Gll2%G9`Lmg9T at i2M{H4l5*gaie3xYY9kWgAZ1
z>29K7gECT=85?c)r;Pjicfa;)5*JY!;?9F8PPTxifZ|DPK)~ckO+pP~zQvSDA}ldO
z^WU9Ldzy4=_g!mEW^`S>e*JHMxIxz^JkW|yOq`T7O!hEG$oh7QzH6=Z+^1X~Xo(T2
z?wCAS2nzXBE8^{T2Y%bwU+Y!-3mSLt-J|+;<FEnq1TN(Kw1r5p$mQhe(|u#<9F6!n
z#~lr`6E~f=ASCnoCViDn#AI>;yOkRW@;|DIxyY3kq78-8ooo;;evQu8Lzsy(nZ>I&
zYgE3>%GzpoevW})Xs14uWiHO?!D1E>BLJl at n2S1mRP>~N7uS{ry2+qi0|hPV at m5)A
zvv$AIuV1~|M_b#nZ1~1!1DK3(%Lu(mo8&Ui(uv8{`)T7&?2^!@=PuXB$9r at Zoj|9I
zQT7_VX*b#SN2TEjry?Tk;H)qHogBQ`=GN~cr(i1@$8T_Vw|m>C5#P8$*2;qXhxpW-
zLYaR#Fj|q*0Xg}Ji$@hp{(uPjTwHkPC4ppNGSiv&_(Oks+YMMjUNrvZ>fO3O5Uuv(
z4nulP{nV2>+{er-TrZ6+eQrjak6X_$m$RR{9(i(f=mU1buHc9#&gW)NL`{y{6awG9
zV6wIHWHgVBLWe}XSnYkdDMj9M=e*o~a_qNVH#Ph+JYcuSe`ea;BnQ9vpTB-7LK+V;
zDC{F?=l>-xcuN0;BR24odr)cEbB9a=Ne?%*nfm(r=fBlax6y)m@`Sd3MS$aJVqSqw
zoHxDHJ&P8)xVTpoXu4ct?BSRZX|Ktz17}g#(CX~YqNB}H_=a?!y6gM}C+QjZY_Rm2
zUwb-WnLhZjVzvgZ%3AwuX<gP?J+i1Tj~mEpq$~HH+Z?tjJSw-VG!g8J9PPQYj9i$0
zpwr(j<U5eaXy?08B9xa6pIK>s+SAy3(+|~dHw%Y**XLQCXx)0bug%8^TPMkBI|rQf
z^}4-3vGbLM22mC#CmeUOI<vr_Bw%R!r~z&U6He~y-gBw$z(AGGO4ePqw#I6-yY!{^
zI at 8}@Z63GY;Ia4nkA~|HE*dYnZ<zaW)Ucw1qmDjWW&4w?xUgd*C#&#s8fO$kX4RS~
zWOjbL+ at qJ`f^B{bIt|xKZh+QNsW#n;-CT>lV+T-S+8!_6m)Evaukw!{bq(%^m0!5{
zzF_6D<Bj7kDXuT-YBf0$>Y8P@{@WCyy{iMZr!pe*RPr`KbWK*=9=M@#wU<d)_y^y)
z*LjbmDQEz%Sre*E*ZZ3BeRaD`?s0X0c1ZY)sd0 at obPkNLteEkH09@%xwxa_wT9v1=
z=z@?+!?(8<a|Jy<&n>L`HloCH-1V&mFD{44o79<I|N9Z4&7|EqUCj4KM%vZnBv)4E
zklz~UDypiEak?r=x(#A+W8FSvqh^k2nF1aVHP?@(?Q`ox$4cwBPH+Fq^qij0uzBr4
za8pa8zMq&*%__6@=`!<n6yWG+AMH_wvP8i+89xPZY)a2z^Y?`3-++l1fA65NN80+5
z@>j2{BWC!x6udA=dQ`NMmIDX{vs~|-EAdKUmZ<qyAuX|KlhsYo2K)SFsV)VsHWTCr
zt=l*$r at Pc<LXs5Sw7E}v&|gW=`$+HLo;^n$U<4B&On1vOc)*eyea|RS`Ouh`X7S0$
zEihjBI at 8?s^oZ4`J1hZkplkC{x6$j%L)`Y(P at bQuxxF;w&yI)RLgRGXzKt5-5^h;W
zs3N3$2SF98mbH`i57YM at n)Fq!s~xR^6CE92l1D=|E+rx;IG at LZTV1?suSD$^OH0k*
zD&h%ra8PQ%y%>Vo(E at rIiedb|EQ}O?Bp^Hdw at z2tihBePqA}^Z%KN*KqTPX5Hs0nZ
z;5RbgzX32X#LFll2JCn>Fd~Orh8p#1vKqSW_LTssGWPgTrSsP9dk4?+0@|Pv1VBiz
zU};Q_Pw;??N~QP$&p}|#_&fUQ;(jnIGk%$KrJ#?%`)&MHltt^;^n)YwA)RwdoS?-D
zD&^k04;~;d^;H=EsQaIo6`(aHblpY(Q4&#(&+Php)O{;%igcX8Rfaba6b1y7K5#sq
z!I19oAE5?@?(x)T4TcSal6aI^SwI)CujyHb&h<<XT7syGEhoKzR)DXu)sAQy&_c?9
z5_=_n&D<Z{ni&TZ+tJWZzjGf=ubj9CrU%WB6ceOi3M)HkO^tf3$*8e=7G5OfWDCg)
zUs`@6l|YsoGGQhQUtjO7ej{AVR(iYPY3!xVHswC&MpNqIr=oi=+GNm*ASiv6Io=#<
zc8yYkRkzDq8vl?)LjlohD1vPXCxx((&~!SL_o^ytnfs#-JCh|e2l?8o{sLK+Rc9}g
z7n`2U$bi`2p<TOytNyAkKjM=1n2mR*;Rez}h1ymA#Bxh(dWI<xh99n*9TpX(J?Js3
z4~GIJ$nXor#E#^A%TSg3 at PTQe=>;9iH@>t#y?7^C4s8+CvgR{0%%f!E5{T*GDw>P$
z@%AOaHy4-YYgAP1NzeS{hAF5_VAPR|-4Hkq9JpC8j;hacKb3LomuZI1w4kX~BwfVR
z$D%Uo0QL(y5OZT5VEy+UK3pU~^wi)MDmWxo8Sa+xywx7TzN-9dHn1q+T49{q>_4l$
zjKjjqKl#>!y#@yaY-D_kg8B8f(G0M)7(X5g$w{iI1>=&?WD=7VwOZPdR6@&0RJ51O
zw{|(^w%$nGYB6HKqWgm at XOD{7=57_kWQ#5z88!Ijiz&VHTpIZv`f)&GHxmj%IOWpM
zmT!pk;tpK2qsD&u%9V-1-8(nKIKI9TNCKrDkisLLzF4rw8bMWMQ)PVqY;sLtif{Q7
zdy_2X!uYE3ONXg1j_`yD+uxm`Fe57Bbu;Ec&*Uh;l^DagHewht%<TUCY2TA5PZESV
z9_g5LBXW9s>@NYLQvIKt7?r_uu0bnH&RpB at aSv#Lb$lC2^iNsftSyZUrKG5N3@^^r
zy4hRXb=fjwURWq?MC9np+i_93SUD+H(Ob at 2n(mF|&YXTf-|vy1+lgR>Yb7Nn^zv4I
z(4Cs_JI-d`rLuM3I+Pi9Wfv+tFb?CyWy_$(8Oei(4n3*pm_$Q&f!vn3yPTmy?`N1F
zt$7wITDDDCk=IbyxG8HmS~@3#=l;GWZ(48dUHyd_KQ+*aQNMr<q++ywDY1<-%LIl4
zx+pA(RqObn9W+OKOz~4o-gDCMapRFgfoG#i^?L_?EH59pIVw8Zl+RK+5w*biUowAx
zMkR>i3?F+-VR`qa5m`V9hUpHsOb at E<>KF9zyUb5S2Xg8i9_<bf2o9Durh?_obY9p)
zt7Z2t8^iR;I&^$m$3UrYNH3+|0BA%zf6Kl*B_%!(P3`W=5-}p^XL<Tw%KNgiGxUN4
zPBXH0 at bdbF!bkL`%_U$E4<4*yiwopTB3A#Y-&lBDp^Qsek3yTMBIQSjiF@(#M+}xQ
zmJGj_`n*U1VTxZ{_a`JQiQiGa at 7Rvb)p&ifv{{YqP9uUe_3-Embz|)+;s{Q5{<`zC
z=I0KpsZ$5}7|n3S><|-T9h4eo=EnV+F{!9*{aAT6YQ&{7(1|$pSuSqaxQ$&FO&C9(
z5_!a|6Ff3`yIy($vyf;^DM%<+a&dKiLSKjFlzHm;b8_b%d_BO0$V{j-ymMrzZT#JA
zt9~w+`^}h<f*>Ww1Q at c2RH#u6qC4luPSP4tHoy1B$=SIS01ujbX}sl<$x#Nbr>KlS
zN!fG7 at bR}Jhb-nyt-{X0#<x5^F(N#)*J#fZ^hvm#rE0W at Y8`^ZO34njrU$3(?q`)(
zA at h^^b&D1)0v$`k5~t_PMb;`})_g6!U;;DIW)o3tBfR6#8QKx?J=?(o0 at I`Lkm72Q
zyp7{8phASUppL_{2ie8Bvn}YEu4XuRGv0$aNG_Q%8L5Rv21*cff%h#2kX*C~{0%|%
z3ytZd%_;Ay^8y7l4!?wgv{3T}@tiqxFN|Z at 0DRGKz`^F?B`*G&`YvqG9uF7|ux{vg
z=I at Y`kD-JKYE3P>9Qp;OAm>2)bd|}|rX8la4ek+qQYvIne9wX5EGtN#<*!zI2X=+%
zE$7n`%@&M*0YD8qZ{wy-KPn#5Sejl_)k-^=cftIoVd${T0Uy>n#6{y}t|S?Fc`b|7
z6of#2jJYcD`Y>oks%=Nesc<>q8z#S;{9|i2WP#vd=JV7LcTlfapSKTvv)bxvm7&gl
zQ5K8NBu;Crc{#r#Rcr6uOB)91>sRB9D9G_8mh(fAhr9bHN|zM1?7oFbjem^}d(<d%
z;m<vAZZs*yPfCOI-tKB`X4hjQ{VExsDd<q5>Sm4}0V<n!R6EUI52f|hc)Ep#^q*VX
z$~Q3d-ErD0->rLZ2G5%=SZKgztzngO%G;|$;aJtm<CFMFNN2$#m$)u=G&a5jtZ=8P
z+uXNuC*1j^qV<eW>5 at Vz{Rn5zo!e*JOT1WNPyQzF5vd6!&D7LScxE1sADEq)$m1D=
zg at l}dkEnhF(2KU30Um<DFG(Il6JJaynX^_`Sv-|cOlW#D$wH^WD4017q}LNVqBljG
zZRRt6J;du*I5I-BLKOiDbS&6c{nerY-Aq&P)*C6l&t+D{F9N>!@I#@!(5fWyr5awe
zW~q3?U<DqtE}g(>6_pP_5k7mAE^5W^-n<b~Uh|ro+OG}_6)y(et><XU7?9RF(PPbc
zfxiNLnwCzo=-<uYW^GvHrmz3)Z at qIfIRK55oUBG!7Ot%jbF8rOyL<oNT!5?seANB}
zDaL+G{k{)ZqO6mQ at 8d+{SR>ATNh$AIC~5+HmuKr9eklB>7~W#yo%r5bQZ9v!4Uq-@
zE^{NzE-aLZaUrJol~hg>rp>^vzmhr(e2ry=UEqWC4i~O$*Ud!2Q4p*6W5>KaJsHtc
z1eW#LKPHq|H=8#3K|?SIYi~=;dV at 1?0()=S(ugt56+5P6E0qfQLM)bUb0_oK9SfyU
zpK1_|{)4C~)7zBHFOyYJB%;TxfB*h#ceIh*+TFCGPUWD4n*hjQ`|j#FV%lf>;GOtn
z%CQIF#wsfdT`Ejgr|v`OQThh{y at iP6dA^KqXkRGc63O4S at P~vhf;xTDs}?To>oM|H
z5@;g5i<mwFyj6KIV=<u!Z<jNSwsU6$!@68J+EQ|KJcm;vY4ZvBwF_8Om`;rOWGS)>
zNzD88drJiX^a}|<UWaKb>({KIvlQQ-Dc-#^WIX=*`ge|q;M29M0-dhX-OzwO2SbxG
zDe)7pVZ%6ID5Rj!22GL^UAC)}Bv at 7utR>yki0_PabaHRs-jUF at GLrfk(X>D;dyRa>
zlr(Cklu0R`FdME8i at SDWTge2`4=Rz!NpX(!;QJ}S!5JmrGR%s=W*21%d_IJ061U|f
z6|}!2%OXbOK0hMUd>Q$?Zln at eVIgabAky=bm&=LGGe`}=KjF$9h>D^ZavEn{a6oKR
zVfW^Tjis-JJ}K(Z$lREHw*Tr#0TBtKdCUz*SCgoXtb-7X*bVc0T&gWTX>xDTsVf;`
zf!Q5AaA0 at z^wQJQpPziy_>eS}1{PivNfWFw)162|&QnYyXs2coZfqn;oYvH>aP<|c
z$!iGUu#S`p_82RN!&6kJNUEvnf?5}{(aa<4jd3MkW}G{x<*j&c#CgSgj}&S)1G|ct
z5dIyOsS??@|J+~FynpSlyL(4 at c{1g_y!8-aKrur0ENUi_0vITCGP6}X7&yDQDD~<k
zqGQ70D at eKF1$ipi*SImEyDk2D?!W#zZth*O9?&XX58XrwDK(vTfbrrl5tCvUP>xzk
zI*9)y;}_>jz4=_V6upjIu%cwUWt4Q+-rkxsWa!ZLa&idInGi$J3ne<M*lX%qlYXj*
z1AV<&k7K*}5$j3U7r`xdTeV8hV`O3&RV*gpyur)xiX#jSUoa<r_wL;_$2b<gN1FRe
z##JGlME`asSBE%s?d=wyLewG-g at g=QaIF>df9Xr4VP4A+fJAKUq6y8H=QXaCn`Z7$
zz4vkAjB%e=$4mv!5AgSA;t{2>6ndq at qc)aB%p&@lg<OZndP$$2%^TB>nrZ{?jur*t
z=0P61dF_!Apt_BR$KnBJBL@?Nq8i`gsDQ5TVQoX2<d-GcLckb~Q&)4Lx`Zwz?>vt4
zDc8O|9Dm}CI1U5UQeszLAFP-{n|Sb=z@`iI_8d?END$@?!E@<n`xtrh2H3AO_U?in
z4JDcz_8%9Q8_}01j~URkuYFF#*JIRsJ9QHVk=fdIvUcnPZo*%aNumu&(gmbCkB(mQ
zU?Lf+cj7><-(@1tnbQA_W)x3DyDY)S01w at ezkqmY2}GwC{DSYzvbH|aytA#^v|*cP
zelC}o?P$6SX48O%XTu*<Fpsirqo)sKM35vHp8)}Ph?WFVmAl5|!wchDN)9#e?I>F5
zP3ev#tbzIyVXWM}6 at SNZ1%p3v_AGK)P8iuZ at 101SvBG)aBRprwRBkqU&9L-QWNmR_
z;a>|}IjR&22#P3_;Jlh|JhxX+ at j(j3Dg4y at o=+GleF at QJSixiw9H(&z`*v4TI~*2v
zidj++aM`@z?nAFp!bKwhw1*EFlid6v)u4aAIOP(A=o4GOm2Hy>(TZb9%!Wnx*sviJ
z8t#8=Ewx#(zS_H+w{|F^8}T-y5S at fIeqrHQ!><KadXtkPse%%-A(Q{$z=#J=o{Yl8
zlROBk8X<a;*%>iWj#wI2Jw<1AuIw~QmpBEgdfk<jzCT at -UiR)?8p9 at tjM#0sed0tW
zc5hy<v9!x7I5Tilkmrn*rKS*5NF>0$kc$&HmMS62 at ItJN5+vG0lf}N;HXW&$Rj|y)
zFhi9X7YS_*-n%4jqKmMKbX*b1V`8wk!T>ND(bz!ZY0~tjc_~01Sf+OBJaJWZu3oNc
zr{KS85<dbmz%}~^?Iz9#TC_HqB;`4(s*>=ard6tOqnO8GUzr#44>SPYaELa|B=|?H
zw;UH2x)4NYYwM8kbggD{Jg{YxCn%qe$Q*hjehTm|nVzwBN6Wt4So%KM+iH+Z6!nDU
zC1hlLCof3%o>=6 at W?zsO%`3mSyz$}n>u+8*{yF#j<kkHQ4TCUO at h^XkrY9v7maP~c
z!QDT2uonl*x3SqWjuFaT-5kBu{Q%dFKsI~+`fA;kngT112PR`Tmp4E5CNVlm#{1Gz
z;P17x42hH3ykPq%YJm=ARp;oChlUv|Up8yr<Tr2LfT%&fB#b&w??C^lQA{x(z`#gV
zRo`wZ&7XZ7?i^spPk}bG_#~}~NAgBATXmd{8o)k)0QF09LD3budi7Tkx$Ww7wL{=%
zp-%Mc1VYf%MK{pl0ihDB-Ytr~f+B(A)#)0DG2|v04H@#4vyJn8wN3Q<OC(174j!zJ
zZlqSIeow1qw&*2h_jrXvh;yQ@&cz4Fao2Kew$4|BnxlmEgZX5prdwdvW0E+MuNnbS
z7(dugQ<I?x4e|Tt!+P(;RM=`mf?+o4Y8}xpJ&-FQaDCtM=lvEkZ!vD&L)WYa>5Y(O
zZT8q=4D#T?EB|AU3GsyEyA|AYxYp|!7-S%)IdbHAHk->Io`Qk+&xj1EcZxM2NRSOx
z=ofzVPfIq)>0tBi-+{k6gKi4M$7Y}V)f=GkKerd!`@gpL<Huf#icEFxk8KX_*tA1Z
zA^UI|@kW@%1-<X>A382c>ccE;oKpT4C$lnyP>>AZ@@X+-fFK9L&fJsE+i(`}A4n-M
zB)(Nc7PzgsT6Z_v)YQZz^Tq)b*uX!yQS-U+R^5Iwi5M2u_s+cty#<R3&8`*16j0NF
z)@Y)L{{h&B_}MCQD5#sr`ELBXmG&nh0ZxtBtZiaeA;<~}jG|IfwyQ%^bT-5s5bhAY
z_V04ZNnd1crn_y5hq{a;_?htC*RI7CQTUy6!bvm_`YDj|?Pk^ot+?{?`-YjA_2iY$
z;kg8+mzap?N(Q?^RO|KWOwn83!tmB7E8osu?+<xQnX2>k1IY7`9yCnbF?s$>-3LsP
zM|s`?82t1#Q4TmH#_pb!LH$YlH$f))Uct<^<t at m_MfWi$YIRaivoaJDhD_r${w97f
zm|F*?NbSvNXIqKWb3#GHM|10!((g&2leccPZyIbWYK=8S<DS)T0~BI$NCKon*SOn7
zi4^gVt0RRD5SVq8t`Iw5{lMPm?Pw(#GSf2t)XY=|qNcJzc|a?8;EWZ|W=7AD at d}BI
zWNu#$41;&rZ}WDbYXX;N1~6a_7b(W;RjuaLkwl6@!g`M;fSBckHWF(kyy=WRp`Fb^
zP4c)^Bzzzdd2^(`YTyPV2r<D1gdnVn;YB<$w~_&xivMw9tvix=2HR2=De-*Maq3=g
z(kXXUImy-YO3~KGM$2w<#%$v!8DYGZ1`M^>7B#mR=#AsS%adEMn>3q>F8Koo=Fl`w
z2r|CtmV7JEBjR-*Q&&5D>8?)tWkg+d#<XfF8RCr7RvG-0jEAxS-7n<^YG%q5X8skp
z1O`@DRo%(Sf#G~OC<uW?aiR?zr(0X+(N=Zr(ny)^T|sy9MMV}e!Y>zt$<NUVINZOl
zi?n3Zmn-b^>?J29`jD#VavKe;p*bM=!O<lZ5waHC9aj3nO$6}QQ=nk0MD^FpU)lE~
zw|7GB<Hy4X4xDta1xenQ%ingDl*&lDr_gCI at w%p%aYL&)=k?I7mfc$rg5c&=5#C;~
z;5F-k161way$&!oMe93mWRf0pbMAZgcr~7cd&uI-w$~Wxf&5OTj<UozzhHITU6ujP
zn5$b()qweZK*%d8#?d}ZxpU>>#b*hii{@{dno|@$U%=rM at vIv>z>Gn&iWZ(AjZbLT
z{WQ at oja~bGX#E&0BT1%L-&9j`e1kqu&sDVRC?lC~z!J{KDkIq~#Hg1o>#3?rFLA%J
zWvF0CgChRyWC%9sW#tHaiI+>P2#;laJ0S>JOCy9%Lng4En_Dtb;2%^Fy6*w&Cgx0>
zef9ZsZ?+#T)<?4}e8=WyXWPRsCZz+l+NOXfhFaO%c*AmHEi8nR?Dz@|g2{z}J+9hg
zqJxE+!bM11zZ$?ZVARg}@*0HW9!ZV~1H!9KnDk5lWyMdv_fT}IBN at -2WFhiRLqj_;
zJ|25 at luRW2Ts?4&C}Q81$dtD~rzbNZjfLa9Yd4sPHOVl)=cmtSFFCiWcaI)1^mbiB
zLK9FBMu!+%K4{R?sS_r&JITasK+rW~Rfm`m(DYs6=H~FLvlX|mviIFq65s7PRyoL~
z3S|gxOToI)W`@oyR*b=v`1$!!Js9ory0QMf>01}c8v$DR#J9ak?2Ckf)m|rwWWuq#
zalt7mA2^K!n+c7czHaZaS7Z%^i|z=7n);gVx{@A}!mb#QI?%jxNZr>NKflyUlD8N3
zV1#D^7lsvOo>hpZTFlegbO&NW4CZ>W31I5#dM&$m4AZ~bVF4x}xrh(^uGWVk32_Mt
zFe9_-j5+Q^he95{OtyXEeAFfw?~yF4G#j`R;zN+BRZp|;APS!9mw%LON-h#*I0{cL
za&06|2A0n+)u7S=1vI;)WPX}>e1MDx%raY=gth+8D05QYN8=|+Y69ZqzM8LQ0B~*X
z-udgk(6&7%aDYpjPQ65Gyl=kO<XfJ;mGLn#PJ|Hf`B-zNxm4?$xdXL%&X{zeJCQXN
z6F?tH_x5%+i=Urg1I6v+sZ(Ji)MC64;&p_UJFlWtD9Q7G8+*h!4BLmMu9slULgUK%
zcHfvh8=oy1qG)5Y7`Uf{vTlg6a?G!dVC-B3LH$Le4t^zl0s^5W<+u->W_3qeK<99m
z!A&TCtXI*Ns1AKS_Q%zrzJ2<<g1++=tz=^biErpqJb2sQ-a}x>U1%v2oWoJ4!tG9&
zrsdc-emOeLn*agG&ae*=_L)@fcx5s8PdC3sqHLJ{b|FcLC0sjErZ4laCd0nOM_g$6
z*U2PQIq-OIcU at ab%VvbhpEh!TnI9Pm3I;s<wo|L^@vNd(b|=P2!8V&*bf$Zsc$<v?
zt<5Y)lwm8zW2krRxIMA=<{Jyttkr+Hra$VdwNTJ&1nhO;s6;Xq@<bV)e(l5s8Nf2L
z0@|*V_|Byi3&^v6o)!O}GqHYN2g#db(Y2Oi-h~gHOPGA>OK(YxkO at R>>Fuu4ZLdCm
zzV9s~krTKOvhOC#_`K`at$Vm+rzH6AKhILCL-;#f{QI0?l9so#O|H<*-6zsZ(q>v?
z-``Zr(dRh+Kt-l|+v`07?)E+Te-4{$%0~z~|F=QS|67093=h`}omb?mE8I~-BlEgk
zC6T-}-;KuNt~j}vBvzBHCWg9nxivOp1fsQ at xBFGb#>BkBix+$#6U^x;H-Aya!a{S-
zEO03&Il+2hV3sMsJ at xKvC8dmQYBINW?rIaCpPt0^%6lZ3{vd^h9poUvnzZp%KdPFd
zO!w3LcaE=*?lviXrR4k9(W7HsYnD|GP2eFgY#6;9RfOWyKG~nigTmE>r}E!zR6AN8
zb+jdAjS+{I!>ts4v#`+abNSa&uU|Duz+`UQTbS+ac0_g9R!2Wr6=0lT0sR|X;R9)T
zSR_shel at _??bG=3rPece!!^GZt%nj;#=kTeIy8SvKVPb(??8FY{jq-=Jw3BkJ0;7!
zS$RA7UAF}*|GfO0isZ13eaC)xHZYZuF1z(2KW1%tQI5zr*58LkOZB;6S?cbRyTmJ1
zEj&Z3f_(pa=(@X4U3-a{d(&^F5vGeWh_S51x4yhHBUSm#oEy>yxu!s#e`Wt$+V#JF
zE5OHbBsK$&f==&y_{flhxPQI)QdKoxU!DhmfhTu6nTDAmdM23^Vh>G at ixM^^TK at l=
zH?~<mn+H9P4}gA1KbwZS`fDnr1Y4rlX~Vg05l0_vR`d;)OSR2QBjrN4DVh#7LU{^T
zq-bbD5#$P at f|;2aEsPm|bc=Z<@YBAm8)tzKo*Z~Dx;7XTDynZQE0bSbtl6$6(}qUN
zH*lt!DmGfeB4UFGVnsJM562fn>b@`eRhimx=;vd_F=y|$n>L2pAM9IX!}mu;A^9_p
z9%*VBDDiM0NNC4>$ZB!)W066u-|NtKZw0wkxhTncAd_Q?)8-i)8vhMAjI9;4&WJ!z
ziyu^AI`terr9toZ)2BuT1~s_Dh!l}qP at w}KSt-rogj?!u0R{%<dBn-{l*0;<vcsfK
z%c- at bj;P^>3$RxzT1T at 3!sG=#1 at H~9kNO<}n67;uC7lA7F=NJn4msQ`&X|_)`z`Ra
zkb`<R0^sif5Kj1P0WgpZ=*~l;VI!#~>l-D#g1e<>JAC$;MKC3mUK~^u!kOnvb<n`v
zmpPa)((rq-0YyJBDI)Gf%kJ72m!?~9T`#vUJUs59Lq_4Qh?o!4{!#Gh47-A^>~w;x
zsE*6Q1`w5`wivGgc;(4t2D?VPrpmA-;Cj3V-8Ck^%KM_;RGm!M5L0evX<r%tYvOKe
z*X>`s44h{ADdH`;lzBTwQ+!GjZBgWaXEHLRr$-E5_INq&okW=9!Lm_1l-jvHa_<@Y
zsHp1aI=hFvCb)VgsM*yJp(61bUaWvvMQLt5Aq^-Go4)JyQoJq57#u~-7DGaOrbd5?
z at Pbwr`gr<U at +!{Sfr5^<w93;QZq-=K85gs$10S!&m$Rq)B5w+%eCSg}kPHCjyKc!M
zKE+cf-cVivpW?FPNB$;IkAneZ2I8JGCzC^*{4S;-qwuya(?&0k+@?UH?3Safqy(s9
zJGBa=QhR&C_=_b2*u>;_DS##mBI7yFamOCvs11{T?Ho~JeOgi70)WckWk>-t(35-`
zR2=Bwvb$zYQ()Ud1FfUc)5exKTFjjJ7`2*t-eZXC;JcQTl%!v-whXwwM&0kql?DzR
zHhC4zdwx{<cJx0JKGKu0c@{8>^aG<_t7~e6>ZMRpTlMVLt^WG at rxbg}Z>ec#w_xcZ
z^E1<OMsu?0mDH`e2O@%QspXwBif>v_tXEP|(Y})QJSj=-slsNpXwzASpO%Ji_o$p9
z09GB<{q)n-RDi%x$aE~7!*(uzcx)%{6JW!GMl2m87w0(aV4U1Jy&hSt*Jjefrjis}
zB}g3n8@!34YlKP-{AXfYDp}Bs^eFOoF-HMAkuySe@(HTtJEhH#y~t-0YMvq<gK4FX
z!u%9Uimn9B(jcl{<>V#EffN$PVA+5V*+J+{?`2m=NyLD(Ns1#Z<7=it2jaq7>54HS
z43s4onA8aGkl4~2yn!!17pGsXX>PzvjzwLa=l6XUH4C{?fNF5Yz!Fa@#FCi`T-Sta
z(UUYi>J-2ur%cQx<6GMl=qGrBBUFf`#!B=JWz at DJZQfw7;sN8#&G9K4pdf%4R~&+`
zCqm42f at X>_-8b8fe=!?{R{XsRr5sTV>E062E5ysQR0c_2jOPMy`9^8la*K%90PCjC
zjJ*Y<2+tj at rx>pRWK>V at 3gV*sU(zd_>`pL$0z)O06$!Q>Ro#Sg096qnvkvNb0O&jq
zK~5m$l_snZszH+{KY^r2SqIDqN)0DhC_Zm9SN9X65Xb9?X?dc2phP2 at 2Y8A=viI7y
z3#BQ)TelI2fw6gIWg>%5rn!LaNnASUm&I=D@#|%uLMnKO7sB4D`=ParO(#VV8t<hq
zF_f?QP#eggs1yk72c`t|?}CZA5WzII-ucUQT+K%Bv at KrGjQSdXZ`Zy(z{v&X8`r#q
zI57G55rtBAmp42Qv$^IaA*&D!f^6ZMAG^(9zmBo-Z|c*?(V5nNy$&b|mC*=;h!Em3
za*|3t`F*$Rex1n)G1l?ZUs{#(4cJk-<pUHm at EW^@YPJF&ws-HjjEv)XeS}VH*7wJA
zm}D?&?b}HpwCna!06+g|E?UYZnVaW)3(Sc#>NO)i1wPcVi>n^Kc(Iv2D9u1|=MH(4
zges%gpJMsRVS4?K4 at J}4Em*cpq?I|T>KYp6PcvBBWjfladGAdS`xr_4MAGrBtgLrO
zz3Ev%<RES<=RM+`Ve){Tchi5l=PT08q_Is%Y%TM+7v&TetR{UJs=wA<_SetxVgjns
zF9SnE(RV;Ss!- at Bh>5R?OR`yszx%r<r45{RVEELFi<d50f-3l6!|`Hvj*E+?Um^<|
z|GV>;n2C8_yJNyH*(PT8b)oN6Yx63u;bqqT*EUjR%FzrZIsWu7rq|jXsjPXtJ$sY)
z{H^)x4J<EAACqB~GnIkE$KvBD7flI7#Y at z1-7L%AzlW$a$8f(Oxbd%tCnmJ4D3V(e
zhxYimxYRud!7s+;=sV1rvu|a$oTJtQr6ckM4fN^7+vlfHObtzIGiCpfBY`Q}`TA)L
zQ;qNuC2*`#jt(clvZH)ZVV+lS(HO2(mvgT*(oqj7dCRJ!c$l6Vl40KXdl92L$&30#
zZ2mMkGiJ at dxd3O1@M?$Wyd{h+cr^tU7nrK+{GxTC;bY6B596k2E{(U%yRJt=n(eQP
zAif5dcaB%=){P^3MfQ-jR*>ptOR!rJ(mc0GepC+ at Vz}Eny1euH{JsOrK6g!awdrqc
zJjcx&RuDRp2D%U%d$?vtBs$qlc(7v9c-N}B%dL)9EDc{9?X?u|%;1ul1Wa*LyQ9st
zJ at Ny#TJWjkv7>1VcD5-<4-Nmz$YInSYU+C*O()=iS)LSo)9ze0G+;pPWQ*9t>o-jc
zh>X`BTc}Teu$Z#wwPMAJ)M(>M_x#&ZmlJoX{_AXRNinO)d6HefA`?6w;0p at _)<oP|
zsOt at X-F2}KtU4HtNwH&-iO(axmG*N9e_GzP=4(*M(<SOR1g|gu6g4^EV<n>_+CE>Y
zh+<6B7tDiKYVOa166|NhuBlWR(_(UD@<V5vcl^!1%nWRXUE(Y9`uMF%mO14YIwrMR
zp&Gr<$v}0d&1YNrPugp`z2~Po($PevDu#=lolh-!pf)wI`=qSJBPaK;mFa89O~jaV
z5GBIX1ZT4{&L=-2X0lU_7(B@|mB?w*up`nJG*dBXYoK4EW7Z!a9h}9PQw|M4WL?Y=
zy;?-)r;>IZ^d7y;I`ek<gn}Jcc@@cDsGZC)@b_<5(ar>Ysy=;UE^j*V;E?fqcw)qs
z(2+zrKm=YL70r}fuh`~^F>sdO+JQbLZlAX_jV(-m{XvQUNhMxPNn2zxi`%|U0d0xo
zfR=J?$Fz_OtZX&MopHS-n}5u!*k)ipyNmu=^{8R>$IfeKTymeVu2LP-H5+E~wm at 1?
zUYR!j+^t}qB(;367d7mdPb!n_x({$QVd8nuRhN%kjFPH at sR4NwguI}1r`70TqmxSA
zPSKnpcSt3<xojhxHundlIz+=Y>+di-L6 at tcH*eBUW{TrT4fMMA=%KZ_Jqw#}w_0hy
zZ<C+I^fb{pwxdIKJaH at 1LW&&@f?MOPVR3?{!dBX(IZaU_J at nYPb?Tm|nHA47?@sg?
zU6j?>u&QEP)a`ZQuE1+xhsp19Q<MjrbU3aaGtu|Rj522ue%m8kDTAnBP@(+=ni@|S
z)8m=Ky&gWcbCsUHFgiNwyMj5<JSTXjb7l!g_BS|A7jr>%hFuiZ%^=DrHIQXUfQK=u
z?La|5h at S=OHE3!8qfY*x>dri>=k at LP+1t>zMaYyf87eB0Boakb3aKa(QBo2r5y>XA
zvQbeoq`8DNDGi1)G at x&#P05%_Dy1Z$=k+PiTEBDFvz~R%bDne7I{js#`h4%tec#u0
zz2EQaeR=ZCvE3qeI;Az-Bi2sMT({<0=(^7U1XD*&L^=Ld=ysGrAgBp?F}(Y-IR~yS
zdPMe3z|}rPJo?twHlCU3voyHwxvf}B+9KUP{?m8x;N{h$x(tqEHF)VgWw3gC4seze
zn}xg$yp}3JRBVx-2veY)8*|<=+Ard}U0>d~AwMQ8#X?(0$8=G($jimytm<Oz{*6g8
zPx|s%2di&h9p<JGHE)3Sf)HEPb*eus2AuGnY$Tc at D>!au-&_{z8zHIPoG|@v%cB|f
zAD<`2d|mq~`YI}=mfF%~;&DvFm2hqqym`sC_DfPeTq&y<G<@>k9$Qf&vwE>m*f3z&
zDAFn_=k-srlNFm1>nIZ{Frh2xJOeq#enju-9-L}yIi3B7&5Q2lu2$2V#3!k8$kBK7
z(_Uw5OVsutA>%)!Mjlej`Z~BU>fqI at PGPxBD7}%I+EWJcg>r1SraO~>zU(d-N72zb
zNIQ-AX*%rbKLlDd@>7|}!V#yg6Q!-D2aMJqu3^5&?$J7ujj-P2fB4 at hqE8;!UIX)B
zdiYub7BbQ2^KHAL2xK>pmGD1ddt^xnZCTRe3ZZ`4Co7b@*k?(8(enend&aygz}B&2
zvoUDrnE{!U<>a<g2T*|4Q04l467$u&XEf&~<JU%~FV at _6X)8L+(D^$v_Ehy<eWug>
zZ8EO_^B1xRsOlSQ?jB&v2^t2<ix+&Al>r!q^=L5(OmjR`pqg!S(xK*9b<y3@(whp|
zLaGX>hYK4?mFCJm(kds1i)YiOoO$u$Y;m$H&tdADFCKBoee`Icwr|FZ)R`1~XHkkY
zJ-N_tBvI4Ap}+P=DzqbirH^8vFkrdKx^TA`5`F{6q|HSC;%l28h+bvR)cuWhr^3A9
z{qel!xZvmD<1(!N)hnDQ{vtOto2(`_cCdNGX09=zs7NOTE{ii+#tU8!Tur9kM?ylA
z#71&-2PBaAb(KAt8mNCoMKQevG#Qy#k3SJ3G5LD<jjnIYH9Vr9G%48(B&l;CDI%i-
z+6j$~T-9}q&9TMEO`ArKA3uLZa%t4lsCyKPY<@^!lX}7y$PM0+d<kXhwQKB!gY?g%
z37ms2f?77A-`Rpw-E&Ex>^PH9Cp&f=MasD0T`Vfh59VUswXb*>dvo=(gIzF?5qX|g
zTyd{q+C at v<XY%06M-{Bz?7m$fd+TrNO`(9EI<*;9k&uuH#t&ARN;bw`lAK8cw%)>p
z419~1d_%E$VTRi#Lc1yvqf|0v;}O$iJ8PQqo<2>28#6W6p>hoyM1SFU`K2;^#=n~`
zZkO?*pPq*@d)kT;BFgF&1ppVD at o-D}y at WOfmW5kE>FNSBFT^NeQy0$PG_(t#01y^3
zF+rb4R+N~Wtn3`e-oiP2o;W&-JO!WFVh!^zdd)bj{$TD~^v at Za%G7Cv030%%t|X>C
z*ePO^W_C*2w!wj1tgjsqd~e=-?ZdNs6eW5K7p7rb!=Aw<k|vw59(5F7X&71)lwMw2
zv+qF5o9Yya$xp+VTbHef at Z?*B{92H7ms|`ytQV*@G!Sgo>tk&#tSdp2d;bS5d^N%M
z_*2yLEbJ7VDZHUQzBwCAS664QImBv!Z9 at t(xj?uSg~RDBKZme2r5!fIWNJh3>nH8A
zqROe#B5-Q++U)9jj(rFJg(~1H7(VDZN52lP++?S2nLI3E3)~g^?&OTW?T?M<QtT5O
z3-IW8^!Nq1b- at CS<Q4w&El at 7q_zs+EE~>|tezQs?Wj7t!ALn##C5C}9Cw&ildk+xe
z33rs8a^#@BUGg=$IMRG|;(bOrRWum!2>W61I7Q<GKAVKIAk=W~{ssGNyd(wXrSsP7
z{9e62UCFBtbTLv3Z)f+hs0R06B5|Xh+=&-6zkLPWuL2Q*G at 19@c%aANF0yq}p)sCl
zYXqgnePc`Zq&QsL52TwYDo($DCFoZIO7ipz*AKPMGK`z_CHB-&U(={z`?a?q#+R83
zBOu|Jm+_jH5d^rU=!Hi<I+X%fOJQN&=VKgqi+2%H^I_F;3M=hH)C{n<zCT?Ml4y&w
zT~NDL%}~j&a=u_9tEy`9Z5$qHuHa17yGux1+X?iPtvk?&P@}<dk6!CF+jV`}Ic;uy
zFG(PqUj9)%-MbF%!A(pV&BOm8<F9OWCD2`0B0W*&-V3RrEl(fX at qtBiKl*J(7Ej6e
zhYUjq6Qzs(#Lj1n at sGiRja5x5D4jz3S3bJLhr?RB;bbDB)d3L8;aRJNb8>!$n~`{5
zX=!d9nMJ!E12SG;s2{eKH!LVZB=6+r)^Jncst~=1F*=BMXnOfX0>?x=!M);o*FOe#
zd0Qt{zU#ALbv9?M!aLL=Wd5ExDFiq{^LpaMlEc?K<qq11&@iC8t5mw0td at 1-tTor!
z5KBh>>6<PqqSZ&&TY9Y5Bs5M5mEI<Qe$2WjPa;Tw*FFSPKu at z}ge$iHI^t_sU$iZS
zM=nZFj3+9*sW-U04#xc}?dJ~3x)2~VakI%Wr!d`O`mJod!BROXQioM3TlqjGB`sKf
zg^g4y=Xz#sRX6@~jRsGWOXPd$=l69zwr`7DPhf>;^Z0N{YpiDkmysF6JPOSsW*-;Z
zrvkf%d;NCKq2Gj`_l7!gwTjCqS!H}L+u!{3z+ktf8_QO-thAUpOSv}YYR1VCe^|+o
z1f90c6i7?V at 1BOJ0HPf`1 at G_jgOo=YGtW&>u)$JW95zyaq0QFM?+xz_v%ey|tH0|Z
zs<9d|Z~`=}@4&xdwN{v$Z-`6fj(!GH&Ruc;egvQi7g^D}ev5ZBr7ZGaOvVKT9&35i
zOuPWFhCXQlG|d|;sHEA5fVKOz8#vB9`AVlbX8Y-mYtnWP|9zD5vl-pa{Tz)YACe_G
zuN%BbL=Z98qp{5(UqcnN&>*-vXyA-)?p at DaS{f-=ZFET}C4(26T>8qb02Cy7Cp)_$
z<<FW}i4*DaPvv>f%?VVjLB1<Y<fM4w0n+MUsAw0+_C!CwEafk?QSxgOn6-!0Z;?zE
zQ9tbUI=^ik#i^Nj<XeBr&=ZN^#x%HCcmDjgZ{O^<ns!m>kZFP%M0d|c*<vM-z^cS9
zMKkug){nNA?T_;EOwySs<;S;LqOB6u6qU|0UrE>m^h;lJx4X<-RK}r0h80hINuq*c
zSZ~VXMS-e%cXzbC8=J2p=cP_Hm3Bhxj+jO_%l6UCiyE!@=nDx%8P8c^2E--E$#((8
z8^>(=noutPM7FB;Iqi9R at _s_+p~A9xQJcd45Ep;4ZpV)Vnd{TCHEg){4=DLOHU$|X
zH1C&0oVKwzx)^QOg%x9%)&%j3f7%VnJNS6A%Qm~XTy`I$JnE#%Js?0s(TOZDP9U`N
z3?nI+I%fQM*6d|&ZVbF-g<^>Gv>Ueh(h|#J7RwPk1()EQ7a47%mrD4fU&R}G7EPt9
z25<PRFu94QN410HK7TNrGv}|O<;wzhlfQ93N&1{hlMKZRz>&BfqOXjM7KZq8e7Hy~
z#D&C+BWbF-K-1a91^7Bn@(s@!SrxJns|@qQbE5Z1Uw7-7`g2|p$^^kW at rqmq^MVnm
zMB90xb*!g0aCc9Ye6z35tVp{pKMI#{sxHd9^z;L-zI?=|^m(RdJ8+#BerhAYWCNuN
z77ZP}bLr)!_tIS}3SKm%<Omj}1ZA1I46p*}z+-w$t*s5;hbd5O*v%P`wY#x`+#qr=
zIneLGdSZn3At8_QFok0k#kY7#!nYu6l^zKB^_0 at a^!@~@7Tp~N&`tkivv5A~D%wFE
zMG6<f$yL~_=oH2(7@%!VIM4T*+GzSA{O&K4g~e0T;u4{aSdmq`0+=Lu=l1Q_h;}S4
zYd72Yn?b8YUtL+!7Rp-|M#G8jIHfn6(LJ#Ljlk7{d>x_1bqR+ka(e)U{CKY_VpZ`n
z)4ldVMgQ6YU42my)A?PoI9fX(N7iuriGSx8hG<7zJZP0gN^T<Y7TD!)I*;`fQ8x)Z
zwLbNu2T6FKFF<&r$r#G~Qx&G{+>ueQ_-zwRu62Fk+OtVKwW_c0^=&<2iN}aOyOC<g
z+!#^qB!h)e8_TXb at dk9^(4j+xra4!Vxcv&nu0yTG4YzE#S5#2dUZmq at 7*}LXrm5hk
zzh9fpGO^fW4Hf;>^e at kmNPQ)v;{Mo3!cCxa2YC+jO$~(;z&$8xvG?^BhkhPO%RZQX
zRhwy|%=;I>;{Wx2<(N&EQ8h$<IK4CwWfup9Db}b at n0tp$HvQ&hV6DE(CvxMG&j9#R
zjZ-Q~X at ksfV&oimt7vM#|J2VrHPHrdaGF$BH=Nk1Ep9rZ1we&1>A=AHEQl%s6xW8m
zzr0cKVz_`QYHDWr=kAGmDO0L(CQX-K&CK*HUittD8CjMvo(Q3#yydbWL~-Lzx2Z<h
zs=Gn)Mc>$}`SBEJ^9wE(+ALJJ-Xs{JHWj%%&^`nj#q=G&>DL4;FBlS5TH#H?yeKfz
zK?4RTT4m5UkbVFDdU8=w#eEe_irN6<?3E1k`{XjBBRcR$78fY}<#%PCC{R-fx?D0;
z>Ow}xs9 at tJTKbalDB+=@K(VgWs2mQg%S3GeveK){beh8+Z(G=YPJ4s<*Lk3A5y+qk
zi!|KwO8?<=p~ZS%Sy{rp((m|h^wm(b33UZ|WSH{;881L-An4FGw;aI`A2$UY(U*Lb
zR}^%8MYDFgyJKXNnU|!&iy`q6eN2h=5$?Xf)vmEKI3a;~yOspiX%KEKo5c4T1@}az
zO+Kv2{fps04oDA0qU%j6xClZ_EWf_)ApvB+B=8K^LE-mX#+Pc;=C&Kg^>tHqpVcgP
z-01jYQ?@QJ6*>yRAo1S)`?P7I4>WewyU`W-D}om%hypf^dtIPJwAB>##)^H5m13=S
zFdwFY+fZM%feC70ZoK^Az|siY7~Xg#)glbnig=scfrilnW2B(G+Qz1sG=ulH=**-w
zhyY2M at PSkK8EFfpNB1h#(E{^{ODux+ at 1F<0v%}T&O;u=DXXno-B_%S`iM^(A8Uug@
zu@#Z1F%8+CYv<&20d-xot3M|0r7F|bz|mQlXBxFUtQ=vuo1EBYpznG6sCy)qxiJZ8
zb<taKFr4tskM$U+b?`rKGF~Sr^*Wo3b?4P6_?%F2U)(%l`ZuThP0!?g^|Ue%36M`8
z<0UWx4G=n$t>>b}<5L5%>X)sqfB!xSz&kB%X0t;bZ1p#-EcDbl6Ti|g6|Fp2QgZQM
z^$niY2}>`|UwpNn=3e6rqhJjm-xIn^(wXnWWvG~OHx0!z3+jY2hNXkK#sOimr>7^%
zp*Q9;@sR at DHc7RAktoy8LoHjkte~p3NJnD$)a>l}IguFLLFTyO*g~cm=D>7t*o(u*
zkC&tk)Tt@)J)mlQAoQ4ws6g)#$D3Qg<juv1g=}u<(U>arJT{XAvRUb`7UzF;(r%xz
zBGnuV^wyHhpJBEeKQYJJ^4o)j&Rk^}@ju!1af`jZJuywSwY(@kDT!fv6OrFONwzpI
zINn*rx_Hm4p$amnjD~HVI&4*p%<$S%pgt$B?DUPItl at gF8F=i-5$LQ5S67p+a at Sj}
z3d5lvX*+VIz}nsw*Ao&x7KGdfK$+0sfyy87zd7Y at IMD)Rgz^+KzaRQV#=q$e(Tw~y
zXWzuyGvyll8>=b@;avv7_>Iz7v!#^X_8fCChFFb@`9Y(GfmVch7!ka}djMnNuO2)&
ze at 8dWc;GtC4(Au?5R4aFn7VfjTX;^}bz#ne<MFK*+FM7483$arfGu|L!*yZw$F at Nx
z#_V3RaK7WABjthCvUPS%yFLUT at S*4Wl!^ieQMf(i1bgM|tSqn?lS`fN!Pi&l!}Tk_
zdr_8pk34n}^%OYJrDi{@^lIVZ;BdhCaahN?aMF}1;0EWB8VdfOSDgstf)z*gxMu1P
z;@S=Lg4WiTTpWemmkI^?7O9Kic6UBOH>|m~)Q#_;%wqVw!WQp&D`3a)v1F`V6eKeD
zD*@aQR5Wmys)_HFmWPA#xyp8bZ at 7<w4}=GNVhX)%{7 at 2BzQC5a(ZMxL+HalcS+HSe
zH$5;1`YNG}qTg1nBy0ZheKarhKkX8>RgDa9DkM>~J9mCYH-a5Ifffm8H at 9V;pBIe9
z5L&PuGLCWOq5wNUFrq$vddiI(>Qn|mHz_IUfO-~bJ64uB9{Ok)XEdbcso%w;;oG at d
zNT0U2xG<HZ&@8BU at 9SY!pqX=n-px)Y>gYfItyiBu4AnR_V_4b~yQ at vNHushmo2~g4
zVT&>n+Up~&ww&t{xjS at 7Pku~m*$iQLAiZ_;RxHl{m$q7~o7)^y?soi}Nk6?I7Xwe&
zeo4gfPj$n|vN+*8I+|7%pA*`!36z7hcd?!vG<qt8e~g at Y5@p|YEFi*+I~@k31YsXv
zCJd6j_<X^F1^*;$I3;O~Y=v#c!wUa4+Yj|{wD*6|S=-TH)173d821#Y at zjZ2`Te!A
z1h|=+s$b8z8pexFmzCA2yCwV<lixYAs2u%1NUdejwGRP&_|0lVTA2;V`Oc^0Ye4RB
zCLlV~9wlf-a_J$ZOSjk)iOFsv9(PQQx~lL<#pPIe3zgHiA8#TCpM*bO&uL^ohzwRL
zD<MhlQjMkseFVk+G82=~hm9O+dR9>d7P_t$e!{U^G_O7<v4bea1FP8}_2$h!xU*?3
zNq at jg=`PI85ZZNn^zlby$d|5Q-bn3vVn)yJBi{>M4SfA-9^+3#Sfl^iU!CDI=L{G=
z9Ln8MkOR8X=2p at B^}GURga|T3;jif8kF1myyxO}=*`xo&bEhz}^gv8xWED?{Y*B2I
z_yOlCF|h+wftzpjLW9}SUc2Wc{+{vIufJo8v#MZ~DKzj&>DB<ib at XR+5esC-D9Wuu
zS4H$NC~Z=&bSo|qhK~Sy2_ch>fOPY2m>@jV%^5s;!h{&^?*}N*ZjI`YqM<<^#>mg!
zXMztfn3Cm!F#KoH>Q`r~gbBxNp6>szWPJY(ZPfoiJnF4>hx+ojm!dyw`FI{Y`}-S-
zVM^h9RQAdZo@?hAuwhXB5k2F6#hYSmEK0v^m)cbRG{@d?SxJ6=l7H9ar)3stV^S_U
z1nLhxaLGFS&>r<H!{KQc%WQXh2GxFF{$!2Pr1iS19%tU0^0L0=vu2O4Z_|G4e%!IG
z<@PKV8i#nFUA%;5KE8U6`nBU1iv|DE>HQ}DtASl=wp_=BBX&_tTWC$@tD9s_=O5%|
z+o($Wo$vhjfesrtax<3HG{^dIxz&=hl6KoCrWP;b1}4ayp-H1;SeK<`zUMo?{V8H*
zXt*{aw&z_ZY^fnd63u#CaQ`6RZ-{#DB;}6h4Jt;gQXW<Nmr?eYvBEd*iB}oii`+p@
zS$SH-7IYopZ4+!>sW0znyB6DQh5;kxsjZrkzW(SFf9c3{emM2XpWVhV7IfQ(g<=MA
z9=HOEiM=Z8j*S4kd!eJXwKb}=br)L2Y^}pO7U5P(Kz!E&^S|He64%jc#s8*XZ!*bL
ze+d%>Q^E~!^^5SXXZHDZu4CoEzI`X}`ntKl1R-(W=-+$H?OeLe?%{6Z<J|u6Ib3TX
z{8q6DH-aTv`Jv^nQ&Uo^T{LJeXnWjqlJ~D46fsCj%7uoJm!D$bflfTQHMwu+if`&R
ztu!R7e60G!UyGA+-%?C$sE^*<IVNJ8x-sRMrFI~p+Cj at o%=PP{($W=C=3T~J>-+$l
zCp at uJ?KAV!?3jH(_G3@{b$4{<+LVocUT0!m-*4EE($gJJn0yF;p{=cr7isuSu+kEu
zIpB}{j0vx7e=YQld8iZD($v_fHFC$hzPvJ(&K+_qHl$*=kQvFV_rGYl(MlMvCsw9`
zYaG)-B1>v0BXe_dR$5y6o$tGO>E&OKpiyM+iWjBiXmIVh-Fy3V?$XT$C$>!z*6w)c
z+U;4PPfG96@*>%@eYYT$S}C@)bE~@S(fU!n2=8Sg^w+Btbf8-bnt#5^ghGJGDEy+{
zvA6g1zF1(#3i+PzCZ;|*)@%j6Szm6P{ShHN<twvhATQeMb*jz9_Jl-6MLomkCqKic
zV at K@iJu220E}EgRX6{O2ujI(La8vV$_ftvh+)w`<XX?N4c>dr0QJa^#cf8q8T6q1z
zDQ+d!pPhQh$H!>Ff at _t&7jK|7L!9u2EUf#!;ED$3w}IQrO^s2C3=LgJdck&8?1NPG
zBTV8ldwnDCj#s{CZNN0ARd_TV?oRIOrDB;+)$a6Fhs>bz51Wtj;7H&;#kXlYlgwFu
zuyb1s%LU0{0+-+UZo>>{PNnh}#qT+zVxvzD?sq;rcHgg`z2kkrdLCDL6ULQutDnso
zg7E}^KYhKvyZd7|5z}-mHIk|qW$|BH4}I=*UO7GwFp#R9<EL-a9&l^Rjg%iPBc7tj
zeiq<j13dHd^SebN-Cz4y?0@$T-LuSExIk~UPZ``xn6ZYcT3$Zt@@4q1lceg5QKvdY
zLL6Fbe=aph@=|K51|nln35|1g0I1+yy}9jr_x3q*#QoFl9_N0T7IFxzb~Vf+k%zV+
zSAY|wyoA`I-JG5Rjp!U;Y{A`)Qq9!V)Y7u{!-o%*m1sn?tg{Xs9N{jEuo`Z<z<AZF
z-9YLfmLFU+&KZsOdSai*dRfG(am6yZd2KGHZi1^2NCaQO!7_3kUwDd9-8W8nIOFeg
z%HbP$oR_;k=hGP|fFzIvP&zK(x*ij*h1FB4pN3J_ERE at ffLR;}u4u@<lBZ9VR;4Wu
zDL8ZEFKLx^3oI-woSoxC{MwLv+(!l2?nyC}u<<iSxp=x}XL&R;E|9uw8*>IqA76<F
zt~CmbH;OprQ`P(pu&o^G#dbYBOA7|%cl<AP-}f3|+uO%Stw9!dh9Ou1kzG2 at q$fJ(
z_^fYo^70Q|{6o!RnAnRkk;B^QAqCqBO-#_~zkZOUBu>z*O!@WGP2;Dpz1Pbi*Y!*G
zL}ld*YK|7d_;s~es2-DQ8P&6DS3@=lT5`}Hh5-v0(W-R&?5^t|b+yG~&34{(`lBPr
zx`?gsV>9dfCmp1X{w- at kxS%W2Yp&c(uy7P;x!nVX3<)@O>h0o+RWykvwIop8i;`JY
z<+M+G^~3C2p_S*Gm>?lt9J9(k(Vf&dDd^nrgq}9kR2cn^zn~3fis*o_gjZWp<7G-|
z+}mSgz7k_d9~0Bfz^S0$97C?42Vv;JiX~MLlO3UAq<_}^`{Ok<+$pCh3ODRn8BzdR
zU6A_u<YOg76BTEGR=kfK!NO=R0TD8JS6NAk8~D`L`8C=@W~|JELrAFY=F5u at wlUau
z`x?kPRq5G88nS)kwI+0C6ICvchUTcMsm*FBb8eJa?&8t}n7ZOc7wKLHpacOMa{gQa
z_Jyy7`+a#3$Q1r+*3VNIu{JD~3n{Ed_WbS$ZQ=k|>gZl{boLdsAflu=CJ-6scF5DW
zJ@|IiNTlM67l-SX*80!J;}@Q}2HETHa5Pjx9t6ryn!3<Du5q-cre&;|fh=u}I07gG
z8X?k9GO at B^;C+L@#52J$<AAicEk(BfQ=zAF=HBGw7RVijVVt^f!4o~Ge?C=B8g&uK
zb#DAOOn4My$F^359Df&IXrD+qJ_|E~-0sxqLOUKf_^<(*2*N}uEBfaAQ)$ip^5bVq
z=7p&a{@>?M-qH9jDR|+QEe*)hD-^(vkeY(*6xB3?Mhn`h2C9dWl9IDl>0>*C at VQ5N
zIsx3kOqA1a5kzf*4e9OGlL~$!Rb|f3iIHiI9H$w!DNv0DW4RN#AHwR8h?9n?6vQxt
z4T)K!#(tVVljGtF_7=v=PWRmb at EsO<tF&|mmB!rDk7u<paB!3MA+!J{W at dp_!XWEL
z!<|5)0QiQ<0t<z8V^KLS8=_uvG at K*i<(EGLFBujTaLu#*Cm~^hRvmbNxk;{_Di?%t
zpgp at 4*2O0EjUe`OQg^RQsXXR?P-R=j8AX9jG?j~YdO550#AGfasu<JLkleJi=t~ff
ztt~D8<?{<9x7$i0#(OOT8=!L0&%S>8u6HY!%B?c$X(M=c3WC))5EsHsW22XxyN7>v
zrLi(EDD>RJ;A3NGPa}NQezCxivFIoF&D8iOFic at K>Lj+chHd$SdmTW|qL)aLVWBv)
zdNX<M-zRTkLQrtYr at i&DXJ{{@kOEXPw}O;tNDbiWUF?yS#mo6F`C^^a(+2(bD5u;&
zl-8D(FY-0u6~A2d{1M|i&$}}@|9ESNP5`bE3zFBd7&im{+E3g5OVT>=*T`Dx+P{=$
z21(^S0FY5sh$yV)F+vC10i_OXPCV`(e2f4BDHSk0EL{Oe2K#FFo8IJJp_OfsCeg^Z
z%{3m<JfuGbtGlV`V{*0$ki68FfR|xON!u_-(mq6?z9OMlD5s)aZLE#PdoPtERtu;5
zGM~)~zsDwX5~v?%WTpi4wpl5dVTrkDaxaM-&u3<~gQ<o-xVwwTZbS2Z$vBE2!_p3m
zU1<Oa1Xh_CX+UQ|xo5kFj8}o(%A}0}^E_%Vb07fk8uwn at W_V`O9P!|i8sr<Lj^97T
z5XRh1#T$@Xz!(>bQXZxwO8v<qTReX;+V~$A(owS3v(GB%TTpj?e at t?;qM{?W*8397
zbxGtxnliqGhmV`GbNZv~m4MsG4`sZ>d-W2A_2GHCA=gf=Gar63;77x8Pp)*7U%;x4
zFK4gwA$sXQJ}W4|z$Lkg*AW7#vJn?2B$UzN^)0LaB5 at f&E0pOQH at Mww1tF}z at wWHp
z(p>Kf*Z$L-X^94kUoPJ8>29CgT-Avz2n|kQBU>6Pa=mp!2JAZnNk3b>psZ}=(xq#S
z+L*wJ<n2$vf(={$)f-ZXB<-*JcuvYp*Rjk4iRvi>dJm(nZk;6_bH7@$bHk)w0^gRI
zi_48-`=Si%?4BFibYTf~{7&KPkY15%Gja4wSA!VaVTEw_iuTImt=-ehT at 0!lG_?;|
zeSb6PX}+O&uvrXHoR=i<BU>rnJ*f9-jHI)ti30mhSa?ojD&vOp?)hw+3=Q>KP|zfm
zZi=`0yZ4-qa_3_1bPQz at c8+C;&hE3<2LLj-)Tg)fltDzX=}l%`?aC`*Pz4s2kFfG3
z2@`MNSea`c`urSQ7s*RdH;vAYv9gNl{j|SBJ=g8o;3_FUw#YuQ at uv6XPyehv9`H;Q
ztc0%Cns&^l9EI%8+Nf$P(mq9xGiW@$b at XJbTr~PWmWy*v@!yzIF;L6#i at c)Z)WN-y
zj=gm`rn{CiA!*H3M1h*rYbq68wMrd!?V=1m at yK1DZo`_M-~Q%sTis1%hCRfZwSE2C
zOIlTK+&EkA|IDAwSGB&r+DF)f3%`BoM3~<=QU7h1$7$7-sP;%Xb6qgUtM^zI6q46b
z8GqD`DEvc)a_3;LA=YmfH_F<&YFI8`en!^U;o+sq*s^Oo(TOtIgIo>d%W+6f%1S79
z{LsYX(8I!kK39KEMw-1Sv%9SZF1-#{(~|&PlMF6>sHq9-vR at LvezUwv>TR?GA(EqK
z&MZ4pcO8!nKmFpmON!ab;j*$FHP({~?&zK}s?y$yXAh4Nl8A#xj`ZvyKOSV8Zq?I@
z6{udq`jGWh83*SHs;fTk=@~B~9xvAj-++RF2BFs+>UXjVemO5+YN-of+p&4aaUbwG
z8ref^tR|hi=H>xmQ&?}mlTxiE4>jmm2d}F=e|qnr!iIl;S<*v??ia}8q&{Q&jP|Y;
zuUN;u0dVzxVq{8y(C#vl$1L8bE{iC;T4&?Nj{tZx*5z>>C6|tyHq8yHX6x21a5Rkb
zib1zz98)~4#@N)<@AT=@fr0ivk6x-_arz|HznNT_Y!P*|TIyGoI9>GHU(wMDr3X)%
z-9B`oT<@cJg at p!ezG8452F+fQ9BYUJvp#Q*;rD_(GB7ZZroOQCZ=TQLa|Jy(27oDa
zwzNHa{Ja*4<Fqw*yhI}7&pJb at Tl4R{f2kKzu$-%W)0BBi;qkBLpi31KOC2U(5P9{g
zmRntrw+`<2;T30m7GD`FZyM)wd-a3Ij|XX&?WjD5bFbO)w at f?p^IeHjRc+d|(ugYX
z`LMa~5jnkt1)F~Om at 7RE!qh at 9lGHexAmV0#^A at R;GmrLm6gaa_JA)e-jKmAsVCcb<
zx`JMi at vQrN9pvc&aK9HlKoG!U&fDRVe0k{YC_Sff(NR$(PH{RZh-(ZM)p{R4?#U0C
zaWg1kch0^0b++r*pM55JG^p_KuS{(#6FX&U at 8iL7O7U$~vwL;YHeScL5m(k!ZdLT)
zod^N$l9{7p?UcteWxX~#JMa7$cmML>+s_^@DWaIGU91F<{OwZ?vvhvWuG*%jRft at I
z8_h!V0l_tY<A%zk)pP&-eept2AW3NpT0^p7v*Vu$074}A?sBwdRD}gX^9oo&#n|RM
ze=09XuHolAwNLcl=Je1`^*k;yC?}>=dN1)=3$QO58iGS4nYjiZZgM_pjFQroc!xh^
zh at Zvwi3N7MXk?Ea%9LhuzQVkFWE at 6boeR4xL9koyrlg$SWNc}9Zh)+ml+=RKg~&@G
zDu+i0%?&gDL#9{vyFws&^t-vuNYC#LFMocSCgY_W61OSX8xc at G7oMuBYDeuP2+i=F
zxMnl^<`!q?wiorgsjh08;c=4dB5apT?+|7VaGI;2q?F`xe<=ve2#=;EGIJT6gxXXw
z_Mft{G_1EimzK6#YxM0*c`TPuEFuP)=q0G~@S88NONiX*>e`Ht1K`UQ<EZi-mBZzK
zZVuYo56-*88S%)`qX#91enC;5SXx0OBBR^LcS at 2Bt|f&R#e`grhZDMh1p}(u#uK<5
z9>c(bG}P?)hD8Wzc2)&*Y6ugj)SS%~$xU38w&5ewQ-+L^a%!S<EA%M``a6;`#d9Jj
z&$d$f%G9P#B^<rDlxHN~z%~$;eV}VxWwy)cUr{U)jzZ7vFb;Z)G at DI4JkkS(qjzn4
zwXcu9(-rfKU9CL9 at M}TuVw1}QQHcm;u{$UamGHRoy-1pe4;j*WyT?dz8SHopMItiD
z5uY6rttSoMbmPn=?$#qmg6=>ngsy*s?R5m8&inSFb+lUZiH<VA7*q4ZwvAW9uuXoF
zcS553U10$zjVw+tCJ<C1Pd;U<j{V)|X{Xa0?hU0`qM!D{3$rwtGxYt)wwq at jWr+(1
zU#$l5v!vjU_%HSClHUcJe>h)JegXBD2Q1pQo4ZJ?MN4-gez(ovnzxlrJW%^<TiZ}?
zT?!_4-j1cmA|fg+-Ci_fF_ZzV4!>Ut)q*XEuraDPnO`cf`%?G9p&%+zXyZHk;voN_
z<lb$@VUL#xE3BUQ;VX)$1%g9r{>QB!isZd at Wt&Czi3m8R#IH3se at 0n=$|E#`k9_U$
zJ??b37p|uT`I!wbx3>5BQ>UEo4|iK2yL0>YGHL=*C8zStbj`yF3i{%GrKEgMom!h3
zx9aNY(wEMUHIY-E`Z;EO-kCMF)7w_&o%QqohA`x|C?o0b@(EXq?VY~H=GeWCo-Qns
zok2(e9SOigm};$<w)ghxfB0Zr#+;`7=V=6C_w-pRDqE3wPICw`ixJ?OpZ$(UM at P>e
zv16|Llf!htD|@yIj!^J?3HD}IR+(fGNVanpeK at D(`IFeD=<(YjkDUB~DU~b&Qt{KL
zwJ>_nM8`_R51)aWduBscf1HS_ at V}W?S!_mCjN_(6Cc}mpLzWQsJ4G>Su3Di(81d!I
z>e^SrO at QjH!|aT0b81%dB?j)G5!JLx3J=%q=`wE7`H7a>ymhA#6ALqw*<CaoiC!d1
zT60}yw&puw&_=@kTn#g>GPGJ+KO2tY65V=Q7<C0cR`V=AqFRCK1r-SX4?BUbF#ms!
z{yV9XJk+239dJi4`7 at O}G%Ln}e*SawFKA`bw%XyYPaEBWImiECT9$wmq|F>ZdGZ!y
zwIJ8ANe at iT%zpl;_q4*|%H;={st=jQw~jm~5|Wg1n(^lLL;Ceo!OBIj(TI5VY|v*u
zKINf(ij$G}5>r#b_U;cEj**&xdY8<NH9L+k_3l&Y-kr#3Y_YwNyYDvWObmbjXG9MA
z%j2|2>Wq6!(|lodp66hF#-Cl?-5itoy+XP1M}cGVi-ALj*3=6M#>WI-QhX$~@39pZ
zCBq<d(oUL%EWh2m;`sp;?L&0bLmPNBJ{*r2)4#`Q31s*r+I;H>Z2Mg+i=U#C+I{!_
z{XE#i=jv-uka_Ywfp(v$$AyN7S^<`1s{~f5<1Dr9<q^|m%UbYI=Dy6Zv8$@A9E43>
z- at dQw>Q- at bOifW97nq$r%&ku;!*{H4-}R7#2D=wl`Dz=Z^k&Z71!P8n1FJz8DXDg0
zhhZdcyq2DDV7FhO01}Z5shos&{M;o=w%olI;>Qsn-Fw(}m_%;8=9y=Oh0uMC;CupX
z<?=?s&z at H&sEt8bB(;0mSa^RabAJ5LAYfBuyz+aL9zrIx?eX)jprfR9{R>XEE<C8x
ziM~JSvhig`Xkj&h`}G^^ntjT}_CinyJbPC0-0a=Ee}eTG_NjaQdNK+oT(Dvm70#-#
z*kolNLmC<yI at e;)HMSd_f~@QFUE0%x;FV;s3`D8PJ$*okK%|SVK9j&p^5w?dVj({U
zjd*!E<idrQoW1-YVW1Y!V_vHwThUNo-`-7U at d~ysSx5MViZZZ}ZhsC0z<QAW{J<!3
z^5Zib4*^xg*8yH|sms>)u{Q`a_6928UQyhsS9;n)nw}#t;^_ls)LUm at Ow%|{egf(<
z1W0E+s~4_q>&L~i$7p?<{*WF^EG$s51u*Xi9FbfZxe)zBG=<?DN~$h&?1BOLSk)bv
zU?atUPNl0C$ccs-)Kr31K7aBr?_HP19PSHvWBK{H(v`&Z^WlR%+Fx(ox9k#0$w`Q)
zdW_gUN<-thzZX+T>hZOan>bN0`$nGOt-BT<PYfkUWr3>eiAU&hde4*%Sao&LqD5NB
z;%M<i6ii~=qt{?bvWx!xKNl at sgn!hw?ek`=TxiqDS<Q~PX`>ymV&7XYmDz*VYxr(?
z8reZ*iQS6&MG}eq7a2YyK^B6JXKA~jX%t^#ZXUHsmV02r1cU0<-y}N|OtDQ}P*MoN
zyvCDg8v3@`ksjqfRO~sA2JXo+tnPf6jm<=L5M7Yr2X?A~o1%*C*#IA>Ob`q2e9AqA
z%t~T#lC!|W<X-zfrcZ9jYj&`O$v(h%oZ$(Ye~N9EqM#U;F}Ab#S%c{KQj?U}tqs4@
zSTSVJ(%!lP(<3YRGQZy9N5b^kM2Jb?@%w(6djF>c=zqYleAUX(-+H}i%4=Z at is{WW
LntMfi_1=F2Y`87x
literal 76189
zcmdqJcUaa}w=GIy)L2jxtTa2KC at RvcC4x%tNR6T(z4xj{3DOinI*3SbA|Sme2nteP
zdKaWO=^gG^_~qWc_c{CAefD$iKbJgDM0xqux#k>mj4_w1l!OTNR@$vpR8-X0ul*rI
zMYXYwifTj1ubc2MVP9YR;g3zXMMeIgS|k6x%!__bMRkbk`X86%tb<3|t<2?SX4lpf
zPaR7;bbQyvT at RcOJqV{O-sI=``}WZ%H-3{lJ+P<u!QZwMdiyq>tQ|{#`d8GoEeC)3
z<Erx0Q{r7r7pZ8TY}w`g)YQ?b?YNL}<uO?aw&&mN6FBq&1p4!;D!=`5t14h+_Wbsu
zUAT_*FJrgl=xzV}<t6*euRH$r7w3)lGB^C|`#*o89sB1qO3sh@{`r3Izy0{KfExb2
z<IeZ4_lpyy2L;qNQ59ZNd8aR(sGQD^zu-Py$*(qE7Z;Z|HGLahPDRDd%*EA6IZlqJ
zSYy1Is<1fWW~%vk-kfdrb}DCv(bkN{EVKR}zirGwF2X<NW@;2Ir~beo8x at u1{KA4w
z_AmJD!c9R at Ka<1Y>%Vlh|C=}W<KtZZYB`plOG``pQfy~*CH=@v`P^e~`)U2WR8()M
zsIC6>E!F9ZMGXIZzpWbgMrHidg*WS;bh`Q<f3*I=!k_=ENBSQ>?p(0`7CTNJJ$fZx
zA+h!`HC>wBoZ)dMrc-Cmh&MMkZ{4v&!Go5gF4IKws<3dJQD^?vojcDqELx5<g{SK^
z>bAZ!;5GgBxA*hs7K63Nd;9z2Z}^^yQ_ss*PS=h6^y%8nNV9BxoIFdzBL86)7EyAJ
z#hKxB&C(smj~_pYb0{XMN=r#SjZ;ic`u^P*hm>f~u~Nig1=QXi8=UKOYJ9M9+jNhY
zknY at AJFnGP@Y}a<<x*~6#X&`X`|Y=(+DNy>>A{GXFAqujsk~-mW7|zf7vEd%r`MRI
zb^{S(Xqa^Q^5xx(j7d8fcw=z=L)GC|QtHjSi?@9I_)%wNab|I*QNv=ajRzOc!p<&-
zOHlA*RolI1Ph^yM&|VdBJT>P=L`|XmPX6!Chd<BHwi=x&Z+?B9=1Q%FSBVFm%8Rw8
z6wSw8US1VEp$@Y*{U&j52O at +$*d9E5XkfZ`dY~;U_1V*>e>TtE?W>IxEfG2BaHlR=
zqcgVU=M5V??r+#ki~BVj;E$FJvpiM6=e0Cm&^g+8TtJ}R|J<zy(y=nfqbu8SzMlBx
zeAA_6r*xYsEy~mxjr`^89vN9#j}xKRAHL7cS;cfb*~3C>lsoa*1TUjpk5%{l`SVeo
zl#V>RWX20d9sCh^D?9S`Vr8*$8nz9X3h-Htu~*O?Jm at szpO(h1`R&s);foh9hR at 8;
z&+otDvV)^CRA9Ja_?!DseLS7F`|H=QZ}XkN^N`vvT!#M_Z`#SIPs3;Z{iWqto6hxB
zfB*dl9^ax_Tk2dJlVdD8H{D at 39((;cQy`C76st!5NZsOi{*uIKOFCtKqQ^HZY`jic
z<g{A0oCh6Oga3KW>CUy)#@KWc5n^KQE$<BC4_|pa at a^;S7mfWV={WVJC{f}w$xbVx
zgM)(-i2}x5&NzQUWe6V&2S at tfr`R)eC`|2+OQVY;sZ~BfLBrL7+xD^E>n?U(>~=f*
zBs04kr%e9ssPMgk>Tq7OKKCnn?~FQ=a>nyj at W_Op)tPq{{?u+#$`Ht*_rlcFbgMwe
zx$PA}T#^iYmge(zWbxcMN^;5Wl=lxemt#3I<^TEqXVJ-^-mIAhmHKQ8Jr}b(ckaYU
zh6&R0SthVuxS*DF{Onmtqr90HuOcEC3}5YK5)#s=5?o4n_3D*RaPWu%D<0CveHsJl
zjq0hdIVIiP++-1ZZH{UUNow)$3|dc}KVS2zZ0jsVQfM%LX-xLUjT<S!RjqmR-EM&w
zv^^=qlT%YOEqcj1U;NL%Xn5}LA7eL`B~t3iU}igtxT;H3;p*+}y{Sw?UYZO^Coli5
zk5`nmYPawc=jY^Xn65O}9_cL5u$vu8apg0!veVLvvYj3X#|p}kFHe7Q`sOR`Fo%Xw
z{)L4FTK0QSqa;FfFUd!iBT-C$I_kx3K9_RT+uOS?QgokMrty1k``KeBPQ>F0lvP%;
z)=v5Cj#o@>@Hr{lR(Aew+3t#99*VcEshQax28Pjw6O4`vz5B|CNOHSDyZ&T1q;9fC
zjwivX(2<<KSjKM1SyB=je#K?T<)Gs^2i8M}E<W76vq4eAA at Zn*C$oTn+Rd9cd2J?N
zHzcY=oAi`4x4WB{xF1l?GL0;<@IQdp(B0iVB6yINHtyL`5#8pucX`bRo>qnlB_|}D
z4&gSr+?rw3n5ILi%QDm6_{%Su at -7)!_6u)uds-RI>d_Jm;{N9 at VRcf*3)YhGD~JU#
zy at rIE?_Z1d(9`Q at k9~S})OIk^@5x(p4 at LoHr{#%KixkVz7M;m&pIdTmQau^?qP~0)
zi;RpM#IHPYb**`N_{xn at t=Qy()kO;pm&cEF+cHfM>p at t^z5xNT5h7lvSXm|7vn^7C
zv`3m!cpVngT4%lla){ze3l=Squx8d)JJ%?PdyCnTn|HOfS$KGEy6rowfCRa1IX_|1
zhZJV1SJvha_^GJWqnJ6xIkp#ZJFVvawtxS<)S9js>4>&6y>~YETy`+fs|#6;spbS7
z!Zp{2SNwWbE&C4t$}}a4=kk>+9>@uP`5E)`);Z}LH*P%eoJkxBmW{s5H#k^-`$56w
zp}x08kEzXKqx5**4&ITrnfSPGG at ldybb(bpSE*~U({ZWd9wo}7z2a=a+Nxc~P-=$G
z5R#Z~s?IP{3PYLAP~AzAbsitn#9K40 at 82@ZDV{f5ld3J*^CjTI#y(d!w+m%{XN|H~
zpNTM<WHQ<{j;DK_*DTo|5D>7jF92&`FskC?L{4E;EN=R{a2tTg#q%+$S#Jm1U*e%y
zF0fXgQF-TY$T&2>9Wd2jHH_uP?qG=Zf?Vi3gs{06YT8?-(~_oRJ5#S{5Gs28dd>2}
z6hmCUGBQ!kb4fv+Mb&H9{>Jj-%bRV{vmCEmjmPim%#JiGXBdXyIfW#Z1_cY)DTLWi
zx(=Eh6?U%<<}s7Yw_o_#j9tG;3h^SHs#T#MdSUw&niCRfuNw*iaSQcpIAl(`#jwK4
zsF9P|J%frs4i2+EF^83z#yHh1(`R-4*F$(MYEd!d({<~A_Hy&|Z1B@?)X6?uj6Y(r
z4wPl8gjOeZI?R7{IR(gczm%GeQ|xT+_XmS!xc7Ij_u`qnJQlwGOwQ~56^3iX#h9E7
zYu1YW>8GEbczRmiTiJZj{v}>?khQsan&5ob2FhdgOHAT{cX;Dhk#;O>6;|4^%zS-(
z?$FH5%_-X3=MLJ?n*eK_I(+z&co3(BP97K1(OEH(&+Iz2e^8<&t+*v4Z}_I&`TYCB
z(o!q`97$dXe#3g5zLDls at 7G!tfjToo^>I?+4=6m0_TMkfjCXbp)$*U>=2l8cN!j5g
zI7Er|5_aEzi-v3a6%EIQ$krKlgBCfGM~g}&{m;EmJMT1lj}|xAC432($oY0H0_M?Q
ze>D|r-o71N>Fehg{b<|1mf{?X;iyycal5lu%Y0c#S{LU(cI=NZ$HiDmh2{0hnHi3}
z@)fLLiK at 7@X^NzHPjc?$la_S7eshDyIN4}V#AJ`c4#~H3uJ=DbKM}-Pwas)mF+&&i
zBdQ9Op=z*&{%e1Kw9QnXZ%e>PlJ!t*v|NNRb#%k>RM;B3L3L2xZ~X}<fIR8rmk>gO
zC-&@M<d4bC<<A&iPkO(vC%xxvcgvVhohoBmt>EfpzHosOt2*3}h+O|fysgHBjbJ9A
zS^e%RfjQOiqi42GW)!T5bLcgsxvniwRqg0+O4sw79c|U7Nk-V0cpV%!HHf@~EIK>Z
zu1B+znp!?g&_T6~N4JidG9M=&uUe+)k7TNpsFK0z-FCbluO>uYHp5V at -Kx`pbE3HT
zkJ0AT(q3i2rn-2=v(b&|I+PNo7a<{uJ*8ebs_V(+cY?ZK?hoK7M#6ZFV!`KII+8RG
z_`%!8tU{9S4A1ab&iFf5gO1$huQRi>d0v8x_rj-Mi{>DO`j^<vjh)fZXk1lpe0x_E
z6{(6T-)YV9?%lgtKB<S2*!@IPfd)Br>pn%M3)s!FdyKbbQF?88Ek|PTu(<OoJLaB-
zhK`w at K@42H{>OR@)Wyo4sE?H`Wg7dU6fiQPPu3CVgyYI0PutVg!RRpk+Zk=9ZXb$@
z7?O%Y0oz)OM>w8T=(nVOW>;_Nv&{L>G2DbhWK0I;UH1ljXb7p*ij#}IZL2uzk)T=X
z$(rop?v5*INiXjWKBJswtP_&wp?_9Aci`V$#<!lHh)WMQH5d2v^f2Vpn16h-C#sa!
z)@l(?Nt~-#zauy6%J4Q#PPfIX3O0rmpzR=~ix-`h-{}u3s72n-+hmP2i~MYqS5H0n
z_us$z&2DC{P|eFx^G5q}kJhTcUu#xpvxv`GjShB4z&t;_^-wyp9!jYqj5fvV at 9Mbd
z3+}WIec57!GoQVmnT(7#u!2E1i$a1Fs-XNk{hPigW&4JXo;xRX|Ni~0zy2zPt5{xH
z=^Y<GD<o79zf(g)V_|Wzth7`_QgGq5_!z36OUd(Z- at Xw@#yNpioW<VvD(!qw&e;{C
zDOsx~y~P&3u=pcKj-0Mgq;1j*<a>oI7G-1{Fgo59gV4xMtL(UTlv8{ou(Zcx($jrR
z(4j<S_jvN at cYC_~W*L8dFz7yohsVQTv@|_PiJHJtAq9?)PX)O+Yw^?P&(abSo&XTO
zK|%5OA;8T^A)&RQqI261JeKaVS)1?ix~zv3e!fDpK`!?<f=QVA#>b83#%_xsLHL&>
zh88gF-K(XOUt8G0yjLV(W#mf|jfgLcVr7Uag2|bVk at RBxh5F0oXg-oVo!0USEkylT
zIr3!N0xBc~IJyt>@#R!&j?^mvm&cc%eD;O5YmBpXTiI8Mo`&s0A}V8?nH3E=Q)Zgq
zc9IOmNM4M!b2G!Bjg5_Rrtz)&!(U21vm14&W^_8{6!lxao)|reyF2fpQX|Jojryv8
z`_iRLhW*q#c5r&A<b92d at 40c~f(RGyyV8;Vsy1^Rw9t$+mR&#Hx^*kNKh#dYd!vW%
zb<{1iRtDXbZSAbr at k%8aG=fL!g*Qw%;jJ3nM!_`f&jYs6;Xib!aI~!v;gHI%q0{xL
zW7Ed-OAD=b8}MSNF4jb#TsXV<bChN1H@`wQp!D=~ck6Q=nx2`de|hO)FmG~R&PVNv
zKnsh#cGCPP<BInTW=r&x1VnRRv*pmWJmESz(rY|7rnkFtM0VR)QvY+(X*>55^jUZX
z$XBfNQd3TOyMFK&fw?x)lJHn`AUOw?RD}tR%Z0v at LJFlEsGa4s&8v}1RIX=wfz at b9
z5jb<Ef?YjPnImKJm9eKjlj^S2Fox7g68%-A#5udjB`8Vf+0MLm4dQ5{p`jtAH7GN+
z=gzTM!}jbb at zD#~mE0lax~P0nMu$dPGpa^w=&<6rMA0;GWlS>intx(f$H~bFTy`F`
zv at sACemp2#E*~dn5`7Hkp)w at Qh4bbBjxSCtGm4|_Idj?m&F!Oi%U{UL$@x(FPiy4o
z0w(`S)A{zU8zt+><*B|3gWEhjJS{1jE}P?0sz$`!UNyYAb%ip&y0X+>W`~x8VvSa@
zt<3EM1HW~3Z~AQDOr`#-?KoMXGHL9;zf4lg3H02uFswGFWt9hz*V=otVjaMrK79B+
z3+IW^>hOm;{H&}={wyc`^A`H9+MLMG6CT<rwA`i80Yu<m62zg`r=Y%jEIQ25)Mga9
zPrQdDFdov&QO&Ktn1?_A{PS)G1_PRccklC&l)#}>_3c+I`Mey9T+Nvh986ykaG|s}
zSmAuUxVPZive{iNt-WR(v(0v?Jt*r}Ei2LPQ|2do%SmS^Q;9S`fHseFLfC^gApgKG
zdJF=#b-g)liU~@$XpNfRM)Dmeug-YG`g;44U=r%%^BP4}l<nXN*~lAvEC5J*&1Q${
zMGqf7%sGL@*x6&1g_xAdXtxX!=LdH{I^E5u*tBOCuh#+&yNv|T3^#Hyusrwneg%Bp
z5*d6!>&rQh95V;sUu2`io}oi;7m?04nN&3Eue7kOnCK}@cU-XzvQ|>^AIqJRU at 0S9
zP}k4vD^_V~c2rzDuC%!L)4A;*OG;Y!8w;GANRMD&3ATZnfwzvyaq`=BfyIFcw(Ui|
zZ3@<lgVEwWKt`dCs|(s0rqNMRLx7JaEH2Xpjc?TRY&j>8m6`eYT1S^>{T+^6_GS|E
zf7#Zi8f}VKF9mSQ<&fmGwkpxMsZlIUu-$x$@<1$<|0cqRa{^iMbE98DH{sSoKXjHL
zFn)fxiTbVU8P!ZFq2=!n2QznC;cX4}`e`UEO!gXdBWczD{oBztL)z%*=wUD at 3cvxu
z>U{R|#`TFRjZC3HNsI!vnf!CM{gokLauR`PdukU8p8Wmy8`sF!ukTF{)RdK%r+%Y%
znklA{{8Uv{#pL+C>k{~&vakGT!iO4@!*oIbujTNp+T&<EbC6y(ZQuWA%SEoK(Tq-A
z95AYi`T$#TSuHM`ihG^NQ!h-oABs1m9coj;)baAt2GPK9B#}nG at m$TtHek&?2M!EQ
zYXyUSB5mB`9Sm{E5rYf;VU6emgOkpjJ6Amx^L%>R9F)^l6iXSb(klz3r&Cn7xoXh*
zP9DXMGSftf5ZOtY2NbW15~r&O6;Q!dQa-xvQwvR5RpjclPi1skHlg(QRffcWEppk%
zyLSLkXb4=*U<Z}=G`i|6wG+WpMLUHEZ3OB`^?oT<%{Aa|&XwIafR@`mEJz6N-svQ{
z4}ZQ^G0Kw%s#3Uo`GduThSN%YUlW)D70ZqjVfHe^jmeGP$3^u+Tk{=q#<Kbu(+%5|
zfo<vlyAo9lv#xTrn?EmmaV8#EJVeMzUBr{V2Hj(t!;+=L+R9wE^~9^=$Y>4X1m6oT
zf4>sc4=QYWaX48IFx7S-+@&th&WgjZO$iTE(b)J+WiU^KkI(MWrj#q?erFp2?i7#F
zCC!d^YLFw;*4E-ukd;EMyIn7vwK=V=DCbxv%Jzrw+q`{oMkNZ#vWcGycfHcNwh~4j
z)y!DC3NAn%;NB-NFb>Z__v?p8i<9MNNAnR#)5e3cTa3lCOnZ~^P10_E+{yvWj$Tl<
zGv7fT at KQcT>Jk_(Je>!9Rbk1btF%GC at v!?eAv~S8tgkxPg0+=#PHHQ=(wiTFJi?q-
zv%o>=%^A-A_17;hL#MWq<s}iyADfxUP3f1Fl?4tyjm9b7pJgemtLx9amDyGa57U&(
zXfS3FGV$6~p;1R~fuEe|3o;r4z&1Z+gsy6&(p;owzF%l97D+&3h4=XJtE9c?upK at V
zJ(-Jx#Hr=HtM6UUP`@9&i`Me at 4V$(<EpU22{s=siFw$z;bng52 at 1J;iDI)bp+9Y-j
z565rZwwJ7$P}Yx0pc`7+zoj!HkIAD7uuKP<$RW>=Hc~!bp~BnVSZur_kK=anuNkK9
zi~=q3P9o$n&}||4F!v8!e?3tD&t55$W3zhbzI7(LKN2GClwy+p^~$Y#PLUG<H3q2I
z*gH6ISPaRXLC+0DVA#m<XCYPI>f*3re^vvyjomaf5kS+TQ+u^OJv~e=7!RzyjOM_B
zSVU`_bcFC;`Ayo$IBGRDH4 at 2FsPo0HG&o}2kr<*#IJ2yyjjLOAW0sbd;*p`Q+OFdE
zhOk@$*>$`{#oG!CFOvHVbC?alqb3(q9+)XDEltRl4yQGTdct<5qwtcHL9*k=;^G*E
zMCBKC=7~RT*fanrL;-l=a9p+~Ax=%pE(L;j5BQ3Oh1Kc84Lk3xt*+QE^!mwz`i*XQ
z?Bb%=k!wTrf&(JmmsVF-pLlrGgI0YF_L(P*>By1G;0xa at R~*IVQ;khPx%h7W8(^3l
z%7h*W$VG6tSSDvB{d%OqY at zvo-jJ-3jG{L at P!qw6Td${PWKm2?K;IaT)QglT^~WE7
zjpfa$M+fC6wO|Poh7K{wAZV|2LNXKtnBSfKj}5a2ndFnz)d(})loCOhwCd{W+p*=(
z!3L(A_TIn)m&makmAQTU6;`0n^XCz7 at 0Q2e&J2N8R}A7bAZyrSp!$-apkOHL(&Jqq
zv%%xF6r=3N197XZ at S^T*+k3hija-^`6=MjGnJ{oA`V?<;Hud=qb~B@`iqD=s`*<^7
zaVvU1UEMhFb8=XJl76IiT)Rz?gVy1aoSb~*=+V4)DUD#~K`)e1?pphzuAzcTf at 7L8
zKWQwDmNnFN=%m0*oopy80f)}p_MiMm-1*-Ydj4C|33-426JZ9_^Y;CRiq7dXB9y1h
zb;!p~lQ!^QUq6(S^}qZdkVl;Db{rH;AP6Lpp0L-brH0a1$<d89UjYzONquOypQ- at 3
z564SYt*k*Cxs8Qj31>PQl02wxWd5ti at 15x_^OeQIKa=n)Ie?+qx_EQrKHhS6?mMgT
zj#Ge;kLt<K3O!t(L3i-?=Q0ZA)Nks7bmem3aX1jxFgPKJ<ccp}>fFxeEBzw>)74U6
zJ#zERy5w- at CXnZ>vwwNnWSmD{moo=>_QoEBMh&$an=n7%EJ~Is$foFqG?XES#p#o;
zo;bf!%rd<z=||43+N-($@z=p4`1Vf^Qr8F`o}UK`8p;(wK2Uf>KM=`5>d7?7o3ENh
zA3oHjXqFyHAlep{;prcD^$g{Y&wixv{sxFEihup<t{#!r at 8Zc?XiDk#YCeQ(Zr(w!
zRQ&IM*mLcu06)Jf*3m~PYI4Xn?)CWbVcW2IhflK6d#4IBt!aXisS3~kI9ULeZ45+<
zjf_2C`r^n>s7lubH0DQJX<2A~`z;)-)^1G>@&jYdbqP{x>s1jE7PLdtJe;EI0se~c
zNmMU)19HSMT6g^vl$o4-w&xD{otJ<AI9lYFu{#A|?&NbU4R*?{FNes3BxyU#487lc
zP)<s!+9Cx>%{qoKR8-6>KQ3Hm&nY>nWc9oxM}}RyUV at gec|)Eq6?6N#0%{!r>^ltN
zF_d)!RhuPfCiRtZ)M4H77iSppR1+FgG)3eSlxip>p00V at Z!bE>ul5U-br3*;Zcm8^
z`8_JCM@?B~(aLG}z7n02>X?ZOAJy)dt8RO<2cv?B9-7(P_5R_F>({04+<Cpcyv(n*
zgG%W(PLU1dMwC^m%pJHD=0d0<@yL~S&{K`evn__%0R+w{y(y$bQaRtH<uXjbgSNpB
zsho#@Je6JoX-FHretlFIWBZ2($qJB4!)fZ0)c7R*NHL{~T<@>RcUZCigVwqJ&;QL8
zo2iedFgY<{GWg8bw|8*8F%%^{)sL?qM?HQ6V38Cchsn<;Y^Q5P>Jx5W08JUx!Gr3e
zVVkYG{%PY46LaRc-lpfzo`pla9R%T;wa5+030<>*+WL#7a;7GbC3$8b!b|tF_i?;{
z%)>|zq5#Bcu8 at b~p+PdntS|H2gX?L4D)TfOo6O@|yXUQeWBApWa5AaW{~<9t|9%`q
zDABM{ia4BB?Lo(hcnQq<N0*ZaiUo=FQ)uUVRzsb1fqOV}PyXWtAWh8GKmK4w{Syyl
ze-;+jX;Hc|qqqKBRFWj*zbmh;&J_r#{Wy|y(SMfDq3>Nh>Feto3B0UFnC>@!-q)><
z>mBsI;nUQl<ghfFL3{r8dO?)*dwAq29urWF4&Yu(o?XW8G&H_1UPOU}+qijiJQ_fV
z94RO_^%+JQk6c{#={fLOj#Pu0N;hcbWZ*IV<MZdw+2(_Up#r+xLn<gVN*Tnc?d(V_
z&bvp?A at nJ(hMWV{iFDJbYCbpziZnAb^EHBbt*tY0$mp^5oOm<=p{zH(r=g_ky??Ng
z0EKikwIO^~63~m{lu};dppjtLNDG1NM<nRz at -s8J6TFipfvY~a9o!`pR#j50QA3Gl
z_51Iy0Ha8Cc37H~hj{WNk-WfUEh;MgKZJ#8z1;yut+RJWlit}H>%l$9F#Ge<JJ;AG
zg1K**wLwmHcXoD;FI`@^*OC@%vM_l!LszN5G4Jc}u-@|=zzktq+iaDritTiqU;0$N
z-OuLFf9MTHUsw<reXHnk2^OW^>!>JYC5ypo$iYF4c~HDw^a@#y_<!x`(KPcUQeAH_
zn4l79Jnn$Ql;M(&2sFFG0Nr;xg96YK9ysVQ{Y<*R(IHxQ+xG43n|9FO({FuO5k3_x
z=+F|oJjOp(u;!Sd;fMZ8^TS_Tgn{;hd9Bc9xf4BZbZV`>uOdjiD#LzZa at bQ;T$}?9
z#FnDY&dzXKaEteHCrao_0ESK{H&Y=03Q)#*E?h`$(*6E!_!ET#u+P7*BgbmIUK2;r
zmIDwD4 at 7r&SHCT at rrodjBzjA>V+SBhpKh2!jPCvm6;NvH9WAXPp|u6CvFu at 1(p4OE
zT24W~r_mJ%-g_9G<~!H%)(pui{weqJbfUyKL4yVj;iQ%;7Qlvd`0SKI!horvB#-_4
zn-Wikc*F?{FRwBdsPC=)p{(UB+Zp+rm at LuUj)G|RUM9ME@=WL2s#UZZO72{Tog@}i
z4J0WGytU{Cr at 3}3-NvL4u<b@>4l1_>Ya>aBqY;ZB>q{ar&$Rc+?c2BO-WjN%|NR39
zF)de6viZ%ehk=|1aZW448aE^*t#pY<%WnPsPxudR#>U28l?%^;q%sI}+K6`<1#ZBl
zK{eC(5 at e&geH!-C#r5sh|HSD3Ld<^LJA=UVIflac@|V^etK?9dz5|aQJsM0YWrT<x
z6s)}VVcXdORI4=Cst`U!+^$3;3O=L5v^1Kdvc9a7vQaT$wIuqdnTQJZ>Z%)2NI9Tp
z85OL&laZ0(S9>8s&B(6=pvpOcwnxdk^K?~WMn at bJH9p@H at RML!)xZ}4QFG8#02tL4
zH4O~Ys4-3YIbd$v*=FrMFj;*2b|=FW<geIXQ1O at OZk7vZ`t@(n0s^@LS7KW#kA2
zS6A1)@(ORD++4?#@1$Pqf0*&TWcU-EUUmZ at Pz;Y*A9o%r#C386yai1i0X%@?q?cm8
z1xgikD?jm;pvDrl7m1_KG=E{LfB1!pVT!94J&z39ZIe at t&_!a9W15QrNw9>3vs5Fv
zcx|U+K$%4YUO=U}u{P(lW_6`wMm<?wpxvTTjdKE-B16M#Wob^YDpY{eM0?z@>dO~7
zFGhhh`vudCp{xe9{nPLyWQUx<6 at s*>g;a4SCeECM1EbBi-+I4&Q}RB0^5k{3Z1Wlj
zSEoN~OG3XPzLt at Zks|^->3cjHpK&#qCnC-1mHC`B?Dc26`$VfUSm*lseNvPAJPZ>?
zY;>sY4fKGJ3jE&z*bM|aJ5vdu$tDd#yCx)^w0kv22=SjikIY^VM$08gc*~Y8DCxoC
zxwvCuo}e%LDjvvXl*DP!vfEY_g!>CtwK%YlaX>ABpa%vSRwDy$Zs3RROvhzt&N2=;
z9-x3uQ}*e9OR1MlU#>@_?Af<Zdv2k+TFL|O1DJ$@gPE@`+dvf>L_<oNF2rsWU<rY2
ziM+WLkW>(o=W?h&<K^5#wjx5h<JyW9`4t>dIaSN!@y>%uBokT?LPhj!9(r{>bk2(a
z at kwqZCZ3;=Y(O%y7->2WN|X4WfOQq%KzY3Vzz40^tA%vQM~xB&lhr}_4(IQnrmoL4
z=}AN3ij0anb>V`nh!>+g30R9^Ev_n@)M9a3M^qQdi&>hVTZoY=_eF+&pzTEW)t=NU
z!3#)sy>(i;2t+PI;zV;U1ale$>Lh^;i>gissRo?330gZ087BS5jju`T2QEgV-W*t)
zFBNj9<<R9`UPKp8ht+jnAxTx|8|)q58Ei99CFnr<b0!!4koPUcQK;U>(j)n&FPROs
zq{lz=@sYddNh*M(&`O$)Cm!@sQ0kH6X9Wd23=N<;l)S$F+}+)MyNl`Z6DR13Ty_>@
zzaM#Xt4K9&P?<P|63^h1qiv7=Q=Na%_Ta&TJt(?X at q%_iQTdBQ at tkxjN$Pnm;la at o
zA#B2)^g7qrw7&R%RdDF|L=zNc+hg%foTIsweWpbOi^l_`({BG0tgMyH=z<0piJJA*
zR`op*_Y3I=mZJ$Z%sg at I*nWuYZ<cl{rIw0wwcjE1$vn`Ts-O{AIh`?-pS_ueh0Z at k
z4TIbpHa%0xT=sY=44xi$L<}9CCWirQt6dv<w)I;^c2!bv<Fft!ezQUT96D=SP_C at K
zsg2dBiP=Rwh&b)PARhG{xS-_ at R5dOq?qm?Px-bvq7rZj-4xAGKdN*nT>&qQxCf*Rr
zx$T<3DZ=;e-E%d}4C65?`SsUd&k4+dkEO4C{^EreyI#W=c1aj at +T&_EW^SSZk6&{@
zYNOl7s%p$T*QnuSP+U at yEg!~pYV2_im%2!Yg6u8oIf)S71IWiF%#GkL&1R?z^bR5c
zm!OK!Cw;z2`XFbn+po7%S-TSJQ{R_>?5RpV;!Gm+C!9s6j6K4_!Vs!aNHar_*aCSi
z;s|Q=)ANUyf+&nM2a!9_Q)p#t0r!DdNq60e3I at Dyk+s*TXM8+4RKSklUE;cl5({|6
zH<lSuZBgoVuo2-ShpY(dN)(KvqPn{Jc{$bGFC}H9B>zX_0e2~k2Y+T4T>8g$P@%q!
zO{ex4#b#z*pr0B7D;@v(^|7GLf`WqXo*wb4p1<wJ^AwS-bOE14hx6W}B;MjRj35>>
z@}g{@^}hzi{t0NLFN+il(zV7*TmT8^dko-A3~nTaM_cy<S59<2+!+TZOTo{wXkxvP
zygl)c{UH8-v>*IaO$&>VRpWrgPM$t3Mr2Xs+?xY|C=UdMG`P~7NYkx9C9wRxXzTXv
z<~c72O$Xi%=8O at G38B^bE9hS33=PLDCQvSh!B1v<rlje}R`{PU8nw-p2j?}@W>%#G
z?;?S?q-x8@%0w1&5a}@G_9NT5u|&K)U3l7fL6x1CSDhvR`RUVLLDooEl&s0g$u#4y
zmxHV`4BNLlgshqOmhAyUQqIH(@QP($H>j0!465!>y`o0C>p>pV;=vz}TW8r<QC%8f
zH#lij8T3~T{CI6;U#}BU!b38Yzd7x_(o^sN^<#8SU^C6KIYnTi)d30j<<8tWqg>D2
z6ec at D7S+c{7sYa{E%ytF(@kp`y+j`L(L!JrZU8kh4H<sOlW$B4Cn6>J?wvckGoxf8
zZ;)OB)#f!G&j1#(0<QT?aw2>cBtFIMaYkAp$L0Fu3l}bsnxzJBO?D5sxoEVu&FxKz
zX*v*;1Q)*10KMEGUMN)GZ=f8y0+HPb>sxmwqwN(sgW({f{1lrD5w8Jo+ at VG4cX!%P
zd4QY?DFYwR3)Q2kxMJ*8hBjUWahr-SXZ42?2WtrYKu$}oonlVoq<wTT8$qWBK_S%@
z>v18wGlfq2ziPQKb|>puN%j&-)7W$%Ug!{5;Z)ZXOia2+f`*OIOV`bM&bNV8m;`2<
zG`DWsMnN~YZDn%|L at a{P9nh}w!W$;IG;$#w`oyPUdO`b4f+m9Iu}Y$W6hs#_dM1%c
z(s{Iy33O{;Uw_s(U;xW0fn9r86b4XKZTmy4wmLAN@!E6nV6qFN?KL8d0M;fK7Z=}-
zYqHg%o<PaafubbQdp?IH|MtfxkbM1$cu4V~wTjX)ssbQ0plOBKt!Q|ZqljS0AW6Tr
zd$0)Kq8)F~$*^}&Thh}*K}TOF5JZGeG?u+Gl at Bs&WByA20cS_Hfd7OJs;b-yD-R{}
zXjlj64CXWFjW3?RcI}!J3{>WgYF2}210=((mciC)K;p|rr<o3n2qc=>R7wL^*A=LP
ztrq8t&avP5w95f at yg&iFcNKxKeJa&fpB~h0NQebbr3*Tl*z-`3VnG at 2$?QWeBmlJz
zdK9r^QIH>>#3~P)57k}Aa)3ATf&vq42vBv>#d9?Z93?m+oE8U91T~SsLR;u!)<glJ
z7380%6&L^vA5ap|YOrQ8QWyJN#ipX;*yoCh^yQ>hWGMfRuWsGF>wxYKsQ_x~bO#RT
z(00PbQ_cg<VciNTwVgP6crSM=gD<2+cnQWqaTtJADUjRb6>+VJ?Fnp5C0LF{aV&ct
zMmVwlcU&+Pz=L+(#8>fl8juaDY26?t8n!l#!TXyTnZFwf7oAH3jr at DF@!Z5j4b*)7
z?um&B(uy#b!l5DNWzpvmjNBb$NZXWaW9DMEyI4PIA}r`G?`<&9oGCz)>H5vJiP<+c
z*oj}Z65`POH#QaLf8HgOBFpPhbjhL(Ye~2v>kHsXx^97#4&<{+BJgYl4q*iVg50QE
zW~~MpJZTF$$jX4Gujm}<g)cpL at PPeZ^&wIZZ-|N2(HZ52LmaTnK3yK*aRkOv0;uVg
zjoxLcgKi1Q-o_5-jE;hH0zn<4-~1NoHUTKvYzBtM7)TQkZJA*lg-kFxH|Gadq at K{<
zP)&N_)qyrw%VedX at Z!o*dLRUINV-ARh&H(>u>&pzrL|@HWBJns)JNKHCEvd{Zl6Td
zQTBtXKM?sHue_+Nqew*Bi&3we^XXA1BKH7{e?KH7Bm}=n400PP!L&I~6j_>hhY5w6
zSd2ZElrG`l>FE<l at bPLz9U~QOEVE}vQ07t1yR532fAV(PSHHX at QNb;UMXtjS8!_}y
za_ at NINrJdgq8*?=?CtA2g&(3olvPy~ES}qb1 at w}22Wm}3bqo45u_=F!7{fob!bac_
zSHv=IFQfbY_uI5q)6e&LBCVwUKldVuP*YQ9322o2T__!FXxAz7-Y)&C_TUXfzj<>`
zVCu_-MWkr-e;zRJH0QY)!VU)~A#2~08=<%$LJbYIW+Z?3 at L?LY%(q4S+n168dq|jz
zD|4OOR5Q#6WhgntA?^FR2#d{N<cl8XvR8_tijMu%$30pID?0Cuy>GI&e5$J9vj#x)
z;Aoy|lr~jJh$dXS;d)oQABMm>tqrvWBuSI50AkX5+YC_A#c}YxAgDS5VipPO!r#z!
zdJDiz#6ETFOMqH35W=V7`e!+DqI7Hm0E&pdU<j1l<(11vJf~qSf~x+e&_b){4(Wqh
zjSAXhr}%2;XMOPS;UT)0>$~Z|fdic9SvcKy5Sxxhu5}G8HK#roWJJ2IXZPm<W1cP-
zmh$KAPysWafh2XlT at 4@xZb%YMQypx;TUSJ8k;CGgmU|8oxsjA|G-a&@b$immz7P~)
z*)Mw#)&QVg=DxVx*5*|0na?M}1}gc+>lm!s!r`gA2HId_QY at xhNRJBlur6xn@obZQ
zd-q1c3tq~kUab at W88}g+po3{_q<z#o*OLGFodV84={0~kBbxFrU(ET&i8-wY`kY~Z
z{tF<)$b~M<5v&(=`ev_JhqOBV^0)}KzwUsSawkO03e;059ntJi`#6j`atnLR%*=?!
zMJ_xJ7bNV(n26imC!4-D1z#3X);2QIK+!@@+9!Lp<0Kyc;Is4j`T3+hAw4DxhRDGk
zwaBS5Vte+TNfllI1 at 7bTf6vw)Ef&yCk{i&AE?F62tsU*%Sf|;%Zh6d%z?>{;oOThk
z38BZ;Wdho7>U|9QZPxTnjoIM0AF0->xqW^t>Fj5tBPcA~Zs1U at FGAoV7m0}zJwOaw
zREupP0k&v49bo0qZO=}JEh!4RPeFA+)7awoqMb8{npOY=Il2p4Vkrd&x~MJ3I}%~$
z<>qG-_9mR-78<4jXxPaBtTWYDb_R5;D0yGKdNsh&yQl*Oo}N2|CkLJ=A2e%BxJhAm
z#Mz?FZYF{x1$Uj|+S)oWBP^S)D<7nU(Un$@&#(hftP!+rW!uL8xs{`I7xxt>FwJt|
zjc^eYY1b{HOXb>3p<bO7hms2p`m}jPzQfXVt?1cUn7fB+B3$;KQNFX#HbfXEtl)R9
z8DLgm8&0u#*o72k3m0+ws*CM)W7x_`<%C;465Lrhpwa*_V<$~aP012kL%*4g_~4E5
z7ovWYqJ0G at 9vI<K=QK%uYzJ)<C|Q at r>Ta<6F=91Ii&bl?isAm{mtXwzUEdgW3TBjY
z`)r!+IK2SS+*W2cP<@zU4dxHGSQ at Y*v3JkELJz9j$Ycu|QcBQIATYX3C7?HW6X&3{
zD^56srBFvK66nRL4+`d1d+eS9{sjPsszcOLTf9Zzr%$^q&!7R2N6Ck4&`vEEIhn}C
zICm1sU<sl(Zq#BqLcVR~unvOJ2 at g+fr@-`6lEUDyC8I=-lH%b9R<|4Fz-*5WJe@=E
zeo<fOZ%(+iI-Fdf3q`N-<CihRvnV})m8!f(NVTxbZ3vo21gn;5bEHbkpsW0s4=kCR
z?zNL{)0=P|dt8=bFBxXhA at qx3@1vd(5AKss#69!Yx#$rdjMtRwjdBc!v at b(<czKNY
z^VDM?lM`ek5hj>;Gga&4kt46FIWT?T5+xZ%c$*m9nJwz48m%lE)@0~#m=b92%R&ax
z2$5ZB()0 at 8l!Fy39JY|g!71B#J&_WA at I;GnNo-{}&;wU9riS!zqZl~>a(pfa$PPSc
zXAWDIx%&r=aZ|3G;XLS-h84?s!$~>%x6zlWr|{^27Z>X>F){h5dj0(f$2GS}341&7
ztb>m8?-O$&%AfP#LhGBDYfL=#I&B at -c3b_E<KYv}%C&@u6E%TI%?!rS%FEZp*{7ZW
zve~xV^#n1)5I+lmqG`;QEI5YqmM6=JQ#;#gJP9o?w|yn>t1NoWAFLicaNjLb(6$dW
zs2HX5ST4^`5G{Z~Fq-SewQI(@cMzZ$har*dc~B?`jAtz9oXMFylQl&;$aDh(_k!lr
zsb@)sfQ^N-G?Q1NPZEF2a0O|14;CB4-t-4I4ZNq(%dvpy_K#1g>ImaNyq$S#CM+x*
zSmJk9BWZcr-p_Ol7mhAD!<7rR=4tA~yQ%GtUTw<?YGM3WxO*}R3{6(uC5B-WkrLuP
z@!88|xDQF!p9q1VHNkTE06jzyVlJBrWgp;e2Ui>7GoGu%x`?R*VwM9$EzSvu#4H#i
zxm)Iw!ZYst(*_ at J@9t`wyc%Q#dfEe|iziqgzfRaqVnciL=FRPxH+RnI1)o5GBO7{u
zDg7)LD{~d<m&I@{Y?W+z5wob^bMtCrSRi!<8SPp$lA at v)R#v8V+gTlhLp$|T<xL0+
zlp4B|Cr?Jvar52AHAk6PC7<W+N7r}GBUvS*a?;FZy{7NEGuD<Rk<8<`oCz>*M6(ku
zPKZ^<pd}f&JHBz9xg{MQnr$7};fbsi>bR(r<8fX)7)>7WzGYEZ(X%7gwr<_Zrq=lC
z>NW>ZIGhuhK?v$&IRmdraz=-(D8wb at Z1dP`%Te1aofU?X#Msv#`#&-ES#<nIV;^Iu
zb{Be9PLBde0E>9X?PVdbKB4n3PNc70Q!f${xu&KEGUO_o)sm!E*psKPQ2?4oSfu at l
zJ!*A%A*zZ at Hw?CPWfP05;r?YDWVrjI+l#QObzbpvD5_zQp`-FsGGXAUO2>Y0*P0VL
zK(5`ZeH*BbE8$f@@?a;8Et+vfT)bM at bGV<;Mg at 6_FMNA0DK=h`*MP;7h?m<^+z1~_
zqq<#1WMHl|9Nh%Af%zb<1L1fvts<cIq7i3#Dy~o5TVGucij^MD<U?4WEm(d#SW<*`
z at 4x07ykhh3eS>VRLPy}E0tQh~R}VejKOav96U{Zhl1EV&BfX>lx}>CHf#ZtUFhF`_
zxs&<_i#)rzck5n5{QN}$&+w00T}6o9KMS2N&z)YNz#9~gv=t=Cg^q50aDw?dX$w#8
z+P(XADWjbjY%{e4M?o=B06Mm`UI9TX#>Go_?oVe7a`j1h!bla!xeFpp0#-Ypsv8$c
zy&X3F3^2RNxa~b7gBw9F&@=e<#`e at rwwSyi)Ju>xg6y>3UkZ>T$8)DV2hBjH%0rZ-
z(CyXI*46`DrsXw{AyvOW%t;-I&ouiT+Krr^L$wr2Jx1c78C?fX+|kR2=__ at c-aSOi
zfIJ7WMG}QntjEbSon&$JdeLAllpD^$z8f?Hu!OsX;=W$hQZ5oc8doSjxB01DT*t4c
zuM-}XRs)hO8Hj)&qkw#q{*8vY!<xZHQ+(qBUTPhrR>+-6g+0inuaW<QR@*RyIBK{b
z0~}Ji2dJp%(2!y73UCp2wY#u~m*6f8%}1JQu1QF|vui^l)x7rB2Ax>pH8hAr!9iR`
zoWx3Q3Qp=HH`c9arwH7BV#BFJ6PTU}3gu#AD%p>Ro&qN2sE|-+WXr^w9#GU3Auljv
z%C;TIgGW!DiYqh&K4`JVe1-=MB^}pp++ZUu52gh^UW1^B8JT+tN+}<#dpx+ at QHAK>
zoOpAyGe-KT->}`+NBg!WB*HLNf{6A&!ajiK&bB(=v-2p7wYYLlGE}Guv at eXB?D6vD
z%i#vJU0=K#&mKKm^y`)_Cc{=Et4rfni at 8Wr!T?qyeF*^H6PQb*MF|sz*!wIb#2}d4
z<ik8BSlq!JH03fj3c}0v6 at nBQy=_B>Y{h4#gQX_qmrP{j=*snmz8+RP&A|TTwN7ek
zYL3-~DkoY@?Qx+ at Xx_Pd_W)F^k`IrzdBBa{oEVMUEx}_^wGE*MX?FCAcM8G_Vh=FR
z1;n?rYi+f$RWX!I4T_dBRx&1tyJRY at I&4a(4|V|VUBE;{x4EDsN87DLFQL_@@UYSY
z-p4Nf;{`xiXf0%2U}JL!X}qVI<C{d0z}d4^1Dyp0y&N~|jk&fL`NK}AlAc*hzW>|H
ziwjPT(++Awb+MXInX^{{aeg&Cj^Ai$hia>;njh!fvhKI|c7~%_FOyJ$-hr3~9h%hp
z#tZ}se*V17CMrWIw5bG1LjTvAYD4Fgh|Vm_XD-rDT?Tc^pc{ab$bxERuHHtV=+Tj%
z{q9c?3ljZ{Fg_%7RHY|Rp1kGH$U%#qjuBf-R<=+gn>b9rUCRl|-5UuhN*B!IBXus)
z!BPNWqOk~Xdhbk%RY(jZMm|!_c*52jF-kgNP4N~peKn!`sIT+`MO~C8zAdg8vTh5O
zC*8zzVREMhyI*eOU~f-~Il+&dRpJ3`S4Cf(HsRsAkp$W+9&czPqh`HUtQI(mH0z1m
zWTG{8g?g(@_~nhbOl7cKW-MM{7w~A}(9EgS{zZ=!0qw{lV at g#IMnlYiO2erTX|wGD
z@)=C7L8~_1?(ohVv}el$1iy`8%j|jAYDfXegE3jP)BRKb5;{RqsVy$dqyGW_ONi0P
z|6Aql+LVUpL at tJj5se?AUk#0ZRmQM{1K6L*ne>&;FPM9``1a|yjLC>Qr((j#00B@!
z_SsNlj<yc|XAW at heza=PkVrR1Xhn!XdI*LW9N9p$<^bt=YpY9f8U^{XdK-TJ83XJ>
zD?rEOeqh!(9XqHDhio;%E(#t(Js>Ug20<8xcnLw}6g=CLQ!9jps>WGo;2DkwlPHl$
zy>n+H+7>e4ABQgGs@!2!u+Ro%G#}AI$gY+Qqh!eS at euN_nhLH%r6?gdc33z$6^NAq
zjM}&AK&(N7rZ?{=xt2+jN_(*AT(bltm7y{ElsYuV>3Ex$$ICWKvB8L at 2MJsmwhJ=-
zjbepclr8)8>FF`~B-NX!9}39&yWtkYA=|;EN^q5^rUQ2-s^uskKk&jqK>Ww3lAq6Q
zZ#Soilidz5^aT5x$jm^^mGJQJk1~EIASLReK#&Ph+*cOkej#q at tilAHFgB=M-
z)FbY&Bf-N~qeHKzi4Z}<fms9HuEP7A6R3 at 7qqP(ZBt%6i*ad-fHpC00T^THm0!zdW
z5RV{#)rlVkbxCC=^A#K+#B at uvU?l$COACOJUx-DEhNwdqb^7iVwFj-cqB{O2?!q5m
z|LN`=|G}H|-}(6bT2s!{Kulc1+FICO$DUH%KQwjdle_b;@11}DDLmlAF2-Mf3cnP1
zU8?14O1+`9oU)n$%QpR8m$u9wV%zeGKG4Re<`?N*zx<;A^Izw;AExnLT8b!`yfUmH
zQzRZIldGXuuRNM>G21TBQ=L8jnTLw%|Hb;5S-O4yxr>i)HRZv&+&xO>5}vS={PpAO
z|H}tKMfLy7qd&-116SBV{8f3dMRpJ$Vmbfhr=yT;ax;jh(Akd!pmhac7>QvcI02pS
z!cmpCZbQrcoA}v=86D?uk@@QN-_Ia%4q0~E5<rFOI~#dH$?+I(1)S|4Mc5jv{CTKU
z6S3`lMHc^G|9bNanudRU{U5a!b}7EYC>*%&oJP<MxoUx(>n;eZP*_{mBgpyke|2jX
zsbloq#)aly18^SL=CH3{?XiDjQv98)(jQ-M{+GMLtbgV|bxQ8~HVWFY&?z!HS`PrP
z1=DC`@PNQw9UYyrvN9QrB4Cmr0r>b7j8Mb^hb;%TCBB2;ibQ$|X{jEQ5f*)44z%am
z$Yy0_Wn=FSvhfP|e;LdP5I*UYT#VGcbQ at 7Et*C~Cn-SoZ0I9Bn*OyUN4t$%Mx(B;1
z5Ml^;hmdK+4+XQik)M4jtT&(x`C-!&?{t_8!R8<d*d+nhKr&hX#NAyEaCZ-wLU<I6
z{8auV=6Mub;>SZX#|tox(HF9(3-NKmlY{P*K=?hoc1gXom at iW$JUKexbnLc+A~uY|
znQb!_1v-aJXA2-SpJ1a62&O-8xS2y-vrXr*DG<;x_4N{{ak*+wG*r+q9{xOlN_dxt
zjzjm(wZ)2f0#JH|K*#^KYuBGvUKqTr9Q|Qy at M1Lh>(Qg;-il!iAfM0#Q}Dv!U1tu?
zc^*|Y0tJAz9`?c8{AkxofM`SV$^JyD*)AuN5m2_%d9WE)tm9$W#52u1K?WWmbMGQ^
zmUmDFqvn7WdyP7*zJA!KiAG5nZbexR7Z(>g8YZ!Gh8?*#4_WN<fu$tKF%*Prr%e?~
zsyoUq?~DLOxT};fCDLoLSgZQBS-%95qC1(AkiP<^#RK)R?SK%G-RB_2ezO}V*wh0?
zK7SLu`f@=H%=_y&fD=g{VMK?*dF%kZVlR6C=pa*$*Vy19&r^d9ypZ9v=ucGhzVI+M
zfApm1c?DOO=p^PjHIQjP66;EKaQV6Iq&-I`_>7QLDj9}Z>@XC~kkBC9HM9f2 at i0G_
zH;BM)i at hXfrmBQ;*f}A)k<J%$@I=#tM60A6#AVR at _A1#o22*1ZAn3B#XG;${LA`rO
z#=tT58}59{d<0^zG}$zU$j<1oBs{VlSF(w?3A5QN=Xe(W$F~N6^%`MNCwpl`m(YXO
zMA>bChbDM+Y_dnxY!I-IY%)X|LKuE{Ir at O3i1m-SSSD6PJZSIkOKsL)1QHUcJhL)K
zw&iJK?SSu(%)EH7ZyQrUz~*-r;0m_(#alqGFTQb=%YrE(p~%`xx?+9(1kxYk9b~F`
zRcKL&go_C&QQG at hdbZ$<*ZVp6NFr2m&9J;x<K6~M)bjsC6Hnxe(oV7`3t3-S<h8HL
zCNqFphy`d+D^AD`ozygT&M8k!AtO3Sq9=kX`lPAz+5Mo(*I{aefT!LR&LD9BA|kJ~
z<rf?yXa;7ubT^37t<yh6$CI%wOo8XjqxBM~B)0rz;^ubNh?S3j0cfkakMyLa9zn1U
z4Z~+{X`-l at p^Y7JkWI)apU6y`0k{%!JN#wOz+u3*q6?vJuY9i%$*_c_geKr^Pf`fh
zGd4T15S{Gp1^EoZmcxL%V|~XSP%%{z^u!>Btwe at qtu+EgAK!|BCL86HoOQeD%`HZO
zFI%>5tqoh9K9Ms|JQ*N}C2u at GM)92_=nKp9-(G#^c|B)1bcA6^{?0s3HrSx$YAs<p
z3okRl;Nr>fFzZ2aAcJle%kw56#Kh4p!$e<$u${qX3>9DRzb1QsfG8N1Ib&tl>#Imy
z7%q)0fM}SxRVMRyH4!2faAN=$u3K3#hnEcT1l*+r_Smw_*`#4U+;9dBf7`8xX;}ZZ
z=#JB^#?{FvAkIdleq2m6`WWWZr at xrDAvqHiz3<MT_iG5+LkQCXS29wFG at V2cCrB_B
zxG<6KK@#|rSBKq{=6i3&!g=0d#Fz`DD{(e&+8dv>=-0M_?0E)TF(LRZ{k1{(k_job
z{DS0)NI*~?)n-QIa`4lH8N{7SBjuAmn}FggkGI1<T^%x~Uf`&P+p$<!wW5QcWAJbS
z<e5q4aWoeIse(E4Se?tJo=CWbo2`wOtf{`M(FZDXZ|$y at D>~;6Wo<tueJx#jNV^x2
ztL5S%2<HQ9FVufy>tAmn4|?F}y+J)N>y^MtrxzFjCSMq(rabHn_DQ;>2IyS^kILQG
z(b0Uq!-$#^_^rn1S;@$&-|+e8*tJGk1M0-_1qK`J*+cKhg+S#pY|DJsKM%Li=f9sk
zVPiOm<c>`mntNy&7y=hd=!}{e-etjJ5N!(IQv;dtMU{YP+->6V=yOeYtW^OqKp%xH
zP{j{>5hoFYdGkTf3q!vVwOFWCC9 at UM`Svz0n_n>s+H+S;U^#GLxa7WlfwuMz at fCR(
zvqnl>9z8k$Lcxl+bbO`vtke0#VPqx4e)GSs$Zk96LUyUsDBg<2*6E5_G}JCNdl-uh
z$IZyFHl^r_TC+qS5pi%|V##EGDB^vD+abUx6w6r`O^z*+z(^8u7#YizXgszu_ml$V
z%3qxYngwZ^LHJO<4z+Y5(FT(K&!8<++V_;aY3yDNGi)^BvgAOFvM?2Z7LJ_!A`LeO
z8D|5 at m6D^i|1t4GUr*G63+FlCS`JEkORBaPvGLY5p;fsDH|rvXRrmb%o3zw%+pB0-
zuv`qXjpo~d3(|-v+}Y9uk{5JA at 3eq}0joGhpYdegx*_w6V|td at Lni6hu<O(SjM*8H
zW<~mvGpHguF!&qxA_o(9fm$wBIJs>VVx at 3iCctz4c&hL`$_gf(crzvg7+%mqct>)L
zHWLfxmc|0HoWS42gSl&_-!$gtVlS_#rFycH6YHpA*wd#k5p~TUA3k`nu0!tB=AS60
zK~owAI(4MMTH`x56!JG*s{w at r08}x^56-;?kK8epx-^-znAkeRMlSkj0jFFLyUr`%
zzBu#2TGsvnIAa#)#*Hj=)M-Fu!f(Qx7jg|M3%y|@n|39A^!Tu-+2?tu&9p%Q;Ax2d
zC3gmm<CHZ^Kn{AuIP6+vX=0V(dmR=D;HlAW`WL9g&JV~KT$djiJ;Z2X%g6qzuyIq?
zpo%DBmHJ3_!~saJilqln6L?<pv05&;*hMgoYKHGbW&Zs0<>09~vd>GJ#tI6mKJD7D
z#v1W-=cqQeqjZPEa#s^U-|=lAV`GQIoEqh^wmRY2QLzKmr_95Ka(A;Rh+*B|E*M(V
zhBJVOGoqU6wu8rk?pi;>ETyx!tHS+kMI<65K=6)UeVi|t`5~DzU=QAmgewEvVB}kO
zUngS0ad|?-Zz{l{AEv%KjM5KE*r4b*%aX2iSqAY>21;_~ai5sj_$reGKyZqKqn>rF
z%#sZnPz`A0(e5gtwOni=H7+Ayg}FJmLESp=qP!fdSYD)4R^!LC44{x%4y%(fFb^5F
zwwwS$I*IMk5`$3>IX#kZrj{hyR}Nr!6*i7%KbLFNx$i&!q4zvG{0l1q+IR2r at S9H?
z=5zYd8$9ZXaSihW4NP)*uZgESJx}fQPp{*5MgryPFY<t9ZeJ89TZ0s?8#W!w6An90
z^@%5{X4OXWYsGgLVU80XsA#hU_-5J1ZcsX&VJEnjk4V(LbxI-?S;XUg{D#l>n50*%
zCr^H6 at 4z7I#!cCC$x?uTir`{Kx(Q>96s^KD)g$q+S%b`tjk at f_jP^N?6DLme^EEW~
zc}LiOsmwPP#z<Nlt#%ZSP9|2>mVqsd2e*4d43I&HSem?hj)ipb5>Xw$tAKWt1xGc~
zoutq59P>D2mjzbFef#=luGm7EuuR#^Xnhg6&w|(GC>fD<<I#;-=^#up?Oe1#PJ8bF
zpFXgYh)o6K)3$sEmCZXDr<s!j5RsA$yykECjil=_tDiyF20}AaXBn?(!E+`(>yCmM
zx)}L9TZ at dL7%a#9&DGf-5>AE&1`gF8PA5a+Y9knCsDn>x=sFn&y_mlqA_|~Q$$-l~
zNvsj9yx_7F^q-Wu?6+(yi0P=!2Lz|9uSoQNa%(>Puz>MJKp3iLCF@?~2NW4QRYmFk
z7 at cOUY_CaPT8&-QbD-%mDmQ;u#DKD~oj#JISjLg_t*83t>~&ZHOb3vGElniz=~zlS
zN1aytok+u!lbPCDW)Ceks=%gj$P!n#dlTtr3pg?Ok)s6X5q8<@uA7J3vH2rJ^s(Bq
zI^5$)Y;nq(kIVICmcESFEroC&&n0_V!paFlJ5UJ=2A^QthI6GUL=j7uSo<JaBB?j^
zR(|>N#Y)8$YBupSek7>}suSPJ!m at 93=u)lI&V=c|B1&FIEZH1kW2>DEzIqc)6hEzz
zWmDV*Aud2FPsS3P#a7Nx#}_#`)i5Rt-nzk|ID`?!1y3%%(`d-Lqt={oJ5)*@q=Qc;
zdk^3>rMmH at CVl}2C_cx1klXmBXsb*xpH(HhVQRAvLIwa5Tl#d`KtE*$9hPC#*?^wq
zZff%#{2cmx|K0tMw-<ey%7>kxV#*f$v(ApxJyUb9Py$*%f_9aQlRN1(2}QJleQd-?
zE%QT}f#C8bOlOPqR5)6~_*!OVWI}EriKnbr=gb%zAO8%%KlV$M2<?G!O6;HycE(b{
z3ki$lKv|{IT91{`=Gn7QI4Z3ozrmLzuIQR$TRn&crDj_ok8X1^cPu6e-P!Ixc&>Wh
z)U2g!(oyI668JW>TYEtT>FM;-iG`IBgaJ=>-=LM|$Nnr8JWv9yb26KUW^%ABZ|pm(
zp5~SsLZ()?ZX>|C^McAVJQiYn<1Y<J^tLCvIKU6=Hx{PR)2f0NTD(VrtMW-4>_9n6
z_wL1%+F;ODtOuCoJNMi;GO9{wDzjPdOU(<Oj;rL>&4SNX92Zd$-&1GRvn7>j0b}~~
zjI*Z$4!*$d4hB1R!ozbhoM`Ib?EvjL)J_I8zGH)h2<ZK}T3dbns5io^d(!_yR}8CB
z;-@(d#Fu3XEErx>yt<W}HgC2IUYbKsuVqvD>U4n_^<>XLzmcW?P&>JE<<II;ogOC^
zXGi1FeYbvOU<kEE%StgQgwwV1>wDZcGdm$T=6->*2X0&opiau%S?plK88ph3LXsvu
zcXh8FpYnM at YzW9_m$I)IXhhkjp*LniVV9ljzN=a+j)~U$zcRZ-v$#JKO7-mv_1yXE
zub(o$j-guC7ztP}w(l-}m<>xb*>{9B9~Map+22GjBg`@7_D6Q}0jY95((}`kr;vGK
zdbG9CynKU5d|So4=Q^GFd1#yaCiCL4 at fU3YhPcYJ667!yO_2}t++mZ~=%1L7=dkpy
z)Z^p2F9)tg{xY}aUaP0Zj$a%tF)LR#x9ctmzS$WopK^*aKlU(V&S^qnnuZIr`6EsO
z73k~tKXC=SiNDU-?lRN>Sif}kap`4-fuJE<ak}NChQOKtgHT$Ef#n;GTj&uu9h{9p
z!h2=-ec$ZK=(7yTjj<OgJw_)NP=K-b>MFQ|zM6T^W=$V~xO~RB*H;09kRx_k;$J!K
z2`TR)s&2a5nxjepkqyc2R_#mNr}yA$9+5 at d6?&`T+#2M=kwA8>_*PLL=5UD0*%qBZ
z+Og1)EGOW7$nmYZLF_SVr?GyaW~#?989mC|Y=(Fj>p|t2WgbWRzDH|R{qnwu&9eds
z44DG6*w`h?<yqj$fkgpa7AiBB165ay&G>1_(thj%hSSV;@?Q*q8rp6br;r%u at 9+O}
zJhV!xb5{UpjH?J2GuW`BK%>|2-B2Eq!;U#YOJQigBezj`rWSvSBr~!)_UMNnsa{{D
z9~D)Til4yGb!j`ZE#gINuyxRFTBF+6uH>5F_z*^CZRpXCsUn?a+;OE<LUP6N)IjWA
znh1=WDPM}t(HyKmMhWjxSSe8IQ{C3G%LE`ZPLGdbHp$fZ94>Dw16FdOz|kMVmE}YZ
z9S5Pbu-ovRIYz6D=L^2gr^?ChNf2iuazjni7R{gsLU3UIraRd;aK9ADbn7=qP-;;V
z=*hC%)5PJpLHWJCk37J^qC-l<5Di-}#iyc)>VB8j2;+G9nn1`raW=@ehV^gBoLLD^
z{2#8r)AC!tQM1PhK=ml++h?^0?1!rla~(?e8_0mW|9aF%`*T!EhVVwBmA%f^DbWXR
zP!|1_K(-NDeX=!N&O9dJ2I}R<kN_JW?i54?g$D807MfhCXPR1_VaGtL?fbL>9>gGf
z&o$)e{MALh3{yu8RY#df_WLCVVN47=O3~+U9SV01z&;s%rK)+h^=YxH+2%T+B at TB^
z04+h8GeEQb;<ymrh2>K0zF$&{WN``csMUcD?U)*;B<A9(ogWC37?8Aqw?#bY9M~Yg
zTl>jKa(g<|Bo=P&rii7-j~@pny%R%ME-NW;9K-Qt<E~^LmVFh-;2tsnV{bk-m|MjT
z!ZtoVis%)w(qE|AgOC6p`t}=Rf%YujZ{B1>one#<)?Tu&b<txj__NfKsK*vS at QCje
zswgKTg6pLSyQ1xeGAg$N;S56z+3IGr8>6iaASKn}?xHJ+D%f);9fs6ubG;;D at +4xA
zT5$a+?&$m8^|fCKgfn^@4uo35G-TZSZq65=k%zG<vVPU<F;+^;WBR&OyayE5Akd8r
zcp}jrY>gQXH%ZG!1I{2ApT>;GhnC5<yU6IgaEqz*{9nwy2T+w+w=KFwZDX6Wg4kjJ
z1QkU<Kxq>q3IZaMwMimKkeummvj~bvkff3%xs{y31WHs9kPIRqIp=i8+}Q8`&#U*&
z{p-G4bstsdoIV1ZFRV4!oMVnLW&z~L74P6ED`?q%uH0~6UT0q<ig%yR84l<GQhnVb
zhWD)iPNn``dc~AD$@!bq;3Ot}MOfm=3hWt{8>j*5d(+Vj%56&yz^w+!b7A-flKTWs
zjq8Qg7|f1U>;!i5VvPTU7k|g#rZReAVRWW;is=5@|K-b>;%rit?l8Cxime<v{uwRt
zSP>xUrP|;81NjdM!Dti^;lO at v(cd at k{~_mf1%fN#s(^2Jm;`T;F%Q6O(T80~u|}yT
zA;K at PKK>H-K%6AL+31ReKYO;_0kTp`>rvI$57vCON=46dAnf48hkh7Z{)H!Zzspks
ztb1fw{u`dNIrbF at i9cWde1r^Pkn7v8&qI7B0T42U_UEL_#WS%Q4Z!`Aa2RW*;+=xL
zJgH$PP&L`O)}j;y3E42w%Jz41w|NsC;y9Io2J|78^#6q<D|&^aZAuLA)L~H4&aWo^
zO~?=j8qRMXdW{Wr5v_+*86Xc`1h7SD4{qQI!iIX9wH)Br65u-nLzz?RFi0iiR4VU4
ziV>||B2)~M=ZUVVNoGqtFmy6NA~Nx at S-Q5`|8N1oaV5P6ps1h7{6qL}0qI9fQlJk+
z2a{ZSinoS at p(O2kQSS*aHY^x2?<Qj!9GoYI7EHa_I9c~u9MO%uoL;dWC<KYYfT9er
zOUR)L84I-xsDprNT^@B{9FU)4IyJ0DgqGE1q&mIP1|kbF$}J7Y5glstAS*h9ML<kO
z)b8Pkzi27%zPx=7vQDhaD<hMDDY3MoohJJNL(3e8>*v6V{t|lmv__%LvuZ9H1#I8{
zML{+kB{+0x-~D&%W~OV!qkRzO*g$^Yvo+`_sk=9W at nSh#?v4v!zcqKrk5?eq`&H@~
zHp7C68fqtR;;t=&P)d6wy|}peE~+9C3nwcL%J(BtMC+2<Nv|!^8KagVA%{_Ow^ry(
zgYt$>o;<mi(xR3jd9)ZB5U at S%x1pF9NYBB7<@><$L2n#UR|8S}^B9?;_8*{~fL20X
zPmvL%t43u_24>t~&@_xm9yzjxgv>4RNW2m=dH0}9%8&KLR#3G)sI)^P?dv^l$aAct
zuiKphsJu|>7^Fvu0N@!(f3KvJ;xib3D^{%VXtqP=o+NpBT`;{2MH4!(QcD<)pFr`7
zLBdE^KM_Erx*K!SS9uVt0&Sd;!nJye(JG3FaaKtcYiBn=Gu~&tAQ0ee8`#fQc4@!_
zQLBUlPcW)I2wjC)Q$BZGauxDc;Exsc7D|I9WV$h*jdd`FlVS)PHK6Nd>x(mc5O-D5
ztY1<G01bBOE1-R=03j(s!dP8MdJV9RNir8YCYpK){198n3B(Kg?66-;P<oJ&Se}`v
z02%=pQV at YMouly<e3608k#y${&)>W?_I;<)yI(Ibx=YSwnhujA&2TsEe)bFEG+{Fk
z1dv_1R}N&hE$A>Pfr$mUTQq->?8C{*aq#U;o|IBuzyi0k#Ce(5Z2?MPV`$b1k~cQt
zsT7YA9~lF%WU(bC`W48D2_}OtgYSd#qY1OaGvK^F!3o*%`76pbVl?0odUVh!gECB0
zaa}kVJtmDJ(bqs&Bd>OJk0g;9DFO2Qv#M{g)9~M9JOp*MVtsu*|6QPM&p~7$<Rlyn
zsM+!x{q~@BQvd}&@!nb|$fE!|VXx`8BeQ=|>0=gQ=Kx<1!iy(TIDvVWPGbATWBvj&
zYCEiKBlUrEZL}Kc;>8VTU7B(I!kQX>Himrx$)nL6x`?je$n(FhkI?}?&{8akltB>?
zYGPhb3K}*J2%l6s5Sop=^9PI|tri`=JMET*w;qIo8Jo5B*0unXWaVa863LTC2x2CZ
z)lldXsJjUC9t|#X<$y;BvEL$rkje;k+>XKekJd<6A;AQC1*FaS$)ccw7(`iG4q(?~
z+Z?0pFNZhiLNtDdJQ2z07Tbbs)uEIDQGy;W1QXBx(9$YF_QuA1qtqmCX_<gZG87ES
z?bN!2Jsm7KK$29%F2)BVY&#+v^;FnTLKlBhDVbU!k#j=%m1B;8cZzR)LSRlmo0A at l
z1B|$|<TMANfL$tSfu!68eI>D!+-Cps3$<C1<kj%MlR<<pf$g!eSG at xM6lCvVaI-V^
zViURsJ9q>ujmw`WRc<izLr}$lAjAvRb!CX~Uf4CIo&)qs%$uDo<Dv0Ys=4?xjP1+t
zXQ^9|YK=gw7^5w<^9(4YjPX_2g7`Z68kW7M8jy(Z_<n-^!ECzCJe&r3B(YR2dx#E<
z8nyS(QGDB3oB#?2!@h=>nf4T?Q0g%BplK{8rt_|-6Yv!{2>LzkRLdUVZ<jE>MT2$V
z?OM(1JtNo-A)<sr(MixRC2K8qpaZ|T04+D8n|t~KtgAtuf6n5d4=F{QkwV&gWyV>$
z^dwh4GCE?c;70yRrUanm)OX0^Uz}^F$HzQ=KX>86F90c{u=#CMSKwP&i~e~Y1XUu8
zpTTk+u!KJj!<qZ%EfH*}h>8x at Q-`S4N1+lWZ$}J%h;f6`7F=EmXm*ms`DF1I7-FwE
z{!cSRSS$+$c%CIdVCz{Fh)U$X(-aDOq6#>dk&7s at wH_8}0=L1zD)b+L8^;YveI=gf
zc^_;@V=ubZovfzhBTAV-5o56~@UL0RHju3s>+Aoh!yD at gR?Y3ToWZEeBYps41rbN^
z`jb(BCraZ7UQlJ&+YJh|Z7Qu9e63iDg_U*0M?mMyb2SnA1<xeQjz@<3d|{8ba>d)s
z$r;@{$I}6W*h at KISaUt`4t`1El|DKKWX%pgPI6+eY^2X}u0>~x{)4{$w-QQNpZNcU
z-|@fIIE$|4|GyVAO=V%!`5<~-1gmfn6Y4z`mOpDaPL0qm0&UQp_hAbsP at U1a@}ENt
z|D6ZJaEPsFHc_J44w$!sZxH)}hkh<;=tT&SIEkgJf%YQ)Cgz~oqyjwU#k4P5k`RlQ
z(>;@9{*_wrBM(A4xgZit5E<5TR$x8YO@|eZWTU$S!OE;ZKRosG*ATW~wP|Ie28 at WT
z at z|!Fz&gcQk#GE}C~pZ`0V`LmIKwER>&Z&LL4nmd at FE=IX)1zO_6rtN$T&Csjg2j!
z?iP0u33CAYot5VW>DNq*X_GVRB!BsJU9ht=BdkW$q)sBNmeO6udzLR9<DfhSnUHQb
zd?@DUN0R;xf6FxVehuJlaiHMWe){Z*vO?gn4;<{CoqPF*O@<zN-`CDeoACYfO_Zn4
z5L#_Aavr`>q$k2CoW6`3y%lFe(Ex}*V{X$~ilvMp7TV2lBo|#CjkKf|!9~+vdw;RK
z_OcekvFsV>l$Jff|BxoxJo$}&t=nn(L3xy)7(}iRfheZ&j3kJR at t=1EF8 at xXG_67`
zx4m$dDce84MOLdg=)1<v5bjIDWH;_)ohpn;zW0^0LHP>+z2+!hcrRk5-x5?_)bDU7
zqhR8+YCNCo97`^G9n0|d>Yg&-FK at hh24lMlmENdbSrj(ShJ*CxZgZT)p;2`fXA17b
zI&~pqgodrq;Rm7xS=At%y#M>c8Uhri`Eb7UjH at u^Mi>N~QUvDrIcV{Cpw~DxmO0gj
z1FQEwX2G!7PxN$uE=4os4?OBAanpwqBXji+VtFx6zX0%G0=YITJ~9}NZqp|;zQy=2
zqt>PmH~Q!Q2TM)*=l}l4&p`&Z6{+-afdLZp8h&0)WDg0Eq9_5tP&gVBfPB&0)vBp6
zx at e*Bn~hDDauas+{7imkA at m3SCt<W|`JxTN=TmYfQ0t_#Z1%=kq`o>Ou(Nd591CDB
zJ}{hBsl&#vWkicB<KJ(UbyzTl?~vB4atp&*wxLT3KQk;!?`Qh!KfZ5!4cHzLha2bP
z!yU@<C|iiQM14#GK+N+|H?D-QE(|`Np%DUV#C5c~pMuqus~fwrciVRAuL8$m65x#N
z at +1*YP(|Prf_;z{+{5907A+4e5OHNUrnIbV8I3d|1q<FWu#HD2Ja^bMi$(%AK&Br;
zr7s*mk`nXy%mI}VdzolVa9w@|3Kf|<od8q|c{W++!KC^lh!3pg1S0sgv#Q8xmn~cN
zCDqCp!B86hQ1j=_lSBGUainFZ)5x6+$W9JLQq|_X8jQ=Ni^JXZ(1xIP at NA@p-KG{H
zCieSUG|O3#>+^|G64}4RP8YR-zm^N&+x_;LTtO)1vQdkuMHqu*VAEvY-- at 86Q+t2&
zKHmbc{2#G~nO!2UG=xM~(S~gpG&7okls)rVPClTr({)28rQpT5fG)Eh7s_7{O`bP^
zM|k^f7pS7A*#q(O8f<;5ma%#8uOsM%D&qGA1r}{JKn8^hCZJLS2M!|vUGRE at 6%~+g
zJMAf3 at Rv|?LgG|_7!>2GLsrctAZ$xt+6RY6)8+%X^X<0h5J|h0L4rcjL-Uo`Gq%AE
z3IGY=F<knXQ>22_I=}|)muCkjT4X&-TloM)6Mv&We^1eNw4TFvLyjVk!hf$;_QFhN
zju)KGuw*6BG==*~F`gHnS2j~KQv<bJDXPBl!Nge^6N9R>M99wq$Zf;tuc)kuS%C_J
zG`NTp7xgdWwG$Qyl2<5*c>4tjm?YD7i1*Ix^U?CQm%NvVu%C6G?B%e5lrp-cf!cy3
z6#-tJKFRGGHGm1jxg(rXW|h#g;E<4T0Plnv=4k;<BsDZD at v+O|89Ojri;h10bc-AZ
z_yc5uM at STy=qpxyKR9)12nyN=yhXI{ALS&&kCDo1;OUir<xaLi at 9`N79CZ#a at VrQq
zi3e4J0J39xl^LJEhL)iomg at VKAsQA%R3zz<<;#|- at qN%+bNvaHb#h5nMkVa0{4{Q9
zc(nHDKuOhFlb)JWFqq1R`U~T5{B%arXq-W7d2HC0g2BIDfTsi6NO{l(GWEjq=8GWv
zO=l*{`cfYdelhIe$rOjmPAE~x2DN$&*&$Attx~pif6gIafZDaOjuW<|TsF$b^WLG}
zqvB0<H#*wh8Vg_m26|u|gh1%5VqA{`2}sBd8vLqp-Ie|5e3AinW at L^Re&HkzLcw(E
zDB~Tp<n7G-LbTeB3PJK3gIbPC+uF%NAwty5+rcY(inR?^*R>{yAx*70ub`{a4{(wM
z>NK<t$}*~FfvTcmejMw)jHpnfdNn*~=nNW9CZkg`T3I_8irS_XFccaMABh47J{lHZ
z!G!>L<iD$LrgZuA5gVJuHpqa^oVyWvLI4)S=Z9)QRTCAv7pwijJsX0=j_eKa2%0;8
zevF+HO!ajFpFm$Q+j31^HIW%;22K5pV6=P+&Bj4%y^HQYXYJt`{^Hu7%34jYCob|l
z3G&wP2v*1?h&Fj at H^8D~FU?3S-hh)^0OZ5@{d-o#0WlHvlO at x}yY!#_bhFtg%v_KW
z1R)9GFZ=f6<Cj!TA~0aFc<Tj#F0&5ZHUaj7Xrg<y<=)xJKG!hx#bkgv7j(}3V<5%s
zh+EhD<_T4sN7wVB>3AR##}|v^kcPZ*9aK3j-pKn95%c(I41qXAWR^YTYpbSrf%+Hx
zn1!~Q`BPB at N?xM~4I%pkb-ytV`e7aMj8<TKixS0&s|tn5I`WdO6(g<+ at U8)(j;X^S
zvjm`s`12B9V2L{W18M)llSduV*K9w*zU1%<@)%;C%vn!vDWaAF6MNKEJ`*}9qBNn6
z(*B$<9vIlYOxuV1VboCOR2PeWLPz(b@&p0*egtxn4aHEvrecOsnA-C^--T~Jl0BB~
zWeA2N<U?*N*Z`@}`%uc4an^08FN8IC`0eEWLLwXeJ^OZ&|2>PuNkeqdgs-%)^$lw3
z158+5SdKdb-j*U>a}tTwsvYMZ1JVks*$9d@`P{$z^^M8s3q86t)`^^@*BC#?3}lg0
z4PY#p31=HN+CfyAXJJ!}Jm=)bWsm`!z<FZ9U52+z!$mVAa+E*|piu at aJfRi%lVx%_
zYmiN7WR)Al*~l)E6vK9!m|rvkgtQ>pJ&n9bFexnt{2~bRi+`B_?Kz5vGGAve%EE`E
z(jF<hE^^H`I2vE>jg_6M;k_ClNABJOa1Hb_11fU~2c4s$8<W^_Eoyea3j3;ExiHkq
ze7AoeJnzg!!xF(%@XmJVaBd(GnOG<y0V#IW$API(;9RLgDcZC~A at E^YKn*}fQ=60M
z>Z-#d%Ha9xrlV+*hW21OW at 0ZMN8W=g_Rl#qiJV?Mym4w+(#;G;45j=D24(zieYSUk
z<}5)AnEU&Q4Uxe6z_YF^{fdL$JNv<d2jblG=<eKD at k|*j&D=T~Y&?Fqd2n*Mg9ZuR
zAv+WX{AXizPazqoj<$z=5!FBwq4=BN1gCzTxmfI8bAnW%K;@-(pZ>o0^f4Hop*^IO
zM$U3g?XF1dOmBZk&(NA1i={yE_y-F}P==n(%9 at Xh>+N2Rr$^>_We=a2S+o|E{}lAe
z)vKx>CIq++#oO8=a3(@Vx;u6F at M3XoDaY7o9FQs6QbxuXLH5Fy(OX>$muhrr&X0CK
zePJUY$?m`Bm8SsRnbY*0(e4;|6sd*C+;+|8R?yanu*hH_(p{y(nvpq5B!;GrVGlZ9
z;plqu$UVJ!d-YDoX7cC-Xhz%^^kczYfHGVj-HXmN;>G}7Mul{D?VfCYD`XN-6)b3I
zQ0B)-IO2%4#3Qqd0Jch$H4W?f+0oFT at -AN8yWdabARhHzhvVOVyf}xeWE_?LdD7zJ
zZj`ajEC^hix<5N=X=~($4k1nSPu+S`L~F`gdlUir?zvlOn84;xXNGq#ws`5F4t#W}
zdliC%*GFRt{PTfNk{hYJ=iXo2VMB&9fT&y1l0J*Ulc$tEsBU4#{^lo#j|CZcQs^a~
zgPjLW^mI0+r<D}8_Bsj`zouuKyvi~L3QgiRIy%}%b7)$CRmQ9m;^ocb9g07MI*67W
zVYukly&sx at 9Qq4Fd_1U^Qd17yt55`CfnNlWXJaJWxJb4+soa`{nK?V1mqt=}d#<GF
z)$j4f>3aZLR<CO|7#NOtS~WZvN+x#zm1z_N1hWUcve#XI0wCog at +Io?fZ6?r{^i-b
zbJ7RSQ~l-~Pj$%YBf{u0v}jc0R5!ZYhh_6HXr|-+OvDue??;QACWELZ!v~!KnxmF$
z3hFhr<8U;@Mm_(_y8+oDM<XrIy7ki^c=g5&-)wYk#B<v^b5&@ah*bQhhlnDuFepm{
zN?)F;#VXFYctKRic)5qj*%q)eCCZd}qY+xv_d;7L_rr%zNIN_*@=!`VpwKk7$8}PS
z_V{*{f3CdT7Y?#=8df=DD&iTrpI(LFqp)Mg4}*n;&TJ^aV12;f<eh=z98lwLU~KL;
z%m7oc1$@!C;On3Y+wQF~bWKgUvXS*F367IkDo0!sj7`cB&mAK_48cMiq(?E6_s`k}
zB_xS^(`&H{7exQ!q=ZH~QVm%ox5elwKF0CllVOY%GYWOHct$Pq>naZ4fPm-75h~xQ
zSBKTyf9+R^KgDRL*!cJ+%VP6V3!0v`9%a=%I2L#}u-hsxnd9flqj-W$&+b4$UD<2*
zJE`T79XzH!t41y0{+uCU)UuUY?1F9RUbI>krmk$N;=gUpiKjH(t9SnGI~H)l9e-do
z=**h(*8XHuWQOM`qZSgpyZVbI^p9~b at 1Vb0)HN76v=ZAD=E#rq%}Q?9KK=?`Mx~Y&
zdB`COeRq8wP<ixj(41uf99Jp8kKd*m_vmr7&QCUwwIpvX@>X%~oaR<j&!7%bG38`G
zFGSqbbExBBl&j1+^tU;foxYR5Tn`&#N>4fL`rfGq-_3{mI5e69Jj^986m>k!{!|}_
zV8z2i$?KS`*L}4gBe(V*up2b=GK1R|^~i8y#NsvUuB*k-^=B0muxu!=8 at xsi2Wm7P
zu<6x?<Cw7hi0y-3B&U|UC3&;d$%m%b8>quOb7^06fcD#4H%3g~RG<@j&6|{{lxL0j
zcK$7xNX&TX>h^G5qp>{F$#mu-HyKeBFQn5PpP;)s5SE=7T%v&Dlnj5>#gI?RiVt`!
zeDh*FU?>F{;G at YM1!vP!wQ#P7-Uw`JgjJs+9*DX<1g7&B#x-f?EwD3ME%@(bh;}o=
zv80JO{rKiu0qvXm_HS=4C7Ue;5%NfZ0bh}$vRf?5Qk~V5-oVxgzB&dY6B-T!ipc76
z`7;nw;NknZK^LZWW#DXVBra``Sj`~jgkD0glUl`<A_(r(11>hed0{EqRSoG;2v8^Q
zeIE-T|35 at Zl@>usr|VUUU(HgV-Ewh>yF=`C48;YxWxClgd6l&c@{y!qMyg_}HL?s`
zY7`8 at cNg^_yHY>^CfP-1RE{#s_SPQq8!~!|$ABW7@*iSKn$a5n0?%4wTRu!QMfpu_
zWoePvn3y=kOG at E!dKNF(nf4f4MMds;8Q6?6<QPLe26RQqB!^$zg)kp- at WKI7u72m{
z&5z4v#V#o0){JQWraA0@#A=7Y0n-PZ7HY<Q;D82t)$vhV!@HX;<%%)(rFa<i5|IEf
zAo?V#$j=~+SxZpdVI?!1MBjaHwzw at -Q@8TT4z;9 at Ej?7|`A39<Pd*AWE`8e$kW)^h
zq at gkne;LFHGf3gio=DGt?v}yHkUH}FnG?6s`VJ!wF?Qc48~|M|yHzbZ<|AGzgH1%7
zkd}C&NBv|P;NU#vqyd79`A7gbd2&$CoMLuhWHk0IO+F&?7<~5!iR?@pu45^i!|Ry(
zpEUXzO#LCz0a6mh>J?FMEpK2r1{6 at _vqOc=?cl%@iyYS~15QRUkOQzl&2erK3P;0@
z$e<A`jT`!oz0IheqTtZtX27c)^WA?c9TA;4ryy^$OhSMma%09kh#j8^Ou_Cab$w at v
zCW>}q_cz!&GG8<&?3@($@j~lFv<mTpTZ(uJaJMHlAv)DQr9C$ej=yTykH=mYC^oed
z*y`yYgsmb<=;QfVmXVz}ihFprZmt!>fD*C|Ag6nzu*x_Fi$NZG_~?<!_MruH=h7fx
zyqzsKBFl&1 at qrV6<q7el at 9<{H8=RzK9UHI=N;D^XS4+3rbi|kK1 at A+2$`2+pBy(!C
z8FO<QKa4XZF*vlAw>??i146?VWQ{lQjyqWWu(}(BTSzP=K_$&o>FCMa=fr#FS)JE_
zaL}P^^Qk}E;we0P3oL8FZCRw0^2V0n2&!X{D5<(LQJNF9ASpr&7n~a^@@{L5^E;k?
zhi<ME<z*YSn;3Ph=Gf^Ya1SR8NFH%gjblBe3rL>Sur|9ZZT$vdt4kiHK)!dz*@2RE
z326s;^U_q%56U>Q2=EM2teYe>m^K=)t3UK>;8v9^sE4H{2wPj2F1-6}n{TaUw0g_G
zwf)f`#Z??Ugwn_Pw<y>FkT)b&9o$H^gk{r!U>Yg`Bd_rc4n4xb;0Hxr<GuJu8q!BB
z7bJ-qkB7+JjqJYDA at wj4ym}aeZh at B2zfy%wp2m3LD<nd$=~3qr(*qz#XdP^AN47`P
zA4pjMF7<-%iCf790>%sE^FmqwrIXlvq-29<O=Yj`hMv+YexCof&ksNt*rdeL73VQ-
zrvt$E(Y&9~9e5Bcet6C`IrX2lsNwaKC9dSg%qu7;0o+1jTzw!!`%S-H#Q-(C=3QSv
zw;-e)a2g40aiOGJ0)^Nvx%V&fEJwM9!KqTjZos^XCwO{4aC(te7(Hj&9w1w^P*#dx
zg=B|LQ#<=ESpWY(BRKAk6aIgsdmsFrU{{c8cKsDXqXi-X=x4NI06vr;#f^ZS<@Wvi
zD;gfvO(Fk=LYPPD+fNvsl1&PACOb_M>KC134GWa`l+7v(@aF&L^7+YwgPo!WA_Tgo
zrbIVwGUxt$f&0naS@)j)wS92a5tEkfH&<NfI at +ap&UX8g*)!y3aDV>p`PBI-XVPuw
z6~EvA?auLse{6r^wM71SVb@}(`UQnPyBfKgPxjg#;OILy^hl&^B;Vw at TJvbWU>Q0H
zj0N{_LQa2Wv2p#IYJ1+liO^qTn9%gsfBxgUVA5rWl)m>SoJK`i67fYx|5rYU^@soS
zzx&_*xWvtBoJ4G8Se*Sx at +;VXxpEV%5&#!1&r>^NL|1(0#M;4*JoDtxHBgVVt%Tpt
zKprAW3HtD#R|)LHQCtjwynWG3k%eU&+OsU^`DHEt{TGGpm{U)7;^YEkwdQ>jd36$M
z3UJJWtFgdWiOw2uv=lKu*Ei^}%u5{1L}<yJnoQ-Q<B!znI4-DTg6~_dUb^&x6(N7!
z%jj*?ZO2eSC$f(riR1MPP*9#^V$wH_1^|v<$<A?wCZOXKJBgWf6`4+%TrI{<m<a at u
z4~jMd%=bys$7OLJr&faGS18-ikTBj_0YjK*6t@?lI^}_*banj<q2*oZ!BbtqB?aRm
zoc4cHbh&o*h011p#J%GCv~CiJ&r8BLL=R9}s!zr(MoR!`U%aST)=}GU4){HyF>(=o
zYMrnN=Pg=QoHsTj)H4iw;H#sLJcuTaf#5<qdz?B3z%mF9!9`fX?+r6MR&j%L0(j1o
z3nOf$Ah0?OjQ~7M`F%Ijd%0Iax8uBnY+*2&<su$?;+6`e9ues8eP!pUi|>CshBpo&
zqYC&izrr{JFzvGGOPRBYE+ytIfO=w?VmPcMaPiX^JP8_S2>vw^9Xrb#bB6gaCIUs9
z0({;PS2jr at b@fDJEDTCpWeiZ9ezKggtjFR5d`^oFROzP<5V}(%1b5>pEt}@HX7?df
ztR7s5VMOS=1l2gAuc7M_+=zrO>tY1np>Pre`3Yz9VJt_X<sC at pXhL%PqQ&pc at h><A
z-1b5ZN&td8EDbM%<8$Ad)?p0yGK8Njd1O80TY-`x9P1l%7h$ccOQ$2v{!4u`Go}hD
zE!_Ke;DJ%j;~osc6|r9~6^Gs}_(bX23)Z4Le+w+~9{_PbLCbBW`qTkgG at 0k%eiG<@
z*hS9*-**oNut+H(42_b1{yH0L&3YkWBBLK$#8nbPOMQj_E*wdXAPl*helVJExw(}A
zXG8`hOe9hFemZ;6nB%I!ML07gDP#<PM+*38*M+~f!ut$;ODU(V6*(AELlQvxj8xl!
z2x9rt&0r_E2V+DU!m|qa`$^MR(><GYH4jlm8uWhuKt(=$r+#ZGIx>dD-vSp`xq*F&
z_2=bX=meC2ytZY+#~Q}+!5nt&yM2SG at mBXM>(Oq;XoHW)vzeg#3?&5D0YvY|>!?`2
z;oh&_4nAlOEC(}L#Z9dD=FdMpi~jVzO`hqDm{J6ey-?qHY2JUKM%YK4J;hvS?%2ER
zq-_Fn at dG5Y7b5#P$E0hw)ic*GqbH2)Jx+vjIfgE4saFPXtEhDxy9|SX-`xp!gx-Wy
zbBXx9W)Zu=sI4-7KisW1!YL12USl(J`c)%V^gZrQ9bGI2+IaAfc)%szoi!7D`(3vz
zvu2=g6U5>SVLT~3$<fvi22M!Z4*?`rRE$37H%il7y?{2LUOx>V1y);$WEJaBW&zBN
zMskatX%b130$}a%(Pix(pb){pM2PW98v=+R77#v6WF0-6E6-rGfa{lqkhu)NFP9Wn
z=h-u7R@}1WWNbL-s0LDA8edNhYyoJf3gwZkYvGh+UCg2f0T<oCo<wbq- at H`v8L-Fk
zxS2D4{M?1)HHjEpbutYcNfm%?h)($1oRYNNBo^IAkimPo1fU1{{D-7hQ2 at iQ3{zHu
z0kM~F*u-$!fI<K(!$K;}ZS9_82tzM_egr3d#6GY8Tbx2`<uKwD=ch&5hbg)v0|^7q
znO9Iyky@~zdJupPHXpVkt|Uf~mX@|c%dJ5gND6BPcNzhzk8J?=sr7gYzBK-b0<B5?
zYu{T##HB=xhxLiy^m8m{ZPpl{pYb17g{4Sbwn$M?2y%W2D|BD|x?z)ZR6iNLRwbDd
zmkr>#hp3eijSoXru2>$U)3J!^=J#i5o!vWybr$sWX&f9%rQ|^XAv^PB9SoY-3EH~>
zc>Mwk8+5-p{Oj1j at 0PPRKAW2DQwIb%;z)9Z!}yfQ=+py7cNdGJj*BD)*gHmBYx)}V
zXxf<pih0rtOyAIqyEtqaGjew=grZa)7gvIH%O!>07Y*ViWohGw2RTi1X9$;Lm*azu
zQD4kG801>u%|^hR at 1ggs&szEt=UL0dSxPo;@x}vc$gl5lksOgVD%ZN<R~*e{_ at r6x
zDBy^Yow%h2%*|-@?!qBy+b2nZb=E3+MYHY!yt;_jLQ{OW!qGCvZ7sfK$#5J)O1T$s
zJZx-_xu1C~F=L`HaOw=v7=w>5oem&uGij}}WdU-b2Z;*%l)E|fdy%Li$S2|9PR#@O
z$$S2W6>(DN4HN@*-y(&~^vl$E(G>kv9 at u$L2bIEO6c^{H(qy28Yo7urkaNe}_}w(z
zm~IPTrZ(<9CKd at aH>_m<wt8``<Wo6A-C3d*)6A#AU+B(+SI}i`xOrqXBdqSuLHtXW
z83iSiC7xFpb!T>5rZll?E$fGz3+B(5HGiKm0iacMh&$h<Ng_BV$wqSe>BCHy1O&HN
z at m<0doG+YygS4~Jo#c`N<@F;j@#r_oDW|u;VK+)*)*Rp%?OVYImv>O(8VSc4RJ`=)
zih{S*&~c7di<CQn_b{~SBLG(AKG^0~u$0Ov<vX-mlrI8j0+rtbohP0*yU^D=V9`~h
zPQyx&`{VFr*t=ua9?}#2|M!)NPmB45ZZ;+h1qUX5Iqdlq at N<vgr6>T!rBB*%Kfv1U
z_U+H8z_H8zJwc*fh7Y-y%-TY?947{pP$<h_+U;o-m5PERW7ys-anhTa&L{CHU~0br
zX>Yp}F^3`ZJ<fVE<*dLc at CyA%B50sd2uU~v4_nY230{F%uAH5Np?wRCLiC at Hlm8v~
zz+6(mu825KL~Oj1JS=QnjREB)S%>~D7S*1NgJ at NQZV5deY&vH?oPJ0&$Qq6-9OpUp
z7KtgctP3CTejnY=`9A?35p)F^sw+u55YrKGPY|Mlze^8h!zRFY$R|tSt^)5PUMccW
z2kTsR`nFiXVcY~|D>X2-e1ak6Mey`XI=j*Fr)jPz{}Ef-Fx1067%7-OV#|L?lDdDT
zmt$`N935zg+#cQh)AI74 at mTTqNLr1E>g;?EkM)3k63(P8Qdl+#&<`9>L!{;8WIcxk
zWHAlI$3*q1I3`&Vc7i2Gp^r at -@*0|G^?&6>Fe|=@dDE<PWXWlI2z7t{TS^r6uk;Gj
z1J0t&O%EaF8kA08V=Au`wT$}q?HiZWVzF-LUlwzaARCzm9;k^PZL;@SI2I_^BR*UT
zY<;*|$POHoiZd|Q!QyvrCyb5o12UmRHGAA0jtx=B%iSsAa}HwN&|AtYF1()Qbz}@@
zUdf9Khv`@SHi`Ef_$ROWLWv2oPg${^tJ5*$Io*uO9lR at jFl7EcB?3#@9NA4dF7*3J
zVmyG-@)$WAkVdJ`fwzX>CrxeU>Bu;KkZ$B2jW`2oVI<**9dM|<c&%g$L_cybn2K<)
zS;}Y}EBcqxqkYB$|H_;2FgOuhoj341lzzwM8%x)~Z9txw at N}X1-VRcuAjeW<PQg>U
z?23e)AwmI3!u4(MEXI=I&qI~o=yZb|#PxFF8hp2%a-DlY-j}n6ex{TEB&PPJ&_WW7
zrW4fmuPhYX^}(!4dMyDo^uZA$Q374lK?os449Lt;@`Oak0_XZ>8d+13X0zvmC1dV+
z{F at S7OyGGPK@vXriBb!e`bSvEbkcN(YrNS-`f2hr`gRk0 at t*o_U_VQiU{5dsu&Bbn
zmKauI2Rae&aW;4oDghuviq at nccmeU4o)i0eHskAdctyh0q6`4*LvQbANVAA<LmMAn
zIBlll<RCDKxs5ccR0Z5Bkg4w9lA~oWN@<Eo8a2jHT?tK1K`nqhENG#d6nZ-}aUAY8
zZAio2gK-h$MTVpB?CH~|b+2P`t~36q0hx8eXaoG16<~p&@kd$VP?eeN^_)=9Z!kEl
z0#+Bn2Qy(qYZ;B`|7hhC`qL7$K!q#N41$wXW at Ro3b!g_oZU+bG8n7M645&(tjT8PA
zIOex}TEq|`qUm1U{53zTu_UD8i0afVu+4`j3C2-YR_4+}rqdRAN$%|zc(6;HX+duw
zvrjrsbxIXUz=b5WyI?Btzh;Q?uy5{%?+~xB_ho4YXBf=Oo&hy%L(VL28;5$$w$B12
zu at r!pG(NK|#1$DF4PBD^lWlg40OixO=2Ai+Nu?MS#;AUM4oqR0wql<u0>3A}VoK*R
zcfpJ6XFmAxXG*D~^A)9y$-nB=6Q at ooLKjaaq3F4BV`MbhIRi_s=9qfBT=pUYISxD7
zRmZ?zb(WC8;;s`0PE6BV&4C*))D%K5kcIrQf;Y%B6ueQ=9eWDFsU#>hz66Tm6sb9x
zmWY`;NRdcAA|N(M;3#U?a7g`j++Kwn`_q|V4mnR4zT-KA-1DwM3r~b7gg_hbAHg>b
z(AodgUH at jFTrbdvU#qE*hF6kK0YW05HMEV`=3#p}YuQ8gL^}_wM(jW+R4D7jZTEga
z+E7c*p6CzrKortIeVrhb`90Tm;#aw(+BxSiOs=9HXhV~+pQk*)aRWA+^GdR6V!C&@
z$7z39hJ(F2(x(SM|31STi~B`2`T+wFled8%a)5mb!?J#m*@G|-Lqf(KI5c)vD>7kx
zi=?rLMv3?qUgJ7lEE+ at 98~i9vM*R%ENCKn0W+{Vn8_`yZK3GbTO(KCP3pOLykl_3S
z&6=!zgvGFkhsZb`%cw0Yj at _{8$ZW=YeGIHQgQEx|f!}te0Aay-t at Ar^@aG=M$8Pxg
z2l7JO*6^?$QVG&dg;$zIwHeMkQKe`}#i+XjrHw!(qawc=zreP54}z<5Ck{87tphGF
zU$hlEHMXF5 at I^0Y+)F3Y4bDlTRq9wk3q}pw(VT;m7nJ?!4=&tfiDTluGJbOaD{0u@
za3^wX6b|;4o5jSco^GGP5IG7?6e{Lm=;$XBa<KP2{QTM#{Gn$;E|=>o!~`ewkIPy3
zIFq=AdP(?4b!1-!xz<Sb&*69X8P~vwXjn93AJ_`;@KM5CGo#6_=qZ1=VePoN#+gZ)
z(Huk0axj>|_j=#CYsvYAZ%#viMa3uz`Yl{sRpVVaGi^Lv7K7^memhd6a{Ml%T>-sh
zAk!Z at cQLY-3i#DeLa>|D8#so8_!i0?^>kZB98vM2D;Njf2Oi9<-c;3(w`+i|ndOZ?
zH at x4q@N#X2f7 at b-1SP1fQV(OCdiO;sA5`y3<a5vtCPevH>~12n{o_#rF*U%bOIGI?
zI}$*l14dWfx$7jIo~+Vy;dchy>%dAw{alQhRpxMqAQF%3=x_5GQ6`XulW7B8ubkM4
zB*|mPi1qEmzJS5G9=GUUy@~Oj4KSdY;p+*g*2;)pVue#ndp&mL7OZ8brG`jxetv1s
zq2qP>>ji^ypXsk16a{{M{jZ>-+C+8$ucWu-J_gfR4Lj?gxuN#F2MAmx`>MKFiS$sC
z$Vv`~OlBWGxSloLV6-a+Esh;-*V?vsQ~A|cOUbn5joFOu8UN9hUATqA!RPs$VH!Zg
z4yt?kFB2@%r|^0@&aZRW{@Aqk`u%z>C?qUz%wtGMJPo|IGRYMyZxMyt>92E~Z(0A%
z_6iw#`=S{yR+JIGd|sTk^7PmF8UOa<6wrQtt)hc)`pbFt*S#f&@g9nCu*BgtPvAfx
zayx*~V5o`#0?A^9e8#p8B3T*n`Y_h};f}k;2+VZMQ<^~ZMSyMS6e+>N4cghzWm`^=
z3AimxP-yH*B#K1kb%E?O;tfH9tmde}gOZ8l955i@#n2&Q{-A~Q6bCmq5>iSQt2arz
zlb9GW`x26L8dgOq7Rg0VKRHCSWiq8ETRvp}r_m1XSX6dJ=8^%Za3s)2=nh4N*@EMz
z3?D(=I~wFA at h2OB2K2Y+L__dDd*sNG(02{devW+gg??XZoZD&o0n+M^2y6qu3TTup
zU<7KlkR=N6wbTuL2>g`Z(x6)4Xiw>$iBN_yae#Xt6Kc{eBcO=`K4bXX0#asGfGUOh
zFBBGK^kDHnWf+VWhM>)h8-Df5=b-F+{T|`96F02rNul-b06HT57Ci*K4%Ar3(O50T
z-e#`G04!>Q137J9B$OxYke0n>J)>^V=9xGs_i(Mn*yHy<bU0uZaD7utLJr=bmQ*z~
zp?Gh5 at H=XSnC@*ntk#T|a2JWoT6DF|!i9ozV7Z_}Q^aG2bhqMQ@&-ysOcv%JdH$k_
zpPn3^(}3sQ`$G)9+1?08Cl1P`YXkFeGk3w7T|;y1m71U9uf7Bxo>?@d1a9tb at mj13
zBfDw at 3KyDa0rUQz?KS9Vu0^qR49295yDMLDU*>}c);TokdO$8%2km#y=sK8-KBrIG
z3`Ta0_h*q26~c7&tKqLVG;}$YX0xjmJ^&8B8N7rTGx$T6_D{6eX4b}-ef{7%IQVAq
z!8NED`7KI84uu%EyKMr=S?OFDHHM2K_$R^9PtqdaU$iXDF%lco at ttF&M4NFnxtG8-
z7IkW<{~J|^#&>b81%4J6oI#Up8~0Shhu0JfiYAsC9UMX+Tu(<wf$ek6Oe1h2TV1El
z0wwL<e{7ptaVJdp*KM@#{!<RsyxSiHo4-U5 at y(G%O#gf!N59AWL$2e#%`(ZFX1CE^
z^U0`Hohl__z;<*ZBm-$`<y|~sJ(V<>WLLj^8mWqB at 4hT><{6nlcFE!bpqHHdr4p>s
zz*ZIu)DLHn5LRb{nTzh{obC9~_&5#5Ty5n?CX`3EY at 7fI^PIdB5_kQH40Bs#dfCX@
zE`J9O6!z+NzaHB~K-oU-)_8s81x_0^H-gi13@^RYJ9vKZtSsbJ<CAIu7*PmEl|rVl
zQKOVQy8Q(li+d+WNgkl{vI1`uGuX{o6YQ~NRIl&>fcz>9qUE(fk630%)P^jQbcZ$*
zUa at 6BGs)zYc at _;(m2ORZP~A~bU56<%Mh7y(fS*6wDge{pw3JMfLstaujaIsR|8jK<
z$&(AVaBWX4jE7#B!fXQSo(4pT!5_7GURUodf3Cj=FJTv5X5i%DNt|K378)$ClDU(^
zp1M55a%iK>L%G-D7 at bT5D(pw2;KgtOaqk=lv%2j51!1!^Pk!E<uewnuk^q`j?M+DS
zOv%GE#n`feYD(@*9)`>tLha#QD1o8%%q;@|ZgWC9anjkS%VJf3f|4h5e}(EsFjZsP
zuXAG!lQl5kol_}hPdA at l#vmVFfAN;QAhd?EVIt6Jwj(h`!QC9eE>uV<-~gLQeP?h&
zDUiNAW;41#>+m*Sw)b7>jrVvsGYP0i at hk%%7xzJ7vzkDGEa<S4hMMdB-alx1!p;DS
z1APY+p8YA$ktJ+~JD7W0`MeJwBwCESxWcwpRZj?HS6lSqf!Pii57Pfx8MOR)OD2(e
zS|(D2++b*<;#p^@BDVJB9=TSJ$v3wI at F+OMzA}r#aq8jO3+=dD)_FBmA;-Yd<z>OS
z`zG`t^u<sUCK^6%(4 at jgNjYWsJn}Va3wZV7JFpMVY^?#9i-~I;@{>4n>=cVYfFsg1
zF*TXiMv%A(q$5H(mSMzlD1zoCbSzdKd6*sr!3A1A@~AGh3=lPiVj#lrA5spT7_%IK
z6dF{$+%J8?_a9U~QbZf_F?6!v(Q+0SJ$&$-bl7Cd!rzEqS}6eN@#juBH~4jMKAeS&
z2Xj67WiA;551?aCEf-0CI4Uw5#WHdy25g?}VFlg*AdcSs`?5Ad^dFwX1SAj+dO?HY
z1QzPxJ}$}K3lD>lvpZdLi0mk!3Ws;0DbKcnjelyRQlX}pro|38U;|-K-2U5`h((&G
zdiGc3Q)D#9!Z4b1J^3Qh at _2^Oyzj^_3=sv-u0btNh8w1xVbzaESdl4BBS|fk1~AA=
z5y2<D#f-2q*oIOok`84ItU8MXlQ;ly!;=9BXr3yU3)^UNu(Da1r%9|svb(KphV2<C
zNm|K|7*)Il(m5Qnt-zH(f)o-(gX2(2$fH2hG!;GtfCvGgX|O38s5Z4cC=DQjAXq8H
zI)DgiJ;9DRRQ8B>B8ZN{@WkKeNhI=SEUs^tb%?ftu2Z~D-YNv5lL+T!SZwCqb-xpk
zN5ZUC>(%xrM~CntEx-{QNiYGDF at LDa9^)~S-~uVHB3yJ3<$_?8_YC!Ts0Ca(<nTUT
zas{}2k244dh8?=T6g6}X6Aneykw^!UJu)##Z^oFiRN*CKyms<PUa at MGrRoS0TOjPB
zZkc=OOa~14LmrRcg6y6my%~{!7|)PO1HZEZ6L#_JA|V9fXA*Oc)o38p5o1Uk`@A9G
zC^i541E2{aUieIM2;_l2gn6y&iko|z3L<d^p28%oV$?XWB7FvIp$%CEO$Gw(`AT0r
z(OEsX6=KxIWEz7fH{V0|s3~Ed4i+~t(BiQ5d>hauas2^G4{4&ROUXR~NxnGmp~5pV
z988 at XyDj16L`Kv=zY7|Z0T~-$?NJBS at a96sl@~6dnX2i*E*Hj=W&VJkNZs)p{Ka=>
zwhC5$`3{?<{s`CpKnY)QC_Ku2+b-*JAr}}XW}1p5DucTyyhr*c$t8JT0$7*p0BsAQ
zj%ku3SDRya(#HH<4Mi2nEvRwz*Hxk(op?SbgH7_FUUmdi<R8`dAVJwh<By9QV94r%
z18QVtV5*J;U`nI0DR`~zBA*JkRx#uO1zS$DnM$qQmJr`x6np;FU*vS at LjI0zfjxzI
zw;dIsxS)Xu{yj1op6$c8diNBGHC#aj)=MMSdy-|W4!)_zP~L0z_4u|W2*IKl>)E?>
z2vu-x&sU&vzJp^Rg$YtTve*$o=X0J&>>q!BP%SU7wdD!p=idCmd~*t3ermPqW~a&V
zY&?85*K+iATC&T|?woT^v8*2l?p=U;mHm63(fN**zR+z7$t78|Cr_w0T at GxBvlhD`
zd9dxv<Qu6fK5nx%GGy6<-Fg3lxTeFvL%Fz%a>WhgQUAf+=K6(NcL5o8rpRTNjy!h(
zbi9p(YLQoEvopncUtlnNQf}|n)C=CsS{e>GmgX6l%Jqdtrkb+DCst_wYJNkNB61cV
zI8~^*{CtZW5*3 at VK^LTvblQXttmIew`W1w-GK+QBFHlajT{%WuVp|nBUu~A`S<oq1
zs}*5Sx`1s|Y|DX}4w-+LTRGJ1|A^T);j&V%5f`e?!2m|HM at KL$As*O>7TSl|2=M9q
zJDI>vjMlmBT+cD_ at Bwp+=r1OCLxSSX!0j9&y09sZp&g;tY5;2NyZd_VVF`)mouz4H
z%^@K69OSyt9L%||3=<YR`nr0Lh+sVjJR=4NNK<Pt+BKNV%S;k)!qYReNiVUJ(k>C~
z=roo@>+UWPBHJ at LfQDUuJ9^u at v|;+G-!GYnDjr)LmZb1H9eef|;+Lca%~9=0%B~dO
zQ1!CGu^_xbaGUGP^ixUOxVYAkBCW*^PUIPcl?K-Qod{gbnOAjLXQw+Cy(`%PpUWo8
zP#}XsTG+53EHmwO3ZQH|Jd(Tj=+ULU`k&v1WT2I2tzL_la(<mEW+c|G7vO+{pEU+`
zk4L=O)h^9Q>njuuZH`8^T&7t^S*!UzpUlfy>h60dKu4_axod4%_dP*(W$gM|Eank$
zZ`0m*?HmR_0I9vdliWM7RTabJTkL>VUuQkX#6)u6#zAEf&OCnqHzPe6^s|fm#lg2P
zZ|k$Wb2U}(%B9!f6L%VELV{q=oXYSnm<yC9cuP-M-fe^ZNQN%U=T){@;(%E at _;*0R
z2(l#w<?5pS=~E`RU6yqM-^vDTmKIS|-CTn)xYFO^|Mm2wk~HBBXHDjAwTFR$$MlzN
zM(v)Z=*g_-m%@rk!@_KrCoe~48xTLi>flxy%MM|OSj1+~OHg!~a8ou%id~?)%m(-+
zq7CjLJwks}gXxF at E3}aaFlbq%xpthTGK$u at 61ydVRr(`1R*Y3Oi<cv5CM&#Cfqho$
z7p>4M3K21Dn$=(NvBtz!HTDE at S+!ii<#E`lCq?ySQaytY3dstpZgfIq9)%z>?Rimq
zmlP~jfD+Epd>yOK8J7sf<R!Fx0YnyEZX~-appR;$k(A7k9bNJlg~+pf#TL?kMrkK>
z+NL1t`g+3YucTu)%13i<QE>RmOv^7Lzaxhk=@AHcNU%^EnF8Fi%d*Hr;%?3 at wkK0_
zXW<Z|;ZjODV5Ud{- at U@Ei8qb9TwC#?a&CA-yab09W);hkuoITwUA<MP+(L-$ixNyJ
z)PEzoD+ydxFd3yu0$!lhd$ob9qfs&d<~W&%gj5-towXwM3dJ>#De at ib%osCbeoHPv
z{0yQZ*8_EVdBc7P5<)O8y(A<JONx96i(cx?L7*S)a++$B*FaH2Y}K&+b|8|gkkM^m
zYw80?0)D`aFwY~!|NV!{1t-7)d#q0`rUD&)A{{Cx%7P>p7yp@=_&3QKsCCNUh|^gS
z%g({INaoMaHF(iMAT{G6%3~T696NFKB&owIGqO|1Yl#O0nz%k<hH?m6n?`|ViKfBI
zs<}Vb#O~`b*L70el6>ls4j0fkv=H*n_6W;8?%ya=26i^njawz|S&Q&iRGS at JGi92-
z^r&#Uy(F_jnn4K0Mo^v^7-U~ivnFk0W6XK6rJmns+go@%5Y?R7y4!c9=CjkA(A}tN
z*q<@l%3FNJ*nO~*=2(Xq;xy*i*wvX`|4>Q8)Mu%8F*=2B;>NG7);MkQ!r03aspCmK
zkB;h8CFDv6N_>`T8oizAgIx7t)t1w!^ZoUk^YzQ*Y3a0)*An+s=G53hukuf8l|fcO
zcThdo4)g1j>@DX950(<yT=Tli#)BF(&K`YZh-}(TZ3>7?3!YbC(XZ!1C=3Le2^H at O
z(#qFOhHSWeEX%N|(~%GLK-ehBqnuuws)@<0I6iSh0r21J=37f>r|OSDI6X1%!z!FY
zvs>4Up&d#1D<RNc%|!Pn=`IoKke?3oRxax#z7NZuyR#sM4lJ6ap`MEpu0v5W*|g!9
zR}79qo#Ep1vejlq;`}<DMq>Hna99d$1YxyLB((i?b at MPx;fEEO<q~x`BdD9AIWVb+
z=+F-(qpC_+u}E^XGPhM{Rj5!Zj`j~8eT{DoTF&Z9^+5lb7`vt*AIhJQDBv)lcf36K
zq at 3qtMI{p6Gw`pg%mv<x6l(wttrp+{nB)!-v?rG{gZFz;U~Pxl?D;FYN7uxzy^W~R
zcVL$<t|~7i3Md7^MY01R*wW~-@~s@(=EtEFqN!76hiF3MK0cvTOaDUJlpD0bm^y-n
z%L{;r&An>KR7f>plYV3|gR}3erwKv3z+lvKk-c{GwEF|kd6ZG=`^pMu5?bI$IpOf(
z*7p8pdC{FBf6?Zi9^G1v8`rOc^K9$*?jd_p>XTlp(4f?YXqhA- at W;Xgcg=iQT=~cc
z^aj=(ON4SFAfadbj4oY1_~s!vO+)8Bc;Cb0yS%3EmJ?Sh;`^0oa0<F(_41u9F#;rf
zZi#v+5m3!>vxCn;-#c?FCpLsZijf_vt$yf`#w=vAPOL590aTKxZ*y$<k$l(PV_RGw
z_zRmJLXB<0jXO=z92m7tEB<EsRHFT$-}^v=r at -7o^U8hr3ci`sDympxN3cJJ3ZC)`
zLt^m}uf~4zFZ4%63 at 7Htp@KzYx9YME77s}VB-^&5fcqE{1u#v+LCX;ZK6*^a9!$05
z-X_lXyIg!5Tc$cXovI&J^X%R&hYe-rcP-G}{f`t8Kzg$du6!_NaS~pdO-kvVM)#sM
zgyM1ddzLnv%NQ9r#hW$DpjoSo4I68IHbqF<&w6v1y0jBfFrlnIiljU<+8&%QaJ$T}
zxA90f`Py8&cFl+1blG;c at bu~kEHV-~k)Ec$ZT_kq&!8+69 at VRTZ-cX@alovG;{jaF
z9nSB&;&pt$D%2d%C*~HUIJ+Uj$4{9&a at lue@CZVDp39&_)tgthuzJ>Op=E!LWCTFU
zP6pP3oQl8lP|M3}79%WXz~Cdg9O3v3{>FeEyk-!?6vvmL-uh9Jn2O^}fKL`ZG&Cdd
zh4zJgAF;Z~m at UclFcCUY5RiwOr>A8f{E{ly=bGaLOVct0c`<aLirdCR!F$UgQ0S{B
z4J#E;<?Q22w5|TqKG at eFYI;Rg+G?a%hqyH;OTPft;nQT>8oO)@Lb-ref=w%+fW63!
z7rKFYzI&oK0W}KT%)LW)>xM{NH15PS^A=a%C54X!^SWN`KOgVnsQ<mQ=1Zkk{<0 at B
zO`SC#s?$Bg?8R$<f68$JmvR3zxiDZ?YAB+;z~$a!x~AW(`95ZUrRe5sC_4n~(%Xn_
z0po>RN2aKN>ZA^Wyj7K2H|n81)hpgr#;YM(r`x70=6m`M^IE-3uC(S2+l{R=)WjFG
zKT0N}Db7i9TcTh~k+Ly8ZnS;(@I5gNdlkyW=FkoWgky_+tDak+%dDm8fBV5Gl(ymA
zxoxvZW_tAp6lYb18f|dhL#b%+!NytQf%3$0T~n(rk53f?0o?<RMRX^RaVPa%f{mTS
z`4x+|#|oRKd9vqxMX{>{UkP(iK~oRUV2n>0$|m_19LLKm0k-<6-c)zbGBl!t(1y0N
zaNJf~m8=@JN3{CO*c(Ifc2rxV>df-3I_~BJt%{j#8H%83?}#pH at vADu!(zqB3>l}h
zAN0%IMRlcmkxM66uaOq0-4TyvIU{pk^n*&@ZH{9dLa4j*`&r|>6Rs{{ba|h0y)U4V
zTC+T(rb~nmF|L2|4YxqsBTU!sj;x7lddoT`LE(8uqXNujui?Z|G*0We{;M1a3SR?E
zb^@zxiF)he`S2EcLb!PK+;snH{^Z)Xx$~;t9eY|YtDE{lwI at 0wb$vP5-E`^4+7fgn
zu^GXg`Czg+0$DWCuT_xfkPRX70^Z%bdzxf}3pkXMf6+#YR;3T!F=Z)USFC))0x(6%
zTt5aIV)ppfI2j{jt1DQe;0k14{=*OyxfxRnW^sm at 2uYWzj}3Y-hwPBb-eOChGI7sO
z3C-W9U?H&0wT#We1t`1~rrTQBHu>nm!Tq=5o&4B#A*f_3m!Qqe#QTwMy44Flz at yIB
zd{Ts%<f*&|<C#1N%9<^QP7R_$7dRO at GWP7;%Wv#jW<uLv*z)yA=<G9ldwcyBD+}$g
zyMFC;UlJ_gdw9xw*Q@?y at Bje;pQ1_Bf}k;rPmT8xN18|j7Y+fEJOwp2hts|n$55P~
z5~?JR at Kbu{9B7t_!4u4fkw${}A!<piivnIJ>Gjw#kmgMp3{=h$(p=ljb}zYVf-SGz
zI7Y}mz1B<x2mJeq8xMx<PWiBJ#Cc#c&x-Ee)I}ZkYBV4QAosog=B<55+XWmt44CPb
zIb+)y5=~}DUZ<m=2(A5?;tR)azkCvZz$nnxp%XcxuP5QQZ7ES_Vdh_~?Af_*Pp*Ex
zZcI&*>6<R!BvgGqo(MBlOk1=4s1lKe`cB%9qI4?;?|~peW?LFM9a)zRz0}h%G>~71
z$Tq-a)N%_vA3!RYzsmRH{&?&;Lg1+845?}lYarF0Bf#URxeJ`#s-kbTcWUG*WN>uF
zS^I52jY_Y_YWcZXg9!9`jD*fx^3a`LcA3D0r&E{=P)coTRT~^|WW-zDI6z1ec4QU5
z|4hdFb*?{NE?CJEjO$DF at ZC~{Q8`2|{1j5<)u_!Cjzcw+{dxITTV=kzd%yHcU!}~r
zE09}vPUkPP0BT^f0N3;N6t!p`m8k!ckZ`5(gjWnGpY-kyFn6!Tj1A*+Gjh14U%<~*
z9nr^vd#Wu)fW`}}AKRX~L-E^}LC^cJKKdP>W5w+RE0Z{jwzFPq^)WGzxaqZ0zcPGs
zs?&>65sgQbmD!1hy=%A|)v7o1<&?=&@LoqP(#jV$;u(%AhItGO8OUs)qc;^91o?^R
zj#j}?=M2UedG$h#0b?RZAM_zPXSyE8GN0Fn6f%kHNWN}j^M?nLWF*;=hRo<RPAcgU
z^r{>piZ1D{e+roVBJ!AhM;ZdyKO_J$dF0tuom$4UbwX$<?gipArf4kFjQfXeuvZNB
z(}-Z+2=$J(1v`K5+?Hl(n4#;r7qZ)i%YVZ}pgAQCaxDP}n)1JVjk%3gEs9)C0dGak
zb2z!}c`D851w5w;XI4{@P8502M8;ygM8xUK%^o`w8M0N_#-a0stUd_Hj!+iTbL{Lu
z?4PAh!Vk+QLU26p*GU-(D^L2Us_c+SIsapqmtDa~j%j4hDW{QcN(({4jN8P+aQ^=I
z>KMz7<w0y_;T0j at fyvhkb|$Gm__SPC`WUsxmbUE%+y3v+Mg#+?Rg&(zt%QtyM5IZ(
z9ok4>tmXhZK{at0N%NX%Tc4j`2{UCc0jH^GA;YhAWj%jB1B*Gd(Q-UL1JD-_3KD6X
z(H%qJfEQ;3W7CvhnyCV)Y7hD{gy^nVzrL-v3Yt)BGxb^&f!>ZH7-?{VETVnbL$$ts
zs%4u at 0#ipl7g)J&MU%McaQ6k!tpqCHHiSpD>&*<AGKnEKt>(trNChsc7+H4M@<w)*
z`R&(O;ITVl8#0*)fSA4qhQPxj*!TUnn+%5g-^)6QtPOJ_>5*uu`((A2IXN1cXJD@`
zv(>-cB^&7lq?CC~+vqx at ghsSW`O537c{($?g)#Iz)W7e^4GsZ5s$7eNlBnkkS%-Qq
z<fKNU*OsI;#3guQxO58l!*bhC0pvZ=Vq0IXP9D{H6F&8gkpTZ_NDO}?jshj}rbj2$
zEB+z?L-38tqUP_G7LHC&-UB%h+1K(nlEnZ7jYhoqUyraRn|dp7Q_bExQ`&zR&v1g>
zYHgf7aDf9QL!i|RFL!PD)^q0UVC<itorKGga at kM53o5^I!+p%4Z2iAhiMSw0&BZ&H
zQZoUMm*x^(f5za{GduZOT|m|kbg47w%iPz_ at H<JB3NWluiyA}^U&qRWAS71mT>-Qz
z3ozK6JJY<y9b}lxH{biEmM?=VNq(FeY?;dY^=?xZ=G$rW2MN3zCpENWhQRLP*}naK
z$D4>FuEiB9(BtU$<_7w3Vh8M=SZiWQWRBuq;Gq0>Hjg|gZwe<L2sqMQPVvj%>?Zcd
z=yKag9Yxg#eq}ZJ*zwtMJ4wt8=O(q>1uM2c268~<TjIm8(9j5^2_k<?%@Q3|&Dx0C
zcQ2pNn5z9YtUi9bE3<6H0&>xxTr#@YDkdf{{Q>xzb`JSC9#3Vy<v#b~F^AK*X{J_g
z>zH5|;;fEK2iZC5V|+tshb7K9QnVvUkSJ_=cGV6b^r__>pmw>#_aEqC9+}H1P+y at L
zY$s+*em1!eqj-MlaQQ3CC%h4vco`n&M8p`-LlV(UL>wON+jDZNd at 33wKF@FiVc!X!
zL+)UKe~Vew?cWX?f{ydl&DF^HMM=icK-ZVo0e!av1u5VyYO?iit)35Hb6>SH8RjO~
z&ya(|N^#)ZoVRbi3quQyVk@`kB_yh1`^Y0lGS at di8>5)!#90=9g91ni7ii9X(4y5t
z-=X}j`UGEHBpOMr0d}3H+%%tpaBF5O-CGM&eWnP9td7pXw*JY at r>QnI?<;mW>AmZB
z6tAY-#!x<0I(}MjS;a&TXw_UTL*p~gPX7)JY?p%(aD#+Xf6Z|A%axmFB}JKrbUDIj
z1loi({b5>@{M#Npcbb~yIsMpKdIT6!C=lCW at tf&rXcJ?T5ScbDC=8y12cP6Y?-+^~
zqq33I2k5S}()ex&4jlGRGRc=leif{X!L!z at DEi8B;1Tp9l`~EZ8?_>w*(Ct_iiO)s
zBEwLYkFDG`xiKtWFg8#VQ}E7#3EbbBMhbnr)hp(&+kkbLaNogPR+NN>Qhz-vxI#`7
z(xN-DREpNa6sovFH3iLd@|~o-I?s$XNgyg#l>`G{KsL1U>c#$Ux~Z&Y*`MfqkeuOE
zaCKIwMRSApV<1N`mbtiUHY>LIS2)db at 6RYK-f|*iYSQlR#)CEeB35NlJ7Y!()s2@}
zt7R7iXem_F6V+o2R=~dM)cK5iQZ5T2pewwmjXA!YL0-z2P?}!n@`7diRcU3Mb|K9H
zn9Saiyk#vap1p*zDLSCU%my-Z7vhr=Vp?tbfDT=X>`SsDx@?G6#cnJG-M2Y8c4x|{
zA%IredIZqxTtU>ye%G%Ahjr8STHtowMYvgqa%ML*FToE`xgvwU1YSw1xG|)CE{Ku3
z*5d?ZlfvsVJGvA at ycyV<-leHPp)y<JG1~D#RfdyPHnt;QrGh4igVS69 at xTWa6<8{l
z)=6St?FNP?$`Ob-YmWrv7$TIw_`)q~F(<gE)nVdcF_UJ8Bs+8wJ_ovq<{I$Y1R;uv
z;R*mNEeOYy)wop)(s|FfT5FVROBcRT?%-1=?|=sKYt5mS+oxw3WFXBBia<6F{`A{9
z3Mh83h-l*U7HCvk`!X_f;7faXEbRG#m&S}&bwd1+bx+%{D(RE^C=uhliX2ggujSAh
z?0R^gnsjLy$m%`c2J%NfZy`h*n(W;Z3qj9v0d|cCgSM|W#z(cdIu(IZ%W<#AnkRBh
zdE4MdEBBI#b~GnDt=YxE&nD}$JyCjy`NuG8<&>Kfq~Uyb%UxNa%5Puxq6G`gZV~ZP
zqh#sEjmF5xsypI6)(+LTXsw7u`a4(KRXS<?_4^m}Y}>Rz2k{IL0zwY=BgN~@X$ZY8
z;J2;;V7v$P=Szrs?~cpJ>;vSkMM3BsCZ#Tg`%)TgaE<}kRCgU}4(*LjtjXP#0J_i`
z99MhkNYlc~qrS;qG-rs%LXIgtz?IhROzZyZzL2qom+uB%8Y~?2{p>NfZ2{J=+xoKK
zy<3Z4u~OB;Kw%eZzM%V%jYUNr9$0Qo?jkcnNEJBv19PGYMi`k$78aMfv_|=$u&KPN
zG_DgCmetuk9}h2Hi;n6(09JZxK=0`eWCFzW4Xaa1)_|EI2XUpB7VSaXH-6R2J3%5s
zB{Y~kLGV+rHTtR!IekW$I@{Zqq9ysdTB at U9*Fr7C%+THN at mY^1^k8c`hWx$*>&G-a
z5+-oj$O6P8f)I}!2UKgszyj|o88gdyK3S^3RaM|KA*%hh44eXH3vT1<WpQfF(O4z)
z{%eG(9XM7t1vkuN$PbOTzWBTm+3Bw69N$@q$oc3rmuWjFR_}3jOp|$wI1 at P91fkHm
zgbr->aSV5$H)W5~AsfB!ANy)hiZ-CR9J^Qd&HK?Y!EJ73etWYMeycZHa~(9$MVkq1
z?9xLt)+n>uM!k%Oo0oTD@@jyjzk}{uqD&V5?xDEY$%scmL4n3hD04heoM(m2+)^Ai
zw(<^ho--QD>+zOi`pvjCGty`rbLPPZ635*u?$0upS5<}LN2hs$GIKPO_;a>a6=D5&
z>`?w3R>Z$&Stnw6VYeS}!h~_ZwJ(FB*IqZPs6 at mxdbEAfufGa{<<?Yehj8kre-d4F
z8syw%ou=^Mfz=;MPHpp+bvETsvJ1FZFQXR+qP=5aERx=AXp2q;_U(Jsfu<z2#}q~v
z%ZhBNC#}S0BpqEv+o0|LY+YP#O3Cu02iafGZmIh9&8`}oX7=JFK#DFnuE)-ViLxF^
zL#c^ZFcuIm7Z=x?vMMm4LPZ0{cr`QZRnl$aH<$JOx at b`;NKz#*E=@gb8i^QVB=q>h
zNf at L=f%I#Z)0VA36CLm(B4Nm&D!)-pBs`ji;GzZ^N)13W?;<E9gec9Hn;nWDF+keD
z(rG_A?vA!VG-!j#4mG)ga{l at AIzS|oB2N^Y@@fHhZrzeY!^I(D2q#M-Sr&RxDGvp&
z<AIX3bK6^y8G>td8V&uSkzw?l3IY$-#*FPjQFSY-Q_ugS)2yfH;eG59KMGJa7%aDQ
zD?W9!Cuy3sTJtT*{+cmdmN|*T!mco69H%2W%E8(2;^8xlduGA{^<=OnKJZ0hZANxP
zfqVf7R!Ye4O9-KdEKa(02Tn!op=jW-s1*MC`)@(G4nf`i#eF?JQ3HsL9m~uj(XoaQ
z?<hG2g$&e4VeOL#*h7Bx3Z^YlMrni%`C=Ts|B8KEd_0ye4<rn)US&)uN5NE<OrLP|
z!{+vunB{VcewwoS>L<qqYQ+>s_sD&Q=5&W^_5sVpM3(6&LXfl#_>Lr$3)DI;Ywa`9
z;RKw7m^p!MmitqYDJl`$kNh(A0&KF|v;ZCMg>;FajPiX*dn^tbSWPW`h7&QAKJozj
zSgES9KIk@}+{Oq;Oyx{RVYUk{9i*4VdXgm{Jey7kB|?28*%(m`@2{qMm>v>`uN#5!
z{cFgU2L	{T--Y at x9Prl~xc*yuW at u2Q;@l#`iC at wDb{BNh=NDzP;onRWQi3h at y=^
zAC4)ho^Q<~@oZ@>FL^SNC<*UR2BSGraN0hE)Ge>btCLhn$U10 at 5}23oBegI}?kReR
z7qOb~$!c4V&fOz((Ez6&WKX5Ebm5wr)zHw}T*M>~K5SgT&{q?m=&1rhqzv*Yj#|>)
zQF8)mL>LJU+};@u#&U_H5u!0Qk-w<@qA?g-<c6Z2n}>lPm~-*I>nh9h4XmExo%wL!
zi~uERL^1P0c}Xo>Mhex&(=H0tdzWg{_)nA&3ZdgXAM|^yb6p)v=M5SBsY`>P at zNpN
z<#yB9xOC|gY84`r?YCKWQ>Z=3)lW>rY;;YfDrpl@#+~YlCG`VN&&nk$8Q&NFj^NQ5
z0Mb$#So9W<sh(8M*m4i1vn?n}KO#Gz3GZ#tLy-9cm>^qQibA+<ui$<PfiGn45&)Mz
zYPpFw4V=2l1a6~8sudhq#VF4#zP+6XdmpgENSsOIKrjiXAAO-n91t9fx3iUFXM#Sf
z*#de+F+STIq7k59Qb5Q^{z!hw=(PVplR^m#7KZDuPWm5ZD-sTg#&jNKu)02DTarr*
zO!qX<TA-Afo<6RchGEJhZ9N0(g>=!c1`cRVgvM53cSTaG)j?v>H;=*V?K(Kop+fd0
zVlRO43U*hnaPXT+0SimtXP`#E?=<P2!kJo%Mk{h3o{q0C4+9=4MjGpZ101?m4bYG?
zN#*hW{rersk_5;do2vIm+olb60G~*Ig2bE$^XYJ3JZGN$V=#?G{t(W=r0OTS++l8I
zYqacik#Eon!WB`GQ_jAKAxxS=iG;zdnTu&QR7!LdkS`LYV=WphoRJtLF_^R8-(Z0!
zU1 at iR3DB?sZjv9$4g^njNK5GJya;K~4BOBl7Ub&!Gk6t^Ji*r$Hr6*<Ai*FL9cddR
z;%OCYNSy(xEDr4%jB?Tw!K>n%{3Lvi-dw-P`ksUgQS|S1ob=sy3Q^C3)!IiK(ms5I
z^?lB5b6*lMJ<0^YEw;EcW}TNIx}VbQ!>9aRAkU)xON5e2eeQ8`;{fm@?&tsx(g2#z
zqRUB+f-ezv>0HQF(-B7K6;ju$`U&eh&W0|yX-?GzIDmliles#9?(|i at f%QvdlWc%P
z$QJX)Iu?=Am%;eXVBOO(Sfrw78G_bxBpMndTEEg<cp0Jy`r^DnO!~RUK}7frAsO6I
zSpQtNwG^z!>97C2elo1j{7-}qOTK-$g9&X<00HV+?!d3jH9`FmFFGrcl0pLhNttmL
zJo#J{F)RxC?D8zYiBJ+SHsl0dwFAveK$K(xoC=VlR<hG$b~faHbJY%841HlQ#g`0;
ztgqmvBOWNCWl65bohFPdQ{r@`9!_dO^SaJh at cc_OW@#HD0-Bw%lgvg3Y5?R49vHN_
zlkT3ns%T8ihwG`x{#n!^F2^4eK6Vc+s_Nev5|3>fA1eK{1LB#Q8W!DsZAsRwd#>A$
zv^<-&;P_Ix6|>|{%;ov<+s(+Ro6q(>{B70Mkhv#vR-O&#`K<Jp-It)L+eHm)!I
zV`Ewy|3`ao9hLREeUH8d>b3)8D`kTq1|l7bu at MkZLM1IgQba;Ruy7lIl1iF at qydrw
zZWTljRN|FJQtAci=FSCp&KY;y-*24n7{77<xZ^U$Ios_9-cLNwde)k2&bd0+8V_z4
zN)oa)m^1^*Ew`%r^IW at BS9XvUd4ZAt6J^~MmbhWZ4H%1w4qyRL26BHVxXot&<yEjd
zibpUeG0du+rgzpsHAVM>R7DftZFX=LLstLfR}wohTyhL@?>$7>7LH at b9<E at m?$bo*
zo)N-HpGf=*{Eu(#S~=9wYN#U%QEHQ&80#LCSpu^s6d!(wwB#+~N$Cf<E;a1==z)XP
z7%2gHZ&4Q?ztsdDUDRELXO<K>ryM<c)Fx{>gXe+D#EMKjm3wa+nb80n3r!zsv#`m!
zw3m1mAcr;KFeJ+WyiZbFN)5HXiZ~V at 0nMC)btNP>cO)jR#YHkm%0Xl8zT0=!IiW>1
z{^AxzX at n~NIgd;72<Dp=f{aAdl7THNlR+wC^Aq?8V7l5#x|obu)rpI#qmz(qx=73m
zV7ZKQrY^-{JVFKVlZwz|v_`_g4^|N9g_>AEMQ|kt$+3bSP5=7I%h4tWJ6LR}fMG?d
z<&@ft{YUgM2et3_=a7}k0cB-PblAxX#Fpc`3!4VS{qxwyl|(Lwu{Y?`mckheQN4t7
z=FXFs)DiXeza5tsRTt7|Bg{^E1L7$3POl{94^N*HHI<?7etBF~lTnC`MvALQq-dl%
ztgwWY8?M2nW%3$CKf=5Z0dk!@EfP at QOb<?X&YT(v`^yEBS8;`Mq(S@=bs+P2201Lz
zSv&&IXES&|@=j=aVyqA(A*<TsNybePsLXe6+|6?Wmnyq!&%~vk4T1|q6OLg at 1*v4S
z<(MwI><Al!eI5IRgh~@~8_Fp?pMZ+9NkAaCVb82(;~z8Y_s6UhKOc^5O3fK$d*5&!
zyXhNd8BG2P&nGCU&LE+{?18U1658CaOyx;n(?HAhC~kV;*~wpon;q;qyl<Z?rOoJf
z;lZ-~T{1Ni9T)?;=!}Qe<3gk_2(RRwJ?RHzleKHg2Rs at V*~#bs0IMf^>)f8!lEdS!
zBlBmE-_rC=6DvR^!wC}0LDb9aa0!6z<af at Qi8tvDUviyzKkWLjLx%OzgLTgcF$1Ic
z^9_d8_&rUZxTgn<0AM}93l`8xjk-KeV*Z_t^x*o1CO<`%ta)$(-CajI^>G`D8w}=)
zj7^LT?uobTGL`&ONQFpSigIF>sLS|TtX7_QB(hV`2j at eTcEEE725??;?fkXyk{ey>
zsLLWOSxh~WCEpUXLuhz3F^uplp3+j%U;g`UVMVO~2v`-^4m=gl*m7i;&^J_ at Ox}tM
zO_xE4>cJp`aG)qQSyNKo=`+%HPb`wzcL>L?a_n*gH24Hjzm#)k2Or(6-KvSj$SVt~
z?%H=-yFs)Jhmsb*!t^bzR*T73#`YcnTr?nU(qm&a#7oStUOs-AliN~-aS8^xfI2+a
zkueXDiUhGm)q3OK!Zvv)3`Ni{(Dq_(PAGo_@;P0G7QK~^3nso}VI4v4BvbSxUlD}a
z(!g0A&h#xE(<iQU);UBXvc*52#c4~u0$l3U*|a&!cTL>wWs+yYVsW!Pc|Yxz8(1;R
zZhUoIIR0e(u;0~+^QahTT at mCnG(QKw;__7b6 at im?yUQ545_uoOahTXcSje-)=_>m9
zCogooOgfD_hA6B^$F}0MEeDSgt&Qs0lizWbB0X|PQmzq&uENq~>Lq$B6K{>@<HV!{
zc~7bZ!DlRK*dzP)9iF+$*2&eyBZT6Lv~ytI*+Z{_lZ4%fu7YjO<g-|V;Vt$p(FyCC
zj4c<qjL^fLJ!A6o_rMP+9K$<XP=gf#`7pBOU^vq|U06Q3Ht&${DM82b-^l9#vWb8t
zQ_i~L8hJ#2U&1zW+yX9+cai|M0WKk9FI~dhD-%0yx(kNYYlp}{0|2+?weo{V<3VY!
zxdj>Nd-|~ci4SuL5t=Ip5Ul{A%IEIg<AeTWxkQ9Y<hEozIVifC!9QYssR)naK3#(B
z)fKMCzaupm{*0=g<mP1NE{&LKPs7rX%8+4NlL?(Rz~t<NHo)bX#~r;}(D)8`l6o5m
zr!1Ntbw!PE{fI$OB4I2XXt0dq_%|`Oe9X-)1i_PbCaLB<+5i0W86eP}_9{Knyo#-!
zc$?LG&>@dQ_st`Ld#ip%(cT>F+s<0J>3VSCL~JP~Q6erO9AqQ#NPK(+jy}RRB!h{a
zPp4PUAv0CnHqjR`QUvf5g6tvC0>8<T2v(B8+i~yE3`XEj2nnOhkWy;@f~Y_|j@~?#
z5CB-iP$pxz*#R1BH?N7&zZi?v#rZL!=|SKxyl6Q-HX{NF*g{7G;daNaX290R4?^Y>
zd>UChq0p69WXm{6uWs}PUY)3Fs+}d(pj>7-6>Z4r4<s!uU(bj12f&gVjARj_!=Q>8
z;Qf=4LhHJp!qJ^M%Cj562ZmW-_iiXzRaEG7e#)dsNk=vW5j$Wg7wW^9eFsQf1lsJS
zpfok0x<V<Zg?9EzX~#sA(orb35*-CC8&LVvlG%J<F5 at j-S6vO#NEP_aX_WyomQ5%>
zcguDv%)+KNBAcMzfmRvDCAXkBEaJ2+e~A5M&-W+8nLIAhB{0JIgJ<A_|2 at TE8VETE
zmp+6g7VkK4&SQ`Zpcz?E0HxOoT*<gR6Z`1nUVIvUpuTvg;zm6EC~xNZ?HA0 at s?%nj
zpE;YCfBBI&7(R{N#5=yadk`YAjw~`~y139G+*y5aiWFQ4k^S_Ypl9->F08r|qHp?i
zwA+?#n7Ys?>WIEIN<pSmnE_m=XcP*@?Y`mUW=uWs_uG)QQ+PDtrB3=*)SX_9Cfq>C
zkwWIq#0U)8U8u_z5Y!QE1{AIvS`9K_)jhz*bBF3%Dxgq|oQDEi{t%T(AYrzkodywS
zeT;(>EJ)4MM{IC)`43}BSB1g{bAkKhZ5SQ4<tS$^z^hUPmAQ`n=7MZ2?8qdC>kcS`
zz{fuDg45+NOYk}J3hjauDeK6Zf+)KX{l?ZzbJ44v4 at ulxY_~#m8 at 2TggCk4qK#@wj
z#~vu;TrNL=uz`wFg;+NLCSWoZBI0fdo4U}H=0?MQ!vq(+eXbk<Hqfq-RTdf`#(0ZK
z=4c at ureUCaZ?gYVJ;CTuM%>I`6B83l#=s+MFayJ4sU3knVdFbw-aOywqfxV2H^mdA
zf#s(LHyQe{T(WDT&LSE3kaH>GQ)f*$DUwims>4BQOW1VA*az?JjOxqSFc9X~4XzCJ
zLeZ#UWi5Um&Q0pjus{7ipQnnI+I5g#Eb>)S=4g*T4q1mB{s4O7Rs&jMjD@!m?_6%3
z;}2iXuW>t;CSB!_;Qc}x;WV^1>1}YYo2sG$>nc at nkVq3$UTTguDXFI^UD&dI8e?o9
zmX<a-Wl4<iltH8fx5EL^MJViSn1aWQLO~^>Uq<ZP$9ovFJ%Jkig=b at KkpSih`3f at m
z#HR2Zp)fA8Zo>xu*FrQsuEVvQbrweR(J+hpbh(X at T7y9tWWSPC)(-rFh<>n{5>RAg
zjCx=*Ccce&t_%D~7({1RsLgr4iv_$JAqQhT^)T>aa78YcPoTs&prDYW$qh1$3fjN%
z4t?gg4oz_xqX1<NnU+5bm{m(Dh>PLmgtiz<Lmwvfe8^1on9DHtflT$lxOsuYT6AWH
z1SJ6|P>z0MB3B^~AHU)!_>qiR^BCpb%#`vF`)0lXPt;oaz08`zc_QTx09%ox*v|EM
zt^_>*ZjO&iCz%!XJ#n?0Tb3|}mnNM0=NXFOx}lbnvRla`3FkYF<N>*96BOCwCG)as
zTbQUlL#FhdbJ{X79Bg1$wz^MYA9o^+9kqovL3;4#TAUCbmNTaw0^kRGzvH%Z<+Tg6
zf1wdWhz>rV7 at en9>`NO`1V}`*fAl~iK}uQnWIEn`jP_B$+pi>Cb9T?=&-0&k00O8l
zKq%YXr!Z!z;Miv3&EQ{dr9u=*c}&GNIK$z at J4ZT#if!xU(a-xzAOwEk>{mkCQAVbm
zOuQ{oem6|ZJZUeGf151EFvO8J(cH=YHRYbDL$83X8`}%iE)kf#f&V)DDxx+&<{$y?
zRKbm)2=+K-U;x;|$tG*-2jR~WFJHd&4ho8HZEcMl3-a-?u5fOws|yFq7YOKU2|<R8
z4R|NSOk=Gue_ZV at NwW8Gr^9WG^mFKYkRMX%^W#@4R2k`A*atWZb#1a-{8BqV at zZ>0
z+#>rdY at Pxfd3oL1vy5nC;rOZ8rbx0)%HiqG4@%;wI+o^`RI#m`c7~)1jxTaFV!=a#
z=PzUiKT)z3yNOg9*|H;uC9W<+9lbETrna`t9shn=&B%!N13)hq#$@4yzhumrtdjA^
zjHwf88U6Kh#zcBWe- at CPNGj>i|GRI$Ky43%XGwb$?j at Yu&lM3BI4))_S+b<foo)J#
zm~GELq2yI^RtB_SV7p^FUnZMu^+}G)`kCK9O8=Li&Ev9l0k=zfO)7(3n_~<mF*nZS
z&O$g}!9SwqB#Jz$x2N;O;E81j-j-w7P5X~KS!h7j at 6->}NwS>|8_td6c%Bd)0ux^@
zY!k^E{hR)ji9C}2e8goU*`q%%)Bmd09|RpU$zlfaM&r%Oc2Y$S5R+<dkU-P{4S+wW
zgm9vUg9UQf#&`j85XClsfWIU-oh%Y@);$KD2psEYXiy<fz6{qe3fg2Ng>$>}7?&*t
zbrdg8Y4912o+iNLh&3c1B0d{X<VZ9Ni6aLYVXOO`Rs99OW-vwtzhtr5lt8ylkT$?%
z6EOeAT`mw<P}Y;>3DmxngVDpoM;#EUIPb+20;Tc at 8unjtq;<pYv<07ri6W}FQ;=@i
z=&}G=9>#Kg6Z|1$s~{tl9|;qYzbMy7I|HYL4%r%kxrE4~jx~ym=m7X$Z|pgr!Rao)
zv&1Q_K|CNq*4ZOmbvPeYk}!r-kOCI5hnU>hZ&cI*Ln9EK4qIU3j=ncu-2E^&;|5Z}
zRi3xOARIX5Oma$H$6tHVu(zJO>;tyJxG%szU^H-(9O1?BcQbO%JqZh21u4XKQp7(-
zC1QU1?x}LiEY3_CFm=k%P|LSz+<<^(1z?H!Mi3GiyC2t<-$tDF+m0hFcLlHkONfI#
zUIG33C$1f|gvP!s8=S9mu8)+TeK(J!kpgA=fweT{zXHWRr}y|q3HJox;46`J&Ub=Z
zw;&OO&$NrdkVKI;!+a+IA|L)zQnG&Lfo at K2Tdj`gSM;wOPp21Cqxe&GHnoa<>qp7a
zex)aoBpl4RJKmrKt+;b)E~j{5<4|wCa6 at b>*YfGj7qH~!WCA931IC}?vl`hjrP41@
zC?xbHL2q0josK3?WGp%X+eq+lFE!Y*7Nd}Ug3Wz5FwnGQs3vyBa?umo`T)9mS9snA
zJbA&4n?>l|T=`5Gt2(|+ho1f<sLJHLRX%9 at 2l}v>_G6xl&f&-G>|Y0VO5`z_FNefi
zW=mwPcKuP+epiOc+qxBI!v!IY=oF<4`lCC%ik6u|yBrqYZJZwtfg4w3?pq+$eP?y{
z5%@vp_ntwieD;$jTOU?wEm}d_v8*Mzcq-{R!{4yedWt-n^+Y-G-mF#ZxyyuzB{(g#
z`VS`AY$In(RT%YqY*z;5xYjg{<EkTQa-l;njWZk(jL8t-;TU=&THn%xTBR#T2lAc$
zdk2s(It&XD)rJ?k7r79e9GN&Wby(LI6c<0N<_esB>}`c!Cfg-D-F}b-;fp`gvuN?+
z6Xzi at jFt&)?0MJ;n(hu1Vs$pYv_$cseN#n7T`ezJ-JTP5_{$s?ii#b?c5Zim464RT
zETV)R0XmH)?>a(SqWD`kCC>cEp)Ox|wnUxA+5Eh`o#SG2hlP+^&V{ScW68H$cg`-n
zEMb-SPJ?Pju>HCl0xX&V<a70T;e0}!r1!@kf57p+Gu#6yWHW$>Z?u;3ETgggno#8y
z;Tlclonww5ZK4^ysA|6%4#ml#T}1PyulLgI4%g##DPvfBd{R;s4 at opRz$!a9dN%b9
zh|2aTO*l%!lmf^}I4S7E*0}_klKTCf75MC5fdbUqgfMv6vJx|xn58j}r4Zu at Y{j%e
zWVyh53(<ua$bJoPS#ltz5oBd$=2dAl_frL#`ud~8Y_(G}hNyA_f#VENhyfN&)U&U<
zyI<h1dhSM(m{%9(xb}rVDCE`tiXuZPNW7 at 64WEW;i3ehhvTu^N-BNE|mM|skP^$O)
zN$TI6cDjgj*&e{UK+BeNin}<4&<E1dtzu&P((K%V-ImWWiL9Us0}ZeD;?_w7F~Azr
z8yobK(}HUVnrD9PX>B#iS!F~%LsDGy at D11|RN!ej5yVCP9;0?_Jqk++uco+&44l)h
zHbGiSzF(M*A)4}7^dp86AXXr!l4PAkvPkA7*PgY0NMv-Rf%F-Pw}l8AFY(EGc)&48
z at 2z7{{A}Ub4gxTEC((c=H~#;HslY$qKMwIGzT1iCTSU~LL2VGY$YyWcK?j#KA$$o1
zAEp_RToe7_Ai*!&!Onz;?Y-x13jeqaO5~hCFr=G9ZuT at cSCML}{q7uJv9@~9VU*Aj
ztpStC9=<aI*<Jx;nSg&~#-nBCWDiyd6h7jFN09XbQY|RT(djgJhG#J)WuZKXUF<8H
z?Pdo^JK3iVj-X{4kFb2b7cDz+{VM+KboT at pGEyTPn~oVDg3l%f;sx2)_%`4WRSz*K
zCBh$GY+Cmj8A~ti5bTJjiJZhL8+63ERD{})(9lveX6U^lOwl2R{Z@$5x(B5-KTK~r
zO at UxgQ#5vT3_-Hx$^z*xSOL%sMRj+dhZuMd at ohoK3hEU)^>Lv`x_pxbl7mW6m$!!5
zZm6;;GaEO3=>IX3zL~b5fk7zJ%4cMEjq~Ljc+{;v*KUjqIDWR?X>qBWYiZodz2+cj
zo~sz!g1N_3b>krB2Tub}su*2%VZ%HQ;w+w#A!`5nDm#7Cx at oTu8cj=Y_$*eAZPsvJ
zFdQz8g`%+e3wF|m=)ewaPNgAU{5lAoYBY!diD*rfAJVq{0+hZA4G{C5Z4hvUS?T8?
zI7g at DiUx4E0r0cArwo6T(}F!0K<$Z?ad?pX<KhRfW^10OlbH{;T32E|zZLsf4 at To^
z%<&rXmEp2L6C6c^NLxFKp8dgPp`oGvg01Xuwi||(fVrWiI&uNd-ZS;u(J^OF|5%l>
z?YhI+O-5D-XNlFbQ}XAKfki=!B1(pBFtw~jxhdE~mi@#I+=u?f>Ld}rgjan(O82){
zzUdl%a~~j8(a2C&Qt at F#&Uc9!!fclF`!ICpF)HcMv7I2G#b`0Th}cccCL|edtIQKu
z>m?1>JDRPyWE~W5GQUsO&SN-f-|?A-R*8B;G`G(Z at U-?2>JfKUFi;BGfNiv%3)Ww;
zimjQ0#a{lyJ7G2}OgUsHOgIC%ezIcHMwv?ne6nz)R<IhWH;gePEyXs@)B`J!1kWa0
zGu`#a at ClnX{TK`t<ysn;4*!pnm_fj0`0C`s?SS?RoUl4d9*-iQxxM}LC(&-?{ZhBQ
zhTPM+EHr^x-Rtdx9a>|u4(v*rh%?;9dp)vWzis7g*4t+fmX=RDu6_1eP~$Z$&stwC
z^KBJmTtu at YJO)7*zecB=!W<SEJLfoIE?!og$FM*{(}EStkKD4nWHS52TPJ{xp<{xG
z4?T(bVE?Q{g&dw$HdHWBx^-%cxQXUlsfCqmonutLua3P;?ya{082Js7LHL=w637mS
zlc(S`{oVJ!FH2l@#}k4CeXG=87;{_BRkzBOlBZP!&&fH1$j#Mbcn#*4qIG;&r)gV0
z<_Q{Tav`tWPNagb%0IXyW~>HQ8_L#6<j%*V_}){4LW*#Ms;Nt>ZO<x01K at U<dCKR9
z>EN}5*?uRyr`xdk+tXWRL$=GgqjconN{KFwyPV>aDlC}zPhQtQ#P>{YN1k>PAi_X1
zIV_X$lJ-R>bM8%;bJNs0QyZK#5dBt?n*3*@y9BGFZvU at USXduuVZEr9hAV%8vme5b
z!)fQ3j<BxyqEx4#dEJ(OA7{^9d5!ZNe<ITM at 1kgMXpPWlzfdP&`(K{6T{&*b9?oXl
zaQ3?L=~JhS&>5QF22*@;tYrtdViSTakE%P)(msp>p-jhHC><zL>lYhXXpKMurCZiW
zbvtsRne~o_d2qA3pC{Fa_(&dx=6!vD)y3k_h>irpAN(Ftd=3jxd5S<(LErgdODT!B
z5wOK_XZE3TYz7`^{WA<lCXs;3hGsJKo}bjN<|pCS83#bd<m_7?*^azE0_y*P=GvR!
zp`-{`oyDpmI_mXagk4?<i84>cv`idDL9mtZf2|p*@i|L=RQW+*tkj}h=Fv!%$Iq+C
z&J-&;G5#|WGR3Sds7_9&b#2|*DL9+e at eELPGpdI9ZAkG5jgw;aVeqUf0uN^?6YgA=
zAp>7Au(qHVZ9xaK5SaFS!3JxKhi5uWRFq_Rl2h!O at l@g=e!1QYFd7t@!dge0+1}9q
zV%h)zOt~RsM?20|XGD&T;gBMtI9A#DiWcY$P at +hZ&&T7DX)XyR+XOqVVd;~)<E#;!
zgx;`*&FH)V&91bq4JR7c_16^t;ZAw;h;$a+Hx9r8o0MhC=X!U=hh6RwH(77Y-V6LR
zpsWn+TY2IP%MAfOC6he+z-uq=qUm~Fna<R>k^6?h*|t^Ch1wV)yy>J3^;|8vK3|^Z
z7%_XBva=;t5bQxnnNf(CRjAgqQiSc at 06ynK9dDbjDJ{YF?H7t<k%AP#eYaOU1ehm3
zsJE*cyUf<^Gt}s0b?wnNk5OrW6l*y!EaOr#5D_nbXc{)*BKWPX4QZxvX|TV)f7M^F
z^|cxO?yqD{kjtU;!A_Y==hAxBp6eP$?{WJ_7u)t=*3t_kFg!Da(@-++-9%CmhH9?<
ziw*iJfN}(@oC2JrERcf at u$W6=(h<5b7P$C@)6PH{w~j;_?mDi)E&~o!6K6}_aEsp9
zIU};*BRBXEqt~<JYRxb-4>RU7t<B&qinM^-u_1h_d9H*PzL}4mfi%e;YZbMluo+Oe
z#~xmFEDTETHcCM#DCot>+_=%*499Vr6<S{RUXvYH_Xci at Isf^J072c&Dg){7OPmv4
z7gt|4?&Y7>`7W1hq1hu{y_^Fwe1WDaQ^BaZx;n?63&;=0Qy&=Hfl?ZZND03(ntED*
z)>uVwSTjzmflsxH at HN}tWj^B;=xpc=`oQP)n{^wZ&X|&Sx3L!$zR*a^S)M8=$+OCQ
zVqL1B^=ESOlRh~pBp!>FXlPyW%JAfUaC?s9Y5c%^Gh*I>$7cFhZ8 at 5OHD7H2^KLUs
z$Ea)RZ{M$2PN~*{xG5GhzhaOzYctc}q$CCT)gU at Wo$4-Dn%I&_c at 3LYDj#3gecaEl
z+-~mogyLtMl+58z*o at NHjQ8Px#k+B1)<Y+-Bs9}A4OV0p_41FkwK at mI>+nNy3AKy4
zvywUT9@<xA?4U4K(-JK<1lZ`!H;V_e7A&9<-I3_+XfsE#Pn)m^F9<50czwhete7Uv
z`_uOFa9S|&dR=Lj9=2iKU^4O%*#BPG^=s)7#^{zWnQUoy?%#igL{vPE2~WbuvAhoB
z_9vx+I|_$$GA<=<U4fiG0aSM~WCCyQ<BueCsKRlwQiqGQ{b<jr(0^bao1OH>)h=OX
zNh({ZgW4ApcIWyiBi2oLlVea<=J7#p!&^crm$56iJ)P at F&6UtLbixUj!Tdf<zl)Iu
z{_TUyK}vz{C7*- at 9FIzXaU>0Ho%^ndXY3}<i{!v<SO_SE;pf}ajYxcSv}cn=&{brP
zjXoEr-6*MfhBOPt*!yD2Fbds2reg#yyWxNoeGR&w%8FJ7HbJQu>^wT4ttW(W>J<<l
z4^%E^)NN47VoN&<MQnk|Ze8cP*K+8*R4g*3!1D&Ub3?Lz9sWTbBoI>eQLRj^BH-p{
zFr<f0=64mpf;$^0?!Vb#k6Vp>Ug!x+bp&xat&10zuUK_~o6WZWwvOI5d1YnWCTr49
zf;Wd2;F1Cfm#90;>x-2uVEw1tByy)5Ni9u{=P3Qm(oHYMVkb!YdarEo!F`=$wVSsf
z at v|L_PXYfBT%Wg|BMcXzOOk>eY=+D~ojJTZd~7n=TsYUPT}yqvu&ym*MHCj1)R at 3I
z- at Y?@qdII-s7mk`w>D05U+*lXXBG5Wizj`*&Dh0(fZ=6{pI_%IzYUrQq4`IIt9xA$
z9-7eK$z^gJvFYq?k$syP^;a4=>0!5~%QxI25KOFkx!teE+Rsa=jgB)+DMTy9X0z4%
zDIF2A+{^nfzuG$%__^&5hi!t4R?7k<kuyM<SHj-AtSVS|t{k~OBts#D)<IJiw{th|
z6`A1iee|VjtuZ?@r`_8S6ISM%X%7v97|^dskno~FQegGKD^ko!8n*nvqrPE@#{udg
z132s<&GZ8%y&d(Ab|U3xujKdE=cAf36z}_ib5Kby1VeCeD2m6)fF(R-Y`LDZbY&-b
zQ=?tS3uQ(308ZZN!y*eA{RtCy&@z{Mba)B2gfxN#O at 6Qj#7t$KF{!6)$5<t=_9JBx
z37RdmWz_E9aGG|0iEyqustX$<e#*iIuiCya+T at s7qW5JZjGp12`Znv#Xg(mN9jM3)
z8qt&x#9?)ik~l4=hPpalA)$hsc4y^q*D!y61Y(U2QyQ%=H_Sc!VR8iHFw;4g-AMZ3
zx~jX}D*u8+1aqL}SHn%BRbeEUMNBMth{D?PiJz{0_WoxKcJ|wIv};=<zdn2RO#0wd
zO#p_i%Q3}*26)n}SHcMJSV<KQZ~a%qtA?~#m^lz9BqT)BYY0R|J#2j;ebk2TQ>5~7
zwH4;_<s>v}O&@iWDE}dZGg8<r!FbyW<;_Q)XLOsqCUXOHbjs82$dhLxv*CywD_43)
zFe*!&VOB;W0SC#yc-M=JTS&z({0Y4WnfG0{d6iy?14#>&WA|PG2HULKsZ5w2WOkS7
z=Phfz`UdCE==vQy)NIQwuM;B~;0gf~)RLw4E)WaRHxi;!QaXSRY)th2eZgK;d*2^E
zbcmz$-o~nQBn$b-BeJ`9TfEkPx at EI&>i37Rr8z{;R;e-j+y^vrx>oU5_vf$+;O^DY
z72_-&6OYb?2cly7qvZm6^1aO3%>=Znqe;P8iV9qp29D0RZ9H}AR5<aZxl$P&&S|Nc
zTLsT50TiGX*_TnQ_PQaHg6CXVS7Sswrpybye}Z`<(Q68g)q?45%we}-pY)*EX}`o<
zTJn=G^>eMZ1*yB&t_*;8GlKv8Hdf4>DOHcE=ZEltatce~nlGcsTFdS<jG?T2_pl8@
z_Z+599$3El%FsQVE?OwDtZ6&Hf9$dN=Hy%DfKD1Z`~fhMou=;R2L4g|R535q;b_f@
zEB>+q&BGXV6!oSuJ-FMSR{+c^1PcyB1tY^>clpVfPf4rGF;V1kpVKP71^m{mhnvyA
z0mJI`>UrnhCGyy96P$IBh!%ujd_U=NUpgJ?v4p{{ur6yJT|=jlqaq8d*4E{<Ru!t}
z-RuEO+ncCtM`6>uL^A{lgnrBA%>eM`o1uL9q!|J&RxY#m67Pl$nQ;}Zk;;|DnCq|<
z`u>L_pLAGA-l%=}t_%KY+A5n_H6B?3_kmqXjdT|f;Qr1E#HFt|;ny at dk4fiCcHMqw
zvTTcP6p`G^wvD*Hnj&NCz2+V~C71kNJ2fS54o<nPW;7gGvu{rRR@}<%IhQrjjg}ti
zK3pIZ0V-5ZblPx}Bj?}Dqk7K8^WOK(O40(NmsJLn!P2-9N}T?6KNas#b0Pdj%sVqG
z@<2q(ag9u*R0#ar&Zl+gH at 3DY4h$&7gb^nS1Xqc;d=Myc8V>fBS#UN8%=_aHRUl+e
zOTTU$ZnLv$KqxPQ9k$-}Uce5t(3tTscGyMO?mH8J at kjJ$+|65-1$?&Ga&d;OqqW-~
zg_f6e8rcl1W(UBnO;9hbwaDq66K-fp?d5740J8xxZ>w2_@}uX{<`=d^ZINl2(d=-w
z9LX at Vwrcq+KG!E>n;*;>+xwPNdR&f~J|E5m-+WU{Q1&a$d<H|)-o$+D!xmIU12>l5
zVI|hiFX%;krxHa=mg%oT4DULF$|JNOo9yYjBa1aw!HN`JszB+e;j?uXcvp~mnt+u#
zzYTAj{5d&GZ-K)P%>(cD?VZWJt*xeT1zq-c(jP$;$6o<U=iWHQF-wzqPnL7}cWd25
zq;P7mox0vj*0fd<xdX<g8HqfiSc4Z0m<tWZSb6<91L7*NuhNF2R)x3UP4BF4Y)?gp
z_H&yV4uDhQ*VI5$P(!uAf8wnI0KG5(-iqyOFd-+LggaUdS^{txkt;)oR`S?e2jq at y
zz0(YEQ%cKg at 8hX%Ufzd at d+(z4APk;%yfNAIon`Jf++~+ij5yz2cvxAC!vrLeVranv
z1!tXy6JIl|^uy$a at Z6M!=Iq3Ar<s1xIU2mxPrkxS7<wJ`!W$N%dlbB!9Ipy`k^32;
zWEp6d0Ca^OwPo61#@KP~g at G%UPfq}%6`<Rg%d*eEl^*z?QNx0aVw-Bhk}e=XdEdX^
z^ko#+!necQGe)LXZ>BUe!9s5--=X&pM^Hy;AntZaZB>LF3=OgY80)8Nu`{HCKr%>!
z5_(gR0w5y_m0e&;S8)9`s?%ngMPL8Uy+ntFo~nk8O|P{X*@Z%Z>9{l}3`;g;4JIn%
za7B;^;|Lx?60X#qkyH$%E(-a+cw8(7b>lEU$FINxCwE&T2^2Aq+cb3y&6_?)Pv_)R
zYi)hzg at -8R5avAP9Dq;LU_g&X0rJA8nTjI-!3Ny^HksI`!^*(0gu$9Fs5+y0+R(5C
z-Po;8 at NQvQrN}so>CJ4mF7^wtp4KC^n}tmI35Ez2OijLzw_^;ZRA at e|;Xiyb>X?em
zJqd-z8AyIY^KqO}AF&V^Z=FU+Q&ZD1i0A11L3kTy0b%Frloppb+R#)`Y2+A^2_kdl
z^c;U(g9<$y+{$DhiSL-A^Db@#caFvChH-Mc!8{mholiMPVz+e;{!wRgP|~@<BCBjE
z3Ud*i;q|bWLc<_c!HE`Yx7<7Ez{3!-lYBOQkp!w9+6G{vh-~tq)B1 at 5`wNPuE2DYR
z>>O#ynbVsSGh(`SBauK^pg*XMejvI<G04{f^7fPTK#1x?dW0}4&UhKv&z;Hk_J-x9
zF)=_bFvWR7Kn1Ey8WO6tHy^5<aO44 at CX2}N7z at GNu+y*0`T at fEz)=wug!49_L5Hw8
zFbud!TTcWi07c-?bY(O}=qyQC^UtOk)qB7)o+qD)vs9p60)>$g-1SyxH`Rh%yc1CE
z3G~<(Wa7ZNjgLlT|8pN2lGsM`PojRx1is{kQ?#5H))nu1aX4G^DS+y$`t-okFflx9
zBYIF+zt=6{*uQq|+IOPpjQqmcxC-rFAv7D>o-1MQ^li`#ulHh<a9xWNmR8W2Osv}a
zNIm{|*oH8jndMwy_W3q8LE{`eqys%|{gAZ*-d~b|7zFtBL)~Guq&9`PHuO)dOHxuN
z_q+nikv9v<-k*`ELddOByP3RJyZUX5EA}H%s2CgwOoGYvq9sebVg<0DU#+`!|9{n7
zd_6ZUF?0I2#Oh-<A<H3-kJla&#QYGVVbvmE6DEt>Kq-gfzm%0lz&AXB(RJDPwx7QF
z3tMaz0t(Zt4;e{H;Bgd|p+lp1x{`zU>0~VpDXJCJ^O(0{d7ZoEr5>E~C;!?`RaLxG
zV#_Bnc%vTIZAwSfp5JbXcB~tcsulF`KwTPJLDFj21)70o`zIN`_OdEWsJpk1#N&`l
zijE{uqTc26nKiyN=DoAUW^0n_>|1#)HueQIfh&~HpYOIFgD1r|>L%Vs_PdhGbcnxi
zW7)65YZpel=*JEV6lP>7;@363`TNgf|L#ySdw<L$z*uAs%k@|KrQ^U&JB7FAw*APH
zC0lLZwm!7wc0!Rlr|v`U*12oZPA0gXIdgT)AW9>v3PW_2Hdh&%xAH<{J;q at Hv`=V6
zb_ExgxhVw2k3-C8*Wbq at lg1KSo8LC=*OmC=D>9LKb@^PoEKyz$_B_R=)7l-Hh|yrt
zDa}zFa8fzjm-pReqTjgxZAJ2a^yzg5rSjZl5SDwyTXK-hb#e_jxc#FydtA%Ae#{rS
zr4_&O19!KWrNA;ny)T);sx*pRhPO22p(*zUlOF=wFOob07E$Drcv<aIQ)qzsH|$Po
z8KyiQSE2^Ba9n3Q%@T4Jt^8I{K;EHGpF9zj>;pfYJp8zNhG1Uy6P|$9Mq at xed+>zp
z3k`X2*j_LA5bL5}A8Dfa0O_3MmaDF=%@m{nZkm<Ilp~w#M`*nW{FDj$8uzv9*Bc|b
zokjm6l3q^2med|c&$v;rp9)-Bx at d#SZ!Ul=4pa>+NPijUG-3k-Pf{2Z!2TswC0SNS
zx6uSyQn_%&b~^&_qNZQO;V}38Wi!2SuKt8bO%-jj3e|P at w*+sJ2lcZVrM*YN_bgUz
z8<8*(OE^klhVl%Dl|$fa=r(CM9l at Q!lxq;C;xW`~OO77k2(m9<ZfMJ%VK|u_0pADR
zj%qM~TnSHBU?@vCscrAfHNfdgF_GkM5b%d6I>$==SkTxa`zCL&^OgC7wEbKA at YnX;
z4ol$PM^s|G&92>>?7)ofzlH>Dd at 3SX*ZZ%4-Z+b9$Ws%I*uj8Ro}s5^PA%+5h!o9Z
zBk5yd2=C1LHXx`yr6#dWAR1skUwpY6R~&?S4 at d$EP|Y6MgBs{5K%jS_T_>G?!p6^Q
z9f(^rqodby<xq)bDh*1bmZqEo@|teEZV05`w{b9&v2eO^WZ#>=4;wiG at 2W1++1VF2
zj5{1J(!q4X-XmdSIC?!dX at EFa^-_vNorxK&uHE=Cs<|->_FG$vDGD1JoCTc72n35w
zkZJlIs+o-^_JLK)Jtjnhl!GKR$<;WEtqmUd1fCs(ZGA(2NNj+4ayC?s!Lic@#9Jb<
zGlsd|sv^fW$PbQ2kZZwmJ%1(uLrX|BT<)^aW%t~7m)CnQ@&?HG5JXZF6s*MY%I^&T
zcMcVVF+hgWM9aqrNs)+NIy#%Bpb`LUoy5z)(w4$K9Sa4s9#8l-905rI&@BW>8co%2
zuMj;H+lHjk^jz`Vijm1hA at qgAH{O at Es@NZ)wMmB+;?#Q|mMdaaGdtIgo=aVwNbVM3
z8~72RL9$iOnaeJqe4^rh9tLt_eZQ`-bVQ(SB*`Wvy2LvI5(+<n2uN;0;zb>!O^_xa
zPO96<4Hj6%Yl(B0(2uTsZriT=;ll^=wizegS^kT3N8$wPgtQDvpoI^}I*iCaNaKJ5
z#G<v0p)~`MOi$Qu(}eS6m_E}Z0LI*m&EISP+N9*dL_NQDOa%NN08iNuN2roud2oYA
zH3+zxrom8tg@&LvqMSAEjEIHEI5lz3)3igq%svGo`Vhy7bOy)}Y_cqm-m946l0JLh
zJaycynam54<|jkHV)mI~q6o6U!)S1=NU}cf%<!#r4hu$g`-<guD4y)O^0VeuozQ03
z?Z+d5!|r-y{-vDj5oQS at a_i%@dyi4mPyKYip#^fvmfh};!=D(ljIsH at f-KHi3b&_l
z0FkRe at 1(DB^6A1tr~*!w23IZpXX0;N(os9}7!hF%C(=2iSOgobTY2L@!C=HZp#S&=
z1m91&x#x{Ad}z#E4xDQGnoe at G%ipg4u>`i0j at Nt9#~_bu*9l!Ic(KQ6=vO520b}e{
z+JjinW`q9e7+NOaJA2}n#L@@ozv(H~qTW4vWoV)IV7=RI1GSdEW^WJmo}$8Y_3Bk4
zB&8UQ94|5XqnFvirQ5Xy5D0aZfXbSUGY#=G)3 at Pg78b&*AROzk1(E*WKg2;lv>pft
z%npd{OY_Khkz1mXV3Rc=WtE)*j-hM at nI;jj#}+(Ye5qvM at x$a449AXXx&JeY9&U2{
zcYyBr-!S_Ai*M)2WdT%ymf{Hj&vB0GLabAp{VvM^j%fg*kCT{zv4`M}mU6y*MnMFL
zUjqIv;|73l{M}l1&{9z}mvCYo^xr`HfXH>ApfY%>5<{mjQdhqR0L at z1p^P|p2n6#9
zzALghift9!^zR}G=0!RI!lw&^gnQWfWt?)J=ZE_(iMqsE;qr9G+!YU?l%PR2<6Z}r
z4225FW5{f+Vw-j*C+lo8YWoBUJok<z^g?K^E%>vtX+E2^G?3lLOU%$GV}bF(&uS34
z1{5&ZR^1Ancv1fwQsjT}2>+8q`Tu|W|B7Au|CJ|$*4yM3%t%5{6`Y*!O<icF-&u#n
zdVsQCCnX%Y=4k^4v31iroN>f%B`x;&SB5s&HK+^1;11|9gqd}2%LI<-AK%0<AfeFs
zSI0?!<HXZW8zi#h-ZP9kSBc*<^JEerRuTr}^Vsb1<Hy!$xS*4+6*xOX&+_`@RJdxI
z!9?@cFT}OMjX?edXUC%7gkP7CIl#V<_U$j*9yGUFLXi(D2Kt)rLb_&1o6OA)qqzZW
zK at nF0B}(<Nf02l%yI^LL0+OP$CIP6cRZM3(f<Q6;<BWwo<Xv3ca{u6rj?IXf6MsAP
zJ#t6uGP8tiA5UFm5-^*Xa?SNz{^n|a4zr1Gk#&J6 at g{bB<2Mrt>*hVU+HLNl6aS6J
zB~e^yE~G1ISrBlHf5|eaj;44F{3<N=8Hk54rDQ=SvW^8o#Q4|L14vS#c=giO>jE at 0
zz&p>ygwzrf|4~u5-~(h6gS>yZn4pz5 at wW^0!Gnn;tpM18Kaw0+N&BgxGVdAV?C;0A
zP#@(&4=l~^NoSpS=Hm1(KJ}E3QO~)Ms^XD+zca(-{l6|%7Oe))1Ac-u=2+Vdyp8)b
zNaN(D2l}M08UNy8prwBVw40<Dw-1M=IQ;uE3*!quVU%4sc)~kFr%VvM at goZZiJAq5
zFAfh`l^igbfkdGDr$(ADKqNN%r(Qk=a)L1UA7S}IlNaA{6VN?!j6CAh9|?uLgQj8^
zG$vtkFMZk3>>X;QrJQ8!GJ)3xX}PGZKt-QY%h*NDQKHOtI&x03&a2g_8vZOaFXNc&
zaj+}2C?Bm*b$LJv5x?0i0sqOfb^3D}(}Xk$2LjLUWhk2g_rm80*8jR+M#kd*k|{ra
z!T-;s{)H-}J;LXCaG`f)lQr{PJosJ(RTYT;C7ko5X$EiJ at hLZdFIrIE{|7;77BA2$
z at 8c_yq`_b~ZmY<Uo$`N3a4??U(0$Fa!F5wEPlgZ3JIU1MfV{jaz!-q1=&tY~X>9`R
zMuUQ^k>)H5mvpv9+Xw?zv|xSm4f(1Mx^id%W8gP0l1hN?qyQ at dF(ss-Q-mgE0WXb1
z-(Um`NXpRBs!{{xiZXP3BAHpkU|%V=ArY7gCG&tKRq-1N&;s>=2RTS3v}Eas1+F~K
zu{SHz0O3M6o4Dj7z?n!CLLNoX5;p-4qZ>dxBm)`X at pMs?>7v1eGGTM<sU)Nwa#a_H
zqDfncAoLTJLo!r(RI#HPZw6qXfuLIS^0dM=*FjdLk at J9v6%)#;Zn*zZQA-1!Xs9Ci
zkzk=Kq8iXd(odiqDh)_0KLy{J0b}l7mgJ_0F30NrD~|*o$?j2ozhdpzBf^>bJ2nZv
zu>ND^3ym9 at f2}p&5r5`zncZT)@XZZ7ZtQnZERXn}$@c7+ at TM=DSX$mU6_);Uj(u9V
z%gb<qm*rL5Tq6&ywg_1 at u9<dGrZHFEk>wOJl;Ln)COD}pjozoqG;mdyE>d-LbPOJh
zM?_KByGM}<59N6G%a^B~W|b%1Oi4*GmO2&-u#=olBW!#2V8CiaIx3{cRv->|gHLuu
zO%u3*59+THZ9ggbzy4AgIePNM39cZokdRnNwB*i!B2rRy_sW$k7-JJr*U+$17ygc#
zKA at 0&C at Lz77&?Q-^(U|d=RSKF7pDd%X0?kzp7`_NWKgtv%>k4*K7eESFxc0%uuEm{
z-fJ(hLOzt0l|2$i5bON at 2ENYURt~H(SYV}5giKgHHUSLkth^ljf>7m<7*TQYV`>&i
z`@I4A at qvdW994`HZtos;J-sU9{FCy3(&J#btfXnONX%~ygP-n;M-Z90VZ(+`2rs8`
zg`Pn{I$K&U96EjaDJi|s3jvs$^=KPl!|nPRjH57=a4S6Jfq|M&@#!x?8RX;V7jj5@
z#JhOWqSb)868ig$<@2_r4<7;}O#t+7&qt5eL}p at +opPmJ?L4AMs%dC6NBqD(S<J;H
zNbVry;AzwPeKiITYcz^MHmw*asycP*)O8?AXl_>il#}BHBZ+MAG<X2M#u??Jj64O?
zB>H$cV>?f&-21v44+h at B*_n-o*^|`N@<-bsd?Bi232M1{nua$qVR`)a-(nY^LQlpM
zGU>y?xL^g~>R7`3JrP{OczT|wk&j8mynJ~`dZ<-s0JFH~#%5QdNZkwMcpV^e4G$$n
zMQ<{sf+Lt|#19;=i`m)Nk-!cBOiSKjRn^t#XZluG>)#3pS0_~`TDbf)l1)cW9iFn@
z_=y~J4NN~_?QB7hz!O)YCH4BzqurRvcnTYBXHmyGhx<ZOD5W<6V}IR$WsZaF<T;Tc
z3(rSS((iS5zgUmTauf1?AN-)bs)s+4>!TR-pd^N3cmtmO_V6`Bhjn!Y;jO;Y>0LF7
zwOFO}$2B!4{@ixrYHQ^iEnD}E&=~8G(Z{>ak{U?l7Oz;r3t~rdCjZSfKz+P$aDG=K
z<ICgo8j>Xqfm_qv!ueD9;^wtqCy(^4f2pe8h28YtS4kDG&9v at ga8MxF3+CmC^iDm4
zg9XR1*iL~cThrVeAufpbI at +HlQ#@cF2dlV_7tRh24mn^ztpQKg7g+ at c>i8m-+_-tu
zlOD8CK5#hG?@RJ~4S=yP=H?#zSw);=vK{oibB8A>DG5c*CS2P~$ff?6JGU_R71|IL
z${R81;}e9i>K=q6k;oYP+q1AxjgOc2j;H71?A%;$h=B&ctbBr96LAtYWPDiHMe2vu
z5eL2T4hJwibsYjGP*?1P{m?+bCQSmXXZ28DyB{P*Cg$q`{QNeeF_;$90=H8m=@M2=
z%^K8Tet35WkZXE-dw;~LS_jky-NE-?zyA7~gw@#z$hIZohkUQJVbOgs_Uh{ErItAW
ziCBkW?MN~Bu-Fc1YYPkv3;^_4156AS0f!s{o=Ttk9`S2 at H8a#DZv}*63WS2yl6166
zc;T-2%*GKza=(G>^!f7^u-T4;wR|nz5#MYAGmQfW4<3xafE~atA|g`s3;6QOhz$;p
z<IfluF+m1D)vK!u|F#<3w#_sR1;G9XUj^gw at q=D098e3P(5G1E5tAa0%F4<E7cZuL
z=%L8BXwg$NO%C9ESq#@(Z$Ce+9wB&-;FJ-J=pl3O2yKAqhf-5hcZlqPpYFN%T4g#b
zEUGG7%eA^haw{7Y-HJn>;W%<=t%7Nn2C}@(pYHqk^!ywp&rhWu_0vtE&vr~C;IeLZ
z#Vc8mJsd!{Ni9~wtaQh%uDZrXen5Tdp9|8R$HcWf9^JD at TmYktB<HcTy-73~zEs8L
z>{%7Wt>}oH;Cm*CV?P!+KNs~Yo+*eP`iqEAbW8ZSxVZd3kA3=dAhJ`cMA50A(g1a_
z(e5xAz6%#FXy^>dgWIhZy&i^+5t7Gb4r4KS<D9>B4x)Mf;NW1_9p!D7d4)#8<&hWd
zwjo?Teg6DQb2*?J6^wm7ao9=yXz5wQ$w17Q226gJb(1faQw~m9fxKE4OAy2(XVV)u
zuG7{B24MY?%Su~E2g%cBcw()+m4|sZo_N~#-!I*Jml_O*yxveO$DD%iHC<pA(s{Ds
zSA;^rkrPNkJwrk)7B84T-xqcJ-#D7o2T<zpK-DC4!x_zuN4z)pis5iuht|Z>1q&8L
z#*93H<yX<^n+OCOv2&NztFZ5-Ji^`-kpDMmU~hG%!nMbB^ZJt>Rt9e6<=TrDH9_cw
z&e;LrmeF~TfEir?l6zb5v%pH$#3G$>1kOyxl33O8M|FZg#W;X)()<F at vG`FBF&eLc
z3BR8rwozBt_{v4B1J}Y+7F3k|nz?w*8oZV5Km@()&@WR{Q#;~ai#&)ze^EJ^t`xax
zExL=?{1F0p#Tt--&cT{4va7 at xyy*=uaQGy_!g+5kn)_>L8Q&lpj_U$$bM?&xn``S;
z9_l%r2Y84VpizAKh7=#8$&ugRd65;7_2lBd-d<lk7acK-|5B^PjAiQ>E(L=7nz!Mx
zcv0i=J%;G4L5;EXkw6Nnw$+4>7S%#>e|j;vkUn749Ni&}6B<X<>BVDh7S8;-y1E+7
zt}oEPsf7$nqoQI3+V`}TX$oJ&Aevj5?ciYv$MmdLw}$@(d6d7f*H*`sLT0iN#C&_V
zx)}M%9l<a?kEwb^{otoR*)`3n%?}9u$2nV4^%tk()=QoWwnlSV4G#}LK~pt36Da*5
z;ov)W^cCc7!r<RigCwCxG`b4Li<kD+;^{=LbVgbm6;m%yoctT4<Z4JQ{&uXh9-qC;
zjcK3GHe*I}gkfR0YI3HOnqGrq{`IrHF24_0x44z&poYfr#U8VY#7W#*P}ZyAA%-)K
zDYcV_M^^YEt6Z!?tnF)LY+8g#U|3j~@i4Z)GB+8p66B+hvDP#;hD8QP5JSN0Uhx|(
zFLJaRJihPv at rQeBi&*iXEZ&HXjg7H~^%f6EbIF-E3q8b4DpQl16EvHrwk&I%K$Kkm
zh<3%w4l?@`DLe`lN`%6-?<P_WKb?|w>fY}2GHx#O+-_VY`21=>K!EWuqMJe1vZYI(
zncp0O3B}KddU<1$UYT-%!yY&=F at wbmd~r%nu-O&xtT5#C6M~h1Zo=q892xheHi9XH
z#+KRQg!<r%qSE~QIn9>VW_fY_LqjdcOe(p)Odgic at 0QwUuUW8jRs1!Lf`cvgy~jMn
zjwx9wfJL$g)WOp)hqF)xm_=k)?l37<WQs<wzbbG>8iN4UH}Uf;)xhL>k)fgCB3QN6
zs}BDdGa1q3*HD+2zky>$@{`34T;)+nxiPS%q9*LyW>sBX^Inc<gICeYUbd~@RWTIH
zs3$RbyI}*aYn5-yna7jpr~cab4IuzD8VWx6c6M~AxCLlAmsK`z+iy~`MB##+-Mt;<
zZl<ZFS2ig5OZJ%PreD+%)>TzK-cwLh{4pn|KwI-o1d>V0 at 1nGm4#j7i at +(~27ww?e
z^5z8Jo7y&~Jb}|Wp5pOt|5_)7{^qZDCPd~OkGXGZ(R1&liO^9qM<<g+W at hI~Ujd23
zOCUx59PAYkz%Mh>q-=7&i6?qva^$z<eA72!J!yJv7xJQhuvq3sX<;}1{X2{8Z7eNc
zh{Z-mMjDrwyZX`6do8&4VehLVjoKH|+mde>dm|?NiRKlIwqLwffYxbok)2X`f$wvs
z*el=4_1>*h=1oEatHi|pUmt-*nOUBen%a|<7FhB at 5m_A3p--O{UfdbIV5WW&_5{=B
zj|kANw9Q^sR8{H0M2Zg$C~w5Mn|^+N^i~4{19xPJN=URAYnVu7>n`bwTi<G(7lk&%
zyHdejBERG0&O;9VMSpLMia&SH!M>OtecKI3tt at 8!##3$AieGL36U7(e1(|wdF6jI`
zL8>{>bHsy7>J-eOzs2gwM4r>o&^U1P==~V`IF^uB`<XZG5W&7ObQ|0W0W*C)zlST5
zkHW5O*kFqT+&C3kk97o>RcB|X>B?9QO9rMgCDmoFd-4b#pZgK{RU+3P21$T(y!
zmNy%ue7rKWzdbbaSl|6(hYyGBv&w1%rA#J6ri*>!8H=sYit3POyyj~sLHbGyu;uW~
z0%>s8$@YqrjhL6Q^#;=Ta$irLH6-|U+5&@t!rj6Pp!~~P2d3yc($~FV4PX~oGap;G
z!)(7fkMGgg8)FZv-l&I@>$RCPdi_CTW4X8BgUSnE1m8ZO6NOAfCLk=eu;y(W!6 at oG
z5^dmw<l}tf`)TIp=HJjg_UcFKZT!%GW+BT5?4!RuJUm!|NIQ$AigR)ldZr0RF9;KO
zYMUyRSMthra$SYn;_y<deJ$AaU at r_@(7F%k<PtysmvAN0I&pOmF$gt_pay+$GU6Ak
z?A2`#4$H)^KL*9%$&bMdduW*g-kZJ|BQ`^UUA)6)@Hl}Nov&9=Q1C+jP|@?f>^~pk
zeiN}pTES0Z4$8{97&{^&Co^58!2~7C@^zKZ4sR?HE^SNVvI4Q-e7;-h;<X4SU#_-I
zoi<JB1Zd|k5g)^J6;Q!78$5}LiAlCvhERoa%ZyKfh7lCmfqxL=2$bRFQ;rn>SB8rw
z*Skvlc?_8r=32g7b1l;Wlwfr~%cKikp`c#MY388|8<7d{LbtK`#d~OEqPQ?>LRjo<
zwTpatR at VMke;7w2O}T+Aqk&&Ugn6gs`}mOQo>glx;I-(m^NHkLS7v;}OmeS&5PHHT
z8qo&cjC}RQQ-ME0p*D6zTB6Yy5f$Z)mU2Mzi!d>VWxwl-o`YyQJw<uE;TI0p;)Vu)
zDzA$A;WGFXi#b9YluG~4$>>yv9V|YXM+^cHndpOP<9hq}+<y;wlFpegF0cI-X=`h*
z!<eCU!T0a;r4QF{*{kXucFd!6!&9_VlhcxjT!Rw#?q^|g#~VL at Xt^MBFOJZrp(LP?
zm#BHX`HZ!ZelvsJ5_nOA{GMHElH=R!fi7TQZ~0cpyB9B87V2=+r&%#XT8HR6i<J)?
z at B|ics|&NDK4PUjee~#`I at -NYkPK6rck|}WQ^WngBIcbJCSBt&a)iTDux~l>my(@6
z$SgGt4F-$H;ElZ=iPozNLN$oC15m_lf?={jJ{rfd@&Zs at pkIBmNZ8BMa~-nO=WgEd
ztR&pQC*VDsKi&2B-;_S^*<$Xqtl);$qjHlaWuXGG3fwT*;3$NoTj<jXzvzu?M4M>~
z*l-$B at c0pjdNQJ<o&yS%QveG5l at l+*;nn&zmjVYQv1Ct%jTX_HimHLY1ocKi3=6d?
zIP$Xqu+cz{-smHHSm0YPUbs-d$2AoN<V!Swq4f6wMD(%!VxI(!e#~`0tQDfYrw&bO
zZ|C7!Zi6h8p;WWExG*3(NQh`?&V at e^z#PRIuur#x4=1mv7-chzbBC(>b3?sma^q{K
zShUz?5&{>d^LaaT4<&%9vR|Opb<b&g0YWvJ=h4XqSS297DgcC2bf=PMbfn!m2mUap
z5$(Uh8_3eu)(<tQJYFE#9KFQoP1L6vpQT`I78$Z3KEXZ?LB8&*!95(!cfq~;2xd1q
zgVGP5!H7?7oRx?LYr$IfBR#Stro(T0vO$uinLg-)X&JJB&&|&Xfc;Mp1F0@=BS%BK
zjR$YlkDRmvgM!w}$mk)v*h~p7vb`G~9#md7AFDhA`W6K?c?AUr0bLD^4OEF at 0JX*j
z<zNBqDViMnx0ja}Ug;-<t5eWwFJ8KIJygbyrlt_d?%BJyq`S}-i>e+zc6T5Q%CGwl
z#<<L{zCJ$yx%Z*@JCDQxXr3Udu5*wWmSFw}ATsIRw)v<d1DIL~eqs&{yyJU-A<Tp7
ze$gVBhlCXylTT;rn>R}ry%?--Z;x&9hmP?8TIbd}hg*t(6s(t!NXcU^fis-{7AUFj
zBvZS+#a1l{2#<!tXK<b6VsQ}<?1S*&bOuO+?QemIsL=>sLhyEIm*v`@M#Mq}byO`2
zA#Pqu1J-OT?sXGN-3?jLES~OZ=iR#XOM}0pl#~yMj%qze0F?#>3T*}!v!iu1>I~qH
zn}74BrKJ at GXOWjPz8+M<3icYk8|!D+{kOxW at 5bMMFWkTX<g#TQzkc0Ck}40Zw|TFW
zF_dxR8<H;zIO}PU4`--P7e>@YrMWh}|HBsJcy}=2KH+RL%d2f_;sfE`7x7`0O3^gX
z%6(~ceV^UTnKK8_JDum?T#^$grSPxgv~8ozzzs+6&K7fU3>U`yxp?s!JV2_$0y?Kp
zpZ*cziY at 4PMQHYfABAo=M$GujgG+GD(4#Jgozm8N01*I=y#VvxK%%``3|nav`pMp?
zm5)l&qw<5ni~N-tgQWqq*4FNK|HvPk`p6`8nXRoY#rC<YcIGy}aCdj_#Ar7iGRQPi
z>fLUbKYKE1c~IHa)8m7A8Df~*NuNwkmw1$@D%4IghfDG=Zh&UQ7konnfNN1JTN)cT
zqR=`AmG-Zmo at l=w$?UIRRZ$(UL1<ly551L%yfg>Qp;Is(5k9mej*NFH=75u!EdB8e
z1V?kZrL_^}))L+WI3ZH{qvhGNcaX_sL*MiS$mcQ-lW$LM3`6zc2l(nQ at XVuQFi@Ap
zqL%_#Y_Wxf#jVWqEyYSm(l&s0C49*1ueSV>SO4r%om+Zy)x;9G2?Xj_SJx75Zf at X2
zQElgp)sb4ZR-|acNT&`*4|E1gv-9))UcTIJX=CFH%<X1KNJuyQc5xIxg<%$e6qWX7
zbi!@{;e5O9B8Z+@{vp6~US8-jxZ&>ZOILUBpgXGCzkxyb4-Ck|^^8IXMM*2A=Q=pV
z1L4s#pF at -f2&|{C?*?eYJa+!m)7{OktgPGwrU at R`t at QNtRM0v!oI4H&p{iBD0ndRk
zT44UvV^a_|hU}-NrG*~>*b5x6zf at H2NMdN8s}3^|Fjfxguk|QS(SYLz=ya~VQVLt-
zE_lobFmvb>JoSJI9(mk8u(9M_V39CziEl4X?#KJ{q0U5?<nOhx at 5|XNF99=Hw7q!|
z_akp|FX3sf_+1_1&odtUn{F}Xcdd=)KjU{A{D1!2tDmiqxtPj(^F(Je#8YN|GZ?P_
z?_b3K?G`g$yq+_@&KNyfSXKz9#Wq0bf7;Y$&byWOyC^eO)71 at 5g{nPX2d!yg_umQW
zBD~M-aN8*rMDzHa-GvM44&}R05b_oMCR511`49?!!-=o|>GRJ}-7~6Hw)gjst1w5n
Y57^vgI}?YYNcfW9dvH(8ZvD&u7mW{&ZU6uP
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index 7f0e023832dc1..23df637018ca4 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -7408,9 +7408,9 @@ DenseMap<const SCEV *, Value *> LoopVectorizationPlanner::executePlan(
// Regions are dissolved after optimizing for VF and UF, which completely
// removes unneeded loop regions first.
VPlanTransforms::dissolveLoopRegions(BestVPlan);
- // Expand BranchOnMultiCond after dissolution, when latch has direct access
+ // Expand BranchOnTwoConds after dissolution, when latch has direct access
// to its successors.
- VPlanTransforms::expandBranchOnMultiCond(BestVPlan);
+ VPlanTransforms::expandBranchOnTwoConds(BestVPlan);
// Canonicalize EVL loops after regions are dissolved.
VPlanTransforms::canonicalizeEVLLoops(BestVPlan);
VPlanTransforms::materializeBackedgeTakenCount(BestVPlan, VectorPH);
diff --git a/llvm/lib/Transforms/Vectorize/VPlan.cpp b/llvm/lib/Transforms/Vectorize/VPlan.cpp
index 738b8086488a0..7603ec9600d08 100644
--- a/llvm/lib/Transforms/Vectorize/VPlan.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlan.cpp
@@ -595,13 +595,13 @@ static bool hasConditionalTerminator(const VPBasicBlock *VPBB) {
[[maybe_unused]] bool IsSwitch =
isa<VPInstruction>(R) &&
cast<VPInstruction>(R)->getOpcode() == Instruction::Switch;
- [[maybe_unused]] bool IsBranchOnMultiCond = match(R, m_BranchOnMultiCond());
+ [[maybe_unused]] bool IsBranchOnTwoConds = match(R, m_BranchOnTwoConds());
[[maybe_unused]] bool IsCondBranch =
isa<VPBranchOnMaskRecipe>(R) ||
match(R, m_CombineOr(m_BranchOnCond(), m_BranchOnCount()));
if (VPBB->getNumSuccessors() == 2 ||
(VPBB->isExiting() && !VPBB->getParent()->isReplicator())) {
- assert((IsCondBranch || IsSwitch || IsBranchOnMultiCond) &&
+ assert((IsCondBranch || IsSwitch || IsBranchOnTwoConds) &&
"block with multiple successors not terminated by "
"conditional branch nor switch recipe");
@@ -609,9 +609,9 @@ static bool hasConditionalTerminator(const VPBasicBlock *VPBB) {
}
if (VPBB->getNumSuccessors() > 2) {
- assert((IsSwitch || IsBranchOnMultiCond) &&
+ assert((IsSwitch || IsBranchOnTwoConds) &&
"block with more than 2 successors not terminated by "
- "a switch or branch-on-multi-cond recipe");
+ "a switch or branch-on-two-conds recipe");
return true;
}
diff --git a/llvm/lib/Transforms/Vectorize/VPlan.h b/llvm/lib/Transforms/Vectorize/VPlan.h
index 14a159bf893b2..e7660e7eb9931 100644
--- a/llvm/lib/Transforms/Vectorize/VPlan.h
+++ b/llvm/lib/Transforms/Vectorize/VPlan.h
@@ -1058,12 +1058,11 @@ class LLVM_ABI_FOR_TEST VPInstruction : public VPRecipeWithIRFlags,
// lowered to ICmp + BranchOnCond during VPlan to VPlan transformation.
BranchOnCount,
BranchOnCond,
- // Multi-way branch with N boolean condition operands and N+1 successors.
- // If condition i is true, branches to successor i; otherwise falls through
- // to check the next condition. If all conditions are false, branches to
- // the final successor. Expanded to a chain of BranchOnCond after region
- // dissolution.
- BranchOnMultiCond,
+ // Branch with 2 boolean condition operands and 3 successors. If condition
+ // 0 is true, branches to successor 0; if condition 1 is true, branches to
+ // successor 1; otherwise branches to successor 2. Expanded to a chain of
+ // BranchOnCond after region dissolution.
+ BranchOnTwoConds,
Broadcast,
/// Given operands of (the same) struct type, creates a struct of fixed-
/// width vectors each containing a struct field of all operands. The
@@ -1220,7 +1219,7 @@ class LLVM_ABI_FOR_TEST VPInstruction : public VPRecipeWithIRFlags,
case Instruction::Fence:
case Instruction::AtomicRMW:
case VPInstruction::BranchOnCond:
- case VPInstruction::BranchOnMultiCond:
+ case VPInstruction::BranchOnTwoConds:
case VPInstruction::BranchOnCount:
return false;
default:
diff --git a/llvm/lib/Transforms/Vectorize/VPlanAnalysis.cpp b/llvm/lib/Transforms/Vectorize/VPlanAnalysis.cpp
index 6b0b7f834e997..0a2bec427d9c8 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanAnalysis.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanAnalysis.cpp
@@ -136,7 +136,7 @@ Type *VPTypeAnalysis::inferScalarTypeForRecipe(const VPInstruction *R) {
// Return the type based on first operand.
return inferScalarType(R->getOperand(0));
case VPInstruction::BranchOnCond:
- case VPInstruction::BranchOnMultiCond:
+ case VPInstruction::BranchOnTwoConds:
case VPInstruction::BranchOnCount:
return Type::getVoidTy(Ctx);
default:
diff --git a/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h b/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
index 43173f6eef0cc..ebb227f58bcf5 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
+++ b/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
@@ -374,15 +374,15 @@ m_BranchOnCond(const Op0_t &Op0) {
return m_VPInstruction<VPInstruction::BranchOnCond>(Op0);
}
-inline VPInstruction_match<VPInstruction::BranchOnMultiCond>
-m_BranchOnMultiCond() {
- return m_VPInstruction<VPInstruction::BranchOnMultiCond>();
+inline VPInstruction_match<VPInstruction::BranchOnTwoConds>
+m_BranchOnTwoConds() {
+ return m_VPInstruction<VPInstruction::BranchOnTwoConds>();
}
template <typename Op0_t, typename Op1_t>
-inline VPInstruction_match<VPInstruction::BranchOnMultiCond, Op0_t, Op1_t>
-m_BranchOnMultiCond(const Op0_t &Op0, const Op1_t &Op1) {
- return m_VPInstruction<VPInstruction::BranchOnMultiCond>(Op0, Op1);
+inline VPInstruction_match<VPInstruction::BranchOnTwoConds, Op0_t, Op1_t>
+m_BranchOnTwoConds(const Op0_t &Op0, const Op1_t &Op1) {
+ return m_VPInstruction<VPInstruction::BranchOnTwoConds>(Op0, Op1);
}
template <typename Op0_t>
diff --git a/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp b/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
index 3b62058a22c1b..26faf4e0714d7 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
@@ -172,7 +172,7 @@ bool VPRecipeBase::mayHaveSideEffects() const {
return mayWriteToMemory() ||
VPI->getOpcode() == VPInstruction::BranchOnCount ||
VPI->getOpcode() == VPInstruction::BranchOnCond ||
- VPI->getOpcode() == VPInstruction::BranchOnMultiCond;
+ VPI->getOpcode() == VPInstruction::BranchOnTwoConds;
}
case VPWidenCallSC: {
Function *Fn = cast<VPWidenCallRecipe>(this)->getCalledScalarFunction();
@@ -454,6 +454,7 @@ unsigned VPInstruction::getNumOperandsForOpcode(unsigned Opcode) {
case Instruction::ExtractElement:
case Instruction::Store:
case VPInstruction::BranchOnCount:
+ case VPInstruction::BranchOnTwoConds:
case VPInstruction::ComputeReductionResult:
case VPInstruction::ExtractLane:
case VPInstruction::FirstOrderRecurrenceSplice:
@@ -474,7 +475,6 @@ unsigned VPInstruction::getNumOperandsForOpcode(unsigned Opcode) {
case Instruction::PHI:
case Instruction::Switch:
case VPInstruction::AnyOf:
- case VPInstruction::BranchOnMultiCond:
case VPInstruction::FirstActiveLane:
case VPInstruction::LastActiveLane:
case VPInstruction::SLPLoad:
@@ -501,7 +501,7 @@ bool VPInstruction::canGenerateScalarForFirstLane() const {
case Instruction::PHI:
case Instruction::Select:
case VPInstruction::BranchOnCond:
- case VPInstruction::BranchOnMultiCond:
+ case VPInstruction::BranchOnTwoConds:
case VPInstruction::BranchOnCount:
case VPInstruction::CalculateTripCountMinusVF:
case VPInstruction::CanonicalIVIncrementForPart:
@@ -659,8 +659,8 @@ Value *VPInstruction::generate(VPTransformState &State) {
applyMetadata(*Br);
return Br;
}
- case VPInstruction::BranchOnMultiCond:
- llvm_unreachable("BranchOnMultiCond should be expanded before execution");
+ case VPInstruction::BranchOnTwoConds:
+ llvm_unreachable("BranchOnTwoConds should be expanded before execution");
case VPInstruction::Broadcast: {
return Builder.CreateVectorSplat(
State.VF, State.get(getOperand(0), /*IsScalar*/ true), "broadcast");
@@ -1184,7 +1184,7 @@ bool VPInstruction::opcodeMayReadOrWriteFromMemory() const {
case Instruction::PHI:
case VPInstruction::AnyOf:
case VPInstruction::BranchOnCond:
- case VPInstruction::BranchOnMultiCond:
+ case VPInstruction::BranchOnTwoConds:
case VPInstruction::BranchOnCount:
case VPInstruction::Broadcast:
case VPInstruction::BuildStructVector:
@@ -1279,7 +1279,7 @@ bool VPInstruction::usesFirstPartOnly(const VPValue *Op) const {
return vputils::onlyFirstPartUsed(this);
case VPInstruction::BranchOnCount:
case VPInstruction::BranchOnCond:
- case VPInstruction::BranchOnMultiCond:
+ case VPInstruction::BranchOnTwoConds:
case VPInstruction::CanonicalIVIncrementForPart:
return true;
};
@@ -1323,8 +1323,8 @@ void VPInstruction::printRecipe(raw_ostream &O, const Twine &Indent,
case VPInstruction::BranchOnCond:
O << "branch-on-cond";
break;
- case VPInstruction::BranchOnMultiCond:
- O << "branch-on-multi-cond";
+ case VPInstruction::BranchOnTwoConds:
+ O << "branch-on-two-conds";
break;
case VPInstruction::CalculateTripCountMinusVF:
O << "TC > VF ? TC - VF : 0";
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index 9e1bba0d07178..8507a9bd68652 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -3714,57 +3714,51 @@ void VPlanTransforms::dissolveLoopRegions(VPlan &Plan) {
R->dissolveToCFGLoop();
}
-void VPlanTransforms::expandBranchOnMultiCond(VPlan &Plan) {
- // Expand BranchOnMultiCond instructions into explicit CFG with branching.
- // This must run after dissolveLoopRegions, when successors have been
- // restored.
- SmallVector<VPBasicBlock *> WorkList;
+void VPlanTransforms::expandBranchOnTwoConds(VPlan &Plan) {
+ // Expand BranchOnTwoConds instructions into explicit CFG with
+ // single-condition branches
+ SmallVector<VPInstruction *> WorkList;
for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
vp_depth_first_shallow(Plan.getEntry()))) {
- if (VPBB->empty())
- continue;
- if (match(&VPBB->back(), m_BranchOnMultiCond()))
- WorkList.push_back(VPBB);
- }
-
- for (VPBasicBlock *VPBB : WorkList) {
- auto *BMC = cast<VPInstruction>(&VPBB->back());
-
- unsigned NumConds = BMC->getNumOperands();
- assert(NumConds > 0 &&
- "BranchOnMultiCond must have at least one condition");
- DebugLoc DL = BMC->getDebugLoc();
+ assert((!isa<VPRegionBlock>(VPBB) ||
+ cast<VPRegionBlock>(VPBB)->isReplicator()) &&
+ "only replicating regions must remain");
+ if (!VPBB->empty() && match(&VPBB->back(), m_BranchOnTwoConds()))
+ WorkList.push_back(cast<VPInstruction>(&VPBB->back()));
+ }
+
+ for (VPInstruction *Br : WorkList) {
+ assert(Br->getNumOperands() == 2 &&
+ "BranchOnTwoConds must have exactly 2 conditions");
+ DebugLoc DL = Br->getDebugLoc();
+ VPBasicBlock *VPBB = Br->getParent();
const auto Successors = to_vector(VPBB->getSuccessors());
- assert(Successors.size() == NumConds + 1 &&
- "BranchOnMultiCond must have N operands and N+1 successors");
+ assert(Successors.size() == 3 &&
+ "BranchOnTwoConds must have exactly 3 successors");
- // Disconnect all successors.
for (VPBlockBase *Succ : Successors)
VPBlockUtils::disconnectBlocks(VPBB, Succ);
- // Create chain of conditional branches. Each condition branches to its
- // corresponding successor on true, and to the next condition block (or the
- // final successor) on false.
- VPBasicBlock *CurrentBlock = VPBB;
- for (const auto &[I, Cond] : enumerate(BMC->operands())) {
- VPBlockBase *TrueSucc = Successors[I];
- VPBlockBase *FalseSucc = Successors[NumConds];
- if (I + 1 != NumConds) {
- auto *FalseBlock = Plan.createVPBasicBlock(
- (Twine(VPBB->getName()) + ".multi.cond." + Twine(I + 1)).str());
- FalseBlock->setParent(VPBB->getParent());
- FalseSucc = FalseBlock;
- }
+ // Create an intermediate block for the second condition check.
+ auto *SecondCondBlock =
+ Plan.createVPBasicBlock((Twine(VPBB->getName()) + ".cond.1").str());
+ SecondCondBlock->setParent(VPBB->getParent());
- VPBuilder(CurrentBlock)
- .createNaryOp(VPInstruction::BranchOnCond, {Cond}, DL);
- VPBlockUtils::connectBlocks(CurrentBlock, TrueSucc);
- VPBlockUtils::connectBlocks(CurrentBlock, FalseSucc);
+ VPValue *Cond0 = Br->getOperand(0);
+ VPBlockBase *Succ0 = Successors[0];
+ VPBuilder(VPBB).createNaryOp(VPInstruction::BranchOnCond, {Cond0}, DL);
+ VPBlockUtils::connectBlocks(VPBB, Succ0);
+ VPBlockUtils::connectBlocks(VPBB, SecondCondBlock);
- CurrentBlock = cast<VPBasicBlock>(FalseSucc);
- }
+ VPValue *Cond1 = Br->getOperand(1);
+ VPBlockBase *Succ1 = Successors[1];
+ VPBlockBase *Succ2 = Successors[2];
+ VPBuilder(SecondCondBlock)
+ .createNaryOp(VPInstruction::BranchOnCond, {Cond1}, DL);
+ VPBlockUtils::connectBlocks(SecondCondBlock, Succ1);
+ VPBlockUtils::connectBlocks(SecondCondBlock, Succ2);
- BMC->eraseFromParent();
+ Br->eraseFromParent();
}
}
@@ -3897,7 +3891,7 @@ void VPlanTransforms::handleUncountableEarlyExit(VPBasicBlock *EarlyExitingVPBB,
VPlan &Plan,
VPBasicBlock *HeaderVPBB,
VPBasicBlock *LatchVPBB) {
- VPBlockBase *MiddleVPBB = LatchVPBB->getSuccessors()[0];
+ auto *MiddleVPBB = cast<VPBasicBlock>(LatchVPBB->getSuccessors()[0]);
if (!EarlyExitVPBB->getSinglePredecessor() &&
EarlyExitVPBB->getPredecessors()[1] == MiddleVPBB) {
assert(EarlyExitVPBB->getNumPredecessors() == 2 &&
@@ -3920,49 +3914,50 @@ void VPlanTransforms::handleUncountableEarlyExit(VPBasicBlock *EarlyExitingVPBB,
? CondOfEarlyExitingVPBB
: Builder.createNot(CondOfEarlyExitingVPBB);
- // Create a BranchOnMultiCond in the latch that branches to:
+ // Create a BranchOnTwoConds in the latch that branches to:
// [0] vector.early.exit, [1] middle block, [2] header (continue looping).
VPValue *IsEarlyExitTaken =
Builder.createNaryOp(VPInstruction::AnyOf, {CondToEarlyExit});
VPBasicBlock *VectorEarlyExitVPBB =
Plan.createVPBasicBlock("vector.early.exit");
- VectorEarlyExitVPBB->setParent(LatchVPBB->getParent());
+ VectorEarlyExitVPBB->setParent(EarlyExitVPBB->getParent());
// Update PHI operands: copy from EarlyExitingVPBB to VectorEarlyExitVPBB.
unsigned PredIdx = EarlyExitVPBB->getIndexForPredecessor(EarlyExitingVPBB);
VPBlockUtils::connectBlocks(VectorEarlyExitVPBB, EarlyExitVPBB);
VPBuilder EarlyExitB(VectorEarlyExitVPBB);
- VPBuilder MiddleBuilder(cast<VPBasicBlock>(MiddleVPBB));
+ VPBuilder MiddleBuilder(MiddleVPBB);
for (VPRecipeBase &R : EarlyExitVPBB->phis()) {
auto *ExitIRI = cast<VPIRPhi>(&R);
-
- // Move operand from EarlyExitingVPBB to VectorEarlyExitVPBB.
- VPValue *IncomingFromEarlyExit = ExitIRI->getOperand(PredIdx);
- ExitIRI->addOperand(IncomingFromEarlyExit);
- ExitIRI->removeIncomingValueFor(EarlyExitingVPBB);
-
- // Early exit operand is now at the last position.
- unsigned EarlyExitIdx = ExitIRI->getNumOperands() - 1;
+ VPValue *IncomingFromEarlyExiting = ExitIRI->getOperand(PredIdx);
if (ExitIRI->getNumOperands() != 1) {
- // The first operand corresponds to the latch exit via MiddleVPBB.
+ // Both loop exits go to the same block. Move the operand of ExitIRI
+ // coming from EarlyExitingVPBB to appear last.
+ ExitIRI->addOperand(IncomingFromEarlyExiting);
+ ExitIRI->removeIncomingValueFor(EarlyExitingVPBB);
ExitIRI->extractLastLaneOfLastPartOfFirstOperand(MiddleBuilder);
}
- if (!IncomingFromEarlyExit->isLiveIn()) {
+ if (!IncomingFromEarlyExiting->isLiveIn()) {
+ // Update the incoming value from the early exit.
VPValue *FirstActiveLane = EarlyExitB.createNaryOp(
VPInstruction::FirstActiveLane, {CondToEarlyExit},
DebugLoc::getUnknown(), "first.active.lane");
- IncomingFromEarlyExit = EarlyExitB.createNaryOp(
- VPInstruction::ExtractLane, {FirstActiveLane, IncomingFromEarlyExit},
- DebugLoc::getUnknown(), "early.exit.value");
- ExitIRI->setOperand(EarlyExitIdx, IncomingFromEarlyExit);
+ IncomingFromEarlyExiting =
+ EarlyExitB.createNaryOp(VPInstruction::ExtractLane,
+ {FirstActiveLane, IncomingFromEarlyExiting},
+ DebugLoc::getUnknown(), "early.exit.value");
+ unsigned EarlyExitIdx = ExitIRI->getNumOperands() - 1;
+ ExitIRI->setOperand(EarlyExitIdx, IncomingFromEarlyExiting);
}
}
- // Get the old latch terminator to extract the trip count condition.
+ // Replace the conditional branch controlling the latch exit from the vector
+ // loop with a multi-conditional branch exiting to vector early exit if the
+ // early exit has been taken, exiting to middle block if the original
+ // condition of the vector latch is true, otherwise continuing back to header.
auto *LatchExitingBranch = cast<VPInstruction>(LatchVPBB->getTerminator());
- // Skip single-iteration loop region
assert(LatchExitingBranch->getOpcode() == VPInstruction::BranchOnCount &&
"Unexpected terminator");
auto *IsLatchExitTaken =
@@ -3973,7 +3968,7 @@ void VPlanTransforms::handleUncountableEarlyExit(VPBasicBlock *EarlyExitingVPBB,
LatchExitingBranch->eraseFromParent();
Builder.setInsertPoint(LatchVPBB);
- Builder.createNaryOp(VPInstruction::BranchOnMultiCond,
+ Builder.createNaryOp(VPInstruction::BranchOnTwoConds,
{IsEarlyExitTaken, IsLatchExitTaken}, LatchDL);
LatchVPBB->clearSuccessors();
LatchVPBB->setSuccessors({VectorEarlyExitVPBB, MiddleVPBB, HeaderVPBB});
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.h b/llvm/lib/Transforms/Vectorize/VPlanTransforms.h
index 64459c79abdaf..f993bf18050d9 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.h
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.h
@@ -270,11 +270,9 @@ struct VPlanTransforms {
static void removeDeadRecipes(VPlan &Plan);
/// Update \p Plan to account for the uncountable early exit from \p
- /// EarlyExitingVPBB to \p EarlyExitVPBB by
- /// * updating the condition exiting the loop via the latch to include the
- /// early exit condition,
- /// * splitting the original middle block to branch to the early exit block
- /// conditionally - according to the early exit condition.
+ /// EarlyExitingVPBB to \p EarlyExitVPBB by introducing a BranchOnTwoConds
+ /// terminator in the latch that handles the early exit and the latch exit
+ /// condition.
static void handleUncountableEarlyExit(VPBasicBlock *EarlyExitingVPBB,
VPBasicBlock *EarlyExitVPBB,
VPlan &Plan, VPBasicBlock *HeaderVPBB,
@@ -283,9 +281,9 @@ struct VPlanTransforms {
/// Replace loop regions with explicit CFG.
static void dissolveLoopRegions(VPlan &Plan);
- /// Expand BranchOnMultiCond instructions into explicit CFG with
+ /// Expand BranchOnTwoConds instructions into explicit CFG with
/// BranchOnCond instructions. Should be called after dissolveLoopRegions.
- static void expandBranchOnMultiCond(VPlan &Plan);
+ static void expandBranchOnTwoConds(VPlan &Plan);
/// Transform EVL loops to use variable-length stepping after region
/// dissolution.
diff --git a/llvm/lib/Transforms/Vectorize/VPlanUtils.cpp b/llvm/lib/Transforms/Vectorize/VPlanUtils.cpp
index d3876543aaca2..53e149ab8640e 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanUtils.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanUtils.cpp
@@ -344,7 +344,7 @@ vputils::getRecipesForUncountableExit(VPlan &Plan,
// EMIT vp<%5> = any-of vp<%4>
// EMIT vp<%6> = add vp<%2>, vp<%0>
// EMIT vp<%7> = icmp eq vp<%6>, ir<64>
- // EMIT branch-on-muli-cond vp<%5>, vp<%8>
+ // EMIT branch-on-two-conds vp<%5>, vp<%7>
// No successors
// }
// Successor(s): early.exit, middle.block
@@ -360,8 +360,8 @@ vputils::getRecipesForUncountableExit(VPlan &Plan,
auto *Region = Plan.getVectorLoopRegion();
VPValue *UncountableCondition = nullptr;
if (!match(Region->getExitingBasicBlock()->getTerminator(),
- m_BranchOnMultiCond(m_AnyOf(m_VPValue(UncountableCondition)),
- m_VPValue())))
+ m_BranchOnTwoConds(m_AnyOf(m_VPValue(UncountableCondition)),
+ m_VPValue())))
return std::nullopt;
SmallVector<VPValue *, 4> Worklist;
diff --git a/llvm/lib/Transforms/Vectorize/VPlanVerifier.cpp b/llvm/lib/Transforms/Vectorize/VPlanVerifier.cpp
index 6702449fa6bee..eb3d54db00b85 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanVerifier.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanVerifier.cpp
@@ -391,23 +391,21 @@ static bool hasDuplicates(const SmallVectorImpl<VPBlockBase *> &VPBlockVec) {
bool VPlanVerifier::verifyBlock(const VPBlockBase *VPB) {
auto *VPBB = dyn_cast<VPBasicBlock>(VPB);
// Check block's condition bit.
- if (!isa<VPIRBasicBlock>(VPB)) {
+ if (VPBB && !isa<VPIRBasicBlock>(VPB)) {
// VPRegionBlocks can have multiple successors (e.g., with
- // BranchOnMultiCond) without needing a terminator, so only check
- // VPBasicBlocks
- if (VPBB && (VPB->getNumSuccessors() > 1 ||
- (VPBB->getParent() && VPBB->isExiting() &&
- !VPBB->getParent()->isReplicator()))) {
+ // BranchOnTwoConds) without needing a terminator, so only check
+ // VPBasicBlocks.
+ if (VPB->getNumSuccessors() > 1 ||
+ (VPBB->getParent() && VPBB->isExiting() &&
+ !VPBB->getParent()->isReplicator())) {
if (!VPBB->getTerminator()) {
errs() << "Block has multiple successors but doesn't "
"have a proper branch recipe!\n";
return false;
}
- } else if (VPBB) {
- if (VPBB->getTerminator()) {
- errs() << "Unexpected branch recipe!\n";
- return false;
- }
+ } else if (VPBB->getTerminator()) {
+ errs() << "Unexpected branch recipe!\n";
+ return false;
}
}
@@ -535,16 +533,16 @@ bool VPlanVerifier::verify(const VPlan &Plan) {
if (Exiting->empty()) {
errs() << "VPlan vector loop exiting block must end with BranchOnCount, "
- "BranchOnCond, or BranchOnMultiCond VPInstruction but is empty\n";
+ "BranchOnCond, or BranchOnTwoConds VPInstruction but is empty\n";
return false;
}
auto *LastInst = dyn_cast<VPInstruction>(std::prev(Exiting->end()));
if (!match(LastInst, m_CombineOr(m_BranchOnCond(),
m_CombineOr(m_BranchOnCount(),
- m_BranchOnMultiCond())))) {
+ m_BranchOnTwoConds())))) {
errs() << "VPlan vector loop exit must end with BranchOnCount, "
- "BranchOnCond, or BranchOnMultiCond VPInstruction\n";
+ "BranchOnCond, or BranchOnTwoConds VPInstruction\n";
return false;
}
diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/simple_early_exit.ll b/llvm/test/Transforms/LoopVectorize/AArch64/simple_early_exit.ll
index 233f3ee525d6b..b145bd004243d 100644
--- a/llvm/test/Transforms/LoopVectorize/AArch64/simple_early_exit.ll
+++ b/llvm/test/Transforms/LoopVectorize/AArch64/simple_early_exit.ll
@@ -37,7 +37,7 @@ define i64 @same_exit_block_pre_inc_use1() #1 {
; CHECK-NEXT: [[TMP17:%.*]] = call i1 @llvm.vector.reduce.or.nxv16i1(<vscale x 16 x i1> [[TMP8]])
; CHECK-NEXT: [[TMP18:%.*]] = icmp eq i64 [[INDEX_NEXT3]], [[N_VEC]]
; CHECK-NEXT: br i1 [[TMP17]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP18]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 64, [[N_VEC]]
@@ -118,7 +118,7 @@ define i64 @same_exit_block_pre_inc_use4() {
; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT2]], 64
; CHECK-NEXT: [[VEC_IND_NEXT]] = add <2 x i64> [[VEC_IND]], splat (i64 2)
; CHECK-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -179,7 +179,7 @@ define i64 @loop_contains_safe_call() #1 {
; CHECK-NEXT: [[TMP6:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT2]], 64
; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -246,7 +246,7 @@ define i64 @loop_contains_safe_div() #1 {
; CHECK-NEXT: [[TMP6:%.*]] = call i1 @llvm.vector.reduce.or.nxv4i1(<vscale x 4 x i1> [[TMP9]])
; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT2]], [[INDEX1]]
; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 64, [[INDEX1]]
@@ -325,7 +325,7 @@ define i64 @loop_contains_load_after_early_exit(ptr dereferenceable(1024) align(
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[TMP9:%.*]] = extractelement <4 x i64> [[WIDE_LOAD2]], i32 3
@@ -409,7 +409,7 @@ define i32 @diff_exit_block_needs_scev_check(i32 %end) {
; CHECK-NEXT: [[TMP15:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP13]])
; CHECK-NEXT: [[TMP16:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
; CHECK-NEXT: br i1 [[TMP15]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP16]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[UMAX1]], [[N_VEC]]
diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/single-early-exit-interleave.ll b/llvm/test/Transforms/LoopVectorize/AArch64/single-early-exit-interleave.ll
index 187a95728fdf3..be82965cc6649 100644
--- a/llvm/test/Transforms/LoopVectorize/AArch64/single-early-exit-interleave.ll
+++ b/llvm/test/Transforms/LoopVectorize/AArch64/single-early-exit-interleave.ll
@@ -61,7 +61,7 @@ define i64 @same_exit_block_pre_inc_use1() #0 {
; CHECK-NEXT: [[TMP12:%.*]] = call i1 @llvm.vector.reduce.or.nxv16i1(<vscale x 16 x i1> [[TMP33]])
; CHECK-NEXT: [[TMP35:%.*]] = icmp eq i64 [[INDEX_NEXT3]], [[N_VEC]]
; CHECK-NEXT: br i1 [[TMP12]], label [[VECTOR_EARLY_EXIT:%.*]], label [[LOOP_INC]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP35]], label [[MIDDLE_BLOCK:%.*]], label [[LOOP]], !llvm.loop [[LOOP0:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 510, [[N_VEC]]
diff --git a/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave.ll b/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave.ll
index df8414060918a..01776e5283298 100644
--- a/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave.ll
+++ b/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave.ll
@@ -36,7 +36,7 @@ define i64 @multi_exiting_to_different_exits_live_in_exit_values() {
; VF4IC4-NEXT: [[TMP3:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP11]])
; VF4IC4-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 128
; VF4IC4-NEXT: br i1 [[TMP3]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; VF4IC4: vector.body.multi.cond.1:
+; VF4IC4: vector.body.cond.1:
; VF4IC4-NEXT: br i1 [[TMP4]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[E2:%.*]]
@@ -117,7 +117,7 @@ define i64 @same_exit_block_pre_inc_use1() {
; VF4IC4-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP16]])
; VF4IC4-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 64
; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; VF4IC4: vector.body.multi.cond.1:
+; VF4IC4: vector.body.cond.1:
; VF4IC4-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[LOOP_END:%.*]]
@@ -203,7 +203,7 @@ define ptr @same_exit_block_pre_inc_use1_ivptr() {
; VF4IC4-NEXT: [[TMP10:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP9]])
; VF4IC4-NEXT: [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024
; VF4IC4-NEXT: br i1 [[TMP10]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; VF4IC4: vector.body.multi.cond.1:
+; VF4IC4: vector.body.cond.1:
; VF4IC4-NEXT: br i1 [[TMP11]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[LOOP_END:%.*]]
@@ -295,7 +295,7 @@ define i64 @same_exit_block_post_inc_use() {
; VF4IC4-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP16]])
; VF4IC4-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 64
; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; VF4IC4: vector.body.multi.cond.1:
+; VF4IC4: vector.body.cond.1:
; VF4IC4-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[LOOP_END:%.*]]
@@ -391,7 +391,7 @@ define i64 @diff_exit_block_pre_inc_use1() {
; VF4IC4-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP16]])
; VF4IC4-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 64
; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; VF4IC4: vector.body.multi.cond.1:
+; VF4IC4: vector.body.cond.1:
; VF4IC4-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[LOOP_END:%.*]]
@@ -492,7 +492,7 @@ define i64 @diff_exit_block_post_inc_use1() {
; VF4IC4-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP16]])
; VF4IC4-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 64
; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; VF4IC4: vector.body.multi.cond.1:
+; VF4IC4: vector.body.cond.1:
; VF4IC4-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[LOOP_END:%.*]]
@@ -611,7 +611,7 @@ define i64 @same_exit_block_pre_inc_use1_reverse() {
; VF4IC4-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP24]])
; VF4IC4-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1008
; VF4IC4-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; VF4IC4: vector.body.multi.cond.1:
+; VF4IC4: vector.body.cond.1:
; VF4IC4-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[SCALAR_PH:%.*]]
@@ -721,7 +721,7 @@ define i8 @same_exit_block_use_loaded_value() {
; VF4IC4-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP16]])
; VF4IC4-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024
; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; VF4IC4: vector.body.multi.cond.1:
+; VF4IC4: vector.body.cond.1:
; VF4IC4-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[LOOP_END:%.*]]
@@ -847,7 +847,7 @@ define i8 @same_exit_block_reverse_use_loaded_value() {
; VF4IC4-NEXT: [[TMP25:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP24]])
; VF4IC4-NEXT: [[TMP26:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1008
; VF4IC4-NEXT: br i1 [[TMP25]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; VF4IC4: vector.body.multi.cond.1:
+; VF4IC4: vector.body.cond.1:
; VF4IC4-NEXT: br i1 [[TMP26]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[SCALAR_PH:%.*]]
diff --git a/llvm/test/Transforms/LoopVectorize/single_early_exit.ll b/llvm/test/Transforms/LoopVectorize/single_early_exit.ll
index 601cdd0bd0e38..88c7ca6cf37d9 100644
--- a/llvm/test/Transforms/LoopVectorize/single_early_exit.ll
+++ b/llvm/test/Transforms/LoopVectorize/single_early_exit.ll
@@ -27,7 +27,7 @@ define i64 @same_exit_block_phi_of_consts() {
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -87,7 +87,7 @@ define i64 @diff_exit_block_phi_of_consts() {
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -168,7 +168,7 @@ define i32 @diff_exit_block_needs_scev_check(i32 %end) {
; CHECK-NEXT: [[TMP15:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP13]])
; CHECK-NEXT: [[TMP16:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
; CHECK-NEXT: br i1 [[TMP15]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP16]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[UMAX1]], [[N_VEC]]
@@ -255,7 +255,7 @@ define i32 @diff_blocks_invariant_early_exit_cond(ptr %s) {
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[INDEX_NEXT]], 276
; CHECK-NEXT: br i1 [[TMP1]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP2]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[FOR_END:%.*]]
@@ -316,7 +316,7 @@ define void @inner_loop_trip_count_depends_on_outer_iv(ptr align 8 dereferenceab
; CHECK-NEXT: [[TMP3:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP2]])
; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
; CHECK-NEXT: br i1 [[TMP3]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP4]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[OUTER_IV]], [[N_VEC]]
@@ -412,7 +412,7 @@ define i64 @loop_guard_needed_to_prove_dereferenceable(i32 %x, i1 %cmp2) {
; CHECK-NEXT: [[TMP4:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
; CHECK-NEXT: br i1 [[TMP4]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP5]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP0]], [[N_VEC]]
@@ -558,7 +558,7 @@ define i64 @loop_guards_needed_to_prove_deref_multiple(i32 %x, i1 %c, ptr derefe
; CHECK-NEXT: [[TMP6:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP5]])
; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[IV_NEXT]]
; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[LOOP_LATCH]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_BLOCK:%.*]], label [[LOOP_HEADER]], !llvm.loop [[LOOP11:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP2]], [[IV_NEXT]]
diff --git a/llvm/test/Transforms/LoopVectorize/single_early_exit_live_outs.ll b/llvm/test/Transforms/LoopVectorize/single_early_exit_live_outs.ll
index 38f00ce89a126..0268225092023 100644
--- a/llvm/test/Transforms/LoopVectorize/single_early_exit_live_outs.ll
+++ b/llvm/test/Transforms/LoopVectorize/single_early_exit_live_outs.ll
@@ -26,7 +26,7 @@ define i64 @same_exit_block_pre_inc_use1() {
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -89,7 +89,7 @@ define i32 @same_exit_block_pre_inc_use1_iv64_endi32_step2() {
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -152,7 +152,7 @@ define i32 @same_exit_block_pre_inc_use1_iv128_endi32_step2() {
; CHECK-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP1]])
; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i128 [[INDEX_NEXT2]], 64
; CHECK-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -217,7 +217,7 @@ define float @same_exit_block_pre_inc_use1_iv64_endf32() {
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -284,7 +284,7 @@ define ptr @same_exit_block_pre_inc_use1_iv64_endptr() {
; CHECK-NEXT: [[TMP16:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP17:%.*]] = icmp eq i64 [[INDEX_NEXT7]], 64
; CHECK-NEXT: br i1 [[TMP16]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP17]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -346,7 +346,7 @@ define ptr @same_exit_block_pre_inc_use1_ivptr() {
; CHECK-NEXT: [[TMP12:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP1]])
; CHECK-NEXT: [[TMP13:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024
; CHECK-NEXT: br i1 [[TMP12]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP13]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -408,7 +408,7 @@ define i64 @same_exit_block_pre_inc1_use_inv_cond(i1 %cond) {
; CHECK-NEXT: [[TMP8:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP12]])
; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
; CHECK-NEXT: br i1 [[TMP8]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -472,7 +472,7 @@ define i64 @same_exit_block_pre_inc_use1_gep_two_indices() {
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -535,7 +535,7 @@ define i64 @same_exit_block_pre_inc_use1_alloca_diff_type() {
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -598,7 +598,7 @@ define i64 @same_exit_block_pre_inc_use2() {
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -658,7 +658,7 @@ define i64 @same_exit_block_pre_inc_use3() {
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -722,7 +722,7 @@ define i64 @same_exit_block_pre_inc_use4() {
; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT2]], 64
; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], splat (i64 4)
; CHECK-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP13:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -783,7 +783,7 @@ define i64 @same_exit_block_post_inc_use() {
; CHECK-NEXT: [[TMP14:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP15:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
; CHECK-NEXT: br i1 [[TMP14]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP15]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -842,7 +842,7 @@ define ptr @same_exit_block_post_inc_use1_ivptr() {
; CHECK-NEXT: [[TMP16:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP1]])
; CHECK-NEXT: [[TMP17:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024
; CHECK-NEXT: br i1 [[TMP16]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP17]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP15:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -902,7 +902,7 @@ define i64 @same_exit_block_post_inc_use2() {
; CHECK-NEXT: [[TMP18:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP19:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
; CHECK-NEXT: br i1 [[TMP18]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP19]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP16:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -966,7 +966,7 @@ define i64 @diff_exit_block_pre_inc_use1() {
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP17:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -1034,7 +1034,7 @@ define i64 @diff_exit_block_pre_inc_use2() {
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP18:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -1099,7 +1099,7 @@ define i64 @diff_exit_block_pre_inc_use3() {
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT4]], 64
; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP19:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -1165,7 +1165,7 @@ define i64 @diff_exit_block_post_inc_use1() {
; CHECK-NEXT: [[TMP14:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP15:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
; CHECK-NEXT: br i1 [[TMP14]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP15]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP20:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -1233,7 +1233,7 @@ define i64 @diff_exit_block_post_inc_use2() {
; CHECK-NEXT: [[TMP18:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP19:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
; CHECK-NEXT: br i1 [[TMP18]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP19]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP21:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -1303,7 +1303,7 @@ define i64 @diff_exit_block_post_inc_use3(i64 %start) {
; CHECK-NEXT: [[TMP20:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP21:%.*]] = icmp eq i64 [[INDEX_NEXT4]], 64
; CHECK-NEXT: br i1 [[TMP20]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP21]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP22:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[IND_ESCAPE:%.*]] = sub i64 [[TMP0]], 1
@@ -1374,7 +1374,7 @@ define i64 @loop_contains_safe_call() {
; CHECK-NEXT: [[TMP6:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT2]], 64
; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP23:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -1435,7 +1435,7 @@ define i64 @loop_contains_safe_div() {
; CHECK-NEXT: [[TMP6:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT2]], 64
; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP24:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -1496,7 +1496,7 @@ define i64 @loop_contains_load_after_early_exit(ptr dereferenceable(1024) align(
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP25:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[TMP9:%.*]] = extractelement <4 x i64> [[WIDE_LOAD2]], i32 3
@@ -1564,7 +1564,7 @@ define i64 @same_exit_block_pre_inc_use1_reverse() {
; CHECK-NEXT: [[TMP9:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP7]])
; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT4]], 1020
; CHECK-NEXT: br i1 [[TMP9]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP10]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP26:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[SCALAR_PH:%.*]]
@@ -1688,7 +1688,7 @@ define i64 @same_exit_block_pre_inc_use1_deref_ptrs(ptr dereferenceable(1024) %p
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.multi.cond.1:
+; CHECK: vector.body.cond.1:
; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP28:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
diff --git a/llvm/test/Transforms/LoopVectorize/single_early_exit_with_outer_loop.ll b/llvm/test/Transforms/LoopVectorize/single_early_exit_with_outer_loop.ll
index babc483f41386..c833c80a10680 100644
--- a/llvm/test/Transforms/LoopVectorize/single_early_exit_with_outer_loop.ll
+++ b/llvm/test/Transforms/LoopVectorize/single_early_exit_with_outer_loop.ll
@@ -6,7 +6,7 @@ declare void @init_mem(ptr, i64);
; uncountable early exits are correctly added to the outer loop at depth 1.
define void @early_exit_in_outer_loop1() {
; CHECK-LABEL: Loop info for function 'early_exit_in_outer_loop1':
-; CHECK: Loop at depth 1 containing: %loop.outer<header>,%loop.inner.found,%loop.inner.end<latch>,%loop.inner.end.loopexit,%vector.ph,%vector.body,%vector.body.multi.cond.1,%middle.block,%vector.early.exit
+; CHECK: Loop at depth 1 containing: %loop.outer<header>,%loop.inner.found,%loop.inner.end<latch>,%loop.inner.end.loopexit,%vector.ph,%vector.body,%vector.body.cond.1,%middle.block,%vector.early.exit
entry:
%p1 = alloca [1024 x i8]
%p2 = alloca [1024 x i8]
@@ -45,8 +45,8 @@ loop.inner.end:
; loops at depths 1 and 2, respectively.
define void @early_exit_in_outer_loop2() {
; CHECK-LABEL: Loop info for function 'early_exit_in_outer_loop2':
-; CHECK: Loop at depth 1 containing: %loop.outer<header>,%loop.middle,%loop.inner.found,%loop.inner.end,%loop.middle.end,%loop.outer.latch<latch>,%vector.ph,%vector.body,%vector.body.multi.cond.1,%middle.block,%vector.early.exit
-; CHECK: Loop at depth 2 containing: %loop.middle<header>,%loop.inner.end<latch><exiting>,%vector.ph,%vector.body<exiting>,%vector.body.multi.cond.1,%middle.block
+; CHECK: Loop at depth 1 containing: %loop.outer<header>,%loop.middle,%loop.inner.found,%loop.inner.end,%loop.middle.end,%loop.outer.latch<latch>,%vector.ph,%vector.body,%vector.body.cond.1,%middle.block,%vector.early.exit
+; CHECK: Loop at depth 2 containing: %loop.middle<header>,%loop.inner.end<latch><exiting>,%vector.ph,%vector.body<exiting>,%vector.body.cond.1,%middle.block
entry:
%p1 = alloca [1024 x i8]
%p2 = alloca [1024 x i8]
@@ -92,8 +92,8 @@ loop.outer.latch:
define i32 @early_exit_branch_to_outer_header() {
; CHECK-LABEL: Loop info for function 'early_exit_branch_to_outer_header':
-; CHECK-NEXT: Loop at depth 1 containing: %outer.header<header>,%outer.header.loopexit<latch>,%vector.ph,%vector.body,%vector.body.multi.cond.1<exiting>,%vector.early.exit
-; CHECK-NEXT: Loop at depth 2 containing: %vector.body<header><exiting>,%vector.body.multi.cond.1<latch><exiting>
+; CHECK-NEXT: Loop at depth 1 containing: %outer.header<header>,%outer.header.loopexit<latch>,%vector.ph,%vector.body,%vector.body.cond.1<exiting>,%vector.early.exit
+; CHECK-NEXT: Loop at depth 2 containing: %vector.body<header><exiting>,%vector.body.cond.1<latch><exiting>
entry:
%src = alloca [1024 x i8]
call void @init_mem(ptr %src, i64 1024)
diff --git a/llvm/test/Transforms/LoopVectorize/uncountable-early-exit-vplan.ll b/llvm/test/Transforms/LoopVectorize/uncountable-early-exit-vplan.ll
index 3ded8b6ee6c40..fc48f7a6a51ea 100644
--- a/llvm/test/Transforms/LoopVectorize/uncountable-early-exit-vplan.ll
+++ b/llvm/test/Transforms/LoopVectorize/uncountable-early-exit-vplan.ll
@@ -31,7 +31,7 @@ define i64 @multi_exiting_to_different_exits_live_in_exit_values() {
; CHECK-NEXT: EMIT vp<%index.next> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>
; CHECK-NEXT: EMIT vp<[[EA_TAKEN:%.+]]> = any-of ir<%c.1>
; CHECK-NEXT: EMIT vp<[[LATCH_CMP:%.+]]> = icmp eq vp<%index.next>, vp<[[VTC]]>
-; CHECK-NEXT: EMIT branch-on-multi-cond vp<[[EA_TAKEN]]>, vp<[[LATCH_CMP]]>
+; CHECK-NEXT: EMIT branch-on-two-conds vp<[[EA_TAKEN]]>, vp<[[LATCH_CMP]]>
; CHECK-NEXT: No successors
; CHECK-NEXT: }
; CHECK-NEXT: Successor(s): vector.early.exit, middle.block
@@ -113,7 +113,7 @@ define i64 @multi_exiting_to_same_exit_live_in_exit_values() {
; CHECK-NEXT: EMIT vp<%index.next> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>
; CHECK-NEXT: EMIT vp<[[EA_TAKEN:%.+]]> = any-of ir<%c.1>
; CHECK-NEXT: EMIT vp<[[LATCH_CMP:%.+]]> = icmp eq vp<%index.next>, vp<[[VTC]]>
-; CHECK-NEXT: EMIT branch-on-multi-cond vp<[[EA_TAKEN]]>, vp<[[LATCH_CMP]]>
+; CHECK-NEXT: EMIT branch-on-two-conds vp<[[EA_TAKEN]]>, vp<[[LATCH_CMP]]>
; CHECK-NEXT: No successors
; CHECK-NEXT: }
; CHECK-NEXT: Successor(s): vector.early.exit, middle.block
@@ -188,7 +188,7 @@ define i64 @multi_exiting_to_same_exit_live_in_exit_values_2() {
; CHECK-NEXT: EMIT vp<%index.next> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>
; CHECK-NEXT: EMIT vp<[[EA_TAKEN:%.+]]> = any-of ir<%c.1>
; CHECK-NEXT: EMIT vp<[[LATCH_CMP:%.+]]> = icmp eq vp<%index.next>, vp<[[VTC]]>
-; CHECK-NEXT: EMIT branch-on-multi-cond vp<[[EA_TAKEN]]>, vp<[[LATCH_CMP]]>
+; CHECK-NEXT: EMIT branch-on-two-conds vp<[[EA_TAKEN]]>, vp<[[LATCH_CMP]]>
; CHECK-NEXT: No successors
; CHECK-NEXT: }
; CHECK-NEXT: Successor(s): vector.early.exit, middle.block
>From 42f7c7b750be7f372e119147bca689458c3b27c5 Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Thu, 25 Dec 2025 13:58:54 +0000
Subject: [PATCH 3/4] !fixup preserve split logic.
---
llvm/docs/Vectorizers.rst | 17 +-
llvm/docs/vplan-early-exit.dot | 1 +
llvm/docs/vplan-early-exit.png | Bin 64557 -> 164420 bytes
llvm/lib/Transforms/Vectorize/VPlan.cpp | 2 +-
llvm/lib/Transforms/Vectorize/VPlan.h | 6 +-
.../lib/Transforms/Vectorize/VPlanRecipes.cpp | 2 -
.../Transforms/Vectorize/VPlanTransforms.cpp | 87 +++---
.../Transforms/Vectorize/VPlanVerifier.cpp | 3 -
.../AArch64/simple_early_exit.ll | 74 ++---
.../AArch64/single-early-exit-interleave.ll | 13 +-
.../single-early-exit-cond-poison.ll | 34 +--
.../single-early-exit-deref-assumptions.ll | 87 +++---
.../single-early-exit-interleave-hint.ll | 9 +-
.../single-early-exit-interleave-only.ll | 18 +-
.../single-early-exit-interleave.ll | 89 +++---
.../LoopVectorize/single_early_exit.ll | 85 +++---
.../single_early_exit_live_outs.ll | 276 ++++++++++--------
.../single_early_exit_with_outer_loop.ll | 18 +-
.../uncountable-early-exit-vplan.ll | 3 +-
...or-loop-backedge-elimination-early-exit.ll | 115 +++-----
20 files changed, 478 insertions(+), 461 deletions(-)
diff --git a/llvm/docs/Vectorizers.rst b/llvm/docs/Vectorizers.rst
index b4da0273e89dc..6aefce68fab00 100644
--- a/llvm/docs/Vectorizers.rst
+++ b/llvm/docs/Vectorizers.rst
@@ -404,14 +404,15 @@ Early Exit Vectorization
When vectorizing a loop with a single early exit, the loop blocks following the
early exit are predicated and the vector loop will always exit via the latch.
-It is terminated by a BranchOnTwoConds VPInstruction, which takes both the early
-and latch exiting conditions. If the early exiting condition is true,
-BranchOnToConds exits to an intermediate block (``vector.early.exit`` below).
-This intermediate block is responsible for calculating any exit values of
-loop-defined variables that are used in the early exit block. If the latch
-exiting condition is true, exits to the ``middle.block`` which selects between
-the exit block from the latch or the scalar remainder loop. Otherwise continues
-executing in the region header.
+The loop terminates with a single BranchOnTwoConds VPInstruction, which takes
+both the early and latch exiting conditions. If the early exiting condition is
+true, BranchOnToConds exits to an intermediate block (``vector.early.exit``
+below). This intermediate block is responsible for calculating any exit values
+of loop-defined variables that are used in the early exit block. If the latch
+exiting condition is true, BranchOnToConds exits to the ``middle.block`` which
+selects between the exit block and the scalar remainder loop. Otherwise
+BranchOnTwoConds continues executing the loop by jumping back to the region
+header.
.. image:: vplan-early-exit.png
diff --git a/llvm/docs/vplan-early-exit.dot b/llvm/docs/vplan-early-exit.dot
index baa3d303ad161..560f62f9959b5 100644
--- a/llvm/docs/vplan-early-exit.dot
+++ b/llvm/docs/vplan-early-exit.dot
@@ -16,6 +16,7 @@ compound=true
}
N2 -> N5 [ label="" ltail=cluster_N3]
N2 -> N7 [ label="" ltail=cluster_N3]
+ N2 -> N2 [style=dotted, dir=back, constraint=false, splines=true, weight=10]
N5 [label =
"vector.early.exit"
]
diff --git a/llvm/docs/vplan-early-exit.png b/llvm/docs/vplan-early-exit.png
index e2740e51fb0c501a7e7c51874ee3eb1512125f8b..a683e039a87b36832f0f3fe6218876eff1a9de82 100644
GIT binary patch
literal 164420
zcmeFac|6y9*FI`b?WcLCK|&e`6*iSIv<qd3P)VjTR;EodWUAe+%t|B?Wo%F~gpAcT
zQ$l5?$doB5L#A`B&$piYzMpgcIOmV^I=|O>{d%5Pcli1Y at ArDIb**b%Yi*x>8oL+H
zTQ!f3jcuXI9z|_7w)t6XY;)xQYYx6szsb}c|1-x#ZMP!ZEdAfjyu>SPY-`w56#v-o
z64~G4n)~KttHQ at I=}?J{p)1Pj!!F$y7pmEFEG15VeUnXv*>SN{bDtFd2*I7}CvT>z
z`$@#b?5VKfoM#?%P&lT>>BZ3E0{g1)zKyRRKN!g?ADM88RCqBtnI|7zS0-JzHo5O)
z=kgURR?xG2|HHRgq4)d0>3 at H_^>)#}zTOeI at 6TWV_2n7?!K|PD_2s3d%bI`q*O#Sp
z=MDbrE4KGP|Kj{_UpoBtm+ZfNDgDP&o_~FLCi3Qg+*afN(QV_e&?E1#{aPD6v&`6Q
z`c#b=8{3fx?PR08tjWQgD}l^IUP@!0c28e`WUF_O{8z!=m27Me_v&R>>(wk_9>w9X
zXU)I858IlZ|M866S~AR1S at S%|8O*MCZu4NStRIShNq+s at d&O}9UFOXF3(T8FydUof
z3W^Pqmtk&n;Er~@FKY>&Sd?nYFn9d+m*Rge>-zsSmi7Om-TdFT{calnFCLly6&HDD
zZ`?QM(vW8H{Q98+&*=?q#t#f0msV6%n5<(~rT%vTmIrzwVNn*$U!7uFa{J)@!y&@@
z5*zp5eptp^o2aQNBhP%c;HU=6d7ZIQ$F)q}J~^vW!u;gS^RAy+zNx-=0jD@$?|(7h
zeyH^A;2q(rePEaqx1Ra#lNDOuFH;#GX0$3X+Vk}O2L{r;f~;TCWBpQTcERlQQ1xxC
zSg9|sbWGa|eN;+*sP8&(|M0dsi&t}3Tov{U-K1L_q%d=BwBzQvMXE9zncrXb&8x6k
zHz^0L=IM?+siCN-9w8xY<T=qfJ~dJmi}#x=@YA at BpmF}xoaD}K*<Tr#e5SeG?g6>0
z(z{rN6%+2S?;aR_qi at F_^3A`OnzMG<?Df>dh~)8a-(@-49S4^$TNYROCfPW82Rri|
zY-{R-{#SJF|7odz*QhWrpP_O7{CP3U7m<h3k7;c-$od!-q~y0ksUg)oRykl*fqQ>?
zt%laUgZFP6<(;lcSvvC1Vuixy$0z-!^n?#RT;n-4TvBge!V`P?%LgU-(FV(CL7fEk
znv^oJ`71ViPmFYz{PoLx&xu1>e;y4HHI_f|CW-UWiPyf at w^=DazrHP2<A#h at zWYSn
zdb^YJ=FeX*Dk|E$lJ5vD|3GHjiitxHkNgp`Nmpc}?gQ=vclY}=KC&u#`YSK at slGRR
zWo*~25HVPJvirq!XGfD=LBR4&2Nmg>P6Lh1^B%Z&@YNk10sL;HqXDxq4k1j`cvwci
zn4J4b)t__A1|!$bP`rAzg`8)>^r+ub4XL#nQt$pg_9jV>Zmp(rMR(u6-*6a$s$+MT
z^i;>1Hl`of+PCjvSy1x6TRXSfG;X~vX}9`$gk%twX1i+GsIGLuHihZWI{v&0^2&kS
zoa=W7`imA!Ib7k*X>n>&!ikL88zE7heX6hiWR+YRha=aQ;S$~w?<MO^aMJ?!&4<$k
zM;on at r9M9SiR{~V*CJ`Y!<n``@v5P!G9sKAc*B*_4rbeNI>e4X`}<I~WA6rqj1#Z#
z+V|YLSnMMZwKDOB)8YP%CfkPj*B^3ju_(Ox$2pUaZ=Z^}jrQ+7t!`vwwDoum-^_T4
zg7W0(KrCE at p2l2Sq9<?ok{>>N_<Qef_~LyOHnnIsugB+#?&N}*)7&1PtLJX`+JIGS
zpP3vAs*<1FO#APj6doPTyY0j)?+tse7vf+a?q3?z=F$=1^0|6<M_+P5V6^8~q4k_<
zp&OTPvwGv-^*myCqQ(uAoPmsr((DKm+U}RT78h-)+P-usf6~_MLo$1Lm?&=v_epgF
z$7&_}4|ftR%$^&39LyOimK$qcYFg~?gAa<B_6<J#XOVqZxMgvuuF>P_m{09Rex^^(
z{2+!;WR17`#U8Is;H>y4I?`Pg<TjKiDL?h`pF^o;Wy!4yScyZqF7}rjY;y)yz$D9E
zG8{jRjL=$CrysA)dLOKo;mdK*f2G*E)t=+;Tm~N1nRJ$ia_XHVE2-6x70z}ZT8&4q
zD7_w at VcU{TFKgOgpCV at 0noADXBAGl`PgCa53d=)j7JJD%ejOX)UAjTNKCa}|Jzde$
zV}m>bk$*m0F;tN-G1_F;(dsr75WdCI_TW4Bp}euc#HiCJt_<FgusO`^^q+5^gmga;
zK2?A8V$pdHqm|t^oQ+<{{mSD|x^@`b!4baqhRn8A64qHyOOlN8WB{X<dd*I at VJSF^
z8VmN{(XLL?ON0HENK9_o>OTHaYU2GBuZdjyj$+2wU1L1=noP!ZT{<YTqFFcDhzIb@
z3Qpm7D>nnL=`X`!1ykmJybACZ^&Vp_nYTk8-}yQ^z-5^2Sl0M;HWl`=^7kV<nms26
zXc>|QUq3whPu4(2Q+rlNV8sXdhOJg_lCs`i;A)@fj;^ZrW2+Iuu}-&ZlYfx^^@G&s
zm%IE7HVF!PpIam&Xz?O)qN1O7c6 at iS@s5`<N`ABj;@K7|y|3 at -HaphtRVk^znb~@J
z(}Txd*RM(0o4gslZSdIPb5Hep+L`4W_m?)x>$hLtz1qi5B>VOuE1dClMjl^YKlf}#
z=ve98>T0<i_MkuI*7f&N4ey+xeAz`(Z_fyy-d-?Rx<1Ii?23ThXvc at T<Y?{o8BH?G
zNUxcRVQiAk at m%8rIL1A1?&}+z?u}3RXOXO#P4x4W$G?pEEEOnL;xJqm?fyxnIL&de
zS$Z&kaxl`(cB2Rj#GiS7CEAhBTK)cA7Z*K0 at mOx12~3teN>Py4`^&pi58DQLlQpGf
zd;amq9}8CgzGf6R&6 at gDk!EBYG(M5ud{tOqd8F%k=IyL&andKd3dtP4e0c5G9pxr+
zuXEJf`%7P4$=j#rI&eJvGHjYwOmuHK*;ToYe$*Z9B_BKK^|d!q-{!Ggdw2A(!S<n}
zU6tYX<wA*yS2pZr?mrHT>iF819E9_>h0M0^&HaiGo)PPts_eKvA(ob4k2$dXRw<rU
z<VF|CeSYcEpHd=zEzoP??YYINpJYv at zkadryPsLSWH<Na*A8xqg@^_1aBKlzzx0*B
zH>YLmCI}nnZ<lc%<c8<2P{mrb- at 3Tkch_P$$9t1$Oa`$gO;v!&ZzNu?y~rK>MGhyW
zptP#(Q{B1QZlA`6hqE)2mNo<NYGK8kmXS-~Xg_UGun3YH^}gZUDt%WsnGUHRoMX|4
z*Y`|^+lz)<oZE`XQH=ICq*ynk8XH<Y`+IJ6oXVA~-h_zuVlF%X+}zxDcWFJz)1P~!
zI{de^PYxB#zIIa!6XBuYwQAdmLJir0&lS7F#m(twL7f$0C1Y(~yx0>za<>R?o~NEK
zS+873(Mogsuwwd&*BkSvN1H<2YM%SX!d+<Po&GWohbEqFtJ2^#JAHC+^26C*S9{|}
zHV)Of6c}M)w<(Av>1}apJf3(c#YAcIp@(n7f at sU{9=Iow{Q__#77=jx{T0pPOKW$<
z0N{j=JNS0ezGt?1<`j-1Ya43M9eLr0r!ljB{>ZAX_!ka?-;CXdl~P)l{Jr0;KV|p+
zyZeQ%iW*0yY_oiReL3MKb-dY?!DRhR+gA?^Wly}iy at VV$E#hK at so&;vh)i{M4^@a3
z_~UxEjyJIA;@2f?R?(Sq9BP$YYOH#2Z`5{a4TQn*t_VAc)5eH7bg9vL(;)o6oXJ>=
zbI{b(6uhy at X2a~Q`S8});OVA5*J^SZm?93+hESACw{8%xH6|K>jZOat<_u-5!duxH
zxV$?*jDu=sKF#CYEM}WKTx at c`8rClLwI{X%scGrHyD{|Wx<;<%2j9%VDBEA at Xa*o`
zS;vkIJnoLNNAN1C-p$Jc<7<l3w#I48g*6Ss?n at B1Rue=>GI%ULkOzoVeNQ*}n)FGF
z?K9&YTDNwd7yf!W^}h2^tNrT(x;CE+XA#bs(0l*zBVW9rL`IwE<le(>1C5WwaP(a8
zzNVGe#Kf%YA1=K51BdY8W%u<n1A&c|YZLbBJg`&M@;ph{+cvv5A*<bYljox+;Z}DK
z-d|N`?B!7-=9z+^PcERt&TFzsdFURjfg5{ADB at U4_9>jEZrwT~#F^ZguYF<;?@MXz
z+;Pgea>szB0xvA&Dt>uuSI5VH7Ps{$ufLM*G_XoE at 3VGg_!faaw*Wwu7czZG*JPas
zadDkQjdZIzkwx<3Z*LnHcv7&ksEXq0C=T!gKrTiQsg)lDKn_SXujqO;*8JvyNs+Jp
z^q0DlQ+0-6mz`IW`-;VR;hOSTwj>31Uy at R?nv0fZspfXE4{z>I-s=;=$tQoja@&dh
z{;TCqpBwr+m0l7rZ!$GLJY2X`QxQiubKI&df$l1l7|FirU{d{Cxe{J4cY{-}57@(7
zDnEAUl*n$yiEH<o9rNla;xP9A;ioxq9#5ZPX=31Fhv6_v;Dh!1lNpC{=DwQIQIULs
zEifn_Y^sqv9=5<8%a%;WaN|hK?8s|f<08vwkE<ESPBoZ^6=4qy&73}!36$XMJbe1)
z)2B}{0LNOOMfQrUnZ1s9B9)H|9KxZVGekT{q}$-*;po}pt=Q%9e|Ts1nOy}&BJVLh
z)~2xO{1Cb77Yege0axn?KI$6SE2ZP?*9#mGHOiGDj|=bV2LNsNF(2V&Gxl#qPJgOe
z%4kI#0$>T=lUq}M!mP2+)z#G=uCH)gox##yc^vmCj~e8=yXJm;Hh=iZPm2p>hjP=N
zPTt*rC)h!IW(bJj+ICk5WrwL8p!_0%Xm at sO)AVb%q3pf~6h$xV0h$p$<*W+TphFAq
zGuq}g>p$(!Q3tOX>oGY>pmSksT9a)~(R0Z*ZXOv&Zy3S~s{%NO-)$dvUd74e(2hDe
z6YoCpX&Bti?u(0fd>`rB-v=&1T<0V|i4bM?xwW at 8u|zntS=;OlMffkTbtT8I{q@&h
zj3>svwe`&3PeB<Lx7)G5UaUMs2rp9{#5-HzGcYTppr8QAxh#N7vbCq~X_p?-g-Te$
zxuFH(z<1*#(X$3-2Z6<0W~axzCZ;H~sEIr_JLmT5w$}R7qy3y5#_skho- at cjObfl2
zRHs>1jl)eyxU_+nTJ_Vfi~QFIZFle+Yt+8T?Xc&vLWH;X9i2qwe=aOEt$%p5`qr+C
z>9g`WSleT5`5p$aW&No|5*1;hK^Iq_76cdy9X)RV-02K=%J0-{Um|>1L3aVK{B{lb
ziTB3xcFkG#xnJJs&)x7NIk!?9CP9k}t at vduptmK*xqNOn+-o2?S3vokzqRA*5;dcH
zTJzj4>me0rkFd-4;c=>8Tg^Q?xY%oaS2MB+`;Sk5wR9hXw=UGtlv}QA>~U(dUMk;!
z99;=euLxl~Y<OC-t~_*8ta-)NVR+|+yjDWIu*jIB|6I^(D7blZ&1(3TtikL)lj<0y
zh|kxomp4n6P<TBzXW>S1K&8p{PZgq?f?BEavr{8dgIOKzBUK8TZXQTHe52&tl)GQt
z*fNv5&ExCmETl4oi at 9>UMZG2}4xaol4qP0A6i&&4Yf~0N-xzTZ at B**q)LFm0`A4(+
z$aDL49|7A>ey%G-jks+Z(|r)jWIG$-TsSh3LT$Le%R)U`Uar%1ylws<2*_iUCLA~J
z*Mc)(Or`IQ at Wz8l*HYAf`Q;a}V=r%J4Ht7sj%x at t*<>23U*9TZRj^CKY}YSi4QZAo
z2m}$M=~Et~4FX0mT>rdFeK?~*i+E%TaXf+@?&F{g<860)dU`64s(vG1pL8{xo>d0#
z$ySqvqo$*AEK1VONcFMAaoo}#FO^tXg`>wVoH^UUJL|paLDsr~NAs3%EX1{WO-llw
z1MIYSi?<PU<MkXrN&sO%jt<5ZO?l~jgrOv}dTxL<&qfEgBH!hvl)l-w7bdM(Ix;fS
z at oc`Rzh0U}k=Jycm$?mZYB#|Uz)`!0&7N=cEXjGTFwAj!Uhe0xYU{DzlJmcwSimK*
znUdkrC@$NqwX40RhW&?bq|-%!&r+T`xJ`WO?C_fD_G+hi0VHAbM)tt|dk2M$+y)+{
zSDA91wq4JuDfeZ+<A+y5HjndQE0kyTU=5Wk29_u&csb*QQi>%t*`HS1O3ahg^ygYh
z7jX}jRY(gWvBbwK2FQC8D`QG%^xR^3sRWH1*GJnVivxMML~}pxEFNW!!<sQB6M4Az
z4p2QIZ=n%N;m&U5k}xUs4*AOp+u_(-6JIE<j=YD0S2};eoQ10ju at bythE5F@q1!X}
zBmA1aFTE^w<jEO9-3JEcU+8_qEu%QGOL|qQYhh0M3s!HJGB<+hxO9f<wgZ5Orfep*
z;pw?wO8_GdnYd}Y_thmc7J-M4bP$H$83d*ppKO~oS|{ot-5Yns1g<Fs&>}8xCQ)Hp
zs1 at mNQn#QGrK*S&@p3#e?XyuM0F+B`bQ@#jz_I;?;1qE3g|xsrPfyz(a2rU<&HPSY
z(ZeD0#c@&?7z$3Sl9#1x-9|`0xP=IbsM8<r^uRkb4m~2z at B&7bWKqBDr#TDuOm at G5
zOLFOr4~x-`SLJL=!{1^+K=n8{IuEA5Bzrv{_as-t_MVlDWJn`(^O>58nJt?{ic$3U
z+ at -;DLzLmnbS!L|G6LjA>thv1XJP!Y_%a3fFT`p$&#C?XT#_QhP_UPM8WKUIA*`|g
z_P({9jir~@FWuz07(UJxd0xl_aPqQ_lAs{?(bU2%ot>Rb#F(BO6CKWL5XWl-g&BKF
zn;U`BUn%eILQ$Rnx at DWkSb&gDLLq38Xa^ghvuXgP@&2?b)vY=bpNHBMK*6Lvbw1kz
zB8rYP<wqt%2NKl7T at a*AXQn2^oClkGK-#3#@oiyT6im_-5ml&;(lHk>3N`spHtIhB
z+93Q<p7TOcaRHCa)^4L~9K$0+JvcuS*wHJG<eXYvyXo`VU6cYgc55;Vn6Z~}*48IS
z;dQ03|Jq%TwO33cc$mPe3ymO at hnCJDY4W?GAtMC7>6*g;aBl!kOi1b68m><l6{e1!
z<Fo~tuu|M?k5AVG!enifqcN<*1wg6;gotqU_SxQcKT(lkldTa$z<v77 at RmX&zRNci
zj}Ldm!iCO_`#Le{0t2_ldnX#`gVBI1-#}n~M{4_~&71wLlJg{xUqxoTGDtBgasgM;
zj-13F@!G<12(dE3<JO|G2`scJP^8cZNWP-z*{SZI*_8-*<2;3o@{Qd~&X>XB2Jg80
zne5GF{M|(zqaD{4VrTpiX119RE at MdGGi{4l09^$;s~H{u@&vf?#*XVTHK7KJfhMK8
zu9>Qu&CX0umi)@=eo5R88%Y$4fND6|RW1OoP<-vPXV2(3fUZa=Or?Y#1kA;d3HXYY
zINV-7o%PoWX1*lbztY;x&vR}eK&!2RebI8E5#((yfV`CUs;zlFOXR}#k;*OhrE4$7
z8BAh at JFe>6s;oIMj7x8LfgdegVKRnoxh8I|3V4z7_m#_P^lgG4?9X2UK+;JocZV0D
zU{4v?k9T}!kRdU=0&d6NGy>eH8NT=0?`sJGvR5$XvBQC(vg<eSfHM<{uLh(66J)p3
z$1}raxSgI+rwi^``0{j^u>K05M%8fLJKFqFu3h2erhMMl6Q~K49n4y9E)TYa at U$A=
zKkv(~5Ka*q+44ea{R^a~>}3yy07l!fE9x?Hxc;o&D_MlduG8h*Y`;6wp<HM#pXveH
zck&5v=|Xi#y*Z3Mz8v`RPDUlAtmKUsa7+C@@CEL=2x¥V%L3zB79t3}h8jKNM_S
z3+O;}n06Qa9#JN9`MxR;!?+#U9KVCZWPxn|!+&C6@<Jm(!dZ$ZnKihyfMpAMy&Cpj
zi03Atl;_4xG at SY2C!+k6ED-SpQ*{2e%lq<%sJQZ6ui2TDz6Uv1_gr{h4cvSTzfeAf
zMG(BK(+oTpE`ARQ>2 at GAy*9U#+iaWbg$AX2P!{yXOKdl1;vRtejU6!yo6N%uO~yaI
z(*iZRZUlHaaaynR05UDVxl1?1<vCR=aTLL*SK&D}HSBvIg5ywJtEq6~lgL_?Yycrj
zPc_5ghFVep<LEGeJc>g65`;;uo6JP8HXkh$h~~TWGrjAX-~=kVK9RTwm!2~6LY5=^
z{-Kn0DYg6R?(1_b-u`h%`IM&DR~?^_esV at xi0(RFJhD#y02yW;v%;6d!Z?T}=m$-v
z)P;1>XZLDXzI$##JhBo1yV2qWNO)saLpSQRxTyi#ZSMWAsf$(*9&bR^!Px8|oF}0-
zcGYzIg<KN;;11#|qw%nmbS~W!!U><^EAR2O5d1W^d3lJ6%%Zt{HSuah5UZ33#()E{
zpB%_ctORJ|q5$vHE#2<D-lXT{trVcG(DByU;0GTSK;8Wu%<SyG8kTiigbL|w5Xt*o
z6XHr$Avh5JsBU8HfZ!yREC_6Y0DG)B>IGs*TSKm at swxN$298nxE;2p)iO#UZ$|1aS
z(#*-J3gekz at g}&d7-SfFO=(%HByA(b?;U=0;zt#4Z#toboXtIvBa|SjgzSjfdy>o@
zSpt^e(4m!-DDU*~P273@#5Q4gX_gjXo|swbCGsXUTBSe05ULuS`S4=9w!-+#qZFU!
zX-3Oy;e at cajkS?Am`lLY{>OVJ7`hJ^QJrF48c{FvMRWJH>w))-5bwj48h_N4pwMCd
z20^MG7)8x&ww+S-*q!I+DOt3+kL)FcvT0Hni5(p(@gZb0 at 4LGPjT5=y*|7P#W=?O<
z{<<OL!XM}6#8-ZJb!REoQf<xignL at C$`liYMnGclgZ8_+BSu&kg_&!=AKjU5(<IR=
z_}-fgfvIx%r;{(huBwF>Omsz14dv>ws{jF^J)XUBZkZtfnrqMUF?$%2-aM_4iho}E
z0k7>xFvQ#wtn<}lfgsI`^zHIO#YOML^bwHUVo|v#9Eblkf2x=Lfn*~&N?b!Guvb?@
zr>TA-h(F@@z*SM&tJff^Lv<c_&e{0C3qXU!dvN at uT8#RJwuPMAsJd&4vPd?veC_gh
z3Xlkid?Ck11^{)$TtB@(hRh0kwH8_B9+_v#)9)60d4sv*2#4OH*iSV7+CEnOQqYwZ
zfk)t_uR7fQ0 at qc$;ze2~h)d0Io>Q;1>_L>n)Ot1S6yURBv9x&n4F(Qn{6c9+I4sPQ
zu?>lp#8C<AXILLZVvW?Q1dw|*5gj1ni;)FhcZ_R`qx at bTP<CA!C at ZOf^jaJ>S0orK
z!Dy(47ksW!n;X~QzW4f8A0niQ<BE&Dv}+OWTMtJR9GIdtF)>k{us0%P0)cz!9#(O-
zjFDy>i9m8QS%j+1H7vMJb9YrV at 3~(WYlJ%^>L`u|?J-uhfg|)8h at MNqPgRVzH4w!v
zGskEIO2Vw#UBZXcOMB!SKIgPei-1mu`t)p(sz!G7V?a-(fK}Vr_oSIOX4piCb8WFu
zPckl$Kf5(z5afVA)<GGhL~!8FKxvc%t^__*(U9ql3u!=<zw)h|xrZgfD45H{^o1y6
z<iog=hFS`|W~s2jDxoAsI;g%Gn+YR1h<V1g<r%Y`SO(!w6TlcIDB*IpbmWb-`u#G0
z#j@~F5knb#`)ajEeFmOxqxsbb>DMc$>Lv(0dbuH(U(Mvx`?9(Gja!K^ap){ZnCEsx
z0?p5J^h(_1^wgI+;}Vb&-&c}fljJ35+WuZ4e7F!S>LIfX&*`sO0Bot*Lol9LL>8fu
z3Xz=6 at S&lv^JdL)zK9229v+IS<n^t`wbxBrYG>E9eeSK at l3mi@kfvj?aMf0CeB9iT
zH^ZhkKL`c58#{u9b#a=cK9#Q5>4JyV`|<eAaj;ntj(_h>1xph*ePe`)3akpTs!^|T
z!7n&t84Iy?LGwkjZkG0gVhTX!F6{*KOzM|*`S>=Z_6eCl2zNvJpYNVAX9;C`Ka|PB
z4qZ^!1L!F4SE!gQdW4^bG`zdW8&xe=pMm3$FfHE*f3tLt&UU0|x*$Nglq^u|(iB{1
z{TSfnHj<qhF$q0bsR@!hB at 0kJdj%J=&i`g6I(u%Baq3 at LXXIvcxxM#OXGI4+9wNE9
zc~!p0WJ2W&@c*~rK at N_pS+?f73Z+ry9WX>~^DflYbERVY;x}y=LW!8O<(y3uZ5*st
z$pV027u9=jDe6BU*s<jo=L}_d-=LcK%&3Az$#4}QYVMUH^q9|$XVG%Op{%-ypb+Y8
zelKpwA~t|&KrPLqcq{^2gp5m8$pUm&HOPMdp+{m(r#VkSy1;2DYWOq{rcTeG536 at n
z8ovKW_R{3p5ksLPR{QY!aqF$G!VVHE2}yqQ?mNnKNR9ATG9C=NR)%%Mx-`-J at pT~D
zt`6tb+-PkD#a<8hC!SwdylmOBkRDI|=W_?&U$?pQcJOECjODbLGS4hj!hi<u&gJ{|
z5{V2Duu}yzjzyZ!N?Kzl-GS*T5{0;C+O~*iS0&UR_InhuvG$iSM}cPq{bJo7+UP$z
zaiBa2QDZKjP`=}10KxDb?1E9?AIv*j4yT&ypT5QDqS&k-u!{F*f|2rPx`4*^t0W?f
z01lqt!Yl~r`uF%f&WI|?ek+8<Q)jyN=z2E+&%`3$@kjA<0VRf2f7y88ZiqOXpPusA
zk*0%)D<KW2(Xj8)cJFnl1M_#5Z{K!g$|=XHW9}#LMLl>sXt|io=S<r?mie4SeT=tc
zwVQP=@<FApu~s*`?MStXjJ&Xkly!%=hKU&Z=8ay({UZR>QSY2fsDl5JU}pR#0a4Tz
z&+=K{uUUSqHuON|9F5Bs`r^pl?zc~lK_23ZoldCCywK0s?4`LAjAr2s9~BwQN2v at Y
z+2*d({|E)<UMeMA)<YSrBPs30#?eN7Dlq$@G>}qijqg&8R3KOY(hMDgUZee~cqJUQ
zJ!|$3OFg||Q%0#Tyq^)OoFRJW=Pi$c*O?plpPQ-;8H5Qyp|Ch`sNrXD0`*pHkgN%%
z0dgtfg!$n;?*iAC_rphPtWg=%`7<%A{Hib)P@|BzJ}kL0)#U*#LwTi8jrIKti+Q8q
zI)X*IwRZD_{tthvLY5Bf9Wp_<jhOHDQzhU?5RC=JH$i1Vp-ey5VgpGK%q0Nqehz-0
z at A%6YPCfsnzwb97DTowTbKZDTgc3oOD;we~Yx9oG$(Vy8pQ`J{Py at s*(fCRV4FBWS
zdO(x5`*Chct--KRb;)-4I$+t}@JFcC0-vN6Sy}ANHfaWvM_7JtT$v3bzh${KJblsW
zcRv-#!T#04<2T*!N(Ez at 5GfOlKcl~FdAN<vGr^_am0a6E?OoeqsZpK_zWMuNn=uN$
zj}Zq at W9dOqFVD4W%hx(|D665*19=ni8O$Nd5H#Mv1D29%G3(N({0I6oY+p?CYlt04
zlHym1D$-Jr51N8Y^kW at GH*(6Ic1+UG6gj(9e}m!LS?~3M-Zz{Yh0boh#7Q&|<%D=B
zRF)-y!C=+}lPyE+{}HR-N)Dt}i1>+{moE#)3vPnC<8gx(m~7E`^XB<h0<m&aJUdvd
z4uz3B<qYPnh>}0oyw89SRf2L!rz>`Mkj9#Y`u9i$0bb9q@~Vj8D%ugj>Mk|iKNY|w
zu<!XXd;}Hp-9XjBftTOZr<m5xJUCwW!0^Z8%t2Tq&0wFYgx3(b5P%7pKyb~`>)VW)
z3Q at NquJ~}Klzu||rUWWGQq`LO(uT|%IDJBCVMeEg09GS*tjbU(U)vEVD`MW7<2>|p
zjdebe#0s+$RUxj~S9*_HoumRT{CaSpmLlq7l#QDkAu30Hb!HSJY=SJU>Qoo#2w`&x
z+vY4{+a+BC1fpElk-J@&28338Jn_cCe)n((6f%pD(p?iDLO3Y9SY}TNXu0)^NNK9&
z at m;!b|3EfJC~*RG6!AdW06FPOO`xLIQzhVM_CG9yQ81*mBhGZ0eVw6myvI|$swg?i
zkLL0*+~Jw`-;AgZwjlN4cC2<+#A#nQJU@#;Q4`JEstUh^2V&4MD9mzq;Lc%?IdDwQ
zuTiOF(vJer^QL6rd?r?oD6%L5H|TW9o&M~Nr}~-Q=K9&6ek~@fBwp~TeACiByE5(@
z=19y;RCyJ*&CZPVv=w*}T?GloQi{tmhYtc(2wEDw-G*2|%(zY$oRt2H<-?4pxyi>o
z_YOtIzezyxv3KJ*SriL=5`7G9K}ZVLk;+n#u3QyIy}QB`QIMZk at M8QXdBjag<oLRu
zj`|)&z$QekIR7<ViBOt>h>N8vXwG)<@M`7mpkBmqho9M}vq_&bF#jmYw<6s&Oe;Kw
zi#Vz&{GnRV0ZuEB(gUi}-;i|<qzc}Nx(7T|Q2=1xja99&PisdZA<#0)bwl+6(n_Vh
zkl8eFvi*K$>nc<k_O4mZ*e#zLBLiO74v!K@<YK8cj?pmgF!R9_N~8#JSp<(*#8b|S
zFd_V60K<Uf1Ncx1_oI)4F3wQLHPb+qa3H3EVLWiC`%U4OnRadCEkm9hNSn?20UAhs
zqUaDesYk at Zk1DFI_#h9?sb)B0i!@45;X7giux}&nC}OLJ&k{9y$2sn%%W9XmXQ||g
zf}{-G2Z~Kyz~fXwCiN5Pr`Xl6xpIA-$$R_Pd=r$B_#?Y4w^+XLCz|gd0=C0I!AxI4
z3_}0hxNo+|@Yp*Pk at 4+@&1rXm{S3m2A3qlqA!e%V&m)^rx*5v1#EN#Rq#=GMR8l<4
zLJEiMJqNp-5dxf45knj-Dr#hR1jDEv1AFwtMkp&50<(6Y$g0Mt2?VCYq at 8$iBe3Mn
zuH83;MxasH9U)=Uj at 40HbKo@M=E()HMe|nF*-2-)bdRD0aVz#@Sw!QM1-T-Pr^WVx
zceN1HbHa%geULZW7&1Ya8c#E<Fgv0EzLt&-xN!M_`9V}|VCs_21<aP8Y5S2u3gfes
zG~R{`>2d=~eeJ!8(XDSyAx_8-(Zima!e>;u<g1qf_!67bX%*nzgZnjux}F=?xP8}!
z1wMd(q8Ao$vJ-XR)J+l{37f{aN(Ger$5CUs_Bt=~6=iQ=&NTG*&wv=f^5wss0a2}V
z^ytwakE^!M6^Q%|h)E;di!2=ZdO*}oLv2!(G8`PXM+T}a!%t^ReGx^Kf>z6A^rQeD
z29U at 2$4B)I;`-_^0|%AzTolO|(GvJY@(_B at _kn}RY<5tK1VKNHkR4}`4AP#eE)cUt
zzvgB^m<onEc{|&5^de6?syOQ5W4*Nk1Ji0(H>>D-4gt><BUk(3SMJ}c<i-p_HXhj6
z*?2(La5>o1BR}5pY(YhDIZ^ZAPl|97mteE~^lcyW-*amP6464;4w*m+EY_;-f%Jiz
z)yVg at 9(%clJW_%IWfclD!$HIvZ*8CbOjT}5^mkl0+m7ru1^H4!rGQ4{O0q*(*oI3V
zEdRN<IB0feXja2*faEFb1Epfje!9HvhRmsrZ^jy*oc+lZhk#Rk|0g0AEpMDU*l0xp
z3%V&G>CilsELS5v^^UO378)1|Bp>$i-9M&Kue~UrVb<i~BPJ0(<8_h<p^$vb%4<tV
zdQqMiwEfc_Rjofsan})~Ab*c at OD9NNO}8IC6bq49uORD(k%awu_cP)d7s*dZtDx+^
zQtN#qN)ExVgC}5OtAXoHLcmpZ9!5l!aG7VPvJr>~IwCoeRT7YQt0LB$lp|_V4OJBV
z;fOTLb9V==_KE&$7OA4rP-`9)zo`^xX%h|P3?_Dc41ASP-GxOws{mmFzz&(&%r1P4
zh}#jOqv1n-wG+2!iGd~XNBQ)R!|dBpGv7QaLnXO6HGJL1LnaPH-sj1K_mk=j(P<wm
znDw9v%X&9Y(7yJFm`bQPOJ-Rh60~=Q83&RcV7(jTU7oyAXI$#cbJ8)AVz7KF%56~S
z(*%NUJ9cc(<7B)aIHs^i?%_^l{9%fW4<bPeoaQlXUS*{8ma}HFmNjuIjD8e4f-9r%
z-vR%cPgmvQ7%<h$JP9aQ#;1q8cu^#OapHm_YUYgCf*uB?^v6$A$ElX-HQi^dCS|BK
z(3A;Q92y`LksthAqlk2Glgz0P%Sgju0Lo|>g^gl5jsR#?jZsYgiaIJ0wjowjY1wLB
z|N92bsK`gtvn>ck<WZ?UpDy~_aU8d1q%!=$=Yxll4j1E9ee<X=apmmRvW=h+P|<Ta
z$3N!nO+_S9o}eCoj1e$Gv{D31m2?dvqJk8dl)P{|zWif2$ZN{<+}LW!DaC+Gk2R+E
zT6nM;YaZU$rcCk7?8`j2v5<yM$+_BbJ#vmcFUP_C`!%NlKNV9I`3qJUr&bYahZ>{F
zZiQJ+;t;^R#>u^t)+a1P>d39O%~F9fA8ucR^KYC4XnFKhr)SFm)+3M at ih)O9o|KV_
zwd2(S;oB|bD)7V|h+qLfE#CfnW2PN1csirTNh13$aM^m3+$DF*A1XP(^Rd7)LL<Zo
zu6F<Ul)a3c62PS|xeFvfyi_K14f_j)ZSi}YV2bjeCObd<>zC?W*AXiBlbWsSFx7Px
z at dTvvKc38s#i1H{VS#0765P<5^?lYo6E0RdNSRm4I3C*$rH&R at k%g_u{)UQdGFw&<
z69$!>BIv!2zvhd0gVYxxJ*uX{wBvTDJV{GMwL20SIU%9C4HXU<g&5Fdz={r3N_g$^
zCoKA5It}CE3^Y1&FXXhrGWd(BVjkD`mq}ZD4fZ6O1|XJ&8+!>Qj1DwOcG`0oI%=U7
zd8^RDLKVa~y at Nf{;9^vAuQ^;FAyaZ28$^EKT!^#8ICEq=+cxQKfa8N~@X&TJ^dN+N
z16p%PxC9wxEa(covfvlM*j$@*ANa#$Hg`56BDd3~5k#S4rxeOUHBqk&xk3BwBKZy7
zW9oy?Faae3!-q4h!>bqQpMdKNB;PaO_cNhbg3BFX8ddfG5)FhmE6K9&FhN8WgGTq7
zq+P4>kf_hn5Yg<O7%)aW?MQlq at I1>OXP`0x?p(H=DuV{jEvG1QlWu=Y>JXe=`*o`a
zKB#tBe~bceT#VN+y~yKKS{kJyxOsDB<NUo;-V8mZwi6*kJQWG-Dg6CFYOMKW2d?Ue
zZxo at JD|vc|NFDO=4bFHUf9T at mp|3SE8JbE3$Cf_y`SPG4H^NrfXt$ug!cV=Us$+pa
zAw(Y^5=PehzFW46X)`#Ye_8k1pdCrD#-IORs;+{!!N^E%DKRmF>O={smyFlZPrf2a
zEz+~Ru^hUZwzqO1KK+sCNov6C2-#DfuAi<85bBQeMRJy6uxp%41vJ#9mwW9Blxk<R
zv{coqkID1v!yyPFF^0{=pfOXs#jeEwX;wq2EG)Co4IxGB)Q49qWu2^Zzkaw!;xRkN
zDlcio#|{dBKt6V(Q4Rai6F`!G$yS&317Dyv;3q*HNhh&XrhcR2sHif8CkdQ at uo%D1
z>osM6Wwl$SSV<uczxYAH*=>ZCbu^^;DM?${s)JC`gKUp#xX3?p8`^eL`M at 6;00AF}
z2^xCxz%K*<cZZFa4PcoW<vayc6j~xa%gu-?%#52-{Y6h*cRwfzQ&N%>->4zo8N%Kq
zxs>oMEK+1thLU_byhV#cl;}ASuUCY>PBvC(MVUE3eh^HiKd8VW7<%f}`=F(Wcgw<}
zNS=0ZPe?+63(lIIx*N{V=SUDvvkRok^dG<SECUj8hL|DlkW~P1GzqOp4xME1IQ5WK
zCtxr at f5&W!bDP$|P|Mk at A))>8Kby at tcl*pj|NV2<39c*Lr}S~TB1A&P%k*E~Ub&{)
zJ0MJO#j=2T74 at Iyt@I5wvDWJUuX!;)$N6b1e)u!r>ph3(+R7&jPIg6ZaWJ$R*w)uS
z-QPXY?_n{@eZfrud2Q=3X)-!&m0gkI#KPIg8fBt*LK)`PZ{jQKdDMU at _$uG%Z9ec7
zRUtMT<z^iksDepS{l8r5zzKH*YVuulELS&my??I=!4A=UBv!qRjp6?D$q%ymwyn9+
z(6iq=ggiMg8O)70_+8mn?8>1WCmWws9(;;~pjmL(wemWBAe~|MFT8R1hf+xH&_VeT
zT(%Odk$PlguOduPVb>Il0i^&`iKY$cLd6bS*EaBc&g^|45HUz&v^jXL#v|9+4GN&+
zQJvAI)V<)d+99X($1&XvuuZiP6qW+uLzUmZe_x1PU at 6`z5KSI32O;{WCniUaitutk
znB%v$EF03myR>H(OxqYBR11j?8j;8mvSe8~u^2&O=|v2)6_H=8gEj_z6wdAnHdw;M
zp=dDvg`jc94!z`BLWMSB<=YVy_7txTtq1ECgY7xa>1IbcH_5%=G*p~J*rj`Jo^x{B
zrDRXp3wbtvA+3h`rXLa1K{OQ2PPfe#8P9wQBhj!=vVc;9UBPra()WP2=|N|e$JIBp
z1`(2XMn`HL#)A5x)a{i#)|P$Biu-iWtrQ4{_!7Q`Q5d8;-e*s>U1yn|+8t$r6zXs8
zn>>9Mf^`aJ1=9m|ey>Ndk_1BY{g=kSAZ$hXF4iyf^ugC=)Tv_%>6$(8RUs+t2Bl;-
zgV~(3VCBOmlY#xz*<gxtbak?EL1}rps at 2u@aX1!GL90m|oZf}LJU^5be}9nu;cog1
zrvjAVR&ICslN5a^t|MI`fi1|H7=<2eQ;26w;R|A26q3aBfP%~@h@%KN*6_qCu11zR
z-caS4Q8y_G2oA}`IqK^Bv@`T<&9bc7M0h$TZJ<C$d^-ON`@$u=6$zq((<IqlLVxdX
zv%LZe6DqkdPxG2FN~wTj>hF1=A^3}U4yP4$*dS7i_qy2$u^RdWIe(#s<z=d8-56_v
z`30dA-JfAd6~1kg4zB5lsFcxmzyWKzzOy-a at E{2~=Pcr036Y?R+R-ES)W1S*4#F|j
z-YnWRVpoXpsP0bu9lnl{H3M;|+QpPUe;xp;qXfpmf#3Im=Si^cm(xQJ8#US#2XKX@
z>&5!jz{E++A>N+gO;H;ga_P+i{!rB0L5pv6R&ZXj1eh)maWcfEpufML6yE4Z$zPz&
zubVordA1gK!30eMDQ0ECL@>J}MPdF8iEV$u?2K&G-AlL_%6s;3>jauq-2~&E5YkJk
zyk<t?#+q;e?dccP)dDfivPl(b{^80kRc6gPYnQQ_1Vhwqv#B7sBjM}Q#h$;B<d4v8
zj*T;=LxNf#;4w?k%fLxu&Sq%AXzlB>>`lW1biw8v!!f5e6Y9gkl5b8+3BH5mkC<c9
z^U`XNCQqE}9+lkT|4P6t@*;MLrrDPt*3i%(7J$H6!NhYr21`(}qwElzQ4kQ-Zc2M_
zM74692E;iN(@7KV0^PL<nS0Brx*~YKV0mRYst&@UD9}nl+IH#l%oxeYNXSpGTZn*e
z+Jrh<;QlyjpFmd*X91c#E6nY2$^dJBLy{s~9iWG{9dBTxJcDJKVWGfxiohilo_hne
z*HOHxjFOWj9R}^io#ZrfJSeLcgXPz{>*?U&&`$L$67B(An!<$Q9ouEvziR<LBqNBC
zXq!+5^#TYVFlI8)xM)ts`-gBg3svHJCTNElrs at LDUuNxCX=`a&nGcSU5^1AB2T<d{
zZZM};LL}taeH3$nKben1w8u-Ga at JUm<jH#=J4i$YqHQT<)Kpe`mDEx83AnSEIDHsM
zwCTHN=i@)z!_TTwa6<`nDdVZ}5Xw$YP7Z%1yriWARue-!B^l4?_*S17YTqL*A(a&=
zGj=%n+%+YcjEsOKrK2e7G@$VZ^-#JKRzgiHyJnLgXY;MCm8<~)`@~rxFXTsOUsK3@
znT!mA=q0Ff_#*osJcKu1PI!w-iAZ4IcXke>Q>sM73Dp*}7ssl5Ksh3Y6X*h-*eNn>
zc52mda^f$q?jEozse^W-2>Zc93SQ9NmX+#Fcc|{-g5T+&DmLlG8Qna}$V9&r3c`iE
z0*CH+Ro#um!J at 7vv~(0x)pKyyo^04{30f99kVE at Z*A33S(`Lft$j6DCT at M**Ne!?Z
z at rC5-djmBud<9HrwiLdHbZ5VTJG3z~H!ng%5j$}cv`m_wpRPDK>-_zrvv|OdEHzuO
zkn!vm%0A3ONT*6lN5_)VV^oI!+~2STxF&p1u(OzYd~nr2BjJyG1B1ozD9flEPWr3f
zz-ME7py!N1$n9lKPhfj^<<pq81!H)uzw*PrxdPUgmzMnh;7f;ER_ at H^%j^}@bH#Kd
zL06s65E2xuH*W!933s`Qf7LxCG8Bahse=guDz{J$W+4QnnV^E@&sAKvgxVb|BP5dx
zCvDsE<$z>#V?6LThq32`Ild2yr`@mg`Il~{w~lSk`F=+x?_fJ4=L#9r*xjtWbkZ$Q
zkAaT72y=t}d*2rN(lF!*D`0DC6Iqn45wGaZ>KU%r{TAZZbaZxgG3}>FqYlA(LML4G
z^z<liSc$?C&U$=h2}{^9!!OywB&}>WrSNXc!7cg<>t_ at KHk3OifiY4-x?Ikhalv*(
zmpO*Op1Pzc`IY<69oeQVLoi<>`|Uccuh;BkffUwPY at F-9-R6k#DEU~T@&;E at 3|B at x
zui;@m%o&eJmO1Ys#<mEI{B?YY7$;eVL1JT5bYkKU+mrkx01~1Q(=AG?s&v225!s=<
zkM*zP`{8a${Ze!N7AW$|5q(F4SdS7H{p}WMP<AGsnnGe2e~JdQ;Lo at uYZotBC`^=T
zt^?66Y|0Cgg*vs;{aIoJw%NU`H;dD=wY8;lbet3XTUB6EQquqFGiGOSlOdfB*3<7e
z%G$#nbEpS{PP`CL8sO7#Ebp{nyeaELPX-xO$987HrO?pjRLJbTW?{#&k2SU5e|EY2
zuMym^r!LvJy!hMVwSRke&KSTjd(d%-W=VK(WgKa3 at fEB$To%T9`_eUct{;#KO)Fyk
z?hbpF<(ygI07bqM08e<}<ttZ~T1MI{hktVgY;NmWdnm}eV)LQjporY#yx@$-GxC}s
zyF}7vnh-pwqXf<_tYIbFRK>IN^J{q+>$+)Brpm|e<9HE|v1Wuq0 at 8tqLG&bi%&Wme
zl8(5RWd&<Y%@hB9W(=Dm>!n#Qz_w=B`vm64;nY$?r9oU}G6_gs1OfcYXHTowcb6k1
zXq+x!Tc(MST*G>THL>RWh=19;nCr;u!;QbXuP-TK*BY5FkBnk9JvrPV-+h*9nr%<Q
z_haeAG|<9HYflpQygZY&XqT$LZRdp#sGTW~vG$0q>}u#9KK9;4%zO8rfX?AE+Nppo
zH=Qy at ZHo{Y5aHgP;;a`E<g#FJ>6rxwfRL!VaivBV)bFzIcNzX}G<|fJFRXjBnG0>Y
zyoaxbhcOz#W-MV0<ccX^81e=?py%=-eMo9*YVb9d41+DWY5~Dswo6YPPM++b&Vd8G
zL|e2wv7V#+mv6TJ4h>z=Z>CvJVa<V5EZVx3we+DgF<3z++cd~}SU9=*WThB!ni~{|
z>%yOqAGR<samR&<@^W85gu&PO-%a=CcCmBJwuStJ231egn`0CwDXu}oK>^1+gw;05
z7F at x4&V7rv+O=*El>gepK2V!sqhB=e?IxR8KImp78NW~C*ic)6KTGS$wxgl+zpado
zZPXfUp*@(E-S#taVX$V at Ezm$PwTzFohG*XY{_T;Lg01!?2Yt^5y3+6ayYKr+bcll{
zOU35f{)Y2y(u(ZnWUj$^6daZoc8ioyse1vlOu=JNzPfC~x0}>#`F4}_zpi#U66si@
zl4Dbw=jQz1 at 1yqpeR|spW^FU0PrcC-QvK%c%0mCmmX@`_^OJO$(k#Oa5;sCTznYTJ
zUEhs~=i3fQ>mW1f0UW#41iT!Z#R_m|9Mo98D`Xe7HB_HwEvew*f8S)L48hz6u92q?
z333N@&o(zVZ~gvGd6sh+)FF70x;_yy8jrW2!guSxZ}ZJXhUnlnZM|PWiG?Pxw47|0
zxb<LAmj`KT1KW-=_<3RQR2+nhXm$h>8j*H7Z)QDPz16ql;jmFsQj+uo-rm%+^RG?n
zWZc2BIyf69VRK%<cE&#y%jE4%)B~}N$2ERp+u>RZ*d~P%7|YKbxtN5<*yD^*0)m00
zSe0??xkL_$ToN;<0bn(X^$l6G|2rP3AJOPUQI+RtnqvuF=8QuJHD|%W$IFt)ZpURh
z$@^?6M?yK~ThJ>HfVr@|ulV6_(T#o^e|7-ivHr#UE&e~g{Odn|`oF*Y_qF=ptMUJj
z)tCnd_$`9th3ZSb2Y-gJ9_}b9fk>H})$O6UjhAHy0FOiiOMR-jTFqBVYRxPouCS(s
zFo5)l{CyO|nO1HEPj_{6!Z77#<`<KwHceH2O4vax at ZE2t4qDV8gWvGdYVL4NcmhXy
zgqJ{@3##&_)cXyhQJ5H1$K5}|@r>aD#nf5O@*He!Zj5^${Q)frJ{Z$M&)WgE&ky`Z
z9Nji#6LnK$uV=Qae<>5}-8D%zL`5FzN24hX2u`&;5HXeCNB$SbLc>qw{~&MvWULhG
z!&R8o;!W!TWWAgs_GQRL-EJXp4TId-GKhK*y_Pld5&9ASe9PoQOz~;3r;lQ9dw`ec
zA6&m_(<ZPJCZIsfFa5?AY=tH<QnE3HFY07}Hdg>o{&4YQXo5OuL<V7X<jiAtg9cl2
zDCNBp$$*ZxlMGY2Lz=q9sqc>JX(?zbVjnUl#T*(EJ`c9Yeos445>H$Z{Ns*KOp_$U
zyx!hS_6-gws7hgWJBgRO%%0?LKp=29IW|~u2#*;Y$>^8gPAbt_?2rb1n|N)T)j^+8
zVp(HA)l`F2r$%ISho|}1{IH{em<gxTc at U2g>LiiraaE=@hHXbG<A?<<<uN$Hgd?*K
zk~OLb5bXvAk7$$%DIT_v8$h at mR^O7wP6kpR31W;2rI;kBsyx5kGcH2K_|o8>$#kSr
zBwaHF5<G8f2QG at ZXnHCs+-1FhfI!h)9Xs^<G360d!<d>M!Egq=&OgJ~1Sloa2iaZ?
ztA&T{Olk}nqF at c`$V;gM6DHDsXbhmPgr;mDp!Ckq2)YN7p9nK3H}hj}Cj&Id`Zj|0
zzTWls9p~rU>I$K~Sii2FrVtPdMLqd+Es%f-(%;^VZJ$9yFS>=;%%Y0?IH>)Y3zC%9
zJ6Uq;5IYM=ws6&8YL at 0%TvPD!r2a;NBvkW-ZqhM&vn|os5D3^Np5l_Q_NLSt9lT3O
zEOBeg%r}(77QUM{@8LhF9aHZx%}OXnWf8Yn);LHCDtqyHwUEcrHbR<|D64w-09rUv
zb~5P6;8(j^NHig$uP-%d7L_sPjrbd^P01ih0ZAgY2tsdSbxqMRp_GAQrW$R%kovD~
z5*C%$q~2fJ<=Z?1)@3&!Aj5V;e)S#2v9YN#?xVj0t%d9)pCFM9G*o(KIe6$2V)v=C
zyB?-_e(upK8j}D3<{LfTZ+ZEK;b(<Y0-90W^n1or?HnmctCwwHnH(FNFLOxxV~PK!
zLNn><!0G9j<=|sQXi+Lb3CD<}dFSWeG9z6f^)z;XW%WV1WqE at w4yrv0(?zJbt{_p5
zbz{2Fc_9{lXFJoPMT;<bjZ~*JO$EulKbGlnsng at fkL__3ijf7ZpoSzGZ+Bkk=+HLc
zZX=8eqTvfv87p-nVw~#Yf!jZo(%>9yOx*AM-<EmbN=h6a2BCzqi^Q_jN<vRaA~~gu
z0q7NJXoWp&LfOd3Xr9i_PmWMu63<Iq1h$i-!4{Mr39!c at Y~Ut2&Ag at GO@ozfyI0x3
zagj_w3cuGu69nABlqh9Ty9qUD6VJ+sC$F)WD}yK|y|I|r%oJ57i0&xOpzS~ln_{%Q
zhY6Z)h16M+P!#DS2uF>tcEcbDCUd5SJJb<<ttkzo;wqyDaq7SJ?C(p|h37}|Aox2D
zqIr<QEN^f^9H4}|gsSv3igcdN_va_?|JLmo=J!xVa=cg5YZZo+X<Z(mX+I=vBR=Sb
zba!OSis@%#PpKkFhlA=JM0{Xvu=u1LRYFpMirJDBFwDymz8TLM4_y`^UzUbS8+GS0
zE*7l8x+bE4Xz~X1IDTNK<9=Ujc7e!4fO+mK0-Ax;D2pUq|5y%9V8H2Wha at 6^Vjy*E
zE)zKKv1{FBZ#wo=SAYYPy^2~s(Lo?a>`Ju3FW*KThRTS&fj1<m>l|-5==k7Z(xD~9
zT28(FRl)nGMN&r+J4wF`HC3Ff1gFKn%7R6K=C~~BF+kx2k(-19kfevmC}L1W><ygC
zyRwI``N+K4r>E|?L?#9|pp<|a5oU?zxC%{Bpt2y1{aCd9;}aT#_X;K97JIV&@mZn`
z&J3L;W&kRyC8V2n2b-H?(*(MLne=r#Hc(YdrqqC_Y19O%(#>=dB8%SH<S{eR&FGGB
zzDVOs+Vl3fkJD-RDGd#2rzp;0<gymj^MRP at Ajo7W;X=8NQi<O{L5Rf0^=4u(C>~Kv
z!|;Gr2uh>2c4m`ySjzyaSwJSwRAsTqpad<SdORmmA4wa at Vd)5>IQOuA5{oKEmnA(f
zqU>&1L%B%L*ejZfLZTUX_W_0kC&q88XSaf{X`u85@<a4;k&%&(CFeu_G~Bql`;Hk#
zz^x(+ph-0}AP*&Xq0xM*PryDDsT7My5`@84>HU9^9Y56n at 04vHb37p@I$F|)!c|G6
z^vRlQg3}pxZL3jQ4xnibSFu4&8RU&gZ9*+tum0YY0B*hz8Vwp`HH?m^-72#_!Qi)u
z!NgH2S*~lagev_9qNpov5Y;Lg!$@bGzf}QF)pPtGUgfdD7MhrM`Nj>yyW8(Lz!8z2
zIjuIElntb9*~+h)hjJcGX<=&pP*)CSz;k#|FSQS9T5*Cr=I at Z#Q8kp9hf$Z4`|Qmv
zEqB8+k-*1uqQdy<>EcSt2UmliqdAl0PK7v6Iyg|dm^zSX5X*jShtTwj60AW7n)Lms
zV29(A$8J30M>1_{vu}^_6Y)jF5{R!-|44Ep(k7DfpJ{5Y`FbCQLvtobu+*|5n+DF1
z_?na#<i4oJ5@$Z139K>nS^9`3i6OvKwH|N5Y?xIjEbl#?@yra*jzdFZ={$%1j6?jm
zHc at j8weeDey4#nAgx{%Kop?%nwBKF*nx?DQ06K;I#4yQKNUVGF=FLKnDU4VQ#Co1g
z-hx&qe)RJ4A`AusS}e1Q#zh$kA at G!&oJcsSMM-&f;|&U-r=nfk#$NYnt9V4es3ips
z4Y5EYIQ#NQG;zKYbLy`*c|^4r8m&Sjc7{Ib9kqKzE&HgbQVsF(_zh!rShO!hW!5Eq
z7_PX5W`3~r4&$Qm)Pe#eg!cC4QA6~u<q^71b5cps;4C9>UYOL<q(V%=VRPIqvLCK#
z)MY`DA@#>=n@@bWm&{I#;Nd6$Wf>LAJN>Zr6Jb+!xx>oYrtvgjZ7CJ()@|Bkl{sXG
z?PCWJQYB?dZ(yZSefn`7;)0JW44oI2Z2oiC9dQwiy#zn1lfVgG_6xon)h*yYbx3;T
zg9710^&o+D?4;c#X_b)lgVayZQf@%iGpD3)-|;Y<Mn!}cc6g>i5l-Mbc8Jg#?o8vo
zuY5M$+tqz$zbL%6+SiFa321i{Cd3`mD^0$xJt4wY6>^NVEf;gB8#UzXIJEA$x~8bs
z%iI66P%`Ahm^v~RcDOi=PkL*0BB2Ax$?e8|?R8EP&rCKB^X;2-iGnlB(Uk at m%r40X
zc4#q~wu#%S21}w&bRQU3{9EhzVngSaN3~*CM~8$c)|VZWPhdyjaiSpx)LcOtNh0(9
zGnk=n{Tqr6Lh5?kX_h5Hvg6Zo;9dByFB~k8LqDQQ#9HZfG?r8IuyNcACgfo*&bKIg
z$Sj8nXQ+}cAy-DC>J&WBvV^$w4eHl^15dQMR*cRGly_}?)4ae0dDrc;_~^Kb4|oA|
zh!LD4m{3<Rb854GMv{7o-*{dB4XSfd9iL{Di1UhulY)chCXsDpGDK)P=b)c9v{EDq
zr&=hG|Kr+82<9UVqe4dD5(Q38(Hzk`(LZV1AmuclSv^29+Cub;tRQVORf)}I-he1(
z>dPn?6#-&XE!kYgNG0UUm-~XGD&(eyUv%z-ei*AHZ$MQ&>S9q*|F!pB_Wtc{btAwM
zyrE^5so%y+#Q-_xOgHTjCmjvsciB*U9;b0k<}wVgKN}nY2*$Q!7_udCl1AbDKe3&^
z`XrcMlKo-)4J8xW*B-v7xuK9Z5Q>QVJcemszazCvshiY=u24vNhQ`I*nZA6OP$H6C
zs+hOq_yl52;$AwD at CNW<JIy6w0w|g()$FxLX~1KJyMJt;%*NETF;CmGh$DPrd*2a2
zxA5 at 7IjTl$kqZK<U!Eo`yMrc*5OAPMJ!z4wp+X`x4^3 at If*&MbhlIJo)EFIP-XsV`
zu4r0%X)UK~Y at OG2nNueS4^tC+Nd{o77HUW&OMyZ5AEIeB5ETT#Xo|2Era*|pP`GjQ
zjrHSgVo(dF?j4emn4lFUCtb+e at HoK+Le}GW*WgCGyQF*V$WJC&4$XM;HN1TYrTBkC
zDM&K~pfdiATHR70zLKJ5q9#vDe$cUWd^^P1VxCju1dzlRCGLlul9N=T<;9b at 1EY&X
zj~oB}DmaN^k|NWLL()sA^l at mH0qf*f1h*M}*8)^^- at y*j6vjj7<*WG`iF|+=+6EbL
z?4bc5FJ9u7QS(;938vA7n6<!*lhSOTk8v(pB at tISFhv+L=OC~H+aBb8DmUY1=yoNh
zWW;HU)RYmdV5|*Vu01ntFk0aiv%^>_byVZ;pt#U{y6-+s5DYy%=N0r_C8#E<9#B91
z^cRjoWUay4*Bmj>t7OP?EJu56*VivJ+!UHSnks~+UoOqnN4Y8F8C3P74*PaAUGKHm
zR&A&D2$IjBaD8aQ^en-~wYx5a+zrBXE at n<4r3As+1JrqfAijTthZhbAWzZP9{M5FI
zhI4r0KLfyg7HOy8L9N$-RvoyWH?_u75gv=|4S)OKWd`UDIwCZ=;v%o7RIj8se+4}a
zG^h;&{<9<pf?ZKrl9cc%n18`>Z;18 at Sf?E{3NyJB+{~f(wW^5V%L!l6p at 7)Apkmal
z<<h8K=*9!Sl<J}x;=o|kUs_Np&?MO!9 at C3-p=1cp<>cio00l|AssvmU3!N{iJ>*97
za572RqYgbfH09jXx_#LO(#q#FJCPVGu*?VAJN6{dO=m_k3n+e7xF?Z%ljfD63o^$B
zy1_h}DTE=mo3CTqC8?Zg!Zp;I?U;J(3zlR>cH3UbmSuR>^4mkw^-JsG+Z#Au)It)*
zK|zir=qlktGc<?}VL7R^%4^9Ik`vHKEnsyT*+s)qhf><;q(Mxx5`CUNbm58jx9Byg
z6@;{!G#>=1?4!C80+TzcQ`y7ExnbObg;1xnW54Q$vq8oXWZ1f4qdxYBndpWIHDiaa
zk*JAL4#!>5P~DrwM`MHBp$uXsqoN4kj&_HZ_`T4dVB|*b%Z3X$`aINHMaMwMl}4DL
z*e*J6dhrMix}$yT at uVJdiUgE{(d6cSXdYF{uFNBSJ!M|9_uVj*lLi5+>BLl~qYgp?
zpZvL{Q%irW_Vz~Ml}ZpDkkyGC6#J!jgcvreiGt#&H*ZP?`$JQ at HTsCzLWXek^0c|R
zxe_oYrPKAll)53ai!Ovr&IFEADFZHPZzR~SoaW7rMay*y at x$EOY$&|QeZUoEsn5%g
zMyE~|`ncxFCC<J9aL at X1ml21@NB!UiF at P8pHuPV;pz at Pah81PSky2udWO{CD2ZX6d
zNZJKrm>?f1?sjHc;#n}(h at tK%Nf0u9fKJnyuXP0^8PMq&YVx`VVT;I?PF{@WL8HDM
zAAgA#Ssl&j9EO~wKV^WLi)duC^I>NYp{T{n1xMZc9dVzEoz&ITSmkn at AT5Tp%?KbO
zYneqLquA<+-=SVnn)(&L%8t?j1cSA7_Z6<^Okj;nF9DW3^h8okW3KB-oL&K_!ZVr#
z)+jNp88aU*D)gs6pjoom*%gngaMn#hCfXy;42{kSrT_Q_)9%!llomsCO)?_T*AU3r
zG^-CYA*D3c^IKN`+PMor(FCDX_I?CH3T1A4eS$0Cen%gTkO+{7m&=;%;R;@!Q(ck;
z4aW`PD9NqV4}T at pPh^f#AWg)<6bxG7xc%KI%N8Qe&<OKkMDgVfgVdBrePV%-JLj$5
zWC&caoQA#y)}aTHnbCS&o$~pQ#-M}uX;6>Lk|nZNky<3mYKMoT^@2QQORvj(eNwa)
zf*E56_|bHJA4ir$t#;>E+rhfpA)iv$&$zsP_lgN4SgW|r<KSD!Gjq6Wx$JT;4<6#Q
z0 at 30_4U(5bLmxFoSHq195S}2pM-5MS-k-o-{hy+!v(N`9EK#;mWL}OuRT?|n+;Va>
zlohERQiCSXnv0JjaijU>Do{|}D;*}xLDTjt%%*}H!3D*@K`2>J_C>9g8`Fm81L!gz
zzoTOr6fHTE#|`r`znYjuFx}7r0zJdtz)%Sc<KKgZnun!hNpOxn3e&xs<_;~Vkv}X&
zOK0oASS7Vbe73JB$7~1ZvbM)3yVo@(Ly<*um|9lPqK77e@@60TdtMOG_ at M3J!ONKk
z1v6jGxHodX#q+mzP6G{{$TsCa-={q+rFp*l>kyH1Eh*E`M{WMpW=!G+n%nJzbY0?3
zI6-t$p~e7#D at EOdkn3u%Wk#w4Xqf>=Zra7{^~5>!^MS at Z<4+x(q&;be&!XPE<qZ$u
z38+V694L}f*!ZYvi7Ut!*3%TnotCl2j~&e6knF?4i*?>na}RZx<Rn$ScoB%mzJ^A>
zg;=ihpk6OZvvJLV(XzRK at 4oN;xmZHPA5yi}j{X$0s|cin;=4wu;{$VA_UObsBkBw`
z_o(744eG;QT}|b#+CHLA!+Or!($pdn?Gxii3`)4aF_h0MrT#oZ`bF5q!DA5!NlFMP
zG%v$E_!gfC91%@8chaMYIYk%($w{t&hP;_ec#<o|kS-#~82L!Rt_D3w$%)n^Z at e>e
zF{Xr*w?t;(N_li|2QS*d8A)HE&r+m;tIlUkP=_oecYoHDXk>!hP{O;?*uwL+$#5La
zPE9t{K0!fR^|M|c03x-zah&Ga^r3N1_%jw+#0Bck0Mn4pzt|2Ix^EnrC$Y;aUcQI%
zjFG6bQ;#gQ!pyTt!z<F%v&&m*sc!$!nd&e*=3q$fDFdelbB5f*!}(c<MMQ8FOm&KO
zU<8mKrV2^WG^1xBchYbqN{GBihMZ%qkKdy>NvTFi=VOF2$_VPsJwQzoHna!F7{7Ub
zcsy>)C=wCTI>1J4Ol`rD>_A=~K%SX;%AWllf)&|DGW2@$X;3J&mlBSF at o9|Tu~Al5
zRs>CIA?BoLq{-~(SMboBfnk_&A%&rk=1Zrjp@@dDA!9i|6UAUhkPeh8i&trfP>&@I
zO&Cm_X_Is%skXTuO+=z3i1fJTrrM_=XC^iHI6mgoaP`Iw9-5_2`8L1gW2S=?7K>)f
zcJG~;XiQWH0(%l)c`~k?k{h~y2ga2NJ5ClPyOJyzD*pc0D~bMslDUvd3QK0QB at B?y
zlU6hD#X|Gvto?I?0n=*>eokuwLAsPsAX+Aq)wd8+O(QthEBgz6ZlsoLDOgs;R@%BJ
z`N~vGh^vMHc0jlugw-oT>P+=4r3}DY9pa$u!7S}&QX+9V%*16!4~~DWhOAAP4W$m$
z<pRDzFM$){7aG?`XBUbK7%Ppmq|Uf-i<|B}-??ox()EvapG5f#W150`-~^GC{wkzi
z+M3;;TCq;nty>|Qd?pfh|Ia^fEChG|xFVZo&mtMp5ubr{A=a`gDg`LWFoWhE5Vs<Q
zL3P@}oeB$am<R}B#ahgpu#>e1Urs}CR!m6S at D0_d641BG%qG|ZoKZxBlZjd{FR>V6
z+83b?9!kxJ3mT?hqn^o{?F5mgXxeM^%;&@$>n0RT(b^$^b9t#o-TWxhdwP|1(LXXJ
z0-8Suu<UZD<Sza at B4oi#XGgZ<@hLFc8&5^=yJ`^TTjIJgoC<YBXYY*u`xJsnAv%O~
zPIt at _76d$O=oHdivIM2d(k!l{<T1;)Q1Rg7Y<<p9&+WTk0y?VrZtYqieCEGumS0*_
zqsF$YM`@W5d+&k&@?Q3bZ^+vNaqDZU_bJNkImUi>ztW`*d(Xd&U#a?EeBo`p&W2va
zTbAlrbg4fZOFOtC%y~$9vP?{x)3!A&NCkP>1GpPKgz1bXzV#}QZofo9?~!eb3>AVz
z)Q{x at 8Gir~ss%GyXu5dy_I=ozNAP}$NjzL!_b~Ij-kN)Fw0s_tPQdxY(&jdC^dBer
z0Qmn`)WeT}p?5&Re`tQ3_P{9b!?Tb*N!V53D2of(Ia`ze5BA<Xoa?;(|2EUibTv^k
z?F+41v`C9ms3z^Jh>EmtNGTyo%+zR?q?MF5TaqGMT1F+6HoMSHAu6OO?#Jn)x#s%a
z*Y7y)``_R1+i}b>5ueZJ{eHh*=lMLJ=kt8NzVHmP!xwGw at 6e*fORtI(Cr+fnTIXJJ
zO3|Y3)wjvJl+{hwGn=6*i at 3J%9LM0~qX*rmdRbAjw)Dk|6C_hHm(@%zn+64J>$FI%
zSt*$N0S`^30?%fRK7A$wy9ReobG_n0VPQ at eCr8Vn`lF4u<)hKR{`zZo^-04+(t;_)
zf+!9K`}7&O<n~E=XA<-AmpEdOaSxlF<o5PTj(^!}EYO*@t at 7!$20rb-qjzRT^Tw~y
zHg#85SI$7l$)8%njQc~HhEv9iWfY>ast0wt%jir<%NeI8wv4oSY|5wb$#tUYm^ps@
z)+QZ?pP?F$(>&(${=)|&z5{QyqRoz-J7>_DiCB>E)0VSsn>Rn<p{8raK5`ES_F03r
ztTNB}8)S?weD?Nj=+me3zY^vPANX(T(`pAQ^6+r8Xj^|+>tGgZ5vfpf>h{gp_qzFC
zT>WA!XyM-GL94T at ym}d*-iZ^;3$F at xS?E#Mnk>Vx=_lN&*<ZJsa)?`<3cysJ5?~r)
zf?z2FZhX%ES7>)K_)0}=c!OwKYu@?wC?{qF(<@(^=%&U^Ok<>6#eT<)<DQ<s;LVk{
zc}DI1loVrRX43)SDvKy+K!7fbM+Lux%il(U7{&`^tM+5)ph*Y4K+;x>PTQv)qBXlI
z7bLBge+OV3I_yszz~{@$zoz_+ainF6yX#{`H%~`NMR*>!9dn{>e*^89N at B=;SX7!E
zPH`XgShc#(`*-giFd&;6wQ63%tQj-BnH#eYofGq at v$ej{htY5lr{U)pwkdo6{vnzI
zq(}vxk)E-y?jM~erg>NLPJW<n-_>^DSe%^FDA-%JZ(qb>-U>=+d)Q;)qD3~tpIzIB
ztT~j6Hi$=GpgFr1lDnP0bA*2h3su^&)h!y#1Xl$Av1yY^1-eRW8g80N=Ui(y+T=t(
zG+ae{Ai2lBgEtn2zlMw-tou`O8*M9Z_SoXUh7B8r at Ydbc2guAP_0%z<Y5SWL5dKeG
zYjZcxm{0~|9E at U6MpTpEv!=w at u-EMKCwJ`qu4Ge@(O<THs&d4W=K9i)tI#rr@#)$Z
z(ou+`tGZ}Zm%0V(milL%gzailNnU&im??Plwq{)8zFa5S)F}bG;Z2TF!^fH|I;MMW
zR-ePeU1ITGSkY#ERe4aJb5UQPU4Gl%e|o<ta{0qiB&ESSU)|bcpzBa<NQZE5<WGM3
z|4WQ<C}0au;XjdiiXCF>?xRO#X5VlDk~5_0*T}NQnuWi8=gytRWfc|nS(<+d)y;EN
zsUXkvrkSak<k^O1_J_*KA*q`-ZL&DOqnc?-l}O at _CA)a)Jl$~gc(*l6R=y at I$ky=B
z^EYUS4c_(5qd&&OMdK+D&xFMD)Dy>#uh`fxIt0rEYx>=T69Gu4DI_#NL}yigjQ;iP
zq(%u&Yj#o-X{f7Te>bDUKtRK?UbD^}^RI!-?$xW;?aia>ZlzLCL&d7xtH%ms at 0dRO
z>rZVK{5qck`cG#`t;^wSZ|~{4rLpm8J=z=L$!ePxEnL{5O`AZVUAH&UcrecZ_qAx(
z&Z^Cwy*+k2l;i}_W$X4P(@mY-+2^+>1&O;m9=LMl3IjPOd5c)B&d&)B?e$6ftF8F;
zK{k#zU%y_S>^n5Yur%vJz@)<)HRoOmgcE6B2x>J3KKfqXXf&%2%w)uPcJwaeD;qwq
z at p5%gPo;dspl)fPoHO&`{rlC0*%Mkm+1q2j2ams3_wL=NCO>{`4h?f?!nWsPe`a5r
zmuomLc5RSH2YstiT at v4wm#2dK1}(d%dTPSno5ebAL5dySA9^I<`yYQkc=2*ySeX<i
z2$d^XD}^vOgE}itpB!2ETb(}i=@0OAGqyGBHpuqr$lUn#86}q}Gpu+vW`O5Qy1HG@
z5*yyY6Yuu#KtiGiXw6;SHY|^Dra at r#N!~)J&EWecoEoKG at MBFu=`<^8316CK^)D3_
z6OKtqJu$9nZuIH|y8M#}FsT94IvTj}D%(9g9Gv`^qUx=ur#H1P-~&nKfl2A}&dvY*
z+0DL9n>O_s(kVus?`!g$wk*CQRZmva&T%)}(`8I58jpa`Lvt?r&GO<{kmg<^y(GNB
zq_r<3QB21$Y07wSEuOFuTku8d8PgCNvI~rkzf3yV{{$=d1S)wSwI8+AGEQxNrZ*I;
zs-csg{Fdj(Y{P4eKeSUV6{CAf<2$sI;U}er!`8h!2663A=g$Cc^PFx!_Q%hS8j1CB
zW at qhfj0L+SAM9_?YDc%JxmJ;deC#xF$UpWX=dz1Ag-RMzmaE$IHafW#G<c%RnC&|1
z1K*9v%gZ~gv-&t#v^DNwdGGAMjOgFL|KWklJS52=uj)Nuz at r-z-aC?m4VnLYp32D}
zXXq`(>fM17R*B>j_e3|MIop+0=WYg4m_ZBiz?q|}LOu>ydbdqLs}3E`GC4AINj&w2
zH6v^8RnThvnl`QcdL<w7dVciacnq4lpSp&}p-LpdyjRbjw>A%IR8UkDLe6bp2rHC^
zBx&+^@3ogNU(SxP3xMLYa%ge2udT(zHuv@}LWVH|OzL|lW6HlsPkiq7g)~M|_ at I-=
zE2IOS!=g)9J(Oh9qWj>%rZ7ZPA9Rhw7xgqGdZvxln7;@i<7nVSWp&b7_ijGS(YW`_
zKUEY38wYr7{PKQW!Yo#6#QMsWB#$QxoPKu|>zMDq|K1zl)O7_oZqDOH(^-=i-pUsj
z-}ke?M0ijtI+)@|s#}_Nyy#@?5z_9IgjqIpJ6R~Jld6*Tbsg8lz9c8huofYm at A*8E
z6e*~Ez<zp8KmPR7uqFEAlE5i6ncijG&jizD<r^zMZHK~WP%1*FmC>^k)IiLJ!-o%F
zZT0ZsLl~qB6Sg%ALkgUI#q|mT|Ha%WoBA6C=)3vKy1R at 7^2Q!I+8`uw_95>&$)HlF
zS10NmOKg8(3y^CkvK@{2?}g1=Jkw%iO;Dp6f);HT+)fREE;c*AcpCv$c at c|UM!QyA
zF5xLk%{|puXF(hGxG!1%6gx>ruiv{79AN`m+E-4UQiPAuIo+`Fd%Bp#tT`o%l0r8|
ztMiIRKmR;n&XcCNFJE|;GaIPCG7#)&Ok3D7sp_J`Do*zMgK3=CUKMKou<P#G#Iqyk
zO_whZ^#4eW+zXG9sk86zq04o0N9%r8=nbTAH^k-8OCXkedtbJEIo=>X-aS`i7I%_z
zscj)drdH=E&mn#+$hz at JH~x9ou&nrv(+~cblrgyvHwJ)t-LPrn#sfPmCS*nyj#PxS
z`4j_}Xyt at aNfa`Zd_lM0fB{BiHDiK?gv%S(uSaVwDg1!b$s57mP;n}Y$QP;b*laBV
zI4SuJ0Kok-D))zAL*=-z?>yGz-)#%LokO#uiur@$d(4UZP$He-0h~J6{ot}|1lTi>
z{Ot<QX5T<rS5(CXs#FkV;ugCkIT-IHliW#n+zfHvzTK%NsyfG5ki*uh@$^Ae?Fxxp
zj<1K^D~DdZjWQ+R-oabxl{pkaz2?oE*Zh(C6mpMBBm`O9*Xk!!yJOhNwHZA^mF~Bz
z&zlsVaVtV!0<I7FFD<fMt;m$)+bF_U54>J>qQVG<UNY at A(fgckDQsWi!xLKoJtttI
zVzd?%J~}?8ap=4&bK4GBthIB>p#fvqSKet>Y19Nj<|&LHu5x$6{z1r0<=qP!sy<_{
z2y#I=BQy1nj~rm$T=qi2{iB=<>4|C13xRU3d4sx6pt~0CWU)E|Xi<bLb+y%xKesSs
z&e-?z$6DXvF4=~YCa65FHHP)kadic}vLIhP&_+ejg9OrbYVw^slhA88ydE|_cSZb&
zh_ulK_t^W&(;h>|d3-E=vdZZA=A<LKQI7(qt#VMl`nG<<U5{GrrW;<d at e@j!SeNRH
zjVu*+#%Or`ov}_0+~d)4#92O9Vw~|~K3W=@AB?=LkzO2Z-2Al6cRxTP<4unwArmcz
zKbI}@!m-X3!3!=?-#E-`te%K)wxz1-83MZ$I3&1>x>1DvVJ=k>vJ=pP#%gtIb^@N+
zSx(YOUAS<ecvA+PZQruxDc-z&Aq2_3fPetwjGCh$i?6g0S6lHc3}M?X&R_1DWi at Kp
znwMJ*GR{?;^dwc^e*E~ce^Dp<3l;XMeB$O_>PL3(-p$Tm8aOZ7_S)t_N?tn@;Iu2T
zL({zXP}20mGW|SG##lJ2UEOVP^S)p7BtZT;UUS;CX|&J`NFyl_PZe0|ydjPcE&zI4
zu=i)OkFk~4d6n#wal_L1V(r_%@*rKQM*H2%BzxOjK20DKjQr^Il%nlh*NvSOYT9 at 9
z`O!4Ye<x|FmgW!(m$N1Y`;2?)M?5_y3aFsuqa)_QQcR~x at I9Z8EYK!XMUP&YyXw8Q
zW%*NX+`M at +Xm+1g43Wq5*>pm0!>0#^)yv8 at u8~sKFoaNKkTJ4wX{4FWMzxlG%~CfH
zN-{n<{@1s8 at w!vrvJtzV`p$F4oCD3=%U-r=wPOrWcukU-hbO^(%;?eAg9P}T9Hdwh
z8toOZvhk86uQ5E%nfNAFKy38{kLF*>%$y}ij{fTdWH$li#S0hKbwTPk1`O_b<x1_9
z!M#x>%@s#kJqNY%9#n%?Xm2H8JU=p%)0cjv(qOA;PW)*cc9ln at Cm66=qf3`jBt6+K
z#_7Jp?1TMVwQ19{W5<pGXO`Vz!7E47>ae7HqIu`(WCREfuivlGzWD0yp%j1XPWExE
zeZS!@?E?09o78H_EzfHwM^8AwwHfUC$+6R`XR+Q|zC9A5 at WySgigE_*+q0{5B3<*=
z)fv?)xov*01$6}<QfI at 4sJyq@&^4oZ+l#v5!`@EU;f&-Qwivkd=ARnI7eUFEB%}`&
z6_L6DP>)sA$HuAs?mo){bjbmsN%!yf%gcA*3S4M9vHS-mztxz5ybQG0&%lL<J2l3%
zG&gRhc(M2%zOhiInN%;EZZKLuu#kJE>a1t3Qu6-mobPLr(kp#K$0m4RO>c6kc0;cp
zl`0eKhyss2`s*DIoO#i6=$e;WsU=UYtQtilgFkNGyA?&&=x?=<!&@_iV0TL{(X$Sr
z<tc^vC<6nFgIY`C*1j>ibY=48b?=XN>Dtxe;J<>>h{dUKj;jO>(NNfw>qPfVKHl1z
zFHS^(@nCAZ1rv452vW+mD)cL7@*DS_S!ZR(#{-t%*A&~jvrZ12EwCzn+Qf11;dbg-
z*VM+V)uVGNzalSt)f=XH=$#JLORN7*`3(r~8I<cpg@|>IJ$0Qvh#P=VAmEt0e>O7q
zqcRDU^Ogpm+w$k1Nl%{4!`mXD at m|m;q=v2Sxu08Wo)J1M??{|^#BzU7juj+?#>yU}
zGWR16<gwl}JgVn(-XJ4p?Hezm)S|$KKmIs$?UBvngLchs^y>9bj^?_5Re$<4cI30!
z-?RWaYgJCJyqK4``0l}no7Iz+^{ynjP9Fb#r=j&%h17oEalgd}4zFBM_Yjn{d=6yQ
z(Fb2<g89pVRfRO~(wRfR({>Q7!1eqbDnDVbepXf{cD*QvtcueKU2jf}^L>K`E!EV%
zhS^a-uV>9nV_4t+O`Aq+ at s`b+9fxx%0^q#A#~BjGC9smPV|uF1VQhLlM=$O)ejMi*
zCfpB6Y3O2UT(oVs9vl9ac=tT%oH$L{TxA%pD^fqr at w?HMY*G5)h12@=?X75v+r4f#
zK6itQi%KN$?x3go=M}GnqiQrkNxflxrLbbf8M)wvhp*dcN0(h_Qg_LnESJ~S3pqQ9
zz#L!JyrLx696B#W!kOJ%eg{=VAm#^V$h;omHYI06v<|QzAv>S<1#nuoDS8|g#?rK>
znANF3$M&0~TA<bER|9KIX3aV%YC>w+{&~W1Wl-8l!<op~`qZY7eVP_#q=^)~g<1y;
zclxkc#yPSQUCUqZL2+vxScwa7R^rs3%`<LM4)*HQX(U=3?aq7FUr5VwAj&rP>U8RS
z+Jj{wPMY23&ou93|5On=Vw@|iwtsRG+Cd_v;j~7IC##gRXN%%*nWjWGIJ!C2m8COL
zxfS1A&zmwt*|nvHk?7?nP2XMW5J6om=aUTfc}yA!;VWx`YcD*67JMPu2weRuA;IF;
zmKqO08=|jeFAgD$tXj2-uvrA`o=!bsxzd%qp>@@;8l0)RM!ymD7a`+$Dn~l{qqSDA
z&YZ9Z46+1EhpByg^_s|=4eYi%4p5!6r0BF4pCD^P*o%_Pe{agwl>TqdM|v$nh3alb
zX<C7=%pp&ONB!S>(@xMJOd~y7py`ZTig?1y^+N5%L~rq5n at dFIDd*`ejx<wQgfmbO
zC1>Xew}o8*fYTmpmw!Zmy{V9YXq=Duwbn>v$EW>AyixGGQTL9H2oo*<>j=%sjRs0{
zP>!SYHCwwj0%B at U@uF!ygOd%5^5WwL;FVjvsE3K4o|AGU;<AID*S|h|>hV$-)(smr
z)ZvU3gWJc(@!Z>46<akvsi(+>Iz&XrEVHBqy*bxZd&+o)e%y1If>%BH3tC0 at sYi#0
zA{%PEae9p-)|bLiV<6o?ZN$c$KN}?vT=R0girTPL!zkFQp?0T5j;d3EXa)bs$y9!W
zFXbb1Fh-cW7W^FWYRv6l+O`d%2NOumQN@;j;WBI#jiqwBgx1vQw+{^rXl(qK8k|W*
z>60ghN2!844Bv3@<qLrz)NwnFC++RN3tz$`FBc6PMR}wg3BP`rE6%dA<<ROgjV5?{
z2}9$4IMiZc?jf)%RGf;v`H;IxwyyOcfFz);_wbflR&3i?HbHlVH@(t$HN_S-@}xww
z!WS>r_Sqkhc_ at JT#o5vJ3nudgk?;mP&Y9F#_9B{yc7+`}bT~Z1^>Xf5LlPcAZ3;nl
z at J@@EHDmb8#-%HN894`z7aN9CAhy#Iyr>Br3JAwjfejD90OcgmIIV6uQ|8Y<#v*AI
z;DE=foF0&rSO*8v;X1%vLy{8L{$Rdq7`&3v;>9N$S>~7%C{!ZB=;}o`8|tlJ5kGTV
z>9#H<GUViLu|r=^Z$+L~gR5UxD=PHs*RL-J+G(2i(~#&0N7}v+jZXjnrG)bQo(AC*
z8Yd6Y)uhs+i7SJGjhuh&d(!A+BL7qq6??7-HXt3*f$}0&EG)=$bPdn-$AaOY)PlJ?
zZEoW8CG+xX!#89uIP|OrC&C#F$5K)E($mW+xr9pPH=xoZ%Gpl*SnKYa<8H&vKuoR-
zWQg9xG(`JhqONPrB?t~k+8=-Hrg5~Zqyyx^JB{PkSBmO?fl-%APH-Aix8L6a-SOQV
zsPU^&7xN+eHoLp`8a6C@^PmZfLi|NSuUGNIc>j9l8?A8|3o3eT@^vAC{Y_~s#UtD4
zt}wO#_i8wYX2y!hnjODBN=kXhJP1r}SQW7542j;v_QuA;=1!ixlOp#d**8aPKM{!R
zG)k7kgK#$JF^Z!Qh)4Hu%I`obfWaM;JW^l5cUWad1Tke6LR^1Xa!EQ6P+Y at U$z;JL
z;j`u(Y*um>!=;Jr65ni!gbEUA_o`WF6t(7r!1V;v-_)MnRt@!<a`3z>m;HyY|G1+0
zqv#=k`OnqW?F;?={kxz1Z6dUL06m)<f_I0Ei60T3)+vi1+uTdZ_6J1)=_{o=;ZJkk
zkj}u^m1XhLb(&o7 at b2kc9~Qos at CEjbT%6QQXqb{qv at gX{Ndh6RI?w;w>`^971nZ2c
zyyD=Ur=}g9E0c(hGuN9_7=#cPvR7>1y>+YM$dPVHTH at 4~xmU+Jm7Rt_KLr6{Nww}!
z;N<Ka%tjr?^Cyb>(-)4`>SnYZYN`-5P#vk`8~9 at M=+VoWxOaC39`E%{ez-z=u$qqT
zNJh5z%KqRD{4dhy(RZn$EEvCyTpxxIE7>rrqD6bhh((D_B#;?KMPBId=KZ^(RFc`l
zSU|Og_2cG{o^W<g4DVCyo5wpUrt!ybtB(_n;JFCwZzMH=y`;8sEaCZ|adT7p at rNH?
z(=>2caQo%9?b{z=3wf69)8?ko9rVnC!HN at xUBq^F)TmLZF?P!mGFeq=?5B0 at kL@`>
zdhA#$4&CkrRmcHxp$8APiL-0){r93D6Yp{Q^#>Xocj<;kWI!rXcYg#L-9ELE%|!R;
zMJnhh0NkOU^;z{5gAX&oc`6lv`MBXbeXJiG``zE+^M at q_l>6M1pcT0@&eORfGTedi
zTSgf*xP}Bbo~DWr#^dTsh#2-85Ps3^?2lseH+a=M)!`eW$uEDid*2qw0CIZ<AqW`r
zBl~8OpP!#Y!OE=jV~8sz<XHQ++1jm7PZsasAj0q9j(bXIwDEC55PT+?B_t#m02+)D
z at u)1?-Eo8|i!g%CyEybayV;?pF1UU{JslL{ZF!fPIEs2}#+80nQ90G9X(LlY0Zdhj
z;k4J9CG_f~h2ozF=Zp(RH{GKrK7IPM9JRT76}^WQd7I1o2=z|`!zyq$`msHG_H<Vt
zH8GW01<Kv~hWI>IE{QY~A{n|T1-5K?VAFPkAV!r`x7Du}#BVF at 3|?WAAdb8S at gsl#
zer3j1MRDcX>|tGt@}v=xZJ7m?JQqSbbts^ywW34S%Pb<0Eq4MgC{}C9UpX+C-+lL;
zjQuR=!=A~$>=Fm%{LC|w<|8!RS$27wo0NOO$RQ at tJ=<rH{)hG3%y0vqm?7x{2=(@!
zToYtaKs^O!w_w!CRv6oANyqUtIls2ZdI%0a#ID4kC8*?JBJE}kANL0I`E!e&^8 at 8H
zHQ5104PyG6 at 0ulDM@Dw$bnM<1vBYUsm`}FnvhZ2T+KwxKS?f&<laS?JMQW1)i{{O~
z#?d)>eCgNI5TGlarZn)>Q6%1V6!{Ms)|i}Z`|{SW_OBmY%U|zF-%$g)u)D$yUTM5V
z{pN~+D6<A_R8c&L_9CtfAP~qR4#CF5j3xm|$>QLn%P4Y#iKp2YmhE29hwdlw-xzvR
z^>T?&81zEh7DA^xGdEYxWSY)~DLRR)Pj*^!NhPeoNZo!UJL)WNy7K`L61NgIxen-R
zDSafAd^dumiAle>DkB4JSeoH_RAKvQIc#}l=Pj)&9i2?WD?~4l!m3eSDqoeBhLH!_
z6rwnIfbr*?jy)SOgcS^HG##Qhg(1$x*?Z@$aOp=^;PGblvz3r)A-s^gGc~0Mc$zo6
zA+s)31bXEPs=?T_<{C=siatfRBk>g|oR14%H|S0+ at IX$|N#RK=FA}&$YjWABUUe0T
zTk4i4>7q`#zm>&a2n8VBIm{59;>zSXa;1TE_p at W|LmD at 4#~P4P3^Alw&}W*To-q6n
zgD)Z~#I9FP7IAkb(J`M8M3U9Du~B~_(3OH7`Q$_-S)sX3AR*Br-1E~9;W^0>ESi(I
zrQTvc!-oz`l|HyE43}J9f#IBwI@&vKJWo%4PPH5Ew0AoFdA0)G(n{@(U)CAG->jG9
z*riJsx(-^XJ&n*wv~1DhB$nwDz2sq0#U1n_iR-zWZJ73I{1l;;;mq0>qCK#BbaETB
z&P|&eWie~pMl=M5+~8Q~DN7o%_pa9Q2oq)=AKi$t_`8O?w{JIsVy(dEJn at th{9XXb
zKJ(JUFf^HFm)3<R2P7+M+fMHlE7Y$u*DLEv+y&`gch4J}2W1pOn^*({aPJ&PRcl{S
zXo7X8xs)N|$Tp4jYDyEs*H7F8Qb-Xi%MPT1+9R^g{mX6)ai6))UX0)U9rx$0f2*yg
z?<`Pbcje8dox%|@^jWp4R40<+LmH(e)=-m614;HFNCukRFX#!&MIk(B!&$FE&gIL6
zgz0{AqOWiV(k_rj<k7iC3}4i-=p&#frMVpCwC45`i%aXK!{J3{y>@tYyJhocSu1U&
zDMCRrW&8_gLX%Zabhv*F=}dYS&XBZ?f}RW0t<4)5<igN`Q`We2Qkr^0aes#_`0EEs
z;m3x%ckN0;JDqyjWj$9pOnVd19HGKVVp1W1*!?}3-HKIs+q3f~W5o%XN_vy(Z}o3L
zzEoDQJuD3A!=yupkF}QPoXVE65l#7}6yTMGS1GxgnUcu0RppimvzYdeSa!byHR$zj
zv(<xGeP$8M_vq>Ct1Lpp^?)w6#r_{Zl2Jg~vl#76L6BdL{3Ol}F+~s?%#yT1CnKV<
z@$=bxAlG=~G{d6<mTXV{OuH>S>x<}W-mUO3#p3|5_gB958l-+Cg8hwxYH}G;I?HpB
z+a&J`M{x>E^;<#KQ+)<c0mltVH83zpyW;8^W%Y=ING_1m0$D!oZxZR{aWpsj>gbs2
zT7 at K}g8zIxZ>o0g+!?{-0p$u1e;^+a{q-K+%9`CJ>u`k!t!QJ=m4i(uCCzK~_kYn%
z<+ at 0lNum^>EOeEIbw at Zp?pX#RwH23V-jSAQ*u48HDT*cDWNckC<(={!*mT%~5Ng>8
zH8nM)Eoulptw<ke0pzDnmhKc0NOFBbCb8`#Y;X~QcCFP<=CJ31<a`Z^4EJz~zU8O|
zSEe2ObS4Jv0dqQM(4UWc_UxHM0VBDS7)SY&ZpB3kW!W2AZM|E3!8nS`hXC9DtS
zDN|ss&vS;x)6|_FkEla^bRSGI0x3vX2n_7mI^g_UqI(sxOA|IW%8&l{GWkVc=f3 at r
z5ul-3QnoCKWL8}AbKyja7=pARaMPZG%g2uDRi6-j=SEVE1Y|)O{xY5KbGdO1 at Z6uo
z9R#0`v-ysc^!KP)XrM?YNXR7Ynw%J`VsUvxmSxf7fvkCvXaHUY??lKL1di3b|HD=7
zy3#}AO-*I$G4k_c)e-iE-YgD(VZ{j$O=g3eQ=Bn~Frnoimsnm=k;e9zftTu*Gm6o1
zx7u+EYbS}i&|=eRxlP>P$I>wm5+oHe{)nE_BaNX`{q%xZaamtZZDbI=u3-viuVLNe
zI-+cUqIPdmu6sBwp+NS<=^+{VAsoXH`rv_K+za{*vN>po4i(iw{?rt=6D at lhjzkVW
zD0Kug2s*C2Jv`E>R8-1f*Lx7dBQ|)XLt?O??i)s#g)%D at j5CD^TF2X)7uT+$-z<t%
zY&Wg!4y1C4x?g?4f#wWqL=B}SHH^z0!$PuS&CsXkDV+krT7%OZT>WIb)1F(qIyRb*
zXcPGM$(4DyWp8U_d6IcUDG{6*jF$5>*!dHQPyhhC?89TWw-BW{Cu%Qgqw8EA$Spnz
za?!Q<dPVeK%zzEr at X6L^$W{(I9WPYPr1MHzP3suGZbyLSw4JTvrj&TCefRV?0Sc_p
zx&Xme?2SI-nl%k8Gh&?)6H+rcy^OJg?2;U+_d at QSp!?&)6&O%SUAeBOpj6ZBmtT$n
z)GcAj1;8f{1(%38CLv=u9}t at M1lX+oP1^Ct&YjcxTvat}L+*7+V`#<#S+nhK!jPP}
zdiCn)uivXBwf^<j1&-tNDM8pYg_uRMp?oPpo<Co^E?q?!vd7Q{zGF+N!wT8^tMeBp
zA2#{@_ur at 9FIX<h5@`5EcEwP#!O*B!Of0n9Vz?~Ewf3 at Xc*2&5&Ky=f`cPgT5!X2W
zgfxc8*^xsXfGF_{G>Ae0BwASBN3H|fRw!1~jb>7OB|DLWU at -lKd#su=3L0xqR8*Az
z at U^cE2^V*|wdFy7EXkFJEkd`$x{ha`Y5YjN=wS5|WI)`}QmQ2J-N0yjq>$Vx0~pww
z&8Z;4Y>B0ImuS0~(GPz!Z=li~g#yb9M6(v<irCet!^OmvN$YS|#}RXRfCs|D!X)JI
zGp`w at cmVm^0xp?qZ4TfGJ!Cu+1-)DLnPo_Cl%CBdibIcewHD$ff*xubgsbDt0L3O$
zQlR>$9Z4oaQXU!MI+v6p;tXXwI+Cif`DCInL0yy#T06xpjVk=Z$B*eOd6kYx1ezp&
zaJ-l<x-O223guFJNxv&&^XAPG*fnkPA`T4f-|?bDvEB9677vR{DUf(1?Ft2=(E((P
z^bGXLwKqeR%=!Ll;Q*#4TSZ!NEU2r?Q3n6h-o-*vXI<KJGnY!*3T>cta*~fc=-Rcb
z_WY|#LUqWBp(FGnq7Moz;cvWqOzXg&w`kZz^_=byK9MX>knzh1z1l%g$|91;&xH69
zQID`e%uU$dz8?$mYYi18WNzK at 8zogpu|y0l_<N|{I3qbT;;`0&Ka#_liU|aCZ{NDr
z_EYTi>C>s(OyGg{G4&z}18EV*J&y0~u=Xv^JMyH<zM3H^MAawmD`b+S2X04I8#e9W
z&4GFC2CoPtHe~v~0Cbah0$%&vVO<&IHO;CTdAnKj<}V)9)?Cb6KW^N(fbC)Z>u8RN
zepj!KBuW}_(`zzf$mDYHYy|WcEVEd5%hZQZvLZ+%!laYX%W)0<S`>bMX>u?*z!I>a
z at gaU#U9KECabb9Nm8+3-JBCQ01?*LaU1{BKu3p~KK00I9t&0})k4r at _Brjy@6cid>
z_Be2?s%weBD9c#0k4lGa&rmY*Fs-Pv0f4sWJ>b%N$)_MRPIA~AOJkVEgf?0&8c{uG
zCsqZJj4T;^7q)1U&zt6V7KY2|=vEJp|H*znP6`{k<cO&4fF(Q^5z3 at qST^mz;Nb7y
z&t~sPnfdfH^c_U!sO?XFT|>Er(AD75uA2zAj3_7N26O#|DCQ?UGNYazw)**I8WI6S
z0!tp7yT$vrNQBRe;DW-gyXD)Lb)rRP>{m5k&yq+BUo=jDDYVXn>?zvAhMCFXFT4U`
zU14fE{kE%21fnS4gH(sEQForQZ2PWV`*^kvrFk}XUl^e at gxcX{64gh1mk;ekC318v
z<>OoWha|v<(7(;fv#Ge2LmEu2j;WkB&O>!NRLEKYY at D4?A#gN7Jhxyn;_)jUl*s5?
zyNAxcFqVhl;kc652MDVlDE)%yCqyCwaX5pR(cIqd7BAnTLx+;<Ygf}-{Y?a_7<Qy0
zlQ<B%W3yxu=>7;8CVJ5Wvuc;FjwHQ>FdR_zE}`k$;TAUz)#dy*wbE22XKyzq^F|P{
zTa^~cCdL?yb$j133z?SCf|kr1zb{ce>NWZ3a0^yTbx|qjzwgggtM|sdtB|=EDYwf>
zrezcYGlc%HdsZT0<cRUc)m5VEL5VW?Ls3V4=aWF6VXs=h;B+rhP#Ji%L})<I?G5Ek
zlc9bg3=z+wv$(dfo$xHIyCbnbdCnp{iA6aLd*5T9rKp5vefDz3+12$D7!bqPj2KuQ
zA^h;RoB`5Wg4T*w?5CpppfJ%b5d6~Tx#mT$Hh|hlN9<Zosl%itGCQeBgcs`2A%FNw
zEgA*#9`O4#{9HC{n1LK!G(a?*P05tCRpV)6z$6FJk9!T?U~JQ!@kD<jDaUs9nI3nT
zB|lp-F|WC|ENEyNX+8}kMAW`t;>+}-82mGD;e}Q#4F3&T%qfhC^nf6R3!O<vJst40
z7TG#769aHq3f=N at ZenKckz7BVMV9kW+6`M9c*mzf7=<(GMHu$lVMADdKmY4rhF}9w
zw<iB93JVM1dT)NNilKKvE3Y>4nxU7Fo-C`Jl9WciHt=jj<5OTU6FTws5OF?nItg=_
zEHt4FnC!7<1zs}`dA-S5yL{?6rkdVCDkWYme*IPE>MUtMBkCV_+;!vQy|fVRi!-N7
zo+a?V at LUwzSRrXqa+8J^AxYyWm6D)wY()F_&&O=(n1QMkz1Ea9C!Q1Znw4)YJBbPY
zaZwd|E)p7vduVqnd`=Ls-7MZYGONFmG1E1*6W(dh2W3N)9p2kKX6oqCn`K at Aq+LXz
zzcg_=ttUZXf)R)u19b1rW2AQobw}sCr8YBr8Xj{afTtmzrCDiwLH#<rDisDsILA~~
z^n?JE9T;;gFI-v4N=yerY1`#b9y4Z4%-XjiHvsssdxIxse2tR>ZJA8oWm(ii!12q{
zQnWr_4C<x44$50NLnIXLX65bd`&ITD{yNi=tZi%K;HNF2>O?Ci2ThGG=n1+PWiQ&Z
zAQp(``gS`)6nR}qDMzgivW at S*+;*BiMB`bC7o9KB;MqqkAg?b~w{DH6mhbnQ?(6RE
zTefTwE&{4(=*x9*5f2%W2qc2&zFc?qJOTqEU3zgFHw_Ve%ie<~dw)-C0{?I*oxDw!
zGOzxcU$S+2vH!+GW?7GNRt~q?EXMwX5%?ZyY7j!f=(V|!$AMgkn9`Xa?PxCgA+j=E
zu-m7GOkd~Z6hs7}pFRUr<xL0TK<L+1;GL5!XB+ at 7ugTQB__2lNoLLk+b~}8!(5g93
z$MoRg&f(-0dlpuUN|(w$nBe%EmsTASIpfbwn-2MUy3c^0|N5o{IJ>MO)_d0d4^C at l
zY^r`DtkHpf^U_(a5^n$8vZV-U8 at usq?0{wWzGP^A;@Jw;6?qt=DLpEUC;X}?>6Mg9
zJnDoRC)*5)4iM*+Ei8aQioU5>>`qJXSJJoD4nCF%Q*9iRHXHmk&Ge#F<)q6hJg?Xf
zd(JEp`chP6XlIBx`_C-;nnG-=KyXt?fs%CZjm*p3#ui=58)iA`#M0y4Ec09{Ezs(A
z%^ONlZS~}G{ElXay6Wl80rVmMbveZY4hY>l+{IZ!krc{E1>c<W**Ql}MsGKC%}MlP
zB at x=^m)$>0G7EuLkzkmTzIq=JwosTI%GeeF5O3{E@$pg{LX8?xLd{^)A35)F!dGYY
zD3J$HLaJ>nMs8 at 0*G(ba+{a%wxB?5&{huKP6(OraNH$p4%R<Dp3`}+tL_nFdH1T&8
z at Kd`1i?>4WzxX(B+QoJ2*9$o+ACIKH)WP?Po^{5llg_Q~?;Y4KXF*3r9intKw{D%g
zwb&#Nz-Tv|9E-|A%3Au^X9%o4iq;X{8N2#}w+|rb%E0DC29Y*BI-G#A8HW-1X_`I9
zp*iMaX*cD=duogTvTX?aHP|BVqQFMeI1k;4ARv)Gz}3B`7d$CFd`-c<Q2sTL`U1GK
zpEk9qy%T at 1_oqQE-qqRBt548?stKF6_gnxo5>f*Rc4wfU^DpmQoA8}pZ_?`B3v2zB
z+dB6BFCmXvytz2ih|705TooI}oCZ_=ypD8njVOFxA#0{feLEv#$h|}kmN~|C-bqYM
zES{DS#MyXKf8i1EI;`wN<%n(?fKm>remu{0DUDIuA~T5eCY<jRl^vAUQZ^VEtB9C2
zY~z<`@U-|Uyn(!Qe)sfu`Xe<}hiPjU%&XO9L|391aw at Bj0Z(mtdhiAZL<&l{5Nj(}
zmz+yZ#v=IRW!O_^uM8IlGnP^?ZH1+Y4LyIRmwPaE<NyA;1(XIgRVg_;M!^#(**a>J
zI>pMj|M|yl#<sfM_s{PsxtSlUOB(<2&8MxtZP<T&JNn1^oBogQDXskd|FD<5bXTG6
zsk_Kd_QPzSx{)nTu|bMR=Mh7DAc!;61rc+iWX$N$R}^WG#e&G$01jRs6ncuQ8wS-m
zlq+tPtqy`;sX+AC4}KW7Yu7FlTA0V at HYdBkduJ=^5QfG>E?xR$(zEUtMoxUWpx!OL
z?(3lYl#~Zg=6`%iY|dbnSzOjsys~QDc2 at jdNvX-q)05kZQ1ew0OtJ-w$>DSTDzF7S
zDrURnhjlnc<bc3$WUIFphU>Tpr9d*XBv1(#o01_t1cY^V>kfT$=;X_hg{k-?h$5Pl
zHyuD=oN?Q$+YW+2L8^A$FDO0z&kGMmRnZG<zO>G$npgPw>3>|A;+K at v|M}tSzqj&_
z|HD?+|Fv7{e=fX!N%Oz|JA&wced7Ht)CCo{5Q}(c6FOpyW6FKG>VX7AgC_2`7@;)(
zdqp_Vv!if4PC7rVIIv at WA}!3nU)pbahouT_#=q|_0p|EWvzc4%qSAXWR-CCG;c;b|
z`|Jd*yI!F^+urHvzj=`M`6WH9C!TDvbnV`W4u76p5z}MRR<Bc9W3Oi}>F52nyIJ(x
zgjqjb at O#ox|3logj6?mG-W!@R^hL!6y?Y%C?2eRuz0_mb*+bQS_bcM--rj9T&-sdw
zt!2*82~&nD7Z%lBo`p3E#)(s>)?Y5)Ykk#C)YootbLm-odwR}ysB^K7wieD1s$_uT
z#>h`Twftuukk{jn`cMA|<%(}9Y5wuuKP~+0zUww=zPLC4=bxv|+SJdu{p0)5Km50s
z{QZAk^6z`}Klk$QTftxce=H(@w|eQY{Jxtn8^P4dsxY)bLqmg-u`0BnZQHi7YhG<n
zTkqxNwK#m%O8qMiZx26u^oYM8u%J|4T?CmOi`juy<V`5mGk)`kA8+2giSl~_b;GHn
zmn!u7_ML)b;u#`|eZV}$<h7FR%tilL{+h3#fQ*0t-t}wSqN53KN;W^M-&s%ZIUWAT
zF8MSMUMQU^jM}(cl-kOsKmRPkOGpvLpQwbo&8zrgjwp at yd3qkBiFV<{OEUyRCg`FS
zJD(p}x#b^QDB72zst9LLX&>G7 at ahc{GVt4ZQ&0E*V_UjSqMwyQZCj3m8<bgxrHM)5
zu!i~^3iNlB%xTs at X7m+*Y-dvtKakeCkj`3K4~lh$K0?MxZ{tC6-B}~teDj6>ydUDz
zE`krF7I!_?nE%Izx%kfyW4;cLkw|27 at ff`>9hYRpAbHESZ7mg1ivVuZzfSO^_#{!!
zD6<fATfyVu0Xb0D<2PFBz+{{M&CjPqTF=B?dko!^D_PUe;EsE*STPmJC;sOXTp7gU
zmEwsyk}1In|F6#x`X8S|y2HXOpg-CZ5D?>9MJ2h9x_nB#q(doM_a8y;X*xO*8Hw(u
zuHF-MPlT%6kkBEDi}IYO_3uk`+t8WmLK0Xy%I}i$JoG;47|*;dzpVJ-ksJTHL_X{S
z9*d at _5T%uIb at v`UieL(ijf}jEs};3^(r1-_Jjq)#DIW)|em)wd%`{5>sc#PL*&{{`
zGB+XZ9B9!u-v9lrPQgi8LnsRInc_SbSqCkQi?m_S at c(p67exW!_T`_s;-xt~9T`oh
zhoQTr;@!uOgHvTL4)KM~nI7LRzolYcNWOg9k1ij(?(X{{eSQ5`FJ8R3I at -<d<f&5{
ze3=+l`SIg^ii-x#J73X&P!<*dy<ZRn<itsnE)-Qs$6qEAnU^_r`t(FEtS>vDi_4Cz
z at 0{8WncwhRCezB29y??ZQ((-!j7Z!KC2>ei?N;Q=my2au=jSF(_D4lks=0i`+;p+S
zhUg%?Zmf86?4Jvd57YRRhmIFtAY9sO`U;*9cS5Z}s%3_Ld&j7Mr^(6Q+-&?Imec2$
zIAKD6-6l^5Nk52AtPBHPIPp}IQAK at e4pPZG%npMyrNy^jT{J0mmuB<$H0>@Nm=w3}
z>B at gEhJ(v#ii@@*+2cE%Tv{i0J>25zhMVd6ps1hW=jT*yhlkZ$<wzU?g~f6*Ypr;l
zX!CzB?(WW<Td)?HqK{ew+gOCs2i3lF9ExBaP19tg>L&B&&p(^~FJ<M3$5Y=aeqE{N
zufN0A!CQETNHdt7|5Em)>Qzf2A88#jO>?WbXY?IZLzDR!MvTg-U5TOr;u}|AJnDYi
zk)4`K%b4d81VJss&snRLqJxlt%aL;;>;<bWEeogVa$(W;4lQYeOOu5W`dc3_;QZ-w
z;ly)IP6%!)8VD$`YPEQ1c84bQ2V^Ma#Q%J-J}O_ez*oeGf83|elbs}U!m>aKxqJ71
zXFHSd2p at mW>F)je_meD at 3eafmVH_uU(T_jB3sBbCLJwF>Js`)>g`1IfvMvwT(lX at n
zO`TYeA9M7X45_<Ooenf>*6d7OVnJx7ts#TP#m`^|>ogf~Un}Ni&|m4(?{58l^<1x9
zU+BMlMATa|1B~moJ_ys7jf}3#;N+bQ32EE5DSp8%uHm=M9^-xJkY(VK#fuNtjf8z{
zMZo&>X`M>P;dA`_(p`<jGXT}ge4_!1U+v`j?cU4R=dSS-#q?m*s6UVsuS{d~t1}Jo
z=6ma()aTaU-iV(bIha|uNJXd8+)E~i_BQ`-KX=u}8;uE5*$<eEPDN{T;f3POl|Gw(
zr at -%uuS>4dRgfOUx5VhSVVBx}fu;Y%kXQeNUz15nt#1JLX^U at nPhM5?HFPn=rzy;W
zke;HfDITwQKevQ`uYanjgYaa55EkNI^C%@nlt}da^NMHv_n#JrB<NbxNTwSK$->>c
z)rVf+P5(&HSASILpf?NlI?4~0#|kba|Hp4X=k^~z_a`lTHkxT9QSzX-VrWRo*5mv7
zg5+u%vn)p-dl`t%pr^G`pUIwnJRG{sPn^AbP9KFbKpN*+;ZsB_D4LnVD;WsHL?$gG
z222V?Im`Gv4C)}=!E^4)ztM_=EBcuJ0_K?1YK(T0Zj(&Mi7!x}*+vKjmX5nO6EPXd
z?5 at Xmd*@u<Fk4u5(L{db>=NnZ!mqc)|D>WPJxLq{?s^mr@;z{#aj2n)FU=7IJmSp-
z{5Y*!7buD-IBuC1mp%kN&ZXmi%$ds;4|UJ3#5;hvD$k+&>G~U``VH}vXLzPVuu3}{
znT#2C;>wB2nP+BAr*mOM<Axrpi^yGi23g;_dp8w3k;pZ#Cdy8iz_WDeQjaI4H248Q
zy~wtRw4E`AFgd1FJLE=gJ}LuIDbS<zCwsjHI^2K1J|51U7sXoCP9&ss{z{{deSSde
zrDeyCVSLaWXJ14c*hjjNAdf>s7t%5?g?layUXUL*fs`zhu*pYsXCgI7g*{tSei_sy
zzE&jTndEShBQ)$`uX%6M>^NGI&tJTVT=#w<zK0g5RhD_=wZ>_NfuCU3hKORB=1}u(
zam$syPO!+mXgWt((JM&j>?iAm3dOF{)zzQw)Pc)rPZXic>FLP;x<t<d+GJE2E~nA`
z8ZXLQW%rIV2lR+0M+J at 5Lhgb?((6~RPVxAWR|eCgB^O=16B}js;-(6Y0k!E&DFm@(
z;P_rTht at OJqRF6xTh3X}Z}!ccJDtW+ at xjau$Uz<^c62>MIDf-_iJ4o#Mv;CXI+?x`
zq&bWR^$e=bWxBr{Ja|wnZ;J4xa>n}71crUivU5x)53ItwF9QE1G^Ot^hK)eu<o}V*
za1pJj^VVn2taEnmrLI1jK5-fpeaYa~rq>e_ts&<{!gF at s6~7Q|BV*&prOEB2RZmk|
zbV~fQ%+E`5y0@)NQ(xZ#uk;zjJ(*L(#z=SW2^weksVqD@@Z{;!R=91WCrE=qUvW9V
z)GiBAdAAAl;UA%UN<;iOr}EDtoR*~HAejLvLid>?5}P+~uI*SdM;<@!EZ8H>V7TY8
z>)4W;WkyrKGPc%k#Kud~KBHlg_r7|smsf;KwSzo+de1Y#xLBn)@)%-YT68rsG8%;b
zSWLu*p at LGgxLO$n)fxy>jJ4)b8VlByJ85A*WcEXjgFsAF<KYVWdS?i at 79k*-%RmnB
zbh!Vo>h;)}M{-MLj+`7V?KwHmOa467>ahRPmx>Pj)%G}jGU)|I`GIkY7&h(R{g1fq
zJ9Zc&i&&{oa=i%bvRZij%E^-_0~re9Y5FEO%Q4;bjuxMN;`;o0qg;j`V%puk8zlZ?
z3?MZzpI23Mr2=__48)7sQ<JxxQ930ak3ojqe>bSs$)?db2;UZl<a<tQ{e6xH;17+7
zSX~uzqIvkR{f7<(vDeIwREt|&+}zQ>phrNTmTjZI45`UMQ3yKhTw#+NYa(b>rYg^M
z5G9{vAnejnlIWhff8=ogMec~r_UVQG%I^bEa^6>qq8*V4yWKLTrfmu~r{W$HjKKYD
zUejtcOHnvXTAJ+Gy7d8)o0Zjh#9}KHhO)s7&TB7!Fp{pQF(FFz{N)ol$pxn#XJOsK
zx;ZU)x$}tXJNtSEh+Y*Jp6IvMHeWaRG4w}|Xny4!ph%qko at sO0E>r0JMBXv0EfSmn
z;az+_z4<gff3o8>P3u=CkUX4Y;%|O`2$DX$fgW8SeO9)Ln3ivPdu|89c=NBNC3Iz%
zGaS;ryCRaF%de+?uFl)9X;Jv#nZpEBHqK`q{J%T~jj9gI(VW0GSeu!B=+Gh2-*9Nr
zZxwG+5}zf!^^!HEk7|=u%v{T3)x7(8NYe$_1|rIlkpP1&kGpAf?P`FSON=JOBrwGF
z1TFe at nkz)Qoa<bRz<Z@`j^@{juWy5^+o<ZTGn7^)xk`1|=w1_~11yFJbpLuIa-tq@
z^7eqShhEf at Wh`OYwzN(51sv^9czMM6U81_n at p$u8nHHT9j940F-xigqNsj<#Gl2Mn
zgee?r;Hs9MI9I3NlD-268jBeq7`2?yFP-9LcW|YsxZOKUM&X at ed+*eze6XUs?_kbC
zbrH|Q-1NOQv5oJM9p7Heqx&bDCN8vLVj~rmCG{tUDmm`@mZZPDBKkY5+bxzFDFZ7r
zhSl1Qvl(Zb`anpARMZwOAnc(Vr(qqjmQNClV3E-)&Ta5ycY6~6QQP<I-+wy7HWMSG
zM>ZK^9Uy{E?yVK#kq__Q-MVw&MGLXp0^=h3c=h=5MOu2Ieq(ZMB0e}p(_ssMIkP1e
zATF>+#4e+3K|w)L76XS5pDV*7$UJ3o#izmEkE+M}khQnB?uYZPgQHATb{jEMgsi9n
z*62MzL^1(r(sR(D8FaXNO+UWbYwuq1elXvSV(vA~#;mgl{Mw2ThyTl1j##1X?$;v&
zhw`&jHM*fsC}&gAH{M80d~A~(5itmD;1yLXzi(Oq3)#hfB|m*%Fgt4Hk+~cvfUfSt
z#jw6eE2QI37xm9S|J2aY`IPR&$?|X0lgRE|0_JgR#1 at 42zL0TX;Y`6C$Ws`0*GRn5
zPX^h+L~?5wc_(k~;|5F5jeSD)^M*{=`?lTc)vKkKDpL|{((D&^ZfP?pE<2C`%ZNM9
zKsV7GTclU{V7wzK>xAx*mz#-5C{f;?Z&epFIoz?a0vSK;!dV`jMZdyerR}XM5qdGL
z at F8L>lRxDoGU-b at OkC1eM`so>KB_wQ%9js2D0%E3AF)OW62^xp#6x`snk~CQ>m<;L
zM2?susfDx|N{jdLhR_=e<v?^16{CWkgrq*E%Gq}TBOjb|5OqHH{S{D_j936>kK^$?
z763ENBYo<mNhvaM$vA_EoMjdb6k>DvBW8($Z;qchLEg1Uc<-xxyTF@@hd>%ELK#a-
zO9%6ewla83aKB&N#uPS9EZD?YFYB@<E&#YP at 5IV0SY{Q-GEo+~+S(>)ty1|VnRWll
z-k*ILQ_r`-voD+`{scoUm3v%ivVI#XaJIZX$zn^TU@#d>0$MMrj%76kvx`M9#I8l_
z(oH5<NQ}m$YL2k8EOP<(dGSf_xa7a9l^ltD$mPrX#H^CbYM7Ow>>*K at BBZ`))6eTO
z>`DYu8Y~TFpxL|k;jHGiZH!fJe?%H0dSvLi^!<3<Nn^d}Sb3KU%*~d4ZpVTU?_JSD
z$}kt<F4rMf^pL1w#ifSH$pvMOI|!YDkSapTFn`o_-n=K5HfT5vKprjvrg5!5ElFgq
z1wbZNdBxtvwNhJ)7Zo{Ye}KJ^MGLS0>u&-nTD9qpki0l?*ZH*N|63yNVlBvAh94j^
z62j@~)-{-eWr#rJfot>;NJ!4-5{7mdd09lA@)I*APMo+uY{JBekB|>7Z*ykHwrvlg
zpKMIZ%FAb<9Fl3k;pOqDJB6<sT)V!eF92HfmOSyp1#0I2I-(+E4q$QIB1`roDwXr9
zD(*v#Cr;ch68_{v0~7OC^X{TElbp;WwL0J at F$ySEffln67W4K8d-xUi+z(7itY+pp
zS#xNO102a$q+ at af-OB20Zm=Z+P18tN8ByR}us(fe-MV!c>x`BOkm{O?TdrRpEf%g+
zoVPw`<CT0=lvl7(2s3(2`-;C)*sop3E`R_0#_T3#Ri8hL{UpjA7eD7$WB9b<{zsHp
zHnh!`DDIiaX-p##BLW_~->F=@bg31Iw+dhU^YJ>T(5Q%IE8*lMg07{XW0Ckg$qxT|
z6h(I=6Zk at aJq~N|v93&JoHV!<YWv8&W$Zevp<b-GQY%{q?OVYcy^T_Es_B{{LA?EO
z;R(jSL;-O6$$~%1j6QO-bYn4+nq4x=6#>t3Tm at vEVbkJUG@LoMbXIDZ9Po2Ttz2%N
zP>!8CJv9~Q3Pd at P&be&yG}6eNWl8r$WyOjVxw(j2WRg%PY-wegm{E&ZhXH$4uW4Qg
zH#hV?(U)YDcBQ5Q!yR0>ozc9B=!LhNx8%0>>RC5+1zL*8CA|zKw8XAK{eSgz6|EJK
zE570qeu3g^@Qtmgxh7yFdK*7%rk?A(dCL|bwMHvNSZ;ds6x^JTnnt2{euNZz^+9jC
z-`l&zg%fRMRM`CtdE_EU>_)0`ZS^_?ynR7Q_Tx+WkvnYQzUZm%oOdPIzd}~o<jv9c
zNl8ijc{Ym=QB1_{hlC$?#&zsi_a!J)_c!Y{adCC&$1A%jP;wSHtvSx;bf3)4AE3QA
zi!HQNgT=YOcBxpLadOGE&IO_HMYE3|KYsq}T at EOCRN|txfOm8+hW43#dANo~5{6WJ
zS6ulBmpn at x1;|o&S9_4sXCX^l?Nb!bIPAwyMyng5BVO{!aqHHt(e|v9+(*LxjA+2D
z;eIe^rgjSWvyZI)j~6mPG;tsAP8myeDD$Eh?&dRy@&=PoL3<8wop_9s$SmiJAA?jU
zNf#tz1jkjmXWTtH;>p=V=XtGh2DK<cCUM;<19F165m|Z-bCT{WEo<DgY1D0M&aoG|
ze)m}{7|vXNB0$tZU6Is!`_;k5=v`pEHV&3hkP$M?vbR~5q$MC``$9x)#>~h0dObtg
zo`$x~vg{yfQvB>TZ~lS6o80*;HFO#>f0?&Ib|3!vFuO}^a$`4qK5xJ$qMn at 1Z0IKc
z4iI{96QaL%KeFj<5 at Zx0`2od%kV{)Cet#j{1CcNd*k;qA6s at O(It<P*-FY1E3JVZH
zl?S4n4A$q3NOefAW;>MHoEEN@!xhBUW?5M@(n!wmG>}4zj}&v_NW`W;{)oWf$)_Ov
z%sm^eEm%p3mrm=}%XIReJ at aP_M^x%0iu2Y_L`Mo7l`>WoSY_J6(Q>v$gSd~$8uun;
ziSv-mpO(!+!YWFB$&naagj+u$75389oC at X`>^fu)j=gdcTp!0Pju-i;cT!TS?rVsw
zol<$qMDKWpVW%MH)lP*vSW%VRq8 at 5=>QUcG8DfMxnFM6_DoTKbqYj?|V731#i8U3v
z^7oSQV$jI`UeRO>6{-P=*BGw&$bhHKTeXrS4VSYE at ZQo^9l;=o)ZusUPToRvkVwK~
zXj3Q!6Ld=jb*gUPNvQZSSU<+#xK3z~51Qb7uw4dBh)N=FsO?ZZi!wJuqjk(6v^?S^
z{O8XtS9EaYs0GTG?pq3M-B}KzkgejxnMGxvo)ldAuE9^7eARoV{+F*`BT36LqV;HA
z!Jj<QG at RixVivf9kunh2Dcdv4(|1m^A*M$IlwW5X^MCOn7U$~x_uRbR!-wZB_-ga)
zl6O2_RWi*rcsD?Ik~pJqvPkg*Wf^bAA><gGQyULygfPi&yS&zy+IJ at RMx}yvcDP2@
zx34(J(Ht}h<w1kic1 at _KS(TpNtMAyXJWYAv{#_&kELJc$`9GXr at cjBVcLrjUWx{+*
zWetS9lt1Xe6KpvX%o)|_5e_E#ZcD+Z0Cv-I;)XaOtD1)|{4*#ahXv72Z{0cnxhUYp
zHjz`cH>V7QEEA6bcn5puRWGM9AW+Whwl5?Kn$DTyE5n at u`A)C>w}}6Q_KM60wtawH
z%w at _MJHCgL@|bKF3!)`Xt+(<SEP;E at wB5>bLgrul<1kZKAm9_=EK3|BoaQ$FI8bJM
zflltuuz=!TO_?{WTjG-^jzBPN)jN0Z&R~K>uuQ<>J=9Y at sHX(J;B~oNCmpW?o6K{+
zfw-q88FAhYD)5ASi-ls3Le3uAE%7ae(O=;Zq!gU6ZH4IFK;1TCgs?TY-XvTpT1A0>
zt|oi;n>UxoG$hqxN$W~nZ^nSf2Bu=YteU3_UBf>K4XT{z=ak<TFne1gE at J5`aKya<
z2 at N}LIEK7ZM?Zz-X;b3R5eiLm6WqaS=hL+nh?s}DDE;bK!Z{cz%!R5{V6-9ko!Fw?
zIc?t27i<ry3EdX~51nZzi72_b*Q;H?Zcdpz!QG_LO|aDi_lhA8lR3ShV>GVVgVo
zH at REJ^!K>B!P5 at Bw}3Ym{?z2=(DB4YP{Cu{V)V>{C at H7Z{5Fx|$L{W6Q}+B8y_e<a
z>>*?A*16Y0s|JH9dUxsam+cCYeig*mk;93t9J6k?V3sg(%9O}peU8H%{EbL=3#sqO
z<`}YIlp|sPfy|heq_0rfD`gF*qj at K+PrP}vkigqNmAe|k&m3rT`^?NRzsne<B|Hcs
z{9zBZpi|OA at m3VOr$W|=2?|`}3yYCT%i&XgS^Yi#<hyU`TvYG~V&Chba>nMo_C7dQ
z?n{S_pB5y93sMF}bw7DKJ~ed)vtP5>V&P7g#58~sn*<G7)tUtM at +Z5UBKFkLzv^Ce
zEh8|8fo8jHTZ~qCaB2C%X%u-;?0m(nJuD2-Ve;cwx;zQiw=t+Lw2)@vgb5Q)FRtog
z9v9t_+E?sjH1<TwS|>8QS232S98=$`xVrCs?Q%(UZta}`87c|0AwQaQY!i0`9LXxX
zZ^)FY!@AOwC)Irt%z&q2QwRhqdZ#?p1bb_;W47T4S<Lr*-$bZlEnvK1!zKSb5-(Wy
zq2<t(i5M542iMm9>AV(WixyWl<{C0o6QOVrIKkQz(=#@X`yz2m0=_L66|C#XL<gJN
zka7Jer%RA<(paYyEq=M!R-1Y-g~e-a<ql6vHIte@^{IRhjI5gOQ)ZM-c~<^c<9<DX
z7r~5|*R}9Fb-LQw#jX&ioD{5xW*i&&ow42GZiv;X0516t$AT*%*Y>U!{iTF4{h+j!
zTI<)}BU at cXPsPpWeB_R5D(@+|&(@GWWQN9sQZ`e=K$|+uXyL-+bq3$WSe;9?N49U<
z7Cv-?4q+wW?epOjW(J{@r83oPT=irdSntA)xW*t3PZZos0v+Ex8bfh3sPpu6Df*+M
zbrK#dW>F-U{y0;}C!))>{BUusC8<w`GqE$c_6nbir2Nu<EnNpmC)Rg?J-T(XMBmZm
zO%i3C7 at G)`3&dYBBNl>D?NQlODdjX>7Wjl(<W%DITBTV6$(_bQ;!6Xsl-<+)@ZrON
zdVg~zrI#J*%lgxDzyaJ;M(}=L-!pWd4|(+<3JFi*Uz2SemW1frKc1PBvvs%#MoS1O
zwQSueDeG`j5<}78jg+`d3nV=I+Pqmaj%IT<_{xD_G9Z^wT`-oCKiR|0b)EQv?Af!x
zq&Myj!*RCU+iXb~cc>85=U)RKC{U!k`fXjhvr`Ug{RW|6jCE16M}xiew1=*+)r*qW
zE8X6^hDYgTVWVMPxsh$NG<?>ICLTlR!%Cm|?Y^1da}y|}WRC^nbTVg6>q>DJu=Rh#
zp{fBCrHAXSq?MG`>{j%uY>nBSsmy*a2%LtiFAUw(`(^lx6cR;Eg*c(~yYno5MC}*5
zgtG-`|AmcBSYI#(P|kW;6o~sq_On`d;Mky4Nr*Dk;_p%>_DAk!oZW;Q<OB%{&!0b6
zuBboSfNMQO<x+?`Iy{)cAG8kZyLY>- at 5+fDus<;ROUM1bgA)UHKYKo8rj{5;^c^}h
zEB}V2(=`?WtV#yIe#VNfF3{ZDqB_&y_wRp{TKmGH#YyR!B|^bmhJrHwAZJt5)>K|m
zseqzQwB1q<xs+ at h)^C9J>*-Bkfwjy;@)whL#pQkA!3L$u`k;NhrE)It&tII@^glh_
z)TH#tOc_}Q6Pvsh2LkqRf-`g9Rs<{eD(GnC1hca*nQq+&!)_AF!pA#ZtR4fU`NlwW
z_mfF6%$vk>V5)l+Xl$Ri_u^5<a~d^ik`7fQ_J$WuT;-e at qtUW=bls=W))E at szeC54
zt1^c3*oR<NZ4gQTVpjH?dDHcB1c_AN4$3|<%+8%}TgcS07HJkq_$+EB(@69sMI5!b
z#`zn+b*^E?*N{3r_S1_T?3zklV(^v2vsPPqP!);8g?sG4pKc2t=X10vJUi at V<usap
z8H~TJ2&7YxzCa)UpHMJnh#8E6kbGMzBDN5|NN=U-zib2&+2q|&y0^eu%bvMu_r`<g
zJfxrqLgOA{1|B1UE-^Z;OS$o*xS>%g4buI2&iJFlUFKAsZAI~>Es7KIG0zHZSa9l0
zw;nyLnXjk|_QiM}(<UmE0|0c#?q^JGVYJpe`d#S|OumO-aJh%^<M1DjSch6dSG#fj
zga4b>%ZCkBjx#IGiAl-78gpW at pI(+BdC`wVSn at 6pCv!Q~Q^s?)R9-y5^UF1yG=9A8
ztP$o7R!Vdwlc}bs%oQ+%H-|N4lN<s-3v`jg$+$<LlnPo`W@!Lv8E)I#EcXyuq0UuB
zyxJRCmN1EJAHj(}l<xP6d)oFF69wH-7yZ^fZv>yyzVKtar}<!CaEnl~rjeYyHj=z~
z{!W$0qv+L(@LjlC+-7hL=WB?a5K^>ID|S&B&L7Vr>Xf2f at cdQZqI?KcJA*PS0(Grh
zS3+wktkHl3##N8oeQ~CqIr8Z7Tv#F0r5Yh(+P=@%cSYq~5-&Gpu$<6QoOfqBJ*f}|
zpc4L6v+ZF1#F3`R`JtBzgJI{F1`7X(OpoP#h*j9Lb7u|*`AzmQ%)0&UF-x3abNuW4
z+&SX;h(&tAC2xK6)=^niUmvE)YKP?Q&!d!MO)_t|K;I1RcXjP%_PRAyxO)|6#lC9Q
zT2s;YP#S5fD4E<g978AKp3PG)r_9m4<cJj!%|UJkG*OC!mp;kJKYwaMw(I)*L(9(i
z1<((m9CawY;8;4BMmbC*X;b`POX59Uv)Ya4 at S~VU6V}MtH|`d{_rvv_#d*m4^+&qs
zfCOs?<>+HPkhmLTMqG60$(zSpq|1XMaU>aDs3?85eU8&FSEw{jmpm7<)o$Io%}x_5
zH|DFiRMx8il*ZL#x(~lYM8UV*2;NVEup2jSJ%Xa?T!ViegXUP14ULFWKNS#AL<MQ8
zP04g1 at 6Ev87u`P~m9nWE4wIvuDko3y&yV9<f9Pj^^aOP6VNdl+=<$l{&8M{~q^*D#
zzUL6|6${J*FR}+(TU}w*Wia`^wcXs?W(tyQxk(v51akItfc=phX{C1u(y>b at aHhr-
zPSl_pkersU<|D?Je3C66|Gt>sw$%sf_E*ktK-5%PoFUn;8QKt~Vu;#VzjdEk^D|Yx
z5byiHwDqP0))+W2C0Gh^8K*0c3IHz}ygiyw{m~YQfx%nCXXN^hFXy$|aU;LrHC at F)
zou}k+qGJP^czaFW^4eH;uL%QhE**Dk4*^Bw5KPub1RvFPoC=MVR1qt%lHLwC&s^?*
zPQJ%4b?U)i&sS7xmO$b}1n+Lse-tfA+sxdS0Dh}abEO-Ce(;s&#`<vabh2UxjU0~W
zWsi8!glU7h!g2BuS~A4v=~tI4B>2gB5GS9EI5Hf&`Z(qsskQRGYdrQJJh;44+eSrc
zf6wWEmAH7iijflRyJ;kfh?rL^!v!X`Yfxf4j&2NB6HWk4Ff2jJQ8ozGsmA(?d8Jd2
z9^x8_W4*Pt(~5h}meD at 3ve<EBO~^&4{~I at M1X0{LlsbN`vKNVqp)044BBz>Pxlt>T
zX0{knN!OFk|6twv(WR#|{OXk`nIeBmR%_n_$K;(mmE$TOGr}hh86k(sVH^~1T{(Al
zQt76^T2-ZphUN`Qu3fw4P`c^Mo%G5hp}$XdoNs-#?5N`@rJUb&k0jbGiLAKrW~%Mn
z+jG%Mu=S3%O{yrXiQiE at Vpp5~e|7#!4J&3%Ap#D{InGt*WJlkAL<^aDB%#Wp6=B`d
zarIl>ce?_q+#1J|=|)i&k`3K_8ckhR{DIKi$38Sfn1#!XpJ_T^;J_p4ca*W$p6Pw`
zrwQ0=fBucit8UxwRK1{mHQBAY*6zAfQo385?%SuDF*R;+>LTX>NSH>lgC|h8JG`~S
z^qA`Mp5g9o+onT?6=yfj*THccN at YV)msh~~>Ez at lF`rs0R*9|2w?%?3>^N3%Z41SR
z#-jQQY8sg<_V3WV`J#;BQ7_IWSPy-*^*cxNP5r4m<Q~d!pZj6ZM575G?wOX*3-a;&
z;g-H*b&cKVxo}UD&=;m6#P|?#`a+CB9+6dtw2rKzy{0qby|slF-cNPt89%^3a8>lX
zf+w{#QIJwgjlKy-K7W(Q&7TMOAX4u)u>q=xL{|FV2Re{n<0DTzeIjxff>GR=qsAA1
z%3*qQBUtoW&`{MIzv_NKp_yrTA at V|R&z9zKuVL!bH>*1>>m3#M)=F6*78~`PT|~(F
zNb~h`9Sewug!c2V>@zkj6PwnoU)L<gX+n5{KCSMAW`jxsX=KWIbWU?ebn7-oim6oK
zbqM;0mrgDRd-FZ=iA-spDa0B(mS+6&zb{Gk+wGRwIO&B6A0F&Vt%vzc*oR9s01$1L
zs<j5WJ1x4}sB9q9PJ~MI!e%C=EV_ZYfm_Momp|EM#h!b4R5vNMv3X2c^^wk=wI>4t
zdef@~<P6cB=%KUFjk at dOhXl8{xH;zx>yME`Cvjfl#$TEZN??Z`ak}BW5Hn#+H at 5DU
zInT`Ou=wanSJ<?ICg2-6QB0$Loy_krt-h!)<^W5w7Dd}yq&#|I`c&G)g@?hWm)5No
zS=D{(CmMk7x*B7 at m)CKC{ZRcKacEGTmRSE%0rh|T?p+Cr=QinnXzbXwX5Wfs$wf^{
z2ztn;!c{9)n}~KELN=@aniVvf-F15vqufIG=wvnoAw1SLgHs{ZY(BZPDS`J%c^9LB
zhU at a@{Pv$eeLCn}cObhG#z%^B$y3f%8QoOB+|#5lRT5QgQdzc8>#6wuVdZ;8FYHKr
z$o;zWUZ#wH-l2`{xVgMg8;1t>Zr!pCS&(#vr*PYFQA5Y*u8yB;F3jpP*fsy9{naDf
zV(he*2ganhws*YU>uarMNi9fzt6r!sFjw?wrjbCW_|N%1=v>cUOH3Rm$B&2Za2GQ+
zI()2KqwYQGriPT1?p{+USYH~jrDZ%iHDHPly|b5d*jJv%K(e#aes0w#P&`mGtn*F4
zZ7Pu%UEqwZpV_X99>i&*2~Y2p#8=KWu%Z6$uAU at QkASl_g%>pse>W!=$w0D)XIBm=
zI8lc)K)HLv!dCfZu;?SH7ZTdRR172Y`K8<M7wDk&%!3e<d9HmW1z0(N^_5k8dHGtO
zxG3g1ixBv&JDa|_h+_yJQHJAg9}1r&Ea=~&M$2zdrx5ove3EaRv63baG|8Iye5@>0
zBH1R=p^ce4Fsu%WQSCWOCEv($&e71{4#9a8y!oqPj-1%LDp33mH><})*%eGpID3_f
zZg4-Y%VOo0rAKU}`*Aq5Y{E*ycOH6-g at G}53T|4gsR^U!8Vu{@Ud1%CU1T0iQxLe<
zJPo23tGe1bp$#)|)H;P>LFT2h at 8?`zJ at lIvpgu+pS)iCJ_#nrFRTO8X7#_u6f^eV~
zRtZ$jR at H)BNHQ6|-U*y0-VG+4!Qe&QS#H!N!xS8@*b9db3w!3{{jZW+>3?<;*#wnD
zBg-|3=}(Im?bbg{6X>AlPq%z{rsysn7PpC7QdGH>vj8%e*bq)HXseet+4MqSt!d~0
z-LYqJ559hGM>U#wl!do-&3ZtC%b_IxdEhl4$NYM}#O+JHw)0jZ7UQ9`2F=o#J6mYi
zFzqo-f$e0TP%9QAHBICP at BU##>=rFsE(wH{JM4M00wDK>GgGuvOV?)p>=*^;!3B6$
znoNkZv<`Z|zL(WbU4cB^E<ww#{oMH}G?B>k-JRiKiq8)(I8`jAwc%q_)GVZ>2P)KF
z(dfb<xZv*p!`^#GWtDAfpH%Qz!O}968FLO8Fo39-LxC6&Odw_ilqjGQtzaZrilTxT
z!HfY(qM)S&MX?kS5fB9dC5j}K)W7-iTBq)JPLKYhyGM^6<73==N)h(E_u6aC at XTjE
z)9a6cRm|=KGY|<Vg9oXp3($r!40!+f?guJK!S62<C>L<1MnBR1_<FC_;(RbmQCt6^
z^39t!My4Tsm)tgCe2}ycBkTBS-4Cs)85$9;^f|dji`s$#FnzO1sx^MQ^O69j^#BG!
zj#*kXU3=3w;?wUkkzC!VA6owgg7K*p5?#JPRO|Hi?cbbRY;G>fVXNiNfx6VSCI!gE
zLE=-*=x)7*$`jKNee4C5CAcAJy?ZJ{u!tUw0CKk at 6tRar;rxllQ0_)gLL?DEP~^7h
z8T%eLLoIYJb(|k68M~vY?a^s1Vw=YtlnBjlBdiyMsSVoU?VXCtoi$^x9h*R*eJlJe
zmceiLH<!G58?OtR4^FZsK30SPR*)!+Yb2VHl0qmEqzU=7L*a4}6MDpnMVF=Trp(wn
zGFzEJdchoCU`Gw>qsD(P{%8F5eWYj`5JYd?tmkO+5XOrFsg|K}^yMVjjd#MKL#O_=
zStY at Z8G%cmUbgE+p$A&tvGL|l`bqWSw<*@s+1&FH<@lje>MbiSAK2Z`RCJaUDM)D+
zv4q*nwY;-Wyl7!7(m5d#Q^K)=eSY67??>LE?cLHCCIG*Ir(rmfsOkpB$f5W)0Vh;Y
z9|gR@(+PDNcqI|Wi%&p+rGv-VPLws4x2vX9R7k at 0u*!vHWQPua5 at lbwCS0ql@~!=i
zT9<qY3a0*q`#W;tix}y(kv4XN2TUkog!0bJ_i2+!Fzm?*I}`w{Ji_}P?wSyr_B^wm
z8FrGym*0MUi-3pSKPvfO?HV*M^|>3ktzYq7cDVv|a%6%6A|QUd-&E1|VphK50O4Rn
zhUO2O%Bf+BzSFh*0H^t=no2o}wyJre=|&DM6eL83uwx6>tO-i9DPBX?sa9R*`2O`w
zKkX$;kyrJ*{YC*faaS^n<A+L_u!i-$VsY{Mb27B($Qi>J(!)s@^~5TCR}C_MqU5|p
z;ba7H3jU~Ekefd#x#^Bu2;EPUx)_E6p3gcwrZTJ)8u;;JRlvKa5k_`MG;M*xN=KPt
z>Pp}~b^3I_-3g&W)nnZAsb-ZTe8;J=b3JNwfM1lPyl=q9N#dO$yB1e83yW at n#M$A1
z+k>Q<1J9;eCEM<;&^>$ITT1C%a^+41fc7>AwdQpz9bZ?W&%~p(pexiL9=x}w(RMC8
z<VxsGBI%*0`(`2U#^zx8Mgkm(#Uiw3pr9^VDcdSull{8Y6`E|dhwdskl5ga*91bQl
zH~r{q%M{Vau55f%5GaM|$1Y3SS#01%u*XB4#w%CHdSqivchmSLMPknP$R{hw6UfvD
zWjVgQ`33BUg((29Mh?ra^RGfUIyRoBzVwnkn?`RY+WH|BI3EZ}m*i|%_qj<%F|IP=
zPw2TI=e=eM=K*-Aq(UeNTc3mJ%JK-FNw?H7SE at lm375GJ-=1053H@>@j8DEnFfYwP
z-|l$%4RNx8>{K|Non!KuKm8Y}a;~k`!u+S~jueEyjLDCS`fbkf9DNn0$mDT-`b;BJ
zY6Px%TE&3gN@?D}=X4)e`Wr<VwvrGxLQXtOIb4z*Ev%}F<k^Oy%<0r9`t!&CSe<P2
zZDgY91#{^dfM#&T`5|@wW}%?nhC-KlXxf6vN5cG9g+3=Sgo2&-IeAT8<^c2NrTnt3
z^yDY9tT&Kt)SocQ?<B0!i2HiM4TYllh_QLF<)&b!dJk7x+;ri2KboherJFGe4Q`A1
z=?0X<%n6*rwAN}R;tBs&Hy7 at 6`B%5POG7r6>2<*kX%rA_Ie$u?CK?&gz*ZDQt_3Ai
zsIPaS6b4mX>*{Enn^3373nCP{suq~>=EW{rfPe-RM$dHU91E&TvrP(5*6gC{uob@@
zdrCrnTlJuFiMquo5tWiwl&R-|N;j*NV8pqOm$SZkO#GcY&&K(UGe8lH)ZYiT->YXp
zN`drx9NJw_CA|-_d!*Ki*-HWK^}9W*Y82{k$h3ASkU#^pOy>vli@;pWT=@$SaGiom
zz~X6)(<i at Z7D`Y!nVYoV+*X~KYqlK7W6@|4Gre;u+C`(OL;`~|;(JKi*eYR2L13`6
z?53ehzFS_g$PZEtwHz(2KDJ(>mqWh0b+gokH|G4HuZCFg8zz&Nzd2iAXZ3RSzt;Tt
z;}mPd^KI8nyn6KhVzXWP7CKMDs($+MoMFrJleYZU{hOH+{yNvgVNv4CVyDU%-(QWs
zVKlJgxqhc(kNwj2#?v$XzUz1N7u_wd>rUucn(6&GG%f!(=kXS+msgc)I=S82Xxl5R
zPOCf{n%1Vk93n1n$^=tLe$2=Injd&JH!m-a%Jq@=TW{j?;=49{i0^pA)quKcz=5%w
zYy)%H9y*H>F0QY#Z&%H5_g=8}!s0Lc`}_Cn*YETr=b|V~K|GdaC42d;mm<?|I=Bff
zeePpkLo2*EzqUTnq`sB+*!MF6(@YvZrS7|DVp3PIAV(|fqn_uQ^Ubq9COOV48Q-<#
zFwRfJtF4_@;Ge%e_49 at E=Ldo1bmZ)xpTFm0<wZB+oF?UDVdLRC{75n5+*OBEW5?L)
zn1;G%SIzW2*L>)K_T5|~qt2KI*LCOu=iZ++I<pP-Zl*?BR-$>|!yD!W=HO{`Ynp$6
z;5at}M&=*BzU^3zvyUub;`Ja(ZNII{=Cy&L6sm{v+J3^%S$eLSAvG_xYj2J}qm~{R
z+Q~Aad+ at b_vv<_zs$&k@(g0HTIDcm7UfUqSILA`;l{rE`Tg24n4#|nis<TAcRP*v!
zAVkI7dxF$~7c%WrjiHx$PqE#&^m&v#Sne!08ub=clxArYUhSLVwLQk|NJH!p*OsY9
zcC!Lg$Kf1S3^IxsD$aaiz#$*=cGZ*>r<s|(EqSP)`En!5(Lv5PCSDQlN(3o%4#vTQ
zgVD!UU4bGzG5AiJi0u<>;#J!LFjNmzjVTUGulnE&dtewG;h*gQZ_drXcXvJ`G}brk
zH0u20GN?5XIbK at FIS-eKtVi^!F~J1wAmqKnd)F`Nl at 8r?O8s?STPK*cGa{=R>a!Yl
zsXrX6UjHdI=IKT+H^aGeTS7hGo~)-e7*_S!K^`V>`-cJV{gzyJk+!6tg)4CI0D@*6
zA5XbX0ArJ4upoBsbk(0Ie{7c>ixbPCz<%*jA;9{MVT|QXc<|uD)hhP2CN;H=a9nlS
z0vSY=Iq}-{Hf^Y^UZ45;dU?_=LXN(BeqVK+4$}VLr__ja_4%zM?rPP(yS)<gB-)@q
zTQt;VHK-C&>=f*Mn!3-veX)4ip1`BIZjRbDX%DkcY1f(Y38n$QRV7yv)pj+MyVcJQ
z%vrs9wGE>l<5&xe+G$Z7k12F=-YY#w5W55CqS0Kd=u*cAyHDbQ0-Xofe^e{MI&KW~
zv%eA&Qv4!d8rjxmB)#5b#kdK&=URErq&Rw_^sn!NDREM>yBNmK{%xe)uHXRdh5UV9
z<K8Fqbn>}DesgOf*nJmuKGuVp+|!NG1sl at WhsRPOI%F$ZV40_tb5BcH+&)pKpZbva
z#Zsf|1bfn(%pl&R{=Kh{ou;OyLCGYO*1<GHwI8!#?Y&TH8Po7F*$ZMm8L$*78~0O6
zip5ZLHK}=?+Jo{Y9eaU3c8eA*8b;541dBHChWf-k!BHjGG+ytXJV2Ey`i6U%HWrgm
z_(NZ at m+QM<yH0^Ym5l=Tg$lJMB(^4=`5J^m=W3;0WmMAmnxX`zqRt-w at nqcavAmo|
z*zk=nw=|s>EJ2C4TSK+m?84M$DW$m1;Qi(EEB%c+UA4*@53T#yTJYq+P at t&k$eiVj
zj`=vtv(0|r!Asi8D<!iEGAf1JmchPHam{pjwaKg$PQXFi>W1yxIUm#5T^2=KZ{lI5
z6CCD*$JDJ43?<jRBOkip;Du2-6xYePva$0zkv%_99Xt-yH8VD+s~8%+v1NDU{SBfk
zCb!&l&&5>9*N&>q7441FD=Fo)#Ez!tEMzfi6Ju(1SktMj-Mv=NXS;n$UW;d+H|*S0
zJv}{v#)mPF&`0Z-RpzykuJz?d;`z)@FsHn5tWOs1KNYZf0HqaaSl at Ln_}YK~IBWw<
zX%y>-AuP>d!=Jl6_Kf0FjBH|m>YqxTI!9p)PVUv)NvgFVQSWZUI`X?=1c#z>Y2=W$
z+G#NHUaA_bkXJraFP&7ixziF$>Tg?otuS~O-CSdcER)S+N~kC0v~c?{*~sp}NE`Z+
zrx8fyIL6c%@6*bx#wI^kKlwiSNc{*3$XnJvIXyQpl>A~kK#IThpWoU*fHxfQ%B=&>
zd?dRl<e?WDouj4A$45P at zA8KihN=ga&mi4?@BF!QFV}3kc1_zn3JYtPxXEkm`vh~%
zhrael8-n%FpZ-v6<<?2z2EzE22)K49Ko83ZbPaWqVAI5|_BCz`rnqL%lCVL!_qoT+
zjS#Ztt@(K;evc4gkQkDmFaDriozT;Jij1~0)vj4|eo1)n;^2?CuK20#jN6zVwudiz
z`S|0_mX?+%`VNWaKowPvrEBr*zK3S;R`nux)sR$W at 8}!wEazGN=<+|ha2U_OuhHS1
ztblyBBlEsO;J|*C;nZ0%@%>a(=I at 0RI2<@Ws-~Qv<H<A2Upi;FHq>OrS4UUh$UH(x
zXj}lW{fIt4zldq5iHY}itvKNl at bJL{PZ<B|UYdCaI_esP)ECCo4|ILM_efFb+6-dH
z_8Qj9{E;bpgjfLz{vW?EMr3TPEbl at FU(rf3B7n5xXRYi7xgP3C+reyO`=9c+osb&b
z9J{@p at XqF9?<(GKJO`|cybxK at rdJD#@K-Bg0nc5$xFa-#wPQK8HS_&rUhmOafo$g^
zx;E>g*UaiaWQaF#K-9g*Z^UxLE%K(sJeHGbHz5^?e!J at gOl4pc@tmX;Sl-KMQn+j`
zT4Z|oC$ceX`U76N2fK6wcl{Xg=J>7^yj_E&&XhaKa=JEXs71W|<qfUlu5PMAGbsCO
za*Nnf*XpQ^@Sdy3XgPm)7eOVyb!PWSp4#<eqDfpSnC?bWit56+-Gp)RkVF>z`nHN~
zdE&#p1<|dj_;~D6yVmb=p`kAuVhS%cx?&R=l?!v#UXPU8l_w55-s0kow#dMy<;PRm
z?7x4ANp$>Wh<<UjLsoCjF%-{4An1w4;81|#(1)q%48W)@^LF!)H7s*$C~e3rj5^w^
z>-e#jQN>{iNl6|qhGT~qtS9vww(i-b2$I^f{=#){)>&gHJD_wb>1%ai(C=)dJ3!0X
zVvlO$-D;=r>s<jb6$@gRO^%t7vym#D*rfFQLi*df>1n+Bjks)kqFU6tBVB!c#2%8E
zM88x0DH`K&D&tlCGSOMy2vfq*jhU#~P%~zCY(14Cn5lQC2>?c20aRTsT>sdv{t<m=
zE1q3i9;Myzs)gIaTrE#=L??g!1vR74t-olcOubcC8k^l(Poq2OW2VcY81%+-v>VE`
zEi?=sIKeK>cFL+*D&E{g!*B22)>tlcf2`Fb?qDqp(5sf2o2xJKnM~9C)DPD0?aUYe
zu~8HkBR5jW&Vj^`c5xkEzzf>@hqQ;T`&&-E2~;*#4bJ^S9=%;s7(rX~#|Ku^2)s`K
z(%L**zOA@^Ei45Nvf9&N<4!P=c3|3&oUq7&q2tN#JI6ST($4Wv&wjeZ%99d^>%pwW
zo at vC8a(XUH6SOI&tQ~>l4(=z;?9}15@>{~9qsgQT?(#CcNp8S}x7VGi8X~Ug$zsQY
z7<6R;8uW8ZiVWn9dUPB)0QTVF{a at x1QU2J@c*ER%T3QV!Cbt+jg7RxuQ-7OjoiVyL
zY~s at T&7UxeRUbZWqUfhEvw`!h21v{<e%c^fYvL?niRza;_PfhYQ^cnC4hO4ea@<($
z_t6rkRrPb~y&5Md0qBSHtopDl?^y=c-rE<_b;tgC_r1<79zblwhpO-x)%ebKx<cV%
zdD=<Dg8S_SWBS+3t`g*F*S>0js6)_ at vH4Jmx{$?XmS)YKb*}KCj>#%Gsy4jklFGQ>
zw{NFAIet_A;dT;Pz+0IL+3o}}1E+kKEEIuC)63XtxeJ_S>#{c|yj@>uKGe+j|B&id
zm#UGyz2|@n#a6fK>_F?hINw7kRYzudUog}DaH~bOnD3>gRA*z~zzCVN<MEKz-<NPG
zcbxDVGeF`$QUPNl>sw7alr2_`9wZ5fO1I?xh&9Zy=og`H+$N);Wd9P&9gqQvlZ&_n
zfp?dY{{1=twVAbP*DjvTUS+W@<IrQ?c>7^1rWm<Yrbxf;hWNDG at Jd^2f4n=pYVk9@
zKP7Zl#_`h(4GkBEIR7EGrAa%ZAK^0US$M$`y(12Ril}alUNsA`3tG+r=8CV&iXQjK
z0y151f{zZY)a;6DN20`vGH=B!vdUNDKzS>NOWM~IlR)mG(?s<hsX_gRg-i$;!Cw9}
zsrUqA0lJGH>ipNra|0r#Pnkb|{+$cqFFKOoa<sgLw6-}yqB_2WD|pm*Je&AXrzV at A
z*Q0Cg%ce~?+>YIHnxYk`b}Z at 9{M_n~Uk#3!UR!r~m)eaA*7fo<=SONK?ToA^*79Z+
z{CVc_K-RitODdsvzlaHGy=s7Rb<@_6?j7~|^mew}wb{QHuy9>Q<W_CpKDoJOFU09v
z335#eF$h(Q-5a-_KY#v1-sqSP0IzP>nKEw!y0XS7a$I(4?0e$eJDi9OH)9iroPbmS
zoawPq49GU^+U0S+={<XZS9J6qSG7>rZ`5F!Y49f0&d%<HTSI*rq9S)_u<u0a+-ykr
z^eF;jSi;HL2(NG at wA>v<n;EfIBY|W#k}xwYc2sn=3OYL&w-gfp!|$PYG2=PMcd3mz
z8o$QWG(HBe8Wfn(rL6j~ozyYwu1kzd8S4XKO&gkNPFIyToB;T{LtD#AaJCM{mfok+
zWr?pQGYpYeBbni87*(E2&v9VNIMQ*<9WsAi<4n*c_nhMTqTnxr(i`JVsqv4$HKNGV
zRxzNv*K83cIqD at XH_f_?{qTK0{ZRoE4!u?t6A`cKD6?H!E-<z?V5G_EX%|z;yfpIt
z?T!PPfh~A$EV>+ at Jze|L+{NEj)fB=n_r$fR(JFlF4G<ppLtG>t=L00@&N6GZnd+FU
zhP55)PLR;cuD?zgW%FoiI|)TSjSF{AZoUJi#1N`zFBZ}Wjx})G-nIVSHW`=QF)DA%
zn7jikS0H428MPwZ^Y`YjJ7R=A$pQw_T9)Dw(LZ~Sj at k~%mnCW;Wt(NOe~5I|ydhD`
zpyea9Bqq|W;+#p{0HTO66Yn!DT!usX`bR=-{<$)iBxxmvMiONX$JEdx4G0-1Y%PFQ
zwnV#6^8-oLV+my0Q7^XpSzhbk^N8EodF_t)R`I+SvhgQ7V(Kd|N=|7|7?YZjk at 2C#
zF{Tsf>oQ`y9)MZ%*5}t7Q3XCuCT|0Ry?TS at COS6z$Mg{+jUAgcxrcZ^_xrmI=BCt`
ze5o>F>n6(7)z9W$<sB>X;y%a2KGD$}6CZp{j37O8V?1{xd at bjnydqxwI4#ItNKaSl
z93IlQZ(oUG6>pEzsCYh{?a07cM at YC8F9=v-CuERV+Wl0?GMhR_qqlQMypec~isJOq
zNm!=E23{HM=vZEg5AO?WU$vA)@g1{33@~dchF+Y!Or87V at HUG-0gStXXU!2D0ga{{
zA~vm~<uZ0s0xS)tc!+82VAAVU9x28^lH<1U(zXM`6xoNdJc_J=rt3*>hu_9a=7^ah
ztB9v;g1NQ={&3FM%Gx1um0WNwTlt5Rx&g%8u!Or)J?JVHU at T1Exl5NuXXR^9zRKA-
zFnGHnRs>%8s=vh%$Z~hioC at gJP`mOF2uGLsrAMz`1g?&Vw|FN>8q~ta2fk^(RN_{k
z(c=1Au at sU#ndyGbd%DzDY?S#AO&rhe`bDc|1<{6hoH)t|sx;~^CpfUIjwd^BFWyxw
z_VR72ZSj9;IXS0Kc<mHkM1tD&gKNO8%a}A3PdUJ$A+0v&VoNu-aCfm))fWXQ^0&R$
z-zKhusp4*lS9QuuduX!hcFMt%K!!5FREZKK3;V#8R&qsgikT+*+f*H%mAH*3l@~eb
zvV9kwduPV{-tjW9_(IqN5 at jn~CShrbH+>#bojEQsjv`hd)N7qBM;xE8mRWXp4qO at s
zrafp#W-i`BAg3!=u4F%3>Fo(vGlf7fdr8)(rxWLnA3q1AOc99-BBwwQx(d*RRp}>z
zfaI2BUDNpF<C0WeuyQ#Um-Vq%CQ)lKJv$zN;IR_xP?eZ;9rCusL+swk)aUOEi|^c;
z{^1Rs?d}hY($*XE_GHJjGdIFM`#Go1T4J$iHJ`QPv4zR^C34?B`}fB|x9$i!>p?|2
z^67Q0FIRo{U%dDiD()K=N7}A-F19c^ch$+s_(kYggIhP)=yC=(QdL=j9!MEBA{M6*
z6`w=))>0mFuh;jXha_}W+5NVlq-u(sW)&5)Irz>q87~+RF=mP7#h)qf%BU7L#Qa=c
zGqW>_Ur_11>PoUwo$6??_>~;(`W$UA4sBQGj*nM`VNfJ7S!&wFsp#@=j}=#*d08pW
zJz)~695Q#@sdFLc#JSurOIQE+eTHe3ZX|(b{MEjFKXJM|=p%>?kFLD%hKRUhvZCNS
za^h#9sxQQu)~3hQEeXtl&7d>+(DP$-I at wTSpGFbvI4R>Jl*=TnzP7UQcW3<lyM!y3
z at v7sz*hGV)%MX{H>_0cJ5F<5~e#Ez4iXZRQPb*XL2Xv(!WCPO?dGT=>1>#eU!=oqU
z4K<&G4s|z`nNudtpQlt6J-r+T$qu&JIIqJF&&_NQFFDn}rL4e&HGluiL~Oa2AP-~4
z0~U>FoW7i}PJu=8lOqMZkzLOXVx=Sj3RGSr at 9%4Lmk?Wk<9%M<okpwiiH~<H(&}y@
z66ML)lieVF@%WW$4QaD#KXloIL#-6gv}%-MD`CGoz9XxP9pd&e@#lEbFN<o0ETsE@
zexI-5o^Ba67$_=)2O{7RxHjnX&FFuA=ruIYd*I~GJuV}(OGv89=^!`Ye)dDB`SJ%9
zcXJ0?1>!NDRT at tv5GNb-4{F?Wp_47IDM>D?e&IOBM%d(JAKTVtC;q4#p|kzXd`SZa
zs4k)S-WhDmV0 at p^qepuYB7dNk(^af7?)s}}MagZ#`aq>t;g2n2NQ73v<sa!#&-(Nm
zI555NK1}p%WPf&$!pDPJnGaI%rzZs6(~}TcZdDhn+2W+upOy!Gn#ec0&HVggTH3tW
zlpn~yNHBP<v5bH6_r^1!GGU4l$U at n#U2D5ZCqY;<+BJ6&uf_^kadov^NoB^Vj15ZB
zwS=$XXDX1~DR)SwI at 1BETk#2txr at x9@8((Z<L<gAl+W^RwouGU6faoCexAeU1(Tmr
znedzP78HL|=`cyT(G`Dn_c;1*?M8lf+MIvt-*)Ty`9&*!cy~($s at ixR6_tc<K0mqQ
zJFC7{?wZDbAO6e#{MgTDQ}M6=FMjN##_e)4ol24f$BF|x$5h%5-g-6O=r?ksN0VTC
z>PSG7`B}YGrQmwe=NHg;n~I-od>;OH_>{(L_qu?~2i-YTBI2R*k5M62Ui#z?dFVO$
z<mzLRNY*yQfBxl{M^>Fu1g)RHG39?QZTJ5lEbaeCZ}k7ckF`}ershxR?#Kq+nB}PG
z7&tu=<ioG=_&AAum~f#o&(CTa7B9I`Tw7k+={{+1l@#K}ci8fOZvX9y!|U#X%v#-A
z at at<URi12;a28l<3ZC*_C1yzCyFbsUbW{8TiSUBR7Z6_r(Iyt?b>KUds)yaTb>5 at A
zmxQyYPoJLQDCfFc$Ua}+c!KyI)L0~W at lh8GLOYO@Qce)~e%tqJ_lkal2YbT7+DJum
zUa%<%nn3Rq;{<a5t<g(PC~h<xATDNRwEquR)Fuigvcn!tg(e^X$Eyu0yE{a`saZ`$
zU<Dl3VaxygO;CqcdW{w;berOM?|uw8AZ4EbtiMm;k<uAjl&K`xk{>*1YVxA&b$O at T
zmhdYzK&)EpHQK0yip)*r*=-Q*c7U{Y5?<$S1|aYU&73=bejDMgYN)ELipDe_P&d`f
zfctov#D&N98|7IT9HmD8V{554Yjjt<j#X-n at lTH)l1d#Ix_lDC0orFj75+k`AYGKs
zIi0d*aLFg*iOsi at PsUO8UrFrN-&D{c3Y{Lr#u7EQ`h1tu6{fNvg1l%doo4qBjU0%_
z*=L(~U;Uv6`U#SuAG98$a=H#-uFkZVc%U01_S)YTUp7i|_P8HLXZ*-?x*4Buv$^6n
zPoEF~PY_t*(UR@>wLpK(Tp#@vbTCVel`LA`=dX$4kOYZAOYsiH<atS*37VLQ)D?Bh
z9c-xIS}Tgk6Fw>2`UKSw;HL<JkrPmwiOYO!^FX<Ffe`dd{bIroA8PxA5Y&%jmP~+c
z5UJQOv~))wRCxV4`3j3PLG?1>DkI&d(Wx_%L7N9`^FaJPXey5znQGKp`7BQcOVq;}
z92n>1P?Qm=o_jx)tg-!QOCuv-r*BUwe71Xq!k at VRYQzIc#)b534!pP-n#m9=+as-}
zKs at MWv!0}KIvwUwXnUf>#y2;xh6eK~th>Mc(?xf;HeT>I#dF at Acox)JD%(IGI|Sv=
z6~T)Y)MtjFS|<Z}|NQm~cee^UT;qYI1Tiv5swhkyB1j9l=H_4SDt1jbO~oO${&4^Y
z2Qig9cn$qvI1Ab&k8NaU3fw49Q$_3;u!HzzBaP+y!KSNM$3ipfN{NaNiBq4?)&oTZ
z=Kkvp&K9#e<JsT7w&S$4v}iy65kKK6g=@~%&3ZYhyp}uU1xIY_%1a9gI|YRN`%21{
zyLqI(;*?bSwCl^f`=^FnxgzyMbSXMZf&S08D(*vacD*<l2+?WS#&<7e<9DVU_4x%9
zG{!rj&tUqUKz>RxN`tx~t{ABm5S476o1N<I-(2Oin$%V4rk78Gnb$K{m$*3xMKKQ^
zc`Zl`>nSUCbaUe_8C(I%K3HOPVB5<?n?CB2#zXVaC_Eps=ZB^$PYx)LuCBkvuorF(
zb^oVF*SYZ}%-JO%v|#=b0A4GBllq%RSA|}T<(%eZ?;4`V;oa>+?0<)RdL?+nWe%f{
zI?U6ZvN-{Fj)PZnY~()OziPB{p*KIDAd-J|ME(xh=27(W!bpC&JKMEYT3VX?#^dEA
zno`p5*T264)Xlw5k9`L*3KqeUeFT$ZhsxJ8ZN-k+eM_R=2n^8*Xgy`r+E4jwetL6a
zCB5v_5f at CM047^d_Y&rZO8xVtR$H~Io~;yHN!MO0K;_SO>e6_p9YpMR7}Gc96`n_<
zCs&td#Fg}$52IKEr*paDdW06&B48n8!$$I^T6oI;Em)4MG5x+h1`Ztf>NmxGUUF=_
z&x!XE6Ia5J9R>s at 4Y~SBBi273A(dx&)dD{93lr8~g6`FCz<`}n<^r0Wmm~;CoR?~+
zb|%g?>@xW}YTkIsF9r-4umUx{VaP>Ee#a%LrcelK&l%jwv-a};QRTGf|Fpw46W}IE
zqeaq~!t<+cD>l=F?;0<-CNMB?7-ip$%q^Z5oO*7-5GmP8<lfUuqlX-qTQ4cHc|mE6
z1q?gu|CSSqN at H)qguZUn^t~CNh at iU75^980buhzYb2mFUI5cZNv>O{$*d4lTA?u-=
z5!^X}cBxb}eG0Kml7~&l(8x2VSu39P$HqI0pi8^Ac&{ND6Ya^nY)F~=9B8I;dSLV$
z)m7tT9tDFX$|O;|fP57USD5!12?Bz1qRR?R8piMj^ph%z($u+&6O0CvvsrKm+={_+
z%RN-JMv-;@VH>18!Tkme@?c~4W)1mrzt)(Tnm?l)*G|?~&?C|l{UpeQBcb%R14Lae
zcHmm at f7rzTeuhu$D3<Ez*7GJY;{~yTuxYxE`gyJ{lmjWk{@Vqqd at un_6BO$J5~2cL
z^fwiBSqcag0s2tk2~eJlf-f6g+Zq`nN`-8iI9*V`{-y$E$}2%~WeQNKn3A($co`u=
zoFF<O3H7xN613I!bwc}5>lO;KqTI)w?>FA;Ar4kgRJA)nTlJ<w738m3bm?|>ke}sF
zx=yD<#F60QQfXCg&<&|_O!H{3-~q|j{Cp`7#id^A3>Y|Ym!@6b9RwdblWgm0CUf2*
z5T%k`Asj-U$o;GE#*@1^gF?+^umB%*I?>l*)twwg%1lKidW7PEH6{QL3B^VpQIOOA
zreN-!r7|e>Ea at SX>lK6$zC`5iU!p)*8&B at D%PZToZ95GH%&OI^Kfm!`w<toZ&h8L6
zKM0-44O#<ENqH<_?>^#$il2DmA5&LsB^)lm*qz|6f&MbcRJN4b^>=?NUCEsEMxW^_
zLQ`UYX!iF1+bR9S?exl*iXZI3JM`I{INNokV$bf}c^v3O=}(S^H99z#cmL^GXCLVz
z1^%HOR3>b`KwgE9s{Q at qUSXx3I_$7m>2XhcDqg~}AxdXoyVS8yF~^yzl8{ka6E^PF
zlybhTCJe3~im>o?Zf-1oJR8%kH>$H@^`)rFA5Ok2i7JhQQN9u>N5O4;)CKRAdJPHK
zUe2ZaeFG}-z_eacZur|INF>nL-+GeLxFu{*ocMPwknB2f05MTvzg#9T^HCSLiIOS`
zKf5T)NW`@&`ae!Dn`Ib<)c at u5>NdLHmQoc|gk|h@;fDOZm*S~?^#I+LEgCwTG-1%f
zOWh>2wTk|@=H5ZhcYI~4NmruMorHgVlt!U3^Pg~74$=Pz)&5)9IiYxgp<!Em+YW?l
z;{dde*al(dr5HI4QS8pP3Eh>hsGGjRxzFiataG;j!hokqZFW1UfCx85PHpq?QbfcO
zjTX;Ol0)nqZmA0E>|IAiDs|LLu|JOL3A;gvXner+vbatdjS*(82snizFde8~Vr=Vo
zG<DeB_t#WMwJ)3U^-N8>Cv&GO5FUZJ0ScAj?QS*2%X!j490k=S0c`J8BEcL__9O=D
z5%{a(M2w at 8(3{1MJ?!|R1F-chO*>v>EQ_>)Zm>W0?%k`jR(pa3__#UI3IJ5%Y1Cxq
z->WPtDiR<};akXJ<dW~8V8x>R^nZ11Pb${V`Y+D=A_ at KI%Gqx_4u_0iUO~5;&EuJU
zCDd|vqh$HNgieYb+osJODsBgqo at 9>#n7KL8l%m<(g$vu$7UO-kK0KW2hcE#(*hF$x
zZnjJFO|_$S!Gq9CDi_M_e7X^q>O7)qb^Js0!^OP`n?TO-GB;AvLGZQOKnXr?8zh$m
zO4KO6n%qiP(cC;?mV%3Q^l1%4n{%Y@|994qXJJya*n>KpunH9Gvl`i!5%3gOAX)R@
z0#rGzr}Y|N;9|54w=c1b>`j#3lD)(mSH7NXi8Wb%dE;{qQ)*eso+~5l3o?3`l;j1k
z`VJH7vwv%?CrO-qr6?dJ_r>|tWOhjnO-{5(2Hra;4nSPv0wbHLuk-Tc*tj2>2dz?8
z5%4{>q4r_JN&hoEc{3)5la)yIU3m&#CMrVjqffEU)9)YF8qH+iAE_nJ{BKE%%AR>k
zmv#}hCL22*X7xVXAi at -3=e8edKL6^vwBet<Pa~K#{6(~n?|<{4k8{iYx_$q5ex&qB
zVy~NPzTT}o2$!@K)-z!tF6S~LhwZf-)(M7{t4p`ZN_ZSLa3SI;oGG00 at K|id3ap8|
z-e+`v+&hSSh^M@|0y!?xUHyF7A&r-v at m~Wm at wha_4JQy&StZ?Yv2^pPQb8_*%Z(rY
z&#+fs&$CVn?>PJ(ucs4wE>ajeW%Tggy`3;vCDgp=oI6mq<I%7W6q^KzwaGv17{?vz
zCv|qru#rrz{qR*Y1Q}7<z4?u|`3-=yi5&Z3v_cFp#SXL!&#={jiqiYmDv<3pQsC1)
zG@`#0_yjs-uxbBOcYgb}wd78uCCUu{rnbUbb-Ms?dsrg>zoTC%Ye=-F^n5RuT^@2#
z>!C)DhupYbl4f673%;E71R`+1`poz62yy-Kf=(-Q6_uvvgcu5-(wNV-oGGju8~{%$
zeo4L*&oko*Pq0#=%fFxB8Ct6+HA2mQ1ocmv(7(J(VqjDc&M9Kx4BN!PA}6YhfuF2b
zoU&dk{v(+I##e>w;5jfjqKB=WorFpgjOmHkqwuoO>;86&|Hv%m1`E0<-lDlcW>UHy
z=34uKdD83u>rR?5MIa?&9$}vN6h=lymYwKY*N+i1?TN;nm8Pkn5dty4Llm1+UsLLh
zZ&hX{&<ukS2mME8qH^gJuJ(Yoo2x`MOOZeFQCC7$vGjlniAi~EH9jc9oH-Y&0^88#
zloJ7yN^Hm at ijlI-Z@y3>Xe)TRW!SVpf0&~)sp*e^a-<60uEc0=-qKOLRC9d^8*sd&
zK*Mr3|2H74##EWJiQAWgMDBe`6CEY=%K)Q$u}=Ya9qp)a4etVFM3wj&VZKBL96qc{
zAKrFJnW6ZIF;_83qMxO$W2XIrzrmLvB2RI7?Z-QB6tafWnlx>pcrVSLQ3viUX#wOw
z1I=Xmt0i_3X0)7yIdx=XZQu<!3TX%2gY1{H=0&|H?xzJtEqO!A)jM6M*ox1rF5akG
zEI%AmmmV`!V9SG4cO{gsD9O~4T|Xz}KO-avnzrKeghcx9%=Yw+#%r2Nu at s>h&A*Rh
zGAy-zYHD7ePtxx5E}LAO|LYl at Q`5M3zgMl^CaOG~r(@Z8ZhNWbONuoN)BKF?t9u89
zL(ldtnl?vvuKN&$2c59*Gd9OUf1t?-<MN*n+Jw9h(sv;gM_THp8)&;CO={}n<1+=u
zuHx13;98B*(OrzH at UlI*;6g;E?;X6|Tx*c!wYNdik8vCjRo2w~ekBz6{`f^<9G+|R
zvXsm<DCM_q^s>7 at Hm;BKZa at reEuT)cU%PP=#Sr^vL#*}2k at Xe(XYLL0XA0snW8nbc
zXrX%CbpJxYQj?GO7AS$)-6*AsdvuSfd0^$bH_U>LpLlX+;a}UpV>~q|d^F8H=+XQn
z5hjQA=SY4&dIDupao|$-pGNI_zy-JZF||JWdOL(@@Pgs>BTm*vk+m#XbVq>z&)6g3
z_k at 3mL6jfq0#0`4qA^EC;58%LyS)kftmZG4j(;Qj6a)F2cyNmOZFiWmKF`TMT at _Vz
zxB7gyxS4$q&o{flO1M(;y#tdzMOfG?5xd-BdL4SeahO0qm&l8q at O-rab?B2?U#q-p
zNQ)|c*YDnqhMXhwTTS}*Uo+ke+n~{A?xr6nju|kk&B<?$Z~vv=m-*j#xB02fZtEWN
z#{Jmxi at 9^Yc-vz}>#^P=S_UpK`?CA)-&)N)lGQc8X?%p=rL>}=b$hA{uT{N&ACMNQ
zt=>yL(lOeph04)xex!wvgMXSS1M03KqO-}#ufgRt^oWVrh{y1Ni`5wKWyspK>CoW}
zjlap|a<@$;QYeA|b&@l;MsuYTa&JJ3C&3yca=#BkmGSJnz?~2dPRgKU?6!!z%_?mt
zzsgt9^2Ry8m;ORr8qVrbt%e3xTgnJQRgvKIDD%z5BZn@@D4`7<dh{C+gMu|P)kd<T
zmy?ivFF;UCdecxNl at 8<cdy$XFjhul3pqQDK5wYAn2!J``;K+JBk$GzHVXrRZ%*~G|
zZUG9wPiq>hg1gQeM;S`T0SW->p|A*yn>O#f8xa+q8VJRg2sBRMj0T)LwhZKoDR_6+
z2?^HSuNN|5Y;XoH$Y7F8dr`&1MjFe6rU?_=b!ukMm@$Vq7nxe$GdIwO`9uUm$NyB{
zs>W)Aii+dyW{Q`;Yzr3uEpbO!e at ow!By|Pwee4&Ri1Hn^j`^qbRFP7<V`<~WTe(UP
znrH&F2^a9#Qkq<(>$vaifF~pb^Up6F=4X#A%SZ&&WU4()PJfVd8$E3xom{^&z4u#y
zMiEX$GRx at c=U1ZfO9#a$r<)IG8)_$l<cLcw3fAX#NfdSI!n3`0gaK}%8!f$)wzgL?
zZzMlm^qC7_&-z}F4rCs};hLgvIM|LpOc@(OTzH5{k43 at yH2!;b)|`hhD>K~6?K&7o
z+D=7R8Fhnc`wL;GO((ZWp>;E7gZAgQ)cSs7Dc5pC#hbaINY$oiJG|8n2`1`DKQkU<
zH3Df{X#~VwTv?JqyJRpsLdLK(u1}Yf!~-%EgPr;$#?6fZM9<ILy-sK;9ipO>$$XdW
z4JN>H31Jb&dqjR5dprQOfw!M!gSz!S&{$p0cnyRgQ|ck3<^1&tQNG8to*G<TJ9pdD
z*}A$<L`H~Hg5*O~q3ENE2oB7`T&5aXD>w#EKfs`sgG8Zb0NRfwW9T$|Oa%9Ys_nLL
zCnUy^kD5x?jqTbxNZw``3MQRdM=0mksaXF at T|rWC?{p_FPJ-6v?ZUHMACkzGTw6*<
zK2EHs!G*;J<gS-kj8?5|P1_~_P|eA}xv0Eu2{dIDbZQ75FztK at vb6LK{fzm3L at uTJ
zyoA(1RgDeEb<a=?CS9 at nFi!a*UN%!6m%RvN8WUIiMemSZ?F&wDAsb5sloz3Tb&T9y
zbkWD4u#;Kc4kfUQ(Vx!B{5^g!Kf+C}7O<N5VlyE<uQO;+s#)f>P)aT`9V#kuHZw~o
zT=gG0a%6m+Hej at 9lV87aaPqf}_u;Pjp+Z3|(cJ)#1v~NROt!;J$iIiU#JcA)Z-qM1
zY?Am8j0e-CXh|(3q+$o0j1U)+(3igblkkhpf#PMTLZ&_Cpwj>dCj3$|V8Xin-W}BA
z<gzj~1<bbSiIW1 at C9!U)+>L!^&YG1%ZZDE0dFEQk|HyzD=1*OeEA#x%LrlFh?Oj}4
zQc#`{rKxKyy<N%>d5VYO?01>@#vO!2WjuU18{SI_xu{4Qzh%S7wj4fuxNS-)2b%r;
z%xJx$PQ>pP9cvWc(A~{iOB*;70j%#<$w&rzkrACpE3qXTkluLdgy;PlJ?_izxnJ*&
z76zeqGKE$9+7C8Sg&%5a3Muxa0&0rZrEf(irtDBGj9j%u?vgL-PE8c%>E(*8%SF;2
z2^I$(H|eScwUSYB;T2-ZZmP>%7Tm1ZU3}{3<eKvL at 8{8BOA)qr^5>bCbFAky9%Z#r
zm?rAHcPm_h6wk9Tv)SkBHx!GrX*&94)N?M1F`*0_RK>i>6ZGdAQHdEHs<144W|OAM
zTbo1`Cz)Eotl|?i*U5N|3c?}3=W=4)uMb86hzjO>#<`;Aq+1xzVl$0y4x~2SLgkuH
zxHWN$comh11S-)_!mUgWYTg%zCCyOCboo7%hjg#)jWjr1m1IJxS%p2BCx`&}g)W<3
zw at m&dzs=X2p>tX)c8c01MxPMSKYYS20-ro`6 at 3={8u^*sF||zT8WoDIq2>{YtuZGU
z3#wAyOt*%WjlMA<kezfEY>Dx?EIPfj+eQ61yh8Xn-K^A`O{QikGmbJIo1B>!DALpC
z;MQBdRho(k^-ABe`+E`DX0N^t<7SxCL`%~1*J1T?Gp~(B96cSU&>u+&d{7GPsm!Oc
zVfb>d{axu4X4X`fE&z>f)3s}9RdiQ`L8&n70PtFtcH##oyx1KO5G<&zD3+wxFoI(z
z#n at mfbK%u8Pm!-~R>}vn{*yDth at vGre5`1tLgfqW?IO>g&<P%p=}eobimYM!be{FD
zQ?5!vl+ps*%HX#JnEDNj&C#)&FV4C}7a4^Ts41VaF at RwMBBxHXqhFw=9CZ<?5WV>k
z@)r4Wzy53EQ*~<^Y!oT8#uqPTuoCu;uK!)<6->CBU$G$*-^+T50y5(3NZOq{(Rcxs
zgr3T~>AV4jHZh^hBe^{0o+>T-vH%EHtg>$-Kis7U`;T<lP*>L at Wp2qE2E^fRdYG7)
z{C%-^)=HDoJi at +kzX(Qp55NS2c@<Js4I86Cu38MIx~2HOC`f{*&0$<X%3S6BY}9Bp
z&F)b%X3a7nRJ*#l()`?sX9hvK9aObljR>v{r^~)vb{W@%G(<nt*bDkO$ox^5dzTwO
zgMV)k*BFlM{^9n}5zB6>cn{`INbAgrfehp2(_VgonH?*R5&--xE_Lx|Dv5j3&l@)m
z^s<6bXR&HdFcXi2NW^TQX9fM_0)vpUIDzij8{V|x^hg;=vX=UG<JIK at wkX&3$~%(T
z+#T5t2n_wcb*l)nDj(t)2y8zDWDD9i|45hbF>=I3|GtYA%FvP$dIu40PZ>76KRSRE
z0%dvyLfw-HI4INa$H=P5i^!3cd8a~-KgOx*JT_$CTYKjA$RHc^a}B3ozl}&0*zP>M
z^7+Q*c1+%{N?YazSTmNBKHIRFuLOX6j?65UnMH`Wo|V7y|Kh`)y2$f?6!Rusz+^6O
zDFGi`iu6PHs%B^;U8IZt9A~icO!2esrpFtNef?`Rl??fO-NPxDX8h5^ap%(pqx(zI
zKtWv8 at 2SFWuF3^s8sl0U!PKum&b+I`m*W)noN;N|q=^}Uh)f$gQzy5;S3;+LirCk^
z!HVFV=_)sf&uniD29{&q;Y3ylG1 at uQpyvaM$c90y<Hd^?YBLmYc%F`)-ct^-XkCa7
zSYGaT at Uc^Qqbc|V-*ulY(2J>!c6EjvB7mS1l+ec1cELRvoL^X$R8;8Zia_a1V);IO
z6x+Oz0STsuit8SR#F#`m44$4ofYDcCNLa#yK1!|I2}>s^F6;iK6<v4c2z(L*7O4#}
zIQ!)ApOxvcMd1yde*E!e-c@<f-J^+<p0{CEL+?I)p1aJZ89I~^etiC;2WCpAzVW;7
z6rpdMwS>^~aVG at qA|Z5+dL_#cQT~YzsvvCHxs}37nGoHI*^<JJqc>dCvE^;bUlac5
zIY2+igZoWdsMKujchq0ax|BgMbPi at 0jFmfjX~<3k|B|6da)RBzLSX$QW_O9|?VKl!
zM350dDZ^B5_EspJusCh|a-;5AGN6MjGgNU}$GRsUX%=_q&Kp9`;QI=)4A)L$7D4Ek
zU#5?-%WKx?9^J<d?%DHpfdDq|etco5G=Xv-%C8B^E%y2E^52);osC0}$q+oOyj at D(
z=N}chZjS$XuRrn`ny?rMP<d=`1|xxnj7CC%PzT at 5Q5$H at D52D^T8w>p_JMMh-CY at u
zd#>l}nSi!)iJTh^t%|!bgU<}7^K0%+%flMsL*?f+{-;&rgZz*0wNN_je}403PvwdH
z=QrPd(?-eZ{l|C5e)(T6>D{=g{_$fR^8bCwf2_y<Udw+hhRXlmME_ik|2Iz0OACAD
zN4%cR4Dr8co!y=L9!Zi}h|$@u?4hEPzef23?x#*PI!YClpzX{?BOeVhdI5U6v)>mt
zA83qLMv*FGRU1!!h76QNQBy5_DO#TlL@&NlEM{tgC5a52xd*Q*>+0&rJ65jf at zBTD
ztM$r7H#N5|r<QW}RVDM1WF~Oy*128%eO1a|S5zmWT}DN?ag678ZKs`*+sf#}2sZ9?
z9-lBDMvU(bMz$=g43^JvCkU#fUHlBS9p=nDd=#;UdaYr+qu+H0|MrPrCeeqy7k1Xs
zn>TNEuCo-8=Yls~yvtiH3jmIvK$xjnUq@`~lk!MhgR?SBkBB8DAIY4Eb1UTz+|4A7
zf?@Zppgm4kwQt-NcRMC$S5nC-pmEV~`dvqjAz$Qa0&-D;uy6dW9~%J%>%BvwKm4h1
z94gDs($>60wfpP at o%kJ>2fg$sU7ed@*(yoLeG?>~<@R68$2D|SE^ap6U?F1^KIwpr
zMK+wC(E9yjn-zn;*U0CelIbI~u=jA at A&)~l_|K#fjeewCqaTitiqc3ZoDzz>c+qUC
zT>Z5+o!E0}iD&lp3i~$R`;~8nsD!N4kklQN#me5_`FFW2J!yqU8fs6GkUvzQj?0GC
z_h|aECDJ~pVa~}EG*P3!;Kk0+9ZoiicDNx*fHK5hUxqm>x<Ou}@!MrJl{RAupJl|c
z%$N~iKKSmWrCNF(tG~zxb(zL&0-dm!d>GLoW7Y)R+4SwuhZG>GR79?OXiN-xc}ySf
zes}4|#efe)Xr~y{HDixM>5B^ljRJX5r47-bb7bf)5JzX1!=1c7eE1NdLDm!;zp$Ok
z9JZRMZkG%<ji3B+?$R-ePu{p`lZ-|#xq^`N=u>x1<TaL+m+xh8R_5wOb;YvyH|>d}
z-E)QO`nCZbkw8Qw8bbOtrel$E?ayD<&3SW!q$PRVbH(=(2DUF$yg$X?l7JlCbHO9l
zJ!kg}o}u^`cZ;D<6`dlAAMwxm$6 at 7m|6+TE7=gu=L=RO_nd$GR3<6XFyuYMNLB0+g
z2bbFnTSEeY53Q3PG=5t}Wp at 7h&j<hWxA<?b#=Y^6?~q;n^7&%_{<iz{qn}N|zrXpi
zWn;Me at 9*%ZjbHz_OK$nUcS)0TUv+C3-fS{bO8V%&%ZR>wnY;-4D~H{2DUr`ShHd=3
ze~_8|Ivpe+Cu7?ZHe3gc-GET_J_f~854m4K@^A<?=XtLmMEvgr$EbgwK6y!nFnPag
z)=V+<@y|b*<a!p7S`th>5GcdxNsi5K at 1``8GHluKU>mQQvu6vqvjMaR>Zui#-((;S
zAAqBmFPHI2*-4esU_Nkne1a-FDB;^+8<t-NI at 01iL)6~*?fJ~S5=;^vn*ohw$dK<Y
z94|9wVXkRi{Oz~jv{J7_x*$UsTdnn_H#2Wn7pH|x=c(q9!80yhgk;HxWeTy32u2=Q
zW at 0Z=O_|rZZ^U;wEe;T5S`e{%$ha%o*O;PiN4_*?;lhPM3&5RUV}|XGHvU)=uDR7I
zU0&h+DO<FR3Rnplzbk`5WU$rc%a=7b%Z#}SdL7?VoYDucFtXLZw|DibRU$zyGrr^i
z0wWD1CVo}TEiMFwnoDl?1ie2Qg#ErUH}zUK8MH|?Oa{&|Q_zs{jSe4fFvAsv?SlmT
zN3k5|K<e_EJUAr<2vkE>T`N=NElXZ&<yPY-BY`P7oWo8!YXr2g_Doz#zTUjE#!)_8
zWMBmy6r>rjVp}-T at J})$O2Ei#j-^SS)_tv)e)+PQ;%$grG&z62F=G}(Ecs)3dxzBT
znJq%<F_KwDyu=>ybt2hK6YLxSH`Y7ENDSEKkGZ~;fZ&N)S=#Y+H$yUzaHFL72t+Lu
z+*f8L9IKX5qtwg_GNZ!DSp(S>d-pEhmGkw26}4ZeBho0%)`EdjfH?^RNvk3nIeWGc
z8IS#AS~brCm>lwN6R@>rz1OQ3qvYK<z8`+&T2E`~9!;j1yQH>3Ff}I8`Zh`QWY)Am
z34#ry?fG`k`pr&G=QtKJwNj>j<$YT63`?5K4q$}wBCKs>uM^}+lO|6VMaIg~tgQ8;
z7Yb|!rQt0c^Hgv_|J+$Y{&FVBWW}kz#kg;{J8E1k|8`#7rNDF`J=s@^DOfRgy7Dm=
z`byoq*LaCTj9HV3q7ZSUc%+utZ6^51V=8(Z(5ZwBl4)NDjw;Hu2cI)g<EOT5^Bx;5
zDx)OEloXlXD^%Lq&fTJ!Y$%%iq`7-Ve$aPah^#C#5bNpJ8`!JYo!;piLTPxFVe>L}
zmyCHIf|WVz@$Pd-I_<_x1{pwDCYTbf1(l}eH%?IjI5c+C6*@|XovQhLWJKKR2Sc05
zpx)=#?9ajaJ_}l)xgp7MKJQ5;$-RZ?XuuIL3Nv1ibA6SkR1jE|gU{LbzNf1CYHBV*
z>i#(c&zT8#;6$g1;Xe&oY9#uHSq=4$<l=X8J5bpSCL5JqN;dhRO!F^>g)wAP(0~!L
z<(P1i+u_yqUp9E6;Cpw(c$+*^O{Tlz&QgJ4?drnc!{cm&@-+~aR%Q5g+?r^b%Auh_
zm6-)e23 at 98bC?OeNCXg!sx-IuVwk`rnW~o<X4)t2+S7wfeg}AW&Tnw4cyo-UT5=#k
z9c7EvV=nqLk-;aXW#>>ZE|;>{c4MHZ8pnJPej5C*`#~-g5rx=J@$t2F3<+}z#2{hb
zZhPvD0R%`1=9{^1zP|>_A)6Zry6Bygk*8fqxochJ0x59GNFvZz+t3T{?kX~m3aRZQ
zG$X!x*ZL}E<O21P)#gjCZ at dh<`;T*DgYVebUZ@?q-`;RyN4IYIFg8z!a-jYaqLNDL
zni>_Zw}%QqD~R4xh#R&pvnr~q7hrf;(Z8G<Y8LH&s1yFvlbZFK`?5;cYpsL?G-{<6
zSbYBh1Ma<D--n at DG$bHl5rv=d|8)PuC{VF|gO?b}v^Z#`W~ahehM_;}cWpliA1^iI
z_!JJ~yM9~u%52lgj}NDE4E-~GbU0HTsAeYlJV?1H9VQDpU>Yq5ISw4MVehJqIlhQV
zZ^I!eE$0x#J#qPC)mW5Z;)t4bv-*a}tU6R1{9ZBUw4m&LS=lfwmSs_9RBE5eNO#Yr
zeMYxXrg^DlK4kYDtXE(D)B;bTHm+ at O6;e#;wE3Pn6Mq!dA!$_dWQN;0$J985`nePq
z9L|<<IND1QKR9?8Vjl-=IEU at J{&ZlAg})0W$v9X-p42 at K)>l6*#?|?jVdR`%Yu+8I
zF=SC7#ivm<S7=i_w=#DIyj$ZcC**<0=?}-)X07hPrPuvD?X}Uw>v55`&X1|H8m(s5
z`_7i&MOVh6bz}2r?!6bZJJ0GAKW+N-sMTGKwp<Rj51M_X<Z)JP?OCX42fdOx9fK3E
z&>Yga&SUGgZKj*u at br(UX&TjK#Go%Yjju3GM}|&Qi+%KV{Fh&TDZTOsH}wm-6Pcz7
zls;OdQ=ebnwSD_g3dlKg+B&7~W0U(if8F`E&G6~2?Gy9nPwdQAB2HXiUdq&U<83c$
zC?j;_^o=Ucm%?8h(7*2ZFQ4|`o*$V0-KV-y(|_`DN>ADdNo-x!O8P1ypXb3B($$O(
zaCXt1IrH*eB=eWq4`N$v-0r;KWj$gr2gXF~S at ql2tsP}hn5i>;6tf<_dDB!oX~yi?
zqotI1g19B9G~UF7mbB6Jr498DuezuwVxT-B1|O`C{g=~4d_#LYX~f>upmC!LAy+4_
zuGvh;5ng&?pb6#gsKN)c2X-F2 at h|!k`etk%1TV at 1^W8ykpVE3&%+<Y0S55sHpD<n>
z_<6g#HkIY&>X70s{(Q7$ptWZRcG7YXI``6}^aBuOV$wq*5p`Ld%2$_eZMxfWQ(fK?
zD$;WamVN8J*l)K3J23OwlknJgO$PQ(N4<yXcLgJ*!l{<oj>FSaO)cr|SkWlgDc7j!
zea64zc;^T+?XH^wx9_<e9NN#?(WCEA5!LioP1io*re>YRWU$2OIW;J5t@@~0Lf~#Z
zJdXW13?5EV at MNc^`FZ}tTcc%4<Yt?v#R~|ZJf1y!woZN1idUoJ?;34#8RXZxiGA%C
z`5O8!yD+(y`sIVc+WI6gad<K-e{HuHv!>s1`R?(ix1)%4g1Tj<JM8b!q-2fpXsT5O
z$8R`{Qv|HLRZVh*EH?UvH!0xjf|f63IMVmY&nVE$(hutdI0?7O9Oh*6n7+W>Y&`?A
zOY)}UcyGpTi8H&#t`A;%<1D^yVE68?g44yLKz3Q~*+G4p%>TaaJuLJw4*Ut_OGu=}
z!G)hbeHwtiHpat{dQ-`DqEqSBkZLd|?fI8xlt&tM0g~Cv0-<l~;&&al2&_FDhUx;Y
zB1+Zi=T}~Qu!tmK4tHhzY2z42(SIh2aUlxmh_(*6XXnK+NNRug!w&|;%6NZVQ-1*5
z0g4cq=ztqD3`>s$-=;t3H1&YB%*i8 at vWqQw{j<!TCBzA at bR=V|EKXlQ++&kAN?%`}
z!BE-~31jm86T^08<a9JOp%h(7$Am^*Jpt+&A}9G&YwJr=xnO*bMCkDN7ZA%5zgeeR
zh;W(6jk^$Fb*W4+OVY94ioQB)dWv<5T;=q|7hixHTi*?{lmUTM8uH%d+$@cwh``c0
z+zs1p*W_czb{#toU>9zS)AQ;_To>Hs4}!SmzON$&j~MYJFg<Z6ncR|3Wve{wxA at ys
zsXxcHod#njKV7rG&<Dd$6lTcLX+v%xWF1c6rKl1JYsaDJF!FMYehtoeByM(4&AYO)
zxttfcAmjF_884=}Xm3?X<~bRdX`h^&oN{5wXc&C6B{=`p>5!AZpK3b*a8wiHUd8-A
zVE*Z&K;JNI&Ojgkj?k0WX^)=1 at wE*z`P9F7s4JOqJf at IT9vsm&LC5X%K!@8Ki0*%$
z*v0MUI8MlUs7`tmI${d1!MgC4Iyo~aPjf{O{))pj>%vVO)Afjv1+m}*EO?y~4xe*q
zVi{LAD!$ECr}Ti6I21~8{{7P>@qFLQbYRXn`+qs!9_j&=@zGVQX1>g15*6U!_Yi(N
zNX68w1Bui6d(BRXO8sQ-kLQdcuarT_ZZBm|8=hiY*kO!|_^$(K(?5!|Gxh6ms^|v$
zE3eFZgOf;+TUnK^s}@5j0->J7;&g*%SZ_=RKN1`4LHS8!yd2*QtA_bAjQZY+<QGi)
z_ARNVm1xl6+|;yGxF#!UMM?>b?=gDbym=mkn;9b=Ax+5~s-9!UJb%?;3OSW0>YnZ8
zB1}QCO&!lNSrw&)#J?UF9fhyT+g$bKbkoQTMn=q~o)Bdz6SLwFCS2o;VT>c{@}R)d
zQJWbK!x&ZOXOU}SLaUVe$L+V~8s!veG5^cUHHP6?9#B*}$yf|}V%z4BM>Vgu=cug2
zWK5%j(gUW3Y1%e6br}caKt!tMZA|RP<ql^cZLY2fDS4B~G|l$vYdrdQ at Eu}e$+)*(
zsU2=yzwSYk&4E2F9pgtP4TZIyy=T#kukd};%ku~5Fh1&$V!r(!tHdp8P$%8xHLr?<
z#S;mhXT2jEKHbv^`C9#HXmj-lt+>5wthtqIbJ<ke-1KhWzU at f@y1M40A+=u*tY3O@
zDLK$I&U#VwkfB5W5 at Josd8i+yYtp7Ou#@gW>l}(Wqg+m&JlUQGng{PUr*dpVnx8Ue
zhs(UUo}{elb(PF{rYLUVjP;2l9PRwPgw88ZhI-^cdc9XwZbH3kC0!PAgeU95Ud>eB
zYv-TQ6ZxCctz}L9U%hEo0*y3|xY9MX%$TyVCvBS at v30g@`cETu97Unj9M!<u;1GkF
zni{7k<H|Aye3Re%_Dk0#dTpNIvWKqxmkeO&#KbVYx*v|DoP+<;+{EI-O+_&_!OM4f
z`>p<eF=Cw?C`oD<vhdObk?&ulAEZIntQRo$3{jNdYL?<Lo>@I~9K2fsR+Ihd!opy(
z1S>cAr~dQq^zPtIx=M;Y05)r)J%oq~Ng6IT=t46vpunmgDpScY@}#sIKAyLhg3r>8
zubM=~mxqx%y+Ij#o3sTMb{HnkLlPC at m$an!kE#1zFp8W9PWaHkEm&r-vc+XAp at Xl}
zrcGzyv2{e{oxC__&v?l&uo?wu2t5I?3^5u)b$HGGz2r-8AyjXe>6I>1#h`mp4$QL8
zq`Q(y at Z<ECaQ;$`O>XMD=H5;MKXD6qJl{Ike6dL>z`g6~_Di%UO{;`Pdm23 at tk<02
zPg;o8%Wwn5AYNy?C2S9Bm8al5<)6Kn0l(rY8*>BJfa!9kQ6+fK3fV{I%z+FAABh^2
zwHM4p_$WY^`b2m83mFl;1Z~q)$hmuq&zoVwBh}U4o3MO^GD~1`i*Y{1t~ZU0a;`Yg
zld#UTieVu0Sz&%pi^bK2G+=x8{6cn)K#L=oi5jJD*W~N3*OIPvDUag7)v*f#3A;?q
z;lv%56mVB7&3sS=rV(9YeSX5vLyCNnm!%OEvx6aFK~ihRq6V$LPT}&fM^$G^|1xcB
zmJ{q3HpE4enM}HzEDt|u(-1qdBnC5Z3U=-rAmYDZAFX%14-|fZ!tQgI9*dbVPK7*}
zkiqx0rhS2r at OtWK2p*M4WF{>D&t0;}tOPm1ChAI64|}HbUPDGq0O#n29a*``l$3)1
z(+>)RlPBr>Ph}auTn-*ddT|V?`K*r(GHo5^P}@H5b-`H=CJp4s7y^<FN|ZHcU%rKM
z#~6zn$#CjpEFd8reEI|E5cJc`v=NghO&US|7gb-<t9Nh7ep7IPD?-lWDuq>oHxDE~
zk1eSY6+f&~Mx~X=@d?vX-ub%yGN2Z>{h+EYI4)At0wKsVqMJU*)L`(uliNkAUk1ui
zHMYBUM2HXw82~pY*-m at LZZ*TY9t_UpScYj<@vnyT0{bUrH}l$C^V;|FI>YvEHy6PS
zd4x2;fio9?Ee-|@@b&RIDLuUDPJKA at sW8**?6Zn7R3hh2q7hK6n~bf0O6dN+w)L0q
zYc|cycJ(_E5q{W?R|WC^#PCoVu0Z2c<a0{~Itw;);6VEhTaV4wuA7g$3ylgUc!0 at 0
z4v(K%awUCs40+mJgFeF2x(6JjzXTr;9B`DPu)Fh}w0j$82i&T&q?g^r&uYtllD-*w
zdSPP at c|y&2wra59`2#kvTy)fHKc+xZTnPjpRB at PbqEw#aMYZ-yQ4G5-4x>5iZB_ at U
zziCMUPfpHcL|(9QP~{QatNdg?gR?%jvogXyEh!ndx#H5 at 5lnQ`QD5|yQq8m}Q>N^1
z5M*??*vfmFf;~(F0ST$wba!A#O~<XvVdy^X<L02=yKk>v?SYoiVG|OP=v*{^P-~mc
zcJ$zdq-ElGPZ(W3XWc3_BC4iv(0K9*b=3Q;&NG3&qQfO%kF}x}p15dw(SxGAw;Dqt
zr at 0<BK8t-CRU_7<C#1}RwTlWU+0V+8DBw+g%e<EzeM3pB#UEVp6TB*pV`V;5?RG+a
z)_VHn_vhOF<dpAGJ3{B3$*`yPs%s>9c<?gdFfZ~&Wysm|iyYhhjoPSmFN#VRWUe at A
z+FOPcI|CSL7W5o7>S>9+a2&eSh5L>BSeY at F&WJ&7!Azy~fWFuXM9S9e$hH<;M+wPr
zb&RCNf56u;b(wwOpnuNmr627FS+w`i-mT^6cWWHwD-n9!-w=(v9*O<Z@?9f{+ap58
zb#B2m6>oDMkH4_{$U~j2x5yf8tkN~t+<#eb%Cy%wC=4NE|AiykRByI^>#aryv~<fL
zYpBdaced%jqI}zxQ^k_$XHKl9$1`L9a^RLl;|ng58iVYqXUw~9%MgflyP_oU9ro2>
zjBNUY_HEj%a^|ru6I(L%cr4N8rtHZomY*6HK%7S1z;jT;1qN{y?;jFz-YD{MKc=Yd
z*Bt-xb?apHh)H_i&E#B}L-iV$=+eAdvk~<lAG&pfM4`8OrmpT)r!F;cjch}9B{XS-
zyhj at b8=2`I8J~Hz(;sQjG)Dq$uC9LO!IZz^O}4wr_gK76^|PWS{K}FIxo2WKk*E!K
zc5zw%UJZtI!P+KW*g8>+TYE%*!62(27neo60})7nkW*ZIIOk8D+51d(^$YoPVX8ej
zqOR*e>lm1Vo)Hldovj)GSJPaB%2Mslha5?Lz^*SDg{WM~ldAK3x;}gWs`T)E)^)(|
zI2ku$-T+uKd?!OV!W(ddSs%6T7yP*%+mV}kc~DM^*M<&FO5~j&wqaVG^&~Md5fPE=
zXH3)>weaiQ<5PC9L+IgKwm7R~w~69qhWWpI5oULvx23B)LZoX3RmWfg<FM#Pk9|`V
zHINAo*9}wz^^;jbvueP22F=(Tic69`bMX1~8#mO)?Mc%mewha?v3UIW;w??P{52$|
zRysf;bIY9Q(tHG9Kaz2N_^W4wwAqpZ9+N92hpaNiKz;&|S^pe+7>uDhjrX!lY}L8*
zd9E=}GRyQ&Q%ac4cn<e0WVr{!nT!YwKa;La!7*n&d`wJSoDr!{&Jq$;i$cOvIC{Dd
zU#SU at i_F+*j at 5Hx*BbxP#CWH=<}4s{qBDCELD3%-N6P<XUsllIsdczhQclNw4K9y!
znn?%HA(FKGs(MJdl{f$aQAQ=wS#zEj6E$wHmi5vB2V{t5^`ko&_K at 0ABc~ocd+yu6
zfB%^acvQi1r|#%x<7qelj~-Ji2#ue)6n&D&<E+8J at bLwkG0sA2UjN+1+4<_STVEoi
zt7Dn?rAok2 at TyNl6qHhSbdDK4V#ItniNTW#fta-FHjzNrf&RBhyNalI#+l+<Ba at D3
zUj$!CGk%JiqO62u`y(eyrV50%1b2IN5z^R4%m^)ls!G4{YHjp;S=0N}mxm5sc<E-)
zIJl`2x`9Ouwz4X>bPT6ZiG1*h0SkiHIewHuIlS-#PqqDTlUrc`%4>11<XdL at b9SQI
zI3m5g6&cp<BW)7Cbet(9x(7|W;6amtkuQ9^DxSLMy62c8nFE(xLqYSZ{Dl{tHpqgc
zP4Yb|AqN6-F3KcbDWRa09=0fqdWufd>+Jf++`{VQr6l$1)2_&5HV3CZMA<@<J~YlL
zEWKu0QXML)shCYR5}^$d>{~acFk~J&#a@#s?Ohn%;<uU{OonJNc5`O<n&G!emLxzF
zhhFlYNf-shVsm&scA37oM1*yY;ve6FARZcHZyp at J!#}5^Z}mneCkuphNNtmz1Tc_L
z&}N@|WBq-<3k!d-IdP4 at Ei^ajzBoRmN|XSAGQ!Q6Y;kqTckPySO^xvXmN{=Y at DxcN
zMRZ%A5=JFxuiv3tLz at Z5632aYQ62<8sPI376OJ1BmCD9LWYrgz-gtfn$rC)3Tk48%
z;WkipKc4JDefJCi<EUZ+OPkGp35PjdGBJ!2UdW=SjghVa{42}5^GJ|ni%{q|`rr!P
z2m?Wk2Wu9+(zs<n{IO1g2EgcL$ugdaNagvB=6<iLZtS6C_iRvNLc$z6q&9qbw>*5+
zmX#4%dF at NqI}!g at od$bmBHG2wTxvE?IqwFDk&f;wM2hosmwlgsMyF6E)2=$*8&m?K
zDdfNP&oQdzo3k*@1p0e3JIqDAFpwkvba2+%hd&ejhTNC7^F_mT9+M*#CCwAF00g&G
z0IYQNx-?o{GU}KAVB3dk7X__LW-Y$^PAYLv(9-{YUR}QFMjZZTV8nI%jc;r=pi21{
zM`Q4e{Z8=HA>GTQK1$T<_rrNql!s#KD~EtIB?P)`+q(7njay%q+ju5M at v=_gSJST!
zF^c%>ml1g{uYcXY^nUhuI>-V~o?K;qZt0C{nMKwuf^Cw at s;g5OR3Ipr-|Ep;FP?zl
zi&;DH*b%e>`J-jkiNzp3j6eRJ!3zELKmAK(w$MYE%V{K^oZ<ldy8%#kO=K;8>M8M#
zUCOqKBd1bpQ+V`%!s0(QWq)XGnT4CLAcXBtHhW<cD5;Dc1Dr`+lZN2)F&PJVVUuN!
z#;u>^y$W5KSZCeyUw{2oX6cQDBXVIAf!$Sl3!-LQMUp%VnHbdU+Q`;LIj(*yBf^U}
z?N>8C%LJz>f)_2yD=a)GIUEOHPy3OKwN2Rd-MTGN6-TVB8e}$?RF1!YylRcrOJlt6
zNUIka714xB7wT%N)34HSHw9#^Y<u=8^ce(i92INKdmvRF6+3E;OkG3hb9r+8MYlQ~
z?9B#?{pY7ln|79-55stORl$xBe`?|9z{#hD-_-oCqg$GssRvt_e#EUlGBdtaS54bH
zui{;u_E07jSzT&Z4!+ZwY)5r{Gs0CF{>|2Kg2Tt5S3GJx28!0!Lp8S}+UNJKJ$PeL
zMhgmiB$|tT`i0<J-UyxAY;?`#mkC``HS*~LDxilunTZX{LW;0#vS$r1E-ijMUO+J_
zmg2zIEK=I~H>5s}W=B+Zx0^C`>KS4dwKU+U(4w$*BtH~#_F!Q8yFfP0+coUxr81(*
z92k03F)>&QrI$fY_vVlu5t^J~JFPJv-E8u=-+pWP at V3n_=Z4n1rvd(~e@?ttfxCk{
zY~Hrlr_y$10sw^+Q73VTx!$arJRpa6xG2uM>qU}@G?xMQz?DvL0xam5Y}-q5I1P at T
zYau-eep}YDL36uKFyf#vQ0m|;8Bn5Is at 1*wt&*l0OtO<fp)yo_^S`D`_1U3oj*KUy
zJej&)Q at ENJ7KOwG-QaaQn0|3p5^hY!D*I;7Xkc%zNCb=7xAS=wgJ-N7*stFVBxk~E
zHfBQ^C?Mc(d(t+EfU|<eOX&=8 at EuLoOH^@1>-$dcM+Mt#G65=CUw at e6TAZ|YkFWL8
zKTT53FVd%E7Gl;FeD=ZlpAEO~+<7JPkrDOrX!qsagKZ-7$xq2v7lL(MStKX}RlbNK
zoj&-10;*Eu8*1(RR`YB^43K)=o at kYBL(J&>lj)DX>o1ZcIHVKsoh4tscG6o0jkmei
zY3uUvp-u9nqlXP)Q6BpXNv{MHB&2P7*Lc5sXDw;s|3TiH$Mu+h at 8j8rvAj_!q-1MR
zQQEY~Qqe}MR?&u1X;o;kjHN}<rbW_%Hnf+d46RxeMVm+)EhtJVeXsMX%)Gz9&*%4e
z{Qmy+$ILKwcfaoYJkPn#b*^&`l(@ki?<U+TAJQ+&#?0h6cCZi`*z=dWHy1anar*S5
zS at FkL3^lHNnrB^g6*mZEhnAGLsUtbIFkvdaXB?}qIZJ)^p5Ny=p2;=yU>yQOX0VmN
z1XZwOHfI9`jT!`ItpPLt8sNgZ0dJr;b;Y)ORD8|lv`~$ZsJ2eC^;sp;a66fr3NfIr
zJ@}UcO^@Z<)Z$phzmQWl38Z9wI?^Zu+ecq7%(|SagV7=|*RqcFn$)@1GGlMXsUe$O
zzeB;XAqP(G!L;)m at EuJn=Gi<E74*2f at 77t>Mv!3}ceieh2s!9ShiRq6!QqX4*gB2`
zIP)mZ=32kvjQ_lrc>M*-jsg99WT#7sifU7KH)8%RVz-i#28`o7=Daj+<kw4$1uQr=
zbajZyzlB9W|5ab-nw&$ngYR(g5;2ZIu($Z_(ql<svvQ+o=qpIAqc5pK)rEMG!F4qm
z;l<!URN=&FVZksg_S_-I<m2FHtx#?i>&0P0LwzdO;<bHQ?K6imWuAhHBF#YVQm)+^
z=y;)u02<?JD;N{<s?^{8*@WTC_fU+ruvA9t9$=5zo=DW^sR|+13$U76VajaO3sfA2
zVzlZAn4TCUGvN(cX_)i?*5NdXFEmH+l)k|?gufj}M{@>TcK9G#RE%MSw}(E{A|pMH
zX&xjoBXY?Sy+_xvS!0Ix67$bb=5T6((z0$?hCW)jy!x}d?!8B^69(^ng1ExIbWPcN
z*X*Kp&Or+_4Jf5 at UCxmZx&^PZO454-WQgs6c at u2&`^T5X(YxL)?>tEzkWy>Rk)2`a
zxa1v?_3PIs01J`ur6Lu4`w`^S4*@+R8pN2|oFFsO0y(JqnIP5eq1B~pA|Gn*W5Z$K
zdWhx(OORhM95JxQ=&r24_E=KwI7<=dgB at Vcidn8;X}uyXIWc_+{O4Hs?3u3rA5FFn
z^Xbtew$=i<j$t&0b4Wh=o#_sWe}%*5nff&F<i|!wzd`QNkX{ub`LaX(M&B1$NjHd|
z&<1Rv7Crt>?&ZiY at M6a-62A-%W}Y%_37}$h-v{pvY7s|%=D!C!a;$+?+=KKEYp}I>
z6TaXJK647!T<5-~c%a4l^nA2t1BC|8y1Wulf(`uVTFvl7Y=qDSlmexINbA6Si<*`E
zCo!gAm*EG0azWOE7Is+SmERnCv-v%dGH8!h9YI!XZ4q&H<hZX$F&gr|ReAh+d0PhU
zbclnm;p-gI^8nW3A;xgF<;KExbpSw3Ae9 at He=^B!C!qp|>}d(jaQIO8?s2SrM0a<>
z{WBjn{N+D=?YCVg6=T`{;NqCM+Ho$|rRmXZb7%fBkLTcBJ|3>TKa|wHG-59<thvfJ
zI+J<k>R0=A%sv0jb^Ob^<rdeDiKR*9mJSU_j~uM*sg#kj>FB7GIaM6xqtV&Zvk~u5
zG}ijc(r<tNn4y5hWcijU!Umh%M_sgg029NEr=Kz3++wk{Bhwe@!FsG*h(tL-KBJ<(
zUJq8g4qbC?HlgIE_PrD2=B9FirRWPd`7&hoNs-Ty1Zbte{a(t-$|`I;kn5bx$BJmO
zEGzF5e%GhWr$E91m^7%HRDn#d6gHv#6^*Dz-iE!=L8i3RDZC92ctxP<;2?r!f(cr*
zuEOumNZo7%#jF{6f)aip?`s21INQwZF+5!<4kb4pvglS8T{gFsJ+lzz_k%Tx1-qZ{
z1C`wcdMw|-!v~{{BlZ%Jk{E!(k=S|Gqq<nH64B2LWOc&VfM}kYd=HO+{r`D%;&bF9
zn5R8zm9?301!bt`#2%|peb_diNzOUV<*SKy5AwV~eB$N)sz1?X3X9T8Ihnh1Ll-ix
zqzY`e#Y}(Gn3pez at p6TlQR^$x8GQ3#(dqD`*Biy&!f<182$!I at vZ15BeH}_P!T2 at H
z{h|3}Iv9TJM68KC{C^0D(7UbFjb*utuwBHL%%XSL*y4?`tnAuNIzr23?#rE--j6gg
zp%uel(sjdOWdSH|FmFbNi at 6SW3L9SS1ovW&c{!!a_(*5xx@?ASWSx8^+VbxTrZz^?
zx??AUN8qx++IVkgH#bC`tsR9z4NzY(nrHs1E`D<0_<^&*faeM8uVekN01zJTXy|jx
zYr~YEcu}mV4JLLl9_axju5B2w|1zQrNc_mdMDMo{nW4725vO#Yb)r`MH5AtNdw~cr
zc#Ii4crDVjCMU5K-N~D{R=kwhy0r`o=#v}P7tcL;Xmr{dEWK>Gz29;bl+Aq3m|B<v
z8fIF(nQ?hm=!G2X56_B=mEnD;Qj;(~hnpMZUI0jVWeEM|mr#H610&|_ at qAcOt+)r3
zI`od)@aktJSpivsK5A~Ywn}~o=(Ye-*)*5Nlhr at P2GD=Gu`aSMwg4D=HKym`xt<J#
z=E at M|O(gy65PjpK{$`@4oKZL_UXv?VuGC<H(mCNWHuSh0#X4cW$A_NIo{?Ib4L at 26
zbBzN-sBmXGf0W-jnRk!Qzj{-~*9SscJ9*<bs0Vg~R!I(?@v7 at X60PP)#oiG+XJ;Mj
z75LB?8>=$lgue}f+@=ia!Mz4xbbfHi;LSLj2WByG<)XkDAno>Zi+mCcRU=+w-8o at l
zRpeHp<M$pgPo8!fU+Js1S{2|k2nPo#W;&aHp6TNX$8zfxA8-^~KYtcN9{alK7u;|e
z*i1g;Di7>QPw&|qQ!qA;1}Sw&s^Yy2tXPJS*_VP`j`actc){0ewcr|z*d{3Rdq0%q
zO5kiXp8<1h#Otlj6OdOovz0eQ_v3^X07jaSE#sE>aM$G}m`k&?cA3;c4*h%w6hLYo
z{l_v9rME;cVgaCXT~Jcw2qrfe0|$0v5T~!&ES(*ka}0`I=YE`vqI~iyH`qi)>vUz8
zA75^P;WJ|4gj~Q##nasUn_V5Wt^4&r`gd^r30jN`5K(DyE))W!uY*1%>f|r}`;WK*
zL9byQv+hP?CZ^OG$=m|TR->6kILF|I4rdHXsJ-~}!y?^qI5ln7Y0u}+nKK6|;Qqp=
zfB!wdWc?|V#}!-X5h7G+pfj#M!z!d>5CO0RFlHU5HtAGS<JW^lFvH at 3r8V5#I6hZF
zFBv at Q1x`>hG&J<mh3X+WQ}_w~thM>n@)xo%;Ypdd6&Dtk!Yw%3cA}p@;L at c_%$qUj
znzl6eS+BOLd6->~%Fztr%{Nh&wPcAyc~TOsXWQ9Biy9jZ42_I@)n at 4I;ylb at XJ==R
ztZf)7hd4|ksR12=3QYWu;o&_v>v5oITQNDzwZH8uc*s3CK{R5w1`L)f0^>TscmP^+
z+#+2B+iy~;ZA&dBgjUO7QP8zpiP=@xH}6~}?c&d^1JVt|N4iVn?iFqkPPA`66;0%J
z4i1{u;ai;&AOKfnmcI(tX(u%@xC-3DfU;Dy-qrRNPh*lR!jAMEEHCw^)w1fP6-0cP
znTISWgP^hCJiUy{cwjRzu7IA)!(uNtWm&t?TSFm7-r?&EOce~3b$f`gdr_(m51Z*|
zRKeIb1nTuL9ks=T<qVVe?S&jz_(Y$fwzPzVE(S_(Y{<N{8)S1+-YIeU@`{QI!TpNW
z53irZ#+&BG>gAVy;`u~MyE at wbsTWXp_%064Y%>#CWTx?01<B`*+Te`TY3Ya~b)c2j
z;xU0SUWeu6t(~14a84hWN6Hvr+&VwqD3JSez>7909%0mLkSf?iCj;N&0~ORhz~GI<
z#bE^7ehk|c`G^d`{-!=u)-bdX_^x3LX*YwDSh8Y;RoAK6K1)E{guNO=ecKGl5v#R0
zAD_~|Jssj at HunGZ{Y5c5%}HOv%DNs>HVx|${CF(fO${Un<UcJ>!8vHU2_U(@j`<yu
zrv{ICUHA6(-eS}A=K6Wz68*#j4iQnyia0mzKpN|#_GB$)JM1$`yX at l=h`JK|+=1)1
zA`2WE>yZCTAFYo53wkPJhY>i0wZK1F_B!M=#@=^FRk1^M`3T+oye5=SASF<+ at 2s@G
zD(3O?<Az%C+ZYEDSN2rHrsc5!>YltN3l}aVkC2#te?xNPZds3N?L}bAbqX=k_tq(?
zk}ziZ>e2alsg<6`gzv!Fr9wW+oC0UW9=IS%f%8s2KvyZSwh->S<`K`mW%BB4(Wi>?
zuQ`A&tJRzb%c^wjj4{E)i_k$F)Yz;B)yI%8EMaF4<<@y{aQobO^HO)8+Qi`&VHcVF
z_gmDrYMU3h{~A7A at p|UWnI!;-kN_7h=bg^v-#!M8^qRl_gz4wzNRbLEsb=A1=%TEx
zi&>==5uRpN8EwmP8_8sb5Hl(%bxud4N^w)B69&eVp*PwLOv6!GTa-&`@C)ruoXFB(
zI9|8tf-y<F;s9`Oacpf!q;^yF2B}TT?r<oCH49G;_8iSH2yS`gs>$Mg<x1W6%)<)M
zUq<$gyn6V at K75|$#_e?&FM`R<UwKX7VKSd<@1uUD&GVWLDR+JNHh=+e>{!%6#wU7f
zZoyUz=HLaF$1JaY%@pxD5M+Wfh!iJVAy9C{jeB_ at +P1!bf9uq#61JZbrg;!JLi;Fq
z6qM=1!cEvn6O4tomkiWqFh#9N?%oT-7voww00Q$ejO<xqp<X)2WK?=^XFwbHM0*zY
z$Sr2hHeegDzHMsLxD}|(w5E9l-pd+*<^Zs3Z`wPFje5YU7_;<&=)HUQ!V(t)j2PiK
zIf0t`HD(WiEc0eKXZB48J^QTV)+a8Dk at eWVXOaH0X-Mj0$$Zk?JJSUX>t`hYSzgt0
zb^4|yZV|Fr(<p?VtZQJsG at BN(b=C9rRjt6#3i*a`sT21gEZZOtq2cKo=)}C!FZ$f_
z6N!X;8T-(Lj$WD7f|BYmjDXi>4wKyBsup?qXTR=M>8~;V{rOrvk_|IDmfRAWeBrS=
zP4_Z%OHgNzL)DoM^hZWla&F=L#0wb88;Y6OUQeF2c#I3cVgpd0H)^cW$NNgu(Llm(
z)VN1kM at Y+b)`>S^Nsdo^S(*-YcYP4vuztM)pvF4#B73S%96#=l+-^76g+lb9LGi$a
zhN^2D_OAN+?OUL<YyYL(++1*0rKp;;p-9^g#Kk;5_U_3HxPqjWnC*imm1EUIbKb<D
zm86!h58%z8%mA*;(TaW-2HoBDx_JKlZZtJHS<UH)@k?8P7BnE*pihG!)Jq}s&gn*n
z&(@cGO__Is+~t4q^5Lh$<Qv~fY!~v`cF-E}X7T?0`(s{i3a!ftnttN>Bo=vEU9C>R
z8WBH`AP;`8=CKw?5$W{7r^9{<qc&3WP^0{r+zVjtmC*%n1}owvtX!Q at AcGSRX><(T
zU{~D*-X5nYTRvsO>#y`Ho<g`j<m at jh<MvaF#o@#Wajt;!mt|5=TY0K5S%0(Zz!3_D
zlYR~iSaUiOj|pPz?HCGXO->&~?S^Kz&axn7&~i0y2cV&Vph9|hd$kmo29{4 at ic%WQ
zsFXhqp6?-Rb`_*=qL+d2&1<DpSL5<U25A<)P)KT{Jzc}C65K%?JOlY@$o_T8F)}qt
z)hbRITYV_3i}trqKC3~o!zQ-F7Aye0S8}Yo2flpq2Z^bKQz^g83`rF^_FB=`C?7Cx
zK|ezY<E0PnN+35}5nUj|g7R&`^db1>=NR5e8i<GKo8k3QELB-d0yu1tR0$aiSL*)T
z3@(hkkxs=^jg2XPpVRpoS!XHX$(n5N>!WM<cB`7Q#<x0WcGM|w9*%?x2h6Q65WRS9
zC(YeJab^SRA(?M1D}gKmsCYrckK1$s?b;CjS&uGyuuMNO8w;`wQJUgH=2r3Tm#L{~
zJ0$U1g>&Y!$(^~k07r}z at v*?!<Xrn4K-%)4G8cqeg%UtuvOoIf^ls{G56(*tJk?pr
z;hpuw?(6|j;0=9m^Z31 at FM$BBj=#REyD33**-W>Ilr}jLtt*5_zJC9%dL;;>n7|A0
zA~Vw&b4$Zte{9G|9EIkwwMS(xO)K~^--F{$G%D~l5UbRqkmL0Od7Bxsq|mn>Xsf}f
zOJf#s6Zu`qPbj~8*3xp*;85I-?z5NkROc5+1V65b5;c!&+{SGc?e{zz%F3gVNhB2Z
z;v@<q;|5S-R#a5vKRidS?WRy6Qky+sf<w7wF}liVUK6PByAO?QaJ-V;@9 at U@%2rBH
z0G&B|wh~lxmIhFxVvn01^=xosP^H~bjB<d{ofA4gohj;E(!OkK-|5m5PN*)}-=7P-
zUjQ&J+YPThy7NoeCJl-D1BoksTbK!@Yby9K42ryLsXYejN$>5+ZUH at v^p-%22)_}Y
zNWpFOpuh{L`No?dJ_I7vnxAZeLSB7={yb(LF51_2d+3I`prGJ2ltq|R2wFfTRO^tk
z%y6ch#Sx=dj~qI$Se)@m{tzv2jKj^aNHtVgp86hh at MdlLAzf0!0zV#`IrGKPv0BS#
zf%0Ymo~?ytKB5;rH3oKblKm^C>w^!(SMy!L_KA)=6FFQC7>bj-fvRPepu)xl5j9 at 5
zhoLpG-sth^VIXV1^H+R*gCLsFfAp^a6r^)6>79-1<Rdvk4-zSATJ~5da{Myz4O{Xr
zWrNTCSRHfG$o&F&9_1)u-UZ-JuTfyRgs!L(U{8^}&u9ZkG(p=P at O1D;xA2`-{!XZ)
z%@9smL=T{?JXF)E8slH8?+Mn)I(#TvpzQ<yZPoQb1<Md5hhco8S#FrnPYK|93#Juc
zkFgAO`eGWW=7<qGOU_ at sc;}L<i%SVgnAhXS{uV~Q*o}h|2wmN!Xr2UXkbO#hJ5g#j
zLjy-YB2;4J33ToqMXrn7wX}5 at m?enPIF__KR#tUoK_6zyYzD at ze=aGf&Rik6<6eyZ
zs>uipDYr_(5Xwmx0JG!)+L9X}FctoY{m1e&016aP<a&y>sIT$K0tUjLU#=f%##j$<
z*6ZarDqdMxgSkm*L!o*wvHgYANJCEo;TXkiTe<ZQ_LJU#FY|EKD)M&GJgFYz?%LAH
z+H;xKyeJM81foV~i`G|Q7NP_el>8y5PXa%<56odfF|54781TL0Q!h|lM!3P*!{SK!
zL|{3X8o5`?4mTGHu8ssXysglK2SSmn3^bvAKj-vtDy4wbl;zzHLQaQ at 2oGm}M+D6M
zXuODHt67jU(!Qlg`x=qG`vL(M`*DUq(ZNg`O)n=VCW0vun&2QBHIeqs{qxVI$o*?G
zVR#2fH&r1|vq?OA&QBk5L<5AT(~2t8M4yAbsd!6W!dfY)mF__$sr>C>3smcLSTGSe
z07|#z{=U8Zm>I%{p&^e|+`dk$SB4r!D+Sif=6`vZx(oGZQIK?qo<RWS=&#X%y%m3s
zqn;Q^+mvUU&E%2+C3O`cETI+c#+$7?5RtW$`Fi{M1d$?$S$RB={wdMTh9bVt3UM`-
z6ON97pnwHyg%TmmEX5%b9Umm6En1{@17jthBC2K?iX92pbBqVm#jH9?C;e?t`^pDk
z3bj?NR{rt)AR`lQyp1S8+kCd{cQbx)@XX9vv(($b#CRU_#iM|ZhWHvjSqv{qo4pim
zK_MNpLXqO6^}kdGpe<}}mXYrP9g&I?cTPCf8cp;Q-XuF)qCW3b)^_$MZ;z<XCg%sS
z>im)-Y5iq?z!eGL4R7IE!R7SL?zSFUxcGD+C8!YUnD&4JjH6a^t2^fV)nf|#g+WY(
z<RP&)-zqk?5`heBHn#|KUN3G~Q4j)rVy2{&)N at qiVnMnb?OTJRnF@(LWjU6O(C5XW
zC(s^3)MoqHOk7gcd_Pk!n(PL{fs{(e%5O4jrG`BF&u?X7UhWR5lgt2kn{9SY27zdK
zN2WE+sxpHiUc<Jh+D!B{DUcjZj*&E3M-?>BM4{jsZkjm-e2kU*nr$*5UIU5NOTk>2
z-S9iYL8ca%XuAh27vp at 8%{bWGUqeYGv6Wq5?T*1(;#CAX`&#nvyZ*VuAkOItG#AdZ
z&8AZ**|Kf)%Q-#(-)$9*rqdsAoJ?;0h2fI%Hp)GpKJfvTR%p3D*!WZ8Iq*RsxPVfe
zXst#t6=qO9_9K}LOBVu0(aU$wgL3Xbh5*JI0GV0r{{WLeCXZs87Oib8Mb=CF4ILfq
zt~5xNnF>gOfo227jyTv?2yC(pL2u0!K9$)wV$+5oNM)iGYctUnREh*?e#tysd()~}
zed~Fk!lX(22^5co({F+rEk!w1>nqamup8l#>9fn=;)9_Ks_;B^>}FkIJdVz8l;Nh;
z7rf1W_^=G}_}gAq$qSEq6Prik(!va#GNxnG+zcC_?rBHShSx;WzRe%1hvk8bJ$+v2
z7mi_yr>N@^30~ekR8iChPy7}-^%&(V4_5w^7=tRAfkIK%Ot40Bl8PP|+E#O6 at MCK$
zH_2NzdU>ER5cBn(1Nv7~vcomp1-Y&PWW<~T+pdrbtiJ|ZC`#zHi-_8Qs*0Gw_;gwV
zqxEMvHCvM^Y at b5?q6z<;nPJncPbFCfQAq5{e0Jeyo=JE}Os4AZY^bkC`xv01J@~PJ
zAuJH*zU<|tw3v!b9bVoFU2jriKGm6Vb0Y=FbQgA(>t-Dwl98ktp2rUQrLUiXDFHm7
z88?HK<@JhoT}&KiKbmRT{TKVo{>)DQ>*B>k6G*?V60Y!H;OSG=!`FxR77R7{?Mpe?
z*(DIQCMh#4$*r)cND0y090rtNjUfQ3kR+tpihf2>0tn(N1~>1|=*8))xvjdQKHDxv
zZv>|+m-JP9gBVEoJYd6KkZo at 07YPBgp_gYgX-b)h8EJiYtrtKDAWZWi9x-^DfV|1G
zW(@s_8A at 8MZEdj)Vo-CiLxV6)kAis7t%7FS+CV~e?WR}SO##=gnIQvDaDngJlK+?0
zOmIEykf`%LM)zPv=~z!CbO?aPF<u_fCiH*%s5wLUY#xzhaoFaY at B`(9UFys;goP_W
z60}3coA3ku2n$MP2eWc=3c=2TsVxUmX?|2E(5abO0@&lDCa|;XLya?<Ewqy`{-AE}
zOwansFeiIjm-aYybb~dkk{wZD`Hbpsu(7p|?7}KaRDew^-!7L1$qKm4N~-GH4aeck
z at e*~;o;#=Ai1 at jdi%Smm!Jv3Cusv$iXUt%D*o|lcgR<CWpTf}<lJ>D{*RIu_e56lZ
z^vpMgqdMU8pj0vd`sfnS>6*__a^S_07UhZQ at tz>yI7tbuhr+DH)&yl&6tRR5ri8ip
z at nj3wn6nQT;M8iRpyV3vSdF3KDqsWeGjBd|;sjwfr{{YY!OMlsvPMo40_L)NgV~34
zopr=cVNJ%%pQUDhqbxvmhzmw-u8-N2cOCnAHsAnQP4lK~yM!M|W6Y6a%r*;r3`VMA
zt`8o0W7F{b&;hVN$~bUq!Nh4`8XBQCgrGf8T3|&1s_~~$GEgKM<Ke8t<Y+(T8+BgR
z at I;^%)2XCSm>}jQ(=iQb#Ma^2vFx>F8G=p4+nkG7qqvZml6%ATOMXfm!FgJOeyw_R
z;944h`k)D>8W>n=)L at VN8&iglyj{0iR`vjuh{)jzT0haPcS`z`sZJ|OZkj9NwboZs
zf5AuF$|=O7)3RkgKU0Uq_Psvae6F$-r{0FQ53HyNHN={62f+u}rxf;A-Ghx2M1mU)
zk~c>-6!w}0+p7|D4$?GKe-`z3k<$>RLZCana|x+(DFkpY-Fg{_1No*hkgy{jKB&h)
zNLUkFL9YeFaW412Y7NO-4k$ofmT_?SZ9pn at drRgcCI>88r?eX+R2=FC_83T!*ctWx
z)Nw?&#Lh$K>6&;{+F!w4NP<0>#vYdpM`Dke589`p{1kH#pJ(<KJ04<@N>LyM2c-Pn
z6)F2QAS-1|p=(D9uT%a)`kP(+0D9;PeYzHD#PE2X#*EAwDC4$l3y^abr+gr`82WrO
zR1e}GD_Hg4hu_x#McO=&HtU<+3;Xe3ZfJ-O?P<)~n~{wDZmAG6#G{L_uUGB*rtS2I
zyue(PVV3%umeT{ieb#?JOdY_)lcbL*tZNvBoc!|c4CduOweXUTiH?p%LUMui5L_{6
z(7F)q;#Br(R0zXEPk8(Jg`i7XGov-*;>C;eIb}iT6)*~WnY1hW9(E at xI~ZURfXekv
zPs-TI)6^-RIW?OqTb`KPOn6oad3VBnDbT;j+1ALH<0x1NeRKL)Bk$1f4yOI%J*H3&
z$^;VL0I<a(P3{Lv2hXC4#Pbo at U_c*kq(t1 at P*%^<1Ins(z#r9Vp_#>ZX`gppT|CC_
z!*P7S at MDysgX4bfnUqeQoD?*)9}&ZkIshElI^wC}E!trY>+?G>YPJSFQQ-z(mH%{$
z5KA8T0{ZTl$&O*<HvO1veq=C<Nu#WbuMYwWjpo_dDku3|t*EAW`*S4z7y-K;%){bZ
zG1R6Y?lz7k-ICQd$XlTliuKyCZrvVacxDjDvs$eP4!KeMkm;Z*CJDTFBvOX3YYxF4
zj`X!?o_-W7p5sZ)uQ<m at QXWJm$p(vRgK;6mfr)cIYVyQ3&=Ar>w0y+wyR`$zcX3Cf
z at Yx*ek;Tl+Ye9I|Hjx09YIi{*G@>TSd-~A)laLm!gU{qO0kpdc$wTbVFh=4AhZBOf
zLG_{0Z|~l{<0A2K-rlPoHU?q{EHhHeu0yf58`?-S$dp)(-EKp0Md3<&6eM8{Dox>f
zV;%V at f3JnMxcZTc{n$^Z#LgJekNFt%8qSlHJ{#VG1{?GJA|Hiu;HpVFqrhE9-)6q3
zuMhR!pjU#buQ|kW7I}ks8bmqX5UJsGi^#+Yyo7V(rMqj_`IQ*N0<NZ;z5|j9y$s8s
zTdqulyHJ&bv6KP6Ygg6kOFo1JC*<mw<8ahx`6)j~9vzE9C*gtGOcZ)bQDlfi*3Vk?
z0SDk39Kw;e&OgzB)uw#Fd1J1h)3kyxQVZXI)bGUyQ at r^cwfO}lUB+<p*O1Yz2zx5R
zsCi#>GP{^^OaT~Cfrzr5<B^e)4!0Tf2*$(*<CL%PU;Jw_Y8X><?r{5p#aHq7R&~*M
zDNK5^plT14I$`q>Lr3@`8^jN<S+hpey9KY+u}XC>m6^b*?Lf&!tMS4 at 4nE)uF|NdK
zG$<UULVidsQvq-0{_)3)jZM{!pqbX8|0m%Gz_2-bgTzE#^AH`0>HsMTbT1)6V*rvP
zX)+QY#a&64FHyA)o689E!^I{1pprjQrX?I4)^a-Ix`4TlNQT@<8VCs3GHrG|xQ;Pg
zDsFX{%^?WQ?N$pj_HTBUeSLj3NqQpMqv)KfH6QPguxmX};~SBQS?DhGlo57f8NykP
z*GX~)SVxT2-Lfs_MX`B{tYESj_66O|*>MC|#T-PD24+`ycYHA>0XqQC(O>x^pa;@=
zK3nL}n5Lv+NHU;;y{&hw5!=$J=r~R9GB(GG_d^68-%6#_ja#y|03|*9 at w7knxvq|K
zsIYk~IO2pKI5$)WyukbpBTzJGM!#1s&>E_ph3F{wB)Q#pBElQvVTV~7llCUO*8z^q
zvpl+>c|IccexnEEypA<ys(x=Gv?03h9$JOdk5vC1E&1sdZaCikgE-1;5Rk1!D@&Q)
zQF5Ck_lH_yEoLsLr1at;W&GfJq!q7`3OP*a)ioC_8$qKGEq<XzOkJIM7-1-uLhsw)
zelk(yl=_ls9`jPDSJ-P2 at a`Aw>BRT}90ntsE=9#vpzaDJHOHE=)d2|ZG?2a=yN at 12
z at mOopd#3}FvHgMMjfhxiq??1V_LJljVf?ubo-g#RU){VXnU`eMk|C8zc!OCsZTNP)
z%iB=61>=oT984Q6<M)g^f|L?-DC$x8 at 2}Ed%8lmd>e2A>x7EdC{JDd6Rk_FCpT$Z(
zIZ$+W8+2~%m{kw$bRgQ1xvlTSA$Fx=9CU?UI~>kxk}k&2wTSh at Y%$&aAYiw6pF-u4
z8}o(wv4BWV0A(yvztlj1sy%K5(;$fK;^Lw!aC5ws0T?!J$n`b9+4=tcYM7%2hWyrM
z;zaKT<=zIruJimbwuk}}EZc+q1J>a<pRb at Iw#?zOp5QP>mZJHbI^8-lG4ZD&SDDV`
z;FakoL;^SJY0!WpFPh-N>#nwYw?9&{_(<`C1xytNevQ#MER48jhkFD9)j(q at 0|$hT
zS)nS^3a!G;)BTq_vigjSjFRmiLDNvxx(FqY2`#`{2(ex?0p)JR()j&tfCBJGu3ph(
zjd8G6sN^nbZK#G^NC4ybAJ{vOlO~tX8T$LDHs&Y6Zh=S*#Cs|O)HX-KgJcY-6ldy&
zW5_`e67S1cA7a^v)PiVl((QX^j2i<>1;Krn(i|9}o-B-OCM9c-;Xw|x?&Nk94*P7y
z*<Dz#JIBpX2 at WQ~`<GYrZm??Yz&j7quSVj+dyvbt!=PS7j5-4F!T;&6TUHQBqxKyh
z^@F+t-;}t%l!JpKt!G~KH at oq&du~l0H{d3zVMQ|32pU$h3G_<u8gf>pUV&k_S<#VP
zsQritoiF60P(&lux at m-YES^Dv3({Dur!k;LDDPz{=oV2%w!Nk5JBDIiLq at S1?X?17
zJ5NrKSI<kXnAUf)V5SuwFdx1}!@3btkyrPPjR`1JuS5nL2e2lLrkRQX6F_8Id&ycc
zjlFmR&}>7~O8^vFcU$pB&@w<Vamxh6x92%79#ALHg&ZWfmAe`30PD~@UFgu?QNfR9
zfpi!5lRts at QKk?KYb4bWGA&`JPg)hW5e7<HT7eWF at G93}V!1!)jU%#ErKP;JwL3Sy
zM{A@%8KE`!{~+LpQslsEF`c?Khl-_C7{H({Y6uzzV%~DI6QTOnty{uSUsf1g)>o$F
z&DM7W6Q6W at Gc9r7Ad?8lQ{PD_76&90*dt44t+)lO692db{VK$H1IHPzl0AJSWhGcn
zZn)2D$Xu*!?qh2CC^U-~+z&+MkE8$OVb6w)ffVEoBXBbz9lZt6neU~-X99n0*Lwm2
z2mrKABO$R96Ld<5OtTgGQ%)7pnaVFn{zdoOen$4Kh0#j-AN5$=BJ`cRKSWBR9gn~_
ztTL`a2ZAIbyDZ+H&%i<i1xm#cToSC&3LF4dLJ3Wt(?XxD^g)pR3A2vNX}y1`B*fUA
z7cPU9KeHLL#Gq1Dq_TCb7<fqxkJL=a(OZGaw8`kL{GP4BZU+z#)*>&%!;EVnWfg(t
zQ8Y=h4r^3G>=lc4BZ{jPy`WD50U|%X75w&O(k{?Sq at 7^Au^R!Keq^>8jbG5cWO5rZ
ziI4l*s4nR0oZM72d(<k~&EK_)BKs0dkU;T{m)KxyQt4D54POU7g&pL5>$`VRC-+vZ
zA{zy+xdS0?m5D3y at Yq*&f_c#*Kdk|m!IB{UkW|o(-tE`Iu-Tv;zEM>q3t^j&Y9lm)
z`P2yd0yU_sCy;-?V6!O(#l>LAg7(nLa#8Gs)N)vWo@>14yQjjTT2{g&k$y;SG5cKh
z<Ek`(ukOfm!Fcif*l8T!aaG7z)*NyKpmiS`Yy6Zhsw{S4pYu_(E5pllvU*vAx%sgt
z7oj+%D!aFP?7?Ap-;eIUR9&^8EAGm=b_mBFKduF7h-l+Ra4%G2X>L%07baCI9c2VQ
z#jwv=xI`HcG^*|-ElkL?txqkqaTiMKcI92Ydi(1k2BBxy1i%+8?Hr2fL{VGSXarZ`
z%9Sev0c=*>xL5e1xVjir4Q7(aeT4w~80f*UG9-hVGMu_5O at k`>owq;&@<J0*Q=WqW
zSB9Sx2!1Vs2Hl5|1~gXdq!50lCc_uyDsRpZACshTSA5UjtF}N)zG|iGb8>U<NT^}L
zgV@$}^6IZTuc1zD^qqYpwA_99RX~Os8B4KyW<*jJdvp_=;VeU<Z#;YUOeJezey7Dt
zgkkN0pJQnkv7M5F**ee=A%jF<lM*976B^Z|^MCyn=c0<VQ at hF_)$Fo%G0)07>6?Qq
z*oruRmU)@hzmm<ucz+e~&p=Xft_xD2-!H?Fa4a1FK2<_qSu?sZ3-jnmsU+BIKC?5<
z$Mms)Te<ZeL9_(aRt-WZtTl`l?l;lHpaS at zj#9#~rhcf(<9-e`B1nolWVVS4Iv{zD
zfBO`W+DGkAShv{O=|d{Cj`M;bHyC16zzjEU?NuQX6qWVJEiHGD4pPO#964?1^3!lu
zeDKX0SOu2+=zE=k61<M8EE=_5>$s1Po#1G3EmDPk0sNhsNENE}JfP~;sdF1-%=KC|
zIC^`)3v-mUl+Z`>(t4o&gRl78-GZ#?EO=i^_$8VZIVfqCfoKvDy+vYD%6)OFy&y&`
z*7{Q+eHAc&-S_GHPh!bY0*&OTh at hbWr!g9YWUb{t=TplRiHn#$JjNYc#sPsUennU)
zz`Y2gU7w26O3;G^;itkzd7#3-Q28>{EjuTN7x7OUHFneQ9|HBL2dbToraX0JnTY+&
z_Q2et1H4*y{Vf`y=TX8#2!v&aX-D~E9aGQSJOfB<lrntBWkD*%L$fDSD4Ra7>E%dX
z5(Zq-q^`V$i#yjXl}B|H`M=J*Wr7hM=cAHkLH-0$XTmVF^~vr%-}-?dLmhjh9J>xW
zCa}tLhRBR$!=2Mzd*NLOc5;EhqxoND#vWrqADcjf#Q|-~+c`N^I3B=yW-rVUB+`)M
zO2ak`yAMR9<ALT_eI*CSf^D3KzrAm5ji$jmG<wdacx at V6w*?63+bMC=hoF}=M~6)r
zwF(X9z^%#0qd|iFWt#m9zT>Y?x|}@8hcm5>36`chQu?#{^gFvjsqhm?mbjp at qT{l!
zuQp`==e9T?bIzi+w_})S at l+nI_tNU*xZ4rl)Y7^T*hb3$*|qP#=4(>xzKWtjJGvmW
zFjOY`^=b{~zdn4EE=mmz;V9+|_SY^-1wW!mQyP9st;@TpbLbaPb0BI~al>1Yewsrj
zQ3hNh64;q0bO|GWq?%J2 at YbEi`t?sr2$@s$?~u)iF}3kvb%D9PP1UMk9-7>~9}zyJ
zZ at B7}A~>fYgf)KXJsx&iE}R%Z#X3iR^XEuws)-_v-Z1_MLTRGjBoPFlR?>Lrcr at qa
z_k=xFpC>dDfB&tg_ZBNmR})u-GRK_}L#X&%!5L6}g*2?CH at D?8^X%gqZb2P6=hP5G
ziZe{{TJq$#yDOodf133d|Gp?sw7uw`J$v?9b#--9*4=Qb@}bG39qH{y+1Jo}U^}}u
zN!iiVsSJ1&z)9Q}>JiGwrD+5vH#hfM_#s5*4FHb8faakQB-J;^DqBp7%PW5*>J6^%
z8bVtcm@*AFHPql at A;=<ybUgY31NpR-q-A6Zp%_Ju+6KHqr5_T at 0kZAEZ;9CIq=X!B
zy~nTNI~Yn~&T|I<;W^mxjRcKrZJkblRdWTtZbw_eM_F;mjR?lVRRoi~1 at A0in=;H|
z&)51Km#@)O`$D=C)aP!5k_-&29}4hKUxS5@;jW3*+1VhrA8)B07#fvm3r9Y74eX;r
z``^jigPT!!t1wv8 at F$&9X;%%Jdu1_B?}zfFS7^7wm{~qht4sIp-CK%)3+iY;n)X&>
zdd%KmLoh^W?hahWm^$8zaJY;@89*9uD at Z^}un+%`VcDp=53^wS at SMxPSlujkE!~1Q
z9D>1Xi5Z7^LFxo!aHuk*4ZdoH8!3B7nA&pFq4n8ZNHa1t6pEt!p1Zpl!j)^}&2q7D
z{QTC4*4(5Sb8>J9P)`8-f7kWeZBPyfz{6F3b0>HU<P*BL<RG-z{YcsNAd3P;v<pYJ
z4yr?qh;vAVEU&iMouV8Grc$~MPgxHWy$<abr140OST7gimV@#T9{XCHIrfvym|8;q
zcm1|}giSc6hd#GAptwV#t^NU2iPwS~QM%CZt|>wiz&H>tm59BtssX61;B59_Br1{3
zXrM=ZND(bUZ6xf(yUxK{7efq5qrGbNXk>jjatwmp(;&wCAqT&k38F~__#pKC&<E6P
z5qkrGfh~Sy9DOe_b}l7JHns7`Q;i->k3%JsDliB}W<RLPSR0X_jlwOhGjAR^izrJO
zDAm)@!MqHd97w{epg2mw>9>O)DfJ^vivL*0$H&*~2BXpj6DTt3E_`m_n(TzelN*OA
z0KOpfdjlw&=ZH2=6?Z@%2tz+)G{nnIaU2bPSNcXO?gEq{obFkC3S252Ac|)QoX5O!
zg1#ob`{jr9zoyOh=_-li1znC#17F_nY)AJ%<rl9%gHHl0^B|2EYjgJeI1Keh5OP0u
zcOT3|j;Aqy>uq2EdIY&q92l$%oN4$7ya<3Ir{hLYR^dZg<<=hlvmeL4eE+VE(XB_i
zM##;)zd6fcRox@`=mV?*`hoF7hNuX)qi~>*@2e8yH&TqljO9g~iTN#vZ+u8pRGnC2
zeeS*c)lv*+;3O#)5u!3M>hdI#6ZPecPbn`oPbOxgF{Y at CIr*$?A7_2MA3v6n$lF)q
z&Ts2{qTH(RN+(vgIZ8T%xY<0KcI!25yM4HFY2KzfQBMBs at S<QHFz0!g$70~1V<P4>
zYv}MI)H&1oEc~mxMXB_9d__dK$Y(ToDqUW(E@@B}XFL$o8g9D^h{f;+j1L`(*FG+Z
ziQnG?ZxnF`n|wB{2a*fDky|&fuL{nEms~eWwMm1+7}nx*==G?i(8mqARav2YxmDJF
zoZH^^L<ppu&5i3g3cGZws$H2x8 at N2vq376xA{rv6;=>u|QO;d{BSD`0Bk3tuFPly{
z6WbQGNfK1iqGX`Xybjp|wN3oAqsi35kmKY^D2xaB`$wsuA at S3){2MoJuu#x}Hz9~s
zeR1_)uv8vO56hD8J`dzI6*0b~3y at dqVJkes1H{lgRw*-pv@!g9B=Y7UfI{{gkMDJT
zU~b17QNj^U>W_TMf6Sw(Y5EDYxHMOG;~k}8u)@=ptW}E;?sLON>)-+}YPGZgSNo_{
zS$2K+6~yr~8!|_Owd0_@&H3(Q at DNdi4?Ekty6zf2a#0U4%>pieT9tQF8Xo*uhjZh2
zq3&yGW_n-qnqFf<bYti1=4K=K^z!2i*#(YM0;l&`G-eDjPEn+3cBh3K`AKjQTBN+I
z9wP3F53<SK;+zhDW<lm`ULAe2#~qXWKM6_sY};5GS)58R4sfl!Y+Lg5p~Ez^>(P%^
zZ`N at mn)`FhW2eJ`8e``hw$JbOY|R>jIO=xJ!QJ|cl$o;^v27~gE(VdQJ7icfvG=5A
z$C=!PIJ+-7xUQ#_`O8qSUBbq87g$ZtQLg*br-Uum4O;A&7Ge`HR0mqDK_yw%s%#B`
z3sfZnVZqDCoJD#8QOal at E{VQ+T-r+m6setsl51i<6!P00kpz!x!l+HJn!bl>2Gu%E
zlypRXTCaz=R}-9CAi<o<%1YL;=F*<02#RRF3#Q6X%%bpmD7}+GiSqCKECqp38In|A
zwPq8%U_vHJU{stus^G$v;5t?Kj(Mz)al3ox&K+v3FbA-C$g!wWnO2FagGN5GtawlN
zRft;SC<VY^o+MyGXN-NQ*uxI1i_uKu`zeu;)KuJ@<DdvheJ=S{vy*=}JbAL67h at Qg
zAcsN)e%;F)j6~c+*)QRE6;1=xD2W&^gU at x8upD2GxegQ`6YpKR`}!%Y!1ZHXNFd}U
zT_;t(73qqbf(h{zV97>xiH}e@;U?#+NkE`ff24}HMf*X^GpB$(f{-rqK-#w{kwbHy
z7{X&b(p0r!G~AS1?o^i$@BRqZQVIH)d&M;%c&SS{6%6J&uphC~!ur{O(Ke*$)yq4X
z at t5C=ZK>T at p<pGc=Q?_5&!B8DpwE4*q%s1HiwFE9aQX at P;m)nifB``WM<0J?IRUu@
zf?EmyAr&@ot=%kZSj at q^I0wVo5A&lrP74TI<eTh9^>^+FQgQHlgplk18md}_cS8S7
zWe(Cu{1@<3XWqOM6<0Hm6Q$dP4m{Gu2;@VR_x%4t;#Y#y%nU+iDo{(J`Qr9qCzhOJ
zytF?C1Slcdj73;&g?Vab7O6AK;}GzoZb3 at VGDI8t;5}pQ(9O|iF2X~2)qC)}2yhqs
z_?|!$1&Mt&V*VW@%MtNzn6{>jbSVxhMJkTOW9JqMZ=VA0ve48{h{nu7X;BhRay7k?
zcr>J;G^&7ZQ~@x}Ea<PfA at Wxq>0aP-%OHPS3pry&CkCCC0gA-|>FAVILWtz2$t(}*
zYdsK82;K_0H@%V45TTpkz<1Eq&@tf;VMJF1uV?2CSvP%*5Hojm?>d2;E*?_i?RxCz
zWYr9uKYw6av$;;R0vN>%`9$e9d?amD6>JVFWR^aCx-&W^CcpzV+f-tX3w)RwSs~@e
z1Gt8?hMI%cBBy;iLe1HaFqIDDix*)Id8S-&(Fcj`wm#d0ucRa$y=R;+h|xR2Fxe8|
z0Flv?)TIVJ(<9X6se)A+E`EPj>UjYZMxOjs1GJ#__-9UO7cR(>XPeJN5I5LyMrtD;
zgw;@`31TXK77(l=4)cxCY^Zo3jN6S4%~+IOHE=J?ejsF(Fjf5->Iq$0hwKn`$T*+F
zC13Na at EB)VOuw=XT~Na<$W2O>h4R+Y+XaKANB;9m?t at 6QF*ATZw0=Y%A~f|wp63c=
zA?*%+>CvNW+cfcsRDONtmiO8Xe-VqrtdKve8B!A>1lph(w8uVBK-JyuO^@9SnwpxP
zp)rcm$x$A}ZIT1f&IQMx57g-sp-`?!6YWT|O1}aDFBTnY#9%}E*56=t-#p$so&D;K
z5qw+;%tOeg-W{AMZuBlt`8mg9{IRsl7rCb9=EBBCsbMs3ufZr^>Ib4C8eA&-7^~;8
zcBJwC=wZ2i3A0$Wu*vh#K82zfKV<{wK87)<Vk6CM?AO at T0>eT<bd5balIYigeA)@I
zfDj%9<Sc9PDnqDY3%o)ACrGPh*jyK*nZ<Wy>Bci(FMecu9;TqqEQwJ}v<m<oFq+Z?
z%E4^m^#+`-r~xF!Xd_-4f`ll+enWQtM1Sgq0~1rB^e6YhZTy5ML-O|8Prc9sT}48<
zJP^GY>^slo9-UmG at n-2n8W@~pchdys!sJ<ofOU`0#`e|S#f81}H<Mol7U~llKlNUK
zZ)?AE(_Nzwk>IEt^eO**(dVZ>rA9%{y8}HQn$O_HHqhSK?TnK8)VIb?E)OX&p~5Ta
z91C~u+zHLi)HmSY1&$LNzvNg&AR$HtWcT7kge0m~Mfv>e`<PUAPAsQ0TaDZ{m0EpI
zGYZl)MPusAfAiGEgb)2a^Rl1c-o-Q<Cf%mF;s3gr;^f5^BXbIYrQU4?O+DM}zb<As
zb+OH$A;1WzF2<zK1eCbn{`bX%FHGzpDVdIJ)r{z77bpxQBqZ4U31Uxu$rVjK+ya#1
z+fdc!HKE=XB%c#l{QvQd&V2~$!Wi78O_gZ#@6J=-fqx&|Klyg0hQ7ZxCJC0tGwLNl
zrE4?Knty#G)4=4OHD^+85_6<|`q`z$tz9MllY9Rd-~47-0^_9?Tv0`$ff~NXGYA3J
zprR)7e_c*;#SO+!n2Cd>MY9_pXjRIa;Fq_YGA4qg5C**t8C?A1A_PhrND8^#Ia=}#
z09S4^wGx)DBDZ(qA$tamfvOgU2F$y68+1811}{&mK~X at Ht{74wfVx6^5^PL;mHdHj
zBl?49j|D)i!X5we;Q#uD$;C2BNyxqMf0MxYOssmEx`MyY#EW~7iqwy4{tzH84?YKQ
zKqY0;QZ5hvw?z~TMEI&PemHdn;4B6DOP9#0K=F~(;0|x|45MfgtVzu<^>ux6=glVC
z^HR+__1E<8H}fYyz`y^JN$&jru+hf%e^`=paOtE4{QJk>{7*}A#QvuxIjaAExa1SP
z`y3?qMN3cgYf{G3mmD^39&()LOj|ZJp!R~IjPci+U{)D#sNlj!op-WGp+hm;>_G06
z30#l&82|Mz3pz;cZj2xO_dovU_jg=u=r05+Dzh9G#J88U;)szCDBX6-#pM!A?hLuk
zg16v63%i())g<139M)=UjSRg4H5rm&5lzGkE?+__Tt;=SoFX{xs~D5bKiml at vm3%B
za9l47l9<f)kGkPEcphGfdWDY~8DsrZ(1_+gzkMv-hBkW*=qODODoot;gLEY6N;p65
z;1Id{_fG4DT$e;mvk%WUvqe`fgB_&4R0Cj!HgE#Lz{%9aGp(L+8dF97>nZp<Rb1b^
zCMVly7jbR$!!tytb8+{BP(#N+bVuflISZ-s{S1qp(Nn{V&QhI9<hYQ>-I(-`j2kQ9
zMoou at N?BgI=#OcS3ppSRM^vSisG~|9qX?|ja#ztAfyQJ~JM!+o7ombu57Yul5$ot0
zTvGqumFX#e`g`qukbik?H<7ll#oTs4w$TtIMo^aRB!&^p*D|atsOY3w=}4An6TL7-
z{ko!kJxGMHJ<Dvvgui0kBh!m!Fr?;qoV+HOJwzY&obYu2<!Bu`ieW=5fsVk%Zh+sZ
zJ$(RFBX!tfx`H4cK_EKv^(8gwGIGxUwaT)YbYL)!YaW##_%LCh9JhHrnhJhE#`T!y
zOqdw>N2|&eqGf8UM^dwn=6#?CWraV(#c(D5*GInx{JjyHYiqAJn47bfdOq<i*|qcC
z-Rd!Ui6~ICr3xZ1Oz6Z&EK06utj58wW55d&S^z??6Vd^OcS~LV?`2$FpAesdfV|pn
z{)uKIqI_V^oAx8TwSg}p4*59}*=H3Ms^25PLk(lH8lzC0X>CB;?52fITy%1=>%_zD
z>hKsJxe0<vTK*UYCsKzbo^I4dWPhc21Z~L1gs~<D#WW2WMRjIUT_9uK;5y4iUVVNE
zD_!JZ)xTY2R5*CyJs9WSUqwVE#sIKgU(6(fNea73O9fa#HE`GWe=XZ`lTrc7 at O~h-
zpq6E%wK|m;l7MU8|F3I$6G?}3N#hwZuMGfjfaC=lXvq<vw+zfvii|rB=r^oN3fPsp
zO`wnwBIPEuvHXWgInVS!{J*TK5Wp*}wG;hIyJ7kZ%4U0tQhO3Ix79S)BFQ-a0QFoC
zKf>jKm at bhFgg(I{PT6$(+jK#uQxnX?FTXsg1@|958Ymv$^Y>%kyMK6{SDk6N-SCCV
zjre5!bw`s8s;?OuDOlfFUtX0EZ?GhBdPc at d$CcG;);qd=bfg5f_i9 at oZeZ)ySbX)+
zWv*TRs`AX{8-}<2Fs at JuySuS;czxUVlYf8DtLkhT8ew1ESwW76>0rLLj!qF~j~6Rg
zLFeZS=5k%&AG`0AmzS4RRQRGw#ETZ<rH3Qz6w(}U=KNAqQ_=5ooO#)@VvHvV?})`k
z(w*i_`s)Js_{2nSOrXrDZs5HWvBdaiO~?|ZnQPZUh-UBL5cBZi)`Wxv6Lc5 at dsmzF
zL85R8j#bgw*_oMzr4R+%CA(20lrxB(z_v_GJt1h)lECVMmLt}XIaCDepSiLI6%Iar
zep68M7{=dbkzf5DvL-K(r$xwB*1#>W3LS`$)4;7YESWXA6Yt<njB*rFQdVA(e8Ztq
z(hkb=4NLzx;-Dt+{`}p$cQ1v7g+X2I0~9A7N?nRjb4p#2>dU6bu<U@#>NAW_I_vi*
zl?@lQ(t*W4dM}9&XOr8TIdkbW>skn{*90jQg3*sb?ROyxQ|m>XoSZg8A}N8{yen)x
zu_rjnRGqOR8aFstic`*fqRCD%CPP^;XRVr4Z~FNq(|Wf<^Am%SS(a8-v~7Fy at plCl
zoe7DFYXD}T!Ck?^!jgij$d(OobzF1*xvSx?ejY2q6Ii)amX-ACK>X}u(Zi3aP7
zg_4W0GHx at pKo*^Nrkq&&WLLhqco$!g7gd2J$sv9G=h<gq;DAsc8s!zNT7DFXo51<b
zT{pcU5uz6b$WYLn&QtdMxhbgqib at P+l*VF$C7 at n?@k)#Fu>u*^5qs{e6fTRe2e118
z)@X~)^2l7LZdRy&9nN0%9J~h^|J9o}Il=w=pw{sW#BbOQuop&TWoQP7#&e)mixbAS
z{`VWb4>k09lx(14ZW*pT(Rw%LiW1M_<6NaBC6|z-y7c9AMkgfjp~sqyot<5^10#!W
z at bL3{_w at Ae@bP(}2VjFge2-`F?cdfGgeUd}lLMX(Y at fryEZ%f{CvI?tHfo$&I42l#
zvIOY;N>WnNdJ%ZeLm=%$E-d0)H9S0=f&eu08hqmm4Q9s5Yg|}HM^kg at BAIXdVluk#
z<q9s8Z1cyv<#=*=LnIqspgR69mVZ=(q**T_<=k@#^ieUk>#aab(pT`F>;2)yJjddG
z-(5<$?PEz$j<sJfCt{qM0X8juaTRfAqei?IraKE`lv!)kxrLU(n)~-J!&CKrsV0^D
zezpr9e#4^Q&&}@<y6(SXm7l17E(+=~Xu-j2-I at T+sx%JB2aIJx__KJ1Fc5Yl@!q{F
zAPKOT!%$00>lx0+%Luxyynk-%>Swplr__y&TfRt}mH7WC_82Y3S>Q05v^v!LSfNh4
z1RhFUY6u%bb|C;G!{EbBQ>nIM55UPA&EGbB=jR8`aW>4raE!@7Wm<+-t?%RZ9Iu65
z^+Gf{>s)bnx9fAj+!Ug7sr9<)mCIUuEEwmy$AQkgtnZY;eTm0V*A+4-kAB?@anku3
zrY-j;Z4KGFK17lm)UdL}qLWS;QmCspZg60|NeafPFb>wc4?I&Vu5Whj&;O|{4V98_
z9VV$S4-J*Inb~lA(ob$1AFfi@)@DJ?zz1LJ9X>xAPzwwSlAm;J$hnu2V=EYM7gxhA
z;;W#zA at 9_QCi~|CzIBz-1LfK8&i)Bk`QU`Ty?u0QsxXR4%l=neLkAJV*8X#A$~I1)
z#olvWz|M(hc54gMNMCG#8V2`y=>qF8v$86n4j5KWI(aB5IN($+(-{E;yJR;4+lv(5
zsgGI#F|Yw{UQ|C^!p>xLtYzFy_zaVN0r^(AHq>~c$+d0miu%X3VUOE{YvYpnZT%LI
z6}f#yW+o<m*utV{2)ZwrMS29fY<FRfEy?duL`|1y^WXW~%p}lqimn0fPoF;3keU6<
zQ-=LO)@cf0>{};@&9D+5V*~KKUTnqRETx0`s;&->QiQyKr88C_x?*R-e>OzAn2^~5
zGBV6I%5>k9=MBronKVIOv7ie4(3J^SnVt&9O95kL2+NRfgUf?&GtAyJZ{ECC4BWi(
zFH7^B5k6&UFG^sk9GJQ4w<6idsa6{+Qoi7*$L>YZj}edr4cS0bU#9a|pVQFLfR#8(
z=rmhP=M9 at Ll*w{EX9WCnJ%|=o(I_aFK6r&D$Cs*e*H7P_KWT5^gk&cJX+>oo)-I{*
z=&(Xza|K}31sX at jvwK$%J!KtR?j|SuLT-vzO23zF6W6U>Or_6DOD~s|m0cINJ)jaP
zEs4+`R!#%JHsem&#E$8<b#@j*#<P at RAHROv#{zg66O2q)P=&IRFPZ?wp6p_>F2)!b
zdUKe9yPTXFXvlw at 8YcU3qtWre$&YaiyG=KqI_+}1c0u&C*8Quu at fQ7&w?mJY;i9TM
zi{%=(;1TYQ(@24?F8lq3712;Js#?G<Oi=K)!(eK$CMJ*~1$Q*3UMM$rH26e at dp!MY
zvEnn)*M<QHxji$j!3UF}>4JI-3=G at _VdHOmgFnH@@~{B-?R3uH_eABR%@AHGSiu{h
zFy)6=na+7})yX4)!NCgF*4Bu4YoPaj)zf6`-M1m)_zu|EmY;j&ajr+le;)uIK|veG
zm at i-+KUf)$=%2mJ)Nm7pGx>j+7pC?7 at 8*@M{Di^tVERWkmO1nN>dya_SlvLD0h$(}
zPHv<Qy3mrUD!=jJo8y-$cE;a{Z0KnM{2+g}8Sa=zK){#6IK#^}teOe}T?L=IyFcJ?
z+N3-8mu at JA5+(vpc7~#bg+*IOM-lWm|Iyag2A%fIq7&^1z5fcFsH(>jRFG@@?S44k
ztnrgxg2IJWx-*1^w5D&zWu}EHScapnr^k-};SJ at mqK=MEKqz!A#c;i}M~|YusHo`N
zwLmeugQtw&aUYUSFPNi()y?7Z!>thxm3w#=7o4$$^TM-Rj7G=H2*tu!Sk+`^0ZYUP
zjvh9dla6%b=;LQVKToqM-z_)id%(@nwb1$09Dx}eof|i;OIN{%Z854QUXVD*V7VFI
z at v7g}wHbpTevEc*<E*W%owzlj-;d1`5{cy#a81Z#`1$5Tf1ihOII5t3=c-a%bY`X)
zPDeD#`V}a^mWx~s2v|D#48DK=epC&f)_>KMoxPYArxCB4chc#p10Kxj at sXCjn-<Fz
zJ9pi>r~n5!>Cj9tbFiXPd;fk#OuUG|qCa{BctA=Fmr?gS40DttwQ0SV+h>`s1J4Hs
zkB7$O0hDu}&<==gMTE|k4&?xAd4mmB<Q~x+?L!VN%SLtLYX7{@a`b<gqQ<kJ3K{lg
z0v<T!qsd^0sn?UBA0-BNBJ7pY9MBAV2}SZ}Q&`QqVFLOI{A0lW at CQYB>u`?_6{4Fl
z4F-?x%N}77ku~HPPJb=Dn~>mzT9KGk7E(X5HsA$Cd{zQ^4CB?m at Y_JRvYMR@koCsB
z&w=b(9Sh_Rax)ETO~N#oz{(Iq`#ol6W?Mq3Rh<FT7OY?eO#2FkX#?S^gDq1IO>RyK
z=>H!d_j)uO>CJ5!v%#puZSaph-oOEc$Sjs)o9ZPpUnuax$_cVi1cd<23lWsO=X63a
zgOR^)??2+rj+!vmnD at h2KH%%|tJ6bm(_*HP57{5CcvD11=K)1zXl%pEU)9zYq6lP)
z#)7Ni;VY_Sh72dJ7xDXgOmqVnEgoCl0Bp7rk_dXW0_&utr2YYZ(HL_86YlOdB?pNS
z-U<_sLjewM`cd4VZ0J81geFsc|NhrsB7k at xMsR{}I&$<PhqLa#9NZP@{*vE0huYSU
zv6Lo3z{5xr3W}%vuICIxI0|VX0N*-9lW0^sfhMCwze5y<&)SMA%_U$HHc5N4Gza=1
z(3sI5Vm0F5Jan>R_}(qQt$0p0_&)_wz<TlD%jO1-p$;M=?un#sCB;zmVTem*;g$U>
zhMFQtXPmAt`BU!q9n)ZV%jkNHuFX-f!vFT3$Zb6xpO=^WOhTW@^x#cT6N)j>Nl6=1
z)6!y)C}G^(L~1*ARF4-R_wt6eQNaqH*s=|y$O8ZHjBRgg+huNUzOxz=Yhy~wq3r(;
zH26NyO)&B!gUpSTHp(gf^YQN993SocibA!RKAO!f)65l^wg%_3HiJE at y)Nx)pVrbt
zE&tbLPB{b2tnVKfFvSo^h8Nnpe98++F!ch);bAXNzH#EM>(}}!cQF`jx;&V>(*$>*
zJXl3R7_v_U;S+s6lv&snb1b9GqI280<iu_LKJ9a&K>ch3HRpSw6ZjQoDz!vqrksHo
z0?1?x=HcbNj5?`UX#D;Ae$bv3u^*18K0X72Y=(7t&iHLzD-X&-%bpEd9*5nz-h4Au
zZ#e8P4$!#*-id*e#FDDTiYx7Qr8&UIUJVIZ2JMY6tmO?bF~cI}@csU<1x;>4%_$(&
zE_C7*%7cX at YqiBv8xDDSc?>YH-9<UUO3Bpv9N4lbkeUg~O>oC1kUB7|V&##4tfC+L
z%bxkUe~UrZINBj at iV#fpD$@;8l at Jd&AX8`o?GP1_uHfp=kYt#knNVF{e>tX-xKG^Q
zyx;fdsd8hhC at D}cbRs({Ruyj!gg06^Gc+`m4m6^KaVvJBT)~v<wE7${#EN=)dh=IF
zOW^aGplHLm!}JrsP0f=KT&wZ;cjFbw*oj?){%-)?f-_wXH%APmv8m$UnT80+#O>tY
zD4@~fKuBlgjYs_c`N--T8cX2gtzGCYKfnVb&M?hMMTO^XQWEVDEXG8x81O%;7T8Q1
z15h;S;u&Ug>Nkv><4G)ukdSS<Genk(08+RyIYqm_=Wf6hH2GJrUhP7G2|B~P(sCef
zQ;eOngGO2rR2yYZ3 at dJ!@%zCsHNoIg;4dz8LPDm1AH|F9I)ZMw<?&j4V4T^pQP~co
zSj0n#RwAPVHL%>q6LaJCa$)M?3!UFSTxuvJe{`Mu_e5hPwe7(M1Q+SGuIa|iX*jha
zL@?yE<(KfA#H98c8F9d7$TG>Pp`?C?0L=^5f3AnEq)lCejX26h;*Y=jB6E at 3g%3vF
zVUk9%!$2HyDRC%&czAd&nO>2E+*S*%d;%1$JTrGqfwzVfaD-dk5#Gi1b8)hw;m~kv
zo<(SAUp~nkxZqkJkda$E+koHS3 at suX#{SZM<6z$GASYrFHHGGTwQ%SrGDl*svU^gW
z<2^8O3W<n_2<Eh1bHS`+6Eb0((JfL)`yNs_g>Xxe(k{pw7#6p7&+i+Ihu at G!?eDJ%
zM_I1IIb-?@XLB>NU3ha^Kpt at LkfLoC78VXG&%*^M-2mcI*V1B!hC+$ng};q^8iRIc
zV(NW?bMT?gz}7lF82HEd$KT87{!R(~H*ZH<kpe=o(v-)dGJ+jSN<Yj>Lc at z4g+EWn
zDT>UK at X#ttjW1}F*57fI>EL+8 at xSL12m*3c*VSdi+p`r;Ltal#b0x4DPF-W0feIy5
zzqzM$5%>b{Mw{H^YJI{{t{tKD4uT1ZkcUG!ArA*aGP_g-9d?-FC{EnKg%$5`Gcztu
zh0b&lfN5HJmhfIuL?ms`dk&_Cv`OM*%CUh>KIVK6TqnYw3B(2rz;@!Z8bPe6xPMFx
zTCNUCLYF7I!ESw*?v>sQFaF{rWwba>bWdoN)`6?YhG#qAx{h+tNwx#J>%9}#`werY
z`p<EWa-mWC#g`_e1^767aLm&mgRLtH+JAr at gLS+q5Q|u-q&Yw`;x`G|Oz``@Rx5Hc
z;`)Q%@iXcMO-4Y*j{}84-UQd_iGBM7utI(kWiIlQgn%tN(J{IVm|`m7fSUL=9jFKQ
zr<_pKjqKjcMiV3g3#y=7^ub8z%};hQ`4e426f2h93H}!~jKFpoDL_eOB_*|lk_p6k
z=KYRYy#>f}KA`L9So+}jua<FddJFXY#M&mJ@*|AXB!0N0tjtn)0A&oqpQb2JP}YGQ
zVh<PH;fCLL$dL^)%#@MXUR-Iv+YkfykaK%xwm)0C*9X4(ZhZV at 2%oy}Spz~bRq+|*
z9CT)V2~2z~T*k<gPyZ&Ik9=T7(x3mMPzdk$^Qji^a|^ff(ET~15A0urT^MFG-Mc4<
zaV9J7+;G-^y5I|CR=*FsbrS#-8z|%jRX~7dr$-uF2ur5BffslAw_^jXvgLnsY+pQn
zTOB{99BhZq>tOyM4*W98rYCS4*yNE6Atpy=z{|_@$N^F*&%Lts(_M?s186HHHwWEt
z;fzJn{{g5_A^YRnG37<{D{MVR8i|%^#c&&6uyegHR}s!+5Q9)7;m41}Ut)T3h*Z at S
z`{3!+4;)y9+{?z<2J-;zYPI(l!Vo#&{n0&mtpjfFMT+^W at s<`$iz~RJi at C^2h+|m5
zh(5JKg4JTu9ymJ9or_H8ELhGA)Yx!mi0V_Z&&g>MreD5zG0{8s-FmGkfa7d7#SCr3
z8dpkf6|AuDPuI|~T3#TMg=uTp!-o%PlX@#4f)6;BU#6W4vA-p|Bg`rqGa;eb4=Fm2
zd)iD-^TGZ;5H~+6PdpBA^!b6kd8_st+R4{!CUQ@<x at D}nr4TDm8jmC+5|KmC?t9ox
z<m}HkLv?`s5GH at XsXVH?Vw?MEA{?k9Vi`IuYRyTMCWz;vnt|U942s)-daT>n513At
zAo-TtGnhQD$m6kl=A|N4lISm4L;D~vn?q)=h=P+WB;P^0B;4_ov3qmqVj)I#yzH at p
zn$MfALD??ewdw(yJ{vwdXPlyw>`+cshLR2wmkEk0b{OnXjMKCdZ5%evw-K)F>diw6
z0c at CyS30PKEuGF(a7IYvBYs1=5Nc|E_?%MJ^AS+XNTDPbo`uB8Patdj`*(nO2_Oo_
zF?GCE08oIkNNn|}-r*Z at O$(Wld;Y(0lyd|LIt(^IlCwl+oZom at DY}yi{ymrB?)s{m
zP<LX1n>1f}swd?uxH`&wq=9%+kSSgWg`>HS2x28ai|H4mPV^6#iHH5t?Do_lBz!;N
zK`0QtD+quE8{c%qO3#K6;x6DxR#C=0QcwIB@>&Hv{g>{fyDE7516Z8Zc%<R=;7>Q=
zSRsZiM7426o#5jitv}j at JnFA~#f$qwAQa}af}#n9WKJn;zRm_?bOoKz5(u<4*Z;%B
zv~Z;j*sX*2DVGuiL%gdJSMd&NL^kK?d}y!j at o@tTXtva{sY0=bf?J%)G^UYvlyrj6
zB+`#~e04>R+8(U79$*~IrD_tZ(WPL5n`YpE-kTKLM$FKl$??e$AHp*)<NmCne9?mi
zp5XKpy?bUc_1v7IMUm3{-?S*INs9?=Bfd;ra6dhGx0=;VOh-H*b6hoJ_WVmItjG11
z1ANgsb8dcqe(S?@PJ0qf{ba<@R`81ZlsQOZ`DI4Tl&it6GfE<v3VvZipf^Zd?mpxs
z<ga9%`yM=9=uNJM&<Bx)raR~tH31zJ$YS`Yl_9?GsLTND!^@s3PcH<~D<?(C4Qu0l
zykvI(@*<p-4+)9)yzqW9-n?Zhcs!LAVnRpEM9~OYA(6Vs at 2D<7*cy<A5hN$5!k#pA
zSaH1Q#LK|vfDo|=LRS6LEfgBaMPl^RCD^|Ux={>9=Yw#Vw5sxOaUsl2YU+uT0l|BP
z%9alfJ*5oS($bPa##<Zw^8|0AJBI^<4V0ey9wLlHgcZy~e{3VYs<H1F(O5KVnc<61
zoh$82R@*f at y_SC`uLxtD&;kH^IHDX_TQ!4eunFSfR^-E%!2}mV?GS#W6shn))wXTK
z=z at PZss<ys4p at Qu)tkdeQtV3Cg~YZeAraq^Lrmlmaj?5#!46pX+)Snl8EO%IQevZ?
z=fFd+*le;3dHqzRgg*)hg-^W>xpjnn8Set|f*Ht$@6fAq58ZN9L%%Wy;I+n{L?v>{
z__00Rt^kx?iT57zsY!o*_T&3~501yr*qIux5F3OtC8%@4X~+ger-I!A`Jv1&L&JnQ
z#q)<%$pd#Cq^SNz2%`=#nLr`^6FcRX7<7vN!mnZy;58D at 9#6)6jl#c{9k`yUJQu$5
z#Q(&*jb(JXBO)l^^+&h7=!aJ+!cVZlLmHdlQe7^LUu26y`O(C_&olIJ at u<8#3GY at d
z#xAexKdSxQ1K$iY6>R8+8>bRCln^nG9!W!fjUx%}oRvzj0RQyaPzSs%dGwjliDnj%
zg<toMf7@$^V(IO%(_nya`~1xO;szy9x)n6YHW at 4GM1+Nb5LsZH&3q%|2h-EZJyGFu
z&*}Lm8jjv61f*O{Sf-(BHq)RgU at e~MQaix9VtAP!DGubkZQZ&JCXbT!cf-B1!)AuZ
zpUhfNg_5Zq$S9)GUw%3~1Ccm~V$PTtv<(uN?qy*9Ie#QKUlS9%;TePAg4b)<j9>Kl
zanS`6r{JTa80JOb2<P^HWm=N-UMA##xvcBTdHh)R at xYDGs771XVoZu0{W?}E+&Kf6
zz(B0 at P|0ej8f{&c&qnu&u5YPc+?fFK3K9f-z at Vfn|1UJNK;)zVAuQ?j>(|9pJ5>BX
z?7ew3mu(w0tVtz>kQ5mrLx#{GV?+rhDsyHLsSGJYC_`pKq!by7P{@!XsgNWY3zf0V
zWR~&U=db&I-eEoOTHpHq`u=#W^{nSk{f6th&ht2rWAA<JLw;5>D1I#!l_!B{4g@{#
z4BQFp!X)MCK~yL1h!p2*WyuEDH+Zpb7|)8(rplx_+EoOZIwCs at VdBC4K1a5hgd*hV
z84~h9Rfb~qlggKnt-{WWcsu#g$q|p~m*oBze06~{G9 at ef%uP+VjSVZ+x>gqV`y0jy
zc?J#RD^Y!JsnfeC3Q+=>2Y%vVmM^i)YXVMsO7O<oX#^t?qFBIio8AAZk4aWB9>3&{
zqHW|$EFn2%z^KJbU9J)?c*lPETeh(kZmc6&wANy<&$OwZBUhJvP>N<44_pknAF3hY
z#Y|V^ppgiB|DzDE#ccUAJs1xb`yRZ}KiC2E{Kax)$f4W(D}oV&Z=If{rJ|bQVV#^C
zi$sjt-37iPbbF{IH<+2cHn&MQX~8j*0}3^pYZmxysy>{r<d1>E2Kl)ytR(IrWL97=
zS8GeJpt5cyaMDbH=Uf3PmO3%<ZT4#+ImMm;#(s{wJKek0nAGGzv%d}0xITf>?lu%d
zM#Wf}a-k%eS&I>DGY+E=g>!U_jPCzE7luh0cdBZL0NhJ6VN1u)ulCyTgaFDoSuot~
zP*hAzg;)h!{opqU?Gj<k21|cdlANCZJ{vIi<I<PYb51vF={$aWljII3KAssH$x-w%
zvM92pL5^~HxnOIxTVEm#Bvc4|YV6bREkou+K9*FxAZ;m3^!}ewXL`tWz<oUcE!2c0
zCGCurACY)=S;@~e%US*Dp!3`eJMba75=e6wRViEK686_2sE?*?!+_A07xvt51^I%X
zx<`35!zAysy6>{%)Bc_~?Pd-t>$d+lp!?~U`5k#k9^CuakHr6i$Rd;yCyb3tjOTEb
z6t?(tBB at ka5H381>}!=-l#x;x0GP&Boy|Q|dKIQoqistIZT5%<1v5Bgul>&(m8e}P
zfCAcZ_Y(wwC`WKVuE4*h6H4L>H^+gtEj~x>nS^Fh<*5}^30(vfNGQWdV}aUf67qOb
zQq~O<u$VBSp>XZr^qqxD@;B;F5lpeIMVX^Os7-91hW{`{gkvUnv9R+LIlOdEU%C}R
zG9aF$AD5Reqx$>?$M_~vCp<Ft*}x{b3oSp)Sd^LJSl3humn^NUDzMa>x!vwz4D at Kj
z35_z-8|+Qo*huWHAjdmz$j_U~VCrKwa*N!!KRCi<x4}^O{YR(Od{BFR(g;JSehyTo
zEaufj%2n49omXSbKb^^&pKbvno&g!W@|4s-#<Na3&lzv5)z4-G6I&V+UD}wJmq*Y%
z<UMwi5}vd5@#WAZG=4=pQF{C;+~I>{MQD?tnfr=p#yQUtltf3Tplyz at V<$9ZnX$*u
zUOP!e6~gZP)s)mkcu$h at 6M92`vd9y&fOQ;5)=7|s&w`&YNoDgclh;PYR;Zl`H>M3R
z2W#L3l7Sa(Zsh(F+)WuP(14SH>U9O&OfD0wSGa5(B`XhM>%T%#MZVyHIdb?PNJmW`
zhy`Hr^oL^^vkpd=9@@!E@<Hp<a|V=<7r!uQmFW>ANCkoz$>jX+8}jO{E+z9nMQ at Rl
zeLF!*bMGJl8)}@lj5*z;dIYbg(r;U2`gQ?yF at o65*uE}lDo$BUY7Mw8 at 9Cjm<35;O
z(TU!*U?@Q!O(NB8VJYFls%nJ8AQ$k{?8DFgO%oir at orvC&qP;EL+nFP80b|qnKv$@
zaxY5uSfmt*<ei|J;&s3_x1%J{nf<7Izb6$I7Y~tiDIqg0Ev-5I4{p;tQcjWDgj}Ze
zkNCxjN2yPq92=Y`ysk*m?>B at BAqj=`OL0&*1Cbk0 at LscpayH&o!VR~Fj6(o9Q6EJ_
zhzXV$Ai9GTgR=KW0PV}*IJSq{Dc?+x%InuXw8xWW$;-Z-?0HHKg(spRg_qj-Q^MgX
z)ZC%a2QM;OL2eTDx1O+rWty7|fTgyX?;{?MP at eIaq1SG-wQX^4-)07eQE+1-s9TDN
z5F;{lIn{x!1Q|Y%es}lTI=)xv!H#((K+dfL1IXl>lL|oziv!c?43_w0{ZomGs+uq!
z4PU<Su_u+1J0J;6*c^z^k;BWV5<-YDBcbuMeHk;Uga>UwaR(BL_3SaqYRdtCJC-Iv
zf&`IS*yC9~<YJ&YaDoJCnW?YlM=GpIlJV-duPA at v3MzUAvP6<gVP|Cy`^@TB&bUE`
zpsK5nLz0VID17?G1f#J$3X4uyy at dcCeI!8MPkyG9juc0DKW)G+afDz2%EZIIiptA}
z6#n6xaB#MyU&6b1O?5}o3{yyI@*d=r3qj=FVgR)+co-h`E=HW_jue81DA=4pJZ>cV
zx&!)#4wbyMFsM3Yi(xeWP*{N?!8_)X#d#PKgJ(~FV!u)#mEHvJx;PrDgltINq;dA#
zaSGO$ge!do^lU6h5RK|IL7)4RGVZKBiuwwCm+#iX;8nqq+&fNL%F(0<ChSV&B;nPz
zK@!!APKxDeI7Pk?;usNEL#lk68w5d}glHf|DS0rQ%P9A;8V8!(C>AJHg6!k8w6i(d
zI3r1xgOZ*vd=0)F#6J5dCo%#y;dDuEL at Gbj-N{K;$<)*`d at pvQjG}zsXTeAwW|I#h
zl86z%bum(JVi!ydweAD|wiQg{Q7OptNU4BzL%4$VHALuxohV$2<>Yn-;u^vWVJgNc
z;6fspFwBmjU;!8{z7w7*jO4$Oc2_`3#aML(L_`HB7)Ip08bUZb`WglL at a|58P7NSM
z5V<GMdlQ5HZif|bAbr`+jbv~;Q9u%|@eLmBlsZ1t9F)A6_2&eQIDpCq2Rp7Jv#DOx
zGcef7fzjzfR_*}cJ2Rer3T#_ioVJG+C3j{Kk5-lx^PHKK&p{dA1x3_V_o-*`N2N&p
z^V;JsM%Ey}c?QJKck_Xs4|igt at _L6Wds2J!w`cKs4}8q}f_E2y#Kuo;!%RCITL)GX
zK=gn<0+BG$g%S-VB35!2-jQms098{32=vZ%#xsiKuD29nc~ziD?m`-6!(R$p4k?1&
zlA?<+^bo3<qmDoN!woe_1;^s=8ydy-+px}$ma>2416MbS_B~$q6<*Gd!QvqxMTRar
zAiW2N!e+o&bz)v&1b8XOv&Uahoh9*<K(|Dq*vC)B{(}X0=w``_CUs&hQQ(qh-f}F4
zJJEjS1D+BBh at gzDM2vU8F!Ky-)M%NghZxCwos_5&R*a8?HT~q1HHk;q+fFJI9(Fv%
zUa#|oKR2zqZ2cC at qB-K_kqTV6R03)}{@e2*BrSL~nRx+US^pcJex%b%sswNHR<~lE
z$SwN!$NxXNF!Gy(klrXKKtH=s>kz!0)RbN;KBLiN3+|4Z6m?eECmhg{IOWN8Qn7g<
zuWu{ELW>NoeM0nAMADaRj#&7ztBs=%#YL_^0d|N^nEaY*bpoK|=Rmz9LYECD0lE>E
z8;`A_T#_UeP at 5e@!t506YzY|wsX1@~czWzhiz-h)CgVT<^K-!GUuuH#E4%;gkJta#
zzx}^|{LhWUVfcUV#{ajw at p~!za?hw(oG06B`MYWxxc%Au=TrkFJ9qFaf1B2evS~Qg
zZ=JXD(%k+5?c7gNf&M#(pNA=FD*EqzLbFzJqeIKb5jxS9A@$+dd)31|3$8;0)8ik9
zKUx(;ejIlnACyp1Qlh at b_zexm|K;aB=f&&NXcYc0KddW{UF1Vw=YRR}e!X at WZ~I?<
zEa)Xm at BNq0!LMkS^F3$$FQ3D}a8sdu<>mkKG5D4Enz;63|K)S=E9z3kA*#QBWl at BK
zB^whXoeI$9wGoqc>&*XsKdr3;tNwX|D2D%BQ5hI^Q>0^k=SP|{w=S6+{pXF$bVWJ;
zzA`cR at 103gOmF1o<yFpKfaZ%1dcK^YFv<n?%7z;It8k#JCZW;h*}S{0t*!O$Evx>y
z#B32oB?}c at dF~T$DEBH^2V$F2aBQOh70z9HA;GwLvp>#?s(ksspGV&8Ec!|}i<zz5
zz#$iW`}XZ~#e308i-Sa)pOtdsVx^jtaU)j at 9JYA;_dZYj!duRuplk?Lpj<+f0Oeaj
zCGH0R>@mAH<-4k^9^h6|^7EeDE`F-0Z5`gMuNrk(Ln!J2{6z7xmC)amo0*$SXTSFM
z1wNM;xVhh!&N9Rb{=I3%X&AcG!a(_3{~Vt#7Vf$mNX1kC&o6+x;yy^b)+2kl9h<#X
zk at 8V~L6lb_KO`bSe%-8u7R|r!DQ9xp$N&AsEDxoJfwJ_tDRt at a`ESR+R5^C69NjXG
z6V|ZAY`K6-;#Wf}o(~SQ1Yksx at ceDD$1m?ndT{Y(#~+|N4r&X+GIpHDXl7G<QKAMb
zn8(g1xw#`)=awreS at i0%aB+*%W^mk0%Q-Ghh5He^1A}gKb-Ocmnw>u{;<yE$|7R67
zbs`!csk|_?0?uAY+8Hj|+iUK}!?0wj5aro7#i$a9?&ue-&&{|QZrYm~d-?m1ZKOP-
z)p$m#R}THN8U)&b{Yxz!Q&)cneaI=*gSZ!dJ_{@HDfQ*A$mionv;04MM`anTV5_yZ
z;<vHerWkR9)VGo^PWfT&`p<4zm7J0i(2}d4Npl4M=Kbfacsx*xmai=TEaDHheOs3O
zy}j?RK&@m-T-?tCE6H7aLr?ioY(A4>d~M2)_}{gPPf6a4Rz8S;w1zhS^QjgG{->>R
zJB|I{*ZlL+fB$dI|9LCZ|DU(=|KH<N7Fi^kMm%el10VDO_QWM6HT$*;#p3%IQ4XMY
zaxxf%LIcYr*m^u>HyFv)7sl{eFHnA+s0;i90u;`j69S0 at 2X`;nL_L5nJVs(Dg>2cQ
zJ|<DOT7f>H)|zZ#mz7WL$qi4Y%U})vhF)+6R at O9$P#C?v!48m*Q(N*l2}~<GI at +c}
zTiMBJHv*r$%r<$CVAvhLZf<4;wu3c#EhuOm`Yl5Nv^{2zp<PKrU{nkyf^qKN%><;A
z#mwBCfraG;JnUcy`R2!u#kZT^m6k4ptH|$(3AnrFwPc?v^|(|n8O>Yx+fa+6NAvcR
zckh&l0Ywi3GxI70J0>ArdKf8QymZO;(IY+p(+#2NTbjb&)04QVxd}drUC?SvI`z_{
zJ^VWEndQJFXq`jgPij$^pvryM8^{e*Zq54j$|@>ruu(5!JOdOSE8rfY_v0`jv{CuN
zes(i74nD=j#n%Hu>XC70W4a1DK0U9<xJ}U#B`&%xkE3eAtUq>S?!H*)E%pKL5B%P8
znA}TMvudxX at aSkis5G|k+C`5^XlvH4RnXVhk2bzwYa0ai-~l)s>!u7=41-v;Ze7<x
zWF at fwY`fOIB#NM+r at GE|_m=fANcM-~`~lMIix`A0$;-N>X&vIu(?C4m0|%%u#snUa
zp6xaAOCPn3YwPMZ!hP-_D(~ayzJhzgHng8=@5*-l`t%q_MGg<keYO5B8Jha&J9h#B
zkeNUpEa@`FWAw^B_U9L(c7Pv^S6CPwgiV2{o_4Y{P$4+_9ooL;dV=#B?hkISX8U&v
zq3(WLvM at it3l4hBi~`%m#2Daa^$rKX#mW9t?<aTGmzPtMVgOL-HI$cCIT}|PS1yD5
zLj}Nndl(bN$z9!ogC}RG1Y_HQO;Mo-D-_2{Rlady at zuFacwlc~-TAw_lF>S^<=jXT
zbb~XvP{%kfUfxwOxI at Lr42zuDlrJ#<hS|z0Yv}Mo!_prjgYSYfo0J`Hxl8{74<8 at V
zxWMU at 8b0C?nPwesFrZL^mFFm&9FmCTx>ayc&|6sN(r?^ISu%5%6AmRQz{I7!qvIMV
zfTSy<ojF#?aS|!EXrN*O)#-y-pm6l*?llzAN?rp)9>NqPsodl){J_Y at 7L1COj1h;s
z#`~!OVIiU88M<P*KqTQRE`atAhg*E<p&as|5RtUwbt<Z=5q2eD4-Sy2K&|l+_vNlW
zb`-Jv1v(6$?0d`rs1EVpJgLNvQ~;~s5a7~X=e}mi$i}`qS<azUju!0|(B5$@k`drA
zcTB&na=Lt%N2SP#4A!jp1bG1BWf1$=!}43kbI~w=VH5vxDgcmWxGl%weD4%L-C4E{
zRVFodG|_;6#uUwFaSLLS56fqHrxy5WX at VnkGLDRk3x?eaL0_N4$m&Vxh4be_;TUcL
z^6}8ZT#$OY5mnY1&ecupewZ2`kY)3<IFB_((8n8|b2BsT0CNO)Xq5w_8ikaBsEO9l
z(7eGPEn5rn^7dfe(SWP393Q}9fPRG)wlr(;3#Ogg>iOn7%TCTUvWk_#_b*Gt>`u?d
z9?j!tNFV|Y*nz~R`OZZn*vrH7UQDfK{o1vqsA7TPYHPMhKZ3za0BUJ-K-$#JH_j}m
zxUhNl#vV|LT0!QEQMq5i5b!kiBiazB65L=F2D09pPJ5RG&f^VO(gu$zy|J;MYNohw
zMNB1F1t7dkek;}WLrDy;=Eu}Juz77tt{wqmQ90>$4vOE<P<G5ZQU}njvm{J>kbM07
zKFp`_kKl%GDkdI~dFGasQCV~QF^u*kPZC6t=UBI59=OV(4{|4p$}v*fFn_uM at _$21
zm&N%)6FWO$gZt<#Kl)HZz#JihdH0qO?w(4N{F7tbx;c9alSeARQZ+8lIFx;@z``hp
zM^}&46n<xOSnHNpuyM|t23zVuKK>ExN=1m*nFeBBdEUNzcO9Y~6IKHE2PBrOV2X6F
z2U1A`(UCT|mPPG>y~_6<Gz03V!X=73z7{>Q>pOcwyDbAJmn)c5a~9}|&a9qW-rq5^
z-4W9pKK}`JcXw|H<w<X7IN5;;e$$6&;q;hzR``i^U<Gi5dSYhyy&=fk$q{pEUP=5+
z|3d$g_~ifcWc$B7jZa$Ii-1<;)CL0v24d#gTN4i(`(5yh;1UrzMi;N$l<ko$6DmIu
zgnEPja4>}M+Ud+57^+=bU42w^MX0CzoxOH~#E5q&?0`~wBMqX*br^V=oIRU1UGsAx
z2^6d%`np><Zm596a#;A`Aik>=!yAu7$fzf0pr)o~ir7NqF7=^uz&E_R+ky*jD>;k7
z#4fKX7<26z&Ye4FQGEqdEcGO`rf&D|5g}uDr_C%ac}bLzteO8aZdn~!-)ZC=!Xa;z
zJ-+?veCaH<x9d{#&2de9441I*(V;N0ir`E03Kki<?Txp-REV;gR=2ZHF{ZL}j{U0z
zh?;~|WCx%w7EEcMTx`yTyEEXq`EcSyme at l~v_<0&YA+pN-MV$BJK)?v4c*5WM{%*Q
zj<>kzvQ~6j)4G+{_N>^SW%PRko>wQHSGi2-0v0?n1m=@}njuz-p=W01CF2lthuRq1
z*RPsuTx!?VF41KXt9A?+=jY#!I9 at aA856wYdCAo|Z4h-Yj6AnNV`O)HlA$Rqs$%qp
zhaOTjDk at RqS444Z57t4b<RRco2yZvDv9oI?t1!TXd1Yl~B_iCa`|_TlETTs3B;euv
zcsM78BZ(Y*kT;sZdiJyR?m`#o95OZb$@vq6ZNu!uw at 5sY3cxCn9yty@2S*rM$8ftz
zwgHo^PZ#B3F#v>b8OYr8#|yFu-cANk6m-dYF0$e5dxsEh*=l8DBS^;B!DgL~IGEX$
zM9D$h0?STrm<mQO01`~X7ta|SkTozcKpv#&H1{}8eBVA|+$}VhI4JScHtyLo2_Sai
z5fR)~i{Ov^kOKXhnat16&*{EW15=)+g_MfAIxW!(F$>ViWG>mHbMb8V at bLLv3ozXk
z-<H8z^w#6L0}k_ANMT_Lac0&KwE;XHURPGGMRZ&Eot2xbgnSNi6#A`OgJ93sj+0Jr
z%l5&x5)OEiVKj>@NZjo%B4?aE`s;D(e};#|Jdik6IgO;+*Nu(L(DNxnqo;|H7`J0%
zxpwTJ#`AfH1_N^NLDS_l&9H4-DB37G;a_5n)|_t_d?(&T4XmQFrFJkW##&tE-++o&
z5oF6U at FIGyue`lipvnn^$5|rI at vMRZVu^e+D#{1noX$KP;+Rf!lE)5T0Lm)q(7guF
zUb&SvEo at De@q#g1RfORck(4m9r10H*i;HD(br!8wSFT863}hHqlx5!^a>J1BL4}M?
z7qW2RBfDKnY71mB{>V^)1xpNBp_!TkdF>krTgkCrHLA^2G0X5%z@{dPFR`fdtM>6C
zc)^mRPQ64Avh at 9?Kwt?==z|++akfoAQ~SBY&%i90RzCo2c|9}J?qLNnZC3d9khsG(
z&;B}%0i{03Le>JGWkLgtPj7Fp5XS&Yt2ZbYeUX0|qOvr3QIUn#-_%odP-R9AG=}8N
zR(GMNcnxG8RZgD7dzK89&p7>3d(DOon~X|4gozV8UU;n?USu7%@P~Qwn{Nl5`OHI4
z6B84^9#?ISU%!66fz*MivKLm!-590)g>}!CkX<mBQWn?xbtQz+2P>p<Y{(HAvMI>o
z!VeKqQ9OtZB46~V)?lm?6YS}P>mNmB!>*o&%rM}c_T+FmtDFzX$Kw|?YR5RRUN#|}
zN}H;P*;&4KkyG5+uv94q2S#$%nS`K)m4B)+q+*wZMAfd6yLa!l!w8Oe#QBGX)r`G5
zp{3<RT82Op27P{JrBT|_B2`}l&kW5s7>KjO<|!PfugAZU7dN;z0MXX<d-qQJjXZ!&
z)Eo2x5obj8u$Z_wArhfCW7 at pQg$wb+a_nqu6MIFtT(S|UY^e+1x|Yg+WjRh)0fXIg
z=5KS*arXT=jn!a^wvIO_cYNW5Y+<{ERY6W`AIKNi;=(^p)ign`!|dAAT;Y)?5^6aa
zc8Q^0CPp&sy7)M{nKiPqvffX*aOGW}1EMa$ei at bu#$+I57PJi=c&>UMHY1V_ek(k&
zdAD_Vdw>6(v-!|nt%J8?_*~M5P5*?uvnv(okxCpz4-hjr)!B|Vv|m80cqcHx;XKkh
zyqF&S%#p*6aFg`|vYmjMq0p!dohmFOlSSqn-BGYa=ngM0Di|Dc>r_;QK(LDBHu>du
zWYg$?7sLMcMymB1W{A<J<j~6W8z+G|tT-ZeF6bH<khC`yeTz at RcyHj8f?@4C_=8>3
zPOtu5hzGxEAp<^d%SoH$^d6Kz;6rF&H|?97n~VGpqFqy at aJ`6uemi?GCh+Ra!%<H(
zz;xh2Q;#=4d<6Q3OmRA9U}D0FbS6_PF%E902O-~wvd|A7&<PPK<HEkF$w_6Tiaf?}
zr42(geAC!?Dmxh7MjYa*g>KU#;5c^L#7kIhz-hh#D;6u88jtFv(DszDFV8(?Tqo9m
z{^Wzp*DjYa3wXIGPq3ja0&X5#G590V4sJ3EK--Sv;p>f|)N04mN2*P4hZ2c>`SRsF
z#`|DLhcWK7Q&Ur^`gwvdi?FDSJOwQ-@;|z8RL)6XmXOv;!btE~E0U)UEa$^A#aE^V
zS+Q%qaVckJzu|H_AnK5^V_h(cxqB$-8iG9R3~z#mE at nF+P`(?RWEIADu35Kk?)M0S
zMkyQ>%ar=XqerVev(Iprdt8@^h>V1uo*t>Xg2PMH6gUeZwqJ>f7^kAm%gf44!9-z>
zLSeUVhwSRrt7~15sLK+M!f1$8pdsiLvBf;R)YC8b;=0Jzs`PkKShybsuYTBBn^3F0
zug&i2?96ibsfre+Qx2z|z{aK>r#X(r<DpX;vlXt_M4D(F!X~d@#`al_?bG_)emgbo
z=HDG{81+%8Z?9{Io*J+Cc;gqXD7u2c$CIs@^X;r6{Yq at fZEzE+zyr>ixPz*fv=9`^
zIiJrm77j7jTQEQU&Z&m?Q&Pf5K$~1LGBV$#y^d5Xr@{mI*i{SESgb~l_u}Gq!O;($
z at +(nXSJ`VT&}X5RMl%Wn^s*|`E_n9ukh|BSNs5hQ=RRF|t!)(?t`CRjUAaG`2V1Tx
zLvXX4$;<`Ut^3 at 0=ni)U(#B0-2e&hc7)pNcdiml74T_&YHu?0$xsZNrsde!FA~Av4
zShEN9rXmg>UirINif8&-ultd?eu(FzNUME-=viF3 at 9N^RcJ&4}l1Jpkbs?fFA`j%5
zp2p#clZ4qaqitdYQ(JnkV&=y>92G;>eOoZ=ySw1wGe@}y at hc%}ZRE|M at lpE)GJYdm
zMxUsPD7>F3X~oHSvWk}_t&P>iPC0+D7ui+sf(V9d4(Yl?WCzRptFO}8Rco2i#X{2P
zeP1=gr*PcR>MTFskb3je;}Z_`HhFIlGkowyXC&{>P9Gd%{#F2G{cxZaY-*z}xjVx6
z^#NR(A}Va)W2*2)w3j1;#Ugmmic7ckix1F$WeH~_LGvN=x9OqQnBjZ-;E3&m7Pg(U
z(*fvoT!U7c*eQlaqtbf|{lWG^>BbpB{BOU0!c*nMxD~F%r436)rGy^sn_5S+Nr)c}
z1qZJz%;sgp0s_p!xlKFbf5y@>rT5a_?HL>bVO?|!;wu<#2DB8r?Sq at c_QL9>rcF4?
z%TUg at _w}W{AI;3j*mdQ%3Cf{FU<460Xz*Ao1 at 9C9L(1Y7WhjX;)5QzRq8%}L2HjKH
z2*w1;KtdI`t+lLd6`I8rkPIrfqVOGsE`#6IJ<s>XjU*^?`ko}3nwxu*0Y%TRjB+Dn
zMrK}cXF;+_W-rT3*GY36aY1n2B~d?g9}SkKh|Yq%AHb_mlkwe}FEI*FXea&gPorC6
zvXRGi0#CArgv;6hz!wSLWX#J*A=FL*PfHf{8_u6O<A=I_Es*6Vw;jM%6N9tP9B at Dt
zM^AWln}TQ0-r~Tp|Miiz0otnUuDh|ZroY=u*U-@&hTMi(I at AzL*&7^q2T-O&GB$z~
zBj?iXmwN%?Lfy?<5rOac7Vl;$y-C1(^7_Z at GY6C`zLG%zYp!$JJU#Jf0~&<<&^^MB
zX9{GA60%FicB5AA(v9wZ<9LKU?y$n^m(mR|*ixNZXY=Jr2vRd*;*`_Y{NdwAS`g?8
z*4F%3!F+$>qN14KnX&!*t-i^S$?YGi2tur`b at AdZxrK=nm7$m_$3jNK25%Nq6lL5E
zNvb{Uy9jvD)YOzXgsi(4<-A|PNv(+3SXK;7^TL5FICUc=SXWn<08TRyJS(+gGLaYD
z$BV7%Za at +80GSoB&+VR??&$+tVS4`j{Ur0REiGo4GzLATyw_#VBGx at NOehO(cYTYJ
z#!=AQ{OnOGzIor{g$?iDW9XQYcLI9R)<AY}N`PTmQMu(Q(hBjrU7=E52~#+hqeTBw
zHFUgf4oV5=t9UeDBABAv%8NLwUeF_Oa!%l$6%qA_`)J{H)|{KGd<bpFXM;_M&IFc&
zol8 at zn4=lSUPg4KAuO6<86xeCS-6eEM)JyUPT&;+Eqmc2+8lOx%(R$uKv#m3TU;G}
zIlx-{Qj4)f3E+lYb~0i+>d4>I(=lu}HZPw_m#D}Vs`TxNShU}^YT0Y#rn{^^b5 at F(
zqet^1^j=J&MuxStxW!))z;W|9U7mbL){8>s<nDvo*&a$Rtl+wCR>FE$uBG5Y7?9K2
zd{l)bE8vI8)elDu`q_*y7e2pZ1S)>o^X*SHfG5pBatnkwq5eJ~K|<d|sqTlCKoLiH
z-RTr-%-WN5n-YTAY50J-p1wY at Te&hjAwbA4)NY0&kq(D#n5S{}b`-REoDjH~iv)ut
zp@~zl0&tjgX2wR6-Me at 1nl)<<K%S=53K+N+{!GLMua@>YrwP^?+Wzvb at 7}t_3=80E
zunjs{i$PgRN-nW!jkLjyh~ynG4z>}6V*wIxC^uGM)mZO_PKG1PrctmMofi<`24l1h
zGeGJ<_9V=p#$8HEUBKZk3CBCLij+9>V$M0rvyhR;jEmH2AkXN4@(BqEF?xpNX*(z9
zfu_b|KVN%X`caApQ5HoBfmB!%2k-=diYT`tIShj?QPtz7z5qHyN|8>Gbf7jL;E4$k
zAJ?h~_6!b9qf)SM7Fs`ET at AtzBNdMmc_eiLCQZY{pP-m?Sq{6$Ndf}kbwDBnlf`L~
z1l|DllX?}{l3=o?ALkmvuI+N_Jzn|gITXC;q`Hn^&q-j1ZLO#$M_ZFMo4RkE`iA@=
z2;22uK1>OZoZ(w&-y>p$O7u6n9v%Q6O0<LG*AH+m(D20f+4XgGyO55MDQ<~&WF<Yb
zqJuRP{)P~>!2tpdw871YLcBV+oG)H{4QbPHOkcYdQ7nO1k%^j*&%A$(rPGOiqm5VX
zjn+cNserGbJY?uw^*hTb+%bcdo`E$Qd8=kCAR<l7BxbHFniFpz1F-k!GfkzBZws|N
zB2w-lf<?a23hYPua_nj^e3BVd5`sL-_4CgKAT>Vnq<ayf<4$BUg2}2J1Batx2*Mv5
zh1BH8j~7qS!}hhrvqZs39RoCj(Nqy6^#e- at B}d}gl!x6U5zQm&qnz<OUr^a5z*wQr
zxf38%5Kf{8;JI9n9kL0>EPEWb5H>zi4RBIEbjS>+9A(+|Thc4lT?wh$j~X1>R=u$>
z23QheE36<6lLKOT`og3 at g^P-ResKx&3!q6E6_}jEEq<olP-2&JS4G%iOsz`2imLD8
z<;yx;H at _l0ea0~1Jadaw(0jTsoimL_9+N5Tnq(m3C}5pp%Y={FM&Z(wdl-uTt^i0$
z2OcU$c%mKqyUDOk6_(~ZvNUxmIadb4tSJ225^ektEQro8aSCu7TJsozNojK3+Kk)w
z<s$V)hS*@_m8S6COLQi2tT{*dX+dhGIyNcq1?gFYdI*$``6~I90xg_qI|A-mTwE(f
zY0N()L>Zx=u2 at +YdO3O^+X$~JHI*vDB>JK{rbOSwTl*SzUHBmbq<tXwmZ<T4-xXxf
zyCJsVGKHba<Z6iqYK$}L!xV4i-_vCUyuKLh9I?u9IDE#SK)q09?05^o;Jh;?gCd5{
zy-?T(wcsuY7n<ehg9t%)Wx8{))1{#nX0m~QlsFk-=n(9>!Omim!WXtExu$j9rFWJw
z+?*v_4}OoDZkQ=?Qe`|0Ibjm|krJJ^Zrxh^%cMkVq!Z_&Suh1a*4};Y>+wmkE;pd+
zZ_vi0G(@*e<~5>FvLg3svYp?N?JSO7kZS;`{9AM~^?kt>JPzkK$Dw}+Y9i$!GKaVC
z)VCBVSzxMKTmkNcSOU#aX=m&{x(YML0^!WwyN at aD7-A*JgGL?uFn|{bPs&4NU|+Xz
zfr|W<kjNW{l1j1Wc`rmlS``T1#}oj0q0}Mhg+V;~Km!_-zh6oU2lwAfk3zs(JPyvr
zO at m1uzm21#<69)UCsiV|ahPxIwuyxM{%d3^k6UgRA=^sKN6<?R_est&;^b(e_4jYE
zG&SXFZo{|H;tCN#$)-u at hRHkE7W#{j;ztB!-%~^K5DP<pj=dLt2))>P`wn;_{y(dV
zkSGUjVrbxN3gds;33^z3E!bUHm8GQ?V~3H`nI=H|QLS|rrY$kS_VdvKQaiHpRnr>y
z@;Vi?v?6GZL|KAAKmhDQOt}uPrWSh at QdLnG2F?LBy@@et_1fqeff(61Md_Vw+&tF7
z&cZkMwA0IAZs!m;ibLJH{^5E+XUeS at +Ca!9gn{jc=SVWfU7yCfIS3LqE`ENM206^`
z0Fs>=&hLoGr73+q6dQ~r7=UcFguNR$?B2e8drC!dsm%47I5{h{!eAAgN+y8_^3*nx
z8PumDk?D)<?>j9psMB+mAXw at hhMh7rvjt>+{fMz(l{!Wg?6PeV(sZ-1;DKT^RgoJv
z=mO!-#n+ORYwgQ|a<)=2mkZO^%8*`CmJeY>PN^u(n%LT|!^jR|-#x^iES`4i+XYOV
zDh!O219QU$mW?UT6H0I37RR|rjw67+RDl_&6!~m4)YQD6J{2WcLgoUj{}Yj%M|fKE
z!<-9a1F8-9H{$u+JQ54MHZ>Eo2G9n5m*#BFA)B9M*lc=u_dPs^x1T;8%j;U<1*6{7
zApo+1JP(%4iVy53Q7P at 9&Gk7zY&WB$A1dDQJPCUTvQ>~Jw~vg3f$1E$bm`<&dcgaW
z7ZKg>CM6|xv#Zl8;09|xI>xT~QlIggo_u0aFo62^JOn>#fcX^*DpdvF-OUo1Yma=d
zKX(CT7qBsH0R{o!!)pQ1DWRjgF;tNnz{d(~0hT-sI1l6W!}t(?5LUgpAYVHW^XuI<
z&8~iG|AAHBLk4$&I^<ANy~vv70Nes_0$ZLX6FFXkEDc6Y8<dYwwG9qo3aCmgE7eK9
z5ye8XM6kxpc|eejCX_E6Br|+#XA*F{3Z`7MDY&(`FYS~<7luOoT_rhWmDH7xlx4zg
z8izxKad6!}P(yHjp#}+CXUh??V8boWj4iaZ2c<s<?Bhe5BM{F}K?vB$Umj)yf0Z#U
zLjuj2=d$|T+_CdOFu|=oOkKb+ev0ep6m~qZkV>4wxso347j-h*Oc^M_GNRIvreO`o
z0TL7#4pja|NlA&3W0CtGEr-c8GK{*>KrdFxs4Hq8#@dn~KNhyE&3$}5G at 8*J1K at K4
z at n4-_+7j)s=OnMr?k4H0ff3m`iAC*Ln~Asf!oC^o9o4OkmLY&ZUSUuMU6(grL;COq
zA8~IqFFqhoxeZTI9;rT2ePvcggW6y at 9-d&b7Ry|tk_8R$wqzVkCx+Ir&LaEhz_6kE
z9cz|@TT9WxCk2od(R(EG<O$sFD=sc+;XAB=L+`MGrRHs#BPs&GEQyFk6AkToN#WPT
zqVVuVjf7^Y?O?G$ipgS2PBEjd3BvBd{Bxa<kdRU<&c^E_ujY=8T|!X4UQn=4@!&z_
zR^XD?2wDSFYO07lbtONMUAvAqGyyKh7!D0AMKVPRzi&sBeGZdTzW4|QYyr=|7YRID
z?TO+GjI72NB?u8Nl8#*DAh}2k^jSw{kxC!(1JnEY$!Td#H^_i#&iapu5KU7OwE1$H
z1~@cMsYEyuJnK_4cHQW&>aDjn-i&*EGVMB|)dNt;Hix-Z{6yNTzqTL9NBF#X%0^_)
z=u_LMIS1R-NWQ at 2^58F$3m|M*$gGY^=}q`DtC0lf9Wzi;T8WWX_S3_sYsb;IcmoKu
z|EoL=a<vvTD;3D0t2Bg@;W*dPPng+9gL=mMP?DxJ%}t)BbrV5*R&aAKU?9v!O0X3M
zqw?d&k5uThF^(k^V+Um))r*pS{uNnV$|HPXo5SxTkn8%lBoDVMEA=so@}WYtfIe2q
z&gHDhk`Yd^Y#hLJOUI5JDMh>NXNWPFPb_Q)mk$u=H3)Ni5I<-l;T93u0H{!E$@c8o
z00fr6ZA9(?)d~>5_Tk}BY(y^Dwb+yh7Zb?|5siqw_d=i0VQAr{LG?VTmxCz5slVaK
z=$keirKA0gJMZnqFdLM<g06-i*q++YHo~}i at cT;^xC)T at o}cpZ1pd`9;CG+lH- at hg
zI8}>L!5Ac3WATKdj{yymOe}^#JJg+hmX&n?NzqAFB at 1_5(a-YaES<1I604%7_7=})
zd!a0JbU^Q at ywJ1zrmAWkvPB<M^zfq&16)%IJ}CYsbE!w(*k8TN2Ug%{6X-|c!_C~7
zW<P_h7Gmgi9`@e+L8Jr^ZXu-k{2#}Ady&SFq$NdZ|CdDNb@$BVs0=Z|uhDD~20K|`
z<-trcATTPS8~NeWBdV&3?(Q;+D0*q*aU8e*`b7;MmPBu?KcuIJ9UO8DM+3%~(7%ie
zSaF at x-5S;37J at nAPL+jj1-S+gE}*3%Wb0~tc3G%eY}cM+?7%ACpa!aab=3{@ioO-W
zQb*wo5hv at m33CM#zs%0en4k}1zL^UFCGz#1WhsYk%FN(@{I#_ef$aTEmQljCzjqGU
zGibgUcpo_}o*y&DNrjT+HKujQ<;LE<`?k7zJq|hrq$Zl!BXnV;2^SM-T+Ed1r_yhc
zg3Y&Q<4p&OA}E}96%CWuUpC391>^6~d%Yz!Dv<v|2RVdo at YV2;>d)3&?}q*+RyDxk
zSbtOc(!xPsIl`Bb`Wo$xqI!}ygE-e*nfc8HZ+w3|jh)VHiA9|Yg2PK9Z<dc}+mp#>
zW at SyJGTX7^(4$ODpoQg6DtARv2JVh5(Z3+!A){|zye!30%4=MY<BrT=9&`Rlwqp79
zJu5!Yqy^l|vuV`gT6 at zTQRXx`X!~ja7Lcr%Fl_*Ts>TK&?!v&Eu(|0Gwe!G~4x+Nq
z#As0Plw at rI#Jh;W>jH%`U!O+P{nhy>eZU10&5-n==)&jE{lV7aU`W}m<U&V)0!=rJ
zeM%MP;#!7d^f*_ at yiw7W2L<M^`{+QE%3JjKD|vEqaWBBqOq|4*dyOg>niB||ED;+%
zheH&vgclrrUKox#nB?Yggyr1$B6$gWnU3#R+yR6*iG?m#;3H`8aMjhlI71Tr@&H`&
zhO_`ltfy1|T=G at QC2L?cU7YCEWRrDe!p2g>^*ovWgSZHOjF|{nP~=b*-BriX%4HZ;
zNbo=er9!!5=d+FPx&7r58T!JKlFaXKk;nCNf`flFRATJ6BXJ^@NC#DpAS*p3eLZpU
z<>MSJ418S&nFE@#uCEa1W-c}^TPVR{`0)KGngxB41N7x$TKr}_cAf4kQL;tlX-|Qy
zQJ|Z+xVo#KAZiE&7Vs-gktka=odNna^X_5bOOo5eU`aQy$`33%g6J%;E<(POGaV$~
zG8pp)p%i$Z at 2Nn45o261`<;VS(GVCA6s>tGo)L-VhJT*mEN{=`X%0e~+F at L!AP-lD
zSpTnowE!RP>WXo3C!HBwu_i?)9lQJufNlAVW8thJhrD6A`T*n(rgl*ao_f3zWgoU&
z5_D1kt8Qdw3KNyzUo9TU=KlF5++ZT0d5&Z4MFBOBxFsOc#8cm%8WvtBPaFtc4m+QK
zz*+=y#ylLSTd>8#ha{sMi^^I3ZqRX@(e)uniJ2Mqh%3?e9=d_&EbwIakz}E!b+oH(
zsg;ywb#Qu<ya>?AGOBOIZY&55gg(MCaS_ds;Be)??0iJMdUX;?_taDAo6t%M6k#<K
z&ij8TM&mI{{PUR8y1+#sOm0dmBJwt_wVFRDMOp)}?S{|<e%_!zn6wKXZ#x1=bjSEP
zJG)x6FS?_Pl_&xRhlV7+Uj{bV0Y0y995XC_17-HSaxvl1N(jPMA;-j~lXhx(boB0y
zftAyw&exuIK(PvQI^I?>{>xWFPQ;g#$U`3G3qM+?cue~CLB`n$Z3{@?gl+X$6AS|6
z9;{Dmi~*N<Qbo}sPFHjnEv35m151+t!A0T}Gz&8BGxV4xK#2I?u!caW?0mblgNMiB
z>{7|nqBN=daOjvLi-vmQ_O}aMrw4Vc{?YO&^}B$yLTrE>q%kytSL?E##FV}C%{a<|
zap&Zt1oc>P7;<IPob9%<v&($%f!wtgSqb!aQr~+p<CYOCoB~7}R2M?bPO#bEm3;B;
z)|lM-4m1Jt{%x8 at TzP@GK}(^Kj6J~r3V(PyIEa(nz-9?Ph%*&?SG=)}d*QJ#sYAPY
z7Zu9!>WRXhn)t(5EkyevbGcQ9WRyz~MLMYU)6Ev1R*3XpEOos$OL8i4cS6)@rO+U<
zbGJNfv|-q?B at j4G2aa#aOZ`m9IG at r^vp}Rkux%uz1kTjTzLaHrPxjvhu~S%hJ?>DI
zMC7}a9nayanI7)Le}Ph!+GyRo{{FoR#!_v8N2?%@xI4&CtPS%QE5xxc2(Jjf2;6qP
zqZIe at ADNv$G7a|4Pqki<8Uh{{X?cAP(^{{CJs8MkhHMTs|EI}UN8}I at tgve_XZ2Rm
z&>TD}=r?cXpY^UF_lacH_y8e&=$$q1m)%)bSz1|nq+t^~d#2(>?yh&P*Itkd|1gKg
z*3s9u7W0LXo-C&VaTJQhhxp14S~1f7JJtk|;;~6NtwCJXk>Q(b)cXq)Z at g&=;m=1#
z#&40}fgw!ObTfK?%!2>Q9$v%*OG{rYufAMfK0eYTdR*XUhe5721JF~Rg2}%6)r1Sh
zgt^LPtT#Wv$b^<uO3o0%LQEpBGk5gp(K3{0%0uu!p<j^Wy)?SzQ7EJWFtmRaK7Vi$
zUOU-NeOiFDs7VGpgkfI4r>4rmjAVwTl7lVByxOb#b%3PO2b^fKlqLTZGFJjYk%W3`
zq%92Ty{eq3pdbx7CUI at dHSatwHQ5WPIdl{%S!^a+1ZN*1GJr0X5J=E$p5$7OZN5{G
zfmIgTJk3 at lZKqVsW)MAg0Y<B|1DQn>s60WuO39uhI`&IX&(=TuX;T6{+G{NGOD*7m
zcLBvQ9Eyo5wT<(rz9-E>_<B(Hc6a4H7jM|6rl;=&55ZfgssRZK#z6-o*DV_-WpgFY
zt%!Aeo%8}>lgk%ydH(O6h@=w-MHy&-_TFCpmTl1Gz^a7*zV||ZMhAs>33z`IiKfob
z8a?h?&!9;_2><YsvNw%@HYwS`7Zqqx$5tsPe$e?!LqOZ!U;xTfMQ-j7{$Qf4nWsq~
zfXtO$hv(eprZT(xhk(CF3e`o-UJ0p>N8v|0V-uYb at d-PN>`iJ2C#y1yf%}^>ce+*s
zMZ;*)5M+)!qhk=ERn9}>ZJ4~+&arLV6S5Wob$C$tq&tLy10bvR<d?_dyvtxqo?30!
zGvj-E{@G%zp#ZtKk?0I<js?FEpPGqC at IS8S{>dJq?Nm`$Kgku+ at q$n}L-s^i1>#r9
z7qxXPG791>n>dBB3tWfiT5~LetbO?*s)E!^<nY|~pIBuapoiXKc_|MO^bmYLsRI8<
zVVjb)00$+5o!k737^cEr$5*Yo|DQ{WLqW=CBklN$7BY(@#VwRgwunO+oe4mNh<Y1R
z3jh40f2B)->~|OXKmNPgbP+&dbeZHFOzZ38Lo~UGQz%W-!u|M1C?UiZAQMi_%ww$p
zIlyCXxV4e>p|Qsw<pyntsR*7fn9P-!aYx1_2T!cM-DD*-^%+}v{me};sNR at 2H#<A#
z>`IMl&2sH^FVsP#3n<ZU)22;di(Diyzx8&99Jm25NJ4XM8dY<JA#XxOc98IZu>_ir
zLh4*ui98P)y}Gk%M~*0<rc at 2^4 at RQ#fh<P<9|TH;b%Y6+*!o2zCuSh?1KDH#r>nd|
zI7^_fdFIKsz>E^}u_GVgxWiZfXHDJ at 30be7Yt3b2oM&^3<}5AgDps<?-noJC#VBF<
z)4TP{@YIJA4RrLOH-U#j<taI>O at Lf#ZSv3*$_Z(eKnsaJa8ODB0io9tgZD(P6@>FN
zFu&~Gy96vx5K8BsNRT!a0bgvZNU(6g{UO#GX2}cSzna0qPpLp>pQ3Uip2&&Lyd|j!
z55N9aO5EZycqzoeu`Oae_#pK$SGXmzFxS!lv?J{vJK*@aAu%5wJDoT<1(U^OpfpFY
zY&iQYH<ygWK+&euOwKgKw2MIXg^J~Hd?0=><pIyyjCO_`3!b09xA2t^JRRW at A%x!U
zS$@7B&U{#w$7NpC*V7~7jR?>7P-tLqukBI5uvrnzQHut3q7Ra(pcVi^H}DqtW~_Wo
z>!K*&v<H>|l9ogWTT;Q?VzzmjbF$M_xDO`g0~uBhtMs at u`|pJsLYr|wT|Kx(%n4mL
zM4*#6MO+(!a0>Epe`uvpvx>;0lnbm^5E`XlK6sfc256;b;{8!KBWN;M>YUfHZ_Be~
z0r!|vPo55ehN9h*g^aqoZ~aB)Re$7v|MY1C%8SD=>2$~)nJ(bxfa1xz6+|(CG04gA
z7gPOveaMmnT1aCGK&Zzk<s`F>IR6&Gcwkqd;}XKHAi}~Lxj9;}P}<Vb$=IVoEtu<&
z)+^ThpLPT#zX61<&2sL~agi|A(ijW+3An-sGtX!O{KxhZ)FhI$uz*esY*_()Pf+c{
zUnn~h^N}A6$gg4edHZjqBo7=DE?8e3qhCo>3Jr1>+YdlXrPvhgw`0#9X3~Cu6-_8Z
z*v8P@*uee<YNy7~XyKyrN<Ne`puQ at whm=~8AQG+oZm=3U703+UVjW at R&YIeMjLm=-
zOj&{ssc5<D-`-g!03?YSi4sd*&26z2po#Ec>MUvZtN<H<lb_+H)Tem)r{g22$4x-^
z3#L at +qP4)p%IZ-)Vva<S>!fP7d5-ZtIYNxd#PExX`DLGT1_xGc^6LE%a8&|fH5dT{
z_rB||5v4=n!GdwlsBG8`Wb^FBf{fY%yt#i1g<gyZw);`U3Y1A(n);>!#F<;b at NwJJ
zoMWDbvdpl=<Mg9yKo1V>mO>~=Z$JRU2|NW2I7%>9fR*ZTT6QTWD1(UR62~E7=`p(}
zuj|a(r}l*`00OYEyTJV<+94LbK`bQsiC$<5V1A?ol`nacA3jV(HSra~3!w_`OAFIM
zhhM)G-Gm+clQ)Bv-+N(Y->GD@<ipKCeBnl=FHy2$N$;3$tI=gOsP>v%?t-wbYGUlg
zZ;O$?%61TbYjPd=1!<^K7azpfWfdBOI%<D~4FO}z&9_#a`9dc@?*;Fn)H at vj24*Je
zHF%$zldS_R{-la>)U-Vz4}*buo8q1)PC<7-0CrGbZ!tZ&VG3O)%n>T+P$7jU*j^}k
z6P?+(z4t(XR?BgS&{1d-NS?a`@Gq!^P=7#hD(~0OW5x&@>9-+D%@PeXZUo|xhY)Nl
zVqc^Ao4AfWBA3xy6M&wPcA#?*ul+rop}-KHv+wyB>x~>Gpapy)ELtRB8>2sE9^rw)
zQ at 3FX*bj3A63Cxyw$vX?<d;E_%S)8(Ht~CGHz6k$U0D6$8f1YCfW{O7aU2I6;62-%
zFep)eXW782!V0WS->b_KGj87DIRh#Z!9~*`U?Z=|`SVYD?VF!Qm;XggSf$L_s?NN7
z^F}de0eZp;Y^}+-U-!W1lQ>FI)(rq#gU%vJQINZfwBcH4xlRoV=z$t_aeSE0wpD_X
zkRfwjZ<ZGh;Q=W96$qy%fhU$$4GRtvaaE?1nW^bDWXDD~-E9oA%~pXJyoN1l^=A(P
z=|QC0qsU at cMOJ!$c^*fq8X~sAQChnfZyqP(vJoQZK=!tp8akl&EP0PoQaUgt;2m^P
zOwxM=G#-adB5^|2kKU*rU5Vq=b8AOb77E-Z`<aOv0(BPiM$4m$ipycB5rPwbI|9P%
zm+?Wc2-W*(5p at E*tw}K_UdhRuEqWlz5z;3#=4eU#`8ULbA#gp4F at I(({O>IjH{VwE
zumU>FvGWtaxveo!U=dyreS0*}k_8lu?@t*EU at jv38yh~V6t#zPE-5F~wj=AlhORQ}
zR`g_uA-*tcS%%?MK at zYAv`_PS_LGlK3h3(T_2t5^4ujy=<qXO{g4lv&alj at Y-|^-b
zy$RwP<XA+(@o4>3kAZ6N8{}u0{b|?;`8FiAJ-vDGUm+3oV?cL>t>F}??L_GMkfz8h
zwE`j|auQ at i{P#)1h?y!W7WQNUn2`D}Q!U>SkPKUuI_}~=rvGyvcUym^0yWN<cf;5B
z0robvOY0yq;|6$uL0ZR1QnGBC0RDpD;xn&Z6+V&eYmV*P0}I-$Gu2!2%zJ0Buqcf<
zZZKY(aB!bWFZ<_+J7_s*-W*KC5J+qpDUTJbhceC(!u?rOE6|fBGpFHitUy2#hmiCi
z#w|v}1yi*GAa^27`h-DcKF9-9ery;<N>WPUKW`O65S)NyrME6+9pJn$^bMn at w|XrS
zPBNIh;T5LI>j7>-cu at dTL)riv#p!=4>zyuJAjC)GBNS(1P%bKur;$PPW6>shdFUl-
zJbyNt9onLi+kl@?r7_y=grg=}%)AkLcHZe|Bi%q57#cWM@*R#V!BbZCU*W5Y!xFuj
zSh~PHaciyq-r6PI9E-JqOak0CbhNbZfY#93B(`DOwg3F-iv%|)|LpE96a9^9z9*v$
z9v&wvbgse at orUP%)f|RrJR_8{k6Og2iVS><kXv(Tb9&a`7)ROIWUyf>{n9 at fuHOfy
z@*Gw at v{O+eTy|uTX;D!TJw1KG`)o7;1S39~ASaCYqJ!H*pmD&9C%R{p9{NzYI^dHu
zuv@<QZ7&W%*wt;pns+_MD~vsaUT7%qR->eQ`pgcCB!_uBdbk8_;GZLlTh3Fp_)HK-
zD^7GJ#Hi=}%$ggHWOjNCf7{Ona_4PH%Hn3oP&7zm#i;viG+GDnjz3-HwbI+SavODt
zUj~Okx-ro}8e?sMP)8OoC=1n_=2pp`ON;QE*(oF}tlUbZ%;33O5*F7e#G;P6(>>CN
z&5-`erVe*K8<Y-QG}i;F(%u8aj#aLSw!6aPjXbW}8*tN+DeoBYro*bbvuL;_?*+K=
zq1(C<oN#X-?5(NfFHlb-%ex87d-e^v|Ioaq%vthWRXuuC8HXn?pA8h2I%69IRZUCu
zgTbAztKk*j{cv~m(VDrJw=NBS)pVGHz=~k%=;<OLY533EP_Fj2<n6?PaBo-+TG@*;
zzfA$loQO8x7%N4|efFIDx{C}`O>|bE|BWr2NThO?2BK*y7wxA8^^gj#K=WYu{I3+S
zA>Elr9Em$Uzv1(&V|O{%kk(4H*N9Y!5r6e#1oTHq5;1Qc2stuN$B77Eeo@@5El6vH
zY&=T>30r0T+7{(kZn~_mpI;}EqQW0FXri at HN#ZCfPZ at z^hE)5&L6lla^9OP$N{1xJ
zzI2Q=CHRG!(FnXxf&rUoP0BlHO{skMn?WSQoR#}DXMcRpsr&MU1ti&PfZSPVQXt3-
z^l^{7xj+R1Hnq%({~bnJ3W4 at Vw1R~=4plVpLY+~zC0+_?=!>&~s2BUD%CO7H#KGSE
z?3JYrHq?KmuXX#-s^UPjzeKv(-R*GIKPbo>Iw(|iye-;jxH>g^V^C*+s6gI02GEA2
zg;>^`<9NcwK9a6vr^3qh!F8fW-*S8R*^S8H=rXnM{xtW2V3hQl!tah;I<EE6+&9Gg
z?L0gy(SP!xX^t~-f|6|Hk{loCKtwA*oeek(gp7(dqqoqtiU~;+5XA&YKCRKHh<sS!
zkBp<^xRcJe%C!WLBB`rK&nNa=WJupH)K+l`3DJV9JAmwwcL{?4QJ+Y<PVfWQP1fDO
zZO)BC22J58K<q0UTS45=0N1`+R-X=O)cc(H2 at j5~f<|5M2zXC$DWouocG%F0zz86P
zw~#;Yj1-<^{-naSZUvX^11YIR`ftVlEjUBERgYqMy+%--h){qe9NZ3U53jv^DNQ8U
zf?n`4QV at l9lK+BP^#RsFzTPe37Hf#;r*H_VA}Mi5FCMZ&!TZYTjh#R^mC-u=85o-(
z1X^P*TSBOTHS0b*vmWu5xkh<R0$KCGsydv+d$Mp6yMeAD?*b{~4QP6b*{5;z5fm3K
zv?4829?H!G=@PCf$u?e~`<p|*|9rbscdsmn{kOnoi2MYqkK{QLAx$yz$ogv*7q0v>
zjGx@$6+8oC3{pljWHYR!i<unE$b*sQuL9+C4Z)3kGy<4~WD`J at tq|hgfc{5tbZ>xq
z%>Uj$Du6z(Iv?EQbz4FX^~f&Fb#!<0kg36>lh<rNbQr?!Fb5|+FfaE1kRR)*5oMFS
zcwmYavT}rfzizSb- at f?(0IYP*KoU;_*pUU=Mj>5&{WCKjt$DV5=s#DdU#UPe_SSPa
zDtu7VSKfHA|6;orzb63K`s(=B8xO7kEXo*3M~iu4jXe(2Lw}lo9s=5=6n`QO(k?rE
zyXWYLYO!Z_gcw=f^XZwNnwk20^4e7MN4HFeAqKAn at fuNqMx}gucJ_P2Bi<-vo5zb{
zYDXU6UaSEdAM^1WObfZh#5A)FN6zNy>v<O77%-kN0!u71Ach;kv}BlLi<Yy#`{RIE
z70;c^7_3lNRo%E at n+!j}g-~QvPgq?5){$cs9w`<AIXo8D%TG0fC}kT$qlDQ?RLuXb
zDg;?((0Ea%_fhq&L&1F_Ier at p3*Y?wcnxV?6kjj|&f^QPqUt_Zahrlx&osW`r0aP#
zc3b3^iH4K?jgjt8w9`)s861nXA$10*HVck{Rb!^coYP~oGY2^!1x^@e{WCL@$}Uia
zg#4M1aTu_BAMCDm;1dFWx**Z{jAEAd=>sT%wFhVP$~-3JC8MjG=S)s31@}bcs9)Nq
zd at S~Z?p_`q9)nm8c at H6=gxb+HJJQ4OE!ToD`#g6AmMD`K=N}l8q;S7kFrzvElAYjZ
ztiFn6KYPYVFfY)~8l)F8G%Tgj#uu)b2cc>8{akRt_yL at 1^@iCRGYxcLVsLBp-T?MH
z3)VAFSZ1xY4{H3iSTr at 7J?dz6MOb|U3Z-7Qyo3YWfe{XTiO=ZLKItB!1CLvZ-d at OZ
z!w0r+BwBuin+K2#DPnv2Amg?AL-d=)&JXR*o$~=!v=(aBoZ_VnRrK1BB`GN_ZKc~Q
z(QpID&Tq62twk<aKWD`kgKcKn_YA!2vldO}Nz_()p8^n3QWvxxJ~BPEM~jvs$iY<r
z>GeET at 0XNZgL3l?^6=P!a}cL7A+QQUklP~_16dC`t^^4v;HNQk4|OO(Kor4>uY!WA
z(UZe!+7vyuQKH61M0R#A{>XVOLzG|A-#_Afp+^Mg!y)~1W;1ffH;^5WKDo6-7kW9-
zyCDgsmm)N1!6UjJ<&x;;IpdQ3x at uGn2Rx_z6l1b5x->|8*e-)Yho3%6&n{0ZXy2M<
zf9>gZx%t$OXc1BFoh#MV*B&`=a^<_n%v%+XtWSL}zUNm;wbLEiO7**%cN0S-GLP+v
z<=GL!$e6qLrvA~qp{PyfW at o)k>3O$o4USy-jOO_hk*9%GA~FlxZ&5EZ9r at u_)9fZ6
zA1g6%zj!)sWWUkW{hrv7`*RpgAh*zaSY8#CgYwWLs0cFA6LfWPJYEC-W5Z(LNplcj
zyjNY<BFWV3*9tl9oHm7nezZq$+N;XXchJq<vqPbJ7FFC?Z1{ywr}&xb!1Kf{c55v1
z?DM^@A1{$w_UC%kM^>gPcLkT{n|e#GNiL at 5>I*zCDMX7{GWs!+Uk<<6Y1f>S(#8r)
z at VWxnvQ1p0b8o->C5VhmTO0bq$!6%qtaY$uSas3+(NTS=DY0J7lZP^cE$8$vde)O^
zq7Cw9B8}o#ez!Zp=R5`Htxmi8{GC5Z?z<LKGhRe#(Rj%L3)K4t%6WAO1kWyHa3<>x
z!4RwXt9wOW4(5=Vz at dM>!g!EOWA3`_IenQjC=uf+h<Qcn)9>HEkCG9!R#rWwPubbo
zM^X1w5TPH!z|{|Xq5tvb at IArL6e#<yYwTA=_HawyKx){2Oh4=T=2%0q+s6@*l#;@G
z=k8r|z=P!7NQV-!)mvSHF&DgKjN?uzDXGw%Z^^*RnW=&jb`-GE77G}aP9{YSkBfzD
zla(R^d8}=0`o|sH`Y{0~5IMn=oAj;S_^!lJyAxwcGQP^ePw~^tJ3cwh?1fuZ5TFtp
zele7e8A(i*P?e9id(*udGQSUL2wJUOeK%TmMV&Yn0JvkqcB}E?Sd2L$EU)TGm%OQM
z1vs_Hkjx|blXsuMs)N|m1$r!!VPZJkk;{f|d^nqjdTBSAMc{G43Q-YNXwl;854sPI
z`^RIl88M#CNK#TFbAriy?rh{tNpfePKeNa5<uWp#6>gyZs3(;nHr>5%-(i@$qBla;
z2=mW+`}+gQ059B|PRy|kB)Y8{kEv&pK;q)X at h2gQza*@dRcC8Uejd;4qD$2#X31cI
z*ylZP5RebCyxsdX*f=zPzjvMEy^9tQ9a|e>cnO)gwrxC{nDS$`<u07$jJP0D%ySq*
zF55}G!|_7~;sQ8AkFb;(K^5R;_-e at ZPbM)aCWDN~T&0Emxo_QvY>k67uJ)hc{eI@%
z)1{;HGZpe8vwvh|Wl{CLBR-aEPb{>+C!YntqR1cTAk6_s>b$+i^roK at bbqb;P?2|F
ziT2&-;gs)=HL~{Ad%m#EgE;w<jZjI;$X*iWIp0O*{~T;usBW7-3QvmB=bka>IUS+Q
zUL&*BkzPu57pG&Txw^TTBfZN;!uS;qpH9xs<r=UCo~hLE*jOVou0B6#B_D)((|oum
zzx8~O{6f9F at MHdMH~!TE^h;KyML$Vz3(X#El at N89FNzL57M7S}V=D9#bOUC$mU9h|
zna3KklMQ0=FA<?<hA)>;Mpw+Yua at r}pZr}*X4%RiQdFRh?E(!fQn@!Q=I_SL%Gf&f
z`t`}`%g3Sqw0eQjlWJo+mMOZ&<o<L|_=>u74MFUi*kg+NuVS(`D#Zw#VjMAoXPew^
zH9M<QQBp`|V~SQ57Q$m)!t*rKv#9Z|g-{FJuUHPpv}o9)rzZA1i3+{MG7YNFf<2p?
zSay08Q=<-u!V0`KX*yvbTwHO_wLi_W5|sIGkE=p0H|5N-Pr?`dn^uJ5G#OeQTe4R*
zk9fX|RPGnJMbdKs5Ax&VM7`~VfoD41!|)ZZ#;QBCVsyifa?z{ipAsev`PiCqR at 8&g
z6qgr8cB76wP^h)ys4>RMSXM1o887Da8ser28$6Mp at s{WBU>)SZTG(S89<krsELN0X
z^vm+Ht^QqMs$1V*zKH62fX?mS56`6qft0AlN#mtGdHMNg7Ds;F8*#UqMZky|jdgX)
zb2xofs66Mel~M8qJTLXX&&yzt{ac$2@|(UO<9RbF3?L1X(jlJn^;WQ#oPcky)okCP
zUtwdVGf6p2->xM#D3*4o#2Bd}XsCg>WiIi0lAf-HdH1F-FquT6Sh9a`P`zYnuEhAJ
zxm=UU;L)-TAJBq(_r=SXY7R!P7KSe9%<rjfvqag!>?xcHlj89%kuq_N1PNTab|ejh
zlYggH6rfni=sNZBhTO!1M57hHid+lRo=caTM%5l~`q8yGU$ays^hbWSHf(C=7X+L8
z0H*cE49P!((?5S at p<DOO!{STd4FXdzAs`R^Qr&S;S`eGRz`UlNMr>!TtyPe^s*&5?
zyhoF_ at y*PN$CU at -+V^<$Njp-f^hkB|f^fJ+96JM-?g9nXe}R$7RdSCUD%dYa at h-($
z-EV$sh|}>b5(LZ2DKdD0SIRBL^i%s68`D>uypGgm;>O24o~#O#ps(P#wKsg-FofK4
zJZ|RZU0fygU}0kA7Wy<EA)(fupFVQ%;6bv=>&dlru=d}zDS0Bd4bSR~QSwMp^oB==
zHC-Czpy4cC*jEhu`aX<<S0U!!5w8{}pFXO&I_%iDo#T(n9ZVK|fq4XVeDZ%PagOav
zksf}&T^0jv`Y^)LB_Q<S(npS;-lK;t;YzHWmU6ukfh}BaG(aO6b04xZSU!=-#CI at z
z;{`@-t7#wKd5avuNAJrNc2^kU1P4nWX1i<Z;j0ZFa9EMPwR*He8s>~=gN2!ht#RK0
z!jo&y?%h$7mulNmK(yV1gMMEdEZx<d=PL#<m`a8CIIn)^B2_1jUFC$SqYuegrYAFn
zJM$oL+BPaOj7L)?rLRo6(!pmn!}S9uI1c*MjAyl)YO5aJY3q`bmacEqF}{aNDTc;Z
zv1IH^V`EC>F)0Dmt^5o9Iwk#=^WpyQsRmG91v&c2bRoOUm5X;^$vcbTe45vvVE`EJ
zpE%jyY1!Fg<82jXago!nri;%4isF^!OPRuc;J(^>kV6%dH7uoB at Gcr;MC=PpsjSB=
z;fP7DX*J;x`GhUB at 75Z1#dO9>@XLN#dw3e7bS4KvohqKeT236NrjXsY=h<czlTejB
zBH{lm7<Ar0OF!!BBFLebi-752HCIaK5e_54d#Ge<M+^a7sgk%rJk3vF-LCy)*mqk(
z^5mWxmSl at h3GyFVPWstid&T-U1gx5l(xQAVk{s-Yas9;W6?AN)VyMkk$z3p*vMuvB
zW>HugtXUM2MV-Mc$Cz>=^GoAZQz1A0aqhBl{aH^}rdv8g=FJXF-&Tu{AO2%9uc>!Q
zAccwQDqw+}=UDx89?<iRJ at 0#XS6uz12l3EG59SWypu9B7vBUrxum8&w84>+aq9&M3
zUL=!wdg2_9#bNj!ud0EoK*|-g&~=e1Oe8vo5iLhPdc-!80SAT{^lcAPvI149Y8=y*
zbTVU#jMKX^VA%#btP3NZEBR0DMa9Pfw`N<)AV at 5_f~$jIOuI0|I1u^uDgM*WHVd*F
zawec1DJNr5$e>}+)31zMw at 5pmi^FKwQR$L#X-aNE(yrtDQ9G>5ZS3clt!Rcbz=p#6
zfCi2d3vbpPiQhi5M%@_j*{&u)CNh~Lc|mJ%{}mXCCn72C9fDDQ8HSoNfP0_}#UY~<
ztznvCYDP`tNPR=Xn5x-9_ at aBTeCQAvqGS7{@K^gZ(7`aYm08|SE!u{$Q&-xrt)>hW
z!HJ#SJ6d@`>Sxpm$}C1;a1|KAl!#Jx<&kGUU$p2(*Ny6Pt2N3*f6p>KhydCZehJd@
z5aI}*q=YASmS*^XCX+gMOKWSFTicuwAcp<eDrCxu+;bfAhs at 2*$&6Tx5oU)fZoh?#
z<3<b2V$$O{qzUerMMGv(i5R03i)`49_!EK>zbE=2F{IF7SqDph;;0TqW>=1ZT+GP!
z9|s=c*sKEljSYOr64wA^T3f?p##9ak<P at L_g4|7#>4cIm2{Mck2I- at rmy5PP)QH~(
zC at -vSuDC78&(AL-=}cmDTNkI=(9jSig$DGv4d9TI6S`Kw=9}S5kbDK+q3=pPF9Qyg
zn`uLmNhWzq4&~P8$ob at mEqYxmTX_M}oa5V`FovFoLW^Q9jn*W(P(6=vTcvjw7Md<7
ztEp9$J{1-g9>spyNAff*Hdop$yZO74I5j at 9vfcZ${C%kHwg0ERbC1e7egFMKgBgUG
zaZJg1k~4)Qa!igDMWtdSDu<HLxnYJ8(jZ1ijiPguN|G8T<xo*7hYkp(RHB2 at VZZKX
zGO>Sa?X~~dYyI}#-)F7wGT*0qp3moV-}iNRU+?REot at Y;CE8%*<>qtX`bkHYPVa}G
z+%G0$kdAb7Uz)!P+tXEk`ZN)^!#f*~K@)R|uZo~+V%ijOkH+5*%QQ#`n{>>7`PE}7
z3zXg0^~$|9r0~#fnJEbuC0orf29=eET&9)wJ;Ba7K<b~2k&Se3FMC5oWMX%8GjzEj
zJ=xS__zZ#*!BxFIb>8NzcMh_q!jy<<iejV*e<GRNdgCICz at m(sjxxQO+%JmwrQ*AN
z)VHtdqHZnIzyDgGwDE|4gq(e09BQ(n{~aAg<AtV4D|-jb%c_h;Y+CldNn at 5tlHrUC
zMc^H^ef(Ngf7QnbJ^ST>V)!CGqt|X^=hWwkVE`>J*9IN*$^&#<8gpFaK=@{u<`LtF
z0Sb3phJ3XAQsNUa2RdMun9NY9T2Pm^rW6GX at 0l|He2B!g at GJu5TEA?*R`;s7tW3=`
zPpH5PBQXy-^?zRO$csySZeNOtNfv|i<f5DQ^xvE^P`dT!iIpwiG9e~+>%yw4D%pr~
zkwq*V8?SU0A^3k@$r|EA+%Ry%n4)6+upVZ>dJi!NujS>lMNGX3N<sKshAeMyh?qvO
ziuuI-S|(4l{LU0-A$G4T5&*^rZjp_42KQik#_^eh|M?V&>oqZhB;Y$Sft*@LEr*s2
zgks{fHkabma?c&a(8Le*ISI}W>k~fgPq3;LLq1wws}qIZctCp-h8Yz`<ru4)=51-N
z*^;cg!pKv*&3B30?)#L^gaIZv!tRF6vFT1 at I(Ink(E34%iN2LzNya5Q;ZOylEFV!W
z;zUFi+di5k^OUJ*k&m`7JUCg5T at -1?Ll8`O841Ok#5DN5p_T})&;WgQ`gvd9K^VwB
zLP}nY>BI}{&!6$n7baFhtTJk`*I4L>c!qD~ZTz|=31$7%)KsU(Igls{nIEwu*Xo9}
zH3(@R&ps()a=UuRrlyMK=|TZLVp9SrguT6ee$99k04nh at e~H|enFeDGh2+0 at xgOP7
z#i;m7((3BESc<^Eg1uC~R>2Rtv3<s4gJWSp*(fOm+`X=@{r3$TkiKSr+wJzU)=%-7
zs>ZmNxt>oxmZB$lKq%VxDj2IZjVV2 at UBwIreT^v_0Oj>H{{B{pBq*0l`2$$$`A0d9
zKXtOm=N~(`iMb^nKh0>kF+=DDCVlh6DG&WUOzHVcWBR+_HdtET5i<o^URwQSWMrOO
zntU|4T543`hINUk5Oe32kUojY+9Giu^|8q{<DW&5VW5*E^6>|M{gpc890G*7wKKq|
zH;7XE^nXsH>tlB6 at gzo_^oByUpGV<oYeLa;|G9JLBFd!{x{Dh+aIo+A!KGrnMa!#K
z=EH}5NfU2R?dY-Wmyp)$6F>VxHD2Y at RMnOrj%l4K+ww6UUBsdI^m_5RYI^LaNu}a9
z)c-sF>8#n=?OaRVdWJg=1OD+2!6Zs_1zofBYxNncY_oLlKX`D|mgzn|oj2uOQ7-*j
zDoq5jH|gMt6zcv`?tjPF!!Cksv*p)kGY&xFddd#0Ai|yhOl*FH at LB_rDvz4~`$W-H
z%zydx8Z0c&r&r28kgD5LzZ&<Jxi4KPQ2f^N-5tfyA`t at Hc73YA*EjtDuzT|F9}%;w
zFapTS_P{DT0tqoRML${cbd&I=$<u2t?k<?Dq$Gw8daM~Nao=01VJ8gxKQHx;%nXsi
zxpqp}f>R<;>&h_en$G&2T7QFoUB4D{t3JK9ej4j4-f~^_*>r?~eLlaR4xj(&Ow917
z*MI)B^--k!=P~{LDE_l0{<9?{TmK)k5;76pT2~c^p$qG5m1AYnZ#tm&4)*rlJ~lB9
zNKrAFa$4bU8Uyz2=@_Lh={Tvv^wS?{`4M~p_lq$+H4cWP*Nh!?voEJ$$t=x)&Taj7
zqB{C3$83LIWh!yi30RoqI7Unb`}+mw55D#N$B$*eqEEa at 03U{o(i^3k6K~`t3vS8%
z>xz8jMe2x8OWoMaY%+f)&FPByajmcVKzh9*oe<wwigc1v56tpEs*^pa^{0~61D}94
zpW2q8c at e^*Tlo&qvq};S4d18EF_Pt-DmHxj)q6`ts3O`h921}dX>ac26SQ;1ClBTN
z9RXDEKBxBTDqntwPbq!7B0(i-RE$V~lp$ESiV<Ta0X=sR9RKs;6L at q4X1W_)%JaLa
zD~r_S)6W7;Upq2Kpx2W=lI07G7K~UY*S__KlAu4)q!Gh!#kjtR^7W{WiG-P$N)qw3
z+rNR2)?fh1Fy at 0sRGdG&!>yC+f~}qY^_U92{IzI%xf9(u%eMzvFDqaW?Icmx%Wd;S
z7tk`QZ_Q*@&rKhhoA{G>;tSjUd?V$_bx*d#qk0rAEzu8NIKn?<_NQxASAIlOF-=+i
zFP>0W71QU)eiz<~k(StfcC9~F*rhxCNW;vqf^rBCVgp&U3F5RmGGI*V$CDC|A3%kU
z+J1@{B>|JTbWy=j&|SO*aZI9<Zz%+hxK$$=c&P22++Iz#YR!DPqZ=Ja6qd81C2eDl
z6PKc*UT!s%c&xAuTz<ys-{&p+2RZ;Ey#Q}*e7uCq-^l1H(%6MZyGq`Dwmlb#?b*j@
zn|4Bs4Wr>l#7Jp<-zM_#IlwUBtrw*weZMZzSumoMdD;KGv_i$u<R4CN(;-8P2`EC3
zVY)YDH-(<LnY~?0it_$FtGD5EtbyOP>yI-DbjLG>(PGbzX{{e5QGmA}y~w+ZL~8Mu
z`$nHO=mT=9lTe+yf4)dWXwadTpIa{Rm{Cry(E3`J{op}QhIE&_e~-4O!5$@vhe_L|
zXvb1GIj52M>FycI&%Ruc?IQDmik3_b at la_c5a_S)#gD7>lDycj+9t^B(6jR|VtTFn
z$I7JKN;yf#scnx(XMM6Zn$<r3erROR&iC{4MMbaI{0@@3XKnZRARr*O%q6O2zaNTw
zx~mJ5&;m5uUhGVYS<_#wg$SVY6Bj$<%Zu#=Zs>;YvTSt`28VG3(HqdoUacre>Gavv
z*rz+>e-GHDR+3JqUwCde_0+Zpwll(>BTLpxw939**oA;$LbJ3oyK at 0b^CD5-)3x7W
z?Fo{UV{M<tF9Nw1(+_WCk6m?HD^||c>s*^f>4&{h-IxavXTtpUk~;0<`So?fTUSh?
z{>YXR8vL?9kbM|Dm~uov*a`b*?(VqmR98tvVVfuBAte5j!A7^e{Rq2sBwO at -n=LwU
z2&=2nutgG}`{kpW%cKo=0dm6<>xKTWW6#dzhF#P*S&Brq_4ObKJUIy^gCCjBe!EQ4
zqs?M?1hO^Zm+6p=w28=F+pWjORD!gdiIHKhLp~&Sn%+Z<w_W+brdO-+=eOwl5cy0?
zHe~e`xZ8;O*k8V*LHN_l^^Z0uS|ai2BK>d5P#o at 15kHy2SWEKa>cu3q?nz=s?ct68
z8nnJ|MWc^Vh5d?_jL9N{TH=D}&{?;lzxwng5=rBK{|xf~x|H`n7yS1I`)`X!wC?|3
zQKEB!uN7|k#F7YR)}Qg++qsGQ8}Bz;&uIGj`z61EAWazFKH@=U=Jz<w<i-y-Z{7?*
zt7+}vfX(v+6w&hPcje_V!{>4pJ2jLjWYA5yFnU_U+Z+1wGKsDkbQ!_xJ&1BkP2G-n
zaKs|qyB~ch=FhuSX*6i59&Y6Vxb&oyu#Yd8-nis)bJNF2_wG_&|5{el7tnqVP}rPa
z+E+5?FEM*qFh;V+yPmqtz|g{z1r27|<9&w5?q(Qi%S(M;(=+*|L7-9%XFAC{jstUX
z|8QFJNT8^Hzfw}D`9!*dqUa;epZ%??Y-|exE>Zs1lC&67YeWQ-k at q~SrBx_NX(@}+
zoo)?_WW8L6l%E)ue53OIA!pIpbi%f0fJz&46|gSHXou0N9eK9*>8}C)ox7=!S-l6L
z(jJ}CPkj?j-TS!yv4aN#y7b58PI+EP0Z)#~>r%yj(kY2J8|WClzWw%oUY;DQpy7C`
zbew|PC*;FbcEg4ZzruJ9lBL2pY>AZClO at wC|2o at r_lM2uW#%j`K;4k0kcXv{pB7)u
z{5KxLtYXv~#yZsY8=!ll$-3cqdvo>n-;5YMf6JIZ2O?Mf&9HCel*ZV$n|aYyT3fxH
z|ES=Qm0CSKjprQgab;VNK|TC_{pz~>%mwq?5AESMbkK?BE at L01rhTPj_G(c|t&LHv
zQmxAS+ys>uU9VnF|NfsR-ulnpMAz13YJE$RIA~lONBPg&R$q7hH`HkTRoV7Z|Axn{
zZ~kBMkxwl?oBk<D)T4v?C_N+SJ*t|}pz!YPTP<~USA^ku(dXdm3Sg);6Pc at d8qum@
z+D&;^?UoU_q*r>Pl}{jO=iqQBIaxyx(M=MrDe8r6*tTlQ1$5MzV3k`p)urjGkagx`
zI&|nT0>LQ83k7NU?m}kipu45b at FSYk!m<b;XsC27Dn&AGtBuW(goNhP;i4~uKY-;t
zFL}}&J-uVj&5b)wPqChb9IDQO1#U32gWkN^D0rt-J{0NYLHMHQci-u}30sCV52{a|
z9v(i>eErXzyN!+jHPi>QyQ}%3g#?#(f#R}r2kvW2C#e<nT{N8WJf{x0Khx^_>1>K+
zO>`<G_C!uHn84yJC#IP5YUjL(j0#fVNGjBt^yfjm^eWpW^Q+}iq5EzSX?767({Lid
z5!6-F!$+?OJB6%a&)&Vy!Kw~IVI;bX+u&yqy0ge|t5YWz6a%-~*&k#u2E>OjYIp|d
zXzQ>B2bVow%AGiWc-ASD&X^euZ+A0_<M;3!A{avu^X1eM#f6}+{X`+qnxV9|FH*jx
z+PM^@d>OQ1CR6uWXKMPw?jU6QV9FNu%mVJ!ub*9k^!5T45-x|(`HxzkKH#*9&G4n+
z?<*^{VIyThm__eE1BU6OB^J}lRo3!ti}-ClN5_WK;l#p06p-tgkA04RUz68s&zbWx
zDk2BmE&Kj(<d*4#scqvNb>|1rZmq4YcU*&09S2d-eD&b9Q80Xwv%IBE%iL+Y=r?E$
z{%9C)A9d}+^DZ=F>Z5RV;kK6$Yoq>I4Vf?{CnrbIQs%XD+&p$*&R%)v0LrJYET3K_
zlJr7R);lea4tw$RVO<t;V;v59&4z<eMVVy-5@%gI^wy at P`zw-LN6$v at s4#~3sF0K6
zcmBL31WyBoNub4%Gpl+BlLKk)5PZYIA5~z7FLt7wLyPxsn8$&Z2glp*+!;XH3uXUT
zdN($EDj!@u;lwstP+0ZFg3n9Ne)RC+AET=AJ)w|zi+|~3ti^*3jSl;kiIE{Jg&=6q
z@?+qey%nibv|*IcV~avdJ6+Xc at 18vtAl)h!KnC|Sm(DN>n3lc#R7EU$1f`7P%>W44
z_Uw9xb?er>bT~*#S$g)+bVaK at 2M%<Fh%}2b{sWMYcU4}{H!YCzo?BugD0VXF(Veci
zasB!wm|^WhlRh(n3S0YHr3X&wez}=8P<#AM6n!rzt7%!urmd^x at n>dcnmKKJ=^Q@~
z!eJ&n$M=m_=roLc_M+Jq5gut7rTMg#jM{M3q4U>Y-=i=X0-b6m&EnDe at +(c8JLMvu
z5lG>v7*D2`K7sxmC#GM|eHA%EP0a|EgzOi$j at WWrCu<;^{zj45kL!GN=}?pyW+1jI
z_3tR_!g;83Jh^(F<Kpd9qYnczG^L?y<4dkmW`^@sA at 3b5ZP^@yZbAta&kX8wHt9BU
zc8RAQmef;cQ#MWUm=%gvN|4YY`e at 7S>%DONf)KO*Be8ZHN2>bIPV&WwB#*gQT6W7z
zsyr>bbB9(dFaCXahtvlm`D6x7<(}L9<nT5a=Lh9f^*D=yOJs{G&&is|V;}2e8u`Kw
zGMf{QhlGq;d}@j|QVbVgTg43>Hf-2yE)I3 at 3%Fg&OyhC$3=F)8PR_yCdSrUp=&;a$
zKviK%L%P=X?a_GTP#I;5Vi;=?bv~h0MO#+WJQ>g0u04|8#WE!=jj7~Ek#&DrQ4tP^
zV-5j!d%w-cn{r1uL-_3c%{SVZ10(z1dVCm&QZVZVMRUg_e#cKt#sccl#;Vw&xpcDX
z0 at b4C570)tzW#`ua1hJjHO2Zz-}2W&0DtJvIYKS3SEkDJ6=y#oSuGE!4#s3x!FRG7
z at JAR{o+hN8eftJr{ZWlHrfYSDj!wquaMrp6;@}RWA83LAAIpRuatZlEhIkqjmOcEd
z(fJ at oHE6=R+X|ycr&?IvOim7_XN}Q)w=(N6<I8EbYG`c4KMiEYnINX)w|0a*qJPBm
z#0k3`Tlz&p>CM{!4rKq*b45s{-ct#{NGRlu1<;w}O6{11(7AJG9ac=2X at t6gI&;&~
z(iUiHYFk(Y(J1B*Q{pwYKQ`=JdHHaz)sii5!4s#`!xw*2QsL4ZN8f`-QO<IvQgom8
z))nXTf`J%ZkpKDfr5GO?$PbS(xfTKes+hij+EtcV28;Zwu^ia*5OXxRhF|R1HI$Ou
zS8N`oN!5M at EtNgFEtI-EM;q!rdh`er;YCXb*5nU*sf)q1cx=<B8;c`|Ufx-bVV^07
zLjC>x0>C2en)JooD&f3&?mj*P at s7d}Ua at +%>$~s27Y>oZF>ztvBB_JrHfL@}$vxlQ
z%K3Xzt<ztkH!TGvHF<L*ja+`9gBDPQ^bBblSjGg9Y?@1|@*OJlHyLT%{LFSp+<v}$
zcTs#*#zGp*vW?Q;zk8>{y%IC}((g+A at XXtCy{YL2ypnK_!kI#>Y`#;Sivl=Asd;Wl
z17gCwDr(m(OnNCp-={e(wlZq=mvp!97g|Y52yx~iFqdP4_x8uQDI!xw4<I-DTrFoY
zvUEJuD6A=sf at 5;zwsFbT{FxwxLIVur at vnGV+rDtq<4c-|4`s5AZPd=wrY&dzv<*(g
zgBIAvV?WCZ5=?}$Fb8f^<)7|C00vQKFap|qqB=JY2!Vs-tPSVbmH}IF-iR72+ZNxO
z2|sQ*9^+k=)glfU{>2Y3Y{~uBV at I~e?_E6n$jw9Y;kYXcXw>hjs_19Ac&^2JUCyIR
z7O|nrxWzzJYt%?x6k+gt8#~ZjE3OBMY9?!Fi<ODAnZTW4p+_pxF1conUD~>_#OzwQ
zk8QZHRp}%2BmBga8C0W#@ICez*oxS4VB|~8Izik*2ThOLX=#&G#nIyfM5|g8eG>Wa
zy_LVKJr#>U!Uhh-REL_7R0nFpx*P=ES+lMir3Z7K84B-<5gy5iFWg at i(h`@}-RUi!
zDi1pH!xi4R&Ga~kR#9^u_dYj`$f{W1)^c9>4UeQaW=wfnEl+j at HzvKvG=$}};6GKw
zYAwV5N-r>Vf=UA=FP<)-=vC=~t70RDFZ$gFIVyTvdIc4b%~e6$v4GHVd(+jMG?X*3
zS=-dq)Yo2rq4m{yGz_{iW64(IkvM#?OzvoR>DDb9mTI|Ub6wGyQvR17C1hU#z0cAj
z5v`ST*K~q8+g)a&*#W|)<Ezqxnb{{Af9PuMb-B;RQlgw&l at o_*BCf3qw?I5lI>Z&#
z)bifgGK`f7>o{?UzlVoM`)bhLOz3)Hz?X)(S at FD&@zSQ at pv$Fe%50WJL?u^BeOy2d
ztJtTCsC?avo5rf^3+F9pTscOuVx%D(_m%mFN5_zHSWXZ4szVMtcNRmN)!Mo9vO$!E
zKhM)(-4AaFp<a`lW&<;ga^4O{*^&n;T)(e_{vB*aHC&RH^@elA>EXPY3k_P>J3oCy
z4|gV1tPD7iTb*{6TudGS_y6RJmoIJ4_r^sc;8QeZ3-PW!8gN}s`47BYwDq{RcNjaj
zgx1vCw{Kr5jYW9W9$#Yf0HIj?^UYNzM^2v(<v+|hBfaGhf4Bp=HiR_`!a^z19Tir@
z&Z<sxFKfPoDnDIXXJ_Y~bvZG^<r))qtcpI;KD4X(Sm(A$oBFqargBF}QP?<>ryln8
zrb;B6GyAYP=XqXogcprvUN{YlngPxA9G|PAW#?Q~)wbZ;d}6{8N=iyO`G*%(#MgRf
zeSFm?N1=9O^T}aTrhG`Nq~A8<1qsXe$e5TIb0F4pT+xl76A=*+i-4~uKyn<NQ>q(b
zs+q}1h0w=+vX?RHHgZNJ?c!c|8Plz{woxC}W7!sGKD)6u^q3gcc#g%<f744w#)4-Q
zVGzFS0~GX%`V()V!2C`h--aXkuV24D2T$%K#_70aGq!r!s#T{J*B2$z6m7&f&P+;X
ziz!2#qoe)FrCOR`7LjelHeE$NBJ*71`w~)zyVdFUk)Bkd at p2iGthx?NM>-*-b}S1B
zLA at qSm{5MI0J>A84LkYAtVOlg)z+)Qn7jBP*6Sp+@!ts<D(o8(>e(PH^9Y*D(p512
zruL9SM}<wcui9XFRW}$h8)NrVn2Qd^cl6sHXxH6W?5l&2bg4ppKz|yK+T`>!I~{sW
zwAeJE`3a!7j~OW;1dgEh>@T_s1J`TfdiN}cqFy-xt3|BNsWixSy2iGwN9|D=WK}k<
z%3wFsD$$$>#pwkwoU3>Gt(25|%a*EnmZnu%O(TNPLvUnNd3`QQha%(Q=tdeOV4N(O
z79~>AM;8eV&9M-ArJg2GI^$`y(cPasO--#DBnR#D#l0g9XLFU+WCz7WkMsk^>`db^
zKcGF+DBeD6c)xcg;pu7E=9R>?4{*~=#~Ni at o~w_h#-uViJZwOK0(nyMo0W_$z(TFg
zY_enIvcC&0X1x#T1})d*Y~T}*5eS7mjv<b6b9dL<w(Zgarao?WWRif4(gv-tg!sSm
zFBcv7o=}6R_r;ZkvFNA6h<7n3^Wn16bHeIi&py6t7nx+~^~CntnJ<uvy+=Jg{jrW@
zX?NfJ&XW at XEk(zbveP4 at SxyD?$MDRTb~eBQ63NL%??M;rgPqN273T^($Q)DMaf(Y}
z#%j?Oy3tF_G=Slo10(Fk^XETqZy at s(!<!aQOtf$DjYT8yi?}=;W(9=gM^c(IK%$=J
zYSZnbVtiK{K8f2AUSCsYY5g{aJ-|2{4`a&0j?#9$Mf4^@0QUYJ at TfOCd3GGuwUz0q
z#-~o7&O(z)gc6hbPrufmYO<K1N9Ht9l_Hap2>sPEP3R>)kKT&mv}|TWppI3HZN6x}
zhqviAG3s4$kyW&Kk at DN5vNL^hZEor(IL9MP7lK5G;k2flYI&8den|;M at 2}IyNn2$J
zT)?5XP%9AImb9zOskngEiT_rE+3?+7d#*6PPkes2gyv>#Rxp2Op>*7<K;7VD=wLoz
z6GpD>*RNj*(;d*@GtXJH>TH9Eoe}$(L7H|#?j!AJN(kxi-)$HDPJ|}h6Hn{tql at ez
zCkW-+ at 3b$qr;XqeJ=LBH+Skq02JC#=j=L`iaVERke?~eQ7jG`MAF at SCsx|cI2`eAO
zz%!$Xnl4Q$*zlXr-HSQi_f;#duB~0<{ukyI&-mM+LrdN5&CJdTBQXCQpov&(CU=`9
z69oDTsAAl>dt>x*Vdv=;Co4{QgAh?>6)oORhV323BRrvEa}G((qowXuB4FoC1dxyP
zys`pi9HI9#Z1`~WDrUlj9$V!#x83LXnAH at jYZ<6x{-{^`?p+3PHKE}eb;Vl%M_jE)
zJW}0_aDGI;I^;n{5mpB~zv4UYak5iOShgGhTQl{+fkYz)w5%q{8EfEbxmGD1-*Je*
z1dzSWN=u8Dzi*ip<SBA;y_ljg<wDPi?(I?KAM!AQU?}-x5;O--7X0wAel%N!kWBRT
zxNR-8^oa(QgU7DCkm#zE0fU~%V^X9&=P!!>Ub~$;A1W_hz1jypS&&G1*Af6^FbK8G
zOXIosM7LX}8HQWp{n_aHj#_DV?kvP_WDr&ipFDYTa80+bzrOI{USgwLyMN2(?5Qb7
zfByNa`1+DyGh3AJX&BNXgB~|9%Y`AJXd=(Gr}^hDXLb7`q^!bHCt4j02}ZPrjeN?t
zA0}6c^AIUk6`32`#(G;G#XvNc!i9bWsm1nEmF;g<MxvbiWE)eo;;PQDgaQzXwCCzB
zF&k`e-`kGhK~ZaNbd2;}cI1{H!JopAAvb(X-Ji)ff7q*Eh9m1O|8;~v^jb at Z0%q0R
zJ0U at OSZ$UIL4F3V3$69zXE%d>yu95juIQO}WCBq%Ht~m?y?aFx#~M|a=RHZgRlf9d
zBsI}j%*qAi85g|t#DuxH at reU}Q$g{8Kzjiwp;@vJU1?+sPAW at Rj_@W46WGUuse6W+
z!}YfZkx4B{Xl{xVc#+h1gA&kI3KU8vV^m|BV}x`yu(eq=vFM|#wS-Zlx(#KJws^4M
zEira`t`Z&vqILhH-VB1>8;;%j`jhyXx#;QZ>(i@!!4M_-MVyoLjRE;Y=-7#O at 7_fi
z_FkyCA}mBG!J#Ly=hahg7-%Ah-D418x-Y4atIr at zsK(ttQF+w3|BE$0fTB|BiHXS}
z!c_|C3)eZZ4g~4F<m5I at Dn3SNMGE~eWNc1~J&Hq at m>L_Ix9(sS>82s>WPGp-zq?@R
z(#ZqAeW$3Tv>YVv7$YYJH8O!C)q)207`p<3 at DkDmvuZlGg8(`wRh%(lPeh>Sv_<a>
ztwX;((SH1Rl-f`sgA!M5g3PTjS$ZboV5QF;g06 at G!IrX;RPCuo;aW-MB6n_t6Cpgg
zqmxrv|B~s+pC^E_H&GA at WQ3Az6j^(5L32~g%zfoz-jEE^-uh0EJEo$vu-Ja<!I1R?
zpFu?QzWthxGZd9$xKVHE{Q36?Q>Ewse04*H-#!$OmJ at H?n6Oet;(q8*jCs1iD9$*(
z+ovBd7&iwFTr#iN#mvAA8Y^{~^CVj>Fa;ndB?Zs5Z{NNh7tDUTGbWzAE9uWl{K7~j
zr3YjBy|WPC4PHAaKDJ19FHervhA?3}=zAYGHO*=77t8fC+jp*p#>p&UZg{BuJruTx
z^qt50GT_9b;h;X*CGnT%Wfv9|74?WqG5oGyzd(NBWL7_`9jma0$9ehoBOgz-K)B|D
zdAiu48#|eytj|pA{BurSMlxb$Y<$&WeJ3<^t~h;+ZnsZJ?Ge?z3{X)~5dmq(VYg2Q
z2M6an)f&yVw at Fv&i14id`tVodrrvh?a*zEC<mQ#d=rJF1)km&Mc13_flk<1p2x%e^
z7g&T|SrR7-_+VLne*T`SYke?4KvTCuuAwV)dWK8B>zvDdc%2=RlAN3zLfoQ!vgUxB
z+l1ii;`_7l4;Rc$EJefci`TDDoTUp;r7SNl$7fE`6Of#{7A~|!^^%p{sP5(9K;EE>
z4ozI`OYe!^BwU!IbF4>yxtG_z01;%xT%S}6s&M1`@7X$s!7xFOtX{JLqfjCVu6ZV-
zztq&!Z;;db67nApCU3fXVRz|`U#~TI;CbTz5- at e;;6vh2Db=wa=ix1!$ii82A<xSQ
z4M~ho>*r~^+}TrA6!w}NCfagoxk_Ocx<POf^swm%+_x62{oM8MAtw4A{(jR~ja1wz
zh=r1Zb`wJ^MogQQ8*+`M3a)-Cqn{3b5k#5qUb)kIW^4;rHX(RR-jys at C0CV&s+u$E
zi_cm-yx`l;yz?uv&&k1L&9_{KCOsiM+(ytL8zmrmWGGndlS~4Oy>jJosC at 0Ii=rmL
zq(n{95ap>0E`CwC>bl-MC6-j{U2W~;fs6k{@as`XG|!8eLw}u9*l*R_${uHhHFg$Y
zfLRo35szGlay at 4>d9ITOYW~SghvYYFj&oPVJfM!l6un24<qzoH+f4m%LuE~k9#>YD
zeaIngip$3*1%w2{>+0)e<oq9AC^$Q$Z6csPCOgc?QZG^|w=@MTUxC0a4^7A=qlXO>
zd=EWbPUraPST%a!*2ftC0{&{DhwkhF5VE at -a$VVM>-8e5CYBcCu!3p0%B!0`WXNoU
zEkuz+dXeX{dGq!N?<I%qi$FYP&DsSl2J)IE+dNwPkDn<hrCxJ%bbP_OlY0eX%RzvT
zk?^jodUEAP#%|SP&V_r2bnen6lUA^@jQ!jbUIt$<dFs52*FQIBU3WbH>zhaeY8ve{
zJEsw)2(%4Xy!8Q-fz3UiZQ{Wqy>)+ceCM-B2Z&M<7qj&NbgMAnf__IkdoVgWlxO}j
zK*SEVlPxX3k(N#!zj36<2=;V;f_lP2*kcbU300A}D^8sF-a9-Nc`AULbC6T=s;6-#
zb&>a?$|OoMx}?7>mIhg4w%eKY{4<s0%-ulLqUgDgTR-Ag?yHoX at RFT;xk}H;UwB(B
zN^PK|X4QmkeLc=uF-3Uuq^qZY|9xe#Z7lZd#S1 at R+PLbGA;{@QwyQ<9W_O0fWx<jq
zK*rnMy at 1;V+N|}*t~dm6^vhg2?JIkU^`-7|jb1s+O5fp@<4-J_%94U`okg?YVaQTr
zS(U9rlebiR at Y$||BMrBsk at 6;EuS2&a>CYp?amy*_JxaTT<vK?0Gjm^OhRfUwF+14u
zs6W)z-O7q8KCl>oSdp5PMj1A&qkp?5Q3Q#6432-vp?0%W#>xU9)UwB8M~_~-CBFI?
z9dYK9{&Gx+tg16PI$+j2YFj)l&)<GqlQ})tMq%@*ga4A%BoYJ3zT2%_0Ez4K)C{YW
z{)3ADNX*bO*3r at N&3P%Ke~4*=dG`9d(M{E7Nh~`KZP#?eySsniLBob6ZH|YNr3=}N
zPT}=Qn=czhG$guX at Wc)pU>94YmD}^Q#<y*{AtY8NSI+E-*%YO!!nx2{wyZ4sj?Ac+
zqF&fe)3y0>L8psl7f)7!XeuECF&ZxF(jrwAl|Xj4#XX;&s3`(Djuz!llCO81RWdQ`
zaUdzs2%Z3fgINfK+cY#2{A^=F1f#7=$l{`%cH5bnC&nw3Jss1i@>EF5oveB4J=^-m
z7iYkhx>uwZ4WisZx=uN=SUv5H*!WCI(I!UPYHfYdF#Y=FGXpj!HWoTJ_q$Ymp^T*v
z*)z87by$&|y?qd1SqU5ujNCZ_gIt?3Jm&}ng<|g_5bF&f9XqZakg>;~O%4_ZMNMPP
z!y#j9W!?IBY$a^9Seexds60j*AUo4?F`F&l%(;UHBa<;Ad`aor#X!bttVLY^!lt#a
zo2c%(;nz2-%aqy>>OFc)enCKU`Vz6=s&sRn9RedAM0b>;(UnV!w;mn2VhPK+jQ*<f
z2PHY-;q*v9 at iW<sHMwiSnc1GIwUV((m+ZR#SLf>3p6F51)xA4JKi+iG($omSqq#pO
zHj?8Yy`&u6=a)B^6ZGv<29q2S$}eXFO3z=eWV(KRFzXcCEk?woIDQc(k^GjOO6yyD
z!!=HAz?4FkWZAUo?b_~`rx!*^Z{m)%DGYS<8zF00wj at nCB8&v?QIyHdO$FETLSDUo
zEsz$e3`w&#Arw`FNgAW6uOZtzK|%ZeTkvRsv-UnjRBlMXn1c$(ij8}o_|MpJxY=ax
z>&ZtchnC`tCRN-}+xz_72glBBC>xL at KwwXlJ@xYR)b;C_+jQ8&W3^u7&CO3%4JifN
zh_+1F6>;=^WwQL_f#0kiqo9xy5>0Vg>TpkK%D=QOha{~Pa3k`gFDfdw6fM6Qj8c|<
zs6u0&S$YVEa>?fvc-Lnl36Avg&kL42fww0o+ at Keu<e}Gt at 2lf$JgKtgcz3vn8;&%f
zv?D#g{qL3xbk-j|eE3b*p>uB_41<8-=*W5sbIMpusqa+w2n&}W6}Bo?jAZF|RKbPX
z(54vU|LW^GZ0r8^YNAdTeIyugCF!S2yYTo+p(GHfzIi+`0n2-y0Msi>)waY`T_*9A
z|K8E~LxG#gc-*`wH^Vvixs;};p)hXEQhjhTQ`&#jGXyYcr}-}3TLtTI>I+EchQ7>W
z5wGA!HmQ5<x~Q}<-%s;<%4qqDr8WmcECnqxCFO!c!BvqE>W>DJ at 2*zm(av0A!*=jI
ze}28Y0ktfY{mrxnCo3~qH_`y>%fu)7ejYa~SK6lpDs;Vka?x;+6>o05{9jxF#proV
z$WgHf3=FL2SxYZC>T+yPOx(8D6t?jh)nI<FsZJ~V)y8l9y9O{ZxVHHI4MLuEFh)8{
zODhMbpHj(mRdU}%r=eLC_256>OpL$G_ByV=iRG%NJG$%qBRgoaT>;Y}uiiS{cgmVC
z0x%Bo3eM);5-_`o0~a?Tr8E~o%1Ob7k8R_92)-vHH;Oswn_X}ii*Qg at B_qT*Y?TT<
zf!AH<sF#mY^NC;+qMUG#D;YsV!XZ_$AmqP?s(IH1FLqLI_C+gOHj3PJziNT%VFchF
z#s7dE>hifAdfI~n7>eGoK%oaN&L;)fFLjI1EQ`o`W0o<yl4GBR9L4IDE(?(|aoWGz
zjffTm=1{wRuDR6=b3-ePD3##9X^rdya<sd&r0O2Qr?fMdT|tDazlpVFD#(>~=H;WQ
z^brk2IhbI2`h4Ni2Q at IQdj&Lt)DlqAqp&UpYUhtaerpEf67^v+n8etR#bDz)9<1po
zwIXDtFOmayLX6?9?d|_p!buWbx#^B8g}RzJ9X78P37QF7-19Vcd*WC&(3@{ojr*{m
za?x?<)@dT$)(?fkQq%qUQ`+(rmo810jY8bp2^^v0uq$z*tO at 86{a;`2<+!-g_}cu5
z!4+hcP#eY%ydN*}wC6th1XvX2dj!`O$~?OH^Ecn4H9L6rM274H!3gXvzx?+p)_;%?
zcb)G!L(qSyeuz>AA*(11i{aLyc23wVSVkmN?385`;_h3o87AubNk5exH at 4RV@v7<m
zV)dvpb)gF`bvQSV8U_NR<8Rb|tg90OUuM-Vjin~Sau3ul7chPCI2Cq*)EB#89AA81
z;6U}lyx?1<zRSyFjF2q=U1a@?=DMXKeE0hyC%|fJsS3OfbjPyO%$vloQevMgP!H7_
z6bM8`q@&;MGyNu-DR6>C0c_s9d0|DsX(g<msF2wbimDF(Ih2vD<~RzoYDyJ<?`-#B
zB1YOy3?y}UrP+iNO5i;J78PN&VQN?DY&JV{Ux<L?WaVD@{*Jo|<lFW%W%pz+b^2m2
ztwEN~l5)9OHF9x+*aU1gVW8(aG%W8yQ%WrX_E|yMb5r(l%jHu<@ejajogR*R1;-eu
zy75k!9VmZb@&Jds&l4>H31LS}BY}OSyv$jIME0m+R5L~LMV&H-S%+Jd+q~Ya=OT7I
zA*rdJ$z>~F0ik0ZzwO!6R8Q6V`Om&m87{Gmbo90_86oo1VuizgXdcZcQ=1S>dC&k2
zF!y%*woW*)NJJSF$qu+*SKIq>z~|AWm4a}+MDzNMXk`eD_L=J41sS4zPJ!-Z7M<A2
zfN3Xdi)4DGK|-mfm*->_mR|6K1P_WF@{)N+5HhmO6 at Xzmu#)b&uK+cqhH{jEb+JuP
zs8LsieveNMLx=?5=fc*(eZ~A5QJN$)yX#KEZ;X)lwRVB;)^lnFoKCy`nykF*^7h4p
zJV)tI&=@^pgeK`yw85cWD2QvZ{KztGoo&+)&V`mzotqfE)JsVdG$gd$zNWRgm#uNS
zlay|lTrRRo_#$!bwjLd9kpt;Fu|!}d4~WjX&aXa?jC*6DeDj5!8>xO;0Jj)z1#d0F
zlIudx8a=>}kcuM}z`=j)w*%e?bv@<Hxl{JXO`)Spaq3h9!FO0(Zzw8MU8*CaX&(_A
z+-=|LqmZ&za at 9wGRvujhbC`X`spdqx!16LwHN;NIVq7E>WLAjr at aQgBMpe_SCCX%a
z%}`}Rvxg)&H`T4 at +g6G^X<f=ea1TT|Hd<RbK;U}J at RN3depqJ#i<nh|v>3{!#B?fG
z$xZ(vaJYeX;eGs!E{-5_E$E#EQ9+uwnq}=Op+QM4wIwWAE08fPnMKT~RcEi)S=K%w
z0W+B9EDmaE_TocoHNR(dR4jb{`~d=iEp##E#>PegnJRC%m#C<=Nw7pn1y=axJOUl-
zm67=EHuwPO%U?`dD@>2EbKN=!Ax~61*TD|-nra(_7-}$qdC`;_xC91{AN+hkF3t5$
z!c(A>5RyG)?B?9dzQBM1+@~N=8aWhc;JQb3TTda(h^_npt+;hDqsZuxui1kffJ)?<
zecY=h*>DR;>D`>fDd_dZDVWc<<^W>7EGe<r{swa;XjUThIX;RFzMQ%l#kaourB*(B
z_N<<A#hb$~6DSfTGxC$^r;Ed8mmlu={r6`<a1`MH5jtgwY0rRu(`wNP&IBERc4o+z
zET!D$6jn6-UCIzK@<tHn!fV$Y75o(<rC*GTD2+$Yl9}Shzs3aHlY at yv#4t(=v}2h1
zY at r^}{DFX@*LUCj!6D6jzGWcu7LSvHX4L~g-FUNRC}&a7>M%`ur8bipFSCLOUd$cX
zFO?4X4T&^z;jyd5ndc8-s at LnK-@W?)BG_5+X|JU2V}B7xju-WflXCBCYjgM|T|^U4
znx%AMFCF at FFIi-sJD6m&Y8VbglicP$gB%1K<K()P|5TRX8?KyY49<nGT at D#w(jBYG
z>?dm*n`Q8_$d5<L%b!`5uDbKBkKna|W#1_%5YrlErtQ2yvsWn8B}<NLJ(fq=xnU>i
z^CFIj7RyfA-zXkwH1_ at -qfUh=^ZUbi5)9VpohK(%f_bi7cN#)gmSSn5b;HMkW<4xw
z(psU|EsU^J{kHuHum98&xB?ZoRuZU9W2}v}^(|YCH at nD-@54Y%Eg>6N0cFM0%gZ9m
zxq0-MF-w?GWzS?yo5s)q5PSvvORTakQnrKOc at g!bKEDVlD2S~vsedlh!{d+`v#9hP
zDo}hxm2x)Dd+L3oanI+Vs_LEFw{<96WL+Cow%Q)9TyV{}3|QuuFeBuEzsoILx-^Fh
z%yNiXlyFm at hh6H>i+xA^Phr%kMH=q17k4h<I-|rup)p2}Eu6aSvRuAXs$<uCfU7~w
z{c-R<30(>sT_QLUd{h<eQBg$}MFTNTIQ5juG8C2W at zg6~^$2c+`4_Yd3cGqcf2jGs
zZ{H1`wjijhJ#9lq$E24uIKF!9=5Ks#dnP*Z(K|O2Tck#4x^xQ}L%1bK1xZFH(1Q%5
znRKoQ!x<_b0Q30dx<|1#=S6*r^1ig()a4L~ZdK=s92hIgG1E&I{Yo6CzgmiX%*r+)
zXNWckhc76?TxfZ*MUTM}Ghh~Eak};=SJYH|V>pt;RUoOt08SIAu81C3Zb5w3wHJIj
z7$FvUSE3-BZrq+LPB1P5qrNl8w!CJGnjv+I(eQM$Tvn*wPPiy{;>fM+gtKi^&BWWn
zPEm?dEg%9j;^8QbBU*zr%z at 3ptsFgdYNNG!#&1xkg2|HXsdn1r4SJ9b?^<vpL6N8D
z*uV!5pc)cP`YqTf*LHMebn_{Z8c})MK>d4%+7602Y#XoHWed`jZ;zNXNl%nTKJj(x
zuK)(V#!_bEjy4`krDQ8E0M=Of6`QL=7BV<XOH0c)r{B2MuADQ&59)eW6vL$Dr>_z`
zhuiC;K;W^B=etk;piU4o_JIMRM<zs>Z76 at kDLboWsiLYna^OI9;n)F4bpM#MZ&v7z
z$)dQ8KlG$Kxm1Nb2>PrmQ`4%byWV;7Bu+iPm2VA{M?{kWs%;C`a$0;eBA=A?!iDN!
zpMV|4r{Jt3=yqYsfih4w5I=C>H7zD((95`6X=&LYi$b(q5Hf3JKWw+L$z*I`I1%gX
zC83Zxd+)tsQ~2zeFCa<@TClo=X74;F&w$(^XmLc&Bca9p%`*-l$`k3tHRp58KljCq
z6!TFzn7t#V_bvioae-&K(4qh+#;;1-b)Z103xSaoMVq<S?;5ULeeV5nVvgW05hlRl
zU+E}Om at GK5{MGvEMX{B%2e3d&oFW`#>Sm`+YyQ{NVz=k6A88R*hNg0MZBGMO2e!;g
zyRp6S8oWd(Oy{7|<iF1)u?WPLh>%1uM`=GGQ*ULCLT?eB3P+Fn;lJ71wzaa3$NXqy
zEJ3R>$7km5kji5r?v_>Z9ptQz`w_*8$7w()LwV at OD7o<Xt5+Y;aTE^$MXz7C$&Yt;
zpT0Avlj6JQ0QVV4_k<n|u!4Kyi^9(Rl2S%rm<TfS+ft~6x+F~EQH;+zgO*c&)NGdN
znbanT(k!M}7f!rdx~;YK{UL{@{ehJV0L6dDe8V$m3Qjkl15Lq8T|sB~bo20G!_3)I
zk0aL~qI<zBd?U>bg0xKXG92CAUDuMPsZu5*?{~_1R>&a>qOn_e>0P^bi$I2E3s`A7
zf>{cJu#E?=+N?%|Kqsy*{TtKPeGrs<$PYnm8<mneIjiP{Fkoyc^a0zv{1{a?9w0!i
zx#2wzT at W=v4N0XqenA*0fv%D}0kB?itczfJ4_whXoMU6bXvfl2#G3J6%8(e;-X=<!
zCBIXB+SG>(fcYv*NNQ7SEi3#l7uX0!MSgtT;_T>NkYP`&Ib=WIQaD2KbDx at Ipe<{K
z;C>Dla=?8}FY!l at qk`8oQZn(!yKEpdrOp{+Spg+76={DwL6l`d!*iL&z;ROL&1Gb6
zf(Zcs%8y}vMXCa#@5OMww{NYe*k`<&?NcLo2_n!{cw5R-6T?{h)!e(=EM`WqN~TAm
zT$s-b_19lLyb<x?&hb)?o1v@(L!5bNTGq_DKS$SnDS~Mus=8HW_vqQvj|!6!let2e
z0`lhZM|gTVgb at OTj;kR8j?Q=fxJeCp<=&n4cbWQhj3%}`8%0X(hriZVu}gzB4h^Vh
zRPv_$h4t@$3dKyk7TiSJ6^*;PU0#^MHrZ5j(%S94TJ3{nOJ9SoM45Lt#8&JUrQ2->
z+J7G4_q3dAo#+JEzNf-$lQgR)cwc#Y+l^+f!vW-g<wiqhu!yrP5?nO++ke0lu#vN}
znUmBgqi>nmm>_^ex^LnmE#JXyVmH~5b}~#<XUF#IwY9Y?=s*#M6MNFDCUnXrn8vV9
z6$`>`wr|fSj>}?(c7H#`--%LRLo14`zk=d$0Or3-Lp|<GaH{$As2_u7I5jucZqIu?
zh3JX13->4TO_Rj^?~1}%bm-<0>Wr&ebA)<{NWuk<Xcz7v9o_8jBUMh3Mm#h4cek$p
zbvKew&yqPwUU0~u!fwh24VWqdOyKZxd*hj%au<RN0GYt&iSzmPz2B648){F&ke6lL
zF at QBLZ1mv99;cK$<r;<d`d2;zoH at 3Xrg=f$#W^Ve*n(tCnyPb+0Ae1Y|2;@Gg*|SR
z9p(uQ6FCgg#+7{g($U~Sk4x03 at hX#m3oj3{bfLaJ`lfQkHNx#+<R%4Re_vbnCdS1V
z)(6$n$?4%EC|e1LXs-+;e8?oFkkGjIYy|i{fmZ{nsd5OEL3By{Vvx+pEvj+CbM@@g
z=RApLPmB2PhAjv{AYTM&@TQK>3iUK;*RCC<#zQo(%m-_65M3?I$}o>~M*c{!&q?O6
zUrPg7)=8zF@>n3G!~Aib!D0>`<5%^J3aDR_Zr^8a>CW^&Yj%m^0^xNv<nKqD=uLnF
z0Gn(SQr!k(J*fhTqKan}d9*l!lwC&*9y}{7EL%R3c=!^frZ5=Dj~y=?DSFrDLgMp(
z_;97z6y2IDHUn1UuoeO|C}i9y%f8vB#~fX%lo4*Kmv7Wy?Pyvt5Xc*p*$hyQE|-?z
z1H?#r=3|RYiB^V*3#{YjML+yg?il6I*KC>`TG`80Hpq}ia3}&WirW`-(%23j3|4Lg
z>+v3ezfD7<aSvj4dlC>4VlllXh|d!&5gmgk<4!CR9PTR85lbF_hx~PMw4(^pJQN(k
z`>Ly}(^m;xyFgR(K8qa%d#elyfAxfmezbB3a-HDh;K%y=ZIjKlxzNk9{At=}l@`%?
zlN>LakO*ppYY;?zrXv at PR8i3vFlyJX%hlBrPlw|V6bXQdgC<SAX4G at 9<zKFGjl_lv
z03&mt!$CwJ)W~%TUc_t~-LRZ=kObhOx_#98>c9?IKxnvXb7C^uHry#f8RuMx{HN~Y
z$D$8{GoFRK8~|Y7#z~z=QHBMc%@MgCZd#E;3?3{{PA){$n-UWfRZU0_#B~yaRzF;O
z=oajS;+WL|&{Hf(E8Pwr%wm6w?gPq-Ahjv%Wl|d*P!M5%RZZAV%Ng5w|GxCH+zOSI
z-9O7*eO6-l)QwvJ^40R$vQ|5y^%U9`pIiRB^X|{n4DqJx>@RqH;?1W$K6gdpJ;{`>
zK8N^P-t6|%|6?Dy>a&U`_gE)d|A2*-P at NG>-Xt4X&vz}zv3`q**>TO at Q<y%>><5^>
zvux*H3S;@BcV8rQlDUEa2b9i;o--9Wa9bEFJ=!E(6B0a*g?Gb=|8He^UL46^8(L3l
zqw^r1^NVCuAXfQ2tGO;bm~%s=MqDioS6|kGBwBv3DNTAQF2CSFU}2(cp7B??6FH09
z_g}1C&k=C5yvDEHgXI}R8U19f&DO1=*GE9yqRe<z9>G5AS6{TkN>ai_+XNvrl@%>`
zh>IP_FAX+t-aM&{uW_9*{`3A|pOluP)6j50Xyr*p{!ce1ZtlC!wz7CfBI)$!X9l3<
zz5hSDkH28Ah&%t^xba=V_uHnZlFkg1Fd(K<7TSXnNza8ex9AyuPKVNZAuxpEzlDBA
zTD9)I=7KP}Cz7vckMG&wv*^f#g{IA#eFu$Fmzw3aKQ8}p`hz{n5=pynH0R7*-igss
zf4_9wx8-lnx|G-2$1lnEveBz>suilO0}hOzzU5F<c70`+*1zLl$F1el+x%b27a#R?
z+hX^x1KTzs58TzZ8s_ at -XV)<J|HvQC3J$WY{ie<3UT(MKE4TO8))>qaZ)(n6GAC at -
H>RtZ>aFFFU
literal 64557
zcmdSBcRbhs|2L}oR7!)gB_VrdL?}v<P=xGJ_Dojxs3=4tBPA+Pl0^1w*fV=%WMz+J
zWS{%1&+od<xvtxF&iP&E{Bf at H{{Hdp!`u7)dcB^{=i_l-&u5^@rSp4t)9)rBA=!ID
zURITaWP3LW$u=g^t at z2=)!PU0e>;p6&&!f*690Q%^!gDA$q|wZvS-v?V<&rDuGWq8
zZT^}t32do<RmvV#YEgW^$}5 at CsEzlEpRRQ_n^m?I<&~zWZ{w$%yL5TdHB}D?a~+p?
zC9{L#jEVTjQib!<nuB><tfPa}=ik5DtHj$~<8Q at APdMsxhsd$wyYafJW2Qj!?>}d`
zSt7Rl{ih1ai#>n;;k%X8^xt1np61;4_g~LRWa$3=(RM9PeG-zwlZ8b^j~+dWe82S*
znN8!%bL*>1n)$fpt1Ny(Bv(bm?0O4*HjA6CkhtDD<vuSzc7TM$cZ|H6#5ZjHR|V6R
z6pbr*x4`4E=GQZQC5B_%`1J(};@5fk`EBpC)$o(TtK3)KzH-_{Lh`AlWAxw4J-r1V
z|M#`~$p74B<GcU9IDJ)i{QbxOsvkxDcVw=rc6N4pEKZ91Y!vFG*1MIIl=v*q4M)Dk
zGcLSMjL)YO)AslJc<v1zo2xS=%EU-11=d6pze%)gPC9(}u!1H=mKZ|U?XO<H_VDmn
z8f`o~CZodLlB&DZl&Gk!tsV3C)#tsM+C;U5#8;CtT3`!_f%l6SFU;#>DP;6Yyo<co
zR}`Y}sDA!3;NwFkBqpYrjlrC)HcH$>@?&^uw*RZ181X>MFnoVs|H&tO;s685!|%@|
zU2fmG(-1Em|M>CahzOJG*QbB{_%S*<Iy~H(ti~ZJDVfml_{kIZ(Qhx*USBG!sNi5{
zH#0Hm=<4d~>~wQ=&9v+5t*g73s7mLhdQc^$wZFfgnVDHoP;l3-UCGJG+1c5bE?wg1
z=a-U_S{QE?wm)TQX?gA1H9R?wxuL+PPoG9dYhEaP%ErOPWx2XIC3d|#;Qsvrml=aR
zhheMMw^u%zUEIGv^Z}zJ{kq9SW at hFok43+`cYBLG#F&|17?lO#)AurnPWF}fr0Qe^
zOJbI~9w+AU7ZLipj&$SwOj5C7VPSULA{B=F`+wDm^|j!xW)dV_ru8x{8hZ*{$mmNP
zhO523y$`Z0eM=0ldn)GhtBi(*Uyt)mNKA}&ibm?s+L-2a;|i9YE$3uqOJB!((;qkx
z9vOK><thDfE2X%TZncjEhpQtG$|yY%8SBcj*3GsFlm6+vIN6C=pkHwFqDR9=^M;|2
zxKkcF+S*jwkqU`c-MPQS`aIPNZcYuHiuXxOO5)egcdC1G{KAC`%c74 at x@FwIUo$_}
zd~Yv<nVH6<f6CHy4+Eaf^6!yWE9dw3G~Q`7rWuy#x%3vg2_HFfb$w-li;JsE($>Z%
z>C!U^+b$6XhNlD6S7kAYVx+uQ7AD#qdoAtke5Sj_r$Wz%9$p_$N!$1{7&<vQ>A5rc
zazc4!80+~E`YQ=?d%r5W&yO|+(+PWTERW!c7lz^!vuwX-TerQlx3?Gc<j3q&XeJ>E
zmgScS2n^)XNPGO4R(~TOLuOjs<K^iYG^vXlW2p%U2$-Fnt!!<?Wcm6v;mn;K)YN%r
z*Y+_=bmu##Xf=pL at 7#a5aDDN6UXtU at n~U at FHchWCBq~HY)LB?t7dTI}4Go#lU7PIu
z`1*O6dF|sDHHtc~K7Bg99 at n+h=VNDW{WRr|TnK%ZMdM3 at BKNeSMV<P4-90^L&z`+6
zSympxK*sHX=OV8AwsqXs*EhqohPtJ<r{@$u|D_UhD at x4fI^D>Ggal6!K0ezoe!KFb
z6tEsKrB6soj*Oey+NM?%P}9<K7Syy~>nrxcTx@=zoum}AV=sNCWpjCFr?@$tX-$-V
z&h=*$hWBuDyO`VF>syx!ZXr3%RiQvfqN0TXZBH}w!P=><Rbnn(occaoCW#f-mTid%
z at R0fJ+*GmaFC!Wnnkj`C3<aNVHYxL4&9vU6iww-Nm{U9V9nx~$JJFuTBze=u-94ZD
zOH-2rrW at w1i@kmFm6Rx@(?Y_+cHO!5c(<YVvgt_uGns&|_x5|Zx!Lv=7vUkgpPb;)
zd_O<gDJ&tOL)!o2$1$_o$JcxE-8?)-3b(QyKYm<P^kzfcsV!T!V9oA7d~y_v3G;2Z
z>!F{Y-|Zbt(%yxMiKg|DLh0%0uP;42AmfBtq^YO+5YHHI&&_S%k(Bhn6HL)ei;@<#
z?Q+8W!Fm@@yV+<VLP0^{u{6DR&mJWOg`l7ytG?p(@z#{{!L%<{Ws8f8am~Ydjw2%U
zA%!Eq1}pH^x>jD4n9=}>iU*93q}|=!FFii?0uTDZg9rHbxuvC0d`wW#%8bt at 0~J+b
z4gJgTW0p;?Fuqor)v at A^a^A=M$X#Z7r#jLHBY8B3LciYKJAqaIi2b6TzCIrxpFcUO
zLZQ=GQ`vnQ)FB2sx|p~)sq5XjtmhwiZmus;ajSnzc+BLp*4WUX>|LJkJR$0}GT)Y}
zYaK0w at -sP5c3;@M{-o!hSuATzz$>Xb$Bk3zQU23d64jVVT-`=<RN14kpmsCAd-ra-
zw<zWOQmSrFbxE)D=H}vXO|<pq<<XvkrPdTpGCQC7(aXxp%ALK{)#IOTZ7bsw5)xAN
zz9uRxygKwqSyfGq%x)7);M1p1de;=vsVOZCqnckU)8y#%n3|j8HuWzJjgHb%Qohni
zA+wBs@<hU8(Z+V)LK%%Atx$oeU(@>tar*(kn>CN!7sj{m+&MBnH&k`d_NvRTfpcfg
z#8{-IrI)vsS5%1Ebf`pWqT1crxu3d;hn3YBD4>f?AJ<)9UEO3ahZ&lz_PRRj7$(~H
z96Lj1{cM{~)g&dlzZ3P~fdfIm=69E4+LIWZ`3phhcA2869W7z1j}=!7opx{ze)g;f
zPt3`(#JFN#-tJFbT at o|Vi?`pjj;9r`D70x~<v$g(8#m}jPaT%yi;9Xu$!jSZ#4t at w
zO({BZ3VW})iYtCJt1~h-cAj+p@#$7|Bo7(0I(I7uXCdyCCg(@*b@!=i8fobg6t3G6
z-m6nNiQJ?QUnrFYQT23po2(C(hj^_0N$2-!cqTbAJ<ad2yt+DZB0)4FEH*Z_K3>|;
zB+b{Cq|>`Rm`>u7`UwJb8Jsy3xR)gH{>k%lr0HgL^izwO5)v-c-GK)={K$<f9%N-_
z^JlDMRrk7$FlOnbswU%VqJQ5`{*tWzmP;*3DPBsS6d%8~_}$KWqbMLro>eY5*Lfm}
z+z5~IoPlPf8m=nzkhto%pT$AnKV18o)920OXVLVk3Jb!y?|L at AWX{b}<VpY6dn1M8
z3exl;W at s*0<PEj8nc3L}IoEq!`n)tN<Aj(zXFtEWoUkXhW%Mv$U%R2tF6O&?8M3Wf
zxf%PG%<7(C252U$o+C{+sS3wqrg1UQ)%}hk$EwY&j5^41$)^4NGjbyoyX{j=dr3%C
zh)2NbjIzh#m+P~+fe#C6{WXzRLM@}Eqf at -Ov6`P5FKAqjDd|s6M#F#T*wxea6D^CF
zg_GH~-<`%B*8bS%&0P5XvkqNHznc!D5EME1SV>3cN${IPjEuw#?jCw`;Su|pGiSIX
zx%v3&`uh4l8JVFX`D}PH%i>Z(86`zM|J>NNQ(XlW)wCtC0LY-~lowijcb?<@)*Rpf
zfQ~LIiF4y^sZYsS*x1<G8!rP4NdQ~>s=n6Ex$eLdLdByoTD+A_Q1EhGrSR2HzOm*N
zl(N%ZJbt6yc^~&s1}VNz3*-3Vx!7r*A3?05PQfEbj<mZ;NVv}wEe(apM0r2%4Wi;1
zGN>{1{B^FE^_Elr#01apBn<sse}6hvB^#S}<S)_lfq at JR4DRkp<P{eFhzdNGZaDMZ
zu4KJla)y){tHE(&&8<fgC3qo3toK_{QFeOUz`1_Bx at Fh(jIcbhX|E=BPIG;^NJ
za$m4=+gtYP!Xqb3fgAw}naWiE1!G&=Q%<8Q%(Ck0>Lw;8{UL(`0}q&_`Tb~xOyp~#
z_!gd~1LOl5Wu~WxX+DTJAicTvk^D<fPtQYBE;4G~hpR2`v9v$AV=8;D{rQEd((}na
zqV=^hQ&HbA%54=x*P{<kjhIbFbuah+P*qh8YNY_0C7x)L#h=-J2gBgl^Q=@X!oq6T
zHCBE;wG*}L)r;nzGnv>;#r<bxg<d83q2d8Q at _YLjxeF6--q}B8MYFC~=qkw1|9<}H
zKFu_PNX at i845CUNH!}{8w<NPR(DW6!q)qd at nxj8)<43XAYIU?g+7fA^UrtU=uNUK?
zLqmc?=N}vr)H#EZEtdnVP7DhPAyA$_Ifmb%p!th!Z=tx9lmRJobO+^yghttO=XNmz
z{Fwi6J{>}TJe<b<&?)!K*(jp3h-Hopj=olk5sKu#B4qN<poHh24~2~h=l5^B7tUH*
zRz{a`J}@*ibkSs#=E>ra^Ll0I at YMI5R;#QqZt%!s8PWaGq9m?dAxzR6H3B8I)zv!1
zp36XgWOlqcf1GdLoNj&{%72H0gTvg+Y&Y}G$qxG;pSEmM^!hXVf}919VAc#h_Mi-a
zw1k8N{R!h_miXMfyuADO at 83FWne#a0{(b9j&u_hmEcy|YRis$llVjHx7Zc-#KSKLt
zNC9CZVf{P1-|A#pZQHSjbT{$R$+QS7D)KtR_w~z{FJHg<lcOTsdZ2jp at JZJrcCTK&
zqP3RXGxd1;1tlfQ9RiQI{0|(!2rVuy-qkBOYB|WAH$8U6%-C2h-RRs|xi>mlZwpbl
zln7>{z(Ev(A{2rHl#~&1affMXPXJurezN_ae at K}PJf at DLlQ5o-VrU~}K6&aCAd8)A
za)$30hRVSlTU*- at A^owi$VfK751E-Fo}5!h9BMVSb#%G_O!sQ at JE0l5B|JP0W`0^5
z%|pfA&D|a4WAV?g!CSX(ZES3qR!3BQ|5^V`@_V-JL76 at 1-vI3r4{WTht*>1Rd-iM!
zwOo0h&=yI_g3(b6{p?D&^vYpA2gZlDhF&r-`++I<Clrn1 at 6F{o9RXjM{lL5K+`02B
zh!{+E(UtAKs<zb;TrvTF{`>(O<LldjURYgUuaT^ds at USC6{*11kkpA$_&w4Pa at n$R
z=(a!F(@BrTS`pzVclW5EZBKXS8UIiL^{y5F$#W@*d*yOUD~JTS%-V?brl6RZm;q6f
z%4La}`y?&R?wN$MA32Z4yUNv3^u^-UX-Q_;Xny^mf*Ko?bU*T?nZEsd_a2u^Jm=`_
zOeJ&DXJd^`m$x~?RMBk^2w3a}r??Cn+pzUQ5IS;v_XC~%_x3Y+gIAHiG;fHL;{#Xy
z^cY<Axw^2h at KX`XaPk3wm#&29tlPJ54=v_P#Q8mYv{*C#UcX=uzZwU)N~BnQ+$rlP
zbQizY)F>Jp`Doe9ezqK>B#h&lGXN8(WJ}>FzhUu7(5F)pQttB>EpIN%kdl$z2mYli
z05c#-U?vL0bkS1pql$05cx(IFxuZ6kn(cV_G%g*$zy#DF{q=RfwCwrw3<*svnW%&^
z{<~!Yz;2}7=PUog^Nfk<^xd)z#bZBHJwxo+_5LsZ4gy0oJm<ez5ZXp?Kmcdp!GtJY
zZ3n=afyF1suE`M9_e(=V8n}R58gb`Z#GPmI7#6RMHYWI!gI$7^JXzcT%#)Rq+s({=
z at yRRI<RHm+{{CfnEdJ!6Pyl)t6cvRHs+K=yWQ6m$V at QAZ-(#W|Qa3Uh04KT>d*X$$
z2Ll6x+u5YUa$=4 at mE8Wc3{^c^@L)@L`LcNVCvZD at 9bl~O(27EBgY at R)j~^-+&7XBo
zHNj9XC&&TB3RPFmv8HOI;O^ogB3^k^5Xc=cRfZHA!8&yp9^>OZ5Q7Ry*p(h%y?*_D
zqs7ozdw8KfAkww3cgMtRaF-I!<464hf`cQXJw~U#_><*(I&O?6gbsyuNQ2n{zP{+w
zL!tXUJF5kz3)=eDI9jaN^=vQc{{8KCO<%;t#V<aSxI#)nM<;I6aV$hm?cFp+8VFZO
zSy?k#T``)!mDNbCR9Sj`zSm=>r^Lt5qX9ih!fEuzSQFdVoh~<SJeKmxCm#UbxqkgR
zXfIbr&0s|+zLaP4gqF585ct`{!P|i%tU$>>kv#_h at mgJ^l6j|_GYv2!69Bw7-TCo6
zY5&N`YyBNB?_GQ<TBUXmM0a#%CO$0eayP~GzTzJ63jAdjI%{P)z`52(vyeTEat{tA
zSCmO%`HXg?C!F-r;Xl&kpO9dTI`2m=d2^C;+ENYAy=i#&lNe$1YCmg?|4i}f`{^_j
z8yg#3qp^{ZA9=jjqBdql(3LpV7AxoCnrC2BrjLzs&)ugEVGz4S8Ws^D0;sUDzDnaT
z?J6%HP*70Nz0}pzG&d6ObG`L#<Yhv1;S@*Fnl*Z8ZY=G!qV7FKKs|H{%&VPDo>wbB
z;HmYZwVizDUKP$ZJv}Wn(O3r5fO_^F{gn_Qn6290B`c;u>ZzjQ|MlyaUC}~Re0=<a
z)tbqkf*f28aAZ||y{MR&VWI1<AD{0y^IlmisGE)V+2D%K9Ayy^$yAP)0 at ko?PO8HX
zwOx&|C?RIl2!9Z@>G+0jijqttUPjQGLN~{}Oq0ro%&0nT>7r%l&Yyq%>ebNdLyBnD
zRJ}Y02p-hb)G`6!{6JqR00W!9r8f`K(z;@?VF3B`a&LU{-9qRtO^Nrr&zJZ1Zs3y2
zR&0o8Q6 at 8nnkr%0nUR>2vjl;0+t#gd&>#jwrFRp}n1jZb_9bo<D5=O}srW|!7d&ZC
zFRucpvAHUacvn|f^<-5xJK}odPr5l^HKDm%W$E;a<B~!D8O>u)dEA6vu(tgBIDH*j
zt`A6?KN$^B?psI|W at eisK4c>F7fnotKHu4iYJ;!X?)Li8qh@^ja0X?M*Fvi%G^op$
zFV{p15b95%+wUi0c5x{e at v$~Gli+12y(Jz?*Yn)ZkzTX5o|v4}8=?eIkhnRi1ua1N
znFJLzbsNSGfFYDlI7$1XS)LALF~AEa3~^VM4AwzIL73wiG~OGtKR(B{@7=|mnIey-
zrr~<n#MZW_*vn(;LhlNfVX^0#{Z(GcAu@@ob at 9?A7)J1efS at 3EV0>aERZg3knJof4
z@@jo}4ib0nf#*b9Dke?M*P6_VTYUQY>QZSCCFaLldHO~khlgiaxAW(TWiRpp8QojU
z?D+nDb!BCoRt2N-Cdi{llH~ajbbQ=lD8!o=X(mraZL6L6l`SmZ+%infYHDg?zZCnY
zSy|fBk(${LJu>C*D=~2xgyG=9g97^b5!N%0QP5UbSC=qKxx&}cm4_<Bp!aooR7de)
zQnR|aEGa~Cv$3;-TjCbQnVHXge~v<r`S&Y;g7sZ$>VoTo#>Pef<*KTxxe5 at AHq14w
zb4)$_950B7&|t+2BDmDdAfeo+5y<}dvDrSVwzd{@AyxaM+^WDNsL1r#*x2Z()(aW`
zRooPmL0;a;sz)4ijTl*CsG;rUONT*qIwbBOyR_)0t)*33QBkw*HQxqI?U at rwhk}Fe
zo<DpO(n_DtW)aFr{a|dIw2wE2?)mfQjFLAk3?))AeLz=w8X6j)cvfgbfo}k{mA`{3
z?+Lc-HnX&}WSC)cfteBQIIWLa55%fB*M1OFbZ_?$=;(#=B0z0necw at g6fD*t4#Z9v
z6&4l-OO+Y=thbi<Z0glqnKQMvmUJ5Z_U)U>*(48K0Cd3NymS7L-#VeVeEj%vujlQ+
zz(71n`>=x9$4{T;fZiQDc1&DcyCjfbFZYPRV{X65$X0+Sf|g7EfzmuoWxm3N3O&<X
zgu>*ld~pKI$*nzH#Nyi#Hny^d*G#2`M at JveBmfrSxjUq`p<P2sGd4C}cx(!P!T%py
ztoM_c|HX`W%7!K0>$fE&PMko8*9&!rd=sn(EhWX!1>ztJAx+a>ypR?l7z2e5D$+kY
zcN!MCAIB$iaaDD9clY-8e*XL!1CP0xn$v65m6^=n8Nz>9+S?QJ2m-X at NIgg#UfR04
z?a&~4OZ4>gGAlUf&dJDp36<V(o$AU$^XP>*gEbD7dEehxTwEN8EJ}|lbM(mQG{6R`
zKH0u~D1SHchghso*}yvW_4T1s<~xn4qSSmfzx)l*UV3%%<G;Gj2dpwi38%-$t)uw4
zbeZS$xqfqB#VwJf9RUbF_9U7;Vhg1#=UL#mPbqhrq4*Q8|B+YopEo^Jn$QqIj^AxA
z02z at o1DL=2eZ$##@4kH+`3CrS0#^ZsOWgSJ2?~<%MxsW_ at H(B_+WJx->SMJA8N46a
zf4vI>bjph<Kyyw`nQ{qSg{DRB3oA=Ac2C~obCmx2FPzC(9LD9rmkG~^Wc!U}SPFRg
zZq?%21``N0djiw0Y&-)C5<nwD<rIF)`Hb*Aj%7ghMlCwMw3ua$F)z4T)e3^(+w|A_
zIF^B4sjH(i-s}DCISBpRp>e_k86!ZiZ&+tn*Uhn}b4!b7 at 9yEsGs0*7g$5*7J+V~U
z(i899yH`-)5lH>-=MhHH-~_5MyZ|T5WDif`$I%2ZA}L?$vQAq7uB$ZTj<muzvA@}g
zPfH|!EwJV9<ttXO9dOM{eD#X5v%Im<9z~g*b4Q|~tgK%X8{VkKil at oCIvi~n!M{Zy
z7@!|t!=n$ZLK1NXmntU=0}WIqG37KDl*PZ2+x#1#Qb=)V8g|v;D%B8BdGrbTz!)i)
za5*0rYj6qtbnM%Uvu8qao2Hu^>q+naUe<1g^{pf-swf0YD-&rn^PD66cq)Yh#Pj6j
zLVX8;t6XA6r-8HaH1{xZ8Qg@^7V-Rc)K|!<36MD0`3d7JaW`@QY;W9t|J+M2Qt2Vx
zPJ9$GsJ`LHExtY1TT*|c@&bxS5ar*ec<1kLB3&*kp>aVNNRb!Br*NM7`_<ZTW-!(@
zZu|d!%4uT0Ufn9LMtlBz1qvpo7QTu^VHY8TDRe(SbEmd;W2vuu%eEa_T3VdC`-xv}
z`}<2hz%HGf>wI>OQ^ZU<O8ijijG17TRjXCwOaG=U{P4LtVHtj++_8uDs;TL5lS*<p
zAx?bw4JTD at 5~HgdTmc?v)UX~Y-(U)3c1gL;K5z0Tsf^FdbHhr8+etFJ`?947eWEqV
z)kElx%TQAy at Kax!NJs%tq5gf#wZuKM8Oa){I=DIFC%!Zn(Ar&Hb76>*7yzw(sxiZ)
z!Q)UP7J$J~0ACak!mo23{?I6ZYa$i{@r;Pq|GTA)5BOjHqprSi+CrkD1BC#1(*@`l
z%V9q$sY?DKl0<z^&oy*|neIF_l{-lnpDxby^+mA3tfV1(vBy_aUr(=_r~=d7ZkVX=
z-tjV*0vJW`@BT#g<IaAm4gekIy?6I9DqvZW?8f5yLFEi95IuDg<f=ACm_9^q%z>oP
zHQ!~%8#)lWMIsrdv;g;F#Fkkrm;?2A6Dl^oNNRcL5eB(NHVNPY0;qstabeT;f!4^l
zxap~>9;i2oWVhZ!lc!>0ijRqhGQy?L2upCw2h|;)c#iV%rGkKkGD)}f4o*&XgI8d=
z<=B32`|@P~+PgT at eJ+x(|0N5sU5QIXWFB8F69A9{AIEUa;W>|@VojmTTXpVcO{{!_
z6YnCnT=nEoj+_7WYYc4`7EM#u8k2^G2Bw<~DL at dAAzZ_50)GRke0y=n-(T?TI1CwA
zH at A>O;&Xsea)+n|azF)t<`WA!nt{iZgti%&cx`<>OVZFF->C{*yffS(<HLts&t(VL
zD32bg1zyU891D95FCdg%2ia?%98XbARA7@}B_<rrKH_7}I}rT%5yNq-qX%PzOshR%
z>46kz=D+U-0#lR-qmcQtyu6oANR~7#CMM6OGXo9PdwrpO&VqxO_z$rHXceAH{`1d2
zCZ?v)vqAIM(Q%-`yPLXP;naMur=s!=V5_L8$e$ej943o{qvLk~&!$A&4GAY7 at d+ka
zXz$;@ClCv+p8O?v3h;Ny`XU2IC at C{WX at Ou<-MQ&Er at H<=?IrYMun$lKg=nJaopwVp
zoTsFwUWCrLkM`K<X;WPw5WMBt3459MdvCR2_|o+9=1|b9ZB2(1=Yf|?%ged->51E5
zOK%kLH6k2EG&P_GUZ2dYtY>KU0B3WjXh3y{XEWb;9zri1)!!%_k&%&9l$4qH2Hc$w
zhzW?NO8zIBCh)fZE5qEaHp(7$?qRTGcurt)Kx%Y!bU-MW5r_of##|g7J<g=HtNlMV
z%LTR^EU^#ryc8ZDo^99X4fh~7Hy4rvXy$ud`f=;F`Po^56{BiiP}+ at Thb2iNFJ>Bt
z-=Ep9`xUPT5i${O7xQ#Z;34i^>6yd=@Q3>zDhi55c-`a6V=c+eiHgy4Q(1t#QGB{T
zrv|WMUMt6!mdbvOi%$aAk_o_KqC0VkdFY%{SBW1y8dD`T2Vr`Doz%tOzf;hHitV(q
z(yd$GG=k|NQ{Y)J(~%BkDdl-F!Lep%|DYQ>zcaxdfcf(c#l!Xb2rJ^yi5s7^l%-Fe
z?5?PIJ=>9v1&tX*7&ntb_5-D;Hda2hJS;3P&)(Z7ZupO`uC92*ojYfl)2`IF<4;C#
ztM1ZiFdT^9*4tbBaAbI3VD5K=w6xELUg$4?;O{A#0_Nr;g=Ka<`N!>6ac!`3eoDNp
zEiX5N<^vMex at yTSV~}|QNIaaj at Ks-Kc-%B*55})yA<P1Bzh0DR_AsaY&)wSe(n^pE
zL8&S)FQ?!5ClL>6*-g03mxN^Ww#p7yw+IW)M_6BI;)v8#_T3%6UQB2c9-jbZb07B2
zj5Nf at +ocgILz6WghI>0}%#nyN2mO)Z at o|*J-tf2<a)4+5!Z{s`acxdPXsB|S7lFP^
z=wPs7Ugb&X=<0g7x)OkXW+?~Fn|6+?)j|XYtt(tG$BQFCzGGvZU_6B!&%Sqcfr}j%
z7w?2IO_~m|@U~o>pz&RP0n4zh+qNxuSP?WxbVn0)A8I)@pH54P=1f+*LCx|*;4=#g
z3;Wj{x%S3qOc6qmGFQyfVI(J4fggCg3;IY!S=rc<64hmg7s0!F at z}1TsJrzUoj-qm
z*#eTU->!oWsgjV_=4NMa+`L)eTGQ2~Gb6n<j{qN(pNADmg5Y at V^YPh4*{xy1G%B*`
z6cP{+I9nboVyTKbixdW|$e~lPkLQ*=G&MEh_j!8ofgXeYZ?63gB_BXt$M8okEseL<
zeEs^hy}kWmxYC8`fI{F3WvS((?Cd|`9l|05vHS{vx7%>r%ZMk(t=}7#YyiK31<3?p
zsB7-Kz#n;M+l-raBX>0b2fb-;pXagkeoYXbHzuV_0Oa at _%Vs&!%Rs5Ow(X=g_zIqg
z4*E1Mj-Qab4+)zoLA6Ks!kS?__z?6J!ZBnP)GF`JJjd7M1IX}z2ZJ<XHf9}eSRpRW
zV=?%_18SKQCr&_iOu|zDXA&29B7gB>NJt2LROQpBPlM6`Hv`&(^}1x~@cGHh%X3=H
z!Zri~Hz1NH%1}ku2ESou>KWc4YeKyPU7}fXgLka__}De9&bbP-^aqDebs^d_ve8W+
z!p_2CgcSna9iRvr2_6Hu+X6_tQ+#E6`x4v^$iK0231LeoVaVdGc~8npOM__z2Ov1i
zomW<FKsU;?>1=9j{Dm3_^&X#s*XH_+4 at A;To&|$5>>h&(?)jkck$k!ut9I3p=!W8j
zm`edZfD2rQtErX;;e>*Ew7j}-5JQ}&K7|4Wbv)no*8p%dD=TYrb8|%qg9`}bOvz at P
z;+ZWZ0!K}SnMvf-5Ac}6W at 9Z8R)oI**jqqR(NJHHn*8QaA&`o{-b9$9l9EzSzO!is
zn_?7g%Hc<;5seDU%7*z)$u~dy1Lxy*2{}Jw>%6eTkUTTNr*Ulyqs7h>8q1yp)isVL
zoP6nfgop))u74`@@Tu{!F|O~r+S+6GTxupJuht&G{8 at yk^(rZex_6`VqdA^x-WSTA
z_~+~uH4ZEDV*?r~1z4EVJq0y^;H7tN--ZmyJf)_lhBcX5_oDdE0NGiy_PZ)wkwP4o
zV!vIdQ-kyif~=>H;L*#yll%sS7L}7pCi9U(?B0V);?I=&85tP|2L~BMZ8*=rxsuX`
z0Vf-a3=0#qZsVO=$%R<U;L6AebU+dWJZ^Bfe6OjIk<r~fbT9Q!U$?eiU1&GNRnwc!
z5&{Sz at rx_or{*L4ze$Jn73aJF{X|tNr=nnQC8lb5OuhIM_AhVN96;bm-0|m0x4F_%
z)6r>Qp^O#`>Ug6*yB9hi+}!5Gb;P)abZEhH3Jtr+UTUP2tc>$$n?qL%%37)>T>oe*
z;4342YNQj&Vs-5zzNnbNn{<c*3mq$Fs=)H%)_l*q`E9s>G5CRlzYqb;-h2M~{aaB{
zk>|}IjC0+0G-~#8`%RVB%3~ZP=&IF`l!97wN#c6<2}a=+fXTdqf*J!%N{RZ%0-!0r
zETpEs(f872Vo)%U20$~ZF?2+M&NpFmM~{a46VY7stDFJ1D)8zTbQ-pVgN}~B<Goj^
zaw9pZs^u{mCSdk0t`<UKB$7!HUJ{Bjr~sxPR4Zx5JfEHN$kw`54+EAp%~~y49eNx0
z^=E*w(ao^As5cDP#ld9HF0M=$%mhgq!_Y--P%!@+W)MFIMCD}om|Z{j#u+IAJY*J4
zZYo)ZYDnnU(S+u*v$7U|+2$EOv<O}2G#(JEFKr&qH*oIwaINeKtkz4 at E=j7%MAXY@
zp^osEpOeba{TROH%K0cVa$zc`&uTN?Fi~~y;gcPoyi}cEug^{P_fr5p+dajzs^Vef
z<>OoU<85%%^eo*N6eaPciC?p`- at I%CxKJ3BHF7aDM$Vo~JubtNZw8A~;bJ^G$fuJj
zA1cvmwEz!ih!nC at W8(drj*rlmC*lT&M66ogsM1!S^jgUT^phb4*F@=?5d4C^J~W<(
z(mkPhM>L{wx&yy%J)lqbijwv2-`Tw>UPV{k@=p6VWY at B1_K=1%3XmWCHL-3;kmYme
zAOichosGdtEy&Ha at DaY=oD?!v!d3P9h at S<XNUzrw*rG$dJg^fxQ8F)3s?f{Og~%mn
zr1${z#uiutfF4Kwrt_@>ygP at bov1uLkM2Xk0!SL&FkP4%u9^F;kC4>@{{oh?(AFC+
zF71gekaeq7RA-E>FU6hY>dSrp{78>Sq!Z`ItDm=u7c(o?LY_UkvvH=ZDla|#Z$u!`
zXD8b_tzd-UF9!3KhCtB>L1AG at _xU&8!o|PqB^}7~(lZYe>@(=tL6Re-;QwA;UI<&*
zEf2!Td1763*RmFILg-vF0bnuN*6oDW)pZXGtPQO(B7zb#1uX=rujbOMm~g!WCuB{~
z9jiPD_J;f##5_)2txFJ3KoDdCfGVKTO>|hJBLJ?-1fVpJH5pu2WcGWgOEyt~7Cp_u
zNJT|ON2l#N2)GG-n~WJnqX};0x|t1p0*pN3hbYaj`$*aP0qCh^atjI&wbGk8L(Qvo
zBu9gY%H3K(dTbdJDXnB9|JGpPJQga~A92_Op}jsPLnVwdq*L~=Nejtw`=rdJ&}D%>
z*~Kg<WojY#q1bnA3%)o8jZ81g3i?6Ng9lKbr$Cqd$RR1Bq$5{)!GAXuKzi2YGQ~*{
zIQXoP&3xAy%gRi#EW60u6avvqYEln591c+rKtqPDz+C#&uDBD{h<<+Mqf{RCH&=hS
zjdX3ElSay-pO0Alc7;p59(QZef6DLxnjW3dD{{XQclspEvpnkzg1Y`kgyCo3o%ajJ
zAk at Jti4-t2n4vJBKyi*(k9GC%m^hUHO<hmlb*Pe}XeacL`M)<xG?;r#-mXA at c=WKw
zky=EFNrq8^bqHHBIq*KAQ^SozM)xoS!*{F}Bw7%(kn&i32RaO;HKJs+q!h(`$Ns~U
zQ&W5bx6*TR43Wx2K!i*0kcqLeF!WnyS$X+Nl(8!&tDu4v6%}O6LkFI+AYb(64JWfK
zXcZ)UYx!g-I_`rZc&w<4d<bxyrJD-lUqPTLc=6TmrXRp8b9Zm<H!iB87#J8B%5hnT
zh-R^0SdN(((N*!r!^UY$%jRpCmsVL_5AC6ov7y{<8lv1IzG{y!HAwMpX7~-L3rK?$
z5qgi$Mt4MH;p%ij$;L_wEC;M)WHiEKV#a>_xPd3e7_C|O9K8sb<>$aahW(%%vmYuT
zfH^XdzcyB9qPx=4FgK$)+$J)#e*O(Aoj{)Rq{&-?p8mykP##*2b%22QlOxaSuk1e4
zdy3gFH8mAsQ2ukpoI?j;)i>lhM|fwBP}3|MeYx at P;8m)hv&-->GfQHrIk|=8n=;or
zACvEG0{(#|qD>G45{wm`4~_%UlrT`CQm0f^(;mC}378CInafA7*wc-mJE8 at FrlzLb
zckHNtDmH at _J<xZ`6gd0UsTWBtZ#7c8P&whz<MsE4`8;VKK70UPW-f)J_}sYssNr5_
zSq0)1ba{8%18wrW&eykUOcY)~Jz at 3(8)t5RCEt~+ at ZLivQ0N!K>mMUv!%5&DcWXIa
ztY~D8a&X|0_dI-oVWGpYEI)cJfFQ1&uvu*`v~u(y at Do5^#3WUl{a6885Qk{mIDsw-
z+7vz4m5AyO|EH$M(T^OGyEec-Sth#$A{5AR!H~gUIR32VdZT^%v at iJpK^@%IZ2O1q
z9+x2nKm<Z&FnG)Re0Im2`zdtX1SL&(2n at TJhcei=S?&xoekmLCCq!-5F+3{jCPKWZ
zpQERUAmDI_Ow%=}jtscw?W)P@(2>W`JWikf1P2_b>8y;*zQZR^7?lRVlqp32U=v#a
z%ocYZS7(-m|4zipu6^-qX=%aoneNJ(fcwCm=XQ}O6HH$7VT*r;aBTtxg<2Jg9t!($
zsVMERB~BhY_N}kaFwXT^4FmxEjNOk`$}{(-^cV{?Z5=Hw6LWJ=pPGZ$ls?th^Fzgq
z=5sLMb?CgUx6|ZE-eVckeuSC-Sa8M$_MI at 5=0FD#J{lno98LZO_2={FGc#u}6oQbv
zRQ^GzCGWx6X&WFUxMdZ%dC!%x*KC<PXQ54)u&7~)V!8#x&Vs at W5bCosZwc^;m8N;%
z(G#urJ)TJ1z;)dqv}XRWu)pcOfY8uQwEH>R51=8FlQu}1*$>F}+`E#jK6fG#l`6(Y
zlXcl=5;ewkaWclzOl0qJ*$GzGK}df)_Bo^1#{S2sEIP8NQLQ7kiM$^v^TzM^O?Xff
zr}mMMup^XpnxjkDcjy*9DD?W|$A<Ctv`rLi+NIe0sPRZ$YLfQ<{CSf|1qz%75&}^r
z;LiN~JS<|Hp8VDT;U`)O3e_MESp~~cTxvhz8yDLTmX`(|3~{LPWr0(SG%u^47BWh`
z=i|}j5PsanOn5onJ!hfuuoFQ=Z at 8I)+<Z at 9U6KzVS0d196oWoe%}}zrQE=;Q6$Q7(
zJ5EEM2u>&|)!vuz=s1=Z+rFYJz;kBt<MiLz3Oy81iKOfY>I}d*qy`8pN~HE6Jb)i!
z$k?Aa(J}iO7Bm<wwSWPyA5?)({K|1-(+ZD^paVaCJdBJaRC%;pTB(G;Oa7mK2r^A%
z#wshxW%ke>`vJO#TETb4oMYm1Z7mUkmk9vVv<hu$MWieI`^32Gft#1QW;Bsh5Xx10
zX5sRYsQJVYffl=6BpBQtIu16rVW?m-0pLi5xq<^^rKNVU8S#%`SJbE!=OPaZ;Kj-8
zhg1TT{CQf)bBO><oY@!xSy|b&wciayPbOy(5`u$_<#974IJm__DNAQ+WMm0bXE!q(
zPxNyebMxqwizs5qWiDchK~(WXT-)JS*?l93^ynK;uz?|%qu29y9jX?To!0mIx?@ej
zgG4BZ1H_#{H_mTre7p;^bYS0iv;nxkyP3WJ^xs2x%UE5<4<tqNjmjBPK}4R=eqyf5
zH6IfeW;k{gwFHgF?T&B{LI^4bIhC4*&BsvR{)`~d%GPC@?Iecf-O-`N>=z$T(AJ>u
z(0|$f8~y8|=pev1bWjvz@#UpJusw(zh-vF~+h=5Cpn3A{Bpfs=D=X#@^n_t4R+#`S
zGX at oJsiDBP5PF0L9>aPtM at h`|nE>E2$8gIXDw+R-{EZ(ucjP#lLYHJ#--Je*L2BOz
zY&MBtMXmvew?)2;TF&Ec3$|PArQ={`?ti2#CGNeJ`(P at ICisw)XU9V~G6(b{w?7fR
zX=vN8va+(sU&8A_03wtEgTfv^hyt}Ry0JCPZ30TgUZ!dc^O!WpoUAA!YSIkoqL-AE
zTD&BtzFhF|SpD<I_0;aDp~Z4hQBn6$2*ZGtpgUtg^8ngtR9zudh8|N{M9K$Br^L;M
z%1UI at b0(qTp4TtlhFKxqbx;BT?yA=E<~{qfF+gGa4xLb8s8D~e=LQ4{xF|<gNEs9u
z7{+u5^vBS{9L?O1{K{K(!K2F15g&Q(-MN?EMBX1NSNm{HFI?En^F~0kGb?p$Y1s#5
zAhDgPAW|<5L?nMg%rZ=BeO^uc9GLt4r*EOvRG(B&RAoHnu3iF5X8vE2Q>8-qdZ5r<
zuIHj>C5|6=hIyZHA215HasP@{Z}l$V=cMzT+X_!c>^6N>Sy_pNVX-X$h!Th~wbB4P
zk-GR!dU|>`H8(rQVuuoThv?sog$#BrYtyHEw<#tAwo1G>bqIMMRfAlU2o}YU1jXFp
z2q*!eL_(sAkk9&OX6!0I;747w*I_>A`&`Nd21A|lC&#jHNnFQl9^U*eDJ~9E`Au#!
zpJ8$LmoGBZYd|OCy at a?a6M!y{4nkvHj;9+3LS1Qwy(nFN)*vnUCE-XN66*Nm37C>b
ztx*SGfP91Bx=Pq`CNx?g6!3c8<rOS>?BCeFuzTM=5bm}OM%{PP7R$uuLe9S$Bqu|)
zJOUE!W^6J6s0lPp0O1vcCX-d-3Bpfp{T{#daCfhse#D{NHe(c|7fe;ntDCK~$}&Io
zeF?MfZu_Flx45u*>@Bbmp?6cy_V+&red!jfA*80m8hn0lV5mUKaGv~w?u(9EQC=>$
zIE8fe14g*(!c$LAKyU*&(RZKf{8;h*yY3>kvk6Q;p;?|%ClxfUrerLLm2iFw!Ba?P
zHyIgE#yUKnEc2^bHl1 at I7Uym*!+RKh%fwuYy)#a{ykLFq!eCI<V-9zPtg_q at T<TK#
z2p0nclomP?h8lsrbbQ`+GHPO at QCEZp={0PFn(Rn7I#u9F?3kl`(PSaA^^;;hCVD(9
z0f6ww!W74fFj+U}o0Spu_Q!3)H@;aB6N_-<Y6X+eWN(q=$&-4dml65JL$vlGbAi>f
zun?(xU?@B`wh-kL^t_6R329^a?D!}$<`wi9wC@*Z?^S2**uIO5OcJ^hcDEFVB2T%7
zIZG(uqbgUh<Id2~a4Jc3JL&?Vt|7NMw>%OLJeEIOE)av65{uLwnmE=G(c$qWA~$}V
zcH79gMTF(BcMg5IlIg#TQw>5Y`QPJIU25O&?V&q>-Azls_`>B9Vo;(Gry7=y0Fl$p
zy>Shtjo>rUn?p8O-)=~uU at BYGI664!U`OK3yju?-KY{zz{N)Vj7AU9fxII1FjE^4?
z8bJlfhd+g at sVFV2Tm>FMY)BmdjKv(;<H_$iGoYz{<jDHqE)ENu1)o&qdmS7cjQ`@-
z&X6q-{D#@-$iJ1l8v-W~ohy)zo?6YHT%gu2Hmc=}>}=d@(W2i^)pMyDGuTXnJWE%o
zhC!d_?~4G%P^sgkymnh5Cf|dq8S8P0s$K+j at -+hxE{fF5=;)iG+cR+U5w?2hL%#dk
zf0MB)b2Zv7ub|*?<HiTX=XK$vU!^BZ<Aex5AszUY1@^}LKm!pRrj$bkGsVsPbd{Fi
z(E$DaPLqH+7;7?j5y<ORRa`tgDGw=vS|HK at v{7~{rD}|<jBf;WWLm1d|E(c&_H4*P
zs|2>74U`6=2CLNze1#JYw+t_AfdTPUR#GBhI9~M+z}OHnnt>Z>Z{7_Uiar9=o3#{y
ztz&RwkSzqgQczL~4h=1VS12QMJNpbcF_8$RV3iwU;HBn5)vBrCL0D)5#pNp at vAol6
z{_=$dF?77x+1W7z&7+}r>_NE#*L7>)<&ift`w8a&f>Xl!@gGnKm*(f4oSfdNy!Zmy
z4wIAt)*SW~En5J~6|an^cy6jwzXD`}MbcR0Wq@%;dGA{HQV4zc at L{Z`HT{?F?vwod
z^^J{}D;C*Z2bHAtdsXB}e_;}0z;|rlPGm<Vi#34#F`=hNMn-=AOzKmsxlbrqd&=5I
zNseVV-B=EPU{)Wijqkj at VL<GuMEm$XMOa~Y+SDyXX(eP(6N4<B9&Bt_FXmQ6@{I`F
zRuys!1QPkH`;q_0{FRTskN`HsV3FRvdzW6Q2iKCM9M9j7z at -PvQ}lYbR`=A^IXvGr
z2x?i;dQ_#|-G$g^0k-3?lj#(4k!K2$)z099%R`wAE87ll*M_3J7$kg(7$DRkxjf#+
zQSfDa=^kZ$a8B%#S;kEdP^-Kore}@YvZ}#<WU%_b|C_<uTXIOqP_OtO5|w{=(7VrD
z>T+$1c=MkQR;9P`obq1#gP8(-1iVA>FKxsEB5G8TPhM_rA=FK|7)1qn`9Ihjo(ALx
zJcD1Ja-IFu*4BnU!>hUZBT=Drvyu2J>_1547tx>b3pA%o^75|pqln=@16%^+hC2nN
z9#)shAKqgUfY at we`o%n^N}-YeRiy*6{zP^UqdCj%LA4}FxU>iZ9r{o0fG3P1;`QHe
zbUyYB?V=zrPkVC$Rh(Sr=+UEEBmLv!^oI_;b1FiZhKO$=T3rtv8AUhtmjFDInTE<i
z_y_xT?Yf+;17;cF-?SZX`a#8zNuTpyvH(J$xM)DIu&hO%e9>)#=7#E)l#J{MAvz*#
z?gU}_q**O(VhRy-`7y_aAL6zB|Lj`vyZ>MBpeIWtBk?_u2}J>Dfg8c82vtIe{P^+T
zK#e~1SOYWI#l6|KPZ7E~&4nH=L_B^3=eGSA7J~+i^7Z!*S)kYWz}qFVIkRsO%$l9E
z?#vhl&L^Tf3SpsAD*>1&BxP{%|31|J<<m6(gHs#+C+7ig1hJPQf*+Au;Fw%&Ypj>7
ziR2OUT5(EL;JyNU38gwRA|m4VB{8ua=tn$P4j|`phCnpFo5m>H00FhmuM-kjUjzdl
zd;+o=%Kr$ANC at T6b8|frM_prraD^OgQqz?P0}$zV>dE26Aoxaa!8$xm2N|cgw-+X<
zN<R5e8`1zcBB0g>{7zvkNFf@@7B&tJYr}t2HWc{w%l3#7o~Fau1#|Qd|7&LE;nT##
z#KLQ4<v#sGup%<kLKPBKvuQEb0|V{6B)&q2r92-`5GjvYg})g`{Odn?6vmCCqSzw=
zpYGtHL!KLJ%cZ5IuU;K>badRgb0^lSfIu1~Z)Aw+yvm{YpdCR8=ElxsSm~^+Us2lX
z>+7*G9pVS}F9?hZezMAvIC=6U>IT{%QkBP#x8hAe_GM)_`QSBnmaxC)zz$*rj8P4g
z<4)Sc2%4MY4s`iA1o)23xHJn3i>T-#`v1?LKXEnzz5pBh-G0}J)z#I791jcZ%SEsk
znH?k!@B)1>|NDZ_1el_uHCuo^P{-)K(@A{0|Gz%LU;^j}G#H}8lf^hFAXN;QBbgZ)
z+!@Cr6<T2>+Z8V-VH%dXN^L4!yomc8gM*Gx%AD;nY+$6JiH72{pFy;?_FV_h1z<Et
zOS#xRmC`z{w?9=Y{Uv5&-ZVg?8RR?A3pG{MOqZ^X4unyh!J|M}%lJN(A_xn)I34I0
zZGG6w>GSRF2-Bcs#KRo6PAf92lx15lAI6rn4e%*%Jn8N0fxxNmu%tLHK2Zn08Q6E2
zit4z-P^G8gdjJD|oy<3gbox8RL%D$Du>z>6xAeWE16n#LVrK3FmVoM+Z9hx}?Rrl#
zm!g-vabixaglghP4rtH!9|s<6z{CH)JMh45v!EFB4&a@;O}K7&Gu<WL{<7Z8=4 at JG
z;G2LWWp8|U2L;KU`_O*%Ysc-!rPLx(N3%OvZXbF1oPBX?dB?#JIZBUnlYB;J1ZBy$
zQ*PrV4Tv!9EMkgXmGtqBFl7)X^X%R4+3!%DCHZx-_PBZd1!ZN#YB(Di8IH`3y^eo^
zGd)HdYioH$L_}Cw at 96IW1yH>-h*cfr`Ic%odR~7jA^ReM%68ihgAF7<H94tZvKMAF
z!U%~rG{70W0za`ts06qo6)=Qam=JT-l7NaF94WJ+JXMhD0xO%E!aate(P7%_eFCik
zR=_66>-fCDFezj<fby^8SsxZX#33Zq1S#6}j*Z1*Y<3I at x%jK_1rFNK(xTN2Gu?#^
zs>3-Y811?26BKnZ!sjpbynM+5Mj_scV+qnGS50-fv6rATsP&4D4n6iR(d}X+B_V0y
zrA2UAB^)78$VnK*qty2UN8y`I_CG_ncQEbBv6IFoOraDoldjL7Z!vJOhRN?^l2Ver
zh*LXSQ)nn4)BS)d7s2!up8(Vs7ay-IyRx!^r-F*&2r7`3WlBe$uC)fdhDu0aY6Ko+
zDJdxW2L>FFeS{<TcJ at 88{gAV$nV6Ji0ekV+4A_xNZ0nQ06%K?H5#a=;0KX~;uh*}k
z5_X|7gzUX=@nU5221xV5!ovN~hzkk|`EI}2DfS*Z at uAe;#SPcL3Ea)IP<- at 2)jREv
zXrAR81W<(`1EAj0))vLX`lyP9m6h0>a^S!mN)QSR>?73py5?rJUk~o?XDWtUivg`P
z5n8N91`O5l%1bSfgx9Y};D>bjJd2IRJ6cn9#o)t3iojCg{7Vb+?fQzbB_n9hk%1U>
zZaCVD5H&h|pzDZOHXTI^LS)|FbYO50`%bYBI2N5LJbYk!`Y<Ks(C~1g`uRfJ6U2sB
z>9yHytM{>o;VCwaBV!R1T2)<FR|HRu2nWL5gAfcJb1`1()QJ;XztY8#=y!8-!&5Ta
z=?6H!F!eop{Vn!G;kiCi(>#BE1R5B!gf_2~aB>Z}cpwps#^s at QnUBSCp_i!d-OAxl
za at z5jYLZB+Ty+Fdn^=U79drHtGh}xw_BeF@()e|(EzPijF%fiS83$!74<k!BFf>$J
z%|J_wEz6fXk6__^nf^L4I?8KM2t!HNdl?WOT;@OwrKz;}^dlk at l(B_Jo+S*sc+(Bw
zniG~GPMwKB@?>#gVR%jjoLcp at 3;(vVkcd3*bqTSDrS<g$>t=g9G&FQ$R{^NBvwQpV
z0ajBep~w+|aVS(6>KPdH!gbDL)<;ArXsPn|-BqXo+GQYa*cWk$m%4__6Au<5?uWTP
zuO;L^!h~WWzr<o|U@(r4hzxr45jGk1C!{gdt<T&I6H2`L3bAg|trzHg$G2UGX%Y#K
za9jH$Sg-+#cKL+_17kCIVPWCPbJh3!{nI^WK!xT6-0we9NbLSffk_K at MCIfckeT!p
z1uw64a3pR6L2mB1e}s8;9!JE8JF-u_#E}I^5AAM4TF2<lj=cf$M-TYlz5BM?Bk)x%
zmRD|=0CE0GT^(QA0A%@=Zp-8M6{`_NP5%SB7Z(+kB;Nx7(~@Qw-%41ww@=OG^`p;!
z6*`Xsg9NAgD+M%HKtydnNat5Xxf~&yYPg^|?AGAoM;;80fow~jqdC=E$A=MITP^^3
zlK&GfMAEu5Tqx1<C>PdB$Dw?P8WE1n`bprhJdxkr7RITbvY$PA0K`|m^F$tpY;0`o
zP$)0wgPt6YmoU6|z8gC^iHPN;WwV)LeN}W33X!zupXcg5sBh^@Fk037<rC*_T!=v`
z2ttP6x{ZZJE>1IQrKjAjSbd{m?1Z>D*TTIU*ujMXq__-&km>>rZVp;whf@#YPM57L
zR4-p{#C|&MSl-tOuBviLy;oy?{J7dSgXtZas(UD0i0uf99m#DK>o7#y>5cGUWapu~
zA+x8S90XH^g#~ee=@<K#A=pcMugS~8lOr~Jh+cZ%2ELB7CSJ-%qLZb&DaSs027~pb
zO(+2cZ+IU%GxYOk24y6yR|F!5c*(9LK^b;}`oa>%DJJHEoj_JQ1}7#8jLLSi0K+$;
zY#^8P#_Z1RtHL``#1Bc{RI2AKOGMU|?<n at C&dtps$2?5))9ou-KDOD?$Yugd;OX)7
zhCO&tAMdkK6*Ukge^g=n1z8Lw+e>T at g0#YUCH=#P8&IQUTV9;qc|8;E5{bILJm9Um
z4R$UPO43V=Ugd^Zh_ydF<c^?|xI at IlmAQEv%%<305?LWh9&XkHfs4~U*0#16Ws%lX
zJE{(GO#_o7ge6Sg{}KQ~skh3wOi_ky$A?>WS%uh1wRnru8pj*(_BlZ%gtwS-P)Sww
z0EP4Dw|*$**f23J!j=m=K+Lj9wo?c39HWL`#F=Vk93K234SPAL?_+6Pl*O`u<&v4f
z81wk?JN*I;f6~A=aPn<FDBZYm!%fjE+7hyfjf;^_9)WjTnThr#7$!dtyX(MZC8b)J
zR#fkZW0!8<-pcYs*!%&@a3?RVY-tj;M#zg7{eWKqD9tMn4(G^l$^azTkbv?BjNeha
zTiqvNL!sQD0ze>7&>@Sw2H#T_2gSUp{}6$&!=gzw?xi)@9A~JYMH{Q#QrCxOs^T`X
zXV0FaEXnHCr?NHJrNp}NImi~Cm$f<cXgB)D^yK6_9eq))pTJ*1`=i3-k78yKpL+t<
zQtJvqoKtV3y7<aq521yXm4a+pv|RXEUh0qMMUi8D|HG6)w-XRgtM2syC?pNuxlUu@
zYvE8OjHPcR=&K*3qKb at -eRqoP9_9!@H$@}7HA=(uT#@YFV-&!J3cn~+6TOy)qd_hC
zi!Gd}aH`km)TCGMfX$EFc0~k0q182 at ixWGfNCMz*e?L0e_o80nZ73=G86_eDvak14
zJDjB=HlrF8dt$~#@m{voW59J=FdT(nKxt%RA_9`dl8;TJaEW+$H*qoswh at t2Fc_&Z
z$0$)VGG3I0%w{FEvjw&rIw(aWa at RxAh3*U7tDm7~Jv(gO`WBJ8mzT(%AWr?+`^V2?
z8g$mo;^HxEWa`3*lSDew>G<m==^Tf9&HNJ5>xVH*g+aHk=`T!pxg+hH*WaE_{w#Fv
z+&P=a!N`hWQ&jac>^AV#NZvOR0NVB#K|3IADCE!qiNkc3{W~d3z*KfinLZ2)V+Qo$
z1VzDOv%0&ovF^cwS{Y?HS+cpoiqkrTk(E2{(ZW3$GBG}m9ei&()v<juPZTk&<m)C^
z^iY~wlj}wA$+A>cR$f)yjQBKix2B=Nd{z1>zk(?QAj&}5w|ieXAkL1EJ0L!xOke$c
zTS)p~J&36GZA&<D<9k?f#s4uGUJ~0j(C>*;+E7W5H4=gBpEiVw3RZAl7Lu&WjR0A9
zcZpSITptb;Vcp_r8+DIwOUln<bbJv{o+!wo?2j83IE-<NPA9WBx3-!p&n5 at 29)tK<
zqjY*Uum8ZogWBxp>VjVZFeE2i`ukW9LwXy-<$(*}T&@D>@N+>I5>-XHLJ^Os-me7z
z)0bLCbqC4mU09dc-tGf83_HBx8 at iQ2>XVm6HI9KDahuOEx&T}b(&6~M>a7nAefdgk
z5d#UE&OCqZ8Z*V%#6(ITWjm?$M|MO~)r2)w`>FdKzouWv4U}K!sA<{NftgrWHwA2m
zXRQ6<>KQkmV31_6P}!lWsZ<DN4%jwH^4#_z%o>&3*xiBB02z+ at z<~@LZiYq?$^RP!
z2?rODHv(fbh*&(oS_8}uoP8j$w6QU)PP+OIKqvOv@(7)~)cU1d>Vy4hD<fmEfXeD>
zh4r?#nMjgAmBfdnbZ^Z$SIrRnW#sP1tSml?NGlVe7*%VX=$|t)K0j;eM78eL(W~W?
zWlO0;1<bQ7#B+M?{z<rsgrpia0Y3#6!x|8XDK+W7eW=?kVHN;eL1H`y0z0k@;CbH<
z3KF5PEbBO^g;NC^YH9{wpZESSF^dbpY)$EGfwLWyqy3fb=+QTZ&rZ##nQf60i%m}#
zWQcnC^Qrs#O4bvf4>lk6P}p{6u(7fxINbu4NEZ*J5irm at Wfn~61pCm(Nvi3jJOSbA
z0xb|cOZ34xf;kATu+WQGJj{3$nQ`SR3Y-g?&_!7tK~Xzv<d2Ut at HV45E`9|PYOx8*
zQYrEFIzEz{dKi0VpI=%4Gd*}2IKA3qPteHT3U(3=M+4jA(g*MIeVs=x0KRI}#uSiP
zU}aa=3bJCCO9(aU8#mFDIH5M+G!$`JN-C<d)E_mSB|g$m=hQw&ez*?-ns&7x6w~Tn
zGWqr6eSjLjn^~o?ot2lDHvsYTv*VfA8&LJW17P}9Sm33%`7lA=>Maosfd5S0 at 4Lpr
zKYQ_cTwE81ixFQ`e_w;x(zQFL#CbbLA8KKwKtYk01w8E7g~58uL=>_JQQ&gXkL4I~
z#kHVRKbQa$L`(c`gY-zpcp<6|Jc4%FS5%|e!hpw5f%eS8!*l=M;pG<z30RV}EI~MB
z<Jk!{Z1Ev~N|slh>H^SYQ0NNMmE3tQfq-Lj1#hmx0+u~`AP`CA`*YQ^h5f{l6&Bd<
zP}QMAN!5)Nk8sx8R=!&dylMk)z8G0UrpK0~<4sVENGz!SUMp<!BJddUMob at 2y}Wkp
z>#8l^iUo82=mD<p at 8aTm;iw043JW{pyb+v|^MowVX2*^lHnI(nnP5G=zN7{>7qk{r
zOtUa3ER16HmcF!gRA}gaUC(hicIs1)5T_?jOQaB&lq3$@`ugii5_keOGU9ZMFP)uv
zpdC<o^W1(XCD9wg0`vAR&d7qv<b`v4SYT<S4M~%hkK83r<+*onCj}hLdm(a{6)s;6
zd*XAv3^Mu$L0Mog_sxw{9)yqKv$-xt5h<2>0{5xzOw5uuMlewF^Yevbf>XWgKEz+V
zc#%Wt at pB!*gF;4(gyNLj+z<|my29}VaFQ#7vlbuI>GT?e8|P8Iv+~j}a?gS~j{-Ws
zw4_<6fulq^_5=K at r5cK3byM@}$;(2OiaB=ewi3JA+ZCV}oFIvVBm at ow;+#DiDpea9
z<X)Fx<zRJG6rpG~V}L3`nXF%VQ7zUYq68x|S>5XD)lcO$m7jm#{k^m#CMt?$j?{zd
zO^QTB62~BYDO^cDM$3ZZaenTo!QL=(9PQHz8Q^%w-$C6^466DyW8<%JUpfk01PW5u
z(TkuHA85pz@&u1?V^<CNQ=fT&Ttv&cIXP9b{h{5#p&~FBEIuk~s6QLvyPa7Rm at HRZ
z%}lV$;fUGjUla9}KLcY70t4I24<C-1wx_uvO9(<e6b%A%jqW{`4<Q2u`GkXl5Px$y
z4sy at JSo8Vhj(?6uD%2b*K#MFYENrnU#Azyc_(xuD+qn<>=M+C*jKYB*uCqUoP6!Ra
z0<*ERGrUG6C8mc;gH{~KDJW<U_!%TUl?CY=AeVwTAq#uysNS(LiD{VuSV9F14G6gE
z=q;c}XniWI`j`N|ZDCtZJAa-|M%+(%^mHca)5}JPqDD5J$dPM;O>H7Xr^~IYtSo?4
zUKfQm&}q~v3rW#spmf)E9_%luZfFQq+yym2<#SM3g#ga2Vnd${)4|?D9Ku1Cl9-ZG
zfL#dN3kGj2Z30iFTqO?EdvHiR+%yc6n6G3Og(vU$2f`R*V9>p`igI<$vF<=4Bn+zH
zw at Td!w#e?Ny=J6x=S{^^;TEeAeS~8lQB^>`weCP5#ql_EJaV$KH+WQiAg=x8qJwv{
zu|vNv-&xVSA7bWvPrMnBALvAmKuHSDI!Oe+iCSM<(^9R%HcJ4<@f<xJjAkGwPH+{X
zPYcpA>#VGlA3cpeW7e3$X$fj$3J{`;T8vOm0l+$TY$B_7KcKs(r*m|_GfuR?Nnu15
z7~kd&-4{F%#WNEs0_4b;Cr_gInP_NSFcuK^CJ+o%O^zr!0rltML-Oq&^YH2AkK){z
zhgBxf)=%IJ9~Bi9d=icTF)&&%icx}-`3Mp%=+rv!@8mf+xX{1S8}}+`1M2{_z~w at r
zVZvb;<m5kaHpt6hSr!O3#EBh<G$C^Ex%><{HdJc+vr=N8$$NvM6=Wv5A$5ZHpvVwg
zF_FP0P7`@)a^}ou07!4-iLSr<hLWeKJfs%~83b1_uzxQFML{|1OLTr5NmiA7-NK?H
z%~1OK8H-2|ue3tL^yFl!h{#Ci$qvEm*<*N&i+4Z{Knk#3mI+6XprK1j77%+C;NO)>
z2|TJo+5Qcg>juw3sB8B^crKIMF+5mCylc<iy*}6}hAqILl0JagnDRK5mH*egnw8Z!
zdIvU!b?&w%!qoNy|A^fk26e;E3u9?)CVN0Dc>5IXn+OPRd+3CQAim)0%+C7#Y=}>*
zuO!^PZw at Rm;mX$AeA{qNT3&p7A07r^8IKch*8p@|Z1nzt at On#ZeBw#sz_|3n8mJpB
zC7EXb8*gs{jdkDld!L$<B1NSrN at XY|8Ym=9G>B7411S~FgGiFAOJ%AM6%8aZg$B(<
zSEFb^i6)g&Xe3ER-p`NweulN*{jR;&+V8fW_1s;C^ZcK`;TXQh_xK*PladQyv{nv&
zU at j0fzE8k;CNuL7Pyv}A?992&gXN&50t;QZbV=vg8>Bb;Pd`j*d+&-3#*>c1kw!*f
zp>b3qh+bfNP*<7z7gP##46YKhmEG0>yP`$wyo>LgGj1qwEL*tnXhK4_-r_4dB&1L1
zq`+C|tv)92!du;2`F++TUF8Rn!`_n~lx0?{j9B>*>xmOuzPz6G1EQek*Lc8y9Sx)$
z7dg(hZpyo9 at Iwn_c2#ver4^neadi*JYY_S!-qi@*kujU5P3%m0f}BcoJ_44DrvLE2
z>AY&y7wpWM=q1<- at oX+G5z*0&{Q8S4oAzz$l%1Einl?ufL%+WA^~CGIXB<IV#?B|i
z6LxnQZo3wYfiM}cTdhZrJAb;5*FXU18{rtKp1(lLaJIVnPf?Ie at SK@(o<$X<rH18;
z7w-)TLAq*QVM(Yr;Wsg<)uc)AA(Db?Qw~z~h4tFKM-RJOkKVAqWs0lAJ4u!*t2t_?
z+Vpk|yR!(|%+1^FV9GDO97MK8i`m5+t0VL&Zey#{uI<o!YXw+cUG1FvGP{VLQxay&
zev02;E~H0rYwHf$y*kCDq&&lzgR%t&%PDz at _HsN%na2Vrry-DwA3c(~^lYSy?)-rJ
zQfu~^ZKt%PR5DAb*bW>s{}^Up)+Fo}W%(mDZ}o5*H*@`V?8uGI0FK&;s3cO5_dKLY
zJ=6TabD{j*d7?C4V+O<#r1OG`oOkOf6#=!1aI9CGA3jfBow3|{d!OaiH&)bz+XaWq
zB$@y!X5^@8T|dBu1+Y3uMFHTEV*p-SSXgKXG71Iq)TzpX_}nGYn;(N^j9)t<5Pab}
z5CQ>mBcF)11QUClmv at 2_yrJ>Ut5;W355;M5M)^>IJ9loToCjlz<l-Jse$yAg6o{(;
zYDevUKM=1}MU(~42(HMKsZ;Oe<hT`|ID+}+;BlRdXbQzx?YyiigCfu1IcGmo@%Cx_
zvl;Y)?!l}@cNE7fuFyt#`x)EM=cS0l*Lrt%I>#5$ul4TTa46Lf&6Xwi#Tmi|A$}lt
z<9;+!YTUaC5!BD<?V at S@Fm`;0sqWIlK+}gutvfarUF7!dX^V|`)B*6-H<Zx5PdfsH
zWTFJil;Hq#iRzzUX1xTf(?Hyp4m{T~cfYtP?M1}o+vfx&KK}QteWv%Q&OLhe<jPGf
zx93|i1p+eRf0bfmV==j7Ex=2Y+e|MY1UB0yGAWFX?DEC<rVnKQvzq?MS6;j-;O7 at 2
zO~79D*dD_cCuWT_;(OAjcjRY!Lxx!Q-$P{qIVQ*EKYM at cn)$!E00aK at 61vp+h~6z~
z;2%dGIM6{=KvZ8_38YaX`3q)0XK~!P>j+cHsv^!J`8siWx%iPJISag(bQlF;Ywd`=
ze^!hgEAzVu0RKwt(W7tPzC}KHhTK7(Kk-)c$4Fc+1dCCOt=A`XbXl^W{!v;l>rOu~
zNqL*cE1C^yekSQf^>N#Kk(HCL03QT~7Znx?DN6Egm$o8vY9aDnv33=emAm-pP$tdW
zibUO^RTmUWn!nmfnm>d1FPSE!vFZDLBqFS9{%YkbAmpYmUrF;rivLiMh|H|{tA$z9
zTZ#WLlX#gUgJNBQBgAM7T;G*9>}Sg2Du^G8BOv3`2(=IVvV5TUmPGPL1d%aDAE2Vr
z=9 at QzTp@{_lvU*^&310*?WIeEgXWL)#OsMKm#Y?8&Hv(){@1r}ULEnH{~tcv|K!EX
z+e18FY7cr(6uxa2j~$~;b*`IHD>gQOHA`G+-t^@sekQ)OSyZ#{7&oUyi~6naYOR{R
z=oCEB01I;qYA~Si<`Y|4w>fElx7J4J7j53GsyaHnV`Z{!!md1ZR^^@sR at eMCuk=)7
z%$NqzT at 1%;{`|v}`l(RFN4nMliN5u7B`$Dbp`SfuJx#pp%q)nJv+Ap at Fcf~f#7Q-q
z(e#-*&j4a44ud8g84)pF{2E^UGlbr}H8Rpy#6dvFFX)UWQ$m~@%AJ!_4A=@k<wc}&
z?5l4S1&S|lJs&*KGc=6w2Lq%c^aw82kvA=@ukmuCwu at d_fJJP2dSl@%NAM*~?qc)X
zt$B?;^5Q%h?z7MsMG+t?s}U<0kWC#539jqc$CaO#Na=7B+Ss7lR`E71TehT-j at 5@e
z+g`Ps_$W`r=}Zh*q(6J<((*7(E2N_X=!%_5u1F|)Tbg9u5gE$1ty)38-tQ0RaTxI+
zta{8PkH{+wY%e~C%7D?My#c>*EPZ0Z{lNAYQO5J~vfnMA96^Xn^AjX`1vJnqcz)s@
z$MpGQnqQ%AOVcxqB at QTi^JX2r%^Fze*Z4U2s(&k`A5rNbFaM*qHj~Baj3vP<^!`1X
zw_e(mNV)ly%CBc&ga?|`JT<12#ksnJ at DS5Nf3Ckj=?7|7LyW|g%#aaFRyemRX*%?M
zIzNbO7J^c-?U%zWMS+VXDIh4QuSVOpJ3!+Xs%i393d&7?H8WuRRv_^Vw9#pjw_tr+
z+1lF+J{<!3gg4g$7xK$}41^&_J_5`Qc|@c<KY#w at gc9!)xxhW<`C^oAI9E{*t*@`A
z1{ILVNr5BBE_E{!#FoT0O-nL!?b@}3M=B`F9y&Djzn??158gD1fZ2m%=iI&9PXh^2
z`YK^dG_9(yim<f4ZW<#-{D70)K~~n%%BpWH`9Q1It-pVMF^7lGaF{UR7MsNx{y~Od
zt_HV4QnwA;VHR=w*d2R%mdKI(vw`P|iacOL^5E7kmw}N8nQlhcb&!+GICt(}PyDXw
ziLVuJ)n^mfq5-kItR8?KQ3<t#@;piMVPa>_V(GetzkmKTq*Bf^aP6N8qZ^YfD=!bM
z at EY&x4}wIy{d-b<Vgx0l!M at 3#uw at -(Wt~&9sW^Iid9`WP3Vm(arZX%ZC$6J(3^8R5
zr)0w?m4BU*Mu3gu^hb*8*qd7c{gk3^|5%6-cMpzwn46o64n^}bIE)p~pnZW-6l4n^
zBmYD^Gy0E0<c>B8E`E&HMY0^O2ox6o>_?AkM5iedXpGNjy3uBae~FbVROr&>GzWyt
zHgd|X&(HK=Q}9w^=^D1}*g<h{q`rRGpAo}XfQJdA)pV2X)WiXMx@)S*MZi`n`on)F
zW at T*wRS at sIxIJqFE-ICFZCIt8K>G5bqN4c%OBaX_zcjrdw<c}wg;NAb;+ at 7t*ngpE
zY5{=}x40-jzq1j_dXmI2u}OIodYgCyPIi)$tN;4CWoIVZfd8K5!-;2+{?`Mov3C9X
zns49GNL6S)mtIXTFqoMK&mlJhI^jB}i-QT~f?UyQR^n<S=)sSVPu{$LzfU03AZr|y
zkI<`|m&vZF0CLvp+{=cB1}4LpY7qQckzxXUZ^ORkMC{okRKYPqE{hi{o=OyFq at TD_
zez*H4+h6uv<Ly1VGis-|UcO{Fz`qVxj57g=DdHA1OTtD7$i}l1_KOzLrnmJyJB}ST
zbD{weAQL*>(9Tbai|IENIUSgj_~<zchOJvgTo at DMd+)Al*RJ3T1F#Fc{T1=C6{dK4
z)&bNYtq_n%)=fNHPfNN`t>Cv}jLvRvU>*A at wx4so1f5-eqj_(iw&NyBWS(EyRP^kb
zv4+N0e?rhLbgU5xQ(O`^(QMeCh98cUWt&dTVkf6p6%{=c6r5aLg+Jl}=7|S*RmcZ?
z^X1Ef!G-^WA-+dj?;X%rBB3c3tlpua3)}oD!O_Hw6ieqB#tahldYTW{hWFl}lCVz1
z14eux=_ae%r{~x|IGB*px3PmT9hUp{?iION>BB9=B^UqYbn3NCc7$KJAUL`7-c7u#
z-kQMWdQ){SpxFEZ0AEgSZkGTHuJL?2(6CQpPh0ibbB9t;*@q8|q!@2ODTX(+Ux9#r
zOn<R2F*g6BF(ZNZsC+b8td5gSQVsmv|CwRokyka{g8lZoCEQt#6I?0(L=s^PuAt^{
zc=I$!xQO28|I4Z+0u&NCAq~^KOP8BU9Se&)e&r5b@%|a+55)&qW_3hsNtxEbfdF;s
zls??tv^%rBgN6(_0X?hvPe%*mVb=1$`Oxggk2i4pkfp`&h})O9VbrKmJkdNzQ8Q;M
zH{CieEF04NA`zWt5nE`If3#`aR%gBm;yw%zA^>Ho2o#*3fPF~VW39Ib%Si^tvN1q|
zfxCA*W-Jv|aztE6^s3BK at V&-R@<EgnUHB}p_N!o$64oMdH%QeYAG9ES%%?`=0y
zs<XRyKOoHt$fm0f1!<O!13X+Ww1t^rc=P5{LhjnND?}Mu)!VjijVHL1PLsb?+qP}t
zuW^%@4pP-cTfC9H2XW1xXmD1{-OXFK-o1T$eC`FCX?OT*qWSe-N*XwynxEHxQywId
znu1i|xdbFcq-CLzPe}eO!*v+7#o at hIZxlW4%0cujzec!RIcQ^$GH>z7Ph>}pSyaGz
z3nHt(8;T$ca*a4pnt at bIc*C{805(aF at G}n|GWzE##H$~kGBHs>0Ra at eT<Lq9(tnt~
zew4mT;JI at i6-TF%5sEZ2FtB*bn9-yE)PI{!^jPwSb1jKqAj0_0GZrj30;Ih!R6Q1d
z&4P8)6XhmSq-W2bk(<t&HOm7+9;UsHT?!4A at y*F2b_870(bmqne!VZm0Qfj~e$YbA
zce|>fyXfm%tS8IGl)p)%ylNKFl=*?a3dt7QNfgtmKALQ-j^nTah7f<|viCrT#k%rD
z3e?)RT6B;Y=7ILmp at r!;Z}e!B0)|O<!akEj2cQV>`>ooE&_7%_rbp}bBR?{SOR%JJ
z>r-jQJ$-szRlFOGdhbD&s(bbopA-qeefx at tLjtm|U2~=$fO?Xc^>lhQeah+SdRa2W
ze7<Y3M!r$^b903pf|4>d21lZDU?<OZ?Ikgz^&{caJ$mrq3r;)r#8>ceN)WflNqLkQ
z6|7OrglE7+NIMP8nu2dd8LxsW_4G*+iBfY2_7fE|KI+ at 97!p*_o)N(0&T$fd-gQb1
zpSp<b8Vq;Nf|Hm#nrpu)$V+^;(r|%88erOYoP~bmatix6`*#Dx*|b)kkRvhch$iv7
z*RN-I-%%VzpVbWS1^p$G1$P#m;?QG$Uj}v^K4i#9@<t#B9pnG}yQy8()CAV9v!4UN
z1tM%aYcmeL%I5$oUGHWqgxc$F at bH+p7%OkqK^&P!Bbk5FgHa#TrtPvhBdBR#UyoB&
zeS1pA%!#~{%%Bndhwx-OYE6Xf3#&v8Bz0>_2T9^=vUQ;~vwXsKe~`Q2jXfl0Jt+)3
zJ_(lV47NpaXAC3P^vy-=T_~7JkNQyVVi}>B+NFA7aKUGi6A}`h;5fU&wqP&>rTioZ
zcN#a?DM8CPJp;$!>$cieMq+rA at 3ocd9%DY?7!@9PBd5-tTZMO^d<qDy)0aSdJaL<+
zrzZ$2Z%tPU{2|ArN?;4B0-~(19D&!!Ya<wjhSxB$UOzsocInbLYkxpMd#lXVv%Ax0
z2^v$?r60UetR!@i-21#5M&j1Zo7h?#SX$}DBI@$@=VE>9BE<E=+v0^1|IjZblxIoF
zO7&1c4vL>=|8AS6^Xd=XCCNqs7Wg&$(Nnu%jQEH1l?(73Xh6RY(wjI^d`NLp-N;w)
z>k9z#md_3*13PoZaIZ}ZUlns*Wx9aEa`T5^K|6Hl at UW<;n-N%tZ&b?1xM1qcL>i6x
zgjWZr^yes=Pn5B~AQEx#|Ej!D)Z<7T<W*%%SNpX}yog#kJ!LjWj!Go%5o7XKaow@=
z503CreBHDUj<c{uJ6%(;z3FD8A$vjEGv6VRsPtL&J)Vm1S=Wc#&sp=UX0r*{cqsh`
zhiCxJ+ArzJfIOs)XVX?jmhZbb+bV|>FBJDKZxd%Ahw6xO;~^%eEqIMC>Jc)bS>Og{
z3y0j%<j3Oce+hzUN@<&Z{r?^Y at P7t8`QLl;m;vj>r;K2P(;I;9C8n5==Lkp^dzx)>
zdMSRiKtwZk<7l!6b)BE(GjIN1K!m{*Kpup|Br62n1dm*7Dm2ZCoy<~}Ue62-30aK{
z6W><eauP-o;vr`?Y}j%1q%4OQ!YBPqfm!yrev at y$#j7hhB?Umd&{Kl4$}1{di87^=
zB-S0pYS>)|ng$BiPPmGRTs^$K#O^*o#ZO?IeV+L*UR((a)35XpFAd60h$<}|4_(D%
zkACrLw_p4cuFEQ`1pELqYo at y2wv8mY4Qd_yjyRWj5Er+@w~`+DyxL&qSP*LzY5aD|
z^qe-8dLkG|o=CS8B#A3S!jqh<zkTCTuZ at w&Td(sbN~XS5dWv~0vZ|_&mX6f_+lcWJ
zVWFY_Jd>H)AYShu2;i{M&&yYmxRsf<Sw7N`#`fQ!qODuE{x~kk-(SH<Lz3A4Yn_eK
zIzp)7l_TkJD=C>@zFJauEIr-v*Z9y$H at 5VX^y(EkcB)3Gzw!C1)n*STd5ly^@%^2*
zetoM;g91Ay^yf1Uw?B4wI=vLFC*??oQc%>Z!UAQB at mv6WC!(JrvQt&NW>MNj?M+Qv
z8X_-3 at WgkpA4JKAwOHY|nLm;EZ5u^&-2C;w0@@|M>(Y=3X_)X=MA}wXn|{}(lKv1|
zQafQNA-W_g!<Q#kslnl;rE@*`2wYz=ZEI at _#2X3F5F<iG&qweHV}m+b#uoq|pk75g
z1^pC;#>UUkyU5AOA$x=TfDsved(VLbyv?WL;$mQJh|L$zpO at Zxd|YnympwE*Q;`>R
zGe)@Z6_9=ZewskZ5e~e6pH`HD<sM4O7kj38y=k;=e-#onEvH|o7U4mcEL-*rew2{2
ztcVzGD$W>b+qaqu+sG+`5yY>oOX=^LCF)63sfpN4Oy=t<BS*p)-P&kkov$%YUHhWy
z_|x9$(5 at -0z^~pD7DnCN-Q7KvP%t%>!s8>DCTF{^v%B#va*_KO^|rp1lV>V#Smccl
zj?5ag8@{xWyBpDLRQOSf3{+BqU|eR(cj&Ng%^I!rm4NVs5Zt%^t^1Dh{OSY__xAD{
zRn<e-`gxF#lYR`m%_l-aH<<_}fk^8BPhU%~+wmOGFL;J`8_s3mKqxPDYgAx)?QMxZ
z*P5i1M*jq%W at 5yV>fbE6!>L69_}7C!%3i%XLF!K$uJm*ZJJ>A9Z`HQ9ii*QU!mWB<
zmbfvnEl8vQgQ&kI*ALg}8U1?^r9j at CGtcVkBnXLkx@-{rE%eGy?nt#{m<FY=gHfM^
z5FDh6yQcBzdLZm<<@24uQdI8NzaaP>jDGmNV(oEdp9H?Z0dw&QLj&6r$S3j)nG}_c
za|L!RFGDFK1Rc0YbQNV;GFm9YOV1_K_ at CW(Z?ZxA{d4LsrO16uHlZ3`rA_=!!oyvE
zJ|OSxiaC)}2(rn-nLcRw5g>d6xyH?u-ISkdlpf7;-25GK+|BE+7Q7s&jt3>;TKngQ
z;86^6s3FZRJyR at m4@rRBOFDaw?Yb4;ey!WAjf~f{v=Egf$0?I1S5;Sst;@PWc7gaW
z>5t0pgzDi3k5 at nFXO$S-rCNVpmd~Lx8^}ELJD}H=#+7hU!y+x8uv_g=Xy}pZXVjuK
zV>!-A&s%`@P3`Z3eR<pK&q$8spwqwDJDuatfD>h}L*`~O+q{545EXnm{c$c8n=FW9
z8A=;(^CiQNeq83HD!w>*$p%coH6X=W19#k^W5;{h*?IZ->aox-_7)NQoYUy-x((o2
zx at nmZ;Pp89PwSV>C+g{wCyabes7og?)Vb_7=#wb6ZM#AOP^uYkQz5E9Ji`2q=(T|b
z7M8fim#&ERCJv>rHS^uQ-nO<6 at god`%@hfeBWAe~2V_ at nl`{O`vHSgz at t-w6#KK_7
z{a&NoA&CX=+*u}_RaqI at HsWH_dAL9EB%BKUWjoczI7}0B2(=5oBWO})U~WOF`NGyO
zv7@*4j<m}A6L*(hG|S5#UApXnWY0|9zc<~?$w{WqX71KoIXR*~r2ihmuP4u*t-Hx`
zle=8c921bplOY-O&k)bz5rIL$!AwTeDlxfa^`*2FRM>X35-}n7=9Zmwkkz$y9%V^!
z%QpR){z-dIMciG;(18hqDDp)OUr~t=E_Xoj`WDU#zAX8Pr?#Hf_3M%S5~`<V=SmmY
z9J^MP4L8T;=RFOrmez-suI-xgKQyK+KkiiZFa~G>6_vAhD}ll{tX>VFt>f=>;BN1_
zA)O7GY6%y{;t_sFFRR|hM-C%-z+|(RkB^BU9Zo+m90vV8T5zcysjj~1Tt&W0_X&L|
zyWz}ro`Glq78?o!?GQ=VF6}~zc=&RAfi6MRo&uBslLZs5Ws+$?R;8s?A*7;5tOUK8
zI(@p(E?_*bR9iEa-nnX(Xo`86nLf*x>;AB`u_>StJzy#9Va?39IS)y->7#OZ@<TIp
z68$5vmWS8A<Sf8aaly#nZ0krV0|N!;f195l0PAogql@?mc&FcLYNVHsk{qXlnnNF@
zz;&gX|KwLA22y|qD1w%6SL--nKmrgA+2TEh?{GT>IzZK7*RIdhS4fR2ey6o4T^B9a
zsnff`K8yk6yDt%{r!1O)10j!l6Ik~4?Q^^Xsfh{s3%>w!UC7wh&N_D9?ZRtp3(b5W
z$TvEf;8`l4ozwem$J=l_`X{8pRi~s0|E{TIf*FN1H6WG;!KVluHGX>A*3u`J$`GU{
z@&QA8QWfYAW%~ZKOm6eNv<a4=gv(1V|755A%d?OnT3aT&X*0q(+~=NXNolNF!N1t5
z*O``q#>^jFjMCW7>;bPrF9cSiDZpd=A!H_hVkOU?A9>RLIUkXx5e+d at m9&E7c)A4-
zMjaFjG0W0Y_ID>0Xl0km-q48Cy?b%8osPyYGGzEPy*qan6JxQmptQE3;!2EUY5p+l
zsyKQ-gE|S*Af^42wkZ-cf&l&x40nnLRIqv*x;<i5VMAT;-ZR|e_Au^<Xa5LG!O}n+
zwe}^qA3*2My?d#3-8}Fn_V&dr6K)d)0~kDLoYFeeN_MvT<wKM8BfQMhqOfBkZHJ?N
ziOgWrwlSlpS%6uR=%^w2vv^Z0-{j=G(w%O7T`ZZ6tlzmu_wM1{2d2b;CMv%sx$k=X
z6dkgkHw!^^HlsQh(Yu>>?gT`Ppp?7d@&{~R at fG1wDR@vo$kmJ9x38O`qD^V|ys8lc
zb!tz7UCw&4RB1ryBtEVEMC?0 at xo?Y(KH*AH(Z1hLAznlnU0Ju!=(%qY3FW$T0jRc$
zd7-gzt2^yGfjy(Q=U(Z?XuN(X;6r-)7XZGS&TF=nf%5!w|0f+mocL6!V|@GbuMK>H
zzF->%5KbJ0#!%?MG3>j^5l&XVR2p^d*-EX at N!Z)l+O at FOszP6ri$c$LQUc6a(t4Sl
z|CqX%C;19;rW4;)FKwI at S!&tOnyCubzf$&GDr!J)_C#-*F08^k2i?TyXo`YBVq?3w
z#XojpNF%q+BaY-E-7!^x+rMv9zxPO3?9nn^zwQ0!w-4*`_cz)a`*iKC^$p#w6TToV
zGk*o0I?tZrz}NNtn|~N6?Y=dl*MlWt_0b`@UAv2B8jdC2diF_pLdo85bvyQ@!oSCI
zN)C1E{i=U+3Z#kmKa0_CL-h2fhgQ?F^>KRuKD|CYqcqM&>&Mlt&>d{1*D-Zz*XA8q
zH=U7bhXVowwN1?JI_%MZK6xFu7iXyJad(CV)-Da6)X(O9b<B-34H%#EGEL*0|J_a$
z-e8_8t^cw|d*r5CUE{V<;2BX<n^t}JM%sjwFSxDy=k5FV^fK=E7xK<YAqLytzc`hc
zDCFyoJLBY(M)hU@<HCd!8lj1oZ_l&)J1%&_(ji*IXr$IZUG!M#-&}xU?VuRmOb<uw
zCwF;Z#|eD}ev+&#H}UV^w>Z7U6VYl+b8;dycy4wAr==aC`TD{oS=ZX7b2T$3*j?9j
z0dTWVB>bGU`rYyW+VM1 at G{3HBVDyr(tp{1+NjV1*1tNGleiw$Arec82r`#P>i`{Jk
zCijS(@~*Pd(xR!CY0ON~%XE6&{;ll~;X6+LRizOsIL0}*?(A$_zjm!neZ~3>dWZbc
zjZa&?8|e1=0*7Z|`Z$(_^MuG;&i#$G<@tSUGie>szI at 0|?ekL~LHyaPyTG)kiVDo8
zS*X{jXPYFc)cQ?hOA41yyxMVA5BcjU!|eNy9J&8W1F`zDA^pC$KQ-r6=+EQM_(1~g
z0SRB}rg$>0j%$sbnK|72XGnN{yQ!KkI8-5xQyqxA^HV}dclyS4Th_{J(2z6sjMK=d
zrz2>Mf|@r?(D7%u)i}<W(fQdfiyI~j#-Hjp+9RP|N41?Pc}0n`_BPu$dEdQrXL6El
z85Wn;p&);^qO{b|<9iloP1tC%r|Vn4xie?j;Ghhb|3;~qS-3hq?FCgNahmoBt#zpA
zZOHhA9g0Y<V^F+8DDe5#hg+uYAM%$wGCr0{rQw$GG#M=zM6K99RQq|a9^@d&o1cgh
zi?(-LX>F3A(mq+ehUQ5sZ%Ph;Z6gmX-2hQB`R3Jm&(^gx5tA6Q<98X=y&Pb77Bpo;
z$GNXpJN|6-e04-<`0F;gx~Q5Z1umCy(5PfqM4LDH?PNTxKDS5$%qKl{*^3g7%%+m5
zG%;;kc0yKN>u6_{$vNefl_eL}O`JA#xWnTcH{N1*)&`#Z%Ll7Hb5QqP$7**{C{Ff%
zE(kwWc7G||3H$o|kcNS$L7KVaQSE^yXZDia)i+!gFtKx?=;rbnt at 3>J=;+C^?&gDa
zOttzd2VEFW(}9ATTAI03i9$k*QPT6cV5zpty6Q74UpQ2?bfIow)u>bV;w!C(Cl>x7
zZnNuTsHeAk-o#NxM%s#Q9HIbNS4pF->cIwztDs3Y1QsQKv~8pv>2apfk3=B`{n+2F
z_q3{tVNW7be?2_(bxO!)8yE7%k4I;ITY12 at XIj|aolYZOQXD$^DrD_DVAF-sR{<#v
zdhU*D^>PrBhs6UPf)^G1z6A#PWNtRi-;fpkaysYyC2nv(Ey5#>EPD{dV!OTd&JGdb
zR6d+$-z4xzdEDZM*<Ov=iia=Rh7j&=?VYYYrz$S^l*iyvx*kbTKC6ot?P}9}k}5e#
z(`@>W8FOfkMhtv|%2iR-z#G<wq at R!f=EhN&?H3EDjDSqXei>m72tiZiJ3i<1uo)W8
zwjEM#<>iG;oz#OGjL^;5Ms7>T#{>%kw@=J4b{oSrJW7dh!h{JQAK6+FW9$$G8?ifU
zg&gO{<C|Ghw_Cy_5tg5<7?rH>=f~s~w&O?4ZNFSDpMyv?cGO8Jz=DCT78V3b6kC&T
zyb2#sw-WQpUOQ+|otVv9kj`Fkgj?>;P(SE-yd|vSUc;B~&*|KvT^Y~8JN1o4Y&P-n
zHHd3Za&#SvRUfo6onLi~+(kQU;@&?Ymhp4v+xPssv47Hv0dH~SA0Q>qG5QKc=@N`s
zP}{=gT_kQ>EgfYU;1EC;sfE=0kN2n>&O<M)!V7t{exOuby#v5hcJO|O!*n{H?tOmz
zw%m2hYOTEvU;R-9EvDM27Ht|l7tu%MZrvtYbm>3EdP(Gzvu&DN!)mj>huM9F56HB^
zi*;ckcC8zK$IVOv9Ps<E?O%g^v}@R(%c2AZ!gFoqH#hke#e;zGyY=d&s~AB22*jeH
z{^vRkBjg8B8iS=kvO>*&x2E}#K<A=ZGRfzarrNLCv|BpIWAwxAZ<Lr-G5UOAc(`EY
z5~wNW6NVV7gjaf+?0J;jg-Hir$rw(3IYadI2c at dz1<n#*SvxPATiMx5$)GIOlO#ft
zoM|rv2`nd1R at WGQ<Cr;x1|y>=L3?J4Q>P_D9Y#;DOXrhv=XyQ=mcpJ^*4U at a95j5c
zqZRCv6TQ!CJ(S*Zm^5wL;+OZ5d!RO#vqZav;-YBXK}@m6$b)cTo+0j?V~7CWmrg0t
zf5C!=e+#?;Q(Q!nl$tAB&2~_FvD(GP?Zgx;ZqNQrti*~G&5T9o`o#+RAbkfIbNnCT
z#7_X;I2nY`BoCD8p3EL;W_RP3Gh|?kLle&b^f;4hY~uQ$DzNSIi}}e5jIZJxnZ3GQ
z!=?jK#M5==YKn^bjCX`WuJQE5f^oD+o*C7-g+%S^n#=z$-EN3)T8JX6?5=v`3PCI_
z7!5-?a=hU<RI<l(MwcX4ua at deXGqwQ09R3C+>~l>f!R<jc(gp3plI#^!xiPn`utwB
z2AoT-T|1`_f5PkRVB#$c@$b4N_C$ZE&;PBzt;O)a$8AK3Ec?FdKHb@|_f at au^r>4p
z`#F?HTP_nPHVY*S(Tclh!GblEMsaE>J-Yi^12aCkAalTS`oDVTlsf5`T`)fET3D4#
zf5{7nLzN%>Km!qb%x>IX+LrZjSZn^7W-K7Y&sh+TxLZ#*FvsR;@b0*~1ERh4q3sbd
z0}E~;gol}179moqIaP~b2+8)}4^Q-oJfB<FG}R>SUNxlW(5JIE{%0HAmeAENcP)Qz
zyHg|E<PL2YOd?{6&el!i`zfM3O?M_=1}mOQc_xBoYBDY^R5Iv6u<ZNVZWTScV<=)m
z4HHR5+T7Xmhte*p_6202=-Pl5t)36cHQ)g`uq$3%jA-!SJY{E_MckShdBoXqOL9I{
zOGCrdue*cZfA&1K;&w_7f>F7Lt7i2$*ODm-ZsTmWzaKVv&?xmKJ%rSq{hT>4rZ>Wm
zrPqyfns+u~zl_<kDuYuiS!xymCYXHt_VCbk(u;|h0}=s`ZVrgwxBIs~jep=BvrMJR
zzV$6&bo3L=k2}{Vj3GY at n1l;$ICg%5{Q<+kKEL~Q7E_IAR4={n$Tj)EEGY)Wz}~D*
zX8A;KAm9+`PyVEXg<(Ry;J`DQ$f&fRqVci%&sShDJd1z!vu6iV+a0y at dpanW(Tj?`
zdfjdKL6zg&*|WD!TUooGY%S|QsbPt7*PqJo#1VK_m0S%%o)mdG at 9e$X-y-8`4~8(Y
zL`PQ_ZP;vD22qCPY at tty3+Y*{k9hy#FnwAPfdk<IIUwW>dQ==(q<Pt=A!=R^Xs|P?
zB2R(<f>h9xh5FBdnq6&)4C(cnwJ7jl^0pV at PUln~-B=kRdUhgyrP>YJ`f(5KSEc&;
zAT9_Md?H%gb_S9$RXU1K{&B(H3`-E*B7eISA0MiTcEnkUC066YM$I#UeJ;6dq<C|B
z^=osDQwVW?|9*&kf#IxRN1%p(o-B!O-?OK$+wv7Fp2)lT?8sSkilo&|Sk2@&cJZ|S
z(4d&?n3b6`XtlBL-qF?%ScSa at LjXlKU|{I+vRIG1$3MR$QD<uq<bZS4dH8TiqGH{q
z=b=-3g&;UXO22n at 9~2`%)h%MNy*eewC-rkq=r7uYwY3Xqb6YswNmTa;Nut$${*zgY
zvM#lc)Wx=xwFj0g7MDS&MDGp#Ne)aGamu6#ZMxoWldF&qT$yvQ+fN#0mKWS3gIxCh
zxzE;*dtGF)8a;YY`y(Nw>*^<V9hl)at$sX?57DH|!j{&NwANjkM+ZU7G-JT%nQ!&N
z#latQTSqPNLhIS?wcVp8l+Nh#uUlVHafiaWl$aU4CV<y%qG37t)kRG>C{_Ey|36wD
z*ZqAm@;#1pmUmdH<;}$|ROS^&k4T>lJ87XQn8bv8$Lu>W4Q1B4HkY&m-*2u47g_$e
zgy3mq$>qo$YRmeZm3v4*8DM<QuX7Y_2WY_iM&W1sm+Y>$8jqYZpvYJ|8Fapudry9^
z9xLE!)a^+3;r|g_$ad_gq&-^Ve&WKU!h`#3>AQLQMD;<&YtNhVh9hKt*M4DG at ZKpp
zx$N+U!y!e8APZ0UB%OHh)Nh!;YrlH5g386k>eQJk@|q6s)-bH#!8<2g^`k;$zxFyt
zwy=|}`g6rFtlxY3O6e}3flnbHWag3UfMLV-9O~am#bDC2!yDeUeenA&(AN`rL>2e!
zJ-FA-l)~=v6L*0ktmO8x)sFzs1G1@%9q{n{BOh^-LOB3a>ijEF{xs$=f+nJLgeih8
zNP##rEZE+ at 4ti<>2u%INb}{{jU;lv(CLxus?5C?c#rV>j$P>49OxC=7rS18r{=$Tr
z6N>sAe$ekst>5z-H~i+<h#n32Jy3Wh4m*oJoI~XQ<om at C3mi*lE!X at Amr$PGt|yCs
zGdpOn9}Ba at +xv2VjZ`yYDSUOnQU<-lY8_pZEf0<X-$Vg;&!XZ+WGS5-#gCRboNu$!
z8wLdD6F}W<u*%JECU>^i at w!F8 at TYz!-#Pz}zUD5c<@={V*d)F?UNz0|%=9pY9hSSA
z3KZI#GBUC4 at FC)7wRa^BAd~?NoGX>S<y799)<UXIyfwtYApFjvkNab`VtaM|wCerf
zMb(t6Z|ousJO>VbO_;SjBS at ADGr@u=I7lxuZ>e?io1ar`4ouGmRU|Ti12fJ7GF|xT
z`zVm5PmZK;J~dK*oBy<E6V;wQbFcXPtajO3ffDO3+0)_B08d^@$Cq)u(1|IWo9!}e
z$PlN#UR>QVh%>oI!TS6LDblCm;?^<<uf_5oFIm0;ZYY**jX=*)x9CMEc5K>u3$77q
zn98nneIY%2?V3Q{n=43eOw0z&v|Gll2%G9`Lmg9T at i2M{H4l5*gaie3xYY9kWgAZ1
z>29K7gECT=85?c)r;Pjicfa;)5*JY!;?9F8PPTxifZ|DPK)~ckO+pP~zQvSDA}ldO
z^WU9Ldzy4=_g!mEW^`S>e*JHMxIxz^JkW|yOq`T7O!hEG$oh7QzH6=Z+^1X~Xo(T2
z?wCAS2nzXBE8^{T2Y%bwU+Y!-3mSLt-J|+;<FEnq1TN(Kw1r5p$mQhe(|u#<9F6!n
z#~lr`6E~f=ASCnoCViDn#AI>;yOkRW@;|DIxyY3kq78-8ooo;;evQu8Lzsy(nZ>I&
zYgE3>%GzpoevW})Xs14uWiHO?!D1E>BLJl at n2S1mRP>~N7uS{ry2+qi0|hPV at m5)A
zvv$AIuV1~|M_b#nZ1~1!1DK3(%Lu(mo8&Ui(uv8{`)T7&?2^!@=PuXB$9r at Zoj|9I
zQT7_VX*b#SN2TEjry?Tk;H)qHogBQ`=GN~cr(i1@$8T_Vw|m>C5#P8$*2;qXhxpW-
zLYaR#Fj|q*0Xg}Ji$@hp{(uPjTwHkPC4ppNGSiv&_(Oks+YMMjUNrvZ>fO3O5Uuv(
z4nulP{nV2>+{er-TrZ6+eQrjak6X_$m$RR{9(i(f=mU1buHc9#&gW)NL`{y{6awG9
zV6wIHWHgVBLWe}XSnYkdDMj9M=e*o~a_qNVH#Ph+JYcuSe`ea;BnQ9vpTB-7LK+V;
zDC{F?=l>-xcuN0;BR24odr)cEbB9a=Ne?%*nfm(r=fBlax6y)m@`Sd3MS$aJVqSqw
zoHxDHJ&P8)xVTpoXu4ct?BSRZX|Ktz17}g#(CX~YqNB}H_=a?!y6gM}C+QjZY_Rm2
zUwb-WnLhZjVzvgZ%3AwuX<gP?J+i1Tj~mEpq$~HH+Z?tjJSw-VG!g8J9PPQYj9i$0
zpwr(j<U5eaXy?08B9xa6pIK>s+SAy3(+|~dHw%Y**XLQCXx)0bug%8^TPMkBI|rQf
z^}4-3vGbLM22mC#CmeUOI<vr_Bw%R!r~z&U6He~y-gBw$z(AGGO4ePqw#I6-yY!{^
zI at 8}@Z63GY;Ia4nkA~|HE*dYnZ<zaW)Ucw1qmDjWW&4w?xUgd*C#&#s8fO$kX4RS~
zWOjbL+ at qJ`f^B{bIt|xKZh+QNsW#n;-CT>lV+T-S+8!_6m)Evaukw!{bq(%^m0!5{
zzF_6D<Bj7kDXuT-YBf0$>Y8P@{@WCyy{iMZr!pe*RPr`KbWK*=9=M@#wU<d)_y^y)
z*LjbmDQEz%Sre*E*ZZ3BeRaD`?s0X0c1ZY)sd0 at obPkNLteEkH09@%xwxa_wT9v1=
z=z@?+!?(8<a|Jy<&n>L`HloCH-1V&mFD{44o79<I|N9Z4&7|EqUCj4KM%vZnBv)4E
zklz~UDypiEak?r=x(#A+W8FSvqh^k2nF1aVHP?@(?Q`ox$4cwBPH+Fq^qij0uzBr4
za8pa8zMq&*%__6@=`!<n6yWG+AMH_wvP8i+89xPZY)a2z^Y?`3-++l1fA65NN80+5
z@>j2{BWC!x6udA=dQ`NMmIDX{vs~|-EAdKUmZ<qyAuX|KlhsYo2K)SFsV)VsHWTCr
zt=l*$r at Pc<LXs5Sw7E}v&|gW=`$+HLo;^n$U<4B&On1vOc)*eyea|RS`Ouh`X7S0$
zEihjBI at 8?s^oZ4`J1hZkplkC{x6$j%L)`Y(P at bQuxxF;w&yI)RLgRGXzKt5-5^h;W
zs3N3$2SF98mbH`i57YM at n)Fq!s~xR^6CE92l1D=|E+rx;IG at LZTV1?suSD$^OH0k*
zD&h%ra8PQ%y%>Vo(E at rIiedb|EQ}O?Bp^Hdw at z2tihBePqA}^Z%KN*KqTPX5Hs0nZ
z;5RbgzX32X#LFll2JCn>Fd~Orh8p#1vKqSW_LTssGWPgTrSsP9dk4?+0@|Pv1VBiz
zU};Q_Pw;??N~QP$&p}|#_&fUQ;(jnIGk%$KrJ#?%`)&MHltt^;^n)YwA)RwdoS?-D
zD&^k04;~;d^;H=EsQaIo6`(aHblpY(Q4&#(&+Php)O{;%igcX8Rfaba6b1y7K5#sq
z!I19oAE5?@?(x)T4TcSal6aI^SwI)CujyHb&h<<XT7syGEhoKzR)DXu)sAQy&_c?9
z5_=_n&D<Z{ni&TZ+tJWZzjGf=ubj9CrU%WB6ceOi3M)HkO^tf3$*8e=7G5OfWDCg)
zUs`@6l|YsoGGQhQUtjO7ej{AVR(iYPY3!xVHswC&MpNqIr=oi=+GNm*ASiv6Io=#<
zc8yYkRkzDq8vl?)LjlohD1vPXCxx((&~!SL_o^ytnfs#-JCh|e2l?8o{sLK+Rc9}g
z7n`2U$bi`2p<TOytNyAkKjM=1n2mR*;Rez}h1ymA#Bxh(dWI<xh99n*9TpX(J?Js3
z4~GIJ$nXor#E#^A%TSg3 at PTQe=>;9iH@>t#y?7^C4s8+CvgR{0%%f!E5{T*GDw>P$
z@%AOaHy4-YYgAP1NzeS{hAF5_VAPR|-4Hkq9JpC8j;hacKb3LomuZI1w4kX~BwfVR
z$D%Uo0QL(y5OZT5VEy+UK3pU~^wi)MDmWxo8Sa+xywx7TzN-9dHn1q+T49{q>_4l$
zjKjjqKl#>!y#@yaY-D_kg8B8f(G0M)7(X5g$w{iI1>=&?WD=7VwOZPdR6@&0RJ51O
zw{|(^w%$nGYB6HKqWgm at XOD{7=57_kWQ#5z88!Ijiz&VHTpIZv`f)&GHxmj%IOWpM
zmT!pk;tpK2qsD&u%9V-1-8(nKIKI9TNCKrDkisLLzF4rw8bMWMQ)PVqY;sLtif{Q7
zdy_2X!uYE3ONXg1j_`yD+uxm`Fe57Bbu;Ec&*Uh;l^DagHewht%<TUCY2TA5PZESV
z9_g5LBXW9s>@NYLQvIKt7?r_uu0bnH&RpB at aSv#Lb$lC2^iNsftSyZUrKG5N3@^^r
zy4hRXb=fjwURWq?MC9np+i_93SUD+H(Ob at 2n(mF|&YXTf-|vy1+lgR>Yb7Nn^zv4I
z(4Cs_JI-d`rLuM3I+Pi9Wfv+tFb?CyWy_$(8Oei(4n3*pm_$Q&f!vn3yPTmy?`N1F
zt$7wITDDDCk=IbyxG8HmS~@3#=l;GWZ(48dUHyd_KQ+*aQNMr<q++ywDY1<-%LIl4
zx+pA(RqObn9W+OKOz~4o-gDCMapRFgfoG#i^?L_?EH59pIVw8Zl+RK+5w*biUowAx
zMkR>i3?F+-VR`qa5m`V9hUpHsOb at E<>KF9zyUb5S2Xg8i9_<bf2o9Durh?_obY9p)
zt7Z2t8^iR;I&^$m$3UrYNH3+|0BA%zf6Kl*B_%!(P3`W=5-}p^XL<Tw%KNgiGxUN4
zPBXH0 at bdbF!bkL`%_U$E4<4*yiwopTB3A#Y-&lBDp^Qsek3yTMBIQSjiF@(#M+}xQ
zmJGj_`n*U1VTxZ{_a`JQiQiGa at 7Rvb)p&ifv{{YqP9uUe_3-Embz|)+;s{Q5{<`zC
z=I0KpsZ$5}7|n3S><|-T9h4eo=EnV+F{!9*{aAT6YQ&{7(1|$pSuSqaxQ$&FO&C9(
z5_!a|6Ff3`yIy($vyf;^DM%<+a&dKiLSKjFlzHm;b8_b%d_BO0$V{j-ymMrzZT#JA
zt9~w+`^}h<f*>Ww1Q at c2RH#u6qC4luPSP4tHoy1B$=SIS01ujbX}sl<$x#Nbr>KlS
zN!fG7 at bR}Jhb-nyt-{X0#<x5^F(N#)*J#fZ^hvm#rE0W at Y8`^ZO34njrU$3(?q`)(
zA at h^^b&D1)0v$`k5~t_PMb;`})_g6!U;;DIW)o3tBfR6#8QKx?J=?(o0 at I`Lkm72Q
zyp7{8phASUppL_{2ie8Bvn}YEu4XuRGv0$aNG_Q%8L5Rv21*cff%h#2kX*C~{0%|%
z3ytZd%_;Ay^8y7l4!?wgv{3T}@tiqxFN|Z at 0DRGKz`^F?B`*G&`YvqG9uF7|ux{vg
z=I at Y`kD-JKYE3P>9Qp;OAm>2)bd|}|rX8la4ek+qQYvIne9wX5EGtN#<*!zI2X=+%
zE$7n`%@&M*0YD8qZ{wy-KPn#5Sejl_)k-^=cftIoVd${T0Uy>n#6{y}t|S?Fc`b|7
z6of#2jJYcD`Y>oks%=Nesc<>q8z#S;{9|i2WP#vd=JV7LcTlfapSKTvv)bxvm7&gl
zQ5K8NBu;Crc{#r#Rcr6uOB)91>sRB9D9G_8mh(fAhr9bHN|zM1?7oFbjem^}d(<d%
z;m<vAZZs*yPfCOI-tKB`X4hjQ{VExsDd<q5>Sm4}0V<n!R6EUI52f|hc)Ep#^q*VX
z$~Q3d-ErD0->rLZ2G5%=SZKgztzngO%G;|$;aJtm<CFMFNN2$#m$)u=G&a5jtZ=8P
z+uXNuC*1j^qV<eW>5 at Vz{Rn5zo!e*JOT1WNPyQzF5vd6!&D7LScxE1sADEq)$m1D=
zg at l}dkEnhF(2KU30Um<DFG(Il6JJaynX^_`Sv-|cOlW#D$wH^WD4017q}LNVqBljG
zZRRt6J;du*I5I-BLKOiDbS&6c{nerY-Aq&P)*C6l&t+D{F9N>!@I#@!(5fWyr5awe
zW~q3?U<DqtE}g(>6_pP_5k7mAE^5W^-n<b~Uh|ro+OG}_6)y(et><XU7?9RF(PPbc
zfxiNLnwCzo=-<uYW^GvHrmz3)Z at qIfIRK55oUBG!7Ot%jbF8rOyL<oNT!5?seANB}
zDaL+G{k{)ZqO6mQ at 8d+{SR>ATNh$AIC~5+HmuKr9eklB>7~W#yo%r5bQZ9v!4Uq-@
zE^{NzE-aLZaUrJol~hg>rp>^vzmhr(e2ry=UEqWC4i~O$*Ud!2Q4p*6W5>KaJsHtc
z1eW#LKPHq|H=8#3K|?SIYi~=;dV at 1?0()=S(ugt56+5P6E0qfQLM)bUb0_oK9SfyU
zpK1_|{)4C~)7zBHFOyYJB%;TxfB*h#ceIh*+TFCGPUWD4n*hjQ`|j#FV%lf>;GOtn
z%CQIF#wsfdT`Ejgr|v`OQThh{y at iP6dA^KqXkRGc63O4S at P~vhf;xTDs}?To>oM|H
z5@;g5i<mwFyj6KIV=<u!Z<jNSwsU6$!@68J+EQ|KJcm;vY4ZvBwF_8Om`;rOWGS)>
zNzD88drJiX^a}|<UWaKb>({KIvlQQ-Dc-#^WIX=*`ge|q;M29M0-dhX-OzwO2SbxG
zDe)7pVZ%6ID5Rj!22GL^UAC)}Bv at 7utR>yki0_PabaHRs-jUF at GLrfk(X>D;dyRa>
zlr(Cklu0R`FdME8i at SDWTge2`4=Rz!NpX(!;QJ}S!5JmrGR%s=W*21%d_IJ061U|f
z6|}!2%OXbOK0hMUd>Q$?Zln at eVIgabAky=bm&=LGGe`}=KjF$9h>D^ZavEn{a6oKR
zVfW^Tjis-JJ}K(Z$lREHw*Tr#0TBtKdCUz*SCgoXtb-7X*bVc0T&gWTX>xDTsVf;`
zf!Q5AaA0 at z^wQJQpPziy_>eS}1{PivNfWFw)162|&QnYyXs2coZfqn;oYvH>aP<|c
z$!iGUu#S`p_82RN!&6kJNUEvnf?5}{(aa<4jd3MkW}G{x<*j&c#CgSgj}&S)1G|ct
z5dIyOsS??@|J+~FynpSlyL(4 at c{1g_y!8-aKrur0ENUi_0vITCGP6}X7&yDQDD~<k
zqGQ70D at eKF1$ipi*SImEyDk2D?!W#zZth*O9?&XX58XrwDK(vTfbrrl5tCvUP>xzk
zI*9)y;}_>jz4=_V6upjIu%cwUWt4Q+-rkxsWa!ZLa&idInGi$J3ne<M*lX%qlYXj*
z1AV<&k7K*}5$j3U7r`xdTeV8hV`O3&RV*gpyur)xiX#jSUoa<r_wL;_$2b<gN1FRe
z##JGlME`asSBE%s?d=wyLewG-g at g=QaIF>df9Xr4VP4A+fJAKUq6y8H=QXaCn`Z7$
zz4vkAjB%e=$4mv!5AgSA;t{2>6ndq at qc)aB%p&@lg<OZndP$$2%^TB>nrZ{?jur*t
z=0P61dF_!Apt_BR$KnBJBL@?Nq8i`gsDQ5TVQoX2<d-GcLckb~Q&)4Lx`Zwz?>vt4
zDc8O|9Dm}CI1U5UQeszLAFP-{n|Sb=z@`iI_8d?END$@?!E@<n`xtrh2H3AO_U?in
z4JDcz_8%9Q8_}01j~URkuYFF#*JIRsJ9QHVk=fdIvUcnPZo*%aNumu&(gmbCkB(mQ
zU?Lf+cj7><-(@1tnbQA_W)x3DyDY)S01w at ezkqmY2}GwC{DSYzvbH|aytA#^v|*cP
zelC}o?P$6SX48O%XTu*<Fpsirqo)sKM35vHp8)}Ph?WFVmAl5|!wchDN)9#e?I>F5
zP3ev#tbzIyVXWM}6 at SNZ1%p3v_AGK)P8iuZ at 101SvBG)aBRprwRBkqU&9L-QWNmR_
z;a>|}IjR&22#P3_;Jlh|JhxX+ at j(j3Dg4y at o=+GleF at QJSixiw9H(&z`*v4TI~*2v
zidj++aM`@z?nAFp!bKwhw1*EFlid6v)u4aAIOP(A=o4GOm2Hy>(TZb9%!Wnx*sviJ
z8t#8=Ewx#(zS_H+w{|F^8}T-y5S at fIeqrHQ!><KadXtkPse%%-A(Q{$z=#J=o{Yl8
zlROBk8X<a;*%>iWj#wI2Jw<1AuIw~QmpBEgdfk<jzCT at -UiR)?8p9 at tjM#0sed0tW
zc5hy<v9!x7I5Tilkmrn*rKS*5NF>0$kc$&HmMS62 at ItJN5+vG0lf}N;HXW&$Rj|y)
zFhi9X7YS_*-n%4jqKmMKbX*b1V`8wk!T>ND(bz!ZY0~tjc_~01Sf+OBJaJWZu3oNc
zr{KS85<dbmz%}~^?Iz9#TC_HqB;`4(s*>=ard6tOqnO8GUzr#44>SPYaELa|B=|?H
zw;UH2x)4NYYwM8kbggD{Jg{YxCn%qe$Q*hjehTm|nVzwBN6Wt4So%KM+iH+Z6!nDU
zC1hlLCof3%o>=6 at W?zsO%`3mSyz$}n>u+8*{yF#j<kkHQ4TCUO at h^XkrY9v7maP~c
z!QDT2uonl*x3SqWjuFaT-5kBu{Q%dFKsI~+`fA;kngT112PR`Tmp4E5CNVlm#{1Gz
z;P17x42hH3ykPq%YJm=ARp;oChlUv|Up8yr<Tr2LfT%&fB#b&w??C^lQA{x(z`#gV
zRo`wZ&7XZ7?i^spPk}bG_#~}~NAgBATXmd{8o)k)0QF09LD3budi7Tkx$Ww7wL{=%
zp-%Mc1VYf%MK{pl0ihDB-Ytr~f+B(A)#)0DG2|v04H@#4vyJn8wN3Q<OC(174j!zJ
zZlqSIeow1qw&*2h_jrXvh;yQ@&cz4Fao2Kew$4|BnxlmEgZX5prdwdvW0E+MuNnbS
z7(dugQ<I?x4e|Tt!+P(;RM=`mf?+o4Y8}xpJ&-FQaDCtM=lvEkZ!vD&L)WYa>5Y(O
zZT8q=4D#T?EB|AU3GsyEyA|AYxYp|!7-S%)IdbHAHk->Io`Qk+&xj1EcZxM2NRSOx
z=ofzVPfIq)>0tBi-+{k6gKi4M$7Y}V)f=GkKerd!`@gpL<Huf#icEFxk8KX_*tA1Z
zA^UI|@kW@%1-<X>A382c>ccE;oKpT4C$lnyP>>AZ@@X+-fFK9L&fJsE+i(`}A4n-M
zB)(Nc7PzgsT6Z_v)YQZz^Tq)b*uX!yQS-U+R^5Iwi5M2u_s+cty#<R3&8`*16j0NF
z)@Y)L{{h&B_}MCQD5#sr`ELBXmG&nh0ZxtBtZiaeA;<~}jG|IfwyQ%^bT-5s5bhAY
z_V04ZNnd1crn_y5hq{a;_?htC*RI7CQTUy6!bvm_`YDj|?Pk^ot+?{?`-YjA_2iY$
z;kg8+mzap?N(Q?^RO|KWOwn83!tmB7E8osu?+<xQnX2>k1IY7`9yCnbF?s$>-3LsP
zM|s`?82t1#Q4TmH#_pb!LH$YlH$f))Uct<^<t at m_MfWi$YIRaivoaJDhD_r${w97f
zm|F*?NbSvNXIqKWb3#GHM|10!((g&2leccPZyIbWYK=8S<DS)T0~BI$NCKon*SOn7
zi4^gVt0RRD5SVq8t`Iw5{lMPm?Pw(#GSf2t)XY=|qNcJzc|a?8;EWZ|W=7AD at d}BI
zWNu#$41;&rZ}WDbYXX;N1~6a_7b(W;RjuaLkwl6@!g`M;fSBckHWF(kyy=WRp`Fb^
zP4c)^Bzzzdd2^(`YTyPV2r<D1gdnVn;YB<$w~_&xivMw9tvix=2HR2=De-*Maq3=g
z(kXXUImy-YO3~KGM$2w<#%$v!8DYGZ1`M^>7B#mR=#AsS%adEMn>3q>F8Koo=Fl`w
z2r|CtmV7JEBjR-*Q&&5D>8?)tWkg+d#<XfF8RCr7RvG-0jEAxS-7n<^YG%q5X8skp
z1O`@DRo%(Sf#G~OC<uW?aiR?zr(0X+(N=Zr(ny)^T|sy9MMV}e!Y>zt$<NUVINZOl
zi?n3Zmn-b^>?J29`jD#VavKe;p*bM=!O<lZ5waHC9aj3nO$6}QQ=nk0MD^FpU)lE~
zw|7GB<Hy4X4xDta1xenQ%ingDl*&lDr_gCI at w%p%aYL&)=k?I7mfc$rg5c&=5#C;~
z;5F-k161way$&!oMe93mWRf0pbMAZgcr~7cd&uI-w$~Wxf&5OTj<UozzhHITU6ujP
zn5$b()qweZK*%d8#?d}ZxpU>>#b*hii{@{dno|@$U%=rM at vIv>z>Gn&iWZ(AjZbLT
z{WQ at oja~bGX#E&0BT1%L-&9j`e1kqu&sDVRC?lC~z!J{KDkIq~#Hg1o>#3?rFLA%J
zWvF0CgChRyWC%9sW#tHaiI+>P2#;laJ0S>JOCy9%Lng4En_Dtb;2%^Fy6*w&Cgx0>
zef9ZsZ?+#T)<?4}e8=WyXWPRsCZz+l+NOXfhFaO%c*AmHEi8nR?Dz@|g2{z}J+9hg
zqJxE+!bM11zZ$?ZVARg}@*0HW9!ZV~1H!9KnDk5lWyMdv_fT}IBN at -2WFhiRLqj_;
zJ|25 at luRW2Ts?4&C}Q81$dtD~rzbNZjfLa9Yd4sPHOVl)=cmtSFFCiWcaI)1^mbiB
zLK9FBMu!+%K4{R?sS_r&JITasK+rW~Rfm`m(DYs6=H~FLvlX|mviIFq65s7PRyoL~
z3S|gxOToI)W`@oyR*b=v`1$!!Js9ory0QMf>01}c8v$DR#J9ak?2Ckf)m|rwWWuq#
zalt7mA2^K!n+c7czHaZaS7Z%^i|z=7n);gVx{@A}!mb#QI?%jxNZr>NKflyUlD8N3
zV1#D^7lsvOo>hpZTFlegbO&NW4CZ>W31I5#dM&$m4AZ~bVF4x}xrh(^uGWVk32_Mt
zFe9_-j5+Q^he95{OtyXEeAFfw?~yF4G#j`R;zN+BRZp|;APS!9mw%LON-h#*I0{cL
za&06|2A0n+)u7S=1vI;)WPX}>e1MDx%raY=gth+8D05QYN8=|+Y69ZqzM8LQ0B~*X
z-udgk(6&7%aDYpjPQ65Gyl=kO<XfJ;mGLn#PJ|Hf`B-zNxm4?$xdXL%&X{zeJCQXN
z6F?tH_x5%+i=Urg1I6v+sZ(Ji)MC64;&p_UJFlWtD9Q7G8+*h!4BLmMu9slULgUK%
zcHfvh8=oy1qG)5Y7`Uf{vTlg6a?G!dVC-B3LH$Le4t^zl0s^5W<+u->W_3qeK<99m
z!A&TCtXI*Ns1AKS_Q%zrzJ2<<g1++=tz=^biErpqJb2sQ-a}x>U1%v2oWoJ4!tG9&
zrsdc-emOeLn*agG&ae*=_L)@fcx5s8PdC3sqHLJ{b|FcLC0sjErZ4laCd0nOM_g$6
z*U2PQIq-OIcU at ab%VvbhpEh!TnI9Pm3I;s<wo|L^@vNd(b|=P2!8V&*bf$Zsc$<v?
zt<5Y)lwm8zW2krRxIMA=<{Jyttkr+Hra$VdwNTJ&1nhO;s6;Xq@<bV)e(l5s8Nf2L
z0@|*V_|Byi3&^v6o)!O}GqHYN2g#db(Y2Oi-h~gHOPGA>OK(YxkO at R>>Fuu4ZLdCm
zzV9s~krTKOvhOC#_`K`at$Vm+rzH6AKhILCL-;#f{QI0?l9so#O|H<*-6zsZ(q>v?
z-``Zr(dRh+Kt-l|+v`07?)E+Te-4{$%0~z~|F=QS|67093=h`}omb?mE8I~-BlEgk
zC6T-}-;KuNt~j}vBvzBHCWg9nxivOp1fsQ at xBFGb#>BkBix+$#6U^x;H-Aya!a{S-
zEO03&Il+2hV3sMsJ at xKvC8dmQYBINW?rIaCpPt0^%6lZ3{vd^h9poUvnzZp%KdPFd
zO!w3LcaE=*?lviXrR4k9(W7HsYnD|GP2eFgY#6;9RfOWyKG~nigTmE>r}E!zR6AN8
zb+jdAjS+{I!>ts4v#`+abNSa&uU|Duz+`UQTbS+ac0_g9R!2Wr6=0lT0sR|X;R9)T
zSR_shel at _??bG=3rPece!!^GZt%nj;#=kTeIy8SvKVPb(??8FY{jq-=Jw3BkJ0;7!
zS$RA7UAF}*|GfO0isZ13eaC)xHZYZuF1z(2KW1%tQI5zr*58LkOZB;6S?cbRyTmJ1
zEj&Z3f_(pa=(@X4U3-a{d(&^F5vGeWh_S51x4yhHBUSm#oEy>yxu!s#e`Wt$+V#JF
zE5OHbBsK$&f==&y_{flhxPQI)QdKoxU!DhmfhTu6nTDAmdM23^Vh>G at ixM^^TK at l=
zH?~<mn+H9P4}gA1KbwZS`fDnr1Y4rlX~Vg05l0_vR`d;)OSR2QBjrN4DVh#7LU{^T
zq-bbD5#$P at f|;2aEsPm|bc=Z<@YBAm8)tzKo*Z~Dx;7XTDynZQE0bSbtl6$6(}qUN
zH*lt!DmGfeB4UFGVnsJM562fn>b@`eRhimx=;vd_F=y|$n>L2pAM9IX!}mu;A^9_p
z9%*VBDDiM0NNC4>$ZB!)W066u-|NtKZw0wkxhTncAd_Q?)8-i)8vhMAjI9;4&WJ!z
ziyu^AI`terr9toZ)2BuT1~s_Dh!l}qP at w}KSt-rogj?!u0R{%<dBn-{l*0;<vcsfK
z%c- at bj;P^>3$RxzT1T at 3!sG=#1 at H~9kNO<}n67;uC7lA7F=NJn4msQ`&X|_)`z`Ra
zkb`<R0^sif5Kj1P0WgpZ=*~l;VI!#~>l-D#g1e<>JAC$;MKC3mUK~^u!kOnvb<n`v
zmpPa)((rq-0YyJBDI)Gf%kJ72m!?~9T`#vUJUs59Lq_4Qh?o!4{!#Gh47-A^>~w;x
zsE*6Q1`w5`wivGgc;(4t2D?VPrpmA-;Cj3V-8Ck^%KM_;RGm!M5L0evX<r%tYvOKe
z*X>`s44h{ADdH`;lzBTwQ+!GjZBgWaXEHLRr$-E5_INq&okW=9!Lm_1l-jvHa_<@Y
zsHp1aI=hFvCb)VgsM*yJp(61bUaWvvMQLt5Aq^-Go4)JyQoJq57#u~-7DGaOrbd5?
z at Pbwr`gr<U at +!{Sfr5^<w93;QZq-=K85gs$10S!&m$Rq)B5w+%eCSg}kPHCjyKc!M
zKE+cf-cVivpW?FPNB$;IkAneZ2I8JGCzC^*{4S;-qwuya(?&0k+@?UH?3Safqy(s9
zJGBa=QhR&C_=_b2*u>;_DS##mBI7yFamOCvs11{T?Ho~JeOgi70)WckWk>-t(35-`
zR2=Bwvb$zYQ()Ud1FfUc)5exKTFjjJ7`2*t-eZXC;JcQTl%!v-whXwwM&0kql?DzR
zHhC4zdwx{<cJx0JKGKu0c@{8>^aG<_t7~e6>ZMRpTlMVLt^WG at rxbg}Z>ec#w_xcZ
z^E1<OMsu?0mDH`e2O@%QspXwBif>v_tXEP|(Y})QJSj=-slsNpXwzASpO%Ji_o$p9
z09GB<{q)n-RDi%x$aE~7!*(uzcx)%{6JW!GMl2m87w0(aV4U1Jy&hSt*Jjefrjis}
zB}g3n8@!34YlKP-{AXfYDp}Bs^eFOoF-HMAkuySe@(HTtJEhH#y~t-0YMvq<gK4FX
z!u%9Uimn9B(jcl{<>V#EffN$PVA+5V*+J+{?`2m=NyLD(Ns1#Z<7=it2jaq7>54HS
z43s4onA8aGkl4~2yn!!17pGsXX>PzvjzwLa=l6XUH4C{?fNF5Yz!Fa@#FCi`T-Sta
z(UUYi>J-2ur%cQx<6GMl=qGrBBUFf`#!B=JWz at DJZQfw7;sN8#&G9K4pdf%4R~&+`
zCqm42f at X>_-8b8fe=!?{R{XsRr5sTV>E062E5ysQR0c_2jOPMy`9^8la*K%90PCjC
zjJ*Y<2+tj at rx>pRWK>V at 3gV*sU(zd_>`pL$0z)O06$!Q>Ro#Sg096qnvkvNb0O&jq
zK~5m$l_snZszH+{KY^r2SqIDqN)0DhC_Zm9SN9X65Xb9?X?dc2phP2 at 2Y8A=viI7y
z3#BQ)TelI2fw6gIWg>%5rn!LaNnASUm&I=D@#|%uLMnKO7sB4D`=ParO(#VV8t<hq
zF_f?QP#eggs1yk72c`t|?}CZA5WzII-ucUQT+K%Bv at KrGjQSdXZ`Zy(z{v&X8`r#q
zI57G55rtBAmp42Qv$^IaA*&D!f^6ZMAG^(9zmBo-Z|c*?(V5nNy$&b|mC*=;h!Em3
za*|3t`F*$Rex1n)G1l?ZUs{#(4cJk-<pUHm at EW^@YPJF&ws-HjjEv)XeS}VH*7wJA
zm}D?&?b}HpwCna!06+g|E?UYZnVaW)3(Sc#>NO)i1wPcVi>n^Kc(Iv2D9u1|=MH(4
zges%gpJMsRVS4?K4 at J}4Em*cpq?I|T>KYp6PcvBBWjfladGAdS`xr_4MAGrBtgLrO
zz3Ev%<RES<=RM+`Ve){Tchi5l=PT08q_Is%Y%TM+7v&TetR{UJs=wA<_SetxVgjns
zF9SnE(RV;Ss!- at Bh>5R?OR`yszx%r<r45{RVEELFi<d50f-3l6!|`Hvj*E+?Um^<|
z|GV>;n2C8_yJNyH*(PT8b)oN6Yx63u;bqqT*EUjR%FzrZIsWu7rq|jXsjPXtJ$sY)
z{H^)x4J<EAACqB~GnIkE$KvBD7flI7#Y at z1-7L%AzlW$a$8f(Oxbd%tCnmJ4D3V(e
zhxYimxYRud!7s+;=sV1rvu|a$oTJtQr6ckM4fN^7+vlfHObtzIGiCpfBY`Q}`TA)L
zQ;qNuC2*`#jt(clvZH)ZVV+lS(HO2(mvgT*(oqj7dCRJ!c$l6Vl40KXdl92L$&30#
zZ2mMkGiJ at dxd3O1@M?$Wyd{h+cr^tU7nrK+{GxTC;bY6B596k2E{(U%yRJt=n(eQP
zAif5dcaB%=){P^3MfQ-jR*>ptOR!rJ(mc0GepC+ at Vz}Eny1euH{JsOrK6g!awdrqc
zJjcx&RuDRp2D%U%d$?vtBs$qlc(7v9c-N}B%dL)9EDc{9?X?u|%;1ul1Wa*LyQ9st
zJ at Ny#TJWjkv7>1VcD5-<4-Nmz$YInSYU+C*O()=iS)LSo)9ze0G+;pPWQ*9t>o-jc
zh>X`BTc}Teu$Z#wwPMAJ)M(>M_x#&ZmlJoX{_AXRNinO)d6HefA`?6w;0p at _)<oP|
zsOt at X-F2}KtU4HtNwH&-iO(axmG*N9e_GzP=4(*M(<SOR1g|gu6g4^EV<n>_+CE>Y
zh+<6B7tDiKYVOa166|NhuBlWR(_(UD@<V5vcl^!1%nWRXUE(Y9`uMF%mO14YIwrMR
zp&Gr<$v}0d&1YNrPugp`z2~Po($PevDu#=lolh-!pf)wI`=qSJBPaK;mFa89O~jaV
z5GBIX1ZT4{&L=-2X0lU_7(B@|mB?w*up`nJG*dBXYoK4EW7Z!a9h}9PQw|M4WL?Y=
zy;?-)r;>IZ^d7y;I`ek<gn}Jcc@@cDsGZC)@b_<5(ar>Ysy=;UE^j*V;E?fqcw)qs
z(2+zrKm=YL70r}fuh`~^F>sdO+JQbLZlAX_jV(-m{XvQUNhMxPNn2zxi`%|U0d0xo
zfR=J?$Fz_OtZX&MopHS-n}5u!*k)ipyNmu=^{8R>$IfeKTymeVu2LP-H5+E~wm at 1?
zUYR!j+^t}qB(;367d7mdPb!n_x({$QVd8nuRhN%kjFPH at sR4NwguI}1r`70TqmxSA
zPSKnpcSt3<xojhxHundlIz+=Y>+di-L6 at tcH*eBUW{TrT4fMMA=%KZ_Jqw#}w_0hy
zZ<C+I^fb{pwxdIKJaH at 1LW&&@f?MOPVR3?{!dBX(IZaU_J at nYPb?Tm|nHA47?@sg?
zU6j?>u&QEP)a`ZQuE1+xhsp19Q<MjrbU3aaGtu|Rj522ue%m8kDTAnBP@(+=ni@|S
z)8m=Ky&gWcbCsUHFgiNwyMj5<JSTXjb7l!g_BS|A7jr>%hFuiZ%^=DrHIQXUfQK=u
z?La|5h at S=OHE3!8qfY*x>dri>=k at LP+1t>zMaYyf87eB0Boakb3aKa(QBo2r5y>XA
zvQbeoq`8DNDGi1)G at x&#P05%_Dy1Z$=k+PiTEBDFvz~R%bDne7I{js#`h4%tec#u0
zz2EQaeR=ZCvE3qeI;Az-Bi2sMT({<0=(^7U1XD*&L^=Ld=ysGrAgBp?F}(Y-IR~yS
zdPMe3z|}rPJo?twHlCU3voyHwxvf}B+9KUP{?m8x;N{h$x(tqEHF)VgWw3gC4seze
zn}xg$yp}3JRBVx-2veY)8*|<=+Ard}U0>d~AwMQ8#X?(0$8=G($jimytm<Oz{*6g8
zPx|s%2di&h9p<JGHE)3Sf)HEPb*eus2AuGnY$Tc at D>!au-&_{z8zHIPoG|@v%cB|f
zAD<`2d|mq~`YI}=mfF%~;&DvFm2hqqym`sC_DfPeTq&y<G<@>k9$Qf&vwE>m*f3z&
zDAFn_=k-srlNFm1>nIZ{Frh2xJOeq#enju-9-L}yIi3B7&5Q2lu2$2V#3!k8$kBK7
z(_Uw5OVsutA>%)!Mjlej`Z~BU>fqI at PGPxBD7}%I+EWJcg>r1SraO~>zU(d-N72zb
zNIQ-AX*%rbKLlDd@>7|}!V#yg6Q!-D2aMJqu3^5&?$J7ujj-P2fB4 at hqE8;!UIX)B
zdiYub7BbQ2^KHAL2xK>pmGD1ddt^xnZCTRe3ZZ`4Co7b@*k?(8(enend&aygz}B&2
zvoUDrnE{!U<>a<g2T*|4Q04l467$u&XEf&~<JU%~FV at _6X)8L+(D^$v_Ehy<eWug>
zZ8EO_^B1xRsOlSQ?jB&v2^t2<ix+&Al>r!q^=L5(OmjR`pqg!S(xK*9b<y3@(whp|
zLaGX>hYK4?mFCJm(kds1i)YiOoO$u$Y;m$H&tdADFCKBoee`Icwr|FZ)R`1~XHkkY
zJ-N_tBvI4Ap}+P=DzqbirH^8vFkrdKx^TA`5`F{6q|HSC;%l28h+bvR)cuWhr^3A9
z{qel!xZvmD<1(!N)hnDQ{vtOto2(`_cCdNGX09=zs7NOTE{ii+#tU8!Tur9kM?ylA
z#71&-2PBaAb(KAt8mNCoMKQevG#Qy#k3SJ3G5LD<jjnIYH9Vr9G%48(B&l;CDI%i-
z+6j$~T-9}q&9TMEO`ArKA3uLZa%t4lsCyKPY<@^!lX}7y$PM0+d<kXhwQKB!gY?g%
z37ms2f?77A-`Rpw-E&Ex>^PH9Cp&f=MasD0T`Vfh59VUswXb*>dvo=(gIzF?5qX|g
zTyd{q+C at v<XY%06M-{Bz?7m$fd+TrNO`(9EI<*;9k&uuH#t&ARN;bw`lAK8cw%)>p
z419~1d_%E$VTRi#Lc1yvqf|0v;}O$iJ8PQqo<2>28#6W6p>hoyM1SFU`K2;^#=n~`
zZkO?*pPq*@d)kT;BFgF&1ppVD at o-D}y at WOfmW5kE>FNSBFT^NeQy0$PG_(t#01y^3
zF+rb4R+N~Wtn3`e-oiP2o;W&-JO!WFVh!^zdd)bj{$TD~^v at Za%G7Cv030%%t|X>C
z*ePO^W_C*2w!wj1tgjsqd~e=-?ZdNs6eW5K7p7rb!=Aw<k|vw59(5F7X&71)lwMw2
zv+qF5o9Yya$xp+VTbHef at Z?*B{92H7ms|`ytQV*@G!Sgo>tk&#tSdp2d;bS5d^N%M
z_*2yLEbJ7VDZHUQzBwCAS664QImBv!Z9 at t(xj?uSg~RDBKZme2r5!fIWNJh3>nH8A
zqROe#B5-Q++U)9jj(rFJg(~1H7(VDZN52lP++?S2nLI3E3)~g^?&OTW?T?M<QtT5O
z3-IW8^!Nq1b- at CS<Q4w&El at 7q_zs+EE~>|tezQs?Wj7t!ALn##C5C}9Cw&ildk+xe
z33rs8a^#@BUGg=$IMRG|;(bOrRWum!2>W61I7Q<GKAVKIAk=W~{ssGNyd(wXrSsP7
z{9e62UCFBtbTLv3Z)f+hs0R06B5|Xh+=&-6zkLPWuL2Q*G at 19@c%aANF0yq}p)sCl
zYXqgnePc`Zq&QsL52TwYDo($DCFoZIO7ipz*AKPMGK`z_CHB-&U(={z`?a?q#+R83
zBOu|Jm+_jH5d^rU=!Hi<I+X%fOJQN&=VKgqi+2%H^I_F;3M=hH)C{n<zCT?Ml4y&w
zT~NDL%}~j&a=u_9tEy`9Z5$qHuHa17yGux1+X?iPtvk?&P@}<dk6!CF+jV`}Ic;uy
zFG(PqUj9)%-MbF%!A(pV&BOm8<F9OWCD2`0B0W*&-V3RrEl(fX at qtBiKl*J(7Ej6e
zhYUjq6Qzs(#Lj1n at sGiRja5x5D4jz3S3bJLhr?RB;bbDB)d3L8;aRJNb8>!$n~`{5
zX=!d9nMJ!E12SG;s2{eKH!LVZB=6+r)^Jncst~=1F*=BMXnOfX0>?x=!M);o*FOe#
zd0Qt{zU#ALbv9?M!aLL=Wd5ExDFiq{^LpaMlEc?K<qq11&@iC8t5mw0td at 1-tTor!
z5KBh>>6<PqqSZ&&TY9Y5Bs5M5mEI<Qe$2WjPa;Tw*FFSPKu at z}ge$iHI^t_sU$iZS
zM=nZFj3+9*sW-U04#xc}?dJ~3x)2~VakI%Wr!d`O`mJod!BROXQioM3TlqjGB`sKf
zg^g4y=Xz#sRX6@~jRsGWOXPd$=l69zwr`7DPhf>;^Z0N{YpiDkmysF6JPOSsW*-;Z
zrvkf%d;NCKq2Gj`_l7!gwTjCqS!H}L+u!{3z+ktf8_QO-thAUpOSv}YYR1VCe^|+o
z1f90c6i7?V at 1BOJ0HPf`1 at G_jgOo=YGtW&>u)$JW95zyaq0QFM?+xz_v%ey|tH0|Z
zs<9d|Z~`=}@4&xdwN{v$Z-`6fj(!GH&Ruc;egvQi7g^D}ev5ZBr7ZGaOvVKT9&35i
zOuPWFhCXQlG|d|;sHEA5fVKOz8#vB9`AVlbX8Y-mYtnWP|9zD5vl-pa{Tz)YACe_G
zuN%BbL=Z98qp{5(UqcnN&>*-vXyA-)?p at DaS{f-=ZFET}C4(26T>8qb02Cy7Cp)_$
z<<FW}i4*DaPvv>f%?VVjLB1<Y<fM4w0n+MUsAw0+_C!CwEafk?QSxgOn6-!0Z;?zE
zQ9tbUI=^ik#i^Nj<XeBr&=ZN^#x%HCcmDjgZ{O^<ns!m>kZFP%M0d|c*<vM-z^cS9
zMKkug){nNA?T_;EOwySs<;S;LqOB6u6qU|0UrE>m^h;lJx4X<-RK}r0h80hINuq*c
zSZ~VXMS-e%cXzbC8=J2p=cP_Hm3Bhxj+jO_%l6UCiyE!@=nDx%8P8c^2E--E$#((8
z8^>(=noutPM7FB;Iqi9R at _s_+p~A9xQJcd45Ep;4ZpV)Vnd{TCHEg){4=DLOHU$|X
zH1C&0oVKwzx)^QOg%x9%)&%j3f7%VnJNS6A%Qm~XTy`I$JnE#%Js?0s(TOZDP9U`N
z3?nI+I%fQM*6d|&ZVbF-g<^>Gv>Ueh(h|#J7RwPk1()EQ7a47%mrD4fU&R}G7EPt9
z25<PRFu94QN410HK7TNrGv}|O<;wzhlfQ93N&1{hlMKZRz>&BfqOXjM7KZq8e7Hy~
z#D&C+BWbF-K-1a91^7Bn@(s@!SrxJns|@qQbE5Z1Uw7-7`g2|p$^^kW at rqmq^MVnm
zMB90xb*!g0aCc9Ye6z35tVp{pKMI#{sxHd9^z;L-zI?=|^m(RdJ8+#BerhAYWCNuN
z77ZP}bLr)!_tIS}3SKm%<Omj}1ZA1I46p*}z+-w$t*s5;hbd5O*v%P`wY#x`+#qr=
zIneLGdSZn3At8_QFok0k#kY7#!nYu6l^zKB^_0 at a^!@~@7Tp~N&`tkivv5A~D%wFE
zMG6<f$yL~_=oH2(7@%!VIM4T*+GzSA{O&K4g~e0T;u4{aSdmq`0+=Lu=l1Q_h;}S4
zYd72Yn?b8YUtL+!7Rp-|M#G8jIHfn6(LJ#Ljlk7{d>x_1bqR+ka(e)U{CKY_VpZ`n
z)4ldVMgQ6YU42my)A?PoI9fX(N7iuriGSx8hG<7zJZP0gN^T<Y7TD!)I*;`fQ8x)Z
zwLbNu2T6FKFF<&r$r#G~Qx&G{+>ueQ_-zwRu62Fk+OtVKwW_c0^=&<2iN}aOyOC<g
z+!#^qB!h)e8_TXb at dk9^(4j+xra4!Vxcv&nu0yTG4YzE#S5#2dUZmq at 7*}LXrm5hk
zzh9fpGO^fW4Hf;>^e at kmNPQ)v;{Mo3!cCxa2YC+jO$~(;z&$8xvG?^BhkhPO%RZQX
zRhwy|%=;I>;{Wx2<(N&EQ8h$<IK4CwWfup9Db}b at n0tp$HvQ&hV6DE(CvxMG&j9#R
zjZ-Q~X at ksfV&oimt7vM#|J2VrHPHrdaGF$BH=Nk1Ep9rZ1we&1>A=AHEQl%s6xW8m
zzr0cKVz_`QYHDWr=kAGmDO0L(CQX-K&CK*HUittD8CjMvo(Q3#yydbWL~-Lzx2Z<h
zs=Gn)Mc>$}`SBEJ^9wE(+ALJJ-Xs{JHWj%%&^`nj#q=G&>DL4;FBlS5TH#H?yeKfz
zK?4RTT4m5UkbVFDdU8=w#eEe_irN6<?3E1k`{XjBBRcR$78fY}<#%PCC{R-fx?D0;
z>Ow}xs9 at tJTKbalDB+=@K(VgWs2mQg%S3GeveK){beh8+Z(G=YPJ4s<*Lk3A5y+qk
zi!|KwO8?<=p~ZS%Sy{rp((m|h^wm(b33UZ|WSH{;881L-An4FGw;aI`A2$UY(U*Lb
zR}^%8MYDFgyJKXNnU|!&iy`q6eN2h=5$?Xf)vmEKI3a;~yOspiX%KEKo5c4T1@}az
zO+Kv2{fps04oDA0qU%j6xClZ_EWf_)ApvB+B=8K^LE-mX#+Pc;=C&Kg^>tHqpVcgP
z-01jYQ?@QJ6*>yRAo1S)`?P7I4>WewyU`W-D}om%hypf^dtIPJwAB>##)^H5m13=S
zFdwFY+fZM%feC70ZoK^Az|siY7~Xg#)glbnig=scfrilnW2B(G+Qz1sG=ulH=**-w
zhyY2M at PSkK8EFfpNB1h#(E{^{ODux+ at 1F<0v%}T&O;u=DXXno-B_%S`iM^(A8Uug@
zu@#Z1F%8+CYv<&20d-xot3M|0r7F|bz|mQlXBxFUtQ=vuo1EBYpznG6sCy)qxiJZ8
zb<taKFr4tskM$U+b?`rKGF~Sr^*Wo3b?4P6_?%F2U)(%l`ZuThP0!?g^|Ue%36M`8
z<0UWx4G=n$t>>b}<5L5%>X)sqfB!xSz&kB%X0t;bZ1p#-EcDbl6Ti|g6|Fp2QgZQM
z^$niY2}>`|UwpNn=3e6rqhJjm-xIn^(wXnWWvG~OHx0!z3+jY2hNXkK#sOimr>7^%
zp*Q9;@sR at DHc7RAktoy8LoHjkte~p3NJnD$)a>l}IguFLLFTyO*g~cm=D>7t*o(u*
zkC&tk)Tt@)J)mlQAoQ4ws6g)#$D3Qg<juv1g=}u<(U>arJT{XAvRUb`7UzF;(r%xz
zBGnuV^wyHhpJBEeKQYJJ^4o)j&Rk^}@ju!1af`jZJuywSwY(@kDT!fv6OrFONwzpI
zINn*rx_Hm4p$amnjD~HVI&4*p%<$S%pgt$B?DUPItl at gF8F=i-5$LQ5S67p+a at Sj}
z3d5lvX*+VIz}nsw*Ao&x7KGdfK$+0sfyy87zd7Y at IMD)Rgz^+KzaRQV#=q$e(Tw~y
zXWzuyGvyll8>=b@;avv7_>Iz7v!#^X_8fCChFFb@`9Y(GfmVch7!ka}djMnNuO2)&
ze at 8dWc;GtC4(Au?5R4aFn7VfjTX;^}bz#ne<MFK*+FM7483$arfGu|L!*yZw$F at Nx
z#_V3RaK7WABjthCvUPS%yFLUT at S*4Wl!^ieQMf(i1bgM|tSqn?lS`fN!Pi&l!}Tk_
zdr_8pk34n}^%OYJrDi{@^lIVZ;BdhCaahN?aMF}1;0EWB8VdfOSDgstf)z*gxMu1P
z;@S=Lg4WiTTpWemmkI^?7O9Kic6UBOH>|m~)Q#_;%wqVw!WQp&D`3a)v1F`V6eKeD
zD*@aQR5Wmys)_HFmWPA#xyp8bZ at 7<w4}=GNVhX)%{7 at 2BzQC5a(ZMxL+HalcS+HSe
zH$5;1`YNG}qTg1nBy0ZheKarhKkX8>RgDa9DkM>~J9mCYH-a5Ifffm8H at 9V;pBIe9
z5L&PuGLCWOq5wNUFrq$vddiI(>Qn|mHz_IUfO-~bJ64uB9{Ok)XEdbcso%w;;oG at d
zNT0U2xG<HZ&@8BU at 9SY!pqX=n-px)Y>gYfItyiBu4AnR_V_4b~yQ at vNHushmo2~g4
zVT&>n+Up~&ww&t{xjS at 7Pku~m*$iQLAiZ_;RxHl{m$q7~o7)^y?soi}Nk6?I7Xwe&
zeo4gfPj$n|vN+*8I+|7%pA*`!36z7hcd?!vG<qt8e~g at Y5@p|YEFi*+I~@k31YsXv
zCJd6j_<X^F1^*;$I3;O~Y=v#c!wUa4+Yj|{wD*6|S=-TH)173d821#Y at zjZ2`Te!A
z1h|=+s$b8z8pexFmzCA2yCwV<lixYAs2u%1NUdejwGRP&_|0lVTA2;V`Oc^0Ye4RB
zCLlV~9wlf-a_J$ZOSjk)iOFsv9(PQQx~lL<#pPIe3zgHiA8#TCpM*bO&uL^ohzwRL
zD<MhlQjMkseFVk+G82=~hm9O+dR9>d7P_t$e!{U^G_O7<v4bea1FP8}_2$h!xU*?3
zNq at jg=`PI85ZZNn^zlby$d|5Q-bn3vVn)yJBi{>M4SfA-9^+3#Sfl^iU!CDI=L{G=
z9Ln8MkOR8X=2p at B^}GURga|T3;jif8kF1myyxO}=*`xo&bEhz}^gv8xWED?{Y*B2I
z_yOlCF|h+wftzpjLW9}SUc2Wc{+{vIufJo8v#MZ~DKzj&>DB<ib at XR+5esC-D9Wuu
zS4H$NC~Z=&bSo|qhK~Sy2_ch>fOPY2m>@jV%^5s;!h{&^?*}N*ZjI`YqM<<^#>mg!
zXMztfn3Cm!F#KoH>Q`r~gbBxNp6>szWPJY(ZPfoiJnF4>hx+ojm!dyw`FI{Y`}-S-
zVM^h9RQAdZo@?hAuwhXB5k2F6#hYSmEK0v^m)cbRG{@d?SxJ6=l7H9ar)3stV^S_U
z1nLhxaLGFS&>r<H!{KQc%WQXh2GxFF{$!2Pr1iS19%tU0^0L0=vu2O4Z_|G4e%!IG
z<@PKV8i#nFUA%;5KE8U6`nBU1iv|DE>HQ}DtASl=wp_=BBX&_tTWC$@tD9s_=O5%|
z+o($Wo$vhjfesrtax<3HG{^dIxz&=hl6KoCrWP;b1}4ayp-H1;SeK<`zUMo?{V8H*
zXt*{aw&z_ZY^fnd63u#CaQ`6RZ-{#DB;}6h4Jt;gQXW<Nmr?eYvBEd*iB}oii`+p@
zS$SH-7IYopZ4+!>sW0znyB6DQh5;kxsjZrkzW(SFf9c3{emM2XpWVhV7IfQ(g<=MA
z9=HOEiM=Z8j*S4kd!eJXwKb}=br)L2Y^}pO7U5P(Kz!E&^S|He64%jc#s8*XZ!*bL
ze+d%>Q^E~!^^5SXXZHDZu4CoEzI`X}`ntKl1R-(W=-+$H?OeLe?%{6Z<J|u6Ib3TX
z{8q6DH-aTv`Jv^nQ&Uo^T{LJeXnWjqlJ~D46fsCj%7uoJm!D$bflfTQHMwu+if`&R
ztu!R7e60G!UyGA+-%?C$sE^*<IVNJ8x-sRMrFI~p+Cj at o%=PP{($W=C=3T~J>-+$l
zCp at uJ?KAV!?3jH(_G3@{b$4{<+LVocUT0!m-*4EE($gJJn0yF;p{=cr7isuSu+kEu
zIpB}{j0vx7e=YQld8iZD($v_fHFC$hzPvJ(&K+_qHl$*=kQvFV_rGYl(MlMvCsw9`
zYaG)-B1>v0BXe_dR$5y6o$tGO>E&OKpiyM+iWjBiXmIVh-Fy3V?$XT$C$>!z*6w)c
z+U;4PPfG96@*>%@eYYT$S}C@)bE~@S(fU!n2=8Sg^w+Btbf8-bnt#5^ghGJGDEy+{
zvA6g1zF1(#3i+PzCZ;|*)@%j6Szm6P{ShHN<twvhATQeMb*jz9_Jl-6MLomkCqKic
zV at K@iJu220E}EgRX6{O2ujI(La8vV$_ftvh+)w`<XX?N4c>dr0QJa^#cf8q8T6q1z
zDQ+d!pPhQh$H!>Ff at _t&7jK|7L!9u2EUf#!;ED$3w}IQrO^s2C3=LgJdck&8?1NPG
zBTV8ldwnDCj#s{CZNN0ARd_TV?oRIOrDB;+)$a6Fhs>bz51Wtj;7H&;#kXlYlgwFu
zuyb1s%LU0{0+-+UZo>>{PNnh}#qT+zVxvzD?sq;rcHgg`z2kkrdLCDL6ULQutDnso
zg7E}^KYhKvyZd7|5z}-mHIk|qW$|BH4}I=*UO7GwFp#R9<EL-a9&l^Rjg%iPBc7tj
zeiq<j13dHd^SebN-Cz4y?0@$T-LuSExIk~UPZ``xn6ZYcT3$Zt@@4q1lceg5QKvdY
zLL6Fbe=aph@=|K51|nln35|1g0I1+yy}9jr_x3q*#QoFl9_N0T7IFxzb~Vf+k%zV+
zSAY|wyoA`I-JG5Rjp!U;Y{A`)Qq9!V)Y7u{!-o%*m1sn?tg{Xs9N{jEuo`Z<z<AZF
z-9YLfmLFU+&KZsOdSai*dRfG(am6yZd2KGHZi1^2NCaQO!7_3kUwDd9-8W8nIOFeg
z%HbP$oR_;k=hGP|fFzIvP&zK(x*ij*h1FB4pN3J_ERE at ffLR;}u4u@<lBZ9VR;4Wu
zDL8ZEFKLx^3oI-woSoxC{MwLv+(!l2?nyC}u<<iSxp=x}XL&R;E|9uw8*>IqA76<F
zt~CmbH;OprQ`P(pu&o^G#dbYBOA7|%cl<AP-}f3|+uO%Stw9!dh9Ou1kzG2 at q$fJ(
z_^fYo^70Q|{6o!RnAnRkk;B^QAqCqBO-#_~zkZOUBu>z*O!@WGP2;Dpz1Pbi*Y!*G
zL}ld*YK|7d_;s~es2-DQ8P&6DS3@=lT5`}Hh5-v0(W-R&?5^t|b+yG~&34{(`lBPr
zx`?gsV>9dfCmp1X{w- at kxS%W2Yp&c(uy7P;x!nVX3<)@O>h0o+RWykvwIop8i;`JY
z<+M+G^~3C2p_S*Gm>?lt9J9(k(Vf&dDd^nrgq}9kR2cn^zn~3fis*o_gjZWp<7G-|
z+}mSgz7k_d9~0Bfz^S0$97C?42Vv;JiX~MLlO3UAq<_}^`{Ok<+$pCh3ODRn8BzdR
zU6A_u<YOg76BTEGR=kfK!NO=R0TD8JS6NAk8~D`L`8C=@W~|JELrAFY=F5u at wlUau
z`x?kPRq5G88nS)kwI+0C6ICvchUTcMsm*FBb8eJa?&8t}n7ZOc7wKLHpacOMa{gQa
z_Jyy7`+a#3$Q1r+*3VNIu{JD~3n{Ed_WbS$ZQ=k|>gZl{boLdsAflu=CJ-6scF5DW
zJ@|IiNTlM67l-SX*80!J;}@Q}2HETHa5Pjx9t6ryn!3<Du5q-cre&;|fh=u}I07gG
z8X?k9GO at B^;C+L@#52J$<AAicEk(BfQ=zAF=HBGw7RVijVVt^f!4o~Ge?C=B8g&uK
zb#DAOOn4My$F^359Df&IXrD+qJ_|E~-0sxqLOUKf_^<(*2*N}uEBfaAQ)$ip^5bVq
z=7p&a{@>?M-qH9jDR|+QEe*)hD-^(vkeY(*6xB3?Mhn`h2C9dWl9IDl>0>*C at VQ5N
zIsx3kOqA1a5kzf*4e9OGlL~$!Rb|f3iIHiI9H$w!DNv0DW4RN#AHwR8h?9n?6vQxt
z4T)K!#(tVVljGtF_7=v=PWRmb at EsO<tF&|mmB!rDk7u<paB!3MA+!J{W at dp_!XWEL
z!<|5)0QiQ<0t<z8V^KLS8=_uvG at K*i<(EGLFBujTaLu#*Cm~^hRvmbNxk;{_Di?%t
zpgp at 4*2O0EjUe`OQg^RQsXXR?P-R=j8AX9jG?j~YdO550#AGfasu<JLkleJi=t~ff
ztt~D8<?{<9x7$i0#(OOT8=!L0&%S>8u6HY!%B?c$X(M=c3WC))5EsHsW22XxyN7>v
zrLi(EDD>RJ;A3NGPa}NQezCxivFIoF&D8iOFic at K>Lj+chHd$SdmTW|qL)aLVWBv)
zdNX<M-zRTkLQrtYr at i&DXJ{{@kOEXPw}O;tNDbiWUF?yS#mo6F`C^^a(+2(bD5u;&
zl-8D(FY-0u6~A2d{1M|i&$}}@|9ESNP5`bE3zFBd7&im{+E3g5OVT>=*T`Dx+P{=$
z21(^S0FY5sh$yV)F+vC10i_OXPCV`(e2f4BDHSk0EL{Oe2K#FFo8IJJp_OfsCeg^Z
z%{3m<JfuGbtGlV`V{*0$ki68FfR|xON!u_-(mq6?z9OMlD5s)aZLE#PdoPtERtu;5
zGM~)~zsDwX5~v?%WTpi4wpl5dVTrkDaxaM-&u3<~gQ<o-xVwwTZbS2Z$vBE2!_p3m
zU1<Oa1Xh_CX+UQ|xo5kFj8}o(%A}0}^E_%Vb07fk8uwn at W_V`O9P!|i8sr<Lj^97T
z5XRh1#T$@Xz!(>bQXZxwO8v<qTReX;+V~$A(owS3v(GB%TTpj?e at t?;qM{?W*8397
zbxGtxnliqGhmV`GbNZv~m4MsG4`sZ>d-W2A_2GHCA=gf=Gar63;77x8Pp)*7U%;x4
zFK4gwA$sXQJ}W4|z$Lkg*AW7#vJn?2B$UzN^)0LaB5 at f&E0pOQH at Mww1tF}z at wWHp
z(p>Kf*Z$L-X^94kUoPJ8>29CgT-Avz2n|kQBU>6Pa=mp!2JAZnNk3b>psZ}=(xq#S
z+L*wJ<n2$vf(={$)f-ZXB<-*JcuvYp*Rjk4iRvi>dJm(nZk;6_bH7@$bHk)w0^gRI
zi_48-`=Si%?4BFibYTf~{7&KPkY15%Gja4wSA!VaVTEw_iuTImt=-ehT at 0!lG_?;|
zeSb6PX}+O&uvrXHoR=i<BU>rnJ*f9-jHI)ti30mhSa?ojD&vOp?)hw+3=Q>KP|zfm
zZi=`0yZ4-qa_3_1bPQz at c8+C;&hE3<2LLj-)Tg)fltDzX=}l%`?aC`*Pz4s2kFfG3
z2@`MNSea`c`urSQ7s*RdH;vAYv9gNl{j|SBJ=g8o;3_FUw#YuQ at uv6XPyehv9`H;Q
ztc0%Cns&^l9EI%8+Nf$P(mq9xGiW@$b at XJbTr~PWmWy*v@!yzIF;L6#i at c)Z)WN-y
zj=gm`rn{CiA!*H3M1h*rYbq68wMrd!?V=1m at yK1DZo`_M-~Q%sTis1%hCRfZwSE2C
zOIlTK+&EkA|IDAwSGB&r+DF)f3%`BoM3~<=QU7h1$7$7-sP;%Xb6qgUtM^zI6q46b
z8GqD`DEvc)a_3;LA=YmfH_F<&YFI8`en!^U;o+sq*s^Oo(TOtIgIo>d%W+6f%1S79
z{LsYX(8I!kK39KEMw-1Sv%9SZF1-#{(~|&PlMF6>sHq9-vR at LvezUwv>TR?GA(EqK
z&MZ4pcO8!nKmFpmON!ab;j*$FHP({~?&zK}s?y$yXAh4Nl8A#xj`ZvyKOSV8Zq?I@
z6{udq`jGWh83*SHs;fTk=@~B~9xvAj-++RF2BFs+>UXjVemO5+YN-of+p&4aaUbwG
z8ref^tR|hi=H>xmQ&?}mlTxiE4>jmm2d}F=e|qnr!iIl;S<*v??ia}8q&{Q&jP|Y;
zuUN;u0dVzxVq{8y(C#vl$1L8bE{iC;T4&?Nj{tZx*5z>>C6|tyHq8yHX6x21a5Rkb
zib1zz98)~4#@N)<@AT=@fr0ivk6x-_arz|HznNT_Y!P*|TIyGoI9>GHU(wMDr3X)%
z-9B`oT<@cJg at p!ezG8452F+fQ9BYUJvp#Q*;rD_(GB7ZZroOQCZ=TQLa|Jy(27oDa
zwzNHa{Ja*4<Fqw*yhI}7&pJb at Tl4R{f2kKzu$-%W)0BBi;qkBLpi31KOC2U(5P9{g
zmRntrw+`<2;T30m7GD`FZyM)wd-a3Ij|XX&?WjD5bFbO)w at f?p^IeHjRc+d|(ugYX
z`LMa~5jnkt1)F~Om at 7RE!qh at 9lGHexAmV0#^A at R;GmrLm6gaa_JA)e-jKmAsVCcb<
zx`JMi at vQrN9pvc&aK9HlKoG!U&fDRVe0k{YC_Sff(NR$(PH{RZh-(ZM)p{R4?#U0C
zaWg1kch0^0b++r*pM55JG^p_KuS{(#6FX&U at 8iL7O7U$~vwL;YHeScL5m(k!ZdLT)
zod^N$l9{7p?UcteWxX~#JMa7$cmML>+s_^@DWaIGU91F<{OwZ?vvhvWuG*%jRft at I
z8_h!V0l_tY<A%zk)pP&-eept2AW3NpT0^p7v*Vu$074}A?sBwdRD}gX^9oo&#n|RM
ze=09XuHolAwNLcl=Je1`^*k;yC?}>=dN1)=3$QO58iGS4nYjiZZgM_pjFQroc!xh^
zh at Zvwi3N7MXk?Ea%9LhuzQVkFWE at 6boeR4xL9koyrlg$SWNc}9Zh)+ml+=RKg~&@G
zDu+i0%?&gDL#9{vyFws&^t-vuNYC#LFMocSCgY_W61OSX8xc at G7oMuBYDeuP2+i=F
zxMnl^<`!q?wiorgsjh08;c=4dB5apT?+|7VaGI;2q?F`xe<=ve2#=;EGIJT6gxXXw
z_Mft{G_1EimzK6#YxM0*c`TPuEFuP)=q0G~@S88NONiX*>e`Ht1K`UQ<EZi-mBZzK
zZVuYo56-*88S%)`qX#91enC;5SXx0OBBR^LcS at 2Bt|f&R#e`grhZDMh1p}(u#uK<5
z9>c(bG}P?)hD8Wzc2)&*Y6ugj)SS%~$xU38w&5ewQ-+L^a%!S<EA%M``a6;`#d9Jj
z&$d$f%G9P#B^<rDlxHN~z%~$;eV}VxWwy)cUr{U)jzZ7vFb;Z)G at DI4JkkS(qjzn4
zwXcu9(-rfKU9CL9 at M}TuVw1}QQHcm;u{$UamGHRoy-1pe4;j*WyT?dz8SHopMItiD
z5uY6rttSoMbmPn=?$#qmg6=>ngsy*s?R5m8&inSFb+lUZiH<VA7*q4ZwvAW9uuXoF
zcS553U10$zjVw+tCJ<C1Pd;U<j{V)|X{Xa0?hU0`qM!D{3$rwtGxYt)wwq at jWr+(1
zU#$l5v!vjU_%HSClHUcJe>h)JegXBD2Q1pQo4ZJ?MN4-gez(ovnzxlrJW%^<TiZ}?
zT?!_4-j1cmA|fg+-Ci_fF_ZzV4!>Ut)q*XEuraDPnO`cf`%?G9p&%+zXyZHk;voN_
z<lb$@VUL#xE3BUQ;VX)$1%g9r{>QB!isZd at Wt&Czi3m8R#IH3se at 0n=$|E#`k9_U$
zJ??b37p|uT`I!wbx3>5BQ>UEo4|iK2yL0>YGHL=*C8zStbj`yF3i{%GrKEgMom!h3
zx9aNY(wEMUHIY-E`Z;EO-kCMF)7w_&o%QqohA`x|C?o0b@(EXq?VY~H=GeWCo-Qns
zok2(e9SOigm};$<w)ghxfB0Zr#+;`7=V=6C_w-pRDqE3wPICw`ixJ?OpZ$(UM at P>e
zv16|Llf!htD|@yIj!^J?3HD}IR+(fGNVanpeK at D(`IFeD=<(YjkDUB~DU~b&Qt{KL
zwJ>_nM8`_R51)aWduBscf1HS_ at V}W?S!_mCjN_(6Cc}mpLzWQsJ4G>Su3Di(81d!I
z>e^SrO at QjH!|aT0b81%dB?j)G5!JLx3J=%q=`wE7`H7a>ymhA#6ALqw*<CaoiC!d1
zT60}yw&puw&_=@kTn#g>GPGJ+KO2tY65V=Q7<C0cR`V=AqFRCK1r-SX4?BUbF#ms!
z{yV9XJk+239dJi4`7 at O}G%Ln}e*SawFKA`bw%XyYPaEBWImiECT9$wmq|F>ZdGZ!y
zwIJ8ANe at iT%zpl;_q4*|%H;={st=jQw~jm~5|Wg1n(^lLL;Ceo!OBIj(TI5VY|v*u
zKINf(ij$G}5>r#b_U;cEj**&xdY8<NH9L+k_3l&Y-kr#3Y_YwNyYDvWObmbjXG9MA
z%j2|2>Wq6!(|lodp66hF#-Cl?-5itoy+XP1M}cGVi-ALj*3=6M#>WI-QhX$~@39pZ
zCBq<d(oUL%EWh2m;`sp;?L&0bLmPNBJ{*r2)4#`Q31s*r+I;H>Z2Mg+i=U#C+I{!_
z{XE#i=jv-uka_Ywfp(v$$AyN7S^<`1s{~f5<1Dr9<q^|m%UbYI=Dy6Zv8$@A9E43>
z- at dQw>Q- at bOifW97nq$r%&ku;!*{H4-}R7#2D=wl`Dz=Z^k&Z71!P8n1FJz8DXDg0
zhhZdcyq2DDV7FhO01}Z5shos&{M;o=w%olI;>Qsn-Fw(}m_%;8=9y=Oh0uMC;CupX
z<?=?s&z at H&sEt8bB(;0mSa^RabAJ5LAYfBuyz+aL9zrIx?eX)jprfR9{R>XEE<C8x
ziM~JSvhig`Xkj&h`}G^^ntjT}_CinyJbPC0-0a=Ee}eTG_NjaQdNK+oT(Dvm70#-#
z*kolNLmC<yI at e;)HMSd_f~@QFUE0%x;FV;s3`D8PJ$*okK%|SVK9j&p^5w?dVj({U
zjd*!E<idrQoW1-YVW1Y!V_vHwThUNo-`-7U at d~ysSx5MViZZZ}ZhsC0z<QAW{J<!3
z^5Zib4*^xg*8yH|sms>)u{Q`a_6928UQyhsS9;n)nw}#t;^_ls)LUm at Ow%|{egf(<
z1W0E+s~4_q>&L~i$7p?<{*WF^EG$s51u*Xi9FbfZxe)zBG=<?DN~$h&?1BOLSk)bv
zU?atUPNl0C$ccs-)Kr31K7aBr?_HP19PSHvWBK{H(v`&Z^WlR%+Fx(ox9k#0$w`Q)
zdW_gUN<-thzZX+T>hZOan>bN0`$nGOt-BT<PYfkUWr3>eiAU&hde4*%Sao&LqD5NB
z;%M<i6ii~=qt{?bvWx!xKNl at sgn!hw?ek`=TxiqDS<Q~PX`>ymV&7XYmDz*VYxr(?
z8reZ*iQS6&MG}eq7a2YyK^B6JXKA~jX%t^#ZXUHsmV02r1cU0<-y}N|OtDQ}P*MoN
zyvCDg8v3@`ksjqfRO~sA2JXo+tnPf6jm<=L5M7Yr2X?A~o1%*C*#IA>Ob`q2e9AqA
z%t~T#lC!|W<X-zfrcZ9jYj&`O$v(h%oZ$(Ye~N9EqM#U;F}Ab#S%c{KQj?U}tqs4@
zSTSVJ(%!lP(<3YRGQZy9N5b^kM2Jb?@%w(6djF>c=zqYleAUX(-+H}i%4=Z at is{WW
LntMfi_1=F2Y`87x
diff --git a/llvm/lib/Transforms/Vectorize/VPlan.cpp b/llvm/lib/Transforms/Vectorize/VPlan.cpp
index 7603ec9600d08..3b9f487dffbfa 100644
--- a/llvm/lib/Transforms/Vectorize/VPlan.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlan.cpp
@@ -616,7 +616,7 @@ static bool hasConditionalTerminator(const VPBasicBlock *VPBB) {
}
assert(
- !IsCondBranch &&
+ !IsCondBranch && !IsBranchOnTwoConds &&
"block with 0 or 1 successors terminated by conditional branch recipe");
return false;
}
diff --git a/llvm/lib/Transforms/Vectorize/VPlan.h b/llvm/lib/Transforms/Vectorize/VPlan.h
index e7660e7eb9931..e2dfc4678c6d0 100644
--- a/llvm/lib/Transforms/Vectorize/VPlan.h
+++ b/llvm/lib/Transforms/Vectorize/VPlan.h
@@ -1060,8 +1060,10 @@ class LLVM_ABI_FOR_TEST VPInstruction : public VPRecipeWithIRFlags,
BranchOnCond,
// Branch with 2 boolean condition operands and 3 successors. If condition
// 0 is true, branches to successor 0; if condition 1 is true, branches to
- // successor 1; otherwise branches to successor 2. Expanded to a chain of
- // BranchOnCond after region dissolution.
+ // successor 1; otherwise branches to successor 2. Expanded after region
+ // dissolution into: (1) an OR of the two conditions branching to
+ // middle.split or successor 2, and (2) middle.split branching to successor
+ // 0 or successor 1 based on condition 0.
BranchOnTwoConds,
Broadcast,
/// Given operands of (the same) struct type, creates a struct of fixed-
diff --git a/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp b/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
index f15dd75ab7361..4a3c039581809 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
@@ -659,8 +659,6 @@ Value *VPInstruction::generate(VPTransformState &State) {
applyMetadata(*Br);
return Br;
}
- case VPInstruction::BranchOnTwoConds:
- llvm_unreachable("BranchOnTwoConds should be expanded before execution");
case VPInstruction::Broadcast: {
return Builder.CreateVectorSplat(
State.VF, State.get(getOperand(0), /*IsScalar*/ true), "broadcast");
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index 8507a9bd68652..b8c80959c432b 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -2007,7 +2007,8 @@ static bool simplifyBranchConditionForVFAndUF(VPlan &Plan, ElementCount BestVF,
const SCEV *C = SE.getElementCount(VectorTripCount->getType(), NumElements);
if (!SE.isKnownPredicate(CmpInst::ICMP_ULE, VectorTripCount, C))
return false;
- } else if (match(Term, m_BranchOnCond(m_VPValue(Cond)))) {
+ } else if (match(Term, m_BranchOnCond(m_VPValue(Cond))) ||
+ match(Term, m_BranchOnTwoConds(m_VPValue(), m_VPValue(Cond)))) {
// For BranchOnCond, check if we can prove the condition to be true using VF
// and UF.
if (!isConditionTrueViaVFAndUF(Cond, Plan, BestVF, BestUF, PSE))
@@ -2029,6 +2030,7 @@ static bool simplifyBranchConditionForVFAndUF(VPlan &Plan, ElementCount BestVF,
return isa<VPCanonicalIVPHIRecipe, VPEVLBasedIVPHIRecipe,
VPFirstOrderRecurrencePHIRecipe, VPPhi>(&Phi);
})) {
+ // TODO: fold branch-on-constant after dissolving region.
for (VPRecipeBase &HeaderR : make_early_inc_range(Header->phis())) {
if (auto *R = dyn_cast<VPWidenIntOrFpInductionRecipe>(&HeaderR)) {
VPBuilder Builder(Plan.getVectorPreheader());
@@ -2044,15 +2046,24 @@ static bool simplifyBranchConditionForVFAndUF(VPlan &Plan, ElementCount BestVF,
}
VPBlockBase *Preheader = VectorRegion->getSinglePredecessor();
- VPBlockBase *Exit = VectorRegion->getSingleSuccessor();
+ SmallVector<VPBlockBase *> Exits = to_vector(VectorRegion->getSuccessors());
VPBlockUtils::disconnectBlocks(Preheader, VectorRegion);
- VPBlockUtils::disconnectBlocks(VectorRegion, Exit);
+ for (VPBlockBase *Exit : Exits)
+ VPBlockUtils::disconnectBlocks(VectorRegion, Exit);
for (VPBlockBase *B : vp_depth_first_shallow(VectorRegion->getEntry()))
B->setParent(nullptr);
VPBlockUtils::connectBlocks(Preheader, Header);
- VPBlockUtils::connectBlocks(ExitingVPBB, Exit);
+
+ for (VPBlockBase *Exit : Exits)
+ VPBlockUtils::connectBlocks(ExitingVPBB, Exit);
+ if (Exits.size() != 1) {
+ assert(match(Term, m_BranchOnTwoConds()) && Exits.size() == 2 &&
+ "BranchOnTwoConds needs 2 remaining exits");
+ VPBuilder(Term).createNaryOp(VPInstruction::BranchOnCond,
+ Term->getOperand(0));
+ }
VPlanTransforms::simplifyRecipes(Plan);
} else {
// The vector region contains header phis for which we cannot remove the
@@ -3715,18 +3726,18 @@ void VPlanTransforms::dissolveLoopRegions(VPlan &Plan) {
}
void VPlanTransforms::expandBranchOnTwoConds(VPlan &Plan) {
- // Expand BranchOnTwoConds instructions into explicit CFG with
- // single-condition branches
SmallVector<VPInstruction *> WorkList;
for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
vp_depth_first_shallow(Plan.getEntry()))) {
- assert((!isa<VPRegionBlock>(VPBB) ||
- cast<VPRegionBlock>(VPBB)->isReplicator()) &&
- "only replicating regions must remain");
if (!VPBB->empty() && match(&VPBB->back(), m_BranchOnTwoConds()))
WorkList.push_back(cast<VPInstruction>(&VPBB->back()));
}
+ // Expand BranchOnTwoConds instructions into explicit CFG with
+ // single-condition branches, by introducing a new branch in VPBB that jumps
+ // to a new intermediate block if either condition is true and to the
+ // third successor otherwise. The intermediate block jumps to the first or
+ // second successor, depending on the first condition.
for (VPInstruction *Br : WorkList) {
assert(Br->getNumOperands() == 2 &&
"BranchOnTwoConds must have exactly 2 conditions");
@@ -3739,24 +3750,26 @@ void VPlanTransforms::expandBranchOnTwoConds(VPlan &Plan) {
for (VPBlockBase *Succ : Successors)
VPBlockUtils::disconnectBlocks(VPBB, Succ);
- // Create an intermediate block for the second condition check.
- auto *SecondCondBlock =
- Plan.createVPBasicBlock((Twine(VPBB->getName()) + ".cond.1").str());
- SecondCondBlock->setParent(VPBB->getParent());
-
VPValue *Cond0 = Br->getOperand(0);
- VPBlockBase *Succ0 = Successors[0];
- VPBuilder(VPBB).createNaryOp(VPInstruction::BranchOnCond, {Cond0}, DL);
- VPBlockUtils::connectBlocks(VPBB, Succ0);
- VPBlockUtils::connectBlocks(VPBB, SecondCondBlock);
-
VPValue *Cond1 = Br->getOperand(1);
+ VPBlockBase *Succ0 = Successors[0];
VPBlockBase *Succ1 = Successors[1];
VPBlockBase *Succ2 = Successors[2];
- VPBuilder(SecondCondBlock)
- .createNaryOp(VPInstruction::BranchOnCond, {Cond1}, DL);
- VPBlockUtils::connectBlocks(SecondCondBlock, Succ1);
- VPBlockUtils::connectBlocks(SecondCondBlock, Succ2);
+
+ VPBasicBlock *MiddleSplit = Plan.createVPBasicBlock("middle.split");
+ MiddleSplit->setParent(VPBB->getParent());
+
+ VPBuilder Builder(VPBB);
+ VPValue *AnyExitTaken =
+ Builder.createNaryOp(Instruction::Or, {Cond0, Cond1}, DL);
+ Builder.createNaryOp(VPInstruction::BranchOnCond, {AnyExitTaken}, DL);
+ VPBlockUtils::connectBlocks(VPBB, MiddleSplit);
+ VPBlockUtils::connectBlocks(VPBB, Succ2);
+
+ VPBuilder(MiddleSplit)
+ .createNaryOp(VPInstruction::BranchOnCond, {Cond0}, DL);
+ VPBlockUtils::connectBlocks(MiddleSplit, Succ0);
+ VPBlockUtils::connectBlocks(MiddleSplit, Succ1);
Br->eraseFromParent();
}
@@ -3922,34 +3935,32 @@ void VPlanTransforms::handleUncountableEarlyExit(VPBasicBlock *EarlyExitingVPBB,
Plan.createVPBasicBlock("vector.early.exit");
VectorEarlyExitVPBB->setParent(EarlyExitVPBB->getParent());
- // Update PHI operands: copy from EarlyExitingVPBB to VectorEarlyExitVPBB.
- unsigned PredIdx = EarlyExitVPBB->getIndexForPredecessor(EarlyExitingVPBB);
VPBlockUtils::connectBlocks(VectorEarlyExitVPBB, EarlyExitVPBB);
- VPBuilder EarlyExitB(VectorEarlyExitVPBB);
+ // Update the exit phis in the early exit block.
VPBuilder MiddleBuilder(MiddleVPBB);
+ VPBuilder EarlyExitB(VectorEarlyExitVPBB);
for (VPRecipeBase &R : EarlyExitVPBB->phis()) {
auto *ExitIRI = cast<VPIRPhi>(&R);
- VPValue *IncomingFromEarlyExiting = ExitIRI->getOperand(PredIdx);
+ // Early exit operand should always be last, i.e., 0 if EarlyExitVPBB has
+ // a single predecessor and 1 if it has two.
+ unsigned EarlyExitIdx = ExitIRI->getNumOperands() - 1;
if (ExitIRI->getNumOperands() != 1) {
- // Both loop exits go to the same block. Move the operand of ExitIRI
- // coming from EarlyExitingVPBB to appear last.
- ExitIRI->addOperand(IncomingFromEarlyExiting);
- ExitIRI->removeIncomingValueFor(EarlyExitingVPBB);
+ // The first of two operands corresponds to the latch exit, via MiddleVPBB
+ // predecessor. Extract its final lane.
ExitIRI->extractLastLaneOfLastPartOfFirstOperand(MiddleBuilder);
}
- if (!IncomingFromEarlyExiting->isLiveIn()) {
+ VPValue *IncomingFromEarlyExit = ExitIRI->getOperand(EarlyExitIdx);
+ if (!IncomingFromEarlyExit->isLiveIn()) {
// Update the incoming value from the early exit.
VPValue *FirstActiveLane = EarlyExitB.createNaryOp(
VPInstruction::FirstActiveLane, {CondToEarlyExit},
DebugLoc::getUnknown(), "first.active.lane");
- IncomingFromEarlyExiting =
- EarlyExitB.createNaryOp(VPInstruction::ExtractLane,
- {FirstActiveLane, IncomingFromEarlyExiting},
- DebugLoc::getUnknown(), "early.exit.value");
- unsigned EarlyExitIdx = ExitIRI->getNumOperands() - 1;
- ExitIRI->setOperand(EarlyExitIdx, IncomingFromEarlyExiting);
+ IncomingFromEarlyExit = EarlyExitB.createNaryOp(
+ VPInstruction::ExtractLane, {FirstActiveLane, IncomingFromEarlyExit},
+ DebugLoc::getUnknown(), "early.exit.value");
+ ExitIRI->setOperand(EarlyExitIdx, IncomingFromEarlyExit);
}
}
diff --git a/llvm/lib/Transforms/Vectorize/VPlanVerifier.cpp b/llvm/lib/Transforms/Vectorize/VPlanVerifier.cpp
index eb3d54db00b85..af9262f3ca4d1 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanVerifier.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanVerifier.cpp
@@ -392,9 +392,6 @@ bool VPlanVerifier::verifyBlock(const VPBlockBase *VPB) {
auto *VPBB = dyn_cast<VPBasicBlock>(VPB);
// Check block's condition bit.
if (VPBB && !isa<VPIRBasicBlock>(VPB)) {
- // VPRegionBlocks can have multiple successors (e.g., with
- // BranchOnTwoConds) without needing a terminator, so only check
- // VPBasicBlocks.
if (VPB->getNumSuccessors() > 1 ||
(VPBB->getParent() && VPBB->isExiting() &&
!VPBB->getParent()->isReplicator())) {
diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/simple_early_exit.ll b/llvm/test/Transforms/LoopVectorize/AArch64/simple_early_exit.ll
index b145bd004243d..42724d693b52d 100644
--- a/llvm/test/Transforms/LoopVectorize/AArch64/simple_early_exit.ll
+++ b/llvm/test/Transforms/LoopVectorize/AArch64/simple_early_exit.ll
@@ -25,7 +25,7 @@ define i64 @same_exit_block_pre_inc_use1() #1 {
; CHECK-NEXT: [[TMP6:%.*]] = add i64 3, [[N_VEC]]
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 16 x i8>, ptr [[TMP11]], align 1
@@ -36,9 +36,10 @@ define i64 @same_exit_block_pre_inc_use1() #1 {
; CHECK-NEXT: [[TMP8:%.*]] = freeze <vscale x 16 x i1> [[TMP16]]
; CHECK-NEXT: [[TMP17:%.*]] = call i1 @llvm.vector.reduce.or.nxv16i1(<vscale x 16 x i1> [[TMP8]])
; CHECK-NEXT: [[TMP18:%.*]] = icmp eq i64 [[INDEX_NEXT3]], [[N_VEC]]
-; CHECK-NEXT: br i1 [[TMP17]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP18]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; CHECK-NEXT: [[TMP19:%.*]] = or i1 [[TMP17]], [[TMP18]]
+; CHECK-NEXT: br i1 [[TMP19]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP17]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 64, [[N_VEC]]
; CHECK-NEXT: br i1 [[CMP_N]], label [[LOOP_END:%.*]], label [[SCALAR_PH]]
@@ -48,7 +49,7 @@ define i64 @same_exit_block_pre_inc_use1() #1 {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP20]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: scalar.ph:
-; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[TMP6]], [[MIDDLE_BLOCK1]] ], [ 3, [[ENTRY:%.*]] ]
+; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[TMP6]], [[MIDDLE_BLOCK]] ], [ 3, [[ENTRY:%.*]] ]
; CHECK-NEXT: br label [[LOOP:%.*]]
; CHECK: loop:
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ]
@@ -63,7 +64,7 @@ define i64 @same_exit_block_pre_inc_use1() #1 {
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]], !llvm.loop [[LOOP3:![0-9]+]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ], [ 67, [[MIDDLE_BLOCK1]] ], [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ], [ 67, [[MIDDLE_BLOCK]] ], [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -106,8 +107,8 @@ define i64 @same_exit_block_pre_inc_use4() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[MIDDLE_BLOCK:%.*]] ]
-; CHECK-NEXT: [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 3, i64 4>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 3, i64 4>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x i64>, ptr [[TMP1]], align 1
@@ -117,9 +118,10 @@ define i64 @same_exit_block_pre_inc_use4() {
; CHECK-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> [[TMP2]])
; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT2]], 64
; CHECK-NEXT: [[VEC_IND_NEXT]] = add <2 x i64> [[VEC_IND]], splat (i64 2)
-; CHECK-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
+; CHECK-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]
+; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -128,7 +130,7 @@ define i64 @same_exit_block_pre_inc_use4() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP8]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -168,7 +170,7 @@ define i64 @loop_contains_safe_call() #1 {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds float, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP1]], align 1
@@ -178,9 +180,10 @@ define i64 @loop_contains_safe_call() #1 {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP5]]
; CHECK-NEXT: [[TMP6:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT2]], 64
-; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
+; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP6]], [[TMP7]]
+; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -189,7 +192,7 @@ define i64 @loop_contains_safe_call() #1 {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP9]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -235,7 +238,7 @@ define i64 @loop_contains_safe_div() #1 {
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX2:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX2:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX1:%.*]] = add i64 3, [[INDEX2]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[P1]], i64 [[OFFSET_IDX1]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 4 x i32>, ptr [[TMP1]], align 1
@@ -245,9 +248,10 @@ define i64 @loop_contains_safe_div() #1 {
; CHECK-NEXT: [[TMP9:%.*]] = freeze <vscale x 4 x i1> [[TMP15]]
; CHECK-NEXT: [[TMP6:%.*]] = call i1 @llvm.vector.reduce.or.nxv4i1(<vscale x 4 x i1> [[TMP9]])
; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT2]], [[INDEX1]]
-; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
+; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP6]], [[TMP7]]
+; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 64, [[INDEX1]]
; CHECK-NEXT: br i1 [[CMP_N]], label [[LOOP_END:%.*]], label [[SCALAR_PH:%.*]]
@@ -270,7 +274,7 @@ define i64 @loop_contains_safe_div() #1 {
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]], !llvm.loop [[LOOP7:![0-9]+]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ], [ 67, [[MIDDLE_BLOCK1]] ], [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ], [ 67, [[MIDDLE_BLOCK]] ], [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -313,7 +317,7 @@ define i64 @loop_contains_load_after_early_exit(ptr dereferenceable(1024) align(
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP1]], align 1
@@ -324,11 +328,12 @@ define i64 @loop_contains_load_after_early_exit(ptr dereferenceable(1024) align(
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
+; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
+; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
-; CHECK-NEXT: [[TMP9:%.*]] = extractelement <4 x i64> [[WIDE_LOAD2]], i32 3
+; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i64> [[WIDE_LOAD2]], i32 3
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
; CHECK-NEXT: [[FIRST_ACTIVE_LANE:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v4i1(<4 x i1> [[TMP6]], i1 false)
@@ -336,7 +341,7 @@ define i64 @loop_contains_load_after_early_exit(ptr dereferenceable(1024) align(
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP11]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ [[TMP9]], [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ [[TMP10]], [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -398,7 +403,7 @@ define i32 @diff_exit_block_needs_scev_check(i32 %end) {
; CHECK-NEXT: [[TMP8:%.*]] = trunc i64 [[N_VEC]] to i8
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i32, ptr [[P1]], i64 [[INDEX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP10]], align 4
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[P2]], i64 [[INDEX]]
@@ -408,17 +413,18 @@ define i32 @diff_exit_block_needs_scev_check(i32 %end) {
; CHECK-NEXT: [[TMP13:%.*]] = freeze <4 x i1> [[TMP14]]
; CHECK-NEXT: [[TMP15:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP13]])
; CHECK-NEXT: [[TMP16:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
-; CHECK-NEXT: br i1 [[TMP15]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP16]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
+; CHECK-NEXT: [[TMP17:%.*]] = or i1 [[TMP15]], [[TMP16]]
+; CHECK-NEXT: br i1 [[TMP17]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP15]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[UMAX1]], [[N_VEC]]
; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
; CHECK: vector.early.exit:
; CHECK-NEXT: br label [[FOUND:%.*]]
; CHECK: scalar.ph:
-; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i8 [ [[TMP8]], [[MIDDLE_BLOCK1]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
-; CHECK-NEXT: [[BC_RESUME_VAL3:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK1]] ], [ 0, [[ENTRY]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
+; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i8 [ [[TMP8]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
+; CHECK-NEXT: [[BC_RESUME_VAL3:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
; CHECK: for.body:
; CHECK-NEXT: [[IND:%.*]] = phi i8 [ [[IND_NEXT:%.*]], [[FOR_INC:%.*]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ]
diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/single-early-exit-interleave.ll b/llvm/test/Transforms/LoopVectorize/AArch64/single-early-exit-interleave.ll
index be82965cc6649..cc03ef8af8b00 100644
--- a/llvm/test/Transforms/LoopVectorize/AArch64/single-early-exit-interleave.ll
+++ b/llvm/test/Transforms/LoopVectorize/AArch64/single-early-exit-interleave.ll
@@ -26,7 +26,7 @@ define i64 @same_exit_block_pre_inc_use1() #0 {
; CHECK-NEXT: [[INDEX_NEXT:%.*]] = add i64 3, [[N_VEC]]
; CHECK-NEXT: br label [[LOOP:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[LOOP_INC:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[LOOP]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[TMP27:%.*]] = mul nuw nsw i64 [[TMP4]], 2
@@ -60,9 +60,10 @@ define i64 @same_exit_block_pre_inc_use1() #0 {
; CHECK-NEXT: [[TMP33:%.*]] = or <vscale x 16 x i1> [[TMP62]], [[TMP34]]
; CHECK-NEXT: [[TMP12:%.*]] = call i1 @llvm.vector.reduce.or.nxv16i1(<vscale x 16 x i1> [[TMP33]])
; CHECK-NEXT: [[TMP35:%.*]] = icmp eq i64 [[INDEX_NEXT3]], [[N_VEC]]
-; CHECK-NEXT: br i1 [[TMP12]], label [[VECTOR_EARLY_EXIT:%.*]], label [[LOOP_INC]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP35]], label [[MIDDLE_BLOCK:%.*]], label [[LOOP]], !llvm.loop [[LOOP0:![0-9]+]]
+; CHECK-NEXT: [[TMP36:%.*]] = or i1 [[TMP12]], [[TMP35]]
+; CHECK-NEXT: br i1 [[TMP36]], label [[MIDDLE_SPLIT:%.*]], label [[LOOP]], !llvm.loop [[LOOP0:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP12]], label [[VECTOR_EARLY_EXIT:%.*]], label [[LOOP_INC:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 510, [[N_VEC]]
; CHECK-NEXT: br i1 [[CMP_N]], label [[LOOP_END:%.*]], label [[SCALAR_PH]]
@@ -91,7 +92,7 @@ define i64 @same_exit_block_pre_inc_use1() #0 {
; CHECK-NEXT: [[TMP17:%.*]] = add i64 3, [[TMP16]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: scalar.ph:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT]], [[MIDDLE_BLOCK]] ], [ 3, [[ENTRY:%.*]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT]], [[LOOP_INC]] ], [ 3, [[ENTRY:%.*]] ]
; CHECK-NEXT: br label [[LOOP1:%.*]]
; CHECK: loop:
; CHECK-NEXT: [[INDEX2:%.*]] = phi i64 [ [[INDEX_NEXT1:%.*]], [[LOOP_INC1:%.*]] ], [ [[INDEX]], [[SCALAR_PH]] ]
@@ -106,7 +107,7 @@ define i64 @same_exit_block_pre_inc_use1() #0 {
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT1]], 513
; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP1]], label [[LOOP_END]], !llvm.loop [[LOOP3:![0-9]+]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX2]], [[LOOP1]] ], [ 67, [[LOOP_INC1]] ], [ 67, [[MIDDLE_BLOCK]] ], [ [[TMP17]], [[VECTOR_EARLY_EXIT]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX2]], [[LOOP1]] ], [ 67, [[LOOP_INC1]] ], [ 67, [[LOOP_INC]] ], [ [[TMP17]], [[VECTOR_EARLY_EXIT]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
diff --git a/llvm/test/Transforms/LoopVectorize/single-early-exit-cond-poison.ll b/llvm/test/Transforms/LoopVectorize/single-early-exit-cond-poison.ll
index 899d7f8c5d7cc..97d57a0cf83a0 100644
--- a/llvm/test/Transforms/LoopVectorize/single-early-exit-cond-poison.ll
+++ b/llvm/test/Transforms/LoopVectorize/single-early-exit-cond-poison.ll
@@ -16,25 +16,15 @@ define noundef i32 @f(i32 noundef %g) {
; VF4IC2-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
; VF4IC2-NEXT: br label %[[VECTOR_BODY:.*]]
; VF4IC2: [[VECTOR_BODY]]:
-; VF4IC2-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
-; VF4IC2-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1]] ]
-; VF4IC2-NEXT: [[STEP_ADD:%.*]] = add <4 x i32> [[VEC_IND]], splat (i32 4)
-; VF4IC2-NEXT: [[TMP0:%.*]] = shl nuw nsw <4 x i32> [[VEC_IND]], splat (i32 3)
-; VF4IC2-NEXT: [[TMP1:%.*]] = shl nuw nsw <4 x i32> [[STEP_ADD]], splat (i32 3)
-; VF4IC2-NEXT: [[TMP2:%.*]] = ashr <4 x i32> [[BROADCAST_SPLAT]], [[TMP0]]
-; VF4IC2-NEXT: [[TMP3:%.*]] = ashr <4 x i32> [[BROADCAST_SPLAT]], [[TMP1]]
+; VF4IC2-NEXT: [[TMP2:%.*]] = ashr <4 x i32> [[BROADCAST_SPLAT]], <i32 0, i32 8, i32 16, i32 24>
+; VF4IC2-NEXT: [[TMP3:%.*]] = ashr <4 x i32> [[BROADCAST_SPLAT]], <i32 32, i32 40, i32 48, i32 56>
; VF4IC2-NEXT: [[TMP4:%.*]] = icmp ne <4 x i32> [[TMP2]], zeroinitializer
; VF4IC2-NEXT: [[TMP5:%.*]] = icmp ne <4 x i32> [[TMP3]], zeroinitializer
-; VF4IC2-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 8
; VF4IC2-NEXT: [[TMP17:%.*]] = freeze <4 x i1> [[TMP4]]
; VF4IC2-NEXT: [[TMP18:%.*]] = freeze <4 x i1> [[TMP5]]
; VF4IC2-NEXT: [[TMP6:%.*]] = or <4 x i1> [[TMP17]], [[TMP18]]
; VF4IC2-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP6]])
-; VF4IC2-NEXT: [[TMP16:%.*]] = icmp eq i32 [[INDEX_NEXT]], 8
-; VF4IC2-NEXT: [[VEC_IND_NEXT]] = add nuw nsw <4 x i32> [[STEP_ADD]], splat (i32 4)
-; VF4IC2-NEXT: br i1 [[TMP7]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; VF4IC2: [[VECTOR_BODY_MULTI_COND_1]]:
-; VF4IC2-NEXT: br i1 [[TMP16]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; VF4IC2-NEXT: br i1 [[TMP7]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; VF4IC2: [[MIDDLE_BLOCK]]:
; VF4IC2-NEXT: [[TMP8:%.*]] = extractelement <4 x i32> [[TMP3]], i32 3
; VF4IC2-NEXT: br label %[[RETURN:.*]]
@@ -46,10 +36,9 @@ define noundef i32 @f(i32 noundef %g) {
; VF4IC2-NEXT: [[TMP13:%.*]] = icmp ne i64 [[TMP11]], 4
; VF4IC2-NEXT: [[TMP14:%.*]] = select i1 [[TMP13]], i64 [[TMP12]], i64 [[TMP10]]
; VF4IC2-NEXT: [[TMP15:%.*]] = trunc i64 [[TMP14]] to i32
-; VF4IC2-NEXT: [[TMP19:%.*]] = add i32 [[INDEX]], [[TMP15]]
; VF4IC2-NEXT: br label %[[RETURN]]
; VF4IC2: [[RETURN]]:
-; VF4IC2-NEXT: [[RES:%.*]] = phi i32 [ [[TMP8]], %[[MIDDLE_BLOCK]] ], [ [[TMP19]], %[[VECTOR_EARLY_EXIT]] ]
+; VF4IC2-NEXT: [[RES:%.*]] = phi i32 [ [[TMP8]], %[[MIDDLE_BLOCK]] ], [ [[TMP15]], %[[VECTOR_EARLY_EXIT]] ]
; VF4IC2-NEXT: ret i32 [[RES]]
;
; VF8IC1-LABEL: define noundef i32 @f(
@@ -61,29 +50,20 @@ define noundef i32 @f(i32 noundef %g) {
; VF8IC1-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <8 x i32> [[BROADCAST_SPLATINSERT]], <8 x i32> poison, <8 x i32> zeroinitializer
; VF8IC1-NEXT: br label %[[VECTOR_BODY:.*]]
; VF8IC1: [[VECTOR_BODY]]:
-; VF8IC1-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
-; VF8IC1-NEXT: [[VEC_IND:%.*]] = phi <8 x i32> [ <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1]] ]
-; VF8IC1-NEXT: [[TMP0:%.*]] = shl nuw nsw <8 x i32> [[VEC_IND]], splat (i32 3)
-; VF8IC1-NEXT: [[TMP1:%.*]] = ashr <8 x i32> [[BROADCAST_SPLAT]], [[TMP0]]
+; VF8IC1-NEXT: [[TMP1:%.*]] = ashr <8 x i32> [[BROADCAST_SPLAT]], <i32 0, i32 8, i32 16, i32 24, i32 32, i32 40, i32 48, i32 56>
; VF8IC1-NEXT: [[TMP2:%.*]] = icmp ne <8 x i32> [[TMP1]], zeroinitializer
-; VF8IC1-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 8
; VF8IC1-NEXT: [[TMP8:%.*]] = freeze <8 x i1> [[TMP2]]
; VF8IC1-NEXT: [[TMP3:%.*]] = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> [[TMP8]])
-; VF8IC1-NEXT: [[TMP7:%.*]] = icmp eq i32 [[INDEX_NEXT]], 8
-; VF8IC1-NEXT: [[VEC_IND_NEXT]] = add nuw nsw <8 x i32> [[VEC_IND]], splat (i32 8)
-; VF8IC1-NEXT: br i1 [[TMP3]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; VF8IC1: [[VECTOR_BODY_MULTI_COND_1]]:
-; VF8IC1-NEXT: br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; VF8IC1-NEXT: br i1 [[TMP3]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; VF8IC1: [[MIDDLE_BLOCK]]:
; VF8IC1-NEXT: [[TMP4:%.*]] = extractelement <8 x i32> [[TMP1]], i32 7
; VF8IC1-NEXT: br label %[[RETURN:.*]]
; VF8IC1: [[VECTOR_EARLY_EXIT]]:
; VF8IC1-NEXT: [[TMP5:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v8i1(<8 x i1> [[TMP2]], i1 false)
; VF8IC1-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i32
-; VF8IC1-NEXT: [[TMP9:%.*]] = add i32 [[INDEX]], [[TMP6]]
; VF8IC1-NEXT: br label %[[RETURN]]
; VF8IC1: [[RETURN]]:
-; VF8IC1-NEXT: [[RES:%.*]] = phi i32 [ [[TMP4]], %[[MIDDLE_BLOCK]] ], [ [[TMP9]], %[[VECTOR_EARLY_EXIT]] ]
+; VF8IC1-NEXT: [[RES:%.*]] = phi i32 [ [[TMP4]], %[[MIDDLE_BLOCK]] ], [ [[TMP6]], %[[VECTOR_EARLY_EXIT]] ]
; VF8IC1-NEXT: ret i32 [[RES]]
;
entry:
diff --git a/llvm/test/Transforms/LoopVectorize/single-early-exit-deref-assumptions.ll b/llvm/test/Transforms/LoopVectorize/single-early-exit-deref-assumptions.ll
index adbcd21e346c5..753e688f08670 100644
--- a/llvm/test/Transforms/LoopVectorize/single-early-exit-deref-assumptions.ll
+++ b/llvm/test/Transforms/LoopVectorize/single-early-exit-deref-assumptions.ll
@@ -11,7 +11,7 @@ define i64 @early_exit_alignment_and_deref_known_via_assumption_with_constant_si
; CHECK: [[VECTOR_PH]]:
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], %[[VECTOR_BODY]] ]
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX1]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP0]], align 1
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX1]]
@@ -21,9 +21,10 @@ define i64 @early_exit_alignment_and_deref_known_via_assumption_with_constant_si
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP4]]
; CHECK-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 1024
-; CHECK-NEXT: br i1 [[TMP5]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
-; CHECK-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; CHECK-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]
+; CHECK-NEXT: br i1 [[TMP7]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; CHECK: [[MIDDLE_SPLIT]]:
+; CHECK-NEXT: br i1 [[TMP5]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: br label %[[LOOP_END:.*]]
; CHECK: [[VECTOR_EARLY_EXIT]]:
@@ -121,7 +122,7 @@ define i64 @early_exit_alignment_and_deref_known_via_assumption_n_not_zero(ptr n
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], %[[VECTOR_BODY]] ]
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX1]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP0]], align 1
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX1]]
@@ -131,14 +132,16 @@ define i64 @early_exit_alignment_and_deref_known_via_assumption_n_not_zero(ptr n
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP2]]
; CHECK-NEXT: [[TMP4:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT3]], [[N_VEC]]
-; CHECK-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
-; CHECK-NEXT: br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
+; CHECK-NEXT: [[TMP6:%.*]] = or i1 [[TMP4]], [[TMP5]]
+; CHECK-NEXT: br i1 [[TMP6]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
+; CHECK: [[MIDDLE_SPLIT]]:
+; CHECK-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
-; CHECK-NEXT: [[IND_ESCAPE:%.*]] = sub i64 [[N_VEC]], 1
; CHECK-NEXT: br i1 [[CMP_N]], label %[[LOOP_END_LOOPEXIT:.*]], label %[[SCALAR_PH]]
; CHECK: [[VECTOR_EARLY_EXIT]]:
+; CHECK-NEXT: [[TMP7:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v4i1(<4 x i1> [[TMP2]], i1 false)
+; CHECK-NEXT: [[TMP8:%.*]] = add i64 [[INDEX1]], [[TMP7]]
; CHECK-NEXT: br label %[[LOOP_END_LOOPEXIT]]
; CHECK: [[SCALAR_PH]]:
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[LOOP_PREHEADER]] ]
@@ -156,7 +159,7 @@ define i64 @early_exit_alignment_and_deref_known_via_assumption_n_not_zero(ptr n
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], [[N]]
; CHECK-NEXT: br i1 [[EXITCOND]], label %[[LOOP]], label %[[LOOP_END_LOOPEXIT]], !llvm.loop [[LOOP4:![0-9]+]]
; CHECK: [[LOOP_END_LOOPEXIT]]:
-; CHECK-NEXT: [[RETVAL_PH:%.*]] = phi i64 [ -1, %[[LOOP_INC]] ], [ [[INDEX]], %[[LOOP]] ], [ [[IND_ESCAPE]], %[[MIDDLE_BLOCK]] ], [ -1, %[[VECTOR_EARLY_EXIT]] ]
+; CHECK-NEXT: [[RETVAL_PH:%.*]] = phi i64 [ -1, %[[LOOP_INC]] ], [ [[INDEX]], %[[LOOP]] ], [ -1, %[[MIDDLE_BLOCK]] ], [ [[TMP8]], %[[VECTOR_EARLY_EXIT]] ]
; CHECK-NEXT: br label %[[LOOP_END]]
; CHECK: [[LOOP_END]]:
; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[RETVAL_PH]], %[[LOOP_END_LOOPEXIT]] ]
@@ -316,7 +319,7 @@ define i64 @early_exit_alignment_and_deref_known_via_assumption_n_not_zero_i16_p
; CHECK-NEXT: [[IV_NEXT1:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP3]]
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = mul i64 [[INDEX]], 2
; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[A]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i16>, ptr [[NEXT_GEP]], align 2
@@ -325,14 +328,18 @@ define i64 @early_exit_alignment_and_deref_known_via_assumption_n_not_zero_i16_p
; CHECK-NEXT: [[TMP6:%.*]] = freeze <4 x i1> [[TMP5]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP6]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
-; CHECK-NEXT: br i1 [[TMP7]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
-; CHECK-NEXT: br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
+; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
+; CHECK-NEXT: br i1 [[TMP9]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
+; CHECK: [[MIDDLE_SPLIT]]:
+; CHECK-NEXT: br i1 [[TMP7]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP2]], [[N_VEC]]
-; CHECK-NEXT: [[IND_ESCAPE:%.*]] = getelementptr i8, ptr [[IV_NEXT1]], i64 -2
; CHECK-NEXT: br i1 [[CMP_N]], label %[[EXIT_LOOPEXIT:.*]], label %[[SCALAR_PH]]
; CHECK: [[VECTOR_EARLY_EXIT]]:
+; CHECK-NEXT: [[TMP10:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v4i1(<4 x i1> [[TMP5]], i1 false)
+; CHECK-NEXT: [[TMP11:%.*]] = add i64 [[INDEX]], [[TMP10]]
+; CHECK-NEXT: [[TMP12:%.*]] = mul i64 [[TMP11]], 2
+; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP12]]
; CHECK-NEXT: br label %[[EXIT_LOOPEXIT]]
; CHECK: [[SCALAR_PH]]:
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi ptr [ [[IV_NEXT1]], %[[MIDDLE_BLOCK]] ], [ [[A]], %[[LOOP_HEADER_PREHEADER]] ]
@@ -347,7 +354,7 @@ define i64 @early_exit_alignment_and_deref_known_via_assumption_n_not_zero_i16_p
; CHECK-NEXT: [[EC:%.*]] = icmp eq ptr [[IV_NEXT]], [[A_END]]
; CHECK-NEXT: br i1 [[EC]], label %[[EXIT_LOOPEXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP6:![0-9]+]]
; CHECK: [[EXIT_LOOPEXIT]]:
-; CHECK-NEXT: [[P_PH:%.*]] = phi ptr [ [[A_END]], %[[LOOP_LATCH]] ], [ [[IV]], %[[LOOP_HEADER]] ], [ [[IND_ESCAPE]], %[[MIDDLE_BLOCK]] ], [ [[A_END]], %[[VECTOR_EARLY_EXIT]] ]
+; CHECK-NEXT: [[P_PH:%.*]] = phi ptr [ [[A_END]], %[[LOOP_LATCH]] ], [ [[IV]], %[[LOOP_HEADER]] ], [ [[A_END]], %[[MIDDLE_BLOCK]] ], [ [[TMP13]], %[[VECTOR_EARLY_EXIT]] ]
; CHECK-NEXT: br label %[[EXIT]]
; CHECK: [[EXIT]]:
; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[A]], %[[ENTRY]] ], [ [[P_PH]], %[[EXIT_LOOPEXIT]] ]
@@ -407,7 +414,7 @@ define ptr @find_deref_pointer_distance_align_attribute_argument(ptr align 2 %fi
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[FIRST]], i64 [[TMP4]]
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = mul i64 [[INDEX]], 2
; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[FIRST]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i16>, ptr [[NEXT_GEP]], align 2
@@ -416,18 +423,17 @@ define ptr @find_deref_pointer_distance_align_attribute_argument(ptr align 2 %fi
; CHECK-NEXT: [[TMP7:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP8:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP7]])
; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
-; CHECK-NEXT: br i1 [[TMP8]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
-; CHECK-NEXT: br i1 [[TMP9]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
+; CHECK-NEXT: [[TMP10:%.*]] = or i1 [[TMP8]], [[TMP9]]
+; CHECK-NEXT: br i1 [[TMP10]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
+; CHECK: [[MIDDLE_SPLIT]]:
+; CHECK-NEXT: br i1 [[TMP8]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP3]], [[N_VEC]]
-; CHECK-NEXT: [[IND_ESCAPE:%.*]] = getelementptr i8, ptr [[TMP5]], i64 -2
; CHECK-NEXT: br i1 [[CMP_N]], label %[[EXIT_LOOPEXIT:.*]], label %[[SCALAR_PH]]
; CHECK: [[VECTOR_EARLY_EXIT]]:
; CHECK-NEXT: [[TMP11:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v4i1(<4 x i1> [[TMP6]], i1 false)
; CHECK-NEXT: [[TMP12:%.*]] = add i64 [[INDEX]], [[TMP11]]
-; CHECK-NEXT: [[TMP15:%.*]] = add i64 [[TMP12]], 1
-; CHECK-NEXT: [[TMP13:%.*]] = mul i64 [[TMP15]], 2
+; CHECK-NEXT: [[TMP13:%.*]] = mul i64 [[TMP12]], 2
; CHECK-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[FIRST]], i64 [[TMP13]]
; CHECK-NEXT: br label %[[EXIT_LOOPEXIT]]
; CHECK: [[SCALAR_PH]]:
@@ -443,7 +449,7 @@ define ptr @find_deref_pointer_distance_align_attribute_argument(ptr align 2 %fi
; CHECK-NEXT: [[C_2:%.*]] = icmp eq ptr [[IV_NEXT]], [[LAST]]
; CHECK-NEXT: br i1 [[C_2]], label %[[EXIT_LOOPEXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP8:![0-9]+]]
; CHECK: [[EXIT_LOOPEXIT]]:
-; CHECK-NEXT: [[FIRST_ADDR_0_LCSSA_I_PH:%.*]] = phi ptr [ [[IV_NEXT]], %[[LOOP_LATCH]] ], [ [[IV]], %[[LOOP_HEADER]] ], [ [[IND_ESCAPE]], %[[MIDDLE_BLOCK]] ], [ [[TMP14]], %[[VECTOR_EARLY_EXIT]] ]
+; CHECK-NEXT: [[FIRST_ADDR_0_LCSSA_I_PH:%.*]] = phi ptr [ [[IV_NEXT]], %[[LOOP_LATCH]] ], [ [[IV]], %[[LOOP_HEADER]] ], [ [[TMP5]], %[[MIDDLE_BLOCK]] ], [ [[TMP14]], %[[VECTOR_EARLY_EXIT]] ]
; CHECK-NEXT: br label %[[EXIT]]
; CHECK: [[EXIT]]:
; CHECK-NEXT: [[FIRST_ADDR_0_LCSSA_I:%.*]] = phi ptr [ [[FIRST]], %[[ENTRY]] ], [ [[FIRST_ADDR_0_LCSSA_I_PH]], %[[EXIT_LOOPEXIT]] ]
@@ -502,7 +508,7 @@ define ptr @find_deref_pointer_distance_align_assumption(ptr %first, ptr %last)
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[FIRST]], i64 [[TMP4]]
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = mul i64 [[INDEX]], 2
; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[FIRST]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i16>, ptr [[NEXT_GEP]], align 2
@@ -511,18 +517,17 @@ define ptr @find_deref_pointer_distance_align_assumption(ptr %first, ptr %last)
; CHECK-NEXT: [[TMP7:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP8:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP7]])
; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
-; CHECK-NEXT: br i1 [[TMP8]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
-; CHECK-NEXT: br i1 [[TMP9]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
+; CHECK-NEXT: [[TMP10:%.*]] = or i1 [[TMP8]], [[TMP9]]
+; CHECK-NEXT: br i1 [[TMP10]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
+; CHECK: [[MIDDLE_SPLIT]]:
+; CHECK-NEXT: br i1 [[TMP8]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP3]], [[N_VEC]]
-; CHECK-NEXT: [[IND_ESCAPE:%.*]] = getelementptr i8, ptr [[TMP5]], i64 -2
; CHECK-NEXT: br i1 [[CMP_N]], label %[[EXIT_LOOPEXIT:.*]], label %[[SCALAR_PH]]
; CHECK: [[VECTOR_EARLY_EXIT]]:
; CHECK-NEXT: [[TMP11:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v4i1(<4 x i1> [[TMP6]], i1 false)
; CHECK-NEXT: [[TMP12:%.*]] = add i64 [[INDEX]], [[TMP11]]
-; CHECK-NEXT: [[TMP15:%.*]] = add i64 [[TMP12]], 1
-; CHECK-NEXT: [[TMP13:%.*]] = mul i64 [[TMP15]], 2
+; CHECK-NEXT: [[TMP13:%.*]] = mul i64 [[TMP12]], 2
; CHECK-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[FIRST]], i64 [[TMP13]]
; CHECK-NEXT: br label %[[EXIT_LOOPEXIT]]
; CHECK: [[SCALAR_PH]]:
@@ -538,7 +543,7 @@ define ptr @find_deref_pointer_distance_align_assumption(ptr %first, ptr %last)
; CHECK-NEXT: [[C_2:%.*]] = icmp eq ptr [[IV_NEXT]], [[LAST]]
; CHECK-NEXT: br i1 [[C_2]], label %[[EXIT_LOOPEXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP10:![0-9]+]]
; CHECK: [[EXIT_LOOPEXIT]]:
-; CHECK-NEXT: [[FIRST_ADDR_0_LCSSA_I_PH:%.*]] = phi ptr [ [[IV_NEXT]], %[[LOOP_LATCH]] ], [ [[IV]], %[[LOOP_HEADER]] ], [ [[IND_ESCAPE]], %[[MIDDLE_BLOCK]] ], [ [[TMP14]], %[[VECTOR_EARLY_EXIT]] ]
+; CHECK-NEXT: [[FIRST_ADDR_0_LCSSA_I_PH:%.*]] = phi ptr [ [[IV_NEXT]], %[[LOOP_LATCH]] ], [ [[IV]], %[[LOOP_HEADER]] ], [ [[TMP5]], %[[MIDDLE_BLOCK]] ], [ [[TMP14]], %[[VECTOR_EARLY_EXIT]] ]
; CHECK-NEXT: br label %[[EXIT]]
; CHECK: [[EXIT]]:
; CHECK-NEXT: [[FIRST_ADDR_0_LCSSA_I:%.*]] = phi ptr [ [[FIRST]], %[[ENTRY]] ], [ [[FIRST_ADDR_0_LCSSA_I_PH]], %[[EXIT_LOOPEXIT]] ]
@@ -580,7 +585,7 @@ define i64 @early_exit_alignment_and_deref_known_via_assumption_with_constant_si
; CHECK: [[VECTOR_PH]]:
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], %[[VECTOR_BODY]] ]
; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX1]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[ARRAYIDX2]], align 1
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX1]]
@@ -590,9 +595,10 @@ define i64 @early_exit_alignment_and_deref_known_via_assumption_with_constant_si
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP2]]
; CHECK-NEXT: [[TMP4:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 1024
-; CHECK-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
-; CHECK-NEXT: br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
+; CHECK-NEXT: [[TMP6:%.*]] = or i1 [[TMP4]], [[TMP5]]
+; CHECK-NEXT: br i1 [[TMP6]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
+; CHECK: [[MIDDLE_SPLIT]]:
+; CHECK-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: br label %[[LOOP_END:.*]]
; CHECK: [[VECTOR_EARLY_EXIT]]:
@@ -717,7 +723,7 @@ define i64 @find_if_pointer_distance_deref_via_assumption(ptr %vec) nofree nosyn
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[BEGIN]], i64 [[TMP4]]
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = mul i64 [[INDEX]], 2
; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[BEGIN]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i16>, ptr [[NEXT_GEP]], align 2
@@ -726,9 +732,10 @@ define i64 @find_if_pointer_distance_deref_via_assumption(ptr %vec) nofree nosyn
; CHECK-NEXT: [[TMP7:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP8:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP7]])
; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
-; CHECK-NEXT: br i1 [[TMP8]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
-; CHECK-NEXT: br i1 [[TMP9]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]
+; CHECK-NEXT: [[TMP10:%.*]] = or i1 [[TMP8]], [[TMP9]]
+; CHECK-NEXT: br i1 [[TMP10]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]
+; CHECK: [[MIDDLE_SPLIT]]:
+; CHECK-NEXT: br i1 [[TMP8]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP3]], [[N_VEC]]
; CHECK-NEXT: br i1 [[CMP_N]], label %[[EXIT_LOOPEXIT:.*]], label %[[SCALAR_PH]]
diff --git a/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave-hint.ll b/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave-hint.ll
index cd31f40e5e52c..4caf292b1ce92 100644
--- a/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave-hint.ll
+++ b/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave-hint.ll
@@ -12,7 +12,7 @@ define i64 @multi_exiting_to_different_exits_live_in_exit_values() {
; VF4IC4: [[VECTOR_PH]]:
; VF4IC4-NEXT: br label %[[VECTOR_BODY:.*]]
; VF4IC4: [[VECTOR_BODY]]:
-; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
; VF4IC4-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 [[INDEX]]
; VF4IC4-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 4
; VF4IC4-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 8
@@ -35,9 +35,10 @@ define i64 @multi_exiting_to_different_exits_live_in_exit_values() {
; VF4IC4-NEXT: [[TMP11:%.*]] = or <4 x i1> [[TMP16]], [[TMP17]]
; VF4IC4-NEXT: [[TMP3:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP11]])
; VF4IC4-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 128
-; VF4IC4-NEXT: br i1 [[TMP3]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; VF4IC4: [[VECTOR_BODY_MULTI_COND_1]]:
-; VF4IC4-NEXT: br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; VF4IC4-NEXT: [[TMP18:%.*]] = or i1 [[TMP3]], [[TMP4]]
+; VF4IC4-NEXT: br i1 [[TMP18]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; VF4IC4: [[MIDDLE_SPLIT]]:
+; VF4IC4-NEXT: br i1 [[TMP3]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; VF4IC4: [[MIDDLE_BLOCK]]:
; VF4IC4-NEXT: br label %[[E2:.*]]
; VF4IC4: [[VECTOR_EARLY_EXIT]]:
diff --git a/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave-only.ll b/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave-only.ll
index da3a1f40db24f..a50ce969da7f4 100644
--- a/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave-only.ll
+++ b/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave-only.ll
@@ -12,7 +12,7 @@ define i8 @iv_used_in_exit_with_math(i8 noundef %g) {
; CHECK: [[VECTOR_PH]]:
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = trunc i32 [[INDEX]] to i8
; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[OFFSET_IDX]], 1
; CHECK-NEXT: [[TMP1:%.*]] = shl nuw i8 1, [[OFFSET_IDX]]
@@ -26,9 +26,10 @@ define i8 @iv_used_in_exit_with_math(i8 noundef %g) {
; CHECK-NEXT: [[TMP13:%.*]] = freeze i1 [[TMP8]]
; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP12]], [[TMP13]]
; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i32 [[INDEX_NEXT]], 4
-; CHECK-NEXT: br i1 [[TMP9]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
-; CHECK-NEXT: br i1 [[TMP10]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; CHECK-NEXT: [[TMP11:%.*]] = or i1 [[TMP9]], [[TMP10]]
+; CHECK-NEXT: br i1 [[TMP11]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; CHECK: [[MIDDLE_SPLIT]]:
+; CHECK-NEXT: br i1 [[TMP9]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: br label %[[RETURN:.*]]
; CHECK: [[VECTOR_EARLY_EXIT]]:
@@ -81,7 +82,7 @@ define i32 @iv_used_in_exit_with_loads(ptr align 4 dereferenceable(128) %src) {
; CHECK: [[VECTOR_PH]]:
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[INDEX]], 1
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i32 [[INDEX]]
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i32 [[TMP0]]
@@ -94,9 +95,10 @@ define i32 @iv_used_in_exit_with_loads(ptr align 4 dereferenceable(128) %src) {
; CHECK-NEXT: [[TMP13:%.*]] = freeze i1 [[TMP8]]
; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP12]], [[TMP13]]
; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i32 [[INDEX_NEXT]], 32
-; CHECK-NEXT: br i1 [[TMP9]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
-; CHECK-NEXT: br i1 [[TMP10]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
+; CHECK-NEXT: [[TMP11:%.*]] = or i1 [[TMP9]], [[TMP10]]
+; CHECK-NEXT: br i1 [[TMP11]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
+; CHECK: [[MIDDLE_SPLIT]]:
+; CHECK-NEXT: br i1 [[TMP9]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: br label %[[RETURN:.*]]
; CHECK: [[VECTOR_EARLY_EXIT]]:
diff --git a/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave.ll b/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave.ll
index 01776e5283298..45d80ac2c4992 100644
--- a/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave.ll
+++ b/llvm/test/Transforms/LoopVectorize/single-early-exit-interleave.ll
@@ -12,7 +12,7 @@ define i64 @multi_exiting_to_different_exits_live_in_exit_values() {
; VF4IC4: vector.ph:
; VF4IC4-NEXT: br label [[VECTOR_BODY:%.*]]
; VF4IC4: vector.body:
-; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
; VF4IC4-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 [[INDEX]]
; VF4IC4-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 4
; VF4IC4-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 8
@@ -35,9 +35,10 @@ define i64 @multi_exiting_to_different_exits_live_in_exit_values() {
; VF4IC4-NEXT: [[TMP11:%.*]] = or <4 x i1> [[TMP15]], [[TMP16]]
; VF4IC4-NEXT: [[TMP3:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP11]])
; VF4IC4-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 128
-; VF4IC4-NEXT: br i1 [[TMP3]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; VF4IC4: vector.body.cond.1:
-; VF4IC4-NEXT: br i1 [[TMP4]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; VF4IC4-NEXT: [[TMP5:%.*]] = or i1 [[TMP3]], [[TMP4]]
+; VF4IC4-NEXT: br i1 [[TMP5]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; VF4IC4: middle.split:
+; VF4IC4-NEXT: br i1 [[TMP3]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[E2:%.*]]
; VF4IC4: vector.early.exit:
@@ -84,7 +85,7 @@ define i64 @same_exit_block_pre_inc_use1() {
; VF4IC4: vector.ph:
; VF4IC4-NEXT: br label [[VECTOR_BODY:%.*]]
; VF4IC4: vector.body:
-; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
; VF4IC4-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX]]
; VF4IC4-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; VF4IC4-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 4
@@ -116,9 +117,10 @@ define i64 @same_exit_block_pre_inc_use1() {
; VF4IC4-NEXT: [[TMP16:%.*]] = or <4 x i1> [[TMP15]], [[TMP36]]
; VF4IC4-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP16]])
; VF4IC4-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 64
-; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; VF4IC4: vector.body.cond.1:
-; VF4IC4-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
+; VF4IC4-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]
+; VF4IC4-NEXT: br i1 [[TMP7]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
+; VF4IC4: middle.split:
+; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[LOOP_END:%.*]]
; VF4IC4: vector.early.exit:
@@ -140,7 +142,7 @@ define i64 @same_exit_block_pre_inc_use1() {
; VF4IC4-NEXT: [[TMP10:%.*]] = add i64 3, [[TMP9]]
; VF4IC4-NEXT: br label [[LOOP_END]]
; VF4IC4: loop.end:
-; VF4IC4-NEXT: [[RETVAL:%.*]] = phi i64 [ [[TMP10]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
+; VF4IC4-NEXT: [[RETVAL:%.*]] = phi i64 [ [[TMP10]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
; VF4IC4-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -179,7 +181,7 @@ define ptr @same_exit_block_pre_inc_use1_ivptr() {
; VF4IC4: vector.ph:
; VF4IC4-NEXT: br label [[VECTOR_BODY:%.*]]
; VF4IC4: vector.body:
-; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
; VF4IC4-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[P1]], i64 [[INDEX]]
; VF4IC4-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[NEXT_GEP]], i64 4
; VF4IC4-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[NEXT_GEP]], i64 8
@@ -202,9 +204,10 @@ define ptr @same_exit_block_pre_inc_use1_ivptr() {
; VF4IC4-NEXT: [[TMP9:%.*]] = or <4 x i1> [[TMP33]], [[TMP34]]
; VF4IC4-NEXT: [[TMP10:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP9]])
; VF4IC4-NEXT: [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024
-; VF4IC4-NEXT: br i1 [[TMP10]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; VF4IC4: vector.body.cond.1:
-; VF4IC4-NEXT: br i1 [[TMP11]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
+; VF4IC4-NEXT: [[TMP12:%.*]] = or i1 [[TMP10]], [[TMP11]]
+; VF4IC4-NEXT: br i1 [[TMP12]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
+; VF4IC4: middle.split:
+; VF4IC4-NEXT: br i1 [[TMP10]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[LOOP_END:%.*]]
; VF4IC4: vector.early.exit:
@@ -226,7 +229,7 @@ define ptr @same_exit_block_pre_inc_use1_ivptr() {
; VF4IC4-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[P1]], i64 [[TMP7]]
; VF4IC4-NEXT: br label [[LOOP_END]]
; VF4IC4: loop.end:
-; VF4IC4-NEXT: [[RETVAL:%.*]] = phi ptr [ [[TMP8]], [[VECTOR_EARLY_EXIT]] ], [ [[PTREND]], [[MIDDLE_BLOCK1]] ]
+; VF4IC4-NEXT: [[RETVAL:%.*]] = phi ptr [ [[TMP8]], [[VECTOR_EARLY_EXIT]] ], [ [[PTREND]], [[MIDDLE_BLOCK]] ]
; VF4IC4-NEXT: ret ptr [[RETVAL]]
;
entry:
@@ -262,7 +265,7 @@ define i64 @same_exit_block_post_inc_use() {
; VF4IC4: vector.ph:
; VF4IC4-NEXT: br label [[VECTOR_BODY:%.*]]
; VF4IC4: vector.body:
-; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
; VF4IC4-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX]]
; VF4IC4-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; VF4IC4-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 4
@@ -294,9 +297,10 @@ define i64 @same_exit_block_post_inc_use() {
; VF4IC4-NEXT: [[TMP16:%.*]] = or <4 x i1> [[TMP15]], [[TMP36]]
; VF4IC4-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP16]])
; VF4IC4-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 64
-; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; VF4IC4: vector.body.cond.1:
-; VF4IC4-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
+; VF4IC4-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]
+; VF4IC4-NEXT: br i1 [[TMP7]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
+; VF4IC4: middle.split:
+; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[LOOP_END:%.*]]
; VF4IC4: vector.early.exit:
@@ -318,7 +322,7 @@ define i64 @same_exit_block_post_inc_use() {
; VF4IC4-NEXT: [[TMP10:%.*]] = add i64 3, [[TMP9]]
; VF4IC4-NEXT: br label [[LOOP_END]]
; VF4IC4: loop.end:
-; VF4IC4-NEXT: [[RETVAL:%.*]] = phi i64 [ [[TMP10]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
+; VF4IC4-NEXT: [[RETVAL:%.*]] = phi i64 [ [[TMP10]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
; VF4IC4-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -358,7 +362,7 @@ define i64 @diff_exit_block_pre_inc_use1() {
; VF4IC4: vector.ph:
; VF4IC4-NEXT: br label [[VECTOR_BODY:%.*]]
; VF4IC4: vector.body:
-; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
; VF4IC4-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX]]
; VF4IC4-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; VF4IC4-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 4
@@ -390,9 +394,10 @@ define i64 @diff_exit_block_pre_inc_use1() {
; VF4IC4-NEXT: [[TMP16:%.*]] = or <4 x i1> [[TMP15]], [[TMP36]]
; VF4IC4-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP16]])
; VF4IC4-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 64
-; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; VF4IC4: vector.body.cond.1:
-; VF4IC4-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
+; VF4IC4-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]
+; VF4IC4-NEXT: br i1 [[TMP7]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
+; VF4IC4: middle.split:
+; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[LOOP_END:%.*]]
; VF4IC4: vector.early.exit:
@@ -459,7 +464,7 @@ define i64 @diff_exit_block_post_inc_use1() {
; VF4IC4: vector.ph:
; VF4IC4-NEXT: br label [[VECTOR_BODY:%.*]]
; VF4IC4: vector.body:
-; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
; VF4IC4-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX]]
; VF4IC4-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; VF4IC4-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 4
@@ -491,9 +496,10 @@ define i64 @diff_exit_block_post_inc_use1() {
; VF4IC4-NEXT: [[TMP16:%.*]] = or <4 x i1> [[TMP15]], [[TMP36]]
; VF4IC4-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP16]])
; VF4IC4-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 64
-; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; VF4IC4: vector.body.cond.1:
-; VF4IC4-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
+; VF4IC4-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]
+; VF4IC4-NEXT: br i1 [[TMP7]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
+; VF4IC4: middle.split:
+; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[LOOP_END:%.*]]
; VF4IC4: vector.early.exit:
@@ -560,7 +566,7 @@ define i64 @same_exit_block_pre_inc_use1_reverse() {
; VF4IC4: vector.ph:
; VF4IC4-NEXT: br label [[VECTOR_BODY:%.*]]
; VF4IC4: vector.body:
-; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
; VF4IC4-NEXT: [[OFFSET_IDX:%.*]] = sub i64 1023, [[INDEX]]
; VF4IC4-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; VF4IC4-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 0
@@ -610,9 +616,10 @@ define i64 @same_exit_block_pre_inc_use1_reverse() {
; VF4IC4-NEXT: [[TMP24:%.*]] = or <4 x i1> [[TMP45]], [[TMP47]]
; VF4IC4-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP24]])
; VF4IC4-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1008
-; VF4IC4-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; VF4IC4: vector.body.cond.1:
-; VF4IC4-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
+; VF4IC4-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
+; VF4IC4-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
+; VF4IC4: middle.split:
+; VF4IC4-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[SCALAR_PH:%.*]]
; VF4IC4: vector.early.exit:
@@ -689,7 +696,7 @@ define i8 @same_exit_block_use_loaded_value() {
; VF4IC4: vector.ph:
; VF4IC4-NEXT: br label [[VECTOR_BODY:%.*]]
; VF4IC4: vector.body:
-; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
; VF4IC4-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
; VF4IC4-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 4
; VF4IC4-NEXT: [[TMP2:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 8
@@ -720,9 +727,10 @@ define i8 @same_exit_block_use_loaded_value() {
; VF4IC4-NEXT: [[TMP16:%.*]] = or <4 x i1> [[TMP19]], [[TMP30]]
; VF4IC4-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP16]])
; VF4IC4-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024
-; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; VF4IC4: vector.body.cond.1:
-; VF4IC4-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
+; VF4IC4-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]
+; VF4IC4-NEXT: br i1 [[TMP7]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
+; VF4IC4: middle.split:
+; VF4IC4-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[LOOP_END:%.*]]
; VF4IC4: vector.early.exit:
@@ -755,7 +763,7 @@ define i8 @same_exit_block_use_loaded_value() {
; VF4IC4-NEXT: [[TMP42:%.*]] = select i1 [[TMP41]], i8 [[TMP40]], i8 [[TMP38]]
; VF4IC4-NEXT: br label [[LOOP_END]]
; VF4IC4: loop.end:
-; VF4IC4-NEXT: [[RETVAL:%.*]] = phi i8 [ [[TMP42]], [[VECTOR_EARLY_EXIT]] ], [ -1, [[MIDDLE_BLOCK1]] ]
+; VF4IC4-NEXT: [[RETVAL:%.*]] = phi i8 [ [[TMP42]], [[VECTOR_EARLY_EXIT]] ], [ -1, [[MIDDLE_BLOCK]] ]
; VF4IC4-NEXT: ret i8 [[RETVAL]]
;
entry:
@@ -796,7 +804,7 @@ define i8 @same_exit_block_reverse_use_loaded_value() {
; VF4IC4: vector.ph:
; VF4IC4-NEXT: br label [[VECTOR_BODY:%.*]]
; VF4IC4: vector.body:
-; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; VF4IC4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
; VF4IC4-NEXT: [[OFFSET_IDX:%.*]] = sub i64 1023, [[INDEX]]
; VF4IC4-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; VF4IC4-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 0
@@ -846,9 +854,10 @@ define i8 @same_exit_block_reverse_use_loaded_value() {
; VF4IC4-NEXT: [[TMP24:%.*]] = or <4 x i1> [[TMP52]], [[TMP53]]
; VF4IC4-NEXT: [[TMP25:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP24]])
; VF4IC4-NEXT: [[TMP26:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1008
-; VF4IC4-NEXT: br i1 [[TMP25]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; VF4IC4: vector.body.cond.1:
-; VF4IC4-NEXT: br i1 [[TMP26]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
+; VF4IC4-NEXT: [[TMP27:%.*]] = or i1 [[TMP25]], [[TMP26]]
+; VF4IC4-NEXT: br i1 [[TMP27]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
+; VF4IC4: middle.split:
+; VF4IC4-NEXT: br i1 [[TMP25]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; VF4IC4: middle.block:
; VF4IC4-NEXT: br label [[SCALAR_PH:%.*]]
; VF4IC4: vector.early.exit:
diff --git a/llvm/test/Transforms/LoopVectorize/single_early_exit.ll b/llvm/test/Transforms/LoopVectorize/single_early_exit.ll
index 88c7ca6cf37d9..71e2b82e2fdd1 100644
--- a/llvm/test/Transforms/LoopVectorize/single_early_exit.ll
+++ b/llvm/test/Transforms/LoopVectorize/single_early_exit.ll
@@ -15,7 +15,7 @@ define i64 @same_exit_block_phi_of_consts() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -26,15 +26,16 @@ define i64 @same_exit_block_phi_of_consts() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
+; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ 0, [[VECTOR_EARLY_EXIT]] ], [ 1, [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ 0, [[VECTOR_EARLY_EXIT]] ], [ 1, [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -75,7 +76,7 @@ define i64 @diff_exit_block_phi_of_consts() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -86,9 +87,10 @@ define i64 @diff_exit_block_phi_of_consts() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
+; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
+; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -157,7 +159,7 @@ define i32 @diff_exit_block_needs_scev_check(i32 %end) {
; CHECK-NEXT: [[TMP8:%.*]] = trunc i64 [[N_VEC]] to i8
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i32, ptr [[P1]], i64 [[INDEX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP10]], align 4
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[P2]], i64 [[INDEX]]
@@ -167,17 +169,18 @@ define i32 @diff_exit_block_needs_scev_check(i32 %end) {
; CHECK-NEXT: [[TMP13:%.*]] = freeze <4 x i1> [[TMP14]]
; CHECK-NEXT: [[TMP15:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP13]])
; CHECK-NEXT: [[TMP16:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
-; CHECK-NEXT: br i1 [[TMP15]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP16]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
+; CHECK-NEXT: [[TMP17:%.*]] = or i1 [[TMP15]], [[TMP16]]
+; CHECK-NEXT: br i1 [[TMP17]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP15]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[UMAX1]], [[N_VEC]]
; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
; CHECK: vector.early.exit:
; CHECK-NEXT: br label [[FOUND:%.*]]
; CHECK: scalar.ph:
-; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i8 [ [[TMP8]], [[MIDDLE_BLOCK1]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
-; CHECK-NEXT: [[BC_RESUME_VAL3:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK1]] ], [ 0, [[ENTRY]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
+; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i8 [ [[TMP8]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
+; CHECK-NEXT: [[BC_RESUME_VAL3:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
; CHECK: for.body:
; CHECK-NEXT: [[IND:%.*]] = phi i8 [ [[IND_NEXT:%.*]], [[FOR_INC:%.*]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ]
@@ -251,12 +254,13 @@ define i32 @diff_blocks_invariant_early_exit_cond(ptr %s) {
; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[INDEX_NEXT]], 276
-; CHECK-NEXT: br i1 [[TMP1]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP2]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
+; CHECK-NEXT: [[TMP3:%.*]] = or i1 [[TMP1]], [[TMP2]]
+; CHECK-NEXT: br i1 [[TMP3]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP1]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[FOR_END:%.*]]
; CHECK: vector.early.exit:
@@ -307,7 +311,7 @@ define void @inner_loop_trip_count_depends_on_outer_iv(ptr align 8 dereferenceab
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[OUTER_IV]], [[N_MOD_VF]]
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr ptr, ptr [[GEP_SRC]], i64 [[INDEX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x ptr>, ptr [[TMP0]], align 8
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq <4 x ptr> [[WIDE_LOAD]], zeroinitializer
@@ -315,16 +319,17 @@ define void @inner_loop_trip_count_depends_on_outer_iv(ptr align 8 dereferenceab
; CHECK-NEXT: [[TMP2:%.*]] = freeze <4 x i1> [[TMP1]]
; CHECK-NEXT: [[TMP3:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP2]])
; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
-; CHECK-NEXT: br i1 [[TMP3]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP4]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
+; CHECK-NEXT: [[TMP5:%.*]] = or i1 [[TMP3]], [[TMP4]]
+; CHECK-NEXT: br i1 [[TMP5]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP3]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[OUTER_IV]], [[N_VEC]]
; CHECK-NEXT: br i1 [[CMP_N]], label [[OUTER_LATCH_LOOPEXIT:%.*]], label [[SCALAR_PH]]
; CHECK: vector.early.exit:
; CHECK-NEXT: br label [[THEN_LOOPEXIT:%.*]]
; CHECK: scalar.ph:
-; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK1]] ], [ 0, [[INNER_HEADER_PREHEADER]] ]
+; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[INNER_HEADER_PREHEADER]] ]
; CHECK-NEXT: br label [[INNER_HEADER:%.*]]
; CHECK: inner.header:
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[INNER_LATCH:%.*]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ]
@@ -403,7 +408,7 @@ define i64 @loop_guard_needed_to_prove_dereferenceable(i32 %x, i1 %cmp2) {
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[TMP0]], [[N_MOD_VF]]
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr [32 x i32], ptr [[A]], i64 0, i64 [[INDEX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq <4 x i32> [[WIDE_LOAD]], zeroinitializer
@@ -411,17 +416,19 @@ define i64 @loop_guard_needed_to_prove_dereferenceable(i32 %x, i1 %cmp2) {
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP2]]
; CHECK-NEXT: [[TMP4:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
-; CHECK-NEXT: br i1 [[TMP4]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP5]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
+; CHECK-NEXT: [[TMP6:%.*]] = or i1 [[TMP4]], [[TMP5]]
+; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP4]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP0]], [[N_VEC]]
-; CHECK-NEXT: [[IND_ESCAPE:%.*]] = sub i64 [[N_VEC]], 1
; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT_LOOPEXIT:%.*]], label [[SCALAR_PH]]
; CHECK: vector.early.exit:
+; CHECK-NEXT: [[TMP7:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v4i1(<4 x i1> [[TMP2]], i1 false)
+; CHECK-NEXT: [[TMP8:%.*]] = add i64 [[INDEX]], [[TMP7]]
; CHECK-NEXT: br label [[EXIT_LOOPEXIT]]
; CHECK: scalar.ph:
-; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK1]] ], [ 0, [[PH]] ]
+; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[PH]] ]
; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
; CHECK: loop.header:
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
@@ -434,7 +441,7 @@ define i64 @loop_guard_needed_to_prove_dereferenceable(i32 %x, i1 %cmp2) {
; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV]], [[N_EXT]]
; CHECK-NEXT: br i1 [[EC]], label [[EXIT_LOOPEXIT]], label [[LOOP_HEADER]], !llvm.loop [[LOOP10:![0-9]+]]
; CHECK: exit.loopexit:
-; CHECK-NEXT: [[RES_PH:%.*]] = phi i64 [ [[IV]], [[LOOP_HEADER]] ], [ -1, [[LOOP_LATCH]] ], [ [[IND_ESCAPE]], [[MIDDLE_BLOCK1]] ], [ -1, [[VECTOR_EARLY_EXIT]] ]
+; CHECK-NEXT: [[RES_PH:%.*]] = phi i64 [ [[IV]], [[LOOP_HEADER]] ], [ -1, [[LOOP_LATCH]] ], [ -1, [[MIDDLE_BLOCK]] ], [ [[TMP8]], [[VECTOR_EARLY_EXIT]] ]
; CHECK-NEXT: br label [[EXIT]]
; CHECK: exit:
; CHECK-NEXT: [[RES:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[RES_PH]], [[EXIT_LOOPEXIT]] ]
@@ -549,7 +556,7 @@ define i64 @loop_guards_needed_to_prove_deref_multiple(i32 %x, i1 %c, ptr derefe
; CHECK-NEXT: [[IV_NEXT:%.*]] = sub i64 [[TMP2]], [[N_MOD_VF]]
; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[LOOP_HEADER]] ]
; CHECK-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[SRC]], i64 [[INDEX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP3]], align 1
; CHECK-NEXT: [[TMP4:%.*]] = icmp eq <4 x i8> [[WIDE_LOAD]], zeroinitializer
@@ -557,17 +564,19 @@ define i64 @loop_guards_needed_to_prove_deref_multiple(i32 %x, i1 %c, ptr derefe
; CHECK-NEXT: [[TMP5:%.*]] = freeze <4 x i1> [[TMP4]]
; CHECK-NEXT: [[TMP6:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP5]])
; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[IV_NEXT]]
-; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[LOOP_LATCH]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_BLOCK:%.*]], label [[LOOP_HEADER]], !llvm.loop [[LOOP11:![0-9]+]]
+; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP6]], [[TMP7]]
+; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_SPLIT:%.*]], label [[LOOP_HEADER]], !llvm.loop [[LOOP11:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[LOOP_LATCH:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP2]], [[IV_NEXT]]
-; CHECK-NEXT: [[IND_ESCAPE:%.*]] = sub i64 [[IV_NEXT]], 1
; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT_LOOPEXIT:%.*]], label [[SCALAR_PH]]
; CHECK: vector.early.exit:
+; CHECK-NEXT: [[TMP9:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v4i1(<4 x i1> [[TMP4]], i1 false)
+; CHECK-NEXT: [[TMP10:%.*]] = add i64 [[INDEX]], [[TMP9]]
; CHECK-NEXT: br label [[EXIT_LOOPEXIT]]
; CHECK: scalar.ph:
-; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT]], [[MIDDLE_BLOCK]] ], [ 0, [[PH]] ]
+; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT]], [[LOOP_LATCH]] ], [ 0, [[PH]] ]
; CHECK-NEXT: br label [[LOOP_HEADER1:%.*]]
; CHECK: loop.header:
; CHECK-NEXT: [[IV1:%.*]] = phi i64 [ [[IV_NEXT1:%.*]], [[LOOP_LATCH1:%.*]] ], [ [[IV]], [[SCALAR_PH]] ]
@@ -580,7 +589,7 @@ define i64 @loop_guards_needed_to_prove_deref_multiple(i32 %x, i1 %c, ptr derefe
; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV1]], [[N_EXT]]
; CHECK-NEXT: br i1 [[EC]], label [[EXIT_LOOPEXIT]], label [[LOOP_HEADER1]], !llvm.loop [[LOOP12:![0-9]+]]
; CHECK: exit.loopexit:
-; CHECK-NEXT: [[RES_PH:%.*]] = phi i64 [ [[IV1]], [[LOOP_HEADER1]] ], [ 0, [[LOOP_LATCH1]] ], [ [[IND_ESCAPE]], [[MIDDLE_BLOCK]] ], [ 0, [[VECTOR_EARLY_EXIT]] ]
+; CHECK-NEXT: [[RES_PH:%.*]] = phi i64 [ [[IV1]], [[LOOP_HEADER1]] ], [ 0, [[LOOP_LATCH1]] ], [ 0, [[LOOP_LATCH]] ], [ [[TMP10]], [[VECTOR_EARLY_EXIT]] ]
; CHECK-NEXT: br label [[EXIT]]
; CHECK: exit:
; CHECK-NEXT: [[RES:%.*]] = phi i64 [ -1, [[ENTRY:%.*]] ], [ -2, [[THEN]] ], [ [[RES_PH]], [[EXIT_LOOPEXIT]] ]
diff --git a/llvm/test/Transforms/LoopVectorize/single_early_exit_live_outs.ll b/llvm/test/Transforms/LoopVectorize/single_early_exit_live_outs.ll
index 0268225092023..b68a53c686436 100644
--- a/llvm/test/Transforms/LoopVectorize/single_early_exit_live_outs.ll
+++ b/llvm/test/Transforms/LoopVectorize/single_early_exit_live_outs.ll
@@ -14,7 +14,7 @@ define i64 @same_exit_block_pre_inc_use1() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -25,9 +25,10 @@ define i64 @same_exit_block_pre_inc_use1() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
+; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -36,7 +37,7 @@ define i64 @same_exit_block_pre_inc_use1() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP10]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -77,7 +78,7 @@ define i32 @same_exit_block_pre_inc_use1_iv64_endi32_step2() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -88,9 +89,10 @@ define i32 @same_exit_block_pre_inc_use1_iv64_endi32_step2() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
+; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
+; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -101,7 +103,7 @@ define i32 @same_exit_block_pre_inc_use1_iv64_endi32_step2() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i32 9, [[TMP11]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i32 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i32 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret i32 [[RETVAL]]
;
entry:
@@ -142,7 +144,7 @@ define i32 @same_exit_block_pre_inc_use1_iv128_endi32_step2() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i128 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i128 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = trunc i128 [[INDEX1]] to i64
; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[NEXT_GEP]], align 1
@@ -151,9 +153,10 @@ define i32 @same_exit_block_pre_inc_use1_iv128_endi32_step2() {
; CHECK-NEXT: [[TMP1:%.*]] = freeze <4 x i1> [[TMP4]]
; CHECK-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP1]])
; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i128 [[INDEX_NEXT2]], 64
-; CHECK-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
+; CHECK-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]
+; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -165,7 +168,7 @@ define i32 @same_exit_block_pre_inc_use1_iv128_endi32_step2() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i32 9, [[TMP10]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i32 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i32 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret i32 [[RETVAL]]
;
entry:
@@ -205,7 +208,7 @@ define float @same_exit_block_pre_inc_use1_iv64_endf32() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -216,9 +219,10 @@ define float @same_exit_block_pre_inc_use1_iv64_endf32() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
+; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
+; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -229,7 +233,7 @@ define float @same_exit_block_pre_inc_use1_iv64_endf32() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = fadd fast float 9.000000e+00, [[TMP11]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi float [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 1.230000e+02, [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi float [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 1.230000e+02, [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret float [[RETVAL]]
;
entry:
@@ -272,7 +276,7 @@ define ptr @same_exit_block_pre_inc_use1_iv64_endptr() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT7:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT7:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP10]], align 1
@@ -283,9 +287,10 @@ define ptr @same_exit_block_pre_inc_use1_iv64_endptr() {
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP15]]
; CHECK-NEXT: [[TMP16:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP17:%.*]] = icmp eq i64 [[INDEX_NEXT7]], 64
-; CHECK-NEXT: br i1 [[TMP16]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP17]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
+; CHECK-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]]
+; CHECK-NEXT: br i1 [[TMP18]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP16]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -295,7 +300,7 @@ define ptr @same_exit_block_pre_inc_use1_iv64_endptr() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = getelementptr i8, ptr [[P2]], i64 [[TMP20]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi ptr [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ [[P1]], [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi ptr [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ [[P1]], [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret ptr [[RETVAL]]
;
entry:
@@ -337,7 +342,7 @@ define ptr @same_exit_block_pre_inc_use1_ivptr() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[P1]], i64 [[INDEX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[NEXT_GEP]], align 1
; CHECK-NEXT: [[TMP11:%.*]] = icmp ne <4 x i8> [[WIDE_LOAD]], splat (i8 72)
@@ -345,9 +350,10 @@ define ptr @same_exit_block_pre_inc_use1_ivptr() {
; CHECK-NEXT: [[TMP1:%.*]] = freeze <4 x i1> [[TMP11]]
; CHECK-NEXT: [[TMP12:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP1]])
; CHECK-NEXT: [[TMP13:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024
-; CHECK-NEXT: br i1 [[TMP12]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP13]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
+; CHECK-NEXT: [[TMP14:%.*]] = or i1 [[TMP12]], [[TMP13]]
+; CHECK-NEXT: br i1 [[TMP14]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP12]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -356,7 +362,7 @@ define ptr @same_exit_block_pre_inc_use1_ivptr() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = getelementptr i8, ptr [[P1]], i64 [[TMP8]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi ptr [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ [[PTREND]], [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi ptr [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ [[PTREND]], [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret ptr [[RETVAL]]
;
entry:
@@ -394,7 +400,7 @@ define i64 @same_exit_block_pre_inc1_use_inv_cond(i1 %cond) {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -407,9 +413,10 @@ define i64 @same_exit_block_pre_inc1_use_inv_cond(i1 %cond) {
; CHECK-NEXT: [[TMP12:%.*]] = freeze <4 x i1> [[TMP7]]
; CHECK-NEXT: [[TMP8:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP12]])
; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: br i1 [[TMP8]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
+; CHECK-NEXT: [[TMP10:%.*]] = or i1 [[TMP8]], [[TMP9]]
+; CHECK-NEXT: br i1 [[TMP10]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP8]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -418,7 +425,7 @@ define i64 @same_exit_block_pre_inc1_use_inv_cond(i1 %cond) {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP11]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -460,7 +467,7 @@ define i64 @same_exit_block_pre_inc_use1_gep_two_indices() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds [1024 x i8], ptr [[P1]], i64 0, i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -471,9 +478,10 @@ define i64 @same_exit_block_pre_inc_use1_gep_two_indices() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
+; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
+; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -482,7 +490,7 @@ define i64 @same_exit_block_pre_inc_use1_gep_two_indices() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP10]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -523,7 +531,7 @@ define i64 @same_exit_block_pre_inc_use1_alloca_diff_type() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -534,9 +542,10 @@ define i64 @same_exit_block_pre_inc_use1_alloca_diff_type() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
+; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
+; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -545,7 +554,7 @@ define i64 @same_exit_block_pre_inc_use1_alloca_diff_type() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP10]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -586,7 +595,7 @@ define i64 @same_exit_block_pre_inc_use2() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -597,15 +606,16 @@ define i64 @same_exit_block_pre_inc_use2() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
+; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
+; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ 67, [[VECTOR_EARLY_EXIT]] ], [ 66, [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ 67, [[VECTOR_EARLY_EXIT]] ], [ 66, [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -646,7 +656,7 @@ define i64 @same_exit_block_pre_inc_use3() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -657,9 +667,10 @@ define i64 @same_exit_block_pre_inc_use3() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]
+; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
+; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -668,7 +679,7 @@ define i64 @same_exit_block_pre_inc_use3() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP10]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[INDEX_LCSSA:%.*]] = phi i64 [ 66, [[MIDDLE_BLOCK1]] ], [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ]
+; CHECK-NEXT: [[INDEX_LCSSA:%.*]] = phi i64 [ 66, [[MIDDLE_BLOCK]] ], [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ]
; CHECK-NEXT: ret i64 [[INDEX_LCSSA]]
;
entry:
@@ -710,8 +721,8 @@ define i64 @same_exit_block_pre_inc_use4() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[MIDDLE_BLOCK:%.*]] ]
-; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 3, i64 4, i64 5, i64 6>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[MIDDLE_BLOCK]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[VECTOR_BODY]] ]
+; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 3, i64 4, i64 5, i64 6>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i64>, ptr [[TMP1]], align 1
@@ -721,9 +732,10 @@ define i64 @same_exit_block_pre_inc_use4() {
; CHECK-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP2]])
; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT2]], 64
; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], splat (i64 4)
-; CHECK-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP13:![0-9]+]]
+; CHECK-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]
+; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP13:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP5]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -732,7 +744,7 @@ define i64 @same_exit_block_pre_inc_use4() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP8]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -771,7 +783,7 @@ define i64 @same_exit_block_post_inc_use() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP4]], align 1
@@ -782,9 +794,10 @@ define i64 @same_exit_block_post_inc_use() {
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP13]]
; CHECK-NEXT: [[TMP14:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP15:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: br i1 [[TMP14]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP15]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]
+; CHECK-NEXT: [[TMP16:%.*]] = or i1 [[TMP14]], [[TMP15]]
+; CHECK-NEXT: br i1 [[TMP16]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP14]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -793,7 +806,7 @@ define i64 @same_exit_block_post_inc_use() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP10]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -833,7 +846,7 @@ define ptr @same_exit_block_post_inc_use1_ivptr() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[P1]], i64 [[INDEX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[NEXT_GEP]], align 1
; CHECK-NEXT: [[TMP15:%.*]] = icmp ne <4 x i8> [[WIDE_LOAD]], splat (i8 72)
@@ -841,9 +854,10 @@ define ptr @same_exit_block_post_inc_use1_ivptr() {
; CHECK-NEXT: [[TMP1:%.*]] = freeze <4 x i1> [[TMP15]]
; CHECK-NEXT: [[TMP16:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP1]])
; CHECK-NEXT: [[TMP17:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024
-; CHECK-NEXT: br i1 [[TMP16]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP17]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP15:![0-9]+]]
+; CHECK-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]]
+; CHECK-NEXT: br i1 [[TMP18]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP15:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP16]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -853,7 +867,7 @@ define ptr @same_exit_block_post_inc_use1_ivptr() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = getelementptr i8, ptr [[P1]], i64 [[TMP9]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi ptr [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ [[PTREND]], [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi ptr [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ [[PTREND]], [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret ptr [[RETVAL]]
;
entry:
@@ -890,7 +904,7 @@ define i64 @same_exit_block_post_inc_use2() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP4]], align 1
@@ -901,9 +915,10 @@ define i64 @same_exit_block_post_inc_use2() {
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP17]]
; CHECK-NEXT: [[TMP18:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP19:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: br i1 [[TMP18]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP19]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP16:![0-9]+]]
+; CHECK-NEXT: [[TMP20:%.*]] = or i1 [[TMP18]], [[TMP19]]
+; CHECK-NEXT: br i1 [[TMP20]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP16:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP18]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -913,7 +928,7 @@ define i64 @same_exit_block_post_inc_use2() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP11]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 66, [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 66, [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -954,7 +969,7 @@ define i64 @diff_exit_block_pre_inc_use1() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -965,9 +980,10 @@ define i64 @diff_exit_block_pre_inc_use1() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP17:![0-9]+]]
+; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
+; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP17:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -1022,7 +1038,7 @@ define i64 @diff_exit_block_pre_inc_use2() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -1033,9 +1049,10 @@ define i64 @diff_exit_block_pre_inc_use2() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP18:![0-9]+]]
+; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
+; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP18:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -1087,7 +1104,7 @@ define i64 @diff_exit_block_pre_inc_use3() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX2:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT4:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX2:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT4:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX2]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -1098,9 +1115,10 @@ define i64 @diff_exit_block_pre_inc_use3() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT4]], 64
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP19:![0-9]+]]
+; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
+; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP19:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -1153,7 +1171,7 @@ define i64 @diff_exit_block_post_inc_use1() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP4]], align 1
@@ -1164,9 +1182,10 @@ define i64 @diff_exit_block_post_inc_use1() {
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP13]]
; CHECK-NEXT: [[TMP14:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP15:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: br i1 [[TMP14]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP15]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP20:![0-9]+]]
+; CHECK-NEXT: [[TMP16:%.*]] = or i1 [[TMP14]], [[TMP15]]
+; CHECK-NEXT: br i1 [[TMP16]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP20:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP14]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -1221,7 +1240,7 @@ define i64 @diff_exit_block_post_inc_use2() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP12]], align 1
@@ -1232,9 +1251,10 @@ define i64 @diff_exit_block_post_inc_use2() {
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP17]]
; CHECK-NEXT: [[TMP18:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP19:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: br i1 [[TMP18]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP19]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP21:![0-9]+]]
+; CHECK-NEXT: [[TMP20:%.*]] = or i1 [[TMP18]], [[TMP19]]
+; CHECK-NEXT: br i1 [[TMP20]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP21:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP18]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -1291,7 +1311,7 @@ define i64 @diff_exit_block_post_inc_use3(i64 %start) {
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[START]], 64
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT4:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT4:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP14]], align 1
@@ -1302,9 +1322,10 @@ define i64 @diff_exit_block_post_inc_use3(i64 %start) {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP19]]
; CHECK-NEXT: [[TMP20:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP21:%.*]] = icmp eq i64 [[INDEX_NEXT4]], 64
-; CHECK-NEXT: br i1 [[TMP20]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP21]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP22:![0-9]+]]
+; CHECK-NEXT: [[TMP22:%.*]] = or i1 [[TMP20]], [[TMP21]]
+; CHECK-NEXT: br i1 [[TMP22]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP22:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP20]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: [[IND_ESCAPE:%.*]] = sub i64 [[TMP0]], 1
; CHECK-NEXT: br label [[LOOP_END:%.*]]
@@ -1363,7 +1384,7 @@ define i64 @loop_contains_safe_call() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds float, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP1]], align 1
@@ -1373,9 +1394,10 @@ define i64 @loop_contains_safe_call() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP5]]
; CHECK-NEXT: [[TMP6:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT2]], 64
-; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP23:![0-9]+]]
+; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP6]], [[TMP7]]
+; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP23:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -1384,7 +1406,7 @@ define i64 @loop_contains_safe_call() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP9]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -1424,7 +1446,7 @@ define i64 @loop_contains_safe_div() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT2:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP1]], align 1
@@ -1434,9 +1456,10 @@ define i64 @loop_contains_safe_div() {
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP5]]
; CHECK-NEXT: [[TMP6:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT2]], 64
-; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP7]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP24:![0-9]+]]
+; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP6]], [[TMP7]]
+; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP24:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -1445,7 +1468,7 @@ define i64 @loop_contains_safe_div() {
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP9]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -1484,7 +1507,7 @@ define i64 @loop_contains_load_after_early_exit(ptr dereferenceable(1024) align(
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP1]], align 1
@@ -1495,11 +1518,12 @@ define i64 @loop_contains_load_after_early_exit(ptr dereferenceable(1024) align(
; CHECK-NEXT: [[TMP3:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP3]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP25:![0-9]+]]
+; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
+; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP25:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
-; CHECK-NEXT: [[TMP9:%.*]] = extractelement <4 x i64> [[WIDE_LOAD2]], i32 3
+; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i64> [[WIDE_LOAD2]], i32 3
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
; CHECK-NEXT: [[FIRST_ACTIVE_LANE:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v4i1(<4 x i1> [[TMP6]], i1 false)
@@ -1507,7 +1531,7 @@ define i64 @loop_contains_load_after_early_exit(ptr dereferenceable(1024) align(
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP11]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ [[TMP9]], [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ [[TMP10]], [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
@@ -1546,7 +1570,7 @@ define i64 @same_exit_block_pre_inc_use1_reverse() {
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT4:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT4:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = sub i64 1023, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i8, ptr [[TMP1]], i64 0
@@ -1563,9 +1587,10 @@ define i64 @same_exit_block_pre_inc_use1_reverse() {
; CHECK-NEXT: [[TMP7:%.*]] = freeze <4 x i1> [[TMP8]]
; CHECK-NEXT: [[TMP9:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP7]])
; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT4]], 1020
-; CHECK-NEXT: br i1 [[TMP9]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP10]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP26:![0-9]+]]
+; CHECK-NEXT: [[TMP11:%.*]] = or i1 [[TMP9]], [[TMP10]]
+; CHECK-NEXT: br i1 [[TMP11]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP26:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP9]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[SCALAR_PH:%.*]]
; CHECK: vector.early.exit:
@@ -1676,7 +1701,7 @@ define i64 @same_exit_block_pre_inc_use1_deref_ptrs(ptr dereferenceable(1024) %p
; CHECK: vector.ph:
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
-; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[MIDDLE_BLOCK:%.*]] ]
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP1]], align 1
@@ -1687,9 +1712,10 @@ define i64 @same_exit_block_pre_inc_use1_deref_ptrs(ptr dereferenceable(1024) %p
; CHECK-NEXT: [[TMP4:%.*]] = freeze <4 x i1> [[TMP6]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
-; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK]]
-; CHECK: vector.body.cond.1:
-; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP28:![0-9]+]]
+; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
+; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP28:![0-9]+]]
+; CHECK: middle.split:
+; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
; CHECK: middle.block:
; CHECK-NEXT: br label [[LOOP_END:%.*]]
; CHECK: vector.early.exit:
@@ -1698,7 +1724,7 @@ define i64 @same_exit_block_pre_inc_use1_deref_ptrs(ptr dereferenceable(1024) %p
; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP10]]
; CHECK-NEXT: br label [[LOOP_END]]
; CHECK: loop.end:
-; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK1]] ]
+; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ], [ 67, [[MIDDLE_BLOCK]] ]
; CHECK-NEXT: ret i64 [[RETVAL]]
;
entry:
diff --git a/llvm/test/Transforms/LoopVectorize/single_early_exit_with_outer_loop.ll b/llvm/test/Transforms/LoopVectorize/single_early_exit_with_outer_loop.ll
index c833c80a10680..89eef094e0c8a 100644
--- a/llvm/test/Transforms/LoopVectorize/single_early_exit_with_outer_loop.ll
+++ b/llvm/test/Transforms/LoopVectorize/single_early_exit_with_outer_loop.ll
@@ -2,11 +2,11 @@
declare void @init_mem(ptr, i64);
-; Tests that the additional blocks created for handling loops with
-; uncountable early exits are correctly added to the outer loop at depth 1.
+; Tests that the additional middle.split created for handling loops with
+; uncountable early exits is correctly adding to the outer loop at depth 1.
define void @early_exit_in_outer_loop1() {
; CHECK-LABEL: Loop info for function 'early_exit_in_outer_loop1':
-; CHECK: Loop at depth 1 containing: %loop.outer<header>,%loop.inner.found,%loop.inner.end<latch>,%loop.inner.end.loopexit,%vector.ph,%vector.body,%vector.body.cond.1,%middle.block,%vector.early.exit
+; CHECK: Loop at depth 1 containing: %loop.outer<header>,%loop.inner.found,%loop.inner.end<latch>,%loop.inner.end.loopexit,%vector.ph,%vector.body,%middle.split,%middle.block,%vector.early.exit
entry:
%p1 = alloca [1024 x i8]
%p2 = alloca [1024 x i8]
@@ -40,13 +40,13 @@ loop.inner.end:
br label %loop.outer
}
-; Tests that the additional blocks created for handling loops with
-; uncountable early exits are correctly added to both the outer and middle
+; Tests that the additional middle.split created for handling loops with
+; uncountable early exits is correctly adding to both the outer and middle
; loops at depths 1 and 2, respectively.
define void @early_exit_in_outer_loop2() {
; CHECK-LABEL: Loop info for function 'early_exit_in_outer_loop2':
-; CHECK: Loop at depth 1 containing: %loop.outer<header>,%loop.middle,%loop.inner.found,%loop.inner.end,%loop.middle.end,%loop.outer.latch<latch>,%vector.ph,%vector.body,%vector.body.cond.1,%middle.block,%vector.early.exit
-; CHECK: Loop at depth 2 containing: %loop.middle<header>,%loop.inner.end<latch><exiting>,%vector.ph,%vector.body<exiting>,%vector.body.cond.1,%middle.block
+; CHECK: Loop at depth 1 containing: %loop.outer<header>,%loop.middle,%loop.inner.found,%loop.inner.end,%loop.middle.end,%loop.outer.latch<latch>,%vector.ph,%vector.body,%middle.split,%middle.block,%vector.early.exit
+; CHECK: Loop at depth 2 containing: %loop.middle<header>,%loop.inner.end<latch><exiting>,%vector.ph,%vector.body,%middle.split<exiting>,%middle.block
entry:
%p1 = alloca [1024 x i8]
%p2 = alloca [1024 x i8]
@@ -92,8 +92,8 @@ loop.outer.latch:
define i32 @early_exit_branch_to_outer_header() {
; CHECK-LABEL: Loop info for function 'early_exit_branch_to_outer_header':
-; CHECK-NEXT: Loop at depth 1 containing: %outer.header<header>,%outer.header.loopexit<latch>,%vector.ph,%vector.body,%vector.body.cond.1<exiting>,%vector.early.exit
-; CHECK-NEXT: Loop at depth 2 containing: %vector.body<header><exiting>,%vector.body.cond.1<latch><exiting>
+; CHECK-NEXT: Loop at depth 1 containing: %outer.header<header>,%outer.header.loopexit<latch>,%vector.ph,%vector.body,%middle.split<exiting>,%vector.early.exit
+; CHECK-NEXT: Loop at depth 2 containing: %vector.body<header><latch><exiting>
entry:
%src = alloca [1024 x i8]
call void @init_mem(ptr %src, i64 1024)
diff --git a/llvm/test/Transforms/LoopVectorize/uncountable-early-exit-vplan.ll b/llvm/test/Transforms/LoopVectorize/uncountable-early-exit-vplan.ll
index fc48f7a6a51ea..e2315c4fbab3b 100644
--- a/llvm/test/Transforms/LoopVectorize/uncountable-early-exit-vplan.ll
+++ b/llvm/test/Transforms/LoopVectorize/uncountable-early-exit-vplan.ll
@@ -1,3 +1,4 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -p loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -S -debug %s 2>&1 | FileCheck %s
; REQUIRES: asserts
@@ -202,7 +203,7 @@ define i64 @multi_exiting_to_same_exit_live_in_exit_values_2() {
; CHECK-NEXT: Successor(s): ir-bb<exit>
; CHECK-EMPTY:
; CHECK-NEXT: ir-bb<exit>:
-; CHECK-NEXT: IR %p = phi i64 [ 0, %loop.header ], [ 1, %loop.latch ] (extra operands: ir<0> from middle.block, ir<1> from vector.early.exit)
+; CHECK-NEXT: IR %p = phi i64 [ 0, %loop.header ], [ 1, %loop.latch ] (extra operands: ir<1> from middle.block, ir<0> from vector.early.exit)
; CHECK-NEXT: No successors
; CHECK-EMPTY:
; CHECK-NEXT: scalar.ph:
diff --git a/llvm/test/Transforms/LoopVectorize/vector-loop-backedge-elimination-early-exit.ll b/llvm/test/Transforms/LoopVectorize/vector-loop-backedge-elimination-early-exit.ll
index b6644ef2d6b8b..47df82e846d59 100644
--- a/llvm/test/Transforms/LoopVectorize/vector-loop-backedge-elimination-early-exit.ll
+++ b/llvm/test/Transforms/LoopVectorize/vector-loop-backedge-elimination-early-exit.ll
@@ -15,7 +15,7 @@ define i8 @test_early_exit_max_tc_less_than_16(ptr dereferenceable(16) %A) nosyn
; VF8UF1: [[VECTOR_PH]]:
; VF8UF1-NEXT: br label %[[VECTOR_BODY:.*]]
; VF8UF1: [[VECTOR_BODY]]:
-; VF8UF1-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; VF8UF1-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
; VF8UF1-NEXT: [[P_SRC:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]
; VF8UF1-NEXT: [[WIDE_LOAD:%.*]] = load <8 x i8>, ptr [[P_SRC]], align 1
; VF8UF1-NEXT: [[TMP3:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD]], zeroinitializer
@@ -23,9 +23,10 @@ define i8 @test_early_exit_max_tc_less_than_16(ptr dereferenceable(16) %A) nosyn
; VF8UF1-NEXT: [[TMP2:%.*]] = freeze <8 x i1> [[TMP3]]
; VF8UF1-NEXT: [[TMP4:%.*]] = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> [[TMP2]])
; VF8UF1-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16
-; VF8UF1-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; VF8UF1: [[VECTOR_BODY_MULTI_COND_1]]:
-; VF8UF1-NEXT: br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; VF8UF1-NEXT: [[TMP6:%.*]] = or i1 [[TMP4]], [[TMP5]]
+; VF8UF1-NEXT: br i1 [[TMP6]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; VF8UF1: [[MIDDLE_SPLIT]]:
+; VF8UF1-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; VF8UF1: [[MIDDLE_BLOCK]]:
; VF8UF1-NEXT: br label %[[EXIT:.*]]
; VF8UF1: [[VECTOR_EARLY_EXIT]]:
@@ -41,22 +42,16 @@ define i8 @test_early_exit_max_tc_less_than_16(ptr dereferenceable(16) %A) nosyn
; VF8UF2: [[VECTOR_PH]]:
; VF8UF2-NEXT: br label %[[VECTOR_BODY:.*]]
; VF8UF2: [[VECTOR_BODY]]:
-; VF8UF2-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
-; VF8UF2-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]
-; VF8UF2-NEXT: [[TMP7:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 8
+; VF8UF2-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 8
+; VF8UF2-NEXT: [[WIDE_LOAD:%.*]] = load <8 x i8>, ptr [[A]], align 1
; VF8UF2-NEXT: [[WIDE_LOAD1:%.*]] = load <8 x i8>, ptr [[TMP0]], align 1
-; VF8UF2-NEXT: [[WIDE_LOAD2:%.*]] = load <8 x i8>, ptr [[TMP7]], align 1
-; VF8UF2-NEXT: [[TMP1:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD1]], zeroinitializer
-; VF8UF2-NEXT: [[TMP2:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD2]], zeroinitializer
-; VF8UF2-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 16
+; VF8UF2-NEXT: [[TMP1:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD]], zeroinitializer
+; VF8UF2-NEXT: [[TMP2:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD1]], zeroinitializer
; VF8UF2-NEXT: [[TMP6:%.*]] = freeze <8 x i1> [[TMP1]]
; VF8UF2-NEXT: [[TMP5:%.*]] = freeze <8 x i1> [[TMP2]]
; VF8UF2-NEXT: [[TMP3:%.*]] = or <8 x i1> [[TMP6]], [[TMP5]]
; VF8UF2-NEXT: [[TMP4:%.*]] = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> [[TMP3]])
-; VF8UF2-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16
-; VF8UF2-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; VF8UF2: [[VECTOR_BODY_MULTI_COND_1]]:
-; VF8UF2-NEXT: br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; VF8UF2-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; VF8UF2: [[MIDDLE_BLOCK]]:
; VF8UF2-NEXT: br label %[[EXIT:.*]]
; VF8UF2: [[VECTOR_EARLY_EXIT]]:
@@ -72,17 +67,11 @@ define i8 @test_early_exit_max_tc_less_than_16(ptr dereferenceable(16) %A) nosyn
; VF16UF1: [[VECTOR_PH]]:
; VF16UF1-NEXT: br label %[[VECTOR_BODY:.*]]
; VF16UF1: [[VECTOR_BODY]]:
-; VF16UF1-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
-; VF16UF1-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]
-; VF16UF1-NEXT: [[WIDE_LOAD:%.*]] = load <16 x i8>, ptr [[TMP0]], align 1
+; VF16UF1-NEXT: [[WIDE_LOAD:%.*]] = load <16 x i8>, ptr [[A]], align 1
; VF16UF1-NEXT: [[TMP3:%.*]] = icmp eq <16 x i8> [[WIDE_LOAD]], zeroinitializer
-; VF16UF1-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 16
; VF16UF1-NEXT: [[TMP1:%.*]] = freeze <16 x i1> [[TMP3]]
; VF16UF1-NEXT: [[TMP2:%.*]] = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> [[TMP1]])
-; VF16UF1-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16
-; VF16UF1-NEXT: br i1 [[TMP2]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; VF16UF1: [[VECTOR_BODY_MULTI_COND_1]]:
-; VF16UF1-NEXT: br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; VF16UF1-NEXT: br i1 [[TMP2]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; VF16UF1: [[MIDDLE_BLOCK]]:
; VF16UF1-NEXT: br label %[[EXIT:.*]]
; VF16UF1: [[VECTOR_EARLY_EXIT]]:
@@ -119,7 +108,7 @@ define i64 @test_early_exit_max_tc_less_than_16_with_iv_used_outside(ptr derefer
; VF8UF1: [[VECTOR_PH]]:
; VF8UF1-NEXT: br label %[[VECTOR_BODY:.*]]
; VF8UF1: [[VECTOR_BODY]]:
-; VF8UF1-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; VF8UF1-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
; VF8UF1-NEXT: [[P_SRC:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]
; VF8UF1-NEXT: [[WIDE_LOAD:%.*]] = load <8 x i8>, ptr [[P_SRC]], align 1
; VF8UF1-NEXT: [[TMP3:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD]], zeroinitializer
@@ -127,9 +116,10 @@ define i64 @test_early_exit_max_tc_less_than_16_with_iv_used_outside(ptr derefer
; VF8UF1-NEXT: [[TMP2:%.*]] = freeze <8 x i1> [[TMP3]]
; VF8UF1-NEXT: [[TMP4:%.*]] = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> [[TMP2]])
; VF8UF1-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16
-; VF8UF1-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; VF8UF1: [[VECTOR_BODY_MULTI_COND_1]]:
-; VF8UF1-NEXT: br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
+; VF8UF1-NEXT: [[TMP6:%.*]] = or i1 [[TMP4]], [[TMP5]]
+; VF8UF1-NEXT: br i1 [[TMP6]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
+; VF8UF1: [[MIDDLE_SPLIT]]:
+; VF8UF1-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; VF8UF1: [[MIDDLE_BLOCK]]:
; VF8UF1-NEXT: br label %[[EXIT:.*]]
; VF8UF1: [[VECTOR_EARLY_EXIT]]:
@@ -147,22 +137,16 @@ define i64 @test_early_exit_max_tc_less_than_16_with_iv_used_outside(ptr derefer
; VF8UF2: [[VECTOR_PH]]:
; VF8UF2-NEXT: br label %[[VECTOR_BODY:.*]]
; VF8UF2: [[VECTOR_BODY]]:
-; VF8UF2-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
-; VF8UF2-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]
-; VF8UF2-NEXT: [[TMP12:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 8
+; VF8UF2-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 8
+; VF8UF2-NEXT: [[WIDE_LOAD:%.*]] = load <8 x i8>, ptr [[A]], align 1
; VF8UF2-NEXT: [[WIDE_LOAD1:%.*]] = load <8 x i8>, ptr [[TMP0]], align 1
-; VF8UF2-NEXT: [[WIDE_LOAD2:%.*]] = load <8 x i8>, ptr [[TMP12]], align 1
-; VF8UF2-NEXT: [[TMP1:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD1]], zeroinitializer
-; VF8UF2-NEXT: [[TMP2:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD2]], zeroinitializer
-; VF8UF2-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 16
+; VF8UF2-NEXT: [[TMP1:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD]], zeroinitializer
+; VF8UF2-NEXT: [[TMP2:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD1]], zeroinitializer
; VF8UF2-NEXT: [[TMP13:%.*]] = freeze <8 x i1> [[TMP1]]
; VF8UF2-NEXT: [[TMP6:%.*]] = freeze <8 x i1> [[TMP2]]
; VF8UF2-NEXT: [[TMP3:%.*]] = or <8 x i1> [[TMP13]], [[TMP6]]
; VF8UF2-NEXT: [[TMP4:%.*]] = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> [[TMP3]])
-; VF8UF2-NEXT: [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16
-; VF8UF2-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; VF8UF2: [[VECTOR_BODY_MULTI_COND_1]]:
-; VF8UF2-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
+; VF8UF2-NEXT: br i1 [[TMP4]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; VF8UF2: [[MIDDLE_BLOCK]]:
; VF8UF2-NEXT: br label %[[EXIT:.*]]
; VF8UF2: [[VECTOR_EARLY_EXIT]]:
@@ -172,10 +156,9 @@ define i64 @test_early_exit_max_tc_less_than_16_with_iv_used_outside(ptr derefer
; VF8UF2-NEXT: [[TMP9:%.*]] = add i64 0, [[TMP8]]
; VF8UF2-NEXT: [[TMP10:%.*]] = icmp ne i64 [[TMP8]], 8
; VF8UF2-NEXT: [[TMP11:%.*]] = select i1 [[TMP10]], i64 [[TMP9]], i64 [[TMP7]]
-; VF8UF2-NEXT: [[TMP15:%.*]] = add i64 [[INDEX]], [[TMP11]]
; VF8UF2-NEXT: br label %[[EXIT]]
; VF8UF2: [[EXIT]]:
-; VF8UF2-NEXT: [[RES:%.*]] = phi i64 [ [[TMP15]], %[[VECTOR_EARLY_EXIT]] ], [ 1, %[[MIDDLE_BLOCK]] ]
+; VF8UF2-NEXT: [[RES:%.*]] = phi i64 [ [[TMP11]], %[[VECTOR_EARLY_EXIT]] ], [ 1, %[[MIDDLE_BLOCK]] ]
; VF8UF2-NEXT: ret i64 [[RES]]
;
; VF16UF1-LABEL: define i64 @test_early_exit_max_tc_less_than_16_with_iv_used_outside(
@@ -185,25 +168,18 @@ define i64 @test_early_exit_max_tc_less_than_16_with_iv_used_outside(ptr derefer
; VF16UF1: [[VECTOR_PH]]:
; VF16UF1-NEXT: br label %[[VECTOR_BODY:.*]]
; VF16UF1: [[VECTOR_BODY]]:
-; VF16UF1-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
-; VF16UF1-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]
-; VF16UF1-NEXT: [[WIDE_LOAD:%.*]] = load <16 x i8>, ptr [[TMP0]], align 1
+; VF16UF1-NEXT: [[WIDE_LOAD:%.*]] = load <16 x i8>, ptr [[A]], align 1
; VF16UF1-NEXT: [[TMP3:%.*]] = icmp eq <16 x i8> [[WIDE_LOAD]], zeroinitializer
-; VF16UF1-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 16
; VF16UF1-NEXT: [[TMP1:%.*]] = freeze <16 x i1> [[TMP3]]
; VF16UF1-NEXT: [[TMP2:%.*]] = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> [[TMP1]])
-; VF16UF1-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16
-; VF16UF1-NEXT: br i1 [[TMP2]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; VF16UF1: [[VECTOR_BODY_MULTI_COND_1]]:
-; VF16UF1-NEXT: br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
+; VF16UF1-NEXT: br i1 [[TMP2]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; VF16UF1: [[MIDDLE_BLOCK]]:
; VF16UF1-NEXT: br label %[[EXIT:.*]]
; VF16UF1: [[VECTOR_EARLY_EXIT]]:
; VF16UF1-NEXT: [[FIRST_ACTIVE_LANE:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v16i1(<16 x i1> [[TMP3]], i1 false)
-; VF16UF1-NEXT: [[TMP6:%.*]] = add i64 [[INDEX]], [[FIRST_ACTIVE_LANE]]
; VF16UF1-NEXT: br label %[[EXIT]]
; VF16UF1: [[EXIT]]:
-; VF16UF1-NEXT: [[RES:%.*]] = phi i64 [ [[TMP6]], %[[VECTOR_EARLY_EXIT]] ], [ 1, %[[MIDDLE_BLOCK]] ]
+; VF16UF1-NEXT: [[RES:%.*]] = phi i64 [ [[FIRST_ACTIVE_LANE]], %[[VECTOR_EARLY_EXIT]] ], [ 1, %[[MIDDLE_BLOCK]] ]
; VF16UF1-NEXT: ret i64 [[RES]]
;
entry:
@@ -234,7 +210,7 @@ define i8 @test_early_exit_max_vector_tc_eq_16(ptr dereferenceable(17) %A) nosyn
; VF8UF1: [[VECTOR_PH]]:
; VF8UF1-NEXT: br label %[[VECTOR_BODY:.*]]
; VF8UF1: [[VECTOR_BODY]]:
-; VF8UF1-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; VF8UF1-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
; VF8UF1-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]
; VF8UF1-NEXT: [[WIDE_LOAD:%.*]] = load <8 x i8>, ptr [[TMP0]], align 1
; VF8UF1-NEXT: [[TMP1:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD]], zeroinitializer
@@ -242,9 +218,10 @@ define i8 @test_early_exit_max_vector_tc_eq_16(ptr dereferenceable(17) %A) nosyn
; VF8UF1-NEXT: [[TMP5:%.*]] = freeze <8 x i1> [[TMP1]]
; VF8UF1-NEXT: [[TMP2:%.*]] = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> [[TMP5]])
; VF8UF1-NEXT: [[TMP3:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16
-; VF8UF1-NEXT: br i1 [[TMP2]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; VF8UF1: [[VECTOR_BODY_MULTI_COND_1]]:
-; VF8UF1-NEXT: br i1 [[TMP3]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
+; VF8UF1-NEXT: [[TMP4:%.*]] = or i1 [[TMP2]], [[TMP3]]
+; VF8UF1-NEXT: br i1 [[TMP4]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
+; VF8UF1: [[MIDDLE_SPLIT]]:
+; VF8UF1-NEXT: br i1 [[TMP2]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; VF8UF1: [[MIDDLE_BLOCK]]:
; VF8UF1-NEXT: br label %[[SCALAR_PH:.*]]
; VF8UF1: [[VECTOR_EARLY_EXIT]]:
@@ -272,22 +249,16 @@ define i8 @test_early_exit_max_vector_tc_eq_16(ptr dereferenceable(17) %A) nosyn
; VF8UF2: [[VECTOR_PH]]:
; VF8UF2-NEXT: br label %[[VECTOR_BODY:.*]]
; VF8UF2: [[VECTOR_BODY]]:
-; VF8UF2-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
-; VF8UF2-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]
-; VF8UF2-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8, ptr [[TMP1]], i64 8
+; VF8UF2-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 8
+; VF8UF2-NEXT: [[WIDE_LOAD:%.*]] = load <8 x i8>, ptr [[A]], align 1
; VF8UF2-NEXT: [[WIDE_LOAD1:%.*]] = load <8 x i8>, ptr [[TMP1]], align 1
-; VF8UF2-NEXT: [[WIDE_LOAD2:%.*]] = load <8 x i8>, ptr [[TMP9]], align 1
-; VF8UF2-NEXT: [[TMP2:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD1]], zeroinitializer
-; VF8UF2-NEXT: [[TMP3:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD2]], zeroinitializer
-; VF8UF2-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 16
+; VF8UF2-NEXT: [[TMP2:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD]], zeroinitializer
+; VF8UF2-NEXT: [[TMP3:%.*]] = icmp eq <8 x i8> [[WIDE_LOAD1]], zeroinitializer
; VF8UF2-NEXT: [[TMP7:%.*]] = freeze <8 x i1> [[TMP2]]
; VF8UF2-NEXT: [[TMP6:%.*]] = freeze <8 x i1> [[TMP3]]
; VF8UF2-NEXT: [[TMP4:%.*]] = or <8 x i1> [[TMP7]], [[TMP6]]
; VF8UF2-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> [[TMP4]])
-; VF8UF2-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16
-; VF8UF2-NEXT: br i1 [[TMP5]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; VF8UF2: [[VECTOR_BODY_MULTI_COND_1]]:
-; VF8UF2-NEXT: br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
+; VF8UF2-NEXT: br i1 [[TMP5]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; VF8UF2: [[MIDDLE_BLOCK]]:
; VF8UF2-NEXT: br label %[[SCALAR_PH:.*]]
; VF8UF2: [[VECTOR_EARLY_EXIT]]:
@@ -303,7 +274,7 @@ define i8 @test_early_exit_max_vector_tc_eq_16(ptr dereferenceable(17) %A) nosyn
; VF8UF2: [[LOOP_LATCH]]:
; VF8UF2-NEXT: [[IV_NEXT]] = add nsw i64 [[IV]], 1
; VF8UF2-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], 17
-; VF8UF2-NEXT: br i1 [[CMP]], label %[[EXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP5:![0-9]+]]
+; VF8UF2-NEXT: br i1 [[CMP]], label %[[EXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP0:![0-9]+]]
; VF8UF2: [[EXIT]]:
; VF8UF2-NEXT: [[RES:%.*]] = phi i8 [ 0, %[[LOOP_HEADER]] ], [ 1, %[[LOOP_LATCH]] ], [ 0, %[[VECTOR_EARLY_EXIT]] ]
; VF8UF2-NEXT: ret i8 [[RES]]
@@ -315,17 +286,11 @@ define i8 @test_early_exit_max_vector_tc_eq_16(ptr dereferenceable(17) %A) nosyn
; VF16UF1: [[VECTOR_PH]]:
; VF16UF1-NEXT: br label %[[VECTOR_BODY:.*]]
; VF16UF1: [[VECTOR_BODY]]:
-; VF16UF1-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
-; VF16UF1-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]
-; VF16UF1-NEXT: [[WIDE_LOAD:%.*]] = load <16 x i8>, ptr [[TMP0]], align 1
+; VF16UF1-NEXT: [[WIDE_LOAD:%.*]] = load <16 x i8>, ptr [[A]], align 1
; VF16UF1-NEXT: [[TMP1:%.*]] = icmp eq <16 x i8> [[WIDE_LOAD]], zeroinitializer
-; VF16UF1-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 16
; VF16UF1-NEXT: [[TMP3:%.*]] = freeze <16 x i1> [[TMP1]]
; VF16UF1-NEXT: [[TMP2:%.*]] = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> [[TMP3]])
-; VF16UF1-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16
-; VF16UF1-NEXT: br i1 [[TMP2]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[VECTOR_BODY_MULTI_COND_1]]
-; VF16UF1: [[VECTOR_BODY_MULTI_COND_1]]:
-; VF16UF1-NEXT: br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
+; VF16UF1-NEXT: br i1 [[TMP2]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; VF16UF1: [[MIDDLE_BLOCK]]:
; VF16UF1-NEXT: br label %[[SCALAR_PH:.*]]
; VF16UF1: [[VECTOR_EARLY_EXIT]]:
@@ -341,7 +306,7 @@ define i8 @test_early_exit_max_vector_tc_eq_16(ptr dereferenceable(17) %A) nosyn
; VF16UF1: [[LOOP_LATCH]]:
; VF16UF1-NEXT: [[IV_NEXT]] = add nsw i64 [[IV]], 1
; VF16UF1-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], 17
-; VF16UF1-NEXT: br i1 [[CMP]], label %[[EXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP5:![0-9]+]]
+; VF16UF1-NEXT: br i1 [[CMP]], label %[[EXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP0:![0-9]+]]
; VF16UF1: [[EXIT]]:
; VF16UF1-NEXT: [[RES:%.*]] = phi i8 [ 0, %[[LOOP_HEADER]] ], [ 1, %[[LOOP_LATCH]] ], [ 0, %[[VECTOR_EARLY_EXIT]] ]
; VF16UF1-NEXT: ret i8 [[RES]]
>From 8a84f4cbdfc7b75aa43c8d60d443deae43486adf Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Thu, 25 Dec 2025 22:06:40 +0000
Subject: [PATCH 4/4] !fixup restore original phase-ordering test
---
.../PhaseOrdering/AArch64/std-find.ll | 180 ++++--------------
1 file changed, 35 insertions(+), 145 deletions(-)
diff --git a/llvm/test/Transforms/PhaseOrdering/AArch64/std-find.ll b/llvm/test/Transforms/PhaseOrdering/AArch64/std-find.ll
index f83964d157359..87ceecaf3ed42 100644
--- a/llvm/test/Transforms/PhaseOrdering/AArch64/std-find.ll
+++ b/llvm/test/Transforms/PhaseOrdering/AArch64/std-find.ll
@@ -11,142 +11,30 @@ define i64 @std_find_i16_constant_offset_with_assumptions(ptr %first.coerce, i16
; CHECK-NEXT: [[COERCE_VAL_IP:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 256
; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <8 x i16> poison, i16 [[S]], i64 0
; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <8 x i16> [[BROADCAST_SPLATINSERT]], <8 x i16> poison, <8 x i32> zeroinitializer
-; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <8 x i16>, ptr [[FIRST_COERCE]], align 2
-; CHECK-NEXT: [[WIDE_LOAD_FR1:%.*]] = freeze <8 x i16> [[WIDE_LOAD1]]
-; CHECK-NEXT: [[TMP2:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR1]], [[BROADCAST_SPLAT]]
-; CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i1> [[TMP2]] to i8
-; CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq i8 [[TMP3]], 0
-; CHECK-NEXT: br i1 [[DOTNOT]], label %[[VECTOR_BODY_MULTI_COND_1:.*]], label %[[VECTOR_EARLY_EXIT:.*]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
-; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 16
+; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
+; CHECK: [[VECTOR_BODY]]:
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
+; CHECK-NEXT: [[OFFSET_IDX:%.*]] = shl i64 [[INDEX]], 1
+; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <8 x i16>, ptr [[NEXT_GEP]], align 2
; CHECK-NEXT: [[WIDE_LOAD_FR:%.*]] = freeze <8 x i16> [[WIDE_LOAD]]
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR]], [[BROADCAST_SPLAT]]
+; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8
; CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i1> [[TMP0]] to i8
-; CHECK-NEXT: [[DOTNOT_1:%.*]] = icmp eq i8 [[TMP1]], 0
-; CHECK-NEXT: br i1 [[DOTNOT_1]], label %[[VECTOR_BODY_MULTI_COND_1_1:.*]], label %[[VECTOR_EARLY_EXIT]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1_1]]:
-; CHECK-NEXT: [[NEXT_GEP_2:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 32
-; CHECK-NEXT: [[WIDE_LOAD_2:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_2]], align 2
-; CHECK-NEXT: [[WIDE_LOAD_FR_2:%.*]] = freeze <8 x i16> [[WIDE_LOAD_2]]
-; CHECK-NEXT: [[TMP4:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_2]], [[BROADCAST_SPLAT]]
-; CHECK-NEXT: [[TMP5:%.*]] = bitcast <8 x i1> [[TMP4]] to i8
-; CHECK-NEXT: [[DOTNOT_2:%.*]] = icmp eq i8 [[TMP5]], 0
-; CHECK-NEXT: br i1 [[DOTNOT_2]], label %[[VECTOR_BODY_MULTI_COND_1_2:.*]], label %[[VECTOR_EARLY_EXIT]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1_2]]:
-; CHECK-NEXT: [[NEXT_GEP_3:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 48
-; CHECK-NEXT: [[WIDE_LOAD_3:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_3]], align 2
-; CHECK-NEXT: [[WIDE_LOAD_FR_3:%.*]] = freeze <8 x i16> [[WIDE_LOAD_3]]
-; CHECK-NEXT: [[TMP6:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_3]], [[BROADCAST_SPLAT]]
-; CHECK-NEXT: [[TMP7:%.*]] = bitcast <8 x i1> [[TMP6]] to i8
-; CHECK-NEXT: [[DOTNOT_3:%.*]] = icmp eq i8 [[TMP7]], 0
-; CHECK-NEXT: br i1 [[DOTNOT_3]], label %[[VECTOR_BODY_MULTI_COND_1_3:.*]], label %[[VECTOR_EARLY_EXIT]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1_3]]:
-; CHECK-NEXT: [[NEXT_GEP_4:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 64
-; CHECK-NEXT: [[WIDE_LOAD_4:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_4]], align 2
-; CHECK-NEXT: [[WIDE_LOAD_FR_4:%.*]] = freeze <8 x i16> [[WIDE_LOAD_4]]
-; CHECK-NEXT: [[TMP8:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_4]], [[BROADCAST_SPLAT]]
-; CHECK-NEXT: [[TMP9:%.*]] = bitcast <8 x i1> [[TMP8]] to i8
-; CHECK-NEXT: [[DOTNOT_4:%.*]] = icmp eq i8 [[TMP9]], 0
-; CHECK-NEXT: br i1 [[DOTNOT_4]], label %[[VECTOR_BODY_MULTI_COND_1_4:.*]], label %[[VECTOR_EARLY_EXIT]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1_4]]:
-; CHECK-NEXT: [[NEXT_GEP_5:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 80
-; CHECK-NEXT: [[WIDE_LOAD_5:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_5]], align 2
-; CHECK-NEXT: [[WIDE_LOAD_FR_5:%.*]] = freeze <8 x i16> [[WIDE_LOAD_5]]
-; CHECK-NEXT: [[TMP10:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_5]], [[BROADCAST_SPLAT]]
-; CHECK-NEXT: [[TMP11:%.*]] = bitcast <8 x i1> [[TMP10]] to i8
-; CHECK-NEXT: [[DOTNOT_5:%.*]] = icmp eq i8 [[TMP11]], 0
-; CHECK-NEXT: br i1 [[DOTNOT_5]], label %[[VECTOR_BODY_MULTI_COND_1_5:.*]], label %[[VECTOR_EARLY_EXIT]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1_5]]:
-; CHECK-NEXT: [[NEXT_GEP_6:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 96
-; CHECK-NEXT: [[WIDE_LOAD_6:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_6]], align 2
-; CHECK-NEXT: [[WIDE_LOAD_FR_6:%.*]] = freeze <8 x i16> [[WIDE_LOAD_6]]
-; CHECK-NEXT: [[TMP12:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_6]], [[BROADCAST_SPLAT]]
-; CHECK-NEXT: [[TMP13:%.*]] = bitcast <8 x i1> [[TMP12]] to i8
-; CHECK-NEXT: [[DOTNOT_6:%.*]] = icmp eq i8 [[TMP13]], 0
-; CHECK-NEXT: br i1 [[DOTNOT_6]], label %[[VECTOR_BODY_MULTI_COND_1_6:.*]], label %[[VECTOR_EARLY_EXIT]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1_6]]:
-; CHECK-NEXT: [[NEXT_GEP_7:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 112
-; CHECK-NEXT: [[WIDE_LOAD_7:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_7]], align 2
-; CHECK-NEXT: [[WIDE_LOAD_FR_7:%.*]] = freeze <8 x i16> [[WIDE_LOAD_7]]
-; CHECK-NEXT: [[TMP14:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_7]], [[BROADCAST_SPLAT]]
-; CHECK-NEXT: [[TMP15:%.*]] = bitcast <8 x i1> [[TMP14]] to i8
-; CHECK-NEXT: [[DOTNOT_7:%.*]] = icmp eq i8 [[TMP15]], 0
-; CHECK-NEXT: br i1 [[DOTNOT_7]], label %[[VECTOR_BODY_MULTI_COND_1_7:.*]], label %[[VECTOR_EARLY_EXIT]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1_7]]:
-; CHECK-NEXT: [[NEXT_GEP_8:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 128
-; CHECK-NEXT: [[WIDE_LOAD_8:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_8]], align 2
-; CHECK-NEXT: [[WIDE_LOAD_FR_8:%.*]] = freeze <8 x i16> [[WIDE_LOAD_8]]
-; CHECK-NEXT: [[TMP16:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_8]], [[BROADCAST_SPLAT]]
-; CHECK-NEXT: [[TMP17:%.*]] = bitcast <8 x i1> [[TMP16]] to i8
-; CHECK-NEXT: [[DOTNOT_8:%.*]] = icmp eq i8 [[TMP17]], 0
-; CHECK-NEXT: br i1 [[DOTNOT_8]], label %[[VECTOR_BODY_MULTI_COND_1_8:.*]], label %[[VECTOR_EARLY_EXIT]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1_8]]:
-; CHECK-NEXT: [[NEXT_GEP_9:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 144
-; CHECK-NEXT: [[WIDE_LOAD_9:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_9]], align 2
-; CHECK-NEXT: [[WIDE_LOAD_FR_9:%.*]] = freeze <8 x i16> [[WIDE_LOAD_9]]
-; CHECK-NEXT: [[TMP18:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_9]], [[BROADCAST_SPLAT]]
-; CHECK-NEXT: [[TMP19:%.*]] = bitcast <8 x i1> [[TMP18]] to i8
-; CHECK-NEXT: [[DOTNOT_9:%.*]] = icmp eq i8 [[TMP19]], 0
-; CHECK-NEXT: br i1 [[DOTNOT_9]], label %[[VECTOR_BODY_MULTI_COND_1_9:.*]], label %[[VECTOR_EARLY_EXIT]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1_9]]:
-; CHECK-NEXT: [[NEXT_GEP_10:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 160
-; CHECK-NEXT: [[WIDE_LOAD_10:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_10]], align 2
-; CHECK-NEXT: [[WIDE_LOAD_FR_10:%.*]] = freeze <8 x i16> [[WIDE_LOAD_10]]
-; CHECK-NEXT: [[TMP20:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_10]], [[BROADCAST_SPLAT]]
-; CHECK-NEXT: [[TMP21:%.*]] = bitcast <8 x i1> [[TMP20]] to i8
-; CHECK-NEXT: [[DOTNOT_10:%.*]] = icmp eq i8 [[TMP21]], 0
-; CHECK-NEXT: br i1 [[DOTNOT_10]], label %[[VECTOR_BODY_MULTI_COND_1_10:.*]], label %[[VECTOR_EARLY_EXIT]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1_10]]:
-; CHECK-NEXT: [[NEXT_GEP_11:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 176
-; CHECK-NEXT: [[WIDE_LOAD_11:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_11]], align 2
-; CHECK-NEXT: [[WIDE_LOAD_FR_11:%.*]] = freeze <8 x i16> [[WIDE_LOAD_11]]
-; CHECK-NEXT: [[TMP22:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_11]], [[BROADCAST_SPLAT]]
-; CHECK-NEXT: [[TMP23:%.*]] = bitcast <8 x i1> [[TMP22]] to i8
-; CHECK-NEXT: [[DOTNOT_11:%.*]] = icmp eq i8 [[TMP23]], 0
-; CHECK-NEXT: br i1 [[DOTNOT_11]], label %[[VECTOR_BODY_MULTI_COND_1_11:.*]], label %[[VECTOR_EARLY_EXIT]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1_11]]:
-; CHECK-NEXT: [[NEXT_GEP_12:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 192
-; CHECK-NEXT: [[WIDE_LOAD_12:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_12]], align 2
-; CHECK-NEXT: [[WIDE_LOAD_FR_12:%.*]] = freeze <8 x i16> [[WIDE_LOAD_12]]
-; CHECK-NEXT: [[TMP24:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_12]], [[BROADCAST_SPLAT]]
-; CHECK-NEXT: [[TMP25:%.*]] = bitcast <8 x i1> [[TMP24]] to i8
-; CHECK-NEXT: [[DOTNOT_12:%.*]] = icmp eq i8 [[TMP25]], 0
-; CHECK-NEXT: br i1 [[DOTNOT_12]], label %[[VECTOR_BODY_MULTI_COND_1_12:.*]], label %[[VECTOR_EARLY_EXIT]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1_12]]:
-; CHECK-NEXT: [[NEXT_GEP_13:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 208
-; CHECK-NEXT: [[WIDE_LOAD_13:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_13]], align 2
-; CHECK-NEXT: [[WIDE_LOAD_FR_13:%.*]] = freeze <8 x i16> [[WIDE_LOAD_13]]
-; CHECK-NEXT: [[TMP26:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_13]], [[BROADCAST_SPLAT]]
-; CHECK-NEXT: [[TMP27:%.*]] = bitcast <8 x i1> [[TMP26]] to i8
-; CHECK-NEXT: [[DOTNOT_13:%.*]] = icmp eq i8 [[TMP27]], 0
-; CHECK-NEXT: br i1 [[DOTNOT_13]], label %[[VECTOR_BODY_MULTI_COND_1_13:.*]], label %[[VECTOR_EARLY_EXIT]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1_13]]:
-; CHECK-NEXT: [[NEXT_GEP_14:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 224
-; CHECK-NEXT: [[WIDE_LOAD_14:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_14]], align 2
-; CHECK-NEXT: [[WIDE_LOAD_FR_14:%.*]] = freeze <8 x i16> [[WIDE_LOAD_14]]
-; CHECK-NEXT: [[TMP28:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_14]], [[BROADCAST_SPLAT]]
-; CHECK-NEXT: [[TMP29:%.*]] = bitcast <8 x i1> [[TMP28]] to i8
-; CHECK-NEXT: [[DOTNOT_14:%.*]] = icmp eq i8 [[TMP29]], 0
-; CHECK-NEXT: br i1 [[DOTNOT_14]], label %[[VECTOR_BODY_MULTI_COND_1_14:.*]], label %[[VECTOR_EARLY_EXIT]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1_14]]:
-; CHECK-NEXT: [[NEXT_GEP_15:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 240
-; CHECK-NEXT: [[WIDE_LOAD_15:%.*]] = load <8 x i16>, ptr [[NEXT_GEP_15]], align 2
-; CHECK-NEXT: [[WIDE_LOAD_FR_15:%.*]] = freeze <8 x i16> [[WIDE_LOAD_15]]
-; CHECK-NEXT: [[TMP30:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR_15]], [[BROADCAST_SPLAT]]
-; CHECK-NEXT: [[TMP31:%.*]] = bitcast <8 x i1> [[TMP30]] to i8
-; CHECK-NEXT: [[DOTNOT_15:%.*]] = icmp eq i8 [[TMP31]], 0
-; CHECK-NEXT: br i1 [[DOTNOT_15]], label %[[RETURN:.*]], label %[[VECTOR_EARLY_EXIT]]
+; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i8 [[TMP1]], 0
+; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i64 [[INDEX_NEXT]], 128
+; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[TMP2]], [[TMP3]]
+; CHECK-NEXT: br i1 [[TMP4]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; CHECK: [[MIDDLE_SPLIT]]:
+; CHECK-NEXT: br i1 [[TMP2]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[RETURN:.*]]
; CHECK: [[VECTOR_EARLY_EXIT]]:
-; CHECK-NEXT: [[INDEX_LCSSA:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ 8, %[[VECTOR_BODY_MULTI_COND_1]] ], [ 16, %[[VECTOR_BODY_MULTI_COND_1_1]] ], [ 24, %[[VECTOR_BODY_MULTI_COND_1_2]] ], [ 32, %[[VECTOR_BODY_MULTI_COND_1_3]] ], [ 40, %[[VECTOR_BODY_MULTI_COND_1_4]] ], [ 48, %[[VECTOR_BODY_MULTI_COND_1_5]] ], [ 56, %[[VECTOR_BODY_MULTI_COND_1_6]] ], [ 64, %[[VECTOR_BODY_MULTI_COND_1_7]] ], [ 72, %[[VECTOR_BODY_MULTI_COND_1_8]] ], [ 80, %[[VECTOR_BODY_MULTI_COND_1_9]] ], [ 88, %[[VECTOR_BODY_MULTI_COND_1_10]] ], [ 96, %[[VECTOR_BODY_MULTI_COND_1_11]] ], [ 104, %[[VECTOR_BODY_MULTI_COND_1_12]] ], [ 112, %[[VECTOR_BODY_MULTI_COND_1_13]] ], [ 120, %[[VECTOR_BODY_MULTI_COND_1_14]] ]
-; CHECK-NEXT: [[DOTLCSSA:%.*]] = phi <8 x i1> [ [[TMP2]], %[[ENTRY]] ], [ [[TMP0]], %[[VECTOR_BODY_MULTI_COND_1]] ], [ [[TMP4]], %[[VECTOR_BODY_MULTI_COND_1_1]] ], [ [[TMP6]], %[[VECTOR_BODY_MULTI_COND_1_2]] ], [ [[TMP8]], %[[VECTOR_BODY_MULTI_COND_1_3]] ], [ [[TMP10]], %[[VECTOR_BODY_MULTI_COND_1_4]] ], [ [[TMP12]], %[[VECTOR_BODY_MULTI_COND_1_5]] ], [ [[TMP14]], %[[VECTOR_BODY_MULTI_COND_1_6]] ], [ [[TMP16]], %[[VECTOR_BODY_MULTI_COND_1_7]] ], [ [[TMP18]], %[[VECTOR_BODY_MULTI_COND_1_8]] ], [ [[TMP20]], %[[VECTOR_BODY_MULTI_COND_1_9]] ], [ [[TMP22]], %[[VECTOR_BODY_MULTI_COND_1_10]] ], [ [[TMP24]], %[[VECTOR_BODY_MULTI_COND_1_11]] ], [ [[TMP26]], %[[VECTOR_BODY_MULTI_COND_1_12]] ], [ [[TMP28]], %[[VECTOR_BODY_MULTI_COND_1_13]] ], [ [[TMP30]], %[[VECTOR_BODY_MULTI_COND_1_14]] ]
-; CHECK-NEXT: [[TMP32:%.*]] = tail call i64 @llvm.experimental.cttz.elts.i64.v8i1(<8 x i1> [[DOTLCSSA]], i1 false)
-; CHECK-NEXT: [[TMP33:%.*]] = add i64 [[INDEX_LCSSA]], [[TMP32]]
-; CHECK-NEXT: [[TMP34:%.*]] = shl i64 [[TMP33]], 1
-; CHECK-NEXT: [[TMP35:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 [[TMP34]]
+; CHECK-NEXT: [[TMP5:%.*]] = tail call i64 @llvm.experimental.cttz.elts.i64.v8i1(<8 x i1> [[TMP0]], i1 false)
+; CHECK-NEXT: [[TMP6:%.*]] = add i64 [[INDEX]], [[TMP5]]
+; CHECK-NEXT: [[TMP7:%.*]] = shl i64 [[TMP6]], 1
+; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[FIRST_COERCE]], i64 [[TMP7]]
; CHECK-NEXT: br label %[[RETURN]]
; CHECK: [[RETURN]]:
-; CHECK-NEXT: [[__FIRST_ADDR_0_LCSSA_I_I_PH:%.*]] = phi ptr [ [[TMP35]], %[[VECTOR_EARLY_EXIT]] ], [ [[COERCE_VAL_IP]], %[[VECTOR_BODY_MULTI_COND_1_14]] ]
+; CHECK-NEXT: [[__FIRST_ADDR_0_LCSSA_I_I_PH:%.*]] = phi ptr [ [[TMP8]], %[[VECTOR_EARLY_EXIT]] ], [ [[COERCE_VAL_IP]], %[[MIDDLE_SPLIT]] ]
; CHECK-NEXT: [[DOTPRE:%.*]] = ptrtoint ptr [[__FIRST_ADDR_0_LCSSA_I_I_PH]] to i64
; CHECK-NEXT: ret i64 [[DOTPRE]]
;
@@ -265,19 +153,20 @@ define ptr @std_find_caller(ptr noundef %first, ptr noundef %last) {
; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[FIRST]], i64 [[OFFSET_IDX]]
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
-; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY_MULTI_COND_1:.*]] ]
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[PROL_ITER_NEXT:%.*]], %[[VECTOR_BODY]] ]
; CHECK-NEXT: [[OFFSET_IDX1:%.*]] = shl i64 [[INDEX]], 1
; CHECK-NEXT: [[NEXT_GEP1:%.*]] = getelementptr i8, ptr [[FIRST]], i64 [[OFFSET_IDX1]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <8 x i16>, ptr [[NEXT_GEP1]], align 2
; CHECK-NEXT: [[WIDE_LOAD_FR:%.*]] = freeze <8 x i16> [[WIDE_LOAD]]
-; CHECK-NEXT: [[TMP6:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR]], splat (i16 1)
-; CHECK-NEXT: [[TMP7:%.*]] = bitcast <8 x i1> [[TMP6]] to i8
-; CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq i8 [[TMP7]], 0
-; CHECK-NEXT: br i1 [[DOTNOT]], label %[[VECTOR_BODY_MULTI_COND_1]], label %[[VECTOR_EARLY_EXIT:.*]]
-; CHECK: [[VECTOR_BODY_MULTI_COND_1]]:
-; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8
-; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[XTRAITER]]
-; CHECK-NEXT: br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; CHECK-NEXT: [[TMP4:%.*]] = icmp eq <8 x i16> [[WIDE_LOAD_FR]], splat (i16 1)
+; CHECK-NEXT: [[PROL_ITER_NEXT]] = add nuw i64 [[INDEX]], 8
+; CHECK-NEXT: [[TMP5:%.*]] = bitcast <8 x i1> [[TMP4]] to i8
+; CHECK-NEXT: [[TMP6:%.*]] = icmp ne i8 [[TMP5]], 0
+; CHECK-NEXT: [[PROL_ITER_CMP_NOT:%.*]] = icmp eq i64 [[PROL_ITER_NEXT]], [[XTRAITER]]
+; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP6]], [[PROL_ITER_CMP_NOT]]
+; CHECK-NEXT: br i1 [[TMP8]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
+; CHECK: [[MIDDLE_SPLIT]]:
+; CHECK-NEXT: br i1 [[TMP6]], label %[[VECTOR_EARLY_EXIT:.*]], label %[[MIDDLE_BLOCK:.*]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP3]], [[XTRAITER]]
; CHECK-NEXT: br i1 [[CMP_N]], label %[[STD_FIND_GENERIC_IMPL_EXIT]], label %[[LOOP_HEADER_I_PREHEADER2]]
@@ -285,10 +174,10 @@ define ptr @std_find_caller(ptr noundef %first, ptr noundef %last) {
; CHECK-NEXT: [[PTR_IV_I_PH:%.*]] = phi ptr [ [[FIRST]], %[[LOOP_HEADER_I_PREHEADER]] ], [ [[NEXT_GEP]], %[[MIDDLE_BLOCK]] ]
; CHECK-NEXT: br label %[[LOOP_HEADER_I:.*]]
; CHECK: [[VECTOR_EARLY_EXIT]]:
-; CHECK-NEXT: [[TMP9:%.*]] = tail call i64 @llvm.experimental.cttz.elts.i64.v8i1(<8 x i1> [[TMP6]], i1 false)
-; CHECK-NEXT: [[TMP10:%.*]] = add i64 [[INDEX]], [[TMP9]]
-; CHECK-NEXT: [[TMP11:%.*]] = shl i64 [[TMP10]], 1
-; CHECK-NEXT: [[TMP12:%.*]] = getelementptr i8, ptr [[FIRST]], i64 [[TMP11]]
+; CHECK-NEXT: [[TMP11:%.*]] = tail call i64 @llvm.experimental.cttz.elts.i64.v8i1(<8 x i1> [[TMP4]], i1 false)
+; CHECK-NEXT: [[TMP12:%.*]] = add i64 [[INDEX]], [[TMP11]]
+; CHECK-NEXT: [[TMP13:%.*]] = shl i64 [[TMP12]], 1
+; CHECK-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[FIRST]], i64 [[TMP13]]
; CHECK-NEXT: br label %[[STD_FIND_GENERIC_IMPL_EXIT]]
; CHECK: [[LOOP_HEADER_I]]:
; CHECK-NEXT: [[PTR_IV_I:%.*]] = phi ptr [ [[PTR_IV_NEXT_I:%.*]], %[[LOOP_LATCH_I:.*]] ], [ [[PTR_IV_I_PH]], %[[LOOP_HEADER_I_PREHEADER2]] ]
@@ -298,9 +187,9 @@ define ptr @std_find_caller(ptr noundef %first, ptr noundef %last) {
; CHECK: [[LOOP_LATCH_I]]:
; CHECK-NEXT: [[PTR_IV_NEXT_I]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_I]], i64 2
; CHECK-NEXT: [[EC_I:%.*]] = icmp eq ptr [[PTR_IV_NEXT_I]], [[LAST]]
-; CHECK-NEXT: br i1 [[EC_I]], label %[[STD_FIND_GENERIC_IMPL_EXIT]], label %[[LOOP_HEADER_I]], !llvm.loop [[LOOP3:![0-9]+]]
+; CHECK-NEXT: br i1 [[EC_I]], label %[[STD_FIND_GENERIC_IMPL_EXIT]], label %[[LOOP_HEADER_I]], !llvm.loop [[LOOP4:![0-9]+]]
; CHECK: [[STD_FIND_GENERIC_IMPL_EXIT]]:
-; CHECK-NEXT: [[RES_I:%.*]] = phi ptr [ [[FIRST]], %[[ENTRY]] ], [ [[SCEVGEP]], %[[MIDDLE_BLOCK]] ], [ [[TMP12]], %[[VECTOR_EARLY_EXIT]] ], [ [[SCEVGEP]], %[[LOOP_LATCH_I]] ], [ [[PTR_IV_I]], %[[LOOP_HEADER_I]] ]
+; CHECK-NEXT: [[RES_I:%.*]] = phi ptr [ [[FIRST]], %[[ENTRY]] ], [ [[SCEVGEP]], %[[MIDDLE_BLOCK]] ], [ [[TMP14]], %[[VECTOR_EARLY_EXIT]] ], [ [[SCEVGEP]], %[[LOOP_LATCH_I]] ], [ [[PTR_IV_I]], %[[LOOP_HEADER_I]] ]
; CHECK-NEXT: ret ptr [[RES_I]]
;
entry:
@@ -340,5 +229,6 @@ declare void @llvm.assume(i1 noundef)
; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
; CHECK: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
; CHECK: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"}
-; CHECK: [[LOOP3]] = distinct !{[[LOOP3]], [[META2]], [[META1]]}
+; CHECK: [[LOOP3]] = distinct !{[[LOOP3]], [[META1]], [[META2]]}
+; CHECK: [[LOOP4]] = distinct !{[[LOOP4]], [[META2]], [[META1]]}
;.
More information about the llvm-commits
mailing list