рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рдХреНрдпреВрдЯреА: рд╣рдордиреЗ рдПрдХ рд▓реЗрдЦрдХ рдзреНрдпрд╛рди рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рдЬреАрд╡рди рдХреИрд╕реЗ рджрд┐рдпрд╛

рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЧреАрддрд╛рддреНрдордХ рдкрд░рд┐рдЪрдп - 2017 рдореЗрдВ, рдореИрдВ рдзреНрдпрд╛рди рдореЗрдВ рдмрд╣реБрдд рдмрд╛рд░реАрдХреА рд╕реЗ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд▓рдЧрд╛ред рдпрд╣ рдШрдЯрдирд╛рдУрдВ рдХреА рдПрдХ рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рджреНрд╡рд╛рд░рд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдереА, рдЕрдиреБрдХреВрд▓ рдФрд░ рдмрд╣реБрдд рдирд╣реАрдВред рдХрдИ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдореБрдЭреЗ рдЖрдХрд░реНрд╖рдХ рд╕рдкрдиреЗ рджреЗрдЦрдиреЗ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдореБрдЭреЗ рдЙрдирдХреЗ рд╡рд┐рд╣рд┐рдд рд░реВрдк рдореЗрдВ рдзреНрдпрд╛рди рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред рдЗрди рджрд┐рдиреЛрдВ, рдХрдИрдХрд╣рд╛рдирд┐рдпрд╛рдБ рдмрд╛рд░ рдкрд░ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВрд╢реМрдХ Google рдкрд░ рдЦреЛрдЬ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХреАред рд▓рдЧрднрдЧ рддреБрд░рдВрдд, рд╢реАрд░реНрд╖-рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдзреНрдпрд╛рди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд╛рдП рдЧрдП - рдХреИрд▓рдо рдФрд░ рд╣реЗрдбрд╕реНрдкреЗрд╕ред


рдкрд╣рд▓реЗ рдиреЗ рдПрдХ рдЕрдЪреНрдЫреЗ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ (рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рдЙрддреНрдХреГрд╖реНрдЯ рд╢реИрдХреНрд╖рд┐рдХ рдзреНрдпрд╛рди) рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд┐рдпрд╛, рджреВрд╕рд░рд╛ рдореБрдЭреЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд▓рдЧрд╛, рдореБрдЭреЗ рдкреНрд░рд╕реНрддреБрддрд┐ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдИред рджреЛрдиреЛрдВ рдиреЗ рдЕрдкрдиреЗ рднреБрдЧрддрд╛рди рдХреЗ рд╕рд╛рде рджреВрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ (рдФрд░ рдореБрдЭреЗ рд░реВрд╕реА рд╕рдВрдШ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП) рдЯреИрд░рд┐рдл рдпреЛрдЬрдирд╛рдПрдВред рд╢рд╛рдпрдж рдореИрдВ рд╕рд┐рд░реНрдл рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рд╢реНрд░реЗрдгреА рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ :) Google Play рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реБрдП, рдореИрдВ рджреЛ рдореБрдХреНрдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЖрдпрд╛ рд╣реВрдВ рдЬреЛ рдЖрддреНрдорд╛ рдореЗрдВ рдореЗрд░реЗ рдХрд░реАрдм рд╣реИрдВред рдкрд╣рд▓рд╛ "рд▓реЗрдЯреНрд╕ рдореЗрдбрд┐рдЯреЗрдЯ" рд╣реИ - рдореИрдВ рдЕрднреА рднреА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рджреВрд╕рд░реЗ рдкрд░ рд▓реЗрдЦ рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред


рдЖрд╡реЗрджрди


