Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libuv for openSUSE:Factory checked in at 2026-03-07 20:00:51 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libuv (Old) and /work/SRC/openSUSE:Factory/.libuv.new.8177 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libuv" Sat Mar 7 20:00:51 2026 rev:39 rq:1336813 version:1.52.0 Changes: -------- --- /work/SRC/openSUSE:Factory/libuv/libuv.changes 2025-08-04 15:22:17.455557435 +0200 +++ /work/SRC/openSUSE:Factory/.libuv.new.8177/libuv.changes 2026-03-07 20:00:55.345533687 +0100 @@ -1,0 +2,15 @@ +Thu Mar 5 20:18:58 UTC 2026 - Dirk Müller <[email protected]> + +- add fix-crash-if-poll-callback-closes.patch + +------------------------------------------------------------------- +Wed Feb 18 12:20:08 UTC 2026 - Felix Stegmeier <[email protected]> + +- libuv.keyring: added keyid 5804F9998A922AFB + Colin Ihrig <[email protected]> + +- Update to 1.52.0: + * Bugfix release + * tcp: support customizing TCP_KEEPINTVL and TCP_KEEPCNT + +------------------------------------------------------------------- Old: ---- libuv-v1.51.0.tar.gz libuv-v1.51.0.tar.gz.sign New: ---- fix-crash-if-poll-callback-closes.patch libuv-v1.52.0.tar.gz libuv-v1.52.0.tar.gz.sign ----------(New B)---------- New: - add fix-crash-if-poll-callback-closes.patch ----------(New E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libuv.spec ++++++ --- /var/tmp/diff_new_pack.XLjZFG/_old 2026-03-07 20:00:56.309573488 +0100 +++ /var/tmp/diff_new_pack.XLjZFG/_new 2026-03-07 20:00:56.313573653 +0100 @@ -1,7 +1,7 @@ # # spec file for package libuv # -# Copyright (c) 2025 SUSE LLC +# Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,7 +18,7 @@ %define somajor 1 Name: libuv -Version: 1.51.0 +Version: 1.52.0 Release: 0 Summary: Asychronous I/O support library License: MIT @@ -29,6 +29,8 @@ Source2: %{name}.keyring Source3: baselibs.conf Patch1: fix_tests.patch +# PATCH-FIX-UPSTREAM: https://github.com/libuv/libuv/pull/5039 +Patch2: fix-crash-if-poll-callback-closes.patch BuildRequires: autoconf BuildRequires: automake BuildRequires: libtool ++++++ fix-crash-if-poll-callback-closes.patch ++++++ >From 327be9eec853bbc67f08682d3c43b70fc45aabee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Jos=C3=A9=20Arboleda?= <[email protected]> Date: Mon, 2 Mar 2026 12:28:44 -0500 Subject: [PATCH] linux: fix crash if poll callback closes handle before `POLLERR` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, `uv__udp_io` would proceed to call `uv__udp_recvmsg` for the `POLLERR` event even if the handle was just closed by the `POLLIN` callback. This commit adds a guard to verify the handle is still active before processing the error queue. It also adds a regression test that mimics this recursive closure behavior. Fixes: https://github.com/libuv/libuv/issues/5030 Signed-off-by: Juan José Arboleda <[email protected]> --- CMakeLists.txt | 1 + Makefile.am | 1 + src/unix/udp.c | 6 +- test/test-list.h | 4 + test/test-udp-recv-cb-close-pollerr.c | 112 ++++++++++++++++++++++++++ 5 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 test/test-udp-recv-cb-close-pollerr.c Index: libuv-v1.52.0/CMakeLists.txt =================================================================== --- libuv-v1.52.0.orig/CMakeLists.txt +++ libuv-v1.52.0/CMakeLists.txt @@ -700,6 +700,7 @@ if(LIBUV_BUILD_TESTS) test/test-udp-send-immediate.c test/test-udp-sendmmsg-error.c test/test-udp-send-unreachable.c + test/test-udp-recv-cb-close-pollerr.c test/test-udp-recvmsg-unreachable-error.c test/test-udp-try-send.c test/test-udp-recv-in-a-row.c Index: libuv-v1.52.0/Makefile.am =================================================================== --- libuv-v1.52.0.orig/Makefile.am +++ libuv-v1.52.0/Makefile.am @@ -325,6 +325,7 @@ test_run_tests_SOURCES = test/blackhole- test/test-udp-send-immediate.c \ test/test-udp-sendmmsg-error.c \ test/test-udp-send-unreachable.c \ + test/test-udp-recv-cb-close-pollerr.c \ test/test-udp-recvmsg-unreachable-error.c \ test/test-udp-try-send.c \ test/test-udp-recv-in-a-row.c \ Index: libuv-v1.52.0/src/unix/udp.c =================================================================== --- libuv-v1.52.0.orig/src/unix/udp.c +++ libuv-v1.52.0/src/unix/udp.c @@ -183,7 +183,11 @@ void uv__udp_io(uv_loop_t* loop, uv__io_ /* Just Linux support for now. */ #if defined(__linux__) - if (revents & POLLERR) + /* Guard against the case where the POLLIN callback above (e.g. via + * uv_udp_recv_stop + uv_close) already cleared recv_cb in the same + * revents iteration. uv__udp_recvmsg asserts recv_cb != NULL, so + * calling it with a NULL recv_cb would be wrong regardless of POLLERR. */ + if ((revents & POLLERR) && uv__is_active(handle)) uv__udp_recvmsg(handle, MSG_ERRQUEUE); #endif Index: libuv-v1.52.0/test/test-list.h =================================================================== --- libuv-v1.52.0.orig/test/test-list.h +++ libuv-v1.52.0/test/test-list.h @@ -174,8 +174,10 @@ TEST_DECLARE (udp_send_and_recv) TEST_DECLARE (udp_send_hang_loop) TEST_DECLARE (udp_send_immediate) TEST_DECLARE (udp_send_unreachable) +TEST_DECLARE (udp_recv_cb_close_pollerr) TEST_DECLARE (udp_recvmsg_unreachable_error) TEST_DECLARE (udp_recvmsg_unreachable_error6) +TEST_DECLARE (udp_send_pollerr_no_recv) TEST_DECLARE (udp_mmsg) TEST_DECLARE (udp_multicast_ttl) TEST_DECLARE (udp_dgram_too_big) @@ -802,8 +804,10 @@ TASK_LIST_START TEST_ENTRY (udp_send_hang_loop) TEST_ENTRY (udp_send_immediate) TEST_ENTRY (udp_send_unreachable) + TEST_ENTRY (udp_recv_cb_close_pollerr) TEST_ENTRY (udp_recvmsg_unreachable_error) TEST_ENTRY (udp_recvmsg_unreachable_error6) + TEST_ENTRY (udp_send_pollerr_no_recv) TEST_ENTRY (udp_dgram_too_big) TEST_ENTRY (udp_dual_stack) TEST_ENTRY (udp_ipv6_only) Index: libuv-v1.52.0/test/test-udp-recv-cb-close-pollerr.c =================================================================== --- /dev/null +++ libuv-v1.52.0/test/test-udp-recv-cb-close-pollerr.c @@ -0,0 +1,112 @@ +/* Copyright libuv contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#include "uv.h" +#include "task.h" + +static uv_udp_send_t send_req; +static uv_udp_t client; +static int alloc_cb_called; +static int recv_cb_called; +static int send_cb_called; + +static void alloc_cb(uv_handle_t* handle, size_t sz, uv_buf_t* buf) { + alloc_cb_called++; + buf->base = "uv"; + buf->len = 2; +} + +static void recv_cb(uv_udp_t* handle, ssize_t nread, const uv_buf_t* buf, + const struct sockaddr* addr, unsigned flags) { + recv_cb_called++; + /* Stop receiving and unset recv_cb and alloc_cb */ + uv_close((uv_handle_t*) handle, NULL); +} + +static void send_cb(uv_udp_send_t* req, int status) { + send_cb_called++; + /* The send completed; now just close the handle and let the loop drain. + * If a POLLERR arrives before the close completes, uv__udp_io must not + * crash when no recv callback is installed. */ + uv_close((uv_handle_t*) req->handle, NULL); +} + +/* Refs: https://github.com/libuv/libuv/issues/5030 */ +TEST_IMPL(udp_recv_cb_close_pollerr) { +#ifndef __linux__ + RETURN_SKIP("ICMP error handling is Linux-specific"); +#endif + struct sockaddr_in any_addr; + struct sockaddr_in addr; + uv_buf_t buf; + + ASSERT_OK(uv_udp_init(uv_default_loop(), &client)); + + ASSERT_OK(uv_ip4_addr("0.0.0.0", 0, &any_addr)); + ASSERT_OK(uv_udp_bind(&client, (const struct sockaddr*) &any_addr, + UV_UDP_LINUX_RECVERR)); + + ASSERT_OK(uv_ip4_addr("127.0.0.1", 9999, &addr)); + ASSERT_OK(uv_udp_connect(&client, (const struct sockaddr*) &addr)); + + ASSERT_OK(uv_udp_recv_start(&client, alloc_cb, recv_cb)); + + buf = uv_buf_init("PING", 4); + ASSERT_GT(uv_udp_try_send(&client, &buf, 1, NULL), 0); + + uv_run(uv_default_loop(), UV_RUN_DEFAULT); + + ASSERT_EQ(1, alloc_cb_called); + ASSERT_EQ(1, recv_cb_called); + + MAKE_VALGRIND_HAPPY(uv_default_loop()); + return 0; +} + +/* Same as above but WITHOUT uv_udp_recv_start. + * The ICMP POLLERR still fires on the fd; uv__udp_io must not crash when + * no recv/alloc callback is installed. */ +TEST_IMPL(udp_send_pollerr_no_recv) { +#ifndef __linux__ + RETURN_SKIP("ICMP error handling is Linux-specific"); +#endif + struct sockaddr_in any_addr; + struct sockaddr_in addr; + uv_buf_t buf; + + ASSERT_OK(uv_udp_init(uv_default_loop(), &client)); + + ASSERT_OK(uv_ip4_addr("0.0.0.0", 0, &any_addr)); + ASSERT_OK(uv_udp_bind(&client, (const struct sockaddr*) &any_addr, + UV_UDP_LINUX_RECVERR)); + + ASSERT_OK(uv_ip4_addr("127.0.0.1", 9999, &addr)); + ASSERT_OK(uv_udp_connect(&client, (const struct sockaddr*) &addr)); + + buf = uv_buf_init("PING", 4); + ASSERT_OK(uv_udp_send(&send_req, &client, &buf, 1, NULL, send_cb)); + + uv_run(uv_default_loop(), UV_RUN_DEFAULT); + + ASSERT_EQ(1, send_cb_called); + + MAKE_VALGRIND_HAPPY(uv_default_loop()); + return 0; +} \ No newline at end of file ++++++ fix_tests.patch ++++++ --- /var/tmp/diff_new_pack.XLjZFG/_old 2026-03-07 20:00:56.373576130 +0100 +++ /var/tmp/diff_new_pack.XLjZFG/_new 2026-03-07 20:00:56.377576295 +0100 @@ -2,11 +2,11 @@ test/test-list.h | 11 ----------- 1 file changed, 11 deletions(-) -Index: libuv-v1.47.0/test/test-list.h +Index: libuv-v1.52.0/test/test-list.h =================================================================== ---- libuv-v1.47.0.orig/test/test-list.h -+++ libuv-v1.47.0/test/test-list.h -@@ -79,7 +79,6 @@ TEST_DECLARE (stdio_over_pipes) +--- libuv-v1.52.0.orig/test/test-list.h ++++ libuv-v1.52.0/test/test-list.h +@@ -82,7 +82,6 @@ TEST_DECLARE (stdio_over_pipes) TEST_DECLARE (stdio_emulate_iocp) TEST_DECLARE (ip6_pton) TEST_DECLARE (ip6_sin6_len) @@ -14,7 +14,7 @@ TEST_DECLARE (ipc_heavy_traffic_deadlock_bug) TEST_DECLARE (ipc_listen_before_write) TEST_DECLARE (ipc_listen_after_write) -@@ -128,7 +127,6 @@ TEST_DECLARE (tcp_bind_or_listen_error +@@ -131,7 +130,6 @@ TEST_DECLARE (tcp_bind_or_listen_error TEST_DECLARE (tcp_listen_without_bind) TEST_DECLARE (tcp_connect_error_fault) TEST_DECLARE (tcp_connect6_error_fault) @@ -22,9 +22,9 @@ TEST_DECLARE (tcp_connect_timeout) TEST_DECLARE (tcp_local_connect_timeout) TEST_DECLARE (tcp6_local_connect_timeout) -@@ -173,11 +171,7 @@ TEST_DECLARE (udp_send_hang_loop) - TEST_DECLARE (udp_send_immediate) - TEST_DECLARE (udp_send_unreachable) +@@ -179,11 +177,7 @@ TEST_DECLARE (udp_send_unreachable) + TEST_DECLARE (udp_recvmsg_unreachable_error) + TEST_DECLARE (udp_recvmsg_unreachable_error6) TEST_DECLARE (udp_mmsg) -TEST_DECLARE (udp_multicast_join) -TEST_DECLARE (udp_multicast_join6) @@ -34,7 +34,7 @@ TEST_DECLARE (udp_dgram_too_big) TEST_DECLARE (udp_dual_stack) TEST_DECLARE (udp_ipv6_only) -@@ -643,7 +637,6 @@ TASK_LIST_START +@@ -671,7 +665,6 @@ TASK_LIST_START TEST_ENTRY (stdio_emulate_iocp) TEST_ENTRY (ip6_pton) TEST_ENTRY (ip6_sin6_len) @@ -42,7 +42,7 @@ TEST_ENTRY (ipc_heavy_traffic_deadlock_bug) TEST_ENTRY (ipc_listen_before_write) TEST_ENTRY (ipc_listen_after_write) -@@ -730,7 +723,6 @@ TASK_LIST_START +@@ -758,7 +751,6 @@ TASK_LIST_START TEST_ENTRY (tcp_listen_without_bind) TEST_ENTRY (tcp_connect_error_fault) TEST_ENTRY (tcp_connect6_error_fault) @@ -50,7 +50,7 @@ TEST_ENTRY (tcp_connect_timeout) TEST_ENTRY (tcp_local_connect_timeout) TEST_ENTRY (tcp6_local_connect_timeout) -@@ -787,10 +779,6 @@ TASK_LIST_START +@@ -819,10 +811,6 @@ TASK_LIST_START TEST_ENTRY (udp_options6) TEST_ENTRY (udp_no_autobind) TEST_ENTRY (udp_mmsg) @@ -61,7 +61,7 @@ TEST_ENTRY (udp_multicast_ttl) TEST_ENTRY (udp_sendmmsg_error) TEST_ENTRY (udp_try_send) -@@ -943,7 +931,6 @@ TASK_LIST_START +@@ -978,7 +966,6 @@ TASK_LIST_START TEST_ENTRY (getnameinfo_basic_ip4) TEST_ENTRY (getnameinfo_basic_ip4_sync) ++++++ libuv-v1.51.0.tar.gz -> libuv-v1.52.0.tar.gz ++++++ ++++ 7855 lines of diff (skipped) ++++++ libuv.keyring ++++++ --- /var/tmp/diff_new_pack.XLjZFG/_old 2026-03-07 20:00:56.805593967 +0100 +++ /var/tmp/diff_new_pack.XLjZFG/_new 2026-03-07 20:00:56.805593967 +0100 @@ -1,149 +1,53 @@ -tag pubkey-santigimeno -Tagger: Santiago Gimeno <[email protected]> -Date: Fri Aug 26 12:23:55 2016 +0200 - -build: check in public key ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1 - -iQIcBAABAgAGBQJXwBi+AAoJEPKMPI2jPAO+2wIP/ipYYnDxVSbPnN41xvaCb0t0 -VIRq4POUIKf3moBXYWUwX4PrVWNy98/glvpqYB6vfaKkSalE15n8ny6UJPuCwMkc -hWKB3+r4ck4nKjsBrqTGVtTf/0XvGFQs1uABEyJaP2WsBP3YVTwQY/nJvACrDCB0 -jGUAA5iOJLy5cw8Isi6gqZq0PLzZCrbgboIkSKmRJiK6Pn9BzpZ+3AbUfsrWaq2G -Bhd02ftoqSMvdggBSCNIg6uVa4Lii3IoLmC1kcOC75jCx0dayImFSpVEY0I7Ld/o -CFJN84fbLEmzL5bIizrXhyknLsNSeNoXA5ELdRJUf27P3+TP9s8Hzrl66T1hTbc6 -1/TaNQN4F/oLo7x8KwN7XFYn88qMM5Cq+Xo7MKKgsDRaL2+HSpfD+4PNRJjrbDTX -wB7Xl79+TcM0JUc19R1SfRrdmk/sjGLJzCV0CkQGAv2yKTvvi6rJ7AbOw3jvKe+h -Fkst10ZW5PoRubJp3RTJQDtw3J3ZmKNHMXkr3aN9HC8UKcdv4fxCvP1UH8vifT9n -aWKq6uU/IFtx2NrnWGQDNBsxXkbmZlIWQIDOOQ/h1++MYG5eLhIqNhWH0RDS2g+K -6QsN8r2t8j23NxGNj+ql7e3MjSDr+E3cePBFOoG4+OewOPjQqJ1n4XPSFGbh8GWq -fH+ba0o16+0Dd3agnjf8 -=HWU5 ------END PGP SIGNATURE----- ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1 - -mQINBFe/9YwBEACbJcqjsmkiKqSIu+5LTeboktlluLvWrU3gHpk+4yiAcAwdejlY -XmlbthIkvQrDEXqZYfyO6mzOKjjJU6e61Nv94Mo+6nHF9IM1KUlrLs8RM81VcSsE -BrtqgbZwC18BX6KFOsww0TUcoN3R99J2WZTCDGGPzVWeFCv00JV6TSpxgZmSNvI/ -pU7pMWgZO3QzRQT55lesPRYeR3Ib8m9zxau329GyWZJTSHNV9vS1t8u669HOqJwy -h2+yXgG4Fv3UQ2EUCA299Yj7sqHR9UAcRCJQ6pE9Lf6fQKCTJGxJMEZj8u/XPckg -e1R2aKmb/HqyKZsEPnbF/3mIqf0uiMBbxKgCFGDv+4L5tJ8Px+/0ZU5Vcjk0nZ2a -aSaiD4h7Zlap5ogXTYHj4WctZ3CJ9x1W8x6wJlbEKCy4Uc3zF5LwBBoT8ac0IcEi -6Oh3Pv7blt/jM9xLAQLCUB0q7/UfJGW3IIGUcnPRrX/tSDHOmW4EFQgZiBS7S0yI -tDE3HqsVu74jJGsQtsURrVNX/I5lMnVpbisUnwXvETD/WYqSZ76w7/mWtift7nFX -ASOIszPXyIcN3eM8O0g1iFE7KBQP/Phg67cLCVlJA4EsmaHyUyFGYmPtu/tQ6kl9 -mw3QLJFmNb1sirQL5zpJKt+SmxfWEwtHL3CDbPC4erEmowKLCiJ31UHlFQARAQAB -tDVTYW50aWFnbyBHaW1lbm8gKHNnaW1lbm8pIDxzYW50aWFnby5naW1lbm9AZ21h -aWwuY29tPokCPgQTAQIAKAUCV7/1jAIbAwUJAeEzgAYLCQgHAwIGFQgCCQoLBBYC -AwECHgECF4AACgkQ8ow8jaM8A76Vww/+OTvHD5LLYIsuk0yh4psBFMpz3MCe8PIQ -wbcb+sS5yMrdwf4b1UD2smXGLkFmzbTL4p6trNlhYn2QStQu2kQKQmqY1LdiM0cg -6EhQ3LHNt1eCHmyz9FeUqn49Dbh/6n5Qf/Si9rirz2ipp5+4lknkmCqL6HG8dpX0 -2v0/K+1OD1rL9hISd8WgLlgJaNKWDtWUj7XjcNSUS7seQGkiM6o9b5td4Euj8vNO -J3o5WyOKkX7tEPrQbQijl08TdBqSw+mKUiWh1dFO/qfEdg1LI6EKwI3l7EGNkpM/ -BSn9367V2rgxutOQOUXO5hEc1ADo/yLqT2Qdv8Bgm5ck+KhYcOM3LUYG3Dzq7slh -c6dZfJFzrzlhqDP7EUwrZ05tzqX6cJmw7mEPMd339KppOFiNscWudoseu5twu92j -CGpnk3smJM4FKe3OAEm9IRGCkjJEASvzocdSnX2N2+DPGuLFFhguDI9ozuDKH7CM -Q3lxR3WykGNYkqjbJKMNHND90CJ0ZxVlgy+HBetFzFqX3S0qWVAH7rIKnFrF3en0 -oW/5vC0P99v5Ft8hJX1h7sR2IvrRFEgEJ+pkBbBzzVKfI12YWNwnql5VTQqLhkHp -AX3Q+D2+423Ha9RZ8bklJnPfIL9D3h5+NQg7/iz0A42fzl23Aup/ggN6JhsRHswm -E54OPyttX+a5Ag0EV7/1jAEQANnn5555ckw9Qm8EBlLrai/KAKeLCHR8+KSRdICC -3dqvngIYDrKqTWWKLO1fYfSH7e9QjMvbipQoxFNC1all28lwtcpW6rFFLRsvHzUo -b/FOMPVIWVyGIUZOArH632uz8kqbAMX0Woim96tkfa7MdcSktlnpE6yWEKjVkx1V -mVN09qskLHrs9vsatKATSLj+jiJEKTNetLkNlWjdZQcCFfO738NPgTIIH84nMsUZ -Ob/TWyK0EATgxWwedvmkJ8Veb3yKNgOHdOWGfV3VIbgN4/0ez8qhyOaVIcHJ1B9M -MLldUKSizCSd2PW2rClYr6GmvZtsqUXz9go4j1OACfXKh0Ws72AsUl+9PMYCwEgn -n+sI13QqZxRnbvskbzlzP/9N1NppisNeIDN0LTKXRbRZZXW9HidJJDaQWebdfDM1 -LbXwm4ehDhU1hXnXfy2Nu3rXgL7cOg+UUBWAf3+m4/60lUJAl9xtp1TQiBMmUEG5 -tlSn1UONu9P2gW0r1DTpJpZs2UVn8flueByQ2qnQgKxnIqsPObUes1bgw8ZLlnPP -lKc8kQQ2Uij4OtkeC+eu6TnuT2kMvBu0uT1P7mucCo8j92sp4YhH7ykKrtcorqKi -11OvaPhghboGpvluTPEH4VaxvACG+L5g4CU2XLqKavRMYLAn+OHYHAdXO4aUm0n8 -tN+zABEBAAGJAiUEGAECAA8FAle/9YwCGwwFCQHhM4AACgkQ8ow8jaM8A75u9Q/+ -PMpI7JmFTh2cNZ/C4RzPvQRN/BkpuSWJKOytBOuqAe2j3J7R7SOrt3rsMO+1t/zA -+H5+jdRkrfLPUfjJ6sk/4dlNp/ExDX4pTOEc2gVdgXGn0B1i3wSzsLiIODFZ8voR -I31srxRs/hrdDu1rVOYYUOq0BhZpeg1p8U8Mk9UB347CRurX3KTOipPZWzEUPE0a -42Sz1LYcZO95813+/RwpEnWQvmEBK6HIqlxWSG5dFz6qX7+dEmiJMzWpaqNdNSWP -GkdwkTO5AylGXZddHF/1nmA8DhqrR/wOsALrtG/pN3ro+2rOV6F+4jQUui1hGeOU -RZj33U9TlhQwIezp9crznCXiDVeWYgWIUtnCIeIzMl0UKPQnB0GJYL+zKWdoWELZ -OBrXVq5vVTCfFwAsPtAdUCHfFq/Z9LtKCsOYT+gg3Vonwq48zahXP27sVUCa+OXR -U09s2pvpXE/24XOeAwkSu1Fs13iKIGAr8/GZr9J9+E9t/Iv0S+7PRI5US59g124Z -Hnfem5UqGzGWHsu8/vDMKOfE7KsV6X1HpgD81Hktt0o1BRD5Wtj0YxdMCp++eK2W -qHjGPtW4VyQpzfVX1oxZn0cmPLXbd6xHxvhadU/1pNZI24IH2Ecu85ooHuyFaTEK -aZ/4P8SPO6t0+0tC3D/nmyAeI8kE+9gw488e7Bnz8RA= -=cVLK ------END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- -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 -=H+Ob +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 +Sxngsi8VAg== +=MKVg -----END PGP PUBLIC KEY BLOCK-----
