From nobody Sun May 19 00:42:32 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=protonmail.com ARC-Seal: i=1; a=rsa-sha256; t=1695654533; cv=none; d=zohomail.com; s=zohoarc; b=Ek973OiPuWL4a8P1iBAKUw19zQlslzAAge47muOTMZPRJ+MVwVv6zG2l0Pf4hEbBwzuqfV0RuVHUkKb8Rm43DpFJ0h/D94YSOJBaiSIKh67Px/nAeNHcUtHnJXPQUUutYHLhSafMfSDqSbn+tilBdcRBXNyxFrBDHe+my1eRaxo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1695654533; h=Content-Type:Cc:Date:From:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:To; bh=v1NApPAABERi6sgpDg4dmIEZwYuIQc/JUNHnrbpM/Z4=; b=RD83apBleKEi7MFAouzFMiKMG6OWbAgDCf5vNX2GHDbM6fypJFLUWZJ3Y5HHskDqltF7FAsTpNP5/66FJR5EI4z39JO6Dxz/Wv8/CWuTbgeMInIkeC4zRbM8xxH9HXPY55MgEkwo8hwU0dQt6JzPy4KxdAcoS7gsdf7TaKHj/f4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1695654533912597.1860453961851; Mon, 25 Sep 2023 08:08:53 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qknBr-00069h-PY; Mon, 25 Sep 2023 11:08:03 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qklFa-0000sF-6x for qemu-devel@nongnu.org; Mon, 25 Sep 2023 09:03:46 -0400 Received: from mail-40138.protonmail.ch ([185.70.40.138]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qklFX-0003oX-Aq for qemu-devel@nongnu.org; Mon, 25 Sep 2023 09:03:45 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com; s=protonmail3; t=1695647007; x=1695906207; bh=v1NApPAABERi6sgpDg4dmIEZwYuIQc/JUNHnrbpM/Z4=; h=Date:To:From:Cc:Subject:Message-ID:Feedback-ID:From:To:Cc:Date: Subject:Reply-To:Feedback-ID:Message-ID:BIMI-Selector; b=YRI9Ywgw8ss7BSu+9cw2LQtKsm1uVkc7j8ajwrC4ym6hAQU1RSe4u2vqnANA6X8Gq 4h+/3ySXSX/VkpbMRDnY2qEIJ44w6xgzwAoaQpP/qdla0OYkxo2oHk060poL43h5Of 1/t4vUX9Ixz8TVPjNWoPxq9Axra6ELU0/ZtzfUnV/aUmDkvSWGxD2RGxrNqs4WQXL9 VfFhsZVqTa6SfJHo3ajC29pC+fhW5XdjFQCFHT95K4UvfzoaQTQa9T/BPy8P1kvzT9 ctWJ9iaZ6uhVGIMJKiKD+piNUMB6Z91YRsznkOR89LJaFePA1CWHRvd+TU41zkWKv+ +sJQGPkdkXOGA== Date: Mon, 25 Sep 2023 13:03:24 +0000 To: "qemu-devel@nongnu.org" From: "edmund.raile" Cc: "kraxel@redhat.com" , =?utf-8?Q?Marc-Andr=C3=A9_Lureau?= Subject: qemu-gtk clipboard crash fixes Message-ID: Feedback-ID: 43016623:user:proton MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_QtMYyCgkkz0kWaYRRErq7XYnVavcis1Nl4eQTL4yqu8" Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=185.70.40.138; envelope-from=edmund.raile@protonmail.com; helo=mail-40138.protonmail.ch X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Mon, 25 Sep 2023 11:08:01 -0400 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @protonmail.com) X-ZM-MESSAGEID: 1695654534422100001 This is a multi-part message in MIME format. --b1_QtMYyCgkkz0kWaYRRErq7XYnVavcis1Nl4eQTL4yqu8 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" In response to [gemu-gtk-clipboard freezing and crashing guests](https://gi= tlab.com/qemu-project/qemu/-/issues/1150). I think I might have a solution for the gtk clipboard sometimes crashing gu= ests. @kolAflash I couldn't have done it without you, figuring out `gtk_clipboard= _wait_is_text_available(clipboard)` was the issue is half the work. The real issue is that it's blocking and I'd wager that's a big no-no since= qemu & KVM have to run the VM + OS, preferably as real-time as possible. S= omething times out and you get a core dump. So as a replacement, `gtk_clipboard_request_text`, which is async and non-b= locking is a better choice, hopefully. It requires an additional function to handle receiving text. Signed-off-by: Edmund Raile From 530db8b6c7adc99f540d7d8cc6122320868326e6 Mon Sep 17 00:00:00 2001 From: Edmund Raile Date: Sun, 24 Sep 2023 09:46:27 +0200 Subject: [PATCH 1/1] qemu-ui-gtk clipboard possible fix for crashes --- ui/gtk-clipboard.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/ui/gtk-clipboard.c b/ui/gtk-clipboard.c index 8d8a636fd1..64d4f7ac9d 100644 --- a/ui/gtk-clipboard.c +++ b/ui/gtk-clipboard.c @@ -153,6 +153,18 @@ static void gd_clipboard_request(QemuClipboardInfo *in= fo, } } +/* non-blocking clipboard receiver implementation */ +static void gd_clipboard_text_received_callback(GtkClipboard *clipboard, c= onst gchar *text, gpointer data) +{ + QemuClipboardInfo *info =3D (QemuClipboardInfo *)data; + if (text) { + info->types[QEMU_CLIPBOARD_TYPE_TEXT].available =3D true; + } + + qemu_clipboard_update(info); + qemu_clipboard_info_unref(info); +} + static void gd_owner_change(GtkClipboard *clipboard, GdkEvent *event, gpointer data) @@ -170,12 +182,8 @@ static void gd_owner_change(GtkClipboard *clipboard, switch (event->owner_change.reason) { case GDK_OWNER_CHANGE_NEW_OWNER: info =3D qemu_clipboard_info_new(&gd->cbpeer, s); - if (gtk_clipboard_wait_is_text_available(clipboard)) { - info->types[QEMU_CLIPBOARD_TYPE_TEXT].available =3D true; - } - - qemu_clipboard_update(info); - qemu_clipboard_info_unref(info); + /* gtk_clipboard_wait_is_text_available (blocking) was used here previous= ly and crashed guests */ + gtk_clipboard_request_text(clipboard, gd_clipboard_text_received_callback= , info); break; default: qemu_clipboard_peer_release(&gd->cbpeer, s); -- 2.42.0 don't forget to configure with --enable-gtk-clipboard before building I'd say my gvt-g win10 VM has become a lot more responsive (was using gtk-c= lipboard besides being broken). Paste from the VM is a bit delayed sometimes but I can live with that. So far my VM hasn't crashed yet. I'd like to ask you for help in evaluating my patch. The issue linked to in the first line has instructions on the crash case. It's my first time on the mailing list, I hope I've done this right. Mr. Lureau CCed here had this to add: Blocking the signal handler isn't great either, as we may miss clipboard up= dates. I think we could "reuse" the serial field on info and check in the c= allback if we don't have the latest, just ignore the result and free. --b1_QtMYyCgkkz0kWaYRRErq7XYnVavcis1Nl4eQTL4yqu8 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: base64 PGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDE0 cHg7Ij48c3Bhbj5JbiByZXNwb25zZSB0byBbZ2VtdS1ndGstY2xpcGJvYXJkIGZyZWV6aW5nIGFu ZCBjcmFzaGluZyBndWVzdHNdKDxhIGhyZWY9Imh0dHBzOi8vZ2l0bGFiLmNvbS9xZW11LXByb2pl Y3QvcWVtdS8tL2lzc3Vlcy8xMTUwIiByZWw9Im5vcmVmZXJyZXIgbm9mb2xsb3cgbm9vcGVuZXIi IHRhcmdldD0iX2JsYW5rIj5odHRwczovL2dpdGxhYi5jb20vcWVtdS1wcm9qZWN0L3FlbXUvLS9p c3N1ZXMvMTE1MDwvYT4pLjwvc3Bhbj48ZGl2Pjxicj48L2Rpdj48ZGl2PjxzcGFuPkkgdGhpbmsg SSBtaWdodCBoYXZlIGEgc29sdXRpb24gZm9yIHRoZSBndGsgY2xpcGJvYXJkIHNvbWV0aW1lcyBj cmFzaGluZyBndWVzdHMuPC9zcGFuPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+PHNwYW4+QGtv bEFmbGFzaA0KIEkgY291bGRuJ3QgaGF2ZSBkb25lIGl0IHdpdGhvdXQgeW91LCBmaWd1cmluZyBv dXQgDQpgZ3RrX2NsaXBib2FyZF93YWl0X2lzX3RleHRfYXZhaWxhYmxlKGNsaXBib2FyZClgIHdh cyB0aGUgaXNzdWUgaXMgaGFsZiANCnRoZSB3b3JrLjwvc3Bhbj48L2Rpdj48ZGl2Pjxicj48L2Rp dj48ZGl2PjxzcGFuPlRoZSByZWFsIGlzc3VlIGlzIHRoYXQgDQppdCdzIGJsb2NraW5nIGFuZCBJ J2Qgd2FnZXIgdGhhdCdzIGEgYmlnIG5vLW5vIHNpbmNlIHFlbXUgJmFtcDsgS1ZNIGhhdmUNCiB0 byBydW4gdGhlIFZNICsgT1MsIHByZWZlcmFibHkgYXMgcmVhbC10aW1lIGFzIHBvc3NpYmxlLiBT b21ldGhpbmcgDQp0aW1lcyBvdXQgYW5kIHlvdSBnZXQgYSBjb3JlIGR1bXAuPC9zcGFuPjwvZGl2 PjxkaXY+PGJyPjwvZGl2PjxkaXY+PHNwYW4+U28gYXMgYSByZXBsYWNlbWVudCwgYGd0a19jbGlw Ym9hcmRfcmVxdWVzdF90ZXh0YCwgd2hpY2ggaXMgYXN5bmMgYW5kIG5vbi1ibG9ja2luZyBpcyBh IGJldHRlciBjaG9pY2UsIGhvcGVmdWxseS48L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj5JdCByZXF1 aXJlcyBhbiBhZGRpdGlvbmFsIGZ1bmN0aW9uIHRvIGhhbmRsZSByZWNlaXZpbmcgdGV4dC48L3Nw YW4+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj48c3Bhbj5TaWduZWQtb2ZmLWJ5OiBFZG11bmQg UmFpbGUgJmx0OzxhIGhyZWY9Im1haWx0bzplZG11bmQucmFpbGVAcHJvdG9uLm1lIiByZWw9Im5v cmVmZXJyZXIgbm9mb2xsb3cgbm9vcGVuZXIiIHRhcmdldD0iX2JsYW5rIj5lZG11bmQucmFpbGVA cHJvdG9uLm1lPC9hPiZndDs8L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj5Gcm9tIDUzMGRiOGI2Yzdh ZGM5OWY1NDBkN2Q4Y2M2MTIyMzIwODY4MzI2ZTYgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxPC9z cGFuPjwvZGl2PjxkaXY+PHNwYW4+RnJvbTogRWRtdW5kIFJhaWxlICZsdDs8YSBocmVmPSJtYWls dG86ZWRtdW5kLnJhaWxlQHByb3Rvbi5tZSIgcmVsPSJub3JlZmVycmVyIG5vZm9sbG93IG5vb3Bl bmVyIiB0YXJnZXQ9Il9ibGFuayI+ZWRtdW5kLnJhaWxlQHByb3Rvbi5tZTwvYT4mZ3Q7PC9zcGFu PjwvZGl2PjxkaXY+PHNwYW4+RGF0ZTogU3VuLCAyNCBTZXAgMjAyMyAwOTo0NjoyNyArMDIwMDwv c3Bhbj48L2Rpdj48ZGl2PjxzcGFuPlN1YmplY3Q6IFtQQVRDSCAxLzFdIHFlbXUtdWktZ3RrIGNs aXBib2FyZCBwb3NzaWJsZSBmaXggZm9yIGNyYXNoZXM8L3NwYW4+PC9kaXY+PGRpdj48YnI+PC9k aXY+PGRpdj48c3Bhbj4tLS08L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj4mbmJzcDt1aS9ndGstY2xp cGJvYXJkLmMgfCAyMCArKysrKysrKysrKysrKy0tLS0tLTwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFu PiZuYnNwOzEgZmlsZSBjaGFuZ2VkLCAxNCBpbnNlcnRpb25zKCspLCA2IGRlbGV0aW9ucygtKTwv c3Bhbj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PjxzcGFuPmRpZmYgLS1naXQgYS91aS9ndGst Y2xpcGJvYXJkLmMgYi91aS9ndGstY2xpcGJvYXJkLmM8L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj5p bmRleCA4ZDhhNjM2ZmQxLi42NGQ0ZjdhYzlkIDEwMDY0NDwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFu Pi0tLSBhL3VpL2d0ay1jbGlwYm9hcmQuYzwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPisrKyBiL3Vp L2d0ay1jbGlwYm9hcmQuYzwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPkBAIC0xNTMsNiArMTUzLDE4 IEBAIHN0YXRpYyB2b2lkIGdkX2NsaXBib2FyZF9yZXF1ZXN0KFFlbXVDbGlwYm9hcmRJbmZvICpp bmZvLDwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPiZuYnNwOyAmbmJzcDsgJm5ic3A7fTwvc3Bhbj48 L2Rpdj48ZGl2PjxzcGFuPiZuYnNwO308L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj4mbmJzcDs8L3Nw YW4+PC9kaXY+PGRpdj48c3Bhbj4rLyogbm9uLWJsb2NraW5nIGNsaXBib2FyZCByZWNlaXZlciBp bXBsZW1lbnRhdGlvbiAqLzwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPitzdGF0aWMgdm9pZCBnZF9j bGlwYm9hcmRfdGV4dF9yZWNlaXZlZF9jYWxsYmFjayhHdGtDbGlwYm9hcmQgKmNsaXBib2FyZCwg Y29uc3QgZ2NoYXIgKnRleHQsIGdwb2ludGVyIGRhdGEpPC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4+ K3s8L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj4rICZuYnNwOyAmbmJzcDtRZW11Q2xpcGJvYXJkSW5m byAqaW5mbyA9IChRZW11Q2xpcGJvYXJkSW5mbyAqKWRhdGE7PC9zcGFuPjwvZGl2PjxkaXY+PHNw YW4+KyAmbmJzcDsgJm5ic3A7aWYgKHRleHQpIHs8L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj4rICZu YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwO2luZm8tJmd0O3R5cGVzW1FFTVVfQ0xJUEJPQVJEX1RZ UEVfVEVYVF0uYXZhaWxhYmxlID0gdHJ1ZTs8L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj4rICZuYnNw OyAmbmJzcDt9PC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4+Kzwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFu PisgJm5ic3A7ICZuYnNwO3FlbXVfY2xpcGJvYXJkX3VwZGF0ZShpbmZvKTs8L3NwYW4+PC9kaXY+ PGRpdj48c3Bhbj4rICZuYnNwOyAmbmJzcDtxZW11X2NsaXBib2FyZF9pbmZvX3VucmVmKGluZm8p Ozwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPit9PC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4+Kzwvc3Bh bj48L2Rpdj48ZGl2PjxzcGFuPiZuYnNwO3N0YXRpYyB2b2lkIGdkX293bmVyX2NoYW5nZShHdGtD bGlwYm9hcmQgKmNsaXBib2FyZCw8L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj4mbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwO0dka0V2ZW50ICpldmVudCw8L3NwYW4+ PC9kaXY+PGRpdj48c3Bhbj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7 ICZuYnNwO2dwb2ludGVyIGRhdGEpPC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4+QEAgLTE3MCwxMiAr MTgyLDggQEAgc3RhdGljIHZvaWQgZ2Rfb3duZXJfY2hhbmdlKEd0a0NsaXBib2FyZCAqY2xpcGJv YXJkLDwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPiZuYnNwOyAmbmJzcDsgJm5ic3A7c3dpdGNoIChl dmVudC0mZ3Q7b3duZXJfY2hhbmdlLnJlYXNvbikgezwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPiZu YnNwOyAmbmJzcDsgJm5ic3A7Y2FzZSBHREtfT1dORVJfQ0hBTkdFX05FV19PV05FUjo8L3NwYW4+ PC9kaXY+PGRpdj48c3Bhbj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7aW5mbyA9 IHFlbXVfY2xpcGJvYXJkX2luZm9fbmV3KCZhbXA7Z2QtJmd0O2NicGVlciwgcyk7PC9zcGFuPjwv ZGl2PjxkaXY+PHNwYW4+LSAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDtpZiAoZ3RrX2NsaXBi b2FyZF93YWl0X2lzX3RleHRfYXZhaWxhYmxlKGNsaXBib2FyZCkpIHs8L3NwYW4+PC9kaXY+PGRp dj48c3Bhbj4tICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7aW5mby0m Z3Q7dHlwZXNbUUVNVV9DTElQQk9BUkRfVFlQRV9URVhUXS5hdmFpbGFibGUgPSB0cnVlOzwvc3Bh bj48L2Rpdj48ZGl2PjxzcGFuPi0gJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7fTwvc3Bhbj48 L2Rpdj48ZGl2PjxzcGFuPi08L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj4tICZuYnNwOyAmbmJzcDsg Jm5ic3A7ICZuYnNwO3FlbXVfY2xpcGJvYXJkX3VwZGF0ZShpbmZvKTs8L3NwYW4+PC9kaXY+PGRp dj48c3Bhbj4tICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwO3FlbXVfY2xpcGJvYXJkX2luZm9f dW5yZWYoaW5mbyk7PC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4+KyAmbmJzcDsgJm5ic3A7ICZuYnNw OyAmbmJzcDsvKiBndGtfY2xpcGJvYXJkX3dhaXRfaXNfdGV4dF9hdmFpbGFibGUgKGJsb2NraW5n KSB3YXMgdXNlZCBoZXJlIHByZXZpb3VzbHkgYW5kIGNyYXNoZWQgZ3Vlc3RzICovPC9zcGFuPjwv ZGl2PjxkaXY+PHNwYW4+KyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDtndGtfY2xpcGJvYXJk X3JlcXVlc3RfdGV4dChjbGlwYm9hcmQsIGdkX2NsaXBib2FyZF90ZXh0X3JlY2VpdmVkX2NhbGxi YWNrLCBpbmZvKTs8L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAm bmJzcDsgJm5ic3A7YnJlYWs7PC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4+Jm5ic3A7ICZuYnNwOyAm bmJzcDtkZWZhdWx0Ojwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPiZuYnNwOyAmbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDtxZW11X2NsaXBib2FyZF9wZWVyX3JlbGVhc2UoJmFtcDtnZC0mZ3Q7Y2Jw ZWVyLCBzKTs8L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj4tLSA8L3NwYW4+PC9kaXY+PGRpdj48c3Bh bj4yLjQyLjA8L3NwYW4+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj48c3Bhbj5kb24ndCBmb3Jn ZXQgdG8gY29uZmlndXJlIHdpdGggLS1lbmFibGUtZ3RrLWNsaXBib2FyZCBiZWZvcmUgYnVpbGRp bmc8L3NwYW4+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj48c3Bhbj5JJ2Qgc2F5IG15IGd2dC1n IHdpbjEwIFZNIGhhcyBiZWNvbWUgYSBsb3QgbW9yZSByZXNwb25zaXZlICh3YXMgdXNpbmcgZ3Rr LWNsaXBib2FyZCBiZXNpZGVzIGJlaW5nIGJyb2tlbikuPC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4+ UGFzdGUgZnJvbSB0aGUgVk0gaXMgYSBiaXQgZGVsYXllZCBzb21ldGltZXMgYnV0IEkgY2FuIGxp dmUgd2l0aCB0aGF0Ljwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPlNvIGZhciBteSBWTSBoYXNuJ3Qg Y3Jhc2hlZCB5ZXQuPC9zcGFuPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+PHNwYW4+SSdkIGxp a2UgdG8gYXNrIHlvdSBmb3IgaGVscCBpbiBldmFsdWF0aW5nIG15IHBhdGNoLjwvc3Bhbj48L2Rp dj48ZGl2PjxzcGFuPlRoZSBpc3N1ZSBsaW5rZWQgdG8gaW4gdGhlIGZpcnN0IGxpbmUgaGFzIGlu c3RydWN0aW9ucyBvbiB0aGUgY3Jhc2ggY2FzZS48YnI+PC9zcGFuPjwvZGl2PjxkaXYgc3R5bGU9 ImJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsiPjxzcGFuPjxicj48c3Bhbj5J dCdzIG15IGZpcnN0IHRpbWUgb24gdGhlIG1haWxpbmcgbGlzdCwgSSBob3BlIEkndmUgZG9uZSB0 aGlzIHJpZ2h0Ljxicj48YnI+TXIuIEx1cmVhdSBDQ2VkIGhlcmUgaGFkIHRoaXMgdG8gYWRkOjxi cj4gQmxvY2tpbmcgdGhlIHNpZ25hbCBoYW5kbGVyIGlzbid0IGdyZWF0IGVpdGhlciwgYXMgd2Ug bWF5IG1pc3MNCmNsaXBib2FyZCB1cGRhdGVzLg0KDQpJIHRoaW5rIHdlIGNvdWxkICJyZXVzZSIg dGhlIHNlcmlhbCBmaWVsZCBvbiBpbmZvIGFuZCBjaGVjayBpbiB0aGUNCmNhbGxiYWNrIGlmIHdl IGRvbid0IGhhdmUgdGhlIGxhdGVzdCwganVzdCBpZ25vcmUgdGhlIHJlc3VsdCBhbmQgZnJlZS48 L3NwYW4+PC9zcGFuPjwvZGl2PjwvZGl2Pg== --b1_QtMYyCgkkz0kWaYRRErq7XYnVavcis1Nl4eQTL4yqu8--