[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1107669: marked as done (unblock: krdp/6.3.5-1)



Your message dated Thu, 12 Jun 2025 08:28:39 +0000
with message-id <E1uPdId-00FQsM-2K@respighi.debian.org>
and subject line unblock krdp
has caused the Debian Bug report #1107669,
regarding unblock: krdp/6.3.5-1
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
1107669: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1107669
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
X-Debbugs-Cc: krdp@packages.debian.org, Debian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
Control: affects -1 + src:krdp
User: release.debian.org@packages.debian.org
Usertags: unblock

Dear Release Team,

please unblock package krdp.

[ Reason ]
It contains the following changes:
* New upstream release (6.3.5).
  - Translation fixes.
* Backport upstream commits:
  - Fix mouse wheel scroll triggering screen hot corners when using xfreerdp
  under Wayland.
  - Increase default video stream quality to make it readable.
  - Use new kpipewire asynchronous methods, tentative fix for issues when
  restoring sessions.
  - Support horizontal wheel event. (kde#496747)

[ Tests ]
Tested that basic remote connection feature works.

[ Risks ]
Only backport of upstream commits that apply cleanly. Further fixes can
easily be backported or the changes reverted.

[ Checklist ]
  [x] all changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in testing


Thanks!


unblock krdp/6.3.5-1
diff -Nru krdp-6.3.4/CMakeLists.txt krdp-6.3.5/CMakeLists.txt
--- krdp-6.3.4/CMakeLists.txt	2025-04-02 05:36:18.000000000 +0200
+++ krdp-6.3.5/CMakeLists.txt	2025-05-06 19:57:09.000000000 +0200
@@ -1,7 +1,7 @@
 # SPDX-FileCopyrightText: 2023 Arjen Hiemstra <ahiemstra@heimr.nl>
 # SPDX-License-Identifier: BSD-2-Clause
 
-set(PROJECT_VERSION "6.3.4")
+set(PROJECT_VERSION "6.3.5")
 
 cmake_minimum_required(VERSION 3.16)
 
diff -Nru krdp-6.3.4/debian/changelog krdp-6.3.5/debian/changelog
--- krdp-6.3.4/debian/changelog	2025-04-03 01:01:20.000000000 +0200
+++ krdp-6.3.5/debian/changelog	2025-05-19 23:39:08.000000000 +0200
@@ -1,3 +1,17 @@
+krdp (6.3.5-1) unstable; urgency=medium
+
+  [ Aurélien COUDERC ]
+  * New upstream release (6.3.5).
+  * Backport upstream commits:
+    - Fix mouse wheel scroll triggering screen hot corners when using xfreerdp
+    under Wayland.
+    - Increase default video stream quality to make it readable.
+    - Use new kpipewire asynchronous methods, tentative fix for issues when
+    restoring sessions.
+    - Support horizontal wheel event. (kde#496747)
+
+ -- Aurélien COUDERC <coucouf@debian.org>  Mon, 19 May 2025 23:39:08 +0200
+
 krdp (6.3.4-1) unstable; urgency=medium
 
   [ Patrick Franz ]
diff -Nru krdp-6.3.4/debian/patches/series krdp-6.3.5/debian/patches/series
--- krdp-6.3.4/debian/patches/series	2025-02-12 01:38:00.000000000 +0100
+++ krdp-6.3.5/debian/patches/series	2025-05-19 23:39:08.000000000 +0200
@@ -1 +1,6 @@
 upstream_mr_69_add-support-for-freerdp3.patch
+upstream_18539a15_Fix-mouse-wheel-scrolling-issue.patch
+upstream_f3b3199f_kcm-Set-new-quality-default-to-75-minimum-quality-to-50.patch
+upstream_2a193038_AbstractSession-Fix-deprecated-setActive-calls.patch
+upstream_31faf21d_SessionController-Start-the-initialization-session.patch
+upstream_e2b88aaa_Support-horizontal-wheel-event.patch
diff -Nru krdp-6.3.4/debian/patches/upstream_18539a15_Fix-mouse-wheel-scrolling-issue.patch krdp-6.3.5/debian/patches/upstream_18539a15_Fix-mouse-wheel-scrolling-issue.patch
--- krdp-6.3.4/debian/patches/upstream_18539a15_Fix-mouse-wheel-scrolling-issue.patch	1970-01-01 01:00:00.000000000 +0100
+++ krdp-6.3.5/debian/patches/upstream_18539a15_Fix-mouse-wheel-scrolling-issue.patch	2025-05-13 17:59:27.000000000 +0200
@@ -0,0 +1,81 @@
+From 18539a157a51e7e71552c328ca45766a3dedc907 Mon Sep 17 00:00:00 2001
+From: Jack Xu <jackyzy823@gmail.com>
+Date: Mon, 14 Apr 2025 09:38:08 +0000
+Subject: [PATCH] Fix mouse wheel scrolling issue
+
+Currently, mouse wheel scrolling via KRDP triggers screen corners when using xfreerdp under Wayland environment.
+---
+ src/InputHandler.cpp              | 12 ++++++------
+ src/PlasmaScreencastV1Session.cpp |  2 +-
+ src/PortalSession.cpp             |  2 +-
+ 3 files changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/src/InputHandler.cpp b/src/InputHandler.cpp
+index d829295..12b8d7e 100644
+--- a/src/InputHandler.cpp
++++ b/src/InputHandler.cpp
+@@ -124,18 +124,18 @@ bool InputHandler::mouseEvent(uint16_t x, uint16_t y, uint16_t flags)
+         }
+         axis *= flags & PTR_FLAGS_WHEEL_NEGATIVE ? 1 : -1;
+         auto event =
+-            std::make_shared<QWheelEvent>(QPointF{}, position, QPoint{}, QPoint{0, axis}, Qt::NoButton, Qt::KeyboardModifiers{}, Qt::NoScrollPhase, false);
++            std::make_shared<QWheelEvent>(position, QPointF{}, QPoint{}, QPoint{0, axis}, Qt::NoButton, Qt::KeyboardModifiers{}, Qt::NoScrollPhase, false);
+         Q_EMIT inputEvent(event);
+         return true;
+     }
+ 
+     std::shared_ptr<QMouseEvent> event;
+     if (flags & PTR_FLAGS_DOWN) {
+-        event = std::make_shared<QMouseEvent>(QEvent::MouseButtonPress, QPointF{}, position, button, button, Qt::NoModifier);
++        event = std::make_shared<QMouseEvent>(QEvent::MouseButtonPress, position, QPointF{}, button, button, Qt::NoModifier);
+     } else if (flags & PTR_FLAGS_MOVE) {
+-        event = std::make_shared<QMouseEvent>(QEvent::MouseMove, QPointF{}, position, button, button, Qt::NoModifier);
++        event = std::make_shared<QMouseEvent>(QEvent::MouseMove, position, QPointF{}, button, button, Qt::NoModifier);
+     } else {
+-        event = std::make_shared<QMouseEvent>(QEvent::MouseButtonRelease, QPointF{}, position, button, button, Qt::NoModifier);
++        event = std::make_shared<QMouseEvent>(QEvent::MouseButtonRelease, position, QPointF{}, button, button, Qt::NoModifier);
+     }
+     Q_EMIT inputEvent(event);
+ 
+@@ -159,10 +159,10 @@ bool InputHandler::extendedMouseEvent(uint16_t x, uint16_t y, uint16_t flags)
+ 
+     std::shared_ptr<QMouseEvent> event;
+     if (flags & PTR_XFLAGS_DOWN) {
+-        event = std::make_shared<QMouseEvent>(QEvent::MouseButtonPress, QPointF{}, QPointF(x, y), button, button, Qt::KeyboardModifiers{});
++        event = std::make_shared<QMouseEvent>(QEvent::MouseButtonPress, QPointF(x, y), QPointF{}, button, button, Qt::KeyboardModifiers{});
+ 
+     } else {
+-        event = std::make_shared<QMouseEvent>(QEvent::MouseButtonRelease, QPointF{}, QPointF(x, y), button, button, Qt::KeyboardModifiers{});
++        event = std::make_shared<QMouseEvent>(QEvent::MouseButtonRelease, QPointF(x, y), QPointF{}, button, button, Qt::KeyboardModifiers{});
+     }
+     Q_EMIT inputEvent(event);
+ 
+diff --git a/src/PlasmaScreencastV1Session.cpp b/src/PlasmaScreencastV1Session.cpp
+index c6b8f4c..f13934f 100644
+--- a/src/PlasmaScreencastV1Session.cpp
++++ b/src/PlasmaScreencastV1Session.cpp
+@@ -221,7 +221,7 @@ void PlasmaScreencastV1Session::sendEvent(const std::shared_ptr<QEvent> &event)
+     }
+     case QEvent::MouseMove: {
+         auto me = std::static_pointer_cast<QMouseEvent>(event);
+-        auto position = me->globalPosition();
++        auto position = me->position();
+         auto logicalPosition = QPointF{(position.x() / size().width()) * logicalSize().width(), (position.y() / size().height()) * logicalSize().height()};
+         d->remoteInterface->pointer_motion_absolute(logicalPosition.x(), logicalPosition.y());
+         break;
+diff --git a/src/PortalSession.cpp b/src/PortalSession.cpp
+index 19501cb..4a329a0 100644
+--- a/src/PortalSession.cpp
++++ b/src/PortalSession.cpp
+@@ -152,7 +152,7 @@ void PortalSession::sendEvent(const std::shared_ptr<QEvent> &event)
+     }
+     case QEvent::MouseMove: {
+         auto me = std::static_pointer_cast<QMouseEvent>(event);
+-        auto position = me->globalPosition();
++        auto position = me->position();
+         auto logicalPosition = QPointF{(position.x() / size().width()) * logicalSize().width(), (position.y() / size().height()) * logicalSize().height()};
+         d->remoteInterface->NotifyPointerMotionAbsolute(d->sessionPath, QVariantMap{}, encodedStream->nodeId(), logicalPosition.x(), logicalPosition.y());
+         break;
+-- 
+GitLab
+
diff -Nru krdp-6.3.4/debian/patches/upstream_2a193038_AbstractSession-Fix-deprecated-setActive-calls.patch krdp-6.3.5/debian/patches/upstream_2a193038_AbstractSession-Fix-deprecated-setActive-calls.patch
--- krdp-6.3.4/debian/patches/upstream_2a193038_AbstractSession-Fix-deprecated-setActive-calls.patch	1970-01-01 01:00:00.000000000 +0100
+++ krdp-6.3.5/debian/patches/upstream_2a193038_AbstractSession-Fix-deprecated-setActive-calls.patch	2025-05-19 23:39:08.000000000 +0200
@@ -0,0 +1,54 @@
+From 2a19303854603370ab13b8969943995108d93da1 Mon Sep 17 00:00:00 2001
+From: Akseli Lahtinen <akselmo@akselmo.dev>
+Date: Thu, 1 May 2025 18:04:26 +0300
+Subject: [PATCH] AbstractSession: Fix deprecated setActive calls
+
+setActive is deprecated and seems to have caused issues with restoring
+sessions. Use start and stop here instead.
+
+Also move the Q_EMIT started() after the start method.
+---
+ src/AbstractSession.cpp | 12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+diff --git a/src/AbstractSession.cpp b/src/AbstractSession.cpp
+index 2b58025..22aa596 100644
+--- a/src/AbstractSession.cpp
++++ b/src/AbstractSession.cpp
+@@ -38,7 +38,7 @@ AbstractSession::AbstractSession(Server *server)
+ AbstractSession::~AbstractSession()
+ {
+     if (d->encodedStream) {
+-        d->encodedStream->setActive(false);
++        d->encodedStream->stop();
+     }
+ }
+ 
+@@ -89,7 +89,11 @@ void AbstractSession::setStreamingEnabled(bool enable)
+ {
+     d->enabled = enable;
+     if (d->encodedStream) {
+-        d->encodedStream->setActive(enable && d->started);
++        if (enable && d->started) {
++            d->encodedStream->start();
++        } else {
++            d->encodedStream->stop();
++        }
+     }
+ }
+ 
+@@ -136,8 +140,10 @@ void AbstractSession::setStarted(bool s)
+ {
+     d->started = s;
+     if (s) {
++        if (d->enabled) {
++            d->encodedStream->start();
++        }
+         Q_EMIT started();
+-        d->encodedStream->setActive(d->enabled);
+     }
+ }
+ 
+-- 
+GitLab
+
diff -Nru krdp-6.3.4/debian/patches/upstream_31faf21d_SessionController-Start-the-initialization-session.patch krdp-6.3.5/debian/patches/upstream_31faf21d_SessionController-Start-the-initialization-session.patch
--- krdp-6.3.4/debian/patches/upstream_31faf21d_SessionController-Start-the-initialization-session.patch	1970-01-01 01:00:00.000000000 +0100
+++ krdp-6.3.5/debian/patches/upstream_31faf21d_SessionController-Start-the-initialization-session.patch	2025-05-19 23:39:08.000000000 +0200
@@ -0,0 +1,25 @@
+From 31faf21dfada9adddd31231b12fae32dc9d23707 Mon Sep 17 00:00:00 2001
+From: Akseli Lahtinen <akselmo@akselmo.dev>
+Date: Thu, 1 May 2025 18:13:06 +0300
+Subject: [PATCH] SessionController: Start the initialization session
+
+The initialization session was never ran here
+---
+ server/SessionController.cpp | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/server/SessionController.cpp b/server/SessionController.cpp
+index f0a4b00..91fd1ba 100644
+--- a/server/SessionController.cpp
++++ b/server/SessionController.cpp
+@@ -110,6 +110,7 @@ SessionController::SessionController(KRdp::Server *server, SessionType sessionTy
+         // reconnection.
+         connect(m_initializationSession.get(), &KRdp::AbstractSession::started, this, cleanup);
+         connect(m_initializationSession.get(), &KRdp::AbstractSession::error, this, cleanup);
++        m_initializationSession->start();
+     }
+ }
+ 
+-- 
+GitLab
+
diff -Nru krdp-6.3.4/debian/patches/upstream_e2b88aaa_Support-horizontal-wheel-event.patch krdp-6.3.5/debian/patches/upstream_e2b88aaa_Support-horizontal-wheel-event.patch
--- krdp-6.3.4/debian/patches/upstream_e2b88aaa_Support-horizontal-wheel-event.patch	1970-01-01 01:00:00.000000000 +0100
+++ krdp-6.3.5/debian/patches/upstream_e2b88aaa_Support-horizontal-wheel-event.patch	2025-05-19 23:39:08.000000000 +0200
@@ -0,0 +1,83 @@
+From e2b88aaa6f9cb8c69890e7cf61d1e231eb105b41 Mon Sep 17 00:00:00 2001
+From: Jack Xu <jackyzy823@gmail.com>
+Date: Sun, 1 Dec 2024 17:46:47 +0800
+Subject: [PATCH] Support horizontal wheel event
+
+---
+ src/InputHandler.cpp              | 15 +++++++++++----
+ src/PlasmaScreencastV1Session.cpp |  8 +++++++-
+ src/PortalSession.cpp             |  8 +++++++-
+ 3 files changed, 25 insertions(+), 6 deletions(-)
+
+diff --git a/src/InputHandler.cpp b/src/InputHandler.cpp
+index 12b8d7e..e387e55 100644
+--- a/src/InputHandler.cpp
++++ b/src/InputHandler.cpp
+@@ -117,15 +117,22 @@ bool InputHandler::mouseEvent(uint16_t x, uint16_t y, uint16_t flags)
+         button = Qt::MiddleButton;
+     }
+ 
+-    if (flags & PTR_FLAGS_WHEEL || flags & PTR_FLAGS_WHEEL_NEGATIVE) {
++    if (flags & PTR_FLAGS_WHEEL || flags & PTR_FLAGS_HWHEEL) {
+         auto axis = flags & WheelRotationMask;
+         if (axis & PTR_FLAGS_WHEEL_NEGATIVE) {
+             axis = (~axis & WheelRotationMask) + 1;
+         }
+         axis *= flags & PTR_FLAGS_WHEEL_NEGATIVE ? 1 : -1;
+-        auto event =
+-            std::make_shared<QWheelEvent>(position, QPointF{}, QPoint{}, QPoint{0, axis}, Qt::NoButton, Qt::KeyboardModifiers{}, Qt::NoScrollPhase, false);
+-        Q_EMIT inputEvent(event);
++        if (flags & PTR_FLAGS_WHEEL) {
++            auto event =
++                std::make_shared<QWheelEvent>(position, QPointF{}, QPoint{}, QPoint{0, axis}, Qt::NoButton, Qt::KeyboardModifiers{}, Qt::NoScrollPhase, false);
++            Q_EMIT inputEvent(event);
++        }
++        if (flags & PTR_FLAGS_HWHEEL) {
++            auto event =
++                std::make_shared<QWheelEvent>(position, QPointF{}, QPoint{}, QPoint{-axis, 0}, Qt::NoButton, Qt::KeyboardModifiers{}, Qt::NoScrollPhase, false);
++            Q_EMIT inputEvent(event);
++        }
+         return true;
+     }
+ 
+diff --git a/src/PlasmaScreencastV1Session.cpp b/src/PlasmaScreencastV1Session.cpp
+index 835bb87..2267f2b 100644
+--- a/src/PlasmaScreencastV1Session.cpp
++++ b/src/PlasmaScreencastV1Session.cpp
+@@ -228,7 +228,13 @@ void PlasmaScreencastV1Session::sendEvent(const std::shared_ptr<QEvent> &event)
+     }
+     case QEvent::Wheel: {
+         auto we = std::static_pointer_cast<QWheelEvent>(event);
+-        d->remoteInterface->axis(0, we->angleDelta().y() / 120);
++        auto delta = we->angleDelta();
++        if (delta.y() != 0) {
++            d->remoteInterface->axis(WL_POINTER_AXIS_VERTICAL_SCROLL, delta.y() / 120);
++        }
++        if (delta.x() != 0) {
++            d->remoteInterface->axis(WL_POINTER_AXIS_HORIZONTAL_SCROLL, delta.x() / 120);
++        }
+         break;
+     }
+     case QEvent::KeyPress:
+diff --git a/src/PortalSession.cpp b/src/PortalSession.cpp
+index 5218572..cbe4ff0 100644
+--- a/src/PortalSession.cpp
++++ b/src/PortalSession.cpp
+@@ -157,7 +157,13 @@ void PortalSession::sendEvent(const std::shared_ptr<QEvent> &event)
+     }
+     case QEvent::Wheel: {
+         auto we = std::static_pointer_cast<QWheelEvent>(event);
+-        d->remoteInterface->NotifyPointerAxisDiscrete(d->sessionPath, QVariantMap{}, 0, we->angleDelta().y() / 120);
++        auto delta = we->angleDelta();
++        if (delta.y() != 0) {
++            d->remoteInterface->NotifyPointerAxisDiscrete(d->sessionPath, QVariantMap{}, 0 /* Vertical */, delta.y() / 120);
++        }
++        if (delta.x() != 0) {
++            d->remoteInterface->NotifyPointerAxisDiscrete(d->sessionPath, QVariantMap{}, 1 /* Horizontal */, delta.x() / 120);
++        }
+         break;
+     }
+     case QEvent::KeyPress:
+-- 
+GitLab
+
diff -Nru krdp-6.3.4/debian/patches/upstream_f3b3199f_kcm-Set-new-quality-default-to-75-minimum-quality-to-50.patch krdp-6.3.5/debian/patches/upstream_f3b3199f_kcm-Set-new-quality-default-to-75-minimum-quality-to-50.patch
--- krdp-6.3.4/debian/patches/upstream_f3b3199f_kcm-Set-new-quality-default-to-75-minimum-quality-to-50.patch	1970-01-01 01:00:00.000000000 +0100
+++ krdp-6.3.5/debian/patches/upstream_f3b3199f_kcm-Set-new-quality-default-to-75-minimum-quality-to-50.patch	2025-05-19 23:39:08.000000000 +0200
@@ -0,0 +1,48 @@
+From f3b3199fd49136e742d92654e550740e1eea7556 Mon Sep 17 00:00:00 2001
+From: Akseli Lahtinen <akselmo@akselmo.dev>
+Date: Tue, 29 Apr 2025 16:39:14 +0300
+Subject: [PATCH] kcm: Set new quality default to 75, minimum quality to 50
+
+The qualities below 50 are rather poor and any gained responsiviness
+does not really help when you can't see what you're doing.
+
+Instead, set the minimum quality value to 50, where it's still legible.
+Set default quality to 75, which is around middle of the slider, and
+should work well for most cases.
+---
+ src/kcm/krdpserversettings.kcfg | 2 +-
+ src/kcm/ui/main.qml             | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/kcm/krdpserversettings.kcfg b/src/kcm/krdpserversettings.kcfg
+index 8d840ba..1961290 100644
+--- a/src/kcm/krdpserversettings.kcfg
++++ b/src/kcm/krdpserversettings.kcfg
+@@ -26,7 +26,7 @@ SPDX-License-Identifier: BSD-2-Clause
+     </entry>
+     <entry name="Quality" type="Int">
+       <label>The quality of the video stream</label>
+-      <default>50</default>
++      <default>75</default>
+     </entry>
+     <entry name="Users" type="StringList">
+       <label>Users allowed to login, passwords are stored in KWallet</label>
+diff --git a/src/kcm/ui/main.qml b/src/kcm/ui/main.qml
+index 39d82f9..1ee0312 100644
+--- a/src/kcm/ui/main.qml
++++ b/src/kcm/ui/main.qml
+@@ -221,9 +221,9 @@ KCM.ScrollViewKCM {
+             QQC2.Slider {
+                 id: qualitySlider
+                 Layout.fillWidth: true
+-                from: 0
++                from: 50
+                 to: 100
+-                stepSize: 1
++                stepSize: 5
+                 value: settings.quality
+                 onMoved: {
+                     settings.quality = value;
+-- 
+GitLab
+
diff -Nru krdp-6.3.4/po/fi/kcm_krdpserver.po krdp-6.3.5/po/fi/kcm_krdpserver.po
--- krdp-6.3.4/po/fi/kcm_krdpserver.po	2025-04-02 05:36:18.000000000 +0200
+++ krdp-6.3.5/po/fi/kcm_krdpserver.po	2025-05-06 19:57:09.000000000 +0200
@@ -1,6 +1,6 @@
 # Copyright (C) 2024 This file is copyright:
 # This file is distributed under the same license as the krdp package.
-# SPDX-FileCopyrightText: 2024 Tommi Nieminen <translator@legisign.org>
+# SPDX-FileCopyrightText: 2024, 2025 Tommi Nieminen <translator@legisign.org>
 #
 msgid ""
 msgstr ""
@@ -15,7 +15,7 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Lokalize 24.08.2\n"
+"X-Generator: Lokalize 23.08.5\n"
 
 #. i18n: ectx: label, entry (ListenPort), group (General)
 #: krdpserversettings.kcfg:14
diff -Nru krdp-6.3.4/po/ko/kcm_krdpserver.po krdp-6.3.5/po/ko/kcm_krdpserver.po
--- krdp-6.3.4/po/ko/kcm_krdpserver.po	2025-04-02 05:36:18.000000000 +0200
+++ krdp-6.3.5/po/ko/kcm_krdpserver.po	2025-05-06 19:57:09.000000000 +0200
@@ -1,6 +1,6 @@
 # Copyright (C) 2024 This file is copyright:
 # This file is distributed under the same license as the krdp package.
-# SPDX-FileCopyrightText: 2024 Shinjo Park <kde@peremen.name>
+# SPDX-FileCopyrightText: 2024, 2025 Shinjo Park <kde@peremen.name>
 #
 msgid ""
 msgstr ""

--- End Message ---
--- Begin Message ---
Unblocked.

--- End Message ---

Reply to: