merged heads? something-or-other sync
authorKrista 'DarthMama' Bennett <krista@pep.foundation>
Thu, 16 Jan 2020 12:40:10 +0100
branchsync
changeset 433526931e212219
parent 4332 9550b80c2289
parent 4333 bdff636e4648
child 4336 628cb20cd08a
merged heads? something-or-other
     1.1 --- a/src/bloblist.c	Wed Jan 15 17:13:00 2020 +0100
     1.2 +++ b/src/bloblist.c	Thu Jan 16 12:40:10 2020 +0100
     1.3 @@ -163,6 +163,22 @@
     1.4      return list_curr->next;
     1.5  }
     1.6  
     1.7 +DYNAMIC_API bloblist_t* bloblist_join(bloblist_t* first, bloblist_t* second) {
     1.8 +    if (!first)
     1.9 +        return second;
    1.10 +    if (!second)
    1.11 +        return first;
    1.12 +    
    1.13 +    bloblist_t* list_curr = first;
    1.14 +    
    1.15 +    while (list_curr->next) {
    1.16 +        list_curr = list_curr->next;
    1.17 +    }
    1.18 +    list_curr->next = second;
    1.19 +    
    1.20 +    return first;
    1.21 +}
    1.22 +
    1.23  DYNAMIC_API int bloblist_length(const bloblist_t *bloblist)
    1.24  {
    1.25      int len = 0;
     2.1 --- a/src/bloblist.h	Wed Jan 15 17:13:00 2020 +0100
     2.2 +++ b/src/bloblist.h	Thu Jan 16 12:40:10 2020 +0100
     2.3 @@ -126,6 +126,7 @@
     2.4  DYNAMIC_API void set_blob_disposition(bloblist_t* blob, 
     2.5          content_disposition_type disposition);
     2.6  
     2.7 +DYNAMIC_API bloblist_t* bloblist_join(bloblist_t* first, bloblist_t* second);
     2.8  
     2.9  #ifdef __cplusplus
    2.10  }
     3.1 --- a/src/key_reset.c	Wed Jan 15 17:13:00 2020 +0100
     3.2 +++ b/src/key_reset.c	Thu Jan 16 12:40:10 2020 +0100
     3.3 @@ -7,7 +7,10 @@
     3.4  #include "key_reset.h"
     3.5  #include "distribution_codec.h"
     3.6  #include "map_asn1.h"
     3.7 +#include "keymanagement.h"
     3.8 +#include "baseprotocol.h"
     3.9  #include "../asn.1/Distribution.h"
    3.10 +#include "Sync_impl.h" // this seems... bad
    3.11  
    3.12  #include <string.h>
    3.13  #include <stdlib.h>
    3.14 @@ -17,8 +20,234 @@
    3.15  #define KEY_RESET_MAJOR_VERSION 1L
    3.16  #define KEY_RESET_MINOR_VERSION 0L
    3.17  
    3.18 +static PEP_STATUS _generate_reset_structs(PEP_SESSION session,
    3.19 +                                          const pEp_identity* reset_ident,
    3.20 +                                          const char* old_fpr,
    3.21 +                                          const char* new_fpr,
    3.22 +                                          bloblist_t** key_attachments,
    3.23 +                                          keyreset_command_list** command_list,
    3.24 +                                          bool include_secret) {
    3.25 +
    3.26 +    if (!session || !reset_ident || EMPTYSTR(old_fpr) || EMPTYSTR(new_fpr) ||
    3.27 +        !key_attachments || !command_list)
    3.28 +        return PEP_ILLEGAL_VALUE;
    3.29 +    
    3.30 +    // Ok, generate payload here...
    3.31 +    pEp_identity* outgoing_ident = identity_dup(reset_ident);
    3.32 +    if (!outgoing_ident)
    3.33 +        return PEP_OUT_OF_MEMORY;
    3.34 +    free(outgoing_ident->fpr);
    3.35 +    outgoing_ident->fpr = strdup(old_fpr);
    3.36 +    if (!outgoing_ident->fpr)
    3.37 +        return PEP_OUT_OF_MEMORY;
    3.38 +        
    3.39 +    keyreset_command* kr_command = new_keyreset_command(outgoing_ident, new_fpr);
    3.40 +    if (!kr_command)
    3.41 +        return PEP_OUT_OF_MEMORY;
    3.42 +    if (!*command_list)
    3.43 +        *command_list = new_keyreset_command_list(kr_command);
    3.44 +    else
    3.45 +        if (keyreset_command_list_add(*command_list, kr_command) == NULL)
    3.46 +            return PEP_OUT_OF_MEMORY;
    3.47 +    
    3.48 +    bloblist_t* keys = NULL;
    3.49 +    
    3.50 +    char* key_material_old = NULL;
    3.51 +    char* key_material_new = NULL;   
    3.52 +    char* key_material_priv = NULL;
    3.53 +     
    3.54 +    size_t datasize = 0;
    3.55 +    
    3.56 +    PEP_STATUS status = PEP_STATUS_OK;
    3.57 +    
    3.58 +    if (!include_secret) { // This isn't to own recips, so shipping the rev'd key is OK. Own keys are revoked on each device.
    3.59 +        status = export_key(session, old_fpr, &key_material_old, &datasize);
    3.60 +        if (datasize > 0 && key_material_old) {         
    3.61 +            if (status != PEP_STATUS_OK)
    3.62 +                return status;
    3.63 +
    3.64 +            if (!keys)
    3.65 +                keys = new_bloblist(key_material_old, datasize, 
    3.66 +                                                "application/pgp-keys",
    3.67 +                                                "file://pEpkey_old.asc");
    3.68 +            else                                    
    3.69 +                bloblist_add(keys, key_material_old, datasize, "application/pgp-keys",
    3.70 +                                                                       "file://pEpkey_old.asc");
    3.71 +        }
    3.72 +        datasize = 0;
    3.73 +    }                                                                  
    3.74 +    status = export_key(session, new_fpr, &key_material_new, &datasize);
    3.75 +
    3.76 +    if (datasize > 0 && key_material_new) {         
    3.77 +        if (status != PEP_STATUS_OK)
    3.78 +            return status;
    3.79 +
    3.80 +        if (!keys)
    3.81 +            keys = new_bloblist(key_material_new, datasize, 
    3.82 +                                            "application/pgp-keys",
    3.83 +                                            "file://pEpkey_new_pub.asc");
    3.84 +        else                                    
    3.85 +            bloblist_add(keys, key_material_new, datasize, "application/pgp-keys", "file://pEpkey_new_pub.asc");
    3.86 +                        
    3.87 +        datasize = 0;    
    3.88 +        if (include_secret) {
    3.89 +            status = export_secret_key(session, new_fpr, &key_material_priv, &datasize);    
    3.90 +            if (status != PEP_STATUS_OK)
    3.91 +                return status;
    3.92 +            if (datasize > 0 && key_material_priv) {
    3.93 +                bloblist_add(keys, key_material_priv, datasize, "application/pgp-keys",
    3.94 +                                                                            "file://pEpkey_priv.asc");
    3.95 +            }                                                      
    3.96 +        }    
    3.97 +    }
    3.98 +    if (keys) {
    3.99 +        if (*key_attachments)
   3.100 +            bloblist_join(*key_attachments, keys);
   3.101 +        else
   3.102 +            *key_attachments = keys;
   3.103 +    }        
   3.104 +    return status;
   3.105 +}
   3.106 +
   3.107 +// For multiple idents under a single key
   3.108 +// idents contain new fprs
   3.109 +static PEP_STATUS _generate_own_commandlist_msg(PEP_SESSION session,
   3.110 +                                                identity_list* from_idents,
   3.111 +                                                const char* old_fpr,
   3.112 +                                                message** dst) {                                                
   3.113 +    PEP_STATUS status = PEP_STATUS_OK;
   3.114 +    message* msg = NULL;                                                
   3.115 +    identity_list* list_curr = from_idents;
   3.116 +    keyreset_command_list* kr_commands = NULL;
   3.117 +    bloblist_t* key_attachments = NULL;
   3.118 +    
   3.119 +    for ( ; list_curr && list_curr->ident; list_curr = list_curr->next) {
   3.120 +        pEp_identity* curr_ident = list_curr->ident;
   3.121 +        
   3.122 +        if (curr_ident->flags & PEP_idf_devicegroup) {                
   3.123 +        
   3.124 +            PEP_STATUS status = _generate_reset_structs(session,
   3.125 +                                                        curr_ident,
   3.126 +                                                        old_fpr,
   3.127 +                                                        curr_ident->fpr,
   3.128 +                                                        &key_attachments,
   3.129 +                                                        &kr_commands,
   3.130 +                                                        true);
   3.131 +            if (status != PEP_STATUS_OK)
   3.132 +                return status; // FIXME
   3.133 +            if (!key_attachments || !kr_commands)
   3.134 +                return PEP_UNKNOWN_ERROR;
   3.135 +        }        
   3.136 +    }
   3.137 +    
   3.138 +    if (!kr_commands) {
   3.139 +        // There was nothing for us to send to self - we could be ungrouped,
   3.140 +        // etc
   3.141 +        return PEP_STATUS_OK;
   3.142 +    }    
   3.143 +    char* payload = NULL;
   3.144 +    size_t size = 0;
   3.145 +    status = key_reset_commands_to_PER(kr_commands, &payload, &size);
   3.146 +    if (status != PEP_STATUS_OK)
   3.147 +        return status;
   3.148 +        
   3.149 +    // From and to our first ident - this only goes to us.
   3.150 +    pEp_identity* from = identity_dup(from_idents->ident);
   3.151 +    pEp_identity* to = identity_dup(from);    
   3.152 +    status = base_prepare_message(session, from, to,
   3.153 +                                  BASE_KEYRESET, payload, size, NULL,
   3.154 +                                  &msg);
   3.155 +
   3.156 +    if (status != PEP_STATUS_OK) {
   3.157 +        free(msg);
   3.158 +        return status;
   3.159 +    }    
   3.160 +    if (!msg)
   3.161 +        return PEP_OUT_OF_MEMORY;
   3.162 +    if (!msg->attachments)
   3.163 +        return PEP_UNKNOWN_ERROR;
   3.164 +    
   3.165 +    if (!bloblist_join(msg->attachments, key_attachments))
   3.166 +        return PEP_UNKNOWN_ERROR;
   3.167 +
   3.168 +    if (msg)
   3.169 +        *dst = msg;
   3.170 +
   3.171 +    free_keyreset_command_list(kr_commands);
   3.172 +        
   3.173 +    return status;
   3.174 +
   3.175 +}
   3.176 +
   3.177 +static PEP_STATUS _generate_keyreset_command_message(PEP_SESSION session,
   3.178 +                                                     const pEp_identity* from_ident,
   3.179 +                                                     const pEp_identity* to_ident,
   3.180 +                                                     const char* old_fpr,
   3.181 +                                                     const char* new_fpr,
   3.182 +                                                     bool is_private,
   3.183 +                                                     message** dst) {
   3.184 +                                                                                                                  
   3.185 +    if (!session || !from_ident || !old_fpr || !new_fpr || !dst)
   3.186 +        return PEP_ILLEGAL_VALUE;
   3.187 +
   3.188 +    // safe cast
   3.189 +    if (!is_me(session, (pEp_identity*)from_ident))
   3.190 +        return PEP_ILLEGAL_VALUE;
   3.191 +
   3.192 +    PEP_STATUS status = PEP_STATUS_OK;
   3.193 +        
   3.194 +    *dst = NULL;
   3.195 +        
   3.196 +    message* msg = NULL;
   3.197 +    
   3.198 +    // Ok, generate payload here...
   3.199 +    pEp_identity* outgoing_ident = identity_dup(from_ident);
   3.200 +    if (!outgoing_ident)
   3.201 +        return PEP_OUT_OF_MEMORY;
   3.202 +    free(outgoing_ident->fpr);
   3.203 +    outgoing_ident->fpr = strdup(old_fpr);
   3.204 +    if (!outgoing_ident->fpr)
   3.205 +        return PEP_OUT_OF_MEMORY;
   3.206 +        
   3.207 +    keyreset_command_list* kr_list = NULL;
   3.208 +    bloblist_t* key_attachments = NULL;
   3.209 +            
   3.210 +    // Check memory        
   3.211 +    status = _generate_reset_structs(session,
   3.212 +                                     outgoing_ident,
   3.213 +                                     old_fpr,
   3.214 +                                     new_fpr,
   3.215 +                                     &key_attachments,
   3.216 +                                     &kr_list,
   3.217 +                                     is_private);
   3.218 +    if (status != PEP_STATUS_OK)
   3.219 +        return status; // FIXME
   3.220 +    if (!key_attachments || !kr_list)
   3.221 +        return PEP_UNKNOWN_ERROR;
   3.222 +        
   3.223 +    char* payload = NULL;
   3.224 +    size_t size = 0;
   3.225 +    status = key_reset_commands_to_PER(kr_list, &payload, &size);
   3.226 +    status = base_prepare_message(session, outgoing_ident, to_ident,
   3.227 +                                  BASE_KEYRESET, payload, size, NULL,
   3.228 +                                  &msg);
   3.229 +    if (status) {
   3.230 +        free(msg);
   3.231 +        return status;
   3.232 +    }    
   3.233 +    if (!msg)
   3.234 +        return PEP_OUT_OF_MEMORY;
   3.235 +    if (!msg->attachments)
   3.236 +        return PEP_UNKNOWN_ERROR;
   3.237 +    
   3.238 +    if (msg)
   3.239 +        *dst = msg;
   3.240 +    return status;
   3.241 +}
   3.242 +
   3.243  PEP_STATUS has_key_reset_been_sent(
   3.244          PEP_SESSION session, 
   3.245 +        const char* from_addr,
   3.246          const char* user_id, 
   3.247          const char* revoked_fpr,
   3.248          bool* contacted)
   3.249 @@ -29,7 +258,7 @@
   3.250      assert(revoked_fpr);
   3.251      assert(!EMPTYSTR(user_id));
   3.252  
   3.253 -    if (!session || !contacted || EMPTYSTR(revoked_fpr) || EMPTYSTR(user_id))
   3.254 +    if (!session || !contacted || EMPTYSTR(from_addr) || EMPTYSTR(revoked_fpr) || EMPTYSTR(user_id))
   3.255          return PEP_ILLEGAL_VALUE;
   3.256      
   3.257      *contacted = false;
   3.258 @@ -46,7 +275,9 @@
   3.259      sqlite3_reset(session->was_id_for_revoke_contacted);
   3.260      sqlite3_bind_text(session->was_id_for_revoke_contacted, 1, revoked_fpr, -1,
   3.261              SQLITE_STATIC);
   3.262 -    sqlite3_bind_text(session->was_id_for_revoke_contacted, 2, user_id, -1,
   3.263 +    sqlite3_bind_text(session->was_id_for_revoke_contacted, 2, from_addr, -1,
   3.264 +            SQLITE_STATIC);        
   3.265 +    sqlite3_bind_text(session->was_id_for_revoke_contacted, 3, user_id, -1,
   3.266              SQLITE_STATIC);        
   3.267      int result = sqlite3_step(session->was_id_for_revoke_contacted);
   3.268      switch (result) {
   3.269 @@ -64,26 +295,26 @@
   3.270      return PEP_STATUS_OK;
   3.271  }
   3.272  
   3.273 -//static const char *sql_set_revoke_contact_as_notified =
   3.274 -//    "insert or replace into revocation_contact_list(fpr, contact_id) values (?1, ?2) ;";
   3.275 -
   3.276  PEP_STATUS set_reset_contact_notified(
   3.277          PEP_SESSION session,
   3.278 +        const char* own_address,
   3.279          const char* revoke_fpr,
   3.280          const char* contact_id
   3.281      )
   3.282  {
   3.283      PEP_STATUS status = PEP_STATUS_OK;
   3.284      
   3.285 -    assert(session && !EMPTYSTR(revoke_fpr) && !EMPTYSTR(contact_id));
   3.286 +    assert(session && !EMPTYSTR(own_address) && !EMPTYSTR(revoke_fpr) && !EMPTYSTR(contact_id));
   3.287      
   3.288 -    if (!session || EMPTYSTR(revoke_fpr) || EMPTYSTR(contact_id))
   3.289 +    if (!session || EMPTYSTR(own_address) || EMPTYSTR(revoke_fpr) || EMPTYSTR(contact_id))
   3.290          return PEP_ILLEGAL_VALUE;
   3.291      
   3.292      sqlite3_reset(session->set_revoke_contact_as_notified);
   3.293      sqlite3_bind_text(session->set_revoke_contact_as_notified, 1, revoke_fpr, -1, 
   3.294              SQLITE_STATIC);
   3.295 -    sqlite3_bind_text(session->set_revoke_contact_as_notified, 2, contact_id, -1,
   3.296 +    sqlite3_bind_text(session->set_revoke_contact_as_notified, 2, own_address, -1, 
   3.297 +            SQLITE_STATIC);            
   3.298 +    sqlite3_bind_text(session->set_revoke_contact_as_notified, 3, contact_id, -1,
   3.299              SQLITE_STATIC);
   3.300  
   3.301      int result;
   3.302 @@ -102,149 +333,390 @@
   3.303      return status;    
   3.304  }
   3.305  
   3.306 -
   3.307 +// FIXME: fpr ownership
   3.308  PEP_STATUS receive_key_reset(PEP_SESSION session,
   3.309                               message* reset_msg) {
   3.310  
   3.311 -    if (!session || !reset_msg)
   3.312 +    if (!session || !reset_msg || !reset_msg->_sender_fpr)
   3.313          return PEP_ILLEGAL_VALUE;
   3.314  
   3.315 +    PEP_STATUS status = PEP_STATUS_OK;
   3.316 +
   3.317 +    stringlist_t* keylist = NULL;
   3.318 +    
   3.319 +    char* sender_fpr = reset_msg->_sender_fpr;
   3.320 +
   3.321 +    bool revoked = false;
   3.322 +
   3.323 +    // Check to see if sender fpr is revoked already - if this was 
   3.324 +    // from us, we won't have done it yet for obvious reasons (i.e. 
   3.325 +    // we need to verify it's from us before we accept someone telling
   3.326 +    // us to reset our private key), and if this was from someone else,
   3.327 +    // a key reset message will be signed by their new key, because 
   3.328 +    // we presume the old one was compromised (and we remove trust from 
   3.329 +    // the replacement key until verified)
   3.330 +    status = key_revoked(session, sender_fpr, &revoked); 
   3.331 +    
   3.332 +    if (status != PEP_STATUS_OK)
   3.333 +        return status;
   3.334 +
   3.335 +    // Bail if revoked
   3.336 +    if (revoked) {
   3.337 +        return PEP_ILLEGAL_VALUE; // could be an attack            
   3.338 +    }
   3.339 +    // Otherwise, bail
   3.340 +    else {
   3.341 +        bool mistrusted = false;
   3.342 +        status = is_mistrusted_key(session, sender_fpr, &mistrusted);
   3.343 +        
   3.344 +        if (status != PEP_STATUS_OK)
   3.345 +            return status;
   3.346 +        
   3.347 +        if (mistrusted)
   3.348 +            return PEP_ILLEGAL_VALUE;
   3.349 +    }
   3.350 +
   3.351 +    
   3.352 +    // Parse reset message
   3.353 +    
   3.354      pEp_identity* sender_id = reset_msg->from;
   3.355 -                
   3.356 +                            
   3.357      if (!sender_id)
   3.358          return PEP_MALFORMED_KEY_RESET_MSG;
   3.359 +
   3.360 +    if (is_me(session, sender_id)) {
   3.361 +        // first off, we need to make sure we're up-to-date
   3.362 +        status = myself(session, sender_id);        
   3.363 +    }
   3.364 +    else {    
   3.365 +        status = update_identity(session, sender_id);
   3.366 +        if (!sender_id->user_id)
   3.367 +            return PEP_UNKNOWN_ERROR;
   3.368 +    }
   3.369 +    
   3.370 +    bool sender_own_key = false;
   3.371 +    bool from_me = is_me(session, sender_id);
   3.372 +    
   3.373 +    if (is_me(session, sender_id)) {
   3.374 +        // Do own-reset-checks
   3.375 +        status = is_own_key(session, sender_fpr, &sender_own_key);
   3.376          
   3.377 -    PEP_STATUS status = update_identity(session, sender_id);
   3.378 -    if (!sender_id->user_id)
   3.379 -        return PEP_UNKNOWN_ERROR;
   3.380 +        if (status != PEP_STATUS_OK)
   3.381 +            return status;
   3.382          
   3.383 -    if (is_me(session, sender_id))
   3.384 -        return PEP_ILLEGAL_VALUE;    
   3.385 +        // Should we mistrust the sender_fpr here??
   3.386 +        if (!sender_own_key) 
   3.387 +            return PEP_ILLEGAL_VALUE; // actually, this is an attack                
   3.388          
   3.389 -    if (!reset_msg->longmsg || strncmp(reset_msg->longmsg, "OLD: ", 5) != 0) 
   3.390 -        return PEP_MALFORMED_KEY_RESET_MSG;
   3.391 -
   3.392 +        // Make sure it's a TRUSTED own key
   3.393 +        char* keyholder = sender_id->fpr;
   3.394 +        
   3.395 +        sender_id->fpr = sender_fpr;                     
   3.396 +        status = get_trust(session, sender_id);
   3.397 +        sender_id->fpr = keyholder;
   3.398 +            
   3.399 +        if (sender_id->comm_type < PEP_ct_pEp)
   3.400 +            return PEP_ILLEGAL_VALUE;
   3.401 +    }
   3.402 +        
   3.403      status = PEP_STATUS_OK;
   3.404      char* old_fpr = NULL;
   3.405      char* new_fpr = NULL;
   3.406      
   3.407 -    stringlist_t* keylist = NULL;
   3.408 -    pEp_identity* temp_ident = identity_dup(sender_id);
   3.409 -    if (!temp_ident) {
   3.410 -        status = PEP_OUT_OF_MEMORY;
   3.411 -        goto pEp_free;
   3.412 -    }        
   3.413 +    size_t size = 0;
   3.414 +    const char* payload = NULL;
   3.415 +
   3.416 +    char* not_used_fpr = NULL;
   3.417 +    status = base_extract_message(session,
   3.418 +                                  reset_msg,
   3.419 +                                  BASE_KEYRESET,
   3.420 +                                  &size,
   3.421 +                                  &payload,
   3.422 +                                  &not_used_fpr);
   3.423 +                                  
   3.424 +    if (status != PEP_STATUS_OK)
   3.425 +        return status;
   3.426 +        
   3.427 +    if (!payload || size == 0)
   3.428 +        return PEP_MALFORMED_KEY_RESET_MSG;
   3.429 +        
   3.430 +    keyreset_command_list* resets = NULL; 
   3.431 +    
   3.432 +    status = PER_to_key_reset_commands(payload, size, &resets);
   3.433 +
   3.434 +    if (status != PEP_STATUS_OK)
   3.435 +        return status;
   3.436 +        
   3.437 +    if (!resets)
   3.438 +        return PEP_MALFORMED_KEY_RESET_MSG;
   3.439 +
   3.440 +    keyreset_command_list* curr_cl = resets;
   3.441 +
   3.442 +    stringpair_list_t* rev_pairs = NULL;
   3.443 +    
   3.444 +    // Ok, go through the list of reset commands. Right now, this 
   3.445 +    // is actually only one, but could be more later.
   3.446 +    for ( ; curr_cl && curr_cl->command; curr_cl = curr_cl->next) {    
   3.447 +        keyreset_command* curr_cmd = curr_cl->command;
   3.448 +        if (!curr_cmd || !curr_cmd->ident || !curr_cmd->ident->fpr ||
   3.449 +            !curr_cmd->ident->address) {
   3.450 +            return PEP_MALFORMED_KEY_RESET_MSG;        
   3.451 +        }
   3.452 +        pEp_identity* curr_ident = curr_cmd->ident;
   3.453 +        
   3.454 +        old_fpr = curr_ident->fpr;
   3.455 +        new_fpr = strdup(curr_cmd->new_key);
   3.456 +        
   3.457 +        bool is_old_own = false;
   3.458 +        // if it's our key and the old one is revoked, we skip it.
   3.459 +        // Sorry, them's the rules/
   3.460 +        if (sender_own_key) {
   3.461 +            status = is_own_key(session, old_fpr, &is_old_own);
   3.462 +            if (is_old_own) {
   3.463 +                bool old_revoked = false;
   3.464 +                status = key_revoked(session, old_fpr, &old_revoked);
   3.465 +                if (old_revoked)
   3.466 +                    continue;
   3.467 +            }
   3.468 +        }
   3.469 +
   3.470 +        // Make sure that this key is at least one we associate 
   3.471 +        // with the sender. FIXME: check key election interaction
   3.472 +        // N.B. If we ever allow ourselves to send resets to ourselves
   3.473 +        // for not-own stuff, this will have to be revised
   3.474 +        
   3.475 +        status = find_keys(session, new_fpr, &keylist);
   3.476 +        if (status != PEP_STATUS_OK)
   3.477 +            goto pEp_free;
   3.478 +        if (!keylist) {
   3.479 +            status = PEP_MALFORMED_KEY_RESET_MSG;
   3.480 +            goto pEp_free;
   3.481 +        }
   3.482 +        
   3.483 +        // We need to update the identity to get the user_id
   3.484 +        curr_ident->fpr = NULL; // ensure old_fpr is preserved
   3.485 +        free(curr_ident->user_id);
   3.486 +        curr_ident->user_id = NULL;
   3.487 +        status = update_identity(session, curr_ident);
   3.488 +        
   3.489 +        // Ok, now check the old fpr to see if we have an entry for it
   3.490 +        // temp fpr set for function call
   3.491 +        curr_ident->fpr = old_fpr;
   3.492 +        status = get_trust(session, curr_ident);
   3.493 +        if (status != PEP_STATUS_OK)
   3.494 +            return status;
   3.495 +        
   3.496 +        PEP_comm_type ct_result = curr_ident->comm_type;
   3.497 +
   3.498 +        // Basically, see if fpr is even in the database
   3.499 +        // for this user - we'll get PEP_ct_unknown if it isn't
   3.500 +        if (ct_result == PEP_ct_unknown)
   3.501 +            return PEP_KEY_NOT_RESET;
   3.502 +        
   3.503 +        // Alright, so we have a key to reset. Good.
   3.504 +        
   3.505 +        // If this is a non-own user, for NOW, we presume key reset 
   3.506 +        // by email for non-own keys is ONLY in case of revoke-and-replace. 
   3.507 +        // This means we have, at a *minimum*, an object that once 
   3.508 +        // required the initial private key in order to replace that key 
   3.509 +        // with another.
   3.510 +        //
   3.511 +        // The limitations on what this guarantees are known - this does 
   3.512 +        // not prevent, for example, replay attacks from someone with 
   3.513 +        // access to the original revocation cert are possible if they 
   3.514 +        // get to us before we receive this object from the original sender.
   3.515 +        // The best we can do in this case is to NOT trust the new key.
   3.516 +        // It will be used by default, but if the original was trusted,
   3.517 +        // the rating will visibly change for the sender, and even if it was 
   3.518 +        // not, if we do use it, the sender can report unreadable mails to us 
   3.519 +        // and detect it that way. FIXME: We may need to have some kind 
   3.520 +        // of even alert the user when such a change occurs for their contacts
   3.521 +        //
   3.522 +        // If this is from US, we already made sure that the sender_fpr 
   3.523 +        // was a valid own key, so we don't consider it here.
   3.524 +        if (!from_me) {
   3.525 +            revoked = false;
   3.526 +            status = key_revoked(session, old_fpr, &revoked); 
   3.527 +
   3.528 +            if (!revoked)
   3.529 +                return PEP_KEY_NOT_RESET;            
   3.530 +
   3.531 +            // Also don't let someone change the replacement fpr 
   3.532 +            // if the replacement fpr was also revoked - we really need 
   3.533 +            // to detect that something fishy is going on at this point
   3.534 +            // FIXME: ensure that PEP_KEY_NOT_RESET responses to 
   3.535 +            // automated key reset functions are propagated upward - 
   3.536 +            // app should be made aware if someone is trying to reset someone 
   3.537 +            // else's key and it's failing for some reason.
   3.538 +            revoked = false;
   3.539 +            status = key_revoked(session, new_fpr, &revoked); 
   3.540 +
   3.541 +            if (revoked)
   3.542 +                return PEP_KEY_NOT_RESET;                        
   3.543 +        }
   3.544 +        
   3.545 +        // Hooray! We apparently now are dealing with keys 
   3.546 +        // belonging to the user from a message at least marginally
   3.547 +        // from the user
   3.548 +        if (!sender_own_key) {
   3.549 +            // Clear all info (ALSO REMOVES OLD KEY RIGHT NOW!!!)            
   3.550 +            status = key_reset(session, old_fpr, curr_ident);
   3.551 +            if (status != PEP_STATUS_OK)
   3.552 +                return status;
   3.553 +                                
   3.554 +            // Make new key the default    
   3.555 +            curr_ident->fpr = new_fpr;
   3.556 +    
   3.557 +            // This only sets as the default, does NOT TRUST IN ANY WAY
   3.558 +            PEP_comm_type new_key_rating = PEP_ct_unknown;
   3.559              
   3.560 -    char* rest = NULL;
   3.561 -    char* p = strtok_r(reset_msg->longmsg, "\r\n", &rest);
   3.562 -    if (!EMPTYSTR(p + 5))
   3.563 -        old_fpr = strdup(p + 5);
   3.564 -    else {
   3.565 -        status = PEP_MALFORMED_KEY_RESET_MSG;
   3.566 -        goto pEp_free;
   3.567 -    }
   3.568 -    
   3.569 -    bool own_key = false;
   3.570 -    status = is_own_key(session, old_fpr, &own_key);
   3.571 -    
   3.572 -    if (own_key) {
   3.573 -        // Nope, no one can make us our own default. If we want to do that,
   3.574 -        // that's keysync, NOT key reset.
   3.575 -        status = PEP_ILLEGAL_VALUE;
   3.576 -        goto pEp_free;
   3.577 -    }
   3.578 +            // No key is ever returned as "confirmed" from here - it's based on raw key
   3.579 +            status = get_key_rating(session, new_fpr, &new_key_rating);
   3.580 +            if (status != PEP_STATUS_OK)
   3.581 +                return status;
   3.582 +
   3.583 +            if (new_key_rating >= PEP_ct_strong_but_unconfirmed) {
   3.584 +                bool is_pEp = false;
   3.585 +                status = is_pEp_user(session, curr_ident, &is_pEp);
   3.586 +                if (is_pEp)
   3.587 +                    curr_ident->comm_type = PEP_ct_pEp_unconfirmed;
   3.588 +                else    
   3.589 +                    curr_ident->comm_type = new_key_rating & (~PEP_ct_confirmed);
   3.590 +            }
   3.591 +            else
   3.592 +                curr_ident->comm_type = new_key_rating;
   3.593 +                
   3.594 +            status = set_identity(session, curr_ident);  
   3.595 +            if (status != PEP_STATUS_OK)
   3.596 +                goto pEp_free; 
   3.597 +        }    
   3.598 +        else {
   3.599 +            // set new key as the default for this identity
   3.600 +            // N.B. If for some reason this is only a pubkey,
   3.601 +            // then so be it - but we need to double-check to 
   3.602 +            // ensure that in this case, we end up with a private one,
   3.603 +            // so talk to vb about this.
   3.604 +            // Make new key the default    
   3.605              
   3.606 -    p = strtok_r(NULL, "\r\n", &rest); 
   3.607 -    if (strncmp(p, "NEW: ", 5) != 0  || EMPTYSTR(p + 5)) {
   3.608 -        status = PEP_MALFORMED_KEY_RESET_MSG;
   3.609 -        goto pEp_free;
   3.610 +            // This is REQUIRED for set_own_key (see doc)
   3.611 +            curr_ident->fpr = NULL;
   3.612 +            
   3.613 +            status = set_own_key(session, curr_ident, new_fpr);
   3.614 +            
   3.615 +            if (status != PEP_STATUS_OK)
   3.616 +                return status;
   3.617 +            
   3.618 +            status = myself(session, curr_ident);
   3.619 +
   3.620 +            char* old_copy = NULL;
   3.621 +            char* new_copy = NULL;
   3.622 +            old_copy = strdup(old_fpr);
   3.623 +            new_copy = strdup(new_fpr);
   3.624 +            if (!old_copy || !new_copy)
   3.625 +                return PEP_OUT_OF_MEMORY;
   3.626 +
   3.627 +            stringpair_t* revp = new_stringpair(old_copy, new_copy);                
   3.628 +            if (!rev_pairs) {
   3.629 +                rev_pairs = new_stringpair_list(revp);
   3.630 +                if (!rev_pairs)
   3.631 +                    return PEP_OUT_OF_MEMORY;
   3.632 +            }
   3.633 +            else    
   3.634 +                stringpair_list_add(rev_pairs, revp);
   3.635 +                            
   3.636 +        }    
   3.637 +        
   3.638 +        old_fpr = NULL;
   3.639 +        free(new_fpr);
   3.640 +        new_fpr = NULL;    
   3.641      }
   3.642  
   3.643 -    new_fpr = strdup(p + 5);
   3.644 -        
   3.645 -    // Reset the original key
   3.646 -    status = key_reset(session, old_fpr, temp_ident, NULL, NULL);
   3.647 -    if (status != PEP_STATUS_OK)
   3.648 -        goto pEp_free;
   3.649 -        
   3.650 -    status = find_keys(session, new_fpr, &keylist);
   3.651 -    if (status != PEP_STATUS_OK)
   3.652 -        goto pEp_free;
   3.653 -        
   3.654 -    if (!keylist) {
   3.655 -        status = PEP_KEY_NOT_FOUND;
   3.656 -        goto pEp_free;
   3.657 +    // actually revoke
   3.658 +    stringpair_list_t* curr_rev_pair = rev_pairs;
   3.659 +    while (curr_rev_pair && curr_rev_pair->value) {
   3.660 +        char* rev_key = curr_rev_pair->value->key;
   3.661 +        char* new_key = curr_rev_pair->value->value;
   3.662 +        if (EMPTYSTR(rev_key) || EMPTYSTR(new_key))
   3.663 +            return PEP_UNKNOWN_ERROR;
   3.664 +        bool revoked = false;
   3.665 +        status = key_revoked(session, rev_key, &revoked);
   3.666 +        if (!revoked) {
   3.667 +            // key reset on old key
   3.668 +            status = revoke_key(session, rev_key, NULL);
   3.669 +
   3.670 +            if (status != PEP_STATUS_OK)
   3.671 +                goto pEp_free;    
   3.672 +        }
   3.673 +        // N.B. This sort of sucks because we overwrite this every time.
   3.674 +        // But this case is infrequent and we don't rely on the binding.
   3.675 +
   3.676 +        if (status == PEP_STATUS_OK) 
   3.677 +            status = set_revoked(session, rev_key, new_key, time(NULL));            
   3.678 +
   3.679 +        if (status != PEP_STATUS_OK)
   3.680 +            goto pEp_free;        
   3.681 +        curr_rev_pair = curr_rev_pair->next;    
   3.682      }
   3.683  
   3.684 -    // alright, we've checked as best we can. Let's set that baby.
   3.685 -    sender_id->fpr = new_fpr;
   3.686 -    
   3.687 -    // This only sets as the default, does NOT TRUST IN ANY WAY
   3.688 -    sender_id->comm_type = sender_id->comm_type & (~PEP_ct_confirmed);
   3.689 -    status = set_identity(session, sender_id);
   3.690 -    
   3.691 -    sender_id->fpr = NULL; // ownership for free
   3.692 +
   3.693  pEp_free:    
   3.694      free_stringlist(keylist);    
   3.695 +    free_stringpair_list(rev_pairs);
   3.696      free(old_fpr);
   3.697      free(new_fpr);
   3.698 -    free_identity(temp_ident);
   3.699      return status;
   3.700  }
   3.701  
   3.702  PEP_STATUS create_standalone_key_reset_message(PEP_SESSION session,
   3.703                                                 message** dst, 
   3.704 +                                               pEp_identity* own_identity,
   3.705                                                 pEp_identity* recip,
   3.706                                                 const char* old_fpr,
   3.707                                                 const char* new_fpr) {
   3.708                                                     
   3.709 -    if (!dst || !recip->user_id || !recip->address)
   3.710 +    if (!dst || !own_identity || EMPTYSTR(own_identity->address) 
   3.711 +             || !recip || EMPTYSTR(recip->user_id) 
   3.712 +             || EMPTYSTR(recip->address))
   3.713          return PEP_ILLEGAL_VALUE;
   3.714  
   3.715 -    if (!old_fpr || !new_fpr)
   3.716 +    if (EMPTYSTR(old_fpr) || EMPTYSTR(new_fpr))
   3.717          return PEP_ILLEGAL_VALUE;
   3.718          
   3.719      *dst = NULL;
   3.720 -    // Get own identity user has corresponded with
   3.721 -    pEp_identity* own_identity = NULL;
   3.722      
   3.723 -    PEP_STATUS status = get_own_ident_for_contact_id(session,
   3.724 -                                                     recip,
   3.725 -                                                     &own_identity);                                                       
   3.726 +    message* reset_msg = NULL;
   3.727 +    
   3.728 +    PEP_STATUS status = _generate_keyreset_command_message(session, own_identity,
   3.729 +                                                           recip,
   3.730 +                                                           old_fpr, new_fpr, false,
   3.731 +                                                           &reset_msg);
   3.732 +                            
   3.733      if (status != PEP_STATUS_OK)
   3.734 -        return status;
   3.735 -        
   3.736 -    message* reset_message = new_message(PEP_dir_outgoing);
   3.737 -    reset_message->from = own_identity;
   3.738 -    reset_message->to = new_identity_list(identity_dup(recip)); // ?
   3.739 +        goto pEp_free;
   3.740      
   3.741 -    const char* oldtag = "OLD: ";
   3.742 -    const char* newtag = "\nNEW: ";
   3.743 -    const size_t taglens = 11;
   3.744 -    size_t full_len = taglens + strlen(old_fpr) + strlen(new_fpr) + 2; // \n and \0
   3.745 -    char* longmsg = calloc(full_len, 1);
   3.746 -    strlcpy(longmsg, oldtag, full_len);
   3.747 -    strlcat(longmsg, old_fpr, full_len);
   3.748 -    strlcat(longmsg, newtag, full_len);
   3.749 -    strlcat(longmsg, new_fpr, full_len);
   3.750 -    strlcat(longmsg, "\n", full_len);
   3.751 -    reset_message->longmsg = longmsg; 
   3.752 -    reset_message->shortmsg = strdup("Key reset");    
   3.753 +    if (!reset_msg)
   3.754 +        return PEP_ILLEGAL_VALUE;
   3.755 +                                                                         
   3.756 +    if (!reset_msg->attachments)
   3.757 +        return PEP_UNKNOWN_ERROR;
   3.758      
   3.759      message* output_msg = NULL;
   3.760      
   3.761 -    status = encrypt_message(session, reset_message, NULL,
   3.762 +    status = encrypt_message(session, reset_msg, NULL,
   3.763                               &output_msg, PEP_enc_PGP_MIME,
   3.764                               PEP_encrypt_flag_key_reset_only);
   3.765  
   3.766      if (status == PEP_STATUS_OK)
   3.767          *dst = output_msg;
   3.768          
   3.769 -    free_message(reset_message);
   3.770 +pEp_free:
   3.771 +        
   3.772 +    free_message(reset_msg);    
   3.773      return status;
   3.774  }
   3.775  
   3.776  PEP_STATUS send_key_reset_to_recents(PEP_SESSION session,
   3.777 +                                     pEp_identity* from_ident,
   3.778                                       const char* old_fpr, 
   3.779                                       const char* new_fpr) {
   3.780      assert(old_fpr);
   3.781 @@ -287,18 +759,27 @@
   3.782              
   3.783          // Check if they've already been told - this shouldn't be the case, but...
   3.784          bool contacted = false;
   3.785 -        status = has_key_reset_been_sent(session, user_id, old_fpr, &contacted);
   3.786 +        status = has_key_reset_been_sent(session, from_ident->address, user_id, old_fpr, &contacted);
   3.787          if (status != PEP_STATUS_OK)
   3.788              goto pEp_free;
   3.789      
   3.790          if (contacted)
   3.791              continue;
   3.792              
   3.793 +        // Make sure they've ever *contacted* this address    
   3.794 +        bool in_contact_w_this_address = false;
   3.795 +        status = has_partner_contacted_address(session, curr_id->user_id, from_ident->address,  
   3.796 +                                               &in_contact_w_this_address);
   3.797 +        
   3.798 +        if (!in_contact_w_this_address)
   3.799 +            continue;
   3.800 +            
   3.801          // if not, make em a message    
   3.802          reset_msg = NULL;
   3.803          
   3.804          status = create_standalone_key_reset_message(session,
   3.805                                                       &reset_msg,
   3.806 +                                                     from_ident,
   3.807                                                       curr_id,
   3.808                                                       old_fpr,
   3.809                                                       new_fpr);
   3.810 @@ -322,7 +803,7 @@
   3.811          }
   3.812              
   3.813          // Put into notified DB
   3.814 -        status = set_reset_contact_notified(session, old_fpr, user_id);
   3.815 +        status = set_reset_contact_notified(session, from_ident->address, old_fpr, user_id);
   3.816          if (status != PEP_STATUS_OK)
   3.817              goto pEp_free;            
   3.818      }
   3.819 @@ -341,7 +822,7 @@
   3.820      if (!session || !ident || (ident && (EMPTYSTR(ident->user_id) || EMPTYSTR(ident->address))))
   3.821          return PEP_ILLEGAL_VALUE;
   3.822      
   3.823 -    return key_reset(session, fpr, ident, NULL, NULL);    
   3.824 +    return key_reset(session, fpr, ident);    
   3.825  }
   3.826  
   3.827  DYNAMIC_API PEP_STATUS key_reset_user(
   3.828 @@ -360,13 +841,132 @@
   3.829      if (is_me(session, input_ident) && EMPTYSTR(fpr))
   3.830          return PEP_ILLEGAL_VALUE;
   3.831          
   3.832 -    PEP_STATUS status = key_reset(session, fpr, input_ident, NULL, NULL);
   3.833 +    PEP_STATUS status = key_reset(session, fpr, input_ident);
   3.834      free_identity(input_ident);
   3.835      return status;
   3.836  }
   3.837  
   3.838  DYNAMIC_API PEP_STATUS key_reset_all_own_keys(PEP_SESSION session) {
   3.839 -    return key_reset(session, NULL, NULL, NULL, NULL);
   3.840 +    return key_reset(session, NULL, NULL);
   3.841 +}
   3.842 +
   3.843 +
   3.844 +static PEP_STATUS _key_reset_device_group_for_shared_key(PEP_SESSION session, 
   3.845 +                                                         identity_list* key_idents, 
   3.846 +                                                         const char* old_key) {
   3.847 +    assert(session);
   3.848 +    assert(key_idents);
   3.849 +    assert(old_key);
   3.850 +    
   3.851 +    if (!session || !key_idents || EMPTYSTR(old_key))
   3.852 +        return PEP_ILLEGAL_VALUE;
   3.853 +        
   3.854 +    messageToSend_t send_cb = session->messageToSend;
   3.855 +    if (!send_cb)
   3.856 +        return PEP_SYNC_NO_MESSAGE_SEND_CALLBACK;
   3.857 +        
   3.858 +    PEP_STATUS status = PEP_STATUS_OK;
   3.859 +        
   3.860 +    // each of these has the same key and needs a new one.
   3.861 +    identity_list* curr_ident;
   3.862 +    for (curr_ident = key_idents; curr_ident && curr_ident->ident; curr_ident = curr_ident->next) {
   3.863 +        pEp_identity* ident = curr_ident->ident;
   3.864 +        free(ident->fpr);
   3.865 +        ident->fpr = NULL;
   3.866 +        status = generate_keypair(session, ident);
   3.867 +        if (status != PEP_STATUS_OK)
   3.868 +            return status;            
   3.869 +    }
   3.870 +        
   3.871 +    // Ok, everyone's got a new keypair. Hoorah! 
   3.872 +    // generate, sign, and push messages into queue
   3.873 +    message* outmsg = NULL;
   3.874 +    status = _generate_own_commandlist_msg(session,
   3.875 +                                           key_idents,
   3.876 +                                           old_key,
   3.877 +                                           &outmsg);
   3.878 +                                           
   3.879 +    // Following will only be true if some idents were grouped,
   3.880 +    // and will only include grouped idents!                                       
   3.881 +    if (outmsg) {    
   3.882 +        message* enc_msg = NULL;
   3.883 +        
   3.884 +        // encrypt this baby and get out
   3.885 +        // extra keys???
   3.886 +        status = encrypt_message(session, outmsg, NULL, &enc_msg, PEP_enc_PGP_MIME, PEP_encrypt_flag_key_reset_only);
   3.887 +        
   3.888 +        if (status != PEP_STATUS_OK) {
   3.889 +            goto pEp_free;
   3.890 +        }
   3.891 +
   3.892 +        // insert into queue
   3.893 +        status = send_cb(enc_msg);
   3.894 +
   3.895 +        if (status != PEP_STATUS_OK) {
   3.896 +            free(enc_msg);
   3.897 +            goto pEp_free;            
   3.898 +        }                         
   3.899 +    }
   3.900 +    
   3.901 +    // Ok, we've signed everything we need to with the old key,
   3.902 +    // Revoke that baby.
   3.903 +    status = revoke_key(session, old_key, NULL);
   3.904 +
   3.905 +    if (status != PEP_STATUS_OK)
   3.906 +        goto pEp_free;
   3.907 +        
   3.908 +    for (curr_ident = key_idents; curr_ident && curr_ident->ident; curr_ident = curr_ident->next) {
   3.909 +        if (curr_ident->ident->flags & PEP_idf_devicegroup) {
   3.910 +            pEp_identity* ident = curr_ident->ident;
   3.911 +            
   3.912 +            // set own key, you fool.
   3.913 +            // Grab ownership first.
   3.914 +            char* new_key = ident->fpr;
   3.915 +            ident->fpr = NULL;
   3.916 +            status = set_own_key(session, ident, new_key);
   3.917 +            if (status != PEP_STATUS_OK) {
   3.918 +                // scream loudly and cry, then hang head in shame
   3.919 +                return status;
   3.920 +            }
   3.921 +            free(ident->fpr);
   3.922 +            // release ownership to the struct again
   3.923 +            ident->fpr = new_key;
   3.924 +                
   3.925 +            // N.B. This sort of sucks because we overwrite this every time.
   3.926 +            // But this case is infrequent and we don't rely on the binding.
   3.927 +            if (status == PEP_STATUS_OK) 
   3.928 +                status = set_revoked(session, old_key, new_key, time(NULL));            
   3.929 +
   3.930 +            if (status != PEP_STATUS_OK)
   3.931 +                goto pEp_free;
   3.932 +                
   3.933 +            pEp_identity* tmp_ident = identity_dup(ident);
   3.934 +            if (!tmp_ident) {
   3.935 +                status = PEP_OUT_OF_MEMORY;
   3.936 +                goto pEp_free;
   3.937 +            }    
   3.938 +            free(tmp_ident->fpr);    
   3.939 +            
   3.940 +            // for all active communication partners:
   3.941 +            //      active_send revocation            
   3.942 +            tmp_ident->fpr = strdup(old_key); // freed in free_identity
   3.943 +            if (status == PEP_STATUS_OK)
   3.944 +                status = send_key_reset_to_recents(session, tmp_ident, old_key, ident->fpr);        
   3.945 +            free_identity(tmp_ident);
   3.946 +        }    
   3.947 +    }    
   3.948 +    
   3.949 +    if (status == PEP_STATUS_OK)
   3.950 +        // cascade that mistrust for anyone using this key
   3.951 +        status = mark_as_compromised(session, old_key);
   3.952 +        
   3.953 +    if (status == PEP_STATUS_OK)
   3.954 +        status = remove_fpr_as_default(session, old_key);
   3.955 +    if (status == PEP_STATUS_OK)
   3.956 +        status = add_mistrusted_key(session, old_key);
   3.957 +    
   3.958 +pEp_free:
   3.959 +    return status;
   3.960  }
   3.961  
   3.962  // Notes to integrate into header:
   3.963 @@ -374,9 +974,7 @@
   3.964  PEP_STATUS key_reset(
   3.965          PEP_SESSION session,
   3.966          const char* key_id,
   3.967 -        pEp_identity* ident,
   3.968 -        identity_list** own_identities,
   3.969 -        stringlist_t** own_revoked_fprs
   3.970 +        pEp_identity* ident
   3.971      )
   3.972  {
   3.973      if (!session || (ident && EMPTYSTR(ident->user_id)))
   3.974 @@ -426,9 +1024,11 @@
   3.975              
   3.976              for (curr_key = keys; curr_key && curr_key->value; curr_key = curr_key->next) {
   3.977                  // FIXME: Is the ident really necessary?
   3.978 -                status = key_reset(session, curr_key->value, tmp_ident, own_identities, own_revoked_fprs);
   3.979 -                if (status != PEP_STATUS_OK)
   3.980 +                status = key_reset(session, curr_key->value, tmp_ident);
   3.981 +                if (status != PEP_STATUS_OK && status != PEP_CANNOT_FIND_IDENTITY)
   3.982                      break;
   3.983 +                else 
   3.984 +                    status = PEP_STATUS_OK;
   3.985              }
   3.986          }
   3.987          goto pEp_free;
   3.988 @@ -490,113 +1090,92 @@
   3.989          
   3.990          if (is_own_private) {
   3.991              
   3.992 -            // If there's no address, we want to reset this key for every identity 
   3.993 -            // it's a part of. Since this means generating new keys, we have to 
   3.994 -            // grab all the identities associated with it.
   3.995 -            if (EMPTYSTR(tmp_ident->address)) {
   3.996 -                status = get_identities_by_main_key_id(session, fpr_copy, &key_idents);
   3.997 -                
   3.998 -                if (status != PEP_CANNOT_FIND_IDENTITY) {
   3.999 -                    if (status == PEP_STATUS_OK) {
  3.1000 -                        // now have ident list, or should
  3.1001 -                        identity_list* curr_ident;
  3.1002 +            // This is now the "is_own" base case - we don't do this 
  3.1003 +            // per-identity, because all identities using this key will 
  3.1004 +            // need new ones. That said, this is really only a problem 
  3.1005 +            // with manual key management, something which we only support 
  3.1006 +            // to a limited extent in any event.
  3.1007 +            
  3.1008 +            bool is_grouped = false;
  3.1009 +            status = deviceGrouped(session, &is_grouped);
  3.1010 +             
  3.1011 +            // Regardless of the single identity this is for, for own keys, we do this 
  3.1012 +            // for all keys associated with the identity.
  3.1013 +            status = get_identities_by_main_key_id(session, fpr_copy, &key_idents);
  3.1014 +            
  3.1015 +            if (status != PEP_CANNOT_FIND_IDENTITY) {
  3.1016 +                if (is_grouped) 
  3.1017 +                    status = _key_reset_device_group_for_shared_key(session, key_idents, fpr_copy);
  3.1018 +                else if (status == PEP_STATUS_OK) {
  3.1019 +                    // now have ident list, or should
  3.1020 +                    identity_list* curr_ident;
  3.1021 +
  3.1022 +                    for (curr_ident = key_idents; curr_ident && curr_ident->ident; 
  3.1023 +                                                    curr_ident = curr_ident->next) {
  3.1024                          
  3.1025 -                        for (curr_ident = key_idents; curr_ident && curr_ident->ident; 
  3.1026 -                                                        curr_ident = curr_ident->next) {
  3.1027 +                        // Do the full reset on this identity        
  3.1028 +                        // Base case for is_own_private starts here
  3.1029 +                        // tmp ident is an actual identity now (not just a skeleton?)
  3.1030 +                        status = revoke_key(session, fpr_copy, NULL);
  3.1031 +                        
  3.1032 +                        // If we have a full identity, we have some cleanup and generation tasks here
  3.1033 +                        if (!EMPTYSTR(tmp_ident->address)) {
  3.1034 +                            // generate new key
  3.1035 +                            if (status == PEP_STATUS_OK) {
  3.1036 +                                tmp_ident->fpr = NULL;
  3.1037 +                                status = myself(session, tmp_ident);
  3.1038 +                            }
  3.1039 +                            if (status == PEP_STATUS_OK && tmp_ident->fpr && strcmp(fpr_copy, tmp_ident->fpr) != 0)
  3.1040 +                                new_key = strdup(tmp_ident->fpr);
  3.1041 +                            // Error handling?    
  3.1042                              
  3.1043 -                            pEp_identity* this_identity = curr_ident->ident;
  3.1044 -                            // Do the full reset on this identity        
  3.1045 -                            status = key_reset(session, fpr_copy, this_identity, own_identities, own_revoked_fprs);
  3.1046 +                            // mistrust fpr from trust
  3.1047 +                            tmp_ident->fpr = fpr_copy;
  3.1048 +                                                            
  3.1049 +                            tmp_ident->comm_type = PEP_ct_mistrusted;
  3.1050 +                            status = set_trust(session, tmp_ident);
  3.1051 +                            tmp_ident->fpr = NULL;
  3.1052                              
  3.1053 -                            // Ident list gets freed below, do not free here!
  3.1054 +                            // Done with old use of ident.
  3.1055 +                            if (status == PEP_STATUS_OK) {
  3.1056 +                                // Update fpr for outgoing
  3.1057 +                                status = myself(session, tmp_ident);
  3.1058 +                            }
  3.1059 +                        }    
  3.1060 +                        
  3.1061 +                        if (status == PEP_STATUS_OK)
  3.1062 +                            // cascade that mistrust for anyone using this key
  3.1063 +                            status = mark_as_compromised(session, fpr_copy);
  3.1064 +                            
  3.1065 +                        if (status == PEP_STATUS_OK)
  3.1066 +                            status = remove_fpr_as_default(session, fpr_copy);
  3.1067 +                        if (status == PEP_STATUS_OK)
  3.1068 +                            status = add_mistrusted_key(session, fpr_copy);
  3.1069  
  3.1070 -                            if (status != PEP_STATUS_OK)
  3.1071 -                                break;
  3.1072 +                        // If there's a new key, do the DB linkage with the revoked one, and 
  3.1073 +                        // send the key reset mail opportunistically to recently contacted
  3.1074 +                        // partners
  3.1075 +                        if (new_key) {
  3.1076 +                            // add to revocation list 
  3.1077 +                            if (status == PEP_STATUS_OK) 
  3.1078 +                                status = set_revoked(session, fpr_copy, new_key, time(NULL));            
  3.1079 +                            // for all active communication partners:
  3.1080 +                            //      active_send revocation
  3.1081                              
  3.1082 -                        }
  3.1083 +                            tmp_ident->fpr = fpr_copy;
  3.1084 +                            if (status == PEP_STATUS_OK)
  3.1085 +                                status = send_key_reset_to_recents(session, tmp_ident, fpr_copy, new_key);        
  3.1086 +                            tmp_ident->fpr = NULL;    
  3.1087 +                        }                    
  3.1088 +                        // Ident list gets freed below, do not free here!
  3.1089                      }
  3.1090 -                    // Ok, we've either now reset for each own identity with this key, or 
  3.1091 -                    // we got an error and want to bail anyway.
  3.1092 -                    goto pEp_free;
  3.1093 -                }    
  3.1094 +                }
  3.1095 +                // Ok, we've either now reset for each own identity with this key, or 
  3.1096 +                // we got an error and want to bail anyway.
  3.1097 +                goto pEp_free;
  3.1098              }
  3.1099 -            
  3.1100 -            // Base case for is_own_private starts here
  3.1101 -            
  3.1102 -            status = revoke_key(session, fpr_copy, NULL);
  3.1103 -            
  3.1104 -            // If we have a full identity, we have some cleanup and generation tasks here
  3.1105 -            if (!EMPTYSTR(tmp_ident->address)) {
  3.1106 -                // generate new key
  3.1107 -                if (status == PEP_STATUS_OK) {
  3.1108 -                    tmp_ident->fpr = NULL;
  3.1109 -                    status = myself(session, tmp_ident);
  3.1110 -                }
  3.1111 -                if (status == PEP_STATUS_OK && tmp_ident->fpr && strcmp(fpr_copy, tmp_ident->fpr) != 0) {
  3.1112 -                    new_key = strdup(tmp_ident->fpr);
  3.1113 -//                    status = set_own_key(session, tmp_ident, new_key);
  3.1114 -                }
  3.1115 -
  3.1116 -                if (own_revoked_fprs) {
  3.1117 -                    // We can dedup this later
  3.1118 -                    if (!(*own_revoked_fprs))
  3.1119 -                        *own_revoked_fprs = new_stringlist(NULL);
  3.1120 -                    
  3.1121 -                    char* revkey = strdup(fpr_copy);
  3.1122 -                    if (!revkey) {
  3.1123 -                        status = PEP_OUT_OF_MEMORY;
  3.1124 -                        goto pEp_free;
  3.1125 -                    }
  3.1126 -                    stringlist_add(*own_revoked_fprs, revkey);                
  3.1127 -                }
  3.1128 -                
  3.1129 -                // mistrust fpr from trust
  3.1130 -                tmp_ident->fpr = fpr_copy;
  3.1131 -                                                
  3.1132 -                tmp_ident->comm_type = PEP_ct_mistrusted;
  3.1133 -                status = set_trust(session, tmp_ident);
  3.1134 -                tmp_ident->fpr = NULL;
  3.1135 -                
  3.1136 -                // Done with old use of ident.
  3.1137 -                if (status == PEP_STATUS_OK) {
  3.1138 -                    // Update fpr for outgoing
  3.1139 -                    status = myself(session, tmp_ident);
  3.1140 -                }
  3.1141 -                
  3.1142 -                if (status == PEP_STATUS_OK && own_identities) {
  3.1143 -                    if (!(*own_identities))
  3.1144 -                        *own_identities = new_identity_list(NULL);
  3.1145 -                    
  3.1146 -                    pEp_identity* new_ident = identity_dup(tmp_ident);
  3.1147 -                    if (!new_ident) {
  3.1148 -                        status = PEP_OUT_OF_MEMORY;
  3.1149 -                        goto pEp_free;
  3.1150 -                    }
  3.1151 -                    identity_list_add(*own_identities, new_ident);            
  3.1152 -                }    
  3.1153 -            }    
  3.1154 -            
  3.1155 -            if (status == PEP_STATUS_OK)
  3.1156 -                // cascade that mistrust for anyone using this key
  3.1157 -                status = mark_as_compromised(session, fpr_copy);
  3.1158 -                
  3.1159 -            if (status == PEP_STATUS_OK)
  3.1160 -                status = remove_fpr_as_default(session, fpr_copy);
  3.1161 -            if (status == PEP_STATUS_OK)
  3.1162 -                status = add_mistrusted_key(session, fpr_copy);
  3.1163 -
  3.1164 -            // If there's a new key, do the DB linkage with the revoked one, and 
  3.1165 -            // send the key reset mail opportunistically to recently contacted
  3.1166 -            // partners
  3.1167 -            if (new_key) {
  3.1168 -                // add to revocation list 
  3.1169 -                if (status == PEP_STATUS_OK) 
  3.1170 -                    status = set_revoked(session, fpr_copy, new_key, time(NULL));            
  3.1171 -                // for all active communication partners:
  3.1172 -                //      active_send revocation
  3.1173 -                if (status == PEP_STATUS_OK)
  3.1174 -                    status = send_key_reset_to_recents(session, fpr_copy, new_key);        
  3.1175 -            }        
  3.1176 +            else 
  3.1177 +                return PEP_CANNOT_FIND_IDENTITY;
  3.1178          } // end is_own_private
  3.1179          else {
  3.1180              // if it's mistrusted, make it not be so.
  3.1181 @@ -642,6 +1221,7 @@
  3.1182      return status;
  3.1183  }
  3.1184  
  3.1185 +/*
  3.1186  static stringlist_t* collect_key_material(PEP_SESSION session, stringlist_t* fprs) {
  3.1187      stringlist_t* keydata = NULL;    
  3.1188      stringlist_t* curr_fpr = fprs;    
  3.1189 @@ -702,6 +1282,17 @@
  3.1190                  }
  3.1191                  if (datasize > 0 && key_material)
  3.1192                      stringlist_add(keydata, key_material);
  3.1193 +                    
  3.1194 +                key_material = NULL;
  3.1195 +                datasize = 0;    
  3.1196 +                status = export_private_keys(session, curr_ident->ident->fpr, &key_material, &datasize);    
  3.1197 +                if (status) {
  3.1198 +                    free_stringlist(keydata);
  3.1199 +                    return status;
  3.1200 +                }
  3.1201 +                if (datasize > 0 && key_material)
  3.1202 +                    stringlist_add(keydata, key_material);
  3.1203 +
  3.1204              }
  3.1205              curr_ident = curr_ident->next;
  3.1206          }
  3.1207 @@ -713,7 +1304,7 @@
  3.1208      free(revoked_fprs);
  3.1209      return PEP_STATUS_OK;
  3.1210  }
  3.1211 -
  3.1212 +*/
  3.1213  Distribution_t *Distribution_from_keyreset_command_list(
  3.1214          const keyreset_command_list *command_list,
  3.1215          Distribution_t *dist
  3.1216 @@ -778,6 +1369,7 @@
  3.1217      return NULL;
  3.1218  }
  3.1219  
  3.1220 +
  3.1221  PEP_STATUS key_reset_commands_to_PER(const keyreset_command_list *command_list, char **cmds, size_t *size)
  3.1222  {
  3.1223      PEP_STATUS status = PEP_STATUS_OK;
  3.1224 @@ -908,4 +1500,3 @@
  3.1225      ASN_STRUCT_FREE(asn_DEF_Distribution, dist);
  3.1226      return status;
  3.1227  }
  3.1228 -
     4.1 --- a/src/key_reset.h	Wed Jan 15 17:13:00 2020 +0100
     4.2 +++ b/src/key_reset.h	Thu Jan 16 12:40:10 2020 +0100
     4.3 @@ -114,11 +114,6 @@
     4.4  //                              if NULL and fpr is non-NULL, we'll reset the key for all
     4.5  //                              associated identities. If both ident and fpr are NULL, see 
     4.6  //                              the fpr arg documentation.
     4.7 -//      own_identities (out)    IF this is resetting own identities, passing in a pointer here 
     4.8 -//                              will cause key_reset to return a list of own_identities featuring 
     4.9 -//                              the new keys
    4.10 -//      own_revoked_fprs (out)  IF this is resetting own identities, passing in a pointer here 
    4.11 -//                              will cause key_reset to send a list of the revoked fprs
    4.12  //
    4.13  //      Note: ident->fpr is always ignored
    4.14  //
    4.15 @@ -128,26 +123,26 @@
    4.16  PEP_STATUS key_reset(
    4.17          PEP_SESSION session,
    4.18          const char* fpr,
    4.19 -        pEp_identity* ident,
    4.20 -        identity_list** own_identities,
    4.21 -        stringlist_t** own_revoked_fprs
    4.22 +        pEp_identity* ident
    4.23      );
    4.24  
    4.25 -
    4.26 +/*
    4.27  PEP_STATUS key_reset_own_and_deliver_revocations(PEP_SESSION session, 
    4.28                                                   identity_list** own_identities, 
    4.29                                                   stringlist_t** revocations, 
    4.30                                                   stringlist_t** keys);
    4.31 -
    4.32 +*/
    4.33  
    4.34  PEP_STATUS has_key_reset_been_sent(
    4.35          PEP_SESSION session, 
    4.36 +        const char* from_addr,
    4.37          const char* user_id, 
    4.38          const char* revoked_fpr,
    4.39          bool* contacted);
    4.40  
    4.41  PEP_STATUS set_reset_contact_notified(
    4.42          PEP_SESSION session,
    4.43 +        const char* own_address,
    4.44          const char* revoke_fpr,
    4.45          const char* contact_id
    4.46      );
    4.47 @@ -157,11 +152,14 @@
    4.48  
    4.49  PEP_STATUS create_standalone_key_reset_message(PEP_SESSION session,
    4.50                                                 message** dst, 
    4.51 +                                               pEp_identity* own_identity,
    4.52                                                 pEp_identity* recip,
    4.53                                                 const char* old_fpr,
    4.54                                                 const char* new_fpr);
    4.55 +
    4.56                                                 
    4.57  PEP_STATUS send_key_reset_to_recents(PEP_SESSION session,
    4.58 +                                     pEp_identity* from_ident,
    4.59                                       const char* old_fpr, 
    4.60                                       const char* new_fpr);
    4.61   
     5.1 --- a/src/keymanagement.h	Wed Jan 15 17:13:00 2020 +0100
     5.2 +++ b/src/keymanagement.h	Thu Jan 16 12:40:10 2020 +0100
     5.3 @@ -370,7 +370,10 @@
     5.4  //      myself() is called by set_own_key() without key generation
     5.5  //      me->flags are ignored
     5.6  //      me->address must not be an alias
     5.7 -//      me->fpr will be ignored and replaced by fpr
     5.8 +//      me->fpr will be ignored and replaced by fpr, but
     5.9 +//      caller MUST surrender ownership of the me->fpr reference, because 
    5.10 +//      it may be freed and replaced within the myself call. caller owns 
    5.11 +//      me->fpr memory again upon return.
    5.12  
    5.13  DYNAMIC_API PEP_STATUS set_own_key(
    5.14         PEP_SESSION session,
     6.1 --- a/src/message.h	Wed Jan 15 17:13:00 2020 +0100
     6.2 +++ b/src/message.h	Thu Jan 16 12:40:10 2020 +0100
     6.3 @@ -80,7 +80,6 @@
     6.4      struct _message_ref_list *next;
     6.5  } message_ref_list;
     6.6  
     6.7 -
     6.8  // new_message() - allocate new message
     6.9  //
    6.10  //  parameters:
     7.1 --- a/src/message_api.c	Wed Jan 15 17:13:00 2020 +0100
     7.2 +++ b/src/message_api.c	Thu Jan 16 12:40:10 2020 +0100
     7.3 @@ -3395,6 +3395,65 @@
     7.4          && keylist->value[0];
     7.5  }
     7.6  
     7.7 +// practically speaking, only useful to get user_id/address intersection
     7.8 +// we presume no dups in the first list if you're looking for
     7.9 +// a unique result.
    7.10 +static PEP_STATUS ident_list_intersect(identity_list* list_a, 
    7.11 +                                       identity_list* list_b,
    7.12 +                                       identity_list** intersection) {
    7.13 +
    7.14 +    if (!intersection)
    7.15 +        return PEP_ILLEGAL_VALUE;
    7.16 +                                           
    7.17 +    *intersection = NULL;                                       
    7.18 +    if (!list_a || !list_b || !list_a->ident || !list_b->ident)
    7.19 +        return PEP_STATUS_OK;
    7.20 +                
    7.21 +        
    7.22 +    *intersection = NULL;
    7.23 +    
    7.24 +    identity_list* isect = NULL;
    7.25 +    
    7.26 +    identity_list* curr_a = list_a;
    7.27 +    for ( ; curr_a && curr_a->ident; curr_a = curr_a->next) {
    7.28 +        pEp_identity* id_a = curr_a->ident;
    7.29 +        if (EMPTYSTR(id_a->user_id) || EMPTYSTR(id_a->address))
    7.30 +            continue;
    7.31 +
    7.32 +        identity_list* curr_b = list_b;
    7.33 +        for ( ; curr_b && curr_b->ident; curr_b = curr_b->next) {
    7.34 +            pEp_identity* id_b = curr_b->ident;
    7.35 +            if (EMPTYSTR(id_b->user_id) || EMPTYSTR(id_b->address))
    7.36 +                continue;
    7.37 +                
    7.38 +            if (strcmp(id_a->user_id, id_b->user_id) == 0 &&
    7.39 +                strcmp(id_a->address, id_b->address) == 0) {
    7.40 +                pEp_identity* result_id = identity_dup(id_b);
    7.41 +                if (!id_b) 
    7.42 +                    goto enomem;
    7.43 +                    
    7.44 +                if (!isect) {
    7.45 +                    isect = new_identity_list(result_id);
    7.46 +                    if (!isect) 
    7.47 +                        goto enomem;
    7.48 +                }    
    7.49 +                else {
    7.50 +                    if (!identity_list_add(isect, result_id))
    7.51 +                        goto enomem;
    7.52 +                }   
    7.53 +                break;  
    7.54 +            }
    7.55 +        }
    7.56 +    }
    7.57 +    *intersection = isect;
    7.58 +    return PEP_STATUS_OK;
    7.59 +
    7.60 +enomem:
    7.61 +    free_identity_list(isect);
    7.62 +    return PEP_OUT_OF_MEMORY;
    7.63 +    
    7.64 +}
    7.65 +
    7.66  static PEP_STATUS _decrypt_message(
    7.67          PEP_SESSION session,
    7.68          message *src,
    7.69 @@ -3551,6 +3610,7 @@
    7.70      
    7.71      bool imported_private_key_address = false;
    7.72      bool has_inner = false;
    7.73 +    bool is_key_reset = false;
    7.74  
    7.75      if (ptext) { 
    7.76          /* we got a plaintext from decryption */
    7.77 @@ -3718,7 +3778,6 @@
    7.78                          // Sort out pEp user status and version number based on INNER message.
    7.79                          
    7.80                          bool is_inner = false;
    7.81 -                        bool is_key_reset = false;
    7.82  
    7.83                          // Deal with plaintext modification in 1.0 and 2.0 messages
    7.84                          status = unencapsulate_hidden_fields(inner_message, NULL, &wrap_info);   
    7.85 @@ -3746,6 +3805,24 @@
    7.86                                  is_key_reset = (strcmp(wrap_info, "KEY_RESET") == 0);
    7.87                          }
    7.88                              
    7.89 +                        // check for private key in decrypted message attachment while importing
    7.90 +                        // N.B. Apparently, we always import private keys into the keyring; however,
    7.91 +                        // we do NOT always allow those to be used for encryption. THAT is controlled
    7.92 +                        // by setting it as an own identity associated with the key in the DB.
    7.93 +                        
    7.94 +                        // If we have a message 2.0 message, we are ONLY going to be ok with keys
    7.95 +                        // we imported from THIS part of the message.
    7.96 +                        imported_private_key_address = false;
    7.97 +                        free(private_il); 
    7.98 +                        private_il = NULL;
    7.99 +                        
   7.100 +                        // import keys from decrypted INNER source
   7.101 +                        status = import_priv_keys_from_decrypted_msg(session, inner_message,
   7.102 +                                                                     &imported_keys,
   7.103 +                                                                     &imported_private_key_address,
   7.104 +                                                                     private_il);
   7.105 +                        if (status != PEP_STATUS_OK)
   7.106 +                            goto pEp_error;            
   7.107  
   7.108                          if (is_key_reset) {
   7.109                              if (decrypt_status == PEP_DECRYPTED || decrypt_status == PEP_DECRYPTED_AND_VERIFIED) {
   7.110 @@ -3756,29 +3833,11 @@
   7.111                                      goto pEp_error;
   7.112                                  }
   7.113                                  *flags |= PEP_decrypt_flag_consume;
   7.114 +                                calculated_src = msg = inner_message;                                    
   7.115                              }
   7.116                          }
   7.117                          else if (is_inner) {
   7.118  
   7.119 -                            // check for private key in decrypted message attachment while importing
   7.120 -                            // N.B. Apparently, we always import private keys into the keyring; however,
   7.121 -                            // we do NOT always allow those to be used for encryption. THAT is controlled
   7.122 -                            // by setting it as an own identity associated with the key in the DB.
   7.123 -                            
   7.124 -                            // If we have a message 2.0 message, we are ONLY going to be ok with keys
   7.125 -                            // we imported from THIS part of the message.
   7.126 -                            imported_private_key_address = false;
   7.127 -                            free(private_il); 
   7.128 -                            private_il = NULL;
   7.129 -                            
   7.130 -                            // import keys from decrypted INNER source
   7.131 -                            status = import_priv_keys_from_decrypted_msg(session, inner_message,
   7.132 -                                                                         &imported_keys,
   7.133 -                                                                         &imported_private_key_address,
   7.134 -                                                                         private_il);
   7.135 -                            if (status != PEP_STATUS_OK)
   7.136 -                                goto pEp_error;            
   7.137 -
   7.138                              // THIS is our message
   7.139                              // Now, let's make sure we've copied in 
   7.140                              // any information sent in by the app if
   7.141 @@ -3837,17 +3896,20 @@
   7.142          // Ok, so if it was signed and it's all verified, we can update
   7.143          // eligible signer comm_types to PEP_ct_pEp_*
   7.144          // This also sets and upgrades pEp version
   7.145 -        if (decrypt_status == PEP_DECRYPTED_AND_VERIFIED && is_pEp_msg && calculated_src->from)
   7.146 +        if (decrypt_status == PEP_DECRYPTED_AND_VERIFIED && !is_key_reset && is_pEp_msg && calculated_src->from)
   7.147              status = update_sender_to_pEp_trust(session, calculated_src->from, _keylist, major_ver, minor_ver);
   7.148  
   7.149          /* Ok, now we have a keylist used for decryption/verification.
   7.150             now we need to update the message rating with the 
   7.151             sender and recipients in mind */
   7.152 -        status = amend_rating_according_to_sender_and_recipients(session,
   7.153 -                 rating, calculated_src->from, _keylist);
   7.154 -
   7.155 -        if (status != PEP_STATUS_OK)
   7.156 -            goto pEp_error;
   7.157 +           
   7.158 +        if (!is_key_reset) { // key reset messages invalidate some of the ratings in the DB by now.
   7.159 +            status = amend_rating_according_to_sender_and_recipients(session,
   7.160 +                     rating, calculated_src->from, _keylist);
   7.161 +            if (status != PEP_STATUS_OK)
   7.162 +                goto pEp_error;
   7.163 +         
   7.164 +        }             
   7.165          
   7.166          /* We decrypted ok, hallelujah. */
   7.167          msg->enc_format = PEP_enc_none;    
   7.168 @@ -3924,42 +3986,73 @@
   7.169                      continue; // Again, shouldn't occur
   7.170  
   7.171                  if (curr_pair->key && curr_pair->value) {
   7.172 -                    status = create_standalone_key_reset_message(session,
   7.173 -                        &reset_msg,
   7.174 -                        msg->from,
   7.175 -                        curr_pair->key,
   7.176 -                        curr_pair->value);
   7.177 -
   7.178 -                    // If we can't find the identity, this is someone we've never mailed, so we just
   7.179 -                    // go on letting them use the wrong key until we mail them ourselves. (Spammers, etc)
   7.180 -                    if (status != PEP_CANNOT_FIND_IDENTITY) {
   7.181 +                    /* Figure out which address(es) this came to so we know who to reply from */                    
   7.182 +
   7.183 +                    identity_list* my_rev_ids = NULL;
   7.184 +                    
   7.185 +                    /* check by replacement ID for identities which used this key? */
   7.186 +                    status = get_identities_by_main_key_id(session, curr_pair->value,
   7.187 +                                                           &my_rev_ids);
   7.188 +                                                                                                                      
   7.189 +                    if (status == PEP_STATUS_OK && my_rev_ids) {
   7.190 +                        // get identities in this list the message was to/cc'd to (not for bcc)
   7.191 +                        identity_list* used_ids_for_key = NULL;
   7.192 +                        status = ident_list_intersect(my_rev_ids, msg->to, &used_ids_for_key);
   7.193 +                        if (status != PEP_STATUS_OK)
   7.194 +                            goto pEp_error; // out of memory
   7.195 +
   7.196 +                        identity_list* used_cc_ids = NULL;    
   7.197 +                        status = ident_list_intersect(my_rev_ids, msg->cc, &used_cc_ids);
   7.198                          if (status != PEP_STATUS_OK)
   7.199                              goto pEp_error;
   7.200  
   7.201 -                        if (!reset_msg) {
   7.202 -                            status = PEP_OUT_OF_MEMORY;
   7.203 -                            goto pEp_error;
   7.204 -                        }
   7.205 -                        // insert into queue
   7.206 -                        if (session->messageToSend)
   7.207 -                            status = session->messageToSend(reset_msg);
   7.208 -                        else
   7.209 -                            status = PEP_SYNC_NO_MESSAGE_SEND_CALLBACK;
   7.210 -
   7.211 -
   7.212 -                        if (status == PEP_STATUS_OK) {
   7.213 -                            // Put into notified DB
   7.214 -                            status = set_reset_contact_notified(session, curr_pair->key, msg->from->user_id);
   7.215 -                            if (status != PEP_STATUS_OK) // It's ok to barf because it's a DB problem??
   7.216 -                                goto pEp_error;
   7.217 -                        }
   7.218 -                        else {
   7.219 -                            // According to Volker, this would only be a fatal error, so...
   7.220 -                            free_message(reset_msg); // ??
   7.221 -                            reset_msg = NULL; // ??
   7.222 -                            goto pEp_error;
   7.223 -                        }
   7.224 -                    }
   7.225 +                        used_ids_for_key = identity_list_join(used_ids_for_key, used_cc_ids);
   7.226 +                        
   7.227 +                        identity_list* curr_recip = used_ids_for_key;
   7.228 +                        
   7.229 +                        for ( ; curr_recip && curr_recip->ident; curr_recip = curr_recip->next) {
   7.230 +                            if (!is_me(session, curr_recip->ident))
   7.231 +                                continue;
   7.232 +                        
   7.233 +                            status = create_standalone_key_reset_message(session,
   7.234 +                                &reset_msg,
   7.235 +                                curr_recip->ident,
   7.236 +                                msg->from,
   7.237 +                                curr_pair->key,
   7.238 +                                curr_pair->value);
   7.239 +
   7.240 +                            // If we can't find the identity, this is someone we've never mailed, so we just
   7.241 +                            // go on letting them use the wrong key until we mail them ourselves. (Spammers, etc)
   7.242 +                            if (status != PEP_CANNOT_FIND_IDENTITY) {
   7.243 +                                if (status != PEP_STATUS_OK)
   7.244 +                                    goto pEp_error;
   7.245 +
   7.246 +                                if (!reset_msg) {
   7.247 +                                    status = PEP_OUT_OF_MEMORY;
   7.248 +                                    goto pEp_error;
   7.249 +                                }
   7.250 +                                // insert into queue
   7.251 +                                if (session->messageToSend)
   7.252 +                                    status = session->messageToSend(reset_msg);
   7.253 +                                else
   7.254 +                                    status = PEP_SYNC_NO_MESSAGE_SEND_CALLBACK;
   7.255 +
   7.256 +
   7.257 +                                if (status == PEP_STATUS_OK) {
   7.258 +                                    // Put into notified DB
   7.259 +                                    status = set_reset_contact_notified(session, curr_recip->ident->address, curr_pair->key, msg->from->user_id);
   7.260 +                                    if (status != PEP_STATUS_OK) // It's ok to barf because it's a DB problem??
   7.261 +                                        goto pEp_error;
   7.262 +                                }
   7.263 +                                else {
   7.264 +                                    // According to Volker, this would only be a fatal error, so...
   7.265 +                                    free_message(reset_msg); // ??
   7.266 +                                    reset_msg = NULL; // ??
   7.267 +                                    goto pEp_error;
   7.268 +                                }
   7.269 +                            }
   7.270 +                        }    
   7.271 +                    } // else we couldn't find an ident for replacement key    
   7.272                  }
   7.273              }
   7.274          }
     8.1 --- a/src/pEpEngine.c	Wed Jan 15 17:13:00 2020 +0100
     8.2 +++ b/src/pEpEngine.c	Thu Jan 16 12:40:10 2020 +0100
     8.3 @@ -503,19 +503,22 @@
     8.4      "select own_address from social_graph where own_userid = ?1 and contact_userid = ?2 ;";
     8.5  
     8.6  static const char *sql_set_revoke_contact_as_notified =
     8.7 -    "insert or replace into revocation_contact_list(fpr, contact_id) values (?1, ?2) ;";
     8.8 +    "insert or replace into revocation_contact_list(fpr, own_address, contact_id) values (?1, ?2, ?3) ;";
     8.9      
    8.10  static const char *sql_get_contacted_ids_from_revoke_fpr =
    8.11      "select * from revocation_contact_list where fpr = ?1 ;";
    8.12  
    8.13  static const char *sql_was_id_for_revoke_contacted = 
    8.14 -    "select count(*) from revocation_contact_list where fpr = ?1 and contact_id = ?2 ;";
    8.15 +    "select count(*) from revocation_contact_list where fpr = ?1 and own_address = ?2 and contact_id = ?3 ;";
    8.16 +
    8.17 +static const char *sql_has_id_contacted_address =
    8.18 +    "select count(*) from social_graph where own_address = ?1 and contact_userid = ?2 ;";
    8.19  
    8.20  // We only need user_id and address, since in the main usage, we'll call update_identity
    8.21  // on this anyway when sending out messages.
    8.22  static const char *sql_get_last_contacted =
    8.23      "select user_id, address from identity where datetime('now') < datetime(timestamp, '+14 days') ; ";
    8.24 -    
    8.25 +        
    8.26  static int user_version(void *_version, int count, char **text, char **name)
    8.27  {
    8.28      assert(_version);
    8.29 @@ -806,6 +809,112 @@
    8.30    fprintf(stderr, "(%d) %s\n", iErrCode, zMsg);
    8.31  }
    8.32  
    8.33 +static PEP_STATUS upgrade_revoc_contact_to_13(PEP_SESSION session) {
    8.34 +    // I HATE SQLITE.
    8.35 +    PEP_STATUS status = PEP_STATUS_OK;
    8.36 +    int int_result = 0;
    8.37 +
    8.38 +    // Ok, first we ADD the column so we can USE it.
    8.39 +    // We will end up propagating the "error" this first time 
    8.40 +    // (one-to-one revoke-replace relationships), but since key reset
    8.41 +    // hasn't been used in production, this is not a customer-facing 
    8.42 +    // issue.
    8.43 +    int_result = sqlite3_exec(
    8.44 +        session->db,
    8.45 +        "alter table revocation_contact_list\n"
    8.46 +        "   add column own_address text\n",
    8.47 +        NULL,
    8.48 +        NULL,
    8.49 +        NULL
    8.50 +    );
    8.51 +    assert(int_result == SQLITE_OK);
    8.52 +
    8.53 +    sqlite3_stmt* update_revoked_w_addr_stmt = NULL;
    8.54 +    const char* sql_query = "update revocation_contact_list set own_address = ?1 where fpr = ?2;";
    8.55 +    sqlite3_prepare_v2(session->db, sql_query, -1, &update_revoked_w_addr_stmt, NULL);
    8.56 +                
    8.57 +    // the best we can do here is search per address, since these
    8.58 +    // are no longer associated with an identity. For now, if we find 
    8.59 +    // something we can't add an address to, we'll delete the record.
    8.60 +    // this should not, in the current environment, ever happen, but 
    8.61 +    // since we need to make the address part of the primary key, it's 
    8.62 +    // the right thing to do. sqlite does support null fields in a primary 
    8.63 +    // key for a weird version compatibility reason, but that doesn't 
    8.64 +    // mean we should use it, and we should be *safe*, not relying 
    8.65 +    // on an implementation-specific quirk which might be sanely removed 
    8.66 +    // in a future sqlite version.
    8.67 +    stringpair_t* revoked_key_to_own_address = NULL;
    8.68 +    
    8.69 +    identity_list* id_list = NULL;
    8.70 +    status = own_identities_retrieve(session, &id_list);
    8.71 +
    8.72 +    if (!status || !id_list)
    8.73 +        return PEP_STATUS_OK; // it's empty AFAIK (FIXME)
    8.74 +    
    8.75 +    identity_list* curr_own = id_list;
    8.76 +    
    8.77 +    // Ok, go through and find any keys associated with this address  
    8.78 +    for ( ; curr_own && curr_own->ident; curr_own = curr_own->next) {
    8.79 +        if (EMPTYSTR(curr_own->ident->address)) // shouldn't happen
    8.80 +            continue;
    8.81 +        stringlist_t* keylist = NULL;
    8.82 +        status = find_keys(session, curr_own->ident->address, &keylist);
    8.83 +        stringlist_t* curr_key = keylist;
    8.84 +        for ( ; curr_key && curr_key->value; curr_key = curr_key->next) {
    8.85 +            if (EMPTYSTR(curr_key->value))
    8.86 +                continue;
    8.87 +                
    8.88 +            // We just do this lazily - if this isn't a revoked key, it 
    8.89 +            // won't do anything.
    8.90 +            sqlite3_bind_text(update_revoked_w_addr_stmt, 1, curr_own->ident->address, -1,
    8.91 +                              SQLITE_STATIC);
    8.92 +            sqlite3_bind_text(update_revoked_w_addr_stmt, 2, curr_key->value, -1,
    8.93 +                              SQLITE_STATIC);
    8.94 +                              
    8.95 +            int_result = sqlite3_step(update_revoked_w_addr_stmt);
    8.96 +            assert(int_result == SQLITE_DONE);                  
    8.97 +            sqlite3_reset(update_revoked_w_addr_stmt);                      
    8.98 +        }
    8.99 +    }  
   8.100 +    sqlite3_finalize(update_revoked_w_addr_stmt);
   8.101 +                
   8.102 +    int_result = sqlite3_exec(
   8.103 +        session->db,
   8.104 +        "delete from revocation_contact_list where own_address is NULL;\n"        
   8.105 +        "PRAGMA foreign_keys=off;\n"
   8.106 +        "BEGIN TRANSACTION;\n"
   8.107 +        "create table if not exists _revocation_contact_list_new (\n"
   8.108 +        "   fpr text not null references pgp_keypair (fpr)\n"
   8.109 +        "       on delete cascade,\n"
   8.110 +        "   own_address text,\n"
   8.111 +        "   contact_id text not null references person (id)\n"
   8.112 +        "       on delete cascade on update cascade,\n"
   8.113 +        "   timestamp integer default (datetime('now')),\n"
   8.114 +        "   PRIMARY KEY(fpr, own_address, contact_id)\n"
   8.115 +        ");\n"
   8.116 +        "INSERT INTO _revocation_contact_list_new (fpr, "
   8.117 +        "                                          own_address, "
   8.118 +        "                                          contact_id) "
   8.119 +        "   SELECT revocation_contact_list.fpr, "
   8.120 +        "          revocation_contact_list.own_address, "
   8.121 +        "          revocation_contact_list.contact_id "
   8.122 +        "   FROM revocation_contact_list "
   8.123 +        "   WHERE 1;\n"
   8.124 +        "DROP TABLE revocation_contact_list;\n"
   8.125 +        "ALTER TABLE _revocation_contact_list_new RENAME TO revocation_contact_list;\n"
   8.126 +        "COMMIT;\n"
   8.127 +        "\n"
   8.128 +        "PRAGMA foreign_keys=on;\n"
   8.129 +        ,
   8.130 +        NULL,
   8.131 +        NULL,
   8.132 +        NULL
   8.133 +    );
   8.134 +    assert(int_result == SQLITE_OK);    
   8.135 +    
   8.136 +    return status;
   8.137 +}
   8.138 +
   8.139  #ifdef USE_GPG
   8.140  PEP_STATUS pgp_import_ultimately_trusted_keypairs(PEP_SESSION session);
   8.141  #endif // USE_GPG
   8.142 @@ -934,7 +1043,7 @@
   8.143      sqlite3_busy_timeout(_session->system_db, 1000);
   8.144  
   8.145  // increment this when patching DDL
   8.146 -#define _DDL_USER_VERSION "12"
   8.147 +#define _DDL_USER_VERSION "13"
   8.148  
   8.149      if (in_first) {
   8.150  
   8.151 @@ -1052,10 +1161,11 @@
   8.152                  "create table if not exists revocation_contact_list (\n"
   8.153                  "   fpr text not null references pgp_keypair (fpr)\n"
   8.154                  "       on delete cascade,\n"
   8.155 +                "   own_address text,\n"
   8.156                  "   contact_id text not null references person (id)\n"
   8.157                  "       on delete cascade on update cascade,\n"
   8.158                  "   timestamp integer default (datetime('now')),\n"
   8.159 -                "   PRIMARY KEY(fpr, contact_id)\n"
   8.160 +                "   PRIMARY KEY(fpr, own_address, contact_id)\n"
   8.161                  ");\n"
   8.162                  ,
   8.163              NULL,
   8.164 @@ -1103,7 +1213,10 @@
   8.165          // Sometimes the user_version wasn't set correctly. 
   8.166          if (version == 1) {
   8.167              bool version_changed = true;
   8.168 -            if (table_contains_column(_session, "identity", "pEp_version_major")) {
   8.169 +            if (table_contains_column(_session, "revocation_contact_list", "own_address")) {
   8.170 +                version = 13;
   8.171 +            }
   8.172 +            else if (table_contains_column(_session, "identity", "pEp_version_major")) {
   8.173                  version = 12;
   8.174              }
   8.175              else if (db_contains_table(_session, "social_graph") > 0) {
   8.176 @@ -1555,6 +1668,12 @@
   8.177                  if (status != PEP_STATUS_OK)
   8.178                      return status;                      
   8.179              }
   8.180 +            if (version < 13) {
   8.181 +                status = upgrade_revoc_contact_to_13(_session);
   8.182 +                assert(status == PEP_STATUS_OK);
   8.183 +                if (status != PEP_STATUS_OK)
   8.184 +                    return status;
   8.185 +            }        
   8.186          }        
   8.187          else { 
   8.188              // Version from DB was 0, it means this is initial setup.
   8.189 @@ -1715,6 +1834,12 @@
   8.190      assert(int_result == SQLITE_OK);
   8.191  
   8.192      int_result = sqlite3_prepare_v2(_session->db, 
   8.193 +            sql_has_id_contacted_address,
   8.194 +            (int)strlen(sql_has_id_contacted_address), 
   8.195 +            &_session->has_id_contacted_address, NULL);
   8.196 +    assert(int_result == SQLITE_OK);
   8.197 +
   8.198 +    int_result = sqlite3_prepare_v2(_session->db, 
   8.199              sql_get_last_contacted,
   8.200              (int)strlen(sql_get_last_contacted), 
   8.201              &_session->get_last_contacted, NULL);
   8.202 @@ -2022,7 +2147,9 @@
   8.203              if (session->get_contacted_ids_from_revoke_fpr)
   8.204                  sqlite3_finalize(session->get_contacted_ids_from_revoke_fpr);  
   8.205              if (session->was_id_for_revoke_contacted)
   8.206 -                sqlite3_finalize(session->was_id_for_revoke_contacted);   
   8.207 +                sqlite3_finalize(session->was_id_for_revoke_contacted);  
   8.208 +            if (session->has_id_contacted_address)
   8.209 +                sqlite3_finalize(session->has_id_contacted_address);
   8.210              if (session->get_last_contacted)
   8.211                  sqlite3_finalize(session->get_last_contacted);                                       
   8.212              if (session->set_pgp_keypair)
   8.213 @@ -3567,6 +3694,46 @@
   8.214      return PEP_STATUS_OK;
   8.215  }
   8.216  
   8.217 +// FIXME: should be more like is there a communications relationship,
   8.218 +// since this could be either way
   8.219 +PEP_STATUS has_partner_contacted_address(PEP_SESSION session, const char* partner_id,
   8.220 +                                         const char* own_address, bool* was_contacted) {            
   8.221 +    
   8.222 +    assert(session);
   8.223 +    assert(!EMPTYSTR(partner_id));
   8.224 +    assert(!EMPTYSTR(own_address));    
   8.225 +    assert(was_contacted);
   8.226 +    
   8.227 +    if (!session || !was_contacted || EMPTYSTR(partner_id) || EMPTYSTR(own_address))
   8.228 +        return PEP_ILLEGAL_VALUE;
   8.229 +    
   8.230 +    *was_contacted = false;
   8.231 +
   8.232 +    PEP_STATUS status = PEP_STATUS_OK;
   8.233 +    
   8.234 +    sqlite3_reset(session->has_id_contacted_address);
   8.235 +    sqlite3_bind_text(session->has_id_contacted_address, 1, own_address, -1,
   8.236 +            SQLITE_STATIC);            
   8.237 +    sqlite3_bind_text(session->has_id_contacted_address, 2, partner_id, -1,
   8.238 +            SQLITE_STATIC);
   8.239 +            
   8.240 +    int result = sqlite3_step(session->has_id_contacted_address);
   8.241 +    switch (result) {
   8.242 +        case SQLITE_ROW: {
   8.243 +            // yeah yeah, I know, we could be lazy here, but it looks bad.
   8.244 +            *was_contacted = (sqlite3_column_int(session->has_id_contacted_address, 0) != 0);
   8.245 +            status = PEP_STATUS_OK;
   8.246 +            break;
   8.247 +        }
   8.248 +        default:
   8.249 +            status = PEP_UNKNOWN_DB_ERROR;
   8.250 +    }
   8.251 +    sqlite3_reset(session->has_id_contacted_address);
   8.252 +            
   8.253 +    return status;
   8.254 +}
   8.255 +
   8.256 +// FIXME: problematic - can be multiple and this now matters
   8.257  PEP_STATUS get_own_ident_for_contact_id(PEP_SESSION session,
   8.258                                            const pEp_identity* contact,
   8.259                                            pEp_identity** own_ident) {
     9.1 --- a/src/pEpEngine.h	Wed Jan 15 17:13:00 2020 +0100
     9.2 +++ b/src/pEpEngine.h	Thu Jan 16 12:40:10 2020 +0100
     9.3 @@ -1430,6 +1430,8 @@
     9.4  PEP_STATUS set_all_userids_to_own(PEP_SESSION session, 
     9.5                                    identity_list* id_list);
     9.6  
     9.7 +PEP_STATUS has_partner_contacted_address(PEP_SESSION session, const char* partner_id,
     9.8 +                                         const char* own_address, bool* was_contacted);
     9.9  #ifdef __cplusplus
    9.10  }
    9.11  #endif
    10.1 --- a/src/pEp_internal.h	Wed Jan 15 17:13:00 2020 +0100
    10.2 +++ b/src/pEp_internal.h	Thu Jan 16 12:40:10 2020 +0100
    10.3 @@ -191,6 +191,7 @@
    10.4      sqlite3_stmt *set_revoke_contact_as_notified;
    10.5      sqlite3_stmt *get_contacted_ids_from_revoke_fpr;
    10.6      sqlite3_stmt *was_id_for_revoke_contacted;
    10.7 +    sqlite3_stmt *has_id_contacted_address;
    10.8      sqlite3_stmt *get_last_contacted;
    10.9      // sqlite3_stmt *set_device_group;
   10.10      // sqlite3_stmt *get_device_group;
    11.1 --- a/src/pgp_sequoia.c	Wed Jan 15 17:13:00 2020 +0100
    11.2 +++ b/src/pgp_sequoia.c	Thu Jan 16 12:40:10 2020 +0100
    11.3 @@ -96,7 +96,7 @@
    11.4  } while(0)
    11.5  
    11.6  #ifdef _PEP_SQLITE_DEBUG
    11.7 -int sq_sql_trace_callback (unsigned trace_constant, 
    11.8 +int sq_sql_trace_callback (unsigned trace_constant,
    11.9                          void* context_ptr,
   11.10                          void* P,
   11.11                          void* X) {
   11.12 @@ -112,7 +112,7 @@
   11.13          case SQLITE_TRACE_ROW:
   11.14              fprintf(stderr, "SEQUOIA_SQL_DEBUG: ROW - ");
   11.15              fprintf(stderr, "%s\n", sqlite3_expanded_sql((sqlite3_stmt*)P));
   11.16 -            break;            
   11.17 +            break;
   11.18          case SQLITE_TRACE_CLOSE:
   11.19              fprintf(stderr, "SEQUOIA_SQL_DEBUG: CLOSE - ");
   11.20              break;
   11.21 @@ -285,11 +285,11 @@
   11.22  #endif
   11.23  
   11.24  #ifdef _PEP_SQLITE_DEBUG
   11.25 -    sqlite3_trace_v2(session->key_db, 
   11.26 +    sqlite3_trace_v2(session->key_db,
   11.27          SQLITE_TRACE_STMT | SQLITE_TRACE_ROW | SQLITE_TRACE_CLOSE,
   11.28          sq_sql_trace_callback,
   11.29 -        NULL);    
   11.30 -#endif            
   11.31 +        NULL);
   11.32 +#endif
   11.33  
   11.34      if (sqlite_result != SQLITE_OK)
   11.35          ERROR_OUT(NULL, PEP_INIT_CANNOT_OPEN_DB,
   11.36 @@ -2071,11 +2071,11 @@
   11.37  
   11.38  static unsigned int count_keydata_parts(const char* key_data, size_t size) {
   11.39      unsigned int retval = 0;
   11.40 -    
   11.41 +
   11.42      const char* pgp_begin = "-----BEGIN PGP";
   11.43      size_t prefix_len = strlen(pgp_begin);
   11.44      size_t size_remaining = size;
   11.45 -    
   11.46 +
   11.47      while (key_data) {
   11.48          if (size_remaining <= prefix_len || key_data[0] == '\0')
   11.49              break;
   11.50 @@ -2230,19 +2230,19 @@
   11.51  
   11.52      const char* pgp_begin = "-----BEGIN PGP";
   11.53      size_t prefix_len = strlen(pgp_begin);
   11.54 -        
   11.55 +
   11.56      unsigned int i;
   11.57      const char* curr_begin;
   11.58      size_t curr_size;
   11.59 -    
   11.60 -    identity_list* collected_idents = NULL;        
   11.61 -    
   11.62 +
   11.63 +    identity_list* collected_idents = NULL;
   11.64 +
   11.65      PEP_STATUS retval = PEP_KEY_IMPORTED;
   11.66 -    
   11.67 +
   11.68      for (i = 0, curr_begin = key_data; i < keycount; i++) {
   11.69          const char* next_begin = NULL;
   11.70  
   11.71 -        // This is assured to be OK because the count function above 
   11.72 +        // This is assured to be OK because the count function above
   11.73          // made sure that THIS round contains at least prefix_len chars
   11.74          // We used strnstr to count, so we know that strstr will be ok.
   11.75          if (strlen(curr_begin + prefix_len) > prefix_len)
   11.76 @@ -2252,16 +2252,16 @@
   11.77              curr_size = next_begin - curr_begin;
   11.78          else
   11.79              curr_size = (key_data + size) - curr_begin;
   11.80 -        
   11.81 +
   11.82          PEP_STATUS curr_status = _pgp_import_keydata(session, curr_begin, curr_size, private_idents);
   11.83          if (private_idents && *private_idents) {
   11.84              if (!collected_idents)
   11.85                  collected_idents = *private_idents;
   11.86 -            else 
   11.87 +            else
   11.88                  identity_list_join(collected_idents, *private_idents);
   11.89 -            *private_idents = NULL;    
   11.90 +            *private_idents = NULL;
   11.91          }
   11.92 -        
   11.93 +
   11.94          if (curr_status != retval) {
   11.95              switch (curr_status) {
   11.96                  case PEP_NO_KEY_IMPORTED:
   11.97 @@ -2282,15 +2282,15 @@
   11.98                      retval = PEP_SOME_KEYS_IMPORTED;
   11.99                  default:
  11.100                      break;
  11.101 -            }        
  11.102 -        }        
  11.103 -        curr_begin = next_begin;     
  11.104 +            }
  11.105 +        }
  11.106 +        curr_begin = next_begin;
  11.107      }
  11.108 -    
  11.109 +
  11.110      if (private_idents)
  11.111          *private_idents = collected_idents;
  11.112 -    
  11.113 -    return retval;    
  11.114 +
  11.115 +    return retval;
  11.116  }
  11.117  
  11.118  PEP_STATUS pgp_export_keydata(
  11.119 @@ -2851,15 +2851,15 @@
  11.120      }
  11.121  
  11.122      bool expired = false;
  11.123 -    
  11.124 +
  11.125      // MUST guarantee the same behaviour.
  11.126      _pgp_key_expired(cert, time(NULL), &expired);
  11.127 -    
  11.128 +
  11.129      if (expired) {
  11.130          *comm_type = PEP_ct_key_expired;
  11.131 -        goto out;        
  11.132 +        goto out;
  11.133      }
  11.134 -    
  11.135 +
  11.136      // if (pgp_cert_expired(cert)) {
  11.137      //     *comm_type = PEP_ct_key_expired;
  11.138      //     goto out;
    12.1 --- a/src/sync_api.h	Wed Jan 15 17:13:00 2020 +0100
    12.2 +++ b/src/sync_api.h	Thu Jan 16 12:40:10 2020 +0100
    12.3 @@ -209,7 +209,7 @@
    12.4  PEP_STATUS disable_sync(PEP_SESSION session);
    12.5  
    12.6  // leave_device_group() - Issue a group key reset request and 
    12.7 -// leave the device group, shutting down sync \
    12.8 +// leave the device group, shutting down sync 
    12.9  //
   12.10  //  parameters:
   12.11  //      session                 pEp session
    13.1 --- a/test/src/KeyResetMessageTest.cc	Wed Jan 15 17:13:00 2020 +0100
    13.2 +++ b/test/src/KeyResetMessageTest.cc	Thu Jan 16 12:40:10 2020 +0100
    13.3 @@ -34,13 +34,13 @@
    13.4          PEP_SESSION session;
    13.5  
    13.6          vector<message*> m_queue;
    13.7 -        
    13.8 +
    13.9      protected:
   13.10 -                    
   13.11 +
   13.12          const char* alice_fpr = "4ABE3AAF59AC32CFE4F86500A9411D176FF00E97";
   13.13          const char* bob_fpr = "BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39";
   13.14 -    
   13.15 -        const char* alice_receive_reset_fpr = "6A349E4F68801E39145CD4C5712616A385412538";
   13.16 +
   13.17 +        const char* alice_receive_reset_fpr = "3340B36010854C3F52E97A30FA7B63E0202523DA";
   13.18  
   13.19          const string alice_user_id = PEP_OWN_USERID;
   13.20          const string bob_user_id = "BobId";
   13.21 @@ -92,13 +92,13 @@
   13.22          void TearDown() override {
   13.23              // Code here will be called immediately after each test (right
   13.24              // before the destructor).
   13.25 -            KRMT_fake_this = NULL;            
   13.26 +            KRMT_fake_this = NULL;
   13.27              engine->shut_down();
   13.28              delete engine;
   13.29              engine = NULL;
   13.30              session = NULL;
   13.31          }
   13.32 -        
   13.33 +
   13.34          void send_setup() {
   13.35              // Setup own identity
   13.36              PEP_STATUS status = read_file_and_import_key(session,
   13.37 @@ -160,12 +160,12 @@
   13.38  
   13.39              status = set_up_ident_from_scratch(session,
   13.40                          "test_keys/pub/pep-test-alice-0x6FF00E97_pub.asc",
   13.41 -                        "pep.test.alice@pep-project.org", NULL, alice_user_id.c_str(), "Alice is tired of Bob",
   13.42 +                        "pep.test.alice@pep-project.org", NULL, alice_user_id.c_str(), "Alice in Wonderland",
   13.43                          NULL, false
   13.44                      );
   13.45              ASSERT_EQ(status, PEP_STATUS_OK);
   13.46          }
   13.47 -        
   13.48 +
   13.49          void create_msg_for_revoked_key() {
   13.50              PEP_STATUS status = set_up_ident_from_scratch(session,
   13.51                          "test_keys/pub/pep-test-gabrielle-0xE203586C_pub.asc",
   13.52 @@ -182,7 +182,7 @@
   13.53  
   13.54              status = set_up_ident_from_scratch(session,
   13.55                          "test_keys/pub/pep-test-alice-0x6FF00E97_pub.asc",
   13.56 -                        "pep.test.alice@pep-project.org", NULL, "AliceOther", "Alice is tired of Bob",
   13.57 +                        "pep.test.alice@pep-project.org", NULL, "AliceOther", "Alice in Wonderland",
   13.58                          NULL, false
   13.59                      );
   13.60  
   13.61 @@ -236,6 +236,7 @@
   13.62      return PEP_STATUS_OK;
   13.63  }
   13.64  
   13.65 +
   13.66  TEST_F(KeyResetMessageTest, check_reset_key_and_notify) {
   13.67      send_setup();
   13.68  
   13.69 @@ -307,7 +308,7 @@
   13.70      );
   13.71      ASSERT_EQ(int_result , SQLITE_OK);
   13.72  
   13.73 -    status = key_reset(session, alice_fpr, from_ident, NULL, NULL);
   13.74 +    status = key_reset(session, alice_fpr, from_ident);
   13.75      ASSERT_EQ(status , PEP_STATUS_OK);
   13.76      ASSERT_GT(m_queue.size(), 0);
   13.77      status = myself(session, from_ident);
   13.78 @@ -342,16 +343,24 @@
   13.79  
   13.80          // Uncomment to regenerate received message - remember to update
   13.81          // alice_receive_reset_fpr
   13.82 -        // if (strcmp(curr_sent_msg->to->ident->user_id, bob_user_id.c_str()) == 0) {
   13.83 -        //     char* bob_msg = NULL;
   13.84 -        //     mime_encode_message(curr_sent_msg, false, &bob_msg);
   13.85 -        //     output_stream << bob_msg;
   13.86 -        // }
   13.87 -        // else if (strcmp(curr_sent_msg->to->ident->user_id, fenris_user_id.c_str()) == 0) {
   13.88 -        //     char* fenris_msg = NULL;
   13.89 -        //     mime_encode_message(curr_sent_msg, false, &fenris_msg);
   13.90 -        //     output_stream << fenris_msg;
   13.91 -        // }
   13.92 +        if (false) {
   13.93 +            if (strcmp(curr_sent_msg->to->ident->user_id, bob_user_id.c_str()) == 0) {
   13.94 +                ofstream outfile;
   13.95 +                outfile.open("test_files/398_reset_from_alice_to_bob.eml");
   13.96 +                char* bob_msg = NULL;
   13.97 +                mime_encode_message(curr_sent_msg, false, &bob_msg);
   13.98 +                outfile << bob_msg;
   13.99 +                outfile.close();
  13.100 +            }
  13.101 +            else if (strcmp(curr_sent_msg->to->ident->user_id, fenris_user_id.c_str()) == 0) {
  13.102 +                ofstream outfile;
  13.103 +                outfile.open("test_files/398_reset_from_alice_to_fenris.eml");
  13.104 +                char* fenris_msg = NULL;
  13.105 +                mime_encode_message(curr_sent_msg, false, &fenris_msg);
  13.106 +                outfile << fenris_msg;
  13.107 +                outfile.close();
  13.108 +            }
  13.109 +        }
  13.110      }
  13.111  
  13.112      // MESSAGE LIST NOW INVALID.
  13.113 @@ -364,8 +373,10 @@
  13.114      ASSERT_FALSE(hashmap[dave_user_id]);
  13.115      ASSERT_TRUE(hashmap[erin_user_id]);
  13.116      ASSERT_TRUE(hashmap[fenris_user_id]);
  13.117 +    cout << "HEY! reset_fpr is " << new_fpr << endl;
  13.118  }
  13.119  
  13.120 +
  13.121  TEST_F(KeyResetMessageTest, check_non_reset_receive_revoked) {
  13.122      receive_setup();
  13.123      pEp_identity* alice_ident = new_identity("pep.test.alice@pep-project.org", NULL,
  13.124 @@ -380,7 +391,7 @@
  13.125      char* modified_src = NULL;
  13.126      stringlist_t* keylist = NULL;
  13.127      PEP_rating rating;
  13.128 -    PEP_decrypt_flags_t flags;
  13.129 +    PEP_decrypt_flags_t flags = 0;
  13.130      status = MIME_decrypt_message(session, received_mail.c_str(), received_mail.size(),
  13.131                                    &decrypted_msg, &keylist, &rating, &flags, &modified_src);
  13.132  
  13.133 @@ -408,19 +419,19 @@
  13.134      status = set_up_ident_from_scratch(session,
  13.135                  "test_keys/priv/pep.test.fenris-0x4F3D2900_priv.asc",
  13.136                  "pep.test.fenris@thisstilldoesntwork.lu", NULL, fenris_user_id.c_str(),
  13.137 -                "Fenris Leto Hawke", NULL, false
  13.138 +                "Fenris Leto Hawke", NULL, true
  13.139              );
  13.140      ASSERT_EQ(status, PEP_STATUS_OK);
  13.141  
  13.142      status = set_up_ident_from_scratch(session,
  13.143                  "test_keys/pub/pep-test-alice-0x6FF00E97_pub.asc",
  13.144 -                "pep.test.alice@pep-project.org", NULL, alice_user_id.c_str(), "Alice is tired of Bob",
  13.145 +                "pep.test.alice@pep-project.org", NULL, "ALICE_IS_NOT_OWN_ID", "Alice in Wonderland",
  13.146                  NULL, false
  13.147              );
  13.148      ASSERT_EQ(status, PEP_STATUS_OK);
  13.149  
  13.150      pEp_identity* alice_ident = new_identity("pep.test.alice@pep-project.org", NULL,
  13.151 -                                            alice_user_id.c_str(), NULL);
  13.152 +                                            "ALICE_IS_NOT_OWN_ID", "Alice in Wonderland");
  13.153  
  13.154      status = update_identity(session, alice_ident);
  13.155      ASSERT_EQ(status , PEP_STATUS_OK);
  13.156 @@ -431,7 +442,7 @@
  13.157      char* modified_src = NULL;
  13.158      stringlist_t* keylist = NULL;
  13.159      PEP_rating rating;
  13.160 -    PEP_decrypt_flags_t flags;
  13.161 +    PEP_decrypt_flags_t flags = 0;
  13.162      status = MIME_decrypt_message(session, received_mail.c_str(), received_mail.size(),
  13.163                                    &decrypted_msg, &keylist, &rating, &flags, &modified_src);
  13.164  
  13.165 @@ -460,7 +471,7 @@
  13.166      ASSERT_STRCASEEQ(from_ident->fpr, alice_fpr);
  13.167      ASSERT_TRUE(from_ident->me);
  13.168  
  13.169 -    status = key_reset(session, alice_fpr, from_ident, NULL, NULL);
  13.170 +    status = key_reset(session, alice_fpr, from_ident);
  13.171      ASSERT_EQ(status , PEP_STATUS_OK);
  13.172      m_queue.clear();
  13.173  
  13.174 @@ -469,7 +480,7 @@
  13.175      char* modified_src = NULL;
  13.176      stringlist_t* keylist = NULL;
  13.177      PEP_rating rating;
  13.178 -    PEP_decrypt_flags_t flags;
  13.179 +    PEP_decrypt_flags_t flags = 0;
  13.180      status = MIME_decrypt_message(session, received_mail.c_str(), received_mail.size(),
  13.181                                    &decrypted_msg, &keylist, &rating, &flags, &modified_src);
  13.182      ASSERT_EQ(m_queue.size() , 0);
  13.183 @@ -479,6 +490,7 @@
  13.184      free_identity(from_ident);
  13.185  }
  13.186  
  13.187 +
  13.188  TEST_F(KeyResetMessageTest, check_receive_message_to_revoked_key_from_contact) {
  13.189      // create_msg_for_revoked_key(); // call to recreate msg
  13.190      send_setup();
  13.191 @@ -524,7 +536,7 @@
  13.192      // FIXME: longer term we need to fix the test, but the key attached to the message below has expired, so for now, we give her a new key
  13.193      slurp_and_import_key(session, "test_keys/pub/pep-test-gabrielle-0xE203586C_pub.asc");
  13.194  
  13.195 -    status = key_reset(session, alice_fpr, from_ident, NULL, NULL);
  13.196 +    status = key_reset(session, alice_fpr, from_ident);
  13.197      ASSERT_EQ(status , PEP_STATUS_OK);
  13.198      ASSERT_EQ(m_queue.size() , 0);
  13.199      m_queue.clear();
  13.200 @@ -536,7 +548,7 @@
  13.201      char* modified_src = NULL;
  13.202      stringlist_t* keylist = NULL;
  13.203      PEP_rating rating;
  13.204 -    PEP_decrypt_flags_t flags;
  13.205 +    PEP_decrypt_flags_t flags = 0;
  13.206      status = MIME_decrypt_message(session, received_mail.c_str(), received_mail.size(),
  13.207                                    &decrypted_msg, &keylist, &rating, &flags, &modified_src);
  13.208  
  13.209 @@ -560,6 +572,7 @@
  13.210      }
  13.211  }
  13.212  
  13.213 +
  13.214  TEST_F(KeyResetMessageTest, check_multiple_resets_single_key) {
  13.215      send_setup();
  13.216  
  13.217 @@ -570,10 +583,10 @@
  13.218      ASSERT_STRCASEEQ(from_ident->fpr, alice_fpr);
  13.219      ASSERT_TRUE(from_ident->me);
  13.220  
  13.221 -    status = key_reset(session, NULL, NULL, NULL, NULL);
  13.222 +    status = key_reset(session, NULL, NULL);
  13.223      ASSERT_EQ(status , PEP_STATUS_OK);
  13.224  
  13.225 -    status = key_reset(session, NULL, NULL, NULL, NULL);
  13.226 +    status = key_reset(session, NULL, NULL);
  13.227      ASSERT_EQ(status , PEP_STATUS_OK);
  13.228  
  13.229      status = myself(session, from_ident);
  13.230 @@ -581,6 +594,7 @@
  13.231      ASSERT_TRUE(from_ident->fpr != NULL && from_ident->fpr[0] != 0);
  13.232  }
  13.233  
  13.234 +
  13.235  TEST_F(KeyResetMessageTest, check_reset_ident_uid_only) {
  13.236      send_setup(); // lazy
  13.237      pEp_identity* bob = new_identity(NULL, NULL, bob_user_id.c_str(), NULL);
  13.238 @@ -590,6 +604,7 @@
  13.239      ASSERT_EQ(status , PEP_ILLEGAL_VALUE);
  13.240  }
  13.241  
  13.242 +
  13.243  TEST_F(KeyResetMessageTest, check_reset_ident_address_only) {
  13.244      send_setup(); // lazy
  13.245      pEp_identity* bob = new_identity("pep.test.bob@pep-project.org", NULL, NULL, NULL);
  13.246 @@ -598,12 +613,725 @@
  13.247      ASSERT_EQ(status , PEP_ILLEGAL_VALUE);
  13.248  }
  13.249  
  13.250 +
  13.251  TEST_F(KeyResetMessageTest, check_reset_ident_null_ident) {
  13.252      // Ok, let's reset it
  13.253      PEP_STATUS status = key_reset_identity(session, NULL, NULL);
  13.254      ASSERT_EQ(status , PEP_ILLEGAL_VALUE);
  13.255  }
  13.256  
  13.257 +TEST_F(KeyResetMessageTest, check_reset_grouped_own) {
  13.258 +    send_setup(); // lazy
  13.259 +    pEp_identity* alice = new_identity("pep.test.alice@pep-project.org", NULL, alice_user_id.c_str(), NULL);
  13.260 +    PEP_STATUS status = myself(session, alice);
  13.261 +
  13.262 +    ASSERT_EQ(status , PEP_STATUS_OK);
  13.263 +    ASSERT_TRUE(alice->fpr && alice->fpr[0]);
  13.264 +    ASSERT_TRUE(alice->me);
  13.265 +    ASSERT_STREQ(alice->fpr, alice_fpr);
  13.266 +
  13.267 +    status = set_identity_flags(session, alice, alice->flags | PEP_idf_devicegroup);
  13.268 +    status = key_reset_identity(session, alice, alice_fpr);
  13.269 +    status = myself(session, alice);
  13.270 +    ASSERT_EQ(status , PEP_STATUS_OK);
  13.271 +    char* alice_new_fpr = alice->fpr;
  13.272 +    ASSERT_TRUE(alice_new_fpr && alice_new_fpr[0]);
  13.273 +    ASSERT_STRNE(alice_fpr, alice_new_fpr);
  13.274 +
  13.275 +    ASSERT_EQ(m_queue.size(), 1);
  13.276 +
  13.277 +    if (false) {
  13.278 +        ofstream outfile;
  13.279 +        outfile.open("test_mails/check_reset_grouped_own_recv.eml");
  13.280 +        message* curr_sent_msg = m_queue.at(0);
  13.281 +        char* msg_txt = NULL;
  13.282 +        mime_encode_message(curr_sent_msg, false, &msg_txt);
  13.283 +        outfile << msg_txt;
  13.284 +        outfile.close();
  13.285 +        cout << "    ASSERT_STREQ(alice->fpr, \"" << alice_new_fpr << "\");" << endl;
  13.286 +        
  13.287 +        // Check what we have here, because it looks wrong
  13.288 +        char* ptext = NULL;
  13.289 +        stringlist_t* _keylist;
  13.290 +        size_t psize = 0;
  13.291 +        status = decrypt_and_verify(session, curr_sent_msg->attachments->next->value,
  13.292 +                                                       strlen(curr_sent_msg->attachments->next->value), NULL, 0,
  13.293 +                                                       &ptext, &psize, &_keylist,
  13.294 +                                                       NULL);
  13.295 +        message* inner_msg = NULL;
  13.296 +        status = mime_decode_message(ptext, psize, &inner_msg);
  13.297 +        
  13.298 +        bloblist_t* key_reset_payload = inner_msg->attachments;  
  13.299 +        message* keyreset_msg = NULL;
  13.300 +        status = mime_decode_message(key_reset_payload->value, key_reset_payload->size, &keyreset_msg);
  13.301 +        keyreset_command_list* cl = NULL;
  13.302 +        status = PER_to_key_reset_commands(keyreset_msg->attachments->value, keyreset_msg->attachments->size, &cl);                                             
  13.303 +        ASSERT_NE(cl, nullptr);
  13.304 +        ASSERT_STREQ(cl->command->ident->address, "pep.test.alice@pep-project.org");
  13.305 +        ASSERT_STREQ(cl->command->ident->fpr, alice_fpr);        
  13.306 +        ASSERT_STREQ(cl->command->new_key, alice_new_fpr);                
  13.307 +        ASSERT_EQ(cl->next, nullptr);
  13.308 +    }
  13.309 +}
  13.310 +
  13.311 +TEST_F(KeyResetMessageTest, check_reset_grouped_own_recv) {
  13.312 +    send_setup(); // lazy
  13.313 +    pEp_identity* alice = new_identity("pep.test.alice@pep-project.org", NULL, alice_user_id.c_str(), NULL);
  13.314 +    PEP_STATUS status = myself(session, alice);
  13.315 +
  13.316 +    ASSERT_EQ(status , PEP_STATUS_OK);
  13.317 +    ASSERT_TRUE(alice->fpr && alice->fpr[0]);
  13.318 +    ASSERT_TRUE(alice->me);
  13.319 +    ASSERT_STREQ(alice->fpr, alice_fpr);
  13.320 +
  13.321 +    status = set_identity_flags(session, alice, alice->flags | PEP_idf_devicegroup);
  13.322 +    ASSERT_EQ(status , PEP_STATUS_OK);
  13.323 +    status = myself(session, alice);
  13.324 +    ASSERT_EQ(status , PEP_STATUS_OK);
  13.325 +
  13.326 +    string received_mail = slurp("test_mails/check_reset_grouped_own_recv.eml");
  13.327 +    char* decrypted_msg = NULL;
  13.328 +    char* modified_src = NULL;
  13.329 +    stringlist_t* keylist = NULL;
  13.330 +    PEP_rating rating;
  13.331 +    PEP_decrypt_flags_t flags = 0;
  13.332 +    status = MIME_decrypt_message(session, received_mail.c_str(), received_mail.size(),
  13.333 +                                  &decrypted_msg, &keylist, &rating, &flags, &modified_src);
  13.334 +
  13.335 +    status = myself(session, alice);
  13.336 +    ASSERT_EQ(status , PEP_STATUS_OK);
  13.337 +    ASSERT_STRNE(alice->fpr, alice_fpr);
  13.338 +    ASSERT_STREQ(alice->fpr, "0D9374B9573548600272BF1D84A892F08ED7BBBF");
  13.339 +    bool revoked = false;
  13.340 +    status = key_revoked(session, alice_fpr, &revoked);
  13.341 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.342 +    ASSERT_TRUE(revoked);
  13.343 +
  13.344 +}
  13.345 +
  13.346 +TEST_F(KeyResetMessageTest, check_reset_grouped_own_multi_ident_one_fpr) {
  13.347 +    char* pubkey1 = strdup("74D79B4496E289BD8A71B70BA8E2C4530019697D");
  13.348 +
  13.349 +    pEp_identity* alex_id = new_identity("pep.test.alexander@darthmama.org",
  13.350 +                                        NULL,
  13.351 +                                        "AlexID",
  13.352 +                                        "Alexander Braithwaite");
  13.353 +
  13.354 +    pEp_identity* alex_id2 = new_identity("pep.test.alexander6@darthmama.org",
  13.355 +                                          NULL,
  13.356 +                                          "AlexID",
  13.357 +                                          "Alexander Braithwaite");
  13.358 +
  13.359 +    pEp_identity* alex_id3 = new_identity("pep.test.alexander6a@darthmama.org",
  13.360 +                                          NULL,
  13.361 +                                          "AlexID",
  13.362 +                                          "Alexander Braithwaite");
  13.363 +
  13.364 +    PEP_STATUS status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0x0019697D_pub.asc");
  13.365 +    status = read_file_and_import_key(session, "test_keys/priv/pep.test.alexander6-0x0019697D_priv.asc");
  13.366 +
  13.367 +    alex_id->me = true;
  13.368 +    status = set_own_key(session, alex_id, pubkey1);
  13.369 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.370 +    status = set_identity_flags(session, alex_id, alex_id->flags | PEP_idf_devicegroup);
  13.371 +    ASSERT_EQ(status , PEP_STATUS_OK);
  13.372 +
  13.373 +    alex_id2->me = true;
  13.374 +    status = set_own_key(session, alex_id2, pubkey1);
  13.375 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.376 +    status = set_identity_flags(session, alex_id2, alex_id2->flags | PEP_idf_devicegroup);
  13.377 +    ASSERT_EQ(status , PEP_STATUS_OK);
  13.378 +
  13.379 +    alex_id3->me = true;
  13.380 +    status = set_own_key(session, alex_id3, pubkey1);
  13.381 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.382 +    status = set_identity_flags(session, alex_id3, alex_id3->flags | PEP_idf_devicegroup);
  13.383 +    ASSERT_EQ(status , PEP_STATUS_OK);
  13.384 +
  13.385 +    status = myself(session, alex_id);
  13.386 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.387 +    ASSERT_STREQ(pubkey1, alex_id->fpr);
  13.388 +
  13.389 +    status = myself(session, alex_id2);
  13.390 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.391 +    ASSERT_STREQ(pubkey1, alex_id2->fpr);
  13.392 +
  13.393 +    status = myself(session, alex_id3);
  13.394 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.395 +    ASSERT_STREQ(pubkey1, alex_id3->fpr);
  13.396 +
  13.397 +    status = key_reset_identity(session, alex_id, pubkey1);
  13.398 +
  13.399 +    free(alex_id->fpr);
  13.400 +    alex_id->fpr = strdup(pubkey1);
  13.401 +    status = get_trust(session, alex_id);
  13.402 +    ASSERT_EQ(alex_id->comm_type , PEP_ct_mistrusted);
  13.403 +
  13.404 +    bool revoked = false;
  13.405 +    status = key_revoked(session, pubkey1, &revoked);
  13.406 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.407 +    ASSERT_TRUE(revoked);
  13.408 +
  13.409 +    status = myself(session, alex_id);
  13.410 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.411 +    ASSERT_STRNE(pubkey1, alex_id->fpr);
  13.412 +
  13.413 +    status = myself(session, alex_id2);
  13.414 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.415 +    ASSERT_STRNE(pubkey1, alex_id2->fpr);
  13.416 +
  13.417 +    status = myself(session, alex_id3);
  13.418 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.419 +    ASSERT_STRNE(pubkey1, alex_id3->fpr);
  13.420 +
  13.421 +    ASSERT_STRNE(alex_id->fpr, alex_id2->fpr);
  13.422 +    ASSERT_STRNE(alex_id->fpr, alex_id3->fpr);
  13.423 +    ASSERT_STRNE(alex_id2->fpr, alex_id3->fpr);
  13.424 +
  13.425 +    ASSERT_EQ(m_queue.size(),1);
  13.426 +    if (false) {
  13.427 +        ofstream outfile;
  13.428 +        message* curr_sent_msg = m_queue.at(0);        
  13.429 +        string fname = "test_mails/check_reset_grouped_own_multi_ident_one_fpr.eml";
  13.430 +        outfile.open(fname);
  13.431 +        char* msg_txt = NULL;
  13.432 +        mime_encode_message(curr_sent_msg, false, &msg_txt);
  13.433 +        outfile << msg_txt;
  13.434 +        outfile.close();        
  13.435 +        cout <<  "    const char* replkey1 = \"" << alex_id->fpr << "\";" << endl;    
  13.436 +        cout <<  "    const char* replkey2 = \"" << alex_id2->fpr << "\";" << endl;    
  13.437 +        cout <<  "    const char* replkey3 = \"" << alex_id3->fpr << "\";" << endl;        
  13.438 +    }    
  13.439 +
  13.440 +    free_identity(alex_id);
  13.441 +    free_identity(alex_id2);
  13.442 +    free_identity(alex_id3);
  13.443 +}
  13.444 +
  13.445 +TEST_F(KeyResetMessageTest, check_reset_grouped_own_multi_ident_one_fpr_recv) {
  13.446 +    PEP_STATUS status = PEP_STATUS_OK;
  13.447 +    const char* replkey1 = "369BD11FB63BAE28105085BFE399BE76DA9EB063";
  13.448 +    const char* replkey2 = "6F61E78E8250F1CA7573F01F53F6467C533334F7";
  13.449 +    const char* replkey3 = "0ECDE4A782182BD5B59BF7D25738C0F2C6D2D837";
  13.450 +        
  13.451 +    // set up device own state
  13.452 +    char* pubkey1 = strdup("74D79B4496E289BD8A71B70BA8E2C4530019697D");
  13.453 +
  13.454 +    pEp_identity* alex_id = new_identity("pep.test.alexander@darthmama.org",
  13.455 +                                        NULL,
  13.456 +                                        "AlexID",
  13.457 +                                        "Alexander Braithwaite");
  13.458 +
  13.459 +    pEp_identity* alex_id2 = new_identity("pep.test.alexander6@darthmama.org",
  13.460 +                                          NULL,
  13.461 +                                          "AlexID",
  13.462 +                                          "Alexander Braithwaite");
  13.463 +
  13.464 +    pEp_identity* alex_id3 = new_identity("pep.test.alexander6a@darthmama.org",
  13.465 +                                          NULL,
  13.466 +                                          "AlexID",
  13.467 +                                          "Alexander Braithwaite");
  13.468 +
  13.469 +    status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0x0019697D_pub.asc");
  13.470 +    status = read_file_and_import_key(session, "test_keys/priv/pep.test.alexander6-0x0019697D_priv.asc");
  13.471 +
  13.472 +    alex_id->me = true;
  13.473 +    status = set_own_key(session, alex_id, pubkey1);
  13.474 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.475 +
  13.476 +    alex_id2->me = true;
  13.477 +    status = set_own_key(session, alex_id2, pubkey1);
  13.478 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.479 +
  13.480 +    alex_id3->me = true;
  13.481 +    status = set_own_key(session, alex_id3, pubkey1);
  13.482 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.483 +
  13.484 +    status = myself(session, alex_id);
  13.485 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.486 +    ASSERT_STREQ(pubkey1, alex_id->fpr);
  13.487 +
  13.488 +    status = myself(session, alex_id2);
  13.489 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.490 +    ASSERT_STREQ(pubkey1, alex_id2->fpr);
  13.491 +
  13.492 +    status = myself(session, alex_id3);
  13.493 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.494 +    ASSERT_STREQ(pubkey1, alex_id3->fpr);
  13.495 +
  13.496 +    // receive reset messages
  13.497 +    message* dec_msg = NULL;
  13.498 +    stringlist_t* keylist = NULL;
  13.499 +    PEP_rating rating;
  13.500 +    PEP_decrypt_flags_t flags = 0;
  13.501 +
  13.502 +    string fname = "test_mails/check_reset_grouped_own_multi_ident_one_fpr.eml";
  13.503 +    string mailstr = slurp(fname.c_str());
  13.504 +    message* new_msg = NULL;
  13.505 +    status = mime_decode_message(mailstr.c_str(), mailstr.size(), &new_msg);
  13.506 +    ASSERT_NE(new_msg, nullptr);
  13.507 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.508 +
  13.509 +    status = decrypt_message(session, new_msg, &dec_msg, &keylist, &rating, &flags);
  13.510 +    ASSERT_EQ(status, PEP_STATUS_OK);        
  13.511 +
  13.512 +    status = myself(session, alex_id);
  13.513 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.514 +    ASSERT_STREQ(replkey1, alex_id->fpr);
  13.515 +
  13.516 +    status = myself(session, alex_id2);
  13.517 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.518 +    ASSERT_STREQ(replkey2, alex_id2->fpr);
  13.519 +
  13.520 +    status = myself(session, alex_id3);
  13.521 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.522 +    ASSERT_STREQ(replkey3, alex_id3->fpr);
  13.523 +}
  13.524 +
  13.525 +TEST_F(KeyResetMessageTest, check_reset_grouped_own_multiple_keys_multiple_idents_reset_all) {
  13.526 +    char* pubkey1 = strdup("74D79B4496E289BD8A71B70BA8E2C4530019697D");
  13.527 +    char* pubkey2 = strdup("2E21325D202A44BFD9C607FCF095B202503B14D8");
  13.528 +    char* pubkey3 = strdup("3C1E713D8519D7F907E3142D179EAA24A216E95A");
  13.529 +
  13.530 +    pEp_identity* alex_id = new_identity("pep.test.alexander@darthmama.org",
  13.531 +                                        NULL,
  13.532 +                                        "AlexID",
  13.533 +                                        "Alexander Braithwaite");
  13.534 +
  13.535 +    pEp_identity* alex_id2 = new_identity("pep.test.alexander6@darthmama.org",
  13.536 +                                          NULL,
  13.537 +                                          "AlexID",
  13.538 +                                          "Alexander Braithwaite");
  13.539 +
  13.540 +    pEp_identity* alex_id3 = new_identity("pep.test.alexander6a@darthmama.org",
  13.541 +                                          NULL,
  13.542 +                                          "AlexID",
  13.543 +                                          "Alexander Braithwaite");
  13.544 +
  13.545 +
  13.546 +    PEP_STATUS status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0x0019697D_pub.asc");
  13.547 +    status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0x503B14D8_pub.asc");
  13.548 +    status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0xA216E95A_pub.asc");
  13.549 +    status = read_file_and_import_key(session, "test_keys/priv/pep.test.alexander6-0x0019697D_priv.asc");
  13.550 +    status = read_file_and_import_key(session, "test_keys/priv/pep.test.alexander6-0x503B14D8_priv.asc");
  13.551 +    status = read_file_and_import_key(session, "test_keys/priv/pep.test.alexander6-0xA216E95A_priv.asc");
  13.552 +
  13.553 +    alex_id->me = true;
  13.554 +    status = set_own_key(session, alex_id, pubkey1);
  13.555 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.556 +    status = set_identity_flags(session, alex_id, alex_id->flags | PEP_idf_devicegroup);
  13.557 +    ASSERT_EQ(status , PEP_STATUS_OK);
  13.558 +
  13.559 +    alex_id2->me = true;
  13.560 +    status = set_own_key(session, alex_id2, pubkey2);
  13.561 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.562 +    status = set_identity_flags(session, alex_id2, alex_id2->flags | PEP_idf_devicegroup);
  13.563 +    ASSERT_EQ(status , PEP_STATUS_OK);
  13.564 +
  13.565 +    alex_id3->me = true;
  13.566 +    status = set_own_key(session, alex_id3, pubkey3);
  13.567 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.568 +    status = set_identity_flags(session, alex_id3, alex_id3->flags | PEP_idf_devicegroup);
  13.569 +    ASSERT_EQ(status , PEP_STATUS_OK);
  13.570 +
  13.571 +    status = myself(session, alex_id);
  13.572 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.573 +    ASSERT_STREQ(pubkey1, alex_id->fpr);
  13.574 +
  13.575 +    status = myself(session, alex_id2);
  13.576 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.577 +    ASSERT_STREQ(pubkey2, alex_id2->fpr);
  13.578 +
  13.579 +    status = myself(session, alex_id3);
  13.580 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.581 +    ASSERT_STREQ(pubkey3, alex_id3->fpr);
  13.582 +
  13.583 +    status = key_reset_all_own_keys(session);
  13.584 +
  13.585 +    free(alex_id->fpr);
  13.586 +    alex_id->fpr = strdup(pubkey1);
  13.587 +    status = get_trust(session, alex_id);
  13.588 +    ASSERT_EQ(alex_id->comm_type , PEP_ct_mistrusted);
  13.589 +
  13.590 +    free(alex_id2->fpr);
  13.591 +    alex_id2->fpr = strdup(pubkey2);
  13.592 +    status = get_trust(session, alex_id2);
  13.593 +    ASSERT_EQ(alex_id->comm_type , PEP_ct_mistrusted);
  13.594 +
  13.595 +    free(alex_id3->fpr);
  13.596 +    alex_id3->fpr = strdup(pubkey3);
  13.597 +    status = get_trust(session, alex_id3);
  13.598 +    ASSERT_EQ(alex_id->comm_type , PEP_ct_mistrusted);
  13.599 +
  13.600 +    bool revoked = false;
  13.601 +    status = key_revoked(session, pubkey1, &revoked);
  13.602 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.603 +    ASSERT_TRUE(revoked);
  13.604 +
  13.605 +    revoked = false;
  13.606 +    status = key_revoked(session, pubkey2, &revoked);
  13.607 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.608 +    ASSERT_TRUE(revoked);
  13.609 +
  13.610 +    revoked = false;
  13.611 +    status = key_revoked(session, pubkey3, &revoked);
  13.612 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.613 +    ASSERT_TRUE(revoked);
  13.614 +
  13.615 +    status = myself(session, alex_id);
  13.616 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.617 +    ASSERT_STRNE(pubkey1, alex_id->fpr);
  13.618 +
  13.619 +    status = myself(session, alex_id2);
  13.620 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.621 +    ASSERT_STRNE(pubkey2, alex_id2->fpr);
  13.622 +
  13.623 +    status = myself(session, alex_id3);
  13.624 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.625 +    ASSERT_STRNE(pubkey3, alex_id3->fpr);
  13.626 +
  13.627 +    // Not reaaaally necessary, but...
  13.628 +    ASSERT_STRNE(alex_id->fpr, alex_id2->fpr);
  13.629 +    ASSERT_STRNE(alex_id->fpr, alex_id3->fpr);
  13.630 +    ASSERT_STRNE(alex_id2->fpr, alex_id3->fpr);
  13.631 +
  13.632 +    ASSERT_EQ(m_queue.size(),3);
  13.633 +    if (false) {
  13.634 +        ofstream outfile;
  13.635 +        int i = 0;
  13.636 +        for (vector<message*>::iterator it = m_queue.begin(); it != m_queue.end(); it++, i++) {
  13.637 +            message* curr_sent_msg = *it;        
  13.638 +            string fname = string("test_mails/check_reset_grouped_own_multiple_keys_multiple_idents_reset_all_") + to_string(i) + ".eml";
  13.639 +            outfile.open(fname);
  13.640 +            char* msg_txt = NULL;
  13.641 +            mime_encode_message(curr_sent_msg, false, &msg_txt);
  13.642 +            outfile << msg_txt;
  13.643 +            outfile.close();        
  13.644 +        }
  13.645 +        cout <<  "    // For " << alex_id->address << endl;
  13.646 +        cout <<  "    const char* replkey1 = \"" << alex_id->fpr << "\";" << endl;    
  13.647 +        cout <<  "    // For " << alex_id2->address << endl;        
  13.648 +        cout <<  "    const char* replkey2 = \"" << alex_id2->fpr << "\";" << endl;    
  13.649 +        cout <<  "    // For " << alex_id3->address << endl;        
  13.650 +        cout <<  "    const char* replkey3 = \"" << alex_id3->fpr << "\";" << endl;        
  13.651 +    }    
  13.652 +
  13.653 +    free_identity(alex_id);
  13.654 +    free_identity(alex_id2);
  13.655 +    free_identity(alex_id3);
  13.656 +}
  13.657 +
  13.658 +TEST_F(KeyResetMessageTest, check_reset_grouped_own_multiple_keys_multiple_idents_reset_all_recv) {
  13.659 +    PEP_STATUS status = PEP_STATUS_OK;
  13.660 +    char* pubkey1 = strdup("74D79B4496E289BD8A71B70BA8E2C4530019697D");
  13.661 +    char* pubkey2 = strdup("2E21325D202A44BFD9C607FCF095B202503B14D8");
  13.662 +    char* pubkey3 = strdup("3C1E713D8519D7F907E3142D179EAA24A216E95A");
  13.663 +
  13.664 +    // For pep.test.alexander@darthmama.org
  13.665 +    const char* replkey1 = "D3F3F1A71B90AB972965983A425AF48C11059347";
  13.666 +    // For pep.test.alexander6@darthmama.org
  13.667 +    const char* replkey2 = "C3752B57BDFD8969AD77DA73B00EC49BF2B71A66";
  13.668 +    // For pep.test.alexander6a@darthmama.org
  13.669 +    const char* replkey3 = "52E8C995B74990EC258BD7B1C27D8251B345F01F";
  13.670 +    
  13.671 +    pEp_identity* alex_id = new_identity("pep.test.alexander@darthmama.org",
  13.672 +                                        NULL,
  13.673 +                                        "AlexID",
  13.674 +                                        "Alexander Braithwaite");
  13.675 +
  13.676 +    pEp_identity* alex_id2 = new_identity("pep.test.alexander6@darthmama.org",
  13.677 +                                          NULL,
  13.678 +                                          "AlexID",
  13.679 +                                          "Alexander Braithwaite");
  13.680 +
  13.681 +    pEp_identity* alex_id3 = new_identity("pep.test.alexander6a@darthmama.org",
  13.682 +                                          NULL,
  13.683 +                                          "AlexID",
  13.684 +                                          "Alexander Braithwaite");
  13.685 +
  13.686 +
  13.687 +    status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0x0019697D_pub.asc");
  13.688 +    status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0x503B14D8_pub.asc");
  13.689 +    status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0xA216E95A_pub.asc");
  13.690 +    status = read_file_and_import_key(session, "test_keys/priv/pep.test.alexander6-0x0019697D_priv.asc");
  13.691 +    status = read_file_and_import_key(session, "test_keys/priv/pep.test.alexander6-0x503B14D8_priv.asc");
  13.692 +    status = read_file_and_import_key(session, "test_keys/priv/pep.test.alexander6-0xA216E95A_priv.asc");
  13.693 +
  13.694 +    alex_id->me = true;
  13.695 +    status = set_own_key(session, alex_id, pubkey1);
  13.696 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.697 +    status = set_identity_flags(session, alex_id, alex_id->flags | PEP_idf_devicegroup);
  13.698 +    ASSERT_EQ(status , PEP_STATUS_OK);
  13.699 +
  13.700 +    alex_id2->me = true;
  13.701 +    status = set_own_key(session, alex_id2, pubkey2);
  13.702 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.703 +    status = set_identity_flags(session, alex_id2, alex_id2->flags | PEP_idf_devicegroup);
  13.704 +    ASSERT_EQ(status , PEP_STATUS_OK);
  13.705 +
  13.706 +    alex_id3->me = true;
  13.707 +    status = set_own_key(session, alex_id3, pubkey3);
  13.708 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.709 +    status = set_identity_flags(session, alex_id3, alex_id3->flags | PEP_idf_devicegroup);
  13.710 +    ASSERT_EQ(status , PEP_STATUS_OK);
  13.711 +
  13.712 +    status = myself(session, alex_id);
  13.713 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.714 +    ASSERT_STREQ(pubkey1, alex_id->fpr);
  13.715 +
  13.716 +    status = myself(session, alex_id2);
  13.717 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.718 +    ASSERT_STREQ(pubkey2, alex_id2->fpr);
  13.719 +
  13.720 +    status = myself(session, alex_id3);
  13.721 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.722 +    ASSERT_STREQ(pubkey3, alex_id3->fpr);
  13.723 +
  13.724 +    const int num_msgs = 3;
  13.725 +    for (int i = 0; i < num_msgs; i++) {
  13.726 +        // receive reset messages
  13.727 +        message* dec_msg = NULL;
  13.728 +        stringlist_t* keylist = NULL;
  13.729 +        PEP_rating rating;
  13.730 +        PEP_decrypt_flags_t flags = 0;
  13.731 +
  13.732 +        string fname = string("test_mails/check_reset_grouped_own_multiple_keys_multiple_idents_reset_all_") + to_string(i) + ".eml";
  13.733 +        string mailstr = slurp(fname.c_str());
  13.734 +        message* new_msg = NULL;
  13.735 +        status = mime_decode_message(mailstr.c_str(), mailstr.size(), &new_msg);
  13.736 +        ASSERT_NE(new_msg, nullptr);
  13.737 +        ASSERT_EQ(status, PEP_STATUS_OK);
  13.738 +
  13.739 +        status = decrypt_message(session, new_msg, &dec_msg, &keylist, &rating, &flags);
  13.740 +        ASSERT_EQ(status, PEP_STATUS_OK);        
  13.741 +    }
  13.742 +
  13.743 +    status = myself(session, alex_id);
  13.744 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.745 +    ASSERT_STREQ(replkey1, alex_id->fpr);
  13.746 +
  13.747 +    status = myself(session, alex_id2);
  13.748 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.749 +    ASSERT_STREQ(replkey2, alex_id2->fpr);
  13.750 +
  13.751 +    status = myself(session, alex_id3);
  13.752 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.753 +    ASSERT_STREQ(replkey3, alex_id3->fpr);
  13.754 +}
  13.755 +
  13.756 +
  13.757 +TEST_F(KeyResetMessageTest, check_reset_grouped_own_multiple_keys_multiple_idents_reset_one) {
  13.758 +    char* pubkey1 = strdup("74D79B4496E289BD8A71B70BA8E2C4530019697D");
  13.759 +    char* pubkey2 = strdup("2E21325D202A44BFD9C607FCF095B202503B14D8");
  13.760 +    char* pubkey3 = strdup("3C1E713D8519D7F907E3142D179EAA24A216E95A");
  13.761 +
  13.762 +    pEp_identity* alex_id = new_identity("pep.test.alexander@darthmama.org",
  13.763 +                                        NULL,
  13.764 +                                        "AlexID",
  13.765 +                                        "Alexander Braithwaite");
  13.766 +
  13.767 +    pEp_identity* alex_id2 = new_identity("pep.test.alexander6@darthmama.org",
  13.768 +                                          NULL,
  13.769 +                                          "AlexID",
  13.770 +                                          "Alexander Braithwaite");
  13.771 +
  13.772 +    pEp_identity* alex_id3 = new_identity("pep.test.alexander6a@darthmama.org",
  13.773 +                                          NULL,
  13.774 +                                          "AlexID",
  13.775 +                                          "Alexander Braithwaite");
  13.776 +
  13.777 +
  13.778 +    PEP_STATUS status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0x0019697D_pub.asc");
  13.779 +    status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0x503B14D8_pub.asc");
  13.780 +    status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0xA216E95A_pub.asc");
  13.781 +    status = read_file_and_import_key(session, "test_keys/priv/pep.test.alexander6-0x0019697D_priv.asc");
  13.782 +    status = read_file_and_import_key(session, "test_keys/priv/pep.test.alexander6-0x503B14D8_priv.asc");
  13.783 +    status = read_file_and_import_key(session, "test_keys/priv/pep.test.alexander6-0xA216E95A_priv.asc");
  13.784 +
  13.785 +    alex_id->me = true;
  13.786 +    status = set_own_key(session, alex_id, pubkey1);
  13.787 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.788 +    status = set_identity_flags(session, alex_id2, alex_id2->flags | PEP_idf_devicegroup);
  13.789 +    ASSERT_EQ(status , PEP_STATUS_OK);
  13.790 +
  13.791 +    alex_id2->me = true;
  13.792 +    status = set_own_key(session, alex_id2, pubkey2);
  13.793 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.794 +    status = set_identity_flags(session, alex_id2, alex_id2->flags | PEP_idf_devicegroup);
  13.795 +    ASSERT_EQ(status , PEP_STATUS_OK);
  13.796 +
  13.797 +    alex_id3->me = true;
  13.798 +    status = set_own_key(session, alex_id3, pubkey3);
  13.799 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.800 +    status = set_identity_flags(session, alex_id2, alex_id2->flags | PEP_idf_devicegroup);
  13.801 +    ASSERT_EQ(status , PEP_STATUS_OK);
  13.802 +
  13.803 +    status = myself(session, alex_id);
  13.804 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.805 +    ASSERT_STREQ(pubkey1, alex_id->fpr);
  13.806 +
  13.807 +    status = myself(session, alex_id2);
  13.808 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.809 +    ASSERT_STREQ(pubkey2, alex_id2->fpr);
  13.810 +
  13.811 +    status = myself(session, alex_id3);
  13.812 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.813 +    ASSERT_STREQ(pubkey3, alex_id3->fpr);
  13.814 +
  13.815 +    status = key_reset_identity(session, alex_id2, alex_id2->fpr);
  13.816 +
  13.817 +    free(alex_id->fpr);
  13.818 +    alex_id->fpr = strdup(pubkey1);
  13.819 +    status = get_trust(session, alex_id);
  13.820 +    ASSERT_EQ(alex_id->comm_type , PEP_ct_pEp);
  13.821 +
  13.822 +    free(alex_id2->fpr);
  13.823 +    alex_id2->fpr = strdup(pubkey2);
  13.824 +    status = get_trust(session, alex_id2);
  13.825 +    ASSERT_EQ(alex_id2->comm_type , PEP_ct_mistrusted);
  13.826 +
  13.827 +    free(alex_id3->fpr);
  13.828 +    alex_id3->fpr = strdup(pubkey3);
  13.829 +    status = get_trust(session, alex_id3);
  13.830 +    ASSERT_EQ(alex_id3->comm_type , PEP_ct_pEp);
  13.831 +
  13.832 +    bool revoked = false;
  13.833 +    status = key_revoked(session, pubkey1, &revoked);
  13.834 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.835 +    ASSERT_FALSE(revoked);
  13.836 +
  13.837 +    revoked = false;
  13.838 +    status = key_revoked(session, pubkey2, &revoked);
  13.839 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.840 +    ASSERT_TRUE(revoked);
  13.841 +
  13.842 +    revoked = false;
  13.843 +    status = key_revoked(session, pubkey3, &revoked);
  13.844 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.845 +    ASSERT_FALSE(revoked);
  13.846 +
  13.847 +    status = myself(session, alex_id);
  13.848 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.849 +    ASSERT_STREQ(pubkey1, alex_id->fpr);
  13.850 +
  13.851 +    status = myself(session, alex_id2);
  13.852 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.853 +    ASSERT_STRNE(pubkey2, alex_id2->fpr);
  13.854 +
  13.855 +    status = myself(session, alex_id3);
  13.856 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.857 +    ASSERT_STREQ(pubkey3, alex_id3->fpr);
  13.858 +
  13.859 +    // Not reaaaally necessary, but...
  13.860 +    ASSERT_STRNE(alex_id->fpr, alex_id2->fpr);
  13.861 +    ASSERT_STRNE(alex_id->fpr, alex_id3->fpr);
  13.862 +    ASSERT_STRNE(alex_id2->fpr, alex_id3->fpr);
  13.863 +
  13.864 +    ASSERT_EQ(m_queue.size(),1);
  13.865 +    if (false) {
  13.866 +        ofstream outfile;
  13.867 +        message* curr_sent_msg = m_queue.at(0);        
  13.868 +        string fname = "test_mails/check_reset_grouped_own_multiple_keys_multiple_idents_reset_one.eml";
  13.869 +        outfile.open(fname);
  13.870 +        char* msg_txt = NULL;
  13.871 +        mime_encode_message(curr_sent_msg, false, &msg_txt);
  13.872 +        outfile << msg_txt;
  13.873 +        outfile.close();        
  13.874 +        cout <<  "    const char* replkey2 = \"" << alex_id2->fpr << "\";" << endl;    
  13.875 +    }    
  13.876 +    
  13.877 +
  13.878 +    free_identity(alex_id);
  13.879 +    free_identity(alex_id2);
  13.880 +    free_identity(alex_id3);
  13.881 +}
  13.882 +
  13.883 +TEST_F(KeyResetMessageTest, check_reset_grouped_own_multiple_keys_multiple_idents_reset_one_recv) {
  13.884 +    char* pubkey1 = strdup("74D79B4496E289BD8A71B70BA8E2C4530019697D");
  13.885 +    char* pubkey2 = strdup("2E21325D202A44BFD9C607FCF095B202503B14D8");
  13.886 +    char* pubkey3 = strdup("3C1E713D8519D7F907E3142D179EAA24A216E95A");
  13.887 +    const char* replkey2 = "E08F5E0AB145AFF1DBC4D0FB49F3D5CAC8A47991";
  13.888 +          
  13.889 +    pEp_identity* alex_id = new_identity("pep.test.alexander@darthmama.org",
  13.890 +                                        NULL,
  13.891 +                                        "AlexID",
  13.892 +                                        "Alexander Braithwaite");
  13.893 +
  13.894 +    pEp_identity* alex_id2 = new_identity("pep.test.alexander6@darthmama.org",
  13.895 +                                          NULL,
  13.896 +                                          "AlexID",
  13.897 +                                          "Alexander Braithwaite");
  13.898 +
  13.899 +    pEp_identity* alex_id3 = new_identity("pep.test.alexander6a@darthmama.org",
  13.900 +                                          NULL,
  13.901 +                                          "AlexID",
  13.902 +                                          "Alexander Braithwaite");
  13.903 +
  13.904 +
  13.905 +    PEP_STATUS status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0x0019697D_pub.asc");
  13.906 +    status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0x503B14D8_pub.asc");
  13.907 +    status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0xA216E95A_pub.asc");
  13.908 +    status = read_file_and_import_key(session, "test_keys/priv/pep.test.alexander6-0x0019697D_priv.asc");
  13.909 +    status = read_file_and_import_key(session, "test_keys/priv/pep.test.alexander6-0x503B14D8_priv.asc");
  13.910 +    status = read_file_and_import_key(session, "test_keys/priv/pep.test.alexander6-0xA216E95A_priv.asc");
  13.911 +
  13.912 +    alex_id->me = true;
  13.913 +    status = set_own_key(session, alex_id, pubkey1);
  13.914 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.915 +
  13.916 +    alex_id2->me = true;
  13.917 +    status = set_own_key(session, alex_id2, pubkey2);
  13.918 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.919 +
  13.920 +    alex_id3->me = true;
  13.921 +    status = set_own_key(session, alex_id3, pubkey3);
  13.922 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.923 +
  13.924 +    status = myself(session, alex_id);
  13.925 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.926 +    ASSERT_STREQ(pubkey1, alex_id->fpr);
  13.927 +
  13.928 +    status = myself(session, alex_id2);
  13.929 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.930 +    ASSERT_STREQ(pubkey2, alex_id2->fpr);
  13.931 +
  13.932 +    status = myself(session, alex_id3);
  13.933 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.934 +    ASSERT_STREQ(pubkey3, alex_id3->fpr);
  13.935 +
  13.936 +    message* dec_msg = NULL;
  13.937 +    stringlist_t* keylist = NULL;
  13.938 +    PEP_rating rating;
  13.939 +    PEP_decrypt_flags_t flags = 0;
  13.940 +
  13.941 +    string fname = "test_mails/check_reset_grouped_own_multiple_keys_multiple_idents_reset_one.eml";
  13.942 +    string mailstr = slurp(fname.c_str());
  13.943 +    message* new_msg = NULL;
  13.944 +    status = mime_decode_message(mailstr.c_str(), mailstr.size(), &new_msg);
  13.945 +    ASSERT_NE(new_msg, nullptr);
  13.946 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.947 +
  13.948 +    status = decrypt_message(session, new_msg, &dec_msg, &keylist, &rating, &flags);
  13.949 +    ASSERT_EQ(status, PEP_STATUS_OK);        
  13.950 +
  13.951 +    status = myself(session, alex_id);
  13.952 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.953 +    ASSERT_STREQ(pubkey1, alex_id->fpr);
  13.954 +
  13.955 +    status = myself(session, alex_id2);
  13.956 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.957 +    ASSERT_STREQ(replkey2, alex_id2->fpr);
  13.958 +
  13.959 +    status = myself(session, alex_id3);
  13.960 +    ASSERT_EQ(status, PEP_STATUS_OK);
  13.961 +    ASSERT_STREQ(pubkey3, alex_id3->fpr);
  13.962 +
  13.963 +    free_identity(alex_id);
  13.964 +    free_identity(alex_id2);
  13.965 +    free_identity(alex_id3);
  13.966 +}
  13.967 +
  13.968 +
  13.969  TEST_F(KeyResetMessageTest, check_reset_ident_other_pub_fpr) {
  13.970      send_setup(); // lazy
  13.971      pEp_identity* bob = new_identity("pep.test.bob@pep-project.org", NULL, bob_user_id.c_str(), NULL);
  13.972 @@ -627,6 +1355,7 @@
  13.973      // TODO: import key, verify PEP_ct_OpenPGP_unconfirmed
  13.974  }
  13.975  
  13.976 +
  13.977  // Corner case?
  13.978  TEST_F(KeyResetMessageTest, check_reset_ident_other_priv_fpr) {
  13.979      send_setup(); // lazy
  13.980 @@ -657,6 +1386,7 @@
  13.981      // TODO: import key, verify PEP_ct_OpenPGP_unconfirmed
  13.982  }
  13.983  
  13.984 +
  13.985  TEST_F(KeyResetMessageTest, check_reset_ident_other_pub_no_fpr) {
  13.986      send_setup(); // lazy
  13.987      pEp_identity* bob = new_identity("pep.test.bob@pep-project.org", NULL, bob_user_id.c_str(), NULL);
  13.988 @@ -685,6 +1415,7 @@
  13.989  //    const char* bob_fpr = "BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39";
  13.990  // TODO: multiplr keys above
  13.991  
  13.992 +
  13.993  TEST_F(KeyResetMessageTest, check_reset_ident_other_priv_no_fpr) {
  13.994      send_setup(); // lazy
  13.995      // Also import Bob's private key, because that dude is a fool.
  13.996 @@ -715,6 +1446,7 @@
  13.997      // TODO: import key, verify PEP_ct_OpenPGP_unconfirmed
  13.998  }
  13.999  
 13.1000 +
 13.1001  TEST_F(KeyResetMessageTest, check_reset_ident_own_pub_fpr) {
 13.1002      send_setup(); // lazy
 13.1003      pEp_identity* alice = new_identity("pep.test.alice@pep-project.org", NULL, alice_user_id.c_str(), NULL);
 13.1004 @@ -744,6 +1476,7 @@
 13.1005      ASSERT_EQ(status , PEP_CANNOT_FIND_IDENTITY);
 13.1006  }
 13.1007  
 13.1008 +
 13.1009  TEST_F(KeyResetMessageTest, check_reset_ident_own_priv_fpr) {
 13.1010      send_setup(); // lazy
 13.1011      pEp_identity* alice = new_identity("pep.test.alice@pep-project.org", NULL, alice_user_id.c_str(), NULL);
 13.1012 @@ -762,6 +1495,7 @@
 13.1013      ASSERT_STRNE(alice_fpr, alice_new_fpr);
 13.1014  }
 13.1015  
 13.1016 +
 13.1017  TEST_F(KeyResetMessageTest, check_reset_ident_own_priv_no_fpr) {
 13.1018      send_setup(); // lazy
 13.1019      pEp_identity* alice = new_identity("pep.test.alice@pep-project.org", NULL, alice_user_id.c_str(), NULL);
 13.1020 @@ -781,6 +1515,7 @@
 13.1021      ASSERT_STRNE(alice_fpr, alice_new_fpr);
 13.1022  }
 13.1023  
 13.1024 +
 13.1025  TEST_F(KeyResetMessageTest, check_reset_user_other_no_fpr) {
 13.1026        char* pubkey1 = strdup("74D79B4496E289BD8A71B70BA8E2C4530019697D");
 13.1027        char* pubkey2 = strdup("2E21325D202A44BFD9C607FCF095B202503B14D8");
 13.1028 @@ -803,37 +1538,44 @@
 13.1029      status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0xA216E95A_pub.asc");
 13.1030      status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0xBDA17020_pub.asc");
 13.1031  
 13.1032 -    alex_id->fpr = pubkey1;
 13.1033 +    free(alex_id->fpr);
 13.1034 +    alex_id->fpr = strdup(pubkey1);
 13.1035      status = trust_personal_key(session, alex_id);
 13.1036 -    alex_id->fpr = pubkey3;
 13.1037 +    free(alex_id->fpr);
 13.1038 +    alex_id->fpr = strdup(pubkey3);
 13.1039      status = trust_personal_key(session, alex_id);
 13.1040      status = set_as_pEp_user(session, alex_id);
 13.1041 -    alex_id->fpr = pubkey4;
 13.1042 +    free(alex_id->fpr);
 13.1043 +    alex_id->fpr = strdup(pubkey4);
 13.1044      status = trust_personal_key(session, alex_id);
 13.1045  
 13.1046      status = key_reset_user(session, alex_id->user_id, NULL);
 13.1047  
 13.1048      stringlist_t* keylist = NULL;
 13.1049  
 13.1050 -    alex_id->fpr = pubkey1;
 13.1051 +    free(alex_id->fpr);
 13.1052 +    alex_id->fpr = strdup(pubkey1);
 13.1053      status = get_trust(session, alex_id);
 13.1054      ASSERT_EQ(alex_id->comm_type , PEP_ct_unknown);
 13.1055      status = find_keys(session, pubkey1, &keylist);
 13.1056      ASSERT_TRUE(status == PEP_GET_KEY_FAILED || !keylist || EMPTYSTR(keylist->value));
 13.1057  
 13.1058 -    alex_id->fpr = pubkey2;
 13.1059 +    free(alex_id->fpr);
 13.1060 +    alex_id->fpr = strdup(pubkey2);
 13.1061      status = get_trust(session, alex_id);
 13.1062      ASSERT_EQ(alex_id->comm_type , PEP_ct_unknown);
 13.1063      status = find_keys(session, pubkey2, &keylist);
 13.1064      ASSERT_TRUE(status == PEP_STATUS_OK && keylist && !EMPTYSTR(keylist->value));
 13.1065  
 13.1066 -    alex_id->fpr = pubkey3;
 13.1067 +    free(alex_id->fpr);
 13.1068 +    alex_id->fpr = strdup(pubkey3);
 13.1069      status = get_trust(session, alex_id);
 13.1070      ASSERT_EQ(alex_id->comm_type , PEP_ct_unknown);
 13.1071      status = find_keys(session, pubkey3, &keylist);
 13.1072      ASSERT_TRUE(status == PEP_GET_KEY_FAILED || !keylist || EMPTYSTR(keylist->value));
 13.1073  
 13.1074 -    alex_id->fpr = pubkey4;
 13.1075 +    free(alex_id->fpr);
 13.1076 +    alex_id->fpr = strdup(pubkey4);
 13.1077      status = get_trust(session, alex_id);
 13.1078      ASSERT_EQ(alex_id->comm_type , PEP_ct_unknown);
 13.1079      status = find_keys(session, pubkey4, &keylist);
 13.1080 @@ -841,6 +1583,7 @@
 13.1081  
 13.1082  }
 13.1083  
 13.1084 +
 13.1085  TEST_F(KeyResetMessageTest, check_reset_user_other_fpr) {
 13.1086        char* pubkey1 = strdup("74D79B4496E289BD8A71B70BA8E2C4530019697D");
 13.1087        char* pubkey2 = strdup("2E21325D202A44BFD9C607FCF095B202503B14D8");
 13.1088 @@ -863,19 +1606,23 @@
 13.1089      status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0xA216E95A_pub.asc");
 13.1090      status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0xBDA17020_pub.asc");
 13.1091  
 13.1092 -    alex_id->fpr = pubkey1;
 13.1093 +    free(alex_id->fpr);
 13.1094 +    alex_id->fpr = strdup(pubkey1);
 13.1095      status = trust_personal_key(session, alex_id);
 13.1096 -    alex_id->fpr = pubkey3;
 13.1097 +    free(alex_id->fpr);
 13.1098 +    alex_id->fpr = strdup(pubkey3);
 13.1099      status = trust_personal_key(session, alex_id);
 13.1100      status = set_as_pEp_user(session, alex_id);
 13.1101 -    alex_id->fpr = pubkey4;
 13.1102 +    free(alex_id->fpr);
 13.1103 +    alex_id->fpr = strdup(pubkey4);
 13.1104      status = trust_personal_key(session, alex_id);
 13.1105  
 13.1106      status = key_reset_user(session, alex_id->user_id, pubkey3);
 13.1107  
 13.1108      stringlist_t* keylist = NULL;
 13.1109  
 13.1110 -    alex_id->fpr = pubkey1;
 13.1111 +    free(alex_id->fpr);
 13.1112 +    alex_id->fpr = strdup(pubkey1);
 13.1113      status = get_trust(session, alex_id);
 13.1114      ASSERT_EQ(alex_id->comm_type , PEP_ct_pEp);
 13.1115      status = find_keys(session, pubkey1, &keylist);
 13.1116 @@ -884,19 +1631,22 @@
 13.1117      free_stringlist(keylist);
 13.1118      keylist = NULL;
 13.1119  
 13.1120 -    alex_id->fpr = pubkey2;
 13.1121 +    free(alex_id->fpr);
 13.1122 +    alex_id->fpr = strdup(pubkey2);
 13.1123      status = get_trust(session, alex_id);
 13.1124      ASSERT_EQ(alex_id->comm_type , PEP_ct_unknown);
 13.1125      status = find_keys(session, pubkey2, &keylist);
 13.1126      ASSERT_TRUE(status == PEP_STATUS_OK && keylist && !EMPTYSTR(keylist->value));
 13.1127  
 13.1128 -    alex_id->fpr = pubkey3;
 13.1129 +    free(alex_id->fpr);
 13.1130 +    alex_id->fpr = strdup(pubkey3);
 13.1131      status = get_trust(session, alex_id);
 13.1132      ASSERT_EQ(alex_id->comm_type , PEP_ct_unknown);
 13.1133      status = find_keys(session, pubkey3, &keylist);
 13.1134      ASSERT_TRUE(status == PEP_GET_KEY_FAILED || !keylist || EMPTYSTR(keylist->value));
 13.1135  
 13.1136 -    alex_id->fpr = pubkey4;
 13.1137 +    free(alex_id->fpr);
 13.1138 +    alex_id->fpr = strdup(pubkey4);
 13.1139      status = get_trust(session, alex_id);
 13.1140      ASSERT_EQ(alex_id->comm_type , PEP_ct_pEp);
 13.1141      status = find_keys(session, pubkey4, &keylist);
 13.1142 @@ -912,6 +1662,7 @@
 13.1143      free_identity(alex_id);
 13.1144  }
 13.1145  
 13.1146 +
 13.1147  TEST_F(KeyResetMessageTest, check_reset_user_own_fpr) {
 13.1148        char* pubkey1 = strdup("74D79B4496E289BD8A71B70BA8E2C4530019697D");
 13.1149        char* pubkey2 = strdup("2E21325D202A44BFD9C607FCF095B202503B14D8");
 13.1150 @@ -940,22 +1691,27 @@
 13.1151  
 13.1152      alex_id->me = true;
 13.1153      status = set_own_key(session, alex_id, pubkey1);
 13.1154 +    status = set_own_key(session, alex_id, pubkey4);
 13.1155      status = set_own_key(session, alex_id, pubkey3);
 13.1156 -    status = set_own_key(session, alex_id, pubkey4);
 13.1157 +
 13.1158 +    status = myself(session, alex_id);
 13.1159  
 13.1160      status = key_reset_user(session, alex_id->user_id, pubkey3);
 13.1161  
 13.1162 -    alex_id->fpr = pubkey1;
 13.1163 +    free(alex_id->fpr);
 13.1164 +    alex_id->fpr = strdup(pubkey1);
 13.1165      status = get_trust(session, alex_id);
 13.1166      ASSERT_EQ(alex_id->comm_type , PEP_ct_pEp);
 13.1167  
 13.1168 -    alex_id->fpr = pubkey2;
 13.1169 +    free(alex_id->fpr);
 13.1170 +    alex_id->fpr = strdup(pubkey2);
 13.1171      status = get_trust(session, alex_id);
 13.1172      ASSERT_EQ(alex_id->comm_type , PEP_ct_unknown);
 13.1173  
 13.1174      stringlist_t* keylist = NULL;
 13.1175  
 13.1176 -    alex_id->fpr = pubkey3;
 13.1177 +    free(alex_id->fpr);
 13.1178 +    alex_id->fpr = strdup(pubkey3);
 13.1179      status = get_trust(session, alex_id);
 13.1180      ASSERT_EQ(alex_id->comm_type , PEP_ct_mistrusted);
 13.1181      status = find_keys(session, pubkey4, &keylist);
 13.1182 @@ -964,7 +1720,8 @@
 13.1183      free_stringlist(keylist);
 13.1184      keylist = NULL;
 13.1185  
 13.1186 -    alex_id->fpr = pubkey4;
 13.1187 +    free(alex_id->fpr);
 13.1188 +    alex_id->fpr = strdup(pubkey4);
 13.1189      status = get_trust(session, alex_id);
 13.1190      ASSERT_EQ(alex_id->comm_type , PEP_ct_pEp);
 13.1191  
 13.1192 @@ -978,6 +1735,7 @@
 13.1193      free_identity(alex_id);
 13.1194  }
 13.1195  
 13.1196 +
 13.1197  TEST_F(KeyResetMessageTest, check_reset_user_no_fpr) {
 13.1198        char* pubkey1 = strdup("74D79B4496E289BD8A71B70BA8E2C4530019697D");
 13.1199        char* pubkey2 = strdup("2E21325D202A44BFD9C607FCF095B202503B14D8");
 13.1200 @@ -1020,23 +1778,24 @@
 13.1201      free_identity(alex_id);
 13.1202  }
 13.1203  
 13.1204 +
 13.1205  TEST_F(KeyResetMessageTest, check_reset_all_own_keys) {
 13.1206 -      char* pubkey1 = strdup("74D79B4496E289BD8A71B70BA8E2C4530019697D");
 13.1207 -      char* pubkey2 = strdup("2E21325D202A44BFD9C607FCF095B202503B14D8");
 13.1208 -      char* pubkey3 = strdup("3C1E713D8519D7F907E3142D179EAA24A216E95A");
 13.1209 -      char* pubkey4 = strdup("B4CE2F6947B6947C500F0687AEFDE530BDA17020");
 13.1210 +    char* pubkey1 = strdup("74D79B4496E289BD8A71B70BA8E2C4530019697D");
 13.1211 +    char* pubkey2 = strdup("2E21325D202A44BFD9C607FCF095B202503B14D8");
 13.1212 +    char* pubkey3 = strdup("3C1E713D8519D7F907E3142D179EAA24A216E95A");
 13.1213 +    char* pubkey4 = strdup("B4CE2F6947B6947C500F0687AEFDE530BDA17020");
 13.1214  
 13.1215 -      pEp_identity* alex_id = new_identity("pep.test.alexander@darthmama.org",
 13.1216 -                                            NULL,
 13.1217 -                                            "AlexID",
 13.1218 -                                            "Alexander Braithwaite");
 13.1219 +    pEp_identity* alex_id = new_identity("pep.test.alexander@darthmama.org",
 13.1220 +                                         NULL,
 13.1221 +                                         "AlexID",
 13.1222 +                                         "Alexander Braithwaite");
 13.1223  
 13.1224 -/*
 13.1225 -test_keys/pub/pep.test.alexander6-0x0019697D_pub.asc
 13.1226 -test_keys/pub/pep.test.alexander6-0x503B14D8_pub.asc
 13.1227 -test_keys/pub/pep.test.alexander6-0xA216E95A_pub.asc
 13.1228 -test_keys/pub/pep.test.alexander6-0xBDA17020_pub.asc
 13.1229 -*/
 13.1230 +    pEp_identity* alex_id2 = new_identity("pep.test.alexander6@darthmama.org",
 13.1231 +                                          NULL,
 13.1232 +                                          "AlexID",
 13.1233 +                                          "Alexander Braithwaite");
 13.1234 +
 13.1235 +
 13.1236      PEP_STATUS status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0x0019697D_pub.asc");
 13.1237      status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0x503B14D8_pub.asc");
 13.1238      status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0xA216E95A_pub.asc");
 13.1239 @@ -1047,15 +1806,21 @@
 13.1240      status = read_file_and_import_key(session, "test_keys/priv/pep.test.alexander6-0xBDA17020_priv.asc");
 13.1241  
 13.1242      alex_id->me = true;
 13.1243 +    status = set_own_key(session, alex_id, pubkey3);
 13.1244 +    status = myself(session, alex_id);
 13.1245      status = set_own_key(session, alex_id, pubkey1);
 13.1246 -    status = set_own_key(session, alex_id, pubkey3);
 13.1247 -    status = set_own_key(session, alex_id, pubkey4);
 13.1248 +    status = myself(session, alex_id);
 13.1249 +
 13.1250 +    alex_id2->me = true;
 13.1251 +    status = set_own_key(session, alex_id2, pubkey4);
 13.1252 +    status = myself(session, alex_id2);
 13.1253  
 13.1254      status = key_reset_all_own_keys(session);
 13.1255  
 13.1256      stringlist_t* keylist = NULL;
 13.1257  
 13.1258 -    alex_id->fpr = pubkey1;
 13.1259 +    free(alex_id->fpr);
 13.1260 +    alex_id->fpr = strdup(pubkey1);
 13.1261      status = get_trust(session, alex_id);
 13.1262      ASSERT_EQ(alex_id->comm_type , PEP_ct_mistrusted);
 13.1263      status = find_keys(session, pubkey1, &keylist);
 13.1264 @@ -1064,7 +1829,8 @@
 13.1265      free_stringlist(keylist);
 13.1266      keylist = NULL;
 13.1267  
 13.1268 -    alex_id->fpr = pubkey2;
 13.1269 +    free(alex_id->fpr);
 13.1270 +    alex_id->fpr = strdup(pubkey2);
 13.1271      status = get_trust(session, alex_id);
 13.1272      ASSERT_EQ(alex_id->comm_type , PEP_ct_unknown);
 13.1273      status = find_keys(session, pubkey2, &keylist);
 13.1274 @@ -1073,18 +1839,20 @@
 13.1275      free_stringlist(keylist);
 13.1276      keylist = NULL;
 13.1277  
 13.1278 -    alex_id->fpr = pubkey3;
 13.1279 +    free(alex_id->fpr);
 13.1280 +    alex_id->fpr = strdup(pubkey3);
 13.1281      status = get_trust(session, alex_id);
 13.1282 -    ASSERT_EQ(alex_id->comm_type , PEP_ct_mistrusted);
 13.1283 +    ASSERT_EQ(alex_id->comm_type , PEP_ct_pEp);
 13.1284      status = find_keys(session, pubkey3, &keylist);
 13.1285      ASSERT_TRUE(status == PEP_STATUS_OK && keylist && !EMPTYSTR(keylist->value));
 13.1286  
 13.1287      free_stringlist(keylist);
 13.1288      keylist = NULL;
 13.1289  
 13.1290 -    alex_id->fpr = pubkey4;
 13.1291 -    status = get_trust(session, alex_id);
 13.1292 -    ASSERT_EQ(alex_id->comm_type , PEP_ct_mistrusted);
 13.1293 +    free(alex_id2->fpr);
 13.1294 +    alex_id2->fpr = strdup(pubkey4);
 13.1295 +    status = get_trust(session, alex_id2);
 13.1296 +    ASSERT_EQ(alex_id2->comm_type , PEP_ct_mistrusted);
 13.1297      status = find_keys(session, pubkey4, &keylist);
 13.1298      ASSERT_TRUE(status == PEP_STATUS_OK && keylist && !EMPTYSTR(keylist->value));
 13.1299  
 13.1300 @@ -1103,6 +1871,14 @@
 13.1301      ASSERT_STRNE(alex_id->fpr, pubkey4);
 13.1302      ASSERT_EQ(alex_id->comm_type , PEP_ct_pEp);
 13.1303  
 13.1304 +    alex_id2->fpr = NULL;
 13.1305 +    status = myself(session, alex_id2);
 13.1306 +    ASSERT_EQ(status , PEP_STATUS_OK);
 13.1307 +    ASSERT_STRNE(alex_id2->fpr, pubkey1);
 13.1308 +    ASSERT_STRNE(alex_id2->fpr, pubkey2);
 13.1309 +    ASSERT_STRNE(alex_id2->fpr, pubkey3);
 13.1310 +    ASSERT_STRNE(alex_id2->fpr, pubkey4);
 13.1311 +
 13.1312      free(pubkey1);
 13.1313      free(pubkey2);
 13.1314      free(pubkey3);
 13.1315 @@ -1110,6 +1886,7 @@
 13.1316      free_identity(alex_id);
 13.1317  }
 13.1318  
 13.1319 +
 13.1320  TEST_F(KeyResetMessageTest, check_reset_all_own_no_own) {
 13.1321        char* pubkey1 = strdup("74D79B4496E289BD8A71B70BA8E2C4530019697D");
 13.1322        char* pubkey2 = strdup("2E21325D202A44BFD9C607FCF095B202503B14D8");
 13.1323 @@ -1132,11 +1909,14 @@
 13.1324      status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0xA216E95A_pub.asc");
 13.1325      status = read_file_and_import_key(session, "test_keys/pub/pep.test.alexander6-0xBDA17020_pub.asc");
 13.1326  
 13.1327 -    alex_id->fpr = pubkey1;
 13.1328 +    free(alex_id->fpr);
 13.1329 +    alex_id->fpr = strdup(pubkey1);
 13.1330      status = trust_personal_key(session, alex_id);
 13.1331 -    alex_id->fpr = pubkey3;
 13.1332 +    free(alex_id->fpr);
 13.1333 +    alex_id->fpr = strdup(pubkey3);
 13.1334      status = trust_personal_key(session, alex_id);
 13.1335 -    alex_id->fpr = pubkey4;
 13.1336 +    free(alex_id->fpr);
 13.1337 +    alex_id->fpr = strdup(pubkey4);
 13.1338      status = trust_personal_key(session, alex_id);
 13.1339  
 13.1340      status = key_reset_all_own_keys(session);
 13.1341 @@ -1144,7 +1924,8 @@
 13.1342  
 13.1343      stringlist_t* keylist = NULL;
 13.1344  
 13.1345 -    alex_id->fpr = pubkey1;
 13.1346 +    free(alex_id->fpr);
 13.1347 +    alex_id->fpr = strdup(pubkey1);
 13.1348      status = get_trust(session, alex_id);
 13.1349      ASSERT_EQ(alex_id->comm_type , PEP_ct_OpenPGP);
 13.1350      status = find_keys(session, pubkey1, &keylist);
 13.1351 @@ -1153,19 +1934,22 @@
 13.1352      free_stringlist(keylist);
 13.1353          keylist = NULL;
 13.1354  
 13.1355 -    alex_id->fpr = pubkey2;
 13.1356 +    free(alex_id->fpr);
 13.1357 +    alex_id->fpr = strdup(pubkey2);
 13.1358      status = get_trust(session, alex_id);
 13.1359      ASSERT_EQ(alex_id->comm_type , PEP_ct_unknown);
 13.1360      status = find_keys(session, pubkey2, &keylist);
 13.1361      ASSERT_TRUE(status == PEP_STATUS_OK && keylist && !EMPTYSTR(keylist->value));
 13.1362  
 13.1363 -    alex_id->fpr = pubkey3;
 13.1364 +    free(alex_id->fpr);
 13.1365 +    alex_id->fpr = strdup(pubkey3);
 13.1366      status = get_trust(session, alex_id);
 13.1367      ASSERT_EQ(alex_id->comm_type , PEP_ct_OpenPGP);
 13.1368      status = find_keys(session, pubkey3, &keylist);
 13.1369      ASSERT_TRUE(status == PEP_STATUS_OK && keylist && !EMPTYSTR(keylist->value));
 13.1370  
 13.1371 -    alex_id->fpr = pubkey4;
 13.1372 +    free(alex_id->fpr);
 13.1373 +    alex_id->fpr = strdup(pubkey4);
 13.1374      status = get_trust(session, alex_id);
 13.1375      ASSERT_EQ(alex_id->comm_type , PEP_ct_OpenPGP);
 13.1376      status = find_keys(session, pubkey4, &keylist);
 13.1377 @@ -1183,65 +1967,66 @@
 13.1378  }
 13.1379  
 13.1380  // TEST_F(KeyResetMessageTest, check_reset_mistrust_next_msg_have_mailed) {
 13.1381 -// 
 13.1382 +//
 13.1383  // }
 13.1384  
 13.1385  TEST_F(KeyResetMessageTest, not_a_test) {
 13.1386      pEp_identity* bob = NULL;
 13.1387      PEP_STATUS status = set_up_preset(session, BOB,
 13.1388                                        true, true, true, true, true, &bob);
 13.1389 -                                                                
 13.1390 -    const char* carol_fpr = "8DD4F5827B45839E9ACCA94687BDDFFB42A85A42";                                                                
 13.1391 -    slurp_and_import_key(session, "test_keys/pub/pep-test-bob-0xC9C2EE39_pub.asc");    
 13.1392 +
 13.1393 +    const char* carol_fpr = "8DD4F5827B45839E9ACCA94687BDDFFB42A85A42";
 13.1394 +    slurp_and_import_key(session, "test_keys/pub/pep-test-bob-0xC9C2EE39_pub.asc");
 13.1395      slurp_and_import_key(session, "test_keys/pub/pep-test-carol-0x42A85A42_pub.asc");
 13.1396 -                                      
 13.1397 +
 13.1398      pEp_identity* carol = new_identity("pep-test-carol@pep-project.org", carol_fpr, carol_user_id.c_str(), "Christmas Carol");
 13.1399      status = update_identity(session, carol);
 13.1400 -    
 13.1401 +
 13.1402      message* bob_msg = new_message(PEP_dir_outgoing);
 13.1403      bob_msg->from = identity_dup(bob);
 13.1404      bob_msg->to = new_identity_list(carol);
 13.1405      bob_msg->shortmsg = strdup("Engine bugs suck\n");
 13.1406      bob_msg->longmsg = strdup("Everything is the engine's fault.\n");
 13.1407 -    
 13.1408 +
 13.1409      char* enc_msg_str = NULL;
 13.1410      message* enc_msg = NULL;
 13.1411 -    
 13.1412 +
 13.1413      status = encrypt_message(session, bob_msg, NULL, &enc_msg, PEP_enc_PGP_MIME, 0);
 13.1414      ASSERT_EQ(status, PEP_STATUS_OK);
 13.1415      status = mime_encode_message(enc_msg, false, &enc_msg_str);
 13.1416 -    
 13.1417 +
 13.1418      ofstream myfile;
 13.1419      myfile.open("test_mails/ENGINE-654_bob_mail.eml");
 13.1420      myfile << enc_msg_str;
 13.1421 -    myfile.close();      
 13.1422 +    myfile.close();
 13.1423  }
 13.1424  
 13.1425 +
 13.1426  TEST_F(KeyResetMessageTest, check_no_reset_message_to_self) {
 13.1427      pEp_identity* bob = NULL;
 13.1428      PEP_STATUS status = set_up_preset(session, BOB,
 13.1429                                        true, true, true, true, true, &bob);
 13.1430 -                                                                
 13.1431 -    slurp_and_import_key(session, "test_keys/pub/pep-test-bob-0xC9C2EE39_pub.asc");    
 13.1432 -                                          
 13.1433 +
 13.1434 +    slurp_and_import_key(session, "test_keys/pub/pep-test-bob-0xC9C2EE39_pub.asc");
 13.1435 +
 13.1436      message* bob_msg = new_message(PEP_dir_outgoing);
 13.1437      bob_msg->from = identity_dup(bob);
 13.1438      bob_msg->to = new_identity_list(identity_dup(bob));
 13.1439      bob_msg->shortmsg = strdup("Engine bugs suck\n");
 13.1440      bob_msg->longmsg = strdup("Everything is the engine's fault.\n");
 13.1441 -    
 13.1442 +
 13.1443      message* enc_msg = NULL;
 13.1444 -    
 13.1445 +
 13.1446      status = encrypt_message(session, bob_msg, NULL, &enc_msg, PEP_enc_PGP_MIME, 0);
 13.1447      ASSERT_EQ(status, PEP_STATUS_OK);
 13.1448  
 13.1449      key_reset_all_own_keys(session);
 13.1450 -    
 13.1451 +
 13.1452      message* dec_msg = NULL;
 13.1453      stringlist_t* keylist = NULL;
 13.1454      PEP_rating rating;
 13.1455      PEP_decrypt_flags_t flags = 0;
 13.1456 -    
 13.1457 +
 13.1458      status = decrypt_message(session, enc_msg, &dec_msg, &keylist, &rating, &flags);
 13.1459      ASSERT_EQ(m_queue.size(), 0);
 13.1460      ASSERT_EQ(status, PEP_VERIFY_SIGNER_KEY_REVOKED);
 13.1461 @@ -1252,40 +2037,40 @@
 13.1462      pEp_identity* carol = NULL;
 13.1463      PEP_STATUS status = set_up_preset(session, CAROL,
 13.1464                                        true, true, true, true, true, &carol);
 13.1465 -                                      
 13.1466 +
 13.1467      status = myself(session, carol);
 13.1468 -    ASSERT_STREQ(carol->fpr, "8DD4F5827B45839E9ACCA94687BDDFFB42A85A42");                                  
 13.1469 +    ASSERT_STREQ(carol->fpr, "8DD4F5827B45839E9ACCA94687BDDFFB42A85A42");
 13.1470  
 13.1471 -    slurp_and_import_key(session, "test_keys/pub/pep-test-bob-0xC9C2EE39_pub.asc");                                      
 13.1472 +    slurp_and_import_key(session, "test_keys/pub/pep-test-bob-0xC9C2EE39_pub.asc");
 13.1473      pEp_identity* bob = new_identity("pep.test.bob@pep-project.org", bob_fpr, NULL, "Bob's Burgers");
 13.1474      status = update_identity(session, bob);
 13.1475 -    
 13.1476 +
 13.1477      status = key_mistrusted(session, bob);
 13.1478      ASSERT_EQ(status, PEP_STATUS_OK);
 13.1479  //    ASSERT_EQ(bob->fpr, nullptr);
 13.1480 -    
 13.1481 +
 13.1482      string mail_from_bob = slurp("test_mails/ENGINE-654_bob_mail.eml");
 13.1483 -    // 
 13.1484 +    //
 13.1485      // // Ok, so let's see if the thing is mistrusted
 13.1486      message* bob_enc_msg = NULL;
 13.1487 -    // 
 13.1488 +    //
 13.1489      // mime_decode_message(mail_from_bob.c_str(), mail_from_bob.size(), &bob_enc_msg);
 13.1490 -    // 
 13.1491 +    //
 13.1492      message* bob_dec_msg = NULL;
 13.1493      stringlist_t* keylist = NULL;
 13.1494      PEP_rating rating;
 13.1495      PEP_decrypt_flags_t flags = 0;
 13.1496 -    // 
 13.1497 +    //
 13.1498      // status = decrypt_message(session, bob_enc_msg, &bob_dec_msg, &keylist, &rating, &flags);
 13.1499      // ASSERT_EQ(status, PEP_STATUS_OK);
 13.1500      // ASSERT_EQ(rating, PEP_rating_mistrust);
 13.1501 -    // 
 13.1502 +    //
 13.1503      // free_message(bob_enc_msg);
 13.1504      // free_message(bob_dec_msg);
 13.1505 -    
 13.1506 +
 13.1507      free(bob->fpr);
 13.1508      bob->fpr = NULL;
 13.1509 -    
 13.1510 +
 13.1511      status = key_reset_identity(session, bob, NULL);
 13.1512      ASSERT_EQ(status, PEP_STATUS_OK);
 13.1513  
 13.1514 @@ -1297,26 +2082,26 @@
 13.1515              //    ASSERT_EQ(bob->fpr, nullptr);
 13.1516  
 13.1517      mime_decode_message(mail_from_bob.c_str(), mail_from_bob.size(), &bob_enc_msg);
 13.1518 -    
 13.1519 +
 13.1520      bob_dec_msg = NULL;
 13.1521      free_stringlist(keylist);
 13.1522      keylist = NULL;
 13.1523      flags = 0;
 13.1524 -    
 13.1525 +
 13.1526      status = decrypt_message(session, bob_enc_msg, &bob_dec_msg, &keylist, &rating, &flags);
 13.1527      ASSERT_EQ(status, PEP_STATUS_OK);
 13.1528      ASSERT_EQ(rating, PEP_rating_reliable);
 13.1529 -    
 13.1530 +
 13.1531  }
 13.1532 -
 13.1533 +/*
 13.1534  TEST_F(KeyResetMessageTest, check_reset_own_with_revocations) {
 13.1535 -    pEp_identity* id1 = new_identity("krista-not-real@darthmama.org", NULL, PEP_OWN_USERID, "Krista at Home");    
 13.1536 +    pEp_identity* id1 = new_identity("krista-not-real@darthmama.org", NULL, PEP_OWN_USERID, "Krista at Home");
 13.1537      PEP_STATUS status = myself(session, id1);
 13.1538      pEp_identity* id2 = NULL;
 13.1539      status = set_up_preset(session, ALICE, true, true, false, false, false, &id2);
 13.1540      pEp_identity* id3 = new_identity("krista-not-real@angryshark.eu", NULL, PEP_OWN_USERID, "Krista at Shark");
 13.1541      status = myself(session, id3);
 13.1542 -    pEp_identity* id4 = NULL;    
 13.1543 +    pEp_identity* id4 = NULL;
 13.1544      status = set_up_preset(session, BOB, true, false, false, false, false, &id4);
 13.1545      pEp_identity* id5 = new_identity("krista-not-real@pep.foundation", NULL, PEP_OWN_USERID, "Krista at Work");
 13.1546      status = myself(session, id5);
 13.1547 @@ -1324,24 +2109,24 @@
 13.1548      status = myself(session, id6);
 13.1549      pEp_identity* id7 = NULL;
 13.1550      status = set_up_preset(session, CAROL, true, false, true, false, false, &id7);
 13.1551 -    pEp_identity* id8 = NULL;    
 13.1552 +    pEp_identity* id8 = NULL;
 13.1553      status = set_up_preset(session, DAVE, true, true, true, false, false, &id8);
 13.1554  
 13.1555      identity_list* own_identities = NULL;
 13.1556      stringlist_t* revocations = NULL;
 13.1557      stringlist_t* keys = NULL;
 13.1558 -    
 13.1559 +
 13.1560      stringlist_t* first_keylist = new_stringlist(NULL);
 13.1561      stringlist_add(first_keylist, strdup(id1->fpr));
 13.1562      stringlist_add(first_keylist, strdup(id3->fpr));
 13.1563      stringlist_add(first_keylist, strdup(id5->fpr));
 13.1564      stringlist_add(first_keylist, strdup(id6->fpr));
 13.1565 -    
 13.1566 -    status = key_reset_own_and_deliver_revocations(session, 
 13.1567 -                                                   &own_identities, 
 13.1568 -                                                   &revocations, 
 13.1569 +
 13.1570 +    status = key_reset_own_and_deliver_revocations(session,
 13.1571 +                                                   &own_identities,
 13.1572 +                                                   &revocations,
 13.1573                                                     &keys);
 13.1574 -                                                                                                      
 13.1575 +
 13.1576      ASSERT_EQ(status, PEP_STATUS_OK);
 13.1577      ASSERT_NE(own_identities, nullptr);
 13.1578      ASSERT_NE(revocations, nullptr);
 13.1579 @@ -1350,27 +2135,27 @@
 13.1580      int i = 0;
 13.1581      identity_list* curr_ident = own_identities;
 13.1582      stringlist_t* second_keylist = new_stringlist(NULL);
 13.1583 -    
 13.1584 +
 13.1585      for (i = 0; i < 4 && curr_ident; i++, curr_ident = curr_ident->next) {
 13.1586          ASSERT_NE(curr_ident->ident, nullptr);
 13.1587 -        ASSERT_NE(curr_ident->ident->fpr, nullptr);        
 13.1588 +        ASSERT_NE(curr_ident->ident->fpr, nullptr);
 13.1589          stringlist_t* found = stringlist_search(first_keylist, curr_ident->ident->fpr);
 13.1590          ASSERT_EQ(found, nullptr);
 13.1591          PEP_comm_type ct = PEP_ct_unknown;
 13.1592          status = get_key_rating(session, curr_ident->ident->fpr, &ct);
 13.1593 -        ASSERT_EQ(ct, PEP_ct_OpenPGP_unconfirmed);    
 13.1594 -        stringlist_add(second_keylist, strdup(curr_ident->ident->fpr));            
 13.1595 +        ASSERT_EQ(ct, PEP_ct_OpenPGP_unconfirmed);
 13.1596 +        stringlist_add(second_keylist, strdup(curr_ident->ident->fpr));
 13.1597      }
 13.1598      ASSERT_EQ(i, 4);
 13.1599      ASSERT_EQ(curr_ident, nullptr);
 13.1600 -    
 13.1601 +
 13.1602      stringlist_t* curr_key = first_keylist;
 13.1603      for (i = 0; i < 4; i++, curr_key = curr_key->next) {
 13.1604          PEP_comm_type ct = PEP_ct_unknown;
 13.1605          status = get_key_rating(session, curr_key->value, &ct);
 13.1606          ASSERT_EQ(ct, PEP_ct_key_revoked);
 13.1607      }
 13.1608 -    
 13.1609 +
 13.1610      // Ok, now we're going to delete all the keys, and then try to reimport.
 13.1611      curr_key = first_keylist;
 13.1612      for (i = 0; i < 4; curr_key = curr_key->next, i++) {
 13.1613 @@ -1379,7 +2164,7 @@
 13.1614      }
 13.1615      ASSERT_EQ(i, 4);
 13.1616      ASSERT_EQ(curr_key, nullptr);
 13.1617 -    
 13.1618 +
 13.1619      curr_key = second_keylist;
 13.1620      for (i = 0; i < 4; curr_key = curr_key->next, i++) {
 13.1621          status = delete_keypair(session, curr_key->value);
 13.1622 @@ -1387,13 +2172,13 @@
 13.1623      }
 13.1624      ASSERT_EQ(i, 4);
 13.1625      ASSERT_EQ(curr_key, nullptr);
 13.1626 -    
 13.1627 +
 13.1628      // Make sure we can't find them
 13.1629      curr_key = first_keylist;
 13.1630      for (i = 0; i < 4; curr_key = curr_key->next, i++) {
 13.1631          PEP_comm_type ct = PEP_ct_unknown;
 13.1632          status = get_key_rating(session, curr_key->value, &ct);
 13.1633 -        ASSERT_EQ(status, PEP_KEY_NOT_FOUND);    
 13.1634 +        ASSERT_EQ(status, PEP_KEY_NOT_FOUND);
 13.1635      }
 13.1636      curr_key = second_keylist;
 13.1637      for (i = 0; i < 4; curr_key = curr_key->next, i++) {
 13.1638 @@ -1401,8 +2186,8 @@
 13.1639          status = get_key_rating(session, curr_key->value, &ct);
 13.1640          ASSERT_EQ(status, PEP_KEY_NOT_FOUND);
 13.1641      }
 13.1642 -    
 13.1643 -    
 13.1644 +
 13.1645 +
 13.1646      // Reimport
 13.1647      curr_key = revocations;
 13.1648      for (i = 0; i < 4; curr_key = curr_key->next, i++) {
 13.1649 @@ -1411,7 +2196,7 @@
 13.1650      }
 13.1651      ASSERT_EQ(i, 4);
 13.1652      ASSERT_EQ(curr_key, nullptr);
 13.1653 -    
 13.1654 +
 13.1655      curr_key = keys;
 13.1656      for (i = 0; i < 4; curr_key = curr_key->next, i++) {
 13.1657          status = import_key(session, curr_key->value, strlen(curr_key->value), NULL);
 13.1658 @@ -1419,7 +2204,7 @@
 13.1659      }
 13.1660      ASSERT_EQ(i, 4);
 13.1661      ASSERT_EQ(curr_key, nullptr);
 13.1662 -    
 13.1663 +
 13.1664      // Check the revoked keys to be sure they are revoked
 13.1665      curr_key = first_keylist;
 13.1666      for (i = 0; i < 4; curr_key = curr_key->next, i++) {
 13.1667 @@ -1437,6 +2222,8 @@
 13.1668          ASSERT_EQ(status, PEP_STATUS_OK);
 13.1669      }
 13.1670  }
 13.1671 +*/
 13.1672 +
 13.1673  
 13.1674  TEST_F(KeyResetMessageTest, codec_test) {
 13.1675      // create input values
 13.1676 @@ -1485,7 +2272,7 @@
 13.1677      ASSERT_EQ(il->next->next, nullptr);
 13.1678  
 13.1679      // encode
 13.1680 - 
 13.1681 +
 13.1682      char *cmds = nullptr;
 13.1683      size_t size = 0;
 13.1684      PEP_STATUS status = key_reset_commands_to_PER(il, &cmds, &size);
 13.1685 @@ -1494,7 +2281,7 @@
 13.1686      ASSERT_NE(size, 0);
 13.1687  
 13.1688      // decode
 13.1689 -    
 13.1690 +
 13.1691      keyreset_command_list *ol = nullptr;
 13.1692      status = PER_to_key_reset_commands(cmds, size, &ol);
 13.1693      ASSERT_EQ(status, PEP_STATUS_OK);
    14.1 --- a/test/src/KeyringImportTest.cc	Wed Jan 15 17:13:00 2020 +0100
    14.2 +++ b/test/src/KeyringImportTest.cc	Thu Jan 16 12:40:10 2020 +0100
    14.3 @@ -130,7 +130,7 @@
    14.4          pEp_identity *id = new_identity(address, NULL, NULL, NULL);
    14.5          PEP_STATUS status = update_identity(session, id);
    14.6          ASSERT_EQ(status , PEP_STATUS_OK);
    14.7 -        output_stream << "Got: " << (id->fpr ?: "NULL") << " -> " << (id->address ?: "NULL") << endl;
    14.8 +        output_stream << "Got: " << (id->fpr ? id->fpr : "NULL") << " -> " << (id->address ? id->address : "NULL") << endl;
    14.9  
   14.10          // We should always get the same fingerprint.
   14.11          ASSERT_NE(id->fpr, nullptr);
   14.12 @@ -197,7 +197,7 @@
   14.13          pEp_identity *id = new_identity(address, NULL, NULL, NULL);
   14.14          PEP_STATUS status = update_identity(session, id);
   14.15          ASSERT_EQ(status , PEP_STATUS_OK);
   14.16 -        output_stream << "Got: " << (id->fpr ?: "NULL") << " (expected: " << fpr << ") -> " << (id->address ?: "NULL") << endl;
   14.17 +        output_stream << "Got: " << (id->fpr ? id->fpr : "NULL") << " (expected: " << fpr << ") -> " << (id->address ? id->address : "NULL") << endl;
   14.18  
   14.19          // We should always get the same fingerprint.
   14.20          ASSERT_NE(id->fpr, nullptr);
    15.1 --- a/test/src/SyncTest.cc	Wed Jan 15 17:13:00 2020 +0100
    15.2 +++ b/test/src/SyncTest.cc	Thu Jan 16 12:40:10 2020 +0100
    15.3 @@ -44,8 +44,9 @@
    15.4  void Sync_Adapter::processing()
    15.5  {
    15.6      output_stream << "waiting for processing\n";
    15.7 +    const struct timespec arr[] = {{0, 100000000L}};
    15.8      while (!q.empty()) {
    15.9 -        nanosleep((const struct timespec[]){{0, 100000000L}}, NULL);
   15.10 +        nanosleep(arr, NULL);
   15.11      }
   15.12  }
   15.13  
   15.14 @@ -90,7 +91,8 @@
   15.15              }
   15.16              i = 0;
   15.17          }
   15.18 -        nanosleep((const struct timespec[]){{0, 100000000L}}, NULL);
   15.19 +        const struct timespec arr[] = {{0, 100000000L}};        
   15.20 +        nanosleep(arr, NULL);
   15.21      }
   15.22  
   15.23      if (timeout)
    16.1 --- a/test/src/test_util.cc	Wed Jan 15 17:13:00 2020 +0100
    16.2 +++ b/test/src/test_util.cc	Thu Jan 16 12:40:10 2020 +0100
    16.3 @@ -25,6 +25,8 @@
    16.4  
    16.5  std::string _main_test_home_dir;
    16.6  
    16.7 +#define BUF_MAX_PATHLEN 4097
    16.8 +
    16.9  bool is_pEpmsg(const message *msg)
   16.10  {
   16.11      for (stringpair_list_t *i = msg->opt_fields; i && i->value ; i=i->next) {
   16.12 @@ -53,7 +55,6 @@
   16.13  }
   16.14  
   16.15  std::string get_main_test_home_dir() {
   16.16 -    size_t BUF_MAX_PATHLEN = 4097;
   16.17      char buf[BUF_MAX_PATHLEN];// Linux max path size...
   16.18  
   16.19      if (_main_test_home_dir.empty()) {
    17.1 --- a/test/test_files/398_reset_from_alice_to_bob.eml	Wed Jan 15 17:13:00 2020 +0100
    17.2 +++ b/test/test_files/398_reset_from_alice_to_bob.eml	Thu Jan 16 12:40:10 2020 +0100
    17.3 @@ -1,115 +1,178 @@
    17.4  From: Alice in Wonderland <pep.test.alice@pep-project.org>
    17.5  To: Bob's Burgers <pep.test.bob@pep-project.org>
    17.6  Subject: =?utf-8?Q?p=E2=89=A1p?=
    17.7 -X-pEp-Version: 2.0
    17.8 +In-Reply-To: <pEp-auto-consume@pEp.foundation>
    17.9 +pEp-auto-consume: yes
   17.10 +X-pEp-Version: 2.1
   17.11  MIME-Version: 1.0
   17.12 -Content-Type: multipart/encrypted; boundary="41fb875950ea35e61360a605caa7977"; 
   17.13 +Content-Type: multipart/encrypted; boundary="4e6afb6625e45d32519b500d431bd7b7"; 
   17.14   protocol="application/pgp-encrypted"
   17.15  
   17.16 ---41fb875950ea35e61360a605caa7977
   17.17 +--4e6afb6625e45d32519b500d431bd7b7
   17.18  Content-Type: application/pgp-encrypted
   17.19  
   17.20  Version: 1
   17.21 ---41fb875950ea35e61360a605caa7977
   17.22 +--4e6afb6625e45d32519b500d431bd7b7
   17.23  Content-Type: application/octet-stream
   17.24  Content-Transfer-Encoding: 7bit
   17.25  Content-Disposition: inline; filename="msg.asc"
   17.26  
   17.27  -----BEGIN PGP MESSAGE-----
   17.28  
   17.29 -hQEMA5Jd4qLmEMkZAQf+OnDf3f/QjoHqkMz/WdWwu0Trr4uN1k1QpNXgZEl8VpAk
   17.30 -Jlj1Akv3ksKMgNVRkdPGOSu14PE/xG7YxDDtzu4e0ruw3uFPl462i0WNz7fOmEdZ
   17.31 -YnMpfn4fNMf+H7/sG5BvaUs/Vdto7uhZ1+ebgeIcwVfKwiOs7NEvGghiJUMOteo/
   17.32 -Jqki9TMytX9sb58tL8x5d/dKbXEewNs1jqt28DKjAP+TCa+F2APN3z86GWBqaRse
   17.33 -JMnw5kOqDXEuyQ2XKA+nlLbThxMZ/5y0+4r4YeKmDqJdcqmSwggLet0LROhZajlV
   17.34 -O+UgkmIEpqKkj5yjG1Aobl8i+RbDSgcN2EcPjG+dHoUBDAOK25E37BudTgEH/1aK
   17.35 -OKh53th8VkK0XSnWqb3Th30X6/4pJNTi+gPM6jHGxRJmlcDgETw3oPii6Q9unWGF
   17.36 -LxFidBJLy91nfO+hxLwb/xVttQ8Gm8JO0ErjTPqdLC13sEN30nD6pBLl19CFPuYX
   17.37 -cq05KtFlSoip9T4Ie9Z9RfI3iX0FKYcOBUImXd41WD9VUMRghPKUyxILspkT5Lzr
   17.38 -hHHsAoDLMjAClwrJi+jFQ0tiBZXxA5E7g2uBvEWkI6zXlahR8LqFtczZRUKtkaUW
   17.39 -4B6SUhe/lhEysZ+OQeyicLN+UypYjHKOWRhZQ/c5ZCQ9WYQ8/fuvAW68vVauCVQz
   17.40 -Yi/Q+zUFYHuI0grCvCvS6wH1lh7lW+O6N6Q6yZEiuWkrKY/vPPsujSLSNV0rnhek
   17.41 -YIy/Dv6smWbmTmT0J4pu4LBOFeSxmoMPRqKvgGuxderlNd846y7y4UIcvHdZ7iit
   17.42 -bWQlTVvZiAUs3fZDRDGIHc55woaTaShHuQKsWq8Bz85gyZQyhf4OmqBKVdiV4Owx
   17.43 -5jdsFey96y+pK6hjMZxzBLDj5uLPtv9qpUAEw+2/GvX44RXf9gD+UEwo4KLx7iA2
   17.44 -lfktUa/93Ib3oFLFt0daej1bQVS6X+hREwt5djd2ufLitSzYQXGhDEKQ8PXnxT4G
   17.45 -oEaLuGS70CbQGk2WoWc5Lpb99K8Q6jCowh8YtcN+OKmjTvpeJlo0+bcTq1UJcbah
   17.46 -8vAmV9hnyJsOelCwKZnLGgx9q7ti86qtTHxtyRsvw0Pw0IFsUQBW9ZkIybOZrUfz
   17.47 -bPxt+de+jkbAsHK8gRhug2SWmb2XtEfhEoU6EMGZvaRwLF8GNvL1N5EOXFXKJ/dK
   17.48 -YR4mGDLBFjahq42wUlL0TADulj3E2vE89bLaUD23SI3yK2+Bva5JegI0YOg0cgKq
   17.49 -IZEpb29VeAxzae9/Gkmusp06GNsgjBqXgkLeO2rpPhzfrqgeKcD6I4UpTleSAP0U
   17.50 -ApdxisSnZlFjmOyxIqxbNV3JjYtApaeUi+B8nGmHnHE/lE/flSc8SdZne7MTq2iw
   17.51 -1pJMLDZNhWB+S2Ch6bhgYbnmiwBMJq+b/yEWOev8aL+ZGgWTAsWr2Kc//mdH0htH
   17.52 -Rk2Eckz/pyTJ7q0d/Tk9aOXVc5/Q5mWzrttrfoo40oJlR8IN3wcq5eKT+ZU3SygP
   17.53 -KRVt1iLWdj9/9TgeixtMlRUX7kXaBWRV/x0kX1mV9INEulzDvtwqcJiTRSX/pqPY
   17.54 -rTm+9FdpsPv+Rp1ep+iKkoPZRlzJh6z932+gZ6jam1eQz/UdBS4ttKMLvhxdaBgG
   17.55 -Rb29XKjIVRXdItq48n9UaBk91rGUT0Ol3i0NtiBIj5Z87tph+dq4XSLmhr720Imn
   17.56 -QvEl627xGbhb4xOE/MBxh0HYhSi1F2arxsIv+7c0YK5agbCqnl2+b+8L4Hlljlr3
   17.57 -FUu/GbkzOfkGDBYHYBfY48/VwEbDqoCDTef9uBJ7XQDFvwfhGwvKBOBnv5WW3j8i
   17.58 -pUVKby2x9oWTjH+7Tdn1oL4DiNcnyOGhmDOisWYhIDxFrWH02fHI5Ag9jvbY3mah
   17.59 -nrdWm8PNqnKRaS/fe++LYW3zKyo08+5TDGzQJqrOJ3wPK8UK51pXsMG1N/J3wxXr
   17.60 -saEBTzwhlPdc7bd734Grn0mmc/lBbBKK9VzgjwxS8lGRr0FOIdDTRdMJU42Zq5dC
   17.61 -vJ4fRDDx+0QlAos6+srlgYcmK6KFcp/9OpU+cNztQYolp4HNdZRPaG2TSdnl3SBi
   17.62 -e/DhE5JsVPVvlHXYPwPE1s4voxEQqce8BsbvNPBSCdN+UKd9/NAL3yCxqgQa+MPV
   17.63 -Cx7fJoIVD0Rpu4jBhga6ePxntuA16nNDefHh0BNKoptkbD3Ls0fWBAf0RC/kQbU8
   17.64 -wEeFwQfjIYES/OHKex51qhdxG+6yF3w5yehzbPoUPUM+Rmriwiq6lDEYDVfnJrK+
   17.65 -TqTxyHcDhLtgsCEo1DgS1wUMbbY7RbLXqfHUj+0VSpD65mkG6+0gu3gQLYGtTYDu
   17.66 -ssX/vYD63kuj2r2dYbN7muQrfPpOX4SGoh8Ao5e39A/G91+pD5MTrw4JUQ49EV6l
   17.67 -1KeewEivDBJ2inFPzg1ijRuQG5Zj/mDYCu2wkks0V2kqtikSIUAao/DK7UZ7fC1p
   17.68 -1NIYZcRjgL54P3fqize+0FW+a6FheLtBlzrcRXR9JXjpQHh/9zRw4PkGJOJsXv1L
   17.69 -GXcuPOL60wo5YF8SVrsmd6xzcrt1CB8egcQGFzdxOXrMC6sBCJ+xyWySZShotGvG
   17.70 -6/rwv1s7/Hl6ls5Pb1ii4FuxKSdrz70Fz01z066RszL7W0xqtgGcPw49/pBp1gCr
   17.71 -tqj/gD9/xM9j1N8gKtc9ABZVGS+fldUVxQ01S2Cg2riU0JpDAG6hVJyT/qWl6myQ
   17.72 -owLWdJOWcczyEa/aOiH+ls5yO7NT7hwT+EGWDx5B7VKA1JsouTBOK5BZbWLGI23G
   17.73 -SVVqVaRHiAeoqhIxmIHrzZK3hERohOG9T+IyMfOlMiGCfqPUUf/q7+LS3djTjQ2t
   17.74 -dEKfCpEdKmUOMQpb+I/lrbxP3dV+wEhmM7aSrRKke6PjiUXjfZMiGR/02evumhKi
   17.75 -aRqtwXy0s/QagTzo6z5Jp6ZqiALqZ2jopb390X+6Hz1GNvDZ1GSDX4KASlI7dnGA
   17.76 -8JzbKRwA1+H6Z+tgKFzl+96/56gtXTz6E1ynRF6tIp00j8sukBpTdi3lpZPAte/K
   17.77 -E3Ke7Ts0AyMHD5K35QJ0+zcunPrQ1AVfa7lBmUkBBE9Vf6jIgtAou+jWDMXZr5O9
   17.78 -u+qC4kSNoMglD3P2RO/XiqIdBCpcQigaVd+CTL+3vLUzm7swn36bRX+LYaHLDSUi
   17.79 -AKuhJ0UzRwetuxnUBQP3h7L8BzkfceixpUX97itmm6ZBZP3vl24eWPL8UKQwFboS
   17.80 -UuYzd4LOhv3G4nKSgFQcPj4isQlCJZyKsPZ95UHsA7SEuTgXQM/WXzWz7LtO2zOW
   17.81 -0tTVkBOyVADjqgXpihhA0hXYMJJAqhV99XRhiCc9LNOHqwPb72GZai3qQa8TC4gY
   17.82 -WXAzLM2oLI/DzhQNF1CRrGfj/tKfqrG6b9wH+NuW0fD2TapgsGF8Xgu8fMP0lcMs
   17.83 -6n5yJNm2Ocgu+j5nXMT4ovK10a/+ndI/oAB3a/YE7Z6pgnp7X6/fIkHLlwrAA3/W
   17.84 -jlH76PEFeVSBSWZy/1FwKYRHW33Dgync4SjK0UfTJdzU+N0CYetNYKGLvLV0Ffws
   17.85 -1CEqeXTNT0FUoeTNhdaUsgwJWmdRcIXZq5wduRFTWjJ69sRyHTGrFemg3WzUCpdm
   17.86 -AL/Ozbs2kC11bBjHovc6dne9SAXTQR9nZtf/+Zvu8Yyoswi/yG4WeRCIsEk1XVBj
   17.87 -SzyXRHCVMJC/HMGFTwNc4Iff/rcQnbFiTPvhjTsLC1vLgr5eLitF7QQW6Q9KPugH
   17.88 -VHmpNxlejj5nYIqUBal4w0TE5OvS+P9HPatwJCNcMjOh/NYdAIYv2lYRS+EepeC+
   17.89 -46EKB4s0o8hur5e1AHfhlsbrVZ6fyPPvNT0QTdAH6hgpHEZ/AUzxoJ6pTaN1smsJ
   17.90 -GIyqCPPy5Pq1VTv1fAx1wVZ7Xh3XZYDwv49qFO4swoYRspAAB47bW1sUGkI/gcSo
   17.91 -gtYWDYceP+GjsPKbLlfSfFUWirw4xMsbRH5BEmh0IGSGdycFv81PC1ii5VpWULFz
   17.92 -8M5qt9omY99EOppe6xVhw8gHRV09pT+ewizvJ4kQNyMs8/YqP3HUrPYSTaRnVZmG
   17.93 -AxJBQubYQyYx8r7sZnZRnorhlhBbl/0hY66eBbdU9kQpXDDE/S+Nt2iJ0I5c3hFt
   17.94 -Cs8sgIB0rsErIxjlefEo0nkfNgriF6ZGIIs2/NPjkxN5YDRLP6Ksbsq8SR+FFWCI
   17.95 -yhpd9478VilUfhd6c1uz8sLm5w7nQMTyBkjSS6rW+4XYa7uPu31EaVfm9bfodO8e
   17.96 -vKSZpvfcGsgZTuDx+CQkEpo/tAUsglnglvienoyoqFt33VZr3DaqQj6HZNsR/cZu
   17.97 -xt/72vHwhaPcFJyOn+qbbJ/P2rgsvbdszQhBJTfn4j63GPdHV7tVAChUFtX3fseR
   17.98 -PgpPcZea6JlaR+0CprUKRCsOQ7WZHNJIHjthavxegXi7qFJjfHN+/zrT1GUdyos/
   17.99 -NvEmO5ahXrmWVxfUjn5CTsByAkqzxInBsM+WS5iI4fq1oCsTsOyiVlCQi97+dAIi
  17.100 -3OIC+GDEsQbi+id2FJsMfKQuKwjmPCUrF6FYqpEUzwv8DKb+9Nb8OlKdFxayetGC
  17.101 -zkMvbuVsdEt7/Fale9RbiWkRqpSmgDFovFWEjJ73Ri/QZFP8Li3XjjnNt4cndc2Z
  17.102 -BoB+hAzv+FrpTInxGhrrCKGyBrEnKxRiCD9DDR0tKfiIbe3ZAXOo1MeZDDpCgr0Z
  17.103 -rAwb4AOkoAakS65sJ6ADtmTE4Jv4U2ulZABk8QG7yl5vxVSQcyJ+ZeVWXhW9S4rA
  17.104 -Kf+lB8I8T+rE69PKA3Y+ehPpFaRTx3rtktHfKfM3HUXz6OEcSrsqXreKE5am5qBM
  17.105 -QQ//vD9sHmkb9TTyrBYl0an/4DdxGDTxh+8lnhI/4bLrSrMluhkw6mRjow5yjA/+
  17.106 -zOYAwP15E5Xq+d7OHJomqTSnUtdFVLNs5ljIQQEXIsVDGU/UifQW6MycLREntHCW
  17.107 -+TZNRWk+H8JwVEPOnOEQCNzdCTwRhlhJkykxY8swaQezsdkG3ryNTqfT3ITRPOoA
  17.108 -l/huOyjHnWLo8496QciMLg6oBPieQhk9Ti93Mi2a5o8zDnOFvPc2etFWhYh3FdHQ
  17.109 -bMCESq6IqjVwz4u/terRQ+tZN751pGjhR5eS3/qJL8hvNHuRO2SoD7qI2SFo5d2H
  17.110 -8LtgQBMWWYQkF/WFieaLqvS+h/yrvXntfpv5+5O0Ceqk3rXWlC9Unjmvib4AUqPX
  17.111 -PUgbCJ06seSUS93Oy1VV+WTMxqi+5vvQ2stpudhos2BDQbpCIQL6wjcO/mQ3OAdr
  17.112 -SgRT1DJvq+n9JoRouyJHpnQuFpBZF5fMXy2sAoDsGqksy3sHvSjlKgZzwSetwiRk
  17.113 -Kixdan1Wbz5yp0VIcebyxQORTQqYHSicdTHmSzM8VrmgjeSxl+WWrn/uW36yJFP2
  17.114 -uCPoNKtF9BfgFu6sWgAOxXd5jTDR8LVFzi5oA9C2RCL5sZo4vZuQtPE1bSJYiKuW
  17.115 -QwnAFaNs9zV79FAmvvxjgoUWyjwB83yVtrrVaAyh/7KGzhF3tlGry/XN+kqWk2lW
  17.116 -bTpcLhSgzABkv0X12caWgV5uIMCDXxJv0h+x+P7C99+t/6xAGf0rR+5xmbN/EZjK
  17.117 -zJgnl/XNS18P7vciphoEcUSdQ7fTQmUyJIqBlSKlBbmtld7bph8nht9kEZdsfN+G
  17.118 -aSmWYw7HRaCXoq+IqVJeFoykvC35dBX/X30BV1d0HrO3kgTS87Fdl/7nF0boO528
  17.119 -ICgsOg1vvjXDZLqEyHrjxMCHpZiCNBksnQ==
  17.120 -=0apO
  17.121 +wcBMA4rbkTfsG51OAQgAsOncASKujG8xM2pT4oZpjY2qTHLp/PMsxVorTzan/ceY
  17.122 +LEbm5omwCjSIAsk8XtbE9uI9LpRO8/nPlbeOpWfVubsgMV3Yaw+/ndX72M9cbZ+g
  17.123 +AlWYhQVBqyh8hwh5JHmP0j6okh1ecljDm0JMJk+Wx8s19Uy20guPdbq+8JJi4EbJ
  17.124 +IYWsff1RWi43EfZrAktViek7IXiWty7Mlv2YH7TewBT8ltZ7qvBd8/oylNkP3mo+
  17.125 +wOSMGg46o3X2JqEWeQ+A9LY4gcscQGIvTlpVJVAvE9KKpyPVvqpJIUq8Tjxmm0TJ
  17.126 +Q9ZEQPOFKFz5jrdpemW9SL25JFNGrGfEwBYqaCZLJcHATANmnSPvBHS2pQEH/1Da
  17.127 +xuDIAcY4tCkmg9z/oHv0EA3ndUg0+gjCP4sLoMf+IBh37SJxRiNz7Ey0IJJwCogh
  17.128 +5UJMxJ4/g8iad35rNHN1p2xrXV74FcwAZlQO8Tapa/Iu2EEBju6OQOP7W+CzcJ31
  17.129 +V1MoweO9xnUvMYMDAeHYncdcctl27tAyCYrqK3QSu63VXwsRMN9ThPGjJ0I1EKrV
  17.130 +LRcmdZXk4ci1aGZnI7Q1rpK/gEKFdlXmm7wpuJLa2f0Mnp0Pq9B4UuXxBW+FCYI+
  17.131 +NJHaP5JKlYJtUBwOcLccV54hKDpVTsWkCl4WFQxpGPk7yF25aHZYpjB0kncQ0OaM
  17.132 +ulX6wj8S7eaXh/Z4dPzS2aUBdhzrRoeqtXOlx3X62EvA7KNy40fhLCYIw55ziZzr
  17.133 +qyDQt45h+vhXRQu3MxYJvWyWo/H4x66nd2cvVoB+l4TwThB6ewJVwb40VSz4aYmz
  17.134 +ooludPDiJDSYcFgYc93o8+cvdW1O+5qj37oZLrZiI6FFlgtMwA3NMyTEcjQffzrk
  17.135 +evaKe2uiAN0LBp8n3yl2T6bem/6Pq1ZHVzkPNOef4Jcs1HTPpXgW6GJL0MrADYpl
  17.136 +iYjkgi+k34f0OjtHtYEk3Xrnew5ZuUZ3KlSs+qpd55UvcEZLSDXT8iWzn3OISCbS
  17.137 +cc0DJ3Nw7bHgKR5qWVCijdHO7Q6z2wDlY9r9Cb3QrF75HS5z5As73SYhb8QlDKwj
  17.138 +EynJiSi1Jp84Ns4Ztsg15fTUc8LzWj+nxr/bLT/br4UZJmlkMOXCZ5rWh5Uel72Q
  17.139 +j8abhU8YBLrpiKMo72qmhRzSBufiEVzUo5T7NxsTTPt5nsTCQpKm8UJEaUxqNZAP
  17.140 +bw4Np+/5g/Y2fPbdcJI68T3E9IOpbYsCrNnaIEASCN3g9g2LxTDPLtSV4FfJlisr
  17.141 +vxUSNy3PD7WfplRXf8QRCielso633M8rRbKTsq5mpZGYwAWDELpZKmr5OHyK4V03
  17.142 +G81TzKrvJ2iOJau0Vdvg2Ka1cwJKWpG4D5c8LoGAz7uSeMJ+xseBp94NvTLrT1kJ
  17.143 +4yeGWh2hhCbw4Dizkv0YM1Idho+JG+0DGwfasYLV9dZUyhvtqg+hOLI1wON9TAJW
  17.144 +9TlwH8fkmTWmiowRaGV633KsT3+Pa4WGGtMcrFAlTkTdhsxhRcwrvLglL8gH5onk
  17.145 +XJMEQHHuM6TB1WKK4Tg1puGJCcPCP8cXJDcAWHejP4j1d4oyvKyqxbOVxrWxtens
  17.146 +gB+2DMvVbvQekH+MJUc7mdf6cCPKF2mA1Ar4Wno+NMgvhfL36G6yjm1Y5VKqTL+I
  17.147 +/yBeueVp8uBiv8f66f4m4I6mzzRG9xp42b5kHadMnsUaoWTzdt/Ha7FrUDjGuPa6
  17.148 +qgSHXzGrHky8jiBRYFSKo5CHfJwDn2XmTbdfNQ8HyWabtkOEH6HhqistRrjZ3hS4
  17.149 +W++l6hnfBbE2C6+dTgntSZf208HSpQ/eOT98VRxkqxYA2YAPiJrxdyXIUQ46Catm
  17.150 +1GSsXAy+uKQ9pZVOGoHyvd85eDR2JJSp5NOxjU5OkXXp24mxO53dwVmMkLvWngHV
  17.151 +6a580vcrvq6IIl+RLHZb4iz0kePvaalvGhfGWdxjHqQLV2gfVEzR2PsfiOyk9+cJ
  17.152 +uUFOieivJGwH3+Be783kntwndq0uLu9gIwkj79PaGs3pWKSYiP6uv3efCUZTtfJN
  17.153 +kV6gpcUsROPURE7lBI3TQTDrVPYOVS/qXX8S6qgilirTqNbcbv2b1EF6V08ca/X1
  17.154 +vh/7PcTnVba6FiS3DJSHkoE4XXAep3WCWJfVP927i/cTPWl8N/Fnt1CTzTUSyIdg
  17.155 +4/TFKF+ZRW9xK++JnLpL/R418nkfRTkcPweHrCFkMg1XyBkwJjTgdaH4KfJyljoO
  17.156 +VVs8zdnlNABS7OS4bryXVBCAAec1m8ia5sDGyH5KZv0w4csEhTGPPe/IdIQXWVBj
  17.157 +kj5B3AiLaOaOenFJzy+fu+zLJUHLSxpL7l6VkFD9hLOdhfMiLnRKWlkdrkt+ETU0
  17.158 ++47X0vj//a1t6FEem2xogYLf59iXkH3P6xZM1cjWf6xrPKpzZENWpsqtzgJWp8jf
  17.159 +xNi4nITaZ9cO88gvqpIJRuGC0DiaTOoMCVHnJGseIz3hSjoQVbCjF+VXtgKVWb0L
  17.160 +N4BEQ3PjOr603B2Gcvaddr7hJz0mqA/4xIAcrD3D2WbCuNFN7OPBBr1hlkuYdx3T
  17.161 +j3yJJqLlCYJy5iJtErUxz4gwrRJDz+73o6PsEPqKmmtYiy/RkMzuHOrTXpOZVDfS
  17.162 +cHt7Sz5Q5uiNPcbe5I/nCP2+8oux60VJSkLmiqZy4vgJlysdEYVY90oRvgiai41h
  17.163 +9+8YiNhogFv+YCDS3cGcOlP/8JpomWEjbTDWUv7YlPe+k+IToTwEjapdN2GJxZqu
  17.164 +aHwtGJ+yi/MGYDzoyvcDUP03EflI+5+UOzT9AwSrcVIc8VTGeweFfCJ9DlKWkgeg
  17.165 +IPeDpp196VgNZ1mZUqV1FnTAnkpi0Nzqq0oak2ytezTWxY2/HuofKuGJyQJMScTR
  17.166 +sZoYzEfTYwv+6jr4y3cILJYuEDMMK4BCQM/CNHGbnqZbO1M12s8Bo0+YONilUP+B
  17.167 ++h1gWkK7RURtgEzcsTP8SyDR+v8I5SlFEri4XMCqRqMtxdqK6FWmkAtD9+cCXIid
  17.168 +FYlSi0I7NjXIYG8VQT7S/USk35huYGDTs3ab3ZF7OZnm0AYv1nvqLVrkbSsFIGU6
  17.169 +nREHMBS150/Ld0q1uTxyHjxskQ1rlqLJN7kst7Q5TvjR7rsRTNqxkB4JLsc6BP6g
  17.170 +jdz1klJvRutusbpNO4eKVphFH6F49dlR2tVFXkcIwurQUDOrEa6s12QKTp7SX3DW
  17.171 +hHFsQIQOKJe4UGTUWwsG7x1IulgWU13Zp4ZEprppdFIcNUlETFgRZzD2UMhSq4MS
  17.172 ++iTbQEy0DkLpVczVAYa4UWg8TtRcvX9S3PJCXRtiAMPef+20FnPhSphKsLBAApWQ
  17.173 +VDgLvq2KyE3i4hcBShJCRG02gueVfSgCPJssXvo7D/2SC+x0yUtJkH0R8ulhVdbC
  17.174 +U6ih3Ox/BwakG8WubzFBJ8bo1ka8PYZeTKqkKg39fUB0mFBAST3x79HMnCpuOS+r
  17.175 +OnD3HQQqllI6x2Zji/g9PdcTSq9swaaV8y0uA60GruunSOrAJ4HUuOnrdus0fpwS
  17.176 +9NBEfIVXVRieihXvOUURBjSNssKCPsq9a4a85JRM93t4EaE9spb2b449lz/CrGb1
  17.177 +RcOwlzVoNmTlYBN5e5As6jdNwri4kcQdtcVLVhDDscjXoBrYrdbHW0yPDi8fLlGH
  17.178 +M/iydGyEsnaUHjK5+qoO9sWfgxev+M58GpW+x7i3TU3hmH3aTiwl+wdNpd9LVBEA
  17.179 +bCKA2fEjZVJnJy+ZFxssm8YvZL4lNLOZ8BVIxCToFdSBJak73Y5yl451wpQKtGHH
  17.180 +wsszYNSNUUD6YaqtugxQbcz9duirsowX6OZIi2hMYpyxSq3Y+GCyZI8zHKxg+KaC
  17.181 +jUezl7aWPiEGjLSSZ2dAnt0frXfhJyQOH0JbrnmLIGBvL4PMnri+PIzBhad3GQCO
  17.182 +6mEQ6uq8VZYCLgXejhTtIYFtHJ9jGPM2NhVWjmzs2GNhS4IFL0N9kgkaMn+vTwI6
  17.183 +Ko7TZdyK4K5KDVrepKTcnKh5SQ3YJDtMSj00CP35cC9nY5qlGR0wf6H/XUtAuQ4J
  17.184 +Fvds+Gh4ferVsr5exFyPQOtSuXtKyfJZ68FS6VzI3slm5suRr7EpRqlEwB4J7uQt
  17.185 +P3bY6GjoKK1yoJdQGcor/qpLNlGNoXaRCWaZRwagcOgdhb0ECC6Af4XsBZ3LxmgA
  17.186 +JOMdXVsZHYgp3kW8qFM4ybklobMkpjcZIVv8FgBBPT1gctMemFwjZSsgXVGVT0j2
  17.187 +JbUte4G0kPZE3aUlEBw+a2gwf5IsO3sOQWZcipDHqvkJdPprf5wNlvH1oSfa/sdF
  17.188 +mrqSRVvsdthrbO4JMhf6bVNUG75HCXJGt8iRC68Kn7nMuclozHOtXHc7kaymK1Lp
  17.189 +osNErjVxV6d8YidkEO1MJgw6PRFBnpVyywXrYevp0CnRwoRcnwNUV+juIMewhsm8
  17.190 +eOkXZjJVG710HhQhLtcWcwI5Ea3jQn4ct6angX5dTp7m2o13qvHRbeZUZKc0mR2D
  17.191 +mUcOcvQ3NLoOrn7evVOXS0MYaoMjR8dlbjkS7hgnbDhF10KHuMyYHsLYqbE+RpfX
  17.192 +kl297IqohlGs1y26E8/mpZpp366Z239tmWv02a+NDr28sEkg9UPr9tEVsWptnAtf
  17.193 +pdUIoc9g+IjfssMpl2f2ydWGMtF3TIEq74yMi8uRWbhte9QOxrU5ZQ5ecRNFeDwQ
  17.194 +ccNQDXpD6NKxUV+fZ1jjJPg9QIHDOs8uzqzPbqsRdQEL1sI9ltLYy5EtzKbgQG3F
  17.195 +qLAYqZvQrez8nUrVJjbURmjqkW5jJhXXT38SVuHxj2eky7xk7WVxpevGRS4n/vUO
  17.196 +hxxMNvPqEygwhYKN0M+8+zdpa0NjWxmRl1npKnxgZDkpro3vRLereF2Wlamercnz
  17.197 +pOEXiJ9uPQIwfcgBA8SY6MFPGDApdk6/rpkmZ80FRx4TsTnEUAydINqVAFq6nZHM
  17.198 +2H6i1Mb7oxOqCPWK1OyATMGnHkHw7bdcAIcK2sNqjw8hC5CgPYao92SbzB16EbEe
  17.199 +mBq/THea3EUN1BgXKaUXlHpn9KGI0L9MQLTIHYfzhnAvF35G7Dq8RFItxMZOmx92
  17.200 +l+8jWTByRP/0GOM+cBHBvbht3aHIDOf9udu04IkU0jeFftiOsulc91dx6Dcmmfd+
  17.201 +ftSwwInGsp3sUsTT8SrZNhpxKparLQVbrQxH/e/qC9+vgB2BlQCX0esueuEGPu4D
  17.202 +o85ey4W+hcSYwe1ibFsgj/W0pHqjs8e7NM1zQ+UuuEqEZwKW90SJkXsty9ULc2It
  17.203 +CNmaxFzAPiaiNiG4DuueAgbU86IkCEfdPiwy8BhumQUHMjzfxIxbwkN0rnVgVLuG
  17.204 +nbLUIYA8mSrz+XWBLogs2PwjEq+kV7fByC7gFJdYm11y/TSrRJjCdMnDiO911Wx7
  17.205 +Wbl22EEXz5O0PXD67e1VjfuQmv7A6QAIuyjwd4srxleTipMlOqv0Pw8cyl2Sdpuy
  17.206 +l1tYhJ8wfHiGUOQUTWiJtaaq/NEWUutV3sDif5q/GCbAJGwbV3vGuPgsIkDtqdCP
  17.207 +I9ugjzP+rX09PvuW3h6JvnFg8sOiJfg/hzGsqtG0uH36Yso3Uh8Y1OtQ+0agQYiG
  17.208 +AFOlaPms9CGnk19oB6t03Qt5ZMbdbN8W+zxxbtIB+HQUtsF54EHaxa1djm73iB7a
  17.209 +bavmxAce5r9vFExSMjiNq7HhO6i/JZwrff3RYim4jcaIbMDL91WRA7DmpzKH0IeK
  17.210 +h3WlxboUwBdnN/ENvXgVrscpWBMyOTmvQGsmOxJjVbDzaWHYL9H8sHElKAwoPw9Z
  17.211 +18HB33C5PgezIc3BOVH6wtYZ8FTYfvizA3s07f7z98Ovo6O4oAhcbmfdYJaYyOAP
  17.212 +hheZiA70WX2Z/+d6Jnm7rC7o6hpabE10OfYFKwjhSpknpe9NLpz02U/fTEl7+oHA
  17.213 +qmVbqpk4gjsUjgCpgvuXX0TAoWlxQvh9DyRez145hjhjPcXALiBNyOi/0VA+g5cz
  17.214 +UM6PwNelrOqu1mwCATBbGafgpHwK9n1fTd8jptxydwQdzUZSKvlE7hicd5ac4F/u
  17.215 +8e4yBrJfB+fUm/345o/kQCjA20em/giP8w+3+QYxMNRPjB1MPC5dqrnoC1FVa58i
  17.216 +TZpGGGhERrD1xPPsM06U3BZAYorSBkLIAB8EzHktmIhedxSf/gitG/dqdVXw2UEo
  17.217 +Q5ZaubqegZ/UzAoQ0m7RIQVuVXBxWBs6wNCgXHGHwciKekihX2cWaVugEBMHQFwZ
  17.218 +0aQNmbVtVuJQT1E0I80sPtIOYhYPZT5ExHtV+kqUabBiIwTQxyCVvMvTq4lUF7j7
  17.219 +l+3FDFSWvzG0Om89cRDv77TUq80Y8AuzI9zica7rY/GtVxhm68ujeJ9n/Akf2LuX
  17.220 +YqqkT3fqDQeCYmPkIQ09BH74xYb/IW5nLd41GqXGjqNT0IFEE1LkU3pQM2dew4rh
  17.221 +RZ7CFrzCJe12AV04k4aTMEU4IbAMiAjvRHNr6PXzmsppzVpIyYUrdX25enrHJtce
  17.222 +3yjdDHYfn0KIBQdtQ39F9j3WQB8t8rhp/SviMu48JujRygM8QTOw1izmK1/HdeTk
  17.223 +1f98T8U1gtGPEOcfYX07y7pcO/3kMxMncNSNMQ93Rjz08PndvHD6C+FByKKgaH2T
  17.224 +6SZl+6vNVjMThqxztIHFVOHZHkkpsQGO6NHv8UpUzk1UEGLltUockjI0RYgTUvKG
  17.225 +68XxhKu7AMZVcJgAmqJHw1FaK1h2GKmpufH/ESesIe7/cQ9VaEmkXK5zpbIuV7z7
  17.226 +pz6NAxN9+lBvDCwVRz1FBxj1D4bYAPjA4aT7tioBVQXLPHOjDsTxfviKW+i6jvwu
  17.227 +xyOVMbaxvBe35aRwRaXNgnptGkmmTJuhf9GagDgBAcaCFBh/DgJxzYEsMzZ6pWl8
  17.228 +mIRaNAqvoyUw17+lqMFwqIYH7z/JB0LSWiTdpY3hCHYnit4FI6l5ZAGkqZjDsfN5
  17.229 +OjzeZQmFd4T9v7d95pEuetWBiOxUQb1g4pYjQjXJcV2s22X82z3ZQxF1PYXo2khq
  17.230 +u7z10fsQ0kegsuWEUDPigyyAYVa8zead95ApS62youpfDfdGpymroTT56FCfFp8l
  17.231 +hEtll3/lJ+1f88hCV+9D18DQp+XRv5NrPoyac0YbsltWrIeAoOZlasC73wZ4c5B3
  17.232 +2XXwO9kOXqPYyuqysYKvVYmgKGbVqLvTaMfXPhoZ8Ue/3N+Md/E4Ovpk4awfmntp
  17.233 +5GTr2t5aeR/qxSKGxNFfB03oLm8pPLtrIhKF8ioikDtY0eqJorPbwItn8oSCmMp2
  17.234 +e+Maj0PPePH5F1ohxHLjXzZLF/77WQndJ5Qk3iy2q/an+cvpi+c3D9IucELnlKAQ
  17.235 +fW7GK/NzejVmrtc+SawcBaOOPf2uVvv9YqWVZsE15b1Cwz3VMbmHr6+Tpgnrv+D1
  17.236 +1bX0Xjjs24WiQZXxv9IEJ9zz50eA9t4aGgigvHnn/uH8k+TXGRP8MqGf3h7FIRrn
  17.237 +dvIOkFVzY9nAnGfhFgJNRCojx8gNEIWkIxO6lnmK8xXYLHJtdabCMDDR+LS7wpdh
  17.238 +00Y952RQQ50BJdL2eL2x3RyRbgQPiSTCqWFUEEpGRZZnFRNdz+K59ZU/IyIQp2Xn
  17.239 +bXm4ghkqh5LsnCLy1dugcftKZ+k6GaVPC9641iZVh6vw1u61w0sVWgNtg5OEqkXL
  17.240 +xzuyKxSK/JFfCxF+SvgZQFauaNLAP52fUzWMEShIoXR5lwoweHYEtVbCeozHSnWB
  17.241 +1vpzjRKFYSiS3hWcpFld5Da3JLWVBi+uNy7irIuNmeEyljcklH913IoJrwEbPLMs
  17.242 +RxpthmwMBCCRndbTRaS40ZKvLWVMZBZ2IUTI8Fld1dHwbQ/DGQUKAXL6I94uAcwm
  17.243 +5lugFsOeUKTi/DfBloXWn2V7Ft9rad74LovG63W6l+SM9nCJHBmHJFrCt0WCMymX
  17.244 +v5EYFAJD36cd0fRsmssKFW/xcNqqcF4wNnLBUYhHhvzkUkAdAMb3SidA4xmzuiut
  17.245 +r5qngY8VGdkneMKwlLtXkbdRcWICzt2qJsP2AoyPuEtS+pxHJGovQ70KkRNq/dER
  17.246 +NALMe6w7jXs9TW781CBEPFcW3o5O0aPl7Rd/BluEiq4UzyD1gCBrrELok6LJGgEx
  17.247 +FGogYwDk7svtsQoYEpZLjxUKKejmP09yKHyT4tXK71qEfUZl1WzZtNKXriFNpP/O
  17.248 +VxBkbxE9jF4tWGzrbBELM2L51+rCb0PNzdv/shziUGrfMHFz7AGsJshY9/L0Yczg
  17.249 +jmo0RxXu+YWx/+fd+ccJo/6rVEvvCbxunBiIEtLIpN/26vfIx6jlCJPK9MKEfUak
  17.250 +/6j6jV/gsc63K0pciUVnzXKTwC7AabhQgALErSKrpnDImxPLGJ59dTvTnfzhxzfK
  17.251 +pPBQ9K9+f7i9JUBPvIvOI0lCia3UNYBUQi6FdpK9fDneyrygSxJGhwOsbgND8KPs
  17.252 +8dLjP6dyLOFKhihqvNBL7OObc0mi0sQKGDoG0jWBnxL0FKCLX9goxuC3GjwORL6c
  17.253 +p0NXsAxiu2D52iYVZEnlWtAbmrQ7yy0OAVXZPiQcIo31lo+fKNIUEzM2F75a43FJ
  17.254 +zcz64sz37AfGvAbQd9HJLxaF0ERlZNB5oQx0lrGAGX2jWppTazYNMTb6yNuB5M6y
  17.255 +PstaSVQ7ajcOzfUQJdEgzYeEB1TcJhd0W7se6f4y0NNl2g4+kwF+HUwVgHJk9UxB
  17.256 +T50lYDznPl2GrDfbAGliFZQPTykZRmQXH9Ixf84uUs4ayzwtuqzgPHgQUVEFEHoO
  17.257 +cwDlwpXR7LS0RVM65q0dn0AkQkL9cQHwqTBBx7qmDVoJsd5+wasVHNvxbrodztWr
  17.258 +ObxM4T7eAxZQnbWThiim5pv8dmw+/aFu/sPlk7Wi0PuxG0aI/QgA+8hRTK2EjEru
  17.259 +7mnRJurfpljheOkUexauGlYkfUQOJZ/h3CedtcRHzUAa7zy3sx0irJQ/GKKesyJN
  17.260 +IRAl5BbhXyOVBRRuaghVGG/1cwgpboWs1Wpy95GtURdcqVwAGRoF1nCs70Uoi7Zj
  17.261 +wzKroXPZ6AHgyUpw/tWSvlfpAVZ5TjQBtbcsh4Q5bF345sKJAA8vdFMhD1lX6T4C
  17.262 +qWakddhYYoFAPgqh7SrgjVtkFxPNpb6Zwh5R5pWyoz4DKD4+HqA6WeWB/UHgnyAD
  17.263 +R14k+QpSm5WKA864lCNX17Om4vybOimc9RT+JNxb0N0Fm0y3oVIdLDnPdamHdhEv
  17.264 +UuJUBihcwDX8IWNe80RcU6k8S+L4SmvJp4nrIahjzH3U8OuuH4Gkp4ImUDcnDLrX
  17.265 +bkyUw2Q+/Mfi39kPPC34o7P75Ro/96eh+3445UAuC9au7ZP6Iq5fQG7NUG+FO3Mh
  17.266 +Qwhz+rLi2ViCa8gV0eFoaybfO9/8YFoj7nA1c0OQ8wqdh+qdaOwfK3P2PQo+Xq+9
  17.267 +KAwrleZ6chbUmgA51x1IvZ6AnpmJSkFv7K/qyU3j+zCYcrrhSnZjOHMU9EI1MlK3
  17.268 +JFP9yx6ZMVi0oydnMAhgi1+Lg9g0ybs2EeB5cP5L5v4R4j1onEjzP0KnrsJbKqqh
  17.269 +SjnImoHqKhOrl+snVJvjarHFWSwW/JTLNvJCKAum3wdwE06VqA7bgIlMvG1qWm1+
  17.270 +300XkolL3J8lPUFo6ynUQsoeiW+5KgQA115SzvhKa0QBSOtbW5bt6RyeeI32k/IW
  17.271 +Meqla7BDGhpwbUJkHlpYMHGG6YTuiQbUvbzUYBDiDUEJilST/j4WZlyYvSd1oxga
  17.272 +K9GAQg1hkXgyoXh+7iHVIFFtVHr0MjJKG8d0bXf8ncB2yNGOL8S5EfS6RJJ6nxl0
  17.273 +EJ3h7tYr
  17.274 +=210/
  17.275  -----END PGP MESSAGE-----
  17.276  
  17.277 ---41fb875950ea35e61360a605caa7977--
  17.278 -
  17.279 +--4e6afb6625e45d32519b500d431bd7b7--
    18.1 --- a/test/test_files/398_reset_from_alice_to_fenris.eml	Wed Jan 15 17:13:00 2020 +0100
    18.2 +++ b/test/test_files/398_reset_from_alice_to_fenris.eml	Thu Jan 16 12:40:10 2020 +0100
    18.3 @@ -1,121 +1,194 @@
    18.4 -Message-ID: <pEp.PEW17L.0RC7XPI9ZPB8X.97B39B40-10C2-404B-B8CC-54B79229F8FD@pep-project.org>
    18.5 +Message-ID: <pEp.Q41DDO.1FN9ELX2M5M2X.8020417B-CF0C-4443-A853-408BE326F5F0@pep-project.org>
    18.6  From: Alice in Wonderland <pep.test.alice@pep-project.org>
    18.7  To: Fenris Leto Hawke <pep.test.fenris@thisstilldoesntwork.lu>
    18.8  Subject: =?utf-8?Q?p=E2=89=A1p?=
    18.9 -X-pEp-Version: 2.0
   18.10 +X-pEp-Version: 2.1
   18.11  MIME-Version: 1.0
   18.12 -Content-Type: multipart/encrypted; boundary="7e23a74c7397f0666f31d87d17b86a89"; 
   18.13 +Content-Type: multipart/encrypted; boundary="3f2dba317c83e458257130a362bbd95a"; 
   18.14   protocol="application/pgp-encrypted"
   18.15  
   18.16 ---7e23a74c7397f0666f31d87d17b86a89
   18.17 +--3f2dba317c83e458257130a362bbd95a
   18.18  Content-Type: application/pgp-encrypted
   18.19  
   18.20  Version: 1
   18.21 ---7e23a74c7397f0666f31d87d17b86a89
   18.22 +--3f2dba317c83e458257130a362bbd95a
   18.23  Content-Type: application/octet-stream
   18.24  Content-Transfer-Encoding: 7bit
   18.25  Content-Disposition: inline; filename="msg.asc"
   18.26  
   18.27  -----BEGIN PGP MESSAGE-----
   18.28  
   18.29 -hQEMA5Jd4qLmEMkZAQgAj8cxagENLesYZm9tPxJWZv70pPUxrVbFG8U0of9V7Q+i
   18.30 -mypRO+/WoKg/fU7f1+JniBGb62ijwn8YuuZyxEch4TFQQrQ2u4BoJesy2nXr/JFM
   18.31 -wFLt+QcMwWbgAe9rmaPZ6E0TXpKFphz3Gz6wa6+21JNQiAlcUqv3UL7aNI8C7t0d
   18.32 -Oh0J9JxboAdJ2pi3AfDtaSb0vie6EcmEN+AeU3P+LnQlYyT9NK4AqaYGOgKa515e
   18.33 -NpCuogpAbnoRChlcRJGFlEBOJR1fuFKnY9VVpUppVQLSUm34BtIAIexsAfiiexXV
   18.34 -A/5XlqN4fzA/erFknlo/zl2jZGnsd5MVHZ5XClVeZIUBDAMSIv439cLEHAEH/RK1
   18.35 -OJ8G+vI+X9b4SZbcNrE6P1rnC6iZMqlIn+13fmnf0HE4ctLaAPhsazBB26mE+/pn
   18.36 -anby34JepDVvdplZHwKBML/053WeAo2luflrF5cZKoX6BE5P4/L5gTRWbYPWgPz9
   18.37 -uGiE8udceViK2PQyrPRXSGmoVxQ13mWVvIRK3hxB9HvK4YSAWf2Dd5ydMr8xUWUy
   18.38 -Mu6elZNT7fUGuFyfla4X0Jskc/dLr+zRhn4Nw2OdUwQ6ya0KPjeKwFLamyPa5Bat
   18.39 -u3q9d0YQJ+4GRRA7r++d/5EJvb8iT+YybU0IKgeaEkIGaUD51GNa/nUTHIn0Gdd2
   18.40 -o1AugkXRMyJIpsSRsi/S6wG/NW4D+ZfEevTFHnXea61aqwPeoQTwOScdjjpfRW9c
   18.41 -BQCEsygUP69n3Y0Ote+xuAsBnDw2oZh2OsRWbI6enedZhaNq3sbOj56KsE1lsHvz
   18.42 -kp9Ox9e519a4vE/kaQyHVQTcllDNttzLoLluWufs4kjZuyZ1Q97rTK5Fi4JJUyFk
   18.43 -stXdFLa9IkYxIJLg8iT3nls/het8BCHRJIsK3GU7sKPQJvcKOBmQvDfwpfYfXYOb
   18.44 -y1UhzNH31TlLyHLnfBex0RG909HmdFQC1lQ6cqE4cLjT2pC15aKjeTcP2igt6V7A
   18.45 -z2lGwZmtVqlCc0uyVKXNCe6jBrac+GTGyJjcWWYrkGY2MAC45893YwEIrqf93eGf
   18.46 -Wu1HPoV67B2X6xHDvvcehi3xldSZMsjd/HbcQ3w3HHH8meffsF27h/wmei1dSTj6
   18.47 -xsV0M0AnP/Ck0qm19XGindW8rgVP7khPG7yjI2ETsHKeEOdebgICFcoQY3lPv3F2
   18.48 -/26+i2AmF+SGfGW/t/I5Vpx3XuUFAKaP5fIQSZf1FRq4bZ3ctud5kT3/UC+pXedc
   18.49 -ItbFZIK4W+GFN5QfnyZ7qGOm0fO0mSFuhZHXzjLHIZB4NxW7SnCbBA7/MBM9QdyO
   18.50 -L/lXNLzW+f8JJyBRa/ro6ANv5euTzT20F4XNRZu026U2qmsDS0UrqMMkd1q6w0jn
   18.51 -fZggBNMgKw3k4S4VPGgICTDx7o9NkkuEP9LmOST1N9XhbIrGJXYj9ot05BwXp4aK
   18.52 -1saVD5v0OxSgQu5rqseT0ToElLD0te1kPjaFsxWSXqxgd6M612elm8T2gt2pcbOA
   18.53 -blJbqixncctuwWcmdh5Sq391gE+Ut38Wj/mJuJwlXbedgvMRGbVNjPMNg/wWWP4Z
   18.54 -awRk5b7rtAJ1F8bV3nJMQHUHJOG63mfRAOd0hpwA3VgVZpuVBwH3R9lW3t6b4RaH
   18.55 -hPF+J7CZyoi6FjgcuDob5F9T6BWzCx/gR8yVat/FNQu6mHc8JtiF5y8CYHyM7oLa
   18.56 -rNBM4Oaoc39N3wJx9bO+S7bc2A1whhtQom4o2VrLe1W0vxXMsW+v+mS3FAeG3QP1
   18.57 -88Mc3lQvXdQCAGiWBTUQ+CMcfFYaGVpIhQPZ2jW63CTkhX6adtHD0bBupfwxTz9p
   18.58 -KJcqhqDk29f52PPFb0HROvd04aVIhTUAlf6j9f8+1txP/6frRHOxwLKmI0OhEJBj
   18.59 -VsX5tB9K787fA4rd1vBScFi1pZ4k7HCKnTheeXxSp6DeE7dslgc4dQoyXPeny3ol
   18.60 -JugW8hB8lmZrEmYTJPcsglHbv6toUaTufkE2KFfkjpogwYLxMDLShIXgLAiQ5SX6
   18.61 -q/RWpFBr9o5un+z2D5FCwuhW9a3HVcWWWuxZ8YkWU736sKaLmZ8Lp7SsJKguUhpb
   18.62 -N/R8UddrfpbCCmIzAo8g2+XhcnfpPVw62yROFKkM3fNHOBgfeY0z3FY281V0/ytd
   18.63 -RH8E3CnGm7yBwn0XCx3uC9HtvOQL3Te5f88fCfSyEZJmg5EiXqBhf3uNw2QIj2x6
   18.64 -VwNGoVNd3QDJu0JeSAzzYfGcGkTQyEKgEs5zNr5YA7NeraJdv+CRzUu/kc7GNl94
   18.65 -8MWgb4oDgk6Mv6+uVxO0njyDQiIDTVnGItCxnsnllvvEW6zRyVsrm4viZmMSkVVf
   18.66 -X/kYDPIpmR//lJjjhYcJqFSieDYurkWs2BvZT5Di8xWZhllcGc/yB02BtK/uLkFT
   18.67 -RM3PsaLIef7OK2WZ/7Y4XuwIwFYCGK1gCv4TAiYkrrN+gzySMz2oId1BJLlA8CRL
   18.68 -DPAEW2QTucDXLOEpl0XFXSosiLUAf0pbZgVimWS1FdFV5M3SRxymoRFHUvJmaFKR
   18.69 -p7FjHmGxR4PhDrMOveDWa5331LYU8Ycvdbh2q7Cg4ZTt1UrqlPyZwbwxdSamPFrI
   18.70 -MhsTjUW6FuCmJ2AmmTbIafL+HohLAMG/gGMSK6qa8hjV9S3QEOmv0ieOce5Tlzka
   18.71 -+Jim//j+X1AGYFIb1Ho5YwBMY35GHTmRFQFeobAuFdmlKI6eziLi6gB0GFMGoViJ
   18.72 -yxEoLO0HN5iXnMPJ8jKw0dUg+qTNDAqS+8BS2CI1u0Ez7BtVuOqdCNCCT3qaBu6x
   18.73 -eFYJfs8eqQIwPmyDeShvYX1+klPvoKaut0HY8JOY2waI86wvfI6IKJKHcdCsIau/
   18.74 -EuHkoK9xAAx5YsvMXAiLBHQn+sdnrJ+iBweaLdBN5cmg6TAMlcE2gv5OTkL+mkz/
   18.75 -nHvBOR7qdbh5yxvlJd+SlI+hJrFuiM/MIwRmhTFefQxscOj16sDnIz7IHBEPhDoi
   18.76 -RGsJAwbj/pV5Sgjk2gFjgIQ+QvPzb5WYioY1GMOJKXJuea1ATrk35Fufg4y0aQZf
   18.77 -JtlrTrYz16jq7v+iFFD70zBuwIWAvvkNR2jyYT+meLkKmYugOVtlONJiwPqBQf9p
   18.78 -Xy5vsD3By/k2HFPEubVIS7w6kj21dPvbhugdAU8MT2oQZtPSyFUV/MCZRc6zu309
   18.79 -jZp84E2JWmF5hlDRXH6fiOiVaIJVdLaQ0aJA+75YzF1ilOJM2TSFXKyFOAYr6yQN
   18.80 -foOdXJ4ZPapCFKrIKmxEwhBMtN17cc7r0OOpxQMbhu6OOAup01UIc1d99qWWUKLm
   18.81 -2c+etOskQU7WMZisLtlfoVZtxalVjHmaCM18Zz0RxrjMnRnupYSH2WqXDC0xNpK0
   18.82 -6tHsBhct8vPMlWNB7gKtn6dB7tHFkeNUbR5a9wiM8VN9Sxck0F+RGr/Jr1A/s/jC
   18.83 -6todAmkDqenqun/3b5P35PMU2N4KzaOvlp9oDU6I+aGuhG4Q055aRXfHL5pmj6XD
   18.84 -t08D8HbRzXBxEqHn+b3vtlq+CyHX24Zf87HRCJTzNaG2vZt7xmIRfagImR9y8UzN
   18.85 -S3pNw9yCOL8e4VsJIAHQJ+nt2Gs1VhNb+El0CjYb6Uvpa+AkmLU4T5V1bKswiFO1
   18.86 -Q0SedRcBxmH+/UzkfT1eyG1RreSvhWZohOrLShu7kw+GKseDzXQrepBg1TLPcxgA
   18.87 -BVzf+1lQVqPCFTur4mt1bUGvcwgJ7ydFhZqp98JyFNRKH6Dp0FHOlBG9dEitKCG8
   18.88 -4SIiWO0o3Qor2OXK1f4hMrhnPuW1GHMuDQKLgdOv99C+C3DzbtOVDzUiFRG/qYmD
   18.89 -MM8Y9bWELwW0ofI/0N4J6cqZmIXv3qY9hgiWWZKvSnOTfgQ31T0ErSZ3LTM04UUo
   18.90 -OaxON34Z1X3O2vZW9nPgNagY/Nt8YhZL3rOgVKwDM1eLD++CNJUIjZFafBT4otv8
   18.91 -EX11LgJxIzz4UvezobqUjXQvYKdSz2sHvz+NXPcvfqUf8SwG+Cfm6lmAr/ZBskNw
   18.92 -M0mDCaRQbcOJ6mxNsOh3uf3VlzZeDpML11D1OskcnHC5aZw/0f6xzzGkYtvLSZmM
   18.93 -UsLoP62sANMgWdLRXALorFNp54gypkmFTi6FPI+8TK52pS+p63i3n21LZgSFY43r
   18.94 -2Rs/JiUZkfQ4CTHIhhUNtEU9G3W4b713zNAa47coaKW8DkxScnUgUNR6Jai/CLnP
   18.95 -lBt3MTs28aV/HEG3efguUzVZhUnrSsU3tTVy4Ok2P3+a88wN8bj30aFSsGq+v6Mc
   18.96 -M2eT6jK30uUpz144BSGMuOobauQI0JI2QgDu2UeuNdk5wQbsGuTs6/p8upFNg863
   18.97 -9a0PsEnpf0LteJB5voY9uy7FMNRF6kgoj/axa38VpWNx4WD2xAWI35/za287Vgm9
   18.98 -nS2r1TXiOnX1xHcD2gID3onVJrzD8VPYJcJjsfPzUfBsRp4KLl3gxdS4xg0YEVvG
   18.99 -utnOIPsKDK77kWWf1hmuI48xfALnN9EcBCJ4Cv4gQGQlaiIaAWMJJio562if3Nzw
  18.100 -sOcqqGn71kLw90v/xMl871vZtGFeNWBh8qFPO48w+5rci8KO5f8ya2dGsquMvuIw
  18.101 -7lEjLlpaQdKui/Fh68zWSmf5LzqjRCr0HiMFg53P46YEVHpDnyvPBPgzPrr9WKOA
  18.102 -CA2hB2Raf5bUgBPQnGor87w9QRcETlctFmgROSsysr9YBVQYYrqe69W6bq8kYfXN
  18.103 -G2gSOCItYJfSJiAgjZDlUpHwPdd4JaY6WwtfvcJbQJswAL6LRi+Yr7VHY0RyPX0c
  18.104 -rVSs8dtcelWTkl27IQ6OKw7pikDT2jfUOlQWGSatTOxGu5qsfR5yJQ8BY5wKHAkF
  18.105 -bpeg8nRHSF1wdbwssS6wJWFrn7vbTmZYavU3yLuQYAc4+wfGFwfv+BULfLBbyD0w
  18.106 -Hy+1aahhFg+aWs/0162xOKAO4d9+T6Woroy89Sr07Mn+wFROiPvskmkTEt3plJZl
  18.107 -mv/HWbOIY6PofKRXPsXZGpVgmmpnhiEvuvmbXagGpna65E5B5dJrFPhRccZi36k5
  18.108 -tNgpVEHz5Fn9l/hgEOs8j7Rw9yUiE862RD/LaiOwlOu/RqQbIf3yM4SUkFQ8Ef5Q
  18.109 -hi/rpmggBJD/Wc/2FJW3CHamXAoUdz72lKUSHf8sq0LGIqrIo+fP3NOr/7dywWPk
  18.110 -JBC0gODOKZGD3ZVfhWigcd6BQFMnkq7vFun67bz21x3n4u3m3eCDGMy5dS5cxx+C
  18.111 -kp2nq8p4qlsavklJPX72euPqli4oBNMb9EAVuzURsFPDAaXFxhNssTe20bU8FCic
  18.112 -/ghLgfv3Wot9yUcbZeVlikVANJeQ94Y1qphmGZ8UMJYfeoU61coj1W0fLwlbbkzO
  18.113 -otPBhe5GKRhe9dN0jTrXDXmBc+jVh02nc59LdJEyCsyIrjW5ypresxIJZf7M0HEx
  18.114 -JEfZ+Po/N8L9B/8h2I6xad7NUk0wrjROHsNUbHzOnYFQRQmlShZc8nV5A+YHSlzk
  18.115 -FP3A9grsvolwjkF71xbCNmsiH0tVosF6R0qteHeNHfdfLSluSRYC40BJqzq+sc7v
  18.116 -j6rdzjjS4AAsSwdvnz94BKUuSpD/0+ebiGcoQNg/8rwiZOXASNZqnoP1jX7A/cP8
  18.117 -e8OaBk1enYyQdNv4dq8G377rO5D3r9Vu3yX0D0UoYsvFX6LSniAl4385gyHw/1g8
  18.118 -T6EVLR5NOes+3L2HmEa454uQo6yOnYg9FaybX954dLWou3WgR/2p/K/0yWMGuCN8
  18.119 -XigjIc2E5Mt/VyrVImheLQ44i4u8x6KutcINzFbSjiJG0hIThCUOl5RKjzgKqrGj
  18.120 -dBbjq76p7FR+sJoTZVZ4qfd70Nmdi4ccQWfRXICLZGxnmYymMjfCc9A7JfEDl4E6
  18.121 -wGqDf7AKfsW6EhFNuT6a6d69OTAAYdL3ZhixbEOiNxOzrS1PS4T+g9/TMbTkCzHR
  18.122 -48ZJZb0/HS/idd9WXmUj02tSWYVtewxBSgbfes+fk0pM/zbiOjOqXgNMnPo0yngH
  18.123 -HBPs+/tkZX63EY8fk23UHm6U/6qpuMWFs62JR6kF1sb0MYCYY0rVxygrbVabFp5W
  18.124 -Gbdayy1g6mwuZA==
  18.125 -=ncTl
  18.126 +wcBMAxIi/jf1wsQcAQf/ZrKXlkv04gvZY/JINbR+vnR5VY6ac4bOt+1egBw8R6Ko
  18.127 +g9vzDT9BMu8EwoRgxT2TMI7xmO/00pj2UhNzt0iwlzlNSlYgKBJAsJBVSORpaqKG
  18.128 +i3H9jMQGpsMvRsyLttcd9ocsw8MDRXhvapS2BTmQxhgM/T+e/G3wkNcRM1nJti8x
  18.129 +rdShtpYLiyeoEwGni7mhST9JlOLgkFgZruBie1bU4vkksCwyUcJviYL80I2VNqsF
  18.130 +/hKPsYny5xa6YSRadvC19vDztWgZoYH1izgjEOAPju62QotDb+eCwam0Y5zM4qxs
  18.131 +tKDDpqOosnD1Dz53HpCrsMOBOKYjElv7JPniMvVv5sHATANmnSPvBHS2pQEH/j/p
  18.132 +l6/XHga04ucU0tpfuiPGZ7No37uZd0BcnEvTjF9u2kIsMcQGuFE7fB4+qzXYZecO
  18.133 +9JMiTc0yqPjcCHaCAHiCA24EXKLMDG/uoU0GpgkMd95Rmzrlbo93K9GzwKuNZNYf
  18.134 +cjjYha23i/b0VaoCqrIQBESaCE9uD2g8ESovOZO16SuKi72vAHqwZzLlVnS0pomo
  18.135 +a7u/NGHdDVo3aXeshXhVjnqQ/O7TBBPFbK5tWiuk2HF+2dGVwwxYBZ+lcP3wB77k
  18.136 +XE7pcz2/8tt6kFc5FIbTycTSK1wY9Rzrv1qQenTgpYJ17bgBQaqq9C0ruFzwrIvk
  18.137 +houNNwINHj/HFCeSo4LS3O8Brp6bZIVcduuarWQ1g9ipPGyxLcGd2AmytReVEock
  18.138 +JCr2hT/fMBvi6n++z2HRTmknKy4LXEQZA6AsHtOBKPQ5zDOIVLHF0cMHJEVHRNsP
  18.139 ++E9lV5vWoeh00BvF390UNeP86sBLy1tZCJucxjg6G5Ip70iPJ9bwvmMi9O97e975
  18.140 +//43EjBouR1G+d+XvmSPXWwyHVgdbt4xurs7U1ku1DcrZgvqHAd8CC+RMNRCIBSi
  18.141 +xg/OMnsfucw1CF4Kjx78iME9BjXiwJxA60FGR97rieZ3lmSgcgV93Y4OKDyjmXNV
  18.142 +C89rALIqHeB692e3q816hIn1WsygTlvrP8W52IZXT85EsO76nS/P4dccydQEDhKh
  18.143 +QsR1AK2LzudWJELbJNYKhuUAZBXQ0sKzg9XuHo9+nZqqu0Pdfaz+jFVuTJLMfeAi
  18.144 +HGW5kqK1xw3ghH32Sh80FMdGDqKDSoB92jaiU6lmZ3f/8lQX8V+2tvGJn4dRdd8e
  18.145 +wvTPCOx0xRToCYmn+yKleWecgJHbk6i+V2MHPsnIkBGN65IAo83HH1lKWI0O1kCK
  18.146 +tE4i+z8Ipdhfi3Gt922CEHaTb6V7khm+LfQ1Z8FtCfryqlKXMeAcUaVRMQh0OeSd
  18.147 +lQuztB63gMwhplubPFmZd440sSfkCxerSRvvRvplRCpzU4nThiLkXKmqwLYXWtvu
  18.148 +9XLfDsCpaub4bSXHESgVGrD4QzKfu5LcZVLBSi/BTtSIS3htHCFyRMNXhqPFnruI
  18.149 +ww5iIriTWY6u2/WFh6MUwEz4I5EngNx6I4w/5LeLNwnPcnwgH6Vhsn0pwPPx3fgB
  18.150 +Pm04E36oNaqRB3dEE0nwnWeJDv/lZOlDQlW7VeLjotryB7ACR8nHqVT99xpluwJB
  18.151 +LfT1CarFFgKboOMVbeEy5cXh/UjsnWIqCX2Il6BhT3QKQeYe7PnJZRRrZ+JxX9XW
  18.152 +CnFLvUImfTYlqZ2bcohr32tkFdvWg/dS/RwxRbJNAXD7o0iGEKhanBxDH95NXpQR
  18.153 +HkeCpbxgOY2pPhIdboIPZDLD03SIOaWQhrk5LHwJ/UIMLfRTn1vZEOUz9tdqqs5l
  18.154 +hl59SqAeB1fZKbhFXZEFr/pKa84Zks61q1kAE81/9FU2lfxtkbRdxCKV3aAOMlj9
  18.155 +ILz2Uwty60bbUrx/AKs/TPxmTBRPRw199qr237xbslOmnJUx1iWAn5xKSEPU5voJ
  18.156 +gqIEFWY4CPP/P614SO1Pf+2uiBSVE2RT8TCPmT3MgjRgSuHI5YYXIKDXxwpBvt9J
  18.157 +MQuHW616o+MVi+0KGrbO/DMsKuG8u6FcWSdORTCYGgWSbPeq3z4OrxkSCU6gsDIT
  18.158 +/imQ7KJJSfumhDdb1tDikJxR7ST11TdSZ1I5AYAY88u6SQwB7zdnoA+gICR7Kt/i
  18.159 +JfP4mRXC5R8NGsOoij1qLTADA4tODl03e34+ChtfanshoONNQXlvJ3vHaN4KqdDb
  18.160 +9S1xXKty8mIU7hpz+R/HxbTT8itB2fM91dEM5vjRQFWRYVv/hOwDN5paiJ5AnSxA
  18.161 +dE0mZSubf30/FwR1mjnMOQWPWm7vzVPWjpOWlaV9IgImz0vBpJ71i0XspQ/KGpZQ
  18.162 +OeG1U3m+B/u8bXKxpzrKTtR/J7THDsJw8ObVyRWM8N6VnpQlGxSklXQbl3quOiVv
  18.163 +IAR8jmnEPUeToLtpp8yQ3N1IU3T5jeuNBqcxNoabeYKDwJjgfDiDws0XWqtp8Ypk
  18.164 +d0+OfeJaWlXeuVeF+p6zZySYezR9Ktsh3NHu+dTfip6MHlHP6NcrzOIKgHeqacsU
  18.165 +qqvr0ugZwAi21cLMoM1sRnn5ApbyKM0u/aIT9I5gEO/39ZMeXwUAA1tCDsIuH5Hi
  18.166 +L5saVSWFpdKThxnKhsK3Q2hrJW+iJUHJd9zg8UxsVBgsWRdzXMPAVYxGk4TtSkG+
  18.167 +utXs0cgzkIPvYyvIjk1L7WG/XP584aG1GaD93KecLGvBbjJg+GwCAo6EFfq7axCn
  18.168 +CfNe7itQGDPPf7PyBrolxH7IIHw004SBBgCkdbdtqKuKX3hnatA4ipVxUX95mCwP
  18.169 +G9A7glfsC8ZwcFjixHikYzIFV5u3j599vAR7FsFl5Pqv5h2QdNoYq7OVU7SKRKs8
  18.170 +Ih6igoCzo6YJ6Tq8vsZdK9CUZsozCIXFGc4A77OOj7L67h5Z0BBP1l1fObDpEneV
  18.171 +Oi+QxVYo6KSMkZsZmIh8o9BmuLHu1mpSJcmhqUSsT4oapt97MjcRVvGMNEQogEGi
  18.172 +aWGGFeWz1cG1PG16XIjJqG32nTBnlQpHbxvP/w9EzF+Vb3AktMuejNQbT8acXSbw
  18.173 +XWCyRKnvQhM7qCW2C3TF92/fpzpOpSe3+34h0Tt8+6OESzYiIghhiL1CPQ9pMcFX
  18.174 +cMNcDZu9rMpfbSfUmkkgKpChdXZdK1fcJ6F9i+JnuDW+N79t6riWo6r5AkgCRmBG
  18.175 +sD/Xcd+VYRiUiDZZQYFcKKYNw+QLQQKg+qWToiQFnYa11M1UPV0SHY+qlnwjm0Fz
  18.176 +FkqZJ6DYP4Wbai43k310gBIFG+V6o8mWp6LzWHddKRyR80yCBqippKFcGE0S31kh
  18.177 +Yl825gSuMvVtNXpEbH4wgZbB3zH2hTfh/1QuDDt/C/F65hr8fH0Hf93y2XNq6ZAG
  18.178 +qsqngVSvY3J1aPanbKZTvBI9F/fkGaYIW8Z1KKTLjBwzL2gK7hXK+UzkjBJ/TEsL
  18.179 +0M1D8omipOj3PlDksYd5NF/yiMbIh7XTR5KbHbKrZE1/dyCWAajzgyBJ24XUpEDK
  18.180 +CCh587PXTk5CxIjZHGNQkCZq+r2PL0DUqzHA9AYEXqn7QfV9BBRv/fxOjVxGMI65
  18.181 +Dn1IceJ8Scg0jkMd6AiVey0wto4pC9jfICPnZjuFu5rICav6SgKvlkATbvZTk+GW
  18.182 +Z2OaB2C9H9YvwXVjTPFKLDFlhWaviK2OHUp68zV87EpYC4XI5/fL77zuf65VBhtb
  18.183 +uH21NT97KsO7h/PBZb8+TWwLvkzz/l0QwACHvq4ZdkW228WsDuz/Bgzk3TY7jfqC
  18.184 +EDYiS9eLCPDNPHOCA6zIueeI9qIcjISrmI7ZM9PKvCMY/T/Kzh4EA2pvJGpakcDE
  18.185 +rNu1mXFI3t53xpfr4uTGTW9N6+e5WHmON1z9MEO0CGcxdBS5fELLMUbGwf3ma2m8
  18.186 +02EOmAEgl4++DHYTyLfEjvUxLSkqZbKkEmgXX+VZheKrO+x32SsgsOqi7HzD+IUQ
  18.187 +HDgr7vXjDLkUZSpc1/dW7s/vgXz52iJclm6Jzpo97Lx7ClU6LhSUsxk767HqsSYP
  18.188 +cBBrrooDtzqlhMrEVqEgyHLyF7vEFAzNqhx+ev07jR8uNycVQw5jfxz6EmxXj4et
  18.189 +Ce/SAF90mSyxBJTNGBI8muC8TZuAkolfGb1FzYe2fFtf87HHTJ2Z8us5XVJB8U4b
  18.190 +GluWmIcvnytDiPvLsV2ySBKygB68Mo8RHJoa34+kQIm/e/YtxDdXTkNa7nx1eiM5
  18.191 +4GqmVDnq/W6bIG7HW2DdnG9Jw3nzupeixP+AGMM3y58Tcdwny+kal1/xfntkr//E
  18.192 +zsDgVFwwQ495mvWqZvHlt0Zjvx5IoAVa/i8MXTd0i1+HhT/6cp93yUfHQ7151it1
  18.193 +0SLoV7uX2dIXHcYLM5eSSF8p7og+mc0c4cv9IkbKyUm0OBlJTOpy/1OjhL40PpaQ
  18.194 +Gm3K/j1RGs0Cr8hCAsc3aMDXPeH/bFzMFsMu5AIRBy9zCOlmekMZqmGf761KaX9J
  18.195 +7PxnFeV66h3zUHMse/fnC8C22WjhWDqCty8w3vggYH5dnbtol1GnyisbjWJsTkW4
  18.196 +9niBoQfb+1DtJQOC7k5vft+A8VdnlQQm2F5RpmWqE8jc3H8u8p8ofJesL2aygpOX
  18.197 +gMOnOI4DHBHXtvUImH9XDClOg1g676H2/h0THTvwtnfnWFo9zVeMPZMigD1LpzWp
  18.198 +AyXJVHop4uwbQW64nqnNXS7tiJLUcb/eoa2Rp+WuGhA0dMrXIDAxxVwaArs297lV
  18.199 +vXgNJ6h42ODOk1rjjP6a/LCOsALAL8+rq2yUAy6cSPmCtZp6ARbguzjlv5YDqtqz
  18.200 +NqiVq6087EP2Tjtv/CWUvOlEzb82X9hqj4OeNZ6Om54Kwa6W+9fgkU9mVmSZkzVN
  18.201 +OOScDS6zjU5Qu7VmYyiNGjmP1zZykcevEV4jr1XOLwfjSofUloutmd6kW8Yh+5LA
  18.202 +/jAGEWquFep2gtYuCcdlGjbfijgzHF2u1CyxKIFtjh2rP23ZkmYhOOt+/9ungSgw
  18.203 +ze765SedAtSa1EDnuyv6LZuazUz6bp4o3HmDGZ1vyJd+NpqD3IzMR2ECUT86bH2R
  18.204 +eB3isarxpFlazL8+g8Z4n1HOYFMLjX+Vam84wvS9hffT0bMI4hjAqDkzeTyWJUl3
  18.205 +0iy85rW0w/L3WFAm6D5jgd6fqAWIcAd4ELDFyMDfbPXxW7QA9bm2biycFyOGnO6d
  18.206 +e5kqpUwTt0hVjdsEhqUISZi/aPmWGN4N1a0XOLnvE6yQMab/XQJQ/lTQ+OIJG3B+
  18.207 +LEV9T75etgztXnAh4IkYpQT2yP7C1+htn4j1m1rBrKQauHk8hfSjF3anQQhWgwkk
  18.208 +Ka1ULuUnXP/3fI9zBDExEwZ/o7GLPwKeyGwFgPCi+4J0uFBN+vLZZFjsxVwpoDUo
  18.209 +0cTEgEK60ZgNNKN1HKhGsMwQmyLXpcCeYqTvY6NOrBf1VCiEoe+ebWkONi+K2Sc7
  18.210 +3fY9JvmvxsGVKN7dpoqOukA8Dm3zHeQDyZhYDtaH8ZZ2ah7JQsC6yS8NkmdiWwE0
  18.211 +wXcRS8JA3Uv6V4tnbQtcAzKtFuR/XL/6PuuXsgzr8u86hjM0ORephnCUjUC2r1+T
  18.212 +iY7k1+dYSz0hhDnl6yJFietY7WjtiTAwwlR72hrSCyQuZnMljuUtzXfVokJgrZJO
  18.213 +PqSNo0dvM9eJk9kxJXUWzUR8jnjN2Pfkre5YbOMucHe5GfogH7fzENq5LJ4/Nq+5
  18.214 +KNL+Rrb9R78Hr0nyFtOglWMFzc8MZSlZIV/CJuB9O/G1hBAQQnbTQAtF84smBD3r
  18.215 +QJ1uCLomgsA0qnf5y2Ci15XWs2jXgXSNfBcyPUY41bDiHdq53HyLsiLWKpVnwmhD
  18.216 +0Qz1HxWr7JMOtnAyVkwXQg7pLGU/P5+fojPkEmnGu7l5roB8rtCuqtkIsAnWhrUc
  18.217 +JhefTci7T2xXchmcsD9VXTUZZ0qlSmDnJ+KDLRjU7T90ahdbQVBEPL8QHRyoNFpA
  18.218 +ELpDPhmZfw9Xg56A2rnenvNMeuhf6eq7rlcp72OvUWwL0rljghT9v25iJTLM1K1J
  18.219 +O/evg6smzu3wpU8CHwU3Q+r1HphQ8ZAxZyQF4GWxsIgqbQILztRvgV1ZIt70HuWu
  18.220 +35KPsEKLabLEqi7LfatYNOPQVeqKVYX+8ppOzTwHYLBrjQaVNbZhIKYwmXgq5QGB
  18.221 +BkBeXRmUL8u7ifdozYvd3w2Y8O4OgBtfAqaFUbrFEe6x0FfxGDB/eQLtbYb4OwNG
  18.222 +VIlREh+K4KBm+Ci7S1SW84m5WpqfZa2k2STQEcFKwQ/shXkxCdUPwtDkyJK55Zxa
  18.223 +AgOdUN13qDXThrstJRCrQsrT4kW+dp9FwxZX5lKwoqZEZGgIo1P4Y5f9biBl11Xm
  18.224 +BR4bJFjSpKz3kDMrAAyu/4Zvs0YPA+io0b85sc92D2G0Vbkg7Ci810bq1Et5Lz9L
  18.225 +QkrksPThTNGiNcnxpeMqVZLhAwmt6jUs+GZKoJtFzwhAlcCjSyDZLlnChtdTBrNV
  18.226 +QJvWBwQYuGin9Rh5UPR+y9PWv3+53Eo+d4ssEdJhWzSMTDyriCj92jXaUhabEPdR
  18.227 +vOq2DWR/kQU2guHMYXcYFZOjTCUhoi6iAtWCC80bGjW/y09XfFM1KiKySP6upwv7
  18.228 +FVK2QoLSMxev5oh6IQuBfQthxKzSHKtbxJKDwASJoh3yTF+sIiLwvaSOYx1aFsDx
  18.229 +TXZsbrjlwhxUWNhjZ9woZR8/PAFVI/hKW0sDW13jmYTJhTsCg+KF2B514UunyPev
  18.230 +f6zatpDzWFd65l8T7XVJwJUQhhJD2taW5Wqtan8XhDom8AgTj/f8K24B18ngi+jf
  18.231 +s8Hy450B4L69acEznvWxw8uYao7AL1AwRm3gCyZFAQnTgF86MhvE1m0lQhGcpdvV
  18.232 +WpIE2ZySTE3635W4w5aouTEMHOABNgi0ZDOXIDpvXbTC31LZkXeMAm1qucYkrNda
  18.233 +gdu8aISbfz2VsTW+FzQDoU0sTCh3Ry6JKB4EuriqfA5kvJozQEmz/6QklzE5AtVW
  18.234 +28Bhn9pItthTFEH6VhqhhvSN8Iyi5OSyHyBrzglFVUpvFl/1J28fE8puNTFqAWEW
  18.235 +9PmZjU0x3W7h+Pmx17QzHYer7PaUNSwyCL+3xw7Xnm2aVosFj8Idl6ihfbdDxVvn
  18.236 +UzuQtcXL5fevAx7LOCVAphdIYzt/hYdu5OeA8opeeIMvd2R/WF6fLYlieMBrx+tj
  18.237 +E4Kh2niNqxd0GkWmVWf9RyTblRvAyviSeDTadkoqkIe+7mrWEGXaFOqNIZJkPwQk
  18.238 +uX1CW+pDHu7UAR9FcNe6LKMydsbcuZ9QVLpEQ237iDqU3niDpWI7Lis+Sq12YP6c
  18.239 +2ptZOx/D4pLezHIg8vchTVvxvvok6QE30wStOQiCtKGgQjcLIJkM8+MxZvd57Y9H
  18.240 +hsgJRrt6smWrc72YD3IAvSBpMEJK2Y17pkxb+DfzZzKxQdFVL44uh8NlPcTA0bzV
  18.241 +UFZDw9DW3iS3xfpjiNJ2vIuu6NCcRIcadKfc+Jd2hUZPKg0ODXtA1nyvVWaCiIty
  18.242 +Ku8aojcrarvI6QmkShsr71i25q1Z4NPw4QH2uImVT1Yo7EJkRCwUr8fseRA2nVor
  18.243 +5WcUxTQrgCtQWbXeb+O12qgWZlvR/tSW0/I7iA+O5Ka66DYTYY3+tEJTZZ9Tcv4M
  18.244 +BOznBp/uyUk6Tz6Wn9sFrrKSL9uBNKOBGnxK6GFNbYpzy2HMejYD64PrM9lOb+1/
  18.245 +RRItEvW3+fjNq2ozu3G+4v8mfEevmU4+g4GrGTFzvkXArHuknPkWfdgDrDBAj2A3
  18.246 +2Fyd8KgCcTtYUHDq0x6/DHIhMHRnIa6dhEu0uxZOG995XQWwUdKGh2SvJPuKFJWt
  18.247 +u3pU0AWjS1QHpZ/ad8yHB99pGSA56go7t1N086MIT1Yhink82rBvJjKzxDfQ04CL
  18.248 +gNC0Ai3TmIe/gnA9pM0EmKXAK6xC8Fh3VbRGfh3tbhpUzqS1Z1tx65xW0RA58ANn
  18.249 +ALamy+2sogTN+C+OkBJfqMc9Fw/8DUdnJu6cPGX1IlW0ot8pmXoQkEGQae6N6j9H
  18.250 +cHfvTq5mBWUlsDQBq5DZp7BCQNZ4SUkDA6rnm+P8dO51rYbaV9EbSbWGiQ4KxHiO
  18.251 +0Wwv14UoBPkNG22hu5pyEe3/jr+gxvnS+xJrByHEQv4FOn2irvYXHthEsYo2pazZ
  18.252 +dID9w7jlc2vRYK6KUE8jBLjRjmseGK+HRpeMq2zj5KQ2i6wmBvsMk3P81ALTDCGv
  18.253 +XJ+rTtU/5QSihQd/ZuwHjUM7IGZ1rY1ALGHNDRJxF2SlqFYOlrCcA27Ty9BRuyw+
  18.254 +WwYKQt+yi8cYPpqzEnDorGBCBW5eJE2KxRqwTeG+WOH5FyaElYgckV8wfRkaJW4u
  18.255 +fbmJM39ysrN9qIwZL+h8t+wgG5w6XbjycooN9URz1+g1ktDK1Ara9SI9gp6v38N/
  18.256 +PdIBOhLHNxVxaDaphakRLt9FOPNMFOo19ilmTIF3GyJes3rRBcFo55lPdFr51GnI
  18.257 +cg9m0ZgW0iQFwVZgW5PqkXsmNWZVhEB95r28QwGgiOr5G4BmnPA2wcKgVi+xw5tl
  18.258 +nDH1kP5oIjUVYJLLLEtzVLaWVDLRI0g0qDlu3Ex8LW0gIgcik4WPzB/p9pX0fa/E
  18.259 +hjxx12JVMmjh/pCiy1kh/EgfLzd+wYK6LWV4MjRe/fBRWigFTevGti33sQ1HxYtU
  18.260 +Mpjr4RZYqGu9wE6ekn7YbtRLDNNMQUgy3kRJr2H0j+bXaahB6Yy2/ZLt/yLErn8s
  18.261 +EupH57bnRHUEqNrisiTqzE7zo4B1RDE/YalReEgNZk03NKO6OKIf4jjAnbL67dJf
  18.262 +yMmb2P1by4rXwrHP4TEuDvbhjQ1TVLlJIsjqyTwDzQ/GAch/MLGUznFiGKK5UYWl
  18.263 +dJCHGxNyjbv7vxT3dbspDEQCf6tjUb2EV+O8uqECM1jIglgJgX4Lc4IgNAlUe+WU
  18.264 +Pc0l+einKeWanetF+PyfKgUtWWu/da+pZoaLKscJ7q+1JdH7CWeIv91TaO3bUlQL
  18.265 +L9cMFIOElHcqV5VtKY06vFGjPo0d5+7IzvoPqJ+GuVB0qPAHptzoOWTPy+VburZb
  18.266 +kiZbBPDkuoe70N+QQGWWEZGyIt3yWxCMrXW6JipXdbbaHUXINOk548+bLHssgAP5
  18.267 +A8Nm9XBhOdBxt6kx9FWcx91XRW982N99SnMyKEx9sytB4T+jZsDhQP2/F38gQ51b
  18.268 +LyrOx1CCjQtqdah0cXd9fTXqmrGAoScRiA6tH3uiRZnJ7ByaIGWIi9OW/anEmm5M
  18.269 +izJXSq9OoAZlf+EcaI5qkHcCs0ieYB73Zv02KMovmCum1Sb67NOsQFtvwX53i8sr
  18.270 +VmriVbGJG3eUjHqBGjKcZh/MMw+Vm3wFVNHpmnk7hNG4trUhnVfg2CladIKggLI3
  18.271 +jaGAexBDekQqSVGHem/1KdMPGOa0zqTnryBWzj2RVLUw8QpjtcFmYbJVu8AnivDO
  18.272 +keUPmhZHCT+e5RQTS1VnhBI5Vf2XaxiIdExkjPA9CiaNpYqKicjeAWMpFn+/WOT2
  18.273 ++yfzhA5yMiV2wap+1RYdWv/D86x0HAaSEegWF/kgovVy2Sw7xnlPyoNwqc6ep6lO
  18.274 +IW4DuISzKIc4Xc1lVXZa7rMuw3Qu6faXOQ2VZFb1Vrwh+nyl8RfktMPJnAV1bRGs
  18.275 +Fp8L5w063Ucpq+0Lo2atVuBgJQz60TR9Vs9VvTeoyIuflnnBUTANEBZ64VrVOAw/
  18.276 +3p5Or8dBjPdaFc9gdNZN3vJB/r8qtSSgFpxzJAyjYo6zGxxyId0f6q34mXbKaIco
  18.277 +QvA/cYHhhoV2CCjkeYpAadPaYKUjBWbrNrCdE3IoWK1GF6JM3LMF/WhHfP3nB0Sc
  18.278 +hO+NnsyDIxO/byAR5+MqMWjy0N0YzpRBfigoz13MzWwDY8z+jXxSSH+9SFRGDlFQ
  18.279 +NrVSa/I+yB+J4BEm7BJVn7Qg+MRzpN2im8nQUGxFvkjBr6/O+u/rqvrmnDSpIAkf
  18.280 +1whOFZU0a7shOfal2Njeh9PeLfUy0UfN2ZwhSEIIoRggE7YIv/YmXnkMMcanKWTg
  18.281 +Jqxa+BoPFvuiYC8HZmkCMHjiBir7xaIIUgEezuHS4W64eMUhe5l0GURTx3JZneA0
  18.282 +4yy31+u/IWDFmZqnu+GfvTuulWOR3RwYPpbxkWziRGNd1DKAuq72l8ya5k6KzbKA
  18.283 +RiWjA/lbm+lCmeEeVIY3XB1wReZbbegw/F4XWs95ZQudERJywShMGSGk5775saSC
  18.284 +W5RmHzg1XqSbrb/e2euaubwGtxV1DSOAWrGVTIsncNkuZ9oYCAfvqhGckqISOO7p
  18.285 +7e8K4xHFsxBKK9kOPH7zRtnGNkkMo3DT15mrYuShdrzjMfF6T/gxW3v9PoB+TJLB
  18.286 +KhUk8/wNF1e3z56ejDECqUv9edSNv6JQ9PgpdBySQO7IWH9QAMpPvKHoo2jVdoNG
  18.287 +QNtQ+WaBDsT4PpFynbhi/o/9whMHMOzV7okz14xgMw2szVmDEBfKVxnbG5eiPINw
  18.288 +BZ0tcmKAetYSIx4syGFk9+7Dp2Xa2+1S4Y6Bl7mWYJS+o3TJb+XWQK/81FJCfW1x
  18.289 +hjjY94YECoIM+NVW1EPZgLj+gl9RE74TNaZJ/JZllrTC7SVcoe4qrN+0AxUOHCDy
  18.290 +GkvdltwQ2+Phnd7tziv3ysFwDIGBXRVn/d9w69OkavC5YyQ59rAe1ZCLAcU7NAV5
  18.291 +uzqg06ZCm1yPmPwnnTAP/fUv+czTF2Pj4wYy01vVeyp1ehyyA8nTgdsquqerAR5X
  18.292 +W4xvwZzVt97lQQHL/EfeuBPJamY+30LTrCOpx/t3Cmx3NugvFdHjLh3rFScViZ7V
  18.293 +veHPufOoIkpktJvwNqTRWwkKfvpMdhA+aYzdVeV7hr8H4J75rmxMv1HM6ZRWE/8g
  18.294 +CqCBmJW63LoJ/+c4g4NpBOWFDZk867uhbfUyyxprrfnQNyEyvIMWLVkcTaKmeQVa
  18.295 +lVRYaHqgbf0ez3ijIz9srj1QD4xGHtrsh75fCHxqTxk=
  18.296 +=Mugq
  18.297  -----END PGP MESSAGE-----
  18.298  
  18.299 ---7e23a74c7397f0666f31d87d17b86a89--
  18.300 -
  18.301 +--3f2dba317c83e458257130a362bbd95a--
    19.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    19.2 +++ b/test/test_mails/check_reset_grouped_own_multi_ident_one_fpr.eml	Thu Jan 16 12:40:10 2020 +0100
    19.3 @@ -0,0 +1,728 @@
    19.4 +Message-ID: <pEp.Q41S4Z.0VXP96Y2Z7294.CA5CC6CC-145E-407A-B9D2-2D286E3884F0@darthmama.org>
    19.5 +From: Alexander Braithwaite <pep.test.alexander@darthmama.org>
    19.6 +To: Alexander Braithwaite <pep.test.alexander@darthmama.org>
    19.7 +Subject: =?utf-8?Q?p=E2=89=A1p?=
    19.8 +X-pEp-Version: 2.1
    19.9 +MIME-Version: 1.0
   19.10 +Content-Type: multipart/encrypted; boundary="238e1f2946e87ccd3d1b58ba507ed7ab"; 
   19.11 + protocol="application/pgp-encrypted"
   19.12 +
   19.13 +--238e1f2946e87ccd3d1b58ba507ed7ab
   19.14 +Content-Type: application/pgp-encrypted
   19.15 +
   19.16 +Version: 1
   19.17 +--238e1f2946e87ccd3d1b58ba507ed7ab
   19.18 +Content-Type: application/octet-stream
   19.19 +Content-Transfer-Encoding: 7bit
   19.20 +Content-Disposition: inline; filename="msg.asc"
   19.21 +
   19.22 +-----BEGIN PGP MESSAGE-----
   19.23 +
   19.24 +wcDMA+k2+vmtOIxsAQv+M20ZUpGPTNSM8zXwwS+N5YRNy4rMwSYq3SJIzkBnfQzB
   19.25 +2lTRHbIxKDU7OKcDaFziiNMNj9KX10ScdcAbyIMq7hR6f4qR2adNOndoZwMHxt9Y
   19.26 +5R9nya2sT/FFQMyrspxECNPKKP1JmT+vLWszytVEboI2bDteICpoD74EHy8NjUdq
   19.27 +5Tky2GEU2Nsqp+7nCpj8pRkyWPhOGBN/JbPRlZaqXlrgyCiT1UtkTqS2CGX3VNaN
   19.28 +nKeGbH5XaoG2AxR5ScmNWPUJ2/b1dTRb7ePJwGfkuPOnBsQ6lYP6mPYSnqjmwiNC
   19.29 +zSZpOFrk2nP320GctY+2r3kTayjlef6J1OJMo1EoMa49gPzZsWXq0KYxSG3XQSwi
   19.30 +LpLvSaUmXuQqjRqxLMu1GyJmb2U8WbLqiJV9gPaPfND5FCeq5nnCYJGQRbgT4zv9
   19.31 +eAQo/eRwQHlY9NiK/kWfsBcPEN8B/jzSBbLxo4toFyAaWhcqGMZ+z/KNf8M1gUSL
   19.32 +5wax1dFmgi/M9dAInHs3wcDMA+k2+vmtOIxsAQv/cuOGBK4XCcpb4aR6zr3D8yzP
   19.33 +Sgrw8Kx2+5Egw4f+Upk0u3t97peCEIM2N3mXrVRnDfQhlU5gQQZqxIS/b1awB8+7
   19.34 +/bfVRjADzpwGUIEmFigwNPONeUm8E6qLQqLo1dT1ZZe1iW11NpLmyA96TrvLTfcn
   19.35 +sh02pUG3KXwJTtJt2cZ+C4ewJ6kogYpsEYJuNJh4w1+CTzN89WpVfhj5MtLC+mHD
   19.36 +JXntNZ7+jmUBck8YmO8DYuMKmLlnxbTUQbMsZyyPQa8B+t9r1Th4098GqVVqtG0F
   19.37 +9ruybRFJDn3Ye03O8LZkDJkXiCZPvR1XgvlOi3a8xOQUjdfCYOLxeaiI+/vX0UQG
   19.38 +LwCqmTmvcYLiVPCABM2ZhPV1WkB3Li7EZcnjWQRynAZeVOblEB7+tepslocq89Vn
   19.39 +3u+ES9fSfCbYiIeX98PFNh+hUSVF/O6+cpTljPTJDgdkNiZqaoVlWEX3/p1rgI7y
   19.40 +FYeOanS9Z8aw0knXyaDYRsiN4j8asBF3bxKwDPk/0v8AAICzAWMF8xQpe6IxL7fp
   19.41 +Ujc6Fb5sKPJs2zsPu0e8zLoBz8Lkj8JyHsF+KjY20cu6kcz0pQsJhVYRyyUbHZHm
   19.42 +mW7uzck/mz6CqNV5Qua3QZwF3kPXQSL1tWyPgnFzbCKzcS76vr/w/Pd75L1qWbSO
   19.43 +Veo04R+ZzgpKKk9W/lHPe7i5H7h9criSQmM8Sd41yjXipHJEHrauUTHMN5JRXtif
   19.44 +v9uuxEBBHIvoz6+Dh/LD3Xw+sYNr1NGfXec9fqDIx0XNOCtjlDWAoqZdeNAg1imv
   19.45 +1gori/ONQeU5lyiE7F0sP3L6rWS2dHRPx6++0qWsQkZ8oVi6b/AUZOjfJvLKoUth
   19.46 +E1wpsA1g1458oE6ULGKBILsVtxnUBjrVuWe+4HBvDXIto9aIuflP0mCJbq4JDEqh
   19.47 +u18ao/RUd2UyKplemRScIFmxek/LpMlouHI2FCb6P9i0nkfoyhg8rHFxujVLQnFu
   19.48 +SHzXr5b6P84DqG0lut+fDEI3dysstWsvQnsLZMeTcXkwrvv9nevWjjOxe02zQNUm
   19.49 +A29ywMUAzwcV7z1M6FleedGJ4zcHkU2xor4Bicww1j/lALHCJtFdbUsz+iQvSs6X
   19.50 +8/bGIt1qvYIyEh5hrzUxNV0HvRe83TifYvr4KHJEhBok5eEB0p4c6B9LO4jw6oih
   19.51 +O+i/Q7ZMN+wUsmaCmvK7ym1SXIOE2GXlkBSwBaQxvdbLKx3pHroqf6WRrxGUMT4O
   19.52 +wVZhoITgtyA0EQALZmSOGTM2DcWdcoUJiXybdQ7cM+UsI38LwnRzbWiOexzPyxYn
   19.53 +Nm23PHnpFT56RrqPQM/6aJo3r7riomNn/KC7S8UCXAbzhxlvyxlCjdIr17eQt/q/
   19.54 +Pqc4Beif5LZgNznDLsbsX91o/5V3oYonX60GmRrWMsKzOcV51EMFrl4Gl34tZyOH
   19.55 +egVtZoxkexET2r/bPmq/P7Kh/PVSfwUnUkUgQIMa30M7S3pegGh5ljYAdNNywyGh
   19.56 +WdBlJwxf1c/cw1oYOK4vR0newfOzZPGjacbWDw0K3zrl3p3aD3RexgNZF3D3TcCB
   19.57 +mKo1G7krUBG7bvxAMpkbrFLD2diKuRhWg9NwvvLVc2kmkxeqFRgSbyHc5V92zJLb
   19.58 +G1RX+mMvd90sv7jmS6J41Nbdil5dQjKyhMv23cGFjZUTjW51EouHIFp+H3iRT6nd
   19.59 +jA83xh8mzsERQFSyj0rPfLBfQA3MCQ8yoNfWPNFiHRiofyBwwek6nc9EyDae+R7I
   19.60 +epawO4qlsudqt4k5TvBwdJGaCCrJb82Jwz+0hz3SOtGjFqaBs8EDjQsHvU3gar2i
   19.61 +c1l/8vdj4/SzgRbFQqvXVh/WzJ8yGZicjiocjMBjeX2qKTBCDHa/gygl81DuRVVB
   19.62 +VMzqt4tuLjciTqZ9D1fZyF6Ai3fy4uAWC80UN6PFBczacJT/sb5ReE+Uoz+7eUiB
   19.63 +7OMwylTY1uN+zLlpBLP2axf1sw+cXcQPpmC8OD2Tn4lKtCI4JQmXIaJ7CEQtEXOq
   19.64 +tX1mOPIRdiOClEYXi6mjmsn3Rxj3fQg8wlhUN6fDOO8Ad2g5cWUv9JQOU9RMy1Pt
   19.65 +CKj7GPRplcMs6BNI+0AHsY+1h1CWGNEbVyt9Sr0qdcm03xa1NFwwBP+j41sKMxlY
   19.66 +Nt+ilgKPz7oQCi8SVpiDnxxmcSApo4nNFGBtfQxUwEMGsYrnWFr2WgfMYg3RWR6B
   19.67 +3FQYT2MYAasUCxITBL/BxD2ECk90Y5jmXy68E7eeo1tPSd0Z+ZUKIXBn+nQtOfav
   19.68 +40vA9zeQ2t5WCwQHWxPM9/qs1PkV28dE02gPO77pyQ4vVh/nGl+P/09P8snX1f5A
   19.69 +ao8i7qWDo8U4f47s+x6RZ0ftxACEt2RJUGZdmEohyyXD+qKwafSqgGj65KkRLRwd
   19.70 +ucNqwEN739qGkvhPlLCRUbnzESbXVQNE5D3pIZwaI25AcGChzoenJOqUGsr/YZhk
   19.71 +3dJTHC07d2y8S0/41TktbvPxu2QejTg9XIAOmfnLXDJz3oYaK6Kh2cRXboLHokZh
   19.72 +XaMGxXKlPQmphjSiseY2uciw1aK2esO0FKSx8weFRKkY9Upp407eGQ3/L7UScCxN
   19.73 +2BlRQRrD32lRxk5CE/1t5wztgt7NaIih4b5rfuTnUEs7fnh6mXtpIgV2w+e1Y9Zx
   19.74 +1B8WG5pYefksDGAEzNTI5/hgcZUHqJ5gV1qLwH9bz4xVvJsFZ/RUyIUQa1+4WC9s
   19.75 +0EDRtpz7itaRDh1D3zJQZoHBEERBeFqdPDQjD+ceQqNbYf3fZ3lP6KfYY9qEGVY1
   19.76 +5cDIOcq1n3DT5IpojAdc7PJwhqCipUYKMDgfX21FXzh2jgfMvUnVOtIUv+woeM/2
   19.77 +1rWny/YAAOF3egs0gLEPdR1pXCpkzzikKiLOmW7ncnVLGkLwrAQBRApb/xnlTYxW
   19.78 +W+xLBQjEphbot12E28DqoriJQ/tLSkYreG42eXxqn60/w8Fq06O0Pr0lWZJaWpjm
   19.79 +yxR3uimDJGhnc0wLnDpeTezTl7ZfGjKfSQqIzbloi+qKzhXdcAci1yCX19DpoVE3
   19.80 +gblIlVDbuXqmOAEa5Bhig1gvh0+lT/AT5QloN/8YYbb+apDkwaYRKjadLFV8oY1s
   19.81 +hsbyTCZdnhQx8Lz2TQXvYk/peVA8dtrZLjQ7Q0FhKbnfqf436rNqgd4yVYig4t2z
   19.82 +84cD9BWf5fE9SAsYBhooWBxc0a2end5asCYTDJJv29xO4TEFr4bnEHwnePOBvG1b
   19.83 +uLRBlSXVCT4G1uDg4aULkqHT3Cmeoyy4wdV2o1/BQJA9NKkVGaG0BIJ3oIbcnEKZ
   19.84 +CGuiB9503TuBOaC8ES2JLB3vF0nCq3G0tGYxI0v/BMpBwWMUFMaMq6LUKXDQo64H
   19.85 +saksPG+sJWXY1cmvaOXsDcGPanbLxAS8Fz/5fqumwB9md1vygzx6Ekj0ZTt4fSIj
   19.86 +C2JcjIc4YeJA4nYCo4tGEC0lBucxLYYeLUyBTAgADHFE58L75AnPaW7dpnZMIAPE
   19.87 +qpqM0Z3FMZ/YpupZW04+3LYpuf9uMnhfmPxXprrsEPannqSMZuCmuNx9uGyOuT+5
   19.88 +0M2Et15M9mfFIM/4J0hsoxggXpaPPKEBBeupkVr2QjWtnsOsrO9lvdzOnWjF3z+I
   19.89 +/S8xuSG1wgCGpfTPGkvusNIEeHrinHBSfTjq+z0au3smGth7WEdjsPd8+MlIZ2OI
   19.90 +s7q8YxEmGrfUkhD3ZtEmC1dDWBcQZoAHByBhRMxKRxY2DhnvhxlXg3F/6OhVs0PK
   19.91 +MJpFD6MekVtRy6ANVhs67aSDYmbHShAGathr10w6GPaPRtK5923E13x7V8kM+ckw
   19.92 +fMu8f1ZjxqTxWQlo39W6MD5jDOyo68gKwGZz52n+tiNu6LcGt0BApoZwO9+FFQEM
   19.93 +Nt9iZ4cSjUxdSqb2ZiFNYBkBWd8WG5wIqzKH2GEBAifyvbQwikmD+dJrGSuM72p7
   19.94 +DUn3POJ7b3T6kR3STJCdrHQOZM01eMiQrsYok+AGcsXfmWbdnZefc62zDhKq7I2d
   19.95 +tzfcaqLuGppk6Y7fdPj/VZKCmRNUB6Wds1GuFCSGtNL5TZ98C3CbpteCap3l3ev6
   19.96 +CnWHSWSCek+LKTsc4efnMbpbBcvFPBGjH7Vq0p46H/LDL9kg7jV9LsXRUstfgGIh
   19.97 +fcNdxkmUdFMJB1m1h0jZZdSguyEMjEKhLplfSRzpDAmswWCYJL99tV+hMlFXUews
   19.98 +ssdn3li8ZVaPHQ4ieLM44Il8Tnzxiu8H+Xvobj9pGOsmqh0Ay4++cJcxGpE3kPck
   19.99 +cWiv71VzYopvLZqjsNmHT1er+TQx5jTkrreNeYoRiTLsmgOMZgHn86my8IERwsUk
  19.100 +BI1SqaVIFzJMLE4ZDe9qPT5eP/eU6FDkauGFjnMBGWLxuI54wHlq1G80orCjzW9j
  19.101 +sr5rtptiRsoqXxxYp+bRjzwLHROdshbTD7ntdy+zxxY3hSWw1wdA9SfAts4QciGc
  19.102 +fbV48b0fbk+5gt4axmcG0JjDgW0zklCvSEANv2Q+aSB/jAv1xtNybIlw4OGNNUIR
  19.103 +fkuYNxAB1CRzlgfRpHbGnpUfz2z5ao9w/ebo2MPIniy5BMhX31yyHX7snbZS8o1N
  19.104 +kuuA9aCPWluF/sQD+jkNFXg2zNWbNjHi0sxVHeBLAkCkQdQvPY00qiTbWZmFZfPC
  19.105 +dIziSBqz7tS0deInnYGOjq/7z/ysBbPO3F4ZrAu2aGQhWuQGrLjQNYXDFb1WYO1o
  19.106 +bNGYYmMbhtLH2bnWrCrGA/v5m79hvzOwkrXzfFwlRyuR5Xho+XXaP1qqxKJT/4U3
  19.107 +cvWvqRRK39S6mlV6kRAs2T/jsQnuqnCPkIdiV/Sn+SkT8mTGo1bhFR1mer3LUTpg
  19.108 +tHQnov+yAWg83JOcKDJOhECG2RJhPkrn9YwzQTBP8ZLML4VEmY/JeUMiOCyIpTLa
  19.109 +G6gEgXHWPZVdMBBWKGOx323RfcdZh6SLCEfhC7qWRVYHbkpl8RZFS1wX30+STSSd
  19.110 +UUkdaISYUgzSqf0b1deklxm8dHaiIYimCLf9cfy2m/i6V4yTZIUwRMkJ+/wiDZ7K
  19.111 +SuEZ7HcIKel1sZJuKs32bkMLqdu8/qroaDqAMLZ2tmbOpBuQyJ79aYULWws+Vbf1
  19.112 +lEHdU1hC1bARdU7hpGRGO3qEvn0+gSFv/pTVbWKWEMupMm62VAjz9Z5/NfJUyOSN
  19.113 +aZLkRc1KwZV8hZlONrTaSCEVtPwmv1CMnXi4YRkIur2hakIhCkuyNRG26TvpkDcq
  19.114 +s8UDjnxXdwg/Zd0Q5iBqZJh65ltpB1UM/fCc3dC+wDUhynQTE1b6ESqmmrkxBGWy
  19.115 +7SVt/Mxdyx3ffy+pbSWQwdbXm41Du1v5o7yBrFTV6iQ5H7IbHXHnTCNbG3X1CDL1
  19.116 ++ZAhXggd7UlrJhdAuVXXY6H7LIwCF5qS4/BzNp85VWzcJxIu6J8ZVOT2WmWhekWG
  19.117 +DAkft6zxqZJs3h6JKNpt7t4N2MfxyS6RcU736HRyVMsaBrmGbXA5AaG+TfYTUEdW
  19.118 +xRH5cuv5KsTDG3fMipLWPhjwzSrAxDKXByxL2WOUamjcxEtyqwMJWaqVrShOJCya
  19.119 +/ev653PdVs99r9G6hJgureML2DwLeZjrqkhDXxELnPA5XdD1/A3l5RwpF4bXCOwm
  19.120 +Bl9T2PXQwchNehK0IV2KpRf/wFCz2Flm7hoYPYCKeq1OT8fHCgj3S9qM7TOpAW7K
  19.121 +7Dh/eDtWpy0PLjxtsm4EXckP3WiRVdaXNGYLqWEYeoXs+4hoFRwrVJ2+MyujP2jv
  19.122 +oZ5HD2Q7mEZ1aR2OvOqHz9HOCSTd/2e1Ic+s+dwSnGQk338NXncHVO96hKR4+sEJ
  19.123 +f8l7A40Zg8/OYuEROxvcuefFqAecyKezZL5zCdxWDNFjEkn/zyqgzfrrImnUtUAY
  19.124 +lmpYexUTSU1a81iUvncC7fHUTEc26c1siXuI22ZEzZWNekZyjz1tneySR4FNVV3F
  19.125 +iHqNLlkptq7/WC1aj7FDMAC/BH/+ZvXWqD5+YfHbg+McOXGclyFzGtubc2e7Ir3J
  19.126 +8vK1GiHQF1ivm88CYnC+V+/ulUzcCt+q67N0B0Md0PrOLWyeAT3vQvG7ebCnGDNg
  19.127 +TYdZjxU4YG3Y8qK2RJiI6WtxxBpUfQ6JHksQDHn2aD/N/XBxxJ7FFV1kh6SVCmpM
  19.128 +U7/SPGqId2go7o+MVVpi1Wa9tAcZPNRg5qO4x2XH/UGoBN4CyOd1SVntlEO9PC0n
  19.129 +eroM6bibtggPbdqG01Xp5xq8M1xkguV4SMkw4fuzYZ1aXo9HKjqt5V4f8Mt/Ugn5
  19.130 +NRJB4jtyCd8w5Pvt0fh+5gNVN+V0E/BxZZRSB/kJwD5BJPj6Asf1x2RtN94Ym53E
  19.131 +3M1uD83hKp+hHLVTuGK1l1beTnv6uQUC1HsGJ586FSCAKtHrEtdz97WWMQpAWkN9
  19.132 +okNPcKNPoSvCHE6zBe3spcCFItkAZV9AoXkEDKrHF+lmZ04svH6fivmGnd4cEe+D
  19.133 +7KNABViw3wWG6AE65dCsHggrTgGnf9F5RMQB7aUP5YcMhwwEkv0feWa772Puk8qC
  19.134 +6wNQuX6vpfvWcUXiDFJu830HJStwxMEncryfk0YGwnp8aeTfqgJUqGu1KvbpU6Co
  19.135 +2nMW0oAaHARGtxKAvjAOOFY6veeo9knTvAm7iF3i2S3pBgu99xfwnay3XoGDRFzL
  19.136 +ew7bIKAXvOai3DM1cveH1QFPCRgCdwemw1uR51OgQswpOZi10aqzzXnqF0yIHJSE
  19.137 +00KrXqI648D5QK3fs2tFhg/duQL0USBvisGvl0MzYrd+S0Xdr2akDlXnP1bIKRGJ
  19.138 +RXEtSGZCaFH4Muv13HIvfgwLLCssRMzq4gsCLkZr6K4Pv4/dV42KftR23MRjBMej
  19.139 +nkj76OfJOqmCGeeHX76Unw/RjGn6t5kqRzzGpaTZoevm3xo0MOMisGKrhFIyRfQm
  19.140 +35k+wfe/BGUu4JB2Qvngxw4QmnlLkx+FfEoNGUx9595rPzk1xYLEHDI33DgZe9nT
  19.141 +maSy8j7d1xApPUPMgiFKlNM86rxTv7n4lNpPun7WkwZSejm/mILAMC351JotfGP1
  19.142 +qpHkilepuXonnVjNXdH/Oj/9JWvCNqyVwpOJLVBU3cNayTLJ+ZBkfFvM+3Ulz/wB
  19.143 +SSZB26wxX8VVymXDRwVJjrTpcfJMeV/5TvSIifzJdWZY42ip1SUWw/P2wfpsewuP
  19.144 +e4YeFD7Vo7Mljgqge0MzrBHgLHK7vYepd032ClGU94X5nB1tH/JE/D9sGm2by6jm
  19.145 +LhJIgtDKJQlLuavYzyrZCk9+h8DCQoaJaGfCCKARDLNKVbBYJe2nCrOx+mnfTkkT
  19.146 +rrTTn4g21bK3NIgICm6INImgpDfzfXb9BKWUD+6YQ7/H5vqkkfYA5p5xXaam98Vx
  19.147 +jCFhcSnrKTZmr4lditA/tLdF9k4N3VvpPOv4fi/iaAzTls0ACpIeNnxKji5f9qYb
  19.148 +G+jJEKXgsA/Hwu62KTbK2Ast7qJh7kjFqca91BgGf4rkgZiRoQbVuKdym9LCMC2I
  19.149 +GJ+NoQn2YO1vHALbJ+b6ANpq5HBSYfw8yIL47kRyGkni/fWj2X6wxcMnLE526tkn
  19.150 +Jh+6g3vVBYM50eIwL+UjIGZlFgCyOLGMPG2UFM3x/e+5IJlHMxl/e37NXR4JxhuH
  19.151 +vTBK6kKoaYd1wVUfiA68fEgSU3QMNSsCL4ANPuUieat9nwQqEr7J4RBguDCS/7vc
  19.152 +wEADq0ZnhvCuvwiwetOa0MlaG13Hot7Hxmv044PHpP3kA1i8GI/q69+fcIAwGH2v
  19.153 +YaM5Lo2lgIlYpHARpa6CIZV1KqpRYNjGXAbFRmkAtnjGFUZQrK40UMN5sSqonmEY
  19.154 +sGMcYqFoKvHBMDHnTXidG7L7KCgxSit2Qr5fbTvO0NuyXonXgHClaL+9sEtmlndt
  19.155 ++hAerRLzMnv4hB4JVVVSgWpBnQJ0en96NCsicLF0vNwffsgbcLPpmeaJac+RAVR9
  19.156 +S/W4KiJgjQSNh/yJZZYb9dENsJKzscY6FYeqo1SmEtyF+XkyHd4IjzktgUvHl4+i
  19.157 +36lP3m2jkIuHBWxXVAxnnBR/mz+YgqurfmCwckrCgKb7cQON/HJdDl8tca6iaEHJ
  19.158 +27DwpKOtIUHvWWolM/RQaLlXnpQVKC5XMpYRIJQ40vmZXom6VX5Tbl13RI2l+D/9
  19.159 +ISwoAoYA5xq2M8IZZnhdKTZMaY3qfcHGlgoLhoJSpTk2+vj50au2UFhKO976Jy3F
  19.160 +fI2lfF/6NXkd+qmMfOnB4YnEEpmdxtu41H9kGZULgOmWZi/cYHnt9+9T2SkxIcWb
  19.161 +x4SFqLoiBKFPkIWAlv81Dt0ojRuBIVT0e+7ubptuLeeRbdvXI9ccqlB1qCXc3XSz
  19.162 +jL8PEkjyL4HHyCEbrLX9MmN0MdZj8n21mpdI/zV/52iSyatySEhuB05knNwlraY2
  19.163 +PoeTGrEojz7/anMAPTZMgF9Xm/N47hN0Z2vEYl8gtUjgnWvkFBDmObuVJROlzPQl
  19.164 +mCn9nC9ujIzvF3joBP1nd+n5BbQpaiiIICcMyOkCvYELss15GIj6lh8tcHqhGhev
  19.165 +/ySGQxN27qiUyhLKxVXlYJowR/dbECmLUTwLPjRIRPGTiyQMzU04m73mm2N42Q/a
  19.166 +Eu3p8YcoJW7556cx5SrFUjjclfDnznfgDuYMgvbU4TjGC4hBemJpURJf0zdlYpAD
  19.167 +6++a6/XoEFfA1w9J9fSMVuBdXvZK1tqSY0KcUq14GCPTjV/a2eiMF0NF23pH4qN4
  19.168 ++elJ/Pqs4fbgXPxD8cqxEpI6uRDzOAau9g3kO6b9syOZYxoWQ2ZR4YzM9hgV2PfX
  19.169 +ZfN1U2ftiRFx+QcC022jjotxu72x8r+gVbdEF6vcTiaNutuI9idbwqOGq8/gyBuE
  19.170 +r80KYROSRysyVU9ESDbMSVPBdnbA0kblY6guqDxyRaCHp6obmXvURzopT05OoiB2
  19.171 +cM/bOBudPYt4wL5FeUQs2zq7sbcK3jG3z4o5+RyTojApDoIdf6GEXfKVfaPg6jnV
  19.172 +t+Pqak3cNYE5t7UWDPRGHQqqvhPS+x5p0qQDCKGi10W8u1orHdJtqFKKK+i7yq3u
  19.173 +8+93+Qfn5VIUZZG8vqoGPrsTQ9q4/rlY8fs+MBSgfnYkFmaeMy6GyyvB9vklwcqW
  19.174 +VCdIZVTG6MIhCQpRv6TkhYZqEFSnUXe5N9eUWRWkljTMMSSZlmNiJidTLk0iq++T
  19.175 +ZpFiuSL8Lx7HS/IYxUvWUPygrFWkkXuFqivlnMsugodEAgjK26MI8h671yLx9Qag
  19.176 +bFY/0rAqDWPy7zZeAEk86rPm2Cmqy6qn9JRSYPMMU5NHxveb58Knony6Z1cEx7nu
  19.177 +dPxWdCJOLYhTHcF0q02NQZ/gXL6uvgit5bdrAT8B2J9lF+UM3SmwNbj91BeLntm6
  19.178 +GKv5DbyixoeYFTUoYiCmJC8i2N0sz1uObBbYwNtWiX/NWH4KB8bkcvkpv8qxrDb9
  19.179 +ZRe67l/xCMFYpbBE2Fhdu6EGBlZJju6FFvfYxP6gyHm12CqoheAEcE1VupoKiwTN
  19.180 +W1emnwfhWVFLYV1VHXkM+alLcdzGREuqAcwU8NomOrdYUJZvkQiMPcHfSDg725F8
  19.181 +JIXHgU21EnW6CNlNRSZ0Hf0jDBIBOuGTlQ51Cd2um6KNmGp5PbkFPWuaa+CjPcv3
  19.182 +RzGDf+/X7mEfDXI10O/4AjpV6y7C/JBJnhmrZgkcpj0LchUtLdqP2+cDDEvIvVsu
  19.183 +XI0wI70jpo1IPqn94Ys8t1v/XGjRYyWKa8uJl056wkVrI69njp/GX3tiGabWMYDY
  19.184 +N0V/B60FIounsPiz7jJvbnwUhe3GmguTIdUH6I4cMuCVhnhmZHuUo807UVCwNGUJ
  19.185 +gGxPlnNUP/psWOv0hWBhCAfkgpPPKewyqRmDlN+BPs26HD2EEq/iZMrGY+Oj4hhg
  19.186 +bBnvGuCugafRruYMBYEUSg/z1NBfXiXTG6Ii3J41Dbg8DAieWdAIug2H2pNe4pU+
  19.187 +B3vyn7Zpxo3IwUz9WZcnvC25RsmbR6LOaG/o3BOxSqTFcFooFXieHLCrLnTP5dyQ
  19.188 +sHzAgT09DZmeohjEMfcLntt+6eGZsQAfrp+6+sUTLz9XLmZnvFe0s70H9mhQPFs7
  19.189 +aTim2iRcEpVM7xr3ImW8TBy6zHhDxJpcYHxkW/40oI37ex38qMy8w3vitn7/uUJ5
  19.190 +KJ02cJ/ixYcWHWVs1EDUsEiKV1GlOJOVOi1fjNjKfUVDHSyo95huTNNuHqy8Mb25
  19.191 +ejjhWAN1yF7lLVrDb9yAcv/ss57e2OHTUBI3nFbErCroknREhnoVuh7Jqld6lEk3
  19.192 +jbVyr14LZ+Q8fzswHkBbUFt1kLkmMwB2Erc4v2c0N8TLlF2U+SgP6j0yyh7GNCoZ
  19.193 +74dnmJeEq5kN2ZKsFhF5jsuujA6vDvl13DPuBRP25wore+Wc4WvAkBHwRkUCZ0Nd
  19.194 +vQtjeu8C81W4soDTmWvfQJN/D2BKl3Lsee4HzieEt6lZpouRBXXXLWC1hZ54R51A
  19.195 +TddtloRjO15ZIdrxn/ZV5lVNCphzkca3MGRnZ8Ir36V5mSwlgjAT5TuQyDCq3zi4
  19.196 +HPFbw2+p+RyQX2k0NZvOMltBNyqqiMmsg5vuQAqPTAquq3/URwryxCprxSLdaaxc
  19.197 +jDYGl/pL31Ux8mYrPqhRDiZxvanc7/n+sIEl8I+hxDE+//iMQE9tC1cjhfn0Jo8m
  19.198 +9AQ7hDxapfuEry/AqjyD6e3O1sHXBxGElTGhhqEVye3IcbVgUBzcqTeoR7mbEG8v
  19.199 +1lt48R4m64FzhHNCOqgFdSM28WBQJpFvkGw5tX46RkvBtjzHSWax4KjeWoyhYWh+
  19.200 +Ms9mXjSaAJQqAJphro2V7C9lOsOD0XST6ZvIA0alOeJA+ZYH/pSuyZt6ezx69eRa
  19.201 +mGMQAlo3yiDfVUs4v0bYgfutAjOc/sKYfiC2AETEaP+hvjXYp7VPMUSfxNqfGnID
  19.202 +1I+NJuM6ujwMaNoa6Ug9Qh9OwK3v7XcaqzuiwLRsU1nvV8N32wKuBr8g8BB3r0pm
  19.203 +HJxNM9Adpq6LCEEQUwjMuZAVsQHccK3T5AhPgS/59UOYPBP2gfICNkH/fjQa2pan
  19.204 +7WgaVQMUXDDuS4uSGZFU2fufZ6lRnCuDvVvFjRt+7/lf6tn7lmunZKI0LrY/Hi7b
  19.205 +rHVCEhZ1VYhRnOo0Z/Ir9Ak1l/cb2oliwg+QBUvacSqMkk08fMvu1GBY7ZB6qK3j
  19.206 +n7M4jR80/3eWFto20gGHPAf9l5nQyCQHNzuXjQ0ph/YiSLK3mpvXFRye7eRDkLBh
  19.207 +OjWs9tGzfwxemUcRi7NNw/3U3v2P43L+U2olrGaw5REj+h5G+pBD++USakbhelGW
  19.208 +SnHHkcbbshYQ58VfxMqBPwuPlLpEd5rcotDLOJvZ4H3DYzM4vWWuZkVdR4CPGZME
  19.209 +kwYo2aTIuxMyhmK0dTAb42nViPYo4OCluNeNE4pIJuVqE67oISXgaFOKo5oXMEud
  19.210 +EUrQrSAy1kF/nr3DX9nMqEQPn+DR2xsHOzPQOSKQTV6Hy3p1bHwl267Yubrd+r1h
  19.211 +W/E45g7XaNbzbXpTLv8iYkwv6DaPh37Jysn9qlquyl0gsMaBI4Vd2zIFQRE1Vu3C
  19.212 +dfLqV9lYuCwyhzPVKnxmGyA24G/lRuQZF093BUlw53V5LJQgcnfPzixCnQHhiU66
  19.213 +QCqUyeCFUq0VwPi/jetmXXeiv10CqPs/+lFHbvUbdNhhraxZQrfGwX7Xfx44trKc
  19.214 +6WMn7SHUDEWtcODCGny5o0c0JVK2PmFg+lgBoU6A/SLc28ZXWMGTIbWttQyt06e6
  19.215 +hyHmtK48lMw6coEhBBPDCpUA9zKFERFWSGp++u+wPD0pSOHZAE+qJbzXwVbD2qAC
  19.216 +ywAODSKWsT8iBkjZtgxhEu4Bxk09YIFT5iEVKvvueNZJgN98DKv/lZ1lv7VoIqn7
  19.217 +cBPEEnDmit2ESdH3TN6+KGt5hkqbbFjL/zPvJh0TO2+liF/mloupoNxHbd0lZpgx
  19.218 +Lctft6WJakgCKPsHjO25aYRDqNwhQtYFgDE41gG+fNGF7TOIAQ/+UwDfv+WaThvd
  19.219 +7iLSwUQRd6k2aFJxrF+RmszEvDK7rQTn/x2BhLg/qPIAfpBdjDNBqAQ3r+hdcfkt
  19.220 +/0tgcgdS8WegL/pGN7uSty3j1qV12DGBuXECptTFahU41zRKHqGf/yi6+2Q2lprD
  19.221 +fEvMVu7Tj7LuPR4Iezb+TIPqTkgsBEx2dsdw3WatuTropHNQWnsw5mSJM+ti9oTO
  19.222 +k9R35S/fgXdgacaR9AsuKhnnQRl7JmlQ3oGOfiHN3AlvjWhH6s2bCFfMVrB2P/4+
  19.223 +I5m2xedLZvqeKeYlalUOcMeR7zWxC6Pdp6o21m6ORndK8q4rB5PQAVBamZuh3A5/
  19.224 +eR4vsf4X1eVA+USrVnFORt4rnJ8OPPrymjzxue8ks+0mOUfpmiIUwQGEMRH4/PV0
  19.225 +mpFCXP81cI9GCEzG9/3Ld0KB0ikAfkxQ++npugw05gHdIiUnId36bQI+8UVGJZGZ
  19.226 +8jgvSpvcgRe0NmIqyXWDoTIya5AJjEvmW859PGaS92FRdfVx9KiDNYG2aA656VJA
  19.227 +cQPmOOanfZki88m9pZ1BLKEtfRnpR+ac5EcHuxFc6cFEuNf0U/itGyaaN1Y/TzUb
  19.228 +YkGsTi1npPIQD62ORWxYrv8m/xL4ZyYznx9FkFOKUF58BHn6B6llnxRZS8DtaL0/
  19.229 +niWLy3xCFhnyOVNgGdR2KbXlk7Bh+UbP+77DFn6gYzRditvX8S/wflPu9jn/tdir
  19.230 +sXkOsHjCOkL/fAfRNDujqqjwEzgettwh+heuxs1hI+FhWNMYDQpNgABfVYvJvbPb
  19.231 +8Zcem2PNq+M7cPlXB5d3dWVeACwzxee07t6Y1+J735hv014A7lF8DgSd3qU8j+be
  19.232 +ppSBcnR/Kqy/oGp5Ryjk2cocoC5Te6H0w/B8D8gAT723WdrwsoxpC/AS61xudgny
  19.233 +XpSYvv8YMWx6e+81nQ6WuNUO0uEiAhINqDuLymajDw0ymz0tksPWoEWOZAW8lLyr
  19.234 +Y5x5IdwY+bvo4xseEoijqJTKF1nV3iWLMumQgFqrFeFg+Wh1s8/BykQamKytvgji
  19.235 +1vGkqlncx6k+5axvM6KhPAfEpvhph+G8gpJ217PbjQxx/PxbBDGzaRvMb+L/fTWq
  19.236 ++W7oJyymIrUXn+o9tzlXD8svBMnZMpUJ2lrUrAkGhOTvaUR1eu2P65453yLpKIQW
  19.237 +B3qnoBXPn14sZ8KVCqKbBVsif081nFCZXaoB/3tUvW410fk17F9MBe1Vh3arZmDd
  19.238 +/KanNkkBpEKZBqcB116GHlmuXGstXKxMoIoM3g6otjJNicGnctNNmasK1VTNXTpP
  19.239 +tmcXOROUVs2kvIgs+z8YbFllVZjzX0L8q5S53q410Oi2gWl20XGnb3waK6boLNRG
  19.240 +GiEYIXpZF3dj2CA/Ck1j+ZSnL8qhpmeqjtp+sRBumyy5Y5o9HwSXC+nOfedSaeI1
  19.241 +XByrm060A6FGGl2Q/sOx1oWAVKurpA8L/3dQNm+n8xh5syplHhLZgbSck/+dnFcV
  19.242 +IzYXnFiv+8mzsJVAx1zjc+vjxqq9q+BEF4LjAaKDT7mNfNfXcrTziV34r3iPMgWL
  19.243 +wByJPN+14Zg7DtWeJx8mr56D/56MAFKQKgmpeDeCrck9h95uq+6qGAUm/qNm/Fp8
  19.244 +A0KjTh50V16+6hd3hbMiRdwZmN+p53HsgzQglKGBtzoLpNNHMvwNYTWDIYp22KKe
  19.245 +vvFFlWdjtWMGufn5fJRDLJOKSGwVuVNUtvwzusu3zUxxNO/a0076PPXE4w6Ur2RT
  19.246 +lhkNFK1vdf1s+EBIOYrD3XTNntKJoISJD8Kll1hoYUfY07RkXNIYz7IBkevBKdVW
  19.247 +wh002SYbW9wAlzRMIWoHUaBL04wc+eb5n3bgx+p0a4GHj1NdOj1C7eP/+rwRY70q
  19.248 +V8HpCqFMJ7w6Sh0ZSpNzuiwng3+sjCE8Rqvv2P79NdF1T5frRHLjd+OetdJXJOw6
  19.249 +0W746xkRLmhl9c3HX861njsI97KEHAXMxPFCpqLpjgvs7Q4oFpx4yMq/KOXjKpsD
  19.250 +xoGjtpA1xv8rTzM/lsz6Stfslq6PQJBA2RFl+Nii7Wda2B+4wXoN2eCSPXjwhWXv
  19.251 +xZQF8H+TjCi65zTlJ9LkY53z3ubXdea1iMC0uhw+cJkUYQ03uuLPxHmWRDpEq/xu
  19.252 +CzU391SYPyL2HWOjalXM2ltahA77l17wb0cI5ry9qlcVK02Oj99kz5gY5qoTdLvJ
  19.253 +MstDfa4K+pnMbq/2yWCBx/7f+nndkY+ZPoRDQdHU8e+ob1c1F0YZKImYRUkFBw6f
  19.254 +Y14ENSbv6u2jqw+TxAl8EcxH144Y/9U/Y5EWMak4qdsaUEhj+2C11xY1eQM7eiuK
  19.255 +8iI/h8rkL0jRxTBmLuDfAPMxTHFMQPNzWiW3PUBN6I1JLWy/CnKODBH9GviDp3aH
  19.256 +e651tI7umf6KhCf5492FHX0x/Smdg4iGtsn4+DoHtujiWQxEOcTNfHM66O6MfznT
  19.257 +wE5saJI9KQeHf8bau5SnQ74tpFhKCqPe7zk94IsO6v7iUA4QoxEeMfhfihK82GB3
  19.258 +V0X6W/GYT++rtf5Qkef4uPwXBtNvtpne1TAxb5Q5Kf3GkT5z2gbQYbJK5+ezwovt
  19.259 +8KvaaGbv165+Ppw/UM0+GOCKZj042LhYAcqUz91hpyT+LvZxsmr7fKU4batb+qyp
  19.260 +iEFTzRyFrGoXhu+Gc4TLWQMjIL30hUG76Xw6XGYfMS8xyeRlNt5MSeWOkndq7OBL
  19.261 +zVVGxF0l52A90Dago39kPB3phPnQ9aGlMTX44Llxcvsy0J+47W8bq+XtTpx0cATv
  19.262 +vD1+olIQWYLeJkwsegRcb174+KzTdRZ1/MpKiXsSSlOUzWv8bLpaTtjKyUT169Kq
  19.263 +C5NycqKttJdHJQNfhbhqAMmgWHnFcxAFJiIgZUtblVbV8Cy/uxznPmRnW56gV68L
  19.264 +k5mUeK/heDThEHcbSzOfbYKgdFViiilUUIc1KpQXjIWeJWZ9zmSAqojOK+XWBV4I
  19.265 +mxfNouLWx7AxPDNE50hNwbW5bJ2zszjlNeFWrHqXaymvbnjnYYIQeoGBEG7UYTvY
  19.266 +/L+ngcsTtxGPcj50NZ3/Be1BFlDC9oUGIcP6N4ILboMFYRVKmtqBU5Cmqhq/aSfw
  19.267 +ylL3lYW+XeQUYYl5DccGn2k0v5Rms3UH+r/m3ztdM9hbfdNR75iT0Us/MsG43F5L
  19.268 +dYDdTzjFmBAmzqxZB20gEJGS8UiSdkt1Ezr0pJkATC28vCj7UesjvQxrkJSyycPF
  19.269 +ff9SlT/U+vrd4s1KYIqgToHq2gBwGPmkofzK/4F/PjnAU/dMNuLE+FLeE3EB1nKl
  19.270 +nDAY1XHQERr6io9H9vHKA0GugN5uPu1nV3eL+dS9mVTniNxrFxqNeD3/2iKjWUtd
  19.271 +vQfB30+j06FWGrTBsLvTwbZn8SLFnYnVZt5GmMLFQ6rBONtYdW/yJbCSMLihHvdJ
  19.272 +Bjg+i8HBRp3Pz5o0QaKTfNF3ces9wjs5Zv9D9DCZIqY3QlCya4q4WTF3c3wncqtr
  19.273 +JvSp0J3ovHgIXjrgBCMVk6KhW19DcTngZuDimdcD4Ajgn4TD2TwIsip/nalGH0/D
  19.274 +1mByohy6InZFVK29SqnRpYJVa17xEB0WUFDCQr/NAex/8d8ltvtFasHnLw/N4sNp
  19.275 +FTASccOwgbIlul2CvDeA09rLDU5gE/9+Z8yxSUY2v1HqtciBay4tUE7MWx+Pqizx
  19.276 +92WWK5lL63A3CwDr2KWVLRG4qLKUYzwjuvFbkvZ0y4uVL0S1+wuDKmQCqeR7IY2F
  19.277 +K4Kxv4VDZ8VY7r/AxDBf5+JzFSLoZNSmDtOEpPz/jz2bYOljR/xhIvpyuNYDwl1g
  19.278 +D42TrqynatrDOL15P9Xd8+/OkLSKBL4Mhd/YPo+nr+MmnoyHMvNoeUZLIyuP3Ksu
  19.279 ++SKVTc+FuVZLnbmJQrznNigVbQ7kuXY+JmUPR43q6ay8N6peG4HpJ1uYpOp6yf7h
  19.280 +tK7NXHU5UYkmC1FGCaETXZYS9nenGmdeG0SzOfr4yOuTC17mwj/c9irqPSbQau5V
  19.281 +lLAD25Jfu9a2sWLVBF7uu6i8pDXZlOikK3V6xnUAlUJOEXcr4E7UfbwjweytCVgL
  19.282 +s1KM6mQnVvqxwkKSju1FvETovxrXKeiX4YoilwDYEoOBPMiqC1e9j0tDRHrJZE4/
  19.283 +/tAX0izJJ4CwxBBZE2IMnf01CLwg6CX8gA5ufY6qvDQK1CemKEgfsSIygtnbQFr9
  19.284 +07fzJwWkYaXMpZsg/X75BOgGhdt12qe90mrCn9Ps3iUlPMo5e2u00MKfvbZjpptc
  19.285 ++ZuyGY1VVIkNx/tBxaGhhr7bry09/MMoodwXMpLpkP9MYp7fr6xkai8rEdjc+Oby
  19.286 +HLRydDZuM62MnX1qj7hMzIUgtK1568vCoQfdJWg7o3hjK5cIoUlu876S+3xkzMLY
  19.287 +1a3uoiE4lopSH0YfnCFMy1ANcbi4C2JxweZgNa9T3yaG9yozGEZAyaie+vMus7VB
  19.288 +bvm2H5K0+cGlGvqcdSRY4aLVdQpwdCYiAnyAFcLvZPQhpIyHKI58hgyyfOjHeJbu
  19.289 +DvOZnR8vG1t5h8wJbWhWIYuZ/GwKgedZUdvN9tPBB1Ohof0SWi4o59RL7tQLDhgd
  19.290 +tmXYmm8jOSQhTwhezOvC66XQVuU01NUli5Y4Qj62KdkEQL8OEiSmAyXRq9obZLsL
  19.291 +IFr5C1JApS4kw/7njsVmpydHc4RJeFRu8f2qgogj5Ovw6haRFuo06lbyDBb7+7k6
  19.292 +xvAVfNvRi9pXPWxQHpv5nJcQCblG0wOTR0oZ3Egc0NOcGlUaN8IKtED+/uH+qjdO
  19.293 +oA3nUcJ5t0C5rD8acoyclPHKzfx3MrbE1saici3tKvHjXRp3fAilaF6ZDaMbhx7x
  19.294 +AysZr/Zutk5yZ0/fcSvkmPI+cGf0uq708koSLSNQr+nRzqc0Z76eioTWqv68NMOg
  19.295 +iihjH4sGOW6CB2zmx40Go+So3LiwtxYxsKKD+Q01obpOYe6lGPYVmWwZQx0Iss7L
  19.296 +ax89ofxb8Aw7XdF7+YdawIyguY8k43lytxTvx59W52a7w6YRsR3sg22eaNT1+49g
  19.297 +vP75YYWSJ+JC5XfTP3iMI0vTuOwsiJTa4VT+Dup5VeJxEGKRBVkg0L/AAxn4S+L5
  19.298 +CtnFOlxqv9ZW9TUzI6jPbhG5jSm6JtwEtTZHwEACaszpSYBS7ryA40CFOPaUTMxj
  19.299 +z/JPzbcXuEMRnozf3YJFgV37q3OmLAqUFhQEwgl3Pl7Bbxo6BO5zjzmYlVkg2zW7
  19.300 +wLN7SVmGWMwRBpsXu2BYFgZiWTffkroalfgfppkSKZHRWtGrEhXwEqZtzbONNw0B
  19.301 +x6vcGMR8Ju34Kyl28it1LZWtTHzdJS4Fevce/PZzcRVClJ5zMgmGCjOIJMjsT3jx
  19.302 +FwH+yhwu3tKjPFn+y/VgS6dr/7Qf1Oyk8/SQCYUmC0tKBzOncqMvw5nZdyjzSMj3
  19.303 +LoWaKuzTU2qIx+x4LOyTp0jtgRXh8L+J8h9YdBEfZeAGpw6GsvxiZ8UksYYJuieS
  19.304 +1xXsvbWIyGxbpzos9Hn4DP8vF8QK4c/TkFmDZk4YwmC8N1ud0aIHdPyqxuk75nBs
  19.305 +qENL30EZccWtYrx3Lf4ihLIKPoP+oa17Hzx9OFlxablRQeyjYTsPEYj5HLFghn7G
  19.306 +4v9yrOzCB/LYEXo9H1yuKQVMnmIv7oalmbFMo82lJ30yrJunYe2/yPQWcw1+R7d/
  19.307 +ej2747GWQ3HHqE9DbGKnZL+juQQGnqgoaw9ox9gzBsYG3AfkMD/K1ZPXfSytRSeo
  19.308 +D2yqciB0hNXVSJu6DcjOHVTuxPYQ1Imp+sC4I9WuzxACS6NR/qTxwj+E5wpyF1qX
  19.309 +ztXjEtwNV9+ChMvHwVRXwYRM+3B3epqgJ4buU9HIlFdhkv0S75JGh68+EZJWxA6R
  19.310 +gQgxSx+5DjCl7Fg+3c5HaTniLoMpq80zrNBCcVzYwDuOFK3EsSLNNuKvQ+XDBk1c
  19.311 +mREbgx+rlnfynkSVEgxUpA8LAPr7Iz2j4IMRzrY8MZvHfh6hbUvp6YFoHDg39FMP
  19.312 +MM6wrSuSZwDLwN6zao8EdTkofZiRMLfpV98oom4r4zykmxsejsHtbfpwuxEQxDbJ
  19.313 +lYB0ofK9+yACBhDoMDqRlsRG6rLFuSuYzHnmuhZaRNo6lO+VW+P902pyLjFNJHdn
  19.314 +kl0Fo2vBjD4jL0bVSwUShOsHlpHDaEqAOJEWeH+az1K0nS3sjNbfTRhjkdMNC9uk
  19.315 +fDElLAExhJmgJxnghuWIJUJE5H6Xpc5D1oyA6QWktooQrjjiX6uICYQQBYkhW40N
  19.316 +5aAAbWDdT74qq0pBGx74PDPpvTU6vVV7U5rGmhcYT5E4+/IoJCxJ2B4Zcnusil3z
  19.317 +5gSmNOn1NUuszt/1mkybFO8MYZ0eozNoG2mxm93AhuV4mXqyWvICvn3g2DJTSOEc
  19.318 +B/vgTXRmfhgktv5G3VjxhvSrY2+C0Cwf2/G6eyn0vHWQYf9RJ2ht29EzrFeAAzi3
  19.319 +5qBE1AYXN+PPRkzFWWJ09hJtowWKsqdXAKx+LiXiIDpggu5/fxWxIqCqwwRyNybx
  19.320 +Z+27qRbkynB2w9w92/OxbCgV3njzPGky+BSdh9MgOzzLxtT7bBD9cjK/vO92JnC/
  19.321 +ywTbTxM6eX0jJIFVnUhdMzJkSKjPScYEWd0GXbzN106IN0L6NudvbWbi5onE5tc9
  19.322 ++kQ7NJ5baZ2IK5o1BG6why4fcjJ5RavKB4s42BCVsDp1hx3wOHurIR5xnL00UJtw
  19.323 +GUbET5yx7fTjyAjKhUoTa5mxdueIrmm/wJLFN5W+HCItqFOszryYj/VmPhJOFR7o
  19.324 +YTc7WmJJu4zPjfSWkqO1epGXcnJSq+npoqdePkRpNVX1SPspxtRr6xBnh6XXrJy1
  19.325 +gLDkJReXhmxC2DiB0KNlpg/Eer55Zt3+/2XkC08wnUv7RLyrAb++Hqi/V4/wgIZv
  19.326 +p7l8K18K21ELeKu/eT0VpbdqFK2NBWk7RJpzaae0fH6NP6A+YJISbJP4EBC7piTk
  19.327 +XWVYuDfBevDTiizC/qrUAsoa1Vu7Kig/VMqkWPyxiX6wRY9rjFm90Uv08IS9KWgE
  19.328 +UX8IuvkobrqOKt8b0Uxql09mLuv+8DGlHiZ3pz0lm+OnRxZKhaiFR3cbiqdRQpQ+
  19.329 +1ZpEPvy+hmVBt/ul/fC2mL202nEPiKSMMabT6yHFmHUNCfV3hifzyYChMvLKdygP
  19.330 +IOO0nPMRrrg5vPRquvRYj6Cni0RtJ96nO4JADfiopNo9QA6hm7PeG/M9R/Jy0LOi
  19.331 +9ycthXT0mxuk4xL5b2uBk9qvhL+LcDlrTxtoZZWlvbj6hTEReAMQP55h+Ib+z6AN
  19.332 +NYe5103rvTOzlM3rW/8ip2qUfO9S+QIsA0WonJcfrCOLA/6zeqBWcb5xbWFY5dFe
  19.333 +f+4FqhpvaThgKGcXUodyspUyeAS7dqbU4Xb9eS0o+zClF9NZF0xzbpjSb5jWScRS
  19.334 +9XQSjspbqpQa3VyRnC2MyqxxzDQKvD8Ra+qGW79JRgEzUU969mAN5Mx0VqsGHxvl
  19.335 +nd3uLWbEJ02MvDIKYiUZ1/+UDFXuFsAHohdKuQKzt3TGCLw06//RrEAEOoPdaRre
  19.336 +sQvFZY3jZYGotDZs0T0lLHSkvsMuZt3cald8GHvO+1to2Pj3BXztSwLIGRHw4zZm
  19.337 +IcPd79JezTjp+Kxr44v0zC2Oe/acoO3zpCspcEwwwdNyixee3j2kgAq1c8ms6vNN
  19.338 +jjI3hAxMifCDx7MwW2/o8ZKBx/Cr6fQThetyn/1GuznazE3iZkI2D+5cTa4YKLcI
  19.339 +c5mHpFVz4lD+Tx7Zr3Hb4jXquIW7gQTVI+P2xQiwg8FVkt4kqDKdWzr3vj8l//mh
  19.340 +BCQlf4Zg67Ej7QPSftrjgNXny4y/ev/Ixwc+CIlwj28REpmFGeeOBsJu1kz6Sm/l
  19.341 +XQd0VcLxqtKmTBJ9Bv9ExJC7kL8Rr4PmARZgGcRR/DyQoPvWBUxCGUjsDb0yPIa+
  19.342 +i3wmcTVML+PbRgl202rqwP0gQfbZdeGhbW7+giR9fyBanWSBoTELo334mal2ztzn
  19.343 +rZ0gPr7ANDTc7uJP220bFpWCPaahR5/pvT7ZPHWnrCf5fgXWaOvMbhTdAzfytvsi
  19.344 +h1KNLZXR66A5rfjV3aFSWLD57SB86SYFE9DlwojKACO6mEbPj25NJrk9OSWYMQl8
  19.345 +MzvcXCgF6OuU1O1dI3TLVuvUlU99YKZjV0y/hLepWWyXizaoVpyR+cSN1Eii2+d2
  19.346 +wmGukZ06zaRMOHVayGppSAtEeEo9D2GCsBQW/eIrZ0jchHyD12GZbZaGE8yxoD6J
  19.347 +dY/iisGRYA+G2Hr6no385EtrwowTTBAT5K+nFunvPMqacriJaRiYC8m3L4bVvqsg
  19.348 +i2PT9pa+Qc/UdbhjrlTlu7qEcFCozY79MVzKh0yYBMlVBozJlODG9hNDekyOjLiL
  19.349 +a+jgE5Lv0WBjV3Lxk5QqtLLzVxZalH0/pVUvrqHxkNhD0KZoKrsUJZMNkFXXWGI9
  19.350 +875Uu/RRPqpXGO/VLEXCiFv4sRP89JsZFngpYrJQbIPG9eTkSdkcjPna0wqs6dNb
  19.351 +oYu7gCY4QUnvdnxbuuGLppKSCPhL+U54JpertmjduqagCjsMMtxSbtCDKo8gm0Ad
  19.352 +eu6Zy9kzwg/1KHXYZ/5JeD9AiRWpwOOz2KhN/212d/X8i3Hz8gzR9tgBUp1aEMz7
  19.353 +frZJq4aeGlGP151iivJ/CkOh2JAZCBmid0PpgWCRB7/7VkeGYYWhhBS//0Whe3H4
  19.354 ++pYRDW8/2ob+ulSpqTUGVAsxcvbE226oWyRswPpHZ5vaHvWCNBGTJfGXSnYF9MMH
  19.355 ++j6Qqq4XrTi46oQ8v5CGUqWG1tgDx3A/7jiwkT3t+u8CPEwblsoL3Sp9hY9gUqk5
  19.356 +hGtcaxFOXGgLD1cW2VJq09Uufsa09BQPbTvo+VIFy/6NeKHwENZVmJ0nvKoX+VhO
  19.357 +BWfJJ0XtBJsRq1glckgIW81VMARNCVeWRBqZ0mWfeUtuet6oKuGD9XnENBQoMC+w
  19.358 +zSgvy+gy0+9taK/YZ98KODkHJ4cy1T+WWqBzQXee48joms+YRN/kvQO8bD+bpzFo
  19.359 +QNvSaobM1bZ4Yg5uN7t+qhazWOcQAxvWAu00uWUdIMJDARlKumU/SIJgkm5ywYZZ
  19.360 +VHITj/vHy60jHkYdTCyxJmkN3fPqsk1XBi3xreggxBZHuG522r1CS1ezi/yQ7VIo
  19.361 +wKei1p7LWXDNqxfO+L0V6zgjOrwVGa+17lAL2dI5UAW/FPsqSKrayf/r0rvRFjS2
  19.362 +fOt4OJIdaLrALr6DQf5MSvGpOYBdDNyAAxiGUUhm9i+XKSGqTH1LKrqRcLRbUc6O
  19.363 +ECMawzS1P52/nrCUGlpofbM4sAtp1Z8EW1UnOl5voecjEK3zVCRZjxATwLKsrvc9
  19.364 +LN216ecoyuOBtAdbtzvpU9QYrDmMGY5wPbygLiW8OeFh/idMI5Qvb+RFIJnf6txD
  19.365 +Hi/HKxqdnUsCvU6151yr9LjJT66IkKUF1YRuBpzXIGSS8yzZV/Oe2ev2iskk0GPY
  19.366 +uk8f5rFNSSCUxZT3JgxIzFH9jid9+ufPofGNqzUbimiG/uMkOCUnLtQiG/fyAZwR
  19.367 +RDAoToH5Qn3E0rqVn4/ayZG7SRkWMH7X0LySRW6fAfqb/QOImQwNxFb70BkgJc/I
  19.368 +wWiqJH0wdlcb4d3c32n+lEQ6IZ2OG3+UiVn6sxsxs5zMUW1m5vnw6A4tcl0saFvq
  19.369 +YbceJmQjiCvJTzofnAIvai7VSV47K7Sera0vd+gPLLs0pceyjNsFskVf3BBd/rqk
  19.370 +TtR1d0s+bDrg2aNUZWRTyI+dy6+gu0fBOZ9o4+2GPKbXuJWu4E2gPe+mPntkBhQ7
  19.371 +PEN8IUmxIOkyV967VbeuZ3DiSIKyew2cMMFqAkTIwyJJ5sc6d02NEA+l2Picz4cO
  19.372 +S/I7HmbTFo1uWE6e4oVN7WIlXxsHsIv2EQSGBIuftro230QPNwrAHbuU1AYuFHX+
  19.373 +No/t9W10naJ2Oa34QH/qV5g4sKIF+YPL0UW6tnvSlbyCh4AGuLSxzc84jInlDcFf
  19.374 ++bWHukLB6sakUnbRSmsDQFfHYy06DZ7c7rGVVazJJIp2SEwUaKVUv9GwWIAM9w22
  19.375 +2qTgn+1NREwQV+kVmiAYHnuWmhYzj+XyyQ3IFU4qytido5bay4mCWT3xwcyZWpJo
  19.376 +XzNYOSH25vUN2s15b0XjO/6GRvmiBAfDcAUP37Vvo9CfZ/+mmh/WDGTlB5g+bzVi
  19.377 +NQA+lhchv/prkR42I1UhM20RqQRygA6iZeiYTGkvC5yfc8BTxfizd9ROHaANeeSc
  19.378 +31mtADdwZ31LkpJfcSyHsxjHNX7QDQ0UEXP1u08yw7sQorejojIAzVbflVIt+qPo
  19.379 +R2/lO0V84JdaV6YYjlEhUo2CJayc0WxYirMxhHPnZt/oeZVLj53Vs9srFRZaaFnj
  19.380 +NCH6s/jAcrUzr1TlUqwFR2PDc4a7rPKRw7F9uzMlIn5DcHHOYouBZVHNcPcnYboy
  19.381 +L7thYTInFPoXFvZRJLDRo38SH0Bo8eyJsAFmjcO5iEbl7BVx0bU/FjqetJWKpfnj
  19.382 +FTXKu8V+hPxCD76xRZEJEdqGkmts7ioEyaR72obyLer7AY2Nn2ueds+6yLOWsDPS
  19.383 +yZmDvyy590bwn+UECsR1/KIJFoOgaDF57rwoQKl+110AVihF3XZNrd6DONuI3t3w
  19.384 +BoaCPa4V09Zalfig9ju2nA5lJSvv70JqXqACBX4rxFxQb28bKckddf/pCXy5Xo/V
  19.385 +vZC9mWRcd5cSVG6urmLlS/bW+CCYdbMQp3SCrhv6klcZ6odXJnYtiIZmfIlhFNlJ
  19.386 +PTixvDrwouUHF8Gaq0OGjCRWSOUvrWoFn/eVVmiVnjNarD3tdd34EvIjO5Xdip+A
  19.387 +x8Flg+wl9WRaX+I/OfiC+ykkcgmzzztWzvNjfNNHOBosf3SHdRP8zB/JdrvcQcdO
  19.388 +QCNpYWxbopoJQ5MOjtnXVvJ1x2SVEvBinbCPRDpxmMNAbVpepLyvNKo1k2ZQgpZF
  19.389 +P6s/pO+XO969TOCVMMQcGffWmxvVX/gzpjk4cZWNsHABv9GAVRwpTY/bwxOEmuKa
  19.390 +vXvZ2mIE6O10Zu6E8zQ6ANVKfLxYM3Vh2CU11DEeFrlZ8gQAv1xtHl7g6S56DyWO
  19.391 +2D5hb0MbQox1vp/BtijTopeXOjFewHZLGklhDYGLIbFwdEL3PGA1cFwYZ5qES6qy
  19.392 +BH0c+3tl8WpbqrUfjDb2QnR16dYvDl0jkBWeHUN4rwLVfIN9xgAEpgsrW1tKHLcF
  19.393 +HdJlpN6MQzhq+5QsKEsLALXtDhbIuzHBjlwLC+AHQ2bB4ucD4evdc4Uo6kGgP0AB
  19.394 +5NShYG2xc4L9nyYXdr4EOH6XicQEeEPnRT2YCRDt9hxlkCrI+lR6hxWxjh0B1v+O
  19.395 +LHYBzmfJwWewST6ZdpG4lWAttyEoaGd2eWFIgR3KK2Cx8E4gvxLM9LeAtjRN8yDw
  19.396 +LLIGOyUQ8GuypOyXgPk/wOSqQYzYSTfns3WbnC3WjG6Zuk3Y7Lc7Mop+dNQ9Seyk
  19.397 +8ZcWfmpeUsdAAH/sy0YFcQUPHC+nRg+wkIA+8jP4XfQ71dYiLzPYsrazqozEbZvB
  19.398 +BykXO/DGtDB6gyolP2xUd1X6dSSA4//azXFg6eExOT4tNbVltzkVsMCT730SwBPz
  19.399 +Yb0B6CpHDR05onO2kwfMCH41kwrnm2WwzNsiIEgale8wS3nuJ7RcD0IFEMU/Xit0
  19.400 +SBloPSYh1K8QWgVFCCoTt2E3Isc8b9D/shOOS+ZPJqaSfY4AzNrVPQFAi+4X0baP
  19.401 +TOyrd6i1VqWrix9OLKFV079l+zbpaZW1iaTxmshibeTRJJ8ZqaQ9JYt4Dzp6EfuQ
  19.402 +Iupc37S3wkUo5ya0kFV0963H9uNXKlfDn1dYRqg7II7pgg+5fhYsMVlA60SSBGpO
  19.403 +OzvD5+61Y2bOahkO0WOjNePyAqqVQSMLk2RWJlMpc7i2Bq1GT4JuY5Nd63+MI87Z
  19.404 +0VpJ/gIg3OfKXHg5o658YWO71O4kPZkw4a70raMAy6GbiAugxyuEKkFNma1+P6H9
  19.405 +gBpZgazW1JHTpPy256lnDf4cM5SYSVBkWMfnTIUH/QuTlrljJwfL+OjfiomF5+xP
  19.406 +nCG96at6ZSobj3oAVGnCH2G4nXZEBTgRK296eKbuVpbjV9PI0lob/r4LBweGzBVs
  19.407 +PsgzSIH0FZJOW+5BJKbEhTZxTwVp+H/XBSJj6C+Adoc2tE6FCA4pbhxFFi/vueNW
  19.408 +bsOch42QK/Da8hSc3qnMKVQzFSAE6JBlCyUn9IRpZrpe6ixKtpKeTnIs5BfnVl0p
  19.409 +2b+ZhPC8b9R4t9KqGokBXHu4vsKTaq+IXf4NrYAU4GtP7/046F4Pf7UkgsDQkXcw
  19.410 +gV7rbKBjVxr0ViKMeORkX8TXgrY8tlH8Y/fVzZLwLE1JJ0IR/g1s453gi08bFDpf
  19.411 +gifx4X830bWPzkD1lyBgTPMSLYl910tbFv3sHqKyPMLzHKnAEnU+bqruVfMcGiDc
  19.412 +iGogLNwgHMF5PM+zkAsnk7J/mxB2V4vBrW2XOW5mTFxCHfFRRWTCCm5GdIZobDLs
  19.413 +Cjy1Yz/lHtCTxUM3dwcQiwjqWm9LaFTanPDzEwg24tWGCQ9pqM03URUuJiBtAjGX
  19.414 +T0PtHHnPc1orfaVVgAoyq9jqvsYbs+r+r1pMqrBb8rdpnIQUhHOAWwwS03QWb/46
  19.415 +8KBHBmuvSGleOKnrhTinW4KRjMsyVctqi/OancNGLtMObImoN1AnNhMpYR1sLHhO
  19.416 +bksDC5uxwzFmpjkzbUFTJtO9e+PahbLjJzUtLsGxApz8ajXkBPvMjDEvabIfHmsc
  19.417 +rJokXpY7R+2M4iBZz3UPusSDj1nc+e0kq+/M+MC9vgZUK08ZaaMknz7tp4Kum4Uw
  19.418 +zZAvYg24URrNCeXARXEXy13ps1xH0RMps/Bw2Pj0oUTNt+RCQtg43CVN/eoIk2Yu
  19.419 +YOmOsbzqfkzChxU2wWcTgObKFOMf+IcmJZPqlSQH7sygiHU68ZvEp75qNxSURM7P
  19.420 +7xSfmUnQNlTsjzmpQlvhVMifgeB3ydv82Ek52dxNzv/22kba7CuJapxQEfKnvww6
  19.421 +HB73hB2PuOJzuuIV2oEN/TC1CpLcELLufLW00pqHrSMMXUNU8ienZ+UyhFSTPcHa
  19.422 +CRtisEw4B9WaDirgvgxhlt/sjEoswqawiQuvMOtwzw0va4yWZoZeCXSMAm3LYFou
  19.423 +Cl5JoK/ulg3yW8GQfYllHD/NJ5l4Ch0VgfLCkR4lOBHJyzgl9jtaUwN7Y/+Lktrt
  19.424 +F65hrY0dFg9TBtX2bfl5idpFIptqN5455QYIPZAYJKn+sHvI2rBfJUl+6oUNbOK2
  19.425 +KXWLumo0tPSO4IbnOUcfq+D8wsnN2YZshvFCqrBs72M2vHdrm/o4O1UuSaP05Jn9
  19.426 +UkE65HqUExD6qZzvawiaAgrKsANeHFZLf/rYav8Onqb56j4XuWwDMt0SlomHiu+V
  19.427 +wNfwLzrERLWVcEmirog2lvI/Vq9ljbyZE06ZBSgURsCJvSMz5l+AhU5U5uU5sqaY
  19.428 +vml46iuoFeDbeAxjQbFqwExlYU7jAfTrk3Vj6HKM9nk1L33wp0sTlAfL2ynbvn/X
  19.429 +drN6zGpZLXM/vajVtm6vlI4TR6T+oxMWZwtRjO5t6MiiO0vo+E49I3Bwhr1Hc9/H
  19.430 +TJukxkA7BtRkp0oX6J4ZWqQmEyTk24HGbP97iIbB35/cwjRiiSa07kneRYrVy7qW
  19.431 +/09AKJ22e7CDuIAHSplhWgn4PCHeYQ2PAIlXLhkP3EbFP04ocZmV17cRNoCaSqAH
  19.432 +SxUTOybDPuuV6ojLT8OCgodR81e9AIduVVXx7XZKTkiyA8TS7KVwGWmx4PpoFOiA
  19.433 +m1FENO85o+Ik27GRnGzEjCXU4Yi8OFiktCbLBQ7l20SxGTDTA8KWnKi/stqhRobw
  19.434 +LRvi4EDoh5IV/sfu2BUom/fqd+k4LSPRh0NkXXswpMEGBheQGAyRBefz9/FDulbu
  19.435 +PhSTp97GdiseRqK8RGQ0ArOVurtBU8qJGaAJpVzqARFVmo0wVl8RgSXx0oI2F0R6
  19.436 +JmYIJrKI5DXesT2oLuPs7vElo8FRqtNEZQx7BTjvU47oOHyT3cPnnoipGMsfW9Ff
  19.437 +0Li2ADrBLKH5l2OC/pVB0dUVjvCIeM5i3v/4Meha6kf4Wu4R9u35sR+Bp14ALTeY
  19.438 +aA/IxFcWWrfmDlOx3BqAd/TmuFrMaij5i14XmlRq9hAmz8pdg76BnLltwvy3fxHU
  19.439 +Rl9XbC1/3zuNKl4j7lACXopc4NtgwqxtzoSPea3AGaZ9rwwC8cxkMIZm+glkBYze
  19.440 +CJT7LZKSLTt7d1ww/IgHSwMA6gOz2F2DyjrVHCNO2UI7HvG0oJMjjd0lnsMTNhnK
  19.441 +dnzznStesilO1rl7w6YhOdNzCNarxZr3CKzlPJUfkoji1mgmg3Ek1q5aMaRz1BGG
  19.442 +NpSC1MaXOelShszuPGigppV5fTh0n0ZzcVOMJ9Jf2xXvZbTL+Sjq/kVT5OugZ/Hs
  19.443 +ntXFDLpdVBLvIlktz4xif6oqDWmQvak3NC21Tq44JQz9XvQzSDHqH/L65bCNZpCu
  19.444 +PCiEdde9euXFFcy1eUS9yfs3ueuhSlavd6BX/2N+hWR0tzP7ArqRdD08GotILSLv
  19.445 +uXgwVN8+JfuLuUqbP0lUUvR8z5qECZ0zawEbzuxgoum9VxE1imyZBz9EQyNxIn+5
  19.446 +UUjvAEYf774WjdgdcSMFAkB3TndBI8qFZsilUgAisTqVwYUk9F+/CfhCCb/sRFV8
  19.447 +v1InnTlvWvKsAbW6wPoNVUcs9DaNoh1BgK8GZSV6L6HKqYXtyTrnoKHwN5OIKL4L
  19.448 +c94f0IwaHdrPGu98ReaBQsyLLPGRXMhfGt3qak5Qm8qAJPxD+fkvUkEtIbpjwn+F
  19.449 +WL+ideggNeB8PXdJmuhP0pASBfhtp+ZlIQ0l7zQKKdfXNho55xBQ0DFLQ+z0zVmO
  19.450 +lAUxJdEVDEYOBQoEtfBN1dyrZEJw1Y8ulZ/aepmD3oOpIy/Q9zH7fRCu3IYBBW2U
  19.451 +2yhgeVB/r+V/eetYUXX1toOdJaaQu9MloQ8IyqUx87G61yaaSaEODrNiHCEmTb7S
  19.452 +SplZtAPDCAYbSmHd93vDPl+Wx8LmAG30H568Y5L5R0sVQKipwqmmgQwNNOWHQygD
  19.453 +4RzxFngpqCjMvBRGqLLOOnMDXOYGYLKDCNJ0P0vsMCRUMNG4vf3OAr4qw84fGlZw
  19.454 +esgdWf3x9zvYSKq7JV0+WxGOVM7BigKP/SUpgd+ykC9tPFQrEcxLQzoWtVK8A9wI
  19.455 +wcbEcyh6DaOeEG1+3VWaiNFUmwFzanFfSEukfAIVDgK9OK+ELbF0ksU81KEugFWw
  19.456 +P/8svw1IN62Bn4mLe+hwSnm70CAOJVLod9wQs0Ni3PhSMLYEQbX70dBQcgFhI7mo
  19.457 +2JxhmyfaibDor1AlIz2NLj4/tt+mG5fupcD2tkGRFXOD0j1vhQcwl0PHoKg9+rNJ
  19.458 +xwQpcfM1GjMkOIxo+EMdP01LDfVxtWf8cNIRmFBpOt7sX00m31jwZApOmgiEaEY2
  19.459 ++mfgsa07jBIy8SpLAaFTIsDCaqPiRRCgDrXfXGpRXvxMlHoWiCRX9xEaPMxWr8vB
  19.460 +F9WeIaDiRjM2UgdjOmOIVi+xxn05eb8xQFRoON9jnjUvKBBIeGZRcIhg0EskqVel
  19.461 +V9AL9FKCRuXIEbs3wIcA5PexEBPtdX6yrgT8QR31lF8azBMQJ+hZhu1dxsEXA6pA
  19.462 +0wLV5SEPzapfk3yz5E5IMAEyhrp4UdvHiYFNTm+vlg7Ok5g/Es28fqVxLxdgg9VH
  19.463 +dLxcg/5yn7ikWs0iV5br6WmxlFyJesvWe4OFK/6qQfNCZgvYAnm5yubOD0P2tY2f
  19.464 +D2haJ5GIQygrCrWWbXpkLgWi/C8DMT3KcbsP6SVufcxmJ+uBxQOfWmZ0mLhP5h4Y
  19.465 +y9fg4A5V/nngzcGF7LI7gjnc8ZmO1Gs5doX0gMcRJwNLpMhgXPysQRSR/d86nOpq
  19.466 +F67Xt5v/y5W3TkiMha6KovYr8yS93+OMFx0ZvpJi87hlFk3aEx4GAoqdnOq3eJX/
  19.467 +KViJTqf9iNa5LGrX83WrfMM6qzBwr+Eyc0l4xtDhzO4+3sbXMyFOVNI1ZTjXYXQy
  19.468 +eLt7iRixZJcxBugtbUS6sMu+jY9/Imh4yoxPEaig4dO8OienswY3m30wETNG3aWX
  19.469 +nxIaw1ZaICwGv94urq4lZJn00PpsXe48Id3cfBqskHsiLvro8ZmRlkUW/d6f89SP
  19.470 +CRaSRnrYJvEM+56JufiwQkrzdccXJV6pybZHP35r8OMsA6ST1SXcD/F3liF9+t26
  19.471 +m0IUiiLoZHR40r+R8RmQ6uOFl3p8V7pVBQJymKrIm0J0QvAncz4tuZ+ByLzMfqrI
  19.472 +exkaHlZh9KRx/yJFeyFglzwCy+PsOjW/ofYsLv3idpWWb1l4BH3FG6Hd1QvjIp98
  19.473 +999A0H8lSSFqMnTSG7DfI37GThwm5ZyZBsKnuc6mo+lr7Vtb4UHDfNOofDy1CaDA
  19.474 +brbDsuGNaBrxxWrOFnmeJa0F8gvZNVpot6dJNXhcYg+vxLkhJiR4DGjHixGjEwi8
  19.475 +ugaSeady2No4DiMJpfj/1DKV5XPsmxUNODXglmA0uFMefI7dL0pSRssxYx2SNKFK
  19.476 +bZeTh4kCU4Wn2xJzzr+cAvV2C8FmXN2bsHDALIHnaXozDnTQJQ6WxwNnXyfT1L7E
  19.477 +CQUcS1EBpoIGbdvMXkI/0jPOyPfW61ZcyDMd7lp25MKiALrT43AYaggfL3KQBgB8
  19.478 +XoF2hj7OXXMHVzHOoCzkycFis5cOIibefUsIahk2ZM88WD+De9NsTB1D/dNnzQFg
  19.479 +4nBWIPdJT5mIp7WzHf0K/1FhFXc4SlYhs2FU8vIDhf2hOOyyMr3NEHsAwgty4HCn
  19.480 +pAVR1YCi/ee7GPiw90aL2ueVBKjFB+dLJtF7SAxIFS1JBjwTeX/cVmIm9NOoUm9k
  19.481 +gZMqkfP0Ui0Iv6eMhGUybIWh0jnu4yFcnC9jzZUrEBemG7xKz3LzVJFryAG8OaMP
  19.482 +LTVGT6VKZOasf/vip3OgCJn0fM4kpKiHWkVacnUKc6iQPMNXmOVf69MF+rjQ8z4i
  19.483 +tegqO3L6VoZ6SGtVZ+YIsn63iUdgBePWjLZakw8Nmq4w8AtjLVQABA8KjmyDYJYw
  19.484 +kPvmOrxBf6+Yz/rgt+MdSKcvZxStcG4LpVun/ek8D3NPreC+mbamCW08VkqtkkEy
  19.485 +HZUZCPNWuKZzFuZT/JzFW9l9W5iFkeG4u0x76sRnLSNbwMH+rZp0CiwJJUqW8PL1
  19.486 +5LrM1x30J+2iTeIk2lZ6XtheX6Hcn0gfHZ5GEC6pVeGYo1KQBI3bYOxfVYKItxCg
  19.487 +MQ5u6+6mltsn0WaeaXDATejLPEzfcaVDcJjUjm4mUF4Vhs9966sAzVFFpja0Zakw
  19.488 +bqZkGzeUFySie6xCeGxU4gS2OLw8tziOUJ6ds+qK91gXvRTmqHtNWJsgd6zyZ8Xu
  19.489 +lrfv2nPIV4DTfQNPEwjTmJFi1FTXpmQolbn21RsW5u1ChLIu+yttralxZLtiLLjM
  19.490 +5tqCzfvfgM+dddGMZL+Pq9UYVXusDxG1Bhw9mW4g7skrwPQNbi1e2j8+Gy04k1vF
  19.491 +r1c6NPPCMsAtvA5M9kOC6muz4GHeO1m4AepHyH7eft20AdMgBEFdekg5HiInkSv7
  19.492 +IcwMwlqIT9r5QTOp444c/drqxoh/wrTAvq86ImDDQb1oM09HYSBMedBaYTQzPBWM
  19.493 +sYs7b7Hz5v6QyUVvHR5JKICg44OGeIMi3C91npsEKNEhgbqNSMgFQd3xPLyZT08q
  19.494 +ZBZr93oXOtSZE2JRpQJ9nM09cEdtCbo1Sx0612q4RjeRE93sbH0noSYWl1Uq/i08
  19.495 +r/5E0D73I0GR3UfyXlWrHhvxbZkugJfnm8iBtV9tZl4Sp1VnSLl1cjYGxnrc+HuW
  19.496 +hz6U+caqLWwyRO/HW6AqyrETfOiFXqVJ/xxuHPnBb4VRBopJLcCz7hwHqTCp5LD8
  19.497 +w7OTujqc1LIibHH+hlHzUJiYxIWyZd5LY8t3MOb+ES+Zla9IP1zLftyazSTte1qH
  19.498 +tubCLYIMm5q7g1G7EzQob5rXlxEU2EJx7ms1TLaLb4TgPATJnqG4bwiGY6RhkXQ0
  19.499 +UXoY0YdsVQW6+KunoX9vtbDlP/WDcTI9LCESriQ2G5abvgNhAq78U++s7Y4S8X/+
  19.500 ++46EIl18EaUGgeD7YJG9ph+DYTK3w0B1JZcCSrFVQ/g0j7CIesr2az3gogGuxIbX
  19.501 +aMBRAT/dkLmdXs4asdPYMon0Om6xAnAVo/O5h9/shVa3B2X+DK4MhjRUcpB9BRIk
  19.502 +NPTPoFdIxKhy25AlOHlVuzo4uMTcxchrhPvwWK/74ezpr+D6VOoHrYz85jPKbZyr
  19.503 +vNsBrXB4Kxk4wIHkD/dD/WNIgJYUOiQJkTLO7fDr/Cpn0W+/izOPov87wf1WTMRe
  19.504 +V6KOzca3VkE7BwfhTtprc4t+kPOgKi09k0DK9gy0S1dbViYTJEZn3g80mMKqQj7d
  19.505 +KChIuXW2oS2IpDlyWr1fBmC/zXa8GxE0AihDcSavdnaDwcKyh+SNGavHlaZBpX83
  19.506 +IMRyA4Idp/FG9/+8g5Rcw6FefL94PZJ49tEox2rCLO9N6+GGRIpUDbUcwzcRsuNr
  19.507 +vp4O9vkSm5qLHGWrmGd9f81EY4w448emXr51oB4D2pYhc6vywWSHF+VDx2u8AJsS
  19.508 +1VYiApl0RTAexyk6uVQjspLsC7oNPyjxFlJSV3ecc8l2t/vFiBtNxBUI/vC8JLk7
  19.509 +KNN1DtRMzZaZUFEQG+IknGQ+NkU/+VI2sDfMth3FyP3ER0r57avz2EalCW3BLP6I
  19.510 +AbRCM1A75Ua9RLiY3G7cSQtKgrDKFA5+i+gVTy8oBmYE5T0lJIvYSdRcOoZcKjMV
  19.511 +UYn5ueOsaa9QBB72bP49+9XdwrrvXQLQqiK6sVl0NA78xTXPYT0Gy2vzNWVHPfG5
  19.512 +b6C5I05H6zV7mHhf+/Y2yDLFDptQzXWZPmzKv9yZ0YLK2vqoGYyUaG9WWzNSPrC9
  19.513 +Pj2Nw6rL7TsSG/x8I3vCZNTNTWQ4M739debnq6rgP+sapVHnSzZCIWOKhdawV77V
  19.514 +Ui+fkKnV/aSuEUJ0y+nY6O+fF1tgT2MYO63YvQctCS82A8pFStHHbPrQUrs7yMJ+
  19.515 +oWt4WXmhtUE0FJEYit/imYVZiSxsdeww8JVT/a/R6WhoXNUXYFJHMk3XpMuVbl+e
  19.516 +/+Suf6sgXF5UPzRb4n+qcjMogZH+DYUxJvCvSe9JUy0qptsb6Ux7hqUxpCrPbK+n
  19.517 +hSzTWb2c3oVFtQxZQH/Qu5+cLC2bE/0Fv9GeJBOsYApy7y1cEjqmnxRAeAa40C0m
  19.518 +wFd8c5Ym+og/fH3/4n0BLHTwDVG3o24AUjQeXoxdpGRJBz5QOKfda8j7S3I8Hhow
  19.519 +89cCszBISECuAcmwCsCLkfEbJBckpWYIsMwO/7S8sSvGcg7RSqHzKe/TZqnXuGyr
  19.520 +Ct5ufuxupR9Gc95O/yqm+HORtWRpA1KTNMSQPF2IBeI/nLi6xIOgLwgM9LkrsEsD
  19.521 +mI+ExAfy+0ivqU1QIlAZy+pwJHZ/A8eXevKYypwOGfVyWPIqORXfiklA/J227htQ
  19.522 +VPcp4TXIpSfeEXnGcN9qtdFRng7UACM8b2hsk/AjgSgXxR42oM+V1VROahggKRNr
  19.523 +mobEiOruNAop0udKTQy4f9SEyGJwnKiEs0dDFLs2iNxiG4MIabeGRbSTMyiJG3SK
  19.524 +iUKaTPN9idhPbXTUGlohjKgGRfxEe90LvAB/0KONlLfT8phTIRf4qBfy528LKLRm
  19.525 +3F/N9aYZsTBA5knx+hZkRwSBgkBV0fq/F353jk4n3fD+6DthVZRvosDH5obhB7C+
  19.526 +PB0nfdpjOGM8Cs99i36GvorAB06OMqyJsPX0BcO2a0oLV+T4zN9MygyLu31w1sQD
  19.527 +n2AGB06oMuznz8fZ/Ebv/yufc0IyCbMHZpkSa+mBmj9yFNyw7tTfut377lZAHSgh
  19.528 +R+j+g20bBYIE2wGY8uNIjE8fgOBAMTasC3Gel/Wv1tGH/cZGT3sBqm2YYUnvuMCm
  19.529 +2NEhO2j9zuQb9LfMtcrxe4NMaAX4BlO680GomMTIcjUeOmE4Sl7eQ32quiWVxnyb
  19.530 +4+QPy9ko1npfOaq4+ZKOXFQ6xpf7UeTDC5R8n2/dBo42u6vye33MEVn6W/jwp19/
  19.531 +z9JtDqUIQMYMBJRvsW1Z8zq3nw1yCbvVXR748HQmFERZ5wgJCY1SSHLlRr0YU5H3
  19.532 +hEaWcGffic9lP2sxelRFFINAw6yYd3LbCXzuMSC6djtaUCPyN0yAa3A3cJzE+Wcr
  19.533 +WFmSNLZYYnsEWH09qi5L9VuB01DGcMekxnygFk3hGr4cjroIxcJEPrrIaS3mKD6g
  19.534 +83GFfpel++cJhEKfM20Gm4HmCtAynpO16/Lefy8Rk+4BMaexP6Y7uRzMw5fKr53J
  19.535 +n7F9i3yMGPfotmxurGPlgx06GyieF+fHOFB/kwdN7xNavun6pTUDP16KOwlQMKhP
  19.536 +2gH+q4rEy5Eg11XGmvg55Ian97fLOtdhz+5oWKjypA9IofeSn+qY9S6WYWegYRJr
  19.537 +q5sbGNF9Vq12n4JZdG+GlofBy/Dzsm3B2Ic/roTuVOwCZslEyxR+qEAF72rGk3eO
  19.538 +/k52MCNUkIgEl+O3oGXc1VImYkZuIvESeN2XUy2x0A6wZnckb7JueF9wOkaVOD5N
  19.539 +ZUq8UwVxtakj/PeZVmTbJrknAL323UO6Mlqwcvik5iz/OTL96iL0MQfiNjE+6mUk
  19.540 +S3BcizttJR9A/gaG6+ettG3GwzLdyOA5bcoVxet9Dp98Z92r8kdtxJp2xfXDJ7iT
  19.541 +OcpeZ1Q/8jqCgxqyFC42u7Yh6WuOaxDyLZVjdNGbOUKocRh1LJZVTcvCvD02yqMZ
  19.542 +++zb73hDHQSC0tQIpN9q4KFRk7Zdpkq7k7lhAyU9bfgteg51r9exXKBENQ2ctW8q
  19.543 +fU1XvLptJMV5Ycfeq1KoiEPE/3StXC5kQaZefeRZgxpYzSwsWk+fHUu5uJp5nmrp
  19.544 +M5nG97zGlxxv2l5WYqxBUN3xsZyZUfe3W1FEWRwcbJDAc5sNzgag1xuBB1ZiGTO2
  19.545 +3JkDU+lzexdqTD3hdufH5wS01mpDnciJZzwP/JFjbmhBXHfqqcweWOucmEl3f85r
  19.546 +Cc6jEcdrJypbnmpp19sWKPk7MmcuyQsb2u7vQbQoRY7DBLSaC2QciwRGShbsD8kz
  19.547 +RLu1/nPEalLcR1GEAotu7iPWbnBaq0n0JLgtzRDcjcoNbHyFzI/G8jmd2sjZWpZk
  19.548 +9Ya4HQVOvtEI03gG4dxAPd+E+WSzPD3du50/E7mKcH4QRyb1ujvj3YYi1+sGEVBv
  19.549 +dLaP1PGyoQnOsFUoxH8R3dL7OfJHijoh795u+tI91lNU82kA1XPp+LcANjX53sjG
  19.550 +R/YNSjUfNg2edT+J89qWxtAEcKg2WayRwYo9DMGO4MLxcMZhgbqsiHL/tQfPRwad
  19.551 +f/Z3LT4RSWgeroOdudXxx7s+TQozdWxTM8SPyc2Te7Ba4oPq7uP7Kfp+uVqr52am
  19.552 +SNCK3mfKKRIVvwbypZN0E5U6k6CqtFAXBTCmNIOK7xA3xIR1R3olKC6JddTW4qoJ
  19.553 +qhO+SNPC2tb1vWzgzrHFNq+M0i4noDe8llo4q7IIM832ognR/9Wvp0AoHTTDpNS3
  19.554 +WRlRq56GwVWUlLNggyexLzdZdlzzMvQP/kH1rtaX9bWaux8oby6b52xayAHZeJbS
  19.555 +odCBZ9W+d1Ld9PJBX588h4Hydq0BxJxChdQkJFlNme3eVrYgPKS3a0IedRdyNOJu
  19.556 +S+yHmdmktaAcBikX3YWiV4w74DRl2U/sfWdr7faHTu4EG+4rG7VwXDj5fgo2aiHt
  19.557 +l0OvLqZiFX8MYQwpKLe86wKZ42DqdqzM0bvrsZmm2eerI3wjLEru2nPsXfrjOEfm
  19.558 +Kl25kLP0fp7Uj4RtXxwlHPxIRHlKgxgdZsv9H5yLcpi6bV61hEgUXbwZmA6j/Rtq
  19.559 +TtxXREBs7AtWk4aARYIEgmYDShYA/2+krUwE7JjJjA7KUEXN3n6UxoKm0hsYlWrr
  19.560 +pNxvkFy0OX9Rzczovii2Heni85vR6Mx1NbkdsnuJ7JcI6KqXTq4PabzMx+jlE9jh
  19.561 +MojXFbeN0ZxYTTBCa9Ql+PYxUDRu3zOvd32fooHBYUVUUuPHKAhgGDvn1KATEexU
  19.562 +t81odGx6/E2r3ewMmGVPt/1PKRJ9NVhq9VEUMPYxtusS2/H7LK0Nr3MPqp6TvywU
  19.563 +iRSICRwQqzJL1DSPmZuPVc+6Y5aL8HuTdccbZVwc8OucplQcGfTvmpy0Q4RpsG3O
  19.564 +NfWXWYHb1wXlcOY1a47JZwBoMcrrL5wmRVyMMcbTDKCkQeKaTchDrt6vR0gZiQNm
  19.565 +iysrMFuncaQCKMa0QVZV97Ly3OR7BfDlxhHiCx5XJkYxocUWdMP4XPumS4qD5Hbd
  19.566 +LdTHqTkKRuS6RsQzF3aTWaeMBen5Ju2+73FLHkUgplpmy6V8LxvLASWhv5aCZfJF
  19.567 +z9IGGIg1Wm3gpR3JNArX3JiPJlzxNVGizkHi+UOTKVa4KIfrrZ1n12TYg4Mp2pkk
  19.568 +SVaWmB+Rictfh7NyQpDHoLOc9FPg97IyDcyRoZHziCTJYfjjj6jleqTUr9jY1FPs
  19.569 +XptSg+P/STQBjM+Iw/zDJ0004BexddwGlPRPFSbbbWLOca6vrSGSEOp5/KSMYoCF
  19.570 +xYWfP/wPwkkEhvxax3QXDQBjAQAOiWkwpkvh5THQkQjbySu4yI0FJreCchnoDin1
  19.571 +/bGxNPKXoyLaNV8c0hmikOh43knw4ihZ7WCwN347xc8x6ElSGP7aZVLVK1NvCe9Q
  19.572 +YokS70Tn1JcZhM2QG2fu1XtI4kD/2+/3kJs1Js93Jwmvmy2M78nejUTaW0Sj8EST
  19.573 +eQs5/shoo8bJRt7PDtgf3ttKwBiUigP7Krx9O7zmdWHHXRUjYNomW24rIqQ/59sY
  19.574 +YUZ9ZfozQf8aJnSeKcHyH69FZa+EI8VEFdxXda/CrZqgD0NQWYSc8yDob8FpQSiP
  19.575 +sRLDs/PQTl0Aex01PEFIIlyHqgZPL4vLaOn9g1iRxM2y8SCEJHHowZkWfDauA8oP
  19.576 +Ce07FNKAw7JnlJyUTPPbAgWGTtmQLftcPz6AusRUzqUpRP6TfbMr50isz99jOAEn
  19.577 +GgUpWaGMo46Wbb/lj/0RpDLYFKvGcX4e3GqLDT3MIMVj3ReloDUd+cAwIx7AiFCP
  19.578 ++P8TCVgykU46/kCoV+hpGXHVB/1BHnvpapVAc9kexTr4fsy5ltUGNv2lseh7aOwl
  19.579 +iN1J/1hKyzF8fGiE2p7kw2xC+estom2hCJ8G2fOutuWKRsHVLljASP6AAhS46fnq
  19.580 +bdow8LF53HTMcqAWXmoFo5rNMZ6Wid1bMctdbhm71rgsx5eXy+ly3bAAodXrDhGG
  19.581 +XC4C3y9x0L2uPU1If56iKlaevqs5GGD2FaEkVrGuawpdjhb42CKJHrz1N9mNXXDe
  19.582 +0bycPQg6gvbR7M4z2R39ngOXLuiDE6JuHPJfgsxvZI9wXpW6zUZoTTv2ecdyZFaZ
  19.583 +WXT9oLI2OfMplGPTwiwiDtreqCifFeDndzHM8IVsVBk5MRYQ1gAaDwLXbA53UL4L
  19.584 +T6ZGH9rJVkUn1nHve6LOjYNt0+WPF/EUBFkUqfIsGQImR5OXh6+rfi8+GK/3XaID
  19.585 +cZ8LJ0ME2cEhQzDcy/irIIrA+8SjY53NfD4raFWv2LIO8S34boOgPPYtwRIYMN7a
  19.586 +EYpMX7rE11lEsKM7eqjFfFIBoCnKF0IAvSLgWk/jscB402UOxTgo9UXDLppnhYDD
  19.587 +LBx1aHgkAonumxTm16B1Ryxj9FfZDkw9GjQLHpiCHR5EB2OCkyXJTQ8YeVDaS4HK
  19.588 +vD5g3XWW+W0NCHd+mi8J3Vep5QWcARtcqJep8WTwji1PwawtpCYO9BAlcaSxC5SJ
  19.589 +O8SDsViUqxCvs4rRYIIFoWTfNqFAQxXLF7E+IFF8ui5Gm1Bz4zc7053jczOd3iOs
  19.590 +uubTH8J+Su+zXc87WnEusOD8k98f9wRBAbUajyXqbQVWy78g9ELr+zT0DBIMRJu0
  19.591 +UAHJdiDePc9HWzl57oH8yrVud8QcvR4L8C1RyROtTAm1tguswBMDKclQXGTcq3q1
  19.592 +ggXLOrN8Es4R4jNlIWw7uFfzyHNmCY6ZgwG5AxU195ej4zppKNwDYoXRTOwAVFkD
  19.593 +pipqX4wo4aE7GJqjAl4nzUiJNfiD6VmkTYokA2Zcr9WnzmUWRnnQ2h5LQtKsJXaU
  19.594 +TR0rDr4Vcf71YiTUgX9058vpwkiPPm76luLSveUW8zRDOOzyRJQoNWHZfWxB8xvY
  19.595 +w60jclFFQNBYHYSwwvV1y8xg2mcO5mFIKoT1Toh0NCDdN30xNmkB4jNa0Lql3ryO
  19.596 +Gej7iIyao78mwEY+1IfnRadssNd7tWpXA2PMOQVEdBgFL9ZZZmYKaOBUAHgAhh7d
  19.597 +MPwCWQSvnbtCe/QbPZMOW7DP5mIpQ8UJhik+S+SQNcR+aGF3JHoVcDf8jLGTv8XH
  19.598 +rEQ8LadLtl+nhHSttYxyerGrtnNH7i7KvvXwuQ8dBsgkdEa9Nof3DgDlS4VylkyX
  19.599 +L4ZhE6JR5V57jpU4kf9AnvIG/CUeT341/8Ho1HZSXL+ti9tcpnQr9+VN5YwzlKoj
  19.600 +K2twGHA+KkohQLUAufrD9oh29rk1oJ09ENUxsKZIvTr5wrsy1KntBpJkukkuC3TU
  19.601 +kA+HcMh5xPvO9O2afm6BUKLkOQ2Lbf8M6aHbGR9kP9S5LNnLbpOVS6ZsSl6PdBDn
  19.602 +eMLlY9r8FK/khfhU25/GgCf/01JC5HX1ybrDNkWkegcfJ4CnhwaKrxvnid4wCrLz
  19.603 +btbIcEv2k/1Lg+htjMd3WaWGlwnqsPw5MMpuiCrctRtTkY5PxDkFUZjNBBKh03hr
  19.604 +Ep6jEywufwbgs0zETDDJSnjwLk84Tw0jjckF3JsyHs9fSMBf4D5aDuT4pvbjHure
  19.605 +D2o6OeePbbLAnf6lfuTBNPgXaFRTW3EnT/5/0WNOl68y6WvfwNoWIlJ2+qROoMYP
  19.606 +8vmLgXldTiXqN+dzRnz+GylemU+Xos+0pBW8KaSOxMry47MROSRQS56ZrzF5HUJ0
  19.607 +Q9XQECsLFg+jw7zqkDsyaX8bZMaP9lflR17R8qv1tCoX6GmD5wLMjmiwrDIkfGoU
  19.608 +ishjzCpMBDUdDekWGqWW8CsC2A3mrqTin65kbHah9tfiwkdqmA1R65caeKD7XbF2
  19.609 +SGZv9fXzMokYacKxJhtYuZhDWq8pnhdpZF/ViVgfToMf5gnVU23PDLBQtaW3vGMA
  19.610 +/JLm2dLf1cwpfc/EeFTT5ouV8qnQbc1JrqC3iFL/6zo05cGHuM9jsgB3nmjj/D39
  19.611 +UWtonRy1yyv7TeJAUrcFf6V8dZxdaQJywkgD9+9/kvmjGod63gPcbowKcPklsrrG
  19.612 +2YibgUsVbRtcsRqcj2t+MOjzAWEpQr2n6aC2FfsFeFbLF7BAf2MMT0Y14ipaF0Bl
  19.613 +yRXrEpt8IQ6lbftEZnfWWAwe+VFvdC4F05ofJzS3jGaZdTIto4md+4wSqVvi0q/3
  19.614 +cjt/pf/qq6zNsJ+PWiydEvVWjtwIMkUNYnGD9S6acaYuhR9gxmWyC8ipLPIdu3pv
  19.615 +tIW2lfoglAI2BVi1m+B8QQsPa1KM2jPZwMicC3NNjUfJZJ2a278vKZ1mEVHpFuN+
  19.616 +VmeM4DW843kyTgIfkGGW1XEFs/Y4Y8DwI67zTWVX7bNtxwO3VIvne7Dl1kTT0XrB
  19.617 ++uZNOrV2XNvOwylVKaoEkdamKCjc7fpO1wmI7pnlJGTB3ld95cqtrw5BphpC8a9G
  19.618 +cHb2mGIY6Z7fnXgiZmclDdQ2k+bMnAI7EalaDUhOHbjN6vMLfI0rYm9EZKFuUbC+
  19.619 +yAWZ599UptruFsOQATOruA16LD+1/A0GWLNZjJfmsPtcCu5hvOUhLP5Xs8AV2v2o
  19.620 +g9vpJ5eKxySMlu8GIME6eIqmuSRH0TG6fXEQ6tbx6z5cCV4gU7CroinE+x05T3ss
  19.621 +/VW+8jD7JK0Mu1BBsoz+h614FJwmx7CoQOjbh5sUe38C2Hd/vtQQE7YFpDtfn+VT
  19.622 +CThkkIWtSp/x+J4aNSIoi62mBwNFhcEzQVz//P7uWaMSaEpwEhb0xXj5QyBLni5z
  19.623 ++v1udSjL1/Qmgm2o9xjPpuKr4nvtOpkWYq1X4bGCGC4idDHtRekFcDs2TFzKSRV6
  19.624 +reZ5uZtcxuI5gDCzniyC1t+GLC0l9hHIr1A00FP8rxo2GbDktICsGqlIysBRIGoS
  19.625 +qiLR6N5oCfZp1vB8tHB8oHtvmrt41TPCEEFNbS1Lzqa+gb3WysHR9SDlJJtyGXoc
  19.626 ++PUeML50SyDZxc1MKbFZ+NtV6qFjlE6eKUIQlt0DkNf7R/nrR5+TLnwf4S06SMF+
  19.627 +tWCXTttQ1sZWIHiPvMdeOBMQGnJwmCKiOE1ldMmJtrOnZq/Wh+d8PiE/QQEm2Nkj
  19.628 +fjbzXlmWdqUVKoVFtxd1Jebq8dfG7SjXDW+UUNOjJYmJ62m1mGkTv6ooVcYcqYHJ
  19.629 +Tol/A6R+7z8/umiF9kcSiYNU7Y+u4FhzMEltERnNP0N8tDbnN+3SkNEADxIv+GSh
  19.630 +7teXvKqs5Kr5ucXi3wXwG7g4b0DwHIn5QuM3xniC1MitkwYLpaMPS2QSE5lzLAZc
  19.631 +LbdtHucbvhtG5pG5xk3q4AeyFxbuwcC+B/CFxkobL9m+jB5vW4IuSIb0aA0hcWDN
  19.632 +gBxoavm19YaAutJJVvbK9Hv993oIqS9YcpEQQQagwy6C4GJkBjCqoQYrkJxLPysk
  19.633 +prZKAMQs5EXem19as6cvdOFVF+/5k+hLQK6jvR6OjSJNjan//3YXfOc4HfH+6w6B
  19.634 +f+K0HnESA631WEj+mXGySZyqLviwZ6l9iovgeiZKzlSYT+0nFzk2lkxRcnIi3MPS
  19.635 +mkC5TfqmJpCBkhjwhYUR4u1azR6t+8pn0LAdc+M9D2jXfP4eIEvxXa9sCxT457jx
  19.636 +dvecW1xzJ2g4Cz6JWSh52flGcWNh82qQcp2DOh5/3x7SD1j/vbjWrWrudOrqOULi
  19.637 +SFYVcx6Z9QWAwiJ9FvgEWtg7xsSDXpWk5WaGxky/DO39S0+8qTO4VIR20UGPKD6C
  19.638 +ONdkuuMg/OuRJJ+CmPE/26cq3mhyQU4lYtFveVLDjurvkR341D0ufNblWnosFsKA
  19.639 +BjNfigZ0Fa7ikf04xFhgsS5Yg8B9nLWZ89hHVKvAWiUQl7Y8aB6YIVDRtb/bLM4+
  19.640 +3EIwqmrJufqtnHWs+6CoWOqQqpKTVd3kSZNRhz1lTmDyG8eXnvJqblv3W28eBybA
  19.641 +UDRhjBzwu/LDQRWnrNtRBDRZX+6M8u+wkfKwrYMcGKzt6MpmEypkeDOLomPxIYVZ
  19.642 +/BCSJPOm73aPw3YWj5FLllCziYT2PG8P8M25k32YRSvoaL266wb8upxht+FPIoZb
  19.643 +RUb058RETlg86BB5AjASedLvbhvS+TQk9OMFSNd/xAVUISaD5PHsrTlvZsFhlleC
  19.644 +nHCFJPTrSATlEO2SbSo2Pndj6vL7qAUUcq+TSENYgVvrfywIt8HVWzId1dk8uJpJ
  19.645 +sVGVlLrV3Jg3pHGLpNog0jfSPS4zm54HEo6HKaOybeQhQrX76E7MkTS0ZYtl70vX
  19.646 +CHX0ZJ6bcaZZd6xEWXSc6ZvpDPZ9+PpUpnRAEvvPDS1hgviqXIbgCbRX8D4Ijz/1
  19.647 +mHBdGkxbc1yuklCEHUzT/2o3L/wtcTbRdAedmHYbT11crOeK6/Dew475B5AQDiSh
  19.648 +r4Gx+Duoca2pZ7/8hoiydH8yNEx8/Rof2l44Tzph8oBzruvUCz5iq7kpXUC336bm
  19.649 +eXObhiETPnn7Z9SiW76IMg2xM+qB/x14JOJdpL76lBGh+kdkPla2VHRjMqJLHcOS
  19.650 +QJJollzF4Rt33DJwbhgnSgmTxibvF6Jffe/mLALMIA5+rpeIJ5z3FAUtZpBYO+k1
  19.651 +IxpJVs0Pipn+SQoEz6fOzKqdMWLmd2OSgAKncEjAoc3k7B/XQBAVBB6XlEHmCny5
  19.652 ++mEraMyucz1hGnvNts3hixD3lYtrtrF6T9iCf5Fe7sw8RxuKhiJSjuh7A0agCQpC
  19.653 +lrIw9Nxj3umXY+0u6vvC8p9fX0zajma8xNgbxdiN9u8CbRBP4ge4zpfg74co4yZN
  19.654 ++XskQbBWW2BGNfFWLdy3wgB+6b3Wr+WinCf7bbscivIUhKfyByy7Fa8w1KQNOryq
  19.655 +EOaaf68+6ZD/GUHN00EX1SjHXMw87SWwVF71nQbdxGffw/Y8E94nUR/lWc6cclxg
  19.656 +5ia+sY2KQ/aS8kwcwPsgvpxpkSJETex6IEN3x/8hIR5edIoZ8KBujwB1nkhUPG3h
  19.657 +kpCF5Sv9I4BLYjQmsoceSLltu+pVZrVRCpJM70Po8BsZKKynub/NK6U0ZGX50YTy
  19.658 +eb4GnUMQ898mSsti0uSrljPQn1mNZKFRmbo9ccDMCd4mNUliDonapN7b+HmFm54s
  19.659 +gFOuS2bxIrIW2GAyPnoVQAiC9PqMuZxu032c9N8zldJpkJzQOw8IxwwMclF8va76
  19.660 +IcpDZesnjRxT58BsiDpCBJVSkdGUkM2MOf5EG3gtPOM8ctwqj/H3HZNiPWtnUBXG
  19.661 +LW6qxfh9zpRGbVwskRrpIK6vcTvHbU8f/35YaV+oBcdwS6OClUmvf3ddi+XHdXve
  19.662 +ymqndqJlu9xr51yRQetOjvGjDVSNACny/+D4G9R2D4xs9O+Qt4AnR8Q26lso/Rna
  19.663 +G2zu/uR/M4D2/fPYuWl+nezA3cmdlV+e5bIQ0Yubj9cKX2v+9JkTOd1U9ThyU2jw
  19.664 +E3dNfbpc8Hyt80HdTPyOGVzzS42MYiZ5Ztw/z6oAZlhWmwB66ZPJ+u7tyv85cawa
  19.665 +uReZ+gNNIkbil+zUXIhRy+Nlf/kbYL32+mk5dovlmY3RYZPY1wIstlhD2pP4FBsP
  19.666 +2MZD8/XEyJbA7b6oQjVHyq9GXvWvvaQnO3nJZcWv4dOtK4yjTZOzIX1AYP7Tq6MD
  19.667 +8nnpIkineJwhS+cZ44cKuTRHO2gpVCbaqePvQIZ8suba/FKWMiqq0AR93/9aqQ7b
  19.668 +7viuC78q+CFRX1y0SkFdTajHDkFFYiRXKHF9FHQ7Fku7cVBo4JTuazL0m6FOdeQ3
  19.669 +Ub6iHbilACRm8Qx3UWOi52z9glYwPxPWjzI73t06pNHWR+VFhpyutfqXEBVmt+vT
  19.670 +Uwk/M9Sb9kfsdgTbZL6e7R63TOcK66OZMx7F431TnGZ6U4NU6HQveO9//xBqTah5
  19.671 +SvoyfFo54sWOhttsZm5dagh8I8rKTt2c5aFOX1UhBy2Rm21SPyGs4IM36u15qDW8
  19.672 +nqeqxhTsLOOwMV6vyw3sFYW8Acwu/DXf9ULw/2N3kizC/6h+BpEBdbYwwheCVpkT
  19.673 +AiQE6Bj9+WQElV27BkMXAw73vpEd2MygtehifjgtGywed7fdbQ7OZbX+kQzbbCkw
  19.674 +Qr5pP4lEzAG+Rp/cXupXVahJ3QrqsRMo5s6wC43eMuuNaCPUvYEUS07qTMnvARzo
  19.675 +NFJt3Wy/jf2IYHXnVlGF3Erlmlu7zLqv4bv3FISAvIfsKjH499KiNhRUYZ/relvu
  19.676 +ludob2P7HzRCCiFkINKRyhNrLgrM0u5hAp7IHrzJOrRqI/BJKdX2NKURfe9IWN0X
  19.677 +y8ScnsQEb2VX7l2dnLhznwBGev4KmmyS3/JMbQ1UlT6+OXqtDvIWgN3XUNLMSxmR
  19.678 +8iXcqG72m8HWLQ8bdxWMU4BVhWRh8JPHy/bU1bffDuYSa3ncZzrqc6g+F3dOlnk2
  19.679 +LANZTHcFXlOcKpbuI+N13AS5i8L/W4+6JbeDNGQvRtGAVoUiaRZz9hF24qMhkKhc
  19.680 +8KkSuKtbFstRIuumQUUHL35dpm3+jAecfPkw98zFXQTTDqkJHdE71/fpewaa6cZm
  19.681 +TXs0XKA2gw9CBJiZ9phvlTT7WpYem/AuLLwKSMEHRuFxnddDws5WOBUfeO4ZR9Kr
  19.682 ++MuGob+X2si9YCH5OHgvGX9DxwoGFY4iIq51nXcECefq12CKpSjeiX7Rbw2XC0YY
  19.683 +x18x1wuC1YcH6AnfjU/KmCQftM3WGcE7+WlgvneahWo4l589t/zyaeSzFFoA/fY9
  19.684 +RIhLVBV+tEKGGGdriSY62S+aytwGFYFW/3JxiMPAKCtIbMwbykjZBbRt7z1S+Qgo
  19.685 +iPAc17ns+ZzY+PeLdTACBtxFxFzskuCoCDXPpVIQ1N5/SgQygNIyk32c0QvxxJ3m
  19.686 +ilfsXzIhLixYEkqjY0OUU4kznLdxHg5tNRyRa9DoplpSzeHPjhtZJw7qEYfdxTz5
  19.687 +hQsfvLCgfJKsudMlQhCzJSdeWthzU8y0vk6DYWcEPcDHwlsvx8nlIdjYTRvrJfrv
  19.688 +LnBDPiFLWAj7EFOsVVGhoe7MiOTTN33suFk4h138z/dS/IYUYbrKm+KqhiL1vMV6
  19.689 +VdQFhI1rI6PIMmvu8hiYnNAQSjOObjn9iGJ9uTuA6H6X4uK7CsqQT0ut14ytMjl5
  19.690 +R2vX35AUm7wPIFJP3yN485tCNbAcvyqRcfsaSUC4ky+dX3IUYZ3k2uo2LE1/BNKg
  19.691 +Cql9hvK94/AFA7++zMHzhVcCA7tKT4fFRhQPABphAnvdyGM0Xby6fPRc0iWXeIA4
  19.692 +T37KOmD48QCWsKKBkuvARQJR4bz6F5CwD1WB6Y9L01rz//7/AMzOeTpMNKXZsekZ
  19.693 +X4wWIVDXmlnWNauLuFCcDwxvKztvjT0lCSgZVIQ1lo+ktoeQnfle1D54qnSYZTMw
  19.694 +8webkv36vS3a35b4vOx3ynEoLuxCmcsh2zd5ADgODqktIy13BAVMsjpxvMN02mWB
  19.695 +1yJSh6ljLDawO2K59NmFw1dF6l8MsmZzyiVBrYUWtKGTq03h0G8/cHCQTJJa8mMm
  19.696 +OwRVYIfXoXzZkBdZo0q99Y3Lp8/RZh1n6rF/yyYjRj2FUbaYNKwYLKO/4+9WB2ao
  19.697 +Ia8Vhk2LcrMgDnsT+CMOyJv4Rqxovk2IIJdOq0kPoL9fKgcmuTG5d9xd04I+j4KJ
  19.698 +qRnhs/OTzh9FGjJTR59ygXygensFuF6fi19oTzQDI4+AMbObsyH6DipVsnrR9X0U
  19.699 +sHQP0J9wN6kRXQr4GYBUoxRiVXqrNuatI1qVBTqJgLZEkunQMZ8LRrNMZcV1uCtw
  19.700 +Ld1IL1IhrfkCanLl4dnOsjLgw4mdBlqMnnwq+1Wez6fS37tv7vGsOlAE5E95ZPpx
  19.701 +CCePzaz8tgGSQlku+wkfh4uwREK8mFL7kIob7T2G3djxLLDd9KLFqf1xUZEbBDUg
  19.702 +v9WUqOXD5OH6TUf6F6rXMF7vavowXLoVXBrauxbay8PYYMQYf/TsX7O0DeoQUFOe
  19.703 +LoqJ+p5ZnMnJqvpYz4wya5zq3g+IzLuh0zMTQFrCi0+I/FNKkKWXC9I/bk46Msrp
  19.704 +S4m20H2Yr8l105p9cfG+SSgxIEvgI47e+ZkpAX5zmh3qW/i1jHemfI7XjQEoZC/H
  19.705 +q1LZrHpelcmkNb+SCUxvzZucKntGmU3RsUS2BTvjT0+9UOYa77PvemFNkjpKj2Yy
  19.706 +VpVt3vinRgpt0JZZhUOCMH5BVK6ldGdLZj/C64M86r5Yr928Lo9uvR+7hjWmHg2r
  19.707 +wITboKYuEfXtm6OXTk/Wic4qG41Wka28mCe2RKl3o+1GSe2pMIW28gREPf0xKqNR
  19.708 +VR2mrbHshcvnLp8SnKjtGiArvHrFRB2reGsqvveQf/5KroG6YtlCJZcsaEyxGC9S
  19.709 +tuf4t3bFJLehwktPPo0g/1ctTD6tsBGOP6vfkjszu8BdXfJMHjmzyj/JmVcoRD7U
  19.710 +RY5uh8wqEvfLdCeLQBPSeP7HcmIgtqgjz0Vt6zGu4VaaVOaNRZ0dm+hlJ8xbaJhu
  19.711 ++cojGNmp12r22zPHB9QlDS8LIbOluQyifxVfieOFyGCkIdSgQDHSnC/xJUS+07TH
  19.712 +BRXn7g8dJ5Bd+WI3prdePA4xDPTTAG3ddFC7bDtx0sf+PyNWAv7b39rHiowG14Wn
  19.713 +KnBrhGbLQ3S+DTjnfvYRy+8EKUKew2AKlAdWuwN5XWu19ti+CKLUNmOjDoh3jgPT
  19.714 +brWr6IWeDfqjc8RUpuP4Ttl8+WbJaSddtSTv4rG4Gg1lyKLCxVAR93T2y8L/yFAm
  19.715 +Mmw5ERFIOmSq1tnLK5uW6tURQBAhF00o6dV2N/6NaxMeHKa6Z22RR7hIKvWWEVgZ
  19.716 +FtNvyg2/vaZcFRpG1kDuRzm94U9RD06fm3Ts7ycbupayVA7bT/yEgmYOEITGd7ch
  19.717 +hisdwLtV7xjqbKqJ2LfzdWAzVNpcITkySlhTgKtLy7fxlcZDzIZD6cHYLdjviI2A
  19.718 +UjPXok+ImXeCeEHt5U5SUfPpdeMeQKiOAtsuP2A/f6DCTlzba1QvOrE/0RzKTyYn
  19.719 +PaKCnObTOFQ7mmP/WYVpaurx0Gl9yu8St8J1b6wfb8gzUKSrQtxnwBLCDQ+de3RJ
  19.720 +7cY4dFzWrIBWh3CuNP/q64N3eQIWU0r0zXq4bVXbqaY0vz5AgQWLvtNUjpKNEetw
  19.721 +8InxemH71clbYnKx9jES8YOzIrMXXyKIUAzTrbZgm9JEmd5KxkZ/IWN+B+gNYPUN
  19.722 +Qi5hzN0ukUKWfoOBCXuYkmbVKW8h5ZPG6kScmTvBSA3ae21muAAuj3pKTN68aeCS
  19.723 +JvPnMBOw7hWwPLQazCEOKneCg6QjNUASDhQBu1vSfQ1mPg8By+xDnFQxNVCWxvKN
  19.724 +Eh25Zu1plCH7O0DhtjRDR+2V2c+D0Ds4yd9Y3AzmM9jFR7fOIIlyDVX0bOFdQ0lN
  19.725 +qKAfNBN0ASLLwdT+sih1+n4eRb7blbQt5e8+duJIXFRiAsDLbut520ZAmX1J1xfR
  19.726 +r3Ki964uVc3Y8iPH/Z4ws6YaDyeDSoHN6zA/4qYLPlu27Hv4iOBZmKnuoePpZ8Ly
  19.727 +W1KafcajzQ==
  19.728 +=V3DY
  19.729 +-----END PGP MESSAGE-----
  19.730 +
  19.731 +--238e1f2946e87ccd3d1b58ba507ed7ab--
    20.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    20.2 +++ b/test/test_mails/check_reset_grouped_own_multiple_keys_multiple_idents_reset_all_0.eml	Thu Jan 16 12:40:10 2020 +0100
    20.3 @@ -0,0 +1,282 @@
    20.4 +Message-ID: <pEp.Q425FH.1ETY1DS6FA2V0.6BC9DED6-AF65-460B-A6B6-335D658A69FC@darthmama.org>
    20.5 +From: Alexander Braithwaite <pep.test.alexander6@darthmama.org>
    20.6 +To: Alexander Braithwaite <pep.test.alexander6@darthmama.org>
    20.7 +Subject: =?utf-8?Q?p=E2=89=A1p?=
    20.8 +X-pEp-Version: 2.1
    20.9 +MIME-Version: 1.0
   20.10 +Content-Type: multipart/encrypted; boundary="140e0f763352255a109cf92eded7263"; 
   20.11 + protocol="application/pgp-encrypted"
   20.12 +
   20.13 +--140e0f763352255a109cf92eded7263
   20.14 +Content-Type: application/pgp-encrypted
   20.15 +
   20.16 +Version: 1
   20.17 +--140e0f763352255a109cf92eded7263
   20.18 +Content-Type: application/octet-stream
   20.19 +Content-Transfer-Encoding: 7bit
   20.20 +Content-Disposition: inline; filename="msg.asc"
   20.21 +
   20.22 +-----BEGIN PGP MESSAGE-----
   20.23 +
   20.24 +wcDMA6LykRmZQFqGAQv/Zod+TWODCLcZizS22tcIwWpfOhcveeYggKIVHBvh7she
   20.25 +fixEYr6eZiPQltvG+E4Y5ibLkMHozHqwJXFLMP9dShtirf4xU/5C4+LPgl0yLpSM
   20.26 +E/DGyMI46xlR3uu8nO0dhn2VLbtuEn3gu7HznOEhQkjJVcl370jrDzFUtbBbmLVE
   20.27 +vrhG2YAOeSdAuYqPLY464ioOQCzNE8+YJIvwSQXo34XKItLbxIQAuQLNKI6U4lCk
   20.28 +PVSsEEluGq0xSNvKr4kDH2UMxUFOsyvUg2f4stiHEPyKuvp6exB5cYkrsIUNdnek
   20.29 +vcEdQKIzjyWV7nt+G9NyzbfMOx9bhcZEsc//m3I/0tRd+3i5rjHFkN8pZ2Uanh9g
   20.30 +a4jbZ1gBt/HsCtv52VE3sfjrp/Nj9bHCcOeDx3SOb1HphqZ+/2fxNUYiyR0UI5CF
   20.31 +ADN40tnr55CmH8u0LdORnNe8+U5tytmGsRTFRiUDiNnEJZ/qY5MGkjXH5UBwrHU+
   20.32 +PI4gaLiZBLk2+XyNfumqwcDMA6LykRmZQFqGAQv+Jlb4ZjYJOZFYW9OfVhYnVcK4
   20.33 +Jfhc/BKjplk43++awHv9J7LTtlszQqDfpVQVDAYJfbCxMgxP2NwNbIoDR8ZAahv1
   20.34 +Kl0iniaNIDahsiQsUAc4E4fT2G2Aho4OtVlQ3/IDD3ATCFzT2Tk7voBAV9nSdSep
   20.35 +lHl/N69Ant3ZIMZXAv0xrRrQcItXLN1/ls2qb40RA2u64z7JFJsJrE6+76YcSHoj
   20.36 +wAW9KtCLQXN3t3kmgUH+qPvjz9nke2HEXGOfgWOKvBcYTL90HDLOCJ5BChKJlnvG
   20.37 +L00X33iantLwALfendWqK1k3b9tVRK9a2QJLqJFQGSNzx7Nddm7UxYL6O1eFWOZT
   20.38 +ndNPNx1CxzvkCzhPw5lK5JxcRKronnkIRjf2UvFGnrTLA31e0IlJacU3kXaBO7sr
   20.39 +6LPigv5SEoWYm1Y72NRnM7U19CbB+46eNu0gBEVlm5Rcrr3lAGTGhKi/vl3n19Qo
   20.40 +U+HwSdZdKKRvTHeLceCYpg+qCUqwvSnrUZAGkZEA0v8AAC02Af3wOUEKiEv38316
   20.41 +VWvAbmNcb8VCr1tgBvBjjn35eT0MuXqTnTcdnehJ+vBsL28CShOztcHla+UdSdgs
   20.42 +4uXCCnXe2oLwmn6JufTZr8z9x//6R82sWdC4azygYgJpwcRq15QmmhRsYHtj+CaM
   20.43 +6mtpg5afWrA3lzRYX4Xx7EufKRK3nJ4WYJOhW/lPTZ9f7axKINSXGfGN1K3vOCbD
   20.44 +hdtzSLWRyQSoVJxeYBjvwxJPJU+zGetRcw+1uI5ws2xoHeJYxMw2+8PBRjdNvVvi
   20.45 +dqHwb1eaUV97MoSaAV2ReTW/Bajdwb9n+sKSM3I1LiIIyWdK5Lrp6+2koKNyN0AM
   20.46 +9MGX07uG9XJ+D8gNiw0aV6MxkVRzuqjUMIvm6gos61/MwuC2vRjR6c16HWxsA7vW
   20.47 +FO12wt6iS+Snz8e6vla/kaRuMJnhXwwdphX0wl+ar8G1JElufhq4xhNG74wcuOdi
   20.48 +gMcpee3MLLCJLprVI2mriHhVCmmA9g+YbCWlJo09zbfBD+afJfSVKZNTr4ZJBt0h
   20.49 +ckmL7b8K6rcn3j+7twUcnw341atqzaEeMzx33B9kqIjT7MX2P8cuC+DlpQzdBY84
   20.50 +JLWIuMS6Fj7L6XCE1Bk0SlK+o1V7vqNY6qPnPLRPojlf0Pyj467DTp6l0IcHnqnD
   20.51 +L6JTNvXsQKdEk8+sGCEZTGKNSoL+6IJiX8T9mYJJ8KAkQSJjqwE4UY7CisqA8hvU
   20.52 +JdGcCmjRkNp3sKK/i25FNDEXOLUOQfujT1RxBdno6Ytr5xrkGC1db9HsdNnYnkZW
   20.53 +sC7tkVSUlkfJKMkZOnkk9qcTqZlpkbbIXsZQtGU58oJW/X11TlaPVPfOD6hDiUW+
   20.54 +lahnAQ9iE4Z59hbWnGoRhtqAmoL3kjIl1vBML4NpkHuUydmfCP3hc+OCwnhRFygm
   20.55 +aMNK6LSEIJ8qFOTCDLRUboVHt9d9bUvz8oNVd6zzqZTykzXJ6BJMXVAHDBvqazAu
   20.56 +q4Wfuv96/p+zKdoR4ZWhxu3Elxt5bRCHBIhVkBdXt9zKyFVWPQq9eHNPcWzLL/cn
   20.57 +cdDIiDeRrGvhrY4xhDNErfJW3YmSVVnURZtas6oe4+bYLGn3pprysOKTkplYHTPX
   20.58 +IBeK1JazZPcddKSJqn/BLduXPf+WNCbFsfl3Rp0rdHD0FGyJbNA4LKrOyugVwHwr
   20.59 +ZGTha50lad1DQeaCN3Gh/omepnkVJ0KB7Q/V1YpVXSI86SL5aj7Ms3trkdrGW7vG
   20.60 +QG1AA6v7uHe85S6m+MydK6kOnkl9GPq4mWTvul3kzXbKGgXKcCBdf1jVxEWJ8g/v
   20.61 +WTth8hbKCusPxmzTteeXWS+/hm2AjvphtyINmmS5GIUgCko1koGfnBqe5cHvav1D
   20.62 +Ppw/KPkfXyQ0D1SHYHl+Xx+qvYSXIdw/fGnpPpLGRdnxdazgYb+9Gbz4j0DIyExh
   20.63 +ipl+a58d0yTU/Jxu+O/h34BR7j2cFwRWJvBiPpNOm2grFLe9TReYJn39WVS4vBqR
   20.64 +lNa1KOVySRGHXTGf/NC8lorU6b0ve/9C7Ob/S/DxJDN1qVRjXQs5T57lZlyM+PWl
   20.65 +bklzFnTpxL5hl2IPVTyi1NxDx2OiyOVjSTrkd8UsjcNQieJNnA9NQ/Ret74gZJDj
   20.66 +uYoHJlTivytPGnxwSK/zpE5rcWGNJpb2obpypQlvKN+4tzm32eJIznZNFfMf7kgW
   20.67 +WMiYERjnwNuLLDndqMxG0idqP2Al5r3o2wpy6joGFDaP1sAWXOGSuLM6C97AXgAY
   20.68 +EKNrCP7mHYmMcgX7MQK2x5zAeeLPo2J+LOrz/BKxdC//9Z/XyH0lyWyorTFyc+nI
   20.69 +IMoL2gBmT19HsT0/bH9PJ8pAL+1pa6jf89r0nn5BzmJNBDY42cV8feKP3oT5joWf
   20.70 +/JSvV1y05kLSORTrPK/9/oJuHwms2wsUrI/knJjswd/kRsBcNTUarPoQpXjH3t0a
   20.71 +82Da0+nrBuUVglA292kfVKtGpiNZxCh53Xm+X3rW9fl+bU8mO9FtYBSO6iCMAoge
   20.72 +rkMox64SRcBAPd2N/0v6kt85JL3u9v6Kzy24bP8+JRDk3nZSx2p0QBdyo3FKuIhh
   20.73 +ZpVu6P0XZZyEI04QhBUd508mg4/GvQ4q8rssiProUxt03IjHtusbBYnqP4QDTA0f
   20.74 +d7b9tEGaTSLguOu5TNDAOFgU4ID/2z8qEWwdupYeJl6BshN6Kf+BHnX1ViBAQZdH
   20.75 +lfxIdxetbpxpm1effeOvCa3NJg3uFbGLyG0s72DKpMhhWY8FzN5eb2CTZRHyWa8h
   20.76 +cpmn02tylIEaQpPb2iEXLhv04/MBzuzbyhR823WNBaVPNCdUTVDdwK2AA2ZbNVly
   20.77 +KoIVDS7HcF+z7MIbsrs2oY8shMeFgmpYa+7WEUX7Qn9REbRA9NeaDrqegthW4o7P
   20.78 +XhbCe9zYu0+G58NDrUaw2XoqQF8UNdo9ijFjEXBzgeq+xF+Hjhg6ynQCI7HIhqxD
   20.79 +ZV7W7LAtt/HmVRnmzC1SDTtxJPCCsL/MpUiTYm7rUButVPXgkMMPHhfw80Eh/D5W
   20.80 +CKbkP7NNPlFrhCuzIBvPJBDqUZkHmTBMfilkIOFagI+eahfyVpwnU4bSphfm+Tkj
   20.81 +GDiKz2ADjxZlN5TLz4cdsRZshuuwk/xxDXfouLqazyRaaEdhdcsblYNarjnKoicr
   20.82 +ib018TkbVsNw4vypozglw7IDGghNX1pZfT5Hd/jOXWmmV82/TrVXHcAj1PLxVicX
   20.83 +LyNJ28b0c4509k7HaWu1I2FLY/x47JmJUSxxL8JN5F2VwY71TuKA/NnIm2f2dZvq
   20.84 +6yYMMMF+vGuy/wD8MSmQ9Y5i+26r+aUxSUvoYYsyL2ZCoOW1b+4xdzlpaVA5mSHA
   20.85 +gxI0sDxu17eTr4UUuEBXYLQa6x5ZKrrAQNhCQQU1m3ohDxevZ5438iMjHWEQf0qy
   20.86 +rToG05Xc5i9fdhznPu+4+i3bKVnQafoZtrpB+UjFVCM7vwQAqv/1GmID7/yEYrMw
   20.87 +nLFKfziYcP+CvY/ff9vbaOywKViS56sXxm9A9/ThQ7zBWe2B83RX2f6INcC1v+Dx
   20.88 +rLWAGsEtWPub7TyNoiFq4WuKg69Hg+j79rSewURlcqontzbRdb9hzAkdCfaEeVJY
   20.89 +Cl8xmFTcToRC0JWy09+SXVGoPxk1HeJGV2xrboQ1RgfKHjvlUeoXtyivesJHAGVR
   20.90 +0o+DTYqb4CRjbSCOC74nii7GKZ+wP8qv+KY0E6I5IE3YPFXp0QQxv1sdFPxyo4n+
   20.91 +VtLwhK/IZ8yQTsC1piPeO59uEU+VMfViaMYoD7OziurUpv1xXfNTn2W7cW+hwM6t
   20.92 +YJTD/wsbutlxgKw1Y6dl6rk83iVg+5N/jI2wCPGDpwm9XU2rVzvh87pzSdQhk8jd
   20.93 +BEzrPOQoK1WyYuCb9flGm8rm+oFQOQaM+5Fb0Kvh+w6Doy81+c/jntxml7H2Muwy
   20.94 +QwCdsPv59V9yVRz3QFoDMUI0xfbDxFx/7PRLph3T7i7z1LwUilsKiqVH/7i++xCn
   20.95 +/fz3El/VgfmnoN23oNGQbvEYfIdggsrYQ32JlSuuMY4t2W2UqhNAtamJ7g7jj9Vm
   20.96 +lqgeMHGRFJ4EIGlWJ+4D9wC6kwHv9B23egDAqE0R1m57F2gbOh7rr++TkAOKIvOt
   20.97 +SLbPcROGVWryYiv760Wbk/For00EhxbIovk+y9dox+J+09MKGrf7sIHQER+2EqpD
   20.98 +QL1OlEwL4ioRBDn1uy0/lQrNFeIozsx+RgZ76PMe5LRGvZq+nq1bPZiSE3eG4OnT
   20.99 +B0tz4N/U0inM7dMfOx9KFH84trf157He0s1tjJXi5gdt5M6I7H3fTFwxPtb3qYYz
  20.100 +a5NX88rLI8Dn4BvP/61LRpwvskuNLd1ZvNXQ8ZA/cc9K0l6cVFDABvzTcXmF15/C
  20.101 +g4iH9dZ3m++K74luyn6k9AReLsELEb6sJxLBLIB7e1Z7aIU5xEyVVProK5m9DjRl
  20.102 +f/PSMV6UKkDhWMT9VfZvR2ZoG6KTXG4NJ+eFlzwa+V6chiQZYuWm1gt0N4wD25QJ
  20.103 +L36+yCVuFn0Vj2RIaVJBpnDCFADefJMT5EDyKWU61aJ2hVd8Y9oypG99L6NrfNaZ
  20.104 +/eejnzAl28hJYUQwFepnrXWWdv99FBncu3ZDYcCJRdf+o2MVRd+VIONQXo36p1kP
  20.105 +5QksX/p2MBGbO76ozB/iVKOlLQULCti8/St/xk2sl4jtRUmoKXPzQBlDqvOMlLjf
  20.106 +0Y9tbw8EPGHk02YsLFzriP+Kb9jgO/GdZ4HK+4ULf5T3ZMoLMSIs11eNp6r8uHzm
  20.107 +jpSPpvaR+NnYkdRvUj3rFNGvJTI0tiqBFqB+BjI2KFk2zDlCq7dArfYdCf3OMgtE
  20.108 +OJufKxb7kOLlR8qy8dIs9gBNv3Ybf1gX1h4smXRpO/h9exjl413uzZXLYYrSJFGK
  20.109 +9I2SNKt1GZcOmjMeG9JdPjKisKQ5sPIMC/xpOO+BHJnLi09NG4pCJLdtTl01cU9n
  20.110 +FLYxhuXtmBVyeidXT1vvRd9ey7hGjX/mh6dEy2NlbgejCo+hqR9p5BjvEmGo/Njx
  20.111 +llRxBMGhfbvChpjm45ud9uz8xc6TcBG4sfdHKRpJxY8zFJu0cuxStNkE23tS4kNg
  20.112 +tTC7Th+7Y5d8UFz1wZLAiEFqCLL/xNjZBucjFRqPPlhVduYa+ZoiZZvOYaEowXvT
  20.113 +DQhAxhFLU7qDp+shre/JMyTHV5fJQ80Rl4646VBBmNerA7zi2v9R6S0IkQi1ISUK
  20.114 +vUVjYFOrwwjTcZueS2ESXf5j6FRYk2oFn50z98qGoA3t67hq4VgGiPeJbL/Cl9vs
  20.115 +GTpi5A1N2fp8kDcXhG0PCC48rqKUihA/kPuMYKehRrsLJbKpRfvuuHEUnmjPOL5d
  20.116 +5BFQ4qObRs0sB9U8vEoJfZkF5wtN0+l3rwUFygu1jSmbDb6k6CjWAq+zKCVwYTie
  20.117 +Eq7fNffEQw+A6+V03VUSpVeWajUL7onoq5KvFiDy10Z4V1Z3rehB2ZM2LInhqpPI
  20.118 +gxqVEsLyVzV7QwexYr68aBpQGrv9af6nWYeQCyTfYbywuMOM5l/oHAj3AZNIi7NS
  20.119 +jGpD2QL5g8zQbsYcNEy/KK/u0JC6KRJ2Ys6Xle6lPcgHMjUcM/rlWKbXHl1hp6Kw
  20.120 +RYDxuehVeGHeOWPIMUMBFKmA6nZNK98BguXSxe6wRd2z3mId1P1KcvxqLnzmaGuw
  20.121 +HB1FVgWkvDWPrO2eDFWde8x9xWlvkpLDhYdwDqYcGH4Y7LsEphCw2kgxY3Lkb/QO
  20.122 +/4etGD+spyysp9mtVqPacjW7QsqJSkidWxUDW2jpjryg/luPnIId93ZbsJvyljYe
  20.123 +jfpcN0uF3YcQLRMfLXr7V9f4fBuid2XmjsFH98mD0+I5seZijgb8le7sWBvhpJsv
  20.124 +L1XYWorXmXujBaEXNy29Xn4iXWUi2RT3NKRV+EHG0upeffWC5y8Nq0YLOO0QU3gL
  20.125 +PogKKDfrY3E79ShDHTmC7k0zot3mHOBl+nX9g+GCLOqybPeJKQdHeZlO9JxDRpyE
  20.126 +cnHqgF3323Zx/lU3ZhEaPUGyE/QzZYczUoogpb9O05vkKRN72dDbV4OzxqOpb7mB
  20.127 +7dYgJPd3hQ57sNQ8Fgdect01ULT5S1RbzGOm7O7B51WjyrIyo9UjTGKB9Lu3I0j1
  20.128 +A3QmbC+BnkFmY6vbPWwediI3mrcDoRwz62qw1PQO+poRKHkNpjhmwARUBi71ifor
  20.129 +2d77wXLYGgEY85/p1Ww3J74mBiKddPH9OfpChHYx+VRaQirF4GfwaxjPhlisCPX1
  20.130 +/H9b6eaNGR7sKY+ZAYajD4M8QV3fba/m2xd1ygjuRsq+8NvqjOQrLl3yw0U7Q4tp
  20.131 +BN8eOY7XkXjGlbkaWNIjSZTbxVBwQFv6t6NkZzVuuNTuVbOz1pEYVxdftHRmu/JO
  20.132 +kbKg40IMZiQhsRy+yxraeT1K4Fx2s1Qs2gw5qGHeGGBkuwjIB+3qPUeCMSevvn2p
  20.133 +PP9UCFiVv7uG3LUCqBbtMHlmT6cDAfD5qGo2ExXZKfvGHbFZyTsQ6B6AR6vOd8S8
  20.134 +0xm05ZF/AmOcPkLg3IiBX6nltTS/vlcC5M1AfE8kev7+0s6o0Xdh3zAa7oSjGlpG
  20.135 +JJCks8C3Y3s2D0o9ScKaSf7GDerlxAL2rYZKMgm6MsigD5P75fX/VtaWokUQhtWQ
  20.136 +WWVzwvMjrNLxQhuWvHlBKOZvGnDG5dHHVIT4ImC0bWDEjibZo8vHbgSa0I/71o63
  20.137 +uuG5jZxhY/hY/XkKXhjA2HRcSa6J1IX1NeQZsMpGrPt2Qu9n3frV5Tz/crLMZLky
  20.138 +paTB6wUHad2NCtlR47N611cFQpW1kwSKpEMUVM5mrnpQQ3SS3mS6S8Bsjh0f2Ccm
  20.139 +yB5x/LXy85WUvQ+YC6DvU1C7IQG+Kd346ES53q7N586LqDRAg+PAiUsaT3YPDgf3
  20.140 +jQIlAAXCXIEWUfPRTCeLQ5+xj9buIHsRB34RSUtLMuydTWPi0DHfu0gBmzFVrhSp
  20.141 +QfI77MqlYxe27V+l1AVh00iaP89GONJ9mMys1glPbuAcT9kGndZ43ADLQiqLyHOj
  20.142 +xriA8NHFnZA2RQf8jgoaGWYuScyR3p5GS/QwQ14Pk6lYhprNZxanl2DE90UNCx70
  20.143 +L+y/FdR2V6PrSJkfAIcUZRtAGykIJAtKUu42O/ra/d+OAQHl0oKvM3KBXlIt1TXr
  20.144 +W7EGv8zxGAs7qK3J4+UZnTHRDCNjOc9E1NkeX2pHuFZ8rKvdk54xo6l089DUCdGm
  20.145 +Qz4aHT7qhC50qsrJ1l1pug/5WlshZxT+PHaFvWhGCK78w6nl5Y6QW9hgJ1n6n/Kk
  20.146 +4OZP4FAOibQVDmi4t9GvQYj+o2qaIP9+yHJFr3iaHpyE5ZH9wjRGFG/j4ULWRG5S
  20.147 +tDqXANcvGYtXPsrz6oGoLERPnxAPkDzF3kIHcoF8vtg1KdPUIaN4pwPhYvMSm00F
  20.148 +DovykWEJJxul2tF2tmCiMmuTRxm9Dtn7o87UBHLFK0cxgtpqm20EevsbzMLnu+Sv
  20.149 +/BTxBJu32SUTsZJoFOJ+04SP9A8Kv0/dFNj+Eba/ERHKO1oRBaiEsRWuGTUFBby+
  20.150 +xrhRL+jdY/lOsThAjSUacD82Y2UN0cRxfpl9AjXKt8/l3ZwYpdN5vbOyJums9eRD
  20.151 +113hrITLhEzASDcdCT94JS6+FQ+z3KGVGJyN8bTIGZbPOJTQ/8QCB28z5Bj46hxd
  20.152 +sfp34MTcK9qrY3zWHVfnj/FyuAiKnExTUc2iYrCK3A16yP8oLiq4dhWqKDdy1Fny
  20.153 +5EvvQtsQwftYRucTppOYtEtHK5GRbuEv2j//9CAgNPV0zJPbwIRjc1LvXLiP7BLP
  20.154 +PrnX/t8lXHLWL598bDG/oeM4jHwI+cxjSN76rnH1jkNGBv0kTLo30poRFaW4Nl/3
  20.155 +iwDLAFcUdPVPP+FYs9DHNuWWsUThq0CdBo4SLFLECrJv26tTYTRZ9pBTwm7POBXM
  20.156 +u7/M5XAD9KsnNAZpvKMMwKDLZm9Pii5cPIP91ZnwFyEXFml0gdZvDtClg6ZiCrYz
  20.157 +SPFCaBKdOzwAlKKsW1uag1WQW4pJhbnEJs5vQzhSD9rF5QaJgFBur8nVM/Iw2tOj
  20.158 +jrNQoMSu6336hMhTYlVhdLEtAFCmfinvFASlusTZTiTA9HnQCkYKRy213FU2/Emu
  20.159 +M4F6KkK/AkPaBvbY9qFTMYrEbuBgvlI+Tvk2Evg87kyKReXhzpuWm6yfcmPAFtfY
  20.160 +WNsWFN9iCUZSYTc0LPalmpCMn0fUn3bXk8/Gc5T89X5U91TKPUIps9WEi3qt8c47
  20.161 +tjQcLw2uon7xDOqc0NG/Rwx6AmgNuU3jo30PTnYjFwAcS42W3ntelbGcasPIqLlt
  20.162 +rpWc31GaIppe4lYu9ULdxGr3vlmgkUIB4ebH3/dyNlLd27YtiJfwx0FumLfKLhmY
  20.163 +fXY79eIslzS2OqJYFl17xCA/b4iCAJX47GgE1/kQps+ZTdHYIKynxy9TzWgoRw5b
  20.164 +ab810B4cpx9NUvjnuupt4ynm+uyIWOyRmUOhhAk9OmWyOLywTCG6mroHHM0gQSPL
  20.165 +kAAZrtXo3n87CkssPCmbWiAA9M0MUSFF7RuN7naoaD+JVuBqTi3GdmEfRm8mXzW9
  20.166 +BG3G4l6pKrRRdoy6d3q18WvAZWjPzLL1OK/N8b+SscNJzRv0J6jRupshID+FPsk0
  20.167 +9c7oIIjVnV1Er03P5p636d4/0nctzMAIYxNfkW40jJdAhkjB5rfErvQOvWCs8rRN
  20.168 +ulS/KKjYRU50IkyrSM7r4CjP6HX2iH7AzS3n4weLxV36fZ/y7+V5DzjOdjYvjN3x
  20.169 +o0koP84CoqrlyHyJlbu3Qp83U4vTNE7VLeLg/h3hc1O5wilp5lTSxorR1C0QJg03
  20.170 +rgGAThibkUW8o0K9ZSUwIJ6cJX5iCxOwNgzokqgC66lN2odqmplE8siOUboOzHsk
  20.171 +y6+raa6Q1y1K/wp6rAhraqngd+LxhbH+5A3ZVHK9eh5NjAs5o2UIHBxbihYxbnTm
  20.172 +NmZ6wbx7aW+0+YGZ9zViRzoFkrjqWOe2UyP9dQ6WMd9W+/se4FAS39WX8nv/ac2a
  20.173 +ULiOnIoWV7Nri2Pc5VePwJtykGZAtgH6CyLeaThQeDbu0jW8e8gvDVPeM8vyWKGb
  20.174 +NgU7dmUE8a9cAbqs2LDyduaCRFN7JZvvnxSfZ+vPLT5bt/uHpjePXWTHPN0/E2xV
  20.175 +akzP1PnixDnK0oV+QZqF2ZKpLfuNqYYS/D3rPE5KqWVkvZ7FOzJrJLTmVRYEAbWS
  20.176 +fS6uPPWjZEvGA2qmLOMcmdnCp/eKrY+ZeI41Sejde3L/X6+HpXZl8KLes+CsVUPP
  20.177 +qOp0lIlOOrDAzZWL5IRe2mD66msRvAMpGHgYC5F0D6DISRcnuvvh21nP56uNG+v4
  20.178 +1tFALGjNpU4fLr02l0UIWne7Gr8FAZPLq17ZCNbx3hqErYehnomXIC9ZuzSGzrB3
  20.179 +6ToMXbkaaprfRFVu9kofcXGeLPolQ5tXzYdT5ME/LFqa1TLjmDHrt6DD3XuJQftv
  20.180 +TEgP/4pH4wvBe5a30iPQR1bqXj3eYdNm1s24eNcCSsTSbZuSsQWSGJf9KiYjrX9Q
  20.181 +kJVXBxu6g17I3ZGvHNy39X+COJrAGbP92K91BBr+f8Kg5rO/CjLKsBCCojlN+U2M
  20.182 +MxoSyj4Gqe7VR+/1zeqIft3A8Kp22g2QehoQTIJC5bGZkn8AH6yxbMVSLexncKtK
  20.183 +NEsjqJieAx2D4Fvp8FkRjii/lPwYADcjvTm5bRK26SJ6JNFY/hiFHU8Dw1y30DYn
  20.184 +r6yXs63T4TpD3+NUjdXd9+KDFYiZwuGO8fwRiznK9p8Dyls65j7/05GHE/VgPPP7
  20.185 +CAAFnnSo+dWsWXy3qkNarsgD7uWz8ImHY9GyJBoHQwZ/6cVyvG0/0T/Hx163Xr12
  20.186 +eavye1AvdJTsIT9mC/X+fl0Aw6+YLKha8dgnfu+VNXR2BGf9nteNjVOXlb028pm1
  20.187 +tx05v/qTdAkupu3oP90v9HmyQDW+/VWdx12Ku6xoEqr5//p1pumqNY3rR2vDNQtF
  20.188 +tT3q4PQye/Ta0MwqxKm+FAHdw1KxjZGCd1eD0hgN4bGZk25z47ZwqXQK+rkXaF/C
  20.189 +l5XWiPsN6D1KnmmO9ad3rwFsMS9JFIPlp2etFBSGsg58xEq87i/rApShldHNYuw2
  20.190 +svdxOJ/GTqz1Ir7fKoPV5IYY1uOOxBgeGkoigdWBtzWWUpsVWanHdJdt+NqLJE00
  20.191 +BSztijP5M+bORKm++hhtD2M7Vl8vK9POQlybtSNOzzpXxU336irohsXHZbXwgAK2
  20.192 +Qb0kN2rG5GxXJL0b2asZ8mi/l1XOc9Eor2CiqOofjIWO9+N3Nvr3ornH7DJRBByH
  20.193 +7HK1ZGQ9yB0YgR/BJyEyaep/wixHXPPbIW4PfLK36J2mlvW/CfjJxneft01sesqK
  20.194 +ILGiNLrahaDOF5/RB6uZhwkX2KiNz6vbjDfM/zL85C/WXsRlh2xHe+b5SmRsIcI2
  20.195 +MZ88jfpAM4jAzRfa7iaM8d5JRqo/H6+hrOdc2Kmv/v9tNHG/lxR3u26fKpKoHXaB
  20.196 +sms7rWkfMMO0PoL3NJxfL+a/86zkLA7pgxJ+gUiEB0tIGQQO9jfJ6ZnhdRwmXxVI
  20.197 +CoHKO+E0k57z46i4uQutzZs03bcHiCIFCCMZOkXhryEr25XWXg9w75shS/xP0h4j
  20.198 +X8sX90/5yFl139OdXfQYVIphB4pdr09qGOGpcyUlOotlcHfAvg0UlkrAT4nB+rA+
  20.199 +59dGzdSIML/8K9hG1QPrLCi0yZF5WYEFChUajQZVTUocHRPysBHCrkJeaiJqckDv
  20.200 +KdhFMxoNcrfyHEImS9hv8YT2Q2taAwZcwGeEEZUw4dcoHbWqGaXG/VBp7fYw6639
  20.201 +iTpSIzkH8z7olusYRmpudHU7CqrXDOETr2XZxGnJ4n4CPmRxr6FYtc7CFlnfLzFd
  20.202 +kic2OlEBPbn+R5FOnD0fipfyFpXN/2vOpXccZo0xr3+dFA4pYv4z+tQUatOKH+2O
  20.203 +88eNTcLfQVKZ7QwlhvmFcKMIjs6mBmMplkpt3VxcMNsy8cKHuoRVvtChLYTx7xJf
  20.204 +W0w1OeIDVebtXFxjSkV4d21V/X8c9tOttbSYFop4Yv6s1clsocn/t5Hqzp7C9THX
  20.205 +rVFzz0LPcaUNiBnLnYdOi69EoiV607B8YANhDzeR6aKOM5W2j6K2oMB+6D6k6Oqs
  20.206 +xW3lmdxrcgPxDrqUMuqep7s0X9Wy/V8qEnR9fgnfVNdg65RouRTIOdEHlIICQol+
  20.207 +KoLBtLJNYrvIsDUnj5sjNXTJ+4C+eYrSZLHJN2JuU1YdlzXviyvPQ+jq6JB7x/nc
  20.208 +XHJ5DuuTKqk/SUpx3p3E3mtZFN4AHla2VUEvzZLRTYLQjkmI5iOhDkh7dhsHy7vY
  20.209 +uyAI8bMgd9NK9JqzN3YsQRVChOsmSgxJ0BjiLV/io4aVwYHRm2pRw+9+O0GQGhL2
  20.210 +E6ZIrKWg7NAApgIoaXy0A+097WlYq1Mxmn32nAkqcUBNfbV2tBizTtmOyNLZ0njW
  20.211 +8xp74/NPag6K7pUirieJaryI1Dn6C3cfSAgZck3MqB4t+s7hmFtaoreYq/4nS0F+
  20.212 +JlOuM9OjKNDfeLctuPJ5fNn1J4uEE83o+FJw4tg2vEIWJvu+4LmcH0LgZaQYVSmz
  20.213 +B/jdd1jtAtsin38s+Hirl5Aa9x6B4BWIe4GgLuTyFmxvShUr1K4eTKmBFFHCPFTd
  20.214 +j0OW4BtTWkl0zf+pY8gCknjx/NviGcl4lAYkuWj08jncJipW93nxnDqhuNzWidkq
  20.215 +P5W6gnQn5Fg3KKrGn7ohCHSM8vd63HDguN223Ye1/BHF8q/9Uu7GFBP5KJcCRn3B
  20.216 +/hvThp0HFYSnE5WniOG5Yu66oEhk3AVMhQlm0rVw1W1EbWTzydJU8rrH/ryif9bX
  20.217 +PDxJzZIVtuh33b6h3lXq08rzGsEBqhdq8jEqFXqkotT35fuFwH2FncIYR3xNKYfZ
  20.218 +bg6MQSiM7or6X5HAxNrp5I/MeT71H5PiJw6jOJmQz06BTyo+HX+24MHlmxS9OHvr
  20.219 +Su97Af3hBJM6brUpg8rGIbYKlHeVS723GmpUWKnQlEJzTrfbhhnnoIZm6mJ1bEDw
  20.220 +/ryzIrWBX1FCHNcfcZGeTagEfxgyoBiWbOHZZaGkU5746MFJ7nTImHvbGAFBMkQW
  20.221 +sch28gF+3XzJeCXPZSXtB1JFpyfYdNI8ROlIXbEpWZozqukztKNh6/8etxRmf4Jr
  20.222 +0qNdf4ND8UfYE6/JyY9Swm3+61Py7DqKxa6EBe7ugZz+07qbHdotLUWOuHlF4mZr
  20.223 +kW61oSeenSRBSsrk1ELGJmBpgrdddQUHi6+HIHg++BytHqmCCgjgGhvF9v+1bW++
  20.224 +xo9icGIY1RSaApnD+pboL5KeW4pxxZ7UWuTlQUa4A3s8EzGXf9PSM2/cRTgpRH6l
  20.225 +jC4eAhe4l+A787JXM4E0HZiziyEJSA/I8rRfGDDqOs/gWZe9bE7ThFvq3M68Ldzu
  20.226 +HRVL5lQd5Iy0mhkGcqmyoMw0WzbIySevNPsSTQqXHP4fQT9e19W5Nn7C+0LXIjKL
  20.227 +2wrGNiIXpqoGdF0oby/amAZn4km4w5SikoSw2S0SMXBQ7jDUMVGOELNknmjGgIIc
  20.228 +XWyZcws93IY3yWW20vfCe9HEyg7Ft1hKUng1VT6L7s3fw24Pzc2Vj1QitHDYXenX
  20.229 +O9xU3O/zN9qwvCv/M9XVo9mvmowup54ZiucFy0ymELjqCffzhESOj5/mvkUD5YMS
  20.230 +guQDygoBi9w3ER2KBUzMur2I8u2mE2PLXkF0c1xq3r3KAkQ4g3fM7a8qBCZsllTr
  20.231 +LNlCV2P5eP3//S8UT/V5+UrCqTI/9oDUEweQcBTUmUuP3zcJKIo7HtR+dvXZCz8c
  20.232 +xkDcEZHSmzDx/9P+6WcqqHji90ilwHwAiwjiwftp2AerCpuVUxyIt9R5EoX4mWOO
  20.233 +U2z+QX69O4V1pXT/b8JUmD6VW83x2O2NRt/Hv0ZJw+wDWrzmFHmBNXw32RxucOrZ
  20.234 +ogjxGHVi2zTf9m+bmepdn2i1dNIblAe+a//FPtikDcIyJEsK/CfMgpS3V4LFZ72S
  20.235 +W7/JMQdUEg3nQHlJosk/TdAWCZSdZkji42XmyBo+MCl7uCcEiYdVjff+Xk2sBi4Y
  20.236 +LzZnz/vfVhuxgh3vgp54Mjx1YLq+Di8UjNEOHk/rdkKhcS/SsfjfHQ31dvgmOOSN
  20.237 +4lUnTxWipxLOeX+xNiVlb7mygqepsi3PjGzHNI110UADbiif1JoQqedMzoo3F+PX
  20.238 +ON3rLyOxO08/ezcaSab4m65Fc6KSOcGYMbAHOtRlqeRZAZA4w7LynmwbBC43NGus
  20.239 +eQ2mdWfKtz4UnO1IEoAtdCwSPcIt5HuVBYI8IAywMe0Ic3+oTJiipkmDmEKV43zj
  20.240 +LwyY032nOQEtEY5jBF6cF1DHdOkXpdACWYthAi2UC+HVojp1IEBsJIc/eJjH6Wpx
  20.241 +oPFr6IARyFzVmQxXZaco+fofHIFaatI+tKFDU8fJ/YTz9Dmk9buIKN34lPVhqbp9
  20.242 +/iAiBBcj1VmUGlPrNaIpKEakqpmBD26sILfMFWEqJ09s+RrkrUY5af22z1oRYNwT
  20.243 +fxWYYbITaNlnfn6at5F19nTuGZNFZSmMfQS6+ST6BleBHhxVWT4DdfXTQcYjC58z
  20.244 +K5nIRNSnwbxB5EjnZb7QBPaJdx5V3xxH5VQTj4R2aAZagLSc7Gzc8uFOVRH8LMD7
  20.245 +CTO9oKQoN6DpIVAtYRavsaUIrtCSlZqzUSDAjpouP3fNOkri0nDsmTrfN7cufkNT
  20.246 +bTWqVDc4efQmsRFFlUSRfnP1JJfMYVN3aG8jIa0d8YLH7rJ1mxhlUrZV7+Dqeifz
  20.247 +GGO9Q2gA96szKqrxGqJi9H8ViImDOzcn8gjq3fScKc1adL1cEid3d5yLM2/lnfHk
  20.248 +r8W+T2XL2jGWvzZh0h/W8qOGEcDWla+6ItzrVwEt2X3E8FXvJ1y1FKb37uCqETN1
  20.249 +DPPbGvRO5Ncmoxe5BUc0eh0HQSqW1mcmoq2/AVs+NmGm8aGbVA93IIbzExi0LR5F
  20.250 +gGk5yTxkL6IfIy9W0jPKAIRG3tIM+Bedh7PFGoUJBGPQ2Mel+MquJaR8xDK9TR7w
  20.251 +MgeQmVZOaauNQzO3WQh1MQsoPxx1shuDtU8X/m4Ygf6LaJigi8NomSJ4tj4E1Xpl
  20.252 +F4gP1UtCZslZKIeERekGm96N5DF/QdeXYzlg9jd7b7h+AXzhvEREB0DfKt3fz2dr
  20.253 +3IbPZ3ozDMhMrNtOWZHnBiNdBekhk+J3mM1yfjBZETdoIjOgQyhEct+aPSaMS5GP
  20.254 +Iog5HjK82wBKKeZirZ6a2tCF8815if2D3JkAL/9cxNdA5wDtaymDLDEVRQIAPZy3
  20.255 +WNu5CHUtYt2CxShUKfV769jgwZ4rLrMPFHusHdltQ6FR+Xzv/VTIALdZAD4Ls3TQ
  20.256 +DmCrWyWcg5BsClmvVLh7YxwCaYoBUtbRoLXnnFjrooIZYPa29jwF7CPjGPuSsM1L
  20.257 +JDnEeijIpv5PF9LopdzLXNrR7KLnb21FL17O1CQOEA2ynHiof3FcciDfgzXjIqnW
  20.258 +ufOaebzyalYvZTaNgjqGZprbt3hksayvF5Zr0Ew/pE/12F6wvRTlw/tGbJ9gFZkX
  20.259 +pHobisoqL1P7E4Jb+ZyQ8AxT4EW8qeObyhdyhugY4AS/RZjOa+Mrv2jkQwS3rbe+
  20.260 +cf15IZYrAlVwJ+mFjUUgB6nS03x2VdzhQIWzOpqQMHW09C6Vw6GSSC3bsxTEKrJA
  20.261 +IclQfeFIyYiZw7HY5tVpejdGiXPzNU2nXIq0HrbNgx9ieZOBGXKl7/lFHz2fsKNS
  20.262 +12orTPu6zZYccOxQHRmIwCRurVaDyyI6H0kRHNA6AJCJ7RjD9yUV8AlZ/q8cT/GJ
  20.263 +OfMNrcvkPJ1NcAua5UIi7DwTgKyQ1mVt1IaibwOhZJY83lbVfZWDKG//zf3wBI1J
  20.264 +Atbd4Y3TyksoR94xYfvCb+Fi2QTBUPDUtKILN6aCh0/fY+CK2iHHylNmpYITeNV0
  20.265 +tC+ggrO5StnyCVoEAeByodkla66mBs8yGQReWTbuid+svLchZBDEC2w/qB3l8h+I
  20.266 +q6UqGioamG1EWM+CHHVEeSnISyUAJd79fGTqxKX9wh3o2tlTl0R3uHsxgU+XnhWN
  20.267 +zVUG8d0+dF0h8tRuAhwd1ATUwajx5hTo74l8lSRILBAkX17HhcRnm/Y4PnAea5/U
  20.268 +TVTLZS6t+xSkp4D5j0N1p6kXk04dW/SCfwt0Dlyi2pLzn/y54sJ/l2ydRIMkNx2x
  20.269 +v9LViRncgSGwhznAqb1o0IjWiVkHl3J8xGXuoIYwepWISa/axImGp3x0jmsCNlpF
  20.270 +ggZZefaTUGXVRzm3E14u49YaPVk71pySNwW0TJbKyufrZ4i0p0bz07sbjj+P2dVs
  20.271 +DnfnhEO/N5kO6PXXSzv7EaDH5JMr/QPRaKa+KlNFFeR+3WOHcsP4zrTb2GZEknQu
  20.272 +AbfxRZJH3jPyV8diVje8R8zRWSsNZ5PhbXOHCx0mnjFNlIAjha489gFC+7AW14ro
  20.273 +A+HXcVaY3p1DkCzAxO0r8sh8+aR6xZzttWKc9QbReA4aawhJxBTOHrPz8KVnESNr
  20.274 +ldJ5c3zHDRS6UZx/azQlIP5Ts4QuzropWy90STP8O5jY1t0uoQd2E1LfSP9QdTyD
  20.275 +cnB/MEF/lam0oKyk1etkFHZHsNg9Xlki6D82Cnc/cXTALzOsxsw9Zr+E3tYE/2mK
  20.276 +DUTtD4d0OlD8KEPv7ox5tNw1TrqNWMbm7Y7K9JIKEugctQhN8XIhsDs+XeytreD5
  20.277 +dlOfl/OiDa3yIOMzxq7hkq5LvOQf3i4WQj64qbNfXZHpyikDLPtlZdSSSmvbF9G+
  20.278 +b4V83lHqc3rKW/z+pFAlsK0PTqFMnOsaVdCx+Z9l8wi69kRn0rq0VTKVreC/wcmX
  20.279 +yW5LFq/e3Y27Ay4aVhq2QLqW20uYBDxOtVP23SSqg8aIE7oqEt2wX7ah41cmx3Fg
  20.280 +w2hNhzrLE+sfBL4JepnyTM3hZVpDt9OKpk8KmbvwPJ/KBUfGOfXORtUpJwTINypJ
  20.281 +njv+sW6/5WTRnqOQQ3OsPGneejP9r0DPPP2ccQJqWvILy/hq6Deh3LO7
  20.282 +=aZcx
  20.283 +-----END PGP MESSAGE-----
  20.284 +
  20.285 +--140e0f763352255a109cf92eded7263--
    21.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    21.2 +++ b/test/test_mails/check_reset_grouped_own_multiple_keys_multiple_idents_reset_all_1.eml	Thu Jan 16 12:40:10 2020 +0100
    21.3 @@ -0,0 +1,283 @@
    21.4 +Message-ID: <pEp.Q425FH.08YT0PZAVGPHL.A1D83B22-E1DF-4AFB-85F6-69DF63B37E25@darthmama.org>
    21.5 +From: Alexander Braithwaite <pep.test.alexander6a@darthmama.org>
    21.6 +To: Alexander Braithwaite <pep.test.alexander6a@darthmama.org>
    21.7 +Subject: =?utf-8?Q?p=E2=89=A1p?=
    21.8 +X-pEp-Version: 2.1
    21.9 +MIME-Version: 1.0
   21.10 +Content-Type: multipart/encrypted; boundary="7fdcc2331befd79f41a7c4c96b68079a"; 
   21.11 + protocol="application/pgp-encrypted"
   21.12 +
   21.13 +--7fdcc2331befd79f41a7c4c96b68079a
   21.14 +Content-Type: application/pgp-encrypted
   21.15 +
   21.16 +Version: 1
   21.17 +--7fdcc2331befd79f41a7c4c96b68079a
   21.18 +Content-Type: application/octet-stream
   21.19 +Content-Transfer-Encoding: 7bit
   21.20 +Content-Disposition: inline; filename="msg.asc"
   21.21 +
   21.22 +-----BEGIN PGP MESSAGE-----
   21.23 +
   21.24 +wcDMA9EjQt8gdmG+AQv+MzN9yRRf56G4caJEzxNqR04ECTaVdX4/s0sorLfDtxev
   21.25 +fuuQp4txZlV6IT9LLLHRjny1O0uUYaBToF3Nsu4rDNolJRexK0KukAppKeUNhjJD
   21.26 +GDBcz39vgv/CvVwlOEIiYOa9WgGH5ZzcQ1EiWsn3fH+iZNjsaQXNBkDgXq8ARGBK
   21.27 +vCzarHv+c19NIFXr0BE3e5E0f7X1AzShPdywzadALtQ4VmpOu8fLNnDgB05xzQzM
   21.28 +5axFkWvHRRz3DPSHbCs1VTDDjoivXVknTZNZqj8Ey8H/hPYoxFCYnwNkPBTFBagd
   21.29 +UTCzX7aTKgRTnT5cPZjlFwYcTyyqesyk5lPxRDUdncJtyf8mZi6ytghsLPHjiFsd
   21.30 +55XRJovWo+uS/rlc4xbYZLresWWnGxVqc2gl1BrVcNlYt5jKe3VGuxb316tfRgRc
   21.31 +TlGFpmsGy1yS3qNiaM8YAzrhTegiixOTigVHtNwuFNLOnpL3dkxYQVvT84lKGEQC
   21.32 +ppVoeB7EmNLyfiXJjRF1wcDMA9EjQt8gdmG+AQv/fI2lEBkEJ+i3LI7ZDwg1JnM5
   21.33 +Q4iJFFgXtB/xdu9tU5cZJrcTRYl7DPuJpRrK8EW3TX7ONqCPBsifEgOMo3heygC8
   21.34 +KaG0M1z9/6vvMHyhscWd7y/rm3rZiiulXVC16DCgIwVEKbGlKD/zcA7hfhjCqEnE
   21.35 +Bk6ZTRoJyQl4YEyf7WzA+SMgv3l22MpceN0FfVJKbwMk5t8tJnLtbtFbyc3qScYz
   21.36 +12YXH5v9fbqI39Js5HfHPrstYrD2Usc5dSf55EhKnhxnvbqLncVp76afveFm2nXE
   21.37 +AF0nWkvE6/bwius6o2L/as/gBTBRKr14RFpJEPsWDpnmakidKJu7T4OZFcoaZLN/
   21.38 +ynxMgMZpme2Gsog9ODlNWkCbFym6viuXyMbz0+mZQ7c+6EQWa1gc/7eI0cZqX25w
   21.39 +5HZ61e06ET0TuhaAeU4NvyTjPNLOqQGgSN5ykz82k9h1a+fkNbiFfIbMnRWszTxQ
   21.40 +Y09IhxMZcijROprLe4nw+czvSXEgs5U7RpLliqXY0v8AAC1CAa+zaQb6PlFeH+LO
   21.41 +y9UW8GgjtAg06VWDlV8twKFW9TemlWOFN/R5HWzOxYE6IviagV54gRxAdb5Bhc7h
   21.42 +0RoiP2J7Vza2iDqQFIadVzd0F7Wp6KYMeQlJ8wFYR+afjsI0GpRP/cUBqOSqZwz0
   21.43 +qpirjjNMAI031yKc1AUrYatYlCVS0fhJYaWSCX2Ieff3+MbZxciAA78JWTWKNfQD
   21.44 +Hy5XSN807FIdnq1TcNVc/Dc2/P1AlPfSifTkr18M1Sch4en5X9paYUGWXgerTYVu
   21.45 +7ZAO8vOrP9QRxFIjBA51Sk2kunkUDSPaSWca5UF01OUfTI9Rqg5b9v0WaCJuFh4c
   21.46 +Ginr6mZYmn2nzwId97gJholTK3MswIYqXNUemZpSG9u+BN3jGpqFQAQxrAhlMgZ1
   21.47 ++GarNNqX6w9xlF3/pLlouzSVS2gSx6xc/6fHxgRCq/6dT4i9ieuveH2cTRt/6ipi
   21.48 +Ur9JEimxPdZgA2jsiYTj16Fi1ygIybmsUxjuvmz1INblZqpe9AhdQstFUQ7B+AbP
   21.49 +A8+cDAJizOkVj+P0a9cGGdsccxaPi+VIppZS0jNHvVxYTGGOQdak4iSv5qq4s5lp
   21.50 +bcmz6vby6z2tMI2LYeJ363nPik9Er+fCHV8RFoAF2vDIBScPRJ/i/bvU2C9oKoiG
   21.51 +m0mZC8DasZVBtFZFRuvgIIpjpu9bk7CttpITYO+T5qIPdaf/9dDVVNvwGjXpyJAy
   21.52 +pjTEwrFi5Iwx4xOeiLCuREoeIIXjCxxEAvXjYvO0uUFxrWKTf6NwPAbA9RLN62o+
   21.53 +TSMx6BhaD8O1oPffEO0uWRY8XxQt70GG8GcXQD7wq1IVosYotYuEMFZbf3l/RuZS
   21.54 +GPIJDwDx16pWnHzCxlAy9pjftVM6WxX0jqztLoznrjrDQNiCBjgUwJwse6mXLk22
   21.55 +iBVsiTfJAxapToyeEUHCXfJ3YsyFgRB5soCIOvQwBKhFJ88cLr7QJ0HdrwRpaQI0
   21.56 +3rYtIntfrCTmEqBXEA4+Sm5Dr8rWQNlQ6+Z6M2X0mX/wUKVz/ARYvqsjngRSUxl/
   21.57 +AT9G6jpym7yDQ2HN5KkrJeCpdWR6CsHI7KACMOSs86+Rm1HYv1ClfCO4rTnINuBv
   21.58 +QYs73unpkHi0EJ4G+AE4c1VNpmde8GpYIDG2/B3lldHba2vs9rQUxh0F9jAOsGaq
   21.59 ++7axi4okg0+ZoJr/TWGQzOioNICHgArjdUCZU5dv45cxrNpuRn/lOtnT+Z7SINsr
   21.60 +x/RBs+rc8aMKjKutbruHn/9qsJv820BTP0wV2PMFAY2qfll65r13jIqFsk1RgodF
   21.61 +LI55Oy7V6z3v1SifTdHB2124tUtRvYkWhJJhs2sUSeAzDOLCh3LD38Cupq+RrmLd
   21.62 +LTUsw44Wxmnd+UvBbSstt2V5v0ZQONKhrdk+T64+ZygrKg1HEAJuIBf33spx2lx8
   21.63 +ri3NYWs+2YGTeU8RT3Z2Cu+nxqyZnWMjlII9qnxbvZBpzSdvAAN8Zcz8xkymgvhu
   21.64 +JpiOLtDyYT67glFr7HaH6bigEot14LExr8KFadS1UKhObzwd/SF6jWp3MFIiU5VG
   21.65 +i2GTZIt380SNXRraC1E+KbkdEikhedxtm5a2pEmPvYsgrMJop5alonP6sQa5M9f1
   21.66 +zm47UsIaVgeqaujUiudXy16xvmT3Ef8RwOi+sWgedPhKIa1rjOTGe32kHY4BG3zp
   21.67 +oIIgRn2Yrq9pMd+7ksXV1eEaSVWsbjm5MJ/WOcyMXyxOCfC3ZD/beLjQ3wngc7G1
   21.68 +fCPC1Vz3Y6lK2ndKmubmnd9daQmTKjUGdW2ZENvS0Wa+QQjXr/CBqhFfLkj/5S35
   21.69 +JyX04MzP3lCiBCbCh2UHecbMQhIWvy7s9C6ivNVANvJRkA9muG/4AvIsml7nP2ec
   21.70 +Zdy+afofSipmPb6DOEdtvybydbBfb27jdEDypa2IskHl68hBCeCBsfYt9/kI60xn
   21.71 +jxgBmNphrhPFEk+9l0dZW7fWt/+O6vevbyg2WVGGzfFVkYrB6Q1HuBoymXSxhsE/
   21.72 +qhzFv/AQfqlo7nHswn59IKuda+prChsW4Pg1iaLBsncKFG+iIUHfNZ/uhwhNxemi
   21.73 +zvpMjbPLA6XuVRsImcU5vRZ93Uz8wHA/VuUN3N/AvwQVfawQ2PX86O5hVylxxzKu
   21.74 +SOrGY/gEh1BNdd5UDf+/WWO1lZ6804P/wVc37tLxNv19ra2xeDPdNAOpY7gymqk/
   21.75 +StGdPCa4z/6pm0jml816jZEPOGnT0vndZv5KtD4zIBJsgfFVaurCCGusFbuPl+Wy
   21.76 +AJjM+FB1r65JI857EY9QO3fODFxBePa63h9bK3l4aKw04PnG/Qn1x3S+OTW/CGlZ
   21.77 +VDjX1GdJkYcZFhMI9x79Bnjhx6PxwW6BhDxNzFdwKyLdHcngZ05DbOCWm8zL4/u1
   21.78 +vNNl8iWKOjqlSdoilM6268JLhP5hYc+PHmRtIuvxwIG0dKLK6HEqJXQiJFuiEL2r
   21.79 +flgdeyS9YUB2qzwPT2OKYC48+8mG9ltnpg5XCS7TGOFz6sTVRK0r4TGYsoaGeDll
   21.80 +IDzyUhMu6UDJVUZ2WJbO+3ziUqLYzu2h5OcHqFDxMPJfbGOIsURNrNB/1woCd4Bc
   21.81 +lhcBl696UCgw9U4LiD9BFf7Av+mj3k0z/Y3uRv32jNS+vJqB/1Y5v3yNDB/PKkMH
   21.82 +W/My6i98IWBqWYSfluM2IuinG54xckzavqDJqf1kq+zsdxpldaQAzw7lI+hA4WWJ
   21.83 +hrkDwpbXugwfxi1o4cVcS0xt2aQXiGvn/enL5QAhMSVxijP52h6Er3UXFWkEx0kS
   21.84 +6zlYolifCLCH2Z1j2LUFW97vZ6uSFRBN4+HoqciCyUjoNZG+szt7mEymz8Nzs37W
   21.85 +UjBHJS0mybsyPyI3R82rokd64YcnI66GfPlihF7XST1ajZ+vO49aqGzwuHIvVCDj
   21.86 +bgDJmvQup6xBQIl6i7xXUWn3DqzTHlLDGCgdl+0PEvLGvSSECtuni3gyTCXwGCi4
   21.87 +0jHmoxLiT0DubIBJfUqxFYmzyMDbwwZfoWFB7VcHd/AjSsgxHRdFMaX/Ic6vikXB
   21.88 +bdeB72HlvIaJk9hPMEsf3jBKg6HOgkvNM6EXhR9N6KBRXN90zGilkBSsOubuSoUh
   21.89 +3GoTVnMGKMd+BUyKTQfDWrk8XvsHA5rCWIyVVbtCCHC55Mw4eqE56HlHrJbxCX99
   21.90 +VCmbLDUVUGdxEKvaeFqiCwEVx+VQ4jIIQrIYgqNTuNpIQ8b+IYBl9auOl3NeVQAo
   21.91 +4zxgh/eQ8EEkPY+JJQstinWETFPZJUPVzAmOtTVu/REtzWHEXhts8dQ2GMx5Oa3S
   21.92 +cjB64UCzH21kg7+7TuROL7EIv0Y4MaMMehlTcrs3o68a1VqpzKlMRLJW+7cuEOQ7
   21.93 +/rnFgH75V/3x6qaLvmtkmOHTGfq8/BntzE2DHWGQGL8bBH7KKrqPR82Br5K37W1E
   21.94 +OtSnqyyRqjYH35rsdV6Dkj569qWiRnbOtMfoufqSNiOtj2QyqFTPMlThJGAAvOG8
   21.95 +wv96dx/80hg9NqtGA3mmIi0IJtAPhWXVj+SYadfRtUVjypNimvc1MH+VoVg6NepD
   21.96 +jH0GjeohjAptB2we3XLupDXVXmzqV3cjDtCx7SdlnKN65ZjMpOYB0a27vdGLrC4x
   21.97 +5aolJW1ppzkSoBvd9bjPVPYjP5ZvhW/JV/JP8q/AWrcGg/WbDbWOUMmTSIvHFcUD
   21.98 +YNOuriQtHCAYAyYN20NIWoUJKYJ0PxLrmrXD0fP0QS3oR8mnNhKG9nT+qrZTHPef
   21.99 +VgdKvyOptDnQqTkl+YTgAqTC+PwG8bbUNr8+yyYYNb+/YQkVjNQ6LXSOdZ/iwwW8
  21.100 +twP/pJgMAajFP483klkgrCox9DF5dn1YZiol0aa0vqdY7RwT2iYwofX3D1VZWqPZ
  21.101 +kH7UTL2FACou7HRXLjAMAHC9UunAB/AlcW4+xmV88ntW+oS+XgEcXc6M74AZ6QhK
  21.102 +b6cbEWyzi75Logb5OOIx4d/BNyNJgXTbUB/tKFm5lLijfDAqLjsNO0qEig5iLv52
  21.103 +89DBR6s5NlccIq5E4S2pHhePHCGKpUjYrdnwu1i8/CCFKzWGP9dODvFi9tjcarx+
  21.104 +VBs8eyiMPTMfbjsAbHYD5E9FhYVoevatfBsGMoeeAT7dyd4m0Y8VTLZh4OU/eesj
  21.105 +l7HRCB+3W9yK4ICIOap7HCKhz5MiSeJ40pjD6DN4jYQa6tWlxmPLHyyxPx44d7Lg
  21.106 +kWiN/XOXB9Hxr2gQG9KTa9wJXzesBmMan8KU3guyX5gazOIWx6EXp88dn+t9i3y7
  21.107 +F3xpfUWNJGkQhSxiEip54kZpvldF5ss18ygKrNF/ebHyo3b6TwehH8KZ0wTdXy7Z
  21.108 +CC18B3mvIpknqR305M19pxHA0M2TVYlCU4HkiJuKaXLEPyFeGna7U1XPnx+L1n0V
  21.109 +loVBXlYk84tMQBNG6GJAufRA9NvYucL79qbEzFhhJKqrP+9vcoad/WyzL1vBhgF2
  21.110 +2I2dDAK5+DTx4x7LvDM42Y08Rv735E+c5eLmCljyrO9/1U+zglnUxLRopKJcd+Cw
  21.111 +hoxjTNfFPamsqNXXdWRjIQSmu03GGV0vo4MchFzLrWJTmost/tmQrQZrKjKJ4rny
  21.112 +hVkk+88C8KZLuuKs7mxYoJ3N5J5yGGowXLA9zIclbuM5+zQxpJuaPoilF+pMVQsh
  21.113 +LN1FKA01743YSqbp08GZBl8Bl+sn5ogL7jcrNRKSD68DvVBj9UZdip/SnAF/NGg9
  21.114 +qauKK8f5A+kwNafhQUh7M6eRMe2/RhcBVdbG1MKSVxk8AL2daeyef9GzGGnlAZwC
  21.115 +kZy/QSvTVJeRnsUD4Pjy8yvm+yuboDC1FUEGW4lZNnel31HqdlPbIhHQR1Zi5NuE
  21.116 +UX4uLwxnOaBkxa/2sUqFsaPTV18oBlJFIb0P+pZPzp/6m+MA/a/FggjfQzoP/3ky
  21.117 +xoB/jgkdNWwyzIEx6gVfjq28ZjwPbqRFlzt51+nEZPgTcslRC9ra3IfFiL+quh6h
  21.118 +ZlnI5heHXoqVQwe9pdD5TZk5RCa8OZu+xgTDuNbkaJ+uHxJYTQwLq7fXEzxXJfEo
  21.119 +N2tPiwE8T+JZv9p2ln2JLpA3pwvir8fLH5muZ3hUPp0Gtm/321yHw7wfIx1ewK1e
  21.120 +/k+nVZzwXUGWCJbdQkJzIomhS0ZCDUh0kWFXNGJ6knyYSGLg60WJ5DgPGpSrTLnY
  21.121 +QPtnJaGgs4pNgHurovkZZum1Dj4qhMe0airnwcBJ6dmvQnHhZmXUKTKqYlpbomcD
  21.122 +foUvDP0BkJwalNBUrFae71ZO8Jvj9ccWY/2/15GFgi/VBVqpsiOQffS63LsBRHSD
  21.123 +4nJsX3N9eu6RuvmvWA62I/x4AAWWh4aytteASAeHWrys7yQSTtKzf+p347RhNIrf
  21.124 +GIKnn8saVfMCGHCnxXcE8Ouv03aFVrlP8Y7MPOMFBRt+unjPrgoa62HRKXpusTi9
  21.125 +1Q6NUw1JMC/yP66gJRO25dax6KLEy4/dFwDylWKSkaa1yNuerYJkwpiNTXwUE/6M
  21.126 +QRibCNmxC7pXKMOfqIOQkADeOPpUZY9uUizoysAyXNt1ID4Zx73QoPZPMO4S46Yx
  21.127 +bFi8+hAISgXCHubuv1+P9kibnhzBiVPSRLL4t4psJF9/gAkJ1+xdOIkTl8l0rXcP
  21.128 +NVPCmC9gxraQTlny3A4AlIOhU+Lx/EGQJle0BduxfoS0zb1FyHl7jfLEH5eta/Hv
  21.129 +//4BiNb6qxCWvNs+BW9kGYl/3TNsZqxi/iDxmaD9eGTjgXwe8UCjK/M8AwPNYzKX
  21.130 +3UFT3K6Qmj054PmF+o6Kj9v4GPGIEqa//ULNmsT3Dgle3dHZNyWGRFVGCg0jnRQL
  21.131 +OewKNdYyQalGVp0nQPkt58OgvJXkjEVDL4249DdlKXogQEU0SibdhC0YHaMMKXXx
  21.132 +fs1v9qvOW/+MPa6luJImXZQLmqV5O9RuOrdVo3WFKqJbaKgFhAm6M79IZs+ptbLN
  21.133 +D57otcU6ZpMSKVPF/mxhsl2a4JQ/ig+c9UEQ2JKI4LUBrK5dB+POubyfdJzRU6Hn
  21.134 +5zkl/iSBnRlHvfei376UWN6JR1YZTLqBmfgrB7sOeE3hryhNTfOiEnzr3ZNE17kc
  21.135 +T+QhO2efuMfHTzWrbsprYQSP0W33tTQvYVfrOad/7KIfUlFs4E4KVeEfMM4dPTPW
  21.136 +q+78BV22PE5eM4j4ib3TmbcGTFwmjagRvZFPZtIkAMXSl6HIwoIyg60K0xmMjVqj
  21.137 +9P2/2wocDmBvZ2uUli04qRSeVpFvqwc7vNz8uYMjI9b1KVC1FVE07MZPFLCTtIZQ
  21.138 +msbsIab47WOXA2ctrXyWoQ0gOhhYAQ2Ma4lAg523dUDdvlsMsjmBt9CHY8UamkxO
  21.139 +GGv/YUe5V5FZJbmoufYokluy3H7mhqz5U9pILiE5XB1NLzZSHiEmBjsTYArbCyrW
  21.140 +fcf3mfJULSNVwWLJmkWikekc+Fwa00wmmQboRWHwi9evBQcumc9HBGerjlishk2d
  21.141 +U9RmTcZAWo7xh6XRoR7Nn2ODr6RmpLJvj2eyefctFUuXBBZN79eLJCex2lIFokMr
  21.142 +yM/YevzNxpdlzd6VxU5E8yv2diXVJegndHbkpdCkDnDN4FMM3cip4sIFMMfvM4lA
  21.143 +qQPlrO7OVFW18es48KB1r5XypVFh13qkBVrIgrpBQAGYjanwU9elNgTyZGGEHyBk
  21.144 +dq286m7JBgMSqFKHK1Q5zzl3tu+K+4yheLO6jVDPYOCYKpEjmekI/s624dz+vw/A
  21.145 +EebK99WjFkuGQfU+AZUNByzwrkaR5F9MF9fZ3it9RxMhI3EPNHnQBcv7cLKETVUz
  21.146 +NjlpWasaNV5YWKGcGT0FPCjm/SP8JIdYm55hMn8my7TF+BUl0hYjmjLEVa1sdXHV
  21.147 +PlZdX8wfH2C9MUeh3RudXrcS9diGACKM6boNcpqX0iamRTnnzXnLOmxsxGl/k+Rw
  21.148 +aNwH6RLIYwINWwbo4H4HlhINLA+WhnF3vj1BJja56x4NytL8leO08CWYP2qqFZZ7
  21.149 +uGkalKFGjZT0AbCiY1BxT2Gh1wM2gc+dM0yFpfdF/8BEQQw3/zqQVZg2UuiI0fCU
  21.150 +UvE60/1tMMLl5drq7BrfRlaJHBoVGP5NrCdq3kCi9tfFkqN0bFJQB2+hajCOutlH
  21.151 +cxQzavJtUUEhsRjuIOQKTKyE9IJXJ6kFPoijJjtErs4I89jQuJfKwhPuy3QKUv5F
  21.152 +OZL2ceWm7ijuX1W6EonN2mJ4eH5S+bbad50HIs906m3FE94uhDbxtNgjHOVAc5ge
  21.153 +dwWb/k00j7sJSaynYIp/3SFhctM9pxvorXHn7BUNpA2DVSpZbFdiNkW5fUusDmyP
  21.154 +cc9ZwftM/r54j4NlbSUe4UmfPFdPibqegUCj/4+w5y3d+9lJLLvHkP/6DB5h5CMr
  21.155 +iG4gSwkUAGIMJ3WgtU7r2AXdWpoAE6oQNKXuHOwzHsvOw4Gd3LVvk/aEzPqel9bB
  21.156 +9dqR4yZDAA0G28zwZ9jWei8dqb/Vo95RGgTt3jR+zIaiZQNJ3yDplCugQ1pzoWcx
  21.157 +S5Bc36nf/gAGJtMhnp0Bsk51TnFPsRHH+Wq+JX4tLupqoovvzGhcxbHpkSkNmZz3
  21.158 +iVFAeb0uTMWyAAVXzDARqPlHZBuXR/trfAoP0mHpCEJsraVLU+rolwg3HyohAm5S
  21.159 +PJJHr7WOIeCmOoc8jnR6OwN5QVb/RmKOjBdGeiWktnTbWC+iATojoDiI+M13Ninh
  21.160 +/Aok/+Tyryvhld+t8WV6bjREQLHlroiAuK3r/Wz4slvvAU+4xSAAuZMbb1bMoJP4
  21.161 +xjJHI8jPe9trZ+wUUKBXYnF2LX4DB8oyY/1ARNhGx2Lbra8BzgwhkbpfryebQTmG
  21.162 +BdEmrPFsj9hzzdN7/T2NTOvpsBFFgJOknE6n5b7PotRh5drxRv5XqlaqNMMOJCBB
  21.163 +53hpFzR8h9BQEKUeeelwPG2R2AfwnvUwe3LJ3Tv8slEN3liJc1/XtsNbJUp4KzX/
  21.164 +cJCq/ArJ7XYz5ATBv0+1C0X8pZBAwSxX81x0r23xPyrLtbY1K+TB81dfjZS20kDo
  21.165 +MUVzrUah4Xtb9BqrUhMy1ibtQ0zFHPbHosHWKUld1kZPUWUPu+07zNmAbI7fzmxu
  21.166 +vSdtTLORuJPVulvoxAx2kv8STC/uMA4muZe8mMPunisxt6KML/czHlT3VY7r4bgF
  21.167 +/ApcygKcE0iz1LT071FjEgjZXhn3HAnCOqsiqYBEGzymdnsccrsVQIOj0rJMf4Kx
  21.168 +tOPNYprdMEL0Wj6cWa5Abs82lMuQxhkcIUMC4ER5bhPUPCPBazmm2BLtx/SEIOpC
  21.169 +ssedWqMjnlwfAF53vImLj1koxL9B0EeyA5xjQ+RyCuQMNX0ajoL/NoVRnQ2VjFQg
  21.170 +ZqIuGw4I9STHfjzy7/M8sEeWFP3rAUc2GcRRiWRo3gmyLrMocJo+IAgeP8Gy8miw
  21.171 +dYB8mT01r6zO0yoKFvvpfDc1+VYTtDcDk7Gmm4U4fBvO5fqEqR2eWGXVP44ETnEX
  21.172 +vJfn0Ffo1uypEsWx7ZNQ0kBeae71GRS09YaHgyT8siqGVMssZdhajZ5wwMryJORU
  21.173 +qW+ueyHfqTsssu8P5BnZykKsfJpBWB0/i3FallF18tfU+lVy2O7G6PJQot+x9lwW
  21.174 +IsNVwrN6ZGc0wbB3frJLZZCclgU9c+UHSYZFnl9VxsGAH48CR1lbPfrU80a9UPje
  21.175 +L/HpnyvrCaL1Zi6tnFSPUKfrncF36qeUDWaiXTqxQbIAARlYzjp/hdkzkIQw31jP
  21.176 +3aMUTHon15p3ZwpoRPgtkfjji3OHZVc0LMfO4Wpz/JxRqndVRv9vhbVMLDAUs1nw
  21.177 +PyUb/2uM9U9sPco76LEsGYaK55t7GYrJ+pjzRYEw9sqFu9kzG+PHpF5TiuWnHPK5
  21.178 +9EslA6annCuVjU1Sno6txNSGkIqFikaI1Ofd2CF1Omvqbmz8zptSCkfN4z64tXp3
  21.179 +CH4nCv6gzMNmTENHBiahPJK8D7INfrOBOajkLP61MzoTdYznxdQq5SGVo200NLfS
  21.180 +99Mv6iya1RZBkG3gqmDLR/rxTzl+zUgtI53v+8RpWqV1oH3cSQ5OOyjYVDWr+hgP
  21.181 +DgYJTsgOOuR/YzhDebczF4AyHFXTPsnfwuOfAAZidvrUSaZuZh1Tdh1mKR15HJub
  21.182 +hzwBpUCL2oHZa8SDuVTD/De08b1uhAvwNFfwcymbDLbysPpBGaFQaCzRxwxJp6Lv
  21.183 +DAsbCqellu9GClA6v6WFpeCWbKBaATaaSZXsEwMya/ewqJDr2lei4Z3WRt+gsvD0
  21.184 +PstuhsaY0ehvHtkuWAvsIvckOgr8/341BkQ7R6MFzdc6bYhNfY+QCLVPeODH+dFS
  21.185 +lU3vOVfcDHpYW3LXSAHV9LB9sc/TN5A/2T5jAi4FqptBzc7MvnpOkxoFI5xqSe5U
  21.186 +dA2Kgfus+sROE8XueuSgZxLl7lAIK2mfgZiajrqF28VzLQCoe1Fd8b3X+KCGVdNI
  21.187 +iaLme9z+3GCu7WB5ECPh+oU4tXov2N3SE7IYYn/jN1rUeqbewQTVZ0nfpbO0HxyF
  21.188 +TgCQ7irGmi7kHvWC8vcOuIwKIxFS1eU8iT78S9Yj5lz/b0ns7+zgnxI5qA7mwX6M
  21.189 +3xQpJuuTNFe8JyB5vPTD/8VMP2MQfoesBOuR7MLWldUD536JdEha1N6NYG6egxp2
  21.190 +g0G9MfUWWiurNjtTDINCfGms4bKemTsoCfOzrb5IE4ZPMaHl6owYf61oe7+RIAG1
  21.191 +M+7pfQ59VzT7u/98ZbYLMQw1yFJ/n4Ut0RSKBYnCsmPZMUfGuxTtgMcpraVnvM79
  21.192 +rifJGUYwOmXdj9MMjPS93aBxxbKkElbxdZltszxDdM23JBbijjKi5VI1vHb9mP3f
  21.193 +SHft2tWtKyAFnpEk9142UZUsuSSjIXWiVhdg4qhV2WU+b53kNtc3GFBxgTmn+omk
  21.194 +YxVO6y8vGBN44nrVvDQzX/hLM4eYJbc7XCJCAOTTsDQ8ktKq4G1ZKCue6qzc7Fsb
  21.195 +w885mvRRk1kuqy+a2FyX8x8DWGwEiIfaMSvNYWA6uCis+QQEupV0M4w1e+Oe7vYD
  21.196 +f2jOEtDqlCpu6OjGC6Pe10q7yHvKN0RJmCkpxLg5xPw1AKuCSM5jRwfh+PR1nqx0
  21.197 +NlwCM7osFOp2R57Do72ECaOfxn0DZs141rPD6jC/tk9mcV4jZ5z7EybI0eTRwn/h
  21.198 +A4Tt2uOXtoZdoeCe0f2Okl/Zj4+S3YahezekfL6ldlKbhIhgsrRl9Vgfi0NM8UmK
  21.199 +Bre0xhZwvSyeZ/W20ihNYPOncMtDd6ucjtiIiQbv6cOF3xm/Bh78LVe0l8xJPPm8
  21.200 +UJ3ET1CEjLi5DE2mES/V7ShEs5iXxJ6QhEkOGheEm8YLPylueW/teK34SkPFT47w
  21.201 +BYpAkzFXxNNZk9VJ3An6LwXZdOHnczZ40UAMtStgvx0z7FOEQav6G+x+bPyyT8hy
  21.202 +N/qw8ECrO3DDAaBFME2TCMh98QdZwF1qBz8l2rM3QVQEn2iWLIkKlubOiqR5UCf3
  21.203 +6PPVLnHJV99oK1IMUTfDoOUQxlTAXoAcDZ20J5dkDVmZ3yphC2hX9YoMe1sY20h2
  21.204 +I/4YyjkV7j25vwcAJcoPwi2wFtSgNPxMX1SMEM3MMoa8tHiRkXY83F4hOkdt73rL
  21.205 +g2eUP8BkGJ4rhC7IHJ8WKBXi6CN+J4x2l1XP2SUUsHRdiwtzPQj25DC+8/sFNgpW
  21.206 +QBESpW/mSCJkop+5cxDq8kLs8Mp+Sn4VN4oZrvUaqVXMqF+hxjabpRdoqjXkdza5
  21.207 +H1MwSM24aWBrg8//oc0kohZahIv9djr+xxpXjpzi48Y1ZiIDXLzrKcB7GpNGUavi
  21.208 +xmeWlvHmtPpde3EW+T5r/VUyhEXAoA7x/cZpNY+NPLe1a57rED3JppjXUTW0rjMt
  21.209 +42AUios8hXP0bhmdTas4ZnCsdXZnaH3KwYNQyqOvvRXw4UgPofN3q6Po9JL8lqrK
  21.210 +blL/Ppf9l/yD9LK+miqF4gtyNvEdjDyeW93NQx0KW2Jb9MOG8En4wO243LJ+6Bd9
  21.211 +0VCTIzcB4MbSA5lzFJ64JMcL4GxrcgqC90MzFQHTqxVQ/YFe2uRl4gfp+QFBNA2k
  21.212 +JCwYOmRlp87en9aV7imjxemm+U67XwlIuzKxAaih8kdxAT5VBsyWhwS2qGliUSC2
  21.213 +PhwEj05iN9ADO9dqEQH/dE09kTj4PdIs9A3SmtWWcE5+pFA/SmjV+omRlYTbCr61
  21.214 +Dyk/yCBHLB5V6aUcD1qFkzxnNqQssM19pcBTo6zaQx6U995pUzTfVNMUxZ+Udm9b
  21.215 +yuJX1Nwo2FxSG7jRAD9uEyfEuPywc1LJOntCDmy1VES0JxJrS9Ir9DMqwdQLcEKC
  21.216 +ySRwFCgguBDwfgzp6cOnRta7lQd8u5UzKnxLhxygcXQmBuZ5gSHXSf2wAfKGt6As
  21.217 ++avNu9vbMG9nzbPvS2CP2Dy8AQkJVrEJfyeJg+HRyETmMuNMn+UqEI5ZxuCZc1JY
  21.218 +rXtMvyUPPNCdK6cnzaMFSaPaxVzAgumjZYvLigJtBWhSMay0T2wwP4MponKl4uQK
  21.219 +QlKvnZnoiovGgECSR8ytWVey/+cYdT06swX8ZJygY5kEij5g7QEMJntD7Oui+0wk
  21.220 +I0bDcJDQ8RTdgUSHoDf1eMF79Ju2kVpQlX/6CWQG26n+wdPQjYOER+UW1gWEA+rG
  21.221 +YuhyJhapeZ/umaNdsajACJVwiT1hX/9uCuhiM/DbW0JHVkpSvBP4+BlR4VGA9ToQ
  21.222 +cnq1LeB5Hn3eNe8htJh3Z5M8HMBpUvyFPdS6oF9/PX/OjIOycjFIEgRORA/IAJ5T
  21.223 +weefeKLXelBNHwHLvi9MCBfwgWj1ioKN24LBt+c/hZWWp8cItl0rBDg4mexbDTpF
  21.224 +N1SPWphRgpf2TieGHSMA01AMRFcVNvA0pvwNe5dAu6iGQTDoQeHSPGBZh5OPGKj1
  21.225 +Tbji3gFH62mD5l7JLI3jgDO/4ZlSs66ZKyvYrZ7A3OfKOBeNK6do4v5XLcup9fN9
  21.226 +OfhyKywFig5rOvxtaNweDBPD2nRRabrtMtivMtZJLkxTrLdqv6kvH+LYHI3BvhBj
  21.227 +wuqkhDgh0dD/DqHasF/utYbgaYGoj+NXGfeB4YA1Gu31+CUBxcDTHhIhpPQ9lG7L
  21.228 +yBiiKFgfX6MPf5UAZehqYcRqYcvgV5+2oQNvLXlXZWJ/1Xxn+T7jGKIY6JAYOgDV
  21.229 +BYsKPxhYd3PDvdpwjPKFv+p/xkkShE+jNf3PRUXfJPxP5he6DjtJ5ZB/58vrBefT
  21.230 +fXSFBGOniMCU/WRKflhuzaydBySATdb9tsU9OUWKw+KWlrg+7d38H3onwrBAqy96
  21.231 +HzryoKGx6mjg2vjPWAqMiu27szrbTdaYaBcEUZTrkdmuPowEmAbsm/L8TAwR1lge
  21.232 +qDrCuVxSNcN+zaBcs2Q0InUaAcktHT25Ipu8HKVyL21pQtItG9GaGFBep87gk4j7
  21.233 +rjQmC1r+lqau493yzgVszKjztND+PYhQCA4DJhqO7h3rtGxVhyYudjupIXakPOez
  21.234 +grFWdvrzAES5X6t/4L9RzJRynb8418crs4S0pVtUMo6mAoxNrAZCP3bzFjEjTGDp
  21.235 +rSILY8ppN5Tb9yWw5PfJcyDQNMkXlsLPp5VROboDEqsruBDmH2TltWiUma6ltIGh
  21.236 +38wTKcCKwc6ZZGserjx+HvHlJ/Tr3Prj5gIh8UTee6VZRkT/aajEtK5W8W2zycbg
  21.237 +5eYgc1waDN9KS0Tj9hH9NHwErLsZZK1EAd3wZpkWrQDpsA9swez9yCqlV2d0Eaxw
  21.238 +zrR44ucNkIig+0Tndx3AzUNIWi9vVP7wbZEekb4OTcAmajFdq4l0l7vbi8zSIoMJ
  21.239 +jwupGSUeVs1Gg0DN3UQgqTPZPbs8t2+I8m2v6ELFSL4JOmtxwaHQ3gHYJTvSPlHT
  21.240 +WsJzrt/R4pSg0IkLxW7s/UwlqrVyl7e754fsdKrI6b1CBzvqjKdLvWGW0C8hsUHi
  21.241 +kikJF+fB7wVaxL5EYgHPvzbLkMugWM+ABF3tUuIMSJfVIoKVs7eE45Ss1HzGOlXe
  21.242 +LVuLvGqqX2yncpR6+lDCkTXwGJDhcmwLqobSOgWgC2UD+TWW6vausbDPtQIsGLOW
  21.243 +PsCHorbTaRHs/WkG42+X9eEFA2dzAR0UXlV9AWH9NKzddxKkup+ueCPr2LCd3DlP
  21.244 +K7nPllfPlWEBmu7fkhMX2JCGXkDKL4G6lbeNkmhFK12Sg2Y0pAnbML6Zs03v3ZEx
  21.245 +8IhlSDlBFgs6z7mc+KZRuHOehyxNvSat6NAoDw10mYXQD2pPWlUmDxeBM4GiMOnK
  21.246 +2o3HlFzXk/Y170ier9XrHnGEThpyomob3z+h2XpIKx3B/wRz8O5sv762g8lfiDdC
  21.247 +12PEFPhHcqvw83cfIzOeaVLtFwgpCluFJTvgQZ05CLiWbrZwKtg8VETK9SAGtSUq
  21.248 +T4P5HiKIE9G/9kgFyTCK44eSTobR4XBLFYtWn9gbNAyYMEtS8de9VxA747MJ92Ko
  21.249 +lh3D9CrUTOInjNBXmxHvW3aJ6L760au+9acQoDytArv32ZfrLcvqNGdWXSB4OUSR
  21.250 +WMYL5DucerYWWFE4343BvzMWTgNHrmOsHBHvOWlbefi0o5r66b49870PhWcwUFFo
  21.251 +vsuip4Xkz806bKkw32jfpMlp6NJKOZxqUuSoL6/9ID00W811xW97MnAkhINyMeMB
  21.252 +QXFh6tVV/5ojRZDkFb4JeCuvFSNZZ55UfEDhp2kR4WPLfcoL0PAZIvVbXQJyUKUR
  21.253 +5Rd7pD05maEmvcwgD3A4S7Fsd74Z9ItN7lKawULmSZViU9Tal8C/LX7fsnoBsBBt
  21.254 +4CPIu6X8AF81c5WFDQ/FkYVhwnsU6fCfKGh34kP7wxsXxnoe26DAVv0n0kv47dEx
  21.255 +PAyBcKKC7njnkeTexIC5SO/lhAE4SaPUT3BaBX50acNVMXcT1yltf15lknhSO258
  21.256 +9HbXOMPcNvPboTXEIbNwHwAzivkq2UFso3Ja28XWTZ3xiG7leD7UN8ZRXb1QOcNe
  21.257 +fli4tqgS+9SCg4+latxQ9FyaLfSBF9Y1DYXH+1kBHHsWnJUTfQgZRtgZhkPvfpw1
  21.258 +Chw6mZ1ON1aSqCC4S8YK0Qrv4NEdbAu4h8xLomMqqidzA52BvnSoZOqzzFXe9O1L
  21.259 +1OPfk4oGtyPiCbni2z7Tnj983P324A4CRCjar+p6JteyprknuejPAGGRf2erk5kx
  21.260 +Ub4KLo6ulvpP9kmYxibFqQMqpwLlgeestGMWNaA/YAf5N80IHc23OyYTgdRdzaCd
  21.261 +QBkm/xbCp2PrnXaawsvd59XJ1Oo30eRWKuvn/EMP978eXT5GjOvzxkeDj2qcO+D2
  21.262 +JEeN4OST9rhZLVEntc+2Og7yyERB0vzG+nEhxP/2tsuJuMYEJ1qG8/Z6J/Wc5Aki
  21.263 +Z3iHuM1pBFWYZsTcgMpkLcLJ24lwB/AWaBhtv7RiQNB9Dv0Q9scfx4HUYTm7lbvX
  21.264 +FvD2kUhg5h3f9qb0pRjyxQEud3VE56b4jxbzg5pizbOfnFKiNEsbl0ZRWIjKL14/
  21.265 +YVMHptuYg6fg4TXN1ShREkkmMCAU7cW7q/oQ+UUE/iiBnheKLPhiwf2x/gjHjR3u
  21.266 +upT0jmci8i1Bo/uw+cR+sGvT0TIh5SjoCeSbduLZJmjbcnh2L39B0tIOQNMLlbZ8
  21.267 +o/rg9R8QWP39EtvK63QU3QUmlawmncDYGPF70f473ShDDsooET1bciPwenrqOLPb
  21.268 +j99LCs2yp2TOA0uKxaCaWBk44GrWDfUhrEqUjlfzoQkVJwA2+MRLYGdGZVvvxgp1
  21.269 +DurGFHvdKIv1VVVolR9uRirtBnivYQjflfxj3/NoHejjd7ffgV9roMlmr7Y1PeWF
  21.270 +4miCf7VK/swFXin2kYINNvUSyPxHGltaxbpgI/OfBqUywPnAmlOfy2N/nirW33OL
  21.271 +rJjVcO511YpJRCrqAofEikqP6WxgtzHUGI1bng2SfT0j0ZBiFnnPg45oDnmbRFhC
  21.272 +bpJxR7+YiY8MFM1iens6Vigo6d+o2/YAKs/4TsyVfEbHVeyHuRYu+8FYV7Y6wS1B
  21.273 +20iUhGgPEReLgMGMSjnoJRbEtYSJJrl62LoyT4FsZ2MfQOalAJVUkW6Iqai9BRCx
  21.274 +d5gvuxxklT0X42Y7vGHOD6OwFLLssXT9yvEgOghv2cuD4QS1VI2lK2/wSJYvuuuR
  21.275 +1m+FiRTpLQwojaGSBSfcBlUGS9cta8OcqtmISFjykBqhixYq8LcvwFH9NqTtqoUs
  21.276 +UoROjb17x0sMeyY0rx7aJijL+OdbqTja8GD44eUN76s3SVKIwrAGnLqIy11ypXT3
  21.277 +NYPWznHb3mMcWQ8H1j0CoKGyeu0Gz2PuUYaUfLRtqCBIE9RfwLe7adFQ44MR/YCn
  21.278 +4Zm+W71xqohlplfIwj4OkXVkHOlOv4wPKCugfKYvqDvPQK/UhEHEG+LWu1KqvgNk
  21.279 +8As5lL6AmrBc4FqWMwsGwO5wfX8lP5ui8EPXdTaF7I7SstnRzF17xVAqxES0lIFc
  21.280 +k9nGTY45r+doo5TAjRkI8oUcnc5digZvH7iC+6n1VBFRPO11siIy8p5Rrc5d2tC8
  21.281 +DuT9rfeNrcUZSy26cGVyALIXVQ83ivx6/fD/c84+4a9RJGcJyQlyJ39A9C1WmPjA
  21.282 +s8dGqmW5
  21.283 +=fRlE
  21.284 +-----END PGP MESSAGE-----
  21.285 +
  21.286 +--7fdcc2331befd79f41a7c4c96b68079a--
    22.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    22.2 +++ b/test/test_mails/check_reset_grouped_own_multiple_keys_multiple_idents_reset_all_2.eml	Thu Jan 16 12:40:10 2020 +0100
    22.3 @@ -0,0 +1,282 @@
    22.4 +Message-ID: <pEp.Q425FH.0BEWBBQQEP0V0.4EFE0DEB-3FE0-40B6-AA3E-5C0F02AA62EC@darthmama.org>
    22.5 +From: Alexander Braithwaite <pep.test.alexander@darthmama.org>
    22.6 +To: Alexander Braithwaite <pep.test.alexander@darthmama.org>
    22.7 +Subject: =?utf-8?Q?p=E2=89=A1p?=
    22.8 +X-pEp-Version: 2.1
    22.9 +MIME-Version: 1.0
   22.10 +Content-Type: multipart/encrypted; boundary="4e6afb6625e45d32519b500d431bd7b7"; 
   22.11 + protocol="application/pgp-encrypted"
   22.12 +
   22.13 +--4e6afb6625e45d32519b500d431bd7b7
   22.14 +Content-Type: application/pgp-encrypted
   22.15 +
   22.16 +Version: 1
   22.17 +--4e6afb6625e45d32519b500d431bd7b7
   22.18 +Content-Type: application/octet-stream
   22.19 +Content-Transfer-Encoding: 7bit
   22.20 +Content-Disposition: inline; filename="msg.asc"
   22.21 +
   22.22 +-----BEGIN PGP MESSAGE-----
   22.23 +
   22.24 +wcDMA+k2+vmtOIxsAQwAzTIvDYtvSVh3s85ACRQY14GhjOUwhfwe8qbKJrp67B0r
   22.25 +3J12GHxnaJMD01aIJRcqZUwPFQOT97c6wlRFy0GQziopJOd9gdG3SJPEadP2Kj8A
   22.26 +3wld3wJuVIE69k6RonyFOZBL8s53nc6rMpPnFiLgSxdjrWpqqUfe3D4DjgfggibX
   22.27 +IhWX8Z5G7I5PIdShiKsZHhVgyNgG4jih7jNCjWmHvGj9v2evLZvJtEMyQKy1Tkds
   22.28 +KIrOZK0PzY0dOVUG6mkZO8QlktwanC0DjoHeA3DA2MVCyvlTLSmjJRroVt2fOCIL
   22.29 +y7eUOqCKzpzbL5Nd90qDmtWTTjDI5ZvPkulc9Rh2tT9gHYq1TinM/NnMR69iuKeB
   22.30 +0u4hPXdQJsO/+y8cahIOYGqG7ZVVoLUyBwtLWs8HEWeMs9P5bqATsfheziJNmWgy
   22.31 +8UOfMN9jtlngtrZ1aCjG7HCoFdhcRvBs+5sVTpcA7421NWrygwmDXMRiC39wvazS
   22.32 +9bnyeYMSsCNzLnYwqfs6wcDMA+k2+vmtOIxsAQwAibjfRjN04RQqfX7IMcFsXTZZ
   22.33 +VnZOWuQOSa16oS/1dZ+SeGKrMa5QiYP4RFndLH2qX8z1aFwkkqvGESLx0utcPVnY
   22.34 +w3fKN9tCpLI+ilAg0J/Fu59Gg8uKzbAmFNI2Xjz1EEr75QMJiac7lg5NIbe5JNj7
   22.35 +w80eSsA5obZLSI8sb0DytEEiyjdwcbHPlfJvo292IYX4wAgKpk/arNmVFZG0l76e
   22.36 +VnCSTB6ZJX7sLm24ODtwrZHOpqEwqmpe6deuP9Obgh3ksH2xZBzFEZLXZewgybiv
   22.37 +JF0JZFlypW3njDn+E/FIMMad4Rx3QJ50/qDggDxYxyFfJdgOHwACRX4bnDU6/k+5
   22.38 +F8jZDESqVNY3z4yMYDK3OlPgi9/+Is44mW5sApHHayBEyz27SfUd1Sqp2AXQr42M
   22.39 +aC9znusbJznhUFr5waNiK6Ni20P3nF54+DEoQk2hpXGVCabhwd1FEcX2Mu0EiMCn
   22.40 +zAcgNGl2ennIeg6tWEg8ZA71qa+DUYHeYW0RJdV80v8AAC0vAcbgpgHCTT3tBaKA
   22.41 +qKXk029eAyMBF4cmw6wwGIZaL+o7+Taod3tiiTi+bbgG+hwGDnw9R7VZ99sb3qBC
   22.42 +cadLxZWMCGItm40WPnR0LuFrh79yOhCiydQv+HgrADx6KZyg1a7FVzjoO85l1eU/
   22.43 +TyJeB+VpCZWvGxw261/RBKnE+GpXbfUUceS0D19DOA/TPBLQSj+htVTZQBbSOYmJ
   22.44 +2nZRlAZv6elyJKi9q/Mwl2881G8IIra5nY0bR7RWYQ+DRceS6a9uYSSP72IJdpqR
   22.45 +DyjaoJ9/wYWTKYLdhKIMTgwgt43TOIB+C//Gj72463gtzZb3+ukt6XmUTifDw6L5
   22.46 +gwQl1UjVSkDgyXJ14nVtEMS/6C3X94FRd5HW0Dm2Ij/YzwtdAQ6cLj0oF2jnuIyu
   22.47 +HyX8LR9rYy3s0oChGG9a5cRCemoiiasqOFUzP89MByZVQbf4yIkv6BKGsDlfMVgV
   22.48 +MJo4MMJVZnf3tBHq4RmppNKTct8V4Sm4zVmlEi/H3Go0heVxnoO+NR2oqZW12wKg
   22.49 +zkaoWtvFQj2HVt19VEYSGw+CvN1CoFcU7aoxMs2Mv1SRd5mXm6J6bhCOoHkyiRxr
   22.50 +R3OqheFyobzkzdvQjyKUbvF2ID0GzeaiqUFHr+tW9mPJff+F4Km502P8NABTV0Yh
   22.51 +A36/nR8HI6sZexurlY0X/zEkMA18qT2m3YJO6BhfkPa/5dusEzv/rJcu8NYP3Ww6
   22.52 +GPY2fD9iChvzEI6zeocxNaeFZQyPbFZQcvyHizerB9feYVB+VCGNJ3S1n4Isa1VX
   22.53 +piL0uJGpw5X7X5HMc8PHJM31s0SNnwllUVeFKhXL9I7MgNGdNEK4SQLqjxKtF8Qw
   22.54 +vXkyzVbzrjwDs/4qQUO6q/rE7ujqf2Ywb6dnnY+meE/5D/RJ08sbveePqMF2tENa
   22.55 +y2ijc/8GU22gesRTvvGJiK0Sju6spHsMmmlCbqJPdxihsEC4g9pt2e77lVXxkkbm
   22.56 +OeBpphZxHPXaDH5p8nOjKqJ9DOKok7QuLclaMhPWgZhYv01Ug2MWZ3SN2C5SJ0q/
   22.57 +aH7c4Ip6EtzX9GOG1K6/4J4gbtLmzTFHZSc/MGe38XQ+PT2c1uLQArdLxSjGKDeh
   22.58 +GA1//yeV+kpsNP1d1loTmVqCYwcOcZat2Pm2KG2AuOJ4eaj34t3s5vzfHY73MII3
   22.59 +QKp+u6hfKSmSR5JJhnR7JpEmnLtXWeCDLZVhY6HfzCUzNN616F8DwmEIHkHrV0uF
   22.60 +7nSkkUSCQqZnLWvANLmyb+5qW3dHijcJdnahQgRDXftu0oZ6lwM0NGOvVJdUDdwd
   22.61 +XXuvKj37K/eD0e9kenfwAIWoUJPDigfbvms45k1TVKMF5luTFKSaAEhmsRUSuXu7
   22.62 +rG9mXffHhomlBU+MLlM9CV8PW46fA9IE4QLvSaEveVciNOGP9kKHPclKO4bw2sem
   22.63 +gp093ror7TJpb1MvUP3j28T4nhCVk7vhxS6aLpSrV0oz1gPGcUi2tz7yfkDnA5IH
   22.64 +F3REA6JVVRUwitzgy6+tvXqx7NNa0BduwO1vg3tpdePwcIZUWDlzd4rN8zGkFas6
   22.65 +yY2fXWRO1uDb8MjvOzcs4eDL5jEzSb5+LkvUhoAwJi6+SgEEyqKWRufYeBLGppNU
   22.66 +IB00+LDGKUllFhWhUqdA/QEl2BIJyPq+2UkuBKSQqCTvRw1TI4Pu3M3yy2B3MTF4
   22.67 +5DcGxOoD2fWywyO55htY/nszulmYHwxYai2armf9+GOJY3o4rBKa/zp5hxX+SOBf
   22.68 +QZoRmwZ+EYC/p7WQ5tipJCBbCkkpukDx3HeUaXbgANlaJHKBLwNsz4QD4vrss3AR
   22.69 +4rPOP3Krgmt8hP/wkkH+hg6R4kYtilyJdUys/lbIsPldJb3OHuAp3gBlU6fTt74Q
   22.70 +oV7kniFxVtN/p3F5/fqWKi8Wh9R5LzvrxU8dYgBBDvw0Gon5H4hsw0hVJ4nc9a8V
   22.71 +U6kOgtZRmumLKOMuE1lg9CPNqaNwxMeChtFq53ljPMf91J2mJK434k45pz+fO88q
   22.72 +lWNBK0qtKOHLJ4oGHuDhCUjiBYJlharVCBFJVfgNtEryEtv4E6c5PrsA6kMm+/fn
   22.73 +90y3Vn51cODDy1o0eU12tl4GZBG8PCo2Q/9CPMDDpcYdCiLzHcvN1d9dp7pwuud/
   22.74 +xo+AwApy8HqN99ZPj63yqKqGcrmr3iDaBGMTW+UBUZqrrpmQ5jlx2DRjRPbBpzWp
   22.75 +Yf6JDM1sPYaTWTIdTMsYi6Ed8XO3GVWw0VGvd8LxObnEM+0EZ1yTa1OZ6oaNX4p9
   22.76 +3SlN/oxTBc0aoOI83P0LmZ1ekDuufRp1EidMfH2eYJm+OavYkctKwwNtLhOBp4Lv
   22.77 +Cj2jrTtocHOcKt9DBXmT27RNHXyXBpeL9Trhl2vlADnaNp/PIp5l/C2cpLwKsNFO
   22.78 +p9NqqEFzBp7+dVqgg0ZCPtR/tu3HmnOD+w3BfX2sKUc/tF7pBvvBag0sKnt/JZl0
   22.79 +lqtiiktzg3jh1FW6P4JWRC/XvYcdPsmba45KnNT1mAyhGTb2cDTLY9yQ84TMuLQT
   22.80 +Rr34AKAJX3tf/ma9qnSGspI2cab7xbKbylhfAZMBN5aNWfg8KuImREmg23fDrJ1x
   22.81 +xUUuR0XcBjjentV757j8M502Bi1nkLgGab+TeHp9svi+iwxCUF2TtiH0AG3ySG7H
   22.82 +bweMM+a3emI0+6TUX6CD0e4ULmCxDIb41d4CuGFFsKO/4huBu3Wd+VTfvHEk/gJe
   22.83 +GI5EZLRIAw9rqWu6wQATQKAunSno8MN542RAvIkG6WLYfbERFc3EGSqFrNL3PPaI
   22.84 +7J0lV9ewAL8JBJf8gzOIAEVN/OG97MSL5RIAXvq5OUGyk0Ny6U+/0QXBNfVx6cWs
   22.85 +J6RPyTOCtFuPfUcfz8pIlGaY8kDrQ5wY0D1S+tYo97Iv+tiGor0baL2NYzHDjNLi
   22.86 +HULytwI+lWRA7wclMc8UlsKdaV3lv4QkkbH3jR4z6wUySXJm3xkFy6rS9gxIDcMU
   22.87 +uz6/NS0R3w1ONO9bZB/1dg37DcmMp56trKFvFQPnVaazvd1aIJqbvPxmVilMFfJH
   22.88 +pfyCPWb25RaKZ9F6rZm1ab+peC8X5MwN1TdYY/OsLrltXm8bbGvkeZbzzdxnJWIp
   22.89 +yb89PIFXvFKk7VEQ3bebTLqTHS5MxbUq44jmWEA8tokjRYwX3AbC7E+iUZIYib4c
   22.90 +06c3u+4VQazvStLt80pxil/sY+4pyjvRw2gIvgEe41Zg/3pjzSvRtQMK5glgtr1+
   22.91 +6+DiUgOzX6wOLSk8L9F9wrrnCYKyPjXHUNBuR4dN7Ug7V8oC9i4v7Nc912b5xnwu
   22.92 +0xBaeIxc04mysY94MlpOjzKw+XW4RjvTdV6LGz2VKlg+nbi7+IwKU80zCWRh1BIY
   22.93 +ahlkmCRTjV4b1xmcwTwOnI7m8qMLEmhxOKmrDeyWvuRMBmEolHj8/uDzYKhWAXlI
   22.94 +Y6M1Cwx5Du3geNIN8V+KaP4t/SNUo52tsDmNhqLo2wGNsuMljiiA0szi+mDg5KJn
   22.95 +TYnfcUmKGdHxfUjaIPyi1OJtFcfsukOZSEX9zDRKZ9Mdkch7G/d3DzxRk++zXhVE
   22.96 +gjVTr8za8ApWEDchZ88+EaQmwHnZiliHuwUL6Qphhb0Tby7ux5tzbvOrlmh8K9zf
   22.97 +AG9aokDOqat/McVL9RtpKYRjviraWhuHOOeon72RSfY26V0K1tkM85lMrbAJoKcV
   22.98 +87yhzR54GvsLTUxl/gjyFkLTNeg/7iYcxc21XsgxGeH9+479U/grEUqHXn5WBGnr
   22.99 +rkswDM4+2soiOFTYFWda/jBV8kAP3ixVZ5JytEgsQoQP4jEO0h+HbboCxto6Ln8P
  22.100 +TcQ67GF/VeDMGqqJMURhpmsU+g0QeYoHFZagQZGFR7EYKKctJT98WS5Y/HTyjCHb
  22.101 +kmrDCI9R2ZP0GViGRqnRw21k89fwxYMTS9hsNzA+lSXvSOfwbX5Caqj0K+otlpMD
  22.102 +2veEN/RVIjLISrLIHWjKQQTrQ9FZtMbELW8PS28+cwANqG6vx7cbR4zlfXw2XWr/
  22.103 +KP5fcnWOWCUjp7K3ScDctxCS7eO5PLlHbXugX+xPclZrOSCfIrdJ2cdjM7Zd/vrl
  22.104 +YpLi5jg2e/ua5IZkRmcT7tkoaaMSdF5sGCIQifoM92hyEUqlD6UUVM3BPSXZL2r9
  22.105 +Zd0KtIA+p72rjD63eHpGA/TTA5qq/WzjQFDRwLFQlX+9f8RVccLFDnZxBOyvXSxs
  22.106 +AEkXRPhBGAEd5Nnck0amyDaGRGNEBcvpYl/kQjKqbDDkX/9OrSRE/7k2lB2H9eQk
  22.107 +bakPyxrEQpaaOYc7AEcJvvES7+selgmOISS/Re9eWLYGUvYzrZEwOqF0Roaqbr8V
  22.108 +qR26a99PNcZsSBBqhexb4GYR/qBj3o/rK2HLa+28WLUnxQDuDZfrkAeOEKOday0i
  22.109 +Au755Ayt0BFKqiqdrk/6JsWUzon49e7ZqdB24oaxSFO+E3hkPxUo6LCfGc8IJgjg
  22.110 +DSOcIG2E8zYnInwOElDntsV9Uqo+HEyQrpx6FZnCVgKd5laXVr2DxWskYDv9zVnd
  22.111 +S8xYWXcA0AdHuz2JjChtFjMfFZAThlLrVn5CJ8nwsNekwxTbjvM0l/kzXsIn6Kt3
  22.112 +i6kSUF2GBHw498IJbBOmz8F7R/yq0+B8lMLSye0YxgL5OU7Ewh7VGWZqppTc8kMD
  22.113 +56yFsNhsGRzATpb+4nkD6ruLIzryTK7Jeq4ybvr5Q/NCS3vtkdnGxDR4Ajq+QWl/
  22.114 +rhi9z+Yp+J6hXByi7gJdjVZqd5hPTmHyemgQmmxBN4wzVg5btf8Gk2zx33Ap/25c
  22.115 +hiDuCmT28GEX9RDZHaVAsEGSNw9FsrZKyTiHMfIfsFmlYNTweNHpge2PPDMOzXn+
  22.116 +7BS8Xr9IPpOF+Id0I8ZUv4sZCyBD0GgOku6EEJhxh3MzjbJI52cj8LC1ipwRlSt1
  22.117 +dY6YIKP0iYQJLQBOvijs4Wqcmto0VUvkIShZgQDggXRtG9NC8sYxymdDowUVYweR
  22.118 +Agur3JRH73ljbmOkgHR6Zm7C38AvM2/8RZsdQ+k3jDe3A4xUC0qM/a7FAGpo5Zqc
  22.119 +jYq5kDoluVVOMzIMZxa48IcvSH+6BE6bnNXGAcCtdlyolSt5PeYJX5qj5bP9Ax27
  22.120 +UHf4FxoNLdkYRxRF/sZaKsqBCegXtGvwdembMm5mUGS6XvCrgOH+n1zGMJj1d1PS
  22.121 +ItgS+Zno9HCJmiu1mOz1z0v1TZtfua1dHMwW+fGp3d+HLoG+C2UGMBy2v7e139oo
  22.122 +F+O7zmb1e5rlZS2r1uSEK7saBtK0dsVxUfRv1MXMSAFAa3oDoVDvC8NBie8XdTpo
  22.123 +rRp0sALupAgvVLN04XGgaoHwOu4EnxvjtFc9+bF1YuywC7kwEcExDSY6jW7MTXj/
  22.124 +47iNTnu7KwPOui0/mQ8Hv+r0/WxwUCpNLR8EOR6rCTZz8Gp452susPjoWiQHFcS1
  22.125 +CulHd+4lQVT/1366U1OY9aYeIJtR1TYQICFv1KvRo6ktfTCBxQonMz3cp56WZ9xv
  22.126 +r5rg/9bDHrfmrp5z5tkW7OTElj2FvfZS7858lRBAzeyu+EJPYtghiYETNz3dFlNl
  22.127 +38NnWuIVOd3W/exckTlZsGjGAZ/lLvTbjqs/cvNJMSgREsg/X+sPiH8FjWbDHblF
  22.128 +9jqJmFkiiKzLJbBTusw7ZCyvvWTfIAG7C/g7+xvQGujUZSdJ84tKesY2IoWJ7Tko
  22.129 +dVoI4psM2PCcEkSWCyWYHR5aEEyaRWPpaPRdlY50UxPebfyqqKzeW6yP0KPw2qo6
  22.130 +gDnF7YXoPoN0BBEN7yEQwC3wnK1vK43qIpLBuIdf7RnMhWXmXyt4wA2dP2+zelZw
  22.131 +39zH1tFXy+tdEJ9AT6gnvIIN0Xb/zvi81ux9S8sxKKcadERTtorRMnHB9VMipQdd
  22.132 +rXR0JVwsc9MeQJYR6SeviQSEOPBzhUwLTz8FuxM2HuyP2w5EmJFyvTFS0zpOES3j
  22.133 +hXrq7ZFJ9C8BAvPZzU76nX8LHMhpuYfgGVPM58G/pK/Jo9mG7kgowDLlpoZLVg11
  22.134 +2Czaov8Ew9nuvYFGlgwsnRfoMCIuHlLuS6Ilyb3adwZxikONc/Phhn1As8aPA0ix
  22.135 +F6vd0m6MeI9gUFtfAb9qH7JgU1xcKEIRY21GrMz3oLhTm0a9ZhbBEi6EPyj7oxiJ
  22.136 +JCjT+uCnqFiMTNQxyClzve/0xYTfrQYVdPPzeynxPv1z85FVmj/Ybz+8u3AQkDAb
  22.137 +09mZghnKkK0jkIxs+OEV2/8rWymOyxOm+FQSkB0FBjx3kBkyLlM6fIF61CsJsugt
  22.138 +RUXOeEJTnwXenLY7iT8y7HOEvn1FstKtoOr/YJ0Ws0uYTwxjCLBdE3JeeWm2wmjy
  22.139 +A9SFG/qeTCPNdoMwedbDqBUboFKsZLjbcC1ZRIaRBHW0ICaqJPFnoSy15WEhVYDM
  22.140 +5Dj+x7t+RxgOWLz8hl6a9q9eu93/xYN4vkr22N4Axr7H0XFwAugFY36nTHPLs2ZV
  22.141 +AunE1JebbDG9iP77MVGi2b7ARUa3kffA9i8KeiNwQ1nCXLVZoZbOdqJptF2hJJiJ
  22.142 +b6NsjfnJOSxYXICGFs3YbC0WXyn3xgHwBT3z8rMJAFxNC3N+w4rsxcVz8ENY1y3u
  22.143 +15R9VbxN8SQrG37P590FMfn0UIZauebL/fBMtFp6YF3xWgfOzCPO+/YcyPRJ4Oqi
  22.144 +uFJx0iz/ts3EMoIeh245Gujn39uIXi69F67GkWFiiyB/XL4eBSJkNDgHfr5WI6CZ
  22.145 +y7IFsYaD/0evQSRRG0lOhOabJpjPrXiR587UlUr/p9MQu67L029HGGFuXaHfczKu
  22.146 +mSnlwhaSCV/uwiG8mY9ayEGpmOv8g/6qKuEMcXimuzcC2U7pTBaVdkqCnQ+E4AHE
  22.147 +RA4dsfrCy+JAf/tsqzTUr23kQzSvD1JCwBLK3w19fTdIhD/XHJj9Lg81UssRS2QS
  22.148 +fvqWV5fmjo8V6mmym8WypGsnbVhRD+Qb6ZLG46BA21wv3FcaPCfUq6uCuBCF4s9v
  22.149 +bGD6xEuoDnzfOLjfjfs3y9Myzf0/QFLWnGfkGv9lmjz9eZ6XhRtM8w9jKtPiaXZB
  22.150 +Sml7/g1wViWezed1mrcR6VCP1RE4hZkHSOWQP8ygjgV0qNhSqpajlYFO6C9wWBL7
  22.151 +JepWfoD1RuHmZSPEWObZQaVbxQK1j+9+lXX3wM0LgypmEOJ/aUYroTr4hryN6vM8
  22.152 +9AWnONt41AHn81YDAnY2f3yOMNykXpk1Wxo7kaQskIC4nFtNC2DjJGUdc3RLPU8z
  22.153 +k6Vmq+oouQnaNDfKwf0e482UFvS6xS7gZLaCUcLjWEVyW8cPQxe7EMf9FeQ0GDRZ
  22.154 +rvSgcmfICaN4yXNRQJ7k/VgYqkfqKNjtjmZPZASMPeoyYFPv8UtsGH1Oko2ri/KS
  22.155 +0upeVnsUCahpNHSu8LzA3Jrdii2CpS8SNI3n/NeSVhWhxakidehgsInzo3rldL5Y
  22.156 +uIysucquETO7I2piK6zesQwCWOEAuZdvpOD2O2WS41Q9DFUG1lpUpAw7fnQXMS39
  22.157 +zT7eCA9ucuaJGqZ43imG442W57iQ6EUn/0c3NFPRdNijJforQPmLR9UEtrS4UwgE
  22.158 +BlCw+t75yxVmBvkkYvzYNKA5AzvFMeasLdjCxnDZkJk15J2+piW+Lkc7AimdKO13
  22.159 +ZBAQZINqks8XaBqeljnisYlyYF2gUXIWFtgxdFVC4Nh4ZbSx0y45TwUSq8bZQ0BS
  22.160 +LgKkI4FwwoZAKWnF2/xxSt2VaHP1T+nwvI0HEBHwM0+jsEfZ+h08/ol+U7ux3iHs
  22.161 +BiZREnjkD7pfvCNXqHJbPknwRjdnodjBWhZfJT4hmAmnVEVTgoSgcsQWUykT4saZ
  22.162 +WvdD4A2pV/rdAHGzHv9qII2PQBoYLk8IOOwxUAoDRK2JjWHvQduH7KRvACIgW4cz
  22.163 +qnM1XkcztBK8dRQ2GgFw0a6AW++lRKT3OzMCtpFbytxGuicUR+7ki7lNQ1Zsdd35
  22.164 +u2Uc8MCQRlqLhZ1VNZlHbU7JoVW3vH3qDi0W12IewvTe5qV3LhztN/7VElj+OoLl
  22.165 +U1g4VfeKKYiDkqyJPBy/Pzbk9TysEQG1dbFpzdxK4nOjRp8e718U6TV6KCea5MIq
  22.166 +iFANygqDZnTSBiI1+AT3l5jRLXlAMRgDLn9shbcBdlakkFNmBINVaDvb4Bz+KmYz
  22.167 +wEQ5NZ8yi9oDSVNVCnVpXWPvNtIUfiv4Aghsylu/SYYcOqIfKAC2RRdaPwsA0XG5
  22.168 +5f2n3H/Ik5Ordc7UoaV24wox1y4fpNUN5dJyeZYUnkY1En8RneVzRyUVn5TJmXvv
  22.169 +Iej+ztkvHsbTLj5VZYJq4tstJ9alK1hxubLhTHVHtfFsX88+aIX0fEjKh4WGy04w
  22.170 +SHAecnO466KOtJF9aI1T7idmayKTT9MMqaLmVYimGxredEKhTK3JAu2L5+p/hOKn
  22.171 +ozka2pY4RqHWmfAxoQBatr0r0kRC/xRyAhCN0SV7JuyBGNRvvkBnErL6tRqQUIwg
  22.172 +CWz1zOxdHkkQN3LVl+Pq7GIdfxvf9/7njEphJ+vNp3An1ZGXbqu79PDwaqH31mnP
  22.173 +OhWZgo/kdnMbF5Kj/y9iqYj6Q4ZqczboUQNxDHuMz14t5jT8UOca8DjfbPs5EPpY
  22.174 +Vd0fOi7SsaowFPWxh3EbfWiauc5eUQLqpqajrBBmdklUqTIuxJwB4TBmShiayuIp
  22.175 +Nrkq1pV6z+CsqVLjbDihWwz4j4y8IRK68O08mOAatYi7oasRmJ9R+lsYN5r9YEJI
  22.176 +GTKo0Wgt7A2rf/5AFaaDNQottp3JIRMaxk0q3qVssYhVH92s9Lq3yEZ5/SpGC6HI
  22.177 +IKBfzVWkUqX6cq9OqPv0OiFhYn/skI47GIyg0ryyc4/XP6WRyDR0KRdqpD7bCU2u
  22.178 +Y3xlnIg/HEiWgTyeRCNWHgGD8I3ZYe93sATR3KhV6tGgijSU7lRNgOsY1aCT53dg
  22.179 +ZFoS5rrvzILX1h8O0G1dQ76gZLhY8lWCX0Yz8wFNSU7sHils1pJg25NGLT3zw4Cr
  22.180 +QD5di+RlZ8G0knopEVR4HkNA1ANRuouMnH1piLs+6+IOQ6uNqIY1W4N/BuKedoTt
  22.181 +FkfNMF7ak8ym+X2c2jQbWJoSDOx5Qp/xt70rPadRA6NJfTO/zTS9Z1O4PhkAVXQ8
  22.182 +lT8jiJa/hlWG+1Mo5YvWDi0BzFOfcpvyS7DjEr6j25sRFiQKbMMy6kBDh+l5euSK
  22.183 +9qYjriFVPwd5lEQrSLyzuRtKGxL5WC0tG9g/2VaTULtFwOK+IsqZQCQJVs2KnmFL
  22.184 +x/IPrSNN7SvccNyF/NQPQ5j+1FWV3i2KuoaM1WtlaxLhQjpK8ddJ3AAUlu+Sv1OR
  22.185 +Az6iLz9qDjY7LNgA86TWFONk+jY5fefeVc/Dr8NqkNobBrZJTRQAdkCbNfaKuEPO
  22.186 +5uQFrsDPjatMTaHMn9+PMBzhTLZzUn9EIlef+olp/zPkvXJKpCA+qyOIGcbR+AsT
  22.187 +3uKwbB7fBNtlwAplBKraOp/jLV2tsgTOssm7ESpKv6TUGeVEybSTq954msf/ef3R
  22.188 +RVdg6oaWy+tvpK/6IrTwOrP+UKig25KVBmTiPJLnjRYUF9057/JEbJ/QXGFhxjVC
  22.189 +R4Mm1AobQzFM8QC/0Yp1TMnv2TopXN6hsx0Be3rLKZBHcA699joUQIg+Ep/OPAFZ
  22.190 +oMOrvVRIkNvoSQBUaIrWVBS7J8xUsY03N+Idhz5jgDv7Uuzyi6bYb52dy/9OtL0w
  22.191 +b3CCvaiIWyjCFK6TUDgEz8zyyDSAO55WT6FNbZ0cGIzvWso3ME8EfZ9KIt927DT2
  22.192 +3SgImLtLitG4Hk1CNgPwQZEzos8zaYZczPtBaZMfD/9b6hWONC/LjFl6IeceSZH4
  22.193 +o7jOjt2xdLOHCL7oD/+BmBg6OrUmaeeHhQbsQ9qZIbB7wsvHNB+vZOeMHApojLMT
  22.194 +DHlWr20l9XZAgLB2sqtqx60SKpkWxOi76eDofXHFPHCx0Qfzm9DwlPdIpehyTQWN
  22.195 +8yhMdn9Dt4EsDjh/EK8cEMsFHWm36y7k4IoegjqsdzXNG0eLVgE0GETkdL4O36La
  22.196 +s7WGR4q10kp05m0hnrrU4tD+0Zf3hg+eU7x/EMtmL5z/U4IZjzddZdDud10DAOi0
  22.197 +6Fd9acSctGkHl/0LWApyv0830hyF9QZa2nQs70tUxwu65iRdejR7ErspjnHUyydv
  22.198 +n9kNQknLfXNOz181rwaSOPygvLCZNe3JmYGlCbWGJU53eQc4f/OG9GpYCm2dFLnL
  22.199 +ajC6pg6BCvpopwIfp5ekCohEicAI9oWaSxAvgBqJ3dWn4QI3KkhAkm09HH53Pbym
  22.200 +gOHoNlWEH0fiqL6lk//alwo5OHKMNNv+92IVbDHsa+axXaHoEtwh158mvd/KBEIh
  22.201 +shM2zB0eqCgiVpVEv+r6jlHObNmbiiWIiV8asrqG+sctwUaEUHmZCFUL3nU1SLzj
  22.202 +OpOt/2B9YO12BO/9jOmtMhz7S9LaM4F5mHURppcP0GLfkL0nJs5uduGiXz3GuSXY
  22.203 +lfZgYH6uibjqgPBC1OADjFjWj8+KOsxa8h1xOpieWorrsmFpU56b5m4ZwjPK2NJu
  22.204 +cR7iTmmbHzY+eIPPSYNIMblMnZOf/whqXRI6zsFb+gUm0Kdh/H7k6uryE4SYsRpG
  22.205 +SanMNJSUEslpZhdbykwkYqkx4JmBdMllGRKfYYtNNP/czE7QNBh/gtOlIwrjl8Gd
  22.206 +wZZgV7SyO8VNbdnB3PTUy4x+1W3uELQOUFfA2Uwuy/dhBHVXWo40M73zJFKCjQLp
  22.207 +o78BwKbeUAaUU5TRqSSdgNPMMtu+gQlCKhw2oNIPtLXYFw0jAjMtN5Fxl8EH7IKu
  22.208 +vcPsVUWmB5kLH/lftdzSB2qPm4ftBGFEgbGf+v+UHpY7gSM66M+7fu9Jj66vworG
  22.209 +cAlK7unav7EUPaRGovUEn1L+hJNJa9SNq+ykejbJAn+Ohx9vxQOdbAfZKhScmdMP
  22.210 +kR5sSIDRmBxZI/ZHlikGe4ZkT2wUo6qhbbFa0+3+DgTF0gYmUe+4UStrJ2pOFYdJ
  22.211 +M3fvNt486lR6zxkZbUwP3/NP+FR+eNO4RiXhJ9xYiEwq+lrOvXkH+oG6OPyzAdsj
  22.212 +b6QW6wrRlsURMu1ZvWYq7GAhxMBe7+NSZ/1ho2Mtx9imcSidafk6C8bER0VD+Vv8
  22.213 +WBtEQyO9qy3DpKmw2e7E+XhGiTPVzyrnmGbhPyajgex+9Cf0Mr8BrHv/Tn5Ls6tD
  22.214 +LlLbfAizplGucEas0pc1n6HLCu0gzo7Zee45gtRCcCKVyxhiiVNsBx39ZUigLniO
  22.215 +uYrkk8ADvoZ5+ktqteve1CHyx5UHYDT6FHZ7+5E69LubXiR5Dc3jV3q4jPm0NUJ+
  22.216 +nx77TQXwpCSqEgpcMzS56YdS0tF7d+qH6JE0gbdRyV54iX/1U74b7mL4DINWbU0A
  22.217 +zBtNLSsWNt3iZU3oCmbk+wgGKygtZndelmWX59R1MMA4s5VmOOB3SG9mWLLtrtwR
  22.218 +6Pq+FMgZKg4sTxiYtDAYGX+RzxiEo4uAejyg3Xlq32gz3V/7mfTmfRJSRdRwlYNE
  22.219 +u0gl7cMX2SVgKtX2YK1b9bvsOj6BJMP3mdthS62fz7xT7soai4A/91khaVGkdwaZ
  22.220 +cBnAU7tMHHQ2pP9MDLZb6wg6zJf8MeB5GTbmlzRlEI2iFaxSSZOfyRUUdlZdnJJ6
  22.221 +VWgowBrdEYcO/7Uao/D1Du8NH+umrZfIcjFHFf8Je5DfvNAm5T7AVPVn8TY35LjT
  22.222 +ncpjtWL/CNnBDY55mqm/6eubMXvExjEiSFK31NsKxX+hpoz21TdbsUphBwK5HG21
  22.223 +RY1L4mdH0a0wZ9IqUkhUHugU/qeR9NETOq+I4yLj495lnq1mYj36lju5FxoG8Rl/
  22.224 +/iQmwBlREYLjFZozQpCrwny+d2yTZIcMFWQ4uqnkb46X8Uj2AKCM1RKyKnqGm6uI
  22.225 +Ua6QbngbSIhba6xvaZnL3IUq4IetxC3pjeWRokWEO1E9y9KVvlRgNcsQ0ZD3bGRA
  22.226 +8lKi7yluNRJsoh3hzxEOBiNDb7Rpuc3XbpLRNuXdm7F1bGSXOtxjpCEjkWr9G4FC
  22.227 +kYHmGjc809dUYhSlYhxZV4hH10lSIfmqNMphUQpAmjG06If8y0l6EFU1dVKYdI7l
  22.228 +pH+Fch7yffCGQnwCk8SGW9lkpassAZ1AracwfuS5Y62YF737O0h6K+KsitBqO06p
  22.229 +Gf8h6COAOPEns1UDKgcG14bHI0lOrqQLWF24sL5quFzkACoenDgCz3Spr7m1ABOb
  22.230 +iwstKAGh8EIvADVSfNJ++mEsRGTL0mSTgppiHctPBMrQgPu/KwX3SjI8GZFQHAB7
  22.231 +bQlZWGqZfa2DQuAAQ+7ai0ocnArKF/eMAAoKv4TQ9ppeJkyPFgLt3qwwrzYPBzo7
  22.232 +S+w4At4B226Rl84ve3llDKGEYyY1giW0J4Jwnlzr0vhJiGJOrF76b7zl/REJHcuG
  22.233 +jHz1yaRECgBxb+tH65xIYKc0HqjIYraDjtp5QMSxT+ESLA7aoYABTMtTSmAigBjy
  22.234 +kUNFfmsdS3533XxF1gVjsHb2KsXE1pIy96r7sgLHizuFO2Dwb2Pd3oWszaBUiOWN
  22.235 +mYu2KDQTroKE0LKHKkUZOikcSGOvkMJDUFiZ5duh6z6mC9ay+gaRsTIa4EueIiro
  22.236 +rOh580ytn/Ru3lAtSbAg3eQyT+o6Je5AabQsKBk5Mj0blqeYlhOQHgceEvfbULga
  22.237 +wzcTyfKzHWQQFcDiMYpCEq0Hd6ILlXdX3Z6mKH4a7yBB8Opr9GY8dR/KWtpXizBx
  22.238 +UVsppGKrR2o3XidF178HOYT8BsLXuAEUdsiREDUSTY4dHZJ0CG5u95yPddrbckrV
  22.239 +l6ezi4TjRKF9l5vFxzrgZS9Z/3AypZRJolqrZ5KzxZVf6pCgyLLCsAruZaFC668R
  22.240 +aAUdatQzXkWpg/4Y0Jp4oE2h1Ucpa168Ru2x78BXsVGBJOHB1e7T2V0G4OYAWNT/
  22.241 +DMGlY5mamdUqB2xNxOTM2Ye9dAAiAwvleslbZ5KOJ4xHAId4AMQJFCRp/X0qlV+w
  22.242 +0EpM+ArNuMIIRo3S6PxhhI3SG1mJwJOlU8YiWuGJBTGSvD/VjVnQfd13JSkT1OYH
  22.243 +6KzK5w2JtHq1qxH9gnWtd6ofynhJmnxwpLdjCexXIGYdyUqPseZ3MC3gkgQxbIdN
  22.244 +Geg85HVXpbYSp1Apa2rom4SiYhWrK/ZNfksEgEdJU8/mEVuMmGMUDBOS/gsmEU5G
  22.245 +9E7j/ReBZrS5WxctF5SDiTMnmzkPwn2ta02zdg2kxq/2L0l3HBzvl/F+gMlWzpoP
  22.246 +lkxrDjWrHNKxmyQF4CSCwzxyONX6GcLHnZCDIQkHfSiO2arF81MPf6kzxQMpqsPk
  22.247 +dX/KDuQP+AIy3H7rR8WDypXl+E3WpPjCU0NNSB0JhaI2zcEEvFG4ZOY7XHwKKyk+
  22.248 +VdGrIDqHn03mMdJWO4NpC9AkKg4MoVWttbsMiNsjdQwq3CY/x3bGnzga2NLjhnVy
  22.249 +ab3hr6ZtvVjPlEsWvdgI+VPATt3gJuo32YqaCBgJZUxu9H8rw8HQBCGx0UccO3up
  22.250 +nIUkpLYRq2d2238ZyARpyE6I+nyId+XtKC5A1cUJ5jXKgyZ4Aom63y2qMAw4oA9K
  22.251 +Me6B2byFhDCwDOJ1ZW3UqVMqxRSGHDqzN6wQjCi2TXrvCc1/xHqdzi2zLXGXsVCt
  22.252 +v27RRROuM4yr4i2A+j15+9p+hl1MdSsinzcisC2Jj7YNk3s8X+qftvmrBabX5U5C
  22.253 +Zy5u9myrIZ9sPWYjkkMwG3BpBJxcHf0zGkN0jF53bGDFk9Pk+MGXsC1XRo/qXzpt
  22.254 +QC7yj6BtSMmAhgHAN5typTUh9YBRwKL0lHay4La9TBp+OJPiTO+JEtmwDC0SqGnY
  22.255 +KUVST+BPfo67pUwU7BvPjB49sgrmmy7YjmrjXLL8VGsM059plAg6y5p2u6f9VCqb
  22.256 +pXU6Koex9HECEylZHOsJK9NOqVeV7JAcT58hoX6Ce7HDd4bfTjePjlIN8hOZZOfF
  22.257 +ef/746e39Pzk27UVUqQuVgcDDaKyeShO7LeWg4tQDqEoC/OyiE8M40ktscRqLTzE
  22.258 +MQ8RaP2S94kJ0Gh04Z7cgJr6UxVXkZVC6VyyjHhf7Fc+ikDy2h6c9cbg1DPAop/t
  22.259 +jpv73fR9Hwx3WPCRcodUxEfziTL3EY3A33oPJ6EF+aZKYjrDGW0lDKYX41Ga1dNh
  22.260 +DO60mVWtNJY5y8+Wcy20vzfKbuzcJtnAck8NTK06gXdE6zMjDfE7+ReYSHbx4k/m
  22.261 +u33UPbXWuhguwtpmoQm0Aq4sDBGQuE+tieMGmK/YGistoACqGcqCSXwU4JmauOTp
  22.262 +onBaAAyVqqQ3n+IcP1be6UW+Z6fyFYCjNh7ION4C3EMN1QKj4jrpYQ/P4IWXoYsL
  22.263 +pkqApfKGLQ5rZ90hRRn8rko8+OELSvFYvB/JAUdwkPvxDpRLFaGpRZcgaQ1Ptj8w
  22.264 +kOg4ucyHQFHp5xrXZCK1D72s/fW42ZY3e7B3VtUdqWg9njFCZolIv1QQX+8U+Aey
  22.265 +acjwExL66YwIwZiVHyF0K7yL0BpszzniKwzj9uyAKkO64xyLycYQoQebLlu54Z8t
  22.266 +XBKJMHIJToAwPkqUXU++nQMW+v6ZP8ehKyGGuskfW9qyjJmGKsoEClnB9MpnRXBT
  22.267 +jRpuUdgHpn7J4/cmM0D7jwlOuRSr8Ih6XRjXO3/JDhcFM6O02BiFhNAsG+X6Kz85
  22.268 +5+H3mQ9QLg/ipvP6HNj0QiMICuipjXLm6Pj8qIA5SzuQ9HnuZossAWkhH+vlqG4H
  22.269 +t3qtQ3EORWRbQSJSEHLB5PnODXVVWB01axBw5Kt5w9iwLLuYf4o0kSPwRWDrLPCc
  22.270 +chyquKkoEJd39KKb6LLyipvdQDcKjrZot6syw6l/wSHaf4ZPyHsPYZeiltgCOM8J
  22.271 +IsQ+WKBG2Kg8OFxkaYOcnFH5DEs7LwP8CUUkauTDUOXiXGJbnhdead10po2qMrJ0
  22.272 +jdkKIsoyaDMsnJkc/AwUKqDlPVFtUszPnk6JtD5QD0NFKFyFVZNPq7ZWXH0OlZPO
  22.273 +migWvOtZpWOrYKO+YlNwLCbsF1mDr6wzECGf2NdylZvKjMYtQN2l28PGPplBg8X4
  22.274 +dMF/1PPKbGcLQBS86AMxTcb8NDg/aZgYoRrLKdbhAz/QwKbd4z9pO6lnp2IPM8Uk
  22.275 +tl5WFd24gCRQdQ4ylOagnESLjNCX73VbvZtsxMfCje+NQpDWuBbEm1sCkFazTTDE
  22.276 +n6hiX3YYRbLYlgq0TNtygSaeemWHdgkgZNw6w9+07Snd/vEYTwZdvhuAOlgQj3Js
  22.277 +vGo+nIT7qASqVYBcGAjydM7R3MzHa3PiJ3GkhUsfEBLSVuYCgkPw2zr/Dy3LIh+a
  22.278 +L5H5lWPP5dVe/RsT1ZARccLPCQCkZqk8esNeEqZT24pljfN4B8S/dbWhYDJygDHn
  22.279 +AB36yGVwBwe/xl74ycWFgiGzpoLnDtD8QmRPrCN+Xxtp/zy2Gyft/6vKA2JEAoNC
  22.280 +MOQeFNHtyl6vcqqgC7N/YFuDBoQ2RYO4I6XjFiv1vxuyOb17UcIBnzAmoN6GNXfN
  22.281 +ag7CMl6CkVdzYyrIxPkNeXgJCyyNVRUhkyjKDo43CTZISEs=
  22.282 +=MnNu
  22.283 +-----END PGP MESSAGE-----
  22.284 +
  22.285 +--4e6afb6625e45d32519b500d431bd7b7--
    23.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    23.2 +++ b/test/test_mails/check_reset_grouped_own_multiple_keys_multiple_idents_reset_one.eml	Thu Jan 16 12:40:10 2020 +0100
    23.3 @@ -0,0 +1,282 @@
    23.4 +Message-ID: <pEp.Q425W5.1FHMYJDESYYS8.B98011A9-C4E5-42F4-8E58-118C1EC52B80@darthmama.org>
    23.5 +From: Alexander Braithwaite <pep.test.alexander6@darthmama.org>
    23.6 +To: Alexander Braithwaite <pep.test.alexander6@darthmama.org>
    23.7 +Subject: =?utf-8?Q?p=E2=89=A1p?=
    23.8 +X-pEp-Version: 2.1
    23.9 +MIME-Version: 1.0
   23.10 +Content-Type: multipart/encrypted; boundary="238e1f2946e87ccd3d1b58ba507ed7ab"; 
   23.11 + protocol="application/pgp-encrypted"
   23.12 +
   23.13 +--238e1f2946e87ccd3d1b58ba507ed7ab
   23.14 +Content-Type: application/pgp-encrypted
   23.15 +
   23.16 +Version: 1
   23.17 +--238e1f2946e87ccd3d1b58ba507ed7ab
   23.18 +Content-Type: application/octet-stream
   23.19 +Content-Transfer-Encoding: 7bit
   23.20 +Content-Disposition: inline; filename="msg.asc"
   23.21 +
   23.22 +-----BEGIN PGP MESSAGE-----
   23.23 +
   23.24 +wcDMA6LykRmZQFqGAQv/dfRpbFTR/YNdAysk92+KZf/o6BkV3POLaUkbC1mou/+L
   23.25 +obcqRZu9V5C/KSiIYMjZ0610/snRvkpyQLFRf+Oq1J75SZUfM015cQi/U2olNKTC
   23.26 +AgU9i+Thju4YxJQREGHi0JQghTACy4t+tGcc0oY9/uAWokc/2dblHUP8CeV51mD4
   23.27 +oXe+UG+PBFr8h0jk0N5QVF/jwodEt+cp78qRcuxEi33GOJVc5r+gzXNgZTorunue
   23.28 +DcsfgT4a+/P/Zpr2vB7Ky14Kwyp3/aHDj/wKgqc/ofDgVclTg58LNX+R5hDYt4sz
   23.29 +P4vELR/valabFnezNpZBLqb5LTD4EuT8jJjQh2UWr863Ko3Uyxeh415JwWzepKvq
   23.30 +4Lc5W/Kvcg5EwpMbxfZg9dc/Rz7mNa7t25NTr03UgzeXaWOFz0tqXykG6NUoB5JD
   23.31 +Ck7zazhfwS4w2+JWpG6X1iKtsgB6Rz1ix2Qo9ScZGS71NBenXi9T4l1TFZk1Skx0
   23.32 +mIdepd7l10wFruZPuyiIwcDMA6LykRmZQFqGAQv/W+Ij9TeOifpOvshiokljzzco
   23.33 +8SzocQQc2ig/csuAhbiOOSuNvPt+VKhEwT0L5uii90SEsuznE/zgCg3xQg91QJMu
   23.34 +a3BnOvoj3RoGp+SzJzoRxwbemKqiFKY4Emxk99KifkFSdZEnmfhjhlItyjtfL225
   23.35 +c3r3+N662WuoyYkv+yOTqZj4YqO8vBuxXJ4WuxtATD+Dd/2BnOK0eyWELoaZ6KO2
   23.36 +ARg2honjFO6HwYJvDS+uDBqYbl6PQFNAB4BoLuRJUfMtNGxTnCdFFbX0mi2gACF8
   23.37 +almSrNHANbHH8+orH6wnl2GKBgIExBN3GgWOjvnvqzqBPxUFVv5bQvPF+YoJ8w7G
   23.38 +sbdO3Oy6b8bpCIFtaow2TVKTlpP+HRPJFkaPgSi8U6FRp+uvLGkIXhaqGqw6263Z
   23.39 +QuxKKEgLXN6rcdEP/MwgsvIJz1gjrf34yrffF4sFy6cM4OsgHdEOrBkESgHg6wvA
   23.40 +Kdqmlu0RKGxP894hq4pGysEBATY+ZLcjQVzjfR090v8AAC02AXiua+1hrV0yQJAi
   23.41 +BvQ7EiYqRLCFfgUA0zXHxgqPN9pzwgum8kCokjlK1d+GTXIHpfRS1LJOyuxIIyXL
   23.42 +iPP2+SLSokzwMkEacXu9v2BME94Kd9IJEb4mrKmVWCJ8Vo6kHB14T3AeLvHjcaYC
   23.43 +HAZH1x9cXCKjdUhw0TI9yJ3QXmposHRxZU1Uc/VqS6ZFoLFLIil2+498BAsTz6B/
   23.44 +x13u46G47dK0PQdF023yFPaNWKsxjwh8xZSucnzPwFtPnOVc5/NklWBAzyeaLOHa
   23.45 +cV7jdvzfhTweoKJ2H2wesBf/vo5mf0ajwwqOovraIl5oVH28/8GYVgbzc+s2oMfF
   23.46 +tE2ycKJCDlbtaXaWC72EJn6kGfLvWK7AI/3lmmuom3kUCY2ETHtTN9TqxqRTUKW8
   23.47 +szpVpbjh4w3wiNc2WZe+IjBcgaCT6Kxpk19d2IdKG2iuOYtBk8rr7kEJ0GA4UNUo
   23.48 ++SYvrZFK8mctJF9Z6n2Bh0PY7YuUanxl27thYsFhPwviT+enKjvboRJL/S1ZHKf6
   23.49 +AFI7g9mlerGqNnIP55O+lec67/VponiTLYJTdgeVi/pr3d47XPI/JygREi8tpg11
   23.50 +xMHo8QZVTnqIIqRnJNX9AfSWM2LU7yEq6vJ3zBp+SFbIwyix3hTlWyedip3E0Gg/
   23.51 +4+cdIHwQVz4JUubH4Nz0DRKZY9m3JlYNkfBpW44RFrDuYzwRxA/poFVoZG5zLzlh
   23.52 +Rpla1U+3nt5KcyOU2vLPNcAitmmxxRCDNfI0FJ/4CuuFuAVjNcTvCHYGAErsxBQ/
   23.53 +Nq/oUnZlATbiboL9NZNofkhJukp0/5HBfjg5VhmA1ZUqBUGEh6QtwNEPiVxSKoi7
   23.54 +bA2GT/DY4jH6JUMGzg+NQzZIECWM0iPPAIDn6i8L1SjF53ljYEiG5gKWr6Eobwzb
   23.55 +bPcMPPzdW+2xz2F41qUEJv0WJgzVkBv2tI3WtmbSix6XnyBoPcA3GQejb7GgEdRP
   23.56 +pPyqXlQx/l1Q1F/TYSqmyUuXarscp5Hg7SnhzZh3VOoiifbFsKypASXkRu6iYkqs
   23.57 +l9K9folwZIEkjcQEAe7OYdJeGRoaea6yWqRoLAViRmq/9wBH83a4hFDYUrWfJFIu
   23.58 +d9pSpr6HWfoLNPL0F/9+bVMBYhP6LEZjtrl2Ni/DFVy9IB8PKzducoiGnky60oZC
   23.59 +VIYE6UaeU24pEh0N/bpi4KJ2Mer6IHQWnY4byMEJO2M8HqvfWqhutVDkfhZYroZz
   23.60 +KYjWu9HhHdwoNUyajx3KUSd4ctVR5jqQwvL6YitEYNttNoU+93sPH9B0KHTucMgM
   23.61 +qJctbSta9aUlqIWJCTJqEZ5vng7BH50N/WR9wcFrIY6X1x9MHA+dy0o9mBbo78ae
   23.62 +RLopTGUpL4l2lfAfLiuYDxXQQK1BeB12B34X0EvJy+9UWRlryq0aB+r0JuYquwQI
   23.63 +aZTap2gqNZ4nKScLEes2u7rVT8bsA+CzFfH4RVZwFCpirjneFEhAnLkQPzz1pyI4
   23.64 +mvCZhZ15WvGZc4XwKcBi1VrhNuRdK2ECmrtaNKnnP9bIHcATuWAXNNiUK88ZBdiH
   23.65 +G6zrZSksmbCox1eE5osccWhKGuWuE0sUHBKGFkqOsP1Pdh5quh21JJPsOJfxhTnx
   23.66 +UxQqhKIEzOiMbwx8cjR5PJxP7RSQZud/5gy4h01DxauPCsxjk8oSz2eFwTNUv07t
   23.67 +gzRBcGwCuBHIMH9NWL6lbVyu0VPr6tGjIdBzGUBL9XFHJvdt9dSAN4d5gvGfobhq
   23.68 +yPk5wU7Rtc55Y/Cj07i86E5edtnUPBTMQF7A0L0jwglmoFBtMZ6kxamPEpYXE/TF
   23.69 +AZFnAfaXWDs0AkF2xn+Em21VZjpBEtkCBXIegW5ZoB3yxe4r8HJd8R998z5d69VQ
   23.70 +dkH/2C9inMNnO8vegq9TWFPkZFs3rqYALLaZNRCWt2LW3sjb8QPk8eBk0HnFpkVS
   23.71 +4CHjDHuio+KOM47Rw4hd6QScCj6H8h9JOFL9voWbSiUkEzZts/7nSuhq2r0y+Fk5
   23.72 +MAQ+W6xKBqHWJ0GiI5zuNCVCD5rCMNuKYrtDQoRxAckaze/Y+SmhPE8ncZvR7RLs
   23.73 +e2oJPwZB/eWXnfm8C18443Y04G02AK5Q+f+cajjX4FWk1Taf2k5wOU5oStJD3hpO
   23.74 +R3OU1I3Zl4We1Q8V3WeGAdBTEhyw9zVlC0Ex0/+viaN1Nd1I0fg0h4D44p6VYUuB
   23.75 +Mb5k8I1sAIUR3HQfjNeDkJ0NCC4Xo+nPp9Rwg/muGUhdccb4PUJWkep0ufPAwLM3
   23.76 +5Fou95bGt+98avz6b5u84Yn0MLJ3xynrBKPxiZCDqxZW+XaStEjTY9aJeV9tCKaf
   23.77 ++Otq7mAqki9dkrvIimPSPtN0Mh+AhYyVID3E6o+mhL9RFxcuZqbwd7bwKFZMYyIC
   23.78 +8TYvMgdk7W+ZqrQ8Vf4hJoXD2Nwy8HPdbrsGNGB9mXijcc8CncfKVGxaQswIeBem
   23.79 +Es9+EbXgl50gsVrUr6ReUDIztlagNRs+byb8OIkmj3iYVA1eTlS2z2/5voGDfL/w
   23.80 +O8gFtFhDy9x6+zg5rcFtxn+scZ5XGm0NQC7kEmUNG/tmRnCqNJS+BWevzyJnGUOf
   23.81 +zBd369q8Uo4sgckhouJZLezEFfOrMBnxiiak+9kxmYnLQTXoNXwBEQdy63j4fjpu
   23.82 +yI87GoBrC1YacoEQ/UCFfC24kAlykFgZGQiLr0ISDm2c5lBYv66gn8yqwzwDVgJ/
   23.83 +pw5VfeO4w1mNlvu0Oi4xYFt+GMj9ZayoDhhsxF/f73RL3GMJ8jWO0uXrLwb4rCNZ
   23.84 +1WruKfDMrak8CHMX98c5fgvOMZY5H9JbV3+tV4BAUaYMc/vOzP+t/y1MsXmUxL5H
   23.85 +pA9sMX8iXSh3TqRDn8uDklWeSmz//vclifp/XDCa7sJ5OiqktybyeS2IvlNojcGl
   23.86 +ZiUddeaQ+g8cNqCtek4tWrF/uHaE+DiPILyvdfFBHUErjrajrjJmk/SN68vQSBUU
   23.87 +LWeGjHgDT8CCgLlGD/HKNyXqQv9pT36jjkp2r3Gw38Ktquj82NCykQTikXuaKB4J
   23.88 +c7cj8GY39Ra3yWUZyc59qY/AWRhFgfQF4hGlSzRZe6c6koxKc8H1UzhQqLcS2X11
   23.89 +Slt6vJ4wur/HY47Pym0ohs54aPWW9Zjhq6pyrkfMtnHvE4EzVURr+f66WLBZhkh2
   23.90 +UhQ8atuEWY4izwchOk8JXLBCXIdEvSg50NzULbUi4m4PMCiyNRcunYIFuHAKEfVP
   23.91 +dphx4NLiuZty23n53tjZCciSW5WXIwGfYD4m8OivytzWlM+KMXx7DYA+itu2KZ8D
   23.92 +ztCOLZ5k/iyA/Rj75+O+1RqW2Rv7rV+V0UzP3tD48viZjLldQrS0HE7o14AWmgGx
   23.93 +1NNm3i37P6T3XedNQGJbyqt1te+fcAAjsevFIuOZWHqCixQunwdUQWm1DrOlpUhv
   23.94 +utJolSzf6bMbNOTeCWZXWJsGR6NIPiZ59wu5EwN/yuqN8JCKznPyqCAn+V+GY1cO
   23.95 +cq5/8PvDPQEluJUKc81h1nBCMgS1+pjHNgn9KZFWwRi7SsQ2P6ZcsrfCuOwbyl6T
   23.96 +48Ru6dbNJNSW2vHJB/dwiBpiAs7T4kUEW4lg7xR91bB1WEjaAytW/K8NhKsEtGx3
   23.97 +avboIJYl2vCWXPVRPbPReg2tNOD0YaCqd8RUnfgPa3Usj0NAn6F8QmkqQlG6I/0Y
   23.98 +RDCLmRwCWhfV7WduqX54OWxoXpV8ODaLyo4mhgYakMi3tj6BP06BZrLVii4N5vKb
   23.99 +zkjfdTTdxNRgA+zihyNK363WKjdjf9NsG4u/opuO8gMuq2KqY+ndx0Mqduhcn8P8
  23.100 +gLebu9Z5Dx8rsmSS34MbJN2hgWP0BPpXlZ19sgmYp6dylh8Q+oJD7raOIKGB6G8E
  23.101 +t44WmCuPO1IsTrTg6/sh3d+JBC51ttqcAexiYvP7AcfDTZQ/sBEfYMdlzWez1xH2
  23.102 +t1p1D1+4LKOOa/At4VbDO0Qs2xAWDvR1Amk+JQzoVrmZvVTLkaamiiHWp1jBewgu
  23.103 +L9XaRdbL8Wv6Cs6n0+NIcidRtPyL4Zx8kmrBRcn26WlXmqZgvomTxliUhH4O8+e7
  23.104 +Em0CGr+ljsUkXFvGgS0kShroqmazKVocGTOx1StHMC9cz+3rsRp5UriZUrC6I3ui
  23.105 +hU3eQBkUd47Lnuk3W+/7YIfYjfMtOcQRd67cThuPJoaA3MHpwWiZHc14DHxiAiB2
  23.106 +XIclsaoZT5TP/GVgJJLaFWfYGgxFAtmNVfwQu/YasD6fSKNOHA5141dBma3vMCKO
  23.107 +GRDNytgZlnteUqyg7VlYKxtoVbswx1O/5VacUvEzXzwUu1YO+J8L2/592/77ZKKc
  23.108 +pNREv9SKQho+N4ODmlYxmMPoB+T5COlhw5NWgR4ECG8PeLj3To3lZ1zJYRfAk90B
  23.109 +f/d+UyPYqCfhvnzBYSUMOSFjjaQPcj2r1A3W+XY/39Fr7YixTwOQ9x7AeE2sN9gS
  23.110 +pBtCVHN5vChZXcqmBmUqJwOPJZtTzKV8ydivX8kidOISnan4B8Veeg1irWL6BcsO
  23.111 +7VcBobaHZBazbNQeigMrGm/Hkb+0qgDYqPui4Sf5Q69OwitK35xEcIytTFtrS1wk
  23.112 +VXB9ruiZWSQnXOwyOAG7ePW/Mk6AlYjqE+9xnAc+jL5k0/b14bTw9CK0Ji6FXgkH
  23.113 +JUcf5CVsSnO/Lat2p+2wbO9Np5RPqWmMu/avBBma7C1e5MaM5BmxXA9NRz20X1Ub
  23.114 +/vXXKk6FmlVrGH8pqY5WBktvjiWGSETWDeC16f4UN/wwrH3hnvh84sx0piQQJe9w
  23.115 +sKp4GnRi+e944hoSgeZTqkuAg2iCm6lSEnpFBMVK1WrDfC2A9zUfDPBQIN6+Sl6q
  23.116 +k6HWjwns3h0KjvOvK36y0WUyr9a9owb7l0I8z0hpSkd10lPOormJ9czzL3H8T8pH
  23.117 +qtbUGzMsUB/sHHcO1p9Niv6VUGWA32T4qLTtbFZhTznn9R4GSx10TPt3zWIh1GB5
  23.118 +EKGTkwbSBas4wYra1MQWqxG4ZmzTLajlhTYcDgkzSJRS537c9mdMHVUa2Cvhp7Rf
  23.119 +jYuS7ywEB9W+28EYfXR2A6EjoJSl4cgpZuSfAPmiUyY3Kuq4hXlOngR+Twymgs4t
  23.120 +ZjIRXnnjOQpFvuO79y6MA/QaydhSlmmPnlop5ogE8cVvIwPzUko2Gfk2PmlYZ9Uy
  23.121 +uvGN81RSsZ6Ahpzw3N2knm+1a5rwAIUVRNH/qcJiqbq7VF1hs8wFO5h7QWgO16+S
  23.122 +N8gJw2XvCP7zqOdqwJ8oz1Kqbgz/YPg9uaPJPmBoaJy9yDePFmmVKc+DBf323rej
  23.123 ++mKX5nUtEjFDFT/2PnjSkxxjtdsFG+DPufU9y8JeZMpx0wILIPPBY6kA8+zTRcWe
  23.124 +rS1zFJByc8UCLHVuQO1ac7o9BwM6T1JGh5crHx3/0m0R/Ss5i7DpUKMTJUdjDGyq
  23.125 +FPDLme91VDfubANZFgK+2OSIz1Pskc6AOK0mQaZTNW8jHU3f73IY5KeNa9qFUEEa
  23.126 +dpWmd63xkqagskvVWqGPadKW9zQ0XdILkBLNg/LS0k8DZIm8xPjYBhmgMOzo1Pnb
  23.127 +vMfaRCuxvjEg6SU3RagCCfjbvE4OkWERNgrCYDVAvCHZmpoqU8e3sS7Ww06d2lte
  23.128 +5CagdkoS5ltEy8ZGwe46DDL29NJ3a+IYOzLyHTG44Yl4Af6gXqtOblnFAkMGJAEG
  23.129 +fj98A8jBIgKhEG9iu5lZ8nzg+2JP2QPct5q7iBr4WcdxPZecJuhqwhLFafxjvsJM
  23.130 +2CIehfeQaN1GC3Z+5gwlJpTKzwplg4bUsAPOROw/mIqdZY8Mh5yqThkKkEw/vBjh
  23.131 +uQeOCxhvNsIQCwrS7yVXkNfJgbtgGPnHUzNFm9cVtO8KOWseX8+j6bK2oaxfgPpg
  23.132 +rc0sqHu/6GYf/fFoFPBqN+4qzVo99rsf+ImjA1Yq/3sgCEd/oc3nppktnMZPpXxQ
  23.133 +h10/omYpFL2eXm1uaNliMJUY0EikUavn9ybft4DrVORs0wZFNSLUKTAjDwQIj8VR
  23.134 +a+Xr3RIQTxc+7TikDH3DBItgl5UIzo4EhjMGC5wOItZwav8JMJSIAam+i805p+yL
  23.135 +73p+sbsURxva0ghfmc+mJjKEQ/BHCy2Y7/YSEas05LZ7AYgI2nAxvWLlSkMt1hj0
  23.136 +g7m9kSakK2UxqOkWlrIZYCkilMfK76WG2oMW+KgQ81p3k3xys3tkix0+bA7PKWHL
  23.137 +cprj3YyyIezyrSkOGDwmS7+3sF6bRFmQ7AC2+MvrYfmudQrKnqNFoelBEMYPTbXs
  23.138 +JDq6PAbErYRGKGicAG2rRanOruN1xddqqF/GLYWNLQiM9o/DDXqrUVKVxTaGzlW7
  23.139 +MOkzVOt6xg+wCNhJpzpsEKTBBl3LPYgK7XVaOvvN4KozaFtdtgaqr/oVVdryHxyG
  23.140 +zWDeElhDlJWPjnRe/Y3InDuK8ciEhNWKd1Ta6+EL4c9MAy7UgMVkauM9icWmji7P
  23.141 +U4fSYQYtZ8FiolvOxVHK2JNgPzNN/Z1D4FzgcBa4zrSn+pkz0DbwXACMlP9ywEXF
  23.142 +pT5DNM/fESkgMvPBRSbjvcXsmblZkNKN3bSttoFMClKSIMrtA7sJuH1mM/fwlXQ0
  23.143 +IJMjEzpfOGGm79KfmRpMSY5eIDxeJQNubCh7J+m3d7PoQ0jVQtiWYDyonG9pMrRs
  23.144 +SthsPAMbbcuDOSAMUcCb1qZCnialMCHAMqemsXM8N4XJ9tbxb5tT/7KusmwD4dfN
  23.145 +tcD9dFTTeGV9tLFviGj+9mOo/60+ANN2DMvxbGoPnFBoSjJe4vvOyBFENvT8yrcO
  23.146 +r/TS57YnOhmSOUB15e0RMEyoUtbZ1ZI6rNGINdqyZCjCMv3olDXDiEp4fZwPD/aO
  23.147 +5XJ52e7UWIWeixtrr4OjG61FTxamzHMbrEYNcA5YsNTmV7IhVb43NblYme/D4j+T
  23.148 +ZoZPqb9OImuvGqIUxrXaqWO5NPVimrUVv74iQuSXGwvbKnbovMbqs4yiOaQK5fpQ
  23.149 +nVW22fJ6x48Ie7XhawyBbnxRUS8E6pvXx/PWxxeYkMq1nhZqjlfqXGfKyz9mI/yL
  23.150 +GS7/9Nt/o1Etau2hXEoWNE+zL+Z4emZPlTCa5zyRYvUfeMfmIEomMtX9DP0JHVtX
  23.151 ++405C1YjngBqO26xyxmmb5+trGExHiDuw76SiwtIyRAq461nIqx7WrP0FS0eJgHK
  23.152 +o38bZK+VkxCWz+sRe8dYP38hLjQ2h4p3T8pnxjZjE+kzmQCvWI7Y5DHQ+/zCNMWw
  23.153 +KbYLo/hr/RNayMiNI7UoAXmY2gNnTARLq1/qzdojoQMNGiIBOpH74QCFJQLFYHjN
  23.154 +xFXeovaFD2AlihgmT+PxLipuxg2D9azSfCmiMRjv+vHvGUS/86dh/lhZINJ/4fJi
  23.155 +MuxAbffbmiVTdxB6s9FJLHappjetiy9Gsy3XmCmCptLor6fL5sEEdn80Z3rzQCIN
  23.156 +0BHXzmkCv/zzm9y7my0XJN82bSLzb+t+wHPJNWgHapKa6tJFLZjJeVyphdsmmo59
  23.157 +wSDZ2hNq5KA3LjFzuOpCc1kqCGrkIy7GtS+DGOq8Zf0TLO+pPRJ57Q1J3ZVxQC1V
  23.158 +8wuQ8sxgROfgxHjfevnCNsQS5IyDRpVUjYY5NO2uPP/jVu86+1TwQOryiSl3Wq1B
  23.159 +Ssb0a1SmK3gvhJovmw5eODzH75NVnDjgbkR3Ckc8li1tr54A/QjA1LuzKYGkERuH
  23.160 +BGHIIKzswJtFYHcif2A4qnUSosCXNmCFIx8TW4DdX+m8GJgjcYL/z9zg4/m9A3Xq
  23.161 +cUBhPzBPrWGs5DFPPMTw3vM8qkGLDczgTRcgArM8VMmFJyF9cAHN1N+Qd1mewHfU
  23.162 +3alaw2ntzGj2V2MYR/mIq2nA+MgYf4pif0KFH2t9npRYOevNgRWSvokXwzQtFvO5
  23.163 +sK8O5lmPUzw1CCteqviBRxjG9ptWfzADo0F+FeH1YqAk9vIfTBXP7tiLO/Gy6aPg
  23.164 +dmUdn2KH/4sRlrh5PrGZYKhZf7O2fYu1376fJA5wR8hV6nHcE53XteO5Pnpx6hZP
  23.165 +PU9D3+39QTaLTwsgOBfIr+7hWHGrx8nqBjS51YPajdBObbakkb8Fq/OgzuXq67Bn
  23.166 +kq1nCCn/mOy/3bYHVJQLElyKR9KqrPfD68QdQ6lcz/RjQsT0KTEI1HzYChNP3BV8
  23.167 +7ZfqnXSt0L0Fbqc6jTWfkFgcjHx7jxAexYFWAWAYmgsjnIOfEx6uzB9vZUOaCXWI
  23.168 +k8uQ8RUJsSIbObHkFExVRyPgW42OAHaLoangl2fq139r3fC/5UBAnxTcon/70ncs
  23.169 +mmDQTMrxXbmWKfrJxYAtP/1pgjJhv+DqIYyw3ZOyeVAVbMIy9z2IHwsa2zCumj8i
  23.170 +P+1aZUYgxMAbhCWdgR1uVQhJMm1zqtHQmk+ESYzm0/gvjDBHNjDcj4OH5qFZVyDq
  23.171 +Am1q+Mj+82kq7jgnzjrpldocrsMrL2EcZa/qBS7xlq1VIw/mnxAp3eWJCPn/Q/7W
  23.172 +/FDY4IVZ4nuWeqhfQZ4lO9kHHqWZfc7MS5milMiIayAXVoxibJfXGI05ZwA/W+FC
  23.173 +f3K/qYKzJp9PI8GZgLAVX6NavFNWFvgJlOTY//z07Y+bWDHXmNCzqLKkMWMrgb6E
  23.174 +0Nx+1Q8NAZ4XpXtVvdEwYLoBV/djTjMIg7SaKIPZg/r6FHd7BWmOhU/fCxjFi9lo
  23.175 +Ty/QJ/eRIm7fSkPppeiOeM52T6xedCFOWmAph8H6rzIfSZpbiocgbQYtlfTjIpll
  23.176 +Sas6+NgInk1U+ouQTn4Jkl9B31aqeKrzZ+NQvPc6WZ6SHdKFmaHEcmZSlQ6oEh+C
  23.177 +9HtBtwJvZz1+0sEhGINVgDvNq2B45+xT/5b9P6HomUP5P4KnJz4qIBHbwC6hw4ca
  23.178 +sCN3L/h5dyH9x2IH9AUXHBOLyhxPQmY8fUS8JOc/PZ3f79CSyNgbnWhPQcL9KWIF
  23.179 +dKEQ3LttAq3UF+0b9qfDj0eP9qtbfZpSPOfbMQwt+BddknGkdgUmnHCgc3y2ZqO3
  23.180 +axDawwwdoTS7bc1k9ToRMd4Tbxho19U/bBWJ/HTgyyQfpsoq39vGDRMFYKWFoFuO
  23.181 +kFsPiNdqlVV79kpg86PNEA0Z1xknYfugEkYsjLkGIbiWL+L2G85pbUCXb+Tuc4bW
  23.182 +vszwvWXpQ6VBXSWqWL5LaNXKXpG3k8j4fke/ILIB0SZBIBtTG0e2iEA1/TMMsqFK
  23.183 +T4W7jY0k/5avfl38EK0AnuCfoRNvs68avGA/mX1mu8flvir78Rakbiwb8Ws+RFvZ
  23.184 +CBSk7vxQjbvWx8pBgk2mZ+4vrY5FTuQ9F9J42Q5sP9ecmgTPiXVYCg9cbnVXLFVD
  23.185 +f+LC7mbpwIe0BJGrCEpaGQxWeUsnpFR8817pv1zArtXI9EtazVlxXqklwcWiVua0
  23.186 +EXUwsdJkCQhLMXHE/8MhidHrSNARWJTcSgCMzMDXDVIRvfcvZKLwttBNHHJ2kcbr
  23.187 +ekJf1GQpRAXLI1PneLK7VkZ7GJCjxTishNUhgGuLRrstT5V/2iWyYA7ZBvvynDsh
  23.188 +32wr2v+a+Ipa5DlZG2XAXOecKUZuQyZt9o4sHwp1GTlO/7POYcqr9CwXKO2S1rfD
  23.189 +s2939dcoOGrEZJ5aA8V9r1e26HPSw3UEM/IGCtDG/qw4mDPm+yDBM8DC4BYK7Mne
  23.190 +s7lkbfNvG2PSkM7Cmvc+T58gZKAYoV54ELflXD8gEjGf0U14/dgAM0kY05clNCqT
  23.191 +BN2St96MtXfio9fQrlRq9z1gj5igTmtlxwc+sx5PrPVzug9v2S9Du7/JpddelWQO
  23.192 +G5S9vkcCmtFUnyCtzOHhjquxEsD889h3WydyNOgu5yrolP+cgtJ3U/iOH07Q+9Hb
  23.193 +snbnRsjjkiq/ztj6e40SMSfLB0L0+1Ozv1yAaiHk+Wl/8D0D0iBZ4ba2vr6wxLgC
  23.194 +WPUAb0vR0UgaH3+gAhex8xvWDNlW+yeHmMNyB+5B2jokjx5/u1ll39/YUqPZF5jS
  23.195 +vBHnzBrTv3kXXZ0NsjuhcbbUv/6N/8SSkTOJO40dvLUOIBdyz23XCV8lc9xDENqW
  23.196 +yo+Sek77WTiX/cGn4WXC3tO7UFihaf5xonEI4h7tVmGIFodYKBKqfdwNp0i8dpg/
  23.197 +YO7XD5jPKAuseawvYVyoJ7RJKFwqXfrGDFJ3LI8COanxOkYb486ONP24oAptofif
  23.198 +2yiRXIl8OmpQNRDlcNsPajkX2lpU8nwF/ggIFpgu7kNFYX6C2WUicCdr5s5LrHLw
  23.199 +n/KCtzW4KfbGY/7M6LUf4o9C31aoIgRkl+BBg/vOVW9vWSPtWsQqJN54nCDT8xbL
  23.200 +XHFphlMdDI8NkflTWmT/7+njS/Jk1ewXyh2qJ4+gDFsYGC/+qrVYlrQ71tKe26pL
  23.201 +vOAAiPAjfElWroxPccbFKd+2dI2lH89J01IVIDWKKOXJr4PZxoTjP99BWV4boE1h
  23.202 +l4h/ehCSM6crChC+nUUveit9Aj+W82zoK0Aqzz9PBWwPJnnWVEiXQa6R3PBJy6wn
  23.203 ++bXUK+w+19iGZ+wEb5oQqP/IagLfLgmnW6R+PR7FXsxMY0+4yAtyZdofVa9qNo9F
  23.204 +t2J/id/Vz0+gzulFxZIxpj4fDD5lBVSYBNExVDYL8izsr7JR0pnZ7xTHGAvmQrff
  23.205 +u7MDo0rfW4gpVtAowgZpTzqvAhXyUQaGheO39VkzY25LtlqMlWvRCPEgyTyFDBCi
  23.206 +M+GEYocFsbVqSdZhgZ3hF0v0PTdOERjvdRb6hDsUdoSwwM6vdKjN3t+f//beitcp
  23.207 +El1mMyWkrdety4by1Hnw+0Yu8e/mC7aVfowOoM1IVVi6uVO1iv7zjBuS29w40Yvt
  23.208 +so0RixGBRBV3B3foEUEC0ht5piFP0c7qplyW6OaUH0zdFkilN1hR2LWo753CFjn1
  23.209 +vPfOGebQVJXjrPcsPHnBf/tcdZSqL3E1XYLsk+h1uIrmV771s2rZ7ToWL9bnKV7u
  23.210 +Ptyx/AtPv8YJ8AbI2W09Aan0TPjhOfYm34w9XSA6GiF2i2OsQpjy71yI5wzjtEY5
  23.211 ++IkDxtVdJq+/+heoSehJHnRtlgM5fToe/HAA75cqR/qzSXiJClTDfe2bi6g7WkIu
  23.212 +n2Mb2ycrJ8/wajOdpqZgqcmxXPur/YHgfqYQ8bKT4YHpOCMgaGEDp4xmt0VRlrlG
  23.213 +GNZuohYOtezowCgOB7w+5B1xKxLid2KGj6Q4P7Hf/tpuIOBMD85JgfixlB/8gmY+
  23.214 +szUwlyzvwoZIQDUIFnlXJF2UwB5azbfgiGGzOTtwu9Zh4OnL5s7L3cfhavaG5KJu
  23.215 +HCI3eMmVdHW5L1sPUjtHKE/4vfjpmv1wz3FjGd6ZuaUxt6wfP8aLbjA/YFZFw/GZ
  23.216 +mG4j2aMgee+WJ0fpYloQKSzK5hOBXoXm1VAJjKjN5eVUk0HMRheZb9Du0gl/Dh6x
  23.217 +BCNlKc0JfSCN4BNgYgkEUE0hyqK83d5UR4un4+G14fifsAj1KufubWpCSQxFcfuE
  23.218 +rlbxPAjTgiIua6g+lZc3yKOzyqTiiuBzCVmlxTBznd2aqvRSpUVEtc7m+0Fiu0D8
  23.219 ++bqQBCb1pkOqFVfljXHPHpls6yoMie12HA78sVhcpbWrUAEtu/YjU2Ot0ItfIPYN
  23.220 +kRldgq5W8z4fLxGMk9GLGUW72GCFaLxYlwV5ezSL8rvVUZF3NDwSTMChAL4jKDVB
  23.221 +AO6dyKOUne+rrq/MVmW4Z9V4N91PqM4adKcw6uWIcV6EXzk1MSZK76nrWpUD4+2Y
  23.222 +6avMHTMlbR5sTGsoxf+xAUFHczucMuqJHy1z0TV5MdOGqhlVeDD/Sj+bX8qhXGlY
  23.223 +e514ooiyxwTngIFldt6dGsiLmArV4I++NL9PnOX5je+LHLaJqjpmDOM1BedN7PRd
  23.224 +xf13WLg9BpWKVZDYHn77yrMdnZm/Ci0Op7hPtJ3iIEQS0la9nUOm5vo8ZQGxFY65
  23.225 +rBsY0ffKiVts18fkWdMy/+MDzR/zq5QWdqiJ8WVUCr5VMYMQrIpKlou6mdg+YwRY
  23.226 +xr9ETQgVHxPK+zsblHGneCN5DP8dKug8r9CLZymQLvsxYwEujFVpME/h/AYDR7nX
  23.227 +EGmuA0fXbpc4WXqOrru3TGd5lqsQE0BAmhoB0YCoHlmZpcLkQIzRoh7f/sqmz9TE
  23.228 +EajX5+fyx7o7iKRiggy2qZQr3ALJnqbKnJzmzzZy0N7nq2fOwIIvnnhmG3MDYHYe
  23.229 +eMcwmPeU5RmVv+BiZbsatohicGBfDZVTNAfLomCxbQH0knuwANu7aBWAW+HqpqLC
  23.230 +yH/tCF8IFxKi3vHFNcOfvF48GT4GaY8zsvOEuqmf0sBsrtd8KbW6m4H8jDQP6Kr8
  23.231 +GaCtvRnl2BcDxvhL0N2AWvw121jLegpejJ3Zj5dvDOO+4PXiTRJC0Jm380z8RR8/
  23.232 +lMPA5J64mb4EvFfKExEGzRv9py2OHPQDAmZsffZbrsIbsfEnPL7xnsjPa7E4zp6B
  23.233 +qizoxB1FEX8XMXWdYQpfcxLTOZmctFjUWE5aYjLpXAJAdyK7fEzc+Rp2HgATqBAD
  23.234 +Q3CKkM5OB4sV44XI3TbZzTnMANdsABRnkwcwWLBB5FOlEA0dEe/ROiSPga4XM9sU
  23.235 +9q8DB+CqgH72c5MUhn12A5krF22qRoPeJb2f9j+nmM1r9Jy71gl1OIZoHg/HKsH2
  23.236 +uL1sWdLmMcb8ymTrKtoL68ZNJEeyeN826UW4mX78kZviNgL2D4XgA89cwQPL6weR
  23.237 +fNfS/iXfUuPGF8YGCPr2PVeacMzN/Nw7p5mzrLZee7IlZztLVmHmbCOPtXQJAhIJ
  23.238 +3oleptcmgqCMH83XHlwcwcYxbG5H9EzY6D9qWh9lX/C+FcS4VrYJbZptoOFD223h
  23.239 +lpA+n2699ILGAvsYM6Lz9MI2gC5HErQLxyqok2tR1JVXUJB5rzldHItStCQmvwyJ
  23.240 +m4JzeIqeB8DUXdI7ggJ/BvxCKkmNRDYs7E+HFsAeuGRd06B4M0/P8wU3KzVfC32Q
  23.241 +oFz9IP9hFOGlK/Uno/7O7FQOPGEPpscjj+s0BfgnsDi2Ko01HdYhcXwKgrfMAVBj
  23.242 +RBOQKoK2xsOyy1GhzK5rJAbX8yiNKblvST1L/dOZi7hUsBLXJ8mN4/DFTtsbcDBA
  23.243 +gij0cW8RpivSpGR7gSfrm7eaSXF76xijGq/YWhUzfls3RY2ZV1icm16gI6cwYu6T
  23.244 +zVVAgaKj69XBEzRwG4m23P64Dt/FNxcFgwtVKI2fu8AXSTPHhlpi/k+zY5/d2A4E
  23.245 +nkAEX6EgWOMlKtacvYskA1p9wqIG/WwLhMW6FpX9Z0DibClhSGL7HpjG+4fZ68ZO
  23.246 +lQYhlMpN1/njtv0rmMQs24lOl7ct6qBVZUs4ySzlnpS3uq0IIurEHngCWtyiHdbz
  23.247 +WOZeU7C7Wes05gKnmkU9SdVNm27UI8p7LEhNxRJKaqbMKT+R9FVM1i23q55R/bMU
  23.248 +QhGGD3Wqi5KJHKfpOg6axnlZTErOP23vhDlA0YMTsuN6yTQ//3KV8t5yJdNvvYCi
  23.249 +MlqLpx8HUSHfzB6FUaK98j7UuGxurolnYz0Tds8fTMoCgNPyJuLVy59orn3O3WIb
  23.250 +X56ymWb02hk+ncwdLp1aCW+3piuGOzNHibBy9wtHU7PWE0EjqFwbM47z7/Dt+m9A
  23.251 +j6vSlUvFUVzol2yoy1o1Bgq/wBmHDwz1BajWeVI2GF9q+kFOOzsRH1ARpE5sk7Xt
  23.252 +d4nWZ60LqSulVfs1d9zhMCRIsCj40sOueiRd5DvTzKMPcbbzsiKkGA3uqH7tAfrP
  23.253 +eEQHZyM4ROGfL0+i9LiPlqJjGltLLtJvThRJAJmvW9y5WxrkcZRGH7eEygLXhEjb
  23.254 +WtAymb838VtMXNL7L+mt8PhVveaSdqtEeBEebG5wiHIeAQYIzqiU6cIiphRrERiF
  23.255 +ryOJy2RA+s5cFhKH02q/nAWc9s/pN0DLZktsMdJIG1VqpAX0DU00nWOuT032WiGP
  23.256 +VWuGBMy5A7LjhnvdL+gg+6Iu2BMFIU/9xoZjzBWX8rO3Muh3zZxxhSijUqBql8cN
  23.257 +5CY70PORPMMG/O2/X9kRCWMmXgdV4RpelesvmyMl8R9+fktVplOJvQMYm4sJshLJ
  23.258 +448CdgtiUbbGfbxrC0/KjYGAu+Z8ZyxwBio71o362QDSL7vLyieUPBqTUM+Z8xwV
  23.259 +mfuMWYLgSJa7I8vJVz7k0hLvX45uf2RbWJwm7blVhiG7T5Yc6V7UmoH8VoqyqH3q
  23.260 +PlAY9FS2r1iwX2ibdZEZfwUEdlYnndo+SLAcIK6ptuH7vpWqk5RtE8+vraE00Yt9
  23.261 +0cRzBr/VlWMGsmcJfAWqNDnKankVy8+U1MScOSioQk/zAKqyQhLrotPuTnHoXhhV
  23.262 +AZqi7mTNwJCjLSKn/V/MR+ArNSGSaAniikrDsT7P2ZScodncXt282Rv1JysnH3nh
  23.263 +eoey64scwfmNlB09+1o+OoVBb6IXeqq61wwWei+Xk7MBfSCtE93CUSRx1O3jCCpK
  23.264 +eBbV9Kg1lZef5R1HnvqDJuAXXyjdDkTuxhItM/shp5vx0/NTUSuAAVJnHY+v0s7/
  23.265 +u3R40fbxo6FXcYd2DWttR2XRioKosTQAXiJoXCHvY55yBq3s48dVsdlSu06eN1LF
  23.266 +5c7RGNDTBdecdSq/ysjt+p1y1nntQsSrrqiUzHBC8wBCxYOo2EQkSaCkDbqnDjnL
  23.267 +BEeLrd/nM8Z6ur2aNdi/U7p6/aZBDNXi+vQ5r7DFS97Re0RHllNSJQ+ZzYZuQaOC
  23.268 +EQfzds/ZtlgJg0v27lZjz7IJww3DRrSZNS/m0CriwLsiOzJBPvCjXLHJ0EPPGUXs
  23.269 +ol8Jl7/enzDCZxDegpTmoIUreqsv1mDW7oe8Njq5xCoH6G2hwWYAO6t8KEFMBtxh
  23.270 +IT/GkujLfxPOaXxbozYtZDRRfwnX1fMiidgonqXRwwN58vggVl2HdEKn5C+S0uHZ
  23.271 +DRfFjQ5gMmBMYv8tgRyhPCxAKh4i1jujCE+JhgHBnyOz+J9esP8p10hlEwxfcMbw
  23.272 +HnFSDTSH6TgIfeAjSXrHR3EzCakHhcDxUpNwNlzO9HVBzCXO1SJV8HPSuKrUv5xQ
  23.273 +Y4lJCaFDtwXPuUuocoUZKmOM2xg3Ws4KHGIAVhnv99i80zT2McgZNN8IGoMr+PS3
  23.274 +UcyRr3UFNQ/tjFCEAs7FNX6u9rXktjlb1+mCzZ7xD1yUSxSFygrQwsaRGw4rPm0J
  23.275 +Zq58Z2sotil+J0jwe84MqqB6CmqiSv3fd+eVJByuS4u2yjER0yuGjkwrqRk4enbY
  23.276 +EYGAGTMu8k15QMTqYeqiP1oZ2cgZFHOp739pVIYJUww8ZiNgB2kbkGqwlrPGx7Po
  23.277 +chLNH1qV84r2W82heqUizE4uOFo2CDKfxQBRXbwsKWn7VbEHJk3fPoKv9wjk/KDW
  23.278 +ClgtXUMIxoKDcPfT6edrm/ug8fhq715U2OldiBy56CEztHSvfiZF7rAWQ+TvIOmz
  23.279 +mgcf97Mp0lOgNOUdWlm2hsBWGRJt7wyw+WG+j/aMDMBw1Yc+M8Vip94IDkXvSWme
  23.280 +LGijMH133jH+GO2rv5UnmhvyKJ0R2wEyA5U+Nmc38oleppgoqUqeUS32inLkOSMm
  23.281 +Zts/AqogZvDT7LQ4IUA5spd9smE9ySkFdHcmY8NNN2L9kbUGaqW6h3DP
  23.282 +=7Muw
  23.283 +-----END PGP MESSAGE-----
  23.284 +
  23.285 +--238e1f2946e87ccd3d1b58ba507ed7ab--
    24.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    24.2 +++ b/test/test_mails/check_reset_grouped_own_recv.eml	Thu Jan 16 12:40:10 2020 +0100
    24.3 @@ -0,0 +1,333 @@
    24.4 +Message-ID: <pEp.Q41S1E.0VSNARBCWXG4O.8E4D577C-8B8A-400C-8E0E-0111378F4F0D@pep-project.org>
    24.5 +From: Alice in Wonderland <pep.test.alice@pep-project.org>
    24.6 +To: Alice in Wonderland <pep.test.alice@pep-project.org>
    24.7 +Subject: =?utf-8?Q?p=E2=89=A1p?=
    24.8 +X-pEp-Version: 2.1
    24.9 +MIME-Version: 1.0
   24.10 +Content-Type: multipart/encrypted; boundary="238e1f2946e87ccd3d1b58ba507ed7ab"; 
   24.11 + protocol="application/pgp-encrypted"
   24.12 +
   24.13 +--238e1f2946e87ccd3d1b58ba507ed7ab
   24.14 +Content-Type: application/pgp-encrypted
   24.15 +
   24.16 +Version: 1
   24.17 +--238e1f2946e87ccd3d1b58ba507ed7ab
   24.18 +Content-Type: application/octet-stream
   24.19 +Content-Transfer-Encoding: 7bit
   24.20 +Content-Disposition: inline; filename="msg.asc"
   24.21 +
   24.22 +-----BEGIN PGP MESSAGE-----
   24.23 +
   24.24 +wcBMA1oCBdlzCD9NAQgAr5yjbAyJzbmlcOKmZVzzmcGsoj+2ZOwYZZVQm1FW0DdJ
   24.25 +ijE7Sf5Gnha9jWlApw6Oy7UwyMd0Ed897BNygbaFtqnHvW1HEWqbuJq2SbsFEuOM
   24.26 +L085swJEepAs8IMI1qXPq8PjKbG0tCGQPFPvvQVNW+mFEh89XNLdkcxsWPpYBD5u
   24.27 +uK3ZrrOkv6vR6+qpPwkTLWVw/F6aOGNQpxyvaCUJBC9DsppRj4+WeMGx9Xo6Vi8Z
   24.28 +hTnyAQMEm4n+iRE9bErUEUXozMLnb0ECf8Eq/U4ptHF64eRCUr4RBliBJ4PWZYLD
   24.29 +QdRfB1bCq1scgupfco+hULwNprlgB/OCON/Xl6ZiRMHATANaAgXZcwg/TQEH/3dx
   24.30 +WwfsGvXsYSZay3vA3OJcu510mzwTCtgBP08Sa3+t0k0j2MLmGbbTHIV0bkb5yvWO
   24.31 +2KkaVrHzood3PJIzN8aSPdVYCgTXrITGb/ifTSjSqPwoKlOsd3pAg7fCf+1Ce8n6
   24.32 +gDuhHacxmKgxa7TMnuLF3j2QVWObOfePxCMBJe3/GS7COK2u7nHQZVJzFTFlA6XP
   24.33 +Exj9vDuEWYndLQPqagiyhy6zpD3O3mQkCvxuqGX9PTXOdAeYKOFFLvO2IFEJPeb2
   24.34 +yl66xF75dvZYW1YhSabfrzdCPvhX2o/FDR0yw5sjC0y6WHQfpwr86xq/FkRpQmu2
   24.35 +V/b3eqoDadP0nocgWNLS/wAAN6cBlRNrDyEmGYn3Rv7XbfNQEmXKGrfBMv0BnJc0
   24.36 +9Ns6SX8th5C74NayMYqbKp2uMZs3juQBU8CLGGVrtAEcD/MkXq6tt5PByrOgCXsd
   24.37 +iOP1gHRtKW7QEob6/oDsGNwQRCQlx5ly570HDFDKPciHMzFaZs3BGjvDmq1TQj7o
   24.38 +FtQ57pP5UAY3Mqr2aNiTGQEBQVkadPgOWDDBTz7EE/wgKoRlyZYqaMCjJlOEgZOU
   24.39 +V9uM5tAXg3Cs7RUOwqacrsHXvlTEANyqiNCnlnQ3A75JCSKO+xScqkY4SU2yw/qq
   24.40 +VmL+c6uFgB/TEnt7FRzZn+T9wpreE6xEZX2zCoRTRXjadxaojAg0hZ1QOFEEWCfO
   24.41 +5ztXHrZGLHaeSJqK3dq4WC0RqU9Uhk4CvIGTRnABqcbjpCEjiXXvX1bc5/3937EM
   24.42 +g20Jjs0iLlKk5vIl01FU52GgGl0h4WQoD32nn3mV0i4HBNbWTQI08GOszaYNlZ8y
   24.43 +1lxdgDyHnb6LR0xWhd03E273F+Cj/P9eB55L0TD+wTYCvt9lmAfryWxNkH5rJzfc
   24.44 +BMV6O3/+iXzVuQLHRXqMLCsPnCY9dk6jI/+oPHRH4W6b/c6WOchUSqH2LOssqB6h
   24.45 +MeyKRblvktSVYFwMggP+kqzRYlQFsGE8kw98DCrmm7NpZlqsJRblJRdkwx30UsHz
   24.46 +f3/m37bPQ8h9+2bfLReYeEvGgpCtuq8nunR2y8En2LSpi+vaUgYwV9ObEcNQHjhl
   24.47 +OgTjpqMaGQcJxsopoUNY4Qa19Ar+rcEyuyMwKxNhCvAqLqGasG6IGignNw7d5s2n
   24.48 +SHqKdy1+rDKkZhWXRQNwGr0WWorvelWI/C8687o+on0BmdHIgaeZU+ebr33Fbh1h
   24.49 +QkdVD/S4w6oii1hMVePiK8N4m3zSiEX3ojWCVsXnSTLRvcJvn7J3Vnwg6t507/8I
   24.50 +Gks3jzu5dlTOBrOGi2O0qgqeiFC/Ygd1EwbZvumMsBxFMERHTI6xxgFwyGdSNZMV
   24.51 +nWsZTTG9ermYukW+6IeXPC7wKGOCs2W0kvFUoM1ybgAJs2haUWvnqXpN4fdyrTm4
   24.52 +WT4twdhdkR7Jl+WleSyBhkUajTuCRrUXJt+yAs8//1O4Ju//g/KL3XrfxewKn6M+
   24.53 +TO4+T0PPI6KF3uJzRM4GVWh7EPBSyMxh0UbgfCyzzChldy5mCePUb28noor1iUyc
   24.54 +XkZLYwg+4zFaXYTG4TFDMrVfKauhU4cM94lWGgVceNAUsVlMHbMSiorx64GvZtHe
   24.55 +RoMadrLJzdBkK1zFLfMSRar+Ucfe/WvLLHD+MR5jX9iNclF9sV/KDXxqgD5LN4hz
   24.56 +DdaGOtrHDcF03cZDlh9BvqYad3+JLTqZZR6eEYymps5RSzGQjjqpRLu8oLkAHV4V
   24.57 +31ihTC6OXSa6gffaHgGv8vNkMasPbint/QibjpKMSBqPIDOCUPvMi08HcdRYYNsI
   24.58 +qHYkc2zadOa73aOfotTr3hqS8WvqwONjz06CeGeXVRgZ0KV2pI1Vx5TM7PIPHBCY
   24.59 +r8A8qBRr3CxTikp+jr/ewgx6LCEwpskgJ665NBmLeVvh7O4zRMmVZMw5fEwSYOKI
   24.60 +YwdzBe+uA/o0cN8Cm68OQOLxFsUQrOACANxEuoMrIyyac5a/OSg5M+ElnovQvTQ1
   24.61 +nurYusO51Ohh6HA/jGy426tPF5Yw8CJgRSt6yXCCOlrf1iCV8z8ghJiK17o8YgoV
   24.62 +kwHORgMwJYvbsxF7NEqMDLNuMGksZduJRwIo1mkE1wNxYp2sm/GexhE2khpAn7YB
   24.63 +OZu/0aPHIMhHWj8S31rUUMXAc2Ki+GRfg7FGbogyqV+3FiC1RsfZgBujmnEgje+X
   24.64 +92iGWg1JcBD+IKoCop24yTx/eFszI1xvUxXGWoaUhujbPePMKz5+LHeFTtgHiRv3
   24.65 +0muaW8GXiWZH1THotWQ8piwCp6kZIftqmZrDSql6DNc6Dc+uQtiu71TQ+lP81fuU
   24.66 +mNx3Ku5XDl3tOscbIsavMO58AeyOmgPflDLxOt7iBzwsbGP07C5xhKvERHlvfkD5
   24.67 +XvVVrzPIFCWYM+0hPABp6CIKjXHw7VXdRH0EtbUgHP/mgJHqmiAJ2YJXjpZ6tOdj
   24.68 +dR/hYkiyspuyw3CL4fBsF9sAINk7085TH76ymBcAIs4wtQ1Ogolqu3AW3TtmCplP
   24.69 +zZoFRiE28bridboITqrkgljJwg9GTmSBYB+K2EJBvrotSx2m4aURr3hz4LUVWkYF
   24.70 +sQx6Feb1U+rf8PGXUUXn6NBHdYKprr5rAJp4JYlBaFm306b8QYmggmP//kfWzQrQ
   24.71 +fm3DzJ+QBh42bpW36LdZxZ0FH4nRQ3ySrMwITTJuc0+MQIOLUCVmRKFFmlspgvwt
   24.72 +QXBQgCyeHuLYU5yCJpPUDB3J3vtcHNUCrNvo7s2T2rND9rP4LdcwHurw/pQzj2rA
   24.73 +4JajmmFGvY+8+RvCv7IYc9ph/EJbd0et2XZqfw4+0PCcXZAiks/XZ/TS7V95yOwl
   24.74 +ec4ckILQNi0VWXJJ9KX/8lDPKs6KrKKmbpQabsTra+cGeGTrGxuXubBzYXV9vE1T
   24.75 +UnX29IBYpXdO3zYT/3TrPUeRKLPXTNDaJZCu6KMcF1QMapKTzrtSD9tEQmA2qjl0
   24.76 +zjAg1HYbb5mIQGHWHcfbXyepkDx+S4w7nwbX63Oj5An3JxH22eLHdc2aa4PS2IdX
   24.77 +FySYOEvEOF/uGSdVQIwsFAE7ltDqeWEuNUoK4dcsMSJphGVEW6xyhD/Xw07MgEx8
   24.78 +Od8T63P5kEfPeXlCd4g3DFgvqapExhAtyCBsDbqeDpXp5VSZn9y0xZV9aaqREC7w
   24.79 +ZfCx+q/NugM8gnwGooNZqxO7fHYBsqETZddMdkOHnQVA3D36vR7Uu554qKNh5zlA
   24.80 +8WKayhfVvBchDPCeeUnHrU9ikj0jHknsmqv4i9MzoYm1v83yzdsCcD9uIbd7fDXt
   24.81 +hglhsgx3OW+ZLtOLxb8vvMl8QiKo4NdnA7QK0C0XNb4Pj5KeJFewLXXGtaenQRZF
   24.82 +hIsZqZ9pR7QO0/L28SvLcs8QhAhay5NFPgu1gUiIf5RoeoGXBb67reLJVja3rwr6
   24.83 +f9Fh1yKDqvbYRnvcR7Ttdih/Ui12aoE8vmpAmeEzxBBXqdVtyKco2pL4Z39lj7x/
   24.84 +ffQEhX9w4eCRYSSnekZmFfRft1kxgVka98l2dATQ6QRaHzIWOuewZQ66HZI11OAw
   24.85 +zTAPmr+njatD2htASMy7N4vgmYNBkpYInEiwZgC2fO/jDaCgz034O4qjI2vjXlBy
   24.86 +r6+wQzdA8RzsfiqhVLKUKg63mSREgJohMVKp2z7+INC27LbIeeYAKwOFcqQRw3VJ
   24.87 +oqL4MeQm7Ros4I++dUJag6eY3GssJCAofj7ngLZPZ2i9gux66nNQ4teDxJvRsTO8
   24.88 +yy6sx1sXsu2qqzvlXo1zKhO3aFW+Hifph5g4+aCc90bzu4lZeS2eOgUhUOf+BffC
   24.89 +qyqqxL/5BClC06bQr0qaDhwOUNGQvFnx23StPI1YvPFhLYTIcLlronXcgQqkFevE
   24.90 +N3SXyydBVL/NJIGx8/3ntSfn3T6QZE1tP53WBPCjUV3lVSZibZsXQsUduIq9cg1c
   24.91 +mXFL3yhuM28VJ7zDk/timIOqX2QsQm46kBtMX+2YYZfIM1RSMMcGUFpk8KCOYn02
   24.92 +foPrSC1P7Yt98xubDh8k1RE8gnLl4jMoO1JOfd0jUC1reJ5X0WOuZSQb4SL232PF
   24.93 +WCQ3z046lFgadnPNGejEjOlWkFrv0vDhxIOcyvOTm3ZzjtKnFMizllnBv6ALaxrt
   24.94 +pX1fdBHRC/KQscIJerXJN1PX8fYpRSfpkxp51c5OHgKBLwNOngEvfVR+RuaeCpnP
   24.95 +PnPn5WUc7b2OzRfwc0PiZyGXNqGJnIxWoxJeGIkN0JHQG64DhNBfM/o3vX3+s+Mv
   24.96 +pS1tILWohWX+uBmB8lsf5oHGxEpxw5G9emqRMXMLd4yFDsWShrBYOv8Dpjx+hJED
   24.97 +iYck6jLpZxzmgJcYXS3FFniLpWfD76W+t3OYrvAWXmyb3c8wotVgwjWoU9V+fNNU
   24.98 +T2n6/QIwVkz6sP2ziaJYIM78ppi3T6dSjiJXYiNsJavZUnKpCeFjFb/9Mn85WH4M
   24.99 +mPX3Jndj6dKywyJQEklryj4L8ba/qShEkre+xCkSHdRvKB5lV+1vpHeAi1ww17pW
  24.100 +k5Hj3vEfC6ErKLmrFkV9PSd2fM8nrYKqalKPNpJJc2sFawXoyu8eai9qT+wKHwEA
  24.101 +5XeGIZpbhmmWipgUt24y8YtmFmAICuLCe+xW0OtYqLdW1dQxZZhRkFh2qSfTcnxD
  24.102 +s8RunpAs3UiZXsH9C8Sq4LoGQ6puTnelQvbAq7TLdArSdzdcuY5L/txGbLOV6RsO
  24.103 +iMVVAPLNcqWSUTugB9ObnWUzEB7QXohMevCoUxvGymX9pCgGYiT27eU2IOnfWxJC
  24.104 +kwUctQRE9qqNHGqH44AIgNDOgtnxNZrmn1UNI4H2trb/Rl9W1dwKQhigyhhiWVzs
  24.105 +0f8UTJLSosX06i5XJuoo+YNaFB/+0Dw8TxevMEEYxqwz9yRW2GMgGRBufjiukbIk
  24.106 +21FHA+orK5LzIxeRBQuZ3ArOFHLLNu+gSjk5KpTiLmDJLefAfnDCeLRPT151o43y
  24.107 +Ux1doFZEZ2gBv7oMO5SjI55jwpMULceYSLlWypTp2Y8ruN6XHbJlzX8Fcn3aVZH6
  24.108 +xKHA+55mV7HmiuPaLvxpAxD4sHHYCZehy+i4FvCYH/NafqEraNQLf9XJHUcRe7vm
  24.109 +b/bjfD72LIivoaL+qMt9CCJ2nqd29lCxoLIeOAeeaHcfFA3LK758JpXVVB45jPTd
  24.110 +IP5FCK5kBDdOgtHzQ8kSQ3eiLLj3vBt9DN9dDa8o1B4KU74+TEbz/MYN8Iu0vtiz
  24.111 +DCqjS0Hto2MHrO82kx1CokdJDbyMtdxUZprSroczCb3bL48+g3r1mhBieHOprNYt
  24.112 +Uctxw6fRknm2p5Gk7itP0C9COBF7fryK+W0A41ae1KDx9/sorVpOv5H3tXLahpTt
  24.113 +LtWE6fy8SnHz0YA99elBz7ytQ+bncfsuIxVfKQMUNFusxzY0DIor13bCDXLMa7ZY
  24.114 +07j/Tj2yykQjTt5thGcMagSsJ9mtVQncV7xEYK7co3n91ad7ZWizt7jLsYTr6GMo
  24.115 +HtLrdnaaocBWx/6d9jZmFpcBP4oW5xMVdHGqj2FkxZbL/4po8o73O3gF/dGdhKwm
  24.116 +yRkBrtdmAxwP+4uUHt4QwGwb3BL+uBwmVH1kfKap/d+gE0wolLDgaPspzqSJ1alx
  24.117 +zL86vgD2GxUYezEbOUfg2dgPQYdVd7d6aHZ4lPNKMprfQsmCizUbthUmd7X4Hw8w
  24.118 +cZ0s4OdYanWOYvRUUF/GGV9YaR7QRyAqwaNOSaMu3r8RWFbbLNcUfrudT/Hh76L4
  24.119 +dBn9usZN9HwxyQDJ8CKHrEx8E+p6FyneVTCoImZJXSev0gA3MeFsrH3mbG5VgYDO
  24.120 +Zvu8GcU8rcJrLlLTCASsOjfakIzxqiavNKBkFJNp99Fau6YozyV+y9BArZClANwe
  24.121 +7t4Jw1UbGYWGRbbO4FEvSfhWZGgCINg4ZuuwJPsd5rKtgnjFTQIh39neIqkA+gvU
  24.122 +oj6X4PLvvSxwC+rnxtVlHpJpAmQjff0lbEIpAAFxdLaAdEKRIwo+SNdv/9E0aC+L
  24.123 +menL6YqStWVwZQ4z1Pvq+N4eVS99+ov6Bw6SZFZdTy2mpQI4BA/9bWM9MXUCTlZM
  24.124 +7LJydDpeRO9XoyDDLsE14NlIyYRuGFXRniRb+Ua41/2lpm4FPPe8A2Fne7S3nOfx
  24.125 +mnstjtdvuIHjJflU7qi/ArSLbIBzUon4sfCnhzIZb7qv7EPiun4Y68uYhKwtyUfW
  24.126 +iPtdaNMM0O58GAox5mi3UY7svlS7QO2V//L4Q4IHpmSZ9DVubJIahBnSb2MqKPs+
  24.127 +X5JsrHcg/QRdzcOL/TBbCs+6OaTIjZFPhBCiKxKK3dumUOzpxmWdAr0yOb1xFyN2
  24.128 +7LVq6WnLRSZlkTFrNs8X8KYSQ9sDF36gA3YdDI/M5n7QjS2LzBKXSK3H9vNzSgu8
  24.129 +ej3laKefUAjPrypYemgrYad+026GrOj8NKwVtPdzkGEyQj1OVElqU2lE/1tWyW73
  24.130 +XhQc69uya27VVP3+bOaT5xhvnStYH4K9hEecIa5GvGmbSaw7+kjABsfkZBRQt4Ga
  24.131 +lndYXrtgGcCz6/hd1XPjyc+sRXRvfnK81V9JUWsI8bzCOm30jiWSzGuHbjX92FtM
  24.132 +F+OFzGygRnY8FFEGfcKiETIMHhoHqTgMrObV5+6Wy6K3gOQHIIpnzbDhTDaf7iN5
  24.133 +djsdO/Ma33TenrufSTgGGhGgkQ9+XNYNrMjQUM3jFlu6hyyT/ayqL092xCDq7Sg9
  24.134 +hBlPQ8CENzw7CijRYjzwnlA8VCLD2PrfiBGGNIYRmrHBSF736R7rNToYnRGHKILj
  24.135 +25ZWlOtRz9Hp3DMd+dY5Hpx4RoUf4WSL0PVjK6LGrZWQC/Xu7lATtnwI+BCFFHis
  24.136 +pjIpK1K7JekxiH2LVeOgu4XQzAekLERKTrTwt8QD7TlO7ii9xmeRF5ID5C2192dn
  24.137 +TKQ3f2kdCXo6Oby9wh/ViXUQ/G/dFjuYb0hNTk7bk9kXtJ/MdwMd0QigkYJ3kt9S
  24.138 +Pgpsv3Bx6jgXMG59s7SlHU3Y0KqbH+0W9iTG/NNa7v85XoOLVbWs+nd6K3BahpB0
  24.139 +j4TIoeEpBlKN871y1J2qMvxpfaccelkPHuiVbRs4rReunjo0+e9Ejx5FRt7qQ+PB
  24.140 +oHgdsjygvwfVzJWReSXHSC6BeAvaQgj0McCCJ3vTCENNoxsZ/qofBU9OXBMvopVY
  24.141 +Ju3qjp8x97yA7WIvxs0L5lV18wF0WiOcth+oMmNJpTJH9n1My1Be+KYr6fW4lPwj
  24.142 +dAGwE5cYdH9DAGshyv3UWlOD84PmTn6ZkjtsLCqYINJ3CeeUId71dxQT2Ib0JjV/
  24.143 +KlLpMVrUSr0aS9B+muCaVvByrOGFWC916dFF4QCUiD/rjg6YHKMN/Gpg5ylnSTox
  24.144 +0RAF4XEKXEkRnTxSeXOXMnQweuay5nzRVWm0ms2WUBEjtIT0JKNgrEa5OZI18ubP
  24.145 +Mrpl4G/7PWPuVSG/ljJEwR5vkVv5zPWfQ3Fiu/4mC9SzO2+vfM9/vSeciVW3icBK
  24.146 +5u0Mgy2wGzcrzzOAu7pTGvDTvxemjprQuRXLSaoRopv+5uN5jDiuX9Kv4twzlg8B
  24.147 +zjnqBTF9ZwqqY2dAijyCSGJxkkL2zowyO4IZoHx9crMJ1m3QfHe71lubvryuX6r3
  24.148 +ldSZIGD56WLTvb2i0UO41KGVbtPu/WJV34sQ59794myKm9Ic6ED8CY+F81n5U0KU
  24.149 +tpGOthvlBHorctrTPvxDXd+IP8ZT+KY4SheDG50VgyLPVvARQvcVjz9SRwGhRgD0
  24.150 +/jfM410r0/e8phxdbjraFvN+5X5mHFQeaZKFfYROO5JARFXJVfI1a+ngI6w/G5FA
  24.151 +gmr8qrZdz+7K0FEYnK5ET1D/28mLYzo8IYifOeM75Cyt2iTPSqortEfUBuPOdZtL
  24.152 +DaPemLLXaxKzssoocEL7XyY3Qri6tjiUclarxLkzbO8dEFDkz2LHbpTh526MDH1O
  24.153 +PPvPduXF1d4ITZ9OHhP3XdoDB8USDG+Q5OIq5Q8UCq4HzHdJTZ+l/abaR9J3+aoi
  24.154 +1giYHFo8ETKbzlCPd+JpWALHeh+Hdd0VjYrjcJ7rN/SOAdxADJb+SmbfsQuQW71W
  24.155 +46F8s4GrfGlZrH1H6pBjTvoO0Hvp9WgNoxzVVjWI7PRWsUce4dFNJvktbgrJH40d
  24.156 +wCEo/+E85UqxhhD/uG4AFT/NjoQ3jtPL5Mmm5NYoHN6rXwwxkRbXRTaoosOzxuvA
  24.157 +VJQtp6ixT6Bql8v3V38l+MlQL4gy8R8rF6i66KUjbPNTfJDskUkf1e3KDsnqHEDa
  24.158 +dhHk5m6Ce/3KJqrBXG8Iut4pMUXEEThhzcd+g4PUnxFmhWww/3hU2W094fIrUDh1
  24.159 +DnApa99Qgr9eeX7RsfxcNOgZDZGobkc/YXQcR//OyM7QVPy3iNXVTd9ei6oETJP+
  24.160 +f04ZGBM3Ea1LgHhdirJywuZw3wMMH2ICUTuuGssqQ2DCoUP0BhxjboQ88xmwnEI4
  24.161 +YqN99kd6PTZCVLEcyn0WWjUn9pCZQ1w+pw9ZMedNjCwREYapfdOTVc9LBl7+bn+w
  24.162 +OAG9Y4DSflAcGKo0GG3fMLqsRlB+UgE+SGzvHm9qzzAHy6d6+v54gBwlPbBIt2M/
  24.163 ++vCZCmdoq8hfz+3RZQvylSeAqgXNFynLuK6VKlvjdWwSD9u4HvP5UPue1B292Yo3
  24.164 +NRt6fOOG40m/jQYuoVMLj9MY0jq0D2z/g8/YnCHrHF/eSH+WzN7o/m4dBU2AamxF
  24.165 +EWR3cYFqaEH7lbXPTThAgmpmeKqVHEXXaI1pyWCgZgwz+fC4c8YaIPYw5ea+fojT
  24.166 +s0eTFWbh5Wu4HhL0OUHzDOf2toeGLPVf3WcDqpB/SqvAZozKgqy6v5SEg/OLA6dn
  24.167 +ZxdvLfRnmicMpcKj256agf3BW8Xp8Of1OBq6uXR/yISunaOgcNIFnuHB8bJxBJxZ
  24.168 +Zfu572SM0uPR4emvFVcGyBRr/6LyRhZTcqr74Z6nlra8rY0uNOPfnVZYfC2LSBau
  24.169 +qsRpEYiFysIhzouKT4ekYmkzYXuTShT+eF/18EUPelalnItzTTECqA9GkarYMjXH
  24.170 +mLy6Q2VC3Pmy3qHW7qQvfAsoWFvL1zhC2oAW3C0e/xVk20L8yzmc09IUvaiia+3e
  24.171 +G/orNiKLVnryzCoTvcZl7h1wMxNV66iML66OidLJldkpplrMjm3/SQ/I+7jXGF1D
  24.172 +leQVKOksGDvzHwn93DTDHPwN5/5PNEQ8j1DIvjvRc/LU2deKJJGHOL1L/++hbsoX
  24.173 +l9rZrefqzR6r4ezjnrsW+2hAjtRItsjxhs71wicGh7NkR/Dim4PZ97K8Kv7g0xol
  24.174 +YujETgdf7SWHd9pJh1yqt3oVFjPomOBDamyFilHTW4z9p0Vxx1JvOlTXbGRLBvrB
  24.175 +y8WhainlDK81mb5+KlNfQBFXNIvR7/Uc7PMPiF9I6oNED3d88PNAeKZUv694zaHA
  24.176 +CsvHBvYuyExx6RbZUEZ/LkqIk4yp7dFdfMf40usEtIW7KLE5mSRDdECyKHkKgNyK
  24.177 +9+8RIfqtKia61sP8ODeJ0X+WDP8MwclvbJtlXFvch4dHFptjuoylhMmPH4EJXNKG
  24.178 +ZBBDbsPzvtBxznvK3Th99pnuGIHXGZnMWN3CQfKbHArS+JDYp2JNM1w0aEzJySrP
  24.179 +e/Poj2GeRbgIvH5Nr13qYses6M9C9JOicZfSJVySWiNWFVFXfR7hHeNvXmnKjNtG
  24.180 +Wkr+ePyFwaW7J6hX83qYRGqfiVW78fYSX/bvujUEvEzxsSjSdlaPm0Vs2Q4RLqXi
  24.181 +d/CaJsVfZRv0QWkW7l6ApuA1T6cgv3Kc/jwiCkn5Et5tQVOToD1ZsnTlUdOuR3HI
  24.182 +tHfo6zbUrZFJi/sh1X+xVG5ChPd2Bx/IY8ZfLEAUmtzsiHiTPhzglPCrWdLzzcy/
  24.183 +/9paedUEpmQvs3pi+9X7IHLjS8aRNgaXQz7R6uAAEHO2UQOFSv1lEvC3v5FGOdwW
  24.184 +vlVd3dCovFwgRq+lVUM9OXc5B1HOli97VmSmykj3IH2avm2HFpVd/IksK2r8hnRb
  24.185 +Vt/it0iECiPj5GinF0dAUAF5uVdvWOgBUAGeSQqkialV27X38+Zlvmgi3Ea3b5tW
  24.186 +lVY1TKDbPO9fcB84IPddTkc1c1lUvOkVl6v1mpmW9LYvyVyb8IydG9wFJ8450wVU
  24.187 +Z55FsnHt4z2tD6aSbAnOPyR5nnDk18VyI3Y10kWjKJ3lSBIOAl1DVftBmynsdy74
  24.188 +w7yugNxuaQFpa8c2uer+LuXwdcRva/XUcOYwD3VWkfeEP+xCXIabJIgYmAD/fpsa
  24.189 +tgK3N7mgJRBgFXaWw2kVYj+eeFfJ6bC1CHk16Q/Xec7YxNSWXD2yQc2P0WAEd4W7
  24.190 +a1hL3LFOnaBS3HzpW6uVwMtx+QbkwkGxLyTtTwcUVGtGvswat/UsGIVfSVp2gPo2
  24.191 +5SMyYhqas0EBQUrTxTvCFlI0Nw4Q/11Q9n8UTRX61G2dY0O4pZX1ByiJhNcGD+3q
  24.192 +NzHzfhy944k//FiHUFspZW9W42RCkdE2/EurH6YgluNtoTwXczAMR19ljlV8a9cp
  24.193 +Dh5SIItIPV6i2O2gHRmIHHDpvhxkAz3pss0fSR4+V8FU6AnyHHFLzAjyQQ2a6765
  24.194 +mRRLIFqE1NQ9z6EnXILk2vfybmqdVfvPvfiRDXzjOmfGBkZUN+NR1NIBXEwu2B0O
  24.195 +lgEkGEN4mjgeRY0goc8gAJH89I8SI1riPaQlVUqIbx7rtHt28JHjAVT2BzOLzgUW
  24.196 +xFiXfvlPVg+Y4ckNpBCcJMcHakJK1mq1zCN83vRW9+kPiQOcIZRQdColm51OYf7w
  24.197 +y4XPDUsWooY0GTvKnMV3udooRdjy+JTebE3XJ6VaB7tZiqTyIGQvOY5QN7ShfLL0
  24.198 +IhjdNXdGfZaFei8D4FBWdNNPA3xYTTR6galNLwZ3IO5qcEL86mTxop2wPudkppGD
  24.199 +RTY7Q0b5sVndgBftrx5MYQxZvUbDDRztbxp5M2i2aEo/POgBe7Rvs1/MNUbz5Y+Q
  24.200 +Vvcl4JxTnPn6TNHJlHJ1hrBo6DCeYKOm4UYyGMONamgyxHQQSa8HwKRuPQNJKhmg
  24.201 +Pgv1+YS4H9oc88pvlHKr3ukIkSHxxct+3Xpg8ZVZCbBAG6cp0gxUFl/bkhNP7r++
  24.202 +3eZotKmzDtj94ChJSkyfNO00WQRig6VTieuoHCm2DImmYnHgBEMQEC6Jb21DKNmY
  24.203 +f5WYkZpm/ZwZXemQYSNVr+v9P0ySN+QcCcyKw+iBewWjiEgDaYfBT5jf/+ijdODc
  24.204 +e5qSh4R9cq1yOo+qZNcrW/iHWTg3XiHsrBffX9dpOhX908hzmBTnbWUIC4cBchLD
  24.205 +6Pd5SDDJlsUd948lbFXxBL3q14i2YKzb627r5OSu0QMeLq75cRoST8q1r9l4B6PV
  24.206 +6uwga6K6HZwVlgpoVKLvfFPc0aeox4RIZN72v2RVGZfQF0AZDlFTPmn1CItsY9Q8
  24.207 +vsm0O0HJ4lioZHrdm/ZHjhXadTOy2lTDHtERkgyUCBXMm8SejrHjQB9C3GMR11p/
  24.208 +Li0jlC/Mp6nOtLXD9zLXIrqKVO5ezFJegjCjPEsgmN2YapYbEyX0CYQKPMBRPsSl
  24.209 +5tMaUOiFKUU/Hw1oTN37WJgQxtwvGBk/Lu/lr0BePPY1X9/DUuqGhm7uyZXtHBod
  24.210 +sGteV/lp0XPBFEUgG47SGzKz8xWZWECdO8z0OLakO62yrRwgoshoI65ffKTzmMa5
  24.211 +N2y9xJ0Hs3+plzG2/cbq+vJjSHYQ2AskbzjyhrSnA4UrfpR5KRSZT48tev7JhSL+
  24.212 +vGHgpRkEWtK58B73Xt//kN0O4wjCOLX8nRkgqPJ8wk1Tuk1U7cMicwuHSgQp4jDq
  24.213 +CXSUdFPD5IQOC7n+ucPtNCWocBIAT+GBTHk++sTn18xfnZ/fSIFkv1m7evxXUTCk
  24.214 +JAMl5+h12buCyKpIO7g/UKtR4BsjdkXyR1oK5g71Bvu6YE8GHCnYI07ZxEkhaBA7
  24.215 +y3c1ilxY7OY56ZoUewJPQFZ4MuoDc9quaZE1S+x5CSIleNTvoKksqfKxqJFhK6hE
  24.216 +tfXYu/yHZUWj2/Xj3TssbtacoS3KSXgQ/u3dVLmKjoTyyBkRWuoYXv+fBV1FKWtc
  24.217 +0A5D/sT55D9JIc812gyyrj3n2QoHjMsyQvVupibztLyBQvz9CRdIf9iLNcIKvjKq
  24.218 +XMsru0ZogzcPy7WzLu3SBmqtq0yKZgD0hOVMqz8w8FUOdYtpkotb/oMA2TAOyb6H
  24.219 +86BgIlGOHFybXOzzmRPfj4GH3Z3rivFjsOJl0qdBDVJl5OmbyUgQgGNruH+DVDXk
  24.220 +X/iFuyF0E2FSzdvQGqVZ2Cc1M5fm2f3DOzRTnRnwts+S0k7twM5NKsLi9n6lXzXG
  24.221 +cXj4g2aVSfugBpnGOF0MC0XIJOnr6C71X9/ZdkHU1QByAHbGEEqvLcaKdsw8aMQv
  24.222 +u3kkwh2oaY5cvMEE4KidTGquR6Bh7WPn+hQH8Z30knvn4rJGjkQE2Le3FDWhl2eO
  24.223 +VRM4IL0tuqB7RBwUX/KTSK478p+oXTePHLl1rBZOIPuSO1tzsYSy9htWbRKXYxsa
  24.224 +5q1Yt6s7bkTcDVq2z/fOHRKv2ak+x246BKsfpldEQ69cL/mQlrTx7RFIUHvkBo9T
  24.225 +2L3kd76u3fYdZcK2pYRnVTL6nga6YlXTyhzdNEEXsLXOZCa7BsdxS3cxeY+XVyDV
  24.226 +RxAbe6MvK1EOeSvzKDBd17O9TBOcGuHoQLfc7jglrWkNnXLifi6qBswUS/cpS/hR
  24.227 +wM8VQX4etQqjukkhFNLKHfyhaF3f0sxi0ZVeo2lx8eanYdiD9zphpax1sQCCjVmf
  24.228 +7ht96sEX2ju4VR3R0SdI0szUwLmb/Xe6NsxlLP7VatRwT9vCGWx7cDsrT2S60jPF
  24.229 +UZmpQsS84VmI+2WFkubRN5poNGuD3mdGrT2vscmnRZF75+dR+QFp166A8CEAK9Yc
  24.230 +q/XkzWL8LAoci7jx0tzChL2BP5bGdJYk3wWCFuahxMm/2mzM6jO8o4Q65cPcV/81
  24.231 +x9YLhBY9SP/gwKz7kCIB06P9Mq+vF5Sxw6KZFIkg8KB2UCcfBNR9IAKaW62ZD9zv
  24.232 +Nt9eBbqQ2LCp9njy5K+qrXpzW8X2T8PH52GtTvysTAsN6Ccp0VlF4zAlm0uSAub5
  24.233 +3Vn2MZt5GaYgQGk5mBxJw/8bprqQlwwhmuxR+Om5323E+qG9NL5Q+KbYMkflFaF5
  24.234 +nNYrGZ1b469TUGOrA/Cn8tMxoMxorX1uJttBEqdGK0dD3S4Qm2eK9ADcUPffc1Tg
  24.235 +mh0yaiSz+ZvEvh4BmOMEOHqJ0EW0r/zGAeGHTr9QYirfyuGxCsmZv2mtag1ovRNa
  24.236 +FHFGo1jlCJucfggX27lv2oZ+VRjAEUTQvnrh8pPmgMTTWaTk8JtCywpbWwTzhegf
  24.237 +Ltukn85rq2xX1ssh/ra8TeFv0cnnXJbOBQedHHS6L7m64V9uPtRxOU0vaMfZvs8f
  24.238 +mRUP/tlHO3Bn5U+/IsIJK/9cMPU3rdL71ijaBcwOp01jSdN1IOWSYCaFpeiBBHN0
  24.239 +g4hbdJkI3r1ZRrGCwmLWbd/CcacPSsPZtZXvM97kZIAgpvCwZIqRx/6NfqaB7bI+
  24.240 +wPK6qPGFCr1GwGPusCMTVeWOQZL8TbFZHsDXUDLY00mdI5E7QaAk0UtT3bKDrTcj
  24.241 +Lbr00rrf6j5KMiHF7eKaV+nKBTYb1utdw9kbxLZStP8IHaqxXl5lkVE0uRlHr5RV
  24.242 +LKaPbE18/t1vTS76FJaRzrNyopMAAtc8/sxZbE5/tkMZklbyFSFLb/k4zgGpdBn/
  24.243 +/EBJS4Hr9Zw2drvjLBII4lCZ4RAmnHlAgBliO8KA32Sev7ukGq0O/5nvUhlNRkdR
  24.244 +oLlfJKbo4plzkFQRnILWiMgP1iAh9Iohn7zwWU4eA05HJOt1cmrcui9/lqjxxzJx
  24.245 +ly8nXyXRGChSV8g0LkLEmX9gCoHK75KfxWfSTGqrV+Jl+xWAaKuKVhqyuZMG8cA1
  24.246 +Lfsy0IHBOK9BLGPuxxHS3ZbOx6MLEcpMeZon8d21EBQXzVMp4Tf9E7ZF5r0k3dlW
  24.247 +3ITSb99HL4KuHdqgGDwvLn5zT/snqLbWjPUFTg50z2ptgiiEYyCzbGi6askrRXzb
  24.248 +iIUTaS5PfvKkLaUZEkJ57vfoflSax3ESigaGzCHIYAt1VTQyLpFzV6SUVZWvdFNo
  24.249 ++qQFZFNijJ7L7yA9JxPzuw3C61Gy235rkckwAswhlzC6AR3gJ5SBqsRXkDtNrFMK
  24.250 +v0BPUgZr3M+HS+AIa0UZypJ8hcr1EcxnMm8qV5ui/3QMFRWzGkmO2NPH6uI3hj1C
  24.251 +TWnkvi1Ou7jK8kbYilXKbPSr9gYpLwZbZtOOZvIgBg2IPzc7GrSk2PqXs4Ha3Otb
  24.252 +8ZA2NLVc2EnVg4hMBDqbw6yuBn4yyb+Y5K/Pbty56E6ErBkJ2HxZ9PrDKKvRAyF0
  24.253 +JupyDUJKHIF0terQ+ql5YGnU86xZ5ozGGQConaQUFt12hteyxhw1hFH/lA6RBNIH
  24.254 +XtKeuDxEJeQ+x/BH1PLdvAaQcVKWXw20IyhXGOqh2ifgMpqvU7DiFuu1Hn2bz9pQ
  24.255 +nPSsEeYN1Ub61jBpIaQeTeCLRFtTutNw8SqHr0roPkh36S3Z/D8alxMSssWFuyxZ
  24.256 +AYxd0B/NdjKax+oHtMh+UmkxQRjzEhGjvVYfKB97HKIX4hZS98yquNwv9GL3upid
  24.257 +Xgty969E355YyLEmJfEJfwV+tjbwneK2GqOUswPSqznfE085rITHNPZsKflCyyGu
  24.258 +XZwyuIyvH+dDHo9IzAbaxUm3cQXVBGtxQWmAYFIX6tu4SMckUT+cnxq3N2lTLIbb
  24.259 +ZAMQJ66eqLZ0r4g2xeey7iTFmDyVWnX8C+fmABUWLMhH7ja3JtCA2nEfUw4ZSs0B
  24.260 +pGF88KcguWVzcRqD0RCjSTmA38Aqb+TrT0w+MwVfNIXmrqgfQjEx+xPV7u5XdpzE
  24.261 +O4U28D4b1O67PkV+o1OANHh6ex9aLh3krtVBgqcIBuIyjWEMmQI8SoS+FapdSHYW
  24.262 +vl6rPDc1ygf6ETkevkbZJK/HYKmGzljKitSXAicoEmBEs395uYT7bRXBL13xBnrQ
  24.263 +1NHMVjZtNGvwwU4E+nIN2Mn35n0cdM9QlK5HDwQBcRpYX3ARlFX/9D63TldA6hYB
  24.264 +Pwt13J2Gk5TITGdZGfH8/Sn2l/tkSfIovttYpNnxHSunmulKnn24Engl2mU+kpbK
  24.265 +ZOhNjGTAZYtVTUJbAXcC7SfTn7oPJ9AZnxDPrSSBU2Qx8LV6swZfFm4A5BEKjFu4
  24.266 +R/B6k87qhnURqp933Ojr1LQK2/RtKhPDHP7TtyA0CDuJzhceHvIVtMrLI0vGiYmY
  24.267 +YlrxaRNXvDfv1yyMKIMFcrdmIqJg3to0sCbPAPLgy4zi9SMsfD09U1jXuB8D2m4o
  24.268 +Rh4cNsWoUHYlXJ0g+Y9J1JbVeryqeoEWmyMSsU0ypl/G3ci1K/fmDIukuB/kERCX
  24.269 +K0pmT3PCCoPkCAG7Z8Y3wLtnJhOxIKNvIhqHTgruSMi+My/tHxyAMIN8rEndh1Gx
  24.270 +sc1OiJI63rIUqgvXJLJrWcC2gneyX3qcpJ/UfrpAEgUL1lbgWWlZcQk0OE9eUpkj
  24.271 +7BiHI1z8IjfbnRaLWLSGKMGo4xf5YXXvu+by72qB5zpN24lVx+sSNpu3adzYrmBT
  24.272 +lltkx6Qf7EK7iPV39W2X8aNm2HlDU7nCRKuLRvJXTuIJYHSfeKkWv4z6KSTgDCo5
  24.273 +QkukFkgiqcIsrJOAs/0tT5CbXaSvage4vOn1Z5U2GDvvCnU0pdYzulw/3I8MBSGc
  24.274 +y7xEf9Wn4I/DWPiGrdtjJbZZyx3DB/TlBU4jlOhzBr8HZHG4GNTI2MY6vRvyLLSR
  24.275 +B8KO5V5NBB+PPkF4MB5sVgN00Y1GFPEEGIx3GAriZ8SJSOavAX279nYoT3kCe4tZ
  24.276 +d0kgOFTPqep5utYtRUH/DlHf9LT0cCg/Dxg3LEhwz56qSS6h5oQwFAypjpjOXVFJ
  24.277 +Xx+haQfLYar7ZsWCo18QaDWdV1AVjTSQzEYJ5wajo2WbDW+nDfn1UL12rCrLTaG0
  24.278 +uKJK5s2mZAYwunhGycxPEZLuVhV8KBbG9P9D1TMO5zUnBxhgSqo3i8LMxmLUTd6R
  24.279 +VrbEWAdiO4N7G+VGUixfIm3scwPLtQbnPX7IQkKp9uLuMh4hlKKVrDhfC1emQxfi
  24.280 +Bwv63zK5d+DiPhm07SrFmXQoVTyvOyxnJJqM/oEOnsZ7furXL+e8izteMSCr6roR
  24.281 +H0za8r20FREn7lGP2u4L68hOyDYV7aEJZMiHpmWxx2RxDJ3y5DXpFfSFbZ/w8csB
  24.282 +mzvEkdUbbq6UrXQk6KqaynIKRE4D2rgya9TMPprlLi8VKtSWFiaWVHiMtd3GKus3
  24.283 +SU1phrxfD6K76tONslT/7r4lmPUaBuPtD6cGZys0lpEGdnQG3JT5AEWt3W3bc8NR
  24.284 +O2/kww11dYV8IkYmQkRCfCKWnikjsJWTZWlSjn0scMH/p0OCIKUHCYO6w5N8ftXx
  24.285 +4xQF/oAakVTlxiFxi92pU1xJg7wqYJIdUcaXPPM8sjZdI6BR1TErX1zqRcMWY/kB
  24.286 +8Qkokv0PNKhozE/GkTyduTENQR7cSuLJFrMY7JPuFv35E9YRe3oW1qVqrH7QVCSn
  24.287 +FsPnWRFnrpLNY+dGWGCjabNzAGDcDKi7we+y6Q5LNfv9bMwl4BUgPNumVHN7jlzI
  24.288 +PqgisvCsiAZPsg7rETPWBCNSOOLoY2+I1eu6VIV+4AtDVnY3afD0XUgaBFh+ptnt
  24.289 +bvi8VCkoEF4bYmBxhREc67xxTanzkSfbvqzNDQMRzZBhAZDAyeHP2JvWQGfW7IU3
  24.290 +EjhoRLee3ZUipOnxV5ep8qmrwmPavcq8+hqy0qQfhks8KUozs05KaUXEAsVitnAB
  24.291 +7462Xdt8+xhwFaJ0q0Xfk4q4hfjZqXpW/TcQp4ch9ucVenSBSzJXnGKl1ZtFrh20
  24.292 +GpeMrUycGl9dggfu4xTnWgaciBrA7YBJNmoXlJS6M2iBiC0g/9TpfoMIfnmolYPu
  24.293 +RZ5hlDTix8NBpysu1effzYJG8+mCfCidneTpRJkNbpAHHWL1fonx/mPZeDpSGj8A
  24.294 +oiAfTa5gai4fqy2o54Pu7Nqgpn6VBhsWvJCuQtn4+nXiK0RgtN2EIRnL5Zdd7YmF
  24.295 +CdLQtOIBs9mFgNmeZtfVhB2WrTEkaGj+Ih98e7MZcJE4tHXlIlcG3QKXjZce7XkM
  24.296 +km+5L4QKeNysqWL89RjqsXXh0jEbUjzdDwq6wLDoMtri20+NKti7tozvCXBbWRU1
  24.297 +OaZ4mtio73XQMJf+EpymCNBInuNwht5oVgUTtpwIZuV1UFaEuUefzwokTnSN+z/5
  24.298 +0MKgPzgfHWHvHCzZ1/vIsWRVTu40OfKOHDk+ZZdgLs7K1feadwnPD1/+ICLHpACa
  24.299 +CuRj4viEubwtJyu9vM+R7F0jWNx5efM2CY5zZMV2mRa1UGnCv7AKXTasWZTaPBGp
  24.300 +rUyiPpkq+VJ190YwbKGO5A00uvLhUlVFa+6ygHFISkNY6uvQM4gMniIIIO3Yqswr
  24.301 +6TXgrFvbWwLv7+6M4L3IcwGj83xND0UXi+Xa1cmj/fyDn2zNZYOEWzwvJ2PsxABq
  24.302 +uzKYsapAs7ja7xvezbd+vdGnkfmczqb2Q/w+7IMwo9pDqwNVyGmit4XuiYYUHeiA
  24.303 +g9GOl1enAoevnr5M1MxPxp2N9WUDZNSvgwKAUBxDlu7wAp12+YwEA5S1KiNKkRRB
  24.304 +B7BE14oRWePvSKoRt4LqJjnhY9ftJu6NYSrHUZiMZWPIawxxnQMWr5CW0kxh/tA4
  24.305 +7pys1xnmI5hTC4NAL2sg07wxM6fNOY6l9YEqck8V6gh8tR+jO/U2pFJUXO6dIx9X
  24.306 +dyQV5svl8klrZO2VKFF/Qzd1L2k+VCZf2WrpAPmIHprUr2jzWwG6Fav5xlWXf9v6
  24.307 +TArU87RGmGikjzYkJJOP/7ZAlgiWYn6dmeYQaz4DeLR+kJYfUnn1TeftBSpolsnz
  24.308 +6d42f1R5nuhlwRwyWU6b/CI7HBRAONQi9nK0hps0kTH1UvZUe6/W7SU/0XDrN2K9
  24.309 +bHttQVeGaUgAHB6Iq3eZTdVco2p84lpmJbUg70BkCwwg7O2yvdns1V7M4aDyL0qG
  24.310 +viI6HsLmsk6nI1/Tnoqvw1IVxcgPqCtgbhJX3LV4wFqkkcVLrTyXyUkychGIkWK2
  24.311 +aTEfp0NYF3lhyUHpfVwyWFIDalAkTq6ZdJp4oS5ZwLQ/7afh7AZpco8xQCZdR4t4
  24.312 +Ey23lCu1+Doj6rWiGgVDTyerl8++oREPg5wucKC4tbRRKOrrcSCp7Fj6gXV3r6an
  24.313 +LDmfuQYVI7KSYL9h4B0VwV8wezp1anewPTidYR++D+myDCZ42oy/Qs9PzQTy/2/z
  24.314 +FywUO++DmpYqOQB5hGIh3wmHDWqqDFGqZmm555UbsqZQCEp3wzFdJKJJ+oOzTcN2
  24.315 +VFgaK17jRBHyD73mP55nkM3CR7Gt8BuijOiOCuhZip5VbzrH+kVWfVAjXeA7G2kK
  24.316 +SCSTE2083XG4dSfIt2oa+65ix6zRTRY4qkX4U7XCyor3RfPRvBl6s9WSJDvS/85N
  24.317 +DEjYzKUISZxB/8mHTI7FZ0i14jSvz+y0sX6NpTO7+0x7GPxruHh88km7tbb8J6jt
  24.318 +xkbPHKhU6NAmX7i7atsrykT7S4JD1lfWDU1fK5wMT8geVu13HtumnmavUhFMPB6m
  24.319 +xIYIPIOoDPEGfIwcNMuA73ZilRtA2mGiQ6Lcu/WGq0hZngY0GbariL22gODFa8KW
  24.320 +4LY/ErJG81m4Pbk5UZJ5ZKQo0GqdXCU8nJcDvGT1BsHJLx5cFVDGEN6op7zC93bt
  24.321 +FqCYmNWitTpM3YupjEIWg1c/pFeXY+ZhteeKIxfgMFm/V4LUKlbHIM6YKqW4y3Ti
  24.322 +vk7mUC90HoiAiL6uIPuoMr+Vwt/q7AwBvR09PqTTP+2sZUABCpoA7eMutHwsOVwX
  24.323 +x7uv+LB+QInE8gJZQCwUiGmTMvWS5oH6DZEyAW5+gPkhLPxxsSIzNTbOkyL+2W8z
  24.324 +7Der/NV3B+rqsEnOiG4kDw5PQXoqvIqJTRUy9IoQjj0SLYF1J52x94SdIwf8bTOB
  24.325 +MTr2WGc+dHPYqi2xim5w8ubzEwZKOG13ypPVZ3P7+Xn3eLVGTVfpuMWi5Pk6uoP3
  24.326 +RYQI4Ej7Zry7+QSeQ4RbO5Xh/eXbTfgMOJjXuLKvlnSHF2INKHXMDV97YjZC3mnf
  24.327 +jgYWV7EldihdE/oA/O0XGru96VFfIr0Obai/IEC39scwZSIp7e7PSg8WuYga8z6z
  24.328 +054Dm3cXzIDywfFyjqA9Ht6q7V5+ZdP2pEJYWvKAX/X2GPlTNjcr7B5a4kt2+leV
  24.329 +m+No2Idg5QTb6nzNswAF9QlRo3sLHkBLBkI5ihGj4041o27M/5sPuwmFeF+ATEYx
  24.330 +bBx4wODuNVgfinG5n8mV6CEkZG1H9WLtB8uvW3El1+hQo0iTRza2PSr2mWBJGoJu
  24.331 +xjzQh39nOFsOGwVBX5PRGAFLSrok5E/2//MpM/pMGahPY1TGI8gk4oRgXzO6h1ji
  24.332 +QhsJYgxCTnz1vlU=
  24.333 +=IdfY
  24.334 +-----END PGP MESSAGE-----
  24.335 +
  24.336 +--238e1f2946e87ccd3d1b58ba507ed7ab--