From 1023b839aeda4f4688103995051b727d7ca4fdce Mon Sep 17 00:00:00 2001 From: Andrzej Bialecki Date: Tue, 26 Jun 2018 20:35:34 +0200 Subject: [PATCH] SOLR-11665: Improve error handling of shard splitting. Fix splitting of mixed replica types. --- solr/CHANGES.txt | 2 + .../solr/cloud/api/collections/Assign.java | 2 +- .../cloud/api/collections/SplitShardCmd.java | 188 ++++++++++++++++-- .../org/apache/solr/util/TestInjection.java | 22 +- .../cloud/api/collections/ShardSplitTest.java | 97 ++++++++- .../sim/SimClusterStateProvider.java | 2 +- .../src/images/diagrams/splitshard-seq.png | Bin 0 -> 98871 bytes .../src/images/diagrams/splitshard-seq.puml | 115 +++++++++++ 8 files changed, 394 insertions(+), 34 deletions(-) create mode 100644 solr/solr-ref-guide/src/images/diagrams/splitshard-seq.png create mode 100644 solr/solr-ref-guide/src/images/diagrams/splitshard-seq.puml diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index b1adaa51a9c..2d0f4666d84 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -119,6 +119,8 @@ Bug Fixes * SOLR-12513: Reproducing TestCodecSupport.testMixedCompressionMode failure (Erick Erickson) +* SOLR-11665: Improve error handling of shard splitting. Fix splitting of mixed replica types. (ab) + Optimizations ---------------------- diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/Assign.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/Assign.java index 1d0fa6901fd..b580bd31bd8 100644 --- a/solr/core/src/java/org/apache/solr/cloud/api/collections/Assign.java +++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/Assign.java @@ -172,7 +172,7 @@ public class Assign { return returnShardId; } - private static String buildSolrCoreName(String collectionName, String shard, Replica.Type type, int replicaNum) { + public static String buildSolrCoreName(String collectionName, String shard, Replica.Type type, int replicaNum) { // TODO: Adding the suffix is great for debugging, but may be an issue if at some point we want to support a way to change replica type return String.format(Locale.ROOT, "%s_%s_replica_%s%s", collectionName, shard, type.name().substring(0,1).toLowerCase(Locale.ROOT), replicaNum); } diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/SplitShardCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/SplitShardCmd.java index 327f3651359..ccb111a848e 100644 --- a/solr/core/src/java/org/apache/solr/cloud/api/collections/SplitShardCmd.java +++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/SplitShardCmd.java @@ -26,11 +26,15 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import org.apache.solr.client.solrj.cloud.DistributedQueue; +import org.apache.solr.client.solrj.cloud.NodeStateProvider; import org.apache.solr.client.solrj.cloud.autoscaling.PolicyHelper; import org.apache.solr.client.solrj.cloud.SolrCloudManager; +import org.apache.solr.client.solrj.cloud.autoscaling.ReplicaInfo; +import org.apache.solr.client.solrj.cloud.autoscaling.Suggestion; import org.apache.solr.client.solrj.request.CoreAdminRequest; import org.apache.solr.cloud.Overseer; import org.apache.solr.cloud.overseer.OverseerAction; @@ -45,6 +49,7 @@ import org.apache.solr.common.cloud.ReplicaPosition; import org.apache.solr.common.cloud.Slice; import org.apache.solr.common.cloud.ZkNodeProps; import org.apache.solr.common.cloud.ZkStateReader; +import org.apache.solr.common.cloud.rule.ImplicitSnitch; import org.apache.solr.common.params.CommonAdminParams; import org.apache.solr.common.params.CoreAdminParams; import org.apache.solr.common.params.ModifiableSolrParams; @@ -52,11 +57,13 @@ import org.apache.solr.common.util.NamedList; import org.apache.solr.common.util.Utils; import org.apache.solr.handler.component.ShardHandler; import org.apache.solr.util.TestInjection; +import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.data.Stat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static org.apache.solr.common.cloud.ZkStateReader.COLLECTION_PROP; +import static org.apache.solr.common.cloud.ZkStateReader.REPLICA_TYPE; import static org.apache.solr.common.cloud.ZkStateReader.SHARD_ID_PROP; import static org.apache.solr.common.params.CollectionParams.CollectionAction.ADDREPLICA; import static org.apache.solr.common.params.CollectionParams.CollectionAction.CREATESHARD; @@ -101,8 +108,11 @@ public class SplitShardCmd implements OverseerCollectionMessageHandler.Cmd { parentShardLeader = zkStateReader.getLeaderRetry(collectionName, slice.get(), 10000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); + throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Interrupted."); } + checkDiskSpace(collectionName, slice.get(), parentShardLeader); + // let's record the ephemeralOwner of the parent leader node Stat leaderZnodeStat = zkStateReader.getZkClient().exists(ZkStateReader.LIVE_NODES_ZKNODE + "/" + parentShardLeader.getNodeName(), null, true); if (leaderZnodeStat == null) { @@ -114,7 +124,36 @@ public class SplitShardCmd implements OverseerCollectionMessageHandler.Cmd { List subSlices = new ArrayList<>(); List subShardNames = new ArrayList<>(); - String rangesStr = fillRanges(ocmh.cloudManager, message, collection, parentSlice, subRanges, subSlices, subShardNames); + // reproduce the currently existing number of replicas per type + AtomicInteger numNrt = new AtomicInteger(); + AtomicInteger numTlog = new AtomicInteger(); + AtomicInteger numPull = new AtomicInteger(); + parentSlice.getReplicas().forEach(r -> { + switch (r.getType()) { + case NRT: + numNrt.incrementAndGet(); + break; + case TLOG: + numTlog.incrementAndGet(); + break; + case PULL: + numPull.incrementAndGet(); + } + }); + int repFactor = numNrt.get() + numTlog.get() + numPull.get(); + + // type of the first subreplica will be the same as leader + boolean firstNrtReplica = parentShardLeader.getType() == Replica.Type.NRT; + // verify that we indeed have the right number of correct replica types + if ((firstNrtReplica && numNrt.get() < 1) || (!firstNrtReplica && numTlog.get() < 1)) { + throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "aborting split - inconsistent replica types in collection " + collectionName + + ": nrt=" + numNrt.get() + ", tlog=" + numTlog.get() + ", pull=" + numPull.get() + ", shard leader type is " + + parentShardLeader.getType()); + } + + List> replicas = new ArrayList<>((repFactor - 1) * 2); + + String rangesStr = fillRanges(ocmh.cloudManager, message, collection, parentSlice, subRanges, subSlices, subShardNames, firstNrtReplica); try { @@ -126,7 +165,7 @@ public class SplitShardCmd implements OverseerCollectionMessageHandler.Cmd { if (state == Slice.State.ACTIVE) { throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Sub-shard: " + subSlice + " exists in active state. Aborting split shard."); - } else if (state == Slice.State.CONSTRUCTION || state == Slice.State.RECOVERY) { + } else { // delete the shards log.info("Sub-shard: {} already exists therefore requesting its deletion", subSlice); Map propMap = new HashMap<>(); @@ -188,6 +227,7 @@ public class SplitShardCmd implements OverseerCollectionMessageHandler.Cmd { propMap.put(Overseer.QUEUE_OPERATION, ADDREPLICA.toLower()); propMap.put(COLLECTION_PROP, collectionName); propMap.put(SHARD_ID_PROP, subSlice); + propMap.put(REPLICA_TYPE, firstNrtReplica ? Replica.Type.NRT.toString() : Replica.Type.TLOG.toString()); propMap.put("node", nodeName); propMap.put(CoreAdminParams.NAME, subShardName); propMap.put(CommonAdminParams.WAIT_FOR_FINAL_STATE, Boolean.toString(waitForFinalState)); @@ -268,21 +308,8 @@ public class SplitShardCmd implements OverseerCollectionMessageHandler.Cmd { log.info("Successfully applied buffered updates on : " + subShardNames); // Replica creation for the new Slices + // replica placement is controlled by the autoscaling policy framework - // look at the replication factor and see if it matches reality - // if it does not, find best nodes to create more cores - - // TODO: Have replication factor decided in some other way instead of numShards for the parent - - int repFactor = parentSlice.getReplicas().size(); - - // we need to look at every node and see how many cores it serves - // add our new cores to existing nodes serving the least number of cores - // but (for now) require that each core goes on a distinct node. - - // TODO: add smarter options that look at the current number of cores per - // node? - // for now we just go random Set nodes = clusterState.getLiveNodes(); List nodeList = new ArrayList<>(nodes.size()); nodeList.addAll(nodes); @@ -294,28 +321,39 @@ public class SplitShardCmd implements OverseerCollectionMessageHandler.Cmd { // TODO: change this to handle sharding a slice into > 2 sub-shards. + // we have already created one subReplica for each subShard on the parent node. + // identify locations for the remaining replicas + if (firstNrtReplica) { + numNrt.decrementAndGet(); + } else { + numTlog.decrementAndGet(); + } + List replicaPositions = Assign.identifyNodes(ocmh.cloudManager, clusterState, new ArrayList<>(clusterState.getLiveNodes()), collectionName, new ZkNodeProps(collection.getProperties()), - subSlices, repFactor - 1, 0, 0); + subSlices, numNrt.get(), numTlog.get(), numPull.get()); sessionWrapper = PolicyHelper.getLastSessionWrapper(true); - List> replicas = new ArrayList<>((repFactor - 1) * 2); - for (ReplicaPosition replicaPosition : replicaPositions) { String sliceName = replicaPosition.shard; String subShardNodeName = replicaPosition.node; - String solrCoreName = collectionName + "_" + sliceName + "_replica" + (replicaPosition.index); + String solrCoreName = Assign.buildSolrCoreName(collectionName, sliceName, replicaPosition.type, replicaPosition.index); log.info("Creating replica shard " + solrCoreName + " as part of slice " + sliceName + " of collection " + collectionName + " on " + subShardNodeName); + // we first create all replicas in DOWN state without actually creating their cores in order to + // avoid a race condition where Overseer may prematurely activate the new sub-slices (and deactivate + // the parent slice) before all new replicas are added. This situation may lead to a loss of performance + // because the new shards will be activated with possibly many fewer replicas. ZkNodeProps props = new ZkNodeProps(Overseer.QUEUE_OPERATION, ADDREPLICA.toLower(), ZkStateReader.COLLECTION_PROP, collectionName, ZkStateReader.SHARD_ID_PROP, sliceName, ZkStateReader.CORE_NAME_PROP, solrCoreName, + ZkStateReader.REPLICA_TYPE, replicaPosition.type.name(), ZkStateReader.STATE_PROP, Replica.State.DOWN.toString(), ZkStateReader.BASE_URL_PROP, zkStateReader.getBaseUrlForNodeName(subShardNodeName), ZkStateReader.NODE_NAME_PROP, subShardNodeName, @@ -326,6 +364,7 @@ public class SplitShardCmd implements OverseerCollectionMessageHandler.Cmd { propMap.put(Overseer.QUEUE_OPERATION, ADDREPLICA.toLower()); propMap.put(COLLECTION_PROP, collectionName); propMap.put(SHARD_ID_PROP, sliceName); + propMap.put(REPLICA_TYPE, replicaPosition.type.name()); propMap.put("node", subShardNodeName); propMap.put(CoreAdminParams.NAME, solrCoreName); // copy over property params: @@ -409,6 +448,8 @@ public class SplitShardCmd implements OverseerCollectionMessageHandler.Cmd { ocmh.addReplica(clusterState, new ZkNodeProps(replica), results, null); } + assert TestInjection.injectSplitFailureAfterReplicaCreation(); + ocmh.processResponses(results, shardHandler, true, "SPLITSHARD failed to create subshard replicas", asyncId, requestMap); log.info("Successfully created all replica shards for all sub-slices " + subSlices); @@ -417,6 +458,7 @@ public class SplitShardCmd implements OverseerCollectionMessageHandler.Cmd { return true; } catch (SolrException e) { + cleanupAfterFailure(zkStateReader, collectionName, parentSlice.getName(), subSlices); throw e; } catch (Exception e) { log.error("Error executing split operation for collection: " + collectionName + " parent shard: " + slice, e); @@ -426,6 +468,106 @@ public class SplitShardCmd implements OverseerCollectionMessageHandler.Cmd { } } + private void checkDiskSpace(String collection, String shard, Replica parentShardLeader) throws SolrException { + // check that enough disk space is available on the parent leader node + // otherwise the actual index splitting will always fail + NodeStateProvider nodeStateProvider = ocmh.cloudManager.getNodeStateProvider(); + Map nodeValues = nodeStateProvider.getNodeValues(parentShardLeader.getNodeName(), + Collections.singletonList(ImplicitSnitch.DISK)); + Map>> infos = nodeStateProvider.getReplicaInfo(parentShardLeader.getNodeName(), + Collections.singletonList(Suggestion.ConditionType.CORE_IDX.metricsAttribute)); + if (infos.get(collection) == null || infos.get(collection).get(shard) == null) { + throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "missing replica information for parent shard leader"); + } + // find the leader + List lst = infos.get(collection).get(shard); + Double indexSize = null; + for (ReplicaInfo info : lst) { + if (info.getCore().equals(parentShardLeader.getCoreName())) { + Number size = (Number)info.getVariable(Suggestion.ConditionType.CORE_IDX.metricsAttribute); + if (size == null) { + throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "missing index size information for parent shard leader"); + } + indexSize = (Double)Suggestion.ConditionType.CORE_IDX.convertVal(size); + break; + } + } + if (indexSize == null) { + throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "missing replica information for parent shard leader"); + } + Number freeSize = (Number)nodeValues.get(ImplicitSnitch.DISK); + if (freeSize == null) { + throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "missing node disk space information for parent shard leader"); + } + if (freeSize.doubleValue() < 2.0 * indexSize) { + throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "not enough free disk space to perform index split on node " + + parentShardLeader.getNodeName() + ", required: " + (2 * indexSize) + ", available: " + freeSize); + } + } + + private void cleanupAfterFailure(ZkStateReader zkStateReader, String collectionName, String parentShard, List subSlices) { + log.debug("- cleanup after failed split of " + collectionName + "/" + parentShard); + // get the latest state + try { + zkStateReader.forceUpdateCollection(collectionName); + } catch (KeeperException | InterruptedException e) { + log.warn("Cleanup after failed split of " + collectionName + "/" + parentShard + ": (force update collection)", e); + return; + } + ClusterState clusterState = zkStateReader.getClusterState(); + DocCollection coll = clusterState.getCollectionOrNull(collectionName); + + if (coll == null) { // may have been deleted + return; + } + + // set already created sub shards states to CONSTRUCTION - this prevents them + // from entering into RECOVERY or ACTIVE (SOLR-9455) + DistributedQueue inQueue = Overseer.getStateUpdateQueue(zkStateReader.getZkClient()); + Map propMap = new HashMap<>(); + propMap.put(Overseer.QUEUE_OPERATION, OverseerAction.UPDATESHARDSTATE.toLower()); + propMap.put(ZkStateReader.COLLECTION_PROP, collectionName); + for (Slice s : coll.getSlices()) { + if (!subSlices.contains(s.getName())) { + continue; + } + propMap.put(s.getName(), Slice.State.CONSTRUCTION.toString()); + } + + // if parent is inactive activate it again + Slice parentSlice = coll.getSlice(parentShard); + if (parentSlice.getState() == Slice.State.INACTIVE) { + propMap.put(parentShard, Slice.State.ACTIVE.toString()); + } + + try { + ZkNodeProps m = new ZkNodeProps(propMap); + inQueue.offer(Utils.toJSON(m)); + } catch (Exception e) { + // don't give up yet - just log the error, we may still be able to clean up + log.warn("Cleanup after failed split of " + collectionName + "/" + parentShard + ": (slice state changes)", e); + } + + // delete existing subShards + for (String subSlice : subSlices) { + Slice s = coll.getSlice(subSlice); + if (s == null) { + continue; + } + log.info("Sub-shard: {} already exists therefore requesting its deletion", subSlice); + propMap = new HashMap<>(); + propMap.put(Overseer.QUEUE_OPERATION, "deleteshard"); + propMap.put(COLLECTION_PROP, collectionName); + propMap.put(SHARD_ID_PROP, subSlice); + ZkNodeProps m = new ZkNodeProps(propMap); + try { + ocmh.commandMap.get(DELETESHARD).call(clusterState, m, new NamedList()); + } catch (Exception e) { + log.warn("Cleanup after failed split of " + collectionName + "/" + parentShard + ": (deleting existing sub shard " + subSlice + ")", e); + } + } + } + public static Slice getParentSlice(ClusterState clusterState, String collectionName, AtomicReference slice, String splitKey) { DocCollection collection = clusterState.getCollection(collectionName); DocRouter router = collection.getRouter() != null ? collection.getRouter() : DocRouter.DEFAULT; @@ -463,7 +605,8 @@ public class SplitShardCmd implements OverseerCollectionMessageHandler.Cmd { } public static String fillRanges(SolrCloudManager cloudManager, ZkNodeProps message, DocCollection collection, Slice parentSlice, - List subRanges, List subSlices, List subShardNames) { + List subRanges, List subSlices, List subShardNames, + boolean firstReplicaNrt) { String splitKey = message.getStr("split.key"); DocRouter.Range range = parentSlice.getRange(); if (range == null) { @@ -532,7 +675,8 @@ public class SplitShardCmd implements OverseerCollectionMessageHandler.Cmd { for (int i = 0; i < subRanges.size(); i++) { String subSlice = parentSlice.getName() + "_" + i; subSlices.add(subSlice); - String subShardName = Assign.buildSolrCoreName(cloudManager.getDistribStateManager(), collection, subSlice, Replica.Type.NRT); + String subShardName = Assign.buildSolrCoreName(cloudManager.getDistribStateManager(), collection, subSlice, + firstReplicaNrt ? Replica.Type.NRT : Replica.Type.TLOG); subShardNames.add(subShardName); } return rangesStr; diff --git a/solr/core/src/java/org/apache/solr/util/TestInjection.java b/solr/core/src/java/org/apache/solr/util/TestInjection.java index 3a94fac52d0..34915fb6988 100644 --- a/solr/core/src/java/org/apache/solr/util/TestInjection.java +++ b/solr/core/src/java/org/apache/solr/util/TestInjection.java @@ -133,6 +133,8 @@ public class TestInjection { public static String splitFailureBeforeReplicaCreation = null; + public static String splitFailureAfterReplicaCreation = null; + public static String waitForReplicasInSync = "true:60"; public static String failIndexFingerprintRequests = null; @@ -156,6 +158,7 @@ public class TestInjection { updateRandomPause = null; randomDelayInCoreCreation = null; splitFailureBeforeReplicaCreation = null; + splitFailureAfterReplicaCreation = null; prepRecoveryOpPauseForever = null; countPrepRecoveryOpPauseForever = new AtomicInteger(0); waitForReplicasInSync = "true:60"; @@ -386,23 +389,30 @@ public class TestInjection { return true; } - public static boolean injectSplitFailureBeforeReplicaCreation() { - if (splitFailureBeforeReplicaCreation != null) { + private static boolean injectSplitFailure(String probability, String label) { + if (probability != null) { Random rand = random(); if (null == rand) return true; - Pair pair = parseValue(splitFailureBeforeReplicaCreation); + Pair pair = parseValue(probability); boolean enabled = pair.first(); int chanceIn100 = pair.second(); if (enabled && rand.nextInt(100) >= (100 - chanceIn100)) { - log.info("Injecting failure in creating replica for sub-shard"); - throw new SolrException(ErrorCode.SERVER_ERROR, "Unable to create replica"); + log.info("Injecting failure: " + label); + throw new SolrException(ErrorCode.SERVER_ERROR, "Error: " + label); } } - return true; } + public static boolean injectSplitFailureBeforeReplicaCreation() { + return injectSplitFailure(splitFailureBeforeReplicaCreation, "before creating replica for sub-shard"); + } + + public static boolean injectSplitFailureAfterReplicaCreation() { + return injectSplitFailure(splitFailureAfterReplicaCreation, "after creating replica for sub-shard"); + } + @SuppressForbidden(reason = "Need currentTimeMillis, because COMMIT_TIME_MSEC_KEY use currentTimeMillis as value") public static boolean waitForInSyncWithLeader(SolrCore core, ZkController zkController, String collection, String shardId) throws InterruptedException { if (waitForReplicasInSync == null) return true; diff --git a/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java b/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java index 73adc619f0b..4411bc4e115 100644 --- a/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java +++ b/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java @@ -28,6 +28,7 @@ import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import org.apache.lucene.util.LuceneTestCase.Slow; import org.apache.solr.client.solrj.SolrClient; @@ -279,13 +280,12 @@ public class ShardSplitTest extends BasicDistributedZkTest { ClusterState state = zkStateReader.getClusterState(); DocCollection collection = state.getCollection(AbstractDistribZkTestBase.DEFAULT_COLLECTION); + // should be cleaned up Slice shard10 = collection.getSlice(SHARD1_0); - assertEquals(Slice.State.CONSTRUCTION, shard10.getState()); - assertEquals(1, shard10.getReplicas().size()); + assertNull(shard10); Slice shard11 = collection.getSlice(SHARD1_1); - assertEquals(Slice.State.CONSTRUCTION, shard11.getState()); - assertEquals(1, shard11.getReplicas().size()); + assertNull(shard11); // lets retry the split TestInjection.reset(); // let the split succeed @@ -305,6 +305,95 @@ public class ShardSplitTest extends BasicDistributedZkTest { } @Test + public void testSplitAfterFailedSplit2() throws Exception { + waitForThingsToLevelOut(15); + + TestInjection.splitFailureAfterReplicaCreation = "true:100"; // we definitely want split to fail + try { + try { + CollectionAdminRequest.SplitShard splitShard = CollectionAdminRequest.splitShard(AbstractDistribZkTestBase.DEFAULT_COLLECTION); + splitShard.setShardName(SHARD1); + splitShard.process(cloudClient); + fail("Shard split was not supposed to succeed after failure injection!"); + } catch (Exception e) { + // expected + } + + // assert that sub-shards cores exist and sub-shard is in construction state + ZkStateReader zkStateReader = cloudClient.getZkStateReader(); + zkStateReader.forceUpdateCollection(AbstractDistribZkTestBase.DEFAULT_COLLECTION); + ClusterState state = zkStateReader.getClusterState(); + DocCollection collection = state.getCollection(AbstractDistribZkTestBase.DEFAULT_COLLECTION); + + // should be cleaned up + Slice shard10 = collection.getSlice(SHARD1_0); + assertNull(shard10); + + Slice shard11 = collection.getSlice(SHARD1_1); + assertNull(shard11); + + // lets retry the split + TestInjection.reset(); // let the split succeed + try { + CollectionAdminRequest.SplitShard splitShard = CollectionAdminRequest.splitShard(AbstractDistribZkTestBase.DEFAULT_COLLECTION); + splitShard.setShardName(SHARD1); + splitShard.process(cloudClient); + // Yay! + } catch (Exception e) { + log.error("Shard split failed", e); + fail("Shard split did not succeed after a previous failed split attempt left sub-shards in construction state"); + } + + } finally { + TestInjection.reset(); + } + } + + @Test + public void testSplitMixedReplicaTypes() throws Exception { + waitForThingsToLevelOut(15); + String collectionName = "testSplitMixedReplicaTypes"; + CollectionAdminRequest.Create create = CollectionAdminRequest.createCollection(collectionName, "conf1", 1, 2, 2, 2); + create.setMaxShardsPerNode(5); // some high number so we can create replicas without hindrance + create.process(cloudClient); + waitForRecoveriesToFinish(collectionName, false); + + CollectionAdminRequest.SplitShard splitShard = CollectionAdminRequest.splitShard(collectionName); + splitShard.setShardName(SHARD1); + splitShard.process(cloudClient); + waitForThingsToLevelOut(15); + + cloudClient.getZkStateReader().forceUpdateCollection(collectionName); + ClusterState clusterState = cloudClient.getZkStateReader().getClusterState(); + DocCollection coll = clusterState.getCollection(collectionName); + log.info("coll: " + coll); + + // verify the original shard + verifyShard(coll, SHARD1, Slice.State.INACTIVE, 2, 2, 2); + // verify new sub-shards + verifyShard(coll, SHARD1_0, Slice.State.ACTIVE, 2, 2, 2); + verifyShard(coll, SHARD1_1, Slice.State.ACTIVE, 2, 2, 2); + } + + private void verifyShard(DocCollection coll, String shard, Slice.State expectedState, int numNrt, int numTlog, int numPull) throws Exception { + Slice s = coll.getSlice(shard); + assertEquals("unexpected shard state", expectedState, s.getState()); + AtomicInteger actualNrt = new AtomicInteger(); + AtomicInteger actualTlog = new AtomicInteger(); + AtomicInteger actualPull = new AtomicInteger(); + s.getReplicas().forEach(r -> { + switch (r.getType()) { + case NRT: actualNrt.incrementAndGet(); break; + case TLOG: actualTlog.incrementAndGet(); break; + case PULL: actualPull.incrementAndGet(); break; + } + }); + assertEquals("actual NRT", numNrt, actualNrt.get()); + assertEquals("actual TLOG", numTlog, actualTlog.get()); + assertEquals("actual PULL", numPull, actualPull.get()); + } + + @Test @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") public void testSplitWithChaosMonkey() throws Exception { waitForThingsToLevelOut(15); diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimClusterStateProvider.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimClusterStateProvider.java index 4943874bb71..c4fbf2f5986 100644 --- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimClusterStateProvider.java +++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/SimClusterStateProvider.java @@ -969,7 +969,7 @@ public class SimClusterStateProvider implements ClusterStateProvider { opDelay(collectionName, CollectionParams.CollectionAction.SPLITSHARD.name()); - SplitShardCmd.fillRanges(cloudManager, message, collection, parentSlice, subRanges, subSlices, subShardNames); + SplitShardCmd.fillRanges(cloudManager, message, collection, parentSlice, subRanges, subSlices, subShardNames, true); // add replicas for new subShards int repFactor = parentSlice.getReplicas().size(); List replicaPositions = Assign.identifyNodes(cloudManager, diff --git a/solr/solr-ref-guide/src/images/diagrams/splitshard-seq.png b/solr/solr-ref-guide/src/images/diagrams/splitshard-seq.png new file mode 100644 index 0000000000000000000000000000000000000000..edb4ebbaf6f0cc54efa5cf721d2c58ad40899bdd GIT binary patch literal 98871 zcmb@u1ys~~*9NL6tsq?jl9B_Wq#`XP5)vv52oll)BOOYIq=bUfNOuncA|QfFNvDF~ z(9#Wej~>tae&3CC?^^e)brv}D&tL5Q?B{tlAsV+7&l1rSoj7sgtg@24)`=51*H4_l zn7z_`nZtl)@d<1N%pAHfH9i6N+YbW{$=vGt&zuZWkV+P>&=81RmKK+o2xY z+8`d-+mZ>2pFeTpG>5zP9n{~?Pn>Xl6{ovm&nkNEuz~!zS?MrF`)OIGxF&lZ+d+-0 z%863{Dy_`t!;J4jORK9AC<^x)UEbEclf94`>L0uLc|GZ;=mQ^-c*~>$`SwpopLr85 zeYL^Wy1U42dFn{i*N7hx&J`4N&Ad0_4y8lwle#JQCq5ipatG-;JUxb`iS8(1*yxkY1u|8BmR7XZodf$MWO^u20IQH6;i?SxfHiQjP=h7>3 zR3{p5QGepk!Y}|h)!RL8T`6*3$cMy5~$_3g@X3nO;ftu%bt%ILU zPBsqvla(6Nrw#MD)wRe)Jqr15UF8*&GuYwoe9mK%K5}X!Qx7o$&gq|9Ka5?O)~-%hWp6M!F}u(z z*~-d{KEFQp(tvJCi|`>tzAU%EVixW?iM@8w8)lQliZqIS?`JTbFLz?cDsPSkdk@ zT2bjVj#xL4#9OjUi7#h9QnwprcgeHVH=~*z=jcskTOc<{GdfS0Af~c@epQz3{D#h@ zxtcRU-MaZh;*~!XTX3G5@k}Tc)xGg<${>eo$yd&8KEAyIWeQ8zmvB

U@b=?-}_%vIS zcZ_@~i>6)QgVEgdG*Nhe=gou^9nG2d;>r1aO+QBLs`eXi{|a%eeseHjExA$mn&OJH zqtBbHjgvpaPfLDGPTBi5Fjk4tv(jla%-z$IVf`MhoYUWQoTXVPY9;*8<>I%2;`)4n zjO!us58VkAUKQzFR~@T&Uy>{n_H&SpjH42{Pn+Sncu;kC0$DqIubnDxO7d39*2xra z#N<~cQVj~K7uU_izCP3Sb0y2QKSCB3%!Rx=6Yq7rb=%EZf15z&@`7P((}z0-!rwvy z1kZdUjr86k=nwVLuU(fAvj{0^Vb@+}9C`9nx!7QP59LlMIYa-X*P3@KU-T^PX8rMr zJMVH=kglP_Cr&&$p)4<>?K-mf8vhQJ;`WCuE|ah;yt<3^@?;+NLv@;qlFnq-?A{`L zrD;9EXD^-B2o1(14kju+Eqp_htTmA9zD#&J*KVVb(Uwo+Xw3%k+m&+Cu8HB=^75ab zUri>D*Q+-8aD}FG@hEaLt4V88Dv%*572pR7{@0}J!T$RH>65(8sn)QPl9FosNh>Y4 z_1Q0zKF5b&l0;kEh-nZzySuF|Et%z{j$hswDJv^aUR?N;AP}m5Id9ZWjeCT@`S1m9 zM<$CJ8B*JP?$`Hbe*LPxuU|hU6xfZUvv%T07$s6?domQ`yl<8Zh!@LgX=&jb zdY$O!h(g7x6dBa|#$>4`%yyrAo<4p>v>=CDyYOD6LKwBA`-ak-Zdx>(qWKpYvoAxb z!3dsk_x0KE=x8$Yxt-PN?d9>SrXQn{B|Y9aCm$cIcU`vVl<(!d?(X3c$#`{Oa?#FU>?->~}FHC<3e?A(j_Tad` z2w7K#hfIt-8;VIUllj?|()NtssKHZ9OY6oZ^POMchY|z1p0{Fp4J@y-4)+-kl^EX* zEZRVc9qy~}qdQ-T`)$evkrfMK4@9!E0`AE^Iw;&GAQYuN%TD`Kk-a!d2%*F2lECRf$PSgT+QhbGK3?Jw#lV z$MDY5Q*vu%>K5MXC9Hcm(ACw|*;!;WT=x2^%h7bCRLdI}ebmB0p?nB=f4*MIbuWo~ zQRAC)U$Y%lB65P**ADl$?b@)!~fi!H&bkTemn~y&IGFOE0P?XId!9rAYZ4&1I*| z!xQFcq=i!Pb|y>ehhM#NNf?G{j*3%|lmE@|K%u_bbn%PNkLUYja8Gj?&wp*-wNFKng#=H^SQ{ybwO+C5}I z{?PkyFKujM!m#MMG{O7R@8gwly5D!i@iK_o73|g{bUgIj5o*s3q*X-*y!(&}?j8d(IhRMC*Jjz~iPc%6%8w%7g^>zy#(cGxE^ZTWh| zCX(#z@)R!ls~J3~CK;)NU#A8N3kzqe-UK6b9^C)-?kO=fU-#f(bw$O^uBbpxwM75O zhdv*k(UmZz7JXn$e38hC&e@oU`O?+ZWo;3)pE&s598^|5_~8R5H#gx|{gw-tNc+3i zDT{T#`%_YFtxOhQ!K<_x7GhyJIezZvH%C1o2Rwe-3;S^*wj;r}AD<6%osb{Pk~X&L z$wI9-DpHb>v6OK+NE{Cu`4~(3937}ID^XxVBO?`$o?4yA8QrzX?Lo3)>y}X$?QwNl{i?p&- zRM`4*G&6qnbao;RF(Wk&85dOYbqh0jMYOJ_%cIpe$eZBYqPykh-KjDJ!CdkeZlf1& zXWt6Be-XzlFIiB#+@+RnZEfwnqP*KG**-bVmzGWGEX@1R;$ne$N*-+`PoyL|HW4Yu z#`X9qPtqsLu^NY*>6Mj6*Hx2qS+FZo|2=pY5~GZeEIIY(g|QC)NzM?YS5fK0%hZvFYirJZ0W z_04_RvNDraqT$q3o*yCi**o{9r>Fbnmmoe7?=`rt;xG#szJ0-hiMh(^Fs-Plh`*|8 zkVP5C#>Up4!OO|{0pg+dz&T{hu&}5vJq_20!7U6+1Ti7UkuO&Q0!f~Yv%@7B7?oc4 z^$DV&>-ANdh4}b*);aad=$1`=ByxOzd&T;p{-&QyjXs))pI9ktxx2d$a$Oek};$IL+Sl6kZNd0Xg~t4GoQ2chABV* z@dO{`bUB)C$BCfo-PYe|=W6ZLKy2DbT}b(X&!ype$^nJiSX-0b<0_iLt|>pZFOH6m zvVJBFIgUZIZy4T+1*^||`n8@(YYw7FjYc~^y?+{#@o(9yQ zGpy!dWGP2e;j&`rc|}mL1~P|xH?Gk$#;eqUUcKN9VS?HWSG##S>1D^9$3Hp?zph=f1uCS}a9}=d@78?%dalUl=@B zrvh9f=-dx>N-K&g9JD_^lH+F5l$FJ~nb0|THJ_+O#|5bl(|K zd>MgPI0=UMtete0KWg8;El(4NettL9JlmE#J*?M?-|%gXVkA@Egr9WJVg>(yqbE&y zn*W8T{^uu~jVi%jR5LC|oi{`eS|!G@7|fCz9YZcPX;?iu_%=wt;Y}H_ibh1?20mOU zO92zwNaa>GOxwg`|8>j4<5|6s)Ab`0B&7-Od^ZPxwpiU%;+qn8GSBXyYD}svPTDCe z>zUHTrk>Z=4BAKstXIa2R1Qf|XrK}@?Z_5w{N$j@$JM6WC*J$e_2x$T&d!d%|7mm( z9NEEy8aJ#q`k|j!!_lMq!|-JJpnp)1qJje1eYlVIR;uc?gf!RJ8V)jyeH(&Hw3L)6 zh#Mb2ejFOQ(;J4pfEJ3QrGdQ5Eb}9OX>hj4+gCo4UV9a(G>!s$A=vLFPzt-R@k2Ye zX!BXn8Wfw`U3X{a=D0CbR8*}kzpo&H8Xw--r2iK8a$Q)S#wxwxlS?_$z~F6ty`Qh| z`{w4Cu2`Tdeqmvx+#)hRe*xfOv}@~!54}3rN2E^UwcSP=_zdHsLRxs)+1Yt`LW_Qn z0Ri$j^N3K+M#^Rv(MLTyjDdEz`Za~ebYoMva@b2H^>AQj1|PlH znB94@4Z6Bk@)FeFX8{<4* zYh)Tcp=OTA{xfr{tE=C?f0vPwG3;zai&XFKo%3{J7&LNzszYA!gtv+Ri2Wt@YThUg zKo1HEEMXE}dmB%i${UY1YPz;PVk$-NdK^*Jw9?36$89(g5$&pQ;|7jWkRswV+IvBY zF?Mez!KmsYF)!do>8SwEu;R%qxOD{%@?(n0g9j%wZ$FRs@-lqzf{`oWinT>q$<*Sa z=LSae=qm-htBQU%2PQy%ep`IuDdGelJNu7sO@4Om?*SK(rndSBD`QtT8QQ;ye*zDM zEE_#7&(bFGny=shP~OK10{%ZEzj;k?<3r>vZp2C3izksgVVmz(^g0lsaXp+!>|QdX zMoZJzrr2ir$Rwet;FHz@>{?+(Yo)vjLGdj5C=_d8UoNl+7W0c2FWMrRVFuMB)ISzI zK^(NACy#k<26Pi7%KCW*W5*uDipG{e>0uc7M|vk2j$yQ$Or|GsChRXy6hZL}sMsDX-aMKg7`wda#-Mwm*u zplkX;=j1RZu<^VSWG9r_TL=n4g(C}^sR2{@;a*=nUM*avIZ5#NAs0{UQ~xyIlYYj{ zPvzke^kzBr+ZfIqA9H1_Zx#o6mp>5pa7(I6=+ML$wnV5jKlN{Ns%jhJz5H`p0H0g| zMTVqvi#S7EchQLD+C=Jc#;H0(|Go41qubIf4#oMZTD@^Dk+(7+fcPfnbd{T9?`G`R z#8&s{0t`XirSG$*<(JwWGKW*v6Fhe}f(R~!tO&ebk(#?7t-HKin2cK!B5R|-*e8GZ zU^2q>aEilcLoJtCNri@l9nhQ5yZ1r7&S7U)wa;Ag85U?BD6jv}PMyvWotEU~Cqg!sb?UhbQ-ZuhxpHa}$#+J_+0d3iVH=NVnRcwZgl5sF6EZ@bb}@1Jwh zMPNK7%?7NUo4$w&2?>da#BWSVYe_|E_wXv7VQ-l^b6mV!Yab$>@mT7_7bX-(gO^W1 zXLoS|<@}jeiJrLcdaf-?8&W?7G?|SI4aGOURWmvU>`*s&yi4ECniPN-_}uWk5;qBZ zmTCm85)QIjw7`Q2^FhI(w%(huXY+WS#r2(M$j>{Z`wMtIaZl0ZJ!)gO^nCPXzbp|s zl#g4adnqXq%(Xs^4a1L-rZGX$lL!j%b>WN!7ah+hE^!XMFLw>PcwGk8{nw0yb4a=z zC$HJ}d66WGD(kMTEJm^9;w`HG9Xr-t=avJbwUs#*@bS8Q(cBeLHYWh>6 zz|Qhu@Poe2{{Br!o`9r6pFQgfTvc(nV5a@1RpF3TNb@NolG*2dJ2nn}mvK0XuI`4^ zW%y*i>FB`@fxPiKqvPSj{H%>cMx#o8F)>=ql%MUKrtBi`s#6cjkn5b3(D*{l7x-^- zlKG;6*l4;DyhD@p)FHpxvVD8{C$lD%SDvmO9)5=J{oDwU0*D|+zFs`tnp)557XH;p zu1K|=RcjveA)!YJ4Bf3hoG&}q{fgD=w`r3)gZ-$xBi27NZ!eAhoSUPgr1UT6=Y(mh zy?+O((A{wNf1jj!RV?Q39G8>xG800o$ zz9BTXvmgDuw^7!7N6D|Ha1*vlw$n~JZpHe-qfvlt!TFM6qrHK|xRm(hJ#n}giH0Mo zrl$Q{D+YDkJ{e0+i`BNHvx|$1-@iX?A->4$hJy^TpJXn)L{LSrD5mq40go=Or4VS6 z`tDE z62$B*to9#^_PxSpzw^qG!~Rz5J=xc-VQstn$2U<~nyb~UtqjRU!*;!|^c^=O zL>+bqjT~rfJ*Hdk_VQM$91}N=>s@6XtEsJBy>yl&(?BFjOMcJ~Uvad;vLHKKKT|0U z2X_rvC=n464V@VlIrPSSKj-TTY2q6niKn zsd+Sk_^_=i-3+L(M@wSo@U0>-ewgJQmOXy=Vwt%Uc2NxL5PZS$C(PNejZ9* z-5QYvP>4w z;(w4~dX|=o>T%PT?I#NMa{=8GZa$zm? zr7ld=H=hVBUl*!fGyBw_s1h6Xh>Xg8%Vs=PX7jRz^U>zu$)^bEEN9y=e*M|eQT3L= zmC5brOo=&$^;5aG8*A!{5%(%es<+*_HOor`@v}-YuDW=hMoXvGdmQ@}uZ(PFoJV)_ zxz?J0`5Z=r{DnN_hl2@xNR)K*X2UT0@kxox&Nj@9jEscHyshhI9jQQt`Uf#f_;`24 z@ivknp)`pN+}A1FZubu^>O)@;5?bqBq4DG#Io?|8o_sdaerSCPi^bI%_V;!i*TlN+D7-sy0SE`AzERglu<-@c&i36 zA>r!gro!oA$YgG_k&PtPk6+il|6&tvBXP{7 z;i#zJ)5C51F&Y!s>8vEsLh@?YSABnLX>`4Kt3!!L9#>n=%#pW?sHWrHu|B~!%Pwgx zKSZi55a7FOD>EGz)#&e=n`gE^peIM4#$8&vh(l!(9V0G`d0+PE`yDSYNr%;Qhqdng zXL%JP#8l$;H!LkI?P@N3PeBD6$=*r{y`)b}qoMDJ>d0JUzW*sjGQT1L71^M}PuB&3XLKmzaJUHBR z>l8?P^QJW`Nq;C~L-Wf-mRXbUB~0N|oLu@sivO_=o=EHcL=kr=unglkSD zYaQu3{QR~<6aDaAK5()d(g>h0MDu9pq;3Rf!M@K747reaOXgyqZvK+yKf0~iK zKvPqb){TIRg@q-UFWbyNlBTDu4UZ-d(O-s4F3&Aj=!IRG9wbn11^YE0L} zcx=PNh%3tSf?k>TW}cky3Fx!fTKtZOhf72wa(YSQwj9cMZnDwOAMwPZJM|WZ@T32h z%gWK}@nqFzwqk3jnFhsfe8Ql58EISoh({Rp*^SN3C`IpmTmElRP#!3NfV2$?l9czs zi&6)Ci>6?1F-DREvg_&Rk_ZaVX9kfnUw2z$=jK-C87{Zz5@d`lb2J|`2cC5k z81C*qw-Lj;GFojP$D>ms00&~%#h_#0s<{%ZY) zQf9Md%!}(>XcDGt!4yR>J5wbJ%6IPES>vsuuT-VRvnx0MBDA97)!A$0bBH^AUhI){ z(Lr{Kw`{FgE0D){9woj_+IiZ!T`5x89hr$9{>iDqMe;<-m-?*oW^ zcE01Ms=DXqiX2pLoRQP}+4&lXau$8x5-tzPJs{f`M=Gt?_M75Wdxj?_j=nX<#GJuv z*ER9yThS4M>kDsV`Qna}+xUjG=S>qsQV5#h^}Mdz#GGBZ_8G5d*YAhDQ2JoR)v+}oV_ zlt6cm1Js*O-QABc-Dy*6-ypu8Vse-Bt)*f1u^H*z?l@2_Yx8kd5$v>O+l6mZ6W9(8g@&Q4KQ7K43L{u z#YyBHQ%x8^oSUtCTz5pS4ipKePrpe`5_^}+QOPB=E&T5K-4Tj$JwiyPF* zAK$;T?3)*l`5_2$&0yb<-6V60W`;^jIZ3cP`h4m+hb;(hy}1L6!{wTdkJheM2_opu z%^=?QsPOwHLg0_s8OGB{PymoJYk``ssUbO^Dj_^ zFRVl2ql!FxQA3H5vN7hxi{RUr=fv$*Rz*HA`y8xpE$M%0Oixq3y?_nB0p)b2{JH2S ze%J7dXco99DqKP0Skzgl2$vN0(EjQ@@JzHN|7*6o-|N(b%bSh9Y8CTGx|~?DlLue< zfa0pW#ScTKzGEVhp1ghi5nn{Lr<%CaL(kAt+zcH1#rn6bgW~B#`(u(n9{!|H59@hO z7BnT@OO(6U$UmH;w##6ttX{F(2*vs{F-l+;p3e%BAzv~5{*@fLaV{GlKJ3W^HDvns zd8I4d3MdEn?j4{{)KpMCa&RCJkn?57!UT3i~!JQ+o?kvWWbDYu(O(BvI{aoXNpux?y+XlSHCIg zbmfqu#f_-S%F3*)84wk3JfppI|J@1AAy9Hb96U>ZCC7251C2(1d(Kr+SsAy#S3T)% zZDA2aWkdhGK;rTIi$qHoW(jM2BNQgPi@8VBa3YQ5K*z*#W6M zQ;AGNg{Q3uM5yrb{(`$--@UsJk}C}BG@qKvj0g&{CylB5-bSv0xS$|x^is%c`;dJz zgAvNGtL+8~UUJrHL?V7z0o*PEQ%J4j33whq$^al^thymhQ~nUOypfQI%u%G#st0-40F5F%E#bWQqPJla_8!2WJo*;S9~S?) zfDD)zPTac@PS4@tr1buj;~PK&;mlIkzhJb=!*0EnIAmpGwbpi+&QOA`z~Y?#Q7gxDaW8$_R^d^b4G)1cnA<=U#0_0Jst^U zZ!t-(4|fw|J8Ut&EzOjHfq?)wsAy>g@4o}AW45B1g^yHmNt^XetFQN3oodbIu-?G* zr1n9M%Ch^MC``-_UYTA<0{y6!AZBlA##^MJ4)L5>ju+AL>1^XVG4(02ni#FI03H+; zc8!gBg5E53oDY)(mIk@`K+NdN%N9}EySuyGOB1ku-xbnbHh<)<@vQs`cU*oq6*V>9 zi3=Ua&pqALjEs)KCqWm65U$e*Ky-iX>(ky6)t@pBclz1czIoPE=cK;=ixZej?aQTJw3s{p1%IkIh>V`$k%F0UV;}Z9@!xx#U*wZF^ji}<$ptWWyP&@tyEs4T>i<)8>GsX{5UR>waB`qAEVgMh1@7-sTSGY6NcAv< zoP-&x+?^(gu^5$%pc>QpsoUwiN34V%Qxvf#X1DOLvjAtM6~wz5Hjmakm(MsASSTCF zx3}NEPFbjCr17d18&ycnNUKSxE%&MJNyIDWZ8bLTm&^{l5#aiL;q;)gM16ds${5vh zEi+piB%}-Qezgd6asBg5X`g4}6CARqHyfVAAz=s)kA1Zyk=NJUVmPzJ!YsAY!<8ZunQc1{MUUu z+S#uE40DLb-nldAT2N7f_+6+!K)s;~Z9>5<=ffxz0#V?g%RIuV24% za&mTdTsuv$x>^vZYO47?GoW2AED%3ILSWbk4G*8;<3tA|+=D@ZtDr}Af&s0l2sm%7 zK+JCVsug=5Qmmw=n_+EVCN1#85DL@i=;(jH0c8Ws9DteFNSF!FuF>)Qf^Y0BhoG@U%(p(y;+~1hHU239$L?XdwkskKXl1Wz`?Gb+P;Y{fS#A%>D zD3CDgmYvdr;9*%R*Y!KYGje;x*w$vLJI$}Ma`R&}n^QF-Ft|gd4?xZ+6>|Oc4V-Ba zOp<7*P5?ojW^vzI4B3Po!z6)H(!TLp2e`!KYr~&E7eF+Eho+e!At3>47AGgC?MQ|A z~ z(Y@=%&mt%9_gYKwLT-{PC5fZ$35{^GU zf?Fh0Hp(0vevOz5dHa%`yqAD%u9pK5#Zzdj^f56@OVw{weuJ?yq!I3<=XTJ z)*j?DCSVJ|2gZ5pRZit}Xu9&(H`-EfSnLj_v^&|>D>HR3lJewdPK*pmKy4}RG%F@1 z_QURKrfab(H(FLsZdCzbq44A7iF#gd0jOlmyu7>w1OzDUhRYPV(b~c}#sih$@&SN6 zIyyRCoRN_+5WySDsg~5c=Fb8r@5@ZkgE zZduFF5bX@e()ei5=-h!1knzK#5->Da#|uHgb=c5?GqSR>w=5a}aY?F~#r5ek=wH0` ziU4IhRKnsi%JKz+69n)eGdo)^SBvBF<;#FDHM1eO>*Q&3-+uEfHx~;&bH*|hNl%^f z16v#{F~VyU>Q)bXQv-ib0%RqK*x_5?rKoT=(7a+f5=)IzP*C{JCv-V+RLOm>%SxR%ai-?ymEZJ;0;$9G z9}1`dfB&7mJpfqCUtY>~_4u4uFg0bjfO`Stl-En{2HR+K8CGvR*(t7ux$GWsG|iQs zo-P&!+Hx2ZD|*czEG7a-bgY^E;^#YQT^RAb$c*6sid!8NvSq$CDgWc^$jJXh9SYeN z#fF&w{#r>%>D%9+l>Rq){0{1X77?I_(^~w_2CNVm|K_vwFq2nV4cUD_q4EG1cc<@-#o?Mtb_IZ1wxp)qS)p zzfDg&eSaTtM*IiVg!FWDmWIrA6VU|_9iW;wT&}G0_Vxy(U@69WVF|=xC?i}RJt8=B z#`MpF0VuK>smLuXw5>`dt}D8o-3bSQUDbM^!1Dh661R18%Y`TwIT4$os6aMZYw+Vi zh+?>8((>fwDOwBe--)g0nS8=x5ui+9*&2Xt5SCO#Z7)Nd9tW@^)TxC{!e)%0FT^A#;Pp%uj%d3xD$D38ntKj)lSE(&gpl zB0Qu@l7dQKo(}Kr+h1X=sxZQAE`fC$m=tG!XLb~~ZPSMj=2!-k7hP9DJM07&v{1HJ=*favRalX4{ra+YeZ0b87 zt96P;lJ##6EGm{gQ(00X2H_1hKk!N10YELOswaso0i8sU`a2d!GKiAU?(F_d!3OaL z+(j}Dpb5Z!ShiQ7YFVC~oD6YVRY{2!ULC4v1!HX3M$N6k?@)#S;*^t3=%wz)hoFFu z9|UO_29s;q9r!$4BFdeE-Esph+wenZfnSmWujdgSl9`rKai04 z@lfZt7{)UFuUGJaga}yedaK8^;J4sTr&_q`vdpJf^h$epbo448AK#TL+Un{85)${+ zh=C!YyY5*7^-u6fUUyc--C-i|c>@e4*JYA)_fI5PO*cT_&&k8xFn;e(XypvzydBK< zDru={Pe1yx^+_eQ2n^U7rB&j10xISpacIpz@=#T#Ler3wr*EXj(hDjiJ)))nMpQD^ zrHAU=xhLn`W;&=8eknPOwYK6C`fCq&bmX-*O1Lb)N~DIo8mQLP)KoSTdZ01F*FnlC zVQOhP%yk!1oP0Z=YmM9JQuZ`e9b!k9Y)Y5IW>P5v?~gio71&r?Tx@S)vHiUne^Zft zV{JzD!k6yuUobVHbqLM$)6a^rPovRK=J4lfwwdH+TDo4{rd8^ll=uw$YSH3g&)XK2ZF6I)F32SF#Y+V}?wo7|e8$QDcL4 zQN@G2?#-ja{qF8=C`e8qi;Ws}<*_6$kfA+prb@l1HdG?H`1sD$rtX++z>#n-tS9v=QFjyKzNT9FzVTnpsK;McF^ zB_&*U%h=aqDD_XAatD_g?86p^CepsXT|MxmYV_MoHh4h^iKVeGUcBhO3`_dLF?6{QKc!aN0MG*@Kvp*H z*`)BWFbeLEb*3S*QF0C|Rub_d^~&*_!adCZhiX%tmAUCl{2RHMVtG!PfBXCTv7_Az zW(B>+Np>IZ{)NfBs+BNuHV2HCEH3@#M&xN)9eyXrI7UpzL;%S@xu8S&E{!72G~aL5 z1hS{g?;-^(6NHpriok~eCU1>?C#L!*t!i#C{&O)!9EC~jXOi+L2X?`K!YVGB+{8%1 zW*h7TZPC(yt_8U{89y-a%-tWhBjQ_Q!V#xK8#1t!iIPW8z?Fq9^r2!tspFvaY;@!9 z?Z)+g?;91Lu9|rlKde$p*CN=W)OmSNS2M_0jGSvP;&*jcC^zUcix?WV=zZ!q&@d|* z*-wAQBu$XG=HJJSyMbEWtfTzr{l(89Kh1ug{A!a^XUyxusQQ$`e)`tSJrrK+pO=e6 zpp>`KOm45P!~K%%E>kk`^~P^N691h?d!11sF{C{X2_F#n=#n| zN*+@}F&VKTGAHk@`A?lUa|T6dHa~g=ilI<=;GAcQGzt#XU;hl5=CkrY5ajPgpz`^9 zBA}Chr{g~-{Cy3W#($o-65|dmCAgwzh+y}Ckdj_=%KPG;nApi_ zUBB86>ivMgz)&>+Rjt*OgIKnTow)G(!mw)}1aa`{QzMB82%^UQPt|(ui|D?3{o1JB zy_M|!pLf()mKg*Z17yDoUgw2OKLS_MmyvJz^$l!FhAR&>z%U&~$?XWwvnVkSu@!V4 zbyRzIw;(I4>Y@968R0F4EdEXsg~=VqYNkqaGo>*kbu0M~I;o-aUy|2WbKwShQdr@!^@H(tl5B66Y z#c%zsz*jM{S5kznscBE#f9rE>c(#bLC!n~drUq2Lcb`6~#(KEB8v^Uh!h&tp0-zM% za0iW=gV7wXaX58zezdw+JHm!k<76mMH>dbQ9Pishe+XE1rH&7B*y z`H%W*oqlSNJcRx$Wh0}>&dz1v(2v=rJf9}2Ctr(JpwUGb)TDy6?sM!dj)Hy|Z%AV2 zFaF(*NK}Xi5=4rV7Y_~&N|>0KNGgKaZMu>r=X)R{dC1AhaX*lY=j^5;BRhE^7hOg} zNoi_sUS;+v-X})jvB@A;G%P}oEgL|5Q1z%{_I6g;c%YvxaoYb+@t^iK0`U+q z2bzeM7I~S(svIH*DltGs+VV6tcd}HdE@;T=-MND;zPFA}hdab$fj$_eac^no>z<`N zska9_e#!kNA+wGrbU+78DWBEB;C#2Su>rgS5|S@$J{S~39#9AC0RII9C;;=TV5n1R zrBhM@^A638=OUj=i^ap{4rR7!Pgnh60Wu3Y8j^T5$h0Kn|ID8wAzDZmr0OXz&6Sv} z@6{kp)+jo*bc3_ zpVRLH!nP1+o&n;>JdYG`DlT)Gz5S|nE+zRNz=HL*UlJt8x*C90d?_vodiMWj5r0p; zR(KJR8{msv0Q+$*ITB(Q67~&HLT1F%Q(A}dd)VqrX#ha0ShaZA*UOTU*RFYbd7UhQ zBcB=qWd41}EP5oU0iP2DCNmTx9XZf|7DY^2f}!v7{vpI;h)trRqANqC8F_nTvPh@>vKV_pga?aB@1@IZq=S5^e( zb9h$Zwop+*!{|h&GKJ0jaQROl?k`8`UsU(z(qdo2ke8K|D3Kv|benu}?Z?retx;R- zY@l3R@X=8oZvSwh*}qxkB}`~Y2t=_6pjuzQ9tXROR+*_XutZ@r0(m?M4f=J?OYk*o z%L6aaxL>wGVmT6bLGX50LUx6U``*2K-bV*7F;jm?48Vdjb8{haAbW;6J|SX;y0$pa zV9yT1=)kE{r%ER(EN?G;*G=r1f&YH|@TUSd2$ppH4WyS827wPOfwmI14xn)(BVS8A z*3v<^lwOjMpvSi0`9QB${3BjT%zJl8R#8T*hp?yrkTbnns9H3bM|yj;Vu7KdWCr0j zH_w0s$+{pUDmutymlce-UxV$FHa6}J~s53KF2YsJ?%JIM;Pq#%@ z2I=DDaaKvy)M+gJThDKS3cOt^76qH0WN%QpsPx zUVgo_v%jx?i+b`+(;pr_N+g|k)Ti^6=GgB(mZ#A$&Oa*6ztF=vg+e7-AHu?K_G>PY zLEN2N%O86jY_1LuOfQf11M2~GO>8?1EiIM+1I^(t5%#-D<~LLSpX&w}8FbK%FjGpoJbyxXh2P-$3$aL5D`4EQK^!_A04d(M zal?wI!gh3EV&b|SYh6OZpf4`5jjb(k0A?9)^N=66&OQ-`?6EQTmGS&}oKvUzS5$TU zR2bTGPTlN@`4cao-zIedFcY8{jmdu4`k>{O0`Yph+vNj5roY6v*}n0R+Nke55y5n18qkm3YL+Aa_lfDdiWi3kmaUZsnFR0$PgG_d&MfE_lGhmZ|{2;TvnY;_f4 zgfzA#9&AdG{~teo48P~4nZ=6aEs zuAqAZUc6Ki?ZL8&B_rLric|BkaSe@f`}M5}tW@U?vz~;}O4^Ny$^S_4IjRLX8H&*= z_yrghd<_8Y=vq{ilr--B1U)^q54z9I_Mg=F$*x+t4I^{rM`5l{Bm+m+p8Rky_jVgN zsS50eO45J|*Gd6R1vn@lprS54_yEY>^XTBN4qFZg%9c@^0BfGWD0nG|?>R4x2%qnR zImRPp;?ohieEF1%aX&C#IrD|H7!{?G(fZMQIwcX2DNBoEPM_jChZVwXR-T+kZ*dZD zym!+AG8PEo-x~s2G$NTKaV|%I>B{9LxT!t3+IDTg3H9({PI9s#3RS_Ur>zrJe?O;! zB$b2XP7FB(g-kT?KcALmbte6zu0ep#gHR9E2AD`ejiy<^BCW=|c~+<6{u`HztJ?j6 z>sm8}6r4HLra-LBemPG;A*a*i-kTXXTJ@Naq^fBzh}5Y(nYxUz8xNI5C-r9q*`QvF zJK>$wL(j0`jy-vDB3A$I-O3%kpD{*lybcOFxOY+9g-(FvDVK*z<*FE<752t=sQye{ z((>$M3>!QxZEbBIJ`A=|mqeS|8^v*Hn!w7+qmM3JoSO1QsTD9wpg#8YmT8vp=oaJ* zIfmA&NujO!h3Z}G%kBsmi1`eBm907@PjiY5hRlos9fij-9$j{h`x{syE}Yxn-~Uv} zhHI@uW!jTf(TS}AV!1Cr`X)X69!f&^TN9_bqZbj{n`*iMty>VlzH)YBEq0m>;QYzL zfE=jcbtNm0EDPh?14SC{-R;HU3`%6;hKLSE*86rny8X#XVOG|L-l;ZbeL7l9f06C% zRIk(Wm^m6Pah5)IW1S)AO2Nv6Ewa{eRV6O;_@`9iDp~l!?$0{~o(B&H->A8n+Bk+c zdR@&nZjK=#v0WGtZf+BI;#)1%%+M;c?QoVZY8YE?8A$P2)=HBtHEy;_k-Yl$#@XlQ zUplV)T$i(2I^3_Vch@O2YLs6Xm|>FKOUA0A>AX}JUwTnHn+Fg4eoO;`04G-hjvdT7 zr0t8zC?DAKQ0o2gt?VTNH=S%+UrnzBXg<8!Io%Mr6kY@J0Ha5tL9JFazREr|HFY4R z;sK=%oc5#x%G{EPMxWy}xgbt<_6zJ@>t95{4>43a4Syoyy3f&D=rRBj0VSuyrqV-o z{`@l{NTm2Ffuzicmr96~+h*-oQi*v}agLTJCqH!-y&SSKHs1KwL|JP0FsGR3O{0f} ze%gCcrN}2lS8&7%?|!xGNuM41u_9&K5-brK{s5`2j^8g`8ARHM9|V3=_i42vv)of< zn^Z1Ag&?e)U=VqkM8hbQIj}HTj!#-dINLtaU+3`Pysr7@hh>kgEwGXW82-~1KrjUv z^6S^H`TEsGK%`SXB6|Y`c!VP{aTr7_JX~DvS-McFBe0i%W(o>`;SVmA1p*#g1_nK_ z7Xkr1wEspeDJCX{(k->Z{`&Rn7mNU(lxDz(pznlsKtT)@A2`x5qtyb^Twz7>PmG|~>FUTU zphrP9UZeb+UWHgFnN1OI6QikMqd=S_@)$=iYWv&t$LPnAj0^=sVq4ax+8Vwpl~y0* zf(Ak(l0jb3@@gG7&M#f{sTQ%++UtnBbVue*jj^1fcuVs2LuAVJermpw-?9}(g%N$E z?5#2d1+z-y4wQg8NqySEp`kHeuVZ>8?(4|Qw?J;`Z**0*ocu-Qskf?k_hWt(vYqNf zTbs|p4q2UCF}rl0rFGZ_2q^fOTP z|Df*8zR?C6kdP1|B155pG8D;>q0DnF%20+RT1v)JlA*|0l8j|mrfLbaliec!!5`?LSp_aFDCtJYfQbezZW`+cW_@oCqWw~$}QS@)L( zyf)3YKfhZ0<<=)NipiettBmxH9US6o3*p=*vdH=DNK956Aadj4`V z8Eie`H8H+m5VRBOg9d*|aj!c;f|T%`c>eS;Q4xz7BluMP(zft^Qhxnprufg#`dmBh zA5JZ$5jGzv<70i%*S4etHB{OiUSBGjesX+Z7@E`v3j6DNx|^J9qSTYy-@c8Yy-Xq0 zn(uH9I2hhx6J~H9w1B7=86S%-?4~!a&2V|&u!h~?17&T)I(@g9XVyh&xa8-BcY4Fq8i&i z^7;9}hvnL*o^80wCq`mp8|ZjqI?*O2bNRekRhj{P1pDbbg^R0Z$}3ckkcdV_>|>nD zOp$@5I-woFow(+1ci?Ts!?=RFv}(p%O-~B6EOc&iBXl6u$j&8BT6|6noQgpt+wBzFFty$T zd2^xFa;-)!7ujA(8;W_5WA->Uvv#Ie;qs4tmk?ohc z^uJDg+-r|RRZgpLapB@9&)ZP5JFQ(R_I@!l${E(5eWcX|LlTYkv1^$sNLL z6XDYn(a9L!-7zfWL;BvcFPPfU9iSVW=VYK7Vx6axuvUDKG~}N|{EQUQAL2$u8`c+j z-5>k;eTA)dR4K34_zGPEyNcLt)yY|gck=$r_fHKCC>}F&HlCm$oaBoKt*V7jTpbdp ztV@HI{K;LiZ26od==eQ;4)>GNT)ViZ#t*o>UzR&MsF&~J5h1>@G=4eDp7HVC#+@ga zg%(hx&wP&T?2luwPkxuxc3;FO!)q#2#~U^`Oz~?=^f68tz*XC%P-@PCcyb z(zaECE{$*CIdm1WRiH3%zEScdmwb8s`i9KL5D$rob+DMM0+tv%;HplEYpI9@l&E>Qb#@ic%E{!`kDF}=kFDey|Lo{J_onQ^ABFHV^6F`0W*j5>B7pV z=L0Of*zK{ifd*cPvjg}JE=<(6! zwWNcyGsN`KjaE;H(LY;7a#S?tm0(S%saN1GqzA-_7?;I_6Y2iVh&)JfbC7Lv9wSzszxtFEYEkn)Yek{AZf#gESq2p|HX@U8uI*TzPRP45^u&VM*m0#y{P3u*|Flsstgu)LpI z-q)wz+pG4amj8`fBz>`e#i1Q$sAB0}=jnvS{6qf(tUrk3ml1CoPwh%3@_}8R<;po6w_zAN+G;Nu4h~)Lq++$Ox1!xbQ z7^Be~WVP7%Mhg3Y)2AO(z$R6b|>4L*&gPQsx>c6SF*6#bsA#*W(8TGS7nSYZy3S>h4`N9ZUgY9MRs zqEbaoJ0J)~n-ekyMHb;)5ex@x1mxuPt5*a+0L;E(I~t7+NJ$n{wzp5A^~h}VJ373~E%maGXhYx@5>&rx#+FQec zu!h?}sc#nNvXPiVTLW^fe1F;LzjfU6awtS}@b30vX4o5`c97knTWe`V+8htMhdTD* z^v82728UnA$)qhH97%wswCKbQZ!>8@&mATTEPgEy&&HN@{$ia!0hB>LfDMZqNdf{zI}VaIC}4{&Q5ud22fq&u|S%ABhmkY zWST<6>Jw&=aFsh9gR}di+F_t?dcFeYxYuamQYQJthkDQ>*xMpGYuO*_L*(U|>)un+ zx)IUP*mMdZcMl&v%rP&heEarPL#ig8`SUXiFfMEyqZ!EGKZ}a1M9wh>nUdj& z$jaaSlNxw6DQ-OsrJ|=lQenUnW&d?q_JsFi-#?T%KJgDB?Z%4lnX~c}8m2{^wGub3 zATsf{z4J0RS!^&Y?sh|+F`}9z$%Bw=;YD5l8moUd4s?y)nRm%X`;8b9lc^ei0MtI zYK$G6mgVE|LgS==J{NTE;^mf>mS!IT65=DJJ_o>Q)(o=qH-@)eO|7fbBd@HEKlT~; zi#~O5P(l&d9t*!3ooVgjhb2(qtM$*GWxMeh8kKwC6rtoiq~|m7;dDG^iwxsT{zjJ5 zCa$^NSASU;WJNBWJzq6@6*_QM8nu>D$*AlZHJr-Byy3%M7=d@}PzeSjkm9`&_uTv6 zVpyX>g6bGc9~LT*SzESm_Z_8PJ$M7yDJJGK-#h6W#750mP=GXF*##zcwf7#O=xaiI z{Sg+)#J7{{j6kIyFxpf{t?+HH);K)|?rnP59wyZV$DE0w0!h2&!OL4+OsXEyUoQLCyL_Mel4LY>->_7VVOv(;wR z-|w`6p~D+Q#}X_e)2(s#EMZ23hq(L?5H)S80cE{;KtMo}*xCnIuj*seSM(@uUd*&W z9~Ql-!TTSzIA0r$>GfLrpFgjUfG9}=^@p=VJKaINh$IYvw1}M~tF&VIa=DwoERM8~ zO3yxyo3gHgbw!7tUmP7!Yo=F;{}6cbqWE+nL~KfP51$bAnIc8czWc6WMOhOcb7*4Upovz_o!d%|aazWvNFHN* z2Ip2M(}J%INC=r78y0m)%nDFmoA9eO>WRMW+_?ZcLu(B|Kw|-Csc&p;?*bA+ofee9 zi*@nBZ%pB|FRz9g)1e|HF@0x%B+{eKU3F?Aw6rugyGuo96*&yCrS+WHwPe9XWkPp3yIwJo zA@N;(6aktY%MQOW8ftcP;;Gmp%bWXR!PCv?e>(?kaE$c$bMXHUV*#*xuU#RUAk8|;q@-w>PGJ9*1)G^VySn6l)0X$6iHr*w z@3fhZ8*I_a>ad`@^L&hJ0oM}Hl*EiUqLI4Xkyqe@in|N;-UDw z+e!)q;SE520IYq{B1-^=1)2dtcClUSCZ5Wx8ExM#E1cnnsJLo47mT&|A_(h^V=#@SPkW6&aW z6Tj$o>eMNB_p$NuB_-j&gb5ZK%KaKuGDP*-*-Mu!fgC&vbgvp&88C4)Xnjn|s^lJX z^5A|BYCt=YzqWO21Wg0vtlWZG9m<4*5G<=sAz%c74c0#kc%Q+J>~LtHy8-we zmaIRoy53et@&~hPDo`#!VhHtWsWF&8sAKTJDy(%LK6|S9Zdk@}+iWgA0fvHo8t)jqF4iX9MBG(XBT4)Rk1w(Sv(?wz9 z^d?GGTFHm+1B(|k%{_Q-5k2004i*-@EE5S{-kZ3~S)lwBj<-KZOk8)tH@o)Q78S1t z!hyK}Y=OM>_w@O4{~8|7;-JPs3J(ckocDc%k0&$sLs5wtpItXFR#d;N zx>~bI-&nF#0l@D~Tk``4pu{)BZ`R2;G!U`HX^okn^74y{g#S6eMWkR)6on9$ON+(c zg$?t0Rh33g&HW2UP>-D%vDMYBB^M)PRY}eqqH%yQL`(F4B)aMeVce)5<+k}1%V2ha z`H0_rlJo8tj(cAiIX)D=@i|+-*T7LINC64 zR%HE8^V_qWu+sg6OTVw*3|*6jMJ~oRUem=(m^64OQQP;B?RHT%r^6Hg!$5EnX8YCr z{JOIzWXh~!is})%&YBJ8@58)es88Uq`kmLk93H2JLu~!?FO@+g*T1&cTrlhExXJKJkK&}pwT%>7a zWCVlEO;VJXekVOyVDlo%X$;_KAyREF0L`5&Pwlp>A-GI2s z!29Dpo4~X*VJBemk*Fy2^*;{|?s9IG&J>f9I_>5*^5e&PYyDl@Bp=!wI<)Q_@-f~| zJ*ivDyq1fDqp}7s(D@}RI(Kf_vISW>{g-)mEV~C#8_i`ys9qPE4Mg)$kz##eAM%hL za<%xnz}I122R)4{a`#$iX0owSc6-5#{rS`NDHXN1q+;uLC)8fw)>u&BbAXTZyH9mA zS;?fKp#kS{PLfVNk&)_XN$&abrP!(Eik`sr(pNWjgnhg?o&Dz3t9`n-qU;EWsQ2sxpyZXl}ia0^Az6B$?KqX7OPT%Y5d{m=U ziRwPmuJd$()=bUW zTGwnXyO45L@)b+nn3b@Ih+)+QBgs#0feWf*)}D_?{^Knui*0=LWg-^xG|tq*7)a+@F4X(=3vk9gd#4=6~3DT zgS*Z~&-}P`_K2D(1{zNZ0MA2oI5_Sx*ciE`($QdK z&__Sx{Y9whWMo}C=~PTLG?ryq6&$&|j-o2aS|pOIu}$!jqyr9UD4(91THbT=vU|vK z`A$|hHyJ?#{jt9#%d+&~_ue}tIoV8AO@Dq{8Qd5d>1k5atFzbE_L_80ja^$+{e3Zoh3lMTqW0%HHSTRk zLg7q?i%P2pWK908(cm6=U`$P+yT+#B@Bx>3=k{&3l?cQZrDAP3&o~Mpdy_%s6^x3g z&b$0mL+=X$Ljk=RoEhn^M(v%Ko}TzFH7%`TZ!G3L2L}ff3_y2)HrR2os>Vv2R$OsK zlmO_Ps7jQ9%@F6a657O2~t6hyJR2sSR|Pao(Q92xCx z_}(RvKHS&LP!qGvs4zN7TTM-D-P6f1r5IL?+=JKm-#-2!PWuKd2kKFst=)V=|qU_`%6e=q!+y~z2tEilhTfwim6S1@IS0f^E?ufX9-30#_e#jIE-i%n`$ciF-k^{lsf)h%##$-fkiDmSC{aQsr1;d* z;;vdH-P5Pye&<-S0FnQQUPUo~-lGZ#K zotK#@esA$HD!q!+L7>f)n1IBbmdAXwYA{IV2IQbSA~m#k3zW)m$_`VtGPw> z9Dn8abip5=-|a!dYbg)5EB)!N`5+$oxTWIs#g!tOcwDM=^(p(82ai7Vs9!qwvR0^Z zHc=0M?fmICy-Lsg*VpEUho4gtl$6ddQ|@I=)0>&_+qRsEi4;Zp@Mz-eVA{izOaJ`- zxQb8lVEHLI?|0|73TcvA8#p#`l^x$pPiGdA)c@w@84iwCJG+;nMSU&0v0;*1j;8N^ z6Ryn^X^s2!@@4FeYxYr5n<{L$mxb=;#DFRCK{q3RV|QnthB7+Z1hi+pg2E~u9-BQCxA&)94wb*m@1iW$61}lNxZZtYXo_!_bRe?~CU`&3 z(YoY3Yh8iKN#^Y`%|gFzFN8^I9wi1em-hZK+Kb%d+_rWFll&E)mY2^{R@MbPT}EDr zCF+1Wr_VAr-CNT$BhgCJW|cD*7JapUUMfayySH;+rBtryDr?S3I-YR)XP%lzMPscq zt|jh2zR_u&?mvs%kL3PczpQR{NKiVSb1E++(XOv~dqM8R3Q|-JJBOrgZ102Gt{2*= zX?q(w7{|u>m33{syHB%G%iI=V-b~E8oCvf>?)gRcqWj-^srI+CviMeQ3lh(>n&B~~ zJh&FN_Px)P2jlqSZV}xW1eOgAn7b5r6+2(~=&PVUP@;Fs+uG3~!^JT(BP~sxesXH$ z&3kItsM>RbK9R^=r@4czu_w-cMN6kdWmkX(j zC}(qv&r2@S&9fwp54j(;vMN2Otf{M3p~c8JxPI?Wvz~mr=Ssh`l~NXYouhwLQl7qU z+)~u!Qs~;+U6RUP4))$peO+JinXs$ICW=J76@6h%bqtT(%^9;8k9r}=c_}F<$gru| zSg!l7u0ey5|B4B%5QtRb5A7xki0gIOIDc?{!F==zgY~z7h;x#C0d5%s$E=je%RL1b zlUBI>d#eT$Lj)g{_~>pi(o2hsTr&~f03~A+F^3u5&ENWf>=1KKd9V0MPNrYq0@zed zUtAds85)fd1^QPpdQC)+YH;@=yqK_m#Z$joP1br0SUvonWIjvIy^2e_}wZ` z|CUbGvDTO zyK5OX2eu}^5kI3 zUXg;DvkRQ0@@5nlK1+Yvuxa&b;bec}V2KcVra?D9{p)M5(RS$p@|Rb)0v?_IIx&zT z{Cd@zzaCDB7kQVCrtS}mRayO_l<;%gK0DW`-Fg{&bgcgl0M|zM?y8~1OZ!Ab{3;U+ zMHW1Gc-?R6UQkGgoL98MErzHeCay$XBNi{IC?<0K*Qe)ngLa^ZQgSP|q3W#{5!vR{ zf4sgv($+(8#lO!n_w+?ct%9Lris4OdKN9m_e;zLm)3K_&K0HqC%wL=AZzkNcYvi#- zM#sb+&EGpc?&|3fFARBZ6y(OJb7~hPD}?E6zTsikJU+a1eO&Z`ZvvEILD59UbF3K4 zamz@ozgPLp@U{GClvRn9UC%l0_>AKd2W>3QzMmT8&ts2h6VXD_wWPPP?iIQuz8twP z;lUEmH47)JQsiI%Bv<}khvz{nZ*sq=wpeAA{A}vEm7}DT>iANU%iq#PZs6OmxhXX_ zW;bV6221o2x?>8NgS&5BNe`nd=`fHkmM&vA7Axj+)Ryp33{%(ya&N17lyG{Otyf^oSsVVRIYvLsxWP9uF(&)ht*g%H61KkKi z=kK=g>E17fE4l^m7503w&x!AD-nwjh`FWp#fMhJNeO*l`j?G-Uh5$L|M0tS{A;DbWI?U5p&FJ0gb;cH^+@F zW5Nu~Nk=}cagJ8HG8^N6@EWYWY?oeKJPt7s@guZ}I%g#&kf7e)UjG{)h)(?=qaj&R zPsR2_;1rk{7_?x@{NMo(C#;{5jh6~5R~SQgR$ROtk9@Wl=~p4j28e4nasnS^XFqWR zN*~1&pPtJ3^_B;%8oA+q@?=4AFFF zw*;>Cn>Tq+uWPt+2)J{QYTBP;UW;z?Cb$aU&W6SPQvKVHy#w zGZcWa0why%a#>rOS8JhzwdTGvXC8u@kntVqUhcJ+B`L(hGIQ1Gl#teUZEZ*25(WnX zUgh=i`2%cZBoo!x=FQU%^8Ko(_9oOgO?4grp04dU{A!*Ihw}Ia_;{*pP4T@-k6T>B5kKl~*X) z%-mdU?_R^lw?{8Etn+;dd?fDr^`NBw%XRcBuuolePaX|$L~Rb}=Y?DT4)YCVdAj2vD1egxb`XXpUB(v7v!29{%`nB(@3i5BVh<>dH;d0}vIhp1fM9&Fo zW@aYdB`qDD+pioT{Dl1V8unX)E_*2x*HiAb3a4JRwt8yZ1V|^gl2R_o72z5@-Tp_U zhD7a0Q{18PkY3H<){PqwXvwFM^Xn@Lw>A~zMRnA-ASz==!>xqG_|Vq7cUCPYLCTx$ z3*^Y3$`+*Bl<+|C^`&)`ZaEmot$`It-da5W1{*9R52AlzlY;+D+|-Oy$ai{pV&{Jg1Vjl`(?zZ@H;c4dt#0 z@rBu%4__g^2;3lG+rmYZyK7O7VqU(!05zK#Gi`ZPrv3lni)SUF=BW$lSwNosGchyb zKNgZC&gC-bJG{wF$qUv#v0?YzGZ2%f4E^~%njxTgk8&lMagFRMETy!?nVpjqb%>Pk zYl5nCtM2xC-o4xT@Bej99UP>nBfK*w`jqW>GDC-U%A3??m_H0CVwgXrW>8%nJYT!L zQoBTlO8oE1Uy*n!k!?(zH&IXLswXq%eGE7&$s~pa$kEx{w0v6iA5{^W(>j9KZOi9`1F?^_O zdEmllldxe53#Y*vzU3uyDZt2P?_&)-)m>LKyZCW)b6c31l~+_$?`{Ey3WKXEFO~%< zIk|_dii{S+-@k*zLJW1EDQy#UM#gjCTtQk6ozs=crmbyLxhmd)``e^>Xgl z+SvZS%pG%Qxn|pvwL4|+$s{{j-MnNO<&_2~>g(6VBo@5qGSmK_AtZsuB>e>VAKVm7 zN}jJj_67DN$8oSk>2>L7+8H4gq`g9l%SNW=}O?S(QILj~Iw z!n%aj>q(0pqD-9IwkwkfbTSO_r|YL1;DY2Pj?gf4zd0lqupE%SEN<)<9YoQ3UYCTou0Vd@~Ta+0H%|DU}B5Uhlh<1U93pDwZ3w4zH4J< zk-tcBt0&VZV|RJALm6XzZF?j;7kTN+)RnSrQHeG#mWTeUg$fuj_Z_!IUUO`zV#P6M$?{yzEyY`E) z`-zJJV=(gWAAg-z79srn(iWqiwSJ2zWPJrc-zAHAic&>&=K;1?alyd`yU&jC`)%Tp zt{Se1elKN7#}e;$@(-Vq<(|vS7svY)_jZ&>5iv39Gt(1v4ojZ=KK?4pbR*rW2cD0* zxI^Tms9Y_vsUmYzvkWK2z|e5{;xlK?uunqL_AJSM4p>y11s1hV`5Za2L3r1I$WyQJ z0fF;>Eyx?i#YNlg(X7<>eEOsZM;ojz4via-Gy}x*$yK+!mmM9xP~4zKGxCKfqUcz9 zZ3IUL8|ff3JL_k8A5TBu6%`W@79Hy>S3GyFcvMEo+e?>>I9|ADrssk_;~s|6O(y$vWBj znVEfn8zU~$_d84w^~9}H`j%?%qs{DS6@?w#EBgAZe>T?EN5{s7xVNsusFb!p_N)HM z$*(JiKK%Y+^0xiq`FF+&9M7IVCjr>o6R>*Yu|WqOv>uG zb+W!ezR?ox1VxhL@!UTECyY#Tr+(T*hK9-=yrFRVi@BM7)I85muGy9;fIHNUapR+uza+A?-Gj8qb|Sl_}I_aQvW>>dUDA& z@;widMW56e<$>m`)lq(TLjtG1PEP-{S@UFtlET&TZMF=5{BMY^i5M`7d-mkdYpr~r z^ORL5E!DL(b%nf^VvVL%VjU|$FBcuC2ul~=Xquonn5Kt|rLChfOr%lGYh$Z(#t-_LzjB4&PwQk-C7Dz7e6cR`;9Q+ve6U33 zLlWuyR;?iZ7PymRU2`ku{LaPI@*87$;Jk2Kie9q$;cmr{$r)j!+$R;)w}xbVd(v>S_+~Lc^jk1z7-5S zc6MpX=b2Wmx--|>H;dOd#|*gx6&C({A^9ZmLHxd=U+F<(D~*G+wg@r1Os1GXv=CXdEIEx166aita%2 zTZ;0HcP6AHEjRt_*c03(FF)f`@bT_plHYGA=$vp4iU zEd2KuSI)KjS$j>LV&BoL)ad+!qGxn_G5!)_QHlNQ`#wUvt9~4;Jg~-&KWe9oHQnr~ zWC_<93y8md?>=hmx;$U5QB>|@`2*YP&GJ)CM*MRRHx8Km5xe8>yk1rHBsL5`cU&JA zcEF{zebvPQnZEpw2Sk4_)y31)t5jIr;}@8eYGa-7(qp4d$x`83eZ9poU+3WIv0|#V z!`s6}VJkCQ4SWi}TszWZ!lT#b%W9-u8ciT*1T1}y8vO3o@ckKVnl9gPSja2waEL3T zOXJgdzzgB{hrAT7m<^oNsQ7Zc>KTW}VkyffA@kV!$yvy46NI1P1uqu;}+==|OAcB+tpiKKykwaZ6E##@y> z_M`Sp4nht)+lsQn{icX6ZCleG$9qQ``d(82lH7-M4C=2QSD>~tF8zEksL`sO#2PB7Kj{UH<=SVp$-HlUW_+o=+W&; z&>^_nS9;HztZP$Ih9PcZljUO~#5_iN;cW+vaM--8x0~{roupU5Eo=aXb>DRgC1UOGYb~d3%uFGWk8hW zz!I6n03z-xG$sQ-Y;J0jcH#u5M&xXDpLaf|{8YRW2&5j5G6JlvJv}L(Zo~8YVJ8W= znDRnIn*1k(NLKY{hFvy8^P)7e*bW@{?Yt>o-d$^CH`;-M{CwNcr0#Xv3T6&tW)-x{ zUPLKJnF|Nus~QL+QTeprhVEx2@V_@!@~)j1rjC4QZ_m!jL4Mdy05j0!R3?S2C0xra zM9d;Qy2Gnd01lww;NCLL^;V&ZxKg6c&b{4)(~FfjFh1U0_2vx{VX*slQvBcndQj&2 zFhYt=bUOO}{2T}`uuKy(ZLL5r*gsSK{CU^YbBnVdLnI6rYyJq3C-aU~+}y|q)d04M zd^unFs_1KyG2VUAjnZvwB(i(ZB8UHp(qLsg^~yf)Z5-L_Xs1W#P%~R z%34}lkX~B!30aC20LWJ({_;|whl0ym;3l^MRpsA{C zqy@t(2g(%PmGgPRX{NKKXS(HH0-GRfW5_45EU*XW4>d}A=tEm^`= za-=rlwcq-mxTO!5A)R2Secig_R?w^9rR;d%YJ>geyS?4ri=@e{@n7ED)F!{5)wE=> z?<|D9Ku$pc$vQhdhR>!~Cu!IDUz>rDMm4{+wH5Obx9-~w0s=6pGNX%g>6_+RC_aM? z)vcRY+pm7y-TG{#ZJFmKV_KJ=wEa>p`YcC#dnm^zp+Z$<-?%Xgc|^fwQGEK`3mhwV*Km&7~YVM zoMTxM_p-0*h=oPmItq5Qc5s52=Nw@0o5KeW9^B+%4{z+97=(IQb26owv;6Rb4}i(b zy9+N|l(;^p5#c_)v+uf~+(mzd;3VzgLl3u)@vS%6LL0}e%oNePjt&k)@AriO2%w~V zbqnn@s*fWV^~pu^5n ziOFq3V)E$w^RQH?Odv}GI~f-jhe3sW72wW~3k%78O&N$JN?})hr9*4(HswcZH@Tqe zj|O7C(`S6B9#1u%n}6cQqElUsRy`f~MFVNYwmuzIY_l|7cbgB2uP3|o|`KP014)u?*WO1Pk z1MfsnSr>200?-e2!!lP66$VKICl7z3nS2QZZ=2d)XI?WOUx9aEmB*$IuxX-eNb&RMdUY?(b-d4ivfnF{)* z&%5`Z?QMS^R@r|x7haOP2v@_Z;1Wp%rh;_9FJK;a!QdKBRtFAfryO>2dMS_zhv-M236i?{k}V0_v1}YBjxhA`iITXuIJOz4 zsy*Zswlu3C*m(@dOnwqdjO=)nMMzXWcI==OMdPF2%r1VC5mH>a>YD2eUH`^DZC0<} zjE9=ELA?cJA9Qm^Ah~4qgAN#VjkR-XGqQo-l$CX2(IjTU{m^fNq;gU`ep6N-TFtKd z3ftqyEu|>-d0>g!OMQ5#o-Yl*L#K8@vZe&Sw|zmTCMF#7_YrL!#MN-^)YR0VC78l` z4Wp7V%? zYyE0un9##NV4|CtoM+|zJ)qF@_(vdB;&)P0^$4q9@bet?lzvPX*apC883O~YLn8_y zF-cT`I1oMR(v)op$anL&Pi_D7P)b_9yNPv4z_h5 z1|Ds4VhGNK5rO=zJUsmF@elGNauO1kaR4=Jn@qGLv=R?jmL4A$ClBC%oc!S2Ib|#iPU~|L z1{JVfN}4bYY80%$&-b*gg>Z`Dnj-sOzYSYM?MX|Qgk!5znlLviu_CZAX=;=Lm=7t9g74X-o zv{fQHRW8NQ=z_~FFBjUpc^KQW3{On(Z$5OE%bi=mO_N00h2kgcS9hc?WS%z|2x_@| zo6?r##rlSZDThC=G%8uY9M6fySgik7S`m-7$UZ&;TLeHSiso5@AjXJS@y>WuMldgS`eb*~VK+ejSaCkqii5 zU%&TCQ)A=F6DJ;c|JvHt*VVO(gF`(4)(ezHK?LOF1M5>-Qb;~aYXw^Ds;WzWCa%Tv zYMIjn7f6zcijKx!g%T11SuJ}op&oXDXVhp2QR%U{SGCbffhNGNV6l)@n{QaR|Jr6{ z?Ck?%23d72h3-)zcg-zXI3$l<^EsZV0WAjNl?zicGI}u!Rj5Y@IL<2Wg^$9Z19gi~ zz3@8)+T?I8X@Zdix1jZd%H2tV0BWz)y!mzsg+M!MuxeWndn7HhnN?a zdA<$|9MsdpRV_Y!`ZP1ip9EJDe7Q-5g;6!#%cI{*$Sb--QE(|g>KE9kMtg1Rpc>F+ zuw#^<3Bn3tFQ1u}RnfX^oSF899-;oBZFYzv&hm+`&q%jsa4VLq`uh6v1zO68se1iS zLvwcHKMhS9(a`L)W_wxP(X>li*-Gq%^(mNfU#R(I9<^tUjORf2lA(wdWnEN4f({qv zyf1ZXwlGINLB+>UYS@H*7jH4lbu#YIr>kYKtzeCYMYbOii5kpkY*M%w(@0FIBZO4{ zVECWF`l;;=o^$WTsBcn;b#6?IiJRM2I~`(`#fCL#WFTo!!Uk1uKfxmlid3bqso<#Y znL6Q9&%#3upJKfg_^qYMep_9KsES7pES|@(&3y;K~WL!_tHxZ5LW1EFxL=@9)CVK*M# zpfDMC^QOd+zJH^cQJtC> zwHP!;{@FV45_^-pktN&yhtD^B43h~Y_Dp0fs!Y7{O>J$z0b!s+#@xlb{TP?mJKatB z-`XD0mO@Dted;FkncNRitHlG~vSOE2M~5aC^i4=XP?M2$Fny$>PK zu$!O4#spYyhu+aYI+W}Kw+Kvqq8_`#-OOuTt7Yx(Vao8Qg0x+?gF3v!xm9)D(aK-W zwxjdocGn(G;R8{J^|EcPunP!6XkR*y{Ud7^eQUVcPS^1gq&(OiAtOUf`wiW#&8a$K z*{fJF5AO@LT^@PJfQ^+^xrAjw)lw|9c%AmdPH`+lJYsIS(#ex25zKo^|7w_I%tYOH zw=f5dg811MuX{eN7|~W zytAuDo!5n2Ph$gvGGCY9$vXbdkm~pOn6th=T>GgxtE{XH-j!-Aak-fz~W(b+4-+seuJTuhE1&Oy(F z=3o(pJ0$ngpXJ*Yr?{_WzJK2aIkljyhjc2m9u2bZ#}>EAQi$oyAB+g)vvrnw*t1F%%FlDfqQJ z`B&=snzw;%ZRad^bJA*2_%6_>+!M++_iF)8J$rg_U|VTQ(X)60fKZ`Df$(JRNJI&O zO5?xXT!?>yS>bMh6zHEH`dgR+J_dmDqO43%Qc?%xqn8L` z>5-Ob04Vs`v(L!A%Qg^V)8|C;G~A6F6i_or{QUV7B^|clG4MgX(G2T0Hy0NX1kIL* z>gxnE+>>CUUqA#5r_3g8KE(puCUttphjuSHj(Z)k{ctaPM=? zCen{6&)WZ%oa-^eWQWowxeOA(4Y~=hPCspL-zg>*w4{6DqaWu^Z^^Lsf}>&Audi9L zP9*~}$Va)NRG0~7XOZP~uvLn3{CODH-hQxVkLdd9zub4e>&X?N5h8H%*62uDJ~or0 zAl2k`kF>3lgv5RpQiJDLRk;;O{zTm0oftYUlUmZ|s3YgRukCQ*JNgyNVxgFV!i^dX zNR%MEwB_FqMNHf)XTGJvsehR*pU}BnZ;(pP*tvJ%-0UR7N1~I!NCEc%_jjr1Sg>P6 zWTe;t@Lj@sCwb6geb13ve6hW~9k}{3NgmRa7YW-U!)mumHMX!L>~AFvcQSoZ_t1S; zYQz!cS4+iD_cqw+-&8~jerpc`_rIQ+fwQk$mD7Pp5<2oac@MS?6jg}&{MW6ifQV5J z@*(Ji4dqaUmklA6*!IP7-^sEM8wCl<;qD~b(q+lo7<68O@ZZsSiQHeFJ6{&8p@@d* z8yHx>C(5O%ufO$3Bxh^ud_?H;`UM&2E?RkC;SpShlx0Ry9{SUJ0i1XqXX#8nCPx>B0}ZEC8L4egB^H>Kp1c)Q<;C5@)>MAxW2jR42wY z1`e-?;i)f0el2Rejl@RLFOP?QUupG<`?4i+OGTrZn3$qm+2_`z+}p~g_=s5NjqBGz z(PE2<2xB$@B)X#cg=ZXXzL-c#4N<_^;5=%4QLkg0&h(@tWtj`N;2$rxnHP%21qQyD zMtrzXc%e1=72?+Kq5aq{{pxs zT6M#-Fwz9XH_4UV*REXAft~XG$u(2Y{noqw`re=SWW&swCw4y<%yp8$d9Eh3Xy%tb zetd95W)=HebB;YTU%IJDu!EwdJ>zH)If zyC@`%E6?<_K=dTM@`8f5+*phv&ErC-zJ@11Onf(*ZPBr46XYCCvp{sQv(235@ig7C z>^#w9A11wIqkF9~U9P*0*eh*Pn_sTy6sWT+NDdQe)8g~e8rG&-jQ0dEwzX{vAcb$w1l}2ZzjA zQ0%|Bf?Gb})h2S(&q?tk@$K1Vw1a`P>9u@=t5J6D`evd?C~*5{<&@!=GnhDa`Wm%; zzBH*ZZt^_lGefcGPwj!7} z5RC2-68seh(5%_pQw6AhR?RJzOGN)6+^x1{S&}6Hn)lR1^T4gSv?Mk;GF(SZUf{=% zANOWUjPOl>4lhr?!M;UlPwzdEGnS%oU>^(H>Igs>N0dgVgLIVSm-iZ_uF6kOUp9Bu z)dnUeZ!y1$+Sc(u4!i+&*$E*YsPWM|{yB_ux#>%0YskSIfr)L{r`-=t~?V^LD)|ci_a39(v6OipY4Y({m~f; zwwXBpKNMK@@`B1sLBTc&sc_R&z8{2c10`~hM$mQB1(nOQJR+eMMw@^l=|~Ue8Grvp z#~TqH0cVEnS1IK1?C~x5??PWSW;!}LQEp1Wu4;bAIZ75~W(oqg zu%q0-VD;61ORcv1f@J;e@Bb>bLgKBvf@B$qI!ho?do2mv4~~7P2igM!x?PP%FI_v5 zfQkum9hk)BWMvPQdS7?OB)^=IF{KQ9b-+2G`u%378+MtKc0(ytCka#)ndn#%VX0Vi zRD>3$6T1mW?g33rG3>~5%xbPI>%c|<7nZMr5rVA%S$0EQaI+02t*FR92{U;W$|5-XHK!NCk&!MARGM5uWN%YP&x+zY)k5A7_lbE#bK zruS0Yz4JI(p9g#4zLLMptMIm>BA_58FOQ#{9Y~d0uf}}!Hf4GPLWJ;&;|8+|W z#EOr9@a(Ew!O;Kzg0#*(4ceXis5ld>OE9o|=V5U~3QqcWq&!HDrR(tVt~#T zatSNtkcLBfmAroCZW%~0qnz)q?fgGb*xFWqQP>;P6zSgJohdu%>U!@}(g)x^7Hrxu z+h`T6`!YkoJmWtrdo?nAPMz9LpnC`&^NI=Ia)T)MDkEo17YW-+TN&LR4Pn_>n>2s& zE0W>J(9+i42sy)a!$*v2Bm{n`MTq;x%g&DA#;#3s6=D7l1mB(9?uVVt9J5U<*o%8DE%PO39F6@@o zTYqcy^7`1BUn<-yA!_*fI3p_s&NH(=*iwhCUYIQ?eb-g>x^vK&wh|GAzGvh`M*r@aXpMWT!p#^nT1Cm0Fg1-@B#p73Jr5_6bX9B!}c13o`I>3!el+t5xt$PV%J#lI)Hu|mnXABLdghWVa$%sxCYJKUW9Xvq-rWpPm!rH+Ey2(WDiX|>(3Bax#!kfIa@?w_r#>K};?kz@`)E_6#`3>z zEw41p4nYD&9CNTT>Eb{0S{F6b6qbWc0v`Gz&$hD%^#7?~d!HnvslGTrJTh|quSUt5 zETPkzHf~Hgc9D&>FRtgrSSAY90Ur+kK=td9g)NpE7A%cF{B4oe)V#Jm+|F$Q$P>%oC44HmQhj4^+ClQSs`<`R~07_fHN(3dG&deqv3UmUp_}Za|cO2_Wi$D zd+&Iv`~QFZx|$jak<}C-D=VY2_sAwYg+eMiXc#4Al|2gCWQUYUqEuFyS(OqxLK>9q zcYht~x~}i{^ZVX@zu)cm*ZX>Rj&ok;HJ;DMhVoYz$IcDSxLk@T=P@`~DPedf34MaaM9bfGD!LG81jsy?aj4J1L);U1CSCz}A7esk-90soxTrBA`>{Y|c; z!v062u*AkEt@{^ezC`#_-bbP1DIE77()=Hqo#yx=%|4vGrn!B?g)!d}KUDX!a0|am z`gM5G??Ch=zUh!n9Ns9y*w#Rv#!d`xCbEH|qoUB&!KmcdPBaDRX40C-lJ1jd+}#iS zJp#f{K_E=U=U=aNS9*Ej42!z3%MbEOB6!eA%g|M{r_MDBV)V;f< z%HU%}_)*I~x$}BkVg1ko67^=w&vfHcB4tFx8#(38Fei0+j;Kb{KZye40oJ^5Q+ci%k~E2RENQ5~*LZj9ut$#+V=xEF++Y zE}lQ{F+G&|{pyTr#BPkfz8r%nb-)lJ$ z;_`t79^h}#fO0yZxlQeq^qf7n2mdt#KE;f+`&UlEBOyUS%)}M%F}k-Ak|iPq*D>83 zlg8_%Hw*4}mW)nF7=@ZVFK@0{c{`t3=^YE`y!?+SxA3a7u6<-Qkur?AIRul74V!E> z-4`T)>^$P?c4~|MWqwY4t$nz3*~;O$xw!y~M30}$D>XekM_=dlpxgwCq|(;b+)Nvw zaP&hgVIaQ_kponJ^cF!uK^(hElenjQ2svAuCkA(*oHaWJk!76_Jh&#hx^jYV;ZpVf z4wi~g!j=e%h{TJX#%{%;covK71&T>ci-$K6XqX4BbiedI_J$`S%4 z6m-In*e&%)21({18HLf?_h4G|UO7+~$K z90^RW+sDt3g_X5q_zK+PA1}uq^LG90GJ@Z+ez~*7-bmLS;agRUd5>|47xX_of(MB2 zYW{YwStmG%@A9HCo5hpHf5Ov4%IWj6+v)5V@7nRqJK) z4&gCOlsLQFaQm`j^6l@Ri*zO!Oq&j!`QhN`_56vpy6Vppt%j237^Ja{o_>5^McYhy zJ~~(IRsLcnEkJV_^X!Fj;P$UIqxU;GB@aZz1RE?VqSHs7l<8VJz>p$cEF0r zrqK+_M+{rD<@AVK0sRZE*m+zh-rdCGg1M$_VMI(Dc4B~-F_-zl38Pn1laEQug6C1! zlF+mtIfxO1{Nq72N4vusiq?4$!z#xwhww8?v2$>MTJI;4iUykY*2%=gU#DgfIRS5f zWOhq9bjwKxew97lpkRV$r(-{mv1O@!DM5$EQQuhJv>bNvTUb^SX&ti95d+Spl6l0% zCmk=)Ds;f>2#y*Q*U3|-q^w_re*Joee*_alKp|_(WNL8i+h-`WSzcZasbW}IGx8PvkB>;KEIh1X^%f(I6cuX#>RMVRw(Mpmhksb!zKNJ){9$B- z@R4?P#T~d#yIchNze3DbMhSd>B1QeH%nDra2k(+YHgzD z*OS-6l;-(sI@(@Nk5EP|@?HRi2rlFweF(9UE$Y5Np(`?u-&%AECmH(jANnUqBxzqB ztPg8nx3;yek;#h=^{<{-0ZXNndk{W?+e?F|ax10Xn|Mm_jqZW6^+b&5#%Yf9s zJu1L(h5mD%qR5cQ1Zi25owkn7<;A@f&=k!}9!kXqKoM$xxVLkWg!4}|QGK2Q{9~sj zc6{vT6TmwEDJ;YbD1_Ehy#Oj}8z99TCQ2QJ|62SUnx^)>SSSc_n{(lBd7ix}3-*x* zjde@uBCxIXK?b}PYdD&4j8!}OrTz75%nx#hJ_?edUe6i6iFxF4FV%!F!UpjR2oxZv z-H;#h4KA+tL~Pk?YKYWLNf&!;0O-eICX9Q+TzCj5>&WOR8gR^G^P2py8eI%pMs`ll zUBA5y@Lq#zBFHLtioQJx-Q@7d$eS%M{aqws9}pHU#@6RQV6{{McC!#xPROYs7g`d} z?*YU8;y!rcKSpTPl%Q@OUtb+GM%2h$U|WY7=>Z`jjPk_HxEDeU|7$AAOJuV97ZeDL zS{NECy(ch{sF{i3=NuYsem`NFIM`KKTzqUM&}AC70JSlkExvQXk)dIr;{hdmyVIu=jXCRELK#+4+`^t9!4FEehC3fww z24+Bu#uU*ophiriB!)aeoVN!|7O*{Fam5HniQdUYhqd@Fo)Wul>(;kB zNKU`XVvCB3{ICD!gH}?^%v*8ms5OY4Z!*x)NzTcs&({bX!nSAq6Ex(=aBT$V5ESwE z;wyH&B&5Z@6G>-K+}?(I?cTj;-4uklU*8N*KNK8LTVT8a+nzf?o-IuS$fmVzU}7e# zX=-wi2pbI}BN3&GB-gza#rN-X?jQL)0Fak`KinU=t#ugU%xuPk}8bMMdo1tf2zY@APu-6l1_vBTio1}Rn`3c>`tzJ4ds(QH{__tF{sMto z=FgT8Xqk>4wQjADu$*3#sBj4c$>zs0_uf}Ga1tp{t{Z(J~`C!=IOGM{^ZgA|9X{2pU-1QJ-d^9>VLR7vgL4`?vajQ$(Jn;I% z#*qzsdcL;i`rT3i%INR!uiemLNVI|w2zz%&DliHibxB}v<&9TaQVo04>wK@&T+T^H zkvn6E$zQvcxCjk3J|YsxR3NIY_r4qOog1Lg-<20I>_l?o`-PL$^?=e~3^n#7vu{ zg82QPI}=E$=T}kKkf@3{J#kBUc3mbr#y=<0VWUT7%4iA0IQ%0LYxG|kx+4a9X*;dYe6f(iMWlIaC?OeoIm6`cEoO#rT*m(`0>$z~khW6@Y@*?P} zs^YJ}7B~SBrE^M7N{XD3(J$R9BR{iHjq4pPt={Me7 z*^(jV;igZxxgaEPw6z`l@@4+}fcgeHFjGKGMFjoWW&yK7Vg1YM_7~A5zoz?ZT*4bP>l&3GGU;k zA%5F1=Vig^Nqyz-0eMK}zb|YHVhO4U%>vvZEUece2h$IS7WIUlX946hkcYGP9IQej z?&1zxO?$N^mttRzJ+o+E9*Z^=+VOY6k_>!j-)uum?yk?NNAEt9~GpyIXL=!8e&*t?nB zNIxMnryftm;kdY8<}-VITE=4ncV4^uLXqu}&I<-+=JQBQ*N_xP-(nwnyWYk#&F`&% zqoafvNyc$S3crdrz4^)&D{@CZ(tHi!x>`B`;3rYs$-5$FO_d-(u(_0=h1}sbrZJWD zU%PtNudLXix|W(ceVuK|v$(xM0nS|SQq=wB@?oEhrMeEJjb(#5Z)Psp>B9Rj@(Its zMBES5FZ#P;2Q8tu$d68Xz5LMZuDYEkbRH_c!K~%W0q?N^+)i$;30P^hT6Bwy097&5 zZlwIlX@VrD`MJTU_0s#}R=Rk$+;0ma!f@$TY+KUns+OSQn!SLEX|c!rzkl^>G39UV zwae>Kljq5b;Zj#qwf|kVP1I6!r`X>mp~i&YlL?uLM1e}2M5qpTB<0*X{st47qr=0U zr@jwhCbze@x6;gMW865Z#$*%6k(ibmYKp(cO6Ux~D3*5exZ_TzO zO?-K4dgu_*wiu^4U=R)55X6Lw(_{cuepVKc9)in@e01i6H`3}bNfcB}+INH+TT?qYIBd`X=t#%~fOYw1 zj-#btIk?ZZ@I`Qs0Y?gBjRoK)Oafax8RDe3aMHr1h@PPT8^rQZPh9aeu9Q@!}Hk1GJYX4`XJ4t*!0awQJFJ04=zJZwe1@fe@a3;OuiOmu?@b zef#^kD=__M`eXFS^$SJAl>p&E5AX#lDSWP7~5Rm5t(m{pCn<%4L zj>aG&^3~S3_;?MwKs&C3(7-)=l4p`i%wa-N44o1&rLJsm5b@;hYCG4A(KoBqO3TZO zXR!n{H8{#6F&%mWg+J?>`}WuJp%C=LHp;elFAcexm&gS}j=UlP2Xb(= z9ho8|b#D>Bq+Z7;%NSG!Z4=AJ`|nnnM{a|h8bzkBCCVp?E!T&Iy9`EsD4Kfi+7+Xx zK+OU%{4VzCT|1~@Gc%#bPJdtXl27bP<#w6D=!gCpNUOEWZS8LBnRyKXixD8Xw)*E!Y#ji z*|OVnxE;*AL-=)J^l9>4d<2q}uJStp)_(Kwyk4~XhKpFVamQTS^RBN6;k@41j_&7v z0%s0u`oDh{;oun#G-W4*nOd*l1;3vQU;DdawZodriz&uRIZak`@Xx<~{2**WANw~G zrQDfd8KVeUqlkC<`W9CR|Ic$OQi(W8bdN)8<~4UI`L9SdT?AfMkcf3a33Vv3m}3e0 zEq7k@@GLobDBKj~V+qet7%GF$voSS*>`>u{rMNW05DVcJKvMid_t{>l`7%Rv zm&BH7Zm_rs$r$~R?EvhJ{#^`h*7xs#Btf}{=}sb701*wXhJh{8;(TCTal926#SO5a4nfk-S2 z$A8@5I_lt%lb&vK`m`6Mh|xnBFhNg$7mjKm707qR4;Y%-Ld-(^QNw6?Cdv!7Td(^M z>h0zLKVVr505Em8xcDsY10GdRdj!=)cHVQ0gTezEUtoZ=baZS*>MJq8VJ{T6DT+W@ z=;-K5{Tz`%2~7|@Zn|uTGeA}zk}WYdF~Pb}=gqG=7o{InD%g>0+zOt5kId-tip?iY zot=xWTv=|z!psbLz;?=2#Bboxgl`f^8dw>4ClLOy=PKLs%<8zi4$ypUo5CS(6B>L><~b0yy|DiXpN%ZCrQ{P`&ngsJD`$%Y3b03qYk!B=!i zU!xp(8mw3VJr^|Xs_D*K8^$)-SXl{Lzo1#R{sH^X48I*^D#+;?!1(D0e&5_+t<&Vh zbiPAcT3VW#pv?ewSyLm_^iiY`AnOp-UuK_nv z`!I-lEPKnd+e#da!dNe95KF|`wc&yb5n57!lu{Ky_r91oLq00D9&I*CPoq2&gZ(4| z&>y~!$haxxFOuFNIq*3E6-?$ zr5{zM4Y~W_dEt7q!lS;tYj{NW`&6?kn4j)@j>Ds)jRSizqC_8%G&bUkm^BkAfy_Bz_c2jXVG*C3lCSWB z^-&SS`0U;JCx{g+KqYCm{2nJ^%tr zB9XXsX-{7|asxTVa1hjqh>307uwk(2JIV?8u(XL4Noi!Kp;Nu9%IAW#>=oC}!&;1{ zl$Dve@RG(INBv8CFoX|58n&lXRhoZP_ce@djAl4UY>32$D%U(w_Ic%sd%>-(dz{#l zb|fVwU8?L909Sy!sVM$t3Ui>Hee)pNKCGGTch@WK3%|~`D=j0#S?f;rD8BUR zwOR$yuN`%Cr+Xsy)OOCL2-`K^+`yUp>D|Gb%Sc3}%9I@K&+nu<9pF?Veb83wZBx@3 zfO3sT$TmY`<#f%%G579~1hy+fAz>Wh8*NU9@7cctdvog9*7qHIKn7GgHn)}u}BxSaiUnEEljpURr*rRwlP z3^`@=>xjS!Da*xL{Cn7`8$;|@6-UC4^a#|Q-s>vkXzkg+?fK~aD#~%oFs7gYb{U(L zaDDQ%@%|0|j~iUJUA+6LpOy9Jo!dFx>(-FHk1gtaFRXr(vX>`+=IQe6UAh^0rHQd7 zssDP}{_v@iZDm?cRMHLEL%#H^ti+`GgaqoPuW4G@Uhr-?{Tx|ORes)T!`?tCF z*@%%GyT6DXm)II*H8o@yw*aXjRedD#Qi+XMbSsIdj(09q$2Y*EBYJA%0Az8rMWq6}puSflDY^MN(ZmGP5VdVa6W+`4cR9`zb2> z3`V*}p_>jOA5Xkvpr{ophK`E$>sQ?d#)4YEG;{~0SDW944FBbTG$)?dpb#lA zDXD91{SkNi5i&Lq@lyGD$PE9Sx%08_3gY(1yrF48;Sv%OCAS}xmUbeY`|;z)y}e$r zHXvIFOQ@!b$~hx)wu|zaolA?b{ZX>Blap~7$&Szd7WNP1k)ozm=)2?Qn{VQ_f;e9M z$V>TUF^eUD`WRBWQ3LRfe))1p)1=56wxR1;S#}y4>+1zT=Lw;bgt#9S;FdC6fd7;p zb)X|Ok&~1q1EoLi9`38!A}AT^(B3dI%3(F$FD|Z~0rC+$GxsM1C}KmBo}WxjyA<55 zl-JVUj$HA541+8hj)$=a+`9D+CkIyZ+m^`w9Ba*d1=2OmEii=tn^IjT?eAsYXgS;{ z#GaoH>tGusBQN7vnV3#O-hk&Em=qW&jA7*%*e@x0ecM4vPEJl~>BKwFlW}JuxC{=Z zlcs@zlF7LFzuN3>*xD!b5i4pCruMZl~tLNsj7NFL3#Avsu z7H;g=qPo%l`TofeFGA$Yr=h0CR^S0aof8T9FfZ!r>}8_LTu1j@&-d|JA^93m>)>{x z%m2Q{1c)Cpq0rJ?1VuAoR&gOptw>Ap>7EZPGGW_C36Kj40QYYz6>WJv`d`pWl|9{G z^D3rI#aMFL?*hSIoP;9sM!He%;hp}Va@d?-uh_Fz0B68BtyMJtT`nEL{+v2s*l69@Z56k+2e`XxFg1Ga1awS zoqr5!s%bBWo<;S!ZVyIf3L)O==U{R$nQnxB;c%5wUCW<)yJH~>Fw5Yt)rpLoJCu9q zHf@@im_XhG3^LFh)GNnCL=dbL_4@T(+xnIzENLSwQ98o9-<5Z(1Ayez)F-FLb^gwNiUhE(t|@f0W=}v;W^GH^;IQ07 zjeL}L+lN3dpqoOdRyRA>Ugxhm^eu$pWE$^QA`}nX{|Zt?^W4)m;g8XZ4wCcFOyO$zi*!_phjp$EF|UGO;*{4@P|Y*8maN13)%xC^uT zXT0O4Z1vStqDmo8s&iFrdMvxUbm#vrp&j!vO}lgFj^At{pCrNX6T45q`S=3q9}9M~ zoMGJ?R_ptX8Qn>VcdO^S9bln?=?`nDsU7dcOe`V=DFPLpgL(&l4?ybZQQ4x20IOgXQ8W&mb6!IR#@!4#@ddW*c;%Ocf z%Tt(pF=C)WLC`)knup(Vxoi=dgfl(lZJhUQcf-+?ErIvRbSa@ckhJY4Hk2ekdC**m zV(U#e0+aiH2Ct3C{uf>|^vbc5`C3e)fp9+;LNmzgw+Jb%ta>E}EQqk5+6v-TYy$sZ zUY+G#`dbJH{)dlVdU@}53~cI8ddAmql-T%i$E-;jrfoZn3WO-@2O**mym$OG8FSZUW-T%*v|%*M8Ix%{g$b6f+UHB<_?Pom4{6_HPIched48 zNjVZp1PBGTK=ZyQH@W-Ypjd1TQ5xZ>QilPL;6|OB{qYKY`AoZ!WwYBte0;o8P(Ji6 zUg#XC^%fxC!?Vb`-W&=uPEyz$%#ReX>+#Z8ssCjTJ@j_>ua|G#x)l=g>VB^$s`@T0 z0KmyAt}#A>r32Ef=JidYR@FY>c>e4KER1DHzk8dm&iFl?&8f5JoE5B&fDUbu*Zv4X zrKQuAbAg0znVXC2u5C#B{>ZF%SH0 zau0}O?oagsl_xv$w=xI|3I_Q5CvB-(J_S=bGmd(u5V1mQe_`^wLJs9tp{R=kWVG4lLi1GDP4tI^S$FaN}X zi;L8s@b>N7fEC2777Wqkk@x(GMH~1WL;;xYn;s8zi&%dpRc^(6=T`nI^Jvw^Z5nCG z+8A|#9EOX$#einF>_f!PF*NxlYFb($&YlZ%Zbt(EY+#M%GvUudq{5^fvF^o^<@jb_ zdCl)44tm$RGQg3D|GZ#n*$a~lzyg1>ox~k7k<5~`ZtQRQvCk6@Vez2ibO%uovnLbA zU0x4B@OzlIZSy2tyiXONr-F>_>pCy2{eXUGE3FQXUQR$mjNV zc#lo)n&}?&CLfJbIsc_*?9mZ7>)YI2R(#%>xpTJeaX3RM>pSARc2f; zj>M=RG<){V&Z-lTlNy9aMzTAzRef3Kx|-~L^FWy=;*|(LGr%2@3TY(DoS!Hday|A* zmYQSeb%qugM-c=9iHY5(T)7v8h(~O=DVk$KO3%n>`G6BUy9^%O9jn2r$*MsGYd`}j z<=W4{H9*z_0{lcw4ls#E@qS}R8KBl0&sx*gX!R^*8uMJbwRzS<#IJv7rDASz_e5BE z`F``A5D-4cbCr9#eNvSACwufGQ^nVnhCiMBeOT05@-!2}O*t*MFfnyLrrzZKB=k)o zO6-LhuZ56$e6Lc2}JixraV~UbS+i4#$XrFU(R1 zv4Boxa~RdO7mN(MD|@k8NKT+eHr}my4ZEn`04b0Vbh?uejdNKvs`@6GOt!Z?!+7$q zC}vUn$a4q7o1&neEVq_NFqVghhbyP{of+@9*v<0?ukcSl0_E}Dbk3pV+56rkzi<-Z z*hKg5Ymyy+sZqb#JG4#~5}#2Z2krAIm_)drO~C!Qt!+_M#P^)10}%zE3U0G|?yx*> zKv$b~&Oe1MtO4>5tVBBdv*uam<~7p(Uau~i_X*D!n9l9f(BcxT{|MEujSr}iwAJ;z>6+WfCFf}R2lNt6ea zK97*F6aVMmj1YD#Re8p?*gqSVddfc?vg|c25q=R#5hZ}-zju;3BT8FLP{aKkZt~Yu zMc5YKgWvSed$5mz*gbv6<;9LJ#a(hA*YtlYcbm-LRm~O`*{bI{TtbO;ew0nMl1#lXuxnggSv55i!y}I>! zJkLIgT>s~gtaoP4x`!jmHOqJ2l_s-&FS z#^-qWlob>dl$AGCaQ#eqypHmVWQ;_~;86$84nUG0<&zJo5*B}F=mPaJG}cg2(PZrr z7e~=OiIO{a55^~;TSafLGYwGt4L4*bi9bTvOZFf)?Z5#uD0AgIzzY!gV#GE{5*68g z-+ybE#S@_Z|B~2q>U$7ahww&MoK-Mv{QekzlGw`FPsACVm_V9cSoW&*Om{GZDL)%> z7TsyYB4mmr``0H59`g%!L=6GW;q=s}M6?xHKCb4Yx8GDoZb4m~_LyhauH}?d;o?U` z*TvqrfszH4#N5{>8=VXP{vvjksI_JfYc95T@G~p)ELLfow$D=_SF{p^V-CO_iI;8 z`^ZET9)>1!Kt5X2TodTzH3gT1_*TVcP9vh8uTo8d}&D zsGXjKlGJ}gh`&EEaCGS_J78?!`taq;%kRHNy5!60eO2lhA9Nw>O=SokZ@o(`Dy1C$ z{AxsW!!qTyl~0>FRCC?>-6qA>W3K_evmXu(sWOFAOxV#1zHZksSz9(g`EjFUd_@%@ zUneSgQmqdbZ>=?mT8gg3ABpXE%E#=C29mJ7=gT>7!7jWt5;$oA}3oj8nJ1D`I#Oc+6C1d znrzjnH-(UW!l8ngthBrL@4J2c5Y0{sLk68gU_QKR-3<*RH9?H-B*abOXBPvZLfam` z)f~>dc8CZigk{Gb`Jc#5K_X&v z2P(c%YIV{LX)n(+XU=#8cccER4GuPd4E5K<1i_S1E`og$>Uiih0RvkJ0388!qf=w5 z0ptu-Iw}{JqoyexVDE>IwL#7$phmXYHW})$ywQk=IdogM(*J^f8A?Y8=j9IT<5r5`~;} z8Jb!VjAaup8gbBCbM?yHh!QNFtd!o3$e7u~M4VtGR>zkcX6r(>NQB?Kxk%VhuPI5H+qVX%;udBIcV|trN5U`9XK7p|7Pz=TXKqnIK;gC zA7R02jWW~MCm3I*P8~tkT|GUCSUPRO^_ZkRAL3zytQCUktNc~7Xac~X z7kfEW|AsFkI^NH-vNzix5J5ef7rU>Zs3-y&X_aGwg6grm9G*rGi1Cd{XMr{I?A&?T z1~3oe#{-P2l^LTxyp9#%=fAbzEgt|UgomOQYQ4Ry%x!Eut*j1}oNX-H!gF}Azjo;U zDZUeH$ZTJ+=3~)sjnXJ&{8do62pRM>fpm#NW}TtoK8&3Lr(dL@to$5s=O-k*efqTN zvN%b#?$@thoEI8z2wz=L?1XW9*K?$(PQ$O%T=V$x5vUfh(Cv&rVQ>Ekktp);@LuZ3 z&}9A6dx6&I->@Wq1>Ir~gIq{{{(R(#fp&~+`E_3w)41wIM0;Mp6s>p8J;E$@|Iy4( zk50O#k{mTcS%TuFsJM9XfLl&8eL*Y{+8{b`iwG6%A5c8CUajtUN~yAuQA{<<7v?B> zk_U#{n(b9^31>Y@#$U6o(0z&g0prWao@?dzX#O`-8L1nvqwFw;?yZYX9;?e(gv;!& zVWI{w98t0Vz=~=T2nOsYKR9l*B?T%FU~ORlw6NIWu}@D8S`g0$E-Nc5yWSknD0qC% zKwh)bP>-9Tp)#B$OBChiRnhvCZ-YNC``(zSoRQs-kh*%p*rVds4kPnBkBdsrt+^U~ z{FM}|Sbn*$Vy4xT^*_E#*$lXiI)CXdkq_C%f=sK{FW0xGqN|M;$uhFd;Jlii=*i+> zou+g{z~Z3HX`^o^7q1zYt4RcF&QuJzf3kPWf@ilk1tv6!us*u3Nw5)Tw;F zL(6_|cz`_`yfqxyemeR|>i-sMdYr0ZhAt zNR<(yfT05ghYRIs%%LCBzmdgIn^T2(sTrTpMQVoT=o zRpc*k_gm=tLTh?%epa~Zul(*-CtpPtfzG{O%=-BLUR)4!_?x33!TGYEhbQO`GKQWd zpFnIc=El)05@i%-$zAZga6z)lZ|;Bu2C?pW=rOY|o%2wIolDN+wyM5E9)_n8*Fvx&p-QKh-*8S0k>?s)TS)>CP z20##Wjw8IuKwDd;oE~$+PcX5t&}nl_RJg+IboQoLfpp9da+p@{qwaE7iHOz5$&zP| zRDb=T^rlcp=d^2p%-y;9@^Tf&2+m5YHGkXHMZV+x6eQr6Z~WtLqruF?XD{QsFl&B@ zLCx#r?je$yRoF9iyVxTgzwh#6q>B6tjhFdujo(${Ek+-XeYnqe<&UASu$Fzpj4Ty} z%V8?Ec<9fcmkUM#d*LC`5%vRlV;iL%DIX#0>exlZ%?#>9Usd*U?YMsa zYiOvTg~f8NZ(Yab-97TSFcIsn{Oa_E2C>tHdbxTgWetyIN=nZK&_^F|FU4t`8>{rF zub+G8)w_ewk>6WwREPv{wD6<}D=BNGt#u$t=HF5Im@X20@E4t3 zz+@NUF9svC*<4d+Vy^WVb94J6kKquh&tjz8RiQhl>Fu1h%?>tdVRRg;xVBq!$}be1 zGUbsEJm;w75=u(u!#S>;5aW80te5F}{rX!o^NUnPK6F?-*!HbwwNi^^WzysYT4o}JX-7V+1sW+Yeb1)`s6#6=mvr?WU=ruQ4 z7*d+!foCvKy0cM!{-TH1TuG#*-}VHRX=b4Zo>d`SOmxy&X&}}*E> z|N6XA$g}R=>WvQ>==&QR?gBMvD!>0anr~swseQYb`+*bMp9GI-oOGl%H`5qSqVzXob9e96t5rIvAvCMwjF+)fuuA z-uXXAO*^LbHkglg&)x4#^m;kmqB#1#Du8}2_Gb3N_aL5n%QDi}U}g_4S+8Fs%*p`; zmD_d;2*iYa8$76F)UgfA<=z!P#|rc;z8L9|oJLnHu4wCYjD!_Bifjy{qb0Ej7A2k$ zG}$5{Wb95YKcA^%^+#jD z^Y{c!<&ZC%X$9wNf(AUMPZVCj#In5H@q4GY^KCU}%c1?=!(E!2!pp-^S1NO~6!JsI))unXaDnP013moU2lj7hPR54~=s1tugl=-i+@odYK%I?<|r@`RC%v zwHZ7ovq?>mlLb94Bvx0~u$`f^d=k2l6=^W9(B#thl;q*j-WWH^eY-C;2M^)dPqupA zDJkkPgD+#7ukKK$edpHOrSrZzIf(A;CzEsMsY8AEt6bJik?D*-X+MjivoYSG6KzA3 z&jbzd!Pw|+?_Pue)Xq*tC+yFmXW;v=-{YI;`l&=U;{mM|=A_&T52GqpzmZ@(Pqwf2 zao!X35tq1ORwn0JQ4A5Tl%9Nehe;=9gnTq; zQs-z>(#w(U-ZTd~yP5kOn7&IhSPp2>0Jgt{eg5Oe%!6L@Hv$4sEN(KEG7xt(*&YpF zT5NcDpVz!_P|M(8w|UuZr-{9!=6iM#6)7nPlGWY$Wbr#6xCU-gnN|xBHTn0?T=S}P zCLoKu)lk9V`X0#$Kb~YIa@iTH4HCVD$24(wbTtZ|9+UMc?6-ES5?%j5tHx+*(|L(o zw~yIoX!=T+6+Sni*AMI6F8s`=Tyd)Bv@n&q&k8lKaUE$8hg4-;W~nrxO&q1sNt0#1 zX8TumNJJLt9@S)2$#rEW)Xdcoge?dk<8CM`w9+#B6);2Zr*MyXddHCNTuB~trPYgQ zoll>%n;y#vQoh{A?6J0WeeJjGp`As!)?ANRc2*{|=W88K?G+D-SNXYg?b=eBYpQdX z?|E|Uni-p^@j}Y1XN7aljVx7x6%(h7gr3T2Q*a)Gvn1ayQbq4`V)H*9m6Ui!VreuK zJ;`*cB)(nb&Jq@65JT?nxIm7pEjUt>G_gBRy#LuV|5b-CGuDqCUA|OVMC%xh==Uz) zs{F<1?)+-=*E(BAKaY*Bf3x@LlEkK?CwVxL*_6raOMg?yulpA^`Hbo@ExXX(_VRZl zl^h+!AFXFNF5Y-r{jT5gi+w9EwCh`I2ys7ouJx8)Xfo|HNw1g ztL80|+mH5zv(BgWM|V0zG}eB%UO@I2<#LpqAjyg{7=K5GfwgYnUuUojo`KS%DDvdpKSEt35yZX)#lRH zZ$QZZa?>X#tsRRbjBkwya2oBNIk(7tuCl-Lt10_h*|KHJ5Yt(KH0L=Q{fOc0uJM(W zPb$i;dMBT=*&MhvaB@?u*!)!4wJz=PWqLvPH+^72KYM%C#f^C;BxF7`VMILy?d3af z@9r=t9#S8DcgP1+n@I}G$ichz&F~k3cp&sH%5vJ8`8l?&G2ImjRABK+6hu2Oo+wfv zzNQCF+3BTYNOwKWNob1rbVTIIGg~#IkfItqtzSa^J~2T}Mb%kx(QVa=_Wm;aeICgY zD#BrdyBh0IH&Q6Y@h=?ptbXVgP)}aU+tF|oJwI{d)6DX&0FnVnx9U~(qKX()l|CN*REKRar3h0etD{=p+h!Wr`VC2fpq`iA`KnJc}t_Sw?0v%RK!_D15f#6 zqJ^Ib%D-Tey3unp*`AgNhbEvYfP=(pXRktPZ>=K}pB5xzgw#t2t?>?G3!}WWkm?Op zugR7&Vgz$q8tGdfQXI+NpIOZ(#w{;>IDR?b);Aw>9oBCV*ETSisQC5HwAl8Vco`AH zd(Y8S&26;X1(BZ0tL=?Tpn!Ye_%$No}2;RUmN^aj-)KE&KSVG`VbTPS%Mm@5kQk$*Fp2Ls__MbH;R zl81=^D#}C_{$oCh;XZbJYbp==f@B^@4PS)rjD(%o4ryXo;UZdatCTx^TvbZJNmfKW zQYY!$v2k#KW2_)AuL9G6(RIsVx6DVzpay|o3aS^xERLC}>!iY5v|+)fM(smm}) zg5bV2roS||hyHVf89w}He$S4edo<2Envt^X)Ne*WE=Fomg#HhDgWGD+qVliXVF?MM z$knNUf8zWQr;u`%(v~D(r(18`FZi%Euy^vpXO%@^`Xzo1!eHipTbKk>`+*%h-aB^h z%JRc>7jVUbi2sM|2R7^~Z4yS*16EtTYSr%DyVpibIQOeyq}#cVQ+D>Vz>R^&iP=k{p0)B9A6c$VLr_3@!^~AHz>r;NgR;<%8@0iu$aHz5#3pkVIN) z5X;!`@H&z#fq_Atk4VS(bYw2_yJUbXV7>W80OO#P-&@g?@IqB!?>FwFBFv| z5eDOg{YI9SFt@cM_;{=Un7yO5H4&TxxVvx`u&@SLD)&>1vhwV_%XD6I6O8G#g@LK? z*aUsfd<6;782zYT@ zdTL4vv}DL+AVO;p3zEMIdEJj6%h>-Qh6rf!b-rAbnl-DgS)!2Uq#;>dw`20{pRu>|IY3_OYipfeott!P$k0lB z*&;nR9+8~9(?}fHIudb2MFAET-npZ#Mh&Wx1X+Ny^94xZwwvQgKw7?7p>^NW0H~cl zY%jrzfKE8y5Af%Y9&TrQ)lvF~%uJg$rRLd96j?3Z+=4zP_p>R^01BpvH(mQvbRpkOTVl~e~&u5y}Fns^qYmRq&RS&X=pV?u2#k&&HS#SbprrKTq zbsW&mhQ_1`%tLw!^s{e__iLEUqjMvjg+LUr0^n)`A}Gx|u#3Yh^|k zz4`53ot-N7I63gCfc3u39wr5mrMyvz`SRau*@|&w!}x7BhKTC|_Ott0vStu&@S0sT zNoPqg3HQ&+Jv5DAXYTn{e$N~CBhNiqaZzDMOxrw*%by?TeRJ}_;w_D40020}EQSBY z{~;Efb{g|B*C&4w>ooLBn%tkOqp&>_ul!z;aToYLfO=_U?^cQ-#+T=BviFh2QKd^; z7gC5B$km-zl7CSsU87}-YjztAc@NKp_^G+7Prfy=n3C{p11^2iv+MaN)dO4;l_*-a zCuVRex)R?)YyXg(vUj*UJ2dvt^_l+FM8!MjwC?xEjo-toJXUEP^ZWMAFkBtcW1?$s z&bN5*=YX>L%H-U(-}<2#nejxx@nmP2_Y6ZG>m}1tI_!?vC6Y{1*42+;tk$AA$^L>) zN7zbBMOH~=2k|W@q=RV(7zciBXE*nrz+j?9pNFU#>Dw(A4y~UH>2s?E6O^uCQo)kl z?B-u(hYuMye}uw(%g|t%R@I)O5>aB%!IFWlFg0k?y6O$~;v$b{Scu{XyO{oJa-a8| zX;V!i85!l1_h-yo`|S= z;QpWkEGOG%TZj{Pd)+Rd+w0`o7ENaOuBFTQ+uikl-cm&^2t&q042d*n&WBST8y}_Q zdWerUSiZDTnlpb{6jJN1MQZ;5>gwOOP`h=Ls7+lYQqX=MzdZ~20%|KfG6)u>nwXe;Z!Upc5)mtq?0^rrK5)9LsOI%+Lv?k)leg+gZf=?G->M-s zW2JBss|?ER+p{6X`LmAVe&@P!V!o&4=bfz~n9&AmNJTc*di* z|1W%lnt;X>Z2F}x!>>{PNzZ3G&oFoAH(1Y) z4<&j|*MizhdknUanDb1(`>0MM3PaneHwR^0pJ9HgoFb}~l$4{Gg==B4&4x}&aqYS~ zq=8UzW(lx~77sQiN+AMY@ct&xKS7;R;&vOy7Sam z&)b7GYpSI4?EZQF{XY8zR=VH42uo~-sC)Nn>@4^q410e=Wn*g_UYtRrwwcuIbFw|V z9oRH?1#tW!GSZKYQF|L(ZB7?tDHMiX>4%o`hp>ka-NAvCkWFAKVzhMMnU0^OuH1p3 zz@boJ*+p;RVQc2E30ispj6Nzd+F^Dc{c|%=)h!rYZ2ih*g&j6ZkgsqrwUj=1;6w_e zPl4ut9BxKn!r0G6goPnOI68%EL(+9^9fKE%5H3H(a{%ES-0`Fj)hpMnTc=7cDk&MD z;^eQonVu9Rss0Hvz1>mngw2mzZxuC*zOnI|Me30xszi!nIQVjQ{yhvn=vAFt=^al{ zFy!c{DAnY!oSYn}mB4)?u_z;B_eDKR$u(YEc9=`GlrU9c=Ms(bHT!cy72O*6GR^76 z#_dvRcjTjQ25euyO)H1}*hO2ozz{{}i3F}82=OK*Q2nz>u(9#Kydj*~eKw$jS3T2u zMC$kbf^?k!uG~_IrW0vPBiwoy=6}KZiS+7=U&3_r2H*m#DC+bXT#n0M^$M7#(KTiN z>Rg{NiLEaQ~b1MeRp)2$&E`S%{wOYh6L%+F7CEXVFhJh6;d>-*ls=$6ITh*p6(LL5*I zNAfx-FE!n;*XP4?b%@m5ny$6!QbyJM{noe=;UquZ5*;G09a0rIRF|2G8sT{{s#i3^ zjeqjwNd<+c`S&+pYl7=ZpRWuBJjS5hhwiU4n>omqztQq0c$F?nUoF>x26TwWltdC~ zy!`ewCrk2MZTYN!!wYu|&N4I_-+UnAWw#lFogd?h@KKpBDyK4Y5+9W-K1%4!`CI$R zZ4(ms%OxApfBuSrfw+$Nt8tra`4^{O69TuMo&Y7X*zII?^|lg39Kmf`ZP;iaa@=mP zWj5W|OjmcA^g2?>4pK9NR&NKn z?QwPUH~RoVDvsX>2?Km^pxYlC{!3!*xtZ|vqcnrJb(owttY43OoJb3Z7(cYp zGV_G#PdegHUhiutHPYvO{`&Sl6i41S_m!dXM~AVif)2(QG?!?}A?I|!yuA|nm?Ioe z!B=gnZP7HYBNWO6H9xj($$}iE`yNdn96Zq3MtuwR775o^O-NO53CJGJ2)4PDZ+nHG zd)S%KD{F5}s_*KOK;xedj6xJbmS|UOpWpw@&s$9qjHi;kJf`EcbaceXcl^8SLkp=a zvDD!);0F>N-T)?iAF1|P6WO}B&u$Ka65y(zUtQ;(lxA3e6iqm?==}15KEcCCy;U-@ zMD0#iZY3Hti#tdD77gLMy8E4G)usTqV%LlvOWvg2qLYX>lrd^mjEQUy1=_`bdqWeJ z|IL^--+~ye&lsTk=@;6XeW%`>gTep>19&}xqW=!BHHf(cO1GwU>BIk~0njB@D#R9G z^mVOfF~`Ji`oOAmu|ND)ZjC(ujAM2}NF~Vp?L#UG;W`KNR(nSWgdx2S&3ja%v_D`wDjwI8 zp0kEEJ3UJur12ClUj+_2oFsfFBZCQ3I=XkhY{2IyXN)PIevFtu00SNvs^_JV}5-|d=wu;;? zPB1rGz4}=8-aYoqZ05f`e;z4e8yt|AmmCzt9TqDD+G8urv=@^_>6sm(T4{3Mgb&?l znE|(1B;V5dN$19Q=Sq_#^*XP40>Dg~R%Bd|)j@?w{+gD?{{6w5C)*xrNt4K-QBm!e z_CRWH@Wv8D51I=9G`D7RkYt09wnx9Zl1tPvDot(D7cDTiSwxGzrxo{G`U7E9W%iD1 zy`!&Okzce*!;bgvFUZW!^flb@FrEfyIlR$)WTZVs-Jpb;!}+YVfsUQL7k8$4`D^zk z*WuSrpAH?rH#5?8oZeF>?Sy^ye7!(E@7bZ2Dq-94wEgWn5X+MORofz^4kvoj^{|x-bUCaJ~Nr)sjwZwoOmj^6iC<1_|BhM zy8$+=2QpWG42cNWe%L1M8Q%i24gGirj1Bs#P$8r#fo|8m3>$t)MqW6f!C)7SvOKIS z#*yIP+jw8BM!(>I>0f_&TvAn#)dwuMXxTDZN8&TJwXw?*KJqy3uYoUb6`%Mq7tIgUBSL(EIG!rR1RARi}BkPsjhn<)VxNbBI6nZZe4xx$<+;8CqwVt zzwd<-3xds#Jk!jqtf~ImO?BIm^$JP5?^Y<}VM;n8br71vSr^O&knn&W?Pc@KlBX;N z0l=e0tViJ|OJ7UC22ZV|Ckfa<4F$J(tD$PP0*!h2%{_Fl*0}1m1WdloE#c;Jf-nz& z0L51hXQr+mNvBEXdeo7}vy%z?*VWb*g(zJUI;0V=YHi=D1lQtof-46HO-KJ+`>q0g zvKDh0J;Q*9N8bFjgWbZsDZc$Px&OrMtg2O&91ok zJm{|Mf%luFS8iv28YO>qx6Y0iVHpNIzFN{-ReG9J^}M~ejEs~8zV{Kza(i>?`~%D9 z*VS@O+}wme@8XE&Wxjj-mH0Q@s4AvP&p7Sv)#j#M)YRkZrD=zGCnC?N;8DwLQ;LcV_L-DiHM)z;YF!(Zxi+?~`Y#+#aFS= z#ur+5Uu1~d_kU6LpYM181(ho(iTj*bI|Ln zv$JgtC>reYxcTja-|k;C_tv;JHHW{w1Y*f~r|rF6Ti9(bZz!(ReUcDVD0O5n5AV_x zQ<&uRU>crsRf*R&wX94K`O^ho{M5X&R;~|w9eZ0CJgnZz+hiQV^D zBXy-mIFCXV+smWFgKaNx&O|fE2n{Ma&mQ7b@M+lE=D!bf;PsHPJI>G$D%^bH-K0)v zMf&7-v0dj62nm~2s6}4BEC|BFt$F`$rb(^{2bC zAAdLy^Td7ctuNOtGJLVh#l(S#KxMw&{np?K|e>D(eI31YQZ_a*S^d+{G)*IZpu$IXamf5=c)ct`z>5x@n5KctOjlMH=jF9~jOjm0P+sA? zynb`Ry@N95#t(PX@v}R`Dk!Mk5|KIW(SSYj@ugz+NQ9SMa#H;@?nM{j&6W`-ypbI6 zFoA=TX#eK+*{0FbQe7eM2RW3=f`QgAal2%0uAc04jkUL50jdTY>#-b}&wYk)JLRp3 zk`(ym3Ul0j_Kkb*gHAU$+EvG3EBL1}eGOu!un1b0^DSo#jqT_CE;wd;%H1^mQ+ zaO|L4`s)^A;Nm*$uJKHt@qD{ik}c>dpFMj^ScLcyg~c4A8yuGEmacFt*DtL)wEoj+ z_Dg5|GalW$TZ=fGHzN*mb#&6q#cRLLUA)-OOln(OZM&A}$)zXL7>$*V?1}8|(Qqu( zAIx`s_!5@h{W&@}t`pWk-8mP<&FNpUky3R_Fx_}xC>i&X#X_zRrw_CXkZ*R9^{g^^ zW94K?swr2m3~Z(se{=uvrCv|~Lqp%&<>iDXe|>z3UfGv2&|g4+lRHH5wQOf8Q=izh zMkhcQ)H0O|NO}5{1b)vMyH+W3^#hNP?ol0VR`1KdnkMG6 zy5`z?)uV|f!cq4v-igYc?)Gj-C6otzql~i9tSh*I#Y4L@?Ut z5+%Y|pF1i$GPyl>75`#R-4HKv(-vLUQp*!oiMK;P^0PVyNDMX==PMoVKGW_Wbn?kl zJd#EBRe=e=d+L`;t)HsPehklD_g7lIVI)WOb|u~>ILo$G7liB{#$EX~NqAg+3!0j) z2@+hu>gu6)&!lLCC^UgynC?ZQn9Jqq`0+LKUTUhrp`p!%&LL#7QHe*$ASI+cht2+F zB-6LiwU6x)%*aFq75GJpYXZ5Cdw7nxSW0Gj-wDbBvvQzM_F@Nr1eb#RzBAwW`Y0Jr zGs!WDS`8ICc{5)Wa&_XIK5m~?8l~bd3rVc?jtY{}*6o2O?&+%@Z#cuh&4zrH>#fh+ zsi{Y^*5B*ZW&}4Jw@5~M#*%gt*n8kenDzw4+!Dqn`}+n4-GwWGctM(>aj zA9;E^sq7AVdDgej?u@juo73-GPs%ruqbI~GPb{TZkne91$$0u=;!>^^nd|4n2jV-( z48}^iYMj)*>8b4n%GA`>xj1?Ak)VXe58@xMF~!UTg}k~+e_-w%fl<@YBk-S1JYd;H z@VNIFvnjXQ#`Tsg)$Z(i=KEA5&sVvuJa*wc&ZG#n!;q=*fwm8YLu@~*59)tj82%w1 z=qVK{&w3Ut9`XJB>`a)Ah=+}x7SBw>YmPD7;*Y`iSWXe&tC_KQhd#5@-L5N_*RG5= z4&|6s8x8p+Qhj77TN&yKo{Vq;X2?(@OEwSKuGL#4h*ce_(7e1>#<9X+G?c`*2l`%K z;^Qj-N&~ehoUSmY&fywgx-l0==}&9JX%?m@EbSI z&i-<72pf}DcrcXr;F>buev$e;b!Y10>*}y4)7&fQ0s_lhLxYkfCIFl~YK}c%w|sWR z-|q+L;P?BfzP?f39vWGTraNsHT|W2qh0U7Vn746l6Wq29BMq8Zml)IkpIiaw@=LhD zY|oMYzJg-wOS#bG#=rUJS|$Gl`DX~N15V?gK|ZY~H+yqPrzUYD^~Rx+0*;J17)02D z;;^_F;vl$>oCgAYEFjA$^T6cvG(fk!tXfwhDuC;5PtV+JX5`q|7z(lo9Zk*A>;^Qd z-N!dZ?XP>OVY-2bU6zE`JO0vwbu6<2A6Ou$CqWLJ5tQYO@vf%~No zKfVa;#=%I8R2Vx^gPmVxz3L!>>k&$oD5%Co+W!n8 z!oU~M`gzXH$jl`H+YX^y)?jV~?gVr#Bn&`t?w+lFI@;wrTz1cB3Qe`0cNRdIh7V|- zhzSjbS%_>-#8v%YEDYu5Eeyrr!vWtl7&x$^^Y5WpRTVyRTaRWeIFS;X2~l%4fNrF~ ze7Mb&>jv;d!^n!!;zq#O9E)n2K^^8MDt^$VEx=5Pn3<8Q1G50|=vBObAKQy9*3U_Z z;YOH*LoSBI*Bc0Pzy&Ec&S)`H?F*OF1+#kuBx!}144?2FIlUSH!$bQHCp0ziFL}46 z6h3|*6cY2;$%F$6d57y|V(TRaZ<>#y+LQu?=sKo{dDec9MnV6^o>ZVH%+W}Xz^>#;&O;K4P3dfOY4CkO~WXm)*ZWR{J&^f6!w$pRg z&Haj*t*!9V40xWr5yqbMcnPM2fQgOWf88otSwx6CaXU93U6Q}>;XMZjk={==135aY z!dtsxuZVe`agefc(u3{pW?x!4V5RzdqoMkt5|eXSZJRE~!dFPaB2L2{arNeLNh%IZ zGh01Vzlfyg4&F-QtjDPN=I}+o6`c9Y)~?5#0c;!GoP&=nH0vQZubN}qCPbJi3M1Px z5hvV9?1Qn#rx!OcL^j+1!1xsY#t&X|u+p1+CDR3=JT8#MYHI?>#D~UQ`He_k0hR{5 z1<%qk7@vYJ(4O!&izN_V*ywdZOqh)zi1Gwi#nwz2WTEI=F*q6+B}3fi=H>?9`J30T zUldu0O%2d?mcS-XPR@b@WqcUfYbh#z0R28cK4@7n0%%@0ELyUB!$>KAv27}N5a&Y- zp#@y1VED`8B5|ULQ|2fXxDL(*nebW5$bdAdS_-ok3~WkaQw?88@KGFI5#k~;*er$D zt-x7=Oa;?KILzQiaV3pgJZXP;TDOX@RfK_sY|l~y6R?oq%syqbz+MMiRndKhvD43^ zR3Z@sf~XXzi(r($O+a8T7pd~)*^kfe=N&do-vydmPdMScP}uu}&Yriki}0TF{ZhR~ zOG>m^<2al`t>!AXnyHgoq;4Tp9C!pjR0nK zStJ@odhFE*N7EUyuW}kf5KG}AQr08qXqtJ_?YobNY2!h|zt3Kxrn>ruR>EZYEcvW_ zY&aySRDZ;l+JAw9gz3W3zg0{^2SS6zXFsOl6hibZNrq$4JEUR?J~;D1sqc6g6*7CP zQc7fZrG!{ik4GFe8M<)@$uU&-q`iNCJZpG#v_@8F#WEp^l{JidC+S{j!h6Z;!)r`} z>FW8NH(0Ry=n+s{c!C|Qa78_<0#|ua(|1O}1apRp2&O^F@$qM1#3V%f%4$0 ztv*aO5yD;_e%#u66$eLgQBgWlNJH4^^)-Z+-bqbmI|*+$MOh4d_g7=_71~YnRAgIz z;`Vt;9a54Iz=g|#_-_Y1mfj2*pT_6P?|k_B6+_!sr}6{h^fd{EPe6x?foH%O28U4u zJ*{_j-ph}<+mPs^L_Uln1Mh0NvVHYS9g7)vP!a)0!EiLiqQA(-ubUk zD$xvwUCFWoybL6z=PH!Rkn)hNDI}PC9(aUM(u5#7TW^ty9O#n(FftbLadku_7}N2; zRd{xQJ#v1n&`>4D$lZI~qQRhpVyhF}P-*O6msmI&^t^r=Rx~l1P(De1s1pb(0$Vkq|TH@s*LRp_CmJ{Q3ri z(~Z%Br5(#B+`El?F2m%JwpASv6&c%^c0%{*cuPyz5`V(15x>eTZH%Se+jVu#R*;%T!2cgYyE20Vv0a0ZQFAdfkGwzM z_0=bSs#awAUndPqUp$hY(hAwr>e>PkKjo#mxj7fImu6ye`p#EJ;BkX0$D+i^p8bEm1{^Tr zHSQ}CL^Qk91Y>4NF(IFBz6XsCJLRuk|MLat=!h4Pw59}B}7jKOQw)9u!v5Y#UE zyzoh&F~Dyi?oF)YAN3hK*6AUT2|%YYKC%uURV~2K_6JJ4^WHXOd;cOBWfIMUk0{BQL>Hy z@Si`WZzTlN?@Kn9g9RM`^?pLa2N=x|5ma!{yuI61VDsij66E{xPpJpF`1^^JwUSnq ziK;=Bku>osE8!`s1@BB8?EGpz{J$YQum10Xva*Iy1Jko&NVxwPaP`U@ z7~`3knLR+rq$Ik>5wefI#;6vgB*t77leR$@? ziL~@|A+7J7Ti7pj!-P`sJ2d28u|)_&a<5e4VfERUcQZ2b`P5c4IuS%xOyJ75T9^0V zgn+#D_>_N8C#5YfZ`&bqz)qIVb-s?bMHgcU*$@SH0S5;umwt4H42eNO`%Ts$5!ufZ zViToFG?fK7=&W$;G8>A$x#5gzRC82%+1FaI!`g=63TpEcd!E~jDcXNnEXGDfy$BNT zJZ=Ujutb~3HzoR2oa^~BmeW4T@2=pkT{q>VefC+^Rn>6qa=P;HG4^2;1;IQDI(<-; zE>n%HTZDcTQ#!QO;%(8G2pUXM$x8UZh9P*Dti1@1oYl_lJ9oy&Se)>jsQdfvmjh<4 zZfKC&wCQpK*sp_oxhxhdr^Q8(Z54A;Y@uqAett_cLAH+!>U6%gs-36h_<9&lx%(1Z$pxm*`efm)js>P*p8SS@R227Fak#Z+*nL1N+?!GUNgz@8gdV!{ z>avfiU;BzH%?=5_lx-J1xyNyLWMt(0B%S14!jeD!rww-*^{jj3RT@H`d-v?1{8ol&D>i=GhvB$Ov)cO4T#T2jkS41uSZ?7gc3ffCt_E2BWKM*P}Esezs zQ9F%oZG{+-TjOrntD=%K28lCTqpAkrsW2;$-m(RuO*s!9u!c@fd^>^#Iisbbf)}Zr z+6R@k;%Mu9B#BLimw>GRxU@7iK_(BR@bI)ngwxrxl3TYT#4s_0 zK)&K+0rQ|Gqb;0)Hd-eHYC+T8;)_LBD|yLEt{qTRfYbf$7=x;@j!rOEwXdTQ?4fHo zInM)_!YvO+IshH|_Vlm3UEuosj2WjgfL-z_zLtiD5Y#3pc&+LP{r;X}=Wo2jAFQMh zM6rHWAESx10`FrLa^Q&_S%&l8Ux&t!?C6Ni;dKI$E+I;^@LS2&$B(mJhi{z=6MLu& z;SbZ!8cI)GwJRI3$Fe2@Ks-Q=goLjLQZ;gF!4DyW!UOIej{GaUSbyGyqTwGa3C?+< z6!@t^aqpLawNizmLp7g&8{22V=Bt(4j%n?Q44X|a1)m>2=-A;>Q@>#3Zu%K~17vYv zSpoh~K0UN+B?*NLw&gqiSW;fTc;VkBAezdp84qTpxA4SS#{-)0W2 zp#8Sz5nncgX2a&}-~;O_W$Si`8TXaNF1#UF%&TQGe#5R?A(2b!3TV0kCpU?RFe)#m z0z>@ubT6lSC$f2hukO!rT^E?nw4^LK6*l`)m-Ed|KNS_INpKEYep!jocv<=5n_vy; zKl{Y_a*py>E=36&3>17$ZYaDu9ss}7#bSXE{STrhSzQhW8oa6a<3<6xWcL-Y{aw`+n+U(&tcLOPJw2Az{d3l3QpEkG%;Th%9Gcznb=I+S>wpV!6H7YGk7}-!kPuES4K^2*j)Z z`KiFaRGila{MUmzdta1#R;oX*jz}gwS%w%_;<#*|9r0%YhjY2SH!UDo5Gl!T(S>w&da(*BM|o^x0h!LVpS zAQFi*^RDRJ@Qij*?o;YjUUs?5p|07VmrNk`Dd_O&*F~uVU&A78cWKrFEDxaQASvUC zK4xnA7HnbUj zXCh0-kxVu>H;1*O=`oPbA>fi$TZqh)8ykxE!aWqixd@JSnFM=%fpNbJK=l+L6+r!C zAg~JFUTo)kpi_h$@G2v*uADQ+)z|_W$l?IpQ{+{p0Gpj@3-x#fm_lGQ-rdE-x%`G(sThTE?Q~Yxy{Jx*fHcGgOTk5 zE=dWdeVYgIaeOo*6n(yIo)vcsAytcm2eTZF~pkxT}sox7=A<2svn{NgWy%f{q(Mp6R0#Fh;!Kw1AAiHWlB8X^ibQ&k>iZnU z>P@kr65O%WwYAxsaTmTXbqSRM`cmx#GNEP(`zlF2{cZxe%g%;;lK+E{mKQNw!!zn2 z$?Hgu6_{8kyVxnbvcTeGW$*8D#+UR}&dXc(0jn!@*vr&yg41dWXQH=UKH1=={OLF9S< z+>b#o?srMwls0 z8{|1+u_`Rjfy~0^%fy4W@5HfVzz3fXo*0ipILZSklg#_OQX2zR)FWY z`lt}X`g(htf$58riebVS)cw4(32o`-E9ic)c^h=Y5vgVn{4SWY>#Lo>eWt3&{UHMm zxrkSQMnd$Hm06KP3ZxkbK8{T_w;=29#!}P7bygC|uWfCsod}}F^}HpIx=p4u{QAze zXH^MBO6qCTHh8z-o85}H4u1&ZyD<8Ro^E%kEDFApAJRDUt)k!9HFuW>*ak^&jxx=* zU3anyWI&_^2vRpW#jA1??8ityn1Y+h3D;Jp@ANttqIN7wT?q+fz85cEB#gl^&)sim z_|eLc*ev7su6AR{)oJrMt5^3 zlst;74OFO~L4EbVKDDlyucA@?zaEr-kTq7rWo#PTpN}{^-hO4v{K-5f=eyc+zJj9d zu+)=nu-BMcP?~6JG7yLuwFpT5d?^bir`_G%xPAYw7>G6I@477O^X>+) zs|Aa1Z`ZB%@G}@AiPb946Dnx!BsVS+cE*r9e#xPzz)RqmA8Q5x zz|?e2U9&@-G)#MetH@s%LotK}HIv^(eJ3HF+nJAwzws?pc1 zmSh&<_YO@6T(7Y&Q3k2js}$R4%IJ?D*yQ1Zjk*sXYdgg4aQdGAA$C`k?o|Bs6%z?e ziM;#w>+9+!V4Zf^%WHA{I3UyXj0}TzMCF36ZqU<6J+u?NhN1JGIdym6yoB9EEY<`e*(Zc}46LT9xs=1$)YTSDuqDH(pi z)De>9uZtmrm(22|E7q#m2)*C3_#y4#SV$V*1LHp32ys$-rm+N8J;-)@3}I?%n8^4J zcr*1PS}2fJRaBTmG2H|O2T}w=JNhK&wXCbQ!FJV1rzG@)gM;8 zqcs*4$)0f(tKxHCRtDwyAGPWc7T!xo*j!TYk*S~8vhFl}i2MFT4Ba`7Bx>x{5)%7q z8{r7AgUnRSVN2hn#Fg4p{r#TV5jR&x0;Q#54Y%hi9uql4w8JOLRN@VZLTbZ&X}Yv{ zLm`RwIls$XV!^o9s7@P#ARHABE%(`p*;= z*K(^W28biT_h~jA#fP9c`RMe|w@^*6>uX36wYRt5H#ECmXVj8OlY& zdbdy$vT^ES;*|bfsq(9F7R};mcrZpQeUaA%(_f6&Oz&i8pFVSD1Wvi*V`Gr;bMWv; zm~0Gx3qwM!$gnU(y#0ZPHMM_YCkKThU6x@MEpFjCxEc&Jr8i=LDl{?$)U?p;Nepg# zLfXBghe%*Pt(%sdeM|EE;4Rs6XyR34p~xogrzLZ{1%Y(~!p8jwB|FfB(8Z)rmB@xd zJ|SEKOy$p71Jp&kx65fTCok{Q%5B@WAwu#yM%eyKAzHzM!eS`<@9I|a{kkoOA45T8 zXKRbH)rF@BQr=rP@+}^DpfweWlrTAmy71=B4h$wJ=4lR{x4r%RFp^KG5h9tJ-_6LV z84_XGtu}vC%ucgcaiC#vOw@vo=+L3t6)`w@xwSw++Ee_$fT)Gt1E&Ek(coj4-oW5J zTtiEX%}6#=rS_ae=gn;81PQPG6)sHEXcX2z5kV)%<`h!%+32h zv4iKouW#SY?I6-<*UHi+q?RLHml5r95+ST45jM8ao%N_*)YLZw*2eCNv09Kz^-er9+~jOIzg*cCLYWQ|ay>G7*@+8_~9Wu;SBE%bfW)dBCH zxYAG?xXX!)WA&{J|5J~Oq^=be6GOg}U@S6bNhGlhS8#Lq6Y+U^dpKBGN6&xFet_gU z=Q!89c)S^$4{NoS-n+S8V_LdDZST-HJF*1nbf(5amrwMTwM%!ADZK< z*R9J<3x2qH+l>QR=0Xw@aiO74n+3+WAh0AJ_){Z6I@Wit&h6BBes4#wR4K+p^o%Np znlhe@WBT!3{K%8Tdk$}M$l?6KSC7LG)XU6uePd^oJw)G9nD0YuN!u^FgzMncbz()Tg_wNMDVZ&rZx_A`DS%1y z%|2bKGZ7A|^Go+R%a#w~+yTc9?eD(#>LQWHN<99pu3Yxt4w9!go}MdM_oA0;e_lz^ z#-8?mQrMkG`{^6hH@z>kp?(?AN#S`GC);w~AUSb;iRH2jv~6f1Ny?U+o}M0^G>|+|KgJ45l5$2cN=WJgRM&j6 z_Oe&bM;=|pL7M&>*wNPSk8KIx0_tB7NGP$=MiX4ndC z@3SX91n;`fmK)<5tTZ8!oa4h^0}Q}@AAlDDfdjyv^PA5=Cgktf(y50^-Qq4}(zX_# z6dpO}GceKcO?U~}SWAl&vCMAPMUL?Dy5{yeRW>QOTtn`@jqv4y(3JXW+)Nd605a~M zs83uHPh>HmAV3!ta{U~{xXPTbs!>D5L=dyvXj5}@;+qrK;f4z`#4y1KiImyCT^ylq zTzFJaRORa80R*M=M1;KS57D5jZtm`&{Ot{hkKcezXlDWTuuqo-QUcJvK(>$f|}6)5nKimD9q~;2(2H#z>9bZ?S1%YL(7378~o<1vMm| ztTY=>PtTPkuP<$)bw>Iu%-louIY)GF-+}D ztwMy!KJ`+?Yw>>HAb0&|c6xgCt5=9~OTL8(x0HE(7C1VvAcZR4<~-0D752`@X{Dv_ z;L9?K1W{_Lg2Ua2d0x;S9hKtlEYR7fXBtvm2Iu*EVjIWLuk-shg3KtgnCeHEza4 z?{R!~wkJ4=<*pY>5eVzx@Z#s$YfqeQi2S|?e65F&P5sn&bCWaD(r+hxGDK_H*RI7( zyk^yH$s7K|KvztG?#H}>C$}fb6FLa|!^^1tOyXQZCth?iZ z$B5$d-L7(Phh9c%3I4L`^Y>>tbm;x0tw2su$<6!P4E0cH)YNe3p98OkWtC%DkR8== zCetV>h^rV<*pLtdD9=Hrp3QRqMkFd>WWcU7gEAh9;>rHZY*45>a*ykFx?b?2Bq}fC z#vaRlf$4e*DwgFdR=6mnTz~!asWKdItaeEH;DY_$x7nV=1Qa&y{5f)k6ZfNu1Z?Xi z3LZ3ciRl(T4V#WIQB)=a~k{oZ} z<`(LnALiEi#$X+C+~PrH@J2q#Z(9%fl{?=T3(qTP`BGQqx& z#r5amSJda3j;!%g4o*|>YASJ`b}HC)tade?sX%A{#jp+j)qRPQCpw;7Fc+$ zClpjz*_wBJR{X&3V~W*^y%7QHIkkXI7)n7b6htmxJq(xI%Px#(Y}kSx3|Rn$?Sl3; zHb4~=`v4dG_-K`|tr!+_Rmg&U+QfB3X!B;Z{U4f|_6wf@WZBb*B4>xdx3b_9m`)E2 zXj#7VVdMn&?ddAE3&G=1b$t{UJ-MUEnd9iM+389snI$Yvy{S22TVQR?%KFT0A|W`= zV(yK?u>I-NkLAC%>HC!R?fGWt_G>l1y@Otz@;E1ZEvI8xl#}kQsP4YE_g=5_^%mFE zj%`2w zeI-fh&3#J>1Jlna`7(*g-rKu@`i}F-pI!E$rn1tRiTkAXhJ>&0WGxU^!J1g7x{l6i z@wL~n%|St&4BY(X@86gBO;3!4F_W%wziO=4kKKMxA|YsPbAzqcWS;&EtXGW>Ea8%u z^G!26P@wKWE^{mL_LAk5sk$S&l$x#ts3F2dF1xuTPp7hnRMv;wGZdeW+^T*@j~{28 z&C?1a=I$aAw*1H;HpY}>*dy4D!aIB`^5>7Ytdmm~9&7ULB6sF zCFi=ewqaqS>bz^(Vs5#0>#L8?pBo;(a<#*7O+<8@0(ShjJ@r*yvYV2AynDHRzL3~* zO<=w5p^>!o{K=l6&P7XBx4&J(eEPwI^8WVxva45TOI>*2q;Sb;vUADul};%WN7{0j zqJlUB!9t&6Ni;BYFG>fAg>tYp4*?EC{>%jwFKl>j_n}WWa zC~-NrWWMOCYgVCHISY!7f1EMmP&FRpEJ^ezs9NVt|2}O2V{YM9|M5@NO5YwWVe87O zJLoq202;r}btlK-_~1)PtCtK^BBP@PB2LZMY0XWaFU{399VT1OJB-;ney;DS=byB? zJZxvGBy>-i&~{Q^D{V~HD7P})l=YR5Y}ezsjKC3S<-h=`zPWOM`492=0a!69bUeFb zWX{C1yo{48YK4Js^umDiH67^!eC@{;+G^ zynYP_Bd%vFb>8c1-8j$wLyinP$xVxqK{XP;H!%AzzyImGak#;&l;YsntHycolU~M4 z*3knmIy4)ze}9wle{xo$=)EXC2hFY@R@P@x)tQ@oa}*V)uXwrY%9Mwq8!ddym4~g@ zE787a*3To{s;N?Mf=$>{zna~0ShH18uy`VZBbh7E+keH8XC}+n9<8lQNlL0Id66&{ z!OuRpyrc8wPVf0Mk4hD7!>^yZ^h<7oO{p)uvf<-_mxY#sg?Zh%$LAb5gT+q2puO^L zZiT=>zj+2?WZ=mq!p0&06?U~a*)oHdXdrRG)=Db=^rxkXh?gZt< zuNTXh3Y1j$YUUG#JSzGu->9XG6;}D?iV_LHAGOrg!5Mzsc_6);KQsCL;;Uj;w_H7U z>Xi8WVeYO~&VZM%9n1s*o{1rhS8lMpCDqeqLNniEt+~&g6#2%Nl`>(&Ciz9e6yJpGli?d zw9hBNP+C7z*Sw6^Q?q`7YzxRp9rtvf*x&uf->Iq+wgU@E29LJn-8(e1eV=ES>xC=t zbR?}QhB3Ph@4O37m)|5dZS(CrgH79=v~7d~Th|~EMxqb<|LJ@HG!j%kP$daej!Jh0 zQ-=EN3BVqObJ}zfA*0LhUO}-+YGH7V08SMR*PGFl;^=kSazj5)evYpe9m*q0<9$XgYGq)lPLRu}wrwOiV_GlVVGvm=&H$xO(-fukSM$I&rbH z^Z92DmroPsh7AG&0=PnvtPg{^-4n7_8ZW~A7^xz!xBS+{tOJ*_z!dcH^=)XL`4p-P zdsM-(&&tM_E1@3}D#PzkHERVNoSO1XO@7>rvqHT9tgs1v^XAR933gUiUgxI}J1T}n zG^|iQ14|}qe+Kq328a(J!v?!29n&sbTh=(Q%a?Dml76GLbw>Xynma!~`FSM^Rg5o@ zz>F!MCY;~Wl9RoeNMRa%@WSgVcKjO|o|CUveG&oYCulEOS*P^$t``^Y+}KYL1u2MJ z&nYOlW92P#<~JQ{W?F@_5lELwvML`No3Xy6@Pbpnubk%`#a8puJaCI(FTxg=MnA6O z|795czNz^)&b!BWw}KCiQAAsUf4}{1%rN$FQfbWuz1BzaZ{9RcAjbV#C@PSv$e@{4DoCM z!Wvg~BDOC1jToE|qnH(wg|rSHJjk}FlZAA(L&no{ZtArNLE*uZu;tp%JE#nS+Bw{1 zX96&KzZNuk*xbT*)!lstIs`fQsjyzdW9sTJS}i<@Kvx)uuPyWUUv}=?_iOS~f|8Oq z!d-q%+<*8`#^?l<+#u?o#RA(t&!NGK%5xYHQ`P#@d5eZl z^-(Bk@bc^F3Aue+{PR(tL@mmPCJLtmiEh`XG10)FAdu5g`KXc-r+)8|S$i81z*KPR zy_un5=*^oicl-PYZQ$H&43$@FV7YYZ(w-WC=NK7CAAimD*8&mca*uyOy{eo=&PuTl z9ys9qMpZNgg6oW#bGCVrl6FH&i^uoRD|p158}|bgF@<^S_#FC9(XIc1CbOM;&?F=L zUF}}sQj!u=>fYxs)-3yavDXUuf=f%Qwl+lNoTT`%jPf~TJqxqAC|U?Gn}#eoOWL{IPWNIZ?05J#BX zG;he*lCKngj%5`U7xoc95D@j{5G?HgDkthhj9=y5{@hI8od5Hg1hhpQSfNt26NOH# zrtM|lPq^LSIq&FbWMIIsY#F$^t9tnW`gXWO<|VR6anZDKoZAQ?)SYMQ)>Q@P&*Q;% z>)5!_jR2cowg`B$wOW91?a$TVuj#;z@i&Q~%VoX1TN@Oo#RssACF&e#TA`fa#|X}D zE~0a`4bLA2?#rtZyrJ`et~=U!hY}(PxzG`o&be%Q7{QZ$rSOB?P7waAnELK@B&W^I)>n{lgNzb?P$!ohOszc>OR%%o34AdLKjnXqj%G03csMl9HCNK>M3lru5m**x>#0x zmdz&%l|Xw+of?%`2$iIlR9R_hJCJAKP!M3V{A$bOP|`g>Aud^v5-yp#rlu{ds;yZM z0A2fyFRD`Oob9s%G^X&q%5b^t@WUQ}hJEB$WaeT)hhvbX&ze=sPFC`9eAP(Ag&i4> zn0nL6>!L66ZL`SO7#$PmR@h5N^U75({q5t|`B~Aj1tn5w?Q<33Hr4$55^}d!a(*x8 zONrxtN*lkG_r?eLnAZ1Sz7`c6Z1CWkfzyJAo!Nkgi+FzgDb?htW!>j~=g=G9E)0E} z8VdWqoo#+Bh)S4)bmJ>m-!QnoOYS|iQ7yT-jyLOGrz$NeeQn>febkzNJWJoWqOGd_ zYwSwlS)Q^)qxDDf&FTRV-(9Uw?5NT*HKwz??Rs-`YA?6y>|_^aD@`j{HTHi>y0+W0=ko{a)e+tW@|c-x=0<@_Ge zVrx57LMRNVi1hDu3pAKNbrCVpr0pb3RIv#*r=J&qryY9a@t*SDuF`hhfOd*I@1Om1 zuD1lf=!E_eDV?*JABmo$ZHJg@Vx$8*PAv$C=b**D+Hkznmfx=uBSheyTOq2(s0uF6 za>$Nid9%NL^Iz0TuC6)b)yLlx%-wQwuvkY{!48+vPm)KTsWXv)2jd@42@2R!XPun3 zZ`+1x%OsP+ukJ5jTEXN+IwSU2YN33AE>;hXqz7RF zOJ-$~)`>Sh1-uz%`d?lT?|WDD z9dpqvQpw(xO)$5Yg2O$8d(afA9t!VIz6CxHTbcaauX7IRrLin>2P$6w=N_2qOs4-@ zRChqdNTmN=5iwB%_&J04)x7@V532ZqW8mN2t;K0Yw(H{4tEKe4;mvmX@ZmE{rO=)#$3c z!bE!(jFBfbtQ<)wW0x*9?13a4XnjjQyY*Kfd|~xk?;Uy)L++OFILBl z4KjaZU!>${*WPz@`iwyMrZqz!qMgYB{Y8gG5;MX-y(0#2)+Xg?>wH)2Fw7bONsoW{ zX4JR&cG9+!A}lU0uvE?CY9Pozgp-040ed$2L4|MlfiM%Gg!v=}VGgG@{_97_>BQjh zy+B<`io*ciL3?xq9GNPP7BNq-D--j@~ z=>S;$X-D`6VXAyJJ6po%ES?@pW9qeu<0P-$oXvr0wgYnKec3?s$8`Gsb3btB!I!Lt zrZsYF@AURM5M}U8XPf0`V8jg1c&jOaewE*2B>rN=NciWM~* z^Dt50Q+h2Tc`KA)pgX3%hTsd%dsjJ0>^?8%HleoE-_6-hJM23kd}RbyY}#IdC|0XF z{_5yajyv+qSApC@n6I;eoyFW=dNCDI%#N;VH+Jd ze9-;*yy=qGoqD>t2Co0f(BnNeuT^CSKP*QQtfd6O;c&Q z+bME_5k~E#L-fh@PDg7PVs^J47*5EHXXFTguD@t(vul5(x{IV)gc(m@s_?z;&KDDeF&SLDB0-u zNPIEaXS9`{e}IrBeb4JCH4$rtEGdefIcq)jT^`sGxX`lpb0%H84az;k0xyph0zLSB z9OGG^pH$ox4A)&L{MOKe?7BJKfp8!8r5=lPlU&7*^^>DFSFeAlY`^|(i0{5LazI5PI~p?c6LYE?miCc#r*loM(RhexKhk|JS%wXi2qj#S4z)gile&y zh9QpM67&aw;YNT8z%37dVK4DwGh(LuaxbCB71B7R`D?&p4khQo|5c5v$O$6a4!)K@Y!39Oo~m#kMUK!^LZ@msg$kVhS|#^`n6RUaMqW?=S7lly|uIT@gG@ z>W#TrB!V74w9B7ros6e3dkD?*OYgQt!`<6k9OVV)aTVO&tKl?b47Om*$O9|8AsW88 z&pV3>C-k2mHlkq(2QMeI*j4iJa1@_0GSa#)-9>ZLx})6M{p9kZMT@%1j6o*{rCxMB z56`3A1IUg_yL&h6t;oyq&^|(PYD6ehF(qEO>Dew(>TOQIMuUm}jVE^WdyRpD>v+HP zIL{2Rb!b9d=>dZL9?tFGC_S#BXRh5^LH(w$=t)r5T7#BtH##j9Bu*d;+*k?Ne8kJU zPJa!d24W1v)`MY#*|O&CFs}r(s)y7{;hgrlpc-DjoVOvYl7A}CT{}37aVz#wwg)_`Lv!*5{?wZ{9+I0q50qD({eZ=)Qmt)$a zNT#FYyvd%yEZ!1hT5q2d1WOk<8azh;pUR#*YX0^p(48jOJbP}0)$ZU}*| zYitZ5BKa9r= z=GJiUH!@1M(Qh7gazxjQ*SZmnyn^cw08?Kuaq_acE@MCn5{|Y zuHr*wX1wK(zkdnJ&o^3kU@}=__ohv1->q-&-lc)*e#^Zz=CA)X%eSw>1Z?fmlQ!vg zC*PGTFI}Zsx0fAF^PP&1&)ipY{FoDr-PP(FmeZ02wuN(p#ee_OA5W5vSDB63HbEsrSooRfFqR|>9M=Zj|%1Ks`I zK)pn_Zr<$Y)W;}PFZf5^Z0&IEM$}MenO5}CUngZS?{k7I7V6Z1oe;v@(Pnt$&zzXi zJJ1hz5oDoGgANhhz%Iv9QRHEe_r*jcFtakQ5DMk(V#kPc(bUwwO|rOrsz%eoLTt+j zTW~CoTiw|=+`0wRqrI#Qk4$#*T6sqrpN|k1HhWyBdidOVnIqBciP1Oh!o$UQ$yikP zZch@IhX!^D(OYDl-^;1^^0z|qqR$35ooFvUWo6|EdAEriXono{!RCB1Bb(9-HH8af z>Vm~IEak;GEW@eHJ40|eXrk&0DTpIpbm&G@H*4Q#{CZpVoNogdHn*j$8Tds-MFr(p zjqY``rDvB<1y=0PbQ`NzJ9^mawqvtPkGa{2Mk`-chyTh4=>0Ez057Kh#s{chZXMD^ z@BzHS%iYIW*%UrH76x&47--npxvwOZsx`kIVp1rCyY!RSuOB~oa-E4p7Hwu*)!STF z!tpZU4q&X=sh1XY!;Gq}L7cNYcV^^i^@W9Lbaw6*Tu7{+#sf;6Y?6D>en50&Rj2x# z^@GV{nCx;VaNpux9+(Mdb??NW-2=P|px9rJic;@Gg*4g+boArb!?o=%g`b6RNh8M`tyS~{^ z)fFt8iuJK#b+_l+jMaP5&G>WNy^@&t>(Sg-m4xLf^n7Dbh}>AX(CJ<3>}GR9V<}UMi^h+x6;b>c%?q=-?f7`l7 zLoMAnCD|uWvR=OyP?{;%BiDZ(=m^q@V`b$0k(7Ic$SD68JHVJxtrgus_4`)v3-_}C zv0p+$+xY1T0Aj6RXF>q;z4zlKYH{I^T(A58SZ(YUX1PK_!A7-wZ6p))fiO4CPDP zO3t4KRMyWFxyfH#L+6%^Se}jkQv(U|S(%}V3SYJbCd*JPupulKE8lLBr1ZBD;Tr0z zzkl%C>ESV>FjxAptZd3;im1Xr|BX(LOsh29p6CVi{+-Dj=5Qjg2% z%Pd!zuI=f5QorBhzYzwes)xi`i+>XaLLRNAf&#|pR3ib973u#0$O0c(QvRvC0U&;} zEa&m_MS&hLvdT_NQy&EV_@*9NUm2^=`E%zs^)oX;+N0C^s(>{ZL&L|7TC={|pB(%0YP!&_b!FbmpW6?g$q`ZA z{M6U|@q!KPBt{NB!46sJ=Ez2krzb;j(4zGK0zb9YwNpQzh#Brwpq zUizrIai=dqCTL6`$OK;R{yUjq>9HRUa{nR|7{AHnU&@%hx@&}L^upS$9Z~aL=O!e3l849X)jqs^p?a2 z2Olr7;PulV0#_|++bDBNJ5|a}7rYPW7Y`rs{yea(t0YM2;Bd26Yi06NKc0SX@4`RO zDzqqT*VdfWSouR(A#Q-P*lMHdrT4`)+&e#2NpXtxE1d07V-+_RZ0pIlYlL&L<)c(? z>6%{;yPnZI8I0_^P#(UjDqgE;XndfNKJNbgxIgb(5y{~;cA^tJHBryePlpIT!4kes zkO_)KH=g$K+AujF;c46RIyTy^{17G3M?>RCpJ2fdyZxFq7J7opGm%G&l%8Rjr$cXv4j6ezL#CSQm%*Wfh$!}x1Q=Gf5t zzR})vrTXSOSO3zF-p-p?NBw#^j-7K~td2Hu(*Q>(;QwD)-yKh7`1fCFnAstjS)rpM zWM{AJoX|N|3Mu3uJ2J9LB4uRnmF&YII~2+aWzU0TZ+@Sn@AEvb@9WoJr-S=G=ej@l zbzj$eeQHXQbTA}{Cw%EvB-{Lxs|&Qe-inh+C8Kyhd8FVkY;S;=6eq@cHmROU@8}c< zw86$t=5U4-a`hVa|jjjJrw88gu_wjJ`tATuB znHdD8Nj_PO+^E!mYPOrr2d;VO&W`8boNWuCs4`boXgPEL=xAv#3jWviXvXtJ zkRZ|E`l(}}__`ZpC`Pw$2PcQxzgC#Ltnmez%&z+4OyjW-`K|aW7$#GkvBmw2R@|r@ z3#078MUof+I=iBpSsLso3!<**1nJNk%?pyE{{|#GHFp+*bt>rp<65M>$3&2(=$%!P zpM1~~R>Uas38i~rj-E(I3&+}9p!C99>}!<)q&2R#gAj3vc{rIMLAjr?PhPhyJV;X>vL_=I&k zhDQ19Hj=GHI({!r6;MS#^Q^1OFt|5)b2j0h$Ymlal=hT4#GEzTR{Eho<^3Nf@W}X- zkWndvE&0)3_B&Q_9_tn4g?H9Ky~C-YOD@yq{ID&jWE5lgWu`X<|{OYkJis%rMt~1E1Our z;`KmVLt__5QfiocxYQ*XT5ujEiS@&i581fmq}*Lmna1yrhW2tan2h-yYe0 zdzkv4GppRF3^BZBA!VAKCe*gFKzkdu6-s&?jyOBejwE#qwU3ncF zj*gKLl8C;f&rFe>=RCJw{3MBNn3j-~5lMg5z>Kz5S|))6Q|D1XA@@%8Q$T@ zKXYGkNMQh#1W=i8dDIB~!co}96$o>beKPr_`B8gUmjh_y1#d-DGF?-2U)M0H?kxXQ zR_*-F$V4>qRdaLI?Y9|EW+kw0$mcOn&tQ#Xti1tO9~vB-o}BFZ0}e9KuL4bRiMU}@ zPVfS(-Pe|v-8L4O(l-}}S~5txxXsf7ZtXR5>IN2M^~RmwdsX_Zpf4Rt1%f4$OG={J zTRS>3g!*AY**Gef1~E9`-UFLL-K%E^wXT2}lkr6R5zL58ra%0Zlc%^X;p%%%AG)fE&j!aiSEN?2If z#AJw&1mo8YUxEMvm}bqbZLio!LCaa_HBBO_n2?jh|5g?lu}+!YJhXywp@5$Ncihf+ zsF3vs%{bBUr2!&T3{XVCqO1n7d9#=4GIjLZ{l-RL1JOw7QCse4n5ROqQ6Sv`weZO} z*c5qfPsKn*g0|B(@`bIg=KhZl_Hr>?PzKvWJw1uuBl}(s%=2svXCgZX%I(=u)L6tP zvxQs!h@A~F$8p7-YfWCpy1JmvQ0|UhBrp<^@jQH9V}NwnmLleWoSS^C6)#>F!^X<0 zwGGmbweTw7L;wP^;{s{;B~&3t^j^rQdTSmKt}iqv*Pv|MybjI!l{7R$t#1PNXWDH* zU_C~P{HbC!>_|z_>Jm9X4ndd0YO%G7*;`a73!dPvb4@)XCm~Bd@+9gE5%Pk}o`T)q z!SzKu`Ez+cp_$-AMI)Lc*;?R;i~tv&DQjF~RS-L z%@@o?`DBgyp)~uibuP^AE)^j^j$#7svg) zrZrrpRmww9*Tb%I#sv_+*0%)O>GXM5*D;HhyqJGpmKW!q4Bs5AVSNtDQ@xxs#;q2%NH7xLL(G5 z+KWP_k1Z7dU?$HSob|t#b|G-A8Ry}%m$-CTioe)jYI+&e{Yxf1*q=!LodQMEW1u*} z!i^5w*+0A`5EB9u$i>47hp~EXnQeb7m<=J?;Y~^qaBd)cT!7iY;YB>GC4rKX0B?

}3poFZo8oUO3AM(O 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 Zb}gN;Blq!g)G_#{rlh4 Overseer : SPLITSHARD +activate Overseer +== Prepare == +Overseer -> Overseer : checkLeaderDiskSpace +Overseer -> Overseer : fillRanges(N) +loop 1..N +Overseer -> Overseer : deleteOldSubShard +rnote right: left-overs from a\nprevious failed split +end +== Sub shards construction == +loop 1..N +Overseer -> Overseer : createSubShard +rnote right : subShard state\nCONSTRUCTION +Overseer -> Overseer : waitForSubShard +Overseer --> Overseer : addSubLeader +rnote right : placeholder, no core,\nsame node as parent +end +Overseer -> Overseer : waitForSubLeadersVisible +loop 1..N +Overseer -> Overseer : waitForCoreNodeVisible +Overseer --> Overseer : setSubLeaderActive +end +Overseer -> Overseer : waitForSubLeadersActive +== Split parent shard leader == +Overseer --> ShardLeader : splitParentCore +activate ShardLeader +ShardLeader --> Overseer : splitComplete +deactivate ShardLeader +loop 1..N +Overseer --> ShardLeader : applyBufferedUpdates +activate ShardLeader +end +ShardLeader --> Overseer : updatesComplete +deactivate ShardLeader +== Create sub replicas == +loop N * (RF-1) +Overseer --> Overseer : addSubReplica +rnote right : placeholder, no core,\nstate DOWN, other node +end +alt +Overseer -> Overseer : checkParentStillLeader +else +Overseer -> User : changed / error +end +Overseer -> Overseer : updateSubShardStates +rnote right : subShards in RECOVERY or\nACTIVE if RF=1 +loop N * (RF-1) +Overseer --> OtherNodes : createSubReplicaCore +activate OtherNodes +end +OtherNodes --> Overseer : createComplete +Overseer -> User : success +deactivate Overseer +... +OtherNodes ---> Overseer : replicasRecovering +... +alt +OtherNodes --> Overseer : allReplicasActive +activate Overseer +Overseer -> Overseer : switchShards +rnote right : parent shard INACTIVE\nsub shards ACTIVE +else +alt +OtherNodes --> Overseer : someReplicasFailed +else +Overseer --> Overseer : parentShardLeaderChanged +end +deactivate OtherNodes +Overseer -> Overseer : shardRecoveryFailed +rnote right : parent shard ACTIVE\nsub shards RECOVERY_FAILED +end +deactivate Overseer +@enduml \ No newline at end of file