рдЗрд╕рд▓рд┐рдП, рдХрд╛рдлреА рд▓рдВрдмреА рдЦреЛрдЬ рдХреЗ рдмрд╛рдж, рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдЧреЛрдЪрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдлрд┐рд░ рдЗрд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрдЧрд░ рдореБрдЭреЗ рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИ, "рдзреНрдпрд╛рдиред рдПрдВрдЯреЛрдиреЛрд╡ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ред" рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдЗрд╕рдореЗрдВ рдЪрд╛рд░ рд▓реЗрдЦрдХ рдХрд╛ рдзреНрдпрд╛рди рд╕реБрдирдирд╛ рд╕рдВрднрд╡ рдерд╛, рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рд░рдЪрдирд╛ рдХреА рдЧрдИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рджреНрд╡рд╛рд░рд╛, рдЬрд┐рдирд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рдорд┐рд▓реЗ рдФрд░ рдЙрдирд╕реЗ рджреЛрд╕реНрддреА рдХреАред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдкрдиреЗ рджрдо рдкрд░ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рд╕рд╛рдзрдиреЛрдВ рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рдерд╛ рдЬреИрд╕реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рд╡реЗрдмрд╡реНрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╣реЛрдо-рдирд┐рд░реНрдорд┐рдд рдПрд╕рдкреАрдП, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдирдВрдЧреЗ рдПрдЪрдЯреАрдПрдордПрд▓ рдФрд░ рдиреНрдпреВрдирддрдо рдЬрд╛рд╡рд╛ рдореЗрдВред рдпрд╣ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рдерд╛, рдФрд░ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдмрд╕ рдЕрдиреБрдкрд╕реНрдерд┐рдд рдереЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЗрд╕реЗ рд╢реБрд░реБрдЖрдд рд╕реЗ рдЪрд╛рд▓реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдЪреВрдВрдХрд┐ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдкрд╕рдВрдж рдереА, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рдХреЛ рдЖрд╡реЗрджрди рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдореЗрдВ рдЕрдкрдиреА рдореБрдлреНрдд рдорджрдж рдХреА рдкреЗрд╢рдХрд╢ рдХреА, рддрд╛рдХрд┐, рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, "рдХреБрдЫ рд╡рд╛рдкрд╕ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП "рдХреЗ рдЖрдзрд╛рд░ рдкрд░" рдЙрдиреНрд╣реЛрдВрдиреЗ рдореЗрд░реА рдорджрдж рдХреА, рдореИрдВ рдорджрдж рдХрд░реВрдВрдЧрд╛ред рд▓реЗрдЦ рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рд╣рдореЗрдВ рдХрд┐рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдХреНрдпрд╛ рдирд┐рд░реНрдгрдп рд╣реБрдП рдФрд░ рдЖрдЦрд┐рд░ рдореЗрдВ рдХреНрдпрд╛ рд╣реБрдЖ! рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд▓реЗрдЦ рдХреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реЗрд╕рд┐рдкреА рд╣реЛрдЧреА рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА, рд▓реЗрдХрд┐рди рджрд┐рд▓рдЪрд╕реНрдк рджрд┐рд▓рдЪрд╕реНрдк :)



, :


  • UI UX

Qt


тАФ (), PHP/HTML. , , , Qt, :


  • Qt ( Symbian, MeeGo, Ubuntu Phone Android);
  • , ;
  • QML, C++. , тАФ JavaScript-like , ;
  • iOS ( ).

, тАФ , .


UI


, , . , , . , . ( ):



"" anchors, Row, Column Repeater. , UI. , ( ):


Button {
id: mainButton
anchors {
    left: parent.left
    right: parent.right
}
height: btnLayout.height + 30
Material.background: "white"
onClicked: stackView.push(Qt.resolvedUrl("qrc:/qml/MeditationListPage.qml"))

Column {
    id: btnLayout
    spacing: 10
    anchors {
        top: parent.top
        topMargin: 15
        left: parent.left
        right: parent.right
        margins: 10
    }

    Row {
        anchors.horizontalCenter: parent.horizontalCenter
        spacing: (mainButton.width - 4 * 50) / 6
        Repeater {
            model: meditationModel

            RoundedIcon {
                source: Qt.resolvedUrl("qrc:/img/my%1.png".arg(model.index))
                color: model.color
                width: 50
                height: 50
            }
        }
    }

    Label {
        text: qsTr("")
        font.pointSize: 14
        color: "dimgrey"
        anchors.horizontalCenter: parent.horizontalCenter
    }

    Label {
        text: "        ,     "
        anchors {
            left: parent.left
            right: parent.right
        }
        horizontalAlignment: Text.AlignHCenter
        Material.foreground: Material.Grey
        font.pixelSize: 12
        wrapMode: Text.WrapAtWordBoundaryOrAnywhere
    }
}
}

UI , HDPI Qt . , Qt: QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);. " ".


Material design, Android Qt Quick Controls 2 . https://doc.qt.io/qt-5/qtquickcontrols2-material.html. , Material design. UI , attached property Material.accent .




mp3- , QRC. 10-15 . тАФ , 15 . , , pro-:


CONFIG += resources_big

, , , .



, " ". Shorts, , . DarkModeShader.qml:


ShaderEffect {
    fragmentShader: "
        uniform lowp sampler2D source;
        uniform lowp float qt_Opacity;
        varying highp vec2 qt_TexCoord0;

        void main() {
            lowp vec4 p = texture2D(source, qt_TexCoord0);
            p.r = min(0.8, (1.0 - p.r) * 0.8 + 0.1);
            p.g = min(0.8, (1.0 - p.g) * 0.8 + 0.1);
            p.b = min(0.8, (1.0 - p.b) * 0.8 + 0.1);
            gl_FragColor = vec4(vec3(dot(p.rgb, vec3(0.299, 0.587, 0.114))), p.a) * qt_Opacity;
        }
    "
}

:


StackView {
    // ...
    layer.effect: DarkModeShader { }
    layer.enabled: optionsKeeper.isNightMode
}

.. , isNightMode. Qt / ( , ).


, тАФ . - , тАФ !



Qt Multimedia, Audio. mp3, , тАФ , :


Audio {
    id: audioPlayback
    source: meditAudioSource
}
// ...
Slider {
    anchors {
        left: parent.left
        right: playBtn.left
        verticalCenter: parent.verticalCenter
    }
    from: 0
    to: audioPlayback.duration
    value: audioPlayback.position
    onMoved: audioPlayback.seek(value)
    Material.accent: meditColor
}

Settings Qt.labs.settings (, , labs):


import Qt.labs.settings 1.0
// ...  boilerplate- ,        .
property Settings settings: Settings {
    property bool isNightMode: false
}

2018 , .



, , 2020, , - , тАФ ( ). , тАФ тАФ :)



, JSON- . . HTTP- QML- XMLHttpRequest ( JSON QML). .



. QML LocalStorage, SQLite. JS-, QML, :


// databasemodule.js
.pragma library // I hope this will prevent the waste of memory.
.import QtQuick.LocalStorage 2.0 as SQL

function getMeditations() {
    ...
}

// TransferManager.qml
import "databasemodule.js" as DB
...
var syncedItems = DB.getMeditations()

:


var db = SQL.LocalStorage.openDatabaseSync("AMeditation", "", "Main DB", 100000)
...
db.transaction(function(tx) {
    dbResult = tx.executeSql("SELECT * FROM meditations")
    console.log("meditations SELECTED: ", dbResult.rows.length)
})

.. , transaction callback. ( , Qt ).
. openDatabaseSync . , ( , ). . , , , . [" ", " ", " "]:


var migrations = [
    {'from': "", 'to': "1.0", 'ops': function(transaction) {
        transaction.executeSql("CREATE TABLE meditations ( \
            id  INTEGER PRIMARY KEY 
            ...
            status  TEXT);")
    }}
    ,{'from': "1.0", 'to': "1.1", 'ops': function(transaction) {
        transaction.executeSql("ALTER TABLE meditations ADD quality TEXT;")
    }}
]

, ( тАФ , - ).


C++


QML, C++. . Ubuntu Phone. . QML тАФ . C++- QML :


engine.rootContext()->setContextProperty("networkManager", new NetworkManager());

QML - :


//  .
var isSucces = networkManager.download(downloadUrl, currentDownload.localUrl)
...
//  .
Connections {
    target: networkManager

    onDownloadOperationProgress: {
        d.currentDownload.current = current
        d.currentDownload.total = total
    }
    ...
}

C++-, QML- singletone :


// cpputils.h
class CppUtils : public QObject
{
    Q_OBJECT
public:
    explicit CppUtils(QObject *parent = nullptr);
    ~CppUtils();

    Q_INVOKABLE bool removeFile(const QString& fileName) const;
    static QObject *cppUtilsSingletoneProvider(QQmlEngine *engine, QJSEngine *scriptEngine);
};

// main.cpp
qmlRegisterSingletonType<CppUtils>("AMeditation.CppUtils", 1, 0, "CppUtils", CppUtils::cppUtilsSingletoneProvider);

.. , cppUtilsSingletoneProvider, Q_INVOKABLE тАФ "" QML. QML :


import AMeditation.CppUtils 1.0
// ...
CppUtils.removeFile(cd.localUrl)


, - . тАФ . , - , . , . QML (QNetworkAccessManager). . :


// cachingnetworkmanagerfactory.h
class CachingNetworkAccessManager : public QNetworkAccessManager
{
public:
    CachingNetworkAccessManager(QObject *parent = 0);
protected:
    QNetworkReply* createRequest(Operation op, const QNetworkRequest &req, QIODevice *outgoingData = 0);
};

class CachingNetworkManagerFactory : public QQmlNetworkAccessManagerFactory
{
public:
    CachingNetworkManagerFactory();
    QNetworkAccessManager *create(QObject *parent);
};

// cachingnetworkmanagerfactory.cpp

QNetworkReply* CachingNetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
{
    QNetworkRequest req(request);
    req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferNetwork);
    return QNetworkAccessManager::createRequest(op, req, outgoingData);
}

QNetworkAccessManager *CachingNetworkManagerFactory::create(QObject *parent) {
    QNetworkAccessManager* manager = new CachingNetworkAccessManager(parent);

    QNetworkDiskCache* cache = new QNetworkDiskCache(manager);
    cache->setCacheDirectory(QString("%1/network").arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)));
    manager->setCache(cache);
    return manager;
}

.. setCache , createRequest . тАФ , .


Android


SDK NDK. Linux- , Windows - (, , QtCreator 4.12 NDK, ). NDK Clang. arm_v7 (32 ), arm_v8a (64 ; Google play 2019 ). Google play.


, , .



  • Qt pet-, Android. ;
  • AMeditation ( UI " 2.1. ") 10+ 250 , ( , , ).
  • , , !
  • iOS .

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреНрдпреВрдЯреА рдкрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдордЬреЗрджрд╛рд░ рд╣реИ, рдореБрдлреНрдд рдореЗрдВ рдФрд░ рдЖрддреНрдорд╛ рдХреЗ рд▓рд┐рдП рднреА рдХреБрдЫ рдХрд░рдирд╛!


рдкреАрдПрд╕ рдкреНрд░рд┐рдп рдЦрд╛рдмрд░реЛрд╡рд╕реНрдХ рдирд┐рд╡рд╛рд╕рд┐рдпреЛрдВ, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдЧрд┐рдиреЗрдВрдЧреЗ - рдЖрд╡реЗрджрди рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдФрд░ рдЧреИрд░-рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рд╣реИ, рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬреЛ рд░реБрдЪрд┐ рд░рдЦрддреЗ рдереЗ, рдЬреИрд╕реЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрд╛рдпрд╛ рдЧрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ред
PSS рдЖрд╡реЗрджрди рдореЗрдВ рдкреБрд░рд╛рдиреА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЬреБрдбрд╝рд╡рд╛рдВ рд╕рдВрд╕реНрдХрд░рдг 1.1 рд╣реИ, рдЬрд┐рд╕рдореЗрдВ 5k + рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ 100 рд╕рдореАрдХреНрд╖рд╛рдПрдБ рд╣реИрдВред рд╣рдо рд╢рд╛рдпрдж рдЗрд╕реЗ рдЬрд▓реНрдж рд╣реА рд╕реНрдЯреЛрд░ рд╕реЗ рдирд┐рдХрд╛рд▓ рд▓реЗрдВрдЧреЗред



All Articles