merged parent
commit
439e60a1fc
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,103 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1020"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "NO"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "159EF1E022B6AB0700149C0C"
|
||||
BuildableName = "sequoia.framework"
|
||||
BlueprintName = "sequoia"
|
||||
ReferencedContainer = "container:../../Sequoia4iOS/Sequoia4iOS.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "64796A3E1B455AA5004B1C24"
|
||||
BuildableName = "libpEpEngine.a"
|
||||
BlueprintName = "pEpEngine"
|
||||
ReferencedContainer = "container:pEpEngine.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "64796A3E1B455AA5004B1C24"
|
||||
BuildableName = "libpEpEngine.a"
|
||||
BlueprintName = "pEpEngine"
|
||||
ReferencedContainer = "container:pEpEngine.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "64796A3E1B455AA5004B1C24"
|
||||
BuildableName = "libpEpEngine.a"
|
||||
BlueprintName = "pEpEngine"
|
||||
ReferencedContainer = "container:pEpEngine.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "64796A3E1B455AA5004B1C24"
|
||||
BuildableName = "libpEpEngine.a"
|
||||
BlueprintName = "pEpEngine"
|
||||
ReferencedContainer = "container:pEpEngine.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
@ -0,0 +1,44 @@
|
||||
include yslt.yml2
|
||||
|
||||
tstylesheet {
|
||||
template "/protocol" {
|
||||
| protocol «@name»
|
||||
apply "fsm" sort "@name";
|
||||
}
|
||||
template "fsm" {
|
||||
| fsm «@name»
|
||||
apply "state" sort "@name";
|
||||
|
|
||||
for "set:distinct(*/event/@name)" {
|
||||
sort ".";
|
||||
|> event «.»
|
||||
}
|
||||
|
|
||||
for "set:distinct(descendant::action/@name)" {
|
||||
sort ".";
|
||||
|> action «.»
|
||||
}
|
||||
|
|
||||
for "set:distinct(descendant::condition/@name)" {
|
||||
sort ".";
|
||||
|> condition «.»
|
||||
}
|
||||
|
|
||||
apply "descendant::transition"
|
||||
sort "ancestor::state/@name",
|
||||
sort "@target",
|
||||
sort "ancestor::event/@name";
|
||||
|
|
||||
apply "message" sort "@name";
|
||||
|
|
||||
for "set:distinct(message/field/@name)" {
|
||||
sort ".";
|
||||
|> field «.»
|
||||
}
|
||||
}
|
||||
template "state" | state «@name»
|
||||
template "transition"
|
||||
| transition from «ancestor::state/@name» to «@target» on event «ancestor::event/@name»
|
||||
template "message" | message «@name»
|
||||
}
|
||||
|
@ -0,0 +1,19 @@
|
||||
// This file is under GNU General Public License 3.0
|
||||
// see LICENSE.txt
|
||||
|
||||
#ifndef I_O_S1664_H
|
||||
#define I_O_S1664_H
|
||||
|
||||
#include <string>
|
||||
#include "EngineTestIndividualSuite.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
class IOS1664Tests : public EngineTestIndividualSuite {
|
||||
public:
|
||||
IOS1664Tests(string test_suite, string test_home_dir);
|
||||
private:
|
||||
void check_i_o_s1664();
|
||||
};
|
||||
|
||||
#endif
|
@ -0,0 +1,61 @@
|
||||
// This file is under GNU General Public License 3.0
|
||||
// see LICENSE.txt
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
|
||||
#include <cpptest.h>
|
||||
#include "test_util.h"
|
||||
|
||||
#include "pEpEngine.h"
|
||||
|
||||
#include "EngineTestIndividualSuite.h"
|
||||
#include "IOS1664Tests.h"
|
||||
#include "mime.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
IOS1664Tests::IOS1664Tests(string suitename, string test_home_dir) :
|
||||
EngineTestIndividualSuite::EngineTestIndividualSuite(suitename, test_home_dir) {
|
||||
add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("IOS1664Tests::check_i_o_s1664"),
|
||||
static_cast<Func>(&IOS1664Tests::check_i_o_s1664)));
|
||||
}
|
||||
|
||||
void IOS1664Tests::check_i_o_s1664() {
|
||||
string email = slurp("test_mails/0.47.eml");
|
||||
TEST_ASSERT(!email.empty());
|
||||
|
||||
message* message_mail = NULL;
|
||||
|
||||
PEP_STATUS status = mime_decode_message(email.c_str(), email.size(), &message_mail);
|
||||
TEST_ASSERT(status == PEP_STATUS_OK && message_mail);
|
||||
|
||||
// create own identity here, because we want to reply, before we start.
|
||||
pEp_identity* me = new_identity("android01@peptest.ch", NULL, PEP_OWN_USERID, NULL);
|
||||
status = myself(session, me);
|
||||
|
||||
TEST_ASSERT(status == PEP_STATUS_OK && me->fpr != NULL && me->fpr[0] != '\0');
|
||||
|
||||
// Ok, now read the message
|
||||
message* read_message = NULL;
|
||||
stringlist_t* keylist;
|
||||
PEP_rating rating;
|
||||
PEP_decrypt_flags_t flags = 0;
|
||||
|
||||
status = decrypt_message(session, message_mail, &read_message, &keylist, &rating, &flags);
|
||||
TEST_ASSERT(status == PEP_UNENCRYPTED);
|
||||
|
||||
pEp_identity* you = new_identity("superxat@gmail.com", NULL, NULL, NULL);
|
||||
|
||||
message* out_msg = new_message(PEP_dir_outgoing);
|
||||
out_msg->from = me;
|
||||
out_msg->to = new_identity_list(you);
|
||||
out_msg->shortmsg = strdup("Hussidente 2020!");
|
||||
out_msg->longmsg = strdup("A Huss in every office!");
|
||||
|
||||
status = outgoing_message_rating(session, out_msg, &rating);
|
||||
TEST_ASSERT(rating == PEP_rating_unencrypted);
|
||||
|
||||
TEST_ASSERT(true);
|
||||
}
|
@ -1,179 +0,0 @@
|
||||
// This file is under GNU General Public License 3.0
|
||||
// see LICENSE.txt
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string>
|
||||
|
||||
#include "pEpEngine.h"
|
||||
|
||||
#include "pEp_internal.h"
|
||||
#include "KeySync_fsm.h"
|
||||
#include "sync_codec.h"
|
||||
|
||||
#include "EngineTestSessionSuite.h"
|
||||
#include "SyncTests.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
void Sync_Adapter::processing()
|
||||
{
|
||||
cout << "waiting for processing\n";
|
||||
while (!q.empty()) {
|
||||
nanosleep((const struct timespec[]){{0, 100000000L}}, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
PEP_STATUS Sync_Adapter::notifyHandshake(
|
||||
pEp_identity *me,
|
||||
pEp_identity *partner,
|
||||
sync_handshake_signal signal
|
||||
)
|
||||
{
|
||||
return PEP_STATUS_OK;
|
||||
}
|
||||
|
||||
int Sync_Adapter::inject_sync_event(SYNC_EVENT ev, void *management)
|
||||
{
|
||||
Sync_event_t *_ev = ev;
|
||||
switch (_ev->fsm) {
|
||||
case Sync_PR_keysync:
|
||||
cout << "injecting event " << KeySync_event_name(_ev->event) << "\n";
|
||||
break;
|
||||
default:
|
||||
cout << "unknown state machine: " << _ev->fsm << "\n";
|
||||
assert(0);
|
||||
}
|
||||
auto adapter = static_cast< Sync_Adapter *>(management);
|
||||
adapter->q.push_front(ev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Sync_event_t *Sync_Adapter::retrieve_next_sync_event(void *management, time_t threshold)
|
||||
{
|
||||
auto adapter = static_cast< Sync_Adapter *>(management);
|
||||
time_t started = time(nullptr);
|
||||
bool timeout = false;
|
||||
|
||||
while (adapter->q.empty()) {
|
||||
int i = 0;
|
||||
++i;
|
||||
if (i > 10) {
|
||||
if (time(nullptr) > started + threshold) {
|
||||
timeout = true;
|
||||
break;
|
||||
}
|
||||
i = 0;
|
||||
}
|
||||
nanosleep((const struct timespec[]){{0, 100000000L}}, NULL);
|
||||
}
|
||||
|
||||
if (timeout)
|
||||
return SYNC_TIMEOUT_EVENT;
|
||||
|
||||
Sync_event_t *ev = adapter->q.pop_front();
|
||||
if (ev) {
|
||||
switch (ev->fsm) {
|
||||
case Sync_PR_keysync:
|
||||
cout << "sync thread: retrieving event " << KeySync_event_name(ev->event) << "\n";
|
||||
break;
|
||||
default:
|
||||
cout << "sync thread: unknown state machine: " << ev->fsm << "\n";
|
||||
assert(0);
|
||||
}
|
||||
}
|
||||
else {
|
||||
cout << "sync thread: retrieving shutdown\n";
|
||||
}
|
||||
|
||||
return ev;
|
||||
}
|
||||
|
||||
PEP_STATUS Sync_Adapter::messageToSend(struct _message *msg)
|
||||
{
|
||||
assert(msg && msg->attachments);
|
||||
|
||||
cout << "sending message:\n";
|
||||
|
||||
for (bloblist_t *b = msg->attachments; b && b->value; b = b->next) {
|
||||
if (b->mime_type && strcasecmp(b->mime_type, "application/pEp.sync") == 0) {
|
||||
assert(msg->from && msg->from->address && msg->from->username);
|
||||
cout << "<!-- " << msg->from->username << " <" << msg->from->address << "> -->\n";
|
||||
char *text = NULL;
|
||||
PEP_STATUS status = PER_to_XER_Sync_msg(msg->attachments->value, msg->attachments->size, &text);
|
||||
assert(status == PEP_STATUS_OK);
|
||||
cout << text << "\n";
|
||||
free(text);
|
||||
}
|
||||
}
|
||||
|
||||
free_message(msg);
|
||||
return PEP_STATUS_OK;
|
||||
}
|
||||
|
||||
void Sync_Adapter::sync_thread(PEP_SESSION session, Sync_Adapter *adapter)
|
||||
{
|
||||
cout << "sync_thread: startup\n";
|
||||
do_sync_protocol(session, adapter);
|
||||
cout << "sync_thread: shutdown\n";
|
||||
}
|
||||
|
||||
SyncTests::SyncTests(string suitename, string test_home_dir) :
|
||||
EngineTestSessionSuite::EngineTestSessionSuite(suitename, test_home_dir) {
|
||||
add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("SyncTests::check_sync"),
|
||||
static_cast<Func>(&SyncTests::check_sync)));
|
||||
}
|
||||
|
||||
void SyncTests::setup()
|
||||
{
|
||||
EngineTestSessionSuite::setup();
|
||||
|
||||
pEp_identity *self = new_identity("alice@synctests.pEp", nullptr, "23", "Alice Miller");
|
||||
assert(self);
|
||||
cout << "setting own identity for " << self->address << "\n";
|
||||
PEP_STATUS status = myself(session, self);
|
||||
assert(self->me);
|
||||
assert(self->fpr);
|
||||
cout << "fpr: " << self->fpr << "\n";
|
||||
free_identity(self);
|
||||
|
||||
status = init(&sync, Sync_Adapter::messageToSend, Sync_Adapter::inject_sync_event);
|
||||
TEST_ASSERT(status == PEP_STATUS_OK);
|
||||
|
||||
cout << "initialize sync and start first state machine\n";
|
||||
status = register_sync_callbacks(
|
||||
sync,
|
||||
(void *) &adapter.q,
|
||||
Sync_Adapter::notifyHandshake,
|
||||
Sync_Adapter::retrieve_next_sync_event
|
||||
);
|
||||
TEST_ASSERT(status == PEP_STATUS_OK);
|
||||
TEST_ASSERT(sync->sync_state.keysync.state == Sole);
|
||||
|
||||
cout << "creating thread for sync\n";
|
||||
sync_thread = new thread(Sync_Adapter::sync_thread, sync, &adapter);
|
||||
}
|
||||
|
||||
void SyncTests::tear_down()
|
||||
{
|
||||
adapter.processing();
|
||||
|
||||
cout << "sending shutdown to sync thread\n";
|
||||
adapter.q.push_front(nullptr);
|
||||
sync_thread->join();
|
||||
|
||||
unregister_sync_callbacks(sync);
|
||||
release(sync);
|
||||
|
||||
EngineTestSessionSuite::tear_down();
|
||||
}
|
||||
|
||||
void SyncTests::check_sync()
|
||||
{
|
||||
cout << "check_sync(): trigger KeyGen event\n";
|
||||
signal_Sync_event(sync, Sync_PR_keysync, KeyGen);
|
||||
adapter.processing();
|
||||
|
||||
cout << "check_sync(): cry for unknown key\n";
|
||||
signal_Sync_event(sync, Sync_PR_keysync, CannotDecrypt);
|
||||
}
|
||||
|
@ -0,0 +1,118 @@
|
||||
Return-Path: <superxat@gmail.com>
|
||||
X-Original-To: android01@peptest.ch
|
||||
Delivered-To: android01@peptest.ch
|
||||
Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48])
|
||||
by peptest.ch (Postfix) with ESMTPS id B28651A1A37
|
||||
for <android01@peptest.ch>; Wed, 19 Jun 2019 13:30:48 +0200 (CEST)
|
||||
Authentication-Results: plesk.peptest.ch;
|
||||
spf=pass (sender IP is 209.85.128.48) smtp.mailfrom=superxat@gmail.com smtp.helo=mail-wm1-f48.google.com
|
||||
Received-SPF: pass (plesk.peptest.ch: domain of gmail.com designates 209.85.128.48 as permitted sender) client-ip=209.85.128.48; envelope-from=superxat@gmail.com; helo=mail-wm1-f48.google.com;
|
||||
Received: by mail-wm1-f48.google.com with SMTP id c6so1452126wml.0
|
||||
for <android01@peptest.ch>; Wed, 19 Jun 2019 04:30:48 -0700 (PDT)
|
||||
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
|
||||
d=gmail.com; s=20161025;
|
||||
h=date:subject:message-id:mime-version:from:to
|
||||
:content-transfer-encoding:content-disposition;
|
||||
bh=NUw9sOoAh+T9dS39iJIrhWdmODeTKEUilqsSegM8sFY=;
|
||||
b=P7PQKOsF5/fo55wQh0OSf0TmwvGkefdBetMjGbNU+3YMI9ivYIcA1d/BS0acEc680t
|
||||
8hXsylVmD0+W51dkKDRoD0eMOI+lRy0km3i3ndTghVWQkwC4qmlcX3m9+l7JqoBK1WfS
|
||||
LLQLVmYIoqOVOKeDt1Gin93KKU7UJrnxTWmQBtwStvTtBf55W9oSfwimQw4vMQ9dC18b
|
||||
ZIxdIF718uUgoeNoBDCwIZSEhrx2BrtMIwQLMCo3N3tj90teB+J2RzyR1/WK5baZSYTx
|
||||
jFEP820+8ijVkbfBeGe/NXO8lhjkcBJpMRt8u6hEwaYfqCHti5nNxkBPz5DTMaSpwr/i
|
||||
frvw==
|
||||
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
|
||||
d=1e100.net; s=20161025;
|
||||
h=x-gm-message-state:date:subject:message-id:mime-version:from:to
|
||||
:content-transfer-encoding:content-disposition;
|
||||
bh=NUw9sOoAh+T9dS39iJIrhWdmODeTKEUilqsSegM8sFY=;
|
||||
b=uh9pKjfFTmrFiQ0FGn451jB7OLbRwzdgsMUkI005vc/mFKzVl2ON/+DhBdgHn32fat
|
||||
NFLXoDWJLxOdmHa4AHZFuNzlq2FkuMcHol71/TrwfpcLua7lv91xK1QyNAOiZTr+svHF
|
||||
OvHJfnwQDgDEKvujrDSNtiouClF8PDn3xL14oleqWHJVof/xu1g85udfrz9oCRB75LEx
|
||||
MQMdg/2dZG2VOyU5oL0GxFWkJklwbVRetmeedXW03LT6nHMxgiTvu8w763Xrc6qiQg8i
|
||||
E6YrGGYcGkQ2Yz+ktTWPfNRbAYqXWIcl4hTWfgz/EfA++YADsLfylsQFbLEjrzqPl3ta
|
||||
n42Q==
|
||||
X-Gm-Message-State: APjAAAVz898EiKLpVhBB5cId5eBhi5M165QEihBzgqQYtn4mwKLXTvmm
|
||||
Zcj9EtC70y+1hUOijZcR0t20kv+pORU=
|
||||
X-Google-Smtp-Source: APXvYqzwqwDR8fIHgK/akmZKDj40939fHnZCMvbJkqGJO8FJBA1CNtsOeeD/o9+oPXxSOes9wcFivw==
|
||||
X-Received: by 2002:a1c:7614:: with SMTP id r20mr8454522wmc.142.1560943846238;
|
||||
Wed, 19 Jun 2019 04:30:46 -0700 (PDT)
|
||||
Received: from pretty.Easy.privacy (58.red-79-153-28.dynamicip.rima-tde.net. [79.153.28.58])
|
||||
by smtp.gmail.com with ESMTPSA id l1sm27960688wrf.46.2019.06.19.04.30.45
|
||||
for <android01@peptest.ch>
|
||||
(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
|
||||
Wed, 19 Jun 2019 04:30:45 -0700 (PDT)
|
||||
Date: Wed, 19 Jun 2019 13:30:45 +0200
|
||||
Subject: Tralal
|
||||
Message-ID: <D5AB23C6.36B2.4D51.9FED.2B89DA8E24F0@pretty.Easy.privacy>
|
||||
MIME-Version: 1.0
|
||||
From: "Superxat" <superxat@gmail.com>
|
||||
To: "android01@peptest.ch" <android01@peptest.ch>
|
||||
X-pEp-Version: 2.0
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-Type: multipart/related; charset="UTF-8";
|
||||
boundary="=_0c0c4f5794a2b6faebb4792f1d649487"
|
||||
Content-Disposition: inline
|
||||
|
||||
--=_0c0c4f5794a2b6faebb4792f1d649487
|
||||
Content-Type: multipart/alternative; charset="UTF-8";
|
||||
boundary="=_14547b0f3d5cfa991974970b718011b9"
|
||||
Content-Disposition: inline
|
||||
|
||||
--=_14547b0f3d5cfa991974970b718011b9
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-Type: text/plain; charset="UTF-8"
|
||||
Content-Disposition: inline
|
||||
|
||||
Jzbf
|
||||
|
||||
|
||||
sent with p≡p
|
||||
|
||||
--=_14547b0f3d5cfa991974970b718011b9
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-Type: text/html; charset="UTF-8"
|
||||
Content-Disposition: inline
|
||||
|
||||
<p>Jzbf</p>
|
||||
<p><a href="https://pep.software" style="color:#1AAA50; text-decoration: none;">sent with p≡p</a></p>
|
||||
--=_14547b0f3d5cfa991974970b718011b9--
|
||||
|
||||
--=_0c0c4f5794a2b6faebb4792f1d649487
|
||||
Content-Transfer-Encoding: base64
|
||||
Content-Type: application/pgp-keys; charset="UTF-8"; name="pEpkey.asc"
|
||||
Content-Disposition: attachment; filename="pEpkey.asc"
|
||||
|
||||
LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tDQpWZXJzaW9uOiBOZXRQR1Ag
|
||||
Zm9yIHBFcCAzLjk5Ljk5L1tiZXRhMF0NCg0KeHNGTkJGMEtITWtCRUFDMHM2MUI2dXlGREI0
|
||||
WjNoQ3h1SDJkSGltdzltT0dxUlNTR2g5dW10czh5NGs4VUJmbFlkOE43T3lIM21wQw0KMVJm
|
||||
L2J3d1FESjBkMUFuUUZrdmNHOWdkQXEyTXREZHZzbGlyV1krQm1oZEtDdVVCSWxuWXhrbGRt
|
||||
cUlGSVpQc1ZJam5JNG1WK3cxMg0KakFmYk9MSEZNQnhiNXdFSUZVcVpzZ25wQklsTVlNN2Nt
|
||||
L05HdVlkc2pzWGl0MC93U3FxOXkySTBTL25MRWFYaXZIUmF4WmRyaFNzOA0Kb1IrTU5TVW5O
|
||||
MGZsOElETnV1QUp6U0RNbzljZGwwQk1uN2ZTdWYyWXhMUlA0WWZGTHhGWGhPTStlQjNETnQ5
|
||||
R2ZTZ0dVTFBQRStLcw0KVktuWkxCLzBlUEtSNWZhWDV4Rjllb2tEZlR0T3l1ZnJPRFdJK3FU
|
||||
eElubUNSQzg4VFRGMGhiMTFTMGFzd0FnZW44c3QyNTBBQnFyeg0KQWVWc1Vtc2prMmR0REhM
|
||||
TzJBaGxBQ3FVRmdOLzV5ckJxWXpvM0lLZVpmNTUxSFdVVzVQVGRmZmdZM1FQNUc5SkVzRVBP
|
||||
a3R0RTBpYw0KdXdJbHRQS2lQZkZzNmVkMjcyNG9pNS90NVBlbm8vNTdxK2hrTStsS3RodmYy
|
||||
ZEJleTkzL0FLcGtpN0F4aTJCbjRhRGVEb3JNQnNBZw0KZG9iSHFKVUxBdmVJaDR4VzFTbnJX
|
||||
dlVMdDZHSUZrbjBISUJqZWhmQkFBejZGVFkwRnpiaFJacHhtaDhBNm5JU2ZZNFdZUTdCbFpl
|
||||
cA0Kb1V0dFU5MHVEeEZDcWxYdlV1NnViQzhSQ1poNFNJMWd3QktobVZ3MTR4UngrZkNWTFc2
|
||||
SFRvR0x4UDY5dEYwRGxucUd2YkhaOU1LdA0KRGFTSldNZEQvRUtZR1FBUkFRQUJ6UjFUZFhC
|
||||
bGNuaGhkQ0E4YzNWd1pYSjRZWFJBWjIxaGFXd3VZMjl0UHNMQmZRUVRBUUlBTVFVQw0KWFFv
|
||||
Y3lRVUpBZUV6Z0FrUXBSbWp3WmdBY1kwQ0dRRUNHd1lHQ3drSEF3SUJCaFVJQWdrS0N3TVdB
|
||||
Z01DSGdFQUFHSU1ELzlrSFVZSQ0KN3FTWGo2Q04zeWZBZFlxT05iOGFOWXRjczNhZUd0bjRp
|
||||
M3htUGw2cTFoR05KV05kTzlmYzhmNFUzSjRleDFBYlY3NFkzckpQT2xEWA0KRzBLZFBRaEVI
|
||||
Tzhpc2lidkRVcDJoaEhXM20zSGF4dzg0SWY4UDlqUlJBa2JKbk1pVEFwYk9PSElOTCtqY1hz
|
||||
anU1WHNKeCt5K1NCdQ0KQ3l2TXV4S0VIbnUrZldrWE05RGlKMTJiRjJxNTEwTExjUHR5SVov
|
||||
azI3S3djemgrdWNQWHhXWHZQbk84MHN3SGpVWVM4L3NydjYrMA0Kcm51dXZvaXlMWlN1bzh1
|
||||
QUVOZGkrQWdvU0gwMXNZcmxRRHQvSko3OXFxZ1NtcTdYRnpzeElGWFVMTG5ITHVxZmxiTEZm
|
||||
eUJTMm1wcA0KbUZZa0ZlVWZ5NG9lQmY5NWkxTkVNRWZYNGk3WUhEZVNQT0Jqd1FVRi8vVEpk
|
||||
R3hHT3RBYjJnaCsrZ01FdDIxaTE3MHE0dzdsQWVHOQ0KSHpHanJjWGtGdlZSZlBTbXZ0UCth
|
||||
cS9xa1kyemkzcVo1ZTVmcFpncHlJcXY4T3EwdkE2M1NtWEFrd1ZnaitNMHJpQjJkSWtmRWla
|
||||
OQ0KWWllVzhwaUxSWkZrb0l4QWxpZEV5MTBmQk4xOXdmL05pL09zRUR0ajN1V1lkbXBTK1hq
|
||||
ODlFREQwQnhMYWhoYUNQclBxSnU3azJGaQ0KMXhtdFJZTzhZcEJxWmVTalh5OHpWN29EUmhD
|
||||
eWFCSndBcmxOS2Y2cm9oTG5xM29WWDFLeFRQUlpBd3FjQ1oxaEpTRUFraVE1ejVhQw0KclJU
|
||||
eCsvSTZRc3JtRk0vdDNBM3RRd0RQRGRpaExMUzhFMWNoekxyRkIwVFd3SUpWeDRtOU9odFR6
|
||||
SlhqYlhlSGorelR0Zz09DQo9VGVxQw0KLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0st
|
||||
LS0tLQ0K
|
||||
--=_0c0c4f5794a2b6faebb4792f1d649487--
|
||||
|
Loading…
Reference in New Issue