From d241c8250097b7c189758195e801f4e6b0078b3a Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Sun, 23 Feb 2025 12:21:49 +0700 Subject: [PATCH 1/9] feature: added lua codec parameter to awg --- client/configurators/awg_configurator.cpp | 1 + client/core/controllers/serverController.cpp | 5 ++++- client/daemon/daemon.cpp | 3 +++ client/daemon/interfaceconfig.cpp | 3 +++ client/daemon/interfaceconfig.h | 1 + client/mozilla/localsocketcontroller.cpp | 5 ++++- .../linux/daemon/wireguardutilslinux.cpp | 3 +++ .../macos/daemon/wireguardutilsmacos.cpp | 3 +++ client/protocols/protocols_defs.h | 2 ++ client/server_scripts/awg/configure_container.sh | 1 + client/server_scripts/awg/template.conf | 1 + client/ui/controllers/installController.cpp | 1 + client/ui/models/protocols/awgConfigModel.cpp | 11 ++++++++++- client/ui/models/protocols/awgConfigModel.h | 4 +++- client/ui/qml/Pages2/PageProtocolAwgSettings.qml | 15 +++++++++++++++ 15 files changed, 55 insertions(+), 4 deletions(-) diff --git a/client/configurators/awg_configurator.cpp b/client/configurators/awg_configurator.cpp index 21b61ba4..3e04a5c0 100644 --- a/client/configurators/awg_configurator.cpp +++ b/client/configurators/awg_configurator.cpp @@ -41,6 +41,7 @@ QString AwgConfigurator::createConfig(const ServerCredentials &credentials, Dock jsonConfig[config_key::transportPacketMagicHeader] = configMap.value(config_key::transportPacketMagicHeader); jsonConfig[config_key::mtu] = containerConfig.value(ProtocolProps::protoToString(Proto::Awg)).toObject().value(config_key::mtu).toString(protocols::awg::defaultMtu); + jsonConfig[config_key::luaCodec] = configMap.value(config_key::luaCodec); return QJsonDocument(jsonConfig).toJson(); } diff --git a/client/core/controllers/serverController.cpp b/client/core/controllers/serverController.cpp index 7219ff7d..79c9f132 100644 --- a/client/core/controllers/serverController.cpp +++ b/client/core/controllers/serverController.cpp @@ -367,7 +367,9 @@ bool ServerController::isReinstallContainerRequired(DockerContainer container, c || (oldProtoConfig.value(config_key::underloadPacketMagicHeader).toString(protocols::awg::defaultUnderloadPacketMagicHeader) != newProtoConfig.value(config_key::underloadPacketMagicHeader).toString(protocols::awg::defaultUnderloadPacketMagicHeader)) || (oldProtoConfig.value(config_key::transportPacketMagicHeader).toString(protocols::awg::defaultTransportPacketMagicHeader) - != newProtoConfig.value(config_key::transportPacketMagicHeader).toString(protocols::awg::defaultTransportPacketMagicHeader))) + != newProtoConfig.value(config_key::transportPacketMagicHeader).toString(protocols::awg::defaultTransportPacketMagicHeader)) + || (oldProtoConfig.value(config_key::luaCodec).toString(protocols::awg::defaultLuaCodec) + != newProtoConfig.value(config_key::luaCodec).toString(protocols::awg::defaultLuaCodec))) return true; } @@ -624,6 +626,7 @@ ServerController::Vars ServerController::genVarsForScript(const ServerCredential vars.append({ { "$RESPONSE_PACKET_MAGIC_HEADER", amneziaWireguarConfig.value(config_key::responsePacketMagicHeader).toString() } }); vars.append({ { "$UNDERLOAD_PACKET_MAGIC_HEADER", amneziaWireguarConfig.value(config_key::underloadPacketMagicHeader).toString() } }); vars.append({ { "$TRANSPORT_PACKET_MAGIC_HEADER", amneziaWireguarConfig.value(config_key::transportPacketMagicHeader).toString() } }); + vars.append({ { "$LUA_CODEC", amneziaWireguarConfig.value(config_key::luaCodec).toString() } }); // Socks5 proxy vars vars.append({ { "$SOCKS5_PROXY_PORT", socks5ProxyConfig.value(config_key::port).toString(protocols::socks5Proxy::defaultPort) } }); diff --git a/client/daemon/daemon.cpp b/client/daemon/daemon.cpp index 081a7a90..6938063d 100644 --- a/client/daemon/daemon.cpp +++ b/client/daemon/daemon.cpp @@ -401,6 +401,9 @@ bool Daemon::parseConfig(const QJsonObject& obj, InterfaceConfig& config) { if (!obj.value("H4").isNull()) { config.m_transportPacketMagicHeader = obj.value("H4").toString(); } + if (!obj.value("LuaCodec").isNull()) { + config.m_luaCodec = obj.value("LuaCodec").toString(); + } return true; } diff --git a/client/daemon/interfaceconfig.cpp b/client/daemon/interfaceconfig.cpp index b2ad31c6..fdc12c34 100644 --- a/client/daemon/interfaceconfig.cpp +++ b/client/daemon/interfaceconfig.cpp @@ -130,6 +130,9 @@ QString InterfaceConfig::toWgConf(const QMap& extra) const { if (!m_transportPacketMagicHeader.isNull()) { out << "H4 = " << m_transportPacketMagicHeader << "\n"; } + if (!m_luaCodec.isNull()) { + out << "LuaCodec = " << m_luaCodec << "\n"; + } // If any extra config was provided, append it now. for (const QString& key : extra.keys()) { diff --git a/client/daemon/interfaceconfig.h b/client/daemon/interfaceconfig.h index 6a816f87..8b45e16c 100644 --- a/client/daemon/interfaceconfig.h +++ b/client/daemon/interfaceconfig.h @@ -51,6 +51,7 @@ class InterfaceConfig { QString m_responsePacketMagicHeader; QString m_underloadPacketMagicHeader; QString m_transportPacketMagicHeader; + QString m_luaCodec; QJsonObject toJson() const; QString toWgConf( diff --git a/client/mozilla/localsocketcontroller.cpp b/client/mozilla/localsocketcontroller.cpp index 1081bcae..8fd00baf 100644 --- a/client/mozilla/localsocketcontroller.cpp +++ b/client/mozilla/localsocketcontroller.cpp @@ -238,6 +238,7 @@ void LocalSocketController::activate(const QJsonObject &rawConfig) { json.insert(amnezia::config_key::responsePacketMagicHeader, wgConfig.value(amnezia::config_key::responsePacketMagicHeader)); json.insert(amnezia::config_key::underloadPacketMagicHeader, wgConfig.value(amnezia::config_key::underloadPacketMagicHeader)); json.insert(amnezia::config_key::transportPacketMagicHeader, wgConfig.value(amnezia::config_key::transportPacketMagicHeader)); + json.insert(amnezia::config_key::luaCodec, wgConfig.value(amnezia::config_key::luaCodec)); } else if (!wgConfig.value(amnezia::config_key::junkPacketCount).isUndefined() && !wgConfig.value(amnezia::config_key::junkPacketMinSize).isUndefined() && !wgConfig.value(amnezia::config_key::junkPacketMaxSize).isUndefined() @@ -246,7 +247,8 @@ void LocalSocketController::activate(const QJsonObject &rawConfig) { && !wgConfig.value(amnezia::config_key::initPacketMagicHeader).isUndefined() && !wgConfig.value(amnezia::config_key::responsePacketMagicHeader).isUndefined() && !wgConfig.value(amnezia::config_key::underloadPacketMagicHeader).isUndefined() - && !wgConfig.value(amnezia::config_key::transportPacketMagicHeader).isUndefined()) { + && !wgConfig.value(amnezia::config_key::transportPacketMagicHeader).isUndefined() + && !wgConfig.value(amnezia::config_key::luaCodec).isUndefined()) { json.insert(amnezia::config_key::junkPacketCount, wgConfig.value(amnezia::config_key::junkPacketCount)); json.insert(amnezia::config_key::junkPacketMinSize, wgConfig.value(amnezia::config_key::junkPacketMinSize)); json.insert(amnezia::config_key::junkPacketMaxSize, wgConfig.value(amnezia::config_key::junkPacketMaxSize)); @@ -256,6 +258,7 @@ void LocalSocketController::activate(const QJsonObject &rawConfig) { json.insert(amnezia::config_key::responsePacketMagicHeader, wgConfig.value(amnezia::config_key::responsePacketMagicHeader)); json.insert(amnezia::config_key::underloadPacketMagicHeader, wgConfig.value(amnezia::config_key::underloadPacketMagicHeader)); json.insert(amnezia::config_key::transportPacketMagicHeader, wgConfig.value(amnezia::config_key::transportPacketMagicHeader)); + json.insert(amnezia::config_key::luaCodec, wgConfig.value(amnezia::config_key::luaCodec)); } write(json); diff --git a/client/platforms/linux/daemon/wireguardutilslinux.cpp b/client/platforms/linux/daemon/wireguardutilslinux.cpp index 1528d901..347e93ec 100644 --- a/client/platforms/linux/daemon/wireguardutilslinux.cpp +++ b/client/platforms/linux/daemon/wireguardutilslinux.cpp @@ -131,6 +131,9 @@ bool WireguardUtilsLinux::addInterface(const InterfaceConfig& config) { if (!config.m_transportPacketMagicHeader.isEmpty()) { out << "h4=" << config.m_transportPacketMagicHeader << "\n"; } + if (!config.m_luaCodec.isEmpty()) { + out << "lua_codec=" << config.m_luaCodec << "\n"; + } int err = uapiErrno(uapiCommand(message)); if (err != 0) { diff --git a/client/platforms/macos/daemon/wireguardutilsmacos.cpp b/client/platforms/macos/daemon/wireguardutilsmacos.cpp index eae22837..027a7c69 100644 --- a/client/platforms/macos/daemon/wireguardutilsmacos.cpp +++ b/client/platforms/macos/daemon/wireguardutilsmacos.cpp @@ -129,6 +129,9 @@ bool WireguardUtilsMacos::addInterface(const InterfaceConfig& config) { if (!config.m_transportPacketMagicHeader.isEmpty()) { out << "h4=" << config.m_transportPacketMagicHeader << "\n"; } + if (!config.m_luaCodec.isEmpty()) { + out << "lua_codec=" << config.m_luaCodec << "\n"; + } int err = uapiErrno(uapiCommand(message)); if (err != 0) { diff --git a/client/protocols/protocols_defs.h b/client/protocols/protocols_defs.h index 865edae4..1ec6b621 100644 --- a/client/protocols/protocols_defs.h +++ b/client/protocols/protocols_defs.h @@ -76,6 +76,7 @@ namespace amnezia constexpr char responsePacketMagicHeader[] = "H2"; constexpr char underloadPacketMagicHeader[] = "H3"; constexpr char transportPacketMagicHeader[] = "H4"; + constexpr char luaCodec[] = "LuaCodec"; constexpr char openvpn[] = "openvpn"; constexpr char wireguard[] = "wireguard"; @@ -216,6 +217,7 @@ namespace amnezia constexpr char defaultResponsePacketMagicHeader[] = "3288052141"; constexpr char defaultTransportPacketMagicHeader[] = "2528465083"; constexpr char defaultUnderloadPacketMagicHeader[] = "1766607858"; + constexpr char defaultLuaCodec[] = ""; } namespace socks5Proxy diff --git a/client/server_scripts/awg/configure_container.sh b/client/server_scripts/awg/configure_container.sh index 2000c965..b0cacefc 100644 --- a/client/server_scripts/awg/configure_container.sh +++ b/client/server_scripts/awg/configure_container.sh @@ -23,4 +23,5 @@ H1 = $INIT_PACKET_MAGIC_HEADER H2 = $RESPONSE_PACKET_MAGIC_HEADER H3 = $UNDERLOAD_PACKET_MAGIC_HEADER H4 = $TRANSPORT_PACKET_MAGIC_HEADER +LuaCodec = $LUA_CODEC EOF diff --git a/client/server_scripts/awg/template.conf b/client/server_scripts/awg/template.conf index 79932806..21eff7ef 100644 --- a/client/server_scripts/awg/template.conf +++ b/client/server_scripts/awg/template.conf @@ -11,6 +11,7 @@ H1 = $INIT_PACKET_MAGIC_HEADER H2 = $RESPONSE_PACKET_MAGIC_HEADER H3 = $UNDERLOAD_PACKET_MAGIC_HEADER H4 = $TRANSPORT_PACKET_MAGIC_HEADER +LuaCodec = $LUA_CODEC [Peer] PublicKey = $WIREGUARD_SERVER_PUBLIC_KEY diff --git a/client/ui/controllers/installController.cpp b/client/ui/controllers/installController.cpp index ae0804cb..a95d568c 100755 --- a/client/ui/controllers/installController.cpp +++ b/client/ui/controllers/installController.cpp @@ -399,6 +399,7 @@ ErrorCode InstallController::getAlreadyInstalledContainers(const ServerCredentia serverConfigMap.value(config_key::underloadPacketMagicHeader); containerConfig[config_key::transportPacketMagicHeader] = serverConfigMap.value(config_key::transportPacketMagicHeader); + containerConfig[config_key::luaCodec] = serverConfigMap.value(config_key::luaCodec); } else if (protocol == Proto::Sftp) { stdOut.clear(); script = QString("sudo docker inspect --format '{{.Config.Cmd}}' %1").arg(name); diff --git a/client/ui/models/protocols/awgConfigModel.cpp b/client/ui/models/protocols/awgConfigModel.cpp index 860c8395..d7e271ee 100644 --- a/client/ui/models/protocols/awgConfigModel.cpp +++ b/client/ui/models/protocols/awgConfigModel.cpp @@ -46,6 +46,9 @@ bool AwgConfigModel::setData(const QModelIndex &index, const QVariant &value, in case Roles::ServerTransportPacketMagicHeaderRole: m_serverProtocolConfig.insert(config_key::transportPacketMagicHeader, value.toString()); break; + case Roles::ServerLuaCodecRole: + m_serverProtocolConfig.insert(config_key::luaCodec, value.toString()); + break; } emit dataChanged(index, index, QList { role }); @@ -76,6 +79,7 @@ QVariant AwgConfigModel::data(const QModelIndex &index, int role) const case Roles::ServerResponsePacketMagicHeaderRole: return m_serverProtocolConfig.value(config_key::responsePacketMagicHeader); case Roles::ServerUnderloadPacketMagicHeaderRole: return m_serverProtocolConfig.value(config_key::underloadPacketMagicHeader); case Roles::ServerTransportPacketMagicHeaderRole: return m_serverProtocolConfig.value(config_key::transportPacketMagicHeader); + case Roles::ServerLuaCodecRole: return m_serverProtocolConfig.value(config_key::luaCodec); } return QVariant(); @@ -114,6 +118,8 @@ void AwgConfigModel::updateModel(const QJsonObject &config) serverProtocolConfig.value(config_key::underloadPacketMagicHeader).toString(protocols::awg::defaultUnderloadPacketMagicHeader); m_serverProtocolConfig[config_key::transportPacketMagicHeader] = serverProtocolConfig.value(config_key::transportPacketMagicHeader).toString(protocols::awg::defaultTransportPacketMagicHeader); + m_serverProtocolConfig[config_key::luaCodec] = + serverProtocolConfig.value(config_key::luaCodec).toString(protocols::awg::defaultLuaCodec); auto lastConfig = m_serverProtocolConfig.value(config_key::last_config).toString(); QJsonObject clientProtocolConfig = QJsonDocument::fromJson(lastConfig.toUtf8()).object(); @@ -188,6 +194,7 @@ QHash AwgConfigModel::roleNames() const roles[ServerResponsePacketMagicHeaderRole] = "serverResponsePacketMagicHeader"; roles[ServerUnderloadPacketMagicHeaderRole] = "serverUnderloadPacketMagicHeader"; roles[ServerTransportPacketMagicHeaderRole] = "serverTransportPacketMagicHeader"; + roles[ServerLuaCodecRole] = "serverLuaCodec"; return roles; } @@ -217,6 +224,7 @@ AwgConfig::AwgConfig(const QJsonObject &serverProtocolConfig) serverProtocolConfig.value(config_key::underloadPacketMagicHeader).toString(protocols::awg::defaultUnderloadPacketMagicHeader); serverTransportPacketMagicHeader = serverProtocolConfig.value(config_key::transportPacketMagicHeader).toString(protocols::awg::defaultTransportPacketMagicHeader); + serverLuaCodec = serverProtocolConfig.value(config_key::luaCodec).toString(protocols::awg::defaultLuaCodec); } bool AwgConfig::hasEqualServerSettings(const AwgConfig &other) const @@ -227,7 +235,8 @@ bool AwgConfig::hasEqualServerSettings(const AwgConfig &other) const || serverInitPacketMagicHeader != other.serverInitPacketMagicHeader || serverResponsePacketMagicHeader != other.serverResponsePacketMagicHeader || serverUnderloadPacketMagicHeader != other.serverUnderloadPacketMagicHeader - || serverTransportPacketMagicHeader != other.serverTransportPacketMagicHeader) { + || serverTransportPacketMagicHeader != other.serverTransportPacketMagicHeader + || serverLuaCodec != other.serverLuaCodec) { return false; } return true; diff --git a/client/ui/models/protocols/awgConfigModel.h b/client/ui/models/protocols/awgConfigModel.h index c1f8bb27..77e2ae25 100644 --- a/client/ui/models/protocols/awgConfigModel.h +++ b/client/ui/models/protocols/awgConfigModel.h @@ -32,6 +32,7 @@ struct AwgConfig QString serverResponsePacketMagicHeader; QString serverUnderloadPacketMagicHeader; QString serverTransportPacketMagicHeader; + QString serverLuaCodec; bool hasEqualServerSettings(const AwgConfig &other) const; bool hasEqualClientSettings(const AwgConfig &other) const; @@ -60,7 +61,8 @@ public: ServerInitPacketMagicHeaderRole, ServerResponsePacketMagicHeaderRole, ServerUnderloadPacketMagicHeaderRole, - ServerTransportPacketMagicHeaderRole + ServerTransportPacketMagicHeaderRole, + ServerLuaCodecRole }; explicit AwgConfigModel(QObject *parent = nullptr); diff --git a/client/ui/qml/Pages2/PageProtocolAwgSettings.qml b/client/ui/qml/Pages2/PageProtocolAwgSettings.qml index 8c629b68..fd37cfd2 100644 --- a/client/ui/qml/Pages2/PageProtocolAwgSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolAwgSettings.qml @@ -316,6 +316,21 @@ PageType { checkEmptyText: true } + TextFieldWithHeaderType { + id: luaCodecTextField + Layout.fillWidth: true + Layout.topMargin: 16 + + headerText: qsTr("Lua Codec") + textField.text: serverLuaCodec + + textField.onEditingFinished: { + if (textField.text !== serverLuaCodec) { + serverLuaCodec = textField.text + } + } + } + BasicButtonType { id: saveRestartButton From efe80688d6b43c3e2f8db97918ba68c009c1f0d1 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Sun, 23 Feb 2025 13:21:37 +0700 Subject: [PATCH 2/9] chore: update link to submodule 3rd-prebuild --- client/3rd-prebuilt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/3rd-prebuilt b/client/3rd-prebuilt index e555c78b..453c690b 160000 --- a/client/3rd-prebuilt +++ b/client/3rd-prebuilt @@ -1 +1 @@ -Subproject commit e555c78bcf44070d5c88bcca54480732c9164f18 +Subproject commit 453c690b552b8da3105c5824e435bfdd9380c32e From 3734c532fc5246012ea2a1f96ac42652aeaeca93 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Mon, 24 Feb 2025 11:34:20 +0700 Subject: [PATCH 3/9] chore: update link to base dockerfile for awg container --- client/server_scripts/awg/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/server_scripts/awg/Dockerfile b/client/server_scripts/awg/Dockerfile index 8c536fc7..ede9f2f4 100644 --- a/client/server_scripts/awg/Dockerfile +++ b/client/server_scripts/awg/Dockerfile @@ -1,4 +1,4 @@ -FROM amneziavpn/amnezia-wg:latest +FROM amneziavpn/euphoria:latest LABEL maintainer="AmneziaVPN" From 4bd431a49910a3d2ffebb9453594d4ce1c3c34c2 Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Mon, 24 Feb 2025 19:43:53 +0200 Subject: [PATCH 4/9] Upload Windows Euphoria binary --- client/3rd-prebuilt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/3rd-prebuilt b/client/3rd-prebuilt index 453c690b..02bd9c68 160000 --- a/client/3rd-prebuilt +++ b/client/3rd-prebuilt @@ -1 +1 @@ -Subproject commit 453c690b552b8da3105c5824e435bfdd9380c32e +Subproject commit 02bd9c68d6ea42a6d8407551fea88ee2cdbcc963 From bf6ca080b6d52166286396b78ab1bf06b2bbda37 Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Mon, 24 Feb 2025 21:35:24 +0200 Subject: [PATCH 5/9] Update binaries --- client/3rd-prebuilt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/3rd-prebuilt b/client/3rd-prebuilt index 02bd9c68..85caf22b 160000 --- a/client/3rd-prebuilt +++ b/client/3rd-prebuilt @@ -1 +1 @@ -Subproject commit 02bd9c68d6ea42a6d8407551fea88ee2cdbcc963 +Subproject commit 85caf22bd0bfc9acb36af729623bbc24e2f0e177 From dc8830799bc4eaaf29a4fe6a9316ff28314d0cc8 Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Tue, 25 Feb 2025 11:14:35 +0200 Subject: [PATCH 6/9] Upload Linux binary --- client/3rd-prebuilt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/3rd-prebuilt b/client/3rd-prebuilt index 85caf22b..4a6566f8 160000 --- a/client/3rd-prebuilt +++ b/client/3rd-prebuilt @@ -1 +1 @@ -Subproject commit 85caf22bd0bfc9acb36af729623bbc24e2f0e177 +Subproject commit 4a6566f88552fed1918de903547546f3e1c09321 From 520dd18d949950394585be4bbf164f7f681ea55b Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Thu, 27 Feb 2025 16:19:22 +0200 Subject: [PATCH 7/9] Update Linux to euphoia version 0.1.1 --- client/3rd-prebuilt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/3rd-prebuilt b/client/3rd-prebuilt index 4a6566f8..4bf42020 160000 --- a/client/3rd-prebuilt +++ b/client/3rd-prebuilt @@ -1 +1 @@ -Subproject commit 4a6566f88552fed1918de903547546f3e1c09321 +Subproject commit 4bf420206dc1c970d510df627d49d3d98b0d956c From ec68bdde2eec217db9c3b6a29516292829e6c85a Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Thu, 27 Feb 2025 17:43:42 +0200 Subject: [PATCH 8/9] Update Windows to euphoia version 0.1.1 --- client/3rd-prebuilt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/3rd-prebuilt b/client/3rd-prebuilt index 4bf42020..c906a9ad 160000 --- a/client/3rd-prebuilt +++ b/client/3rd-prebuilt @@ -1 +1 @@ -Subproject commit 4bf420206dc1c970d510df627d49d3d98b0d956c +Subproject commit c906a9ad81474d82d987ecc2316aa90dd98f6f6b From d1f8d58ece2bc98a09aea73386e1d4833514223d Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Fri, 28 Feb 2025 13:40:06 +0200 Subject: [PATCH 9/9] Upload MacOS binary --- client/3rd-prebuilt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/3rd-prebuilt b/client/3rd-prebuilt index c906a9ad..e65b608b 160000 --- a/client/3rd-prebuilt +++ b/client/3rd-prebuilt @@ -1 +1 @@ -Subproject commit c906a9ad81474d82d987ecc2316aa90dd98f6f6b +Subproject commit e65b608bcb8500136e609d8fc7f3d719b25f0210