From 2ea0708c0e0f35a6a2d3218ae67e898de3eecbca2095be13d7a48aece9042809 Mon Sep 17 00:00:00 2001 From: Christophe Giboudeaux Date: Wed, 2 Sep 2020 06:58:02 +0000 Subject: [PATCH] KDE Applications 20.08.1 - release on Thursday OBS-URL: https://build.opensuse.org/package/show/KDE:Applications/krfb?expand=0&rev=136 --- 0001-Declare-and-use-logging-categories.patch | 159 +++++++++--------- krfb-20.08.0.tar.xz | 3 - krfb-20.08.0.tar.xz.sig | 11 -- krfb-20.08.1.tar.xz | 3 + krfb-20.08.1.tar.xz.sig | 11 ++ krfb.changes | 11 ++ krfb.spec | 2 +- 7 files changed, 104 insertions(+), 96 deletions(-) delete mode 100644 krfb-20.08.0.tar.xz delete mode 100644 krfb-20.08.0.tar.xz.sig create mode 100644 krfb-20.08.1.tar.xz create mode 100644 krfb-20.08.1.tar.xz.sig diff --git a/0001-Declare-and-use-logging-categories.patch b/0001-Declare-and-use-logging-categories.patch index 82d329a..26ead02 100644 --- a/0001-Declare-and-use-logging-categories.patch +++ b/0001-Declare-and-use-logging-categories.patch @@ -23,11 +23,11 @@ Adds the following logging categories: krfb/rfbservermanager.cpp | 1 - 13 files changed, 78 insertions(+), 47 deletions(-) -diff --git a/CMakeLists.txt b/CMakeLists.txt -index aadd4b7..aa2b7b7 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -20,6 +20,7 @@ include(KDECompilerSettings NO_POLICY_SCOPE) +Index: krfb-20.08.1/CMakeLists.txt +=================================================================== +--- krfb-20.08.1.orig/CMakeLists.txt 2020-09-02 07:05:32.869344897 +0200 ++++ krfb-20.08.1/CMakeLists.txt 2020-09-02 07:05:40.725370922 +0200 +@@ -20,6 +20,7 @@ include(ECMInstallIcons) include(ECMAddAppIcon) include(ECMSetupVersion) @@ -35,7 +35,7 @@ index aadd4b7..aa2b7b7 100644 include(FeatureSummary) include(CheckIncludeFile) -@@ -104,6 +105,12 @@ add_subdirectory(framebuffers) +@@ -104,6 +105,12 @@ add_subdirectory(doc) add_subdirectory(icons) @@ -48,11 +48,11 @@ index aadd4b7..aa2b7b7 100644 feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES) ki18n_install(po) if (KF5DocTools_FOUND) -diff --git a/framebuffers/qt/CMakeLists.txt b/framebuffers/qt/CMakeLists.txt -index 2629098..9019aad 100644 ---- a/framebuffers/qt/CMakeLists.txt -+++ b/framebuffers/qt/CMakeLists.txt -@@ -7,6 +7,14 @@ set (krfb_framebuffer_qt_SRCS +Index: krfb-20.08.1/framebuffers/qt/CMakeLists.txt +=================================================================== +--- krfb-20.08.1.orig/framebuffers/qt/CMakeLists.txt 2020-09-02 07:05:32.869344897 +0200 ++++ krfb-20.08.1/framebuffers/qt/CMakeLists.txt 2020-09-02 07:05:40.725370922 +0200 +@@ -7,6 +7,14 @@ qtframebufferplugin.cpp ) @@ -67,11 +67,11 @@ index 2629098..9019aad 100644 add_library(krfb_framebuffer_qt MODULE ${krfb_framebuffer_qt_SRCS} -diff --git a/framebuffers/xcb/CMakeLists.txt b/framebuffers/xcb/CMakeLists.txt -index 1f6979c..9779427 100644 ---- a/framebuffers/xcb/CMakeLists.txt -+++ b/framebuffers/xcb/CMakeLists.txt -@@ -7,6 +7,14 @@ set (krfb_framebuffer_xcb_SRCS +Index: krfb-20.08.1/framebuffers/xcb/CMakeLists.txt +=================================================================== +--- krfb-20.08.1.orig/framebuffers/xcb/CMakeLists.txt 2020-09-02 07:05:32.869344897 +0200 ++++ krfb-20.08.1/framebuffers/xcb/CMakeLists.txt 2020-09-02 07:05:40.725370922 +0200 +@@ -7,6 +7,14 @@ xcb_framebuffer.cpp ) @@ -86,10 +86,10 @@ index 1f6979c..9779427 100644 add_library(krfb_framebuffer_xcb MODULE ${krfb_framebuffer_xcb_SRCS}) target_link_libraries (krfb_framebuffer_xcb -diff --git a/framebuffers/xcb/xcb_framebuffer.cpp b/framebuffers/xcb/xcb_framebuffer.cpp -index 60e114e..07569bf 100644 ---- a/framebuffers/xcb/xcb_framebuffer.cpp -+++ b/framebuffers/xcb/xcb_framebuffer.cpp +Index: krfb-20.08.1/framebuffers/xcb/xcb_framebuffer.cpp +=================================================================== +--- krfb-20.08.1.orig/framebuffers/xcb/xcb_framebuffer.cpp 2020-09-02 07:05:32.869344897 +0200 ++++ krfb-20.08.1/framebuffers/xcb/xcb_framebuffer.cpp 2020-09-02 07:05:40.725370922 +0200 @@ -8,6 +8,7 @@ */ @@ -106,7 +106,7 @@ index 60e114e..07569bf 100644 class KrfbXCBEventFilter: public QAbstractNativeEventFilter -@@ -68,7 +68,7 @@ KrfbXCBEventFilter::KrfbXCBEventFilter(XCBFrameBuffer *owner): +@@ -68,7 +68,7 @@ } #ifdef _DEBUG @@ -115,7 +115,7 @@ index 60e114e..07569bf 100644 xdamage_version->major_version << "." << xdamage_version->minor_version; #endif -@@ -163,7 +163,7 @@ XCBFrameBuffer::XCBFrameBuffer(WId winid, QObject *parent): +@@ -163,7 +163,7 @@ QScreen *primaryScreen = QGuiApplication::primaryScreen(); if (primaryScreen) { @@ -124,7 +124,7 @@ index 60e114e..07569bf 100644 << ", geometry: " << primaryScreen->geometry() << ", depth: " << primaryScreen->depth(); // -@@ -183,7 +183,7 @@ XCBFrameBuffer::XCBFrameBuffer(WId winid, QObject *parent): +@@ -183,7 +183,7 @@ XCB_IMAGE_FORMAT_Z_PIXMAP); if (d->framebufferImage) { #ifdef _DEBUG @@ -133,7 +133,7 @@ index 60e114e..07569bf 100644 << ", size (" << d->framebufferImage->width << d->framebufferImage->height << ")" << ", depth: " << d->framebufferImage->depth << ", padded width: " << d->framebufferImage->stride; -@@ -211,15 +211,15 @@ XCBFrameBuffer::XCBFrameBuffer(WId winid, QObject *parent): +@@ -211,15 +211,15 @@ nullptr); // data = 0 if (d->updateTile) { #ifdef _DEBUG @@ -158,7 +158,7 @@ index 60e114e..07569bf 100644 #endif // allocate shared memory block only once, make its size large enough -@@ -237,7 +237,7 @@ XCBFrameBuffer::XCBFrameBuffer(WId winid, QObject *parent): +@@ -237,7 +237,7 @@ xcb_shm_attach(QX11Info::connection(), d->shminfo.shmseg, d->shminfo.shmid, 0); #ifdef _DEBUG @@ -167,7 +167,7 @@ index 60e114e..07569bf 100644 #endif // will return 1 on success (yes!) -@@ -273,7 +273,7 @@ XCBFrameBuffer::XCBFrameBuffer(WId winid, QObject *parent): +@@ -273,7 +273,7 @@ } #ifdef _DEBUG @@ -176,7 +176,7 @@ index 60e114e..07569bf 100644 << ", xshm base error = " << d->x11EvtFilter->xdamageBaseError << ", xdamage base event = " << d->x11EvtFilter->xdamageBaseEvent << ", xdamage base error = " << d->x11EvtFilter->xdamageBaseError; -@@ -420,10 +420,12 @@ void XCBFrameBuffer::getServerFormat(rfbPixelFormat &format) { +@@ -420,10 +420,12 @@ format.blueMax = root_visualtype->blue_mask >> format.blueShift; #ifdef _DEBUG @@ -193,11 +193,11 @@ index 60e114e..07569bf 100644 format.redMax, format.greenMax, format.blueMax); #endif } else { -diff --git a/krfb/CMakeLists.txt b/krfb/CMakeLists.txt -index a292226..08066f6 100644 ---- a/krfb/CMakeLists.txt -+++ b/krfb/CMakeLists.txt -@@ -66,6 +66,14 @@ set (krfb_SRCS +Index: krfb-20.08.1/krfb/CMakeLists.txt +=================================================================== +--- krfb-20.08.1.orig/krfb/CMakeLists.txt 2020-09-02 07:05:32.869344897 +0200 ++++ krfb-20.08.1/krfb/CMakeLists.txt 2020-09-02 07:05:40.725370922 +0200 +@@ -66,6 +66,14 @@ invitationsrfbclient.cpp ) @@ -212,10 +212,10 @@ index a292226..08066f6 100644 kconfig_add_kcfg_files (krfb_SRCS krfbconfig.kcfgc ) -diff --git a/krfb/eventsmanager.cpp b/krfb/eventsmanager.cpp -index 716d1fc..7289ced 100644 ---- a/krfb/eventsmanager.cpp -+++ b/krfb/eventsmanager.cpp +Index: krfb-20.08.1/krfb/eventsmanager.cpp +=================================================================== +--- krfb-20.08.1.orig/krfb/eventsmanager.cpp 2020-09-02 07:05:32.869344897 +0200 ++++ krfb-20.08.1/krfb/eventsmanager.cpp 2020-09-02 07:05:40.725370922 +0200 @@ -23,8 +23,8 @@ #include "eventsplugin.h" #include "krfbconfig.h" @@ -226,7 +226,7 @@ index 716d1fc..7289ced 100644 #include #include -@@ -79,18 +79,18 @@ void EventsManager::loadPlugins() +@@ -79,18 +79,18 @@ KPluginFactory *factory = KPluginLoader(data.fileName()).factory(); if (!factory) { @@ -249,7 +249,7 @@ index 716d1fc..7289ced 100644 } unique.insert (data.name()); } -@@ -113,6 +113,6 @@ QSharedPointer EventsManager::eventHandler() +@@ -113,6 +113,6 @@ } // No valid events plugin found. @@ -257,10 +257,10 @@ index 716d1fc..7289ced 100644 + qCDebug(KRFB) << "No valid event handlers found. returning null."; return QSharedPointer(); } -diff --git a/krfb/framebuffermanager.cpp b/krfb/framebuffermanager.cpp -index 68b3093..a62117e 100644 ---- a/krfb/framebuffermanager.cpp -+++ b/krfb/framebuffermanager.cpp +Index: krfb-20.08.1/krfb/framebuffermanager.cpp +=================================================================== +--- krfb-20.08.1.orig/krfb/framebuffermanager.cpp 2020-09-02 07:05:32.869344897 +0200 ++++ krfb-20.08.1/krfb/framebuffermanager.cpp 2020-09-02 07:06:44.709582831 +0200 @@ -22,8 +22,8 @@ #include "framebufferplugin.h" @@ -271,7 +271,7 @@ index 68b3093..a62117e 100644 #include #include -@@ -78,18 +78,18 @@ void FrameBufferManager::loadPlugins() +@@ -78,18 +78,18 @@ KPluginFactory *factory = KPluginLoader(data.fileName()).factory(); if (!factory) { @@ -289,12 +289,12 @@ index 68b3093..a62117e 100644 - qDebug() << "Loaded plugin with name " << data.pluginId(); + qDebug(KRFB) << "Loaded plugin with name " << data.pluginId(); } else { -- qDebug() << "unable to load pluign for " << data.fileName(); -+ qDebug(KRFB) << "unable to load pluign for " << data.fileName(); +- qDebug() << "unable to load plugin for " << data.fileName(); ++ qDebug(KRFB) << "unable to load plugin for " << data.fileName(); } unique.insert (data.name()); } -@@ -118,7 +118,7 @@ QSharedPointer FrameBufferManager::frameBuffer(WId id) +@@ -118,7 +118,7 @@ while (iter != m_plugins.constEnd()) { if (iter.key() == KrfbConfig::preferredFrameBufferPlugin()) { @@ -303,7 +303,7 @@ index 68b3093..a62117e 100644 QSharedPointer frameBuffer(iter.value()->frameBuffer(id)); -@@ -133,6 +133,6 @@ QSharedPointer FrameBufferManager::frameBuffer(WId id) +@@ -133,6 +133,6 @@ } // No valid framebuffer plugin found. @@ -311,10 +311,10 @@ index 68b3093..a62117e 100644 + qDebug(KRFB) << "No valid framebuffer found. returning null."; return QSharedPointer(); } -diff --git a/krfb/invitationsrfbclient.cpp b/krfb/invitationsrfbclient.cpp -index f52cdc9..a0f7244 100644 ---- a/krfb/invitationsrfbclient.cpp -+++ b/krfb/invitationsrfbclient.cpp +Index: krfb-20.08.1/krfb/invitationsrfbclient.cpp +=================================================================== +--- krfb-20.08.1.orig/krfb/invitationsrfbclient.cpp 2020-09-02 07:05:32.869344897 +0200 ++++ krfb-20.08.1/krfb/invitationsrfbclient.cpp 2020-09-02 07:05:40.725370922 +0200 @@ -24,11 +24,11 @@ #include "krfbconfig.h" #include "sockethelpers.h" @@ -328,7 +328,7 @@ index f52cdc9..a0f7244 100644 #include #include #include -@@ -115,7 +115,7 @@ void PendingInvitationsRfbClient::onSocketActivated() +@@ -115,7 +115,7 @@ //the clientGoneHook which in turn will remove this RfbClient instance //from the server manager and will call deleteLater() to delete it if (d->client->sock == -1) { @@ -337,7 +337,7 @@ index f52cdc9..a0f7244 100644 d->notifier->setEnabled(false); rfbClientConnectionGone(d->client); break; -@@ -125,7 +125,7 @@ void PendingInvitationsRfbClient::onSocketActivated() +@@ -125,7 +125,7 @@ bool PendingInvitationsRfbClient::checkPassword(const QByteArray & encryptedPassword) { @@ -346,10 +346,10 @@ index f52cdc9..a0f7244 100644 if(InvitationsRfbServer::instance->allowUnattendedAccess() && vncAuthCheckPassword( InvitationsRfbServer::instance->unattendedPassword().toLocal8Bit(), -diff --git a/krfb/invitationsrfbserver.cpp b/krfb/invitationsrfbserver.cpp -index bdbd9cb..69b458c 100644 ---- a/krfb/invitationsrfbserver.cpp -+++ b/krfb/invitationsrfbserver.cpp +Index: krfb-20.08.1/krfb/invitationsrfbserver.cpp +=================================================================== +--- krfb-20.08.1.orig/krfb/invitationsrfbserver.cpp 2020-09-02 07:05:32.873344910 +0200 ++++ krfb-20.08.1/krfb/invitationsrfbserver.cpp 2020-09-02 07:05:40.725370922 +0200 @@ -22,10 +22,10 @@ #include "invitationsrfbclient.h" #include "krfbconfig.h" @@ -362,7 +362,7 @@ index bdbd9cb..69b458c 100644 #include #include -@@ -188,7 +188,7 @@ void InvitationsRfbServer::walletOpened(bool opened) +@@ -188,7 +188,7 @@ } else { @@ -371,10 +371,10 @@ index bdbd9cb..69b458c 100644 KConfigGroup krfbConfig(KSharedConfig::openConfig(),"Security"); desktopPassword = KStringHandler::obscure(krfbConfig.readEntry( -diff --git a/krfb/main.cpp b/krfb/main.cpp -index fd778a7..15b8ec3 100644 ---- a/krfb/main.cpp -+++ b/krfb/main.cpp +Index: krfb-20.08.1/krfb/main.cpp +=================================================================== +--- krfb-20.08.1.orig/krfb/main.cpp 2020-09-02 07:05:32.873344910 +0200 ++++ krfb-20.08.1/krfb/main.cpp 2020-09-02 07:05:40.725370922 +0200 @@ -20,6 +20,7 @@ #include "invitationsrfbserver.h" #include "krfbconfig.h" @@ -391,7 +391,7 @@ index fd778a7..15b8ec3 100644 #include #include #include -@@ -59,13 +59,13 @@ static bool checkX11Capabilities() +@@ -59,13 +59,13 @@ static void checkOldX11PluginConfig() { if (KrfbConfig::preferredFrameBufferPlugin() == QStringLiteral("x11")) { @@ -407,7 +407,7 @@ index fd778a7..15b8ec3 100644 } } } -@@ -81,7 +81,7 @@ static void checkWaylandPluginConfig() +@@ -81,7 +81,7 @@ if (config_item) { config_item->setProperty(QStringLiteral("pw")); KrfbConfig::self()->save(); @@ -416,10 +416,10 @@ index fd778a7..15b8ec3 100644 } } } -diff --git a/krfb/rfbclient.cpp b/krfb/rfbclient.cpp -index ff404ec..95d9998 100644 ---- a/krfb/rfbclient.cpp -+++ b/krfb/rfbclient.cpp +Index: krfb-20.08.1/krfb/rfbclient.cpp +=================================================================== +--- krfb-20.08.1.orig/krfb/rfbclient.cpp 2020-09-02 07:05:32.873344910 +0200 ++++ krfb-20.08.1/krfb/rfbclient.cpp 2020-09-02 07:05:40.725370922 +0200 @@ -23,7 +23,6 @@ #include "sockethelpers.h" #include "eventsmanager.h" @@ -428,10 +428,10 @@ index ff404ec..95d9998 100644 #include #include //for bzero() -diff --git a/krfb/rfbserver.cpp b/krfb/rfbserver.cpp -index 82a10a0..fef04d6 100644 ---- a/krfb/rfbserver.cpp -+++ b/krfb/rfbserver.cpp +Index: krfb-20.08.1/krfb/rfbserver.cpp +=================================================================== +--- krfb-20.08.1.orig/krfb/rfbserver.cpp 2020-09-02 07:05:32.873344910 +0200 ++++ krfb-20.08.1/krfb/rfbserver.cpp 2020-09-02 07:05:40.725370922 +0200 @@ -19,11 +19,11 @@ */ #include "rfbserver.h" @@ -445,7 +445,7 @@ index 82a10a0..fef04d6 100644 #include struct RfbServer::Private -@@ -92,7 +92,7 @@ bool RfbServer::start() +@@ -92,7 +92,7 @@ if (!d->screen) { d->screen = RfbServerManager::instance()->newScreen(); if (!d->screen) { @@ -454,7 +454,7 @@ index 82a10a0..fef04d6 100644 return false; } -@@ -125,14 +125,14 @@ bool RfbServer::start() +@@ -125,14 +125,14 @@ d->screen->authPasswdData = (void *)nullptr; } @@ -471,10 +471,10 @@ index 82a10a0..fef04d6 100644 rfbShutdownServer(d->screen, false); return false; }; -diff --git a/krfb/rfbservermanager.cpp b/krfb/rfbservermanager.cpp -index e7262c4..2385f1b 100644 ---- a/krfb/rfbservermanager.cpp -+++ b/krfb/rfbservermanager.cpp +Index: krfb-20.08.1/krfb/rfbservermanager.cpp +=================================================================== +--- krfb-20.08.1.orig/krfb/rfbservermanager.cpp 2020-09-02 07:05:32.873344910 +0200 ++++ krfb-20.08.1/krfb/rfbservermanager.cpp 2020-09-02 07:05:40.725370922 +0200 @@ -29,7 +29,6 @@ #include #include @@ -483,6 +483,3 @@ index e7262c4..2385f1b 100644 #include #include --- -2.28.0 - diff --git a/krfb-20.08.0.tar.xz b/krfb-20.08.0.tar.xz deleted file mode 100644 index 06be0f8..0000000 --- a/krfb-20.08.0.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7ca46cc216ecd3790d045a36a642c834a9af4024409075e7a5bf8b498c67e4b -size 1280444 diff --git a/krfb-20.08.0.tar.xz.sig b/krfb-20.08.0.tar.xz.sig deleted file mode 100644 index d07bbb2..0000000 --- a/krfb-20.08.0.tar.xz.sig +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQEzBAABCgAdFiEE8jJ15L8Qr8HfaRSm29LOiT4tHIcFAl8tAgwACgkQ29LOiT4t -HIeVZQf/V40sZeDyJsg5enQO9xBrmINqxdreM1lza9YOFL+DuQwdRVPSDnv4lO5j -l5aWRk1BlKtgKb1nn0tlVwn3LWIDHInJY911Cl8/z/yKyhLhnhMjRFhyX7YanyR1 -cdzCzMAAmmB9jTU9FOKimBMlvMBZsb6P0KpFcJtBMXFSlGMqGJm8UMBbxSTWLAUw -XSfj+x3cDdg4OAU/CFlHiN8UBD55sR/I+7B7njbyszSuIDsXVpTlYYILWugk8pMr -ue2IzROd1FpioTXVb1l5X40d4qpBJ5JvvQbr2QhHXHHVwL8rKsT0ycuYfc9rD/yW -C3wP5noMFogy0R+NLnQz4B87EUfMuQ== -=3VSy ------END PGP SIGNATURE----- diff --git a/krfb-20.08.1.tar.xz b/krfb-20.08.1.tar.xz new file mode 100644 index 0000000..af34820 --- /dev/null +++ b/krfb-20.08.1.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a80b9bab47f2a7299e33b0e2a10b117605ec1cc572ca72e914c7f01dde383eda +size 1280460 diff --git a/krfb-20.08.1.tar.xz.sig b/krfb-20.08.1.tar.xz.sig new file mode 100644 index 0000000..34664d4 --- /dev/null +++ b/krfb-20.08.1.tar.xz.sig @@ -0,0 +1,11 @@ +-----BEGIN PGP SIGNATURE----- + +iQEzBAABCgAdFiEE8jJ15L8Qr8HfaRSm29LOiT4tHIcFAl9N7n4ACgkQ29LOiT4t +HIeD2QgAmqpMQRBIjNzuu1DB9LMbqurkKP/a8Gv54tKTMw7R2In2ZaVCILjS9FS6 +wKrNspIouJORSELpL7AqXW8vUTDVqiGPUHwW/vZarm+INcsZGhtAoOPs63wm32ya +X+fmNWNcAvHLiTNQ/3BVsA120LZKI+MT8UxKsPLSVkTcNJdfjdPZKK1cUwekF3uS +1q6voS5VO/JsY+8opoqCzYBvX/3zaeIHBiXP2pCq7ViteMZDvnMKlglGV61Aossa +s5QrYrxvF0qczv+iZwcOfTihrGHcatLb5P3m0WQUYYzbZs/1nnea9flySu2NttWI +ihcH4aoIq2be6toERkQO6AtVtWy4IA== +=K8Q2 +-----END PGP SIGNATURE----- diff --git a/krfb.changes b/krfb.changes index c5c9bf5..bcc4045 100644 --- a/krfb.changes +++ b/krfb.changes @@ -1,3 +1,14 @@ +------------------------------------------------------------------- +Tue Sep 1 20:50:40 UTC 2020 - Luca Beltrame + +- Update to 20.08.1 + * New bugfix release + * For more details please see: + * https://kde.org/announcements/releases/2020-09-apps-update +- No code change since 20.08.0 +- Rebased patches against 20.08.1: + - 0001-Declare-and-use-logging-categories.patch + ------------------------------------------------------------------- Mon Aug 31 15:57:48 UTC 2020 - Stefan BrĂ¼ns diff --git a/krfb.spec b/krfb.spec index ed72647..4986de7 100644 --- a/krfb.spec +++ b/krfb.spec @@ -21,7 +21,7 @@ %{!?_kapp_version: %define _kapp_version %(echo %{version}| awk -F. '{print $1"."$2}')} %bcond_without lang Name: krfb -Version: 20.08.0 +Version: 20.08.1 Release: 0 Summary: Screen sharing using the VNC/RFB protocol License: GPL-2.0-or-later