mirror of
https://github.com/chatmail/core.git
synced 2026-05-21 15:56:30 +03:00
Merge branch 'stable'
This commit is contained in:
18
CHANGELOG.md
18
CHANGELOG.md
@@ -1,5 +1,21 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [1.119.1] - 2023-08-06
|
||||||
|
|
||||||
|
Bugfix release attempting to fix the [iOS build error](https://github.com/deltachat/deltachat-core-rust/issues/4610).
|
||||||
|
|
||||||
|
### Features / Changes
|
||||||
|
|
||||||
|
- Guess message viewtype from "application/octet-stream" attachment extension ([#4378](https://github.com/deltachat/deltachat-core-rust/pull/4378)).
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
- Update `xattr` from 1.0.0 to 1.0.1 to fix UnsupportedPlatformError import.
|
||||||
|
|
||||||
|
### Tests
|
||||||
|
|
||||||
|
- webxdc: Ensure unknown WebXDC update properties do not result in an error.
|
||||||
|
|
||||||
## [1.119.0] - 2023-08-03
|
## [1.119.0] - 2023-08-03
|
||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
@@ -2712,3 +2728,5 @@ https://github.com/deltachat/deltachat-core-rust/pulls?q=is%3Apr+is%3Aclosed
|
|||||||
[1.116.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.115.0...v1.116.0
|
[1.116.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.115.0...v1.116.0
|
||||||
[1.117.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.116.0...v1.117.0
|
[1.117.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.116.0...v1.117.0
|
||||||
[1.118.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.117.0...v1.118.0
|
[1.118.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.117.0...v1.118.0
|
||||||
|
[1.119.0]: https://github.com/deltachat/deltachat-core-rust/compare/v1.118.0...v1.119.0
|
||||||
|
[1.119.1]: https://github.com/deltachat/deltachat-core-rust/compare/v1.119.0...v1.119.1
|
||||||
|
|||||||
10
Cargo.lock
generated
10
Cargo.lock
generated
@@ -1105,7 +1105,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deltachat"
|
name = "deltachat"
|
||||||
version = "1.119.0"
|
version = "1.119.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ansi_term",
|
"ansi_term",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
@@ -1182,7 +1182,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deltachat-jsonrpc"
|
name = "deltachat-jsonrpc"
|
||||||
version = "1.119.0"
|
version = "1.119.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-channel",
|
"async-channel",
|
||||||
@@ -1206,7 +1206,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deltachat-repl"
|
name = "deltachat-repl"
|
||||||
version = "1.119.0"
|
version = "1.119.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ansi_term",
|
"ansi_term",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
@@ -1221,7 +1221,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deltachat-rpc-server"
|
name = "deltachat-rpc-server"
|
||||||
version = "1.119.0"
|
version = "1.119.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"deltachat",
|
"deltachat",
|
||||||
@@ -1246,7 +1246,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deltachat_ffi"
|
name = "deltachat_ffi"
|
||||||
version = "1.119.0"
|
version = "1.119.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"deltachat",
|
"deltachat",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "deltachat"
|
name = "deltachat"
|
||||||
version = "1.119.0"
|
version = "1.119.1"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
rust-version = "1.67"
|
rust-version = "1.67"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "deltachat_ffi"
|
name = "deltachat_ffi"
|
||||||
version = "1.119.0"
|
version = "1.119.1"
|
||||||
description = "Deltachat FFI"
|
description = "Deltachat FFI"
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "deltachat-jsonrpc"
|
name = "deltachat-jsonrpc"
|
||||||
version = "1.119.0"
|
version = "1.119.1"
|
||||||
description = "DeltaChat JSON-RPC API"
|
description = "DeltaChat JSON-RPC API"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
default-run = "deltachat-jsonrpc-server"
|
default-run = "deltachat-jsonrpc-server"
|
||||||
|
|||||||
@@ -55,5 +55,5 @@
|
|||||||
},
|
},
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"types": "dist/deltachat.d.ts",
|
"types": "dist/deltachat.d.ts",
|
||||||
"version": "1.119.0"
|
"version": "1.119.1"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "deltachat-repl"
|
name = "deltachat-repl"
|
||||||
version = "1.119.0"
|
version = "1.119.1"
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "deltachat-rpc-server"
|
name = "deltachat-rpc-server"
|
||||||
version = "1.119.0"
|
version = "1.119.1"
|
||||||
description = "DeltaChat JSON-RPC server"
|
description = "DeltaChat JSON-RPC server"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
|
|||||||
@@ -60,5 +60,5 @@
|
|||||||
"test:mocha": "mocha -r esm node/test/test.js --growl --reporter=spec --bail --exit"
|
"test:mocha": "mocha -r esm node/test/test.js --growl --reporter=spec --bail --exit"
|
||||||
},
|
},
|
||||||
"types": "node/dist/index.d.ts",
|
"types": "node/dist/index.d.ts",
|
||||||
"version": "1.119.0"
|
"version": "1.119.1"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
2023-08-03
|
2023-08-06
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::{HashMap, HashSet};
|
||||||
use std::future::Future;
|
use std::future::Future;
|
||||||
|
use std::path::Path;
|
||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
use std::str;
|
use std::str;
|
||||||
|
|
||||||
@@ -861,7 +862,7 @@ impl MimeMessage {
|
|||||||
is_related: bool,
|
is_related: bool,
|
||||||
) -> Result<bool> {
|
) -> Result<bool> {
|
||||||
let mut any_part_added = false;
|
let mut any_part_added = false;
|
||||||
let mimetype = get_mime_type(mail)?.0;
|
let mimetype = get_mime_type(mail, &get_attachment_filename(context, mail)?)?.0;
|
||||||
match (mimetype.type_(), mimetype.subtype().as_str()) {
|
match (mimetype.type_(), mimetype.subtype().as_str()) {
|
||||||
/* Most times, multipart/alternative contains true alternatives
|
/* Most times, multipart/alternative contains true alternatives
|
||||||
as text/plain and text/html. If we find a multipart/mixed
|
as text/plain and text/html. If we find a multipart/mixed
|
||||||
@@ -869,9 +870,9 @@ impl MimeMessage {
|
|||||||
apple mail: "plaintext" as an alternative to "html+PDF attachment") */
|
apple mail: "plaintext" as an alternative to "html+PDF attachment") */
|
||||||
(mime::MULTIPART, "alternative") => {
|
(mime::MULTIPART, "alternative") => {
|
||||||
for cur_data in &mail.subparts {
|
for cur_data in &mail.subparts {
|
||||||
if get_mime_type(cur_data)?.0 == "multipart/mixed"
|
let mime_type =
|
||||||
|| get_mime_type(cur_data)?.0 == "multipart/related"
|
get_mime_type(cur_data, &get_attachment_filename(context, cur_data)?)?.0;
|
||||||
{
|
if mime_type == "multipart/mixed" || mime_type == "multipart/related" {
|
||||||
any_part_added = self
|
any_part_added = self
|
||||||
.parse_mime_recursive(context, cur_data, is_related)
|
.parse_mime_recursive(context, cur_data, is_related)
|
||||||
.await?;
|
.await?;
|
||||||
@@ -881,7 +882,11 @@ impl MimeMessage {
|
|||||||
if !any_part_added {
|
if !any_part_added {
|
||||||
/* search for text/plain and add this */
|
/* search for text/plain and add this */
|
||||||
for cur_data in &mail.subparts {
|
for cur_data in &mail.subparts {
|
||||||
if get_mime_type(cur_data)?.0.type_() == mime::TEXT {
|
if get_mime_type(cur_data, &get_attachment_filename(context, cur_data)?)?
|
||||||
|
.0
|
||||||
|
.type_()
|
||||||
|
== mime::TEXT
|
||||||
|
{
|
||||||
any_part_added = self
|
any_part_added = self
|
||||||
.parse_mime_recursive(context, cur_data, is_related)
|
.parse_mime_recursive(context, cur_data, is_related)
|
||||||
.await?;
|
.await?;
|
||||||
@@ -1007,10 +1012,9 @@ impl MimeMessage {
|
|||||||
is_related: bool,
|
is_related: bool,
|
||||||
) -> Result<bool> {
|
) -> Result<bool> {
|
||||||
// return true if a part was added
|
// return true if a part was added
|
||||||
let (mime_type, msg_type) = get_mime_type(mail)?;
|
|
||||||
let raw_mime = mail.ctype.mimetype.to_lowercase();
|
|
||||||
|
|
||||||
let filename = get_attachment_filename(context, mail)?;
|
let filename = get_attachment_filename(context, mail)?;
|
||||||
|
let (mime_type, msg_type) = get_mime_type(mail, &filename)?;
|
||||||
|
let raw_mime = mail.ctype.mimetype.to_lowercase();
|
||||||
|
|
||||||
let old_part_count = self.parts.len();
|
let old_part_count = self.parts.len();
|
||||||
|
|
||||||
@@ -1865,7 +1869,10 @@ pub struct Part {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// return mimetype and viewtype for a parsed mail
|
/// return mimetype and viewtype for a parsed mail
|
||||||
fn get_mime_type(mail: &mailparse::ParsedMail<'_>) -> Result<(Mime, Viewtype)> {
|
fn get_mime_type(
|
||||||
|
mail: &mailparse::ParsedMail<'_>,
|
||||||
|
filename: &Option<String>,
|
||||||
|
) -> Result<(Mime, Viewtype)> {
|
||||||
let mimetype = mail.ctype.mimetype.parse::<Mime>()?;
|
let mimetype = mail.ctype.mimetype.parse::<Mime>()?;
|
||||||
|
|
||||||
let viewtype = match mimetype.type_() {
|
let viewtype = match mimetype.type_() {
|
||||||
@@ -1901,7 +1908,16 @@ fn get_mime_type(mail: &mailparse::ParsedMail<'_>) -> Result<(Mime, Viewtype)> {
|
|||||||
Viewtype::Unknown
|
Viewtype::Unknown
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mime::APPLICATION => Viewtype::File,
|
mime::APPLICATION => match mimetype.subtype() {
|
||||||
|
mime::OCTET_STREAM => match filename {
|
||||||
|
Some(filename) => match message::guess_msgtype_from_suffix(Path::new(&filename)) {
|
||||||
|
Some((viewtype, _)) => viewtype,
|
||||||
|
None => Viewtype::File,
|
||||||
|
},
|
||||||
|
None => Viewtype::File,
|
||||||
|
},
|
||||||
|
_ => Viewtype::File,
|
||||||
|
},
|
||||||
_ => Viewtype::Unknown,
|
_ => Viewtype::Unknown,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3756,4 +3772,22 @@ Content-Disposition: reaction\n\
|
|||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||||
|
async fn test_jpeg_as_application_octet_stream() -> Result<()> {
|
||||||
|
let context = TestContext::new_alice().await;
|
||||||
|
let raw = include_bytes!("../test-data/message/jpeg-as-application-octet-stream.eml");
|
||||||
|
|
||||||
|
let msg = MimeMessage::from_bytes(&context.ctx, &raw[..], None)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(msg.parts.len(), 1);
|
||||||
|
assert_eq!(msg.parts[0].typ, Viewtype::Image);
|
||||||
|
|
||||||
|
receive_imf(&context, &raw[..], false).await?;
|
||||||
|
let msg = context.get_last_msg().await;
|
||||||
|
assert_eq!(msg.get_viewtype(), Viewtype::Image);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2568,4 +2568,42 @@ sth_for_the = "future""#
|
|||||||
);
|
);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Tests extensibility of WebXDC updates.
|
||||||
|
///
|
||||||
|
/// If an update sent by WebXDC contains unknown properties,
|
||||||
|
/// such as `aNewUnknownProperty` or a reserved property
|
||||||
|
/// like `serial` or `max_serial`,
|
||||||
|
/// they are silently dropped and are not sent over the wire.
|
||||||
|
///
|
||||||
|
/// This ensures new WebXDC can try to send new properties
|
||||||
|
/// added in later revisions of the WebXDC API
|
||||||
|
/// and this will not result in a failure to send the whole update.
|
||||||
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||||
|
async fn test_send_webxdc_status_update_extensibility() -> Result<()> {
|
||||||
|
let alice = TestContext::new_alice().await;
|
||||||
|
let bob = TestContext::new_bob().await;
|
||||||
|
let alice_chat = alice.create_chat(&bob).await;
|
||||||
|
let alice_instance = send_webxdc_instance(&alice, alice_chat.id).await?;
|
||||||
|
|
||||||
|
let bob_instance = bob.recv_msg(&alice.pop_sent_msg().await).await;
|
||||||
|
|
||||||
|
alice
|
||||||
|
.send_webxdc_status_update(
|
||||||
|
alice_instance.id,
|
||||||
|
r#"{"payload":"p","info":"i","aNewUnknownProperty":"x","max_serial":123}"#,
|
||||||
|
"Some description",
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
alice.flush_status_updates().await?;
|
||||||
|
bob.recv_msg(&alice.pop_sent_msg().await).await;
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
bob.get_webxdc_status_updates(bob_instance.id, StatusUpdateSerial(0))
|
||||||
|
.await?,
|
||||||
|
r#"[{"payload":"p","info":"i","serial":1,"max_serial":1}]"#
|
||||||
|
);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
76
test-data/message/jpeg-as-application-octet-stream.eml
Normal file
76
test-data/message/jpeg-as-application-octet-stream.eml
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
X-Mozilla-Status: 0801
|
||||||
|
X-Mozilla-Status2: 10000000
|
||||||
|
Content-Type: multipart/mixed; boundary="------------L1v4sF5IlAZ0HirXymXElgpK"
|
||||||
|
Message-ID: <1e3b3bb0-f34f-71e2-6b86-bce80bef2c6f@example.org>
|
||||||
|
Date: Thu, 3 Aug 2023 13:31:01 -0300
|
||||||
|
MIME-Version: 1.0
|
||||||
|
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101
|
||||||
|
Thunderbird/102.13.0
|
||||||
|
Content-Language: en-US
|
||||||
|
To: bob@example.net
|
||||||
|
From: Alice <alice@example.org>
|
||||||
|
X-Identity-Key: id3
|
||||||
|
Fcc: imap://alice%40example.org@in.example.org/Sent
|
||||||
|
|
||||||
|
This is a multi-part message in MIME format.
|
||||||
|
--------------L1v4sF5IlAZ0HirXymXElgpK
|
||||||
|
Content-Type: text/plain; charset=UTF-8; format=flowed
|
||||||
|
Content-Transfer-Encoding: 7bit
|
||||||
|
|
||||||
|
|
||||||
|
--------------L1v4sF5IlAZ0HirXymXElgpK
|
||||||
|
Content-Type: application/octet-stream; name="rusty_deltachat_logo.jpeg"
|
||||||
|
Content-Disposition: attachment; filename="rusty_deltachat_logo.jpeg"
|
||||||
|
Content-Transfer-Encoding: base64
|
||||||
|
|
||||||
|
/9j/4AAQSkZJRgABAQIAzADMAAD/2wBDAP//////////////////////////////////////
|
||||||
|
////////////////////////////////////////////////2wBDAf//////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////wAAR
|
||||||
|
CAEAAQADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA
|
||||||
|
AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK
|
||||||
|
FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG
|
||||||
|
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl
|
||||||
|
5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA
|
||||||
|
AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk
|
||||||
|
NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
|
||||||
|
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk
|
||||||
|
5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCSiiigAooooAKKKKACiiigAooprHAzQA6i
|
||||||
|
mhgfY0McA0AAYGnVX6U/efagA3Hdnt6VL15qvS5OMZ4oAUt82R26f596lByM1BSgkcA0APZ+
|
||||||
|
eO3X3qSq9PV8DBoAl6UVCzZ+lPQ8fSgB9FFICD0oAWiiigAooooAKKKKACiiigAooooAKKKK
|
||||||
|
ACiiigApCcDNLTH6UAKGB9j6UjkYx3qKigAooooAKKKKACiiigAooooAKKKKAClBI6UlFACk
|
||||||
|
k9akTofrUVKCR0oAnoqEuT7fSnp0P1oAfRRRQAUUUUAFFFFABRRRQAUUUUAFIwyDTd496QuM
|
||||||
|
cUAMBI6GkJJ60UUAFFFFABRSqMmpgAOlAEYQnrxTtg96fSEgdTQAmxfT+dLtX0FJvX1o3r6/
|
||||||
|
zoAXavoKTYvp/OlBB6GloAZsHvTSh7HNS0UAQEEdRSVYqNk7j8qAI6KKKACnq2ODTKKAJS47
|
||||||
|
CnDkA1AOtWKACiiigAooooAKKKKACimscDOM03zPb9f/AK1ADXGD9eabSk5OTSUAFFFFABRR
|
||||||
|
RQBMowB7806kXoPpQeh+hoAjZ+w/OmUUUAFFFFABTw/r+dMooAsdaKhDEfT0qUEHkUALRRRQ
|
||||||
|
BG69x+NR1O33T9KgoAKKKKACnBiBim0UASKSTyeKkpiYwfWn0AFFFFABRRTWbb2zQA4jPFV6
|
||||||
|
eX46Y/GmUAFFFFABRRRQAUUUUASIe35VJVepVbPB6/zoAay45HT+VMqxTCgPTg0ARUUpBHWk
|
||||||
|
oAKKKKAClBI6UlFAEocd+KXevr+hqGigBzNn6U2iigAooooAKKKKAAEjpTgWJxk02pExk+tA
|
||||||
|
ElFFFABSEZGKCQOtNLjtzQBF0ooooAKKKKACiiigAooooAKKKKAJFfsfz/xqSq9OViPcUATY
|
||||||
|
z1qMp6flTwQelLQBX6UVOQD1qMoR05/nQAyiiigAooooAKKKKACiiigAooooAKAcdKKKAHBm
|
||||||
|
+tTUxAMZ70+gBCARioSCDzU+cdahY5PHagBtFFFABRRRQAUUUUAFFFFABRRRQAUUdelPCHvx
|
||||||
|
QA0EjpUqsD9fSkCD3NOCgdqAFooooAaVB+vrURUj/Gp6KAK9FSMncfl/hUdABRRRQAUUUUAF
|
||||||
|
FFFABRRRQA4MR0p6tnjHNRgZOKmCgUARsp69R/KmVYqA9Tj1oASiiigAooooAKKKKACiilAJ
|
||||||
|
4FACVIE9fypwUD6+tOoAQADpS0UhIHJoAWkLAdTUZcnpwKZQBIXHYUB+eelR0UAWKKiRux/C
|
||||||
|
paACmMueR1/nT6KAK9FSsueR1/nUVABRRRQAUUUUAFFFFACg4OalDA+31qGpFTufyoAazE8d
|
||||||
|
B6U2pyAetQsMEigBKKKKACiiigAooooABzxU4GBTEHf8qkoAKKKKADpUDHJ/lT3Pb8TUdABR
|
||||||
|
RRQAUUUUAFTKcj3FQ05Tg/pQBNRRRQAVE4wc9j/OpaQjIIoAgooooAKKKKACiiigBRwQanqv
|
||||||
|
T03Z9vegB7Nj61DUxUGmMuKAGUUUUAFFFFABRRSr1H1oAmAwAKWiigAooooAgY5JpKKKACii
|
||||||
|
igAooooAKKKKAJwcgGlpifdp9ABRRRQBCwwx/Om09+o+lMoAKKKKACiiigCRB1qSoAcHNTA5
|
||||||
|
GaAFqJ2zwPxqWo9h9aAI6KUjBwaSgAooooAKcv3hTaUdR9aAJ6KKKACkPQ/Q0tFAFeiiigAo
|
||||||
|
oooAKKKKACiiigCVOh+v9BT6an3adQAUUUUARP1H0plOc5Y/lTaACiiigApVGSBSUdOaAJ8D
|
||||||
|
0FLSA5GaWgAoooPTjrQBE5yfpTKfsb2ppBBwaAEooooAKKKKAJ1OQDS1Ehwcev8AOpaACiii
|
||||||
|
gCAjBP1pKe45z60ygAooooAKKKKACiinIMn2FAEoGABS0UUAFITgZpaidsnHYUAMooooAKKK
|
||||||
|
KACpti+n6moalVs8Hr/OgBwGOBS0UUAFFFFABUb9hUlRlCSTkUAR0U8oQM9aZQAUUUUAFSq2
|
||||||
|
eD1/nUVFAFiimK2eD1/nT6AEIyMVCQQcGp6QgHrQBBRTyh7c03afQ0AJRS7T6GnBD34oAaAS
|
||||||
|
cCpgMDFAAHSloAKKKjZ+w/P/AAoAGbsPxqOiigAooooAKKKKAFUZOKlCgf41EDg5FSBwevFA
|
||||||
|
D6KKKACiiigAooooAQnAJqCpyMjFIEUds/WgCGinuoHI/KmUAFFFFABTw5HXn+dMooAnBB6G
|
||||||
|
lqvTgxHegCaiot59BS+Z7frQBJRUfme1JvPsKAJaaXA96iJJ6mkoAcWJ+npTaKKACiiigAoo
|
||||||
|
ooAKKKKACpVXHJ61FUocYGetAD6KQEHoaWgAooooAKKKKACiiigBj9B9aaEJ68VLRQBAQR1p
|
||||||
|
KlfoPrTApNADaKUgjrSUAFFFFABRRRQAUUUUAFFFFABRRSkEdRQAlFKBkgVKUGOOKAIaKXBz
|
||||||
|
ipto9BQBBRQRg4p+w4z39KAGUUUUASouOe5/lT6QHIzS0AFFFFABRRRQAUUUUAFFFFACEA9a
|
||||||
|
WiigBr/d+lRqufpU1FAEbJgZFR1YqNU557dKAG7W9KbVioip3YHegBoBPQUlTgYGKay55HX+
|
||||||
|
dADFXdSshHPWnqMD3p1AESdfwqWkAA6d6WgBgQA5H5U+iigBMDOe9LRRQAm0ZzS0UUARFTu9
|
||||||
|
jzmpNoxjFLRQAgGOlLRRQB//2Q==
|
||||||
|
|
||||||
|
--------------L1v4sF5IlAZ0HirXymXElgpK--
|
||||||
Reference in New Issue
Block a user