diff --git a/core/lib/Drupal/Core/Entity/Sql/RevisionableSchemaConverter.php b/core/lib/Drupal/Core/Entity/Sql/RevisionableSchemaConverter.php new file mode 100644 index 0000000..a1e32a4 --- /dev/null +++ b/core/lib/Drupal/Core/Entity/Sql/RevisionableSchemaConverter.php @@ -0,0 +1,376 @@ +entityTypeManager = $entity_type_manager; + $this->entityDefinitionUpdateManager = $entity_definition_update_manager; + $this->lastInstalledSchemaRepository = $last_installed_schema_repository; + $this->installedStorageSchema = $installed_storage_schema; + $this->database = $database; + } + + /** + * Converts an entity type with existing data to be revisionable. + * + * This process does the following tasks: + * - creates the schema from scratch with the new revisionable entity type + * definition (i.e. the current definition of the entity type from code) + * using temporary table names; + * - loads the initial entity data by using the last installed entity and + * field storage definitions; + * - saves the entity data to the temporary tables; + * - at the end of the process: + * - deletes the original tables and replaces them with the temporary ones + * that hold the new (revisionable) entity data; + * - updates the installed entity schema data; + * - updates the entity type definition in order to trigger the + * \Drupal\Core\Entity\EntityTypeEvents::UPDATE event; + * - updates the field storage definitions in order to mark the + * revisionable ones as such. + * + * In case of an error during the entity save process, the temporary tables + * are deleted and the original entity type and field storage definitions are + * restored. + * + * @param array $sandbox + * The sandbox array from a hook_update_N() implementation. + * @param string $entity_type_id + * The entity type ID. + * @param string[] $fields_to_update + * (optional) An array of field names that should be converted to be + * revisionable. Note that the 'langcode' field, if present, is updated + * automatically. Defaults to an empty array. + */ + public function convertToRevisionable(array &$sandbox, $entity_type_id, array $fields_to_update = []) { + // If 'progress' is not set, then this will be the first run of the batch. + if (!isset($sandbox['progress'])) { + $original_entity_type = $this->lastInstalledSchemaRepository->getLastInstalledDefinition($entity_type_id); + $original_storage_definitions = $this->lastInstalledSchemaRepository->getLastInstalledFieldStorageDefinitions($entity_type_id); + + /** @var \Drupal\Core\Entity\Sql\SqlContentEntityStorage $storage */ + $storage = $this->entityTypeManager->getStorage($entity_type_id); + $storage->setEntityType($original_entity_type); + $original_table_mapping = $storage->getTableMapping($original_storage_definitions); + + $sandbox['original_entity_type'] = $original_entity_type; + $sandbox['original_storage_definitions'] = $original_storage_definitions; + $sandbox['original_table_mapping'] = $original_table_mapping; + + $sandbox['original_entity_schema_data'] = $this->installedStorageSchema->get($entity_type_id . '.entity_schema_data', []); + foreach ($original_storage_definitions as $storage_definition) { + $sandbox['original_field_schema_data'][$storage_definition->getName()] = $this->installedStorageSchema->get($entity_type_id . '.field_schema_data.' . $storage_definition->getName(), []); + } + + $this->entityTypeManager->useCaches(FALSE); + $actual_entity_type = $this->entityTypeManager->getDefinition($entity_type_id); + + $temporary_entity_type = clone $actual_entity_type; + $temporary_entity_type->set('base_table', TemporaryTableMapping::getTempTableName($temporary_entity_type->getBaseTable())); + $temporary_entity_type->set('revision_table', TemporaryTableMapping::getTempTableName($temporary_entity_type->getRevisionTable())); + if ($temporary_entity_type->isTranslatable()) { + $temporary_entity_type->set('data_table', TemporaryTableMapping::getTempTableName($temporary_entity_type->getDataTable())); + $temporary_entity_type->set('revision_data_table', TemporaryTableMapping::getTempTableName($temporary_entity_type->getRevisionDataTable())); + } + + // Get a temporary table mapping object and store it in $sandbox so it can + // be used later in ::copyData(). + $storage->setTemporary(TRUE); + $storage->setEntityType($temporary_entity_type); + + $updated_storage_definitions = $this->updateFieldStorageDefinitions($temporary_entity_type, $original_storage_definitions, $fields_to_update, FALSE); + $temporary_table_mapping = $storage->getTableMapping($updated_storage_definitions); + + $sandbox['temporary_entity_type'] = $temporary_entity_type; + $sandbox['temporary_table_mapping'] = $temporary_table_mapping; + $sandbox['updated_storage_definitions'] = $updated_storage_definitions; + + // Create the updated entity schema using temporary tables. + $storage->onEntityTypeCreate($temporary_entity_type); + } + + // Copy over the existing data to the new temporary tables. + $this->copyData($sandbox); + + // If the data copying has finished successfully, we can drop the temporary + // tables and call the appropriate update mechanisms. + if ($sandbox['#finished'] === 1) { + $this->entityTypeManager->useCaches(FALSE); + $actual_entity_type = $this->entityTypeManager->getDefinition($entity_type_id); + + // Drop the old tables and put the temporary ones in place. + foreach ($sandbox['original_table_mapping']->getTableNames() as $table_name) { + $this->database->schema()->dropTable($table_name); + } + + $storage = $this->entityTypeManager->getStorage($entity_type_id); + $storage->setEntityType($actual_entity_type); + $storage->setTemporary(FALSE); + $actual_table_names = $storage->getTableMapping()->getTableNames(); + + $table_name_mapping = []; + foreach ($actual_table_names as $new_table_name) { + $temp_table_name = TemporaryTableMapping::getTempTableName($new_table_name); + $table_name_mapping[$temp_table_name] = $new_table_name; + $this->database->schema()->renameTable($temp_table_name, $new_table_name); + } + + // Rename the tables in the cached entity schema data. + $entity_schema_data = $this->installedStorageSchema->get($entity_type_id . '.entity_schema_data', []); + foreach ($entity_schema_data as $temp_table_name => $schema) { + if (isset($table_name_mapping[$temp_table_name])) { + $entity_schema_data[$table_name_mapping[$temp_table_name]] = $schema; + unset($entity_schema_data[$temp_table_name]); + } + } + $this->installedStorageSchema->set($entity_type_id . '.entity_schema_data', $entity_schema_data); + + // Rename the tables in the cached field schema data. + foreach ($sandbox['updated_storage_definitions'] as $storage_definition) { + $field_schema_data = $this->installedStorageSchema->get($entity_type_id . '.field_schema_data.' . $storage_definition->getName(), []); + foreach ($field_schema_data as $temp_table_name => $schema) { + if (isset($table_name_mapping[$temp_table_name])) { + $field_schema_data[$table_name_mapping[$temp_table_name]] = $schema; + unset($field_schema_data[$temp_table_name]); + } + } + $this->installedStorageSchema->set($entity_type_id . '.field_schema_data.' . $storage_definition->getName(), $field_schema_data); + } + + // Instruct the entity schema handler that data migration has been handled + // already and update the entity type. + $actual_entity_type->requiresDataMigration = FALSE; + $this->entityDefinitionUpdateManager->updateEntityType($actual_entity_type); + + // Update the field storage definitions. + $this->updateFieldStorageDefinitions($actual_entity_type, $sandbox['original_storage_definitions'], $fields_to_update); + } + } + + /** + * Loads entities from the original storage and saves them to the temporary + * one. + * + * @param array $sandbox + * The sandbox array from a hook_update_N() implementation. + * + * @throws \Drupal\Core\Entity\EntityStorageException + * Thrown in case of an error during the entity save process. + */ + protected function copyData(array &$sandbox) { + /** @var \Drupal\Core\Entity\Sql\TemporaryTableMapping $temporary_table_mapping */ + $temporary_entity_type = $sandbox['temporary_entity_type']; + $temporary_table_mapping = $sandbox['temporary_table_mapping']; + $original_entity_type = $sandbox['original_entity_type']; + $original_table_mapping = $sandbox['original_table_mapping']; + + $original_base_table = $original_entity_type->getBaseTable(); + + // If 'progress' is not set, then this will be the first run of the batch. + if (!isset($sandbox['progress'])) { + $sandbox['progress'] = 0; + $sandbox['current_id'] = 0; + $sandbox['max'] = $this->database->select($original_base_table) + ->countQuery() + ->execute() + ->fetchField(); + } + + $id = $original_entity_type->getKey('id'); + + // Get the next 10 entity IDs to migrate. + $entity_ids = $this->database->select($original_base_table) + ->fields($original_base_table, [$id]) + ->condition($id, $sandbox['current_id'], '>') + ->orderBy($id, 'ASC') + ->range(0, 100) + ->execute() + ->fetchAllKeyed(0, 0); + + /** @var \Drupal\Core\Entity\Sql\SqlContentEntityStorage $storage */ + $storage = $this->entityTypeManager->getStorage($temporary_entity_type->id()); + $storage->setEntityType($original_entity_type); + $storage->setTableMapping($original_table_mapping); + + $entities = $storage->loadMultiple($entity_ids); + + // Now inject the temporary entity type definition and table mapping in the + // storage and re-save the entities. + $storage->setEntityType($temporary_entity_type); + $storage->setTableMapping($temporary_table_mapping); + + foreach ($entities as $entity_id => $entity) { + $revision_id_key = $temporary_entity_type->getKey('revision'); + + // Set the revision ID to be same as the entity ID. + $entity->set($revision_id_key, $entity_id); + + // Treat the entity as new in order to make the storage do an INSERT + // rather than an UPDATE. + $entity->enforceIsNew(TRUE); + + try { + // Finally, save the entity in the temporary storage. + $storage->save($entity); + } + catch (\Exception $e) { + // In case of an error during the save process, we need to roll back the + // original entity type and field storage definitions and clean up the + // temporary tables. + $this->restoreOriginalDefinitions($sandbox); + + foreach ($temporary_table_mapping->getTableNames() as $table_name) { + $this->database->schema()->dropTable($table_name); + } + + // Re-throw the original exception with a helpful message. + throw new EntityStorageException("The entity update process failed while processing the entity {$original_entity_type->id()}:$entity_id.", $e->getCode(), $e); + } + + $sandbox['progress']++; + $sandbox['current_id'] = $entity_id; + } + $sandbox['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['progress'] / $sandbox['max']); + } + + /** + * Updates field definitions to be revisionable. + * + * @param \Drupal\Core\Entity\ContentEntityTypeInterface $entity_type + * A content entity type definition. + * @param \Drupal\Core\Field\FieldStorageDefinitionInterface[] $storage_definitions + * An array of field storage definitions. + * @param array $fields_to_update + * (optional) An array of field names for which to enable revision support. + * Defaults to an empty array. + * @param bool $update_cached_definitions + * (optional) Whether to update the cached field storage definitions in the + * entity definition update manager. Defaults to TRUE. + * + * @return \Drupal\Core\Field\FieldStorageDefinitionInterface[] + * An array of updated field storage definitions. + */ + protected function updateFieldStorageDefinitions(ContentEntityTypeInterface $entity_type, array $storage_definitions, array $fields_to_update = [], $update_cached_definitions = TRUE) { + $updated_storage_definitions = array_map(function ($storage_definition) { return clone $storage_definition; }, $storage_definitions); + + // Update the 'langcode' field manually, as it is configured in the base + // content entity field definitions. + if ($entity_type->hasKey('langcode')) { + $fields_to_update = array_merge([$entity_type->getKey('langcode')], $fields_to_update); + } + + foreach ($fields_to_update as $field_name) { + // Configurable fields are always revisionable, so we only need to care + // about base fields. + if ($updated_storage_definitions[$field_name]->isBaseField()) { + $updated_storage_definitions[$field_name]->setRevisionable(TRUE); + + if ($update_cached_definitions) { + $this->entityDefinitionUpdateManager->updateFieldStorageDefinition($updated_storage_definitions[$field_name]); + } + } + } + + // Add the revision ID field. + $revision_field = BaseFieldDefinition::create('integer') + ->setName($entity_type->getKey('revision')) + ->setTargetEntityTypeId($entity_type->id()) + ->setTargetBundle(NULL) + ->setLabel(new TranslatableMarkup('Revision ID')) + ->setReadOnly(TRUE) + ->setSetting('unsigned', TRUE); + + if ($update_cached_definitions) { + $this->entityDefinitionUpdateManager->installFieldStorageDefinition($revision_field->getName(), $entity_type->id(), $entity_type->getProvider(), $revision_field); + } + + $updated_storage_definitions[$entity_type->getKey('revision')] = $revision_field; + + return $updated_storage_definitions; + } + + /** + * Restores the entity type, field storage definitions and their schema data. + * + * @param array $sandbox + * The sandbox array from a hook_update_N() implementation. + */ + protected function restoreOriginalDefinitions(array $sandbox) { + $original_entity_type = $sandbox['original_entity_type']; + $original_storage_definitions = $sandbox['original_storage_definitions']; + $original_entity_schema_data = $sandbox['original_entity_schema_data']; + $original_field_schema_data = $sandbox['original_field_schema_data']; + + $this->lastInstalledSchemaRepository->setLastInstalledDefinition($original_entity_type); + $this->lastInstalledSchemaRepository->setLastInstalledFieldStorageDefinitions($original_entity_type->id(), $original_storage_definitions); + + $this->installedStorageSchema->set($original_entity_type->id() . '.entity_schema_data', $original_entity_schema_data); + foreach ($original_field_schema_data as $field_name => $field_schema_data) { + $this->installedStorageSchema->set($original_entity_type->id() . '.field_schema_data.' . $field_name, $field_schema_data); + } + } + +} diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php index 8031830..4e86435 100644 --- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php +++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php @@ -118,6 +118,13 @@ class SqlContentEntityStorage extends ContentEntityStorageBase implements SqlEnt protected $languageManager; /** + * Whether this storage should use the temporary table mapping. + * + * @var bool + */ + protected $isTemporary = FALSE; + + /** * {@inheritdoc} */ public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) { @@ -267,6 +274,31 @@ public function setEntityType(EntityTypeInterface $entity_type) { } /** + * Sets the wrapped table mapping definition. + * + * @param \Drupal\Core\Entity\Sql\TableMappingInterface $table_mapping + * The table mapping. + * + * @internal Only to be used internally by Entity API. Expected to be removed + * by https://www.drupal.org/node/2554235. + */ + public function setTableMapping(TableMappingInterface $table_mapping) { + $this->tableMapping = $table_mapping; + } + + /** + * Changes the temporary state of the storage. + * + * @param bool $temporary + * Whether to use a temporary table mapping or not. + * + * @internal Only to be used internally by Entity API. + */ + public function setTemporary($temporary) { + $this->isTemporary = $temporary; + } + + /** * {@inheritdoc} */ public function getTableMapping(array $storage_definitions = NULL) { @@ -279,8 +311,10 @@ public function getTableMapping(array $storage_definitions = NULL) { // @todo Clean-up this in https://www.drupal.org/node/2274017 so we can // easily instantiate a new table mapping whenever needed. if (!isset($this->tableMapping) || $storage_definitions) { + $table_mapping_class = !$this->isTemporary ? DefaultTableMapping::class : TemporaryTableMapping::class; $definitions = $storage_definitions ?: $this->entityManager->getFieldStorageDefinitions($this->entityTypeId); - $table_mapping = new DefaultTableMapping($this->entityType, $definitions); + /** @var \Drupal\Core\Entity\Sql\DefaultTableMapping|\Drupal\Core\Entity\Sql\TemporaryTableMapping $table_mapping */ + $table_mapping = new $table_mapping_class($this->entityType, $definitions); $shared_table_definitions = array_filter($definitions, function (FieldStorageDefinitionInterface $definition) use ($table_mapping) { return $table_mapping->allowsSharedTableStorage($definition); diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php index 96cea9f..b2407a1 100644 --- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php +++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php @@ -229,6 +229,12 @@ protected function getSchemaFromStorageDefinition(FieldStorageDefinitionInterfac * {@inheritdoc} */ public function requiresEntityDataMigration(EntityTypeInterface $entity_type, EntityTypeInterface $original) { + // Check if the entity type specifies that data migration is being handled + // elsewhere. + if (isset($entity_type->requiresDataMigration) && !$entity_type->requiresDataMigration) { + return FALSE; + } + // If the original storage has existing entities, or it is impossible to // determine if that is the case, require entity data to be migrated. $original_storage_class = $original->getStorageClass(); @@ -1204,10 +1210,14 @@ protected function deleteDedicatedTableSchema(FieldStorageDefinitionInterface $s $deleted = !$this->originalDefinitions; $table_mapping = $this->storage->getTableMapping(); $table_name = $table_mapping->getDedicatedDataTableName($storage_definition, $deleted); - $this->database->schema()->dropTable($table_name); + if ($this->database->schema()->tableExists($table_name)) { + $this->database->schema()->dropTable($table_name); + } if ($this->entityType->isRevisionable()) { - $revision_name = $table_mapping->getDedicatedRevisionTableName($storage_definition, $deleted); - $this->database->schema()->dropTable($revision_name); + $revision_table_name = $table_mapping->getDedicatedRevisionTableName($storage_definition, $deleted); + if ($this->database->schema()->tableExists($revision_table_name)) { + $this->database->schema()->dropTable($revision_table_name); + } } $this->deleteFieldSchemaData($storage_definition); } diff --git a/core/lib/Drupal/Core/Entity/Sql/TemporaryTableMapping.php b/core/lib/Drupal/Core/Entity/Sql/TemporaryTableMapping.php new file mode 100644 index 0000000..b0f01e0 --- /dev/null +++ b/core/lib/Drupal/Core/Entity/Sql/TemporaryTableMapping.php @@ -0,0 +1,45 @@ + 48) { + $short_table_name = substr($table_name, 0, 34); + $table_hash = substr(hash('sha256', $table_name), 0, 10); + + $tmp_table_name = $prefix . $short_table_name . $table_hash; + } + return $tmp_table_name; + } + +} diff --git a/core/modules/system/tests/fixtures/update/drupal-8.2.0-filled.standard.entity_test_to_rev_conversion.php.gz b/core/modules/system/tests/fixtures/update/drupal-8.2.0-filled.standard.entity_test_to_rev_conversion.php.gz new file mode 100644 index 0000000..b04239f --- /dev/null +++ b/core/modules/system/tests/fixtures/update/drupal-8.2.0-filled.standard.entity_test_to_rev_conversion.php.gz @@ -0,0 +1,650 @@ +ցXdrupal-8.2.0-filled.standard.entity_test_to_rev_conversion.php]isH^Bᘈh/7cm 1D*! Il2%VXv֗*ryܓL%nԿv[㡜io7w_8t һm2 +l7(빎S\Tzj>EZFNiC*h"*u]`Q)C8b(zF ;wv$䏟߾:``:6Oj쬁o?K_CX'YV |},NkS . +#?Ol'eO/'O|}TC{N͆X=3}<d@Kȝߖ ȤUfXnͨ2}`;urJ? l3";7g7Zh {ӂ]t)9TC$DzXeC +;Vq7taPJ('Q.xآ`|Xu2ȫ( Əh^}[2#tcS# h[~XS+gbcp{*L9$T]SZIBS14PltwۄOlR7(#y{hN7[39DāWQ&bPODq0]8ⱝR 'Iw<~[/Dq>q<}n3%[D&bƿZ^O]" ygD!q׍p2L-f}1TV4Mїqt-JעZHֿ OX&Ɓs[ꆖ4DpN4ɉ%S|'_&Y!7XAD9=6E Ëkz{! veJC6a)\5haZɇ`d U2L\1Ńc%UR ?cb-0l +Aro[Fwmt6]˜t³\?n=ѿ V0 0:b$酳H女ATFCYiMDPJ"(,VΘGGDD'?3rD;.« M㒑F4ψv2)t4Fѻ!+eD! +|}t_1owڅ]^79p/3|(2G +%.rΉ~PratlHf@`DzNԑw.*Z݆6‰c -CMVQDT2ÇE Y36oj<'ܜQ '˳f:MA32g'dE3-׌4'k&+*MHiU8P#w6!ndBbw>-t/e- @k0ֆjrP81RnA;AK/]9cŔQ#aGuHru&`}@`;y >dT<́t36n3꿮 7YV7Pڐz]X_}Dy%7!!0:7EVT\_wO3mn볦ɛ<>, +I:G :k\BU(ώ89>2_t҃odK-׷,.5ܸ/V zT/h5nS҃,fX$"iEZDV,boG("vLpWr]ig +լJȶZZmg6?.z7sM X@ӂjH)fMUT]g.mAjUXbYife;+a<ս)F{bيe  +-ȌLkا VXYw)R *>,7ODjp#Q$IU8.0__ +]?}T{^Iv%<2:L[0Fm1]xlo(j*CCC${3!,F='@f\. N}E=(G-l^Nt1rWo!ĮDO#l~҆Iah-j2H/ +>dKV/ -3BAR;6_ju-b=un/رTqEz}H ۛC\%J:C*hA`U@Cu +u업]i=B\.cLw|NSMSڴjS Z)`or)fM.LF+TiA|)PSQ:5g8y~0M5˙%?/}髝brNa`a*٨GjT˳fnaGa٣a/dkܲ?n ӄ.ӊSrp@Hl-Y~eWWHXHE,57h:pe yq=䤋nAzS[3b 7­\N??Xֱlij MQu`Bk3=Z!MK\yM&KiٔOr & .|ݺ14 E!vEDrÞ /f=ÉؽFgZEor7-Td3B5xt V4Z4ZC#LҎQ#QDo1W껯3HQ/a9>Ia{6LoW}>WiҴisj0Hh PI%ۀ1&1`knhvZfL)g~fAlcvq`qԿrfxw9<8?܂w~ >Ŏ;27!_vLZ_svi(^ߎʤ+rlq`ƍ4PJ*` Vj8?ʟg%#Џ{`lݩ^SK5\[])##mѐa6aiֽ9_|É6{ 0tR=yo9~!{`8$ zMc7:v/ IC7fn/. ^a@CkS >+B%72zBS Ǝǔ'-4Νvx:z^ݢBui )-<^T!~KRiܙmd_5!t>^3+tyʟk:#_kfZZ +% R +!R:Aj0X;4kcj k)jk֦p["nxkoҡ#i'"F0aZ²qc,>8<_iP'3/ܗ _/Zvٵ kSخe]pm +޵9%tk'y\Qo^ANA9Ѓ[  +yB3 6Zy0o l'|;usB T)1f&d7vPmO\X{' *t3xl,i1)/5r  "4*(SF5?xRE#6UtB 7gcDgy]+g +@"JPh^}wͺyaU,ƕ +7v r~#MqNۍnF2ĽoAf[GI\iIstI>{0&Wﭝvƒ>-6 qH$PV#_ᴢ$')s'ON{KY`ecΣҞUPCҀhD$ v*[ ~ӵb+)U%spCa1LZm]+9?)I*:ڐ~Jz)i/qlG}!R5=  +B]oۉaJJ{3F L 8e hdB#(8lԌ 9  P>WU?^E3e֚I?6Sneɑr/hxWD8r., +d$ +%,Pf=:8lOb_WfA+R!e'(!)W |Ȉ.8 sNwAEuxoCr^ M&s݀uڝAY{2YHB D=&HRJxµ5/2S*pCq[l8h(wA8Ж fP +LCUD<9P>MBH *<}bH?N ,[ۀkftPvOHvX)bx +TI冷m;];Xa1_EjF|aZ`I} „ 3$ZK|lq8{oX1xX;Za,W(@|sE8i *Xm]>Ps7 +k?ur (};ɭ}gvݵl {=7,# oc ʂވ +ȀJ'JH*$+U7%\.KtyxVʅ8r ,EHd `\FZ:r-9|V"h%''!Ps!w+ #$ ڪùs}saѱi-B<-u0Da)[k<ոh{tMN飽:`Ǐak[Z۠{A=<37W."/>b^/ )X3!B;42ƞ5!X 3 ^c :-FV +5 n%bVCO8/C"A`F, |u] ꯩ@Ƈ%B +YoY,΁kiI @FDS3 >0EX!2axoyDC`!B** uzB %j  rƱxgSӹfb+@@daD>1irA!:#,˝ҹ/1;Bop꼜z.(947|0GljbV E75!^*>m>ѡeRB6Çvm@`0(/a !zZ4n.Y4l_튡c16$V2>b VEBbkW“{i3-ifl}j\&寳VL|}p"- +o nf0C-4Xn oZ'twx.߮v6> Nwû!e2w\ImYHf-%_-0YSXO88^ ]R5VQo9[ ڴBETC +.Ƿ_[G눝}E3l[ft NDzxNoBztoc;} O6Vƃ*A0 +j[eHJ0Z_2vu{|.n;I_v9qj*f/a֨s҅SNdVϹvf,b[ !42罐00cC!MGv~n/ݞ׹}wnNؗlagAʳgz.-CZ0`%V* +184dPFdugs9&?ѷ3+toS~|hmÇW>"r~KR,7ua* +`U8&JkYr,M.%hssdŇG}߻o,0E2Tz=+"N,1Bc 5VspQeXt4/ű:{_3G?.=x}}1$,cѷscz2&(bn "^CcAXAr|]yrhsHudpsus=}l~ܷg?ܒ33,6t9#З0qג3V,HCV'DڂHh0!F_euy~IN?N;wڑ:E@&~}o6apto^̟`V|'uTm@( +z"hD@BW1b=D_^i w6"ĭii})z9cGz)a0,iQeuP#rukH +,eph|ݏ:> +~=[>w57M4_q*UܪfےiSE:eH2n$NaU\&lRw[>|6,_T_v uQLܱ{Ŏ>h;k~l~j7?o~\-4\SR9ɏ:]O],N/ݢ f?5K ?d}sШ=#4 ?3+zo#RH}GTB#tN.NbF]s/ߗ:KoŔĨ=N~1fÜP^VZjhviD'hj5z5ᾘ +"XI`}l4S(Z2#+eފ'g:UPsݴ.O.U TwB1=;_~ ɝ%\_ +*⡄)]O!'9@8SiVO͈ {-ӷq,aJT)T 2(` 8J'jWkUAlĴ"%BO4-T`6MMC85h +[Du;hhƂa$m$3<5~^_XOχvz4z~yQ]'"l3]IL)ObԝmqGyOSc5L4+{|6H֣nTٷ%zg$K_ 2gG_f\ܸ&S4^’++q+~hlAԨw[')jH1>u@Ij "(CS ZdtdM2EhLkbI}9{|iix{v{fv߽hCS>+bZ +fTdIWkB_nCZ#uq}]\׺Puu]~u/B1! +4dEQ6gF+Qm6|EW۽ͦ1~j[tv~~q=9Gp6C%W[QA[RFs&0ug[i+=vnb4Ky࿍=3H71зY9:*R *Y +`C$$H"YUusCkކyއzzU^S'S >j9؊xB@Z!{WܿT,0er$DL*Eh& Ӡ %9ΓQ[x;{ jKemJ9 CF;0NЁ֣xbc.bAƜ  ;gUN `k˧I9&h gAcw:!hńX+Po0DJ0>_Wk/v+.h5ys(O\嬽K$Aɵ_Rz3dq@9,{`FvuFІIB,Zʡ|$q" &4f[!Y(SQna!$diksDFP&'.\;сw4'_ +M9lf ^a\w&MِR%~Žv.l2;wXLp%~oeyLK4ISg05&4dS^EXO4ߚS^:I?qGjp)^U9QZ²4r+g#:4*_]͐q'uFT"QՌ OH!ɎWJmd (5S3%yo_AKNӮӤ0f* gJTDH0TxS0(9'@]8j +sGOnTlii5UnNɈs"!KF^wXv޻T*E2 oE^e!$<ꗼ&N^s﹊JZB514X~#A'ٜvt**ߝw37G!N &ʎ1œ͎aޣs~_{C5U>CY hFiwT;!Ms~mf8rkֽ%g޻I37վӬ)dfЅa:xݞaOS?8S^ y Hgb]bv'fۣ. ZM\-+U؟A]v?c/M %Qñ}$0$"E$?J[H,Q3d5h@OHH:U1|\BE'@hTsXOa8}HC_[bxe4b'PJ? (? ++<6,NV:m4p<[/?lWfx֨JUKddgKds[eA 'TXO]5(KO)7Ƕ9}Yy* MS{_ʫ`1덹cۇ\yT f *'(Afp&@&S)XHDx&n\:khٮ=72&2@V^Z޻) F4Ͷ;CI {:"NE D@b,eĊ ++_MRhUzio?~VAFp%^Mq #C-ݛ,ߊ.2-LBلdɒDU \pj:+F B1'wZ +~V O|ѹv=tflSf=+(>;o$a#!@QxHjYؐ5 P˦Ld^UkSѦo.}FvT\gGi.fDƺ:6gYtJyciFz>W{[T:^be,24E#C5\^>Ҳ3]a#/h6^\Lʅac[Չ-hRYϿSڞO=OE"gv^EsWs&yE[PaqBQ"sMԀVGTsjiJArr?"b9F0mޙ7]$xV6)VH +5Id@D"-{4EݚtkjQQA/: >.zJڞSJcgfUWJ2˫{s)vv*~(teboф78z%Ù I"Zi0<' ow`5#;mk&oܔ360t&Wp/vVJe#LgԲgG!6 Hr!Bܭ e>ew韉&>:KmYl'mIv"P&~8/9$mAhA@ NVbtt9U÷Ϭ%n{󰿳(9kM9w?D>%6s%8Z֣"xUy54U!qT z0lyr>Ȃ'?:\u^ ኛVќEoV | +$6?\ިd'B ƃpUF#MJV. *G'b-k}dWM4{pelB'd om*OUHBU.d9F'O(Чc3em:›_C9 XR+wU%"UОg$F߆ߧ".{$?Ϙqmx4˱[`ĩ=AfM4`r+̱'0&T 8ꍤ|`V3}.٩N]FlFO]Y0cD-ٹTك8R +Q/x$ClanpMxO#9}:&nn-b?i=]Î𾚿 +0g*]ܐU ,CTW7Y-GriT1)j@x `BUŠE8>k"nI)2̥"MH^͘+_J_xB~eܴFopfW +X3n&ݐ; CI~67@!fg;M—D[W=̱s[F/”aGB}Ozh<GyAƀAbg^_:$pWOUQfP r!7d")!RxSHm92b֫l9K5"E"Us(;5;f}H.RJF %ӔM\IXdn|48kEg<s0Ftv'ŸzθwXwCG#i._x{#`}:Pb tY=-Sۗ=$'+z p>K[_n4igق Eyɽc7z VXO" A% 0o AWk^ zh'2/ys?ts?4_z `4q n[Fy{S&d5eʼ,D{)'W\{gH#+Eq&FVcrwO{ϻdA0y&YFA +eN ݸU6*ۛ;h'_'czP /:ƻ䈁xNcy8( `)"Q7=p4u\˄ZOX/VB/?[r]mhR>qZ7$l8=A^d,jqh<@TZ +T)i-@te-i6ɀ4^eaWq[“YQuS<%DLj2~(T& +&kbt'sn1pٹ; na7~| D asAywMadȬDS>^>2WPeea&[f|ksRS}I~Ш$|N=Z]*.?4NMa9wQn 1T2X10MMUTCE$#ti&U\i^~ތdeNJB1tդ@\/1yo!d ML̊P:A rxeRc*x0 zÌ+ {8ck<LG2F&h +)XA +dbI-doٝSVC/]vlkrb;ͼ40zVӓyF7JI,ݔK\<`6ٻud*3T̮"\V B RTQ% @Rcؑ|CH ke?\l˖Onk  qP^[O%f.\-ݶg(S,2E21߫|z/9wϽڍ*ݼϔ8tR[6Ͻ.Eh=F +b}))-`[.??MydJ +OF9u*L, M6 24' ZNޘcGnӏûx_xٵFwΦzT랅 TWAQّ)ysls{#8-MɆVꅒ%y]yK'QJftnmpluCT{d4?(~f<6tbȘZ+љ +yqscn*١C?yB&B]%X`t gowijOʗa^ϫetmsV:\`||= m86y0cb^E}UӰpګׇ^!Qsr|tUa2zƵ8P\Z;XMV8Rxϟ?) #H!:»}-&>/wR`u>ȄTo9Vo5ceOon'޷LBgΠ?7s;<惡4Q 6Dm9ǵ\ނkRPWݭ+^}scm^N]r96ڬ)–3Q3)pcjwPL撶%ҼMIJJ(*&TjIL2@X"T0 B>Ojz6tl8/f%{]l;`D&¤czF9cr~[V־~\=\3uon WSH 0v\/>03M" +ilSM2T \ XGK$޻F{vqkjԬ OTv-}i mP\48Wͻ-QHmeռuCmm=/ԯ$4ϮNe\ -ycS/3R uiKZl 8q=O;i϶Gy +U +e601@RM;F͸ntC3hFe0կ17guյ4QѦrvŸ9vXV*w4+Q_Լgā[>r'[a1<0ȷ^30q. wi(̇GJ'zT6˗JO^Vh /doGĩXPuHQB%@dI¢Ej)FO;+%GU_;ji9[>,ԔD +ͷcP' +)f-ye]d&JFH +&PL.#o "IMs3Y4bINJT%R약?35!5lL0 +- @4yz&@ 2EZvpփͩp~bmA(ӛ*ili?|#h-! bZM>aB, (CUt ɲ,$ vX"&C$a`tHc@4*biں@_6d|xN S|Sgdj;S܉f o >AN41 $H̊Ěp+{BȉC'\{Y)Es*6M`Tlh(NF"Q5Kj^v3] ߙ_*^G f^yl+̻JGi"¬+0:^vSN\^TZ⋈FNrK5|NBcd꾎 m98 OŭVe3!V*E]T x!n' DL&6\ qɗYl ~E)FaZXW Kf*n + JL R4"U<~f*ZMLsIeYRy6mɢn|7uNO1 H% Lױ,GB KcԞ@ϯ/=mϧ{'!f, XeF L+l:UMSdB]>:b;O< Yf^  JǤ Qf,2I7M`B +2t0<=v[]>V#J#UD؂\K*.HJ~?_՜od 0N[td2 IǕ=-| +1KH+0)yv_[}y`cJPebB0S%b A(H?Uq).ǣnX3p MCXbH 'EL@QVD(o%Ug/=i¯,͆~`ƺ>Y&XܵIHT"IPEB` "+-n÷w$J C.<i!P L +  rMB.#t0OI2BKr%|u 8D2,CZ}h"Ae& }yFWmnu\kJq2wGxq6hr+pbO" U8?nj=lBT¬u +dGQX<~+O5lBkw9hC3ېnX6d0@ʗag*4C=c@{mrY(!;H/AvulRT=@geYlvVM/x3jږM;:K쬓,DFZjQLt(h@W&d]HD!%*ΒȤGy{d5k:5Vg)aglbTppoɟ[SV=2'ܠî +wpcg "A:#|?9όwg9w2]Ugy>B׸zoUZh~=nW5y+~ٙze(פ:t};Ўv8,3O2xJY ޚK\>]À04C(E8?)s$F2D?¬FM4s@oJ{ +ukп^^ d/WwU)٫qIqEtw@]wJJ'$ɪ:bI}=O&gE()ܭFr+ǽzȼ:(#[{%!ɽk׻JRqo#a]Tn=ڬ7+c]T[lEjuqyVzLsPn&$UXD@穁毵$W jGDxV^oz`-5$ ~H-cwjܗ:Mӫ!-IAͤ<=OZJѮk"@ LA,$#h_]ةXlu!GύG+'BO]t +f|7@r:x4WYӠ$1Hz&#-8tDl0 6*x 3Qe u,emn8'OnCxj_vb<G#XMl) aTT(PDQ'3 C#S/ਟR?DR? ~./Ey~uoN/k)=/VtnѼf?S?Sp #>m!bɟ U? ࠮1pr^xbT9* ߊ]PQooqAm4)\ՏoE֜XA]$2HDP"DHW"*cs]/*]/f?.Uw0k* cHJŇ#N(swZV{mkLRCe?Q[?J&wzLSZcuCA`2ay{1}( 0aJs #OTKF6^̻NMUzIl+yIuʬt)vG ކ2Cqx`}a D6?ۙASk{ch2/ (!Uy i.->࿢*2U "U@2L5A=c WשCZ^_jU}V~Ncou[gwcdu]%Rn(0v*Z"W(|*bK|M8ZY:8QҺ +\),RLuÍ>~P +q>\ʧ6c5N+\枖j)޷pd֯e L0֬ +#wxYXt]Vni*3IlѠ_kD.WDӋ5ϝn Xg͞zf&hI$ rGU3 5|_/O$j?lgjTBZO\T` JEI㩞Olwt W%KG,uWk= (>z3jܶmY>g7vŹnvR9IT^ݑ wxQ;9o'%%O,L%`90L0)Etb +6Dt+kTzTF|kE&bƷG=8 zr*cݍDx$1w͉#IN쇝tv9 ؎PT%IHVInv| +UyT86b3TK8!< $؝@52_19N։e*G-U9\J *i<_&p=OJ+iG LViŽN4vg:0rZ!xr~ {mvk~Iԁ*.vxvxsfq[`%_ X@`X(0|:cD-Y4YA6_vkJ+6Eۜ@k7ߎIv$j~: M;}5[{_#38%nEh;Ƅ>[ޟ%F(+ Ui +&ɘH%> UC;GЙ.p&/LGs+bT'2W;(/͘P{ g,C ~0JPWCt `ʒʛkb jXIˬ 2q|`mJrzvHӳd[ %BYe 6.X⏪p2R«5Rp_‰c.Z0@h4nk[~3i48΄1f?ڡ(,u6s3PDQ$bMgO@I)$dTrQΑM'|fИvۯ?ˡ l89M#70t l_ ! V4ÊO#x#{=wI^Ma9IK;N2*޸ SޡۑqB>Q2F~{|<?HFN1 +QfdUI޲g9Qؙؒ\3 >F9-KՓ +$ 1xM&CFEкHCYwGX/|z`t .FxrdaC-Z==w_?'wjWLN\`mN3irovi)>'I@wrw5ZiOÕYo&%`LiX4Y +8[}YYʹA[A߱0N6M }.Z2gU@XYq:lϛ]7DpqPz`d9, +ЪabU'#%\~jF&@e:xGtgBMb;02}!>$ͻ;E:`?vjag^nEY &^$]KHo;2)onיz!h6h+1H/iٻ+Bg롶l*X [P} +`xٖ;$N v! +RN_%άh؊R}{s}^K|.sQu19$3ʨ8PKgs zUWq- XĂ؎\5Td+eߗu2R +C*_pYž/ƏY_F7X;G|m+7YA\eYNݧzTNZeE~hg.IJ_n#*6ltq&V2\ObӚQɘMe~m\KEk ^׺~j-SE{K/(nfq 60yʋqme./;v3P$exٛ%ʓBUء; 4S#E!)sV#ӳ܂~.sܐcwas3gEM?ΔGH]wg'1'˲\ˏl#YþꅓY)Ԗpa:”YlϹULjTVTyYax#` +@QO.nj¹A)tꑭ*<̧"QyΜQ'HF,p le U NGKӘ+#l)5X{8d0 }Uhp}*e wgϥ[SN GG~9@3`>DƁ(n}#>9[wDqH0hEm\3]7)NAe1u&FZO01¬w015d}$qz y<:-뙙:)@N/&YN΁Kk{̱ !7s' +N 22M2@dFȦ( PRy ù*lQ} r5wҚ( u[S*8c +e~IU{ sMb( BDQ.~ )uLG^)[5yv ]jl&^HB8k6(Q h:NjǗreRѽE1B^GjaFNf/[MMh%1?XGWdo}L"P$%ok&W_ZMTfӔ,8l@oj ~sغgBZ#]x{bcd'#'HUN>72-Y0+8OdpWlFϜl`qaSaW,w f;OG +YQ- ¿K|6Qƪ  1O),ﭵiuׅ4@SC[˫RClء˛~)Ug qoފ̥̓LXy,K{s-^6eH37S: ,vBofiUI.o}̘  Y0咲gY{F+T~r)c[$)cIɯA[w?~u=٤(Y=3nvWU׫ [Xyp"'PQJ:Z}[m_=Պ +"|-ۮ grˮ*n\1ԩ@8X#Vb8, +ɰ뢛$.TwA&8HfáoBhm n11"AP=ŁQ+=&avHMִ5Rԫ,ZUǂ]Va^JlHrFC^%XV 6[ネ EC*qJkKG5ţSi׆cz\2S}Rznk_Z<>ߟ?~?q~k*׳aw{OXӨ @bI-F,fAt%+ڮC>hFi! +B-ݥ +!”brpUyT Q#U^sH@`pYH[i[$u<1` 9 DL" 9ղB>ڡ rv +^jW#(=`䩉Ǣ] C0+ȝ"\1R`uxff4Wȑ0h(}vu`6vhhJtO;RUפwwdwO#F8u?XZSG*cLKi +k3bf &%UQB`^,0E¦tfR[hJ ȔA>"+zWR*9r:V P0} 5Mt&ӱ][NSV3 He@k7дAFhހդAN`bb̓ toP Xl OfboxS=۲^~l}﫽5D9 j +pMj +(2 +jI + 8x3 4o@j0RAYչSԙ ?@o$x)h_i v=!FU}lqQhE]"i"Ni>Z.M^=-_в &}F]\TϮ:Dqt!p9#DpJ+]&t:,]upYc"zp*$m܍8Ռe"Xx'贊i h[$T 4A4(`9;jЇ&[Gƛ Aʲ37 +PUEҭLk>Vri8,2PW;6,0A''IW45HKm!ޚ!$k.C(}6Bg=Eg\q-KH !0 ~Z#S<&DXKXLaU#q`/BÁ#ʮHqiABB qFUL&ZLшIޘpO/ɶ'.A*!d;H3"u6&[A]==f񒖛SgtWxAoBLZc@BO!mS7m"^X*H𺰅UBj*aXb>-Q)fÑ +vXT[3H5Kբ4pќe`F3RU=ԃی]{B2/MPqD4zXΩ {P80J˴& _xxһA? ,ga;1 '<rO@C`t9a ! j@8¡LAe<{`ƒ.O+3gЀ Cƀ%# +Mx%tQ/M8 9r}Yt2IK&0[SRՇb`d[V0א.cq0ScٮE4{6̀t>Ά|EglB4UPLDʱ ˈ ăGlι#7H=&2b"Cߕ\FH&dkj,rƙJ0?4}RaBy(@N?6aZLw{#@Kɯwes@l/"'&]ofpY+*[B\Ut, +q 7YӧЕPWA,<7Cέd8xH Vz阋A1h@c%$PM"ҰH7B1ȑ6@[lWƢ'2.ŧE-bY/F*׉R ҝWzLJ&7+RW +d1ĿgqGƀ\xI|`zs(j[$/ j rtdw-]llڗV~*(Y;a֪#֟{7x8; F7+vmeeހ)nn"&oקΗ[~^q=mվ~Az?РoJ DUv^< D^}Y} ya>LYjiW8fif\fw:5ح? qG=n9Q\O+O7#z2\73ȍ,_Z}=3Hk(rj{I֣ 5rp +T(m%5A0;X"#Y6[wpk +5!" yCh޺Jrk6CMr}qZ5nZsab +aw޸i[c27= +>89MeSa@`PRoPLd4A<9v ץ/X4Jf@Op-R-lYjusJw'W-l1"0- +lc="PԊ)t'z(;7^YPFc'Iu՝%Es ''\jie#ܲ[M@3Ak]Fo6T!vZ ~ʩ +9>wq/_?{lJs7.ncoԟ]bzɪtY2f"װtdp,[\kr3*e2d"!HSUZg̽mJ{ xsI0],UQ-׵,(vv)T$R;˃ ٩RƷˋL#{e-{|g?$8,pe^GZR,I]x&[r&LyتUm؈)y:J?0*1'Ǩ&|"1j'{ 2b+i5 nAwAo E0J俺GW^Nw/z'UIZ?ؓ}&/G}Bq3sOv>,&$g?r?ˑ^"GnRC_٭/sI{2kG~O8qyY̽\.C P8_A([{7g-ng`x׭k7~ ׮\nyF/N\/h. vbY/P4kTBtiۦ=*jkl-./Q4WTa+K/A̳hjwU+=J9H?UG{rڹ-#z}<._ޘޞ1lq"*-lMNy`Iwd3 `4n^tQMK=]eK|V?Kd% "=+3%@1%;x&7 M&;xVл-n g2΍D6*RXtmțcl0 +ۊ3)ҊXf|[Y&ܿX 0 pF"vYrJ1|9 f ~8\%%=9ʝ[RSs?̼Υ̕ OIdH`V$.RS~\?^7@~Zej44 p צ/lJО= p/.Fݨtd b^/ uqWс2YSmrNeuenuHZ~/BYfW{qwC~pfuMoOqW~;J?Ud~^UabH?tQʬ3tUc#+{?nIm6H76> v/.cnY\tYUUeYU5ػ;L3}!QE[jꕦ7epe oJTC:,t=ڳ=c MҼNe,Gnsܲ;oZF:ݽPLf W#">3ǼH)>3֜=dWȩeed% 0qʋ2q~h(?4*uf +HY^PPӘ58 0Lgf%h ]LJ0n5=x$dNK@`7ݶmg}_8Ϛ۹?6h's//%ӫvNӗQoЩvt틽+o%Xmy]+{ VW&n-i剻P}Lad44`XR }qo NlUf\QK3OFs*1 YRZP Z >=gS"r94 CT*ܕ)qbuywz=@S=Y/M%;z}pދ"{^h[,Uog5rqhvoU)WWWmv.gUn8FbKhW֖ݴ:~reK|eY[;}&# Ć58<ŷt!alB}:? Cկt4]A^t=>X~KRZLn▓8v2G7 |~U_ꞞMnL|) B&E O2Wyr +W+Q6ކD'i1&%.˕Tـ ]NJn5[$1s,wϛ*(3TyYUj][Yw3y9wN-ޛW?eyZ"Oۗi}ƘٷbbzҼשZkV_hzHR&a\+1Do5FFH_(S*ng<(3q^n&%EfE[qG^ 6R"!n. W7wOt??$ݟ]éGy}#si7Rj i*CMi,F7vfVQUoQ̧3m/u֔yjO.sxpH)­ZvltFRz_y5.b^Ip n)^6?. +5c_!;;e=d׽g_z]1ncAͷsT~C`9b͞Fm}{/7Wμܨ`d~hhd{ff<ԁeH16guϩ Z#JO25-tw.]w~&A@ e%7S"lp<`3ǫTʲ ̶qbOzl9sOE\]Y/2͞9[en9eytl HPغ=Uʷ'}00^8+iwLUءm~SȫYjtxjd9{h"[l{~}=8]8{Og+T|e8 RF ./՛Z-{eOi)WpC\Cy(_HcM wcd'|̱Wy?a%zSٛoE||^N3HYX]~0E<3zxozklg6p͑N[񃬼 m7bݯ~1UX}Mp6MqO $(q{,XWY"y +j"7%.Z +Ǝ(H9#Z^{LF@,OL_Q쬣̩)U)U[ {pz!/k%vY\lɌYO_\D㎝t01ϩB"wq;.՝>_= +X9Ŀ˿|7?|q76ʹ#*;br +_#pL:돟]1Pc ꛟU%_.\|A#!8Y~( +WdĒuj>#[Ο㷽3-WMTkB-&%[sˏmm_QPW(mjYu>kAJϏ1 +Foyy$ q%:j9vp_??m>{_ȋ?pjg>pY|xĠK]ᙡ}ٓj#5ׅ1w Hc%v=fP +Bͧ ։2jS'~pܠիM=O|8rR9ϫZ\`Qoz߭w"5'ZT]9oW tx-rZzїwGWo=BͦHo!VQsuχͥ?vU+Uا}ݯy{ѹJy{>aRsJȳ; +3R)a;:bVqgXE̋7 T@˽:xֳ^od5uO-|4z͜j";3}]0Œq6j1-1~sgD3Qđ澉c1Y3䘸s4X3jS&&ԻT(ͣˍ_4ˢq!.A΀1Uq3=`(]b Xgh1F_0*D+f_1|Y'qb÷Y.._GDt?;r.ig֢\X>e.czOBا8wݍ}#[{7f#1m.1􍫋}@'D>?WW-x1ဂ[;2\r*TM][mf,zPjQ9RKorGl6X٠&=,v^dއe8JM]TD?jJd\U%(/]U2HxfW,5Ir$ +ph,L6{ǵL +b{ }( ߤ<^8U%\f_\[lARoV+^\6(<ԗ]7Uu[nM+}Νוjn߆$̺+xFx%S]"5Z腶堼Lb6h4vYwYY%i`>fI4Af3<,m.UIn_m? E7,\.h\b#ɘzV_g/d*PmlsbV_0 㭟Ů-vϔa]fQjS׉i2a~\,4vRYVлio*^SѿvŔ4aWcO1g9io k:kjd |f[1ds'ekȘT~0'+/k1^x].>q\GW@XBQ!-fCnvoV]狩ZLbS~Vӵ:-iN:Am⍼d֜Ь\;-{1<g(j8m6|Z2AgJKFK;-+Ļ;{>+=AABFxXv^vaެAG%opxYEMv+=z- y#1m%T+nkQߨ"d`"Ĝ3 zVyޮ|sǮP).T@;7-Kwm{xW#Q&OKlQ1=o|W٨MCPLaMӪN)&AX?8 ggDw\ +enUG6D^^dvjW_pVm}T\_܌Tq4Tڃ*GPO#(^ϏSn8yOWEgG1}[Ɖc%9-q0wѡOu\I%׮.P{Y +};b򲿗㱝/Oy\]bwֻN oB˾7aR߲|*O_5SN>_}G:dã׬?d8}7Qݭok~5]{ʽxSp0\8۩kg qnUIYO/k4v"/[kg[wx~ղ_"t[;n_EiqZ$؁3|>^&˃W"-lGAϯ5ߦZǑl_ѥ9&I7g>{|ܾmIR'_.D]^9Y?#a1AvXYFh#en4k<0h+8^•&$g<陽~~R H3نI^OIοɾ6 gZkn:Ͼ0kɑñMdpz`@tmyƒ  fVĿ˿|7?|q7L ߕAgWss3c[q#oeׅ%VG"-Q3=5x6י#9dыy7ԦplOz:>6a&\Y?ǭ7@{~ӬW:aʠ]=amnD D6t($!`/^x:ըϪ;ͩNYr~wWx9i1S-=iLr $ ޕ:=];<|AnP4SkN-Y-cJ3Gn3*y'MP ,lzΐs^o4\b5e/Cus{ٰaB[<`А4MȋkKS"8~#X:2W~jߜ`i"q g`lG/޿aP%oI{6)xA@RƇ=7Vo [QXt5_jCfEo +.&o1y{& +" S?wp/KqoT}4. O.ٚks{tOU.@e:1Nt%˾V.݂fy؜0|cWO#?.|:Ļ#ϲ{w*W!P])<2C֓-iw- ٽO#ٽ5ձҏ :on:Qgr"C B7fԠLyXS)`4}|tAK=N cGe].? ^m7;w0G+=c.vsOӰkcX<%cwʟҗ'hYnŒO'"rrȿLFONM2hƠ\88B P)e?N}NYInWGȶ +燎]#[gKܔgLM):+?}ݟo?ۧo"/vn$| w?X5?&# +hf7~p"z:],)r{܎|QBewc YFDR2\tysv/!+ZK?[#N#Uvt qZn8Mz3D*WUa|TC6[q㯜,wL{MB-qQmϲ~yjEMu=@qXoNE}2Y22w!s2w!sͽwV~GalAS=U_{Qߞ.ڪlgPp9jhw5/[[i4aNmKϛ˺sGA.'C؆e(]JA}$s|9v:kJ6W _BU)?=Y~܆ϸYa +"-Ey+J]6A +1 -UF? #nfK]cE0۴ +8K)e)ҺZZe=/)xb(LBl9[_,EI^Dg{:w_~|_}}ŗG7I;k=n?W>?K=Ȁ~1懟Zlw*&_UzXQݛϛ鰢UCe|N݌Q6I޳m+UMM_:U)sV9_tzXdM~yOfscon}{+2}Ϭ] | \jkȈIf,Sf3yXާhj/v8ZJ0bVԀd<11;;5]/I_x7sĻb/?A^l~Wv4F^^婂=!̈́A}hMVM`ECך þ,4׾@fX*IL5YZ-U\Ը%Pfr*!#hHb#gmf["⩽-#:8 ѰU]b÷LÑʽ$D]]Vtxj& Vce b]AI3YxVlq +a <.3TSZúwiX`x˺3̘LA[w8@1?{ +b;b| bh{Y.m~5@Pj!&<uy͚ŬfIxfn|(fs_)AQ]sUr]MʢI}5FǾޞ⻶`}P}|~9B!I,|SU#6ѢLCܐԖ.~ܰ3ؘ}^rkKYu"\Hꛕ|:n+`M"oZ~Xrٚ:MDl pzdQ.j4!_ +}6睟{aMYsSj#I*l!{)#ZwjII?b<i5O sULn+@7b2c=ډþROpUĴXfQWa* ~ g~l˾ڈl <{؃1{Pǐ_/fm/h:5{OOGTu +y(9ՇOG.րwi=+ڜ]!qΧJcpw\.{K`m]4Tb'=?,/2O@ݭ[^<N_U7K ==䇪dRNCE0"gTOݷd8vݙ'xd[׺R*z?%;njgQ?02+Ylya`[*b+I$|])-lĚ +:*nukP[] e]o'몌v.]X|oU6^秧~%պ~Q˃6Jp]!}]9mt\5ޤYchq[٘sWO)W]]i^#Oܬ+wźvLuum=gm 6Բ_u[i)͎[dփUft 4QVUͺfJo+O`Zн/EpN~+AUlN%Ԙ:ݣmNku;nV^w׽f۾w&Nt[VNGuc)4L0w&܈Eg?kjWxk +=6o9#?68>o&9٬r]iA/Fժ:n'w>YU/гopw',fhGc8|M?1kn({C}w4goFwm3 (g6Q~p(;7ߥvvt%>[wQ>ze.=qC-fTg{{d)q.հ ӊ=3Ï5LGWaD&kh魨NK}L0"5,'Ӣm rǴ6kY3s; 6#ڃp7T5ja<}^U4l66|klX%Q:h=jӾ IくZ^ޑ|:5:2_;]هC'd_~p̈́ +m /D Lpwmp^Pຉ@\z ՝S͏MnD|ς*u4<ۡ-ynʪ/a;Y)txZPhy~Gk/NC(!+bߊ"\;i5=?}aw⧯C$I??za2+\V~V:ud(.tjMXaO퐧۷<Z]EߔvOe=>%?d{|K3>;|%|0|ޱ͍߬ﳽsp*Lܱi*s1(Θv}ϗ<_K| him;tWabNvGh=1n}ޔ7DylЈH6J+b{ެ޳N6NoW1'zA+ +de,6=:zMgOǛG\ϾX>pД&L@<,c8ʇTogl^K42I/2L4 wKB o'*&>UDU^rf^,7lS +Mjw~\̙[hj1BST~y5lUʊ"72;n(Q}\似2r^Oi=nvAA_l&>ͧ cU#yчXX!fˏӞoB{R뷫a%~H>dÏȇnUyM-"+?E͑*-{l&lotS|H c=QN'ldsP8aLvYG Mi\OߟrsX\UQyݕ;W,}6o4HD6ի"s|+bdaarP DQbkyi +ɝ$usa8Ɓ[)NJ0Łqj呗~fy+,i`V\[q喓]DnX$HIJs#s<ʓGN87,nE`i@ Yc+Jb Q"Ցfq8!fEgyIZd!ySORudmANLVŎLlY6'6#Z̳=+^`ێVm?$ߵsJmDlVYμ4еٍ  +r[E=B00pp:*2A@V˄GKFW$2n[pĞaeyfqHJ߱Us% M=Gt +{⬈ Cb,ր4r, YT8GUmk@,pH0;Vi{طUGݶi`b"m٩GIJi$8&MB6J8vbRj~d IhnUWttb? +/;@8 ݶdn =s"xA ""ȏBNUm [4HuVr/ƉSր C׋m+sb2G8Byl޶8)"X~dd!*̬pq$ Pud7nN +&+EvMiLHudM|, c'y^/T{8a^ ", E>K-Rmk@`#dFqCdFT.щ(H2WYfE$E@>J0MȎ&t7Ř0SչYĘzda +е +oJQչ7<&C #dYQDz=btX5޶^:E[6&K# "KC!Gv_XZ.Q61YbrQ*mk@;kYщu,7,Ivu(aFvD,!q:Ȫm Ȋ,%`cDODm "ȼDvJr  eƘݶD;Q@,SddIA{$ANyHU7ր!!XqlҀM,j#u p2pAg*P"1+#m H3D'kD؊2DF|ȴPmk,R{Vyb.F̻m .r}2(<+)]܈X<+mk^D<Ⱥٌ2P/,LbUKݶDD'K6'^FbQaeažCu.58:6#,|G'>[')XPNT:}! #[vS'KrWuo[|l3XM6dc\ 7γ,T5 ~F'k&v- #٨N߶4K!x.K)dV(=|@v'Bٔ#X Fɀ4 2$끲Oo['*g]iH}ʉ,ݶxmʣtO =$UM|4r ʎSj`'Ac Twu5 q"ne#GZ`d^ʼn:fiHĕac{^XqnQPmkB"[*TfM琽ր{iNFHVe6!#͝0 +s=#y@Vm+S2YQVNF~e߶8ȷ(i,vb[v|9(G\%y RHlcD7 +hnEcd[(|@J5"[+ΈXxq+iրHB:YpE!?\eݼm C4x/=GEVt׍+Dmk@慛1Y~ +zXN4M+mkqm*7ѣ8%@xy.q (YyvAV'UN%IUYp%8ԣ$>qj9K.!JUd5.z%MGdi|U7Ƃ\;1ΩR@ sb5YFNERв]x^^ř·SdQSmk@c?GOnVBCCqD6UkgmkETgRdzR;m/Ns[uu +n[dAoeLB9;5/ɦ< 7p瘧VB'ͨH55]ν^DTc0 +m>qUGݶdoǩG":Cq0 ѭgCĀ#[⌞$!8'̢ѭ0 SDQq_l_g5 $krByAMO؎ݶm:If =O#ߊoEdXQsǎTy5#~YLF"=n:YB4uLߌn[ ;YAv!.,9]meݸ(+5<׊0-?}cOէn[p42/9G2F!}7JUэ0dFvu=Fhi0Sc߶kZ\\z̋AEL4U Ǿt(Y#,Yv !!CZ7!RP@˶84e֓/ +Q7M}oS]h7$Wٽto<ɂ +d274N<\$T()gvxN}V?8򳯿VMt + zN:ߛ!7J V!bg/gFl`ޥ'T^/HFҸVxq_fD[vuMb7>?rӳ.M*VUU`Y iJG#*{|sf t 5333A#H͇fMQ[5EqR5 Gof\pMQVSC(ǭ8)Кqf73)RYSVMQhMfkJ"55Eq>nI33sfa5Ej>4k|ܪ))gf\ 5EGXM͚8j@kJșy}3kJ"55Eq>nI֔33f&a5Ej>4k|ܪ))Ms2U86<%0(7'G9Tp lt3DLE?kJ]kܜ֘{ՉY@<}%͉nWpn8;4R#7'5f"*_ub5G;lO+u 1rs[c&U'\cx$*gWXcDLDN 7hhxz_K`3ů:1#/Գ8;4R#7'5f"_ub5G.;lO+u 1rs[c&U'ZcOϓ 8+u G)7'3)'U'\cx2<%͉nWp&dO?_rNtkTτG<~ApWXcDLN e#x_K`3:1/qv9.5FnNtkDĀk _F?9ѭ1q1<~ApWXcDLN e#x_K`3:19.5FnNtkD@k㗛/փ+7'kNN ew9.5FnNtkDĀk _v!8WXcDLN pƒT9ѭ1q1<~م]x_K`3:1]߅9ѭ1q1<~م]x_K`3:1]߅9ѭ1q1<~م]x_K`3:1]߅9ѭ1q1_n0{%<%ݖrsvˉ8ՉAp<%͉nWpsJ]kܜ֘8ՉAp<%͉nWp^{R#7'5f"_ub5/{+u 1rs[c&U'\cx{R#7'5f"_ub5/{+u 1rs[c&U'\cx{R#7'5f"_ub5/{+u 1rs[c&U'Zc0_n01WVc$Dƨɭ:119.5FnNtkDĀk _?9ѭ1q1<~CpWXcDLN e cx_K`3:119.5FnNtkDĀk _?9ѭ1q1<~CpWXcDLN e cx_K`3:119.5FnNtkD@k㗛/j+u 1sYcTVQp>sJ]kܜ֘8ՉCp><%͉nWp>sJ]kܜ֘8ՉCp><%͉nWp>sJ]kܜ֘8ՉCp><%͉nWp>sJ]kܜ֘8ՉCp><%͉nWp>sJ]kܜ֘8Չ֘/7_՘WVc$Dƨɭ:1?9ѭ1q1<~9x_K`3:1?9ѭ1q1<~9x_K`3:1?9ѭ1q1<~9x_K`3:1?9ѭ1q1<~9x_K`3:1?9ѭ1q1!_n01!<%HΉfQ[5Fub5/+u 1rs[c&U'\cxrR#7'5f"_ub5/+u 1rs[c&U'\cxrR#7'5f"_ub5/+u 1rs[c&U'\cxrR#7'5f"_ub5/+u 1rs[c&U'\cxrR#7'5f"_ub5/+u 1rs[c&U'Zc"|aTc"x_KX:'jĀk _ 8WXcDLN 9.5FnNtkDĀk _ 8WXcDLN 9.5FnNtkDĀk _ 8WXcDLN 9.5FnNtkDĀk _ 8WXcDLN 9.5FnNtkDĀk _ 8WXcDLN 86`n13pQVkE(˭<9#o k<'H΋v͙ko~ƹevFG#*{|hqM +fefԎeܢ)j2 5Ej>4k|ܪ))gdnhA HM͚8j@k + ٘[fF-vRSC(ǭ8)К;!z&料Q;~qЬ)q(N +^efԎ]ܢ)j. 5Ej>4k|ܪ))܋4E-vRSC(ǭ8)К-)j,n"55Eq>nI?™3/̌[4E`H͇fMQ<Mq*tQ;Rqv}N? lt3DLE?kJ]kܜ֘{ՉY@<}%͉nWpJ]kܜ֘|Չy@<%͉nWpJ]kܜ֘}Չ@<%͉nWpJ]kܜ֘~Չ@<ݯ%͉nWhA<~ApW8RnNtgRNN +u 1rs[c&U'\c ϟ3U3_F?9ѭ1q1<~ApWXcDLN e#x_K`3:19.5FnNtkDĀk _F?9ѭ1q1<~ApWXcDLN e#x_K`3:1ew9.+͉q1<~¬sJ]kܜ֘8ՉBp.<%͉nWp+u 1rs[c&U'\cx R#7'5f"_ub5/ +u 1rs[c&U'\cx R#7'5f"_ub5/ +u 1rs[c&U'\cx R#7'5f"_ub5/ +u 1rs[c&U'Zc<Ap<%ݖrsvˉ8Չ|aVc9.5FnNtkDĀk _ 8WXcDLN e9.5FnNtkDĀk Bx߃9ѭ1q1<~ك=x_K`3:1=߃9ѭ1q1<~ك=x_K`3:1=߃9ѭ1q1<~ك=x_K`3:1y21<%HΉfQ[5Fub5/7_x_K`3:119.5FnNtkDĀk _?9ѭ1q1<~CpWXcDLN e cx_K`3:119.5FnNtkDĀk _?9ѭ1q1<~CpWXcDLN e cx_K`3:1e9.a5FrN4kܪ11<~¬sJ]kܜ֘8ՉCp><%͉nWp>sJ]kܜ֘8ՉCp><%͉nWp>sJ]kܜ֘8ՉCp><%͉nWp>sJ]kܜ֘8ՉCp><%͉nWp>sJ]kܜ֘8Չ֘/+u 1sYcTVQpf5WXcDLN 9.5FnNtkDĀk _ 8WXcDLN 9.5FnNtkDĀk _ 8WXcDLN 9.5FnNtkDĀk _ 8WXcDLN 9.5FnNtkDĀk _ 8WXcDLN Ƅ<~9Cx_KX:'jĀk _n01R#7'5f"_ub5/+u 1rs[c&U'\cxrR#7'5f"_ub5/+u 1rs[c&U'\cxrR#7'5f"_ub5/+u 1rs[c&U'\cxrR#7'5f"_ub5/+u 1rs[c&U'\cxrR#7'5f"_ub5&sJ]jh9UcT'\cxrY9ѭ1q1<~9#x_K`3:1#?9ѭ1q1<~9#x_K`3:1#?9ѭ1q1<~9#x_K`3:1#?9ѭ1q1<~9#x_K`3:1#?9ѭ1q1#o \iyѬ7r(OÚO 9]s&:<9=ӧSo>.OOD}w!Oq?qk +ӎm+OH,,2rV$l.e=4JΕ?d!:<1":&iDƁ-'g-6N%J <1&:&DƁ-'g-6N)J <1*:&iEƁ-'g-6N-J <1.:&EƁ-'g-6N1J <12:&iFƁ-'g-6N5J <"16:&FƁ-'g-6N9J :&GƁ-'g-6NAJ وǍ!c$2A7#'g-19H)a#Ǎ5_@IRq`dY sRG67\&Tƙrrւls C8HdorrւlƐ1 F 8)%lpd1dD&9HƁ-'g-6AJ lfi aJvcL; 4'pl[)Y,Yy@D9yEDs,C\/#Jk~9CR#a78h:R:P84BdR"t KYL%š":@c8j2l*)o ñSgSIqh|/h: JC#DEuxCpՙe UR!2X :,éFT^1SufTF7Ȫ3Ъ84BdU '6_;G6誤84%ot‰pt2*)otq`>:誤84BdU '"U4誤84BdU '"U4誤84BdU '"U4誤84BdU '"U4誤84BdU '"U4誤84BdU '"U4誤84BdU '"U4誤84BdUNl09誤84b7‰;誤84BdUNt GWYFW%š"󍮺$wJC#D]uyDpt՝etUR!2 ',FW]^85]ug]F7‰;誤84BdUNt GWYFW%š"󍮺pk82*)ot/U2etUR7‰7誤84BdUN GWYFW%š"zpg82*)ot5]UuUIqh|/zJC#D]xDpt՛etUR!2 'z,FW=^83]f]F7‰7誤84BdU '6_ +`UIqh `U 'bU<誤84BdU 'bU<誤84BdU 'bU<誤84BdU 'bU<誤84BdU̽UJC#D]żp"6]ųJC#D]żp"6]ųJC#D]żp"6]ųJC#D]żp"6]ųJC#D]y cwi2*)i7‰?誤84BdUN GWYFW%š"po82*)ot}UUIqh|>/JC#D]yDpt՟etUR!2 ',FW}^87]g]F7‰?誤84BdՀNl0`UIq胈8! ',FW^810] f]F7‰j0誤84BdՀN GWYFW%š"pb`82*)ot5`UIqh|/JC#D] xpt5etUR!2j ',FWC^8DYFW%š"/JC#D] ypt5etUR!2j ',FWC^814] g]F7‰j8誤84BdՐN GWYFW%š"󍮆pbh82*)ot5CpUIqh|!/JC#D]x Sf]>H"pbd82*)ot5#hUIqh|/FJC#D]xpt5etUR!2j 'F,FW#^812]f]F7‰j4誤84BdՈN GWYFW%š"Fpbd82*)otձyS !%чUl1YY%(r"GQ$q*x48xag @ΐ>ph]Q fHpHB8e ^Y4(@3$8dⲀr/1CCJ!. "\,C\"V,C\S9 + +D8 )Y,"J,C\R^G4 ġ1&.pp# ʉC#D-ux!BpԙeTR!2ߘ :,æFN^1;uf<F7~384BdQT:t QYR%š":c82*)oD1UgAUIqh|/: JC#D]Ep"2]EJCQFW/FÉ!2誤84BdU=i4,FW/ GW,FW/ GW,FW/ GW,FW/ GW,FW/ GW,FW/ GW,FW/ GW,FW]^85]ug]\FW]^8 'j,FW]^85]ug]F7rMg2*)ot]UwUIqh|./JC#D]uyDpt՝etUR!2 ',FW]^85]ug]F7‰;誤84BdUN GWYFW%š|/荆5BdUIqh|/zJC#D]xDpt՛etUR!2-$j,FW=^83]f]F7‰7誤84BdUN GWYFW%š"zpg82*)ot=UoUIqh|NĆxUIqh `U 'pF2*)ot‰pt2*)ot‰pt2*)ot‰pt2*)ots/k2}s,FW1/ GW,FW1/ GW,FW1/ GW,FW1/ GW,FW}^87]g]4]yD4"JC#D]yDpt՟etUR!2 ',FW}^87]g]F7‰?誤84BdUN GWYFW%š"po82*)ot}UUIqh|>/JC#D] xpt5etUR "!p‰h8Q#Df]F7‰j0誤84BdՀN GWYFW%š"pb`82*)ot5`UIqh|/JC#D] xpt5etUR!2j ',FW^810] f]F7‰j8誤8ADBpF2*)ot5CpUIqh|!/JC#D] ypt5etUR!2j ',FWC^814] g]F7‰j8誤84BdՐN GWYFW%š"󍮆pbh82*)ot5#hUIq胈8! 'FDetUR!2j 'F,FW#^812]f]F7‰j4誤84BdՈN GWYFW%š"Fpbd82*)ot5#hUIqh|/FJC#D]xpt5etUR!2c7@B:#J%'2 +/~c( JKD'P#/yt?ͧ cz?]zS}l/K.vՉX|\K6S)=mW/ox=;n9M'~}|6߽9Wެ_.>lt9^ϾNmˮ[֝o^+:FQE1ÝގvI|k=sp";qSkrw?F:ӔZ~ga'esXލN)>=YfTQ\$@|x<ć33LB=ed>_$^ ݘH쾄B_a|z82]c +5nȴ\.dKf}s[ǚQO~|Wu>yւoƻ_ 6g BQѪJb.uoYnVVfWK?cמ/(j4@M<@^*UqzZ`Uy~dt[UXUXizݪrϥZU!J[U!jWXUкVwRNn*Ҡ.VuZ^ܣVUVUڬ.VUU.۪4ŪzU׭*UBU6zU-2xźHZ*^nU VUVUڬ.VU>U0mUEbUŪN Vc#kUP*mUͪ^bU@XU^֏ ^VUA-V5XnUiiVUVUڬ.VU!U%5mUEbUŪN V)kUP*mUͪ^bU@XU^n ^#VUA-V5ZnUϲVUVUڬ.VU䐵 `V^* bF%'^L( Nuë6z }A.H<+VpVK( e[[-V pȸr\ Ǿ.IWSTjK}Mž "ё{5;e_u=-u" +Wm XbP)X@WB$a9:iXB-걯K"(RĠ*o_av"ȅHrtc9Zc_Q*`_%eAU޾¦e]b_E rf Ǿ.YSTjK}Mкž "EёhOjQ}]ҴF}Ֆ%Uy +u }A.D#[ў%Ԣ$lMR-eK 6ih*\-GGޖ=qKE=uIݚU[T+l5.U;Dґo ΁%kj +:-K U 5.U[HGҞ%ԢoMR-K 6h*\ ܘ,;Q*`_]e,- ȅB:FWžNR-K 6h*\-# ijQ}]F}Ֆ%Uy +u }A.Dґo Ǿ.[STj}ߺž " BZc_Q*`_oAU޾o]b_E to![B-걯K(Ġ*o_a󷮁v"ȅB:-%kj +Wm[bP[@WBo![H{Pz뒿55J쫶-1Wk]r]-WG=KE-]FuE}}ë6z }A.D#՞%ԢoMR-K 6h*\-WG=KE=uߚU[T+l5.U[m,iTj}ߺž "ՑjjQ}]F}Ֆ%Uy +u }A.D#՞%ԢoMR-K 6h*\-WG=KE=uߚU[T+l5.U[-W{Pz뒿55J쫶-1Wk]r!\[-%kj +Wm[bP[@WBo:\[B-걯K(Ġ*o_a󷮁v <[-Woߚ+U U 5.U[-O{Pz뒿55J쫶-1Wk]r!<[-%kj +Wm[bP[@WBoy:FWžNR-K 6h*\-OG=KE=uߚU[T+l5.U[-O{Pz뒿55J쫶-1Wk]r!<[-%kj +Wm[bP[@WBoy:<[B-걯K(Ġ*o_a󷮁v"ȅtoyZc_Q*`_oAU޾o]b_E o Ǿ.[STj}ߺž + Coa[X{PZ+^FuE}}ë6z }A.D֑o Ǿ.[STj}ߺž " Zc_Q*`_oAU޾o]b_E uouh`[]O}U[T+l5.U[XG֞%ԢoMR-K 6h*\-# kjQ}]F}Ֆ%Uy +u }A.D֑o Ǿ.[STj}ߺž " Zc_Q*`_oAU޾o]b_E uoa[B-걯K(Ġ*o_a󷮁v"ȅ:-%kj +Wm[bP[@W[-_{PZ쫿oMRi*Ui*Wmh*\-_G=KE=uߚU[T+l5.U[-_{Pz뒿55J쫶-1Wk]r!|[]#+XVb_'B}Ֆ%Uy +u }A.D#מ%ԢoMR-K 6h*\-_G=KE=uߚU[T+l5.U[-_{Pz뒿55J쫶-1Wk]r!|[-%kj +Wm[bP[@WBo:|[B-걯K(Ġ*o_a󷮁v"ȅuoZc_Q*`_oAU޾o]b_@o:[B-j55JW.JT^k]r![-%kj +Wm[bP[@WBo:[B-걯K(Ġ*o_a󷮁v"ȅ +touh`[]O}U[T+l5.U[@{Pz뒿55J쫶-1Wk]r![-%kj +Wm[bP[@WBo:[B-걯K(Ġ*o_a󷮁v"ȅ +toZc_Q*`_oAU޾o]b_E  +o Ǿ.[STj}ߺž "+БhjQ}]F}Ֆ%Uy +u }@n +o žK(n_(bPbxf_v"ȅ +uoZc_Q*`_oAU޾o]b_E  +o Ǿ.[STj}ߺž "+ԑ5;ou=-u" +Wm[bP[@WBo:B[B-걯K(Ġ*o_a󷮁v"ȅ +uoZc_Q*`_oAU޾o]b_E  +o Ǿ.[STj}ߺž "+ԑjjQ}]F}Ֆ%Uy +u }A.DV#+Ԟ%ԢoMR-K 6h*\PGV=KE=uߚU[T+l5.UDV#+Ҟ%Ԣ-[S}TھAUھU}ž "+ґijQ}]F}Ֆ%Uy +u }A.DV#+Ҟ%ԢoMR-K 6h*\HGV׈6 +׉P*`_oAU޾o]b_E ߊo Ǿ.[STj}ߺž "+ґijQ}]F}Ֆ%Uy +u }A.DV#+Ҟ%ԢoMR-K 6h*\HGV=KE=uߚU[T+l5.U[H{Pz뒿55J쫶-1Wk]r!"[-%kj +Wm[bP[@W:6DEeZebŚbc#;T[Y>Tͬ ^ hګ],|!RH/Z,d.&5Y%krXZm ]xU)]WX/yt?ͧ >fǿ~Wu}l?*6d]L})jJ&ޖ/Ov[~Gnx`y7ov;vGOOWS| R:t6߽9"EGz5koٝ8}|i1.~zg0asCO\wDa#^RhLdFx>k$?ڞ67e!]1vP+TGC|x1;j_>6lYՑW(M(6+fOM~5")bZ[ԉLcMs!X?7gzx{>xS~;8CR-2Kӑ:0y]ZگL`۝Q(Lz +1CSڝ̂b+`7mX;vD0tg;B>1fG7VĈnޯqb8lkLRލ-:H^;hLmĶEݕsƑl;^mİҹ2ğXB &.6뺖 /6@ r7/K)5xv5palO4K,'C Ԋ"p]8a v(+?7OՋ){y#G펧Mۻ3&NWNjyRXȏm'wc7 o( "pXv +BiaY4/;Ovsy8KrKLH[Q{Kц ˨ +DXǻ<=ײc?"o$Vgl;q\ns5Eዤ" c(uqbsQa箝ELagt>'8{wvɘ zanF1Q{v8 +#3da\"gr<)?t$vEK,p8Mb+b +ݲGNB7ͭKRbR^Z!IE1h|CA#*m+ 9*\ UHuHj'۩GV!aarKGcq^C(!b''>=/B7Ԭ[H27!6MBbc]leJ#ıgj@S88HYqV@!n]4P޸7gdK_̲yVp^Y!9$얯ƻ4X M܅a{mYIFtx𨩣şS~G 7Ǘ=$8s~GQ'ُ..~8dup|H'fgd"3INl_t=|j r7$6<%/GX8!y7/ƈVKVMb@3?+RB3Ic/'Q>4+g"d oSbrN"B[$kWN!!ބe;q"8^Z8v(}&_x?rOwͮ'd[7&\:ȱrUb+Fcab籗Et\by*|WMKE+#ʓ4p<\ŅD!ߍ$..plQY^L6Xa\V93LVNjZ}1'G.{naqX(2'F~'-X!y)Kf쏉RTƎ8a꒯.{.P9|A!ev³"_:$xahvUT6b>Ƒ]"F2dm00Y ܻbw aSm-? iG5O ɨ\Ш=B}+u< ݨ(/_UD ,GBvH(&A/GE҄gY~LGmƞSDU\AMvcJ(InQ\l]tZ薽)&0eU.6ʼBqP9.KY@V"/W,BiM4LD'j$" ĔNxj4<fEbiO`e eVɺA/1K}_};|x}ȉ<'#J%їhrCN3upBC!JmJ󻞃oHERiQsRr7NB^9㒽e _2#+kEGd2Lv^@vM!,Bn>ҟx'x'ǜN?Gx5W>U0Hsj*K#!,=<=$e{M)r.isGoT=ٲ_pu͕o HWc+ O!|#u(`:wgRAh_hGf`D (\o6z"Lc\qo!=JE>BduL~=Թ^U"wp垗Z!mz p!Ό_t$h5( AFϹ:R+GQJc؏/(39|$ƙ̊Pf[_a{Yd_mtQftidE&YlXb8bit9*=%M- d:`w= ߡGtcd籕8ϋ2쯹 FOvzV@4"if)rSapVZt mQ|ltijG~[9ٿuszԈAMPVEfrtFϞXLv- 0g \s0:E!*h\XD=.ąK>6>رS8.=7yNd,qY2k/B_<E9NERؗSD0G6qJOvUE[Ӭa5O4vqJfa'C ת:C/pH8N|?u0Iv"}4xז93ؔDMc?,A ݡ|UEx&k^ƙc5H#Bk[IHԡH0Ğ(OVrzO?:Ђ-eԧX."s}bD6Yd!b;Oķ/rYǚqZ<6wHslߢg! (VE텉]8': KNd9 %6=WO60aNg'OCz^>R8O;-^KĹb/{/j +8%7/{tr ⌓ma$dN&R^W G]-\=>qDӰm9lֽyd9 ++ħ̿6^nzBW]w2z?$4!ޅD>o вeor4G(Ɇ !ʐٹ3' +˙ȿo֦AF$}XVS"s0\+-qdk*"N痂""'nk½*JICOSR9M0!b)rGFgo-g~fN"l_! []klŽ_ohd+2yy\L $1<%N+UH;)h2$iZif88.+wV"$pȦq=){n %a~9}\"@;($JB:#~\[vEd\>L7Uu/վ]?Jr;(d_l1AYh2=xnl]9>nEZΎ+iG(SdD3֐plx} ]B$ E)&+>r9;v'x3|ۣ +\4"TV'(es7{پegGcJVdzc|m3\ |ϝXnv#@(scWa٥]z=*Yo.Y` 3q4lWŒzCfsP=l$ΉiQȥjF'܉˅v3v&c='ޅ,3bN\D k{of4^}3u~xIꤖGv/"bӂ4r:#f<>‚/Rd 0&kY應'2Es,Mَ +' +q<|5p\Xpb=Im[%K*w9ӝkJ_dE8~вtGѰ0tc;&:Clň!_gtoD4"{gӃ*MX , '. l2/e/U_+_}j嗽 E.v,<+Y +,EL6+CQ_==gZR¯EI&VhuA2V(cعze-{42ah!kBvM<"rBb&9!In[1BR[VGaxg_Z@]7~DE89qK\VbM”\ vxj w/eMzz:,#Zߑx>YY![ +TiիRӢɣȈMEs,%* qH.|gcX0e)ԝz9*|7/PDfJV)+Öz_f]x%Dl$q[4nǗՕ3&LINC^뉧J@sJ_iϒo4ɌfYAZ4o>P3(@.IEOI69l&92h'r *yD {8$UH5!4M-$a@o$BYyAŶ&M'A\ 0*&\)deɜΜ"-7:ۀ+Lc"X"d$ 8cRY^o鍨NOa)1V#z`cIvjvK㖦_4ɵ7]Z~d>=8@A](.:{GA)1QG'IX6D!+'+ g@1yYPP&K)2+ ;aRr("Oi*"MܬH2єeO_yĹ 3rZazYp싑i'|k/(YNH,/{8//Ndsfi{sGK:Oア6edND1P4*_ZfEB,?D-0#{zh>sqQDGi 8,W*Wc\W(qBQ:8Y-E0"0MWjDؤuwtdǖDҙ[5#a3zIz95_Vc< nrZlzަGlmueo`CvR?ѻ0: dQl!a)"+5_{"M*Ҥ$r4Ux)&˾wʱ!zdG^/XŠDg_lD,eB&Z"KKٵv6i!u2hlnC;{FeŅu8M8zLqg@(ʋ +"hx6/ ++uGy\k{V~ڧq"~V7ea!KW G +4}ҦYzaD/e;ū޹f{vvOݕ}ټ-ԍ;X ^ܭ]\Gi3?"d}h)Sd^+%&B@! +9; (w*!;&eLx)pB;cNG+$i7rSǿ2KqsYL7 +2+wh>rBQe@H\>~IUx߽}9CYm+ z +=LYGx:Ĥk/ pZI{X$_^Z\?=@&g +qxGABa wdNVI/]-NVxw 0=[>У-Lzv( }tK{C/I&;hӐrӒm76o^Uq)NA|;w]H5B1 KZ1<'@Aaot;7d%ˆp!h7b8卨Ӈ6=ɡ +r}aD)b E('%;ȽG6:h?0 X*eORD `!(liwAFqhaZMƋcbYw+dF|7:$X<ۥ 6:^I8'HZ||z#j#"YM<~37'nM7݉|L*aT'+T|<d۳FpncZdkViYbaC1޾>8tfPW=,|VLkNuX|=y]fux٣v<ʑT!QjȗN둁kP}JCT55VJ_nןְV(E|$%NP.f 1}={ų'<۸.a/>,wfA{?buЉj vTNÛ2Hۮ0XOdpQ:/U}O,!޲z$VLo%7=yq6\΄hz__杖J(ZW+R1hV]ƒ)ج)kCE Qvs-];;p+4 ^Ѩ/YS 4_!/3+qc~ Й1eoMe8gƸu:Ur:X'e1=liܼ5OͫVۼ +kjrQu R[uYY||K=g#P5J{Al'nu.J,>|":Y۫i{HUC1]*ylȃrcA(E_ږPk8*v~7oO+Dѭ|7ԋJP'*&miOqd~Hs5`FfIt8,.ㆃˆyjzf[R -ݏ胥)W̃͞2Ӯ y_/T)UUO3u +zQr0NaOZ`'esT?){!ޑAwt6@J=!}vxuW' +:<_Lre龮yrלN~Js>DWePsݚ|>F]Ǜ]Ό'N0Kwlԯ0b=G5ӍV߷{W2;K.ј+&3kRK tVp5Nն,V煜';~uD*XH04S0YѫWҔfBlR"F&[^饼(YNhVwZR`o]Tn yOĘ=T3 H5<9[ѕ i#S&u©tY?[gqhԴNx$wU©v>ϵ1}+zum8:o(EͧE- `mB[197SC.w%ƶO ʍ+X3[XO͎@o4GBߟU7aA7{7 0ۡn__4@Rbk|1r 5lO^^1ы.1]a3QDj# 2t +wZ>W\T"y3k۾mws ZN* rpLM0[o^V+lu:h`|fS~ޜK m,qYw>{Ɔȍ-Yff vĖ EN+I?)u791\2ѳ) +?<'SFL }Xc†TYoq^j3x/y/db\c9y.4tL͡; +^VcjmtGy?oa``aʗ){dPIK_3RYꏱ"F)o,ߵY 0ז>4QٝB!Ez֊;s7YQ5^SR7ln5Z4ZQE3^i8U:_}Wت.sȞktHnE,L$vDM$MMdL؄Vb}/a)/ 2"&/>t Kr4#7~o0g9[[:@'~BH j1dwlux\o|y!i]eZzlj 2JU*slGmo48N+¦BݫWUOp;n޼a1 +o[jXYZAUN'*Ę|_F qّ?762*ƼTA9!޶f4q&~vasF2A-[(z2T *?mǧJ@q=ghhK 諚3$%{Փ.;д؁v Re#PTge2ԢLJDw&rOxy }}eʦ DՒ9lp*Vj/G_u;PCZ]KPyB4>#/Qxl^YLY"O2} yzv rj`-hY[xRwK<,=8+ce=Azg+뻥5s%ux8=Ug,ZMTaPQySԧ+D$(SH^A"+tV61E9Z-Wh֠bc1X܈!dzGPeO.67o~ $BL8j?2Z 3M^&h)t%v{P5ϰg};59TF*sחS:PJ縃ySΠw3 djv?fkT keN֙tޚ]k}]|}w񞓩tL(tKU+/ni>yuLɺ#ْniV^Kj??p^_y>Pm:q4YJZ9Z};ב<ַURA ʠ*uZR%@]sv5헬NYWjvוڭ۳2Ѻdժ#k =nN0{֬7yI,> qw w"` Xk-akP#βJPx|.%%jƈsEaKC`?~c/4P*6Cnu['׵]g׌fDoR-ʐރ +,Ҿ[^&,w[uLr 8PPT޺S%cZkJ/U%ޯق뺜Wܐt͔>~P}{Nk!jkd溭fB.A6p;e+:2ZZ``rvgT UXNvgVi ֈjjm +ovztfzC{AkeC|ا3RU/՞+ph^zUdݯ"6z~޸X1붎]2gA?~^Ӱj:_?o>6&73Y^mդ?鳙%wׇ.%xnۮͳ}*Ý_I , (F?E"ſkAnalK$T+ ^:]+8Jon۴j%i=uvh+nHt3p)LkpMj G-7k录R.Us?d-=7[bȾgkhʀ}t\QҎʜpLGu`V%/M=sŐ!}(fu(]b}vzdOÀi_Cqy[cS +yg!? YeICu:va5}>oL:3%Uq6go" o1G;40!ڢ}ّ&"gh-'`LfzY'V7}u%S[.xXϕ:5da)* gn&gpAQm4{fd. +y5[Zf-\Z00_k rCW{,+gEQShyjFq,7߫dPj{Vy5Sx~\-aHпݢW SNeQsr韞xO/thU~<٪9{zIcZ WYn-=~ȉOՕh3V#֑^VoWlXJ5ZnUU)VUiXbRݜ[b>gs~ *鰁.3ꥄ`L /&П3-O{^D+J$eCub;ɕpmhQJ`LxI܄QSl~dѐbe,Q#&bW2A1O>Z"A1|}&~Moȏ#omDyD/B]חvZ6W\xnc@vAz\ث~|KSMFҳSugtbUw. z kܪ1]Vஙpˏop&.,Svc{p'jw7 +TudKUu3ne4)l$N9lXIVf(Ͱqړsèpzc72Y/SQZjiǟk:?O?/~m/ÿ/i)Mfr),8bϊwJc}}+u{en Bܡ[+Qًs+Qv7粏OݹZbkgssnmt|aƆ\zOKHz`Cc7)I^6rW «f\3=л0;0yN[ͽsyKoٺ-1revGmn$k.euf/X=RwܦR$p=.ܦ~閷[joY,jH5AUY{Pι$ï*~1c9b?58^瀶iVu5ۇ+:^.:i9Ƹ¥eZl̲16FWxK^6CZG3VACџ4C}I`ݘ[\jsqts^{YQ(.(OqZ l,Y71 +lRt[E31q+\m3P+ i??;^ +~,@xPgea:9Wcg- ^wwd}N祠&9e_Q!M,;<+2/46Ypf.4wP}ac5}uK f7]|S f%+OyawQStjõQc̘tw1ĒxFof݇ ^G7Ow#te=oܿqO9ѹX7S;N{=qe/!)f*s\%fMA%I\?B>}fibƗhƆi<9j6tYOh_溘h ~ᶻWq}r0+6&*/EBOJ)!6n^R6{Mzܴ|tY.s++sgYG65;JEtkeC5t;TXɲ2nQm٢cm.h\ j3|Ic0[k{Sτh7[[l潸ÍomI ww[|< ][8n6״@]!Wk\cC/ E!RK@bh~WwyU^jŕR<yl5qk LO=grQ*{& +z0=Bw?_%u9{GӍn0`xK˪W.MDF4 t֗ZXR1oM#4q!kbLchsg6w|l&u`;_q/`z@33jDJhe6 EJm澛)kf)/7.xE4TnئŤPolUN2= +!)C(# 3ܭnPv#~XVOVtb(P;0q۽Jva73e˲H|LcPNZ<\UHlW/)?,unOͣO~?+^&%JBd-| _vMxbj;%4o`Ez@eyfT*B?&RbIg/^V╣Q૳\!]e!Ϊ7,P4[T>Yv ߵԚol<5'Z_Dh@٥p(z)'/|D][Gu]Thח`cyN9>h)ch.=fk?V7O>njْ5 +%brUcvn~Zy>Ƹ|-]R9RBw'EPe1{s1PQ\m$jj#,r&Ȣ͘IAK?f}v|*Ϛ4WX^0d\q5^uUE&wve~6 +#^Kl%tzqZ3:M'LJC=(DWߕoLQ>]=cwWú#z`p%u*&Oc2Ztv̨֚6]o*:}=~?Wf?XeJZ7TowO4g :Рn@)ǚލm<dElj'JsnM~ksB 3s _/>c" < |]UWп#Ҙ~ٽ}_yx +{}&@zm\H[m}\{W,ҸF12h)}yyPEǔmISmfEtfl¸#փV%`c*6MAԏj˰+s>?y1 ɨuYyq*y<5iCC Uy&å>d_F}>ʉzAs8𵁽2k1]q##%+}>{OK0xCM,&gh x6Mn_ Sip&jL][Z߳&+]hA\B?kN;苃IC*ԵCNoKVlT.ܴ"ft!]ӕt]'+PU%,یudͥQ}\uf2UºSGmn2f,x]&®%g]nlÚMyX7qS ^Úvf#2g>^úKXk>cjS q 1YѯϺ>W--j",EaKC`9;{ѠRi,׵`Xuk2ם:0׵\g8׌dADnok%Z C9fQT/7 |V{qk& 2=3~y k.\~>ŴrPUk_۷f^Ռ׽rkkws#)&3B^3ŐIo!zP'5NUS(٧*F5 +7ک}S?`)kMo,Z:(n^@UV2:OuVB_B4Ӂ}9$[a~.m~#?}m{^ cאڵ-+z`70OFVQAiCGVcI.v/֭k!s8b"XgKGjw1Ǎs:Y}c:];1Vo}]n}Bƕ{(Yyk8&}6 rtӹ :n̕kr_R$1S&ln'm$š ~~&ǣ|Cښ~|R:l٠ Ж2@^5uf}e34+܄pi|Cgm>7e>au77rҨTuS*I5nr6M |}j6N-GArh%=ǯŪɬ r^u'rjq x[Z!:sܬ8| +jlW6[]-:~o[%oOTN~*rvhU֫.K~:7zfT{bgh|gG?m+0 Oݢ8SOGYÜ|KFnj kl"}Ȯh}YŻlE4̶?ō_պ_OK :Cx*ҎV[l9R&K΃053y`}֩ۃ*@=h]m;7fkA`{v)+MydS~'h&Zh)n1vdud*W;NUF$e7&8o{?-n3w ~Sg~Ŗe/0/veҤ3mIOqwY}Y>W6g׻WCͱM3ßWe$\kw?WK9})shUZQ+K'*7g}RvIe>3u?P{J=0;KVk银S*Ǽԉ 7bLsL_| +],3Ub5}a6e*1Kw]8`// +"~{tlq:\h̭(+wmtÃK7bR4,b7/Gi~ύ>%e=,ut1ɳ.Iy=a|`JP-È#+~@M{ Ln6<%{B#O@ܢoGPi@*3$ߗx*yd;: +][t{/7]@lz8K-{Ǎ]&oBGw +ؽ +_q[y _TOlmtt3Ja, +ˍL6bƻnV%vZɧt?~B3a"%F%m C_WwQ{ s|Բ./+#{rG4ƌsPbM-{Z2f^[0U4;L΋ċEl^k]M2;^}6ÇMd{z=һ;{z~fO3".ӥjö^Qh6Q #RB-g,Ŀ[}Vh?kr_S~aEs"zUgz)67#{Wͱ[V75~_.|Bhs2ٵfXsFc1[?WN}Uډ.ի5Ag1\4{VBLយb-dmTSN^eb JZBZ6 l +*sXƔV[Fo-8ѭepBƜ邀y?Z +{ k3fCNZTU V42FJ4ummk1Λ;4ˌ6WcyHkۻ+Q=r]o3,ubdghd#YD:ßuޭ~wO9jEʪZ9Q[e,bEk˳YfFgg0o4?Iӣ7mucnF3rgmi%՝]rm^OVU|\8߬Cz*qu_ 3әRVZ9hC)tt +tn顏zڵQ^ȀU.-L?tk#}Gx]UՏۭw%Lgsc4{,k[Ȣ5mDWncxK0PX>UsIo"9uY'gɋ==,:5FoZLsgnuJz+/KW~(i8zV7펞1~ٽ}OOH#1C>kz^vy(kE34>[ ]6U*ßW|(+<^w;[̏tz|'\5+ENҿ~xwW|@G\D|</y7h1ۯjwAJ^$vu?m3Jugv ͍xQN7f{NL./Vg2%e P_U59ECPtrUGP=ii #zS<[Pk&sn%<-k9^9:FO8JkuZ9*$XU)AA^wf|.xs#Ǖ w=֥8͌}IVKCR)CR8"D \wj%۱Y{@GJ/-蕌p/&Stm:!P%m!4e ĥ0'.($)QyHJQ$qcL|! +>o +mKBx^!hE 1SS NR]{6#P~CmM-56ڟ>NpklLO~:?kqhϹ.h8WW3#+Sybku4u1က`ȭ] `l!Zi{F(ȭn9W{ud񭜜EÄɮľ0ID]'C̺TW5N4LPDma`Ur Cp3H +PrT]?Lכßk?Mƨj9ƭ!n=ZOXr0 ֟QP,}A ܉g8u{ԅx;%ڱuhZҗҩ!)uNk9|1߫H>/b1\E{t]DEMGYfI-5zb0:N91Xc53=ƸZۋ2EsA=AeFxnFC@0yJpꜵ'Z\elLoM|E>TUJMD7fW2a~Q1hpqWH?oEC%KdNe , <'<'ǧ~?ΧGr2 [4wn1Mn}T2|xl'G^`3 70ocQpQA2 2=5F M'i8CvQu篾'V9VF-5"*gXp@4:T'k?Zvȃk{r'/?V^Vd+ķԕ&kt,vg\5]Y@=(+k"]5ɮ^ +-ǯBA,}#U~K7יkNc!Hm?R HyQV|֑y_oN%7 ;u>2ʉ]~|0 갃{r\D/9Q=A؝lx;}qanO>PP a6'xyR'wc. W91PPQr(1Py6ҁr%%~_. E]:!!F/6W15ý1Vܰw@mXT mw8QQu>vO3\(L!!Ȏpj^l,\A Cp9r˗ _'s{.U屿 +"ny x?t};,gNQiLkf p DZ@.~=fG*rſ?~߳Ng߿ɇ<c(Yh{eK4$+ Ջ + (ߓk@ 0_sq< OiA|K+(kvn &䛅20vT`& Fit'|=>QDM˶X< +2zmfMeD`vXE cʂΚB*4d־>Úzw.ޯ0xGLqVouau{/@ڽK8"T"VCo׮;^y辞/We'iD@Š??/Vo\+YO?~˟FhĊ>Wk!OԍaDwCP֣9Ƌbc3J]ǪttR k~nN}wF: yq%^|-6K?<ǻo._nO۟|ӷzXXS(45r;51S%,Ɋ `as>evKΥQ êDIL95y:H|ugk/Sύʽ_4?go ?lw?~xK__G$R[ K{HH +kt7q/!URJ=ǰS^fsvo9)eHEv0[%o|\15a\>a!DNOy>!T%^z*\cs৳Tz(GSq;,]R2OQ[,Ы;U5łJW<'~rs&Oڔ@jm5Xb{%+*K,l!Shk)\, ªHet4ëFX,i^X8 $y1G@!G?e[0q r}p Q`|JSpK&=r}_A|￴Xˣ)ףB :18!,|/VɊ4!@:JudӆE~hQ ein.]Cn.2Dނ vp·p\͞wQ1аs!;33UDXnքx#>:2'_"#d :J:@_pقdl+뀣*)0cC(/TR[aP'N13֬5V*{z͹_i.4ʼi +΋c*ȋd^ܷȋ?Nqq>0"Q ,8KOϚI $U~hasxOL8L$[ <&v_ᵓzqS)=R{P#P]S#/'DMTXȰuWfO? #wPP/RȶzcL>E~OX,ĒFN8Tf[̱1Z:ta(bD|,/-|&|n`ݽ[fDJabLHvk ]'#gq>w~D\m*:5(S-E*g:b@XuCTȮv5H>ϝ䄻.pIyzK?[Py;O+P@9ȴ0x16®O&!ɶयCjtv[E +M'/1C*`7B X!K$'%4!_UBفm$H̦4YDtxd hIU<Ӡ^zp׭÷:%8y/^h| +K\ i[*E4pW[̰0,6QF`x*exO%9&8߿hxAFy70NBPIkQa7 +^W茛 i%Kletmn; y3]MdH"#^k՛)rnL]8*$8[J~ gc R` ͣTCL 3NkL@2< z9#M' +ovW"*ifiX, =CLY[s=o@Z+g4vk}`5? bS@y3d +Hx`9D:4I̠UOߘ`h(0 +LCTPӋz+Qv79+{%q16xu\.lP7B)Ay +@77X :f-N+1e8R:Tl(WkTfC5_QGP\R.࿁[_uǚ<$,wS> ;P\eoh7sJD^_6tC>Pn^1~94di`B%u[Aq &6 n mLkY?UP78 X_ Oa7|UQ6F^cG=~C*i;s, ;آӘctŭBU.=_7"--i6)wwG6VqPn&H-{ ë#4ɤ& O GobJ*ww0H3nwzJXNŧ{5.'Z#ïwC[O\?BnrCnpݝ/HQYjū)ytJ={_ +=!yHaGVAHHpJ6*wB{t@q_f!wIr@| Әv#h٭ +n n%yhtIV$ U][T`G}p~TS'H+99*n*ú*)3n!50SBv`UF, pOZ<=R^Ag rQe6pCY|# g¯&\L]U;8ao^m KvWrS4;FL&°I@,Bg:$n'|Cܢwv_q'5⨲(>; [rH>lСLw07 v4pl Kh'^a(+¢`Ϥ3fmkM/dk jju/ExT76Y nT=}]jpWB1;ZqɎ nhj]k5ٌQF{Hz22F"Hz*ȹgsx!Gk葐 +/kl>._Su~ +Ě*aKDiO^1&w:PE۰&tJDk'hRWhO'й"Тُ֣4J%Rх6ы'VGhv,şP9RqA$͖"Gbnx^·p;4鞄qwZ ĶuIjvR/Vt7E1HJд[~1> +c=D;ݿ()تub{ eR` Eso1N| ]6/:y,u-v ny!}\\8Rc6HΚ*]P}Ö&$ {cKL܅1ƎvNPAv™c<6R0َ#*97g -U^uGtU581ULWa z +}աUbɍj!`#ӄR FB5:̶gQ<6s'#lkL'6hZorNúb]B~6|j ~$߬1bt!lSY.4up2ǎt!aBx8W' $=-uQuSnq-c|6e ;G=Ɗ8]q`܊c~15\%jZJ賉6rWܤ_!C6ٔM)a#1:)a!mJI#roSjD4嬈!'L_})AhIXOє3FSjiĕ{2l<q4ȞFSbpddu4-̎ xj D l{є{<b9}UfB:rSBc +JN &]El:etZ\gMfJPTSN9E44gh2y kfX TS䆁F=dG3A­Dc }O|) +N* k+?=# G÷UDq*F r!| ) 04S)l;+'83vS#'IS+QWs%ܗxS4.\ElF8&pK 4w|6 q2wj + ֮ް#PNl ?^Oqi{bƠֶ,% q:42(gpC!(paC~wQfDdS8൙@5zHj1;>qsfaw| [bT o)l;w8']v+H"`ȩ"C3ȗPس"!gd@AP/`u c}eO8/0?wg!wKh hKU԰j1TU-LR%A׊k:xttNQKoꓰwM%Fiܡl +p}sy`_j/ƤZld̟~UFn\',uj>ͫ : lvهl}4Y[@;&n6_^Pu1kk4yv;vM):mUcaB9ԕ/³Uѯ.ѯv_w/\sT:FB?b^_s8*Hj9Fcꆈ2c{ 3OS[SxLI WC^1CGƦXIƠ$n% =#R*RjTT($ԢԄSBKx<Nwd43zIZMgfA-pof߈AH2A\eld=LXF1B3-Z.&PB-绬|a""? =\SJ7,=6j:!ёV5*x0C.r  Y~z:  nwBsAedE,RNa+Xì\in6^c'v(z=)Gˀ 6i e@z>i2 {l +S>]c񥾥ېE6T~Ka +/jx MM+Y!DA#&]IB^f2Gld]4`$y$-h 0d0-"duo֋b1Dh9P{S2h!"bM_/=%CX:VE Zo}&щp)u OgI]ɞܗK[F ~nilHF~}zmwxJǩh+/iq#š&$ Um)3E~@dQ|xnƞ9Wa2dzeEN/'p=t 0-v8:~On`כo;᧿:ÿyX߼~ˏO?+NNpj*p?dO9m4 ۻ DhE{GCјWpM&eF~9cFܷdz9I||xY +MC +L{;bX PhjWvEi>Rn|ī'# uQN\ݒLehY+y` /_-HaN{hr""qW||r_.5&loN<m:\ߖLHhKcs1] M U#E ˵O4+𓪝ո9ʢX%ɻjgyחP[̣1&T ռ"+7U ƱzZ<^,=+"LE< + jMė"1+KLd=0^Focb3}Đ[E2TBiouEKz<K~(,c;2xK %IpWT`7|d\^&eEYų;ldyH8ʹ+  + S#]a>_dkwd~g3Y`S~݂ro(pԵ N`x荕iJK%vqC<-%}ez:Lo6ـpSa4=>y&/oT#]W6j_ךn[~\miPc +pILBp* o^}iYXWbb|@1+ +,.&0e*ƁqʏK*\3Ol?aK~bIv:A Jw~HI0):`I쓉㾣28mLzňLr4N qa wHۀ0OnOCr7 +E Ҕp8grXK?i`r1-*=Y jFйRX 볔\P?M2{e$]#IHFu-HFK-v!0ɁeZ bCƣ NPQQW}Y;1%MS1uǬ"5l +դaDp72Xά ]djV5'5}unb_8 HQLo[pSqIB}Պ mVSjzPsoZWi~Ȑ=pSfo5V"uZ M V['z=h%usAeʙ1Rntu 5O%nxRܾa/';G At% +^LlƼnE͢z5]Ku(+N雏|JtLl: ^\n瀉o Ae>)\\3=&l>֬x~Q.uP%d +m3i[8vSc1c#bכ~/z\t>Q#o~{~m'f|2 [N8"~I|0Ul@Aɰ.ZjNUނ:ϗ4#oвp-5auzkofuS"7Zc).-Ƣؚ4&[|WZ<6kl\3Uh (?oA7ϣN27[h֯G zKGS4LuEDm1iVv:q7걔aFquY6>Q.#qc=Oآ +Ɠ̈́N4#H+}5Фp'k`hA}*Vg*bw].lڭS;+PySf-::'EϚ[T[TUPIQاb3sER-X?Ok D;` no ; Zg= ʲ?@].޽`w?v ,fa߈΃BM̲R~ 6dzR]Ҋ: eMq^? -4X@*>^uL|ğO,B#U+t3*u`NI=Fx-f F%/uOdcN#rGL'irb7wۙ跓?`漋]>·Q|j# zc=t9=~|U.r_ն[ucouw,;""_ŋ8ˑ+TkH:Xu4VUGcի0V5"[nƻNXA~8r׉k֕r1rigݧEGg|SvuU$s3CՁoRѮ#dnieA:xuMꊦD2<b%a09XZu:J:JWPBY$d1Q?(QnEa~! +bw:Ұϟϕ!GqiȬӆ#* #74rC#74rC<=]ѳ#aItUع)~gR3) +P˃ \|ՌYDdm4䊬hJjaQACpEB8 Zk$; DҗfXT}oӸ%imqǭ/ {k+[6\{x+vg Dw3~4W^aؙDvv Q]8wm؉Hy1F\p@o#q+y^rn*@  .%>ϗ6:S=6m `Fi_I܆a@T7ܭ:^kvZJZ{ +ƥ3CƵw,QX4ڳe1 UǍ9U/ƧuU2xCi}2|u#vTWݜ nw*I7=͌oƷ S'KúI_*gWRiiznG{VfHn9 +Uj J*- v*%8ƶˡ +x`8_gCLy` LRgvh#eaE?u{9A'4%, P 58#tO!E0B1BUtT!PAgv|t@ I|>.v[T4]8r^ +Um⦆ۆ +e0n T-`}Um lF[YA) fTMI_2;2b#oՑ! &Vx["W ϧ^m7*έ}:K% aViiw5`x. 0CԲ׼!am!"/v(Q]q>!_Mï|. +aͻ>ɭG ̶.y* }:Ty*=Fxqm[T`=Hb[bcJ*)mՍ)l9Ϻ*O#pPj$T# ե Uh#TʭJ_Dۡ_j5*6iN.UǍ^ū*߆EpB#IQڌKd#NC)cpFgpp8Ap21I+pX|m6`$phL닉 d~01@nn*Ҥ?IrCTG*2RTd"T-E2 E& MEʞқ +b8 +>`#W1g4YczU L]IQ{TOy>鍞a|&:FUyvJXI*fY(HVHMFj2RBM/Q{"s9C +&:ch CmaIXNT OoQ*B:k`z )` 倘D>.u=NgqaYF7cW}vUv~ʁHd_n_XC.f{ȶM{eE)$zofS[}]HmEu@W8jJ

H>ŹNrg03ڪTtJMP;Íuixj[˞?=2Y: ֨.?dH)vV>zb%;d6veL YL9+#ټ1ƭt  W)⫗u" #[oe!ۚW>Ie{ljʏX+)@,mϗX[Mx>춻S~x5m>D/b75nY3ll#8$ePUp7nLT[mQ*Q>,C{OwD*TN/~jxnJUv`fg=uzދQo+c-x1WF堄WEz[r]l*\I-} @1ĥkm Z+4ޗk15vKCػ/ -k5t,;@DZJWϵL|2R]ʹ=Äx>1-Ew]X`2 jd ?)yu-趕(=mqEwѦ"Ψr곘MݔiW*?,[>]3P5 RڞuJ%n>v|\*j6ݐhb ö$#` X[r+]j\#bP ?oڀ8ANjN27[ߌ`33 l㢍Ei1J~l >HY詣qǚ\ 鶄b{tw>t>SV}JWzIXY1Aݘ$姌.,-}+o\Ḧ́" A` m3|Zq2M b:%U[w`gpf}~8}TBow|g%X=f<*GX:ZЗ#؃i}lb^"_G5r '[b ‡O19W^XY~%)–up=v'm#@k=E5$Gi}1p H 1CU Oc"M/4[&8 u2\8eD&xZ 5yx GGiCĸÛ`qg:G]%pמG6qԽ@;;8*c%,NQgh ǻOGA@\T]b'@q1p]!A ႐<h/Ap7(F0,?C Dp= < 31?= m!as1< /;BW3D%tt/ʄ LY3vi>]Ul~Dȏɶ I?%8d+vv /&鎢*BX$ +3AFix5(ow'V\d`΀cPh 1 +1&Y]xYyKi¤!CwprN5ͅX&ב&/C|dw/=+( +CV0_*CnA9 gv xV\Bґث7&B`]e<0dbjtGD#Cp+[jH]̤.{`څ((%!8pSŻze #1bO;(l2h`wMDJz0ӽ?ρ +\~Bp/S*0z#{}CvOw V࿓ hSb dHs*9FwrtsKrˮ~LnR0OB +cv *d}Ds@wt׾P`OoJ_puM?rK1 +w+ +3wX.Qq"0&)"> Cp6Ҙa``!x{2tBt7{2 !auf9Mj;$ @Lb &СuI!Ff"#XGy+.f9'+:a$E>|$mxXvos 3Aa~4(D#sYy%.J8`Wֈ[wȄ;婳ܟb'!I0&=I3˿EqfD!i8$B_*{ v4_ @)Wyo<fXZ>W6SF̰[M*uxg +Zx+>s*gP|2דKRcfPFf'Q鬋6ܟ2fxVj(2Wnrd#xBHƢ2֙AB|Y/:{$(ЗLU_0ۯ_#CaP4pOyϋu'X|n TdP682H񠌕gb W/"|ښ%RolIlRZ҅H=f +GZ+*Me2O}VQ_}͡& +qGv=1<CLxn2w4/`H0 i~B:leN4Rѽ@/.W]oLwԭQS 7,p2Ci> 2Z=B]TaX4#RCLfBE??DL?I2S71Ɍd@_aR3MY&ܟBǼvi:E OM=5N3ĝswa nWLmrցqo$2,`H[Xi "tEvDd Bء4`ZwNG@{K_*Q sTXF`acϨֽH>HD ^I{qBGFk AF9f + ͳ&EFz4?67 ̷a{;\X0*\6T[5W # ZI૪;0kFø|;駬7Ů1Z)D#jXY-6qƌɜ]GaapxUTI<5E=]29gU6Aw C&FΡh)2&5z#qm4E#|U>;rC)T_A'e6AHS@ތB~h;ҁz:(.N+&.?\%##tL]VPKUSh-4]AU +rm4E,*jm4CZi 5bQ`R*)^Ѯ\MSdB@/NTm^@FUf5Vu +%JS@u ة{(Ó~uPi-0E`PtGlGCX˗,U':*.اxn~mt.ӕ +槸:pGѯ]wt "$l^ҡ?k3F7^|TPN土-c=ʿGhg] jmRyРH5D?*vB3JK'*P)z3 ^ߣܴL$@0-GOC2e=U_3;{\r4E ̳#wU*Kf/Y_ UBqBB?? +0;=e-V~V?Yk6)eEC#5+UXYT*΋;f&5T +r|8***uT:[A84-Zb(/TTkpj<[$Ap{H?7Y3vO㒞uˑ;2+4WㅺL+-&8{o(RZk EB632hC" A'J̹EוWLWz2ON4E +R* 4#]0tb*WEyv A9@j,?ʾ+Wډ 6ӷ7gE #k `%̬ +VF2Eh`"Z쐓!Ǜt|\ 8ܗ1<˔]bL#oATZ]s}B啣#PE(& \72`Qg3X [:}Sp=}uI%Ym)#qBAfz (]DdЪ)yĚ>x?FNU_s &maEStP ij*T YDN6S KբO*9v0ݚǤզ).m%h)2=} VBq&/}']U*uqBr^'i8Qjc+)M=?Zj1$'d9w!Xm)RZM*Ư恸TpYXYv/d}<}O5(̂s!OJ¾r5̚0%(P3XP,*I VUI??"`,>t& _Ѐ?ÃE 0l9\_)Bw&Xk{.TosufD89x.~FfǟOtf륕5(}#δlmߤH9ᩀJT5)Rp~ %,-)eFBC@Do^=>@\1ir?y;%judj/2QT(מ{PkPcqVOuEBw8Vz/:V#j >7_LoÖhW{˕ʿeF! "JU!¸qzJKDspz{цS'U4/r G,zIWkhPRp˱siE~L +H^:j_j"hwfP"AcBOf=$4?<]Kk7gӺ +vs- +YElr;o0 ByYl:1~PL BDYiqşʥ,> j_]2{ѕH=cr:E#r(B'miцS~ gOdBi+ @XolF\ܟkK(gS-mxВ9 3Kq$|HSH7j. k-K-共//fvFT6R:,Whsd=(w0B٬ȑ>"XLFư<sC'ªhqcyOq2T 灬-3Zk 1R Em`G^īYSwfY4En)SG`F9cV\k\I)P4"rB5Z?ʴFRhjXH5(R"7غ&[6>#,bKo >) e7(z-p*ghȕʫ[5&Bq,ۯeR]|T4ŧr&kP@}zΖ*;o^t֍XJxoI.n!5"Ug6*/pjӡHԛ +mj$^!T{, 9Jԏ֙*ã~N :B1̦*k1Ze)T5e&XmiSzBP{.-?֋~3 +DT_'-[ׅT?i6G4A$i`e8)ymALLA*\D+8>jg(;oD\q%ثΨ_Z{h<5!0X6>0>P7Ƃ t)Զ"ŃTSr:kc]HmF٫:E#oBיȢP ?_Z-Wч0=KW>͎ eÉ]dG4oyW.ιL[ EeFonks/>Q߅WѡJf\uo}=+]=SCZ/? +zz̟ribȿPH!JNi(*J\x~x_ %NeLXaq5jl(7|[gֆS6f@,|7_ϖ# +u>BPZz&jQ ieQ +5NUCiA􏂙@:7V,R-憳.hYYFHшG +*\OG=4֕):5!S$ BvWYKK)/ iC-di`c7%caPDP*D}F7 R4p[fnYJ81\"VJץRZ%,Dͣq-e߹0[K7Ʊ`;}sXcm-Jӓ"@H2YҏW̷. V*RTvl~ds?kO +>gN'Q]\o?PM?fxpGN-p*D7_ (W#>X7@*k]Z aaTg_ߣ oeCw2|V l?~? (6CRyiꕷG\F VꟇ?_ y~X_\ىt?~}xY=}U᏿le'SFrD_eM<;oKWߠN Wg 쯐嚾6ISLX:hlgP+#|*?Xcx/Ycc+ƈA!:}KO1O@]@ ;>/&UP-~ȈW(aSx[jSkN)ǰ$?#ǁWһ^D pp[(NR8#h׆?>fg? -@w'@4BTM.\6`E˅p)KLJ 9XOb:Sl~F7:]B='\<6OnIuA[n- FҍfX;c64`Q'tCWUd'cK>Ù~2٤ϟğ?~-K`،8O:L;^GL.~_JܘMPuѻqn"v`t1wz 9V5&h9V<;l'#9dz k6yLQߑ`g@$Y>}0(^SPoöh[ Er?m^cWwJg${o?&"h@pygRh. R' U~+CY`Hcy+ Qqâ1WSU#rbT=M)iBSɏqד<".~V%͞wS٦(?)H'SEyVkĀ +C`9(x*] ʋV3Frp^ +UM蘺a,3M`cރZԔ1U/D]T_'p +'@~ CV~(Pwg y0kVsXX AӿOEzOpR%u):N9J^sC/zp3 @=n•0 2ɗ*TKVl77)jCX$ +#$RFEJƒtG 1k#b>FFL<0d)I|ka0=2A?m"gd]/&v2oOr̶zzHpQcvTUEQ &ic]߱6u~ :Wǘ 1~)>.S;pw^[!R_X]EOH<<~d+3(;ɹG譺 hyOX|@%ײ2Z'"1)$;"Y$y:U],xk\|&SiVgV^X(hd[_daQ}X֥OЋRʹ @y8:˾عNxؼpZ T1c"51I'҂ wu_}"ͽ՜anƵ9wg );=O?]ʅm!֚2qAJEpSJ?j`-DtB2e 2fQ~4We*w80()"!ޫ3TuŮV]*nkgFlf2NYwlkj'2amE,`i*ݫU0c'3"I }R41혡;aS*i|a=F *l& +T-m8kp:ga)5L?a!x6BO uuG}0X*ڟőuA6TQQN&x&!>O;-.PSrsSD{tJE/ܟ4#E9^T%4SW^,-0Pݻy#ŔGAo JSB8qy]X mnOl8mEI6cD*aÁ%K4義ΐ) +cvYtb᫮c5&d3̠QdfKѰ9p48ݫU +~xc؆;QT[f eō¿J'V|nT"Cj*=d^4?< }AlZmt[TqFfm1rJ(Q hywCH{ ʋوUtR:x2 OM{O@hԀ.^!d^Xak}eU*ppRڠt2/]t=s\黩"{-*"XV3e1jYIL/)$Tj 9! ƬЛ_ +{[kj",O2`VmWh?V"M;xvL׌S0^y0K#O}z^Ai*kʉoEMV0yC?23ڨ0{75[JMjf^avdj6'+ =k*kc{lAkbe3Kyc`ѓe SfzuXζ:׬l@?՚Al 0]ۏ]D dnmEmyLi6ntmtF|x\o5з&^Ah%Hx 'gPyᤘ`| TDH:R18!¼,׫U}Eկ\-C<^7pjv E[RL $W ]Kb-2qywKȻP)n (s ]6IEdf$qF"36O]W1Z7|hڧ"6A!O&@d3Q5ډ yXɵ1޸Ja6~ݨ8\J" Oz*KeΠU ۤGs4Z۠}*?}*s +=~GߡLjډZe$ĉC +x_`KɜAj^GY dG"0:,ñVG:ӶyܠԡYXffey7sVI5jQ@e>av:6fa/)$rc|6wiuV+=} f|85z8[aT\, 4Uڹ:{׾|߾tJ( &*uwU B#'Z8R5'EZC#y.Bcx;}ZMyh3Eq""MK +Fp>8]s֓AW 3aWyGL?uN&KɣӉX9peZB& +LTQCqK)<|k᫁&?K-'a%2H-.'RfO1{D1-mFrTW*b36a-6XC}AǓm*֩[c{9 +S%9qRJsC8xdr:Vy '5,]V{_.Q350{62mue1lLVWACĸU>O%,1{сUh(-2QьԽLs}&3&?w^M豆VV5]X>MAr tzjNGQw҉ jB͌35Qjf9{Ok&Tdi qlXR%NOU ̀BWhkѸܼt<[!3rz>e+҅uz=b9!}|ePu$B?*FW$ͰPL Vd҇NC[Pd]`Uz)HɃP]ߗAU6dt :ne+$hg`I)1%iڡl\Ks[SXz{txZ侤Xemw[Ǐ +&4*j;\1*](\SN VL=V0(,[,ȥ 4F.-dW h2Р lql &E00_'o0h.0S{T(PXp2tu2XWblѫaތpu{ܿA +M{yb;P@pL1 @# ȏpuiagi,:p~ǀn(=>h8v; G] <] +1Y^Hxr.R$Fdc!]awc~u;X( z7QG#|uR@fpT9<VO%*Xt&Ý-ziM!!_˿7@x׿׿_r?Cw?Po~}2)fx#>02Ćak#~B6ϩh.Ɋc;SqxVOlf\ dΧU4-oz Is}WH+]j'_5A^ wz$Cɳ#}PTȐB!hb}=tHF 2 3A"}p Yf/ BCN# NIesFޢ P!p:dl^tM:jUЎF - H?LGyL(JW˒2|AҎh}/ +n3rwfsP-C4r>I{ĪUrb*jFʷXI?$F͙7Bx"C8¸O̵py4)K[vK,Fxi؜0bAf\0;^̰h]ϲh +XVng^Z{9Y.pigHN<`4<^CfF zFӧޯPxo˴w;7Ҩe"|xcFC׏%F;׬2yH'5U :[5WlFo4z>>+HqZ@u9Y9qZE̪8B7z.ʃPA璄 zMj`VH[d#Mn4y +`o` q|.8?^q8la ܫ=wIUHL!QhCbr HLĤ +VFH`8$LVrgnXrDK B Z 㪐[!16Bb?$׀ĸ{H 1J04OC'NY.z7O|qȻ:ddQ] 2*H/B ׸W˥J(Jd-lpDi' 4L U-V]ŪkXu;X-+X[Q$Mu).B?|n(.VXubb`vo[F.˦LN<|Z:^/MB/`iUWvZVUhv`Z +WXuXu-V q|x˜ tb' Up C/ʼnUŊb5ZX,V-VrUv |ZK y஼,r(: +ZVUhv`Z +WXuXu-V#f'+{[D@8$Id'$Zģ+-V]ŪkXu;X-+X[@q75,E, ,qr/'zL:&}nIk5s;2C3SߍI[ͤ/L8>2w^n'Q~&n/r|xށ5$&n='[fvfүhقnL>ܪ&Nai9(s[Kh:_&rp\ݹ܍{E'[fvf _I{9~8-ORr=? a;Nen0^f6pEQ1T}rTJWrr_864n 3wb<\~.\t`4\JﳩEsR9W*JtJU +Wxrr_Ul.~sg(pe$/c'ufJT}rTJtJ唿Rq`8t2X @sVr<'_۔ĩXXccU)@z +R3@r&-_ow'zR]BcKUI +H*$KbgK,XA2rmo!_/V|rOT [ ˅w6#tpxhf|w殻Ǝ='Hzqߧc|r:x*+O9ݿO9S}#xb,Qt4Ml$A͜"{^ԩ>XߧT)$^}}) +4pm +[i,y8,]L<$zI)ͯś$RTT6)57%Nfi,7%m9HoIςO$̓yA sfFI@4uЀ^3D + ĮHc94R&",z/QD?uo% +2g:I '5 Y1VTQXQkbE)$K TG=V$+u2 %,Y,06]ѫe!yh>RT|zm .\EV;$ ܕ̒p:!F$#'̃< M\ +%Q52r*2y6*kk\yri +M@v qϥǀo,~.7#7ZNxI%߿/YXϔ^}gjqp[8[wS'j؋ql~F0Z"\Ηxc;p{Pk7AƬ;Ѓ^}V#0PmIhveBP-'I6/l'UAUa*]m᫝ T:= +^zmvvjW2R=i`U7Obω" W+7ic qCTͺ=5Aj4@ծ|h`nXcvly?d^ūO+ +FAhi(=/Hз<IVW<iiR?7AH#vJ#D ojV v@>DKl_!>f Rժ} _/`/ImX.,(MVF>lXx E U_z +Ϥ!FNS`UAa3p%])y-nN{4_H( CM&5]&5H^~KW䯶kZl l.c7[-"aD*\dj>_d\uc/;SE&nfJ:&@PP5,uQyq) 3ȉVsU$vVU6ViEeW)A{*/'_ v!Kd&BV#[,K} +~ ,PD|jא5v e&^zn 8Va$,0I#`=0h;Q`F0Ϊ ڍJZ`M0a2yc /"Nj3àaxyn˞IapF`󝕷;+'suWy`a '(KZ8a@W +mڼM!m^?U8BohrqΗ<"?\VTaB[^/IäEb:Bk6h<~ͭm@nI"xY,+/L2]FNUG~s&( 1)ZڜRhstmImN?TҴr03\.l̃L,Å|2(IsJ xr׃ L>?ׇ3Տ$ >_>_^>/Χw/<׿?.ww=3:|ʷϾdCwp:,h,VKY:|ݝ&fľ3m]xۜ6_Jm>l~.7u1;̲b2M}8=ƾ8\VR+ɶݲ%?q6;yz*t( 5C`4=enYh=}9>'<'h4~קjK4篾I?X8X.4"=~:"X~V +B^(;tʽƜovJt~k: ++gV\_LSfPCuLvĒ?zyv v!{i0HO(5wL`?kk]'ˬʥw2bGw_tb{^Bxʟ: 6xc+a/9Gބv p3hW$ 4!K71;&hYx _{ra2޽YF{o9` +9hӊ9dJ9fV-v$_E[T=hQݣUL -mrs;@7'[\s'ߩN߂8üMqgD`!h!E[sqX\D`={$iwNiN0\>NEc +R 7R^vA/s"?yi;"lDlBЂ(XQRx<#ߐ7"_|xDl0ih|Zo&+$wUL)'eh|f8A<5dS&נ>|7A7ȬdO:ۇNޞx#}7o޼ +Ny P[bMeD{Yk/v +mxOWA 8woyTAnAڦ* XI )R i(>#PϏJo3H?g*ȸzÀe.g\|LI~no^}t \ܓS 5ytif}0?_ʅyo[`p}[@s^<#Ht_^pB"A\fOrс[- xwyD{ =Tr}]t]_1^`t'1٭&=tϗL{X$[,1_D&w@)3A)|v6oקΑ@+aB0X +] +D +MpxqkR{Sn󛸒O rzFnOe 8ك|@T%qw,'s :W5^|I|{jbe.OyE.誘`x(fp[d%P\C JoسcaV͞54<'71`X _C;E`R?go9>fZm|nrðXC +w,Sv|;9 kyEo! d8t IUыy.;X`K HIl:H)?D=(B:=z Jhq{f"q_Є\Є-'Au p1?L;!SMƅC;zn/ e42!i+"x6Uw}LjC?Ȥ7`hPf@A~IxCzX"xXBo*\Jj#5 -D,Do2^ +>Sa3S=T0~nS 14!_'dsvjEi+: %I^FQOofzdUSaYSa]Sna˧W7/:Qny_x4'B(h C-`1=Ab;oENa3-( +!a%W,ɵBq=k#S +Ip&\bs^BN򈣩T_CVGdA=o_Bx%hMU'rTs*=`x"0s6Td'rPD(ɠ10(BEZ<"~^Ŀ|bJi}^kif@Ջ}.L؜[ߡѭDsh-)֛1ټ[,lto~o@u=4O1/\ ,]}f_'ri{;l?i;=6Q#; yduv0ƀ.9|<&`i7?C$E4IX%cedrFzdIXR;[u.twK$cBqS$dDH\<(dZ\1&"Rfgb"`@( ԍ6*+Ai(ّ-( /еjYKd-&C.^$|cFO%X#|6hCoUJ5Sh 76Vl#ڸ0x.yCO6 ;@-(1kՈf\d>vڭ(+y8dd +6qIP2{6,%WG!+tÃ&A.9rSFJR2]@u2!bz\lQCGEFE,zlg0lib~f{䇈q&ژuӝ6L&p# \D#up8^V@P2|7,bvIono^;` )|v_ e?0*ik +_FnPrsM})_3npc5Lˍlj bEQ2d09?~d::(+$CCD1hkI%c-9>Y}q>͎6an-'NXd8# !|%<O L}m[) 5XQ[}t gj-I֒lRK- 2bD4S +Fϯf0(T$'ay:JT+&4N_@Ie<$Dr=܊j:@(fnBx% ԿI6 e_|JOlfpJ5.l6-?Vvɒ(co `d>wxct ;GpמGhar tZ{8jcNHCO96D A#;>gqT=b^7QB DȀZ|su6z*g`$#!h4m!yu*f}/Dsb="Ȱ^p7\M%63Fz\KRjz2~::y4׻=eǑ܎v$Wx@m_~-mm+^?bn[ff-^p0y +q=  8ŮpxhrsXyhӫHL.fpQ/4(sG.0 Eg͕c7o,ɾ"{jV" Ϥpڰޟ2>B[ f6ZɄ7#lj@|IΕG t\*EFvO[qD[}03 +e@Ӥn OHuoZL@ +me`(PXڌnlR&u l q-/ƋNv "s~xM$;@,垹mA%CFþ( +ܴ ?ԊDŽZ3sMT=xhdǿAި-u wTkvQ ΡTcApcr,=ѺD.sBW\S(Xڜudsf1f\:\S` +8?4;rrXftQ+8Z[ڗOv6n޶en*tq􏮶9}`t(*YlozBӢd+[(>it=P31Ngt5)sG0lp++ -j܀ýEJ%z+Y۟}w߼j8zmA鏠zzΛ_7)y烢a;o^DC $o^e{o^_΀0.<~jwK_՗W.6` ^(S>I}PsCWvu!|W_߸0i qܑc- F4]7b}l w;TF?#s{ә3ўiձKьk8 `ш +a@o8aC]\ $B2(¤ (y TTB& |Vg#'4T4QM4DQE>=mh{݁1^ x]`0l9eD,lheD+#Z7;8A[\*}?|Q}P'E)M?ِJxw"*7Tz+װnL Dh$ +F~;O Z.7oEιiDl|0\ r+hC=e@4}~xZ4h[GpbU0/;FgЯ/_b`6 饡)U=-#p~W6o4Zdd LТL$7[X[$n'XLTGjbwKY)_T-]E6wu/p"CD< JOఔl4 AKnxOg&&~y +Uf@ Tf̖̆ + u㍮EqKDSv>vzmfn1`mȂAKXe[h.И`NYbaD ceaK4*ҋmfBlQbs@#Q/#DF<).ks紣{ j8Ox:!cn%( DL24۠B.iDoq1Lȇ+"`@s.P0|;A^-KS|9H Fh<3:]@M}!RiAܟ//2Ag2m.XSm&Lv, t{"^_Ɉ9(3dFTST + n/.Ly+V)1kZtc֪LcHf=\" YvHxR|TE9jU&>"ƿmq'R@=bqh=w{zU#*x4O‘-{]*\GhDOu=[ +^o 7ꡛhp(UA\ cqRKhv(JGzLmVҡ?Vhɖp8пS_}՗[빤1)and*@JHdˮ|MTH@{D{(߃ 9€^fz Z_X=Ƈn㮼];3s 4Wqfg3  rZKX` S t44RRF4 G:NgR`tWòV%βiܽnvɽtfsz՜1wۅ:&&q.kACm+0JqΓzX]\M +ר;ej;wq.} v@{%9RQo7+ZH#BYK6)~h_\?|}ǩ.i49-(M\Ɣé\ Clj~fSWgJW~(Oi_P:z֪P.=.xx6ʅ 976Ѿlg _b +:-h ox WzJTn1~[P_YV4y<˶8ҧ٪ps)v 06~Ft%h IC&h~XS H&hwAwwIA.b4 ]D쌶h넺ԧuI`,+0th6#Л\מ4_hN@SĦ=y0g507Q+'.ZO4F͑r +kYib5hEu&:ОS8!X4Ei w)O@u,˭ iWdH2E_ǏVzJ[rsl,NHʶk|= W@1r #*!_m寋t+d QO`h|xUy~%200/z5R.2_E2A*{a=* V̓>^@HF4.[خc16X9ZkK5 [SN̻tQ+!tJX5Gt~',5ɧ +(n%0գfpGmo׹IAqȡx뾖f漀2DaR|OQCStpS"5L_1Ũuj/)1O ˌ'G78%9q(6Sw;sۃQ+}d3xjJX+aSȧ&|)F<=!;7Ũ|Jq9%ͧO)>TSm@E:`קDz +) J8*#ڟ"2Ꟗ)ES Oe?5)%SJ< ˔6G5-Uql)L ԛ@+Ù $a(H(L0B{:)@1Mv:(&G5&1EtciLJl*"SL9:2edS)OJ-d + XLoHOjl(D˴E^L^TBXP{n)a4Dihp1-@ϛ?8;aXt0y"4~zQB)_?{ԋU^\ۮaJҋs8FnC?r83:6S^@MMĐ@ۯphoSO#j8]n&- +&6x<_@Z Lk&EɂI; TԧjGhae{LTL>ۭߵvTCV1~9ߘe/@yMҺRBЂ ڒr](-Ԓ`vq!҈ Ay< \bw8`l{Vr7L~l@I }oɏSx}XD6aƹb<xjƟmHn˹޾oE>#B)0p~c\p:oNJR6w" N8v̊b :+:L,1Lzz#`[Q1P϶e&jPݡc"!UZW1Cljj2~o:fN1s[˘9 [54 V!(~x4TE p!NU%25X .t+vedxXEy„|HK,k/ҵP/pxGbh`h\I=Lw1Sv  Z-0 ;i*Dht&Я#r_QU *FhZ='k\0C9+4ecB-4o{g&҈@̍j`'x)$45B蓔p0aQ VN#a_*3.Jwj<0π1u$8cŁ5ԬKzF ˄FnM`)f$47NhAWe_Cg]*1.oTɞ f@"ZnʶHd@>_Ajk+ .KSI|^}XȈ:mGHBZ1Dz8 ;1RdҖٚ +2PiUӸ0Նpv=]!݈"ossvU"+S9& m&?ts4ewA5\{khI @* I0JDR/1J|/Smm$ϝDޚWty>eAY5%vc-%v*阧r3rv]/25$ѯBu+y d:@z[jSVB JlG Ş +Ũ# +_~BBY3UO$2Ђ!tzzћK>~w +KX\k"n1fm;u4}(U=h !]B&KT]D R}H΅TN%5&w ZnT$D_&>LK#\#A3mt@}J{BZHlHZ ԭ U!]0g89@1:7qedC!h#CbVt? +i59#n/&k@QuFdP5~'C@O͙j` ͣMbCNimU^8G. tF۠jgZQku}=·;ܔWŔ^db-s=-1 cpVaE(dI9ĭ?_yY$Z0 ~Y\Yd}&b& xJ_<]99D/ 9^"q{99biBipbtT%DZ@jvAF_ȷ{L`A)6]dz +aSĿTφVxJ?|3Kva)%oMޕ.zB\:0 ʂIVM507>5j΄u>Dߛ,'s(/ TXa"jGgs-NYn\SB\##!rqg*J8įϨH:/1s%AQW̼ +Z~oO48K10@a ۵qrn5AZL A;R'2O +j 0ς}cl"l[maL +ؠ{d e•cr:[Ia5JA%v$u7e!y윁0AT.g>.B=-~}j׋m`nھ&)Ua@䉮jjft樬'4tEZ{ @C4Hp9V ǜƼ bj}Zqv!Z_յ͓56{"hfѧjHFѧOIFƉ#ԀLŨ3jm{U+.撘26V]{͈FGū- ˾F1[Or~D3b AD1 +<PԸO^ V-G +[`?4My}']O) (o*=k ûf\ٝK!̒Qul)`;VujQY{k,X;}R) ҄nj؊V +'-a9"$Vs['/& N3-.ZYў^wɞH>tc +hhtf4jӤ: Dݴpl; 7f;|cL/G.5 Blz6rI܉a:-V0C ^{䋠7}"!"ecڧHY7re"g g)h(QО#hZh:$Ë|d%7F#C2{crk>S3=&AXvkvg3EXԸarwK|<C*7 [ND +Tt;AE-C~x`@ƟíyYMl`uz$fE͍LOJ=VqP/r +o0-ǐN )z@2#d'B%FXcD$nIPL +F,0/ +Sbl10K@tP17]42,=j4,qe8% P]q._15A3S +J8o-%-s|F,K(g蕆5w2Кq9cW$ϓIxiq*Կ +^vxgNLJipvYwx+>TIװj ^=jĞFqHl_FI_R" +/)QB~Vi^g1(yܿXI$-MCLN,e]!$u&f mBČ 4488ψk)3;9\PZFiڜVgmШڀjJ yJ:jKpǣgp) L7$d} RS7#!u.%{3x?E9mŵzn4GK..5#qL."R0ǁ<Ǡ_F=uqyD'>r:1pB(l+FE/Kem8R{z3c,G#V"ZXuzX}#{6Tk%7Fnk=mYt\AL_w#.$.S}#./.*޶OB:6"벝YV?]T?j"h (<-FoP",J|i- >@`/4ػ+džYvTŔcZIU,+ʜƔXWԢ%ɍ%jH*vkHn{2㈓k[ 5xnxYDc =ub|'4>nFmirioYu77Q\")9@BNF|kt-h@Ȳ$Oon~Mvk4OIGcLMۼ#U؅ԒټI=-z/Sʢ_i; /ueD+6E^鉔%2aRaB QÜN5mTw(7,Tt#*nכ(? vT%z"$FXmkJ${dJNR97C'uԡ2q8UTu%M6QC%ELU!H{˟5RjY>5a-rnWޟULzlI5s_@.}xoSU>NuCMA@M9(H֧%jN`$_&_zΫD djs/ny/&{@a-URaEUx nPb񔥎jWkrqm}D|@&BBgrw! 76X|N;zF~w@ھkv+X Cu,1Z;P. x\ZFd!HROq׮, RXHUܡ@q,%ɕgQ'wxb#o[[ѓOk$D|@RZߓ@+ڥ'Z9GhP?¤MkaRb#:0j7a 'Okj5Cr6d-b>%cN2`Q2֑>%c(6g^[Դ@?A$Z>/qZ(|Or ^S^נSfjE8>58 s+^!5n'Xinp}y +򈾾 =A]L4Y{Sͳ;ZidzD %F JxhRF*SW8VHtxTj7QHj2`Fzn$MsO^Fjt٩g|h(%rXҌu"FPE͵,9nC嶤Hvϥy.t#o []k^_R5z#[Cc+jT̖~}ov3硳+1c.=ב'a!ǡβx%;=Ȱ! V5DPw吻eao aRVpeMU+!ll9,9u55zxFnffFn2Lټ2Bfg) (=97LAb.ڵ1z뉯Z[%|T;k e5ZiGNâX@tY kP3@%j!njڝIኯw CܺUxVs첌$z9(D53տ*+hrz(Vw[,jp_L02}^e)>jnS,[jeYDHD"_/rkdKެB M/vA%KOS#EP A넻^ne˥-Y!齆A"֮ 7t! BGK2uX^yH/W%G鉝1v P7<בHc1ڹeY;4LAK_8?B.tN٥蜲v:WkcJ0.Et&Q +m6ވ49MҚ9Ү7Y5^p8&\W?SZuH.K_o>nָ:>VT9R͔~`A 3E7n'#%0ݣ;=86XwK?EJRoЧRPK\2`2;kɬ-獎*9o4.ݴV93 *oٍ;gjsDNH]hKj '<#$~D?;O7$jnM$子jtՐ rt ܓ M$ǎcWUlZ4{b$Y\;z\Ls,Y3&<~fO \͘WZt8Ij#jXsA6H-\`/Z^@`PGU$4UO@Ȏ+?t!*mGyG8. gT8z^\Wx=+߱v-s46sK6?N ֩qHM5|F᤺v7H,ͨ\=۠-p6c6j~ݰҦ:NR}@c﹈K w<1幑#}v'n7U1#UR +TyL;}qUK)+0`&zce3,ma 6eIZ5)tKWQȞ!LeNZۨ mI] 6> |l$#D/^qDWͭt7Hm +ܠS1N:},h$֔yd:mP= t?Tb|{QpE%3ƙ\gƻx_O)UGGkRdhz0J\ + n㽷HK*/#ClWqHxK&c VÃhХ2tu3,qt4gZYd3*qnFo'/U@X3[d<[BQR63lgk 7oϼf蚜 U `n'arzs8^u|M%u|yu]0uDyx Cי#;v0KtdUtB]4:G]s) g,|1h(r ++,F& ;]49% Eл +2ZhȠY$ÎY)L`[Ԯ)%㦒J=>h:拿eҦ껥i0h<%cP%)T DŽr(x9zKB8d1aIKJgZ!dU6[氌+FJdkpMOP`7XxW‘wũ?P+Guzo~:&A`Yt +)#:srO__ۙL[] $ZsXgbWyk i“Ǹ ;Xh<etFjRlO48`3Gqqg(y~Ig}i6M| +_uT܌vMVT|H!muYb~CZC?f xPu4;{pe~B6C 僚PP$#vgʈU|Y#^:Þ˚U5xY ˚[˚N5yaifb@{xaK /ln#/= C\mȒ<'LOn'QCTɭ@_LE뿳Aydtuҭ0@lnksƺck m陼xQf WoߌҀ7IYp1Ia_M6ⱖEU=ezf7T]S+ yMSmfHU:oeo6*a#5QώcgplTF=۷/){&Sd}*U7\ QGZ[&n-PSV6[Us71Ox̂^kXFӕ?@_ߠ\;7 #gut{`̌\`&/aa -&ڤ'֪Ý[bYi8a+9 5y{sLAkT`09*.SŴ`g+?_6|m΀b|wjxtSQ} c#('p5|όZ`' +#-RL*U z%#qJ7/oOGK[3hRX0Xw֣IkM%b5w"m mDoDD/~&fj]fHxdvdvJ6E-yD3h#yznbJЎ:,>/ +Qox$nUGa:RezX{]eE\[qVtǂ&_c|;<]}FƄ͍ BLD3RMxiE%.*Tx ce3XfT<[RbwٺRiR̮'fQ~,WTgEo=^_tPt7Bpsx}O2'@N{5jYAZҴ О5NzBh | Ohubרբ%(Fh;?Q vJЖVۅY f=h+{ZSd +_m_ s}[DZ:*R-LB*o +/+ш^E+Vj,&XITuFFԦah%)`F`Лj/5䎗i BٻiM dSTʩVSZTTV$h]UU uK:tjN3G1t$#IN wqR]^kUAŵBv. +]me_'2SG j.ڒ"f] +T8|HG;_\ +y)QYcb@TF  >fr\GPf/9]\V keb.*X+zptv$5HoBH nwҎ<H0 ʼnR5!'4TzQv94ŴQ dX[}=;2t fNf$GEՑUӎe !~]0CKjIq o+M_GF .O6Fc hFtrD֋ZR0.qmgc FTӣ00#N쁿cSNl/aq7*ީ7NPki,'WCP6~˵BZVhkjG.+礩*Dە!Isx DRy +5z 2Ȇ12-1tQ.! +i!ZBcֶ|*3Kvng>KT2[ܔ-l{dxc_=·E f> f΁i 엍=45Bgih[$ж--E)xF϶T6%<;M =D2xz%BO$#_)JOl,bVqu{Fk7F4Vb0,ͳxhP]=wI+% +ONKu:=<'R$,IUdʉnueaI!vRd(()`D~.OjzFZPvAEJ{ZGmA4ZJxUJ+ ? D۬j-:-פ\ X7} p $ǝ0l?Gm@ZV {آ4 P@"+}eW6tKOMQhҲ7?Z +6(#8Hf7Jh`k]i7wyԝQ) b\x>VudI34PPǂBG ,rl|)Ş1^mcRPSb/E3Ъ5ѵ[@8D;ʷDs"KF!q3=ab"q.w@x'\]CvBwi'Ec̨-Ci2YO؜˾Gc:9:sHy]g X=+N#77ŷuFJ,Yhsci12|ňHdxz iNM%2;Uu ˭AF+OOYp g$/Pޠ|%yz$>F90By9F43+:c^yvX0ma +=cNkZ_E3|;=nTUh>!դxPQ<<֨IH wT3J تd:R֗U˵~1멺ҡAzzizv߶jD@(c EQFI#Qo@oWG1=ǙA-ک/p3rP.~sꎨ[Sv3 *+8nHGxdIMCZ 18l@jPcS19o%/퐎!6MB[ٜTF}+D6?ir촤ڵ #UI, M"exUV;,[Ŵ Lצb}F3jHE, +A蒇¤ĪR׊bjÛٽۯ$; QX꥙$wґVZkOD+694G{DK7f!QG3] K4#-I]jFz}2Ngn(kмz + x#~yt8,Q6:lG-R4.M{#̏iq>-n^d;M>4z a-{,-Xguԡ>viSv;ϝ>y-(\MW_6')&!aAuoT+_U&v+@RHU JLJPșbq {a_H(M;U&i\vBMlWmw>,X);<\e$9xi8EZ$ Ip]DCS +^.ԩtS# ϒ,H?_F\ͫ){rC̅x81)wP|tU@H GkI8 :@>&l8Q5q@\I)K QWDKh)^-Bƪ~#[j5C*KɞWvNCx[mGt8I#;fw|+%D0Z_ڬI=ɠT#Ǐ9vx,r|mxCDpj1|‡" GA^UƵQ6 J}IBr5/>m.|)wEQWf*h]V7ő"9/{jA3Q(PjeҎ8!!yw|o.Hk&44#M($˲HmdnEe_wA2|nzQCïH>.hm~H |d5Ly4MkC~g%͂m{&q$_)阭%y#fuOtݳܨJj:z1/xr!6%@~D"i|6#_^ɦع}URG6TuM@uDx|T~߭8)YQԌx$Q[RUmR5W\sq H6KPT;>bu8C 5K1RL`RL.pbНǝUJ/\R/< q,$*^~ԴɯH_FNT ]}3I*"1*}l2WO9v7 x\ i].Q,vv&5IIwv9*'$nk\wyǵ-FSp8jf3ݪBznDcz6KӻY-&^oR^>ՐN'pݯrY*2,kvjUE _d-{fjk|r-+fEUaYl+o5m? *4;$l-ySc|@NґMp9r`s85?qUG?ƮM;٣ &AO~MeR7weUYd,q娓Sܑ{E6g~ `is94r7NmDnP'*vٿBfO4P.i;~XUX.~XT|8OiJ*y[.nOӗ!XJJaQQAyyY2qg\qXe{Y6f.PϨ&la`o㋠”xW<>Ddb]>IE!~`yHRO +,:}).e@ PP}hbd C) |$/ԋJڇ 9 ) ĞKR޺y{ªZ'-*P3j*?Ōu1}~sD3GF/ui%q4 BQ_β zQU*xfDIIk7L6RǬBk3MZ')x>i O8Cdq'^HԿdAg @i}ښf2U="2)*bk׉X4u5>#ʛ$vcG9p[4M8o9)j]|e1B~'T=5g2Ձ$dTǙEU{DT1M5\`&2L)iN jH (Aޑ0fYhOӥF<eƙHU+O;͓T6=0^sFUCƜ۪ I3Т6L~i=;QE +X3zr9iƳљ8zKW =t)ͽ6qK"b-9INC8`&4L +CթI!*c"(iP^Ez2 7m1x4!,OБ%IE0!`v!&Ccw¨IOp !>v"y'‰9bpAD6Nd&؎(:߬ v7 ̰V+;`e\L: &T F;tqěmƿ@.GmnPѴ?46nOŵGJ$=yqPb#:#PHEy7&٢a|G {45p00'W&J@^ IAmc5nH}L5vQ$v%<"vJcԧ^>FC&fryrRɍui25d5tNp*]u-11{22{b'Pαn^m}oܫtbp 83>f5δq_"Y>O(׊qDBlWGs {׽ =H眻}~}nB7%K® $kKt4a-L>fg;?,K~l 08:eݍ\iK$qk +Ida*ޝg;,,A]9w}A{T0&_V'&=F}GHe.>5_3+W>gO 3!-qRPxEu/KԪ߁@BsҲ_MOvQ5M7lT @MTT&lJ؀'kM?~=rzQT' `oRJr'z~DmIuiQU2VK@gn͖s +b Ă%Ėq"8G79M|R.M&&%K+!-=#rGg{QuF4 YU /KIji't0K*m0i +Kvt= 4P)I:3-hAY@tLb)'C/[ݣ҂VUPp^T@?tJDy]l^?d[x*=恽=?.nY^Od Acw}QlYb '*Q۱Ɯn Y@.>;4FX[ţNj6h{âpiY +"Iw#`BbUFfXIan۹kV˰JgrKJQR r_|vvkfgHIJgb>hŤl 5LjiH%(R16@6"_" g5H6!.l>r +;7nRdd)28 %iJu۽Fe?`VMoɗny>O.qLe<ݲP=S'Ջ1882 2vS Y;} +,r`Pq!o/=F+y'T l$>or?SFm r +g +1*եӰNKhoRĘٕ2J3.سCg2jJ!ko"{͙>bUldJסc +ʨU-q~/# J8V^FvjE3 o[k.{ݏAUg'p0ٍAogax! >Ln뎭 -GbŞL%8o&xpEw+^…n3/z#2BwD ܶӊW~/L˼oO㫩/b:&%ʞuIGHi[\9 Rx/޼$*0$uڹwWv?lV$6$'dpeqT'2 C\%F*gDv; x'/-o[.6Q6 z?@1$q"˒G!K`E@<y-yutK<O-QT ɠ[pV +h'Sv2wor%=h!G']",]g>"{Q00Is +kB#.,U60o2eC,zn5#V'Ly9$|h#@V8A]X=А߅ԃ,*0~Ńq@Se S;wz$ ܏ h{*$W.0}`zX8{3Љ4OA3|cڸi.PزE꩖,zCvw8!7Z.9|n=mO_n_kꙮ%!mf@HKs#A]x$ \.0Y}3%7t擠$uct\'|[X) + TlGƜ`4j{zCH2RPꅼp"rBKѺߝP1*k($Uݴlb(R5o n\\E#bt9޷[m@(>`&-Qj}&oLn57ՙ_x|h"h7O埔a`YpLR="fFL +\%^hXw 2mnN^EnHMX'ѲqkQR;T9ٖPG LЍrp/k__8Ocfq4£z:-<,,װF݈Yx派֎ﭾFn,۷𩠌įt&Aw;5h6ڋ:PgRFSsM($"EHн#6BLfP-"@N'50fUs@]igbC`!ٷ-pQy`T!̄ApQ 4gClY |͟%F&> RRR/ yh;BҹC>8J%=3D4tN%MNGI{gqکNKr"yyF9`H,?ra7ȩݧ\#p-)?2Z#fsq{b.xYopnA>?~ 2LRX +¤;+ziAzʔ|C + 0Mҫ{3eXf=И"L`31?]cOwq\w^)%h!BW'"OABreل~ڐ'@Rx< [MYg& Az6{lR/jAf3&mI +Hd/C\q%Kn#7pN˛͐7Du1bYqklȥp4O`NZ(nZ~/bn JujnyѵXWO*UܗA䎋ص{߼ɗSQɝybH^:?m`O9 )~vM<#M?x>lu67WTn@ST,ET{kEm`]ǒs2ٴd2d)dj)=Un'Yu/tiK`g4feN2hFYorE9Nj[JksƇ䒷RʼVSo"TH'Ƙ:c^Z* Hs*5֚pQ? V;Qs2픒tSJ~$z qPMjTds$ͼ&VZr5e3/`+GDF36.JW&īRB݂gTpf +bѮ_Ƨ}%\'`8noicԙǃ'aPe*TU&a:Pezej+&2Z)&\H6A)T{KDpM1f20G :Oe j|;džXħO!*xد/ B{0d[tN+7P-Ϛ;ik'In'2\&rcd +v[xWUYW{~$w}cge9~=mʈC'Ja97e-;AJW|]M^II:m6FuG4R")#itY/,>"t&CyeMNUY +c$sĶCn10njS;3Nk& X'u3CYM)kg,w'LZC!a񊕝P3!|f%P=s~L˜ BjNTF0D5&p>|=fQlb446CW*X`'aR{UTfp ^RLCH,иjW%8NY(_ُGt9S gJEC@)xohialrY0VP⦬Ål$|N ˁݢm~;I)]*?KEB/;X68ҴsDĹo@G5?0]AB +o +Q8W2 "3Ed; +n_vMktX?ĺ$3RԀO-l7y RAib +nviS+)*sv uQ0dEG/OE+Yi{G11~b`v6syV\:4hln3]'4u"s7 @7@¥ڝQ ^#Z{>]b-LIz +T z'BTO6{mſngwDw!7C=n Τj< F<:56rk*;z>}3k.SqbГ."ڱ vѱ Aee&V `K# ȅ]ifl4?TH4A xC~&/76PA)Peϸw+ioE pI.$\l)5!ƚ3p 3pEtiп â8V\v+hpղ9m$e3"<G)V]*\Fä/aTg%w˴;RX%r/ I26%["WKw\5LԀo;%ػ<{"W9Hv`F,^.$G8g.$Ó3ay{O54_Mg<^øxkʄ|\i&x&Y&{KΚE}yˏ/IU_U56JIͦFHy)`5WFEcF +A4$:^;JG|#_ke' g]W)Ѷ2.6Ob],5jz_1H  +~^@n1ȰCFOeEN,Wa"=+ *.6>#WucG~,jR n_Y "pi|K_^a7gq9GQ @Ht0qz5y:@&,ɺFzqU<1:vpİ|t;_|ďbY#.R/3 G, }z"a"&&_w9%̰+Np>[IeI)lC;nyңGG,c1%#vQ"͗ &2+F;DUJ=1#ٕVbɮK~uȮTwR;̮v +Əǝg==`uG-## +Cb{PAFY=oq9S8kfɼ\ڑ0dB¯IT|<ؽ, =%DzjIwzQn:8Q~06@#Q`֍"/O@bCVcp'_˓HbΤz:'u$yyK.ZjtեlbZy՟Ջ&U%&|`;?$2MWOu@s3.o1n9&iyyDέ9L.qz#^.qJGd).Q1WXx2Oڤh F,WNւkPu$λcʡzIA4 ǸzTfoV`\XBYϴ\.39ICZgըy:`}ٿ&qOtjIRZnuH ;LuoXxT.!h}Nu`/DN\E;740RLDV\I{4zQ#VId!r~/jOp;/ VϹÓuh,e.AI(ba4|;JHq$nl2Kz5X/첩?Ӗf"{M2N2pSʨ=e>"=PF@!we=Qx(C(c>]clg^r{UFωanqp%@G6mywө`` +Wdk:.wX -V~<LGn1zt%9iYdB>yTQB&}ǖe8J/+,N=R{dG<@6ߞc /6}F`w @~bi4yy&`rf"`h74p{=`8['MQowtFg r\BٿY,a~E+v t[5?ȅPhx5 t%")؉&F\ҦmWO!s˶t% npx@֙U#f>_x^ N +]6LZiV ԦF<Ľ7A1K9Xh:Ȃ}7ނ<iژw zKV7U@؏F0Nlz$U wd ^uՠx+&GL\F\%*a6~U[?ƓZuGZ 50rSJ Z5re,)YM&8d&= ՈWa(8(h뱍<X ̑RoF-ȐtB{kN#qfJٜ^4IbPJsçͽqE5MWUJp8ḻ~ l+ᦟ?'H|Ն&]2BJ[@wbXvGpyfgƖΨ2xQlür/$+rSUbf +GFuUV{ [!r驎SypQt!#;Vʃs(o.qs:*y3ߏLJGĸ۲9.NhWjj`< ъè#wiNwW$"e1WziG9&Fx@800i TU: `@01C&C[L!`A80m" ^.|ovm]A`j7L{iHn۝Zvm'˦*{E~"@_^v˷7;f8v/X X_⥣`!DZc^|bª3@k^H.5I"Hg(*8)M<ڊSB^B'p) 8E/߳;޼ Կ a}4/XHU %=2NwuhnW#jΤ#yP؃Bf/o&5#$I{M0Nid{QSВJݝп+vWn~VFOi.&f7B@ѩŜMwqλX(!u4O5o6 `,e{ᩥXYS +!.%Z9@P}=k*;0;C j6 3bK)[?Q\[-[7XgA|n& P+CǞ҄f;F  #M=,z‬@1t,Co΁-w&`] 6I|8t6˨@ .JBz΂ْ @YԠK315ċB^ǠQ@5z(V@HH\'r.ъ9BmFJQD kP}&8*+F,|Zۄlӟi:Y8gH'g؞/nj,{,&8JtApLGra; ߽욉t. D. w~B7B*1.1W_]rJb4o[C)?_^yF }inuERҋ}>0÷F2Pd^LuPݤl`6hO,w',"ׇjQ`Į>lNwtXR:,DLRjZ/I{JA$ϏC^>" +.)a#m A@nODZq5{Xt{r]%!>RW&bI{N{TމG`Fo>P鳹r鳅&/(t a?FO`*)ۉb?!s*=>T8:h4h-l +Emdϥ[+byQdj + 3f%K6!ʲ. 6}yЕHW{g6Yzx߼bH+!s<A! 9:~VIFHfsX#UNUBml|mQч_?ieA ouCC;(#5;z?XmbIKRKp%ZE,]Œî~x| q@8.OJ=Acȓ2U9$(@yPܟtQj:X: +x~*V״i&5XcOLKHU,MtɆF$+ǹGa r_q_ɮlO :)Y~]5\ǽSic+v 6q L9,,"̪m3{zx^9?FR/ծPK^Cq +œK׎V S%B}ؿ!hf!ɄOD͂>rA9,Zt3 d*hp^6xMxYay ڷZ tu5{)p,QW 0kZⷮ|H_= wMCb)14sH7imYaI>~*\| 5P}cӠ@͍EJtbf15q} B=7`^3B&g6\LgO[П> ?v⪨c4Y>l2If6YN /jv`-Xsb}9Ǎ?.KOP:з)yU̔hԑ0%&zm|dK-ɕZҜ̍y䀱J]gt)feT9Z0Bbeo%szw/VS?u`~')Djtw'38`,?_pr6oYO%^d1\o+[Ak+P:C~YKQbaOԫׇNH<CJ~|/K.'ivsӧ0*IB]e lsA+%/x;͈#8. U +JhargeTnu~c98#ˇ"m`[mdV̋iL=F͆/喭6Pg̯^K +K~F-yӇ{Pl9 q+w€NohBx"2p8KYrJc3p5$I^rm$彈 +|}Cwͻ +ɛWMK)xVH?\kZ1H$RhP6>ٝ-$g2'/o t=|a +7;4 K1?do]?x?k/ EKx+zT'{NPϘϮ[m0^IOxAQ +˷H9~0?`+b1`(w:GhK@ &ZЎg;N`tdA?8xk.7t]vut[6aAzDfE:PN`DX'#…U /,JFt^1ANA7*گh\.U6ԝ + +5ӠE-,e%-8cqT֋xϹ%τleՃF|jwl]x:?|o*tszzYIjkzJ˛6 Ƭ3G4!L@ſ*P 4q# ´1O\*nr| +*4`8?f^*ql%)vlv=E!P{G~cIƮjAL^j=|D;4 0ThJQ.X3R]7 P/r$V9I,\GNJ*_ccbi1]Lt.*F]^?7®r4+ID |?{b}/ȟ&* N*<|nWz %vpT nOmqf)ITBlF3.(5e"Z:C.r/abD7[7usbCo}iGBh^@͗<kG3E-ð`1sefU@z 颩-t +N I@:~fwI,mYX,u` WO3uLeqIEe L( @l5 \v_hmdcQhHykJ7a?KkNA4D9džEFRJHeB!WxVPϿk!\ٓ W6,`Q XFo^QMpb/)kRǚi <,.2 ōoq4b5dhyD;j U_])zK 1"Xf^W*!p2G|竃iz|~fxpݬomb(s. 4hH$ xpaGՀo; ~@ v"saR΅ -W W׃a= ! +N۹v\y:J_%)WHvSf\Pb{Zl6fN:ml93s7_.#.dJY!LY^2[aտ͕cszFc@48Q$2ES~{\W &ɰ$-)BR o~qX/)O <꽀|Y +ndRlSv_B#wf`K++f I1&Hᷪap} Pã>P[W +:> GfPhg@(F6"[ӐLj`^8l̑4 +md0yE jzPL-S(AnqR TԕsbI?, wy4A[D:p:iۦyV +9='2t)v- D+|b٠tH&zNfX<#`U-~AOvruZylwt\uԞ?ͱ{`)z~>J[x2C8q-?K`c?DVXSˏ8{i ñ> ]oL Z?i[/8zuH2UtߛwG,szZ4a!U&4?Z_W.~~egna/y7=4p&Bw"Y-`}Ёe&i`~z}>;qBl^ `|}  =~^key 6?ևji{{L-{f Y9 2 +hZx`B4p %D@q1tOaJҲ&7!Hn +Jqe +Ee#+|NH5xF*(sPlRQ8_pǍ?P88ؙ|${n]>ϛ(0vqPG>n1 CK$ufq2V@'^Zt89zCHX5jEYO܊mm<}TP{8d7EZk 3n',Uo4n)U:SZDO>=zI;:pV򪖬tw(dКͶ<{*pѳ?ȿ/*802z28%HjQ{s:*3-b`i;!PBɰyw*$\+n/PpbfzfJiT-ājg}%d^:-H<^!71l/@K+@ <5ƭ2 œor5!\ qyW PW0O70/$&I,u@l+SuW* .o 2A*;X;{^xb43逆B @H"*,K#RGoB]!F+] dyIG4`ehI!(+0aDBrN9jKjuz2̯XOju`w -Q_/P,;s<=a__7اRӻ1cQ-~4G76ĸ _9F]MT2{ eǕYKh:A*fQ<*Xbm# 7 ]_*^1:݂Oe157K{}pwf=`{ ޽/F+WvtM.&Ha(ö2'TD(kaYȄZ\?am0jzZ p!Pՙ与C7ZN(By?JtMcjtv`-KFNc-PKo +:Y3ePfDZ|{~[9K&9(`Z8D`vB PD7FK$&lTP7r¨ lщGY8п^VUɺ"\ q'OycHᥣ |O}Hn%9@j\fː8ḸB*+$᠌I{V?FUW=m&_A%~u"ߝmrS "z$5^}NB|GZV2ye/ӴNuΡ2YeYz0V2Д?C[2t)MP%nH A2S`[oa@|$z Q hs͵ܔEMٯRp;@f#ڞ:x __]x[\1!Tل% դgʇIjX#@"7RvX!fD +5=X:agˋ-2dofږc(^"m1_g z_ qj + ظg]41Mtc+T(ECO*'fc'<-n#PUH m'wEu;xfp.9xJp&0vRIGTt JєѲ-Q *ꄝifnJ/ko+}{p˖ ʉ 6<% _4Ŀl;0BCPIPvrUଇ5#pZ?lƷDt'eop}MR0 SZw(O~c#F9~NDXO۟11CDbtqSz':ŷ76/S>~^hO^0S%FCU;ERuAS1wr"s;4u?ۯ|`GEi-'yp]#awHf8W!?>NA% +Ek:Yql\ LΪ-{Qe4{m;8l܋ 06pT,GG>"*2V~ I9#u%(a&"T|u.5b% 8=AL~,BLG=~>W_wp4N[86mD DN zkv|@@Uşxd$7 'Z;B)"$^VyTY$qIrl*wʋerlOoUYڊn]mgP^ >.NL7q@vc%ٍȎRgJo5jP&9±.?^0ld3=Aku:}y:90XkLNM35qr8(>>{R)+wW89lkc{sb9dkl {Gwo3oaHqqo7͒M Qh0EۅغЋyTlDA'Ӣ KZx#9=Ⱥ  T~I +?[7gSzhnth-zF!*4tI&51G7E. e$y *Ll"V[vShȗecX/_cVX0S lT&sx4r=T4꺪tqq$'ᩒOslQBl (D|W>Yު R!o?Ë!.3^ؽjZ8#QA:UrKLs׻amOA ">y XO"Jvc aYpXc;H,cNaBKD&BW(R#k2$@\N%[u;$-cz٣>x +^ /KIjX\iG+Z$#$U `lvqo6zy}h :q?\/\|lpy4 T/#)m'jI՜r2_Q^x-8KGQMRت&Ǻ.#HWszGtqZd1 $}O 0S4o0@SA_?Hr,$?m\ 8GXsN͔e0|{meh5ܵWLLݓĭAǷdjY'RH3H.JlиA*ߩ$#eC mRq0 OPtycXِVDn[o_]wBk0]nfR :%i@ 2MdˠBbƊ] +>r}sW"SG"6>[w ]~]]"KD/w,%mͳ/JT_k*$*5TL%ۤ\O_x6êk1Qm:CH=F77~(SS^hAs K\&4!6GU%v +C% OU5HJ|I: iDZ*zJy5eGrW>0*/@0Q* k ^l)jnI@!knR@0}dJL#+`Un0xx3x$S"P9B*?.֛߻b2{uz}@v f`tt_&J'&0d \2Y0ܔM! F +NgѻK ?-Cjfi["abV- a̔]p :F1D#I|DH(sq!?&gݤ'w8N])<+l4O޴̣A!kPrk@CRUs-Ԩ+bkj +^$F*YqjX UЮvUjWǥ]%pNdvuÀ((YF"A VG}/Ψq!L~hqԸh5jqH=h\Ki\tZ/|8A ZXžF)haS #_/ha Z>ewV7ʗk*8xWN:īֶi軾zNA[bۡ]dLMPozS\Kԛ \G#%'qU|ZD38`]ݫ]Gޞvzٍp+ATo*| ALhm>ء7曕L`Tо#!GY +1<]K[HT˶\8z[ph!|ov 1 Y=@nq>. {O$x|a>e(A=^V k%Oڣ{{WЯx]RQ#fC' [=Vw,w*W +v/DM+(/%B~+JR6׉ov$Z#|]忣~}?>G/Ur6siKhxEYN7[5eaW+6ilxd6iòٲ>,i+{-d~D&7M9sPV7$`wG _@E _E Q=')GÃɔυC_Tن^tjkE9w$tT8SSlFۨ츍ΩkG.GfZ[6x-FVm}~8..wOgR֒A|Cx~JM+D}Dd jV@_dҖ]de$q?^p ]#]C2j=[#φߡ0oDr(^S +Z֥o#.Ϊbnb&*4L&*[Mhg|%bݮW2vi&,B-n!Nb|sǸεܹqcԞÛz<|Xo!ۯ(mPiI[dg+dZ87~jńː ]:ǛcQ}2xcLRŜǿW?&nK'ZH薰&%C~>So_VvF/;jHZ6d@+6gYoٜUn8Sʲ}6`Ie8w3N)sfVMݒdaba;/rt1Fx:/4:&x-)mޝ E$C + +͜ڎk,y +#[FkgW:r)W C')~OJ%V +}o+q%t߇5aX*T`)!YUȦim7lHt(P+ڑ'R#׮@Iηp'T+zjDr8uV%syCys`ĽJ~4Mh\hzN,fqf8]Nzi,7&h-dUHnfjf6˦hXԍш'}ݻ߭N]j{rRpWQG[g =7Գt i&F^t}\/Ø}2;wsPN]B|\aqp9,_75U|{m5|< P|͡Чn!GFsͱq`KݾmAIʭ@C!~LJ{U\ y]c:&jADX)^k:hqxy CW!)l}0}m.|"#Q瀺REBGs!(h +cċϿot:hC>f_9%JpZe{?8R^O_w?߆worv٫=>;?᧏E~ӷv]Gb~ou F> y6YSTϷ#?0ԫݝQJ$LA4 hf-Ԃ[dlCMc;z폌Un;vA2vQmgWVWH_*pIOs9 +,y\R" \ No newline at end of file diff --git a/core/modules/system/tests/fixtures/update/drupal-8.entity-test-to-rev-conversion-enabled.php b/core/modules/system/tests/fixtures/update/drupal-8.entity-test-to-rev-conversion-enabled.php new file mode 100644 index 0000000..fd77660 --- /dev/null +++ b/core/modules/system/tests/fixtures/update/drupal-8.entity-test-to-rev-conversion-enabled.php @@ -0,0 +1,30 @@ +select('key_value') + ->fields('key_value', ['value']) + ->condition('collection', 'post_update') + ->condition('name', 'existing_updates') + ->execute() + ->fetchField(); +$existing_updates = unserialize($existing_updates); +if ($key = array_search('entity_test_revisionable_schema_converter_post_update_make_revisionable', $existing_updates)) { + unset($existing_updates[$key]); +} +$connection->update('key_value') + ->fields([ + 'value' => serialize($existing_updates), + ]) + ->condition('collection', 'post_update') + ->condition('name', 'existing_updates') + ->execute(); diff --git a/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/config/install/field.field.entity_test_to_rev_conversion.entity_test_to_rev_conversion.field_test_configurable_field.yml b/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/config/install/field.field.entity_test_to_rev_conversion.entity_test_to_rev_conversion.field_test_configurable_field.yml new file mode 100644 index 0000000..5b82415 --- /dev/null +++ b/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/config/install/field.field.entity_test_to_rev_conversion.entity_test_to_rev_conversion.field_test_configurable_field.yml @@ -0,0 +1,21 @@ +langcode: en +status: true +dependencies: + config: + - field.storage.entity_test_to_rev_conversion.field_test_configurable_field + module: + - entity_test_revisionable_schema_converter +id: entity_test_to_rev_conversion.entity_test_to_rev_conversion.field_test_configurable_field +field_name: field_test_configurable_field +entity_type: entity_test_to_rev_conversion +bundle: entity_test_to_rev_conversion +label: 'Test configurable field' +description: '' +required: false +translatable: true +default_value: + - + value1: { } +default_value_callback: '' +settings: { } +field_type: multi_value_test diff --git a/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/config/install/field.storage.entity_test_to_rev_conversion.field_test_configurable_field.yml b/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/config/install/field.storage.entity_test_to_rev_conversion.field_test_configurable_field.yml new file mode 100644 index 0000000..195e121 --- /dev/null +++ b/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/config/install/field.storage.entity_test_to_rev_conversion.field_test_configurable_field.yml @@ -0,0 +1,17 @@ +langcode: en +status: true +dependencies: + module: + - entity_test_revisionable_schema_converter +id: entity_test_to_rev_conversion.field_test_configurable_field +field_name: field_test_configurable_field +entity_type: entity_test_to_rev_conversion +type: multi_value_test +settings: { } +module: entity_test_revisionable_schema_converter +locked: false +cardinality: -1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/config/schema/entity_test_revisionable_schema_converter.schema.yml b/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/config/schema/entity_test_revisionable_schema_converter.schema.yml new file mode 100644 index 0000000..5c60457 --- /dev/null +++ b/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/config/schema/entity_test_revisionable_schema_converter.schema.yml @@ -0,0 +1,9 @@ +field.value.multi_value_test: + type: mapping + label: 'Default value' + mapping: + value1: + type: sequence + sequence: + type: string + label: 'First value' diff --git a/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/entity_test_revisionable_schema_converter.info.yml b/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/entity_test_revisionable_schema_converter.info.yml new file mode 100644 index 0000000..d3d6349 --- /dev/null +++ b/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/entity_test_revisionable_schema_converter.info.yml @@ -0,0 +1,6 @@ +name: 'Entity Revisionable Schema Converter Test' +type: module +description: 'Provides an entity type for testing the revisionable schema converter.' +package: Testing +version: VERSION +core: 8.x diff --git a/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/entity_test_revisionable_schema_converter.module b/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/entity_test_revisionable_schema_converter.module new file mode 100644 index 0000000..d844be9 --- /dev/null +++ b/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/entity_test_revisionable_schema_converter.module @@ -0,0 +1,47 @@ +id() == 'entity_test_to_rev_conversion') { + $fields = array(); + $fields['test_entity_base_field_info'] = BaseFieldDefinition::create('string') + ->setLabel(new TranslatableMarkup('Field added by hook_entity_base_field_info()')) + ->setTranslatable(TRUE) + ->setRevisionable(TRUE); + + return $fields; + } +} + +/** + * Implements hook_entity_type_alter(). + */ +function entity_test_revisionable_schema_converter_entity_type_alter(array &$entity_types) { + // Allow entity_test_to_rev_conversion tests to override the entity type + // definition. + $entity_types['entity_test_to_rev_conversion'] = \Drupal::state()->get('entity_test_to_rev_conversion.entity_type', $entity_types['entity_test_to_rev_conversion']); +} + +/** + * Implements hook_entity_presave(). + */ +function entity_test_revisionable_schema_converter_entity_presave(EntityInterface $entity) { + // Simulate an error during the save process of a test entity. + if ($entity->getEntityTypeId() === 'entity_test_to_rev_conversion' && \Drupal::state()->get('entity_test_to_rev_conversion.throw_exception', FALSE)) { + throw new \Exception('Peekaboo!'); + } +} diff --git a/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/entity_test_revisionable_schema_converter.post_update.php b/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/entity_test_revisionable_schema_converter.post_update.php new file mode 100644 index 0000000..9335410 --- /dev/null +++ b/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/entity_test_revisionable_schema_converter.post_update.php @@ -0,0 +1,39 @@ +convertToRevisionable( + $sandbox, + 'entity_test_to_rev_conversion', + [ + 'test_single_property', + 'test_multiple_properties', + 'test_single_property_multiple_values', + 'test_multiple_properties_multiple_values', + 'test_entity_base_field_info', + ]); +} + +/** + * @} End of "addtogroup updates-8.3.x". + */ diff --git a/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/src/Entity/EntityTestToRevConversion.php b/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/src/Entity/EntityTestToRevConversion.php new file mode 100644 index 0000000..329417c --- /dev/null +++ b/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/src/Entity/EntityTestToRevConversion.php @@ -0,0 +1,77 @@ +getEntityTypeId(); + } + } + + /** + * {@inheritdoc} + */ + public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { + $fields = parent::baseFieldDefinitions($entity_type); + + $fields['test_single_property'] = BaseFieldDefinition::create('string') + ->setLabel(new TranslatableMarkup('Field with a single property')) + ->setTranslatable(TRUE) + ->setRevisionable(TRUE); + + $fields['test_multiple_properties'] = BaseFieldDefinition::create('multi_value_test') + ->setLabel(new TranslatableMarkup('Field with multiple properties')) + ->setTranslatable(TRUE) + ->setRevisionable(TRUE); + + $fields['test_single_property_multiple_values'] = BaseFieldDefinition::create('string') + ->setLabel(new TranslatableMarkup('Field with a single property and multiple values')) + ->setCardinality(2) + ->setTranslatable(TRUE) + ->setRevisionable(TRUE); + + $fields['test_multiple_properties_multiple_values'] = BaseFieldDefinition::create('multi_value_test') + ->setLabel(new TranslatableMarkup('Field with multiple properties and multiple values')) + ->setCardinality(2) + ->setTranslatable(TRUE) + ->setRevisionable(TRUE); + + return $fields; + } + +} diff --git a/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/src/Plugin/Field/FieldType/MultiValueTestItem.php b/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/src/Plugin/Field/FieldType/MultiValueTestItem.php new file mode 100644 index 0000000..fc75af3 --- /dev/null +++ b/core/modules/system/tests/modules/entity_test_revisionable_schema_converter/src/Plugin/Field/FieldType/MultiValueTestItem.php @@ -0,0 +1,66 @@ +setLabel(t('First value')); + + $properties['value2'] = DataDefinition::create('string') + ->setLabel(t('Second value')); + + return $properties; + } + + /** + * {@inheritdoc} + */ + public static function schema(FieldStorageDefinitionInterface $field_definition) { + return [ + 'columns' => [ + 'value1' => [ + 'type' => 'varchar', + 'length' => 64, + ], + 'value2' => [ + 'type' => 'varchar', + 'length' => 64, + ], + ], + ]; + } + + /** + * {@inheritdoc} + */ + public function isEmpty() { + $item = $this->getValue(); + return empty($item['value1']) && empty($item['value2']); + } + + /** + * {@inheritdoc} + */ + public static function mainPropertyName() { + return 'value1'; + } + +} diff --git a/core/tests/Drupal/Tests/Core/Entity/RevisionableSchemaConverterTest.php b/core/tests/Drupal/Tests/Core/Entity/RevisionableSchemaConverterTest.php new file mode 100644 index 0000000..994a1b8 --- /dev/null +++ b/core/tests/Drupal/Tests/Core/Entity/RevisionableSchemaConverterTest.php @@ -0,0 +1,335 @@ +lastInstalledSchemaRepository = \Drupal::service('entity.last_installed_schema.repository'); + $this->installedStorageSchema = \Drupal::keyValue('entity.storage_schema.sql'); + } + + /** + * {@inheritdoc} + */ + protected function setDatabaseDumpFiles() { + $this->databaseDumpFiles = [ + __DIR__ . '/../../../../../modules/system/tests/fixtures/update/drupal-8.2.0-filled.standard.entity_test_to_rev_conversion.php.gz', + __DIR__ . '/../../../../../modules/system/tests/fixtures/update/drupal-8.entity-test-to-rev-conversion-enabled.php', + ]; + } + + /** + * Tests the conversion of an entity type to revisionable. + */ + public function testMakeRevisionable() { + // Check that entity type is not revisionable prior to running the update + // process. + $entity_test_to_rev_conversion = $this->lastInstalledSchemaRepository->getLastInstalledDefinition('entity_test_to_rev_conversion'); + $this->assertFalse($entity_test_to_rev_conversion->isRevisionable()); + + // Make the entity type revisionable and run the updates. + $this->updateEntityTypeToRevisionable(); + + $this->runUpdates(); + + /** @var \Drupal\Core\Entity\EntityTypeInterface $entity_test_to_rev_conversion */ + $entity_test_to_rev_conversion = $this->lastInstalledSchemaRepository->getLastInstalledDefinition('entity_test_to_rev_conversion'); + $this->assertTrue($entity_test_to_rev_conversion->isRevisionable()); + + /** @var \Drupal\Core\Entity\Sql\SqlEntityStorageInterface $storage */ + $storage = \Drupal::entityTypeManager()->getStorage('entity_test_to_rev_conversion'); + $this->assertEqual(count($storage->loadMultiple()), 101, 'All test entities were found.'); + + // Check that each field value was copied correctly to the revision tables. + for ($i = 1; $i <= 101; $i++) { + $revision = $storage->loadRevision($i); + + $this->assertEqual($i . ' - test single property', $revision->test_single_property->value); + + $this->assertEqual($i . ' - test multiple properties - value1', $revision->test_multiple_properties->value1); + $this->assertEqual($i . ' - test multiple properties - value2', $revision->test_multiple_properties->value2); + + $this->assertEqual($i . ' - test single property multiple values 0', $revision->test_single_property_multiple_values->value); + $this->assertEqual($i . ' - test single property multiple values 1', $revision->test_single_property_multiple_values[1]->value); + + $this->assertEqual($i . ' - test multiple properties multiple values - value1 0', $revision->test_multiple_properties_multiple_values[0]->value1); + $this->assertEqual($i . ' - test multiple properties multiple values - value2 0', $revision->test_multiple_properties_multiple_values[0]->value2); + $this->assertEqual($i . ' - test multiple properties multiple values - value1 1', $revision->test_multiple_properties_multiple_values[1]->value1); + $this->assertEqual($i . ' - test multiple properties multiple values - value2 1', $revision->test_multiple_properties_multiple_values[1]->value2); + + $this->assertEqual($i . ' - field test configurable field - value1 0', $revision->field_test_configurable_field[0]->value1); + $this->assertEqual($i . ' - field test configurable field - value2 0', $revision->field_test_configurable_field[0]->value2); + $this->assertEqual($i . ' - field test configurable field - value1 1', $revision->field_test_configurable_field[1]->value1); + $this->assertEqual($i . ' - field test configurable field - value2 1', $revision->field_test_configurable_field[1]->value2); + + $this->assertEqual($i . ' - test entity base field info', $revision->test_entity_base_field_info->value); + + // Do the same checks for translated field values. + $translation = $revision->getTranslation('ro'); + + $this->assertEqual($i . ' - test single property - ro', $translation->test_single_property->value); + + $this->assertEqual($i . ' - test multiple properties - value1 - ro', $translation->test_multiple_properties->value1); + $this->assertEqual($i . ' - test multiple properties - value2 - ro', $translation->test_multiple_properties->value2); + + $this->assertEqual($i . ' - test single property multiple values 0 - ro', $translation->test_single_property_multiple_values[0]->value); + $this->assertEqual($i . ' - test single property multiple values 1 - ro', $translation->test_single_property_multiple_values[1]->value); + + $this->assertEqual($i . ' - test multiple properties multiple values - value1 0 - ro', $translation->test_multiple_properties_multiple_values[0]->value1); + $this->assertEqual($i . ' - test multiple properties multiple values - value2 0 - ro', $translation->test_multiple_properties_multiple_values[0]->value2); + $this->assertEqual($i . ' - test multiple properties multiple values - value1 1 - ro', $translation->test_multiple_properties_multiple_values[1]->value1); + $this->assertEqual($i . ' - test multiple properties multiple values - value2 1 - ro', $translation->test_multiple_properties_multiple_values[1]->value2); + + $this->assertEqual($i . ' - field test configurable field - value1 0 - ro', $translation->field_test_configurable_field[0]->value1); + $this->assertEqual($i . ' - field test configurable field - value2 0 - ro', $translation->field_test_configurable_field[0]->value2); + $this->assertEqual($i . ' - field test configurable field - value1 1 - ro', $translation->field_test_configurable_field[1]->value1); + $this->assertEqual($i . ' - field test configurable field - value2 1 - ro', $translation->field_test_configurable_field[1]->value2); + + $this->assertEqual($i . ' - test entity base field info - ro', $translation->test_entity_base_field_info->value); + } + + // Check that temporary tables have been removed at the end of the process. + $schema = \Drupal::database()->schema(); + foreach ($storage->getTableMapping()->getTableNames() as $table_name) { + $this->assertFalse($schema->tableExists(TemporaryTableMapping::getTempTableName($table_name))); + } + } + + /** + * Tests that a failed "make revisionable" update preserves the existing data. + */ + public function testMakeRevisionableErrorHandling() { + $original_entity_type = $this->lastInstalledSchemaRepository->getLastInstalledDefinition('entity_test_to_rev_conversion'); + $original_storage_definitions = $this->lastInstalledSchemaRepository->getLastInstalledFieldStorageDefinitions('entity_test_to_rev_conversion'); + + $original_entity_schema_data = $this->installedStorageSchema->get('entity_test_to_rev_conversion.entity_schema_data', []); + foreach ($original_storage_definitions as $storage_definition) { + $original_field_schema_data[$storage_definition->getName()] = $this->installedStorageSchema->get('entity_test_to_rev_conversion.field_schema_data.' . $storage_definition->getName(), []); + } + + // Check that entity type is not revisionable prior to running the update + // process. + $this->assertFalse($original_entity_type->isRevisionable()); + + // Make the update throw an exception during the entity save process. + \Drupal::state()->set('entity_test_to_rev_conversion.throw_exception', TRUE); + + // Since the update process is interrupted by the exception thrown above, + // we can not do the full post update testing offered by UpdatePathTestBase. + $this->checkFailedUpdates = FALSE; + + // Make the entity type revisionable and run the updates. + $this->updateEntityTypeToRevisionable(); + + $this->runUpdates(); + + // Check that the update failed. + $this->assertRaw('' . t('Failed:') . ''); + + // Check that the last installed entity type definition is kept as + // non-revisionable. + $new_entity_type = $this->lastInstalledSchemaRepository->getLastInstalledDefinition('entity_test_to_rev_conversion'); + $this->assertFalse($new_entity_type->isRevisionable(), 'The entity type is kept unchanged.'); + + // Check that the last installed field storage definitions did not change by + // looking at the 'langcode' field, which is updated automatically. + $new_storage_definitions = $this->lastInstalledSchemaRepository->getLastInstalledFieldStorageDefinitions('entity_test_to_rev_conversion'); + $langcode_key = $original_entity_type->getKey('langcode'); + $this->assertEqual($original_storage_definitions[$langcode_key]->isRevisionable(), $new_storage_definitions[$langcode_key]->isRevisionable(), "The 'langcode' field is kept unchanged."); + + /** @var \Drupal\Core\Entity\Sql\SqlEntityStorageInterface $storage */ + $storage = \Drupal::entityTypeManager()->getStorage('entity_test_to_rev_conversion'); + + // Check that installed storage schema did not change. + $new_entity_schema_data = $this->installedStorageSchema->get('entity_test_to_rev_conversion.entity_schema_data', []); + $this->assertEqual($original_entity_schema_data, $new_entity_schema_data); + + foreach ($new_storage_definitions as $storage_definition) { + $new_field_schema_data[$storage_definition->getName()] = $this->installedStorageSchema->get('entity_test_to_rev_conversion.field_schema_data.' . $storage_definition->getName(), []); + } + $this->assertEqual($original_field_schema_data, $new_field_schema_data); + + // Check that temporary tables have been removed. + $schema = \Drupal::database()->schema(); + foreach ($storage->getTableMapping()->getTableNames() as $table_name) { + $this->assertFalse($schema->tableExists(TemporaryTableMapping::getTempTableName($table_name))); + } + + // Check that the original tables still exist and their data is intact. + $this->assertTrue($schema->tableExists('entity_test_to_rev_conversion')); + $this->assertTrue($schema->tableExists('entity_test_to_rev_conversion_field_data')); + + $base_table_count = \Drupal::database()->select('entity_test_to_rev_conversion') + ->countQuery() + ->execute() + ->fetchField(); + $this->assertEqual($base_table_count, 101); + + $data_table_count = \Drupal::database()->select('entity_test_to_rev_conversion_field_data') + ->countQuery() + ->execute() + ->fetchField(); + // There are two records for each entity, one for English and one for + // Romanian. + $this->assertEqual($data_table_count, 202); + + $base_table_row = \Drupal::database()->select('entity_test_to_rev_conversion') + ->fields('entity_test_to_rev_conversion') + ->condition('id', 1, '=') + ->condition('langcode', 'en', '=') + ->execute() + ->fetchAllAssoc('id'); + $this->assertEqual('190ba232-35d9-4a3c-b909-e052ab5b8e93', $base_table_row[1]->uuid); + + $data_table_table_row = \Drupal::database()->select('entity_test_to_rev_conversion_field_data') + ->fields('entity_test_to_rev_conversion_field_data') + ->condition('id', 1, '=') + ->condition('langcode', 'en', '=') + ->execute() + ->fetchAllAssoc('id'); + $this->assertEqual('1 - test single property', $data_table_table_row[1]->test_single_property); + $this->assertEqual('1 - test multiple properties - value1', $data_table_table_row[1]->test_multiple_properties__value1); + $this->assertEqual('1 - test multiple properties - value2', $data_table_table_row[1]->test_multiple_properties__value2); + $this->assertEqual('1 - test entity base field info', $data_table_table_row[1]->test_entity_base_field_info); + } + + /** + * Creates entities for the database dump used in this update test. + * + * This method is only useful for generating test content for + * drupal-8.2.0-filled.standard.entity_test_to_rev_conversion.php.gz and it is + * NOT used during the test execution. + * + * That database dump also has the following characteristics: + * - Standard profile; + * - The 'entity_test_revisionable_schema_converter' module is enabled; + * - Language and Content Translation modules enabled; + * - The Romanian language added; + * - All fields from the 'entity_test_to_rev_conversion' entity type are + * marked as translatable through Content Translation settings. + */ + public static function createTestEntities() { + // Create 101 items so the batch upgrade runs at least two times. + for ($i = 1; $i <= 101; $i++) { + $entity = EntityTestToRevConversion::create([ + 'name' => $i, + 'test_single_property' => $i . ' - test single property', + 'test_multiple_properties' => [[ + 'value1' => $i . ' - test multiple properties - value1', + 'value2' => $i . ' - test multiple properties - value2', + ]], + 'test_single_property_multiple_values' => [ + ['value' => $i . ' - test single property multiple values 0'], + ['value' => $i . ' - test single property multiple values 1'] + ], + 'test_multiple_properties_multiple_values' => [ + [ + 'value1' => $i . ' - test multiple properties multiple values - value1 0', + 'value2' => $i . ' - test multiple properties multiple values - value2 0', + ], + [ + 'value1' => $i . ' - test multiple properties multiple values - value1 1', + 'value2' => $i . ' - test multiple properties multiple values - value2 1', + ] + ], + 'field_test_configurable_field' => [ + [ + 'value1' => $i . ' - field test configurable field - value1 0', + 'value2' => $i . ' - field test configurable field - value2 0', + ], + [ + 'value1' => $i . ' - field test configurable field - value1 1', + 'value2' => $i . ' - field test configurable field - value2 1', + ] + ], + 'test_entity_base_field_info' => $i . ' - test entity base field info', + ]); + $entity->addTranslation('ro', [ + 'name' => $i . ' - ro', + 'test_single_property' => $i . ' - test single property - ro', + 'test_multiple_properties' => [[ + 'value1' => $i . ' - test multiple properties - value1 - ro', + 'value2' => $i . ' - test multiple properties - value2 - ro', + ]], + 'test_single_property_multiple_values' => [ + ['value' => $i . ' - test single property multiple values 0 - ro'], + ['value' => $i . ' - test single property multiple values 1 - ro'] + ], + 'test_multiple_properties_multiple_values' => [ + [ + 'value1' => $i . ' - test multiple properties multiple values - value1 0 - ro', + 'value2' => $i . ' - test multiple properties multiple values - value2 0 - ro', + ], + [ + 'value1' => $i . ' - test multiple properties multiple values - value1 1 - ro', + 'value2' => $i . ' - test multiple properties multiple values - value2 1 - ro', + ] + ], + 'field_test_configurable_field' => [ + [ + 'value1' => $i . ' - field test configurable field - value1 0 - ro', + 'value2' => $i . ' - field test configurable field - value2 0 - ro', + ], + [ + 'value1' => $i . ' - field test configurable field - value1 1 - ro', + 'value2' => $i . ' - field test configurable field - value2 1 - ro', + ] + ], + 'test_entity_base_field_info' => $i . ' - test entity base field info - ro', + ]); + + $entity->save(); + } + } + + /** + * Updates the 'entity_test_to_rev_conversion' entity type to revisionable. + */ + protected function updateEntityTypeToRevisionable() { + $entity_type = clone \Drupal::entityTypeManager()->getDefinition('entity_test_to_rev_conversion'); + + $keys = $entity_type->getKeys(); + $keys['revision'] = 'revision_id'; + $entity_type->set('entity_keys', $keys); + + $entity_type->set('revision_table', 'entity_test_to_rev_conversion_revision'); + $entity_type->set('revision_data_table', 'entity_test_to_rev_conversion_field_revision'); + + \Drupal::state()->set('entity_test_to_rev_conversion.entity_type', $entity_type); + } + +}