Commit c8feaa91 authored by Cristian Greco's avatar Cristian Greco

Imported Upstream version 2.2.6

parent f494083d
...@@ -60,6 +60,7 @@ Images Authors: ...@@ -60,6 +60,7 @@ Images Authors:
Translations authors: Translations authors:
* files: src/lang/*.ts * files: src/lang/*.ts
copyright: copyright:
- Arabic: SDERAWI (abz8868@msn.com) and sn51234 (nesseyan@gmail.com)
- Brazilian: Nick Marinho (nickmarinho@gmail.com) - Brazilian: Nick Marinho (nickmarinho@gmail.com)
- Bulgarian: Tsvetan & Boyko Bankoff (emerge_life@users.sourceforge.net) - Bulgarian: Tsvetan & Boyko Bankoff (emerge_life@users.sourceforge.net)
- Catalan: Francisco Luque Contreras (frannoe@ya.com) - Catalan: Francisco Luque Contreras (frannoe@ya.com)
......
* Sun Apr 18 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.2.6
- BUGFIX: Announce to all trackers at once
- BUGFIX: Added support for single-thread boost
- BUGFIX: Remove old folder when moving a torrent
- BUGFIX: Improved reliability of torrent moving
- BUGFIX: Stop rechecking torrents when they are moved
- BUGFIX: Status filters height stays correct when the visual style changes
- I18N: Added Arabic translation
* Wed Apr 07 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.2.5 * Wed Apr 07 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.2.5
- BUGFIX: Fix crash when adding a new torrent label - BUGFIX: Fix crash when adding a new torrent label
- BUGFIX: Fix HTTPS protocol support in torrent/rss downloader - BUGFIX: Fix HTTPS protocol support in torrent/rss downloader
......
qBittorrent - A BitTorrent client in Qt4
------------------------------------------
This is the eComStation (OS/2) qBittorrent part of the readme. See also README for more general information.
Building qBittorrent
********************
Requirements
============
- gcc based build env (recommended gcc v4.4.2 or greater)
- Qt4 for eCS (OS/2) dev package (see http://svn.netlabs.org/qt4 for more information)
- libtorrent-rasterbar for eCS (OS/2) port (see http://svn.netlabs.org/ports for more information)
- boost for eCS (OS/2) port (see http://svn.netlabs.org/ports for more information)
How to build
============
First you need to create the conf.pri file in the same dir as this readme.os2 is.
the conf.pri file has the following content:
##### conf.pri content beginn #####
PREFIX = .
BINDIR = ./bin
INCDIR = ./include
LIBDIR = ./lib
DATADIR = ./share
CONFIG += staticlib
INCLUDEPATH += x:/trees/libtorrent/trunk/include
LIBS += -Lx:/trees/libtorrent/trunk/src/.libs \
-Lx:/trees/boost/trunk/stage/lib \
-Lx:/trees/openssl \
-Lx:/extras/lib
##### conf.pri content end #####
Of course all the above path references have to be adjusted to your build env.
It should now be easy to build qBittorrent:
Simply type:
$ qmake
Followed by:
$ make
If all works fine you should get a working qbittorrent executable.
If you have any question regarding the eCS (OS/2) port of qBittorrent you can meet me (_diver) on IRC:
#netlabs on irc.freenode.net
------------------------------------------
Silvan Scherrer <silvan.scherrer@aroa.ch>
...@@ -376,7 +376,9 @@ public: ...@@ -376,7 +376,9 @@ public:
//conf->doCommand("pkg-config", params, &staticlibs); //conf->doCommand("pkg-config", params, &staticlibs);
//conf->addLib(staticlibs.trimmed()); //conf->addLib(staticlibs.trimmed());
//libcrypto //libcrypto
conf->addLib("-lcrypto"); if(conf->getenv("QC_DISABLE_GUI").isEmpty()) {
conf->addLib("-lcrypto");
}
return true; return true;
} }
}; };
...@@ -405,6 +407,16 @@ public: ...@@ -405,6 +407,16 @@ public:
name = result.first().mid(3); name = result.first().mid(3);
// Remove .so // Remove .so
name.chop(3); name.chop(3);
} else {
// Fall back to non -mt boost lib
filters.clear();
filters << "libboost_"+lib+"*.so";
result = libDir.entryList(filters, QDir::Files);
if(!result.empty()) {
name = result.first().mid(3);
// Remove .so
name.chop(3);
}
} }
return name; return name;
} }
...@@ -452,11 +464,13 @@ public: ...@@ -452,11 +464,13 @@ public:
// Find library // Find library
s = conf->getenv("QC_WITH_LIBBOOST_LIB"); s = conf->getenv("QC_WITH_LIBBOOST_LIB");
QStringList required_libs; QStringList required_libs;
required_libs
#if BOOST_VERSION >= 103500 #if BOOST_VERSION >= 103500
<< "system" required_libs << "system";
#endif #endif
<< "filesystem" << "thread"; if(conf->getenv("QC_DISABLE_GUI").isEmpty()) {
// Not required by nox
required_libs << "filesystem" << "thread";
}
QStringList libDirs; QStringList libDirs;
libDirs << "/usr/lib/" << "/usr/lib64/" << "/usr/local/lib/" << "/usr/local/lib64/"; libDirs << "/usr/lib/" << "/usr/lib64/" << "/usr/local/lib/" << "/usr/local/lib64/";
foreach(const QString& lib, required_libs) { foreach(const QString& lib, required_libs) {
......
...@@ -22,6 +22,16 @@ public: ...@@ -22,6 +22,16 @@ public:
name = result.first().mid(3); name = result.first().mid(3);
// Remove .so // Remove .so
name.chop(3); name.chop(3);
} else {
// Fall back to non -mt boost lib
filters.clear();
filters << "libboost_"+lib+"*.so";
result = libDir.entryList(filters, QDir::Files);
if(!result.empty()) {
name = result.first().mid(3);
// Remove .so
name.chop(3);
}
} }
return name; return name;
} }
...@@ -69,11 +79,13 @@ public: ...@@ -69,11 +79,13 @@ public:
// Find library // Find library
s = conf->getenv("QC_WITH_LIBBOOST_LIB"); s = conf->getenv("QC_WITH_LIBBOOST_LIB");
QStringList required_libs; QStringList required_libs;
required_libs
#if BOOST_VERSION >= 103500 #if BOOST_VERSION >= 103500
<< "system" required_libs << "system";
#endif #endif
<< "filesystem" << "thread"; if(conf->getenv("QC_DISABLE_GUI").isEmpty()) {
// Not required by nox
required_libs << "filesystem" << "thread";
}
QStringList libDirs; QStringList libDirs;
libDirs << "/usr/lib/" << "/usr/lib64/" << "/usr/local/lib/" << "/usr/local/lib64/"; libDirs << "/usr/lib/" << "/usr/lib64/" << "/usr/local/lib/" << "/usr/local/lib64/";
foreach(const QString& lib, required_libs) { foreach(const QString& lib, required_libs) {
......
...@@ -34,7 +34,9 @@ public: ...@@ -34,7 +34,9 @@ public:
//conf->doCommand("pkg-config", params, &staticlibs); //conf->doCommand("pkg-config", params, &staticlibs);
//conf->addLib(staticlibs.trimmed()); //conf->addLib(staticlibs.trimmed());
//libcrypto //libcrypto
conf->addLib("-lcrypto"); if(conf->getenv("QC_DISABLE_GUI").isEmpty()) {
conf->addLib("-lcrypto");
}
return true; return true;
} }
}; };
This diff was suppressed by a .gitattributes entry.
[Desktop Entry] [Desktop Entry]
Categories=Qt;Network;P2P; Categories=Qt;Network;P2P;
Comment=V2.2.5 Comment=V2.2.6
Exec=qbittorrent %f Exec=qbittorrent %f
GenericName=Bittorrent client GenericName=Bittorrent client
GenericName[bg]=Торент клиент GenericName[bg]=Торент клиент
......
This diff was suppressed by a .gitattributes entry.
...@@ -62,7 +62,8 @@ class about : public QDialog, private Ui::AboutDlg{ ...@@ -62,7 +62,8 @@ class about : public QDialog, private Ui::AboutDlg{
te_translation->append(QString::fromUtf8("<a name='top'></a>")); te_translation->append(QString::fromUtf8("<a name='top'></a>"));
te_translation->append(tr("I would like to thank the following people who volunteered to translate qBittorrent:")+QString::fromUtf8("<br>")); te_translation->append(tr("I would like to thank the following people who volunteered to translate qBittorrent:")+QString::fromUtf8("<br>"));
te_translation->append(QString::fromUtf8( te_translation->append(QString::fromUtf8(
"<i>- <u>Brazilian:</u> Nick Marinho (nickmarinho@gmail.com)<br>\ "<i><u>Arabic:</u> SDERAWI (abz8868@msn.com) and sn51234 (nesseyan@gmail.com)<br>\
- <u>Brazilian:</u> Nick Marinho (nickmarinho@gmail.com)<br>\
- <u>Bulgarian:</u> Tsvetan & Boyko Bankoff (emerge_life@users.sourceforge.net)<br>\ - <u>Bulgarian:</u> Tsvetan & Boyko Bankoff (emerge_life@users.sourceforge.net)<br>\
- <u>Catalan:</u> Francisco Luque Contreras (frannoe@ya.com)<br>\ - <u>Catalan:</u> Francisco Luque Contreras (frannoe@ya.com)<br>\
- <u>Chinese (Simplified):</u> Guo Yue (yue.guo0418@gmail.com)<br>\ - <u>Chinese (Simplified):</u> Guo Yue (yue.guo0418@gmail.com)<br>\
......
...@@ -421,6 +421,7 @@ void Bittorrent::configureSession() { ...@@ -421,6 +421,7 @@ void Bittorrent::configureSession() {
//sessionSettings.announce_to_all_trackers = true; //sessionSettings.announce_to_all_trackers = true;
sessionSettings.auto_scrape_interval = 1200; // 20 minutes sessionSettings.auto_scrape_interval = 1200; // 20 minutes
#ifdef LIBTORRENT_0_15 #ifdef LIBTORRENT_0_15
sessionSettings.announce_to_all_trackers = true;
sessionSettings.announce_to_all_tiers = true; //uTorrent behavior sessionSettings.announce_to_all_tiers = true; //uTorrent behavior
sessionSettings.auto_scrape_min_interval = 900; // 15 minutes sessionSettings.auto_scrape_min_interval = 900; // 15 minutes
#endif #endif
...@@ -1651,12 +1652,10 @@ void Bittorrent::addConsoleMessage(QString msg, QString) { ...@@ -1651,12 +1652,10 @@ void Bittorrent::addConsoleMessage(QString msg, QString) {
} else { } else {
new_save_path = old_dir.absoluteFilePath(new_label); new_save_path = old_dir.absoluteFilePath(new_label);
} }
TorrentPersistentData::saveSavePath(h.hash(), new_save_path);
if(move_storage) { if(move_storage) {
// Move storage // Move storage
h.move_storage(new_save_path); h.move_storage(new_save_path);
} }
emit savePathChanged(h);
} }
void Bittorrent::appendLabelToTorrentSavePath(QTorrentHandle h) { void Bittorrent::appendLabelToTorrentSavePath(QTorrentHandle h) {
...@@ -1668,12 +1667,10 @@ void Bittorrent::addConsoleMessage(QString msg, QString) { ...@@ -1668,12 +1667,10 @@ void Bittorrent::addConsoleMessage(QString msg, QString) {
const QDir old_dir(old_save_path); const QDir old_dir(old_save_path);
if(old_dir.dirName() != label) { if(old_dir.dirName() != label) {
const QString &new_save_path = old_dir.absoluteFilePath(label); const QString &new_save_path = old_dir.absoluteFilePath(label);
TorrentPersistentData::saveSavePath(h.hash(), new_save_path);
if(old_dir == QDir(h.save_path())) { if(old_dir == QDir(h.save_path())) {
// Move storage // Move storage
h.move_storage(new_save_path); h.move_storage(new_save_path);
} }
emit savePathChanged(h);
} }
} }
...@@ -1964,8 +1961,17 @@ void Bittorrent::addConsoleMessage(QString msg, QString) { ...@@ -1964,8 +1961,17 @@ void Bittorrent::addConsoleMessage(QString msg, QString) {
} }
else if (storage_moved_alert* p = dynamic_cast<storage_moved_alert*>(a.get())) { else if (storage_moved_alert* p = dynamic_cast<storage_moved_alert*>(a.get())) {
QTorrentHandle h(p->handle); QTorrentHandle h(p->handle);
if(h.is_valid()) if(h.is_valid()) {
h.force_recheck(); //XXX: Required by libtorrent for now // Attempt to remove old folder if empty
const QString& old_save_path = TorrentPersistentData::getSavePath(h.hash());
const QString new_save_path = QString(p->path.c_str());
qDebug("Torrent moved from %s to %s", qPrintable(old_save_path), qPrintable(new_save_path));
qDebug("Attempting to remove %s", qPrintable(old_save_path));
QDir().rmpath(old_save_path);
TorrentPersistentData::saveSavePath(h.hash(), new_save_path);
emit savePathChanged(h);
//h.force_recheck();
}
} }
else if (metadata_received_alert* p = dynamic_cast<metadata_received_alert*>(a.get())) { else if (metadata_received_alert* p = dynamic_cast<metadata_received_alert*>(a.get())) {
QTorrentHandle h(p->handle); QTorrentHandle h(p->handle);
......
...@@ -42,7 +42,9 @@ enum ProxyType {HTTP=1, SOCKS5=2, HTTP_PW=3, SOCKS5_PW=4, SOCKS4=5}; ...@@ -42,7 +42,9 @@ enum ProxyType {HTTP=1, SOCKS5=2, HTTP_PW=3, SOCKS5_PW=4, SOCKS4=5};
downloadThread::downloadThread(QObject* parent) : QObject(parent) { downloadThread::downloadThread(QObject* parent) : QObject(parent) {
networkManager = new QNetworkAccessManager(this); networkManager = new QNetworkAccessManager(this);
connect(networkManager, SIGNAL(finished (QNetworkReply*)), this, SLOT(processDlFinished(QNetworkReply*))); connect(networkManager, SIGNAL(finished (QNetworkReply*)), this, SLOT(processDlFinished(QNetworkReply*)));
#ifndef QT_NO_OPENSSL
connect(networkManager, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)), this, SLOT(ignoreSslErrors(QNetworkReply*,QList<QSslError>))); connect(networkManager, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)), this, SLOT(ignoreSslErrors(QNetworkReply*,QList<QSslError>)));
#endif
} }
downloadThread::~downloadThread(){ downloadThread::~downloadThread(){
...@@ -215,8 +217,10 @@ QString downloadThread::errorCodeToString(QNetworkReply::NetworkError status) { ...@@ -215,8 +217,10 @@ QString downloadThread::errorCodeToString(QNetworkReply::NetworkError status) {
} }
} }
#ifndef QT_NO_OPENSSL
void downloadThread::ignoreSslErrors(QNetworkReply* reply,QList<QSslError> errors) { void downloadThread::ignoreSslErrors(QNetworkReply* reply,QList<QSslError> errors) {
Q_UNUSED(errors) Q_UNUSED(errors)
// Ignore all SSL errors // Ignore all SSL errors
reply->ignoreSslErrors(); reply->ignoreSslErrors();
} }
#endif
...@@ -63,7 +63,9 @@ protected: ...@@ -63,7 +63,9 @@ protected:
protected slots: protected slots:
void processDlFinished(QNetworkReply* reply); void processDlFinished(QNetworkReply* reply);
void checkDownloadSize(qint64 bytesReceived, qint64 bytesTotal); void checkDownloadSize(qint64 bytesReceived, qint64 bytesTotal);
#ifndef QT_NO_OPENSSL
void ignoreSslErrors(QNetworkReply*,QList<QSslError>); void ignoreSslErrors(QNetworkReply*,QList<QSslError>);
#endif
}; };
......
...@@ -188,6 +188,7 @@ public: ...@@ -188,6 +188,7 @@ public:
if(iso[1] == 'S') return QIcon(":/Icons/flags/serbia.png"); if(iso[1] == 'S') return QIcon(":/Icons/flags/serbia.png");
break; break;
case 'S': case 'S':
if(iso[1] == 'A') return QIcon(":/Icons/flags/saoudi_arabia.png");
if(iso[1] == 'E') return QIcon(":/Icons/flags/sweden.png"); if(iso[1] == 'E') return QIcon(":/Icons/flags/sweden.png");
if(iso[1] == 'K') return QIcon(":/Icons/flags/slovakia.png"); if(iso[1] == 'K') return QIcon(":/Icons/flags/slovakia.png");
if(iso[1] == 'G') return QIcon(":/Icons/flags/singapore.png"); if(iso[1] == 'G') return QIcon(":/Icons/flags/singapore.png");
......
...@@ -121,6 +121,7 @@ ...@@ -121,6 +121,7 @@
<file>Icons/flags/egypt.png</file> <file>Icons/flags/egypt.png</file>
<file>Icons/flags/italy.png</file> <file>Icons/flags/italy.png</file>
<file>Icons/flags/south_korea.png</file> <file>Icons/flags/south_korea.png</file>
<file>Icons/flags/saoudi_arabia.png</file>
<file>Icons/flags/bosnia.png</file> <file>Icons/flags/bosnia.png</file>
<file>Icons/flags/japan.png</file> <file>Icons/flags/japan.png</file>
<file>Icons/flags/malaysia.png</file> <file>Icons/flags/malaysia.png</file>
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
<file>lang/qbittorrent_sv.qm</file> <file>lang/qbittorrent_sv.qm</file>
<file>lang/qbittorrent_pl.qm</file> <file>lang/qbittorrent_pl.qm</file>
<file>lang/qbittorrent_it.qm</file> <file>lang/qbittorrent_it.qm</file>
<file>lang/qbittorrent_ar.qm</file>
<file>lang/qbittorrent_ko.qm</file> <file>lang/qbittorrent_ko.qm</file>
<file>lang/qbittorrent_en.qm</file> <file>lang/qbittorrent_en.qm</file>
<file>lang/qbittorrent_ro.qm</file> <file>lang/qbittorrent_ro.qm</file>
......
This diff was suppressed by a .gitattributes entry.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -231,6 +231,14 @@ int main(int argc, char *argv[]){ ...@@ -231,6 +231,14 @@ int main(int argc, char *argv[]){
qDebug("%s locale unrecognized, using default (en_GB).", qPrintable(locale)); qDebug("%s locale unrecognized, using default (en_GB).", qPrintable(locale));
} }
app->installTranslator(&translator); app->installTranslator(&translator);
#ifndef DISABLE_GUI
if(locale.startsWith("ar")) {
qDebug("Right to Left mode");
app->setLayoutDirection(Qt::RightToLeft);
} else {
app->setLayoutDirection(Qt::LeftToRight);
}
#endif
app->setApplicationName(QString::fromUtf8("qBittorrent")); app->setApplicationName(QString::fromUtf8("qBittorrent"));
// Check for executable parameters // Check for executable parameters
......
...@@ -108,6 +108,8 @@ options_imp::options_imp(QWidget *parent):QDialog(parent){ ...@@ -108,6 +108,8 @@ options_imp::options_imp(QWidget *parent):QDialog(parent){
locales << "ro_RO"; locales << "ro_RO";
comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/turkey.png"))), QString::fromUtf8("Türkçe")); comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/turkey.png"))), QString::fromUtf8("Türkçe"));
locales << "tr_TR"; locales << "tr_TR";
comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/saoudi_arabia.png"))), QString::fromUtf8("عربي"));
locales << "ar_SA";
comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/greece.png"))), QString::fromUtf8("Ελληνικά")); comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/greece.png"))), QString::fromUtf8("Ελληνικά"));
locales << "el_GR"; locales << "el_GR";
comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/sweden.png"))), QString::fromUtf8("Svenska")); comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/sweden.png"))), QString::fromUtf8("Svenska"));
......
...@@ -11,10 +11,10 @@ CONFIG += qt \ ...@@ -11,10 +11,10 @@ CONFIG += qt \
thread thread
# Update this VERSION for each release # Update this VERSION for each release
DEFINES += VERSION=\'\"v2.2.5\"\' DEFINES += VERSION=\'\"v2.2.6\"\'
DEFINES += VERSION_MAJOR=2 DEFINES += VERSION_MAJOR=2
DEFINES += VERSION_MINOR=2 DEFINES += VERSION_MINOR=2
DEFINES += VERSION_BUGFIX=5 DEFINES += VERSION_BUGFIX=6
# NORMAL,ALPHA,BETA,RELEASE_CANDIDATE,DEVEL # NORMAL,ALPHA,BETA,RELEASE_CANDIDATE,DEVEL
DEFINES += VERSION_TYPE=NORMAL DEFINES += VERSION_TYPE=NORMAL
...@@ -194,7 +194,8 @@ TRANSLATIONS = $$LANG_PATH/qbittorrent_fr.ts \ ...@@ -194,7 +194,8 @@ TRANSLATIONS = $$LANG_PATH/qbittorrent_fr.ts \
$$LANG_PATH/qbittorrent_hu.ts \ $$LANG_PATH/qbittorrent_hu.ts \
$$LANG_PATH/qbittorrent_pt_BR.ts \ $$LANG_PATH/qbittorrent_pt_BR.ts \
$$LANG_PATH/qbittorrent_cs.ts \ $$LANG_PATH/qbittorrent_cs.ts \
$$LANG_PATH/qbittorrent_sr.ts $$LANG_PATH/qbittorrent_sr.ts \
$$LANG_PATH/qbittorrent_ar.ts
# Source code # Source code
HEADERS += misc.h \ HEADERS += misc.h \
......
...@@ -144,12 +144,32 @@ protected: ...@@ -144,12 +144,32 @@ protected:
} }
}; };
class StatusFiltersWidget : public QListWidget {
public:
StatusFiltersWidget(QWidget *parent) : QListWidget(parent) {
setFixedHeight(100);
}
protected:
void changeEvent(QEvent *e) {
QListWidget::changeEvent(e);
switch (e->type()) {
case QEvent::StyleChange:
setSpacing(0);
setFixedHeight(100);
break;
default:
break;
}
}
};
class TransferListFiltersWidget: public QFrame { class TransferListFiltersWidget: public QFrame {
Q_OBJECT Q_OBJECT
private: private:
QHash<QString, int> customLabels; QHash<QString, int> customLabels;
QListWidget* statusFilters; StatusFiltersWidget* statusFilters;
LabelFiltersList* labelFilters; LabelFiltersList* labelFilters;
QVBoxLayout* vLayout; QVBoxLayout* vLayout;
TransferListWidget *transferList; TransferListWidget *transferList;
...@@ -160,7 +180,7 @@ public: ...@@ -160,7 +180,7 @@ public:
TransferListFiltersWidget(QWidget *parent, TransferListWidget *transferList): QFrame(parent), transferList(transferList), nb_labeled(0), nb_torrents(0) { TransferListFiltersWidget(QWidget *parent, TransferListWidget *transferList): QFrame(parent), transferList(transferList), nb_labeled(0), nb_torrents(0) {
// Construct lists // Construct lists
vLayout = new QVBoxLayout(); vLayout = new QVBoxLayout();
statusFilters = new QListWidget(this); statusFilters = new StatusFiltersWidget(this);
vLayout->addWidget(statusFilters); vLayout->addWidget(statusFilters);
labelFilters = new LabelFiltersList(this); labelFilters = new LabelFiltersList(this);
vLayout->addWidget(labelFilters); vLayout->addWidget(labelFilters);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment