From 04f8ccd2b0ab083b2b62307a5faaed7cf235aeab Mon Sep 17 00:00:00 2001 From: Heather Anderson Date: Sat, 8 May 2021 20:26:43 -0700 Subject: [PATCH 01/42] drop remaining references to QScriptEngineDebugger --- libraries/script-engine/src/ScriptEngine.cpp | 98 ------------------- libraries/script-engine/src/ScriptEngine.h | 8 -- libraries/script-engine/src/ScriptEngines.cpp | 13 +-- 3 files changed, 1 insertion(+), 118 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 9fbf7a2801..f4437b88b1 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -36,8 +36,6 @@ #include #include -#include - #include #include #include @@ -327,96 +325,6 @@ void ScriptEngine::disconnectNonEssentialSignals() { } } -void ScriptEngine::runDebuggable() { - static QMenuBar* menuBar { nullptr }; - static QMenu* scriptDebugMenu { nullptr }; - static size_t scriptMenuCount { 0 }; - if (!scriptDebugMenu) { - for (auto window : qApp->topLevelWidgets()) { - auto mainWindow = qobject_cast(window); - if (mainWindow) { - menuBar = mainWindow->menuBar(); - break; - } - } - if (menuBar) { - scriptDebugMenu = menuBar->addMenu("Script Debug"); - } - } - - init(); - _isRunning = true; - _debuggable = true; - _debugger = new QScriptEngineDebugger(this); - _debugger->attachTo(this); - - QMenu* parentMenu = scriptDebugMenu; - QMenu* scriptMenu { nullptr }; - if (parentMenu) { - ++scriptMenuCount; - scriptMenu = parentMenu->addMenu(_fileNameString); - scriptMenu->addMenu(_debugger->createStandardMenu(qApp->activeWindow())); - } else { - qWarning() << "Unable to add script debug menu"; - } - - QScriptValue result = evaluate(_scriptContents, _fileNameString); - - _lastUpdate = usecTimestampNow(); - QTimer* timer = new QTimer(this); - connect(this, &ScriptEngine::finished, [this, timer, parentMenu, scriptMenu] { - if (scriptMenu) { - parentMenu->removeAction(scriptMenu->menuAction()); - --scriptMenuCount; - if (0 == scriptMenuCount) { - menuBar->removeAction(scriptDebugMenu->menuAction()); - scriptDebugMenu = nullptr; - } - } - disconnect(timer); - }); - - connect(timer, &QTimer::timeout, [this, timer] { - if (_isFinished) { - if (!_isRunning) { - return; - } - stopAllTimers(); // make sure all our timers are stopped if the script is ending - - emit scriptEnding(); - emit finished(_fileNameString, qSharedPointerCast(sharedFromThis())); - _isRunning = false; - - emit runningStateChanged(); - emit doneRunning(); - - timer->deleteLater(); - return; - } - - qint64 now = usecTimestampNow(); - // we check for 'now' in the past in case people set their clock back - if (_lastUpdate < now) { - float deltaTime = (float)(now - _lastUpdate) / (float)USECS_PER_SECOND; - if (!(_isFinished || _isStopping)) { - emit update(deltaTime); - } - } - _lastUpdate = now; - - // only clear exceptions if we are not in the middle of evaluating - if (!isEvaluating() && hasUncaughtException()) { - qCWarning(scriptengine) << __FUNCTION__ << "---------- UNCAUGHT EXCEPTION --------"; - qCWarning(scriptengine) << "runDebuggable" << uncaughtException().toString(); - logException(__FUNCTION__); - clearExceptions(); - } - }); - - timer->start(10); -} - - void ScriptEngine::runInThread() { Q_ASSERT_X(!_isThreaded, "ScriptEngine::runInThread()", "runInThread should not be called more than once"); @@ -588,12 +496,6 @@ void ScriptEngine::loadURL(const QUrl& scriptURL, bool reload) { _scriptContents = scriptContents; - { - static const QString DEBUG_FLAG("#debug"); - if (QRegularExpression(DEBUG_FLAG).match(scriptContents).hasMatch()) { - _debuggable = true; - } - } emit scriptLoaded(url); }, reload, maxRetries); } diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index a19e63a665..be532947ba 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -50,8 +50,6 @@ #include "SettingHandle.h" #include "Profile.h" -class QScriptEngineDebugger; - static const QString NO_SCRIPT(""); static const int SCRIPT_FPS = 60; @@ -167,8 +165,6 @@ public: /// services before calling this. void runInThread(); - void runDebuggable(); - /// run the script in the callers thread, exit when stop() is called. void run(); @@ -667,8 +663,6 @@ public: // this is used by code in ScriptEngines.cpp during the "reload all" operation bool isStopping() const { return _isStopping; } - bool isDebuggable() const { return _debuggable; } - void disconnectNonEssentialSignals(); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -982,8 +976,6 @@ protected: EntityScriptContentAvailableMap _contentAvailableQueue; bool _isThreaded { false }; - QScriptEngineDebugger* _debugger { nullptr }; - bool _debuggable { false }; qint64 _lastUpdate; QString _fileNameString; diff --git a/libraries/script-engine/src/ScriptEngines.cpp b/libraries/script-engine/src/ScriptEngines.cpp index d091e6e4b5..646a278477 100644 --- a/libraries/script-engine/src/ScriptEngines.cpp +++ b/libraries/script-engine/src/ScriptEngines.cpp @@ -26,7 +26,6 @@ #define __LOC__ __FILE__ "(" __STR1__(__LINE__) ") : Warning Msg: " static const QString DESKTOP_LOCATION = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); -static const bool HIFI_SCRIPT_DEBUGGABLES { true }; static const QString SETTINGS_KEY { "RunningScripts" }; static const QUrl DEFAULT_SCRIPTS_LOCATION { "file:///~//defaultScripts.js" }; @@ -589,17 +588,7 @@ void ScriptEngines::launchScriptEngine(ScriptEnginePointer scriptEngine) { // register our application services and set it off on its own thread runScriptInitializers(scriptEngine); - - // FIXME disabling 'shift key' debugging for now. If you start up the application with - // the shift key held down, it triggers a deadlock because of script interfaces running - // on the main thread - auto const wantDebug = scriptEngine->isDebuggable(); // || (qApp->queryKeyboardModifiers() & Qt::ShiftModifier); - - if (HIFI_SCRIPT_DEBUGGABLES && wantDebug) { - scriptEngine->runDebuggable(); - } else { - scriptEngine->runInThread(); - } + scriptEngine->runInThread(); } void ScriptEngines::onScriptFinished(const QString& rawScriptURL, ScriptEnginePointer engine) { From 9ef9a89d9526e7eef3a82f6301851e5a3df96502 Mon Sep 17 00:00:00 2001 From: Dale Glass Date: Sun, 9 May 2021 18:13:58 +0200 Subject: [PATCH 02/42] Fix draco compilation on gcc11 The previous version breaks on Fedora 34, and likely other distros with recent compilers due to not including cstddef and limits headers. This is already fixed upstream, but only in master. And looking at google/draco#704 there may be compatibility issues with using the latest code. So for now we're upgrading from 1.3.3 to 1.3.6 and adding the fix. --- cmake/ports/draco/portfile.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/ports/draco/portfile.cmake b/cmake/ports/draco/portfile.cmake index 853d45e862..cc6e9e5f8f 100644 --- a/cmake/ports/draco/portfile.cmake +++ b/cmake/ports/draco/portfile.cmake @@ -19,9 +19,9 @@ include(vcpkg_common_functions) vcpkg_from_github( OUT_SOURCE_PATH SOURCE_PATH - REPO google/draco - REF 1.3.3 - SHA512 80ed5a623046822f5bb26b2454c8ee8cc93ffe9eb3012e8461cefdfc577b26d69a92ea0f0c5e14f5f48c1ef99f9a7263b01710df376792e74358ae14e49c3897 + REPO vircadia/draco + REF 1.3.5-fixed + SHA512 68bb15de013093077946d431ab1f4080b84a66d45d20873f2c0dc44aa28034fb4ec1f6e24f9300fde563da53943b73d47163b9c6acf2667312128c50c6d075bd HEAD_REF master ) From 15effecd171ca8e4494b70e9def1e6df70f3ce46 Mon Sep 17 00:00:00 2001 From: Dale Glass Date: Wed, 19 May 2021 00:53:28 +0200 Subject: [PATCH 03/42] Add patch for building Qt 5.15 on gcc11 gcc11 is requires #include in places previous versions didn't. --- tools/qt-builder/patches/qt5.15-gcc11.patch | 74 +++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 tools/qt-builder/patches/qt5.15-gcc11.patch diff --git a/tools/qt-builder/patches/qt5.15-gcc11.patch b/tools/qt-builder/patches/qt5.15-gcc11.patch new file mode 100644 index 0000000000..a79dc77e71 --- /dev/null +++ b/tools/qt-builder/patches/qt5.15-gcc11.patch @@ -0,0 +1,74 @@ +diff --git a/qtbase/src/corelib/global/qendian.h b/qtbase/src/corelib/global/qendian.h +index 257efbbdbe..05f11d6f81 100644 +--- a/qtbase/src/corelib/global/qendian.h ++++ b/qtbase/src/corelib/global/qendian.h +@@ -47,6 +47,7 @@ + // include stdlib.h and hope that it defines __GLIBC__ for glibc-based systems + #include + #include ++#include + + #ifdef min // MSVC + #undef min +diff --git a/qtbase/src/corelib/global/qfloat16.h b/qtbase/src/corelib/global/qfloat16.h +index c7a9c87af3..3287d7cbf2 100644 +--- a/qtbase/src/corelib/global/qfloat16.h ++++ b/qtbase/src/corelib/global/qfloat16.h +@@ -44,6 +44,7 @@ + #include + #include + #include ++#include + + #if defined(QT_COMPILER_SUPPORTS_F16C) && defined(__AVX2__) && !defined(__F16C__) + // All processors that support AVX2 do support F16C too. That doesn't mean +diff --git a/qtbase/src/corelib/text/qbytearraymatcher.h b/qtbase/src/corelib/text/qbytearraymatcher.h +index 0eedfc1d20..ee415e336d 100644 +--- a/qtbase/src/corelib/text/qbytearraymatcher.h ++++ b/qtbase/src/corelib/text/qbytearraymatcher.h +@@ -41,6 +41,7 @@ + #define QBYTEARRAYMATCHER_H + + #include ++#include + + QT_BEGIN_NAMESPACE + +Submodule qtdeclarative contains modified content +diff --git a/qtdeclarative/src/3rdparty/masm/yarr/Yarr.h b/qtdeclarative/src/3rdparty/masm/yarr/Yarr.h +index ccf78f9880..cbb42c60d8 100644 +--- a/qtdeclarative/src/3rdparty/masm/yarr/Yarr.h ++++ b/qtdeclarative/src/3rdparty/masm/yarr/Yarr.h +@@ -27,7 +27,7 @@ + + #pragma once + +-#include ++#include + #include "YarrErrorCode.h" + + namespace JSC { namespace Yarr { +diff --git a/qtdeclarative/src/qmldebug/qqmlprofilerevent_p.h b/qtdeclarative/src/qmldebug/qqmlprofilerevent_p.h +index a7e37d1964..3f13679a6a 100644 +--- a/qtdeclarative/src/qmldebug/qqmlprofilerevent_p.h ++++ b/qtdeclarative/src/qmldebug/qqmlprofilerevent_p.h +@@ -49,6 +49,7 @@ + + #include + #include ++#include + + // + // W A R N I N G +diff --git a/qtwebengine/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/containers/string_pool.h b/qtwebengine/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/containers/string_pool.h +index 11ae91cfeca..58c6db27bd6 100644 +--- a/qtwebengine/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/containers/string_pool.h ++++ b/qtwebengine/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/containers/string_pool.h +@@ -22,6 +22,7 @@ + + #include + #include ++#include + + #include "perfetto/ext/base/optional.h" + #include "perfetto/ext/base/paged_memory.h" From d0eccfda49a93fee7b0a97bf0f06ee435a3f4255 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 21 May 2021 07:15:06 +1200 Subject: [PATCH 04/42] Fix typo in Doxygen ReadMe --- tools/doxygen/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/doxygen/README.md b/tools/doxygen/README.md index 34d12c1d8a..d6a6646033 100644 --- a/tools/doxygen/README.md +++ b/tools/doxygen/README.md @@ -5,7 +5,7 @@ ## Prerequisites -**Doxygen** ≥ 3.9.1 - https://www.doxygen.nl/ +**Doxygen** ≥ 1.9.1 - https://www.doxygen.nl/ Make a `/build/doxygen/` directory. From 15a9de3a06b7fb4ab73caa2ec4c3599168e03b21 Mon Sep 17 00:00:00 2001 From: Kalila <69767640+digisomni@users.noreply.github.com> Date: Tue, 25 May 2021 02:32:51 -0400 Subject: [PATCH 05/42] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3c4f17fea0..58e3a501d4 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Vircadia™ is a 3D social software project seeking to incrementally bring about * Full-body avatars * FBX, glTF, and OBJ support * JavaScript scripting engine -* 16km^3 world space in a server +* 16km³ world space in a server * Fully self-hosted * Apache 2.0 @@ -66,7 +66,8 @@ Vircadia consists of many projects and codebases with its unifying structure's g #### Child Projects - [Vircadia Builder for Linux](https://github.com/vircadia/vircadia-builder/) -- [General Documentation](https://github.com/vircadia/vircadia-docs-sphinx/) +- [User Documentation](https://github.com/vircadia/vircadia-docs-sphinx/) +- [Developer Documentation](https://github.com/vircadia/vircadia-dev-docs/) ### Contribution From b0205582448bee4b30e1d801c2e5dd3efca85a8f Mon Sep 17 00:00:00 2001 From: Dave_K Date: Tue, 25 May 2021 13:44:32 -0700 Subject: [PATCH 06/42] fix PR autobuild for ubuntu-18.04, android with correct cmake version (#1225) --- .github/workflows/pr_build.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/pr_build.yml b/.github/workflows/pr_build.yml index 606209725b..8b4201f068 100644 --- a/.github/workflows/pr_build.yml +++ b/.github/workflows/pr_build.yml @@ -188,6 +188,16 @@ jobs: done } retry cmake --build . --config $BUILD_TYPE --target package $CMAKE_BUILD_EXTRA + # As of 05/17/21 GitHub Virtual Environments changed their "Ubuntu 18.04.5 LTS" image to include two versions of CMake for Android + # https://github.com/actions/virtual-environments/blob/ubuntu18/20210517.1/images/linux/Ubuntu1804-README.md + # Removing 3.18.1 version of CMake as its not compatible with our Android build. + # It will fall back to 3.10.2 which is already installed + - name: Nuke CMake 3.18.1-g262b901 + if: matrix.build_type == 'android' + shell: bash + working-directory: ${{runner.workspace}}/vircadia + run: | + /usr/local/lib/android/sdk/tools/bin/sdkmanager --uninstall 'cmake;3.18.1' - name: Build for Android + Quest if: matrix.build_type == 'android' shell: bash From 6341dcce94e0ecd0f0ba8071255c6bf647d17f3e Mon Sep 17 00:00:00 2001 From: Kalila L Date: Tue, 25 May 2021 18:46:53 -0400 Subject: [PATCH 07/42] Create .grenrc.js --- .grenrc.js | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 .grenrc.js diff --git a/.grenrc.js b/.grenrc.js new file mode 100644 index 0000000000..2fdbca7769 --- /dev/null +++ b/.grenrc.js @@ -0,0 +1,42 @@ +// +// .grenrc.js +// +// Created by Kalila L. on May 25, 2021 +// Copyright 2021 Vircadia contributors. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +// This configuration is for generating a changelog with gren for a GitHub repository. +// +// gren changelog -G +// + +module.exports = { + "dataSource": "prs", + "prefix": "", + "ignoreLabels": [ + "enhancement", + "bugfix", + "CR Approved", + "QA Approved", + "allow-build-upload", + "bug", + "confirmed", + "do not merge", + "duplicate", + "good first issue", + "help wanted", + "hifi migration", + "high risk", + "rebuild", + "merge right before snip" + ], + "onlyMilestones": true, + "groupBy": { + "Enhancements": ["enhancement"], + "Bug Fixes": ["bugfix"], + "Docs": ["docs"] + }, + "changelogFilename": "CHANGELOG.md" +} \ No newline at end of file From 06b09dabc0fd2992dd6d180fbed49cdd2bc943a1 Mon Sep 17 00:00:00 2001 From: Kalila <69767640+digisomni@users.noreply.github.com> Date: Tue, 25 May 2021 20:22:41 -0400 Subject: [PATCH 08/42] Update MacOS packaging instructions. --- INSTALLER.md | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/INSTALLER.md b/INSTALLER.md index 4132ef7298..5ec64612f6 100644 --- a/INSTALLER.md +++ b/INSTALLER.md @@ -1,6 +1,6 @@ # Creating an Installer -*Last Updated on March 4, 2021* +*Last Updated on May 25, 2021* Follow the [build guide](BUILD.md) to figure out how to build Vircadia for your platform. @@ -85,19 +85,30 @@ For code signing to work, you will need to set the `HF_PFX_FILE` and `HF_PFX_PAS 1. **Cause:** The complete path (current directory + relative path) has to be < 260 characters to any of the relevant files. 1. **Solution:** Move your build and packaging folder as high up in the drive as possible to prevent an overage. -### OS X +### MacOS -1. [npm]() - Install version 12.16.3 LTS - -1. Perform a clean CMake. -1. Perform a Release build of ALL_BUILD -1. Perform a Release build of `packaged-server-console` +1. Ensure you have all the prerequisites fulfilled from the [MacOS Build Guide](BUILD_OSX.md). +2. Perform a clean CMake in your build folder. e.g. + ```bash + BUILD_GLOBAL_SERVICES=STABLE USE_STABLE_GLOBAL_SERVICES=1 RELEASE_BUILD=PRODUCTION BUILD_NUMBER="Insert Build Identifier here e.g. short hash of your last Git commit" RELEASE_NAME="Insert Release Name Here" STABLE_BUILD=1 PRODUCTION_BUILD=1 RELEASE_NUMBER="Insert Release Version Here e.g. 1.1.0" RELEASE_TYPE=PRODUCTION cmake -DCMAKE_OSX_SYSROOT="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk" -DCLIENT_ONLY=1 -DCMAKE_OSX_DEPLOYMENT_TARGET=10.12 -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl -DOSX_SDK=10.12 .. + ``` +3. Pick a method to build and package your release. + +#### Option A: Use GUI + +1. Perform a Release build of ALL_BUILD +2. Perform a Release build of `packaged-server-console` This will add a folder to `build\server-console\` - Sandbox-darwin-x64 -1. Perform a Release build of `package` - Installer is now available in `build/_CPack_Packages/Darwin/DragNDrop - +3. Perform a Release build of `package` + Installer is now available in `build/_CPack_Packages/Darwin/DragNDrop` + +#### Option B: Use Terminal + +1. Navigate to your build folder with your terminal. +2. `make -j4`, you can change the number to match the number of threads you would like to use. +3. `make package` to create the package. + ### Linux #### Server From 84c90bfd7decee8e3c8e1ecfe2acabff38e2f8a3 Mon Sep 17 00:00:00 2001 From: Kalila <69767640+digisomni@users.noreply.github.com> Date: Fri, 28 May 2021 16:24:20 -0400 Subject: [PATCH 09/42] Add URL for .grenrc.js reposi --- .grenrc.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.grenrc.js b/.grenrc.js index 2fdbca7769..0ac3acc842 100644 --- a/.grenrc.js +++ b/.grenrc.js @@ -8,6 +8,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // // This configuration is for generating a changelog with gren for a GitHub repository. +// https://github.com/github-tools/github-release-notes // // gren changelog -G // @@ -39,4 +40,4 @@ module.exports = { "Docs": ["docs"] }, "changelogFilename": "CHANGELOG.md" -} \ No newline at end of file +} From 7ccdbdea6433221fd356f0451a63449d286b9b4e Mon Sep 17 00:00:00 2001 From: Kalila L Date: Mon, 31 May 2021 05:43:12 -0400 Subject: [PATCH 10/42] Some APIDocs metadata fixes. --- tools/jsdoc/config.json | 16 ++++++++-------- tools/jsdoc/hifi-jsdoc-template/tmpl/layout.tmpl | 10 +++++----- tools/jsdoc/package.json | 2 +- tools/jsdoc/root.js | 3 ++- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/tools/jsdoc/config.json b/tools/jsdoc/config.json index 5074362225..10e6b6bc6d 100644 --- a/tools/jsdoc/config.json +++ b/tools/jsdoc/config.json @@ -3,15 +3,15 @@ "template": "hifi-jsdoc-template" }, "docdash": { - "meta": { - "title": "", - "description": "", - "keyword": "" + "meta": { + "title": "Vircadia API Docs", + "description": "API documentation for Vircadia.", + "keyword": "api, docs, vircadia, documentation" }, - "search": [true], - "collapse": [true], - "typedefs": [false] - }, + "search": [true], + "collapse": [true], + "typedefs": [false] + }, "templates": { "default": { "outputSourceFiles": false diff --git a/tools/jsdoc/hifi-jsdoc-template/tmpl/layout.tmpl b/tools/jsdoc/hifi-jsdoc-template/tmpl/layout.tmpl index 1ecd7fc7e0..10bf4bd8e1 100644 --- a/tools/jsdoc/hifi-jsdoc-template/tmpl/layout.tmpl +++ b/tools/jsdoc/hifi-jsdoc-template/tmpl/layout.tmpl @@ -3,7 +3,7 @@ - <?js= title ?> + <?js= title ?> - Vircadia API Docs @@ -42,7 +42,7 @@ } catch (e) { // nop } - + var defaultDarkDisabled = false; var darkDisabled = isLocalStorageSupported ? JSON.parse(localStorage.getItem('darkDisabled')) : defaultDarkDisabled; var nightSheet = document.querySelector('[href="styles/night.css"]'); @@ -53,7 +53,7 @@ } var defaultResponsiveDisabled = true; - var responsiveDisabled = + var responsiveDisabled = isLocalStorageSupported ? JSON.parse(localStorage.getItem('responsiveDisabled')) : defaultResponsiveDisabled; var responsiveSheet = document.querySelector('[href="styles/responsive.css"]'); if (responsiveDisabled === null) { @@ -78,7 +78,7 @@ -

Looking for Vircadia
Documentation?

+

Looking for Vircadia
Documentation?

Toggle mdi-theme-light-dark @@ -95,7 +95,7 @@

- +