From 3c687d29d898a09ba5078ef0c6e5a4cc06bcf3b3 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sun, 22 Jan 2017 20:14:37 +0100 Subject: [PATCH 01/44] Make regexp less strict --- make_release.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/make_release.sh b/make_release.sh index 19c661b38..2f8fd5e49 100755 --- a/make_release.sh +++ b/make_release.sh @@ -256,7 +256,7 @@ logInfo "All checks pass, getting our hands dirty now!" logInfo "Merging '${BRANCH}' into '${RELEASE_BRANCH}'..." -CHANGELOG=$(grep -Pzo "(?<=${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n)=+\n\n(?:.|\n)+?\n(?=\n)" \ +CHANGELOG=$(grep -Pzo "(?<=${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n)=+\n\n?(?:.|\n)+?\n(?=\n)" \ CHANGELOG | grep -Pzo '(?<=\n\n)(.|\n)+' | tr -d \\0) COMMIT_MSG="Release ${RELEASE_NAME}" From 1c12cd6b9e3159999098ca3d4e765104bb4e19f1 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sun, 22 Jan 2017 22:39:05 +0100 Subject: [PATCH 02/44] Add wget, file, fuse and python for building AppImages inside the container --- AppImage-Recipe.sh | 4 ++-- Dockerfile | 6 +++++- make_release.sh | 11 +++++++---- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/AppImage-Recipe.sh b/AppImage-Recipe.sh index 9575f077b..322b5464f 100755 --- a/AppImage-Recipe.sh +++ b/AppImage-Recipe.sh @@ -41,8 +41,8 @@ wget -q https://github.com/probonopd/AppImages/raw/master/functions.sh -O ./func cd $APP.AppDir cp -a ../../bin-release/* . -mv ./usr/local/* ./usr -rmdir ./usr/local +cp -a ./usr/local/* ./usr +rm -R ./usr/local patch_strings_in_file /usr/local ./ patch_strings_in_file /usr ./ diff --git a/Dockerfile b/Dockerfile index 3aee19e3c..444009932 100644 --- a/Dockerfile +++ b/Dockerfile @@ -27,7 +27,11 @@ RUN set -x \ libqt5x11extras5-dev \ libxi-dev \ libxtst-dev \ - zlib1g-dev + zlib1g-dev \ + wget \ + file \ + fuse \ + python VOLUME /keepassxc/src VOLUME /keepassxc/out diff --git a/make_release.sh b/make_release.sh index 2f8fd5e49..8a7281c8d 100755 --- a/make_release.sh +++ b/make_release.sh @@ -89,6 +89,7 @@ logError() { } exitError() { + return logError "$1" if [ "" != "$ORIG_BRANCH" ]; then git checkout "$ORIG_BRANCH" > /dev/null 2>&1 @@ -309,10 +310,14 @@ if $BUILD_SOURCES; then logInfo "Installing to bin dir..." make DESTDIR="${OUTPUT_DIR}/bin-release" install/strip + + logInfo "Creating AppImage..." + ${SRC_DIR}/AppImage-Recipe.sh "$APP_NAME" "$RELEASE_NAME" else logInfo "Launching Docker container to compile sources..." docker run --name "$DOCKER_CONTAINER_NAME" --rm \ + --cap-add SYS_ADMIN --device /dev/fuse \ -e "CC=${CC}" -e "CXX=${CXX}" \ -v "$(realpath "$SRC_DIR"):/keepassxc/src:ro" \ -v "$(realpath "$OUTPUT_DIR"):/keepassxc/out:rw" \ @@ -320,13 +325,11 @@ if $BUILD_SOURCES; then bash -c "cd /keepassxc/out/build-release && \ cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off $CMAKE_OPTIONS \ -DCMAKE_INSTALL_PREFIX=\"${INSTALL_PREFIX}\" /keepassxc/src && \ - make $MAKE_OPTIONS && make DESTDIR=/keepassxc/out/bin-release install/strip" + make $MAKE_OPTIONS && make DESTDIR=/keepassxc/out/bin-release install/strip && \ + /keepassxc/src/AppImage-Recipe.sh "$APP_NAME" "$RELEASE_NAME"" logInfo "Build finished, Docker container terminated." fi - - logInfo "Creating AppImage..." - ${SRC_DIR}/AppImage-Recipe.sh "$APP_NAME" "$RELEASE_NAME" cd .. logInfo "Signing source tarball..." From 0456815bd5cdcbd5c86375333b97fb81ed4cfee5 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Mon, 23 Jan 2017 01:06:31 +0100 Subject: [PATCH 03/44] Fix AppImage not launching on all platforms --- AppImage-Recipe.sh | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/AppImage-Recipe.sh b/AppImage-Recipe.sh index 322b5464f..d9cbd5651 100755 --- a/AppImage-Recipe.sh +++ b/AppImage-Recipe.sh @@ -43,13 +43,23 @@ cd $APP.AppDir cp -a ../../bin-release/* . cp -a ./usr/local/* ./usr rm -R ./usr/local -patch_strings_in_file /usr/local ./ +patch_strings_in_file /usr/local ././ patch_strings_in_file /usr ./ +# bundle Qt platform plugins +QXCB_PLUGIN="$(find /usr/lib -name 'libqxcb.so' 2> /dev/null)" +QT_PLUGIN_PATH="$(dirname $(dirname $QXCB_PLUGIN))" +mkdir -p "./${QT_PLUGIN_PATH}/platforms" +cp "$QXCB_PLUGIN" "./${QT_PLUGIN_PATH}/platforms/" + get_apprun copy_deps delete_blacklisted +# remove dbus and systemd libs as they are not blacklisted +find . -name libdbus-1.so.3 -exec rm {} \; +find . -name libsystemd.so.0 -exec rm {} \; + get_desktop get_icon get_desktopintegration $LOWERAPP @@ -58,7 +68,7 @@ GLIBC_NEEDED=$(glibc_needed) cd .. -generate_appimage +generate_type2_appimage mv ../out/*.AppImage .. rmdir ../out > /dev/null 2>&1 From 86cdb64b1d270ae5a1f95bb1ebbccc479a95e6e1 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Mon, 23 Jan 2017 01:11:20 +0100 Subject: [PATCH 04/44] Re-enable checks --- make_release.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/make_release.sh b/make_release.sh index 8a7281c8d..58f03534d 100755 --- a/make_release.sh +++ b/make_release.sh @@ -89,7 +89,6 @@ logError() { } exitError() { - return logError "$1" if [ "" != "$ORIG_BRANCH" ]; then git checkout "$ORIG_BRANCH" > /dev/null 2>&1 From 1310b34e9c9d7b70c8eb00c55680b72dee8f5e13 Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Tue, 24 Jan 2017 22:37:02 -0500 Subject: [PATCH 05/44] Added NSIS installer to CPack packager for Windows --- src/CMakeLists.txt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 30332c71e..22ca342c1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -257,9 +257,19 @@ if(APPLE) endif() if(MINGW) - set(CPACK_GENERATOR "ZIP") + set(CPACK_GENERATOR "ZIP;NSIS") set(CPACK_STRIP_FILES ON) - set(CPACK_PACKAGE_FILE_NAME "${PROGNAME}-${KEEPASSXC_VERSION_NUM}") + set(CPACK_PACKAGE_FILE_NAME "${PROGNAME}-${KEEPASSXC_VERSION}") + set(CPACK_PACKAGE_INSTALL_DIRECTORY ${PROGNAME}) + set(CPACK_PACKAGE_VERSION ${KEEPASSXC_VERSION}) + set(CPACK_PACKAGE_VENDOR "${PROGNAME} Team") + set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.GPL-2") + set(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/share/windows/keepassxc.ico") + set(CPACK_NSIS_CREATE_ICONS_EXTRA "CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\${PROGNAME}.lnk' '$INSTDIR\\\\${PROGNAME}.exe'") + set(CPACK_NSIS_DELETE_ICONS_EXTRA "Delete '$SMPROGRAMS\\\\$START_MENU\\\\${PROGNAME}.lnk'") + set(CPACK_NSIS_URL_INFO_ABOUT "https://keepassxc.org") + set(CPACK_NSIS_PACKAGE_NAME "${PROGNAME} v${KEEPASSXC_VERSION}") + set(CPACK_NSIS_MUI_FINISHPAGE_RUN "../${PROGNAME}.exe") include(CPack) install(CODE " From 292ed892c105de7281654796abb1e6aa4c8779ab Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Thu, 26 Jan 2017 01:15:12 +0100 Subject: [PATCH 06/44] Fix Windows linker and runtime errors when building against static Qt --- cmake/FindLibGPGError.cmake | 9 +++++++++ src/CMakeLists.txt | 1 + src/main.cpp | 10 ++++++++++ tests/CMakeLists.txt | 1 + utils/CMakeLists.txt | 2 ++ 5 files changed, 23 insertions(+) create mode 100644 cmake/FindLibGPGError.cmake diff --git a/cmake/FindLibGPGError.cmake b/cmake/FindLibGPGError.cmake new file mode 100644 index 000000000..fe9ef9123 --- /dev/null +++ b/cmake/FindLibGPGError.cmake @@ -0,0 +1,9 @@ + +find_path(GPGERROR_INCLUDE_DIR gpg-error.h) + +find_library(GPGERROR_LIBRARIES gpg-error) + +mark_as_advanced(GPGERROR_LIBRARIES GPGERROR_INCLUDE_DIR) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(LibGPGError DEFAULT_MSG GPGERROR_LIBRARIES GPGERROR_INCLUDE_DIR) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 22ca342c1..b843de85a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -218,6 +218,7 @@ target_link_libraries(${PROGNAME} Qt5::Widgets Qt5::Network ${GCRYPT_LIBRARIES} + ${GPGERROR_LIBRARIES} ${ZLIB_LIBRARIES}) set_target_properties(${PROGNAME} PROPERTIES ENABLE_EXPORTS ON) diff --git a/src/main.cpp b/src/main.cpp index a94d65eaa..224e54d1e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,6 +28,16 @@ #include "gui/MainWindow.h" #include "gui/MessageBox.h" +#ifdef QT_STATIC +#include + +#ifdef Q_OS_WIN +Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin) +#elif Q_OS_LINUX +Q_IMPORT_PLUGIN(QXcbIntegrationPlugin) +#endif +#endif + int main(int argc, char** argv) { #ifdef QT_NO_DEBUG diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 0ea73b2fe..5840a5b4b 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -92,6 +92,7 @@ set(TEST_LIBRARIES Qt5::Widgets Qt5::Test ${GCRYPT_LIBRARIES} + ${GPGERROR_LIBRARIES} ${ZLIB_LIBRARIES} ) diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt index 846e39230..83f00b4bc 100644 --- a/utils/CMakeLists.txt +++ b/utils/CMakeLists.txt @@ -20,6 +20,7 @@ target_link_libraries(kdbx-extract keepassx_core Qt5::Core ${GCRYPT_LIBRARIES} + ${GPGERROR_LIBRARIES} ${ZLIB_LIBRARIES}) add_executable(kdbx-merge kdbx-merge.cpp) @@ -27,6 +28,7 @@ target_link_libraries(kdbx-merge keepassx_core Qt5::Core ${GCRYPT_LIBRARIES} + ${GPGERROR_LIBRARIES} ${ZLIB_LIBRARIES}) From 1554722a8382afbff47bcb0cc18f69194d923805 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Thu, 26 Jan 2017 02:58:46 +0100 Subject: [PATCH 07/44] Add missing find_package call --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 051aba199..2fd890e01 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -172,6 +172,8 @@ set(CMAKE_AUTOMOC ON) # Make sure we don't enable asserts there. set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_NONE QT_NO_DEBUG) +find_package(LibGPGError REQUIRED) + find_package(Gcrypt 1.6.0 REQUIRED) if (WITH_XC_HTTP) From 66253e142bfcd58f614b57c20d6c91845e5ba5d2 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Thu, 26 Jan 2017 20:08:53 +0100 Subject: [PATCH 08/44] Install qwindows platform abstraction plugin on Windows --- src/CMakeLists.txt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b843de85a..69af4359c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -258,9 +258,10 @@ if(APPLE) endif() if(MINGW) + string(REPLACE "AMD" "Win" OUTPUT_FILE_POSTFIX "${CMAKE_HOST_SYSTEM_PROCESSOR}") set(CPACK_GENERATOR "ZIP;NSIS") set(CPACK_STRIP_FILES ON) - set(CPACK_PACKAGE_FILE_NAME "${PROGNAME}-${KEEPASSXC_VERSION}") + set(CPACK_PACKAGE_FILE_NAME "${PROGNAME}-${KEEPASSXC_VERSION}-${OUTPUT_FILE_POSTFIX}") set(CPACK_PACKAGE_INSTALL_DIRECTORY ${PROGNAME}) set(CPACK_PACKAGE_VERSION ${KEEPASSXC_VERSION}) set(CPACK_PACKAGE_VENDOR "${PROGNAME} Team") @@ -278,5 +279,9 @@ if(MINGW) " COMPONENT Runtime) include(DeployQt4) - install_qt4_executable(${PROGNAME}.exe "qjpeg;qgif;qico;qtaccessiblewidgets") + install_qt4_executable(${PROGNAME}.exe) + add_custom_command(TARGET ${PROGNAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../share/qt5/plugins/platforms/qwindows$<$:d>.dll + $) + install(FILES $/qwindows$<$:d>.dll DESTINATION "platforms") endif() From 3f1a75f40a2d2f0118c945eaf4d11fb1045994e7 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Thu, 26 Jan 2017 22:37:27 +0200 Subject: [PATCH 09/44] Merge pull request #222 from rockihack/fix-global-autotype MacOS: Fix Global Autotype in Google Chrome, resolves #212 --- src/autotype/mac/AutoTypeMac.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/autotype/mac/AutoTypeMac.cpp b/src/autotype/mac/AutoTypeMac.cpp index 90563a23a..e55c336cb 100644 --- a/src/autotype/mac/AutoTypeMac.cpp +++ b/src/autotype/mac/AutoTypeMac.cpp @@ -98,7 +98,9 @@ QString AutoTypePlatformMac::activeWindowTitle() if (windowLayer(window) == 0) { // First toplevel window in list (front to back order) title = windowTitle(window); - break; + if (!title.isEmpty()) { + break; + } } } From a80c415fc09fed34c7a84e77325e5e18ceb6795f Mon Sep 17 00:00:00 2001 From: Louis-Bertrand Varin Date: Thu, 26 Jan 2017 18:38:50 -0500 Subject: [PATCH 10/44] Disable buttonGenerate when no classes. --- src/gui/PasswordGeneratorWidget.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/gui/PasswordGeneratorWidget.cpp b/src/gui/PasswordGeneratorWidget.cpp index 6495d83a2..d61528f9f 100644 --- a/src/gui/PasswordGeneratorWidget.cpp +++ b/src/gui/PasswordGeneratorWidget.cpp @@ -132,8 +132,10 @@ void PasswordGeneratorWidget::updatePasswordStrength(const QString& password) void PasswordGeneratorWidget::generatePassword() { - QString password = m_generator->generatePassword(); - m_ui->editNewPassword->setText(password); + if (m_generator->isValid()) { + QString password = m_generator->generatePassword(); + m_ui->editNewPassword->setText(password); + } } void PasswordGeneratorWidget::applyPassword() @@ -279,5 +281,12 @@ void PasswordGeneratorWidget::updateGenerator() m_generator->setCharClasses(classes); m_generator->setFlags(flags); + if (m_generator->isValid()) { + m_ui->buttonGenerate->setEnabled(true); + } + else { + m_ui->buttonGenerate->setEnabled(false); + } + regeneratePassword(); } From 0d222e138f9d612bdbcd92953aa8f322b98da8f4 Mon Sep 17 00:00:00 2001 From: Louis-Bertrand Varin Date: Thu, 26 Jan 2017 20:18:09 -0500 Subject: [PATCH 11/44] else on the same line. --- src/gui/PasswordGeneratorWidget.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/gui/PasswordGeneratorWidget.cpp b/src/gui/PasswordGeneratorWidget.cpp index d61528f9f..9f2bf31ce 100644 --- a/src/gui/PasswordGeneratorWidget.cpp +++ b/src/gui/PasswordGeneratorWidget.cpp @@ -283,8 +283,7 @@ void PasswordGeneratorWidget::updateGenerator() if (m_generator->isValid()) { m_ui->buttonGenerate->setEnabled(true); - } - else { + } else { m_ui->buttonGenerate->setEnabled(false); } From cdc9fddc4480c77e7ab2c2ec41b0c04f5d24e37a Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Fri, 27 Jan 2017 17:44:40 +0100 Subject: [PATCH 12/44] Don't make font size of password strength labels smaller than 8pt, resolves #228 --- src/gui/PasswordGeneratorWidget.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/gui/PasswordGeneratorWidget.cpp b/src/gui/PasswordGeneratorWidget.cpp index 9f2bf31ce..4a4b438e3 100644 --- a/src/gui/PasswordGeneratorWidget.cpp +++ b/src/gui/PasswordGeneratorWidget.cpp @@ -45,11 +45,15 @@ PasswordGeneratorWidget::PasswordGeneratorWidget(QWidget* parent) connect(m_ui->optionButtons, SIGNAL(buttonClicked(int)), SLOT(updateGenerator())); - // set font size of password quality and entropy labels dynamically to 80% of the default font size + // set font size of password quality and entropy labels dynamically to 80% of + // the default font size, but make it no smaller than 8pt QFont defaultFont; - defaultFont.setPointSize(static_cast(defaultFont.pointSize() * 0.8f)); - m_ui->entropyLabel->setFont(defaultFont); - m_ui->strengthLabel->setFont(defaultFont); + int smallerSize = static_cast(defaultFont.pointSize() * 0.8f); + if (smallerSize >= 8) { + defaultFont.setPointSize(smallerSize); + m_ui->entropyLabel->setFont(defaultFont); + m_ui->strengthLabel->setFont(defaultFont); + } loadSettings(); reset(); From 6796f2068325c47497f01ec81675d6e19a5bb22c Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Fri, 27 Jan 2017 18:11:17 +0100 Subject: [PATCH 13/44] Remove hardcoded font size from UI file --- src/gui/PasswordGeneratorWidget.ui | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/gui/PasswordGeneratorWidget.ui b/src/gui/PasswordGeneratorWidget.ui index a2e798abf..7ca7b1deb 100644 --- a/src/gui/PasswordGeneratorWidget.ui +++ b/src/gui/PasswordGeneratorWidget.ui @@ -104,11 +104,6 @@ QProgressBar::chunk { 30 - - - 8 - - strength @@ -144,11 +139,6 @@ QProgressBar::chunk { 0 - - - 8 - - entropy From fd2b779bb809361947849b3641c20c6d0597147f Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Fri, 27 Jan 2017 17:24:53 +0100 Subject: [PATCH 14/44] Use consistent button min-heights, resolves #192 --- src/gui/PasswordGeneratorWidget.ui | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/gui/PasswordGeneratorWidget.ui b/src/gui/PasswordGeneratorWidget.ui index 7ca7b1deb..b7413f56b 100644 --- a/src/gui/PasswordGeneratorWidget.ui +++ b/src/gui/PasswordGeneratorWidget.ui @@ -285,6 +285,12 @@ QProgressBar::chunk { + + + 0 + 26 + + Qt::StrongFocus @@ -304,6 +310,12 @@ QProgressBar::chunk { + + + 0 + 26 + + Qt::StrongFocus From 3c9054c36f6da152d5bcd7b312c94a85099b12dc Mon Sep 17 00:00:00 2001 From: Louis-Bertrand Varin Date: Fri, 27 Jan 2017 13:43:45 -0500 Subject: [PATCH 15/44] Fixes #225 : downloading favicon crash --- src/gui/EditWidgetIcons.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gui/EditWidgetIcons.cpp b/src/gui/EditWidgetIcons.cpp index e0ac5227b..145957ab9 100644 --- a/src/gui/EditWidgetIcons.cpp +++ b/src/gui/EditWidgetIcons.cpp @@ -190,6 +190,10 @@ void EditWidgetIcons::abortFaviconDownload(bool clearRedirect) void EditWidgetIcons::onRequestFinished(QNetworkReply *reply) { + if (m_database == nullptr) { + return; + } + if (!reply->error()) { QImage image; image.loadFromData(reply->readAll()); From 0f44f6752efe030dd9b18f43460505569e13257f Mon Sep 17 00:00:00 2001 From: thez3ro Date: Fri, 27 Jan 2017 20:39:32 +0100 Subject: [PATCH 16/44] Fix entropy_meter script --- utils/entropy-meter.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/utils/entropy-meter.cpp b/utils/entropy-meter.cpp index a5e6e50e9..74f6bc11a 100644 --- a/utils/entropy-meter.cpp +++ b/utils/entropy-meter.cpp @@ -101,9 +101,10 @@ int main(int argc, char **argv) break; } } - if (line[0]) + if (line[0]) { calculate(line,advanced); printf("> "); + } } } else From b97024c8f622b239c27d2d378257bbde201621b3 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Fri, 27 Jan 2017 20:42:27 +0100 Subject: [PATCH 17/44] Add more KeePassXC branding to the Windows installer --- src/CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 69af4359c..8c3948842 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -265,8 +265,13 @@ if(MINGW) set(CPACK_PACKAGE_INSTALL_DIRECTORY ${PROGNAME}) set(CPACK_PACKAGE_VERSION ${KEEPASSXC_VERSION}) set(CPACK_PACKAGE_VENDOR "${PROGNAME} Team") + string(REGEX REPLACE "/" "\\\\\\\\" CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/share/windows/installer-header.bmp") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.GPL-2") set(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/share/windows/keepassxc.ico") + set(CPACK_NSIS_MUI_UNIICON "${CPACK_NSIS_MUI_ICON}") + set(CPACK_NSIS_INSTALLED_ICON_NAME "\\\\${PROGNAME}.exe") + string(REGEX REPLACE "/" "\\\\\\\\" CPACK_NSIS_MUI_WELCOMEFINISHPAGE_BITMAP "${CMAKE_SOURCE_DIR}/share/windows/installer-wizard.bmp") + set(CPACK_NSIS_MUI_UNWELCOMEFINISHPAGE_BITMAP "${CPACK_NSIS_MUI_WELCOMEFINISHPAGE_BITMAP}") set(CPACK_NSIS_CREATE_ICONS_EXTRA "CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\${PROGNAME}.lnk' '$INSTDIR\\\\${PROGNAME}.exe'") set(CPACK_NSIS_DELETE_ICONS_EXTRA "Delete '$SMPROGRAMS\\\\$START_MENU\\\\${PROGNAME}.lnk'") set(CPACK_NSIS_URL_INFO_ABOUT "https://keepassxc.org") From c87c8117194594a6c9ca4a5e6dc4db502b58551c Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sat, 28 Jan 2017 22:11:05 +0100 Subject: [PATCH 18/44] Make release script more modular and useful on other platforms --- make_release.sh | 352 ---------------------------- release-tool | 596 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 596 insertions(+), 352 deletions(-) delete mode 100755 make_release.sh create mode 100755 release-tool diff --git a/make_release.sh b/make_release.sh deleted file mode 100755 index 58f03534d..000000000 --- a/make_release.sh +++ /dev/null @@ -1,352 +0,0 @@ -#!/usr/bin/env bash -# -# KeePassXC Release Preparation Helper -# Copyright (C) 2017 KeePassXC team -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 or (at your option) -# version 3 of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -echo -e "\e[1m\e[32mKeePassXC\e[0m Release Preparation Helper" -echo -e "Copyright (C) 2017 KeePassXC Team \n" - - -# default values -RELEASE_NAME="" -APP_NAME="KeePassXC" -APP_NAME_LOWER="keepassxc" -SRC_DIR="." -GPG_KEY="CFB4C2166397D0D2" -GPG_GIT_KEY="" -OUTPUT_DIR="release" -BRANCH="" -RELEASE_BRANCH="master" -TAG_NAME="" -BUILD_SOURCES=false -DOCKER_IMAGE="" -DOCKER_CONTAINER_NAME="${APP_NAME_LOWER}-build-container" -CMAKE_OPTIONS="" -COMPILER="g++" -MAKE_OPTIONS="-j8" -BUILD_PLUGINS="autotype" -INSTALL_PREFIX="/usr/local" - -ORIG_BRANCH="$(git rev-parse --abbrev-ref HEAD 2> /dev/null)" -ORIG_CWD="$(pwd)" - - -# helper functions -printUsage() { - echo -e "\e[1mUsage:\e[0m $(basename $0) [options]" - cat << EOF - -Options: - -v, --version Release version number or name (required) - -a, --app-name Application name (default: '${APP_NAME}') - -s, --source-dir Source directory (default: '${SRC_DIR}') - -k, --gpg-key GPG key used to sign the release tarball - (default: '${GPG_KEY}') - -g, --gpg-git-key GPG key used to sign the merge commit and release tag, - leave empty to let Git choose your default key - (default: '${GPG_GIT_KEY}') - -o, --output-dir Output directory where to build the release - (default: '${OUTPUT_DIR}') - --develop-branch Development branch to merge from (default: 'release/VERSION') - --release-branch Target release branch to merge to (default: '${RELEASE_BRANCH}') - -t, --tag-name Override release tag name (defaults to version number) - -b, --build Build sources after exporting release - -d, --docker-image Use the specified Docker image to compile the application. - The image must have all required build dependencies installed. - This option has no effect if --build is not set. - --container-name Docker container name (default: '${DOCKER_CONTAINER_NAME}') - The container must not exist already - -c, --cmake-options Additional CMake options for compiling the sources - --compiler Compiler to use (default: '${COMPILER}') - -m, --make-options Make options for compiling sources (default: '${MAKE_OPTIONS}') - -i, --install-prefix Install prefix (default: '${INSTALL_PREFIX}') - -p, --plugins Space-separated list of plugins to build - (default: ${BUILD_PLUGINS}) - -h, --help Show this help - -EOF -} - -logInfo() { - echo -e "\e[1m[ \e[34mINFO\e[39m ]\e[0m $1" -} - -logError() { - echo -e "\e[1m[ \e[31mERROR\e[39m ]\e[0m $1" >&2 -} - -exitError() { - logError "$1" - if [ "" != "$ORIG_BRANCH" ]; then - git checkout "$ORIG_BRANCH" > /dev/null 2>&1 - fi - cd "$ORIG_CWD" - exit 1 -} - - -# parse command line options -while [ $# -ge 1 ]; do - arg="$1" - - case "$arg" in - -a|--app-name) - APP_NAME="$2" - shift ;; - - -s|--source-dir) - SRC_DIR"$2" - shift ;; - - -v|--version) - RELEASE_NAME="$2" - shift ;; - - -k|--gpg-key) - GPG_KEY="$2" - shift ;; - - -g|--gpg-git-key) - GPG_GIT_KEY="$2" - shift ;; - - -o|--output-dir) - OUTPUT_DIR="$2" - shift ;; - - --develop-branch) - BRANCH="$2" - shift ;; - - --release-branch) - RELEASE_BRANCH="$2" - shift ;; - - -t|--tag-name) - TAG_NAME="$2" - shift ;; - - -b|--build) - BUILD_SOURCES=true ;; - - -d|--docker-image) - DOCKER_IMAGE="$2" - shift ;; - - --container-name) - DOCKER_CONTAINER_NAME="$2" - shift ;; - - -c|--cmake-options) - CMAKE_OPTIONS="$2" - shift ;; - - -m|--make-options) - MAKE_OPTIONS="$2" - shift ;; - - --compiler) - COMPILER="$2" - shift ;; - - -p|--plugins) - BUILD_PLUGINS="$2" - shift ;; - - -h|--help) - printUsage - exit ;; - - *) - logError "Unknown option '$arg'\n" - printUsage - exit 1 ;; - esac - shift -done - - -if [ "" == "$RELEASE_NAME" ]; then - logError "Missing arguments, --version is required!\n" - printUsage - exit 1 -fi - -if [ "" == "$TAG_NAME" ]; then - TAG_NAME="$RELEASE_NAME" -fi -if [ "" == "$BRANCH" ]; then - BRANCH="release/${RELEASE_NAME}" -fi -APP_NAME_LOWER="$(echo "$APP_NAME" | tr '[:upper:]' '[:lower:]')" -APP_NAME_UPPER="$(echo "$APP_NAME" | tr '[:lower:]' '[:upper:]')" - -SRC_DIR="$(realpath "$SRC_DIR")" -OUTPUT_DIR="$(realpath "$OUTPUT_DIR")" -if [ ! -d "$SRC_DIR" ]; then - exitError "Source directory '${SRC_DIR}' does not exist!" -fi - -logInfo "Changing to source directory..." -cd "${SRC_DIR}" - -logInfo "Performing basic checks..." - -if [ -e "$OUTPUT_DIR" ]; then - exitError "Output directory '$OUTPUT_DIR' already exists. Please choose a different location!" -fi - -if [ ! -d .git ] || [ ! -f CHANGELOG ]; then - exitError "Source directory is not a valid Git repository!" -fi - -git tag | grep -q "$RELEASE_NAME" -if [ $? -eq 0 ]; then - exitError "Release '$RELEASE_NAME' already exists!" -fi - -git diff-index --quiet HEAD -- -if [ $? -ne 0 ]; then - exitError "Current working tree is not clean! Please commit or unstage any changes." -fi - -git checkout "$BRANCH" > /dev/null 2>&1 -if [ $? -ne 0 ]; then - exitError "Source branch '$BRANCH' does not exist!" -fi - -grep -q "${APP_NAME_UPPER}_VERSION \"${RELEASE_NAME}\"" CMakeLists.txt -if [ $? -ne 0 ]; then - exitError "${APP_NAME_UPPER}_VERSION version not updated to '${RELEASE_NAME}' in CMakeLists.txt!" -fi - -grep -q "${APP_NAME_UPPER}_VERSION_NUM \"${RELEASE_NAME}\"" CMakeLists.txt -if [ $? -ne 0 ]; then - exitError "${APP_NAME_UPPER}_VERSION_NUM version not updated to '${RELEASE_NAME}' in CMakeLists.txt!" -fi - -if [ ! -f CHANGELOG ]; then - exitError "No CHANGELOG file found!" -fi - -grep -qPzo "${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n=+\n" CHANGELOG -if [ $? -ne 0 ]; then - exitError "CHANGELOG does not contain any information about the '${RELEASE_NAME}' release!" -fi - -git checkout "$RELEASE_BRANCH" > /dev/null 2>&1 -if [ $? -ne 0 ]; then - exitError "Release branch '$RELEASE_BRANCH' does not exist!" -fi - -logInfo "All checks pass, getting our hands dirty now!" - -logInfo "Merging '${BRANCH}' into '${RELEASE_BRANCH}'..." - -CHANGELOG=$(grep -Pzo "(?<=${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n)=+\n\n?(?:.|\n)+?\n(?=\n)" \ - CHANGELOG | grep -Pzo '(?<=\n\n)(.|\n)+' | tr -d \\0) -COMMIT_MSG="Release ${RELEASE_NAME}" - -git merge "$BRANCH" --no-ff -m "$COMMIT_MSG" -m "${CHANGELOG}" "$BRANCH" -S"$GPG_GIT_KEY" - -logInfo "Creating tag '${RELEASE_NAME}'..." -if [ "" == "$GPG_GIT_KEY" ]; then - git tag -a "$RELEASE_NAME" -m "$COMMIT_MSG" -m "${CHANGELOG}" -s -else - git tag -a "$RELEASE_NAME" -m "$COMMIT_MSG" -m "${CHANGELOG}" -s -u "$GPG_GIT_KEY" -fi - -logInfo "Merge done, creating target directory..." -mkdir -p "$OUTPUT_DIR" - -if [ $? -ne 0 ]; then - exitError "Failed to create output directory!" -fi - -logInfo "Creating source tarball..." -TARBALL_NAME="${APP_NAME_LOWER}-${RELEASE_NAME}-src.tar.bz2" -git archive --format=tar "$RELEASE_BRANCH" --prefix="${APP_NAME_LOWER}-${RELEASE_NAME}/" \ - | bzip2 -9 > "${OUTPUT_DIR}/${TARBALL_NAME}" - - -if $BUILD_SOURCES; then - logInfo "Creating build directory..." - mkdir -p "${OUTPUT_DIR}/build-release" - mkdir -p "${OUTPUT_DIR}/bin-release" - cd "${OUTPUT_DIR}/build-release" - - logInfo "Configuring sources..." - for p in $BUILD_PLUGINS; do - CMAKE_OPTIONS="${CMAKE_OPTIONS} -DWITH_XC_$(echo $p | tr '[:lower:]' '[:upper:]')=On" - done - - if [ "$COMPILER" == "g++" ]; then - export CC=gcc - elif [ "$COMPILER" == "clang++" ]; then - export CC=clang - fi - export CXX="$COMPILER" - - if [ "" == "$DOCKER_IMAGE" ]; then - cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off $CMAKE_OPTIONS \ - -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" "$SRC_DIR" - - logInfo "Compiling sources..." - make $MAKE_OPTIONS - - logInfo "Installing to bin dir..." - make DESTDIR="${OUTPUT_DIR}/bin-release" install/strip - - logInfo "Creating AppImage..." - ${SRC_DIR}/AppImage-Recipe.sh "$APP_NAME" "$RELEASE_NAME" - else - logInfo "Launching Docker container to compile sources..." - - docker run --name "$DOCKER_CONTAINER_NAME" --rm \ - --cap-add SYS_ADMIN --device /dev/fuse \ - -e "CC=${CC}" -e "CXX=${CXX}" \ - -v "$(realpath "$SRC_DIR"):/keepassxc/src:ro" \ - -v "$(realpath "$OUTPUT_DIR"):/keepassxc/out:rw" \ - "$DOCKER_IMAGE" \ - bash -c "cd /keepassxc/out/build-release && \ - cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off $CMAKE_OPTIONS \ - -DCMAKE_INSTALL_PREFIX=\"${INSTALL_PREFIX}\" /keepassxc/src && \ - make $MAKE_OPTIONS && make DESTDIR=/keepassxc/out/bin-release install/strip && \ - /keepassxc/src/AppImage-Recipe.sh "$APP_NAME" "$RELEASE_NAME"" - - logInfo "Build finished, Docker container terminated." - fi - - cd .. - logInfo "Signing source tarball..." - gpg --output "${TARBALL_NAME}.sig" --armor --local-user "$GPG_KEY" --detach-sig "$TARBALL_NAME" - - logInfo "Signing AppImage..." - APPIMAGE_NAME="${APP_NAME}-${RELEASE_NAME}-x86_64.AppImage" - gpg --output "${APPIMAGE_NAME}.sig" --armor --local-user "$GPG_KEY" --detach-sig "$APPIMAGE_NAME" - - logInfo "Creating digests..." - sha256sum "$TARBALL_NAME" > "${TARBALL_NAME}.DIGEST" - sha256sum "$APPIMAGE_NAME" > "${APPIMAGE_NAME}.DIGEST" -fi - -logInfo "Leaving source directory..." -cd "$ORIG_CWD" -git checkout "$ORIG_BRANCH" > /dev/null 2>&1 - -logInfo "All done!" -logInfo "Please merge the release branch back into the develop branch now and then push your changes." -logInfo "Don't forget to also push the tags using \e[1mgit push --tags\e[0m." diff --git a/release-tool b/release-tool new file mode 100755 index 000000000..8e3285b1a --- /dev/null +++ b/release-tool @@ -0,0 +1,596 @@ +#!/usr/bin/env bash +# +# KeePassXC Release Preparation Helper +# Copyright (C) 2017 KeePassXC team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 or (at your option) +# version 3 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +echo -e "\e[1m\e[32mKeePassXC\e[0m Release Preparation Helper" +echo -e "Copyright (C) 2017 KeePassXC Team \n" + + +# ----------------------------------------------------------------------- +# global default values +# ----------------------------------------------------------------------- +RELEASE_NAME="" +APP_NAME="KeePassXC" +SRC_DIR="." +GPG_KEY="CFB4C2166397D0D2" +GPG_GIT_KEY="" +OUTPUT_DIR="release" +SOURCE_BRANCH="" +TARGET_BRANCH="master" +TAG_NAME="" +DOCKER_IMAGE="" +DOCKER_CONTAINER_NAME="keepassxc-build-container" +CMAKE_OPTIONS="" +COMPILER="g++" +MAKE_OPTIONS="-j8" +BUILD_PLUGINS="autotype" +INSTALL_PREFIX="/usr/local" +BUILD_SOURCE_TARBALL=true +ORIG_BRANCH="" +ORIG_CWD="$(pwd)" + +# ----------------------------------------------------------------------- +# helper functions +# ----------------------------------------------------------------------- +printUsage() { + local cmd + if [ "" == "$1" ] || [ "help" == "$1" ]; then + cmd="COMMAND" + elif [ "merge" == "$1" ] || [ "build" == "$1" ] || [ "sign" == "$1" ]; then + cmd="$1" + else + logError "Unknown command: '$1'" + echo + cmd="COMMAND" + fi + + echo -e "\e[1mUsage:\e[0m $(basename $0) $cmd [options]" + + if [ "COMMAND" == "$cmd" ]; then + cat << EOF + +Commands: + merge Merge release development branch into main branch + and create release tags + build Build and package binary release from sources + sign Sign compile release packages + help Show help for the given command +EOF + elif [ "merge" == "$cmd" ]; then + cat << EOF + +Options: + -v, --version Release version number or name (required) + -a, --app-name Application name (default: '${APP_NAME}') + -s, --source-dir Source directory (default: '${SRC_DIR}') + -g, --gpg-key GPG key used to sign the merge commit and release tag, + leave empty to let Git choose your default key + (default: '${GPG_GIT_KEY}') + -r, --release-branch Source release branch to merge from (default: 'release/VERSION') + --target-branch Target branch to merge to (default: '${TARGET_BRANCH}') + -t, --tag-name Override release tag name (defaults to version number) + -h, --help Show this help +EOF + elif [ "build" == "$cmd" ]; then + cat << EOF + +Options: + -v, --version Release version number or name (required) + -a, --app-name Application name (default: '${APP_NAME}') + -s, --source-dir Source directory (default: '${SRC_DIR}') + -o, --output-dir Output directory where to build the release + (default: '${OUTPUT_DIR}') + -t, --tag-name Release tag to check out (defaults to version number) + -b, --build Build sources after exporting release + -d, --docker-image Use the specified Docker image to compile the application. + The image must have all required build dependencies installed. + This option has no effect if --build is not set. + --container-name Docker container name (default: '${DOCKER_CONTAINER_NAME}') + The container must not exist already + -c, --cmake-options Additional CMake options for compiling the sources + --compiler Compiler to use (default: '${COMPILER}') + -m, --make-options Make options for compiling sources (default: '${MAKE_OPTIONS}') + -i, --install-prefix Install prefix (default: '${INSTALL_PREFIX}') + -p, --plugins Space-separated list of plugins to build + (default: ${BUILD_PLUGINS}) + -n, --no-source-tarball Don't build source tarball + -h, --help Show this help +EOF + elif [ "sign" == "$cmd" ]; then + cat << EOF + +Options: + -f, --files Files to sign (required) + -g, --gpg-key GPG key used to sign the files (default: '${GPG_KEY}') + -h, --help Show this help +EOF + fi +} + +logInfo() { + echo -e "\e[1m[ \e[34mINFO\e[39m ]\e[0m $1" +} + +logError() { + echo -e "\e[1m[ \e[31mERROR\e[39m ]\e[0m $1" >&2 +} + +init() { + ORIG_CWD="$(pwd)" + cd "$SRC_DIR" > /dev/null 2>&1 + ORIG_BRANCH="$(git rev-parse --abbrev-ref HEAD 2> /dev/null)" + cd "$ORIG_CWD" +} + +cleanup() { + logInfo "Checking out original branch..." + if [ "" != "$ORIG_BRANCH" ]; then + git checkout "$ORIG_BRANCH" > /dev/null 2>&1 + fi + logInfo "Leaving source directory..." + cd "$ORIG_CWD" +} + +exitError() { + logError "$1" + cleanup + exit 1 +} + +exitTrap() { + exitError "Existing upon user request..." +} + +checkSourceDirExists() { + if [ ! -d "$SRC_DIR" ]; then + exitError "Source directory '${SRC_DIR}' does not exist!" + fi +} + +checkOutputDirDoesNotExist() { + if [ -e "$OUTPUT_DIR" ]; then + exitError "Output directory '$OUTPUT_DIR' already exists. Please choose a different location!" + fi +} + +checkGitRepository() { + if [ ! -d .git ] || [ ! -f CHANGELOG ]; then + exitError "Source directory is not a valid Git repository!" + fi +} + +checkTagExists() { + git tag | grep -q "$TAG_NAME" + if [ $? -ne 0 ]; then + exitError "Tag '${TAG_NAME}' does not exist!" + fi +} + +checkReleaseDoesNotExist() { + git tag | grep -q "$TAG_NAME" + if [ $? -eq 0 ]; then + exitError "Release '$RELEASE_NAME' (tag: '$TAG_NAME') already exists!" + fi +} + +checkWorkingTreeClean() { + git diff-index --quiet HEAD -- + if [ $? -ne 0 ]; then + exitError "Current working tree is not clean! Please commit or unstage any changes." + fi +} + +checkSourceBranchExists() { + git rev-parse "$SOURCE_BRANCH" > /dev/null 2>&1 + if [ $? -ne 0 ]; then + exitError "Source branch '$SOURCE_BRANCH' does not exist!" + fi +} + +checkTargetBranchExists() { + git rev-parse "$TARGET_BRANCH" > /dev/null 2>&1 + if [ $? -ne 0 ]; then + exitError "Target branch '$TARGET_BRANCH' does not exist!" + fi +} + +checkVersionInCMake() { + local app_name_upper="$(echo "$APP_NAME" | tr '[:lower:]' '[:upper:]')" + + grep -q "${app_name_upper}_VERSION \"${RELEASE_NAME}\"" CMakeLists.txt + if [ $? -ne 0 ]; then + exitError "${app_name_upper}_VERSION version not updated to '${RELEASE_NAME}' in CMakeLists.txt!" + fi + + grep -q "${app_name_upper}_VERSION_NUM \"${RELEASE_NAME}\"" CMakeLists.txt + if [ $? -ne 0 ]; then + exitError "${app_name_upper}_VERSION_NUM version not updated to '${RELEASE_NAME}' in CMakeLists.txt!" + fi +} + +checkChangeLog() { + if [ ! -f CHANGELOG ]; then + exitError "No CHANGELOG file found!" + fi + + grep -qPzo "${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n=+\n" CHANGELOG + if [ $? -ne 0 ]; then + exitError "CHANGELOG does not contain any information about the '${RELEASE_NAME}' release!" + fi +} + + +trap exitTrap SIGINT SIGTERM + + +# ----------------------------------------------------------------------- +# merge command +# ----------------------------------------------------------------------- +merge() { + while [ $# -ge 1 ]; do + local arg="$1" + case "$arg" in + -v|--version) + RELEASE_NAME="$2" + shift ;; + + -a|--app-name) + APP_NAME="$2" + shift ;; + + -s|--source-dir) + SRC_DIR="$2" + shift ;; + + -g|--gpg-key) + GPG_GIT_KEY="$2" + shift ;; + + -r|--release-branch) + SOURCE_BRANCH="$2" + shift ;; + + --target-branch) + TARGET_BRANCH="$2" + shift ;; + + -t|--tag-name) + TAG_NAME="$2" + shift ;; + + -h|--help) + printUsage "merge" + exit ;; + + *) + logError "Unknown option '$arg'\n" + printUsage "merge" + exit 1 ;; + esac + shift + done + + if [ "" == "$RELEASE_NAME" ]; then + logError "Missing arguments, --version is required!\n" + printUsage "merge" + exit 1 + fi + + if [ "" == "$TAG_NAME" ]; then + TAG_NAME="$RELEASE_NAME" + fi + + if [ "" == "$SOURCE_BRANCH" ]; then + SOURCE_BRANCH="release/${RELEASE_NAME}" + fi + + init + + SRC_DIR="$(realpath "$SRC_DIR")" + + logInfo "Performing basic checks..." + + checkSourceDirExists + + logInfo "Changing to source directory..." + cd "${SRC_DIR}" + + checkGitRepository + checkReleaseDoesNotExist + checkWorkingTreeClean + checkSourceBranchExists + checkTargetBranchExists + checkVersionInCMake + checkChangeLog + + logInfo "All checks pass, getting our hands dirty now!" + + logInfo "Checking out target branch '${TARGET_BRANCH}'..." + git checkout "$TARGET_BRANCH" + + logInfo "Merging '${SOURCE_BRANCH}' into '${TARGET_BRANCH}'..." + + CHANGELOG=$(grep -Pzo "(?<=${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n)=+\n\n?(?:.|\n)+?\n(?=\n)" \ + CHANGELOG | grep -Pzo '(?<=\n\n)(.|\n)+' | tr -d \\0) + COMMIT_MSG="Release ${RELEASE_NAME}" + + git merge "$SOURCE_BRANCH" --no-ff -m "$COMMIT_MSG" -m "${CHANGELOG}" "$SOURCE_BRANCH" -S"$GPG_GIT_KEY" + + logInfo "Creating tag '${TAG_NAME}'..." + if [ "" == "$GPG_GIT_KEY" ]; then + git tag -a "$TAG_NAME" -m "$COMMIT_MSG" -m "${CHANGELOG}" -s + else + git tag -a "$TAG_NAME" -m "$COMMIT_MSG" -m "${CHANGELOG}" -s -u "$GPG_GIT_KEY" + fi + + cleanup + + logInfo "All done!" + logInfo "Please merge the release branch back into the develop branch now and then push your changes." + logInfo "Don't forget to also push the tags using \e[1mgit push --tags\e[0m." +} + +# ----------------------------------------------------------------------- +# build command +# ----------------------------------------------------------------------- +build() { + while [ $# -ge 1 ]; do + local arg="$1" + case "$arg" in + -v|--version) + RELEASE_NAME="$2" + shift ;; + + -a|--app-name) + APP_NAME="$2" + shift ;; + + -s|--source-dir) + SRC_DIR="$2" + shift ;; + + -o|--output-dir) + OUTPUT_DIR="$2" + shift ;; + + -t|--tag-name) + TAG_NAME="$2" + shift ;; + + -d|--docker-image) + DOCKER_IMAGE="$2" + shift ;; + + --container-name) + DOCKER_CONTAINER_NAME="$2" + shift ;; + + -c|--cmake-options) + CMAKE_OPTIONS="$2" + shift ;; + + --compiler) + COMPILER="$2" + shift ;; + + -m|--make-options) + MAKE_OPTIONS="$2" + shift ;; + + -i|--install-prefix) + INSTALL_PREFIX="$2" + shift ;; + + -p|--plugins) + BUILD_PLUGINS="$2" + shift ;; + + -n|--no-source-tarball) + BUILD_SOURCE_TARBALL=false ;; + + -h|--help) + printUsage "build" + exit ;; + + *) + logError "Unknown option '$arg'\n" + printUsage "build" + exit 1 ;; + esac + shift + done + + if [ "" == "$RELEASE_NAME" ]; then + logError "Missing arguments, --version is required!\n" + printUsage "build" + exit 1 + fi + + if [ "" == "$TAG_NAME" ]; then + TAG_NAME="$RELEASE_NAME" + fi + + init + + SRC_DIR="$(realpath "$SRC_DIR")" + OUTPUT_DIR="$(realpath "$OUTPUT_DIR")" + + logInfo "Performing basic checks..." + + checkSourceDirExists + + logInfo "Changing to source directory..." + cd "${SRC_DIR}" + + checkTagExists + checkGitRepository + checkWorkingTreeClean + checkOutputDirDoesNotExist + + logInfo "Checking out release tag '${TAG_NAME}'..." + git checkout "$TAG_NAME" + + logInfo "Creating output directory..." + mkdir -p "$OUTPUT_DIR" + + if [ $? -ne 0 ]; then + exitError "Failed to create output directory!" + fi + + if $BUILD_SOURCE_TARBALL; then + logInfo "Creating source tarball..." + local app_name_lower="$(echo "$APP_NAME" | tr '[:upper:]' '[:lower:]')" + TARBALL_NAME="${app_name_lower}-${RELEASE_NAME}-src.tar.xz" + git archive --format=tar "$TAG_NAME" --prefix="${app_name_lower}-${RELEASE_NAME}/" \ + | xz -6 > "${OUTPUT_DIR}/${TARBALL_NAME}" + fi + + logInfo "Creating build directory..." + mkdir -p "${OUTPUT_DIR}/build-release" + mkdir -p "${OUTPUT_DIR}/bin-release" + cd "${OUTPUT_DIR}/build-release" + + logInfo "Configuring sources..." + for p in $BUILD_PLUGINS; do + CMAKE_OPTIONS="${CMAKE_OPTIONS} -DWITH_XC_$(echo $p | tr '[:lower:]' '[:upper:]')=On" + done + + if [ "$COMPILER" == "g++" ]; then + export CC=gcc + elif [ "$COMPILER" == "clang++" ]; then + export CC=clang + fi + export CXX="$COMPILER" + + if [ "" == "$DOCKER_IMAGE" ]; then + cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off $CMAKE_OPTIONS \ + -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" "$SRC_DIR" + + logInfo "Compiling sources..." + make $MAKE_OPTIONS + + if [ "$(uname -i)" == "Msys" ]; then + logInfo "Bundling binary packages..." + make package + else + logInfo "Installing to bin dir..." + make DESTDIR="${OUTPUT_DIR}/bin-release" install/strip + + + logInfo "Creating AppImage..." + ${SRC_DIR}/AppImage-Recipe.sh "$APP_NAME" "$RELEASE_NAME" + fi + else + logInfo "Launching Docker container to compile sources..." + + docker run --name "$DOCKER_CONTAINER_NAME" --rm \ + --cap-add SYS_ADMIN --device /dev/fuse \ + -e "CC=${CC}" -e "CXX=${CXX}" \ + -v "$(realpath "$SRC_DIR"):/keepassxc/src:ro" \ + -v "$(realpath "$OUTPUT_DIR"):/keepassxc/out:rw" \ + "$DOCKER_IMAGE" \ + bash -c "cd /keepassxc/out/build-release && \ + cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off $CMAKE_OPTIONS \ + -DCMAKE_INSTALL_PREFIX=\"${INSTALL_PREFIX}\" /keepassxc/src && \ + make $MAKE_OPTIONS && make DESTDIR=/keepassxc/out/bin-release install/strip && \ + /keepassxc/src/AppImage-Recipe2.sh "$APP_NAME" "$RELEASE_NAME"" + + if [ 0 -ne $? ]; then + exitError "Docker build failed!" + fi + + logInfo "Build finished, Docker container terminated." + fi + + cleanup + + logInfo "All done!" +} + + +# ----------------------------------------------------------------------- +# sign command +# ----------------------------------------------------------------------- +sign() { + SIGN_FILES=() + + while [ $# -ge 1 ]; do + local arg="$1" + case "$arg" in + -f|--files) + while [ "${2:0:1}" != "-" ] && [ $# -ge 2 ]; do + SIGN_FILES+=("$2") + shift + done ;; + + -g|--gpg-key) + GPG_KEY="$2" + shift ;; + + -h|--help) + printUsage "sign" + exit ;; + + *) + logError "Unknown option '$arg'\n" + printUsage "sign" + exit 1 ;; + esac + shift + done + + if [ -z "$SIGN_FILES" ]; then + logError "Missing arguments, --files is required!\n" + printUsage "sign" + exit 1 + fi + + for f in "${SIGN_FILES[@]}"; do + if [ ! -f "$f" ]; then + exitError "File '${f}' does not exist!" + fi + + logInfo "Signing file '${f}'..." + gpg --output "${f}.sig" --armor --local-user "$GPG_KEY" --detach-sig "$f" + + if [ 0 -ne $? ]; then + exitError "Signing failed!" + fi + + logInfo "Creating digest for file '${f}'..." + sha256sum "$f" > "${f}.DIGEST" + done + + logInfo "All done!" +} + + +# ----------------------------------------------------------------------- +# parse global command line +# ----------------------------------------------------------------------- +MODE="$1" +shift +if [ "" == "$MODE" ]; then + logError "Missing arguments!\n" + printUsage + exit 1 +elif [ "help" == "$MODE" ]; then + printUsage "$1" + exit +elif [ "merge" == "$MODE" ] || [ "build" == "$MODE" ] || [ "sign" == "$MODE" ]; then + $MODE "$@" +fi From 96ca7a8cbcd55e4e9342e267a279ab47828dd584 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sat, 28 Jan 2017 22:19:23 +0100 Subject: [PATCH 19/44] Fix CMake options on Windows --- release-tool | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/release-tool b/release-tool index 8e3285b1a..7c2a432c9 100755 --- a/release-tool +++ b/release-tool @@ -64,10 +64,9 @@ printUsage() { cat << EOF Commands: - merge Merge release development branch into main branch - and create release tags + merge Merge release branch into main branch and create release tags build Build and package binary release from sources - sign Sign compile release packages + sign Sign previously compiled release packages help Show help for the given command EOF elif [ "merge" == "$cmd" ]; then @@ -477,16 +476,25 @@ build() { export CXX="$COMPILER" if [ "" == "$DOCKER_IMAGE" ]; then - cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off $CMAKE_OPTIONS \ - -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" "$SRC_DIR" - - logInfo "Compiling sources..." - make $MAKE_OPTIONS if [ "$(uname -i)" == "Msys" ]; then + logInfo "Configuring build..." + cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off -G"MSYS Makefiles" \ + -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" $CMAKE_OPTIONS "$SRC_DIR" + + logInfo "Compiling sources..." + make $MAKE_OPTIONS + logInfo "Bundling binary packages..." make package else + logInfo "Configuring build..." + cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off $CMAKE_OPTIONS \ + -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" "$SRC_DIR" + + logInfo "Compiling sources..." + make $MAKE_OPTIONS + logInfo "Installing to bin dir..." make DESTDIR="${OUTPUT_DIR}/bin-release" install/strip From b7180893c6a1a36be71ff772ed44f49ed5221db0 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sat, 28 Jan 2017 22:23:51 +0100 Subject: [PATCH 20/44] Fix check for Msys --- release-tool | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/release-tool b/release-tool index 7c2a432c9..ef842a66a 100755 --- a/release-tool +++ b/release-tool @@ -476,8 +476,7 @@ build() { export CXX="$COMPILER" if [ "" == "$DOCKER_IMAGE" ]; then - - if [ "$(uname -i)" == "Msys" ]; then + if [ "$(uname -o)" == "Msys" ]; then logInfo "Configuring build..." cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off -G"MSYS Makefiles" \ -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" $CMAKE_OPTIONS "$SRC_DIR" From c043be3aa44e22126a1c88d19da2ed8e008b4363 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sat, 28 Jan 2017 22:45:07 +0100 Subject: [PATCH 21/44] Copy windows binaries to release-bin directory --- release-tool | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/release-tool b/release-tool index ef842a66a..282b4db01 100755 --- a/release-tool +++ b/release-tool @@ -481,12 +481,11 @@ build() { cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off -G"MSYS Makefiles" \ -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" $CMAKE_OPTIONS "$SRC_DIR" - logInfo "Compiling sources..." - make $MAKE_OPTIONS + logInfo "Compiling and packaging sources..." + make $MAKE_OPTIONS package - logInfo "Bundling binary packages..." - make package - else + mv "./${APP_NAME}-${RELEASE_NAME}-"*.{exe,zip} ../bin-release + else logInfo "Configuring build..." cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off $CMAKE_OPTIONS \ -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" "$SRC_DIR" @@ -497,7 +496,6 @@ build() { logInfo "Installing to bin dir..." make DESTDIR="${OUTPUT_DIR}/bin-release" install/strip - logInfo "Creating AppImage..." ${SRC_DIR}/AppImage-Recipe.sh "$APP_NAME" "$RELEASE_NAME" fi From a63ba6bc4fdd93e010ded82664a19e5ba16d2ac9 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sat, 28 Jan 2017 23:02:26 +0100 Subject: [PATCH 22/44] Update translations before merging branches --- release-tool | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/release-tool b/release-tool index 282b4db01..2e3dad3d6 100755 --- a/release-tool +++ b/release-tool @@ -232,6 +232,13 @@ checkChangeLog() { fi } +checkTransifexCommandExists() { + command -v tx > /dev/null + if [ 0 -ne $? ]; then + exitError "Transifex tool 'tx' not installed! Please install it using 'pip install transifex-client'" + fi +} + trap exitTrap SIGINT SIGTERM @@ -308,6 +315,7 @@ merge() { logInfo "Changing to source directory..." cd "${SRC_DIR}" + checkTransifexCommandExists checkGitRepository checkReleaseDoesNotExist checkWorkingTreeClean @@ -317,6 +325,25 @@ merge() { checkChangeLog logInfo "All checks pass, getting our hands dirty now!" + + logInfo "Checking out source branch..." + git checkout "$SOURCE_BRANCH" + + logInfo "Updating language files..." + ./share/translations/update.sh + if [ 0 -ne $? ]; then + exitError "Updating translations failed!" + fi + git diff-index --quiet HEAD -- + if [ $? -ne 0 ]; then + git add ./share/translations/* + logInfo "Committing changes..." + if [ "" == "$GPG_GIT_KEY" ]; then + git commit -m "Update translations" + else + git commit -m "Update translations" -S"$GPG_GIT_KEY" + fi + fi logInfo "Checking out target branch '${TARGET_BRANCH}'..." git checkout "$TARGET_BRANCH" @@ -440,6 +467,8 @@ build() { checkWorkingTreeClean checkOutputDirDoesNotExist + logInfo "All checks pass, getting our hands dirty now!" + logInfo "Checking out release tag '${TAG_NAME}'..." git checkout "$TAG_NAME" From 05aefc6489aef67077464c2554ac4cad65961395 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sat, 28 Jan 2017 23:17:48 +0100 Subject: [PATCH 23/44] Show error when invalid command specified --- release-tool | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/release-tool b/release-tool index 2e3dad3d6..0fa60c43a 100755 --- a/release-tool +++ b/release-tool @@ -53,8 +53,7 @@ printUsage() { elif [ "merge" == "$1" ] || [ "build" == "$1" ] || [ "sign" == "$1" ]; then cmd="$1" else - logError "Unknown command: '$1'" - echo + logError "Unknown command: '$1'\n" cmd="COMMAND" fi @@ -627,4 +626,6 @@ elif [ "help" == "$MODE" ]; then exit elif [ "merge" == "$MODE" ] || [ "build" == "$MODE" ] || [ "sign" == "$MODE" ]; then $MODE "$@" +else + printUsage "$MODE" fi From 00cd0e1ae3f6005551bd716413d03b709e948db5 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sat, 28 Jan 2017 23:24:12 +0100 Subject: [PATCH 24/44] Use correct AppImage-Recipe.sh --- release-tool | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release-tool b/release-tool index 0fa60c43a..6090077ae 100755 --- a/release-tool +++ b/release-tool @@ -540,7 +540,7 @@ build() { cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off $CMAKE_OPTIONS \ -DCMAKE_INSTALL_PREFIX=\"${INSTALL_PREFIX}\" /keepassxc/src && \ make $MAKE_OPTIONS && make DESTDIR=/keepassxc/out/bin-release install/strip && \ - /keepassxc/src/AppImage-Recipe2.sh "$APP_NAME" "$RELEASE_NAME"" + /keepassxc/src/AppImage-Recipe.sh "$APP_NAME" "$RELEASE_NAME"" if [ 0 -ne $? ]; then exitError "Docker build failed!" From bd2edea1c9ffd158824940465c4b2fe36059c839 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sat, 28 Jan 2017 23:40:57 +0100 Subject: [PATCH 25/44] Ignore .github folder in exports --- .gitattributes | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitattributes b/.gitattributes index 9f713b466..9d1ecabf4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,6 +1,7 @@ src/version.h.cmake export-subst .gitattributes export-ignore .gitignore export-ignore +.github export-ignore .travis.yml export-ignore .tx export-ignore snapcraft.yaml export-ignore From e94dc226b5ded11611e554da672f8cb56a531e0c Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sun, 29 Jan 2017 02:23:55 +0100 Subject: [PATCH 26/44] Downgrade to Ubuntu 14.04 --- Dockerfile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 444009932..422e4da84 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,14 +14,16 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -FROM ubuntu:16.04 +FROM ubuntu:14.04 -RUN set -x && apt-get update RUN set -x \ + && apt-get update \ && apt-get install --yes \ + g++ \ cmake \ libgcrypt20-dev \ qtbase5-dev \ + qttools5-dev \ qttools5-dev-tools \ libmicrohttpd-dev \ libqt5x11extras5-dev \ @@ -32,7 +34,7 @@ RUN set -x \ file \ fuse \ python - + VOLUME /keepassxc/src VOLUME /keepassxc/out WORKDIR /keepassxc From e326e2c6b3524f19f357c1f6a3d1612eb2aaa052 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sun, 29 Jan 2017 02:24:12 +0100 Subject: [PATCH 27/44] Bundle GTK2 platform style --- AppImage-Recipe.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/AppImage-Recipe.sh b/AppImage-Recipe.sh index d9cbd5651..1c31e4bd5 100755 --- a/AppImage-Recipe.sh +++ b/AppImage-Recipe.sh @@ -46,11 +46,12 @@ rm -R ./usr/local patch_strings_in_file /usr/local ././ patch_strings_in_file /usr ./ -# bundle Qt platform plugins +# bundle Qt platform plugins and themes QXCB_PLUGIN="$(find /usr/lib -name 'libqxcb.so' 2> /dev/null)" QT_PLUGIN_PATH="$(dirname $(dirname $QXCB_PLUGIN))" mkdir -p "./${QT_PLUGIN_PATH}/platforms" cp "$QXCB_PLUGIN" "./${QT_PLUGIN_PATH}/platforms/" +cp -a "${QT_PLUGIN_PATH}/platformthemes" "./${QT_PLUGIN_PATH}" get_apprun copy_deps @@ -62,6 +63,13 @@ find . -name libsystemd.so.0 -exec rm {} \; get_desktop get_icon +cat << EOF > ./usr/bin/keepassxc_env +#!/usr/bin/bash +export QT_QPA_PLATFORMTHEME=gtk2 +exec keepassxc "$@" +EOF +chmod +x ./usr/bin/keepassxc_env +sed -i 's/Exec=keepassxc/Exec=keepassxc_env/' keepassxc.desktop get_desktopintegration $LOWERAPP GLIBC_NEEDED=$(glibc_needed) From 08d68300bd92ca8a579ee80f120aae8d2733f2f9 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sun, 29 Jan 2017 02:46:02 +0100 Subject: [PATCH 28/44] Disable GTK2 style again for now, since it seems to cause trouble with the tray icon --- AppImage-Recipe.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppImage-Recipe.sh b/AppImage-Recipe.sh index 1c31e4bd5..9b463902d 100755 --- a/AppImage-Recipe.sh +++ b/AppImage-Recipe.sh @@ -65,7 +65,7 @@ get_desktop get_icon cat << EOF > ./usr/bin/keepassxc_env #!/usr/bin/bash -export QT_QPA_PLATFORMTHEME=gtk2 +#export QT_QPA_PLATFORMTHEME=gtk2 exec keepassxc "$@" EOF chmod +x ./usr/bin/keepassxc_env From 9fe4504623f85b86f6c6db053d335b7498b6f088 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sun, 29 Jan 2017 02:50:44 +0100 Subject: [PATCH 29/44] Fix heredoc --- AppImage-Recipe.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppImage-Recipe.sh b/AppImage-Recipe.sh index 9b463902d..a76bf92e1 100755 --- a/AppImage-Recipe.sh +++ b/AppImage-Recipe.sh @@ -66,7 +66,7 @@ get_icon cat << EOF > ./usr/bin/keepassxc_env #!/usr/bin/bash #export QT_QPA_PLATFORMTHEME=gtk2 -exec keepassxc "$@" +exec keepassxc "\$@" EOF chmod +x ./usr/bin/keepassxc_env sed -i 's/Exec=keepassxc/Exec=keepassxc_env/' keepassxc.desktop From 34fa4561062766f7b0eab5f1cd838b5956902119 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sun, 29 Jan 2017 12:52:05 +0100 Subject: [PATCH 30/44] Add summary line to individual help pages --- release-tool | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/release-tool b/release-tool index 6090077ae..d1d4f69e4 100755 --- a/release-tool +++ b/release-tool @@ -71,6 +71,8 @@ EOF elif [ "merge" == "$cmd" ]; then cat << EOF +Merge release branch into main branch and create release tags + Options: -v, --version Release version number or name (required) -a, --app-name Application name (default: '${APP_NAME}') @@ -86,6 +88,8 @@ EOF elif [ "build" == "$cmd" ]; then cat << EOF +Build and package binary release from sources + Options: -v, --version Release version number or name (required) -a, --app-name Application name (default: '${APP_NAME}') @@ -111,6 +115,8 @@ EOF elif [ "sign" == "$cmd" ]; then cat << EOF +Sign previously compiled release packages + Options: -f, --files Files to sign (required) -g, --gpg-key GPG key used to sign the files (default: '${GPG_KEY}') From dda9a951631cc4871772a0a8aae717f424380a0f Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sun, 29 Jan 2017 12:53:52 +0100 Subject: [PATCH 31/44] Move packages to main release folder instead of bin-release on Windows --- release-tool | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/release-tool b/release-tool index d1d4f69e4..173079f17 100755 --- a/release-tool +++ b/release-tool @@ -518,7 +518,8 @@ build() { logInfo "Compiling and packaging sources..." make $MAKE_OPTIONS package - mv "./${APP_NAME}-${RELEASE_NAME}-"*.{exe,zip} ../bin-release + rmdir ../bin-release + mv "./${APP_NAME}-${RELEASE_NAME}-"*.{exe,zip} ../ else logInfo "Configuring build..." cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off $CMAKE_OPTIONS \ From 0c54276fe207655bee3ba2962f69fec5f405819c Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sun, 29 Jan 2017 20:46:57 +0100 Subject: [PATCH 32/44] Support building on OS X (untested) --- release-tool | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/release-tool b/release-tool index 173079f17..0784a4458 100755 --- a/release-tool +++ b/release-tool @@ -510,7 +510,26 @@ build() { export CXX="$COMPILER" if [ "" == "$DOCKER_IMAGE" ]; then - if [ "$(uname -o)" == "Msys" ]; then + if [ "$(uname -s)" == "Darwin" ]; then + # Building on OS X + local qt_vers="$(ls /usr/local/Cellar/qt5 2> /dev/null | sort -r | head -n1)" + if [ "" == "$qt_vers" ]; then + exitError "Couldn't find Qt5! Please make sure it is available in '/usr/local/Cellar/qt5'." + fi + export MACOSX_DEPLOYMENT_TARGET=10.7 + + logInfo "Configuring build..." + cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ + -DCMAKE_OSX_ARCHITECTURES=x86_64 -DWITH_CXX11=OFF \ + -DCMAKE_PREFIX_PATH="/usr/local/Cellar/qt5/${qt_vers}/lib/cmake" \ + -DQT_BINARY_DIR="/usr/local/Cellar/qt5/${qt_vers}/bin" $CMAKE_OPTIONS "$SRC_DIR" + + logInfo "Compiling and packaging sources..." + make $MAKE_OPTIONS package + + mv "./${APP_NAME}-${RELEASE_NAME}.dmg" ../ + elif [ "$(uname -o)" == "Msys" ]; then + # Building on Windows with Msys logInfo "Configuring build..." cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off -G"MSYS Makefiles" \ -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" $CMAKE_OPTIONS "$SRC_DIR" @@ -520,7 +539,8 @@ build() { rmdir ../bin-release mv "./${APP_NAME}-${RELEASE_NAME}-"*.{exe,zip} ../ - else + else + # Building on Linux without Docker container logInfo "Configuring build..." cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off $CMAKE_OPTIONS \ -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" "$SRC_DIR" From 1da87d1d19d0abc16701a8c1a41267b23a22c9ef Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sun, 29 Jan 2017 20:58:09 +0100 Subject: [PATCH 33/44] Only create bin-release dir on Linux --- release-tool | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/release-tool b/release-tool index 0784a4458..de5c723c9 100755 --- a/release-tool +++ b/release-tool @@ -494,7 +494,6 @@ build() { logInfo "Creating build directory..." mkdir -p "${OUTPUT_DIR}/build-release" - mkdir -p "${OUTPUT_DIR}/bin-release" cd "${OUTPUT_DIR}/build-release" logInfo "Configuring sources..." @@ -537,9 +536,10 @@ build() { logInfo "Compiling and packaging sources..." make $MAKE_OPTIONS package - rmdir ../bin-release mv "./${APP_NAME}-${RELEASE_NAME}-"*.{exe,zip} ../ else + mkdir -p "${OUTPUT_DIR}/bin-release" + # Building on Linux without Docker container logInfo "Configuring build..." cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off $CMAKE_OPTIONS \ @@ -555,6 +555,8 @@ build() { ${SRC_DIR}/AppImage-Recipe.sh "$APP_NAME" "$RELEASE_NAME" fi else + mkdir -p "${OUTPUT_DIR}/bin-release" + logInfo "Launching Docker container to compile sources..." docker run --name "$DOCKER_CONTAINER_NAME" --rm \ From 2b18089641338f2991d0e011ba30fbd7a2316dfa Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sun, 29 Jan 2017 21:40:47 +0100 Subject: [PATCH 34/44] Patch desktop integration script so that it finds the keepassxc.png icons --- AppImage-Recipe.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/AppImage-Recipe.sh b/AppImage-Recipe.sh index a76bf92e1..58d9ba28e 100755 --- a/AppImage-Recipe.sh +++ b/AppImage-Recipe.sh @@ -72,6 +72,10 @@ chmod +x ./usr/bin/keepassxc_env sed -i 's/Exec=keepassxc/Exec=keepassxc_env/' keepassxc.desktop get_desktopintegration $LOWERAPP +# patch desktop integration script so it finds the keepassxc.png icons +# see https://github.com/probonopd/AppImageKit/issues/341 +sed -i 's/-wholename "\*\/apps\/\${APP}.png"/-wholename "*\/apps\/keepassxc.png"/' ./usr/bin/keepassxc_env.wrapper + GLIBC_NEEDED=$(glibc_needed) cd .. From 9a92d200011b64d524d7d9c87e1468bb12335262 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sun, 29 Jan 2017 22:19:44 +0100 Subject: [PATCH 35/44] Revert icon patch, because upstream patched fast See https://github.com/probonopd/AppImageKit/commit/69bf4718bec50b0f83a132aab0ec48bbc5ad9472 --- AppImage-Recipe.sh | 4 ---- 1 file changed, 4 deletions(-) diff --git a/AppImage-Recipe.sh b/AppImage-Recipe.sh index 58d9ba28e..a76bf92e1 100755 --- a/AppImage-Recipe.sh +++ b/AppImage-Recipe.sh @@ -72,10 +72,6 @@ chmod +x ./usr/bin/keepassxc_env sed -i 's/Exec=keepassxc/Exec=keepassxc_env/' keepassxc.desktop get_desktopintegration $LOWERAPP -# patch desktop integration script so it finds the keepassxc.png icons -# see https://github.com/probonopd/AppImageKit/issues/341 -sed -i 's/-wholename "\*\/apps\/\${APP}.png"/-wholename "*\/apps\/keepassxc.png"/' ./usr/bin/keepassxc_env.wrapper - GLIBC_NEEDED=$(glibc_needed) cd .. From 80fc8d4da98404061e46a6df5d81e37a9e9702d1 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Mon, 30 Jan 2017 18:36:11 +0100 Subject: [PATCH 36/44] Replace /bin/bash with /usr/bin/env bash --- AppImage-Recipe.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppImage-Recipe.sh b/AppImage-Recipe.sh index a76bf92e1..2ed3ae93b 100755 --- a/AppImage-Recipe.sh +++ b/AppImage-Recipe.sh @@ -64,7 +64,7 @@ find . -name libsystemd.so.0 -exec rm {} \; get_desktop get_icon cat << EOF > ./usr/bin/keepassxc_env -#!/usr/bin/bash +#!/usr/bin/env bash #export QT_QPA_PLATFORMTHEME=gtk2 exec keepassxc "\$@" EOF From d7633f40baeca6ba288a62005c12ddbcc1f87923 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Mon, 30 Jan 2017 21:28:59 +0100 Subject: [PATCH 37/44] Add Windows installer branding bitmaps --- share/windows/installer-header.bmp | Bin 0 -> 25820 bytes share/windows/installer-wizard.bmp | Bin 0 -> 154544 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 share/windows/installer-header.bmp create mode 100644 share/windows/installer-wizard.bmp diff --git a/share/windows/installer-header.bmp b/share/windows/installer-header.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f9e17cae78804af8a9e648ee9d0d9db129eb56e1 GIT binary patch literal 25820 zcmd6vd3Y36y2iPG-d)x}5}=cGlFr(l-j^hubQVAX(NP?Mdj*6m;DCTcAPFQ8AR!A& z*hEHUxR3zi=qQZNqftk>;|wScZZo(rjyfQVfT9Rl@B4kHs=CriH$}Q#@_f{Ds=B)B z)cMu>EvKsSjr(XuKmN00X~4g&_~*jEf9f|B%YOZu@cDp$75{hx7VfRLX))K93CZ>O z4Xgu|7?HZOZeRw#1eId3R8hlfl=e4!Ab+&ilqdxpyy?V8)qqDQCbIa?$vTh!0 z-#kuBm-@VqrSayx?RR~C;gqPTuW72UX`0{mV0EewOJPm-U^Raa>>joGy07A+o?F!W2eiAo+*>DTG1rz` zlk4*ue*dtF;s2$tFTi#~L;jTJx#2LxC=$l5E?``Auu5N-qoqrI-p97-7U$;i@0|Ke zFovzItzUk3XMaLcV)%(Z!Za-Fvu!w(Lpuk&HMp+0X)(=Wndc=g(~j<$A;=z-&h&>3sv z&04zD=Y7Bsr+Dq-KZRg;>FU?zwUy}(W4hN2hEc9~C{SQ5Yz8Z)M-54J1Wg9WYGj7A zaVkM0ZiI_xP5NR8o?TrKk`}{_n^fnmSLv|jgTra-eAu2`@0}b5LnyGF0q#Ba z3~m$ShGNgw30k_;=Y7D?v|-et_gjK7gkSjT>gAfP^N{WY#f`kHb_~T* z%=z}gU}zp8XQY&uLX(uE$|f<~BLv9_jUqxyG6@<}r7$QAzLa^2oaXvLuZJV`eX+EaKmzoq`$~qLjlobdy%JGl|NePVzhGNwp z4>=49)iEwfLJ~UJm-d+?7;d~pi#ayjoLKGY&hXWgwYk`yRO6Yvd$x9lsJ=S8I-1{n zDrv2U05*=((t!x>V_iQwqb~o+;|D|QFd(O)NGO$vf}y{>kQna4b~%+HzpAv+V2?^p zwR=V?1MJ}{dzW0VyG4Xy^^Gya$Q}Ru-K1(a2GRvDpzS7#;BH`OtS>nD?h7Fp%C&__ zsV&HtvO5*=kh%FoqM%0`K~Gc?Bum0b)gaY}A^?g8lLSCv;Z+!5xZ!3k=2$-_agDp~ zr7hyRv1~c_D2`pKh-Yh3pAW3-$);`>+{iY@Dk4{NLOGrSg2 zdX?FAH+FTw8EP?%x4s8M zLro60gYBdnWcc>y?_(gd8j7@>I^z478wzpjo%rITU^*0YZ4WGakmlNQv&38*IZ~dU zA&i2d91ocxX_De0XQx7e5>gd3#uzwH6Fd@X!V8A$$7nJ8y3zX8&bpU2t96)Moo%D- zu1ULQX^)3E!iQ&0A`BYqd|FN&@qKXKyiF5MT|6C(p_ucYKL3BjoHyoac+Q&>8c`q0 z^aM8{LTs%{LQd#`0sc}jeht$%6K&D-w= z!>)Esc_~KjvkRvRx89LntGB!Iy=sMbN-I$cV{}Y5qh!XG~PbVd2W>V;1&YyAC=*48#mdj_lM)!Q+0=e{~OcKf8%>TE5ij`%(aRra}0 zmUW^&?dVc>Olh}wcKr484@ccOHY?j2=S~@r5tA^{LaB`8PPxpdRdr5784L@Or6>nR zcBlTNl+aNaqzFkgq>y+6S!nMJM>*DA-|P*=`YOA^5SJ^a$pA$BDFblb2A(iozH<4F z$EGE(c4;|vWcP8d8y&qYy|!gDW*Fc*diECc53L<-hmZf!Gb-2OwU2Nn4M>kpndxC2 zGB-g|iHaNsrC>;H%0;`GoXsE@f`C}|MA7Fh&|$+UEoQGT)~~eJy(sBWTsmUE^mnbb z=U@ceg1aAsH)Yo>+!R_)9ocJKFHfzH>&?{J2VsmQzP|pNtx>vDWv8;DrVHjE5GOER9Ro+X`JnY`U8aLv2;# zL{;H`av11HIVt7GPn3KLL8>xRsuEd{H2jh~Rf3_?2<24e5E{4-7}ghSFn?8b>y zSV%R#YQmeNV)xp@50GJUamWQBGn5EGpUQ(_wW#{g2E)2yEoQ4NN?2j5eIWu2F><&O zN}j5a7;5W)mQHHfC!x|hdv6IGL1$ap1ui+u2~?MMn8dJ1qeYjcEk9Tj zz77S$g-@18Ej2g@pwl7TR!gXVv86 z(&H=5%}1Y%6vN#|o`|osM3<)H;5bF-K1AwMoXfDvb?lS3gI&dU_(MX|axg2$YRz}X z*b@e1M5oQpVFjWTWa~z6x(Iy|LrH}G?35iQb7T3*Au(c(6g>O&v(*-cFz7_T!Zvcb z@&0`!Z+?0lmyS7%p11FfZlOt?uFkhUdwcf2MY@Wt#1(eN7^){BI;s7m_~qu?cie*{ z8ZUqZ>oaD%>$b1g8x58MClZ>0nKAZN<7+#}~HR2RPX z)KUb)wS~Q!y|&0)ogY({QLu5s)5o8~kOLt654=sVtJl7rYOrgqI3Nyt=-n558*hs( zOULPO(q20gp^XJ2mKj$+-#{V^auN9G+_x8IJ~%tomWemo23toCap=5{OcuVBre}l{ zyU%&6OMAZ{g(i8)Lr%d^U=$6B1II}=ExA)UeWBI8ozE505O%NL}GX2Liej{;IvEAg9Ls|9UZ}{3iRaL)+z;Y^t!qo%-6VT&&}K70ImTr1vs`JUvb9y!s* ziNs4b&;0qh_+>^zg&mzyIu>@rms08Q)Q$S|+-JD1o@d7v+()P?J~(|ce|(WS$FBFJ z<8`)}{G@{2Q~eC7IHZtBPF0qo)PM-dmoh^@liEyA(jmblBfm-{8E;th1bHxAlP}C( z?aNr{idkYf@WwN^(9X8bA3%ZX;l$~1Qk?q08^4KOVnAomC8c}eG;o|DixO8JT8o1R zd$@wLf75zp-*ZnU7?a$^xzUdJo06kaW_So78|R{;N~FA0db^DRBfSkJ4Ctt#0!Y;$ z8;!Tnq+fO6D$vi+Yg^;Bukl(}=Z;*Oy0K*&d>W=Se=r4h!+4F}+eZf)Tegl^nu0Fb z*W{slVOshMd&+X_JDqz!Y{Oehk03_}xw6fkMY zzSIwpqap=HwL2x@aau!aluLUtRTGG`kD4SMGQ;Y;=*3C1cF(6tsLmf+f!#1djr=!z z&w`l6$zjsN*X`ALF^iKH>|csoBbW$L*;-Ono-5v!GB7hX#%J(5QokDM zR~MX@%I=hNR4J#~Lys;I>%JyjxNzZ{U*I{ z87yb(Inv+j7BK_x^s$4{4<({|=w#o_wmNrMNn+_!l@MXD87AB^c=_V*7ydE!?g{2> zTbefu4=Rw9=5Cu*)O>Ft8HYq^zLX;#J6OewlJis-79t)BDY6=+)RfV&K1F`hN9P$J zVEEG2xx*KyOy4;h4(x|aL_^;KB27h?rae9j-9sn)z!2X`US@LCc6oSQgfGTve{=3DVo!vSg0_SLtdj36C0!MK>9dO{K;H&~D| zMxjYA4ynTMM@0^ggpmP~2w9&IWf=2N;{8nvL&W>Umt#yfra?48r^PP1nk^K1|y%0hGLXgLhZ!B7r~ zjFIzFPDkaCNW{1-l*@de6C~xR$O=>d%I;Lm+4yH}`Vt{^x{2GSw6@VBgkTr?<8G&p zwYA={byED2R4XxbYcP*_r8{b2T*L3^t%F{l^(q&INZ54fiTKPUPqBBTD;ZCkVtmO` zNg+gtC1*3xB$X8GQB@+8)W~5FB-OvSkk!bVWXVB|oXrG43t06}0%$_2(`{~f7#A8W zTqxK2V>Qq*bZ<+`!-F1(wXAe&FHu|;$2|;MlH$_ z_n(PF%;jTPgrq>uOF0G#9THE%$TMzIJQPU`2@>h36zgP1Doc?{3L*n>ir>$WAR`qL zb-JS;)3cbLR5qi&Uqohep8D!Wt4W<=-{ zY!!8hjml~t8#>*0SHHs>&jHu>lUhah(8;kIZU-Fm3RegN-jp)a@Dly+-hL4PLwHe$ z6B9FUef*ARv={Hqq~&HogqU2jtr!dKbt?2XORU`p93Ns%BH>n9>6k*cs9d76x%-9PrZB%ln`IwJt-SUF=P8r($9Tjx>AYL?J@I6p0%JM#-0w zk7ZxlEh%NE%Fa_&B?@BGq-v1jA#sz#pd?5Rl2D)u=?x|{vJTY)_S0-bhcCbP``CpE zSrvA3g`=lsEw>Gt7d>a!1E>|Sa|nR=2wwDEynQ&n$mF(|3mlZnBn?TuFGoQq$3r1J zUP^fkxlYK>|9W^TzJfhNOg4cZ&&r&K7md$I%pRQ={O-Hl+Z*H=|Hy2oWkeB$6U2 zh#jz7I2iHuGZ)Vk)sE3GGT`8rWsZ>x5@P4aZEe}E<>2%J zen;D>%V(#}n~A5q-kW_RTuJ!vyYPG>d&8XsknCPy6s5hQLxE9-CK4L)93N5?g7l{~ z43HT5;~`ZQ!hebeAj_#KGmJ=749}NhXffAX^K5O}lFX>N!($(aOL#Cj`Jprz8d!~* z8=JP&SbMM@&tI`~NTr1O5a0d#+0SxT`;to1Ol6kA_YZ?3J$URnY{y^dy91wMP7S}W zU%a|3E+f%9#)o18x#&$vQRcEStUv(}BAg*A2`r1~k(2CES$I$*xXGyuGo+9xV3Ow~ zU&^W@m=yZRi;5WNFAhZ+!P_Mvg)PW`p&CEb=mq}_Up#&B%+I$>x#_+^NhPUSeqw|EGELXhlEWq^Kn zN?X)3ZmJ|EY=(W(A%+d(ho64ky6$KF?;B(+HD?h$ORt8HutWd*2H(E%PVs;w^r-iG z)8KS}{NPXjJpJEB%#UAtuny1nsRKb?^;M356X7Kb{C;A4^P^Cp)0dr@Zyky}CMilc zK2vs~EJE3rvKJ+fDg{GIP489L7OX=8%f6J*2@_F~QW+saX(>xlijY(jLVjEv3XHTG zrrrC1mcdX)MKr{(mP+@P|HsV!rcz5*sl`-k4q;-4f1laEZ2xkcuC2Ep{so*uy(-?V z+41r(9Tn~)A05>a0P%GIZ0~5tf35!5fnEA6gWc=G@0g%KR1(qNMBmPPNQBTH%dePo z8rGgaBo;}N-<;5hoJMl0G)F3XQK3M}NI4#gr-;1DzLXPG_N%fE<;;diMkF3iTZjta zx;M0XM9~I^Kb&|ycJ7Fjl2k&sRD+e84JE0==Z*Z+2caIy2AoK&qI>A%JD3~0L5~2E-q5(0J*wJ^Dms)xqH21E zpb0e+My?Wt2t{qdI`qdw;Z9k5vH~d>@;h#lgAJiWO)52;Zq&2ky(uVR-mV1$XALHS zEzQzs*m=OL!3%ajh_B-yz2XYC5uF4*{DmmtmG6=Q*@bT1vm?QjOaKer(JnoHm5sO6 z-0SWX@?-6Zl7cc)DK(XXA-PahPD3OGF{&!St-B7%ok}r~@=}=mEKz=XAu2xK+paaU%ay?Bmjd_R8xi2q&Yi*L?1>}ZV3 zOoR)?|80R%5DElCSMBY^duM{41dv>))y$pWuiyUz{EgkWf+x zDJK;aL`7*z?}C-yktV&R5WX?ym~-v5pL0$~LK3|11-JXR_FA)yImTLR@2BKB&4>JA z(*O4<{?`ltKM?<4ivKtKpHF@2|9t8TXnpEaXJY)*|Mye&f9t@h|FUB~IsOe8nEY>m z;ggy0F)+~l$pYM|41BWCK88uYgEzNNG~H@Vw_)4a2A9q1{)uXBtG2y)Zad3nrTKr> zF0zvNS%S=o1G12Qu)q+YBlCTYD8j98Z}y zbUL2kKbr#;zUi{aLSF=Q05S+OC9*P$$)n3STk5c9C{@ZHp^~Gs#6-!sxWO5QoFc_3 zEIm7d`;mrBEGD%c&rUPT7-p8#p%O#ns$>lIF`8l)MHOBVN;R670q{cF-jU=Ukn+^d ziQ+^pVPLtk)H0r&7OW2m5+;=}xK{~DN}bCc^)j8cTayz=l0iU97*gcGsURtPCEAjG zf=ZPODj2F5Lck0d*G{Ccxnb1NSLIv$bV+0N7`!}A1QBmhm#Q$AHaM~E*KtO@L~gSV z_C^<{U&+S%4Yq3}7cYcf4zg6WMN7;ign5JQC@}3Rf?nghGFp5CZ1xs8<${Y(;Mi%AF%Sk+2cH5ePL@cF5nK2&iy5SJw)0zL zniX8pS3N$#0&0a#fbp=!Xz=guR$6(~Ny`iZn^!8dD%0@$U>RTy znLB5ZH45b1Oc2w`&n!I}V5n2D?QBCSUE+;Ni<^rPoS*g8Kni`^euv*Uq{Mi1bS(iSK$In z_7fFC`5Al`#umT046~S)B{pQ{s+F)A29^*zL(E>d&`TnUWQQS;aEu1}VO&7<)Y0P` zR6zAn%ZN5FZHR5UC`;DRjI|V&G!RlRLrxcZSu}&;an#SV63JdA$(X)TqXDo`A}z>KzeQ$P9_C_s$!$0$01Se|4NQG=bPN$nn-ASph&6~!6=)0>(W212V) z0fUa{=cOYr2|<^9Vrc#pVTH}lim5DiPP5C2^`ussuRaSE6_udEKtU3=f(n)vB^wW= zp{yKL$5H2sWqMefFbHnG#sD2PsR}mCz-<_fsbNDM}Kdk_~wQ$>VrBE5sZffYGH;$&%?{&!LpU z8n|?237&~~Y48k^A<3{=rv+iB4tiO!4xs2)2?_|DY*-fRA}{tBDnEOC2P5M+vs3Wc zW3Vlw!}IJahZvZGSvaHArk72~G|H08hZzKimF}()TvUQ!Sow@>VXa|VL=lbcFfSvS zVTFx_7=ThaMGq$`Egh!_w2C6Nn8Y~>r!g^D;c6#V1(GhrPg)W=ktj3`U`#FARfWz< zr@}3onK@Jog*XNqoS?yq)Wf`a`33*9)M1W-<5TlE}@)C%HjV zb}}iwtU5L=H20B14z}6#a%aF)wn8QA4iFU>h+l zxMQ%q790kaUEm8Flg!GudaXtS=HQe1tduNqHxP9?8&T>f8zhrBWtQQWuc4)x+1ME_ zb}2H|w)qgF3YgWE+shJ3Ek4CED&QMg6yLC!1O}V6h-GFQ}U;<2FI*e)?Vvi*?R;^Ma+0ZhSH(0NGneG-` z>5L!8!_;I(Fv61Mm;py!K1O3qqbuswXy9QegJ)-k4O9kW@>h@f=B<81^{K*6v}CS`mgr?C|h^?KeIBH-dMN4gXgaWsOcoam96G2q;a4P|6f zkZf#QG{xjuF43^;qE2U}a}1u{bLGVrj5%Q1n6Dxm01M83Bn^v3j*=!KyL?tu23wr7ST7j> zh)r|Ys!$wprP*S}3}{0nDsiQ{QWcs=3hoGtTrAT?SEUSSsSOp8@CdP74svV!6R->n zu;DlI6;n3m9xlcb+@nB?EWN_fK&F1h%q~qSBz1o1#kTdhG202VwQ~|gg&CL^Eu&;| zo^n;RZHAC8dFj$r%Y+LREJy)WAc@MDF?ius4#@bb$XQ}_;V$;12s&lyfK9k078+(y zA~P})25Ct!SgFCV)J}*+u(k)0JMl8&5r3{G`PW!}svatqvDD_w( z1LLH*0Wky;V~<`s0+qooNAtX?6A`kE<!@EBkjGaxl`MJh5zU6u~Mjz`8tG$r!00(!2*jHMtdrDJJUvh~o| zY6*BMHs+FS%)ohI+mCQzGM>H7t}e1`MW4 zUI~vdxTU#!Ps)f+JBWvefp=O`U4~;6+%+qg*aMgV3=!xDZkaQ6S7LnuaW(4@qAO z;sA0~vJ88R>_w%dg_oJZX2IPn|MtSeAH;uXpLgrRNN0cphD}}X5$wvarZR`Z1*Q2V zJIh4@fb7{QNGROf*d#NO4Szvh#icMHWAqn=Cv4WR5)ih)7CoBSQHups)kSp*l>$Z; zMakBKOOGjoFw2vA%p!~9F-IrIva{b|AP()L#tJYo(-^^AzIM&o5P9VTzcMd&LVENp zxNBu0Qz@n};A|-h*vcD{8D>T>g930`eVVi$*?bks)K6g8pp7MU1M88ag2={3JzZpX zcR8vv8*)^YJy~7J(P8UxqO!&`os^DYQ%tq9I8jkiMNEvSv9)%Hmf}QY$&Is@tTk0Z zNEp+7`Q$NcPkiaEe@R(f!Vx`huYc#p$8I-+tnkR_wJ19~VPj@8P+c~fU@(;O>Rc#Z z*?;xlug6T|#v+%@am<<%)BdB)2RJcHr(N~UtN%eS{dd>X55N-c7)thDV<0@$W;iTe z9nA2%IKw&Tkx|F8$$*g}Jo(BqSOu~NMKDIv+!!%olQ1YCmQqo;g#|YE6`0CJ%It`P z1C91d#?X1UEJU1q2Szy{1nD;8HT|k@!bTuWLzn5i ze2R~1$m&((HqTPcOUPU>ZIBu;oW13fZ+!H2TuL3BQ~#5%8d1w8qer7iq|NHQTNeo) z`cX0ts3y!P8JDQE8GsF>To}Qs%O^vjwGF{Q3j{$FAE`x}qsj^?`5H^puly!vIFX2) zWs_OLtJE6Vi;|a3#sW+wm$bI{u61~wdd*J+CMODQ0K;S`Em-EA0_MR$T4jh2RGJ2b z)={rR72wwAWyWDvH7FY3zD_TCigis(^=r0FQFW*nP+~M4?{Pl`1l{1eO@!P>|+kn0wl1 z&=0^o2is~yY3}QtX0v?qfHV^{0d#57iz1s{PEHZriiH8tf&u*p@QMZwF(lsN21Ha? zo{EV{I|G~5vdK^czUsHaryz*dI4)rf%w#jF^>LFPj`%lQ-lAfC{37q;)4&oF)}%4@JnTWKCML zN21u-N24c<#Q-X`2G72t6Av*Nw75`s`VW}FPs;1mmDjaYfD2THh-O1pu|UuX>JSzJ z2?hc}S-}3m4RbL1{Tt?>d`^#LQ?%G&CPi>57p=-n>+GIu$OT(-3C18QY0XNrGObJ&-^nWC2vW1&}&l*IX20(wEX{*Zc&&fB~CAoe(9owxy(`IG2fn4T|NQwDpec zL=svfc*TDrlXDOE6pQAynCQit4GbI&v!ZZ;5eYF0Gg0L0dKvd0WFb6Tl8l4$%@-O0 z*n+!Pfe>I$_sRr7(xg2ZQfdg%P_mGqjrfT3{Tt^1r*=T zDuTIdB~n-x-u}?z>$)fwGtl=0m;p18YbGl-pD32ay0)YdkP}8W$b$BHw=A-Zt4N5^ zh-knps=2Jh?eZxojh6OcsoF&#BBORzv24optG)#r%_2H3!>-OAQ6ULnmU5LEMRkQb zDZ5z;41{wD(249?AlRT_j7ua1T}Y~R=TNOWF+XO_Nw5SMX$=Ik) z>IfcyP)JY?qNy{~AyHoP+7pouseu8bwl2sLk@M9P!4zK0eQ)QCvNncnUGp9d7x0D% zaDgv|I60xnGR{N5KtC?gfF*YT)xw*RVYXa0bMn2K%7Q@I@JwTqTV9}oM`&%YxoiiU zqD_xdahQ7-&^8bpdtK8VF&m z0+DenpIWIk?hXkI;KiJzBMOv#I&)qb`4x2Ofe;9h0$v!E3m_S6CK4F1&4y`#A#1B@ z*Ii}OKIBH**L8Y*&2`P2l+DseYggi50Y5({2&sWMrPs33SzWcv~kVzFSl zqI|4eQ#Rx#BpC33SIib<;bma+evF!LX-K5SSyh;UinS_?kff|ean8(wwA2|c>3)rM zO&6REgYW;)8tcxzj7*ULJX)tX8@3R|Q5Cbx5)p~QdX1K=a5Q3hX(^O0a}-^y-Qej` zlOdDUQvg4+kLk?v<<(7Vu}<&v#v;?GUM#< zU{6Ba%i7v=5(%0Nc1hCWQZzbRE6vLc?L<*Z#}p)lXH8n%xC<9cs%JCIUTo$C!@mE} zQJb@AP0Z$wGL0X7hK16_~(Vy^8NrmO^E0$UQl76SFK< zGE=C0&u+j1i47S8KC9988R&oo(jrKLRHo#P2t`I2&|P^WyZ1XDtKH^vu~CR382}+2 zDFGTrxKqk$p9hg8&nhIecFgJ0>tZwwSy)ZH)MJq?PPlU@YC$8z-NDm!hTU^ytkkj>F3Hy$u~MYI;(H2HHf2u@+8AInR{WUuIkspU0OAiM3AU9`m>Ec~ zF&T?JtJ-Q&X$4N>-vEoEQcTgFT#}axY_s1wooBVJaHpL;KB?G)LoriiG*VJ)mkcKDp%TGgP6k=d$?lGNB70 ztVejtbt#Cvq&v?hE;>_n!lNF6FG{wG1ioA{=SK86fY=qCQpHc_0FVfwnXuWJHL4Nk z>@pTeWOQS@baHIBWKnU@y`pVBU@w6e7+A8FurEg4-E?<&&am5XE=3h2L<>hYHqD|I zH;XKeEsfIG0kDy%Z~#tqF>lpRcgv+X3SzzmbqZ@BJq3&lch}czw;=(bjV#rfyx3om zV4-|g6Sj~$50(gyq9~Bi%sM@OB=XL<Q!Y+&5 zk9({v6M(pM1+!X|5&fyr+SgH~>|)G$a6&}GAvy{Rd5zPY{=2B|)gc*_N?aZE(#;7=9SoLTqU?>-}Btq0yWIOA= z=};qx!WL(@EGAwNS-IpGd6m)KvzY962AsfB-rQYFCi1et7)=e&5;h8+c=O95Z%DRdT;R`h!CrB!9I07Y zDzZd`C4eP_xSVm-w*Uigexfrzp&$=^T@2BeilNLVhS_-jmuQ0hg_9@}8Xh%y-Iw z7Ec7y5{&@kFj}UdKW8HqrG|Z!Q=~?jn>8klf|@glst-=hKD9}DMAqISAtr^nVEaGq`q|w$Og|>n>Es%s6@9%Af5Cq34kO;N{;w*Pn zZI_t;6_a18<(=M!SG!sVr8y)_LS;-#CY9W}k(U3K7~99$#M%D3Ruz73ZgHXYbpmBK z+C4}P+ce_mo~=Qq9_TA3)5le5C~xTFdsyc40kQ`FzNm4TW*Xcv8)cxgK77x^w%1lV z&|*ifAbTuYxl=1N)@e98X}Q)yLW6M0cNkO$)nrpqNZOsClvWweDN%(nn9&f7MQm=| zrq(G`>jw6jL{!CSlEbuSQCg3my z&xa5JiP98B5Lo7%b7_YoMqQxjDfGfnbmmA(2JNhC+2=F@m9`YPgN;I7CrMRE4EmOf*!UGpqyrsB3 zm9<8kh}pusbMi%9IpK!WEz`!H)-^`Qu01(Xga&j}X=!30a&C`Nz)R^c)C?r3C^(mU z+vgS`DUi2qCfXG+BuJK(T2pQY%x7jyKTnqcqrf01Fo;Isw~QrYW)I68PinWceZNj< z+iT=YERmTSt+eKD17LaWFTM3jWpK>uTNfq#ipI51epm&z&0JPJ%;XaQE405J7S?RC!3g-fu&mj_rY21ZnwOKnw{Eb~^0aAflX}b;@TP7?>ttMBr?CgR3RYvev}BK3QV=vi zI5bUruTjlt`Aq?4SO4RN?A9p`U4?y_CMTU#qVTQb| zjjcd|oLV;KY}^v95kGD#S@RO{5Tvr=GS>g4WOV6XBmX~OAY zjip3L0+|}c++&c0nXe0yjo64$q??)^Yq8@2Po=SkvS=-MmHLW8`NC=AeoafUQ9&um zj13Ai1gnO{hV*d3uB+fy2x&~|;43zQilVv&_wbwN_%A(j`%*IG)@GUJ7}G2(M806v z*)EpY)D#&uXqz-dWzn+fYRlY#anzMn#zNU7w^J&OXiv+SDsFExc{5sb>x-fQ$s#Z> zqUByDHxohDwEKZ)-sOR(ZDY=Xw93r*Buoq(`MPFg!^}BsCFd^zc+0aHn5Gj@>28js z2?>a`i9|Ki9*f3|U)jriyEWsI>Kj@ZOD~-9c)-+nGwpXj#e_k|v6th~#TJ^RH(GMc z^5q7O$MO(bL2|8~G=?&{nI#&Uu9labApwdCxm`+y)tR~we@sG$C*2jiq#BKvPi?KE zr6{%z1P4)R)g)%}hSfrP!OWH!Q)twc^Cm*jZ{={t;sD_(k){*OQcvp!X!j*nzM)iD zq8w9y>NtBZrD8N);@&M7Dov9uZDlY^v=qByh?tjVamWuhijv&AjfZ;0v2 zEIA?6I#FQ_WfkLod=T+lYGV4}6S{O6V74Jv6h)@}qNCE0(i8yGa z+Xu>l&A7EE!v+np2QW0F+yF@(bFQ$6$f^r1ib5cx%e<&5BV;7lWp3$h;|l3~8W5^{ zEemqxRg(=96p`~v!G`B@-ZWtxfYp-H6%FGAmzJ82HcygvWYtHN7gfVJUsJ#!HduwQ zwUll#Rz>QN*ESlZMrHS<}N5tt7d?N+Y` zH}IM;(PL;uwUGnxQquxDT~?8$HWf?=YC)W2yFzPrTEE=$7ev?wW7OOM##NAuv^HsM z8mL~_D3lsZogfj0dC?~Hwd%qcgs1+}n`T(BjH8mv6H*U>%nsj{srk~*ZyZ*OrWrRk z%p5!inwJ+sY;hz`h~JkSBVvIG0P5xF75MqjQNC#&QtD`+R_c@7Cqqm?m42aeu zn+w~HiY`pb(Om1a6Si)EB1zz>tsDcxAl?uOsG1ETRCbZWHV>N^QBfcyFa+^~6?spp zC4WSOI)$+cX~FxJQIcmanV`JmS~L$kEb9;a0!A3 z#mQ)4e3}Uu5wa~uHViY7*pT6|u&{UIus59MjvzTmE&+W!?ZFL93tqe7<&3{mBpXJC zjb(vLzN5BQ8NSHkE>=QvSC9Y(oK}UfnI#L%FO{@>XGsPnkoU;vC^R~G|9=r}zfN#-FWs#o!??Q_g*91mCu7-PH!@}}x4d3e3HUmbMSv1@+)r)>R)E`JHD@tBc z$1Zi3iG3!(cm##DP8vt{yivp~j|wx+ZV>Q_O9YHV#(rsWV5TF_r5a)8_IbwT$Fe^W z5;jG;G(QaqbICn0cu$NnMYKJ#U3!1=LT9v$Wt^y} z08f@Yas-T_5G!IbosJ@)X(~rUSTGjZjZE_C2(7;$A%Z7IWG^7G@XRqcwswgDI{NhR zT&AN%HUI%>pqtrbAh0xAiBt6=i*q6X0mGq2*a8d;!X|P>mZIOZ%P$3kxg3utjrhi4 z6iC>iz8c|PqS}YT7?+us@oXeSf1c6HL0BJ6Q&cSR45;Q(prV&j1gm+>2$iO;9KGHW z@}lZ&G&+N73>Bl%8MG8bMG1u*Brx@di;zba;?d##MVUo^xRlEbR2Zc}T&932th1Dm zM2cW9o1A4Z${X2RK{exSy_ZBu!2v@{ECGwlP~X7k_JyUSHySODLyd~kG!AS*f;h=( zu^tjwDktoVjKKhV(r9X^SnBc>|so z6#?DYvQ${&vd9wl0+TFLqd*lCsl=6KFN{@PIc8-EWf%GK9Px{2*6HagV#bgg+o*!T zzG%oR&PC*irXI0@wmZhCkb6LbEigr#)R`KQivZ@Hy&r5_=Pc%}5iiRUe#x`x-UA|&0&dODZUsce4P{E0T@pPd(M&XOjYa z&Y}@ZKEqrjaxd9L7SC&!s$D&)U0@iL3MVt}$Ocm|c*GP`oehbhbxH-hA_AkO2<6}@ zk;jkG0*oQ?OG6?^MbA_q7dD>NZ#^W?P$0@AT3dfV?&}yRTt;NrWDhvsGQqM zssdH4;b-{*tQuK6F?fI2%LY7<4Fh0HH7mru+&5GZLRDljExwVKd=XIT!a#T|3-cPu zi4!NhU|znS$Z#^U+m}%(n%SfpX>3Qt@sd-&EHfK7kmB?LByl1YGUnyQ2(kJYHn2rT zNl@f1QhQkHB}WY@odu75Kzb>1@?xiSFH@QbcQOgd!N8a9CUnM36p}?#F3anvWbYB$ z&@`Emv4RI{lcL;G#0BMeopog zUk2uz31JK(KzN%ofNZPtB0LntlcEFLAIJ=|oQ38;sP(TloyrLlhoHHuWYl)(G z>60xXw1(RYMq=0@DYyYsPh?4|MFTdGQK3?nsH1}T&x+u8dqqoOH-k|xqB5{Usnr|g!?vjhOe=Q&H4Cv}4uwYX&0?Lo>@L`%+S1 z%k9mJ#@5N;8co5i!A_AGqXh;bx6u^D^U}DDbcQ_o%ZZew@M7?cOc;mU%#|+L@XG?f zdfd$GQX%e};K7n@J1W}gQqj_-!s@KfG?YPiu!C`JpAFcA4{ zWCj(NX(-WN^pw3)KpEucJf^qHAkkSI*^na?rDl_7AJ{UDUS^-CBV$<*Wn`$Z%!4Se zhsxMikk+9Ft(fMyDgu@=8nC=5wM#Zx$tD5As?vyDQAI(KM-!6B71gO;o)xVOqadnc zG{Yt&gFtWUj0T2u5KMHcp~%Ya?J&?~;=kmZah}B~Qs-gm*#6P3Wxz0BmoLBvdoAow z5fVb{@o5(GjhE!s!pbE%78A(=I$EQeHW}y1CD}w$i=VrT>J<)yx`>3R%Q4_mJz2jG znY{rOkte$ z7U%=jwL%PV<~Ubv6v6Z zrJ|7~P4-M(^jl1E8=b;t8Hq}la!ECMXUw-eW(?8M5wbdG&qwoOD~7TX0)zRM%`}u) zjj)l083VZm1d|>ui%-rKHUz?DmXt2JSGr_ptRr?>kR(>D6!s_g)F3T%&xEKte8}7+>y& zxd@e!CMsH=-B`uu=LpEWsT~GI3RMaN9d_yUhL@81v`LVxA>?i^UyGA6Rsar5>_5Ku zswet0-U!ua9Y+le8X0n*#^_;xl*WugUdCUEBxorDX7-AfV#=oCvXIO|m0S!GGCH=D zD`C@+%*uI7ajd8Up~{Tl&PnF3jH;Ag5kDc%F>};xyi=D6pXqQ&hV1k^+b8gR0^I|84x&cMRP|2_6YQqW8i1)46eF}Fwd2EP(}1L zB*H-76flM|8*;0Fv{WKbSFop0o>XQ+sL1GvONL^Wj5hqn8 zk^2@n1AyYAKP$(uMJOc-Gu5JcbtW(yWeVb9nZ_HcGnKQ^Fpk2_h3T>&DQwCWVdHSG@Rg~-EQW-E_72$CaE6@|MOIR+ z1(Sx<85nECEVU{ULYwEsEE4VXQp`BB5QZWuB9Ft&96UpLMz4`(ax`DIGxw;dAjFeu zZb#wDWl4*$Mgj<74^bs@qB^3rQITxe+|2uF;0mU4%u9}nToh}yNBL0*VML8;xReU6 z+IePb3`N6c2$6G0*{!1DQbYwImc`JrA6{{=ge-^^%S5R(;So+oqcMvD9t&m0wso*y zVIz^~wYscu^G#+-VcA_)xLaf=jRuCz`wQu7XS>Q;Y7?-Y1jx}qSpvCW6|P~4GeVzMmd@=}6;1>y& zg3-vlAQ@eRq=3;-Sj7xZESH;+aN)6x)K{t12uFfp+l|SF!y^VG#D>hC0nspEC_HdR zWco6@u@ROEZj>ruWMmSf-qAoTmP=E`(s^Em3J#f~bcC8=CSaCV@rlzGLPbTo zG*p%}W{BBa?ZyCWcl=a2UHbIURG}pRxIqjVMedvNX+2T0D@f8Jkr!CX z%`Bte<5<5<%ZxEkp&qB#-Dz*35-l=zHUeA9Ye)i&0B8jzLfWdxOEaR-W^e~13B1R_ z$RMRg7PI#%0mEEO{wPeIalkFc$#`qQnf{byz<` zMURTLj9He7dKIlWrzupp81mr9;uBs@g~e2A4RMrJ`@slsu}k%f{0gWv3l|^KWlERg z$Wk%wth^rFMwJvjO6_L^3?voVMHKCIB(vy|y$4j%7?O)3_&Ik^?NlHO2~AVUK2-vM z*It+*3nvni(%mF50IEnmXy;(OZN@T7AZ3Y5_GDh{F~AI%3beK^{ao}+r;7z)%m~#s zj0i}Vh)}pkr`KY}G&4)#absn)vwE0X?y|RY!k{3!%!8|qGY?@)aW(@r4H+;1VCwQw z$|7LNKnU$JQco{Mu&~5qz`QisD|MhPlIAf3p2t*>$j(l=n~N@sIFZE}Gb9|Piwn)6 zFeAv+&iadh(WxNTpA~CJ23ur?DvV*ngLzvbufedMU>o)=7EO*c_Sxbwi-4hTQ3Zno zkMJ{WYNv`)PZ0-Th{wIqu#8kHBBvpTTKML$bEpYML@pI#Uag^~u+bo6GK(G-s2-!v zfJF+cQKMcCjXBE0*zmS`vNPjE*t|_GtUrPvnx)I4!JbEEmPfF5U{J=)l1X(07}~Fx z*1YJLzH^UgIA=`l4-W0|^&wrp)bGG44f{>(xzDJoJrC}($B>S@4?J+U<^y)^yB`iT zaEVR~!2o73?);_xRbL+h_r`O^Ak=_G#~`eNs}^hfye;~3Y{3Z~)t|`B(Iyv+T3gX@ zw!>2>X`GD^8jG2@L{CJsAney-@u?U96r7_mMHQJ|nKT|v3(D|BM$xY9XdCiK%}`l8 zDceRa;~_!y-~zx12wN_Y_R|L~o7#8Y#JV4ktoquZPBVJ%cSO%Uhj-qkao^AN+)Kyj zd+qhPnmz4M&z{zgvvsVY{C;2r2qpI1%YGgq&T*Tb!-Zyfks> zB(!FRn^-A`0_JBJ@JJj6|G7;PA~VavCST9xQ_I9nl%|F|M*O@V?WBTA)+pMF$xFk4 zx-!QCfa*0fpF$PsEL3p9Xv?SdyLeLV*(1ArssFy?s`nV$=?e|}{%5z{KhtgZ&sOd6 z*&cg9*)R0kdzadMcdPC2#rpmCtUqAyhJ*HP?AW2P(|%2z_wU_hzostx<6xsRIxz$T zn8A3rx(>V4?gMuOK_~=7SOiB3BlheUT$Wd3}<#o|FA#oQB^|@eT^_jyCII0$V@8@gx{!G{1KHX{8|Lpd~&sFcaORs&P z)ZR@UA>ToLx_9YY-MwGW9{p=;n(J!%*H!nc?a`+vj_yr0-5aazutrl&k3PMsdiR6@ z%wP-`IKmx45NhwHgAf+MKU=*g6h}Hp|M|LozBuTh1CFk%{^syLb0!R0R=nmCY~!3< znMSGPa*xxZ+M~v_^s>24o++-`IIC{&1kxaJo~GK+)SM*i#1>=kWqO5OOEP!*1;X8HSN}a|Ic*U?bDri#ThFO671PHo_vlpHty8bAP_tohpME0-4jegj(5PX<#~+FV z4P2rVLok3DjN#I~p&IT8qG$+<;7HM-sT0zD0lH(c0|s>OvfHlx_CIiPea*Lq17w-2 zRBs58%ZGN`gtSSHXc48!ASX?24JE284ANyDAv&G#lp@(g%+SJWv=kLCrE-!x;_Fak zDVy49blSirQyR}1+i7N>J%)D168?_^zkoBA@UFG{?$gwPa)c`rXriFzf8ui!WTXX32_Qul?oqSO50bYp=iSk2l_P^DPhD zfddU({`S`EFtp;=YZk6qa{i_B;BxABzdq%}>BGhy0+q29AS{9-1rqfd(1@f+4FJ3L z+81Cx({*N%*PZctOtesx{ztE&6->OHJKbUF6qnLnQM-%Ebca?P#R-Sgm| z9(wMvf4=_WEAPJk+Iw%lx$bTJNa;Hp-hF4od+%*r_uj_!*|83t7=i)JUKcquaq$YrY4PE+G@6~YNZuK1iPb+#7S-}m%_13R6d$)T!NT9VjG>w01dY>E%G4AH#GR@1i@+bkNx#vd~6l$k%d z;AdEse|qFEPrdx?zutKbdOu-^V#m;Lvi{g-vDlMRgN0mt_@ zA_zhuAi^T}eGmT`iOz=Zr_4m^Ud{D@fhEti-&}iO@2-0_9R#S@-uWO`zt4UXYI=TW zMDrpkUgAN88-Zd~B=8&*q0K|$rcS#gx2a)fVmtM>k*iF#f~VBX8<5xzU;?1vvPoyA z5H{hA2nm1Tm6<8a^ua5q54>zL?s|Bgi&s6S@)xm5?$^6>xBflx)Wj#Krka|5+@DYX z!I=wJU-pN4Z+YgGf4=tK8*i_txEnXUziHDZCBp*C*Zh_DEb6iD>?x;LMF z^?9TQfN%cfJ0p)8gEekDJVAEtSF?Zb&UpAY#lMI`P!68o23+QfyEI%8Vk4c6rK~>@ zZbAo3=9PMK#iNq~1@lRoluo15z_x5Gi`z58N)AO>Lec?aj=H{Rq{wV&NC6eudOR!* z7}GNjS~3;yUF>tXsoa$hU7!muh`RUZ&9_@a53J<@BZqwD%u|+Kx$@>e-Tv$=&tth^ zH{S66hWFopANoSj)=TxHsGNKi7H9Mz5z?9N>j2>SH(t8qulE2FfDIfu1Rw#mXaD-D z{=N3^-F5f6{XW-Y58TbMz3(%!Tip*28@LpY>qXUIOss+jG(bpBms_UJpf}N&*h>v} zw-kzLLDD9m)R9P$d5#{JBQ!Dtixa?N7Ny`ZF)%}XGZ7e;6XF^wyKI@(bl$iFj;a4V z)-oQgtM}Nwem|&OGoT(zxC`!#&GqA^O+5R8pZ)RPTOWP?$=BDtwGR8UZOc1O-z0SF zMw(IF^Ea#q7(jaTpHBcDK#rR>sn>u8!tPgx5)SO!4dtLHD2{h&4m_s5>AdknTAXuN zv&4y5B{L>{zG|e1)}5P$xG-~pGKNdO%vD~nNu3BnR7%Pqngi}->s>gr6-q}<7#pIy zYQ?aNKq2Z^a_CBZ86ib@3I;9(myj z+>WtVV+AE{cbb}8l?d<%a^t$!-+L2^FZtyPylO)s9eZ|Z7}y(%@7vUAm%4qq#=Gpc z*P&hU&Ra}=7fzRn)kJLS@kT~IdUzP~5{1lXNA4?Qg{6xf9wBp~L8M5*;wf0p*t9?0c{jZG^~Hw$yY;VW9Nec<&#nj7bQ*W;M7+-Z+fxrxW!{H* zBi<_7KSpChUB3>n0sik#KRkc+;_=guJg8?El-4w)FCH@YXgB~R<5eW~v94cf1{Gq= z&r%H>T7#XT2xdY_tfaE(l6dw;NxRqt6g)+iK!vO`QheoYEj0UcS%o2x3|TpYqeZ~! zxI6DVx`*Cr+_k;~-h{-Q$K7qe?g!#stn(JmdEoKCz53o8xDS%F?X5BmW%{iIYXl)-&G*h;$PWwvmm! zfXc4l_`$|aA8h>KgH1d(ZFv9P_uhN+owr_n`}G&!eC35VUjFABFFpIli#X80B|0$# z0|*3T{#78H;Eoqp>o;y#ho|jre8DcoQ4~sh_O<7)xb9aIXC95WUr;#ScH6&CS5N^$ zKnvdL@4xV9l2)c21X@p_j;kPzc%Bh1z6sL>{iXHmQ-%FnQAK+#83va#rkC&gg^SQs=@Z?>q9=!H~`&XZR*TQezI`8Bge}4Q8Kb>~n z52yV8`#8|RB|0$#gSq#wUj5*;H$Htg9O3@Ln=eCX#YAwtTeD%^dZgPnoG9>(b#LK0 z1aI^;A37MHt>6&_Z?W?IRlE%EyxYEGtMMtG)~w`{tRY9CMMy^BQk#v?*E);4C!#T+ z9m$@TNh24RBIcHKw6IBEj?&Ab`5B2c6=yV^JI&32!Nno;-f# zZ`Qu__ABqka^6}FvD_#z-Yvti@%!f5xTjtFRslYMP_8wodpCmJ2#pPOty*$S)4=i1)$p z@Y$iMbN!Iscn|r&n$CEm>8^j=hnFYZAh-U%_t$f$#rBLBw$Hxt!fzhC`6qWSI^nvX zjQjQ12VQ=B!^$a5tEcr{Grj-XnayjD8?g2`bPl}ygh87g z<4f27^rv@T`rF5DdG3vu-p75Pw}%gKi{E32W$r!Sv*G9J-!2d^L62cMRL zB5dZn4>+*?>`~mAxmZF7k{NAZ%dwhV8jYIVl!FT`B+h-MmzJR|PbM-0#pkoMh4M>^ z7~6ONU{Bu3{+?%zz=uBgBEc8x_QAtv?reADWw^(!a$Sv{?J&CG#op)8Nhi@W(zML;M7MA&-H zpQ!^bKVi((XZ+~)1=l@!$Fr}$uyGS^>O`~EFB#V3!?kxo!hc zxp!&Ux97JHHocM%q}S9J&(JX~G?R}4NkLONwY4@~8uO*2luC0TE-AX=%f|X;jB_cY z%=}#ajiH~b*$bce;DuGkKHYI|LPdQ?48WTV&%OR4Us7%H3umZ|J(Ew)A8dMS!#j8X z^RIL7TQ&7}-|fBf*j_D1*RPn;d)2f7YmTFKYk5%X4?86Ehnm4aF=3AsNQ88~Rvg{1 za_Z5)J?s2?SKj^4zXKA00Uki=VeCT}yPIuXk0(+P(*MvwlpF6b^sU0v8sr9bc+JA) zLy~obrs6zx;*w@@=BPXlM?fQSc`x-wk+~OC`m=nAmf3WGz_3zyD%zbCwI&bh5 zCv;viwr2UH-m9h#STl3*7V9fz2T{J`p%)Idw?y&qJpt+ZubJ7j>e!m)M*_y+E53Br zt#faB`rbD;ylska+VXo6=kUf2Amn#<+%WR!u?JLl0#RL?Yj$ne57gmlt?IPFq?d;= z&$Ak)z7sA9LhfWQ7YZa%B95Y2D9XnvVKz_`L!2jBr$sX}<;7X)+yyHdIB_JQ@x`8_ zzkKW+f4>(uXuNjba-s2njT_@z>)*NYsk^`ahuM8sP49f!*j~$zgv0~a9!I6t96xZ) zaa(g7KVbEY`V~hXdCgfz{`Rc8mZNbwa4Ul#sU`_v^lCY>^WrgmS4}(Prt@!n=AL)f zzl%+M%U`5Z?)B?I3*K7*MIZ|A5_j!a4eGd9I`7uw>qA{`=^`n$%GhI^n{e5zaIv6W zg_@>&rkV?F`ch~HwDoI|^PRzSML@!sfluf076EVqEig9?>DQ&M`?04Sci$s_#)p9K zzK2)3Tl$&>FLtm}?tcF7-@18D|5ekfmLAd2a?Id0#}9!tt7mS@fmyM7W{)LDOt|_R z554l#L$5w{#IMh+UUI}h%p4oqhM2%Jc+Cj_R<-1a{;Q{-b@SZYpZzm7B7on*1r9<$ z3&_D6hSN_yzH?o7dpEUaH8@W6Ecdb)FtmrC7+m@ac%B?!)mp4sJKQ*6+)$dvISMKkl?IQ)qn7zr`#1gAIJj zefo{(=iImI@Lzrv>NK_-GjR2cA=|15L>#nw=73exdoGzY{;IFv_xyu=ruyK6KfUnK z_^ZySSvnCz+aPpuF<>(Q5;NzJUz|AmzLsa+c!3EvZu-!Bx1L)-4k!XqpsRD8R(A~^ zb@-^(*a1)G(k>RA>7q3b^=)0#Knq+Aty7-SZ)cwdoC7vb%+XyiZFrP62T4x@k4yu! zSI+2t?zk@w>S#jSJ$i88F7@4KoO;6jkNp)@Y|&c~@8K2L1~ByYx_5r}_-#|K`Ci@f zW9nOu>W{CiK&jO;w)ud2|5ej_Ej#kaUw`vY&p(Lm0*P?o3n%x#@ZizE`Bu+mN5Wt` zWLY__9*>L5kDhwXcYpop&2O)ZE&anbGpue5A9U_`($)Ch?4cPj9g!N$4$nNrLx7AoQcJKK-NH<_}tZT`mQ*3z^WOPVAYIm zJ}C6c=~!`-e{nQi*f1CEzx z?@({HL?6Vx8851S`{>ORuKIe-k|P?HA2VR(jDf2@lFFPXt7bN@nqIYd!ZE-8)?Z(I z6trWv%<5leD*yn8kZf@_pOme<$4v4wI252(B2@Au$UD#*m!EFczNVZvj1rx|?)E#sGws0jC17u4j?&YVdc z+DR|U8mdX$q-Ijw!{+nE+OWhBUh?A}jSn^Us6PO2fp+ZKwa>xLzq|bge$&9d?pGme z#if?jb8o(M`XA2gcImi=rAH6OTBgd=Kk|VIGo$mOQKNr(>R(>672VD!7r=?PK_J9m zUVLQiFHh}q>1a4^7YqaOM&+vGP*k@?V^9CXxzE1&BC@nO-*Q@X@5T$UYw!F6J|4nb z6Ciev`u*_{38=0)bGVq7K+=nC=^kpbA8osoWo|!Y~Uz)3kgtNN&bg#6R*u zrB+PuxbW~1Yrk^e3w-Lvt$DLp{IT%<7alt7ijz7m8U+jp^3jnX0*dOrd@>50cFp%5 z`qvWxgD;_P9t@}hfuM24Z`M}z=?P--O+}E*cP;wt589>9&=oUt1<^(ihI~|wq<+#p z^_T(ljmbb?1}Psf75D2nX#T-;|{;5|>Ld zTiT%)Bc4QwW)onO9T=@O@{V5rXly5l=zm}dBf3GOERD7L-|AKX0l(o=Y^`$Mb1 zH$YJDAD_JY@GDN~zG!TJ{_%GT^wEz2Ez|lhpW1cd=y6w`{+E{?){6d+{UuvtSpIPN z%S(?Oan2Mn0!PpzXpZg7jN9rE1aGNxwSd&+R{q zwGAtJ@$W_e@2@XCa^$bh?6GKE|7BCQ7dFj9lstU(3D-SwJF;xah676PdFX!73zG3| z77+fQc*)aqFGvvDX-OuTl6+dxxQrg|`PTME^p`hnO&A4lUNCv@L%ZW2#^Mgry}4Ii zb0fZJary7B!I;My%`Ybu=!SH1W#Q|MdLdZR;+* zj!sH$VMCkw{m(x*@v74ic6%X294mQB*9D^vUwaZBS2!ojFZo*|#Os6?-})E6uZ4eN zfVVF|JIIFw5W;T3zC7*L3@LG0^duc)G8CgRB;$MzxO<;j6Y!=tzX;lR0JfBF4b?}? zIO^}uJdAJGv<6wx0|_4e*He>zd3yJSqxvnM46V20fq?Z(CY^uRQhfOgx5A3l+ig`+Skt!-zdXR*8}IG4KRNXTf{O4u zdivGhty(aq-?GWg+f``H8EHM|uI2Bpe{VZ!z3HuWZ~y3)i|a3g*4uMh+J-g-By?Xm zdivGh`RAK2N$&O@)zFW7A9nIJ*Zcy6gZ8fdYxo`1uDe5yAPwsRB)oji%)|#SpXZOp?6ps0$KFHxb?9~gzSoV{1)G17g$0jV-gxh=)35(o zr;88mv-IfZWmECYvwaUxSAW^0*>^5|cU_@1Udcjt9UppUtXN$5lnV5odBeGNizjSf zsEP&>`Yt`X)BM9uyY6Riy!R$3+RV;Kx!>Ois?R+8tbMy4fX_YgV?Gc9@2A!O7@vY= zVp)4wrJ!vXm`zCR_A}VIYUZFN$L>3-2j%#*I*+%lt!|mP~41Ho5<@W48OzZ`slHi;qZJBQHMV0D<_hL;nFrg_@hcgx0UV z`}#@0JG=JM@!K7(0)mRB%O-WX_^=D^T8?ie<9l>~-5x5C45~pm{((&AUfuBH5)cA% zKom$5a%1H}zI>OiP`TAmWU=FD1bitB~^cGor@X)V^ zoZmcrbKRvAY8Q`hUN)uQ(qsDXfTQ11X}wJA8gEv-^yVwe|8n)LyOz$qr)Bm%OYeB* z0W9;)+-oYTz&{6gz-b@4S`ohuy zy}M#*^ZN|n9-&2QtFo(JL$;QE4&*&*54?0L{v8&+D~NwWZtr_{!8e@${`5oo zmS6=-`6ci_{>oG1e{pJ;`6HW`PU*Ykm>qQVS#oskBCKm^%`de)`10eZZudC@_M10+ z&kF|5y{iRZ@P^nqyv?-n-4c9#{m5UO-ebX-9fVn7K}(lQMvh&33LacR*JdDbXybZ3 zq=9^V=m{b4@4F!iq#3k$iY;w!!nu65%uBMysBPD_b=z__uT?zPe&-Ope*bKbJ@FA6 z{#h~Jp}q9-Ww@Q;p?5PIIKGX8C#4_VG_U)DQGG5uy6=)5c=TCvRPCY(v4>OZNB;HX zgey+%zF>6yrAJgR9JA=&wOgw-z70P9@>AfuLy;pm$mu@+@E_fD;k)bJ-L#?IZ?o{O zy>SCRS6Z}oDSoI8LO>3Pf`_Qu?;ToNw(*E%6CiEl_IRc>PJ{BSz|N05^<~HIKfWj4 zCBvew8BmAsAsqdsshC|`vZ#Oi@J;=fPOe=vz8_ZfWk>C}qt9hW)-D`B`wl&uN$aO3 zUU6FWf-y~(PVBXC?4tWF-#V=~eel@7o*upC#2T#Y9f=&lK@KQtUV04Z+QOxc54a&j z&jIxi1>arSe?l+FRH3XEY^f6xWAU2MdA}`ouJneVj{ZXZzW7WHU+Kp?C-_N_rB|-N z?Bc&eZ2!Y7tgNSAeQwH?XH?H04Iy?kUF~ZND?c^XFv|~rbk8$yb7W>uVt_^AM?n(o{mR77*?bXHpTprSBA-C<`LzhoK zU{W1EImOS5;m4iuZ&L6xagRLz1QvCBLgP_#!+QKnnD@`W{j!?*qZ=0;(QgN@3vt!X zy54rJ?|AxwLt19`TrhS=PgKMQMIZ`vfizHue=4{cx$)2W@dIv?Pn_1JuBxhkEq+P} zyY7LL>L8YG(2y8vx}dg}DQjBJ)}RfK<2WCzr}udi@Kr|4oc(%t!HULf`30*NV_t3M z)q&m%z5SW{hqWAwx!Py(QGFL5*=GkIy%$gFwP4)&w=c2haKB$qyy9y;=8po0SesjQ zzeWkzmwx}qEd!QJu3b28M}tRvP}FzvQJ`!1^67Uzdp~w^U}#tFb?;$c#gEBA4u}G2 zAQ0b1J8wcP*yBoCw{?$}<*=1zxr!f&b~(N;KD)#(f8r+~@GtN11c({6xkdfndtm9U zb?=<<`*XTncu3Qti6~(waMfCCJl0OU;?y4V58no@*V)G(zkcYCbqmMi9<&qYs>yv6 z=<0mYh%>K0=N)_pbrarQY5V0ichrsR@#Bh+1Miwb8VH21<##=yAHJ>t`M6GP*$#!2 zwr10ItyRqBtO*e79Up1!ISjuAx;uV3P>NhYk6|J-6Uj0@}S(2 zo#qbfvuNT@J9;lVqSqy(&%dqM!>RS!ulBh3u*L=BdtN+h(YNy;8Vuyz`Yr&Aq3?3$~RBJYwhahI=rufZzy$~+Bmdj2G^{qX=hW` zmbNcvmmVrh^yB)^o3vZM1F){~Nr#>RT7I<}KLoLvw;A#8(DCorzIoj_`<_3r&!S1a z7ap7mu2C+hy6a*%L>sIi>2NLmTFgtG?*)Mfa@U+I0<{`7;`}y1#zye|MRC z2yPR7F?)A#U7!vGo_XClAQP0fCpUz^CyYz4T!~j+5C}3stlj$`(0|^Mc6W}go7*+- z;BlwMHtsuo>go0EL;kbt7x5lAK0&MQQ;XkOz4LGPZvOof&~n!^f9|(vQn$H>^jr9` zYyBj(zVIVy4W9W-{=o+?zw^qO*Phe;!b9ulkJ-^$gE|tpXwu!!{28g+)0+Jo*W))) z4?A)+?%MeBA;iL4roGM@p&K;ME-RnVyzO^t8=?Wfe{$eab^JbX-G2DZB0Pbg`IEDr zd+i0hN7r6zeB6Lv6FL8u#T{l1Xj(A7_ksyK^FYR)7acz9*2VVuwY}zg`SBxGom4gN z(1uIKR$n-B+tzg|7M#EG_N(8$VOGtBBkM02yQ51(IiT_UTNi^;5Sw6BG$02=fiw^Z zGC?dzcF@rc_`XWEhpQdB`{Nlma87`g#|@Z&%ohiC#6KZV@MB`w#`hT1alrh^($NH!tZCoYil)l8(vNHW z$r!vZiZ8n0?;Rk{!4nR<>Au@Gvw`dVlWQKnspi7NdR{b=RLmd0GmobE<9c2=vW;~; zcSOS_W2)yJw&?Cv+i<_eIs&EmFcgI2b*43(tG|6uMPyF9FTeKBR6A?ZSH-Q zjqCn+->vvrb;ty2%Vtlpu^%^l)p6avG5~M8;V*08N13oc zO#kZf_>J`TzJG!j{Ps!v#EIP8&oFSONJE1NR2pYRwaPW6;n2m2)w6~389zqmI1A)5MRY5Gg zse-4h?k5e9rjXLb_4~E0@mSFq!b3Yg*uu__ziWW6f8)N7w@~oDC?4|Le7T2Cyvc(N z{E#KnsxCN~JL>##JNamwKNhQC)~%Pmi)UB-{2)HleEIPSt4``Z_u%?VM)#O^=r(AL zx2^CPj1_(TqZIm}^9OUMS^%wgMs=XEYVN^@E}ikrYtQpNw6;EGLMKFlGwqT z@lBOZyFtET%kj#~m+8ih9*Ld;RUh_uwzGQsUCF6GT(Rj(&nt6xKx}~i3%CB_40PA{mkGb2TweHb3 zK5|?C`A2j-e+cT@nWZ6D&v}P|(yRY*1L(zX(^ov0>HY#yAPxQ&31os;xMhE~`yP7^ z?c99fQM@DD3ohzQ-Dl!F+!i>_QoP~p(YrQw_2tJI#FE_sM+DlW{p4NTN z!A8i~ri*v>(RlHgnz@JCy2kfNZ4al`Cw8ARy#At5JuWz8Yxi($n@|4hnNdq;?0;@E zgx>iTAtT7_HfQ*>%fJ588~?&;YV&h1ZsVKY$6p%4AC`hxkPJ^*kgxi*q1wYCXeROT zsgsSB$910B7Y}Cm*=PK@4cx5pON02l1KUVDTCc}v>$g6B4{p}ga}R60Xza&wa0y&+ z=&YMBP4AmM{PN@DSA3=0?1Sqr991>vkOg;b-E%nB5q^Al?(Iuz=Z(bT0_`75UD&J+ zTQcqTC+@M|R%%0ShyrQwXEJ_x{!bwmB!h5}uglE7wucvYXJ5|Qy?Zdeadbp2UTyL3 zGBh{fj=%JmEAZAR{(4dC`-SZv{1vhlf4Zvv!qK(!4#yt;u^bH-jjq1nkXBlMx!dgF zbr&99HD|=uYK_wHJ16h0U$^M4Rkd>uubMrg=_1Izv#SH8^%spw2FN#+kQ^PZKb2peBsf14etVD{4rT*4c}{TzY*U| z#xp=g3SHvg!r)cOfBo^|Zs!kcxNvmig=0RJ1F5U$K6eKW4>iF&`cC!uZ7T>j|_JYH@oHrD5H|^X4v4XmtKm5P`co9f$@7Hc24FvlA z?KjjyujU2_$EA93*ZvnCQjZ^avyQT$Ui;&=k@Qm z@enAj@!0UfYcHPktMB!gJ>0a0+#kcyaN(%xIU{D>ys(wlL+j>^teSoBf;(4kt=1?I zFT3zGg8wbO_ZL0RAKvM_LA`O4qTD;FMo(BUWu=p2SdN6zVpO51OdmHhs3-^(~ zJ^#>zmM_)JIb^3X&^pl$(ppvPccfSR>6caK59@rcu&&b# z*K6%1_pI&s^MReu9gLlPr&S7Ko99os(;fa<(`G*20)XE?cvJQ4gKOs;+A#O9O%kPw0B?;Mxlg?LKSRN7P#Hq2aCRg?Fv$c+LP!p~iWmcTTY&w)*@L z*FJdjX0(Ptkm>v9osF-bRpXnbbsexdcl%1SR`Iaa+_a^yoppI!$Ei&)!*5vO3uc{q zb-UoQi|`g)ds^e|2E1Fl?4B#Ya~;<8zn#{{cRhE=cF`JZNB3?#AuYUfMa}ucd(0ZX zbLs`Lpm)W+zr^bT5T3T0ya9nA)9l6b@DBta9OT1-?KHKww2sw{$1~r+wWS|0u?|}A zS$`m0@Z+)gylgYyMZt{>Ka_j!ALsX&J*;jn*7eAb>!_a#LWa${X#xJ3jNVJJbq%ct z)n0H&_gOTT0?Q%xUrYs{P>+C7EP``A4_|OmkeUDuD^Hfxo^DvrheKqU(sqq zAjq`h>NQop`PZ58eI#hzVN6ZFuBrQKzU;!;UU474_rcw0*4PO`Hx2D~<&D2-@5Qx! zl)34Zw_f|&)jxpN4Hu037>{~vbhFx8*FPUrJNuCC=WU;L%_p=?oBr^~ZHF(OhLVwV zr$IzX`087);ZHKR`IT|K#D-Y-nNYl=0{O6D_a4zrFRx7Hd;{10`uIJEbi!7@ zUt?#u;0KPbx%GPdNzgX`!-j^xbMfLEFVDRE4DgJ?KgOf(faChJ^n}a5@zNVFgK!{eQx1HW z`**ipkDp7z(#9XJgw}fw=`59bw&fh_noAo!dkpL-t>H3w)UfOCzG<^sZ~Eu!FHBi= zO4WHo>*pN$F&=eu4(V~;kXe76pWm;?Et%2foPoX0Ke+q3gQzwB@O?Wsqc+(~ouHTB zSlG1bmdEcJaMAb!{<}~8oWpizu~p{{nX>Au&%gcxrfYjzL#F?~z4P#os#yE@`#0S8 z-uH7AQc2Gy+3aR_vzwlf07=9Kh@hbKCWs&>cpbJwKd2>>KOtyWj41YXQJG|$|-e-EW!5JZjXRkF?a}IT!bALzlex21^Zk{YX8% z&appGV6M(x@m@1+IH$cxjeb9CS+6eTu9PJ=xfb8p$|Z%pw?8=&RzpdHdMyCDbn%@} z-eYATTLU6eS5s}F*HWDg zO&=+2xUC5`{P5``1D_h3Se=`^sIU#4gG#wNw`Rv9?s2oD2YRm>YO2bzE$or70Ib)b z6yC-njH=o50ga}6^~P840CYq}s&nxTI7eF)(_EbglVNouHvB^m8*UReTp4Zg>rqV$ zt1bngcH1n!(YD!7KOY^mZoGLx*W?EZ+R!;3$cKiS?GL+cI9NYE#8jDStLdIFKU?T^ zQ?RBNL!)=wm+y9csCU%7RM(n zjHxcs=VI`aK9`}+5@Mz1N~zKA&_c#iLJ6$KQeN2pN@HUwr|#P{BXNFC^1}Q!bdH5R z%=2>^((4Rcb+?47tR~uUv4`u$&t8Yy32j}p zz^XUQMhPD&0O)nttyV;$ONx7pRIL{FtjLUKF-H2!xtXslfY0`YJ=z}Y2K2f)SgZYd zZ+!7~){4%e(_}P$?FY{!RAt(#^Bgrj+R6cFLREJ4w&h0K?8~EH_gryjSee6A znGsp;TE6p%CbiAL`acKvc3ak$=xtRfl`o8qugZMt-|BoeUvrvEo>;~-w3z2|MFL{% z;53OWu!1t8W?GlNy^@}?|9vj7{`$zb1j{4U{nYu>TfTVn**!0A`sC$*ef-ki!(UJn`PlGShkG#g zhm(hId}LruS!!DqO63btzM8P-KO& zwBcez#WhzP63*f@V{PGn-)js1xbpeouWnm4)LfZmU(l_soNYl~{JhNSZQ@8zwYFAG zG{Yb5&--D3bx>BXSO%u>Ze2Mjx-6xw3Z?QjS7zS6YWTjNzV>5n;V@%uAy~W0Zc+8J zG~lX{ri{6Uenw4SmYdQ%CX;XJ3a=zZlgkxFD!+C`CFI5WLRC7O8HLJB=!RAH1-0R*mudA zlbq!Pghs16S`C-Unp#xiqP`y0?TMk0x7+`bDE9ay=cLeITl4%n+Vj+a4Q7PmU?kUl zxXCfUd*Zz8wqi@mV}0q$sb78`yJ4!SEUm2yMZT~!d4BheA3YC~y)`Tm1Ny~JKKC?W zp`IZrF{o-}KS#GGhtLA2c9zw&X2TWGQUHV{j~kxJMnAe;a_^plE16i2DrVCf-lr+{ z?!Eub?!smL;>yz7iY;KBP@Y-iQC~MGnf`l<`#vt5nYw9aTv>*#?esdXJiX`g{{Q}N z4@_>bVX5}+vAJ^Y;!2LIQhWD+FMdR(093TcWZPRCD-+Fc(G=HR(&T*Z*XB^2#B2x0 z6>>ejk3G3?4>C@iIeGV!W1{D{994Pts$9GHZ8aydBj1=gDHX3S{N=Y_I2Xl#OudC9 zk+Z*^o$}nQsM$^jShq#F997+-X1fNhzUSoGQ*1SAkW{c{Pc8t-J-IeZ4vWJ%Q9Lkd zat{qqO|>P&%7zP|wb#^&Ue~+Aumf!AvZmSDCG^RGy*~EZix%(YD|26-j|y1l<=89p zY?ZmK%-bHf26^SplSG&vt=YCbv^0st$%2f?u64>q zF0j!$uPdgq{FNG}w_vh2Qr&y)(;Ps?DQDNGgr`>YmRRdrtZBEd(MshvjLLal~LY5kQ6hvE8baM_|R=Z#R+6Y4b_^ZGnJ(R`qq7K!d`C%oQ4_DJil!- zFmWq{IA7WvNb5T1;Q?Un?rmvCTUm8!*rmSbKRqJiHalnIgrvrBY8EFmR4rfF=-D`I zB+OshCu)`x#BKAsUTf#5%(a$hhZHAT=Ve!IS+xJy0d`Z;cy5p<-tqMHMU0AH{sTVm zKlb&!*J>=~nISVQ){1NghU?lF5H?25PA*v5=jhqvl&itUk}%-%Y@A9C9L{h!x~2db zz(w}81EOK5g@U`Sw|W-(UMK~?JhtmUv@@@qjFeJk`#AFoeu*BzrOTx+l}D5&SKA|k5 z6$)r6&x)9tH2dYs%iayRAkR4S%4xB7b;<)Y0u#sON&~K2Y)_?D&p@xEpE|EMxA@Ub zi_NsyGUQoydm2B>Zu^&S$InTPo$ay%bj7uDB%UxQEozp1(!WX%o%|7$5i?5d1GB6A zMB>z#WOV4%50jrQjh>kd0oS^WrrEB9xoK~GwbPpcSA}Agug6(-79hLM*(I&2kJ4E~ zd5u?38Bm^iEA9@;jpe{Y&QNmZrg26kmo%x(KHj(rD}FkCr2mScT}l$|71_3H<`5?g zY4w)H=PsNhQ}oUoNmmK6XLPaZ5J~jvr4S1sd+$vFE0UtJ&f@#|%u-hDN28R>*qd zTOWN#F_!`a{4*&;ohg0ufZmOqDSc7Q@9+8klk^4oVbjgY6tsaMF!}MFYmzFmO*5U2@*G=P%ayb|3)Xd+o|sWx@bSUM&y)rf zj{9a51(*N}$NA1CB+PL4lk#sB*IuO-iy zb)FJ!r-cUAD0oXaM>$+gMvs>6c=WeRzcuwD)H+~Y{i`70(r-(5tbnRGObte?C5lNR zf@$Shou)+3c)ko~`shMpz!|$<`{D+mVcG(i01L+JOOGnCIt11kSMTiQnTc~!gQuEizclZ{ z@8W_R9|W}8C&*y1W#$Xz!Bb-`b5kMm>Pt!rFfFpgVlB_ub-=GXAh?)=c}xHba7Fwr z>bls$=>VsLC^6kwt2GYL5^Do)9)wSF>5YgA%T%H>%h3?pXKM7Q&yQ#q-?l z@=S41k;ytYy@iUO88{{CuE$0kJtM9KZ*Y@Kt3hmJ1Q`%>2?DNhhF^2Zm{#~|;tmsm!tvn;CEd6SnqdXHiC!Jjf-X~>) z)$QZ~lHS?BE2$hiW`WeJDJgL&W>l$_M)*5li#waJ(hU|90RRGk01htuV1XHvlC;2s z^W$?@4%PwHG*`Xq>a414L#eg;ny)nH;zwrDw4;a4g+=N-lK~rOwY+FXzuXR7VLB{&BP}UTeOA?!hvWjJ$lNvfT zw%@~pe&h^oFWpQZShUV32xA<+?<04IPK$-$t0`}ENn+Op1-rlXb-WdYg84x3==xPO z$*{K(>G1%>LKMIfsDZTxw_AS;1*Q^c@m0x#z*pIDt$u%cWb~abhSLL_5!Re!`f(gP z{Pj=YAy?k25{O}ZgK^{~Z!C)`wZ_kM*yf}q!GtC{V#St-=r4WpGP*;r*0+GQ4zhJ} zfg}inyca*-Y?@_<;AR(=lA20wOSe7Zdu_8)Y9P3K+%OI$<3d|`EplM=9nKzW83RXQ zjhb4hvqV|iY9N+yD`fR&;VELtkZF~@uX8fR$wlX8R2xBB^TK-M%15mYLpaHkeT8>E zIwWFxeA4XZ0BxD=La9fu9e?)1SqxeoCbz3s$UA%C%&0Z@h8D#_c5~pKoeHA{t{iss z=VM^)t#kkl+fV;`mTS2Hg36j3_fTpEwA1D>iK)=!SJPRAyACd%5?Lt>3SXkg2l0vL z9;=758APbIxa-_$a+vSBXUM)o`+dx4D^f9TuYUSQa(PyCi3O#$&Pnm#CCyEZF0u0a z;+~gDrv+!Pys_~r{UP#&k2X`l*cpOs|4T|pm;;NPuhY0Dk%yCW6%jK&c;pcC|Sz2_WbTqtrm-oOzR>q3E)vze2l}jtf|Y zc57ywb{fxoH9`uYmFxb*knmfR=zLLYJG-UF*y3rB`>ERBAOF7BgSQ9WA7!7DW}W5o z)5XuQ#S~i~*z(}zE0?`>J$y62mA^tHq*lMaD5f|uVTR4mViF9t1Wk(S{ZRk!PaN_` zsrMfIlIAxM00eMgZ^L^fb$@bLZG1K0q#}zdyB4e-C=*L5yMZ5nS#`|%7Gx`>caPI52v8mlM z0D_(JfZ`~*(STBa&=gi6sG4d@qj}b}UJsyax{fveqk60!7IuqOjJUcYlDnnG+Ty$Q zD){#odoKJgZY%S~RGO(`{_FDPC0myTPmYW&w%BH+SY|nWJDAXAa_k+C+|3f8Hk{+| zRw!@&m~m!x?^u3UmnpFn!FL(?3M()I!IPqvZGV(SHSozRALW&BECT;v-=4f%^JDGt z$=%Wb0yx5NN$S34xPg?e$f8mf&p=trDTu|d4!W`c(qF?}Jg1iT`lln5+M!EIEJqrK znWLsxmL55KoTU*y;D$3uEEly;-ca0WLO8}bX{O6k>h$3fX4oUAnJZteQI~gk<86EM zXIzD1&f8oaIW2)A_$VNsl4hpFm)HU(hE3W~EN-#)*(4J+_2o;jdiuPXT@oU>o(Txp z#RC?AB7hT4tAf>-i3D0AsCS};%GXh9gh4pnUr2=*W5JUfVVE05macb(F;>HR6^2%x zefNHKan2If%KYoQ+?Y{+X6dY0^ z_@zBBW4qTJgsPFKPnU;_|H~oWeJ|s#z96#|^Qb>hhs%*#X zbc*1kfD}JyVtC)B{SW%n9{cS#*h@dF-|zt(1rOU{J`eyz*5W%nfR-AnaFkFA)t1f; zwD_u&-GFse*A(O&_@;KJG<8Z3aJqM`Hx@RxaijCsd4qo zg^wt5iJjsXK5+AAKkS7ejT^3uza2eylHE73nxkc5J0mCmh!3#bn^(AAL(>B<>7%q& zAgeo!yhP9~8%CJg!8`-xJvO+@jfrA;k}HB;29E5M>>KkoZGB0Nr1|Es7(3Dn zW%qZ#5;Iva#5c$2=D^s0ZFzxnfRnRR*@*+&VSbmMi2$MDQVTV$j@D2XIO>Y5Fg1R8 z@O(BB**N+JAr+&f{ESYox{X!=J-d)Jv4EWU(>{ax?f&W$8j8Lt=c^h$erw;`IaNJ6 zjSn?Xw^>UZi6wSV7d|O=!c$X@pF7#&L!+uj;MaI)l;9=>fZ*fjPTcp@WQyQfBAx-- zJUxjb=T#NF^X0q#08Q4g6vp+-xb=Hlns&f@s3QZAAhg$(! z|96AJx1j_#j<$@;{ky3XojbPfrsQSBITOcDpYYAGgTCiPAf6Toi{&WkyI<|>v7l$b z_%89qR*Qh!W-upgQcUr)v(8`m#m5SqCPAPA)51ZINE1to7*mXbnXq(R@kH1QlbLFyL(Mg~iR1F5>PcuM z;x}lxk8=A9xb*-$cshx-2&uw&eo|3TZQ(ga#iF~-a1ASzXb{F_CONyNMcd=JI{C=i z6ODGk47fk~c2BRxeS;>1#TQwGb{E@l=3-lyiBYqkD?=_?3TrSG_<}IEf?oRV+%M;F zJn$-gy>54HD%=o^#hATmE=8aqszemcG%YdczOX(^`u*qoPlZM^XXkxTLIEv0S?5l` z(r8;8>}Ba7tcKwXVD?xuOk$xS=z*_>js~J9lnPnnSI1O^)KXL7^)Mu>M2H6(ft}Js z-O+RLym!SP!~h1uMwrRCH}lA_7be5%PU(@N?JYsM z0libWD8<}3Mgv{psCf!`a0`P0vGGtV1sPJun#7HWJUEI9*}aQl33f%(7l^UNW%bP6 z^8R+36QWM^DY}$Pbx4n&IX-dilz@9f!|#tyDsfnfZDA9li#L{{dRK`x1c(~{;;*lL z^4gF`hB;@YhfIk0=RKV}j|;}}5IP|ePlWCD|7;a%&Qg%ZXm*QhLr)NV_LsBMHDxigR-Kb+N zp;z`6P}~3+fGW5NkB^Kf6;{ZG7Pxju;b}NsqVk^_5kEW=d84(!v6dW=7@cIgWniE8 zKi|zx|Av^+fFB%S2glMa%gx0}0pmij=V240CqGqm>fEWTY@3ntPp6O0er~R*$Q&qT zDWS-Mt{INJ5U{}UVWw%;xtl7Ec;95v0No9FK`^&+-2YS&MIiBjdqZe`KfLXcbH9o$ zDhN|)_&@~Cs z5qE>@0kn!Mg^Famtr`;1$Hrh9ojyk6*=YiWcaI(V@zXQQ2hff_DzH;<+V*-Nj3%_;oZ9De8MS^~&3AoH%>po>k+ozb7#2{#eU&dm<gO8QD`dAGlsx7cFcVP>89BdPjm`u2g~4-b4e`tf^S`S?{%c%V4U>Nc7T zK$91G0lP*{9!n1k2ExWpPH`GWP@YLF8q|62X|Z)(u3ZruAPT_{s0o{|L#!--j3~bf zgPm?WSQ z6sgD}u&$UYB!R(NXr=HMsHp(%uQI%R73oMxFf6=y;FBakr63Y%*N;D#Ob-Y(_akhrAfyk6(aJ@yE(skU7CR} zpSbWdmvr2E*KJW&6O)GVS+;=GNLYum*e2&I4ofs8C1N7vCCOM*nj}NyMJGOngjiiJjYP4z9MC`SKU%L3? znWJl7SjPkwx&Y9oOe^eyX|N6kO8AuF)o=t0$$7zc4G!sJyh=b7xDq?Jk`hI8x-f`f z>RFd1%|}Uvz+DDVujH%eA|4baTACY1J7?aknrieK#B#)L88P;F78{p8SjCPoj%jLo z!>19R0*b==wLPyT6(vQCk7yp&M6^yzdUemM*9dD0&fS+VVgADl8C7OvOz1*}S#+-w zgE*Qjc?Nqe1*-*1H9gfI6lAiYB~cLmNQDNCM=b5D3@Ol&is?>GMp3Vr2qZ^2nT|{o zAEnX8uO?T>j3h>T;dfbG z-P0KvVmC{L0DsBtB1Z0Z0nlLEnH5_%wqz=l!BDxN`jLs*J6~EF% z$hts7TsHz5=(>!l@WRN*SZ)H`^vE%lqpILR$q_l@JsGHQ)>0-*pWnn^g!z=${ zH4Ce2{2W`W4Q#`2La+b0a^T2;LCXi5rzFNqhz-9tB4T``+uiH&jK9Zg{am4?S??8Y2xxP*42D|@T)Vwo##Z&rZcbM z7<75)#eDtaft_FMeC^}c*1WZ*`lXtpr>Bj5eC(iQgKl5c@7C&DZ=Bx~$3wrx{RS-? zJa*N%X-`jI_|n3)Z?Ad%lh=2Bx$Eo02e1;&==3#A69)(VahYOLSk`N)-SIS8VFe6f zHw`T@hCp*38mO~W(-a^UK5nFxn(Och{!8Wypp`sGL?rH7MCC8R0zswbN*JWTi1g)y zf>J%pOjY6vXdwV1BQ3i8BvO-K`Bk|q;=8XJ5<_@{lA%T&B6W|RCC@uDD?*i(7ty}ch!n^($SX{PuoG6kpj+_Le%F`YW4MLMSU z)Ml?VL?k~o+y#dvE_ec>2Rc9_0V)()FQNctEqTx(5Ybggm6V>c2&^frimoB0@RCU> zN;LhIA|yk~SSpyz*E4sKmn3*J)ptZM+y9z6GtA56dsK#*S#Q>vhb2U@i)8VtWuJZb z1$)y(r_8?@6F(uqAUEp#Osdgf04-|yOJa}&qy6BM%PATQ_$elZjY>}tLnVoUEG1%v zN%o>UB$^ta=$GK027%NR9bd^?;UhIvq9DN%K7jA^Nuxo$j?S3hH|!=0r50=2UE$&gwY*eD2${>{A_K-$pWO8Hx5o~`G!#U%VEr3N zzk0lymjdL8#)j1814q7J`{Me+_l`(NwX*RFqwVaL#zKxxt_U%{ln}s*>-5S#0#nHu z4L+TpnraK+1oyPBis2fowND;6NppB zm;<{(8GGSeHKPaA=Fl4iKoZqGtuKg#)D`Pj4IV!N;wb_J5$m!t6FDGGqAVt@EaUUK zKR%=`8)2ZXU&beclk!35w$AGMU>Ok`e$XT8Uu)ZHg|ddb$_o%xg>Jlx2Tx4ZtDc}v zp$H@6YPjpduwe`pR_wr3*4R*kvu-WW6-kZ8aRIhWCx?Nsed)F#chFCH>!Y0qj(kVA z z6~(!cLYN()v3I3qFS+xE^*T=k^Oe)Mp0s5$ zRA%kr;}J_`Cvo@4RFh116`&H=8)in)+z+Y<`A>~ZE$bC_OOl4TH8>y{9Z$4mIZzPV zuIyH$Ps%dswJ)rH_mlTI$(-3<#wE~nbjs+dT_fBLe94IH=qZym1RObY{Qb{%b8aWY zfL(9yPG<^IA(#_{AfB6X1j-0-QZThuN?EUhr$*}F3J$2UyP2%mtJ-Foet9rog%@Ew z7+zmg1O&BWDRZIns`beO&017x{zf9kgBvvsR$UH7S#-kmj8y6B#B~c~{@UTr88?OZ zvWaFJEV2f3M+rS~nlu~&V@s}|Ui`s1l17#WUnrk{B8fZl-1O_Y!ak>)I0WLi9e3h^v6 zpdfTQlIc>(HkdB+wK-t$wl2zAFv&g7DEhNu^Xs5i=e532d0^y;vXVMo0?9=VimJdW zO@8&n^7z5P zwzjHI?kL{j^COH$7JAlhIvYsY2(M79^XlPgNTXZcFiI-CI~FWrzY+&_(U_sFu2yI; zoEYkgVTPB3vKe=xyUOJh9Gl6VCi#7O4jDhP{K5IFH$DCOu5BNE^`HHRzy0aVF$QO7 z$%7Xv$+Z=%aHan{tii{>qPV)xv91pzW z$tMC3jKFgqsJMUDRH9=yupT5xvLbP|&Sj^N9hs6f1TYqKoxKZ${cnsQEF?c6VPtmJ z1O2snxej~lyf&aObx^4PT8n!gQq)k$+IFB$U~in4DEN!MNW@#A{Pk}juWpYGVM><+ zt^=~7#o`>P>7qh+gfZC2=0Q`2IKGb>lc8o#g5u&K&`C@YyJP74h^yW+9E@h<^vuh> zxkvY2g$M(V2VU{y69EWDV4@I_=p8G)VCBVz`n z(9(d&dS!2*ES^%`&~r1Q)WQ1dQ>c?*8@v{-8`brpfyu=;!dvEfMTO2<9XZ^paOX02 zEGp2)Wm*}FOU$xcvy(wexGbmCP;T_L(Z-`Sg_939npL7@CC_6dBvFV+bP^${E@`nr zt|;)OQLW}~$W#pX<(eRav!Qa94k&oKRs*{s1lxdJe+@DKz1zyc3_WqeLsVY}#*;DQGboC<9vpMyV7vcA2{ACse>qg~0ItbiZ(3mhH zE2>{|Xn}y9{tmr$+;xsF;#s|_2k*Zku#81`5+SLmeoks(+x_{B0CZh;SDij`ql{`v zK3oM$+X)$sva3k}X#M6czbmt*AJDMi79BJVPLJ;Iq}v`^Xy)8|Hm3yU!~|qU;dtN` zPd*WVU<4)#5s6MBB*j^*O(LKp@Slt|yCv*uW#GTthO{5< zwOave0%2`rPntksJD2v>XW%u+@y`OspM}nru~F9m=$0X@ovWlGul;kc{Zsg-0J?)q*o-J0b!BUFpsf|B zwae?Dsk|msb+EcV^E-G_pC=tY*OCJrwNjIfTZfWfOMz@M99K_F2cTEa!@qP2?bArM vPpaBLfB(|5*TK)$<3LA6&}>y|A=Y)+w3dw literal 0 HcmV?d00001 From 040b4763595f9ee69b5249918e3d1760d402e242 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Tue, 31 Jan 2017 19:25:15 +0100 Subject: [PATCH 38/44] Manually implement realpath for OS X --- release-tool | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/release-tool b/release-tool index de5c723c9..11fdf501e 100755 --- a/release-tool +++ b/release-tool @@ -244,6 +244,26 @@ checkTransifexCommandExists() { fi } +# re-implement realpath for OS X (thanks mschrag) +# https://superuser.com/questions/205127/how-to-retrieve-the-absolute-path-of-an-arbitrary-file-from-the-os-x +if [ "$(uname -s)" == "Darwin" ]; then + realpath() { + pushd . > /dev/null + if [ -d "$1" ]; then + cd "$1"; dirs -l +0 + else cd "`dirname \"$1\"`" + cur_dir=`dirs -l +0` + + if [ "$cur_dir" == "/" ]; then + echo "$cur_dir`basename \"$1\"`" + else + echo "$cur_dir/`basename \"$1\"`" + fi + fi + popd > /dev/null + } +fi + trap exitTrap SIGINT SIGTERM From e12cd83b80689d78e64e3132f3b69cabcd255f0b Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Wed, 1 Feb 2017 00:53:58 +0100 Subject: [PATCH 39/44] Check for existence of realpath instead of operating system --- release-tool | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release-tool b/release-tool index 11fdf501e..be6bbc7aa 100755 --- a/release-tool +++ b/release-tool @@ -246,7 +246,7 @@ checkTransifexCommandExists() { # re-implement realpath for OS X (thanks mschrag) # https://superuser.com/questions/205127/how-to-retrieve-the-absolute-path-of-an-arbitrary-file-from-the-os-x -if [ "$(uname -s)" == "Darwin" ]; then +if $(command -v realpath > /dev/null); then realpath() { pushd . > /dev/null if [ -d "$1" ]; then From e31638d3dda560a2f08ba73e5669bf254d6c84ca Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Wed, 1 Feb 2017 01:03:30 +0100 Subject: [PATCH 40/44] Fix formatting and coding style --- release-tool | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/release-tool b/release-tool index be6bbc7aa..7bc54cda0 100755 --- a/release-tool +++ b/release-tool @@ -245,19 +245,21 @@ checkTransifexCommandExists() { } # re-implement realpath for OS X (thanks mschrag) -# https://superuser.com/questions/205127/how-to-retrieve-the-absolute-path-of-an-arbitrary-file-from-the-os-x +# https://superuser.com/questions/205127/ if $(command -v realpath > /dev/null); then realpath() { pushd . > /dev/null if [ -d "$1" ]; then - cd "$1"; dirs -l +0 - else cd "`dirname \"$1\"`" - cur_dir=`dirs -l +0` + cd "$1" + dirs -l +0 + else + cd "$(dirname "$1")" + cur_dir=$(dirs -l +0) if [ "$cur_dir" == "/" ]; then - echo "$cur_dir`basename \"$1\"`" + echo "$cur_dir$(basename "$1")" else - echo "$cur_dir/`basename \"$1\"`" + echo "$cur_dir/$(basename "$1")" fi fi popd > /dev/null From 75eb0c69519a3e52c65cd0537856e783defee6e1 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Mon, 6 Feb 2017 20:23:51 +0100 Subject: [PATCH 41/44] Properly HTML-escape strings with user-defined contents in message boxes (#247) * Properly HTML-escape strings with user-defined contents in message boxes, resolves #236 * Also escape group names in EditWidget title --- src/gui/DatabaseTabWidget.cpp | 4 ++-- src/gui/DatabaseWidget.cpp | 6 +++--- src/gui/entry/EditEntryWidget.cpp | 7 ++++--- src/http/Service.cpp | 3 ++- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index af6907001..fed4535bb 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -246,7 +246,7 @@ bool DatabaseTabWidget::closeDatabase(Database* db) QMessageBox::StandardButton result = MessageBox::question( this, tr("Close?"), - tr("\"%1\" is in edit mode.\nDiscard changes and close anyway?").arg(dbName), + tr("\"%1\" is in edit mode.\nDiscard changes and close anyway?").arg(dbName.toHtmlEscaped()), QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Cancel); if (result == QMessageBox::Cancel) { return false; @@ -262,7 +262,7 @@ bool DatabaseTabWidget::closeDatabase(Database* db) QMessageBox::StandardButton result = MessageBox::question( this, tr("Save changes?"), - tr("\"%1\" was modified.\nSave changes?").arg(dbName), + tr("\"%1\" was modified.\nSave changes?").arg(dbName.toHtmlEscaped()), QMessageBox::Yes | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Yes); if (result == QMessageBox::Yes) { if (!saveDatabase(db)) { diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 985374c49..00bf1168a 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -341,7 +341,7 @@ void DatabaseWidget::deleteEntries() result = MessageBox::question( this, tr("Delete entry?"), tr("Do you really want to delete the entry \"%1\" for good?") - .arg(selectedEntries.first()->title()), + .arg(selectedEntries.first()->title().toHtmlEscaped()), QMessageBox::Yes | QMessageBox::No); } else { @@ -365,7 +365,7 @@ void DatabaseWidget::deleteEntries() result = MessageBox::question( this, tr("Move entry to recycle bin?"), tr("Do you really want to move entry \"%1\" to the recycle bin?") - .arg(selectedEntries.first()->title()), + .arg(selectedEntries.first()->title().toHtmlEscaped()), QMessageBox::Yes | QMessageBox::No); } else { @@ -532,7 +532,7 @@ void DatabaseWidget::deleteGroup() QMessageBox::StandardButton result = MessageBox::question( this, tr("Delete group?"), tr("Do you really want to delete the group \"%1\" for good?") - .arg(currentGroup->name()), + .arg(currentGroup->name().toHtmlEscaped()), QMessageBox::Yes | QMessageBox::No); if (result == QMessageBox::Yes) { delete currentGroup; diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index d9ba5bd83..f9b104912 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -271,14 +271,15 @@ void EditEntryWidget::loadEntry(Entry* entry, bool create, bool history, const Q m_history = history; if (history) { - setHeadline(QString("%1 > %2").arg(parentName, tr("Entry history"))); + setHeadline(QString("%1 > %2").arg(parentName.toHtmlEscaped(), tr("Entry history"))); } else { if (create) { - setHeadline(QString("%1 > %2").arg(parentName, tr("Add entry"))); + setHeadline(QString("%1 > %2").arg(parentName.toHtmlEscaped(), tr("Add entry"))); } else { - setHeadline(QString("%1 > %2 > %3").arg(parentName, entry->title(), tr("Edit entry"))); + setHeadline(QString("%1 > %2 > %3").arg(parentName.toHtmlEscaped(), + entry->title().toHtmlEscaped(), tr("Edit entry"))); } } diff --git a/src/http/Service.cpp b/src/http/Service.cpp index ceec292d6..0ac0fd836 100644 --- a/src/http/Service.cpp +++ b/src/http/Service.cpp @@ -480,7 +480,8 @@ void Service::updateEntry(const QString &, const QString &uuid, const QString &l //ShowNotification(QString("%0: You have an entry change prompt waiting, click to activate").arg(requestId)); if ( HttpSettings::alwaysAllowUpdate() || QMessageBox::warning(0, tr("KeePassXC: Update Entry"), - tr("Do you want to update the information in %1 - %2?").arg(QUrl(url).host()).arg(u), + tr("Do you want to update the information in %1 - %2?") + .arg(QUrl(url).host().toHtmlEscaped()).arg(u.toHtmlEscaped()), QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes ) { entry->beginUpdate(); entry->setUsername(login); From f7e9f856687a80ca9517aabf375201d22d1f3014 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Mon, 6 Feb 2017 19:52:21 +0100 Subject: [PATCH 42/44] Install Qt 5.8 inside Docker container --- AppImage-Recipe.sh | 16 +++++++++++++--- Dockerfile | 22 ++++++++++++++++++---- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/AppImage-Recipe.sh b/AppImage-Recipe.sh index 2ed3ae93b..dc30cb696 100755 --- a/AppImage-Recipe.sh +++ b/AppImage-Recipe.sh @@ -39,19 +39,27 @@ mkdir -p $APP.AppDir wget -q https://github.com/probonopd/AppImages/raw/master/functions.sh -O ./functions.sh . ./functions.sh +LIB_DIR=./usr/lib +if [ -d ./usr/lib/x86_64-linux-gnu ]; then + LIB_DIR=./usr/lib/x86_64-linux-gnu +fi + cd $APP.AppDir cp -a ../../bin-release/* . cp -a ./usr/local/* ./usr rm -R ./usr/local +rmdir ./opt 2> /dev/null patch_strings_in_file /usr/local ././ patch_strings_in_file /usr ./ # bundle Qt platform plugins and themes QXCB_PLUGIN="$(find /usr/lib -name 'libqxcb.so' 2> /dev/null)" +if [ "$QXCB_PLUGIN" == "" ]; then + QXCB_PLUGIN="$(find /opt/qt*/plugins -name 'libqxcb.so' 2> /dev/null)" +fi QT_PLUGIN_PATH="$(dirname $(dirname $QXCB_PLUGIN))" -mkdir -p "./${QT_PLUGIN_PATH}/platforms" -cp "$QXCB_PLUGIN" "./${QT_PLUGIN_PATH}/platforms/" -cp -a "${QT_PLUGIN_PATH}/platformthemes" "./${QT_PLUGIN_PATH}" +mkdir -p ".${QT_PLUGIN_PATH}/platforms" +cp "$QXCB_PLUGIN" ".${QT_PLUGIN_PATH}/platforms/" get_apprun copy_deps @@ -66,6 +74,8 @@ get_icon cat << EOF > ./usr/bin/keepassxc_env #!/usr/bin/env bash #export QT_QPA_PLATFORMTHEME=gtk2 +export LD_LIBRARY_PATH="../opt/qt58/lib:\${LD_LIBRARY_PATH}" +export QT_PLUGIN_PATH="..${QT_PLUGIN_PATH}" exec keepassxc "\$@" EOF chmod +x ./usr/bin/keepassxc_env diff --git a/Dockerfile b/Dockerfile index 422e4da84..9623b60dd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,17 +16,23 @@ FROM ubuntu:14.04 +RUN set -x \ + && apt-get update \ + && apt-get install --yes software-properties-common + +RUN set -x \ + && add-apt-repository --yes ppa:beineri/opt-qt58-trusty + RUN set -x \ && apt-get update \ && apt-get install --yes \ g++ \ cmake \ libgcrypt20-dev \ - qtbase5-dev \ - qttools5-dev \ - qttools5-dev-tools \ + qt58base \ + qt58tools \ + qt58x11extras \ libmicrohttpd-dev \ - libqt5x11extras5-dev \ libxi-dev \ libxtst-dev \ zlib1g-dev \ @@ -34,7 +40,15 @@ RUN set -x \ file \ fuse \ python + +RUN set -x \ + && apt-get install --yes mesa-common-dev VOLUME /keepassxc/src VOLUME /keepassxc/out WORKDIR /keepassxc + +ENV CMAKE_PREFIX_PATH=/opt/qt58/lib/cmake +ENV LD_LIBRARY_PATH=/opt/qt58/lib +RUN set -x \ + && echo /opt/qt58/lib > /etc/ld.so.conf.d/qt58.conf From db75d9496129a22ccc1bd6addd57cd4354942df3 Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Mon, 6 Feb 2017 18:43:11 -0500 Subject: [PATCH 43/44] Added release version and changelist --- CHANGELOG | 10 ++++++++++ CMakeLists.txt | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 9051703cb..24ed5ea73 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,13 @@ +2.1.1 (2017-02-06) +========================= + +- Enabled HTTP plugin build; plugin is disabled by default and limited to localhost [#147] +- Escape HTML in dialog boxes [#247] +- Corrected crashes in favicon download and password generator [#233, #226] +- Increase font size of password meter [#228] +- Fixed compatibility with Qt 5.8 [#211] +- Use consistent button heights in password generator [#229] + 2.1.0 (2017-01-22) ========================= diff --git a/CMakeLists.txt b/CMakeLists.txt index 2fd890e01..3b5df29b1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,8 +38,8 @@ option(WITH_XC_AUTOTYPE "Include Autotype." OFF) option(WITH_XC_HTTP "Include KeePassHTTP." OFF) option(WITH_XC_YUBIKEY "Include Yubikey support." OFF) -set(KEEPASSXC_VERSION "2.1.0") -set(KEEPASSXC_VERSION_NUM "2.1.0") +set(KEEPASSXC_VERSION "2.1.1") +set(KEEPASSXC_VERSION_NUM "2.1.1") if("${CMAKE_C_COMPILER}" MATCHES "clang$" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") set(CMAKE_COMPILER_IS_CLANG 1) From 8fc11c079109d30aa8be67385d69cd15d19bfe1f Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Tue, 7 Feb 2017 00:49:32 +0100 Subject: [PATCH 44/44] Update translations --- share/translations/keepassx_cs.ts | 884 +++++++++++++++++++-------- share/translations/keepassx_de.ts | 878 ++++++++++++++++++-------- share/translations/keepassx_en.ts | 185 ++++-- share/translations/keepassx_lt.ts | 879 ++++++++++++++++++-------- share/translations/keepassx_pt_BR.ts | 880 ++++++++++++++++++-------- share/translations/keepassx_ru.ts | 882 ++++++++++++++++++-------- 6 files changed, 3331 insertions(+), 1257 deletions(-) diff --git a/share/translations/keepassx_cs.ts b/share/translations/keepassx_cs.ts index 3a85ff723..b0e4ca8f9 100644 --- a/share/translations/keepassx_cs.ts +++ b/share/translations/keepassx_cs.ts @@ -1,14 +1,6 @@ - + AboutDialog - - About KeePassX - O KeePassX - - - KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3. - KeePassX je šířeno za podmínek licence GNU General Public License (GPL) verze 2 a (případně) 3. - Revision Revize @@ -17,17 +9,56 @@ Using: S použitím: + + About KeePassXC + O aplikaci KeePassXC + + + KeePassXC is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3. + KeePassXC je šířeno pod GNU obecnou veřejnou licencí (GPL) verze 2 a (případně) 3. + + + Extensions: + + Rozšíření: + + + + + AccessControlDialog + + Remember this decision + Zapamatovat si toto rozhodnutí + + + Allow + Povolit + + + Deny + Zamítnout + + + %1 has requested access to passwords for the following item(s). +Please select whether you want to allow access. + %1 si vyžádalo přístup k heslům u následujících položek. +Umožnit přístup? () + + + KeePassXC HTTP Confirm Access + Potvrzení přístupu KeePassXC HTTP + AutoType - - Auto-Type - KeePassX - Automatické vyplňování – KeePassX - Couldn't find an entry that matches the window title: Nedaří se nalézt položku, která by se shodovala s titulkem okna: + + Auto-Type - KeePassXC + Automatické vyplňování – KeePassXC + AutoTypeAssociationsModel @@ -46,14 +77,14 @@ AutoTypeSelectDialog - - Auto-Type - KeePassX - Automatické vyplňování – KeePassX - Select entry to Auto-Type: Vyberte položku, kterou se bude automaticky vyplňovat: + + Auto-Type - KeePassXC + Automatické vyplňování – KeePassXC + ChangeMasterKeyWidget @@ -319,16 +350,6 @@ Uložit změny? locked zamčeno - - The database you are trying to open is locked by another instance of KeePassX. -Do you want to open it anyway? Alternatively the database is opened read-only. - Pro databázi, kterou se pokoušíte otevřít, existuje zámek úprav (stejnojmenný -.lock soubor). To znamená, že je nejspíš už otevřená v jiném okně KeePassX -(v případě sdíleného úložiště, třeba i na jiném počítači). Pokud tomu tak není, -je zámek nejspíš pozůstatkem předchozího neočekávaného ukončení aplikace -a je možné ho smazat. V každém případě, dotčenou databázi je možné otevřít - i tak, ale pouze pro čtení. Chcete? - Lock database Uzamknout databázi @@ -372,14 +393,24 @@ Přesto zavřít a zahodit změny? Zápis do CSV souboru se nezdařil. - The database you are trying to save as is locked by another instance of KeePassX. -Do you want to save it anyway? - Databáze, kterou se pokoušíte uložit, je uzamčena jinou instancí KeePassX. -Přesto uložit? + Unable to open the database. + Nepodařilo se otevřít databázi. - Unable to open the database. - + The database you are trying to open is locked by another instance of KeePassXC. +Do you want to open it anyway? Alternatively the database is opened read-only. + Databáze kterou se pokoušíte otevřít je právě používaná jinou instancí KeePassXC. +Chcete ji přesto otevřít? Případně je možné databázi otevřít pouze pro čtení. + + + Merge database + Sloučit databáze + + + The database you are trying to save as is locked by another instance of KeePassXC. +Do you want to save it anyway? + Databáze kterou se pokoušíte uložit je právě používaná jinou instancí KeePassXC. +Chcete ji přesto uložit? @@ -420,10 +451,6 @@ Přesto uložit? Do you really want to delete the group "%1" for good? Opravdu chcete nenávratně smazat skupinu „%1“? - - Current group - Stávající skupina - Error Chyba @@ -434,11 +461,71 @@ Přesto uložit? Move entry to recycle bin? - + Přesunout položku do koše? Do you really want to move entry "%1" to the recycle bin? - + Opravdu si přejete přesunout položku "%1" do koše? + + + Searching... + Hledání… + + + No current database. + Aktuálně žádná databáze. + + + No source database, nothing to do. + Není zvolena zdrojová databáze, není co dělat. + + + Search Results (%1) + Výsledky vyhledávání (%1) + + + No Results + Žádné výsledky + + + Execute command? + Spustit příkaz? + + + Do you really want to execute the following command?<br><br>%1<br> + Opravdu chcete spustit následující příkaz?<br><br>%1<br> + + + Remember my choice + Zapamatovat si pro příště + + + Autoreload Request + Požadavek na automatické opětovné načtení + + + The database file has changed. Do you want to load the changes? + Soubor s databází byl změněn. Přejete si načíst změny? + + + Merge Request + Požadavek na sloučení + + + The database file has changed and you have unsaved changes.Do you want to merge your changes? + Soubor s databází byl mezitím změněn a vaše změny nejsou uložené. Přejete si vaše změny sloučit? + + + Autoreload Failed + Automatické opětovné načtení se nezdařilo + + + Could not parse or unlock the new database file while attempting to autoreload this database. + Nepodařilo se zpracovat nebo odemknout nový soubor s databází během pokusu o její opětovné načtení. + + + Could not open the new database file while attempting to autoreload this database. + Nepodařilo se otevřít nový soubor s databází během pokusu o její opětovné načtení. @@ -629,10 +716,6 @@ Přesto uložit? Repeat: Zopakování hesla: - - Gen. - Tvoř - URL: URL adresa: @@ -750,17 +833,25 @@ Přesto uložit? Can't delete icon! Ikonu nelze smazat! - - Can't delete icon. Still used by %n item(s). - Ikonu není možné smazat. Je používána %n položkou.Ikonu není možné smazat. Je používána %n položkami.Ikonu není možné smazat. Ještě jí používá %n položek. - Error - + Chyba - Can't read icon: - + Download favicon + Stáhnout favicon + + + Unable to fetch favicon. + Favicon se nepodařilo stáhnout. + + + Can't read icon + Nepodařilo se načíst ikonu + + + Can't delete icon. Still used by %1 items. + Ikonu nelze smazat. Ještě ji používá %1 položek. @@ -782,6 +873,13 @@ Přesto uložit? Univerzálně jedinečný identifikátor: + + Entry + + - Clone + - Klon + + EntryAttributesModel @@ -834,6 +932,61 @@ Přesto uložit? Koš + + HttpPasswordGeneratorWidget + + Length: + Délka: + + + Character Types + Typy znaků + + + Upper Case Letters + Velká písmena + + + A-Z + A-Z + + + Lower Case Letters + Malá písmena + + + a-z + a-z + + + Numbers + Čísla + + + 0-9 + 0-9 + + + Special Characters + Zvláštní znaky + + + /*_& ... + /*_& ... + + + Exclude look-alike characters + Vyloučit podobné znaky + + + Ensure that the password contains characters from every group + Heslo musí obsahovat znak z každé skupiny + + + Accept + Přijmout + + KeePass1OpenWidget @@ -877,7 +1030,7 @@ Přesto uložit? Wrong key or database file is corrupt. - + Byl zadán chybný klíč, nebo je poškozen databázový soubor. @@ -916,8 +1069,8 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev Při ověřování šifrovacích funkcí byl zjištěn fatální nedostatek. - KeePassX - Error - KeePassX – chyba + KeePassXC - Error + KeePassXC – chyba @@ -926,102 +1079,14 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev Database Databáze - - Recent databases - Nedávno otevřené databáze - - - Help - Nápověda - - - Entries - Položky - - - Copy attribute to clipboard - Zkopírovat atribut do schránky - - - Groups - Skupiny - - - View - Zobrazit - - - Quit - Ukončit aplikaci - - - About - O aplikaci - Open database Otevřít databázi - - Save database - Uložit databázi - - - Close database - Zavřít databázi - - - New database - Nová databáze - - - Add new entry - Přidat novou položku - - - View/Edit entry - Zobrazit/upravit položku - - - Delete entry - Smazat položku - - - Add new group - Přidat novou skupinu - - - Edit group - Upravit skupinu - - - Delete group - Smazat skupinu - - - Save database as - Uložit databázi jako - - - Change master key - Změnit hlavní klíč - Database settings Nastavení databáze - - Import KeePass 1 database - Importovat databázi aplikace KeePass verze 1 - - - Clone entry - Klonovat položku - - - Find - Najít - Copy username to clipboard Zkopírovat uživatelské jméno do schránky @@ -1034,30 +1099,6 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev Settings Nastavení - - Perform Auto-Type - Provést automatické vyplnění - - - Open URL - Otevřít URL adresu - - - Lock databases - Uzamknout databáze - - - Title - Titulek - - - URL - URL adresa - - - Notes - Poznámky - Show toolbar Zobrazit lištu nástrojů @@ -1074,22 +1115,6 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev Tools Nástroje - - Copy username - Zkopírovat uživatelské jméno - - - Copy password - Zkopírovat heslo - - - Export to CSV file - Exportovat do CSV souboru - - - Repair database - Opravit databázi - KeePass 2 Database Databáze ve formátu KeePass 2 @@ -1110,6 +1135,265 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev Writing the database failed. Zápis do databáze se nezdařil. + + &Recent databases + Nedávno otevřené databáze + + + He&lp + Nápověda + + + E&ntries + Položky + + + Copy att&ribute to clipboard + Zkopí&rovat atribut do schránky + + + &Groups + Skupniny + + + &View + Zobrazit + + + &Quit + Ukončit + + + &About + O &aplikaci + + + &Open database + &Otevřít databázi + + + &Save database + Uložit databázi + + + &Close database + Zavřít databázi + + + &New database + &Nová databáze + + + Merge from KeePassX database + Sloučit s databází KeePassX + + + &Add new entry + Přid&at novou položku + + + &View/Edit entry + Zobrazit/Upra&vit položku + + + &Delete entry + Smazat položku + + + &Add new group + Přid&at novou skupinu + + + &Edit group + Upravit skupinu + + + &Delete group + Smazat skupinu + + + Sa&ve database as + Uložit databázi jako + + + Change &master key + Z&měnit hlavní klíč + + + &Database settings + Nastavení &databáze + + + &Import KeePass 1 database + &Importovat databázi ve formátu KeePass 1 + + + &Clone entry + Klonovat položku + + + &Find + Najít + + + Copy &username + Zkopírovat &uživatelské jméno + + + Cop&y password + Zkopírovat heslo + + + &Settings + Na&stavení + + + &Perform Auto-Type + &Provést automatické vyplnění + + + &Open URL + &Otevřít URL adresu + + + &Lock databases + Uzamknout databázi + + + &Title + Nadpis + + + &URL + &URL adresa + + + &Notes + Poz&námky + + + &Export to CSV file + &Exportovat do CSV souboru + + + Re&pair database + O&pravit databázi + + + Password Generator + Generátor hesel + + + + OptionDialog + + Dialog + Dialog + + + General + Obecné + + + Sh&ow a notification when credentials are requested + Z&obrazit oznámení když jsou požadovány přihlašovací údaje + + + &Return only best matching entries for an URL instead +of all entries for the whole domain + V%rátit pouze položky, které nejlépe odpovídají dané +URL adrese namísto položek pro celou doménu + + + &Match URL schemes +Only entries with the same scheme (http://, https://, ftp://, ...) are returned + &Odpovídající schémata URL adres +Jsou vráceny pouze položky se stejným schématem (http://, https://, ftp://, atp.) + + + Sort matching entries by &username + Seřadit odpovídající položky dle &uživatelského jména + + + R&emove all shared encryption-keys from active database + Z právě otevřené databáze od&ebrat veškeré sdílené šifrovací klíče + + + Re&move all stored permissions from entries in active database + Z právě otevřené databáze odebrat veškerá uložená oprávnění + + + Password generator + Generátor hesel + + + Advanced + Pokročilé + + + Activate the following only, if you know what you are doing! + Následující zapněte pouze pokud víte, co děláte! + + + Always allow &access to entries + Vždy umožnit přístup k veškerým položkám + + + Always allow &updating entries + Vždy umožnit akt&ualizovat položky + + + Searc&h in all opened databases for matching entries + Vy&hledat odpovídající položky ve všech otevřených databázích + + + Only the selected database has to be connected with a client! + Je třeba, aby ke klientovi byly připojené pouze vybrané databáze! + + + &Return also advanced string fields which start with "KPH: " + V&rátit také pokročilé textové řetězce které začínají na „KPH:“ + + + Automatic creates or updates are not supported for string fields! + Automatická vytváření nebo aktualizace nejsou u textových kolonek podporované! + + + HTTP Port: + HTTP port: + + + Default port: 19455 + Výchozí port: 19455 + + + Re&quest to unlock the database if it is locked + Vyžádat odemknutí zamčené databáze + + + Sort &matching entries by title + Seřadit odpovídající položky dle názvu + + + Enable KeepassXC HTTP protocol +This is required for accessing your databases from ChromeIPass or PassIFox + Zapnout protokol KeePassXC HTTP +Toto je zapotřebí pro přístup do databáze z ChromeIPass nebo PassIFox + + + KeePassXC will listen to this port on 127.0.0.1 + Na tomto portu bude KeePassXC očekávat spojení na adrese 127.0.0.1 + + + Cannot bind to privileged ports + S oprávněními uživatele není možné navázat na porty, pro které je třeba oprávnění správce systému + + + Cannot bind to privileged ports below 1024! +Using default port 19455. + Není možné navázat na porty s číslem nižším, než 1024! +Náhradně bude použit port 19455. + PasswordGeneratorWidget @@ -1117,10 +1401,6 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev Password: Heslo: - - Length: - Délka: - Character Types Typy znaků @@ -1145,71 +1425,72 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev Exclude look-alike characters Vynechat podobně vypadající znaky (předejití záměně) - - Ensure that the password contains characters from every group - Zajistit, aby heslo obsahovalo znaky ze všech zvolených skupin znaků - Accept Přijmout - - - QCommandLineParser - Displays version information. - Zobrazí informace o verzi. + %p% + %p% - Displays this help. - Zobrazí tuto nápovědu. + strength + odolnost - Unknown option '%1'. - Neznámá předvolba %1. + entropy + náhodnost - Unknown options: %1. - Neznámé předvolby: %1. + &Length: + Dé&lka: - Missing value after '%1'. - Chybějící hodnota, následující za %1. + Pick characters from every group + Použít znaky ze všech skupin - Unexpected value after '%1'. - Neočekávaná hodnota, následující za %1. + Generate + Vytvořit - [options] - [předvolby] + Close + Zavřít - Usage: %1 - Použití: %1 + Apply + Použít - Options: - Předvolby: + Entropy: %1 bit + Náhodnost: %1 bit - Arguments: - Argumenty: + Password Quality: %1 + Odolnost hesla: %1 + + + Poor + Velmi nízká + + + Weak + Slabá + + + Good + Dobrá + + + Excellent + Skvělá - QSaveFile + QObject - Existing file %1 is not writable - Do stávajícího souboru %1 nelze zapisovat - - - Writing canceled by application - Zápis byl zrušen aplikací - - - Partial write. Partition full? - Zápis nebylo možné zcela dokončit. Nedostatek volného místa? + Http + Http @@ -1249,20 +1530,111 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev SearchWidget - Find: - Najít: + Case Sensitive + Rozlišovat velikost písmen - Case sensitive - Rozlišovat malá/velká písmena + Search + Hledat - Current group - Stávající skupina + Find + Najít - Root group - Kořenová skupina + Clear + Vyčistit + + + + Service + + A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it? + Už existuje sdílený šifrovací klíč s názvem „%1“. +Přejete si ho přepsat? + + + Do you want to update the information in %1 - %2? + Přejete si aktualizovat informaci v %1 – %2? + + + The active database is locked! +Please unlock the selected database or choose another one which is unlocked. + Právě otevřená databáze je uzamčená! +Buď jí odemkněte, nebo vyberte jinou, odemčenou. + + + Successfully removed %1 encryption-%2 from KeePassX/Http Settings. + Z nastavení KeePassX/Http bylo úspěšně odebráno %1 šifrování-%2. + + + No shared encryption-keys found in KeePassHttp Settings. + V nastavení KeePassHttp nebyly nalezeny žádné sdílené šifrovací klíče. + + + The active database does not contain an entry of KeePassHttp Settings. + Právě otevřená databáze neobsahuje žádnou položku nastavení KeePassHttp. + + + Removing stored permissions... + Odstraňuji uložená oprávnění... + + + Abort + Přerušit + + + Successfully removed permissions from %1 %2. + Oprávnění %1 %2 úspěšně odebrána. + + + The active database does not contain an entry with permissions. + Právě otevřená databáze neobsahuje položku s oprávněními. + + + KeePassXC: New key association request + KeePassXC: nový požadavek na přiřazení klíče + + + You have received an association request for the above key. +If you would like to allow it access to your KeePassXC database +give it a unique name to identify and accept it. + Pokud jste obdrželi požadavek na přiřazení pro výše uvedený klíč. +Pokud chcete umožnit přístup do KeePassXC databáze, dejte jí +jedinečný název pro její identifikaci a potvrďte ho. + + + KeePassXC: Overwrite existing key? + KeePassXC: Přepsat stávající klíč? + + + KeePassXC: Update Entry + KeePassXC: Aktualizovat položku + + + KeePassXC: Database locked! + KeePassXC: Databáze uzamčena! + + + KeePassXC: Removed keys from database + KeePassXC: Odebrány klíče z databáze + + + KeePassXC: No keys found + KeePassXC: Klíče nebyly nalezeny + + + KeePassXC: Settings not available! + KeePassXC: Nastavení nejsou k dispozici! + + + KeePassXC: Removed permissions + KeePassXC: Odebraná oprávnění + + + KeePassXC: No entry with permissions found! + KeePassXC: Nebyla nalezena položka s oprávněními! @@ -1286,10 +1658,6 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev Remember last databases Pamatovat si nedávno otevřené databáze - - Open previous databases on startup - Při spuštění aplikace otevřít minule otevřené databáze - Automatically save on exit Před ukončením aplikace automaticky uložit případné změny @@ -1300,7 +1668,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev Minimize when copying to clipboard - Po zkopírování údaje do schránky automaticky minimalizovat okno KeePassX (do popředí se tak dostane okno, do kterého se zkopírovaný údaj bude vkládat) + Po zkopírování údaje do schránky automaticky minimalizovat Use group icon on entry creation @@ -1331,12 +1699,20 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev Pamatovat si nedávno otevřené soubory s klíči - Hide window to system tray instead of App Exit - + Load previous databases on startup + Při spuštění aplikace načíst minule otevřené databáze - Hide window to system tray on App start - + Automatically reload the database when modified externally + V okamžiku zásahu do databáze zvenčí ji načíst znovu + + + Hide window to system tray instead of app exit + Namísto zavření minimalizovat okno aplikace do oznamovací oblasti systémového panelu + + + Minimize window at application startup + Spouštět aplikaci s minimalizovaným oknem @@ -1361,6 +1737,14 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev Always ask before performing auto-type Před provedením automatického vyplnění se vždy dotázat + + Lock databases after minimizing the window + Při minimalizaci okna uzamknout databáze + + + Don't require password repeat when it is visible + Pokud jsou zobrazená, nevyžadovat zopakování hesel + UnlockDatabaseWidget @@ -1378,14 +1762,6 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev main - - KeePassX - cross-platform password manager - KeePassX – správce hesel, fungující napříč rozličnými operačními systémy - - - filename of the password database to open (*.kdbx) - který soubor s databází hesel (*.kdbx) otevřít - path to a custom config file umístění souboru s vlastními nastaveními @@ -1394,5 +1770,17 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev key file of the database soubor s klíčem k databázi + + filename(s) of the password database(s) to open (*.kdbx) + názvy databází s hesly (*.kdbx) které otevřít ()() + + + KeePassXC - cross-platform password manager + KeePassXC – aplikace pro správu hesel, fungující na vícero operačních systémech + + + read password of the database from stdin + načíst heslo k databázi ze standardního vstupu + \ No newline at end of file diff --git a/share/translations/keepassx_de.ts b/share/translations/keepassx_de.ts index 2742de484..20bd5daeb 100644 --- a/share/translations/keepassx_de.ts +++ b/share/translations/keepassx_de.ts @@ -1,14 +1,6 @@ - + AboutDialog - - About KeePassX - Über KeePassX - - - KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3. - KeePassX steht unter der GNU General Public License (GPL) version 2 (version 3). - Revision Überarbeitung @@ -17,17 +9,56 @@ Using: In Benutzung: + + About KeePassXC + Über KeePassXC + + + KeePassXC is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3. + KeePassXC steht unter der GNU General Public License (GPL) version 2 (version 3). + + + Extensions: + + Erweiterungen: + + + + + AccessControlDialog + + Remember this decision + Diese Entscheidung merken + + + Allow + Erlauben + + + Deny + Ablehnen + + + %1 has requested access to passwords for the following item(s). +Please select whether you want to allow access. + %1 hat Zugriff auf Passwörter für folgende Element(e) angefordert. +Bitte wählen Sie, ob Sie den Zugriff erlauben möchten. + + + KeePassXC HTTP Confirm Access + KeePassXC HTTP Erlaube Zugriff + AutoType - - Auto-Type - KeePassX - Auto-Type - KeePassX - Couldn't find an entry that matches the window title: Konnte keinen Eintrag finden, welcher mit dem Fenstertitel übereinstimmt: + + Auto-Type - KeePassXC + Auto-Type - KeePassXC + AutoTypeAssociationsModel @@ -46,14 +77,14 @@ AutoTypeSelectDialog - - Auto-Type - KeePassX - Auto-Type - KeePassX - Select entry to Auto-Type: Wählen Sie einen Eintrag für Auto-Type: + + Auto-Type - KeePassXC + Auto-Type - KeePassXC + ChangeMasterKeyWidget @@ -318,11 +349,6 @@ Save changes? locked gesperrt - - The database you are trying to open is locked by another instance of KeePassX. -Do you want to open it anyway? Alternatively the database is opened read-only. - Die Datenbank, die geöffnet werden soll, ist aktuell von einer anderen Instanz von KeePassX blockiert. Soll sie dennoch geöffnet werden? Andererseits wird die Datenbank schreibgeschützt geöffnet. - Lock database Datenbank sperren @@ -366,14 +392,24 @@ Discard changes and close anyway? Die CSV Datei konnte nicht gespeichert werden. - The database you are trying to save as is locked by another instance of KeePassX. -Do you want to save it anyway? - Die Datenbank, die gespeichert werden soll, ist von einer anderen Instanz von KeePassX blockiert. -Soll sie dennoch gespeichert werden? + Unable to open the database. + Öffnen der Datenbank ist nicht möglich. - Unable to open the database. - + The database you are trying to open is locked by another instance of KeePassXC. +Do you want to open it anyway? Alternatively the database is opened read-only. + Die Datenbank, die geöffnet werden soll, ist aktuell von einer anderen Instanz von KeePassXC blockiert. +Soll sie dennoch geöffnet werden? Alternativ wird die Datenbank schreibgeschützt geöffnet. + + + Merge database + Datenbank zusammenführen + + + The database you are trying to save as is locked by another instance of KeePassXC. +Do you want to save it anyway? + Die Datenbank, die gespeichert werden soll, ist von einer anderen Instanz von KeePassXC blockiert. +Soll sie dennoch gespeichert werden? @@ -414,10 +450,6 @@ Soll sie dennoch gespeichert werden? Do you really want to delete the group "%1" for good? Wollen Sie die Gruppe "%1" wirklich löschen? - - Current group - Aktuelle Gruppe - Error Fehler @@ -428,11 +460,71 @@ Soll sie dennoch gespeichert werden? Move entry to recycle bin? - + Eintrag in den Papierkorb verschieben? Do you really want to move entry "%1" to the recycle bin? - + Möchten Sie wirklich Eintrag "%1" in den Papierkorb verschieben? + + + Searching... + Am suchen... + + + No current database. + Keine aktuelle Datenbank + + + No source database, nothing to do. + Keine Quelldatenbank, es gibt nichts zu tun. + + + Search Results (%1) + Suchergebnisse (%1) + + + No Results + Keine Ergebnisse + + + Execute command? + Befehl ausführen? + + + Do you really want to execute the following command?<br><br>%1<br> + Den folgenden Befehl wirklich ausführen?<br><br>%1<br> + + + Remember my choice + Meine Auswahl merken + + + Autoreload Request + Autoreload Anfrage + + + The database file has changed. Do you want to load the changes? + Die Datenbank wurde verändert. Möchten Sie die Änderungen laden? + + + Merge Request + Zusammenführ-Anfrage + + + The database file has changed and you have unsaved changes.Do you want to merge your changes? + Die Datenbank wurde verändert und Sie haben ungespeicherte Änderungen. Möchten Sie Ihre Änderungen zusammenfügen? + + + Autoreload Failed + Autoreload fehlgeschlagen + + + Could not parse or unlock the new database file while attempting to autoreload this database. + Kann Datenbank nicht durchsuchen oder entsperren während dem Autoreload-Versuch dieser Datenbank. + + + Could not open the new database file while attempting to autoreload this database. + Kann die Datenbank nicht öffnen während dem Versuch, diese Datenbank automatisch neu zu laden. @@ -622,10 +714,6 @@ Soll sie dennoch gespeichert werden? Repeat: Wiederholen: - - Gen. - Gen. - URL: URL: @@ -743,17 +831,25 @@ Soll sie dennoch gespeichert werden? Can't delete icon! Symbol kann nicht gelöscht werden! - - Can't delete icon. Still used by %n item(s). - Symbol kann nicht gelöscht werden. Es wird von %n Eintrag verwendet.Symbol kann nicht gelöscht werden. Es wird von %n Einträgen verwendet. - Error - + Fehler - Can't read icon: - + Download favicon + Favicon herunterladen + + + Unable to fetch favicon. + Abrufen des Favicons nicht möglich + + + Can't read icon + Icon kann nicht gelesen werden + + + Can't delete icon. Still used by %1 items. + Symbol kann nicht gelöscht werden. Es wird noch von %1 Einträgen verwendet. @@ -775,6 +871,13 @@ Soll sie dennoch gespeichert werden? Uuid: + + Entry + + - Clone + - Klone + + EntryAttributesModel @@ -827,6 +930,61 @@ Soll sie dennoch gespeichert werden? Papierkorb + + HttpPasswordGeneratorWidget + + Length: + Länge: + + + Character Types + Zeichenarten + + + Upper Case Letters + Großbuchstaben + + + A-Z + A-Z + + + Lower Case Letters + Kleinbuchstaben + + + a-z + a-z + + + Numbers + Zahlen + + + 0-9 + 0-9 + + + Special Characters + Sonderzeichen + + + /*_& ... + /*_& ... + + + Exclude look-alike characters + Gleich aussehende Zeichen ausschließen + + + Ensure that the password contains characters from every group + Sicherstellen, dass das Passwort Zeichen aus allen Gruppen enthält. + + + Accept + Akzeptieren + + KeePass1OpenWidget @@ -870,7 +1028,7 @@ Soll sie dennoch gespeichert werden? Wrong key or database file is corrupt. - + Falscher Schlüssel oder die Datenbank ist beschädigt. @@ -909,8 +1067,8 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann Fataler Fehler beim Testen der kryptografischen Funktionen. - KeePassX - Error - KeePassX - Fehler + KeePassXC - Error + KeePassXC - Fehler @@ -919,102 +1077,14 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann Database Datenbank - - Recent databases - Aktuelle Datenbanken - - - Help - Hilfe - - - Entries - Einträge - - - Copy attribute to clipboard - Eingenschaft in die Zwischenablage kopieren - - - Groups - Gruppen - - - View - Ansicht - - - Quit - Beenden - - - About - Über - Open database Datenbank öffnen - - Save database - Datenbank speichern - - - Close database - Datenbank schließen - - - New database - Neue Datenbank - - - Add new entry - Neuen Eintrag hinzufügen - - - View/Edit entry - Eintrag anzeigen/bearbeiten - - - Delete entry - Eintrag löschen - - - Add new group - Neue Gruppe hinzufügen - - - Edit group - Gruppe bearbeiten - - - Delete group - Gruppe löschen - - - Save database as - Datenbank speichern als - - - Change master key - Hauptschlüssel ändern - Database settings Datenbankeinstellungen - - Import KeePass 1 database - KeePass 1 Datenbank importieren - - - Clone entry - Eintrag klonen - - - Find - Suchen - Copy username to clipboard Benutzername in die Zwischenablage kopieren @@ -1027,30 +1097,6 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann Settings Einstellungen - - Perform Auto-Type - Auto-Type ausführen - - - Open URL - URL öffnen - - - Lock databases - Datenbank sperren - - - Title - Titel - - - URL - URL - - - Notes - Notizen - Show toolbar Symbolleiste anzeigen @@ -1067,22 +1113,6 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann Tools Tools - - Copy username - Benutzername kopieren - - - Copy password - Passwort kopieren - - - Export to CSV file - Als CSV Datei exportieren - - - Repair database - Datenbank reparieren - KeePass 2 Database KeePass 2 Datenbank @@ -1103,6 +1133,265 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann Writing the database failed. Schreiben der Datenbank fehlgeschlagen. + + &Recent databases + &Letzte Datenbanken + + + He&lp + Hi&lfe + + + E&ntries + Ei&nträge + + + Copy att&ribute to clipboard + Eigenschaft in &Zwischenablage kopieren + + + &Groups + &Gruppen + + + &View + &Ansicht + + + &Quit + &Beenden + + + &About + &Über + + + &Open database + &Öffne Datenbank + + + &Save database + Datenbank &speichern + + + &Close database + &Datenbank schließen + + + &New database + &Neue Datenbank + + + Merge from KeePassX database + Von KeePassX-Datenbank zusammenführen + + + &Add new entry + Neuen Eintrag &hinzufügen + + + &View/Edit entry + Eintrag &anzeigen/bearbeiten + + + &Delete entry + Eintrag &löschen + + + &Add new group + &Neue Gruppe hinzufügen + + + &Edit group + Gruppe b&earbeiten + + + &Delete group + Gruppe &löschen + + + Sa&ve database as + Datenbank s&peichern als + + + Change &master key + &Hauptschlüssel ändern + + + &Database settings + &Datenbankeinstellungen + + + &Import KeePass 1 database + &KeePass 1 Datenbank importieren + + + &Clone entry + Eintrag &klonen + + + &Find + &Suchen + + + Copy &username + &Benutzername kopieren + + + Cop&y password + Passwort kop&ieren + + + &Settings + &Einstellungen + + + &Perform Auto-Type + &Auto-Type ausführen + + + &Open URL + URL &öffnen + + + &Lock databases + Datenbank &sperren + + + &Title + &Titel + + + &URL + &URL + + + &Notes + &Notizen + + + &Export to CSV file + Als CSV Datei &exportieren + + + Re&pair database + Datenbank re&parieren + + + Password Generator + Passwortgenerator + + + + OptionDialog + + Dialog + Dialog + + + General + Allgemein + + + Sh&ow a notification when credentials are requested + Zeig&e eine Benachrichtigung, wenn Anmeldedaten angefordert werden. + + + &Return only best matching entries for an URL instead +of all entries for the whole domain + Zeige nur die passendsten Einträge für eine URL, statt +alle Einträge der ganzen Domäne. + + + &Match URL schemes +Only entries with the same scheme (http://, https://, ftp://, ...) are returned + Passendes URL Schema +Nur Einträge mit dem gleichen Schema (hhtp://, https://, ftp://, ...) werden angezeigt + + + Sort matching entries by &username + Sortiere gefundene Einträge nach &Benutzername + + + R&emove all shared encryption-keys from active database + Entferne alle freigegebenen Chiffrierschlüssel aus der aktiven Datenbank + + + Re&move all stored permissions from entries in active database + Entferne alle gespeicherten Berechtigungen von Einträgen in der aktiven Datenbank + + + Password generator + Passwortgenerator + + + Advanced + Fortgeschritten + + + Activate the following only, if you know what you are doing! + Aktivieren Sie das Nachfolgende nur dann, wenn Sie sich sicher sind, was sie tun! + + + Always allow &access to entries + &Zugriff auf Einträge immer erlauben + + + Always allow &updating entries + &Aktualisierung von Einträgen immer erlauben + + + Searc&h in all opened databases for matching entries + Suche in allen offenen Datenbanken nach übereinstimmenden Einträgen + + + Only the selected database has to be connected with a client! + Nur die ausgewählte Datenbank muss mit dem Client verbunden sein. + + + &Return also advanced string fields which start with "KPH: " + Zeige auch erweiterte Zeichenfelder, welche mit "KPH: " beginnen + + + Automatic creates or updates are not supported for string fields! + Automatisches Erstellen und Aktualisieren von Zeichenfeldern wird nicht unterstützt! + + + HTTP Port: + HTTP Port: + + + Default port: 19455 + Standard Port:19455 + + + Re&quest to unlock the database if it is locked + Verlange Entsperrung, wenn die Datenbank gesperrt ist. + + + Sort &matching entries by title + Sortiere gefundene Einträge nach Titel + + + Enable KeepassXC HTTP protocol +This is required for accessing your databases from ChromeIPass or PassIFox + Aktiviere KeePassXC HTTP Protokoll +Dies wird benötigt um von ChromeIPass oder PassIFox auf Deine Datenbank zu zugreifen + + + KeePassXC will listen to this port on 127.0.0.1 + KeePassXC überwacht diesen Port auf 127.0..0.1 + + + Cannot bind to privileged ports + Kann nicht zu privilegierte Ports verbinden + + + Cannot bind to privileged ports below 1024! +Using default port 19455. + Kann nicht zu privilegierten Ports unter 1024 verbinden! +Benutze Standardport 19455. + PasswordGeneratorWidget @@ -1110,10 +1399,6 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann Password: Passwort: - - Length: - Länge: - Character Types Zeichenarten @@ -1138,71 +1423,72 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann Exclude look-alike characters Gleich aussehende Zeichen ausschließen - - Ensure that the password contains characters from every group - Sicher stellen, dass das Passwort Zeichen aller Gruppen enthält - Accept Akzeptieren - - - QCommandLineParser - Displays version information. - Versionsinformationen anzeigen. + %p% + %p% - Displays this help. - Zeigt diese Hilfe an. + strength + Stärke - Unknown option '%1'. - Unbekannte Option '%1'. + entropy + Entropie - Unknown options: %1. - Unbekannte Optionen: '%1'. + &Length: + &Länge: - Missing value after '%1'. - Fehlender Wert nach '%1'. + Pick characters from every group + Zeichen aus allen Gruppen wählen - Unexpected value after '%1'. - Unerwarteter Wert nach '%1'. + Generate + Generiere - [options] - [Optionen] + Close + Schließen - Usage: %1 - Verwendung: %1 + Apply + Anwenden - Options: - Optionen: + Entropy: %1 bit + Entropie: %1 bit - Arguments: - Argumente: + Password Quality: %1 + Passwort Qualität: %1 + + + Poor + Schlecht + + + Weak + Schwach + + + Good + Gut + + + Excellent + Exzellent - QSaveFile + QObject - Existing file %1 is not writable - Bestehende Datei(en) %1 ist nicht schreibbar - - - Writing canceled by application - Schreiben von der Applikation abgebrochen - - - Partial write. Partition full? - Unvollständiger Schreibvorgang. Partition voll? + Http + Http @@ -1242,20 +1528,112 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann SearchWidget - Find: - Suchen nach: + Case Sensitive + Groß- /Kleinschreibung beachten - Case sensitive - Groß-/Kleinschreibung unterscheiden + Search + Suche - Current group - Aktuelle Gruppe + Find + Suchen - Root group - Root-Gruppe + Clear + löschen + + + + Service + + A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it? + Ein freigegebener Chiffrierschlüssel mit dem Namen "%1" existiert schon. +Willst Du ihn überschreiben? + + + Do you want to update the information in %1 - %2? + Möchten Sie wirklich die Informationen in %1 - %2 aktualisieren? + + + The active database is locked! +Please unlock the selected database or choose another one which is unlocked. + Die aktive Datenbank ist gesperrt! +Bitte entsperren Sie die markierte Datenbank oder wählen Sie eine andere, die entsperrt ist. + + + Successfully removed %1 encryption-%2 from KeePassX/Http Settings. + %1 Verschlüsselungs-%2 erfolgreich von KeePassX/Http Einstellungen entfernt. + + + No shared encryption-keys found in KeePassHttp Settings. + Kein freigegebener Chiffrierschlüssel in den KeePassHttp-Einstellungen gefunden. + + + The active database does not contain an entry of KeePassHttp Settings. + Die aktive Datenbank enthält keinen Eintrag für KeePassHttp Einstellungen. + + + Removing stored permissions... + Gespeicherte Berechtigungen werden gelöscht... + + + Abort + Abbrechen + + + Successfully removed permissions from %1 %2. + Berechtigungen wurden von %1 %2 erfolgreich gelöscht. + + + The active database does not contain an entry with permissions. + The aktive Datenbank enthält keinen Eintrag mit Zugangsdaten. + + + KeePassXC: New key association request + KeePassXC: Neue Schlüsselverbindungsanfrage + + + You have received an association request for the above key. +If you would like to allow it access to your KeePassXC database +give it a unique name to identify and accept it. + Sie haben eine Verbindungsanfrage für den obigen Schlüssel +erhalten. Wenn Sie den Zugriff auf Ihre KeePassXC-Datenbank +erlauben möchten, geben Sie der Verbindungen einen eindeutigen +Namen und akzeptieren Sie. + + + KeePassXC: Overwrite existing key? + KeePassXC: Bestehenden Schlüssel überschreiben? + + + KeePassXC: Update Entry + KeePassXC: Eintrag aktualisiert + + + KeePassXC: Database locked! + KeePassXC: Datenbank gesperrt! + + + KeePassXC: Removed keys from database + KeePassXC: Entfernte Schlüssel von der Datenbank + + + KeePassXC: No keys found + KeePassXC: Kein Schlüssel gefunden + + + KeePassXC: Settings not available! + KeePassXC: Einstellung nicht verfügbar! + + + KeePassXC: Removed permissions + KeePassXC: Entfernte Zugangsdaten + + + KeePassXC: No entry with permissions found! + KeePassXC: Kein Eintrag mit Zugangsdaten gefunden! @@ -1279,10 +1657,6 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann Remember last databases Letzte Datenbank merken - - Open previous databases on startup - Letzte Datenbank beim Starten öffnen - Automatically save on exit Automatisch speichern beim Schließen @@ -1324,12 +1698,20 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann Letzte Schlüsseldateien merken - Hide window to system tray instead of App Exit - Fenster zu Taskleistensymbol minimieren statt Programm beenden + Load previous databases on startup + Letzte Datenbank beim Starten laden - Hide window to system tray on App start - Fenster zu Taskleistensymbol minimieren wenn Programm started + Automatically reload the database when modified externally + Datenbank nach externer Modifikation automatisch neu laden. + + + Hide window to system tray instead of app exit + Fenster zur Taskleiste minimieren statt das Programm zu beenden + + + Minimize window at application startup + Fenster beim Programmstart minimieren @@ -1354,6 +1736,14 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann Always ask before performing auto-type Immer vor einem Auto-type fragen + + Lock databases after minimizing the window + Datenbank sperren nach dem Minimieren des Fensters + + + Don't require password repeat when it is visible + Keine erneute Eingabe verlangen wenn Passwort sichtbar. + UnlockDatabaseWidget @@ -1371,14 +1761,6 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann main - - KeePassX - cross-platform password manager - KeePassX - plattformübergreifender Passwortmanager - - - filename of the password database to open (*.kdbx) - Dateiname für die zu öffnende Passwortdatenbank (*.kdbx) - path to a custom config file Pfad zu einer benutzerdefinierten Konfigurationsdatei @@ -1387,5 +1769,17 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann key file of the database Schlüsseldatei der Datenbank + + filename(s) of the password database(s) to open (*.kdbx) + Dateiname(n) der zu öffnenden Passwortdatenbank(en) (*.kdbx) + + + KeePassXC - cross-platform password manager + KeePassXC - plattformübergreifender Passwortmanager + + + read password of the database from stdin + passwort der datenbank von stdin lesen + \ No newline at end of file diff --git a/share/translations/keepassx_en.ts b/share/translations/keepassx_en.ts index bbf574b47..d55617134 100644 --- a/share/translations/keepassx_en.ts +++ b/share/translations/keepassx_en.ts @@ -19,6 +19,11 @@ KeePassXC is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3. + + Extensions: + + + AccessControlDialog @@ -475,6 +480,46 @@ Do you want to save it anyway? No Results + + Execute command? + + + + Do you really want to execute the following command?<br><br>%1<br> + + + + Remember my choice + + + + Autoreload Request + + + + The database file has changed. Do you want to load the changes? + + + + Merge Request + + + + The database file has changed and you have unsaved changes.Do you want to merge your changes? + + + + Autoreload Failed + + + + Could not parse or unlock the new database file while attempting to autoreload this database. + + + + Could not open the new database file while attempting to autoreload this database. + + EditEntryWidget @@ -669,10 +714,6 @@ Do you want to save it anyway? Repeat: - - Gen. - - URL: @@ -830,6 +871,13 @@ Do you want to save it anyway? + + Entry + + - Clone + + + EntryAttributesModel @@ -1226,6 +1274,10 @@ This is a one-way migration. You won't be able to open the imported databas Re&pair database + + Password Generator + + OptionDialog @@ -1299,14 +1351,6 @@ Only entries with the same scheme (http://, https://, ftp://, ...) are returned< Automatic creates or updates are not supported for string fields! - - HTTP Host: - - - - Default host: localhost - - HTTP Port: @@ -1315,11 +1359,6 @@ Only entries with the same scheme (http://, https://, ftp://, ...) are returned< Default port: 19455 - - Enable KeepassXC Http protocol -This is required for accessing your databases from ChromeIPass or PassIFox - - Re&quest to unlock the database if it is locked @@ -1328,6 +1367,24 @@ This is required for accessing your databases from ChromeIPass or PassIFoxSort &matching entries by title + + Enable KeepassXC HTTP protocol +This is required for accessing your databases from ChromeIPass or PassIFox + + + + KeePassXC will listen to this port on 127.0.0.1 + + + + Cannot bind to privileged ports + + + + Cannot bind to privileged ports below 1024! +Using default port 19455. + + PasswordGeneratorWidget @@ -1335,10 +1392,6 @@ This is required for accessing your databases from ChromeIPass or PassIFoxPassword: - - Length: - - Character Types @@ -1364,11 +1417,63 @@ This is required for accessing your databases from ChromeIPass or PassIFox - Ensure that the password contains characters from every group + Accept - Accept + %p% + + + + strength + + + + entropy + + + + &Length: + + + + Pick characters from every group + + + + Generate + + + + Close + + + + Apply + + + + Entropy: %1 bit + + + + Password Quality: %1 + + + + Poor + + + + Weak + + + + Good + + + + Excellent @@ -1415,16 +1520,20 @@ This is required for accessing your databases from ChromeIPass or PassIFox SearchWidget - - Find: - - Case Sensitive - Search Current Group + Search + + + + Find + + + + Clear @@ -1536,10 +1645,6 @@ give it a unique name to identify and accept it. Remember last databases - - Open previous databases on startup - - Automatically save on exit @@ -1581,11 +1686,19 @@ give it a unique name to identify and accept it. - Hide window to system tray instead of App Exit + Load previous databases on startup - Hide window to system tray on App start + Automatically reload the database when modified externally + + + + Hide window to system tray instead of app exit + + + + Minimize window at application startup @@ -1615,6 +1728,10 @@ give it a unique name to identify and accept it. Lock databases after minimizing the window + + Don't require password repeat when it is visible + + UnlockDatabaseWidget diff --git a/share/translations/keepassx_lt.ts b/share/translations/keepassx_lt.ts index 41aa94df7..824101c51 100644 --- a/share/translations/keepassx_lt.ts +++ b/share/translations/keepassx_lt.ts @@ -1,14 +1,6 @@ - + AboutDialog - - About KeePassX - Apie KeePassX - - - KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3. - KeePassX yra platinama GNU Bendrosios Viešosios Licencijos (GPL) versijos 2 arba (jūsų pasirinkimu) versijos 3 sąlygomis. - Revision Poversijis @@ -17,17 +9,56 @@ Using: Naudojama: + + About KeePassXC + Apie KeePassXC + + + KeePassXC is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3. + KeePassXC yra platinama GNU Bendrosios Viešosios Licencijos (GPL) versijos 2 arba (jūsų pasirinkimu) versijos 3 sąlygomis. + + + Extensions: + + Plėtiniai: + + + + + AccessControlDialog + + Remember this decision + Prisiminti šį sprendimą + + + Allow + Leisti + + + Deny + Atmesti + + + %1 has requested access to passwords for the following item(s). +Please select whether you want to allow access. + %1 užklausė prieigos prie slaptažodžių šiam elementui(-ams). +Pasirinkite, ar norite leisti prieigą. + + + KeePassXC HTTP Confirm Access + KeePassXC HTTP prieigos patvirtinimas + AutoType - - Auto-Type - KeePassX - Automatinis rinkimas - KeePassX - Couldn't find an entry that matches the window title: Nepavyko rasti įrašo, kuris atitiktų lango antraštę: + + Auto-Type - KeePassXC + Automatinis rinkimas - KeePassXC + AutoTypeAssociationsModel @@ -46,14 +77,14 @@ AutoTypeSelectDialog - - Auto-Type - KeePassX - Automatinis rinkimas - KeePassX - Select entry to Auto-Type: Pasirinkite įrašą automatiniam rinkimui: + + Auto-Type - KeePassXC + Automatinis rinkimas - KeePassXC + ChangeMasterKeyWidget @@ -319,12 +350,6 @@ Save changes? locked užrakinta - - The database you are trying to open is locked by another instance of KeePassX. -Do you want to open it anyway? Alternatively the database is opened read-only. - Duomenų bazė, kurią bandote atverti, yra užrakinta kito KeePassX egzemplioriaus. -Ar vis tiek norite ją atverti? Kitu atveju duomenų bazė bus atverta tik skaitymui. - Lock database Užrakinti duomenų bazę @@ -368,14 +393,24 @@ Vis tiek atmesti pakeitimus ir užverti? CSV failo įrašymas nepavyko. - The database you are trying to save as is locked by another instance of KeePassX. -Do you want to save it anyway? - Duomenų bazė, kurią bandote įrašyti yra užrakinta kito KeePassX programos egzemplioriaus. -Ar vis tiek norite ją įrašyti? + Unable to open the database. + Nepavyko atverti duomenų bazės. - Unable to open the database. - + The database you are trying to open is locked by another instance of KeePassXC. +Do you want to open it anyway? Alternatively the database is opened read-only. + Duomenų bazė, kurią bandote atverti, yra užrakinta kito KeePassXC egzemplioriaus. +Ar vis tiek norite ją atverti? Tokiu atveju duomenų bazė bus atverta tik skaitymui. + + + Merge database + Sulieti duomenų bazę + + + The database you are trying to save as is locked by another instance of KeePassXC. +Do you want to save it anyway? + Duomenų bazė, kurią bandote įrašyti yra užrakinta kito KeePassXC programos egzemplioriaus. +Ar vis tiek norite ją įrašyti? @@ -416,10 +451,6 @@ Ar vis tiek norite ją įrašyti? Do you really want to delete the group "%1" for good? Ar tikrai norite ištrinti grupę "%1"? - - Current group - Esama grupė - Error Klaida @@ -430,11 +461,71 @@ Ar vis tiek norite ją įrašyti? Move entry to recycle bin? - + Perkelti įrašą į šiukšlinę? Do you really want to move entry "%1" to the recycle bin? - + Ar tikrai norite perkelti įrašą "%1" į šiukšlinę? + + + Searching... + Ieškoma... + + + No current database. + Nėra esamos duomenų bazės. + + + No source database, nothing to do. + Nėra šaltinio duomenų bazės, nėra ką atlikti. + + + Search Results (%1) + Paieškos rezultatai (%1) + + + No Results + Nėra rezultatų + + + Execute command? + Vykdyti komandą? + + + Do you really want to execute the following command?<br><br>%1<br> + Ar tikrai norite vykdyti šią komandą?<br><br>%1<br> + + + Remember my choice + Prisiminti mano pasirinkimą + + + Autoreload Request + Automatinio įkėlimo iš naujo užklausa + + + The database file has changed. Do you want to load the changes? + Duomenų bazės failas pasikeitė. Ar norite įkelti pakeitimus? + + + Merge Request + Suliejimo užklausa + + + The database file has changed and you have unsaved changes.Do you want to merge your changes? + Duomenų bazės failas pasikeitė ir jūs turite neįrašytų pakeitimų. Ar norite sulieti savo pakeitimus? + + + Autoreload Failed + Automatinis įkėlimas iš naujo nepavyko + + + Could not parse or unlock the new database file while attempting to autoreload this database. + Nepavyko išanalizuoti ar atrakinti naujos duomenų bazės failo, bandant automatiškai iš naujo įkelti šią duomenų bazę. + + + Could not open the new database file while attempting to autoreload this database. + Nepavyko atverti naujos duomenų bazės failo, bandant automatiškai iš naujo įkelti šią duomenų bazę. @@ -625,10 +716,6 @@ Ar vis tiek norite ją įrašyti? Repeat: Pakartokite: - - Gen. - Kurti - URL: URL: @@ -746,17 +833,25 @@ Ar vis tiek norite ją įrašyti? Can't delete icon! Nepavyksta ištrinti piktogramos! - - Can't delete icon. Still used by %n item(s). - Nepavyksta ištrinti piktogramos. Vis dar naudojama %n elemento.Nepavyksta ištrinti piktogramos. Vis dar naudojama %n elementų.Nepavyksta ištrinti piktogramos. Vis dar naudojama %n elementų. - Error - + Klaida - Can't read icon: - + Download favicon + Atsisiųsti svetainės piktogramą + + + Unable to fetch favicon. + Nepavyko gauti svetainės piktogramos. + + + Can't read icon + Nepavyksta perskaityti piktogramos + + + Can't delete icon. Still used by %1 items. + Nepavyksta ištrinti piktogramos. Vis dar naudojama %1 elementų. @@ -778,6 +873,13 @@ Ar vis tiek norite ją įrašyti? Uuid: + + Entry + + - Clone + - Dublikatas + + EntryAttributesModel @@ -830,6 +932,61 @@ Ar vis tiek norite ją įrašyti? Šiukšlinė + + HttpPasswordGeneratorWidget + + Length: + Ilgis: + + + Character Types + Simbolių tipai + + + Upper Case Letters + Viršutinio registro raidės + + + A-Z + A-Z + + + Lower Case Letters + Apatinio registro raidės + + + a-z + a-z + + + Numbers + Skaičiai + + + 0-9 + 0-9 + + + Special Characters + Specialūs simboliai + + + /*_& ... + /*_& ... + + + Exclude look-alike characters + Pašalinti panašiai atrodančius simbolius + + + Ensure that the password contains characters from every group + Užtikrinti, kad slaptažodyje būtų simboliai iš kiekvienos grupės + + + Accept + Priimti + + KeePass1OpenWidget @@ -873,7 +1030,7 @@ Ar vis tiek norite ją įrašyti? Wrong key or database file is corrupt. - + Neteisingas raktas arba duomenų bazės failas yra pažeistas. @@ -912,8 +1069,8 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų Lemtingoji klaida, testuojant šifravimo funkcijas. - KeePassX - Error - KeePassX - Klaida + KeePassXC - Error + KeePassXC - Klaida @@ -922,102 +1079,14 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų Database Duomenų bazė - - Recent databases - Paskiausios duomenų bazės - - - Help - Pagalba - - - Entries - Įrašai - - - Copy attribute to clipboard - Kopijuoti požymį į iškarpinę - - - Groups - Grupės - - - View - Rodinys - - - Quit - Baigti - - - About - Apie - Open database Atverti duomenų bazę - - Save database - Įrašyti duomenų bazę - - - Close database - Užverti duomenų bazę - - - New database - Nauja duomenų bazė - - - Add new entry - Pridėti naują įrašą - - - View/Edit entry - Žiūrėti/Keisti įrašą - - - Delete entry - Ištrinti įrašą - - - Add new group - Pridėti naują grupę - - - Edit group - Keisti grupę - - - Delete group - Ištrinti grupę - - - Save database as - Įrašyti duomenų bazę kaip - - - Change master key - Pakeisti pagrindinį raktą - Database settings Duomenų bazės nustatymai - - Import KeePass 1 database - Importuoti KeePass 1 duomenų bazę - - - Clone entry - Dublikuoti įrašą - - - Find - Rasti - Copy username to clipboard Kopijuoti naudotojo vardą į iškarpinę @@ -1030,30 +1099,6 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų Settings Nustatymai - - Perform Auto-Type - Atlikti automatinį rinkimą - - - Open URL - Atverti URL - - - Lock databases - Užrakinti duomenų bazes - - - Title - Antraštė - - - URL - URL - - - Notes - Pastabos - Show toolbar Rodyti įrankių juostą @@ -1070,22 +1115,6 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų Tools Įrankiai - - Copy username - Kopijuoti naudotojo vardą - - - Copy password - Kopijuoti slaptažodį - - - Export to CSV file - Eksportuoti į CSV failą - - - Repair database - Taisyti duomenų bazę - KeePass 2 Database KeePass 2 duomenų bazė @@ -1106,6 +1135,265 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų Writing the database failed. Duomenų bazės rašymas nepavyko. + + &Recent databases + &Paskiausiai naudotos duomenų bazės + + + He&lp + Pa&galba + + + E&ntries + Į&rašai + + + Copy att&ribute to clipboard + Kopijuoti &požymį į iškarpinę + + + &Groups + &Grupės + + + &View + R&odinys + + + &Quit + &Baigti + + + &About + &Apie + + + &Open database + &Atverti duomenų bazę + + + &Save database + Į&rašyti duomenų bazę + + + &Close database + &Užverti duomenų bazę + + + &New database + &Nauja duomenų bazė + + + Merge from KeePassX database + Sulieti su KeePassX duomenų baze + + + &Add new entry + &Pridėti naują įrašą + + + &View/Edit entry + &Rodyti/Taisyti įrašą + + + &Delete entry + &Ištrinti įrašą + + + &Add new group + &Pridėti naują grupę + + + &Edit group + &Taisyti grupę + + + &Delete group + &Ištrinti grupę + + + Sa&ve database as + Įraš&yti duomenų bazę kaip + + + Change &master key + Pakeisti &pagrindinį raktą + + + &Database settings + &Duomenų bazės nustatymai + + + &Import KeePass 1 database + &Importuoti KeePass 1 duomenų bazę + + + &Clone entry + &Dublikuoti įrašą + + + &Find + &Rasti + + + Copy &username + Kopijuoti &naudotojo vardą + + + Cop&y password + Kopijuoti &slaptažodį + + + &Settings + &Nustatymai + + + &Perform Auto-Type + &Atlikti automatinį rinkimą + + + &Open URL + Atverti &URL + + + &Lock databases + &Užrakinti duomenų bazes + + + &Title + &Antraštė + + + &URL + &URL + + + &Notes + &Pastabos + + + &Export to CSV file + &Eksportuoti į CSV failą + + + Re&pair database + Pa&taisyti duomenų bazę + + + Password Generator + Slaptažodžių generatorius + + + + OptionDialog + + Dialog + Dialogas + + + General + Bendra + + + Sh&ow a notification when credentials are requested + R&odyti pranešimą, kai reikalaujama prisijungimo duomenų + + + &Return only best matching entries for an URL instead +of all entries for the whole domain + &Vietoj visų įrašų, skirtų visai sričiai, +grąžinti tik geriausiai atitinkančius įrašus, skirtus URL + + + &Match URL schemes +Only entries with the same scheme (http://, https://, ftp://, ...) are returned + &Atitikti URL schemas +Bus grąžinami įrašai tik su ta pačia schema (http://, https://, ftp://, ...) + + + Sort matching entries by &username + Rikiuoti atitinkančius įrašus pagal na&udotojo vardą + + + R&emove all shared encryption-keys from active database + Ša&linti iš aktyvios duomenų bazės visus bendrinamus šifravimo raktus + + + Re&move all stored permissions from entries in active database + Šal&inti iš įrašų aktyvioje duomenų bazėje visus saugomus leidimus + + + Password generator + Slaptažodžių generatorius + + + Advanced + Išplėstiniai + + + Activate the following only, if you know what you are doing! + Aktyvuokite tai tik tuo atveju, jeigu žinote ką darote! + + + Always allow &access to entries + Visada leisti &prieigą prie įrašų + + + Always allow &updating entries + Visada leisti įrašų at&naujinimą + + + Searc&h in all opened databases for matching entries + Ieš&koti atitinkančių įrašų visose atvertose duomenų bazėse + + + Only the selected database has to be connected with a client! + Su klientu turi būti sujungta tik pasirinkta duomenų bazė! + + + &Return also advanced string fields which start with "KPH: " + &Taip pat grąžinti ir išplėstines eilutes, kurios prasideda "KPH: " + + + Automatic creates or updates are not supported for string fields! + Šiems eilutės laukams automatiniai kūrimai ir atnaujinimai neprieinami! + + + HTTP Port: + HTTP prievadas: + + + Default port: 19455 + Numatytasis prievadas: 19455 + + + Re&quest to unlock the database if it is locked + Už&klausti atrakinti duomenų bazę, jeigu ji yra užrakinta + + + Sort &matching entries by title + Rikiuoti atitinkančius įrašus pagal &antraštę + + + Enable KeepassXC HTTP protocol +This is required for accessing your databases from ChromeIPass or PassIFox + Įjungti KeepassXC HTTP protokolą +Tai reikalinga, norint prie savo duomenų bazių gauti prieigą iš ChromeIPass ar PassIFox + + + KeePassXC will listen to this port on 127.0.0.1 + KeePassXC klausysis šio prievado ties 127.0.0.1 + + + Cannot bind to privileged ports + Nepavyksta susieti su privilegijuotais prievadais + + + Cannot bind to privileged ports below 1024! +Using default port 19455. + Nepavyksta susieti su privilegijuotais prievadais žemiau 1024! +Naudojamas numatytasis prievadas 19455. + PasswordGeneratorWidget @@ -1113,10 +1401,6 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų Password: Slaptažodis: - - Length: - Ilgis: - Character Types Simbolių tipai @@ -1141,71 +1425,72 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų Exclude look-alike characters Pašalinti panašiai atrodančius simbolius - - Ensure that the password contains characters from every group - Užtikrinti, kad slaptažodyje yra simboliai iš kiekvienos grupės - Accept Priimti - - - QCommandLineParser - Displays version information. - Rodo versijos informaciją. + %p% + %p% - Displays this help. - Rodo šią pagalbą. + strength + stiprumas - Unknown option '%1'. - Nežinoma parinktis "%1". + entropy + entropija - Unknown options: %1. - Nežinomos parinktys: %1. + &Length: + &Ilgis: - Missing value after '%1'. - Trūksta reikšmės po "%1". + Pick characters from every group + Parinkti simbolius iš kiekvienos grupės - Unexpected value after '%1'. - Netikėta reikšmė po "%1". + Generate + Generuoti - [options] - [parinktys] + Close + Užverti - Usage: %1 - Naudojimas: %1 + Apply + Taikyti - Options: - Parinktys: + Entropy: %1 bit + Entropija: %1 bit - Arguments: - Argumentai: + Password Quality: %1 + Slaptažodžio kokybė: %1 + + + Poor + Blogas + + + Weak + Silpnas + + + Good + Geras + + + Excellent + Puikus - QSaveFile + QObject - Existing file %1 is not writable - Esamas failas %1 nėra įrašomas - - - Writing canceled by application - Programa atšaukė įrašymą - - - Partial write. Partition full? - Dalinis įrašymas. Pilnas skaidinys? + Http + Http @@ -1245,20 +1530,112 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų SearchWidget - Find: - Rasti: + Case Sensitive + Skirti raidžių dydį - Case sensitive - Skiriant raidžių registrą + Search + Ieškoti - Current group - Esama grupė + Find + Rasti - Root group - Šakninė grupė + Clear + Išvalyti + + + + Service + + A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it? + Bendrinamas šifravimo raktas, pavadinimu "%1" jau yra. +Ar norite jį perrašyti? + + + Do you want to update the information in %1 - %2? + Ar norite atnaujinti informaciją ties %1 - %2? + + + The active database is locked! +Please unlock the selected database or choose another one which is unlocked. + Aktyvi duomenų bazė yra užrakinta! +Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų atrakinta. + + + Successfully removed %1 encryption-%2 from KeePassX/Http Settings. + Sėkmingai pašalinta %1 šifravimo-%2 iš KeePassX/Http nustatymų. + + + No shared encryption-keys found in KeePassHttp Settings. + KeePassHttp nustatymuose nerasta jokių bendrinamų šifravimo raktų. + + + The active database does not contain an entry of KeePassHttp Settings. + Aktyvioje duomenų bazėje nėra KeePassHttp nustatymų įrašo. + + + Removing stored permissions... + Šalinami saugomi leidimai... + + + Abort + Nutraukti + + + Successfully removed permissions from %1 %2. + Leidimai sėkmingai pašalinti iš %1 %2. + + + The active database does not contain an entry with permissions. + Aktyvioje duomenų bazėje nėra įrašo su leidimais. + + + KeePassXC: New key association request + KeePassXC: Naujo rakto susiejimo užklausa + + + You have received an association request for the above key. +If you would like to allow it access to your KeePassXC database +give it a unique name to identify and accept it. + Jūs gavote susiejimo užklausą aukščiau esančiam raktui. +Jei norite leisti jam gauti prieigą prie savo KeePassXC +duomenų bazės, suteikite jam unikalų pavadinimą, kad atpažintumėte +ir priimtumėte jį. + + + KeePassXC: Overwrite existing key? + KeePassXC: Perrašyti esamą raktą? + + + KeePassXC: Update Entry + KeePassXC: Atnaujinti įrašą + + + KeePassXC: Database locked! + KeePassXC: Duomenų bazė užrakinta! + + + KeePassXC: Removed keys from database + KeePassXC: Pašalinti raktai iš duomenų bazės + + + KeePassXC: No keys found + KeePassXC: Raktų nerasta + + + KeePassXC: Settings not available! + KeePassXC: Nustatymai neprieinami! + + + KeePassXC: Removed permissions + KeePassXC: Pašalinti leidimai + + + KeePassXC: No entry with permissions found! + KeePassXC: Nerasta jokių įrašų su leidimais! @@ -1282,10 +1659,6 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų Remember last databases Prisiminti paskutines duomenų bazes - - Open previous databases on startup - Paleidžiant programą, atverti ankstesnes duomenų bazes - Automatically save on exit Išeinant, automatiškai įrašyti @@ -1327,12 +1700,20 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų Prisiminti paskutinius rakto failus - Hide window to system tray instead of App Exit - + Load previous databases on startup + Paleidžiant programą, įkelti ankstesnes duomenų bazes - Hide window to system tray on App start - + Automatically reload the database when modified externally + Išoriškai modifikavus duomenų bazę, automatiškai įkelti ją iš naujo + + + Hide window to system tray instead of app exit + Neužverti lango, bet vietoj to, suskleisti jį į sistemos dėklą + + + Minimize window at application startup + Paleidus programą, suskleisti langą @@ -1357,6 +1738,14 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų Always ask before performing auto-type Visuomet klausti prieš atliekant automatinį rinkimą + + Lock databases after minimizing the window + Suskleidus langą, užrakinti duomenų bazes + + + Don't require password repeat when it is visible + Nereikalauti pakartoti slaptažodį, kai šis yra matomas + UnlockDatabaseWidget @@ -1374,14 +1763,6 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų main - - KeePassX - cross-platform password manager - KeePassX - daugiaplatformė slaptažodžių tvarkytuvė - - - filename of the password database to open (*.kdbx) - norimos atverti slaptažodžių duomenų bazės failo pavadinimas (*.kdbx) - path to a custom config file kelias į tinkintą konfigūracijos failą @@ -1390,5 +1771,17 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų key file of the database duomenų bazės rakto failas + + filename(s) of the password database(s) to open (*.kdbx) + norimos atverti slaptažodžių duomenų bazės(-ių) failo pavadinimas(-ai) (*.kdbx) + + + KeePassXC - cross-platform password manager + KeePassXC - daugiaplatformė slaptažodžių tvarkytuvė + + + read password of the database from stdin + nuskaityti duomenų bazės slaptažodį iš stdin + \ No newline at end of file diff --git a/share/translations/keepassx_pt_BR.ts b/share/translations/keepassx_pt_BR.ts index 07400920e..22acf42be 100644 --- a/share/translations/keepassx_pt_BR.ts +++ b/share/translations/keepassx_pt_BR.ts @@ -1,14 +1,6 @@ - + AboutDialog - - About KeePassX - Sobre KeePassX - - - KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3. - KeePassX é distribuído nos termos da Licença Pública Geral (GPL), versão 2 ou (à sua escolha) versão 3, do GNU. - Revision Revisão @@ -17,17 +9,56 @@ Using: Usando: + + About KeePassXC + Sobre KeePassXC + + + KeePassXC is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3. + KeePassXC é distribuído nos termos da Licença Pública Geral (GPL), versão 2 ou (à sua escolha) versão 3, do GNU. + + + Extensions: + + Extensões: + + + + + AccessControlDialog + + Remember this decision + Lembrar esta escolha + + + Allow + Permitir + + + Deny + Negar + + + %1 has requested access to passwords for the following item(s). +Please select whether you want to allow access. + %1 solicitou acesso a senhas para o(s) seguinte(s) iten(s). +Selecione se deseja permitir o acesso. + + + KeePassXC HTTP Confirm Access + KeePassXC HTTP Confirmar Acesso + AutoType - - Auto-Type - KeePassX - Auto-Digitação - KeePassX - Couldn't find an entry that matches the window title: Não foi possível localizar uma entrada que corresponda ao título da janela: + + Auto-Type - KeePassXC + Auto-Digitação - KeePassXC + AutoTypeAssociationsModel @@ -46,14 +77,14 @@ AutoTypeSelectDialog - - Auto-Type - KeePassX - Auto-Digitação - KeePassX - Select entry to Auto-Type: Escolha uma entrada para Auto-Digitar: + + Auto-Type - KeePassXC + Auto-Digitação - KeePassXC + ChangeMasterKeyWidget @@ -319,12 +350,6 @@ Salvar alterações? locked trancado - - The database you are trying to open is locked by another instance of KeePassX. -Do you want to open it anyway? Alternatively the database is opened read-only. - O banco de dados que você está tentando abrir está bloqueado por outra instância do KeePassX. -Você quer abri-lo de qualquer forma? Alternativamente, o banco de dados é aberto como somente leitura. - Lock database Trancar Banco de Dados @@ -368,14 +393,24 @@ Descartar alterações e fechar mesmo assim? Falha ao gravar arquivo CSV. - The database you are trying to save as is locked by another instance of KeePassX. -Do you want to save it anyway? - O banco de dados que você está tentando salvar como está travado por uma outra instância de KeePassX. -Você deseja salvá-lo mesmo assim? + Unable to open the database. + Não foi possível abrir o banco de dados. - Unable to open the database. - + The database you are trying to open is locked by another instance of KeePassXC. +Do you want to open it anyway? Alternatively the database is opened read-only. + A base de dados que você está tentando abrir está bloqueada por outra instância de KeePassXC. +Mesmo assim deseja abrir? Alternativamente, a base de dados é aberta somente para leitura. + + + Merge database + Juntar banco de dados + + + The database you are trying to save as is locked by another instance of KeePassXC. +Do you want to save it anyway? + A base de dados que você está tentando abrir está bloqueada por outra instância de KeePassXC. +Mesmo assim deseja salvá-la? @@ -416,10 +451,6 @@ Você deseja salvá-lo mesmo assim? Do you really want to delete the group "%1" for good? Você realmente quer apagar o grupo "%1" para sempre? - - Current group - Grupo atual - Error Erro @@ -430,11 +461,71 @@ Você deseja salvá-lo mesmo assim? Move entry to recycle bin? - + Mover entrada para a lixeira? Do you really want to move entry "%1" to the recycle bin? - + Pretende realmente mover a entrada "%1" para a lixeira? + + + Searching... + Pesquisando... + + + No current database. + Nenhuma base de dados atual. + + + No source database, nothing to do. + Nenhuma base de dados de origem, nada a fazer. + + + Search Results (%1) + Resultados da Pesquisa (%1) + + + No Results + Sem Resultados + + + Execute command? + Executar comando? + + + Do you really want to execute the following command?<br><br>%1<br> + Você quer realmente executar o comando seguinte?<br><br>%1<br> + + + Remember my choice + Lembrar minha escolha + + + Autoreload Request + Recarregar Automaticamente Pedido + + + The database file has changed. Do you want to load the changes? + A base de dados foi alterada. Deseja carregar as alterações? + + + Merge Request + Juntar Pedido + + + The database file has changed and you have unsaved changes.Do you want to merge your changes? + A base de dados foi alterada e tem alterações não gravadas. Deseja juntar as suas alterações? + + + Autoreload Failed + Carregamento Automático Falhou + + + Could not parse or unlock the new database file while attempting to autoreload this database. + Não foi possível analisar ou desbloquear o novo arquivo da base de dados ao tentar recarregar automaticamente essa base de dados. + + + Could not open the new database file while attempting to autoreload this database. + Não foi possível abrir a nova base de dados ao tentar recarregar automaticamente essa base de dados. @@ -625,10 +716,6 @@ Você deseja salvá-lo mesmo assim? Repeat: Repetir: - - Gen. - Gerar - URL: URL: @@ -746,17 +833,25 @@ Você deseja salvá-lo mesmo assim? Can't delete icon! Não é possível apagar o ícone! - - Can't delete icon. Still used by %n item(s). - Não é possível apagar o ícone. Ainda usado por %n item.Não é possível apagar o ícone. Ainda usado por %n itens. - Error - + Erro - Can't read icon: - + Download favicon + Baixar favicon + + + Unable to fetch favicon. + Não foi possível obter favicon. + + + Can't read icon + Não foi possível ler ícone + + + Can't delete icon. Still used by %1 items. + Não é possível apagar ícone. Ainda usado por %1 itens. @@ -778,6 +873,13 @@ Você deseja salvá-lo mesmo assim? Uuid: + + Entry + + - Clone + - Clone + + EntryAttributesModel @@ -830,6 +932,61 @@ Você deseja salvá-lo mesmo assim? Lixeira + + HttpPasswordGeneratorWidget + + Length: + Comprimento: + + + Character Types + Tipo de Caracteres + + + Upper Case Letters + Letras Maiúsculas + + + A-Z + A-Z + + + Lower Case Letters + Letras Minúsculas + + + a-z + a-z + + + Numbers + Números + + + 0-9 + 0-9 + + + Special Characters + Caracteres Especiais + + + /*_& ... + /*_& ... + + + Exclude look-alike characters + Excluir caracteres semelhantes + + + Ensure that the password contains characters from every group + Verificar se a senha contém caracteres de todos os grupos + + + Accept + Aceitar + + KeePass1OpenWidget @@ -873,7 +1030,7 @@ Você deseja salvá-lo mesmo assim? Wrong key or database file is corrupt. - + Chave errada ou base de dados corrompida. @@ -912,8 +1069,8 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp Erro fatal enquanto testava as funções criptográficas. - KeePassX - Error - KeePassX - Erro + KeePassXC - Error + KeePassXC - Erro @@ -922,102 +1079,14 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp Database Banco de Dados - - Recent databases - Bancos de dados recentes - - - Help - Ajuda - - - Entries - Entradas - - - Copy attribute to clipboard - Copiar atributo para a área de transferência - - - Groups - Grupos - - - View - Ver - - - Quit - Sair - - - About - Sobre - Open database Abrir banco de dados - - Save database - Salvar banco de dados - - - Close database - Fechar banco de dados - - - New database - Novo banco de dados - - - Add new entry - Adicionar nova entrada - - - View/Edit entry - Ver/Editar entrada - - - Delete entry - Excluir entrada - - - Add new group - Adicionar novo grupo - - - Edit group - Editar grupo - - - Delete group - Excluir grupo - - - Save database as - Salvar banco de dados como - - - Change master key - Alterar chave-mestra - Database settings Configurações do Banco de Dados - - Import KeePass 1 database - Importar banco de dados KeePass1 - - - Clone entry - Clonar entrada - - - Find - Localizar - Copy username to clipboard Copiar nome de usuário para área de transferência @@ -1030,30 +1099,6 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp Settings Configurações - - Perform Auto-Type - Realizar Auto-Digitação - - - Open URL - Abrir URL - - - Lock databases - Trancar bancos de dados - - - Title - Título - - - URL - URL - - - Notes - Notas - Show toolbar Mostrar barra de ferramentas @@ -1070,22 +1115,6 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp Tools Ferramentas - - Copy username - Copiar nome de usuário - - - Copy password - Copiar senha - - - Export to CSV file - Exportar para arquivo CSV - - - Repair database - Reparar banco de dados - KeePass 2 Database Banco de dados Keepass 2 @@ -1106,6 +1135,265 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp Writing the database failed. Escrita do banco de dados falhou. + + &Recent databases + &Bancos de dados recentes + + + He&lp + &Ajuda + + + E&ntries + E&ntradas + + + Copy att&ribute to clipboard + Copiar at&ributo para área de transferência + + + &Groups + &Grupos + + + &View + &Ver + + + &Quit + &Sair + + + &About + &Sobre + + + &Open database + &Abrir base de dados + + + &Save database + &Salvar base de dados + + + &Close database + &Fechar base de dados + + + &New database + &Nova base de dados + + + Merge from KeePassX database + Juntar base de dados a partir de KeePassX + + + &Add new entry + &Adicionar nova entrada + + + &View/Edit entry + &Ver/Editar entrada + + + &Delete entry + &Apagar entrada + + + &Add new group + &Adicionar novo grupo + + + &Edit group + &Editar grupo + + + &Delete group + &Apagar grupo + + + Sa&ve database as + Sal&var base de dados como + + + Change &master key + Alterar chave &mestra + + + &Database settings + &Definições da base de dados + + + &Import KeePass 1 database + &Importar base de dados KeePass 1 + + + &Clone entry + &Clonar entrada + + + &Find + &Encontrar + + + Copy &username + Copiar nome de &usuário + + + Cop&y password + Cop&iar senha + + + &Settings + &Configurações + + + &Perform Auto-Type + &Executar escrita automática + + + &Open URL + &Abrir URL + + + &Lock databases + &Trancar base de dados + + + &Title + &Título + + + &URL + &URL + + + &Notes + &Notas + + + &Export to CSV file + &Exportar para arquivo CSV + + + Re&pair database + Re&parar banco de dados + + + Password Generator + Gerador de Senha + + + + OptionDialog + + Dialog + Diálogo + + + General + Geral + + + Sh&ow a notification when credentials are requested + M&ostrar uma notificação quando as credenciais forem solicitadas + + + &Return only best matching entries for an URL instead +of all entries for the whole domain + &Mostrar apenas as melhores entradas correspondentes para um URL em vez de +todas as entradas para o domínio completo + + + &Match URL schemes +Only entries with the same scheme (http://, https://, ftp://, ...) are returned + &Esquemas de URL coincidentes +Somente entradas com o mesmo esquema (http://, https://, ftp://, ...) são mostradas + + + Sort matching entries by &username + Ordenar entradas coincidentes por nome de &usuário + + + R&emove all shared encryption-keys from active database + R&emover todas as chaves criptografadas compartilhadas da base de dados ativa + + + Re&move all stored permissions from entries in active database + R&emover todas as permissões armazenadas de entradas na base de dados ativa + + + Password generator + Gerador de senha + + + Advanced + Avançado + + + Activate the following only, if you know what you are doing! + Ativar apenas os seguintes, se souber o que está fazendo! + + + Always allow &access to entries + Permitir sempre &acesso as entradas + + + Always allow &updating entries + Permitir sempre &atualizar as entradas + + + Searc&h in all opened databases for matching entries + Procurar em todas as base de dados abertas por entradas semel&hantes + + + Only the selected database has to be connected with a client! + Somente a base de dados selecionada tem que ser conectada com um cliente! + + + &Return also advanced string fields which start with "KPH: " + &Mostrar também campos avançados que começam com "KPH: " + + + Automatic creates or updates are not supported for string fields! + Criação automática ou atualizações não são suportadas para os valores dos campos! + + + HTTP Port: + Porta HTTP: + + + Default port: 19455 + Porta padrão: 19455 + + + Re&quest to unlock the database if it is locked + Pe&dir para desbloquear a base de dados se estiver bloqueada + + + Sort &matching entries by title + Ordenar &entradas por título + + + Enable KeepassXC HTTP protocol +This is required for accessing your databases from ChromeIPass or PassIFox + Habilitar KeepassXC protocolo HTTP +Isso é necessário para acessar os seus bancos de dados de ChromeIPass ou de PassIFox + + + KeePassXC will listen to this port on 127.0.0.1 + KeePassXC irá escutar esta porta em 127.0.0.1 + + + Cannot bind to privileged ports + Não é possível ligar a portas privilegiadas + + + Cannot bind to privileged ports below 1024! +Using default port 19455. + Não é possível ligar a portas privilegiadas abaixo de 1024! +Usando porta padrão 19455. + PasswordGeneratorWidget @@ -1113,10 +1401,6 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp Password: Senha: - - Length: - Tamanho: - Character Types Tipos de Caracteres @@ -1141,71 +1425,72 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp Exclude look-alike characters Excluir caracteres similares - - Ensure that the password contains characters from every group - Assegurar que a senha contenha caracteres de todos os grupos - Accept Aceitar - - - QCommandLineParser - Displays version information. - Mostrar informações da versão. + %p% + %p% - Displays this help. - Mostrar esta ajuda. + strength + força - Unknown option '%1'. - Opção desconhecida '%1'. + entropy + entropia - Unknown options: %1. - Opções desconhecidas: %1. + &Length: + &Tamanho: - Missing value after '%1'. - Falta valor após '%1'. + Pick characters from every group + Selecione caracteres de todos os grupos - Unexpected value after '%1'. - Valor inesperado após '%1'. + Generate + Gerar - [options] - [opções] + Close + Fechar - Usage: %1 - Utilização: %1 + Apply + Aplicar - Options: - Opções: + Entropy: %1 bit + Entropia: %1 bit - Arguments: - Argumentos: + Password Quality: %1 + Qualidade da senha: %1 + + + Poor + Pobre + + + Weak + Fraco + + + Good + Bom + + + Excellent + Excelente - QSaveFile + QObject - Existing file %1 is not writable - O arquivo existente %1 não é gravável - - - Writing canceled by application - Escrita cancelada pelo aplicativo - - - Partial write. Partition full? - Escrita parcial. Partição cheia? + Http + Http @@ -1245,20 +1530,111 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp SearchWidget - Find: - Localizar: - - - Case sensitive + Case Sensitive Diferenciar maiúsculas e minúsculas - Current group - Grupo atual + Search + Pesquisar - Root group - Grupo Raiz + Find + Localizar + + + Clear + Limpar + + + + Service + + A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it? + Já existe uma chave de criptografia compartilhada com o nome "%1". +Deseja substituí-la? + + + Do you want to update the information in %1 - %2? + Deseja atualizar as informações em %1 - %2? + + + The active database is locked! +Please unlock the selected database or choose another one which is unlocked. + A base de dados ativa está bloqueada! +Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada. + + + Successfully removed %1 encryption-%2 from KeePassX/Http Settings. + Removido com sucesso %1 criptografia-%2 do KeePassX/Http Configurações. + + + No shared encryption-keys found in KeePassHttp Settings. + Nenhuma chave de criptografia compartilhada encontrada nas Configurações do KeePassHttp. + + + The active database does not contain an entry of KeePassHttp Settings. + A base de dados ativa não contém uma entrada de Configurações KeePassHttp. + + + Removing stored permissions... + Removendo permissões armazenadas... + + + Abort + Cancelar + + + Successfully removed permissions from %1 %2. + Foram removidas com êxito as permissões de %1 %2. + + + The active database does not contain an entry with permissions. + A base de dados ativa não contém uma entrada com permissões. + + + KeePassXC: New key association request + KeePassXC: Nova associação de chaves requisitada + + + You have received an association request for the above key. +If you would like to allow it access to your KeePassXC database +give it a unique name to identify and accept it. + Recebeu uma solicitação de associação para a chave acima. +Se quiser permitir o acesso a sua base de dados KeePassXC +dar-lhe um nome único para identificá-lo e aceitá-lo. + + + KeePassXC: Overwrite existing key? + KeePassXC: Substituir chave existente? + + + KeePassXC: Update Entry + KeePassXC: Atualizar entrada + + + KeePassXC: Database locked! + KeePassXC: Banco de dados bloqueado! + + + KeePassXC: Removed keys from database + KeePassXC: Chaves removidas do banco de dados + + + KeePassXC: No keys found + KeePassXC: Nenhuma chave localizada + + + KeePassXC: Settings not available! + KeePassXC: Configurações não disponíveis! + + + KeePassXC: Removed permissions + KeePassXC: Permissões removidas + + + KeePassXC: No entry with permissions found! + KeePassXC: Nenhuma entrada com permissões localizada! @@ -1282,10 +1658,6 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp Remember last databases Lembrar dos últimos bancos de dados - - Open previous databases on startup - Abrir bancos de dados anteriores na inicialização - Automatically save on exit Salvar automaticamente ao sair @@ -1327,12 +1699,20 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp Lembrar dos últimos arquivos-chave - Hide window to system tray instead of App Exit - + Load previous databases on startup + Abrir bancos de dados anteriores na inicialização - Hide window to system tray on App start - + Automatically reload the database when modified externally + Automaticamente recarregar o banco de dados quando houver modificações externas + + + Hide window to system tray instead of app exit + Ocultar janela na bandeja de sistema em vez de sair do programa + + + Minimize window at application startup + Iniciar programa com janela minimizada @@ -1357,6 +1737,14 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp Always ask before performing auto-type Sempre perguntar antes de realizar auto-digitação + + Lock databases after minimizing the window + Bloquear bancos de dados após minimizar a janela + + + Don't require password repeat when it is visible + Quando a senha for visível não pedir para repeti-la + UnlockDatabaseWidget @@ -1374,14 +1762,6 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp main - - KeePassX - cross-platform password manager - KeePassX - gerenciador de senhas multiplataforma - - - filename of the password database to open (*.kdbx) - nome de arquivo do banco de dados de senhas a ser aberto (*.kdbx) - path to a custom config file caminho para um arquivo de configuração personalizado @@ -1390,5 +1770,17 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp key file of the database arquivo-chave do banco de dados + + filename(s) of the password database(s) to open (*.kdbx) + nome(s) de arquivo(s) do banco de dados de senhas a ser aberto (*.kdbx) + + + KeePassXC - cross-platform password manager + KeePassXC - gerenciador de senhas multiplataforma + + + read password of the database from stdin + ler a senha do banco de dados da entrada padrão + \ No newline at end of file diff --git a/share/translations/keepassx_ru.ts b/share/translations/keepassx_ru.ts index 733d64c85..f3321c9b3 100644 --- a/share/translations/keepassx_ru.ts +++ b/share/translations/keepassx_ru.ts @@ -1,14 +1,6 @@ - + AboutDialog - - About KeePassX - О KeePassX - - - KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3. - KeePassX распространяется на условиях Стандартной общественной лицензии GNU (GPL) версии 2 или (на ваше усмотрение) версии 3. - Revision Ревизия @@ -17,17 +9,55 @@ Using: С помощью: + + About KeePassXC + О KeePassXC + + + KeePassXC is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3. + KeePassXC распространяется на условиях Стандартной общественной лицензии GNU (GPL) версии 2 или (на ваше усмотрение) версии 3. + + + Extensions: + + Расширения: + + + + + AccessControlDialog + + Remember this decision + Запомнить это решение + + + Allow + Разрешить + + + Deny + Запретить + + + %1 has requested access to passwords for the following item(s). +Please select whether you want to allow access. + %1 запросил доступ к паролям для следующего элемента(ов). Выберете, хотите ли вы разрешить доступ. + + + KeePassXC HTTP Confirm Access + Подтверждение доступа KeePassXC HTTP + AutoType - - Auto-Type - KeePassX - Автоввод — KeePassX - Couldn't find an entry that matches the window title: Невозможно найти запись, соответствующую заголовку окна: + + Auto-Type - KeePassXC + Автоввод — KeePassXC + AutoTypeAssociationsModel @@ -46,14 +76,14 @@ AutoTypeSelectDialog - - Auto-Type - KeePassX - Автоввод — KeePassX - Select entry to Auto-Type: Выберите запись для автоввода: + + Auto-Type - KeePassXC + Автоввод — KeePassXC + ChangeMasterKeyWidget @@ -187,7 +217,7 @@ Database opened fine. Nothing to do. - + Хранилище открылось. Больше нечего делать. Unable to open the database. @@ -319,11 +349,6 @@ Save changes? locked заблокировано - - The database you are trying to open is locked by another instance of KeePassX. -Do you want to open it anyway? Alternatively the database is opened read-only. - Хранилище, которое Вы хотите открыть, заблокировано другой запущенной копией KeePassX. Всё равно открыть? В качестве альтернативы хранилище будет открыто в режиме для чтения. - Lock database Заблокировать хранилище @@ -367,14 +392,24 @@ Discard changes and close anyway? Не удалось записать CSV файл. - The database you are trying to save as is locked by another instance of KeePassX. -Do you want to save it anyway? - Данное хранилище заблокировано другой запущенной копией KeePassX. -Вы уверены, что хотите продолжить сохранение? + Unable to open the database. + Не удаётся открыть хранилище. - Unable to open the database. - + The database you are trying to open is locked by another instance of KeePassXC. +Do you want to open it anyway? Alternatively the database is opened read-only. + Хранилище, которое Вы хотите открыть, заблокировано другой запущенной копией KeePassXC. +Всё равно открыть? В качестве альтернативы хранилище будет открыто в режиме для чтения. + + + Merge database + Объединить хранилище + + + The database you are trying to save as is locked by another instance of KeePassXC. +Do you want to save it anyway? + Хранилище, которые вы пытаетесь сохранить, заблокировано другим экземпляром KeePassXC. +Хотите сохранить во всех случаях? @@ -415,10 +450,6 @@ Do you want to save it anyway? Do you really want to delete the group "%1" for good? Вы действительно хотите навсегда удалить группу «%1»? - - Current group - Текущая группа - Error Ошибка @@ -429,11 +460,71 @@ Do you want to save it anyway? Move entry to recycle bin? - + Переместить запись в корзину? Do you really want to move entry "%1" to the recycle bin? - + Действительно переместить запись "%1" в корзину? + + + Searching... + Поиск... + + + No current database. + Нет текущего хранилища. + + + No source database, nothing to do. + Нет исходного хранилища, нечего обрабатывать. + + + Search Results (%1) + Результаты поиска (%1) + + + No Results + Нет результатов + + + Execute command? + Выполнить комманду? + + + Do you really want to execute the following command?<br><br>%1<br> + Вы действительно хотите выполнить следующую команду?<br><br>%1<br> + + + Remember my choice + Запомнить выбор + + + Autoreload Request + Запрос на автоматическую загрузку + + + The database file has changed. Do you want to load the changes? + Хранилище было изменено. Вы хотите загрузить изменения? + + + Merge Request + Запрос на слияние + + + The database file has changed and you have unsaved changes.Do you want to merge your changes? + Файл хранилища был изменён, а так же присутствуют несохранённые изменения. Вы хотите объеденить изменения? + + + Autoreload Failed + Ошибка автоматической загрузки + + + Could not parse or unlock the new database file while attempting to autoreload this database. + Не удаётся разобрать или разблокировать новый файл хранилища при попытке автоматической загрузки этого хранилища. + + + Could not open the new database file while attempting to autoreload this database. + Не удаётся открыть новый файл хранилища при попытке автоматической загрузки этого файла. @@ -624,10 +715,6 @@ Do you want to save it anyway? Repeat: Пароль ещё раз: - - Gen. - Генеральный. - URL: URL: @@ -745,17 +832,25 @@ Do you want to save it anyway? Can't delete icon! Не могу удалить значок! - - Can't delete icon. Still used by %n item(s). - Не могу удалить иконку, %n запись всё ещё использует её.Не могу удалить иконку, %n записи всё ещё использует её.Не могу удалить иконку, %n записей всё ещё использует её.Не могу удалить значок, %n записей всё ещё использует его. - Error - + Ошибка - Can't read icon: - + Download favicon + Скачать значок сайта + + + Unable to fetch favicon. + Не удалось получить значок сайта + + + Can't read icon + Не могу прочитать значок + + + Can't delete icon. Still used by %1 items. + Не удается удалить значок, она продолжает использоваться %1 записями. @@ -777,6 +872,13 @@ Do you want to save it anyway? Uuid: + + Entry + + - Clone + - Колинировать + + EntryAttributesModel @@ -829,6 +931,61 @@ Do you want to save it anyway? Корзина + + HttpPasswordGeneratorWidget + + Length: + Длина: + + + Character Types + Виды символов + + + Upper Case Letters + Заглавные буквы + + + A-Z + A-Z + + + Lower Case Letters + Строчные буквы + + + a-z + a-z + + + Numbers + Цифры + + + 0-9 + 0-9 + + + Special Characters + Особые символы + + + /*_& ... + /*_& ... + + + Exclude look-alike characters + Исключить выглядящие похожие символы + + + Ensure that the password contains characters from every group + Убедитесь, что пароль содержит символы всех видов + + + Accept + Принять + + KeePass1OpenWidget @@ -872,7 +1029,7 @@ Do you want to save it anyway? Wrong key or database file is corrupt. - + Неверный ключ или файл хранилища повреждён. @@ -911,8 +1068,8 @@ This is a one-way migration. You won't be able to open the imported databas Неисправимая ошибка в процессе тестирования криптографических функций. - KeePassX - Error - KeePassX — Ошибка + KeePassXC - Error + KeePassXC — Ошибка @@ -921,102 +1078,14 @@ This is a one-way migration. You won't be able to open the imported databas Database Хранилище - - Recent databases - Недавние хранилища - - - Help - Помощь - - - Entries - Записи - - - Copy attribute to clipboard - Скопировать атрибут в буфер обмена - - - Groups - Группы - - - View - Вид - - - Quit - Выход - - - About - О программе - Open database Открыть хранилище - - Save database - Сохранить хранилище - - - Close database - Закрыть хранилище - - - New database - Новое хранилище - - - Add new entry - Добавить новую запись - - - View/Edit entry - Посмотреть/редактировать запись - - - Delete entry - Удалить запись - - - Add new group - Добавить новую группу - - - Edit group - Редактировать группу - - - Delete group - Удалить группу - - - Save database as - Сохранить хранилище как - - - Change master key - Сменить мастер-пароль - Database settings Параметры хранилища - - Import KeePass 1 database - Импортировать хранилище KeePass 1 - - - Clone entry - Клонировать запись - - - Find - Найти - Copy username to clipboard Скопировать имя пользователя в буфер обмена @@ -1029,30 +1098,6 @@ This is a one-way migration. You won't be able to open the imported databas Settings Настройки - - Perform Auto-Type - Произвести автоввод - - - Open URL - Открыть URL - - - Lock databases - Заблокировать хранилище - - - Title - Заголовок - - - URL - URL - - - Notes - Примечания - Show toolbar Показать панель инструментов @@ -1069,25 +1114,9 @@ This is a one-way migration. You won't be able to open the imported databas Tools Инструменты - - Copy username - Скопировать имя пользователя - - - Copy password - Скопировать пароль - - - Export to CSV file - Экспортировать в файл CSV - - - Repair database - Восстановление хранилища - KeePass 2 Database - + Хранилище KeePass 2 All files @@ -1103,7 +1132,265 @@ This is a one-way migration. You won't be able to open the imported databas Writing the database failed. - + Не удалось записать хранилище. + + + &Recent databases + Недавние хранилища + + + He&lp + Помощь + + + E&ntries + &Записи + + + Copy att&ribute to clipboard + Скопировать атрибут в буфер обмена + + + &Groups + Группы + + + &View + Вид + + + &Quit + Выход + + + &About + О программе + + + &Open database + Открыть хранилище + + + &Save database + Сохранить хранилище + + + &Close database + Закрыть хранилище + + + &New database + Новое хранилище + + + Merge from KeePassX database + Объединить из хранилища KeePassX + + + &Add new entry + Добавить новую запись + + + &View/Edit entry + Посмотреть/редактировать запись + + + &Delete entry + Удалить запись + + + &Add new group + Добавить новую группу + + + &Edit group + Редактировать группу + + + &Delete group + Удалить группу + + + Sa&ve database as + Сохранить хранилище как + + + Change &master key + Изменить мастер-пароль + + + &Database settings + Параметры хранилища + + + &Import KeePass 1 database + Импортировать хранилище KeePass 1 + + + &Clone entry + Клонировать запись + + + &Find + Найти + + + Copy &username + Скопировать имя пользователя + + + Cop&y password + Скопировать пароль + + + &Settings + Настройки + + + &Perform Auto-Type + Произвести автоввод + + + &Open URL + Открыть URL + + + &Lock databases + Заблокировать хранилище + + + &Title + Заголовок + + + &URL + URL + + + &Notes + Примечания + + + &Export to CSV file + Экспортировать в файл CSV + + + Re&pair database + Восстановление хранилища + + + Password Generator + Генератор паролей + + + + OptionDialog + + Dialog + Диалог + + + General + Общие + + + Sh&ow a notification when credentials are requested + Показывать уведомление при запросе данных для входа + + + &Return only best matching entries for an URL instead +of all entries for the whole domain + Возвращать только наиболее совпавшие с URL записи, а не все записи для домена + + + &Match URL schemes +Only entries with the same scheme (http://, https://, ftp://, ...) are returned + Совпадение со схемой URL +Возвращать только записи с соответствующей схемой (http://, https://, ftp://, ...) + + + Sort matching entries by &username + Сортировать совпавшие записи по &имени пользователя + + + R&emove all shared encryption-keys from active database + Удалить все общие ключи шифрования из активного хранилища + + + Re&move all stored permissions from entries in active database + Удалить все сохраненные права доступа из активного хранилища + + + Password generator + Генератор паролей + + + Advanced + Расширенные + + + Activate the following only, if you know what you are doing! + Включайте эти настройки только если знаете что делаете! + + + Always allow &access to entries + Всегда разрешать доступ к записям + + + Always allow &updating entries + Всегда разрешать обновление записей + + + Searc&h in all opened databases for matching entries + Искать соответствующие записи по всем открытым хранилищам + + + Only the selected database has to be connected with a client! + Только выбранное хранилище должно быть соединено с клиентом! + + + &Return also advanced string fields which start with "KPH: " + Возвращать дополнительные строковые поля, начинающиеся с "KPH: " + + + Automatic creates or updates are not supported for string fields! + Автоматическое создание или обновление не поддерживается строковыми полями! + + + HTTP Port: + Порт HTTP: + + + Default port: 19455 + Порт по умолчанию: 19455 + + + Re&quest to unlock the database if it is locked + Запрашивать разблокировку хранилища, если оно заблокировано + + + Sort &matching entries by title + Сортировать совпавшие записи по названию + + + Enable KeepassXC HTTP protocol +This is required for accessing your databases from ChromeIPass or PassIFox + Включить протокол KeepassXC HTTP +Это требуется для доступа к хранилищам из ChromeIPass или PassIFox + + + KeePassXC will listen to this port on 127.0.0.1 + KeePassXC будет слушать указнный порт на 127.0.0.1 + + + Cannot bind to privileged ports + Не удается выполнить привязку к привилегированным портам + + + Cannot bind to privileged ports below 1024! +Using default port 19455. + Не удается привязать к привилегированные порты ниже 1024! +Используется порт по умолчанию 19455. @@ -1112,10 +1399,6 @@ This is a one-way migration. You won't be able to open the imported databas Password: Пароль: - - Length: - Длина: - Character Types Виды символов @@ -1140,71 +1423,72 @@ This is a one-way migration. You won't be able to open the imported databas Exclude look-alike characters Исключить похожие символы - - Ensure that the password contains characters from every group - Убедитесь, что пароль содержит символы всех видов - Accept Принять - - - QCommandLineParser - Displays version information. - Показывает информацию о версии. + %p% + %p% - Displays this help. - Показывает эту справку. + strength + надёжность - Unknown option '%1'. - Неизвестная опция «%1». + entropy + энтропия - Unknown options: %1. - Неизвестные опции %1. + &Length: + Длина: - Missing value after '%1'. - Пропущено значение после «%1». + Pick characters from every group + Выберете символы из каждой группы - Unexpected value after '%1'. - Непредвиденное значение после «%1». + Generate + Генерировать - [options] - [опции] + Close + Закрыть - Usage: %1 - Использование: %1 + Apply + Применить - Options: - Опции: + Entropy: %1 bit + Энтропия: %1 бит - Arguments: - Аргументы: + Password Quality: %1 + Качество пароля: %1 + + + Poor + Плохой + + + Weak + Слабый + + + Good + Хороший + + + Excellent + Отличный - QSaveFile + QObject - Existing file %1 is not writable - Существующий файл %1 непригоден для записи - - - Writing canceled by application - Запись отменена приложением - - - Partial write. Partition full? - Частичная запись. Раздел переполнен? + Http + Http @@ -1244,20 +1528,110 @@ This is a one-way migration. You won't be able to open the imported databas SearchWidget - Find: - Найти: - - - Case sensitive + Case Sensitive Чувствительно к регистру - Current group - Текущая группа + Search + Поиск - Root group - Корневая группа + Find + Найти + + + Clear + Очистить + + + + Service + + A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it? + Общий ключ шифрования с именем "%1" уже существует. +Вы хотите его перезаписать? + + + Do you want to update the information in %1 - %2? + Вы хотите обновить информацию в %1 - %2? + + + The active database is locked! +Please unlock the selected database or choose another one which is unlocked. + Активное хранилище заблокировано! +Разблокируйте выбранное хранилище или выберите другое, незаблокированное. + + + Successfully removed %1 encryption-%2 from KeePassX/Http Settings. + Успешно удалено %1 шифрование-%2 из настроек KeePassXC/Http. + + + No shared encryption-keys found in KeePassHttp Settings. + Не найдено общих ключей шифрования в настройках KeePassHttp. + + + The active database does not contain an entry of KeePassHttp Settings. + Активное хранилизе не содержит записей настроек KeePassHttp. + + + Removing stored permissions... + Удаляются сохранённые права доступа... + + + Abort + Отмена + + + Successfully removed permissions from %1 %2. + Права доступа из %1 %2 успешно удалены. + + + The active database does not contain an entry with permissions. + Активное хранилище не содержит записей с назначенными правами доступа. + + + KeePassXC: New key association request + KeePassXC: Запрос на ассоциацию нового ключа + + + You have received an association request for the above key. +If you would like to allow it access to your KeePassXC database +give it a unique name to identify and accept it. + Вы получили запрос на ассоциацию указанного ключа. +Если вы хотите разрешить доступ к вашему хранилищу KeePassXC, дайте ему уникальное имя и примите запрос. + + + KeePassXC: Overwrite existing key? + KeePassXC: Перезаписать существующий ключ? + + + KeePassXC: Update Entry + KeePassXC: Обновить запись + + + KeePassXC: Database locked! + KeePassXC: Хранилище заблокировано! + + + KeePassXC: Removed keys from database + KeePassXC: Ключи удалены из хранилища + + + KeePassXC: No keys found + KeePassXC: Ключи не найдены + + + KeePassXC: Settings not available! + KeePassXC% Настройки недоступны! + + + KeePassXC: Removed permissions + KeePassXC: Права доступа удалены + + + KeePassXC: No entry with permissions found! + KeePassXC: Не найдено записей с назначенными правами доступа! @@ -1281,10 +1655,6 @@ This is a one-way migration. You won't be able to open the imported databas Remember last databases Помнить последнее хранилище - - Open previous databases on startup - Открывать предыдущее хранилище при запуске - Automatically save on exit Автоматически сохранять при выходе @@ -1326,12 +1696,20 @@ This is a one-way migration. You won't be able to open the imported databas Запоминать последние файл-ключи - Hide window to system tray instead of App Exit - + Load previous databases on startup + Открывать предыдущие хранилища при запуске - Hide window to system tray on App start - + Automatically reload the database when modified externally + Автоматически перечитывать хранилище при его изменении внешними приложениями + + + Hide window to system tray instead of app exit + Прятать окно в системный лоток вместо выхода + + + Minimize window at application startup + Сворачивать окно при запуске приложения @@ -1356,6 +1734,14 @@ This is a one-way migration. You won't be able to open the imported databas Always ask before performing auto-type Всегда спрашивать перед тем, как производить автоввод + + Lock databases after minimizing the window + Заблокировать хранилище при сворачивании окна + + + Don't require password repeat when it is visible + Не требовать поворный ввод пароля когда он показывается + UnlockDatabaseWidget @@ -1373,14 +1759,6 @@ This is a one-way migration. You won't be able to open the imported databas main - - KeePassX - cross-platform password manager - KeePassX — кросс-платформенный менеджер паролей - - - filename of the password database to open (*.kdbx) - имя файла открываемого хранилища паролей (*.kdbx) - path to a custom config file путь к своему файлу настроек @@ -1389,5 +1767,17 @@ This is a one-way migration. You won't be able to open the imported databas key file of the database файл-ключ хранилища + + filename(s) of the password database(s) to open (*.kdbx) + имена(имя) файлов хранилищ(а) для открытия (*.kdbx) + + + KeePassXC - cross-platform password manager + KeePassXC — кросс-платформенный менеджер паролей + + + read password of the database from stdin + читать пароли хранилища из стандартного ввода "stdin" + \ No newline at end of file